[
  {
    "path": ".editorconfig",
    "content": "#\n# SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n# SPDX-License-Identifier: GPL-3.0-or-later\n#\n\nroot = true\n\n[*.{kt,kts}]\nktlint_code_style = android_studio\n# https://pinterest.github.io/ktlint/latest/rules/standard/#function-naming\nktlint_function_naming_ignore_when_annotated_with = Composable\n\nktlint_standard_class-signature = disabled\nktlint_standard_function-expression-body = disabled\nktlint_standard_max-line-length = disabled\nktlint_standard_mixed-condition-operators = disabled\nktlint_standard_package-name = disabled\nktlint_standard_property-naming = disabled\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "### 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!\n\nNewPipe contribution guidelines\n===============================\n\n## AI policy\n\n* Using generative AI to develop new features or making larger code changes is generally prohibited. Please refrain from contributions which are heavily depending on AI generated source code because they are usually lacking a fundamental understanding of the overall project structure and thus come with poor quality. However, you are allowed to use gen. AI if you\n  * are aware of the project structure,\n  * ensure that the generated code follows the project structure,\n  * fully understand the generated code, and\n  * review the generated code completely.\n* Using AI to find the root cause of bugs and generating small fixes might be acceptable. However, gen. AI often does not fix the underlying problem but is trying to fix the symptoms. If you are using AI to fix bugs, ensure that the root cause is tackled.\n* The use of AI to generate documentation is allowed. We ask you to thoroughly check the quality of generated documentation – wrong, misleading or uninformative documentation is useless and wastes the reader's time. Ensure that reasoning is documented.\n* Using generative AI to write or fill in PR or issue templates is prohibited. Those texts are often lengthy and miss critical information.\n* PRs and issues that do not follow this AI policy can be closed without further explanation.\n\n\n## Crash reporting\n\nReport crashes through the **automated crash report system** of NewPipe.\nThis way all the data needed for debugging is included in your bug report for GitHub.\nYou'll see *exactly* what is sent, be able to add **your comments**, and then send it.\n\n## Issue reporting/feature requests\n\n* **Already reported**? Browse the [existing issues](https://github.com/TeamNewPipe/NewPipe/issues) to make sure your issue/feature hasn't been reported/requested.\n* **Already fixed**? Check whether your issue/feature is already fixed/implemented.\n* **Still relevant**? Check if the issue still exists in the latest release/beta version.\n* **Can you fix it**? If you are an Android/Java developer, you are always welcome to fix an issue or implement a feature yourself. PRs welcome! See [Code contribution](#code-contribution) for more info.\n* **Is it in English**? Issues in other languages will be ignored unless someone translates them.\n* **Is it one issue**? Multiple issues require multiple reports, that can be linked to track their statuses.\n* **The template**: Fill it out, everyone wins. Your issue has a chance of getting fixed.\n\n\n## Translation\n\n* NewPipe is translated via [Weblate](https://hosted.weblate.org/projects/newpipe/strings/). Log in there with your GitHub account, or register.\n* Add the language you want to translate if it is not there already: see [How to add a new language](https://github.com/TeamNewPipe/NewPipe/wiki/How-to-add-a-new-language-to-NewPipe) in the wiki.\n* NewPipe uses the [PrettyTime](https://github.com/ocpsoft/prettytime) library to display localized versions of dates and times. It needs to be translated, too. Read [these instructions to add a new language](https://www.ocpsoft.org/prettytime/#section-14) and [this issue](https://github.com/TeamNewPipe/NewPipe/issues/9134) for more info.\n\n## Code contribution\n\n### Guidelines\n\n* Stick to NewPipe's *style conventions* of [checkStyle](https://github.com/checkstyle/checkstyle) and [ktlint](https://github.com/pinterest/ktlint). They run each time you build the project.\n* Stick to [F-Droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy).\n* In particular **do not bring non-free software** (e.g. binary blobs) into the project. Make sure you do not introduce any closed-source library from Google.\n\n### Before starting development\n\n* If you want to help out with an existing bug report or feature request, **leave a comment** on that issue saying you want to try your hand at it.\n* If there is no existing issue for what you want to work on, **open a new one**  describing the changes you are planning to introduce. This gives the team and the community a chance to give **feedback** before you spend time on something that is already in development, should be done differently, or should be avoided completely.\n* Please show **intention to maintain your features** and code after you contribute a PR. Unmaintained code is a hassle for core developers. If you do not intend to maintain features you plan to contribute, please rethink your submission, or clearly state that in the PR description.\n* 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.\n* 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.\n\n### Creating a Pull Request (PR)\n\n* 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.\n* Please **test** (compile and run) your code before submitting changes! Ideally, provide test feedback in the PR description. Untested code will **not** be merged!\n* Respond if someone requests changes or otherwise raises issues about your PRs.\n* Try to figure out yourself why builds on our CI fail.\n* Make sure your PR is **up-to-date** with the rest of the code. Often, a simple click on \"Update branch\" will do the job, but if not, you must *rebase* your branch on the `dev` branch manually and resolve the conflicts on your own. You can find help [on the wiki](https://github.com/TeamNewPipe/NewPipe/wiki/How-to-merge-a-PR). Doing this makes the maintainers' job way easier.\n\n## IDE setup & building the app\n\n### Basic setup\n\nNewPipe is developed using [Android Studio](https://developer.android.com/studio/). Learn more about how to install it and how it works in the [official documentation](https://developer.android.com/studio/intro). In particular, make sure you have accepted Android Studio's SDK licences. Once Android Studio is ready, setting up the NewPipe project is fairly simple:\n- Clone the NewPipe repository with `git clone https://github.com/TeamNewPipe/NewPipe.git` (or use the link from your own fork, if you want to open a PR).\n- Open the folder you just cloned with Android Studio.\n- Build and run it just like you would do with any other app, with the green triangle in the top bar.\n\nYou may find [SonarLint](https://www.sonarlint.org/intellij)'s **inspections** useful in helping you to write good code and prevent bugs.\n\n### checkStyle setup\n\nThe [checkStyle](https://github.com/checkstyle/checkstyle) plugin verifies that Java code abides by the project style. It runs automatically each time you build the project. If you want to view errors directly in the editor, instead of having to skim through the build output, you can install an Android Studio plugin:\n- Go to `File -> Settings -> Plugins`, search for `checkstyle` and install `CheckStyle-IDEA`.\n- Go to `File -> Settings -> Tools -> Checkstyle`.\n- Add NewPipe's configuration file by clicking the `+` in the right toolbar of the \"Configuration File\" list.\n- Under the \"Use a local Checkstyle file\" bullet, click on `Browse` and, enter `checkstyle` folder under the project's root path and pick the file named `checkstyle.xml`.\n- Enable \"Store relative to project location\" so that moving the directory around does not create issues.\n- Insert a description in the top bar, then click `Next` and then `Finish`.\n- Activate the configuration file you just added by enabling the checkbox on the left.\n- Click `Ok` and you are done.\n\n### ktlint setup\n\nThe [ktlint](https://github.com/pinterest/ktlint) plugin does the same job as checkStyle for Kotlin files. Installing the related plugin is as simple as going to `File -> Settings -> Plugins`, searching for `ktlint` and installing `Ktlint (unofficial)`.\n\n## Communication\n\n* 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.\n* 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)!\n* You can post your suggestions, changes, ideas etc. on either GitHub or Matrix (including via IRC).\n"
  },
  {
    "path": ".github/DISCUSSION_TEMPLATE/questions.yml",
    "content": "body:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this form! :hugs:\n\n        Note that you can also ask questions on our [IRC channel](https://web.libera.chat/#newpipe).\n\n  - type: checkboxes\n    id: checklist\n    attributes:\n      label: \"Checklist\"\n      options:\n        - 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.\"\n          required: true\n        - label: \"I have read the [FAQ](https://newpipe.net/FAQ/) and my question isn't listed.\"\n          required: true\n        - label: \"I have taken the time to fill in all the required details. I understand that the question will be dismissed otherwise.\"\n          required: true\n        - label: \"I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md).\"\n          required: true\n\n  - type: textarea\n    id: what-is-the-question\n    attributes:\n      label: What is/are your question(s)?\n    validations:\n      required: true\n\n  - type: textarea\n    id: additional-information\n    attributes:\n      label: Additional information\n      description: Any other information you'd like to include, for instance sketches, mockups, pictures of cats, etc.\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "liberapay: TeamNewPipe\ncustom: 'https://newpipe.net/donate/'\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Bug report\ndescription: Create a bug report to help us improve\nlabels: [bug, needs triage]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thank you for helping to make NewPipe better by reporting a bug. :hugs:\n\n        Please fill in as much information as possible about your bug so that we don't have to play \"information ping-pong\" and can help you immediately.\n\n  - type: checkboxes\n    id: checklist\n    attributes:\n      label: \"Checklist\"\n      options:\n        - label: \"I am able to reproduce the bug with the latest version given here: [CLICK THIS LINK](https://github.com/TeamNewPipe/NewPipe/releases/latest).\"\n          required: true\n        - 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.\"\n          required: true\n        - label: \"I have read the [FAQ](https://newpipe.net/FAQ/) and my problem isn't listed.\"\n          required: true\n        - label: \"I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise.\"\n          required: true\n        - label: \"This issue contains only one bug.\"\n          required: true\n        - label: \"I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md).\"\n          required: true\n        - label: \"I have read and understood the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md#ai-policy). The content of this bug report is not generated by AI.\"\n          required: true\n\n  - type: input\n    id: app-version\n    attributes:\n     label: Affected version\n     description: \"In which NewPipe version did you encounter the bug?\"\n     placeholder: \"x.xx.x - Can be seen in the app from the 'About' section in the sidebar\"\n    validations:\n      required: true\n\n  - type: textarea\n    id: steps-to-reproduce\n    attributes:\n      label: Steps to reproduce the bug\n      description: |\n        What did you do for the bug to show up?\n\n        If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug.\n      placeholder: |\n        1. Go to '...'\n        2. Press on '....'\n        3. Swipe down to '....'\n    validations:\n      required: true\n\n  - type: textarea\n    id: expected-behavior\n    attributes:\n      label: Expected behavior\n      description: |\n        Tell us what you expect to happen.\n\n  - type: textarea\n    id: actual-behavior\n    attributes:\n      label: Actual behavior\n      description: |\n        Tell us what happens with the steps given above.\n\n  - type: textarea\n    id: screen-media\n    attributes:\n      label: Screenshots/Screen recordings\n      description: |\n        A picture or video is worth a thousand words.\n\n        If applicable, add screenshots or a screen recording to help explain your problem.\n        GitHub supports uploading them directly in the text box.\n        If your file is too big for Github to accept, try to compress it (ZIP-file) or feel free to paste a link to an image/video hoster here instead.\n\n        :heavy_exclamation_mark: DON'T POST SCREENSHOTS OF THE ERROR PAGE.\n        Instead, follow the instructions in the \"Logs\" section below.\n\n  - type: textarea\n    id: logs\n    attributes:\n      label: Logs\n      description: |\n        If your bug includes a crash (where you're shown the Error Report page with a bunch of info), tap on \"Copy formatted report\" at the bottom and paste it here.\n\n  - type: input\n    id: device-os-info\n    attributes:\n     label: Affected Android/Custom ROM version\n     description: |\n      With what operating system (+ version) did you encounter the bug?\n     placeholder: \"Example: Android 12 / LineageOS 18.1\"\n\n  - type: input\n    id: device-model-info\n    attributes:\n     label: Affected device model\n     description: |\n      On what device did you encounter the bug?\n     placeholder: \"Example: Huawei P20 lite (ANE-LX1) / Samsung Galaxy S20\"\n\n  - type: textarea\n    id: additional-information\n    attributes:\n      label: Additional information\n      description: |\n        Any other information you'd like to include, for instance that \n        * the affected device is foldable or a TV\n        * you have disabled all animations on your device\n        * your cat disabled your network connection\n        * ...\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: ❓ Question\n    url: https://github.com/TeamNewPipe/NewPipe/discussions/new?category=questions\n    about: Ask about anything NewPipe-related\n  - name: 💬 Matrix\n    url: https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\n    about: Chat with us via Matrix for quick Q/A\n  - name: 💬 IRC\n    url: https://web.libera.chat/#newpipe\n    about: Chat with us via IRC for quick Q/A\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: Feature request\ndescription: Suggest an idea for this project\nlabels: [feature request, needs triage]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thank you for helping to make NewPipe better by suggesting a feature. :hugs:\n\n        Your ideas are highly welcome! The app is made for you, the users, after all.\n  - type: checkboxes\n    id: checklist\n    attributes:\n      label: \"Checklist\"\n      options:\n        - 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.\"\n          required: true\n        - label: \"I have read the [FAQ](https://newpipe.net/FAQ/) and my problem isn't listed.\"\n          required: true\n        - label: \"I'm aware that this is a request for NewPipe itself and that requests for adding a new service need to be made at [NewPipeExtractor](https://github.com/TeamNewPipe/NewPipeExtractor/issues).\"\n          required: true\n        - label: \"I have taken the time to fill in all the required details. I understand that the feature request will be dismissed otherwise.\"\n          required: true\n        - label: \"This issue contains only one feature request.\"\n          required: true\n        - label: \"I have read and understood the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md).\"\n          required: true\n        - label: \"I have read and understood the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/dev/.github/CONTRIBUTING.md#ai-policy). The content of this request is not generated by AI.\"\n          required: true\n\n\n  - type: textarea\n    id: feature-description\n    attributes:\n      label: Feature description\n      description: |\n        Explain how you want the app's look or behavior to change to suit your needs.\n    validations:\n      required: true\n\n  - type: textarea\n    id: why-is-the-feature-requested\n    attributes:\n      label: Why do you want this feature?\n      description: |\n        Describe any problem or limitation you come across while using the app which would be solved by this feature.\n    validations:\n      required: true\n\n  - type: textarea\n    id: additional-information\n    attributes:\n      label: Additional information\n      description: Any other information you'd like to include, for instance sketches, mockups, pictures of cats, etc.\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!-- Hey there. Thank you so much for improving NewPipe, and filling out the details. Having roughly the same layout helps everyone considerably :)-->\n\n#### What is it?\n- [ ] Bugfix (user facing)\n- [ ] Feature (user facing) ⚠️ **Your PR must target the [`refactor`](https://github.com/TeamNewPipe/NewPipe/tree/refactor) branch**\n- [ ] Codebase improvement (dev facing)\n- [ ] Meta improvement to the project (dev facing)\n\n#### Description of the changes in your PR\n<!-- While bullet points are the norm in this section, feel free to write free-form text instead of a list -->\n- record videos\n- create clones\n- take over the world\n\n#### Before/After Screenshots/Screen Record\n<!-- If your PR changes the app's UI in any way, please include screenshots or a video showing exactly what changed, so that developers and users can pinpoint it easily. Delete this if it doesn't apply to your PR.-->\n- Before:\n- After:\n\n#### Fixes the following issue(s)\n<!-- Prefix issues with \"Fixes\" so that GitHub closes them when the PR is merged (note that each \"Fixes #\" should be in its own item). Also add any other relevant links. -->\n- Fixes #\n\n#### Relies on the following changes\n<!-- Delete this if it doesn't apply to your PR. -->\n- \n\n#### APK testing\n<!-- Use a new, meaningfully named branch. The name is used as a suffix for the app ID to allow installing and testing multiple versions of NewPipe, e.g. \"commentfix\", if your PR implements a bugfix for comments. (No names like \"patch-0\" and \"feature-1\".)  -->\n<!-- Remove the following line if you directly link the APK created by the CI pipeline. Directly linking is preferred if you need to let users test.-->\nThe 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).\n\n#### Due diligence\n- [ ] I read the [contribution guidelines](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md).\n- [ ] The proposed changes follow the [AI policy](https://github.com/TeamNewPipe/NewPipe/blob/HEAD/.github/CONTRIBUTING.md#ai-policy).\n- [ ] I tested the changes using an emulator or a physical device.\n"
  },
  {
    "path": ".github/changed-lines-count-labeler.yml",
    "content": "# Add 'size/small' label to any changes with less than 50 lines\nsize/small:\n  max: 49\n\n# Add 'size/medium' label to any changes between 50 and 249 lines\nsize/medium:\n  min: 50\n  max: 249\n\n# Add 'size/large' label to any changes between 250 and 749 lines\nsize/large:\n  min: 250\n  max: 749\n\n# Add 'size/giant' label to any changes for more than 749 lines\nsize/giant:\n  min: 750\n"
  },
  {
    "path": ".github/workflows/backport-pr.yml",
    "content": "name: Backport merged pull request\non:\n  issue_comment:\n    types: [created]\npermissions:\n  contents: write # for comment creation on original PR\n  pull-requests: write\njobs:\n  backport:\n    name: Backport pull request\n    runs-on: ubuntu-latest\n\n    # Only run when the comment starts with the `/backport` command on a PR and\n    # the commenter has write access to the repository. We do not want to allow\n    # everybody to trigger backports and create branches in our repository.\n    if: >\n        github.event.issue.pull_request &&\n        startsWith(github.event.comment.body, '/backport ') &&\n        (\n        github.event.comment.author_association == 'OWNER' ||\n        github.event.comment.author_association == 'COLLABORATOR' ||\n        github.event.comment.author_association == 'MEMBER'\n        )\n    steps:\n      - uses: actions/checkout@v6\n      - name: Get backport metadata\n        # the target branch is the first argument after `/backport`\n        env:\n          COMMENT_BODY: ${{ github.event.comment.body }}\n        run: |\n          set -euo pipefail\n          body=\"$COMMENT_BODY\"\n          \n          line=${body%%$'\\n'*} # Get the first line\n          if [[ $line =~ ^/backport[[:space:]]+([^[:space:]]+) ]]; then\n            echo \"BACKPORT_TARGET=${BASH_REMATCH[1]}\" >> \"$GITHUB_ENV\"\n          else\n            echo \"Usage: /backport <target-branch>\" >&2\n            exit 1\n          fi\n\n      - name: Create backport pull request\n        uses: korthout/backport-action@v4\n        with:\n          add_labels: 'backport'\n          copy_labels_pattern: '.*'\n          label_pattern: ''\n          target_branches: ${{ env.BACKPORT_TARGET }}"
  },
  {
    "path": ".github/workflows/build-release-apk.yml",
    "content": "name: \"Build unsigned release APK on master\"\n\non:\n  workflow_dispatch:\n\njobs:\n  release:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          ref: 'master'\n\n      - uses: actions/setup-java@v5\n        with:\n          distribution: 'temurin'\n          java-version: '21'\n          cache: 'gradle'\n\n      - name: \"Build release APK\"\n        run: ./gradlew assembleRelease --stacktrace\n\n      - name: \"Rename APK\"\n        run: |\n          VERSION_NAME=\"$(jq -r \".elements[0].versionName\" \"app/build/outputs/apk/release/output-metadata.json\")\"\n          echo \"Version name: $VERSION_NAME\" >> \"$GITHUB_STEP_SUMMARY\"\n          echo '```json' >> \"$GITHUB_STEP_SUMMARY\"\n          cat \"app/build/outputs/apk/release/output-metadata.json\" >> \"$GITHUB_STEP_SUMMARY\"\n          echo >> \"$GITHUB_STEP_SUMMARY\"\n          echo '```' >> \"$GITHUB_STEP_SUMMARY\"\n          # assume there is only one APK in that folder\n          mv app/build/outputs/apk/release/*.apk \"app/build/outputs/apk/release/NewPipe_v$VERSION_NAME.apk\"\n\n      - name: \"Upload APK\"\n        uses: actions/upload-artifact@v6\n        with:\n          name: app\n          path: app/build/outputs/apk/release/*.apk\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\non:\n  workflow_dispatch:\n  pull_request:\n    branches:\n      - dev\n      - master\n      - refactor\n      - release**\n    paths-ignore:\n      - 'README.md'\n      - 'doc/**'\n      - 'fastlane/**'\n      - 'assets/**'\n      - '.github/**/*.md'\n      - '.github/FUNDING.yml'\n      - '.github/ISSUE_TEMPLATE/**'\n  push:\n    branches:\n      - dev\n      - master\n    paths-ignore:\n      - 'README.md'\n      - 'doc/**'\n      - 'fastlane/**'\n      - 'assets/**'\n      - '.github/**/*.md'\n      - '.github/FUNDING.yml'\n      - '.github/ISSUE_TEMPLATE/**'\n\njobs:\n  build-and-test-jvm:\n    runs-on: ubuntu-latest\n\n    permissions:\n      contents: read\n\n    steps:\n      - uses: actions/checkout@v6\n      - uses: gradle/actions/wrapper-validation@v5\n\n      - name: create and checkout branch\n        # push events already checked out the branch\n        if: github.event_name == 'pull_request'\n        env:\n          BRANCH: ${{ github.head_ref }}\n        run: git checkout -B \"$BRANCH\"\n\n      - name: set up JDK\n        uses: actions/setup-java@v5\n        with:\n          java-version: 21\n          distribution: \"temurin\"\n          cache: 'gradle'\n\n      - name: Build debug APK and run jvm tests\n        run: ./gradlew assembleDebug lintDebug testDebugUnitTest --stacktrace -DskipFormatKtlint\n\n      - name: Upload APK\n        uses: actions/upload-artifact@v6\n        with:\n          name: app\n          path: app/build/outputs/apk/debug/*.apk\n\n  test-android:\n    runs-on: ubuntu-latest\n    timeout-minutes: 20\n    strategy:\n      matrix:\n        include:\n          - api-level: 21\n            target: default\n            arch: x86\n          - api-level: 35\n            target: default\n            arch: x86_64\n\n    permissions:\n      contents: read\n\n    steps:\n      - uses: actions/checkout@v6\n\n      - name: Enable KVM\n        run: |\n          echo 'KERNEL==\"kvm\", GROUP=\"kvm\", MODE=\"0666\", OPTIONS+=\"static_node=kvm\"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules\n          sudo udevadm control --reload-rules\n          sudo udevadm trigger --name-match=kvm\n\n      - name: set up JDK\n        uses: actions/setup-java@v5\n        with:\n          java-version: 21\n          distribution: \"temurin\"\n          cache: 'gradle'\n\n      - name: Run android tests\n        uses: reactivecircus/android-emulator-runner@v2\n        with:\n          api-level: ${{ matrix.api-level }}\n          target: ${{ matrix.target }}\n          arch: ${{ matrix.arch }}\n          script: ./gradlew connectedCheck --stacktrace\n\n      - name: Upload test report when tests fail # because the printed out stacktrace (console) is too short, see also #7553\n        uses: actions/upload-artifact@v6\n        if: failure()\n        with:\n          name: android-test-report-api${{ matrix.api-level }}\n          path: app/build/reports/androidTests/connected/**\n\n  sonar:\n    if: ${{ false }} # the key has expired and needs to be regenerated by the sonar admins\n    runs-on: ubuntu-latest\n\n    permissions:\n      contents: read\n\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis\n\n      - name: Set up JDK\n        uses: actions/setup-java@v5\n        with:\n          java-version: 21\n          distribution: \"temurin\"\n          cache: 'gradle'\n\n      - name: Cache SonarCloud packages\n        uses: actions/cache@v5\n        with:\n          path: ~/.sonar/cache\n          key: ${{ runner.os }}-sonar\n          restore-keys: ${{ runner.os }}-sonar\n\n      - name: Build and analyze\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # Needed to get PR information, if any\n          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}\n        run: ./gradlew build sonar --info\n"
  },
  {
    "path": ".github/workflows/image-minimizer.js",
    "content": "/*\n * Script for minimizing big images (jpg,gif,png) when they are uploaded to GitHub and not edited otherwise\n */\nmodule.exports = async ({github, context}) => {\n    const IGNORE_KEY = '<!-- IGNORE IMAGE MINIFY -->';\n    const IGNORE_ALT_NAME_END = 'ignoreImageMinify';\n    // Targeted maximum height\n    const IMG_MAX_HEIGHT_PX = 600;\n    // maximum width of GitHub issues/comments\n    const IMG_MAX_WIDTH_PX = 800;\n    // all images that have a lower aspect ratio (-> have a smaller width) than this will be minimized\n    const MIN_ASPECT_RATIO = IMG_MAX_WIDTH_PX / IMG_MAX_HEIGHT_PX\n\n    // Get the body of the image\n    let initialBody = null;\n    if (context.eventName == 'issue_comment') {\n        initialBody = context.payload.comment.body;\n    } else if (context.eventName == 'issues') {\n        initialBody = context.payload.issue.body;\n    } else if (context.eventName == 'pull_request') {\n        initialBody = context.payload.pull_request.body;\n    } else {\n        console.log('Aborting: No body found');\n        return;\n    }\n    console.log(`Found body: \\n${initialBody}\\n`);\n\n    // Check if we should ignore the currently processing element\n    if (initialBody.includes(IGNORE_KEY)) {\n        console.log('Ignoring: Body contains IGNORE_KEY');\n        return;\n    }\n\n    // Regex for finding images (simple variant) ![ALT_TEXT](https://*.githubusercontent.com/<number>/<variousHexStringsAnd->.<fileExtension>)\n    const REGEX_USER_CONTENT_IMAGE_LOOKUP = /\\!\\[([^\\]]*)\\]\\((https:\\/\\/[-a-z0-9]+\\.githubusercontent\\.com\\/\\d+\\/[-0-9a-f]{32,512}\\.(jpg|gif|png))\\)/gm;\n    const REGEX_ASSETS_IMAGE_LOOKUP = /\\!\\[([^\\]]*)\\]\\((https:\\/\\/github\\.com\\/(?:user-attachments\\/assets|[-\\w\\d]+\\/[-\\w\\d]+\\/assets\\/\\d+)\\/[\\-0-9a-f]{32,512})\\)/gm;\n\n    // Check if we found something\n    let foundSimpleImages = REGEX_USER_CONTENT_IMAGE_LOOKUP.test(initialBody)\n        || REGEX_ASSETS_IMAGE_LOOKUP.test(initialBody);\n    if (!foundSimpleImages) {\n        console.log('Found no simple images to process');\n        return;\n    }\n\n    console.log('Found at least one simple image to process');\n\n    // Require the probe lib for getting the image dimensions\n    const probe = require('probe-image-size');\n    \n    var wasMatchModified = false;\n\n    // Try to find and replace the images with minimized ones\n    let newBody = await replaceAsync(initialBody, REGEX_USER_CONTENT_IMAGE_LOOKUP, minimizeAsync);\n    newBody = await replaceAsync(newBody, REGEX_ASSETS_IMAGE_LOOKUP, minimizeAsync);\n    \n    if (!wasMatchModified) {\n        console.log('Nothing was modified. Skipping update');\n        return;\n    }\n\n    // Update the corresponding element\n    if (context.eventName == 'issue_comment') {\n        console.log('Updating comment with id', context.payload.comment.id);\n        await github.rest.issues.updateComment({\n            comment_id: context.payload.comment.id,\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n            body: newBody\n        })\n    } else if (context.eventName == 'issues') {\n        console.log('Updating issue', context.payload.issue.number);\n        await github.rest.issues.update({\n            issue_number: context.payload.issue.number,\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n            body: newBody\n        });\n    } else if (context.eventName == 'pull_request') {\n        console.log('Updating pull request', context.payload.pull_request.number);\n        await github.rest.pulls.update({\n            pull_number: context.payload.pull_request.number,\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n            body: newBody\n        });\n    }\n\n    // Async replace function from https://stackoverflow.com/a/48032528\n    async function replaceAsync(str, regex, asyncFn) {\n        const promises = [];\n        str.replace(regex, (match, ...args) => {\n            const promise = asyncFn(match, ...args);\n            promises.push(promise);\n        });\n        const data = await Promise.all(promises);\n        return str.replace(regex, () => data.shift());\n    }\n\n    async function minimizeAsync(match, g1, g2) {\n            console.log(`Found match '${match}'`);\n\n            if (g1.endsWith(IGNORE_ALT_NAME_END)) {\n                console.log(`Ignoring match '${match}': IGNORE_ALT_NAME_END`);\n                return match;\n            }\n\n            let probeAspectRatio = 0;\n            let shouldModify = false;\n            try {\n                console.log(`Probing ${g2}`);\n                let probeResult = await probe(g2);\n                if (probeResult == null) {\n                    throw 'No probeResult';\n                }\n                if (probeResult.hUnits != 'px') {\n                    throw `Unexpected probeResult.hUnits (expected px but got ${probeResult.hUnits})`;\n                }\n                if (probeResult.height <= 0) {\n                    throw `Unexpected probeResult.height (height is invalid: ${probeResult.height})`;\n                }\n                if (probeResult.wUnits != 'px') {\n                    throw `Unexpected probeResult.wUnits (expected px but got ${probeResult.wUnits})`;\n                }\n                if (probeResult.width <= 0) {\n                    throw `Unexpected probeResult.width (width is invalid: ${probeResult.width})`;\n                }\n                console.log(`Probing resulted in ${probeResult.width}x${probeResult.height}px`);\n\n                probeAspectRatio = probeResult.width / probeResult.height;\n                shouldModify = probeResult.height > IMG_MAX_HEIGHT_PX && probeAspectRatio < MIN_ASPECT_RATIO;\n            } catch(e) {\n                console.log('Probing failed:', e);\n                // Immediately abort\n                return match;\n            }\n\n            if (shouldModify) {\n                wasMatchModified = true;\n                console.log(`Modifying match '${match}'`);\n                return `<img alt=\"${g1}\" src=\"${g2}\" width=${Math.min(600, Math.floor(IMG_MAX_HEIGHT_PX * probeAspectRatio))} />`;\n            }\n\n            console.log(`Match '${match}' is ok/will not be modified`);\n            return match;\n        }\n}\n"
  },
  {
    "path": ".github/workflows/image-minimizer.yml",
    "content": "name: Image Minimizer\n\non:\n  issue_comment:\n    types: [created, edited]\n  issues:\n    types: [opened, edited]\n  pull_request:\n    types: [opened, edited]\n\npermissions:\n  issues: write\n  pull-requests: write\n\njobs:\n  try-minimize:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v6\n\n      - uses: actions/setup-node@v6\n        with:\n          node-version: 16\n\n      - name: Install probe-image-size\n        run: npm i probe-image-size@7.2.3 --ignore-scripts\n\n      - name: Minimize simple images\n        uses: actions/github-script@v8\n        timeout-minutes: 3\n        with:\n          script: |\n            const script = require('.github/workflows/image-minimizer.js');\n            await script({github, context});\n"
  },
  {
    "path": ".github/workflows/no-response.yml",
    "content": "name: No Response\n\n# Both `issue_comment` and `scheduled` event types are required for this Action\n# to work properly.\non:\n  issue_comment:\n    types: [created]\n  schedule:\n    # Run daily at midnight.\n    - cron: '0 0 * * *'\n\npermissions:\n  issues: write\n  pull-requests: write\n\njobs:\n  noResponse:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: lee-dohm/no-response@v0.5.0\n        with:\n          token: ${{ github.token }}\n          daysUntilClose: 14\n          responseRequiredLabel: waiting for author\n"
  },
  {
    "path": ".github/workflows/pr-labeler.yml",
    "content": "name: \"PR size labeler\"\non: [pull_request_target]\npermissions:\n  contents: read\n  pull-requests: write\n\njobs:\n  changed-lines-count-labeler:\n    runs-on: ubuntu-latest\n    name: Automatically labelling pull requests based on the changed lines count\n    permissions:\n      pull-requests: write\n    steps:\n    - name: Set a label\n      uses: TeamNewPipe/changed-lines-count-labeler@main\n      with:\n        repo-token: ${{ secrets.GITHUB_TOKEN }}\n        configuration-path: .github/changed-lines-count-labeler.yml\n"
  },
  {
    "path": ".gitignore",
    "content": ".gradle/\nlocal.properties\n.DS_Store\nbuild/\ncaptures/\n.idea/\n*.iml\n*~\n.weblate\n.kotlin\n*.class\napp/debug/\napp/release/\n\n# vscode / eclipse files\n*.classpath\n*.project\n*.settings\nbin/\n.vscode/\n*.code-workspace\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "<h3 align=\"center\">We are <i>rewriting</i> large chunks of the codebase, to bring about <a href=\"https://newpipe.net/blog/pinned/announcement/newpipe-0.27.6-rewrite-team-states/#the-refactor\">a modern and stable NewPipe</a>! You can download nightly builds <a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\">here</a>.</h3>\n<h4 align=\"center\">Please work on the <code>refactor</code> branch if you want to contribute <i>new features</i>. The current codebase is in maintenance mode and will only receive <i>bugfixes</i>.</h4>\n\n<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">A libre lightweight streaming front-end for Android.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-en.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub NewPipe releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"License: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Build Status\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Translation Status\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC channel: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshots\">Screenshots</a> &bull; <a href=\"#supported-services\">Supported Services</a> &bull; <a href=\"#description\">Description</a> &bull; <a href=\"#features\">Features</a> &bull; <a href=\"#installation-and-updates\">Installation and updates</a> &bull; <a href=\"#contribution\">Contribution</a> &bull; <a href=\"#donate\">Donate</a> &bull; <a href=\"#license\">License</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Website</a> &bull; <a href=\"https://newpipe.net/blog/\">Blog</a> &bull; <a href=\"https://newpipe.net/FAQ/\">FAQ</a> &bull; <a href=\"https://newpipe.net/press/\">Press</a></p>\n<hr>\n\n*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)* \n\n> [!warning]\n> <b>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.</b>\n> \n> <b>PUTTING NEWPIPE, OR ANY FORK OF IT, INTO THE GOOGLE PLAY STORE VIOLATES THEIR TERMS AND CONDITIONS.</b>\n\n## Screenshots\n\n[<img src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n### Supported Services\n\nNewPipe currently supports these services:\n\n<!-- We link to the service websites separately to avoid people accidentally opening a website they didn't want to. -->\n* YouTube ([website](https://www.youtube.com/)) and YouTube Music ([website](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube))\n* PeerTube ([website](https://joinpeertube.org/)) and all its instances (open the website to know what that means!) ([wiki](https://en.wikipedia.org/wiki/PeerTube))\n* Bandcamp ([website](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp))\n* SoundCloud ([website](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud))\n* media.ccc.de ([website](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club))\n\nAs you can see, NewPipe supports multiple video and audio services. Though it started off with YouTube, other people have added more services over the years, making NewPipe more and more versatile!\n\nPartially due to circumstance, and partially due to its popularity, YouTube is the best supported out of these services. If you use or are familiar with any of these other services, please help us improve support for them! We're looking for maintainers for SoundCloud and PeerTube.\n\nIf you intend to add a new service, please get in touch with us first! Our [docs](https://teamnewpipe.github.io/documentation/) provide more information on how a new service can be added to the app and to the [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor).\n\n## Description\n\nNewPipe works by fetching the required data from the official API (e.g. PeerTube) of the service you're using. If the official API is restricted (e.g. YouTube) for our purposes, or is proprietary, the app parses the website or uses an internal API instead. This means that you don't need an account on any service to use NewPipe.\n\nAlso, since they are free and open source software, neither the app nor the Extractor use any proprietary libraries or frameworks, such as Google Play Services. This means you can use NewPipe on devices or custom ROMs that do not have Google apps installed.\n\n### Features\n\n* Watch videos at resolutions up to 4K\n* Listen to audio in the background, only loading the audio stream to save data\n* Popup mode (floating player, aka Picture-in-Picture)\n* Watch live streams\n* Show/hide subtitles/closed captions\n* Search videos and audios (on YouTube, you can specify the content language as well)\n* Enqueue videos (and optionally save them as local playlists)\n* Show/hide general information about videos (such as description and tags)\n* Show/hide next/related videos\n* Show/hide comments\n* Search videos, audios, channels, playlists and albums\n* Browse videos and audios within a channel\n* Subscribe to channels (yes, without logging into any account!)\n* Get notifications about new videos from channels you're subscribed to\n* Create and edit channel groups (for easier browsing and management)\n* Browse video feeds generated from your channel groups\n* View and search your watch history\n* Search and watch playlists (these are remote playlists, which means they're fetched from the service you're browsing)\n* Create and edit local playlists (these are created and saved within the app, and have nothing to do with any service)\n* Download videos/audios/subtitles (closed captions)\n* Open in Kodi\n* Watch/Block age-restricted material\n\n<!-- Hidden span to keep old links compatible. You should remove this span if you're translating the README into another language.-->\n<span id=\"updates\"></span>\n\n## Installation and updates\nYou can install NewPipe using one of the following methods:\n 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/\n 2. Download the APK from [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases), [compare the signing key](#apk-info) and install it.\n 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.\n 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.\n 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.\n\nWe 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.\n\nIn 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:\n1. Back up your data via Settings > Backup and Restore > Export Database so you keep your history, subscriptions, and playlists\n2. Uninstall NewPipe\n3. Download the APK from the new source and install it\n4. Import the data from step 1 via Settings > Backup and Restore > Import Database\n\n> [!Note]\n> 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.\n\n### APK Info\n\nThis 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.\n```\nCB: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\n```\n\n## Contribution\nWhether 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).\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Translation status\" />\n</a>\n\n## Donate\nIf you like NewPipe, you're welcome to send a donation. We prefer Liberapay, as it is both open-source and non-profit. For further info on donating to NewPipe, please visit our [website](https://newpipe.net/donate).\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"assets/liberapay_qr_code.png\" alt=\"Visit NewPipe at liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"assets/liberapay_donate_button.svg\" alt=\"Donate via Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Privacy Policy\n\nThe NewPipe project aims to provide a private, anonymous experience for using web-based media services. Therefore, the app does not collect any data without your consent. NewPipe's privacy policy explains in detail what data is sent and stored when you send a crash report, or leave a comment in our blog. You can find the document [here](https://newpipe.net/legal/privacy/).\n\n## License\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe is Free Software: You can use, study, share, and improve it at will. Specifically you can redistribute and/or modify it under the terms of the [GNU General Public License](https://www.gnu.org/licenses/gpl.html) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n"
  },
  {
    "path": "app/build.gradle.kts",
    "content": "/*\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\nimport com.android.build.api.dsl.ApplicationExtension\n\nplugins {\n    alias(libs.plugins.android.application)\n    alias(libs.plugins.jetbrains.kotlin.android)\n    alias(libs.plugins.jetbrains.kotlin.kapt)\n    alias(libs.plugins.google.ksp)\n    alias(libs.plugins.jetbrains.kotlin.parcelize)\n    alias(libs.plugins.jetbrains.kotlinx.serialization)\n    alias(libs.plugins.sonarqube)\n    checkstyle\n}\n\nval gitWorkingBranch = providers.exec {\n    commandLine(\"git\", \"rev-parse\", \"--abbrev-ref\", \"HEAD\")\n}.standardOutput.asText.map { it.trim() }\n\njava {\n    toolchain {\n        languageVersion = JavaLanguageVersion.of(17)\n    }\n}\n\nkotlin {\n    compilerOptions {\n        // TODO: Drop annotation default target when it is stable\n        freeCompilerArgs.addAll(\n            \"-Xannotation-default-target=param-property\"\n        )\n    }\n}\n\nconfigure<ApplicationExtension> {\n    compileSdk = 36\n    namespace = \"org.schabi.newpipe\"\n\n    defaultConfig {\n        applicationId = \"org.schabi.newpipe\"\n        resValue(\"string\", \"app_name\", \"NewPipe\")\n        minSdk = 21\n        targetSdk = 35\n\n        versionCode = System.getProperty(\"versionCodeOverride\")?.toInt() ?: 1009\n\n        versionName = \"0.28.4\"\n        System.getProperty(\"versionNameSuffix\")?.let { versionNameSuffix = it }\n\n        testInstrumentationRunner = \"androidx.test.runner.AndroidJUnitRunner\"\n    }\n\n    buildTypes {\n        debug {\n            isDebuggable = true\n\n            // suffix the app id and the app name with git branch name\n            val defaultBranches = listOf(\"master\", \"dev\")\n            val workingBranch = gitWorkingBranch.getOrElse(\"\")\n            val normalizedWorkingBranch = workingBranch\n                .replaceFirst(\"^[^A-Za-z]+\".toRegex(), \"\")\n                .replace(\"[^0-9A-Za-z]+\".toRegex(), \"\")\n\n            if (normalizedWorkingBranch.isEmpty() || workingBranch in defaultBranches) {\n                // default values when branch name could not be determined or is master or dev\n                applicationIdSuffix = \".debug\"\n                resValue(\"string\", \"app_name\", \"NewPipe Debug\")\n            } else {\n                applicationIdSuffix = \".debug.$normalizedWorkingBranch\"\n                resValue(\"string\", \"app_name\", \"NewPipe $workingBranch\")\n            }\n        }\n\n        release {\n            System.getProperty(\"packageSuffix\")?.let { suffix ->\n                applicationIdSuffix = suffix\n                resValue(\"string\", \"app_name\", \"NewPipe $suffix\")\n            }\n            isMinifyEnabled = true\n            isShrinkResources = true\n            proguardFiles(\n                getDefaultProguardFile(\"proguard-android-optimize.txt\"),\n                \"proguard-rules.pro\"\n            )\n        }\n    }\n\n    lint {\n        lintConfig = file(\"lint.xml\")\n        // Continue the debug build even when errors are found\n        abortOnError = false\n    }\n\n    compileOptions {\n        // Flag to enable support for the new language APIs\n        isCoreLibraryDesugaringEnabled = true\n        encoding = \"utf-8\"\n    }\n\n    sourceSets {\n        getByName(\"androidTest\") {\n            assets.directories += \"$projectDir/schemas\"\n        }\n    }\n\n    androidResources {\n        generateLocaleConfig = true\n    }\n\n    buildFeatures {\n        viewBinding = true\n        buildConfig = true\n        resValues = true\n    }\n\n    packaging {\n        resources {\n            // remove two files which belong to jsoup\n            // no idea how they ended up in the META-INF dir...\n            excludes += setOf(\n                \"META-INF/README.md\",\n                \"META-INF/CHANGES\",\n                \"META-INF/COPYRIGHT\" // \"COPYRIGHT\" belongs to RxJava...\n            )\n        }\n    }\n}\n\nksp {\n    arg(\"room.schemaLocation\", \"$projectDir/schemas\")\n}\n\n\n// Custom dependency configuration for ktlint\nval ktlint by configurations.creating\n\n// https://checkstyle.org/#JRE_and_JDK\ntasks.withType<Checkstyle>().configureEach {\n    javaLauncher = javaToolchains.launcherFor {\n        languageVersion = JavaLanguageVersion.of(21)\n    }\n}\n\ncheckstyle {\n    configDirectory = rootProject.file(\"checkstyle\")\n    isIgnoreFailures = false\n    isShowViolations = true\n    toolVersion = libs.versions.checkstyle.get()\n}\n\ntasks.register<Checkstyle>(\"runCheckstyle\") {\n    source(\"src\")\n    include(\"**/*.java\")\n    exclude(\"**/gen/**\")\n    exclude(\"**/R.java\")\n    exclude(\"**/BuildConfig.java\")\n    exclude(\"main/java/us/shandian/giga/**\")\n\n    classpath = configurations.getByName(\"checkstyle\")\n\n    isShowViolations = true\n\n    reports {\n        xml.required = true\n        html.required = true\n    }\n}\n\nval outputDir = project.layout.buildDirectory.dir(\"reports/ktlint/\")\nval inputFiles = fileTree(\"src\") { include(\"**/*.kt\") }\n\ntasks.register<JavaExec>(\"runKtlint\") {\n    inputs.files(inputFiles)\n    outputs.dir(outputDir)\n    mainClass.set(\"com.pinterest.ktlint.Main\")\n    classpath = configurations.getByName(\"ktlint\")\n    args = listOf(\"--editorconfig=../.editorconfig\", \"src/**/*.kt\")\n    jvmArgs = listOf(\"--add-opens\", \"java.base/java.lang=ALL-UNNAMED\")\n}\n\ntasks.register<JavaExec>(\"formatKtlint\") {\n    inputs.files(inputFiles)\n    outputs.dir(outputDir)\n    mainClass.set(\"com.pinterest.ktlint.Main\")\n    classpath = configurations.getByName(\"ktlint\")\n    args = listOf(\"--editorconfig=../.editorconfig\", \"-F\", \"src/**/*.kt\")\n    jvmArgs = listOf(\"--add-opens\", \"java.base/java.lang=ALL-UNNAMED\")\n}\n\ntasks.register<CheckDependenciesOrder>(\"checkDependenciesOrder\") {\n    tomlFile = layout.projectDirectory.file(\"../gradle/libs.versions.toml\")\n}\n\nafterEvaluate {\n    tasks.named(\"preDebugBuild\").configure {\n        if (!System.getProperties().containsKey(\"skipFormatKtlint\")) {\n            dependsOn(\"formatKtlint\")\n        }\n        dependsOn(\"runCheckstyle\", \"runKtlint\", \"checkDependenciesOrder\")\n    }\n}\n\nsonar {\n    properties {\n        property(\"sonar.projectKey\", \"TeamNewPipe_NewPipe\")\n        property(\"sonar.organization\", \"teamnewpipe\")\n        property(\"sonar.host.url\", \"https://sonarcloud.io\")\n    }\n}\n\ndependencies {\n    /** Desugaring **/\n    coreLibraryDesugaring(libs.android.desugar)\n\n    /** NewPipe libraries **/\n    implementation(libs.newpipe.nanojson)\n    implementation(libs.newpipe.extractor)\n    implementation(libs.newpipe.filepicker)\n\n    /** Checkstyle **/\n    checkstyle(libs.puppycrawl.checkstyle)\n    ktlint(libs.pinterest.ktlint)\n\n    /** AndroidX **/\n    implementation(libs.androidx.appcompat)\n    implementation(libs.androidx.cardview)\n    implementation(libs.androidx.constraintlayout)\n    implementation(libs.androidx.core)\n    implementation(libs.androidx.documentfile)\n    implementation(libs.androidx.fragment)\n    implementation(libs.androidx.lifecycle.livedata)\n    implementation(libs.androidx.lifecycle.viewmodel)\n    implementation(libs.androidx.localbroadcastmanager)\n    implementation(libs.androidx.media)\n    implementation(libs.androidx.preference)\n    implementation(libs.androidx.recyclerview)\n    implementation(libs.androidx.room.runtime)\n    implementation(libs.androidx.room.rxjava3)\n    ksp(libs.androidx.room.compiler)\n    implementation(libs.androidx.swiperefreshlayout)\n    implementation(libs.androidx.viewpager2)\n    implementation(libs.androidx.work.runtime)\n    implementation(libs.androidx.work.rxjava3)\n    implementation(libs.google.android.material)\n    implementation(libs.androidx.webkit)\n\n    // Coroutines interop\n    implementation(libs.kotlinx.coroutines.rx3)\n\n    // Kotlinx Serialization\n    implementation(libs.kotlinx.serialization.json)\n\n    /** Third-party libraries **/\n    implementation(libs.livefront.bridge)\n    implementation(libs.evernote.statesaver.core)\n    kapt(libs.evernote.statesaver.compiler)\n\n    // HTML parser\n    implementation(libs.jsoup)\n\n    // HTTP client\n    implementation(libs.squareup.okhttp)\n\n    // Media player\n    implementation(libs.google.exoplayer.core)\n    implementation(libs.google.exoplayer.dash)\n    implementation(libs.google.exoplayer.database)\n    implementation(libs.google.exoplayer.datasource)\n    implementation(libs.google.exoplayer.hls)\n    implementation(libs.google.exoplayer.mediasession)\n    implementation(libs.google.exoplayer.smoothstreaming)\n    implementation(libs.google.exoplayer.ui)\n\n    // Manager for complex RecyclerView layouts\n    implementation(libs.lisawray.groupie.core)\n    implementation(libs.lisawray.groupie.viewbinding)\n\n    // Image loading\n    implementation(libs.coil.compose)\n    implementation(libs.coil.network.okhttp)\n\n    // Markdown library for Android\n    implementation(libs.noties.markwon.core)\n    implementation(libs.noties.markwon.linkify)\n\n    // Crash reporting\n    implementation(libs.acra.core)\n    compileOnly(libs.google.autoservice.annotations)\n    ksp(libs.zacsweers.autoservice.compiler)\n\n    // Properly restarting\n    implementation(libs.jakewharton.phoenix)\n\n    // Reactive extensions for Java VM\n    implementation(libs.reactivex.rxjava)\n    implementation(libs.reactivex.rxandroid)\n    // RxJava binding APIs for Android UI widgets\n    implementation(libs.jakewharton.rxbinding)\n\n    // Date and time formatting\n    implementation(libs.ocpsoft.prettytime)\n\n    /** Debugging **/\n    // Memory leak detection\n    debugImplementation(libs.squareup.leakcanary.watcher)\n    debugImplementation(libs.squareup.leakcanary.plumber)\n    debugImplementation(libs.squareup.leakcanary.core)\n    // Debug bridge for Android\n    debugImplementation(libs.facebook.stetho.core)\n    debugImplementation(libs.facebook.stetho.okhttp3)\n\n    /** Testing **/\n    testImplementation(libs.junit)\n    testImplementation(libs.mockito.core)\n\n    androidTestImplementation(libs.androidx.junit)\n    androidTestImplementation(libs.androidx.runner)\n    androidTestImplementation(libs.androidx.room.testing)\n    androidTestImplementation(libs.assertj.core)\n}\n"
  },
  {
    "path": "app/lint.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>\n  ~ SPDX-License-Identifier: GPL-3.0-or-later\n  -->\n<lint>\n    <issue id=\"MissingTranslation\" severity=\"ignore\" />\n    <issue id=\"MissingQuantity\" severity=\"ignore\" />\n    <issue id=\"ImpliedQuantity\" severity=\"ignore\" />\n</lint>\n"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# https://developer.android.com/build/shrink-code\n\n## Helps debug release versions\n-dontobfuscate\n\n## Rules for NewPipeExtractor\n-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; }\n## Rules for Rhino and Rhino Engine\n-keep class org.mozilla.javascript.* { *; }\n-keep class org.mozilla.javascript.** { *; }\n-keep class org.mozilla.javascript.engine.** { *; }\n-keep class org.mozilla.classfile.ClassFileWriter\n-dontwarn org.mozilla.javascript.JavaToJSONConverters\n-dontwarn org.mozilla.javascript.tools.**\n-keep class javax.script.** { *; }\n-dontwarn javax.script.**\n-keep class jdk.dynalink.** { *; }\n-dontwarn jdk.dynalink.**\n# Rules for jsoup\n# Ignore intended-to-be-optional re2j classes - only needed if using re2j for jsoup regex\n# jsoup safely falls back to JDK regex if re2j not on classpath, but has concrete re2j refs\n# See https://github.com/jhy/jsoup/issues/2459 - may be resolved in future, then this may be removed\n-dontwarn com.google.re2j.**\n\n## Rules for ExoPlayer\n-keep class com.google.android.exoplayer2.** { *; }\n\n## Rules for OkHttp. Copy pasted from https://github.com/square/okhttp\n-dontwarn okhttp3.**\n-dontwarn okio.**\n\n## See https://github.com/TeamNewPipe/NewPipe/pull/1441\n-keepclassmembers class * implements java.io.Serializable {\n    static final long serialVersionUID;\n    !static !transient <fields>;\n    private void writeObject(java.io.ObjectOutputStream);\n    private void readObject(java.io.ObjectInputStream);\n}\n\n## For some reason NotificationModeConfigFragment wasn't kept (only referenced in a preference xml)\n-keep class org.schabi.newpipe.settings.notifications.** { *; }\n\n# Prevent R8 from stripping or renaming Protobuf internal fields\n-keepclassmembers class * extends com.google.protobuf.GeneratedMessageLite {\n    <fields>;\n}\n\n## Keep Kotlinx Serialization classes\n-keepclassmembers class kotlinx.serialization.json.** {\n    *** Companion;\n}\n-keepclasseswithmembers class kotlinx.serialization.json.** {\n    kotlinx.serialization.KSerializer serializer(...);\n}\n-keep,includedescriptorclasses class org.schabi.newpipe.**$$serializer { *; }\n-keepclassmembers class org.schabi.newpipe.** {\n    *** Companion;\n}\n-keepclasseswithmembers class org.schabi.newpipe.** {\n    kotlinx.serialization.KSerializer serializer(...);\n}\n"
  },
  {
    "path": "app/sampledata/channels.json",
    "content": "{\n  \"data\": [\n    {\n      \"name\": \"BBC\",\n      \"additional\": \"12K subscribers•233 videos\",\n      \"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\"\n    },\n    {\n      \"name\": \"Linus Tech Tips\",\n      \"additional\": \"1M subscribers•233 videos\",\n      \"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\"\n    },\n    {\n      \"name\": \"Marques Brownlee\",\n      \"additional\": \"13 subscribers•12K videos\",\n      \"description\": \"MKBHD: Quality Tech Videos | YouTuber | Geek | Consumer Electronics | Tech Head | Internet Personality!\\n\\nbusiness@MKBHD.com\\n\\nNYC\"\n    }\n  ]\n}"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/2.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 2,\n    \"identityHash\": \"b7856223e2595ddf20a3ce6243ce9527\",\n    \"entities\": [\n      {\n        \"tableName\": \"subscriptions\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatar_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"subscriberCount\",\n            \"columnName\": \"subscriber_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_subscriptions_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"creationDate\",\n            \"columnName\": \"creation_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"search\",\n            \"columnName\": \"search\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_history_search\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"search\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_search_history_search` ON `${TABLE_NAME}` (`search`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"streams\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `service_id` INTEGER NOT NULL, `url` TEXT, `title` TEXT, `stream_type` TEXT, `duration` INTEGER, `uploader` TEXT, `thumbnail_url` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"streamType\",\n            \"columnName\": \"stream_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"duration\",\n            \"columnName\": \"duration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_streams_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"stream_history\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessDate\",\n            \"columnName\": \"access_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repeatCount\",\n            \"columnName\": \"repeat_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\",\n            \"access_date\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_stream_history_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"stream_state\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"progressTime\",\n            \"columnName\": \"progress_time\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"playlists\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `thumbnail_url` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"playlist_stream_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"playlistUid\",\n            \"columnName\": \"playlist_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"join_index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"playlist_id\",\n            \"join_index\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlist_stream_join_playlist_id_join_index\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"playlist_id\",\n              \"join_index\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)\"\n          },\n          {\n            \"name\": \"index_playlist_stream_join_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"playlists\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"playlist_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"remote_playlists\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"streamCount\",\n            \"columnName\": \"stream_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_remote_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_remote_playlists_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \\\"b7856223e2595ddf20a3ce6243ce9527\\\")\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/3.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 3,\n    \"identityHash\": \"9f825b1ee281480bedd38b971feac327\",\n    \"entities\": [\n      {\n        \"tableName\": \"subscriptions\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatar_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"subscriberCount\",\n            \"columnName\": \"subscriber_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_subscriptions_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"creationDate\",\n            \"columnName\": \"creation_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"search\",\n            \"columnName\": \"search\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_history_search\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"search\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_search_history_search` ON `${TABLE_NAME}` (`search`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"streams\",\n        \"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, `thumbnail_url` TEXT, `view_count` INTEGER, `textual_upload_date` TEXT, `upload_date` INTEGER, `is_upload_date_approximation` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamType\",\n            \"columnName\": \"stream_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"duration\",\n            \"columnName\": \"duration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viewCount\",\n            \"columnName\": \"view_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"textualUploadDate\",\n            \"columnName\": \"textual_upload_date\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploadDate\",\n            \"columnName\": \"upload_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isUploadDateApproximation\",\n            \"columnName\": \"is_upload_date_approximation\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_streams_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"stream_history\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessDate\",\n            \"columnName\": \"access_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repeatCount\",\n            \"columnName\": \"repeat_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\",\n            \"access_date\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_stream_history_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"stream_state\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"progressTime\",\n            \"columnName\": \"progress_time\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"playlists\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `thumbnail_url` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"playlist_stream_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"playlistUid\",\n            \"columnName\": \"playlist_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"join_index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"playlist_id\",\n            \"join_index\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlist_stream_join_playlist_id_join_index\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"playlist_id\",\n              \"join_index\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)\"\n          },\n          {\n            \"name\": \"index_playlist_stream_join_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"playlists\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"playlist_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"remote_playlists\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"streamCount\",\n            \"columnName\": \"stream_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_remote_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_remote_playlists_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamId\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\",\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_group\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sortOrder\",\n            \"columnName\": \"sort_order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_sort_order\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"sort_order\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed_group_subscription_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"feedGroupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"group_id\",\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_subscription_join_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"createSql\": \"CREATE  INDEX `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"feed_group\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"group_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_last_updated\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastUpdated\",\n            \"columnName\": \"last_updated\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9f825b1ee281480bedd38b971feac327')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/4.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 4,\n    \"identityHash\": \"d8070091972a7011bce18aed62f80b90\",\n    \"entities\": [\n      {\n        \"tableName\": \"subscriptions\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatar_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"subscriberCount\",\n            \"columnName\": \"subscriber_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_subscriptions_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"creationDate\",\n            \"columnName\": \"creation_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"search\",\n            \"columnName\": \"search\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_history_search\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"search\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"streams\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamType\",\n            \"columnName\": \"stream_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"duration\",\n            \"columnName\": \"duration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploaderUrl\",\n            \"columnName\": \"uploader_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viewCount\",\n            \"columnName\": \"view_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"textualUploadDate\",\n            \"columnName\": \"textual_upload_date\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploadDate\",\n            \"columnName\": \"upload_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isUploadDateApproximation\",\n            \"columnName\": \"is_upload_date_approximation\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_streams_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"stream_history\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessDate\",\n            \"columnName\": \"access_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repeatCount\",\n            \"columnName\": \"repeat_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\",\n            \"access_date\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_stream_history_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"stream_state\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"progressMillis\",\n            \"columnName\": \"progress_time\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"playlists\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `thumbnail_url` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"playlist_stream_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"playlistUid\",\n            \"columnName\": \"playlist_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"join_index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"playlist_id\",\n            \"join_index\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlist_stream_join_playlist_id_join_index\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"playlist_id\",\n              \"join_index\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)\"\n          },\n          {\n            \"name\": \"index_playlist_stream_join_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"playlists\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"playlist_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"remote_playlists\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"streamCount\",\n            \"columnName\": \"stream_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_remote_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_remote_playlists_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamId\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\",\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_group\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sortOrder\",\n            \"columnName\": \"sort_order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_sort_order\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"sort_order\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed_group_subscription_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"feedGroupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"group_id\",\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_subscription_join_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"feed_group\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"group_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_last_updated\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastUpdated\",\n            \"columnName\": \"last_updated\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd8070091972a7011bce18aed62f80b90')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/5.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 5,\n    \"identityHash\": \"096731b513bb71dd44517639f4a2c1e3\",\n    \"entities\": [\n      {\n        \"tableName\": \"subscriptions\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatar_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"subscriberCount\",\n            \"columnName\": \"subscriber_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notificationMode\",\n            \"columnName\": \"notification_mode\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_subscriptions_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `creation_date` INTEGER, `service_id` INTEGER NOT NULL, `search` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"creationDate\",\n            \"columnName\": \"creation_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"search\",\n            \"columnName\": \"search\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_history_search\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"search\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"streams\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamType\",\n            \"columnName\": \"stream_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"duration\",\n            \"columnName\": \"duration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploaderUrl\",\n            \"columnName\": \"uploader_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viewCount\",\n            \"columnName\": \"view_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"textualUploadDate\",\n            \"columnName\": \"textual_upload_date\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploadDate\",\n            \"columnName\": \"upload_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isUploadDateApproximation\",\n            \"columnName\": \"is_upload_date_approximation\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_streams_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"stream_history\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessDate\",\n            \"columnName\": \"access_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repeatCount\",\n            \"columnName\": \"repeat_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\",\n            \"access_date\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_stream_history_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"stream_state\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"progressMillis\",\n            \"columnName\": \"progress_time\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"playlists\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `thumbnail_url` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"playlist_stream_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"playlistUid\",\n            \"columnName\": \"playlist_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"join_index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"playlist_id\",\n            \"join_index\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlist_stream_join_playlist_id_join_index\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"playlist_id\",\n              \"join_index\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)\"\n          },\n          {\n            \"name\": \"index_playlist_stream_join_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"playlists\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"playlist_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"remote_playlists\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"streamCount\",\n            \"columnName\": \"stream_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_remote_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_remote_playlists_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamId\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\",\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_group\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sortOrder\",\n            \"columnName\": \"sort_order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_sort_order\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"sort_order\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed_group_subscription_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"feedGroupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"group_id\",\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_subscription_join_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"feed_group\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"group_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_last_updated\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastUpdated\",\n            \"columnName\": \"last_updated\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '096731b513bb71dd44517639f4a2c1e3')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/6.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 6,\n    \"identityHash\": \"4084aa342aef315dc7b558770a7755a9\",\n    \"entities\": [\n      {\n        \"tableName\": \"subscriptions\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatar_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"subscriberCount\",\n            \"columnName\": \"subscriber_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notificationMode\",\n            \"columnName\": \"notification_mode\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_subscriptions_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_history\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"creationDate\",\n            \"columnName\": \"creation_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"search\",\n            \"columnName\": \"search\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_history_search\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"search\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"streams\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamType\",\n            \"columnName\": \"stream_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"duration\",\n            \"columnName\": \"duration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploaderUrl\",\n            \"columnName\": \"uploader_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viewCount\",\n            \"columnName\": \"view_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"textualUploadDate\",\n            \"columnName\": \"textual_upload_date\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploadDate\",\n            \"columnName\": \"upload_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isUploadDateApproximation\",\n            \"columnName\": \"is_upload_date_approximation\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_streams_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"stream_history\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessDate\",\n            \"columnName\": \"access_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repeatCount\",\n            \"columnName\": \"repeat_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\",\n            \"access_date\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_stream_history_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"stream_state\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"progressMillis\",\n            \"columnName\": \"progress_time\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"playlists\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `thumbnail_url` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isThumbnailPermanent\",\n            \"columnName\": \"is_thumbnail_permanent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"playlist_stream_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"playlistUid\",\n            \"columnName\": \"playlist_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"join_index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"playlist_id\",\n            \"join_index\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlist_stream_join_playlist_id_join_index\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"playlist_id\",\n              \"join_index\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)\"\n          },\n          {\n            \"name\": \"index_playlist_stream_join_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"playlists\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"playlist_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"remote_playlists\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"streamCount\",\n            \"columnName\": \"stream_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_remote_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_remote_playlists_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamId\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\",\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_group\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sortOrder\",\n            \"columnName\": \"sort_order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_sort_order\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"sort_order\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed_group_subscription_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"feedGroupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"group_id\",\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_subscription_join_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"feed_group\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"group_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_last_updated\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastUpdated\",\n            \"columnName\": \"last_updated\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4084aa342aef315dc7b558770a7755a9')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/7.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 7,\n    \"identityHash\": \"012fc8e7ad3333f1597347f34e76a513\",\n    \"entities\": [\n      {\n        \"tableName\": \"subscriptions\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatar_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"subscriberCount\",\n            \"columnName\": \"subscriber_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notificationMode\",\n            \"columnName\": \"notification_mode\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_subscriptions_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_history\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"creationDate\",\n            \"columnName\": \"creation_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"search\",\n            \"columnName\": \"search\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_history_search\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"search\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"streams\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamType\",\n            \"columnName\": \"stream_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"duration\",\n            \"columnName\": \"duration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploaderUrl\",\n            \"columnName\": \"uploader_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viewCount\",\n            \"columnName\": \"view_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"textualUploadDate\",\n            \"columnName\": \"textual_upload_date\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploadDate\",\n            \"columnName\": \"upload_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isUploadDateApproximation\",\n            \"columnName\": \"is_upload_date_approximation\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_streams_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"stream_history\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessDate\",\n            \"columnName\": \"access_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repeatCount\",\n            \"columnName\": \"repeat_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\",\n            \"access_date\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_stream_history_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"stream_state\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"progressMillis\",\n            \"columnName\": \"progress_time\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"playlists\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isThumbnailPermanent\",\n            \"columnName\": \"is_thumbnail_permanent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailStreamId\",\n            \"columnName\": \"thumbnail_stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"playlist_stream_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"playlistUid\",\n            \"columnName\": \"playlist_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"join_index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"playlist_id\",\n            \"join_index\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlist_stream_join_playlist_id_join_index\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"playlist_id\",\n              \"join_index\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)\"\n          },\n          {\n            \"name\": \"index_playlist_stream_join_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"playlists\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"playlist_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"remote_playlists\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"streamCount\",\n            \"columnName\": \"stream_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_remote_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_remote_playlists_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamId\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"stream_id\",\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_group\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sortOrder\",\n            \"columnName\": \"sort_order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uid\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_sort_order\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"sort_order\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed_group_subscription_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"feedGroupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"group_id\",\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_subscription_join_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"feed_group\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"group_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_last_updated\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastUpdated\",\n            \"columnName\": \"last_updated\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"subscription_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '012fc8e7ad3333f1597347f34e76a513')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/8.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 8,\n    \"identityHash\": \"012fc8e7ad3333f1597347f34e76a513\",\n    \"entities\": [\n      {\n        \"tableName\": \"subscriptions\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatar_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"subscriberCount\",\n            \"columnName\": \"subscriber_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notificationMode\",\n            \"columnName\": \"notification_mode\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"uid\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_subscriptions_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_history\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"creationDate\",\n            \"columnName\": \"creation_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"search\",\n            \"columnName\": \"search\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_history_search\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"search\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"streams\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamType\",\n            \"columnName\": \"stream_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"duration\",\n            \"columnName\": \"duration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploaderUrl\",\n            \"columnName\": \"uploader_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viewCount\",\n            \"columnName\": \"view_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"textualUploadDate\",\n            \"columnName\": \"textual_upload_date\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploadDate\",\n            \"columnName\": \"upload_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isUploadDateApproximation\",\n            \"columnName\": \"is_upload_date_approximation\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"uid\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_streams_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"stream_history\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessDate\",\n            \"columnName\": \"access_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repeatCount\",\n            \"columnName\": \"repeat_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"stream_id\",\n            \"access_date\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_stream_history_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"stream_state\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"progressMillis\",\n            \"columnName\": \"progress_time\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"stream_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"playlists\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isThumbnailPermanent\",\n            \"columnName\": \"is_thumbnail_permanent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailStreamId\",\n            \"columnName\": \"thumbnail_stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"uid\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"playlist_stream_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"playlistUid\",\n            \"columnName\": \"playlist_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"join_index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"playlist_id\",\n            \"join_index\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlist_stream_join_playlist_id_join_index\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"playlist_id\",\n              \"join_index\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)\"\n          },\n          {\n            \"name\": \"index_playlist_stream_join_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"playlists\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"playlist_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"remote_playlists\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"streamCount\",\n            \"columnName\": \"stream_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"uid\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_remote_playlists_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_remote_playlists_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_remote_playlists_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamId\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"stream_id\",\n            \"subscription_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_group\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sortOrder\",\n            \"columnName\": \"sort_order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"uid\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_sort_order\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"sort_order\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed_group_subscription_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"feedGroupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"group_id\",\n            \"subscription_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_subscription_join_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"feed_group\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"group_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_last_updated\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastUpdated\",\n            \"columnName\": \"last_updated\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"subscription_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '012fc8e7ad3333f1597347f34e76a513')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/org.schabi.newpipe.database.AppDatabase/9.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 9,\n    \"identityHash\": \"7591e8039faa74d8c0517dc867af9d3e\",\n    \"entities\": [\n      {\n        \"tableName\": \"subscriptions\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatar_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"subscriberCount\",\n            \"columnName\": \"subscriber_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notificationMode\",\n            \"columnName\": \"notification_mode\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"uid\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_subscriptions_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_subscriptions_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_history\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"creationDate\",\n            \"columnName\": \"creation_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"search\",\n            \"columnName\": \"search\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_history_search\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"search\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_history_search` ON `${TABLE_NAME}` (`search`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"streams\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamType\",\n            \"columnName\": \"stream_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"duration\",\n            \"columnName\": \"duration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uploaderUrl\",\n            \"columnName\": \"uploader_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viewCount\",\n            \"columnName\": \"view_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"textualUploadDate\",\n            \"columnName\": \"textual_upload_date\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploadDate\",\n            \"columnName\": \"upload_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isUploadDateApproximation\",\n            \"columnName\": \"is_upload_date_approximation\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"uid\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_streams_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_streams_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"stream_history\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accessDate\",\n            \"columnName\": \"access_date\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"repeatCount\",\n            \"columnName\": \"repeat_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"stream_id\",\n            \"access_date\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_stream_history_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_stream_history_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"stream_state\",\n        \"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 )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"progressMillis\",\n            \"columnName\": \"progress_time\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"stream_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"playlists\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isThumbnailPermanent\",\n            \"columnName\": \"is_thumbnail_permanent\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailStreamId\",\n            \"columnName\": \"thumbnail_stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"displayIndex\",\n            \"columnName\": \"display_index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"uid\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"playlist_stream_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"playlistUid\",\n            \"columnName\": \"playlist_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamUid\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"join_index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"playlist_id\",\n            \"join_index\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_playlist_stream_join_playlist_id_join_index\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"playlist_id\",\n              \"join_index\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_playlist_stream_join_playlist_id_join_index` ON `${TABLE_NAME}` (`playlist_id`, `join_index`)\"\n          },\n          {\n            \"name\": \"index_playlist_stream_join_stream_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"stream_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_playlist_stream_join_stream_id` ON `${TABLE_NAME}` (`stream_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"playlists\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"playlist_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"remote_playlists\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"serviceId\",\n            \"columnName\": \"service_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"orderingName\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnail_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uploader\",\n            \"columnName\": \"uploader\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayIndex\",\n            \"columnName\": \"display_index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"streamCount\",\n            \"columnName\": \"stream_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"uid\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_remote_playlists_service_id_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"service_id\",\n              \"url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_remote_playlists_service_id_url` ON `${TABLE_NAME}` (`service_id`, `url`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"streamId\",\n            \"columnName\": \"stream_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"stream_id\",\n            \"subscription_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"streams\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"stream_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_group\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uid\",\n            \"columnName\": \"uid\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"sortOrder\",\n            \"columnName\": \"sort_order\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"uid\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_sort_order\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"sort_order\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_sort_order` ON `${TABLE_NAME}` (`sort_order`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"feed_group_subscription_join\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"feedGroupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"group_id\",\n            \"subscription_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_feed_group_subscription_join_subscription_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"subscription_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_feed_group_subscription_join_subscription_id` ON `${TABLE_NAME}` (`subscription_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"feed_group\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"group_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          },\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"feed_last_updated\",\n        \"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)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"subscriptionId\",\n            \"columnName\": \"subscription_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"lastUpdated\",\n            \"columnName\": \"last_updated\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"subscription_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"subscriptions\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"subscription_id\"\n            ],\n            \"referencedColumns\": [\n              \"uid\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7591e8039faa74d8c0517dc867af9d3e')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt",
    "content": "package org.schabi.newpipe.database\n\nimport android.content.ContentValues\nimport android.database.sqlite.SQLiteDatabase\nimport androidx.room.Room\nimport androidx.room.testing.MigrationTestHelper\nimport androidx.test.core.app.ApplicationProvider\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotEquals\nimport org.junit.Assert.assertNull\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.schabi.newpipe.database.playlist.model.PlaylistEntity\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity\nimport org.schabi.newpipe.extractor.ServiceList\nimport org.schabi.newpipe.extractor.stream.StreamType\n\n@RunWith(AndroidJUnit4::class)\nclass DatabaseMigrationTest {\n    companion object {\n        private const val DEFAULT_SERVICE_ID = 0\n        private const val DEFAULT_URL = \"https://www.youtube.com/watch?v=cDphUib5iG4\"\n        private const val DEFAULT_TITLE = \"Test Title\"\n        private const val DEFAULT_NAME = \"Test Name\"\n        private val DEFAULT_TYPE = StreamType.VIDEO_STREAM\n        private const val DEFAULT_DURATION = 480L\n        private const val DEFAULT_UPLOADER_NAME = \"Uploader Test\"\n        private const val DEFAULT_THUMBNAIL = \"https://example.com/example.jpg\"\n\n        private const val DEFAULT_SECOND_SERVICE_ID = 1\n        private const val DEFAULT_SECOND_URL = \"https://www.youtube.com/watch?v=ncQU6iBn5Fc\"\n\n        private const val DEFAULT_THIRD_SERVICE_ID = 2\n        private const val DEFAULT_THIRD_URL = \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\"\n    }\n\n    @get:Rule\n    val testHelper = MigrationTestHelper(\n        InstrumentationRegistry.getInstrumentation(),\n        AppDatabase::class.java\n    )\n\n    @Test\n    fun migrateDatabaseFrom2to3() {\n        val databaseInV2 = testHelper.createDatabase(AppDatabase.DATABASE_NAME, Migrations.DB_VER_2)\n\n        databaseInV2.run {\n            insert(\n                \"streams\",\n                SQLiteDatabase.CONFLICT_FAIL,\n                ContentValues().apply {\n                    put(\"service_id\", DEFAULT_SERVICE_ID)\n                    put(\"url\", DEFAULT_URL)\n                    put(\"title\", DEFAULT_TITLE)\n                    put(\"stream_type\", DEFAULT_TYPE.name)\n                    put(\"duration\", DEFAULT_DURATION)\n                    put(\"uploader\", DEFAULT_UPLOADER_NAME)\n                    put(\"thumbnail_url\", DEFAULT_THUMBNAIL)\n                }\n            )\n            insert(\n                \"streams\",\n                SQLiteDatabase.CONFLICT_FAIL,\n                ContentValues().apply {\n                    put(\"service_id\", DEFAULT_SECOND_SERVICE_ID)\n                    put(\"url\", DEFAULT_SECOND_URL)\n                }\n            )\n            insert(\n                \"streams\",\n                SQLiteDatabase.CONFLICT_FAIL,\n                ContentValues().apply {\n                    put(\"service_id\", DEFAULT_SERVICE_ID)\n                }\n            )\n            close()\n        }\n\n        testHelper.runMigrationsAndValidate(\n            AppDatabase.DATABASE_NAME,\n            Migrations.DB_VER_3,\n            true,\n            Migrations.MIGRATION_2_3\n        )\n\n        testHelper.runMigrationsAndValidate(\n            AppDatabase.DATABASE_NAME,\n            Migrations.DB_VER_4,\n            true,\n            Migrations.MIGRATION_3_4\n        )\n\n        testHelper.runMigrationsAndValidate(\n            AppDatabase.DATABASE_NAME,\n            Migrations.DB_VER_5,\n            true,\n            Migrations.MIGRATION_4_5\n        )\n\n        testHelper.runMigrationsAndValidate(\n            AppDatabase.DATABASE_NAME,\n            Migrations.DB_VER_6,\n            true,\n            Migrations.MIGRATION_5_6\n        )\n\n        testHelper.runMigrationsAndValidate(\n            AppDatabase.DATABASE_NAME,\n            Migrations.DB_VER_7,\n            true,\n            Migrations.MIGRATION_6_7\n        )\n\n        testHelper.runMigrationsAndValidate(\n            AppDatabase.DATABASE_NAME,\n            Migrations.DB_VER_8,\n            true,\n            Migrations.MIGRATION_7_8\n        )\n\n        testHelper.runMigrationsAndValidate(\n            AppDatabase.DATABASE_NAME,\n            Migrations.DB_VER_9,\n            true,\n            Migrations.MIGRATION_8_9\n        )\n\n        val migratedDatabaseV3 = getMigratedDatabase()\n        val listFromDB = migratedDatabaseV3.streamDAO().getAll().blockingFirst()\n\n        // Only expect 2, the one with the null url will be ignored\n        assertEquals(2, listFromDB.size)\n\n        val streamFromMigratedDatabase = listFromDB[0]\n        assertEquals(DEFAULT_SERVICE_ID, streamFromMigratedDatabase.serviceId)\n        assertEquals(DEFAULT_URL, streamFromMigratedDatabase.url)\n        assertEquals(DEFAULT_TITLE, streamFromMigratedDatabase.title)\n        assertEquals(DEFAULT_TYPE, streamFromMigratedDatabase.streamType)\n        assertEquals(DEFAULT_DURATION, streamFromMigratedDatabase.duration)\n        assertEquals(DEFAULT_UPLOADER_NAME, streamFromMigratedDatabase.uploader)\n        assertEquals(DEFAULT_THUMBNAIL, streamFromMigratedDatabase.thumbnailUrl)\n        assertNull(streamFromMigratedDatabase.viewCount)\n        assertNull(streamFromMigratedDatabase.textualUploadDate)\n        assertNull(streamFromMigratedDatabase.uploadDate)\n        assertNull(streamFromMigratedDatabase.isUploadDateApproximation)\n\n        val secondStreamFromMigratedDatabase = listFromDB[1]\n        assertEquals(DEFAULT_SECOND_SERVICE_ID, secondStreamFromMigratedDatabase.serviceId)\n        assertEquals(DEFAULT_SECOND_URL, secondStreamFromMigratedDatabase.url)\n        assertEquals(\"\", secondStreamFromMigratedDatabase.title)\n        // Should fallback to VIDEO_STREAM\n        assertEquals(StreamType.VIDEO_STREAM, secondStreamFromMigratedDatabase.streamType)\n        assertEquals(0, secondStreamFromMigratedDatabase.duration)\n        assertEquals(\"\", secondStreamFromMigratedDatabase.uploader)\n        assertEquals(\"\", secondStreamFromMigratedDatabase.thumbnailUrl)\n        assertNull(secondStreamFromMigratedDatabase.viewCount)\n        assertNull(secondStreamFromMigratedDatabase.textualUploadDate)\n        assertNull(secondStreamFromMigratedDatabase.uploadDate)\n        assertNull(secondStreamFromMigratedDatabase.isUploadDateApproximation)\n    }\n\n    @Test\n    fun migrateDatabaseFrom7to8() {\n        val databaseInV7 = testHelper.createDatabase(AppDatabase.DATABASE_NAME, Migrations.DB_VER_7)\n\n        val defaultSearch1 = \" abc \"\n        val defaultSearch2 = \" abc\"\n\n        val serviceId = DEFAULT_SERVICE_ID // YouTube\n        // Use id different to YouTube because two searches with the same query\n        // but different service are considered not equal.\n        val otherServiceId = ServiceList.SoundCloud.serviceId\n\n        databaseInV7.run {\n            insert(\n                \"search_history\",\n                SQLiteDatabase.CONFLICT_FAIL,\n                ContentValues().apply {\n                    put(\"service_id\", serviceId)\n                    put(\"search\", defaultSearch1)\n                }\n            )\n            insert(\n                \"search_history\",\n                SQLiteDatabase.CONFLICT_FAIL,\n                ContentValues().apply {\n                    put(\"service_id\", serviceId)\n                    put(\"search\", defaultSearch2)\n                }\n            )\n            insert(\n                \"search_history\",\n                SQLiteDatabase.CONFLICT_FAIL,\n                ContentValues().apply {\n                    put(\"service_id\", otherServiceId)\n                    put(\"search\", defaultSearch1)\n                }\n            )\n            insert(\n                \"search_history\",\n                SQLiteDatabase.CONFLICT_FAIL,\n                ContentValues().apply {\n                    put(\"service_id\", otherServiceId)\n                    put(\"search\", defaultSearch2)\n                }\n            )\n            close()\n        }\n\n        testHelper.runMigrationsAndValidate(\n            AppDatabase.DATABASE_NAME,\n            Migrations.DB_VER_8,\n            true,\n            Migrations.MIGRATION_7_8\n        )\n\n        testHelper.runMigrationsAndValidate(\n            AppDatabase.DATABASE_NAME,\n            Migrations.DB_VER_9,\n            true,\n            Migrations.MIGRATION_8_9\n        )\n\n        val migratedDatabaseV8 = getMigratedDatabase()\n        val listFromDB = migratedDatabaseV8.searchHistoryDAO().getAll().blockingFirst()\n\n        assertEquals(2, listFromDB.size)\n        assertEquals(\"abc\", listFromDB[0].search)\n        assertEquals(\"abc\", listFromDB[1].search)\n        assertNotEquals(listFromDB[0].serviceId, listFromDB[1].serviceId)\n    }\n\n    @Test\n    fun migrateDatabaseFrom8to9() {\n        val databaseInV8 = testHelper.createDatabase(AppDatabase.DATABASE_NAME, Migrations.DB_VER_8)\n\n        val localUid1: Long\n        val localUid2: Long\n        val remoteUid1: Long\n        val remoteUid2: Long\n        databaseInV8.run {\n            localUid1 = insert(\n                \"playlists\",\n                SQLiteDatabase.CONFLICT_FAIL,\n                ContentValues().apply {\n                    put(\"name\", DEFAULT_NAME + \"1\")\n                    put(\"is_thumbnail_permanent\", false)\n                    put(\"thumbnail_stream_id\", -1)\n                }\n            )\n            localUid2 = insert(\n                \"playlists\",\n                SQLiteDatabase.CONFLICT_FAIL,\n                ContentValues().apply {\n                    put(\"name\", DEFAULT_NAME + \"2\")\n                    put(\"is_thumbnail_permanent\", false)\n                    put(\"thumbnail_stream_id\", -1)\n                }\n            )\n            delete(\n                \"playlists\",\n                \"uid = ?\",\n                Array(1) { localUid1 }\n            )\n            remoteUid1 = insert(\n                \"remote_playlists\",\n                SQLiteDatabase.CONFLICT_FAIL,\n                ContentValues().apply {\n                    put(\"service_id\", DEFAULT_SERVICE_ID)\n                    put(\"url\", DEFAULT_URL)\n                }\n            )\n            remoteUid2 = insert(\n                \"remote_playlists\",\n                SQLiteDatabase.CONFLICT_FAIL,\n                ContentValues().apply {\n                    put(\"service_id\", DEFAULT_SECOND_SERVICE_ID)\n                    put(\"url\", DEFAULT_SECOND_URL)\n                }\n            )\n            delete(\n                \"remote_playlists\",\n                \"uid = ?\",\n                Array(1) { remoteUid2 }\n            )\n            close()\n        }\n\n        testHelper.runMigrationsAndValidate(\n            AppDatabase.DATABASE_NAME,\n            Migrations.DB_VER_9,\n            true,\n            Migrations.MIGRATION_8_9\n        )\n\n        val migratedDatabaseV9 = getMigratedDatabase()\n        var localListFromDB = migratedDatabaseV9.playlistDAO().getAll().blockingFirst()\n        var remoteListFromDB = migratedDatabaseV9.playlistRemoteDAO().getAll().blockingFirst()\n\n        assertEquals(1, localListFromDB.size)\n        assertEquals(localUid2, localListFromDB[0].uid)\n        assertEquals(-1, localListFromDB[0].displayIndex)\n        assertEquals(1, remoteListFromDB.size)\n        assertEquals(remoteUid1, remoteListFromDB[0].uid)\n        assertEquals(-1, remoteListFromDB[0].displayIndex)\n\n        val localUid3 = migratedDatabaseV9.playlistDAO().insert(\n            PlaylistEntity(\n                name = \"${DEFAULT_NAME}3\",\n                isThumbnailPermanent = false,\n                thumbnailStreamId = -1,\n                displayIndex = -1\n            )\n        )\n        val remoteUid3 = migratedDatabaseV9.playlistRemoteDAO().insert(\n            PlaylistRemoteEntity(\n                serviceId = DEFAULT_THIRD_SERVICE_ID,\n                orderingName = DEFAULT_NAME,\n                url = DEFAULT_THIRD_URL,\n                thumbnailUrl = DEFAULT_THUMBNAIL,\n                uploader = DEFAULT_UPLOADER_NAME,\n                displayIndex = -1,\n                streamCount = 10\n            )\n        )\n\n        localListFromDB = migratedDatabaseV9.playlistDAO().getAll().blockingFirst()\n        remoteListFromDB = migratedDatabaseV9.playlistRemoteDAO().getAll().blockingFirst()\n        assertEquals(2, localListFromDB.size)\n        assertEquals(localUid3, localListFromDB[1].uid)\n        assertEquals(-1, localListFromDB[1].displayIndex)\n        assertEquals(2, remoteListFromDB.size)\n        assertEquals(remoteUid3, remoteListFromDB[1].uid)\n        assertEquals(-1, remoteListFromDB[1].displayIndex)\n    }\n\n    private fun getMigratedDatabase(): AppDatabase {\n        val database: AppDatabase = Room.databaseBuilder(\n            ApplicationProvider.getApplicationContext(),\n            AppDatabase::class.java,\n            AppDatabase.DATABASE_NAME\n        )\n            .build()\n        testHelper.closeWhenFinished(database)\n        return database\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt",
    "content": "package org.schabi.newpipe.database\n\nimport android.content.Context\nimport androidx.room.Room\nimport androidx.test.core.app.ApplicationProvider\nimport io.reactivex.rxjava3.core.Single\nimport java.io.IOException\nimport java.time.OffsetDateTime\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotNull\nimport org.junit.Before\nimport org.junit.Test\nimport org.schabi.newpipe.database.feed.dao.FeedDAO\nimport org.schabi.newpipe.database.feed.model.FeedEntity\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.database.stream.StreamWithState\nimport org.schabi.newpipe.database.stream.dao.StreamDAO\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.database.subscription.SubscriptionDAO\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\nimport org.schabi.newpipe.extractor.ServiceList\nimport org.schabi.newpipe.extractor.channel.ChannelInfo\nimport org.schabi.newpipe.extractor.stream.StreamType\n\nclass FeedDAOTest {\n    private lateinit var db: AppDatabase\n    private lateinit var feedDAO: FeedDAO\n    private lateinit var streamDAO: StreamDAO\n    private lateinit var subscriptionDAO: SubscriptionDAO\n\n    private val serviceId = ServiceList.YouTube.serviceId\n\n    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\"))\n    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\"))\n    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\"))\n    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\"))\n    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\"))\n    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\"))\n    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\"))\n\n    private val allStreams = listOf(\n        stream1,\n        stream2,\n        stream3,\n        stream4,\n        stream5,\n        stream6,\n        stream7\n    )\n\n    @Before\n    fun createDb() {\n        val context = ApplicationProvider.getApplicationContext<Context>()\n        db = Room.inMemoryDatabaseBuilder(\n            context,\n            AppDatabase::class.java\n        ).build()\n        feedDAO = db.feedDAO()\n        streamDAO = db.streamDAO()\n        subscriptionDAO = db.subscriptionDAO()\n    }\n\n    @After\n    @Throws(IOException::class)\n    fun closeDb() {\n        db.close()\n    }\n\n    @Test\n    fun testUnlinkStreamsOlderThan_KeepOne() {\n        setupUnlinkDelete(\"2023-08-15T00:00:00Z\")\n        val streams = feedDAO.getStreams(\n            FeedGroupEntity.GROUP_ALL_ID,\n            includePlayed = true,\n            includePartiallyPlayed = true,\n            null\n        )\n            .blockingGet()\n        val allowedStreams = listOf(stream3, stream5, stream6, stream7)\n        assertEqual(streams, allowedStreams)\n    }\n\n    @Test\n    fun testUnlinkStreamsOlderThan_KeepMultiple() {\n        setupUnlinkDelete(\"2023-08-01T00:00:00Z\")\n        val streams = feedDAO.getStreams(\n            FeedGroupEntity.GROUP_ALL_ID,\n            includePlayed = true,\n            includePartiallyPlayed = true,\n            null\n        )\n            .blockingGet()\n        val allowedStreams = listOf(stream3, stream4, stream5, stream6, stream7)\n        assertEqual(streams, allowedStreams)\n    }\n\n    private fun assertEqual(streams: List<StreamWithState>?, allowedStreams: List<StreamEntity>) {\n        assertNotNull(streams)\n        assertEquals(\n            allowedStreams,\n            streams!!\n                .map { it.stream }\n                .sortedBy { it.uid }\n                .toList()\n        )\n    }\n\n    private fun setupUnlinkDelete(time: String) {\n        clearAndFillTables()\n        Single.fromCallable {\n            feedDAO.unlinkStreamsOlderThan(OffsetDateTime.parse(time))\n        }.blockingSubscribe()\n        Single.fromCallable {\n            streamDAO.deleteOrphans()\n        }.blockingSubscribe()\n    }\n\n    private fun clearAndFillTables() {\n        db.clearAllTables()\n        streamDAO.insertAll(allStreams)\n        subscriptionDAO.insertAll(\n            listOf(\n                SubscriptionEntity.from(ChannelInfo(serviceId, \"1\", \"https://youtube.com/channel/1\", \"https://youtube.com/channel/1\", \"channel-1\")),\n                SubscriptionEntity.from(ChannelInfo(serviceId, \"2\", \"https://youtube.com/channel/2\", \"https://youtube.com/channel/2\", \"channel-2\")),\n                SubscriptionEntity.from(ChannelInfo(serviceId, \"3\", \"https://youtube.com/channel/3\", \"https://youtube.com/channel/3\", \"channel-3\")),\n                SubscriptionEntity.from(ChannelInfo(serviceId, \"4\", \"https://youtube.com/channel/4\", \"https://youtube.com/channel/4\", \"channel-4\"))\n            )\n        )\n        feedDAO.insertAll(\n            listOf(\n                FeedEntity(1, 1),\n                FeedEntity(2, 1),\n                FeedEntity(3, 1),\n                FeedEntity(4, 2),\n                FeedEntity(5, 2),\n                FeedEntity(6, 3),\n                FeedEntity(7, 4)\n            )\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/error/ErrorInfoTest.java",
    "content": "package org.schabi.newpipe.error;\n\nimport android.os.Parcel;\n\nimport androidx.test.ext.junit.runners.AndroidJUnit4;\nimport androidx.test.filters.LargeTest;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.ServiceList;\nimport org.schabi.newpipe.extractor.exceptions.ParsingException;\n\nimport java.util.Arrays;\nimport java.util.Objects;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\n/**\n * Instrumented tests for {@link ErrorInfo}.\n */\n@RunWith(AndroidJUnit4.class)\n@LargeTest\npublic class ErrorInfoTest {\n\n    /**\n     * @param errorInfo the error info to access\n     * @return the private field errorInfo.message.stringRes using reflection\n     */\n    private int getMessageFromErrorInfo(final ErrorInfo errorInfo)\n            throws NoSuchFieldException, IllegalAccessException {\n        final var message = ErrorInfo.class.getDeclaredField(\"message\");\n        message.setAccessible(true);\n        final var messageValue = (ErrorInfo.Companion.ErrorMessage) message.get(errorInfo);\n\n        final var stringRes = ErrorInfo.Companion.ErrorMessage.class.getDeclaredField(\"stringRes\");\n        stringRes.setAccessible(true);\n        return (int) Objects.requireNonNull(stringRes.get(messageValue));\n    }\n\n    @Test\n    public void errorInfoTestParcelable() throws NoSuchFieldException, IllegalAccessException {\n        final ErrorInfo info = new ErrorInfo(new ParsingException(\"Hello\"),\n                UserAction.USER_REPORT, \"request\", ServiceList.YouTube.getServiceId());\n        // Obtain a Parcel object and write the parcelable object to it:\n        final Parcel parcel = Parcel.obtain();\n        info.writeToParcel(parcel, 0);\n        parcel.setDataPosition(0);\n        final ErrorInfo infoFromParcel = (ErrorInfo) ErrorInfo.CREATOR.createFromParcel(parcel);\n\n        assertTrue(Arrays.toString(infoFromParcel.getStackTraces())\n                .contains(ErrorInfoTest.class.getSimpleName()));\n        assertEquals(UserAction.USER_REPORT, infoFromParcel.getUserAction());\n        assertEquals(ServiceList.YouTube.getServiceInfo().getName(),\n                infoFromParcel.getServiceName());\n        assertEquals(\"request\", infoFromParcel.getRequest());\n        assertEquals(R.string.parsing_error, getMessageFromErrorInfo(infoFromParcel));\n\n        parcel.recycle();\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/local/history/HistoryRecordManagerTest.kt",
    "content": "package org.schabi.newpipe.local.history\n\nimport androidx.test.core.app.ApplicationProvider\nimport java.time.LocalDateTime\nimport java.time.OffsetDateTime\nimport java.time.ZoneOffset\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.After\nimport org.junit.Assert.assertEquals\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.schabi.newpipe.database.AppDatabase\nimport org.schabi.newpipe.database.history.model.SearchHistoryEntry\nimport org.schabi.newpipe.testUtil.TestDatabase\nimport org.schabi.newpipe.testUtil.TrampolineSchedulerRule\n\nclass HistoryRecordManagerTest {\n\n    private lateinit var manager: HistoryRecordManager\n    private lateinit var database: AppDatabase\n\n    @get:Rule\n    val trampolineScheduler = TrampolineSchedulerRule()\n\n    @Before\n    fun setup() {\n        database = TestDatabase.createReplacingNewPipeDatabase()\n        manager = HistoryRecordManager(ApplicationProvider.getApplicationContext())\n    }\n\n    @After\n    fun cleanUp() {\n        database.close()\n    }\n\n    @Test\n    fun onSearched() {\n        manager.onSearched(0, \"Hello\").test().await().assertValue(1)\n\n        // For some reason the Flowable returned by getAll() never completes, so we can't assert\n        // that the number of Lists it returns is exactly 1, we can only check if the first List is\n        // correct. Why on earth has a Flowable been used instead of a Single for getAll()?!?\n        val entities = database.searchHistoryDAO().getAll().blockingFirst()\n        assertThat(entities).hasSize(1)\n        assertThat(entities[0].id).isEqualTo(1)\n        assertThat(entities[0].serviceId).isEqualTo(0)\n        assertThat(entities[0].search).isEqualTo(\"Hello\")\n    }\n\n    @Test\n    fun deleteSearchHistory() {\n        val entries = listOf(\n            SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 0, search = \"A\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 2, search = \"A\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 1, search = \"B\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 0, search = \"B\")\n        )\n\n        // make sure all 4 were inserted\n        database.searchHistoryDAO().insertAll(entries)\n        assertThat(database.searchHistoryDAO().getAll().blockingFirst()).hasSameSizeAs(entries)\n\n        // try to delete only \"A\" entries, \"B\" entries should be untouched\n        manager.deleteSearchHistory(\"A\").test().await().assertValue(2)\n        val entities = database.searchHistoryDAO().getAll().blockingFirst()\n        assertThat(entities).hasSize(2)\n        assertThat(entities).usingElementComparator { o1, o2 -> if (o1.hasEqualValues(o2)) 0 else 1 }\n            .containsExactly(*entries.subList(2, 4).toTypedArray())\n\n        // assert that nothing happens if we delete a search query that does exist in the db\n        manager.deleteSearchHistory(\"A\").test().await().assertValue(0)\n        val entities2 = database.searchHistoryDAO().getAll().blockingFirst()\n        assertThat(entities2).hasSize(2)\n        assertThat(entities2).usingElementComparator { o1, o2 -> if (o1.hasEqualValues(o2)) 0 else 1 }\n            .containsExactly(*entries.subList(2, 4).toTypedArray())\n\n        // delete all remaining entries\n        manager.deleteSearchHistory(\"B\").test().await().assertValue(2)\n        assertThat(database.searchHistoryDAO().getAll().blockingFirst()).isEmpty()\n    }\n\n    @Test\n    fun deleteCompleteSearchHistory() {\n        val entries = listOf(\n            SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = \"A\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 2, search = \"B\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 0, search = \"C\")\n        )\n\n        // make sure all 3 were inserted\n        database.searchHistoryDAO().insertAll(entries)\n        assertThat(database.searchHistoryDAO().getAll().blockingFirst()).hasSameSizeAs(entries)\n\n        // should remove everything\n        manager.deleteCompleteSearchHistory().test().await().assertValue(entries.size)\n        assertThat(database.searchHistoryDAO().getAll().blockingFirst()).isEmpty()\n    }\n\n    private fun insertShuffledRelatedSearches(relatedSearches: Collection<SearchHistoryEntry>) {\n        // shuffle to make sure the order of items returned by queries depends only on\n        // SearchHistoryEntry.creationDate, not on the actual insertion time, so that we can\n        // verify that the `ORDER BY` clause does its job\n        database.searchHistoryDAO().insertAll(relatedSearches.shuffled())\n\n        // make sure all entries were inserted\n        assertEquals(\n            relatedSearches.size,\n            database.searchHistoryDAO().getAll().blockingFirst().size\n        )\n    }\n\n    @Test\n    fun getRelatedSearches_emptyQuery() {\n        insertShuffledRelatedSearches(RELATED_SEARCHES_ENTRIES)\n\n        // make sure correct number of searches is returned and in correct order\n        val searches = manager.getRelatedSearches(\"\", 6, 4).blockingFirst()\n        assertThat(searches).containsExactly(\n            RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places)\n            RELATED_SEARCHES_ENTRIES[4].search, // B\n            RELATED_SEARCHES_ENTRIES[5].search, // AA\n            RELATED_SEARCHES_ENTRIES[2].search // BA\n        )\n    }\n\n    @Test\n    fun getRelatedSearches_emptyQuery_manyDuplicates() {\n        val relatedSearches = listOf(\n            SearchHistoryEntry(creationDate = time.minusSeconds(9), serviceId = 3, search = \"A\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(8), serviceId = 3, search = \"AB\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(7), serviceId = 3, search = \"A\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(6), serviceId = 3, search = \"A\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(5), serviceId = 3, search = \"BA\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 3, search = \"A\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 3, search = \"A\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 0, search = \"A\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 2, search = \"AA\")\n        )\n        insertShuffledRelatedSearches(relatedSearches)\n\n        val searches = manager.getRelatedSearches(\"\", 9, 3).blockingFirst()\n        assertThat(searches).containsExactly(\"AA\", \"A\", \"BA\")\n    }\n\n    @Test\n    fun getRelatedSearched_nonEmptyQuery() {\n        insertShuffledRelatedSearches(RELATED_SEARCHES_ENTRIES)\n\n        // make sure correct number of searches is returned and in correct order\n        val searches = manager.getRelatedSearches(\"A\", 3, 5).blockingFirst()\n        assertThat(searches).containsExactly(\n            RELATED_SEARCHES_ENTRIES[6].search, // A (even if in two places)\n            RELATED_SEARCHES_ENTRIES[5].search, // AA\n            RELATED_SEARCHES_ENTRIES[1].search // BA\n        )\n\n        // also make sure that the string comparison is case insensitive\n        val searches2 = manager.getRelatedSearches(\"a\", 3, 5).blockingFirst()\n        assertThat(searches).isEqualTo(searches2)\n    }\n\n    companion object {\n        private val time = OffsetDateTime.of(LocalDateTime.of(2000, 1, 1, 1, 1), ZoneOffset.UTC)\n\n        private val RELATED_SEARCHES_ENTRIES = listOf(\n            SearchHistoryEntry(creationDate = time.minusSeconds(7), serviceId = 2, search = \"AC\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(6), serviceId = 0, search = \"ABC\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(5), serviceId = 1, search = \"BA\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(4), serviceId = 3, search = \"A\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(2), serviceId = 0, search = \"B\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(3), serviceId = 2, search = \"AA\"),\n            SearchHistoryEntry(creationDate = time.minusSeconds(1), serviceId = 1, search = \"A\")\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt",
    "content": "package org.schabi.newpipe.local.playlist\n\nimport org.junit.After\nimport org.junit.Before\nimport org.junit.Rule\nimport org.junit.Test\nimport org.schabi.newpipe.database.AppDatabase\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.extractor.stream.StreamType\nimport org.schabi.newpipe.testUtil.TestDatabase\nimport org.schabi.newpipe.testUtil.TrampolineSchedulerRule\n\nclass LocalPlaylistManagerTest {\n\n    private lateinit var manager: LocalPlaylistManager\n    private lateinit var database: AppDatabase\n\n    @get:Rule\n    val trampolineScheduler = TrampolineSchedulerRule()\n\n    @Before\n    fun setup() {\n        database = TestDatabase.createReplacingNewPipeDatabase()\n        manager = LocalPlaylistManager(database)\n    }\n\n    @After\n    fun cleanUp() {\n        database.close()\n    }\n\n    @Test\n    fun createPlaylist() {\n        val NEWPIPE_URL = \"https://newpipe.net/\"\n        val stream = StreamEntity(\n            serviceId = 1,\n            url = NEWPIPE_URL,\n            title = \"title\",\n            streamType = StreamType.VIDEO_STREAM,\n            duration = 1,\n            uploader = \"uploader\",\n            uploaderUrl = NEWPIPE_URL\n        )\n\n        val result = manager.createPlaylist(\"name\", listOf(stream))\n\n        // This should not behave like this.\n        // Currently list of all stream ids is returned instead of playlist id\n        result.test().await().assertValue(listOf(1L))\n    }\n\n    @Test\n    fun createPlaylist_emptyPlaylistMustReturnEmpty() {\n        val result = manager.createPlaylist(\"name\", emptyList())\n\n        // This should not behave like this.\n        // It should throw an error because currently the result is null\n        result.test().await().assertComplete()\n        manager.playlists.test().awaitCount(1).assertValue(emptyList())\n    }\n\n    @Test()\n    fun createPlaylist_nonExistentStreamsAreUpserted() {\n        val stream = StreamEntity(\n            serviceId = 1,\n            url = \"https://newpipe.net/\",\n            title = \"title\",\n            streamType = StreamType.VIDEO_STREAM,\n            duration = 1,\n            uploader = \"uploader\",\n            uploaderUrl = \"https://newpipe.net/\"\n        )\n        database.streamDAO().insert(stream)\n        val upserted = StreamEntity(\n            serviceId = 1,\n            url = \"https://newpipe.net/2\",\n            title = \"title2\",\n            streamType = StreamType.VIDEO_STREAM,\n            duration = 1,\n            uploader = \"uploader\",\n            uploaderUrl = \"https://newpipe.net/\"\n        )\n\n        val result = manager.createPlaylist(\"name\", listOf(stream, upserted))\n\n        result.test().await().assertComplete()\n        database.streamDAO().getAll().test().awaitCount(1).assertValue(listOf(stream, upserted))\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/local/subscription/SubscriptionManagerTest.java",
    "content": "package org.schabi.newpipe.local.subscription;\n\nimport static org.junit.Assert.assertEquals;\n\nimport androidx.test.core.app.ApplicationProvider;\n\nimport org.junit.After;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\nimport org.schabi.newpipe.database.AppDatabase;\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity;\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity;\nimport org.schabi.newpipe.extractor.channel.ChannelInfo;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.testUtil.TestDatabase;\nimport org.schabi.newpipe.testUtil.TrampolineSchedulerRule;\n\nimport java.io.IOException;\nimport java.util.List;\n\npublic class SubscriptionManagerTest {\n    private AppDatabase database;\n    private SubscriptionManager manager;\n\n    @Rule\n    public TrampolineSchedulerRule trampolineScheduler = new TrampolineSchedulerRule();\n\n\n    private SubscriptionEntity getAssertOneSubscriptionEntity() {\n        final List<SubscriptionEntity> entities = manager\n                .getSubscriptions(FeedGroupEntity.GROUP_ALL_ID, \"\", false)\n                .blockingFirst();\n        assertEquals(1, entities.size());\n        return entities.get(0);\n    }\n\n\n    @Before\n    public void setup() {\n        database = TestDatabase.Companion.createReplacingNewPipeDatabase();\n        manager = new SubscriptionManager(ApplicationProvider.getApplicationContext());\n    }\n\n    @After\n    public void cleanUp() {\n        database.close();\n    }\n\n    @Test\n    public void testInsert() throws ExtractionException, IOException {\n        final ChannelInfo info = ChannelInfo.getInfo(\"https://www.youtube.com/c/3blue1brown\");\n        final SubscriptionEntity subscription = SubscriptionEntity.from(info);\n\n        manager.insertSubscription(subscription);\n        final SubscriptionEntity readSubscription = getAssertOneSubscriptionEntity();\n\n        // the uid has changed, since the uid is chosen upon inserting, but the rest should match\n        assertEquals(subscription.getServiceId(), readSubscription.getServiceId());\n        assertEquals(subscription.getUrl(), readSubscription.getUrl());\n        assertEquals(subscription.getName(), readSubscription.getName());\n        assertEquals(subscription.getAvatarUrl(), readSubscription.getAvatarUrl());\n        assertEquals(subscription.getSubscriberCount(), readSubscription.getSubscriberCount());\n        assertEquals(subscription.getDescription(), readSubscription.getDescription());\n    }\n\n    @Test\n    public void testUpdateNotificationMode() throws ExtractionException, IOException {\n        final ChannelInfo info = ChannelInfo.getInfo(\"https://www.youtube.com/c/veritasium\");\n        final SubscriptionEntity subscription = SubscriptionEntity.from(info);\n        subscription.setNotificationMode(0);\n\n        manager.insertSubscription(subscription);\n        manager.updateNotificationMode(subscription.getServiceId(), subscription.getUrl(), 1)\n                .blockingAwait();\n        final SubscriptionEntity anotherSubscription = getAssertOneSubscriptionEntity();\n\n        assertEquals(0, subscription.getNotificationMode());\n        assertEquals(subscription.getUrl(), anotherSubscription.getUrl());\n        assertEquals(1, anotherSubscription.getNotificationMode());\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/testUtil/TestDatabase.kt",
    "content": "package org.schabi.newpipe.testUtil\n\nimport androidx.room.Room\nimport androidx.test.core.app.ApplicationProvider\nimport org.junit.Assert.assertSame\nimport org.schabi.newpipe.NewPipeDatabase\nimport org.schabi.newpipe.database.AppDatabase\n\nclass TestDatabase {\n    companion object {\n        fun createReplacingNewPipeDatabase(): AppDatabase {\n            val database = Room.inMemoryDatabaseBuilder(\n                ApplicationProvider.getApplicationContext(),\n                AppDatabase::class.java\n            )\n                .allowMainThreadQueries()\n                .build()\n\n            val databaseField = NewPipeDatabase::class.java.getDeclaredField(\"databaseInstance\")\n            databaseField.isAccessible = true\n            databaseField.set(NewPipeDatabase::class, database)\n\n            assertSame(\n                \"Mocking database failed!\",\n                database,\n                NewPipeDatabase.getInstance(ApplicationProvider.getApplicationContext())\n            )\n\n            return database\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/testUtil/TrampolineSchedulerRule.kt",
    "content": "package org.schabi.newpipe.testUtil\n\nimport io.reactivex.rxjava3.android.plugins.RxAndroidPlugins\nimport io.reactivex.rxjava3.plugins.RxJavaPlugins\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport org.junit.rules.TestRule\nimport org.junit.runner.Description\nimport org.junit.runners.model.Statement\n\n/**\n * Always run on [Schedulers.trampoline].\n * This executes the task in the current thread in FIFO manner.\n * This ensures that tasks are run quickly inside the tests\n * and not scheduled away to another thread for later execution\n */\nclass TrampolineSchedulerRule : TestRule {\n\n    private val scheduler = Schedulers.trampoline()\n\n    override fun apply(base: Statement, description: Description): Statement = object : Statement() {\n        override fun evaluate() {\n            try {\n                RxJavaPlugins.setComputationSchedulerHandler { scheduler }\n                RxJavaPlugins.setIoSchedulerHandler { scheduler }\n                RxJavaPlugins.setNewThreadSchedulerHandler { scheduler }\n                RxJavaPlugins.setSingleSchedulerHandler { scheduler }\n                RxAndroidPlugins.setInitMainThreadSchedulerHandler { scheduler }\n\n                base.evaluate()\n            } finally {\n                RxJavaPlugins.reset()\n                RxAndroidPlugins.reset()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/org/schabi/newpipe/util/StreamItemAdapterTest.kt",
    "content": "package org.schabi.newpipe.util\n\nimport android.content.Context\nimport android.view.View\nimport android.view.View.GONE\nimport android.view.View.INVISIBLE\nimport android.view.View.VISIBLE\nimport android.widget.Spinner\nimport androidx.collection.SparseArrayCompat\nimport androidx.test.core.app.ApplicationProvider\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.filters.MediumTest\nimport androidx.test.internal.runner.junit4.statement.UiThreadStatement\nimport org.junit.Assert\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertNull\nimport org.junit.Assert.assertTrue\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.extractor.MediaFormat\nimport org.schabi.newpipe.extractor.downloader.Response\nimport org.schabi.newpipe.extractor.stream.AudioStream\nimport org.schabi.newpipe.extractor.stream.Stream\nimport org.schabi.newpipe.extractor.stream.SubtitlesStream\nimport org.schabi.newpipe.extractor.stream.VideoStream\nimport org.schabi.newpipe.util.StreamItemAdapter.StreamInfoWrapper\n\n@MediumTest\n@RunWith(AndroidJUnit4::class)\nclass StreamItemAdapterTest {\n    private lateinit var context: Context\n    private lateinit var spinner: Spinner\n\n    @Before\n    fun setUp() {\n        context = ApplicationProvider.getApplicationContext()\n        UiThreadStatement.runOnUiThread {\n            spinner = Spinner(context)\n        }\n    }\n\n    @Test\n    fun videoStreams_noSecondaryStream() {\n        val adapter = StreamItemAdapter<VideoStream, AudioStream>(\n            getVideoStreams(true, true, true, true)\n        )\n\n        spinner.adapter = adapter\n        assertIconVisibility(spinner, 0, VISIBLE, VISIBLE)\n        assertIconVisibility(spinner, 1, VISIBLE, VISIBLE)\n        assertIconVisibility(spinner, 2, VISIBLE, VISIBLE)\n        assertIconVisibility(spinner, 3, VISIBLE, VISIBLE)\n    }\n\n    @Test\n    fun videoStreams_hasSecondaryStream() {\n        val adapter = StreamItemAdapter(\n            getVideoStreams(false, true, false, true),\n            getAudioStreams(false, true, false, true)\n        )\n\n        spinner.adapter = adapter\n        assertIconVisibility(spinner, 0, GONE, GONE)\n        assertIconVisibility(spinner, 1, GONE, GONE)\n        assertIconVisibility(spinner, 2, GONE, GONE)\n        assertIconVisibility(spinner, 3, GONE, GONE)\n    }\n\n    @Test\n    fun videoStreams_Mixed() {\n        val adapter = StreamItemAdapter(\n            getVideoStreams(true, true, true, true, true, false, true, true),\n            getAudioStreams(false, true, false, false, false, true, true, true)\n        )\n\n        spinner.adapter = adapter\n        assertIconVisibility(spinner, 0, VISIBLE, VISIBLE)\n        assertIconVisibility(spinner, 1, GONE, INVISIBLE)\n        assertIconVisibility(spinner, 2, VISIBLE, VISIBLE)\n        assertIconVisibility(spinner, 3, VISIBLE, VISIBLE)\n        assertIconVisibility(spinner, 4, VISIBLE, VISIBLE)\n        assertIconVisibility(spinner, 5, GONE, INVISIBLE)\n        assertIconVisibility(spinner, 6, GONE, INVISIBLE)\n        assertIconVisibility(spinner, 7, GONE, INVISIBLE)\n    }\n\n    @Test\n    fun subtitleStreams_noIcon() {\n        val adapter = StreamItemAdapter<SubtitlesStream, Stream>(\n            StreamItemAdapter.StreamInfoWrapper(\n                (0 until 5).map {\n                    SubtitlesStream.Builder()\n                        .setContent(\"https://example.com\", true)\n                        .setMediaFormat(MediaFormat.SRT)\n                        .setLanguageCode(\"pt-BR\")\n                        .setAutoGenerated(false)\n                        .build()\n                },\n                context\n            )\n        )\n        spinner.adapter = adapter\n        for (i in 0 until spinner.count) {\n            assertIconVisibility(spinner, i, GONE, GONE)\n        }\n    }\n\n    @Test\n    fun audioStreams_noIcon() {\n        val adapter = StreamItemAdapter<AudioStream, Stream>(\n            StreamItemAdapter.StreamInfoWrapper(\n                (0 until 5).map {\n                    AudioStream.Builder()\n                        .setId(Stream.ID_UNKNOWN)\n                        .setContent(\"https://example.com/$it\", true)\n                        .setMediaFormat(MediaFormat.OPUS)\n                        .setAverageBitrate(192)\n                        .build()\n                },\n                context\n            )\n        )\n        spinner.adapter = adapter\n        for (i in 0 until spinner.count) {\n            assertIconVisibility(spinner, i, GONE, GONE)\n        }\n    }\n\n    @Test\n    fun retrieveMediaFormatFromFileTypeHeaders() {\n        val streams = getIncompleteAudioStreams(5)\n        val wrapper = StreamInfoWrapper(streams, context)\n        val retrieveMediaFormat = { stream: AudioStream, response: Response ->\n            StreamInfoWrapper.retrieveMediaFormatFromFileTypeHeaders(stream, wrapper, response)\n        }\n        val helper = AssertionHelper(streams, wrapper, retrieveMediaFormat)\n\n        helper.assertInvalidResponse(getResponse(mapOf(Pair(\"content-length\", \"mp3\"))), 0)\n        helper.assertInvalidResponse(getResponse(mapOf(Pair(\"file-type\", \"mp0\"))), 1)\n\n        helper.assertValidResponse(getResponse(mapOf(Pair(\"x-amz-meta-file-type\", \"aiff\"))), 2, MediaFormat.AIFF)\n        helper.assertValidResponse(getResponse(mapOf(Pair(\"file-type\", \"mp3\"))), 3, MediaFormat.MP3)\n    }\n\n    @Test\n    fun retrieveMediaFormatFromContentDispositionHeader() {\n        val streams = getIncompleteAudioStreams(11)\n        val wrapper = StreamInfoWrapper(streams, context)\n        val retrieveMediaFormat = { stream: AudioStream, response: Response ->\n            StreamInfoWrapper.retrieveMediaFormatFromContentDispositionHeader(stream, wrapper, response)\n        }\n        val helper = AssertionHelper(streams, wrapper, retrieveMediaFormat)\n\n        helper.assertInvalidResponse(getResponse(mapOf(Pair(\"content-length\", \"mp3\"))), 0)\n        helper.assertInvalidResponse(\n            getResponse(mapOf(Pair(\"Content-Disposition\", \"filename=\\\"train.png\\\"\"))),\n            1\n        )\n        helper.assertInvalidResponse(\n            getResponse(mapOf(Pair(\"Content-Disposition\", \"form-data; name=\\\"data.csv\\\"\"))),\n            2\n        )\n        helper.assertInvalidResponse(\n            getResponse(mapOf(Pair(\"Content-Disposition\", \"form-data; filename=\\\"data.csv\\\"\"))),\n            3\n        )\n        helper.assertInvalidResponse(\n            getResponse(mapOf(Pair(\"Content-Disposition\", \"form-data; name=\\\"fieldName\\\"; filename*=\\\"filename.jpg\\\"\"))),\n            4\n        )\n\n        helper.assertValidResponse(\n            getResponse(mapOf(Pair(\"Content-Disposition\", \"filename=\\\"train.ogg\\\"\"))),\n            5,\n            MediaFormat.OGG\n        )\n        helper.assertValidResponse(\n            getResponse(mapOf(Pair(\"Content-Disposition\", \"some-form-data; filename=\\\"audio.flac\\\"\"))),\n            6,\n            MediaFormat.FLAC\n        )\n        helper.assertValidResponse(\n            getResponse(mapOf(Pair(\"Content-Disposition\", \"form-data; name=\\\"audio.aiff\\\"; filename=\\\"audio.aiff\\\"\"))),\n            7,\n            MediaFormat.AIFF\n        )\n        helper.assertValidResponse(\n            getResponse(mapOf(Pair(\"Content-Disposition\", \"form-data; name=\\\"alien?\\\"; filename*=UTF-8''%CE%B1%CE%BB%CE%B9%CF%B5%CE%BD.m4a\"))),\n            8,\n            MediaFormat.M4A\n        )\n        helper.assertValidResponse(\n            getResponse(mapOf(Pair(\"Content-Disposition\", \"form-data; name=\\\"audio.mp3\\\"; filename=\\\"audio.opus\\\"; filename*=UTF-8''alien.opus\"))),\n            9,\n            MediaFormat.OPUS\n        )\n        helper.assertValidResponse(\n            getResponse(mapOf(Pair(\"Content-Disposition\", \"form-data; name=\\\"audio.mp3\\\"; filename=\\\"audio.opus\\\"; filename*=\\\"UTF-8''alien.opus\\\"\"))),\n            10,\n            MediaFormat.OPUS\n        )\n    }\n\n    @Test\n    fun retrieveMediaFormatFromContentTypeHeader() {\n        val streams = getIncompleteAudioStreams(12)\n        val wrapper = StreamInfoWrapper(streams, context)\n        val retrieveMediaFormat = { stream: AudioStream, response: Response ->\n            StreamInfoWrapper.retrieveMediaFormatFromContentTypeHeader(stream, wrapper, response)\n        }\n        val helper = AssertionHelper(streams, wrapper, retrieveMediaFormat)\n\n        helper.assertInvalidResponse(getResponse(mapOf(Pair(\"content-length\", \"984501\"))), 0)\n        helper.assertInvalidResponse(getResponse(mapOf(Pair(\"Content-Type\", \"audio/xyz\"))), 1)\n        helper.assertInvalidResponse(getResponse(mapOf(Pair(\"Content-Type\", \"mp3\"))), 2)\n        helper.assertInvalidResponse(getResponse(mapOf(Pair(\"Content-Type\", \"mp3\"))), 3)\n        helper.assertInvalidResponse(getResponse(mapOf(Pair(\"Content-Type\", \"audio/mpeg\"))), 4)\n        helper.assertInvalidResponse(getResponse(mapOf(Pair(\"Content-Type\", \"audio/aif\"))), 5)\n        helper.assertInvalidResponse(getResponse(mapOf(Pair(\"Content-Type\", \"whatever\"))), 6)\n        helper.assertInvalidResponse(getResponse(mapOf()), 7)\n\n        helper.assertValidResponse(\n            getResponse(mapOf(Pair(\"Content-Type\", \"audio/flac\"))),\n            8,\n            MediaFormat.FLAC\n        )\n        helper.assertValidResponse(\n            getResponse(mapOf(Pair(\"Content-Type\", \"audio/wav\"))),\n            9,\n            MediaFormat.WAV\n        )\n        helper.assertValidResponse(\n            getResponse(mapOf(Pair(\"Content-Type\", \"audio/opus\"))),\n            10,\n            MediaFormat.OPUS\n        )\n        helper.assertValidResponse(\n            getResponse(mapOf(Pair(\"Content-Type\", \"audio/aiff\"))),\n            11,\n            MediaFormat.AIFF\n        )\n    }\n\n    /**\n     * @return a list of video streams, in which their video only property mirrors the provided\n     * [videoOnly] vararg.\n     */\n    private fun getVideoStreams(vararg videoOnly: Boolean) = StreamInfoWrapper(\n        videoOnly.map {\n            VideoStream.Builder()\n                .setId(Stream.ID_UNKNOWN)\n                .setContent(\"https://example.com\", true)\n                .setMediaFormat(MediaFormat.MPEG_4)\n                .setResolution(\"720p\")\n                .setIsVideoOnly(it)\n                .build()\n        },\n        context\n    )\n\n    /**\n     * @return a list of audio streams, containing valid and null elements mirroring the provided\n     * [shouldBeValid] vararg.\n     */\n    private fun getAudioStreams(vararg shouldBeValid: Boolean) = getSecondaryStreamsFromList(\n        shouldBeValid.map {\n            if (it) {\n                AudioStream.Builder()\n                    .setId(Stream.ID_UNKNOWN)\n                    .setContent(\"https://example.com\", true)\n                    .setMediaFormat(MediaFormat.OPUS)\n                    .setAverageBitrate(192)\n                    .build()\n            } else {\n                null\n            }\n        }\n    )\n\n    private fun getIncompleteAudioStreams(size: Int): List<AudioStream> {\n        val list = ArrayList<AudioStream>(size)\n        for (i in 1..size) {\n            list.add(\n                AudioStream.Builder()\n                    .setId(Stream.ID_UNKNOWN)\n                    .setContent(\"https://example.com/$i\", true)\n                    .build()\n            )\n        }\n        return list\n    }\n\n    /**\n     * Checks whether the item at [position] in the [spinner] has the correct icon visibility when\n     * it is shown in normal mode (selected) and in dropdown mode (user is choosing one of a list).\n     */\n    private fun assertIconVisibility(\n        spinner: Spinner,\n        position: Int,\n        normalVisibility: Int,\n        dropDownVisibility: Int\n    ) {\n        spinner.setSelection(position)\n        spinner.adapter.getView(position, null, spinner).run {\n            Assert.assertEquals(\n                \"normal visibility (pos=[$position]) is not correct\",\n                findViewById<View>(R.id.wo_sound_icon).visibility,\n                normalVisibility\n            )\n        }\n        spinner.adapter.getDropDownView(position, null, spinner).run {\n            Assert.assertEquals(\n                \"drop down visibility (pos=[$position]) is not correct\",\n                findViewById<View>(R.id.wo_sound_icon).visibility,\n                dropDownVisibility\n            )\n        }\n    }\n\n    /**\n     * Helper function that builds a secondary stream list.\n     */\n    private fun <T : Stream> getSecondaryStreamsFromList(streams: List<T?>) = SparseArrayCompat<SecondaryStreamHelper<T>?>(streams.size).apply {\n        streams.forEachIndexed { index, stream ->\n            val secondaryStreamHelper: SecondaryStreamHelper<T>? = stream?.let {\n                SecondaryStreamHelper(\n                    StreamItemAdapter.StreamInfoWrapper(streams, context),\n                    it\n                )\n            }\n            put(index, secondaryStreamHelper)\n        }\n    }\n\n    private fun getResponse(headers: Map<String, String>): Response {\n        val listHeaders = HashMap<String, List<String>>()\n        headers.forEach { entry ->\n            listHeaders[entry.key] = listOf(entry.value)\n        }\n        return Response(200, null, listHeaders, \"\", \"\")\n    }\n\n    /**\n     * Helper class for assertion related to extractions of [MediaFormat]s.\n     */\n    class AssertionHelper<T : Stream>(\n        private val streams: List<T>,\n        private val wrapper: StreamInfoWrapper<T>,\n        private val retrieveMediaFormat: (stream: T, response: Response) -> Boolean\n    ) {\n\n        /**\n         * Assert that an invalid response does not result in wrongly extracted [MediaFormat].\n         */\n        fun assertInvalidResponse(\n            response: Response,\n            index: Int\n        ) {\n            assertFalse(\n                \"invalid header returns valid value\",\n                retrieveMediaFormat(streams[index], response)\n            )\n            assertNull(\"Media format extracted although stated otherwise\", wrapper.getFormat(index))\n        }\n\n        /**\n         * Assert that a valid response results in correctly extracted and handled [MediaFormat].\n         */\n        fun assertValidResponse(\n            response: Response,\n            index: Int,\n            format: MediaFormat\n        ) {\n            assertTrue(\n                \"header was not recognized\",\n                retrieveMediaFormat(streams[index], response)\n            )\n            assertEquals(\"Wrong media format extracted\", format, wrapper.getFormat(index))\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/debug/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <application\n        android:name=\".DebugApp\"\n        tools:replace=\"android:name\" />\n</manifest>"
  },
  {
    "path": "app/src/debug/java/org/schabi/newpipe/DebugApp.kt",
    "content": "package org.schabi.newpipe\n\nimport androidx.preference.PreferenceManager\nimport com.facebook.stetho.Stetho\nimport com.facebook.stetho.okhttp3.StethoInterceptor\nimport leakcanary.LeakCanary\nimport okhttp3.OkHttpClient\nimport org.schabi.newpipe.extractor.downloader.Downloader\n\nclass DebugApp : App() {\n    override fun onCreate() {\n        super.onCreate()\n        initStetho()\n\n        LeakCanary.config = LeakCanary.config.copy(\n            dumpHeap = PreferenceManager\n                .getDefaultSharedPreferences(this).getBoolean(\n                    getString(\n                        R.string.allow_heap_dumping_key\n                    ),\n                    false\n                )\n        )\n    }\n\n    override fun getDownloader(): Downloader {\n        val downloader = DownloaderImpl.init(\n            OkHttpClient.Builder()\n                .addNetworkInterceptor(StethoInterceptor())\n        )\n        setCookiesToDownloader(downloader)\n        return downloader\n    }\n\n    private fun initStetho() {\n        // Create an InitializerBuilder\n        val initializerBuilder = Stetho.newInitializerBuilder(this)\n\n        // Enable Chrome DevTools\n        initializerBuilder.enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this))\n\n        // Enable command line interface\n        initializerBuilder.enableDumpapp(\n            Stetho.defaultDumperPluginsProvider(applicationContext)\n        )\n\n        // Use the InitializerBuilder to generate an Initializer\n        val initializer = initializerBuilder.build()\n\n        // Initialize Stetho with the Initializer\n        Stetho.initialize(initializer)\n    }\n\n    override fun isDisposedRxExceptionsReported(): Boolean {\n        return PreferenceManager.getDefaultSharedPreferences(this)\n            .getBoolean(getString(R.string.allow_disposed_exceptions_key), false)\n    }\n}\n"
  },
  {
    "path": "app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsBVDLeakCanary.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.content.Intent;\n\nimport leakcanary.LeakCanary;\n\n/**\n * Build variant dependent (BVD) leak canary API implementation for the debug settings fragment.\n * This class is loaded via reflection by\n * {@link DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI}.\n */\n@SuppressWarnings(\"unused\") // Class is used but loaded via reflection\npublic class DebugSettingsBVDLeakCanary\n        implements DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI {\n\n    @Override\n    public Intent getNewLeakDisplayActivityIntent() {\n        return LeakCanary.INSTANCE.newLeakDisplayActivityIntent();\n    }\n}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:installLocation=\"auto\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\" />\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_DATA_SYNC\" />\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK\" />\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\"/>\n\n    <!-- We need to be able to open links in the browser on API 30+ -->\n    <queries>\n        <intent>\n            <action android:name=\"android.intent.action.VIEW\" />\n            <data android:scheme=\"http\" />\n        </intent>\n    </queries>\n\n    <uses-feature\n        android:name=\"android.hardware.touchscreen\"\n        android:required=\"false\" />\n    <uses-feature\n        android:name=\"android.software.leanback\"\n        android:required=\"false\" />\n\n    <application\n        android:name=\".App\"\n        android:allowBackup=\"true\"\n        android:banner=\"@mipmap/newpipe_tv_banner\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:logo=\"@mipmap/ic_launcher\"\n        android:resizeableActivity=\"true\"\n        android:theme=\"@style/OpeningTheme\"\n        tools:ignore=\"AllowBackup\">\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\"\n            android:label=\"@string/app_name\"\n            android:launchMode=\"singleTask\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n                <category android:name=\"android.intent.category.LEANBACK_LAUNCHER\" />\n            </intent-filter>\n        </activity>\n\n        <receiver\n            android:name=\"androidx.media.session.MediaButtonReceiver\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MEDIA_BUTTON\" />\n            </intent-filter>\n        </receiver>\n\n        <service\n            android:name=\"androidx.appcompat.app.AppLocalesMetadataHolderService\"\n            android:enabled=\"false\"\n            android:exported=\"false\">\n            <meta-data\n                android:name=\"autoStoreLocales\"\n                android:value=\"true\" />\n        </service>\n\n        <service\n            android:name=\".player.PlayerService\"\n            android:exported=\"true\"\n            android:foregroundServiceType=\"mediaPlayback\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MEDIA_BUTTON\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.media.browse.MediaBrowserService\"/>\n            </intent-filter>\n        </service>\n\n        <activity\n            android:name=\".player.PlayQueueActivity\"\n            android:exported=\"false\"\n            android:label=\"@string/title_activity_play_queue\"\n            android:launchMode=\"singleTask\" />\n\n        <activity\n            android:name=\".settings.SettingsActivity\"\n            android:exported=\"false\"\n            android:label=\"@string/settings\" />\n\n        <activity\n            android:name=\".about.AboutActivity\"\n            android:exported=\"false\"\n            android:label=\"@string/title_activity_about\" />\n\n        <service\n            android:name=\".local.feed.service.FeedLoadService\"\n            android:foregroundServiceType=\"dataSync\" />\n\n        <service\n            android:name=\"androidx.work.impl.foreground.SystemForegroundService\"\n            android:foregroundServiceType=\"dataSync\"\n            tools:node=\"merge\" />\n\n        <activity\n            android:name=\".PanicResponderActivity\"\n            android:exported=\"true\"\n            android:launchMode=\"singleInstance\"\n            android:noHistory=\"true\"\n            android:theme=\"@android:style/Theme.NoDisplay\">\n            <intent-filter>\n                <action android:name=\"info.guardianproject.panic.action.TRIGGER\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n\n        <activity\n            android:name=\".ExitActivity\"\n            android:exported=\"false\"\n            android:label=\"@string/general_error\"\n            android:theme=\"@android:style/Theme.NoDisplay\" />\n\n        <activity\n            android:name=\".error.ErrorActivity\"\n            android:exported=\"false\" />\n\n        <!-- giga get related -->\n        <activity\n            android:name=\".download.DownloadActivity\"\n            android:exported=\"false\"\n            android:label=\"@string/app_name\"\n            android:launchMode=\"singleTask\" />\n\n        <service android:name=\"us.shandian.giga.service.DownloadManagerService\"\n            android:foregroundServiceType=\"dataSync\" />\n\n        <activity\n            android:name=\".util.FilePickerActivityHelper\"\n            android:exported=\"true\"\n            android:label=\"@string/app_name\"\n            android:theme=\"@style/FilePickerThemeDark\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.GET_CONTENT\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n\n        <activity\n            android:name=\".error.ReCaptchaActivity\"\n            android:exported=\"false\"\n            android:label=\"@string/recaptcha\" />\n\n        <provider\n            android:name=\"androidx.core.content.FileProvider\"\n            android:authorities=\"${applicationId}.provider\"\n            android:exported=\"false\"\n            android:grantUriPermissions=\"true\">\n            <meta-data\n                android:name=\"android.support.FILE_PROVIDER_PATHS\"\n                android:resource=\"@xml/nnf_provider_paths\" />\n        </provider>\n\n        <activity\n            android:name=\".RouterActivity\"\n            android:excludeFromRecents=\"true\"\n            android:exported=\"true\"\n            android:label=\"@string/preferred_open_action_share_menu_title\"\n            android:taskAffinity=\"\"\n            android:theme=\"@style/RouterActivityThemeDark\">\n\n            <!-- Youtube filter -->\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"http\" />\n                <data android:scheme=\"https\" />\n                <data android:host=\"youtube.com\" />\n                <data android:host=\"m.youtube.com\" />\n                <data android:host=\"www.youtube.com\" />\n                <data android:host=\"music.youtube.com\" />\n                <!-- video prefix -->\n                <data android:pathPrefix=\"/v/\" />\n                <data android:pathPrefix=\"/embed/\" />\n                <data android:pathPrefix=\"/watch\" />\n                <data android:pathPrefix=\"/attribution_link\" />\n                <data android:pathPrefix=\"/shorts/\" />\n                <data android:pathPrefix=\"/live/\" />\n                <!-- channel prefix -->\n                <data android:pathPrefix=\"/channel/\" />\n                <data android:pathPrefix=\"/user/\" />\n                <data android:pathPrefix=\"/c/\" />\n                <data android:pathPrefix=\"/@\" />\n                <!-- playlist prefix -->\n                <data android:pathPrefix=\"/playlist\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"http\" />\n                <data android:scheme=\"https\" />\n                <data android:host=\"youtu.be\" />\n                <data android:pathPrefix=\"/\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"http\" />\n                <data android:scheme=\"https\" />\n                <data android:host=\"www.youtube-nocookie.com\" />\n                <data android:pathPrefix=\"/embed/\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"vnd.youtube\" />\n                <data android:scheme=\"vnd.youtube.launch\" />\n            </intent-filter>\n\n            <!-- Hooktube filter -->\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"http\" />\n                <data android:scheme=\"https\" />\n                <data android:host=\"hooktube.com\" />\n                <data android:host=\"*.hooktube.com\" />\n                <!-- video prefix -->\n                <data android:pathPrefix=\"/v/\" />\n                <data android:pathPrefix=\"/embed/\" />\n                <data android:pathPrefix=\"/watch\" />\n                <!-- channel prefix -->\n                <data android:pathPrefix=\"/channel/\" />\n                <data android:pathPrefix=\"/user/\" />\n            </intent-filter>\n\n            <!-- Invidious filter -->\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"http\" />\n                <data android:scheme=\"https\" />\n                <data android:host=\"tubus.eduvid.org\" />\n                <data android:host=\"invidio.us\" />\n                <data android:host=\"dev.invidio.us\" />\n                <data android:host=\"www.invidio.us\" />\n                <data android:host=\"redirect.invidious.io\" />\n                <data android:host=\"invidious.snopyta.org\" />\n                <data android:host=\"yewtu.be\" />\n                <data android:host=\"tube.connect.cafe\" />\n                <data android:host=\"invidious.kavin.rocks\" />\n                <data android:host=\"invidious-us.kavin.rocks\" />\n                <data android:host=\"piped.kavin.rocks\" />\n                <data android:host=\"invidious.site\" />\n                <data android:host=\"vid.mint.lgbt\" />\n                <data android:host=\"invidiou.site\" />\n                <data android:host=\"invidious.fdn.fr\" />\n                <data android:host=\"invidious.048596.xyz\" />\n                <data android:host=\"invidious.zee.li\" />\n                <data android:host=\"vid.puffyan.us\" />\n                <data android:host=\"ytprivate.com\" />\n                <data android:host=\"invidious.namazso.eu\" />\n                <data android:host=\"invidious.silkky.cloud\" />\n                <data android:host=\"invidious.exonip.de\" />\n                <data android:host=\"inv.riverside.rocks\" />\n                <data android:host=\"invidious.blamefran.net\" />\n                <data android:host=\"invidious.moomoo.me\" />\n                <data android:host=\"ytb.trom.tf\" />\n                <data android:host=\"yt.cyberhost.uk\" />\n                <data android:host=\"y.com.cm\" />\n                <data android:pathPrefix=\"/\" />\n            </intent-filter>\n\n            <!-- y2u.be filter -->\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"http\" />\n                <data android:scheme=\"https\" />\n                <data android:host=\"y2u.be\" />\n                <data android:pathPrefix=\"/\" />\n            </intent-filter>\n\n            <!-- Soundcloud filter -->\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"http\" />\n                <data android:scheme=\"https\" />\n                <data android:host=\"soundcloud.com\" />\n                <data android:host=\"m.soundcloud.com\" />\n                <data android:host=\"on.soundcloud.com\" />\n                <data android:host=\"www.soundcloud.com\" />\n                <data android:pathPrefix=\"/\" />\n            </intent-filter>\n\n            <!-- Share filter -->\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <data android:mimeType=\"text/plain\" />\n            </intent-filter>\n\n            <!-- media.ccc.de filter -->\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"http\" />\n                <data android:scheme=\"https\" />\n                <data android:host=\"media.ccc.de\" />\n                <!-- video prefix -->\n                <data android:pathPrefix=\"/v/\" />\n                <!-- channel prefix-->\n                <data android:pathPrefix=\"/c/\" />\n                <data android:pathPrefix=\"/b/\" />\n            </intent-filter>\n\n            <!-- PeerTube filter -->\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"http\" />\n                <data android:scheme=\"https\" />\n\n                <data android:host=\"eduvid.org\" />\n                <data android:host=\"framatube.org\" />\n                <data android:host=\"indymotion.fr\" />\n                <data android:host=\"media.assassinate-you.net\" />\n                <data android:host=\"media.fsfe.org\" />\n                <data android:host=\"peertube.co.uk\" />\n                <data android:host=\"peertube.cpy.re\" />\n                <data android:host=\"peertube.fr\" />\n                <data android:host=\"peertube.mastodon.host\" />\n                <data android:host=\"peertube.stream\" />\n                <data android:host=\"skeptikon.fr\" />\n                <data android:host=\"tilvids.com\" />\n                <data android:host=\"video.lqdn.fr\" />\n                <data android:host=\"video.ploud.fr\" />\n                <data android:host=\"subscribeto.me\" />\n\n                <data android:pathPrefix=\"/videos/\" /> <!-- it contains playlists -->\n                <data android:pathPrefix=\"/w/\" /> <!-- short video URLs -->\n                <data android:pathPrefix=\"/w/p/\" /> <!-- short playlist URLs -->\n                <data android:pathPrefix=\"/accounts/\" />\n                <data android:pathPrefix=\"/a/\" /> <!-- short account URLs -->\n                <data android:pathPrefix=\"/video-channels/\" />\n                <data android:pathPrefix=\"/c/\" /> <!-- short video-channels URLs -->\n            </intent-filter>\n\n            <!-- Bandcamp filter for tracks, albums and playlists -->\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"http\" />\n                <data android:scheme=\"https\" />\n                <data android:host=\"*.bandcamp.com\" />\n            </intent-filter>\n\n            <!-- Bandcamp filter for radio -->\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <action android:name=\"android.media.action.MEDIA_PLAY_FROM_SEARCH\" />\n                <action android:name=\"android.nfc.action.NDEF_DISCOVERED\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data android:scheme=\"http\" />\n                <data android:scheme=\"https\" />\n                <data android:sspPattern=\"bandcamp.com/?show=*\" />\n            </intent-filter>\n\n        </activity>\n        <service\n            android:name=\".RouterActivity$FetcherService\"\n            android:foregroundServiceType=\"dataSync\"\n            android:exported=\"false\" />\n\n        <!-- opting out of sending metrics to Google in Android System WebView -->\n        <meta-data\n            android:name=\"android.webkit.WebView.MetricsOptOut\"\n            android:value=\"true\" />\n        <!-- see https://github.com/TeamNewPipe/NewPipe/issues/3947 -->\n        <!-- Version < 3.0. DeX Mode and Screen Mirroring support -->\n        <meta-data\n            android:name=\"com.samsung.android.keepalive.density\"\n            android:value=\"true\" />\n        <!-- Version >= 3.0. DeX Dual Mode support -->\n        <meta-data\n            android:name=\"com.samsung.android.multidisplay.keep_process_alive\"\n            android:value=\"true\" />\n        <!-- Android Auto -->\n        <meta-data android:name=\"com.google.android.gms.car.application\"\n            android:resource=\"@xml/automotive_app_desc\" />\n        <meta-data android:name=\"com.google.android.gms.car.notification.SmallIcon\"\n            android:resource=\"@mipmap/ic_launcher\" />\n    </application>\n</manifest>\n"
  },
  {
    "path": "app/src/main/assets/apache2.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <title>Apache License - Version 2.0, January 2004</title>\n</head>\n<body>\n<p>Apache License<br>Version 2.0, January 2004<br>\n    <a href=\"http://www.apache.org/licenses/\">http://www.apache.org/licenses/</a> </p>\n<p>TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION</p>\n<p><strong><a name=\"definitions\">1. Definitions</a></strong>.</p>\n<p>\"License\" shall mean the terms and conditions for use, reproduction, and\n    distribution as defined by Sections 1 through 9 of this document.</p>\n<p>\"Licensor\" shall mean the copyright owner or entity authorized by the\n    copyright owner that is granting the License.</p>\n<p>\"Legal Entity\" shall mean the union of the acting entity and all other\n    entities that control, are controlled by, or are under common control with\n    that entity. For the purposes of this definition, \"control\" means (i) the\n    power, direct or indirect, to cause the direction or management of such\n    entity, whether by contract or otherwise, or (ii) ownership of fifty\n    percent (50%) or more of the outstanding shares, or (iii) beneficial\n    ownership of such entity.</p>\n<p>\"You\" (or \"Your\") shall mean an individual or Legal Entity exercising\n    permissions granted by this License.</p>\n<p>\"Source\" form shall mean the preferred form for making modifications,\n    including but not limited to software source code, documentation source,\n    and configuration files.</p>\n<p>\"Object\" form shall mean any form resulting from mechanical transformation\n    or translation of a Source form, including but not limited to compiled\n    object code, generated documentation, and conversions to other media types.</p>\n<p>\"Work\" shall mean the work of authorship, whether in Source or Object form,\n    made available under the License, as indicated by a copyright notice that\n    is included in or attached to the work (an example is provided in the\n    Appendix below).</p>\n<p>\"Derivative Works\" shall mean any work, whether in Source or Object form,\n    that is based on (or derived from) the Work and for which the editorial\n    revisions, annotations, elaborations, or other modifications represent, as\n    a whole, an original work of authorship. For the purposes of this License,\n    Derivative Works shall not include works that remain separable from, or\n    merely link (or bind by name) to the interfaces of, the Work and Derivative\n    Works thereof.</p>\n<p>\"Contribution\" shall mean any work of authorship, including the original\n    version of the Work and any modifications or additions to that Work or\n    Derivative Works thereof, that is intentionally submitted to Licensor for\n    inclusion in the Work by the copyright owner or by an individual or Legal\n    Entity authorized to submit on behalf of the copyright owner. For the\n    purposes of this definition, \"submitted\" means any form of electronic,\n    verbal, or written communication sent to the Licensor or its\n    representatives, including but not limited to communication on electronic\n    mailing lists, source code control systems, and issue tracking systems that\n    are managed by, or on behalf of, the Licensor for the purpose of discussing\n    and improving the Work, but excluding communication that is conspicuously\n    marked or otherwise designated in writing by the copyright owner as \"Not a\n    Contribution.\"</p>\n<p>\"Contributor\" shall mean Licensor and any individual or Legal Entity on\n    behalf of whom a Contribution has been received by Licensor and\n    subsequently incorporated within the Work.</p>\n<p><strong><a name=\"copyright\">2. Grant of Copyright License</a></strong>. Subject to the\n    terms and conditions of this License, each Contributor hereby grants to You\n    a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n    copyright license to reproduce, prepare Derivative Works of, publicly\n    display, publicly perform, sublicense, and distribute the Work and such\n    Derivative Works in Source or Object form.</p>\n<p><strong><a name=\"patent\">3. Grant of Patent License</a></strong>. Subject to the terms\n    and conditions of this License, each Contributor hereby grants to You a\n    perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n    (except as stated in this section) patent license to make, have made, use,\n    offer to sell, sell, import, and otherwise transfer the Work, where such\n    license applies only to those patent claims licensable by such Contributor\n    that are necessarily infringed by their Contribution(s) alone or by\n    combination of their Contribution(s) with the Work to which such\n    Contribution(s) was submitted. If You institute patent litigation against\n    any entity (including a cross-claim or counterclaim in a lawsuit) alleging\n    that the Work or a Contribution incorporated within the Work constitutes\n    direct or contributory patent infringement, then any patent licenses\n    granted to You under this License for that Work shall terminate as of the\n    date such litigation is filed.</p>\n<p><strong><a name=\"redistribution\">4. Redistribution</a></strong>. You may reproduce and\n    distribute copies of the Work or Derivative Works thereof in any medium,\n    with or without modifications, and in Source or Object form, provided that\n    You meet the following conditions:</p>\n<ol style=\"list-style: lower-latin;\">\n    <li>You must give any other recipients of the Work or Derivative Works a\n        copy of this License; and</li>\n\n    <li>You must cause any modified files to carry prominent notices stating\n        that You changed the files; and</li>\n\n    <li>You must retain, in the Source form of any Derivative Works that You\n        distribute, all copyright, patent, trademark, and attribution notices from\n        the Source form of the Work, excluding those notices that do not pertain to\n        any part of the Derivative Works; and</li>\n\n    <li>If the Work includes a \"NOTICE\" text file as part of its distribution,\n        then any Derivative Works that You distribute must include a readable copy\n        of the attribution notices contained within such NOTICE file, excluding\n        those notices that do not pertain to any part of the Derivative Works, in\n        at least one of the following places: within a NOTICE text file distributed\n        as part of the Derivative Works; within the Source form or documentation,\n        if provided along with the Derivative Works; or, within a display generated\n        by the Derivative Works, if and wherever such third-party notices normally\n        appear. The contents of the NOTICE file are for informational purposes only\n        and do not modify the License. You may add Your own attribution notices\n        within Derivative Works that You distribute, alongside or as an addendum to\n        the NOTICE text from the Work, provided that such additional attribution\n        notices cannot be construed as modifying the License.\n        <br/>\n        <br/>\n        You may add Your own copyright statement to Your modifications and may\n        provide additional or different license terms and conditions for use,\n        reproduction, or distribution of Your modifications, or for any such\n        Derivative Works as a whole, provided Your use, reproduction, and\n        distribution of the Work otherwise complies with the conditions stated in\n        this License.\n    </li>\n\n</ol>\n\n<p><strong><a name=\"contributions\">5. Submission of Contributions</a></strong>. Unless You\n    explicitly state otherwise, any Contribution intentionally submitted for\n    inclusion in the Work by You to the Licensor shall be under the terms and\n    conditions of this License, without any additional terms or conditions.\n    Notwithstanding the above, nothing herein shall supersede or modify the\n    terms of any separate license agreement you may have executed with Licensor\n    regarding such Contributions.</p>\n<p><strong><a name=\"trademarks\">6. Trademarks</a></strong>. This License does not grant\n    permission to use the trade names, trademarks, service marks, or product\n    names of the Licensor, except as required for reasonable and customary use\n    in describing the origin of the Work and reproducing the content of the\n    NOTICE file.</p>\n<p><strong><a name=\"no-warranty\">7. Disclaimer of Warranty</a></strong>. Unless required by\n    applicable law or agreed to in writing, Licensor provides the Work (and\n    each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT\n    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including,\n    without limitation, any warranties or conditions of TITLE,\n    NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You\n    are solely responsible for determining the appropriateness of using or\n    redistributing the Work and assume any risks associated with Your exercise\n    of permissions under this License.</p>\n<p><strong><a name=\"no-liability\">8. Limitation of Liability</a></strong>. In no event and\n    under no legal theory, whether in tort (including negligence), contract, or\n    otherwise, unless required by applicable law (such as deliberate and\n    grossly negligent acts) or agreed to in writing, shall any Contributor be\n    liable to You for damages, including any direct, indirect, special,\n    incidental, or consequential damages of any character arising as a result\n    of this License or out of the use or inability to use the Work (including\n    but not limited to damages for loss of goodwill, work stoppage, computer\n    failure or malfunction, or any and all other commercial damages or losses),\n    even if such Contributor has been advised of the possibility of such\n    damages.</p>\n<p><strong><a name=\"additional\">9. Accepting Warranty or Additional Liability</a></strong>.\n    While redistributing the Work or Derivative Works thereof, You may choose\n    to offer, and charge a fee for, acceptance of support, warranty, indemnity,\n    or other liability obligations and/or rights consistent with this License.\n    However, in accepting such obligations, You may act only on Your own behalf\n    and on Your sole responsibility, not on behalf of any other Contributor,\n    and only if You agree to indemnify, defend, and hold each Contributor\n    harmless for any liability incurred by, or claims asserted against, such\n    Contributor by reason of your accepting any such warranty or additional\n    liability.</p>\n</body>\n</html>"
  },
  {
    "path": "app/src/main/assets/epl1.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n        \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<!-- saved from url=(0050)https://www.eclipse.org/org/documents/epl-v10.html -->\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n    <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\">\n\n    <title>Eclipse Public License - Version 1.0</title>\n\n</head>\n\n<body cz-shortcut-listen=\"true\" lang=\"EN-US\">\n\n<h2>Eclipse Public License - v 1.0</h2>\n\n<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n    PUBLIC LICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR\n    DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS\n    AGREEMENT.</p>\n\n<p><b>1. DEFINITIONS</b></p>\n\n<p>\"Contribution\" means:</p>\n\n<p class=\"list\">a) in the case of the initial Contributor, the initial\n    code and documentation distributed under this Agreement, and</p>\n<p class=\"list\">b) in the case of each subsequent Contributor:</p>\n<p class=\"list\">i) changes to the Program, and</p>\n<p class=\"list\">ii) additions to the Program;</p>\n<p class=\"list\">where such changes and/or additions to the Program\n    originate from and are distributed by that particular Contributor. A\n    Contribution 'originates' from a Contributor if it was added to the\n    Program by such Contributor itself or anyone acting on such\n    Contributor's behalf. Contributions do not include additions to the\n    Program which: (i) are separate modules of software distributed in\n    conjunction with the Program under their own license agreement, and (ii)\n    are not derivative works of the Program.</p>\n\n<p>\"Contributor\" means any person or entity that distributes\n    the Program.</p>\n\n<p>\"Licensed Patents\" mean patent claims licensable by a\n    Contributor which are necessarily infringed by the use or sale of its\n    Contribution alone or when combined with the Program.</p>\n\n<p>\"Program\" means the Contributions distributed in accordance\n    with this Agreement.</p>\n\n<p>\"Recipient\" means anyone who receives the Program under\n    this Agreement, including all Contributors.</p>\n\n<p><b>2. GRANT OF RIGHTS</b></p>\n\n<p class=\"list\">a) Subject to the terms of this Agreement, each\n    Contributor hereby grants Recipient a non-exclusive, worldwide,\n    royalty-free copyright license to reproduce, prepare derivative works\n    of, publicly display, publicly perform, distribute and sublicense the\n    Contribution of such Contributor, if any, and such derivative works, in\n    source code and object code form.</p>\n\n<p class=\"list\">b) Subject to the terms of this Agreement, each\n    Contributor hereby grants Recipient a non-exclusive, worldwide,\n    royalty-free patent license under Licensed Patents to make, use, sell,\n    offer to sell, import and otherwise transfer the Contribution of such\n    Contributor, if any, in source code and object code form. This patent\n    license shall apply to the combination of the Contribution and the\n    Program if, at the time the Contribution is added by the Contributor,\n    such addition of the Contribution causes such combination to be covered\n    by the Licensed Patents. The patent license shall not apply to any other\n    combinations which include the Contribution. No hardware per se is\n    licensed hereunder.</p>\n\n<p class=\"list\">c) Recipient understands that although each Contributor\n    grants the licenses to its Contributions set forth herein, no assurances\n    are provided by any Contributor that the Program does not infringe the\n    patent or other intellectual property rights of any other entity. Each\n    Contributor disclaims any liability to Recipient for claims brought by\n    any other entity based on infringement of intellectual property rights\n    or otherwise. As a condition to exercising the rights and licenses\n    granted hereunder, each Recipient hereby assumes sole responsibility to\n    secure any other intellectual property rights needed, if any. For\n    example, if a third party patent license is required to allow Recipient\n    to distribute the Program, it is Recipient's responsibility to acquire\n    that license before distributing the Program.</p>\n\n<p class=\"list\">d) Each Contributor represents that to its knowledge it\n    has sufficient copyright rights in its Contribution, if any, to grant\n    the copyright license set forth in this Agreement.</p>\n\n<p><b>3. REQUIREMENTS</b></p>\n\n<p>A Contributor may choose to distribute the Program in object code\n    form under its own license agreement, provided that:</p>\n\n<p class=\"list\">a) it complies with the terms and conditions of this\n    Agreement; and</p>\n\n<p class=\"list\">b) its license agreement:</p>\n\n<p class=\"list\">i) effectively disclaims on behalf of all Contributors\n    all warranties and conditions, express and implied, including warranties\n    or conditions of title and non-infringement, and implied warranties or\n    conditions of merchantability and fitness for a particular purpose;</p>\n\n<p class=\"list\">ii) effectively excludes on behalf of all Contributors\n    all liability for damages, including direct, indirect, special,\n    incidental and consequential damages, such as lost profits;</p>\n\n<p class=\"list\">iii) states that any provisions which differ from this\n    Agreement are offered by that Contributor alone and not by any other\n    party; and</p>\n\n<p class=\"list\">iv) states that source code for the Program is available\n    from such Contributor, and informs licensees how to obtain it in a\n    reasonable manner on or through a medium customarily used for software\n    exchange.</p>\n\n<p>When the Program is made available in source code form:</p>\n\n<p class=\"list\">a) it must be made available under this Agreement; and</p>\n\n<p class=\"list\">b) a copy of this Agreement must be included with each\n    copy of the Program.</p>\n\n<p>Contributors may not remove or alter any copyright notices contained\n    within the Program.</p>\n\n<p>Each Contributor must identify itself as the originator of its\n    Contribution, if any, in a manner that reasonably allows subsequent\n    Recipients to identify the originator of the Contribution.</p>\n\n<p><b>4. COMMERCIAL DISTRIBUTION</b></p>\n\n<p>Commercial distributors of software may accept certain\n    responsibilities with respect to end users, business partners and the\n    like. While this license is intended to facilitate the commercial use of\n    the Program, the Contributor who includes the Program in a commercial\n    product offering should do so in a manner which does not create\n    potential liability for other Contributors. Therefore, if a Contributor\n    includes the Program in a commercial product offering, such Contributor\n    (\"Commercial Contributor\") hereby agrees to defend and\n    indemnify every other Contributor (\"Indemnified Contributor\")\n    against any losses, damages and costs (collectively \"Losses\")\n    arising from claims, lawsuits and other legal actions brought by a third\n    party against the Indemnified Contributor to the extent caused by the\n    acts or omissions of such Commercial Contributor in connection with its\n    distribution of the Program in a commercial product offering. The\n    obligations in this section do not apply to any claims or Losses\n    relating to any actual or alleged intellectual property infringement. In\n    order to qualify, an Indemnified Contributor must: a) promptly notify\n    the Commercial Contributor in writing of such claim, and b) allow the\n    Commercial Contributor to control, and cooperate with the Commercial\n    Contributor in, the defense and any related settlement negotiations. The\n    Indemnified Contributor may participate in any such claim at its own\n    expense.</p>\n\n<p>For example, a Contributor might include the Program in a commercial\n    product offering, Product X. That Contributor is then a Commercial\n    Contributor. If that Commercial Contributor then makes performance\n    claims, or offers warranties related to Product X, those performance\n    claims and warranties are such Commercial Contributor's responsibility\n    alone. Under this section, the Commercial Contributor would have to\n    defend claims against the other Contributors related to those\n    performance claims and warranties, and if a court requires any other\n    Contributor to pay any damages as a result, the Commercial Contributor\n    must pay those damages.</p>\n\n<p><b>5. NO WARRANTY</b></p>\n\n<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS\n    PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS\n    OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,\n    ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY\n    OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely\n    responsible for determining the appropriateness of using and\n    distributing the Program and assumes all risks associated with its\n    exercise of rights under this Agreement , including but not limited to\n    the risks and costs of program errors, compliance with applicable laws,\n    damage to or loss of data, programs or equipment, and unavailability or\n    interruption of operations.</p>\n\n<p><b>6. DISCLAIMER OF LIABILITY</b></p>\n\n<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT\n    NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,\n    INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING\n    WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF\n    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR\n    DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED\n    HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>\n\n<p><b>7. GENERAL</b></p>\n\n<p>If any provision of this Agreement is invalid or unenforceable under\n    applicable law, it shall not affect the validity or enforceability of\n    the remainder of the terms of this Agreement, and without further action\n    by the parties hereto, such provision shall be reformed to the minimum\n    extent necessary to make such provision valid and enforceable.</p>\n\n<p>If Recipient institutes patent litigation against any entity\n    (including a cross-claim or counterclaim in a lawsuit) alleging that the\n    Program itself (excluding combinations of the Program with other\n    software or hardware) infringes such Recipient's patent(s), then such\n    Recipient's rights granted under Section 2(b) shall terminate as of the\n    date such litigation is filed.</p>\n\n<p>All Recipient's rights under this Agreement shall terminate if it\n    fails to comply with any of the material terms or conditions of this\n    Agreement and does not cure such failure in a reasonable period of time\n    after becoming aware of such noncompliance. If all Recipient's rights\n    under this Agreement terminate, Recipient agrees to cease use and\n    distribution of the Program as soon as reasonably practicable. However,\n    Recipient's obligations under this Agreement and any licenses granted by\n    Recipient relating to the Program shall continue and survive.</p>\n\n<p>Everyone is permitted to copy and distribute copies of this\n    Agreement, but in order to avoid inconsistency the Agreement is\n    copyrighted and may only be modified in the following manner. The\n    Agreement Steward reserves the right to publish new versions (including\n    revisions) of this Agreement from time to time. No one other than the\n    Agreement Steward has the right to modify this Agreement. The Eclipse\n    Foundation is the initial Agreement Steward. The Eclipse Foundation may\n    assign the responsibility to serve as the Agreement Steward to a\n    suitable separate entity. Each new version of the Agreement will be\n    given a distinguishing version number. The Program (including\n    Contributions) may always be distributed subject to the version of the\n    Agreement under which it was received. In addition, after a new version\n    of the Agreement is published, Contributor may elect to distribute the\n    Program (including its Contributions) under the new version. Except as\n    expressly stated in Sections 2(a) and 2(b) above, Recipient receives no\n    rights or licenses to the intellectual property of any Contributor under\n    this Agreement, whether expressly, by implication, estoppel or\n    otherwise. All rights in the Program not expressly granted under this\n    Agreement are reserved.</p>\n\n<p>This Agreement is governed by the laws of the State of New York and\n    the intellectual property laws of the United States of America. No party\n    to this Agreement will bring a legal action under this Agreement more\n    than one year after the cause of action arose. Each party waives its\n    rights to a jury trial in any resulting litigation.</p>\n\n\n</body>\n</html>"
  },
  {
    "path": "app/src/main/assets/gpl_3.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n <title>GNU General Public License v3.0 - GNU Project - Free Software Foundation (FSF)</title>\n <link rel=\"alternate\" type=\"application/rdf+xml\"\n       href=\"http://www.gnu.org/licenses/gpl-3.0.rdf\" /> \n</head>\n<body>\n<h3 style=\"text-align: center;\">GNU GENERAL PUBLIC LICENSE</h3>\n<p style=\"text-align: center;\">Version 3, 29 June 2007</p>\n\n<p>Copyright &copy; 2007 Free Software Foundation, Inc.\n &lt;<a href=\"http://fsf.org/\">http://fsf.org/</a>&gt;</p><p>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.</p>\n\n<h3><a name=\"preamble\"></a>Preamble</h3>\n\n<p>The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.</p>\n\n<p>The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.</p>\n\n<p>When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.</p>\n\n<p>To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.</p>\n\n<p>For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.</p>\n\n<p>Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.</p>\n\n<p>For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.</p>\n\n<p>Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.</p>\n\n<p>Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.</p>\n\n<p>The precise terms and conditions for copying, distribution and\nmodification follow.</p>\n\n<h3><a name=\"terms\"></a>TERMS AND CONDITIONS</h3>\n\n<h4><a name=\"section0\"></a>0. Definitions.</h4>\n\n<p>&ldquo;This License&rdquo; refers to version 3 of the GNU General Public License.</p>\n\n<p>&ldquo;Copyright&rdquo; also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.</p>\n \n<p>&ldquo;The Program&rdquo; refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as &ldquo;you&rdquo;.  &ldquo;Licensees&rdquo; and\n&ldquo;recipients&rdquo; may be individuals or organizations.</p>\n\n<p>To &ldquo;modify&rdquo; a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a &ldquo;modified version&rdquo; of the\nearlier work or a work &ldquo;based on&rdquo; the earlier work.</p>\n\n<p>A &ldquo;covered work&rdquo; means either the unmodified Program or a work based\non the Program.</p>\n\n<p>To &ldquo;propagate&rdquo; a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.</p>\n\n<p>To &ldquo;convey&rdquo; a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.</p>\n\n<p>An interactive user interface displays &ldquo;Appropriate Legal Notices&rdquo;\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.</p>\n\n<h4><a name=\"section1\"></a>1. Source Code.</h4>\n\n<p>The &ldquo;source code&rdquo; for a work means the preferred form of the work\nfor making modifications to it.  &ldquo;Object code&rdquo; means any non-source\nform of a work.</p>\n\n<p>A &ldquo;Standard Interface&rdquo; means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.</p>\n\n<p>The &ldquo;System Libraries&rdquo; of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n&ldquo;Major Component&rdquo;, in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.</p>\n\n<p>The &ldquo;Corresponding Source&rdquo; for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.</p>\n\n<p>The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.</p>\n\n<p>The Corresponding Source for a work in source code form is that\nsame work.</p>\n\n<h4><a name=\"section2\"></a>2. Basic Permissions.</h4>\n\n<p>All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.</p>\n\n<p>You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.</p>\n\n<p>Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.</p>\n\n<h4><a name=\"section3\"></a>3. Protecting Users' Legal Rights From Anti-Circumvention Law.</h4>\n\n<p>No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.</p>\n\n<p>When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.</p>\n\n<h4><a name=\"section4\"></a>4. Conveying Verbatim Copies.</h4>\n\n<p>You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.</p>\n\n<p>You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.</p>\n\n<h4><a name=\"section5\"></a>5. Conveying Modified Source Versions.</h4>\n\n<p>You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:</p>\n\n<ul>\n<li>a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.</li>\n\n<li>b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    &ldquo;keep intact all notices&rdquo;.</li>\n\n<li>c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.</li>\n\n<li>d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.</li>\n</ul>\n\n<p>A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n&ldquo;aggregate&rdquo; if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.</p>\n\n<h4><a name=\"section6\"></a>6. Conveying Non-Source Forms.</h4>\n\n<p>You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:</p>\n\n<ul>\n<li>a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.</li>\n\n<li>b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.</li>\n\n<li>c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.</li>\n\n<li>d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.</li>\n\n<li>e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.</li>\n</ul>\n\n<p>A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.</p>\n\n<p>A &ldquo;User Product&rdquo; is either (1) a &ldquo;consumer product&rdquo;, which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, &ldquo;normally used&rdquo; refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.</p>\n\n<p>&ldquo;Installation Information&rdquo; for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.</p>\n\n<p>If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).</p>\n\n<p>The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.</p>\n\n<p>Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.</p>\n\n<h4><a name=\"section7\"></a>7. Additional Terms.</h4>\n\n<p>&ldquo;Additional permissions&rdquo; are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.</p>\n\n<p>When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.</p>\n\n<p>Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:</p>\n\n<ul>\n<li>a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or</li>\n\n<li>b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or</li>\n\n<li>c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or</li>\n\n<li>d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or</li>\n\n<li>e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or</li>\n\n<li>f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.</li>\n</ul>\n\n<p>All other non-permissive additional terms are considered &ldquo;further\nrestrictions&rdquo; within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.</p>\n\n<p>If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.</p>\n\n<p>Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.</p>\n\n<h4><a name=\"section8\"></a>8. Termination.</h4>\n\n<p>You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).</p>\n\n<p>However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.</p>\n\n<p>Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.</p>\n\n<p>Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.</p>\n\n<h4><a name=\"section9\"></a>9. Acceptance Not Required for Having Copies.</h4>\n\n<p>You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.</p>\n\n<h4><a name=\"section10\"></a>10. Automatic Licensing of Downstream Recipients.</h4>\n\n<p>Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.</p>\n\n<p>An &ldquo;entity transaction&rdquo; is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.</p>\n\n<p>You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.</p>\n\n<h4><a name=\"section11\"></a>11. Patents.</h4>\n\n<p>A &ldquo;contributor&rdquo; is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's &ldquo;contributor version&rdquo;.</p>\n\n<p>A contributor's &ldquo;essential patent claims&rdquo; are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, &ldquo;control&rdquo; includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.</p>\n\n<p>Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.</p>\n\n<p>In the following three paragraphs, a &ldquo;patent license&rdquo; is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To &ldquo;grant&rdquo; such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.</p>\n\n<p>If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  &ldquo;Knowingly relying&rdquo; means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.</p>\n  \n<p>If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.</p>\n\n<p>A patent license is &ldquo;discriminatory&rdquo; if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.</p>\n\n<p>Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.</p>\n\n<h4><a name=\"section12\"></a>12. No Surrender of Others' Freedom.</h4>\n\n<p>If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.</p>\n\n<h4><a name=\"section13\"></a>13. Use with the GNU Affero General Public License.</h4>\n\n<p>Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.</p>\n\n<h4><a name=\"section14\"></a>14. Revised Versions of this License.</h4>\n\n<p>The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.</p>\n\n<p>Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License &ldquo;or any later version&rdquo; applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.</p>\n\n<p>If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.</p>\n\n<p>Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.</p>\n\n<h4><a name=\"section15\"></a>15. Disclaimer of Warranty.</h4>\n\n<p>THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM &ldquo;AS IS&rdquo; WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.</p>\n\n<h4><a name=\"section16\"></a>16. Limitation of Liability.</h4>\n\n<p>IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.</p>\n\n<h4><a name=\"section17\"></a>17. Interpretation of Sections 15 and 16.</h4>\n\n<p>If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.</p>\n\n</body></html>\n"
  },
  {
    "path": "app/src/main/assets/mit.html",
    "content": "<html>\n<head></head>\n<body>\n<p>Copyright (c) &lt;year&gt; &lt;copyright holders&gt;</p>\n\n<p>Permission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:</p>\n\n<p>\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.</p>\n<p>\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.<br />\nNOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>\n</body>\n</html>\n"
  },
  {
    "path": "app/src/main/assets/mpl2.html",
    "content": "<!DOCTYPE html>\n<!-- saved from url=(0038)https://www.mozilla.org/en-US/MPL/2.0/ -->\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <title>Mozilla Public License, version 2.0</title>\n</head>\n<body>\n<h1 id=\"mozilla-public-license-version-2.0\">Mozilla Public License<br>Version 2.0</h1>\n<h2 id=\"definitions\">1. Definitions</h2>\n<dl>\n    <dt>1.1. “Contributor”</dt>\n    <dd><p>means each individual or legal entity that creates, contributes to the creation of, or\n        owns Covered Software.</p>\n    </dd>\n    <dt>1.2. “Contributor Version”</dt>\n    <dd><p>means the combination of the Contributions of others (if any) used by a Contributor and\n        that particular Contributor’s Contribution.</p>\n    </dd>\n    <dt>1.3. “Contribution”</dt>\n    <dd><p>means Covered Software of a particular Contributor.</p>\n    </dd>\n    <dt>1.4. “Covered Software”</dt>\n    <dd><p>means Source Code Form to which the initial Contributor has attached the notice in\n        Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source\n        Code Form, in each case including portions thereof.</p>\n    </dd>\n    <dt>1.5. “Incompatible With Secondary Licenses”</dt>\n    <dd><p>means</p>\n        <ol type=\"a\">\n            <li><p>that the initial Contributor has attached the notice described in Exhibit B to\n                the Covered Software; or</p></li>\n            <li><p>that the Covered Software was made available under the terms of version 1.1 or\n                earlier of the License, but not also under the terms of a Secondary License.</p>\n            </li>\n        </ol>\n    </dd>\n    <dt>1.6. “Executable Form”</dt>\n    <dd><p>means any form of the work other than Source Code Form.</p>\n    </dd>\n    <dt>1.7. “Larger Work”</dt>\n    <dd><p>means a work that combines Covered Software with other material, in a separate file or\n        files, that is not Covered Software.</p>\n    </dd>\n    <dt>1.8. “License”</dt>\n    <dd><p>means this document.</p>\n    </dd>\n    <dt>1.9. “Licensable”</dt>\n    <dd><p>means having the right to grant, to the maximum extent possible, whether at the time of\n        the initial grant or subsequently, any and all of the rights conveyed by this License.</p>\n    </dd>\n    <dt>1.10. “Modifications”</dt>\n    <dd><p>means any of the following:</p>\n        <ol type=\"a\">\n            <li><p>any file in Source Code Form that results from an addition to, deletion from, or\n                modification of the contents of Covered Software; or</p></li>\n            <li><p>any new file in Source Code Form that contains any Covered Software.</p></li>\n        </ol>\n    </dd>\n    <dt>1.11. “Patent Claims” of a Contributor</dt>\n    <dd><p>means any patent claim(s), including without limitation, method, process, and apparatus\n        claims, in any patent Licensable by such Contributor that would be infringed, but for the\n        grant of the License, by the making, using, selling, offering for sale, having made, import,\n        or transfer of either its Contributions or its Contributor Version.</p>\n    </dd>\n    <dt>1.12. “Secondary License”</dt>\n    <dd><p>means either the GNU General Public License, Version 2.0, the GNU Lesser General Public\n        License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later\n        versions of those licenses.</p>\n    </dd>\n    <dt>1.13. “Source Code Form”</dt>\n    <dd><p>means the form of the work preferred for making modifications.</p>\n    </dd>\n    <dt>1.14. “You” (or “Your”)</dt>\n    <dd><p>means an individual or a legal entity exercising rights under this License. For legal\n        entities, “You” includes any entity that controls, is controlled by, or is under common\n        control with You. For purposes of this definition, “control” means (a) the power, direct or\n        indirect, to cause the direction or management of such entity, whether by contract or\n        otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or\n        beneficial ownership of such entity.</p>\n    </dd>\n</dl>\n<h2 id=\"license-grants-and-conditions\">2. License Grants and Conditions</h2>\n<h3 id=\"grants\">2.1. Grants</h3>\n<p>Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license:</p>\n<ol type=\"a\">\n    <li><p>under intellectual property rights (other than patent or trademark) Licensable by such\n        Contributor to use, reproduce, make available, modify, display, perform, distribute, and\n        otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or\n        as part of a Larger Work; and</p></li>\n    <li><p>under Patent Claims of such Contributor to make, use, sell, offer for sale, have made,\n        import, and otherwise transfer either its Contributions or its Contributor Version.</p></li>\n</ol>\n<h3 id=\"effective-date\">2.2. Effective Date</h3>\n<p>The licenses granted in Section&nbsp;2.1 with respect to any Contribution become effective for\n    each Contribution on the date the Contributor first distributes such Contribution.</p>\n<h3 id=\"limitations-on-grant-scope\">2.3. Limitations on Grant Scope</h3>\n<p>The licenses granted in this Section&nbsp;2 are the only rights granted under this License. No\n    additional rights or licenses will be implied from the distribution or licensing of Covered\n    Software under this License. Notwithstanding Section&nbsp;2.1(b) above, no patent license is\n    granted by a Contributor:</p>\n<ol type=\"a\">\n    <li><p>for any code that a Contributor has removed from Covered Software; or</p></li>\n    <li><p>for infringements caused by: (i) Your and any other third party’s modifications of\n        Covered Software, or (ii) the combination of its Contributions with other software (except\n        as part of its Contributor Version); or</p></li>\n    <li><p>under Patent Claims infringed by Covered Software in the absence of its\n        Contributions.</p></li>\n</ol>\n<p>This License does not grant any rights in the trademarks, service marks, or logos of any\n    Contributor (except as may be necessary to comply with the notice requirements in Section&nbsp;3.4).</p>\n<h3 id=\"subsequent-licenses\">2.4. Subsequent Licenses</h3>\n<p>No Contributor makes additional grants as a result of Your choice to distribute the Covered\n    Software under a subsequent version of this License (see Section&nbsp;10.2) or under the terms\n    of a Secondary License (if permitted under the terms of Section&nbsp;3.3).</p>\n<h3 id=\"representation\">2.5. Representation</h3>\n<p>Each Contributor represents that the Contributor believes its Contributions are its original\n    creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by\n    this License.</p>\n<h3 id=\"fair-use\">2.6. Fair Use</h3>\n<p>This License is not intended to limit any rights You have under applicable copyright doctrines of\n    fair use, fair dealing, or other equivalents.</p>\n<h3 id=\"conditions\">2.7. Conditions</h3>\n<p>Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section&nbsp;2.1.</p>\n<h2 id=\"responsibilities\">3. Responsibilities</h2>\n<h3 id=\"distribution-of-source-form\">3.1. Distribution of Source Form</h3>\n<p>All distribution of Covered Software in Source Code Form, including any Modifications that You\n    create or to which You contribute, must be under the terms of this License. You must inform\n    recipients that the Source Code Form of the Covered Software is governed by the terms of this\n    License, and how they can obtain a copy of this License. You may not attempt to alter or\n    restrict the recipients’ rights in the Source Code Form.</p>\n<h3 id=\"distribution-of-executable-form\">3.2. Distribution of Executable Form</h3>\n<p>If You distribute Covered Software in Executable Form then:</p>\n<ol type=\"a\">\n    <li><p>such Covered Software must also be made available in Source Code Form, as described in\n        Section&nbsp;3.1, and You must inform recipients of the Executable Form how they can obtain\n        a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more\n        than the cost of distribution to the recipient; and</p></li>\n    <li><p>You may distribute such Executable Form under the terms of this License, or sublicense it\n        under different terms, provided that the license for the Executable Form does not attempt to\n        limit or alter the recipients’ rights in the Source Code Form under this License.</p></li>\n</ol>\n<h3 id=\"distribution-of-a-larger-work\">3.3. Distribution of a Larger Work</h3>\n<p>You may create and distribute a Larger Work under terms of Your choice, provided that You also\n    comply with the requirements of this License for the Covered Software. If the Larger Work is a\n    combination of Covered Software with a work governed by one or more Secondary Licenses, and the\n    Covered Software is not Incompatible With Secondary Licenses, this License permits You to\n    additionally distribute such Covered Software under the terms of such Secondary License(s), so\n    that the recipient of the Larger Work may, at their option, further distribute the Covered\n    Software under the terms of either this License or such Secondary License(s).</p>\n<h3 id=\"notices\">3.4. Notices</h3>\n<p>You may not remove or alter the substance of any license notices (including copyright notices,\n    patent notices, disclaimers of warranty, or limitations of liability) contained within the\n    Source Code Form of the Covered Software, except that You may alter any license notices to the\n    extent required to remedy known factual inaccuracies.</p>\n<h3 id=\"application-of-additional-terms\">3.5. Application of Additional Terms</h3>\n<p>You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability\n    obligations to one or more recipients of Covered Software. However, You may do so only on Your\n    own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any\n    such warranty, support, indemnity, or liability obligation is offered by You alone, and You\n    hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a\n    result of warranty, support, indemnity or liability terms You offer. You may include additional\n    disclaimers of warranty and limitations of liability specific to any jurisdiction.</p>\n<h2 id=\"inability-to-comply-due-to-statute-or-regulation\">4. Inability to Comply Due to Statute or\n    Regulation</h2>\n<p>If it is impossible for You to comply with any of the terms of this License with respect to some\n    or all of the Covered Software due to statute, judicial order, or regulation then You must: (a)\n    comply with the terms of this License to the maximum extent possible; and (b) describe the\n    limitations and the code they affect. Such description must be placed in a text file included\n    with all distributions of the Covered Software under this License. Except to the extent\n    prohibited by statute or regulation, such description must be sufficiently detailed for a\n    recipient of ordinary skill to be able to understand it.</p>\n<h2 id=\"termination\">5. Termination</h2>\n<p>5.1. The rights granted under this License will terminate automatically if You fail to comply\n    with any of its terms. However, if You become compliant, then the rights granted under this\n    License from a particular Contributor are reinstated (a) provisionally, unless and until such\n    Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such\n    Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days\n    after You have come back into compliance. Moreover, Your grants from a particular Contributor\n    are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by\n    some reasonable means, this is the first time You have received notice of non-compliance with\n    this License from such Contributor, and You become compliant prior to 30 days after Your receipt\n    of the notice.</p>\n<p>5.2. If You initiate litigation against any entity by asserting a patent infringement claim\n    (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a\n    Contributor Version directly or indirectly infringes any patent, then the rights granted to You\n    by any and all Contributors for the Covered Software under Section&nbsp;2.1 of this License\n    shall terminate.</p>\n<p>5.3. In the event of termination under Sections&nbsp;5.1 or 5.2 above, all end user license\n    agreements (excluding distributors and resellers) which have been validly granted by You or Your\n    distributors under this License prior to termination shall survive termination.</p>\n<h2 id=\"disclaimer-of-warranty\">6. Disclaimer of Warranty</h2>\n<p><em>Covered Software is provided under this License on an “as is” basis, without warranty of any\n    kind, either expressed, implied, or statutory, including, without limitation, warranties that\n    the Covered Software is free of defects, merchantable, fit for a particular purpose or\n    non-infringing. The entire risk as to the quality and performance of the Covered Software is\n    with You. Should any Covered Software prove defective in any respect, You (not any Contributor)\n    assume the cost of any necessary servicing, repair, or correction. This disclaimer of warranty\n    constitutes an essential part of this License. No use of any Covered Software is authorized\n    under this License except under this disclaimer.</em></p>\n<h2 id=\"limitation-of-liability\">7. Limitation of Liability</h2>\n<p><em>Under no circumstances and under no legal theory, whether tort (including negligence),\n    contract, or otherwise, shall any Contributor, or anyone who distributes Covered Software as\n    permitted above, be liable to You for any direct, indirect, special, incidental, or\n    consequential damages of any character including, without limitation, damages for lost profits,\n    loss of goodwill, work stoppage, computer failure or malfunction, or any and all other\n    commercial damages or losses, even if such party shall have been informed of the possibility of\n    such damages. This limitation of liability shall not apply to liability for death or personal\n    injury resulting from such party’s negligence to the extent applicable law prohibits such\n    limitation. Some jurisdictions do not allow the exclusion or limitation of incidental or\n    consequential damages, so this exclusion and limitation may not apply to You.</em></p>\n<h2 id=\"litigation\">8. Litigation</h2>\n<p>Any litigation relating to this License may be brought only in the courts of a jurisdiction where\n    the defendant maintains its principal place of business and such litigation shall be governed by\n    laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this\n    Section shall prevent a party’s ability to bring cross-claims or counter-claims.</p>\n<h2 id=\"miscellaneous\">9. Miscellaneous</h2>\n<p>This License represents the complete agreement concerning the subject matter hereof. If any\n    provision of this License is held to be unenforceable, such provision shall be reformed only to\n    the extent necessary to make it enforceable. Any law or regulation which provides that the\n    language of a contract shall be construed against the drafter shall not be used to construe this\n    License against a Contributor.</p>\n<h2 id=\"versions-of-the-license\">10. Versions of the License</h2>\n<h3 id=\"new-versions\">10.1. New Versions</h3>\n<p>Mozilla Foundation is the license steward. Except as provided in Section&nbsp;10.3, no one other\n    than the license steward has the right to modify or publish new versions of this License. Each\n    version will be given a distinguishing version number.</p>\n<h3 id=\"effect-of-new-versions\">10.2. Effect of New Versions</h3>\n<p>You may distribute the Covered Software under the terms of the version of the License under which\n    You originally received the Covered Software, or under the terms of any subsequent version\n    published by the license steward.</p>\n<h3 id=\"modified-versions\">10.3. Modified Versions</h3>\n<p>If you create software not governed by this License, and you want to create a new license for\n    such software, you may create and use a modified version of this License if you rename the\n    license and remove any references to the name of the license steward (except to note that such\n    modified license differs from this License).</p>\n<h3 id=\"distributing-source-code-form-that-is-incompatible-with-secondary-licenses\">10.4.\n    Distributing Source Code Form that is Incompatible With Secondary Licenses</h3>\n<p>If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under\n    the terms of this version of the License, the notice described in Exhibit B of this License must\n    be attached.</p>\n<h2 id=\"exhibit-a---source-code-form-license-notice\">Exhibit A - Source Code Form License\n    Notice</h2>\n<blockquote>\n    <p>This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a\n        copy of the MPL was not distributed with this file, You can obtain one at\n        https://mozilla.org/MPL/2.0/.</p>\n</blockquote>\n<p>If it is not possible or desirable to put the notice in a particular file, then You may include\n    the notice in a location (such as a LICENSE file in a relevant directory) where a recipient\n    would be likely to look for such a notice.</p>\n<p>You may add additional accurate notices of copyright ownership.</p>\n<h2 id=\"exhibit-b---incompatible-with-secondary-licenses-notice\">Exhibit B - “Incompatible With\n    Secondary Licenses” Notice</h2>\n<blockquote>\n    <p>This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla\n        Public License, v. 2.0.</p>\n</blockquote>\n\n</body>\n</html>"
  },
  {
    "path": "app/src/main/assets/po_token.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\"><head><title></title><script>\n/**\n * Factory method to create and load a BotGuardClient instance.\n * @param options - Configuration options for the BotGuardClient.\n * @returns A promise that resolves to a loaded BotGuardClient instance.\n */\nfunction loadBotGuard(challengeData) {\n  this.vm = this[challengeData.globalName];\n  this.program = challengeData.program;\n  this.vmFunctions = {};\n  this.syncSnapshotFunction = null;\n\n  if (!this.vm)\n    throw new Error('[BotGuardClient]: VM not found in the global object');\n\n  if (!this.vm.a)\n    throw new Error('[BotGuardClient]: Could not load program');\n\n  const vmFunctionsCallback = function (\n    asyncSnapshotFunction,\n    shutdownFunction,\n    passEventFunction,\n    checkCameraFunction\n  ) {\n    this.vmFunctions = {\n      asyncSnapshotFunction: asyncSnapshotFunction,\n      shutdownFunction: shutdownFunction,\n      passEventFunction: passEventFunction,\n      checkCameraFunction: checkCameraFunction\n    };\n  };\n\n  this.syncSnapshotFunction = this.vm.a(this.program, vmFunctionsCallback, true, this.userInteractionElement, function () {/** no-op */ }, [ [], [] ])[0]\n\n  // an asynchronous function runs in the background and it will eventually call\n  // `vmFunctionsCallback`, however we need to manually tell JavaScript to pass\n  // control to the things running in the background by interrupting this async\n  // function in any way, e.g. with a delay of 1ms. The loop is most probably not\n  // needed but is there just because.\n  return new Promise(function (resolve, reject) {\n    i = 0\n    refreshIntervalId = setInterval(function () {\n      if (!!this.vmFunctions.asyncSnapshotFunction) {\n        resolve(this)\n        clearInterval(refreshIntervalId);\n      }\n      if (i >= 10000) {\n        reject(\"asyncSnapshotFunction is null even after 10 seconds\")\n        clearInterval(refreshIntervalId);\n      }\n      i += 1;\n    }, 1);\n  })\n}\n\n/**\n * Takes a snapshot asynchronously.\n * @returns The snapshot result.\n * @example\n * ```ts\n * const result = await botguard.snapshot({\n *   contentBinding: {\n *     c: \"a=6&a2=10&b=SZWDwKVIuixOp7Y4euGTgwckbJA&c=1729143849&d=1&t=7200&c1a=1&c6a=1&c6b=1&hh=HrMb5mRWTyxGJphDr0nW2Oxonh0_wl2BDqWuLHyeKLo\",\n *     e: \"ENGAGEMENT_TYPE_VIDEO_LIKE\",\n *     encryptedVideoId: \"P-vC09ZJcnM\"\n *    }\n * });\n *\n * console.log(result);\n * ```\n */\nfunction snapshot(args) {\n  return new Promise(function (resolve, reject) {\n    if (!this.vmFunctions.asyncSnapshotFunction)\n      return reject(new Error('[BotGuardClient]: Async snapshot function not found'));\n\n    this.vmFunctions.asyncSnapshotFunction(function (response) { resolve(response) }, [\n      args.contentBinding,\n      args.signedTimestamp,\n      args.webPoSignalOutput,\n      args.skipPrivacyBuffer\n    ]);\n  });\n}\n\nfunction runBotGuard(challengeData) {\n  const interpreterJavascript = challengeData.interpreterJavascript.privateDoNotAccessOrElseSafeScriptWrappedValue;\n\n  if (interpreterJavascript) {\n    new Function(interpreterJavascript)();\n  } else throw new Error('Could not load VM');\n\n  const webPoSignalOutput = [];\n  return loadBotGuard({\n    globalName: challengeData.globalName,\n    globalObj: this,\n    program: challengeData.program\n  }).then(function (botguard) {\n    return botguard.snapshot({ webPoSignalOutput: webPoSignalOutput })\n  }).then(function (botguardResponse) {\n    return { webPoSignalOutput: webPoSignalOutput, botguardResponse: botguardResponse }\n  })\n}\n\nfunction obtainPoToken(webPoSignalOutput, integrityToken, identifier) {\n  const getMinter = webPoSignalOutput[0];\n\n  if (!getMinter)\n    throw new Error('PMD:Undefined');\n\n  const mintCallback = getMinter(integrityToken);\n\n  if (!(mintCallback instanceof Function))\n    throw new Error('APF:Failed');\n\n  const result = mintCallback(identifier);\n\n  if (!result)\n    throw new Error('YNJ:Undefined');\n\n  if (!(result instanceof Uint8Array))\n    throw new Error('ODM:Invalid');\n\n  return result;\n}\n</script></head><body></body></html>\n"
  },
  {
    "path": "app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java",
    "content": "/*\n * Copyright 2018 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage androidx.fragment.app;\n\nimport android.os.Bundle;\nimport android.os.Parcelable;\nimport android.util.Log;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.IntDef;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.os.BundleCompat;\nimport androidx.lifecycle.Lifecycle;\nimport androidx.viewpager.widget.PagerAdapter;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.util.ArrayList;\n\n// TODO: Replace this deprecated class with its ViewPager2 counterpart\n\n/**\n * This is a copy from {@link androidx.fragment.app.FragmentStatePagerAdapter}.\n * <p>\n * It includes a workaround to fix the menu visibility when the adapter is restored.\n * </p>\n * <p>\n * When restoring the state of this adapter, all the fragments' menu visibility were set to false,\n * effectively disabling the menu from the user until he switched pages or another event\n * that triggered the menu to be visible again happened.\n * </p>\n * <p>\n * <b>Check out the changes in:</b>\n * </p>\n * <ul>\n *     <li>{@link #saveState()}</li>\n *     <li>{@link #restoreState(Parcelable, ClassLoader)}</li>\n * </ul>\n *\n * @deprecated Switch to {@link androidx.viewpager2.widget.ViewPager2} and use\n * {@link androidx.viewpager2.adapter.FragmentStateAdapter} instead.\n */\n@SuppressWarnings(\"deprecation\")\n@Deprecated\npublic abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapter {\n    private static final String TAG = \"FragmentStatePagerAdapt\";\n    private static final boolean DEBUG = false;\n\n    @Retention(RetentionPolicy.SOURCE)\n    @IntDef({BEHAVIOR_SET_USER_VISIBLE_HINT, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT})\n    private @interface Behavior { }\n\n    /**\n     * Indicates that {@link Fragment#setUserVisibleHint(boolean)} will be called when the current\n     * fragment changes.\n     *\n     * @deprecated This behavior relies on the deprecated\n     * {@link Fragment#setUserVisibleHint(boolean)} API. Use\n     * {@link #BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT} to switch to its replacement,\n     * {@link FragmentTransaction#setMaxLifecycle}.\n     * @see #FragmentStatePagerAdapterMenuWorkaround(FragmentManager, int)\n     */\n    @Deprecated\n    public static final int BEHAVIOR_SET_USER_VISIBLE_HINT = 0;\n\n    /**\n     * Indicates that only the current fragment will be in the {@link Lifecycle.State#RESUMED}\n     * state. All other Fragments are capped at {@link Lifecycle.State#STARTED}.\n     *\n     * @see #FragmentStatePagerAdapterMenuWorkaround(FragmentManager, int)\n     */\n    public static final int BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT = 1;\n\n    private final FragmentManager mFragmentManager;\n    private final int mBehavior;\n    private FragmentTransaction mCurTransaction = null;\n\n    private final ArrayList<Fragment.SavedState> mSavedState = new ArrayList<>();\n    private final ArrayList<Fragment> mFragments = new ArrayList<>();\n    private Fragment mCurrentPrimaryItem = null;\n    private boolean mExecutingFinishUpdate;\n\n    /**\n     * Constructor for {@link FragmentStatePagerAdapterMenuWorkaround}\n     * that sets the fragment manager for the adapter. This is the equivalent of calling\n     * {@link #FragmentStatePagerAdapterMenuWorkaround(FragmentManager, int)} and passing in\n     * {@link #BEHAVIOR_SET_USER_VISIBLE_HINT}.\n     *\n     * <p>Fragments will have {@link Fragment#setUserVisibleHint(boolean)} called whenever the\n     * current Fragment changes.</p>\n     *\n     * @param fm fragment manager that will interact with this adapter\n     * @deprecated use {@link #FragmentStatePagerAdapterMenuWorkaround(FragmentManager, int)} with\n     * {@link #BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT}\n     */\n    @Deprecated\n    public FragmentStatePagerAdapterMenuWorkaround(@NonNull final FragmentManager fm) {\n        this(fm, BEHAVIOR_SET_USER_VISIBLE_HINT);\n    }\n\n    /**\n     * Constructor for {@link FragmentStatePagerAdapterMenuWorkaround}.\n     *\n     * If {@link #BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT} is passed in, then only the current\n     * Fragment is in the {@link Lifecycle.State#RESUMED} state, while all other fragments are\n     * capped at {@link Lifecycle.State#STARTED}. If {@link #BEHAVIOR_SET_USER_VISIBLE_HINT} is\n     * passed, all fragments are in the {@link Lifecycle.State#RESUMED} state and there will be\n     * callbacks to {@link Fragment#setUserVisibleHint(boolean)}.\n     *\n     * @param fm fragment manager that will interact with this adapter\n     * @param behavior determines if only current fragments are in a resumed state\n     */\n    public FragmentStatePagerAdapterMenuWorkaround(@NonNull final FragmentManager fm,\n                                                   @Behavior final int behavior) {\n        mFragmentManager = fm;\n        mBehavior = behavior;\n    }\n\n    /**\n     * @param position the position of the item you want\n     * @return the {@link Fragment} associated with a specified position\n     */\n    @NonNull\n    public abstract Fragment getItem(int position);\n\n    @Override\n    public void startUpdate(@NonNull final ViewGroup container) {\n        if (container.getId() == View.NO_ID) {\n            throw new IllegalStateException(\"ViewPager with adapter \" + this\n                    + \" requires a view id\");\n        }\n    }\n\n    @SuppressWarnings(\"deprecation\")\n    @NonNull\n    @Override\n    public Object instantiateItem(@NonNull final ViewGroup container, final int position) {\n        // If we already have this item instantiated, there is nothing\n        // to do.  This can happen when we are restoring the entire pager\n        // from its saved state, where the fragment manager has already\n        // taken care of restoring the fragments we previously had instantiated.\n        if (mFragments.size() > position) {\n            final Fragment f = mFragments.get(position);\n            if (f != null) {\n                return f;\n            }\n        }\n\n        if (mCurTransaction == null) {\n            mCurTransaction = mFragmentManager.beginTransaction();\n        }\n\n        final Fragment fragment = getItem(position);\n        if (DEBUG) {\n            Log.v(TAG, \"Adding item #\" + position + \": f=\" + fragment);\n        }\n        if (mSavedState.size() > position) {\n            final Fragment.SavedState fss = mSavedState.get(position);\n            if (fss != null) {\n                fragment.setInitialSavedState(fss);\n            }\n        }\n        while (mFragments.size() <= position) {\n            mFragments.add(null);\n        }\n        fragment.setMenuVisibility(false);\n        if (mBehavior == BEHAVIOR_SET_USER_VISIBLE_HINT) {\n            fragment.setUserVisibleHint(false);\n        }\n\n        mFragments.set(position, fragment);\n        mCurTransaction.add(container.getId(), fragment);\n\n        if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {\n            mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.STARTED);\n        }\n\n        return fragment;\n    }\n\n    @Override\n    public void destroyItem(@NonNull final ViewGroup container, final int position,\n                            @NonNull final Object object) {\n        final Fragment fragment = (Fragment) object;\n\n        if (mCurTransaction == null) {\n            mCurTransaction = mFragmentManager.beginTransaction();\n        }\n        if (DEBUG) {\n            Log.v(TAG, \"Removing item #\" + position + \": f=\" + object\n                    + \" v=\" + ((Fragment) object).getView());\n        }\n        while (mSavedState.size() <= position) {\n            mSavedState.add(null);\n        }\n        mSavedState.set(position, fragment.isAdded()\n                ? mFragmentManager.saveFragmentInstanceState(fragment) : null);\n        mFragments.set(position, null);\n\n        mCurTransaction.remove(fragment);\n        if (fragment.equals(mCurrentPrimaryItem)) {\n            mCurrentPrimaryItem = null;\n        }\n    }\n\n    @Override\n    @SuppressWarnings({\"ReferenceEquality\", \"deprecation\"})\n    public void setPrimaryItem(@NonNull final ViewGroup container, final int position,\n                               @NonNull final Object object) {\n        final Fragment fragment = (Fragment) object;\n        if (fragment != mCurrentPrimaryItem) {\n            if (mCurrentPrimaryItem != null) {\n                mCurrentPrimaryItem.setMenuVisibility(false);\n                if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {\n                    if (mCurTransaction == null) {\n                        mCurTransaction = mFragmentManager.beginTransaction();\n                    }\n                    mCurTransaction.setMaxLifecycle(mCurrentPrimaryItem, Lifecycle.State.STARTED);\n                } else {\n                    mCurrentPrimaryItem.setUserVisibleHint(false);\n                }\n            }\n            fragment.setMenuVisibility(true);\n            if (mBehavior == BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {\n                if (mCurTransaction == null) {\n                    mCurTransaction = mFragmentManager.beginTransaction();\n                }\n                mCurTransaction.setMaxLifecycle(fragment, Lifecycle.State.RESUMED);\n            } else {\n                fragment.setUserVisibleHint(true);\n            }\n\n            mCurrentPrimaryItem = fragment;\n        }\n    }\n\n    @Override\n    public void finishUpdate(@NonNull final ViewGroup container) {\n        if (mCurTransaction != null) {\n            // We drop any transactions that attempt to be committed\n            // from a re-entrant call to finishUpdate(). We need to\n            // do this as a workaround for Robolectric running measure/layout\n            // calls inline rather than allowing them to be posted\n            // as they would on a real device.\n            if (!mExecutingFinishUpdate) {\n                try {\n                    mExecutingFinishUpdate = true;\n                    mCurTransaction.commitNowAllowingStateLoss();\n                } finally {\n                    mExecutingFinishUpdate = false;\n                }\n            }\n            mCurTransaction = null;\n        }\n    }\n\n    @Override\n    public boolean isViewFromObject(@NonNull final View view, @NonNull final Object object) {\n        return ((Fragment) object).getView() == view;\n    }\n\n    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n    private final String selectedFragment = \"selected_fragment\";\n    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n    @Override\n    @Nullable\n    public Parcelable saveState() {\n        Bundle state = null;\n        if (!mSavedState.isEmpty()) {\n            state = new Bundle();\n            state.putParcelableArrayList(\"states\", mSavedState);\n        }\n        for (int i = 0; i < mFragments.size(); i++) {\n            final Fragment f = mFragments.get(i);\n            if (f != null && f.isAdded()) {\n                if (state == null) {\n                    state = new Bundle();\n                }\n                final String key = \"f\" + i;\n                mFragmentManager.putFragment(state, key, f);\n\n                //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n                // Check if it's the same fragment instance\n                if (f == mCurrentPrimaryItem) {\n                    state.putString(selectedFragment, key);\n                }\n                //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n            }\n        }\n        return state;\n    }\n\n    @Override\n    public void restoreState(@Nullable final Parcelable state, @Nullable final ClassLoader loader) {\n        if (state != null) {\n            final Bundle bundle = (Bundle) state;\n            bundle.setClassLoader(loader);\n            final var states = BundleCompat.getParcelableArrayList(bundle, \"states\",\n                    Fragment.SavedState.class);\n            mSavedState.clear();\n            mFragments.clear();\n            if (states != null) {\n                mSavedState.addAll(states);\n            }\n            final Iterable<String> keys = bundle.keySet();\n            for (final String key : keys) {\n                if (key.startsWith(\"f\")) {\n                    final int index = Integer.parseInt(key.substring(1));\n                    final Fragment f = mFragmentManager.getFragment(bundle, key);\n                    if (f != null) {\n                        while (mFragments.size() <= index) {\n                            mFragments.add(null);\n                        }\n                        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n                        final boolean wasSelected = bundle.getString(selectedFragment, \"\")\n                                .equals(key);\n                        f.setMenuVisibility(wasSelected);\n                        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n                        mFragments.set(index, f);\n                    } else {\n                        Log.w(TAG, \"Bad fragment at key \" + key);\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/google/android/material/appbar/FlingBehavior.java",
    "content": "package com.google.android.material.appbar;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.widget.OverScroller;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.coordinatorlayout.widget.CoordinatorLayout;\n\nimport org.schabi.newpipe.R;\n\nimport java.lang.reflect.Field;\nimport java.util.List;\n\n// See https://stackoverflow.com/questions/56849221#57997489\npublic final class FlingBehavior extends AppBarLayout.Behavior {\n    private final Rect focusScrollRect = new Rect();\n\n    public FlingBehavior(final Context context, final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    private boolean allowScroll = true;\n    private final Rect globalRect = new Rect();\n    private final List<Integer> skipInterceptionOfElements = List.of(\n            R.id.itemsListPanel, R.id.playbackSeekBar,\n            R.id.playPauseButton, R.id.playPreviousButton, R.id.playNextButton);\n\n    @Override\n    public boolean onRequestChildRectangleOnScreen(\n            @NonNull final CoordinatorLayout coordinatorLayout, @NonNull final AppBarLayout child,\n            @NonNull final Rect rectangle, final boolean immediate) {\n        focusScrollRect.set(rectangle);\n\n        coordinatorLayout.offsetDescendantRectToMyCoords(child, focusScrollRect);\n\n        final int height = coordinatorLayout.getHeight();\n\n        if (focusScrollRect.top <= 0 && focusScrollRect.bottom >= height) {\n            // the child is too big to fit inside ourselves completely, ignore request\n            return false;\n        }\n\n        final int dy;\n\n        if (focusScrollRect.bottom > height) {\n            dy =  focusScrollRect.top;\n        } else if (focusScrollRect.top < 0) {\n            // scrolling up\n            dy = -(height - focusScrollRect.bottom);\n        } else {\n            // nothing to do\n            return false;\n        }\n\n        final int consumed = scroll(coordinatorLayout, child, dy, getMaxDragOffset(child), 0);\n\n        return consumed == dy;\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(@NonNull final CoordinatorLayout parent,\n                                         @NonNull final AppBarLayout child,\n                                         @NonNull final MotionEvent ev) {\n        for (final int element : skipInterceptionOfElements) {\n            final View view = child.findViewById(element);\n            if (view != null) {\n                final boolean visible = view.getGlobalVisibleRect(globalRect);\n                if (visible && globalRect.contains((int) ev.getRawX(), (int) ev.getRawY())) {\n                    allowScroll = false;\n                    return false;\n                }\n            }\n        }\n        allowScroll = true;\n        switch (ev.getActionMasked()) {\n            case MotionEvent.ACTION_DOWN:\n                // remove reference to old nested scrolling child\n                resetNestedScrollingChild();\n                // Stop fling when your finger touches the screen\n                stopAppBarLayoutFling();\n                break;\n            default:\n                break;\n        }\n        return super.onInterceptTouchEvent(parent, child, ev);\n    }\n\n    @Override\n    public boolean onStartNestedScroll(@NonNull final CoordinatorLayout parent,\n                                       @NonNull final AppBarLayout child,\n                                       @NonNull final View directTargetChild,\n                                       final View target,\n                                       final int nestedScrollAxes,\n                                       final int type) {\n        return allowScroll && super.onStartNestedScroll(\n                parent, child, directTargetChild, target, nestedScrollAxes, type);\n    }\n\n    @Override\n    public boolean onNestedFling(@NonNull final CoordinatorLayout coordinatorLayout,\n                                 @NonNull final AppBarLayout child,\n                                 @NonNull final View target, final float velocityX,\n                                 final float velocityY, final boolean consumed) {\n        return allowScroll && super.onNestedFling(\n                coordinatorLayout, child, target, velocityX, velocityY, consumed);\n    }\n\n    @Nullable\n    private OverScroller getScrollerField() {\n        try {\n            final Class<?> headerBehaviorType = this.getClass()\n                    .getSuperclass().getSuperclass().getSuperclass();\n            if (headerBehaviorType != null) {\n                final Field field = headerBehaviorType.getDeclaredField(\"scroller\");\n                field.setAccessible(true);\n                return ((OverScroller) field.get(this));\n            }\n        } catch (final NoSuchFieldException | IllegalAccessException e) {\n            // ?\n        }\n        return null;\n    }\n\n    @Nullable\n    private Field getLastNestedScrollingChildRefField() {\n        try {\n            final Class<?> headerBehaviorType = this.getClass().getSuperclass().getSuperclass();\n            if (headerBehaviorType != null) {\n                final Field field =\n                        headerBehaviorType.getDeclaredField(\"lastNestedScrollingChildRef\");\n                field.setAccessible(true);\n                return field;\n            }\n        } catch (final NoSuchFieldException e) {\n            // ?\n        }\n        return null;\n    }\n\n    private void resetNestedScrollingChild() {\n        final Field field = getLastNestedScrollingChildRefField();\n        if (field != null) {\n            try {\n                final Object value = field.get(this);\n                if (value != null) {\n                    field.set(this, null);\n                }\n            } catch (final IllegalAccessException e) {\n                // ?\n            }\n        }\n    }\n\n    private void stopAppBarLayoutFling() {\n        final OverScroller scroller = getScrollerField();\n        if (scroller != null) {\n            scroller.forceFinished(true);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/apache/commons/text/similarity/FuzzyScore.java",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements.  See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License.  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.apache.commons.text.similarity;\n\nimport java.util.Locale;\n\n/**\n * A matching algorithm that is similar to the searching algorithms implemented in editors such\n * as Sublime Text, TextMate, Atom and others.\n *\n * <p>\n * One point is given for every matched character. Subsequent matches yield two bonus points.\n * A higher score indicates a higher similarity.\n * </p>\n *\n * <p>\n * This code has been adapted from Apache Commons Lang 3.3.\n * </p>\n *\n * @since 1.0\n *\n * Note: This class was forked from\n * <a href=\"https://git.io/JyYJg\">\n *     apache/commons-text (8cfdafc) FuzzyScore.java\n * </a>\n */\npublic class FuzzyScore {\n\n    /**\n     * Locale used to change the case of text.\n     */\n    private final Locale locale;\n\n\n    /**\n     * This returns a {@link Locale}-specific {@link FuzzyScore}.\n     *\n     * @param locale The string matching logic is case insensitive.\n    A {@link Locale} is necessary to normalize both Strings to lower case.\n     * @throws IllegalArgumentException\n     *         This is thrown if the {@link Locale} parameter is {@code null}.\n     */\n    public FuzzyScore(final Locale locale) {\n        if (locale == null) {\n            throw new IllegalArgumentException(\"Locale must not be null\");\n        }\n        this.locale = locale;\n    }\n\n    /**\n     * Find the Fuzzy Score which indicates the similarity score between two\n     * Strings.\n     *\n     * <pre>\n     * score.fuzzyScore(null, null)                          = IllegalArgumentException\n     * score.fuzzyScore(\"not null\", null)                    = IllegalArgumentException\n     * score.fuzzyScore(null, \"not null\")                    = IllegalArgumentException\n     * score.fuzzyScore(\"\", \"\")                              = 0\n     * score.fuzzyScore(\"Workshop\", \"b\")                     = 0\n     * score.fuzzyScore(\"Room\", \"o\")                         = 1\n     * score.fuzzyScore(\"Workshop\", \"w\")                     = 1\n     * score.fuzzyScore(\"Workshop\", \"ws\")                    = 2\n     * score.fuzzyScore(\"Workshop\", \"wo\")                    = 4\n     * score.fuzzyScore(\"Apache Software Foundation\", \"asf\") = 3\n     * </pre>\n     *\n     * @param term a full term that should be matched against, must not be null\n     * @param query the query that will be matched against a term, must not be\n     *            null\n     * @return result score\n     * @throws IllegalArgumentException if the term or query is {@code null}\n     */\n    public Integer fuzzyScore(final CharSequence term, final CharSequence query) {\n        if (term == null || query == null) {\n            throw new IllegalArgumentException(\"CharSequences must not be null\");\n        }\n\n        // fuzzy logic is case insensitive. We normalize the Strings to lower\n        // case right from the start. Turning characters to lower case\n        // via Character.toLowerCase(char) is unfortunately insufficient\n        // as it does not accept a locale.\n        final String termLowerCase = term.toString().toLowerCase(locale);\n        final String queryLowerCase = query.toString().toLowerCase(locale);\n\n        // the resulting score\n        int score = 0;\n\n        // the position in the term which will be scanned next for potential\n        // query character matches\n        int termIndex = 0;\n\n        // index of the previously matched character in the term\n        int previousMatchingCharacterIndex = Integer.MIN_VALUE;\n\n        for (int queryIndex = 0; queryIndex < queryLowerCase.length(); queryIndex++) {\n            final char queryChar = queryLowerCase.charAt(queryIndex);\n\n            boolean termCharacterMatchFound = false;\n            for (; termIndex < termLowerCase.length()\n                    && !termCharacterMatchFound; termIndex++) {\n                final char termChar = termLowerCase.charAt(termIndex);\n\n                if (queryChar == termChar) {\n                    // simple character matches result in one point\n                    score++;\n\n                    // subsequent character matches further improve\n                    // the score.\n                    if (previousMatchingCharacterIndex + 1 == termIndex) {\n                        score += 2;\n                    }\n\n                    previousMatchingCharacterIndex = termIndex;\n\n                    // we can leave the nested loop. Every character in the\n                    // query can match at most one character in the term.\n                    termCharacterMatchFound = true;\n                }\n            }\n        }\n\n        return score;\n    }\n\n    /**\n     * Gets the locale.\n     *\n     * @return The locale\n     */\n    public Locale getLocale() {\n        return locale;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/App.kt",
    "content": "package org.schabi.newpipe\n\nimport android.app.ActivityManager\nimport android.app.Application\nimport android.content.Context\nimport android.util.Log\nimport androidx.core.app.NotificationChannelCompat\nimport androidx.core.app.NotificationManagerCompat\nimport androidx.core.content.getSystemService\nimport androidx.preference.PreferenceManager\nimport coil3.ImageLoader\nimport coil3.SingletonImageLoader\nimport coil3.network.okhttp.OkHttpNetworkFetcherFactory\nimport coil3.request.allowRgb565\nimport coil3.request.crossfade\nimport coil3.util.DebugLogger\nimport com.jakewharton.processphoenix.ProcessPhoenix\nimport io.reactivex.rxjava3.exceptions.CompositeException\nimport io.reactivex.rxjava3.exceptions.MissingBackpressureException\nimport io.reactivex.rxjava3.exceptions.OnErrorNotImplementedException\nimport io.reactivex.rxjava3.exceptions.UndeliverableException\nimport io.reactivex.rxjava3.functions.Consumer\nimport io.reactivex.rxjava3.plugins.RxJavaPlugins\nimport java.io.IOException\nimport java.io.InterruptedIOException\nimport java.net.SocketException\nimport org.acra.ACRA.init\nimport org.acra.ACRA.isACRASenderServiceProcess\nimport org.acra.config.CoreConfigurationBuilder\nimport org.schabi.newpipe.error.ReCaptchaActivity\nimport org.schabi.newpipe.extractor.NewPipe\nimport org.schabi.newpipe.extractor.downloader.Downloader\nimport org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor\nimport org.schabi.newpipe.ktx.hasAssignableCause\nimport org.schabi.newpipe.settings.NewPipeSettings\nimport org.schabi.newpipe.util.BridgeStateSaverInitializer\nimport org.schabi.newpipe.util.Localization\nimport org.schabi.newpipe.util.ServiceHelper\nimport org.schabi.newpipe.util.StateSaver\nimport org.schabi.newpipe.util.image.ImageStrategy\nimport org.schabi.newpipe.util.image.PreferredImageQuality\nimport org.schabi.newpipe.util.potoken.PoTokenProviderImpl\n\n/*\n * Copyright (C) Hans-Christoph Steiner 2016 <hans@eds.org>\n * App.kt is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\nopen class App :\n    Application(),\n    SingletonImageLoader.Factory {\n    var isFirstRun = false\n        private set\n    var notificationsRequested = false\n        private set\n\n    fun setNotificationsRequested() {\n        notificationsRequested = true\n    }\n\n    override fun attachBaseContext(base: Context?) {\n        super.attachBaseContext(base)\n        initACRA()\n    }\n\n    override fun onCreate() {\n        super.onCreate()\n\n        instance = this\n\n        if (ProcessPhoenix.isPhoenixProcess(this)) {\n            Log.i(TAG, \"This is a phoenix process! Aborting initialization of App[onCreate]\")\n            return\n        }\n\n        // check if the last used preference version is set\n        // to determine whether this is the first app run\n        val lastUsedPrefVersion =\n            PreferenceManager\n                .getDefaultSharedPreferences(this)\n                .getInt(getString(R.string.last_used_preferences_version), -1)\n        isFirstRun = lastUsedPrefVersion == -1\n\n        // Initialize settings first because other initializations can use its values\n        NewPipeSettings.initSettings(this)\n\n        NewPipe.init(\n            getDownloader(),\n            Localization.getPreferredLocalization(this),\n            Localization.getPreferredContentCountry(this)\n        )\n        Localization.initPrettyTime(Localization.resolvePrettyTime())\n\n        BridgeStateSaverInitializer.init(this)\n        StateSaver.init(this)\n        initNotificationChannels()\n\n        ServiceHelper.initServices(this)\n\n        // Initialize image loader\n        val prefs = PreferenceManager.getDefaultSharedPreferences(this)\n        ImageStrategy.setPreferredImageQuality(\n            PreferredImageQuality.fromPreferenceKey(\n                this,\n                prefs.getString(\n                    getString(R.string.image_quality_key),\n                    getString(R.string.image_quality_default)\n                )\n            )\n        )\n\n        configureRxJavaErrorHandler()\n\n        YoutubeStreamExtractor.setPoTokenProvider(PoTokenProviderImpl)\n    }\n\n    override fun newImageLoader(context: Context): ImageLoader = ImageLoader\n        .Builder(this)\n        .logger(if (BuildConfig.DEBUG) DebugLogger() else null)\n        .allowRgb565(getSystemService<ActivityManager>()!!.isLowRamDevice)\n        .crossfade(true)\n        .components {\n            add(OkHttpNetworkFetcherFactory(callFactory = DownloaderImpl.getInstance().client))\n        }.build()\n\n    protected open fun getDownloader(): Downloader {\n        val downloader = DownloaderImpl.init(null)\n        setCookiesToDownloader(downloader)\n        return downloader\n    }\n\n    protected fun setCookiesToDownloader(downloader: DownloaderImpl) {\n        val prefs = PreferenceManager.getDefaultSharedPreferences(this)\n        val key = getString(R.string.recaptcha_cookies_key)\n        downloader.setCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY, prefs.getString(key, null))\n        downloader.updateYoutubeRestrictedModeCookies(this)\n    }\n\n    private fun configureRxJavaErrorHandler() {\n        // https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling\n        RxJavaPlugins.setErrorHandler(\n            object : Consumer<Throwable> {\n                override fun accept(throwable: Throwable) {\n                    Log.e(TAG, \"RxJavaPlugins.ErrorHandler called with -> : throwable = [${throwable.javaClass.getName()}]\")\n\n                    // As UndeliverableException is a wrapper,\n                    // get the cause of it to get the \"real\" exception\n                    val actualThrowable = (throwable as? UndeliverableException)?.cause ?: throwable\n\n                    val errors = (actualThrowable as? CompositeException)?.exceptions ?: listOf(actualThrowable)\n\n                    for (error in errors) {\n                        if (isThrowableIgnored(error)) {\n                            return\n                        }\n                        if (isThrowableCritical(error)) {\n                            reportException(error)\n                            return\n                        }\n                    }\n\n                    // Out-of-lifecycle exceptions should only be reported if a debug user wishes so,\n                    // When exception is not reported, log it\n                    if (isDisposedRxExceptionsReported()) {\n                        reportException(actualThrowable)\n                    } else {\n                        Log.e(TAG, \"RxJavaPlugin: Undeliverable Exception received: \", actualThrowable)\n                    }\n                }\n\n                fun isThrowableIgnored(throwable: Throwable): Boolean {\n                    // Don't crash the application over a simple network problem\n                    return throwable // network api cancellation\n                        .hasAssignableCause(\n                            IOException::class.java,\n                            SocketException::class.java, // blocking code disposed\n                            InterruptedException::class.java,\n                            InterruptedIOException::class.java\n                        )\n                }\n\n                fun isThrowableCritical(throwable: Throwable): Boolean {\n                    // Though these exceptions cannot be ignored\n                    return throwable\n                        .hasAssignableCause(\n                            // bug in app\n                            NullPointerException::class.java,\n                            IllegalArgumentException::class.java,\n                            OnErrorNotImplementedException::class.java,\n                            MissingBackpressureException::class.java,\n                            // bug in operator\n                            IllegalStateException::class.java\n                        )\n                }\n\n                fun reportException(throwable: Throwable) {\n                    // Throw uncaught exception that will trigger the report system\n                    Thread\n                        .currentThread()\n                        .uncaughtExceptionHandler\n                        .uncaughtException(Thread.currentThread(), throwable)\n                }\n            }\n        )\n    }\n\n    /**\n     * Called in [.attachBaseContext] after calling the `super` method.\n     * Should be overridden if MultiDex is enabled, since it has to be initialized before ACRA.\n     */\n    protected fun initACRA() {\n        if (isACRASenderServiceProcess()) {\n            return\n        }\n\n        val acraConfig =\n            CoreConfigurationBuilder()\n                .withBuildConfigClass(BuildConfig::class.java)\n        init(this, acraConfig)\n    }\n\n    private fun initNotificationChannels() {\n        // Keep the importance below DEFAULT to avoid making noise on every notification update for\n        // the main and update channels\n        val mainChannel =\n            NotificationChannelCompat\n                .Builder(\n                    getString(R.string.notification_channel_id),\n                    NotificationManagerCompat.IMPORTANCE_LOW\n                ).setName(getString(R.string.notification_channel_name))\n                .setDescription(getString(R.string.notification_channel_description))\n                .build()\n        val appUpdateChannel =\n            NotificationChannelCompat\n                .Builder(\n                    getString(R.string.app_update_notification_channel_id),\n                    NotificationManagerCompat.IMPORTANCE_LOW\n                ).setName(getString(R.string.app_update_notification_channel_name))\n                .setDescription(getString(R.string.app_update_notification_channel_description))\n                .build()\n        val hashChannel =\n            NotificationChannelCompat\n                .Builder(\n                    getString(R.string.hash_channel_id),\n                    NotificationManagerCompat.IMPORTANCE_HIGH\n                ).setName(getString(R.string.hash_channel_name))\n                .setDescription(getString(R.string.hash_channel_description))\n                .build()\n        val errorReportChannel =\n            NotificationChannelCompat\n                .Builder(\n                    getString(R.string.error_report_channel_id),\n                    NotificationManagerCompat.IMPORTANCE_LOW\n                ).setName(getString(R.string.error_report_channel_name))\n                .setDescription(getString(R.string.error_report_channel_description))\n                .build()\n        val newStreamChannel =\n            NotificationChannelCompat\n                .Builder(\n                    getString(R.string.streams_notification_channel_id),\n                    NotificationManagerCompat.IMPORTANCE_DEFAULT\n                ).setName(getString(R.string.streams_notification_channel_name))\n                .setDescription(getString(R.string.streams_notification_channel_description))\n                .build()\n\n        val channels = listOf(mainChannel, appUpdateChannel, hashChannel, errorReportChannel, newStreamChannel)\n\n        NotificationManagerCompat.from(this).createNotificationChannelsCompat(channels)\n    }\n\n    protected open fun isDisposedRxExceptionsReported(): Boolean = false\n\n    companion object {\n        const val PACKAGE_NAME: String = BuildConfig.APPLICATION_ID\n        private val TAG = App::class.java.toString()\n\n        @JvmStatic\n        lateinit var instance: App\n            private set\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/BaseFragment.java",
    "content": "package org.schabi.newpipe;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentManager;\n\nimport com.evernote.android.state.State;\nimport com.livefront.bridge.Bridge;\n\n\npublic abstract class BaseFragment extends Fragment {\n    protected final String TAG = getClass().getSimpleName() + \"@\" + Integer.toHexString(hashCode());\n    protected static final boolean DEBUG = MainActivity.DEBUG;\n    protected AppCompatActivity activity;\n    //These values are used for controlling fragments when they are part of the frontpage\n    @State\n    protected boolean useAsFrontPage = false;\n\n    public void useAsFrontPage(final boolean value) {\n        useAsFrontPage = value;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Fragment's Lifecycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onAttach(@NonNull final Context context) {\n        super.onAttach(context);\n        activity = (AppCompatActivity) context;\n    }\n\n    @Override\n    public void onDetach() {\n        super.onDetach();\n        activity = null;\n    }\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        if (DEBUG) {\n            Log.d(TAG, \"onCreate() called with: \"\n                    + \"savedInstanceState = [\" + savedInstanceState + \"]\");\n        }\n        super.onCreate(savedInstanceState);\n        Bridge.restoreInstanceState(this, savedInstanceState);\n        if (savedInstanceState != null) {\n            onRestoreInstanceState(savedInstanceState);\n        }\n    }\n\n\n    @Override\n    public void onViewCreated(@NonNull final View rootView, final Bundle savedInstanceState) {\n        super.onViewCreated(rootView, savedInstanceState);\n        if (DEBUG) {\n            Log.d(TAG, \"onViewCreated() called with: \"\n                    + \"rootView = [\" + rootView + \"], \"\n                    + \"savedInstanceState = [\" + savedInstanceState + \"]\");\n        }\n        initViews(rootView, savedInstanceState);\n        initListeners();\n    }\n\n    @Override\n    public void onSaveInstanceState(@NonNull final Bundle outState) {\n        super.onSaveInstanceState(outState);\n        Bridge.saveInstanceState(this, outState);\n    }\n\n    protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) {\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * This method is called in {@link #onViewCreated(View, Bundle)} to initialize the views.\n     *\n     * <p>\n     * {@link #initListeners()} is called after this method to initialize the corresponding\n     * listeners.\n     * </p>\n     * @param rootView The inflated view for this fragment\n     *                 (provided by {@link #onViewCreated(View, Bundle)})\n     * @param savedInstanceState The saved state of this fragment\n *                               (provided by {@link #onViewCreated(View, Bundle)})\n     */\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n    }\n\n    /**\n     * Initialize the listeners for this fragment.\n     *\n     * <p>\n     * This method is called after {@link #initViews(View, Bundle)}\n     * in {@link #onViewCreated(View, Bundle)}.\n     * </p>\n     */\n    protected void initListeners() {\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public void setTitle(final String title) {\n        if (DEBUG) {\n            Log.d(TAG, \"setTitle() called with: title = [\" + title + \"]\");\n        }\n        if (!useAsFrontPage && activity != null && activity.getSupportActionBar() != null) {\n            activity.getSupportActionBar().setDisplayShowTitleEnabled(true);\n            activity.getSupportActionBar().setTitle(title);\n        }\n    }\n\n    /**\n     * Finds the root fragment by looping through all of the parent fragments. The root fragment\n     * is supposed to be {@link org.schabi.newpipe.fragments.MainFragment}, and is the fragment that\n     * handles keeping the backstack of opened fragments in NewPipe, and also the player bottom\n     * sheet. This function therefore returns the fragment manager of said fragment.\n     *\n     * @return the fragment manager of the root fragment, i.e.\n     *         {@link org.schabi.newpipe.fragments.MainFragment}\n     */\n    protected FragmentManager getFM() {\n        Fragment current = this;\n        while (current.getParentFragment() != null) {\n            current = current.getParentFragment();\n        }\n        return current.getFragmentManager();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/DownloaderImpl.java",
    "content": "package org.schabi.newpipe;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.error.ReCaptchaActivity;\nimport org.schabi.newpipe.extractor.downloader.Downloader;\nimport org.schabi.newpipe.extractor.downloader.Request;\nimport org.schabi.newpipe.extractor.downloader.Response;\nimport org.schabi.newpipe.extractor.exceptions.ReCaptchaException;\nimport org.schabi.newpipe.util.InfoCache;\n\nimport java.io.IOException;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.concurrent.TimeUnit;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\nimport okhttp3.OkHttpClient;\nimport okhttp3.RequestBody;\nimport okhttp3.ResponseBody;\n\npublic final class DownloaderImpl extends Downloader {\n    public static final String USER_AGENT =\n            \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0\";\n    public static final String YOUTUBE_RESTRICTED_MODE_COOKIE_KEY =\n            \"youtube_restricted_mode_key\";\n    public static final String YOUTUBE_RESTRICTED_MODE_COOKIE = \"PREF=f2=8000000\";\n    public static final String YOUTUBE_DOMAIN = \"youtube.com\";\n\n    private static DownloaderImpl instance;\n    private final Map<String, String> mCookies;\n    private final OkHttpClient client;\n\n    private DownloaderImpl(final OkHttpClient.Builder builder) {\n        this.client = builder\n                .readTimeout(30, TimeUnit.SECONDS)\n//                .cache(new Cache(new File(context.getExternalCacheDir(), \"okhttp\"),\n//                        16 * 1024 * 1024))\n                .build();\n        this.mCookies = new HashMap<>();\n    }\n\n    @NonNull\n    public OkHttpClient getClient() {\n        return client;\n    }\n\n    /**\n     * It's recommended to call exactly once in the entire lifetime of the application.\n     *\n     * @param builder if null, default builder will be used\n     * @return a new instance of {@link DownloaderImpl}\n     */\n    public static DownloaderImpl init(@Nullable final OkHttpClient.Builder builder) {\n        instance = new DownloaderImpl(\n                builder != null ? builder : new OkHttpClient.Builder());\n        return instance;\n    }\n\n    public static DownloaderImpl getInstance() {\n        return instance;\n    }\n\n    public String getCookies(final String url) {\n        final String youtubeCookie = url.contains(YOUTUBE_DOMAIN)\n                ? getCookie(YOUTUBE_RESTRICTED_MODE_COOKIE_KEY) : null;\n\n        // Recaptcha cookie is always added TODO: not sure if this is necessary\n        return Stream.of(youtubeCookie, getCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY))\n                .filter(Objects::nonNull)\n                .flatMap(cookies -> Arrays.stream(cookies.split(\"; *\")))\n                .distinct()\n                .collect(Collectors.joining(\"; \"));\n    }\n\n    public String getCookie(final String key) {\n        return mCookies.get(key);\n    }\n\n    public void setCookie(final String key, final String cookie) {\n        mCookies.put(key, cookie);\n    }\n\n    public void removeCookie(final String key) {\n        mCookies.remove(key);\n    }\n\n    public void updateYoutubeRestrictedModeCookies(final Context context) {\n        final String restrictedModeEnabledKey =\n                context.getString(R.string.youtube_restricted_mode_enabled);\n        final boolean restrictedModeEnabled = PreferenceManager.getDefaultSharedPreferences(context)\n                .getBoolean(restrictedModeEnabledKey, false);\n        updateYoutubeRestrictedModeCookies(restrictedModeEnabled);\n    }\n\n    public void updateYoutubeRestrictedModeCookies(final boolean youtubeRestrictedModeEnabled) {\n        if (youtubeRestrictedModeEnabled) {\n            setCookie(YOUTUBE_RESTRICTED_MODE_COOKIE_KEY,\n                    YOUTUBE_RESTRICTED_MODE_COOKIE);\n        } else {\n            removeCookie(YOUTUBE_RESTRICTED_MODE_COOKIE_KEY);\n        }\n        InfoCache.getInstance().clearCache();\n    }\n\n    /**\n     * Get the size of the content that the url is pointing by firing a HEAD request.\n     *\n     * @param url an url pointing to the content\n     * @return the size of the content, in bytes\n     */\n    public long getContentLength(final String url) throws IOException {\n        try {\n            final Response response = head(url);\n            return Long.parseLong(response.getHeader(\"Content-Length\"));\n        } catch (final NumberFormatException e) {\n            throw new IOException(\"Invalid content length\", e);\n        } catch (final ReCaptchaException e) {\n            throw new IOException(e);\n        }\n    }\n\n    @Override\n    public Response execute(@NonNull final Request request)\n            throws IOException, ReCaptchaException {\n        final String httpMethod = request.httpMethod();\n        final String url = request.url();\n        final Map<String, List<String>> headers = request.headers();\n        final byte[] dataToSend = request.dataToSend();\n\n        RequestBody requestBody = null;\n        if (dataToSend != null) {\n            requestBody = RequestBody.create(dataToSend);\n        }\n\n        final okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder()\n                .method(httpMethod, requestBody)\n                .url(url)\n                .addHeader(\"User-Agent\", USER_AGENT);\n\n        final String cookies = getCookies(url);\n        if (!cookies.isEmpty()) {\n            requestBuilder.addHeader(\"Cookie\", cookies);\n        }\n\n        headers.forEach((headerName, headerValueList) -> {\n            requestBuilder.removeHeader(headerName);\n            headerValueList.forEach(headerValue ->\n                    requestBuilder.addHeader(headerName, headerValue));\n        });\n\n        try (\n                okhttp3.Response response = client.newCall(requestBuilder.build()).execute()\n        ) {\n            if (response.code() == 429) {\n                throw new ReCaptchaException(\"reCaptcha Challenge requested\", url);\n            }\n\n            String responseBodyToReturn = null;\n            try (ResponseBody body = response.body()) {\n                responseBodyToReturn = body.string();\n            }\n\n            final String latestUrl = response.request().url().toString();\n            return new Response(\n                    response.code(),\n                    response.message(),\n                    response.headers().toMultimap(),\n                    responseBodyToReturn,\n                    latestUrl);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ExitActivity.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2016-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe\n\nimport android.annotation.SuppressLint\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle\nimport org.schabi.newpipe.util.NavigationHelper\n\nclass ExitActivity : Activity() {\n    @SuppressLint(\"NewApi\")\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        finishAndRemoveTask()\n        NavigationHelper.restartApp(this)\n    }\n\n    companion object {\n        @JvmStatic\n        fun exitAndRemoveFromRecentApps(activity: Activity) {\n            val intent = Intent(activity, ExitActivity::class.java)\n            intent.addFlags(\n                Intent.FLAG_ACTIVITY_NEW_TASK\n                    or Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS\n                    or Intent.FLAG_ACTIVITY_CLEAR_TASK\n                    or Intent.FLAG_ACTIVITY_NO_ANIMATION\n            )\n\n            activity.startActivity(intent)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/MainActivity.java",
    "content": "/*\n * Created by Christian Schabesberger on 02.08.16.\n * <p>\n * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>\n * DownloadActivity.java is part of NewPipe.\n * <p>\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * <p>\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * <p>\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npackage org.schabi.newpipe;\n\nimport android.app.AlertDialog;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.SharedPreferences;\nimport android.content.pm.PackageManager;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.util.Log;\nimport android.view.KeyEvent;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.webkit.WebView;\nimport android.widget.AdapterView;\nimport android.widget.ArrayAdapter;\nimport android.widget.FrameLayout;\nimport android.widget.Spinner;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.appcompat.app.ActionBarDrawerToggle;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.core.app.ActivityCompat;\nimport androidx.core.content.ContextCompat;\nimport androidx.core.view.GravityCompat;\nimport androidx.drawerlayout.widget.DrawerLayout;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentContainerView;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.preference.PreferenceManager;\n\nimport com.google.android.material.bottomsheet.BottomSheetBehavior;\n\nimport org.schabi.newpipe.databinding.ActivityMainBinding;\nimport org.schabi.newpipe.databinding.DrawerHeaderBinding;\nimport org.schabi.newpipe.databinding.DrawerLayoutBinding;\nimport org.schabi.newpipe.databinding.InstanceSpinnerLayoutBinding;\nimport org.schabi.newpipe.databinding.ToolbarLayoutBinding;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.comments.CommentsInfoItem;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.extractor.services.peertube.PeertubeInstance;\nimport org.schabi.newpipe.fragments.BackPressable;\nimport org.schabi.newpipe.fragments.MainFragment;\nimport org.schabi.newpipe.fragments.detail.VideoDetailFragment;\nimport org.schabi.newpipe.fragments.list.comments.CommentRepliesFragment;\nimport org.schabi.newpipe.fragments.list.search.SearchFragment;\nimport org.schabi.newpipe.local.feed.notifications.NotificationWorker;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.event.OnKeyDownListener;\nimport org.schabi.newpipe.player.helper.PlayerHolder;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.settings.UpdateSettingsFragment;\nimport org.schabi.newpipe.settings.migration.MigrationManager;\nimport org.schabi.newpipe.util.Constants;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.KioskTranslator;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.PeertubeHelper;\nimport org.schabi.newpipe.util.PermissionHelper;\nimport org.schabi.newpipe.util.ReleaseVersionUtil;\nimport org.schabi.newpipe.util.SerializedCache;\nimport org.schabi.newpipe.util.ServiceHelper;\nimport org.schabi.newpipe.util.StateSaver;\nimport org.schabi.newpipe.util.ThemeHelper;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\nimport org.schabi.newpipe.views.FocusOverlayView;\n\nimport java.time.Instant;\nimport java.time.temporal.ChronoUnit;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\npublic class MainActivity extends AppCompatActivity {\n    private static final String TAG = \"MainActivity\";\n    @SuppressWarnings(\"ConstantConditions\")\n    public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals(\"release\");\n\n    private ActivityMainBinding mainBinding;\n    private DrawerHeaderBinding drawerHeaderBinding;\n    private DrawerLayoutBinding drawerLayoutBinding;\n    private ToolbarLayoutBinding toolbarLayoutBinding;\n\n    private ActionBarDrawerToggle toggle;\n\n    private boolean servicesShown = false;\n\n    private BroadcastReceiver broadcastReceiver;\n\n    private static final int ITEM_ID_SUBSCRIPTIONS = -1;\n    private static final int ITEM_ID_FEED = -2;\n    private static final int ITEM_ID_BOOKMARKS = -3;\n    private static final int ITEM_ID_DOWNLOADS = -4;\n    private static final int ITEM_ID_HISTORY = -5;\n    private static final int ITEM_ID_SETTINGS = 0;\n    private static final int ITEM_ID_DONATION = 1;\n    private static final int ITEM_ID_ABOUT = 2;\n\n    private static final int ORDER = 0;\n    public static final String KEY_IS_IN_BACKGROUND = \"is_in_background\";\n\n    private SharedPreferences sharedPreferences;\n    private SharedPreferences.Editor sharedPrefEditor;\n    /*//////////////////////////////////////////////////////////////////////////\n    // Activity's LifeCycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        if (DEBUG) {\n            Log.d(TAG, \"onCreate() called with: \"\n                    + \"savedInstanceState = [\" + savedInstanceState + \"]\");\n        }\n\n        Localization.migrateAppLanguageSettingIfNecessary(getApplicationContext());\n        ThemeHelper.setDayNightMode(this);\n        ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this));\n\n        // Fixes text color turning black in dark/black mode:\n        // https://github.com/TeamNewPipe/NewPipe/issues/12016\n        // For further reference see: https://issuetracker.google.com/issues/37124582\n        if (DeviceUtils.supportsWebView()) {\n            try {\n                new WebView(this);\n            } catch (final Throwable e) {\n                if (DEBUG) {\n                    Log.e(TAG, \"Failed to create WebView\", e);\n                }\n            }\n        }\n\n        super.onCreate(savedInstanceState);\n        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);\n        sharedPrefEditor = sharedPreferences.edit();\n\n        mainBinding = ActivityMainBinding.inflate(getLayoutInflater());\n        drawerLayoutBinding = mainBinding.drawerLayout;\n        drawerHeaderBinding = DrawerHeaderBinding.bind(drawerLayoutBinding.navigation\n                .getHeaderView(0));\n        toolbarLayoutBinding = mainBinding.toolbarLayout;\n        setContentView(mainBinding.getRoot());\n\n        if (getSupportFragmentManager().getBackStackEntryCount() == 0) {\n            initFragments();\n        }\n\n        setSupportActionBar(toolbarLayoutBinding.toolbar);\n        try {\n            setupDrawer();\n        } catch (final Exception e) {\n            ErrorUtil.showUiErrorSnackbar(this, \"Setting up drawer\", e);\n        }\n        if (DeviceUtils.isTv(this)) {\n            FocusOverlayView.setupFocusObserver(this);\n        }\n        openMiniPlayerUponPlayerStarted();\n\n        if (PermissionHelper.checkPostNotificationsPermission(this,\n                PermissionHelper.POST_NOTIFICATIONS_REQUEST_CODE)) {\n            // Schedule worker for checking for new streams and creating corresponding notifications\n            // if this is enabled by the user.\n            NotificationWorker.initialize(this);\n        }\n        if (!UpdateSettingsFragment.wasUserAskedForConsent(this)\n                && !App.getInstance().isFirstRun()\n                && ReleaseVersionUtil.INSTANCE.isReleaseApk()) {\n            UpdateSettingsFragment.askForConsentToUpdateChecks(this);\n        }\n\n        // ReleaseVersionUtil.INSTANCE.isReleaseApk() will be true only for main official build\n        // We want every release build (nightly, nightly-refactor) to show the popup\n        if (!DEBUG) {\n            showKeepAndroidDialog();\n        }\n\n        MigrationManager.showUserInfoIfPresent(this);\n    }\n\n    @Override\n    protected void onPostCreate(final Bundle savedInstanceState) {\n        super.onPostCreate(savedInstanceState);\n\n        final App app = App.getInstance();\n\n        if (sharedPreferences.getBoolean(app.getString(R.string.update_app_key), false)\n                && sharedPreferences\n                .getBoolean(app.getString(R.string.update_check_consent_key), false)) {\n            // Start the worker which is checking all conditions\n            // and eventually searching for a new version.\n            NewVersionWorker.enqueueNewVersionCheckingWork(app, false);\n        }\n    }\n\n    @Override\n    protected void onStart() {\n        super.onStart();\n        sharedPrefEditor.putBoolean(KEY_IS_IN_BACKGROUND, false).apply();\n        Log.d(TAG, \"App moved to foreground\");\n    }\n\n    @Override\n    protected void onStop() {\n        super.onStop();\n        sharedPrefEditor.putBoolean(KEY_IS_IN_BACKGROUND, true).apply();\n        Log.d(TAG, \"App moved to background\");\n    }\n    private void setupDrawer() throws ExtractionException {\n        addDrawerMenuForCurrentService();\n\n        toggle = new ActionBarDrawerToggle(this, mainBinding.getRoot(),\n                toolbarLayoutBinding.toolbar, R.string.drawer_open, R.string.drawer_close);\n        toggle.syncState();\n        mainBinding.getRoot().addDrawerListener(toggle);\n        mainBinding.getRoot().addDrawerListener(new DrawerLayout.SimpleDrawerListener() {\n            private int lastService;\n\n            @Override\n            public void onDrawerOpened(final View drawerView) {\n                lastService = ServiceHelper.getSelectedServiceId(MainActivity.this);\n            }\n\n            @Override\n            public void onDrawerClosed(final View drawerView) {\n                if (servicesShown) {\n                    toggleServices();\n                }\n                if (lastService != ServiceHelper.getSelectedServiceId(MainActivity.this)) {\n                    ActivityCompat.recreate(MainActivity.this);\n                }\n            }\n        });\n\n        drawerLayoutBinding.navigation.setNavigationItemSelectedListener(this::drawerItemSelected);\n        setupDrawerHeader();\n    }\n\n    /**\n     * Builds the drawer menu for the current service.\n     *\n     * @throws ExtractionException if the service didn't provide available kiosks\n     */\n    private void addDrawerMenuForCurrentService() throws ExtractionException {\n        //Tabs\n        drawerLayoutBinding.navigation.getMenu()\n                .add(R.id.menu_tabs_group, ITEM_ID_SUBSCRIPTIONS, ORDER,\n                        R.string.tab_subscriptions)\n                .setIcon(R.drawable.ic_tv);\n        drawerLayoutBinding.navigation.getMenu()\n                .add(R.id.menu_tabs_group, ITEM_ID_FEED, ORDER, R.string.fragment_feed_title)\n                .setIcon(R.drawable.ic_subscriptions);\n        drawerLayoutBinding.navigation.getMenu()\n                .add(R.id.menu_tabs_group, ITEM_ID_BOOKMARKS, ORDER, R.string.tab_bookmarks)\n                .setIcon(R.drawable.ic_bookmark);\n        drawerLayoutBinding.navigation.getMenu()\n                .add(R.id.menu_tabs_group, ITEM_ID_DOWNLOADS, ORDER, R.string.downloads)\n                .setIcon(R.drawable.ic_file_download);\n        drawerLayoutBinding.navigation.getMenu()\n                .add(R.id.menu_tabs_group, ITEM_ID_HISTORY, ORDER, R.string.action_history)\n                .setIcon(R.drawable.ic_history);\n\n        //Kiosks\n        final int currentServiceId = ServiceHelper.getSelectedServiceId(this);\n        final StreamingService service = NewPipe.getService(currentServiceId);\n\n        int kioskMenuItemId = 0;\n\n        for (final String ks : service.getKioskList().getAvailableKiosks()) {\n            drawerLayoutBinding.navigation.getMenu()\n                    .add(R.id.menu_kiosks_group, kioskMenuItemId, 0, KioskTranslator\n                            .getTranslatedKioskName(ks, this))\n                    .setIcon(KioskTranslator.getKioskIcon(ks));\n            kioskMenuItemId++;\n        }\n\n        //Settings and About\n        drawerLayoutBinding.navigation.getMenu()\n                .add(R.id.menu_options_about_group, ITEM_ID_SETTINGS, ORDER, R.string.settings)\n                .setIcon(R.drawable.ic_settings);\n        drawerLayoutBinding.navigation.getMenu()\n                .add(R.id.menu_options_about_group, ITEM_ID_DONATION, ORDER,\n                        R.string.donation_title)\n                .setIcon(R.drawable.volunteer_activism_ic);\n        drawerLayoutBinding.navigation.getMenu()\n                .add(R.id.menu_options_about_group, ITEM_ID_ABOUT, ORDER, R.string.tab_about)\n                .setIcon(R.drawable.ic_info_outline);\n    }\n\n    private boolean drawerItemSelected(final MenuItem item) {\n        final int groupId = item.getGroupId();\n        if (groupId == R.id.menu_services_group) {\n            changeService(item);\n        } else if (groupId == R.id.menu_tabs_group) {\n            tabSelected(item);\n        } else if (groupId == R.id.menu_kiosks_group) {\n            try {\n                kioskSelected(item);\n            } catch (final Exception e) {\n                ErrorUtil.showUiErrorSnackbar(this, \"Selecting drawer kiosk\", e);\n            }\n        } else if (groupId == R.id.menu_options_about_group) {\n            optionsAboutSelected(item);\n        } else {\n            return false;\n        }\n\n        mainBinding.getRoot().closeDrawers();\n        return true;\n    }\n\n    private void changeService(final MenuItem item) {\n        drawerLayoutBinding.navigation.getMenu()\n                .getItem(ServiceHelper.getSelectedServiceId(this))\n                .setChecked(false);\n        ServiceHelper.setSelectedServiceId(this, item.getItemId());\n        drawerLayoutBinding.navigation.getMenu()\n                .getItem(ServiceHelper.getSelectedServiceId(this))\n                .setChecked(true);\n    }\n\n    private void tabSelected(final MenuItem item) {\n        switch (item.getItemId()) {\n            case ITEM_ID_SUBSCRIPTIONS:\n                NavigationHelper.openSubscriptionFragment(getSupportFragmentManager());\n                break;\n            case ITEM_ID_FEED:\n                NavigationHelper.openFeedFragment(getSupportFragmentManager());\n                break;\n            case ITEM_ID_BOOKMARKS:\n                NavigationHelper.openBookmarksFragment(getSupportFragmentManager());\n                break;\n            case ITEM_ID_DOWNLOADS:\n                NavigationHelper.openDownloads(this);\n                break;\n            case ITEM_ID_HISTORY:\n                NavigationHelper.openStatisticFragment(getSupportFragmentManager());\n                break;\n        }\n    }\n\n    private void kioskSelected(final MenuItem item) throws ExtractionException {\n        final StreamingService currentService = ServiceHelper.getSelectedService(this);\n        int kioskMenuItemId = 0;\n        for (final String kioskId : currentService.getKioskList().getAvailableKiosks()) {\n            if (kioskMenuItemId == item.getItemId()) {\n                NavigationHelper.openKioskFragment(getSupportFragmentManager(),\n                        currentService.getServiceId(), kioskId);\n                break;\n            }\n            kioskMenuItemId++;\n        }\n    }\n\n    private void optionsAboutSelected(final MenuItem item) {\n        switch (item.getItemId()) {\n            case ITEM_ID_SETTINGS:\n                NavigationHelper.openSettings(this);\n                break;\n            case ITEM_ID_DONATION:\n                ShareUtils.openUrlInBrowser(this, getString(R.string.donation_url));\n                break;\n            case ITEM_ID_ABOUT:\n                NavigationHelper.openAbout(this);\n                break;\n        }\n    }\n\n    private void setupDrawerHeader() {\n        drawerHeaderBinding.drawerHeaderActionButton.setOnClickListener(view -> toggleServices());\n\n        // If the current app name is bigger than the default \"NewPipe\" (7 chars),\n        // let the text view grow a little more as well.\n        if (getString(R.string.app_name).length() > \"NewPipe\".length()) {\n            final ViewGroup.LayoutParams layoutParams =\n                    drawerHeaderBinding.drawerHeaderNewpipeTitle.getLayoutParams();\n            layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;\n            drawerHeaderBinding.drawerHeaderNewpipeTitle.setLayoutParams(layoutParams);\n            drawerHeaderBinding.drawerHeaderNewpipeTitle.setMaxLines(2);\n            drawerHeaderBinding.drawerHeaderNewpipeTitle.setMinWidth(getResources()\n                    .getDimensionPixelSize(R.dimen.drawer_header_newpipe_title_default_width));\n            drawerHeaderBinding.drawerHeaderNewpipeTitle.setMaxWidth(getResources()\n                    .getDimensionPixelSize(R.dimen.drawer_header_newpipe_title_max_width));\n        }\n    }\n\n    private void toggleServices() {\n        servicesShown = !servicesShown;\n\n        drawerLayoutBinding.navigation.getMenu().removeGroup(R.id.menu_services_group);\n        drawerLayoutBinding.navigation.getMenu().removeGroup(R.id.menu_tabs_group);\n        drawerLayoutBinding.navigation.getMenu().removeGroup(R.id.menu_kiosks_group);\n        drawerLayoutBinding.navigation.getMenu().removeGroup(R.id.menu_options_about_group);\n\n        // Show up or down arrow\n        drawerHeaderBinding.drawerArrow.setImageResource(\n                servicesShown ? R.drawable.ic_arrow_drop_up : R.drawable.ic_arrow_drop_down);\n\n        if (servicesShown) {\n            showServices();\n        } else {\n            try {\n                addDrawerMenuForCurrentService();\n            } catch (final Exception e) {\n                ErrorUtil.showUiErrorSnackbar(this, \"Showing main page tabs\", e);\n            }\n        }\n    }\n\n    private void showServices() {\n        for (final StreamingService s : NewPipe.getServices()) {\n            final String title = s.getServiceInfo().getName();\n\n            final MenuItem menuItem = drawerLayoutBinding.navigation.getMenu()\n                    .add(R.id.menu_services_group, s.getServiceId(), ORDER, title)\n                    .setIcon(ServiceHelper.getIcon(s.getServiceId()));\n\n            // peertube specifics\n            if (s.getServiceId() == 3) {\n                enhancePeertubeMenu(menuItem);\n            }\n        }\n        drawerLayoutBinding.navigation.getMenu()\n                .getItem(ServiceHelper.getSelectedServiceId(this))\n                .setChecked(true);\n    }\n\n    private void enhancePeertubeMenu(final MenuItem menuItem) {\n        final PeertubeInstance currentInstance = PeertubeHelper.getCurrentInstance();\n        menuItem.setTitle(currentInstance.getName());\n        final Spinner spinner = InstanceSpinnerLayoutBinding.inflate(LayoutInflater.from(this))\n                .getRoot();\n        final List<PeertubeInstance> instances = PeertubeHelper.getInstanceList(this);\n        final List<String> items = new ArrayList<>();\n        int defaultSelect = 0;\n        for (final PeertubeInstance instance : instances) {\n            items.add(instance.getName());\n            if (instance.getUrl().equals(currentInstance.getUrl())) {\n                defaultSelect = items.size() - 1;\n            }\n        }\n        final ArrayAdapter<String> adapter = new ArrayAdapter<>(this,\n                R.layout.instance_spinner_item, items);\n        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\n        spinner.setAdapter(adapter);\n        spinner.setSelection(defaultSelect, false);\n        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(final AdapterView<?> parent, final View view,\n                                       final int position, final long id) {\n                final PeertubeInstance newInstance = instances.get(position);\n                if (newInstance.getUrl().equals(PeertubeHelper.getCurrentInstance().getUrl())) {\n                    return;\n                }\n                PeertubeHelper.selectInstance(newInstance, getApplicationContext());\n                changeService(menuItem);\n                mainBinding.getRoot().closeDrawers();\n                new Handler(Looper.getMainLooper()).postDelayed(() -> {\n                    getSupportFragmentManager().popBackStack(null,\n                            FragmentManager.POP_BACK_STACK_INCLUSIVE);\n                    ActivityCompat.recreate(MainActivity.this);\n                }, 300);\n            }\n\n            @Override\n            public void onNothingSelected(final AdapterView<?> parent) {\n\n            }\n        });\n        menuItem.setActionView(spinner);\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        if (!isChangingConfigurations()) {\n            StateSaver.clearStateFiles();\n        }\n        if (broadcastReceiver != null) {\n            unregisterReceiver(broadcastReceiver);\n        }\n    }\n\n    @Override\n    protected void onResume() {\n        // Change the date format to match the selected language on resume\n        Localization.initPrettyTime(Localization.resolvePrettyTime());\n        super.onResume();\n\n        // Close drawer on return, and don't show animation,\n        // so it looks like the drawer isn't open when the user returns to MainActivity\n        mainBinding.getRoot().closeDrawer(GravityCompat.START, false);\n        try {\n            final int selectedServiceId = ServiceHelper.getSelectedServiceId(this);\n            final String selectedServiceName = NewPipe.getService(selectedServiceId)\n                    .getServiceInfo().getName();\n            drawerHeaderBinding.drawerHeaderServiceView.setText(selectedServiceName);\n            drawerHeaderBinding.drawerHeaderServiceIcon.setImageResource(ServiceHelper\n                    .getIcon(selectedServiceId));\n\n            drawerHeaderBinding.drawerHeaderServiceView.post(() -> drawerHeaderBinding\n                    .drawerHeaderServiceView.setSelected(true));\n            drawerHeaderBinding.drawerHeaderActionButton.setContentDescription(\n                    getString(R.string.drawer_header_description) + selectedServiceName);\n        } catch (final Exception e) {\n            ErrorUtil.showUiErrorSnackbar(this, \"Setting up service toggle\", e);\n        }\n\n        if (sharedPreferences.getBoolean(Constants.KEY_THEME_CHANGE, false)) {\n            if (DEBUG) {\n                Log.d(TAG, \"Theme has changed, recreating activity...\");\n            }\n            sharedPrefEditor.putBoolean(Constants.KEY_THEME_CHANGE, false).apply();\n            ActivityCompat.recreate(this);\n        }\n\n        if (sharedPreferences.getBoolean(Constants.KEY_MAIN_PAGE_CHANGE, false)) {\n            if (DEBUG) {\n                Log.d(TAG, \"main page has changed, recreating main fragment...\");\n            }\n            sharedPrefEditor.putBoolean(Constants.KEY_MAIN_PAGE_CHANGE, false).apply();\n            NavigationHelper.openMainActivity(this);\n        }\n\n        final boolean isHistoryEnabled = sharedPreferences.getBoolean(\n                getString(R.string.enable_watch_history_key), true);\n        drawerLayoutBinding.navigation.getMenu().findItem(ITEM_ID_HISTORY)\n                .setVisible(isHistoryEnabled);\n    }\n\n    @Override\n    protected void onNewIntent(final Intent intent) {\n        if (DEBUG) {\n            Log.d(TAG, \"onNewIntent() called with: intent = [\" + intent + \"]\");\n        }\n        if (intent != null) {\n            // Return if launched from a launcher (e.g. Nova Launcher, Pixel Launcher ...)\n            // to not destroy the already created backstack\n            final String action = intent.getAction();\n            if ((action != null && action.equals(Intent.ACTION_MAIN))\n                    && intent.hasCategory(Intent.CATEGORY_LAUNCHER)) {\n                return;\n            }\n        }\n\n        super.onNewIntent(intent);\n        setIntent(intent);\n        handleIntent(intent);\n    }\n\n    @Override\n    public boolean onKeyDown(final int keyCode, final KeyEvent event) {\n        final Fragment fragment = getSupportFragmentManager()\n                .findFragmentById(R.id.fragment_player_holder);\n        if (fragment instanceof OnKeyDownListener\n                && !bottomSheetHiddenOrCollapsed()) {\n            // Provide keyDown event to fragment which then sends this event\n            // to the main player service\n            return ((OnKeyDownListener) fragment).onKeyDown(keyCode)\n                    || super.onKeyDown(keyCode, event);\n        }\n        return super.onKeyDown(keyCode, event);\n    }\n\n    @Override\n    public void onBackPressed() {\n        if (DEBUG) {\n            Log.d(TAG, \"onBackPressed() called\");\n        }\n\n        if (DeviceUtils.isTv(this)) {\n            if (mainBinding.getRoot().isDrawerOpen(drawerLayoutBinding.navigation)) {\n                mainBinding.getRoot().closeDrawers();\n                return;\n            }\n        }\n\n        // In case bottomSheet is not visible on the screen or collapsed we can assume that the user\n        // interacts with a fragment inside fragment_holder so all back presses should be\n        // handled by it\n        if (bottomSheetHiddenOrCollapsed()) {\n            final FragmentManager fm = getSupportFragmentManager();\n            final Fragment fragment = fm.findFragmentById(R.id.fragment_holder);\n            // If current fragment implements BackPressable (i.e. can/wanna handle back press)\n            // delegate the back press to it\n            if (fragment instanceof BackPressable) {\n                if (((BackPressable) fragment).onBackPressed()) {\n                    return;\n                }\n            } else if (fragment instanceof CommentRepliesFragment) {\n                // expand DetailsFragment if CommentRepliesFragment was opened\n                // to show the top level comments again\n                // Expand DetailsFragment if CommentRepliesFragment was opened\n                // and no other CommentRepliesFragments are on top of the back stack\n                // to show the top level comments again.\n                openDetailFragmentFromCommentReplies(fm, false);\n            }\n\n        } else {\n            final Fragment fragmentPlayer = getSupportFragmentManager()\n                    .findFragmentById(R.id.fragment_player_holder);\n            // If current fragment implements BackPressable (i.e. can/wanna handle back press)\n            // delegate the back press to it\n            if (fragmentPlayer instanceof BackPressable) {\n                if (!((BackPressable) fragmentPlayer).onBackPressed()) {\n                    BottomSheetBehavior.from(mainBinding.fragmentPlayerHolder)\n                            .setState(BottomSheetBehavior.STATE_COLLAPSED);\n                }\n                return;\n            }\n        }\n\n        if (getSupportFragmentManager().getBackStackEntryCount() == 1) {\n            finish();\n        } else {\n            super.onBackPressed();\n        }\n    }\n\n    @Override\n    public void onRequestPermissionsResult(final int requestCode,\n                                           @NonNull final String[] permissions,\n                                           @NonNull final int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        for (final int i : grantResults) {\n            if (i == PackageManager.PERMISSION_DENIED) {\n                return;\n            }\n        }\n        switch (requestCode) {\n            case PermissionHelper.DOWNLOADS_REQUEST_CODE:\n                NavigationHelper.openDownloads(this);\n                break;\n            case PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE:\n                final Fragment fragment = getSupportFragmentManager()\n                        .findFragmentById(R.id.fragment_player_holder);\n                if (fragment instanceof VideoDetailFragment) {\n                    ((VideoDetailFragment) fragment).openDownloadDialog();\n                }\n                break;\n            case PermissionHelper.POST_NOTIFICATIONS_REQUEST_CODE:\n                NotificationWorker.initialize(this);\n                break;\n        }\n    }\n\n    /**\n     * Implement the following diagram behavior for the up button:\n     * <pre>\n     *              +---------------+\n     *              |  Main Screen  +----+\n     *              +-------+-------+    |\n     *                      |            |\n     *                      ▲ Up         | Search Button\n     *                      |            |\n     *                 +----+-----+      |\n     *    +------------+  Search  |◄-----+\n     *    |            +----+-----+\n     *    |   Open          |\n     *    |  something      ▲ Up\n     *    |                 |\n     *    |    +------------+-------------+\n     *    |    |                          |\n     *    |    |  Video    <->  Channel   |\n     *    +---►|  Channel  <->  Playlist  |\n     *         |  Video    <->  ....      |\n     *         |                          |\n     *         +--------------------------+\n     * </pre>\n     */\n    private void onHomeButtonPressed() {\n        final FragmentManager fm = getSupportFragmentManager();\n        final Fragment fragment = fm.findFragmentById(R.id.fragment_holder);\n\n        if (fragment instanceof CommentRepliesFragment) {\n            // Expand DetailsFragment if CommentRepliesFragment was opened\n            // and no other CommentRepliesFragments are on top of the back stack\n            // to show the top level comments again.\n            openDetailFragmentFromCommentReplies(fm, true);\n        } else if (!NavigationHelper.tryGotoSearchFragment(fm)) {\n            // If search fragment wasn't found in the backstack go to the main fragment\n            NavigationHelper.gotoMainFragment(fm);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Menu\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public boolean onCreateOptionsMenu(final Menu menu) {\n        if (DEBUG) {\n            Log.d(TAG, \"onCreateOptionsMenu() called with: menu = [\" + menu + \"]\");\n        }\n        super.onCreateOptionsMenu(menu);\n\n        final Fragment fragment =\n                getSupportFragmentManager().findFragmentById(R.id.fragment_holder);\n        if (!(fragment instanceof SearchFragment)) {\n            toolbarLayoutBinding.toolbarSearchContainer.getRoot().setVisibility(View.GONE);\n        }\n\n        final ActionBar actionBar = getSupportActionBar();\n        if (actionBar != null) {\n            actionBar.setDisplayHomeAsUpEnabled(false);\n        }\n\n        updateDrawerNavigation();\n\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(@NonNull final MenuItem item) {\n        if (DEBUG) {\n            Log.d(TAG, \"onOptionsItemSelected() called with: item = [\" + item + \"]\");\n        }\n\n        if (item.getItemId() == android.R.id.home) {\n            onHomeButtonPressed();\n            return true;\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void initFragments() {\n        if (DEBUG) {\n            Log.d(TAG, \"initFragments() called\");\n        }\n        StateSaver.clearStateFiles();\n        if (getIntent() != null && getIntent().hasExtra(Constants.KEY_LINK_TYPE)) {\n            // When user watch a video inside popup and then tries to open the video in main player\n            // while the app is closed he will see a blank fragment on place of kiosk.\n            // Let's open it first\n            if (getSupportFragmentManager().getBackStackEntryCount() == 0) {\n                NavigationHelper.openMainFragment(getSupportFragmentManager());\n            }\n\n            handleIntent(getIntent());\n        } else {\n            NavigationHelper.gotoMainFragment(getSupportFragmentManager());\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void updateDrawerNavigation() {\n        if (getSupportActionBar() == null) {\n            return;\n        }\n\n        final Fragment fragment = getSupportFragmentManager()\n                .findFragmentById(R.id.fragment_holder);\n        if (fragment instanceof MainFragment) {\n            getSupportActionBar().setDisplayHomeAsUpEnabled(false);\n            if (toggle != null) {\n                toggle.syncState();\n                toolbarLayoutBinding.toolbar.setNavigationOnClickListener(v -> mainBinding.getRoot()\n                        .open());\n                mainBinding.getRoot().setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED);\n            }\n        } else {\n            mainBinding.getRoot().setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);\n            getSupportActionBar().setDisplayHomeAsUpEnabled(true);\n            toolbarLayoutBinding.toolbar.setNavigationOnClickListener(v -> onHomeButtonPressed());\n        }\n    }\n\n    private void handleIntent(final Intent intent) {\n        try {\n            if (DEBUG) {\n                Log.d(TAG, \"handleIntent() called with: intent = [\" + intent + \"]\");\n            }\n\n            if (intent.hasExtra(Constants.KEY_LINK_TYPE)) {\n                final String url = intent.getStringExtra(Constants.KEY_URL);\n                final int serviceId = intent.getIntExtra(Constants.KEY_SERVICE_ID, 0);\n                String title = intent.getStringExtra(Constants.KEY_TITLE);\n                if (title == null) {\n                    title = \"\";\n                }\n\n                final StreamingService.LinkType linkType = ((StreamingService.LinkType) intent\n                        .getSerializableExtra(Constants.KEY_LINK_TYPE));\n                assert linkType != null;\n                switch (linkType) {\n                    case STREAM:\n                        final String intentCacheKey = intent.getStringExtra(\n                                Player.PLAY_QUEUE_KEY);\n                        final PlayQueue playQueue = intentCacheKey != null\n                                ? SerializedCache.getInstance()\n                                .take(intentCacheKey, PlayQueue.class)\n                                : null;\n\n                        final boolean switchingPlayers = intent.getBooleanExtra(\n                                VideoDetailFragment.KEY_SWITCHING_PLAYERS, false);\n                        NavigationHelper.openVideoDetailFragment(\n                                getApplicationContext(), getSupportFragmentManager(),\n                                serviceId, url, title, playQueue, switchingPlayers);\n                        break;\n                    case CHANNEL:\n                        NavigationHelper.openChannelFragment(getSupportFragmentManager(),\n                                serviceId, url, title);\n                        break;\n                    case PLAYLIST:\n                        NavigationHelper.openPlaylistFragment(getSupportFragmentManager(),\n                                serviceId, url, title);\n                        break;\n                }\n            } else if (intent.hasExtra(Constants.KEY_OPEN_SEARCH)) {\n                String searchString = intent.getStringExtra(Constants.KEY_SEARCH_STRING);\n                if (searchString == null) {\n                    searchString = \"\";\n                }\n                final int serviceId = intent.getIntExtra(Constants.KEY_SERVICE_ID, 0);\n                NavigationHelper.openSearchFragment(\n                        getSupportFragmentManager(),\n                        serviceId,\n                        searchString);\n\n            } else {\n                NavigationHelper.gotoMainFragment(getSupportFragmentManager());\n            }\n        } catch (final Exception e) {\n            ErrorUtil.showUiErrorSnackbar(this, \"Handling intent\", e);\n        }\n    }\n\n    private void openMiniPlayerIfMissing() {\n        final Fragment fragmentPlayer = getSupportFragmentManager()\n                .findFragmentById(R.id.fragment_player_holder);\n        if (fragmentPlayer == null) {\n            // We still don't have a fragment attached to the activity. It can happen when a user\n            // started popup or background players without opening a stream inside the fragment.\n            // Adding it in a collapsed state (only mini player will be visible).\n            NavigationHelper.showMiniPlayer(getSupportFragmentManager());\n        }\n    }\n\n    private void openMiniPlayerUponPlayerStarted() {\n        if (getIntent().getSerializableExtra(Constants.KEY_LINK_TYPE)\n                == StreamingService.LinkType.STREAM) {\n            // handleIntent() already takes care of opening video detail fragment\n            // due to an intent containing a STREAM link\n            return;\n        }\n\n        if (PlayerHolder.getInstance().isPlayerOpen()) {\n            // if the player is already open, no need for a broadcast receiver\n            openMiniPlayerIfMissing();\n        } else {\n            // listen for player start intent being sent around\n            broadcastReceiver = new BroadcastReceiver() {\n                @Override\n                public void onReceive(final Context context, final Intent intent) {\n                    if (Objects.equals(intent.getAction(),\n                            VideoDetailFragment.ACTION_PLAYER_STARTED)\n                            && PlayerHolder.getInstance().isPlayerOpen()) {\n                        openMiniPlayerIfMissing();\n                        // At this point the player is added 100%, we can unregister. Other actions\n                        // are useless since the fragment will not be removed after that.\n                        unregisterReceiver(broadcastReceiver);\n                        broadcastReceiver = null;\n                    }\n                }\n            };\n            final IntentFilter intentFilter = new IntentFilter();\n            intentFilter.addAction(VideoDetailFragment.ACTION_PLAYER_STARTED);\n            ContextCompat.registerReceiver(this, broadcastReceiver, intentFilter,\n                    ContextCompat.RECEIVER_EXPORTED);\n\n            // If the PlayerHolder is not bound yet, but the service is running, try to bind to it.\n            // Once the connection is established, the ACTION_PLAYER_STARTED will be sent.\n            PlayerHolder.getInstance().tryBindIfNeeded(this);\n        }\n    }\n\n    private void openDetailFragmentFromCommentReplies(\n            @NonNull final FragmentManager fm,\n            final boolean popBackStack\n    ) {\n        // obtain the name of the fragment under the replies fragment that's going to be popped\n        @Nullable final String fragmentUnderEntryName;\n        if (fm.getBackStackEntryCount() < 2) {\n            fragmentUnderEntryName = null;\n        } else {\n            fragmentUnderEntryName = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 2)\n                    .getName();\n        }\n\n        // the root comment is the comment for which the user opened the replies page\n        @Nullable final CommentRepliesFragment repliesFragment =\n                (CommentRepliesFragment) fm.findFragmentByTag(CommentRepliesFragment.TAG);\n        @Nullable final CommentsInfoItem rootComment =\n                repliesFragment == null ? null : repliesFragment.getCommentsInfoItem();\n\n        // sometimes this function pops the backstack, other times it's handled by the system\n        if (popBackStack) {\n            fm.popBackStackImmediate();\n        }\n\n        // only expand the bottom sheet back if there are no more nested comment replies fragments\n        // stacked under the one that is currently being popped\n        if (CommentRepliesFragment.TAG.equals(fragmentUnderEntryName)) {\n            return;\n        }\n\n        final BottomSheetBehavior<FragmentContainerView> behavior = BottomSheetBehavior\n                .from(mainBinding.fragmentPlayerHolder);\n        // do not return to the comment if the details fragment was closed\n        if (behavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {\n            return;\n        }\n\n        // scroll to the root comment once the bottom sheet expansion animation is finished\n        behavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {\n            @Override\n            public void onStateChanged(@NonNull final View bottomSheet,\n                                       final int newState) {\n                if (newState == BottomSheetBehavior.STATE_EXPANDED) {\n                    final Fragment detailFragment = fm.findFragmentById(\n                            R.id.fragment_player_holder);\n                    if (detailFragment instanceof VideoDetailFragment && rootComment != null) {\n                        // should always be the case\n                        ((VideoDetailFragment) detailFragment).scrollToComment(rootComment);\n                    }\n                    behavior.removeBottomSheetCallback(this);\n                }\n            }\n\n            @Override\n            public void onSlide(@NonNull final View bottomSheet, final float slideOffset) {\n                // not needed, listener is removed once the sheet is expanded\n            }\n        });\n\n        behavior.setState(BottomSheetBehavior.STATE_EXPANDED);\n    }\n\n    private boolean bottomSheetHiddenOrCollapsed() {\n        final BottomSheetBehavior<FrameLayout> bottomSheetBehavior =\n                BottomSheetBehavior.from(mainBinding.fragmentPlayerHolder);\n\n        final int sheetState = bottomSheetBehavior.getState();\n        return sheetState == BottomSheetBehavior.STATE_HIDDEN\n                || sheetState == BottomSheetBehavior.STATE_COLLAPSED;\n    }\n\n    private void showKeepAndroidDialog() {\n        final var prefs = PreferenceManager.getDefaultSharedPreferences(this);\n\n        final var now = Instant.now();\n        final var kaoLastCheck = Instant.ofEpochMilli(prefs.getLong(\n                getString(R.string.kao_last_checked_key),\n                0\n        ));\n\n        final var supportedLannguages = List.of(\"fr\", \"de\", \"ca\", \"es\", \"id\", \"it\", \"pl\",\n                \"pt\", \"cs\", \"sk\", \"fa\", \"ar\", \"tr\", \"el\", \"th\", \"ru\", \"uk\", \"ko\", \"zh\", \"ja\");\n        final var locale = Localization.getAppLocale();\n        final String kaoBaseUrl = \"https://keepandroidopen.org/\";\n        final String kaoURI;\n        if (supportedLannguages.contains(locale.getLanguage())) {\n            if (\"zh\".equals(locale.getLanguage())) {\n                kaoURI = kaoBaseUrl + (\"TW\".equals(locale.getCountry()) ? \"zh-TW\" : \"zh-CN\");\n            } else {\n                kaoURI = kaoBaseUrl + locale.getLanguage();\n            }\n        } else {\n            kaoURI = kaoBaseUrl;\n        }\n        final var solutionURI =\n                \"https://github.com/woheller69/FreeDroidWarn?tab=readme-ov-file#solutions\";\n\n        if (kaoLastCheck.plus(30, ChronoUnit.DAYS).isBefore(now)) {\n            final var dialog = new AlertDialog.Builder(this)\n                    .setTitle(\"Keep Android Open\")\n                    .setCancelable(false)\n                    .setMessage(this.getString(R.string.kao_dialog_warning))\n                    .setPositiveButton(this.getString(android.R.string.ok), (d, w) -> {\n                        prefs.edit()\n                                .putLong(\n                                        getString(R.string.kao_last_checked_key),\n                                        now.toEpochMilli()\n                                )\n                                .apply();\n                    })\n                    .setNeutralButton(this.getString(R.string.kao_solution), null)\n                    .setNegativeButton(this.getString(R.string.kao_dialog_more_info), null)\n                    .show();\n\n            // If we use setNeutralButton and etc. dialog will close after pressing the buttons,\n            // but we want it to close only when positive button is pressed\n            dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(v ->\n                    ShareUtils.openUrlInBrowser(this, kaoURI)\n            );\n            dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(v ->\n                    ShareUtils.openUrlInBrowser(this, solutionURI)\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2017-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe\n\nimport android.content.Context\nimport androidx.room.Room.databaseBuilder\nimport kotlin.concurrent.Volatile\nimport org.schabi.newpipe.database.AppDatabase\nimport org.schabi.newpipe.database.Migrations.MIGRATION_1_2\nimport org.schabi.newpipe.database.Migrations.MIGRATION_2_3\nimport org.schabi.newpipe.database.Migrations.MIGRATION_3_4\nimport org.schabi.newpipe.database.Migrations.MIGRATION_4_5\nimport org.schabi.newpipe.database.Migrations.MIGRATION_5_6\nimport org.schabi.newpipe.database.Migrations.MIGRATION_6_7\nimport org.schabi.newpipe.database.Migrations.MIGRATION_7_8\nimport org.schabi.newpipe.database.Migrations.MIGRATION_8_9\n\nobject NewPipeDatabase {\n\n    @Volatile\n    private var databaseInstance: AppDatabase? = null\n\n    private fun getDatabase(context: Context): AppDatabase {\n        return databaseBuilder(\n            context.applicationContext,\n            AppDatabase::class.java,\n            AppDatabase.Companion.DATABASE_NAME\n        ).addMigrations(\n            MIGRATION_1_2,\n            MIGRATION_2_3,\n            MIGRATION_3_4,\n            MIGRATION_4_5,\n            MIGRATION_5_6,\n            MIGRATION_6_7,\n            MIGRATION_7_8,\n            MIGRATION_8_9\n        ).build()\n    }\n\n    @JvmStatic\n    fun getInstance(context: Context): AppDatabase {\n        var result = databaseInstance\n        if (result == null) {\n            synchronized(NewPipeDatabase::class.java) {\n                result = databaseInstance\n                if (result == null) {\n                    databaseInstance = getDatabase(context)\n                    result = databaseInstance\n                }\n            }\n        }\n\n        return result!!\n    }\n\n    @JvmStatic\n    fun checkpoint() {\n        checkNotNull(databaseInstance) { \"database is not initialized\" }\n        val c = databaseInstance!!.query(\"pragma wal_checkpoint(full)\", null)\n        if (c.moveToFirst() && c.getInt(0) == 1) {\n            throw RuntimeException(\"Checkpoint was blocked from completing\")\n        }\n    }\n\n    @JvmStatic\n    fun close() {\n        if (databaseInstance != null) {\n            synchronized(NewPipeDatabase::class.java) {\n                if (databaseInstance != null) {\n                    databaseInstance!!.close()\n                    databaseInstance = null\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/NewVersionWorker.kt",
    "content": "package org.schabi.newpipe\n\nimport android.content.Context\nimport android.content.Intent\nimport android.util.Log\nimport android.widget.Toast\nimport androidx.core.app.NotificationCompat\nimport androidx.core.app.NotificationManagerCompat\nimport androidx.core.app.PendingIntentCompat\nimport androidx.core.content.ContextCompat\nimport androidx.core.content.edit\nimport androidx.core.net.toUri\nimport androidx.preference.PreferenceManager\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.WorkManager\nimport androidx.work.Worker\nimport androidx.work.WorkerParameters\nimport androidx.work.workDataOf\nimport com.grack.nanojson.JsonParser\nimport com.grack.nanojson.JsonParserException\nimport java.io.IOException\nimport org.schabi.newpipe.extractor.downloader.Response\nimport org.schabi.newpipe.extractor.exceptions.ReCaptchaException\nimport org.schabi.newpipe.util.ReleaseVersionUtil\n\nclass NewVersionWorker(\n    context: Context,\n    workerParams: WorkerParameters\n) : Worker(context, workerParams) {\n\n    /**\n     * Method to compare the current and latest available app version.\n     * If a newer version is available, we show the update notification.\n     *\n     * @param versionName    Name of new version\n     * @param apkLocationUrl Url with the new apk\n     * @param versionCode    Code of new version\n     */\n    private fun compareAppVersionAndShowNotification(\n        versionName: String,\n        apkLocationUrl: String?,\n        versionCode: Int\n    ) {\n        if (BuildConfig.VERSION_CODE >= versionCode) {\n            if (inputData.getBoolean(IS_MANUAL, false)) {\n                // Show toast stating that the app is up-to-date if the update check was manual.\n                ContextCompat.getMainExecutor(applicationContext).execute {\n                    Toast.makeText(\n                        applicationContext,\n                        R.string.app_update_unavailable_toast,\n                        Toast.LENGTH_SHORT\n                    ).show()\n                }\n            }\n            return\n        }\n\n        // A pending intent to open the apk location url in the browser.\n        val intent = Intent(Intent.ACTION_VIEW, apkLocationUrl?.toUri())\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n        val pendingIntent = PendingIntentCompat.getActivity(\n            applicationContext,\n            0,\n            intent,\n            0,\n            false\n        )\n        val channelId = applicationContext.getString(R.string.app_update_notification_channel_id)\n        val notificationBuilder = NotificationCompat.Builder(applicationContext, channelId)\n            .setSmallIcon(R.drawable.ic_newpipe_update)\n            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n            .setAutoCancel(true)\n            .setContentIntent(pendingIntent)\n            .setContentTitle(\n                applicationContext.getString(R.string.app_update_available_notification_title)\n            )\n            .setContentText(\n                applicationContext.getString(\n                    R.string.app_update_available_notification_text,\n                    versionName\n                )\n            )\n\n        val notificationManager = NotificationManagerCompat.from(applicationContext)\n        if (notificationManager.areNotificationsEnabled()) {\n            notificationManager.notify(2000, notificationBuilder.build())\n        }\n    }\n\n    @Throws(IOException::class, ReCaptchaException::class)\n    private fun checkNewVersion() {\n        // Check if the current apk is a github one or not.\n        if (!ReleaseVersionUtil.isReleaseApk) {\n            return\n        }\n\n        if (!inputData.getBoolean(IS_MANUAL, false)) {\n            val prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext)\n            // Check if the last request has happened a certain time ago\n            // to reduce the number of API requests.\n            val expiry = prefs.getLong(applicationContext.getString(R.string.update_expiry_key), 0)\n            if (!ReleaseVersionUtil.isLastUpdateCheckExpired(expiry)) {\n                return\n            }\n        }\n\n        // Make a network request to get latest NewPipe data.\n        val response = DownloaderImpl.getInstance().get(NEWPIPE_API_URL)\n        handleResponse(response)\n    }\n\n    private fun handleResponse(response: Response) {\n        val prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext)\n        try {\n            // Store a timestamp which needs to be exceeded,\n            // before a new request to the API is made.\n            val newExpiry = ReleaseVersionUtil.coerceUpdateCheckExpiry(response.getHeader(\"expires\"))\n            prefs.edit {\n                putLong(applicationContext.getString(R.string.update_expiry_key), newExpiry)\n            }\n        } catch (e: Exception) {\n            if (DEBUG) {\n                Log.w(TAG, \"Could not extract and save new expiry date\", e)\n            }\n        }\n\n        // Parse the json from the response.\n        try {\n            val newpipeVersionInfo = JsonParser.`object`()\n                .from(response.responseBody()).getObject(\"flavors\")\n                .getObject(\"newpipe\")\n\n            val versionName = newpipeVersionInfo.getString(\"version\")\n            val versionCode = newpipeVersionInfo.getInt(\"version_code\")\n            val apkLocationUrl = newpipeVersionInfo.getString(\"apk\")\n            compareAppVersionAndShowNotification(versionName, apkLocationUrl, versionCode)\n        } catch (e: JsonParserException) {\n            // Most likely something is wrong in data received from NEWPIPE_API_URL.\n            // Do not alarm user and fail silently.\n            if (DEBUG) {\n                Log.w(TAG, \"Could not get NewPipe API: invalid json\", e)\n            }\n        }\n    }\n\n    override fun doWork(): Result {\n        return try {\n            checkNewVersion()\n            Result.success()\n        } catch (e: IOException) {\n            Log.w(TAG, \"Could not fetch NewPipe API: probably network problem\", e)\n            Result.failure()\n        } catch (e: ReCaptchaException) {\n            Log.e(TAG, \"ReCaptchaException should never happen here.\", e)\n            Result.failure()\n        }\n    }\n\n    companion object {\n        private val DEBUG = MainActivity.DEBUG\n        private val TAG = NewVersionWorker::class.java.simpleName\n        private const val NEWPIPE_API_URL = \"https://newpipe.net/api/data.json\"\n        private const val IS_MANUAL = \"isManual\"\n\n        /**\n         * Start a new worker which checks if all conditions for performing a version check are met,\n         * fetches the API endpoint [.NEWPIPE_API_URL] containing info about the latest NewPipe\n         * version and displays a notification about an available update if one is available.\n         * <br></br>\n         * Following conditions need to be met, before data is requested from the server:\n         *\n         *  *  The app is signed with the correct signing key (by TeamNewPipe / schabi).\n         * If the signing key differs from the one used upstream, the update cannot be installed.\n         *  * The user enabled searching for and notifying about updates in the settings.\n         *  * The app did not recently check for updates.\n         * We do not want to make unnecessary connections and DOS our servers.\n         */\n        @JvmStatic\n        fun enqueueNewVersionCheckingWork(context: Context, isManual: Boolean) {\n            val workRequest = OneTimeWorkRequestBuilder<NewVersionWorker>()\n                .setInputData(workDataOf(IS_MANUAL to isManual))\n                .build()\n            WorkManager.getInstance(context).enqueue(workRequest)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/PanicResponderActivity.java",
    "content": "package org.schabi.newpipe;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\n\n/*\n * Copyright (C) Hans-Christoph Steiner 2016 <hans@eds.org>\n * PanicResponderActivity.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic class PanicResponderActivity extends Activity {\n    public static final String PANIC_TRIGGER_ACTION = \"info.guardianproject.panic.action.TRIGGER\";\n\n    @SuppressLint(\"NewApi\")\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        final Intent intent = getIntent();\n        if (intent != null && PANIC_TRIGGER_ACTION.equals(intent.getAction())) {\n            // TODO: Explicitly clear the search results\n            //  once they are restored when the app restarts\n            //  or if the app reloads the current video after being killed,\n            //  that should be cleared also\n            ExitActivity.exitAndRemoveFromRecentApps(this);\n        }\n\n        finishAndRemoveTask();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/QueueItemMenuUtil.java",
    "content": "package org.schabi.newpipe;\n\nimport static org.schabi.newpipe.util.SparseItemUtil.fetchStreamInfoAndSaveToDatabase;\nimport static org.schabi.newpipe.util.external_communication.ShareUtils.shareText;\n\nimport android.content.Context;\nimport android.view.ContextThemeWrapper;\nimport android.view.View;\nimport android.widget.PopupMenu;\n\nimport androidx.fragment.app.FragmentManager;\n\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.download.DownloadDialog;\nimport org.schabi.newpipe.local.dialog.PlaylistDialog;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.SparseItemUtil;\n\nimport java.util.List;\n\npublic final class QueueItemMenuUtil {\n    private QueueItemMenuUtil() {\n    }\n\n    public static void openPopupMenu(final PlayQueue playQueue,\n                                     final PlayQueueItem item,\n                                     final View view,\n                                     final boolean hideDetails,\n                                     final FragmentManager fragmentManager,\n                                     final Context context) {\n        final ContextThemeWrapper themeWrapper =\n                new ContextThemeWrapper(context, R.style.DarkPopupMenu);\n\n        final PopupMenu popupMenu = new PopupMenu(themeWrapper, view);\n        popupMenu.inflate(R.menu.menu_play_queue_item);\n\n        if (hideDetails) {\n            popupMenu.getMenu().findItem(R.id.menu_item_details).setVisible(false);\n        }\n\n        popupMenu.setOnMenuItemClickListener(menuItem -> {\n            final int itemId = menuItem.getItemId();\n            if (itemId == R.id.menu_item_remove) {\n                final int index = playQueue.indexOf(item);\n                playQueue.remove(index);\n                return true;\n            } else if (itemId == R.id.menu_item_details) {\n                // playQueue is null since we don't want any queue change\n                NavigationHelper.openVideoDetail(context, item.getServiceId(),\n                        item.getUrl(), item.getTitle(), null,\n                        false);\n                return true;\n            } else if (itemId == R.id.menu_item_append_playlist) {\n                PlaylistDialog.createCorrespondingDialog(\n                        context,\n                        List.of(new StreamEntity(item)),\n                        dialog -> dialog.show(\n                                fragmentManager,\n                                \"QueueItemMenuUtil@append_playlist\"\n                        )\n                );\n\n                return true;\n            } else if (itemId == R.id.menu_item_channel_details) {\n                SparseItemUtil.fetchUploaderUrlIfSparse(context, item.getServiceId(),\n                        item.getUrl(), item.getUploaderUrl(),\n                        // An intent must be used here.\n                        // Opening with FragmentManager transactions is not working,\n                        // as PlayQueueActivity doesn't use fragments.\n                        uploaderUrl -> NavigationHelper.openChannelFragmentUsingIntent(\n                                context, item.getServiceId(), uploaderUrl, item.getUploader()\n                        ));\n                return true;\n            } else if (itemId == R.id.menu_item_share) {\n                shareText(context, item.getTitle(), item.getUrl(),\n                        item.getThumbnails());\n                return true;\n            } else if (itemId == R.id.menu_item_download) {\n                fetchStreamInfoAndSaveToDatabase(context, item.getServiceId(), item.getUrl(),\n                        info -> {\n                            final DownloadDialog downloadDialog = new DownloadDialog(context,\n                                    info);\n                            downloadDialog.show(fragmentManager, \"downloadDialog\");\n                        });\n                return true;\n            }\n            return false;\n        });\n\n        popupMenu.show();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/RouterActivity.java",
    "content": "package org.schabi.newpipe;\n\nimport static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.AUDIO;\nimport static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.VIDEO;\n\nimport android.annotation.SuppressLint;\nimport android.app.IntentService;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.pm.PackageManager;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport android.view.ContextThemeWrapper;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.WindowManager;\nimport android.widget.Button;\nimport android.widget.RadioButton;\nimport android.widget.RadioGroup;\nimport android.widget.Toast;\n\nimport androidx.annotation.DrawableRes;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.content.res.AppCompatResources;\nimport androidx.core.app.NotificationCompat;\nimport androidx.core.app.ServiceCompat;\nimport androidx.core.math.MathUtils;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.lifecycle.DefaultLifecycleObserver;\nimport androidx.lifecycle.Lifecycle;\nimport androidx.lifecycle.LifecycleOwner;\nimport androidx.preference.PreferenceManager;\n\nimport com.evernote.android.state.State;\nimport com.livefront.bridge.Bridge;\n\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.databinding.ListRadioIconItemBinding;\nimport org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding;\nimport org.schabi.newpipe.download.DownloadDialog;\nimport org.schabi.newpipe.download.LoadingDialog;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.ReCaptchaActivity;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.Info;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.StreamingService.LinkType;\nimport org.schabi.newpipe.extractor.channel.ChannelInfo;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;\nimport org.schabi.newpipe.extractor.playlist.PlaylistInfo;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.local.dialog.PlaylistDialog;\nimport org.schabi.newpipe.player.PlayerType;\nimport org.schabi.newpipe.player.helper.PlayerHelper;\nimport org.schabi.newpipe.player.helper.PlayerHolder;\nimport org.schabi.newpipe.player.playqueue.ChannelTabPlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlaylistPlayQueue;\nimport org.schabi.newpipe.player.playqueue.SinglePlayQueue;\nimport org.schabi.newpipe.util.ChannelTabHelper;\nimport org.schabi.newpipe.util.Constants;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.ExtractorHelper;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.PermissionHelper;\nimport org.schabi.newpipe.util.ThemeHelper;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\nimport org.schabi.newpipe.util.urlfinder.UrlFinder;\nimport org.schabi.newpipe.views.FocusOverlayView;\n\nimport java.io.Serializable;\nimport java.lang.ref.Reference;\nimport java.lang.ref.WeakReference;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.function.Consumer;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Observable;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\n/**\n * Get the url from the intent and open it in the chosen preferred player.\n */\npublic class RouterActivity extends AppCompatActivity {\n    protected final CompositeDisposable disposables = new CompositeDisposable();\n    @State\n    protected int currentServiceId = -1;\n    @State\n    protected LinkType currentLinkType;\n    @State\n    protected int selectedRadioPosition = -1;\n    protected int selectedPreviously = -1;\n    protected String currentUrl;\n    private StreamingService currentService;\n    private boolean selectionIsDownload = false;\n    private boolean selectionIsAddToPlaylist = false;\n    private AlertDialog alertDialogChoice = null;\n    private FragmentManager.FragmentLifecycleCallbacks dismissListener = null;\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        ThemeHelper.setDayNightMode(this);\n        setTheme(ThemeHelper.isLightThemeSelected(this)\n                ? R.style.RouterActivityThemeLight : R.style.RouterActivityThemeDark);\n\n        // Pass-through touch events to background activities\n        // so that our transparent window won't lock UI in the mean time\n        // network request is underway before showing PlaylistDialog or DownloadDialog\n        // (ref: https://stackoverflow.com/a/10606141)\n        getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE\n                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL\n                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);\n\n        // Android never fails to impress us with a list of new restrictions per API.\n        // Starting with S (Android 12) one of the prerequisite conditions has to be met\n        // before the FLAG_NOT_TOUCHABLE flag is allowed to kick in:\n        // @see WindowManager.LayoutParams#FLAG_NOT_TOUCHABLE\n        // For our present purpose it seems we can just set LayoutParams.alpha to 0\n        // on the strength of \"4. Fully transparent windows\" without affecting the scrim of dialogs\n        final WindowManager.LayoutParams params = getWindow().getAttributes();\n        params.alpha = 0f;\n        getWindow().setAttributes(params);\n\n        super.onCreate(savedInstanceState);\n        Bridge.restoreInstanceState(this, savedInstanceState);\n\n        // FragmentManager will take care to recreate (Playlist|Download)Dialog when screen rotates\n        // We used to .setOnDismissListener(dialog -> finish()); when creating these DialogFragments\n        // but those callbacks won't survive a config change\n        // Try an alternate approach to hook into FragmentManager instead, to that effect\n        // (ref: https://stackoverflow.com/a/44028453)\n        final FragmentManager fm = getSupportFragmentManager();\n        if (dismissListener == null) {\n            dismissListener = new FragmentManager.FragmentLifecycleCallbacks() {\n                @Override\n                public void onFragmentDestroyed(@NonNull final FragmentManager fm,\n                                                @NonNull final Fragment f) {\n                    super.onFragmentDestroyed(fm, f);\n                    if (f instanceof DialogFragment && fm.getFragments().isEmpty()) {\n                        // No more DialogFragments, we're done\n                        finish();\n                    }\n                }\n            };\n        }\n        fm.registerFragmentLifecycleCallbacks(dismissListener, false);\n\n        if (TextUtils.isEmpty(currentUrl)) {\n            currentUrl = getUrl(getIntent());\n\n            if (TextUtils.isEmpty(currentUrl)) {\n                handleText();\n                finish();\n            }\n        }\n    }\n\n    @Override\n    protected void onStop() {\n        super.onStop();\n        // we need to dismiss the dialog before leaving the activity or we get leaks\n        if (alertDialogChoice != null) {\n            alertDialogChoice.dismiss();\n        }\n    }\n\n    @Override\n    protected void onSaveInstanceState(@NonNull final Bundle outState) {\n        super.onSaveInstanceState(outState);\n        Bridge.saveInstanceState(this, outState);\n    }\n\n    @Override\n    protected void onStart() {\n        super.onStart();\n\n        // Don't overlap the DialogFragment after rotating the screen\n        // If there's no DialogFragment, we're either starting afresh\n        // or we didn't make it to PlaylistDialog or DownloadDialog before the orientation change\n        if (getSupportFragmentManager().getFragments().isEmpty()) {\n            // Start over from scratch\n            handleUrl(currentUrl);\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n\n        if (dismissListener != null) {\n            getSupportFragmentManager().unregisterFragmentLifecycleCallbacks(dismissListener);\n        }\n\n        disposables.clear();\n    }\n\n    @Override\n    public void finish() {\n        // allow the activity to recreate in case orientation changes\n        if (!isChangingConfigurations()) {\n            super.finish();\n        }\n    }\n\n    private void handleUrl(final String url) {\n        disposables.add(Observable\n                .fromCallable(() -> {\n                    try {\n                        if (currentServiceId == -1) {\n                            currentService = NewPipe.getServiceByUrl(url);\n                            currentServiceId = currentService.getServiceId();\n                            currentLinkType = currentService.getLinkTypeByUrl(url);\n                            currentUrl = url;\n                        } else {\n                            currentService = NewPipe.getService(currentServiceId);\n                        }\n\n                        // return whether the url was found to be supported or not\n                        return currentLinkType != LinkType.NONE;\n                    } catch (final ExtractionException e) {\n                        // this can be reached only when the url is completely unsupported\n                        return false;\n                    }\n                })\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(isUrlSupported -> {\n                    if (isUrlSupported) {\n                        onSuccess();\n                    } else {\n                        showUnsupportedUrlDialog(url);\n                    }\n                }, throwable -> handleError(this, new ErrorInfo(throwable,\n                        UserAction.SHARE_TO_NEWPIPE, \"Getting service from url: \" + url,\n                        null, url))));\n    }\n\n    /**\n     * @param context the context. It will be {@code finish()}ed at the end of the handling if it is\n     *                an instance of {@link RouterActivity}.\n     * @param errorInfo the error information\n     */\n    private static void handleError(final Context context, final ErrorInfo errorInfo) {\n        if (errorInfo.getRecaptchaUrl() != null) {\n            Toast.makeText(context, R.string.recaptcha_request_toast, Toast.LENGTH_LONG).show();\n            // Starting ReCaptcha Challenge Activity\n            final Intent intent = new Intent(context, ReCaptchaActivity.class);\n            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n            intent.putExtra(ReCaptchaActivity.RECAPTCHA_URL_EXTRA, errorInfo.getRecaptchaUrl());\n            context.startActivity(intent);\n        } else if (errorInfo.isReportable()) {\n            ErrorUtil.createNotification(context, errorInfo);\n        } else {\n            // this exception does not usually indicate a problem that should be reported,\n            // so just show a toast instead of the notification\n            Toast.makeText(context, errorInfo.getMessage(context), Toast.LENGTH_LONG).show();\n        }\n\n        if (context instanceof RouterActivity) {\n            ((RouterActivity) context).finish();\n        }\n    }\n\n    protected void showUnsupportedUrlDialog(final String url) {\n        final Context context = getThemeWrapperContext();\n        new AlertDialog.Builder(context)\n                .setTitle(R.string.unsupported_url)\n                .setMessage(R.string.unsupported_url_dialog_message)\n                .setIcon(R.drawable.ic_share)\n                .setPositiveButton(R.string.open_in_browser,\n                        (dialog, which) -> ShareUtils.openUrlInBrowser(this, url))\n                .setNegativeButton(R.string.share,\n                        (dialog, which) -> ShareUtils.shareText(this, \"\", url)) // no subject\n                .setNeutralButton(R.string.cancel, null)\n                .setOnDismissListener(dialog -> finish())\n                .show();\n    }\n\n    protected void onSuccess() {\n        final SharedPreferences preferences = PreferenceManager\n                .getDefaultSharedPreferences(this);\n\n        final ChoiceAvailabilityChecker choiceChecker = new ChoiceAvailabilityChecker(\n                getChoicesForService(currentService, currentLinkType),\n                preferences.getString(getString(R.string.preferred_open_action_key),\n                        getString(R.string.preferred_open_action_default)));\n\n        // Check for non-player related choices\n        if (choiceChecker.isAvailableAndSelected(\n                R.string.show_info_key,\n                R.string.download_key,\n                R.string.add_to_playlist_key)) {\n            handleChoice(choiceChecker.getSelectedChoiceKey());\n            return;\n        }\n        // Check if the choice is player related\n        if (choiceChecker.isAvailableAndSelected(\n                R.string.video_player_key,\n                R.string.background_player_key,\n                R.string.popup_player_key,\n                R.string.enqueue_key)) {\n\n            final String selectedChoice = choiceChecker.getSelectedChoiceKey();\n\n            final boolean isExtVideoEnabled = preferences.getBoolean(\n                    getString(R.string.use_external_video_player_key), false);\n            final boolean isExtAudioEnabled = preferences.getBoolean(\n                    getString(R.string.use_external_audio_player_key), false);\n            final boolean isVideoPlayerSelected =\n                    selectedChoice.equals(getString(R.string.video_player_key))\n                            || selectedChoice.equals(getString(R.string.popup_player_key));\n            final boolean isAudioPlayerSelected =\n                    selectedChoice.equals(getString(R.string.background_player_key));\n            final boolean isEnqueueSelected =\n                    selectedChoice.equals(getString(R.string.enqueue_key));\n\n            if (currentLinkType != LinkType.STREAM\n                    && ((isExtAudioEnabled && isAudioPlayerSelected)\n                    || (isExtVideoEnabled && isVideoPlayerSelected))\n            ) {\n                Toast.makeText(this, R.string.external_player_unsupported_link_type,\n                        Toast.LENGTH_LONG).show();\n                handleChoice(getString(R.string.show_info_key));\n                return;\n            }\n\n            final var capabilities = currentService.getServiceInfo().getMediaCapabilities();\n\n            // Check if the service supports the choice\n            if ((isVideoPlayerSelected && capabilities.contains(VIDEO))\n                    || (isAudioPlayerSelected && capabilities.contains(AUDIO))\n                    || (isEnqueueSelected && (capabilities.contains(VIDEO)\n                    || capabilities.contains(AUDIO)))) {\n                handleChoice(selectedChoice);\n            } else {\n                handleChoice(getString(R.string.show_info_key));\n            }\n            return;\n        }\n\n        // Default / Ask always\n        final List<AdapterChoiceItem> availableChoices = choiceChecker.getAvailableChoices();\n        switch (availableChoices.size()) {\n            case 1:\n                handleChoice(availableChoices.get(0).key);\n                break;\n            case 0:\n                handleChoice(getString(R.string.show_info_key));\n                break;\n            default:\n                showDialog(availableChoices);\n                break;\n        }\n    }\n\n    /**\n     * This is a helper class for checking if the choices are available and/or selected.\n     */\n    class ChoiceAvailabilityChecker {\n        private final List<AdapterChoiceItem> availableChoices;\n        private final String selectedChoiceKey;\n\n        ChoiceAvailabilityChecker(\n                @NonNull final List<AdapterChoiceItem> availableChoices,\n                @NonNull final String selectedChoiceKey) {\n            this.availableChoices = availableChoices;\n            this.selectedChoiceKey = selectedChoiceKey;\n        }\n\n        public List<AdapterChoiceItem> getAvailableChoices() {\n            return availableChoices;\n        }\n\n        public String getSelectedChoiceKey() {\n            return selectedChoiceKey;\n        }\n\n        public boolean isAvailableAndSelected(@StringRes final int... wantedKeys) {\n            return Arrays.stream(wantedKeys).anyMatch(this::isAvailableAndSelected);\n        }\n\n        public boolean isAvailableAndSelected(@StringRes final int wantedKey) {\n            final String wanted = getString(wantedKey);\n            // Check if the wanted option is selected\n            if (!selectedChoiceKey.equals(wanted)) {\n                return false;\n            }\n            // Check if it's available\n            return availableChoices.stream().anyMatch(item -> wanted.equals(item.key));\n        }\n    }\n\n    private void showDialog(final List<AdapterChoiceItem> choices) {\n        final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);\n\n        final Context themeWrapperContext = getThemeWrapperContext();\n        final LayoutInflater layoutInflater = LayoutInflater.from(themeWrapperContext);\n\n        final SingleChoiceDialogViewBinding binding =\n                SingleChoiceDialogViewBinding.inflate(layoutInflater);\n        final RadioGroup radioGroup = binding.list;\n\n        final DialogInterface.OnClickListener dialogButtonsClickListener = (dialog, which) -> {\n            final int indexOfChild = radioGroup.indexOfChild(\n                    radioGroup.findViewById(radioGroup.getCheckedRadioButtonId()));\n            final AdapterChoiceItem choice = choices.get(indexOfChild);\n\n            handleChoice(choice.key);\n\n            // open future streams always like this one, because \"always\" button was used by user\n            if (which == DialogInterface.BUTTON_POSITIVE) {\n                preferences.edit()\n                        .putString(getString(R.string.preferred_open_action_key), choice.key)\n                        .apply();\n            }\n        };\n\n        alertDialogChoice = new AlertDialog.Builder(themeWrapperContext)\n                .setTitle(R.string.preferred_open_action_share_menu_title)\n                .setView(binding.getRoot())\n                .setCancelable(true)\n                .setNegativeButton(R.string.just_once, dialogButtonsClickListener)\n                .setPositiveButton(R.string.always, dialogButtonsClickListener)\n                .setOnDismissListener(dialog -> {\n                    if (!selectionIsDownload && !selectionIsAddToPlaylist) {\n                        finish();\n                    }\n                })\n                .create();\n\n        alertDialogChoice.setOnShowListener(dialog -> setDialogButtonsState(\n                alertDialogChoice, radioGroup.getCheckedRadioButtonId() != -1));\n\n        radioGroup.setOnCheckedChangeListener((group, checkedId) ->\n                setDialogButtonsState(alertDialogChoice, true));\n        final View.OnClickListener radioButtonsClickListener = v -> {\n            final int indexOfChild = radioGroup.indexOfChild(v);\n            if (indexOfChild == -1) {\n                return;\n            }\n\n            selectedPreviously = selectedRadioPosition;\n            selectedRadioPosition = indexOfChild;\n\n            if (selectedPreviously == selectedRadioPosition) {\n                handleChoice(choices.get(selectedRadioPosition).key);\n            }\n        };\n\n        int id = 12345;\n        for (final AdapterChoiceItem item : choices) {\n            final RadioButton radioButton = ListRadioIconItemBinding.inflate(layoutInflater)\n                    .getRoot();\n            radioButton.setText(item.description);\n            radioButton.setCompoundDrawablesRelativeWithIntrinsicBounds(\n                    AppCompatResources.getDrawable(themeWrapperContext, item.icon),\n                    null, null, null);\n            radioButton.setChecked(false);\n            radioButton.setId(id++);\n            radioButton.setLayoutParams(new RadioGroup.LayoutParams(\n                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));\n            radioButton.setOnClickListener(radioButtonsClickListener);\n            radioGroup.addView(radioButton);\n        }\n\n        if (selectedRadioPosition == -1) {\n            final String lastSelectedPlayer = preferences.getString(\n                    getString(R.string.preferred_open_action_last_selected_key), null);\n            if (!TextUtils.isEmpty(lastSelectedPlayer)) {\n                for (int i = 0; i < choices.size(); i++) {\n                    final AdapterChoiceItem c = choices.get(i);\n                    if (lastSelectedPlayer.equals(c.key)) {\n                        selectedRadioPosition = i;\n                        break;\n                    }\n                }\n            }\n        }\n\n        selectedRadioPosition = MathUtils.clamp(selectedRadioPosition, -1, choices.size() - 1);\n        if (selectedRadioPosition != -1) {\n            ((RadioButton) radioGroup.getChildAt(selectedRadioPosition)).setChecked(true);\n        }\n        selectedPreviously = selectedRadioPosition;\n\n        alertDialogChoice.show();\n\n        if (DeviceUtils.isTv(this)) {\n            FocusOverlayView.setupFocusObserver(alertDialogChoice);\n        }\n    }\n\n    private List<AdapterChoiceItem> getChoicesForService(final StreamingService service,\n                                                         final LinkType linkType) {\n        final AdapterChoiceItem showInfo = new AdapterChoiceItem(\n                getString(R.string.show_info_key), getString(R.string.show_info),\n                R.drawable.ic_info_outline);\n        final AdapterChoiceItem videoPlayer = new AdapterChoiceItem(\n                getString(R.string.video_player_key), getString(R.string.video_player),\n                R.drawable.ic_play_arrow);\n        final AdapterChoiceItem backgroundPlayer = new AdapterChoiceItem(\n                getString(R.string.background_player_key), getString(R.string.background_player),\n                R.drawable.ic_headset);\n        final AdapterChoiceItem popupPlayer = new AdapterChoiceItem(\n                getString(R.string.popup_player_key), getString(R.string.popup_player),\n                R.drawable.ic_picture_in_picture);\n\n        final List<AdapterChoiceItem> returnedItems = new ArrayList<>();\n        returnedItems.add(showInfo); // Always present\n\n        final var capabilities = service.getServiceInfo().getMediaCapabilities();\n\n        if (linkType == LinkType.STREAM || linkType == LinkType.PLAYLIST) {\n            if (capabilities.contains(VIDEO)) {\n                returnedItems.add(videoPlayer);\n                returnedItems.add(popupPlayer);\n            }\n            if (capabilities.contains(AUDIO)) {\n                returnedItems.add(backgroundPlayer);\n            }\n\n            // Enqueue is only shown if the current queue is not empty.\n            // However, if the playqueue or the player is cleared after this item was chosen and\n            // while the item is extracted, it will automatically fall back to background player.\n            if (PlayerHolder.getInstance().getQueueSize() > 0) {\n                returnedItems.add(new AdapterChoiceItem(getString(R.string.enqueue_key),\n                        getString(R.string.enqueue_stream), R.drawable.ic_add));\n            }\n\n            if (linkType == LinkType.STREAM) {\n                // download is redundant for linkType CHANNEL AND PLAYLIST\n                // (till playlist downloading is not supported )\n                returnedItems.add(new AdapterChoiceItem(getString(R.string.download_key),\n                        getString(R.string.download),\n                        R.drawable.ic_file_download));\n\n                // Add to playlist is not necessary for CHANNEL and PLAYLIST linkType\n                // since those can not be added to a playlist\n                returnedItems.add(new AdapterChoiceItem(getString(R.string.add_to_playlist_key),\n                        getString(R.string.add_to_playlist),\n                        R.drawable.ic_playlist_add));\n            }\n        } else {\n            // LinkType.NONE is never present because it's filtered out before\n            // channels and playlist can be played as they contain a list of videos\n            final SharedPreferences preferences = PreferenceManager\n                    .getDefaultSharedPreferences(this);\n            final boolean isExtVideoEnabled = preferences.getBoolean(\n                    getString(R.string.use_external_video_player_key), false);\n            final boolean isExtAudioEnabled = preferences.getBoolean(\n                    getString(R.string.use_external_audio_player_key), false);\n\n            if (capabilities.contains(VIDEO) && !isExtVideoEnabled) {\n                returnedItems.add(videoPlayer);\n                returnedItems.add(popupPlayer);\n            }\n            if (capabilities.contains(AUDIO) && !isExtAudioEnabled) {\n                returnedItems.add(backgroundPlayer);\n            }\n        }\n\n        return returnedItems;\n    }\n\n    protected Context getThemeWrapperContext() {\n        return new ContextThemeWrapper(this, ThemeHelper.isLightThemeSelected(this)\n                ? R.style.LightTheme : R.style.DarkTheme);\n    }\n\n    private void setDialogButtonsState(final AlertDialog dialog, final boolean state) {\n        final Button negativeButton = dialog.getButton(DialogInterface.BUTTON_NEGATIVE);\n        final Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);\n        if (negativeButton == null || positiveButton == null) {\n            return;\n        }\n\n        negativeButton.setEnabled(state);\n        positiveButton.setEnabled(state);\n    }\n\n    private void handleText() {\n        final String searchString = getIntent().getStringExtra(Intent.EXTRA_TEXT);\n        final int serviceId = getIntent().getIntExtra(Constants.KEY_SERVICE_ID, 0);\n        final Intent intent = new Intent(getThemeWrapperContext(), MainActivity.class);\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        startActivity(intent);\n        NavigationHelper.openSearch(getThemeWrapperContext(), serviceId, searchString);\n    }\n\n    private void handleChoice(final String selectedChoiceKey) {\n        final List<String> validChoicesList = Arrays.asList(getResources()\n                .getStringArray(R.array.preferred_open_action_values_list));\n        if (validChoicesList.contains(selectedChoiceKey)) {\n            PreferenceManager.getDefaultSharedPreferences(this).edit()\n                    .putString(getString(\n                            R.string.preferred_open_action_last_selected_key), selectedChoiceKey)\n                    .apply();\n        }\n\n        if (selectedChoiceKey.equals(getString(R.string.popup_player_key))\n                && !PermissionHelper.isPopupEnabledElseAsk(this)) {\n            finish();\n            return;\n        }\n\n        if (selectedChoiceKey.equals(getString(R.string.download_key))) {\n            if (PermissionHelper.checkStoragePermissions(this,\n                    PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) {\n                selectionIsDownload = true;\n                openDownloadDialog();\n            }\n            return;\n        }\n\n        if (selectedChoiceKey.equals(getString(R.string.add_to_playlist_key))) {\n            selectionIsAddToPlaylist = true;\n            openAddToPlaylistDialog();\n            return;\n        }\n\n        // stop and bypass FetcherService if InfoScreen was selected since\n        // StreamDetailFragment can fetch data itself\n        if (selectedChoiceKey.equals(getString(R.string.show_info_key))\n                || canHandleChoiceLikeShowInfo(selectedChoiceKey)) {\n            disposables.add(Observable\n                    .fromCallable(() -> NavigationHelper.getIntentByLink(this, currentUrl))\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(intent -> {\n                        startActivity(intent);\n                        finish();\n                    }, throwable -> handleError(this, new ErrorInfo(throwable,\n                            UserAction.SHARE_TO_NEWPIPE, \"Starting info activity: \" + currentUrl,\n                            null, currentUrl)))\n            );\n            return;\n        }\n\n        final Intent intent = new Intent(this, FetcherService.class);\n        final Choice choice = new Choice(currentService.getServiceId(), currentLinkType,\n                currentUrl, selectedChoiceKey);\n        intent.putExtra(FetcherService.KEY_CHOICE, choice);\n        startService(intent);\n\n        finish();\n    }\n\n    private boolean canHandleChoiceLikeShowInfo(final String selectedChoiceKey) {\n        if (!selectedChoiceKey.equals(getString(R.string.video_player_key))) {\n            return false;\n        }\n        // \"video player\" can be handled like \"show info\" (because VideoDetailFragment can load\n        // the stream instead of FetcherService) when...\n\n        // ...Autoplay is enabled\n        if (!PlayerHelper.isAutoplayAllowedByUser(getThemeWrapperContext())) {\n            return false;\n        }\n\n        final boolean isExtVideoEnabled = PreferenceManager.getDefaultSharedPreferences(this)\n                .getBoolean(getString(R.string.use_external_video_player_key), false);\n        // ...it's not done via an external player\n        if (isExtVideoEnabled) {\n            return false;\n        }\n\n        // ...the player is not running or in normal Video-mode/type\n        final PlayerType playerType = PlayerHolder.getInstance().getType();\n        return playerType == null || playerType == PlayerType.MAIN;\n    }\n\n    public static class PersistentFragment extends Fragment {\n        private WeakReference<AppCompatActivity> weakContext;\n        private final CompositeDisposable disposables = new CompositeDisposable();\n        private int running = 0;\n\n        private synchronized void inFlight(final boolean started) {\n            if (started) {\n                running++;\n            } else {\n                running--;\n                if (running <= 0) {\n                    getActivityContext().ifPresent(context -> context.getSupportFragmentManager()\n                            .beginTransaction().remove(this).commit());\n                }\n            }\n        }\n\n        @Override\n        public void onAttach(@NonNull final Context activityContext) {\n            super.onAttach(activityContext);\n            weakContext = new WeakReference<>((AppCompatActivity) activityContext);\n        }\n\n        @Override\n        public void onDetach() {\n            super.onDetach();\n            weakContext = null;\n        }\n\n        @SuppressWarnings(\"deprecation\")\n        @Override\n        public void onCreate(final Bundle savedInstanceState) {\n            super.onCreate(savedInstanceState);\n            setRetainInstance(true);\n        }\n\n        @Override\n        public void onDestroy() {\n            super.onDestroy();\n            disposables.clear();\n        }\n\n        /**\n         * @return the activity context, if there is one and the activity is not finishing\n         */\n        private Optional<AppCompatActivity> getActivityContext() {\n            return Optional.ofNullable(weakContext)\n                    .map(Reference::get)\n                    .filter(context -> !context.isFinishing());\n        }\n\n        // guard against IllegalStateException in calling DialogFragment.show() whilst in background\n        // (which could happen, say, when the user pressed the home button while waiting for\n        // the network request to return) when it internally calls FragmentTransaction.commit()\n        // after the FragmentManager has saved its states (isStateSaved() == true)\n        // (ref: https://stackoverflow.com/a/39813506)\n        private void runOnVisible(final Consumer<AppCompatActivity> runnable) {\n            getActivityContext().ifPresentOrElse(context -> {\n                if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {\n                    context.runOnUiThread(() -> {\n                        runnable.accept(context);\n                        inFlight(false);\n                    });\n                } else {\n                    getLifecycle().addObserver(new DefaultLifecycleObserver() {\n                        @Override\n                        public void onResume(@NonNull final LifecycleOwner owner) {\n                            getLifecycle().removeObserver(this);\n                            getActivityContext().ifPresentOrElse(context ->\n                                    context.runOnUiThread(() -> {\n                                        runnable.accept(context);\n                                        inFlight(false);\n                                    }),\n                                    () -> inFlight(false)\n                            );\n                        }\n                    });\n                    // this trick doesn't seem to work on Android 10+ (API 29)\n                    // which places restrictions on starting activities from the background\n                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q\n                            && !context.isChangingConfigurations()) {\n                        // try to bring the activity back to front if minimised\n                        final Intent i = new Intent(context, RouterActivity.class);\n                        i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);\n                        startActivity(i);\n                    }\n                }\n\n            }, () ->\n                // this branch is executed if there is no activity context\n                inFlight(false)\n            );\n        }\n\n        <T> Single<T> pleaseWait(final Single<T> single) {\n            // 'abuse' ambWith() here to cancel the toast for us when the wait is over\n            return single.ambWith(Single.create(emitter -> getActivityContext().ifPresent(context ->\n                    context.runOnUiThread(() -> {\n                        // Getting the stream info usually takes a moment\n                        // Notifying the user here to ensure that no confusion arises\n                        final Toast toast = Toast.makeText(context,\n                                getString(R.string.processing_may_take_a_moment),\n                                Toast.LENGTH_LONG);\n                        toast.show();\n                        emitter.setCancellable(toast::cancel);\n            }))));\n        }\n\n        @SuppressLint(\"CheckResult\")\n        private void openDownloadDialog(final int currentServiceId, final String currentUrl) {\n            inFlight(true);\n            final LoadingDialog loadingDialog = new LoadingDialog(R.string.loading_metadata_title);\n            loadingDialog.show(getParentFragmentManager(), \"loadingDialog\");\n            disposables.add(ExtractorHelper.getStreamInfo(currentServiceId, currentUrl, true)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .compose(this::pleaseWait)\n                    .subscribe(result ->\n                        runOnVisible(ctx -> {\n                            loadingDialog.dismiss();\n                            final FragmentManager fm = ctx.getSupportFragmentManager();\n                            final DownloadDialog downloadDialog = new DownloadDialog(ctx, result);\n                            // dismiss listener to be handled by FragmentManager\n                            downloadDialog.show(fm, \"downloadDialog\");\n                        }\n                        ), throwable -> runOnVisible(ctx -> {\n                        loadingDialog.dismiss();\n                        ((RouterActivity) ctx).showUnsupportedUrlDialog(currentUrl);\n                    })));\n        }\n\n        private void openAddToPlaylistDialog(final int currentServiceId, final String currentUrl) {\n            inFlight(true);\n            disposables.add(ExtractorHelper.getStreamInfo(currentServiceId, currentUrl, false)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .compose(this::pleaseWait)\n                    .subscribe(\n                            info -> getActivityContext().ifPresent(context ->\n                                    PlaylistDialog.createCorrespondingDialog(context,\n                                            List.of(new StreamEntity(info)),\n                                            playlistDialog -> runOnVisible(ctx -> {\n                                                // dismiss listener to be handled by FragmentManager\n                                                final FragmentManager fm =\n                                                        ctx.getSupportFragmentManager();\n                                                playlistDialog.show(fm, \"addToPlaylistDialog\");\n                                            })\n                                    )),\n                            throwable -> runOnVisible(ctx -> handleError(ctx, new ErrorInfo(\n                                    throwable, UserAction.REQUESTED_STREAM,\n                                    \"Tried to add \" + currentUrl + \" to a playlist\",\n                                    ((RouterActivity) ctx).currentService.getServiceId(),\n                                    currentUrl)\n                            ))\n                    )\n            );\n        }\n    }\n\n    private void openAddToPlaylistDialog() {\n        getPersistFragment().openAddToPlaylistDialog(currentServiceId, currentUrl);\n    }\n\n    private void openDownloadDialog() {\n        getPersistFragment().openDownloadDialog(currentServiceId, currentUrl);\n    }\n\n    private PersistentFragment getPersistFragment() {\n        final FragmentManager fm = getSupportFragmentManager();\n        PersistentFragment persistFragment =\n                (PersistentFragment) fm.findFragmentByTag(\"PERSIST_FRAGMENT\");\n        if (persistFragment == null) {\n            persistFragment = new PersistentFragment();\n            fm.beginTransaction()\n                    .add(persistFragment, \"PERSIST_FRAGMENT\")\n                    .commitNow();\n        }\n        return persistFragment;\n    }\n\n    @Override\n    public void onRequestPermissionsResult(final int requestCode,\n                                           @NonNull final String[] permissions,\n                                           @NonNull final int[] grantResults) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults);\n        for (final int i : grantResults) {\n            if (i == PackageManager.PERMISSION_DENIED) {\n                finish();\n                return;\n            }\n        }\n        if (requestCode == PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE) {\n            openDownloadDialog();\n        }\n    }\n\n    private static class AdapterChoiceItem {\n        final String description;\n        final String key;\n        @DrawableRes\n        final int icon;\n\n        AdapterChoiceItem(final String key, final String description, final int icon) {\n            this.key = key;\n            this.description = description;\n            this.icon = icon;\n        }\n    }\n\n    private static class Choice implements Serializable {\n        final int serviceId;\n        final String url;\n        final String playerChoice;\n        final LinkType linkType;\n\n        Choice(final int serviceId, final LinkType linkType,\n               final String url, final String playerChoice) {\n            this.serviceId = serviceId;\n            this.linkType = linkType;\n            this.url = url;\n            this.playerChoice = playerChoice;\n        }\n\n        @NonNull\n        @Override\n        public String toString() {\n            return serviceId + \":\" + url + \" > \" + linkType + \" ::: \" + playerChoice;\n        }\n    }\n\n    public static class FetcherService extends IntentService {\n\n        public static final String KEY_CHOICE = \"key_choice\";\n        private static final int ID = 456;\n        private Disposable fetcher;\n\n        public FetcherService() {\n            super(FetcherService.class.getSimpleName());\n        }\n\n        @Override\n        public void onCreate() {\n            super.onCreate();\n            startForeground(ID, createNotification().build());\n        }\n\n        @Override\n        protected void onHandleIntent(@Nullable final Intent intent) {\n            if (intent == null) {\n                return;\n            }\n\n            final Serializable serializable = intent.getSerializableExtra(KEY_CHOICE);\n            if (!(serializable instanceof Choice)) {\n                return;\n            }\n            final Choice playerChoice = (Choice) serializable;\n            handleChoice(playerChoice);\n        }\n\n        public void handleChoice(final Choice choice) {\n            Single<? extends Info> single = null;\n            UserAction userAction = UserAction.SOMETHING_ELSE;\n\n            switch (choice.linkType) {\n                case STREAM:\n                    single = ExtractorHelper.getStreamInfo(choice.serviceId, choice.url, false);\n                    userAction = UserAction.REQUESTED_STREAM;\n                    break;\n                case CHANNEL:\n                    single = ExtractorHelper.getChannelInfo(choice.serviceId, choice.url, false);\n                    userAction = UserAction.REQUESTED_CHANNEL;\n                    break;\n                case PLAYLIST:\n                    single = ExtractorHelper.getPlaylistInfo(choice.serviceId, choice.url, false);\n                    userAction = UserAction.REQUESTED_PLAYLIST;\n                    break;\n            }\n\n\n            if (single != null) {\n                final UserAction finalUserAction = userAction;\n                final Consumer<Info> resultHandler = getResultHandler(choice);\n                fetcher = single\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .subscribe(info -> {\n                            resultHandler.accept(info);\n                            if (fetcher != null) {\n                                fetcher.dispose();\n                            }\n                        }, throwable -> handleError(this, new ErrorInfo(throwable, finalUserAction,\n                                choice.url + \" opened with \" + choice.playerChoice,\n                                choice.serviceId, choice.url)));\n            }\n        }\n\n        public Consumer<Info> getResultHandler(final Choice choice) {\n            return info -> {\n                final String videoPlayerKey = getString(R.string.video_player_key);\n                final String backgroundPlayerKey = getString(R.string.background_player_key);\n                final String popupPlayerKey = getString(R.string.popup_player_key);\n\n                final SharedPreferences preferences = PreferenceManager\n                        .getDefaultSharedPreferences(this);\n                final boolean isExtVideoEnabled = preferences.getBoolean(\n                        getString(R.string.use_external_video_player_key), false);\n                final boolean isExtAudioEnabled = preferences.getBoolean(\n                        getString(R.string.use_external_audio_player_key), false);\n\n                final PlayQueue playQueue;\n                if (info instanceof StreamInfo) {\n                    if (choice.playerChoice.equals(backgroundPlayerKey) && isExtAudioEnabled) {\n                        NavigationHelper.playOnExternalAudioPlayer(this, (StreamInfo) info);\n                        return;\n                    } else if (choice.playerChoice.equals(videoPlayerKey) && isExtVideoEnabled) {\n                        NavigationHelper.playOnExternalVideoPlayer(this, (StreamInfo) info);\n                        return;\n                    }\n                    playQueue = new SinglePlayQueue((StreamInfo) info);\n                } else if (info instanceof ChannelInfo) {\n                    final Optional<ListLinkHandler> playableTab = ((ChannelInfo) info).getTabs()\n                            .stream()\n                            .filter(ChannelTabHelper::isStreamsTab)\n                            .findFirst();\n\n                    if (playableTab.isPresent()) {\n                        playQueue = new ChannelTabPlayQueue(info.getServiceId(), playableTab.get());\n                    } else {\n                        return; // there is no playable tab\n                    }\n                } else if (info instanceof PlaylistInfo) {\n                    playQueue = new PlaylistPlayQueue((PlaylistInfo) info);\n                } else {\n                    return;\n                }\n\n                if (choice.playerChoice.equals(videoPlayerKey)) {\n                    NavigationHelper.playOnMainPlayer(this, playQueue, false);\n                } else if (choice.playerChoice.equals(backgroundPlayerKey)) {\n                    NavigationHelper.playOnBackgroundPlayer(this, playQueue, true);\n                } else if (choice.playerChoice.equals(popupPlayerKey)) {\n                    NavigationHelper.playOnPopupPlayer(this, playQueue, true);\n                } else if (choice.playerChoice.equals(getString(R.string.enqueue_key))) {\n                    NavigationHelper.enqueueOnPlayer(this, playQueue);\n                }\n            };\n        }\n\n        @Override\n        public void onDestroy() {\n            super.onDestroy();\n            ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE);\n            if (fetcher != null) {\n                fetcher.dispose();\n            }\n        }\n\n        private NotificationCompat.Builder createNotification() {\n            return new NotificationCompat.Builder(this, getString(R.string.notification_channel_id))\n                    .setOngoing(true)\n                    .setSmallIcon(R.drawable.ic_newpipe_triangle_white)\n                    .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n                    .setContentTitle(\n                            getString(R.string.preferred_player_fetcher_notification_title))\n                    .setContentText(\n                            getString(R.string.preferred_player_fetcher_notification_message));\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Nullable\n    private String getUrl(final Intent intent) {\n        String foundUrl = null;\n        if (intent.getData() != null) {\n            // Called from another app\n            foundUrl = intent.getData().toString();\n        } else if (intent.getStringExtra(Intent.EXTRA_TEXT) != null) {\n            // Called from the share menu\n            final String extraText = intent.getStringExtra(Intent.EXTRA_TEXT);\n            foundUrl = UrlFinder.firstUrlFromInput(extraText);\n        }\n\n        return foundUrl;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt",
    "content": "package org.schabi.newpipe.about\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Button\nimport androidx.annotation.StringRes\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport com.google.android.material.tabs.TabLayoutMediator\nimport org.schabi.newpipe.BuildConfig\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.ActivityAboutBinding\nimport org.schabi.newpipe.databinding.FragmentAboutBinding\nimport org.schabi.newpipe.util.ThemeHelper\nimport org.schabi.newpipe.util.external_communication.ShareUtils\n\nclass AboutActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        ThemeHelper.setTheme(this)\n        title = getString(R.string.title_activity_about)\n\n        val aboutBinding = ActivityAboutBinding.inflate(layoutInflater)\n        setContentView(aboutBinding.root)\n        setSupportActionBar(aboutBinding.aboutToolbar)\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        // Create the adapter that will return a fragment for each of the three\n        // primary sections of the activity.\n        val mAboutStateAdapter = AboutStateAdapter(this)\n        // Set up the ViewPager with the sections adapter.\n        aboutBinding.aboutViewPager2.adapter = mAboutStateAdapter\n        TabLayoutMediator(\n            aboutBinding.aboutTabLayout,\n            aboutBinding.aboutViewPager2\n        ) { tab, position ->\n            tab.setText(mAboutStateAdapter.getPageTitle(position))\n        }.attach()\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (item.itemId == android.R.id.home) {\n            finish()\n            return true\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    /**\n     * A placeholder fragment containing a simple view.\n     */\n    class AboutFragment : Fragment() {\n        private fun Button.openLink(@StringRes url: Int) {\n            setOnClickListener {\n                ShareUtils.openUrlInApp(context, requireContext().getString(url))\n            }\n        }\n\n        override fun onCreateView(\n            inflater: LayoutInflater,\n            container: ViewGroup?,\n            savedInstanceState: Bundle?\n        ): View {\n            FragmentAboutBinding.inflate(inflater, container, false).apply {\n                aboutAppVersion.text = BuildConfig.VERSION_NAME\n                aboutGithubLink.openLink(R.string.github_url)\n                aboutDonationLink.openLink(R.string.donation_url)\n                aboutWebsiteLink.openLink(R.string.website_url)\n                aboutPrivacyPolicyLink.openLink(R.string.privacy_policy_url)\n                faqLink.openLink(R.string.faq_url)\n                return root\n            }\n        }\n    }\n\n    /**\n     * A [FragmentStateAdapter] that returns a fragment corresponding to\n     * one of the sections/tabs/pages.\n     */\n    private class AboutStateAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {\n        private val posAbout = 0\n        private val posLicense = 1\n        private val totalCount = 2\n\n        override fun createFragment(position: Int): Fragment {\n            return when (position) {\n                posAbout -> AboutFragment()\n                posLicense -> LicenseFragment.newInstance(SOFTWARE_COMPONENTS)\n                else -> error(\"Unknown position for ViewPager2\")\n            }\n        }\n\n        override fun getItemCount(): Int {\n            // Show 2 total pages.\n            return totalCount\n        }\n\n        fun getPageTitle(position: Int): Int {\n            return when (position) {\n                posAbout -> R.string.tab_about\n                posLicense -> R.string.tab_licenses\n                else -> error(\"Unknown position for ViewPager2\")\n            }\n        }\n    }\n\n    companion object {\n        /**\n         * List of all software components.\n         */\n        private val SOFTWARE_COMPONENTS = arrayListOf(\n            SoftwareComponent(\n                \"ACRA\",\n                \"2013\",\n                \"Kevin Gaudin\",\n                \"https://github.com/ACRA/acra\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"AndroidX\",\n                \"2005 - 2011\",\n                \"The Android Open Source Project\",\n                \"https://developer.android.com/jetpack\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"ExoPlayer\",\n                \"2014 - 2020\",\n                \"Google, Inc.\",\n                \"https://github.com/google/ExoPlayer\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"GigaGet\",\n                \"2014 - 2015\",\n                \"Peter Cai\",\n                \"https://github.com/PaperAirplane-Dev-Team/GigaGet\",\n                StandardLicenses.GPL3\n            ),\n            SoftwareComponent(\n                \"Groupie\",\n                \"2016\",\n                \"Lisa Wray\",\n                \"https://github.com/lisawray/groupie\",\n                StandardLicenses.MIT\n            ),\n            SoftwareComponent(\n                \"Android-State\",\n                \"2018\",\n                \"Evernote\",\n                \"https://github.com/Evernote/android-state\",\n                StandardLicenses.EPL1\n            ),\n            SoftwareComponent(\n                \"Bridge\",\n                \"2021\",\n                \"Livefront\",\n                \"https://github.com/livefront/bridge\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"Jsoup\",\n                \"2009 - 2020\",\n                \"Jonathan Hedley\",\n                \"https://github.com/jhy/jsoup\",\n                StandardLicenses.MIT\n            ),\n            SoftwareComponent(\n                \"Markwon\",\n                \"2019\",\n                \"Dimitry Ivanov\",\n                \"https://github.com/noties/Markwon\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"Material Components for Android\",\n                \"2016 - 2020\",\n                \"Google, Inc.\",\n                \"https://github.com/material-components/material-components-android\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"NewPipe Extractor\",\n                \"2017 - 2020\",\n                \"Christian Schabesberger\",\n                \"https://github.com/TeamNewPipe/NewPipeExtractor\",\n                StandardLicenses.GPL3\n            ),\n            SoftwareComponent(\n                \"NoNonsense-FilePicker\",\n                \"2016\",\n                \"Jonas Kalderstam\",\n                \"https://github.com/spacecowboy/NoNonsense-FilePicker\",\n                StandardLicenses.MPL2\n            ),\n            SoftwareComponent(\n                \"OkHttp\",\n                \"2019\",\n                \"Square, Inc.\",\n                \"https://square.github.io/okhttp/\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"Coil\",\n                \"2023\",\n                \"Coil Contributors\",\n                \"https://coil-kt.github.io/coil/\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"PrettyTime\",\n                \"2012 - 2020\",\n                \"Lincoln Baxter, III\",\n                \"https://github.com/ocpsoft/prettytime\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"ProcessPhoenix\",\n                \"2015\",\n                \"Jake Wharton\",\n                \"https://github.com/JakeWharton/ProcessPhoenix\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"RxAndroid\",\n                \"2015\",\n                \"The RxAndroid authors\",\n                \"https://github.com/ReactiveX/RxAndroid\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"RxBinding\",\n                \"2015\",\n                \"Jake Wharton\",\n                \"https://github.com/JakeWharton/RxBinding\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"RxJava\",\n                \"2016 - 2020\",\n                \"RxJava Contributors\",\n                \"https://github.com/ReactiveX/RxJava\",\n                StandardLicenses.APACHE2\n            ),\n            SoftwareComponent(\n                \"SearchPreference\",\n                \"2018\",\n                \"ByteHamster\",\n                \"https://github.com/ByteHamster/SearchPreference\",\n                StandardLicenses.MIT\n            )\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/License.kt",
    "content": "package org.schabi.newpipe.about\n\nimport android.os.Parcelable\nimport java.io.Serializable\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Class for storing information about a software license.\n */\n@Parcelize\nclass License(val name: String, val abbreviation: String, val filename: String) : Parcelable, Serializable\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/LicenseFragment.kt",
    "content": "package org.schabi.newpipe.about\n\nimport android.os.Bundle\nimport android.util.Base64\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.webkit.WebView\nimport androidx.appcompat.app.AlertDialog\nimport androidx.core.os.BundleCompat\nimport androidx.core.os.bundleOf\nimport androidx.fragment.app.Fragment\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.core.Observable\nimport io.reactivex.rxjava3.disposables.CompositeDisposable\nimport io.reactivex.rxjava3.disposables.Disposable\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport org.schabi.newpipe.BuildConfig\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.FragmentLicensesBinding\nimport org.schabi.newpipe.databinding.ItemSoftwareComponentBinding\nimport org.schabi.newpipe.ktx.parcelableArrayList\nimport org.schabi.newpipe.util.external_communication.ShareUtils\n\n/**\n * Fragment containing the software licenses.\n */\nclass LicenseFragment : Fragment() {\n    private lateinit var softwareComponents: List<SoftwareComponent>\n    private var activeSoftwareComponent: SoftwareComponent? = null\n    private val compositeDisposable = CompositeDisposable()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        softwareComponents = arguments?.parcelableArrayList<SoftwareComponent>(ARG_COMPONENTS)!!\n            .sortedBy { it.name } // Sort components by name\n        activeSoftwareComponent = savedInstanceState?.let {\n            BundleCompat.getSerializable(it, SOFTWARE_COMPONENT_KEY, SoftwareComponent::class.java)\n        }\n    }\n\n    override fun onDestroy() {\n        compositeDisposable.dispose()\n        super.onDestroy()\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        val binding = FragmentLicensesBinding.inflate(inflater, container, false)\n        binding.licensesAppReadLicense.setOnClickListener {\n            compositeDisposable.add(\n                showLicense(NEWPIPE_SOFTWARE_COMPONENT)\n            )\n        }\n        for (component in softwareComponents) {\n            val componentBinding = ItemSoftwareComponentBinding\n                .inflate(inflater, container, false)\n            componentBinding.name.text = component.name\n            componentBinding.copyright.text = getString(\n                R.string.copyright,\n                component.years,\n                component.copyrightOwner,\n                component.license.abbreviation\n            )\n            val root: View = componentBinding.root\n            root.tag = component\n            root.setOnClickListener {\n                compositeDisposable.add(\n                    showLicense(component)\n                )\n            }\n            binding.licensesSoftwareComponents.addView(root)\n            registerForContextMenu(root)\n        }\n        activeSoftwareComponent?.let { compositeDisposable.add(showLicense(it)) }\n        return binding.root\n    }\n\n    override fun onSaveInstanceState(savedInstanceState: Bundle) {\n        super.onSaveInstanceState(savedInstanceState)\n        activeSoftwareComponent?.let { savedInstanceState.putSerializable(SOFTWARE_COMPONENT_KEY, it) }\n    }\n\n    private fun showLicense(\n        softwareComponent: SoftwareComponent\n    ): Disposable {\n        return if (context == null) {\n            Disposable.empty()\n        } else {\n            val context = requireContext()\n            activeSoftwareComponent = softwareComponent\n            Observable.fromCallable { getFormattedLicense(context, softwareComponent.license) }\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe { formattedLicense ->\n                    val webViewData = Base64.encodeToString(\n                        formattedLicense.toByteArray(),\n                        Base64.NO_PADDING\n                    )\n                    val webView = WebView(context)\n                    webView.loadData(webViewData, \"text/html; charset=UTF-8\", \"base64\")\n\n                    val builder = AlertDialog.Builder(requireContext())\n                        .setTitle(softwareComponent.name)\n                        .setView(webView)\n                        .setOnCancelListener { activeSoftwareComponent = null }\n                        .setOnDismissListener { activeSoftwareComponent = null }\n                        .setPositiveButton(R.string.done) { dialog, _ -> dialog.dismiss() }\n\n                    if (softwareComponent != NEWPIPE_SOFTWARE_COMPONENT) {\n                        builder.setNeutralButton(R.string.open_website_license) { _, _ ->\n                            ShareUtils.openUrlInApp(requireContext(), softwareComponent.link)\n                        }\n                    }\n\n                    builder.show()\n                }\n        }\n    }\n\n    companion object {\n        private const val ARG_COMPONENTS = \"components\"\n        private const val SOFTWARE_COMPONENT_KEY = \"ACTIVE_SOFTWARE_COMPONENT\"\n        private val NEWPIPE_SOFTWARE_COMPONENT = SoftwareComponent(\n            \"NewPipe\",\n            \"2014-2023\",\n            \"Team NewPipe\",\n            \"https://newpipe.net/\",\n            StandardLicenses.GPL3,\n            BuildConfig.VERSION_NAME\n        )\n\n        fun newInstance(softwareComponents: ArrayList<SoftwareComponent>): LicenseFragment {\n            val fragment = LicenseFragment()\n            fragment.arguments = bundleOf(ARG_COMPONENTS to softwareComponents)\n            return fragment\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt",
    "content": "package org.schabi.newpipe.about\n\nimport android.content.Context\nimport java.io.IOException\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.util.ThemeHelper\n\n/**\n * @param context the context to use\n * @param license the license\n * @return String which contains a HTML formatted license page\n * styled according to the context's theme\n */\nfun getFormattedLicense(context: Context, license: License): String {\n    try {\n        return context.assets.open(license.filename).bufferedReader().use { it.readText() }\n            // split the HTML file and insert the stylesheet into the HEAD of the file\n            .replace(\"</head>\", \"<style>${getLicenseStylesheet(context)}</style></head>\")\n    } catch (e: IOException) {\n        throw IllegalArgumentException(\"Could not get license file: ${license.filename}\", e)\n    }\n}\n\n/**\n * @param context the Android context\n * @return String which is a CSS stylesheet according to the context's theme\n */\nfun getLicenseStylesheet(context: Context): String {\n    val isLightTheme = ThemeHelper.isLightThemeSelected(context)\n    val licenseBackgroundColor = getHexRGBColor(\n        context,\n        if (isLightTheme) R.color.light_license_background_color else R.color.dark_license_background_color\n    )\n    val licenseTextColor = getHexRGBColor(\n        context,\n        if (isLightTheme) R.color.light_license_text_color else R.color.dark_license_text_color\n    )\n    val youtubePrimaryColor = getHexRGBColor(\n        context,\n        if (isLightTheme) R.color.light_youtube_primary_color else R.color.dark_youtube_primary_color\n    )\n    return \"body{padding:12px 15px;margin:0;background:#$licenseBackgroundColor;color:#$licenseTextColor}\" +\n        \"a[href]{color:#$youtubePrimaryColor}pre{white-space:pre-wrap}\"\n}\n\n/**\n * Cast R.color to a hexadecimal color value.\n *\n * @param context the context to use\n * @param color   the color number from R.color\n * @return a six characters long String with hexadecimal RGB values\n */\nfun getHexRGBColor(context: Context, color: Int): String {\n    return context.getString(color).substring(3)\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/SoftwareComponent.kt",
    "content": "package org.schabi.newpipe.about\n\nimport android.os.Parcelable\nimport java.io.Serializable\nimport kotlinx.parcelize.Parcelize\n\n@Parcelize\nclass SoftwareComponent\n@JvmOverloads\nconstructor(\n    val name: String,\n    val years: String,\n    val copyrightOwner: String,\n    val link: String,\n    val license: License,\n    val version: String? = null\n) : Parcelable, Serializable\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/about/StandardLicenses.kt",
    "content": "package org.schabi.newpipe.about\n\n/**\n * Class containing information about standard software licenses.\n */\nobject StandardLicenses {\n    @JvmField\n    val GPL3 = License(\"GNU General Public License, Version 3.0\", \"GPLv3\", \"gpl_3.html\")\n\n    @JvmField\n    val APACHE2 = License(\"Apache License, Version 2.0\", \"ALv2\", \"apache2.html\")\n\n    @JvmField\n    val MPL2 = License(\"Mozilla Public License, Version 2.0\", \"MPL 2.0\", \"mpl2.html\")\n\n    @JvmField\n    val MIT = License(\"MIT License\", \"MIT\", \"mit.html\")\n\n    @JvmField\n    val EPL1 = License(\"Eclipse Public License, Version 1.0\", \"EPL 1.0\", \"epl1.html\")\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/AppDatabase.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2017-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database\n\nimport androidx.room.Database\nimport androidx.room.RoomDatabase\nimport androidx.room.TypeConverters\nimport org.schabi.newpipe.database.feed.dao.FeedDAO\nimport org.schabi.newpipe.database.feed.dao.FeedGroupDAO\nimport org.schabi.newpipe.database.feed.model.FeedEntity\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity\nimport org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity\nimport org.schabi.newpipe.database.history.dao.SearchHistoryDAO\nimport org.schabi.newpipe.database.history.dao.StreamHistoryDAO\nimport org.schabi.newpipe.database.history.model.SearchHistoryEntry\nimport org.schabi.newpipe.database.history.model.StreamHistoryEntity\nimport org.schabi.newpipe.database.playlist.dao.PlaylistDAO\nimport org.schabi.newpipe.database.playlist.dao.PlaylistRemoteDAO\nimport org.schabi.newpipe.database.playlist.dao.PlaylistStreamDAO\nimport org.schabi.newpipe.database.playlist.model.PlaylistEntity\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity\nimport org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity\nimport org.schabi.newpipe.database.stream.dao.StreamDAO\nimport org.schabi.newpipe.database.stream.dao.StreamStateDAO\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity\nimport org.schabi.newpipe.database.subscription.SubscriptionDAO\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\n\n@TypeConverters(Converters::class)\n@Database(\n    version = Migrations.DB_VER_9,\n    entities = [\n        SubscriptionEntity::class,\n        SearchHistoryEntry::class,\n        StreamEntity::class,\n        StreamHistoryEntity::class,\n        StreamStateEntity::class,\n        PlaylistEntity::class,\n        PlaylistStreamEntity::class,\n        PlaylistRemoteEntity::class,\n        FeedEntity::class,\n        FeedGroupEntity::class,\n        FeedGroupSubscriptionEntity::class,\n        FeedLastUpdatedEntity::class\n    ]\n)\nabstract class AppDatabase : RoomDatabase() {\n    abstract fun feedDAO(): FeedDAO\n    abstract fun feedGroupDAO(): FeedGroupDAO\n    abstract fun playlistDAO(): PlaylistDAO\n    abstract fun playlistRemoteDAO(): PlaylistRemoteDAO\n    abstract fun playlistStreamDAO(): PlaylistStreamDAO\n    abstract fun searchHistoryDAO(): SearchHistoryDAO\n    abstract fun streamDAO(): StreamDAO\n    abstract fun streamHistoryDAO(): StreamHistoryDAO\n    abstract fun streamStateDAO(): StreamStateDAO\n    abstract fun subscriptionDAO(): SubscriptionDAO\n\n    companion object {\n        const val DATABASE_NAME: String = \"newpipe.db\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/BasicDAO.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2017-2022 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database\n\nimport androidx.room.Dao\nimport androidx.room.Delete\nimport androidx.room.Insert\nimport androidx.room.Update\nimport io.reactivex.rxjava3.core.Flowable\n\n@Dao\ninterface BasicDAO<Entity> {\n\n    /* Inserts */\n    @Insert\n    fun insert(entity: Entity): Long\n\n    @Insert\n    fun insertAll(entities: Collection<Entity>): List<Long>\n\n    /* Searches */\n    fun getAll(): Flowable<List<Entity>>\n\n    fun listByService(serviceId: Int): Flowable<List<Entity>>\n\n    /* Deletes */\n    @Delete\n    fun delete(entity: Entity)\n\n    fun deleteAll(): Int\n\n    /* Updates */\n    @Update\n    fun update(entity: Entity): Int\n\n    @Update\n    fun update(entities: Collection<Entity>)\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/Converters.kt",
    "content": "package org.schabi.newpipe.database\n\nimport androidx.room.TypeConverter\nimport java.time.Instant\nimport java.time.OffsetDateTime\nimport java.time.ZoneOffset\nimport org.schabi.newpipe.extractor.stream.StreamType\nimport org.schabi.newpipe.local.subscription.FeedGroupIcon\n\nclass Converters {\n    /**\n     * Convert a long value to a [OffsetDateTime].\n     *\n     * @param value the long value\n     * @return the `OffsetDateTime`\n     */\n    @TypeConverter\n    fun offsetDateTimeFromTimestamp(value: Long?): OffsetDateTime? {\n        return value?.let { OffsetDateTime.ofInstant(Instant.ofEpochMilli(it), ZoneOffset.UTC) }\n    }\n\n    /**\n     * Convert a [OffsetDateTime] to a long value.\n     *\n     * @param offsetDateTime the `OffsetDateTime`\n     * @return the long value\n     */\n    @TypeConverter\n    fun offsetDateTimeToTimestamp(offsetDateTime: OffsetDateTime?): Long? {\n        return offsetDateTime?.withOffsetSameInstant(ZoneOffset.UTC)?.toInstant()?.toEpochMilli()\n    }\n\n    @TypeConverter\n    fun streamTypeOf(value: String): StreamType {\n        return StreamType.valueOf(value)\n    }\n\n    @TypeConverter\n    fun stringOf(streamType: StreamType): String {\n        return streamType.name\n    }\n\n    @TypeConverter\n    fun integerOf(feedGroupIcon: FeedGroupIcon): Int {\n        return feedGroupIcon.id\n    }\n\n    @TypeConverter\n    fun feedGroupIconOf(id: Int): FeedGroupIcon {\n        return FeedGroupIcon.entries.first { it.id == id }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/LocalItem.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2020 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database\n\ninterface LocalItem {\n    val localItemType: LocalItemType\n\n    enum class LocalItemType {\n        PLAYLIST_LOCAL_ITEM,\n        PLAYLIST_REMOTE_ITEM,\n\n        PLAYLIST_STREAM_ITEM,\n        STATISTIC_STREAM_ITEM\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/Migrations.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database\n\nimport android.util.Log\nimport androidx.room.migration.Migration\nimport org.schabi.newpipe.MainActivity\n\nobject Migrations {\n\n    // /////////////////////////////////////////////////////////////////////// //\n    //  Test new migrations manually by importing a database from daily usage  //\n    //  and checking if the migration works (Use the Database Inspector        //\n    //  https://developer.android.com/studio/inspect/database).                //\n    //  If you add a migration point it out in the pull request, so that       //\n    //  others remember to test it themselves.                                 //\n    // /////////////////////////////////////////////////////////////////////// //\n\n    const val DB_VER_1 = 1\n    const val DB_VER_2 = 2\n    const val DB_VER_3 = 3\n    const val DB_VER_4 = 4\n    const val DB_VER_5 = 5\n    const val DB_VER_6 = 6\n    const val DB_VER_7 = 7\n    const val DB_VER_8 = 8\n    const val DB_VER_9 = 9\n\n    private val TAG = Migrations::class.java.getName()\n    private val isDebug = MainActivity.DEBUG\n\n    val MIGRATION_1_2 = Migration(DB_VER_1, DB_VER_2) { db ->\n        if (isDebug) {\n            Log.d(TAG, \"Start migrating database\")\n        }\n\n        /*\n         * Unfortunately these queries must be hardcoded due to the possibility of\n         * schema and names changing at a later date, thus invalidating the older migration\n         * scripts if they are not hardcoded.\n         * */\n\n        // Not much we can do about this, since room doesn't create tables before migration.\n        // It's either this or blasting the entire database anew.\n        db.execSQL(\n            \"CREATE  INDEX `index_search_history_search` \" +\n                \"ON `search_history` (`search`)\"\n        )\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS `streams` \" +\n                \"(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \" +\n                \"`service_id` INTEGER NOT NULL, `url` TEXT, `title` TEXT, \" +\n                \"`stream_type` TEXT, `duration` INTEGER, `uploader` TEXT, \" +\n                \"`thumbnail_url` TEXT)\"\n        )\n        db.execSQL(\n            \"CREATE UNIQUE INDEX `index_streams_service_id_url` \" +\n                \"ON `streams` (`service_id`, `url`)\"\n        )\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS `stream_history` \" +\n                \"(`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, \" +\n                \"`repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), \" +\n                \"FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) \" +\n                \"ON UPDATE CASCADE ON DELETE CASCADE )\"\n        )\n        db.execSQL(\n            \"CREATE  INDEX `index_stream_history_stream_id` \" +\n                \"ON `stream_history` (`stream_id`)\"\n        )\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS `stream_state` \" +\n                \"(`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, \" +\n                \"PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) \" +\n                \"REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )\"\n        )\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS `playlists` \" +\n                \"(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \" +\n                \"`name` TEXT, `thumbnail_url` TEXT)\"\n        )\n        db.execSQL(\"CREATE  INDEX `index_playlists_name` ON `playlists` (`name`)\")\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS `playlist_stream_join` \" +\n                \"(`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, \" +\n                \"`join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), \" +\n                \"FOREIGN KEY(`playlist_id`) REFERENCES `playlists`(`uid`) \" +\n                \"ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, \" +\n                \"FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) \" +\n                \"ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)\"\n        )\n        db.execSQL(\n            \"CREATE UNIQUE INDEX \" +\n                \"`index_playlist_stream_join_playlist_id_join_index` \" +\n                \"ON `playlist_stream_join` (`playlist_id`, `join_index`)\"\n        )\n        db.execSQL(\n            \"CREATE  INDEX `index_playlist_stream_join_stream_id` \" +\n                \"ON `playlist_stream_join` (`stream_id`)\"\n        )\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS `remote_playlists` \" +\n                \"(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \" +\n                \"`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, \" +\n                \"`thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)\"\n        )\n        db.execSQL(\n            \"CREATE  INDEX `index_remote_playlists_name` \" +\n                \"ON `remote_playlists` (`name`)\"\n        )\n        db.execSQL(\n            \"CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` \" +\n                \"ON `remote_playlists` (`service_id`, `url`)\"\n        )\n\n        // Populate streams table with existing entries in watch history\n        // Latest data first, thus ignoring older entries with the same indices\n        db.execSQL(\n            \"INSERT OR IGNORE INTO streams (service_id, url, title, \" +\n                \"stream_type, duration, uploader, thumbnail_url) \" +\n\n                \"SELECT service_id, url, title, 'VIDEO_STREAM', duration, \" +\n                \"uploader, thumbnail_url \" +\n\n                \"FROM watch_history \" +\n                \"ORDER BY creation_date DESC\"\n        )\n\n        // Once the streams have PKs, join them with the normalized history table\n        // and populate it with the remaining data from watch history\n        db.execSQL(\n            \"INSERT INTO stream_history (stream_id, access_date, repeat_count)\" +\n                \"SELECT uid, creation_date, 1 \" +\n                \"FROM watch_history INNER JOIN streams \" +\n                \"ON watch_history.service_id == streams.service_id \" +\n                \"AND watch_history.url == streams.url \" +\n                \"ORDER BY creation_date DESC\"\n        )\n\n        db.execSQL(\"DROP TABLE IF EXISTS watch_history\")\n\n        if (isDebug) {\n            Log.d(TAG, \"Stop migrating database\")\n        }\n    }\n\n    val MIGRATION_2_3 = Migration(DB_VER_2, DB_VER_3) { db ->\n        // Add NOT NULLs and new fields\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS streams_new \" +\n                \"(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \" +\n                \"service_id INTEGER NOT NULL, url TEXT NOT NULL, title TEXT NOT NULL, \" +\n                \"stream_type TEXT NOT NULL, duration INTEGER NOT NULL, \" +\n                \"uploader TEXT NOT NULL, thumbnail_url TEXT, view_count INTEGER, \" +\n                \"textual_upload_date TEXT, upload_date INTEGER, \" +\n                \"is_upload_date_approximation INTEGER)\"\n        )\n\n        db.execSQL(\n            \"INSERT INTO streams_new (uid, service_id, url, title, stream_type, \" +\n                \"duration, uploader, thumbnail_url, view_count, textual_upload_date, \" +\n                \"upload_date, is_upload_date_approximation) \" +\n\n                \"SELECT uid, service_id, url, ifnull(title, ''), \" +\n                \"ifnull(stream_type, 'VIDEO_STREAM'), ifnull(duration, 0), \" +\n                \"ifnull(uploader, ''), ifnull(thumbnail_url, ''), NULL, NULL, NULL, NULL \" +\n\n                \"FROM streams WHERE url IS NOT NULL\"\n        )\n\n        db.execSQL(\"DROP TABLE streams\")\n        db.execSQL(\"ALTER TABLE streams_new RENAME TO streams\")\n        db.execSQL(\n            \"CREATE UNIQUE INDEX index_streams_service_id_url \" +\n                \"ON streams (service_id, url)\"\n        )\n\n        // Tables for feed feature\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS feed \" +\n                \"(stream_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, \" +\n                \"PRIMARY KEY(stream_id, subscription_id), \" +\n                \"FOREIGN KEY(stream_id) REFERENCES streams(uid) \" +\n                \"ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, \" +\n                \"FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) \" +\n                \"ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)\"\n        )\n        db.execSQL(\"CREATE INDEX index_feed_subscription_id ON feed (subscription_id)\")\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS feed_group \" +\n                \"(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, \" +\n                \"icon_id INTEGER NOT NULL, sort_order INTEGER NOT NULL)\"\n        )\n        db.execSQL(\"CREATE INDEX index_feed_group_sort_order ON feed_group (sort_order)\")\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS feed_group_subscription_join \" +\n                \"(group_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, \" +\n                \"PRIMARY KEY(group_id, subscription_id), \" +\n                \"FOREIGN KEY(group_id) REFERENCES feed_group(uid) \" +\n                \"ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED, \" +\n                \"FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) \" +\n                \"ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)\"\n        )\n        db.execSQL(\n            \"CREATE INDEX index_feed_group_subscription_join_subscription_id \" +\n                \"ON feed_group_subscription_join (subscription_id)\"\n        )\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS feed_last_updated \" +\n                \"(subscription_id INTEGER NOT NULL, last_updated INTEGER, \" +\n                \"PRIMARY KEY(subscription_id), \" +\n                \"FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) \" +\n                \"ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)\"\n        )\n    }\n\n    val MIGRATION_3_4 = Migration(DB_VER_3, DB_VER_4) { db ->\n        db.execSQL(\"ALTER TABLE streams ADD COLUMN uploader_url TEXT\")\n    }\n\n    val MIGRATION_4_5 = Migration(DB_VER_4, DB_VER_5) { db ->\n        db.execSQL(\n            \"ALTER TABLE `subscriptions` ADD COLUMN `notification_mode` \" +\n                \"INTEGER NOT NULL DEFAULT 0\"\n        )\n    }\n\n    val MIGRATION_5_6 = Migration(DB_VER_5, DB_VER_6) { db ->\n        db.execSQL(\n            \"ALTER TABLE `playlists` ADD COLUMN `is_thumbnail_permanent` \" +\n                \"INTEGER NOT NULL DEFAULT 0\"\n        )\n    }\n\n    val MIGRATION_6_7 = Migration(DB_VER_6, DB_VER_7) { db ->\n        // Create a new column thumbnail_stream_id\n        db.execSQL(\n            \"ALTER TABLE `playlists` ADD COLUMN `thumbnail_stream_id` \" +\n                \"INTEGER NOT NULL DEFAULT -1\"\n        )\n\n        // Migrate the thumbnail_url to the thumbnail_stream_id\n        db.execSQL(\n            \"UPDATE playlists SET thumbnail_stream_id = (\" +\n                \" SELECT CASE WHEN COUNT(*) != 0 then stream_uid ELSE -1 END\" +\n                \" FROM (\" +\n                \" SELECT p.uid AS playlist_uid, s.uid AS stream_uid\" +\n                \" FROM playlists p\" +\n                \" LEFT JOIN playlist_stream_join ps ON p.uid = ps.playlist_id\" +\n                \" LEFT JOIN streams s ON s.uid = ps.stream_id\" +\n                \" WHERE s.thumbnail_url = p.thumbnail_url) AS temporary_table\" +\n                \" WHERE playlist_uid = playlists.uid)\"\n        )\n\n        // Remove the thumbnail_url field in the playlist table\n        db.execSQL(\n            \"CREATE TABLE IF NOT EXISTS `playlists_new`\" +\n                \"(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \" +\n                \"name TEXT, \" +\n                \"is_thumbnail_permanent INTEGER NOT NULL, \" +\n                \"thumbnail_stream_id INTEGER NOT NULL)\"\n        )\n\n        db.execSQL(\n            \"INSERT INTO playlists_new\" +\n                \" SELECT uid, name, is_thumbnail_permanent, thumbnail_stream_id \" +\n                \" FROM playlists\"\n        )\n\n        db.execSQL(\"DROP TABLE playlists\")\n        db.execSQL(\"ALTER TABLE playlists_new RENAME TO playlists\")\n        db.execSQL(\n            \"CREATE INDEX IF NOT EXISTS \" +\n                \"`index_playlists_name` ON `playlists` (`name`)\"\n        )\n    }\n\n    val MIGRATION_7_8 = Migration(DB_VER_7, DB_VER_8) { db ->\n        db.execSQL(\n            \"DELETE FROM search_history WHERE id NOT IN (SELECT id FROM (SELECT \" +\n                \"MIN(id) as id FROM search_history GROUP BY trim(search), service_id ) tmp)\"\n        )\n        db.execSQL(\"UPDATE search_history SET search = trim(search)\")\n    }\n\n    val MIGRATION_8_9 = Migration(DB_VER_8, DB_VER_9) { db ->\n        try {\n            db.beginTransaction()\n\n            // Update playlists.\n            // Create a temp table to initialize display_index.\n            db.execSQL(\n                \"CREATE TABLE `playlists_tmp` \" +\n                    \"(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \" +\n                    \"`name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, \" +\n                    \"`thumbnail_stream_id` INTEGER NOT NULL, \" +\n                    \"`display_index` INTEGER NOT NULL)\"\n            )\n            db.execSQL(\n                \"INSERT INTO `playlists_tmp` \" +\n                    \"(`uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, \" +\n                    \"`display_index`) \" +\n                    \"SELECT `uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, \" +\n                    \"-1 \" +\n                    \"FROM `playlists`\"\n            )\n\n            // Replace the old table, note that this also removes the index on the name which\n            // we don't need anymore.\n            db.execSQL(\"DROP TABLE `playlists`\")\n            db.execSQL(\"ALTER TABLE `playlists_tmp` RENAME TO `playlists`\")\n\n            // Update remote_playlists.\n            // Create a temp table to initialize display_index.\n            db.execSQL(\n                \"CREATE TABLE `remote_playlists_tmp` \" +\n                    \"(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, \" +\n                    \"`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, \" +\n                    \"`thumbnail_url` TEXT, `uploader` TEXT, \" +\n                    \"`display_index` INTEGER NOT NULL,\" +\n                    \"`stream_count` INTEGER)\"\n            )\n            db.execSQL(\n                \"INSERT INTO `remote_playlists_tmp` (`uid`, `service_id`, \" +\n                    \"`name`, `url`, `thumbnail_url`, `uploader`, `display_index`, \" +\n                    \"`stream_count`)\" +\n                    \"SELECT `uid`, `service_id`, `name`, `url`, `thumbnail_url`, `uploader`, \" +\n                    \"-1, `stream_count` FROM `remote_playlists`\"\n            )\n\n            // Replace the old table, note that this also removes the index on the name which\n            // we don't need anymore.\n            db.execSQL(\"DROP TABLE `remote_playlists`\")\n            db.execSQL(\"ALTER TABLE `remote_playlists_tmp` RENAME TO `remote_playlists`\")\n\n            // Create index on the new table.\n            db.execSQL(\n                \"CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` \" +\n                    \"ON `remote_playlists` (`service_id`, `url`)\"\n            )\n\n            db.setTransactionSuccessful()\n        } finally {\n            db.endTransaction()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt",
    "content": "package org.schabi.newpipe.database.feed.dao\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport androidx.room.Transaction\nimport androidx.room.Update\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.core.Maybe\nimport java.time.OffsetDateTime\nimport org.schabi.newpipe.database.feed.model.FeedEntity\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity\nimport org.schabi.newpipe.database.stream.StreamWithState\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity\nimport org.schabi.newpipe.database.subscription.NotificationMode\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\n\n@Dao\nabstract class FeedDAO {\n    @Query(\"DELETE FROM feed\")\n    abstract fun deleteAll(): Int\n\n    /**\n     * @param groupId          the group id to get feed streams of; use\n     *                         [FeedGroupEntity.GROUP_ALL_ID] to not filter by group\n     * @param includePlayed    if false, only return all of the live, never-played or non-finished\n     *                         feed streams (see `@see` items); if true no filter is applied\n     * @param uploadDateBefore get only streams uploaded before this date (useful to filter out\n     *                         future streams); use null to not filter by upload date\n     * @return the feed streams filtered according to the conditions provided in the parameters\n     * @see StreamStateEntity.isFinished()\n     * @see StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS\n     * @see StreamStateEntity.PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS\n     */\n    @Query(\n        \"\"\"\n        SELECT s.*, sst.progress_time\n        FROM streams s\n\n        LEFT JOIN stream_state sst\n        ON s.uid = sst.stream_id\n        \n        LEFT JOIN stream_history sh\n        ON s.uid = sh.stream_id\n        \n        INNER JOIN feed f\n        ON s.uid = f.stream_id\n\n        LEFT JOIN feed_group_subscription_join fgs\n        ON (\n            :groupId <> ${FeedGroupEntity.GROUP_ALL_ID}\n            AND fgs.subscription_id = f.subscription_id\n        )\n\n        WHERE (\n            :groupId = ${FeedGroupEntity.GROUP_ALL_ID}\n            OR fgs.group_id = :groupId\n        )\n        AND (\n            :includePlayed\n            OR sh.stream_id IS NULL\n            OR sst.stream_id IS NULL\n            OR sst.progress_time < s.duration * 1000 - ${StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS}\n            OR sst.progress_time < s.duration * 1000 * 3 / 4\n            OR s.stream_type = 'LIVE_STREAM'\n            OR s.stream_type = 'AUDIO_LIVE_STREAM'\n        )\n        AND (\n            :includePartiallyPlayed\n            OR sh.stream_id IS NULL\n            OR sst.stream_id IS NULL\n            OR (sst.progress_time <= ${StreamStateEntity.PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS}\n            AND sst.progress_time <= s.duration * 1000 / 4)\n            OR (sst.progress_time >= s.duration * 1000 - ${StreamStateEntity.PLAYBACK_FINISHED_END_MILLISECONDS}\n            AND sst.progress_time >= s.duration * 1000 * 3 / 4)\n        )\n        AND (\n            :uploadDateBefore IS NULL\n            OR s.upload_date IS NULL\n            OR s.upload_date < :uploadDateBefore\n        )\n\n        ORDER BY s.upload_date IS NULL DESC, s.upload_date DESC, s.uploader ASC\n        LIMIT 500\n        \"\"\"\n    )\n    abstract fun getStreams(\n        groupId: Long,\n        includePlayed: Boolean,\n        includePartiallyPlayed: Boolean,\n        uploadDateBefore: OffsetDateTime?\n    ): Maybe<List<StreamWithState>>\n\n    /**\n     * Remove links to streams that are older than the given date\n     * **but keep at least one stream per uploader**.\n     *\n     * One stream per uploader is kept because it is needed as reference\n     * when fetching new streams to check if they are new or not.\n     * @param offsetDateTime the newest date to keep, older streams are removed\n     */\n    @Query(\n        \"\"\"\n        DELETE FROM feed\n        WHERE feed.stream_id IN (SELECT uid from (\n              SELECT s.uid,\n              (SELECT MAX(upload_date)\n                    FROM streams s1\n                    INNER JOIN feed f1\n                    ON s1.uid = f1.stream_id\n                    WHERE f1.subscription_id = f.subscription_id) max_upload_date\n              FROM streams s\n              INNER JOIN feed f\n              ON s.uid = f.stream_id\n        \n              WHERE s.upload_date < :offsetDateTime\n              AND   s.upload_date <> max_upload_date))\n        \"\"\"\n    )\n    abstract fun unlinkStreamsOlderThan(offsetDateTime: OffsetDateTime)\n\n    @Query(\n        \"\"\"\n        DELETE FROM feed\n        \n        WHERE feed.subscription_id = :subscriptionId\n\n        AND feed.stream_id IN (\n            SELECT s.uid FROM streams s\n\n            INNER JOIN feed f\n            ON s.uid = f.stream_id\n\n            WHERE s.stream_type = \"LIVE_STREAM\" OR s.stream_type = \"AUDIO_LIVE_STREAM\"\n        )\n        \"\"\"\n    )\n    abstract fun unlinkOldLivestreams(subscriptionId: Long)\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    abstract fun insert(feedEntity: FeedEntity)\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    abstract fun insertAll(entities: List<FeedEntity>): List<Long>\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    internal abstract fun insertLastUpdated(lastUpdatedEntity: FeedLastUpdatedEntity): Long\n\n    @Update(onConflict = OnConflictStrategy.IGNORE)\n    internal abstract fun updateLastUpdated(lastUpdatedEntity: FeedLastUpdatedEntity)\n\n    @Transaction\n    open fun setLastUpdatedForSubscription(lastUpdatedEntity: FeedLastUpdatedEntity) {\n        val id = insertLastUpdated(lastUpdatedEntity)\n\n        if (id == -1L) {\n            updateLastUpdated(lastUpdatedEntity)\n        }\n    }\n\n    @Query(\n        \"\"\"\n        SELECT MIN(lu.last_updated) FROM feed_last_updated lu\n\n        INNER JOIN feed_group_subscription_join fgs\n        ON fgs.subscription_id = lu.subscription_id AND fgs.group_id = :groupId\n        \"\"\"\n    )\n    abstract fun oldestSubscriptionUpdate(groupId: Long): Flowable<List<OffsetDateTime?>>\n\n    @Query(\"SELECT MIN(last_updated) FROM feed_last_updated\")\n    abstract fun oldestSubscriptionUpdateFromAll(): Flowable<List<OffsetDateTime?>>\n\n    @Query(\"SELECT COUNT(*) FROM feed_last_updated WHERE last_updated IS NULL\")\n    abstract fun notLoadedCount(): Flowable<Long>\n\n    @Query(\n        \"\"\"\n        SELECT COUNT(*) FROM subscriptions s\n        \n        INNER JOIN feed_group_subscription_join fgs\n        ON s.uid = fgs.subscription_id AND fgs.group_id = :groupId\n\n        LEFT JOIN feed_last_updated lu\n        ON s.uid = lu.subscription_id \n\n        WHERE lu.last_updated IS NULL\n        \"\"\"\n    )\n    abstract fun notLoadedCountForGroup(groupId: Long): Flowable<Long>\n\n    @Query(\n        \"\"\"\n        SELECT s.* FROM subscriptions s\n\n        LEFT JOIN feed_last_updated lu\n        ON s.uid = lu.subscription_id \n\n        WHERE lu.last_updated IS NULL OR lu.last_updated < :outdatedThreshold\n        \"\"\"\n    )\n    abstract fun getAllOutdated(outdatedThreshold: OffsetDateTime): Flowable<List<SubscriptionEntity>>\n\n    @Query(\n        \"\"\"\n        SELECT s.* FROM subscriptions s\n\n        INNER JOIN feed_group_subscription_join fgs\n        ON s.uid = fgs.subscription_id AND fgs.group_id = :groupId\n\n        LEFT JOIN feed_last_updated lu\n        ON s.uid = lu.subscription_id\n\n        WHERE lu.last_updated IS NULL OR lu.last_updated < :outdatedThreshold\n        \"\"\"\n    )\n    abstract fun getAllOutdatedForGroup(groupId: Long, outdatedThreshold: OffsetDateTime): Flowable<List<SubscriptionEntity>>\n\n    @Query(\n        \"\"\"\n        SELECT s.* FROM subscriptions s\n\n        LEFT JOIN feed_last_updated lu\n        ON s.uid = lu.subscription_id\n\n        WHERE \n            (lu.last_updated IS NULL OR lu.last_updated < :outdatedThreshold)\n            AND s.notification_mode = :notificationMode\n        \"\"\"\n    )\n    abstract fun getOutdatedWithNotificationMode(\n        outdatedThreshold: OffsetDateTime,\n        @NotificationMode notificationMode: Int\n    ): Flowable<List<SubscriptionEntity>>\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedGroupDAO.kt",
    "content": "package org.schabi.newpipe.database.feed.dao\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport androidx.room.Transaction\nimport androidx.room.Update\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.core.Maybe\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity\n\n@Dao\nabstract class FeedGroupDAO {\n\n    @Query(\"SELECT * FROM feed_group ORDER BY sort_order ASC\")\n    abstract fun getAll(): Flowable<List<FeedGroupEntity>>\n\n    @Query(\"SELECT * FROM feed_group WHERE uid = :groupId\")\n    abstract fun getGroup(groupId: Long): Maybe<FeedGroupEntity>\n\n    @Transaction\n    open fun insert(feedGroupEntity: FeedGroupEntity): Long {\n        val nextSortOrder = nextSortOrder()\n        feedGroupEntity.sortOrder = nextSortOrder\n        return insertInternal(feedGroupEntity)\n    }\n\n    @Update(onConflict = OnConflictStrategy.IGNORE)\n    abstract fun update(feedGroupEntity: FeedGroupEntity): Int\n\n    @Query(\"DELETE FROM feed_group\")\n    abstract fun deleteAll(): Int\n\n    @Query(\"DELETE FROM feed_group WHERE uid = :groupId\")\n    abstract fun delete(groupId: Long): Int\n\n    @Query(\"SELECT subscription_id FROM feed_group_subscription_join WHERE group_id = :groupId\")\n    abstract fun getSubscriptionIdsFor(groupId: Long): Flowable<List<Long>>\n\n    @Query(\"DELETE FROM feed_group_subscription_join WHERE group_id = :groupId\")\n    abstract fun deleteSubscriptionsFromGroup(groupId: Long): Int\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    abstract fun insertSubscriptionsToGroup(entities: List<FeedGroupSubscriptionEntity>): List<Long>\n\n    @Transaction\n    open fun updateSubscriptionsForGroup(groupId: Long, subscriptionIds: List<Long>) {\n        deleteSubscriptionsFromGroup(groupId)\n        insertSubscriptionsToGroup(subscriptionIds.map { FeedGroupSubscriptionEntity(groupId, it) })\n    }\n\n    @Transaction\n    open fun updateOrder(orderMap: Map<Long, Long>) {\n        orderMap.forEach { (groupId, sortOrder) -> updateOrder(groupId, sortOrder) }\n    }\n\n    @Query(\"UPDATE feed_group SET sort_order = :sortOrder WHERE uid = :groupId\")\n    abstract fun updateOrder(groupId: Long, sortOrder: Long): Int\n\n    @Query(\"SELECT IFNULL(MAX(sort_order) + 1, 0) FROM feed_group\")\n    protected abstract fun nextSortOrder(): Long\n\n    @Insert(onConflict = OnConflictStrategy.ABORT)\n    protected abstract fun insertInternal(feedGroupEntity: FeedGroupEntity): Long\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt",
    "content": "package org.schabi.newpipe.database.feed.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\nimport org.schabi.newpipe.database.feed.model.FeedEntity.Companion.FEED_TABLE\nimport org.schabi.newpipe.database.feed.model.FeedEntity.Companion.STREAM_ID\nimport org.schabi.newpipe.database.feed.model.FeedEntity.Companion.SUBSCRIPTION_ID\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\n\n@Entity(\n    tableName = FEED_TABLE,\n    primaryKeys = [STREAM_ID, SUBSCRIPTION_ID],\n    indices = [Index(SUBSCRIPTION_ID)],\n    foreignKeys = [\n        ForeignKey(\n            entity = StreamEntity::class,\n            parentColumns = [StreamEntity.STREAM_ID],\n            childColumns = [STREAM_ID],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n            deferred = true\n        ),\n        ForeignKey(\n            entity = SubscriptionEntity::class,\n            parentColumns = [SubscriptionEntity.SUBSCRIPTION_UID],\n            childColumns = [SUBSCRIPTION_ID],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n            deferred = true\n        )\n    ]\n)\ndata class FeedEntity(\n    @ColumnInfo(name = STREAM_ID)\n    var streamId: Long,\n\n    @ColumnInfo(name = SUBSCRIPTION_ID)\n    var subscriptionId: Long\n) {\n\n    companion object {\n        const val FEED_TABLE = \"feed\"\n\n        const val STREAM_ID = \"stream_id\"\n        const val SUBSCRIPTION_ID = \"subscription_id\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupEntity.kt",
    "content": "package org.schabi.newpipe.database.feed.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity.Companion.FEED_GROUP_TABLE\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity.Companion.SORT_ORDER\nimport org.schabi.newpipe.local.subscription.FeedGroupIcon\n\n@Entity(\n    tableName = FEED_GROUP_TABLE,\n    indices = [Index(SORT_ORDER)]\n)\ndata class FeedGroupEntity(\n    @PrimaryKey(autoGenerate = true)\n    @ColumnInfo(name = ID)\n    val uid: Long,\n\n    @ColumnInfo(name = NAME)\n    var name: String,\n\n    @ColumnInfo(name = ICON)\n    var icon: FeedGroupIcon,\n\n    @ColumnInfo(name = SORT_ORDER)\n    var sortOrder: Long = -1\n) {\n    companion object {\n        const val FEED_GROUP_TABLE = \"feed_group\"\n\n        const val ID = \"uid\"\n        const val NAME = \"name\"\n        const val ICON = \"icon_id\"\n        const val SORT_ORDER = \"sort_order\"\n\n        const val GROUP_ALL_ID = -1L\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt",
    "content": "package org.schabi.newpipe.database.feed.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\nimport org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity.Companion.FEED_GROUP_SUBSCRIPTION_TABLE\nimport org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity.Companion.GROUP_ID\nimport org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity.Companion.SUBSCRIPTION_ID\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\n\n@Entity(\n    tableName = FEED_GROUP_SUBSCRIPTION_TABLE,\n    primaryKeys = [GROUP_ID, SUBSCRIPTION_ID],\n    indices = [Index(SUBSCRIPTION_ID)],\n    foreignKeys = [\n        ForeignKey(\n            entity = FeedGroupEntity::class,\n            parentColumns = [FeedGroupEntity.ID],\n            childColumns = [GROUP_ID],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n            deferred = true\n        ),\n\n        ForeignKey(\n            entity = SubscriptionEntity::class,\n            parentColumns = [SubscriptionEntity.SUBSCRIPTION_UID],\n            childColumns = [SUBSCRIPTION_ID],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n            deferred = true\n        )\n    ]\n)\ndata class FeedGroupSubscriptionEntity(\n    @ColumnInfo(name = GROUP_ID)\n    var feedGroupId: Long,\n\n    @ColumnInfo(name = SUBSCRIPTION_ID)\n    var subscriptionId: Long\n) {\n\n    companion object {\n        const val FEED_GROUP_SUBSCRIPTION_TABLE = \"feed_group_subscription_join\"\n\n        const val GROUP_ID = \"group_id\"\n        const val SUBSCRIPTION_ID = \"subscription_id\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt",
    "content": "package org.schabi.newpipe.database.feed.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.PrimaryKey\nimport java.time.OffsetDateTime\nimport org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.FEED_LAST_UPDATED_TABLE\nimport org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.SUBSCRIPTION_ID\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\n\n@Entity(\n    tableName = FEED_LAST_UPDATED_TABLE,\n    foreignKeys = [\n        ForeignKey(\n            entity = SubscriptionEntity::class,\n            parentColumns = [SubscriptionEntity.SUBSCRIPTION_UID],\n            childColumns = [SUBSCRIPTION_ID],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n            deferred = true\n        )\n    ]\n)\ndata class FeedLastUpdatedEntity(\n    @PrimaryKey\n    @ColumnInfo(name = SUBSCRIPTION_ID)\n    var subscriptionId: Long,\n\n    @ColumnInfo(name = LAST_UPDATED)\n    var lastUpdated: OffsetDateTime? = null\n) {\n    companion object {\n        const val FEED_LAST_UPDATED_TABLE = \"feed_last_updated\"\n\n        const val SUBSCRIPTION_ID = \"subscription_id\"\n        const val LAST_UPDATED = \"last_updated\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2017-2021 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.history.dao\n\nimport androidx.room.Dao\nimport androidx.room.Query\nimport io.reactivex.rxjava3.core.Flowable\nimport org.schabi.newpipe.database.BasicDAO\nimport org.schabi.newpipe.database.history.model.SearchHistoryEntry\n\n@Dao\ninterface SearchHistoryDAO : BasicDAO<SearchHistoryEntry> {\n\n    @get:Query(\"SELECT * FROM search_history WHERE id = (SELECT MAX(id) FROM search_history)\")\n    val latestEntry: SearchHistoryEntry?\n\n    @Query(\"DELETE FROM search_history\")\n    override fun deleteAll(): Int\n\n    @Query(\"DELETE FROM search_history WHERE search = :query\")\n    fun deleteAllWhereQuery(query: String): Int\n\n    @Query(\"SELECT * FROM search_history ORDER BY creation_date DESC\")\n    override fun getAll(): Flowable<List<SearchHistoryEntry>>\n\n    @Query(\"SELECT search FROM search_history GROUP BY search ORDER BY MAX(creation_date) DESC LIMIT :limit\")\n    fun getUniqueEntries(limit: Int): Flowable<MutableList<String>>\n\n    @Query(\"SELECT * FROM search_history WHERE service_id = :serviceId ORDER BY creation_date DESC\")\n    override fun listByService(serviceId: Int): Flowable<List<SearchHistoryEntry>>\n\n    @Query(\n        \"\"\"\n        SELECT search FROM search_history WHERE search LIKE :query ||\n        '%' GROUP BY search ORDER BY MAX(creation_date) DESC LIMIT :limit\n        \"\"\"\n    )\n    fun getSimilarEntries(query: String, limit: Int): Flowable<MutableList<String>>\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2022 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.history.dao\n\nimport androidx.room.Dao\nimport androidx.room.Query\nimport androidx.room.RewriteQueriesToDropUnusedColumns\nimport io.reactivex.rxjava3.core.Flowable\nimport org.schabi.newpipe.database.BasicDAO\nimport org.schabi.newpipe.database.history.model.StreamHistoryEntity\nimport org.schabi.newpipe.database.history.model.StreamHistoryEntry\nimport org.schabi.newpipe.database.stream.StreamStatisticsEntry\n\n@Dao\nabstract class StreamHistoryDAO : BasicDAO<StreamHistoryEntity> {\n\n    @Query(\"SELECT * FROM stream_history\")\n    abstract override fun getAll(): Flowable<List<StreamHistoryEntity>>\n\n    @Query(\"DELETE FROM stream_history\")\n    abstract override fun deleteAll(): Int\n\n    override fun listByService(serviceId: Int): Flowable<List<StreamHistoryEntity>> {\n        throw UnsupportedOperationException()\n    }\n\n    @get:Query(\"SELECT * FROM streams INNER JOIN stream_history ON uid = stream_id ORDER BY access_date DESC\")\n    abstract val history: Flowable<MutableList<StreamHistoryEntry>>\n\n    @get:Query(\"SELECT * FROM streams INNER JOIN stream_history ON uid = stream_id ORDER BY uid ASC\")\n    abstract val historySortedById: Flowable<MutableList<StreamHistoryEntry>>\n\n    @Query(\"SELECT * FROM stream_history WHERE stream_id = :streamId ORDER BY access_date DESC LIMIT 1\")\n    abstract fun getLatestEntry(streamId: Long): StreamHistoryEntity?\n\n    @Query(\"DELETE FROM stream_history WHERE stream_id = :streamId\")\n    abstract fun deleteStreamHistory(streamId: Long): Int\n\n    // Select the latest entry and watch count for each stream id on history table\n    @RewriteQueriesToDropUnusedColumns\n    @Query(\n        \"\"\"\n        SELECT * FROM streams\n\n        INNER JOIN (\n            SELECT stream_id, MAX(access_date) AS latestAccess, SUM(repeat_count) AS watchCount\n            FROM stream_history\n            GROUP BY stream_id\n        )\n        ON uid = stream_id\n\n        LEFT JOIN (SELECT stream_id AS stream_id_alias, progress_time FROM stream_state )\n        ON uid = stream_id_alias\n        \"\"\"\n    )\n    abstract fun getStatistics(): Flowable<MutableList<StreamStatisticsEntry>>\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2022 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.history.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Ignore\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport java.time.OffsetDateTime\n\n@Entity(\n    tableName = SearchHistoryEntry.TABLE_NAME,\n    indices = [Index(value = [SearchHistoryEntry.SEARCH])]\n)\ndata class SearchHistoryEntry @JvmOverloads constructor(\n    @ColumnInfo(name = CREATION_DATE)\n    var creationDate: OffsetDateTime?,\n\n    @ColumnInfo(name = SERVICE_ID)\n    val serviceId: Int,\n\n    @ColumnInfo(name = SEARCH)\n    val search: String?,\n\n    @ColumnInfo(name = ID)\n    @PrimaryKey(autoGenerate = true)\n    val id: Long = 0\n) {\n\n    @Ignore\n    fun hasEqualValues(otherEntry: SearchHistoryEntry): Boolean {\n        return serviceId == otherEntry.serviceId && search == otherEntry.search\n    }\n\n    companion object {\n        const val ID = \"id\"\n        const val TABLE_NAME = \"search_history\"\n        const val SERVICE_ID = \"service_id\"\n        const val CREATION_DATE = \"creation_date\"\n        const val SEARCH = \"search\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2022 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.history.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.ForeignKey.Companion.CASCADE\nimport androidx.room.Index\nimport java.time.OffsetDateTime\nimport org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.JOIN_STREAM_ID\nimport org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.STREAM_ACCESS_DATE\nimport org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.STREAM_HISTORY_TABLE\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID\n\n/**\n * @param streamUid the stream id this history item will refer to\n * @param accessDate the last time the stream was accessed\n * @param repeatCount the total number of views this stream received\n */\n@Entity(\n    tableName = STREAM_HISTORY_TABLE,\n    primaryKeys = [JOIN_STREAM_ID, STREAM_ACCESS_DATE],\n    indices = [Index(value = [JOIN_STREAM_ID])],\n    foreignKeys = [\n        ForeignKey(\n            entity = StreamEntity::class,\n            parentColumns = arrayOf(STREAM_ID),\n            childColumns = arrayOf(JOIN_STREAM_ID),\n            onDelete = CASCADE,\n            onUpdate = CASCADE\n        )\n    ]\n)\ndata class StreamHistoryEntity(\n    @ColumnInfo(name = JOIN_STREAM_ID)\n    val streamUid: Long,\n\n    @ColumnInfo(name = STREAM_ACCESS_DATE)\n    var accessDate: OffsetDateTime,\n\n    @ColumnInfo(name = STREAM_REPEAT_COUNT)\n    var repeatCount: Long\n) {\n    companion object {\n        const val STREAM_HISTORY_TABLE: String = \"stream_history\"\n        const val STREAM_ACCESS_DATE: String = \"access_date\"\n        const val JOIN_STREAM_ID: String = \"stream_id\"\n        const val STREAM_REPEAT_COUNT: String = \"repeat_count\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt",
    "content": "package org.schabi.newpipe.database.history.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Embedded\nimport java.time.OffsetDateTime\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.util.image.ImageStrategy\n\ndata class StreamHistoryEntry(\n    @Embedded\n    val streamEntity: StreamEntity,\n\n    @ColumnInfo(name = StreamHistoryEntity.JOIN_STREAM_ID)\n    val streamId: Long,\n\n    @ColumnInfo(name = StreamHistoryEntity.STREAM_ACCESS_DATE)\n    val accessDate: OffsetDateTime,\n\n    @ColumnInfo(name = StreamHistoryEntity.STREAM_REPEAT_COUNT)\n    val repeatCount: Long\n) {\n\n    fun toStreamHistoryEntity(): StreamHistoryEntity {\n        return StreamHistoryEntity(streamId, accessDate, repeatCount)\n    }\n\n    fun hasEqualValues(other: StreamHistoryEntry): Boolean {\n        return this.streamEntity.uid == other.streamEntity.uid && streamId == other.streamId &&\n            accessDate.isEqual(other.accessDate)\n    }\n\n    fun toStreamInfoItem(): StreamInfoItem = StreamInfoItem(\n        streamEntity.serviceId,\n        streamEntity.url,\n        streamEntity.title,\n        streamEntity.streamType\n    ).apply {\n        duration = streamEntity.duration\n        uploaderName = streamEntity.uploader\n        uploaderUrl = streamEntity.uploaderUrl\n        thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2023-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.playlist\n\nimport androidx.room.ColumnInfo\nimport org.schabi.newpipe.database.playlist.model.PlaylistEntity\n\n/**\n * This class adds a field to [PlaylistMetadataEntry] that contains an integer representing\n * how many times a specific stream is already contained inside a local playlist. Used to be able\n * to grey out playlists which already contain the current stream in the playlist append dialog.\n * @see org.schabi.newpipe.local.playlist.LocalPlaylistManager.getPlaylistDuplicates\n */\ndata class PlaylistDuplicatesEntry(\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_ID)\n    override val uid: Long,\n\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_URL)\n    override val thumbnailUrl: String?,\n\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_PERMANENT)\n    override val isThumbnailPermanent: Boolean?,\n\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_STREAM_ID)\n    override val thumbnailStreamId: Long?,\n\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_DISPLAY_INDEX)\n    override var displayIndex: Long?,\n\n    @ColumnInfo(name = PLAYLIST_STREAM_COUNT)\n    override val streamCount: Long,\n\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_NAME)\n    override val orderingName: String?,\n\n    @ColumnInfo(name = PLAYLIST_TIMES_STREAM_IS_CONTAINED)\n    val timesStreamIsContained: Long\n) : PlaylistMetadataEntry(\n    uid = uid,\n    orderingName = orderingName,\n    thumbnailUrl = thumbnailUrl,\n    isThumbnailPermanent = isThumbnailPermanent,\n    thumbnailStreamId = thumbnailStreamId,\n    displayIndex = displayIndex,\n    streamCount = streamCount\n) {\n    companion object {\n        const val PLAYLIST_TIMES_STREAM_IS_CONTAINED: String = \"timesStreamIsContained\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistLocalItem.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.playlist\n\nimport org.schabi.newpipe.database.LocalItem\n\ninterface PlaylistLocalItem : LocalItem {\n    val orderingName: String?\n    val displayIndex: Long?\n    val uid: Long\n    val thumbnailUrl: String?\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.playlist\n\nimport androidx.room.ColumnInfo\nimport org.schabi.newpipe.database.LocalItem.LocalItemType\nimport org.schabi.newpipe.database.playlist.model.PlaylistEntity\n\nopen class PlaylistMetadataEntry(\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_ID)\n    override val uid: Long,\n\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_NAME)\n    override val orderingName: String?,\n\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_URL)\n    override val thumbnailUrl: String?,\n\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_DISPLAY_INDEX)\n    override var displayIndex: Long?,\n\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_PERMANENT)\n    open val isThumbnailPermanent: Boolean?,\n\n    @ColumnInfo(name = PlaylistEntity.PLAYLIST_THUMBNAIL_STREAM_ID)\n    open val thumbnailStreamId: Long?,\n\n    @ColumnInfo(name = PLAYLIST_STREAM_COUNT)\n    open val streamCount: Long\n) : PlaylistLocalItem {\n\n    override val localItemType: LocalItemType\n        get() = LocalItemType.PLAYLIST_LOCAL_ITEM\n\n    companion object {\n        const val PLAYLIST_STREAM_COUNT: String = \"streamCount\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2020-2023 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.playlist\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Embedded\nimport org.schabi.newpipe.database.LocalItem\nimport org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.util.image.ImageStrategy\n\ndata class PlaylistStreamEntry(\n    @Embedded\n    val streamEntity: StreamEntity,\n\n    @ColumnInfo(name = StreamStateEntity.STREAM_PROGRESS_MILLIS, defaultValue = \"0\")\n    val progressMillis: Long,\n\n    @ColumnInfo(name = PlaylistStreamEntity.JOIN_STREAM_ID)\n    val streamId: Long,\n\n    @ColumnInfo(name = PlaylistStreamEntity.JOIN_INDEX)\n    val joinIndex: Int\n) : LocalItem {\n\n    override val localItemType: LocalItem.LocalItemType\n        get() = LocalItem.LocalItemType.PLAYLIST_STREAM_ITEM\n\n    @Throws(IllegalArgumentException::class)\n    fun toStreamInfoItem(): StreamInfoItem {\n        return StreamInfoItem(\n            streamEntity.serviceId,\n            streamEntity.url,\n            streamEntity.title,\n            streamEntity.streamType\n        ).apply {\n            duration = streamEntity.duration\n            uploaderName = streamEntity.uploader\n            uploaderUrl = streamEntity.uploaderUrl\n            thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2022 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.playlist.dao\n\nimport androidx.room.Dao\nimport androidx.room.Query\nimport androidx.room.Transaction\nimport io.reactivex.rxjava3.core.Flowable\nimport org.schabi.newpipe.database.BasicDAO\nimport org.schabi.newpipe.database.playlist.model.PlaylistEntity\n\n@Dao\ninterface PlaylistDAO : BasicDAO<PlaylistEntity> {\n\n    @Query(\"SELECT * FROM playlists\")\n    override fun getAll(): Flowable<List<PlaylistEntity>>\n\n    @Query(\"DELETE FROM playlists\")\n    override fun deleteAll(): Int\n\n    override fun listByService(serviceId: Int): Flowable<List<PlaylistEntity>> {\n        throw UnsupportedOperationException()\n    }\n\n    @Query(\"SELECT * FROM playlists WHERE uid = :playlistId\")\n    fun getPlaylist(playlistId: Long): Flowable<MutableList<PlaylistEntity>>\n\n    @Query(\"DELETE FROM playlists WHERE uid = :playlistId\")\n    fun deletePlaylist(playlistId: Long): Int\n\n    @get:Query(\"SELECT COUNT(*) FROM playlists\")\n    val count: Flowable<Long>\n\n    @Transaction\n    fun upsertPlaylist(playlist: PlaylistEntity): Long {\n        if (playlist.uid == -1L) {\n            // This situation is probably impossible.\n            return insert(playlist)\n        } else {\n            update(playlist)\n            return playlist.uid\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.playlist.dao\n\nimport androidx.room.Dao\nimport androidx.room.Query\nimport androidx.room.Transaction\nimport io.reactivex.rxjava3.core.Flowable\nimport org.schabi.newpipe.database.BasicDAO\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity\n\n@Dao\ninterface PlaylistRemoteDAO : BasicDAO<PlaylistRemoteEntity> {\n\n    @Query(\"SELECT * FROM remote_playlists\")\n    override fun getAll(): Flowable<List<PlaylistRemoteEntity>>\n\n    @Query(\"DELETE FROM remote_playlists\")\n    override fun deleteAll(): Int\n\n    @Query(\"SELECT * FROM remote_playlists WHERE service_id = :serviceId\")\n    override fun listByService(serviceId: Int): Flowable<List<PlaylistRemoteEntity>>\n\n    @Query(\"SELECT * FROM remote_playlists WHERE uid = :playlistId\")\n    fun getPlaylist(playlistId: Long): Flowable<PlaylistRemoteEntity>\n\n    @Query(\"SELECT * FROM remote_playlists WHERE url = :url AND service_id = :serviceId\")\n    fun getPlaylist(serviceId: Long, url: String?): Flowable<MutableList<PlaylistRemoteEntity>>\n\n    @get:Query(\"SELECT * FROM remote_playlists ORDER BY display_index\")\n    val playlists: Flowable<MutableList<PlaylistRemoteEntity>>\n\n    @Query(\"SELECT uid FROM remote_playlists WHERE url = :url AND service_id = :serviceId\")\n    fun getPlaylistIdInternal(serviceId: Long, url: String?): Long?\n\n    @Transaction\n    fun upsert(playlist: PlaylistRemoteEntity): Long {\n        val playlistId = getPlaylistIdInternal(playlist.serviceId.toLong(), playlist.url)\n\n        if (playlistId == null) {\n            return insert(playlist)\n        } else {\n            playlist.uid = playlistId\n            update(playlist)\n            return playlistId\n        }\n    }\n\n    @Query(\"DELETE FROM remote_playlists WHERE uid = :playlistId\")\n    fun deletePlaylist(playlistId: Long): Int\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.playlist.dao\n\nimport androidx.room.Dao\nimport androidx.room.Query\nimport androidx.room.RewriteQueriesToDropUnusedColumns\nimport androidx.room.Transaction\nimport io.reactivex.rxjava3.core.Flowable\nimport org.schabi.newpipe.database.BasicDAO\nimport org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry\nimport org.schabi.newpipe.database.playlist.PlaylistMetadataEntry\nimport org.schabi.newpipe.database.playlist.PlaylistStreamEntry\nimport org.schabi.newpipe.database.playlist.model.PlaylistEntity.Companion.DEFAULT_THUMBNAIL_ID\nimport org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity\n\n@Dao\ninterface PlaylistStreamDAO : BasicDAO<PlaylistStreamEntity> {\n\n    @Query(\"SELECT * FROM playlist_stream_join\")\n    override fun getAll(): Flowable<List<PlaylistStreamEntity>>\n\n    @Query(\"DELETE FROM playlist_stream_join\")\n    override fun deleteAll(): Int\n\n    override fun listByService(serviceId: Int): Flowable<List<PlaylistStreamEntity>> {\n        throw UnsupportedOperationException()\n    }\n\n    @Query(\"DELETE FROM playlist_stream_join WHERE playlist_id = :playlistId\")\n    fun deleteBatch(playlistId: Long)\n\n    @Query(\"SELECT COALESCE(MAX(join_index), -1) FROM playlist_stream_join WHERE playlist_id = :playlistId\")\n    fun getMaximumIndexOf(playlistId: Long): Flowable<Int>\n\n    @Query(\n        \"\"\"\n        SELECT CASE WHEN COUNT(*) != 0 then stream_id ELSE $DEFAULT_THUMBNAIL_ID END\n        FROM streams\n\n        LEFT JOIN playlist_stream_join\n        ON uid = stream_id\n\n        WHERE playlist_id = :playlistId LIMIT 1\n        \"\"\"\n    )\n    fun getAutomaticThumbnailStreamId(playlistId: Long): Flowable<Long>\n\n    // get ids of streams of the given playlist then merge with the stream metadata\n    @RewriteQueriesToDropUnusedColumns\n    @Transaction\n    @Query(\n        \"\"\"\n        SELECT * FROM streams\n\n        INNER JOIN (SELECT stream_id, join_index FROM playlist_stream_join WHERE playlist_id = :playlistId)\n        ON uid = stream_id\n\n        LEFT JOIN (SELECT stream_id AS stream_id_alias, progress_time FROM stream_state )\n        ON uid = stream_id_alias\n\n        ORDER BY join_index ASC\n        \"\"\"\n    )\n    fun getOrderedStreamsOf(playlistId: Long): Flowable<MutableList<PlaylistStreamEntry>>\n\n    // If a playlist has no streams, there won’t be any rows in the **playlist_stream_join** table\n    // that have a foreign key to that playlist. Thus, the **playlist_id** will not have a\n    // corresponding value in any rows of the join table. So, if you group by the **playlist_id**,\n    // only playlists that contain videos are grouped and displayed. Look at #9642 #13055\n\n    @Transaction\n    @Query(\n        \"\"\"\n        SELECT uid, name, is_thumbnail_permanent, thumbnail_stream_id, display_index,\n        (SELECT thumbnail_url FROM streams WHERE streams.uid = thumbnail_stream_id) AS thumbnail_url,\n\n        COALESCE(COUNT(playlist_id), 0) AS streamCount FROM playlists\n\n        LEFT JOIN playlist_stream_join\n        ON playlists.uid = playlist_id\n\n        GROUP BY uid\n        ORDER BY display_index\n        \"\"\"\n    )\n    fun getPlaylistMetadata(): Flowable<MutableList<PlaylistMetadataEntry>>\n\n    @RewriteQueriesToDropUnusedColumns\n    @Transaction\n    @Query(\n        \"\"\"\n        SELECT *, MIN(join_index) FROM streams\n\n        INNER JOIN (SELECT stream_id, join_index FROM playlist_stream_join WHERE playlist_id = :playlistId)\n        ON uid = stream_id\n\n        LEFT JOIN (SELECT stream_id AS stream_id_alias, progress_time FROM stream_state )\n        ON uid = stream_id_alias\n\n        GROUP BY uid\n        ORDER BY MIN(join_index) ASC\n        \"\"\"\n    )\n    fun getStreamsWithoutDuplicates(playlistId: Long): Flowable<MutableList<PlaylistStreamEntry>>\n\n    // If a playlist has no streams, there won’t be any rows in the **playlist_stream_join** table\n    // that have a foreign key to that playlist. Thus, the **playlist_id** will not have a\n    // corresponding value in any rows of the join table. So, if you group by the **playlist_id**,\n    // only playlists that contain videos are grouped and displayed. Look at #9642 #13055\n\n    @Transaction\n    @Query(\n        \"\"\"\n        SELECT playlists.uid, name, is_thumbnail_permanent, thumbnail_stream_id, display_index,\n        (SELECT thumbnail_url FROM streams WHERE streams.uid = thumbnail_stream_id) AS thumbnail_url,\n\n        COALESCE(COUNT(playlist_id), 0) AS streamCount,\n        COALESCE(SUM(url = :streamUrl), 0) AS timesStreamIsContained FROM playlists\n\n        LEFT JOIN playlist_stream_join\n        ON playlists.uid = playlist_id\n\n        LEFT JOIN streams\n        ON streams.uid = stream_id AND :streamUrl = :streamUrl\n\n        GROUP BY playlists.uid\n        ORDER BY display_index, name\n        \"\"\"\n    )\n    fun getPlaylistDuplicatesMetadata(streamUrl: String): Flowable<MutableList<PlaylistDuplicatesEntry>>\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.playlist.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Ignore\nimport androidx.room.PrimaryKey\nimport org.schabi.newpipe.database.playlist.PlaylistMetadataEntry\n\n@Entity(tableName = PlaylistEntity.Companion.PLAYLIST_TABLE)\ndata class PlaylistEntity @JvmOverloads constructor(\n    @PrimaryKey(autoGenerate = true)\n    @ColumnInfo(name = PLAYLIST_ID)\n    var uid: Long = 0,\n\n    @ColumnInfo(name = PLAYLIST_NAME)\n    var name: String?,\n\n    @ColumnInfo(name = PLAYLIST_THUMBNAIL_PERMANENT)\n    var isThumbnailPermanent: Boolean,\n\n    @ColumnInfo(name = PLAYLIST_THUMBNAIL_STREAM_ID)\n    var thumbnailStreamId: Long,\n\n    @ColumnInfo(name = PLAYLIST_DISPLAY_INDEX)\n    var displayIndex: Long\n) {\n\n    @Ignore\n    constructor(item: PlaylistMetadataEntry) : this(\n        uid = item.uid,\n        name = item.orderingName,\n        isThumbnailPermanent = item.isThumbnailPermanent!!,\n        thumbnailStreamId = item.thumbnailStreamId!!,\n        displayIndex = item.displayIndex!!\n    )\n\n    companion object {\n        const val DEFAULT_THUMBNAIL_ID = -1L\n\n        const val PLAYLIST_TABLE = \"playlists\"\n        const val PLAYLIST_ID = \"uid\"\n        const val PLAYLIST_NAME = \"name\"\n        const val PLAYLIST_THUMBNAIL_URL = \"thumbnail_url\"\n        const val PLAYLIST_DISPLAY_INDEX = \"display_index\"\n        const val PLAYLIST_THUMBNAIL_PERMANENT = \"is_thumbnail_permanent\"\n        const val PLAYLIST_THUMBNAIL_STREAM_ID = \"thumbnail_stream_id\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.playlist.model\n\nimport android.text.TextUtils\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Ignore\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport org.schabi.newpipe.database.LocalItem.LocalItemType\nimport org.schabi.newpipe.database.playlist.PlaylistLocalItem\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.Companion.REMOTE_PLAYLIST_SERVICE_ID\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.Companion.REMOTE_PLAYLIST_TABLE\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.Companion.REMOTE_PLAYLIST_URL\nimport org.schabi.newpipe.extractor.playlist.PlaylistInfo\nimport org.schabi.newpipe.util.NO_SERVICE_ID\nimport org.schabi.newpipe.util.image.ImageStrategy\n\n@Entity(\n    tableName = REMOTE_PLAYLIST_TABLE,\n    indices = [\n        Index(\n            value = [REMOTE_PLAYLIST_SERVICE_ID, REMOTE_PLAYLIST_URL],\n            unique = true\n        )\n    ]\n)\ndata class PlaylistRemoteEntity(\n    @PrimaryKey(autoGenerate = true)\n    @ColumnInfo(name = REMOTE_PLAYLIST_ID)\n    override var uid: Long = 0,\n\n    @ColumnInfo(name = REMOTE_PLAYLIST_SERVICE_ID)\n    val serviceId: Int = NO_SERVICE_ID,\n\n    @ColumnInfo(name = REMOTE_PLAYLIST_NAME)\n    override val orderingName: String?,\n\n    @ColumnInfo(name = REMOTE_PLAYLIST_URL)\n    val url: String?,\n\n    @ColumnInfo(name = REMOTE_PLAYLIST_THUMBNAIL_URL)\n    override val thumbnailUrl: String?,\n\n    @ColumnInfo(name = REMOTE_PLAYLIST_UPLOADER_NAME)\n    val uploader: String?,\n\n    @ColumnInfo(name = REMOTE_PLAYLIST_DISPLAY_INDEX)\n    override var displayIndex: Long = -1, // Make sure the new item is on the top\n\n    @ColumnInfo(name = REMOTE_PLAYLIST_STREAM_COUNT)\n    val streamCount: Long?\n) : PlaylistLocalItem {\n\n    constructor(playlistInfo: PlaylistInfo) : this(\n        serviceId = playlistInfo.serviceId,\n        orderingName = playlistInfo.name,\n        url = playlistInfo.url,\n        thumbnailUrl = ImageStrategy.imageListToDbUrl(\n            playlistInfo.thumbnails.ifEmpty { playlistInfo.uploaderAvatars }\n        ),\n        uploader = playlistInfo.uploaderName,\n        streamCount = playlistInfo.streamCount\n    )\n\n    override val localItemType: LocalItemType\n        get() = LocalItemType.PLAYLIST_REMOTE_ITEM\n\n    /**\n     * Returns boolean comparing the online playlist and the local copy.\n     * (False if info changed such as playlist name or track count)\n     */\n    @Ignore\n    fun isIdenticalTo(info: PlaylistInfo): Boolean {\n        return this.serviceId == info.serviceId && this.streamCount == info.streamCount &&\n            TextUtils.equals(this.orderingName, info.name) &&\n            TextUtils.equals(this.url, info.url) &&\n            // we want to update the local playlist data even when either the remote thumbnail\n            // URL changes, or the preferred image quality setting is changed by the user\n            TextUtils.equals(thumbnailUrl, ImageStrategy.imageListToDbUrl(info.thumbnails)) &&\n            TextUtils.equals(this.uploader, info.uploaderName)\n    }\n\n    companion object {\n        const val REMOTE_PLAYLIST_TABLE = \"remote_playlists\"\n        const val REMOTE_PLAYLIST_ID = \"uid\"\n        const val REMOTE_PLAYLIST_SERVICE_ID = \"service_id\"\n        const val REMOTE_PLAYLIST_NAME = \"name\"\n        const val REMOTE_PLAYLIST_URL = \"url\"\n        const val REMOTE_PLAYLIST_THUMBNAIL_URL = \"thumbnail_url\"\n        const val REMOTE_PLAYLIST_UPLOADER_NAME = \"uploader\"\n        const val REMOTE_PLAYLIST_DISPLAY_INDEX = \"display_index\"\n        const val REMOTE_PLAYLIST_STREAM_COUNT = \"stream_count\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2020 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.playlist.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.ForeignKey.Companion.CASCADE\nimport androidx.room.Index\nimport org.schabi.newpipe.database.LocalItem\nimport org.schabi.newpipe.database.playlist.model.PlaylistEntity.Companion.PLAYLIST_ID\nimport org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.Companion.JOIN_INDEX\nimport org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.Companion.JOIN_PLAYLIST_ID\nimport org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.Companion.JOIN_STREAM_ID\nimport org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.Companion.PLAYLIST_STREAM_JOIN_TABLE\nimport org.schabi.newpipe.database.stream.model.StreamEntity\n\n@Entity(\n    tableName = PLAYLIST_STREAM_JOIN_TABLE,\n    primaryKeys = [JOIN_PLAYLIST_ID, JOIN_INDEX],\n    indices = [\n        Index(value = [JOIN_PLAYLIST_ID, JOIN_INDEX], unique = true),\n        Index(value = [JOIN_STREAM_ID])\n    ],\n    foreignKeys = [\n        ForeignKey(\n            entity = PlaylistEntity::class,\n            parentColumns = arrayOf(PLAYLIST_ID),\n            childColumns = arrayOf(JOIN_PLAYLIST_ID),\n            onDelete = CASCADE,\n            onUpdate = CASCADE,\n            deferred = true\n        ),\n        ForeignKey(\n            entity = StreamEntity::class,\n            parentColumns = arrayOf(StreamEntity.STREAM_ID),\n            childColumns = arrayOf(JOIN_STREAM_ID),\n            onDelete = CASCADE,\n            onUpdate = CASCADE,\n            deferred = true\n        )\n    ]\n)\ndata class PlaylistStreamEntity(\n    @ColumnInfo(name = JOIN_PLAYLIST_ID)\n    val playlistUid: Long,\n\n    @ColumnInfo(name = JOIN_STREAM_ID)\n    val streamUid: Long,\n\n    @ColumnInfo(name = JOIN_INDEX)\n    val index: Int\n) : LocalItem {\n\n    override val localItemType: LocalItem.LocalItemType\n        get() = LocalItem.LocalItemType.PLAYLIST_STREAM_ITEM\n\n    companion object {\n        const val PLAYLIST_STREAM_JOIN_TABLE = \"playlist_stream_join\"\n        const val JOIN_PLAYLIST_ID = \"playlist_id\"\n        const val JOIN_STREAM_ID = \"stream_id\"\n        const val JOIN_INDEX = \"join_index\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2020-2023 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.stream\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Embedded\nimport androidx.room.Ignore\nimport java.time.OffsetDateTime\nimport org.schabi.newpipe.database.LocalItem\nimport org.schabi.newpipe.database.history.model.StreamHistoryEntity\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.STREAM_PROGRESS_MILLIS\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.util.image.ImageStrategy\n\ndata class StreamStatisticsEntry(\n    @Embedded\n    val streamEntity: StreamEntity,\n\n    @ColumnInfo(name = STREAM_PROGRESS_MILLIS, defaultValue = \"0\")\n    val progressMillis: Long,\n\n    @ColumnInfo(name = StreamHistoryEntity.JOIN_STREAM_ID)\n    val streamId: Long,\n\n    @ColumnInfo(name = STREAM_LATEST_DATE)\n    val latestAccessDate: OffsetDateTime,\n\n    @ColumnInfo(name = STREAM_WATCH_COUNT)\n    val watchCount: Long\n) : LocalItem {\n\n    override val localItemType: LocalItem.LocalItemType\n        get() = LocalItem.LocalItemType.STATISTIC_STREAM_ITEM\n\n    @Ignore\n    fun toStreamInfoItem(): StreamInfoItem {\n        return StreamInfoItem(\n            streamEntity.serviceId,\n            streamEntity.url,\n            streamEntity.title,\n            streamEntity.streamType\n        ).apply {\n            duration = streamEntity.duration\n            uploaderName = streamEntity.uploader\n            uploaderUrl = streamEntity.uploaderUrl\n            thumbnails = ImageStrategy.dbUrlToImageList(streamEntity.thumbnailUrl)\n        }\n    }\n\n    companion object {\n        const val STREAM_LATEST_DATE = \"latestAccess\"\n        const val STREAM_WATCH_COUNT = \"watchCount\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/StreamWithState.kt",
    "content": "package org.schabi.newpipe.database.stream\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Embedded\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity\n\ndata class StreamWithState(\n    @Embedded\n    val stream: StreamEntity,\n\n    @ColumnInfo(name = StreamStateEntity.STREAM_PROGRESS_MILLIS)\n    val stateProgressMillis: Long?\n)\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt",
    "content": "package org.schabi.newpipe.database.stream.dao\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport androidx.room.Transaction\nimport io.reactivex.rxjava3.core.Completable\nimport io.reactivex.rxjava3.core.Flowable\nimport java.time.OffsetDateTime\nimport org.schabi.newpipe.database.BasicDAO\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID\nimport org.schabi.newpipe.extractor.stream.StreamType\nimport org.schabi.newpipe.util.StreamTypeUtil\n\n@Dao\nabstract class StreamDAO : BasicDAO<StreamEntity> {\n    @Query(\"SELECT * FROM streams\")\n    abstract override fun getAll(): Flowable<List<StreamEntity>>\n\n    @Query(\"DELETE FROM streams\")\n    abstract override fun deleteAll(): Int\n\n    @Query(\"SELECT * FROM streams WHERE service_id = :serviceId\")\n    abstract override fun listByService(serviceId: Int): Flowable<List<StreamEntity>>\n\n    @Query(\"SELECT * FROM streams WHERE url = :url AND service_id = :serviceId\")\n    abstract fun getStream(serviceId: Long, url: String): Flowable<List<StreamEntity>>\n\n    @Query(\"UPDATE streams SET uploader_url = :uploaderUrl WHERE url = :url AND service_id = :serviceId\")\n    abstract fun setUploaderUrl(serviceId: Long, url: String, uploaderUrl: String): Completable\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    internal abstract fun silentInsertInternal(stream: StreamEntity): Long\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    internal abstract fun silentInsertAllInternal(streams: List<StreamEntity>): List<Long>\n\n    @Query(\"SELECT COUNT(*) != 0 FROM streams WHERE url = :url AND service_id = :serviceId\")\n    internal abstract fun exists(serviceId: Int, url: String): Boolean\n\n    @Query(\n        \"\"\"\n        SELECT uid, stream_type, textual_upload_date, upload_date, is_upload_date_approximation, duration \n        FROM streams WHERE url = :url AND service_id = :serviceId\n        \"\"\"\n    )\n    internal abstract fun getMinimalStreamForCompare(serviceId: Int, url: String): StreamCompareFeed?\n\n    @Transaction\n    open fun upsert(newerStream: StreamEntity): Long {\n        val uid = silentInsertInternal(newerStream)\n\n        if (uid != -1L) {\n            newerStream.uid = uid\n            return uid\n        }\n\n        compareAndUpdateStream(newerStream)\n\n        update(newerStream)\n        return newerStream.uid\n    }\n\n    @Transaction\n    open fun upsertAll(streams: List<StreamEntity>): List<Long> {\n        val insertUidList = silentInsertAllInternal(streams)\n\n        val streamIds = ArrayList<Long>(streams.size)\n        for ((index, uid) in insertUidList.withIndex()) {\n            val newerStream = streams[index]\n            if (uid != -1L) {\n                streamIds.add(uid)\n                newerStream.uid = uid\n                continue\n            }\n\n            compareAndUpdateStream(newerStream)\n            streamIds.add(newerStream.uid)\n        }\n\n        update(streams)\n        return streamIds\n    }\n\n    private fun compareAndUpdateStream(newerStream: StreamEntity) {\n        val existentMinimalStream = getMinimalStreamForCompare(newerStream.serviceId, newerStream.url)\n            ?: error(\"Stream cannot be null just after insertion.\")\n        newerStream.uid = existentMinimalStream.uid\n\n        if (!StreamTypeUtil.isLiveStream(newerStream.streamType)) {\n            // Use the existent upload date if the newer stream does not have a better precision\n            // (i.e. is an approximation). This is done to prevent unnecessary changes.\n            val hasBetterPrecision =\n                newerStream.uploadDate != null && newerStream.isUploadDateApproximation != true\n            if (existentMinimalStream.uploadDate != null && !hasBetterPrecision) {\n                newerStream.uploadDate = existentMinimalStream.uploadDate\n                newerStream.textualUploadDate = existentMinimalStream.textualUploadDate\n                newerStream.isUploadDateApproximation = existentMinimalStream.isUploadDateApproximation\n            }\n\n            if (existentMinimalStream.duration > 0 && newerStream.duration < 0) {\n                newerStream.duration = existentMinimalStream.duration\n            }\n        }\n    }\n\n    @Query(\n        \"\"\"\n        DELETE FROM streams WHERE\n\n        NOT EXISTS (SELECT 1 FROM stream_history sh\n        WHERE sh.stream_id = streams.uid)\n\n        AND NOT EXISTS (SELECT 1 FROM playlist_stream_join ps\n        WHERE ps.stream_id = streams.uid)\n\n        AND NOT EXISTS (SELECT 1 FROM feed f\n        WHERE f.stream_id = streams.uid)\n        \"\"\"\n    )\n    abstract fun deleteOrphans(): Int\n\n    /**\n     * Minimal entry class used when comparing/updating an existent stream.\n     */\n    internal data class StreamCompareFeed(\n        @ColumnInfo(name = STREAM_ID)\n        var uid: Long = 0,\n\n        @ColumnInfo(name = StreamEntity.STREAM_TYPE)\n        var streamType: StreamType,\n\n        @ColumnInfo(name = StreamEntity.STREAM_TEXTUAL_UPLOAD_DATE)\n        var textualUploadDate: String? = null,\n\n        @ColumnInfo(name = StreamEntity.STREAM_UPLOAD_DATE)\n        var uploadDate: OffsetDateTime? = null,\n\n        @ColumnInfo(name = StreamEntity.STREAM_IS_UPLOAD_DATE_APPROXIMATION)\n        var isUploadDateApproximation: Boolean? = null,\n\n        @ColumnInfo(name = StreamEntity.STREAM_DURATION)\n        var duration: Long\n    )\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2021 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.stream.dao\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport androidx.room.Transaction\nimport io.reactivex.rxjava3.core.Flowable\nimport org.schabi.newpipe.database.BasicDAO\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity\n\n@Dao\ninterface StreamStateDAO : BasicDAO<StreamStateEntity> {\n\n    @Query(\"SELECT * FROM \" + StreamStateEntity.STREAM_STATE_TABLE)\n    override fun getAll(): Flowable<List<StreamStateEntity>>\n\n    @Query(\"DELETE FROM \" + StreamStateEntity.STREAM_STATE_TABLE)\n    override fun deleteAll(): Int\n\n    override fun listByService(serviceId: Int): Flowable<List<StreamStateEntity>> {\n        throw UnsupportedOperationException()\n    }\n\n    @Query(\"SELECT * FROM \" + StreamStateEntity.STREAM_STATE_TABLE + \" WHERE \" + StreamStateEntity.JOIN_STREAM_ID + \" = :streamId\")\n    fun getState(streamId: Long): Flowable<MutableList<StreamStateEntity>>\n\n    @Query(\"DELETE FROM \" + StreamStateEntity.STREAM_STATE_TABLE + \" WHERE \" + StreamStateEntity.JOIN_STREAM_ID + \" = :streamId\")\n    fun deleteState(streamId: Long): Int\n\n    @Insert(onConflict = OnConflictStrategy.Companion.IGNORE)\n    fun silentInsertInternal(streamState: StreamStateEntity)\n\n    @Transaction\n    fun upsert(stream: StreamStateEntity): Long {\n        silentInsertInternal(stream)\n        return update(stream).toLong()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt",
    "content": "package org.schabi.newpipe.database.stream.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Ignore\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport java.io.Serializable\nimport java.time.OffsetDateTime\nimport org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_SERVICE_ID\nimport org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_TABLE\nimport org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_URL\nimport org.schabi.newpipe.extractor.localization.DateWrapper\nimport org.schabi.newpipe.extractor.stream.StreamInfo\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.extractor.stream.StreamType\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem\nimport org.schabi.newpipe.util.image.ImageStrategy\n\n@Entity(\n    tableName = STREAM_TABLE,\n    indices = [\n        Index(value = [STREAM_SERVICE_ID, STREAM_URL], unique = true)\n    ]\n)\ndata class StreamEntity(\n    @PrimaryKey(autoGenerate = true)\n    @ColumnInfo(name = STREAM_ID)\n    var uid: Long = 0,\n\n    @ColumnInfo(name = STREAM_SERVICE_ID)\n    var serviceId: Int,\n\n    @ColumnInfo(name = STREAM_URL)\n    var url: String,\n\n    @ColumnInfo(name = STREAM_TITLE)\n    var title: String,\n\n    @ColumnInfo(name = STREAM_TYPE)\n    var streamType: StreamType,\n\n    @ColumnInfo(name = STREAM_DURATION)\n    var duration: Long,\n\n    @ColumnInfo(name = STREAM_UPLOADER)\n    var uploader: String,\n\n    @ColumnInfo(name = STREAM_UPLOADER_URL)\n    var uploaderUrl: String? = null,\n\n    @ColumnInfo(name = STREAM_THUMBNAIL_URL)\n    var thumbnailUrl: String? = null,\n\n    @ColumnInfo(name = STREAM_VIEWS)\n    var viewCount: Long? = null,\n\n    @ColumnInfo(name = STREAM_TEXTUAL_UPLOAD_DATE)\n    var textualUploadDate: String? = null,\n\n    @ColumnInfo(name = STREAM_UPLOAD_DATE)\n    var uploadDate: OffsetDateTime? = null,\n\n    @ColumnInfo(name = STREAM_IS_UPLOAD_DATE_APPROXIMATION)\n    var isUploadDateApproximation: Boolean? = null\n) : Serializable {\n    @Ignore\n    constructor(item: StreamInfoItem) : this(\n        serviceId = item.serviceId, url = item.url, title = item.name,\n        streamType = item.streamType, duration = item.duration, uploader = item.uploaderName,\n        uploaderUrl = item.uploaderUrl,\n        thumbnailUrl = ImageStrategy.imageListToDbUrl(item.thumbnails), viewCount = item.viewCount,\n        textualUploadDate = item.textualUploadDate, uploadDate = item.uploadDate?.offsetDateTime(),\n        isUploadDateApproximation = item.uploadDate?.isApproximation\n    )\n\n    @Ignore\n    constructor(info: StreamInfo) : this(\n        serviceId = info.serviceId, url = info.url, title = info.name,\n        streamType = info.streamType, duration = info.duration, uploader = info.uploaderName,\n        uploaderUrl = info.uploaderUrl,\n        thumbnailUrl = ImageStrategy.imageListToDbUrl(info.thumbnails), viewCount = info.viewCount,\n        textualUploadDate = info.textualUploadDate, uploadDate = info.uploadDate?.offsetDateTime(),\n        isUploadDateApproximation = info.uploadDate?.isApproximation\n    )\n\n    @Ignore\n    constructor(item: PlayQueueItem) : this(\n        serviceId = item.serviceId,\n        url = item.url,\n        title = item.title,\n        streamType = item.streamType,\n        duration = item.duration,\n        uploader = item.uploader,\n        uploaderUrl = item.uploaderUrl,\n        thumbnailUrl = ImageStrategy.imageListToDbUrl(item.thumbnails)\n    )\n\n    fun toStreamInfoItem(): StreamInfoItem {\n        val item = StreamInfoItem(serviceId, url, title, streamType)\n        item.duration = duration\n        item.uploaderName = uploader\n        item.uploaderUrl = uploaderUrl\n        item.thumbnails = ImageStrategy.dbUrlToImageList(thumbnailUrl)\n\n        if (viewCount != null) item.viewCount = viewCount as Long\n        item.textualUploadDate = textualUploadDate\n        item.uploadDate = uploadDate?.let {\n            DateWrapper(it, isUploadDateApproximation ?: false)\n        }\n\n        return item\n    }\n\n    companion object {\n        const val STREAM_TABLE = \"streams\"\n        const val STREAM_ID = \"uid\"\n        const val STREAM_SERVICE_ID = \"service_id\"\n        const val STREAM_URL = \"url\"\n        const val STREAM_TITLE = \"title\"\n        const val STREAM_TYPE = \"stream_type\"\n        const val STREAM_DURATION = \"duration\"\n        const val STREAM_UPLOADER = \"uploader\"\n        const val STREAM_UPLOADER_URL = \"uploader_url\"\n        const val STREAM_THUMBNAIL_URL = \"thumbnail_url\"\n\n        const val STREAM_VIEWS = \"view_count\"\n        const val STREAM_TEXTUAL_UPLOAD_DATE = \"textual_upload_date\"\n        const val STREAM_UPLOAD_DATE = \"upload_date\"\n        const val STREAM_IS_UPLOAD_DATE_APPROXIMATION = \"is_upload_date_approximation\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2023 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.stream.model\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.ForeignKey.Companion.CASCADE\nimport org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.JOIN_STREAM_ID\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.PLAYBACK_FINISHED_END_MILLISECONDS\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.STREAM_STATE_TABLE\n\n@Entity(\n    tableName = STREAM_STATE_TABLE,\n    primaryKeys = [JOIN_STREAM_ID],\n    foreignKeys = [\n        ForeignKey(\n            entity = StreamEntity::class,\n            parentColumns = arrayOf(STREAM_ID),\n            childColumns = arrayOf(JOIN_STREAM_ID),\n            onDelete = CASCADE,\n            onUpdate = CASCADE\n        )\n    ]\n)\ndata class StreamStateEntity(\n    @ColumnInfo(name = JOIN_STREAM_ID)\n    val streamUid: Long,\n\n    @ColumnInfo(name = STREAM_PROGRESS_MILLIS)\n    val progressMillis: Long\n) {\n    /**\n     * The state will be considered valid, and thus be saved, if the progress is more than\n     * [PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS] or at least 1/4 of the video length.\n     * @param durationInSeconds the duration of the stream connected with this state, in seconds\n     * @return whether this stream state entity should be saved or not\n     */\n    fun isValid(durationInSeconds: Long): Boolean {\n        return progressMillis > PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS ||\n            progressMillis > durationInSeconds * 1000 / 4\n    }\n\n    /**\n     * The video will be considered as finished, if the time left is less than\n     * [PLAYBACK_FINISHED_END_MILLISECONDS] and the progress is at least 3/4 of the video length.\n     * The state will be saved anyway, so that it can be shown under stream info items, but the\n     * player will not resume if a state is considered as finished. Finished streams are also the\n     * ones that can be filtered out in the feed fragment.\n     * @param durationInSeconds the duration of the stream connected with this state, in seconds\n     * @return whether the stream is finished or not\n     */\n    fun isFinished(durationInSeconds: Long): Boolean {\n        return progressMillis >= durationInSeconds * 1000 - PLAYBACK_FINISHED_END_MILLISECONDS &&\n            progressMillis >= durationInSeconds * 1000 * 3 / 4\n    }\n\n    companion object {\n        const val STREAM_STATE_TABLE = \"stream_state\"\n        const val JOIN_STREAM_ID = \"stream_id\"\n\n        // This additional field is required for the SQL query because 'stream_id' is used\n        // for some other joins already\n        const val JOIN_STREAM_ID_ALIAS = \"stream_id_alias\"\n        const val STREAM_PROGRESS_MILLIS = \"progress_time\"\n\n        /**\n         * Playback state will not be saved, if playback time is less than this threshold\n         * (5000ms = 5s).\n         */\n        const val PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS = 5000L\n\n        /**\n         * Stream will be considered finished if the playback time left exceeds this threshold\n         * (60000ms = 60s).\n         * @see org.schabi.newpipe.database.stream.model.StreamStateEntity.isFinished\n         */\n        const val PLAYBACK_FINISHED_END_MILLISECONDS = 60000L\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/subscription/NotificationMode.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2021 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.subscription\n\nimport androidx.annotation.IntDef\n\n@IntDef(NotificationMode.Companion.DISABLED, NotificationMode.Companion.ENABLED)\n@Retention(AnnotationRetention.SOURCE)\nannotation class NotificationMode {\n    companion object {\n        const val DISABLED = 0\n        const val ENABLED = 1 // other values reserved for the future\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt",
    "content": "package org.schabi.newpipe.database.subscription\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport androidx.room.RewriteQueriesToDropUnusedColumns\nimport androidx.room.Transaction\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.core.Maybe\nimport org.schabi.newpipe.database.BasicDAO\n\n@Dao\nabstract class SubscriptionDAO : BasicDAO<SubscriptionEntity> {\n    @Query(\"SELECT COUNT(*) FROM subscriptions\")\n    abstract fun rowCount(): Flowable<Long>\n\n    @Query(\"SELECT * FROM subscriptions WHERE service_id = :serviceId\")\n    abstract override fun listByService(serviceId: Int): Flowable<List<SubscriptionEntity>>\n\n    @Query(\"SELECT * FROM subscriptions ORDER BY name COLLATE NOCASE ASC\")\n    abstract override fun getAll(): Flowable<List<SubscriptionEntity>>\n\n    @Query(\n        \"\"\"\n        SELECT * FROM subscriptions\n\n        WHERE name LIKE '%' || :filter || '%'\n\n        ORDER BY name COLLATE NOCASE ASC\n        \"\"\"\n    )\n    abstract fun getSubscriptionsFiltered(filter: String): Flowable<List<SubscriptionEntity>>\n\n    @RewriteQueriesToDropUnusedColumns\n    @Query(\n        \"\"\"\n        SELECT * FROM subscriptions s\n\n        LEFT JOIN feed_group_subscription_join fgs\n        ON s.uid = fgs.subscription_id\n\n        WHERE (fgs.subscription_id IS NULL OR fgs.group_id = :currentGroupId)\n\n        ORDER BY name COLLATE NOCASE ASC\n        \"\"\"\n    )\n    abstract fun getSubscriptionsOnlyUngrouped(\n        currentGroupId: Long\n    ): Flowable<List<SubscriptionEntity>>\n\n    @RewriteQueriesToDropUnusedColumns\n    @Query(\n        \"\"\"\n        SELECT * FROM subscriptions s\n\n        LEFT JOIN feed_group_subscription_join fgs\n        ON s.uid = fgs.subscription_id\n\n        WHERE (fgs.subscription_id IS NULL OR fgs.group_id = :currentGroupId)\n        AND s.name LIKE '%' || :filter || '%'\n\n        ORDER BY name COLLATE NOCASE ASC\n        \"\"\"\n    )\n    abstract fun getSubscriptionsOnlyUngroupedFiltered(\n        currentGroupId: Long,\n        filter: String\n    ): Flowable<List<SubscriptionEntity>>\n\n    @Query(\"SELECT * FROM subscriptions WHERE url LIKE :url AND service_id = :serviceId\")\n    abstract fun getSubscriptionFlowable(serviceId: Int, url: String): Flowable<List<SubscriptionEntity>>\n\n    @Query(\"SELECT * FROM subscriptions WHERE url LIKE :url AND service_id = :serviceId\")\n    abstract fun getSubscription(serviceId: Int, url: String): Maybe<SubscriptionEntity>\n\n    @Query(\"SELECT * FROM subscriptions WHERE uid = :subscriptionId\")\n    abstract fun getSubscription(subscriptionId: Long): SubscriptionEntity\n\n    @Query(\"DELETE FROM subscriptions\")\n    abstract override fun deleteAll(): Int\n\n    @Query(\"DELETE FROM subscriptions WHERE url LIKE :url AND service_id = :serviceId\")\n    abstract fun deleteSubscription(serviceId: Int, url: String): Int\n\n    @Query(\"SELECT uid FROM subscriptions WHERE url LIKE :url AND service_id = :serviceId\")\n    internal abstract fun getSubscriptionIdInternal(serviceId: Int, url: String): Long?\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    internal abstract fun silentInsertAllInternal(entities: List<SubscriptionEntity>): List<Long>\n\n    @Transaction\n    open fun upsertAll(entities: List<SubscriptionEntity>): List<SubscriptionEntity> {\n        val insertUidList = silentInsertAllInternal(entities)\n\n        insertUidList.forEachIndexed { index: Int, uidFromInsert: Long ->\n            val entity = entities[index]\n\n            if (uidFromInsert != -1L) {\n                entity.uid = uidFromInsert\n            } else {\n                val subscriptionIdFromDb = getSubscriptionIdInternal(entity.serviceId, entity.url!!)\n                    ?: error(\"Subscription cannot be null just after insertion.\")\n                entity.uid = subscriptionIdFromDb\n\n                update(entity)\n            }\n        }\n\n        return entities\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2017-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.subscription\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Ignore\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport org.schabi.newpipe.extractor.channel.ChannelInfo\nimport org.schabi.newpipe.extractor.channel.ChannelInfoItem\nimport org.schabi.newpipe.util.NO_SERVICE_ID\nimport org.schabi.newpipe.util.image.ImageStrategy\n\n@Entity(\n    tableName = SubscriptionEntity.Companion.SUBSCRIPTION_TABLE,\n    indices = [\n        Index(\n            value = [SubscriptionEntity.Companion.SUBSCRIPTION_SERVICE_ID, SubscriptionEntity.Companion.SUBSCRIPTION_URL],\n            unique = true\n        )\n    ]\n)\ndata class SubscriptionEntity(\n    @PrimaryKey(autoGenerate = true)\n    var uid: Long = 0,\n\n    @ColumnInfo(name = SUBSCRIPTION_SERVICE_ID)\n    var serviceId: Int = NO_SERVICE_ID,\n\n    @ColumnInfo(name = SUBSCRIPTION_URL)\n    var url: String? = null,\n\n    @ColumnInfo(name = SUBSCRIPTION_NAME)\n    var name: String? = null,\n\n    @ColumnInfo(name = SUBSCRIPTION_AVATAR_URL)\n    var avatarUrl: String? = null,\n\n    @ColumnInfo(name = SUBSCRIPTION_SUBSCRIBER_COUNT)\n    var subscriberCount: Long? = null,\n\n    @ColumnInfo(name = SUBSCRIPTION_DESCRIPTION)\n    var description: String? = null,\n\n    @get:NotificationMode\n    @ColumnInfo(name = SUBSCRIPTION_NOTIFICATION_MODE)\n    var notificationMode: Int = 0\n) {\n    @Ignore\n    fun toChannelInfoItem(): ChannelInfoItem {\n        return ChannelInfoItem(this.serviceId, this.url, this.name).apply {\n            thumbnails = ImageStrategy.dbUrlToImageList(this@SubscriptionEntity.avatarUrl)\n            subscriberCount = this@SubscriptionEntity.subscriberCount ?: -1\n            description = this@SubscriptionEntity.description\n        }\n    }\n\n    companion object {\n        const val SUBSCRIPTION_UID: String = \"uid\"\n        const val SUBSCRIPTION_TABLE: String = \"subscriptions\"\n        const val SUBSCRIPTION_SERVICE_ID: String = \"service_id\"\n        const val SUBSCRIPTION_URL: String = \"url\"\n        const val SUBSCRIPTION_NAME: String = \"name\"\n        const val SUBSCRIPTION_AVATAR_URL: String = \"avatar_url\"\n        const val SUBSCRIPTION_SUBSCRIBER_COUNT: String = \"subscriber_count\"\n        const val SUBSCRIPTION_DESCRIPTION: String = \"description\"\n        const val SUBSCRIPTION_NOTIFICATION_MODE: String = \"notification_mode\"\n\n        @JvmStatic\n        @Ignore\n        fun from(info: ChannelInfo): SubscriptionEntity {\n            return SubscriptionEntity(\n                serviceId = info.serviceId,\n                url = info.url,\n                name = info.name,\n                avatarUrl = ImageStrategy.imageListToDbUrl(info.avatars),\n                description = info.description,\n                subscriberCount = info.subscriberCount\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/download/DownloadActivity.java",
    "content": "package org.schabi.newpipe.download;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\nimport android.view.ViewTreeObserver;\n\nimport androidx.appcompat.app.ActionBar;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.fragment.app.FragmentTransaction;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.ActivityDownloaderBinding;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.ThemeHelper;\nimport org.schabi.newpipe.views.FocusOverlayView;\n\nimport us.shandian.giga.service.DownloadManagerService;\nimport us.shandian.giga.ui.fragment.MissionsFragment;\n\npublic class DownloadActivity extends AppCompatActivity {\n\n    private static final String MISSIONS_FRAGMENT_TAG = \"fragment_tag\";\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        // Service\n        final Intent i = new Intent();\n        i.setClass(this, DownloadManagerService.class);\n        startService(i);\n\n        ThemeHelper.setTheme(this);\n\n        super.onCreate(savedInstanceState);\n\n        final ActivityDownloaderBinding downloaderBinding =\n                ActivityDownloaderBinding.inflate(getLayoutInflater());\n        setContentView(downloaderBinding.getRoot());\n\n        setSupportActionBar(downloaderBinding.toolbarLayout.toolbar);\n\n        final ActionBar actionBar = getSupportActionBar();\n        if (actionBar != null) {\n            actionBar.setDisplayHomeAsUpEnabled(true);\n            actionBar.setTitle(R.string.downloads_title);\n            actionBar.setDisplayShowTitleEnabled(true);\n        }\n\n        getWindow().getDecorView().getViewTreeObserver()\n                .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {\n            @Override\n            public void onGlobalLayout() {\n                updateFragments();\n                getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this);\n            }\n        });\n\n        if (DeviceUtils.isTv(this)) {\n            FocusOverlayView.setupFocusObserver(this);\n        }\n    }\n\n    private void updateFragments() {\n        final MissionsFragment fragment = new MissionsFragment();\n\n        getSupportFragmentManager().beginTransaction()\n                .replace(R.id.frame, fragment, MISSIONS_FRAGMENT_TAG)\n                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)\n                .commit();\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(final Menu menu) {\n        super.onCreateOptionsMenu(menu);\n        final MenuInflater inflater = getMenuInflater();\n\n        inflater.inflate(R.menu.download_menu, menu);\n\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(final MenuItem item) {\n        switch (item.getItemId()) {\n            case android.R.id.home:\n                onBackPressed();\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java",
    "content": "package org.schabi.newpipe.download;\n\nimport static org.schabi.newpipe.extractor.stream.DeliveryMethod.PROGRESSIVE_HTTP;\nimport static org.schabi.newpipe.util.ListHelper.getStreamsOfSpecifiedDelivery;\n\nimport android.app.Activity;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.ServiceConnection;\nimport android.content.SharedPreferences;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Environment;\nimport android.os.IBinder;\nimport android.provider.Settings;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.AdapterView;\nimport android.widget.RadioGroup;\nimport android.widget.SeekBar;\nimport android.widget.Toast;\n\nimport androidx.activity.result.ActivityResult;\nimport androidx.activity.result.ActivityResultLauncher;\nimport androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;\nimport androidx.annotation.IdRes;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.appcompat.widget.Toolbar;\nimport androidx.collection.SparseArrayCompat;\nimport androidx.documentfile.provider.DocumentFile;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.preference.PreferenceManager;\n\nimport com.evernote.android.state.State;\nimport com.livefront.bridge.Bridge;\nimport com.nononsenseapps.filepicker.Utils;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.DownloadDialogBinding;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.MediaFormat;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.localization.Localization;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.Stream;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.SubtitlesStream;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\nimport org.schabi.newpipe.settings.NewPipeSettings;\nimport org.schabi.newpipe.streams.io.NoFileManagerSafeGuard;\nimport org.schabi.newpipe.streams.io.StoredDirectoryHelper;\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\nimport org.schabi.newpipe.util.AudioTrackAdapter;\nimport org.schabi.newpipe.util.AudioTrackAdapter.AudioTracksWrapper;\nimport org.schabi.newpipe.util.FilePickerActivityHelper;\nimport org.schabi.newpipe.util.FilenameUtils;\nimport org.schabi.newpipe.util.ListHelper;\nimport org.schabi.newpipe.util.PermissionHelper;\nimport org.schabi.newpipe.util.SecondaryStreamHelper;\nimport org.schabi.newpipe.util.SimpleOnSeekBarChangeListener;\nimport org.schabi.newpipe.util.StreamItemAdapter;\nimport org.schabi.newpipe.util.StreamItemAdapter.StreamInfoWrapper;\nimport org.schabi.newpipe.util.ThemeHelper;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Objects;\nimport java.util.Optional;\n\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport us.shandian.giga.get.MissionRecoveryInfo;\nimport us.shandian.giga.postprocessing.Postprocessing;\nimport us.shandian.giga.service.DownloadManager;\nimport us.shandian.giga.service.DownloadManagerService;\nimport us.shandian.giga.service.DownloadManagerService.DownloadManagerBinder;\nimport us.shandian.giga.service.MissionState;\n\npublic class DownloadDialog extends DialogFragment\n        implements RadioGroup.OnCheckedChangeListener, AdapterView.OnItemSelectedListener {\n    private static final String TAG = \"DialogFragment\";\n    private static final boolean DEBUG = MainActivity.DEBUG;\n\n    @State\n    StreamInfo currentInfo;\n    @State\n    StreamInfoWrapper<VideoStream> wrappedVideoStreams;\n    @State\n    StreamInfoWrapper<SubtitlesStream> wrappedSubtitleStreams;\n    @State\n    AudioTracksWrapper wrappedAudioTracks;\n    @State\n    int selectedAudioTrackIndex;\n    @State\n    int selectedVideoIndex; // set in the constructor\n    @State\n    int selectedAudioIndex = 0; // default to the first item\n    @State\n    int selectedSubtitleIndex = 0; // default to the first item\n\n    private StoredDirectoryHelper mainStorageAudio = null;\n    private StoredDirectoryHelper mainStorageVideo = null;\n    private DownloadManager downloadManager = null;\n    private MenuItem okButton = null;\n    private Context context = null;\n    private boolean askForSavePath;\n\n    private AudioTrackAdapter audioTrackAdapter;\n    private StreamItemAdapter<AudioStream, Stream> audioStreamsAdapter;\n    private StreamItemAdapter<VideoStream, AudioStream> videoStreamsAdapter;\n    private StreamItemAdapter<SubtitlesStream, Stream> subtitleStreamsAdapter;\n\n    private final CompositeDisposable disposables = new CompositeDisposable();\n\n    private DownloadDialogBinding dialogBinding;\n\n    private SharedPreferences prefs;\n\n    // Variables for file name and MIME type when picking new folder because it's not set yet\n    private String filenameTmp;\n    private String mimeTmp;\n\n    private final ActivityResultLauncher<Intent> requestDownloadSaveAsLauncher =\n            registerForActivityResult(\n                    new StartActivityForResult(), this::requestDownloadSaveAsResult);\n    private final ActivityResultLauncher<Intent> requestDownloadPickAudioFolderLauncher =\n            registerForActivityResult(\n                    new StartActivityForResult(), this::requestDownloadPickAudioFolderResult);\n    private final ActivityResultLauncher<Intent> requestDownloadPickVideoFolderLauncher =\n            registerForActivityResult(\n                    new StartActivityForResult(), this::requestDownloadPickVideoFolderResult);\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Instance creation\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public DownloadDialog() {\n        // Just an empty default no-arg ctor to keep Fragment.instantiate() happy\n        // otherwise InstantiationException will be thrown when fragment is recreated\n        // TODO: Maybe use a custom FragmentFactory instead?\n    }\n\n    /**\n     * Create a new download dialog with the video, audio and subtitle streams from the provided\n     * stream info. Video streams and video-only streams will be put into a single list menu,\n     * sorted according to their resolution and the default video resolution will be selected.\n     *\n     * @param context the context to use just to obtain preferences and strings (will not be stored)\n     * @param info    the info from which to obtain downloadable streams and other info (e.g. title)\n     */\n    public DownloadDialog(@NonNull final Context context, @NonNull final StreamInfo info) {\n        this.currentInfo = info;\n\n        final List<AudioStream> audioStreams =\n                getStreamsOfSpecifiedDelivery(info.getAudioStreams(), PROGRESSIVE_HTTP);\n        final List<List<AudioStream>> groupedAudioStreams =\n                ListHelper.getGroupedAudioStreams(context, audioStreams);\n        this.wrappedAudioTracks = new AudioTracksWrapper(groupedAudioStreams, context);\n        this.selectedAudioTrackIndex =\n                ListHelper.getDefaultAudioTrackGroup(context, groupedAudioStreams);\n\n        // TODO: Adapt this code when the downloader support other types of stream deliveries\n        final List<VideoStream> videoStreams = ListHelper.getSortedStreamVideosList(\n                context,\n                getStreamsOfSpecifiedDelivery(info.getVideoStreams(), PROGRESSIVE_HTTP),\n                getStreamsOfSpecifiedDelivery(info.getVideoOnlyStreams(), PROGRESSIVE_HTTP),\n                false,\n                // If there are multiple languages available, prefer streams without audio\n                // to allow language selection\n                wrappedAudioTracks.size() > 1\n        );\n\n        this.wrappedVideoStreams = new StreamInfoWrapper<>(videoStreams, context);\n        this.wrappedSubtitleStreams = new StreamInfoWrapper<>(\n                getStreamsOfSpecifiedDelivery(info.getSubtitles(), PROGRESSIVE_HTTP), context);\n\n        this.selectedVideoIndex = ListHelper.getDefaultResolutionIndex(context, videoStreams);\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Android lifecycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(@Nullable final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        if (DEBUG) {\n            Log.d(TAG, \"onCreate() called with: \"\n                    + \"savedInstanceState = [\" + savedInstanceState + \"]\");\n        }\n\n        if (!PermissionHelper.checkStoragePermissions(getActivity(),\n                PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) {\n            dismiss();\n            return;\n        }\n\n        // context will remain null if dismiss() was called above, allowing to check whether the\n        // dialog is being dismissed in onViewCreated()\n        context = getContext();\n\n        setStyle(STYLE_NO_TITLE, ThemeHelper.getDialogTheme(context));\n        Bridge.restoreInstanceState(this, savedInstanceState);\n\n        this.audioTrackAdapter = new AudioTrackAdapter(wrappedAudioTracks);\n        this.subtitleStreamsAdapter = new StreamItemAdapter<>(wrappedSubtitleStreams);\n        updateSecondaryStreams();\n\n        final Intent intent = new Intent(context, DownloadManagerService.class);\n        context.startService(intent);\n\n        context.bindService(intent, new ServiceConnection() {\n            @Override\n            public void onServiceConnected(final ComponentName cname, final IBinder service) {\n                final DownloadManagerBinder mgr = (DownloadManagerBinder) service;\n\n                mainStorageAudio = mgr.getMainStorageAudio();\n                mainStorageVideo = mgr.getMainStorageVideo();\n                downloadManager = mgr.getDownloadManager();\n                askForSavePath = mgr.askForSavePath();\n\n                okButton.setEnabled(true);\n\n                context.unbindService(this);\n            }\n\n            @Override\n            public void onServiceDisconnected(final ComponentName name) {\n                // nothing to do\n            }\n        }, Context.BIND_AUTO_CREATE);\n    }\n\n    /**\n     * Update the displayed video streams based on the selected audio track.\n     */\n    private void updateSecondaryStreams() {\n        final StreamInfoWrapper<AudioStream> audioStreams = getWrappedAudioStreams();\n        final var secondaryStreams = new SparseArrayCompat<SecondaryStreamHelper<AudioStream>>(4);\n        final List<VideoStream> videoStreams = wrappedVideoStreams.getStreamsList();\n        wrappedVideoStreams.resetInfo();\n\n        for (int i = 0; i < videoStreams.size(); i++) {\n            if (!videoStreams.get(i).isVideoOnly()) {\n                continue;\n            }\n            final AudioStream audioStream = SecondaryStreamHelper.getAudioStreamFor(\n                    context, audioStreams.getStreamsList(), videoStreams.get(i));\n\n            if (audioStream != null) {\n                secondaryStreams.append(i, new SecondaryStreamHelper<>(audioStreams, audioStream));\n            } else if (DEBUG) {\n                final MediaFormat mediaFormat = videoStreams.get(i).getFormat();\n                if (mediaFormat != null) {\n                    Log.w(TAG, \"No audio stream candidates for video format \"\n                            + mediaFormat.name());\n                } else {\n                    Log.w(TAG, \"No audio stream candidates for unknown video format\");\n                }\n            }\n        }\n\n        this.videoStreamsAdapter = new StreamItemAdapter<>(wrappedVideoStreams, secondaryStreams);\n        this.audioStreamsAdapter = new StreamItemAdapter<>(audioStreams);\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        if (DEBUG) {\n            Log.d(TAG, \"onCreateView() called with: \"\n                    + \"inflater = [\" + inflater + \"], container = [\" + container + \"], \"\n                    + \"savedInstanceState = [\" + savedInstanceState + \"]\");\n        }\n        return inflater.inflate(R.layout.download_dialog, container);\n    }\n\n    @Override\n    public void onViewCreated(@NonNull final View view,\n                              @Nullable final Bundle savedInstanceState) {\n        super.onViewCreated(view, savedInstanceState);\n        dialogBinding = DownloadDialogBinding.bind(view);\n        if (context == null) {\n            return; // the dialog is being dismissed, see the call to dismiss() in onCreate()\n        }\n\n        dialogBinding.fileName.setText(FilenameUtils.createFilename(getContext(),\n                currentInfo.getName()));\n        selectedAudioIndex = ListHelper.getDefaultAudioFormat(getContext(),\n                getWrappedAudioStreams().getStreamsList());\n\n        selectedSubtitleIndex = getSubtitleIndexBy(subtitleStreamsAdapter.getAll());\n\n        dialogBinding.qualitySpinner.setOnItemSelectedListener(this);\n        dialogBinding.audioStreamSpinner.setOnItemSelectedListener(this);\n        dialogBinding.audioTrackSpinner.setOnItemSelectedListener(this);\n        dialogBinding.videoAudioGroup.setOnCheckedChangeListener(this);\n\n        initToolbar(dialogBinding.toolbarLayout.toolbar);\n        setupDownloadOptions();\n\n        prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());\n\n        final int threads = prefs.getInt(getString(R.string.default_download_threads), 3);\n        dialogBinding.threadsCount.setText(String.valueOf(threads));\n        dialogBinding.threads.setProgress(threads - 1);\n        dialogBinding.threads.setOnSeekBarChangeListener(new SimpleOnSeekBarChangeListener() {\n            @Override\n            public void onProgressChanged(@NonNull final SeekBar seekbar,\n                                          final int progress,\n                                          final boolean fromUser) {\n                final int newProgress = progress + 1;\n                prefs.edit().putInt(getString(R.string.default_download_threads), newProgress)\n                        .apply();\n                dialogBinding.threadsCount.setText(String.valueOf(newProgress));\n            }\n        });\n\n        fetchStreamsSize();\n    }\n\n    private void initToolbar(final Toolbar toolbar) {\n        if (DEBUG) {\n            Log.d(TAG, \"initToolbar() called with: toolbar = [\" + toolbar + \"]\");\n        }\n\n        toolbar.setTitle(R.string.download_dialog_title);\n        toolbar.setNavigationIcon(R.drawable.ic_arrow_back);\n        toolbar.inflateMenu(R.menu.dialog_url);\n        toolbar.setNavigationOnClickListener(v -> dismiss());\n        toolbar.setNavigationContentDescription(R.string.cancel);\n\n        okButton = toolbar.getMenu().findItem(R.id.okay);\n        okButton.setEnabled(false); // disable until the download service connection is done\n\n        toolbar.setOnMenuItemClickListener(item -> {\n            if (item.getItemId() == R.id.okay) {\n                prepareSelectedDownload();\n                return true;\n            }\n            return false;\n        });\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        disposables.clear();\n    }\n\n    @Override\n    public void onDestroyView() {\n        dialogBinding = null;\n        super.onDestroyView();\n    }\n\n    @Override\n    public void onSaveInstanceState(@NonNull final Bundle outState) {\n        super.onSaveInstanceState(outState);\n        Bridge.saveInstanceState(this, outState);\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Video, audio and subtitle spinners\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void fetchStreamsSize() {\n        disposables.clear();\n        disposables.add(StreamInfoWrapper.fetchMoreInfoForWrapper(wrappedVideoStreams)\n                .subscribe(result -> {\n                    if (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()\n                            == R.id.video_button) {\n                        setupVideoSpinner();\n                    }\n                }, throwable -> ErrorUtil.showSnackbar(context,\n                        new ErrorInfo(throwable, UserAction.DOWNLOAD_OPEN_DIALOG,\n                                \"Downloading video stream size\", currentInfo))));\n        disposables.add(StreamInfoWrapper.fetchMoreInfoForWrapper(getWrappedAudioStreams())\n                .subscribe(result -> {\n                    if (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()\n                            == R.id.audio_button) {\n                        setupAudioSpinner();\n                    }\n                }, throwable -> ErrorUtil.showSnackbar(context,\n                        new ErrorInfo(throwable, UserAction.DOWNLOAD_OPEN_DIALOG,\n                                \"Downloading audio stream size\", currentInfo))));\n        disposables.add(StreamInfoWrapper.fetchMoreInfoForWrapper(wrappedSubtitleStreams)\n                .subscribe(result -> {\n                    if (dialogBinding.videoAudioGroup.getCheckedRadioButtonId()\n                            == R.id.subtitle_button) {\n                        setupSubtitleSpinner();\n                    }\n                }, throwable -> ErrorUtil.showSnackbar(context,\n                        new ErrorInfo(throwable, UserAction.DOWNLOAD_OPEN_DIALOG,\n                                \"Downloading subtitle stream size\", currentInfo))));\n    }\n\n    private void setupAudioTrackSpinner() {\n        if (getContext() == null) {\n            return;\n        }\n\n        dialogBinding.audioTrackSpinner.setAdapter(audioTrackAdapter);\n        dialogBinding.audioTrackSpinner.setSelection(selectedAudioTrackIndex);\n    }\n\n    private void setupAudioSpinner() {\n        if (getContext() == null) {\n            return;\n        }\n\n        dialogBinding.qualitySpinner.setVisibility(View.GONE);\n        setRadioButtonsState(true);\n        dialogBinding.audioStreamSpinner.setAdapter(audioStreamsAdapter);\n        dialogBinding.audioStreamSpinner.setSelection(selectedAudioIndex);\n        dialogBinding.audioStreamSpinner.setVisibility(View.VISIBLE);\n        dialogBinding.audioTrackSpinner.setVisibility(\n                wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE);\n        dialogBinding.audioTrackPresentInVideoText.setVisibility(View.GONE);\n    }\n\n    private void setupVideoSpinner() {\n        if (getContext() == null) {\n            return;\n        }\n\n        dialogBinding.qualitySpinner.setAdapter(videoStreamsAdapter);\n        dialogBinding.qualitySpinner.setSelection(selectedVideoIndex);\n        dialogBinding.qualitySpinner.setVisibility(View.VISIBLE);\n        setRadioButtonsState(true);\n        dialogBinding.audioStreamSpinner.setVisibility(View.GONE);\n        onVideoStreamSelected();\n    }\n\n    private void onVideoStreamSelected() {\n        final boolean isVideoOnly = videoStreamsAdapter.getItem(selectedVideoIndex).isVideoOnly();\n\n        dialogBinding.audioTrackSpinner.setVisibility(\n                isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE);\n        dialogBinding.audioTrackPresentInVideoText.setVisibility(\n                !isVideoOnly && wrappedAudioTracks.size() > 1 ? View.VISIBLE : View.GONE);\n    }\n\n    private void setupSubtitleSpinner() {\n        if (getContext() == null) {\n            return;\n        }\n\n        dialogBinding.qualitySpinner.setAdapter(subtitleStreamsAdapter);\n        dialogBinding.qualitySpinner.setSelection(selectedSubtitleIndex);\n        dialogBinding.qualitySpinner.setVisibility(View.VISIBLE);\n        setRadioButtonsState(true);\n        dialogBinding.audioStreamSpinner.setVisibility(View.GONE);\n        dialogBinding.audioTrackSpinner.setVisibility(View.GONE);\n        dialogBinding.audioTrackPresentInVideoText.setVisibility(View.GONE);\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Activity results\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void requestDownloadPickAudioFolderResult(final ActivityResult result) {\n        requestDownloadPickFolderResult(\n                result, getString(R.string.download_path_audio_key), DownloadManager.TAG_AUDIO);\n    }\n\n    private void requestDownloadPickVideoFolderResult(final ActivityResult result) {\n        requestDownloadPickFolderResult(\n                result, getString(R.string.download_path_video_key), DownloadManager.TAG_VIDEO);\n    }\n\n    private void requestDownloadSaveAsResult(@NonNull final ActivityResult result) {\n        if (result.getResultCode() != Activity.RESULT_OK) {\n            return;\n        }\n\n        if (result.getData() == null || result.getData().getData() == null) {\n            showFailedDialog(R.string.general_error);\n            return;\n        }\n\n        if (FilePickerActivityHelper.isOwnFileUri(context, result.getData().getData())) {\n            final File file = Utils.getFileForUri(result.getData().getData());\n            checkSelectedDownload(null, Uri.fromFile(file), file.getName(),\n                    StoredFileHelper.DEFAULT_MIME);\n            return;\n        }\n\n        final DocumentFile docFile = DocumentFile.fromSingleUri(context,\n                result.getData().getData());\n        if (docFile == null) {\n            showFailedDialog(R.string.general_error);\n            return;\n        }\n\n        // check if the selected file was previously used\n        checkSelectedDownload(null, result.getData().getData(), docFile.getName(),\n                docFile.getType());\n    }\n\n    private void requestDownloadPickFolderResult(@NonNull final ActivityResult result,\n                                                 final String key,\n                                                 final String tag) {\n        if (result.getResultCode() != Activity.RESULT_OK) {\n            return;\n        }\n\n        if (result.getData() == null || result.getData().getData() == null) {\n            showFailedDialog(R.string.general_error);\n            return;\n        }\n\n        Uri uri = result.getData().getData();\n        if (FilePickerActivityHelper.isOwnFileUri(context, uri)) {\n            uri = Uri.fromFile(Utils.getFileForUri(uri));\n        } else {\n            context.grantUriPermission(context.getPackageName(), uri,\n                    StoredDirectoryHelper.PERMISSION_FLAGS);\n        }\n\n        PreferenceManager.getDefaultSharedPreferences(context).edit().putString(key,\n                uri.toString()).apply();\n\n        try {\n            final StoredDirectoryHelper mainStorage = new StoredDirectoryHelper(context, uri, tag);\n            checkSelectedDownload(mainStorage, mainStorage.findFile(filenameTmp),\n                    filenameTmp, mimeTmp);\n        } catch (final IOException e) {\n            showFailedDialog(R.string.general_error);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Listeners\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCheckedChanged(final RadioGroup group, @IdRes final int checkedId) {\n        if (DEBUG) {\n            Log.d(TAG, \"onCheckedChanged() called with: \"\n                    + \"group = [\" + group + \"], checkedId = [\" + checkedId + \"]\");\n        }\n        boolean flag = true;\n\n        if (checkedId == R.id.audio_button) {\n            setupAudioSpinner();\n        } else if (checkedId == R.id.video_button) {\n            setupVideoSpinner();\n        } else if (checkedId == R.id.subtitle_button) {\n            setupSubtitleSpinner();\n            flag = false;\n        }\n\n        dialogBinding.threads.setEnabled(flag);\n    }\n\n    @Override\n    public void onItemSelected(final AdapterView<?> parent,\n                               final View view,\n                               final int position,\n                               final long id) {\n        if (DEBUG) {\n            Log.d(TAG, \"onItemSelected() called with: \"\n                    + \"parent = [\" + parent + \"], view = [\" + view + \"], \"\n                    + \"position = [\" + position + \"], id = [\" + id + \"]\");\n        }\n\n        final int parentId = parent.getId();\n        if (parentId == R.id.quality_spinner) {\n            final int checkedRadioButtonId = dialogBinding.videoAudioGroup\n                    .getCheckedRadioButtonId();\n            if (checkedRadioButtonId == R.id.video_button) {\n                selectedVideoIndex = position;\n                onVideoStreamSelected();\n            } else if (checkedRadioButtonId == R.id.subtitle_button) {\n                selectedSubtitleIndex = position;\n            }\n            onItemSelectedSetFileName();\n        } else if (parentId == R.id.audio_track_spinner) {\n            final boolean trackChanged = selectedAudioTrackIndex != position;\n            selectedAudioTrackIndex = position;\n            if (trackChanged) {\n                updateSecondaryStreams();\n                fetchStreamsSize();\n            }\n        } else if (parentId == R.id.audio_stream_spinner) {\n            selectedAudioIndex = position;\n        }\n    }\n\n    private void onItemSelectedSetFileName() {\n        final String fileName = FilenameUtils.createFilename(getContext(), currentInfo.getName());\n        final String prevFileName = Optional.ofNullable(dialogBinding.fileName.getText())\n                .map(Object::toString)\n                .orElse(\"\");\n\n        if (prevFileName.isEmpty()\n                || prevFileName.equals(fileName)\n                || prevFileName.startsWith(getString(R.string.caption_file_name, fileName, \"\"))) {\n            // only update the file name field if it was not edited by the user\n\n            final int radioButtonId = dialogBinding.videoAudioGroup\n                    .getCheckedRadioButtonId();\n            if (radioButtonId == R.id.audio_button || radioButtonId == R.id.video_button) {\n                if (!prevFileName.equals(fileName)) {\n                    // since the user might have switched between audio and video, the correct\n                    // text might already be in place, so avoid resetting the cursor position\n                    dialogBinding.fileName.setText(fileName);\n                }\n            } else if (radioButtonId == R.id.subtitle_button) {\n                final String setSubtitleLanguageCode = subtitleStreamsAdapter\n                        .getItem(selectedSubtitleIndex).getLanguageTag();\n                // this will reset the cursor position, which is bad UX, but it can't be avoided\n                dialogBinding.fileName.setText(getString(\n                        R.string.caption_file_name, fileName, setSubtitleLanguageCode));\n            }\n        }\n    }\n\n    @Override\n    public void onNothingSelected(final AdapterView<?> parent) {\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Download\n    //////////////////////////////////////////////////////////////////////////*/\n\n    protected void setupDownloadOptions() {\n        setRadioButtonsState(false);\n        setupAudioTrackSpinner();\n\n        final boolean isVideoStreamsAvailable = videoStreamsAdapter.getCount() > 0;\n        final boolean isAudioStreamsAvailable = audioStreamsAdapter.getCount() > 0;\n        final boolean isSubtitleStreamsAvailable = subtitleStreamsAdapter.getCount() > 0;\n\n        dialogBinding.audioButton.setVisibility(isAudioStreamsAvailable ? View.VISIBLE\n                : View.GONE);\n        dialogBinding.videoButton.setVisibility(isVideoStreamsAvailable ? View.VISIBLE\n                : View.GONE);\n        dialogBinding.subtitleButton.setVisibility(isSubtitleStreamsAvailable\n                ? View.VISIBLE : View.GONE);\n\n        prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());\n        final String defaultMedia = prefs.getString(getString(R.string.last_used_download_type),\n                getString(R.string.last_download_type_video_key));\n\n        if (isVideoStreamsAvailable\n                && (defaultMedia.equals(getString(R.string.last_download_type_video_key)))) {\n            dialogBinding.videoButton.setChecked(true);\n            setupVideoSpinner();\n        } else if (isAudioStreamsAvailable\n                && (defaultMedia.equals(getString(R.string.last_download_type_audio_key)))) {\n            dialogBinding.audioButton.setChecked(true);\n            setupAudioSpinner();\n        } else if (isSubtitleStreamsAvailable\n                && (defaultMedia.equals(getString(R.string.last_download_type_subtitle_key)))) {\n            dialogBinding.subtitleButton.setChecked(true);\n            setupSubtitleSpinner();\n        } else if (isVideoStreamsAvailable) {\n            dialogBinding.videoButton.setChecked(true);\n            setupVideoSpinner();\n        } else if (isAudioStreamsAvailable) {\n            dialogBinding.audioButton.setChecked(true);\n            setupAudioSpinner();\n        } else if (isSubtitleStreamsAvailable) {\n            dialogBinding.subtitleButton.setChecked(true);\n            setupSubtitleSpinner();\n        } else {\n            Toast.makeText(getContext(), R.string.no_streams_available_download,\n                    Toast.LENGTH_SHORT).show();\n            dismiss();\n        }\n    }\n\n    private void setRadioButtonsState(final boolean enabled) {\n        dialogBinding.audioButton.setEnabled(enabled);\n        dialogBinding.videoButton.setEnabled(enabled);\n        dialogBinding.subtitleButton.setEnabled(enabled);\n    }\n\n    private StreamInfoWrapper<AudioStream> getWrappedAudioStreams() {\n        if (selectedAudioTrackIndex < 0 || selectedAudioTrackIndex > wrappedAudioTracks.size()) {\n            return StreamInfoWrapper.empty();\n        }\n        return wrappedAudioTracks.getTracksList().get(selectedAudioTrackIndex);\n    }\n\n    private int getSubtitleIndexBy(@NonNull final List<SubtitlesStream> streams) {\n        final Localization preferredLocalization = NewPipe.getPreferredLocalization();\n\n        int candidate = 0;\n        for (int i = 0; i < streams.size(); i++) {\n            final Locale streamLocale = streams.get(i).getLocale();\n\n            final boolean languageEquals = streamLocale.getLanguage() != null\n                    && preferredLocalization.getLanguageCode() != null\n                    && streamLocale.getLanguage()\n                    .equals(new Locale(preferredLocalization.getLanguageCode()).getLanguage());\n            final boolean countryEquals = streamLocale.getCountry() != null\n                    && streamLocale.getCountry().equals(preferredLocalization.getCountryCode());\n\n            if (languageEquals) {\n                if (countryEquals) {\n                    return i;\n                }\n\n                candidate = i;\n            }\n        }\n\n        return candidate;\n    }\n\n    @NonNull\n    private String getNameEditText() {\n        final String str = Objects.requireNonNull(dialogBinding.fileName.getText()).toString()\n                .trim();\n\n        return FilenameUtils.createFilename(context, str.isEmpty() ? currentInfo.getName() : str);\n    }\n\n    private void showFailedDialog(@StringRes final int msg) {\n        new AlertDialog.Builder(context)\n                .setTitle(R.string.general_error)\n                .setMessage(msg)\n                .setNegativeButton(getString(R.string.ok), null)\n                .show();\n    }\n\n    private void launchDirectoryPicker(final ActivityResultLauncher<Intent> launcher) {\n        NoFileManagerSafeGuard.launchSafe(launcher, StoredDirectoryHelper.getPicker(context), TAG,\n                context);\n    }\n\n    private void prepareSelectedDownload() {\n        final StoredDirectoryHelper mainStorage;\n        final MediaFormat format;\n        final String selectedMediaType;\n        final long size;\n\n        // first, build the filename and get the output folder (if possible)\n        // later, run a very very very large file checking logic\n\n        filenameTmp = getNameEditText().concat(\".\");\n\n        final int checkedRadioButtonId = dialogBinding.videoAudioGroup.getCheckedRadioButtonId();\n        if (checkedRadioButtonId == R.id.audio_button) {\n            selectedMediaType = getString(R.string.last_download_type_audio_key);\n            mainStorage = mainStorageAudio;\n            format = audioStreamsAdapter.getItem(selectedAudioIndex).getFormat();\n            size = getWrappedAudioStreams().getSizeInBytes(selectedAudioIndex);\n            if (format == MediaFormat.WEBMA_OPUS) {\n                mimeTmp = \"audio/ogg\";\n                filenameTmp += \"opus\";\n            } else if (format != null) {\n                mimeTmp = format.mimeType;\n                filenameTmp += format.getSuffix();\n            }\n        } else if (checkedRadioButtonId == R.id.video_button) {\n            selectedMediaType = getString(R.string.last_download_type_video_key);\n            mainStorage = mainStorageVideo;\n            format = videoStreamsAdapter.getItem(selectedVideoIndex).getFormat();\n            size = wrappedVideoStreams.getSizeInBytes(selectedVideoIndex);\n            if (format != null) {\n                mimeTmp = format.mimeType;\n                filenameTmp += format.getSuffix();\n            }\n        } else if (checkedRadioButtonId == R.id.subtitle_button) {\n            selectedMediaType = getString(R.string.last_download_type_subtitle_key);\n            mainStorage = mainStorageVideo; // subtitle & video files go together\n            format = subtitleStreamsAdapter.getItem(selectedSubtitleIndex).getFormat();\n            size = wrappedSubtitleStreams.getSizeInBytes(selectedSubtitleIndex);\n            if (format != null) {\n                mimeTmp = format.mimeType;\n            }\n\n            if (format == MediaFormat.TTML) {\n                filenameTmp += MediaFormat.SRT.getSuffix();\n            } else if (format != null) {\n                filenameTmp += format.getSuffix();\n            }\n        } else {\n            throw new RuntimeException(\"No stream selected\");\n        }\n\n        if (!askForSavePath && (mainStorage == null\n                || mainStorage.isDirect() == NewPipeSettings.useStorageAccessFramework(context)\n                || mainStorage.isInvalidSafStorage())) {\n            // Pick new download folder if one of:\n            // - Download folder is not set\n            // - Download folder uses SAF while SAF is disabled\n            // - Download folder doesn't use SAF while SAF is enabled\n            // - Download folder uses SAF but the user manually revoked access to it\n            Toast.makeText(context, getString(R.string.no_dir_yet),\n                    Toast.LENGTH_LONG).show();\n\n            if (dialogBinding.videoAudioGroup.getCheckedRadioButtonId() == R.id.audio_button) {\n                launchDirectoryPicker(requestDownloadPickAudioFolderLauncher);\n            } else {\n                launchDirectoryPicker(requestDownloadPickVideoFolderLauncher);\n            }\n\n            return;\n        }\n\n        if (askForSavePath) {\n            final Uri initialPath;\n            if (NewPipeSettings.useStorageAccessFramework(context)) {\n                initialPath = null;\n            } else {\n                final File initialSavePath;\n                if (dialogBinding.videoAudioGroup.getCheckedRadioButtonId() == R.id.audio_button) {\n                    initialSavePath = NewPipeSettings.getDir(Environment.DIRECTORY_MUSIC);\n                } else {\n                    initialSavePath = NewPipeSettings.getDir(Environment.DIRECTORY_MOVIES);\n                }\n                initialPath = Uri.parse(initialSavePath.getAbsolutePath());\n            }\n\n            NoFileManagerSafeGuard.launchSafe(requestDownloadSaveAsLauncher,\n                    StoredFileHelper.getNewPicker(context, filenameTmp, mimeTmp, initialPath), TAG,\n                    context);\n\n            return;\n        }\n\n        // Check for free storage space\n        final long freeSpace = mainStorage.getFreeStorageSpace();\n        if (freeSpace <= size) {\n            Toast.makeText(context, getString(R.\n                    string.error_insufficient_storage), Toast.LENGTH_LONG).show();\n            // move the user to storage setting tab\n            final Intent storageSettingsIntent = new Intent(Settings.\n                    ACTION_INTERNAL_STORAGE_SETTINGS);\n            if (storageSettingsIntent.resolveActivity(context.getPackageManager())\n                    != null) {\n                startActivity(storageSettingsIntent);\n            }\n            return;\n        }\n\n        // check for existing file with the same name\n        checkSelectedDownload(mainStorage, mainStorage.findFile(filenameTmp), filenameTmp,\n                mimeTmp);\n\n        // remember the last media type downloaded by the user\n        prefs.edit().putString(getString(R.string.last_used_download_type), selectedMediaType)\n                .apply();\n    }\n\n    private void checkSelectedDownload(final StoredDirectoryHelper mainStorage,\n                                       final Uri targetFile,\n                                       final String filename,\n                                       final String mime) {\n        StoredFileHelper storage;\n\n        try {\n            if (mainStorage == null) {\n                // using SAF on older android version\n                storage = new StoredFileHelper(context, null, targetFile, \"\");\n            } else if (targetFile == null) {\n                // the file does not exist, but it is probably used in a pending download\n                storage = new StoredFileHelper(mainStorage.getUri(), filename, mime,\n                        mainStorage.getTag());\n            } else {\n                // the target filename is already use, attempt to use it\n                storage = new StoredFileHelper(context, mainStorage.getUri(), targetFile,\n                        mainStorage.getTag());\n            }\n        } catch (final Exception e) {\n            ErrorUtil.createNotification(requireContext(),\n                    new ErrorInfo(e, UserAction.DOWNLOAD_FAILED, \"Getting storage\"));\n            return;\n        }\n\n        // get state of potential mission referring to the same file\n        final MissionState state = downloadManager.checkForExistingMission(storage);\n        @StringRes final int msgBtn;\n        @StringRes final int msgBody;\n\n        // this switch checks if there is already a mission referring to the same file\n        switch (state) {\n            case Finished: // there is already a finished mission\n                msgBtn = R.string.overwrite;\n                msgBody = R.string.overwrite_finished_warning;\n                break;\n            case Pending:\n                msgBtn = R.string.overwrite;\n                msgBody = R.string.download_already_pending;\n                break;\n            case PendingRunning:\n                msgBtn = R.string.generate_unique_name;\n                msgBody = R.string.download_already_running;\n                break;\n            case None: // there is no mission referring to the same file\n                if (mainStorage == null) {\n                    // This part is called if:\n                    // * using SAF on older android version\n                    // * save path not defined\n                    // * if the file exists overwrite it, is not necessary ask\n                    if (!storage.existsAsFile() && !storage.create()) {\n                        showFailedDialog(R.string.error_file_creation);\n                        return;\n                    }\n                    continueSelectedDownload(storage);\n                    return;\n                } else if (targetFile == null) {\n                    // This part is called if:\n                    // * the filename is not used in a pending/finished download\n                    // * the file does not exists, create\n\n                    if (!mainStorage.mkdirs()) {\n                        showFailedDialog(R.string.error_path_creation);\n                        return;\n                    }\n\n                    storage = mainStorage.createFile(filename, mime);\n                    if (storage == null || !storage.canWrite()) {\n                        showFailedDialog(R.string.error_file_creation);\n                        return;\n                    }\n\n                    continueSelectedDownload(storage);\n                    return;\n                }\n                msgBtn = R.string.overwrite;\n                msgBody = R.string.overwrite_unrelated_warning;\n                break;\n            default:\n                return; // unreachable\n        }\n\n        final AlertDialog.Builder askDialog = new AlertDialog.Builder(context)\n                .setTitle(R.string.download_dialog_title)\n                .setMessage(msgBody)\n                .setNegativeButton(R.string.cancel, null);\n        final StoredFileHelper finalStorage = storage;\n\n\n        if (mainStorage == null) {\n            // This part is called if:\n            // * using SAF on older android version\n            // * save path not defined\n            switch (state) {\n                case Pending:\n                case Finished:\n                    askDialog.setPositiveButton(msgBtn, (dialog, which) -> {\n                        dialog.dismiss();\n                        downloadManager.forgetMission(finalStorage);\n                        continueSelectedDownload(finalStorage);\n                    });\n                    break;\n            }\n\n            askDialog.show();\n            return;\n        }\n\n        askDialog.setPositiveButton(msgBtn, (dialog, which) -> {\n            dialog.dismiss();\n\n            StoredFileHelper storageNew;\n            switch (state) {\n                case Finished:\n                case Pending:\n                    downloadManager.forgetMission(finalStorage);\n                case None:\n                    if (targetFile == null) {\n                        storageNew = mainStorage.createFile(filename, mime);\n                    } else {\n                        try {\n                            // try take (or steal) the file\n                            storageNew = new StoredFileHelper(context, mainStorage.getUri(),\n                                    targetFile, mainStorage.getTag());\n                        } catch (final IOException e) {\n                            Log.e(TAG, \"Failed to take (or steal) the file in \"\n                                    + targetFile.toString());\n                            storageNew = null;\n                        }\n                    }\n\n                    if (storageNew != null && storageNew.canWrite()) {\n                        continueSelectedDownload(storageNew);\n                    } else {\n                        showFailedDialog(R.string.error_file_creation);\n                    }\n                    break;\n                case PendingRunning:\n                    storageNew = mainStorage.createUniqueFile(filename, mime);\n                    if (storageNew == null) {\n                        showFailedDialog(R.string.error_file_creation);\n                    } else {\n                        continueSelectedDownload(storageNew);\n                    }\n                    break;\n            }\n        });\n\n        askDialog.show();\n    }\n\n    private void continueSelectedDownload(@NonNull final StoredFileHelper storage) {\n        if (!storage.canWrite()) {\n            showFailedDialog(R.string.permission_denied);\n            return;\n        }\n\n        // check if the selected file has to be overwritten, by simply checking its length\n        try {\n            if (storage.length() > 0) {\n                storage.truncate();\n            }\n        } catch (final IOException e) {\n            Log.e(TAG, \"Failed to truncate the file: \" + storage.getUri().toString(), e);\n            showFailedDialog(R.string.overwrite_failed);\n            return;\n        }\n\n        final Stream selectedStream;\n        Stream secondaryStream = null;\n        final char kind;\n        int threads = dialogBinding.threads.getProgress() + 1;\n        final String[] urls;\n        final List<MissionRecoveryInfo> recoveryInfo;\n        String psName = null;\n        String[] psArgs = null;\n        long nearLength = 0;\n\n        // more download logic: select muxer, subtitle converter, etc.\n        final int checkedRadioButtonId = dialogBinding.videoAudioGroup.getCheckedRadioButtonId();\n        if (checkedRadioButtonId == R.id.audio_button) {\n            kind = 'a';\n            selectedStream = audioStreamsAdapter.getItem(selectedAudioIndex);\n\n            if (selectedStream.getFormat() == MediaFormat.M4A) {\n                psName = Postprocessing.ALGORITHM_M4A_NO_DASH;\n            } else if (selectedStream.getFormat() == MediaFormat.WEBMA_OPUS) {\n                psName = Postprocessing.ALGORITHM_OGG_FROM_WEBM_DEMUXER;\n            }\n        } else if (checkedRadioButtonId == R.id.video_button) {\n            kind = 'v';\n            selectedStream = videoStreamsAdapter.getItem(selectedVideoIndex);\n\n            final SecondaryStreamHelper<AudioStream> secondary = videoStreamsAdapter\n                    .getAllSecondary()\n                    .get(wrappedVideoStreams.getStreamsList().indexOf(selectedStream));\n\n            if (secondary != null) {\n                secondaryStream = secondary.getStream();\n\n                if (selectedStream.getFormat() == MediaFormat.MPEG_4) {\n                    psName = Postprocessing.ALGORITHM_MP4_FROM_DASH_MUXER;\n                } else {\n                    psName = Postprocessing.ALGORITHM_WEBM_MUXER;\n                }\n\n                final long videoSize = wrappedVideoStreams.getSizeInBytes(\n                        (VideoStream) selectedStream);\n\n                // set nearLength, only, if both sizes are fetched or known. This probably\n                // does not work on slow networks but is later updated in the downloader\n                if (secondary.getSizeInBytes() > 0 && videoSize > 0) {\n                    nearLength = secondary.getSizeInBytes() + videoSize;\n                }\n            }\n        } else if (checkedRadioButtonId == R.id.subtitle_button) {\n            threads = 1; // use unique thread for subtitles due small file size\n            kind = 's';\n            selectedStream = subtitleStreamsAdapter.getItem(selectedSubtitleIndex);\n\n            if (selectedStream.getFormat() == MediaFormat.TTML) {\n                psName = Postprocessing.ALGORITHM_TTML_CONVERTER;\n                psArgs = new String[]{\n                        selectedStream.getFormat().getSuffix(),\n                        \"false\" // ignore empty frames\n                };\n            }\n        } else {\n            return;\n        }\n\n        if (secondaryStream == null) {\n            urls = new String[] {\n                    selectedStream.getContent()\n            };\n            recoveryInfo = List.of(new MissionRecoveryInfo(selectedStream));\n        } else {\n            if (secondaryStream.getDeliveryMethod() != PROGRESSIVE_HTTP) {\n                throw new IllegalArgumentException(\"Unsupported stream delivery format\"\n                        + secondaryStream.getDeliveryMethod());\n            }\n\n            urls = new String[] {\n                    selectedStream.getContent(), secondaryStream.getContent()\n            };\n            recoveryInfo = List.of(\n                    new MissionRecoveryInfo(selectedStream),\n                    new MissionRecoveryInfo(secondaryStream)\n            );\n        }\n\n        DownloadManagerService.startMission(context, urls, storage, kind, threads,\n                currentInfo, psName, psArgs, nearLength, new ArrayList<>(recoveryInfo));\n\n        Toast.makeText(context, getString(R.string.download_has_started),\n                Toast.LENGTH_SHORT).show();\n\n        dismiss();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/download/LoadingDialog.java",
    "content": "package org.schabi.newpipe.download;\n\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\nimport androidx.appcompat.widget.Toolbar;\nimport androidx.fragment.app.DialogFragment;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.DownloadLoadingDialogBinding;\n\n/**\n * This class contains a dialog which shows a loading indicator and has a customizable title.\n */\npublic class LoadingDialog extends DialogFragment {\n    private static final String TAG = \"LoadingDialog\";\n    private static final boolean DEBUG = MainActivity.DEBUG;\n    private DownloadLoadingDialogBinding dialogLoadingBinding;\n    private final @StringRes int title;\n\n    /**\n     * Create a new LoadingDialog.\n     *\n     * <p>\n     *     The dialog contains a loading indicator and has a customizable title.\n     *     <br/>\n     *     Use {@code show()} to display the dialog to the user.\n     * </p>\n     *\n     * @param title an informative title shown in the dialog's toolbar\n     */\n    public LoadingDialog(final @StringRes int title) {\n        this.title = title;\n    }\n\n    @Override\n    public void onCreate(@Nullable final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        if (DEBUG) {\n            Log.d(TAG, \"onCreate() called with: \"\n                    + \"savedInstanceState = [\" + savedInstanceState + \"]\");\n        }\n        this.setCancelable(false);\n    }\n\n    @Override\n    public View onCreateView(\n            @NonNull final LayoutInflater inflater,\n            final ViewGroup container,\n            final Bundle savedInstanceState) {\n        if (DEBUG) {\n            Log.d(TAG, \"onCreateView() called with: \"\n                    + \"inflater = [\" + inflater + \"], container = [\" + container + \"], \"\n                    + \"savedInstanceState = [\" + savedInstanceState + \"]\");\n        }\n        return inflater.inflate(R.layout.download_loading_dialog, container);\n    }\n\n    @Override\n    public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {\n        super.onViewCreated(view, savedInstanceState);\n        dialogLoadingBinding = DownloadLoadingDialogBinding.bind(view);\n        initToolbar(dialogLoadingBinding.toolbarLayout.toolbar);\n    }\n\n    private void initToolbar(final Toolbar toolbar) {\n        if (DEBUG) {\n            Log.d(TAG, \"initToolbar() called with: toolbar = [\" + toolbar + \"]\");\n        }\n        toolbar.setTitle(requireContext().getString(title));\n        toolbar.setNavigationOnClickListener(v -> dismiss());\n\n    }\n\n    @Override\n    public void onDestroyView() {\n        dialogLoadingBinding = null;\n        super.onDestroyView();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/AcraReportSender.java",
    "content": "package org.schabi.newpipe.error;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\n\nimport org.acra.ReportField;\nimport org.acra.data.CrashReportData;\nimport org.acra.sender.ReportSender;\nimport org.schabi.newpipe.R;\n\n/*\n * Created by Christian Schabesberger  on 13.09.16.\n *\n * Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org>\n * AcraReportSender.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic class AcraReportSender implements ReportSender {\n\n    @Override\n    public void send(@NonNull final Context context, @NonNull final CrashReportData report) {\n        ErrorUtil.openActivity(context, new ErrorInfo(\n                new String[]{report.getString(ReportField.STACK_TRACE)},\n                UserAction.UI_ERROR,\n                \"ACRA report\",\n                null,\n                R.string.app_ui_crash));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/AcraReportSenderFactory.java",
    "content": "package org.schabi.newpipe.error;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\n\nimport com.google.auto.service.AutoService;\n\nimport org.acra.config.CoreConfiguration;\nimport org.acra.sender.ReportSender;\nimport org.acra.sender.ReportSenderFactory;\nimport org.schabi.newpipe.App;\n\n/*\n * Created by Christian Schabesberger on 13.09.16.\n *\n * Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org>\n * AcraReportSenderFactory.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/**\n * Used by ACRA in {@link App}.initAcra() as the factory for report senders.\n */\n@AutoService(ReportSenderFactory.class)\npublic class AcraReportSenderFactory implements ReportSenderFactory {\n    @NonNull\n    public ReportSender create(@NonNull final Context context,\n                               @NonNull final CoreConfiguration config) {\n        return new AcraReportSender();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/ErrorActivity.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2015-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.error\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.appcompat.app.AlertDialog\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.content.IntentCompat\nimport androidx.core.net.toUri\nimport com.grack.nanojson.JsonWriter\nimport java.time.ZonedDateTime\nimport java.time.format.DateTimeFormatter\nimport org.schabi.newpipe.BuildConfig\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.ActivityErrorBinding\nimport org.schabi.newpipe.util.Localization\nimport org.schabi.newpipe.util.ThemeHelper\nimport org.schabi.newpipe.util.external_communication.ShareUtils\nimport org.schabi.newpipe.util.text.setTextWithLinks\n\n/**\n * This activity is used to show error details and allow reporting them in various ways.\n * Use [ErrorUtil.openActivity] to correctly open this activity.\n */\nclass ErrorActivity : AppCompatActivity() {\n    private lateinit var errorInfo: ErrorInfo\n    private lateinit var currentTimeStamp: String\n\n    private lateinit var binding: ActivityErrorBinding\n\n    private val contentCountryString: String\n        get() = Localization.getPreferredContentCountry(this).countryCode\n\n    private val contentLanguageString: String\n        get() = Localization.getPreferredLocalization(this).localizationCode\n\n    private val appLanguage: String\n        get() = Localization.getAppLocale().toString()\n\n    private val osString: String\n        get() {\n            val name = System.getProperty(\"os.name\")!!\n            val osBase = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n                Build.VERSION.BASE_OS.ifEmpty { \"Android\" }\n            } else {\n                \"Android\"\n            }\n            return \"$name $osBase ${Build.VERSION.RELEASE} - ${Build.VERSION.SDK_INT}\"\n        }\n\n    private val errorEmailSubject: String\n        get() = \"$ERROR_EMAIL_SUBJECT ${getString(R.string.app_name)} ${BuildConfig.VERSION_NAME}\"\n\n    // /////////////////////////////////////////////////////////////////////\n    // Activity lifecycle\n    // /////////////////////////////////////////////////////////////////////\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        ThemeHelper.setDayNightMode(this)\n        ThemeHelper.setTheme(this)\n\n        binding = ActivityErrorBinding.inflate(layoutInflater)\n        setContentView(binding.getRoot())\n\n        setSupportActionBar(binding.toolbarLayout.toolbar)\n        supportActionBar?.apply {\n            setDisplayHomeAsUpEnabled(true)\n            setTitle(R.string.error_report_title)\n            setDisplayShowTitleEnabled(true)\n        }\n\n        errorInfo = IntentCompat.getParcelableExtra(intent, ERROR_INFO, ErrorInfo::class.java)!!\n\n        // important add guru meditation\n        addGuruMeditation()\n        // print current time, as zoned ISO8601 timestamp\n        currentTimeStamp = ZonedDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)\n\n        binding.errorReportEmailButton.setOnClickListener { _ ->\n            openPrivacyPolicyDialog(this, \"EMAIL\")\n        }\n\n        binding.errorReportCopyButton.setOnClickListener { _ ->\n            ShareUtils.copyToClipboard(this, buildMarkdown())\n        }\n\n        binding.errorReportGitHubButton.setOnClickListener { _ ->\n            openPrivacyPolicyDialog(this, \"GITHUB\")\n        }\n\n        // normal bugreport\n        buildInfo(errorInfo)\n        binding.errorMessageView.setTextWithLinks(errorInfo.getMessage(this))\n        binding.errorView.text = formErrorText(errorInfo.stackTraces)\n\n        // print stack trace once again for debugging:\n        errorInfo.stackTraces.forEach { Log.e(TAG, it) }\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.error_menu, menu)\n        return true\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            android.R.id.home -> {\n                onBackPressed()\n                true\n            }\n\n            R.id.menu_item_share_error -> {\n                ShareUtils.shareText(\n                    applicationContext,\n                    getString(R.string.error_report_title),\n                    buildJson()\n                )\n                true\n            }\n\n            else -> false\n        }\n    }\n\n    private fun openPrivacyPolicyDialog(context: Context, action: String) {\n        AlertDialog.Builder(context)\n            .setIcon(android.R.drawable.ic_dialog_alert)\n            .setTitle(R.string.privacy_policy_title)\n            .setMessage(R.string.start_accept_privacy_policy)\n            .setCancelable(false)\n            .setNeutralButton(R.string.read_privacy_policy) { _, _ ->\n                ShareUtils.openUrlInApp(context, context.getString(R.string.privacy_policy_url))\n            }\n            .setPositiveButton(R.string.accept) { _, _ ->\n                if (action == \"EMAIL\") { // send on email\n                    val intent = Intent(Intent.ACTION_SENDTO)\n                        .setData(\"mailto:\".toUri()) // only email apps should handle this\n                        .putExtra(Intent.EXTRA_EMAIL, arrayOf(ERROR_EMAIL_ADDRESS))\n                        .putExtra(Intent.EXTRA_SUBJECT, errorEmailSubject)\n                        .putExtra(Intent.EXTRA_TEXT, buildJson())\n                    ShareUtils.openIntentInApp(context, intent)\n                } else if (action == \"GITHUB\") { // open the NewPipe issue page on GitHub\n                    ShareUtils.openUrlInApp(this, ERROR_GITHUB_ISSUE_URL)\n                }\n            }\n            .setNegativeButton(R.string.decline, null)\n            .show()\n    }\n\n    private fun formErrorText(stacktrace: Array<String>): String {\n        val separator = \"-------------------------------------\"\n        return stacktrace.joinToString(separator + \"\\n\", separator + \"\\n\", separator)\n    }\n\n    private fun buildInfo(info: ErrorInfo) {\n        binding.errorInfoLabelsView.text = getString(R.string.info_labels)\n\n        val text = info.userAction.message + \"\\n\" +\n            info.request + \"\\n\" +\n            contentLanguageString + \"\\n\" +\n            contentCountryString + \"\\n\" +\n            appLanguage + \"\\n\" +\n            info.getServiceName() + \"\\n\" +\n            currentTimeStamp + \"\\n\" +\n            packageName + \"\\n\" +\n            BuildConfig.VERSION_NAME + \"\\n\" +\n            osString\n\n        binding.errorInfosView.text = text\n    }\n\n    private fun buildJson(): String {\n        try {\n            return JsonWriter.string()\n                .`object`()\n                .value(\"user_action\", errorInfo.userAction.message)\n                .value(\"request\", errorInfo.request)\n                .value(\"content_language\", contentLanguageString)\n                .value(\"content_country\", contentCountryString)\n                .value(\"app_language\", appLanguage)\n                .value(\"service\", errorInfo.getServiceName())\n                .value(\"package\", packageName)\n                .value(\"version\", BuildConfig.VERSION_NAME)\n                .value(\"os\", osString)\n                .value(\"time\", currentTimeStamp)\n                .array(\"exceptions\", errorInfo.stackTraces.toList())\n                .value(\"user_comment\", binding.errorCommentBox.getText().toString())\n                .end()\n                .done()\n        } catch (exception: Exception) {\n            Log.e(TAG, \"Error while erroring: Could not build json\", exception)\n        }\n\n        return \"\"\n    }\n\n    private fun buildMarkdown(): String {\n        try {\n            return buildString(1024) {\n                val userComment = binding.errorCommentBox.text.toString()\n                if (userComment.isNotEmpty()) {\n                    appendLine(userComment)\n                }\n\n                // basic error info\n                appendLine(\"## Exception\")\n                appendLine(\"* __User Action:__ ${errorInfo.userAction.message}\")\n                appendLine(\"* __Request:__ ${errorInfo.request}\")\n                appendLine(\"* __Content Country:__ $contentCountryString\")\n                appendLine(\"* __Content Language:__ $contentLanguageString\")\n                appendLine(\"* __App Language:__ $appLanguage\")\n                appendLine(\"* __Service:__ ${errorInfo.getServiceName()}\")\n                appendLine(\"* __Timestamp:__ $currentTimeStamp\")\n                appendLine(\"* __Package:__ $packageName\")\n                appendLine(\"* __Service:__ ${errorInfo.getServiceName()}\")\n                appendLine(\"* __Version:__ ${BuildConfig.VERSION_NAME}\")\n                appendLine(\"* __OS:__ $osString\")\n\n                // Collapse all logs to a single paragraph when there are more than one\n                // to keep the GitHub issue clean.\n                if (errorInfo.stackTraces.size > 1) {\n                    append(\"<details><summary><b>Exceptions (\")\n                    append(errorInfo.stackTraces.size)\n                    append(\")</b></summary><p>\\n\")\n                }\n\n                // add the logs\n                errorInfo.stackTraces.forEachIndexed { index, stacktrace ->\n                    append(\"<details><summary><b>Crash log \")\n                    if (errorInfo.stackTraces.size > 1) {\n                        append(index + 1)\n                    }\n                    append(\"</b>\")\n                    append(\"</summary><p>\\n\")\n                    append(\"\\n```\\n${stacktrace}\\n```\\n\")\n                    append(\"</details>\\n\")\n                }\n\n                // make sure to close everything\n                if (errorInfo.stackTraces.size > 1) {\n                    append(\"</p></details>\\n\")\n                }\n\n                append(\"<hr>\\n\")\n            }\n        } catch (exception: Exception) {\n            Log.e(TAG, \"Error while erroring: Could not build markdown\", exception)\n            return \"\"\n        }\n    }\n\n    private fun addGuruMeditation() {\n        // just an easter egg\n        var text = binding.errorSorryView.text.toString()\n        text += \"\\n\" + getString(R.string.guru_meditation)\n        binding.errorSorryView.text = text\n    }\n\n    companion object {\n        // LOG TAGS\n        private val TAG = ErrorActivity::class.java.toString()\n\n        // BUNDLE TAGS\n        const val ERROR_INFO = \"error_info\"\n\n        private const val ERROR_EMAIL_ADDRESS = \"crashreport@newpipe.schabi.org\"\n        private const val ERROR_EMAIL_SUBJECT = \"Exception in \"\n\n        private const val ERROR_GITHUB_ISSUE_URL = \"https://github.com/TeamNewPipe/NewPipe/issues\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt",
    "content": "package org.schabi.newpipe.error\n\nimport android.content.Context\nimport android.os.Parcelable\nimport androidx.annotation.StringRes\nimport androidx.core.content.ContextCompat\nimport com.google.android.exoplayer2.ExoPlaybackException\nimport com.google.android.exoplayer2.upstream.HttpDataSource\nimport com.google.android.exoplayer2.upstream.Loader\nimport java.net.UnknownHostException\nimport kotlinx.parcelize.Parcelize\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.extractor.Info\nimport org.schabi.newpipe.extractor.ServiceList\nimport org.schabi.newpipe.extractor.ServiceList.YouTube\nimport org.schabi.newpipe.extractor.exceptions.AccountTerminatedException\nimport org.schabi.newpipe.extractor.exceptions.AgeRestrictedContentException\nimport org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException\nimport org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException\nimport org.schabi.newpipe.extractor.exceptions.GeographicRestrictionException\nimport org.schabi.newpipe.extractor.exceptions.PaidContentException\nimport org.schabi.newpipe.extractor.exceptions.PrivateContentException\nimport org.schabi.newpipe.extractor.exceptions.ReCaptchaException\nimport org.schabi.newpipe.extractor.exceptions.SignInConfirmNotBotException\nimport org.schabi.newpipe.extractor.exceptions.SoundCloudGoPlusContentException\nimport org.schabi.newpipe.extractor.exceptions.UnsupportedContentInCountryException\nimport org.schabi.newpipe.extractor.exceptions.YoutubeMusicPremiumContentException\nimport org.schabi.newpipe.ktx.isNetworkRelated\nimport org.schabi.newpipe.player.mediasource.FailedMediaSource\nimport org.schabi.newpipe.player.resolver.PlaybackResolver\nimport org.schabi.newpipe.util.text.getText\n\n/**\n * An error has occurred in the app. This class contains plain old parcelable data that can be used\n * to report the error and to show it to the user along with correct action buttons.\n */\n@Parcelize\nclass ErrorInfo private constructor(\n    val stackTraces: Array<String>,\n    val userAction: UserAction,\n    val request: String,\n    val serviceId: Int?,\n    private val message: ErrorMessage,\n    /**\n     * If `true`, a report button will be shown for this error. Otherwise the error is not something\n     * that can really be reported (e.g. a network issue, or content not being available at all).\n     */\n    val isReportable: Boolean,\n    /**\n     * If `true`, the process causing this error can be retried, otherwise not.\n     */\n    val isRetryable: Boolean,\n    /**\n     * If present, indicates that the exception was a ReCaptchaException, and this is the URL\n     * provided by the service that can be used to solve the ReCaptcha challenge.\n     */\n    val recaptchaUrl: String?,\n    /**\n     * If present, this resource can alternatively be opened in browser (useful if NewPipe is\n     * badly broken).\n     */\n    val openInBrowserUrl: String?\n) : Parcelable {\n\n    @JvmOverloads\n    constructor(\n        throwable: Throwable,\n        userAction: UserAction,\n        request: String,\n        serviceId: Int? = null,\n        openInBrowserUrl: String? = null\n    ) : this(\n        throwableToStringList(throwable),\n        userAction,\n        request,\n        serviceId,\n        getMessage(throwable, userAction, serviceId),\n        isReportable(throwable),\n        isRetryable(throwable),\n        (throwable as? ReCaptchaException)?.url,\n        openInBrowserUrl\n    )\n\n    @JvmOverloads\n    constructor(\n        throwables: List<Throwable>,\n        userAction: UserAction,\n        request: String,\n        serviceId: Int? = null,\n        openInBrowserUrl: String? = null\n    ) : this(\n        throwableListToStringList(throwables),\n        userAction,\n        request,\n        serviceId,\n        getMessage(throwables.firstOrNull(), userAction, serviceId),\n        throwables.any(::isReportable),\n        throwables.isEmpty() || throwables.any(::isRetryable),\n        throwables.firstNotNullOfOrNull { it as? ReCaptchaException }?.url,\n        openInBrowserUrl\n    )\n\n    // constructor to manually build ErrorInfo when no throwable is available\n    constructor(\n        stackTraces: Array<String>,\n        userAction: UserAction,\n        request: String,\n        serviceId: Int?,\n        @StringRes message: Int\n    ) :\n        this(\n            stackTraces, userAction, request, serviceId, ErrorMessage(message),\n            true, false, null, null\n        )\n\n    // constructor with only one throwable to extract service id and openInBrowserUrl from an Info\n    constructor(\n        throwable: Throwable,\n        userAction: UserAction,\n        request: String,\n        info: Info?\n    ) :\n        this(throwable, userAction, request, info?.serviceId, info?.url)\n\n    // constructor with multiple throwables to extract service id and openInBrowserUrl from an Info\n    constructor(\n        throwables: List<Throwable>,\n        userAction: UserAction,\n        request: String,\n        info: Info?\n    ) :\n        this(throwables, userAction, request, info?.serviceId, info?.url)\n\n    fun getServiceName(): String {\n        return getServiceName(serviceId)\n    }\n\n    fun getMessage(context: Context): CharSequence {\n        return message.getText(context)\n    }\n\n    companion object {\n        @Parcelize\n        class ErrorMessage(\n            @StringRes\n            private val stringRes: Int,\n            private vararg val formatArgs: String\n        ) : Parcelable {\n            fun getText(context: Context): CharSequence {\n                // Ensure locale aware context via ContextCompat.getContextForLanguage() (just in case context is not AppCompatActivity)\n                val ctx = ContextCompat.getContextForLanguage(context)\n                return if (formatArgs.isEmpty()) {\n                    ctx.getText(stringRes)\n                } else {\n                    // ContextCompat.getString() with formatArgs does not exist, so we just\n                    // replicate its source code but with formatArgs\n                    ctx.resources.getText(stringRes, *formatArgs)\n                }\n            }\n        }\n\n        const val SERVICE_NONE = \"<unknown_service>\"\n\n        const val YOUTUBE_IP_BAN_FAQ_URL = \"https://newpipe.net/FAQ/#ip-banned-youtube\"\n\n        private fun getServiceName(serviceId: Int?) = // not using getNameOfServiceById since we want to accept a nullable serviceId and we\n            // want to default to SERVICE_NONE\n            ServiceList.all().firstOrNull { it.serviceId == serviceId }?.serviceInfo?.name\n                ?: SERVICE_NONE\n\n        fun throwableToStringList(throwable: Throwable) = arrayOf(throwable.stackTraceToString())\n\n        fun throwableListToStringList(throwableList: List<Throwable>) = throwableList.map { it.stackTraceToString() }.toTypedArray()\n\n        fun getMessage(\n            throwable: Throwable?,\n            action: UserAction?,\n            serviceId: Int?\n        ): ErrorMessage {\n            return when {\n                // player exceptions\n                // some may be IOException, so do these checks before isNetworkRelated!\n                throwable is ExoPlaybackException -> {\n                    val cause = throwable.cause\n                    when {\n                        cause is HttpDataSource.InvalidResponseCodeException -> {\n                            if (cause.responseCode == 403) {\n                                if (serviceId == YouTube.serviceId) {\n                                    ErrorMessage(R.string.youtube_player_http_403)\n                                } else {\n                                    ErrorMessage(R.string.player_http_403)\n                                }\n                            } else {\n                                ErrorMessage(R.string.player_http_invalid_status, cause.responseCode.toString())\n                            }\n                        }\n\n                        cause is Loader.UnexpectedLoaderException && cause.cause is ExtractionException ->\n                            getMessage(throwable, action, serviceId)\n\n                        throwable.type == ExoPlaybackException.TYPE_SOURCE ->\n                            ErrorMessage(R.string.player_stream_failure)\n\n                        throwable.type == ExoPlaybackException.TYPE_UNEXPECTED ->\n                            ErrorMessage(R.string.player_recoverable_failure)\n\n                        else ->\n                            ErrorMessage(R.string.player_unrecoverable_failure)\n                    }\n                }\n\n                throwable is FailedMediaSource.FailedMediaSourceException ->\n                    getMessage(throwable.cause, action, serviceId)\n\n                throwable is PlaybackResolver.ResolverException ->\n                    ErrorMessage(R.string.player_stream_failure)\n\n                // content not available exceptions\n                throwable is AccountTerminatedException ->\n                    throwable.message\n                        ?.takeIf { reason -> !reason.isEmpty() }\n                        ?.let { reason ->\n                            ErrorMessage(\n                                R.string.account_terminated_service_provides_reason,\n                                getServiceName(serviceId),\n                                reason\n                            )\n                        }\n                        ?: ErrorMessage(R.string.account_terminated)\n\n                throwable is AgeRestrictedContentException ->\n                    ErrorMessage(R.string.restricted_video_no_stream)\n\n                throwable is GeographicRestrictionException ->\n                    ErrorMessage(R.string.georestricted_content)\n\n                throwable is PaidContentException ->\n                    ErrorMessage(R.string.paid_content)\n\n                throwable is PrivateContentException ->\n                    ErrorMessage(R.string.private_content)\n\n                throwable is SoundCloudGoPlusContentException ->\n                    ErrorMessage(R.string.soundcloud_go_plus_content)\n\n                throwable is UnsupportedContentInCountryException ->\n                    ErrorMessage(R.string.unsupported_content_in_country)\n\n                throwable is YoutubeMusicPremiumContentException ->\n                    ErrorMessage(R.string.youtube_music_premium_content)\n\n                throwable is SignInConfirmNotBotException ->\n                    ErrorMessage(\n                        R.string.sign_in_confirm_not_bot_error,\n                        getServiceName(serviceId),\n                        YOUTUBE_IP_BAN_FAQ_URL\n                    )\n\n                throwable is ContentNotAvailableException ->\n                    ErrorMessage(R.string.content_not_available)\n\n                // other extractor exceptions\n                throwable is ContentNotSupportedException ->\n                    ErrorMessage(R.string.content_not_supported)\n\n                // ReCaptchas will be handled in a special way anyway\n                throwable is ReCaptchaException ->\n                    ErrorMessage(R.string.recaptcha_request_toast)\n\n                // test this at the end as many exceptions could be a subclass of IOException\n                throwable != null && throwable.isNetworkRelated ->\n                    ErrorMessage(R.string.network_error)\n\n                // an extraction exception unrelated to the network\n                // is likely an issue with parsing the website\n                throwable is ExtractionException ->\n                    ErrorMessage(R.string.parsing_error)\n\n                // user actions (in case the exception is null or unrecognizable)\n                action == UserAction.UI_ERROR ->\n                    ErrorMessage(R.string.app_ui_crash)\n\n                action == UserAction.REQUESTED_COMMENTS ->\n                    ErrorMessage(R.string.error_unable_to_load_comments)\n\n                action == UserAction.SUBSCRIPTION_CHANGE ->\n                    ErrorMessage(R.string.subscription_change_failed)\n\n                action == UserAction.SUBSCRIPTION_UPDATE ->\n                    ErrorMessage(R.string.subscription_update_failed)\n\n                action == UserAction.LOAD_IMAGE ->\n                    ErrorMessage(R.string.could_not_load_thumbnails)\n\n                action == UserAction.DOWNLOAD_OPEN_DIALOG ->\n                    ErrorMessage(R.string.could_not_setup_download_menu)\n\n                else ->\n                    ErrorMessage(R.string.error_snackbar_message)\n            }\n        }\n\n        fun isReportable(throwable: Throwable?): Boolean {\n            return when (throwable) {\n                // we don't have an exception, so this is a manually built error, which likely\n                // indicates that it's important and is thus reportable\n                null -> true\n\n                // if the service explicitly said that content is not available (e.g. age\n                // restrictions, video deleted, etc.), there is no use in letting users report it\n                is ContentNotAvailableException -> !isContentSurelyNotAvailable(throwable)\n\n                // we know the content is not supported, no need to let the user report it\n                is ContentNotSupportedException -> false\n\n                // happens often when there is no internet connection; we don't use\n                // `throwable.isNetworkRelated` since any `IOException` would make that function\n                // return true, but not all `IOException`s are network related\n                is UnknownHostException -> false\n\n                // by default, this is an unexpected exception, which the user could report\n                else -> true\n            }\n        }\n\n        fun isRetryable(throwable: Throwable?): Boolean {\n            return when (throwable) {\n                // if we know the content is surely not available, retrying won't help\n                is ContentNotAvailableException -> !isContentSurelyNotAvailable(throwable)\n\n                // we know the content is not supported, retrying won't help\n                is ContentNotSupportedException -> false\n\n                // by default (including if throwable is null), enable retrying (though the retry\n                // button will be shown only if a way to perform the retry is implemented)\n                else -> true\n            }\n        }\n\n        /**\n         * Unfortunately sometimes [ContentNotAvailableException] may not indicate that the content\n         * is blocked/deleted/paid, but may just indicate that we could not extract it. This is an\n         * inconsistency in the exceptions thrown by the extractor, but until it is fixed, this\n         * function will distinguish between the two types.\n         * @return `true` if the content is not available because of a limitation imposed by the\n         * service or the owner, `false` if the extractor could not extract info about it\n         */\n        fun isContentSurelyNotAvailable(e: ContentNotAvailableException): Boolean {\n            return when (e) {\n                is AccountTerminatedException,\n                is AgeRestrictedContentException,\n                is GeographicRestrictionException,\n                is PaidContentException,\n                is PrivateContentException,\n                is SoundCloudGoPlusContentException,\n                is UnsupportedContentInCountryException,\n                is YoutubeMusicPremiumContentException -> true\n\n                else -> false\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/ErrorPanelHelper.kt",
    "content": "package org.schabi.newpipe.error\n\nimport android.content.Context\nimport android.content.Intent\nimport android.view.View\nimport android.widget.Button\nimport android.widget.TextView\nimport androidx.annotation.StringRes\nimport androidx.core.view.isVisible\nimport androidx.fragment.app.Fragment\nimport com.jakewharton.rxbinding4.view.clicks\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.disposables.Disposable\nimport java.util.concurrent.TimeUnit\nimport org.schabi.newpipe.MainActivity\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.ktx.animate\nimport org.schabi.newpipe.util.external_communication.ShareUtils\nimport org.schabi.newpipe.util.text.setTextWithLinks\n\nclass ErrorPanelHelper(\n    private val fragment: Fragment,\n    rootView: View,\n    onRetry: Runnable?\n) {\n    private val context: Context = rootView.context!!\n\n    private val errorPanelRoot: View = rootView.findViewById(R.id.error_panel)\n\n    // the only element that is visible by default\n    private val errorTextView: TextView =\n        errorPanelRoot.findViewById(R.id.error_message_view)\n    private val errorServiceInfoTextView: TextView =\n        errorPanelRoot.findViewById(R.id.error_message_service_info_view)\n    private val errorServiceExplanationTextView: TextView =\n        errorPanelRoot.findViewById(R.id.error_message_service_explanation_view)\n    private val errorActionButton: Button =\n        errorPanelRoot.findViewById(R.id.error_action_button)\n    private val errorRetryButton: Button =\n        errorPanelRoot.findViewById(R.id.error_retry_button)\n    private val errorOpenInBrowserButton: Button =\n        errorPanelRoot.findViewById(R.id.error_open_in_browser)\n\n    private var errorDisposable: Disposable? = null\n    private var retryShouldBeShown: Boolean = (onRetry != null)\n\n    init {\n        if (onRetry != null) {\n            errorDisposable = errorRetryButton.clicks()\n                .debounce(300, TimeUnit.MILLISECONDS)\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe { onRetry.run() }\n        }\n    }\n\n    private fun ensureDefaultVisibility() {\n        errorTextView.isVisible = true\n\n        errorServiceInfoTextView.isVisible = false\n        errorServiceExplanationTextView.isVisible = false\n        errorActionButton.isVisible = false\n        errorRetryButton.isVisible = false\n        errorOpenInBrowserButton.isVisible = false\n    }\n\n    fun showError(errorInfo: ErrorInfo) {\n        ensureDefaultVisibility()\n        errorTextView.setTextWithLinks(errorInfo.getMessage(context))\n\n        if (errorInfo.recaptchaUrl != null) {\n            showAndSetErrorButtonAction(R.string.recaptcha_solve) {\n                // Starting ReCaptcha Challenge Activity\n                val intent = Intent(context, ReCaptchaActivity::class.java)\n                intent.putExtra(ReCaptchaActivity.RECAPTCHA_URL_EXTRA, errorInfo.recaptchaUrl)\n                fragment.startActivityForResult(intent, ReCaptchaActivity.RECAPTCHA_REQUEST)\n                errorActionButton.setOnClickListener(null)\n            }\n        } else if (errorInfo.isReportable) {\n            showAndSetErrorButtonAction(R.string.error_snackbar_action) {\n                ErrorUtil.openActivity(context, errorInfo)\n            }\n        }\n\n        if (errorInfo.isRetryable) {\n            errorRetryButton.isVisible = retryShouldBeShown\n        }\n\n        if (errorInfo.openInBrowserUrl != null) {\n            errorOpenInBrowserButton.isVisible = true\n            errorOpenInBrowserButton.setOnClickListener {\n                ShareUtils.openUrlInBrowser(context, errorInfo.openInBrowserUrl)\n            }\n        }\n\n        setRootVisible()\n    }\n\n    /**\n     * Shows the errorButtonAction, sets a text into it and sets the click listener.\n     */\n    private fun showAndSetErrorButtonAction(\n        @StringRes resid: Int,\n        listener: View.OnClickListener\n    ) {\n        errorActionButton.isVisible = true\n        errorActionButton.setText(resid)\n        errorActionButton.setOnClickListener(listener)\n    }\n\n    fun showTextError(errorString: String) {\n        ensureDefaultVisibility()\n\n        errorTextView.setTextWithLinks(errorString)\n\n        setRootVisible()\n    }\n\n    private fun setRootVisible() {\n        errorPanelRoot.animate(true, 300)\n    }\n\n    fun hide() {\n        errorActionButton.setOnClickListener(null)\n        errorPanelRoot.animate(false, 150)\n    }\n\n    fun isVisible(): Boolean {\n        return errorPanelRoot.isVisible\n    }\n\n    fun dispose() {\n        errorActionButton.setOnClickListener(null)\n        errorRetryButton.setOnClickListener(null)\n        errorDisposable?.dispose()\n    }\n\n    companion object {\n        val TAG: String = ErrorPanelHelper::class.simpleName!!\n        val DEBUG: Boolean = MainActivity.DEBUG\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt",
    "content": "package org.schabi.newpipe.error\n\nimport android.app.Activity\nimport android.app.PendingIntent\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.Color\nimport android.view.View\nimport android.widget.Toast\nimport androidx.core.app.NotificationCompat\nimport androidx.core.app.NotificationManagerCompat\nimport androidx.core.app.PendingIntentCompat\nimport androidx.core.content.ContextCompat\nimport androidx.fragment.app.Fragment\nimport androidx.preference.PreferenceManager\nimport com.google.android.material.snackbar.Snackbar\nimport org.schabi.newpipe.MainActivity\nimport org.schabi.newpipe.R\n\n/**\n * This class contains all of the methods that should be used to let the user know that an error has\n * occurred in the least intrusive way possible for each case. This class is for unexpected errors,\n * for handled errors (e.g. network errors) use e.g. [ErrorPanelHelper] instead.\n * - Use a snackbar if the exception is not critical and it happens in a place where a root view\n *      is available.\n * - Use a notification if the exception happens inside a background service (player, subscription\n *      import, ...) or there is no activity/fragment from which to extract a root view.\n * - Finally use the error activity only as a last resort in case the exception is critical and\n *      happens in an open activity (since the workflow would be interrupted anyway in that case).\n */\nclass ErrorUtil {\n    companion object {\n        private const val ERROR_REPORT_NOTIFICATION_ID = 5340681\n\n        /**\n         * Starts a new error activity allowing the user to report the provided error. Only use this\n         * method directly as a last resort in case the exception is critical and happens in an open\n         * activity (since the workflow would be interrupted anyway in that case). So never use this\n         * for background services.\n         *\n         * If the crashed occurred while the app was in the background open a notification instead\n         *\n         * @param context the context to use to start the new activity\n         * @param errorInfo the error info to be reported\n         */\n        @JvmStatic\n        fun openActivity(context: Context, errorInfo: ErrorInfo) {\n            if (PreferenceManager.getDefaultSharedPreferences(context)\n                    .getBoolean(MainActivity.KEY_IS_IN_BACKGROUND, true)\n            ) {\n                createNotification(context, errorInfo)\n            } else {\n                context.startActivity(getErrorActivityIntent(context, errorInfo))\n            }\n        }\n\n        /**\n         * Show a bottom snackbar to the user, with a report button that opens the error activity.\n         * Use this method if the exception is not critical and it happens in a place where a root\n         * view is available.\n         *\n         * @param context will be used to obtain the root view if it is an [Activity]; if no root\n         *                view can be found an error notification is shown instead\n         * @param errorInfo the error info to be reported\n         */\n        @JvmStatic\n        fun showSnackbar(context: Context, errorInfo: ErrorInfo) {\n            val rootView = (context as? Activity)?.findViewById<View>(android.R.id.content)\n            showSnackbar(context, rootView, errorInfo)\n        }\n\n        /**\n         * Show a bottom snackbar to the user, with a report button that opens the error activity.\n         * Use this method if the exception is not critical and it happens in a place where a root\n         * view is available.\n         *\n         * @param fragment will be used to obtain the root view if it has a connected [Activity]; if\n         *                 no root view can be found an error notification is shown instead\n         * @param errorInfo the error info to be reported\n         */\n        @JvmStatic\n        fun showSnackbar(fragment: Fragment, errorInfo: ErrorInfo) {\n            var rootView = fragment.view\n            if (rootView == null && fragment.activity != null) {\n                rootView = fragment.requireActivity().findViewById(android.R.id.content)\n            }\n            showSnackbar(fragment.requireContext(), rootView, errorInfo)\n        }\n\n        /**\n         * Shortcut to calling [showSnackbar] with an [ErrorInfo] of type [UserAction.UI_ERROR]\n         */\n        @JvmStatic\n        fun showUiErrorSnackbar(context: Context, request: String, throwable: Throwable) {\n            showSnackbar(context, ErrorInfo(throwable, UserAction.UI_ERROR, request))\n        }\n\n        /**\n         * Shortcut to calling [showSnackbar] with an [ErrorInfo] of type [UserAction.UI_ERROR]\n         */\n        @JvmStatic\n        fun showUiErrorSnackbar(fragment: Fragment, request: String, throwable: Throwable) {\n            showSnackbar(fragment, ErrorInfo(throwable, UserAction.UI_ERROR, request))\n        }\n\n        /**\n         * Create an error notification. Tapping on the notification opens the error activity. Use\n         * this method if the exception happens inside a background service (player, subscription\n         * import, ...) or there is no activity/fragment from which to extract a root view.\n         *\n         * @param context the context to use to show the notification\n         * @param errorInfo the error info to be reported; the error message\n         *                  [ErrorInfo.messageStringId] will be shown in the notification\n         *                  description\n         */\n        @JvmStatic\n        fun createNotification(context: Context, errorInfo: ErrorInfo) {\n            val notificationBuilder: NotificationCompat.Builder =\n                NotificationCompat.Builder(\n                    context,\n                    context.getString(R.string.error_report_channel_id)\n                )\n                    .setSmallIcon(R.drawable.ic_bug_report)\n                    .setContentTitle(context.getString(R.string.error_report_notification_title))\n                    .setContentText(errorInfo.getMessage(context))\n                    .setAutoCancel(true)\n                    .setContentIntent(\n                        PendingIntentCompat.getActivity(\n                            context,\n                            0,\n                            getErrorActivityIntent(context, errorInfo),\n                            PendingIntent.FLAG_UPDATE_CURRENT,\n                            false\n                        )\n                    )\n\n            val notificationManager = NotificationManagerCompat.from(context)\n            if (notificationManager.areNotificationsEnabled()) {\n                notificationManager\n                    .notify(ERROR_REPORT_NOTIFICATION_ID, notificationBuilder.build())\n            }\n\n            ContextCompat.getMainExecutor(context).execute {\n                // since the notification is silent, also show a toast, otherwise the user is confused\n                Toast.makeText(context, R.string.error_report_notification_toast, Toast.LENGTH_SHORT)\n                    .show()\n            }\n        }\n\n        private fun getErrorActivityIntent(context: Context, errorInfo: ErrorInfo): Intent {\n            val intent = Intent(context, ErrorActivity::class.java)\n            intent.putExtra(ErrorActivity.ERROR_INFO, errorInfo)\n            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n            return intent\n        }\n\n        private fun showSnackbar(context: Context, rootView: View?, errorInfo: ErrorInfo) {\n            if (rootView == null) {\n                // fallback to showing a notification if no root view is available\n                createNotification(context, errorInfo)\n            } else {\n                Snackbar.make(rootView, errorInfo.getMessage(context), Snackbar.LENGTH_LONG)\n                    .setActionTextColor(Color.YELLOW)\n                    .setAction(context.getString(R.string.error_snackbar_action).uppercase()) {\n                        context.startActivity(getErrorActivityIntent(context, errorInfo))\n                    }.show()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/ReCaptchaActivity.java",
    "content": "package org.schabi.newpipe.error;\n\nimport android.annotation.SuppressLint;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.webkit.CookieManager;\nimport android.webkit.WebResourceRequest;\nimport android.webkit.WebSettings;\nimport android.webkit.WebView;\nimport android.webkit.WebViewClient;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.core.app.NavUtils;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.DownloaderImpl;\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.ActivityRecaptchaBinding;\nimport org.schabi.newpipe.extractor.utils.Utils;\nimport org.schabi.newpipe.util.ThemeHelper;\n\n/*\n * Created by beneth <bmauduit@beneth.fr> on 06.12.16.\n *\n * Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org>\n * ReCaptchaActivity.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\npublic class ReCaptchaActivity extends AppCompatActivity {\n    public static final int RECAPTCHA_REQUEST = 10;\n    public static final String RECAPTCHA_URL_EXTRA = \"recaptcha_url_extra\";\n    public static final String TAG = ReCaptchaActivity.class.toString();\n    public static final String YT_URL = \"https://www.youtube.com\";\n    public static final String RECAPTCHA_COOKIES_KEY = \"recaptcha_cookies\";\n\n    public static String sanitizeRecaptchaUrl(@Nullable final String url) {\n        if (url == null || url.trim().isEmpty()) {\n            return YT_URL; // YouTube is the most likely service to have thrown a recaptcha\n        } else {\n            // remove \"pbj=1\" parameter from YouYube urls, as it makes the page JSON and not HTML\n            return url.replace(\"&pbj=1\", \"\").replace(\"pbj=1&\", \"\").replace(\"?pbj=1\", \"\");\n        }\n    }\n\n    private ActivityRecaptchaBinding recaptchaBinding;\n    private String foundCookies = \"\";\n\n    @SuppressLint(\"SetJavaScriptEnabled\")\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        ThemeHelper.setTheme(this);\n        super.onCreate(savedInstanceState);\n\n        recaptchaBinding = ActivityRecaptchaBinding.inflate(getLayoutInflater());\n        setContentView(recaptchaBinding.getRoot());\n        setSupportActionBar(recaptchaBinding.toolbar);\n\n        final String url = sanitizeRecaptchaUrl(getIntent().getStringExtra(RECAPTCHA_URL_EXTRA));\n        // set return to Cancel by default\n        setResult(RESULT_CANCELED);\n\n        // enable Javascript\n        final WebSettings webSettings = recaptchaBinding.reCaptchaWebView.getSettings();\n        webSettings.setJavaScriptEnabled(true);\n        webSettings.setUserAgentString(DownloaderImpl.USER_AGENT);\n\n        recaptchaBinding.reCaptchaWebView.setWebViewClient(new WebViewClient() {\n            @Override\n            public boolean shouldOverrideUrlLoading(final WebView view,\n                                                    final WebResourceRequest request) {\n                if (MainActivity.DEBUG) {\n                    Log.d(TAG, \"shouldOverrideUrlLoading: url=\" + request.getUrl().toString());\n                }\n\n                handleCookiesFromUrl(request.getUrl().toString());\n                return false;\n            }\n\n            @Override\n            public void onPageFinished(final WebView view, final String url) {\n                super.onPageFinished(view, url);\n                handleCookiesFromUrl(url);\n            }\n        });\n\n        // cleaning cache, history and cookies from webView\n        recaptchaBinding.reCaptchaWebView.clearCache(true);\n        recaptchaBinding.reCaptchaWebView.clearHistory();\n        CookieManager.getInstance().removeAllCookies(null);\n\n        recaptchaBinding.reCaptchaWebView.loadUrl(url);\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(final Menu menu) {\n        getMenuInflater().inflate(R.menu.menu_recaptcha, menu);\n\n        final ActionBar actionBar = getSupportActionBar();\n        if (actionBar != null) {\n            actionBar.setDisplayHomeAsUpEnabled(false);\n            actionBar.setTitle(R.string.title_activity_recaptcha);\n            actionBar.setSubtitle(R.string.subtitle_activity_recaptcha);\n        }\n\n        return true;\n    }\n\n    @Override\n    @SuppressLint(\"MissingSuperCall\") // saveCookiesAndFinish method handles back navigation\n    public void onBackPressed() {\n        saveCookiesAndFinish();\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(final MenuItem item) {\n        if (item.getItemId() == R.id.menu_item_done) {\n            saveCookiesAndFinish();\n            return true;\n        }\n        return false;\n    }\n\n    private void saveCookiesAndFinish() {\n        // try to get cookies of unclosed page\n        handleCookiesFromUrl(recaptchaBinding.reCaptchaWebView.getUrl());\n        if (MainActivity.DEBUG) {\n            Log.d(TAG, \"saveCookiesAndFinish: foundCookies=\" + foundCookies);\n        }\n\n        if (!foundCookies.isEmpty()) {\n            // save cookies to preferences\n            final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(\n                    getApplicationContext());\n            final String key = getApplicationContext().getString(R.string.recaptcha_cookies_key);\n            prefs.edit().putString(key, foundCookies).apply();\n\n            // give cookies to Downloader class\n            DownloaderImpl.getInstance().setCookie(RECAPTCHA_COOKIES_KEY, foundCookies);\n            setResult(RESULT_OK);\n        }\n\n        // Navigate to blank page (unloads youtube to prevent background playback)\n        recaptchaBinding.reCaptchaWebView.loadUrl(\"about:blank\");\n\n        final Intent intent = new Intent(this, org.schabi.newpipe.MainActivity.class);\n        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n        NavUtils.navigateUpTo(this, intent);\n    }\n\n\n    private void handleCookiesFromUrl(@Nullable final String url) {\n        if (MainActivity.DEBUG) {\n            Log.d(TAG, \"handleCookiesFromUrl: url=\" + (url == null ? \"null\" : url));\n        }\n\n        if (url == null) {\n            return;\n        }\n\n        final String cookies = CookieManager.getInstance().getCookie(url);\n        handleCookies(cookies);\n\n        // sometimes cookies are inside the url\n        final int abuseStart = url.indexOf(\"google_abuse=\");\n        if (abuseStart != -1) {\n            final int abuseEnd = url.indexOf(\"+path\");\n\n            try {\n                handleCookies(Utils.decodeUrlUtf8(url.substring(abuseStart + 13, abuseEnd)));\n            } catch (final StringIndexOutOfBoundsException e) {\n                if (MainActivity.DEBUG) {\n                    Log.e(TAG, \"handleCookiesFromUrl: invalid google abuse starting at \"\n                            + abuseStart + \" and ending at \" + abuseEnd + \" for url \" + url, e);\n                }\n            }\n        }\n    }\n\n    private void handleCookies(@Nullable final String cookies) {\n        if (MainActivity.DEBUG) {\n            Log.d(TAG, \"handleCookies: cookies=\" + (cookies == null ? \"null\" : cookies));\n        }\n\n        if (cookies == null) {\n            return;\n        }\n\n        addYoutubeCookies(cookies);\n        // add here methods to extract cookies for other services\n    }\n\n    private void addYoutubeCookies(@NonNull final String cookies) {\n        if (cookies.contains(\"s_gl=\") || cookies.contains(\"goojf=\")\n                || cookies.contains(\"VISITOR_INFO1_LIVE=\")\n                || cookies.contains(\"GOOGLE_ABUSE_EXEMPTION=\")) {\n            // youtube seems to also need the other cookies:\n            addCookie(cookies);\n        }\n    }\n\n    private void addCookie(final String cookie) {\n        if (foundCookies.contains(cookie)) {\n            return;\n        }\n\n        if (foundCookies.isEmpty() || foundCookies.endsWith(\"; \")) {\n            foundCookies += cookie;\n        } else if (foundCookies.endsWith(\";\")) {\n            foundCookies += \" \" + cookie;\n        } else {\n            foundCookies += \"; \" + cookie;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/error/UserAction.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.error\n\n/**\n * The user actions that can cause an error.\n */\nenum class UserAction(val message: String) {\n    USER_REPORT(\"user report\"),\n    UI_ERROR(\"ui error\"),\n    DATABASE_IMPORT_EXPORT(\"database import or export\"),\n    SUBSCRIPTION_CHANGE(\"subscription change\"),\n    SUBSCRIPTION_UPDATE(\"subscription update\"),\n    SUBSCRIPTION_GET(\"get subscription\"),\n    SUBSCRIPTION_IMPORT_EXPORT(\"subscription import or export\"),\n    LOAD_IMAGE(\"load image\"),\n    SOMETHING_ELSE(\"something else\"),\n    SEARCHED(\"searched\"),\n    GET_SUGGESTIONS(\"get suggestions\"),\n    REQUESTED_STREAM(\"requested stream\"),\n    REQUESTED_CHANNEL(\"requested channel\"),\n    REQUESTED_PLAYLIST(\"requested playlist\"),\n    REQUESTED_KIOSK(\"requested kiosk\"),\n    REQUESTED_COMMENTS(\"requested comments\"),\n    REQUESTED_COMMENT_REPLIES(\"requested comment replies\"),\n    REQUESTED_FEED(\"requested feed\"),\n    REQUESTED_BOOKMARK(\"bookmark\"),\n    DELETE_FROM_HISTORY(\"delete from history\"),\n    PLAY_STREAM(\"play stream\"),\n    DOWNLOAD_OPEN_DIALOG(\"download open dialog\"),\n    DOWNLOAD_POSTPROCESSING(\"download post-processing\"),\n    DOWNLOAD_FAILED(\"download failed\"),\n    NEW_STREAMS_NOTIFICATIONS(\"new streams notifications\"),\n    PREFERENCES_MIGRATION(\"migration of preferences\"),\n    SHARE_TO_NEWPIPE(\"share to newpipe\"),\n    CHECK_FOR_NEW_APP_VERSION(\"check for new app version\"),\n    OPEN_INFO_ITEM_DIALOG(\"open info item dialog\"),\n    GETTING_MAIN_SCREEN_TAB(\"getting main screen tab\"),\n    PLAY_ON_POPUP(\"play on popup\"),\n    SUBSCRIPTIONS(\"loading subscriptions\")\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/BackPressable.java",
    "content": "package org.schabi.newpipe.fragments;\n\n/**\n * Indicates that the current fragment can handle back presses.\n */\npublic interface BackPressable {\n    /**\n     * A back press was delegated to this fragment.\n     *\n     * @return if the back press was handled\n     */\n    boolean onBackPressed();\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java",
    "content": "package org.schabi.newpipe.fragments;\n\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\n\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\nimport androidx.fragment.app.Fragment;\n\nimport com.evernote.android.state.State;\n\nimport org.schabi.newpipe.BaseFragment;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorPanelHelper;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.util.InfoCache;\n\nimport java.util.concurrent.atomic.AtomicBoolean;\n\npublic abstract class BaseStateFragment<I> extends BaseFragment implements ViewContract<I> {\n    @State\n    protected AtomicBoolean wasLoading = new AtomicBoolean();\n    protected AtomicBoolean isLoading = new AtomicBoolean();\n\n    @Nullable\n    protected View emptyStateView;\n    @Nullable\n    protected TextView emptyStateMessageView;\n    @Nullable\n    private ProgressBar loadingProgressBar;\n\n    private ErrorPanelHelper errorPanelHelper;\n    @Nullable\n    @State\n    protected ErrorInfo lastPanelError = null;\n\n    @Override\n    public void onViewCreated(@NonNull final View rootView, final Bundle savedInstanceState) {\n        super.onViewCreated(rootView, savedInstanceState);\n        doInitialLoadLogic();\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        wasLoading.set(isLoading.get());\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        if (lastPanelError != null) {\n            showError(lastPanelError);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n        emptyStateView = rootView.findViewById(R.id.empty_state_view);\n        emptyStateMessageView = rootView.findViewById(R.id.empty_state_message);\n        loadingProgressBar = rootView.findViewById(R.id.loading_progress_bar);\n        errorPanelHelper = new ErrorPanelHelper(this, rootView, this::onRetryButtonClicked);\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        if (errorPanelHelper != null) {\n            errorPanelHelper.dispose();\n        }\n        emptyStateView = null;\n        emptyStateMessageView = null;\n    }\n\n    protected void onRetryButtonClicked() {\n        reloadContent();\n    }\n\n    public void reloadContent() {\n        startLoading(true);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Load\n    //////////////////////////////////////////////////////////////////////////*/\n\n    protected void doInitialLoadLogic() {\n        startLoading(true);\n    }\n\n    protected void startLoading(final boolean forceLoad) {\n        if (DEBUG) {\n            Log.d(TAG, \"startLoading() called with: forceLoad = [\" + forceLoad + \"]\");\n        }\n        showLoading();\n        isLoading.set(true);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Contract\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void showLoading() {\n        if (emptyStateView != null) {\n            animate(emptyStateView, false, 150);\n        }\n        if (loadingProgressBar != null) {\n            animate(loadingProgressBar, true, 400);\n        }\n        hideErrorPanel();\n    }\n\n    @Override\n    public void hideLoading() {\n        if (emptyStateView != null) {\n            animate(emptyStateView, false, 150);\n        }\n        if (loadingProgressBar != null) {\n            animate(loadingProgressBar, false, 0);\n        }\n        hideErrorPanel();\n    }\n\n    @Override\n    public void showEmptyState() {\n        isLoading.set(false);\n        if (emptyStateView != null) {\n            animate(emptyStateView, true, 200);\n        }\n        if (loadingProgressBar != null) {\n            animate(loadingProgressBar, false, 0);\n        }\n        hideErrorPanel();\n    }\n\n    @Override\n    public void handleResult(final I result) {\n        if (DEBUG) {\n            Log.d(TAG, \"handleResult() called with: result = [\" + result + \"]\");\n        }\n        hideLoading();\n    }\n\n    @Override\n    public void handleError() {\n        isLoading.set(false);\n        InfoCache.getInstance().clearCache();\n        if (emptyStateView != null) {\n            animate(emptyStateView, false, 150);\n        }\n        if (loadingProgressBar != null) {\n            animate(loadingProgressBar, false, 0);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Error handling\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public final void showError(final ErrorInfo errorInfo) {\n        handleError();\n\n        if (isDetached() || isRemoving()) {\n            if (DEBUG) {\n                Log.w(TAG, \"showError() is detached or removing = [\" + errorInfo + \"]\");\n            }\n            return;\n        }\n\n        errorPanelHelper.showError(errorInfo);\n        lastPanelError = errorInfo;\n    }\n\n    public final void showTextError(@NonNull final String errorString) {\n        handleError();\n\n        if (isDetached() || isRemoving()) {\n            if (DEBUG) {\n                Log.w(TAG, \"showTextError() is detached or removing = [\" + errorString + \"]\");\n            }\n            return;\n        }\n\n        errorPanelHelper.showTextError(errorString);\n    }\n\n    protected void setEmptyStateMessage(@StringRes final int text) {\n        if (emptyStateMessageView != null) {\n            emptyStateMessageView.setText(text);\n        }\n    }\n\n    public final void hideErrorPanel() {\n        errorPanelHelper.hide();\n        lastPanelError = null;\n    }\n\n    public final boolean isErrorPanelVisible() {\n        return errorPanelHelper.isVisible();\n    }\n\n    /**\n     * Directly calls {@link ErrorUtil#showSnackbar(Fragment, ErrorInfo)}, that shows a snackbar if\n     * a valid view can be found, otherwise creates an error report notification.\n     *\n     * @param errorInfo The error information\n     */\n    public void showSnackBarError(final ErrorInfo errorInfo) {\n        if (DEBUG) {\n            Log.d(TAG, \"showSnackBarError() called with: errorInfo = [\" + errorInfo + \"]\");\n        }\n        ErrorUtil.showSnackbar(this, errorInfo);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/BlankFragment.java",
    "content": "package org.schabi.newpipe.fragments;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.Nullable;\n\nimport com.evernote.android.state.State;\n\nimport org.schabi.newpipe.BaseFragment;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorPanelHelper;\n\npublic class BlankFragment extends BaseFragment {\n\n    @State\n    @Nullable\n    ErrorInfo errorInfo;\n    @Nullable\n    ErrorPanelHelper errorPanel = null;\n\n    /**\n     * Builds a blank fragment that just says the app name and suggests clicking on search.\n     */\n    public BlankFragment() {\n        this(null);\n    }\n\n    /**\n     * @param errorInfo if null acts like {@link BlankFragment}, else shows an error panel.\n     */\n    public BlankFragment(@Nullable final ErrorInfo errorInfo) {\n        this.errorInfo = errorInfo;\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        setTitle(\"NewPipe\");\n        final View view = inflater.inflate(R.layout.fragment_blank, container, false);\n        if (errorInfo != null) {\n            errorPanel = new ErrorPanelHelper(this, view, null);\n            errorPanel.showError(errorInfo);\n            view.findViewById(R.id.blank_page_content).setVisibility(View.GONE);\n        }\n        return view;\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n\n        if (errorPanel != null) {\n            errorPanel.dispose();\n            errorPanel = null;\n        }\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        setTitle(\"NewPipe\");\n        // leave this inline. Will make it harder for copy cats.\n        // If you are a Copy cat FUCK YOU.\n        // I WILL FIND YOU, AND I WILL ...\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/EmptyFragment.java",
    "content": "package org.schabi.newpipe.fragments;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.BaseFragment;\nimport org.schabi.newpipe.R;\n\npublic class EmptyFragment extends BaseFragment {\n    private static final String SHOW_MESSAGE = \"SHOW_MESSAGE\";\n\n    public static final EmptyFragment newInstance(final boolean showMessage) {\n        final EmptyFragment emptyFragment = new EmptyFragment();\n        final Bundle bundle = new Bundle(1);\n        bundle.putBoolean(SHOW_MESSAGE, showMessage);\n        emptyFragment.setArguments(bundle);\n        return emptyFragment;\n    }\n\n    @Override\n    public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        final boolean showMessage = getArguments().getBoolean(SHOW_MESSAGE);\n        final View view = inflater.inflate(R.layout.fragment_empty, container, false);\n        view.findViewById(R.id.empty_state_view).setVisibility(\n                showMessage ? View.VISIBLE : View.GONE);\n        return view;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java",
    "content": "package org.schabi.newpipe.fragments;\n\nimport static android.widget.RelativeLayout.ABOVE;\nimport static android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM;\nimport static android.widget.RelativeLayout.ALIGN_PARENT_TOP;\nimport static android.widget.RelativeLayout.BELOW;\nimport static com.google.android.material.tabs.TabLayout.INDICATOR_GRAVITY_BOTTOM;\nimport static com.google.android.material.tabs.TabLayout.INDICATOR_GRAVITY_TOP;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.res.ColorStateList;\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.RelativeLayout;\n\nimport androidx.annotation.ColorInt;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.fragment.app.FragmentStatePagerAdapterMenuWorkaround;\nimport androidx.preference.PreferenceManager;\nimport androidx.viewpager.widget.ViewPager;\n\nimport com.google.android.material.tabs.TabLayout;\n\nimport org.schabi.newpipe.BaseFragment;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.FragmentMainBinding;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.local.playlist.LocalPlaylistFragment;\nimport org.schabi.newpipe.settings.tabs.Tab;\nimport org.schabi.newpipe.settings.tabs.TabsManager;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.ServiceHelper;\nimport org.schabi.newpipe.util.ThemeHelper;\nimport org.schabi.newpipe.views.ScrollableTabLayout;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class MainFragment extends BaseFragment implements TabLayout.OnTabSelectedListener {\n    private FragmentMainBinding binding;\n    private SelectedTabsPagerAdapter pagerAdapter;\n\n    private final List<Tab> tabsList = new ArrayList<>();\n    private TabsManager tabsManager;\n\n    private boolean hasTabsChanged = false;\n\n    private SharedPreferences prefs;\n    private boolean youtubeRestrictedModeEnabled;\n    private String youtubeRestrictedModeEnabledKey;\n    private boolean mainTabsPositionBottom;\n    private String mainTabsPositionKey;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Fragment's LifeCycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setHasOptionsMenu(true);\n        tabsManager = TabsManager.getManager(activity);\n        tabsManager.setSavedTabsListener(() -> {\n            if (DEBUG) {\n                Log.d(TAG, \"TabsManager.SavedTabsChangeListener: \"\n                        + \"onTabsChanged called, isResumed = \" + isResumed());\n            }\n            if (isResumed()) {\n                setupTabs();\n            } else {\n                hasTabsChanged = true;\n            }\n        });\n\n        prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());\n        youtubeRestrictedModeEnabledKey = getString(R.string.youtube_restricted_mode_enabled);\n        youtubeRestrictedModeEnabled = prefs.getBoolean(youtubeRestrictedModeEnabledKey, false);\n        mainTabsPositionKey = getString(R.string.main_tabs_position_key);\n        mainTabsPositionBottom = prefs.getBoolean(mainTabsPositionKey, false);\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_main, container, false);\n    }\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n\n        binding = FragmentMainBinding.bind(rootView);\n\n        binding.mainTabLayout.setupWithViewPager(binding.pager);\n        binding.mainTabLayout.addOnTabSelectedListener(this);\n\n        setupTabs();\n        updateTabLayoutPosition();\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n\n        final boolean newYoutubeRestrictedModeEnabled =\n                prefs.getBoolean(youtubeRestrictedModeEnabledKey, false);\n        if (youtubeRestrictedModeEnabled != newYoutubeRestrictedModeEnabled || hasTabsChanged) {\n            youtubeRestrictedModeEnabled = newYoutubeRestrictedModeEnabled;\n            setupTabs();\n        }\n\n        final boolean newMainTabsPosition = prefs.getBoolean(mainTabsPositionKey, false);\n        if (mainTabsPositionBottom != newMainTabsPosition) {\n            mainTabsPositionBottom = newMainTabsPosition;\n            updateTabLayoutPosition();\n        }\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        tabsManager.unsetSavedTabsListener();\n        if (binding != null) {\n            binding.pager.setAdapter(null);\n            binding = null;\n        }\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        binding = null;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Menu\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) {\n        super.onCreateOptionsMenu(menu, inflater);\n        if (DEBUG) {\n            Log.d(TAG, \"onCreateOptionsMenu() called with: \"\n                    + \"menu = [\" + menu + \"], inflater = [\" + inflater + \"]\");\n        }\n        inflater.inflate(R.menu.menu_main_fragment, menu);\n\n        final ActionBar supportActionBar = activity.getSupportActionBar();\n        if (supportActionBar != null) {\n            supportActionBar.setDisplayHomeAsUpEnabled(false);\n        }\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(final MenuItem item) {\n        if (item.getItemId() == R.id.action_search) {\n            try {\n                NavigationHelper.openSearchFragment(getFM(),\n                        ServiceHelper.getSelectedServiceId(activity), \"\");\n            } catch (final Exception e) {\n                ErrorUtil.showUiErrorSnackbar(this, \"Opening search fragment\", e);\n            }\n            return true;\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Tabs\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void setupTabs() {\n        tabsList.clear();\n        tabsList.addAll(tabsManager.getTabs());\n\n        if (pagerAdapter == null || !pagerAdapter.sameTabs(tabsList)) {\n            pagerAdapter = new SelectedTabsPagerAdapter(requireContext(),\n                    getChildFragmentManager(), tabsList);\n        }\n\n        binding.pager.setAdapter(null);\n        binding.pager.setAdapter(pagerAdapter);\n\n        updateTabsIconAndDescription();\n        updateTitleForTab(binding.pager.getCurrentItem());\n\n        hasTabsChanged = false;\n    }\n\n    private void updateTabsIconAndDescription() {\n        for (int i = 0; i < tabsList.size(); i++) {\n            final TabLayout.Tab tabToSet = binding.mainTabLayout.getTabAt(i);\n            if (tabToSet != null) {\n                final Tab tab = tabsList.get(i);\n                tabToSet.setIcon(tab.getTabIconRes(requireContext()));\n                tabToSet.setContentDescription(tab.getTabName(requireContext()));\n            }\n        }\n    }\n\n    private void updateTitleForTab(final int tabPosition) {\n        setTitle(tabsList.get(tabPosition).getTabName(requireContext()));\n    }\n\n    public void commitPlaylistTabs() {\n        pagerAdapter.getLocalPlaylistFragments()\n                .stream()\n                .forEach(LocalPlaylistFragment::saveImmediate);\n    }\n\n    private void updateTabLayoutPosition() {\n        final ScrollableTabLayout tabLayout = binding.mainTabLayout;\n        final ViewPager viewPager = binding.pager;\n        final boolean bottom = mainTabsPositionBottom;\n\n        // change layout params to make the tab layout appear either at the top or at the bottom\n        final var tabParams = (RelativeLayout.LayoutParams) tabLayout.getLayoutParams();\n        final var pagerParams = (RelativeLayout.LayoutParams) viewPager.getLayoutParams();\n\n        tabParams.removeRule(bottom ? ALIGN_PARENT_TOP : ALIGN_PARENT_BOTTOM);\n        tabParams.addRule(bottom ? ALIGN_PARENT_BOTTOM : ALIGN_PARENT_TOP);\n        pagerParams.removeRule(bottom ? BELOW : ABOVE);\n        pagerParams.addRule(bottom ? ABOVE : BELOW, R.id.main_tab_layout);\n        tabLayout.setSelectedTabIndicatorGravity(\n                bottom ? INDICATOR_GRAVITY_TOP : INDICATOR_GRAVITY_BOTTOM);\n\n        tabLayout.setLayoutParams(tabParams);\n        viewPager.setLayoutParams(pagerParams);\n\n        // change the background and icon color of the tab layout:\n        // service-colored at the top, app-background-colored at the bottom\n        tabLayout.setBackgroundColor(ThemeHelper.resolveColorFromAttr(requireContext(),\n                bottom ? android.R.attr.windowBackground : R.attr.colorPrimary));\n\n        @ColorInt final int iconColor = bottom\n                ? ThemeHelper.resolveColorFromAttr(requireContext(), android.R.attr.colorAccent)\n                : Color.WHITE;\n        tabLayout.setTabRippleColor(ColorStateList.valueOf(iconColor).withAlpha(32));\n        tabLayout.setTabIconTint(ColorStateList.valueOf(iconColor));\n        tabLayout.setSelectedTabIndicatorColor(iconColor);\n    }\n\n    @Override\n    public void onTabSelected(final TabLayout.Tab selectedTab) {\n        if (DEBUG) {\n            Log.d(TAG, \"onTabSelected() called with: selectedTab = [\" + selectedTab + \"]\");\n        }\n        updateTitleForTab(selectedTab.getPosition());\n    }\n\n    @Override\n    public void onTabUnselected(final TabLayout.Tab tab) { }\n\n    @Override\n    public void onTabReselected(final TabLayout.Tab tab) {\n        if (DEBUG) {\n            Log.d(TAG, \"onTabReselected() called with: tab = [\" + tab + \"]\");\n        }\n        updateTitleForTab(tab.getPosition());\n    }\n\n    public static final class SelectedTabsPagerAdapter\n            extends FragmentStatePagerAdapterMenuWorkaround {\n        private final Context context;\n        private final List<Tab> internalTabsList;\n        /**\n         * Keep reference to LocalPlaylistFragments, because their data can be modified by the user\n         * during runtime and changes are not committed immediately. However, in some cases,\n         * the changes need to be committed immediately by calling\n         * {@link LocalPlaylistFragment#saveImmediate()}.\n         * The fragments are removed when {@link LocalPlaylistFragment#onDestroy()} is called.\n         */\n        private final List<LocalPlaylistFragment> localPlaylistFragments = new ArrayList<>();\n\n        private SelectedTabsPagerAdapter(final Context context,\n                                         final FragmentManager fragmentManager,\n                                         final List<Tab> tabsList) {\n            super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);\n            this.context = context;\n            this.internalTabsList = new ArrayList<>(tabsList);\n        }\n\n        @NonNull\n        @Override\n        public Fragment getItem(final int position) {\n            final Tab tab = internalTabsList.get(position);\n\n            final Fragment fragment;\n            try {\n                fragment = tab.getFragment(context);\n            } catch (final Throwable t) {\n                return new BlankFragment(new ErrorInfo(t, UserAction.GETTING_MAIN_SCREEN_TAB,\n                        \"Tab \" + tab.getClass().getSimpleName() + \":\" + tab.getTabName(context)));\n            }\n\n            if (fragment instanceof BaseFragment) {\n                ((BaseFragment) fragment).useAsFrontPage(true);\n            }\n\n            if (fragment instanceof LocalPlaylistFragment) {\n                localPlaylistFragments.add((LocalPlaylistFragment) fragment);\n            }\n\n            return fragment;\n        }\n\n        public List<LocalPlaylistFragment> getLocalPlaylistFragments() {\n            return localPlaylistFragments;\n        }\n\n        @Override\n        public int getItemPosition(@NonNull final Object object) {\n            // Causes adapter to reload all Fragments when\n            // notifyDataSetChanged is called\n            return POSITION_NONE;\n        }\n\n        @Override\n        public int getCount() {\n            return internalTabsList.size();\n        }\n\n        public boolean sameTabs(final List<Tab> tabsToCompare) {\n            return internalTabsList.equals(tabsToCompare);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/OnScrollBelowItemsListener.java",
    "content": "package org.schabi.newpipe.fragments;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.recyclerview.widget.StaggeredGridLayoutManager;\n\n/**\n * Recycler view scroll listener which calls the method {@link #onScrolledDown(RecyclerView)}\n * if the view is scrolled below the last item.\n */\npublic abstract class OnScrollBelowItemsListener extends RecyclerView.OnScrollListener {\n    @Override\n    public void onScrolled(@NonNull final RecyclerView recyclerView, final int dx, final int dy) {\n        super.onScrolled(recyclerView, dx, dy);\n        if (dy > 0) {\n            int pastVisibleItems = 0;\n            final RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();\n\n            final int visibleItemCount = layoutManager.getChildCount();\n            final int totalItemCount = layoutManager.getItemCount();\n\n            // Already covers the GridLayoutManager case\n            if (layoutManager instanceof LinearLayoutManager) {\n                pastVisibleItems = ((LinearLayoutManager) layoutManager)\n                        .findFirstVisibleItemPosition();\n            } else if (layoutManager instanceof StaggeredGridLayoutManager) {\n                final int[] positions = ((StaggeredGridLayoutManager) layoutManager)\n                        .findFirstVisibleItemPositions(null);\n                if (positions != null && positions.length > 0) {\n                    pastVisibleItems = positions[0];\n                }\n            }\n\n            if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {\n                onScrolledDown(recyclerView);\n            }\n        }\n    }\n\n    /**\n     * Called when the recycler view is scrolled below the last item.\n     *\n     * @param recyclerView the recycler view\n     */\n    public abstract void onScrolledDown(RecyclerView recyclerView);\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/ViewContract.java",
    "content": "package org.schabi.newpipe.fragments;\n\npublic interface ViewContract<I> {\n    void showLoading();\n\n    void hideLoading();\n\n    void showEmptyState();\n\n    void handleResult(I result);\n\n    void handleError();\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java",
    "content": "package org.schabi.newpipe.fragments.detail;\n\nimport static android.text.TextUtils.isEmpty;\nimport static org.schabi.newpipe.extractor.utils.Utils.isBlank;\nimport static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD;\n\nimport android.graphics.Typeface;\nimport android.os.Bundle;\nimport android.text.SpannableStringBuilder;\nimport android.text.Spanned;\nimport android.text.method.LinkMovementMethod;\nimport android.text.style.ClickableSpan;\nimport android.text.style.StyleSpan;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.LinearLayout;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\nimport androidx.appcompat.widget.TooltipCompat;\nimport androidx.core.text.HtmlCompat;\n\nimport com.google.android.material.chip.Chip;\n\nimport org.schabi.newpipe.BaseFragment;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.FragmentDescriptionBinding;\nimport org.schabi.newpipe.databinding.ItemMetadataBinding;\nimport org.schabi.newpipe.databinding.ItemMetadataTagsBinding;\nimport org.schabi.newpipe.extractor.Image;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.stream.Description;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\nimport org.schabi.newpipe.util.image.ImageStrategy;\nimport org.schabi.newpipe.util.text.TextLinkifier;\n\nimport java.util.List;\n\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\n\npublic abstract class BaseDescriptionFragment extends BaseFragment {\n    private final CompositeDisposable descriptionDisposables = new CompositeDisposable();\n    protected FragmentDescriptionBinding binding;\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        binding = FragmentDescriptionBinding.inflate(inflater, container, false);\n        setupDescription();\n        setupMetadata(inflater, binding.detailMetadataLayout);\n        addTagsMetadataItem(inflater, binding.detailMetadataLayout);\n        return binding.getRoot();\n    }\n\n    @Override\n    public void onDestroy() {\n        descriptionDisposables.clear();\n        super.onDestroy();\n    }\n\n    /**\n     * Get the description to display.\n     * @return description object, if available\n     */\n    @Nullable\n    protected abstract Description getDescription();\n\n    /**\n     * Get the streaming service. Used for generating description links.\n     * @return streaming service\n     */\n    @NonNull\n    protected abstract StreamingService getService();\n\n    /**\n     * Get the streaming service ID. Used for tag links.\n     * @return service ID\n     */\n    protected abstract int getServiceId();\n\n    /**\n     * Get the URL of the described video or audio, used to generate description links.\n     * @return stream URL\n     */\n    @Nullable\n    protected abstract String getStreamUrl();\n\n    /**\n     * Get the list of tags to display below the description.\n     * @return tag list\n     */\n    @NonNull\n    public abstract List<String> getTags();\n\n    /**\n     * Add additional metadata to display.\n     * @param inflater LayoutInflater\n     * @param layout detailMetadataLayout\n     */\n    protected abstract void setupMetadata(LayoutInflater inflater, LinearLayout layout);\n\n    private void setupDescription() {\n        final Description description = getDescription();\n        if (description == null || isEmpty(description.getContent())\n                || description == Description.EMPTY_DESCRIPTION) {\n            binding.detailDescriptionView.setVisibility(View.GONE);\n            binding.detailSelectDescriptionButton.setVisibility(View.GONE);\n            return;\n        }\n\n        // start with disabled state. This also loads description content (!)\n        disableDescriptionSelection();\n\n        binding.detailSelectDescriptionButton.setOnClickListener(v -> {\n            if (binding.detailDescriptionNoteView.getVisibility() == View.VISIBLE) {\n                disableDescriptionSelection();\n            } else {\n                // enable selection only when button is clicked to prevent flickering\n                enableDescriptionSelection();\n            }\n        });\n    }\n\n    private void enableDescriptionSelection() {\n        binding.detailDescriptionNoteView.setVisibility(View.VISIBLE);\n        binding.detailDescriptionView.setTextIsSelectable(true);\n\n        final String buttonLabel = getString(R.string.description_select_disable);\n        binding.detailSelectDescriptionButton.setContentDescription(buttonLabel);\n        TooltipCompat.setTooltipText(binding.detailSelectDescriptionButton, buttonLabel);\n        binding.detailSelectDescriptionButton.setImageResource(R.drawable.ic_close);\n    }\n\n    private void disableDescriptionSelection() {\n        // show description content again, otherwise some links are not clickable\n        final Description description = getDescription();\n        if (description != null) {\n            TextLinkifier.fromDescription(binding.detailDescriptionView,\n                    description, HtmlCompat.FROM_HTML_MODE_LEGACY,\n                    getService(), getStreamUrl(),\n                    descriptionDisposables, SET_LINK_MOVEMENT_METHOD);\n        }\n\n        binding.detailDescriptionNoteView.setVisibility(View.GONE);\n        binding.detailDescriptionView.setTextIsSelectable(false);\n\n        final String buttonLabel = getString(R.string.description_select_enable);\n        binding.detailSelectDescriptionButton.setContentDescription(buttonLabel);\n        TooltipCompat.setTooltipText(binding.detailSelectDescriptionButton, buttonLabel);\n        binding.detailSelectDescriptionButton.setImageResource(R.drawable.ic_select_all);\n    }\n\n    protected void addMetadataItem(final LayoutInflater inflater,\n                                   final LinearLayout layout,\n                                   final boolean linkifyContent,\n                                   @StringRes final int type,\n                                   @NonNull final String content) {\n        if (isBlank(content)) {\n            return;\n        }\n\n        final ItemMetadataBinding itemBinding =\n                ItemMetadataBinding.inflate(inflater, layout, false);\n\n        itemBinding.metadataTypeView.setText(type);\n        itemBinding.metadataTypeView.setOnLongClickListener(v -> {\n            ShareUtils.copyToClipboard(requireContext(), content);\n            return true;\n        });\n\n        if (linkifyContent) {\n            TextLinkifier.fromPlainText(itemBinding.metadataContentView, content, null, null,\n                    descriptionDisposables, SET_LINK_MOVEMENT_METHOD);\n        } else {\n            itemBinding.metadataContentView.setText(content);\n        }\n\n        itemBinding.metadataContentView.setClickable(true);\n\n        layout.addView(itemBinding.getRoot());\n    }\n\n    private String imageSizeToText(final int heightOrWidth) {\n        if (heightOrWidth < 0) {\n            return getString(R.string.question_mark);\n        } else {\n            return String.valueOf(heightOrWidth);\n        }\n    }\n\n    protected void addImagesMetadataItem(final LayoutInflater inflater,\n                                         final LinearLayout layout,\n                                         @StringRes final int type,\n                                         final List<Image> images) {\n        final String preferredImageUrl = ImageStrategy.choosePreferredImage(images);\n        if (preferredImageUrl == null) {\n            return; // null will be returned in case there is no image\n        }\n\n        final ItemMetadataBinding itemBinding =\n                ItemMetadataBinding.inflate(inflater, layout, false);\n        itemBinding.metadataTypeView.setText(type);\n\n        final SpannableStringBuilder urls = new SpannableStringBuilder();\n        for (final Image image : images) {\n            if (urls.length() != 0) {\n                urls.append(\", \");\n            }\n            final int entryBegin = urls.length();\n\n            if (image.getHeight() != Image.HEIGHT_UNKNOWN\n                    || image.getWidth() != Image.WIDTH_UNKNOWN\n                    // if even the resolution level is unknown, ?x? will be shown\n                    || image.getEstimatedResolutionLevel() == Image.ResolutionLevel.UNKNOWN) {\n                urls.append(imageSizeToText(image.getWidth()));\n                urls.append('x');\n                urls.append(imageSizeToText(image.getHeight()));\n            } else {\n                switch (image.getEstimatedResolutionLevel()) {\n                    case LOW -> urls.append(getString(R.string.image_quality_low));\n                    case MEDIUM -> urls.append(getString(R.string.image_quality_medium));\n                    case HIGH -> urls.append(getString(R.string.image_quality_high));\n                    default -> {\n                        // unreachable, Image.ResolutionLevel.UNKNOWN is already filtered out\n                    }\n                }\n            }\n\n            urls.setSpan(new ClickableSpan() {\n                @Override\n                public void onClick(@NonNull final View widget) {\n                    ShareUtils.openUrlInBrowser(requireContext(), image.getUrl());\n                }\n            }, entryBegin, urls.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);\n\n            if (preferredImageUrl.equals(image.getUrl())) {\n                urls.setSpan(new StyleSpan(Typeface.BOLD), entryBegin, urls.length(),\n                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);\n            }\n        }\n\n        itemBinding.metadataContentView.setText(urls);\n        itemBinding.metadataContentView.setMovementMethod(LinkMovementMethod.getInstance());\n        layout.addView(itemBinding.getRoot());\n    }\n\n    private void addTagsMetadataItem(final LayoutInflater inflater, final LinearLayout layout) {\n        final List<String> tags = getTags();\n\n        if (!tags.isEmpty()) {\n            final var itemBinding = ItemMetadataTagsBinding.inflate(inflater, layout, false);\n\n            tags.stream().sorted(String.CASE_INSENSITIVE_ORDER).forEach(tag -> {\n                final Chip chip = (Chip) inflater.inflate(R.layout.chip,\n                        itemBinding.metadataTagsChips, false);\n                chip.setText(tag);\n                chip.setOnClickListener(this::onTagClick);\n                chip.setOnLongClickListener(this::onTagLongClick);\n                itemBinding.metadataTagsChips.addView(chip);\n            });\n\n            layout.addView(itemBinding.getRoot());\n        }\n    }\n\n    private void onTagClick(final View chip) {\n        if (getParentFragment() != null) {\n            NavigationHelper.openSearchFragment(getParentFragment().getParentFragmentManager(),\n                    getServiceId(), ((Chip) chip).getText().toString());\n        }\n    }\n\n    private boolean onTagLongClick(final View chip) {\n        ShareUtils.copyToClipboard(requireContext(), ((Chip) chip).getText().toString());\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java",
    "content": "package org.schabi.newpipe.fragments.detail;\n\nimport static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT;\nimport static org.schabi.newpipe.util.Localization.getAppLocale;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.LinearLayout;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\n\nimport com.evernote.android.state.State;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.stream.Description;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.util.Localization;\n\nimport java.util.List;\n\npublic class DescriptionFragment extends BaseDescriptionFragment {\n\n    @State\n    StreamInfo streamInfo;\n\n    public DescriptionFragment(final StreamInfo streamInfo) {\n        this.streamInfo = streamInfo;\n    }\n\n    public DescriptionFragment() {\n        // keep empty constructor for State when resuming fragment from memory\n    }\n\n\n    @Nullable\n    @Override\n    protected Description getDescription() {\n        return streamInfo.getDescription();\n    }\n\n    @NonNull\n    @Override\n    protected StreamingService getService() {\n        return streamInfo.getService();\n    }\n\n    @Override\n    protected int getServiceId() {\n        return streamInfo.getServiceId();\n    }\n\n    @NonNull\n    @Override\n    protected String getStreamUrl() {\n        return streamInfo.getUrl();\n    }\n\n    @NonNull\n    @Override\n    public List<String> getTags() {\n        return streamInfo.getTags();\n    }\n\n    @Override\n    protected void setupMetadata(final LayoutInflater inflater,\n                                 final LinearLayout layout) {\n        if (streamInfo != null && streamInfo.getUploadDate() != null) {\n            binding.detailUploadDateView.setText(Localization\n                    .localizeUploadDate(activity, streamInfo.getUploadDate().offsetDateTime()));\n        } else {\n            binding.detailUploadDateView.setVisibility(View.GONE);\n        }\n\n        if (streamInfo == null) {\n            return;\n        }\n\n        addMetadataItem(inflater, layout, false, R.string.metadata_category,\n                streamInfo.getCategory());\n\n        addMetadataItem(inflater, layout, false, R.string.metadata_licence,\n                streamInfo.getLicence());\n\n        addPrivacyMetadataItem(inflater, layout);\n\n        if (streamInfo.getAgeLimit() != NO_AGE_LIMIT) {\n            addMetadataItem(inflater, layout, false, R.string.metadata_age_limit,\n                    String.valueOf(streamInfo.getAgeLimit()));\n        }\n\n        if (streamInfo.getLanguageInfo() != null) {\n            addMetadataItem(inflater, layout, false, R.string.metadata_language,\n                    streamInfo.getLanguageInfo().getDisplayLanguage(getAppLocale()));\n        }\n\n        addMetadataItem(inflater, layout, true, R.string.metadata_support,\n                streamInfo.getSupportInfo());\n        addMetadataItem(inflater, layout, true, R.string.metadata_host,\n                streamInfo.getHost());\n\n        addImagesMetadataItem(inflater, layout, R.string.metadata_thumbnails,\n                streamInfo.getThumbnails());\n        addImagesMetadataItem(inflater, layout, R.string.metadata_uploader_avatars,\n                streamInfo.getUploaderAvatars());\n        addImagesMetadataItem(inflater, layout, R.string.metadata_subchannel_avatars,\n                streamInfo.getSubChannelAvatars());\n    }\n\n    private void addPrivacyMetadataItem(final LayoutInflater inflater, final LinearLayout layout) {\n        if (streamInfo.getPrivacy() != null) {\n            @StringRes final int contentRes;\n            switch (streamInfo.getPrivacy()) {\n                case PUBLIC:\n                    contentRes = R.string.metadata_privacy_public;\n                    break;\n                case UNLISTED:\n                    contentRes = R.string.metadata_privacy_unlisted;\n                    break;\n                case PRIVATE:\n                    contentRes = R.string.metadata_privacy_private;\n                    break;\n                case INTERNAL:\n                    contentRes = R.string.metadata_privacy_internal;\n                    break;\n                case OTHER:\n                default:\n                    contentRes = 0;\n                    break;\n            }\n\n            if (contentRes != 0) {\n                addMetadataItem(inflater, layout, false, R.string.metadata_privacy,\n                        getString(contentRes));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/StackItem.java",
    "content": "package org.schabi.newpipe.fragments.detail;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\n\nimport java.io.Serializable;\n\nclass StackItem implements Serializable {\n    private final int serviceId;\n    private String url;\n    private String title;\n    private PlayQueue playQueue;\n\n    StackItem(final int serviceId, final String url,\n              final String title, final PlayQueue playQueue) {\n        this.serviceId = serviceId;\n        this.url = url;\n        this.title = title;\n        this.playQueue = playQueue;\n    }\n\n    public void setUrl(final String url) {\n        this.url = url;\n    }\n\n    public void setPlayQueue(final PlayQueue queue) {\n        this.playQueue = queue;\n    }\n\n    public int getServiceId() {\n        return serviceId;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(final String title) {\n        this.title = title;\n    }\n\n    public String getUrl() {\n        return url;\n    }\n\n    public PlayQueue getPlayQueue() {\n        return playQueue;\n    }\n\n    @NonNull\n    @Override\n    public String toString() {\n        return getServiceId() + \":\" + getUrl() + \" > \" + getTitle();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/TabAdapter.java",
    "content": "package org.schabi.newpipe.fragments.detail;\n\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.fragment.app.FragmentPagerAdapter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class TabAdapter extends FragmentPagerAdapter {\n    private final List<Fragment> mFragmentList = new ArrayList<>();\n    private final List<String> mFragmentTitleList = new ArrayList<>();\n    private final FragmentManager fragmentManager;\n\n    public TabAdapter(final FragmentManager fm) {\n        // if changed to BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT => crash if enqueueing stream in\n        // the background and then clicking on it to open VideoDetailFragment:\n        // \"Cannot setMaxLifecycle for Fragment not attached to FragmentManager\"\n        super(fm, BEHAVIOR_SET_USER_VISIBLE_HINT);\n        this.fragmentManager = fm;\n    }\n\n    @NonNull\n    @Override\n    public Fragment getItem(final int position) {\n        return mFragmentList.get(position);\n    }\n\n    @Override\n    public int getCount() {\n        return mFragmentList.size();\n    }\n\n    public void addFragment(final Fragment fragment, final String title) {\n        mFragmentList.add(fragment);\n        mFragmentTitleList.add(title);\n    }\n\n    public void clearAllItems() {\n        mFragmentList.clear();\n        mFragmentTitleList.clear();\n    }\n\n    public void removeItem(final int position) {\n        mFragmentList.remove(position == 0 ? 0 : position - 1);\n        mFragmentTitleList.remove(position == 0 ? 0 : position - 1);\n    }\n\n    public void updateItem(final int position, final Fragment fragment) {\n        mFragmentList.set(position, fragment);\n    }\n\n    public void updateItem(final String title, final Fragment fragment) {\n        final int index = mFragmentTitleList.indexOf(title);\n        if (index != -1) {\n            updateItem(index, fragment);\n        }\n    }\n\n    @Override\n    public int getItemPosition(@NonNull final Object object) {\n        if (mFragmentList.contains(object)) {\n            return mFragmentList.indexOf(object);\n        } else {\n            return POSITION_NONE;\n        }\n    }\n\n    public int getItemPositionByTitle(final String title) {\n        return mFragmentTitleList.indexOf(title);\n    }\n\n    @Nullable\n    public String getItemTitle(final int position) {\n        if (position < 0 || position >= mFragmentTitleList.size()) {\n            return null;\n        }\n        return mFragmentTitleList.get(position);\n    }\n\n    public void notifyDataSetUpdate() {\n        notifyDataSetChanged();\n    }\n\n    @Override\n    public void destroyItem(@NonNull final ViewGroup container,\n                            final int position,\n                            @NonNull final Object object) {\n        fragmentManager.beginTransaction().remove((Fragment) object).commitNowAllowingStateLoss();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java",
    "content": "package org.schabi.newpipe.fragments.detail;\n\nimport static android.text.TextUtils.isEmpty;\nimport static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.COMMENTS;\nimport static org.schabi.newpipe.extractor.stream.StreamExtractor.NO_AGE_LIMIT;\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\nimport static org.schabi.newpipe.ktx.ViewUtils.animateRotation;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.globalScreenOrientationLocked;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.isClearingQueueConfirmationRequired;\nimport static org.schabi.newpipe.util.DependentPreferenceHelper.getResumePlaybackEnabled;\nimport static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView;\nimport static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams;\nimport static org.schabi.newpipe.util.NavigationHelper.openPlayQueue;\n\nimport android.animation.ValueAnimator;\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.SharedPreferences;\nimport android.content.pm.ActivityInfo;\nimport android.database.ContentObserver;\nimport android.graphics.Color;\nimport android.graphics.Rect;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.provider.Settings;\nimport android.util.DisplayMetrics;\nimport android.util.Log;\nimport android.util.TypedValue;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.ViewTreeObserver;\nimport android.view.WindowManager;\nimport android.view.animation.DecelerateInterpolator;\nimport android.widget.FrameLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.Toast;\n\nimport androidx.annotation.AttrRes;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.appcompat.content.res.AppCompatResources;\nimport androidx.appcompat.widget.Toolbar;\nimport androidx.coordinatorlayout.widget.CoordinatorLayout;\nimport androidx.core.content.ContextCompat;\nimport androidx.fragment.app.Fragment;\nimport androidx.preference.PreferenceManager;\n\nimport com.evernote.android.state.State;\nimport com.google.android.exoplayer2.PlaybackException;\nimport com.google.android.exoplayer2.PlaybackParameters;\nimport com.google.android.material.appbar.AppBarLayout;\nimport com.google.android.material.bottomsheet.BottomSheetBehavior;\nimport com.google.android.material.tabs.TabLayout;\n\nimport org.schabi.newpipe.App;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.databinding.FragmentVideoDetailBinding;\nimport org.schabi.newpipe.download.DownloadDialog;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.ReCaptchaActivity;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.Image;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.comments.CommentsInfoItem;\nimport org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.Stream;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamType;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\nimport org.schabi.newpipe.fragments.BackPressable;\nimport org.schabi.newpipe.fragments.BaseStateFragment;\nimport org.schabi.newpipe.fragments.EmptyFragment;\nimport org.schabi.newpipe.fragments.MainFragment;\nimport org.schabi.newpipe.fragments.list.comments.CommentsFragment;\nimport org.schabi.newpipe.fragments.list.videos.RelatedItemsFragment;\nimport org.schabi.newpipe.ktx.AnimationType;\nimport org.schabi.newpipe.local.dialog.PlaylistDialog;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.local.playlist.LocalPlaylistFragment;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.PlayerIntentType;\nimport org.schabi.newpipe.player.PlayerService;\nimport org.schabi.newpipe.player.PlayerType;\nimport org.schabi.newpipe.player.event.OnKeyDownListener;\nimport org.schabi.newpipe.player.event.PlayerServiceExtendedEventListener;\nimport org.schabi.newpipe.player.helper.PlayerHelper;\nimport org.schabi.newpipe.player.helper.PlayerHolder;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.player.playqueue.SinglePlayQueue;\nimport org.schabi.newpipe.player.ui.MainPlayerUi;\nimport org.schabi.newpipe.player.ui.VideoPlayerUi;\nimport org.schabi.newpipe.util.Constants;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.ExtractorHelper;\nimport org.schabi.newpipe.util.InfoCache;\nimport org.schabi.newpipe.util.ListHelper;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.PermissionHelper;\nimport org.schabi.newpipe.util.PlayButtonHelper;\nimport org.schabi.newpipe.util.StreamTypeUtil;\nimport org.schabi.newpipe.util.ThemeHelper;\nimport org.schabi.newpipe.util.external_communication.KoreUtils;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\nimport org.schabi.newpipe.util.image.CoilHelper;\n\nimport java.util.ArrayList;\nimport java.util.Iterator;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Optional;\nimport java.util.concurrent.TimeUnit;\nimport java.util.function.Consumer;\n\nimport coil3.util.CoilUtils;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic final class VideoDetailFragment\n        extends BaseStateFragment<StreamInfo>\n        implements BackPressable,\n        PlayerServiceExtendedEventListener,\n        OnKeyDownListener {\n    public static final String KEY_SWITCHING_PLAYERS = \"switching_players\";\n\n    private static final float MAX_OVERLAY_ALPHA = 0.9f;\n    private static final float MAX_PLAYER_HEIGHT = 0.7f;\n\n    public static final String ACTION_SHOW_MAIN_PLAYER =\n            App.PACKAGE_NAME + \".VideoDetailFragment.ACTION_SHOW_MAIN_PLAYER\";\n    public static final String ACTION_HIDE_MAIN_PLAYER =\n            App.PACKAGE_NAME + \".VideoDetailFragment.ACTION_HIDE_MAIN_PLAYER\";\n    public static final String ACTION_PLAYER_STARTED =\n            App.PACKAGE_NAME + \".VideoDetailFragment.ACTION_PLAYER_STARTED\";\n    public static final String ACTION_VIDEO_FRAGMENT_RESUMED =\n            App.PACKAGE_NAME + \".VideoDetailFragment.ACTION_VIDEO_FRAGMENT_RESUMED\";\n    public static final String ACTION_VIDEO_FRAGMENT_STOPPED =\n            App.PACKAGE_NAME + \".VideoDetailFragment.ACTION_VIDEO_FRAGMENT_STOPPED\";\n\n    private static final String COMMENTS_TAB_TAG = \"COMMENTS\";\n    private static final String RELATED_TAB_TAG = \"NEXT VIDEO\";\n    private static final String DESCRIPTION_TAB_TAG = \"DESCRIPTION TAB\";\n    private static final String EMPTY_TAB_TAG = \"EMPTY TAB\";\n\n    // tabs\n    private boolean showComments;\n    private boolean showRelatedItems;\n    private boolean showDescription;\n    private String selectedTabTag;\n    @AttrRes\n    @NonNull\n    final List<Integer> tabIcons = new ArrayList<>();\n    @StringRes\n    @NonNull\n    final List<Integer> tabContentDescriptions = new ArrayList<>();\n    private boolean tabSettingsChanged = false;\n    private int lastAppBarVerticalOffset = Integer.MAX_VALUE; // prevents useless updates\n\n    private final SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener =\n            (sharedPreferences, key) -> {\n                if (getString(R.string.show_comments_key).equals(key)) {\n                    showComments = sharedPreferences.getBoolean(key, true);\n                    tabSettingsChanged = true;\n                } else if (getString(R.string.show_next_video_key).equals(key)) {\n                    showRelatedItems = sharedPreferences.getBoolean(key, true);\n                    tabSettingsChanged = true;\n                } else if (getString(R.string.show_description_key).equals(key)) {\n                    showDescription = sharedPreferences.getBoolean(key, true);\n                    tabSettingsChanged = true;\n                }\n            };\n\n    @State\n    protected int serviceId = Constants.NO_SERVICE_ID;\n    @State\n    @NonNull\n    protected String title = \"\";\n    @State\n    @Nullable\n    protected String url = null;\n    @Nullable\n    protected PlayQueue playQueue = null;\n    @State\n    int bottomSheetState = BottomSheetBehavior.STATE_EXPANDED;\n    @State\n    int lastStableBottomSheetState = BottomSheetBehavior.STATE_EXPANDED;\n    @State\n    protected boolean autoPlayEnabled = true;\n\n    @Nullable\n    private StreamInfo currentInfo = null;\n    private Disposable currentWorker;\n    @NonNull\n    private final CompositeDisposable disposables = new CompositeDisposable();\n    @Nullable\n    private Disposable positionSubscriber = null;\n\n    private BottomSheetBehavior<FrameLayout> bottomSheetBehavior;\n    private BottomSheetBehavior.BottomSheetCallback bottomSheetCallback;\n    private BroadcastReceiver broadcastReceiver;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Views\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private FragmentVideoDetailBinding binding;\n\n    private TabAdapter pageAdapter;\n\n    private ContentObserver settingsContentObserver;\n    @Nullable\n    private PlayerService playerService;\n    private Player player;\n    private final PlayerHolder playerHolder = PlayerHolder.getInstance();\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Service management\n    //////////////////////////////////////////////////////////////////////////*/\n    @Override\n    public void onServiceConnected(@NonNull final PlayerService connectedPlayerService) {\n        playerService = connectedPlayerService;\n    }\n\n    @Override\n    public void onPlayerConnected(@NonNull final Player connectedPlayer,\n                                  final boolean playAfterConnect) {\n        player = connectedPlayer;\n\n        // It will do nothing if the player is not in fullscreen mode\n        hideSystemUiIfNeeded();\n\n        final Optional<MainPlayerUi> playerUi = player.UIs().get(MainPlayerUi.class);\n        if (!player.videoPlayerSelected() && !playAfterConnect) {\n            return;\n        }\n\n        if (DeviceUtils.isLandscape(requireContext())) {\n            // If the video is playing but orientation changed\n            // let's make the video in fullscreen again\n            checkLandscape();\n        } else if (playerUi.map(ui -> ui.isFullscreen() && !ui.isVerticalVideo()).orElse(false)\n                // Tablet UI has orientation-independent fullscreen\n                && !DeviceUtils.isTablet(activity)) {\n            // Device is in portrait orientation after rotation but UI is in fullscreen.\n            // Return back to non-fullscreen state\n            playerUi.ifPresent(MainPlayerUi::toggleFullscreen);\n        }\n\n        if (playAfterConnect\n                || (currentInfo != null\n                && isAutoplayEnabled()\n                && playerUi.isEmpty())) {\n            autoPlayEnabled = true; // forcefully start playing\n            openVideoPlayerAutoFullscreen();\n        }\n        updateOverlayPlayQueueButtonVisibility();\n    }\n\n    @Override\n    public void onPlayerDisconnected() {\n        player = null;\n        // the binding could be null at this point, if the app is finishing\n        if (binding != null) {\n            restoreDefaultBrightness();\n        }\n    }\n\n    @Override\n    public void onServiceDisconnected() {\n        playerService = null;\n    }\n\n\n    /*////////////////////////////////////////////////////////////////////////*/\n\n    public static VideoDetailFragment getInstance(final int serviceId,\n                                                  @Nullable final String url,\n                                                  @NonNull final String name,\n                                                  @Nullable final PlayQueue queue) {\n        final VideoDetailFragment instance = new VideoDetailFragment();\n        instance.setInitialData(serviceId, url, name, queue);\n        return instance;\n    }\n\n    public static VideoDetailFragment getInstanceInCollapsedState() {\n        final VideoDetailFragment instance = new VideoDetailFragment();\n        instance.updateBottomSheetState(BottomSheetBehavior.STATE_COLLAPSED);\n        return instance;\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Fragment's Lifecycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);\n        showComments = prefs.getBoolean(getString(R.string.show_comments_key), true);\n        showRelatedItems = prefs.getBoolean(getString(R.string.show_next_video_key), true);\n        showDescription = prefs.getBoolean(getString(R.string.show_description_key), true);\n        selectedTabTag = prefs.getString(\n                getString(R.string.stream_info_selected_tab_key), COMMENTS_TAB_TAG);\n        prefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener);\n\n        setupBroadcastReceiver();\n\n        settingsContentObserver = new ContentObserver(new Handler()) {\n            @Override\n            public void onChange(final boolean selfChange) {\n                if (activity != null && !globalScreenOrientationLocked(activity)) {\n                    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);\n                }\n            }\n        };\n        activity.getContentResolver().registerContentObserver(\n                Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION), false,\n                settingsContentObserver);\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        binding = FragmentVideoDetailBinding.inflate(inflater, container, false);\n        return binding.getRoot();\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        if (currentWorker != null) {\n            currentWorker.dispose();\n        }\n        restoreDefaultBrightness();\n        PreferenceManager.getDefaultSharedPreferences(requireContext())\n                .edit()\n                .putString(getString(R.string.stream_info_selected_tab_key),\n                        pageAdapter.getItemTitle(binding.viewPager.getCurrentItem()))\n                .apply();\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        if (DEBUG) {\n            Log.d(TAG, \"onResume() called\");\n        }\n\n        activity.sendBroadcast(new Intent(ACTION_VIDEO_FRAGMENT_RESUMED));\n\n        updateOverlayPlayQueueButtonVisibility();\n\n        setupBrightness();\n\n        if (tabSettingsChanged) {\n            tabSettingsChanged = false;\n            initTabs();\n            if (currentInfo != null) {\n                updateTabs(currentInfo);\n            }\n        }\n\n        // Check if it was loading when the fragment was stopped/paused\n        if (wasLoading.getAndSet(false) && !wasCleared()) {\n            startLoading(false);\n        }\n    }\n\n    @Override\n    public void onStop() {\n        super.onStop();\n\n        if (!activity.isChangingConfigurations()) {\n            activity.sendBroadcast(new Intent(ACTION_VIDEO_FRAGMENT_STOPPED));\n        }\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n\n        // Stop the service when user leaves the app with double back press\n        // if video player is selected. Otherwise unbind\n        if (activity.isFinishing() && isPlayerAvailable() && player.videoPlayerSelected()) {\n            playerHolder.stopService();\n        } else {\n            playerHolder.setListener(null);\n        }\n\n        PreferenceManager.getDefaultSharedPreferences(activity)\n                .unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);\n        activity.unregisterReceiver(broadcastReceiver);\n        activity.getContentResolver().unregisterContentObserver(settingsContentObserver);\n\n        if (positionSubscriber != null) {\n            positionSubscriber.dispose();\n        }\n        if (currentWorker != null) {\n            currentWorker.dispose();\n        }\n        disposables.clear();\n        positionSubscriber = null;\n        currentWorker = null;\n        bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallback);\n\n        if (activity.isFinishing()) {\n            playQueue = null;\n            currentInfo = null;\n            stack = new LinkedList<>();\n        }\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        binding = null;\n    }\n\n    @Override\n    public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        switch (requestCode) {\n            case ReCaptchaActivity.RECAPTCHA_REQUEST:\n                if (resultCode == Activity.RESULT_OK) {\n                    NavigationHelper.openVideoDetailFragment(requireContext(), getFM(),\n                            serviceId, url, title, null, false);\n                } else {\n                    Log.e(TAG, \"ReCaptcha failed\");\n                }\n                break;\n            default:\n                Log.e(TAG, \"Request code from activity not supported [\" + requestCode + \"]\");\n                break;\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // OnClick\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void setOnClickListeners() {\n        binding.detailTitleRootLayout.setOnClickListener(v -> toggleTitleAndSecondaryControls());\n        binding.detailUploaderRootLayout.setOnClickListener(makeOnClickListener(info -> {\n            if (isEmpty(info.getSubChannelUrl())) {\n                if (!isEmpty(info.getUploaderUrl())) {\n                    openChannel(info.getUploaderUrl(), info.getUploaderName());\n                }\n\n                if (DEBUG) {\n                    Log.i(TAG, \"Can't open sub-channel because we got no channel URL\");\n                }\n            } else {\n                openChannel(info.getSubChannelUrl(), info.getSubChannelName());\n            }\n        }));\n        binding.detailThumbnailRootLayout.setOnClickListener(v -> {\n            autoPlayEnabled = true; // forcefully start playing\n            // FIXME Workaround #7427\n            if (isPlayerAvailable()) {\n                player.setRecovery();\n            }\n            openVideoPlayerAutoFullscreen();\n        });\n\n        binding.detailControlsBackground.setOnClickListener(v -> openBackgroundPlayer(false));\n        binding.detailControlsPopup.setOnClickListener(v -> openPopupPlayer(false));\n        binding.detailControlsPlaylistAppend.setOnClickListener(makeOnClickListener(info -> {\n            if (getFM() != null && currentInfo != null) {\n                final Fragment fragment = getParentFragmentManager().\n                        findFragmentById(R.id.fragment_holder);\n\n                // commit previous pending changes to database\n                if (fragment instanceof LocalPlaylistFragment) {\n                    ((LocalPlaylistFragment) fragment).saveImmediate();\n                } else if (fragment instanceof MainFragment) {\n                    ((MainFragment) fragment).commitPlaylistTabs();\n                }\n\n                disposables.add(PlaylistDialog.createCorrespondingDialog(requireContext(),\n                        List.of(new StreamEntity(info)),\n                        dialog -> dialog.show(getParentFragmentManager(), TAG)));\n            }\n        }));\n        binding.detailControlsDownload.setOnClickListener(v -> {\n            if (PermissionHelper.checkStoragePermissions(activity,\n                    PermissionHelper.DOWNLOAD_DIALOG_REQUEST_CODE)) {\n                openDownloadDialog();\n            }\n        });\n        binding.detailControlsShare.setOnClickListener(makeOnClickListener(info ->\n                ShareUtils.shareText(requireContext(), info.getName(), info.getUrl(),\n                        info.getThumbnails())));\n        binding.detailControlsOpenInBrowser.setOnClickListener(makeOnClickListener(info ->\n                ShareUtils.openUrlInBrowser(requireContext(), info.getUrl())));\n        binding.detailControlsPlayWithKodi.setOnClickListener(makeOnClickListener(info ->\n                KoreUtils.playWithKore(requireContext(), Uri.parse(info.getUrl()))));\n        if (DEBUG) {\n            binding.detailControlsCrashThePlayer.setOnClickListener(v ->\n                    VideoDetailPlayerCrasher.onCrashThePlayer(requireContext(), player));\n        }\n\n        final View.OnClickListener overlayListener = v -> bottomSheetBehavior\n                .setState(BottomSheetBehavior.STATE_EXPANDED);\n        binding.overlayThumbnail.setOnClickListener(overlayListener);\n        binding.overlayMetadataLayout.setOnClickListener(overlayListener);\n        binding.overlayButtonsLayout.setOnClickListener(overlayListener);\n        binding.overlayCloseButton.setOnClickListener(v -> bottomSheetBehavior\n                .setState(BottomSheetBehavior.STATE_HIDDEN));\n        binding.overlayPlayQueueButton.setOnClickListener(v -> openPlayQueue(requireContext()));\n        binding.overlayPlayPauseButton.setOnClickListener(v -> {\n            if (playerIsNotStopped()) {\n                player.playPause();\n                player.UIs().get(VideoPlayerUi.class).ifPresent(ui -> ui.hideControls(0, 0));\n                showSystemUi();\n            } else {\n                autoPlayEnabled = true; // forcefully start playing\n                openVideoPlayer(false);\n            }\n\n            setOverlayPlayPauseImage(isPlayerAvailable() && player.isPlaying());\n        });\n    }\n\n    private View.OnClickListener makeOnClickListener(final Consumer<StreamInfo> consumer) {\n        return v -> {\n            if (!isLoading.get() && currentInfo != null) {\n                consumer.accept(currentInfo);\n            }\n        };\n    }\n\n    private void setOnLongClickListeners() {\n        binding.detailTitleRootLayout.setOnLongClickListener(makeOnLongClickListener(info ->\n                ShareUtils.copyToClipboard(requireContext(),\n                        binding.detailVideoTitleView.getText().toString())));\n        binding.detailUploaderRootLayout.setOnLongClickListener(makeOnLongClickListener(info -> {\n            if (isEmpty(info.getSubChannelUrl())) {\n                Log.w(TAG, \"Can't open parent channel because we got no parent channel URL\");\n            } else {\n                openChannel(info.getUploaderUrl(), info.getUploaderName());\n            }\n        }));\n\n        binding.detailControlsBackground.setOnLongClickListener(makeOnLongClickListener(info ->\n            openBackgroundPlayer(true)\n        ));\n        binding.detailControlsPopup.setOnLongClickListener(makeOnLongClickListener(info ->\n            openPopupPlayer(true)\n        ));\n        binding.detailControlsDownload.setOnLongClickListener(makeOnLongClickListener(info ->\n                NavigationHelper.openDownloads(activity)));\n\n        final View.OnLongClickListener overlayListener = makeOnLongClickListener(info ->\n                openChannel(info.getUploaderUrl(), info.getUploaderName()));\n        binding.overlayThumbnail.setOnLongClickListener(overlayListener);\n        binding.overlayMetadataLayout.setOnLongClickListener(overlayListener);\n    }\n\n    private View.OnLongClickListener makeOnLongClickListener(final Consumer<StreamInfo> consumer) {\n        return v -> {\n            if (isLoading.get() || currentInfo == null) {\n                return false;\n            }\n            consumer.accept(currentInfo);\n            return true;\n        };\n    }\n\n    private void openChannel(final String subChannelUrl, final String subChannelName) {\n        try {\n            NavigationHelper.openChannelFragment(getFM(), currentInfo.getServiceId(),\n                    subChannelUrl, subChannelName);\n        } catch (final Exception e) {\n            ErrorUtil.showUiErrorSnackbar(this, \"Opening channel fragment\", e);\n        }\n    }\n\n    private void toggleTitleAndSecondaryControls() {\n        if (binding.detailSecondaryControlPanel.getVisibility() == View.GONE) {\n            binding.detailVideoTitleView.setMaxLines(10);\n            animateRotation(binding.detailToggleSecondaryControlsView,\n                    VideoPlayerUi.DEFAULT_CONTROLS_DURATION, 180);\n            binding.detailSecondaryControlPanel.setVisibility(View.VISIBLE);\n        } else {\n            binding.detailVideoTitleView.setMaxLines(1);\n            animateRotation(binding.detailToggleSecondaryControlsView,\n                    VideoPlayerUi.DEFAULT_CONTROLS_DURATION, 0);\n            binding.detailSecondaryControlPanel.setVisibility(View.GONE);\n        }\n        // view pager height has changed, update the tab layout\n        updateTabLayoutVisibility();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override // called from onViewCreated in {@link BaseFragment#onViewCreated}\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n\n        pageAdapter = new TabAdapter(getChildFragmentManager());\n        binding.viewPager.setAdapter(pageAdapter);\n        binding.tabLayout.setupWithViewPager(binding.viewPager);\n\n        binding.detailThumbnailRootLayout.requestFocus();\n\n        binding.detailControlsPlayWithKodi.setVisibility(\n                KoreUtils.shouldShowPlayWithKodi(requireContext(), serviceId)\n                        ? View.VISIBLE\n                        : View.GONE\n        );\n        binding.detailControlsCrashThePlayer.setVisibility(\n                DEBUG && PreferenceManager.getDefaultSharedPreferences(getContext())\n                        .getBoolean(getString(R.string.show_crash_the_player_key), false)\n                        ? View.VISIBLE\n                        : View.GONE\n        );\n        accommodateForTvAndDesktopMode();\n    }\n\n    @Override\n    @SuppressLint(\"ClickableViewAccessibility\")\n    protected void initListeners() {\n        super.initListeners();\n\n        // Workaround for #5600\n        // Forcefully catch click events uncaught by children because otherwise\n        // they will be caught by underlying view and \"click through\" will happen\n        binding.getRoot().setOnClickListener(v -> { });\n        binding.getRoot().setOnLongClickListener(v -> true);\n\n        setOnClickListeners();\n        setOnLongClickListeners();\n\n        final View.OnTouchListener controlsTouchListener = (view, motionEvent) -> {\n            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN\n                    && PlayButtonHelper.shouldShowHoldToAppendTip(activity)) {\n\n                animate(binding.touchAppendDetail, true, 250, AnimationType.ALPHA, 0, () ->\n                        animate(binding.touchAppendDetail, false, 1500, AnimationType.ALPHA, 1000));\n            }\n            return false;\n        };\n        binding.detailControlsBackground.setOnTouchListener(controlsTouchListener);\n        binding.detailControlsPopup.setOnTouchListener(controlsTouchListener);\n\n        binding.appBarLayout.addOnOffsetChangedListener((layout, verticalOffset) -> {\n            // prevent useless updates to tab layout visibility if nothing changed\n            if (verticalOffset != lastAppBarVerticalOffset) {\n                lastAppBarVerticalOffset = verticalOffset;\n                // the view was scrolled\n                updateTabLayoutVisibility();\n            }\n        });\n\n        setupBottomPlayer();\n        if (!playerHolder.isBound()) {\n            setHeightThumbnail();\n        } else {\n            playerHolder.startService(false, this);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // OwnStack\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * Stack that contains the \"navigation history\".<br>\n     * The peek is the current video.\n     */\n    private static LinkedList<StackItem> stack = new LinkedList<>();\n\n    @Override\n    public boolean onKeyDown(final int keyCode) {\n        return isPlayerAvailable()\n                && player.UIs().get(VideoPlayerUi.class)\n                .map(playerUi -> playerUi.onKeyDown(keyCode)).orElse(false);\n    }\n\n    @Override\n    public boolean onBackPressed() {\n        if (DEBUG) {\n            Log.d(TAG, \"onBackPressed() called\");\n        }\n\n        // If we are in fullscreen mode just exit from it via first back press\n        if (isFullscreen()) {\n            if (!DeviceUtils.isTablet(activity)) {\n                player.pause();\n            }\n            restoreDefaultOrientation();\n            setAutoPlay(false);\n            return true;\n        }\n\n        // If we have something in history of played items we replay it here\n        if (isPlayerAvailable()\n                && player.getPlayQueue() != null\n                && player.videoPlayerSelected()\n                && player.getPlayQueue().previous()) {\n            return true; // no code here, as previous() was used in the if\n        }\n\n        // That means that we are on the start of the stack,\n        if (stack.size() <= 1) {\n            restoreDefaultOrientation();\n            return false; // let MainActivity handle the onBack (e.g. to minimize the mini player)\n        }\n\n        // Remove top\n        stack.pop();\n        // Get stack item from the new top\n        setupFromHistoryItem(Objects.requireNonNull(stack.peek()));\n\n        return true;\n    }\n\n    private void setupFromHistoryItem(final StackItem item) {\n        setAutoPlay(false);\n        hideMainPlayerOnLoadingNewStream();\n\n        setInitialData(item.getServiceId(), item.getUrl(),\n                item.getTitle() == null ? \"\" : item.getTitle(), item.getPlayQueue());\n        startLoading(false);\n\n        // Maybe an item was deleted in background activity\n        if (item.getPlayQueue().getItem() == null) {\n            return;\n        }\n\n        final PlayQueueItem playQueueItem = item.getPlayQueue().getItem();\n        // Update title, url, uploader from the last item in the stack (it's current now)\n        final boolean isPlayerStopped = !isPlayerAvailable() || player.isStopped();\n        if (playQueueItem != null && isPlayerStopped) {\n            updateOverlayData(playQueueItem.getTitle(),\n                    playQueueItem.getUploader(), playQueueItem.getThumbnails());\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Info loading and handling\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected void doInitialLoadLogic() {\n        if (wasCleared()) {\n            return;\n        }\n\n        if (currentInfo == null) {\n            prepareAndLoadInfo();\n        } else {\n            prepareAndHandleInfoIfNeededAfterDelay(currentInfo, false, 50);\n        }\n    }\n\n    public void selectAndLoadVideo(final int newServiceId,\n                                   @Nullable final String newUrl,\n                                   @NonNull final String newTitle,\n                                   @Nullable final PlayQueue newQueue) {\n        if (isPlayerAvailable() && newQueue != null && playQueue != null\n                && playQueue.getItem() != null && !playQueue.getItem().getUrl().equals(newUrl)) {\n            // Preloading can be disabled since playback is surely being replaced.\n            player.disablePreloadingOfCurrentTrack();\n        }\n\n        setInitialData(newServiceId, newUrl, newTitle, newQueue);\n        startLoading(false, true);\n    }\n\n    private void prepareAndHandleInfoIfNeededAfterDelay(final StreamInfo info,\n                                                        final boolean scrollToTop,\n                                                        final long delay) {\n        new Handler(Looper.getMainLooper()).postDelayed(() -> {\n            if (activity == null) {\n                return;\n            }\n            // Data can already be drawn, don't spend time twice\n            if (info.getName().equals(binding.detailVideoTitleView.getText().toString())) {\n                return;\n            }\n            prepareAndHandleInfo(info, scrollToTop);\n        }, delay);\n    }\n\n    private void prepareAndHandleInfo(final StreamInfo info, final boolean scrollToTop) {\n        if (DEBUG) {\n            Log.d(TAG, \"prepareAndHandleInfo() called with: \"\n                    + \"info = [\" + info + \"], scrollToTop = [\" + scrollToTop + \"]\");\n        }\n\n        showLoading();\n        initTabs();\n\n        if (scrollToTop) {\n            scrollToTop();\n        }\n        handleResult(info);\n        showContent();\n\n    }\n\n    protected void prepareAndLoadInfo() {\n        scrollToTop();\n        startLoading(false);\n    }\n\n    @Override\n    public void startLoading(final boolean forceLoad) {\n        super.startLoading(forceLoad);\n\n        initTabs();\n        currentInfo = null;\n        if (currentWorker != null) {\n            currentWorker.dispose();\n        }\n\n        runWorker(forceLoad, stack.isEmpty());\n    }\n\n    private void startLoading(final boolean forceLoad, final boolean addToBackStack) {\n        super.startLoading(forceLoad);\n\n        initTabs();\n        currentInfo = null;\n        if (currentWorker != null) {\n            currentWorker.dispose();\n        }\n\n        runWorker(forceLoad, addToBackStack);\n    }\n\n    private void runWorker(final boolean forceLoad, final boolean addToBackStack) {\n        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);\n        currentWorker = ExtractorHelper.getStreamInfo(serviceId, url, forceLoad)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(result -> {\n                    isLoading.set(false);\n                    hideMainPlayerOnLoadingNewStream();\n                    if (result.getAgeLimit() != NO_AGE_LIMIT && !prefs.getBoolean(\n                            getString(R.string.show_age_restricted_content), false)) {\n                        hideAgeRestrictedContent();\n                    } else {\n                        handleResult(result);\n                        showContent();\n                        if (addToBackStack) {\n                            if (playQueue == null) {\n                                playQueue = new SinglePlayQueue(result);\n                            }\n                            if (stack.isEmpty() || !stack.peek().getPlayQueue()\n                                    .equalStreams(playQueue)) {\n                                stack.push(new StackItem(serviceId, url, title, playQueue));\n                            }\n                        }\n\n                        if (isAutoplayEnabled()) {\n                            openVideoPlayerAutoFullscreen();\n                        }\n                    }\n                }, throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_STREAM,\n                        url == null ? \"no url\" : url, serviceId, url)));\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Tabs\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void initTabs() {\n        if (pageAdapter.getCount() != 0) {\n            selectedTabTag = pageAdapter.getItemTitle(binding.viewPager.getCurrentItem());\n        }\n        pageAdapter.clearAllItems();\n        tabIcons.clear();\n        tabContentDescriptions.clear();\n\n        if (shouldShowComments()) {\n            pageAdapter.addFragment(\n                    CommentsFragment.getInstance(serviceId, url, title), COMMENTS_TAB_TAG);\n            tabIcons.add(R.drawable.ic_comment);\n            tabContentDescriptions.add(R.string.comments_tab_description);\n        }\n\n        if (showRelatedItems && binding.relatedItemsLayout == null) {\n            // temp empty fragment. will be updated in handleResult\n            pageAdapter.addFragment(EmptyFragment.newInstance(false), RELATED_TAB_TAG);\n            tabIcons.add(R.drawable.ic_art_track);\n            tabContentDescriptions.add(R.string.related_items_tab_description);\n        }\n\n        if (showDescription) {\n            // temp empty fragment. will be updated in handleResult\n            pageAdapter.addFragment(EmptyFragment.newInstance(false), DESCRIPTION_TAB_TAG);\n            tabIcons.add(R.drawable.ic_description);\n            tabContentDescriptions.add(R.string.description_tab_description);\n        }\n\n        if (pageAdapter.getCount() == 0) {\n            pageAdapter.addFragment(EmptyFragment.newInstance(true), EMPTY_TAB_TAG);\n        }\n        pageAdapter.notifyDataSetUpdate();\n\n        if (pageAdapter.getCount() >= 2) {\n            final int position = pageAdapter.getItemPositionByTitle(selectedTabTag);\n            if (position != -1) {\n                binding.viewPager.setCurrentItem(position);\n            }\n            updateTabIconsAndContentDescriptions();\n        }\n        // the page adapter now contains tabs: show the tab layout\n        updateTabLayoutVisibility();\n    }\n\n    /**\n     * To be called whenever {@link #pageAdapter} is modified, since that triggers a refresh in\n     * {@link FragmentVideoDetailBinding#tabLayout} resetting all tab's icons and content\n     * descriptions. This reads icons from {@link #tabIcons} and content descriptions from\n     * {@link #tabContentDescriptions}, which are all set in {@link #initTabs()}.\n     */\n    private void updateTabIconsAndContentDescriptions() {\n        for (int i = 0; i < tabIcons.size(); ++i) {\n            final TabLayout.Tab tab = binding.tabLayout.getTabAt(i);\n            if (tab != null) {\n                tab.setIcon(tabIcons.get(i));\n                tab.setContentDescription(tabContentDescriptions.get(i));\n            }\n        }\n    }\n\n    private void updateTabs(@NonNull final StreamInfo info) {\n        if (showRelatedItems) {\n            if (binding.relatedItemsLayout == null) { // phone\n                pageAdapter.updateItem(RELATED_TAB_TAG, RelatedItemsFragment.getInstance(info));\n            } else { // tablet + TV\n                getChildFragmentManager().beginTransaction()\n                        .replace(R.id.relatedItemsLayout, RelatedItemsFragment.getInstance(info))\n                        .commitAllowingStateLoss();\n                binding.relatedItemsLayout.setVisibility(isFullscreen() ? View.GONE : View.VISIBLE);\n            }\n        }\n\n        if (showDescription) {\n            pageAdapter.updateItem(DESCRIPTION_TAB_TAG, new DescriptionFragment(info));\n        }\n\n        binding.viewPager.setVisibility(View.VISIBLE);\n        // make sure the tab layout is visible\n        updateTabLayoutVisibility();\n        pageAdapter.notifyDataSetUpdate();\n        updateTabIconsAndContentDescriptions();\n    }\n\n    private boolean shouldShowComments() {\n        try {\n            return showComments && NewPipe.getService(serviceId)\n                    .getServiceInfo()\n                    .getMediaCapabilities()\n                    .contains(COMMENTS);\n        } catch (final ExtractionException e) {\n            return false;\n        }\n    }\n\n    public void updateTabLayoutVisibility() {\n\n        if (binding == null) {\n            //If binding is null we do not need to and should not do anything with its object(s)\n            return;\n        }\n\n        if (pageAdapter.getCount() < 2 || binding.viewPager.getVisibility() != View.VISIBLE) {\n            // hide tab layout if there is only one tab or if the view pager is also hidden\n            binding.tabLayout.setVisibility(View.GONE);\n        } else {\n            // call `post()` to be sure `viewPager.getHitRect()`\n            // is up to date and not being currently recomputed\n            binding.tabLayout.post(() -> {\n                final var activity = getActivity();\n                if (activity != null) {\n                    final Rect pagerHitRect = new Rect();\n                    binding.viewPager.getHitRect(pagerHitRect);\n\n                    final int height = DeviceUtils.getWindowHeight(activity.getWindowManager());\n                    final int viewPagerVisibleHeight = height - pagerHitRect.top;\n                    // see TabLayout.DEFAULT_HEIGHT, which is equal to 48dp\n                    final float tabLayoutHeight = TypedValue.applyDimension(\n                            TypedValue.COMPLEX_UNIT_DIP, 48, getResources().getDisplayMetrics());\n\n                    if (viewPagerVisibleHeight > tabLayoutHeight * 2) {\n                        // no translation at all when viewPagerVisibleHeight > tabLayout.height * 3\n                        binding.tabLayout.setTranslationY(\n                                Math.max(0, tabLayoutHeight * 3 - viewPagerVisibleHeight));\n                        binding.tabLayout.setVisibility(View.VISIBLE);\n                    } else {\n                        // view pager is not visible enough\n                        binding.tabLayout.setVisibility(View.GONE);\n                    }\n                }\n            });\n        }\n    }\n\n    public void scrollToTop() {\n        binding.appBarLayout.setExpanded(true, true);\n        // notify tab layout of scrolling\n        updateTabLayoutVisibility();\n    }\n\n    public void scrollToComment(final CommentsInfoItem comment) {\n        final int commentsTabPos = pageAdapter.getItemPositionByTitle(COMMENTS_TAB_TAG);\n        final Fragment fragment = pageAdapter.getItem(commentsTabPos);\n        if (!(fragment instanceof CommentsFragment)) {\n            return;\n        }\n\n        // unexpand the app bar only if scrolling to the comment succeeded\n        if (((CommentsFragment) fragment).scrollToComment(comment)) {\n            binding.appBarLayout.setExpanded(false, false);\n            binding.viewPager.setCurrentItem(commentsTabPos, false);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Play Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void toggleFullscreenIfInFullscreenMode() {\n        // If a user watched video inside fullscreen mode and than chose another player\n        // return to non-fullscreen mode\n        if (isPlayerAvailable()) {\n            player.UIs().get(MainPlayerUi.class).ifPresent(playerUi -> {\n                if (playerUi.isFullscreen()) {\n                    playerUi.toggleFullscreen();\n                }\n            });\n        }\n    }\n\n    private void openBackgroundPlayer(final boolean append) {\n        final boolean useExternalAudioPlayer = PreferenceManager\n                .getDefaultSharedPreferences(activity)\n                .getBoolean(activity.getString(R.string.use_external_audio_player_key), false);\n\n        toggleFullscreenIfInFullscreenMode();\n\n        if (isPlayerAvailable()) {\n            // FIXME Workaround #7427\n            player.setRecovery();\n        }\n\n        if (useExternalAudioPlayer) {\n            showExternalAudioPlaybackDialog();\n        } else {\n            openNormalBackgroundPlayer(append);\n        }\n    }\n\n    private void openPopupPlayer(final boolean append) {\n        if (!PermissionHelper.isPopupEnabledElseAsk(activity)) {\n            return;\n        }\n\n        // See UI changes while remote playQueue changes\n        if (!isPlayerAvailable()) {\n            playerHolder.startService(false, this);\n        } else {\n            // FIXME Workaround #7427\n            player.setRecovery();\n        }\n\n        toggleFullscreenIfInFullscreenMode();\n\n        final PlayQueue queue = setupPlayQueueForIntent(append);\n        if (append) { //resumePlayback: false\n            NavigationHelper.enqueueOnPlayer(activity, queue, PlayerType.POPUP);\n        } else {\n            replaceQueueIfUserConfirms(() -> NavigationHelper\n                    .playOnPopupPlayer(activity, queue, true));\n        }\n    }\n\n    /**\n     * Opens the video player, in fullscreen if needed. In order to open fullscreen, the activity\n     * is toggled to landscape orientation (which will then cause fullscreen mode).\n     *\n     * @param directlyFullscreenIfApplicable whether to open fullscreen if we are not already\n     *                                       in landscape and screen orientation is locked\n     */\n    public void openVideoPlayer(final boolean directlyFullscreenIfApplicable) {\n        if (directlyFullscreenIfApplicable\n                && !DeviceUtils.isLandscape(requireContext())\n                && PlayerHelper.globalScreenOrientationLocked(requireContext())) {\n            // Make sure the bottom sheet turns out expanded. When this code kicks in the bottom\n            // sheet could not have fully expanded yet, and thus be in the STATE_SETTLING state.\n            // When the activity is rotated, and its state is saved and then restored, the bottom\n            // sheet would forget what it was doing, since even if STATE_SETTLING is restored, it\n            // doesn't tell which state it was settling to, and thus the bottom sheet settles to\n            // STATE_COLLAPSED. This can be solved by manually setting the state that will be\n            // restored (i.e. bottomSheetState) to STATE_EXPANDED.\n            updateBottomSheetState(BottomSheetBehavior.STATE_EXPANDED);\n            // toggle landscape in order to open directly in fullscreen\n            onScreenRotationButtonClicked();\n        }\n\n        if (PreferenceManager.getDefaultSharedPreferences(activity)\n                .getBoolean(this.getString(R.string.use_external_video_player_key), false)) {\n            showExternalVideoPlaybackDialog();\n        } else {\n            replaceQueueIfUserConfirms(this::openMainPlayer);\n        }\n    }\n\n    /**\n     * If the option to start directly fullscreen is enabled, calls\n     * {@link #openVideoPlayer(boolean)} with {@code directlyFullscreenIfApplicable = true}, so that\n     * if the user is not already in landscape and he has screen orientation locked the activity\n     * rotates and fullscreen starts. Otherwise, if the option to start directly fullscreen is\n     * disabled, calls {@link #openVideoPlayer(boolean)} with {@code directlyFullscreenIfApplicable\n     * = false}, hence preventing it from going directly fullscreen.\n     */\n    public void openVideoPlayerAutoFullscreen() {\n        openVideoPlayer(PlayerHelper.isStartMainPlayerFullscreenEnabled(requireContext()));\n    }\n\n    private void openNormalBackgroundPlayer(final boolean append) {\n        // See UI changes while remote playQueue changes\n        if (!isPlayerAvailable()) {\n            playerHolder.startService(false, this);\n        }\n\n        final PlayQueue queue = setupPlayQueueForIntent(append);\n        if (append) {\n            NavigationHelper.enqueueOnPlayer(activity, queue, PlayerType.AUDIO);\n        } else {\n            replaceQueueIfUserConfirms(() -> NavigationHelper\n                    .playOnBackgroundPlayer(activity, queue, true));\n        }\n    }\n\n    private void openMainPlayer() {\n        if (!isPlayerServiceAvailable()) {\n            playerHolder.startService(autoPlayEnabled, this);\n            return;\n        }\n        if (currentInfo == null) {\n            return;\n        }\n\n        final PlayQueue queue = setupPlayQueueForIntent(false);\n        tryAddVideoPlayerView();\n\n        final Context context = requireContext();\n        final Intent playerIntent =\n                NavigationHelper.getPlayerIntent(context, PlayerService.class, queue,\n                                PlayerIntentType.AllOthers)\n                        .putExtra(Player.PLAY_WHEN_READY, autoPlayEnabled)\n                        .putExtra(Player.RESUME_PLAYBACK, true);\n        ContextCompat.startForegroundService(activity, playerIntent);\n    }\n\n    /**\n     * When the video detail fragment is already showing details for a video and the user opens a\n     * new one, the video detail fragment changes all of its old data to the new stream, so if there\n     * is a video player currently open it should be hidden. This method does exactly that. If\n     * autoplay is enabled, the underlying player is not stopped completely, since it is going to\n     * be reused in a few milliseconds and the flickering would be annoying.\n     */\n    private void hideMainPlayerOnLoadingNewStream() {\n        final var root = getRoot();\n        if (!isPlayerServiceAvailable() || root.isEmpty() || !player.videoPlayerSelected()) {\n            return;\n        }\n\n        removeVideoPlayerView();\n        if (isAutoplayEnabled()) {\n            playerService.stopForImmediateReusing();\n            root.ifPresent(view -> view.setVisibility(View.GONE));\n        } else {\n            playerHolder.stopService();\n        }\n    }\n\n    private PlayQueue setupPlayQueueForIntent(final boolean append) {\n        if (append) {\n            return new SinglePlayQueue(currentInfo);\n        }\n\n        PlayQueue queue = playQueue;\n        // Size can be 0 because queue removes bad stream automatically when error occurs\n        if (queue == null || queue.isEmpty()) {\n            queue = new SinglePlayQueue(currentInfo);\n        }\n\n        return queue;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public void setAutoPlay(final boolean autoPlay) {\n        this.autoPlayEnabled = autoPlay;\n    }\n\n    private void startOnExternalPlayer(@NonNull final Context context,\n                                       @NonNull final StreamInfo info,\n                                       @NonNull final Stream selectedStream) {\n        NavigationHelper.playOnExternalPlayer(context, currentInfo.getName(),\n                currentInfo.getSubChannelName(), selectedStream);\n\n        final HistoryRecordManager recordManager = new HistoryRecordManager(requireContext());\n        disposables.add(recordManager.onViewed(info).onErrorComplete()\n                .subscribe(\n                        ignored -> { /* successful */ },\n                        error -> showSnackBarError(\n                                new ErrorInfo(\n                                        error,\n                                        UserAction.PLAY_STREAM,\n                                        \"Got an error when modifying history on viewed\"\n                                )\n                        )\n                ));\n    }\n\n    private boolean isExternalPlayerEnabled() {\n        return PreferenceManager.getDefaultSharedPreferences(requireContext())\n                .getBoolean(getString(R.string.use_external_video_player_key), false);\n    }\n\n    // This method overrides default behaviour when setAutoPlay() is called.\n    // Don't auto play if the user selected an external player or disabled it in settings\n    private boolean isAutoplayEnabled() {\n        return autoPlayEnabled\n                && !isExternalPlayerEnabled()\n                && (!isPlayerAvailable() || player.videoPlayerSelected())\n                && bottomSheetState != BottomSheetBehavior.STATE_HIDDEN\n                && PlayerHelper.isAutoplayAllowedByUser(requireContext());\n    }\n\n    private void tryAddVideoPlayerView() {\n        if (isPlayerAvailable() && getView() != null) {\n            // Setup the surface view height, so that it fits the video correctly; this is done also\n            // here, and not only in the Handler, to avoid a choppy fullscreen rotation animation.\n            setHeightThumbnail();\n        }\n\n        // do all the null checks in the posted lambda, too, since the player, the binding and the\n        // view could be set or unset before the lambda gets executed on the next main thread cycle\n        new Handler(Looper.getMainLooper()).post(() -> {\n            if (!isPlayerAvailable() || getView() == null) {\n                return;\n            }\n\n            // setup the surface view height, so that it fits the video correctly\n            setHeightThumbnail();\n\n            player.UIs().get(MainPlayerUi.class).ifPresent(playerUi -> {\n                // sometimes binding would be null here, even though getView() != null above u.u\n                if (binding != null) {\n                    // prevent from re-adding a view multiple times\n                    playerUi.removeViewFromParent();\n                    binding.playerPlaceholder.addView(playerUi.getBinding().getRoot());\n                    playerUi.setupVideoSurfaceIfNeeded();\n                }\n            });\n        });\n    }\n\n    private void removeVideoPlayerView() {\n        makeDefaultHeightForVideoPlaceholder();\n\n        if (player != null) {\n            player.UIs().get(VideoPlayerUi.class).ifPresent(VideoPlayerUi::removeViewFromParent);\n        }\n    }\n\n    private void makeDefaultHeightForVideoPlaceholder() {\n        if (getView() == null) {\n            return;\n        }\n\n        binding.playerPlaceholder.getLayoutParams().height = FrameLayout.LayoutParams.MATCH_PARENT;\n        binding.playerPlaceholder.requestLayout();\n    }\n\n    private final ViewTreeObserver.OnPreDrawListener preDrawListener =\n            new ViewTreeObserver.OnPreDrawListener() {\n                @Override\n                public boolean onPreDraw() {\n                    final DisplayMetrics metrics = getResources().getDisplayMetrics();\n\n                    if (getView() != null) {\n                        final int height = (DeviceUtils.isInMultiWindow(activity)\n                                ? requireView()\n                                : activity.getWindow().getDecorView()).getHeight();\n                        setHeightThumbnail(height, metrics);\n                        getView().getViewTreeObserver().removeOnPreDrawListener(preDrawListener);\n                    }\n                    return false;\n                }\n            };\n\n    /**\n     * Method which controls the size of thumbnail and the size of main player inside\n     * a layout with thumbnail. It decides what height the player should have in both\n     * screen orientations. It knows about multiWindow feature\n     * and about videos with aspectRatio ZOOM (the height for them will be a bit higher,\n     * {@link #MAX_PLAYER_HEIGHT})\n     */\n    private void setHeightThumbnail() {\n        final DisplayMetrics metrics = getResources().getDisplayMetrics();\n        final boolean isPortrait = metrics.heightPixels > metrics.widthPixels;\n        requireView().getViewTreeObserver().removeOnPreDrawListener(preDrawListener);\n\n        if (isFullscreen()) {\n            final int height = (DeviceUtils.isInMultiWindow(activity)\n                    ? requireView()\n                    : activity.getWindow().getDecorView()).getHeight();\n            // Height is zero when the view is not yet displayed like after orientation change\n            if (height != 0) {\n                setHeightThumbnail(height, metrics);\n            } else {\n                requireView().getViewTreeObserver().addOnPreDrawListener(preDrawListener);\n            }\n        } else {\n            final int height = (int) (isPortrait\n                    ? metrics.widthPixels / (16.0f / 9.0f)\n                    : metrics.heightPixels / 2.0f);\n            setHeightThumbnail(height, metrics);\n        }\n    }\n\n    private void setHeightThumbnail(final int newHeight, final DisplayMetrics metrics) {\n        binding.detailThumbnailImageView.setLayoutParams(\n                new FrameLayout.LayoutParams(\n                        RelativeLayout.LayoutParams.MATCH_PARENT, newHeight));\n        binding.detailThumbnailImageView.setMinimumHeight(newHeight);\n        if (isPlayerAvailable()) {\n            final int maxHeight = (int) (metrics.heightPixels * MAX_PLAYER_HEIGHT);\n            player.UIs().get(VideoPlayerUi.class).ifPresent(ui ->\n                    ui.getBinding().surfaceView.setHeights(newHeight,\n                            ui.isFullscreen() ? newHeight : maxHeight));\n        }\n    }\n\n    private void showContent() {\n        binding.detailContentRootHiding.setVisibility(View.VISIBLE);\n    }\n\n    protected void setInitialData(final int newServiceId,\n                                  @Nullable final String newUrl,\n                                  @NonNull final String newTitle,\n                                  @Nullable final PlayQueue newPlayQueue) {\n        this.serviceId = newServiceId;\n        this.url = newUrl;\n        this.title = newTitle;\n        this.playQueue = newPlayQueue;\n    }\n\n    private void setErrorImage(final int imageResource) {\n        if (binding == null || activity == null) {\n            return;\n        }\n\n        binding.detailThumbnailImageView.setImageDrawable(\n                AppCompatResources.getDrawable(requireContext(), imageResource));\n        animate(binding.detailThumbnailImageView, false, 0, AnimationType.ALPHA,\n                0, () -> animate(binding.detailThumbnailImageView, true, 500));\n    }\n\n    @Override\n    public void handleError() {\n        super.handleError();\n        setErrorImage(R.drawable.not_available_monkey);\n\n        if (binding.relatedItemsLayout != null) { // hide related streams for tablets\n            binding.relatedItemsLayout.setVisibility(View.INVISIBLE);\n        }\n\n        // hide comments / related streams / description tabs\n        binding.viewPager.setVisibility(View.GONE);\n        binding.tabLayout.setVisibility(View.GONE);\n    }\n\n    private void hideAgeRestrictedContent() {\n        showTextError(getString(R.string.restricted_video,\n                getString(R.string.show_age_restricted_content_title)));\n    }\n\n    private void setupBroadcastReceiver() {\n        broadcastReceiver = new BroadcastReceiver() {\n            @Override\n            public void onReceive(final Context context, final Intent intent) {\n                switch (intent.getAction()) {\n                    case ACTION_SHOW_MAIN_PLAYER:\n                        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);\n                        break;\n                    case ACTION_HIDE_MAIN_PLAYER:\n                        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);\n                        break;\n                    case ACTION_PLAYER_STARTED:\n                        // If the state is not hidden we don't need to show the mini player\n                        if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN) {\n                            bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);\n                        }\n                        // Rebound to the service if it was closed via notification or mini player\n                        if (!playerHolder.isBound()) {\n                            playerHolder.startService(\n                                    false, VideoDetailFragment.this);\n                        }\n                        break;\n                }\n            }\n        };\n        final IntentFilter intentFilter = new IntentFilter();\n        intentFilter.addAction(ACTION_SHOW_MAIN_PLAYER);\n        intentFilter.addAction(ACTION_HIDE_MAIN_PLAYER);\n        intentFilter.addAction(ACTION_PLAYER_STARTED);\n        ContextCompat.registerReceiver(activity, broadcastReceiver, intentFilter,\n                ContextCompat.RECEIVER_EXPORTED);\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Orientation listener\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void restoreDefaultOrientation() {\n        if (isPlayerAvailable() && player.videoPlayerSelected()) {\n            toggleFullscreenIfInFullscreenMode();\n        }\n\n        // This will show systemUI and pause the player.\n        // User can tap on Play button and video will be in fullscreen mode again\n        // Note for tablet: trying to avoid orientation changes since it's not easy\n        // to physically rotate the tablet every time\n        if (activity != null && !DeviceUtils.isTablet(activity)) {\n            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Contract\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void showLoading() {\n\n        super.showLoading();\n\n        //if data is already cached, transition from VISIBLE -> INVISIBLE -> VISIBLE is not required\n        if (!ExtractorHelper.isCached(serviceId, url, InfoCache.Type.STREAM)) {\n            binding.detailContentRootHiding.setVisibility(View.INVISIBLE);\n        }\n\n        animate(binding.detailThumbnailPlayButton, false, 50);\n        animate(binding.detailDurationView, false, 100);\n        binding.detailPositionView.setVisibility(View.GONE);\n        binding.positionView.setVisibility(View.GONE);\n\n        binding.detailVideoTitleView.setText(title);\n        binding.detailVideoTitleView.setMaxLines(1);\n        animate(binding.detailVideoTitleView, true, 0);\n\n        binding.detailToggleSecondaryControlsView.setVisibility(View.GONE);\n        binding.detailTitleRootLayout.setClickable(false);\n        binding.detailSecondaryControlPanel.setVisibility(View.GONE);\n\n        if (binding.relatedItemsLayout != null) {\n            if (showRelatedItems) {\n                binding.relatedItemsLayout.setVisibility(\n                        isFullscreen() ? View.GONE : View.INVISIBLE);\n            } else {\n                binding.relatedItemsLayout.setVisibility(View.GONE);\n            }\n        }\n\n        CoilUtils.dispose(binding.detailThumbnailImageView);\n        CoilUtils.dispose(binding.detailSubChannelThumbnailView);\n        CoilUtils.dispose(binding.overlayThumbnail);\n        CoilUtils.dispose(binding.detailUploaderThumbnailView);\n        binding.detailThumbnailImageView.setImageBitmap(null);\n        binding.detailSubChannelThumbnailView.setImageBitmap(null);\n    }\n\n    @Override\n    public void handleResult(@NonNull final StreamInfo info) {\n        super.handleResult(info);\n\n        currentInfo = info;\n        setInitialData(info.getServiceId(), info.getOriginalUrl(), info.getName(), playQueue);\n\n        updateTabs(info);\n\n        animate(binding.detailThumbnailPlayButton, true, 200);\n        binding.detailVideoTitleView.setText(title);\n\n        binding.detailSubChannelThumbnailView.setVisibility(View.GONE);\n\n        if (!isEmpty(info.getSubChannelName())) {\n            displayBothUploaderAndSubChannel(info);\n        } else {\n            displayUploaderAsSubChannel(info);\n        }\n\n        if (info.getViewCount() >= 0) {\n            if (info.getStreamType().equals(StreamType.AUDIO_LIVE_STREAM)) {\n                binding.detailViewCountView.setText(Localization.listeningCount(activity,\n                        info.getViewCount()));\n            } else if (info.getStreamType().equals(StreamType.LIVE_STREAM)) {\n                binding.detailViewCountView.setText(Localization\n                        .localizeWatchingCount(activity, info.getViewCount()));\n            } else {\n                binding.detailViewCountView.setText(Localization\n                        .localizeViewCount(activity, info.getViewCount()));\n            }\n            binding.detailViewCountView.setVisibility(View.VISIBLE);\n        } else {\n            binding.detailViewCountView.setVisibility(View.GONE);\n        }\n\n        if (info.getDislikeCount() == -1 && info.getLikeCount() == -1) {\n            binding.detailThumbsDownImgView.setVisibility(View.VISIBLE);\n            binding.detailThumbsUpImgView.setVisibility(View.VISIBLE);\n            binding.detailThumbsUpCountView.setVisibility(View.GONE);\n            binding.detailThumbsDownCountView.setVisibility(View.GONE);\n\n            binding.detailThumbsDisabledView.setVisibility(View.VISIBLE);\n        } else {\n            if (info.getDislikeCount() >= 0) {\n                binding.detailThumbsDownCountView.setText(Localization\n                        .shortCount(activity, info.getDislikeCount()));\n                binding.detailThumbsDownCountView.setVisibility(View.VISIBLE);\n                binding.detailThumbsDownImgView.setVisibility(View.VISIBLE);\n            } else {\n                binding.detailThumbsDownCountView.setVisibility(View.GONE);\n                binding.detailThumbsDownImgView.setVisibility(View.GONE);\n            }\n\n            if (info.getLikeCount() >= 0) {\n                binding.detailThumbsUpCountView.setText(Localization.shortCount(activity,\n                        info.getLikeCount()));\n                binding.detailThumbsUpCountView.setVisibility(View.VISIBLE);\n                binding.detailThumbsUpImgView.setVisibility(View.VISIBLE);\n            } else {\n                binding.detailThumbsUpCountView.setVisibility(View.GONE);\n                binding.detailThumbsUpImgView.setVisibility(View.GONE);\n            }\n            binding.detailThumbsDisabledView.setVisibility(View.GONE);\n        }\n\n        if (info.getDuration() > 0) {\n            binding.detailDurationView.setText(Localization.getDurationString(info.getDuration()));\n            binding.detailDurationView.setBackgroundColor(\n                    ContextCompat.getColor(activity, R.color.duration_background_color));\n            animate(binding.detailDurationView, true, 100);\n        } else if (info.getStreamType() == StreamType.LIVE_STREAM) {\n            binding.detailDurationView.setText(R.string.duration_live);\n            binding.detailDurationView.setBackgroundColor(\n                    ContextCompat.getColor(activity, R.color.live_duration_background_color));\n            animate(binding.detailDurationView, true, 100);\n        } else {\n            binding.detailDurationView.setVisibility(View.GONE);\n        }\n\n        binding.detailTitleRootLayout.setClickable(true);\n        binding.detailToggleSecondaryControlsView.setRotation(0);\n        binding.detailToggleSecondaryControlsView.setVisibility(View.VISIBLE);\n        binding.detailSecondaryControlPanel.setVisibility(View.GONE);\n\n        checkUpdateProgressInfo(info);\n        CoilHelper.INSTANCE.loadDetailsThumbnail(binding.detailThumbnailImageView,\n                info.getThumbnails());\n        showMetaInfoInTextView(info.getMetaInfo(), binding.detailMetaInfoTextView,\n                binding.detailMetaInfoSeparator, disposables);\n\n        if (!isPlayerAvailable() || player.isStopped()) {\n            updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnails());\n        }\n\n        if (!info.getErrors().isEmpty()) {\n            // Bandcamp fan pages are not yet supported and thus a ContentNotAvailableException is\n            // thrown. This is not an error and thus should not be shown to the user.\n            for (final Throwable throwable : info.getErrors()) {\n                if (throwable instanceof ContentNotSupportedException\n                        && \"Fan pages are not supported\".equals(throwable.getMessage())) {\n                    info.getErrors().remove(throwable);\n                }\n            }\n\n            if (!info.getErrors().isEmpty()) {\n                showSnackBarError(new ErrorInfo(info.getErrors(), UserAction.REQUESTED_STREAM,\n                        \"Some info not extracted: \" + info.getUrl(), info));\n            }\n        }\n\n        binding.detailControlsDownload.setVisibility(\n                StreamTypeUtil.isLiveStream(info.getStreamType()) ? View.GONE : View.VISIBLE);\n        binding.detailControlsBackground.setVisibility(\n                info.getAudioStreams().isEmpty() && info.getVideoStreams().isEmpty()\n                        ? View.GONE : View.VISIBLE);\n\n        final boolean noVideoStreams =\n                info.getVideoStreams().isEmpty() && info.getVideoOnlyStreams().isEmpty();\n        binding.detailControlsPopup.setVisibility(noVideoStreams ? View.GONE : View.VISIBLE);\n        binding.detailThumbnailPlayButton.setImageResource(\n                noVideoStreams ? R.drawable.ic_headset_shadow : R.drawable.ic_play_arrow_shadow);\n    }\n\n    private void displayUploaderAsSubChannel(final StreamInfo info) {\n        binding.detailSubChannelTextView.setText(info.getUploaderName());\n        binding.detailSubChannelTextView.setVisibility(View.VISIBLE);\n        binding.detailSubChannelTextView.setSelected(true);\n\n        if (info.getUploaderSubscriberCount() > -1) {\n            binding.detailUploaderTextView.setText(\n                    Localization.shortSubscriberCount(activity, info.getUploaderSubscriberCount()));\n            binding.detailUploaderTextView.setVisibility(View.VISIBLE);\n        } else {\n            binding.detailUploaderTextView.setVisibility(View.GONE);\n        }\n\n        CoilHelper.INSTANCE.loadAvatar(binding.detailSubChannelThumbnailView,\n                info.getUploaderAvatars());\n        binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE);\n        binding.detailUploaderThumbnailView.setVisibility(View.GONE);\n    }\n\n    private void displayBothUploaderAndSubChannel(final StreamInfo info) {\n        binding.detailSubChannelTextView.setText(info.getSubChannelName());\n        binding.detailSubChannelTextView.setVisibility(View.VISIBLE);\n        binding.detailSubChannelTextView.setSelected(true);\n\n        final StringBuilder subText = new StringBuilder();\n        if (!isEmpty(info.getUploaderName())) {\n            subText.append(\n                    String.format(getString(R.string.video_detail_by), info.getUploaderName()));\n        }\n        if (info.getUploaderSubscriberCount() > -1) {\n            if (subText.length() > 0) {\n                subText.append(Localization.DOT_SEPARATOR);\n            }\n            subText.append(\n                    Localization.shortSubscriberCount(activity, info.getUploaderSubscriberCount()));\n        }\n\n        if (subText.length() > 0) {\n            binding.detailUploaderTextView.setText(subText);\n            binding.detailUploaderTextView.setVisibility(View.VISIBLE);\n            binding.detailUploaderTextView.setSelected(true);\n        } else {\n            binding.detailUploaderTextView.setVisibility(View.GONE);\n        }\n\n        CoilHelper.INSTANCE.loadAvatar(binding.detailSubChannelThumbnailView,\n                info.getSubChannelAvatars());\n        binding.detailSubChannelThumbnailView.setVisibility(View.VISIBLE);\n        CoilHelper.INSTANCE.loadAvatar(binding.detailUploaderThumbnailView,\n                info.getUploaderAvatars());\n        binding.detailUploaderThumbnailView.setVisibility(View.VISIBLE);\n    }\n\n    public void openDownloadDialog() {\n        if (currentInfo == null) {\n            return;\n        }\n\n        try {\n            final DownloadDialog downloadDialog = new DownloadDialog(activity, currentInfo);\n            downloadDialog.show(activity.getSupportFragmentManager(), \"downloadDialog\");\n        } catch (final Exception e) {\n            ErrorUtil.showSnackbar(activity, new ErrorInfo(e, UserAction.DOWNLOAD_OPEN_DIALOG,\n                    \"Showing download dialog\", currentInfo));\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Stream Results\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void checkUpdateProgressInfo(@NonNull final StreamInfo info) {\n        if (positionSubscriber != null) {\n            positionSubscriber.dispose();\n        }\n        if (!getResumePlaybackEnabled(activity)) {\n            binding.positionView.setVisibility(View.GONE);\n            binding.detailPositionView.setVisibility(View.GONE);\n            return;\n        }\n        final HistoryRecordManager recordManager = new HistoryRecordManager(requireContext());\n        positionSubscriber = recordManager.loadStreamState(info)\n                .subscribeOn(Schedulers.io())\n                .onErrorComplete()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(state -> {\n                    updatePlaybackProgress(\n                            state.getProgressMillis(), info.getDuration() * 1000);\n                }, e -> {\n                    // impossible since the onErrorComplete()\n                }, () -> {\n                    binding.positionView.setVisibility(View.GONE);\n                    binding.detailPositionView.setVisibility(View.GONE);\n                });\n    }\n\n    private void updatePlaybackProgress(final long progress, final long duration) {\n        if (!getResumePlaybackEnabled(activity)) {\n            return;\n        }\n        final int progressSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(progress);\n        final int durationSeconds = (int) TimeUnit.MILLISECONDS.toSeconds(duration);\n        // If the old and the new progress values have a big difference then use animation.\n        // Otherwise don't because it affects CPU\n        final int progressDifference = Math.abs(binding.positionView.getProgress()\n                - progressSeconds);\n        binding.positionView.setMax(durationSeconds);\n        if (progressDifference > 2) {\n            binding.positionView.setProgressAnimated(progressSeconds);\n        } else {\n            binding.positionView.setProgress(progressSeconds);\n        }\n        final String position = Localization.getDurationString(progressSeconds);\n        if (position != binding.detailPositionView.getText()) {\n            binding.detailPositionView.setText(position);\n        }\n        if (binding.positionView.getVisibility() != View.VISIBLE) {\n            animate(binding.positionView, true, 100);\n            animate(binding.detailPositionView, true, 100);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Player event listener\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onViewCreated() {\n        tryAddVideoPlayerView();\n    }\n\n    @Override\n    public void onQueueUpdate(final PlayQueue queue) {\n        playQueue = queue;\n        if (DEBUG) {\n            Log.d(TAG, \"onQueueUpdate() called with: serviceId = [\"\n                    + serviceId + \"], url = [\" + url + \"], name = [\"\n                    + title + \"], playQueue = [\" + playQueue + \"]\");\n        }\n\n        // Register broadcast receiver to listen to playQueue changes\n        // and hide the overlayPlayQueueButton when the playQueue is empty / destroyed.\n        if (playQueue != null && playQueue.getBroadcastReceiver() != null) {\n            playQueue.getBroadcastReceiver().subscribe(\n                    event -> updateOverlayPlayQueueButtonVisibility()\n            );\n        }\n\n        // This should be the only place where we push data to stack.\n        // It will allow to have live instance of PlayQueue with actual information about\n        // deleted/added items inside Channel/Playlist queue and makes possible to have\n        // a history of played items\n        @Nullable final StackItem stackPeek = stack.peek();\n        if (stackPeek != null && !stackPeek.getPlayQueue().equalStreams(queue)) {\n            @Nullable final PlayQueueItem playQueueItem = queue.getItem();\n            if (playQueueItem != null) {\n                stack.push(new StackItem(playQueueItem.getServiceId(), playQueueItem.getUrl(),\n                        playQueueItem.getTitle(), queue));\n                return;\n            } // else continue below\n        }\n\n        @Nullable final StackItem stackWithQueue = findQueueInStack(queue);\n        if (stackWithQueue != null) {\n            // On every MainPlayer service's destroy() playQueue gets disposed and\n            // no longer able to track progress. That's why we update our cached disposed\n            // queue with the new one that is active and have the same history.\n            // Without that the cached playQueue will have an old recovery position\n            stackWithQueue.setPlayQueue(queue);\n        }\n    }\n\n    @Override\n    public void onPlaybackUpdate(final int state,\n                                 final int repeatMode,\n                                 final boolean shuffled,\n                                 final PlaybackParameters parameters) {\n        setOverlayPlayPauseImage(player != null && player.isPlaying());\n\n        switch (state) {\n            case Player.STATE_PLAYING:\n                if (binding.positionView.getAlpha() != 1.0f\n                        && player.getPlayQueue() != null\n                        && player.getPlayQueue().getItem() != null\n                        && player.getPlayQueue().getItem().getUrl().equals(url)) {\n                    animate(binding.positionView, true, 100);\n                    animate(binding.detailPositionView, true, 100);\n                }\n                break;\n        }\n    }\n\n    @Override\n    public void onProgressUpdate(final int currentProgress,\n                                 final int duration,\n                                 final int bufferPercent) {\n        // Progress updates every second even if media is paused. It's useless until playing\n        if (!player.isPlaying() || playQueue == null) {\n            return;\n        }\n\n        if (player.getPlayQueue().getItem().getUrl().equals(url)) {\n            updatePlaybackProgress(currentProgress, duration);\n        }\n    }\n\n    @Override\n    public void onMetadataUpdate(final StreamInfo info, final PlayQueue queue) {\n        final StackItem item = findQueueInStack(queue);\n        if (item != null) {\n            // When PlayQueue can have multiple streams (PlaylistPlayQueue or ChannelPlayQueue)\n            // every new played stream gives new title and url.\n            // StackItem contains information about first played stream. Let's update it here\n            item.setTitle(info.getName());\n            item.setUrl(info.getUrl());\n        }\n        // They are not equal when user watches something in popup while browsing in fragment and\n        // then changes screen orientation. In that case the fragment will set itself as\n        // a service listener and will receive initial call to onMetadataUpdate()\n        if (!queue.equalStreams(playQueue)) {\n            return;\n        }\n\n        updateOverlayData(info.getName(), info.getUploaderName(), info.getThumbnails());\n        if (currentInfo != null && info.getUrl().equals(currentInfo.getUrl())) {\n            return;\n        }\n\n        currentInfo = info;\n        setInitialData(info.getServiceId(), info.getUrl(), info.getName(), queue);\n        setAutoPlay(false);\n        // Delay execution just because it freezes the main thread, and while playing\n        // next/previous video you see visual glitches\n        // (when non-vertical video goes after vertical video)\n        prepareAndHandleInfoIfNeededAfterDelay(info, true, 200);\n    }\n\n    @Override\n    public void onPlayerError(final PlaybackException error, final boolean isCatchableException) {\n        if (!isCatchableException) {\n            // Properly exit from fullscreen\n            toggleFullscreenIfInFullscreenMode();\n            hideMainPlayerOnLoadingNewStream();\n        }\n    }\n\n    @Override\n    public void onServiceStopped() {\n        // the binding could be null at this point, if the app is finishing\n        if (binding != null) {\n            setOverlayPlayPauseImage(false);\n            if (currentInfo != null) {\n                updateOverlayData(currentInfo.getName(),\n                        currentInfo.getUploaderName(),\n                        currentInfo.getThumbnails());\n            }\n            updateOverlayPlayQueueButtonVisibility();\n        }\n    }\n\n    @Override\n    public void onFullscreenStateChanged(final boolean fullscreen) {\n        setupBrightness();\n        if (!isPlayerAndPlayerServiceAvailable()\n                || player.UIs().get(MainPlayerUi.class).isEmpty()\n                || getRoot().map(View::getParent).isEmpty()) {\n            return;\n        }\n\n        if (fullscreen) {\n            hideSystemUiIfNeeded();\n            binding.overlayPlayPauseButton.requestFocus();\n        } else {\n            showSystemUi();\n        }\n\n        if (binding.relatedItemsLayout != null) {\n            if (showRelatedItems) {\n                binding.relatedItemsLayout.setVisibility(fullscreen ? View.GONE : View.VISIBLE);\n            } else {\n                binding.relatedItemsLayout.setVisibility(View.GONE);\n            }\n        }\n        scrollToTop();\n\n        tryAddVideoPlayerView();\n    }\n\n    @Override\n    public void onScreenRotationButtonClicked() {\n        // On Android TV screen rotation is not supported\n        // In tablet user experience will be better if screen will not be rotated\n        // from landscape to portrait every time.\n        // Just turn on fullscreen mode in landscape orientation\n        // or portrait & unlocked global orientation\n        final boolean isLandscape = DeviceUtils.isLandscape(requireContext());\n        if (DeviceUtils.isTv(activity) || DeviceUtils.isTablet(activity)\n                && (!globalScreenOrientationLocked(activity) || isLandscape)) {\n            player.UIs().get(MainPlayerUi.class).ifPresent(MainPlayerUi::toggleFullscreen);\n            return;\n        }\n\n        final int newOrientation = isLandscape\n                ? ActivityInfo.SCREEN_ORIENTATION_PORTRAIT\n                : ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE;\n\n        activity.setRequestedOrientation(newOrientation);\n    }\n\n    /*\n     * Will scroll down to description view after long click on moreOptionsButton\n     * */\n    @Override\n    public void onMoreOptionsLongClicked() {\n        final CoordinatorLayout.LayoutParams params =\n                (CoordinatorLayout.LayoutParams) binding.appBarLayout.getLayoutParams();\n        final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();\n        final ValueAnimator valueAnimator = ValueAnimator\n                .ofInt(0, -binding.playerPlaceholder.getHeight());\n        valueAnimator.setInterpolator(new DecelerateInterpolator());\n        valueAnimator.addUpdateListener(animation -> {\n            behavior.setTopAndBottomOffset((int) animation.getAnimatedValue());\n            binding.appBarLayout.requestLayout();\n        });\n        valueAnimator.setInterpolator(new DecelerateInterpolator());\n        valueAnimator.setDuration(500);\n        valueAnimator.start();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Player related utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void showSystemUi() {\n        if (DEBUG) {\n            Log.d(TAG, \"showSystemUi() called\");\n        }\n\n        if (activity == null) {\n            return;\n        }\n\n        // Prevent jumping of the player on devices with cutout\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n            activity.getWindow().getAttributes().layoutInDisplayCutoutMode =\n                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;\n        }\n        activity.getWindow().getDecorView().setSystemUiVisibility(0);\n        activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);\n        activity.getWindow().setStatusBarColor(ThemeHelper.resolveColorFromAttr(\n                requireContext(), android.R.attr.colorPrimary));\n    }\n\n    private void hideSystemUi() {\n        if (DEBUG) {\n            Log.d(TAG, \"hideSystemUi() called\");\n        }\n\n        if (activity == null) {\n            return;\n        }\n\n        // Prevent jumping of the player on devices with cutout\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n            activity.getWindow().getAttributes().layoutInDisplayCutoutMode =\n                    WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;\n        }\n        int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE\n                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION\n                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;\n\n        // In multiWindow mode status bar is not transparent for devices with cutout\n        // if I include this flag. So without it is better in this case\n        final boolean isInMultiWindow = DeviceUtils.isInMultiWindow(activity);\n        if (!isInMultiWindow) {\n            visibility |= View.SYSTEM_UI_FLAG_FULLSCREEN;\n        }\n        activity.getWindow().getDecorView().setSystemUiVisibility(visibility);\n\n        if (isInMultiWindow || isFullscreen()) {\n            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);\n            activity.getWindow().setNavigationBarColor(Color.TRANSPARENT);\n        }\n        activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);\n    }\n\n    // Listener implementation\n    @Override\n    public void hideSystemUiIfNeeded() {\n        if (isFullscreen()\n                && bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {\n            hideSystemUi();\n        }\n    }\n\n    private boolean isFullscreen() {\n        return isPlayerAvailable() && player.UIs().get(VideoPlayerUi.class)\n                .map(VideoPlayerUi::isFullscreen).orElse(false);\n    }\n\n    private boolean playerIsNotStopped() {\n        return isPlayerAvailable() && !player.isStopped();\n    }\n\n    private void restoreDefaultBrightness() {\n        final WindowManager.LayoutParams lp = activity.getWindow().getAttributes();\n        if (lp.screenBrightness == -1) {\n            return;\n        }\n\n        // Restore the old  brightness when fragment.onPause() called or\n        // when a player is in portrait\n        lp.screenBrightness = -1;\n        activity.getWindow().setAttributes(lp);\n    }\n\n    private void setupBrightness() {\n        if (activity == null) {\n            return;\n        }\n\n        final WindowManager.LayoutParams lp = activity.getWindow().getAttributes();\n        if (!isFullscreen() || bottomSheetState != BottomSheetBehavior.STATE_EXPANDED) {\n            // Apply system brightness when the player is not in fullscreen\n            restoreDefaultBrightness();\n        } else {\n            // Do not restore if user has disabled brightness gesture\n            if (!PlayerHelper.getActionForRightGestureSide(activity)\n                    .equals(getString(R.string.brightness_control_key))\n                    && !PlayerHelper.getActionForLeftGestureSide(activity)\n                    .equals(getString(R.string.brightness_control_key))) {\n                return;\n            }\n            // Restore already saved brightness level\n            final float brightnessLevel = PlayerHelper.getScreenBrightness(activity);\n            if (brightnessLevel == lp.screenBrightness) {\n                return;\n            }\n            lp.screenBrightness = brightnessLevel;\n            activity.getWindow().setAttributes(lp);\n        }\n    }\n\n    /**\n     * Make changes to the UI to accommodate for better usability on bigger screens such as TVs\n     * or in Android's desktop mode (DeX etc).\n     */\n    private void accommodateForTvAndDesktopMode() {\n        if (DeviceUtils.isTv(getContext())) {\n            // remove ripple effects from detail controls\n            final int transparent = ContextCompat.getColor(requireContext(),\n                    R.color.transparent_background_color);\n            binding.detailControlsPlaylistAppend.setBackgroundColor(transparent);\n            binding.detailControlsBackground.setBackgroundColor(transparent);\n            binding.detailControlsPopup.setBackgroundColor(transparent);\n            binding.detailControlsDownload.setBackgroundColor(transparent);\n            binding.detailControlsShare.setBackgroundColor(transparent);\n            binding.detailControlsOpenInBrowser.setBackgroundColor(transparent);\n            binding.detailControlsPlayWithKodi.setBackgroundColor(transparent);\n        }\n        if (DeviceUtils.isDesktopMode(getContext())) {\n            // Remove the \"hover\" overlay (since it is visible on all mouse events and interferes\n            // with the video content being played)\n            binding.detailThumbnailRootLayout.setForeground(null);\n        }\n    }\n\n    private void checkLandscape() {\n        if ((!player.isPlaying() && player.getPlayQueue() != playQueue)\n                || player.getPlayQueue() == null) {\n            setAutoPlay(true);\n        }\n\n        player.UIs().get(MainPlayerUi.class).ifPresent(MainPlayerUi::checkLandscape);\n        // Let's give a user time to look at video information page if video is not playing\n        if (globalScreenOrientationLocked(activity) && !player.isPlaying()) {\n            player.play();\n        }\n    }\n\n    /*\n     * Means that the player fragment was swiped away via BottomSheetLayout\n     * and is empty but ready for any new actions. See cleanUp()\n     * */\n    private boolean wasCleared() {\n        return url == null;\n    }\n\n    @Nullable\n    private StackItem findQueueInStack(final PlayQueue queue) {\n        StackItem item = null;\n        final Iterator<StackItem> iterator = stack.descendingIterator();\n        while (iterator.hasNext()) {\n            final StackItem next = iterator.next();\n            if (next.getPlayQueue().equalStreams(queue)) {\n                item = next;\n                break;\n            }\n        }\n        return item;\n    }\n\n    private void replaceQueueIfUserConfirms(final Runnable onAllow) {\n        @Nullable final PlayQueue activeQueue = isPlayerAvailable() ? player.getPlayQueue() : null;\n\n        // Player will have STATE_IDLE when a user pressed back button\n        if (isClearingQueueConfirmationRequired(activity)\n                && playerIsNotStopped()\n                && activeQueue != null\n                && !activeQueue.equalStreams(playQueue)) {\n            showClearingQueueConfirmation(onAllow);\n        } else {\n            onAllow.run();\n        }\n    }\n\n    private void showClearingQueueConfirmation(final Runnable onAllow) {\n        new AlertDialog.Builder(activity)\n                .setTitle(R.string.clear_queue_confirmation_description)\n                .setNegativeButton(R.string.cancel, null)\n                .setPositiveButton(R.string.ok, (dialog, which) -> {\n                    onAllow.run();\n                    dialog.dismiss();\n                })\n                .show();\n    }\n\n    private void showExternalVideoPlaybackDialog() {\n        if (currentInfo == null) {\n            return;\n        }\n\n        final AlertDialog.Builder builder = new AlertDialog.Builder(activity);\n        builder.setTitle(R.string.select_quality_external_players);\n        builder.setNeutralButton(R.string.open_in_browser, (dialog, i) ->\n                ShareUtils.openUrlInBrowser(requireActivity(), url));\n\n        final List<VideoStream> videoStreamsForExternalPlayers =\n                ListHelper.getSortedStreamVideosList(\n                        activity,\n                        getUrlAndNonTorrentStreams(currentInfo.getVideoStreams()),\n                        getUrlAndNonTorrentStreams(currentInfo.getVideoOnlyStreams()),\n                        false,\n                        false\n                );\n\n        if (videoStreamsForExternalPlayers.isEmpty()) {\n            builder.setMessage(R.string.no_video_streams_available_for_external_players);\n            builder.setPositiveButton(R.string.ok, null);\n\n        } else {\n            final int selectedVideoStreamIndexForExternalPlayers =\n                    ListHelper.getDefaultResolutionIndex(activity, videoStreamsForExternalPlayers);\n            final CharSequence[] resolutions = videoStreamsForExternalPlayers.stream()\n                    .map(VideoStream::getResolution).toArray(CharSequence[]::new);\n\n            builder.setSingleChoiceItems(resolutions, selectedVideoStreamIndexForExternalPlayers,\n                    null);\n            builder.setNegativeButton(R.string.cancel, null);\n            builder.setPositiveButton(R.string.ok, (dialog, i) -> {\n                final int index = ((AlertDialog) dialog).getListView().getCheckedItemPosition();\n                // We don't have to manage the index validity because if there is no stream\n                // available for external players, this code will be not executed and if there is\n                // no stream which matches the default resolution, 0 is returned by\n                // ListHelper.getDefaultResolutionIndex.\n                // The index cannot be outside the bounds of the list as its always between 0 and\n                // the list size - 1, .\n                startOnExternalPlayer(activity, currentInfo,\n                        videoStreamsForExternalPlayers.get(index));\n            });\n        }\n        builder.show();\n    }\n\n    private void showExternalAudioPlaybackDialog() {\n        if (currentInfo == null) {\n            return;\n        }\n\n        final List<AudioStream> audioStreams = getUrlAndNonTorrentStreams(\n                currentInfo.getAudioStreams());\n        final List<AudioStream> audioTracks =\n                ListHelper.getFilteredAudioStreams(activity, audioStreams);\n\n        if (audioTracks.isEmpty()) {\n            Toast.makeText(activity, R.string.no_audio_streams_available_for_external_players,\n                    Toast.LENGTH_SHORT).show();\n        } else if (audioTracks.size() == 1) {\n            startOnExternalPlayer(activity, currentInfo, audioTracks.get(0));\n        } else {\n            final int selectedAudioStream =\n                    ListHelper.getDefaultAudioFormat(activity, audioTracks);\n            final CharSequence[] trackNames = audioTracks.stream()\n                    .map(audioStream -> Localization.audioTrackName(activity, audioStream))\n                    .toArray(CharSequence[]::new);\n\n            new AlertDialog.Builder(activity)\n                    .setTitle(R.string.select_audio_track_external_players)\n                    .setNeutralButton(R.string.open_in_browser, (dialog, i) ->\n                            ShareUtils.openUrlInBrowser(requireActivity(), url))\n                    .setSingleChoiceItems(trackNames, selectedAudioStream, null)\n                    .setNegativeButton(R.string.cancel, null)\n                    .setPositiveButton(R.string.ok, (dialog, i) -> {\n                        final int index = ((AlertDialog) dialog).getListView()\n                                .getCheckedItemPosition();\n                        startOnExternalPlayer(activity, currentInfo, audioTracks.get(index));\n                    })\n                    .show();\n        }\n    }\n\n    /*\n     * Remove unneeded information while waiting for a next task\n     * */\n    private void cleanUp() {\n        // New beginning\n        stack.clear();\n        if (currentWorker != null) {\n            currentWorker.dispose();\n        }\n        playerHolder.stopService();\n        setInitialData(0, null, \"\", null);\n        currentInfo = null;\n        updateOverlayData(null, null, List.of());\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Bottom mini player\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * That's for Android TV support. Move focus from main fragment to the player or back\n     * based on what is currently selected\n     *\n     * @param toMain if true than the main fragment will be focused or the player otherwise\n     */\n    private void moveFocusToMainFragment(final boolean toMain) {\n        setupBrightness();\n        final ViewGroup mainFragment = requireActivity().findViewById(R.id.fragment_holder);\n        // Hamburger button steels a focus even under bottomSheet\n        final Toolbar toolbar = requireActivity().findViewById(R.id.toolbar);\n        final int afterDescendants = ViewGroup.FOCUS_AFTER_DESCENDANTS;\n        final int blockDescendants = ViewGroup.FOCUS_BLOCK_DESCENDANTS;\n        if (toMain) {\n            mainFragment.setDescendantFocusability(afterDescendants);\n            toolbar.setDescendantFocusability(afterDescendants);\n            ((ViewGroup) requireView()).setDescendantFocusability(blockDescendants);\n            // Only focus the mainFragment if the mainFragment (e.g. search-results)\n            // or the toolbar (e.g. Textfield for search) don't have focus.\n            // This was done to fix problems with the keyboard input, see also #7490\n            if (!mainFragment.hasFocus() && !toolbar.hasFocus()) {\n                mainFragment.requestFocus();\n            }\n        } else {\n            mainFragment.setDescendantFocusability(blockDescendants);\n            toolbar.setDescendantFocusability(blockDescendants);\n            ((ViewGroup) requireView()).setDescendantFocusability(afterDescendants);\n            // Only focus the player if it not already has focus\n            if (!binding.getRoot().hasFocus()) {\n                binding.detailThumbnailRootLayout.requestFocus();\n            }\n        }\n    }\n\n    /**\n     * When the mini player exists the view underneath it is not touchable.\n     * Bottom padding should be equal to the mini player's height in this case\n     *\n     * @param showMore whether main fragment should be expanded or not\n     */\n    private void manageSpaceAtTheBottom(final boolean showMore) {\n        final int peekHeight = getResources().getDimensionPixelSize(R.dimen.mini_player_height);\n        final ViewGroup holder = requireActivity().findViewById(R.id.fragment_holder);\n        final int newBottomPadding;\n        if (showMore) {\n            newBottomPadding = 0;\n        } else {\n            newBottomPadding = peekHeight;\n        }\n        if (holder.getPaddingBottom() == newBottomPadding) {\n            return;\n        }\n        holder.setPadding(holder.getPaddingLeft(),\n                holder.getPaddingTop(),\n                holder.getPaddingRight(),\n                newBottomPadding);\n    }\n\n    private void setupBottomPlayer() {\n        final CoordinatorLayout.LayoutParams params =\n                (CoordinatorLayout.LayoutParams) binding.appBarLayout.getLayoutParams();\n        final AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();\n\n        final FrameLayout bottomSheetLayout = activity.findViewById(R.id.fragment_player_holder);\n        bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetLayout);\n        bottomSheetBehavior.setState(lastStableBottomSheetState);\n        updateBottomSheetState(lastStableBottomSheetState);\n\n        final int peekHeight = getResources().getDimensionPixelSize(R.dimen.mini_player_height);\n        if (bottomSheetState != BottomSheetBehavior.STATE_HIDDEN) {\n            manageSpaceAtTheBottom(false);\n            bottomSheetBehavior.setPeekHeight(peekHeight);\n            if (bottomSheetState == BottomSheetBehavior.STATE_COLLAPSED) {\n                binding.overlayLayout.setAlpha(MAX_OVERLAY_ALPHA);\n            } else if (bottomSheetState == BottomSheetBehavior.STATE_EXPANDED) {\n                binding.overlayLayout.setAlpha(0);\n                setOverlayElementsClickable(false);\n            }\n        }\n\n        bottomSheetCallback = new BottomSheetBehavior.BottomSheetCallback() {\n            @Override\n            public void onStateChanged(@NonNull final View bottomSheet, final int newState) {\n                updateBottomSheetState(newState);\n\n                switch (newState) {\n                    case BottomSheetBehavior.STATE_HIDDEN:\n                        moveFocusToMainFragment(true);\n                        manageSpaceAtTheBottom(true);\n\n                        bottomSheetBehavior.setPeekHeight(0);\n                        cleanUp();\n                        break;\n                    case BottomSheetBehavior.STATE_EXPANDED:\n                        moveFocusToMainFragment(false);\n                        manageSpaceAtTheBottom(false);\n\n                        bottomSheetBehavior.setPeekHeight(peekHeight);\n                        // Disable click because overlay buttons located on top of buttons\n                        // from the player\n                        setOverlayElementsClickable(false);\n                        hideSystemUiIfNeeded();\n                        // Conditions when the player should be expanded to fullscreen\n                        if (DeviceUtils.isLandscape(requireContext())\n                                && isPlayerAvailable()\n                                && player.isPlaying()\n                                && !isFullscreen()\n                                && !DeviceUtils.isTablet(activity)) {\n                            player.UIs().get(MainPlayerUi.class)\n                                    .ifPresent(MainPlayerUi::toggleFullscreen);\n                        }\n                        setOverlayLook(binding.appBarLayout, behavior, 1);\n                        break;\n                    case BottomSheetBehavior.STATE_COLLAPSED:\n                        moveFocusToMainFragment(true);\n                        manageSpaceAtTheBottom(false);\n\n                        bottomSheetBehavior.setPeekHeight(peekHeight);\n\n                        // Re-enable clicks\n                        setOverlayElementsClickable(true);\n                        if (isPlayerAvailable()) {\n                            player.UIs().get(MainPlayerUi.class)\n                                    .ifPresent(MainPlayerUi::closeItemsList);\n                        }\n                        setOverlayLook(binding.appBarLayout, behavior, 0);\n                        break;\n                    case BottomSheetBehavior.STATE_DRAGGING:\n                    case BottomSheetBehavior.STATE_SETTLING:\n                        if (isFullscreen()) {\n                            showSystemUi();\n                        }\n                        if (isPlayerAvailable()) {\n                            player.UIs().get(MainPlayerUi.class).ifPresent(ui -> {\n                                if (ui.isControlsVisible()) {\n                                    ui.hideControls(0, 0);\n                                }\n                            });\n                        }\n                        break;\n                    case BottomSheetBehavior.STATE_HALF_EXPANDED:\n                        break;\n                }\n            }\n\n            @Override\n            public void onSlide(@NonNull final View bottomSheet, final float slideOffset) {\n                setOverlayLook(binding.appBarLayout, behavior, slideOffset);\n            }\n        };\n\n        bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallback);\n\n        // User opened a new page and the player will hide itself\n        activity.getSupportFragmentManager().addOnBackStackChangedListener(() -> {\n            if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {\n                bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);\n            }\n        });\n    }\n\n    private void updateOverlayPlayQueueButtonVisibility() {\n        final boolean isPlayQueueEmpty =\n                player == null // no player => no play queue :)\n                        || player.getPlayQueue() == null\n                        || player.getPlayQueue().isEmpty();\n        if (binding != null) {\n            // binding is null when rotating the device...\n            binding.overlayPlayQueueButton.setVisibility(\n                    isPlayQueueEmpty ? View.GONE : View.VISIBLE);\n        }\n    }\n\n    private void updateOverlayData(@Nullable final String overlayTitle,\n                                   @Nullable final String uploader,\n                                   @NonNull final List<Image> thumbnails) {\n        binding.overlayTitleTextView.setText(isEmpty(overlayTitle) ? \"\" : overlayTitle);\n        binding.overlayChannelTextView.setText(isEmpty(uploader) ? \"\" : uploader);\n        binding.overlayThumbnail.setImageDrawable(null);\n        CoilHelper.INSTANCE.loadDetailsThumbnail(binding.overlayThumbnail, thumbnails);\n    }\n\n    private void setOverlayPlayPauseImage(final boolean playerIsPlaying) {\n        final int drawable = playerIsPlaying\n                ? R.drawable.ic_pause\n                : R.drawable.ic_play_arrow;\n        binding.overlayPlayPauseButton.setImageResource(drawable);\n    }\n\n    private void setOverlayLook(final AppBarLayout appBar,\n                                final AppBarLayout.Behavior behavior,\n                                final float slideOffset) {\n        // SlideOffset < 0 when mini player is about to close via swipe.\n        // Stop animation in this case\n        if (behavior == null || slideOffset < 0) {\n            return;\n        }\n        binding.overlayLayout.setAlpha(Math.min(MAX_OVERLAY_ALPHA, 1 - slideOffset));\n        // These numbers are not special. They just do a cool transition\n        behavior.setTopAndBottomOffset(\n                (int) (-binding.detailThumbnailImageView.getHeight() * 2 * (1 - slideOffset) / 3));\n        appBar.requestLayout();\n    }\n\n    private void setOverlayElementsClickable(final boolean enable) {\n        binding.overlayThumbnail.setClickable(enable);\n        binding.overlayThumbnail.setLongClickable(enable);\n        binding.overlayMetadataLayout.setClickable(enable);\n        binding.overlayMetadataLayout.setLongClickable(enable);\n        binding.overlayButtonsLayout.setClickable(enable);\n        binding.overlayPlayQueueButton.setClickable(enable);\n        binding.overlayPlayPauseButton.setClickable(enable);\n        binding.overlayCloseButton.setClickable(enable);\n    }\n\n    // helpers to check the state of player and playerService\n    boolean isPlayerAvailable() {\n        return player != null;\n    }\n\n    boolean isPlayerServiceAvailable() {\n        return playerService != null;\n    }\n\n    boolean isPlayerAndPlayerServiceAvailable() {\n        return player != null && playerService != null;\n    }\n\n    public Optional<View> getRoot() {\n        return Optional.ofNullable(player)\n                .flatMap(player1 -> player1.UIs().get(VideoPlayerUi.class))\n                .map(playerUi -> playerUi.getBinding().getRoot());\n    }\n\n    private void updateBottomSheetState(final int newState) {\n        bottomSheetState = newState;\n        if (newState != BottomSheetBehavior.STATE_DRAGGING\n                && newState != BottomSheetBehavior.STATE_SETTLING) {\n            lastStableBottomSheetState = newState;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailPlayerCrasher.java",
    "content": "package org.schabi.newpipe.fragments.detail;\n\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_DECODING_FAILED;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_UNSPECIFIED;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.util.Pair;\nimport android.view.ContextThemeWrapper;\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\nimport android.widget.RadioButton;\nimport android.widget.RadioGroup;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AlertDialog;\n\nimport com.google.android.exoplayer2.C;\nimport com.google.android.exoplayer2.ExoPlaybackException;\nimport com.google.android.exoplayer2.PlaybackException;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.ListRadioIconItemBinding;\nimport org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.util.ThemeHelper;\n\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.function.Supplier;\n\n/**\n * Outsourced logic for crashing the player in the {@link VideoDetailFragment}.\n */\npublic final class VideoDetailPlayerCrasher {\n\n    // This has to be <= 23 chars on devices running Android 7 or lower (API <= 25)\n    // or it fails with an IllegalArgumentException\n    // https://stackoverflow.com/a/54744028\n    private static final String TAG = \"VideoDetPlayerCrasher\";\n\n    private static final String DEFAULT_MSG = \"Dummy\";\n\n    private static final List<Pair<String, Supplier<ExoPlaybackException>>>\n            AVAILABLE_EXCEPTION_TYPES = List.of(\n                    new Pair<>(\"Source\", () -> ExoPlaybackException.createForSource(\n                            new IOException(DEFAULT_MSG),\n                            ERROR_CODE_BEHIND_LIVE_WINDOW\n                    )),\n                    new Pair<>(\"Renderer\", () -> ExoPlaybackException.createForRenderer(\n                            new Exception(DEFAULT_MSG),\n                            \"Dummy renderer\",\n                            0,\n                            null,\n                            C.FORMAT_HANDLED,\n                            /*isRecoverable=*/false,\n                            ERROR_CODE_DECODING_FAILED\n                    )),\n                    new Pair<>(\"Unexpected\", () -> ExoPlaybackException.createForUnexpected(\n                            new RuntimeException(DEFAULT_MSG),\n                            ERROR_CODE_UNSPECIFIED\n                    )),\n                    new Pair<>(\"Remote\", () -> ExoPlaybackException.createForRemote(DEFAULT_MSG))\n            );\n\n    private VideoDetailPlayerCrasher() {\n        // No impls\n    }\n\n    private static Context getThemeWrapperContext(final Context context) {\n        return new ContextThemeWrapper(\n                context,\n                ThemeHelper.isLightThemeSelected(context)\n                        ? R.style.LightTheme\n                        : R.style.DarkTheme);\n    }\n\n    public static void onCrashThePlayer(\n            @NonNull final Context context,\n            @Nullable final Player player\n    ) {\n        if (player == null) {\n            Log.d(TAG, \"Player is not available\");\n            Toast.makeText(context, \"Player is not available\", Toast.LENGTH_SHORT)\n                    .show();\n\n            return;\n        }\n\n        // -- Build the dialog/UI --\n        final Context themeWrapperContext = getThemeWrapperContext(context);\n        final LayoutInflater inflater = LayoutInflater.from(themeWrapperContext);\n\n        final SingleChoiceDialogViewBinding binding =\n                SingleChoiceDialogViewBinding.inflate(inflater);\n\n        final AlertDialog alertDialog = new AlertDialog.Builder(themeWrapperContext)\n                .setTitle(\"Choose an exception\")\n                .setView(binding.getRoot())\n                .setCancelable(true)\n                .setNegativeButton(R.string.cancel, null)\n                .create();\n\n        for (final Pair<String, Supplier<ExoPlaybackException>> entry : AVAILABLE_EXCEPTION_TYPES) {\n            final RadioButton radioButton = ListRadioIconItemBinding.inflate(inflater).getRoot();\n            radioButton.setText(entry.first);\n            radioButton.setChecked(false);\n            radioButton.setLayoutParams(\n                    new RadioGroup.LayoutParams(\n                            ViewGroup.LayoutParams.MATCH_PARENT,\n                            ViewGroup.LayoutParams.WRAP_CONTENT\n                    )\n            );\n            radioButton.setOnClickListener(v -> {\n                tryCrashPlayerWith(player, entry.second.get());\n                alertDialog.cancel();\n            });\n            binding.list.addView(radioButton);\n        }\n\n        alertDialog.show();\n    }\n\n    /**\n     * Note that this method does not crash the underlying exoplayer directly (it's not possible).\n     * It simply supplies a Exception to {@link Player#onPlayerError(PlaybackException)}.\n     * @param player\n     * @param exception\n     */\n    private static void tryCrashPlayerWith(\n            @NonNull final Player player,\n            @NonNull final ExoPlaybackException exception\n    ) {\n        Log.d(TAG, \"Crashing the player using player.onPlayerError(ex)\");\n        try {\n            player.onPlayerError(exception);\n        } catch (final Exception exPlayer) {\n            Log.e(TAG,\n                    \"Run into an exception while crashing the player:\",\n                    exPlayer);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java",
    "content": "package org.schabi.newpipe.fragments.list;\n\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\nimport static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.res.Resources;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.preference.PreferenceManager;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.fragments.BaseStateFragment;\nimport org.schabi.newpipe.fragments.OnScrollBelowItemsListener;\nimport org.schabi.newpipe.info_list.InfoListAdapter;\nimport org.schabi.newpipe.info_list.ItemViewMode;\nimport org.schabi.newpipe.info_list.dialog.InfoItemDialog;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.OnClickGesture;\nimport org.schabi.newpipe.util.StateSaver;\nimport org.schabi.newpipe.util.ThemeHelper;\nimport org.schabi.newpipe.views.SuperScrollLayoutManager;\n\nimport java.util.List;\nimport java.util.Queue;\nimport java.util.function.Supplier;\n\npublic abstract class BaseListFragment<I, N> extends BaseStateFragment<I>\n        implements ListViewContract<I, N>, StateSaver.WriteRead,\n        SharedPreferences.OnSharedPreferenceChangeListener {\n    private static final int LIST_MODE_UPDATE_FLAG = 0x32;\n    protected org.schabi.newpipe.util.SavedState savedState;\n\n    private boolean useDefaultStateSaving = true;\n    private int updateFlags = 0;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Views\n    //////////////////////////////////////////////////////////////////////////*/\n\n    protected InfoListAdapter infoListAdapter;\n    protected RecyclerView itemsList;\n    private int focusedPosition = -1;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // LifeCycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onAttach(@NonNull final Context context) {\n        super.onAttach(context);\n\n        if (infoListAdapter == null) {\n            infoListAdapter = new InfoListAdapter(activity);\n        }\n    }\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setHasOptionsMenu(true);\n        PreferenceManager.getDefaultSharedPreferences(activity)\n                .registerOnSharedPreferenceChangeListener(this);\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        if (useDefaultStateSaving) {\n            StateSaver.onDestroy(savedState);\n        }\n        PreferenceManager.getDefaultSharedPreferences(activity)\n                .unregisterOnSharedPreferenceChangeListener(this);\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n\n        if (updateFlags != 0) {\n            if ((updateFlags & LIST_MODE_UPDATE_FLAG) != 0) {\n                refreshItemViewMode();\n            }\n            updateFlags = 0;\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // State Saving\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * If the default implementation of {@link StateSaver.WriteRead} should be used.\n     *\n     * @param useDefaultStateSaving Whether the default implementation should be used\n     * @see StateSaver\n     */\n    public void setUseDefaultStateSaving(final boolean useDefaultStateSaving) {\n        this.useDefaultStateSaving = useDefaultStateSaving;\n    }\n\n    @Override\n    public String generateSuffix() {\n        // Naive solution, but it's good for now (the items don't change)\n        return \".\" + infoListAdapter.getItemsList().size() + \".list\";\n    }\n\n    private int getFocusedPosition() {\n        try {\n            final View focusedItem = itemsList.getFocusedChild();\n            final RecyclerView.ViewHolder itemHolder =\n                    itemsList.findContainingViewHolder(focusedItem);\n            return itemHolder.getBindingAdapterPosition();\n        } catch (final NullPointerException e) {\n            return -1;\n        }\n    }\n\n    @Override\n    public void writeTo(final Queue<Object> objectsToSave) {\n        if (!useDefaultStateSaving) {\n            return;\n        }\n\n        objectsToSave.add(infoListAdapter.getItemsList());\n        objectsToSave.add(getFocusedPosition());\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public void readFrom(@NonNull final Queue<Object> savedObjects) throws Exception {\n        if (!useDefaultStateSaving) {\n            return;\n        }\n\n        infoListAdapter.getItemsList().clear();\n        infoListAdapter.getItemsList().addAll((List<InfoItem>) savedObjects.poll());\n        restoreFocus((Integer) savedObjects.poll());\n    }\n\n    private void restoreFocus(final Integer position) {\n        if (position == null || position < 0) {\n            return;\n        }\n\n        itemsList.post(() -> {\n            final RecyclerView.ViewHolder focusedHolder =\n                    itemsList.findViewHolderForAdapterPosition(position);\n\n            if (focusedHolder != null) {\n                focusedHolder.itemView.requestFocus();\n            }\n        });\n    }\n\n    @Override\n    public void onSaveInstanceState(@NonNull final Bundle bundle) {\n        super.onSaveInstanceState(bundle);\n        if (useDefaultStateSaving) {\n            savedState = StateSaver\n                    .tryToSave(activity.isChangingConfigurations(), savedState, bundle, this);\n        }\n    }\n\n    @Override\n    protected void onRestoreInstanceState(@NonNull final Bundle bundle) {\n        super.onRestoreInstanceState(bundle);\n        if (useDefaultStateSaving) {\n            savedState = StateSaver.tryToRestore(bundle, this);\n        }\n    }\n\n    @Override\n    public void onStop() {\n        focusedPosition = getFocusedPosition();\n        super.onStop();\n    }\n\n    @Override\n    public void onStart() {\n        super.onStart();\n        restoreFocus(focusedPosition);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Nullable\n    protected Supplier<View> getListHeaderSupplier() {\n        return null;\n    }\n\n    protected RecyclerView.LayoutManager getListLayoutManager() {\n        return new SuperScrollLayoutManager(activity);\n    }\n\n    protected RecyclerView.LayoutManager getGridLayoutManager() {\n        final Resources resources = activity.getResources();\n        int width = resources.getDimensionPixelSize(R.dimen.video_item_grid_thumbnail_image_width);\n        width += (24 * resources.getDisplayMetrics().density);\n        final int spanCount = Math.floorDiv(resources.getDisplayMetrics().widthPixels, width);\n        final GridLayoutManager lm = new GridLayoutManager(activity, spanCount);\n        lm.setSpanSizeLookup(infoListAdapter.getSpanSizeLookup(spanCount));\n        return lm;\n    }\n\n    /**\n     * Updates the item view mode based on user preference.\n     */\n    private void refreshItemViewMode() {\n        final ItemViewMode itemViewMode = getItemViewMode();\n        itemsList.setLayoutManager((itemViewMode == ItemViewMode.GRID)\n                ? getGridLayoutManager() : getListLayoutManager());\n        infoListAdapter.setItemViewMode(itemViewMode);\n        infoListAdapter.notifyDataSetChanged();\n    }\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n\n        itemsList = rootView.findViewById(R.id.items_list);\n        refreshItemViewMode();\n\n        final Supplier<View> listHeaderSupplier = getListHeaderSupplier();\n        if (listHeaderSupplier != null) {\n            infoListAdapter.setHeaderSupplier(listHeaderSupplier);\n        }\n\n        itemsList.setAdapter(infoListAdapter);\n    }\n\n    protected void onItemSelected(final InfoItem selectedItem) {\n        if (DEBUG) {\n            Log.d(TAG, \"onItemSelected() called with: selectedItem = [\" + selectedItem + \"]\");\n        }\n    }\n\n    @Override\n    protected void initListeners() {\n        super.initListeners();\n        infoListAdapter.setOnStreamSelectedListener(new OnClickGesture<>() {\n            @Override\n            public void selected(final StreamInfoItem selectedItem) {\n                onStreamSelected(selectedItem);\n            }\n\n            @Override\n            public void held(final StreamInfoItem selectedItem) {\n                showInfoItemDialog(selectedItem);\n            }\n        });\n\n        infoListAdapter.setOnChannelSelectedListener(selectedItem -> {\n            try {\n                onItemSelected(selectedItem);\n                NavigationHelper.openChannelFragment(getFM(), selectedItem.getServiceId(),\n                        selectedItem.getUrl(), selectedItem.getName());\n            } catch (final Exception e) {\n                ErrorUtil.showUiErrorSnackbar(this, \"Opening channel fragment\", e);\n            }\n        });\n\n        infoListAdapter.setOnPlaylistSelectedListener(selectedItem -> {\n            try {\n                onItemSelected(selectedItem);\n                NavigationHelper.openPlaylistFragment(getFM(), selectedItem.getServiceId(),\n                        selectedItem.getUrl(), selectedItem.getName());\n            } catch (final Exception e) {\n                ErrorUtil.showUiErrorSnackbar(this, \"Opening playlist fragment\", e);\n            }\n        });\n\n        infoListAdapter.setOnCommentsSelectedListener(this::onItemSelected);\n\n        // Ensure that there is always a scroll listener (e.g. when rotating the device)\n        useNormalItemListScrollListener();\n    }\n\n    /**\n     * Removes all listeners and adds the normal scroll listener to the {@link #itemsList}.\n     */\n    protected void useNormalItemListScrollListener() {\n        if (DEBUG) {\n            Log.d(TAG, \"useNormalItemListScrollListener called\");\n        }\n        itemsList.clearOnScrollListeners();\n        itemsList.addOnScrollListener(new DefaultItemListOnScrolledDownListener());\n    }\n\n    /**\n     * Removes all listeners and adds the initial scroll listener to the {@link #itemsList}.\n     * <br/>\n     * Which tries to load more items when not enough are in the view (not scrollable)\n     * and more are available.\n     * <br/>\n     * Note: This method only works because \"This callback will also be called if visible\n     * item range changes after a layout calculation. In that case, dx and dy will be 0.\"\n     * - which might be unexpected because no actual scrolling occurs...\n     * <br/>\n     * This listener will be replaced by DefaultItemListOnScrolledDownListener when\n     * <ul>\n     *     <li>the view was actually scrolled</li>\n     *     <li>the view is scrollable</li>\n     *     <li>no more items can be loaded</li>\n     * </ul>\n     */\n    protected void useInitialItemListLoadScrollListener() {\n        if (DEBUG) {\n            Log.d(TAG, \"useInitialItemListLoadScrollListener called\");\n        }\n        itemsList.clearOnScrollListeners();\n        itemsList.addOnScrollListener(new DefaultItemListOnScrolledDownListener() {\n            @Override\n            public void onScrolled(@NonNull final RecyclerView recyclerView,\n                                   final int dx, final int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n\n                if (dy != 0) {\n                    log(\"Vertical scroll occurred\");\n\n                    useNormalItemListScrollListener();\n                    return;\n                }\n                if (isLoading.get()) {\n                    log(\"Still loading data -> Skipping\");\n                    return;\n                }\n                if (!hasMoreItems()) {\n                    log(\"No more items to load\");\n\n                    useNormalItemListScrollListener();\n                    return;\n                }\n                if (itemsList.canScrollVertically(1)\n                        || itemsList.canScrollVertically(-1)) {\n                    log(\"View is scrollable\");\n\n                    useNormalItemListScrollListener();\n                    return;\n                }\n\n                log(\"Loading more data\");\n                loadMoreItems();\n            }\n\n            private void log(final String msg) {\n                if (DEBUG) {\n                    Log.d(TAG, \"initItemListLoadScrollListener - \" + msg);\n                }\n            }\n        });\n    }\n\n    class DefaultItemListOnScrolledDownListener extends OnScrollBelowItemsListener {\n        @Override\n        public void onScrolledDown(final RecyclerView recyclerView) {\n            onScrollToBottom();\n        }\n    }\n\n    private void onStreamSelected(final StreamInfoItem selectedItem) {\n        onItemSelected(selectedItem);\n        NavigationHelper.openVideoDetailFragment(requireContext(), getFM(),\n                selectedItem.getServiceId(), selectedItem.getUrl(), selectedItem.getName(),\n                null, false);\n    }\n\n    protected void onScrollToBottom() {\n        if (hasMoreItems() && !isLoading.get()) {\n            loadMoreItems();\n        }\n    }\n\n    protected void showInfoItemDialog(final StreamInfoItem item) {\n        try {\n            new InfoItemDialog.Builder(getActivity(), getContext(), this, item).create().show();\n        } catch (final IllegalArgumentException e) {\n            InfoItemDialog.Builder.reportErrorDuringInitialization(e, item);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Menu\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) {\n        if (DEBUG) {\n            Log.d(TAG, \"onCreateOptionsMenu() called with: \"\n                    + \"menu = [\" + menu + \"], inflater = [\" + inflater + \"]\");\n        }\n        super.onCreateOptionsMenu(menu, inflater);\n        final ActionBar supportActionBar = activity.getSupportActionBar();\n        if (supportActionBar != null) {\n            supportActionBar.setDisplayShowTitleEnabled(true);\n            supportActionBar.setDisplayHomeAsUpEnabled(!useAsFrontPage);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Load and handle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected void startLoading(final boolean forceLoad) {\n        useInitialItemListLoadScrollListener();\n        super.startLoading(forceLoad);\n    }\n\n    protected abstract void loadMoreItems();\n\n    protected abstract boolean hasMoreItems();\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Contract\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void showLoading() {\n        super.showLoading();\n        animateHideRecyclerViewAllowingScrolling(itemsList);\n    }\n\n    @Override\n    public void hideLoading() {\n        super.hideLoading();\n        animate(itemsList, true, 300);\n    }\n\n    @Override\n    public void showEmptyState() {\n        super.showEmptyState();\n        showListFooter(false);\n        animateHideRecyclerViewAllowingScrolling(itemsList);\n    }\n\n    @Override\n    public void showListFooter(final boolean show) {\n        itemsList.post(() -> {\n            if (infoListAdapter != null && itemsList != null) {\n                infoListAdapter.showFooter(show);\n            }\n        });\n    }\n\n    @Override\n    public void handleNextItems(final N result) {\n        isLoading.set(false);\n    }\n\n    @Override\n    public void handleError() {\n        super.handleError();\n        showListFooter(false);\n        animateHideRecyclerViewAllowingScrolling(itemsList);\n    }\n\n    @Override\n    public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences,\n                                          final String key) {\n        if (getString(R.string.list_view_mode_key).equals(key)) {\n            updateFlags |= LIST_MODE_UPDATE_FLAG;\n        }\n    }\n\n    /**\n     * Returns preferred item view mode.\n     * @return ItemViewMode\n     */\n    protected ItemViewMode getItemViewMode() {\n        return ThemeHelper.getItemViewMode(requireContext());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/BaseListInfoFragment.java",
    "content": "package org.schabi.newpipe.fragments.list;\n\nimport static org.schabi.newpipe.extractor.ServiceList.SoundCloud;\n\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.evernote.android.state.State;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.ListExtractor;\nimport org.schabi.newpipe.extractor.ListInfo;\nimport org.schabi.newpipe.extractor.Page;\nimport org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException;\nimport org.schabi.newpipe.util.Constants;\nimport org.schabi.newpipe.views.NewPipeRecyclerView;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Queue;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic abstract class BaseListInfoFragment<I extends InfoItem, L extends ListInfo<I>>\n        extends BaseListFragment<L, ListExtractor.InfoItemsPage<I>> {\n    @State\n    protected int serviceId = Constants.NO_SERVICE_ID;\n    @State\n    protected String name;\n    @State\n    protected String url;\n\n    private final UserAction errorUserAction;\n    protected L currentInfo;\n    @Nullable\n    protected Page currentNextPage;\n    protected Disposable currentWorker;\n\n    protected BaseListInfoFragment(final UserAction errorUserAction) {\n        this.errorUserAction = errorUserAction;\n    }\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n        setTitle(name);\n        showListFooter(hasMoreItems());\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        if (currentWorker != null) {\n            currentWorker.dispose();\n        }\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        // Check if it was loading when the fragment was stopped/paused,\n        if (wasLoading.getAndSet(false)) {\n            if (hasMoreItems() && !infoListAdapter.getItemsList().isEmpty()) {\n                loadMoreItems();\n            } else {\n                doInitialLoadLogic();\n            }\n        }\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        if (currentWorker != null) {\n            currentWorker.dispose();\n            currentWorker = null;\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // State Saving\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void writeTo(final Queue<Object> objectsToSave) {\n        super.writeTo(objectsToSave);\n        objectsToSave.add(currentInfo);\n        objectsToSave.add(currentNextPage);\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public void readFrom(@NonNull final Queue<Object> savedObjects) throws Exception {\n        super.readFrom(savedObjects);\n        currentInfo = (L) savedObjects.poll();\n        currentNextPage = (Page) savedObjects.poll();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Load and handle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected void doInitialLoadLogic() {\n        if (DEBUG) {\n            Log.d(TAG, \"doInitialLoadLogic() called\");\n        }\n        if (currentInfo == null) {\n            startLoading(false);\n        } else {\n            handleResult(currentInfo);\n        }\n    }\n\n    /**\n     * Implement the logic to load the info from the network.<br/>\n     * You can use the default implementations from {@link org.schabi.newpipe.util.ExtractorHelper}.\n     *\n     * @param forceLoad allow or disallow the result to come from the cache\n     * @return Rx {@link Single} containing the {@link ListInfo}\n     */\n    protected abstract Single<L> loadResult(boolean forceLoad);\n\n    @Override\n    public void startLoading(final boolean forceLoad) {\n        super.startLoading(forceLoad);\n\n        showListFooter(false);\n        infoListAdapter.clearStreamItemList();\n\n        currentInfo = null;\n        if (currentWorker != null) {\n            currentWorker.dispose();\n        }\n        currentWorker = loadResult(forceLoad)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe((@NonNull final L result) -> {\n                    isLoading.set(false);\n                    currentInfo = result;\n                    currentNextPage = result.getNextPage();\n                    handleResult(result);\n                }, throwable ->\n                        showError(new ErrorInfo(throwable, errorUserAction,\n                                \"Start loading: \" + url, serviceId, url)));\n    }\n\n    /**\n     * Implement the logic to load more items.\n     * <p>You can use the default implementations\n     * from {@link org.schabi.newpipe.util.ExtractorHelper}.</p>\n     *\n     * @return Rx {@link Single} containing the {@link ListExtractor.InfoItemsPage}\n     */\n    protected abstract Single<ListExtractor.InfoItemsPage<I>> loadMoreItemsLogic();\n\n    @Override\n    protected void loadMoreItems() {\n        isLoading.set(true);\n\n        if (currentWorker != null) {\n            currentWorker.dispose();\n        }\n\n        forbidDownwardFocusScroll();\n\n        currentWorker = loadMoreItemsLogic()\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .doFinally(this::allowDownwardFocusScroll)\n                .subscribe(infoItemsPage -> {\n                    isLoading.set(false);\n                    handleNextItems(infoItemsPage);\n                }, (@NonNull Throwable throwable) ->\n                        dynamicallyShowErrorPanelOrSnackbar(new ErrorInfo(throwable,\n                                errorUserAction, \"Loading more items: \" + url, serviceId, url)));\n    }\n\n    private void forbidDownwardFocusScroll() {\n        if (itemsList instanceof NewPipeRecyclerView) {\n            ((NewPipeRecyclerView) itemsList).setFocusScrollAllowed(false);\n        }\n    }\n\n    private void allowDownwardFocusScroll() {\n        if (itemsList instanceof NewPipeRecyclerView) {\n            ((NewPipeRecyclerView) itemsList).setFocusScrollAllowed(true);\n        }\n    }\n\n    @Override\n    public void handleNextItems(final ListExtractor.InfoItemsPage<I> result) {\n        super.handleNextItems(result);\n\n        currentNextPage = result.getNextPage();\n        infoListAdapter.addInfoItemList(result.getItems());\n\n        showListFooter(hasMoreItems());\n\n        if (!result.getErrors().isEmpty()) {\n            dynamicallyShowErrorPanelOrSnackbar(new ErrorInfo(result.getErrors(), errorUserAction,\n                    \"Get next items of: \" + url, serviceId, url));\n        }\n    }\n\n    @Override\n    protected boolean hasMoreItems() {\n        return Page.isValid(currentNextPage);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Contract\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void handleResult(@NonNull final L result) {\n        super.handleResult(result);\n\n        name = result.getName();\n        setTitle(name);\n\n        if (infoListAdapter.getItemsList().isEmpty()) {\n            if (!result.getRelatedItems().isEmpty()) {\n                infoListAdapter.addInfoItemList(result.getRelatedItems());\n                showListFooter(hasMoreItems());\n            } else if (hasMoreItems()) {\n                loadMoreItems();\n            } else {\n                infoListAdapter.clearStreamItemList();\n                showEmptyState();\n            }\n        }\n\n        if (!result.getErrors().isEmpty()) {\n            final List<Throwable> errors = new ArrayList<>(result.getErrors());\n            // handling ContentNotSupportedException not to show the error but an appropriate string\n            // so that crashes won't be sent uselessly and the user will understand what happened\n            errors.removeIf(ContentNotSupportedException.class::isInstance);\n\n            if (!errors.isEmpty()) {\n                dynamicallyShowErrorPanelOrSnackbar(new ErrorInfo(result.getErrors(),\n                        errorUserAction, \"Start loading: \" + url, serviceId, url));\n            }\n        }\n    }\n\n    @Override\n    public void showEmptyState() {\n        // show \"no streams\" for SoundCloud; otherwise \"no videos\"\n        // showing \"no live streams\" is handled in KioskFragment\n        if (emptyStateView != null) {\n            if (currentInfo.getService() == SoundCloud) {\n                setEmptyStateMessage(R.string.no_streams);\n            } else {\n                setEmptyStateMessage(R.string.no_videos);\n            }\n        }\n        super.showEmptyState();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    protected void setInitialData(final int sid, final String u, final String title) {\n        this.serviceId = sid;\n        this.url = u;\n        this.name = !TextUtils.isEmpty(title) ? title : \"\";\n    }\n\n    private void dynamicallyShowErrorPanelOrSnackbar(final ErrorInfo errorInfo) {\n        if (infoListAdapter.getItemCount() == 0) {\n            // show error panel only if no items already visible\n            showError(errorInfo);\n        } else {\n            isLoading.set(false);\n            showSnackBarError(errorInfo);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/ListViewContract.java",
    "content": "package org.schabi.newpipe.fragments.list;\n\nimport org.schabi.newpipe.fragments.ViewContract;\n\npublic interface ListViewContract<I, N> extends ViewContract<I> {\n    void showListFooter(boolean show);\n\n    void handleNextItems(N result);\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java",
    "content": "package org.schabi.newpipe.fragments.list.channel;\n\nimport static org.schabi.newpipe.extractor.stream.StreamExtractor.UNKNOWN_SUBSCRIBER_COUNT;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.LinearLayout;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.evernote.android.state.State;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.channel.ChannelInfo;\nimport org.schabi.newpipe.extractor.stream.Description;\nimport org.schabi.newpipe.fragments.detail.BaseDescriptionFragment;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.Localization;\n\nimport java.util.List;\n\npublic class ChannelAboutFragment extends BaseDescriptionFragment {\n    @State\n    protected ChannelInfo channelInfo;\n\n    ChannelAboutFragment(@NonNull final ChannelInfo channelInfo) {\n        this.channelInfo = channelInfo;\n    }\n\n    public ChannelAboutFragment() {\n        // keep empty constructor for State when resuming fragment from memory\n    }\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n        binding.constraintLayout.setPadding(0, DeviceUtils.dpToPx(8, requireContext()), 0, 0);\n    }\n\n    @Nullable\n    @Override\n    protected Description getDescription() {\n        return new Description(channelInfo.getDescription(), Description.PLAIN_TEXT);\n    }\n\n    @NonNull\n    @Override\n    protected StreamingService getService() {\n        return channelInfo.getService();\n    }\n\n    @Override\n    protected int getServiceId() {\n        return channelInfo.getServiceId();\n    }\n\n    @Nullable\n    @Override\n    protected String getStreamUrl() {\n        return null;\n    }\n\n    @NonNull\n    @Override\n    public List<String> getTags() {\n        return channelInfo.getTags();\n    }\n\n    @Override\n    protected void setupMetadata(final LayoutInflater inflater,\n                                 final LinearLayout layout) {\n        // There is no upload date available for channels, so hide the relevant UI element\n        binding.detailUploadDateView.setVisibility(View.GONE);\n\n        if (channelInfo == null) {\n            return;\n        }\n\n        if (channelInfo.getSubscriberCount() != UNKNOWN_SUBSCRIBER_COUNT) {\n            addMetadataItem(inflater, layout, false, R.string.metadata_subscribers,\n                    Localization.localizeNumber(channelInfo.getSubscriberCount()));\n        }\n\n        addImagesMetadataItem(inflater, layout, R.string.metadata_avatars,\n                channelInfo.getAvatars());\n        addImagesMetadataItem(inflater, layout, R.string.metadata_banners,\n                channelInfo.getBanners());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java",
    "content": "package org.schabi.newpipe.fragments.list.channel;\n\nimport static org.schabi.newpipe.ktx.TextViewUtils.animateTextColor;\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\nimport static org.schabi.newpipe.ktx.ViewUtils.animateBackgroundColor;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.util.TypedValue;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.content.ContextCompat;\nimport androidx.core.graphics.ColorUtils;\nimport androidx.core.view.MenuProvider;\nimport androidx.preference.PreferenceManager;\n\nimport com.evernote.android.state.State;\nimport com.google.android.material.snackbar.Snackbar;\nimport com.google.android.material.tabs.TabLayout;\nimport com.jakewharton.rxbinding4.view.RxView;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.subscription.NotificationMode;\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity;\nimport org.schabi.newpipe.databinding.FragmentChannelBinding;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.channel.ChannelInfo;\nimport org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException;\nimport org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;\nimport org.schabi.newpipe.fragments.BaseStateFragment;\nimport org.schabi.newpipe.fragments.detail.TabAdapter;\nimport org.schabi.newpipe.ktx.AnimationType;\nimport org.schabi.newpipe.local.feed.notifications.NotificationHelper;\nimport org.schabi.newpipe.local.subscription.SubscriptionManager;\nimport org.schabi.newpipe.util.ChannelTabHelper;\nimport org.schabi.newpipe.util.Constants;\nimport org.schabi.newpipe.util.ExtractorHelper;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.StateSaver;\nimport org.schabi.newpipe.util.ThemeHelper;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\nimport org.schabi.newpipe.util.image.CoilHelper;\nimport org.schabi.newpipe.util.image.ImageStrategy;\n\nimport java.util.List;\nimport java.util.Queue;\nimport java.util.concurrent.TimeUnit;\n\nimport coil3.util.CoilUtils;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Observable;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.functions.Action;\nimport io.reactivex.rxjava3.functions.Consumer;\nimport io.reactivex.rxjava3.functions.Function;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic class ChannelFragment extends BaseStateFragment<ChannelInfo>\n        implements StateSaver.WriteRead {\n\n    private static final int BUTTON_DEBOUNCE_INTERVAL = 100;\n\n    @State\n    protected int serviceId = Constants.NO_SERVICE_ID;\n    @State\n    protected String name;\n    @State\n    protected String url;\n\n    private ChannelInfo currentInfo;\n    private Disposable currentWorker;\n    private final CompositeDisposable disposables = new CompositeDisposable();\n    private Disposable subscribeButtonMonitor;\n    private SubscriptionManager subscriptionManager;\n    private int lastTab;\n    private boolean channelContentNotSupported = false;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Views\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private FragmentChannelBinding binding;\n    private TabAdapter tabAdapter;\n\n    private MenuItem menuRssButton;\n    private MenuItem menuNotifyButton;\n    private SubscriptionEntity channelSubscription;\n    private MenuProvider menuProvider;\n\n    public static ChannelFragment getInstance(final int serviceId, final String url,\n                                              final String name) {\n        final ChannelFragment instance = new ChannelFragment();\n        instance.setInitialData(serviceId, url, name);\n        return instance;\n    }\n\n    private void setInitialData(final int sid, final String u, final String title) {\n        this.serviceId = sid;\n        this.url = u;\n        this.name = !TextUtils.isEmpty(title) ? title : \"\";\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // LifeCycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onAttach(@NonNull final Context context) {\n        super.onAttach(context);\n        subscriptionManager = new SubscriptionManager(activity);\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        binding = FragmentChannelBinding.inflate(inflater, container, false);\n        return binding.getRoot();\n    }\n\n    @Override\n    public void onViewCreated(@NonNull final View rootView, final Bundle savedInstanceState) {\n        super.onViewCreated(rootView, savedInstanceState);\n            menuProvider = new MenuProvider() {\n                @Override\n                public void onCreateMenu(@NonNull final Menu menu,\n                                         @NonNull final MenuInflater inflater) {\n                    inflater.inflate(R.menu.menu_channel, menu);\n\n                    if (DEBUG) {\n                        Log.d(TAG, \"onCreateOptionsMenu() called with: \"\n                                + \"menu = [\" + menu + \"], inflater = [\" + inflater + \"]\");\n                    }\n\n                }\n\n                @Override\n                public void onPrepareMenu(@NonNull final Menu menu) {\n                    menuRssButton = menu.findItem(R.id.menu_item_rss);\n                    menuNotifyButton = menu.findItem(R.id.menu_item_notify);\n                    updateRssButton();\n                    updateNotifyButton(channelSubscription);\n                }\n\n                @Override\n                public boolean onMenuItemSelected(@NonNull final MenuItem item) {\n                    final int itemId = item.getItemId();\n                    if (itemId == R.id.menu_item_notify) {\n                        final boolean value = !item.isChecked();\n                        item.setEnabled(false);\n                        setNotify(value);\n                    } else if (itemId == R.id.action_settings) {\n                        NavigationHelper.openSettings(requireContext());\n                    } else if (itemId == R.id.menu_item_rss) {\n                        if (currentInfo != null) {\n                            ShareUtils.openUrlInApp(requireContext(), currentInfo.getFeedUrl());\n                        }\n                    } else if (itemId == R.id.menu_item_openInBrowser) {\n                        if (currentInfo != null) {\n                            ShareUtils.openUrlInBrowser(requireContext(),\n                                    currentInfo.getOriginalUrl());\n                        }\n                    } else if (itemId == R.id.menu_item_share) {\n                        if (currentInfo != null) {\n                            ShareUtils.shareText(requireContext(), name,\n                                    currentInfo.getOriginalUrl(), currentInfo.getAvatars());\n                        }\n                    } else {\n                        return false;\n                    }\n                    return true;\n                }\n            };\n            activity.addMenuProvider(menuProvider);\n    }\n\n    @Override // called from onViewCreated in BaseFragment.onViewCreated\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n\n        tabAdapter = new TabAdapter(getChildFragmentManager());\n        binding.viewPager.setAdapter(tabAdapter);\n        binding.tabLayout.setupWithViewPager(binding.viewPager);\n\n        setTitle(name);\n        binding.channelTitleView.setText(name);\n        if (!ImageStrategy.shouldLoadImages()) {\n            // do not waste space for the banner if it is not going to be loaded\n            binding.channelBannerImage.setImageDrawable(null);\n        }\n    }\n\n    @Override\n    protected void initListeners() {\n        super.initListeners();\n\n        final View.OnClickListener openSubChannel = v -> {\n            if (!TextUtils.isEmpty(currentInfo.getParentChannelUrl())) {\n                try {\n                    NavigationHelper.openChannelFragment(getFM(), currentInfo.getServiceId(),\n                            currentInfo.getParentChannelUrl(),\n                            currentInfo.getParentChannelName());\n                } catch (final Exception e) {\n                    ErrorUtil.showUiErrorSnackbar(this, \"Opening channel fragment\", e);\n                }\n            } else if (DEBUG) {\n                Log.i(TAG, \"Can't open parent channel because we got no channel URL\");\n            }\n        };\n        binding.subChannelAvatarView.setOnClickListener(openSubChannel);\n        binding.subChannelTitleView.setOnClickListener(openSubChannel);\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        if (menuProvider != null) {\n            activity.removeMenuProvider(menuProvider);\n        }\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        if (currentWorker != null) {\n            currentWorker.dispose();\n        }\n        disposables.clear();\n        binding = null;\n        menuProvider = null;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Channel Subscription\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void monitorSubscription(final ChannelInfo info) {\n        final Consumer<Throwable> onError = (final Throwable throwable) -> {\n            animate(binding.channelSubscribeButton, false, 100);\n            showSnackBarError(new ErrorInfo(throwable, UserAction.SUBSCRIPTION_GET,\n                    \"Get subscription status\", currentInfo));\n        };\n\n        final Observable<List<SubscriptionEntity>> observable = subscriptionManager\n                .subscriptionTable()\n                .getSubscriptionFlowable(info.getServiceId(), info.getUrl())\n                .toObservable();\n\n        disposables.add(observable\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(getSubscribeUpdateMonitor(info), onError));\n\n        disposables.add(observable\n                .map(List::isEmpty)\n                .distinctUntilChanged()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(isEmpty -> updateSubscribeButton(!isEmpty), onError));\n\n        disposables.add(observable\n                .map(List::isEmpty)\n                .distinctUntilChanged()\n                .skip(1) // channel has just been opened\n                .filter(x -> NotificationHelper.areNewStreamsNotificationsEnabled(requireContext()))\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(isEmpty -> {\n                    if (!isEmpty) {\n                        showNotifySnackbar();\n                    }\n                }, onError));\n    }\n\n    private Function<Object, Object> mapOnSubscribe(final SubscriptionEntity subscription) {\n        return (@NonNull final Object o) -> {\n            subscriptionManager.insertSubscription(subscription);\n            return o;\n        };\n    }\n\n    private Function<Object, Object> mapOnUnsubscribe(final SubscriptionEntity subscription) {\n        return (@NonNull final Object o) -> {\n            subscriptionManager.deleteSubscription(subscription);\n            return o;\n        };\n    }\n\n    private void updateSubscription(final ChannelInfo info) {\n        if (DEBUG) {\n            Log.d(TAG, \"updateSubscription() called with: info = [\" + info + \"]\");\n        }\n        final Action onComplete = () -> {\n            if (DEBUG) {\n                Log.d(TAG, \"Updated subscription: \" + info.getUrl());\n            }\n        };\n\n        final Consumer<Throwable> onError = (@NonNull Throwable throwable) ->\n                showSnackBarError(new ErrorInfo(throwable, UserAction.SUBSCRIPTION_UPDATE,\n                        \"Updating subscription for \" + info.getUrl(), info));\n\n        disposables.add(subscriptionManager.updateChannelInfo(info)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(onComplete, onError));\n    }\n\n    private Disposable monitorSubscribeButton(final Function<Object, Object> action) {\n        final Consumer<Object> onNext = (@NonNull final Object o) -> {\n            if (DEBUG) {\n                Log.d(TAG, \"Changed subscription status to this channel!\");\n            }\n        };\n\n        final Consumer<Throwable> onError = (@NonNull Throwable throwable) ->\n                showSnackBarError(new ErrorInfo(throwable, UserAction.SUBSCRIPTION_CHANGE,\n                        \"Changing subscription for \" + currentInfo.getUrl(), currentInfo));\n\n        /* Emit clicks from main thread unto io thread */\n        return RxView.clicks(binding.channelSubscribeButton)\n                .subscribeOn(AndroidSchedulers.mainThread())\n                .observeOn(Schedulers.io())\n                .debounce(BUTTON_DEBOUNCE_INTERVAL, TimeUnit.MILLISECONDS) // Ignore rapid clicks\n                .map(action)\n                .subscribe(onNext, onError);\n    }\n\n    private Consumer<List<SubscriptionEntity>> getSubscribeUpdateMonitor(final ChannelInfo info) {\n        return (final List<SubscriptionEntity> subscriptionEntities) -> {\n            if (DEBUG) {\n                Log.d(TAG, \"subscriptionManager.subscriptionTable.doOnNext() called with: \"\n                        + \"subscriptionEntities = [\" + subscriptionEntities + \"]\");\n            }\n            if (subscribeButtonMonitor != null) {\n                subscribeButtonMonitor.dispose();\n            }\n\n            if (subscriptionEntities.isEmpty()) {\n                if (DEBUG) {\n                    Log.d(TAG, \"No subscription to this channel!\");\n                }\n                final SubscriptionEntity channel = new SubscriptionEntity();\n                channel.setServiceId(info.getServiceId());\n                channel.setUrl(info.getUrl());\n                channel.setName(info.getName());\n                channel.setAvatarUrl(ImageStrategy.imageListToDbUrl(info.getAvatars()));\n                channel.setDescription(info.getDescription());\n                channel.setSubscriberCount(info.getSubscriberCount());\n                channelSubscription = null;\n                updateNotifyButton(null);\n                subscribeButtonMonitor = monitorSubscribeButton(mapOnSubscribe(channel));\n            } else {\n                if (DEBUG) {\n                    Log.d(TAG, \"Found subscription to this channel!\");\n                }\n                channelSubscription = subscriptionEntities.get(0);\n                updateNotifyButton(channelSubscription);\n                subscribeButtonMonitor =\n                        monitorSubscribeButton(mapOnUnsubscribe(channelSubscription));\n            }\n        };\n    }\n\n    private void updateSubscribeButton(final boolean isSubscribed) {\n        if (DEBUG) {\n            Log.d(TAG, \"updateSubscribeButton() called with: \"\n                    + \"isSubscribed = [\" + isSubscribed + \"]\");\n        }\n\n        final boolean isButtonVisible = binding.channelSubscribeButton.getVisibility()\n                == View.VISIBLE;\n        final int backgroundDuration = isButtonVisible ? 300 : 0;\n        final int textDuration = isButtonVisible ? 200 : 0;\n\n        final int subscribedBackground = ContextCompat\n                .getColor(activity, R.color.subscribed_background_color);\n        final int subscribedText = ContextCompat.getColor(activity, R.color.subscribed_text_color);\n        final int subscribeBackground = ColorUtils.blendARGB(ThemeHelper\n                .resolveColorFromAttr(activity, R.attr.colorPrimary), subscribedBackground, 0.35f);\n        final int subscribeText = ContextCompat.getColor(activity, R.color.subscribe_text_color);\n\n        if (isSubscribed) {\n            binding.channelSubscribeButton.setText(R.string.subscribed_button_title);\n            animateBackgroundColor(binding.channelSubscribeButton, backgroundDuration,\n                    subscribeBackground, subscribedBackground);\n            animateTextColor(binding.channelSubscribeButton, textDuration, subscribeText,\n                    subscribedText);\n        } else {\n            binding.channelSubscribeButton.setText(R.string.subscribe_button_title);\n            animateBackgroundColor(binding.channelSubscribeButton, backgroundDuration,\n                    subscribedBackground, subscribeBackground);\n            animateTextColor(binding.channelSubscribeButton, textDuration, subscribedText,\n                    subscribeText);\n        }\n\n        animate(binding.channelSubscribeButton, true, 100, AnimationType.LIGHT_SCALE_AND_ALPHA);\n    }\n\n    private void updateRssButton() {\n        if (menuRssButton == null || currentInfo == null) {\n            return;\n        }\n        menuRssButton.setVisible(!TextUtils.isEmpty(currentInfo.getFeedUrl()));\n    }\n\n    private void updateNotifyButton(@Nullable final SubscriptionEntity subscription) {\n        if (menuNotifyButton == null) {\n            return;\n        }\n        if (subscription != null) {\n            menuNotifyButton.setEnabled(\n                    NotificationHelper.areNewStreamsNotificationsEnabled(requireContext())\n            );\n            menuNotifyButton.setChecked(\n                    subscription.getNotificationMode() == NotificationMode.ENABLED\n            );\n        }\n\n        menuNotifyButton.setVisible(subscription != null);\n    }\n\n    private void setNotify(final boolean isEnabled) {\n        disposables.add(\n                subscriptionManager\n                        .updateNotificationMode(\n                                currentInfo.getServiceId(),\n                                currentInfo.getUrl(),\n                                isEnabled ? NotificationMode.ENABLED : NotificationMode.DISABLED)\n                        .subscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .subscribe()\n        );\n    }\n\n    /**\n     * Show a snackbar with the option to enable notifications on new streams for this channel.\n     */\n    private void showNotifySnackbar() {\n        Snackbar.make(binding.getRoot(), R.string.you_successfully_subscribed, Snackbar.LENGTH_LONG)\n                .setAction(R.string.get_notified, v -> setNotify(true))\n                .setActionTextColor(Color.YELLOW)\n                .show();\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void updateTabs() {\n        tabAdapter.clearAllItems();\n\n        if (currentInfo != null && !channelContentNotSupported) {\n            final Context context = requireContext();\n            final SharedPreferences preferences = PreferenceManager\n                    .getDefaultSharedPreferences(context);\n\n            for (final ListLinkHandler linkHandler : currentInfo.getTabs()) {\n                final String tab = linkHandler.getContentFilters().get(0);\n                if (ChannelTabHelper.showChannelTab(context, preferences, tab)) {\n                    final ChannelTabFragment channelTabFragment =\n                            ChannelTabFragment.getInstance(serviceId, linkHandler, name);\n                    channelTabFragment.useAsFrontPage(useAsFrontPage);\n                    tabAdapter.addFragment(channelTabFragment,\n                            context.getString(ChannelTabHelper.getTranslationKey(tab)));\n                }\n            }\n\n            if (ChannelTabHelper.showChannelTab(\n                    context, preferences, R.string.show_channel_tabs_about)) {\n                tabAdapter.addFragment(\n                        new ChannelAboutFragment(currentInfo),\n                        context.getString(R.string.channel_tab_about));\n            }\n        }\n\n        tabAdapter.notifyDataSetUpdate();\n\n        for (int i = 0; i < tabAdapter.getCount(); i++) {\n            binding.tabLayout.getTabAt(i).setText(tabAdapter.getItemTitle(i));\n        }\n\n        // Restore previously selected tab\n        final TabLayout.Tab ltab = binding.tabLayout.getTabAt(lastTab);\n        if (ltab != null) {\n            binding.tabLayout.selectTab(ltab);\n        }\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // State Saving\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public String generateSuffix() {\n        return null;\n    }\n\n    @Override\n    public void writeTo(final Queue<Object> objectsToSave) {\n        objectsToSave.add(currentInfo);\n        objectsToSave.add(binding == null ? 0 : binding.tabLayout.getSelectedTabPosition());\n    }\n\n    @Override\n    public void readFrom(@NonNull final Queue<Object> savedObjects) {\n        currentInfo = (ChannelInfo) savedObjects.poll();\n        lastTab = (Integer) savedObjects.poll();\n    }\n\n    @Override\n    public void onSaveInstanceState(final @NonNull Bundle outState) {\n        super.onSaveInstanceState(outState);\n        if (binding != null) {\n            outState.putInt(\"LastTab\", binding.tabLayout.getSelectedTabPosition());\n        }\n    }\n\n    @Override\n    protected void onRestoreInstanceState(@NonNull final Bundle savedInstanceState) {\n        super.onRestoreInstanceState(savedInstanceState);\n        lastTab = savedInstanceState.getInt(\"LastTab\", 0);\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Contract\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected void doInitialLoadLogic() {\n        if (currentInfo == null) {\n            startLoading(false);\n        } else {\n            handleResult(currentInfo);\n        }\n    }\n\n    @Override\n    public void startLoading(final boolean forceLoad) {\n        super.startLoading(forceLoad);\n\n        currentInfo = null;\n        updateTabs();\n        if (currentWorker != null) {\n            currentWorker.dispose();\n        }\n\n        runWorker(forceLoad);\n    }\n\n    private void runWorker(final boolean forceLoad) {\n        currentWorker = ExtractorHelper.getChannelInfo(serviceId, url, forceLoad)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(result -> {\n                    isLoading.set(false);\n                    handleResult(result);\n                }, throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_CHANNEL,\n                        url == null ? \"No URL\" : url, serviceId, url)));\n    }\n\n    @Override\n    public void showLoading() {\n        super.showLoading();\n        CoilUtils.dispose(binding.channelAvatarView);\n        CoilUtils.dispose(binding.channelBannerImage);\n        CoilUtils.dispose(binding.subChannelAvatarView);\n        animate(binding.channelSubscribeButton, false, 100);\n    }\n\n    @Override\n    public void handleResult(@NonNull final ChannelInfo result) {\n        super.handleResult(result);\n        currentInfo = result;\n        setInitialData(result.getServiceId(), result.getOriginalUrl(), result.getName());\n\n        if (ImageStrategy.shouldLoadImages() && !result.getBanners().isEmpty()) {\n            CoilHelper.INSTANCE.loadBanner(binding.channelBannerImage, result.getBanners());\n        } else {\n            // do not waste space for the banner, if the user disabled images or there is not one\n            binding.channelBannerImage.setImageDrawable(null);\n        }\n\n        CoilHelper.INSTANCE.loadAvatar(binding.channelAvatarView, result.getAvatars());\n        CoilHelper.INSTANCE.loadAvatar(binding.subChannelAvatarView,\n                result.getParentChannelAvatars());\n\n        binding.channelTitleView.setText(result.getName());\n        binding.channelSubscriberView.setVisibility(View.VISIBLE);\n        if (result.getSubscriberCount() >= 0) {\n            binding.channelSubscriberView.setText(Localization\n                    .shortSubscriberCount(activity, result.getSubscriberCount()));\n        } else {\n            binding.channelSubscriberView.setText(R.string.subscribers_count_not_available);\n        }\n\n        if (!TextUtils.isEmpty(currentInfo.getParentChannelName())) {\n            binding.subChannelTitleView.setText(String.format(\n                    getString(R.string.channel_created_by),\n                    currentInfo.getParentChannelName())\n            );\n            binding.subChannelTitleView.setVisibility(View.VISIBLE);\n            binding.subChannelAvatarView.setVisibility(View.VISIBLE);\n        }\n\n        updateRssButton();\n\n        channelContentNotSupported = false;\n        for (final Throwable throwable : result.getErrors()) {\n            if (throwable instanceof ContentNotSupportedException) {\n                channelContentNotSupported = true;\n                showContentNotSupportedIfNeeded();\n                break;\n            }\n        }\n\n        disposables.clear();\n        if (subscribeButtonMonitor != null) {\n            subscribeButtonMonitor.dispose();\n        }\n\n        updateTabs();\n        updateSubscription(result);\n        monitorSubscription(result);\n    }\n\n    private void showContentNotSupportedIfNeeded() {\n        // channelBinding might not be initialized when handleResult() is called\n        // (e.g. after rotating the screen, #6696)\n        if (!channelContentNotSupported || binding == null) {\n            return;\n        }\n\n        binding.errorContentNotSupported.setVisibility(View.VISIBLE);\n        binding.channelKaomoji.setText(\"(︶︹︺)\");\n        binding.channelKaomoji.setTextSize(TypedValue.COMPLEX_UNIT_SP, 45f);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java",
    "content": "package org.schabi.newpipe.fragments.list.channel;\n\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.evernote.android.state.State;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.PlaylistControlBinding;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.ListExtractor;\nimport org.schabi.newpipe.extractor.channel.tabs.ChannelTabInfo;\nimport org.schabi.newpipe.extractor.exceptions.ParsingException;\nimport org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;\nimport org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;\nimport org.schabi.newpipe.extractor.linkhandler.ReadyChannelTabListLinkHandler;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.fragments.list.BaseListInfoFragment;\nimport org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder;\nimport org.schabi.newpipe.player.playqueue.ChannelTabPlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.util.ChannelTabHelper;\nimport org.schabi.newpipe.util.ExtractorHelper;\nimport org.schabi.newpipe.util.PlayButtonHelper;\n\nimport java.util.List;\nimport java.util.function.Supplier;\nimport java.util.stream.Collectors;\n\nimport io.reactivex.rxjava3.core.Single;\n\npublic class ChannelTabFragment extends BaseListInfoFragment<InfoItem, ChannelTabInfo>\n        implements PlaylistControlViewHolder {\n\n    // states must be protected and not private for State being able to access them\n    @State\n    protected ListLinkHandler tabHandler;\n    @State\n    protected String channelName;\n\n    private PlaylistControlBinding playlistControlBinding;\n\n    @NonNull\n    public static ChannelTabFragment getInstance(final int serviceId,\n                                                 final ListLinkHandler tabHandler,\n                                                 final String channelName) {\n        final ChannelTabFragment instance = new ChannelTabFragment();\n        instance.serviceId = serviceId;\n        instance.tabHandler = tabHandler;\n        instance.channelName = channelName;\n        return instance;\n    }\n\n    public ChannelTabFragment() {\n        super(UserAction.REQUESTED_CHANNEL);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // LifeCycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setHasOptionsMenu(false);\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_channel_tab, container, false);\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        playlistControlBinding = null;\n    }\n\n    @Override\n    protected Supplier<View> getListHeaderSupplier() {\n        if (ChannelTabHelper.isStreamsTab(tabHandler)) {\n            playlistControlBinding = PlaylistControlBinding\n                    .inflate(activity.getLayoutInflater(), itemsList, false);\n            return playlistControlBinding::getRoot;\n        }\n        return null;\n    }\n\n    @Override\n    protected Single<ChannelTabInfo> loadResult(final boolean forceLoad) {\n        return ExtractorHelper.getChannelTab(serviceId, tabHandler, forceLoad);\n    }\n\n    @Override\n    protected Single<ListExtractor.InfoItemsPage<InfoItem>> loadMoreItemsLogic() {\n        return ExtractorHelper.getMoreChannelTabItems(serviceId, tabHandler, currentNextPage);\n    }\n\n    @Override\n    public void setTitle(final String title) {\n        // The channel name is displayed as title in the toolbar.\n        // The title is always a description of the content of the tab fragment.\n        // It should be unique for each channel because multiple channel tabs\n        // can be added to the main page. Therefore, the channel name is used.\n        // Using the title variable would cause the title to be the same for all channel tabs.\n        super.setTitle(channelName);\n    }\n\n    @Override\n    public void handleResult(@NonNull final ChannelTabInfo result) {\n        super.handleResult(result);\n\n        // FIXME this is a really hacky workaround, to avoid storing useless data in the fragment\n        //  state. The problem is, `ReadyChannelTabListLinkHandler` might contain raw JSON data that\n        //  uses a lot of memory (e.g. ~800KB for YouTube). While 800KB doesn't seem much, if\n        //  you combine just a couple of channel tab fragments you easily go over the 1MB\n        //  save&restore transaction limit, and get `TransactionTooLargeException`s. A proper\n        //  solution would require rethinking about `ReadyChannelTabListLinkHandler`s.\n        if (tabHandler instanceof ReadyChannelTabListLinkHandler) {\n            try {\n                // once `handleResult` is called, the parsed data was already saved to cache, so\n                // we can discard any raw data in ReadyChannelTabListLinkHandler and create a\n                // link handler with identical properties, but without any raw data\n                final ListLinkHandlerFactory channelTabLHFactory = result.getService()\n                        .getChannelTabLHFactory();\n                if (channelTabLHFactory != null) {\n                    // some services do not not have a ChannelTabLHFactory\n                    tabHandler = channelTabLHFactory.fromQuery(tabHandler.getId(),\n                            tabHandler.getContentFilters(), tabHandler.getSortFilter());\n                }\n            } catch (final ParsingException e) {\n                // silently ignore the error, as the app can continue to function normally\n                Log.w(TAG, \"Could not recreate channel tab handler\", e);\n            }\n        }\n\n        if (playlistControlBinding != null) {\n            // PlaylistControls should be visible only if there is some item in\n            // infoListAdapter other than header\n            if (infoListAdapter.getItemCount() > 1) {\n                playlistControlBinding.getRoot().setVisibility(View.VISIBLE);\n            } else {\n                playlistControlBinding.getRoot().setVisibility(View.GONE);\n            }\n\n            PlayButtonHelper.initPlaylistControlClickListener(\n                    activity, playlistControlBinding, this);\n        }\n    }\n\n    @Override\n    public PlayQueue getPlayQueue() {\n        final List<StreamInfoItem> streamItems = infoListAdapter.getItemsList().stream()\n                .filter(StreamInfoItem.class::isInstance)\n                .map(StreamInfoItem.class::cast)\n                .collect(Collectors.toList());\n\n        return new ChannelTabPlayQueue(currentInfo.getServiceId(), tabHandler,\n                currentInfo.getNextPage(), streamItems, 0);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesFragment.java",
    "content": "package org.schabi.newpipe.fragments.list.comments;\n\nimport static org.schabi.newpipe.util.ServiceHelper.getServiceById;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.constraintlayout.widget.ConstraintLayout;\nimport androidx.core.text.HtmlCompat;\n\nimport com.evernote.android.state.State;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.CommentRepliesHeaderBinding;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.ListExtractor;\nimport org.schabi.newpipe.extractor.comments.CommentsInfoItem;\nimport org.schabi.newpipe.fragments.list.BaseListInfoFragment;\nimport org.schabi.newpipe.info_list.ItemViewMode;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.ExtractorHelper;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.image.CoilHelper;\nimport org.schabi.newpipe.util.image.ImageStrategy;\nimport org.schabi.newpipe.util.text.TextLinkifier;\nimport org.schabi.newpipe.util.text.LongPressLinkMovementMethod;\n\nimport java.util.Queue;\nimport java.util.function.Supplier;\n\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\n\npublic final class CommentRepliesFragment\n        extends BaseListInfoFragment<CommentsInfoItem, CommentRepliesInfo> {\n\n    public static final String TAG = CommentRepliesFragment.class.getSimpleName();\n\n    @State\n    CommentsInfoItem commentsInfoItem; // the comment to show replies of\n    private final CompositeDisposable disposables = new CompositeDisposable();\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Constructors and lifecycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    // only called by the Android framework, after which readFrom is called and restores all data\n    public CommentRepliesFragment() {\n        super(UserAction.REQUESTED_COMMENT_REPLIES);\n    }\n\n    public CommentRepliesFragment(@NonNull final CommentsInfoItem commentsInfoItem) {\n        this();\n        this.commentsInfoItem = commentsInfoItem;\n        // setting \"\" as title since the title will be properly set right after\n        setInitialData(commentsInfoItem.getServiceId(), commentsInfoItem.getUrl(), \"\");\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_comments, container, false);\n    }\n\n    @Override\n    public void onDestroyView() {\n        disposables.clear();\n        super.onDestroyView();\n    }\n\n    @Override\n    protected Supplier<View> getListHeaderSupplier() {\n        return () -> {\n            final CommentRepliesHeaderBinding binding = CommentRepliesHeaderBinding\n                    .inflate(activity.getLayoutInflater(), itemsList, false);\n            final CommentsInfoItem item = commentsInfoItem;\n\n            // load the author avatar\n            CoilHelper.INSTANCE.loadAvatar(binding.authorAvatar, item.getUploaderAvatars());\n            binding.authorAvatar.setVisibility(ImageStrategy.shouldLoadImages()\n                    ? View.VISIBLE : View.GONE);\n\n            // setup author name and comment date\n            binding.authorName.setText(item.getUploaderName());\n            binding.uploadDate.setText(Localization.relativeTimeOrTextual(\n                    getContext(), item.getUploadDate(), item.getTextualUploadDate()));\n            binding.authorTouchArea.setOnClickListener(\n                    v -> NavigationHelper.openCommentAuthorIfPresent(requireActivity(), item));\n\n            // setup like count, hearted and pinned\n            binding.thumbsUpCount.setText(\n                    Localization.likeCount(requireContext(), item.getLikeCount()));\n            // for heartImage goneMarginEnd was used, but there is no way to tell ConstraintLayout\n            // not to use a different margin only when both the next two views are gone\n            ((ConstraintLayout.LayoutParams) binding.thumbsUpCount.getLayoutParams())\n                    .setMarginEnd(DeviceUtils.dpToPx(\n                            (item.isHeartedByUploader() || item.isPinned() ? 8 : 16),\n                            requireContext()));\n            binding.heartImage.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE);\n            binding.pinnedImage.setVisibility(item.isPinned() ? View.VISIBLE : View.GONE);\n\n            // setup comment content\n            TextLinkifier.fromDescription(binding.commentContent, item.getCommentText(),\n                    HtmlCompat.FROM_HTML_MODE_LEGACY, getServiceById(item.getServiceId()),\n                    item.getUrl(), disposables, null);\n            binding.commentContent.setMovementMethod(LongPressLinkMovementMethod.getInstance());\n            return binding.getRoot();\n        };\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // State saving\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void writeTo(final Queue<Object> objectsToSave) {\n        super.writeTo(objectsToSave);\n        objectsToSave.add(commentsInfoItem);\n    }\n\n    @Override\n    public void readFrom(@NonNull final Queue<Object> savedObjects) throws Exception {\n        super.readFrom(savedObjects);\n        commentsInfoItem = (CommentsInfoItem) savedObjects.poll();\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Data loading\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected Single<CommentRepliesInfo> loadResult(final boolean forceLoad) {\n        return Single.fromCallable(() -> new CommentRepliesInfo(commentsInfoItem,\n                // the reply count string will be shown as the activity title\n                Localization.replyCount(requireContext(), commentsInfoItem.getReplyCount())));\n    }\n\n    @Override\n    protected Single<ListExtractor.InfoItemsPage<CommentsInfoItem>> loadMoreItemsLogic() {\n        // commentsInfoItem.getUrl() should contain the url of the original\n        // ListInfo<CommentsInfoItem>, which should be the stream url\n        return ExtractorHelper.getMoreCommentItems(\n                serviceId, commentsInfoItem.getUrl(), currentNextPage);\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected ItemViewMode getItemViewMode() {\n        return ItemViewMode.LIST;\n    }\n\n    /**\n     * @return the comment to which the replies are shown\n     */\n    public CommentsInfoItem getCommentsInfoItem() {\n        return commentsInfoItem;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentRepliesInfo.java",
    "content": "package org.schabi.newpipe.fragments.list.comments;\n\nimport org.schabi.newpipe.extractor.ListInfo;\nimport org.schabi.newpipe.extractor.comments.CommentsInfoItem;\nimport org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;\n\nimport java.util.Collections;\n\npublic final class CommentRepliesInfo extends ListInfo<CommentsInfoItem> {\n    /**\n     * This class is used to wrap the comment replies page into a ListInfo object.\n     *\n     * @param comment the comment from which to get replies\n     * @param name will be shown as the fragment title\n     */\n    public CommentRepliesInfo(final CommentsInfoItem comment, final String name) {\n        super(comment.getServiceId(),\n                new ListLinkHandler(\"\", \"\", \"\", Collections.emptyList(), null), name);\n        setNextPage(comment.getReplies());\n        setRelatedItems(Collections.emptyList()); // since it must be non-null\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/comments/CommentsFragment.java",
    "content": "package org.schabi.newpipe.fragments.list.comments;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.ListExtractor;\nimport org.schabi.newpipe.extractor.comments.CommentsInfo;\nimport org.schabi.newpipe.extractor.comments.CommentsInfoItem;\nimport org.schabi.newpipe.fragments.list.BaseListInfoFragment;\nimport org.schabi.newpipe.info_list.ItemViewMode;\nimport org.schabi.newpipe.ktx.ViewUtils;\nimport org.schabi.newpipe.util.ExtractorHelper;\n\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\n\npublic class CommentsFragment extends BaseListInfoFragment<CommentsInfoItem, CommentsInfo> {\n    private final CompositeDisposable disposables = new CompositeDisposable();\n\n    private TextView emptyStateDesc;\n\n    public static CommentsFragment getInstance(final int serviceId, final String url,\n                                               final String name) {\n        final CommentsFragment instance = new CommentsFragment();\n        instance.setInitialData(serviceId, url, name);\n        return instance;\n    }\n\n    public CommentsFragment() {\n        super(UserAction.REQUESTED_COMMENTS);\n    }\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n\n        emptyStateDesc = rootView.findViewById(R.id.empty_state_desc);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // LifeCycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_comments, container, false);\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        disposables.clear();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Load and handle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected Single<ListExtractor.InfoItemsPage<CommentsInfoItem>> loadMoreItemsLogic() {\n        return ExtractorHelper.getMoreCommentItems(serviceId, currentInfo, currentNextPage);\n    }\n\n    @Override\n    protected Single<CommentsInfo> loadResult(final boolean forceLoad) {\n        return ExtractorHelper.getCommentsInfo(serviceId, url, forceLoad);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Contract\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void handleResult(@NonNull final CommentsInfo result) {\n        super.handleResult(result);\n\n        emptyStateDesc.setText(\n                result.isCommentsDisabled()\n                        ? R.string.comments_are_disabled\n                        : R.string.no_comments);\n\n        ViewUtils.slideUp(requireView(), 120, 150, 0.06f);\n        disposables.clear();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void setTitle(final String title) { }\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) { }\n\n    @Override\n    protected ItemViewMode getItemViewMode() {\n        return ItemViewMode.LIST;\n    }\n\n    public boolean scrollToComment(final CommentsInfoItem comment) {\n        final int position = infoListAdapter.getItemsList().indexOf(comment);\n        if (position < 0) {\n            return false;\n        }\n\n        itemsList.scrollToPosition(position);\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/DefaultKioskFragment.java",
    "content": "package org.schabi.newpipe.fragments.list.kiosk;\n\nimport android.os.Bundle;\n\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.extractor.kiosk.KioskList;\nimport org.schabi.newpipe.util.KioskTranslator;\nimport org.schabi.newpipe.util.ServiceHelper;\n\npublic class DefaultKioskFragment extends KioskFragment {\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        if (serviceId < 0) {\n            updateSelectedDefaultKiosk();\n        }\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n\n        if (serviceId != ServiceHelper.getSelectedServiceId(requireContext())) {\n            if (currentWorker != null) {\n                currentWorker.dispose();\n            }\n            updateSelectedDefaultKiosk();\n            reloadContent();\n        }\n    }\n\n    private void updateSelectedDefaultKiosk() {\n        try {\n            serviceId = ServiceHelper.getSelectedServiceId(requireContext());\n\n            final KioskList kioskList = NewPipe.getService(serviceId).getKioskList();\n            kioskId = kioskList.getDefaultKioskId();\n            url = kioskList.getListLinkHandlerFactoryByType(kioskId).fromId(kioskId).getUrl();\n\n            kioskTranslatedName = KioskTranslator.getTranslatedKioskName(kioskId, requireContext());\n            name = kioskTranslatedName;\n\n            currentInfo = null;\n            currentNextPage = null;\n        } catch (final ExtractionException e) {\n            showError(new ErrorInfo(e, UserAction.REQUESTED_KIOSK,\n                    \"Loading default kiosk for selected service\"));\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java",
    "content": "package org.schabi.newpipe.fragments.list.kiosk;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.ActionBar;\n\nimport com.evernote.android.state.State;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.ListExtractor;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.ServiceList;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.extractor.kiosk.KioskInfo;\nimport org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;\nimport org.schabi.newpipe.extractor.localization.ContentCountry;\nimport org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCLiveStreamKiosk;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.fragments.list.BaseListInfoFragment;\nimport org.schabi.newpipe.util.ExtractorHelper;\nimport org.schabi.newpipe.util.KioskTranslator;\nimport org.schabi.newpipe.util.Localization;\n\nimport io.reactivex.rxjava3.core.Single;\n\n/**\n * Created by Christian Schabesberger on 23.09.17.\n * <p>\n * Copyright (C) Christian Schabesberger 2017 <chris.schabesberger@mailbox.org>\n * KioskFragment.java is part of NewPipe.\n * </p>\n * <p>\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * </p>\n * <p>\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * </p>\n * <p>\n * You should have received a copy of the GNU General Public License\n * along with NewPipe. If not, see <http://www.gnu.org/licenses/>.\n * </p>\n */\n\npublic class KioskFragment extends BaseListInfoFragment<StreamInfoItem, KioskInfo> {\n    @State\n    String kioskId = \"\";\n    String kioskTranslatedName;\n    @State\n    ContentCountry contentCountry;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Views\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public static KioskFragment getInstance(final int serviceId) throws ExtractionException {\n        return getInstance(serviceId, NewPipe.getService(serviceId)\n                .getKioskList().getDefaultKioskId());\n    }\n\n    public static KioskFragment getInstance(final int serviceId, final String kioskId)\n            throws ExtractionException {\n        final KioskFragment instance = new KioskFragment();\n        final StreamingService service = NewPipe.getService(serviceId);\n        final ListLinkHandlerFactory kioskLinkHandlerFactory = service.getKioskList()\n                .getListLinkHandlerFactoryByType(kioskId);\n        instance.setInitialData(serviceId,\n                kioskLinkHandlerFactory.fromId(kioskId).getUrl(), kioskId);\n        instance.kioskId = kioskId;\n        return instance;\n    }\n\n    public KioskFragment() {\n        super(UserAction.REQUESTED_KIOSK);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // LifeCycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        kioskTranslatedName = KioskTranslator.getTranslatedKioskName(kioskId, activity);\n        name = kioskTranslatedName;\n        contentCountry = Localization.getPreferredContentCountry(requireContext());\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        if (!Localization.getPreferredContentCountry(requireContext()).equals(contentCountry)) {\n            reloadContent();\n        }\n        if (useAsFrontPage && activity != null) {\n            try {\n                setTitle(kioskTranslatedName);\n            } catch (final Exception e) {\n                showSnackBarError(new ErrorInfo(e, UserAction.UI_ERROR, \"Setting kiosk title\"));\n            }\n        }\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_kiosk, container, false);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Menu\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) {\n        super.onCreateOptionsMenu(menu, inflater);\n        final ActionBar supportActionBar = activity.getSupportActionBar();\n        if (supportActionBar != null && useAsFrontPage) {\n            supportActionBar.setDisplayHomeAsUpEnabled(false);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Load and handle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public Single<KioskInfo> loadResult(final boolean forceReload) {\n        contentCountry = Localization.getPreferredContentCountry(requireContext());\n        return ExtractorHelper.getKioskInfo(serviceId, url, forceReload);\n    }\n\n    @Override\n    public Single<ListExtractor.InfoItemsPage<StreamInfoItem>> loadMoreItemsLogic() {\n        return ExtractorHelper.getMoreKioskItems(serviceId, url, currentNextPage);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Contract\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void handleResult(@NonNull final KioskInfo result) {\n        super.handleResult(result);\n\n        name = kioskTranslatedName;\n        setTitle(kioskTranslatedName);\n    }\n\n    @Override\n    public void showEmptyState() {\n        // show \"no live streams\" for live stream kiosk\n        super.showEmptyState();\n        if (MediaCCCLiveStreamKiosk.KIOSK_ID.equals(currentInfo.getId())\n                && ServiceList.MediaCCC.getServiceId() == currentInfo.getServiceId()) {\n            setEmptyStateMessage(R.string.no_live_streams);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistControlViewHolder.java",
    "content": "package org.schabi.newpipe.fragments.list.playlist;\n\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\n\n/**\n * Interface for {@code R.layout.playlist_control} view holders\n * to give access to the play queue.\n */\npublic interface PlaylistControlViewHolder {\n    PlayQueue getPlayQueue();\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java",
    "content": "package org.schabi.newpipe.fragments.list.playlist;\n\nimport static org.schabi.newpipe.extractor.utils.Utils.isBlank;\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\nimport static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling;\nimport static org.schabi.newpipe.util.ServiceHelper.getServiceById;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.content.res.AppCompatResources;\n\nimport com.google.android.material.shape.CornerFamily;\nimport com.google.android.material.shape.ShapeAppearanceModel;\n\nimport org.reactivestreams.Subscriber;\nimport org.reactivestreams.Subscription;\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.databinding.PlaylistControlBinding;\nimport org.schabi.newpipe.databinding.PlaylistHeaderBinding;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.ListExtractor;\nimport org.schabi.newpipe.extractor.ServiceList;\nimport org.schabi.newpipe.extractor.playlist.PlaylistInfo;\nimport org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;\nimport org.schabi.newpipe.extractor.stream.Description;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.fragments.list.BaseListInfoFragment;\nimport org.schabi.newpipe.info_list.dialog.InfoItemDialog;\nimport org.schabi.newpipe.info_list.dialog.StreamDialogDefaultEntry;\nimport org.schabi.newpipe.local.dialog.PlaylistDialog;\nimport org.schabi.newpipe.local.playlist.RemotePlaylistManager;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlaylistPlayQueue;\nimport org.schabi.newpipe.util.ExtractorHelper;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.PlayButtonHelper;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\nimport org.schabi.newpipe.util.image.CoilHelper;\nimport org.schabi.newpipe.util.text.TextEllipsizer;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.function.Supplier;\nimport java.util.stream.Collectors;\n\nimport coil3.util.CoilUtils;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Flowable;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\n\npublic class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, PlaylistInfo>\n        implements PlaylistControlViewHolder {\n\n    private CompositeDisposable disposables;\n    private Subscription bookmarkReactor;\n    private AtomicBoolean isBookmarkButtonReady;\n\n    private RemotePlaylistManager remotePlaylistManager;\n    private PlaylistRemoteEntity playlistEntity;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Views\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private PlaylistHeaderBinding headerBinding;\n    private PlaylistControlBinding playlistControlBinding;\n\n    private MenuItem playlistBookmarkButton;\n\n    private long streamCount;\n    private long playlistOverallDurationSeconds;\n\n    public static PlaylistFragment getInstance(final int serviceId, final String url,\n                                               final String name) {\n        final PlaylistFragment instance = new PlaylistFragment();\n        instance.setInitialData(serviceId, url, name);\n        return instance;\n    }\n\n    public PlaylistFragment() {\n        super(UserAction.REQUESTED_PLAYLIST);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // LifeCycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        disposables = new CompositeDisposable();\n        isBookmarkButtonReady = new AtomicBoolean(false);\n        remotePlaylistManager = new RemotePlaylistManager(NewPipeDatabase\n                .getInstance(requireContext()));\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_playlist, container, false);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected Supplier<View> getListHeaderSupplier() {\n        headerBinding = PlaylistHeaderBinding\n                .inflate(activity.getLayoutInflater(), itemsList, false);\n        playlistControlBinding = headerBinding.playlistControl;\n\n        return headerBinding::getRoot;\n    }\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n\n        // Is mini variant still relevant?\n        // Only the remote playlist screen uses it now\n        infoListAdapter.setUseMiniVariant(true);\n    }\n\n    private PlayQueue getPlayQueueStartingAt(final StreamInfoItem infoItem) {\n        return getPlayQueue(Math.max(infoListAdapter.getItemsList().indexOf(infoItem), 0));\n    }\n\n    @Override\n    protected void showInfoItemDialog(final StreamInfoItem item) {\n        final Context context = getContext();\n        try {\n            final InfoItemDialog.Builder dialogBuilder =\n                    new InfoItemDialog.Builder(getActivity(), context, this, item);\n\n            dialogBuilder\n                    .setAction(\n                            StreamDialogDefaultEntry.START_HERE_ON_BACKGROUND,\n                            (f, infoItem) -> NavigationHelper.playOnBackgroundPlayer(\n                                    context, getPlayQueueStartingAt(infoItem), true))\n                    .create()\n                    .show();\n        } catch (final IllegalArgumentException e) {\n            InfoItemDialog.Builder.reportErrorDuringInitialization(e, item);\n        }\n    }\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) {\n        if (DEBUG) {\n            Log.d(TAG, \"onCreateOptionsMenu() called with: \"\n                    + \"menu = [\" + menu + \"], inflater = [\" + inflater + \"]\");\n        }\n        super.onCreateOptionsMenu(menu, inflater);\n        inflater.inflate(R.menu.menu_playlist, menu);\n\n        playlistBookmarkButton = menu.findItem(R.id.menu_item_bookmark);\n        updateBookmarkButtons();\n    }\n\n    @Override\n    public void onDestroyView() {\n        headerBinding = null;\n        playlistControlBinding = null;\n\n        super.onDestroyView();\n        if (isBookmarkButtonReady != null) {\n            isBookmarkButtonReady.set(false);\n        }\n\n        if (disposables != null) {\n            disposables.clear();\n        }\n        if (bookmarkReactor != null) {\n            bookmarkReactor.cancel();\n        }\n\n        bookmarkReactor = null;\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n\n        if (disposables != null) {\n            disposables.dispose();\n        }\n\n        disposables = null;\n        remotePlaylistManager = null;\n        playlistEntity = null;\n        isBookmarkButtonReady = null;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Load and handle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected Single<ListExtractor.InfoItemsPage<StreamInfoItem>> loadMoreItemsLogic() {\n        return ExtractorHelper.getMorePlaylistItems(serviceId, url, currentNextPage);\n    }\n\n    @Override\n    protected Single<PlaylistInfo> loadResult(final boolean forceLoad) {\n        return ExtractorHelper.getPlaylistInfo(serviceId, url, forceLoad);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(final MenuItem item) {\n        final int itemId = item.getItemId();\n        if (itemId == R.id.action_settings) {\n            NavigationHelper.openSettings(requireContext());\n        } else if (itemId == R.id.menu_item_openInBrowser) {\n            ShareUtils.openUrlInBrowser(requireContext(), url);\n        } else if (itemId == R.id.menu_item_share) {\n            ShareUtils.shareText(requireContext(), name, url,\n                    currentInfo == null ? List.of() : currentInfo.getThumbnails());\n        } else if (itemId == R.id.menu_item_bookmark) {\n            onBookmarkClicked();\n        } else if (itemId == R.id.menu_item_append_playlist) {\n            if (currentInfo != null) {\n                disposables.add(PlaylistDialog.createCorrespondingDialog(\n                        getContext(),\n                        getPlayQueue()\n                                .getStreams()\n                                .stream()\n                                .map(StreamEntity::new)\n                                .collect(Collectors.toList()),\n                        dialog -> dialog.show(getFM(), TAG)\n                ));\n            }\n        } else {\n            return super.onOptionsItemSelected(item);\n        }\n        return true;\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Contract\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void showLoading() {\n        super.showLoading();\n        animate(headerBinding.getRoot(), false, 200);\n        animateHideRecyclerViewAllowingScrolling(itemsList);\n\n        CoilUtils.dispose(headerBinding.uploaderAvatarView);\n        animate(headerBinding.uploaderLayout, false, 200);\n    }\n\n    @Override\n    public void handleNextItems(final ListExtractor.InfoItemsPage result) {\n        super.handleNextItems(result);\n        setStreamCountAndOverallDuration(result.getItems(), !result.hasNextPage());\n    }\n\n    @Override\n    public void handleResult(@NonNull final PlaylistInfo result) {\n        super.handleResult(result);\n\n        animate(headerBinding.getRoot(), true, 100);\n        animate(headerBinding.uploaderLayout, true, 300);\n        headerBinding.uploaderLayout.setOnClickListener(null);\n        // If we have an uploader put them into the UI\n        if (!TextUtils.isEmpty(result.getUploaderName())) {\n            headerBinding.uploaderName.setText(result.getUploaderName());\n            if (!TextUtils.isEmpty(result.getUploaderUrl())) {\n                headerBinding.uploaderLayout.setOnClickListener(v -> {\n                    try {\n                        NavigationHelper.openChannelFragment(getFM(), result.getServiceId(),\n                                result.getUploaderUrl(), result.getUploaderName());\n                    } catch (final Exception e) {\n                        ErrorUtil.showUiErrorSnackbar(this, \"Opening channel fragment\", e);\n                    }\n                });\n            }\n        } else { // Otherwise say we have no uploader\n            headerBinding.uploaderName.setText(R.string.playlist_no_uploader);\n        }\n\n        playlistControlBinding.getRoot().setVisibility(View.VISIBLE);\n\n        if (result.getServiceId() == ServiceList.YouTube.getServiceId()\n                && (YoutubeParsingHelper.isYoutubeMixId(result.getId())\n                || YoutubeParsingHelper.isYoutubeMusicMixId(result.getId()))) {\n            // this is an auto-generated playlist (e.g. Youtube mix), so a radio is shown\n            final ShapeAppearanceModel model = ShapeAppearanceModel.builder()\n                    .setAllCorners(CornerFamily.ROUNDED, 0f)\n                    .build(); // this turns the image back into a square\n            headerBinding.uploaderAvatarView.setShapeAppearanceModel(model);\n            headerBinding.uploaderAvatarView.setStrokeColor(AppCompatResources\n                    .getColorStateList(requireContext(), R.color.transparent_background_color));\n            headerBinding.uploaderAvatarView.setImageDrawable(\n                    AppCompatResources.getDrawable(requireContext(),\n                    R.drawable.ic_radio)\n            );\n        } else {\n            CoilHelper.INSTANCE.loadAvatar(headerBinding.uploaderAvatarView,\n                    result.getUploaderAvatars());\n        }\n\n        streamCount = result.getStreamCount();\n        setStreamCountAndOverallDuration(result.getRelatedItems(), !result.hasNextPage());\n\n        final Description description = result.getDescription();\n        if (description != null && description != Description.EMPTY_DESCRIPTION\n                && !isBlank(description.getContent())) {\n            final TextEllipsizer ellipsizer = new TextEllipsizer(\n                    headerBinding.playlistDescription, 5, getServiceById(result.getServiceId()));\n            ellipsizer.setStateChangeListener(isEllipsized ->\n                headerBinding.playlistDescriptionReadMore.setText(\n                        Boolean.TRUE.equals(isEllipsized) ? R.string.show_more : R.string.show_less\n                ));\n            ellipsizer.setOnContentChanged(canBeEllipsized -> {\n                headerBinding.playlistDescriptionReadMore.setVisibility(\n                        Boolean.TRUE.equals(canBeEllipsized) ? View.VISIBLE : View.GONE);\n                if (Boolean.TRUE.equals(canBeEllipsized)) {\n                    ellipsizer.ellipsize();\n                }\n            });\n            ellipsizer.setContent(description);\n            headerBinding.playlistDescriptionReadMore.setOnClickListener(v -> ellipsizer.toggle());\n            headerBinding.playlistDescription.setOnClickListener(v -> ellipsizer.toggle());\n        } else {\n            headerBinding.playlistDescription.setVisibility(View.GONE);\n            headerBinding.playlistDescriptionReadMore.setVisibility(View.GONE);\n        }\n\n        if (!result.getErrors().isEmpty()) {\n            showSnackBarError(new ErrorInfo(result.getErrors(), UserAction.REQUESTED_PLAYLIST,\n                    result.getUrl(), result));\n        }\n\n        remotePlaylistManager.getPlaylist(result)\n                .flatMap(lists -> getUpdateProcessor(lists, result), (lists, id) -> lists)\n                .onBackpressureLatest()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(getPlaylistBookmarkSubscriber());\n\n        PlayButtonHelper.initPlaylistControlClickListener(activity, playlistControlBinding, this);\n    }\n\n    public PlayQueue getPlayQueue() {\n        return getPlayQueue(0);\n    }\n\n    private PlayQueue getPlayQueue(final int index) {\n        final List<StreamInfoItem> infoItems = new ArrayList<>();\n        for (final InfoItem i : infoListAdapter.getItemsList()) {\n            if (i instanceof StreamInfoItem) {\n                infoItems.add((StreamInfoItem) i);\n            }\n        }\n        return new PlaylistPlayQueue(\n                currentInfo.getServiceId(),\n                currentInfo.getUrl(),\n                currentInfo.getNextPage(),\n                infoItems,\n                index\n        );\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private Flowable<Integer> getUpdateProcessor(\n            @NonNull final List<PlaylistRemoteEntity> playlists,\n            @NonNull final PlaylistInfo result) {\n        final Flowable<Integer> noItemToUpdate = Flowable.just(/*noItemToUpdate=*/-1);\n        if (playlists.isEmpty()) {\n            return noItemToUpdate;\n        }\n\n        final PlaylistRemoteEntity playlistRemoteEntity = playlists.get(0);\n        if (playlistRemoteEntity.isIdenticalTo(result)) {\n            return noItemToUpdate;\n        }\n\n        return remotePlaylistManager.onUpdate(playlists.get(0).getUid(), result).toFlowable();\n    }\n\n    private Subscriber<List<PlaylistRemoteEntity>> getPlaylistBookmarkSubscriber() {\n        return new Subscriber<>() {\n            @Override\n            public void onSubscribe(final Subscription s) {\n                if (bookmarkReactor != null) {\n                    bookmarkReactor.cancel();\n                }\n                bookmarkReactor = s;\n                bookmarkReactor.request(1);\n            }\n\n            @Override\n            public void onNext(final List<PlaylistRemoteEntity> playlist) {\n                playlistEntity = playlist.isEmpty() ? null : playlist.get(0);\n\n                updateBookmarkButtons();\n                isBookmarkButtonReady.set(true);\n\n                if (bookmarkReactor != null) {\n                    bookmarkReactor.request(1);\n                }\n            }\n\n            @Override\n            public void onError(final Throwable throwable) {\n                showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK,\n                        \"Get playlist bookmarks\"));\n            }\n\n            @Override\n            public void onComplete() { }\n        };\n    }\n\n    @Override\n    public void setTitle(final String title) {\n        super.setTitle(title);\n        if (headerBinding != null) {\n            headerBinding.playlistTitleView.setText(title);\n        }\n    }\n\n    private void onBookmarkClicked() {\n        if (isBookmarkButtonReady == null || !isBookmarkButtonReady.get()\n                || remotePlaylistManager == null) {\n            return;\n        }\n\n        final Disposable action;\n\n        if (currentInfo != null && playlistEntity == null) {\n            action = remotePlaylistManager.onBookmark(currentInfo)\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(ignored -> { /* Do nothing */ }, throwable ->\n                            showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK,\n                                    \"Adding playlist bookmark\")));\n        } else if (playlistEntity != null) {\n            action = remotePlaylistManager.deletePlaylist(playlistEntity.getUid())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .doFinally(() -> playlistEntity = null)\n                    .subscribe(ignored -> { /* Do nothing */ }, throwable ->\n                            showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK,\n                                    \"Deleting playlist bookmark\")));\n        } else {\n            action = Disposable.empty();\n        }\n\n        disposables.add(action);\n    }\n\n    private void updateBookmarkButtons() {\n        if (playlistBookmarkButton == null || activity == null) {\n            return;\n        }\n\n        final int drawable = playlistEntity == null\n                ? R.drawable.ic_playlist_add : R.drawable.ic_playlist_add_check;\n\n        final int titleRes = playlistEntity == null\n                ? R.string.bookmark_playlist : R.string.unbookmark_playlist;\n\n        playlistBookmarkButton.setIcon(drawable);\n        playlistBookmarkButton.setTitle(titleRes);\n    }\n\n    private void setStreamCountAndOverallDuration(final List<StreamInfoItem> list,\n                                                  final boolean isDurationComplete) {\n        if (activity != null && headerBinding != null) {\n            playlistOverallDurationSeconds += list.stream()\n                    .mapToLong(x -> x.getDuration())\n                    .sum();\n            headerBinding.playlistStreamCount.setText(\n                Localization.concatenateStrings(\n                    Localization.localizeStreamCount(activity, streamCount),\n                    Localization.getDurationString(playlistOverallDurationSeconds,\n                            isDurationComplete, true))\n            );\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java",
    "content": "package org.schabi.newpipe.fragments.list.search;\n\nimport static androidx.recyclerview.widget.ItemTouchHelper.Callback.makeMovementFlags;\nimport static org.schabi.newpipe.extractor.utils.Utils.isBlank;\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\nimport static org.schabi.newpipe.util.ExtractorHelper.showMetaInfoInTextView;\nimport static java.util.Arrays.asList;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\nimport android.text.Editable;\nimport android.text.Html;\nimport android.text.TextUtils;\nimport android.text.TextWatcher;\nimport android.text.style.CharacterStyle;\nimport android.util.Log;\nimport android.view.KeyEvent;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.animation.DecelerateInterpolator;\nimport android.view.inputmethod.EditorInfo;\nimport android.widget.EditText;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.appcompat.widget.TooltipCompat;\nimport androidx.collection.SparseArrayCompat;\nimport androidx.core.text.HtmlCompat;\nimport androidx.preference.PreferenceManager;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.evernote.android.state.State;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.FragmentSearchBinding;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.ReCaptchaActivity;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.ListExtractor;\nimport org.schabi.newpipe.extractor.MetaInfo;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.Page;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.exceptions.ParsingException;\nimport org.schabi.newpipe.extractor.search.SearchExtractor;\nimport org.schabi.newpipe.extractor.search.SearchInfo;\nimport org.schabi.newpipe.extractor.services.peertube.linkHandler.PeertubeSearchQueryHandlerFactory;\nimport org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeSearchQueryHandlerFactory;\nimport org.schabi.newpipe.fragments.BackPressable;\nimport org.schabi.newpipe.fragments.list.BaseListFragment;\nimport org.schabi.newpipe.ktx.AnimationType;\nimport org.schabi.newpipe.ktx.ExceptionUtils;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.settings.NewPipeSettings;\nimport org.schabi.newpipe.util.Constants;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.ExtractorHelper;\nimport org.schabi.newpipe.util.KeyboardUtil;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.ServiceHelper;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Queue;\nimport java.util.concurrent.TimeUnit;\nimport java.util.stream.Collectors;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Observable;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\nimport io.reactivex.rxjava3.subjects.PublishSubject;\n\npublic class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.InfoItemsPage<?>>\n        implements BackPressable {\n    /*//////////////////////////////////////////////////////////////////////////\n    // Search\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * The suggestions will only be fetched from network if the query meet this threshold (>=).\n     * (local ones will be fetched regardless of the length)\n     */\n    private static final int THRESHOLD_NETWORK_SUGGESTION = 1;\n\n    /**\n     * How much time have to pass without emitting a item (i.e. the user stop typing)\n     * to fetch/show the suggestions, in milliseconds.\n     */\n    private static final int SUGGESTIONS_DEBOUNCE = 120; //ms\n    private final PublishSubject<String> suggestionPublisher = PublishSubject.create();\n\n    @State\n    int filterItemCheckedId = -1;\n\n    @State\n    protected int serviceId = Constants.NO_SERVICE_ID;\n\n    // these three represents the current search query\n    @State\n    String searchString;\n\n    /**\n     * No content filter should add like contentFilter = all\n     * be aware of this when implementing an extractor.\n     */\n    @State\n    String[] contentFilter = new String[0];\n\n    @State\n    String sortFilter;\n\n    // these represents the last search\n    @State\n    String lastSearchedString;\n\n    @State\n    String searchSuggestion;\n\n    @State\n    boolean isCorrectedSearch;\n\n    @State\n    MetaInfo[] metaInfo;\n\n    @State\n    boolean wasSearchFocused = false;\n\n    private final SparseArrayCompat<String> menuItemToFilterName = new SparseArrayCompat<>();\n    private StreamingService service;\n    @Nullable\n    private Page nextPage;\n    private boolean showLocalSuggestions = true;\n    private boolean showRemoteSuggestions = true;\n\n    private Disposable searchDisposable;\n    private Disposable suggestionDisposable;\n    private final CompositeDisposable disposables = new CompositeDisposable();\n\n    private SuggestionListAdapter suggestionListAdapter;\n    private HistoryRecordManager historyRecordManager;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Views\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private FragmentSearchBinding searchBinding;\n\n    private View searchToolbarContainer;\n    private EditText searchEditText;\n    private View searchClear;\n\n    private boolean suggestionsPanelVisible = false;\n\n    /*////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * TextWatcher to remove rich-text formatting on the search EditText when pasting content\n     * from the clipboard.\n     */\n    private TextWatcher textWatcher;\n\n    public static SearchFragment getInstance(final int serviceId, final String searchString) {\n        final SearchFragment searchFragment = new SearchFragment();\n        searchFragment.setQuery(serviceId, searchString, new String[0], \"\");\n\n        if (!TextUtils.isEmpty(searchString)) {\n            searchFragment.setSearchOnResume();\n        }\n\n        return searchFragment;\n    }\n\n    /**\n     * Set wasLoading to true so when the fragment onResume is called, the initial search is done.\n     */\n    private void setSearchOnResume() {\n        wasLoading.set(true);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Fragment's LifeCycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onAttach(@NonNull final Context context) {\n        super.onAttach(context);\n\n        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);\n        showLocalSuggestions = NewPipeSettings.showLocalSearchSuggestions(activity, prefs);\n        showRemoteSuggestions = NewPipeSettings.showRemoteSearchSuggestions(activity, prefs);\n\n        suggestionListAdapter = new SuggestionListAdapter();\n        historyRecordManager = new HistoryRecordManager(context);\n    }\n\n    @Override\n    public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_search, container, false);\n    }\n\n    @Override\n    public void onViewCreated(@NonNull final View rootView, final Bundle savedInstanceState) {\n        searchBinding = FragmentSearchBinding.bind(rootView);\n        super.onViewCreated(rootView, savedInstanceState);\n\n        updateService();\n        // Add the service name to search string hint\n        // to make it more obvious which platform is being searched.\n        if (service != null) {\n            searchEditText.setHint(\n                    getString(R.string.search_with_service_name,\n                            service.getServiceInfo().getName()));\n        }\n        showSearchOnStart();\n        initSearchListeners();\n    }\n\n    private void updateService() {\n        try {\n            service = NewPipe.getService(serviceId);\n        } catch (final Exception e) {\n            ErrorUtil.showUiErrorSnackbar(this, \"Getting service for id \" + serviceId, e);\n        }\n    }\n\n    @Override\n    public void onStart() {\n        if (DEBUG) {\n            Log.d(TAG, \"onStart() called\");\n        }\n        super.onStart();\n\n        updateService();\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n\n        wasSearchFocused = searchEditText.hasFocus();\n\n        if (searchDisposable != null) {\n            searchDisposable.dispose();\n        }\n        if (suggestionDisposable != null) {\n            suggestionDisposable.dispose();\n        }\n        disposables.clear();\n        hideKeyboardSearch();\n    }\n\n    @Override\n    public void onResume() {\n        if (DEBUG) {\n            Log.d(TAG, \"onResume() called\");\n        }\n        super.onResume();\n\n        if (suggestionDisposable == null || suggestionDisposable.isDisposed()) {\n            initSuggestionObserver();\n        }\n\n        if (!TextUtils.isEmpty(searchString)) {\n            if (wasLoading.getAndSet(false)) {\n                search(searchString, contentFilter, sortFilter);\n                return;\n            } else if (infoListAdapter.getItemsList().isEmpty()) {\n                if (savedState == null) {\n                    search(searchString, contentFilter, sortFilter);\n                    return;\n                } else if (!isLoading.get() && !wasSearchFocused && lastPanelError == null) {\n                    infoListAdapter.clearStreamItemList();\n                    showEmptyState();\n                }\n            }\n        }\n\n        handleSearchSuggestion();\n\n        showMetaInfoInTextView(metaInfo == null ? null : Arrays.asList(metaInfo),\n                searchBinding.searchMetaInfoTextView, searchBinding.searchMetaInfoSeparator,\n                disposables);\n\n        if (TextUtils.isEmpty(searchString) || wasSearchFocused) {\n            showKeyboardSearch();\n            showSuggestionsPanel();\n        } else {\n            hideKeyboardSearch();\n            hideSuggestionsPanel();\n        }\n        wasSearchFocused = false;\n    }\n\n    @Override\n    public void onDestroyView() {\n        if (DEBUG) {\n            Log.d(TAG, \"onDestroyView() called\");\n        }\n        unsetSearchListeners();\n\n        searchBinding = null;\n        super.onDestroyView();\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        if (searchDisposable != null) {\n            searchDisposable.dispose();\n        }\n        if (suggestionDisposable != null) {\n            suggestionDisposable.dispose();\n        }\n        disposables.clear();\n    }\n\n    @Override\n    public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {\n        if (requestCode == ReCaptchaActivity.RECAPTCHA_REQUEST) {\n            if (resultCode == Activity.RESULT_OK\n                    && !TextUtils.isEmpty(searchString)) {\n                search(searchString, contentFilter, sortFilter);\n            } else {\n                Log.e(TAG, \"ReCaptcha failed\");\n            }\n        } else {\n            Log.e(TAG, \"Request code from activity not supported [\" + requestCode + \"]\");\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n\n        searchBinding.suggestionsList.setAdapter(suggestionListAdapter);\n        // animations are just strange and useless, since the suggestions keep changing too much\n        searchBinding.suggestionsList.setItemAnimator(null);\n        new ItemTouchHelper(new ItemTouchHelper.Callback() {\n            @Override\n            public int getMovementFlags(@NonNull final RecyclerView recyclerView,\n                                        @NonNull final RecyclerView.ViewHolder viewHolder) {\n                return getSuggestionMovementFlags(viewHolder);\n            }\n\n            @Override\n            public boolean onMove(@NonNull final RecyclerView recyclerView,\n                                  @NonNull final RecyclerView.ViewHolder viewHolder,\n                                  @NonNull final RecyclerView.ViewHolder viewHolder1) {\n                return false;\n            }\n\n            @Override\n            public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, final int i) {\n                onSuggestionItemSwiped(viewHolder);\n            }\n        }).attachToRecyclerView(searchBinding.suggestionsList);\n\n        searchToolbarContainer = activity.findViewById(R.id.toolbar_search_container);\n        searchEditText = searchToolbarContainer.findViewById(R.id.toolbar_search_edit_text);\n        searchClear = searchToolbarContainer.findViewById(R.id.toolbar_search_clear);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // State Saving\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void writeTo(final Queue<Object> objectsToSave) {\n        super.writeTo(objectsToSave);\n        objectsToSave.add(nextPage);\n    }\n\n    @Override\n    public void readFrom(@NonNull final Queue<Object> savedObjects) throws Exception {\n        super.readFrom(savedObjects);\n        nextPage = (Page) savedObjects.poll();\n    }\n\n    @Override\n    public void onSaveInstanceState(@NonNull final Bundle bundle) {\n        searchString = searchEditText != null\n                ? getSearchEditString().trim()\n                : searchString;\n        super.onSaveInstanceState(bundle);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init's\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void reloadContent() {\n        if (!TextUtils.isEmpty(searchString) || (searchEditText != null\n                && !isSearchEditBlank())) {\n            search(!TextUtils.isEmpty(searchString)\n                    ? searchString\n                    : getSearchEditString(), this.contentFilter, \"\");\n        } else {\n            if (searchEditText != null) {\n                searchEditText.setText(\"\");\n                showKeyboardSearch();\n            }\n            hideErrorPanel();\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Menu\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) {\n        super.onCreateOptionsMenu(menu, inflater);\n\n        final ActionBar supportActionBar = activity.getSupportActionBar();\n        if (supportActionBar != null) {\n            supportActionBar.setDisplayShowTitleEnabled(false);\n            supportActionBar.setDisplayHomeAsUpEnabled(true);\n        }\n\n        int itemId = 0;\n        boolean isFirstItem = true;\n        final Context c = getContext();\n\n        if (service == null) {\n            Log.w(TAG, \"onCreateOptionsMenu() called with null service\");\n            updateService();\n        }\n\n        for (final String filter : service.getSearchQHFactory().getAvailableContentFilter()) {\n            if (filter.equals(YoutubeSearchQueryHandlerFactory.MUSIC_SONGS)) {\n                final MenuItem musicItem = menu.add(2,\n                        itemId++,\n                        0,\n                        \"YouTube Music\");\n                musicItem.setEnabled(false);\n            } else if (filter.equals(PeertubeSearchQueryHandlerFactory.SEPIA_VIDEOS)) {\n                final MenuItem sepiaItem = menu.add(2,\n                        itemId++,\n                        0,\n                        \"Sepia Search\");\n                sepiaItem.setEnabled(false);\n            }\n            menuItemToFilterName.put(itemId, filter);\n            final MenuItem item = menu.add(1,\n                    itemId++,\n                    0,\n                    ServiceHelper.getTranslatedFilterString(filter, c));\n            if (isFirstItem) {\n                item.setChecked(true);\n                isFirstItem = false;\n            }\n        }\n        menu.setGroupCheckable(1, true, true);\n\n        restoreFilterChecked(menu, filterItemCheckedId);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(@NonNull final MenuItem item) {\n        final var filter = Collections.singletonList(menuItemToFilterName.get(item.getItemId()));\n        changeContentFilter(item, filter);\n        return true;\n    }\n\n    private void restoreFilterChecked(final Menu menu, final int itemId) {\n        if (itemId != -1) {\n            final MenuItem item = menu.findItem(itemId);\n            if (item == null) {\n                return;\n            }\n\n            item.setChecked(true);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Search\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void showSearchOnStart() {\n        if (DEBUG) {\n            Log.d(TAG, \"showSearchOnStart() called, searchQuery → \"\n                    + searchString\n                    + \", lastSearchedQuery → \"\n                    + lastSearchedString);\n        }\n        searchEditText.setText(searchString);\n\n        if (TextUtils.isEmpty(searchString)\n                || isSearchEditBlank()) {\n            searchToolbarContainer.setTranslationX(100);\n            searchToolbarContainer.setAlpha(0.0f);\n            searchToolbarContainer.setVisibility(View.VISIBLE);\n            searchToolbarContainer.animate()\n                    .translationX(0)\n                    .alpha(1.0f)\n                    .setDuration(200)\n                    .setInterpolator(new DecelerateInterpolator()).start();\n        } else {\n            searchToolbarContainer.setTranslationX(0);\n            searchToolbarContainer.setAlpha(1.0f);\n            searchToolbarContainer.setVisibility(View.VISIBLE);\n        }\n    }\n\n    private void initSearchListeners() {\n        if (DEBUG) {\n            Log.d(TAG, \"initSearchListeners() called\");\n        }\n        searchClear.setOnClickListener(v -> {\n            if (DEBUG) {\n                Log.d(TAG, \"onClick() called with: v = [\" + v + \"]\");\n            }\n            if (isSearchEditBlank()) {\n                NavigationHelper.gotoMainFragment(getFM());\n                return;\n            }\n\n            searchBinding.correctSuggestion.setVisibility(View.GONE);\n\n            searchEditText.setText(\"\");\n            suggestionListAdapter.submitList(null);\n            showKeyboardSearch();\n        });\n\n        TooltipCompat.setTooltipText(searchClear, getString(R.string.clear));\n\n        searchEditText.setOnClickListener(v -> {\n            if (DEBUG) {\n                Log.d(TAG, \"onClick() called with: v = [\" + v + \"]\");\n            }\n            if ((showLocalSuggestions || showRemoteSuggestions) && !isErrorPanelVisible()) {\n                showSuggestionsPanel();\n            }\n            if (DeviceUtils.isTv(getContext())) {\n                showKeyboardSearch();\n            }\n        });\n\n        searchEditText.setOnFocusChangeListener((final View v, final boolean hasFocus) -> {\n            if (DEBUG) {\n                Log.d(TAG, \"onFocusChange() called with: \"\n                        + \"v = [\" + v + \"], hasFocus = [\" + hasFocus + \"]\");\n            }\n            if ((showLocalSuggestions || showRemoteSuggestions)\n                    && hasFocus && !isErrorPanelVisible()) {\n                showSuggestionsPanel();\n            }\n        });\n\n        suggestionListAdapter.setListener(new SuggestionListAdapter.OnSuggestionItemSelected() {\n            @Override\n            public void onSuggestionItemSelected(final SuggestionItem item) {\n                search(item.query, new String[0], \"\");\n                searchEditText.setText(item.query);\n            }\n\n            @Override\n            public void onSuggestionItemInserted(final SuggestionItem item) {\n                searchEditText.setText(item.query);\n                searchEditText.setSelection(searchEditText.getText().length());\n            }\n\n            @Override\n            public void onSuggestionItemLongClick(final SuggestionItem item) {\n                if (item.fromHistory) {\n                    showDeleteSuggestionDialog(item);\n                }\n            }\n        });\n\n        if (textWatcher != null) {\n            searchEditText.removeTextChangedListener(textWatcher);\n        }\n        textWatcher = new TextWatcher() {\n            @Override\n            public void beforeTextChanged(final CharSequence s, final int start,\n                                          final int count, final int after) {\n                // Do nothing, old text is already clean\n            }\n\n            @Override\n            public void onTextChanged(final CharSequence s, final int start,\n                                      final int before, final int count) {\n                // Changes are handled in afterTextChanged; CharSequence cannot be changed here.\n            }\n\n            @Override\n            public void afterTextChanged(final Editable s) {\n                // Remove rich text formatting\n                for (final CharacterStyle span : s.getSpans(0, s.length(), CharacterStyle.class)) {\n                    s.removeSpan(span);\n                }\n\n                final String newText = getSearchEditString().trim();\n                suggestionPublisher.onNext(newText);\n            }\n        };\n        searchEditText.addTextChangedListener(textWatcher);\n        searchEditText.setOnEditorActionListener(\n                (final TextView v, final int actionId, final KeyEvent event) -> {\n                    if (DEBUG) {\n                        Log.d(TAG, \"onEditorAction() called with: v = [\" + v + \"], \"\n                                + \"actionId = [\" + actionId + \"], event = [\" + event + \"]\");\n                    }\n                    if (actionId == EditorInfo.IME_ACTION_PREVIOUS) {\n                        hideKeyboardSearch();\n                    } else if (event != null\n                            && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER\n                            || event.getAction() == EditorInfo.IME_ACTION_SEARCH)) {\n                        searchEditText.setText(getSearchEditString().trim());\n                        search(getSearchEditString(), new String[0], \"\");\n                        return true;\n                    }\n                    return false;\n                });\n\n        if (suggestionDisposable == null || suggestionDisposable.isDisposed()) {\n            initSuggestionObserver();\n        }\n    }\n\n    private void unsetSearchListeners() {\n        if (DEBUG) {\n            Log.d(TAG, \"unsetSearchListeners() called\");\n        }\n        searchClear.setOnClickListener(null);\n        searchClear.setOnLongClickListener(null);\n        searchEditText.setOnClickListener(null);\n        searchEditText.setOnFocusChangeListener(null);\n        searchEditText.setOnEditorActionListener(null);\n\n        if (textWatcher != null) {\n            searchEditText.removeTextChangedListener(textWatcher);\n        }\n        textWatcher = null;\n    }\n\n    private void showSuggestionsPanel() {\n        if (DEBUG) {\n            Log.d(TAG, \"showSuggestionsPanel() called\");\n        }\n        suggestionsPanelVisible = true;\n        animate(searchBinding.suggestionsPanel, true, 200,\n                AnimationType.LIGHT_SLIDE_AND_ALPHA);\n    }\n\n    private void hideSuggestionsPanel() {\n        if (DEBUG) {\n            Log.d(TAG, \"hideSuggestionsPanel() called\");\n        }\n        suggestionsPanelVisible = false;\n        animate(searchBinding.suggestionsPanel, false, 200,\n                AnimationType.LIGHT_SLIDE_AND_ALPHA);\n    }\n\n    private void showKeyboardSearch() {\n        if (DEBUG) {\n            Log.d(TAG, \"showKeyboardSearch() called\");\n        }\n        KeyboardUtil.showKeyboard(activity, searchEditText);\n    }\n\n    private void hideKeyboardSearch() {\n        if (DEBUG) {\n            Log.d(TAG, \"hideKeyboardSearch() called\");\n        }\n\n        KeyboardUtil.hideKeyboard(activity, searchEditText);\n    }\n\n    private void showDeleteSuggestionDialog(final SuggestionItem item) {\n        if (activity == null || historyRecordManager == null || searchEditText == null) {\n            return;\n        }\n        final String query = item.query;\n        new AlertDialog.Builder(activity)\n                .setTitle(query)\n                .setMessage(R.string.delete_item_search_history)\n                .setCancelable(true)\n                .setNegativeButton(R.string.cancel, null)\n                .setPositiveButton(R.string.delete, (dialog, which) -> {\n                    final Disposable onDelete = historyRecordManager.deleteSearchHistory(query)\n                            .observeOn(AndroidSchedulers.mainThread())\n                            .subscribe(\n                                    howManyDeleted -> suggestionPublisher\n                                            .onNext(getSearchEditString()),\n                                    throwable -> showSnackBarError(new ErrorInfo(throwable,\n                                            UserAction.DELETE_FROM_HISTORY,\n                                            \"Deleting item failed\")));\n                    disposables.add(onDelete);\n                })\n                .show();\n    }\n\n    @Override\n    public boolean onBackPressed() {\n        if (suggestionsPanelVisible\n                && !infoListAdapter.getItemsList().isEmpty()\n                && !isLoading.get()) {\n            hideSuggestionsPanel();\n            hideKeyboardSearch();\n            searchEditText.setText(lastSearchedString);\n            return true;\n        }\n        return false;\n    }\n\n\n    private Observable<List<SuggestionItem>> getLocalSuggestionsObservable(\n            final String query, final int similarQueryLimit) {\n        return historyRecordManager\n                .getRelatedSearches(query, similarQueryLimit, 25)\n                .toObservable()\n                .map(searchHistoryEntries ->\n                        searchHistoryEntries.stream()\n                                .map(entry -> new SuggestionItem(true, entry))\n                                .collect(Collectors.toList()));\n    }\n\n    private Observable<List<SuggestionItem>> getRemoteSuggestionsObservable(final String query) {\n        return ExtractorHelper\n                .suggestionsFor(serviceId, query)\n                .toObservable()\n                .map(strings -> {\n                    final List<SuggestionItem> result = new ArrayList<>();\n                    for (final String entry : strings) {\n                        result.add(new SuggestionItem(false, entry));\n                    }\n                    return result;\n                });\n    }\n\n    private void initSuggestionObserver() {\n        if (DEBUG) {\n            Log.d(TAG, \"initSuggestionObserver() called\");\n        }\n        if (suggestionDisposable != null) {\n            suggestionDisposable.dispose();\n        }\n\n        suggestionDisposable = suggestionPublisher\n                .debounce(SUGGESTIONS_DEBOUNCE, TimeUnit.MILLISECONDS)\n                .startWithItem(searchString == null ? \"\" : searchString)\n                .switchMap(query -> {\n                    // Only show remote suggestions if they are enabled in settings and\n                    // the query length is at least THRESHOLD_NETWORK_SUGGESTION\n                    final boolean shallShowRemoteSuggestionsNow = showRemoteSuggestions\n                            && query.length() >= THRESHOLD_NETWORK_SUGGESTION;\n\n                    if (showLocalSuggestions && shallShowRemoteSuggestionsNow) {\n                        return Observable.zip(\n                                getLocalSuggestionsObservable(query, 3),\n                                getRemoteSuggestionsObservable(query),\n                                (local, remote) -> {\n                                    remote.removeIf(remoteItem -> local.stream().anyMatch(\n                                            localItem -> localItem.equals(remoteItem)));\n                                    local.addAll(remote);\n                                    return local;\n                                })\n                                .materialize();\n                    } else if (showLocalSuggestions) {\n                        return getLocalSuggestionsObservable(query, 25)\n                                .materialize();\n                    } else if (shallShowRemoteSuggestionsNow) {\n                        return getRemoteSuggestionsObservable(query)\n                                .materialize();\n                    } else {\n                        return Single.fromCallable(Collections::<SuggestionItem>emptyList)\n                                .toObservable()\n                                .materialize();\n                    }\n                })\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(\n                        listNotification -> {\n                            if (listNotification.isOnNext()) {\n                                if (listNotification.getValue() != null) {\n                                    handleSuggestions(listNotification.getValue());\n                                }\n                            } else if (listNotification.isOnError()\n                                    && listNotification.getError() != null\n                                    && !ExceptionUtils.isInterruptedCaused(\n                                    listNotification.getError())) {\n                                showSnackBarError(new ErrorInfo(listNotification.getError(),\n                                        UserAction.GET_SUGGESTIONS, searchString, serviceId));\n                            }\n                        }, throwable -> showSnackBarError(new ErrorInfo(\n                                throwable, UserAction.GET_SUGGESTIONS, searchString, serviceId)));\n    }\n\n    @Override\n    protected void doInitialLoadLogic() {\n        // no-op\n    }\n\n    /**\n     * Perform a search.\n     * @param theSearchString the trimmed search string\n     * @param theContentFilter the content filter to use. FIXME: unused param\n     * @param theSortFilter FIXME: unused param\n     */\n    private void search(@NonNull final String theSearchString,\n                        final String[] theContentFilter,\n                        final String theSortFilter) {\n        if (DEBUG) {\n            Log.d(TAG, \"search() called with: query = [\" + theSearchString + \"]\");\n        }\n        if (theSearchString.isEmpty()) {\n            return;\n        }\n\n        // Check if theSearchString is a URL which can be opened by NewPipe directly\n        // and open it if possible.\n        try {\n            final StreamingService streamingService = NewPipe.getServiceByUrl(theSearchString);\n            showLoading();\n            disposables.add(Observable\n                    .fromCallable(() -> NavigationHelper.getIntentByLink(activity,\n                            streamingService, theSearchString))\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(intent -> {\n                        getFM().popBackStackImmediate();\n                        activity.startActivity(intent);\n                    }, throwable -> showTextError(getString(R.string.unsupported_url))));\n            return;\n        } catch (final Exception ignored) {\n            // Exception occurred, it's not a url\n        }\n\n        // prepare search\n        lastSearchedString = this.searchString;\n        this.searchString = theSearchString;\n        infoListAdapter.clearStreamItemList();\n        hideSuggestionsPanel();\n        showMetaInfoInTextView(null, searchBinding.searchMetaInfoTextView,\n                searchBinding.searchMetaInfoSeparator, disposables);\n        hideKeyboardSearch();\n\n        // store search query if search history is enabled\n        disposables.add(historyRecordManager.onSearched(serviceId, theSearchString)\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(\n                        ignored -> {\n                        },\n                        throwable -> showSnackBarError(new ErrorInfo(throwable, UserAction.SEARCHED,\n                                theSearchString, serviceId))\n                ));\n\n        // load search results\n        suggestionPublisher.onNext(theSearchString);\n        startLoading(false);\n    }\n\n    @Override\n    public void startLoading(final boolean forceLoad) {\n        super.startLoading(forceLoad);\n        disposables.clear();\n        if (searchDisposable != null) {\n            searchDisposable.dispose();\n        }\n        searchDisposable = ExtractorHelper.searchFor(serviceId,\n                searchString,\n                Arrays.asList(contentFilter),\n                sortFilter)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .doOnEvent((searchResult, throwable) -> isLoading.set(false))\n                .subscribe(this::handleResult, this::onItemError);\n\n    }\n\n    @Override\n    protected void loadMoreItems() {\n        if (!Page.isValid(nextPage)) {\n            return;\n        }\n        isLoading.set(true);\n        showListFooter(true);\n        if (searchDisposable != null) {\n            searchDisposable.dispose();\n        }\n        searchDisposable = ExtractorHelper.getMoreSearchItems(\n                serviceId,\n                searchString,\n                asList(contentFilter),\n                sortFilter,\n                nextPage)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .doOnEvent((nextItemsResult, throwable) -> isLoading.set(false))\n                .subscribe(this::handleNextItems, this::onItemError);\n    }\n\n    @Override\n    protected boolean hasMoreItems() {\n        return Page.isValid(nextPage);\n    }\n\n    @Override\n    protected void onItemSelected(final InfoItem selectedItem) {\n        super.onItemSelected(selectedItem);\n        hideKeyboardSearch();\n    }\n\n    private void onItemError(final Throwable exception) {\n        if (exception instanceof SearchExtractor.NothingFoundException) {\n            infoListAdapter.clearStreamItemList();\n            showEmptyState();\n        } else {\n            showError(new ErrorInfo(exception, UserAction.SEARCHED, searchString, serviceId,\n                    getOpenInBrowserUrlForErrors()));\n        }\n    }\n\n    @Nullable\n    private String getOpenInBrowserUrlForErrors() {\n        if (TextUtils.isEmpty(searchString)) {\n            return null;\n        }\n        try {\n            return service.getSearchQHFactory().getUrl(searchString,\n                    Arrays.asList(contentFilter), sortFilter);\n        } catch (final NullPointerException | ParsingException ignored) {\n            return null;\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void changeContentFilter(final MenuItem item, final List<String> theContentFilter) {\n        filterItemCheckedId = item.getItemId();\n        item.setChecked(true);\n\n        if (service != null) {\n            final boolean isNotFiltered = theContentFilter.isEmpty()\n                    || \"all\".equals(theContentFilter.get(0));\n            if (isNotFiltered) {\n                searchEditText.setHint(\n                        getString(R.string.search_with_service_name,\n                                service.getServiceInfo().getName()));\n            } else {\n                searchEditText.setHint(getString(R.string.search_with_service_name_and_filter,\n                        service.getServiceInfo().getName(),\n                        item.getTitle()));\n            }\n        }\n\n        contentFilter = theContentFilter.toArray(new String[0]);\n\n        if (!TextUtils.isEmpty(searchString)) {\n            search(searchString, contentFilter, sortFilter);\n        }\n    }\n\n    private void setQuery(final int theServiceId,\n                          final String theSearchString,\n                          final String[] theContentFilter,\n                          final String theSortFilter) {\n        serviceId = theServiceId;\n        searchString = theSearchString;\n        contentFilter = theContentFilter;\n        sortFilter = theSortFilter;\n    }\n\n    private String getSearchEditString() {\n        return searchEditText.getText().toString();\n    }\n\n    private boolean isSearchEditBlank() {\n        return isBlank(getSearchEditString());\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Suggestion Results\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public void handleSuggestions(@NonNull final List<SuggestionItem> suggestions) {\n        if (DEBUG) {\n            Log.d(TAG, \"handleSuggestions() called with: suggestions = [\" + suggestions + \"]\");\n        }\n        suggestionListAdapter.submitList(suggestions,\n                () -> {\n                    if (searchBinding != null) {\n                        searchBinding.suggestionsList.scrollToPosition(0);\n                    }\n                });\n\n        if (suggestionsPanelVisible && isErrorPanelVisible()) {\n            hideLoading();\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Contract\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void hideLoading() {\n        super.hideLoading();\n        showListFooter(false);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Search Results\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void handleResult(@NonNull final SearchInfo result) {\n        final List<Throwable> exceptions = result.getErrors();\n        if (!exceptions.isEmpty()\n                && !(exceptions.size() == 1\n                && exceptions.get(0) instanceof SearchExtractor.NothingFoundException)) {\n            showSnackBarError(new ErrorInfo(result.getErrors(), UserAction.SEARCHED,\n                    searchString, serviceId, getOpenInBrowserUrlForErrors()));\n        }\n\n        searchSuggestion = result.getSearchSuggestion();\n        if (searchSuggestion != null) {\n            searchSuggestion = searchSuggestion.trim();\n        }\n        isCorrectedSearch = result.isCorrectedSearch();\n\n        // List<MetaInfo> cannot be bundled without creating some containers\n        metaInfo = result.getMetaInfo().toArray(new MetaInfo[0]);\n        showMetaInfoInTextView(result.getMetaInfo(), searchBinding.searchMetaInfoTextView,\n                searchBinding.searchMetaInfoSeparator, disposables);\n\n        handleSearchSuggestion();\n\n        lastSearchedString = searchString;\n        nextPage = result.getNextPage();\n\n        if (infoListAdapter.getItemsList().isEmpty()) {\n            if (!result.getRelatedItems().isEmpty()) {\n                infoListAdapter.addInfoItemList(result.getRelatedItems());\n            } else {\n                infoListAdapter.clearStreamItemList();\n                showEmptyState();\n                return;\n            }\n        }\n\n        super.handleResult(result);\n    }\n\n    private void handleSearchSuggestion() {\n        if (TextUtils.isEmpty(searchSuggestion)) {\n            searchBinding.correctSuggestion.setVisibility(View.GONE);\n        } else {\n            final String helperText = getString(isCorrectedSearch\n                    ? R.string.search_showing_result_for\n                    : R.string.did_you_mean);\n\n            final String highlightedSearchSuggestion =\n                    \"<b><i>\" + Html.escapeHtml(searchSuggestion) + \"</i></b>\";\n            final String text = String.format(helperText, highlightedSearchSuggestion);\n            searchBinding.correctSuggestion.setText(HtmlCompat.fromHtml(text,\n                    HtmlCompat.FROM_HTML_MODE_LEGACY));\n\n            searchBinding.correctSuggestion.setOnClickListener(v -> {\n                searchBinding.correctSuggestion.setVisibility(View.GONE);\n                search(searchSuggestion, contentFilter, sortFilter);\n                searchEditText.setText(searchSuggestion);\n            });\n\n            searchBinding.correctSuggestion.setOnLongClickListener(v -> {\n                searchEditText.setText(searchSuggestion);\n                searchEditText.setSelection(searchSuggestion.length());\n                showKeyboardSearch();\n                return true;\n            });\n\n            searchBinding.correctSuggestion.setVisibility(View.VISIBLE);\n        }\n    }\n\n    @Override\n    public void handleNextItems(final ListExtractor.InfoItemsPage<?> result) {\n        showListFooter(false);\n        infoListAdapter.addInfoItemList(result.getItems());\n\n        if (!result.getErrors().isEmpty()) {\n            // nextPage should be non-null at this point, because it refers to the page\n            // whose results are handled here, but let's check it anyway\n            if (nextPage == null) {\n                showSnackBarError(new ErrorInfo(result.getErrors(), UserAction.SEARCHED,\n                        \"\\\"\" + searchString + \"\\\" → nextPage == null\", serviceId,\n                        getOpenInBrowserUrlForErrors()));\n            } else {\n                showSnackBarError(new ErrorInfo(result.getErrors(), UserAction.SEARCHED,\n                        \"\\\"\" + searchString + \"\\\" → pageUrl: \" + nextPage.getUrl() + \", \"\n                                + \"pageIds: \" + nextPage.getIds() + \", \"\n                                + \"pageCookies: \" + nextPage.getCookies(),\n                        serviceId, getOpenInBrowserUrlForErrors()));\n            }\n        }\n\n        // keep the reassignment of nextPage after the error handling to ensure that nextPage\n        // still holds the correct value during the error handling\n        nextPage = result.getNextPage();\n        super.handleNextItems(result);\n    }\n\n    @Override\n    public void handleError() {\n        super.handleError();\n        hideSuggestionsPanel();\n        hideKeyboardSearch();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Suggestion item touch helper\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public int getSuggestionMovementFlags(@NonNull final RecyclerView.ViewHolder viewHolder) {\n        final int position = viewHolder.getBindingAdapterPosition();\n        if (position == RecyclerView.NO_POSITION) {\n            return 0;\n        }\n\n        final SuggestionItem item = suggestionListAdapter.getCurrentList().get(position);\n        return item.fromHistory ? makeMovementFlags(0,\n                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) : 0;\n    }\n\n    public void onSuggestionItemSwiped(@NonNull final RecyclerView.ViewHolder viewHolder) {\n        final int position = viewHolder.getBindingAdapterPosition();\n        final String query = suggestionListAdapter.getCurrentList().get(position).query;\n        final Disposable onDelete = historyRecordManager.deleteSearchHistory(query)\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(\n                        howManyDeleted -> suggestionPublisher\n                                .onNext(getSearchEditString()),\n                        throwable -> showSnackBarError(new ErrorInfo(throwable,\n                                UserAction.DELETE_FROM_HISTORY, \"Deleting item failed\")));\n        disposables.add(onDelete);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionItem.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.fragments.list.search\n\nclass SuggestionItem(@JvmField val fromHistory: Boolean, @JvmField val query: String) {\n    override fun equals(other: Any?): Boolean {\n        if (other is SuggestionItem) {\n            return query == other.query\n        }\n        return false\n    }\n\n    override fun hashCode() = query.hashCode()\n\n    override fun toString() = \"[$fromHistory→$query]\"\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.fragments.list.search\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.ItemSearchSuggestionBinding\nimport org.schabi.newpipe.fragments.list.search.SuggestionListAdapter.SuggestionItemHolder\n\nclass SuggestionListAdapter :\n    ListAdapter<SuggestionItem, SuggestionItemHolder>(SuggestionItemCallback()) {\n\n    var listener: OnSuggestionItemSelected? = null\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SuggestionItemHolder {\n        return SuggestionItemHolder(\n            ItemSearchSuggestionBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        )\n    }\n\n    override fun onBindViewHolder(holder: SuggestionItemHolder, position: Int) {\n        val currentItem = getItem(position)\n        holder.updateFrom(currentItem)\n        holder.binding.suggestionSearch.setOnClickListener {\n            listener?.onSuggestionItemSelected(currentItem)\n        }\n        holder.binding.suggestionSearch.setOnLongClickListener {\n            listener?.onSuggestionItemLongClick(currentItem)\n            true\n        }\n        holder.binding.suggestionInsert.setOnClickListener {\n            listener?.onSuggestionItemInserted(currentItem)\n        }\n    }\n\n    interface OnSuggestionItemSelected {\n        fun onSuggestionItemSelected(item: SuggestionItem)\n\n        fun onSuggestionItemInserted(item: SuggestionItem)\n\n        fun onSuggestionItemLongClick(item: SuggestionItem)\n    }\n\n    class SuggestionItemHolder(val binding: ItemSearchSuggestionBinding) :\n        RecyclerView.ViewHolder(binding.getRoot()) {\n        fun updateFrom(item: SuggestionItem) {\n            binding.itemSuggestionIcon.setImageResource(\n                if (item.fromHistory) {\n                    R.drawable.ic_history\n                } else {\n                    R.drawable.ic_search\n                }\n            )\n            binding.itemSuggestionQuery.text = item.query\n        }\n    }\n\n    private class SuggestionItemCallback : DiffUtil.ItemCallback<SuggestionItem>() {\n        override fun areItemsTheSame(oldItem: SuggestionItem, newItem: SuggestionItem): Boolean {\n            return oldItem.fromHistory == newItem.fromHistory && oldItem.query == newItem.query\n        }\n\n        override fun areContentsTheSame(oldItem: SuggestionItem, newItem: SuggestionItem): Boolean {\n            return true // items' contents never change; the list of items themselves does\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java",
    "content": "package org.schabi.newpipe.fragments.list.videos;\n\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.fragment.app.Fragment;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.RelatedItemsHeaderBinding;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.ListExtractor;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.fragments.list.BaseListInfoFragment;\nimport org.schabi.newpipe.info_list.ItemViewMode;\nimport org.schabi.newpipe.info_list.dialog.InfoItemDialog;\nimport org.schabi.newpipe.ktx.ViewUtils;\n\nimport java.io.Serializable;\nimport java.util.function.Supplier;\n\nimport io.reactivex.rxjava3.core.Single;\n\npublic class RelatedItemsFragment extends BaseListInfoFragment<InfoItem, RelatedItemsInfo>\n        implements SharedPreferences.OnSharedPreferenceChangeListener {\n    private static final String INFO_KEY = \"related_info_key\";\n\n    private RelatedItemsInfo relatedItemsInfo;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Views\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private RelatedItemsHeaderBinding headerBinding;\n\n    public static RelatedItemsFragment getInstance(final StreamInfo info) {\n        final RelatedItemsFragment instance = new RelatedItemsFragment();\n        instance.setInitialData(info);\n        return instance;\n    }\n\n    public RelatedItemsFragment() {\n        super(UserAction.REQUESTED_STREAM);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // LifeCycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_related_items, container, false);\n    }\n\n    @Override\n    public void onDestroyView() {\n        headerBinding = null;\n        super.onDestroyView();\n    }\n\n    @Override\n    protected Supplier<View> getListHeaderSupplier() {\n        if (relatedItemsInfo == null || relatedItemsInfo.getRelatedItems() == null) {\n            return null;\n        }\n\n        headerBinding = RelatedItemsHeaderBinding\n                .inflate(activity.getLayoutInflater(), itemsList, false);\n\n        final SharedPreferences pref = PreferenceManager\n                .getDefaultSharedPreferences(requireContext());\n        final boolean autoplay = pref.getBoolean(getString(R.string.auto_queue_key), false);\n        headerBinding.autoplaySwitch.setChecked(autoplay);\n        headerBinding.autoplaySwitch.setOnCheckedChangeListener((compoundButton, b) ->\n                PreferenceManager.getDefaultSharedPreferences(requireContext()).edit()\n                        .putBoolean(getString(R.string.auto_queue_key), b).apply());\n\n        return headerBinding::getRoot;\n    }\n\n    @Override\n    protected Single<ListExtractor.InfoItemsPage<InfoItem>> loadMoreItemsLogic() {\n        return Single.fromCallable(ListExtractor.InfoItemsPage::emptyPage);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Contract\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected Single<RelatedItemsInfo> loadResult(final boolean forceLoad) {\n        return Single.fromCallable(() -> relatedItemsInfo);\n    }\n\n    @Override\n    public void showLoading() {\n        super.showLoading();\n        if (headerBinding != null) {\n            headerBinding.getRoot().setVisibility(View.INVISIBLE);\n        }\n    }\n\n    @Override\n    public void handleResult(@NonNull final RelatedItemsInfo result) {\n        super.handleResult(result);\n\n        if (headerBinding != null) {\n            headerBinding.getRoot().setVisibility(View.VISIBLE);\n        }\n        ViewUtils.slideUp(requireView(), 120, 96, 0.06f);\n\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void setTitle(final String title) {\n        // Nothing to do - override parent\n    }\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) {\n        // Nothing to do - override parent\n    }\n\n    private void setInitialData(final StreamInfo info) {\n        super.setInitialData(info.getServiceId(), info.getUrl(), info.getName());\n        if (this.relatedItemsInfo == null) {\n            this.relatedItemsInfo = new RelatedItemsInfo(info);\n        }\n    }\n\n    @Override\n    public void onSaveInstanceState(@NonNull final Bundle outState) {\n        super.onSaveInstanceState(outState);\n        outState.putSerializable(INFO_KEY, relatedItemsInfo);\n    }\n\n    @Override\n    protected void onRestoreInstanceState(@NonNull final Bundle savedState) {\n        super.onRestoreInstanceState(savedState);\n        final Serializable serializable = savedState.getSerializable(INFO_KEY);\n        if (serializable instanceof RelatedItemsInfo) {\n            this.relatedItemsInfo = (RelatedItemsInfo) serializable;\n        }\n    }\n\n    @Override\n    public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences,\n                                          final String key) {\n        if (headerBinding != null && getString(R.string.auto_queue_key).equals(key)) {\n            headerBinding.autoplaySwitch.setChecked(sharedPreferences.getBoolean(key, false));\n        }\n    }\n\n    @Override\n    protected ItemViewMode getItemViewMode() {\n        ItemViewMode mode = super.getItemViewMode();\n        // Only list mode is supported. Either List or card will be used.\n        if (mode != ItemViewMode.LIST && mode != ItemViewMode.CARD) {\n            mode = ItemViewMode.LIST;\n        }\n        return mode;\n    }\n\n    @Override\n    protected void showInfoItemDialog(final StreamInfoItem item) {\n        // Try and attach the InfoItemDialog to the parent fragment of the RelatedItemsFragment\n        // so that its context is not lost when the RelatedItemsFragment is reinitialized,\n        // e.g. when a new stream is loaded in a parent VideoDetailFragment.\n        final Fragment parentFragment = getParentFragment();\n        if (parentFragment != null) {\n            try {\n                new InfoItemDialog.Builder(\n                        parentFragment.getActivity(),\n                        parentFragment.getContext(),\n                        parentFragment,\n                        item\n                ).create().show();\n            } catch (final IllegalArgumentException e) {\n                InfoItemDialog.Builder.reportErrorDuringInitialization(e, item);\n            }\n        } else {\n            super.showInfoItemDialog(item);\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsInfo.java",
    "content": "package org.schabi.newpipe.fragments.list.videos;\n\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.ListInfo;\nimport org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\n\npublic final class RelatedItemsInfo extends ListInfo<InfoItem> {\n    /**\n     * This class is used to wrap the related items of a StreamInfo into a ListInfo object.\n     *\n     * @param info the stream info from which to get related items\n     */\n    public RelatedItemsInfo(final StreamInfo info) {\n        super(info.getServiceId(), new ListLinkHandler(info.getOriginalUrl(), info.getUrl(),\n                info.getId(), Collections.emptyList(), null), info.getName());\n        setRelatedItems(new ArrayList<>(info.getRelatedItems()));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/InfoItemBuilder.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2016-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.info_list\n\nimport android.content.Context\nimport org.schabi.newpipe.extractor.channel.ChannelInfoItem\nimport org.schabi.newpipe.extractor.comments.CommentsInfoItem\nimport org.schabi.newpipe.extractor.playlist.PlaylistInfoItem\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.util.OnClickGesture\n\nclass InfoItemBuilder(val context: Context) {\n    var onStreamSelectedListener: OnClickGesture<StreamInfoItem>? = null\n    var onChannelSelectedListener: OnClickGesture<ChannelInfoItem>? = null\n    var onPlaylistSelectedListener: OnClickGesture<PlaylistInfoItem>? = null\n    var onCommentsSelectedListener: OnClickGesture<CommentsInfoItem>? = null\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/InfoListAdapter.java",
    "content": "package org.schabi.newpipe.info_list;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.databinding.PignateFooterBinding;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.channel.ChannelInfoItem;\nimport org.schabi.newpipe.extractor.comments.CommentsInfoItem;\nimport org.schabi.newpipe.extractor.playlist.PlaylistInfoItem;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.info_list.holder.ChannelCardInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.ChannelGridInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.ChannelInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.ChannelMiniInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.CommentInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.InfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.PlaylistCardInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.PlaylistGridInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.PlaylistInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.PlaylistMiniInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.StreamCardInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.StreamGridInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.StreamInfoItemHolder;\nimport org.schabi.newpipe.info_list.holder.StreamMiniInfoItemHolder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.FallbackViewHolder;\nimport org.schabi.newpipe.util.OnClickGesture;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.function.Supplier;\n\n/*\n * Created by Christian Schabesberger on 01.08.16.\n *\n * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>\n * InfoListAdapter.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic class InfoListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n    private static final String TAG = InfoListAdapter.class.getSimpleName();\n    private static final boolean DEBUG = false;\n\n    private static final int HEADER_TYPE = 0;\n    private static final int FOOTER_TYPE = 1;\n\n    private static final int MINI_STREAM_HOLDER_TYPE = 0x100;\n    private static final int STREAM_HOLDER_TYPE = 0x101;\n    private static final int GRID_STREAM_HOLDER_TYPE = 0x102;\n    private static final int CARD_STREAM_HOLDER_TYPE = 0x103;\n    private static final int MINI_CHANNEL_HOLDER_TYPE = 0x200;\n    private static final int CHANNEL_HOLDER_TYPE = 0x201;\n    private static final int GRID_CHANNEL_HOLDER_TYPE = 0x202;\n    private static final int CARD_CHANNEL_HOLDER_TYPE = 0x203;\n    private static final int MINI_PLAYLIST_HOLDER_TYPE = 0x300;\n    private static final int PLAYLIST_HOLDER_TYPE = 0x301;\n    private static final int GRID_PLAYLIST_HOLDER_TYPE = 0x302;\n    private static final int CARD_PLAYLIST_HOLDER_TYPE = 0x303;\n    private static final int COMMENT_HOLDER_TYPE = 0x400;\n\n    private final LayoutInflater layoutInflater;\n    private final InfoItemBuilder infoItemBuilder;\n    private final List<InfoItem> infoItemList;\n    private final HistoryRecordManager recordManager;\n\n    private boolean useMiniVariant = false;\n    private boolean showFooter = false;\n\n    private ItemViewMode itemMode = ItemViewMode.LIST;\n\n    private Supplier<View> headerSupplier = null;\n\n    public InfoListAdapter(final Context context) {\n        layoutInflater = LayoutInflater.from(context);\n        recordManager = new HistoryRecordManager(context);\n        infoItemBuilder = new InfoItemBuilder(context);\n        infoItemList = new ArrayList<>();\n    }\n\n    public void setOnStreamSelectedListener(final OnClickGesture<StreamInfoItem> listener) {\n        infoItemBuilder.setOnStreamSelectedListener(listener);\n    }\n\n    public void setOnChannelSelectedListener(final OnClickGesture<ChannelInfoItem> listener) {\n        infoItemBuilder.setOnChannelSelectedListener(listener);\n    }\n\n    public void setOnPlaylistSelectedListener(final OnClickGesture<PlaylistInfoItem> listener) {\n        infoItemBuilder.setOnPlaylistSelectedListener(listener);\n    }\n\n    public void setOnCommentsSelectedListener(final OnClickGesture<CommentsInfoItem> listener) {\n        infoItemBuilder.setOnCommentsSelectedListener(listener);\n    }\n\n    public void setUseMiniVariant(final boolean useMiniVariant) {\n        this.useMiniVariant = useMiniVariant;\n    }\n\n    public void setItemViewMode(final ItemViewMode itemViewMode) {\n        this.itemMode = itemViewMode;\n    }\n\n    public void addInfoItemList(@Nullable final List<? extends InfoItem> data) {\n        if (data == null) {\n            return;\n        }\n        if (DEBUG) {\n            Log.d(TAG, \"addInfoItemList() before > infoItemList.size() = \"\n                    + infoItemList.size() + \", data.size() = \" + data.size());\n        }\n\n        final int offsetStart = sizeConsideringHeaderOffset();\n        infoItemList.addAll(data);\n\n        if (DEBUG) {\n            Log.d(TAG, \"addInfoItemList() after > offsetStart = \" + offsetStart + \", \"\n                    + \"infoItemList.size() = \" + infoItemList.size() + \", \"\n                    + \"hasHeader = \" + hasHeader() + \", \"\n                    + \"showFooter = \" + showFooter);\n        }\n        notifyItemRangeInserted(offsetStart, data.size());\n\n        if (showFooter) {\n            final int footerNow = sizeConsideringHeaderOffset();\n            notifyItemMoved(offsetStart, footerNow);\n\n            if (DEBUG) {\n                Log.d(TAG, \"addInfoItemList() footer from \" + offsetStart\n                        + \" to \" + footerNow);\n            }\n        }\n    }\n\n    public void clearStreamItemList() {\n        if (infoItemList.isEmpty()) {\n            return;\n        }\n        infoItemList.clear();\n        notifyDataSetChanged();\n    }\n\n    public void setHeaderSupplier(@Nullable final Supplier<View> headerSupplier) {\n        final boolean changed = headerSupplier != this.headerSupplier;\n        this.headerSupplier = headerSupplier;\n        if (changed) {\n            notifyDataSetChanged();\n        }\n    }\n\n    protected boolean hasHeader() {\n        return this.headerSupplier != null;\n    }\n\n    public void showFooter(final boolean show) {\n        if (DEBUG) {\n            Log.d(TAG, \"showFooter() called with: show = [\" + show + \"]\");\n        }\n        if (show == showFooter) {\n            return;\n        }\n\n        showFooter = show;\n        if (show) {\n            notifyItemInserted(sizeConsideringHeaderOffset());\n        } else {\n            notifyItemRemoved(sizeConsideringHeaderOffset());\n        }\n    }\n\n    private int sizeConsideringHeaderOffset() {\n        final int i = infoItemList.size() + (hasHeader() ? 1 : 0);\n        if (DEBUG) {\n            Log.d(TAG, \"sizeConsideringHeaderOffset() called → \" + i);\n        }\n        return i;\n    }\n\n    public List<InfoItem> getItemsList() {\n        return infoItemList;\n    }\n\n    @Override\n    public int getItemCount() {\n        int count = infoItemList.size();\n        if (hasHeader()) {\n            count++;\n        }\n        if (showFooter) {\n            count++;\n        }\n\n        if (DEBUG) {\n            Log.d(TAG, \"getItemCount() called with: \"\n                    + \"count = \" + count + \", infoItemList.size() = \" + infoItemList.size() + \", \"\n                    + \"hasHeader = \" + hasHeader() + \", \"\n                    + \"showFooter = \" + showFooter);\n        }\n        return count;\n    }\n\n    @SuppressWarnings(\"FinalParameters\")\n    @Override\n    public int getItemViewType(int position) {\n        if (DEBUG) {\n            Log.d(TAG, \"getItemViewType() called with: position = [\" + position + \"]\");\n        }\n\n        if (hasHeader() && position == 0) {\n            return HEADER_TYPE;\n        } else if (hasHeader()) {\n            position--;\n        }\n        if (position == infoItemList.size() && showFooter) {\n            return FOOTER_TYPE;\n        }\n        final InfoItem item = infoItemList.get(position);\n        switch (item.getInfoType()) {\n            case STREAM:\n                if (itemMode == ItemViewMode.CARD) {\n                    return CARD_STREAM_HOLDER_TYPE;\n                } else if (itemMode == ItemViewMode.GRID) {\n                    return GRID_STREAM_HOLDER_TYPE;\n                } else if (useMiniVariant) {\n                    return MINI_STREAM_HOLDER_TYPE;\n                } else {\n                    return STREAM_HOLDER_TYPE;\n                }\n            case CHANNEL:\n                if (itemMode == ItemViewMode.CARD) {\n                    return CARD_CHANNEL_HOLDER_TYPE;\n                } else if (itemMode == ItemViewMode.GRID) {\n                    return GRID_CHANNEL_HOLDER_TYPE;\n                } else if (useMiniVariant) {\n                    return MINI_CHANNEL_HOLDER_TYPE;\n                } else {\n                    return CHANNEL_HOLDER_TYPE;\n                }\n            case PLAYLIST:\n                if (itemMode == ItemViewMode.CARD) {\n                    return CARD_PLAYLIST_HOLDER_TYPE;\n                } else if (itemMode == ItemViewMode.GRID) {\n                    return GRID_PLAYLIST_HOLDER_TYPE;\n                } else if (useMiniVariant) {\n                    return MINI_PLAYLIST_HOLDER_TYPE;\n                } else {\n                    return PLAYLIST_HOLDER_TYPE;\n                }\n            case COMMENT:\n                return COMMENT_HOLDER_TYPE;\n            default:\n                return -1;\n        }\n    }\n\n    @NonNull\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent,\n                                                      final int type) {\n        if (DEBUG) {\n            Log.d(TAG, \"onCreateViewHolder() called with: \"\n                    + \"parent = [\" + parent + \"], type = [\" + type + \"]\");\n        }\n        switch (type) {\n            // #4475 and #3368\n            // Always create a new instance otherwise the same instance\n            // is sometimes reused which causes a crash\n            case HEADER_TYPE:\n                return new HFHolder(headerSupplier.get());\n            case FOOTER_TYPE:\n                return new HFHolder(PignateFooterBinding\n                        .inflate(layoutInflater, parent, false)\n                        .getRoot()\n                );\n            case MINI_STREAM_HOLDER_TYPE:\n                return new StreamMiniInfoItemHolder(infoItemBuilder, parent);\n            case STREAM_HOLDER_TYPE:\n                return new StreamInfoItemHolder(infoItemBuilder, parent);\n            case GRID_STREAM_HOLDER_TYPE:\n                return new StreamGridInfoItemHolder(infoItemBuilder, parent);\n            case CARD_STREAM_HOLDER_TYPE:\n                return new StreamCardInfoItemHolder(infoItemBuilder, parent);\n            case MINI_CHANNEL_HOLDER_TYPE:\n                return new ChannelMiniInfoItemHolder(infoItemBuilder, parent);\n            case CHANNEL_HOLDER_TYPE:\n                return new ChannelInfoItemHolder(infoItemBuilder, parent);\n            case CARD_CHANNEL_HOLDER_TYPE:\n                return new ChannelCardInfoItemHolder(infoItemBuilder, parent);\n            case GRID_CHANNEL_HOLDER_TYPE:\n                return new ChannelGridInfoItemHolder(infoItemBuilder, parent);\n            case MINI_PLAYLIST_HOLDER_TYPE:\n                return new PlaylistMiniInfoItemHolder(infoItemBuilder, parent);\n            case PLAYLIST_HOLDER_TYPE:\n                return new PlaylistInfoItemHolder(infoItemBuilder, parent);\n            case GRID_PLAYLIST_HOLDER_TYPE:\n                return new PlaylistGridInfoItemHolder(infoItemBuilder, parent);\n            case CARD_PLAYLIST_HOLDER_TYPE:\n                return new PlaylistCardInfoItemHolder(infoItemBuilder, parent);\n            case COMMENT_HOLDER_TYPE:\n                return new CommentInfoItemHolder(infoItemBuilder, parent);\n            default:\n                return new FallbackViewHolder(new View(parent.getContext()));\n        }\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder,\n                                 final int position) {\n        if (DEBUG) {\n            Log.d(TAG, \"onBindViewHolder() called with: \"\n                    + \"holder = [\" + holder.getClass().getSimpleName() + \"], \"\n                    + \"position = [\" + position + \"]\");\n        }\n        if (holder instanceof InfoItemHolder) {\n            ((InfoItemHolder) holder).updateFromItem(\n                    // If header is present, offset the items by -1\n                    infoItemList.get(hasHeader() ? position - 1 : position), recordManager);\n        }\n    }\n\n    public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) {\n        return new GridLayoutManager.SpanSizeLookup() {\n            @Override\n            public int getSpanSize(final int position) {\n                final int type = getItemViewType(position);\n                return type == HEADER_TYPE || type == FOOTER_TYPE ? spanCount : 1;\n            }\n        };\n    }\n\n    static class HFHolder extends RecyclerView.ViewHolder {\n        HFHolder(final View v) {\n            super(v);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/ItemViewMode.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2023-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.info_list\n\n/**\n * Item view mode for streams & playlist listing screens.\n */\nenum class ItemViewMode {\n    /**\n     * Default mode.\n     */\n    AUTO,\n\n    /**\n     * Full width list item with thumb on the left and two line title & uploader in right.\n     */\n    LIST,\n\n    /**\n     * Grid mode places two cards per row.\n     */\n    GRID,\n\n    /**\n     * A full width card in phone - portrait.\n     */\n    CARD\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentAdapter.kt",
    "content": "package org.schabi.newpipe.info_list\n\nimport android.util.Log\nimport com.xwray.groupie.GroupieAdapter\nimport kotlin.math.max\nimport org.schabi.newpipe.extractor.stream.StreamInfo\n\n/**\n * Custom RecyclerView.Adapter/GroupieAdapter for [StreamSegmentItem] for handling selection state.\n */\nclass StreamSegmentAdapter(\n    private val listener: StreamSegmentListener\n) : GroupieAdapter() {\n\n    var currentIndex: Int = 0\n        private set\n\n    /**\n     * Returns `true` if the provided [StreamInfo] contains segments, `false` otherwise.\n     */\n    fun setItems(info: StreamInfo): Boolean {\n        if (info.streamSegments.isNotEmpty()) {\n            clear()\n            addAll(info.streamSegments.map { StreamSegmentItem(it, listener) })\n            return true\n        }\n        return false\n    }\n\n    fun selectSegment(segment: StreamSegmentItem) {\n        unSelectCurrentSegment()\n        currentIndex = max(0, getAdapterPosition(segment))\n        segment.isSelected = true\n        segment.notifyChanged(StreamSegmentItem.PAYLOAD_SELECT)\n    }\n\n    fun selectSegmentAt(position: Int) {\n        try {\n            selectSegment(getGroupAtAdapterPosition(position) as StreamSegmentItem)\n        } catch (e: IndexOutOfBoundsException) {\n            // Just to make sure that getGroupAtAdapterPosition doesn't close the app\n            // Shouldn't happen since setItems is always called before select-methods but just in case\n            currentIndex = 0\n            Log.e(\"StreamSegmentAdapter\", \"selectSegmentAt: ${e.message}\")\n        }\n    }\n\n    private fun unSelectCurrentSegment() {\n        try {\n            val segmentItem = getGroupAtAdapterPosition(currentIndex) as StreamSegmentItem\n            currentIndex = 0\n            segmentItem.isSelected = false\n            segmentItem.notifyChanged(StreamSegmentItem.PAYLOAD_SELECT)\n        } catch (e: IndexOutOfBoundsException) {\n            // Just to make sure that getGroupAtAdapterPosition doesn't close the app\n            // Shouldn't happen since setItems is always called before select-methods but just in case\n            currentIndex = 0\n            Log.e(\"StreamSegmentAdapter\", \"unSelectCurrentSegment: ${e.message}\")\n        }\n    }\n\n    interface StreamSegmentListener {\n        fun onItemClick(item: StreamSegmentItem, seconds: Int)\n        fun onItemLongClick(item: StreamSegmentItem, seconds: Int)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/StreamSegmentItem.kt",
    "content": "package org.schabi.newpipe.info_list\n\nimport android.view.View\nimport com.xwray.groupie.viewbinding.BindableItem\nimport com.xwray.groupie.viewbinding.GroupieViewHolder\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.ItemStreamSegmentBinding\nimport org.schabi.newpipe.extractor.stream.StreamSegment\nimport org.schabi.newpipe.util.Localization\nimport org.schabi.newpipe.util.image.CoilHelper\n\nclass StreamSegmentItem(\n    private val item: StreamSegment,\n    private val onClick: StreamSegmentAdapter.StreamSegmentListener\n) : BindableItem<ItemStreamSegmentBinding>() {\n\n    companion object {\n        const val PAYLOAD_SELECT = 1\n    }\n\n    var isSelected = false\n\n    override fun bind(viewBinding: ItemStreamSegmentBinding, position: Int) {\n        CoilHelper.loadThumbnail(viewBinding.previewImage, item.previewUrl)\n        viewBinding.textViewTitle.text = item.title\n        if (item.channelName == null) {\n            viewBinding.textViewChannel.visibility = View.GONE\n            // When the channel name is displayed there is less space\n            // and thus the segment title needs to be only one line height.\n            // But when there is no channel name displayed, the title can be two lines long.\n            // The default maxLines value is set to 1 to display all elements in the AS preview,\n            viewBinding.textViewTitle.maxLines = 2\n        } else {\n            viewBinding.textViewChannel.text = item.channelName\n            viewBinding.textViewChannel.visibility = View.VISIBLE\n        }\n        viewBinding.textViewStartSeconds.text =\n            Localization.getDurationString(item.startTimeSeconds.toLong())\n        viewBinding.root.setOnClickListener { onClick.onItemClick(this, item.startTimeSeconds) }\n        viewBinding.root.setOnLongClickListener {\n            onClick.onItemLongClick(this, item.startTimeSeconds)\n            true\n        }\n        viewBinding.root.isSelected = isSelected\n    }\n\n    override fun bind(\n        viewHolder: GroupieViewHolder<ItemStreamSegmentBinding>,\n        position: Int,\n        payloads: MutableList<Any>\n    ) {\n        if (payloads.contains(PAYLOAD_SELECT)) {\n            viewHolder.root.isSelected = isSelected\n            return\n        }\n        super.bind(viewHolder, position, payloads)\n    }\n\n    override fun getLayout() = R.layout.item_stream_segment\n\n    override fun initializeViewBinding(view: View) = ItemStreamSegmentBinding.bind(view)\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/dialog/InfoItemDialog.java",
    "content": "package org.schabi.newpipe.info_list.dialog;\n\nimport static org.schabi.newpipe.MainActivity.DEBUG;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.os.Build;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.fragment.app.Fragment;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.App;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.extractor.stream.StreamType;\nimport org.schabi.newpipe.player.helper.PlayerHolder;\nimport org.schabi.newpipe.util.StreamTypeUtil;\nimport org.schabi.newpipe.util.external_communication.KoreUtils;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Stream;\n\n/**\n * Dialog for a {@link StreamInfoItem}.\n * The dialog's content are actions that can be performed on the {@link StreamInfoItem}.\n * This dialog is mostly used for longpress context menus.\n */\npublic final class InfoItemDialog {\n    private static final String TAG = Build.class.getSimpleName();\n    /**\n     * Ideally, {@link InfoItemDialog} would extend {@link AlertDialog}.\n     * However, extending {@link AlertDialog} requires many additional lines\n     * and brings more complexity to this class, especially the constructor.\n     * To circumvent this, an {@link AlertDialog.Builder} is used in the constructor.\n     * Its result is stored in this class variable to allow access via the {@link #show()} method.\n     */\n    private final AlertDialog dialog;\n\n    private InfoItemDialog(@NonNull final Activity activity,\n                           @NonNull final Fragment fragment,\n                           @NonNull final StreamInfoItem info,\n                           @NonNull final List<StreamDialogEntry> entries) {\n\n        // Create the dialog's title\n        final View bannerView = View.inflate(activity, R.layout.dialog_title, null);\n        bannerView.setSelected(true);\n\n        final TextView titleView = bannerView.findViewById(R.id.itemTitleView);\n        titleView.setText(info.getName());\n\n        final TextView detailsView = bannerView.findViewById(R.id.itemAdditionalDetails);\n        if (info.getUploaderName() != null) {\n            detailsView.setText(info.getUploaderName());\n            detailsView.setVisibility(View.VISIBLE);\n        } else {\n            detailsView.setVisibility(View.GONE);\n        }\n\n        // Get the entry's descriptions which are displayed in the dialog\n        final String[] items = entries.stream()\n                .map(entry -> entry.getString(activity)).toArray(String[]::new);\n\n        // Call an entry's action / onClick method when the entry is selected.\n        final DialogInterface.OnClickListener action = (d, index) ->\n            entries.get(index).action.onClick(fragment, info);\n\n        dialog = new AlertDialog.Builder(activity)\n                .setCustomTitle(bannerView)\n                .setItems(items, action)\n                .create();\n\n    }\n\n    public void show() {\n        dialog.show();\n    }\n\n    /**\n     * <p>Builder to generate a {@link InfoItemDialog} for a {@link StreamInfoItem}.</p>\n     * Use {@link #addEntry(StreamDialogDefaultEntry)}\n     * and {@link #addAllEntries(StreamDialogDefaultEntry...)} to add options to the dialog.\n     * <br>\n     * Custom actions for entries can be set using\n     * {@link #setAction(StreamDialogDefaultEntry, StreamDialogEntry.StreamDialogEntryAction)}.\n     */\n    public static class Builder {\n        @NonNull private final Activity activity;\n        @NonNull private final Context context;\n        @NonNull private final StreamInfoItem infoItem;\n        @NonNull private final Fragment fragment;\n        @NonNull private final List<StreamDialogEntry> entries = new ArrayList<>();\n        private final boolean addDefaultEntriesAutomatically;\n\n        /**\n         * <p>Create a {@link Builder builder} instance for a {@link StreamInfoItem}\n         * that automatically adds the some default entries\n         * at the top and bottom of the dialog.</p>\n         * The dialog has the following structure:\n         * <pre>\n         *     + - - - - - - - - - - - - - - - - - - - - - -+\n         *     | ENQUEUE                                    |\n         *     | ENQUEUE_NEXT                               |\n         *     | START_ON_BACKGROUND                        |\n         *     | START_ON_POPUP                             |\n         *     + - - - - - - - - - - - - - - - - - - - - - -+\n         *     | entries added manually with                |\n         *     | addEntry() and addAllEntries()             |\n         *     + - - - - - - - - - - - - - - - - - - - - - -+\n         *     | APPEND_PLAYLIST                            |\n         *     | SHARE                                      |\n         *     | OPEN_IN_BROWSER                            |\n         *     | PLAY_WITH_KODI                             |\n         *     | MARK_AS_WATCHED                            |\n         *     | SHOW_CHANNEL_DETAILS                       |\n         *     + - - - - - - - - - - - - - - - - - - - - - -+\n         * </pre>\n         * Please note that some entries are not added depending on the user's preferences,\n         * the item's {@link StreamType} and the current player state.\n         *\n         * @param activity\n         * @param context\n         * @param fragment\n         * @param infoItem the item for this dialog; all entries and their actions work with\n         *                this {@link StreamInfoItem}\n         * @throws IllegalArgumentException if <code>activity, context</code>\n         *         or resources is <code>null</code>\n         */\n        public Builder(final Activity activity,\n                       final Context context,\n                       @NonNull final Fragment fragment,\n                       @NonNull final StreamInfoItem infoItem) {\n            this(activity, context, fragment, infoItem, true);\n        }\n\n        /**\n         * <p>Create an instance of this {@link Builder} for a {@link StreamInfoItem}.</p>\n         * <p>If {@code addDefaultEntriesAutomatically} is set to {@code true},\n         * some default entries are added to the top and bottom of the dialog.</p>\n         * The dialog has the following structure:\n         * <pre>\n         *     + - - - - - - - - - - - - - - - - - - - - - -+\n         *     | ENQUEUE                                    |\n         *     | ENQUEUE_NEXT                               |\n         *     | START_ON_BACKGROUND                        |\n         *     | START_ON_POPUP                             |\n         *     + - - - - - - - - - - - - - - - - - - - - - -+\n         *     | entries added manually with                |\n         *     | addEntry() and addAllEntries()             |\n         *     + - - - - - - - - - - - - - - - - - - - - - -+\n         *     | APPEND_PLAYLIST                            |\n         *     | SHARE                                      |\n         *     | OPEN_IN_BROWSER                            |\n         *     | PLAY_WITH_KODI                             |\n         *     | MARK_AS_WATCHED                            |\n         *     | SHOW_CHANNEL_DETAILS                       |\n         *     + - - - - - - - - - - - - - - - - - - - - - -+\n         * </pre>\n         * Please note that some entries are not added depending on the user's preferences,\n         * the item's {@link StreamType} and the current player state.\n         *\n         * @param activity\n         * @param context\n         * @param fragment\n         * @param infoItem\n         * @param addDefaultEntriesAutomatically\n         *        whether default entries added with {@link #addDefaultBeginningEntries()}\n         *        and {@link #addDefaultEndEntries()} are added automatically when generating\n         *        the {@link InfoItemDialog}.\n         *        <br/>\n         *        Entries added with {@link #addEntry(StreamDialogDefaultEntry)} and\n         *        {@link #addAllEntries(StreamDialogDefaultEntry...)} are added in between.\n         * @throws IllegalArgumentException if <code>activity, context</code>\n         * or resources is <code>null</code>\n         */\n        public Builder(final Activity activity,\n                       final Context context,\n                       @NonNull final Fragment fragment,\n                       @NonNull final StreamInfoItem infoItem,\n                       final boolean addDefaultEntriesAutomatically) {\n            if (activity == null || context == null || context.getResources() == null) {\n                if (DEBUG) {\n                    Log.d(TAG, \"activity, context or resources is null: activity = \"\n                            + activity + \", context = \" + context);\n                }\n                throw new IllegalArgumentException(\"activity, context or resources is null\");\n            }\n            this.activity = activity;\n            this.context = context;\n            this.fragment = fragment;\n            this.infoItem = infoItem;\n            this.addDefaultEntriesAutomatically = addDefaultEntriesAutomatically;\n            if (addDefaultEntriesAutomatically) {\n                addDefaultBeginningEntries();\n            }\n        }\n\n        /**\n         * Adds a new entry and appends it to the current entry list.\n         * @param entry the entry to add\n         * @return the current {@link Builder} instance\n         */\n        public Builder addEntry(@NonNull final StreamDialogDefaultEntry entry) {\n            entries.add(entry.toStreamDialogEntry());\n            return this;\n        }\n\n        /**\n         * Adds new entries. These are appended to the current entry list.\n         * @param newEntries the entries to add\n         * @return the current {@link Builder} instance\n         */\n        public Builder addAllEntries(@NonNull final StreamDialogDefaultEntry... newEntries) {\n            Stream.of(newEntries).forEach(this::addEntry);\n            return this;\n        }\n\n        /**\n         * <p>Change an entries' action that is called when the entry is selected.</p>\n         * <p><strong>Warning:</strong> Only use this method when the entry has been already added.\n         * Changing the action of an entry which has not been added to the Builder yet\n         * does not have an effect.</p>\n         * @param entry the entry to change\n         * @param action the action to perform when the entry is selected\n         * @return the current {@link Builder} instance\n         */\n        public Builder setAction(@NonNull final StreamDialogDefaultEntry entry,\n                              @NonNull final StreamDialogEntry.StreamDialogEntryAction action) {\n            for (int i = 0; i < entries.size(); i++) {\n                if (entries.get(i).resource == entry.resource) {\n                    entries.set(i, new StreamDialogEntry(entry.resource, action));\n                    return this;\n                }\n            }\n            return this;\n        }\n\n        /**\n         * Adds {@link StreamDialogDefaultEntry#ENQUEUE} if the player is open and\n         * {@link StreamDialogDefaultEntry#ENQUEUE_NEXT} if there are multiple streams\n         * in the play queue.\n         * @return the current {@link Builder} instance\n         */\n        public Builder addEnqueueEntriesIfNeeded() {\n            final PlayerHolder holder = PlayerHolder.getInstance();\n            if (holder.isPlayQueueReady()) {\n                addEntry(StreamDialogDefaultEntry.ENQUEUE);\n\n                if (holder.getQueuePosition() < holder.getQueueSize() - 1) {\n                    addEntry(StreamDialogDefaultEntry.ENQUEUE_NEXT);\n                }\n            }\n            return this;\n        }\n\n        /**\n         * Adds the {@link StreamDialogDefaultEntry#START_HERE_ON_BACKGROUND}.\n         * If the {@link #infoItem} is not a pure audio (live) stream,\n         * {@link StreamDialogDefaultEntry#START_HERE_ON_POPUP} is added, too.\n         * @return the current {@link Builder} instance\n         */\n        public Builder addStartHereEntries() {\n            addEntry(StreamDialogDefaultEntry.START_HERE_ON_BACKGROUND);\n            if (!StreamTypeUtil.isAudio(infoItem.getStreamType())) {\n                addEntry(StreamDialogDefaultEntry.START_HERE_ON_POPUP);\n            }\n            return this;\n        }\n\n        /**\n         * Adds {@link StreamDialogDefaultEntry#MARK_AS_WATCHED} if the watch history is enabled\n         * and the stream is not a livestream.\n         * @return the current {@link Builder} instance\n         */\n        public Builder addMarkAsWatchedEntryIfNeeded() {\n            final boolean isWatchHistoryEnabled = PreferenceManager\n                    .getDefaultSharedPreferences(context)\n                    .getBoolean(context.getString(R.string.enable_watch_history_key), false);\n            if (isWatchHistoryEnabled && !StreamTypeUtil.isLiveStream(infoItem.getStreamType())) {\n                addEntry(StreamDialogDefaultEntry.MARK_AS_WATCHED);\n            }\n            return this;\n        }\n\n        /**\n         * Adds the {@link StreamDialogDefaultEntry#PLAY_WITH_KODI} entry if it is needed.\n         * @return the current {@link Builder} instance\n         */\n        public Builder addPlayWithKodiEntryIfNeeded() {\n            if (KoreUtils.shouldShowPlayWithKodi(context, infoItem.getServiceId())) {\n                addEntry(StreamDialogDefaultEntry.PLAY_WITH_KODI);\n            }\n            return this;\n        }\n\n        /**\n         * Add the entries which are usually at the top of the action list.\n         * <br/>\n         * This method adds the \"enqueue\" (see {@link #addEnqueueEntriesIfNeeded()})\n         * and \"start here\" (see {@link #addStartHereEntries()} entries.\n         * @return the current {@link Builder} instance\n         */\n        public Builder addDefaultBeginningEntries() {\n            addEnqueueEntriesIfNeeded();\n            addStartHereEntries();\n            return this;\n        }\n\n        /**\n         * Add the entries which are usually at the bottom of the action list.\n         * @return the current {@link Builder} instance\n         */\n        public Builder addDefaultEndEntries() {\n            addAllEntries(\n                    StreamDialogDefaultEntry.DOWNLOAD,\n                    StreamDialogDefaultEntry.APPEND_PLAYLIST,\n                    StreamDialogDefaultEntry.SHARE,\n                    StreamDialogDefaultEntry.OPEN_IN_BROWSER\n            );\n            addPlayWithKodiEntryIfNeeded();\n            addMarkAsWatchedEntryIfNeeded();\n            addEntry(StreamDialogDefaultEntry.SHOW_CHANNEL_DETAILS);\n            return this;\n        }\n\n        /**\n         * Creates the {@link InfoItemDialog}.\n         * @return a new instance of {@link InfoItemDialog}\n         */\n        public InfoItemDialog create() {\n            if (addDefaultEntriesAutomatically) {\n                addDefaultEndEntries();\n            }\n            return new InfoItemDialog(this.activity, this.fragment, this.infoItem, this.entries);\n        }\n\n        public static void reportErrorDuringInitialization(final Throwable throwable,\n                                                           final InfoItem item) {\n            ErrorUtil.showSnackbar(App.getInstance().getBaseContext(), new ErrorInfo(\n                    throwable,\n                    UserAction.OPEN_INFO_ITEM_DIALOG,\n                    \"none\",\n                    item.getServiceId()));\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogDefaultEntry.java",
    "content": "package org.schabi.newpipe.info_list.dialog;\n\nimport static org.schabi.newpipe.util.NavigationHelper.openChannelFragment;\nimport static org.schabi.newpipe.util.SparseItemUtil.fetchItemInfoIfSparse;\nimport static org.schabi.newpipe.util.SparseItemUtil.fetchStreamInfoAndSaveToDatabase;\nimport static org.schabi.newpipe.util.SparseItemUtil.fetchUploaderUrlIfSparse;\n\nimport android.net.Uri;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.StringRes;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.download.DownloadDialog;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.local.dialog.PlaylistAppendDialog;\nimport org.schabi.newpipe.local.dialog.PlaylistDialog;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.external_communication.KoreUtils;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\n\nimport java.util.List;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\n\n/**\n * <p>\n *     This enum provides entries that are accepted\n *     by the {@link InfoItemDialog.Builder}.\n * </p>\n * <p>\n *     These entries contain a String {@link #resource} which is displayed in the dialog and\n *     a default {@link #action} that is executed\n *     when the entry is selected (via <code>onClick()</code>).\n *     <br/>\n *     They action can be overridden by using the Builder's\n *     {@link InfoItemDialog.Builder#setAction(\n *     StreamDialogDefaultEntry, StreamDialogEntry.StreamDialogEntryAction)}\n *     method.\n * </p>\n */\npublic enum StreamDialogDefaultEntry {\n    SHOW_CHANNEL_DETAILS(R.string.show_channel_details, (fragment, item) ->\n            fetchUploaderUrlIfSparse(fragment.requireContext(), item.getServiceId(), item.getUrl(),\n                    item.getUploaderUrl(), url -> openChannelFragment(fragment, item, url))\n    ),\n\n    /**\n     * Enqueues the stream automatically to the current PlayerType.\n     */\n    ENQUEUE(R.string.enqueue_stream, (fragment, item) ->\n            fetchItemInfoIfSparse(fragment.requireContext(), item, singlePlayQueue ->\n                NavigationHelper.enqueueOnPlayer(fragment.getContext(), singlePlayQueue))\n    ),\n\n    /**\n     * Enqueues the stream automatically to the current PlayerType\n     * after the currently playing stream.\n     */\n    ENQUEUE_NEXT(R.string.enqueue_next_stream, (fragment, item) ->\n            fetchItemInfoIfSparse(fragment.requireContext(), item, singlePlayQueue ->\n                NavigationHelper.enqueueNextOnPlayer(fragment.getContext(), singlePlayQueue))\n    ),\n\n    START_HERE_ON_BACKGROUND(R.string.start_here_on_background, (fragment, item) ->\n            fetchItemInfoIfSparse(fragment.requireContext(), item, singlePlayQueue ->\n                NavigationHelper.playOnBackgroundPlayer(\n                        fragment.getContext(), singlePlayQueue, true))),\n\n    START_HERE_ON_POPUP(R.string.start_here_on_popup, (fragment, item) ->\n            fetchItemInfoIfSparse(fragment.requireContext(), item, singlePlayQueue ->\n                NavigationHelper.playOnPopupPlayer(fragment.getContext(), singlePlayQueue, true))),\n\n    SET_AS_PLAYLIST_THUMBNAIL(R.string.set_as_playlist_thumbnail, (fragment, item) -> {\n        throw new UnsupportedOperationException(\"This needs to be implemented manually \"\n                + \"by using InfoItemDialog.Builder.setAction()\");\n    }),\n\n    DELETE(R.string.delete, (fragment, item) -> {\n        throw new UnsupportedOperationException(\"This needs to be implemented manually \"\n                + \"by using InfoItemDialog.Builder.setAction()\");\n    }),\n\n    /**\n     * Opens a {@link PlaylistDialog} to either append the stream to a playlist\n     * or create a new playlist if there are no local playlists.\n     */\n    APPEND_PLAYLIST(R.string.add_to_playlist, (fragment, item) ->\n        PlaylistDialog.createCorrespondingDialog(\n                fragment.getContext(),\n                List.of(new StreamEntity(item)),\n                dialog -> dialog.show(\n                        fragment.getParentFragmentManager(),\n                        \"StreamDialogEntry@\"\n                                + (dialog instanceof PlaylistAppendDialog ? \"append\" : \"create\")\n                                + \"_playlist\"\n                )\n        )\n    ),\n\n    PLAY_WITH_KODI(R.string.play_with_kodi_title, (fragment, item) ->\n            KoreUtils.playWithKore(fragment.requireContext(), Uri.parse(item.getUrl()))),\n\n    SHARE(R.string.share, (fragment, item) ->\n            ShareUtils.shareText(fragment.requireContext(), item.getName(), item.getUrl(),\n                    item.getThumbnails())),\n\n    /**\n     * Opens a {@link DownloadDialog} after fetching some stream info.\n     * If the user quits the current fragment, it will not open a DownloadDialog.\n     */\n    DOWNLOAD(R.string.download, (fragment, item) ->\n            fetchStreamInfoAndSaveToDatabase(fragment.requireContext(), item.getServiceId(),\n                    item.getUrl(), info -> {\n                        // Ensure the fragment is attached and its state hasn't been saved to avoid\n                        // showing dialog during lifecycle changes or when the activity is paused,\n                        // e.g. by selecting the download option and opening a different fragment.\n                        if (fragment.isAdded() && !fragment.isStateSaved()) {\n                            final DownloadDialog downloadDialog =\n                                    new DownloadDialog(fragment.requireContext(), info);\n                            downloadDialog.show(fragment.getChildFragmentManager(),\n                                    \"downloadDialog\");\n                        }\n                    })\n    ),\n\n    OPEN_IN_BROWSER(R.string.open_in_browser, (fragment, item) ->\n            ShareUtils.openUrlInBrowser(fragment.requireContext(), item.getUrl())),\n\n\n    MARK_AS_WATCHED(R.string.mark_as_watched, (fragment, item) ->\n        new HistoryRecordManager(fragment.getContext())\n                .markAsWatched(item)\n                .doOnError(error -> {\n                    ErrorUtil.showSnackbar(\n                            fragment.requireContext(),\n                            new ErrorInfo(\n                                    error,\n                                    UserAction.OPEN_INFO_ITEM_DIALOG,\n                                    \"Got an error when trying to mark as watched\"\n                            )\n                    );\n                })\n                .onErrorComplete()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe()\n    );\n\n\n    @StringRes\n    public final int resource;\n    @NonNull\n    public final StreamDialogEntry.StreamDialogEntryAction action;\n\n    StreamDialogDefaultEntry(@StringRes final int resource,\n                             @NonNull final StreamDialogEntry.StreamDialogEntryAction action) {\n        this.resource = resource;\n        this.action = action;\n    }\n\n    @NonNull\n    public StreamDialogEntry toStreamDialogEntry() {\n        return new StreamDialogEntry(resource, action);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/dialog/StreamDialogEntry.java",
    "content": "package org.schabi.newpipe.info_list.dialog;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.StringRes;\nimport androidx.fragment.app.Fragment;\n\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\n\npublic class StreamDialogEntry {\n\n    @StringRes\n    public final int resource;\n    @NonNull\n    public final StreamDialogEntryAction action;\n\n    public StreamDialogEntry(@StringRes final int resource,\n                             @NonNull final StreamDialogEntryAction action) {\n        this.resource = resource;\n        this.action = action;\n    }\n\n    public String getString(@NonNull final Context context) {\n        return context.getString(resource);\n    }\n\n    public interface StreamDialogEntryAction {\n        void onClick(Fragment fragment, StreamInfoItem infoItem);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelCardInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\n\npublic class ChannelCardInfoItemHolder extends ChannelMiniInfoItemHolder {\n    public ChannelCardInfoItemHolder(final InfoItemBuilder infoItemBuilder,\n                                     final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_channel_card_item, parent);\n    }\n\n    @Override\n    protected int getDescriptionMaxLineCount(@Nullable final String content) {\n        // Based on `list_channel_card_item` left side content (thumbnail 100dp\n        // + additional details), Right side description can grow up to 8 lines.\n        return 8;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelGridInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\n\npublic class ChannelGridInfoItemHolder extends ChannelMiniInfoItemHolder {\n    public ChannelGridInfoItemHolder(final InfoItemBuilder infoItemBuilder,\n                                     final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_channel_grid_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\n\n/*\n * Created by Christian Schabesberger on 12.02.17.\n *\n * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>\n * ChannelInfoItemHolder .java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic class ChannelInfoItemHolder extends ChannelMiniInfoItemHolder {\n    public ChannelInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_channel_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/ChannelMiniInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.channel.ChannelInfoItem;\nimport org.schabi.newpipe.extractor.utils.Utils;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.image.CoilHelper;\n\npublic class ChannelMiniInfoItemHolder extends InfoItemHolder {\n    private final ImageView itemThumbnailView;\n    private final TextView itemTitleView;\n    private final TextView itemAdditionalDetailView;\n    private final TextView itemChannelDescriptionView;\n\n    ChannelMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId,\n                              final ViewGroup parent) {\n        super(infoItemBuilder, layoutId, parent);\n\n        itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView);\n        itemTitleView = itemView.findViewById(R.id.itemTitleView);\n        itemAdditionalDetailView = itemView.findViewById(R.id.itemAdditionalDetails);\n        itemChannelDescriptionView = itemView.findViewById(R.id.itemChannelDescriptionView);\n    }\n\n    public ChannelMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder,\n                                     final ViewGroup parent) {\n        this(infoItemBuilder, R.layout.list_channel_mini_item, parent);\n    }\n\n    @Override\n    public void updateFromItem(final InfoItem infoItem,\n                               final HistoryRecordManager historyRecordManager) {\n        if (!(infoItem instanceof ChannelInfoItem)) {\n            return;\n        }\n        final ChannelInfoItem item = (ChannelInfoItem) infoItem;\n\n        itemTitleView.setText(item.getName());\n        itemTitleView.setSelected(true);\n\n        final String detailLine = getDetailLine(item);\n        if (detailLine == null) {\n            itemAdditionalDetailView.setVisibility(View.GONE);\n        } else {\n            itemAdditionalDetailView.setVisibility(View.VISIBLE);\n            itemAdditionalDetailView.setText(getDetailLine(item));\n        }\n\n        CoilHelper.INSTANCE.loadAvatar(itemThumbnailView, item.getThumbnails());\n\n        itemView.setOnClickListener(view -> {\n            if (itemBuilder.getOnChannelSelectedListener() != null) {\n                itemBuilder.getOnChannelSelectedListener().selected(item);\n            }\n        });\n\n        itemView.setOnLongClickListener(view -> {\n            if (itemBuilder.getOnChannelSelectedListener() != null) {\n                itemBuilder.getOnChannelSelectedListener().held(item);\n            }\n            return true;\n        });\n\n        if (itemChannelDescriptionView != null) {\n            // itemChannelDescriptionView will be null in the mini variant\n            if (Utils.isBlank(item.getDescription())) {\n                itemChannelDescriptionView.setVisibility(View.GONE);\n            } else {\n                itemChannelDescriptionView.setVisibility(View.VISIBLE);\n                itemChannelDescriptionView.setText(item.getDescription());\n                // setMaxLines utilize the line space for description if the additional details\n                // (sub / video count) are not present.\n                // Case1: 2 lines of description + 1 line additional details\n                // Case2: 3 lines of description (additionalDetails is GONE)\n                itemChannelDescriptionView.setMaxLines(getDescriptionMaxLineCount(detailLine));\n            }\n        }\n    }\n\n    /**\n     * Returns max number of allowed lines for the description field.\n     * @param content additional detail content (video / sub count)\n     * @return max line count\n     */\n    protected int getDescriptionMaxLineCount(@Nullable final String content) {\n        return content == null ? 3 : 2;\n    }\n\n    @Nullable\n    private String getDetailLine(final ChannelInfoItem item) {\n        if (item.getStreamCount() >= 0 && item.getSubscriberCount() >= 0) {\n            return Localization.concatenateStrings(\n                    Localization.shortSubscriberCount(itemBuilder.getContext(),\n                            item.getSubscriberCount()),\n                    Localization.localizeStreamCount(itemBuilder.getContext(),\n                            item.getStreamCount()));\n        } else if (item.getStreamCount() >= 0) {\n            return Localization.localizeStreamCount(itemBuilder.getContext(),\n                    item.getStreamCount());\n        } else if (item.getSubscriberCount() >= 0) {\n            return Localization.shortSubscriberCount(itemBuilder.getContext(),\n                    item.getSubscriberCount());\n        } else {\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport static org.schabi.newpipe.util.ServiceHelper.getServiceById;\nimport static org.schabi.newpipe.util.text.TouchUtils.getOffsetForHorizontalLine;\n\nimport android.text.Spanned;\nimport android.text.method.LinkMovementMethod;\nimport android.text.style.ClickableSpan;\nimport android.text.style.URLSpan;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.ImageView;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.FragmentActivity;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.comments.CommentsInfoItem;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\nimport org.schabi.newpipe.util.image.CoilHelper;\nimport org.schabi.newpipe.util.image.ImageStrategy;\nimport org.schabi.newpipe.util.text.TextEllipsizer;\n\npublic class CommentInfoItemHolder extends InfoItemHolder {\n\n    private static final int COMMENT_DEFAULT_LINES = 2;\n    private final int commentHorizontalPadding;\n    private final int commentVerticalPadding;\n\n    private final RelativeLayout itemRoot;\n    private final ImageView itemThumbnailView;\n    private final TextView itemContentView;\n    private final ImageView itemThumbsUpView;\n    private final TextView itemLikesCountView;\n    private final TextView itemTitleView;\n    private final ImageView itemHeartView;\n    private final ImageView itemPinnedView;\n    private final Button repliesButton;\n\n    @NonNull\n    private final TextEllipsizer textEllipsizer;\n\n    public CommentInfoItemHolder(final InfoItemBuilder infoItemBuilder,\n                                 final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_comment_item, parent);\n\n        itemRoot = itemView.findViewById(R.id.itemRoot);\n        itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView);\n        itemContentView = itemView.findViewById(R.id.itemCommentContentView);\n        itemThumbsUpView = itemView.findViewById(R.id.detail_thumbs_up_img_view);\n        itemLikesCountView = itemView.findViewById(R.id.detail_thumbs_up_count_view);\n        itemTitleView = itemView.findViewById(R.id.itemTitleView);\n        itemHeartView = itemView.findViewById(R.id.detail_heart_image_view);\n        itemPinnedView = itemView.findViewById(R.id.detail_pinned_view);\n        repliesButton = itemView.findViewById(R.id.replies_button);\n\n        commentHorizontalPadding = (int) infoItemBuilder.getContext()\n                .getResources().getDimension(R.dimen.comments_horizontal_padding);\n        commentVerticalPadding = (int) infoItemBuilder.getContext()\n                .getResources().getDimension(R.dimen.comments_vertical_padding);\n\n        textEllipsizer = new TextEllipsizer(itemContentView, COMMENT_DEFAULT_LINES, null);\n        textEllipsizer.setStateChangeListener(isEllipsized -> {\n            if (Boolean.TRUE.equals(isEllipsized)) {\n                denyLinkFocus();\n            } else {\n                determineMovementMethod();\n            }\n        });\n    }\n\n    @Override\n    public void updateFromItem(final InfoItem infoItem,\n                               final HistoryRecordManager historyRecordManager) {\n        if (!(infoItem instanceof CommentsInfoItem item)) {\n            return;\n        }\n\n        // load the author avatar\n        CoilHelper.INSTANCE.loadAvatar(itemThumbnailView, item.getUploaderAvatars());\n        if (ImageStrategy.shouldLoadImages()) {\n            itemThumbnailView.setVisibility(View.VISIBLE);\n            itemRoot.setPadding(commentVerticalPadding, commentVerticalPadding,\n                    commentVerticalPadding, commentVerticalPadding);\n        } else {\n            itemThumbnailView.setVisibility(View.GONE);\n            itemRoot.setPadding(commentHorizontalPadding, commentVerticalPadding,\n                    commentHorizontalPadding, commentVerticalPadding);\n        }\n        itemThumbnailView.setOnClickListener(view -> openCommentAuthor(item));\n\n        // setup the top row, with pinned icon, author name and comment date\n        itemPinnedView.setVisibility(item.isPinned() ? View.VISIBLE : View.GONE);\n        final String uploaderName = Localization.localizeUserName(item.getUploaderName());\n        itemTitleView.setText(Localization.concatenateStrings(\n                uploaderName,\n                Localization.relativeTimeOrTextual(\n                        itemBuilder.getContext(),\n                        item.getUploadDate(),\n                        item.getTextualUploadDate())));\n\n        // setup bottom row, with likes, heart and replies button\n        itemLikesCountView.setText(\n                Localization.likeCount(itemBuilder.getContext(), item.getLikeCount()));\n\n        itemHeartView.setVisibility(item.isHeartedByUploader() ? View.VISIBLE : View.GONE);\n\n        final boolean hasReplies = item.getReplies() != null;\n        repliesButton.setOnClickListener(hasReplies ? v -> openCommentReplies(item) : null);\n        repliesButton.setVisibility(hasReplies ? View.VISIBLE : View.GONE);\n        repliesButton.setText(hasReplies\n                ? Localization.replyCount(itemBuilder.getContext(), item.getReplyCount()) : \"\");\n        ((RelativeLayout.LayoutParams) itemThumbsUpView.getLayoutParams()).topMargin =\n                hasReplies ? 0 : DeviceUtils.dpToPx(6, itemBuilder.getContext());\n\n\n        // setup comment content and click listeners to expand/ellipsize it\n        textEllipsizer.setStreamingService(getServiceById(item.getServiceId()));\n        textEllipsizer.setStreamUrl(item.getUrl());\n        textEllipsizer.setContent(item.getCommentText());\n        textEllipsizer.ellipsize();\n\n        //noinspection ClickableViewAccessibility\n        itemContentView.setOnTouchListener((v, event) -> {\n            final CharSequence text = itemContentView.getText();\n            if (text instanceof Spanned buffer) {\n                final int action = event.getAction();\n\n                if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {\n                    final int offset = getOffsetForHorizontalLine(itemContentView, event);\n                    final var links = buffer.getSpans(offset, offset, ClickableSpan.class);\n\n                    if (links.length != 0) {\n                        if (action == MotionEvent.ACTION_UP) {\n                            links[0].onClick(itemContentView);\n                        }\n                        // we handle events that intersect links, so return true\n                        return true;\n                    }\n                }\n            }\n            return false;\n        });\n\n        itemView.setOnClickListener(view -> {\n            textEllipsizer.toggle();\n            if (itemBuilder.getOnCommentsSelectedListener() != null) {\n                itemBuilder.getOnCommentsSelectedListener().selected(item);\n            }\n        });\n\n        itemView.setOnLongClickListener(view -> {\n            if (DeviceUtils.isTv(itemBuilder.getContext())) {\n                openCommentAuthor(item);\n            } else {\n                final CharSequence text = itemContentView.getText();\n                if (text != null) {\n                    ShareUtils.copyToClipboard(itemBuilder.getContext(), text.toString());\n                }\n            }\n            return true;\n        });\n    }\n\n    private void openCommentAuthor(@NonNull final CommentsInfoItem item) {\n        NavigationHelper.openCommentAuthorIfPresent((FragmentActivity) itemBuilder.getContext(),\n                item);\n    }\n\n    private void openCommentReplies(@NonNull final CommentsInfoItem item) {\n        NavigationHelper.openCommentRepliesFragment((FragmentActivity) itemBuilder.getContext(),\n                item);\n    }\n\n    private void allowLinkFocus() {\n        itemContentView.setMovementMethod(LinkMovementMethod.getInstance());\n    }\n\n    private void denyLinkFocus() {\n        itemContentView.setMovementMethod(null);\n    }\n\n    private boolean shouldFocusLinks() {\n        if (itemView.isInTouchMode()) {\n            return false;\n        }\n\n        final URLSpan[] urls = itemContentView.getUrls();\n\n        return urls != null && urls.length != 0;\n    }\n\n    private void determineMovementMethod() {\n        if (shouldFocusLinks()) {\n            allowLinkFocus();\n        } else {\n            denyLinkFocus();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/InfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\n\n/*\n * Created by Christian Schabesberger on 12.02.17.\n *\n * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>\n * InfoItemHolder.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic abstract class InfoItemHolder extends RecyclerView.ViewHolder {\n    protected final InfoItemBuilder itemBuilder;\n\n    public InfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId,\n                          final ViewGroup parent) {\n        super(LayoutInflater.from(infoItemBuilder.getContext()).inflate(layoutId, parent, false));\n        this.itemBuilder = infoItemBuilder;\n    }\n\n    public abstract void updateFromItem(InfoItem infoItem,\n                                        HistoryRecordManager historyRecordManager);\n\n    public void updateState(final InfoItem infoItem,\n                            final HistoryRecordManager historyRecordManager) { }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistCardInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\n\n/**\n * Playlist card layout.\n */\npublic class PlaylistCardInfoItemHolder extends PlaylistMiniInfoItemHolder {\n\n    public PlaylistCardInfoItemHolder(final InfoItemBuilder infoItemBuilder,\n                                      final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_playlist_card_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistGridInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\n\npublic class PlaylistGridInfoItemHolder extends PlaylistMiniInfoItemHolder {\n    public PlaylistGridInfoItemHolder(final InfoItemBuilder infoItemBuilder,\n                                      final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_playlist_grid_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\n\npublic class PlaylistInfoItemHolder extends PlaylistMiniInfoItemHolder {\n    public PlaylistInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_playlist_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/PlaylistMiniInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.playlist.PlaylistInfoItem;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.image.CoilHelper;\n\npublic class PlaylistMiniInfoItemHolder extends InfoItemHolder {\n    public final ImageView itemThumbnailView;\n    private final TextView itemStreamCountView;\n    public final TextView itemTitleView;\n    public final TextView itemUploaderView;\n\n    public PlaylistMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId,\n                                      final ViewGroup parent) {\n        super(infoItemBuilder, layoutId, parent);\n\n        itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView);\n        itemTitleView = itemView.findViewById(R.id.itemTitleView);\n        itemStreamCountView = itemView.findViewById(R.id.itemStreamCountView);\n        itemUploaderView = itemView.findViewById(R.id.itemUploaderView);\n    }\n\n    public PlaylistMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder,\n                                      final ViewGroup parent) {\n        this(infoItemBuilder, R.layout.list_playlist_mini_item, parent);\n    }\n\n    @Override\n    public void updateFromItem(final InfoItem infoItem,\n                               final HistoryRecordManager historyRecordManager) {\n        if (!(infoItem instanceof PlaylistInfoItem)) {\n            return;\n        }\n        final PlaylistInfoItem item = (PlaylistInfoItem) infoItem;\n\n        itemTitleView.setText(item.getName());\n        itemStreamCountView.setText(Localization\n                .localizeStreamCountMini(itemStreamCountView.getContext(), item.getStreamCount()));\n        itemUploaderView.setText(item.getUploaderName());\n\n        CoilHelper.INSTANCE.loadPlaylistThumbnail(itemThumbnailView, item.getThumbnails());\n\n        itemView.setOnClickListener(view -> {\n            if (itemBuilder.getOnPlaylistSelectedListener() != null) {\n                itemBuilder.getOnPlaylistSelectedListener().selected(item);\n            }\n        });\n\n        itemView.setLongClickable(true);\n        itemView.setOnLongClickListener(view -> {\n            if (itemBuilder.getOnPlaylistSelectedListener() != null) {\n                itemBuilder.getOnPlaylistSelectedListener().held(item);\n            }\n            return true;\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/StreamCardInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\n\n/**\n * Card layout for stream.\n */\npublic class StreamCardInfoItemHolder extends StreamInfoItemHolder {\n\n    public StreamCardInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_stream_card_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/StreamGridInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\n\npublic class StreamGridInfoItemHolder extends StreamInfoItemHolder {\n    public StreamGridInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_stream_grid_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.text.TextUtils;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.extractor.stream.StreamType;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.Localization;\n\n/*\n * Created by Christian Schabesberger on 01.08.16.\n * <p>\n * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>\n * StreamInfoItemHolder.java is part of NewPipe.\n * </p>\n * <p>\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * </p>\n * <p>\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * </p?\n * <p>\n * You should have received a copy of the GNU General Public License\n * along with NewPipe. If not, see <http://www.gnu.org/licenses/>.\n * </p>\n */\n\npublic class StreamInfoItemHolder extends StreamMiniInfoItemHolder {\n    public final TextView itemAdditionalDetails;\n\n    public StreamInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) {\n        this(infoItemBuilder, R.layout.list_stream_item, parent);\n    }\n\n    public StreamInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId,\n                                final ViewGroup parent) {\n        super(infoItemBuilder, layoutId, parent);\n        itemAdditionalDetails = itemView.findViewById(R.id.itemAdditionalDetails);\n    }\n\n    @Override\n    public void updateFromItem(final InfoItem infoItem,\n                               final HistoryRecordManager historyRecordManager) {\n        super.updateFromItem(infoItem, historyRecordManager);\n\n        if (!(infoItem instanceof StreamInfoItem)) {\n            return;\n        }\n        final StreamInfoItem item = (StreamInfoItem) infoItem;\n\n        itemAdditionalDetails.setText(getStreamInfoDetailLine(item));\n    }\n\n    private String getStreamInfoDetailLine(final StreamInfoItem infoItem) {\n        String viewsAndDate = \"\";\n        if (infoItem.getViewCount() >= 0) {\n            if (infoItem.getStreamType().equals(StreamType.AUDIO_LIVE_STREAM)) {\n                viewsAndDate = Localization\n                        .listeningCount(itemBuilder.getContext(), infoItem.getViewCount());\n            } else if (infoItem.getStreamType().equals(StreamType.LIVE_STREAM)) {\n                viewsAndDate = Localization\n                        .shortWatchingCount(itemBuilder.getContext(), infoItem.getViewCount());\n            } else {\n                viewsAndDate = Localization\n                        .shortViewCount(itemBuilder.getContext(), infoItem.getViewCount());\n            }\n        }\n\n        final String uploadDate = Localization.relativeTimeOrTextual(itemBuilder.getContext(),\n                infoItem.getUploadDate(),\n                infoItem.getTextualUploadDate());\n        if (!TextUtils.isEmpty(uploadDate)) {\n            if (viewsAndDate.isEmpty()) {\n                return uploadDate;\n            }\n\n            return Localization.concatenateStrings(viewsAndDate, uploadDate);\n        }\n\n        return viewsAndDate;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java",
    "content": "package org.schabi.newpipe.info_list.holder;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.core.content.ContextCompat;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.info_list.InfoItemBuilder;\nimport org.schabi.newpipe.ktx.ViewUtils;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.DependentPreferenceHelper;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.StreamTypeUtil;\nimport org.schabi.newpipe.util.image.CoilHelper;\nimport org.schabi.newpipe.views.AnimatedProgressBar;\n\nimport java.util.concurrent.TimeUnit;\n\npublic class StreamMiniInfoItemHolder extends InfoItemHolder {\n    public final ImageView itemThumbnailView;\n    public final TextView itemVideoTitleView;\n    public final TextView itemUploaderView;\n    public final TextView itemDurationView;\n    private final AnimatedProgressBar itemProgressView;\n\n    StreamMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final int layoutId,\n                             final ViewGroup parent) {\n        super(infoItemBuilder, layoutId, parent);\n\n        itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView);\n        itemVideoTitleView = itemView.findViewById(R.id.itemVideoTitleView);\n        itemUploaderView = itemView.findViewById(R.id.itemUploaderView);\n        itemDurationView = itemView.findViewById(R.id.itemDurationView);\n        itemProgressView = itemView.findViewById(R.id.itemProgressView);\n    }\n\n    public StreamMiniInfoItemHolder(final InfoItemBuilder infoItemBuilder, final ViewGroup parent) {\n        this(infoItemBuilder, R.layout.list_stream_mini_item, parent);\n    }\n\n    @Override\n    public void updateFromItem(final InfoItem infoItem,\n                               final HistoryRecordManager historyRecordManager) {\n        if (!(infoItem instanceof StreamInfoItem)) {\n            return;\n        }\n        final StreamInfoItem item = (StreamInfoItem) infoItem;\n\n        itemVideoTitleView.setText(item.getName());\n        itemUploaderView.setText(item.getUploaderName());\n\n        if (item.getDuration() > 0) {\n            itemDurationView.setText(Localization.getDurationString(item.getDuration()));\n            itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(),\n                    R.color.duration_background_color));\n            itemDurationView.setVisibility(View.VISIBLE);\n\n            StreamStateEntity state2 = null;\n            if (DependentPreferenceHelper\n                    .getPositionsInListsEnabled(itemProgressView.getContext())) {\n                state2 = historyRecordManager.loadStreamState(infoItem)\n                        .blockingGet()[0];\n            }\n            if (state2 != null) {\n                itemProgressView.setVisibility(View.VISIBLE);\n                itemProgressView.setMax((int) item.getDuration());\n                itemProgressView.setProgress((int) TimeUnit.MILLISECONDS\n                        .toSeconds(state2.getProgressMillis()));\n            } else {\n                itemProgressView.setVisibility(View.GONE);\n            }\n        } else if (StreamTypeUtil.isLiveStream(item.getStreamType())) {\n            itemDurationView.setText(R.string.duration_live);\n            itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(),\n                    R.color.live_duration_background_color));\n            itemDurationView.setVisibility(View.VISIBLE);\n            itemProgressView.setVisibility(View.GONE);\n        } else {\n            itemDurationView.setVisibility(View.GONE);\n            itemProgressView.setVisibility(View.GONE);\n        }\n\n        // Default thumbnail is shown on error, while loading and if the url is empty\n        CoilHelper.INSTANCE.loadThumbnail(itemThumbnailView, item.getThumbnails());\n\n        itemView.setOnClickListener(view -> {\n            if (itemBuilder.getOnStreamSelectedListener() != null) {\n                itemBuilder.getOnStreamSelectedListener().selected(item);\n            }\n        });\n\n        switch (item.getStreamType()) {\n            case AUDIO_STREAM:\n            case VIDEO_STREAM:\n            case LIVE_STREAM:\n            case AUDIO_LIVE_STREAM:\n            case POST_LIVE_STREAM:\n            case POST_LIVE_AUDIO_STREAM:\n                enableLongClick(item);\n                break;\n            case NONE:\n            default:\n                disableLongClick();\n                break;\n        }\n    }\n\n    @Override\n    public void updateState(final InfoItem infoItem,\n                            final HistoryRecordManager historyRecordManager) {\n        final StreamInfoItem item = (StreamInfoItem) infoItem;\n\n        StreamStateEntity state = null;\n        if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext())) {\n            state = historyRecordManager\n                    .loadStreamState(infoItem)\n                    .blockingGet()[0];\n        }\n        if (state != null && item.getDuration() > 0\n                && !StreamTypeUtil.isLiveStream(item.getStreamType())) {\n            itemProgressView.setMax((int) item.getDuration());\n            if (itemProgressView.getVisibility() == View.VISIBLE) {\n                itemProgressView.setProgressAnimated((int) TimeUnit.MILLISECONDS\n                        .toSeconds(state.getProgressMillis()));\n            } else {\n                itemProgressView.setProgress((int) TimeUnit.MILLISECONDS\n                        .toSeconds(state.getProgressMillis()));\n                ViewUtils.animate(itemProgressView, true, 500);\n            }\n        } else if (itemProgressView.getVisibility() == View.VISIBLE) {\n            ViewUtils.animate(itemProgressView, false, 500);\n        }\n    }\n\n    private void enableLongClick(final StreamInfoItem item) {\n        itemView.setLongClickable(true);\n        itemView.setOnLongClickListener(view -> {\n            if (itemBuilder.getOnStreamSelectedListener() != null) {\n                itemBuilder.getOnStreamSelectedListener().held(item);\n            }\n            return true;\n        });\n    }\n\n    private void disableLongClick() {\n        itemView.setLongClickable(false);\n        itemView.setOnLongClickListener(null);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/Bitmap.kt",
    "content": "package org.schabi.newpipe.ktx\n\nimport android.graphics.Bitmap\nimport android.graphics.Rect\nimport androidx.core.graphics.BitmapCompat\n\n@Suppress(\"NOTHING_TO_INLINE\")\ninline fun Bitmap.scale(\n    width: Int,\n    height: Int,\n    srcRect: Rect? = null,\n    scaleInLinearSpace: Boolean = true\n) = BitmapCompat.createScaledBitmap(this, width, height, srcRect, scaleInLinearSpace)\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/Bundle.kt",
    "content": "package org.schabi.newpipe.ktx\n\nimport android.os.Bundle\nimport android.os.Parcelable\nimport androidx.core.os.BundleCompat\n\ninline fun <reified T : Parcelable> Bundle.parcelableArrayList(key: String?): ArrayList<T>? {\n    return BundleCompat.getParcelableArrayList(this, key, T::class.java)\n}\n\nfun Bundle?.toDebugString(): String {\n    if (this == null) {\n        return \"null\"\n    }\n    val string = StringBuilder(\"Bundle{\")\n    for (key in this.keySet()) {\n        @Suppress(\"DEPRECATION\") // we want this[key] to return items of any type\n        string.append(\" \").append(key).append(\" => \").append(this[key]).append(\";\")\n    }\n    string.append(\" }\")\n    return string.toString()\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/SharedPreferences.kt",
    "content": "package org.schabi.newpipe.ktx\n\nimport android.content.SharedPreferences\n\nfun SharedPreferences.getStringSafe(key: String, defValue: String): String {\n    return getString(key, null) ?: defValue\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/TextView.kt",
    "content": "@file:JvmName(\"TextViewUtils\")\n\npackage org.schabi.newpipe.ktx\n\nimport android.animation.ArgbEvaluator\nimport android.animation.ValueAnimator\nimport android.util.Log\nimport android.widget.TextView\nimport androidx.annotation.ColorInt\nimport androidx.core.animation.addListener\nimport androidx.interpolator.view.animation.FastOutSlowInInterpolator\nimport org.schabi.newpipe.MainActivity\n\nprivate const val TAG = \"TextViewUtils\"\n\n/**\n * Animate the text color of any view that extends [TextView] (Buttons, EditText...).\n *\n * @param duration   the duration of the animation\n * @param colorStart the text color to start with\n * @param colorEnd   the text color to end with\n */\nfun TextView.animateTextColor(duration: Long, @ColorInt colorStart: Int, @ColorInt colorEnd: Int) {\n    if (MainActivity.DEBUG) {\n        Log.d(\n            TAG,\n            \"animateTextColor() called with: \" +\n                \"view = [\" + this + \"], duration = [\" + duration + \"], \" +\n                \"colorStart = [\" + colorStart + \"], colorEnd = [\" + colorEnd + \"]\"\n        )\n    }\n    val viewPropertyAnimator = ValueAnimator.ofObject(ArgbEvaluator(), colorStart, colorEnd)\n    viewPropertyAnimator.interpolator = FastOutSlowInInterpolator()\n    viewPropertyAnimator.duration = duration\n    viewPropertyAnimator.addUpdateListener { setTextColor(it.animatedValue as Int) }\n    viewPropertyAnimator.addListener(onCancel = { setTextColor(colorEnd) }, onEnd = { setTextColor(colorEnd) })\n    viewPropertyAnimator.start()\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/Throwable.kt",
    "content": "@file:JvmName(\"ExceptionUtils\")\n\npackage org.schabi.newpipe.ktx\n\nimport java.io.IOException\nimport java.io.InterruptedIOException\n\n/**\n * @return if throwable is related to Interrupted exceptions, or one of its causes is.\n */\nval Throwable.isInterruptedCaused: Boolean\n    get() = hasExactCause(InterruptedIOException::class.java, InterruptedException::class.java)\n\n/**\n * @return if throwable is related to network issues, or one of its causes is.\n */\nval Throwable.isNetworkRelated: Boolean\n    get() = hasAssignableCause<IOException>()\n\n/**\n * Calls [hasCause] with the `checkSubtypes` parameter set to false.\n */\nfun Throwable.hasExactCause(vararg causesToCheck: Class<*>) = hasCause(false, *causesToCheck)\n\n/**\n * Calls [hasCause] with a reified [Throwable] type.\n */\ninline fun <reified T : Throwable> Throwable.hasExactCause() = hasExactCause(T::class.java)\n\n/**\n * Calls [hasCause] with the `checkSubtypes` parameter set to true.\n */\nfun Throwable?.hasAssignableCause(vararg causesToCheck: Class<*>) = hasCause(true, *causesToCheck)\n\n/**\n * Calls [hasCause] with a reified [Throwable] type.\n */\ninline fun <reified T : Throwable> Throwable?.hasAssignableCause() = hasAssignableCause(T::class.java)\n\n/**\n * Check if the throwable has some cause from the causes to check, or is itself in it.\n *\n * If `checkIfAssignable` is true, not only the exact type will be considered equals, but also its subtypes.\n *\n * @param checkSubtypes if subtypes are also checked.\n * @param causesToCheck an array of causes to check.\n *\n * @see Class.isAssignableFrom\n */\ntailrec fun Throwable?.hasCause(checkSubtypes: Boolean, vararg causesToCheck: Class<*>): Boolean {\n    if (this == null) {\n        return false\n    }\n\n    // Check if throwable is a subtype of any of the causes to check\n    causesToCheck.forEach { causeClass ->\n        if (checkSubtypes) {\n            if (causeClass.isAssignableFrom(this.javaClass)) {\n                return true\n            }\n        } else if (causeClass == this.javaClass) {\n            return true\n        }\n    }\n\n    val currentCause: Throwable? = cause\n    // Check if cause is not pointing to the same instance, to avoid infinite loops.\n    if (this !== currentCause) {\n        return currentCause.hasCause(checkSubtypes, *causesToCheck)\n    }\n\n    return false\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/ktx/View.kt",
    "content": "@file:JvmName(\"ViewUtils\")\n\npackage org.schabi.newpipe.ktx\n\nimport android.animation.Animator\nimport android.animation.AnimatorListenerAdapter\nimport android.animation.ArgbEvaluator\nimport android.animation.ValueAnimator\nimport android.content.res.ColorStateList\nimport android.util.Log\nimport android.view.View\nimport androidx.annotation.ColorInt\nimport androidx.annotation.FloatRange\nimport androidx.core.animation.addListener\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.isGone\nimport androidx.core.view.isInvisible\nimport androidx.core.view.isVisible\nimport androidx.interpolator.view.animation.FastOutSlowInInterpolator\n\n// logs in this class are disabled by default since it's usually not useful,\n// you can enable them by setting this flag to MainActivity.DEBUG\nprivate const val DEBUG = false\nprivate const val TAG = \"ViewUtils\"\n\n/**\n * Animate the view.\n *\n * @param enterOrExit   true to enter, false to exit\n * @param duration      how long the animation will take, in milliseconds\n * @param animationType Type of the animation\n * @param delay         how long the animation will wait to start, in milliseconds\n * @param execOnEnd     runnable that will be executed when the animation ends\n */\n@JvmOverloads\nfun View.animate(\n    enterOrExit: Boolean,\n    duration: Long,\n    animationType: AnimationType = AnimationType.ALPHA,\n    delay: Long = 0,\n    execOnEnd: Runnable? = null\n) {\n    if (DEBUG) {\n        val id = runCatching { resources.getResourceEntryName(id) }.getOrDefault(id.toString())\n        val msg = String.format(\n            \"%8s →  [%s:%s] [%s %s:%s] execOnEnd=%s\",\n            enterOrExit,\n            javaClass.simpleName,\n            id,\n            animationType,\n            duration,\n            delay,\n            execOnEnd\n        )\n        Log.d(TAG, \"animate(): $msg\")\n    }\n    if (isVisible && enterOrExit) {\n        if (DEBUG) {\n            Log.d(TAG, \"animate(): view was already visible > view = [$this]\")\n        }\n        animate().setListener(null).cancel()\n        isVisible = true\n        alpha = 1f\n        execOnEnd?.run()\n        return\n    } else if ((isGone || isInvisible) && !enterOrExit) {\n        if (DEBUG) {\n            Log.d(TAG, \"animate(): view was already gone > view = [$this]\")\n        }\n        animate().setListener(null).cancel()\n        isGone = true\n        alpha = 0f\n        execOnEnd?.run()\n        return\n    }\n    animate().setListener(null).cancel()\n    isVisible = true\n\n    when (animationType) {\n        AnimationType.ALPHA -> animateAlpha(enterOrExit, duration, delay, execOnEnd)\n        AnimationType.SCALE_AND_ALPHA -> animateScaleAndAlpha(enterOrExit, duration, delay, execOnEnd)\n        AnimationType.LIGHT_SCALE_AND_ALPHA -> animateLightScaleAndAlpha(enterOrExit, duration, delay, execOnEnd)\n        AnimationType.SLIDE_AND_ALPHA -> animateSlideAndAlpha(enterOrExit, duration, delay, execOnEnd)\n        AnimationType.LIGHT_SLIDE_AND_ALPHA -> animateLightSlideAndAlpha(enterOrExit, duration, delay, execOnEnd)\n    }\n}\n\n/**\n * Animate the background color of a view.\n *\n * @param duration   the duration of the animation\n * @param colorStart the background color to start with\n * @param colorEnd   the background color to end with\n */\nfun View.animateBackgroundColor(duration: Long, @ColorInt colorStart: Int, @ColorInt colorEnd: Int) {\n    if (DEBUG) {\n        Log.d(\n            TAG,\n            \"animateBackgroundColor() called with: view = [$this], duration = [$duration], \" +\n                \"colorStart = [$colorStart], colorEnd = [$colorEnd]\"\n        )\n    }\n    val viewPropertyAnimator = ValueAnimator.ofObject(ArgbEvaluator(), colorStart, colorEnd)\n    viewPropertyAnimator.interpolator = FastOutSlowInInterpolator()\n    viewPropertyAnimator.duration = duration\n\n    fun listenerAction(color: Int) {\n        ViewCompat.setBackgroundTintList(this, ColorStateList.valueOf(color))\n    }\n    viewPropertyAnimator.addUpdateListener { listenerAction(it.animatedValue as Int) }\n    viewPropertyAnimator.addListener(onCancel = { listenerAction(colorEnd) }, onEnd = { listenerAction(colorEnd) })\n    viewPropertyAnimator.start()\n}\n\nfun View.animateHeight(duration: Long, targetHeight: Int): ValueAnimator {\n    if (DEBUG) {\n        Log.d(TAG, \"animateHeight: duration = [$duration], from $height to → $targetHeight in: $this\")\n    }\n    val animator = ValueAnimator.ofFloat(height.toFloat(), targetHeight.toFloat())\n    animator.interpolator = FastOutSlowInInterpolator()\n    animator.duration = duration\n\n    fun listenerAction(value: Int) {\n        layoutParams.height = value\n        requestLayout()\n    }\n    animator.addUpdateListener { listenerAction((it.animatedValue as Float).toInt()) }\n    animator.addListener(onCancel = { listenerAction(targetHeight) }, onEnd = { listenerAction(targetHeight) })\n    animator.start()\n    return animator\n}\n\nfun View.animateRotation(duration: Long, targetRotation: Int) {\n    if (DEBUG) {\n        Log.d(TAG, \"animateRotation: duration = [$duration], from $rotation to → $targetRotation in: $this\")\n    }\n    animate().setListener(null).cancel()\n    animate()\n        .rotation(targetRotation.toFloat()).setDuration(duration)\n        .setInterpolator(FastOutSlowInInterpolator())\n        .setListener(object : AnimatorListenerAdapter() {\n            override fun onAnimationCancel(animation: Animator) {\n                rotation = targetRotation.toFloat()\n            }\n\n            override fun onAnimationEnd(animation: Animator) {\n                rotation = targetRotation.toFloat()\n            }\n        }).start()\n}\n\nprivate fun View.animateAlpha(enterOrExit: Boolean, duration: Long, delay: Long, execOnEnd: Runnable?) {\n    if (enterOrExit) {\n        animate().setInterpolator(FastOutSlowInInterpolator()).alpha(1f)\n            .setDuration(duration).setStartDelay(delay)\n            .setListener(ExecOnEndListener(execOnEnd))\n            .start()\n    } else {\n        animate().setInterpolator(FastOutSlowInInterpolator()).alpha(0f)\n            .setDuration(duration).setStartDelay(delay)\n            .setListener(HideAndExecOnEndListener(this, execOnEnd))\n            .start()\n    }\n}\n\nprivate fun View.animateScaleAndAlpha(enterOrExit: Boolean, duration: Long, delay: Long, execOnEnd: Runnable?) {\n    if (enterOrExit) {\n        scaleX = .8f\n        scaleY = .8f\n        animate()\n            .setInterpolator(FastOutSlowInInterpolator())\n            .alpha(1f).scaleX(1f).scaleY(1f)\n            .setDuration(duration).setStartDelay(delay)\n            .setListener(ExecOnEndListener(execOnEnd))\n            .start()\n    } else {\n        scaleX = 1f\n        scaleY = 1f\n        animate()\n            .setInterpolator(FastOutSlowInInterpolator())\n            .alpha(0f).scaleX(.8f).scaleY(.8f)\n            .setDuration(duration).setStartDelay(delay)\n            .setListener(HideAndExecOnEndListener(this, execOnEnd))\n            .start()\n    }\n}\n\nprivate fun View.animateLightScaleAndAlpha(enterOrExit: Boolean, duration: Long, delay: Long, execOnEnd: Runnable?) {\n    if (enterOrExit) {\n        alpha = .5f\n        scaleX = .95f\n        scaleY = .95f\n        animate()\n            .setInterpolator(FastOutSlowInInterpolator())\n            .alpha(1f).scaleX(1f).scaleY(1f)\n            .setDuration(duration).setStartDelay(delay)\n            .setListener(ExecOnEndListener(execOnEnd))\n            .start()\n    } else {\n        alpha = 1f\n        scaleX = 1f\n        scaleY = 1f\n        animate()\n            .setInterpolator(FastOutSlowInInterpolator())\n            .alpha(0f).scaleX(.95f).scaleY(.95f)\n            .setDuration(duration).setStartDelay(delay)\n            .setListener(HideAndExecOnEndListener(this, execOnEnd))\n            .start()\n    }\n}\n\nprivate fun View.animateSlideAndAlpha(enterOrExit: Boolean, duration: Long, delay: Long, execOnEnd: Runnable?) {\n    if (enterOrExit) {\n        translationY = -height.toFloat()\n        alpha = 0f\n        animate()\n            .setInterpolator(FastOutSlowInInterpolator()).alpha(1f).translationY(0f)\n            .setDuration(duration).setStartDelay(delay)\n            .setListener(ExecOnEndListener(execOnEnd))\n            .start()\n    } else {\n        animate()\n            .setInterpolator(FastOutSlowInInterpolator())\n            .alpha(0f).translationY(-height.toFloat())\n            .setDuration(duration).setStartDelay(delay)\n            .setListener(HideAndExecOnEndListener(this, execOnEnd))\n            .start()\n    }\n}\n\nprivate fun View.animateLightSlideAndAlpha(enterOrExit: Boolean, duration: Long, delay: Long, execOnEnd: Runnable?) {\n    if (enterOrExit) {\n        translationY = -height / 2.0f\n        alpha = 0f\n        animate()\n            .setInterpolator(FastOutSlowInInterpolator()).alpha(1f).translationY(0f)\n            .setDuration(duration).setStartDelay(delay)\n            .setListener(ExecOnEndListener(execOnEnd))\n            .start()\n    } else {\n        animate().setInterpolator(FastOutSlowInInterpolator())\n            .alpha(0f).translationY(-height / 2.0f)\n            .setDuration(duration).setStartDelay(delay)\n            .setListener(HideAndExecOnEndListener(this, execOnEnd))\n            .start()\n    }\n}\n\n@JvmOverloads\nfun View.slideUp(\n    duration: Long,\n    delay: Long = 0L,\n    @FloatRange(from = 0.0, to = 1.0) translationPercent: Float = 1.0F,\n    execOnEnd: Runnable? = null\n) {\n    val newTranslationY = (resources.displayMetrics.heightPixels * translationPercent).toInt()\n    animate().setListener(null).cancel()\n    alpha = 0f\n    translationY = newTranslationY.toFloat()\n    isVisible = true\n    animate()\n        .alpha(1f)\n        .translationY(0f)\n        .setStartDelay(delay)\n        .setDuration(duration)\n        .setInterpolator(FastOutSlowInInterpolator())\n        .setListener(ExecOnEndListener(execOnEnd))\n        .start()\n}\n\n/**\n * Instead of hiding normally using [animate], which would make\n * the recycler view unable to capture touches after being hidden, this just animates the alpha\n * value setting it to `0.0` after `200` milliseconds.\n */\nfun View.animateHideRecyclerViewAllowingScrolling() {\n    // not hiding normally because the view needs to still capture touches and allow scroll\n    animate().alpha(0.0f).setDuration(200).start()\n}\n\nprivate open class ExecOnEndListener(private val execOnEnd: Runnable?) : AnimatorListenerAdapter() {\n    override fun onAnimationEnd(animation: Animator) {\n        execOnEnd?.run()\n    }\n}\n\nprivate class HideAndExecOnEndListener(private val view: View, execOnEnd: Runnable?) :\n    ExecOnEndListener(execOnEnd) {\n    override fun onAnimationEnd(animation: Animator) {\n        view.isGone = true\n        super.onAnimationEnd(animation)\n    }\n}\n\nenum class AnimationType {\n    ALPHA,\n    SCALE_AND_ALPHA,\n    LIGHT_SCALE_AND_ALPHA,\n    SLIDE_AND_ALPHA,\n    LIGHT_SLIDE_AND_ALPHA\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/BaseLocalListFragment.java",
    "content": "package org.schabi.newpipe.local;\n\nimport android.content.SharedPreferences;\nimport android.content.res.Resources;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.fragment.app.Fragment;\nimport androidx.preference.PreferenceManager;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.viewbinding.ViewBinding;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.PignateFooterBinding;\nimport org.schabi.newpipe.fragments.BaseStateFragment;\nimport org.schabi.newpipe.fragments.list.ListViewContract;\nimport org.schabi.newpipe.info_list.ItemViewMode;\n\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\nimport static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling;\nimport static org.schabi.newpipe.util.ThemeHelper.getItemViewMode;\n\nimport java.util.function.Supplier;\n\n/**\n * This fragment is design to be used with persistent data such as\n * {@link org.schabi.newpipe.database.LocalItem}, and does not cache the data contained\n * in the list adapter to avoid extra writes when the it exits or re-enters its lifecycle.\n * <p>\n * This fragment destroys its adapter and views when {@link Fragment#onDestroyView()} is\n * called and is memory efficient when in backstack.\n * </p>\n *\n * @param <I> List of {@link org.schabi.newpipe.database.LocalItem}s\n * @param <N> {@link Void}\n */\npublic abstract class BaseLocalListFragment<I, N> extends BaseStateFragment<I>\n        implements ListViewContract<I, N>, SharedPreferences.OnSharedPreferenceChangeListener {\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Views\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private static final int LIST_MODE_UPDATE_FLAG = 0x32;\n    private ViewBinding headerRootBinding;\n    private ViewBinding footerRootBinding;\n    protected LocalItemListAdapter itemListAdapter;\n    protected RecyclerView itemsList;\n    private int updateFlags = 0;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Lifecycle - Creation\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setHasOptionsMenu(true);\n        PreferenceManager.getDefaultSharedPreferences(activity)\n                .registerOnSharedPreferenceChangeListener(this);\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        PreferenceManager.getDefaultSharedPreferences(activity)\n                .unregisterOnSharedPreferenceChangeListener(this);\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        if (updateFlags != 0) {\n            if ((updateFlags & LIST_MODE_UPDATE_FLAG) != 0) {\n                refreshItemViewMode();\n            }\n            updateFlags = 0;\n        }\n    }\n\n    /**\n     * Updates the item view mode based on user preference.\n     */\n    private void refreshItemViewMode() {\n        final ItemViewMode itemViewMode = getItemViewMode(requireContext());\n        itemsList.setLayoutManager((itemViewMode == ItemViewMode.GRID)\n                ? getGridLayoutManager() : getListLayoutManager());\n        itemListAdapter.setItemViewMode(itemViewMode);\n        itemListAdapter.notifyDataSetChanged();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Lifecycle - View\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Nullable\n    protected Supplier<View> getListHeaderSupplier() {\n        return null;\n    }\n\n    protected ViewBinding getListFooter() {\n        return PignateFooterBinding.inflate(activity.getLayoutInflater(), itemsList, false);\n    }\n\n    protected RecyclerView.LayoutManager getGridLayoutManager() {\n        final Resources resources = activity.getResources();\n        int width = resources.getDimensionPixelSize(R.dimen.video_item_grid_thumbnail_image_width);\n        width += (24 * resources.getDisplayMetrics().density);\n        final int spanCount = Math.floorDiv(resources.getDisplayMetrics().widthPixels, width);\n        final GridLayoutManager lm = new GridLayoutManager(activity, spanCount);\n        lm.setSpanSizeLookup(itemListAdapter.getSpanSizeLookup(spanCount));\n        return lm;\n    }\n\n    protected RecyclerView.LayoutManager getListLayoutManager() {\n        return new LinearLayoutManager(activity);\n    }\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n\n        itemListAdapter = new LocalItemListAdapter(activity);\n\n        itemsList = rootView.findViewById(R.id.items_list);\n        refreshItemViewMode();\n\n        final Supplier<View> listHeaderSupplier = getListHeaderSupplier();\n        if (listHeaderSupplier != null) {\n            itemListAdapter.setHeaderSupplier(listHeaderSupplier);\n        }\n        footerRootBinding = getListFooter();\n        itemListAdapter.setFooter(footerRootBinding.getRoot());\n\n        itemsList.setAdapter(itemListAdapter);\n    }\n\n    @Override\n    protected void initListeners() {\n        super.initListeners();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Lifecycle - Menu\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) {\n        super.onCreateOptionsMenu(menu, inflater);\n        if (DEBUG) {\n            Log.d(TAG, \"onCreateOptionsMenu() called with: \"\n                    + \"menu = [\" + menu + \"], inflater = [\" + inflater + \"]\");\n        }\n\n        final ActionBar supportActionBar = activity.getSupportActionBar();\n        if (supportActionBar == null) {\n            return;\n        }\n\n        supportActionBar.setDisplayShowTitleEnabled(true);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Lifecycle - Destruction\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        itemsList = null;\n        itemListAdapter = null;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Contract\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void startLoading(final boolean forceLoad) {\n        super.startLoading(forceLoad);\n        resetFragment();\n    }\n\n    @Override\n    public void showLoading() {\n        super.showLoading();\n        if (itemsList != null) {\n            animateHideRecyclerViewAllowingScrolling(itemsList);\n        }\n    }\n\n    @Override\n    public void hideLoading() {\n        super.hideLoading();\n        if (itemsList != null) {\n            animate(itemsList, true, 200);\n        }\n    }\n\n    @Override\n    public void showEmptyState() {\n        super.showEmptyState();\n        showListFooter(false);\n    }\n\n    @Deprecated(since = \"Calling this method with `true` may cause crashes, see \"\n            + \"https://github.com/TeamNewPipe/NewPipe/pull/12996#pullrequestreview-3713317115\")\n    @Override\n    public void showListFooter(final boolean show) {\n        if (itemsList == null) {\n            return;\n        }\n        itemsList.post(() -> {\n            if (itemListAdapter != null) {\n                itemListAdapter.showFooter(show);\n            }\n        });\n    }\n\n    @Override\n    public void handleNextItems(final N result) {\n        isLoading.set(false);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Error handling\n    //////////////////////////////////////////////////////////////////////////*/\n\n    protected void resetFragment() {\n        if (itemListAdapter != null) {\n            itemListAdapter.clearStreamItemList();\n        }\n    }\n\n    @Override\n    public void handleError() {\n        super.handleError();\n        resetFragment();\n\n        showListFooter(false);\n\n        if (itemsList != null) {\n            animateHideRecyclerViewAllowingScrolling(itemsList);\n        }\n    }\n\n    @Override\n    public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences,\n                                          final String key) {\n        if (getString(R.string.list_view_mode_key).equals(key)) {\n            updateFlags |= LIST_MODE_UPDATE_FLAG;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/HeaderFooterHolder.java",
    "content": "package org.schabi.newpipe.local;\n\nimport android.view.View;\n\nimport androidx.recyclerview.widget.RecyclerView;\n\npublic class HeaderFooterHolder extends RecyclerView.ViewHolder {\n    public View view;\n\n    public HeaderFooterHolder(final View v) {\n        super(v);\n        view = v;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/LocalItemBuilder.java",
    "content": "package org.schabi.newpipe.local;\n\nimport android.content.Context;\n\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.util.OnClickGesture;\n\n/*\n * Created by Christian Schabesberger on 26.09.16.\n * <p>\n * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>\n * InfoItemBuilder.java is part of NewPipe.\n * <p>\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * <p>\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * <p>\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic class LocalItemBuilder {\n    private final Context context;\n\n    private OnClickGesture<LocalItem> onSelectedListener;\n\n    public LocalItemBuilder(final Context context) {\n        this.context = context;\n    }\n\n    public Context getContext() {\n        return context;\n    }\n\n    public OnClickGesture<LocalItem> getOnItemSelectedListener() {\n        return onSelectedListener;\n    }\n\n    public void setOnItemSelectedListener(final OnClickGesture<LocalItem> listener) {\n        this.onSelectedListener = listener;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java",
    "content": "package org.schabi.newpipe.local;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity;\nimport org.schabi.newpipe.info_list.ItemViewMode;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.local.holder.LocalBookmarkPlaylistItemHolder;\nimport org.schabi.newpipe.local.holder.LocalItemHolder;\nimport org.schabi.newpipe.local.holder.LocalPlaylistCardItemHolder;\nimport org.schabi.newpipe.local.holder.LocalPlaylistGridItemHolder;\nimport org.schabi.newpipe.local.holder.LocalPlaylistItemHolder;\nimport org.schabi.newpipe.local.holder.LocalPlaylistStreamCardItemHolder;\nimport org.schabi.newpipe.local.holder.LocalPlaylistStreamGridItemHolder;\nimport org.schabi.newpipe.local.holder.LocalPlaylistStreamItemHolder;\nimport org.schabi.newpipe.local.holder.LocalStatisticStreamCardItemHolder;\nimport org.schabi.newpipe.local.holder.LocalStatisticStreamGridItemHolder;\nimport org.schabi.newpipe.local.holder.LocalStatisticStreamItemHolder;\nimport org.schabi.newpipe.local.holder.RemoteBookmarkPlaylistItemHolder;\nimport org.schabi.newpipe.local.holder.RemotePlaylistCardItemHolder;\nimport org.schabi.newpipe.local.holder.RemotePlaylistGridItemHolder;\nimport org.schabi.newpipe.local.holder.RemotePlaylistItemHolder;\nimport org.schabi.newpipe.util.FallbackViewHolder;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.OnClickGesture;\n\nimport java.time.format.DateTimeFormatter;\nimport java.time.format.FormatStyle;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.function.Supplier;\n\n/*\n * Created by Christian Schabesberger on 01.08.16.\n *\n * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>\n * InfoListAdapter.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic class LocalItemListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n    private static final String TAG = LocalItemListAdapter.class.getSimpleName();\n    private static final boolean DEBUG = false;\n\n    private static final int HEADER_TYPE = 0;\n    private static final int FOOTER_TYPE = 1;\n\n    private static final int STREAM_STATISTICS_HOLDER_TYPE = 0x1000;\n    private static final int STREAM_PLAYLIST_HOLDER_TYPE = 0x1001;\n    private static final int STREAM_STATISTICS_GRID_HOLDER_TYPE = 0x1002;\n    private static final int STREAM_STATISTICS_CARD_HOLDER_TYPE = 0x1003;\n    private static final int STREAM_PLAYLIST_GRID_HOLDER_TYPE = 0x1004;\n    private static final int STREAM_PLAYLIST_CARD_HOLDER_TYPE = 0x1005;\n\n    private static final int LOCAL_PLAYLIST_HOLDER_TYPE = 0x2000;\n    private static final int LOCAL_PLAYLIST_GRID_HOLDER_TYPE = 0x2001;\n    private static final int LOCAL_PLAYLIST_CARD_HOLDER_TYPE = 0x2002;\n    private static final int LOCAL_BOOKMARK_PLAYLIST_HOLDER_TYPE = 0x2003;\n\n    private static final int REMOTE_PLAYLIST_HOLDER_TYPE = 0x3000;\n    private static final int REMOTE_PLAYLIST_GRID_HOLDER_TYPE = 0x3001;\n    private static final int REMOTE_PLAYLIST_CARD_HOLDER_TYPE = 0x3002;\n    private static final int REMOTE_BOOKMARK_PLAYLIST_HOLDER_TYPE = 0x3003;\n\n    private final LocalItemBuilder localItemBuilder;\n    private final ArrayList<LocalItem> localItems;\n    private final HistoryRecordManager recordManager;\n    private final DateTimeFormatter dateTimeFormatter;\n\n    private boolean showFooter = false;\n    private Supplier<View> headerSupplier = null;\n    private View footer = null;\n    private ItemViewMode itemViewMode = ItemViewMode.LIST;\n    private boolean useItemHandle = false;\n\n    public LocalItemListAdapter(final Context context) {\n        recordManager = new HistoryRecordManager(context);\n        localItemBuilder = new LocalItemBuilder(context);\n        localItems = new ArrayList<>();\n\n        dateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)\n                .withLocale(Localization.getPreferredLocale(context));\n    }\n\n    public void setSelectedListener(final OnClickGesture<LocalItem> listener) {\n        localItemBuilder.setOnItemSelectedListener(listener);\n    }\n\n    public void unsetSelectedListener() {\n        localItemBuilder.setOnItemSelectedListener(null);\n    }\n\n    public void addItems(@Nullable final List<? extends LocalItem> data) {\n        if (data == null) {\n            return;\n        }\n        if (DEBUG) {\n            Log.d(TAG, \"addItems() before > localItems.size() = \"\n                    + localItems.size() + \", data.size() = \" + data.size());\n        }\n\n        final int offsetStart = sizeConsideringHeader();\n        localItems.addAll(data);\n\n        if (DEBUG) {\n            Log.d(TAG, \"addItems() after > offsetStart = \" + offsetStart + \", \"\n                    + \"localItems.size() = \" + localItems.size() + \", \"\n                    + \"header = \" + hasHeader() + \", footer = \" + footer + \", \"\n                    + \"showFooter = \" + showFooter);\n        }\n        notifyItemRangeInserted(offsetStart, data.size());\n\n        if (footer != null && showFooter) {\n            final int footerNow = sizeConsideringHeader();\n            notifyItemMoved(offsetStart, footerNow);\n\n            if (DEBUG) {\n                Log.d(TAG, \"addItems() footer from \" + offsetStart\n                        + \" to \" + footerNow);\n            }\n        }\n    }\n\n    public void removeItem(final LocalItem data) {\n        final int index = localItems.indexOf(data);\n        if (index != -1) {\n            localItems.remove(index);\n            notifyItemRemoved(index + (hasHeader() ? 1 : 0));\n        } else {\n            // this happens when\n            // 1) removeItem is called on infoItemDuplicate as in showStreamItemDialog of\n            // LocalPlaylistFragment in this case need to implement delete object by it's duplicate\n\n            // OR\n\n            // 2)data not in itemList and UI is still not updated so notifyDataSetChanged()\n            notifyDataSetChanged();\n        }\n    }\n\n    public boolean swapItems(final int fromAdapterPosition, final int toAdapterPosition) {\n        final int actualFrom = adapterOffsetWithoutHeader(fromAdapterPosition);\n        final int actualTo = adapterOffsetWithoutHeader(toAdapterPosition);\n\n        if (actualFrom < 0 || actualTo < 0) {\n            return false;\n        }\n        if (actualFrom >= localItems.size() || actualTo >= localItems.size()) {\n            return false;\n        }\n\n        localItems.add(actualTo, localItems.remove(actualFrom));\n        notifyItemMoved(fromAdapterPosition, toAdapterPosition);\n        return true;\n    }\n\n    public void clearStreamItemList() {\n        if (localItems.isEmpty()) {\n            return;\n        }\n        localItems.clear();\n        notifyDataSetChanged();\n    }\n\n    public void setItemViewMode(final ItemViewMode itemViewMode) {\n        this.itemViewMode = itemViewMode;\n    }\n\n    public void setUseItemHandle(final boolean useItemHandle) {\n        this.useItemHandle = useItemHandle;\n    }\n\n    public void setHeaderSupplier(@Nullable final Supplier<View> headerSupplier) {\n        final boolean changed = headerSupplier != this.headerSupplier;\n        this.headerSupplier = headerSupplier;\n        if (changed) {\n            notifyDataSetChanged();\n        }\n    }\n\n    public void setFooter(final View view) {\n        this.footer = view;\n    }\n\n    protected boolean hasHeader() {\n        return this.headerSupplier != null;\n    }\n\n    @Deprecated(since = \"Calling this method with `true` may cause crashes, see \"\n            + \"https://github.com/TeamNewPipe/NewPipe/pull/12996#pullrequestreview-3713317115\")\n    public void showFooter(final boolean show) {\n        if (DEBUG) {\n            Log.d(TAG, \"showFooter() called with: show = [\" + show + \"]\");\n        }\n        if (show == showFooter) {\n            return;\n        }\n\n        showFooter = show;\n        if (show) {\n            Log.w(TAG, \"Calling LocalItemListAdapter.showFooter(true) may cause crashes, see https\"\n                    + \"://github.com/TeamNewPipe/NewPipe/pull/12996#pullrequestreview-3713317115\");\n            notifyItemInserted(sizeConsideringHeader());\n        } else {\n            notifyItemRemoved(sizeConsideringHeader());\n        }\n    }\n\n    private int adapterOffsetWithoutHeader(final int offset) {\n        return offset - (hasHeader() ? 1 : 0);\n    }\n\n    private int sizeConsideringHeader() {\n        return localItems.size() + (hasHeader() ? 1 : 0);\n    }\n\n    public ArrayList<LocalItem> getItemsList() {\n        return localItems;\n    }\n\n    @Override\n    public int getItemCount() {\n        int count = localItems.size();\n        if (hasHeader()) {\n            count++;\n        }\n        if (footer != null && showFooter) {\n            count++;\n        }\n\n        if (DEBUG) {\n            Log.d(TAG, \"getItemCount() called, count = \" + count + \", \"\n                    + \"localItems.size() = \" + localItems.size() + \", \"\n                    + \"header = \" + hasHeader() + \", footer = \" + footer + \", \"\n                    + \"showFooter = \" + showFooter);\n        }\n        return count;\n    }\n\n    @SuppressWarnings(\"FinalParameters\")\n    @Override\n    public int getItemViewType(int position) {\n        if (DEBUG) {\n            Log.d(TAG, \"getItemViewType() called with: position = [\" + position + \"]\");\n        }\n\n        if (hasHeader() && position == 0) {\n            return HEADER_TYPE;\n        } else if (hasHeader()) {\n            position--;\n        }\n        if (footer != null && position == localItems.size() && showFooter) {\n            return FOOTER_TYPE;\n        }\n        final LocalItem item = localItems.get(position);\n        switch (item.getLocalItemType()) {\n            case PLAYLIST_LOCAL_ITEM:\n                if (useItemHandle) {\n                    return LOCAL_BOOKMARK_PLAYLIST_HOLDER_TYPE;\n                } else if (itemViewMode == ItemViewMode.CARD) {\n                    return LOCAL_PLAYLIST_CARD_HOLDER_TYPE;\n                } else if (itemViewMode == ItemViewMode.GRID) {\n                    return LOCAL_PLAYLIST_GRID_HOLDER_TYPE;\n                } else {\n                    return LOCAL_PLAYLIST_HOLDER_TYPE;\n                }\n            case PLAYLIST_REMOTE_ITEM:\n                if (useItemHandle) {\n                    return REMOTE_BOOKMARK_PLAYLIST_HOLDER_TYPE;\n                } else if (itemViewMode == ItemViewMode.CARD) {\n                    return REMOTE_PLAYLIST_CARD_HOLDER_TYPE;\n                } else if (itemViewMode == ItemViewMode.GRID) {\n                    return REMOTE_PLAYLIST_GRID_HOLDER_TYPE;\n                } else {\n                    return REMOTE_PLAYLIST_HOLDER_TYPE;\n                }\n            case PLAYLIST_STREAM_ITEM:\n                if (itemViewMode == ItemViewMode.CARD) {\n                    return STREAM_PLAYLIST_CARD_HOLDER_TYPE;\n                } else if (itemViewMode == ItemViewMode.GRID) {\n                    return STREAM_PLAYLIST_GRID_HOLDER_TYPE;\n                } else {\n                    return STREAM_PLAYLIST_HOLDER_TYPE;\n                }\n            case STATISTIC_STREAM_ITEM:\n                if (itemViewMode == ItemViewMode.CARD) {\n                    return STREAM_STATISTICS_CARD_HOLDER_TYPE;\n                } else if (itemViewMode == ItemViewMode.GRID) {\n                    return STREAM_STATISTICS_GRID_HOLDER_TYPE;\n                } else {\n                    return STREAM_STATISTICS_HOLDER_TYPE;\n                }\n            default:\n                Log.e(TAG, \"No holder type has been considered for item: [\"\n                        + item.getLocalItemType() + \"]\");\n                return -1;\n        }\n    }\n\n    @NonNull\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent,\n                                                      final int type) {\n        if (DEBUG) {\n            Log.d(TAG, \"onCreateViewHolder() called with: \"\n                    + \"parent = [\" + parent + \"], type = [\" + type + \"]\");\n        }\n        switch (type) {\n            case HEADER_TYPE:\n                return new HeaderFooterHolder(headerSupplier.get());\n            case FOOTER_TYPE:\n                return new HeaderFooterHolder(footer);\n            case LOCAL_PLAYLIST_HOLDER_TYPE:\n                return new LocalPlaylistItemHolder(localItemBuilder, parent);\n            case LOCAL_PLAYLIST_GRID_HOLDER_TYPE:\n                return new LocalPlaylistGridItemHolder(localItemBuilder, parent);\n            case LOCAL_PLAYLIST_CARD_HOLDER_TYPE:\n                return new LocalPlaylistCardItemHolder(localItemBuilder, parent);\n            case LOCAL_BOOKMARK_PLAYLIST_HOLDER_TYPE:\n                return new LocalBookmarkPlaylistItemHolder(localItemBuilder, parent);\n            case REMOTE_PLAYLIST_HOLDER_TYPE:\n                return new RemotePlaylistItemHolder(localItemBuilder, parent);\n            case REMOTE_PLAYLIST_GRID_HOLDER_TYPE:\n                return new RemotePlaylistGridItemHolder(localItemBuilder, parent);\n            case REMOTE_PLAYLIST_CARD_HOLDER_TYPE:\n                return new RemotePlaylistCardItemHolder(localItemBuilder, parent);\n            case REMOTE_BOOKMARK_PLAYLIST_HOLDER_TYPE:\n                return new RemoteBookmarkPlaylistItemHolder(localItemBuilder, parent);\n            case STREAM_PLAYLIST_HOLDER_TYPE:\n                return new LocalPlaylistStreamItemHolder(localItemBuilder, parent);\n            case STREAM_PLAYLIST_GRID_HOLDER_TYPE:\n                return new LocalPlaylistStreamGridItemHolder(localItemBuilder, parent);\n            case STREAM_PLAYLIST_CARD_HOLDER_TYPE:\n                return new LocalPlaylistStreamCardItemHolder(localItemBuilder, parent);\n            case STREAM_STATISTICS_HOLDER_TYPE:\n                return new LocalStatisticStreamItemHolder(localItemBuilder, parent);\n            case STREAM_STATISTICS_GRID_HOLDER_TYPE:\n                return new LocalStatisticStreamGridItemHolder(localItemBuilder, parent);\n            case STREAM_STATISTICS_CARD_HOLDER_TYPE:\n                return new LocalStatisticStreamCardItemHolder(localItemBuilder, parent);\n            default:\n                Log.e(TAG, \"No view type has been considered for holder: [\" + type + \"]\");\n                return new FallbackViewHolder(new View(parent.getContext()));\n        }\n    }\n\n    @SuppressWarnings(\"FinalParameters\")\n    @Override\n    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {\n        if (DEBUG) {\n            Log.d(TAG, \"onBindViewHolder() called with: \"\n                    + \"holder = [\" + holder.getClass().getSimpleName() + \"], \"\n                    + \"position = [\" + position + \"]\");\n        }\n\n        if (holder instanceof LocalItemHolder) {\n            // If header isn't null, offset the items by -1\n            if (hasHeader()) {\n                position--;\n            }\n\n            ((LocalItemHolder) holder)\n                    .updateFromItem(localItems.get(position), recordManager, dateTimeFormatter);\n        } else if (holder instanceof HeaderFooterHolder && position == 0 && hasHeader()) {\n            ((HeaderFooterHolder) holder).view = headerSupplier.get();\n        } else if (holder instanceof HeaderFooterHolder && position == sizeConsideringHeader()\n                && footer != null && showFooter) {\n            ((HeaderFooterHolder) holder).view = footer;\n        }\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position,\n                                 @NonNull final List<Object> payloads) {\n        if (!payloads.isEmpty() && holder instanceof LocalItemHolder) {\n            for (final Object payload : payloads) {\n                if (payload instanceof StreamStateEntity) {\n                    ((LocalItemHolder) holder).updateState(localItems\n                            .get(hasHeader() ? position - 1 : position), recordManager);\n                } else if (payload instanceof Boolean) {\n                    ((LocalItemHolder) holder).updateState(localItems\n                            .get(hasHeader() ? position - 1 : position), recordManager);\n                }\n            }\n        } else {\n            onBindViewHolder(holder, position);\n        }\n    }\n\n    public GridLayoutManager.SpanSizeLookup getSpanSizeLookup(final int spanCount) {\n        return new GridLayoutManager.SpanSizeLookup() {\n            @Override\n            public int getSpanSize(final int position) {\n                final int type = getItemViewType(position);\n                return type == HEADER_TYPE || type == FOOTER_TYPE ? spanCount : 1;\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/bookmark/BookmarkFragment.java",
    "content": "package org.schabi.newpipe.local.bookmark;\n\nimport static org.schabi.newpipe.local.bookmark.MergedPlaylistManager.getMergedOrderedPlaylists;\nimport static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout;\n\nimport android.content.DialogInterface;\nimport android.os.Bundle;\nimport android.os.Parcelable;\nimport android.text.InputType;\nimport android.util.Log;\nimport android.util.Pair;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.evernote.android.state.State;\n\nimport org.reactivestreams.Subscriber;\nimport org.reactivestreams.Subscription;\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.AppDatabase;\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.playlist.PlaylistLocalItem;\nimport org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;\nimport org.schabi.newpipe.databinding.DialogEditTextBinding;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.local.BaseLocalListFragment;\nimport org.schabi.newpipe.local.holder.LocalBookmarkPlaylistItemHolder;\nimport org.schabi.newpipe.local.holder.RemoteBookmarkPlaylistItemHolder;\nimport org.schabi.newpipe.local.playlist.LocalPlaylistManager;\nimport org.schabi.newpipe.local.playlist.RemotePlaylistManager;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.OnClickGesture;\nimport org.schabi.newpipe.util.debounce.DebounceSavable;\nimport org.schabi.newpipe.util.debounce.DebounceSaver;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\n\npublic final class BookmarkFragment extends BaseLocalListFragment<List<PlaylistLocalItem>, Void>\n        implements DebounceSavable {\n\n    private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12;\n    @State\n    Parcelable itemsListState;\n\n    private Subscription databaseSubscription;\n    private CompositeDisposable disposables = new CompositeDisposable();\n    private LocalPlaylistManager localPlaylistManager;\n    private RemotePlaylistManager remotePlaylistManager;\n    private ItemTouchHelper itemTouchHelper;\n\n    /* Have the bookmarked playlists been fully loaded from db */\n    private AtomicBoolean isLoadingComplete;\n\n    /* Gives enough time to avoid interrupting user sorting operations */\n    @Nullable\n    private DebounceSaver debounceSaver;\n\n    private List<Pair<Long, LocalItem.LocalItemType>> deletedItems;\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment LifeCycle - Creation\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        if (activity == null) {\n            return;\n        }\n        final AppDatabase database = NewPipeDatabase.getInstance(activity);\n        localPlaylistManager = new LocalPlaylistManager(database);\n        remotePlaylistManager = new RemotePlaylistManager(database);\n        disposables = new CompositeDisposable();\n\n        isLoadingComplete = new AtomicBoolean();\n        debounceSaver = new DebounceSaver(3000, this);\n\n        deletedItems = new ArrayList<>();\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             final Bundle savedInstanceState) {\n\n        if (!useAsFrontPage) {\n            setTitle(activity.getString(R.string.tab_bookmarks));\n        }\n        return inflater.inflate(R.layout.fragment_bookmarks, container, false);\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        if (activity != null) {\n            setTitle(activity.getString(R.string.tab_bookmarks));\n        }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment LifeCycle - Views\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n\n        itemListAdapter.setUseItemHandle(true);\n    }\n\n    @Override\n    protected void initListeners() {\n        super.initListeners();\n\n        itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());\n        itemTouchHelper.attachToRecyclerView(itemsList);\n\n        itemListAdapter.setSelectedListener(new OnClickGesture<>() {\n            @Override\n            public void selected(final LocalItem selectedItem) {\n                final FragmentManager fragmentManager = getFM();\n\n                if (selectedItem instanceof PlaylistMetadataEntry) {\n                    final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem);\n                    NavigationHelper.openLocalPlaylistFragment(fragmentManager, entry.getUid(),\n                            entry.getOrderingName());\n\n                } else if (selectedItem instanceof PlaylistRemoteEntity) {\n                    final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem);\n                    NavigationHelper.openPlaylistFragment(\n                            fragmentManager,\n                            entry.getServiceId(),\n                            entry.getUrl(),\n                            entry.getOrderingName());\n                }\n            }\n\n            @Override\n            public void held(final LocalItem selectedItem) {\n                if (selectedItem instanceof PlaylistMetadataEntry) {\n                    showLocalDialog((PlaylistMetadataEntry) selectedItem);\n                } else if (selectedItem instanceof PlaylistRemoteEntity) {\n                    showRemoteDeleteDialog((PlaylistRemoteEntity) selectedItem);\n                }\n            }\n\n            @Override\n            public void drag(final LocalItem selectedItem,\n                             final RecyclerView.ViewHolder viewHolder) {\n                if (itemTouchHelper != null) {\n                    itemTouchHelper.startDrag(viewHolder);\n                }\n            }\n        });\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment LifeCycle - Loading\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void startLoading(final boolean forceLoad) {\n        super.startLoading(forceLoad);\n\n        if (debounceSaver != null) {\n            disposables.add(debounceSaver.getDebouncedSaver());\n            debounceSaver.setNoChangesToSave();\n        }\n        isLoadingComplete.set(false);\n\n        getMergedOrderedPlaylists(localPlaylistManager, remotePlaylistManager)\n                .onBackpressureLatest()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(getPlaylistsSubscriber());\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment LifeCycle - Destruction\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        itemsListState = itemsList.getLayoutManager().onSaveInstanceState();\n\n        // Save on exit\n        saveImmediate();\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n\n        if (disposables != null) {\n            disposables.clear();\n        }\n        if (databaseSubscription != null) {\n            databaseSubscription.cancel();\n        }\n\n        databaseSubscription = null;\n        itemTouchHelper = null;\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        if (debounceSaver != null) {\n            debounceSaver.getDebouncedSaveSignal().onComplete();\n        }\n        if (disposables != null) {\n            disposables.dispose();\n        }\n\n        debounceSaver = null;\n        disposables = null;\n        localPlaylistManager = null;\n        remotePlaylistManager = null;\n        itemsListState = null;\n\n        isLoadingComplete = null;\n        deletedItems = null;\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Subscriptions Loader\n    ///////////////////////////////////////////////////////////////////////////\n\n    private Subscriber<List<PlaylistLocalItem>> getPlaylistsSubscriber() {\n        return new Subscriber<>() {\n            @Override\n            public void onSubscribe(final Subscription s) {\n                showLoading();\n                isLoadingComplete.set(false);\n\n                if (databaseSubscription != null) {\n                    databaseSubscription.cancel();\n                }\n                databaseSubscription = s;\n                databaseSubscription.request(1);\n            }\n\n            @Override\n            public void onNext(final List<PlaylistLocalItem> subscriptions) {\n                if (debounceSaver == null || !debounceSaver.getIsModified()) {\n                    handleResult(subscriptions);\n                    isLoadingComplete.set(true);\n                }\n                if (databaseSubscription != null) {\n                    databaseSubscription.request(1);\n                }\n            }\n\n            @Override\n            public void onError(final Throwable exception) {\n                showError(new ErrorInfo(exception,\n                        UserAction.REQUESTED_BOOKMARK, \"Loading playlists\"));\n            }\n\n            @Override\n            public void onComplete() {\n            }\n        };\n    }\n\n    @Override\n    public void handleResult(@NonNull final List<PlaylistLocalItem> result) {\n        super.handleResult(result);\n\n        itemListAdapter.clearStreamItemList();\n\n        if (result.isEmpty()) {\n            showEmptyState();\n            return;\n        }\n\n        itemListAdapter.addItems(result);\n        if (itemsListState != null) {\n            itemsList.getLayoutManager().onRestoreInstanceState(itemsListState);\n            itemsListState = null;\n        }\n        hideLoading();\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment Error Handling\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    protected void resetFragment() {\n        super.resetFragment();\n        if (disposables != null) {\n            disposables.clear();\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playlist Metadata Manipulation\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void changeLocalPlaylistName(final long id, final String name) {\n        if (localPlaylistManager == null) {\n            return;\n        }\n\n        if (DEBUG) {\n            Log.d(TAG, \"Updating playlist id=[\" + id + \"] \"\n                    + \"with new name=[\" + name + \"] items\");\n        }\n\n        final Disposable disposable = localPlaylistManager.renamePlaylist(id, name)\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(longs -> { /*Do nothing on success*/ }, throwable -> showError(\n                        new ErrorInfo(throwable,\n                                UserAction.REQUESTED_BOOKMARK,\n                                \"Changing playlist name\")));\n        disposables.add(disposable);\n    }\n\n    private void deleteItem(final PlaylistLocalItem item) {\n        if (itemListAdapter == null) {\n            return;\n        }\n        itemListAdapter.removeItem(item);\n\n        if (item instanceof PlaylistMetadataEntry) {\n            deletedItems.add(new Pair<>(item.getUid(),\n                    LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM));\n        } else if (item instanceof PlaylistRemoteEntity) {\n            deletedItems.add(new Pair<>(item.getUid(),\n                    LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM));\n        }\n\n        if (debounceSaver != null) {\n            debounceSaver.setHasChangesToSave();\n            saveImmediate();\n        }\n    }\n\n    @Override\n    public void saveImmediate() {\n        if (itemListAdapter == null) {\n            return;\n        }\n\n        // List must be loaded and modified in order to save\n        if (isLoadingComplete == null || debounceSaver == null\n                || !isLoadingComplete.get() || !debounceSaver.getIsModified()) {\n            return;\n        }\n\n        final List<LocalItem> items = itemListAdapter.getItemsList();\n        final List<PlaylistMetadataEntry> localItemsUpdate = new ArrayList<>();\n        final List<Long> localItemsDeleteUid = new ArrayList<>();\n        final List<PlaylistRemoteEntity> remoteItemsUpdate = new ArrayList<>();\n        final List<Long> remoteItemsDeleteUid = new ArrayList<>();\n\n        // Calculate display index\n        for (int i = 0; i < items.size(); i++) {\n            final LocalItem item = items.get(i);\n\n            if (item instanceof PlaylistMetadataEntry\n                    && ((PlaylistMetadataEntry) item).getDisplayIndex() != i) {\n                ((PlaylistMetadataEntry) item).setDisplayIndex((long) i);\n                localItemsUpdate.add((PlaylistMetadataEntry) item);\n            } else if (item instanceof PlaylistRemoteEntity\n                    && ((PlaylistRemoteEntity) item).getDisplayIndex() != i) {\n                ((PlaylistRemoteEntity) item).setDisplayIndex((long) i);\n                remoteItemsUpdate.add((PlaylistRemoteEntity) item);\n            }\n        }\n\n        // Find deleted items\n        for (final Pair<Long, LocalItem.LocalItemType> item : deletedItems) {\n            if (item.second.equals(LocalItem.LocalItemType.PLAYLIST_LOCAL_ITEM)) {\n                localItemsDeleteUid.add(item.first);\n            } else if (item.second.equals(LocalItem.LocalItemType.PLAYLIST_REMOTE_ITEM)) {\n                remoteItemsDeleteUid.add(item.first);\n            }\n        }\n\n        deletedItems.clear();\n\n        // 1. Update local playlists\n        // 2. Update remote playlists\n        // 3. Set NoChangesToSave\n        disposables.add(localPlaylistManager.updatePlaylists(localItemsUpdate, localItemsDeleteUid)\n                .mergeWith(remotePlaylistManager.updatePlaylists(\n                        remoteItemsUpdate, remoteItemsDeleteUid))\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(() -> {\n                            if (debounceSaver != null) {\n                                debounceSaver.setNoChangesToSave();\n                            }\n                        },\n                        throwable -> showError(new ErrorInfo(throwable,\n                                UserAction.REQUESTED_BOOKMARK, \"Saving playlist\"))\n                ));\n\n    }\n\n    private ItemTouchHelper.SimpleCallback getItemTouchCallback() {\n        int directions = ItemTouchHelper.UP | ItemTouchHelper.DOWN;\n        if (shouldUseGridLayout(requireContext())) {\n            directions |= ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;\n        }\n        return new ItemTouchHelper.SimpleCallback(directions, ItemTouchHelper.ACTION_STATE_IDLE) {\n            @Override\n            public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView,\n                                                    final int viewSize,\n                                                    final int viewSizeOutOfBounds,\n                                                    final int totalSize,\n                                                    final long msSinceStartScroll) {\n                final int standardSpeed = super.interpolateOutOfBoundsScroll(recyclerView,\n                        viewSize, viewSizeOutOfBounds, totalSize, msSinceStartScroll);\n                final int minimumAbsVelocity = Math.max(MINIMUM_INITIAL_DRAG_VELOCITY,\n                        Math.abs(standardSpeed));\n                return minimumAbsVelocity * (int) Math.signum(viewSizeOutOfBounds);\n            }\n\n            @Override\n            public boolean onMove(@NonNull final RecyclerView recyclerView,\n                                  @NonNull final RecyclerView.ViewHolder source,\n                                  @NonNull final RecyclerView.ViewHolder target) {\n\n                // Allow swap LocalBookmarkPlaylistItemHolder and RemoteBookmarkPlaylistItemHolder.\n                if (itemListAdapter == null\n                        || source.getItemViewType() != target.getItemViewType()\n                        && !(\n                        (\n                                (source instanceof LocalBookmarkPlaylistItemHolder)\n                                        || (source instanceof RemoteBookmarkPlaylistItemHolder)\n                        )\n                                && (\n                                (target instanceof LocalBookmarkPlaylistItemHolder)\n                                        || (target instanceof RemoteBookmarkPlaylistItemHolder)\n                        ))\n                ) {\n                    return false;\n                }\n\n                final int sourceIndex = source.getBindingAdapterPosition();\n                final int targetIndex = target.getBindingAdapterPosition();\n                final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex);\n                if (isSwapped && debounceSaver != null) {\n                    debounceSaver.setHasChangesToSave();\n                }\n                return isSwapped;\n            }\n\n            @Override\n            public boolean isLongPressDragEnabled() {\n                return false;\n            }\n\n            @Override\n            public boolean isItemViewSwipeEnabled() {\n                return false;\n            }\n\n            @Override\n            public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder,\n                                 final int swipeDir) {\n                // Do nothing.\n            }\n        };\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Utils\n    ///////////////////////////////////////////////////////////////////////////\n\n    private void showRemoteDeleteDialog(final PlaylistRemoteEntity item) {\n        showDeleteDialog(item.getOrderingName(), item);\n    }\n\n    private void showLocalDialog(final PlaylistMetadataEntry selectedItem) {\n        final String rename = getString(R.string.rename);\n        final String delete = getString(R.string.delete);\n        final String unsetThumbnail = getString(R.string.unset_playlist_thumbnail);\n        final boolean isThumbnailPermanent = localPlaylistManager\n                .getIsPlaylistThumbnailPermanent(selectedItem.getUid());\n\n        final ArrayList<String> items = new ArrayList<>();\n        items.add(rename);\n        items.add(delete);\n        if (isThumbnailPermanent) {\n            items.add(unsetThumbnail);\n        }\n\n        final DialogInterface.OnClickListener action = (d, index) -> {\n            if (items.get(index).equals(rename)) {\n                showRenameDialog(selectedItem);\n            } else if (items.get(index).equals(delete)) {\n                showDeleteDialog(selectedItem.getOrderingName(), selectedItem);\n            } else if (isThumbnailPermanent && items.get(index).equals(unsetThumbnail)) {\n                final long thumbnailStreamId = localPlaylistManager\n                        .getAutomaticPlaylistThumbnailStreamId(selectedItem.getUid());\n                localPlaylistManager\n                        .changePlaylistThumbnail(selectedItem.getUid(), thumbnailStreamId, false)\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .subscribe();\n            }\n        };\n\n        new AlertDialog.Builder(activity)\n                .setItems(items.toArray(new String[0]), action)\n                .show();\n    }\n\n    private void showRenameDialog(final PlaylistMetadataEntry selectedItem) {\n        final DialogEditTextBinding dialogBinding =\n                DialogEditTextBinding.inflate(getLayoutInflater());\n        dialogBinding.dialogEditText.setHint(R.string.name);\n        dialogBinding.dialogEditText.setInputType(InputType.TYPE_CLASS_TEXT);\n        dialogBinding.dialogEditText.setText(selectedItem.getOrderingName());\n\n        new AlertDialog.Builder(activity)\n                .setView(dialogBinding.getRoot())\n                .setPositiveButton(R.string.rename_playlist, (dialog, which) ->\n                        changeLocalPlaylistName(\n                                selectedItem.getUid(),\n                                dialogBinding.dialogEditText.getText().toString()))\n                .setNegativeButton(R.string.cancel, null)\n                .show();\n    }\n\n    private void showDeleteDialog(final String name, final PlaylistLocalItem item) {\n        if (activity == null || disposables == null) {\n            return;\n        }\n\n        new AlertDialog.Builder(activity)\n                .setTitle(name)\n                .setMessage(R.string.delete_playlist_prompt)\n                .setCancelable(true)\n                .setPositiveButton(R.string.delete, (dialog, i) -> deleteItem(item))\n                .setNegativeButton(R.string.cancel, null)\n                .show();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/bookmark/MergedPlaylistManager.java",
    "content": "package org.schabi.newpipe.local.bookmark;\n\nimport org.schabi.newpipe.database.playlist.PlaylistLocalItem;\nimport org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;\nimport org.schabi.newpipe.local.playlist.LocalPlaylistManager;\nimport org.schabi.newpipe.local.playlist.RemotePlaylistManager;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.List;\n\nimport io.reactivex.rxjava3.core.Flowable;\n\n/**\n * Takes care of remote and local playlists at once, hence \"merged\".\n */\npublic final class MergedPlaylistManager {\n\n    private MergedPlaylistManager() {\n    }\n\n    public static Flowable<List<PlaylistLocalItem>> getMergedOrderedPlaylists(\n            final LocalPlaylistManager localPlaylistManager,\n            final RemotePlaylistManager remotePlaylistManager) {\n        return Flowable.combineLatest(\n                localPlaylistManager.getPlaylists(),\n                remotePlaylistManager.getPlaylists(),\n                MergedPlaylistManager::merge\n        );\n    }\n\n    /**\n     * Merge localPlaylists and remotePlaylists by the display index.\n     * If two items have the same display index, sort them in {@code CASE_INSENSITIVE_ORDER}.\n     *\n     * @param localPlaylists  local playlists, already sorted by display index\n     * @param remotePlaylists remote playlists, already sorted by display index\n     * @return merged playlists\n     */\n    public static List<PlaylistLocalItem> merge(\n            final List<PlaylistMetadataEntry> localPlaylists,\n            final List<PlaylistRemoteEntity> remotePlaylists) {\n\n        // This algorithm is similar to the merge operation in merge sort.\n        final List<PlaylistLocalItem> result = new ArrayList<>(\n                localPlaylists.size() + remotePlaylists.size());\n        final List<PlaylistLocalItem> itemsWithSameIndex = new ArrayList<>();\n\n        int i = 0;\n        int j = 0;\n        while (i < localPlaylists.size()) {\n            while (j < remotePlaylists.size()) {\n                if (remotePlaylists.get(j).getDisplayIndex()\n                        <= localPlaylists.get(i).getDisplayIndex()) {\n                    addItem(result, remotePlaylists.get(j), itemsWithSameIndex);\n                    j++;\n                } else {\n                    break;\n                }\n            }\n            addItem(result, localPlaylists.get(i), itemsWithSameIndex);\n            i++;\n        }\n        while (j < remotePlaylists.size()) {\n            addItem(result, remotePlaylists.get(j), itemsWithSameIndex);\n            j++;\n        }\n        addItemsWithSameIndex(result, itemsWithSameIndex);\n\n        return result;\n    }\n\n    private static void addItem(final List<PlaylistLocalItem> result,\n                                final PlaylistLocalItem item,\n                                final List<PlaylistLocalItem> itemsWithSameIndex) {\n        if (!itemsWithSameIndex.isEmpty()\n                && itemsWithSameIndex.get(0).getDisplayIndex() != item.getDisplayIndex()) {\n            // The new item has a different display index, add previous items with same\n            // index to the result.\n            addItemsWithSameIndex(result, itemsWithSameIndex);\n            itemsWithSameIndex.clear();\n        }\n        itemsWithSameIndex.add(item);\n    }\n\n    private static void addItemsWithSameIndex(final List<PlaylistLocalItem> result,\n                                              final List<PlaylistLocalItem> itemsWithSameIndex) {\n        Collections.sort(itemsWithSameIndex,\n                Comparator.comparing(PlaylistLocalItem::getOrderingName,\n                        Comparator.nullsLast(String.CASE_INSENSITIVE_ORDER)));\n        result.addAll(itemsWithSameIndex);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistAppendDialog.java",
    "content": "package org.schabi.newpipe.local.dialog;\n\nimport static org.schabi.newpipe.database.playlist.model.PlaylistEntity.DEFAULT_THUMBNAIL_ID;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry;\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.local.LocalItemListAdapter;\nimport org.schabi.newpipe.local.playlist.LocalPlaylistManager;\n\nimport java.util.List;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\n\npublic final class PlaylistAppendDialog extends PlaylistDialog {\n    private static final String TAG = PlaylistAppendDialog.class.getCanonicalName();\n\n    private RecyclerView playlistRecyclerView;\n    private LocalItemListAdapter playlistAdapter;\n    private TextView playlistDuplicateIndicator;\n\n    private final CompositeDisposable playlistDisposables = new CompositeDisposable();\n\n    /**\n     * Create a new instance of {@link PlaylistAppendDialog}.\n     *\n     * @param streamEntities    a list of {@link StreamEntity} to be added to playlists\n     * @return a new instance of {@link PlaylistAppendDialog}\n     */\n    public static PlaylistAppendDialog newInstance(final List<StreamEntity> streamEntities) {\n        final PlaylistAppendDialog dialog = new PlaylistAppendDialog();\n        dialog.setStreamEntities(streamEntities);\n        return dialog;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // LifeCycle - Creation\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.dialog_playlists, container);\n    }\n\n    @Override\n    public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) {\n        super.onViewCreated(view, savedInstanceState);\n\n        final LocalPlaylistManager playlistManager =\n                new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext()));\n\n        playlistAdapter = new LocalItemListAdapter(getActivity());\n        playlistAdapter.setSelectedListener(selectedItem -> {\n            final List<StreamEntity> entities = getStreamEntities();\n            if (selectedItem instanceof PlaylistDuplicatesEntry && entities != null) {\n                onPlaylistSelected(playlistManager,\n                        (PlaylistDuplicatesEntry) selectedItem, entities);\n            }\n        });\n\n        playlistRecyclerView = view.findViewById(R.id.playlist_list);\n        playlistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));\n        playlistRecyclerView.setAdapter(playlistAdapter);\n\n        playlistDuplicateIndicator = view.findViewById(R.id.playlist_duplicate);\n\n        final View newPlaylistButton = view.findViewById(R.id.newPlaylist);\n        newPlaylistButton.setOnClickListener(ignored -> openCreatePlaylistDialog());\n\n        playlistDisposables.add(playlistManager\n                .getPlaylistDuplicates(getStreamEntities().get(0).getUrl())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(this::onPlaylistsReceived));\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // LifeCycle - Destruction\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        playlistDisposables.dispose();\n        if (playlistAdapter != null) {\n            playlistAdapter.unsetSelectedListener();\n        }\n\n        playlistDisposables.clear();\n        playlistRecyclerView = null;\n        playlistAdapter = null;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Helper\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /** Display create playlist dialog. */\n    public void openCreatePlaylistDialog() {\n        if (getStreamEntities() == null || !isAdded()) {\n            return;\n        }\n\n        final PlaylistCreationDialog playlistCreationDialog =\n                PlaylistCreationDialog.newInstance(getStreamEntities());\n        // Move the dismissListener to the new dialog.\n        playlistCreationDialog.setOnDismissListener(this.getOnDismissListener());\n        this.setOnDismissListener(null);\n\n        playlistCreationDialog.show(getParentFragmentManager(), TAG);\n        requireDialog().dismiss();\n    }\n\n    private void onPlaylistsReceived(@NonNull final List<PlaylistDuplicatesEntry> playlists) {\n        if (playlistAdapter != null\n                && playlistRecyclerView != null\n                && playlistDuplicateIndicator != null) {\n            playlistAdapter.clearStreamItemList();\n            playlistAdapter.addItems(playlists);\n            playlistRecyclerView.setVisibility(View.VISIBLE);\n            playlistDuplicateIndicator.setVisibility(\n                    anyPlaylistContainsDuplicates(playlists) ? View.VISIBLE : View.GONE);\n        }\n    }\n\n    private boolean anyPlaylistContainsDuplicates(final List<PlaylistDuplicatesEntry> playlists) {\n        return playlists.stream()\n                .anyMatch(playlist -> playlist.getTimesStreamIsContained() > 0);\n    }\n\n    private void onPlaylistSelected(@NonNull final LocalPlaylistManager manager,\n                                    @NonNull final PlaylistDuplicatesEntry playlist,\n                                    @NonNull final List<StreamEntity> streams) {\n\n        final String toastText;\n        if (playlist.getTimesStreamIsContained() > 0) {\n            toastText = getString(R.string.playlist_add_stream_success_duplicate,\n                    playlist.getTimesStreamIsContained());\n        } else {\n            toastText = getString(R.string.playlist_add_stream_success);\n        }\n\n        final Toast successToast = Toast.makeText(getContext(), toastText, Toast.LENGTH_SHORT);\n\n        playlistDisposables.add(manager.appendToPlaylist(playlist.getUid(), streams)\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(ignored -> {\n                    successToast.show();\n\n                    if (playlist.getThumbnailStreamId() != null\n                            && playlist.getThumbnailStreamId() == DEFAULT_THUMBNAIL_ID\n                    ) {\n                        playlistDisposables.add(manager\n                                .changePlaylistThumbnail(playlist.getUid(), streams.get(0).getUid(),\n                                        false)\n                                .observeOn(AndroidSchedulers.mainThread())\n                                .subscribe(ignore -> successToast.show()));\n                    }\n                }));\n\n        requireDialog().dismiss();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistCreationDialog.java",
    "content": "package org.schabi.newpipe.local.dialog;\n\nimport android.app.Dialog;\nimport android.os.Bundle;\nimport android.text.InputType;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AlertDialog.Builder;\n\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.databinding.DialogEditTextBinding;\nimport org.schabi.newpipe.local.playlist.LocalPlaylistManager;\nimport org.schabi.newpipe.util.ThemeHelper;\n\nimport java.util.List;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\n\npublic final class PlaylistCreationDialog extends PlaylistDialog {\n\n    /**\n     * Create a new instance of {@link PlaylistCreationDialog}.\n     *\n     * @param streamEntities    a list of {@link StreamEntity} to be added to playlists\n     * @return a new instance of {@link PlaylistCreationDialog}\n     */\n    public static PlaylistCreationDialog newInstance(final List<StreamEntity> streamEntities) {\n        final PlaylistCreationDialog dialog = new PlaylistCreationDialog();\n        dialog.setStreamEntities(streamEntities);\n        return dialog;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Dialog\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {\n        if (getStreamEntities() == null) {\n            return super.onCreateDialog(savedInstanceState);\n        }\n\n        final DialogEditTextBinding dialogBinding =\n                DialogEditTextBinding.inflate(getLayoutInflater());\n        dialogBinding.getRoot().getContext().setTheme(ThemeHelper.getDialogTheme(requireContext()));\n        dialogBinding.dialogEditText.setHint(R.string.name);\n        dialogBinding.dialogEditText.setInputType(InputType.TYPE_CLASS_TEXT);\n\n        final Builder dialogBuilder = new Builder(requireContext(),\n                ThemeHelper.getDialogTheme(requireContext()))\n                .setTitle(R.string.create_playlist)\n                .setView(dialogBinding.getRoot())\n                .setCancelable(true)\n                .setNegativeButton(R.string.cancel, null)\n                .setPositiveButton(R.string.create, (dialogInterface, i) -> {\n                    final String name = dialogBinding.dialogEditText.getText().toString();\n                    final LocalPlaylistManager playlistManager =\n                            new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext()));\n                    final Toast successToast = Toast.makeText(getActivity(),\n                            R.string.playlist_creation_success,\n                            Toast.LENGTH_SHORT);\n\n                    playlistManager.createPlaylist(name, getStreamEntities())\n                            .observeOn(AndroidSchedulers.mainThread())\n                            .subscribe(longs -> successToast.show());\n                });\n        return dialogBuilder.create();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/dialog/PlaylistDialog.java",
    "content": "package org.schabi.newpipe.local.dialog;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.os.Bundle;\nimport android.view.Window;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.fragment.app.FragmentManager;\n\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.local.playlist.LocalPlaylistManager;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.util.StateSaver;\n\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Queue;\nimport java.util.function.Consumer;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.disposables.Disposable;\n\npublic abstract class PlaylistDialog extends DialogFragment implements StateSaver.WriteRead {\n\n    @Nullable\n    private DialogInterface.OnDismissListener onDismissListener = null;\n\n    private List<StreamEntity> streamEntities;\n\n    private org.schabi.newpipe.util.SavedState savedState;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // LifeCycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(@Nullable final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        savedState = StateSaver.tryToRestore(savedInstanceState, this);\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        StateSaver.onDestroy(savedState);\n    }\n\n    public List<StreamEntity> getStreamEntities() {\n        return streamEntities;\n    }\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(final Bundle savedInstanceState) {\n        final Dialog dialog = super.onCreateDialog(savedInstanceState);\n        //remove title\n        final Window window = dialog.getWindow();\n        if (window != null) {\n            window.requestFeature(Window.FEATURE_NO_TITLE);\n        }\n        return dialog;\n    }\n\n    @Override\n    public void onDismiss(@NonNull final DialogInterface dialog) {\n        super.onDismiss(dialog);\n        if (onDismissListener != null) {\n            onDismissListener.onDismiss(dialog);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // State Saving\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public String generateSuffix() {\n        final int size = streamEntities == null ? 0 : streamEntities.size();\n        return \".\" + size + \".list\";\n    }\n\n    @Override\n    public void writeTo(final Queue<Object> objectsToSave) {\n        objectsToSave.add(streamEntities);\n    }\n\n    @Override\n    @SuppressWarnings(\"unchecked\")\n    public void readFrom(@NonNull final Queue<Object> savedObjects) {\n        streamEntities = (List<StreamEntity>) savedObjects.poll();\n    }\n\n    @Override\n    public void onSaveInstanceState(@NonNull final Bundle outState) {\n        super.onSaveInstanceState(outState);\n        if (getActivity() != null) {\n            savedState = StateSaver.tryToSave(getActivity().isChangingConfigurations(),\n                    savedState, outState, this);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Getter + Setter\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Nullable\n    public DialogInterface.OnDismissListener getOnDismissListener() {\n        return onDismissListener;\n    }\n\n    public void setOnDismissListener(\n            @Nullable final DialogInterface.OnDismissListener onDismissListener\n    ) {\n        this.onDismissListener = onDismissListener;\n    }\n\n    protected void setStreamEntities(final List<StreamEntity> streamEntities) {\n        this.streamEntities = streamEntities;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Dialog creation\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * Creates a {@link PlaylistAppendDialog} when playlists exists,\n     * otherwise a {@link PlaylistCreationDialog}.\n     *\n     * @param context        context used for accessing the database\n     * @param streamEntities used for crating the dialog\n     * @param onExec         execution that should occur after a dialog got created, e.g. showing it\n     * @return the disposable that was created\n     */\n    public static Disposable createCorrespondingDialog(\n            final Context context,\n            final List<StreamEntity> streamEntities,\n            final Consumer<PlaylistDialog> onExec) {\n\n        return new LocalPlaylistManager(NewPipeDatabase.getInstance(context))\n                .hasPlaylists()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(hasPlaylists ->\n                        onExec.accept(hasPlaylists\n                                ? PlaylistAppendDialog.newInstance(streamEntities)\n                                : PlaylistCreationDialog.newInstance(streamEntities))\n                );\n    }\n\n    /**\n     * Creates a {@link PlaylistAppendDialog} when playlists exists,\n     * otherwise a {@link PlaylistCreationDialog}. If the player's play queue is null or empty, no\n     * dialog will be created.\n     *\n     * @param player          the player from which to extract the context and the play queue\n     * @param fragmentManager the fragment manager to use to show the dialog\n     * @return the disposable that was created\n     */\n    public static Disposable showForPlayQueue(\n            final Player player,\n            @NonNull final FragmentManager fragmentManager) {\n\n        final List<StreamEntity> streamEntities = Stream.of(player.getPlayQueue())\n                .filter(Objects::nonNull)\n                .flatMap(playQueue -> playQueue.getStreams().stream())\n                .map(StreamEntity::new)\n                .collect(Collectors.toList());\n        if (streamEntities.isEmpty()) {\n            return Disposable.empty();\n        }\n\n        return PlaylistDialog.createCorrespondingDialog(player.getContext(), streamEntities,\n                dialog -> dialog.show(fragmentManager, \"PlaylistDialog\"));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/FeedDatabaseManager.kt",
    "content": "package org.schabi.newpipe.local.feed\n\nimport android.content.Context\nimport android.util.Log\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.core.Completable\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.core.Maybe\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport java.time.LocalDate\nimport java.time.OffsetDateTime\nimport java.time.ZoneOffset\nimport org.schabi.newpipe.MainActivity.DEBUG\nimport org.schabi.newpipe.NewPipeDatabase\nimport org.schabi.newpipe.database.feed.model.FeedEntity\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity\nimport org.schabi.newpipe.database.stream.StreamWithState\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.database.subscription.NotificationMode\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.extractor.stream.StreamType\nimport org.schabi.newpipe.local.subscription.FeedGroupIcon\n\nclass FeedDatabaseManager(context: Context) {\n    private val database = NewPipeDatabase.getInstance(context)\n    private val feedTable = database.feedDAO()\n    private val feedGroupTable = database.feedGroupDAO()\n    private val streamTable = database.streamDAO()\n\n    companion object {\n        /**\n         * Only items that are newer than this will be saved.\n         */\n        val FEED_OLDEST_ALLOWED_DATE: OffsetDateTime = LocalDate.now().minusWeeks(13)\n            .atStartOfDay().atOffset(ZoneOffset.UTC)\n    }\n\n    fun groups() = feedGroupTable.getAll()\n\n    fun database() = database\n\n    fun getStreams(\n        groupId: Long,\n        includePlayedStreams: Boolean,\n        includePartiallyPlayedStreams: Boolean,\n        includeFutureStreams: Boolean\n    ): Maybe<List<StreamWithState>> {\n        return feedTable.getStreams(\n            groupId,\n            includePlayedStreams,\n            includePartiallyPlayedStreams,\n            if (includeFutureStreams) null else OffsetDateTime.now()\n        )\n    }\n\n    fun outdatedSubscriptions(outdatedThreshold: OffsetDateTime) = feedTable.getAllOutdated(outdatedThreshold)\n\n    fun outdatedSubscriptionsWithNotificationMode(\n        outdatedThreshold: OffsetDateTime,\n        @NotificationMode notificationMode: Int\n    ) = feedTable.getOutdatedWithNotificationMode(outdatedThreshold, notificationMode)\n\n    fun notLoadedCount(groupId: Long = FeedGroupEntity.GROUP_ALL_ID): Flowable<Long> {\n        return when (groupId) {\n            FeedGroupEntity.GROUP_ALL_ID -> feedTable.notLoadedCount()\n            else -> feedTable.notLoadedCountForGroup(groupId)\n        }\n    }\n\n    fun outdatedSubscriptionsForGroup(\n        groupId: Long = FeedGroupEntity.GROUP_ALL_ID,\n        outdatedThreshold: OffsetDateTime\n    ) = feedTable.getAllOutdatedForGroup(groupId, outdatedThreshold)\n\n    fun markAsOutdated(subscriptionId: Long) = feedTable\n        .setLastUpdatedForSubscription(FeedLastUpdatedEntity(subscriptionId, null))\n\n    fun doesStreamExist(stream: StreamInfoItem): Boolean {\n        return streamTable.exists(stream.serviceId, stream.url)\n    }\n\n    fun upsertAll(\n        subscriptionId: Long,\n        items: List<StreamInfoItem>,\n        oldestAllowedDate: OffsetDateTime = FEED_OLDEST_ALLOWED_DATE\n    ) {\n        val itemsToInsert = items.mapNotNull { stream ->\n            val uploadDate = stream.uploadDate\n\n            when {\n                uploadDate == null && stream.streamType == StreamType.LIVE_STREAM -> stream\n                uploadDate != null && uploadDate.offsetDateTime() >= oldestAllowedDate -> stream\n                else -> null\n            }\n        }\n\n        feedTable.unlinkOldLivestreams(subscriptionId)\n\n        if (itemsToInsert.isNotEmpty()) {\n            val streamEntities = itemsToInsert.map { StreamEntity(it) }\n            val streamIds = streamTable.upsertAll(streamEntities)\n            val feedEntities = streamIds.map { FeedEntity(it, subscriptionId) }\n\n            feedTable.insertAll(feedEntities)\n        }\n\n        feedTable.setLastUpdatedForSubscription(\n            FeedLastUpdatedEntity(subscriptionId, OffsetDateTime.now(ZoneOffset.UTC))\n        )\n    }\n\n    fun removeOrphansOrOlderStreams(oldestAllowedDate: OffsetDateTime = FEED_OLDEST_ALLOWED_DATE) {\n        feedTable.unlinkStreamsOlderThan(oldestAllowedDate)\n        streamTable.deleteOrphans()\n    }\n\n    fun clear() {\n        feedTable.deleteAll()\n        val deletedOrphans = streamTable.deleteOrphans()\n        if (DEBUG) {\n            Log.d(\n                this::class.java.simpleName,\n                \"clear() → streamTable.deleteOrphans() → $deletedOrphans\"\n            )\n        }\n    }\n\n    // /////////////////////////////////////////////////////////////////////////\n    // Feed Groups\n    // /////////////////////////////////////////////////////////////////////////\n\n    fun subscriptionIdsForGroup(groupId: Long): Flowable<List<Long>> {\n        return feedGroupTable.getSubscriptionIdsFor(groupId)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n    }\n\n    fun updateSubscriptionsForGroup(groupId: Long, subscriptionIds: List<Long>): Completable {\n        return Completable\n            .fromCallable { feedGroupTable.updateSubscriptionsForGroup(groupId, subscriptionIds) }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n    }\n\n    fun createGroup(name: String, icon: FeedGroupIcon): Maybe<Long> {\n        return Maybe.fromCallable { feedGroupTable.insert(FeedGroupEntity(0, name, icon)) }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n    }\n\n    fun getGroup(groupId: Long): Maybe<FeedGroupEntity> {\n        return feedGroupTable.getGroup(groupId)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n    }\n\n    fun updateGroup(feedGroupEntity: FeedGroupEntity): Completable {\n        return Completable.fromCallable { feedGroupTable.update(feedGroupEntity) }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n    }\n\n    fun deleteGroup(groupId: Long): Completable {\n        return Completable.fromCallable { feedGroupTable.delete(groupId) }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n    }\n\n    fun updateGroupsOrder(groupIdList: List<Long>): Completable {\n        var index = 0L\n        val orderMap = groupIdList.associateBy({ it }, { index++ })\n\n        return Completable.fromCallable { feedGroupTable.updateOrder(orderMap) }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n    }\n\n    fun oldestSubscriptionUpdate(groupId: Long): Flowable<List<OffsetDateTime?>> {\n        return when (groupId) {\n            FeedGroupEntity.GROUP_ALL_ID -> feedTable.oldestSubscriptionUpdateFromAll()\n            else -> feedTable.oldestSubscriptionUpdate(groupId)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt",
    "content": "/*\n * Copyright 2019 Mauricio Colli <mauriciocolli@outlook.com>\n * FeedFragment.kt is part of NewPipe\n *\n * License: GPL-3.0+\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\npackage org.schabi.newpipe.local.feed\n\nimport android.annotation.SuppressLint\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.content.SharedPreferences\nimport android.graphics.Typeface\nimport android.graphics.drawable.LayerDrawable\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Button\nimport androidx.appcompat.app.AlertDialog\nimport androidx.core.content.edit\nimport androidx.core.os.bundleOf\nimport androidx.core.view.isVisible\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.preference.PreferenceManager\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.evernote.android.state.State\nimport com.xwray.groupie.GroupieAdapter\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport com.xwray.groupie.OnItemLongClickListener\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.core.Single\nimport io.reactivex.rxjava3.disposables.CompositeDisposable\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport java.time.OffsetDateTime\nimport java.util.function.Consumer\nimport org.schabi.newpipe.NewPipeDatabase\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\nimport org.schabi.newpipe.databinding.FragmentFeedBinding\nimport org.schabi.newpipe.error.ErrorInfo\nimport org.schabi.newpipe.error.ErrorUtil\nimport org.schabi.newpipe.error.UserAction\nimport org.schabi.newpipe.extractor.exceptions.AccountTerminatedException\nimport org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty\nimport org.schabi.newpipe.fragments.BaseStateFragment\nimport org.schabi.newpipe.info_list.ItemViewMode\nimport org.schabi.newpipe.info_list.dialog.InfoItemDialog\nimport org.schabi.newpipe.ktx.animate\nimport org.schabi.newpipe.ktx.animateHideRecyclerViewAllowingScrolling\nimport org.schabi.newpipe.ktx.slideUp\nimport org.schabi.newpipe.local.feed.item.StreamItem\nimport org.schabi.newpipe.local.feed.service.FeedLoadService\nimport org.schabi.newpipe.local.subscription.SubscriptionManager\nimport org.schabi.newpipe.util.DeviceUtils\nimport org.schabi.newpipe.util.Localization\nimport org.schabi.newpipe.util.NavigationHelper\nimport org.schabi.newpipe.util.ThemeHelper.getGridSpanCountStreams\nimport org.schabi.newpipe.util.ThemeHelper.getItemViewMode\nimport org.schabi.newpipe.util.ThemeHelper.resolveDrawable\nimport org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout\n\nclass FeedFragment : BaseStateFragment<FeedState>() {\n    private var _feedBinding: FragmentFeedBinding? = null\n    private val feedBinding get() = _feedBinding!!\n\n    private val disposables = CompositeDisposable()\n\n    private lateinit var viewModel: FeedViewModel\n\n    @State\n    @JvmField\n    var listState: Parcelable? = null\n\n    private var groupId = FeedGroupEntity.GROUP_ALL_ID\n    private var groupName = \"\"\n    private var oldestSubscriptionUpdate: OffsetDateTime? = null\n\n    private lateinit var groupAdapter: GroupieAdapter\n\n    private var onSettingsChangeListener: SharedPreferences.OnSharedPreferenceChangeListener? = null\n    private var updateListViewModeOnResume = false\n    private var isRefreshing = false\n\n    private var lastNewItemsCount = 0\n\n    init {\n        setHasOptionsMenu(true)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        groupId = arguments?.getLong(KEY_GROUP_ID, FeedGroupEntity.GROUP_ALL_ID)\n            ?: FeedGroupEntity.GROUP_ALL_ID\n        groupName = arguments?.getString(KEY_GROUP_NAME) ?: \"\"\n\n        onSettingsChangeListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->\n            if (getString(R.string.list_view_mode_key).equals(key)) {\n                updateListViewModeOnResume = true\n            }\n        }\n        PreferenceManager.getDefaultSharedPreferences(activity)\n            .registerOnSharedPreferenceChangeListener(onSettingsChangeListener)\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        return inflater.inflate(R.layout.fragment_feed, container, false)\n    }\n\n    override fun onViewCreated(rootView: View, savedInstanceState: Bundle?) {\n        // super.onViewCreated() calls initListeners() which require the binding to be initialized\n        _feedBinding = FragmentFeedBinding.bind(rootView)\n        super.onViewCreated(rootView, savedInstanceState)\n\n        val factory = FeedViewModel.getFactory(requireContext(), groupId)\n        viewModel = ViewModelProvider(this, factory)[FeedViewModel::class.java]\n        viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(::handleResult) }\n\n        groupAdapter = GroupieAdapter().apply {\n            setOnItemClickListener(listenerStreamItem)\n            setOnItemLongClickListener(listenerStreamItem)\n        }\n\n        feedBinding.itemsList.addOnScrollListener(object : RecyclerView.OnScrollListener() {\n            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {\n                // Check if we scrolled to the top\n                if (newState == RecyclerView.SCROLL_STATE_IDLE &&\n                    !recyclerView.canScrollVertically(-1)\n                ) {\n                    if (tryGetNewItemsLoadedButton()?.isVisible == true) {\n                        hideNewItemsLoaded(true)\n                    }\n                }\n            }\n        })\n\n        feedBinding.itemsList.adapter = groupAdapter\n        setupListViewMode()\n    }\n\n    override fun onPause() {\n        super.onPause()\n        listState = feedBinding.itemsList.layoutManager?.onSaveInstanceState()\n    }\n\n    override fun onResume() {\n        super.onResume()\n        updateRelativeTimeViews()\n\n        if (updateListViewModeOnResume) {\n            updateListViewModeOnResume = false\n\n            setupListViewMode()\n            if (viewModel.stateLiveData.value != null) {\n                handleResult(viewModel.stateLiveData.value!!)\n            }\n        }\n    }\n\n    private fun setupListViewMode() {\n        // does everything needed to setup the layouts for grid or list modes\n        groupAdapter.spanCount = if (shouldUseGridLayout(context)) getGridSpanCountStreams(context) else 1\n        feedBinding.itemsList.layoutManager = GridLayoutManager(requireContext(), groupAdapter.spanCount).apply {\n            spanSizeLookup = groupAdapter.spanSizeLookup\n        }\n    }\n\n    override fun initListeners() {\n        super.initListeners()\n        feedBinding.refreshRootView.setOnClickListener { reloadContent() }\n        feedBinding.swipeRefreshLayout.setOnRefreshListener { reloadContent() }\n        feedBinding.newItemsLoadedButton.setOnClickListener {\n            hideNewItemsLoaded(true)\n            feedBinding.itemsList.scrollToPosition(0)\n        }\n    }\n\n    // /////////////////////////////////////////////////////////////////////////\n    // Menu\n    // /////////////////////////////////////////////////////////////////////////\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        super.onCreateOptionsMenu(menu, inflater)\n\n        activity.supportActionBar?.setDisplayShowTitleEnabled(true)\n        activity.supportActionBar?.setTitle(R.string.fragment_feed_title)\n        activity.supportActionBar?.subtitle = groupName\n\n        inflater.inflate(R.menu.menu_feed_fragment, menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (item.itemId == R.id.menu_item_feed_help) {\n            val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())\n\n            val usingDedicatedMethod = sharedPreferences\n                .getBoolean(getString(R.string.feed_use_dedicated_fetch_method_key), false)\n            val enableDisableButtonText = when {\n                usingDedicatedMethod -> R.string.feed_use_dedicated_fetch_method_disable_button\n                else -> R.string.feed_use_dedicated_fetch_method_enable_button\n            }\n\n            AlertDialog.Builder(requireContext())\n                .setMessage(R.string.feed_use_dedicated_fetch_method_help_text)\n                .setNeutralButton(enableDisableButtonText) { _, _ ->\n                    sharedPreferences.edit {\n                        putBoolean(getString(R.string.feed_use_dedicated_fetch_method_key), !usingDedicatedMethod)\n                    }\n                }\n                .setPositiveButton(resources.getString(R.string.ok), null)\n                .show()\n            return true\n        } else if (item.itemId == R.id.menu_item_feed_toggle_played_items) {\n            showStreamVisibilityDialog()\n        }\n\n        return super.onOptionsItemSelected(item)\n    }\n\n    private fun showStreamVisibilityDialog() {\n        val dialogItems = arrayOf(\n            getString(R.string.feed_show_watched),\n            getString(R.string.feed_show_partially_watched),\n            getString(R.string.feed_show_upcoming)\n        )\n\n        val checkedDialogItems = booleanArrayOf(\n            viewModel.getShowPlayedItemsFromPreferences(),\n            viewModel.getShowPartiallyPlayedItemsFromPreferences(),\n            viewModel.getShowFutureItemsFromPreferences()\n        )\n\n        AlertDialog.Builder(requireContext())\n            .setTitle(R.string.feed_hide_streams_title)\n            .setMultiChoiceItems(dialogItems, checkedDialogItems) { _, which, isChecked ->\n                checkedDialogItems[which] = isChecked\n            }\n            .setPositiveButton(R.string.ok) { _, _ ->\n                viewModel.setSaveShowPlayedItems(checkedDialogItems[0])\n                viewModel.setSaveShowPartiallyPlayedItems(checkedDialogItems[1])\n                viewModel.setSaveShowFutureItems(checkedDialogItems[2])\n            }\n            .setNegativeButton(R.string.cancel, null)\n            .show()\n    }\n\n    override fun onDestroyOptionsMenu() {\n        super.onDestroyOptionsMenu()\n        if (\n            (groupName != \"\") &&\n            (activity?.supportActionBar?.subtitle == groupName)\n        ) {\n            activity?.supportActionBar?.subtitle = null\n        }\n    }\n\n    override fun onDestroy() {\n        disposables.dispose()\n        if (onSettingsChangeListener != null) {\n            PreferenceManager.getDefaultSharedPreferences(activity)\n                .unregisterOnSharedPreferenceChangeListener(onSettingsChangeListener)\n            onSettingsChangeListener = null\n        }\n\n        super.onDestroy()\n\n        if (\n            (groupName != \"\") &&\n            (activity?.supportActionBar?.subtitle == groupName)\n        ) {\n            activity?.supportActionBar?.subtitle = null\n        }\n    }\n\n    override fun onDestroyView() {\n        // Ensure that all animations are canceled\n        tryGetNewItemsLoadedButton()?.clearAnimation()\n\n        feedBinding.itemsList.adapter = null\n        _feedBinding = null\n        super.onDestroyView()\n    }\n\n    // //////////////////////////////////////////////////////////////////////////\n    // Handling\n    // //////////////////////////////////////////////////////////////////////////\n\n    override fun showLoading() {\n        super.showLoading()\n        feedBinding.itemsList.animateHideRecyclerViewAllowingScrolling()\n        feedBinding.refreshRootView.animate(false, 0)\n        feedBinding.loadingProgressText.animate(true, 200)\n        feedBinding.swipeRefreshLayout.isRefreshing = true\n        isRefreshing = true\n    }\n\n    override fun hideLoading() {\n        super.hideLoading()\n        feedBinding.itemsList.animate(true, 0)\n        feedBinding.refreshRootView.animate(true, 200)\n        feedBinding.loadingProgressText.animate(false, 0)\n        feedBinding.swipeRefreshLayout.isRefreshing = false\n        isRefreshing = false\n    }\n\n    override fun showEmptyState() {\n        super.showEmptyState()\n        feedBinding.itemsList.animateHideRecyclerViewAllowingScrolling()\n        feedBinding.refreshRootView.animate(true, 200)\n        feedBinding.loadingProgressText.animate(false, 0)\n        feedBinding.swipeRefreshLayout.isRefreshing = false\n    }\n\n    override fun handleResult(result: FeedState) {\n        when (result) {\n            is FeedState.ProgressState -> handleProgressState(result)\n            is FeedState.LoadedState -> handleLoadedState(result)\n            is FeedState.ErrorState -> if (handleErrorState(result)) return\n        }\n\n        updateRefreshViewState()\n    }\n\n    override fun handleError() {\n        super.handleError()\n        feedBinding.itemsList.animateHideRecyclerViewAllowingScrolling()\n        feedBinding.refreshRootView.animate(false, 0)\n        feedBinding.loadingProgressText.animate(false, 0)\n        feedBinding.swipeRefreshLayout.isRefreshing = false\n        isRefreshing = false\n    }\n\n    private fun handleProgressState(progressState: FeedState.ProgressState) {\n        showLoading()\n\n        val isIndeterminate = progressState.currentProgress == -1 &&\n            progressState.maxProgress == -1\n\n        feedBinding.loadingProgressText.text = if (!isIndeterminate) {\n            \"${progressState.currentProgress}/${progressState.maxProgress}\"\n        } else if (progressState.progressMessage > 0) {\n            getString(progressState.progressMessage)\n        } else {\n            \"∞/∞\"\n        }\n\n        feedBinding.loadingProgressBar.isIndeterminate = isIndeterminate ||\n            (progressState.maxProgress > 0 && progressState.currentProgress == 0)\n        feedBinding.loadingProgressBar.progress = progressState.currentProgress\n\n        feedBinding.loadingProgressBar.max = progressState.maxProgress\n    }\n\n    private fun showInfoItemDialog(item: StreamInfoItem) {\n        val context = context\n        val activity: Activity? = getActivity()\n        if (context == null || context.resources == null || activity == null) return\n\n        InfoItemDialog.Builder(activity, context, this, item).create().show()\n    }\n\n    private val listenerStreamItem = object : OnItemClickListener, OnItemLongClickListener {\n        override fun onItemClick(item: Item<*>, view: View) {\n            if (item is StreamItem && !isRefreshing) {\n                val stream = item.streamWithState.stream\n                NavigationHelper.openVideoDetailFragment(\n                    requireContext(),\n                    fm,\n                    stream.serviceId,\n                    stream.url,\n                    stream.title,\n                    null,\n                    false\n                )\n            }\n        }\n\n        override fun onItemLongClick(item: Item<*>, view: View): Boolean {\n            if (item is StreamItem && !isRefreshing) {\n                showInfoItemDialog(item.streamWithState.stream.toStreamInfoItem())\n                return true\n            }\n            return false\n        }\n    }\n\n    @SuppressLint(\"StringFormatMatches\")\n    private fun handleLoadedState(loadedState: FeedState.LoadedState) {\n        val itemVersion = when (getItemViewMode(requireContext())) {\n            ItemViewMode.GRID -> StreamItem.ItemVersion.GRID\n            ItemViewMode.CARD -> StreamItem.ItemVersion.CARD\n            else -> StreamItem.ItemVersion.NORMAL\n        }\n        loadedState.items.forEach { it.itemVersion = itemVersion }\n\n        // This need to be saved in a variable as the update occurs async\n        val oldOldestSubscriptionUpdate = oldestSubscriptionUpdate\n\n        groupAdapter.updateAsync(loadedState.items, false) {\n            oldOldestSubscriptionUpdate?.run {\n                highlightNewItemsAfter(oldOldestSubscriptionUpdate)\n            }\n        }\n\n        listState?.run {\n            feedBinding.itemsList.layoutManager?.onRestoreInstanceState(listState)\n            listState = null\n        }\n\n        val feedsNotLoaded = loadedState.notLoadedCount > 0\n        feedBinding.refreshSubtitleText.isVisible = feedsNotLoaded\n        if (feedsNotLoaded) {\n            feedBinding.refreshSubtitleText.text = getString(\n                R.string.feed_subscription_not_loaded_count,\n                loadedState.notLoadedCount\n            )\n        }\n\n        if (oldestSubscriptionUpdate != loadedState.oldestUpdate ||\n            (oldestSubscriptionUpdate == null && loadedState.oldestUpdate == null)\n        ) {\n            // ignore errors if they have already been handled for the current update\n            handleItemsErrors(loadedState.itemsErrors)\n        }\n        oldestSubscriptionUpdate = loadedState.oldestUpdate\n\n        if (loadedState.items.isEmpty()) {\n            showEmptyState()\n        } else {\n            hideLoading()\n        }\n    }\n\n    private fun handleErrorState(errorState: FeedState.ErrorState): Boolean {\n        return if (errorState.error == null) {\n            hideLoading()\n            false\n        } else {\n            showError(ErrorInfo(errorState.error, UserAction.REQUESTED_FEED, \"Loading feed\"))\n            true\n        }\n    }\n\n    private fun handleItemsErrors(errors: List<Throwable>) {\n        errors.forEachIndexed { i, t ->\n            if (t is FeedLoadService.RequestException &&\n                t.cause is ContentNotAvailableException\n            ) {\n                disposables.add(\n                    Single.fromCallable {\n                        NewPipeDatabase.getInstance(requireContext()).subscriptionDAO()\n                            .getSubscription(t.subscriptionId)\n                    }\n                        .subscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .subscribe(\n                            { subscriptionEntity ->\n                                handleFeedNotAvailable(\n                                    subscriptionEntity,\n                                    t.cause,\n                                    errors.subList(i + 1, errors.size)\n                                )\n                            },\n                            { throwable -> Log.e(TAG, \"Unable to process\", throwable) }\n                        )\n                )\n                // this will be called on the remaining errors by handleFeedNotAvailable()\n                return@handleItemsErrors\n            }\n        }\n\n        if (errors.isNotEmpty()) {\n            // if no error was a ContentNotAvailableException, show a general error snackbar\n            ErrorUtil.showSnackbar(this, ErrorInfo(errors, UserAction.REQUESTED_FEED, \"\"))\n        }\n    }\n\n    private fun handleFeedNotAvailable(\n        subscriptionEntity: SubscriptionEntity,\n        cause: Throwable?,\n        nextItemsErrors: List<Throwable>\n    ) {\n        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())\n        val isFastFeedModeEnabled = sharedPreferences.getBoolean(\n            getString(R.string.feed_use_dedicated_fetch_method_key),\n            false\n        )\n\n        val builder = AlertDialog.Builder(requireContext())\n            .setTitle(R.string.feed_load_error)\n            .setPositiveButton(R.string.unsubscribe) { _, _ ->\n                SubscriptionManager(requireContext())\n                    .deleteSubscription(subscriptionEntity.serviceId, subscriptionEntity.url!!)\n                    .subscribe()\n                handleItemsErrors(nextItemsErrors)\n            }\n            .setNegativeButton(R.string.cancel, null)\n\n        var message = getString(R.string.feed_load_error_account_info, subscriptionEntity.name)\n        if (cause is AccountTerminatedException) {\n            message += \"\\n\" + getString(R.string.feed_load_error_terminated)\n        } else if (cause is ContentNotAvailableException) {\n            if (isFastFeedModeEnabled) {\n                message += \"\\n\" + getString(R.string.feed_load_error_fast_unknown)\n                builder.setNeutralButton(R.string.feed_use_dedicated_fetch_method_disable_button) { _, _ ->\n                    sharedPreferences.edit {\n                        putBoolean(getString(R.string.feed_use_dedicated_fetch_method_key), false)\n                    }\n                }\n            } else if (!isNullOrEmpty(cause.message)) {\n                message += \"\\n\" + cause.message\n            }\n        }\n        builder.setMessage(message)\n            .show()\n    }\n\n    private fun updateRelativeTimeViews() {\n        updateRefreshViewState()\n        groupAdapter.notifyItemRangeChanged(\n            0,\n            groupAdapter.itemCount,\n            StreamItem.UPDATE_RELATIVE_TIME\n        )\n    }\n\n    private fun updateRefreshViewState() {\n        feedBinding.refreshText.text = getString(\n            R.string.feed_oldest_subscription_update,\n            oldestSubscriptionUpdate?.let { Localization.relativeTime(it) } ?: \"—\"\n        )\n    }\n\n    /**\n     * Highlights all items that are after the specified time\n     */\n    private fun highlightNewItemsAfter(updateTime: OffsetDateTime) {\n        var highlightCount = 0\n\n        var doCheck = true\n\n        for (i in 0 until groupAdapter.itemCount) {\n            val item = groupAdapter.getItem(i) as StreamItem\n\n            var typeface = Typeface.DEFAULT\n            var backgroundSupplier = { ctx: Context ->\n                resolveDrawable(ctx, android.R.attr.selectableItemBackground)\n            }\n            if (doCheck) {\n                // If the uploadDate is null or true we should highlight the item\n                if (item.streamWithState.stream.uploadDate?.isAfter(updateTime) != false) {\n                    highlightCount++\n\n                    typeface = Typeface.DEFAULT_BOLD\n                    backgroundSupplier = { ctx: Context ->\n                        // Merge the drawables together. Otherwise we would lose the \"select\" effect\n                        LayerDrawable(\n                            arrayOf(\n                                resolveDrawable(ctx, R.attr.dashed_border),\n                                resolveDrawable(ctx, android.R.attr.selectableItemBackground)\n                            )\n                        )\n                    }\n                } else {\n                    // Decreases execution time due to the order of the items (newest always on top)\n                    // Once a item is is before the updateTime we can skip all following items\n                    doCheck = false\n                }\n            }\n\n            // The highlighter has to be always set\n            // When it's only set on items that are highlighted it will highlight all items\n            // due to the fact that itemRoot is getting recycled\n            item.execBindEnd = Consumer { viewBinding ->\n                val context = viewBinding.itemRoot.context\n                viewBinding.itemRoot.background = backgroundSupplier.invoke(context)\n                viewBinding.itemVideoTitleView.typeface = typeface\n            }\n        }\n\n        // Force updates all items so that the highlighting is correct\n        // If this isn't done visible items that are already highlighted will stay in a highlighted\n        // state until the user scrolls them out of the visible area which causes a update/bind-call\n        groupAdapter.notifyItemRangeChanged(\n            0,\n            highlightCount.coerceIn(lastNewItemsCount, groupAdapter.itemCount)\n        )\n\n        if (highlightCount > 0) {\n            showNewItemsLoaded()\n        }\n\n        lastNewItemsCount = highlightCount\n    }\n\n    private fun showNewItemsLoaded() {\n        tryGetNewItemsLoadedButton()?.clearAnimation()\n        tryGetNewItemsLoadedButton()\n            ?.slideUp(\n                250L,\n                delay = 100,\n                execOnEnd = {\n                    // Disabled animations would result in immediately hiding the button\n                    // after it showed up\n                    // Context can be null in some cases, so we have to make sure it is not null in\n                    // order to avoid a NullPointerException\n                    context?.let {\n                        if (DeviceUtils.hasAnimationsAnimatorDurationEnabled(it)) {\n                            // Hide the new items button after 10s\n                            hideNewItemsLoaded(true, 10000)\n                        }\n                    }\n                }\n            )\n    }\n\n    private fun hideNewItemsLoaded(animate: Boolean, delay: Long = 0) {\n        tryGetNewItemsLoadedButton()?.clearAnimation()\n        if (animate) {\n            tryGetNewItemsLoadedButton()?.animate(\n                false,\n                200,\n                delay = delay,\n                execOnEnd = {\n                    // Make the layout invisible so that the onScroll toTop method\n                    // only does necessary work\n                    tryGetNewItemsLoadedButton()?.isVisible = false\n                }\n            )\n        } else {\n            tryGetNewItemsLoadedButton()?.isVisible = false\n        }\n    }\n\n    /**\n     * The view/button can be disposed/set to null under certain circumstances.\n     * E.g. when the animation is still in progress but the view got destroyed.\n     * This method is a helper for such states and can be used in affected code blocks.\n     */\n    private fun tryGetNewItemsLoadedButton(): Button? {\n        return _feedBinding?.newItemsLoadedButton\n    }\n\n    // /////////////////////////////////////////////////////////////////////////\n    // Load Service Handling\n    // /////////////////////////////////////////////////////////////////////////\n\n    override fun doInitialLoadLogic() {}\n\n    override fun reloadContent() {\n        hideNewItemsLoaded(false)\n\n        getActivity()?.startService(\n            Intent(requireContext(), FeedLoadService::class.java).apply {\n                putExtra(FeedLoadService.EXTRA_GROUP_ID, groupId)\n            }\n        )\n        listState = null\n    }\n\n    companion object {\n        const val KEY_GROUP_ID = \"ARG_GROUP_ID\"\n        const val KEY_GROUP_NAME = \"ARG_GROUP_NAME\"\n\n        @JvmStatic\n        fun newInstance(groupId: Long = FeedGroupEntity.GROUP_ALL_ID, groupName: String? = null): FeedFragment {\n            val feedFragment = FeedFragment()\n            feedFragment.arguments = bundleOf(KEY_GROUP_ID to groupId, KEY_GROUP_NAME to groupName)\n            return feedFragment\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/FeedState.kt",
    "content": "package org.schabi.newpipe.local.feed\n\nimport androidx.annotation.StringRes\nimport java.time.OffsetDateTime\nimport org.schabi.newpipe.local.feed.item.StreamItem\n\nsealed class FeedState {\n    data class ProgressState(\n        val currentProgress: Int = -1,\n        val maxProgress: Int = -1,\n        @StringRes val progressMessage: Int = 0\n    ) : FeedState()\n\n    data class LoadedState(\n        val items: List<StreamItem>,\n        val oldestUpdate: OffsetDateTime?,\n        val notLoadedCount: Long,\n        val itemsErrors: List<Throwable>\n    ) : FeedState()\n\n    data class ErrorState(\n        val error: Throwable? = null\n    ) : FeedState()\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/FeedViewModel.kt",
    "content": "package org.schabi.newpipe.local.feed\n\nimport android.app.Application\nimport android.content.Context\nimport androidx.core.content.edit\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewmodel.initializer\nimport androidx.lifecycle.viewmodel.viewModelFactory\nimport androidx.preference.PreferenceManager\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.functions.Function6\nimport io.reactivex.rxjava3.processors.BehaviorProcessor\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport java.time.OffsetDateTime\nimport java.util.concurrent.TimeUnit\nimport org.schabi.newpipe.App\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.database.stream.StreamWithState\nimport org.schabi.newpipe.local.feed.item.StreamItem\nimport org.schabi.newpipe.local.feed.service.FeedEventManager\nimport org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ErrorResultEvent\nimport org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent\nimport org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ProgressEvent\nimport org.schabi.newpipe.local.feed.service.FeedEventManager.Event.SuccessResultEvent\nimport org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT\n\nclass FeedViewModel(\n    private val application: Application,\n    groupId: Long = FeedGroupEntity.GROUP_ALL_ID,\n    initialShowPlayedItems: Boolean,\n    initialShowPartiallyPlayedItems: Boolean,\n    initialShowFutureItems: Boolean\n) : ViewModel() {\n    private val feedDatabaseManager = FeedDatabaseManager(application)\n\n    private val showPlayedItems = BehaviorProcessor.create<Boolean>()\n    private val showPlayedItemsFlowable = showPlayedItems\n        .startWithItem(initialShowPlayedItems)\n        .distinctUntilChanged()\n\n    private val showPartiallyPlayedItems = BehaviorProcessor.create<Boolean>()\n    private val showPartiallyPlayedItemsFlowable = showPartiallyPlayedItems\n        .startWithItem(initialShowPartiallyPlayedItems)\n        .distinctUntilChanged()\n\n    private val showFutureItems = BehaviorProcessor.create<Boolean>()\n    private val showFutureItemsFlowable = showFutureItems\n        .startWithItem(initialShowFutureItems)\n        .distinctUntilChanged()\n\n    private val mutableStateLiveData = MutableLiveData<FeedState>()\n    val stateLiveData: LiveData<FeedState> = mutableStateLiveData\n\n    private var combineDisposable = Flowable\n        .combineLatest(\n            FeedEventManager.events(),\n            showPlayedItemsFlowable,\n            showPartiallyPlayedItemsFlowable,\n            showFutureItemsFlowable,\n            feedDatabaseManager.notLoadedCount(groupId),\n            feedDatabaseManager.oldestSubscriptionUpdate(groupId),\n\n            Function6 {\n                    t1: FeedEventManager.Event,\n                    t2: Boolean,\n                    t3: Boolean,\n                    t4: Boolean,\n                    t5: Long,\n                    t6: List<OffsetDateTime?>\n                ->\n                return@Function6 CombineResultEventHolder(t1, t2, t3, t4, t5, t6.firstOrNull())\n            }\n        )\n        .throttleLatest(DEFAULT_THROTTLE_TIMEOUT, TimeUnit.MILLISECONDS)\n        .subscribeOn(Schedulers.io())\n        .observeOn(Schedulers.io())\n        .map { (event, showPlayedItems, showPartiallyPlayedItems, showFutureItems, notLoadedCount, oldestUpdate) ->\n            val streamItems = if (event is SuccessResultEvent || event is IdleEvent) {\n                feedDatabaseManager\n                    .getStreams(groupId, showPlayedItems, showPartiallyPlayedItems, showFutureItems)\n                    .blockingGet(arrayListOf())\n            } else {\n                arrayListOf()\n            }\n\n            CombineResultDataHolder(event, streamItems, notLoadedCount, oldestUpdate)\n        }\n        .observeOn(AndroidSchedulers.mainThread())\n        .subscribe { (event, listFromDB, notLoadedCount, oldestUpdate) ->\n            mutableStateLiveData.postValue(\n                when (event) {\n                    is IdleEvent -> FeedState.LoadedState(listFromDB.map { e -> StreamItem(e) }, oldestUpdate, notLoadedCount, listOf())\n                    is ProgressEvent -> FeedState.ProgressState(event.currentProgress, event.maxProgress, event.progressMessage)\n                    is SuccessResultEvent -> FeedState.LoadedState(listFromDB.map { e -> StreamItem(e) }, oldestUpdate, notLoadedCount, event.itemsErrors)\n                    is ErrorResultEvent -> FeedState.ErrorState(event.error)\n                }\n            )\n\n            if (event is ErrorResultEvent || event is SuccessResultEvent) {\n                FeedEventManager.reset()\n            }\n        }\n\n    override fun onCleared() {\n        super.onCleared()\n        combineDisposable.dispose()\n    }\n\n    private data class CombineResultEventHolder(\n        val t1: FeedEventManager.Event,\n        val t2: Boolean,\n        val t3: Boolean,\n        val t4: Boolean,\n        val t5: Long,\n        val t6: OffsetDateTime?\n    )\n\n    private data class CombineResultDataHolder(\n        val t1: FeedEventManager.Event,\n        val t2: List<StreamWithState>,\n        val t3: Long,\n        val t4: OffsetDateTime?\n    )\n\n    fun setSaveShowPlayedItems(showPlayedItems: Boolean) {\n        this.showPlayedItems.onNext(showPlayedItems)\n        PreferenceManager.getDefaultSharedPreferences(application).edit {\n            putBoolean(application.getString(R.string.feed_show_watched_items_key), showPlayedItems)\n        }\n    }\n\n    fun getShowPlayedItemsFromPreferences() = getShowPlayedItemsFromPreferences(application)\n\n    fun setSaveShowPartiallyPlayedItems(showPartiallyPlayedItems: Boolean) {\n        this.showPartiallyPlayedItems.onNext(showPartiallyPlayedItems)\n        PreferenceManager.getDefaultSharedPreferences(application).edit {\n            putBoolean(application.getString(R.string.feed_show_partially_watched_items_key), showPartiallyPlayedItems)\n        }\n    }\n\n    fun getShowPartiallyPlayedItemsFromPreferences() = getShowPartiallyPlayedItemsFromPreferences(application)\n\n    fun setSaveShowFutureItems(showFutureItems: Boolean) {\n        this.showFutureItems.onNext(showFutureItems)\n        PreferenceManager.getDefaultSharedPreferences(application).edit {\n            putBoolean(application.getString(R.string.feed_show_future_items_key), showFutureItems)\n        }\n    }\n\n    fun getShowFutureItemsFromPreferences() = getShowFutureItemsFromPreferences(application)\n\n    companion object {\n        private fun getShowPlayedItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context)\n            .getBoolean(context.getString(R.string.feed_show_watched_items_key), true)\n\n        private fun getShowPartiallyPlayedItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context)\n            .getBoolean(context.getString(R.string.feed_show_partially_watched_items_key), true)\n\n        private fun getShowFutureItemsFromPreferences(context: Context) = PreferenceManager.getDefaultSharedPreferences(context)\n            .getBoolean(context.getString(R.string.feed_show_future_items_key), true)\n\n        fun getFactory(context: Context, groupId: Long) = viewModelFactory {\n            initializer {\n                FeedViewModel(\n                    App.instance,\n                    groupId,\n                    // Read initial value from preferences\n                    getShowPlayedItemsFromPreferences(context.applicationContext),\n                    getShowPartiallyPlayedItemsFromPreferences(context.applicationContext),\n                    getShowFutureItemsFromPreferences(context.applicationContext)\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/item/StreamItem.kt",
    "content": "package org.schabi.newpipe.local.feed.item\n\nimport android.content.Context\nimport android.text.TextUtils\nimport android.view.View\nimport androidx.core.content.ContextCompat\nimport androidx.preference.PreferenceManager\nimport com.xwray.groupie.viewbinding.BindableItem\nimport java.util.concurrent.TimeUnit\nimport java.util.function.Consumer\nimport org.schabi.newpipe.MainActivity\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.stream.StreamWithState\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.databinding.ListStreamItemBinding\nimport org.schabi.newpipe.extractor.stream.StreamType.AUDIO_LIVE_STREAM\nimport org.schabi.newpipe.extractor.stream.StreamType.AUDIO_STREAM\nimport org.schabi.newpipe.extractor.stream.StreamType.LIVE_STREAM\nimport org.schabi.newpipe.extractor.stream.StreamType.POST_LIVE_AUDIO_STREAM\nimport org.schabi.newpipe.extractor.stream.StreamType.POST_LIVE_STREAM\nimport org.schabi.newpipe.extractor.stream.StreamType.VIDEO_STREAM\nimport org.schabi.newpipe.util.Localization\nimport org.schabi.newpipe.util.StreamTypeUtil\nimport org.schabi.newpipe.util.image.CoilHelper\n\ndata class StreamItem(\n    val streamWithState: StreamWithState,\n    var itemVersion: ItemVersion = ItemVersion.NORMAL\n) : BindableItem<ListStreamItemBinding>() {\n    companion object {\n        const val UPDATE_RELATIVE_TIME = 1\n    }\n\n    private val stream: StreamEntity = streamWithState.stream\n    private val stateProgressTime: Long? = streamWithState.stateProgressMillis\n\n    /**\n     * Will be executed at the end of the [StreamItem.bind] (with (ListStreamItemBinding,Int)).\n     * Can be used e.g. for highlighting a item.\n     */\n    var execBindEnd: Consumer<ListStreamItemBinding>? = null\n\n    override fun getId(): Long = stream.uid\n\n    enum class ItemVersion { NORMAL, MINI, GRID, CARD }\n\n    override fun getLayout(): Int = when (itemVersion) {\n        ItemVersion.NORMAL -> R.layout.list_stream_item\n        ItemVersion.MINI -> R.layout.list_stream_mini_item\n        ItemVersion.GRID -> R.layout.list_stream_grid_item\n        ItemVersion.CARD -> R.layout.list_stream_card_item\n    }\n\n    override fun initializeViewBinding(view: View) = ListStreamItemBinding.bind(view)\n\n    override fun bind(viewBinding: ListStreamItemBinding, position: Int, payloads: MutableList<Any>) {\n        if (payloads.contains(UPDATE_RELATIVE_TIME)) {\n            if (itemVersion != ItemVersion.MINI) {\n                viewBinding.itemAdditionalDetails.text =\n                    getStreamInfoDetailLine(viewBinding.itemAdditionalDetails.context)\n            }\n            return\n        }\n\n        super.bind(viewBinding, position, payloads)\n    }\n\n    override fun bind(viewBinding: ListStreamItemBinding, position: Int) {\n        viewBinding.itemVideoTitleView.text = stream.title\n        viewBinding.itemUploaderView.text = stream.uploader\n\n        if (stream.duration > 0) {\n            viewBinding.itemDurationView.text = Localization.getDurationString(stream.duration)\n            viewBinding.itemDurationView.setBackgroundColor(\n                ContextCompat.getColor(\n                    viewBinding.itemDurationView.context,\n                    R.color.duration_background_color\n                )\n            )\n            viewBinding.itemDurationView.visibility = View.VISIBLE\n\n            if (stateProgressTime != null) {\n                viewBinding.itemProgressView.visibility = View.VISIBLE\n                viewBinding.itemProgressView.max = stream.duration.toInt()\n                viewBinding.itemProgressView.progress = TimeUnit.MILLISECONDS.toSeconds(stateProgressTime).toInt()\n            } else {\n                viewBinding.itemProgressView.visibility = View.GONE\n            }\n        } else if (StreamTypeUtil.isLiveStream(stream.streamType)) {\n            viewBinding.itemDurationView.setText(R.string.duration_live)\n            viewBinding.itemDurationView.setBackgroundColor(\n                ContextCompat.getColor(\n                    viewBinding.itemDurationView.context,\n                    R.color.live_duration_background_color\n                )\n            )\n            viewBinding.itemDurationView.visibility = View.VISIBLE\n            viewBinding.itemProgressView.visibility = View.GONE\n        } else {\n            viewBinding.itemDurationView.visibility = View.GONE\n            viewBinding.itemProgressView.visibility = View.GONE\n        }\n\n        CoilHelper.loadThumbnail(viewBinding.itemThumbnailView, stream.thumbnailUrl)\n\n        if (itemVersion != ItemVersion.MINI) {\n            viewBinding.itemAdditionalDetails.text =\n                getStreamInfoDetailLine(viewBinding.itemAdditionalDetails.context)\n        }\n\n        execBindEnd?.accept(viewBinding)\n    }\n\n    override fun isLongClickable() = when (stream.streamType) {\n        AUDIO_STREAM, VIDEO_STREAM, LIVE_STREAM, AUDIO_LIVE_STREAM, POST_LIVE_STREAM, POST_LIVE_AUDIO_STREAM -> true\n        else -> false\n    }\n\n    private fun getStreamInfoDetailLine(context: Context): String {\n        var viewsAndDate = \"\"\n        val viewCount = stream.viewCount\n        if (viewCount != null && viewCount >= 0) {\n            viewsAndDate = when (stream.streamType) {\n                AUDIO_LIVE_STREAM -> Localization.listeningCount(context, viewCount)\n                LIVE_STREAM -> Localization.shortWatchingCount(context, viewCount)\n                else -> Localization.shortViewCount(context, viewCount)\n            }\n        }\n        val uploadDate = getFormattedRelativeUploadDate(context)\n        return when {\n            !TextUtils.isEmpty(uploadDate) -> when {\n                viewsAndDate.isEmpty() -> uploadDate!!\n                else -> Localization.concatenateStrings(viewsAndDate, uploadDate)\n            }\n\n            else -> viewsAndDate\n        }\n    }\n\n    private fun getFormattedRelativeUploadDate(context: Context): String? {\n        val uploadDate = stream.uploadDate\n        return if (uploadDate != null) {\n            var formattedRelativeTime = Localization.relativeTime(uploadDate)\n\n            if (MainActivity.DEBUG) {\n                val key = context.getString(R.string.show_original_time_ago_key)\n                if (PreferenceManager.getDefaultSharedPreferences(context).getBoolean(key, false)) {\n                    formattedRelativeTime += \" (\" + stream.textualUploadDate + \")\"\n                }\n            }\n\n            formattedRelativeTime\n        } else {\n            stream.textualUploadDate\n        }\n    }\n\n    override fun getSpanSize(spanCount: Int, position: Int): Int {\n        return if (itemVersion == ItemVersion.GRID) 1 else spanCount\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationHelper.kt",
    "content": "package org.schabi.newpipe.local.feed.notifications\n\nimport android.app.Notification\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.Bitmap\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.Settings\nimport androidx.core.app.NotificationCompat\nimport androidx.core.app.NotificationManagerCompat\nimport androidx.core.app.PendingIntentCompat\nimport androidx.core.content.ContextCompat\nimport androidx.core.content.getSystemService\nimport androidx.core.net.toUri\nimport androidx.preference.PreferenceManager\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.local.feed.service.FeedUpdateInfo\nimport org.schabi.newpipe.util.NavigationHelper\nimport org.schabi.newpipe.util.image.CoilHelper\n\n/**\n * Helper for everything related to show notifications about new streams to the user.\n */\nclass NotificationHelper(val context: Context) {\n    private val manager = NotificationManagerCompat.from(context)\n\n    /**\n     * Show notifications for new streams from a single channel. The individual notifications are\n     * expandable on Android 7.0 and later.\n     *\n     * Opening the summary notification will open the corresponding channel page. Opening the\n     * individual notifications will open the corresponding video.\n     */\n    fun displayNewStreamsNotifications(data: FeedUpdateInfo) {\n        val newStreams = data.newStreams\n        val summary = context.resources.getQuantityString(\n            R.plurals.new_streams,\n            newStreams.size,\n            newStreams.size\n        )\n        val summaryBuilder = NotificationCompat.Builder(\n            context,\n            context.getString(R.string.streams_notification_channel_id)\n        )\n            .setContentTitle(data.name)\n            .setContentText(summary)\n            .setNumber(newStreams.size)\n            .setBadgeIconType(NotificationCompat.BADGE_ICON_LARGE)\n            .setPriority(NotificationCompat.PRIORITY_DEFAULT)\n            .setSmallIcon(R.drawable.ic_newpipe_triangle_white)\n            .setColor(ContextCompat.getColor(context, R.color.ic_launcher_background))\n            .setColorized(true)\n            .setAutoCancel(true)\n            .setCategory(NotificationCompat.CATEGORY_SOCIAL)\n            .setGroupSummary(true)\n            .setGroup(data.url)\n            .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY)\n\n        // Build a summary notification for Android versions < 7.0\n        val style = NotificationCompat.InboxStyle()\n            .setBigContentTitle(data.name)\n        newStreams.forEach { style.addLine(it.name) }\n        summaryBuilder.setStyle(style)\n\n        // open the channel page when clicking on the summary notification\n        val intent = NavigationHelper\n            .getChannelIntent(context, data.serviceId, data.url)\n            .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n        summaryBuilder.setContentIntent(\n            PendingIntentCompat.getActivity(context, data.pseudoId, intent, 0, false)\n        )\n\n        val avatarIcon =\n            CoilHelper.loadBitmapBlocking(context, data.avatarUrl, R.drawable.ic_newpipe_triangle_white)\n        summaryBuilder.setLargeIcon(avatarIcon)\n\n        // Show individual stream notifications, set channel icon only if there is actually one\n        showStreamNotifications(newStreams, data.serviceId, avatarIcon)\n        // Show summary notification\n        if (manager.areNotificationsEnabled()) {\n            manager.notify(data.pseudoId, summaryBuilder.build())\n        }\n    }\n\n    private fun showStreamNotifications(\n        newStreams: List<StreamInfoItem>,\n        serviceId: Int,\n        channelIcon: Bitmap?\n    ) {\n        if (manager.areNotificationsEnabled()) {\n            newStreams.forEach { stream ->\n                val notification =\n                    createStreamNotification(stream, serviceId, channelIcon)\n                manager.notify(stream.url.hashCode(), notification)\n            }\n        }\n    }\n\n    private fun createStreamNotification(\n        item: StreamInfoItem,\n        serviceId: Int,\n        channelIcon: Bitmap?\n    ): Notification {\n        return NotificationCompat.Builder(\n            context,\n            context.getString(R.string.streams_notification_channel_id)\n        )\n            .setSmallIcon(R.drawable.ic_newpipe_triangle_white)\n            .setLargeIcon(channelIcon)\n            .setContentTitle(item.name)\n            .setContentText(item.uploaderName)\n            .setGroup(item.uploaderUrl)\n            .setColor(ContextCompat.getColor(context, R.color.ic_launcher_background))\n            .setColorized(true)\n            .setAutoCancel(true)\n            .setCategory(NotificationCompat.CATEGORY_SOCIAL)\n            .setContentIntent(\n                // Open the stream link in the player when clicking on the notification.\n                PendingIntentCompat.getActivity(\n                    context,\n                    item.url.hashCode(),\n                    NavigationHelper.getStreamIntent(context, serviceId, item.url, item.name),\n                    PendingIntent.FLAG_UPDATE_CURRENT,\n                    false\n                )\n            )\n            .setSilent(true) // Avoid creating noise for individual stream notifications.\n            .build()\n    }\n\n    companion object {\n        /**\n         * Check whether notifications are enabled on the device.\n         * Users can disable them via the system settings for a single app.\n         * If this is the case, the app cannot create any notifications\n         * and display them to the user.\n         * <br>\n         * On Android 26 and above, notification channels are used by NewPipe.\n         * These can be configured by the user, too.\n         * The notification channel for new streams is also checked by this method.\n         *\n         * @param context Context\n         * @return <code>true</code> if notifications are allowed and can be displayed;\n         * <code>false</code> otherwise\n         */\n        fun areNotificationsEnabledOnDevice(context: Context): Boolean {\n            return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n                val channelId = context.getString(R.string.streams_notification_channel_id)\n                val manager = context.getSystemService<NotificationManager>()!!\n                val enabled = manager.areNotificationsEnabled()\n                val channel = manager.getNotificationChannel(channelId)\n                enabled && channel?.importance != NotificationManager.IMPORTANCE_NONE\n            } else {\n                NotificationManagerCompat.from(context).areNotificationsEnabled()\n            }\n        }\n\n        /**\n         * Whether the user enabled the notifications for new streams in the app settings.\n         */\n        @JvmStatic\n        fun areNewStreamsNotificationsEnabled(context: Context): Boolean {\n            return (\n                PreferenceManager.getDefaultSharedPreferences(context)\n                    .getBoolean(context.getString(R.string.enable_streams_notifications), false) &&\n                    areNotificationsEnabledOnDevice(context)\n                )\n        }\n\n        /**\n         * Open the system's notification settings for NewPipe on Android Oreo (API 26) and later.\n         * Open the system's app settings for NewPipe on previous Android versions.\n         */\n        fun openNewPipeSystemNotificationSettings(context: Context) {\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n                val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)\n                    .putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName)\n                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n                context.startActivity(intent)\n            } else {\n                val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)\n                intent.data = \"package:${context.packageName}\".toUri()\n                context.startActivity(intent)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/notifications/NotificationWorker.kt",
    "content": "package org.schabi.newpipe.local.feed.notifications\n\nimport android.content.Context\nimport android.content.pm.ServiceInfo\nimport android.os.Build\nimport android.util.Log\nimport androidx.core.app.NotificationCompat\nimport androidx.work.Constraints\nimport androidx.work.ExistingPeriodicWorkPolicy\nimport androidx.work.ForegroundInfo\nimport androidx.work.NetworkType\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.PeriodicWorkRequest\nimport androidx.work.WorkManager\nimport androidx.work.WorkerParameters\nimport androidx.work.rxjava3.RxWorker\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.core.Single\nimport java.util.concurrent.TimeUnit\nimport org.schabi.newpipe.App\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.error.ErrorInfo\nimport org.schabi.newpipe.error.ErrorUtil\nimport org.schabi.newpipe.error.UserAction\nimport org.schabi.newpipe.local.feed.service.FeedLoadManager\nimport org.schabi.newpipe.local.feed.service.FeedLoadService\n\n/*\n * Worker which checks for new streams of subscribed channels\n * in intervals which can be set by the user in the settings.\n */\nclass NotificationWorker(\n    appContext: Context,\n    workerParams: WorkerParameters\n) : RxWorker(appContext, workerParams) {\n\n    private val notificationHelper by lazy {\n        NotificationHelper(appContext)\n    }\n    private val feedLoadManager = FeedLoadManager(appContext)\n\n    override fun createWork(): Single<Result> = if (areNotificationsEnabled(applicationContext)) {\n        feedLoadManager.startLoading(\n            ignoreOutdatedThreshold = true,\n            groupId = FeedLoadManager.GROUP_NOTIFICATION_ENABLED\n        )\n            .doOnSubscribe { showLoadingFeedForegroundNotification() }\n            .map { feed ->\n                // filter out feedUpdateInfo items (i.e. channels) with nothing new\n                feed.mapNotNull {\n                    it.value?.takeIf { feedUpdateInfo ->\n                        feedUpdateInfo.newStreams.isNotEmpty()\n                    }\n                }\n            }\n            .observeOn(AndroidSchedulers.mainThread()) // Picasso requires calls from main thread\n            .map { feedUpdateInfoList ->\n                // display notifications for each feedUpdateInfo (i.e. channel)\n                feedUpdateInfoList.forEach { feedUpdateInfo ->\n                    notificationHelper.displayNewStreamsNotifications(feedUpdateInfo)\n                }\n                return@map Result.success()\n            }\n            .doOnError { throwable ->\n                Log.e(TAG, \"Error while displaying streams notifications\", throwable)\n                ErrorUtil.createNotification(\n                    applicationContext,\n                    ErrorInfo(throwable, UserAction.NEW_STREAMS_NOTIFICATIONS, \"main worker\")\n                )\n            }\n            .onErrorReturnItem(Result.failure())\n    } else {\n        // the user can disable streams notifications in the device's app settings\n        Single.just(Result.success())\n    }\n\n    private fun showLoadingFeedForegroundNotification() {\n        val notification = NotificationCompat.Builder(\n            applicationContext,\n            applicationContext.getString(R.string.notification_channel_id)\n        ).setOngoing(true)\n            .setProgress(-1, -1, true)\n            .setSmallIcon(R.drawable.ic_newpipe_triangle_white)\n            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n            .setPriority(NotificationCompat.PRIORITY_LOW)\n            .setContentTitle(applicationContext.getString(R.string.feed_notification_loading))\n            .build()\n        // ServiceInfo constants are not used below Android Q, so 0 is set here\n        val serviceType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC else 0\n        setForegroundAsync(ForegroundInfo(FeedLoadService.NOTIFICATION_ID, notification, serviceType))\n    }\n\n    companion object {\n\n        private val TAG = NotificationWorker::class.java.simpleName\n        private const val WORK_TAG = App.PACKAGE_NAME + \"_streams_notifications\"\n\n        private fun areNotificationsEnabled(context: Context) = NotificationHelper.areNewStreamsNotificationsEnabled(context) &&\n            NotificationHelper.areNotificationsEnabledOnDevice(context)\n\n        /**\n         * Schedules a task for the [NotificationWorker]\n         * if the (device and in-app) notifications are enabled,\n         * otherwise [cancel]s all scheduled tasks.\n         */\n        @JvmStatic\n        fun initialize(context: Context) {\n            if (areNotificationsEnabled(context)) {\n                schedule(context)\n            } else {\n                cancel(context)\n            }\n        }\n\n        /**\n         * @param context the context to use\n         * @param options configuration options for the scheduler\n         * @param force Force the scheduler to use the new options\n         * by replacing the previously used worker.\n         */\n        fun schedule(context: Context, options: ScheduleOptions, force: Boolean = false) {\n            val constraints = Constraints.Builder()\n                .setRequiredNetworkType(\n                    if (options.isRequireNonMeteredNetwork) {\n                        NetworkType.UNMETERED\n                    } else {\n                        NetworkType.CONNECTED\n                    }\n                ).build()\n\n            val request = PeriodicWorkRequest.Builder(\n                NotificationWorker::class.java,\n                options.interval,\n                TimeUnit.MILLISECONDS\n            ).setConstraints(constraints)\n                .addTag(WORK_TAG)\n                .build()\n\n            WorkManager.getInstance(context)\n                .enqueueUniquePeriodicWork(\n                    WORK_TAG,\n                    if (force) {\n                        ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE\n                    } else {\n                        ExistingPeriodicWorkPolicy.KEEP\n                    },\n                    request\n                )\n        }\n\n        @JvmStatic\n        fun schedule(context: Context) = schedule(context, ScheduleOptions.from(context))\n\n        /**\n         * Check for new streams immediately\n         */\n        @JvmStatic\n        fun runNow(context: Context) {\n            val request = OneTimeWorkRequestBuilder<NotificationWorker>()\n                .addTag(WORK_TAG)\n                .build()\n            WorkManager.getInstance(context).enqueue(request)\n        }\n\n        /**\n         * Cancels all current work related to the [NotificationWorker].\n         */\n        @JvmStatic\n        fun cancel(context: Context) {\n            WorkManager.getInstance(context).cancelAllWorkByTag(WORK_TAG)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/notifications/ScheduleOptions.kt",
    "content": "package org.schabi.newpipe.local.feed.notifications\n\nimport android.content.Context\nimport androidx.preference.PreferenceManager\nimport java.util.concurrent.TimeUnit\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.ktx.getStringSafe\n\n/**\n * Information for the Scheduler which checks for new streams.\n * See [NotificationWorker]\n */\ndata class ScheduleOptions(\n    val interval: Long,\n    val isRequireNonMeteredNetwork: Boolean\n) {\n\n    companion object {\n\n        fun from(context: Context): ScheduleOptions {\n            val preferences = PreferenceManager.getDefaultSharedPreferences(context)\n            return ScheduleOptions(\n                interval = TimeUnit.SECONDS.toMillis(\n                    preferences.getStringSafe(\n                        context.getString(R.string.streams_notifications_interval_key),\n                        context.getString(R.string.streams_notifications_interval_default)\n                    ).toLong()\n                ),\n                isRequireNonMeteredNetwork = preferences.getString(\n                    context.getString(R.string.streams_notifications_network_key),\n                    context.getString(R.string.streams_notifications_network_default)\n                ) == context.getString(R.string.streams_notifications_network_wifi)\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedEventManager.kt",
    "content": "package org.schabi.newpipe.local.feed.service\n\nimport androidx.annotation.StringRes\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.processors.BehaviorProcessor\nimport java.util.concurrent.atomic.AtomicBoolean\nimport org.schabi.newpipe.local.feed.service.FeedEventManager.Event.IdleEvent\n\nobject FeedEventManager {\n    private var processor: BehaviorProcessor<Event> = BehaviorProcessor.create()\n    private var ignoreUpstream = AtomicBoolean()\n    private var eventsFlowable = processor.startWithItem(IdleEvent)\n\n    fun postEvent(event: Event) {\n        processor.onNext(event)\n    }\n\n    fun events(): Flowable<Event> {\n        return eventsFlowable.filter { !ignoreUpstream.get() }\n    }\n\n    fun reset() {\n        ignoreUpstream.set(true)\n        postEvent(IdleEvent)\n        ignoreUpstream.set(false)\n    }\n\n    sealed class Event {\n        data object IdleEvent : Event()\n        data class ProgressEvent(val currentProgress: Int = -1, val maxProgress: Int = -1, @StringRes val progressMessage: Int = 0) : Event() {\n            constructor(@StringRes progressMessage: Int) : this(-1, -1, progressMessage)\n        }\n\n        data class SuccessResultEvent(val itemsErrors: List<Throwable> = emptyList()) : Event()\n        data class ErrorResultEvent(val error: Throwable) : Event()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt",
    "content": "package org.schabi.newpipe.local.feed.service\n\nimport android.content.Context\nimport android.content.SharedPreferences\nimport androidx.preference.PreferenceManager\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.core.Completable\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.core.Notification\nimport io.reactivex.rxjava3.core.Single\nimport io.reactivex.rxjava3.functions.Consumer\nimport io.reactivex.rxjava3.processors.PublishProcessor\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport java.time.OffsetDateTime\nimport java.time.ZoneOffset\nimport java.util.concurrent.atomic.AtomicBoolean\nimport java.util.concurrent.atomic.AtomicInteger\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.database.subscription.NotificationMode\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\nimport org.schabi.newpipe.extractor.Info\nimport org.schabi.newpipe.extractor.NewPipe\nimport org.schabi.newpipe.extractor.ServiceList\nimport org.schabi.newpipe.extractor.feed.FeedInfo\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.ktx.getStringSafe\nimport org.schabi.newpipe.local.feed.FeedDatabaseManager\nimport org.schabi.newpipe.local.subscription.SubscriptionManager\nimport org.schabi.newpipe.util.ChannelTabHelper\nimport org.schabi.newpipe.util.ExtractorHelper.getChannelInfo\nimport org.schabi.newpipe.util.ExtractorHelper.getChannelTab\nimport org.schabi.newpipe.util.ExtractorHelper.getMoreChannelTabItems\n\nclass FeedLoadManager(private val context: Context) {\n\n    private val subscriptionManager = SubscriptionManager(context)\n    private val feedDatabaseManager = FeedDatabaseManager(context)\n\n    private val notificationUpdater = PublishProcessor.create<String>()\n    private val currentProgress = AtomicInteger(-1)\n    private val maxProgress = AtomicInteger(-1)\n    private val cancelSignal = AtomicBoolean()\n    private val feedResultsHolder = FeedResultsHolder()\n\n    val notification: Flowable<FeedLoadState> = notificationUpdater.map { description ->\n        FeedLoadState(description, maxProgress.get(), currentProgress.get())\n    }\n\n    /**\n     * Start checking for new streams of a subscription group.\n     * @param groupId The ID of the subscription group to load. When using\n     * [FeedGroupEntity.GROUP_ALL_ID], all subscriptions are loaded. When using\n     * [GROUP_NOTIFICATION_ENABLED], only subscriptions with enabled notifications for new streams\n     * are loaded. Using an id of a group created by the user results in that specific group to be\n     * loaded.\n     * @param ignoreOutdatedThreshold When `false`, only subscriptions which have not been updated\n     * within the `feed_update_threshold` are checked for updates. This threshold can be set by\n     * the user in the app settings. When `true`, all subscriptions are checked for new streams.\n     */\n    fun startLoading(\n        groupId: Long = FeedGroupEntity.GROUP_ALL_ID,\n        ignoreOutdatedThreshold: Boolean = false\n    ): Single<List<Notification<FeedUpdateInfo>>> {\n        val defaultSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)\n        val useFeedExtractor = defaultSharedPreferences.getBoolean(\n            context.getString(R.string.feed_use_dedicated_fetch_method_key),\n            false\n        )\n\n        val outdatedThreshold = if (ignoreOutdatedThreshold) {\n            OffsetDateTime.now(ZoneOffset.UTC)\n        } else {\n            val thresholdOutdatedSeconds = defaultSharedPreferences.getStringSafe(\n                context.getString(R.string.feed_update_threshold_key),\n                context.getString(R.string.feed_update_threshold_default_value)\n            ).toInt()\n            OffsetDateTime.now(ZoneOffset.UTC).minusSeconds(thresholdOutdatedSeconds.toLong())\n        }\n\n        /**\n         * subscriptions which have not been updated within the feed updated threshold\n         */\n        val outdatedSubscriptions = when (groupId) {\n            FeedGroupEntity.GROUP_ALL_ID -> feedDatabaseManager.outdatedSubscriptions(\n                outdatedThreshold\n            )\n\n            GROUP_NOTIFICATION_ENABLED -> feedDatabaseManager.outdatedSubscriptionsWithNotificationMode(\n                outdatedThreshold,\n                NotificationMode.ENABLED\n            )\n\n            else -> feedDatabaseManager.outdatedSubscriptionsForGroup(groupId, outdatedThreshold)\n        }\n\n        // like `currentProgress`, but counts the number of YouTube extractions that have begun, so\n        // they can be properly throttled every once in a while (see doOnNext below)\n        val youtubeExtractionCount = AtomicInteger()\n\n        return outdatedSubscriptions\n            .take(1)\n            .doOnNext {\n                currentProgress.set(0)\n                maxProgress.set(it.size)\n            }\n            .filter { it.isNotEmpty() }\n            .observeOn(AndroidSchedulers.mainThread())\n            .doOnNext {\n                notificationUpdater.onNext(\"\")\n                broadcastProgress()\n            }\n            .observeOn(Schedulers.io())\n            // Randomize user subscription ordering to attempt to resist fingerprinting\n            .flatMap { Flowable.fromIterable(it.shuffled()) }\n            .takeWhile { !cancelSignal.get() }\n            .doOnNext { subscriptionEntity ->\n                // throttle YouTube extractions once every BATCH_SIZE to avoid being rate limited\n                if (subscriptionEntity.serviceId == ServiceList.YouTube.serviceId) {\n                    val previousCount = youtubeExtractionCount.getAndIncrement()\n                    if (previousCount != 0 && previousCount % BATCH_SIZE == 0) {\n                        Thread.sleep(DELAY_BETWEEN_BATCHES_MILLIS.random())\n                    }\n                }\n            }\n            .parallel(PARALLEL_EXTRACTIONS, PARALLEL_EXTRACTIONS * 2)\n            .runOn(Schedulers.io(), PARALLEL_EXTRACTIONS * 2)\n            .filter { !cancelSignal.get() }\n            .map { subscriptionEntity ->\n                loadStreams(subscriptionEntity, useFeedExtractor, defaultSharedPreferences)\n            }\n            .sequential()\n            .observeOn(AndroidSchedulers.mainThread())\n            .doOnNext(NotificationConsumer())\n            .observeOn(Schedulers.io())\n            .buffer(BUFFER_COUNT_BEFORE_INSERT)\n            .doOnNext(DatabaseConsumer())\n            .subscribeOn(Schedulers.io())\n            .toList()\n            .flatMap { x -> postProcessFeed().toSingleDefault(x.flatten()) }\n    }\n\n    fun cancel() {\n        cancelSignal.set(true)\n    }\n\n    private fun broadcastProgress() {\n        FeedEventManager.postEvent(\n            FeedEventManager.Event.ProgressEvent(\n                currentProgress.get(),\n                maxProgress.get()\n            )\n        )\n    }\n\n    private fun loadStreams(\n        subscriptionEntity: SubscriptionEntity,\n        useFeedExtractor: Boolean,\n        defaultSharedPreferences: SharedPreferences\n    ): Notification<FeedUpdateInfo> {\n        var error: Throwable? = null\n        val storeOriginalErrorAndRethrow = { e: Throwable ->\n            // keep original to prevent blockingGet() from wrapping it into RuntimeException\n            error = e\n            throw e\n        }\n\n        try {\n            // check for and load new streams\n            // either by using the dedicated feed method or by getting the channel info\n            var originalInfo: Info? = null\n            var streams: List<StreamInfoItem>? = null\n            val errors = ArrayList<Throwable>()\n\n            if (useFeedExtractor) {\n                NewPipe.getService(subscriptionEntity.serviceId)\n                    .getFeedExtractor(subscriptionEntity.url)\n                    ?.also { feedExtractor ->\n                        // the user wants to use a feed extractor and there is one, use it\n                        val feedInfo = FeedInfo.getInfo(feedExtractor)\n                        errors.addAll(feedInfo.errors)\n                        originalInfo = feedInfo\n                        streams = feedInfo.relatedItems\n                    }\n            }\n\n            if (originalInfo == null) {\n                // use the normal channel tabs extractor if either the user wants it, or\n                // the current service does not have a dedicated feed extractor\n\n                val channelInfo = getChannelInfo(\n                    subscriptionEntity.serviceId,\n                    subscriptionEntity.url,\n                    true\n                )\n                    .onErrorReturn(storeOriginalErrorAndRethrow)\n                    .blockingGet()\n                errors.addAll(channelInfo.errors)\n                originalInfo = channelInfo\n\n                streams = channelInfo.tabs\n                    .filter { tab ->\n                        ChannelTabHelper.fetchFeedChannelTab(\n                            context,\n                            defaultSharedPreferences,\n                            tab\n                        )\n                    }\n                    .map {\n                        Pair(\n                            getChannelTab(subscriptionEntity.serviceId, it, true)\n                                .onErrorReturn(storeOriginalErrorAndRethrow)\n                                .blockingGet(),\n                            it\n                        )\n                    }\n                    .flatMap { (channelTabInfo, linkHandler) ->\n                        errors.addAll(channelTabInfo.errors)\n                        if (channelTabInfo.relatedItems.isEmpty() &&\n                            channelTabInfo.nextPage != null\n                        ) {\n                            val infoItemsPage = getMoreChannelTabItems(\n                                subscriptionEntity.serviceId,\n                                linkHandler,\n                                channelTabInfo.nextPage\n                            )\n                                .blockingGet()\n\n                            errors.addAll(infoItemsPage.errors)\n                            return@flatMap infoItemsPage.items\n                        } else {\n                            return@flatMap channelTabInfo.relatedItems\n                        }\n                    }\n                    .filterIsInstance<StreamInfoItem>()\n            }\n\n            return Notification.createOnNext(\n                FeedUpdateInfo(\n                    subscriptionEntity,\n                    originalInfo!!,\n                    streams!!,\n                    errors\n                )\n            )\n        } catch (e: Throwable) {\n            val request = \"${subscriptionEntity.serviceId}:${subscriptionEntity.url}\"\n            val wrapper = FeedLoadService.RequestException(\n                subscriptionEntity.uid,\n                request,\n                // do this to prevent blockingGet() from wrapping into RuntimeException\n                error ?: e\n            )\n            return Notification.createOnError(wrapper)\n        }\n    }\n\n    /**\n     * Keep the feed and the stream tables small\n     * to reduce loading times when trying to display the feed.\n     * <br>\n     * Remove streams from the feed which are older than [FeedDatabaseManager.FEED_OLDEST_ALLOWED_DATE].\n     * Remove streams from the database which are not linked / used by any table.\n     */\n    private fun postProcessFeed() = Completable.fromRunnable {\n        FeedEventManager.postEvent(FeedEventManager.Event.ProgressEvent(R.string.feed_processing_message))\n        feedDatabaseManager.removeOrphansOrOlderStreams()\n\n        FeedEventManager.postEvent(FeedEventManager.Event.SuccessResultEvent(feedResultsHolder.itemsErrors))\n    }.doOnSubscribe {\n        currentProgress.set(-1)\n        maxProgress.set(-1)\n\n        notificationUpdater.onNext(context.getString(R.string.feed_processing_message))\n        FeedEventManager.postEvent(FeedEventManager.Event.ProgressEvent(R.string.feed_processing_message))\n    }.subscribeOn(Schedulers.io())\n\n    private inner class NotificationConsumer : Consumer<Notification<FeedUpdateInfo>> {\n        override fun accept(item: Notification<FeedUpdateInfo>) {\n            currentProgress.incrementAndGet()\n            notificationUpdater.onNext(item.value?.name.orEmpty())\n\n            broadcastProgress()\n        }\n    }\n\n    private inner class DatabaseConsumer : Consumer<List<Notification<FeedUpdateInfo>>> {\n\n        override fun accept(list: List<Notification<FeedUpdateInfo>>) {\n            feedDatabaseManager.database().runInTransaction {\n                for (notification in list) {\n                    when {\n                        notification.isOnNext -> {\n                            val info = notification.value!!\n\n                            notification.value!!.newStreams = filterNewStreams(info.streams)\n\n                            feedDatabaseManager.upsertAll(info.uid, info.streams)\n                            subscriptionManager.updateFromInfo(info)\n\n                            if (info.errors.isNotEmpty()) {\n                                feedResultsHolder.addErrors(\n                                    info.errors.map {\n                                        FeedLoadService.RequestException(\n                                            info.uid,\n                                            \"${info.serviceId}:${info.url}\",\n                                            it\n                                        )\n                                    }\n                                )\n                                feedDatabaseManager.markAsOutdated(info.uid)\n                            }\n                        }\n\n                        notification.isOnError -> {\n                            val error = notification.error\n                            feedResultsHolder.addError(error!!)\n\n                            if (error is FeedLoadService.RequestException) {\n                                feedDatabaseManager.markAsOutdated(error.subscriptionId)\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        private fun filterNewStreams(list: List<StreamInfoItem>): List<StreamInfoItem> {\n            return list.filter {\n                !feedDatabaseManager.doesStreamExist(it) &&\n                    it.uploadDate != null &&\n                    // Streams older than this date are automatically removed from the feed.\n                    // Therefore, streams which are not in the database,\n                    // but older than this date, are considered old.\n                    it.uploadDate!!.offsetDateTime().isAfter(\n                        FeedDatabaseManager.FEED_OLDEST_ALLOWED_DATE\n                    )\n            }\n        }\n    }\n\n    companion object {\n\n        /**\n         * Constant used to check for updates of subscriptions with [NotificationMode.ENABLED].\n         */\n        const val GROUP_NOTIFICATION_ENABLED = -2L\n\n        /**\n         * How many extractions will be running in parallel.\n         */\n        private const val PARALLEL_EXTRACTIONS = 3\n\n        /**\n         * How many YouTube extractions to perform before waiting [DELAY_BETWEEN_BATCHES_MILLIS]\n         * to avoid being rate limited\n         */\n        private const val BATCH_SIZE = 50\n\n        /**\n         * Wait a random delay in this range once every [BATCH_SIZE] YouTube extractions to avoid\n         * being rate limited\n         */\n        private val DELAY_BETWEEN_BATCHES_MILLIS = (6000L..12000L)\n\n        /**\n         * Number of items to buffer to mass-insert in the database.\n         */\n        private const val BUFFER_COUNT_BEFORE_INSERT = 20\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadService.kt",
    "content": "/*\n * Copyright 2019 Mauricio Colli <mauriciocolli@outlook.com>\n * FeedLoadService.kt is part of NewPipe\n *\n * License: GPL-3.0+\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\npackage org.schabi.newpipe.local.feed.service\n\nimport android.app.Service\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.IntentFilter\nimport android.os.Build\nimport android.os.IBinder\nimport android.util.Log\nimport androidx.core.app.NotificationCompat\nimport androidx.core.app.NotificationManagerCompat\nimport androidx.core.app.PendingIntentCompat\nimport androidx.core.app.ServiceCompat\nimport androidx.core.content.ContextCompat\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.disposables.Disposable\nimport io.reactivex.rxjava3.functions.Function\nimport java.util.concurrent.TimeUnit\nimport org.schabi.newpipe.App\nimport org.schabi.newpipe.MainActivity.DEBUG\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.local.feed.service.FeedEventManager.Event.ErrorResultEvent\nimport org.schabi.newpipe.local.feed.service.FeedEventManager.postEvent\n\nclass FeedLoadService : Service() {\n    companion object {\n        private val TAG = FeedLoadService::class.java.simpleName\n        const val NOTIFICATION_ID = 7293450\n        private const val ACTION_CANCEL = App.PACKAGE_NAME + \".local.feed.service.FeedLoadService.CANCEL\"\n\n        /**\n         * How often the notification will be updated.\n         */\n        private const val NOTIFICATION_SAMPLING_PERIOD = 1500\n\n        const val EXTRA_GROUP_ID: String = \"FeedLoadService.EXTRA_GROUP_ID\"\n    }\n\n    private var loadingDisposable: Disposable? = null\n    private var notificationDisposable: Disposable? = null\n\n    private lateinit var feedLoadManager: FeedLoadManager\n\n    // /////////////////////////////////////////////////////////////////////////\n    // Lifecycle\n    // /////////////////////////////////////////////////////////////////////////\n\n    override fun onCreate() {\n        super.onCreate()\n        feedLoadManager = FeedLoadManager(this)\n    }\n\n    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {\n        if (DEBUG) {\n            Log.d(\n                TAG,\n                \"onStartCommand() called with: intent = [\" + intent + \"],\" +\n                    \" flags = [\" + flags + \"], startId = [\" + startId + \"]\"\n            )\n        }\n\n        if (intent == null || loadingDisposable != null) {\n            return START_NOT_STICKY\n        }\n\n        setupNotification()\n        setupBroadcastReceiver()\n\n        val groupId = intent.getLongExtra(EXTRA_GROUP_ID, FeedGroupEntity.GROUP_ALL_ID)\n        loadingDisposable = feedLoadManager.startLoading(groupId)\n            .observeOn(AndroidSchedulers.mainThread())\n            .doOnSubscribe {\n                startForeground(NOTIFICATION_ID, notificationBuilder.build())\n            }\n            .subscribe { _, error: Throwable? ->\n                // explicitly mark error as nullable\n                if (error != null) {\n                    Log.e(TAG, \"Error while storing result\", error)\n                    handleError(error)\n                    return@subscribe\n                }\n                stopService()\n            }\n        return START_NOT_STICKY\n    }\n\n    private fun disposeAll() {\n        unregisterReceiver(broadcastReceiver)\n        loadingDisposable?.dispose()\n        notificationDisposable?.dispose()\n    }\n\n    private fun stopService() {\n        disposeAll()\n        ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE)\n        stopSelf()\n    }\n\n    override fun onBind(intent: Intent): IBinder? {\n        return null\n    }\n\n    // /////////////////////////////////////////////////////////////////////////\n    // Loading & Handling\n    // /////////////////////////////////////////////////////////////////////////\n\n    class RequestException(val subscriptionId: Long, message: String, cause: Throwable) : Exception(message, cause)\n\n    // /////////////////////////////////////////////////////////////////////////\n    // Notification\n    // /////////////////////////////////////////////////////////////////////////\n\n    private lateinit var notificationManager: NotificationManagerCompat\n    private lateinit var notificationBuilder: NotificationCompat.Builder\n\n    private fun createNotification(): NotificationCompat.Builder {\n        val cancelActionIntent = PendingIntentCompat\n            .getBroadcast(this, NOTIFICATION_ID, Intent(ACTION_CANCEL), 0, false)\n\n        return NotificationCompat.Builder(this, getString(R.string.notification_channel_id))\n            .setOngoing(true)\n            .setProgress(-1, -1, true)\n            .setSmallIcon(R.drawable.ic_newpipe_triangle_white)\n            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n            .addAction(0, getString(R.string.cancel), cancelActionIntent)\n            .setContentTitle(getString(R.string.feed_notification_loading))\n    }\n\n    private fun setupNotification() {\n        notificationManager = NotificationManagerCompat.from(this)\n        notificationBuilder = createNotification()\n\n        val throttleAfterFirstEmission = Function { flow: Flowable<FeedLoadState> ->\n            flow.take(1).concatWith(flow.skip(1).throttleLatest(NOTIFICATION_SAMPLING_PERIOD.toLong(), TimeUnit.MILLISECONDS))\n        }\n\n        notificationDisposable = feedLoadManager.notification\n            .publish(throttleAfterFirstEmission)\n            .observeOn(AndroidSchedulers.mainThread())\n            .doOnTerminate { notificationManager.cancel(NOTIFICATION_ID) }\n            .subscribe(this::updateNotificationProgress)\n    }\n\n    private fun updateNotificationProgress(state: FeedLoadState) {\n        notificationBuilder.setProgress(state.maxProgress, state.currentProgress, state.maxProgress == -1)\n\n        if (state.maxProgress == -1) {\n            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) notificationBuilder.setContentInfo(null)\n            if (state.updateDescription.isNotEmpty()) notificationBuilder.setContentText(state.updateDescription)\n            notificationBuilder.setContentText(state.updateDescription)\n        } else {\n            val progressText = state.currentProgress.toString() + \"/\" + state.maxProgress\n\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n                if (state.updateDescription.isNotEmpty()) {\n                    notificationBuilder.setContentText(\"${state.updateDescription}  ($progressText)\")\n                }\n            } else {\n                notificationBuilder.setContentInfo(progressText)\n                if (state.updateDescription.isNotEmpty()) {\n                    notificationBuilder.setContentText(state.updateDescription)\n                }\n            }\n        }\n\n        if (notificationManager.areNotificationsEnabled()) {\n            notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build())\n        }\n    }\n\n    // /////////////////////////////////////////////////////////////////////////\n    // Notification Actions\n    // /////////////////////////////////////////////////////////////////////////\n\n    private lateinit var broadcastReceiver: BroadcastReceiver\n\n    private fun setupBroadcastReceiver() {\n        broadcastReceiver = object : BroadcastReceiver() {\n            override fun onReceive(context: Context?, intent: Intent?) {\n                if (intent?.action == ACTION_CANCEL) {\n                    feedLoadManager.cancel()\n                }\n            }\n        }\n        ContextCompat.registerReceiver(this, broadcastReceiver, IntentFilter(ACTION_CANCEL), ContextCompat.RECEIVER_NOT_EXPORTED)\n    }\n\n    // /////////////////////////////////////////////////////////////////////////\n    // Error handling\n    // /////////////////////////////////////////////////////////////////////////\n\n    private fun handleError(error: Throwable) {\n        postEvent(ErrorResultEvent(error))\n        stopService()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadState.kt",
    "content": "package org.schabi.newpipe.local.feed.service\n\ndata class FeedLoadState(\n    val updateDescription: String,\n    val maxProgress: Int,\n    val currentProgress: Int\n)\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedResultsHolder.kt",
    "content": "package org.schabi.newpipe.local.feed.service\n\nclass FeedResultsHolder {\n    /**\n     * List of errors that may have happen during loading.\n     */\n    val itemsErrors: List<Throwable>\n        get() = itemsErrorsHolder\n\n    private val itemsErrorsHolder: MutableList<Throwable> = ArrayList()\n\n    fun addError(error: Throwable) {\n        itemsErrorsHolder.add(error)\n    }\n\n    fun addErrors(errors: List<Throwable>) {\n        itemsErrorsHolder.addAll(errors)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/feed/service/FeedUpdateInfo.kt",
    "content": "package org.schabi.newpipe.local.feed.service\n\nimport org.schabi.newpipe.database.subscription.NotificationMode\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\nimport org.schabi.newpipe.extractor.Info\nimport org.schabi.newpipe.extractor.channel.ChannelInfo\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.util.image.ImageStrategy\n\n/**\n * Instances of this class might stay around in memory for some time while fetching the feed,\n * because of [FeedLoadManager.BUFFER_COUNT_BEFORE_INSERT]. Therefore this class should contain\n * as little data as possible to avoid out of memory errors. In particular, avoid storing whole\n * [ChannelInfo] objects, as they might contain raw JSON info in ready channel tabs link handlers.\n */\ndata class FeedUpdateInfo(\n    val uid: Long,\n    @NotificationMode\n    val notificationMode: Int,\n    val name: String,\n    val avatarUrl: String?,\n    val url: String,\n    val serviceId: Int,\n    // description and subscriberCount are null if the constructor info is from the fast feed method\n    val description: String?,\n    val subscriberCount: Long?,\n    val streams: List<StreamInfoItem>,\n    val errors: List<Throwable>\n) {\n    constructor(\n        subscription: SubscriptionEntity,\n        info: Info,\n        streams: List<StreamInfoItem>,\n        errors: List<Throwable>\n    ) : this(\n        uid = subscription.uid,\n        notificationMode = subscription.notificationMode,\n        name = info.name,\n        avatarUrl = (info as? ChannelInfo)?.avatars?.let {\n            // if the newly fetched info is not from fast feed, then it contains updated avatars\n            ImageStrategy.imageListToDbUrl(it)\n        } ?: subscription.avatarUrl,\n        url = info.url,\n        serviceId = info.serviceId,\n        // there is no description and subscriberCount in the fast feed\n        description = (info as? ChannelInfo)?.description,\n        subscriberCount = (info as? ChannelInfo)?.subscriberCount,\n        streams = streams,\n        errors = errors\n    )\n\n    /**\n     * Integer id, can be used as notification id, etc.\n     */\n    val pseudoId: Int\n        get() = url.hashCode()\n\n    lateinit var newStreams: List<StreamInfoItem>\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java",
    "content": "package org.schabi.newpipe.local.history;\n\n/*\n * Copyright (C) Mauricio Colli 2018\n * HistoryRecordManager.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\nimport androidx.annotation.NonNull;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.AppDatabase;\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.history.dao.SearchHistoryDAO;\nimport org.schabi.newpipe.database.history.dao.StreamHistoryDAO;\nimport org.schabi.newpipe.database.history.model.SearchHistoryEntry;\nimport org.schabi.newpipe.database.history.model.StreamHistoryEntity;\nimport org.schabi.newpipe.database.history.model.StreamHistoryEntry;\nimport org.schabi.newpipe.database.playlist.PlaylistStreamEntry;\nimport org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity;\nimport org.schabi.newpipe.database.stream.StreamStatisticsEntry;\nimport org.schabi.newpipe.database.stream.dao.StreamDAO;\nimport org.schabi.newpipe.database.stream.dao.StreamStateDAO;\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.database.stream.model.StreamStateEntity;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.local.feed.FeedViewModel;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.util.ExtractorHelper;\n\nimport java.time.OffsetDateTime;\nimport java.time.ZoneOffset;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport io.reactivex.rxjava3.core.Completable;\nimport io.reactivex.rxjava3.core.Flowable;\nimport io.reactivex.rxjava3.core.Maybe;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic class HistoryRecordManager {\n    private final AppDatabase database;\n    private final StreamDAO streamTable;\n    private final StreamHistoryDAO streamHistoryTable;\n    private final SearchHistoryDAO searchHistoryTable;\n    private final StreamStateDAO streamStateTable;\n    private final SharedPreferences sharedPreferences;\n    private final String searchHistoryKey;\n    private final String streamHistoryKey;\n\n    public HistoryRecordManager(final Context context) {\n        database = NewPipeDatabase.getInstance(context);\n        streamTable = database.streamDAO();\n        streamHistoryTable = database.streamHistoryDAO();\n        searchHistoryTable = database.searchHistoryDAO();\n        streamStateTable = database.streamStateDAO();\n        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);\n        searchHistoryKey = context.getString(R.string.enable_search_history_key);\n        streamHistoryKey = context.getString(R.string.enable_watch_history_key);\n    }\n\n    ///////////////////////////////////////////////////////\n    // Watch History\n    ///////////////////////////////////////////////////////\n\n    /**\n     * Marks a stream item as watched such that it is hidden from the feed if watched videos are\n     * hidden. Adds a history entry and updates the stream progress to 100%.\n     *\n     * @see FeedViewModel#setSaveShowPlayedItems\n     * @param info the item to mark as watched\n     * @return a Maybe containing the ID of the item if successful\n     */\n    public Maybe<Long> markAsWatched(final StreamInfoItem info) {\n        if (!isStreamHistoryEnabled()) {\n            return Maybe.empty();\n        }\n\n        final OffsetDateTime currentTime = OffsetDateTime.now(ZoneOffset.UTC);\n        return Maybe.fromCallable(() -> database.runInTransaction(() -> {\n            final long streamId;\n            final long duration;\n            // Duration will not exist if the item was loaded with fast mode, so fetch it if empty\n            if (info.getDuration() < 0) {\n                final StreamInfo completeInfo = ExtractorHelper.getStreamInfo(\n                        info.getServiceId(),\n                        info.getUrl(),\n                        false\n                )\n                        .subscribeOn(Schedulers.io())\n                        .blockingGet();\n                duration = completeInfo.getDuration();\n                streamId = streamTable.upsert(new StreamEntity(completeInfo));\n            } else {\n                duration = info.getDuration();\n                streamId = streamTable.upsert(new StreamEntity(info));\n            }\n\n            // Update the stream progress to the full duration of the video\n            final StreamStateEntity entity = new StreamStateEntity(\n                    streamId,\n                    duration * 1000\n            );\n            streamStateTable.upsert(entity);\n\n            // Add a history entry\n            final StreamHistoryEntity latestEntry = streamHistoryTable.getLatestEntry(streamId);\n            if (latestEntry == null) {\n                // never actually viewed: add history entry but with 0 views\n                return streamHistoryTable.insert(new StreamHistoryEntity(streamId, currentTime, 0));\n            } else {\n                return 0L;\n            }\n        })).subscribeOn(Schedulers.io());\n    }\n\n    public Maybe<Long> onViewed(final StreamInfo info) {\n        if (!isStreamHistoryEnabled()) {\n            return Maybe.empty();\n        }\n\n        final OffsetDateTime currentTime = OffsetDateTime.now(ZoneOffset.UTC);\n        return Maybe.fromCallable(() -> database.runInTransaction(() -> {\n            final long streamId = streamTable.upsert(new StreamEntity(info));\n            final StreamHistoryEntity latestEntry = streamHistoryTable.getLatestEntry(streamId);\n\n            if (latestEntry != null) {\n                streamHistoryTable.delete(latestEntry);\n                latestEntry.setAccessDate(currentTime);\n                latestEntry.setRepeatCount(latestEntry.getRepeatCount() + 1);\n                return streamHistoryTable.insert(latestEntry);\n            } else {\n                // just viewed for the first time: set 1 view\n                return streamHistoryTable.insert(new StreamHistoryEntity(streamId, currentTime, 1));\n            }\n        })).subscribeOn(Schedulers.io());\n    }\n\n    public Completable deleteStreamHistoryAndState(final long streamId) {\n        return Completable.fromAction(() -> {\n            streamStateTable.deleteState(streamId);\n            streamHistoryTable.deleteStreamHistory(streamId);\n        }).subscribeOn(Schedulers.io());\n    }\n\n    public Single<Integer> deleteWholeStreamHistory() {\n        return Single.fromCallable(streamHistoryTable::deleteAll)\n                .subscribeOn(Schedulers.io());\n    }\n\n    public Single<Integer> deleteCompleteStreamStateHistory() {\n        return Single.fromCallable(streamStateTable::deleteAll)\n                .subscribeOn(Schedulers.io());\n    }\n\n    public Flowable<List<StreamHistoryEntry>> getStreamHistorySortedById() {\n        return streamHistoryTable.getHistorySortedById().subscribeOn(Schedulers.io());\n    }\n\n    public Flowable<List<StreamStatisticsEntry>> getStreamStatistics() {\n        return streamHistoryTable.getStatistics().subscribeOn(Schedulers.io());\n    }\n\n    private boolean isStreamHistoryEnabled() {\n        return sharedPreferences.getBoolean(streamHistoryKey, false);\n    }\n\n    ///////////////////////////////////////////////////////\n    // Search History\n    ///////////////////////////////////////////////////////\n\n    public Maybe<Long> onSearched(final int serviceId, final String search) {\n        if (!isSearchHistoryEnabled()) {\n            return Maybe.empty();\n        }\n\n        final OffsetDateTime currentTime = OffsetDateTime.now(ZoneOffset.UTC);\n        final SearchHistoryEntry newEntry = new SearchHistoryEntry(currentTime, serviceId, search);\n\n        return Maybe.fromCallable(() -> database.runInTransaction(() -> {\n            final SearchHistoryEntry latestEntry = searchHistoryTable.getLatestEntry();\n            if (latestEntry != null && latestEntry.hasEqualValues(newEntry)) {\n                latestEntry.setCreationDate(currentTime);\n                return (long) searchHistoryTable.update(latestEntry);\n            } else {\n                return searchHistoryTable.insert(newEntry);\n            }\n        })).subscribeOn(Schedulers.io());\n    }\n\n    public Single<Integer> deleteSearchHistory(final String search) {\n        return Single.fromCallable(() -> searchHistoryTable.deleteAllWhereQuery(search))\n                .subscribeOn(Schedulers.io());\n    }\n\n    public Single<Integer> deleteCompleteSearchHistory() {\n        return Single.fromCallable(searchHistoryTable::deleteAll)\n                .subscribeOn(Schedulers.io());\n    }\n\n    public Flowable<List<String>> getRelatedSearches(final String query,\n                                                     final int similarQueryLimit,\n                                                     final int uniqueQueryLimit) {\n        return query.length() > 0\n                ? searchHistoryTable.getSimilarEntries(query, similarQueryLimit)\n                : searchHistoryTable.getUniqueEntries(uniqueQueryLimit);\n    }\n\n    private boolean isSearchHistoryEnabled() {\n        return sharedPreferences.getBoolean(searchHistoryKey, false);\n    }\n\n    ///////////////////////////////////////////////////////\n    // Stream State History\n    ///////////////////////////////////////////////////////\n\n    public Maybe<StreamStateEntity> loadStreamState(final PlayQueueItem queueItem) {\n        return queueItem.getStream()\n                .map(info -> streamTable.upsert(new StreamEntity(info)))\n                .flatMapPublisher(streamStateTable::getState)\n                .firstElement()\n                .flatMap(list -> list.isEmpty() ? Maybe.empty() : Maybe.just(list.get(0)))\n                .filter(state -> state.isValid(queueItem.getDuration()))\n                .subscribeOn(Schedulers.io());\n    }\n\n    public Maybe<StreamStateEntity> loadStreamState(final StreamInfo info) {\n        return Single.fromCallable(() -> streamTable.upsert(new StreamEntity(info)))\n                .flatMapPublisher(streamStateTable::getState)\n                .firstElement()\n                .flatMap(list -> list.isEmpty() ? Maybe.empty() : Maybe.just(list.get(0)))\n                .filter(state -> state.isValid(info.getDuration()))\n                .subscribeOn(Schedulers.io());\n    }\n\n    public Completable saveStreamState(@NonNull final StreamInfo info, final long progressMillis) {\n        return Completable.fromAction(() -> database.runInTransaction(() -> {\n            final long streamId = streamTable.upsert(new StreamEntity(info));\n            final StreamStateEntity state = new StreamStateEntity(streamId, progressMillis);\n            if (state.isValid(info.getDuration())) {\n                streamStateTable.upsert(state);\n            }\n        })).subscribeOn(Schedulers.io());\n    }\n\n    public Single<StreamStateEntity[]> loadStreamState(final InfoItem info) {\n        return Single.fromCallable(() -> {\n            final List<StreamEntity> entities = streamTable\n                    .getStream(info.getServiceId(), info.getUrl()).blockingFirst();\n            if (entities.isEmpty()) {\n                return new StreamStateEntity[]{null};\n            }\n            final List<StreamStateEntity> states = streamStateTable\n                    .getState(entities.get(0).getUid()).blockingFirst();\n            if (states.isEmpty()) {\n                return new StreamStateEntity[]{null};\n            }\n            return new StreamStateEntity[]{states.get(0)};\n        }).subscribeOn(Schedulers.io());\n    }\n\n    public Single<List<StreamStateEntity>> loadLocalStreamStateBatch(\n            final List<? extends LocalItem> items) {\n        return Single.fromCallable(() -> {\n            final List<StreamStateEntity> result = new ArrayList<>(items.size());\n            for (final LocalItem item : items) {\n                final long streamId;\n                if (item instanceof StreamStatisticsEntry) {\n                    streamId = ((StreamStatisticsEntry) item).getStreamId();\n                } else if (item instanceof PlaylistStreamEntity) {\n                    streamId = ((PlaylistStreamEntity) item).getStreamUid();\n                } else if (item instanceof PlaylistStreamEntry) {\n                    streamId = ((PlaylistStreamEntry) item).getStreamId();\n                } else {\n                    result.add(null);\n                    continue;\n                }\n                final List<StreamStateEntity> states = streamStateTable.getState(streamId)\n                        .blockingFirst();\n                if (states.isEmpty()) {\n                    result.add(null);\n                } else {\n                    result.add(states.get(0));\n                }\n            }\n            return result;\n        }).subscribeOn(Schedulers.io());\n    }\n\n    ///////////////////////////////////////////////////////\n    // Utility\n    ///////////////////////////////////////////////////////\n\n    public Single<Integer> removeOrphanedRecords() {\n        return Single.fromCallable(streamTable::deleteOrphans).subscribeOn(Schedulers.io());\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java",
    "content": "package org.schabi.newpipe.local.history;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.os.Parcelable;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.evernote.android.state.State;\nimport com.google.android.material.snackbar.Snackbar;\n\nimport org.reactivestreams.Subscriber;\nimport org.reactivestreams.Subscription;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.stream.StreamStatisticsEntry;\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.databinding.PlaylistControlBinding;\nimport org.schabi.newpipe.databinding.StatisticPlaylistControlBinding;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder;\nimport org.schabi.newpipe.info_list.dialog.InfoItemDialog;\nimport org.schabi.newpipe.info_list.dialog.StreamDialogDefaultEntry;\nimport org.schabi.newpipe.local.BaseLocalListFragment;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.SinglePlayQueue;\nimport org.schabi.newpipe.settings.HistorySettingsFragment;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.OnClickGesture;\nimport org.schabi.newpipe.util.PlayButtonHelper;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.function.Supplier;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\n\npublic class StatisticsPlaylistFragment\n        extends BaseLocalListFragment<List<StreamStatisticsEntry>, Void>\n        implements PlaylistControlViewHolder {\n    private final CompositeDisposable disposables = new CompositeDisposable();\n    @State\n    Parcelable itemsListState;\n    private StatisticSortMode sortMode = StatisticSortMode.LAST_PLAYED;\n\n    private StatisticPlaylistControlBinding headerBinding;\n    private PlaylistControlBinding playlistControlBinding;\n\n    /* Used for independent events */\n    private Subscription databaseSubscription;\n    private HistoryRecordManager recordManager;\n\n    private List<StreamStatisticsEntry> processResult(final List<StreamStatisticsEntry> results) {\n        final Comparator<StreamStatisticsEntry> comparator;\n        switch (sortMode) {\n            case LAST_PLAYED:\n                comparator = Comparator.comparing(StreamStatisticsEntry::getLatestAccessDate);\n                break;\n            case MOST_PLAYED:\n                comparator = Comparator.comparingLong(StreamStatisticsEntry::getWatchCount);\n                break;\n            default:\n                return null;\n        }\n        Collections.sort(results, comparator.reversed());\n        return results;\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment LifeCycle - Creation\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        recordManager = new HistoryRecordManager(getContext());\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_playlist, container, false);\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        if (activity != null) {\n            setTitle(activity.getString(R.string.title_activity_history));\n        }\n    }\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) {\n        super.onCreateOptionsMenu(menu, inflater);\n        inflater.inflate(R.menu.menu_history, menu);\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment LifeCycle - Views\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n        if (!useAsFrontPage) {\n            setTitle(getString(R.string.title_last_played));\n        }\n    }\n\n    @Override\n    protected Supplier<View> getListHeaderSupplier() {\n        headerBinding = StatisticPlaylistControlBinding.inflate(activity.getLayoutInflater(),\n                itemsList, false);\n        playlistControlBinding = headerBinding.playlistControl;\n\n        return headerBinding::getRoot;\n    }\n\n    @Override\n    protected void initListeners() {\n        super.initListeners();\n\n        itemListAdapter.setSelectedListener(new OnClickGesture<>() {\n            @Override\n            public void selected(final LocalItem selectedItem) {\n                if (selectedItem instanceof StreamStatisticsEntry) {\n                    final StreamEntity item =\n                            ((StreamStatisticsEntry) selectedItem).getStreamEntity();\n                    NavigationHelper.openVideoDetailFragment(requireContext(), getFM(),\n                            item.getServiceId(), item.getUrl(), item.getTitle(), null, false);\n                }\n            }\n\n            @Override\n            public void held(final LocalItem selectedItem) {\n                if (selectedItem instanceof StreamStatisticsEntry) {\n                    showInfoItemDialog((StreamStatisticsEntry) selectedItem);\n                }\n            }\n        });\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(final MenuItem item) {\n        if (item.getItemId() == R.id.action_history_clear) {\n            HistorySettingsFragment\n                    .openDeleteWatchHistoryDialog(requireContext(), recordManager, disposables);\n        } else {\n            return super.onOptionsItemSelected(item);\n        }\n        return true;\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment LifeCycle - Loading\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void startLoading(final boolean forceLoad) {\n        super.startLoading(forceLoad);\n        recordManager.getStreamStatistics()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(getHistoryObserver());\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment LifeCycle - Destruction\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        itemsListState = Objects.requireNonNull(itemsList.getLayoutManager()).onSaveInstanceState();\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n\n        if (itemListAdapter != null) {\n            itemListAdapter.unsetSelectedListener();\n        }\n\n        headerBinding = null;\n        playlistControlBinding = null;\n\n        if (databaseSubscription != null) {\n            databaseSubscription.cancel();\n        }\n        databaseSubscription = null;\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        recordManager = null;\n        itemsListState = null;\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Statistics Loader\n    ///////////////////////////////////////////////////////////////////////////\n\n    private Subscriber<List<StreamStatisticsEntry>> getHistoryObserver() {\n        return new Subscriber<List<StreamStatisticsEntry>>() {\n            @Override\n            public void onSubscribe(final Subscription s) {\n                showLoading();\n\n                if (databaseSubscription != null) {\n                    databaseSubscription.cancel();\n                }\n                databaseSubscription = s;\n                databaseSubscription.request(1);\n            }\n\n            @Override\n            public void onNext(final List<StreamStatisticsEntry> streams) {\n                handleResult(streams);\n                if (databaseSubscription != null) {\n                    databaseSubscription.request(1);\n                }\n            }\n\n            @Override\n            public void onError(final Throwable exception) {\n                showError(\n                        new ErrorInfo(exception, UserAction.SOMETHING_ELSE, \"History Statistics\"));\n            }\n\n            @Override\n            public void onComplete() {\n            }\n        };\n    }\n\n    @Override\n    public void handleResult(@NonNull final List<StreamStatisticsEntry> result) {\n        super.handleResult(result);\n        if (itemListAdapter == null) {\n            return;\n        }\n\n        playlistControlBinding.getRoot().setVisibility(View.VISIBLE);\n\n        itemListAdapter.clearStreamItemList();\n\n        if (result.isEmpty()) {\n            showEmptyState();\n            return;\n        }\n\n        itemListAdapter.addItems(processResult(result));\n        if (itemsListState != null && itemsList.getLayoutManager() != null) {\n            itemsList.getLayoutManager().onRestoreInstanceState(itemsListState);\n            itemsListState = null;\n        }\n\n        PlayButtonHelper.initPlaylistControlClickListener(activity, playlistControlBinding, this);\n\n        headerBinding.sortButton.setOnClickListener(view -> toggleSortMode());\n\n        hideLoading();\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment Error Handling\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    protected void resetFragment() {\n        super.resetFragment();\n        if (databaseSubscription != null) {\n            databaseSubscription.cancel();\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void toggleSortMode() {\n        if (sortMode == StatisticSortMode.LAST_PLAYED) {\n            sortMode = StatisticSortMode.MOST_PLAYED;\n            setTitle(getString(R.string.title_most_played));\n            headerBinding.sortButtonIcon.setImageResource(R.drawable.ic_history);\n            headerBinding.sortButtonText.setText(R.string.title_last_played);\n        } else {\n            sortMode = StatisticSortMode.LAST_PLAYED;\n            setTitle(getString(R.string.title_last_played));\n            headerBinding.sortButtonIcon.setImageResource(\n                R.drawable.ic_filter_list);\n            headerBinding.sortButtonText.setText(R.string.title_most_played);\n        }\n        startLoading(true);\n    }\n\n    private PlayQueue getPlayQueueStartingAt(final StreamStatisticsEntry infoItem) {\n        return getPlayQueue(Math.max(itemListAdapter.getItemsList().indexOf(infoItem), 0));\n    }\n\n    private void showInfoItemDialog(final StreamStatisticsEntry item) {\n        final Context context = getContext();\n        final StreamInfoItem infoItem = item.toStreamInfoItem();\n\n        try {\n            final InfoItemDialog.Builder dialogBuilder =\n                    new InfoItemDialog.Builder(getActivity(), context, this, infoItem);\n\n            // set entries in the middle; the others are added automatically\n            dialogBuilder\n                    .addEntry(StreamDialogDefaultEntry.DELETE)\n                    .setAction(\n                            StreamDialogDefaultEntry.DELETE,\n                            (f, i) -> deleteEntry(\n                                    Math.max(itemListAdapter.getItemsList().indexOf(item), 0)))\n                    .create()\n                    .show();\n        } catch (final IllegalArgumentException e) {\n            InfoItemDialog.Builder.reportErrorDuringInitialization(e, infoItem);\n        }\n    }\n\n    private void deleteEntry(final int index) {\n        final LocalItem infoItem = itemListAdapter.getItemsList().get(index);\n        if (infoItem instanceof StreamStatisticsEntry) {\n            final StreamStatisticsEntry entry = (StreamStatisticsEntry) infoItem;\n            final Disposable onDelete = recordManager\n                    .deleteStreamHistoryAndState(entry.getStreamId())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(\n                            () -> {\n                                if (getView() != null) {\n                                    Snackbar.make(getView(), R.string.one_item_deleted,\n                                            Snackbar.LENGTH_SHORT).show();\n                                } else {\n                                    Toast.makeText(getContext(),\n                                            R.string.one_item_deleted,\n                                            Toast.LENGTH_SHORT).show();\n                                }\n                            },\n                            throwable -> showSnackBarError(new ErrorInfo(throwable,\n                                    UserAction.DELETE_FROM_HISTORY, \"Deleting item\")));\n\n            disposables.add(onDelete);\n        }\n    }\n\n    @Override\n    public PlayQueue getPlayQueue() {\n        return getPlayQueue(0);\n    }\n\n    private PlayQueue getPlayQueue(final int index) {\n        if (itemListAdapter == null) {\n            return new SinglePlayQueue(Collections.emptyList(), 0);\n        }\n\n        final List<LocalItem> infoItems = itemListAdapter.getItemsList();\n        final List<StreamInfoItem> streamInfoItems = new ArrayList<>(infoItems.size());\n        for (final LocalItem item : infoItems) {\n            if (item instanceof StreamStatisticsEntry) {\n                streamInfoItems.add(((StreamStatisticsEntry) item).toStreamInfoItem());\n            }\n        }\n        return new SinglePlayQueue(streamInfoItems, index);\n    }\n\n    private enum StatisticSortMode {\n        LAST_PLAYED,\n        MOST_PLAYED,\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalBookmarkPlaylistItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;\nimport org.schabi.newpipe.local.LocalItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\n\nimport java.time.format.DateTimeFormatter;\n\npublic class LocalBookmarkPlaylistItemHolder extends LocalPlaylistItemHolder {\n    private final View itemHandleView;\n\n    public LocalBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder,\n                                           final ViewGroup parent) {\n        this(infoItemBuilder, R.layout.list_playlist_bookmark_item, parent);\n    }\n\n    LocalBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId,\n                                    final ViewGroup parent) {\n        super(infoItemBuilder, layoutId, parent);\n        itemHandleView = itemView.findViewById(R.id.itemHandle);\n    }\n\n    @Override\n    public void updateFromItem(final LocalItem localItem,\n                               final HistoryRecordManager historyRecordManager,\n                               final DateTimeFormatter dateTimeFormatter) {\n        if (!(localItem instanceof PlaylistMetadataEntry)) {\n            return;\n        }\n        final PlaylistMetadataEntry item = (PlaylistMetadataEntry) localItem;\n\n        itemHandleView.setOnTouchListener(getOnTouchListener(item));\n\n        super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter);\n    }\n\n    private View.OnTouchListener getOnTouchListener(final PlaylistMetadataEntry item) {\n        return (view, motionEvent) -> {\n            view.performClick();\n            if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null\n                    && motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {\n                itemBuilder.getOnItemSelectedListener().drag(item,\n                        LocalBookmarkPlaylistItemHolder.this);\n            }\n            return false;\n        };\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.LayoutInflater;\nimport android.view.ViewGroup;\n\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.local.LocalItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\n\nimport java.time.format.DateTimeFormatter;\n\n/*\n * Created by Christian Schabesberger on 12.02.17.\n *\n * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>\n * InfoItemHolder.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic abstract class LocalItemHolder extends RecyclerView.ViewHolder {\n    protected final LocalItemBuilder itemBuilder;\n\n    public LocalItemHolder(final LocalItemBuilder itemBuilder, final int layoutId,\n                           final ViewGroup parent) {\n        super(LayoutInflater.from(itemBuilder.getContext()).inflate(layoutId, parent, false));\n        this.itemBuilder = itemBuilder;\n    }\n\n    public abstract void updateFromItem(LocalItem item, HistoryRecordManager historyRecordManager,\n                                        DateTimeFormatter dateTimeFormatter);\n\n    public void updateState(final LocalItem localItem,\n                            final HistoryRecordManager historyRecordManager) { }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistCardItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.local.LocalItemBuilder;\n\n/**\n * Playlist card layout.\n */\npublic class LocalPlaylistCardItemHolder extends LocalPlaylistItemHolder {\n\n    public LocalPlaylistCardItemHolder(final LocalItemBuilder infoItemBuilder,\n                                       final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_playlist_card_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistGridItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.local.LocalItemBuilder;\n\npublic class LocalPlaylistGridItemHolder extends LocalPlaylistItemHolder {\n    public LocalPlaylistGridItemHolder(final LocalItemBuilder infoItemBuilder,\n                                       final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_playlist_grid_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry;\nimport org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;\nimport org.schabi.newpipe.local.LocalItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.image.CoilHelper;\n\nimport java.time.format.DateTimeFormatter;\n\npublic class LocalPlaylistItemHolder extends PlaylistItemHolder {\n\n    private static final float GRAYED_OUT_ALPHA = 0.6f;\n\n    public LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) {\n        super(infoItemBuilder, parent);\n    }\n\n    LocalPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId,\n                            final ViewGroup parent) {\n        super(infoItemBuilder, layoutId, parent);\n    }\n\n    @Override\n    public void updateFromItem(final LocalItem localItem,\n                               final HistoryRecordManager historyRecordManager,\n                               final DateTimeFormatter dateTimeFormatter) {\n        if (!(localItem instanceof PlaylistMetadataEntry item)) {\n            return;\n        }\n\n        itemTitleView.setText(item.getOrderingName());\n        itemStreamCountView.setText(Localization.localizeStreamCountMini(\n                itemStreamCountView.getContext(), item.getStreamCount()));\n        itemUploaderView.setVisibility(View.INVISIBLE);\n\n        CoilHelper.INSTANCE.loadPlaylistThumbnail(itemThumbnailView, item.getThumbnailUrl());\n\n        if (item instanceof PlaylistDuplicatesEntry\n                && ((PlaylistDuplicatesEntry) item).getTimesStreamIsContained() > 0) {\n            itemView.setAlpha(GRAYED_OUT_ALPHA);\n        } else {\n            itemView.setAlpha(1.0f);\n        }\n\n        super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamCardItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.local.LocalItemBuilder;\n\n/**\n * Local playlist stream UI. This also includes a handle to rearrange the videos.\n */\npublic class LocalPlaylistStreamCardItemHolder extends LocalPlaylistStreamItemHolder {\n\n    public LocalPlaylistStreamCardItemHolder(final LocalItemBuilder infoItemBuilder,\n                                             final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_stream_playlist_card_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamGridItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.local.LocalItemBuilder;\n\npublic class LocalPlaylistStreamGridItemHolder extends LocalPlaylistStreamItemHolder {\n    public LocalPlaylistStreamGridItemHolder(final LocalItemBuilder infoItemBuilder,\n                                             final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_stream_playlist_grid_item, parent); // TODO\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalPlaylistStreamItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.core.content.ContextCompat;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.playlist.PlaylistStreamEntry;\nimport org.schabi.newpipe.ktx.ViewUtils;\nimport org.schabi.newpipe.local.LocalItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.DependentPreferenceHelper;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.ServiceHelper;\nimport org.schabi.newpipe.util.image.CoilHelper;\nimport org.schabi.newpipe.views.AnimatedProgressBar;\n\nimport java.time.format.DateTimeFormatter;\nimport java.util.concurrent.TimeUnit;\n\npublic class LocalPlaylistStreamItemHolder extends LocalItemHolder {\n    public final ImageView itemThumbnailView;\n    public final TextView itemVideoTitleView;\n    private final TextView itemAdditionalDetailsView;\n    public final TextView itemDurationView;\n    private final View itemHandleView;\n    private final AnimatedProgressBar itemProgressView;\n\n    LocalPlaylistStreamItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId,\n                                  final ViewGroup parent) {\n        super(infoItemBuilder, layoutId, parent);\n\n        itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView);\n        itemVideoTitleView = itemView.findViewById(R.id.itemVideoTitleView);\n        itemAdditionalDetailsView = itemView.findViewById(R.id.itemAdditionalDetails);\n        itemDurationView = itemView.findViewById(R.id.itemDurationView);\n        itemHandleView = itemView.findViewById(R.id.itemHandle);\n        itemProgressView = itemView.findViewById(R.id.itemProgressView);\n    }\n\n    public LocalPlaylistStreamItemHolder(final LocalItemBuilder infoItemBuilder,\n                                         final ViewGroup parent) {\n        this(infoItemBuilder, R.layout.list_stream_playlist_item, parent);\n    }\n\n    @Override\n    public void updateFromItem(final LocalItem localItem,\n                               final HistoryRecordManager historyRecordManager,\n                               final DateTimeFormatter dateTimeFormatter) {\n        if (!(localItem instanceof PlaylistStreamEntry)) {\n            return;\n        }\n        final PlaylistStreamEntry item = (PlaylistStreamEntry) localItem;\n\n        itemVideoTitleView.setText(item.getStreamEntity().getTitle());\n        itemAdditionalDetailsView.setText(Localization\n                .concatenateStrings(item.getStreamEntity().getUploader(),\n                        ServiceHelper.getNameOfServiceById(item.getStreamEntity().getServiceId())));\n\n        if (item.getStreamEntity().getDuration() > 0) {\n            itemDurationView.setText(Localization\n                    .getDurationString(item.getStreamEntity().getDuration()));\n            itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(),\n                    R.color.duration_background_color));\n            itemDurationView.setVisibility(View.VISIBLE);\n\n            if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext())\n                    && item.getProgressMillis() > 0) {\n                itemProgressView.setVisibility(View.VISIBLE);\n                itemProgressView.setMax((int) item.getStreamEntity().getDuration());\n                itemProgressView.setProgress((int) TimeUnit.MILLISECONDS\n                        .toSeconds(item.getProgressMillis()));\n            } else {\n                itemProgressView.setVisibility(View.GONE);\n            }\n        } else {\n            itemDurationView.setVisibility(View.GONE);\n        }\n\n        // Default thumbnail is shown on error, while loading and if the url is empty\n        CoilHelper.INSTANCE.loadThumbnail(itemThumbnailView,\n                item.getStreamEntity().getThumbnailUrl());\n\n        itemView.setOnClickListener(view -> {\n            if (itemBuilder.getOnItemSelectedListener() != null) {\n                itemBuilder.getOnItemSelectedListener().selected(item);\n            }\n        });\n\n        itemView.setLongClickable(true);\n        itemView.setOnLongClickListener(view -> {\n            if (itemBuilder.getOnItemSelectedListener() != null) {\n                itemBuilder.getOnItemSelectedListener().held(item);\n            }\n            return true;\n        });\n\n        itemHandleView.setOnTouchListener(getOnTouchListener(item));\n    }\n\n    @Override\n    public void updateState(final LocalItem localItem,\n                            final HistoryRecordManager historyRecordManager) {\n        if (!(localItem instanceof PlaylistStreamEntry)) {\n            return;\n        }\n        final PlaylistStreamEntry item = (PlaylistStreamEntry) localItem;\n\n        if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext())\n                && item.getProgressMillis() > 0 && item.getStreamEntity().getDuration() > 0) {\n            itemProgressView.setMax((int) item.getStreamEntity().getDuration());\n            if (itemProgressView.getVisibility() == View.VISIBLE) {\n                itemProgressView.setProgressAnimated((int) TimeUnit.MILLISECONDS\n                        .toSeconds(item.getProgressMillis()));\n            } else {\n                itemProgressView.setProgress((int) TimeUnit.MILLISECONDS\n                        .toSeconds(item.getProgressMillis()));\n                ViewUtils.animate(itemProgressView, true, 500);\n            }\n        } else if (itemProgressView.getVisibility() == View.VISIBLE) {\n            ViewUtils.animate(itemProgressView, false, 500);\n        }\n    }\n\n    private View.OnTouchListener getOnTouchListener(final PlaylistStreamEntry item) {\n        return (view, motionEvent) -> {\n            view.performClick();\n            if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null\n                    && motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {\n                itemBuilder.getOnItemSelectedListener().drag(item,\n                        LocalPlaylistStreamItemHolder.this);\n            }\n            return false;\n        };\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamCardItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.local.LocalItemBuilder;\n\npublic class LocalStatisticStreamCardItemHolder extends LocalStatisticStreamItemHolder {\n    public LocalStatisticStreamCardItemHolder(final LocalItemBuilder infoItemBuilder,\n                                              final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_stream_card_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamGridItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.local.LocalItemBuilder;\n\npublic class LocalStatisticStreamGridItemHolder extends LocalStatisticStreamItemHolder {\n    public LocalStatisticStreamGridItemHolder(final LocalItemBuilder infoItemBuilder,\n                                              final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_stream_grid_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.annotation.Nullable;\nimport androidx.core.content.ContextCompat;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.stream.StreamStatisticsEntry;\nimport org.schabi.newpipe.ktx.ViewUtils;\nimport org.schabi.newpipe.local.LocalItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.DependentPreferenceHelper;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.ServiceHelper;\nimport org.schabi.newpipe.util.image.CoilHelper;\nimport org.schabi.newpipe.views.AnimatedProgressBar;\n\nimport java.time.format.DateTimeFormatter;\nimport java.util.concurrent.TimeUnit;\n\n/*\n * Created by Christian Schabesberger on 01.08.16.\n * <p>\n * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>\n * StreamInfoItemHolder.java is part of NewPipe.\n * <p>\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * <p>\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * <p>\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic class LocalStatisticStreamItemHolder extends LocalItemHolder {\n    public final ImageView itemThumbnailView;\n    public final TextView itemVideoTitleView;\n    public final TextView itemUploaderView;\n    public final TextView itemDurationView;\n    @Nullable\n    public final TextView itemAdditionalDetails;\n    private final AnimatedProgressBar itemProgressView;\n\n    public LocalStatisticStreamItemHolder(final LocalItemBuilder itemBuilder,\n                                          final ViewGroup parent) {\n        this(itemBuilder, R.layout.list_stream_item, parent);\n    }\n\n    LocalStatisticStreamItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId,\n                                   final ViewGroup parent) {\n        super(infoItemBuilder, layoutId, parent);\n\n        itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView);\n        itemVideoTitleView = itemView.findViewById(R.id.itemVideoTitleView);\n        itemUploaderView = itemView.findViewById(R.id.itemUploaderView);\n        itemDurationView = itemView.findViewById(R.id.itemDurationView);\n        itemAdditionalDetails = itemView.findViewById(R.id.itemAdditionalDetails);\n        itemProgressView = itemView.findViewById(R.id.itemProgressView);\n    }\n\n    private String getStreamInfoDetailLine(final StreamStatisticsEntry entry,\n                                           final DateTimeFormatter dateTimeFormatter) {\n        return Localization.concatenateStrings(\n                // watchCount\n                Localization.shortViewCount(itemBuilder.getContext(), entry.getWatchCount()),\n                dateTimeFormatter.format(entry.getLatestAccessDate()),\n                // serviceName\n                ServiceHelper.getNameOfServiceById(entry.getStreamEntity().getServiceId()));\n    }\n\n    @Override\n    public void updateFromItem(final LocalItem localItem,\n                               final HistoryRecordManager historyRecordManager,\n                               final DateTimeFormatter dateTimeFormatter) {\n        if (!(localItem instanceof StreamStatisticsEntry)) {\n            return;\n        }\n        final StreamStatisticsEntry item = (StreamStatisticsEntry) localItem;\n\n        itemVideoTitleView.setText(item.getStreamEntity().getTitle());\n        itemUploaderView.setText(item.getStreamEntity().getUploader());\n\n        if (item.getStreamEntity().getDuration() > 0) {\n            itemDurationView.\n                    setText(Localization.getDurationString(item.getStreamEntity().getDuration()));\n            itemDurationView.setBackgroundColor(ContextCompat.getColor(itemBuilder.getContext(),\n                    R.color.duration_background_color));\n            itemDurationView.setVisibility(View.VISIBLE);\n\n            if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext())\n                    && item.getProgressMillis() > 0) {\n                itemProgressView.setVisibility(View.VISIBLE);\n                itemProgressView.setMax((int) item.getStreamEntity().getDuration());\n                itemProgressView.setProgress((int) TimeUnit.MILLISECONDS\n                        .toSeconds(item.getProgressMillis()));\n            } else {\n                itemProgressView.setVisibility(View.GONE);\n            }\n        } else {\n            itemDurationView.setVisibility(View.GONE);\n            itemProgressView.setVisibility(View.GONE);\n        }\n\n        if (itemAdditionalDetails != null) {\n            itemAdditionalDetails.setText(getStreamInfoDetailLine(item, dateTimeFormatter));\n        }\n\n        // Default thumbnail is shown on error, while loading and if the url is empty\n        CoilHelper.INSTANCE.loadThumbnail(itemThumbnailView,\n                item.getStreamEntity().getThumbnailUrl());\n\n        itemView.setOnClickListener(view -> {\n            if (itemBuilder.getOnItemSelectedListener() != null) {\n                itemBuilder.getOnItemSelectedListener().selected(item);\n            }\n        });\n\n        itemView.setLongClickable(true);\n        itemView.setOnLongClickListener(view -> {\n            if (itemBuilder.getOnItemSelectedListener() != null) {\n                itemBuilder.getOnItemSelectedListener().held(item);\n            }\n            return true;\n        });\n    }\n\n    @Override\n    public void updateState(final LocalItem localItem,\n                            final HistoryRecordManager historyRecordManager) {\n        if (!(localItem instanceof StreamStatisticsEntry)) {\n            return;\n        }\n        final StreamStatisticsEntry item = (StreamStatisticsEntry) localItem;\n\n        if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext())\n                && item.getProgressMillis() > 0 && item.getStreamEntity().getDuration() > 0) {\n            itemProgressView.setMax((int) item.getStreamEntity().getDuration());\n            if (itemProgressView.getVisibility() == View.VISIBLE) {\n                itemProgressView.setProgressAnimated((int) TimeUnit.MILLISECONDS\n                        .toSeconds(item.getProgressMillis()));\n            } else {\n                itemProgressView.setProgress((int) TimeUnit.MILLISECONDS\n                        .toSeconds(item.getProgressMillis()));\n                ViewUtils.animate(itemProgressView, true, 500);\n            }\n        } else if (itemProgressView.getVisibility() == View.VISIBLE) {\n            ViewUtils.animate(itemProgressView, false, 500);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/PlaylistItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.local.LocalItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\n\nimport java.time.format.DateTimeFormatter;\n\npublic abstract class PlaylistItemHolder extends LocalItemHolder {\n    public final ImageView itemThumbnailView;\n    final TextView itemStreamCountView;\n    public final TextView itemTitleView;\n    public final TextView itemUploaderView;\n\n    public PlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId,\n                              final ViewGroup parent) {\n        super(infoItemBuilder, layoutId, parent);\n\n        itemThumbnailView = itemView.findViewById(R.id.itemThumbnailView);\n        itemTitleView = itemView.findViewById(R.id.itemTitleView);\n        itemStreamCountView = itemView.findViewById(R.id.itemStreamCountView);\n        itemUploaderView = itemView.findViewById(R.id.itemUploaderView);\n    }\n\n    public PlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final ViewGroup parent) {\n        this(infoItemBuilder, R.layout.list_playlist_mini_item, parent);\n    }\n\n    @Override\n    public void updateFromItem(final LocalItem localItem,\n                               final HistoryRecordManager historyRecordManager,\n                               final DateTimeFormatter dateTimeFormatter) {\n        itemView.setOnClickListener(view -> {\n            if (itemBuilder.getOnItemSelectedListener() != null) {\n                itemBuilder.getOnItemSelectedListener().selected(localItem);\n            }\n        });\n\n        itemView.setLongClickable(true);\n        itemView.setOnLongClickListener(view -> {\n            if (itemBuilder.getOnItemSelectedListener() != null) {\n                itemBuilder.getOnItemSelectedListener().held(localItem);\n            }\n            return true;\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/RemoteBookmarkPlaylistItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;\nimport org.schabi.newpipe.local.LocalItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\n\nimport java.time.format.DateTimeFormatter;\n\npublic class RemoteBookmarkPlaylistItemHolder extends RemotePlaylistItemHolder {\n    private final View itemHandleView;\n\n    public RemoteBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder,\n                                            final ViewGroup parent) {\n        this(infoItemBuilder, R.layout.list_playlist_bookmark_item, parent);\n    }\n\n    RemoteBookmarkPlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId,\n                                     final ViewGroup parent) {\n        super(infoItemBuilder, layoutId, parent);\n        itemHandleView = itemView.findViewById(R.id.itemHandle);\n    }\n\n    @Override\n    public void updateFromItem(final LocalItem localItem,\n                               final HistoryRecordManager historyRecordManager,\n                               final DateTimeFormatter dateTimeFormatter) {\n        if (!(localItem instanceof PlaylistRemoteEntity)) {\n            return;\n        }\n        final PlaylistRemoteEntity item = (PlaylistRemoteEntity) localItem;\n\n        itemHandleView.setOnTouchListener(getOnTouchListener(item));\n\n        super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter);\n    }\n\n    private View.OnTouchListener getOnTouchListener(final PlaylistRemoteEntity item) {\n        return (view, motionEvent) -> {\n            view.performClick();\n            if (itemBuilder != null && itemBuilder.getOnItemSelectedListener() != null\n                    && motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {\n                itemBuilder.getOnItemSelectedListener().drag(item,\n                        RemoteBookmarkPlaylistItemHolder.this);\n            }\n            return false;\n        };\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistCardItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.local.LocalItemBuilder;\n\n/**\n * Playlist card UI for list item.\n */\npublic class RemotePlaylistCardItemHolder extends RemotePlaylistItemHolder {\n\n    public RemotePlaylistCardItemHolder(final LocalItemBuilder infoItemBuilder,\n                                        final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_playlist_card_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistGridItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.local.LocalItemBuilder;\n\npublic class RemotePlaylistGridItemHolder extends RemotePlaylistItemHolder {\n    public RemotePlaylistGridItemHolder(final LocalItemBuilder infoItemBuilder,\n                                        final ViewGroup parent) {\n        super(infoItemBuilder, R.layout.list_playlist_grid_item, parent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/holder/RemotePlaylistItemHolder.java",
    "content": "package org.schabi.newpipe.local.holder;\n\nimport android.text.TextUtils;\nimport android.view.ViewGroup;\n\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;\nimport org.schabi.newpipe.local.LocalItemBuilder;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.ServiceHelper;\nimport org.schabi.newpipe.util.image.CoilHelper;\n\nimport java.time.format.DateTimeFormatter;\n\npublic class RemotePlaylistItemHolder extends PlaylistItemHolder {\n\n    public RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder,\n                                    final ViewGroup parent) {\n        super(infoItemBuilder, parent);\n    }\n\n    RemotePlaylistItemHolder(final LocalItemBuilder infoItemBuilder, final int layoutId,\n                             final ViewGroup parent) {\n        super(infoItemBuilder, layoutId, parent);\n    }\n\n    @Override\n    public void updateFromItem(final LocalItem localItem,\n                               final HistoryRecordManager historyRecordManager,\n                               final DateTimeFormatter dateTimeFormatter) {\n        if (!(localItem instanceof PlaylistRemoteEntity item)) {\n            return;\n        }\n\n        itemTitleView.setText(item.getOrderingName());\n        itemStreamCountView.setText(Localization.localizeStreamCountMini(\n                itemStreamCountView.getContext(), item.getStreamCount()));\n        // Here is where the uploader name is set in the bookmarked playlists library\n        if (!TextUtils.isEmpty(item.getUploader())) {\n            itemUploaderView.setText(Localization.concatenateStrings(item.getUploader(),\n                    ServiceHelper.getNameOfServiceById(item.getServiceId())));\n        } else {\n            itemUploaderView.setText(ServiceHelper.getNameOfServiceById(item.getServiceId()));\n        }\n\n        CoilHelper.INSTANCE.loadPlaylistThumbnail(itemThumbnailView, item.getThumbnailUrl());\n\n        super.updateFromItem(localItem, historyRecordManager, dateTimeFormatter);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/playlist/ExportPlaylist.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.local.playlist\n\nimport android.content.Context\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.playlist.PlaylistStreamEntry\nimport org.schabi.newpipe.extractor.exceptions.ParsingException\nimport org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeStreamLinkHandlerFactory\nimport org.schabi.newpipe.local.playlist.PlayListShareMode.JUST_URLS\nimport org.schabi.newpipe.local.playlist.PlayListShareMode.WITH_TITLES\nimport org.schabi.newpipe.local.playlist.PlayListShareMode.YOUTUBE_TEMP_PLAYLIST\n\nfun export(\n    shareMode: PlayListShareMode,\n    playlist: List<PlaylistStreamEntry>,\n    context: Context\n): String {\n    return when (shareMode) {\n        WITH_TITLES -> exportWithTitles(playlist, context)\n        JUST_URLS -> exportJustUrls(playlist)\n        YOUTUBE_TEMP_PLAYLIST -> exportAsYoutubeTempPlaylist(playlist)\n    }\n}\n\nprivate fun exportWithTitles(playlist: List<PlaylistStreamEntry>, context: Context): String {\n    return playlist.asSequence()\n        .map { it.streamEntity }\n        .map { entity ->\n            context.getString(\n                R.string.video_details_list_item,\n                entity.title,\n                entity.url\n            )\n        }\n        .joinToString(separator = \"\\n\")\n}\n\nprivate fun exportJustUrls(playlist: List<PlaylistStreamEntry>): String {\n    return playlist.joinToString(separator = \"\\n\") { it.streamEntity.url }\n}\n\nprivate fun exportAsYoutubeTempPlaylist(playlist: List<PlaylistStreamEntry>): String {\n    val videoIDs = playlist.asReversed().asSequence()\n        .mapNotNull { getYouTubeId(it.streamEntity.url) }\n        .take(50) // YouTube limitation: temp playlists can't have more than 50 items\n        .toList()\n        .asReversed()\n        .joinToString(separator = \",\")\n\n    return \"https://www.youtube.com/watch_videos?video_ids=$videoIDs\"\n}\n\nprivate val linkHandler: YoutubeStreamLinkHandlerFactory = YoutubeStreamLinkHandlerFactory.getInstance()\n\n/**\n * Gets the video id from a YouTube URL.\n *\n * @param url YouTube URL\n * @return the video id\n */\nprivate fun getYouTubeId(url: String): String? {\n    return runCatching { linkHandler.getId(url) }.getOrNull()\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java",
    "content": "package org.schabi.newpipe.local.playlist;\n\nimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;\nimport static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;\nimport static org.schabi.newpipe.error.ErrorUtil.showUiErrorSnackbar;\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\nimport static org.schabi.newpipe.local.playlist.ExportPlaylistKt.export;\nimport static org.schabi.newpipe.local.playlist.PlayListShareMode.JUST_URLS;\nimport static org.schabi.newpipe.local.playlist.PlayListShareMode.WITH_TITLES;\nimport static org.schabi.newpipe.local.playlist.PlayListShareMode.YOUTUBE_TEMP_PLAYLIST;\nimport static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout;\n\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.os.Parcelable;\nimport android.text.InputType;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.util.Pair;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.LinearLayout;\nimport android.widget.LinearLayout.LayoutParams;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.evernote.android.state.State;\nimport org.reactivestreams.Subscriber;\nimport org.reactivestreams.Subscription;\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.history.model.StreamHistoryEntry;\nimport org.schabi.newpipe.database.playlist.PlaylistStreamEntry;\nimport org.schabi.newpipe.database.playlist.model.PlaylistEntity;\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.databinding.DialogEditTextBinding;\nimport org.schabi.newpipe.databinding.LocalPlaylistHeaderBinding;\nimport org.schabi.newpipe.databinding.PlaylistControlBinding;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.fragments.MainFragment;\nimport org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder;\nimport org.schabi.newpipe.info_list.dialog.InfoItemDialog;\nimport org.schabi.newpipe.info_list.dialog.StreamDialogDefaultEntry;\nimport org.schabi.newpipe.local.BaseLocalListFragment;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.SinglePlayQueue;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.OnClickGesture;\nimport org.schabi.newpipe.util.PlayButtonHelper;\nimport org.schabi.newpipe.util.debounce.DebounceSavable;\nimport org.schabi.newpipe.util.debounce.DebounceSaver;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicBoolean;\nimport java.util.function.Supplier;\nimport java.util.stream.Collectors;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistStreamEntry>, Void>\n        implements PlaylistControlViewHolder, DebounceSavable {\n\n    private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 12;\n    @State\n    protected Long playlistId;\n    @State\n    protected String name;\n    @State\n    Parcelable itemsListState;\n\n    private LocalPlaylistHeaderBinding headerBinding;\n    private PlaylistControlBinding playlistControlBinding;\n\n    private ItemTouchHelper itemTouchHelper;\n\n    private LocalPlaylistManager playlistManager;\n    private Subscription databaseSubscription;\n\n    private CompositeDisposable disposables;\n\n    /** Whether the playlist has been fully loaded from db. */\n    private AtomicBoolean isLoadingComplete;\n    /** Used to debounce saving playlist edits to disk. */\n    private DebounceSaver debounceSaver;\n    /** Flag to prevent simultaneous rewrites of the playlist. */\n    private boolean isRewritingPlaylist = false;\n\n    /**\n     * The pager adapter that the fragment is created from when it is used as frontpage, i.e.\n     * {@link #useAsFrontPage} is {@link true}.\n     */\n    @Nullable\n    private MainFragment.SelectedTabsPagerAdapter tabsPagerAdapter = null;\n\n    public static LocalPlaylistFragment getInstance(final long playlistId, final String name) {\n        final var instance = new LocalPlaylistFragment();\n        instance.setInitialData(playlistId, name);\n        return instance;\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment LifeCycle - Creation\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        playlistManager = new LocalPlaylistManager(NewPipeDatabase.getInstance(requireContext()));\n\n        disposables = new CompositeDisposable();\n\n        isLoadingComplete = new AtomicBoolean();\n        debounceSaver = new DebounceSaver(this);\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             @Nullable final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_playlist, container, false);\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment Lifecycle - Views\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void setTitle(final String title) {\n        super.setTitle(title);\n\n        if (headerBinding != null) {\n            headerBinding.playlistTitleView.setText(title);\n        }\n    }\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n        setTitle(name);\n    }\n\n    @Override\n    protected Supplier<View> getListHeaderSupplier() {\n        headerBinding = LocalPlaylistHeaderBinding.inflate(activity.getLayoutInflater(), itemsList,\n            false);\n        playlistControlBinding = headerBinding.playlistControl;\n\n        headerBinding.playlistTitleView.setSelected(true);\n\n        return headerBinding::getRoot;\n    }\n\n    @Override\n    protected void initListeners() {\n        super.initListeners();\n\n        headerBinding.playlistTitleView.setOnClickListener(view -> createRenameDialog());\n\n        itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());\n        itemTouchHelper.attachToRecyclerView(itemsList);\n\n        itemListAdapter.setSelectedListener(new OnClickGesture<>() {\n            @Override\n            public void selected(final LocalItem selectedItem) {\n                if (selectedItem instanceof PlaylistStreamEntry entry) {\n                    final StreamEntity item = entry.getStreamEntity();\n                    NavigationHelper.openVideoDetailFragment(requireContext(), getFM(),\n                            item.getServiceId(), item.getUrl(), item.getTitle(), null, false);\n                }\n            }\n\n            @Override\n            public void held(final LocalItem selectedItem) {\n                if (selectedItem instanceof PlaylistStreamEntry) {\n                    showInfoItemDialog((PlaylistStreamEntry) selectedItem);\n                }\n            }\n\n            @Override\n            public void drag(final LocalItem selectedItem,\n                             final RecyclerView.ViewHolder viewHolder) {\n                if (itemTouchHelper != null) {\n                    itemTouchHelper.startDrag(viewHolder);\n                }\n            }\n        });\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment Lifecycle - Loading\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void showLoading() {\n        super.showLoading();\n        if (headerBinding != null) {\n            animate(headerBinding.getRoot(), false, 200);\n            animate(playlistControlBinding.getRoot(), false, 200);\n        }\n    }\n\n    @Override\n    public void hideLoading() {\n        super.hideLoading();\n        if (headerBinding != null) {\n            animate(headerBinding.getRoot(), true, 200);\n            animate(playlistControlBinding.getRoot(), true, 200);\n        }\n    }\n\n    @Override\n    public void startLoading(final boolean forceLoad) {\n        super.startLoading(forceLoad);\n\n        if (disposables != null) {\n            disposables.clear();\n        }\n\n        if (debounceSaver != null) {\n            disposables.add(debounceSaver.getDebouncedSaver());\n            debounceSaver.setNoChangesToSave();\n        }\n\n        isLoadingComplete.set(false);\n\n        playlistManager.getPlaylistStreams(playlistId)\n                .onBackpressureLatest()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(getPlaylistObserver());\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment Lifecycle - Destruction\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        itemsListState = itemsList.getLayoutManager().onSaveInstanceState();\n\n        // Save on exit\n        saveImmediate();\n    }\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) {\n        if (DEBUG) {\n            Log.d(TAG, \"onCreateOptionsMenu() called with: \"\n                    + \"menu = [\" + menu + \"], inflater = [\" + inflater + \"]\");\n        }\n        super.onCreateOptionsMenu(menu, inflater);\n        inflater.inflate(R.menu.menu_local_playlist, menu);\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n\n        if (itemListAdapter != null) {\n            itemListAdapter.unsetSelectedListener();\n        }\n\n        headerBinding = null;\n        playlistControlBinding = null;\n\n\n        if (databaseSubscription != null) {\n            databaseSubscription.cancel();\n        }\n        if (disposables != null) {\n            disposables.clear();\n        }\n\n        databaseSubscription = null;\n        itemTouchHelper = null;\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        if (debounceSaver != null) {\n            debounceSaver.getDebouncedSaveSignal().onComplete();\n        }\n        if (disposables != null) {\n            disposables.dispose();\n        }\n        if (tabsPagerAdapter != null) {\n            tabsPagerAdapter.getLocalPlaylistFragments().remove(this);\n        }\n\n        debounceSaver = null;\n        playlistManager = null;\n        disposables = null;\n\n        isLoadingComplete = null;\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Playlist Stream Loader\n    ///////////////////////////////////////////////////////////////////////////\n\n    private Subscriber<List<PlaylistStreamEntry>> getPlaylistObserver() {\n        return new Subscriber<>() {\n            @Override\n            public void onSubscribe(final Subscription s) {\n                showLoading();\n                isLoadingComplete.set(false);\n\n                if (databaseSubscription != null) {\n                    databaseSubscription.cancel();\n                }\n                databaseSubscription = s;\n                databaseSubscription.request(1);\n            }\n\n            @Override\n            public void onNext(final List<PlaylistStreamEntry> streams) {\n                // Skip handling the result after it has been modified\n                if (debounceSaver == null || !debounceSaver.getIsModified()) {\n                    handleResult(streams);\n                    isLoadingComplete.set(true);\n                }\n\n                if (databaseSubscription != null) {\n                    databaseSubscription.request(1);\n                }\n            }\n\n            @Override\n            public void onError(final Throwable exception) {\n                showError(new ErrorInfo(exception, UserAction.REQUESTED_BOOKMARK,\n                        \"Loading local playlist\"));\n            }\n\n            @Override\n            public void onComplete() {\n            }\n        };\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(final MenuItem item) {\n        if (item.getItemId() == R.id.menu_item_share_playlist) {\n            createShareConfirmationDialog();\n        } else if (item.getItemId() == R.id.menu_item_rename_playlist) {\n            createRenameDialog();\n        } else if (item.getItemId() == R.id.menu_item_remove_watched) {\n            if (!isRewritingPlaylist) {\n                openRemoveWatchedConfirmationDialog();\n            }\n        } else if (item.getItemId() == R.id.menu_item_remove_duplicates) {\n            if (!isRewritingPlaylist) {\n                openRemoveDuplicatesDialog();\n            }\n        } else {\n            return super.onOptionsItemSelected(item);\n        }\n        return true;\n    }\n\n    /**\n     * Shares the playlist in one of 3 ways, depending on the value of {@code shareMode}:\n     * <ul>\n     *     <li>{@code JUST_URLS}: shares the URLs only.</li>\n     *     <li>{@code WITH_TITLES}: each entry in the list is accompanied by its title.</li>\n     *     <li>{@code YOUTUBE_TEMP_PLAYLIST}: shares as a YouTube temporary playlist.</li>\n     * </ul>\n     *\n     * @param shareMode The way the playlist should be shared.\n     */\n    private void sharePlaylist(final PlayListShareMode shareMode) {\n        final Context context = requireContext();\n\n        disposables.add(playlistManager.getPlaylistStreams(playlistId)\n            .flatMapSingle(playlist -> Single.just(export(\n\n                shareMode,\n                playlist,\n                context\n            )))\n            .observeOn(AndroidSchedulers.mainThread())\n            .subscribe(\n                urlsText -> {\n\n                    final String content = shareMode == WITH_TITLES\n                        ? context.getString(R.string.share_playlist_content_details,\n                                            name,\n                                            urlsText\n                                           )\n                        : urlsText;\n\n                    ShareUtils.shareText(context, name, content);\n                },\n                throwable -> showUiErrorSnackbar(this, \"Sharing playlist\", throwable)\n            )\n        );\n    }\n\n    public void removeWatchedStreams(final boolean removePartiallyWatched) {\n        if (isRewritingPlaylist) {\n            return;\n        }\n        isRewritingPlaylist = true;\n        showLoading();\n\n        final var recordManager = new HistoryRecordManager(getContext());\n        final var historyIdsMaybe = recordManager.getStreamHistorySortedById()\n                .firstElement()\n                // already sorted by ^ getStreamHistorySortedById(), binary search can be used\n                .map(historyList -> historyList.stream().map(StreamHistoryEntry::getStreamId)\n                        .collect(Collectors.toList()));\n        final var streamsMaybe = playlistManager.getPlaylistStreams(playlistId)\n                .firstElement()\n                .zipWith(historyIdsMaybe, (playlist, historyStreamIds) -> {\n                    // Remove Watched, Functionality data\n                    final List<PlaylistStreamEntry> itemsToKeep = new ArrayList<>();\n                    final boolean isThumbnailPermanent = playlistManager\n                            .getIsPlaylistThumbnailPermanent(playlistId);\n                    boolean thumbnailVideoRemoved = false;\n\n                    final var streamStates = recordManager\n                            .loadLocalStreamStateBatch(playlist).blockingGet();\n\n                    for (int i = 0; i < playlist.size(); i++) {\n                        final var playlistItem = playlist.get(i);\n                        final var streamStateEntity = streamStates.get(i);\n                        final int indexInHistory = Collections.binarySearch(historyStreamIds,\n                                playlistItem.getStreamId());\n                        final long duration = playlistItem.toStreamInfoItem().getDuration();\n\n                        if (indexInHistory < 0 // stream is not in history\n                                // stream is in history but the streamStateEntity is null\n                                // if the stream was played for less than 5 seconds, see\n                                // StreamStateEntity#PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS\n                                || streamStateEntity == null\n                                || (!removePartiallyWatched\n                                        && !streamStateEntity.isFinished(duration))) {\n                            itemsToKeep.add(playlistItem);\n                        } else if (!isThumbnailPermanent && !thumbnailVideoRemoved\n                                && playlistManager.getPlaylistThumbnailStreamId(playlistId)\n                                == playlistItem.getStreamEntity().getUid()) {\n                            thumbnailVideoRemoved = true;\n                        }\n                    }\n\n                    return new Pair<>(itemsToKeep, thumbnailVideoRemoved);\n                });\n\n        disposables.add(streamsMaybe.subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(flow -> {\n                    final List<PlaylistStreamEntry> itemsToKeep = flow.first;\n                    final boolean thumbnailVideoRemoved = flow.second;\n\n                    itemListAdapter.clearStreamItemList();\n                    itemListAdapter.addItems(itemsToKeep);\n                    debounceSaver.setHasChangesToSave();\n                    saveImmediate();\n\n                    if (thumbnailVideoRemoved) {\n                        updateThumbnailUrl();\n                    }\n\n                    final long videoCount = itemListAdapter.getItemsList().size();\n                    setStreamCountAndOverallDuration(itemListAdapter.getItemsList());\n                    if (videoCount == 0) {\n                        showEmptyState();\n                    }\n\n                    hideLoading();\n                    isRewritingPlaylist = false;\n                }, throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK,\n                        \"Removing watched videos, partially watched=\" + removePartiallyWatched))));\n    }\n\n    @Override\n    public void handleResult(@NonNull final List<PlaylistStreamEntry> result) {\n        super.handleResult(result);\n        if (itemListAdapter == null) {\n            return;\n        }\n\n        itemListAdapter.clearStreamItemList();\n\n        if (result.isEmpty()) {\n            showEmptyState();\n            return;\n        }\n\n        itemListAdapter.addItems(result);\n        if (itemsListState != null) {\n            itemsList.getLayoutManager().onRestoreInstanceState(itemsListState);\n            itemsListState = null;\n        }\n        setStreamCountAndOverallDuration(itemListAdapter.getItemsList());\n\n        PlayButtonHelper.initPlaylistControlClickListener(activity, playlistControlBinding, this);\n\n        hideLoading();\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment Error Handling\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    protected void resetFragment() {\n        super.resetFragment();\n        if (databaseSubscription != null) {\n            databaseSubscription.cancel();\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playlist Metadata/Streams Manipulation\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void createRenameDialog() {\n        if (playlistId == null || name == null || getContext() == null) {\n            return;\n        }\n\n        final var dialogBinding = DialogEditTextBinding.inflate(getLayoutInflater());\n        dialogBinding.dialogEditText.setHint(R.string.name);\n        dialogBinding.dialogEditText.setInputType(InputType.TYPE_CLASS_TEXT);\n        dialogBinding.dialogEditText.setSelection(dialogBinding.dialogEditText.getText().length());\n        dialogBinding.dialogEditText.setText(name);\n\n        new AlertDialog.Builder(getContext())\n                .setTitle(R.string.rename_playlist)\n                .setView(dialogBinding.getRoot())\n                .setCancelable(true)\n                .setNegativeButton(R.string.cancel, null)\n                .setPositiveButton(R.string.rename, (dialogInterface, i) ->\n                        changePlaylistName(dialogBinding.dialogEditText.getText().toString()))\n                .show();\n    }\n\n    private void changePlaylistName(final String title) {\n        if (playlistManager == null) {\n            return;\n        }\n\n        this.name = title;\n        setTitle(title);\n\n        if (DEBUG) {\n            Log.d(TAG, \"Updating playlist id=[\" + playlistId + \"] \"\n                    + \"with new title=[\" + title + \"] items\");\n        }\n\n        final Disposable disposable = playlistManager.renamePlaylist(playlistId, title)\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(longs -> { /*Do nothing on success*/ }, throwable ->\n                        showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK,\n                                \"Renaming playlist\")));\n        disposables.add(disposable);\n    }\n\n    private void changeThumbnailStreamId(final long thumbnailStreamId, final boolean isPermanent) {\n        if (playlistManager == null || (!isPermanent && playlistManager\n                .getIsPlaylistThumbnailPermanent(playlistId))) {\n            return;\n        }\n\n        final Toast successToast = Toast.makeText(getActivity(),\n                R.string.playlist_thumbnail_change_success,\n                Toast.LENGTH_SHORT);\n\n        if (DEBUG) {\n            Log.d(TAG, \"Updating playlist id=[\" + playlistId + \"] \"\n                    + \"with new thumbnail stream id=[\" + thumbnailStreamId + \"]\");\n        }\n\n        final Disposable disposable = playlistManager\n                .changePlaylistThumbnail(playlistId, thumbnailStreamId, isPermanent)\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(ignore -> successToast.show(), throwable ->\n                        showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK,\n                                \"Changing playlist thumbnail\")));\n        disposables.add(disposable);\n    }\n\n    private void updateThumbnailUrl() {\n        if (playlistManager.getIsPlaylistThumbnailPermanent(playlistId)) {\n            return;\n        }\n\n        final long thumbnailStreamId;\n\n        if (!itemListAdapter.getItemsList().isEmpty()) {\n            thumbnailStreamId = ((PlaylistStreamEntry) itemListAdapter.getItemsList().get(0))\n                    .getStreamEntity().getUid();\n        } else {\n            thumbnailStreamId = PlaylistEntity.DEFAULT_THUMBNAIL_ID;\n        }\n\n        changeThumbnailStreamId(thumbnailStreamId, false);\n    }\n\n    private void openRemoveDuplicatesDialog() {\n        new AlertDialog.Builder(this.getActivity())\n                .setTitle(R.string.remove_duplicates_title)\n                .setMessage(R.string.remove_duplicates_message)\n                .setPositiveButton(R.string.ok, (dialog, i) ->\n                        removeDuplicatesInPlaylist())\n                .setNeutralButton(R.string.cancel, null)\n                .show();\n    }\n\n    private void removeDuplicatesInPlaylist() {\n        if (isRewritingPlaylist) {\n            return;\n        }\n        isRewritingPlaylist = true;\n        showLoading();\n\n        final var streamsMaybe = playlistManager\n                .getDistinctPlaylistStreams(playlistId).firstElement();\n\n\n        disposables.add(streamsMaybe.subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(itemsToKeep -> {\n                    itemListAdapter.clearStreamItemList();\n                    itemListAdapter.addItems(itemsToKeep);\n                    setStreamCountAndOverallDuration(itemListAdapter.getItemsList());\n                    debounceSaver.setHasChangesToSave();\n                    saveImmediate();\n\n                    hideLoading();\n                    isRewritingPlaylist = false;\n                }, throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK,\n                        \"Removing duplicated streams\"))));\n    }\n\n    private void deleteItem(final PlaylistStreamEntry item) {\n        if (itemListAdapter == null) {\n            return;\n        }\n\n        itemListAdapter.removeItem(item);\n        if (playlistManager.getPlaylistThumbnailStreamId(playlistId) == item.getStreamId()) {\n            updateThumbnailUrl();\n        }\n\n        setStreamCountAndOverallDuration(itemListAdapter.getItemsList());\n        debounceSaver.setHasChangesToSave();\n        saveImmediate();\n    }\n\n    /**\n     * <p>Commit changes immediately if the playlist has been modified.</p>\n     *  Delete operations and other modifications will be committed to ensure that the database\n     *  is up to date, e.g. when the user adds the just deleted stream from another fragment.\n     */\n    @Override\n    public void saveImmediate() {\n        if (playlistManager == null || itemListAdapter == null) {\n            return;\n        }\n\n        // List must be loaded and modified in order to save\n        if (isLoadingComplete == null || debounceSaver == null\n                || !isLoadingComplete.get() || !debounceSaver.getIsModified()) {\n            return;\n        }\n\n        final List<LocalItem> items = itemListAdapter.getItemsList();\n        final List<Long> streamIds = new ArrayList<>(items.size());\n        for (final LocalItem item : items) {\n            if (item instanceof PlaylistStreamEntry entry) {\n                streamIds.add(entry.getStreamId());\n            }\n        }\n\n        if (DEBUG) {\n            Log.d(TAG, \"Updating playlist id=[\" + playlistId + \"] \"\n                    + \"with [\" + streamIds.size() + \"] items\");\n        }\n\n        final Disposable disposable = playlistManager.updateJoin(playlistId, streamIds)\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(\n                        () -> {\n                            if (debounceSaver != null) {\n                                debounceSaver.setNoChangesToSave();\n                            }\n                        },\n                        throwable -> showError(new ErrorInfo(throwable,\n                                UserAction.REQUESTED_BOOKMARK, \"Saving playlist\"))\n                );\n        disposables.add(disposable);\n    }\n\n\n    private ItemTouchHelper.SimpleCallback getItemTouchCallback() {\n        int directions = ItemTouchHelper.UP | ItemTouchHelper.DOWN;\n        if (shouldUseGridLayout(requireContext())) {\n            directions |= ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;\n        }\n        return new ItemTouchHelper.SimpleCallback(directions,\n                ItemTouchHelper.ACTION_STATE_IDLE) {\n            @Override\n            public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView,\n                                                    final int viewSize,\n                                                    final int viewSizeOutOfBounds,\n                                                    final int totalSize,\n                                                    final long msSinceStartScroll) {\n                final int standardSpeed = super.interpolateOutOfBoundsScroll(recyclerView,\n                        viewSize, viewSizeOutOfBounds, totalSize, msSinceStartScroll);\n                final int minimumAbsVelocity = Math.max(MINIMUM_INITIAL_DRAG_VELOCITY,\n                        Math.abs(standardSpeed));\n                return minimumAbsVelocity * (int) Math.signum(viewSizeOutOfBounds);\n            }\n\n            @Override\n            public boolean onMove(@NonNull final RecyclerView recyclerView,\n                                  @NonNull final RecyclerView.ViewHolder source,\n                                  @NonNull final RecyclerView.ViewHolder target) {\n                if (source.getItemViewType() != target.getItemViewType()\n                        || itemListAdapter == null) {\n                    return false;\n                }\n\n                final int sourceIndex = source.getBindingAdapterPosition();\n                final int targetIndex = target.getBindingAdapterPosition();\n                final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex);\n                if (isSwapped) {\n                    debounceSaver.setHasChangesToSave();\n                }\n                return isSwapped;\n            }\n\n            @Override\n            public void clearView(@NonNull final RecyclerView recyclerView,\n                                  @NonNull final RecyclerView.ViewHolder viewHolder) {\n                super.clearView(recyclerView, viewHolder);\n                saveImmediate();\n            }\n\n            @Override\n            public boolean isLongPressDragEnabled() {\n                return false;\n            }\n\n            @Override\n            public boolean isItemViewSwipeEnabled() {\n                return false;\n            }\n\n            @Override\n            public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder,\n                                 final int swipeDir) {\n            }\n        };\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private PlayQueue getPlayQueueStartingAt(final PlaylistStreamEntry infoItem) {\n        return getPlayQueue(Math.max(itemListAdapter.getItemsList().indexOf(infoItem), 0));\n    }\n\n    protected void showInfoItemDialog(final PlaylistStreamEntry item) {\n        final StreamInfoItem infoItem = item.toStreamInfoItem();\n\n        try {\n            final Context context = getContext();\n            final InfoItemDialog.Builder dialogBuilder =\n                    new InfoItemDialog.Builder(getActivity(), context, this, infoItem);\n\n            // add entries in the middle\n            dialogBuilder.addAllEntries(\n                    StreamDialogDefaultEntry.SET_AS_PLAYLIST_THUMBNAIL,\n                    StreamDialogDefaultEntry.DELETE\n            );\n\n            // set custom actions\n            // all entries modified below have already been added within the builder\n            dialogBuilder\n                    .setAction(\n                            StreamDialogDefaultEntry.START_HERE_ON_BACKGROUND,\n                            (f, i) -> NavigationHelper.playOnBackgroundPlayer(\n                                    context, getPlayQueueStartingAt(item), true))\n                    .setAction(\n                            StreamDialogDefaultEntry.SET_AS_PLAYLIST_THUMBNAIL,\n                            (f, i) ->\n                                    changeThumbnailStreamId(item.getStreamEntity().getUid(),\n                                            true))\n                    .setAction(\n                            StreamDialogDefaultEntry.DELETE,\n                            (f, i) -> deleteItem(item))\n                    .create()\n                    .show();\n        } catch (final IllegalArgumentException e) {\n            InfoItemDialog.Builder.reportErrorDuringInitialization(e, infoItem);\n        }\n    }\n\n    private void setInitialData(final long pid, final String title) {\n        this.playlistId = pid;\n        this.name = !TextUtils.isEmpty(title) ? title : \"\";\n    }\n\n    private void setStreamCountAndOverallDuration(final ArrayList<LocalItem> itemsList) {\n        if (activity != null && headerBinding != null) {\n            final long streamCount = itemsList.size();\n            final long playlistOverallDurationSeconds = itemsList.stream()\n                    .filter(PlaylistStreamEntry.class::isInstance)\n                    .map(PlaylistStreamEntry.class::cast)\n                    .map(PlaylistStreamEntry::getStreamEntity)\n                    .mapToLong(StreamEntity::getDuration)\n                    .sum();\n            headerBinding.playlistStreamCount.setText(\n                    Localization.concatenateStrings(\n                            Localization.localizeStreamCount(activity, streamCount),\n                            Localization.getDurationString(playlistOverallDurationSeconds,\n                                                            true, true))\n            );\n        }\n    }\n\n    @Override\n    public PlayQueue getPlayQueue() {\n        return getPlayQueue(0);\n    }\n\n    private PlayQueue getPlayQueue(final int index) {\n        if (itemListAdapter == null) {\n            return new SinglePlayQueue(Collections.emptyList(), 0);\n        }\n\n        final List<LocalItem> infoItems = itemListAdapter.getItemsList();\n        final List<StreamInfoItem> streamInfoItems = new ArrayList<>(infoItems.size());\n        for (final LocalItem item : infoItems) {\n            if (item instanceof PlaylistStreamEntry) {\n                streamInfoItems.add(((PlaylistStreamEntry) item).toStreamInfoItem());\n            }\n        }\n        return new SinglePlayQueue(streamInfoItems, index);\n    }\n\n    /**\n     * Creates a dialog to confirm whether the user wants to share the playlist\n     * with the playlist details or just the list of stream URLs.\n     * After the user has made a choice, the playlist is shared.\n     */\n    private void createShareConfirmationDialog() {\n        new AlertDialog.Builder(requireContext())\n                .setTitle(R.string.share_playlist)\n                .setCancelable(true)\n                .setPositiveButton(R.string.share_playlist_with_titles, (dialog, which) ->\n                    sharePlaylist(WITH_TITLES)\n                )\n                .setNeutralButton(R.string.share_playlist_as_youtube_temporary_playlist,\n                    (dialog, which) -> sharePlaylist(YOUTUBE_TEMP_PLAYLIST)\n                )\n                .setNegativeButton(R.string.share_playlist_with_list, (dialog, which) ->\n                    sharePlaylist(JUST_URLS)\n                )\n                .show();\n    }\n\n    /**\n     * Opens a confirmation dialog to remove watched streams from the playlist.\n     * The user can also choose to remove partially watched streams.\n     */\n    private void openRemoveWatchedConfirmationDialog() {\n        final android.widget.CheckBox removePartiallyWatchedCheckbox =\n                new android.widget.CheckBox(requireContext());\n        removePartiallyWatchedCheckbox.setText(\n                R.string.remove_watched_popup_partially_watched_streams);\n\n        // Wrap the checkbox in a container with dialog-like horizontal padding\n        // so it aligns with the dialog title and message on the start side.\n        final LinearLayout checkboxContainer = new LinearLayout(requireContext());\n        checkboxContainer.setOrientation(LinearLayout.VERTICAL);\n        final int padding = DeviceUtils.dpToPx(20, requireContext());\n        checkboxContainer.setPadding(padding, padding, padding, 0);\n        checkboxContainer.addView(removePartiallyWatchedCheckbox,\n                new LayoutParams(MATCH_PARENT, WRAP_CONTENT));\n\n        new AlertDialog.Builder(requireContext())\n                .setMessage(R.string.remove_watched_popup_warning)\n                .setTitle(R.string.remove_watched_popup_title)\n                .setView(checkboxContainer)\n                .setPositiveButton(R.string.yes, (d, id) ->\n                        removeWatchedStreams(removePartiallyWatchedCheckbox.isChecked()))\n                .setNegativeButton(R.string.cancel, (d, id) -> d.cancel())\n                .show();\n    }\n\n    public void setTabsPagerAdapter(\n            @Nullable final MainFragment.SelectedTabsPagerAdapter tabsPagerAdapter) {\n        this.tabsPagerAdapter = tabsPagerAdapter;\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java",
    "content": "package org.schabi.newpipe.local.playlist;\n\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.database.AppDatabase;\nimport org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry;\nimport org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;\nimport org.schabi.newpipe.database.playlist.PlaylistStreamEntry;\nimport org.schabi.newpipe.database.playlist.dao.PlaylistDAO;\nimport org.schabi.newpipe.database.playlist.dao.PlaylistStreamDAO;\nimport org.schabi.newpipe.database.playlist.model.PlaylistEntity;\nimport org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity;\nimport org.schabi.newpipe.database.stream.dao.StreamDAO;\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport io.reactivex.rxjava3.core.Completable;\nimport io.reactivex.rxjava3.core.Flowable;\nimport io.reactivex.rxjava3.core.Maybe;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic class LocalPlaylistManager {\n    private static final long THUMBNAIL_ID_LEAVE_UNCHANGED = -2;\n\n    private final AppDatabase database;\n    private final StreamDAO streamTable;\n    private final PlaylistDAO playlistTable;\n    private final PlaylistStreamDAO playlistStreamTable;\n\n    public LocalPlaylistManager(final AppDatabase db) {\n        database = db;\n        streamTable = db.streamDAO();\n        playlistTable = db.playlistDAO();\n        playlistStreamTable = db.playlistStreamDAO();\n    }\n\n    public Maybe<List<Long>> createPlaylist(final String name, final List<StreamEntity> streams) {\n        // Disallow creation of empty playlists\n        if (streams.isEmpty()) {\n            return Maybe.empty();\n        }\n\n        // Save to the database directly.\n        // Make sure the new playlist is always on the top of bookmark.\n        // The index will be reassigned to non-negative number in BookmarkFragment.\n        return Maybe.fromCallable(() -> database.runInTransaction(() -> {\n                    final List<Long> streamIds = streamTable.upsertAll(streams);\n                    final PlaylistEntity newPlaylist = new PlaylistEntity(name, false,\n                            streamIds.get(0), -1);\n\n                    return insertJoinEntities(playlistTable.insert(newPlaylist),\n                            streamIds, 0);\n                }\n        )).subscribeOn(Schedulers.io());\n    }\n\n    public Maybe<List<Long>> appendToPlaylist(final long playlistId,\n                                              final List<StreamEntity> streams) {\n        return playlistStreamTable.getMaximumIndexOf(playlistId)\n                .firstElement()\n                .map(maxJoinIndex -> database.runInTransaction(() -> {\n                            final List<Long> streamIds = streamTable.upsertAll(streams);\n                            return insertJoinEntities(playlistId, streamIds, maxJoinIndex + 1);\n                        }\n                )).subscribeOn(Schedulers.io());\n    }\n\n    private List<Long> insertJoinEntities(final long playlistId, final List<Long> streamIds,\n                                          final int indexOffset) {\n\n        final List<PlaylistStreamEntity> joinEntities = new ArrayList<>(streamIds.size());\n\n        for (int index = 0; index < streamIds.size(); index++) {\n            joinEntities.add(new PlaylistStreamEntity(playlistId, streamIds.get(index),\n                    index + indexOffset));\n        }\n        return playlistStreamTable.insertAll(joinEntities);\n    }\n\n    public Completable updateJoin(final long playlistId, final List<Long> streamIds) {\n        final List<PlaylistStreamEntity> joinEntities = new ArrayList<>(streamIds.size());\n        for (int i = 0; i < streamIds.size(); i++) {\n            joinEntities.add(new PlaylistStreamEntity(playlistId, streamIds.get(i), i));\n        }\n\n        return Completable.fromRunnable(() -> database.runInTransaction(() -> {\n            playlistStreamTable.deleteBatch(playlistId);\n            playlistStreamTable.insertAll(joinEntities);\n        })).subscribeOn(Schedulers.io());\n    }\n\n    public Completable updatePlaylists(final List<PlaylistMetadataEntry> updateItems,\n                                       final List<Long> deletedItems) {\n        final List<PlaylistEntity> items = new ArrayList<>(updateItems.size());\n        for (final PlaylistMetadataEntry item : updateItems) {\n            items.add(new PlaylistEntity(item));\n        }\n        return Completable.fromRunnable(() -> database.runInTransaction(() -> {\n            for (final Long uid : deletedItems) {\n                playlistTable.deletePlaylist(uid);\n            }\n            for (final PlaylistEntity item : items) {\n                playlistTable.upsertPlaylist(item);\n            }\n        })).subscribeOn(Schedulers.io());\n    }\n\n    public Flowable<List<PlaylistStreamEntry>> getDistinctPlaylistStreams(final long playlistId) {\n        return playlistStreamTable\n                .getStreamsWithoutDuplicates(playlistId).subscribeOn(Schedulers.io());\n    }\n\n    /**\n     * Get playlists with attached information about how many times the provided stream is already\n     * contained in each playlist.\n     *\n     * @param streamUrl the stream url for which to check for duplicates\n     * @return a list of {@link PlaylistDuplicatesEntry}\n     */\n    public Flowable<List<PlaylistDuplicatesEntry>> getPlaylistDuplicates(final String streamUrl) {\n        return playlistStreamTable.getPlaylistDuplicatesMetadata(streamUrl)\n                .subscribeOn(Schedulers.io());\n    }\n\n    public Flowable<List<PlaylistMetadataEntry>> getPlaylists() {\n        return playlistStreamTable.getPlaylistMetadata().subscribeOn(Schedulers.io());\n    }\n\n    public Flowable<List<PlaylistStreamEntry>> getPlaylistStreams(final long playlistId) {\n        return playlistStreamTable.getOrderedStreamsOf(playlistId).subscribeOn(Schedulers.io());\n    }\n\n    public Maybe<Integer> renamePlaylist(final long playlistId, final String name) {\n        return modifyPlaylist(playlistId, name, THUMBNAIL_ID_LEAVE_UNCHANGED, false);\n    }\n\n    public Maybe<Integer> changePlaylistThumbnail(final long playlistId,\n                                                  final long thumbnailStreamId,\n                                                  final boolean isPermanent) {\n        return modifyPlaylist(playlistId, null, thumbnailStreamId, isPermanent);\n    }\n\n    public long getPlaylistThumbnailStreamId(final long playlistId) {\n        return playlistTable.getPlaylist(playlistId).blockingFirst().get(0).getThumbnailStreamId();\n    }\n\n    public boolean getIsPlaylistThumbnailPermanent(final long playlistId) {\n        return playlistTable.getPlaylist(playlistId).blockingFirst().get(0)\n                .isThumbnailPermanent();\n    }\n\n    public long getAutomaticPlaylistThumbnailStreamId(final long playlistId) {\n        final long streamId = playlistStreamTable.getAutomaticThumbnailStreamId(playlistId)\n                .blockingFirst();\n        if (streamId < 0) {\n            return PlaylistEntity.DEFAULT_THUMBNAIL_ID;\n        }\n        return streamId;\n    }\n\n    private Maybe<Integer> modifyPlaylist(final long playlistId,\n                                          @Nullable final String name,\n                                          final long thumbnailStreamId,\n                                          final boolean isPermanent) {\n        return playlistTable.getPlaylist(playlistId)\n                .firstElement()\n                .filter(playlistEntities -> !playlistEntities.isEmpty())\n                .map(playlistEntities -> {\n                    final PlaylistEntity playlist = playlistEntities.get(0);\n                    if (name != null) {\n                        playlist.setName(name);\n                    }\n                    if (thumbnailStreamId != THUMBNAIL_ID_LEAVE_UNCHANGED) {\n                        playlist.setThumbnailStreamId(thumbnailStreamId);\n                        playlist.setThumbnailPermanent(isPermanent);\n                    }\n                    return playlistTable.update(playlist);\n                }).subscribeOn(Schedulers.io());\n    }\n\n    public Maybe<Boolean> hasPlaylists() {\n        return playlistTable.getCount()\n                .firstElement()\n                .map(count -> count > 0)\n                .subscribeOn(Schedulers.io());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/playlist/PlayListShareMode.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.local.playlist\n\nenum class PlayListShareMode {\n    JUST_URLS,\n    WITH_TITLES,\n    YOUTUBE_TEMP_PLAYLIST\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.local.playlist\n\nimport io.reactivex.rxjava3.core.Completable\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.core.Single\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport org.schabi.newpipe.database.AppDatabase\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity\nimport org.schabi.newpipe.extractor.playlist.PlaylistInfo\n\nclass RemotePlaylistManager(private val database: AppDatabase) {\n    private val playlistRemoteTable = database.playlistRemoteDAO()\n\n    val playlists: Flowable<MutableList<PlaylistRemoteEntity>>\n        get() = playlistRemoteTable.playlists.subscribeOn(Schedulers.io())\n\n    fun getPlaylist(playlistId: Long): Flowable<PlaylistRemoteEntity> {\n        return playlistRemoteTable.getPlaylist(playlistId).subscribeOn(Schedulers.io())\n    }\n\n    fun getPlaylist(info: PlaylistInfo): Flowable<MutableList<PlaylistRemoteEntity>> {\n        return playlistRemoteTable.getPlaylist(info.serviceId.toLong(), info.url)\n            .subscribeOn(Schedulers.io())\n    }\n\n    fun deletePlaylist(playlistId: Long): Single<Int> {\n        return Single.fromCallable { playlistRemoteTable.deletePlaylist(playlistId) }\n            .subscribeOn(Schedulers.io())\n    }\n\n    fun updatePlaylists(\n        updateItems: List<PlaylistRemoteEntity>,\n        deletedItems: List<Long>\n    ): Completable {\n        return Completable.fromRunnable {\n            database.runInTransaction {\n                deletedItems.forEach { playlistRemoteTable.deletePlaylist(it) }\n                updateItems.forEach { playlistRemoteTable.upsert(it) }\n            }\n        }.subscribeOn(Schedulers.io())\n    }\n\n    fun onBookmark(playlistInfo: PlaylistInfo): Single<Long> {\n        return Single.fromCallable {\n            val playlist = PlaylistRemoteEntity(playlistInfo)\n            playlistRemoteTable.upsert(playlist)\n        }.subscribeOn(Schedulers.io())\n    }\n\n    fun onUpdate(playlistId: Long, playlistInfo: PlaylistInfo): Single<Int> {\n        return Single.fromCallable {\n            val playlist = PlaylistRemoteEntity(playlistInfo).apply { uid = playlistId }\n            playlistRemoteTable.update(playlist)\n        }.subscribeOn(Schedulers.io())\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt",
    "content": "package org.schabi.newpipe.local.subscription\n\nimport androidx.annotation.DrawableRes\nimport org.schabi.newpipe.R\n\nenum class FeedGroupIcon(\n    /**\n     * The id that will be used to store and retrieve icons from some persistent storage (e.g. DB).\n     */\n    val id: Int,\n\n    /**\n     * The drawable resource.\n     */\n    @DrawableRes val drawableResource: Int\n) {\n    ALL(0, R.drawable.ic_asterisk),\n    MUSIC(1, R.drawable.ic_music_note),\n    EDUCATION(2, R.drawable.ic_school),\n    FITNESS(3, R.drawable.ic_fitness_center),\n    SPACE(4, R.drawable.ic_telescope),\n    COMPUTER(5, R.drawable.ic_computer),\n    GAMING(6, R.drawable.ic_videogame_asset),\n    SPORTS(7, R.drawable.ic_directions_bike),\n    NEWS(8, R.drawable.ic_campaign),\n    FAVORITES(9, R.drawable.ic_favorite),\n    CAR(10, R.drawable.ic_directions_car),\n    MOTORCYCLE(11, R.drawable.ic_motorcycle),\n    TREND(12, R.drawable.ic_trending_up),\n    MOVIE(13, R.drawable.ic_movie),\n    BACKUP(14, R.drawable.ic_backup),\n    ART(15, R.drawable.ic_palette),\n    PERSON(16, R.drawable.ic_person),\n    PEOPLE(17, R.drawable.ic_people),\n    MONEY(18, R.drawable.ic_attach_money),\n    KIDS(19, R.drawable.ic_child_care),\n    FOOD(20, R.drawable.ic_fastfood),\n    SMILE(21, R.drawable.ic_insert_emoticon),\n    EXPLORE(22, R.drawable.ic_explore),\n    RESTAURANT(23, R.drawable.ic_restaurant),\n    MIC(24, R.drawable.ic_mic),\n    HEADSET(25, R.drawable.ic_headset),\n    RADIO(26, R.drawable.ic_radio),\n    SHOPPING_CART(27, R.drawable.ic_shopping_cart),\n    WATCH_LATER(28, R.drawable.ic_watch_later),\n    WORK(29, R.drawable.ic_work),\n    HOT(30, R.drawable.ic_whatshot),\n    CHANNEL(31, R.drawable.ic_tv),\n    BOOKMARK(32, R.drawable.ic_bookmark),\n    PETS(33, R.drawable.ic_pets),\n    WORLD(34, R.drawable.ic_public),\n    STAR(35, R.drawable.ic_stars),\n    SUN(36, R.drawable.ic_wb_sunny),\n    RSS(37, R.drawable.ic_rss_feed),\n    WHATS_NEW(38, R.drawable.ic_subscriptions);\n\n    @DrawableRes\n    fun getDrawableRes(): Int {\n        return drawableResource\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/ImportConfirmationDialog.java",
    "content": "package org.schabi.newpipe.local.subscription;\n\nimport android.app.Dialog;\nimport android.os.Bundle;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.core.os.BundleCompat;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.fragment.app.Fragment;\nimport androidx.work.Constraints;\nimport androidx.work.ExistingWorkPolicy;\nimport androidx.work.NetworkType;\nimport androidx.work.OneTimeWorkRequest;\nimport androidx.work.OutOfQuotaPolicy;\nimport androidx.work.WorkManager;\n\nimport com.livefront.bridge.Bridge;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.local.subscription.workers.SubscriptionImportInput;\nimport org.schabi.newpipe.local.subscription.workers.SubscriptionImportWorker;\n\npublic class ImportConfirmationDialog extends DialogFragment {\n    private static final String INPUT = \"input\";\n\n    public static void show(@NonNull final Fragment fragment, final SubscriptionImportInput input) {\n        final var confirmationDialog = new ImportConfirmationDialog();\n        final var arguments = new Bundle();\n        arguments.putParcelable(INPUT, input);\n        confirmationDialog.setArguments(arguments);\n        confirmationDialog.show(fragment.getParentFragmentManager(), null);\n    }\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {\n        final var context = requireContext();\n        return new AlertDialog.Builder(context)\n                .setMessage(R.string.import_network_expensive_warning)\n                .setCancelable(true)\n                .setNegativeButton(R.string.cancel, null)\n                .setPositiveButton(R.string.ok, (dialogInterface, i) -> {\n                    final var constraints = new Constraints.Builder()\n                            .setRequiredNetworkType(NetworkType.CONNECTED)\n                            .build();\n                    final var input = BundleCompat.getParcelable(requireArguments(), INPUT,\n                            SubscriptionImportInput.class);\n\n                    final var req = new OneTimeWorkRequest.Builder(SubscriptionImportWorker.class)\n                            .setInputData(input.toData())\n                            .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)\n                            .setConstraints(constraints)\n                            .build();\n\n                    WorkManager.getInstance(context)\n                            .enqueueUniqueWork(SubscriptionImportWorker.WORK_NAME,\n                                    ExistingWorkPolicy.APPEND_OR_REPLACE, req);\n\n                    dismiss();\n                })\n                .create();\n    }\n\n    @Override\n    public void onCreate(@Nullable final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        Bridge.restoreInstanceState(this, savedInstanceState);\n    }\n\n    @Override\n    public void onSaveInstanceState(@NonNull final Bundle outState) {\n        super.onSaveInstanceState(outState);\n        Bridge.saveInstanceState(this, outState);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt",
    "content": "package org.schabi.newpipe.local.subscription\n\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.SubMenu\nimport android.view.View\nimport android.view.ViewGroup\nimport android.webkit.MimeTypeMap\nimport android.widget.Toast\nimport androidx.annotation.StringRes\nimport androidx.appcompat.app.AlertDialog\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.GridLayoutManager\nimport com.evernote.android.state.State\nimport com.xwray.groupie.Group\nimport com.xwray.groupie.GroupAdapter\nimport com.xwray.groupie.Section\nimport com.xwray.groupie.viewbinding.GroupieViewHolder\nimport io.reactivex.rxjava3.disposables.CompositeDisposable\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity.Companion.GROUP_ALL_ID\nimport org.schabi.newpipe.databinding.DialogTitleBinding\nimport org.schabi.newpipe.databinding.FeedItemCarouselBinding\nimport org.schabi.newpipe.databinding.FragmentSubscriptionBinding\nimport org.schabi.newpipe.error.ErrorInfo\nimport org.schabi.newpipe.error.UserAction\nimport org.schabi.newpipe.extractor.ServiceList\nimport org.schabi.newpipe.extractor.channel.ChannelInfoItem\nimport org.schabi.newpipe.fragments.BaseStateFragment\nimport org.schabi.newpipe.ktx.animate\nimport org.schabi.newpipe.local.subscription.SubscriptionViewModel.SubscriptionState\nimport org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog\nimport org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialog\nimport org.schabi.newpipe.local.subscription.item.ChannelItem\nimport org.schabi.newpipe.local.subscription.item.FeedGroupAddNewGridItem\nimport org.schabi.newpipe.local.subscription.item.FeedGroupAddNewItem\nimport org.schabi.newpipe.local.subscription.item.FeedGroupCardGridItem\nimport org.schabi.newpipe.local.subscription.item.FeedGroupCardItem\nimport org.schabi.newpipe.local.subscription.item.FeedGroupCarouselItem\nimport org.schabi.newpipe.local.subscription.item.GroupsHeader\nimport org.schabi.newpipe.local.subscription.item.Header\nimport org.schabi.newpipe.local.subscription.item.ImportSubscriptionsHintPlaceholderItem\nimport org.schabi.newpipe.util.NavigationHelper\nimport org.schabi.newpipe.util.OnClickGesture\nimport org.schabi.newpipe.util.ServiceHelper\nimport org.schabi.newpipe.util.ThemeHelper.getGridSpanCountChannels\nimport org.schabi.newpipe.util.external_communication.ShareUtils\n\nclass SubscriptionFragment : BaseStateFragment<SubscriptionState>() {\n    private var _binding: FragmentSubscriptionBinding? = null\n    private val binding get() = _binding!!\n\n    private lateinit var viewModel: SubscriptionViewModel\n    private lateinit var subscriptionManager: SubscriptionManager\n    private lateinit var importExportHelper: SubscriptionsImportExportHelper\n    private val disposables: CompositeDisposable = CompositeDisposable()\n\n    private val groupAdapter = GroupAdapter<GroupieViewHolder<FeedItemCarouselBinding>>()\n    private lateinit var carouselAdapter: GroupAdapter<GroupieViewHolder<FeedItemCarouselBinding>>\n    private lateinit var feedGroupsCarousel: FeedGroupCarouselItem\n    private lateinit var feedGroupsSortMenuItem: GroupsHeader\n    private val subscriptionsSection = Section()\n\n    @State\n    @JvmField\n    var itemsListState: Parcelable? = null\n\n    @State\n    @JvmField\n    var feedGroupsCarouselState: Parcelable? = null\n\n    init {\n        setHasOptionsMenu(true)\n    }\n\n    // /////////////////////////////////////////////////////////////////////////\n    // Fragment LifeCycle\n    // /////////////////////////////////////////////////////////////////////////\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n        subscriptionManager = SubscriptionManager(requireContext())\n        importExportHelper = SubscriptionsImportExportHelper(this)\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        return inflater.inflate(R.layout.fragment_subscription, container, false)\n    }\n\n    override fun onPause() {\n        super.onPause()\n        itemsListState = binding.itemsList.layoutManager?.onSaveInstanceState()\n        feedGroupsCarouselState = feedGroupsCarousel.onSaveInstanceState()\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _binding = null\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        disposables.dispose()\n    }\n\n    // ////////////////////////////////////////////////////////////////////////\n    // Menu\n    // ////////////////////////////////////////////////////////////////////////\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        super.onCreateOptionsMenu(menu, inflater)\n\n        activity.supportActionBar?.setDisplayShowTitleEnabled(true)\n        activity.supportActionBar?.setTitle(R.string.tab_subscriptions)\n\n        buildImportExportMenu(menu)\n    }\n\n    private fun buildImportExportMenu(menu: Menu) {\n        // -- Import --\n        val importSubMenu = menu.addSubMenu(R.string.import_from)\n\n        addMenuItemToSubmenu(importSubMenu, R.string.previous_export) { importExportHelper.onImportPreviousSelected() }\n            .setIcon(R.drawable.ic_backup)\n\n        for (service in ServiceList.all()) {\n            val subscriptionExtractor = service.subscriptionExtractor ?: continue\n\n            val supportedSources = subscriptionExtractor.supportedSources\n            if (supportedSources.isEmpty()) continue\n\n            addMenuItemToSubmenu(importSubMenu, service.serviceInfo.name) {\n                onImportFromServiceSelected(service.serviceId)\n            }\n                .setIcon(ServiceHelper.getIcon(service.serviceId))\n        }\n\n        // -- Export --\n        val exportSubMenu = menu.addSubMenu(R.string.export_to)\n\n        addMenuItemToSubmenu(exportSubMenu, R.string.file) { importExportHelper.onExportSelected() }\n            .setIcon(R.drawable.ic_save)\n    }\n\n    private fun addMenuItemToSubmenu(\n        subMenu: SubMenu,\n        @StringRes title: Int,\n        onClick: Runnable\n    ): MenuItem {\n        return setClickListenerToMenuItem(subMenu.add(title), onClick)\n    }\n\n    private fun addMenuItemToSubmenu(\n        subMenu: SubMenu,\n        title: String,\n        onClick: Runnable\n    ): MenuItem {\n        return setClickListenerToMenuItem(subMenu.add(title), onClick)\n    }\n\n    private fun setClickListenerToMenuItem(\n        menuItem: MenuItem,\n        onClick: Runnable\n    ): MenuItem {\n        menuItem.setOnMenuItemClickListener {\n            onClick.run()\n            true\n        }\n        return menuItem\n    }\n\n    private fun onImportFromServiceSelected(serviceId: Int) {\n        val fragmentManager = fm\n        NavigationHelper.openSubscriptionsImportFragment(fragmentManager, serviceId)\n    }\n\n    private fun openReorderDialog() {\n        FeedGroupReorderDialog().show(parentFragmentManager, null)\n    }\n\n    // ////////////////////////////////////////////////////////////////////////\n    // Fragment Views\n    // ////////////////////////////////////////////////////////////////////////\n\n    override fun initViews(rootView: View, savedInstanceState: Bundle?) {\n        super.initViews(rootView, savedInstanceState)\n        _binding = FragmentSubscriptionBinding.bind(rootView)\n\n        groupAdapter.spanCount = if (SubscriptionViewModel.shouldUseGridForSubscription(requireContext())) getGridSpanCountChannels(context) else 1\n        binding.itemsList.layoutManager = GridLayoutManager(requireContext(), groupAdapter.spanCount).apply {\n            spanSizeLookup = groupAdapter.spanSizeLookup\n        }\n        binding.itemsList.adapter = groupAdapter\n        binding.itemsList.itemAnimator = null\n\n        viewModel = ViewModelProvider(this)[SubscriptionViewModel::class.java]\n        viewModel.stateLiveData.observe(viewLifecycleOwner) { it?.let(this::handleResult) }\n        viewModel.feedGroupsLiveData.observe(viewLifecycleOwner) {\n            it?.let { (groups, listViewMode) ->\n                handleFeedGroups(groups, listViewMode)\n            }\n        }\n\n        setupInitialLayout()\n    }\n\n    private fun setupInitialLayout() {\n        Section().apply {\n            carouselAdapter = GroupAdapter<GroupieViewHolder<FeedItemCarouselBinding>>()\n\n            carouselAdapter.setOnItemClickListener { item, _ ->\n                when (item) {\n                    is FeedGroupCardItem ->\n                        NavigationHelper.openFeedFragment(fm, item.groupId, item.name)\n\n                    is FeedGroupCardGridItem ->\n                        NavigationHelper.openFeedFragment(fm, item.groupId, item.name)\n\n                    is FeedGroupAddNewItem ->\n                        FeedGroupDialog.newInstance().show(fm, null)\n\n                    is FeedGroupAddNewGridItem ->\n                        FeedGroupDialog.newInstance().show(fm, null)\n                }\n            }\n            carouselAdapter.setOnItemLongClickListener { item, _ ->\n                if ((item is FeedGroupCardItem && item.groupId == GROUP_ALL_ID) ||\n                    (item is FeedGroupCardGridItem && item.groupId == GROUP_ALL_ID)\n                ) {\n                    return@setOnItemLongClickListener false\n                }\n\n                when (item) {\n                    is FeedGroupCardItem ->\n                        FeedGroupDialog.newInstance(item.groupId).show(fm, null)\n\n                    is FeedGroupCardGridItem ->\n                        FeedGroupDialog.newInstance(item.groupId).show(fm, null)\n                }\n                return@setOnItemLongClickListener true\n            }\n\n            feedGroupsCarousel = FeedGroupCarouselItem(\n                carouselAdapter = carouselAdapter,\n                listViewMode = viewModel.getListViewMode()\n            )\n\n            feedGroupsSortMenuItem = GroupsHeader(\n                title = getString(R.string.feed_groups_header_title),\n                onSortClicked = ::openReorderDialog,\n                onToggleListViewModeClicked = ::toggleListViewMode,\n                listViewMode = viewModel.getListViewMode()\n            )\n\n            add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarousel)))\n            groupAdapter.clear()\n            groupAdapter.add(this)\n        }\n\n        subscriptionsSection.setPlaceholder(ImportSubscriptionsHintPlaceholderItem())\n        subscriptionsSection.setHideWhenEmpty(true)\n\n        groupAdapter.add(\n            Section(\n                Header(getString(R.string.tab_subscriptions)),\n                listOf(subscriptionsSection)\n            )\n        )\n    }\n\n    private fun toggleListViewMode() {\n        viewModel.setListViewMode(!viewModel.getListViewMode())\n    }\n\n    private fun showLongTapDialog(selectedItem: ChannelInfoItem) {\n        val commands = arrayOf(\n            getString(R.string.share),\n            getString(R.string.open_in_browser),\n            getString(R.string.unsubscribe)\n        )\n\n        val actions = DialogInterface.OnClickListener { _, i ->\n            when (i) {\n                0 -> ShareUtils.shareText(\n                    requireContext(),\n                    selectedItem.name,\n                    selectedItem.url,\n                    selectedItem.thumbnails\n                )\n\n                1 -> ShareUtils.openUrlInBrowser(requireContext(), selectedItem.url)\n\n                2 -> deleteChannel(selectedItem)\n            }\n        }\n\n        val dialogTitleBinding = DialogTitleBinding.inflate(LayoutInflater.from(requireContext()))\n        dialogTitleBinding.root.isSelected = true\n        dialogTitleBinding.itemTitleView.text = selectedItem.name\n        dialogTitleBinding.itemAdditionalDetails.visibility = View.GONE\n\n        AlertDialog.Builder(requireContext())\n            .setCustomTitle(dialogTitleBinding.root)\n            .setItems(commands, actions)\n            .show()\n    }\n\n    private fun deleteChannel(selectedItem: ChannelInfoItem) {\n        disposables.add(\n            subscriptionManager.deleteSubscription(selectedItem.serviceId, selectedItem.url).subscribe {\n                Toast.makeText(requireContext(), getString(R.string.channel_unsubscribed), Toast.LENGTH_SHORT).show()\n            }\n        )\n    }\n\n    override fun doInitialLoadLogic() = Unit\n    override fun startLoading(forceLoad: Boolean) = Unit\n\n    private val listenerChannelItem = object : OnClickGesture<ChannelInfoItem> {\n        override fun selected(selectedItem: ChannelInfoItem) = NavigationHelper.openChannelFragment(\n            fm,\n            selectedItem.serviceId,\n            selectedItem.url,\n            selectedItem.name\n        )\n\n        override fun held(selectedItem: ChannelInfoItem) = showLongTapDialog(selectedItem)\n    }\n\n    override fun handleResult(result: SubscriptionState) {\n        super.handleResult(result)\n\n        when (result) {\n            is SubscriptionState.LoadedState -> {\n                result.subscriptions.forEach {\n                    if (it is ChannelItem) {\n                        it.gesturesListener = listenerChannelItem\n                        it.itemVersion = if (SubscriptionViewModel.shouldUseGridForSubscription(requireContext())) {\n                            ChannelItem.ItemVersion.GRID\n                        } else {\n                            ChannelItem.ItemVersion.MINI\n                        }\n                    }\n                }\n\n                subscriptionsSection.update(result.subscriptions)\n                subscriptionsSection.setHideWhenEmpty(false)\n\n                if (itemsListState != null) {\n                    binding.itemsList.layoutManager?.onRestoreInstanceState(itemsListState)\n                    itemsListState = null\n                }\n            }\n\n            is SubscriptionState.ErrorState -> {\n                result.error?.let {\n                    showError(ErrorInfo(result.error, UserAction.SOMETHING_ELSE, \"Subscriptions\"))\n                }\n            }\n        }\n    }\n\n    private fun handleFeedGroups(groups: List<Group>, listViewMode: Boolean) {\n        if (feedGroupsCarouselState != null) {\n            feedGroupsCarousel.onRestoreInstanceState(feedGroupsCarouselState)\n            feedGroupsCarouselState = null\n        }\n\n        binding.itemsList.post {\n            if (context == null) {\n                // since this part was posted to the next UI cycle, the fragment might have been\n                // removed in the meantime\n                return@post\n            }\n\n            feedGroupsCarousel.listViewMode = listViewMode\n            feedGroupsSortMenuItem.showSortButton = groups.size > 1\n            feedGroupsSortMenuItem.listViewMode = listViewMode\n            feedGroupsCarousel.notifyChanged(FeedGroupCarouselItem.PAYLOAD_UPDATE_LIST_VIEW_MODE)\n            feedGroupsSortMenuItem.notifyChanged(GroupsHeader.PAYLOAD_UPDATE_ICONS)\n\n            // update items here to prevent flickering\n            carouselAdapter.apply {\n                clear()\n                if (listViewMode) {\n                    add(FeedGroupAddNewItem())\n                    add(FeedGroupCardItem(GROUP_ALL_ID, getString(R.string.all), FeedGroupIcon.WHATS_NEW))\n                } else {\n                    add(FeedGroupAddNewGridItem())\n                    add(FeedGroupCardGridItem(GROUP_ALL_ID, getString(R.string.all), FeedGroupIcon.WHATS_NEW))\n                }\n                addAll(groups)\n            }\n        }\n    }\n\n    // /////////////////////////////////////////////////////////////////////////\n    // Contract\n    // /////////////////////////////////////////////////////////////////////////\n\n    override fun showLoading() {\n        super.showLoading()\n        binding.itemsList.animate(false, 100)\n    }\n\n    override fun hideLoading() {\n        super.hideLoading()\n        binding.itemsList.animate(true, 200)\n    }\n\n    companion object {\n        val JSON_MIME_TYPE = MimeTypeMap.getSingleton()\n            .getMimeTypeFromExtension(\"json\") ?: \"application/octet-stream\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt",
    "content": "package org.schabi.newpipe.local.subscription\n\nimport android.content.Context\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.core.Completable\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport org.schabi.newpipe.NewPipeDatabase\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.database.subscription.NotificationMode\nimport org.schabi.newpipe.database.subscription.SubscriptionDAO\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\nimport org.schabi.newpipe.extractor.channel.ChannelInfo\nimport org.schabi.newpipe.extractor.channel.tabs.ChannelTabInfo\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.local.feed.FeedDatabaseManager\nimport org.schabi.newpipe.local.feed.service.FeedUpdateInfo\nimport org.schabi.newpipe.util.ExtractorHelper\nimport org.schabi.newpipe.util.image.ImageStrategy\n\nclass SubscriptionManager(context: Context) {\n    private val database = NewPipeDatabase.getInstance(context)\n    private val subscriptionTable = database.subscriptionDAO()\n    private val feedDatabaseManager = FeedDatabaseManager(context)\n\n    fun subscriptionTable(): SubscriptionDAO = subscriptionTable\n    fun subscriptions() = subscriptionTable.getAll()\n\n    fun getSubscriptions(\n        currentGroupId: Long = FeedGroupEntity.GROUP_ALL_ID,\n        filterQuery: String = \"\",\n        showOnlyUngrouped: Boolean = false\n    ): Flowable<List<SubscriptionEntity>> {\n        return when {\n            filterQuery.isNotEmpty() -> {\n                return if (showOnlyUngrouped) {\n                    subscriptionTable.getSubscriptionsOnlyUngroupedFiltered(\n                        currentGroupId,\n                        filterQuery\n                    )\n                } else {\n                    subscriptionTable.getSubscriptionsFiltered(filterQuery)\n                }\n            }\n\n            showOnlyUngrouped -> subscriptionTable.getSubscriptionsOnlyUngrouped(currentGroupId)\n\n            else -> subscriptionTable.getAll()\n        }\n    }\n\n    fun upsertAll(infoList: List<Pair<ChannelInfo, ChannelTabInfo>>) {\n        val listEntities = infoList.map { SubscriptionEntity.from(it.first) }\n        subscriptionTable.upsertAll(listEntities)\n\n        database.runInTransaction {\n            infoList.forEachIndexed { index, info ->\n                val streams = info.second.relatedItems.filterIsInstance<StreamInfoItem>()\n                feedDatabaseManager.upsertAll(listEntities[index].uid, streams)\n            }\n        }\n    }\n\n    fun updateChannelInfo(info: ChannelInfo): Completable = subscriptionTable.getSubscription(info.serviceId, info.url)\n        .flatMapCompletable {\n            Completable.fromRunnable {\n                it.apply {\n                    name = info.name\n                    avatarUrl = ImageStrategy.imageListToDbUrl(info.avatars)\n                    description = info.description\n                    subscriberCount = info.subscriberCount\n                }\n                subscriptionTable.update(it)\n            }\n        }\n\n    fun updateNotificationMode(serviceId: Int, url: String, @NotificationMode mode: Int): Completable {\n        return subscriptionTable().getSubscription(serviceId, url)\n            .flatMapCompletable { entity: SubscriptionEntity ->\n                Completable.fromAction {\n                    entity.notificationMode = mode\n                    subscriptionTable().update(entity)\n                }.apply {\n                    if (mode != NotificationMode.DISABLED) {\n                        // notifications have just been enabled, mark all streams as \"old\"\n                        andThen(rememberAllStreams(entity))\n                    }\n                }\n            }\n    }\n\n    fun updateFromInfo(info: FeedUpdateInfo) {\n        val subscriptionEntity = subscriptionTable.getSubscription(info.uid)\n\n        subscriptionEntity.name = info.name\n\n        // some services do not provide an avatar URL\n        info.avatarUrl?.let { subscriptionEntity.avatarUrl = it }\n\n        // these two fields are null if the feed info was fetched using the fast feed method\n        info.description?.let { subscriptionEntity.description = it }\n        info.subscriberCount?.let { subscriptionEntity.subscriberCount = it }\n\n        subscriptionTable.update(subscriptionEntity)\n    }\n\n    fun deleteSubscription(serviceId: Int, url: String): Completable {\n        return Completable.fromCallable { subscriptionTable.deleteSubscription(serviceId, url) }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n    }\n\n    fun insertSubscription(subscriptionEntity: SubscriptionEntity) {\n        subscriptionTable.insert(subscriptionEntity)\n    }\n\n    fun deleteSubscription(subscriptionEntity: SubscriptionEntity) {\n        subscriptionTable.delete(subscriptionEntity)\n    }\n\n    /**\n     * Fetches the list of videos for the provided channel and saves them in the database, so that\n     * they will be considered as \"old\"/\"already seen\" streams and the user will never be notified\n     * about any one of them.\n     */\n    private fun rememberAllStreams(subscription: SubscriptionEntity): Completable {\n        return ExtractorHelper.getChannelInfo(subscription.serviceId, subscription.url, false)\n            .flatMap { info ->\n                ExtractorHelper.getChannelTab(subscription.serviceId, info.tabs.first(), false)\n            }\n            .map { channel -> channel.relatedItems.filterIsInstance<StreamInfoItem>().map { stream -> StreamEntity(stream) } }\n            .flatMapCompletable { entities ->\n                Completable.fromAction {\n                    database.streamDAO().upsertAll(entities)\n                }\n            }.onErrorComplete()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionViewModel.kt",
    "content": "package org.schabi.newpipe.local.subscription\n\nimport android.app.Application\nimport android.content.Context\nimport androidx.lifecycle.AndroidViewModel\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport com.xwray.groupie.Group\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.processors.BehaviorProcessor\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport java.util.concurrent.TimeUnit\nimport org.schabi.newpipe.info_list.ItemViewMode\nimport org.schabi.newpipe.local.feed.FeedDatabaseManager\nimport org.schabi.newpipe.local.subscription.item.ChannelItem\nimport org.schabi.newpipe.local.subscription.item.FeedGroupCardGridItem\nimport org.schabi.newpipe.local.subscription.item.FeedGroupCardItem\nimport org.schabi.newpipe.util.DEFAULT_THROTTLE_TIMEOUT\nimport org.schabi.newpipe.util.ThemeHelper.getItemViewMode\n\nclass SubscriptionViewModel(application: Application) : AndroidViewModel(application) {\n    private var feedDatabaseManager: FeedDatabaseManager = FeedDatabaseManager(application)\n    private var subscriptionManager = SubscriptionManager(application)\n\n    // true -> list view, false -> grid view\n    private val listViewMode = BehaviorProcessor.createDefault(\n        !shouldUseGridForSubscription(application)\n    )\n    private val listViewModeFlowable = listViewMode.distinctUntilChanged()\n\n    private val mutableStateLiveData = MutableLiveData<SubscriptionState>()\n    private val mutableFeedGroupsLiveData = MutableLiveData<Pair<List<Group>, Boolean>>()\n    val stateLiveData: LiveData<SubscriptionState> = mutableStateLiveData\n    val feedGroupsLiveData: LiveData<Pair<List<Group>, Boolean>> = mutableFeedGroupsLiveData\n\n    private var feedGroupItemsDisposable = Flowable\n        .combineLatest(\n            feedDatabaseManager.groups(),\n            listViewModeFlowable,\n            ::Pair\n        )\n        .throttleLatest(DEFAULT_THROTTLE_TIMEOUT, TimeUnit.MILLISECONDS)\n        .map { (feedGroups, listViewMode) ->\n            Pair(\n                feedGroups.map(if (listViewMode) ::FeedGroupCardItem else ::FeedGroupCardGridItem),\n                listViewMode\n            )\n        }\n        .subscribeOn(Schedulers.io())\n        .subscribe(\n            { mutableFeedGroupsLiveData.postValue(it) },\n            { mutableStateLiveData.postValue(SubscriptionState.ErrorState(it)) }\n        )\n\n    private var stateItemsDisposable = subscriptionManager.subscriptions()\n        .throttleLatest(DEFAULT_THROTTLE_TIMEOUT, TimeUnit.MILLISECONDS)\n        .map { it.map { entity -> ChannelItem(entity.toChannelInfoItem(), entity.uid, ChannelItem.ItemVersion.MINI) } }\n        .subscribeOn(Schedulers.io())\n        .subscribe(\n            { mutableStateLiveData.postValue(SubscriptionState.LoadedState(it)) },\n            { mutableStateLiveData.postValue(SubscriptionState.ErrorState(it)) }\n        )\n\n    override fun onCleared() {\n        super.onCleared()\n        stateItemsDisposable.dispose()\n        feedGroupItemsDisposable.dispose()\n    }\n\n    fun setListViewMode(newListViewMode: Boolean) {\n        listViewMode.onNext(newListViewMode)\n    }\n\n    fun getListViewMode(): Boolean {\n        return listViewMode.value ?: true\n    }\n\n    sealed class SubscriptionState {\n        data class LoadedState(val subscriptions: List<Group>) : SubscriptionState()\n        data class ErrorState(val error: Throwable? = null) : SubscriptionState()\n    }\n\n    companion object {\n\n        /**\n         * Returns whether to use GridLayout mode for Subscription Fragment.\n         *\n         * ### Current mapping:\n         *\n         *  | ItemViewMode | ItemVersion | Span count |\n         *  |---|---|---|\n         *  | AUTO | MINI | 1 |\n         *  | LIST | MINI | 1 |\n         *  | CARD | GRID | > 1 (ThemeHelper defined) |\n         *  | GRID | GRID | > 1 (ThemeHelper defined) |\n         *\n         *  @see [SubscriptionViewModel.shouldUseGridForSubscription] to modify Layout Manager\n         */\n        fun shouldUseGridForSubscription(context: Context): Boolean {\n            val itemViewMode = getItemViewMode(context)\n            return itemViewMode == ItemViewMode.GRID || itemViewMode == ItemViewMode.CARD\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionsImportExportHelper.kt",
    "content": "package org.schabi.newpipe.local.subscription\n\nimport android.app.Activity\nimport android.content.Context\nimport androidx.activity.result.ActivityResult\nimport androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult\nimport androidx.fragment.app.Fragment\nimport java.text.SimpleDateFormat\nimport java.util.Date\nimport java.util.Locale\nimport org.schabi.newpipe.local.subscription.SubscriptionFragment.Companion.JSON_MIME_TYPE\nimport org.schabi.newpipe.local.subscription.workers.SubscriptionExportWorker\nimport org.schabi.newpipe.local.subscription.workers.SubscriptionImportInput\nimport org.schabi.newpipe.streams.io.NoFileManagerSafeGuard\nimport org.schabi.newpipe.streams.io.StoredFileHelper\n\n/**\n * This class has to be created in onAttach() or onCreate().\n *\n * It contains registerForActivityResult calls and those\n * calls are only allowed before a fragment/activity is created.\n */\nclass SubscriptionsImportExportHelper(\n    val fragment: Fragment\n) {\n    val context: Context = fragment.requireContext()\n\n    companion object {\n        val TAG: String =\n            SubscriptionsImportExportHelper::class.java.simpleName + \"@\" + Integer.toHexString(\n                hashCode()\n            )\n    }\n\n    private val requestExportLauncher =\n        fragment.registerForActivityResult(StartActivityForResult(), this::requestExportResult)\n    private val requestImportLauncher =\n        fragment.registerForActivityResult(StartActivityForResult(), this::requestImportResult)\n\n    private fun requestExportResult(result: ActivityResult) {\n        val data = result.data?.data\n        if (data != null && result.resultCode == Activity.RESULT_OK) {\n            SubscriptionExportWorker.schedule(context, data)\n        }\n    }\n\n    private fun requestImportResult(result: ActivityResult) {\n        val data = result.data?.dataString\n        if (data != null && result.resultCode == Activity.RESULT_OK) {\n            ImportConfirmationDialog.show(\n                fragment,\n                SubscriptionImportInput.PreviousExportMode(data)\n            )\n        }\n    }\n\n    fun onExportSelected() {\n        val date = SimpleDateFormat(\"yyyyMMddHHmm\", Locale.ENGLISH).format(Date())\n        val exportName = \"newpipe_subscriptions_$date.json\"\n\n        NoFileManagerSafeGuard.launchSafe(\n            requestExportLauncher,\n            StoredFileHelper.getNewPicker(\n                context,\n                exportName,\n                JSON_MIME_TYPE,\n                null\n            ),\n            TAG,\n            context\n        )\n    }\n\n    fun onImportPreviousSelected() {\n        NoFileManagerSafeGuard.launchSafe(\n            requestImportLauncher,\n            StoredFileHelper.getPicker(context, JSON_MIME_TYPE),\n            TAG,\n            context\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionsImportFragment.java",
    "content": "package org.schabi.newpipe.local.subscription;\n\nimport static org.schabi.newpipe.extractor.subscription.SubscriptionExtractor.ContentSource.CHANNEL_URL;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport android.text.util.Linkify;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.EditText;\nimport android.widget.TextView;\n\nimport androidx.activity.result.ActivityResult;\nimport androidx.activity.result.ActivityResultLauncher;\nimport androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.core.text.util.LinkifyCompat;\n\nimport com.evernote.android.state.State;\n\nimport org.schabi.newpipe.BaseFragment;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.extractor.subscription.SubscriptionExtractor;\nimport org.schabi.newpipe.local.subscription.workers.SubscriptionImportInput;\nimport org.schabi.newpipe.streams.io.NoFileManagerSafeGuard;\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\nimport org.schabi.newpipe.util.Constants;\nimport org.schabi.newpipe.util.ServiceHelper;\n\nimport java.util.Collections;\nimport java.util.List;\n\npublic class SubscriptionsImportFragment extends BaseFragment {\n    @State\n    int currentServiceId = Constants.NO_SERVICE_ID;\n\n    private List<SubscriptionExtractor.ContentSource> supportedSources;\n    private String relatedUrl;\n\n    @StringRes\n    private int instructionsString;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Views\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private TextView infoTextView;\n    private EditText inputText;\n    private Button inputButton;\n\n    private final ActivityResultLauncher<Intent> requestImportFileLauncher =\n            registerForActivityResult(new StartActivityForResult(), this::requestImportFileResult);\n\n    public static SubscriptionsImportFragment getInstance(final int serviceId) {\n        final SubscriptionsImportFragment instance = new SubscriptionsImportFragment();\n        instance.setInitialData(serviceId);\n        return instance;\n    }\n\n    private void setInitialData(final int serviceId) {\n        this.currentServiceId = serviceId;\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Fragment LifeCycle\n    ///////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        setupServiceVariables();\n        if (supportedSources.isEmpty() && currentServiceId != Constants.NO_SERVICE_ID) {\n            ErrorUtil.showSnackbar(activity,\n                    new ErrorInfo(new String[]{}, UserAction.SUBSCRIPTION_IMPORT_EXPORT,\n                            \"Service does not support importing subscriptions\",\n                            currentServiceId,\n                            R.string.general_error));\n            activity.finish();\n        }\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        setTitle(getString(R.string.import_title));\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater,\n                             @Nullable final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_import, container, false);\n    }\n\n    /*/////////////////////////////////////////////////////////////////////////\n    // Fragment Views\n    /////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    protected void initViews(final View rootView, final Bundle savedInstanceState) {\n        super.initViews(rootView, savedInstanceState);\n\n        inputButton = rootView.findViewById(R.id.input_button);\n        inputText = rootView.findViewById(R.id.input_text);\n\n        infoTextView = rootView.findViewById(R.id.info_text_view);\n\n        // TODO: Support services that can import from more than one source\n        //  (show the option to the user)\n        if (supportedSources.contains(CHANNEL_URL)) {\n            inputButton.setText(R.string.import_title);\n            inputText.setVisibility(View.VISIBLE);\n            inputText.setHint(ServiceHelper.getImportInstructionsHint(currentServiceId));\n        } else {\n            inputButton.setText(R.string.import_file_title);\n        }\n\n        if (instructionsString != 0) {\n            if (TextUtils.isEmpty(relatedUrl)) {\n                setInfoText(getString(instructionsString));\n            } else {\n                setInfoText(getString(instructionsString, relatedUrl));\n            }\n        } else {\n            setInfoText(\"\");\n        }\n\n        final ActionBar supportActionBar = activity.getSupportActionBar();\n        if (supportActionBar != null) {\n            supportActionBar.setDisplayShowTitleEnabled(true);\n            setTitle(getString(R.string.import_title));\n        }\n    }\n\n    @Override\n    protected void initListeners() {\n        super.initListeners();\n        inputButton.setOnClickListener(v -> onImportClicked());\n    }\n\n    private void onImportClicked() {\n        if (inputText.getVisibility() == View.VISIBLE) {\n            final String value = inputText.getText().toString();\n            if (!value.isEmpty()) {\n                onImportUrl(value);\n            }\n        } else {\n            onImportFile();\n        }\n    }\n\n    public void onImportUrl(final String value) {\n        ImportConfirmationDialog.show(this,\n                new SubscriptionImportInput.ChannelUrlMode(currentServiceId, value));\n    }\n\n    public void onImportFile() {\n        NoFileManagerSafeGuard.launchSafe(\n                requestImportFileLauncher,\n                // leave */* mime type to support all services\n                // with different mime types and file extensions\n                StoredFileHelper.getPicker(activity, \"*/*\"),\n                TAG,\n                getContext()\n        );\n    }\n\n    private void requestImportFileResult(final ActivityResult result) {\n        final String data = result.getData() != null ? result.getData().getDataString() : null;\n        if (result.getResultCode() == Activity.RESULT_OK && data != null) {\n            ImportConfirmationDialog.show(this,\n                    new SubscriptionImportInput.InputStreamMode(currentServiceId, data));\n        }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////\n    // Subscriptions\n    ///////////////////////////////////////////////////////////////////////////\n\n    private void setupServiceVariables() {\n        if (currentServiceId != Constants.NO_SERVICE_ID) {\n            try {\n                final SubscriptionExtractor extractor = NewPipe.getService(currentServiceId)\n                        .getSubscriptionExtractor();\n                supportedSources = extractor.getSupportedSources();\n                relatedUrl = extractor.getRelatedUrl();\n                instructionsString = ServiceHelper.getImportInstructions(currentServiceId);\n                return;\n            } catch (final ExtractionException ignored) {\n            }\n        }\n\n        supportedSources = Collections.emptyList();\n        relatedUrl = null;\n        instructionsString = 0;\n    }\n\n    private void setInfoText(final String infoString) {\n        infoTextView.setText(infoString);\n        LinkifyCompat.addLinks(infoTextView, Linkify.WEB_URLS);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt",
    "content": "package org.schabi.newpipe.local.subscription.dialog\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.inputmethod.InputMethodManager\nimport android.widget.Toast\nimport androidx.core.content.getSystemService\nimport androidx.core.os.bundleOf\nimport androidx.core.view.isGone\nimport androidx.core.view.isVisible\nimport androidx.core.widget.doOnTextChanged\nimport androidx.fragment.app.DialogFragment\nimport androidx.lifecycle.Observer\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.evernote.android.state.State\nimport com.livefront.bridge.Bridge\nimport com.xwray.groupie.GroupieAdapter\nimport com.xwray.groupie.OnItemClickListener\nimport com.xwray.groupie.Section\nimport java.io.Serializable\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.databinding.DialogFeedGroupCreateBinding\nimport org.schabi.newpipe.databinding.ToolbarSearchLayoutBinding\nimport org.schabi.newpipe.fragments.BackPressable\nimport org.schabi.newpipe.local.subscription.FeedGroupIcon\nimport org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog.ScreenState.DeleteScreen\nimport org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog.ScreenState.IconPickerScreen\nimport org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog.ScreenState.InitialScreen\nimport org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog.ScreenState.SubscriptionsPickerScreen\nimport org.schabi.newpipe.local.subscription.dialog.FeedGroupDialogViewModel.DialogEvent.ProcessingEvent\nimport org.schabi.newpipe.local.subscription.dialog.FeedGroupDialogViewModel.DialogEvent.SuccessEvent\nimport org.schabi.newpipe.local.subscription.item.ImportSubscriptionsHintPlaceholderItem\nimport org.schabi.newpipe.local.subscription.item.PickerIconItem\nimport org.schabi.newpipe.local.subscription.item.PickerSubscriptionItem\nimport org.schabi.newpipe.util.DeviceUtils\nimport org.schabi.newpipe.util.ThemeHelper\n\nclass FeedGroupDialog : DialogFragment(), BackPressable {\n    private var _feedGroupCreateBinding: DialogFeedGroupCreateBinding? = null\n    private val feedGroupCreateBinding get() = _feedGroupCreateBinding!!\n\n    private var _searchLayoutBinding: ToolbarSearchLayoutBinding? = null\n    private val searchLayoutBinding get() = _searchLayoutBinding!!\n\n    private lateinit var viewModel: FeedGroupDialogViewModel\n    private var groupId: Long = NO_GROUP_SELECTED\n    private var groupIcon: FeedGroupIcon? = null\n    private var groupSortOrder: Long = -1\n\n    sealed class ScreenState : Serializable {\n        data object InitialScreen : ScreenState()\n        data object IconPickerScreen : ScreenState()\n        data object SubscriptionsPickerScreen : ScreenState()\n        data object DeleteScreen : ScreenState()\n    }\n\n    @State\n    @JvmField\n    var selectedIcon: FeedGroupIcon? = null\n\n    @State\n    @JvmField\n    var selectedSubscriptions: HashSet<Long> = HashSet()\n\n    @State\n    @JvmField\n    var wasSubscriptionSelectionChanged: Boolean = false\n\n    @State\n    @JvmField\n    var currentScreen: ScreenState = InitialScreen\n\n    @State\n    @JvmField\n    var subscriptionsListState: Parcelable? = null\n\n    @State\n    @JvmField\n    var iconsListState: Parcelable? = null\n\n    @State\n    @JvmField\n    var wasSearchSubscriptionsVisible = false\n\n    @State\n    @JvmField\n    var subscriptionsCurrentSearchQuery = \"\"\n\n    @State\n    @JvmField\n    var subscriptionsShowOnlyUngrouped = false\n\n    private val subscriptionMainSection = Section()\n    private val subscriptionEmptyFooter = Section()\n    private lateinit var subscriptionGroupAdapter: GroupieAdapter\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        Bridge.restoreInstanceState(this, savedInstanceState)\n\n        setStyle(STYLE_NO_TITLE, ThemeHelper.getMinWidthDialogTheme(requireContext()))\n        groupId = arguments?.getLong(KEY_GROUP_ID, NO_GROUP_SELECTED) ?: NO_GROUP_SELECTED\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.dialog_feed_group_create, container)\n    }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return object : Dialog(requireActivity(), theme) {\n            override fun onBackPressed() {\n                if (!this@FeedGroupDialog.onBackPressed()) {\n                    super.onBackPressed()\n                }\n            }\n        }\n    }\n\n    override fun onPause() {\n        super.onPause()\n\n        wasSearchSubscriptionsVisible = isSearchVisible()\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n\n        iconsListState = feedGroupCreateBinding.iconSelector.layoutManager?.onSaveInstanceState()\n        subscriptionsListState = feedGroupCreateBinding.subscriptionsSelectorList.layoutManager?.onSaveInstanceState()\n\n        Bridge.saveInstanceState(this, outState)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        _feedGroupCreateBinding = DialogFeedGroupCreateBinding.bind(view)\n        _searchLayoutBinding = feedGroupCreateBinding.subscriptionsHeaderSearchContainer\n\n        viewModel = ViewModelProvider(\n            this,\n            FeedGroupDialogViewModel.getFactory(\n                requireContext(),\n                groupId,\n                subscriptionsCurrentSearchQuery,\n                subscriptionsShowOnlyUngrouped\n            )\n        )[FeedGroupDialogViewModel::class.java]\n\n        viewModel.groupLiveData.observe(viewLifecycleOwner, Observer(::handleGroup))\n        viewModel.subscriptionsLiveData.observe(viewLifecycleOwner) {\n            setupSubscriptionPicker(it.first, it.second)\n        }\n        viewModel.dialogEventLiveData.observe(viewLifecycleOwner) {\n            when (it) {\n                ProcessingEvent -> disableInput()\n                SuccessEvent -> dismiss()\n            }\n        }\n\n        subscriptionGroupAdapter = GroupieAdapter().apply {\n            add(subscriptionMainSection)\n            add(subscriptionEmptyFooter)\n            spanCount = 4\n        }\n        feedGroupCreateBinding.subscriptionsSelectorList.apply {\n            // Disable animations, too distracting.\n            itemAnimator = null\n            adapter = subscriptionGroupAdapter\n            layoutManager = GridLayoutManager(\n                requireContext(),\n                subscriptionGroupAdapter.spanCount,\n                RecyclerView.VERTICAL,\n                false\n            ).apply {\n                spanSizeLookup = subscriptionGroupAdapter.spanSizeLookup\n            }\n        }\n\n        setupIconPicker()\n        setupListeners()\n\n        showScreen(currentScreen)\n\n        if (currentScreen == SubscriptionsPickerScreen && wasSearchSubscriptionsVisible) {\n            showSearch()\n        } else if (currentScreen == InitialScreen && groupId == NO_GROUP_SELECTED) {\n            showKeyboard()\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        feedGroupCreateBinding.subscriptionsSelectorList.adapter = null\n        feedGroupCreateBinding.iconSelector.adapter = null\n\n        _feedGroupCreateBinding = null\n        _searchLayoutBinding = null\n    }\n\n    /*/​//////////////////////////////////////////////////////////////////////////\n    // Setup\n    //​//////////////////////////////////////////////////////////////////////// */\n\n    override fun onBackPressed(): Boolean {\n        if (currentScreen is SubscriptionsPickerScreen && isSearchVisible()) {\n            hideSearch()\n            return true\n        } else if (currentScreen !is InitialScreen) {\n            showScreen(InitialScreen)\n            return true\n        }\n\n        return false\n    }\n\n    private fun setupListeners() {\n        feedGroupCreateBinding.deleteButton.setOnClickListener { showScreen(DeleteScreen) }\n\n        feedGroupCreateBinding.cancelButton.setOnClickListener {\n            when (currentScreen) {\n                InitialScreen -> dismiss()\n                else -> showScreen(InitialScreen)\n            }\n        }\n\n        feedGroupCreateBinding.groupNameInputContainer.error = null\n        feedGroupCreateBinding.groupNameInput.doOnTextChanged { text, _, _, _ ->\n            if (feedGroupCreateBinding.groupNameInputContainer.isErrorEnabled && !text.isNullOrBlank()) {\n                feedGroupCreateBinding.groupNameInputContainer.error = null\n            }\n        }\n\n        feedGroupCreateBinding.confirmButton.setOnClickListener { handlePositiveButton() }\n\n        feedGroupCreateBinding.selectChannelButton.setOnClickListener {\n            feedGroupCreateBinding.subscriptionsSelectorList.scrollToPosition(0)\n            showScreen(SubscriptionsPickerScreen)\n        }\n\n        val headerMenu = feedGroupCreateBinding.subscriptionsHeaderToolbar.menu\n        requireActivity().menuInflater.inflate(R.menu.menu_feed_group_dialog, headerMenu)\n\n        headerMenu.findItem(R.id.action_search).setOnMenuItemClickListener {\n            showSearch()\n            true\n        }\n\n        headerMenu.findItem(R.id.feed_group_toggle_show_only_ungrouped_subscriptions).apply {\n            isChecked = subscriptionsShowOnlyUngrouped\n            setOnMenuItemClickListener {\n                subscriptionsShowOnlyUngrouped = !subscriptionsShowOnlyUngrouped\n                it.isChecked = subscriptionsShowOnlyUngrouped\n                viewModel.toggleShowOnlyUngrouped(subscriptionsShowOnlyUngrouped)\n                true\n            }\n        }\n\n        searchLayoutBinding.toolbarSearchClear.setOnClickListener {\n            if (searchLayoutBinding.toolbarSearchEditText.text.isNullOrEmpty()) {\n                hideSearch()\n                return@setOnClickListener\n            }\n            resetSearch()\n            showKeyboardSearch()\n        }\n\n        searchLayoutBinding.toolbarSearchEditText.setOnClickListener {\n            if (DeviceUtils.isTv(context)) {\n                showKeyboardSearch()\n            }\n        }\n\n        searchLayoutBinding.toolbarSearchEditText.doOnTextChanged { _, _, _, _ ->\n            val newQuery: String = searchLayoutBinding.toolbarSearchEditText.text.toString()\n            subscriptionsCurrentSearchQuery = newQuery\n            viewModel.filterSubscriptionsBy(newQuery)\n        }\n\n        subscriptionGroupAdapter.setOnItemClickListener(subscriptionPickerItemListener)\n    }\n\n    private fun handlePositiveButton() = when {\n        currentScreen is InitialScreen -> handlePositiveButtonInitialScreen()\n        currentScreen is DeleteScreen -> viewModel.deleteGroup()\n        currentScreen is SubscriptionsPickerScreen && isSearchVisible() -> hideSearch()\n        else -> showScreen(InitialScreen)\n    }\n\n    private fun handlePositiveButtonInitialScreen() {\n        val name = feedGroupCreateBinding.groupNameInput.text.toString().trim()\n        val icon = selectedIcon ?: groupIcon ?: FeedGroupIcon.ALL\n\n        if (name.isBlank()) {\n            feedGroupCreateBinding.groupNameInputContainer.error = getString(R.string.feed_group_dialog_empty_name)\n            feedGroupCreateBinding.groupNameInput.text = null\n            feedGroupCreateBinding.groupNameInput.requestFocus()\n            return\n        } else {\n            feedGroupCreateBinding.groupNameInputContainer.error = null\n        }\n\n        if (selectedSubscriptions.isEmpty()) {\n            Toast.makeText(requireContext(), getString(R.string.feed_group_dialog_empty_selection), Toast.LENGTH_SHORT).show()\n            return\n        }\n\n        when (groupId) {\n            NO_GROUP_SELECTED -> viewModel.createGroup(name, icon, selectedSubscriptions)\n            else -> viewModel.updateGroup(name, icon, selectedSubscriptions, groupSortOrder)\n        }\n    }\n\n    private fun handleGroup(feedGroupEntity: FeedGroupEntity? = null) {\n        val icon = feedGroupEntity?.icon ?: FeedGroupIcon.ALL\n        val name = feedGroupEntity?.name ?: \"\"\n        groupIcon = feedGroupEntity?.icon\n        groupSortOrder = feedGroupEntity?.sortOrder ?: -1\n\n        val feedGroupIcon = selectedIcon ?: icon\n        feedGroupCreateBinding.iconPreview.setImageResource(feedGroupIcon.getDrawableRes())\n\n        if (feedGroupCreateBinding.groupNameInput.text.isNullOrBlank()) {\n            feedGroupCreateBinding.groupNameInput.setText(name)\n        }\n    }\n\n    private val subscriptionPickerItemListener = OnItemClickListener { item, view ->\n        if (item is PickerSubscriptionItem) {\n            val subscriptionId = item.subscriptionEntity.uid\n            wasSubscriptionSelectionChanged = true\n\n            val isSelected = if (this.selectedSubscriptions.contains(subscriptionId)) {\n                this.selectedSubscriptions.remove(subscriptionId)\n                false\n            } else {\n                this.selectedSubscriptions.add(subscriptionId)\n                true\n            }\n\n            item.updateSelected(view, isSelected)\n            updateSubscriptionSelectedCount()\n        }\n    }\n\n    private fun setupSubscriptionPicker(\n        subscriptions: List<PickerSubscriptionItem>,\n        selectedSubscriptions: Set<Long>\n    ) {\n        if (!wasSubscriptionSelectionChanged) {\n            this.selectedSubscriptions.addAll(selectedSubscriptions)\n        }\n\n        updateSubscriptionSelectedCount()\n\n        if (subscriptions.isEmpty()) {\n            subscriptionEmptyFooter.clear()\n            subscriptionEmptyFooter.add(ImportSubscriptionsHintPlaceholderItem())\n        } else {\n            subscriptionEmptyFooter.clear()\n        }\n\n        subscriptions.forEach {\n            it.isSelected = this@FeedGroupDialog.selectedSubscriptions\n                .contains(it.subscriptionEntity.uid)\n        }\n\n        subscriptionMainSection.update(subscriptions, false)\n\n        if (subscriptionsListState != null) {\n            feedGroupCreateBinding.subscriptionsSelectorList.layoutManager?.onRestoreInstanceState(subscriptionsListState)\n            subscriptionsListState = null\n        } else {\n            feedGroupCreateBinding.subscriptionsSelectorList.scrollToPosition(0)\n        }\n    }\n\n    private fun updateSubscriptionSelectedCount() {\n        val selectedCount = this.selectedSubscriptions.size\n        val selectedCountText = resources.getQuantityString(\n            R.plurals.feed_group_dialog_selection_count,\n            selectedCount,\n            selectedCount\n        )\n        feedGroupCreateBinding.selectedSubscriptionCountView.text = selectedCountText\n        feedGroupCreateBinding.subscriptionsHeaderInfo.text = selectedCountText\n    }\n\n    private fun setupIconPicker() {\n        val groupAdapter = GroupieAdapter()\n        groupAdapter.addAll(FeedGroupIcon.entries.map { PickerIconItem(it) })\n\n        feedGroupCreateBinding.iconSelector.apply {\n            layoutManager = GridLayoutManager(requireContext(), 7, RecyclerView.VERTICAL, false)\n            adapter = groupAdapter\n\n            if (iconsListState != null) {\n                layoutManager?.onRestoreInstanceState(iconsListState)\n                iconsListState = null\n            }\n        }\n\n        groupAdapter.setOnItemClickListener { item, _ ->\n            when (item) {\n                is PickerIconItem -> {\n                    selectedIcon = item.icon\n                    feedGroupCreateBinding.iconPreview.setImageResource(item.iconRes)\n\n                    showScreen(InitialScreen)\n                }\n            }\n        }\n        feedGroupCreateBinding.iconPreview.setOnClickListener {\n            feedGroupCreateBinding.iconSelector.scrollToPosition(0)\n            showScreen(IconPickerScreen)\n        }\n\n        if (groupId == NO_GROUP_SELECTED) {\n            val icon = selectedIcon ?: FeedGroupIcon.ALL\n            feedGroupCreateBinding.iconPreview.setImageResource(icon.getDrawableRes())\n        }\n    }\n\n    /*/​//////////////////////////////////////////////////////////////////////////\n    // Screen Selector\n    //​//////////////////////////////////////////////////////////////////////// */\n\n    private fun showScreen(screen: ScreenState) {\n        currentScreen = screen\n\n        feedGroupCreateBinding.optionsRoot.onlyVisibleIn(InitialScreen)\n        feedGroupCreateBinding.iconSelector.onlyVisibleIn(IconPickerScreen)\n        feedGroupCreateBinding.subscriptionsSelector.onlyVisibleIn(SubscriptionsPickerScreen)\n        feedGroupCreateBinding.deleteScreenMessage.onlyVisibleIn(DeleteScreen)\n\n        feedGroupCreateBinding.separator.onlyVisibleIn(SubscriptionsPickerScreen, IconPickerScreen)\n        feedGroupCreateBinding.cancelButton.onlyVisibleIn(InitialScreen, DeleteScreen)\n\n        feedGroupCreateBinding.confirmButton.setText(\n            when {\n                currentScreen == InitialScreen && groupId == NO_GROUP_SELECTED -> R.string.create\n                else -> R.string.ok\n            }\n        )\n\n        feedGroupCreateBinding.deleteButton.isGone = currentScreen != InitialScreen || groupId == NO_GROUP_SELECTED\n\n        hideKeyboard()\n        hideSearch()\n    }\n\n    private fun View.onlyVisibleIn(vararg screens: ScreenState) {\n        isVisible = currentScreen in screens\n    }\n\n    /*/​//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //​//////////////////////////////////////////////////////////////////////// */\n\n    private fun isSearchVisible() = _searchLayoutBinding?.root?.visibility == View.VISIBLE\n\n    private fun resetSearch() {\n        searchLayoutBinding.toolbarSearchEditText.setText(\"\")\n        subscriptionsCurrentSearchQuery = \"\"\n        viewModel.clearSubscriptionsFilter()\n    }\n\n    private fun hideSearch() {\n        resetSearch()\n        searchLayoutBinding.root.visibility = View.GONE\n        feedGroupCreateBinding.subscriptionsHeaderInfoContainer.visibility = View.VISIBLE\n        feedGroupCreateBinding.subscriptionsHeaderToolbar.menu.findItem(R.id.action_search).isVisible = true\n        hideKeyboardSearch()\n    }\n\n    private fun showSearch() {\n        searchLayoutBinding.root.visibility = View.VISIBLE\n        feedGroupCreateBinding.subscriptionsHeaderInfoContainer.visibility = View.GONE\n        feedGroupCreateBinding.subscriptionsHeaderToolbar.menu.findItem(R.id.action_search).isVisible = false\n        showKeyboardSearch()\n    }\n\n    private val inputMethodManager by lazy {\n        requireActivity().getSystemService<InputMethodManager>()!!\n    }\n\n    private fun showKeyboardSearch() {\n        if (searchLayoutBinding.toolbarSearchEditText.requestFocus()) {\n            inputMethodManager.showSoftInput(\n                searchLayoutBinding.toolbarSearchEditText,\n                InputMethodManager.SHOW_IMPLICIT\n            )\n        }\n    }\n\n    private fun hideKeyboardSearch() {\n        inputMethodManager.hideSoftInputFromWindow(\n            searchLayoutBinding.toolbarSearchEditText.windowToken,\n            InputMethodManager.HIDE_NOT_ALWAYS\n        )\n        searchLayoutBinding.toolbarSearchEditText.clearFocus()\n    }\n\n    private fun showKeyboard() {\n        if (feedGroupCreateBinding.groupNameInput.requestFocus()) {\n            inputMethodManager.showSoftInput(\n                feedGroupCreateBinding.groupNameInput,\n                InputMethodManager.SHOW_IMPLICIT\n            )\n        }\n    }\n\n    private fun hideKeyboard() {\n        inputMethodManager.hideSoftInputFromWindow(\n            feedGroupCreateBinding.groupNameInput.windowToken,\n            InputMethodManager.HIDE_NOT_ALWAYS\n        )\n        feedGroupCreateBinding.groupNameInput.clearFocus()\n    }\n\n    private fun disableInput() {\n        _feedGroupCreateBinding?.deleteButton?.isEnabled = false\n        _feedGroupCreateBinding?.confirmButton?.isEnabled = false\n        _feedGroupCreateBinding?.cancelButton?.isEnabled = false\n        isCancelable = false\n\n        hideKeyboard()\n    }\n\n    companion object {\n        private const val KEY_GROUP_ID = \"KEY_GROUP_ID\"\n        private const val NO_GROUP_SELECTED = -1L\n\n        fun newInstance(groupId: Long = NO_GROUP_SELECTED): FeedGroupDialog {\n            val dialog = FeedGroupDialog()\n            dialog.arguments = bundleOf(KEY_GROUP_ID to groupId)\n            return dialog\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialogViewModel.kt",
    "content": "package org.schabi.newpipe.local.subscription.dialog\n\nimport android.content.Context\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewmodel.initializer\nimport androidx.lifecycle.viewmodel.viewModelFactory\nimport io.reactivex.rxjava3.core.Completable\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.disposables.Disposable\nimport io.reactivex.rxjava3.processors.BehaviorProcessor\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.local.feed.FeedDatabaseManager\nimport org.schabi.newpipe.local.subscription.FeedGroupIcon\nimport org.schabi.newpipe.local.subscription.SubscriptionManager\nimport org.schabi.newpipe.local.subscription.item.PickerSubscriptionItem\n\nclass FeedGroupDialogViewModel(\n    applicationContext: Context,\n    private val groupId: Long = FeedGroupEntity.GROUP_ALL_ID,\n    initialQuery: String = \"\",\n    initialShowOnlyUngrouped: Boolean = false\n) : ViewModel() {\n\n    private var feedDatabaseManager: FeedDatabaseManager = FeedDatabaseManager(applicationContext)\n    private var subscriptionManager = SubscriptionManager(applicationContext)\n\n    private var filterSubscriptions = BehaviorProcessor.create<String>()\n    private var toggleShowOnlyUngrouped = BehaviorProcessor.create<Boolean>()\n\n    private var subscriptionsFlowable = Flowable\n        .combineLatest(\n            filterSubscriptions.startWithItem(initialQuery),\n            toggleShowOnlyUngrouped.startWithItem(initialShowOnlyUngrouped)\n        ) { t1: String, t2: Boolean -> Filter(t1, t2) }\n        .distinctUntilChanged()\n        .switchMap { (query, showOnlyUngrouped) ->\n            subscriptionManager.getSubscriptions(groupId, query, showOnlyUngrouped)\n        }.map { list -> list.map { PickerSubscriptionItem(it) } }\n\n    private val mutableGroupLiveData = MutableLiveData<FeedGroupEntity>()\n    private val mutableSubscriptionsLiveData = MutableLiveData<Pair<List<PickerSubscriptionItem>, Set<Long>>>()\n    private val mutableDialogEventLiveData = MutableLiveData<DialogEvent>()\n    val groupLiveData: LiveData<FeedGroupEntity> = mutableGroupLiveData\n    val subscriptionsLiveData: LiveData<Pair<List<PickerSubscriptionItem>, Set<Long>>> = mutableSubscriptionsLiveData\n    val dialogEventLiveData: LiveData<DialogEvent> = mutableDialogEventLiveData\n\n    private var actionProcessingDisposable: Disposable? = null\n\n    private var feedGroupDisposable = feedDatabaseManager.getGroup(groupId)\n        .subscribeOn(Schedulers.io())\n        .subscribe(mutableGroupLiveData::postValue)\n\n    private var subscriptionsDisposable = Flowable\n        .combineLatest(\n            subscriptionsFlowable,\n            feedDatabaseManager.subscriptionIdsForGroup(groupId)\n        ) { t1: List<PickerSubscriptionItem>, t2: List<Long> -> t1 to t2.toSet() }\n        .subscribeOn(Schedulers.io())\n        .subscribe(mutableSubscriptionsLiveData::postValue)\n\n    override fun onCleared() {\n        super.onCleared()\n        actionProcessingDisposable?.dispose()\n        subscriptionsDisposable.dispose()\n        feedGroupDisposable.dispose()\n    }\n\n    fun createGroup(name: String, selectedIcon: FeedGroupIcon, selectedSubscriptions: Set<Long>) {\n        doAction(\n            feedDatabaseManager.createGroup(name, selectedIcon)\n                .flatMapCompletable {\n                    feedDatabaseManager.updateSubscriptionsForGroup(it, selectedSubscriptions.toList())\n                }\n        )\n    }\n\n    fun updateGroup(name: String, selectedIcon: FeedGroupIcon, selectedSubscriptions: Set<Long>, sortOrder: Long) {\n        doAction(\n            feedDatabaseManager.updateSubscriptionsForGroup(groupId, selectedSubscriptions.toList())\n                .andThen(feedDatabaseManager.updateGroup(FeedGroupEntity(groupId, name, selectedIcon, sortOrder)))\n        )\n    }\n\n    fun deleteGroup() {\n        doAction(feedDatabaseManager.deleteGroup(groupId))\n    }\n\n    private fun doAction(completable: Completable) {\n        if (actionProcessingDisposable == null) {\n            mutableDialogEventLiveData.value = DialogEvent.ProcessingEvent\n\n            actionProcessingDisposable = completable\n                .subscribeOn(Schedulers.io())\n                .subscribe { mutableDialogEventLiveData.postValue(DialogEvent.SuccessEvent) }\n        }\n    }\n\n    fun filterSubscriptionsBy(query: String) {\n        filterSubscriptions.onNext(query)\n    }\n\n    fun clearSubscriptionsFilter() {\n        filterSubscriptions.onNext(\"\")\n    }\n\n    fun toggleShowOnlyUngrouped(showOnlyUngrouped: Boolean) {\n        toggleShowOnlyUngrouped.onNext(showOnlyUngrouped)\n    }\n\n    sealed class DialogEvent {\n        data object ProcessingEvent : DialogEvent()\n        data object SuccessEvent : DialogEvent()\n    }\n\n    data class Filter(val query: String, val showOnlyUngrouped: Boolean)\n\n    companion object {\n        fun getFactory(\n            context: Context,\n            groupId: Long,\n            initialQuery: String,\n            initialShowOnlyUngrouped: Boolean\n        ) = viewModelFactory {\n            initializer {\n                FeedGroupDialogViewModel(\n                    context.applicationContext,\n                    groupId,\n                    initialQuery,\n                    initialShowOnlyUngrouped\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialog.kt",
    "content": "package org.schabi.newpipe.local.subscription.dialog\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.DialogFragment\nimport androidx.lifecycle.Observer\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.ItemTouchHelper.SimpleCallback\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.evernote.android.state.State\nimport com.livefront.bridge.Bridge\nimport com.xwray.groupie.GroupieAdapter\nimport com.xwray.groupie.TouchCallback\nimport java.util.Collections\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.databinding.DialogFeedGroupReorderBinding\nimport org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialogViewModel.DialogEvent.ProcessingEvent\nimport org.schabi.newpipe.local.subscription.dialog.FeedGroupReorderDialogViewModel.DialogEvent.SuccessEvent\nimport org.schabi.newpipe.local.subscription.item.FeedGroupReorderItem\nimport org.schabi.newpipe.util.ThemeHelper\n\nclass FeedGroupReorderDialog : DialogFragment() {\n    private var _binding: DialogFeedGroupReorderBinding? = null\n    private val binding get() = _binding!!\n\n    private lateinit var viewModel: FeedGroupReorderDialogViewModel\n\n    @State\n    @JvmField\n    var groupOrderedIdList = ArrayList<Long>()\n    private val groupAdapter = GroupieAdapter()\n    private val itemTouchHelper = ItemTouchHelper(getItemTouchCallback())\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        Bridge.restoreInstanceState(this, savedInstanceState)\n\n        setStyle(STYLE_NO_TITLE, ThemeHelper.getMinWidthDialogTheme(requireContext()))\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        return inflater.inflate(R.layout.dialog_feed_group_reorder, container)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        _binding = DialogFeedGroupReorderBinding.bind(view)\n\n        viewModel = ViewModelProvider(this).get(FeedGroupReorderDialogViewModel::class.java)\n        viewModel.groupsLiveData.observe(viewLifecycleOwner, Observer(::handleGroups))\n        viewModel.dialogEventLiveData.observe(viewLifecycleOwner) {\n            when (it) {\n                ProcessingEvent -> disableInput()\n                SuccessEvent -> dismiss()\n            }\n        }\n\n        binding.feedGroupsList.layoutManager = LinearLayoutManager(requireContext())\n        binding.feedGroupsList.adapter = groupAdapter\n        itemTouchHelper.attachToRecyclerView(binding.feedGroupsList)\n\n        binding.confirmButton.setOnClickListener {\n            viewModel.updateOrder(groupOrderedIdList)\n        }\n    }\n\n    override fun onDestroyView() {\n        _binding = null\n        super.onDestroyView()\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n        Bridge.saveInstanceState(this, outState)\n    }\n\n    private fun handleGroups(list: List<FeedGroupEntity>) {\n        val groupList: List<FeedGroupEntity>\n\n        if (groupOrderedIdList.isEmpty()) {\n            groupList = list\n            groupOrderedIdList.addAll(groupList.map { it.uid })\n        } else {\n            groupList = list.sortedBy { groupOrderedIdList.indexOf(it.uid) }\n        }\n\n        groupAdapter.update(groupList.map { FeedGroupReorderItem(it, itemTouchHelper) })\n    }\n\n    private fun disableInput() {\n        _binding?.confirmButton?.isEnabled = false\n        isCancelable = false\n    }\n\n    private fun getItemTouchCallback(): SimpleCallback {\n        return object : TouchCallback() {\n\n            override fun onMove(\n                recyclerView: RecyclerView,\n                source: RecyclerView.ViewHolder,\n                target: RecyclerView.ViewHolder\n            ): Boolean {\n                val sourceIndex = source.bindingAdapterPosition\n                val targetIndex = target.bindingAdapterPosition\n\n                groupAdapter.notifyItemMoved(sourceIndex, targetIndex)\n                Collections.swap(groupOrderedIdList, sourceIndex, targetIndex)\n\n                return true\n            }\n\n            override fun isLongPressDragEnabled(): Boolean = false\n            override fun isItemViewSwipeEnabled(): Boolean = false\n            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, swipeDir: Int) {}\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupReorderDialogViewModel.kt",
    "content": "package org.schabi.newpipe.local.subscription.dialog\n\nimport android.app.Application\nimport androidx.lifecycle.AndroidViewModel\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport io.reactivex.rxjava3.core.Completable\nimport io.reactivex.rxjava3.disposables.Disposable\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.local.feed.FeedDatabaseManager\n\nclass FeedGroupReorderDialogViewModel(application: Application) : AndroidViewModel(application) {\n    private var feedDatabaseManager: FeedDatabaseManager = FeedDatabaseManager(application)\n\n    private val mutableGroupsLiveData = MutableLiveData<List<FeedGroupEntity>>()\n    private val mutableDialogEventLiveData = MutableLiveData<DialogEvent>()\n    val groupsLiveData: LiveData<List<FeedGroupEntity>> = mutableGroupsLiveData\n    val dialogEventLiveData: LiveData<DialogEvent> = mutableDialogEventLiveData\n\n    private var actionProcessingDisposable: Disposable? = null\n\n    private var groupsDisposable = feedDatabaseManager.groups()\n        .take(1)\n        .subscribeOn(Schedulers.io())\n        .subscribe(mutableGroupsLiveData::postValue)\n\n    override fun onCleared() {\n        super.onCleared()\n        actionProcessingDisposable?.dispose()\n        groupsDisposable.dispose()\n    }\n\n    fun updateOrder(groupIdList: List<Long>) {\n        doAction(feedDatabaseManager.updateGroupsOrder(groupIdList))\n    }\n\n    private fun doAction(completable: Completable) {\n        if (actionProcessingDisposable == null) {\n            mutableDialogEventLiveData.value = DialogEvent.ProcessingEvent\n\n            actionProcessingDisposable = completable\n                .subscribeOn(Schedulers.io())\n                .subscribe { mutableDialogEventLiveData.postValue(DialogEvent.SuccessEvent) }\n        }\n    }\n\n    sealed class DialogEvent {\n        object ProcessingEvent : DialogEvent()\n        object SuccessEvent : DialogEvent()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/ChannelItem.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.content.Context\nimport android.widget.ImageView\nimport android.widget.TextView\nimport com.xwray.groupie.GroupieViewHolder\nimport com.xwray.groupie.Item\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.extractor.channel.ChannelInfoItem\nimport org.schabi.newpipe.util.Localization\nimport org.schabi.newpipe.util.OnClickGesture\nimport org.schabi.newpipe.util.image.CoilHelper\n\nclass ChannelItem(\n    private val infoItem: ChannelInfoItem,\n    private val subscriptionId: Long = -1L,\n    var itemVersion: ItemVersion = ItemVersion.NORMAL,\n    var gesturesListener: OnClickGesture<ChannelInfoItem>? = null\n) : Item<GroupieViewHolder>() {\n    override fun getId(): Long = if (subscriptionId == -1L) super.getId() else subscriptionId\n\n    enum class ItemVersion { NORMAL, MINI, GRID }\n\n    override fun getLayout(): Int = when (itemVersion) {\n        ItemVersion.NORMAL -> R.layout.list_channel_item\n        ItemVersion.MINI -> R.layout.list_channel_mini_item\n        ItemVersion.GRID -> R.layout.list_channel_grid_item\n    }\n\n    override fun bind(viewHolder: GroupieViewHolder, position: Int) {\n        val itemTitleView = viewHolder.root.findViewById<TextView>(R.id.itemTitleView)\n        val itemAdditionalDetails = viewHolder.root.findViewById<TextView>(R.id.itemAdditionalDetails)\n        val itemChannelDescriptionView = viewHolder.root.findViewById<TextView>(R.id.itemChannelDescriptionView)\n        val itemThumbnailView = viewHolder.root.findViewById<ImageView>(R.id.itemThumbnailView)\n\n        itemTitleView.text = infoItem.name\n        itemAdditionalDetails.text = getDetailLine(viewHolder.root.context)\n        if (itemVersion == ItemVersion.NORMAL) {\n            itemChannelDescriptionView.text = infoItem.description\n        }\n\n        CoilHelper.loadAvatar(itemThumbnailView, infoItem.thumbnails)\n\n        gesturesListener?.run {\n            viewHolder.root.setOnClickListener { selected(infoItem) }\n            viewHolder.root.setOnLongClickListener {\n                held(infoItem)\n                true\n            }\n        }\n    }\n\n    private fun getDetailLine(context: Context): String {\n        var details = if (infoItem.subscriberCount >= 0) {\n            Localization.shortSubscriberCount(context, infoItem.subscriberCount)\n        } else {\n            context.getString(R.string.subscribers_count_not_available)\n        }\n\n        if (itemVersion == ItemVersion.NORMAL && infoItem.streamCount >= 0) {\n            val formattedVideoAmount = Localization.localizeStreamCount(context, infoItem.streamCount)\n            details = Localization.concatenateStrings(details, formattedVideoAmount)\n        }\n        return details\n    }\n\n    override fun getSpanSize(spanCount: Int, position: Int): Int {\n        return if (itemVersion == ItemVersion.GRID) 1 else spanCount\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddNewGridItem.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.view.View\nimport com.xwray.groupie.viewbinding.BindableItem\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.FeedGroupAddNewGridItemBinding\n\nclass FeedGroupAddNewGridItem : BindableItem<FeedGroupAddNewGridItemBinding>() {\n    override fun getLayout(): Int = R.layout.feed_group_add_new_grid_item\n    override fun initializeViewBinding(view: View) = FeedGroupAddNewGridItemBinding.bind(view)\n    override fun bind(viewBinding: FeedGroupAddNewGridItemBinding, position: Int) {\n        // this is a static item, nothing to do here\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupAddNewItem.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.view.View\nimport com.xwray.groupie.viewbinding.BindableItem\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.FeedGroupAddNewItemBinding\n\nclass FeedGroupAddNewItem : BindableItem<FeedGroupAddNewItemBinding>() {\n    override fun getLayout(): Int = R.layout.feed_group_add_new_item\n    override fun initializeViewBinding(view: View) = FeedGroupAddNewItemBinding.bind(view)\n    override fun bind(viewBinding: FeedGroupAddNewItemBinding, position: Int) {\n        // this is a static item, nothing to do here\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardGridItem.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.view.View\nimport com.xwray.groupie.viewbinding.BindableItem\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.databinding.FeedGroupCardGridItemBinding\nimport org.schabi.newpipe.local.subscription.FeedGroupIcon\n\ndata class FeedGroupCardGridItem(\n    val groupId: Long = FeedGroupEntity.GROUP_ALL_ID,\n    val name: String,\n    val icon: FeedGroupIcon\n) : BindableItem<FeedGroupCardGridItemBinding>() {\n    constructor (feedGroupEntity: FeedGroupEntity) : this(feedGroupEntity.uid, feedGroupEntity.name, feedGroupEntity.icon)\n\n    override fun getId(): Long {\n        return when (groupId) {\n            FeedGroupEntity.GROUP_ALL_ID -> super.getId()\n            else -> groupId\n        }\n    }\n\n    override fun getLayout(): Int = R.layout.feed_group_card_grid_item\n\n    override fun bind(viewBinding: FeedGroupCardGridItemBinding, position: Int) {\n        viewBinding.title.text = name\n        viewBinding.icon.setImageResource(icon.getDrawableRes())\n    }\n\n    override fun initializeViewBinding(view: View) = FeedGroupCardGridItemBinding.bind(view)\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.view.View\nimport com.xwray.groupie.viewbinding.BindableItem\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.databinding.FeedGroupCardItemBinding\nimport org.schabi.newpipe.local.subscription.FeedGroupIcon\n\ndata class FeedGroupCardItem(\n    val groupId: Long = FeedGroupEntity.GROUP_ALL_ID,\n    val name: String,\n    val icon: FeedGroupIcon\n) : BindableItem<FeedGroupCardItemBinding>() {\n    constructor (feedGroupEntity: FeedGroupEntity) : this(feedGroupEntity.uid, feedGroupEntity.name, feedGroupEntity.icon)\n\n    override fun getId(): Long {\n        return when (groupId) {\n            FeedGroupEntity.GROUP_ALL_ID -> super.getId()\n            else -> groupId\n        }\n    }\n\n    override fun getLayout(): Int = R.layout.feed_group_card_item\n\n    override fun bind(viewBinding: FeedGroupCardItemBinding, position: Int) {\n        viewBinding.title.text = name\n        viewBinding.icon.setImageResource(icon.getDrawableRes())\n    }\n\n    override fun initializeViewBinding(view: View) = FeedGroupCardItemBinding.bind(view)\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCarouselItem.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.os.Parcelable\nimport android.view.View\nimport androidx.recyclerview.widget.GridLayoutManager\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.xwray.groupie.GroupAdapter\nimport com.xwray.groupie.viewbinding.BindableItem\nimport com.xwray.groupie.viewbinding.GroupieViewHolder\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.FeedItemCarouselBinding\nimport org.schabi.newpipe.util.DeviceUtils\nimport org.schabi.newpipe.util.ThemeHelper.getGridSpanCount\n\nclass FeedGroupCarouselItem(\n    private val carouselAdapter: GroupAdapter<GroupieViewHolder<FeedItemCarouselBinding>>,\n    var listViewMode: Boolean\n) : BindableItem<FeedItemCarouselBinding>() {\n    companion object {\n        const val PAYLOAD_UPDATE_LIST_VIEW_MODE = 2\n    }\n\n    private var carouselLayoutManager: LinearLayoutManager? = null\n    private var listState: Parcelable? = null\n\n    override fun getLayout() = R.layout.feed_item_carousel\n\n    fun onSaveInstanceState(): Parcelable? {\n        listState = carouselLayoutManager?.onSaveInstanceState()\n        return listState\n    }\n\n    fun onRestoreInstanceState(state: Parcelable?) {\n        carouselLayoutManager?.onRestoreInstanceState(state)\n        listState = state\n    }\n\n    override fun initializeViewBinding(view: View): FeedItemCarouselBinding {\n        val viewBinding = FeedItemCarouselBinding.bind(view)\n        updateViewMode(viewBinding)\n        return viewBinding\n    }\n\n    override fun bind(\n        viewBinding: FeedItemCarouselBinding,\n        position: Int,\n        payloads: MutableList<Any>\n    ) {\n        if (payloads.contains(PAYLOAD_UPDATE_LIST_VIEW_MODE)) {\n            updateViewMode(viewBinding)\n            return\n        }\n\n        super.bind(viewBinding, position, payloads)\n    }\n\n    override fun bind(viewBinding: FeedItemCarouselBinding, position: Int) {\n        viewBinding.recyclerView.apply { adapter = carouselAdapter }\n        carouselLayoutManager?.onRestoreInstanceState(listState)\n    }\n\n    override fun unbind(viewHolder: GroupieViewHolder<FeedItemCarouselBinding>) {\n        super.unbind(viewHolder)\n        listState = carouselLayoutManager?.onSaveInstanceState()\n    }\n\n    private fun updateViewMode(viewBinding: FeedItemCarouselBinding) {\n        viewBinding.recyclerView.apply { adapter = carouselAdapter }\n\n        val context = viewBinding.root.context\n        carouselLayoutManager = if (listViewMode) {\n            LinearLayoutManager(context)\n        } else {\n            GridLayoutManager(context, getGridSpanCount(context, DeviceUtils.dpToPx(112, context)))\n        }\n\n        viewBinding.recyclerView.apply {\n            layoutManager = carouselLayoutManager\n            adapter = carouselAdapter\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupReorderItem.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.view.MotionEvent\nimport android.view.View\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.ItemTouchHelper.DOWN\nimport androidx.recyclerview.widget.ItemTouchHelper.UP\nimport com.xwray.groupie.viewbinding.BindableItem\nimport com.xwray.groupie.viewbinding.GroupieViewHolder\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity\nimport org.schabi.newpipe.databinding.FeedGroupReorderItemBinding\nimport org.schabi.newpipe.local.subscription.FeedGroupIcon\n\ndata class FeedGroupReorderItem(\n    val groupId: Long = FeedGroupEntity.GROUP_ALL_ID,\n    val name: String,\n    val icon: FeedGroupIcon,\n    val dragCallback: ItemTouchHelper\n) : BindableItem<FeedGroupReorderItemBinding>() {\n    constructor (feedGroupEntity: FeedGroupEntity, dragCallback: ItemTouchHelper) :\n        this(feedGroupEntity.uid, feedGroupEntity.name, feedGroupEntity.icon, dragCallback)\n\n    override fun getId(): Long {\n        return when (groupId) {\n            FeedGroupEntity.GROUP_ALL_ID -> super.getId()\n            else -> groupId\n        }\n    }\n\n    override fun getLayout(): Int = R.layout.feed_group_reorder_item\n\n    override fun bind(viewBinding: FeedGroupReorderItemBinding, position: Int) {\n        viewBinding.groupName.text = name\n        viewBinding.groupIcon.setImageResource(icon.getDrawableRes())\n    }\n\n    override fun bind(viewHolder: GroupieViewHolder<FeedGroupReorderItemBinding>, position: Int, payloads: MutableList<Any>) {\n        super.bind(viewHolder, position, payloads)\n        viewHolder.binding.handle.setOnTouchListener { _, event ->\n            if (event.actionMasked == MotionEvent.ACTION_DOWN) {\n                dragCallback.startDrag(viewHolder)\n                return@setOnTouchListener true\n            }\n\n            false\n        }\n    }\n\n    override fun getDragDirs(): Int {\n        return UP or DOWN\n    }\n\n    override fun initializeViewBinding(view: View) = FeedGroupReorderItemBinding.bind(view)\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/GroupsHeader.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.view.View\nimport androidx.core.view.isVisible\nimport com.xwray.groupie.viewbinding.BindableItem\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.SubscriptionGroupsHeaderBinding\n\nclass GroupsHeader(\n    private val title: String,\n    private val onSortClicked: () -> Unit,\n    private val onToggleListViewModeClicked: () -> Unit,\n    var showSortButton: Boolean = true,\n    var listViewMode: Boolean = true\n) : BindableItem<SubscriptionGroupsHeaderBinding>() {\n    companion object {\n        const val PAYLOAD_UPDATE_ICONS = 1\n    }\n\n    override fun getLayout(): Int = R.layout.subscription_groups_header\n\n    override fun bind(\n        viewBinding: SubscriptionGroupsHeaderBinding,\n        position: Int,\n        payloads: MutableList<Any>\n    ) {\n        if (payloads.contains(PAYLOAD_UPDATE_ICONS)) {\n            updateIcons(viewBinding)\n            return\n        }\n\n        super.bind(viewBinding, position, payloads)\n    }\n\n    override fun bind(viewBinding: SubscriptionGroupsHeaderBinding, position: Int) {\n        viewBinding.headerTitle.text = title\n        viewBinding.headerSort.setOnClickListener { onSortClicked() }\n        viewBinding.headerToggleViewMode.setOnClickListener { onToggleListViewModeClicked() }\n        updateIcons(viewBinding)\n    }\n\n    override fun initializeViewBinding(view: View) = SubscriptionGroupsHeaderBinding.bind(view)\n\n    private fun updateIcons(viewBinding: SubscriptionGroupsHeaderBinding) {\n        viewBinding.headerToggleViewMode.setImageResource(\n            if (listViewMode) R.drawable.ic_apps else R.drawable.ic_list\n        )\n        viewBinding.headerSort.isVisible = showSortButton\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/Header.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.view.View\nimport com.xwray.groupie.viewbinding.BindableItem\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.SubscriptionHeaderBinding\n\nclass Header(private val title: String) : BindableItem<SubscriptionHeaderBinding>() {\n\n    override fun getLayout(): Int = R.layout.subscription_header\n\n    override fun bind(viewBinding: SubscriptionHeaderBinding, position: Int) {\n        viewBinding.root.text = title\n    }\n\n    override fun initializeViewBinding(view: View) = SubscriptionHeaderBinding.bind(view)\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/ImportSubscriptionsHintPlaceholderItem.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.view.View\nimport com.xwray.groupie.viewbinding.BindableItem\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.ListEmptyViewBinding\n\n/**\n * When there are no subscriptions, show a hint to the user about how to import subscriptions\n */\nclass ImportSubscriptionsHintPlaceholderItem : BindableItem<ListEmptyViewBinding>() {\n    override fun getLayout(): Int = R.layout.list_empty_view_subscriptions\n    override fun bind(viewBinding: ListEmptyViewBinding, position: Int) {}\n    override fun getSpanSize(spanCount: Int, position: Int): Int = spanCount\n    override fun initializeViewBinding(view: View) = ListEmptyViewBinding.bind(view)\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerIconItem.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.view.View\nimport androidx.annotation.DrawableRes\nimport com.xwray.groupie.viewbinding.BindableItem\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.PickerIconItemBinding\nimport org.schabi.newpipe.local.subscription.FeedGroupIcon\n\nclass PickerIconItem(\n    val icon: FeedGroupIcon\n) : BindableItem<PickerIconItemBinding>() {\n    @DrawableRes\n    val iconRes: Int = icon.getDrawableRes()\n\n    override fun getLayout(): Int = R.layout.picker_icon_item\n\n    override fun bind(viewBinding: PickerIconItemBinding, position: Int) {\n        viewBinding.iconView.setImageResource(iconRes)\n    }\n\n    override fun initializeViewBinding(view: View) = PickerIconItemBinding.bind(view)\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerSubscriptionItem.kt",
    "content": "package org.schabi.newpipe.local.subscription.item\n\nimport android.view.View\nimport androidx.core.view.isGone\nimport androidx.core.view.isVisible\nimport com.xwray.groupie.viewbinding.BindableItem\nimport com.xwray.groupie.viewbinding.GroupieViewHolder\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\nimport org.schabi.newpipe.databinding.PickerSubscriptionItemBinding\nimport org.schabi.newpipe.ktx.AnimationType\nimport org.schabi.newpipe.ktx.animate\nimport org.schabi.newpipe.util.image.CoilHelper\n\ndata class PickerSubscriptionItem(\n    val subscriptionEntity: SubscriptionEntity,\n    var isSelected: Boolean = false\n) : BindableItem<PickerSubscriptionItemBinding>() {\n    override fun getId(): Long = subscriptionEntity.uid\n    override fun getLayout(): Int = R.layout.picker_subscription_item\n    override fun getSpanSize(spanCount: Int, position: Int): Int = 1\n\n    override fun bind(viewBinding: PickerSubscriptionItemBinding, position: Int) {\n        CoilHelper.loadAvatar(viewBinding.thumbnailView, subscriptionEntity.avatarUrl)\n        viewBinding.titleView.text = subscriptionEntity.name\n        viewBinding.selectedHighlight.isVisible = isSelected\n    }\n\n    override fun unbind(viewHolder: GroupieViewHolder<PickerSubscriptionItemBinding>) {\n        super.unbind(viewHolder)\n\n        viewHolder.binding.selectedHighlight.apply {\n            animate().setListener(null).cancel()\n            isGone = true\n            alpha = 1F\n        }\n    }\n\n    override fun initializeViewBinding(view: View) = PickerSubscriptionItemBinding.bind(view)\n\n    fun updateSelected(containerView: View, isSelected: Boolean) {\n        this.isSelected = isSelected\n        PickerSubscriptionItemBinding.bind(containerView).selectedHighlight\n            .animate(isSelected, 150, AnimationType.LIGHT_SCALE_AND_ALPHA)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/workers/ImportExportJsonHelper.kt",
    "content": "/*\n * Copyright 2018 Mauricio Colli <mauriciocolli@outlook.com>\n * ImportExportJsonHelper.java is part of NewPipe\n *\n * License: GPL-3.0+\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\npackage org.schabi.newpipe.local.subscription.workers\n\nimport java.io.InputStream\nimport java.io.OutputStream\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.json.Json\nimport kotlinx.serialization.json.decodeFromStream\nimport kotlinx.serialization.json.encodeToStream\nimport org.schabi.newpipe.extractor.subscription.SubscriptionExtractor.InvalidSourceException\n\n/**\n * A JSON implementation capable of importing and exporting subscriptions, it has the advantage\n * of being able to transfer subscriptions to any device.\n */\nobject ImportExportJsonHelper {\n    private val json = Json { encodeDefaults = true }\n\n    /**\n     * Read a JSON source through the input stream.\n     *\n     * @param in            the input stream (e.g. a file)\n     * @return the parsed subscription items\n     */\n    @JvmStatic\n    @Throws(InvalidSourceException::class)\n    fun readFrom(`in`: InputStream?): List<SubscriptionItem> {\n        if (`in` == null) {\n            throw InvalidSourceException(\"input is null\")\n        }\n\n        try {\n            @OptIn(ExperimentalSerializationApi::class)\n            return json.decodeFromStream<SubscriptionData>(`in`).subscriptions\n        } catch (e: Throwable) {\n            throw InvalidSourceException(\"Couldn't parse json\", e)\n        }\n    }\n\n    /**\n     * Write the subscriptions items list as JSON to the output.\n     *\n     * @param items         the list of subscriptions items\n     * @param out           the output stream (e.g. a file)\n     */\n    @OptIn(ExperimentalSerializationApi::class)\n    @JvmStatic\n    fun writeTo(\n        items: List<SubscriptionItem>,\n        out: OutputStream\n    ) {\n        json.encodeToStream(SubscriptionData(items), out)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionData.kt",
    "content": "package org.schabi.newpipe.local.subscription.workers\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport org.schabi.newpipe.BuildConfig\n\n@Serializable\nclass SubscriptionData(\n    val subscriptions: List<SubscriptionItem>\n) {\n    @SerialName(\"app_version\")\n    private val appVersion = BuildConfig.VERSION_NAME\n\n    @SerialName(\"app_version_int\")\n    private val appVersionInt = BuildConfig.VERSION_CODE\n}\n\n@Serializable\ndata class SubscriptionItem(\n    @SerialName(\"service_id\")\n    val serviceId: Int,\n    val url: String,\n    val name: String\n)\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionExportWorker.kt",
    "content": "package org.schabi.newpipe.local.subscription.workers\n\nimport android.content.Context\nimport android.content.pm.ServiceInfo\nimport android.net.Uri\nimport android.os.Build\nimport android.util.Log\nimport android.widget.Toast\nimport androidx.core.app.NotificationCompat\nimport androidx.core.net.toUri\nimport androidx.work.CoroutineWorker\nimport androidx.work.ExistingWorkPolicy\nimport androidx.work.ForegroundInfo\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.OutOfQuotaPolicy\nimport androidx.work.WorkManager\nimport androidx.work.WorkerParameters\nimport androidx.work.workDataOf\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.reactive.awaitFirst\nimport kotlinx.coroutines.withContext\nimport org.schabi.newpipe.BuildConfig\nimport org.schabi.newpipe.NewPipeDatabase\nimport org.schabi.newpipe.R\n\nclass SubscriptionExportWorker(\n    appContext: Context,\n    params: WorkerParameters\n) : CoroutineWorker(appContext, params) {\n    // This is needed for API levels < 31 (Android S).\n    override suspend fun getForegroundInfo(): ForegroundInfo {\n        return createForegroundInfo(applicationContext.getString(R.string.export_ongoing))\n    }\n\n    override suspend fun doWork(): Result {\n        return try {\n            val uri = inputData.getString(EXPORT_PATH)!!.toUri()\n            val table = NewPipeDatabase.getInstance(applicationContext).subscriptionDAO()\n            val subscriptions =\n                table.getAll()\n                    .awaitFirst()\n                    .map { SubscriptionItem(it.serviceId, it.url ?: \"\", it.name ?: \"\") }\n\n            val qty = subscriptions.size\n            val title = applicationContext.resources.getQuantityString(R.plurals.export_subscriptions, qty, qty)\n            setForeground(createForegroundInfo(title))\n\n            withContext(Dispatchers.IO) {\n                // Truncate file if it already exists\n                applicationContext.contentResolver.openOutputStream(uri, \"wt\")?.use {\n                    ImportExportJsonHelper.writeTo(subscriptions, it)\n                }\n            }\n\n            if (BuildConfig.DEBUG) {\n                Log.i(TAG, \"Exported $qty subscriptions\")\n            }\n\n            withContext(Dispatchers.Main) {\n                Toast\n                    .makeText(applicationContext, R.string.export_complete_toast, Toast.LENGTH_SHORT)\n                    .show()\n            }\n\n            Result.success()\n        } catch (e: Exception) {\n            if (BuildConfig.DEBUG) {\n                Log.e(TAG, \"Error while exporting subscriptions\", e)\n            }\n\n            withContext(Dispatchers.Main) {\n                Toast\n                    .makeText(applicationContext, R.string.subscriptions_export_unsuccessful, Toast.LENGTH_SHORT)\n                    .show()\n            }\n\n            return Result.failure()\n        }\n    }\n\n    private fun createForegroundInfo(title: String): ForegroundInfo {\n        val notification =\n            NotificationCompat\n                .Builder(applicationContext, NOTIFICATION_CHANNEL_ID)\n                .setSmallIcon(R.drawable.ic_newpipe_triangle_white)\n                .setOngoing(true)\n                .setProgress(-1, -1, true)\n                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n                .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE)\n                .setContentTitle(title)\n                .build()\n        val serviceType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC else 0\n        return ForegroundInfo(NOTIFICATION_ID, notification, serviceType)\n    }\n\n    companion object {\n        private const val TAG = \"SubscriptionExportWork\"\n        private const val NOTIFICATION_ID = 4567\n        private const val NOTIFICATION_CHANNEL_ID = \"newpipe\"\n        private const val WORK_NAME = \"exportSubscriptions\"\n        private const val EXPORT_PATH = \"exportPath\"\n\n        fun schedule(\n            context: Context,\n            uri: Uri\n        ) {\n            val data = workDataOf(EXPORT_PATH to uri.toString())\n            val workRequest =\n                OneTimeWorkRequestBuilder<SubscriptionExportWorker>()\n                    .setInputData(data)\n                    .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)\n                    .build()\n\n            WorkManager\n                .getInstance(context)\n                .enqueueUniqueWork(WORK_NAME, ExistingWorkPolicy.APPEND_OR_REPLACE, workRequest)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/local/subscription/workers/SubscriptionImportWorker.kt",
    "content": "package org.schabi.newpipe.local.subscription.workers\n\nimport android.content.Context\nimport android.content.pm.ServiceInfo\nimport android.os.Build\nimport android.os.Parcelable\nimport android.util.Log\nimport android.webkit.MimeTypeMap\nimport android.widget.Toast\nimport androidx.core.app.NotificationCompat\nimport androidx.core.net.toUri\nimport androidx.work.CoroutineWorker\nimport androidx.work.Data\nimport androidx.work.ForegroundInfo\nimport androidx.work.WorkManager\nimport androidx.work.WorkerParameters\nimport androidx.work.workDataOf\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.rx3.await\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.coroutines.withContext\nimport kotlinx.parcelize.Parcelize\nimport org.schabi.newpipe.BuildConfig\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.extractor.NewPipe\nimport org.schabi.newpipe.local.subscription.SubscriptionManager\nimport org.schabi.newpipe.util.ExtractorHelper\n\nclass SubscriptionImportWorker(\n    appContext: Context,\n    params: WorkerParameters\n) : CoroutineWorker(appContext, params) {\n    // This is needed for API levels < 31 (Android S).\n    override suspend fun getForegroundInfo(): ForegroundInfo {\n        return createForegroundInfo(applicationContext.getString(R.string.import_ongoing), null, 0, 0)\n    }\n\n    override suspend fun doWork(): Result {\n        val subscriptions =\n            try {\n                loadSubscriptionsFromInput(SubscriptionImportInput.fromData(inputData))\n            } catch (e: Exception) {\n                if (BuildConfig.DEBUG) {\n                    Log.e(TAG, \"Error while loading subscriptions from path\", e)\n                }\n                withContext(Dispatchers.Main) {\n                    Toast\n                        .makeText(applicationContext, R.string.subscriptions_import_unsuccessful, Toast.LENGTH_SHORT)\n                        .show()\n                }\n                return Result.failure()\n            }\n\n        val mutex = Mutex()\n        var index = 1\n        val qty = subscriptions.size\n        var title =\n            applicationContext.resources.getQuantityString(R.plurals.load_subscriptions, qty, qty)\n\n        val channelInfoList =\n            try {\n                withContext(Dispatchers.IO.limitedParallelism(PARALLEL_EXTRACTIONS)) {\n                    subscriptions\n                        .map {\n                            async {\n                                val channelInfo =\n                                    ExtractorHelper.getChannelInfo(it.serviceId, it.url, true).await()\n                                val channelTab =\n                                    ExtractorHelper.getChannelTab(it.serviceId, channelInfo.tabs[0], true).await()\n\n                                val currentIndex = mutex.withLock { index++ }\n                                setForeground(createForegroundInfo(title, channelInfo.name, currentIndex, qty))\n\n                                channelInfo to channelTab\n                            }\n                        }.awaitAll()\n                }\n            } catch (e: Exception) {\n                if (BuildConfig.DEBUG) {\n                    Log.e(TAG, \"Error while loading subscription data\", e)\n                }\n                withContext(Dispatchers.Main) {\n                    Toast.makeText(applicationContext, R.string.subscriptions_import_unsuccessful, Toast.LENGTH_SHORT)\n                        .show()\n                }\n                return Result.failure()\n            }\n\n        title = applicationContext.resources.getQuantityString(R.plurals.import_subscriptions, qty, qty)\n        setForeground(createForegroundInfo(title, null, 0, 0))\n        index = 0\n\n        val subscriptionManager = SubscriptionManager(applicationContext)\n        for (chunk in channelInfoList.chunked(BUFFER_COUNT_BEFORE_INSERT)) {\n            withContext(Dispatchers.IO) {\n                subscriptionManager.upsertAll(chunk)\n            }\n            index += chunk.size\n            setForeground(createForegroundInfo(title, null, index, qty))\n        }\n\n        withContext(Dispatchers.Main) {\n            Toast.makeText(applicationContext, R.string.import_complete_toast, Toast.LENGTH_SHORT)\n                .show()\n        }\n\n        return Result.success()\n    }\n\n    private suspend fun loadSubscriptionsFromInput(input: SubscriptionImportInput): List<SubscriptionItem> {\n        return withContext(Dispatchers.IO) {\n            when (input) {\n                is SubscriptionImportInput.ChannelUrlMode ->\n                    NewPipe.getService(input.serviceId).subscriptionExtractor\n                        .fromChannelUrl(input.url)\n                        .map { SubscriptionItem(it.serviceId, it.url, it.name) }\n\n                is SubscriptionImportInput.InputStreamMode ->\n                    applicationContext.contentResolver.openInputStream(input.url.toUri())?.use {\n                        val contentType =\n                            MimeTypeMap.getFileExtensionFromUrl(input.url).ifEmpty { DEFAULT_MIME }\n                        NewPipe.getService(input.serviceId).subscriptionExtractor\n                            .fromInputStream(it, contentType)\n                            .map { SubscriptionItem(it.serviceId, it.url, it.name) }\n                    }\n\n                is SubscriptionImportInput.PreviousExportMode ->\n                    applicationContext.contentResolver.openInputStream(input.url.toUri())?.use {\n                        ImportExportJsonHelper.readFrom(it)\n                    }\n            } ?: emptyList()\n        }\n    }\n\n    private fun createForegroundInfo(\n        title: String,\n        text: String?,\n        currentProgress: Int,\n        maxProgress: Int\n    ): ForegroundInfo {\n        val notification =\n            NotificationCompat\n                .Builder(applicationContext, NOTIFICATION_CHANNEL_ID)\n                .setSmallIcon(R.drawable.ic_newpipe_triangle_white)\n                .setOngoing(true)\n                .setProgress(maxProgress, currentProgress, currentProgress == 0)\n                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n                .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE)\n                .setContentTitle(title)\n                .setContentText(text)\n                .addAction(\n                    R.drawable.ic_close,\n                    applicationContext.getString(R.string.cancel),\n                    WorkManager.getInstance(applicationContext).createCancelPendingIntent(id)\n                ).apply {\n                    if (currentProgress > 0 && maxProgress > 0) {\n                        val progressText = \"$currentProgress/$maxProgress\"\n                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n                            setSubText(progressText)\n                        } else {\n                            setContentInfo(progressText)\n                        }\n                    }\n                }.build()\n        val serviceType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC else 0\n\n        return ForegroundInfo(NOTIFICATION_ID, notification, serviceType)\n    }\n\n    companion object {\n        // Log tag length is limited to 23 characters on API levels < 24.\n        private const val TAG = \"SubscriptionImport\"\n\n        private const val NOTIFICATION_ID = 4568\n        private const val NOTIFICATION_CHANNEL_ID = \"newpipe\"\n        private const val DEFAULT_MIME = \"application/octet-stream\"\n        private const val PARALLEL_EXTRACTIONS = 8\n        private const val BUFFER_COUNT_BEFORE_INSERT = 50\n\n        const val WORK_NAME = \"SubscriptionImportWorker\"\n    }\n}\n\nsealed class SubscriptionImportInput : Parcelable {\n    @Parcelize\n    data class ChannelUrlMode(val serviceId: Int, val url: String) : SubscriptionImportInput()\n\n    @Parcelize\n    data class InputStreamMode(val serviceId: Int, val url: String) : SubscriptionImportInput()\n\n    @Parcelize\n    data class PreviousExportMode(val url: String) : SubscriptionImportInput()\n\n    fun toData(): Data {\n        val (mode, serviceId, url) = when (this) {\n            is ChannelUrlMode -> Triple(CHANNEL_URL_MODE, serviceId, url)\n            is InputStreamMode -> Triple(INPUT_STREAM_MODE, serviceId, url)\n            is PreviousExportMode -> Triple(PREVIOUS_EXPORT_MODE, null, url)\n        }\n        return workDataOf(\"mode\" to mode, \"service_id\" to serviceId, \"url\" to url)\n    }\n\n    companion object {\n\n        private const val CHANNEL_URL_MODE = 0\n        private const val INPUT_STREAM_MODE = 1\n        private const val PREVIOUS_EXPORT_MODE = 2\n\n        fun fromData(data: Data): SubscriptionImportInput {\n            val mode = data.getInt(\"mode\", PREVIOUS_EXPORT_MODE)\n            when (mode) {\n                CHANNEL_URL_MODE -> {\n                    val serviceId = data.getInt(\"service_id\", -1)\n                    if (serviceId == -1) {\n                        throw IllegalArgumentException(\"No service id provided\")\n                    }\n                    val url = data.getString(\"url\")!!\n                    return ChannelUrlMode(serviceId, url)\n                }\n\n                INPUT_STREAM_MODE -> {\n                    val serviceId = data.getInt(\"service_id\", -1)\n                    if (serviceId == -1) {\n                        throw IllegalArgumentException(\"No service id provided\")\n                    }\n                    val url = data.getString(\"url\")!!\n                    return InputStreamMode(serviceId, url)\n                }\n\n                PREVIOUS_EXPORT_MODE -> {\n                    val url = data.getString(\"url\")!!\n                    return PreviousExportMode(url)\n                }\n\n                else -> throw IllegalArgumentException(\"Unknown mode: $mode\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/AudioServiceLeakFix.java",
    "content": "package org.schabi.newpipe.player;\n\nimport android.content.Context;\nimport android.content.ContextWrapper;\n\n/**\n * Fixes a leak caused by AudioManager using an Activity context.\n * Tracked at https://android-review.googlesource.com/#/c/140481/1 and\n * https://github.com/square/leakcanary/issues/205\n * Source:\n * https://gist.github.com/jankovd/891d96f476f7a9ce24e2\n */\npublic class AudioServiceLeakFix extends ContextWrapper {\n    AudioServiceLeakFix(final Context base) {\n        super(base);\n    }\n\n    public static ContextWrapper preventLeakOf(final Context base) {\n        return new AudioServiceLeakFix(base);\n    }\n\n    @Override\n    public Object getSystemService(final String name) {\n        if (Context.AUDIO_SERVICE.equals(name)) {\n            return getApplicationContext().getSystemService(name);\n        }\n        return super.getSystemService(name);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java",
    "content": "package org.schabi.newpipe.player;\n\nimport static org.schabi.newpipe.QueueItemMenuUtil.openPopupMenu;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.formatSpeed;\n\nimport android.content.ComponentName;\nimport android.content.Intent;\nimport android.content.ServiceConnection;\nimport android.os.Bundle;\nimport android.os.IBinder;\nimport android.provider.Settings;\nimport android.util.Log;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.SubMenu;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageButton;\nimport android.widget.SeekBar;\n\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.google.android.exoplayer2.PlaybackParameters;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.ActivityPlayerQueueControlBinding;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.fragments.OnScrollBelowItemsListener;\nimport org.schabi.newpipe.local.dialog.PlaylistDialog;\nimport org.schabi.newpipe.player.event.PlayerEventListener;\nimport org.schabi.newpipe.player.helper.PlaybackParameterDialog;\nimport org.schabi.newpipe.player.mediaitem.MediaItemTag;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueueAdapter;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItemBuilder;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItemHolder;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItemTouchCallback;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.PermissionHelper;\nimport org.schabi.newpipe.util.ServiceHelper;\nimport org.schabi.newpipe.util.ThemeHelper;\n\nimport java.util.List;\nimport java.util.Optional;\n\npublic final class PlayQueueActivity extends AppCompatActivity\n        implements PlayerEventListener, SeekBar.OnSeekBarChangeListener,\n        View.OnClickListener, PlaybackParameterDialog.Callback {\n\n    private static final String TAG = PlayQueueActivity.class.getSimpleName();\n\n    private static final int SMOOTH_SCROLL_MAXIMUM_DISTANCE = 80;\n\n    private static final int MENU_ID_AUDIO_TRACK = 71;\n\n    private Player player;\n\n    private boolean serviceBound;\n    private ServiceConnection serviceConnection;\n\n    private boolean seeking;\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Views\n    ////////////////////////////////////////////////////////////////////////////\n\n    private ActivityPlayerQueueControlBinding queueControlBinding;\n\n    private ItemTouchHelper itemTouchHelper;\n\n    private Menu menu;\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Activity Lifecycle\n    ////////////////////////////////////////////////////////////////////////////\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this));\n\n        queueControlBinding = ActivityPlayerQueueControlBinding.inflate(getLayoutInflater());\n        setContentView(queueControlBinding.getRoot());\n\n        setSupportActionBar(queueControlBinding.toolbar);\n        if (getSupportActionBar() != null) {\n            getSupportActionBar().setDisplayHomeAsUpEnabled(true);\n            getSupportActionBar().setTitle(R.string.title_activity_play_queue);\n        }\n\n        serviceConnection = getServiceConnection();\n        bind();\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(final Menu m) {\n        this.menu = m;\n        getMenuInflater().inflate(R.menu.menu_play_queue, m);\n        getMenuInflater().inflate(R.menu.menu_play_queue_bg, m);\n        buildAudioTrackMenu();\n        onMaybeMuteChanged();\n        // to avoid null reference\n        if (player != null) {\n            onPlaybackParameterChanged(player.getPlaybackParameters());\n        }\n        return true;\n    }\n\n    // Allow to setup visibility of menuItems\n    @Override\n    public boolean onPrepareOptionsMenu(final Menu m) {\n        if (player != null) {\n            menu.findItem(R.id.action_switch_popup)\n                    .setVisible(!player.popupPlayerSelected());\n            menu.findItem(R.id.action_switch_background)\n                    .setVisible(!player.audioPlayerSelected());\n        }\n        return super.onPrepareOptionsMenu(m);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(final MenuItem item) {\n        final int itemId = item.getItemId();\n        if (itemId == android.R.id.home) {\n            finish();\n            return true;\n        } else if (itemId == R.id.action_settings) {\n            NavigationHelper.openSettings(this);\n            return true;\n        } else if (itemId == R.id.action_append_playlist) {\n            PlaylistDialog.showForPlayQueue(player, getSupportFragmentManager());\n            return true;\n        } else if (itemId == R.id.action_playback_speed) {\n            openPlaybackParameterDialog();\n            return true;\n        } else if (itemId == R.id.action_mute) {\n            player.toggleMute();\n            return true;\n        } else if (itemId == R.id.action_system_audio) {\n            startActivity(new Intent(Settings.ACTION_SOUND_SETTINGS));\n            return true;\n        } else if (itemId == R.id.action_switch_main) {\n            this.player.setRecovery();\n            NavigationHelper.playOnMainPlayer(this, player.getPlayQueue(), true);\n            return true;\n        } else if (itemId == R.id.action_switch_popup) {\n            if (PermissionHelper.isPopupEnabledElseAsk(this)) {\n                this.player.setRecovery();\n                NavigationHelper.playOnPopupPlayer(this, player.getPlayQueue(), true);\n            }\n            return true;\n        } else if (itemId == R.id.action_switch_background) {\n            this.player.setRecovery();\n            NavigationHelper.playOnBackgroundPlayer(this, player.getPlayQueue(), true);\n            return true;\n        }\n\n        if (item.getGroupId() == MENU_ID_AUDIO_TRACK) {\n            onAudioTrackClick(item.getItemId());\n            return true;\n        }\n\n        return super.onOptionsItemSelected(item);\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        unbind();\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Service Connection\n    ////////////////////////////////////////////////////////////////////////////\n\n    private void bind() {\n        // Note: this code should not really exist, and PlayerHolder should be used instead, but\n        // it will be rewritten when NewPlayer will replace the current player.\n        final Intent bindIntent = new Intent(this, PlayerService.class);\n        bindIntent.setAction(PlayerService.BIND_PLAYER_HOLDER_ACTION);\n        final boolean success = bindService(bindIntent, serviceConnection, BIND_AUTO_CREATE);\n        if (!success) {\n            unbindService(serviceConnection);\n        }\n        serviceBound = success;\n    }\n\n    private void unbind() {\n        if (serviceBound) {\n            unbindService(serviceConnection);\n            serviceBound = false;\n            if (player != null) {\n                player.removeActivityListener(this);\n            }\n\n            onQueueUpdate(null);\n            if (itemTouchHelper != null) {\n                itemTouchHelper.attachToRecyclerView(null);\n            }\n\n            itemTouchHelper = null;\n            player = null;\n        }\n    }\n\n    private ServiceConnection getServiceConnection() {\n        return new ServiceConnection() {\n            @Override\n            public void onServiceDisconnected(final ComponentName name) {\n                Log.d(TAG, \"Player service is disconnected\");\n            }\n\n            @Override\n            public void onServiceConnected(final ComponentName name, final IBinder service) {\n                Log.d(TAG, \"Player service is connected\");\n\n                if (service instanceof PlayerService.LocalBinder) {\n                    player = ((PlayerService.LocalBinder) service).getService().getPlayer();\n                }\n\n                if (player == null || player.getPlayQueue() == null || player.exoPlayerIsNull()) {\n                    unbind();\n                } else {\n                    onQueueUpdate(player.getPlayQueue());\n                    buildComponents();\n                    if (player != null) {\n                        player.setActivityListener(PlayQueueActivity.this);\n                    }\n                }\n            }\n        };\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Component Building\n    ////////////////////////////////////////////////////////////////////////////\n\n    private void buildComponents() {\n        buildQueue();\n        buildMetadata();\n        buildSeekBar();\n        buildControls();\n    }\n\n    private void buildQueue() {\n        queueControlBinding.playQueue.setLayoutManager(new LinearLayoutManager(this));\n        queueControlBinding.playQueue.setClickable(true);\n        queueControlBinding.playQueue.setLongClickable(true);\n        queueControlBinding.playQueue.clearOnScrollListeners();\n        queueControlBinding.playQueue.addOnScrollListener(getQueueScrollListener());\n\n        itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());\n        itemTouchHelper.attachToRecyclerView(queueControlBinding.playQueue);\n    }\n\n    private void buildMetadata() {\n        queueControlBinding.metadata.setOnClickListener(this);\n        queueControlBinding.songName.setSelected(true);\n        queueControlBinding.artistName.setSelected(true);\n    }\n\n    private void buildSeekBar() {\n        queueControlBinding.seekBar.setOnSeekBarChangeListener(this);\n        queueControlBinding.liveSync.setOnClickListener(this);\n    }\n\n    private void buildControls() {\n        queueControlBinding.controlRepeat.setOnClickListener(this);\n        queueControlBinding.controlBackward.setOnClickListener(this);\n        queueControlBinding.controlFastRewind.setOnClickListener(this);\n        queueControlBinding.controlPlayPause.setOnClickListener(this);\n        queueControlBinding.controlFastForward.setOnClickListener(this);\n        queueControlBinding.controlForward.setOnClickListener(this);\n        queueControlBinding.controlShuffle.setOnClickListener(this);\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Component Helpers\n    ////////////////////////////////////////////////////////////////////////////\n\n    private OnScrollBelowItemsListener getQueueScrollListener() {\n        return new OnScrollBelowItemsListener() {\n            @Override\n            public void onScrolledDown(final RecyclerView recyclerView) {\n                if (player != null && player.getPlayQueue() != null\n                        && !player.getPlayQueue().isComplete()) {\n                    player.getPlayQueue().fetch();\n                } else {\n                    queueControlBinding.playQueue.clearOnScrollListeners();\n                }\n            }\n        };\n    }\n\n    private ItemTouchHelper.SimpleCallback getItemTouchCallback() {\n        return new PlayQueueItemTouchCallback() {\n            @Override\n            public void onMove(final int sourceIndex, final int targetIndex) {\n                if (player != null) {\n                    player.getPlayQueue().move(sourceIndex, targetIndex);\n                }\n            }\n\n            @Override\n            public void onSwiped(final int index) {\n                if (index != -1) {\n                    player.getPlayQueue().remove(index);\n                }\n            }\n        };\n    }\n\n    private PlayQueueItemBuilder.OnSelectedListener getOnSelectedListener() {\n        return new PlayQueueItemBuilder.OnSelectedListener() {\n            @Override\n            public void selected(final PlayQueueItem item, final View view) {\n                if (player != null) {\n                    player.selectQueueItem(item);\n                }\n            }\n\n            @Override\n            public void held(final PlayQueueItem item, final View view) {\n                if (player != null && player.getPlayQueue().indexOf(item) != -1) {\n                    openPopupMenu(player.getPlayQueue(), item, view, false,\n                            getSupportFragmentManager(), PlayQueueActivity.this);\n                }\n            }\n\n            @Override\n            public void onStartDrag(final PlayQueueItemHolder viewHolder) {\n                if (itemTouchHelper != null) {\n                    itemTouchHelper.startDrag(viewHolder);\n                }\n            }\n        };\n    }\n\n    private void scrollToSelected() {\n        if (player == null) {\n            return;\n        }\n\n        final int currentPlayingIndex = player.getPlayQueue().getIndex();\n        final int currentVisibleIndex;\n        if (queueControlBinding.playQueue.getLayoutManager() instanceof LinearLayoutManager) {\n            final LinearLayoutManager layout =\n                    (LinearLayoutManager) queueControlBinding.playQueue.getLayoutManager();\n            currentVisibleIndex = layout.findFirstVisibleItemPosition();\n        } else {\n            currentVisibleIndex = 0;\n        }\n\n        final int distance = Math.abs(currentPlayingIndex - currentVisibleIndex);\n        if (distance < SMOOTH_SCROLL_MAXIMUM_DISTANCE) {\n            queueControlBinding.playQueue.smoothScrollToPosition(currentPlayingIndex);\n        } else {\n            queueControlBinding.playQueue.scrollToPosition(currentPlayingIndex);\n        }\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Component On-Click Listener\n    ////////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void onClick(final View view) {\n        if (player == null) {\n            return;\n        }\n\n        if (view.getId() == queueControlBinding.controlRepeat.getId()) {\n            player.cycleNextRepeatMode();\n        } else if (view.getId() == queueControlBinding.controlBackward.getId()) {\n            player.playPrevious();\n        } else if (view.getId() == queueControlBinding.controlFastRewind.getId()) {\n            player.fastRewind();\n        } else if (view.getId() == queueControlBinding.controlPlayPause.getId()) {\n            player.playPause();\n        } else if (view.getId() == queueControlBinding.controlFastForward.getId()) {\n            player.fastForward();\n        } else if (view.getId() == queueControlBinding.controlForward.getId()) {\n            player.playNext();\n        } else if (view.getId() == queueControlBinding.controlShuffle.getId()) {\n            player.toggleShuffleModeEnabled();\n        } else if (view.getId() == queueControlBinding.metadata.getId()) {\n            scrollToSelected();\n        } else if (view.getId() == queueControlBinding.liveSync.getId()) {\n            player.seekToDefault();\n        }\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Playback Parameters\n    ////////////////////////////////////////////////////////////////////////////\n\n    private void openPlaybackParameterDialog() {\n        if (player == null) {\n            return;\n        }\n        PlaybackParameterDialog.newInstance(player.getPlaybackSpeed(), player.getPlaybackPitch(),\n                player.getPlaybackSkipSilence(), this).show(getSupportFragmentManager(), TAG);\n    }\n\n    @Override\n    public void onPlaybackParameterChanged(final float playbackTempo, final float playbackPitch,\n                                           final boolean playbackSkipSilence) {\n        if (player != null) {\n            player.setPlaybackParameters(playbackTempo, playbackPitch, playbackSkipSilence);\n            onPlaybackParameterChanged(player.getPlaybackParameters());\n        }\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Seekbar Listener\n    ////////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void onProgressChanged(final SeekBar seekBar, final int progress,\n                                  final boolean fromUser) {\n        if (fromUser) {\n            final String seekTime = Localization.getDurationString(progress / 1000);\n            queueControlBinding.currentTime.setText(seekTime);\n            queueControlBinding.seekDisplay.setText(seekTime);\n        }\n    }\n\n    @Override\n    public void onStartTrackingTouch(final SeekBar seekBar) {\n        seeking = true;\n        queueControlBinding.seekDisplay.setVisibility(View.VISIBLE);\n    }\n\n    @Override\n    public void onStopTrackingTouch(final SeekBar seekBar) {\n        if (player != null) {\n            player.seekTo(seekBar.getProgress());\n        }\n        queueControlBinding.seekDisplay.setVisibility(View.GONE);\n        seeking = false;\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Binding Service Listener\n    ////////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void onQueueUpdate(@Nullable final PlayQueue queue) {\n        if (queue == null) {\n            queueControlBinding.playQueue.setAdapter(null);\n        } else {\n            final PlayQueueAdapter adapter = new PlayQueueAdapter(this, queue);\n            adapter.setSelectedListener(getOnSelectedListener());\n            queueControlBinding.playQueue.setAdapter(adapter);\n        }\n    }\n\n    @Override\n    public void onPlaybackUpdate(final int state, final int repeatMode, final boolean shuffled,\n                                 final PlaybackParameters parameters) {\n        onStateChanged(state);\n        onPlayModeChanged(repeatMode, shuffled);\n        onPlaybackParameterChanged(parameters);\n        onMaybeMuteChanged();\n    }\n\n    @Override\n    public void onProgressUpdate(final int currentProgress, final int duration,\n                                 final int bufferPercent) {\n        // Set buffer progress\n        queueControlBinding.seekBar.setSecondaryProgress((int) (queueControlBinding.seekBar.getMax()\n                * ((float) bufferPercent / 100)));\n\n        // Set Duration\n        queueControlBinding.seekBar.setMax(duration);\n        queueControlBinding.endTime.setText(Localization.getDurationString(duration / 1000));\n\n        // Set current time if not seeking\n        if (!seeking) {\n            queueControlBinding.seekBar.setProgress(currentProgress);\n            queueControlBinding.currentTime.setText(Localization\n                    .getDurationString(currentProgress / 1000));\n        }\n\n        if (player != null) {\n            queueControlBinding.liveSync.setClickable(!player.isLiveEdge());\n        }\n\n        // this will make sure progressCurrentTime has the same width as progressEndTime\n        final ViewGroup.LayoutParams currentTimeParams =\n                queueControlBinding.currentTime.getLayoutParams();\n        currentTimeParams.width = queueControlBinding.endTime.getWidth();\n        queueControlBinding.currentTime.setLayoutParams(currentTimeParams);\n    }\n\n    @Override\n    public void onMetadataUpdate(final StreamInfo info, final PlayQueue queue) {\n        if (info != null) {\n            queueControlBinding.songName.setText(info.getName());\n            queueControlBinding.artistName.setText(info.getUploaderName());\n\n            queueControlBinding.endTime.setVisibility(View.GONE);\n            queueControlBinding.liveSync.setVisibility(View.GONE);\n            switch (info.getStreamType()) {\n                case LIVE_STREAM:\n                case AUDIO_LIVE_STREAM:\n                    queueControlBinding.liveSync.setVisibility(View.VISIBLE);\n                    break;\n                default:\n                    queueControlBinding.endTime.setVisibility(View.VISIBLE);\n                    break;\n            }\n\n            scrollToSelected();\n        }\n    }\n\n    @Override\n    public void onServiceStopped() {\n        unbind();\n        finish();\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Binding Service Helper\n    ////////////////////////////////////////////////////////////////////////////\n\n    private void onStateChanged(final int state) {\n        final ImageButton playPauseButton = queueControlBinding.controlPlayPause;\n        switch (state) {\n            case Player.STATE_PAUSED:\n                playPauseButton.setImageResource(R.drawable.ic_play_arrow);\n                playPauseButton.setContentDescription(getString(R.string.play));\n                break;\n            case Player.STATE_PLAYING:\n                playPauseButton.setImageResource(R.drawable.ic_pause);\n                playPauseButton.setContentDescription(getString(R.string.pause));\n                break;\n            case Player.STATE_COMPLETED:\n                playPauseButton.setImageResource(R.drawable.ic_replay);\n                playPauseButton.setContentDescription(getString(R.string.replay));\n                break;\n            default:\n                break;\n        }\n\n        switch (state) {\n            case Player.STATE_PAUSED:\n            case Player.STATE_PLAYING:\n            case Player.STATE_COMPLETED:\n                queueControlBinding.controlPlayPause.setClickable(true);\n                queueControlBinding.controlPlayPause.setVisibility(View.VISIBLE);\n                queueControlBinding.controlProgressBar.setVisibility(View.GONE);\n                break;\n            default:\n                queueControlBinding.controlPlayPause.setClickable(false);\n                queueControlBinding.controlPlayPause.setVisibility(View.INVISIBLE);\n                queueControlBinding.controlProgressBar.setVisibility(View.VISIBLE);\n                break;\n        }\n    }\n\n    private void onPlayModeChanged(final int repeatMode, final boolean shuffled) {\n        switch (repeatMode) {\n            case com.google.android.exoplayer2.Player.REPEAT_MODE_OFF:\n                queueControlBinding.controlRepeat.setImageResource(\n                        com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_off);\n                break;\n            case com.google.android.exoplayer2.Player.REPEAT_MODE_ONE:\n                queueControlBinding.controlRepeat.setImageResource(\n                        com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_one);\n                break;\n            case com.google.android.exoplayer2.Player.REPEAT_MODE_ALL:\n                queueControlBinding.controlRepeat.setImageResource(\n                        com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_all);\n                break;\n        }\n\n        final int shuffleAlpha = shuffled ? 255 : 77;\n        queueControlBinding.controlShuffle.setImageAlpha(shuffleAlpha);\n    }\n\n    private void onPlaybackParameterChanged(@Nullable final PlaybackParameters parameters) {\n        if (parameters != null && menu != null && player != null) {\n            final MenuItem item = menu.findItem(R.id.action_playback_speed);\n            item.setTitle(formatSpeed(parameters.speed));\n        }\n    }\n\n    private void onMaybeMuteChanged() {\n        if (menu != null && player != null) {\n            final MenuItem item = menu.findItem(R.id.action_mute);\n\n            //Change the mute-button item in ActionBar\n            //1) Text change:\n            item.setTitle(player.isMuted() ? R.string.unmute : R.string.mute);\n\n            //2) Icon change accordingly to current App Theme\n            // using rootView.getContext() because getApplicationContext() didn't work\n            item.setIcon(player.isMuted() ? R.drawable.ic_volume_off : R.drawable.ic_volume_up);\n        }\n    }\n\n    @Override\n    public void onAudioTrackUpdate() {\n        buildAudioTrackMenu();\n    }\n\n    private void buildAudioTrackMenu() {\n        if (menu == null) {\n            return;\n        }\n\n        final MenuItem audioTrackSelector = menu.findItem(R.id.action_audio_track);\n        final List<AudioStream> availableStreams =\n                Optional.ofNullable(player)\n                        .map(Player::getCurrentMetadata)\n                        .flatMap(MediaItemTag::getMaybeAudioTrack)\n                        .map(MediaItemTag.AudioTrack::getAudioStreams)\n                        .orElse(null);\n        final Optional<AudioStream> selectedAudioStream = Optional.ofNullable(player)\n                .flatMap(Player::getSelectedAudioStream);\n\n        if (availableStreams == null || availableStreams.size() < 2\n                || selectedAudioStream.isEmpty()) {\n            audioTrackSelector.setVisible(false);\n        } else {\n            final SubMenu audioTrackMenu = audioTrackSelector.getSubMenu();\n            audioTrackMenu.clear();\n\n            for (int i = 0; i < availableStreams.size(); i++) {\n                final AudioStream audioStream = availableStreams.get(i);\n                audioTrackMenu.add(MENU_ID_AUDIO_TRACK, i, Menu.NONE,\n                        Localization.audioTrackName(this, audioStream));\n            }\n\n            final AudioStream s = selectedAudioStream.get();\n            final String trackName = Localization.audioTrackName(this, s);\n            audioTrackSelector.setTitle(\n                    getString(R.string.play_queue_audio_track, trackName));\n\n            final String shortName = s.getAudioLocale() != null\n                    ? s.getAudioLocale().getLanguage() : trackName;\n            audioTrackSelector.setTitleCondensed(\n                    shortName.substring(0, Math.min(shortName.length(), 2)));\n            audioTrackSelector.setVisible(true);\n        }\n    }\n\n    /**\n     * Called when an item from the audio track selector is selected.\n     *\n     * @param itemId index of the selected item\n     */\n    private void onAudioTrackClick(final int itemId) {\n        if (player.getCurrentMetadata() == null) {\n            return;\n        }\n        player.getCurrentMetadata().getMaybeAudioTrack().ifPresent(audioTrack -> {\n            final List<AudioStream> availableStreams = audioTrack.getAudioStreams();\n            final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex();\n            if (selectedStreamIndex == itemId || availableStreams.size() <= itemId) {\n                return;\n            }\n\n            final String newAudioTrack = availableStreams.get(itemId).getAudioTrackId();\n            player.setAudioTrack(newAudioTrack);\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/Player.java",
    "content": "package org.schabi.newpipe.player;\n\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_IO_BAD_HTTP_STATUS;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_IO_FILE_NOT_FOUND;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_IO_NO_PERMISSION;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_IO_UNSPECIFIED;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_PARSING_CONTAINER_MALFORMED;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_TIMEOUT;\nimport static com.google.android.exoplayer2.PlaybackException.ERROR_CODE_UNSPECIFIED;\nimport static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_AUTO_TRANSITION;\nimport static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_INTERNAL;\nimport static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_REMOVE;\nimport static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_SEEK;\nimport static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_SEEK_ADJUSTMENT;\nimport static com.google.android.exoplayer2.Player.DISCONTINUITY_REASON_SKIP;\nimport static com.google.android.exoplayer2.Player.DiscontinuityReason;\nimport static com.google.android.exoplayer2.Player.Listener;\nimport static com.google.android.exoplayer2.Player.REPEAT_MODE_ALL;\nimport static com.google.android.exoplayer2.Player.REPEAT_MODE_OFF;\nimport static com.google.android.exoplayer2.Player.REPEAT_MODE_ONE;\nimport static com.google.android.exoplayer2.Player.RepeatMode;\nimport static org.schabi.newpipe.extractor.ServiceList.YouTube;\nimport static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.retrievePlaybackParametersFromPrefs;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.retrieveSeekDurationFromPreferences;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.savePlaybackParametersToPrefs;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_FORWARD;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_REWIND;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_NEXT;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PAUSE;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PREVIOUS;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_RECREATE_NOTIFICATION;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_REPEAT;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_SHUFFLE;\nimport static org.schabi.newpipe.util.ListHelper.getPopupResolutionIndex;\nimport static org.schabi.newpipe.util.ListHelper.getResolutionIndex;\nimport static java.util.concurrent.TimeUnit.MILLISECONDS;\n\nimport static coil3.Image_androidKt.toBitmap;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.SharedPreferences;\nimport android.graphics.Bitmap;\nimport android.media.AudioManager;\nimport android.support.v4.media.session.MediaSessionCompat;\nimport android.util.Log;\nimport android.view.LayoutInflater;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.content.ContextCompat;\nimport androidx.core.content.IntentCompat;\nimport androidx.core.math.MathUtils;\nimport androidx.preference.PreferenceManager;\n\nimport com.google.android.exoplayer2.C;\nimport com.google.android.exoplayer2.DefaultRenderersFactory;\nimport com.google.android.exoplayer2.ExoPlayer;\nimport com.google.android.exoplayer2.PlaybackException;\nimport com.google.android.exoplayer2.PlaybackParameters;\nimport com.google.android.exoplayer2.Player.PositionInfo;\nimport com.google.android.exoplayer2.Timeline;\nimport com.google.android.exoplayer2.Tracks;\nimport com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;\nimport com.google.android.exoplayer2.source.MediaSource;\nimport com.google.android.exoplayer2.text.CueGroup;\nimport com.google.android.exoplayer2.trackselection.DefaultTrackSelector;\nimport com.google.android.exoplayer2.trackselection.MappingTrackSelector;\nimport com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;\nimport com.google.android.exoplayer2.video.VideoSize;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.PlayerBinding;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.Image;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamType;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\nimport org.schabi.newpipe.fragments.detail.VideoDetailFragment;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.player.event.PlayerEventListener;\nimport org.schabi.newpipe.player.event.PlayerServiceEventListener;\nimport org.schabi.newpipe.player.helper.AudioReactor;\nimport org.schabi.newpipe.player.helper.CustomRenderersFactory;\nimport org.schabi.newpipe.player.helper.LoadController;\nimport org.schabi.newpipe.player.helper.PlayerDataSource;\nimport org.schabi.newpipe.player.helper.PlayerHelper;\nimport org.schabi.newpipe.player.mediaitem.MediaItemTag;\nimport org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi;\nimport org.schabi.newpipe.player.notification.NotificationPlayerUi;\nimport org.schabi.newpipe.player.playback.MediaSourceManager;\nimport org.schabi.newpipe.player.playback.PlaybackListener;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.player.playqueue.SinglePlayQueue;\nimport org.schabi.newpipe.player.resolver.AudioPlaybackResolver;\nimport org.schabi.newpipe.player.resolver.VideoPlaybackResolver;\nimport org.schabi.newpipe.player.resolver.VideoPlaybackResolver.SourceType;\nimport org.schabi.newpipe.player.ui.BackgroundPlayerUi;\nimport org.schabi.newpipe.player.ui.MainPlayerUi;\nimport org.schabi.newpipe.player.ui.PlayerUi;\nimport org.schabi.newpipe.player.ui.PlayerUiList;\nimport org.schabi.newpipe.player.ui.PopupPlayerUi;\nimport org.schabi.newpipe.player.ui.VideoPlayerUi;\nimport org.schabi.newpipe.util.DependentPreferenceHelper;\nimport org.schabi.newpipe.util.ExtractorHelper;\nimport org.schabi.newpipe.util.ListHelper;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.SerializedCache;\nimport org.schabi.newpipe.util.StreamTypeUtil;\nimport org.schabi.newpipe.util.image.CoilHelper;\n\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Optional;\nimport java.util.stream.IntStream;\n\nimport coil3.target.Target;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Observable;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.disposables.SerialDisposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic final class Player implements PlaybackListener, Listener {\n    public static final boolean DEBUG = MainActivity.DEBUG;\n    public static final String TAG = Player.class.getSimpleName();\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // States\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public static final int STATE_PREFLIGHT = -1;\n    public static final int STATE_BLOCKED = 123;\n    public static final int STATE_PLAYING = 124;\n    public static final int STATE_BUFFERING = 125;\n    public static final int STATE_PAUSED = 126;\n    public static final int STATE_PAUSED_SEEK = 127;\n    public static final int STATE_COMPLETED = 128;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Intent\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public static final String PLAYBACK_QUALITY = \"playback_quality\";\n    public static final String PLAY_QUEUE_KEY = \"play_queue_key\";\n    public static final String RESUME_PLAYBACK = \"resume_playback\";\n    public static final String PLAY_WHEN_READY = \"play_when_ready\";\n    public static final String PLAYER_TYPE = \"player_type\";\n    public static final String PLAYER_INTENT_TYPE = \"player_intent_type\";\n    public static final String PLAYER_INTENT_DATA = \"player_intent_data\";\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Time constants\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public static final int PLAY_PREV_ACTIVATION_LIMIT_MILLIS = 5000; // 5 seconds\n    public static final int PROGRESS_LOOP_INTERVAL_MILLIS = 1000; // 1 second\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Other constants\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public static final int RENDERER_UNAVAILABLE = -1;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playback\n    //////////////////////////////////////////////////////////////////////////*/\n\n    // play queue might be null e.g. while player is starting\n    @Nullable\n    private PlayQueue playQueue;\n\n    @Nullable\n    private MediaSourceManager playQueueManager;\n\n    @Nullable\n    private PlayQueueItem currentItem;\n    @Nullable\n    private MediaItemTag currentMetadata;\n    @Nullable\n    private Bitmap currentThumbnail;\n    @Nullable\n    private coil3.request.Disposable thumbnailDisposable;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Player\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private ExoPlayer simpleExoPlayer;\n    private AudioReactor audioReactor;\n\n    @NonNull\n    private final DefaultTrackSelector trackSelector;\n    @NonNull\n    private final LoadController loadController;\n    @NonNull\n    private final DefaultRenderersFactory renderFactory;\n\n    @NonNull\n    private final VideoPlaybackResolver videoResolver;\n    @NonNull\n    private final AudioPlaybackResolver audioResolver;\n\n    private final PlayerService service; //TODO try to remove and replace everything with context\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Player states\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private PlayerType playerType = PlayerType.MAIN;\n    private int currentState = STATE_PREFLIGHT;\n\n    // audio only mode does not mean that player type is background, but that the player was\n    // minimized to background but will resume automatically to the original player type\n    private boolean isAudioOnly = false;\n    private boolean isPrepared = false;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // UIs, listeners and disposables\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @SuppressWarnings({\"MemberName\", \"java:S116\"}) // keep the unusual member name\n    private final PlayerUiList UIs;\n\n    private BroadcastReceiver broadcastReceiver;\n    private IntentFilter intentFilter;\n    @Nullable\n    private PlayerServiceEventListener fragmentListener = null;\n    @Nullable\n    private PlayerEventListener activityListener = null;\n\n    @NonNull\n    private final SerialDisposable progressUpdateDisposable = new SerialDisposable();\n    @NonNull\n    private final CompositeDisposable databaseUpdateDisposable = new CompositeDisposable();\n    @NonNull\n    private final CompositeDisposable streamItemDisposable = new CompositeDisposable();\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @NonNull\n    private final Context context;\n    @NonNull\n    private final SharedPreferences prefs;\n    @NonNull\n    private final HistoryRecordManager recordManager;\n\n    private boolean screenOn = true;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Constructor\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Constructor\n\n    /**\n     * @param service the service this player resides in\n     * @param mediaSession used to build the {@link MediaSessionPlayerUi}, lives in the service and\n     *                     could possibly be reused with multiple player instances\n     * @param sessionConnector used to build the {@link MediaSessionPlayerUi}, lives in the service\n     *                         and could possibly be reused with multiple player instances\n     */\n    public Player(@NonNull final PlayerService service,\n                  @NonNull final MediaSessionCompat mediaSession,\n                  @NonNull final MediaSessionConnector sessionConnector) {\n        this.service = service;\n        context = service;\n        prefs = PreferenceManager.getDefaultSharedPreferences(context);\n        recordManager = new HistoryRecordManager(context);\n\n        setupBroadcastReceiver();\n\n        trackSelector = new DefaultTrackSelector(context, PlayerHelper.getQualitySelector());\n        final PlayerDataSource dataSource = new PlayerDataSource(context,\n                new DefaultBandwidthMeter.Builder(context).build());\n        loadController = new LoadController();\n\n        renderFactory = prefs.getBoolean(\n                context.getString(\n                        R.string.always_use_exoplayer_set_output_surface_workaround_key), false)\n                ? new CustomRenderersFactory(context) : new DefaultRenderersFactory(context);\n\n        renderFactory.setEnableDecoderFallback(\n                prefs.getBoolean(\n                        context.getString(\n                                R.string.use_exoplayer_decoder_fallback_key), false));\n\n        videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver());\n        audioResolver = new AudioPlaybackResolver(context, dataSource);\n\n        // The UIs added here should always be present. They will be initialized when the player\n        // reaches the initialization step. Make sure the media session ui is before the\n        // notification ui in the UIs list, since the notification depends on the media session in\n        // PlayerUi#initPlayer(), and UIs.call() guarantees UI order is preserved.\n        UIs = new PlayerUiList(\n                new MediaSessionPlayerUi(this, mediaSession, sessionConnector),\n                new NotificationPlayerUi(this)\n        );\n    }\n\n    private VideoPlaybackResolver.QualityResolver getQualityResolver() {\n        return new VideoPlaybackResolver.QualityResolver() {\n            @Override\n            public int getDefaultResolutionIndex(final List<VideoStream> sortedVideos) {\n                return videoPlayerSelected()\n                        ? ListHelper.getDefaultResolutionIndex(context, sortedVideos)\n                        : ListHelper.getPopupDefaultResolutionIndex(context, sortedVideos);\n            }\n\n            @Override\n            public int getOverrideResolutionIndex(final List<VideoStream> sortedVideos,\n                                                  final String playbackQuality) {\n                return videoPlayerSelected()\n                        ? getResolutionIndex(context, sortedVideos, playbackQuality)\n                        : getPopupResolutionIndex(context, sortedVideos, playbackQuality);\n            }\n        };\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playback initialization via intent\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Playback initialization via intent\n\n    @SuppressWarnings(\"MethodLength\")\n    public void handleIntent(@NonNull final Intent intent) {\n        final var playerIntentType = IntentCompat.getSerializableExtra(intent, PLAYER_INTENT_TYPE,\n                PlayerIntentType.class);\n        if (playerIntentType == null) {\n            return;\n        }\n        // TODO: this should be in the second switch below, but I’m not sure whether I\n        // can move the initUIs stuff without breaking the setup for edge cases somehow.\n        // when playing from a timestamp, keep the current player as-is.\n        if (playerIntentType != PlayerIntentType.TimestampChange) {\n            playerType = IntentCompat.getSerializableExtra(intent, PLAYER_TYPE, PlayerType.class);\n        }\n        initUIsForCurrentPlayerType();\n        isAudioOnly = audioPlayerSelected();\n\n        if (intent.hasExtra(PLAYBACK_QUALITY)) {\n            videoResolver.setPlaybackQuality(intent.getStringExtra(PLAYBACK_QUALITY));\n        }\n\n        final boolean playWhenReady = intent.getBooleanExtra(PLAY_WHEN_READY, true);\n\n        switch (playerIntentType) {\n            case Enqueue -> {\n                if (playQueue != null) {\n                    final PlayQueue newQueue = getPlayQueueFromCache(intent);\n                    if (newQueue == null) {\n                        return;\n                    }\n                    playQueue.append(newQueue.getStreams());\n                    return;\n                }\n\n                // TODO: This falls through to the old logic, there was no playQueue\n                // yet so we should start the player and add the new video\n                break;\n            }\n            case EnqueueNext -> {\n                if (playQueue != null) {\n                    final PlayQueue newQueue = getPlayQueueFromCache(intent);\n                    if (newQueue == null) {\n                        return;\n                    }\n                    final PlayQueueItem newItem = newQueue.getStreams().get(0);\n                    playQueue.enqueueNext(newItem, false);\n                    return;\n                }\n\n                // TODO: This falls through to the old logic, there was no playQueue\n                // yet so we should start the player and add the new video\n                break;\n            }\n            case TimestampChange -> {\n                final var data = Objects.requireNonNull(IntentCompat.getParcelableExtra(intent,\n                        PLAYER_INTENT_DATA, TimestampChangeData.class));\n                final Single<StreamInfo> single =\n                        ExtractorHelper.getStreamInfo(data.getServiceId(), data.getUrl(), false);\n                streamItemDisposable.add(single.subscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .subscribe(info -> {\n                            final @Nullable PlayQueue oldPlayQueue = playQueue;\n                            info.setStartPosition(data.getSeconds());\n                            final PlayQueueItem playQueueItem = new PlayQueueItem(info);\n\n                            // If the stream is already playing,\n                            // we can just seek to the appropriate timestamp\n                            if (oldPlayQueue != null\n                                    && playQueueItem.isSameItem(oldPlayQueue.getItem())) {\n                                // Player can have state = IDLE when playback is stopped or failed\n                                // and we should retry in this case\n                                if (simpleExoPlayer.getPlaybackState()\n                                        == com.google.android.exoplayer2.Player.STATE_IDLE) {\n                                    simpleExoPlayer.prepare();\n                                }\n                                simpleExoPlayer.seekTo(oldPlayQueue.getIndex(),\n                                        data.getSeconds() * 1000L);\n                                simpleExoPlayer.setPlayWhenReady(playWhenReady);\n\n                            } else {\n                                final PlayQueue newPlayQueue;\n\n                                // If there is no queue yet, just add our item\n                                if (oldPlayQueue == null) {\n                                    newPlayQueue = new SinglePlayQueue(playQueueItem);\n\n                                // else we add the timestamped stream behind the current video\n                                // and start playing it.\n                                } else {\n                                    oldPlayQueue.enqueueNext(playQueueItem, true);\n                                    oldPlayQueue.offsetIndex(1);\n                                    newPlayQueue = oldPlayQueue;\n                                }\n                                initPlayback(newPlayQueue, playWhenReady);\n                            }\n\n                        }, throwable -> {\n                            // This will only show a snackbar if the passed context has a root view:\n                            // otherwise it will resort to showing a notification, so we are safe\n                            // here.\n                            final var info = new ErrorInfo(throwable, UserAction.PLAY_ON_POPUP,\n                                    data.getUrl(), null, data.getUrl());\n                            ErrorUtil.createNotification(context, info);\n                        }));\n                return;\n            }\n            case AllOthers -> {\n                // fallthrough; TODO: put other intent data in separate cases\n            }\n        }\n\n        final PlayQueue newQueue = getPlayQueueFromCache(intent);\n        if (newQueue == null) {\n            return;\n        }\n\n        // branching parameters for below\n        final boolean samePlayQueue = playQueue != null && playQueue.equalStreamsAndIndex(newQueue);\n\n        /*\n         * TODO As seen in #7427 this does not work:\n         * There are 3 situations when playback shouldn't be started from scratch (zero timestamp):\n         * 1. User pressed on a timestamp link and the same video should be rewound to the timestamp\n         * 2. User changed a player from, for example. main to popup, or from audio to main, etc\n         * 3. User chose to resume a video based on a saved timestamp from history of played videos\n         * In those cases time will be saved because re-init of the play queue is a not an instant\n         *  task and requires network calls\n         * */\n        // seek to timestamp if stream is already playing\n        if (!exoPlayerIsNull()\n                && newQueue.size() == 1 && newQueue.getItem() != null\n                && playQueue != null && playQueue.size() == 1 && playQueue.getItem() != null\n                && newQueue.getItem().isSameItem(playQueue.getItem())\n                && newQueue.getItem().getRecoveryPosition() != PlayQueueItem.RECOVERY_UNSET) {\n            // Player can have state = IDLE when playback is stopped or failed\n            // and we should retry in this case\n            if (simpleExoPlayer.getPlaybackState()\n                    == com.google.android.exoplayer2.Player.STATE_IDLE) {\n                simpleExoPlayer.prepare();\n            }\n            simpleExoPlayer.seekTo(playQueue.getIndex(), newQueue.getItem().getRecoveryPosition());\n            simpleExoPlayer.setPlayWhenReady(playWhenReady);\n\n        } else if (!exoPlayerIsNull()\n                && samePlayQueue\n                && playQueue != null\n                && !playQueue.isDisposed()) {\n            // Do not re-init the same PlayQueue. Save time\n            // Player can have state = IDLE when playback is stopped or failed\n            // and we should retry in this case\n            if (simpleExoPlayer.getPlaybackState()\n                    == com.google.android.exoplayer2.Player.STATE_IDLE) {\n                simpleExoPlayer.prepare();\n            }\n            simpleExoPlayer.setPlayWhenReady(playWhenReady);\n\n        } else if (intent.getBooleanExtra(RESUME_PLAYBACK, false)\n                && DependentPreferenceHelper.getResumePlaybackEnabled(context)\n                // !samePlayQueue\n                && (playQueue == null || !playQueue.equalStreamsAndIndex(newQueue))\n                && !newQueue.isEmpty()\n                && newQueue.getItem() != null\n                && newQueue.getItem().getRecoveryPosition() == PlayQueueItem.RECOVERY_UNSET) {\n            databaseUpdateDisposable.add(recordManager.loadStreamState(newQueue.getItem())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    // Do not place initPlayback() in doFinally() because\n                    // it restarts playback after destroy()\n                    //.doFinally()\n                    .subscribe(\n                            state -> {\n                                if (!state.isFinished(newQueue.getItem().getDuration())) {\n                                    // resume playback only if the stream was not played to the end\n                                    newQueue.setRecovery(newQueue.getIndex(),\n                                            state.getProgressMillis());\n                                }\n                                initPlayback(newQueue, playWhenReady);\n                            },\n                            error -> {\n                                if (DEBUG) {\n                                    Log.w(TAG, \"Failed to start playback\", error);\n                                }\n                                // In case any error we can start playback without history\n                                initPlayback(newQueue, playWhenReady);\n                            },\n                            () -> {\n                                // Completed but not found in history\n                                initPlayback(newQueue, playWhenReady);\n                            }\n                    ));\n        } else {\n            // Good to go...\n            // In a case of equal PlayQueues we can re-init old one but only when it is disposed\n            initPlayback(samePlayQueue ? playQueue : newQueue, playWhenReady);\n        }\n\n    }\n\n\n    public void handleIntentPost(final PlayerType oldPlayerType) {\n        if (oldPlayerType != playerType && playQueue != null) {\n            // If playerType changes from one to another we should reload the player\n            // (to disable/enable video stream or to set quality)\n            reloadPlayQueueManager();\n        }\n\n        UIs.call(PlayerUi::setupAfterIntent);\n        NavigationHelper.sendPlayerStartedEvent(context);\n    }\n\n    @Nullable\n    private static PlayQueue getPlayQueueFromCache(@NonNull final Intent intent) {\n        final String queueCache = intent.getStringExtra(PLAY_QUEUE_KEY);\n        if (queueCache == null) {\n            return null;\n        }\n        return SerializedCache.getInstance().take(queueCache, PlayQueue.class);\n    }\n\n    private void initUIsForCurrentPlayerType() {\n        if ((UIs.get(MainPlayerUi.class).isPresent() && playerType == PlayerType.MAIN)\n                || (UIs.get(BackgroundPlayerUi.class).isPresent() && playerType == PlayerType.AUDIO)\n                || (UIs.get(PopupPlayerUi.class).isPresent() && playerType == PlayerType.POPUP)) {\n            // correct UI already in place\n            return;\n        }\n\n        // try to reuse binding if possible\n        final PlayerBinding binding = UIs.get(VideoPlayerUi.class).map(VideoPlayerUi::getBinding)\n                .orElseGet(() -> {\n                    if (playerType == PlayerType.AUDIO) {\n                        return null;\n                    } else {\n                        return PlayerBinding.inflate(LayoutInflater.from(context));\n                    }\n                });\n\n        switch (playerType) {\n            case MAIN:\n                UIs.destroyAll(PopupPlayerUi.class);\n                UIs.destroyAll(BackgroundPlayerUi.class);\n                UIs.addAndPrepare(new MainPlayerUi(this, binding));\n                break;\n            case POPUP:\n                UIs.destroyAll(MainPlayerUi.class);\n                UIs.destroyAll(BackgroundPlayerUi.class);\n                UIs.addAndPrepare(new PopupPlayerUi(this, binding));\n                break;\n            case AUDIO:\n                UIs.destroyAll(VideoPlayerUi.class); // destroys both MainPlayerUi and PopupPlayerUi\n                UIs.addAndPrepare(new BackgroundPlayerUi(this));\n                break;\n        }\n    }\n\n    private void initPlayback(@NonNull final PlayQueue queue,\n                              final boolean playOnReady) {\n        destroyPlayer();\n        initPlayer(playOnReady);\n        final boolean playbackSkipSilence = getPrefs().getBoolean(getContext().getString(\n                R.string.playback_skip_silence_key), getPlaybackSkipSilence());\n        final PlaybackParameters savedParameters = retrievePlaybackParametersFromPrefs(this);\n        setPlaybackParameters(savedParameters.speed, savedParameters.pitch, playbackSkipSilence);\n\n        playQueue = queue;\n        playQueue.init();\n        reloadPlayQueueManager();\n\n        UIs.call(PlayerUi::initPlayback);\n\n        simpleExoPlayer.setVolume(isMuted() ? 0 : 1);\n        notifyQueueUpdateToListeners();\n    }\n\n    private void initPlayer(final boolean playOnReady) {\n        if (DEBUG) {\n            Log.d(TAG, \"initPlayer() called with: playOnReady = [\" + playOnReady + \"]\");\n        }\n\n        simpleExoPlayer = new ExoPlayer.Builder(context, renderFactory)\n                .setTrackSelector(trackSelector)\n                .setLoadControl(loadController)\n                .setUsePlatformDiagnostics(false)\n                .build();\n        simpleExoPlayer.addListener(this);\n        simpleExoPlayer.setPlayWhenReady(playOnReady);\n        simpleExoPlayer.setSeekParameters(PlayerHelper.getSeekParameters(context));\n        simpleExoPlayer.setWakeMode(C.WAKE_MODE_NETWORK);\n        simpleExoPlayer.setHandleAudioBecomingNoisy(true);\n\n        audioReactor = new AudioReactor(context, simpleExoPlayer);\n\n        registerBroadcastReceiver();\n\n        // Setup UIs\n        UIs.call(PlayerUi::initPlayer);\n\n        // Disable media tunneling if requested by the user from ExoPlayer settings\n        if (!PreferenceManager.getDefaultSharedPreferences(context)\n                .getBoolean(context.getString(R.string.disable_media_tunneling_key), false)) {\n            trackSelector.setParameters(trackSelector.buildUponParameters()\n                    .setTunnelingEnabled(true));\n        }\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Destroy and recovery\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Destroy and recovery\n\n    private void destroyPlayer() {\n        if (DEBUG) {\n            Log.d(TAG, \"destroyPlayer() called\");\n        }\n        UIs.call(PlayerUi::destroyPlayer);\n\n        if (!exoPlayerIsNull()) {\n            simpleExoPlayer.removeListener(this);\n            simpleExoPlayer.stop();\n            simpleExoPlayer.release();\n        }\n        if (isProgressLoopRunning()) {\n            stopProgressLoop();\n        }\n        if (playQueue != null) {\n            playQueue.dispose();\n        }\n        if (audioReactor != null) {\n            audioReactor.dispose();\n        }\n        if (playQueueManager != null) {\n            playQueueManager.dispose();\n        }\n    }\n\n    public void destroy() {\n        if (DEBUG) {\n            Log.d(TAG, \"destroy() called\");\n        }\n\n        saveStreamProgressState();\n        setRecovery();\n        stopActivityBinding();\n\n        destroyPlayer();\n        unregisterBroadcastReceiver();\n\n        databaseUpdateDisposable.clear();\n        progressUpdateDisposable.set(null);\n        streamItemDisposable.clear();\n\n        UIs.destroyAll(Object.class); // destroy every UI: obviously every UI extends Object\n    }\n\n    public void setRecovery() {\n        if (playQueue == null || exoPlayerIsNull()) {\n            return;\n        }\n\n        final int queuePos = playQueue.getIndex();\n        final long windowPos = simpleExoPlayer.getCurrentPosition();\n        final long duration = simpleExoPlayer.getDuration();\n\n        // No checks due to https://github.com/TeamNewPipe/NewPipe/pull/7195#issuecomment-962624380\n        setRecovery(queuePos, MathUtils.clamp(windowPos, 0, duration));\n    }\n\n    private void setRecovery(final int queuePos, final long windowPos) {\n        if (playQueue == null || playQueue.size() <= queuePos) {\n            return;\n        }\n\n        if (DEBUG) {\n            Log.d(TAG, \"Setting recovery, queue: \" + queuePos + \", pos: \" + windowPos);\n        }\n        playQueue.setRecovery(queuePos, windowPos);\n    }\n\n    public void reloadPlayQueueManager() {\n        if (playQueueManager != null) {\n            playQueueManager.dispose();\n        }\n\n        if (playQueue != null) {\n            playQueueManager = new MediaSourceManager(this, playQueue);\n        }\n    }\n\n    @Override // own playback listener\n    public void onPlaybackShutdown() {\n        if (DEBUG) {\n            Log.d(TAG, \"onPlaybackShutdown() called\");\n        }\n        // destroys the service, which in turn will destroy the player\n        service.destroyPlayerAndStopService();\n    }\n\n    public void smoothStopForImmediateReusing() {\n        // Pausing would make transition from one stream to a new stream not smooth, so only stop\n        simpleExoPlayer.stop();\n        setRecovery();\n        UIs.call(PlayerUi::smoothStopForImmediateReusing);\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Broadcast receiver\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Broadcast receiver\n\n    /**\n     * This function prepares the broadcast receiver and is called only in the constructor.\n     * Therefore if you want any PlayerUi to receive a broadcast action, you should add it here,\n     * even if that player ui might never be added to the player. In that case the received\n     * broadcast would not do anything.\n     */\n    private void setupBroadcastReceiver() {\n        if (DEBUG) {\n            Log.d(TAG, \"setupBroadcastReceiver() called\");\n        }\n\n        broadcastReceiver = new BroadcastReceiver() {\n            @Override\n            public void onReceive(final Context ctx, final Intent intent) {\n                onBroadcastReceived(intent);\n            }\n        };\n        intentFilter = new IntentFilter();\n\n        intentFilter.addAction(AudioManager.ACTION_AUDIO_BECOMING_NOISY);\n\n        intentFilter.addAction(ACTION_CLOSE);\n        intentFilter.addAction(ACTION_PLAY_PAUSE);\n        intentFilter.addAction(ACTION_PLAY_PREVIOUS);\n        intentFilter.addAction(ACTION_PLAY_NEXT);\n        intentFilter.addAction(ACTION_FAST_REWIND);\n        intentFilter.addAction(ACTION_FAST_FORWARD);\n        intentFilter.addAction(ACTION_REPEAT);\n        intentFilter.addAction(ACTION_SHUFFLE);\n        intentFilter.addAction(ACTION_RECREATE_NOTIFICATION);\n\n        intentFilter.addAction(VideoDetailFragment.ACTION_VIDEO_FRAGMENT_RESUMED);\n        intentFilter.addAction(VideoDetailFragment.ACTION_VIDEO_FRAGMENT_STOPPED);\n\n        intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);\n        intentFilter.addAction(Intent.ACTION_SCREEN_ON);\n        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);\n        intentFilter.addAction(Intent.ACTION_HEADSET_PLUG);\n    }\n\n    private void onBroadcastReceived(final Intent intent) {\n        if (intent == null || intent.getAction() == null) {\n            return;\n        }\n\n        if (DEBUG) {\n            Log.d(TAG, \"onBroadcastReceived() called with: intent = [\" + intent + \"]\");\n        }\n\n        switch (intent.getAction()) {\n            case AudioManager.ACTION_AUDIO_BECOMING_NOISY:\n                pause();\n                break;\n            case ACTION_CLOSE:\n                service.destroyPlayerAndStopService();\n                break;\n            case ACTION_PLAY_PAUSE:\n                playPause();\n                break;\n            case ACTION_PLAY_PREVIOUS:\n                playPrevious();\n                break;\n            case ACTION_PLAY_NEXT:\n                playNext();\n                break;\n            case ACTION_FAST_REWIND:\n                fastRewind();\n                break;\n            case ACTION_FAST_FORWARD:\n                fastForward();\n                break;\n            case ACTION_REPEAT:\n                cycleNextRepeatMode();\n                break;\n            case ACTION_SHUFFLE:\n                toggleShuffleModeEnabled();\n                break;\n            case Intent.ACTION_SCREEN_OFF:\n                screenOn = false;\n                break;\n            case Intent.ACTION_SCREEN_ON:\n                screenOn = true;\n                break;\n            case Intent.ACTION_CONFIGURATION_CHANGED:\n                if (DEBUG) {\n                    Log.d(TAG, \"ACTION_CONFIGURATION_CHANGED received\");\n                }\n                break;\n        }\n\n        UIs.call(playerUi -> playerUi.onBroadcastReceived(intent));\n    }\n\n    private void registerBroadcastReceiver() {\n        // Try to unregister current first\n        unregisterBroadcastReceiver();\n        ContextCompat.registerReceiver(context, broadcastReceiver, intentFilter,\n                ContextCompat.RECEIVER_EXPORTED);\n    }\n\n    private void unregisterBroadcastReceiver() {\n        try {\n            context.unregisterReceiver(broadcastReceiver);\n        } catch (final IllegalArgumentException unregisteredException) {\n            Log.w(TAG, \"Broadcast receiver already unregistered: \"\n                    + unregisteredException.getMessage());\n        }\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Thumbnail loading\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Thumbnail loading\n\n    private void loadCurrentThumbnail(final List<Image> thumbnails) {\n        if (DEBUG) {\n            Log.d(TAG, \"Thumbnail - loadCurrentThumbnail() called with thumbnails = [\"\n                    + thumbnails.size() + \"]\");\n        }\n\n        // Cancel any ongoing image loading\n        if (thumbnailDisposable != null) {\n            thumbnailDisposable.dispose();\n        }\n\n        // Unset currentThumbnail, since it is now outdated. This ensures it is not used in media\n        // session metadata while the new thumbnail is being loaded by Coil.\n        onThumbnailLoaded(null);\n        if (thumbnails.isEmpty()) {\n            return;\n        }\n\n        // scale down the notification thumbnail for performance\n        final var thumbnailTarget = new Target() {\n            @Override\n            public void onError(@Nullable final coil3.Image error) {\n                Log.e(TAG, \"Thumbnail - onError() called\");\n                // there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too.\n                onThumbnailLoaded(null);\n            }\n\n            @Override\n            public void onStart(@Nullable final coil3.Image placeholder) {\n                if (DEBUG) {\n                    Log.d(TAG, \"Thumbnail - onStart() called\");\n                }\n            }\n\n            @Override\n            public void onSuccess(@NonNull final coil3.Image result) {\n                if (DEBUG) {\n                    Log.d(TAG, \"Thumbnail - onSuccess() called with: drawable = [\" + result + \"]\");\n                }\n                // there is a new thumbnail, so e.g. the end screen thumbnail needs to change, too.\n                onThumbnailLoaded(toBitmap(result));\n            }\n        };\n        thumbnailDisposable = CoilHelper.INSTANCE\n                .loadScaledDownThumbnail(context, thumbnails, thumbnailTarget);\n    }\n\n\n    private void onThumbnailLoaded(@Nullable final Bitmap bitmap) {\n        // Avoid useless thumbnail updates, if the thumbnail has not actually changed. Based on the\n        // thumbnail loading code, this if would be skipped only when both bitmaps are `null`, since\n        // onThumbnailLoaded won't be called twice with the same nonnull bitmap by Coil's target.\n        if (currentThumbnail != bitmap) {\n            currentThumbnail = bitmap;\n            UIs.call(playerUi -> playerUi.onThumbnailLoaded(bitmap));\n        }\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playback parameters\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Playback parameters\n\n    public float getPlaybackSpeed() {\n        return getPlaybackParameters().speed;\n    }\n\n    public void setPlaybackSpeed(final float speed) {\n        setPlaybackParameters(speed, getPlaybackPitch(), getPlaybackSkipSilence());\n    }\n\n    public float getPlaybackPitch() {\n        return getPlaybackParameters().pitch;\n    }\n\n    public boolean getPlaybackSkipSilence() {\n        return !exoPlayerIsNull() && simpleExoPlayer.getSkipSilenceEnabled();\n    }\n\n    public PlaybackParameters getPlaybackParameters() {\n        if (exoPlayerIsNull()) {\n            return PlaybackParameters.DEFAULT;\n        }\n        return simpleExoPlayer.getPlaybackParameters();\n    }\n\n    /**\n     * Sets the playback parameters of the player, and also saves them to shared preferences.\n     * Speed and pitch are rounded up to 2 decimal places before being used or saved.\n     *\n     * @param speed       the playback speed, will be rounded to up to 2 decimal places\n     * @param pitch       the playback pitch, will be rounded to up to 2 decimal places\n     * @param skipSilence skip silence during playback\n     */\n    public void setPlaybackParameters(final float speed, final float pitch,\n                                      final boolean skipSilence) {\n        final float roundedSpeed = Math.round(speed * 100.0f) / 100.0f;\n        final float roundedPitch = Math.round(pitch * 100.0f) / 100.0f;\n\n        savePlaybackParametersToPrefs(this, roundedSpeed, roundedPitch, skipSilence);\n        simpleExoPlayer.setPlaybackParameters(\n                new PlaybackParameters(roundedSpeed, roundedPitch));\n        simpleExoPlayer.setSkipSilenceEnabled(skipSilence);\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Progress loop and updates\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Progress loop and updates\n\n    private void onUpdateProgress(final int currentProgress,\n                                  final int duration,\n                                  final int bufferPercent) {\n        if (isPrepared) {\n            UIs.call(ui -> ui.onUpdateProgress(currentProgress, duration, bufferPercent));\n            notifyProgressUpdateToListeners(currentProgress, duration, bufferPercent);\n        }\n    }\n\n    public void startProgressLoop() {\n        progressUpdateDisposable.set(getProgressUpdateDisposable());\n    }\n\n    private void stopProgressLoop() {\n        progressUpdateDisposable.set(null);\n    }\n\n    public boolean isProgressLoopRunning() {\n        return progressUpdateDisposable.get() != null;\n    }\n\n    public void triggerProgressUpdate() {\n        if (exoPlayerIsNull()) {\n            return;\n        }\n\n        onUpdateProgress(Math.max((int) simpleExoPlayer.getCurrentPosition(), 0),\n                (int) simpleExoPlayer.getDuration(), simpleExoPlayer.getBufferedPercentage());\n    }\n\n    private Disposable getProgressUpdateDisposable() {\n        return Observable.interval(PROGRESS_LOOP_INTERVAL_MILLIS, MILLISECONDS,\n                        AndroidSchedulers.mainThread())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(ignored -> triggerProgressUpdate(),\n                        error -> Log.e(TAG, \"Progress update failure: \", error));\n    }\n\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playback states\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Playback states\n    @Override\n    public void onPlayWhenReadyChanged(final boolean playWhenReady, final int reason) {\n        if (DEBUG) {\n            Log.d(TAG, \"ExoPlayer - onPlayWhenReadyChanged() called with: \"\n                    + \"playWhenReady = [\" + playWhenReady + \"], \"\n                    + \"reason = [\" + reason + \"]\");\n        }\n        final int playbackState = exoPlayerIsNull()\n                ? com.google.android.exoplayer2.Player.STATE_IDLE\n                : simpleExoPlayer.getPlaybackState();\n        updatePlaybackState(playWhenReady, playbackState);\n    }\n\n    @Override\n    public void onPlaybackStateChanged(final int playbackState) {\n        if (DEBUG) {\n            Log.d(TAG, \"ExoPlayer - onPlaybackStateChanged() called with: \"\n                    + \"playbackState = [\" + playbackState + \"]\");\n        }\n        updatePlaybackState(getPlayWhenReady(), playbackState);\n    }\n\n    private void updatePlaybackState(final boolean playWhenReady, final int playbackState) {\n        if (DEBUG) {\n            Log.d(TAG, \"ExoPlayer - updatePlaybackState() called with: \"\n                    + \"playWhenReady = [\" + playWhenReady + \"], \"\n                    + \"playbackState = [\" + playbackState + \"]\");\n        }\n\n        if (currentState == STATE_PAUSED_SEEK) {\n            if (DEBUG) {\n                Log.d(TAG, \"updatePlaybackState() is currently blocked\");\n            }\n            return;\n        }\n\n        switch (playbackState) {\n            case com.google.android.exoplayer2.Player.STATE_IDLE: // 1\n                isPrepared = false;\n                break;\n            case com.google.android.exoplayer2.Player.STATE_BUFFERING: // 2\n                if (isPrepared) {\n                    changeState(STATE_BUFFERING);\n                }\n                break;\n            case com.google.android.exoplayer2.Player.STATE_READY: //3\n                if (!isPrepared) {\n                    isPrepared = true;\n                    onPrepared(playWhenReady);\n                }\n                changeState(playWhenReady ? STATE_PLAYING : STATE_PAUSED);\n                break;\n            case com.google.android.exoplayer2.Player.STATE_ENDED: // 4\n                changeState(STATE_COMPLETED);\n                saveStreamProgressStateCompleted();\n                isPrepared = false;\n                break;\n        }\n    }\n\n    @Override // exoplayer listener\n    public void onIsLoadingChanged(final boolean isLoading) {\n        if (!isLoading && currentState == STATE_PAUSED && isProgressLoopRunning()) {\n            stopProgressLoop();\n        } else if (isLoading && !isProgressLoopRunning()) {\n            startProgressLoop();\n        }\n    }\n\n    @Override // own playback listener\n    public void onPlaybackBlock() {\n        if (exoPlayerIsNull()) {\n            return;\n        }\n        if (DEBUG) {\n            Log.d(TAG, \"Playback - onPlaybackBlock() called\");\n        }\n\n        currentItem = null;\n        currentMetadata = null;\n        simpleExoPlayer.stop();\n        isPrepared = false;\n\n        changeState(STATE_BLOCKED);\n    }\n\n    @Override // own playback listener\n    public void onPlaybackUnblock(final MediaSource mediaSource) {\n        if (DEBUG) {\n            Log.d(TAG, \"Playback - onPlaybackUnblock() called\");\n        }\n\n        if (exoPlayerIsNull()) {\n            return;\n        }\n        if (currentState == STATE_BLOCKED) {\n            changeState(STATE_BUFFERING);\n        }\n        simpleExoPlayer.setMediaSource(mediaSource, false);\n        simpleExoPlayer.prepare();\n    }\n\n    public void changeState(final int state) {\n        if (DEBUG) {\n            Log.d(TAG, \"changeState() called with: state = [\" + state + \"]\");\n        }\n        currentState = state;\n        switch (state) {\n            case STATE_BLOCKED:\n                onBlocked();\n                break;\n            case STATE_PLAYING:\n                onPlaying();\n                break;\n            case STATE_BUFFERING:\n                onBuffering();\n                break;\n            case STATE_PAUSED:\n                onPaused();\n                break;\n            case STATE_PAUSED_SEEK:\n                onPausedSeek();\n                break;\n            case STATE_COMPLETED:\n                onCompleted();\n                break;\n        }\n        notifyPlaybackUpdateToListeners();\n    }\n\n    private void onPrepared(final boolean playWhenReady) {\n        if (DEBUG) {\n            Log.d(TAG, \"onPrepared() called with: playWhenReady = [\" + playWhenReady + \"]\");\n        }\n\n        UIs.call(PlayerUi::onPrepared);\n\n        if (playWhenReady && !isMuted()) {\n            audioReactor.requestAudioFocus();\n        }\n    }\n\n    private void onBlocked() {\n        if (DEBUG) {\n            Log.d(TAG, \"onBlocked() called\");\n        }\n        if (!isProgressLoopRunning()) {\n            startProgressLoop();\n        }\n\n        UIs.call(PlayerUi::onBlocked);\n    }\n\n    private void onPlaying() {\n        if (DEBUG) {\n            Log.d(TAG, \"onPlaying() called\");\n        }\n        if (!isProgressLoopRunning()) {\n            startProgressLoop();\n        }\n\n        UIs.call(PlayerUi::onPlaying);\n    }\n\n    private void onBuffering() {\n        if (DEBUG) {\n            Log.d(TAG, \"onBuffering() called\");\n        }\n\n        UIs.call(PlayerUi::onBuffering);\n    }\n\n    private void onPaused() {\n        if (DEBUG) {\n            Log.d(TAG, \"onPaused() called\");\n        }\n\n        if (isProgressLoopRunning()) {\n            stopProgressLoop();\n        }\n\n        UIs.call(PlayerUi::onPaused);\n    }\n\n    private void onPausedSeek() {\n        if (DEBUG) {\n            Log.d(TAG, \"onPausedSeek() called\");\n        }\n        UIs.call(PlayerUi::onPausedSeek);\n    }\n\n    private void onCompleted() {\n        if (DEBUG) {\n            Log.d(TAG, \"onCompleted() called\" + (playQueue == null ? \". playQueue is null\" : \"\"));\n        }\n        if (playQueue == null) {\n            return;\n        }\n\n        UIs.call(PlayerUi::onCompleted);\n\n        if (playQueue.getIndex() < playQueue.size() - 1) {\n            playQueue.offsetIndex(+1);\n        }\n        if (isProgressLoopRunning()) {\n            stopProgressLoop();\n        }\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Repeat and shuffle\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Repeat and shuffle\n\n    @RepeatMode\n    public int getRepeatMode() {\n        return exoPlayerIsNull() ? REPEAT_MODE_OFF : simpleExoPlayer.getRepeatMode();\n    }\n\n    public void cycleNextRepeatMode() {\n        if (!exoPlayerIsNull()) {\n            @RepeatMode final int repeatMode;\n            switch (simpleExoPlayer.getRepeatMode()) {\n                case REPEAT_MODE_OFF:\n                    repeatMode = REPEAT_MODE_ONE;\n                    break;\n                case REPEAT_MODE_ONE:\n                    repeatMode = REPEAT_MODE_ALL;\n                    break;\n                case REPEAT_MODE_ALL:\n                default:\n                    repeatMode = REPEAT_MODE_OFF;\n                    break;\n            }\n            simpleExoPlayer.setRepeatMode(repeatMode);\n        }\n    }\n\n    @Override\n    public void onRepeatModeChanged(@RepeatMode final int repeatMode) {\n        if (DEBUG) {\n            Log.d(TAG, \"ExoPlayer - onRepeatModeChanged() called with: \"\n                    + \"repeatMode = [\" + repeatMode + \"]\");\n        }\n        UIs.call(playerUi -> playerUi.onRepeatModeChanged(repeatMode));\n        notifyPlaybackUpdateToListeners();\n    }\n\n    @Override\n    public void onShuffleModeEnabledChanged(final boolean shuffleModeEnabled) {\n        if (DEBUG) {\n            Log.d(TAG, \"ExoPlayer - onShuffleModeEnabledChanged() called with: \"\n                    + \"mode = [\" + shuffleModeEnabled + \"]\");\n        }\n\n        if (playQueue != null) {\n            if (shuffleModeEnabled) {\n                playQueue.shuffle();\n            } else {\n                playQueue.unshuffle();\n            }\n        }\n\n        UIs.call(playerUi -> playerUi.onShuffleModeEnabledChanged(shuffleModeEnabled));\n        notifyPlaybackUpdateToListeners();\n    }\n\n    public void toggleShuffleModeEnabled() {\n        if (!exoPlayerIsNull()) {\n            simpleExoPlayer.setShuffleModeEnabled(!simpleExoPlayer.getShuffleModeEnabled());\n        }\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Mute / Unmute\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Mute / Unmute\n\n    public void toggleMute() {\n        final boolean wasMuted = isMuted();\n        simpleExoPlayer.setVolume(wasMuted ? 1 : 0);\n        if (wasMuted) {\n            audioReactor.requestAudioFocus();\n        } else {\n            audioReactor.abandonAudioFocus();\n        }\n        UIs.call(playerUi -> playerUi.onMuteUnmuteChanged(!wasMuted));\n        notifyPlaybackUpdateToListeners();\n    }\n\n    public boolean isMuted() {\n        return !exoPlayerIsNull() && simpleExoPlayer.getVolume() == 0;\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // ExoPlayer listeners (that didn't fit in other categories)\n    //////////////////////////////////////////////////////////////////////////*/\n    //region ExoPlayer listeners (that didn't fit in other categories)\n\n    /**\n     * <p>Listens for event or state changes on ExoPlayer. When any event happens, we check for\n     * changes in the currently-playing metadata and update the encapsulating\n     * {@link Player}. Downstream listeners are also informed.</p>\n     *\n     * <p>When the renewed metadata contains any error, it is reported as a notification.\n     * This is done because not all source resolution errors are {@link PlaybackException}, which\n     * are also captured by {@link ExoPlayer} and stops the playback.</p>\n     *\n     * @param player The {@link com.google.android.exoplayer2.Player} whose state changed.\n     * @param events The {@link com.google.android.exoplayer2.Player.Events} that has triggered\n     *               the player state changes.\n     **/\n    @Override\n    public void onEvents(@NonNull final com.google.android.exoplayer2.Player player,\n                         @NonNull final com.google.android.exoplayer2.Player.Events events) {\n        Listener.super.onEvents(player, events);\n        MediaItemTag.from(player.getCurrentMediaItem()).ifPresent(tag -> {\n            if (tag == currentMetadata) {\n                return; // we still have the same metadata, no need to do anything\n            }\n            final StreamInfo previousInfo = Optional.ofNullable(currentMetadata)\n                    .flatMap(MediaItemTag::getMaybeStreamInfo).orElse(null);\n            final MediaItemTag.AudioTrack previousAudioTrack =\n                    Optional.ofNullable(currentMetadata)\n                            .flatMap(MediaItemTag::getMaybeAudioTrack).orElse(null);\n            currentMetadata = tag;\n\n            if (!currentMetadata.getErrors().isEmpty()) {\n                // new errors might have been added even if previousInfo == tag.getMaybeStreamInfo()\n                final ErrorInfo errorInfo = new ErrorInfo(\n                        currentMetadata.getErrors(),\n                        UserAction.PLAY_STREAM,\n                        \"Loading failed for [\" + currentMetadata.getTitle()\n                                + \"]: \" + currentMetadata.getStreamUrl(),\n                        currentMetadata.getServiceId(),\n                        currentMetadata.getStreamUrl());\n                ErrorUtil.createNotification(context, errorInfo);\n            }\n\n            currentMetadata.getMaybeStreamInfo().ifPresent(info -> {\n                if (DEBUG) {\n                    Log.d(TAG, \"ExoPlayer - onEvents() update stream info: \" + info.getName());\n                }\n                if (previousInfo == null || !previousInfo.getUrl().equals(info.getUrl())) {\n                    // only update with the new stream info if it has actually changed\n                    updateMetadataWith(info);\n                } else if (previousAudioTrack == null\n                        || tag.getMaybeAudioTrack()\n                        .map(t -> t.getSelectedAudioStreamIndex()\n                                != previousAudioTrack.getSelectedAudioStreamIndex())\n                        .orElse(false)) {\n                    notifyAudioTrackUpdateToListeners();\n                }\n            });\n        });\n    }\n\n    @Override\n    public void onTracksChanged(@NonNull final Tracks tracks) {\n        if (DEBUG) {\n            Log.d(TAG, \"ExoPlayer - onTracksChanged(), \"\n                    + \"track group size = \" + tracks.getGroups().size());\n        }\n        UIs.call(playerUi -> playerUi.onTextTracksChanged(tracks));\n    }\n\n    @Override\n    public void onPlaybackParametersChanged(@NonNull final PlaybackParameters playbackParameters) {\n        if (DEBUG) {\n            Log.d(TAG, \"ExoPlayer - playbackParameters(), speed = [\" + playbackParameters.speed\n                    + \"], pitch = [\" + playbackParameters.pitch + \"]\");\n        }\n        UIs.call(playerUi -> playerUi.onPlaybackParametersChanged(playbackParameters));\n    }\n\n    @Override\n    public void onPositionDiscontinuity(@NonNull final PositionInfo oldPosition,\n                                        @NonNull final PositionInfo newPosition,\n                                        @DiscontinuityReason final int discontinuityReason) {\n        if (DEBUG) {\n            Log.d(TAG, \"ExoPlayer - onPositionDiscontinuity() called with \"\n                    + \"oldPositionIndex = [\" + oldPosition.mediaItemIndex + \"], \"\n                    + \"oldPositionMs = [\" + oldPosition.positionMs + \"], \"\n                    + \"newPositionIndex = [\" + newPosition.mediaItemIndex + \"], \"\n                    + \"newPositionMs = [\" + newPosition.positionMs + \"], \"\n                    + \"discontinuityReason = [\" + discontinuityReason + \"]\");\n        }\n        if (playQueue == null) {\n            return;\n        }\n\n        // Refresh the playback if there is a transition to the next video\n        final int newIndex = newPosition.mediaItemIndex;\n        switch (discontinuityReason) {\n            case DISCONTINUITY_REASON_AUTO_TRANSITION:\n            case DISCONTINUITY_REASON_REMOVE:\n                // When player is in single repeat mode and a period transition occurs,\n                // we need to register a view count here since no metadata has changed\n                if (getRepeatMode() == REPEAT_MODE_ONE && newIndex == playQueue.getIndex()) {\n                    registerStreamViewed();\n                    break;\n                }\n            case DISCONTINUITY_REASON_SEEK:\n                if (DEBUG) {\n                    Log.d(TAG, \"ExoPlayer - onSeekProcessed() called\");\n                }\n                if (isPrepared) {\n                    saveStreamProgressState();\n                }\n            case DISCONTINUITY_REASON_SEEK_ADJUSTMENT:\n            case DISCONTINUITY_REASON_INTERNAL:\n                // Player index may be invalid when playback is blocked\n                if (getCurrentState() != STATE_BLOCKED && newIndex != playQueue.getIndex()) {\n                    saveStreamProgressStateCompleted(); // current stream has ended\n                    playQueue.setIndex(newIndex);\n                }\n                break;\n            case DISCONTINUITY_REASON_SKIP:\n                break; // only makes Android Studio linter happy, as there are no ads\n        }\n    }\n\n    @Override\n    public void onRenderedFirstFrame() {\n        UIs.call(PlayerUi::onRenderedFirstFrame);\n    }\n\n    @Override\n    public void onCues(@NonNull final CueGroup cueGroup) {\n        UIs.call(playerUi -> playerUi.onCues(cueGroup.cues));\n    }\n\n    /**\n     * To be called when the {@code PlaybackPreparer} set in the {@link MediaSessionConnector}\n     * receives an {@code onPrepare()} call. This function allows restoring the default behavior\n     * that would happen if there was no playback preparer set, i.e. to just call\n     * {@code player.prepare()}. You can find the default behavior in `onPlay()` inside the\n     * {@link MediaSessionConnector} file.\n     */\n    public void onPrepare() {\n        if (!exoPlayerIsNull()) {\n            simpleExoPlayer.prepare();\n        }\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Errors\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Errors\n\n    /**\n     * Process exceptions produced by {@link com.google.android.exoplayer2.ExoPlayer ExoPlayer}.\n     * <p>There are multiple types of errors:</p>\n     * <ul>\n     * <li>{@link PlaybackException#ERROR_CODE_BEHIND_LIVE_WINDOW BEHIND_LIVE_WINDOW}:\n     * If the playback on livestreams are lagged too far behind the current playable\n     * window. Then we seek to the latest timestamp and restart the playback.\n     * This error is <b>catchable</b>.\n     * </li>\n     * <li>From {@link PlaybackException#ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE BAD_IO} to\n     * {@link PlaybackException#ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED UNSUPPORTED_FORMATS}:\n     * If the stream source is validated by the extractor but not recognized by the player,\n     * then we can try to recover playback by signalling an error on the {@link PlayQueue}.</li>\n     * <li>For {@link PlaybackException#ERROR_CODE_TIMEOUT PLAYER_TIMEOUT},\n     * {@link PlaybackException#ERROR_CODE_IO_UNSPECIFIED MEDIA_SOURCE_RESOLVER_TIMEOUT} and\n     * {@link PlaybackException#ERROR_CODE_IO_NETWORK_CONNECTION_FAILED NO_NETWORK}:\n     * We can keep set the recovery record and keep to player at the current state until\n     * it is ready to play by restarting the {@link MediaSourceManager}.</li>\n     * <li>On any ExoPlayer specific issue internal to its device interaction, such as\n     * {@link PlaybackException#ERROR_CODE_DECODER_INIT_FAILED DECODER_ERROR}:\n     * We terminate the playback.</li>\n     * <li>For any other unspecified issue internal: We set a recovery and try to restart\n     * the playback.</li>\n     * For any error above that is <b>not</b> explicitly <b>catchable</b>, the player will\n     * create a notification so users are aware.\n     * </ul>\n     *\n     * @see com.google.android.exoplayer2.Player.Listener#onPlayerError(PlaybackException)\n     */\n    // Any error code not explicitly covered here are either unrelated to NewPipe use case\n    // (e.g. DRM) or not recoverable (e.g. Decoder error). In both cases, the player should\n    // shutdown.\n    @SuppressWarnings(\"SwitchIntDef\")\n    @Override\n    public void onPlayerError(@NonNull final PlaybackException error) {\n        Log.e(TAG, \"ExoPlayer - onPlayerError() called with:\", error);\n\n        saveStreamProgressState();\n        boolean isCatchableException = false;\n\n        switch (error.errorCode) {\n            case ERROR_CODE_BEHIND_LIVE_WINDOW:\n                isCatchableException = true;\n                simpleExoPlayer.seekToDefaultPosition();\n                simpleExoPlayer.prepare();\n                // Inform the user that we are reloading the stream by\n                // switching to the buffering state\n                onBuffering();\n                break;\n            case ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE:\n            case ERROR_CODE_IO_BAD_HTTP_STATUS:\n            case ERROR_CODE_IO_FILE_NOT_FOUND:\n            case ERROR_CODE_IO_NO_PERMISSION:\n            case ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED:\n            case ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE:\n            case ERROR_CODE_PARSING_CONTAINER_MALFORMED:\n            case ERROR_CODE_PARSING_MANIFEST_MALFORMED:\n            case ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED:\n            case ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED:\n                // Source errors, signal on playQueue and move on:\n                if (!exoPlayerIsNull() && playQueue != null) {\n                    playQueue.error();\n                }\n                break;\n            case ERROR_CODE_TIMEOUT:\n            case ERROR_CODE_IO_UNSPECIFIED:\n            case ERROR_CODE_IO_NETWORK_CONNECTION_FAILED:\n            case ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT:\n            case ERROR_CODE_UNSPECIFIED:\n                // Reload playback on unexpected errors:\n                setRecovery();\n                reloadPlayQueueManager();\n                break;\n            default:\n                // API, remote and renderer errors belong here:\n                onPlaybackShutdown();\n                break;\n        }\n\n        if (!isCatchableException) {\n            createErrorNotification(error);\n        }\n\n        if (fragmentListener != null) {\n            fragmentListener.onPlayerError(error, isCatchableException);\n        }\n    }\n\n    private void createErrorNotification(@NonNull final PlaybackException error) {\n        final ErrorInfo errorInfo;\n        if (currentMetadata == null) {\n            errorInfo = new ErrorInfo(error, UserAction.PLAY_STREAM,\n                    \"Player error[type=\" + error.getErrorCodeName()\n                            + \"] occurred, currentMetadata is null\");\n        } else {\n            errorInfo = new ErrorInfo(error, UserAction.PLAY_STREAM,\n                    \"Player error[type=\" + error.getErrorCodeName()\n                            + \"] occurred while playing \" + currentMetadata.getStreamUrl(),\n                    currentMetadata.getServiceId(), currentMetadata.getStreamUrl());\n        }\n        ErrorUtil.createNotification(context, errorInfo);\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playback position and seek\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Playback position and seek\n\n    @Override // own playback listener (this is a getter)\n    public boolean isApproachingPlaybackEdge(final long timeToEndMillis) {\n        // If live, then not near playback edge\n        // If not playing, then not approaching playback edge\n        if (exoPlayerIsNull() || isLive() || !isPlaying()) {\n            return false;\n        }\n\n        final long currentPositionMillis = simpleExoPlayer.getCurrentPosition();\n        final long currentDurationMillis = simpleExoPlayer.getDuration();\n        return currentDurationMillis - currentPositionMillis < timeToEndMillis;\n    }\n\n    /**\n     * Checks if the current playback is a livestream AND is playing at or beyond the live edge.\n     *\n     * @return whether the livestream is playing at or beyond the edge\n     */\n    @SuppressWarnings(\"BooleanMethodIsAlwaysInverted\")\n    public boolean isLiveEdge() {\n        if (exoPlayerIsNull() || !isLive()) {\n            return false;\n        }\n\n        final Timeline currentTimeline = simpleExoPlayer.getCurrentTimeline();\n        final int currentWindowIndex = simpleExoPlayer.getCurrentMediaItemIndex();\n        if (currentTimeline.isEmpty() || currentWindowIndex < 0\n                || currentWindowIndex >= currentTimeline.getWindowCount()) {\n            return false;\n        }\n\n        final Timeline.Window timelineWindow = new Timeline.Window();\n        currentTimeline.getWindow(currentWindowIndex, timelineWindow);\n        return timelineWindow.getDefaultPositionMs() <= simpleExoPlayer.getCurrentPosition();\n    }\n\n    @Override // own playback listener\n    public void onPlaybackSynchronize(@NonNull final PlayQueueItem item, final boolean wasBlocked) {\n        if (DEBUG) {\n            Log.d(TAG, \"Playback - onPlaybackSynchronize(was blocked: \" + wasBlocked\n                    + \") called with item=[\" + item.getTitle() + \"], url=[\" + item.getUrl() + \"]\");\n        }\n        if (exoPlayerIsNull() || playQueue == null || currentItem == item) {\n            return; // nothing to synchronize\n        }\n\n        final int playQueueIndex = playQueue.indexOf(item);\n        final int playlistIndex = simpleExoPlayer.getCurrentMediaItemIndex();\n        final int playlistSize = simpleExoPlayer.getCurrentTimeline().getWindowCount();\n        final boolean removeThumbnailBeforeSync = currentItem == null\n                || currentItem.getServiceId() != item.getServiceId()\n                || !currentItem.getUrl().equals(item.getUrl());\n\n        currentItem = item;\n\n        if (playQueueIndex != playQueue.getIndex()) {\n            // wrong window (this should be impossible, as this method is called with\n            // `item=playQueue.getItem()`, so the index of that item must be equal to `getIndex()`)\n            Log.e(TAG, \"Playback - Play Queue may be not in sync: item index=[\"\n                    + playQueueIndex + \"], \" + \"queue index=[\" + playQueue.getIndex() + \"]\");\n\n        } else if ((playlistSize > 0 && playQueueIndex >= playlistSize) || playQueueIndex < 0) {\n            // the queue and the player's timeline are not in sync, since the play queue index\n            // points outside of the timeline\n            Log.e(TAG, \"Playback - Trying to seek to invalid index=[\" + playQueueIndex\n                    + \"] with playlist length=[\" + playlistSize + \"]\");\n\n        } else if (wasBlocked || playlistIndex != playQueueIndex || !isPlaying()) {\n            // either the player needs to be unblocked, or the play queue index has just been\n            // changed and needs to be synchronized, or the player is not playing\n            if (DEBUG) {\n                Log.d(TAG, \"Playback - Rewinding to correct index=[\" + playQueueIndex + \"], \"\n                        + \"from=[\" + playlistIndex + \"], size=[\" + playlistSize + \"].\");\n            }\n\n            if (removeThumbnailBeforeSync) {\n                // unset the current (now outdated) thumbnail to ensure it is not used during sync\n                onThumbnailLoaded(null);\n            }\n\n            // sync the player index with the queue index, and seek to the correct position\n            if (item.getRecoveryPosition() != PlayQueueItem.RECOVERY_UNSET) {\n                simpleExoPlayer.seekTo(playQueueIndex, item.getRecoveryPosition());\n                playQueue.unsetRecovery(playQueueIndex);\n            } else {\n                simpleExoPlayer.seekToDefaultPosition(playQueueIndex);\n            }\n        }\n    }\n\n    public void seekTo(final long positionMillis) {\n        if (DEBUG) {\n            Log.d(TAG, \"seekBy() called with: position = [\" + positionMillis + \"]\");\n        }\n        if (!exoPlayerIsNull()) {\n            // prevent invalid positions when fast-forwarding/-rewinding\n            simpleExoPlayer.seekTo(MathUtils.clamp(positionMillis, 0,\n                    simpleExoPlayer.getDuration()));\n        }\n    }\n\n    private void seekBy(final long offsetMillis) {\n        if (DEBUG) {\n            Log.d(TAG, \"seekBy() called with: offsetMillis = [\" + offsetMillis + \"]\");\n        }\n        seekTo(simpleExoPlayer.getCurrentPosition() + offsetMillis);\n    }\n\n    public void seekToDefault() {\n        if (!exoPlayerIsNull()) {\n            simpleExoPlayer.seekToDefaultPosition();\n        }\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Player actions (play, pause, previous, fast-forward, ...)\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Player actions (play, pause, previous, fast-forward, ...)\n\n    public void play() {\n        if (DEBUG) {\n            Log.d(TAG, \"play() called\");\n        }\n        if (audioReactor == null || playQueue == null || exoPlayerIsNull()) {\n            return;\n        }\n\n        if (!isMuted()) {\n            audioReactor.requestAudioFocus();\n        }\n\n        if (currentState == STATE_COMPLETED) {\n            if (playQueue.getIndex() == 0) {\n                seekToDefault();\n            } else {\n                playQueue.setIndex(0);\n            }\n        }\n\n        simpleExoPlayer.play();\n        saveStreamProgressState();\n    }\n\n    public void pause() {\n        if (DEBUG) {\n            Log.d(TAG, \"pause() called\");\n        }\n        if (audioReactor == null || exoPlayerIsNull()) {\n            return;\n        }\n\n        audioReactor.abandonAudioFocus();\n        simpleExoPlayer.pause();\n        saveStreamProgressState();\n    }\n\n    public void playPause() {\n        if (DEBUG) {\n            Log.d(TAG, \"onPlayPause() called\");\n        }\n\n        if (getPlayWhenReady()\n                // When state is completed (replay button is shown) then (re)play and do not pause\n                && currentState != STATE_COMPLETED) {\n            pause();\n        } else {\n            play();\n        }\n    }\n\n    public void playPrevious() {\n        if (DEBUG) {\n            Log.d(TAG, \"onPlayPrevious() called\");\n        }\n        if (exoPlayerIsNull() || playQueue == null) {\n            return;\n        }\n\n        /* If current playback has run for PLAY_PREV_ACTIVATION_LIMIT_MILLIS milliseconds,\n         * restart current track. Also restart the track if the current track\n         * is the first in a queue.*/\n        if (simpleExoPlayer.getCurrentPosition() > PLAY_PREV_ACTIVATION_LIMIT_MILLIS\n                || playQueue.getIndex() == 0) {\n            seekToDefault();\n            playQueue.offsetIndex(0);\n        } else {\n            saveStreamProgressState();\n            playQueue.offsetIndex(-1);\n        }\n        triggerProgressUpdate();\n    }\n\n    public void playNext() {\n        if (DEBUG) {\n            Log.d(TAG, \"onPlayNext() called\");\n        }\n        if (playQueue == null) {\n            return;\n        }\n\n        saveStreamProgressState();\n        playQueue.offsetIndex(+1);\n        triggerProgressUpdate();\n    }\n\n    public void fastForward() {\n        if (DEBUG) {\n            Log.d(TAG, \"fastRewind() called\");\n        }\n        seekBy(retrieveSeekDurationFromPreferences(this));\n        triggerProgressUpdate();\n    }\n\n    public void fastRewind() {\n        if (DEBUG) {\n            Log.d(TAG, \"fastRewind() called\");\n        }\n        seekBy(-retrieveSeekDurationFromPreferences(this));\n        triggerProgressUpdate();\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // StreamInfo history: views and progress\n    //////////////////////////////////////////////////////////////////////////*/\n    //region StreamInfo history: views and progress\n\n    private void registerStreamViewed() {\n        getCurrentStreamInfo().ifPresent(info -> databaseUpdateDisposable\n                .add(recordManager.onViewed(info).onErrorComplete().subscribe()));\n    }\n\n    private void saveStreamProgressState(final long progressMillis) {\n        getCurrentStreamInfo().ifPresent(info -> {\n            if (!prefs.getBoolean(context.getString(R.string.enable_watch_history_key), true)) {\n                return;\n            }\n            if (DEBUG) {\n                Log.d(TAG, \"saveStreamProgressState() called with: progressMillis=\" + progressMillis\n                        + \", currentMetadata=[\" + info.getName() + \"]\");\n            }\n\n            databaseUpdateDisposable.add(recordManager.saveStreamState(info, progressMillis)\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .doOnError(e -> {\n                        if (DEBUG) {\n                            e.printStackTrace();\n                        }\n                    })\n                    .onErrorComplete()\n                    .subscribe());\n        });\n    }\n\n    public void saveStreamProgressState() {\n        if (exoPlayerIsNull() || currentMetadata == null || playQueue == null\n                || playQueue.getIndex() != simpleExoPlayer.getCurrentMediaItemIndex()) {\n            // Make sure play queue and current window index are equal, to prevent saving state for\n            // the wrong stream on discontinuity (e.g. when the stream just changed but the\n            // playQueue index and currentMetadata still haven't updated)\n            return;\n        }\n        // Save current position. It will help to restore this position once a user\n        // wants to play prev or next stream from the queue\n        playQueue.setRecovery(playQueue.getIndex(), simpleExoPlayer.getContentPosition());\n        saveStreamProgressState(simpleExoPlayer.getCurrentPosition());\n    }\n\n    public void saveStreamProgressStateCompleted() {\n        // current stream has ended, so the progress is its duration (+1 to overcome rounding)\n        getCurrentStreamInfo().ifPresent(info ->\n                saveStreamProgressState((info.getDuration() + 1) * 1000));\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Metadata\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Metadata\n\n    private void updateMetadataWith(@NonNull final StreamInfo info) {\n        if (DEBUG) {\n            Log.d(TAG, \"Playback - onMetadataChanged() called, playing: \" + info.getName());\n        }\n        if (exoPlayerIsNull()) {\n            return;\n        }\n\n        maybeAutoQueueNextStream(info);\n\n        loadCurrentThumbnail(info.getThumbnails());\n        registerStreamViewed();\n\n        notifyMetadataUpdateToListeners();\n        notifyAudioTrackUpdateToListeners();\n        UIs.call(playerUi -> playerUi.onMetadataChanged(info));\n    }\n\n    @NonNull\n    public String getVideoUrl() {\n        return currentMetadata == null\n                ? context.getString(R.string.unknown_content)\n                : currentMetadata.getStreamUrl();\n    }\n\n    @NonNull\n    public String getVideoUrlAtCurrentTime() {\n        final long timeSeconds = simpleExoPlayer.getCurrentPosition() / 1000;\n        String videoUrl = getVideoUrl();\n        if (!isLive() && timeSeconds >= 0 && currentMetadata != null\n                && currentMetadata.getServiceId() == YouTube.getServiceId()) {\n            // Timestamp doesn't make sense in a live stream so drop it\n            videoUrl += (\"&t=\" + timeSeconds);\n        }\n        return videoUrl;\n    }\n\n    @NonNull\n    public String getVideoTitle() {\n        return currentMetadata == null\n                ? context.getString(R.string.unknown_content)\n                : currentMetadata.getTitle();\n    }\n\n    @NonNull\n    public String getUploaderName() {\n        return currentMetadata == null\n                ? context.getString(R.string.unknown_content)\n                : currentMetadata.getUploaderName();\n    }\n\n    @Nullable\n    public Bitmap getThumbnail() {\n        return currentThumbnail;\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Play queue, segments and streams\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Play queue, segments and streams\n\n    private void maybeAutoQueueNextStream(@NonNull final StreamInfo info) {\n        if (playQueue == null || playQueue.getIndex() != playQueue.size() - 1\n                || getRepeatMode() != REPEAT_MODE_OFF\n                || !PlayerHelper.isAutoQueueEnabled(context)) {\n            return;\n        }\n        // auto queue when starting playback on the last item when not repeating\n        final PlayQueue autoQueue = PlayerHelper.autoQueueOf(info,\n                playQueue.getStreams());\n        if (autoQueue != null) {\n            playQueue.append(autoQueue.getStreams());\n        }\n    }\n\n    public void selectQueueItem(final PlayQueueItem item) {\n        if (playQueue == null || exoPlayerIsNull()) {\n            return;\n        }\n\n        final int index = playQueue.indexOf(item);\n        if (index == -1) {\n            return;\n        }\n\n        if (playQueue.getIndex() == index && simpleExoPlayer.getCurrentMediaItemIndex() == index) {\n            seekToDefault();\n        } else {\n            saveStreamProgressState();\n        }\n        playQueue.setIndex(index);\n    }\n\n    @Override\n    public void onPlayQueueEdited() {\n        notifyPlaybackUpdateToListeners();\n        UIs.call(PlayerUi::onPlayQueueEdited);\n    }\n\n    @Override // own playback listener\n    @Nullable\n    public MediaSource sourceOf(final PlayQueueItem item, final StreamInfo info) {\n        if (audioPlayerSelected()) {\n            return audioResolver.resolve(info);\n        }\n\n        if (isAudioOnly && videoResolver.getStreamSourceType().orElse(\n                SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY)\n                == SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY) {\n            // If the current info has only video streams with audio and if the stream is played as\n            // audio, we need to use the audio resolver, otherwise the video stream will be played\n            // in background.\n            return audioResolver.resolve(info);\n        }\n\n        // Even if the stream is played in background, we need to use the video resolver if the\n        // info played is separated video-only and audio-only streams; otherwise, if the audio\n        // resolver was called when the app was in background, the app will only stream audio when\n        // the user come back to the app and will never fetch the video stream.\n        // Note that the video is not fetched when the app is in background because the video\n        // renderer is fully disabled (see useVideoAndSubtitles method), except for HLS streams\n        // (see https://github.com/google/ExoPlayer/issues/9282).\n        return videoResolver.resolve(info);\n    }\n\n    public void disablePreloadingOfCurrentTrack() {\n        loadController.disablePreloadingOfCurrentTrack();\n    }\n\n    public Optional<VideoStream> getSelectedVideoStream() {\n        return Optional.ofNullable(currentMetadata)\n                .flatMap(MediaItemTag::getMaybeQuality)\n                .filter(quality -> {\n                    final int selectedStreamIndex = quality.getSelectedVideoStreamIndex();\n                    return selectedStreamIndex >= 0\n                            && selectedStreamIndex < quality.getSortedVideoStreams().size();\n                })\n                .map(quality -> quality.getSortedVideoStreams()\n                        .get(quality.getSelectedVideoStreamIndex()));\n    }\n\n    public Optional<AudioStream> getSelectedAudioStream() {\n        return Optional.ofNullable(currentMetadata)\n                .flatMap(MediaItemTag::getMaybeAudioTrack)\n                .map(MediaItemTag.AudioTrack::getSelectedAudioStream);\n    }\n    //endregion\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Captions (text tracks)\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Captions (text tracks)\n\n    public int getCaptionRendererIndex() {\n        if (exoPlayerIsNull()) {\n            return RENDERER_UNAVAILABLE;\n        }\n\n        for (int t = 0; t < simpleExoPlayer.getRendererCount(); t++) {\n            if (simpleExoPlayer.getRendererType(t) == C.TRACK_TYPE_TEXT) {\n                return t;\n            }\n        }\n\n        return RENDERER_UNAVAILABLE;\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Video size\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Video size\n    @Override // exoplayer listener\n    public void onVideoSizeChanged(@NonNull final VideoSize videoSize) {\n        if (DEBUG) {\n            Log.d(TAG, \"onVideoSizeChanged() called with: \"\n                    + \"width / height = [\" + videoSize.width + \" / \" + videoSize.height\n                    + \" = \" + (((float) videoSize.width) / videoSize.height) + \"], \"\n                    + \"unappliedRotationDegrees = [\" + videoSize.unappliedRotationDegrees + \"], \"\n                    + \"pixelWidthHeightRatio = [\" + videoSize.pixelWidthHeightRatio + \"]\");\n        }\n\n        UIs.call(playerUi -> playerUi.onVideoSizeChanged(videoSize));\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Activity / fragment binding\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Activity / fragment binding\n\n    public void setFragmentListener(final PlayerServiceEventListener listener) {\n        fragmentListener = listener;\n        UIs.call(PlayerUi::onFragmentListenerSet);\n        notifyQueueUpdateToListeners();\n        notifyMetadataUpdateToListeners();\n        notifyPlaybackUpdateToListeners();\n        triggerProgressUpdate();\n    }\n\n    public void removeFragmentListener(final PlayerServiceEventListener listener) {\n        if (fragmentListener == listener) {\n            fragmentListener = null;\n        }\n    }\n\n    void setActivityListener(final PlayerEventListener listener) {\n        activityListener = listener;\n        // TODO why not queue update?\n        notifyMetadataUpdateToListeners();\n        notifyPlaybackUpdateToListeners();\n        triggerProgressUpdate();\n    }\n\n    void removeActivityListener(final PlayerEventListener listener) {\n        if (activityListener == listener) {\n            activityListener = null;\n        }\n    }\n\n    void stopActivityBinding() {\n        if (fragmentListener != null) {\n            fragmentListener.onServiceStopped();\n            fragmentListener = null;\n        }\n        if (activityListener != null) {\n            activityListener.onServiceStopped();\n            activityListener = null;\n        }\n    }\n\n    private void notifyQueueUpdateToListeners() {\n        if (fragmentListener != null && playQueue != null) {\n            fragmentListener.onQueueUpdate(playQueue);\n        }\n        if (activityListener != null && playQueue != null) {\n            activityListener.onQueueUpdate(playQueue);\n        }\n    }\n\n    private void notifyMetadataUpdateToListeners() {\n        getCurrentStreamInfo().ifPresent(info -> {\n            if (fragmentListener != null) {\n                fragmentListener.onMetadataUpdate(info, playQueue);\n            }\n            if (activityListener != null) {\n                activityListener.onMetadataUpdate(info, playQueue);\n            }\n        });\n    }\n\n    private void notifyPlaybackUpdateToListeners() {\n        if (fragmentListener != null && !exoPlayerIsNull() && playQueue != null) {\n            fragmentListener.onPlaybackUpdate(currentState, getRepeatMode(),\n                    playQueue.isShuffled(), simpleExoPlayer.getPlaybackParameters());\n        }\n        if (activityListener != null && !exoPlayerIsNull() && playQueue != null) {\n            activityListener.onPlaybackUpdate(currentState, getRepeatMode(),\n                    playQueue.isShuffled(), getPlaybackParameters());\n        }\n    }\n\n    private void notifyProgressUpdateToListeners(final int currentProgress,\n                                                 final int duration,\n                                                 final int bufferPercent) {\n        if (fragmentListener != null) {\n            fragmentListener.onProgressUpdate(currentProgress, duration, bufferPercent);\n        }\n        if (activityListener != null) {\n            activityListener.onProgressUpdate(currentProgress, duration, bufferPercent);\n        }\n    }\n\n    private void notifyAudioTrackUpdateToListeners() {\n        if (fragmentListener != null) {\n            fragmentListener.onAudioTrackUpdate();\n        }\n        if (activityListener != null) {\n            activityListener.onAudioTrackUpdate();\n        }\n    }\n\n    public void useVideoAndSubtitles(final boolean videoAndSubtitlesEnabled) {\n        if (playQueue == null) {\n            return;\n        }\n\n        isAudioOnly = !videoAndSubtitlesEnabled;\n\n        final var item = playQueue.getItem();\n        final boolean hasPendingRecovery =\n                item != null && item.getRecoveryPosition() != PlayQueueItem.RECOVERY_UNSET;\n        final boolean hasTimeline =\n                !exoPlayerIsNull() && !simpleExoPlayer.getCurrentTimeline().isEmpty();\n\n\n        getCurrentStreamInfo().ifPresentOrElse(info -> {\n            // In case we don't know the source type, fall back to either video-with-audio, or\n            // audio-only source type\n            final SourceType sourceType = videoResolver.getStreamSourceType()\n                    .orElse(SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY);\n\n            if (hasTimeline || !hasPendingRecovery) {\n                // making sure to save playback position before reloadPlayQueueManager()\n                setRecovery();\n            }\n\n            if (playQueueManagerReloadingNeeded(sourceType, info, getVideoRendererIndex())) {\n                reloadPlayQueueManager();\n            }\n        }, () -> {\n            /*\n            The current metadata may be null sometimes (for e.g. when using an unstable connection\n            in livestreams) so we will be not able to execute the block above\n\n            Reload the play queue manager in this case, which is the behavior when we don't know the\n            index of the video renderer or playQueueManagerReloadingNeeded returns true\n            */\n            if (hasTimeline || !hasPendingRecovery) {\n                // making sure to save playback position before reloadPlayQueueManager()\n                setRecovery();\n            }\n            reloadPlayQueueManager();\n        });\n\n        // Disable or enable video and subtitles renderers depending of the\n        // videoAndSubtitlesEnabled value\n        trackSelector.setParameters(trackSelector.buildUponParameters()\n                .setTrackTypeDisabled(C.TRACK_TYPE_TEXT, !videoAndSubtitlesEnabled)\n                .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, !videoAndSubtitlesEnabled));\n    }\n\n    /**\n     * Return whether the play queue manager needs to be reloaded when switching player type.\n     *\n     * <p>\n     * The play queue manager needs to be reloaded if the video renderer index is not known and if\n     * the content is not an audio content, but also if none of the following cases is met:\n     *\n     * <ul>\n     *     <li>the content is an {@link StreamType#AUDIO_STREAM audio stream}, an\n     *     {@link StreamType#AUDIO_LIVE_STREAM audio live stream}, or a\n     *     {@link StreamType#POST_LIVE_AUDIO_STREAM ended audio live stream};</li>\n     *     <li>the content is a {@link StreamType#LIVE_STREAM live stream} and the source type is a\n     *     {@link SourceType#LIVE_STREAM live source};</li>\n     *     <li>the content's source is {@link SourceType#VIDEO_WITH_SEPARATED_AUDIO a video stream\n     *     with a separated audio source} or has no audio-only streams available <b>and</b> is a\n     *     {@link StreamType#VIDEO_STREAM video stream}, an\n     *     {@link StreamType#POST_LIVE_STREAM ended live stream}, or a\n     *     {@link StreamType#LIVE_STREAM live stream}.\n     *     </li>\n     * </ul>\n     * </p>\n     *\n     * @param sourceType         the {@link SourceType} of the stream\n     * @param streamInfo         the {@link StreamInfo} of the stream\n     * @param videoRendererIndex the video renderer index of the video source, if that's a video\n     *                           source (or {@link #RENDERER_UNAVAILABLE})\n     * @return whether the play queue manager needs to be reloaded\n     */\n    private boolean playQueueManagerReloadingNeeded(final SourceType sourceType,\n                                                    @NonNull final StreamInfo streamInfo,\n                                                    final int videoRendererIndex) {\n        final StreamType streamType = streamInfo.getStreamType();\n        final boolean isStreamTypeAudio = StreamTypeUtil.isAudio(streamType);\n\n        if (videoRendererIndex == RENDERER_UNAVAILABLE && !isStreamTypeAudio) {\n            return true;\n        }\n\n        // The content is an audio stream, an audio live stream, or a live stream with a live\n        // source: it's not needed to reload the play queue manager because the stream source will\n        // be the same\n        if (isStreamTypeAudio || (streamType == StreamType.LIVE_STREAM\n                && sourceType == SourceType.LIVE_STREAM)) {\n            return false;\n        }\n\n        // The content's source is a video with separated audio or a video with audio -> the video\n        // and its fetch may be disabled\n        // The content's source is a video with embedded audio and the content has no separated\n        // audio stream available: it's probably not needed to reload the play queue manager\n        // because the stream source will be probably the same as the current played\n        if (sourceType == SourceType.VIDEO_WITH_SEPARATED_AUDIO\n                || (sourceType == SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY\n                && isNullOrEmpty(streamInfo.getAudioStreams()))) {\n            // It's not needed to reload the play queue manager only if the content's stream type\n            // is a video stream, a live stream or an ended live stream\n            return !StreamTypeUtil.isVideo(streamType);\n        }\n\n        // Other cases: the play queue manager reload is needed\n        return true;\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Getters\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Getters\n\n    public Optional<StreamInfo> getCurrentStreamInfo() {\n        return Optional.ofNullable(currentMetadata).flatMap(MediaItemTag::getMaybeStreamInfo);\n    }\n\n    public int getCurrentState() {\n        return currentState;\n    }\n\n    public boolean exoPlayerIsNull() {\n        return simpleExoPlayer == null;\n    }\n\n    public ExoPlayer getExoPlayer() {\n        return simpleExoPlayer;\n    }\n\n    public boolean isStopped() {\n        return exoPlayerIsNull() || simpleExoPlayer.getPlaybackState() == ExoPlayer.STATE_IDLE;\n    }\n\n    public boolean isPlaying() {\n        return !exoPlayerIsNull() && simpleExoPlayer.isPlaying();\n    }\n\n    public boolean getPlayWhenReady() {\n        return !exoPlayerIsNull() && simpleExoPlayer.getPlayWhenReady();\n    }\n\n    public boolean isLoading() {\n        return !exoPlayerIsNull() && simpleExoPlayer.isLoading();\n    }\n\n    private boolean isLive() {\n        try {\n            return !exoPlayerIsNull() && simpleExoPlayer.isCurrentMediaItemDynamic();\n        } catch (final IndexOutOfBoundsException e) {\n            // Why would this even happen =(... but lets log it anyway, better safe than sorry\n            if (DEBUG) {\n                Log.d(TAG, \"player.isCurrentWindowDynamic() failed: \", e);\n            }\n            return false;\n        }\n    }\n\n    public void setPlaybackQuality(@Nullable final String quality) {\n        saveStreamProgressState();\n        setRecovery();\n        videoResolver.setPlaybackQuality(quality);\n        reloadPlayQueueManager();\n    }\n\n    public void setAudioTrack(@Nullable final String audioTrackId) {\n        saveStreamProgressState();\n        setRecovery();\n        videoResolver.setAudioTrack(audioTrackId);\n        audioResolver.setAudioTrack(audioTrackId);\n        reloadPlayQueueManager();\n    }\n\n\n    @NonNull\n    public Context getContext() {\n        return context;\n    }\n\n    @NonNull\n    public SharedPreferences getPrefs() {\n        return prefs;\n    }\n\n\n    public PlayerType getPlayerType() {\n        return playerType;\n    }\n\n    public boolean audioPlayerSelected() {\n        return playerType == PlayerType.AUDIO;\n    }\n\n    public boolean videoPlayerSelected() {\n        return playerType == PlayerType.MAIN;\n    }\n\n    public boolean popupPlayerSelected() {\n        return playerType == PlayerType.POPUP;\n    }\n\n\n    @Nullable\n    public PlayQueue getPlayQueue() {\n        return playQueue;\n    }\n\n    public AudioReactor getAudioReactor() {\n        return audioReactor;\n    }\n\n    public PlayerService getService() {\n        return service;\n    }\n\n    public boolean isAudioOnly() {\n        return isAudioOnly;\n    }\n\n    @NonNull\n    public DefaultTrackSelector getTrackSelector() {\n        return trackSelector;\n    }\n\n    @Nullable\n    public MediaItemTag getCurrentMetadata() {\n        return currentMetadata;\n    }\n\n    @Nullable\n    public PlayQueueItem getCurrentItem() {\n        return currentItem;\n    }\n\n    public Optional<PlayerServiceEventListener> getFragmentListener() {\n        return Optional.ofNullable(fragmentListener);\n    }\n\n    /**\n     * @return the user interfaces connected with the player\n     */\n    @SuppressWarnings(\"MethodName\") // keep the unusual method name\n    public PlayerUiList UIs() {\n        return UIs;\n    }\n\n    /**\n     * Get the video renderer index of the current playing stream.\n     * <p>\n     * This method returns the video renderer index of the current\n     * {@link MappingTrackSelector.MappedTrackInfo} or {@link #RENDERER_UNAVAILABLE} if the current\n     * {@link MappingTrackSelector.MappedTrackInfo} is null or if there is no video renderer index.\n     *\n     * @return the video renderer index or {@link #RENDERER_UNAVAILABLE} if it cannot be get\n     */\n    private int getVideoRendererIndex() {\n        final MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector\n                .getCurrentMappedTrackInfo();\n\n        if (mappedTrackInfo == null) {\n            return RENDERER_UNAVAILABLE;\n        }\n\n        // Check every renderer\n        return IntStream.range(0, mappedTrackInfo.getRendererCount())\n                // Check the renderer is a video renderer and has at least one track\n                .filter(i -> !mappedTrackInfo.getTrackGroups(i).isEmpty()\n                        && simpleExoPlayer.getRendererType(i) == C.TRACK_TYPE_VIDEO)\n                // Return the first index found (there is at most one renderer per renderer type)\n                .findFirst()\n                // No video renderer index with at least one track found: return unavailable index\n                .orElse(RENDERER_UNAVAILABLE);\n    }\n    //endregion\n\n    /**\n     * @return whether the device screen is turned on.\n     */\n    public boolean isScreenOn() {\n        return screenOn;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/PlayerIntentType.kt",
    "content": "package org.schabi.newpipe.player\n\nimport android.os.Parcelable\nimport kotlinx.parcelize.Parcelize\n\n// We model this as an enum class plus one struct for each enum value\n// so we can consume it from Java properly. After converting to Kotlin,\n// we could switch to a sealed enum class & a proper Kotlin `when` match.\nenum class PlayerIntentType {\n    Enqueue,\n    EnqueueNext,\n    TimestampChange,\n    AllOthers\n}\n\n/**\n * A timestamp on the given was clicked and we should switch the playing stream to it.\n */\n@Parcelize\ndata class TimestampChangeData(\n    val serviceId: Int,\n    val url: String,\n    val seconds: Int\n) : Parcelable\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/PlayerService.java",
    "content": "/*\n * Copyright 2017 Mauricio Colli <mauriciocolli@outlook.com>\n * Part of NewPipe\n *\n * License: GPL-3.0+\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\npackage org.schabi.newpipe.player;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Binder;\nimport android.os.Bundle;\nimport android.os.IBinder;\nimport android.support.v4.media.MediaBrowserCompat;\nimport android.support.v4.media.session.MediaSessionCompat;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.app.ServiceCompat;\nimport androidx.media.MediaBrowserServiceCompat;\n\nimport com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;\n\nimport org.schabi.newpipe.ktx.BundleKt;\nimport org.schabi.newpipe.player.mediabrowser.MediaBrowserImpl;\nimport org.schabi.newpipe.player.mediabrowser.MediaBrowserPlaybackPreparer;\nimport org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi;\nimport org.schabi.newpipe.player.notification.NotificationPlayerUi;\nimport org.schabi.newpipe.player.notification.NotificationUtil;\nimport org.schabi.newpipe.util.ThemeHelper;\n\nimport java.lang.ref.WeakReference;\nimport java.util.List;\nimport java.util.function.Consumer;\n\n\n/**\n * One service for all players.\n */\npublic final class PlayerService extends MediaBrowserServiceCompat {\n    private static final String TAG = PlayerService.class.getSimpleName();\n    private static final boolean DEBUG = Player.DEBUG;\n\n    public static final String SHOULD_START_FOREGROUND_EXTRA = \"should_start_foreground_extra\";\n    public static final String BIND_PLAYER_HOLDER_ACTION = \"bind_player_holder_action\";\n\n    // These objects are used to cleanly separate the Service implementation (in this file) and the\n    // media browser and playback preparer implementations. At the moment the playback preparer is\n    // only used in conjunction with the media browser.\n    private MediaBrowserImpl mediaBrowserImpl;\n    private MediaBrowserPlaybackPreparer mediaBrowserPlaybackPreparer;\n\n    // these are instantiated in onCreate() as per\n    // https://developer.android.com/training/cars/media#browser_workflow\n    private MediaSessionCompat mediaSession;\n    private MediaSessionConnector sessionConnector;\n\n    @Nullable\n    private Player player;\n\n    private final IBinder mBinder = new PlayerService.LocalBinder(this);\n\n    /**\n     * The parameter taken by this {@link Consumer} can be null to indicate the player is being\n     * stopped.\n     */\n    @Nullable\n    private Consumer<Player> onPlayerStartedOrStopped = null;\n\n\n    //region Service lifecycle\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        if (DEBUG) {\n            Log.d(TAG, \"onCreate() called\");\n        }\n        ThemeHelper.setTheme(this);\n\n        mediaBrowserImpl = new MediaBrowserImpl(this, this::notifyChildrenChanged);\n\n        // see https://developer.android.com/training/cars/media#browser_workflow\n        mediaSession = new MediaSessionCompat(this, \"MediaSessionPlayerServ\");\n        setSessionToken(mediaSession.getSessionToken());\n        sessionConnector = new MediaSessionConnector(mediaSession);\n        sessionConnector.setMetadataDeduplicationEnabled(true);\n\n        mediaBrowserPlaybackPreparer = new MediaBrowserPlaybackPreparer(\n                this,\n                sessionConnector::setCustomErrorMessage,\n                () -> sessionConnector.setCustomErrorMessage(null),\n                (playWhenReady) -> {\n                    if (player != null) {\n                        player.onPrepare();\n                    }\n                }\n        );\n        sessionConnector.setPlaybackPreparer(mediaBrowserPlaybackPreparer);\n\n        // Note: you might be tempted to create the player instance and call startForeground here,\n        // but be aware that the Android system might start the service just to perform media\n        // queries. In those cases creating a player instance is a waste of resources, and calling\n        // startForeground means creating a useless empty notification. In case it's really needed\n        // the player instance can be created here, but startForeground() should definitely not be\n        // called here unless the service is actually starting in the foreground, to avoid the\n        // useless notification.\n    }\n\n    @Override\n    public int onStartCommand(final Intent intent, final int flags, final int startId) {\n        if (DEBUG) {\n            Log.d(TAG, \"onStartCommand() called with: intent = [\" + intent\n                    + \"], extras = [\" + BundleKt.toDebugString(intent.getExtras())\n                    + \"], flags = [\" + flags + \"], startId = [\" + startId + \"]\");\n        }\n\n        // All internal NewPipe intents used to interact with the player, that are sent to the\n        // PlayerService using startForegroundService(), will have SHOULD_START_FOREGROUND_EXTRA,\n        // to ensure startForeground() is called (otherwise Android will force-crash the app).\n        if (intent.getBooleanExtra(SHOULD_START_FOREGROUND_EXTRA, false)) {\n            final boolean playerWasNull = (player == null);\n            if (playerWasNull) {\n                // make sure the player exists, in case the service was resumed\n                player = new Player(this, mediaSession, sessionConnector);\n            }\n\n            // Be sure that the player notification is set and the service is started in foreground,\n            // otherwise, the app may crash on Android 8+ as the service would never be put in the\n            // foreground while we said to the system we would do so. The service is always\n            // requested to be started in foreground, so always creating a notification if there is\n            // no one already and starting the service in foreground should not create any issues.\n            // If the service is already started in foreground, requesting it to be started\n            // shouldn't do anything.\n            player.UIs().get(NotificationPlayerUi.class)\n                    .ifPresent(NotificationPlayerUi::createNotificationAndStartForeground);\n\n            if (playerWasNull && onPlayerStartedOrStopped != null) {\n                // notify that a new player was created (but do it after creating the foreground\n                // notification just to make sure we don't incur, due to slowness, in\n                // \"Context.startForegroundService() did not then call Service.startForeground()\")\n                onPlayerStartedOrStopped.accept(player);\n            }\n        }\n\n        if (player == null) {\n            // No need to process media button's actions or other system intents if the player is\n            // not running. However, since the current intent might have been issued by the system\n            // with `startForegroundService()` (for unknown reasons), we need to ensure that we post\n            // a (dummy) foreground notification, otherwise we'd incur in\n            // \"Context.startForegroundService() did not then call Service.startForeground()\". Then\n            // we stop the service again.\n            Log.d(TAG, \"onStartCommand() got a useless intent, closing the service\");\n            NotificationUtil.startForegroundWithDummyNotification(this);\n            destroyPlayerAndStopService();\n            return START_NOT_STICKY;\n        }\n\n        final PlayerType oldPlayerType = player.getPlayerType();\n        player.handleIntent(intent);\n        player.handleIntentPost(oldPlayerType);\n        player.UIs().get(MediaSessionPlayerUi.class)\n                .ifPresent(ui -> ui.handleMediaButtonIntent(intent));\n\n        return START_NOT_STICKY;\n    }\n\n    public void stopForImmediateReusing() {\n        if (DEBUG) {\n            Log.d(TAG, \"stopForImmediateReusing() called\");\n        }\n\n        if (player != null && !player.exoPlayerIsNull()) {\n            // Releases wifi & cpu, disables keepScreenOn, etc.\n            // We can't just pause the player here because it will make transition\n            // from one stream to a new stream not smooth\n            player.smoothStopForImmediateReusing();\n        }\n    }\n\n    @Override\n    public void onTaskRemoved(final Intent rootIntent) {\n        super.onTaskRemoved(rootIntent);\n        if (player != null && !player.videoPlayerSelected()) {\n            return;\n        }\n        onDestroy();\n        // Unload from memory completely\n        Runtime.getRuntime().halt(0);\n    }\n\n    @Override\n    public void onDestroy() {\n        if (DEBUG) {\n            Log.d(TAG, \"destroy() called\");\n        }\n        super.onDestroy();\n\n        cleanup();\n\n        mediaBrowserPlaybackPreparer.dispose();\n        mediaSession.release();\n        mediaBrowserImpl.dispose();\n    }\n\n    private void cleanup() {\n        if (player != null) {\n            if (onPlayerStartedOrStopped != null) {\n                // notify that the player is being destroyed\n                onPlayerStartedOrStopped.accept(null);\n            }\n            player.destroy();\n            player = null;\n        }\n\n        // Should already be handled by MediaSessionPlayerUi, but just to be sure.\n        mediaSession.setActive(false);\n\n        // Should already be handled by NotificationUtil.cancelNotificationAndStopForeground() in\n        // NotificationPlayerUi, but let's make sure that the foreground service is stopped.\n        ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE);\n    }\n\n    /**\n     * Destroys the player and allows the player instance to be garbage collected. Sets the media\n     * session to inactive. Stops the foreground service and removes the player notification\n     * associated with it. Tries to stop the {@link PlayerService} completely, but this step will\n     * have no effect in case some service connection still uses the service (e.g. the Android Auto\n     * system accesses the media browser even when no player is running).\n     */\n    public void destroyPlayerAndStopService() {\n        if (DEBUG) {\n            Log.d(TAG, \"destroyPlayerAndStopService() called\");\n        }\n\n        cleanup();\n\n        // This only really stops the service if there are no other service connections (see docs):\n        // for example the (Android Auto) media browser binder will block stopService().\n        // This is why we also stopForeground() above, to make sure the notification is removed.\n        // If we were to call stopSelf(), then the service would be surely stopped (regardless of\n        // other service connections), but this would be a waste of resources since the service\n        // would be immediately restarted by those same connections to perform the queries.\n        stopService(new Intent(this, PlayerService.class));\n    }\n\n    @Override\n    protected void attachBaseContext(final Context base) {\n        super.attachBaseContext(AudioServiceLeakFix.preventLeakOf(base));\n    }\n    //endregion\n\n    //region Bind\n    @Override\n    public IBinder onBind(final Intent intent) {\n        if (DEBUG) {\n            Log.d(TAG, \"onBind() called with: intent = [\" + intent\n                    + \"], extras = [\" + BundleKt.toDebugString(intent.getExtras()) + \"]\");\n        }\n\n        if (BIND_PLAYER_HOLDER_ACTION.equals(intent.getAction())) {\n            // Note that this binder might be reused multiple times while the service is alive, even\n            // after unbind() has been called: https://stackoverflow.com/a/8794930 .\n            return mBinder;\n\n        } else if (MediaBrowserServiceCompat.SERVICE_INTERFACE.equals(intent.getAction())) {\n            // MediaBrowserService also uses its own binder, so for actions related to the media\n            // browser service, pass the onBind to the superclass.\n            return super.onBind(intent);\n\n        } else {\n            // This is an unknown request, avoid returning any binder to not leak objects.\n            return null;\n        }\n    }\n\n    public static class LocalBinder extends Binder {\n        private final WeakReference<PlayerService> playerService;\n\n        LocalBinder(final PlayerService playerService) {\n            this.playerService = new WeakReference<>(playerService);\n        }\n\n        public PlayerService getService() {\n            return playerService.get();\n        }\n    }\n\n    /**\n     * @return the current active player instance. May be null, since the player service can outlive\n     * the player e.g. to respond to Android Auto media browser queries.\n     */\n    @Nullable\n    public Player getPlayer() {\n        return player;\n    }\n\n    /**\n     * Sets the listener that will be called when the player is started or stopped. If a\n     * {@code null} listener is passed, then the current listener will be unset. The parameter taken\n     * by the {@link Consumer} can be null to indicate that the player is stopping.\n     * @param listener the listener to set or unset\n     */\n    public void setPlayerListener(@Nullable final Consumer<Player> listener) {\n        this.onPlayerStartedOrStopped = listener;\n        if (listener != null) {\n            // if there is no player, then `null` will be sent here, to ensure the state is synced\n            listener.accept(player);\n        }\n    }\n    //endregion\n\n    //region Media browser\n    @Override\n    public BrowserRoot onGetRoot(@NonNull final String clientPackageName,\n                                 final int clientUid,\n                                 @Nullable final Bundle rootHints) {\n        return mediaBrowserImpl.onGetRoot(clientPackageName, clientUid, rootHints);\n    }\n\n    @Override\n    public void onLoadChildren(@NonNull final String parentId,\n                               @NonNull final Result<List<MediaBrowserCompat.MediaItem>> result) {\n        mediaBrowserImpl.onLoadChildren(parentId, result);\n    }\n\n    @Override\n    public void onSearch(@NonNull final String query,\n                         final Bundle extras,\n                         @NonNull final Result<List<MediaBrowserCompat.MediaItem>> result) {\n        mediaBrowserImpl.onSearch(query, result);\n    }\n    //endregion\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/PlayerType.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2022-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.player\n\nenum class PlayerType {\n    MAIN,\n    AUDIO,\n    POPUP\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/datasource/NonUriHlsDataSourceFactory.java",
    "content": "package org.schabi.newpipe.player.datasource;\n\nimport static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;\n\nimport androidx.annotation.NonNull;\n\nimport com.google.android.exoplayer2.C;\nimport com.google.android.exoplayer2.source.hls.HlsDataSourceFactory;\nimport com.google.android.exoplayer2.upstream.ByteArrayDataSource;\nimport com.google.android.exoplayer2.upstream.DataSource;\n\nimport java.nio.charset.StandardCharsets;\n\n/**\n * A {@link HlsDataSourceFactory} which allows playback of non-URI media HLS playlists for\n * {@link com.google.android.exoplayer2.source.hls.HlsMediaSource HlsMediaSource}s.\n *\n * <p>\n * If media requests are relative, the URI from which the manifest comes from (either the\n * manifest URI (preferred) or the master URI (if applicable)) must be returned, otherwise the\n * content will be not playable, as it will be an invalid URL, or it may be treat as something\n * unexpected, for instance as a file for\n * {@link com.google.android.exoplayer2.upstream.DefaultDataSource DefaultDataSource}s.\n * </p>\n *\n * <p>\n * See {@link #createDataSource(int)} for changes and implementation details.\n * </p>\n */\npublic final class NonUriHlsDataSourceFactory implements HlsDataSourceFactory {\n\n    /**\n     * Builder class of {@link NonUriHlsDataSourceFactory} instances.\n     */\n    public static final class Builder {\n        private DataSource.Factory dataSourceFactory;\n        private String playlistString;\n\n        /**\n         * Set the {@link DataSource.Factory} which will be used to create non manifest contents\n         * {@link DataSource}s.\n         *\n         * @param dataSourceFactoryForNonManifestContents the {@link DataSource.Factory} which will\n         *                                                be used to create non manifest contents\n         *                                                {@link DataSource}s, which cannot be null\n         */\n        public void setDataSourceFactory(\n                @NonNull final DataSource.Factory dataSourceFactoryForNonManifestContents) {\n            this.dataSourceFactory = dataSourceFactoryForNonManifestContents;\n        }\n\n        /**\n         * Set the HLS playlist which will be used for manifests requests.\n         *\n         * @param hlsPlaylistString the string which correspond to the response of the HLS\n         *                          manifest, which cannot be null or empty\n         */\n        public void setPlaylistString(@NonNull final String hlsPlaylistString) {\n            this.playlistString = hlsPlaylistString;\n        }\n\n        /**\n         * Create a new {@link NonUriHlsDataSourceFactory} with the given data source factory and\n         * the given HLS playlist.\n         *\n         * @return a {@link NonUriHlsDataSourceFactory}\n         * @throws IllegalArgumentException if the data source factory is null or if the HLS\n         * playlist string set is null or empty\n         */\n        @NonNull\n        public NonUriHlsDataSourceFactory build() {\n            if (dataSourceFactory == null) {\n                throw new IllegalArgumentException(\n                        \"No DataSource.Factory valid instance has been specified.\");\n            }\n\n            if (isNullOrEmpty(playlistString)) {\n                throw new IllegalArgumentException(\"No HLS valid playlist has been specified.\");\n            }\n\n            return new NonUriHlsDataSourceFactory(dataSourceFactory,\n                    playlistString.getBytes(StandardCharsets.UTF_8));\n        }\n    }\n\n    private final DataSource.Factory dataSourceFactory;\n    private final byte[] playlistStringByteArray;\n\n    /**\n     * Create a {@link NonUriHlsDataSourceFactory} instance.\n     *\n     * @param dataSourceFactory       the {@link DataSource.Factory} which will be used to build\n     *                                non manifests {@link DataSource}s, which must not be null\n     * @param playlistStringByteArray a byte array of the HLS playlist, which must not be null\n     */\n    private NonUriHlsDataSourceFactory(@NonNull final DataSource.Factory dataSourceFactory,\n                                       @NonNull final byte[] playlistStringByteArray) {\n        this.dataSourceFactory = dataSourceFactory;\n        this.playlistStringByteArray = playlistStringByteArray;\n    }\n\n    /**\n     * Create a {@link DataSource} for the given data type.\n     *\n     * <p>\n     * Contrary to {@link com.google.android.exoplayer2.source.hls.DefaultHlsDataSourceFactory\n     * ExoPlayer's default implementation}, this implementation is not always using the\n     * {@link DataSource.Factory} passed to the\n     * {@link com.google.android.exoplayer2.source.hls.HlsMediaSource.Factory\n     * HlsMediaSource.Factory} constructor, only when it's not\n     * {@link C#DATA_TYPE_MANIFEST the manifest type}.\n     * </p>\n     *\n     * <p>\n     * This change allow playback of non-URI HLS contents, when the manifest is not a master\n     * manifest/playlist (otherwise, endless loops should be encountered because the\n     * {@link DataSource}s created for media playlists should use the master playlist response\n     * instead).\n     * </p>\n     *\n     * @param dataType the data type for which the {@link DataSource} will be used, which is one of\n     *                 {@link C} {@code .DATA_TYPE_*} constants\n     * @return a {@link DataSource} for the given data type\n     */\n    @NonNull\n    @Override\n    public DataSource createDataSource(final int dataType) {\n        // The manifest is already downloaded and provided with playlistStringByteArray, so we\n        // don't need to download it again and we can use a ByteArrayDataSource instead\n        if (dataType == C.DATA_TYPE_MANIFEST) {\n            return new ByteArrayDataSource(playlistStringByteArray);\n        }\n\n        return dataSourceFactory.createDataSource();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java",
    "content": "/*\n * Based on ExoPlayer's DefaultHttpDataSource, version 2.18.1.\n *\n * Original source code copyright (C) 2016 The Android Open Source Project, licensed under the\n * Apache License, Version 2.0.\n */\n\npackage org.schabi.newpipe.player.datasource;\n\nimport static com.google.android.exoplayer2.upstream.DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS;\nimport static com.google.android.exoplayer2.upstream.DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS;\nimport static com.google.android.exoplayer2.upstream.HttpUtil.buildRangeRequestHeader;\nimport static com.google.android.exoplayer2.util.Assertions.checkNotNull;\nimport static com.google.android.exoplayer2.util.Util.castNonNull;\nimport static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getAndroidUserAgent;\nimport static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getIosUserAgent;\nimport static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isAndroidStreamingUrl;\nimport static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isIosStreamingUrl;\nimport static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isWebStreamingUrl;\nimport static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isWebEmbeddedPlayerStreamingUrl;\nimport static java.lang.Math.min;\n\nimport android.net.Uri;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.C;\nimport com.google.android.exoplayer2.PlaybackException;\nimport com.google.android.exoplayer2.upstream.BaseDataSource;\nimport com.google.android.exoplayer2.upstream.DataSource;\nimport com.google.android.exoplayer2.upstream.DataSourceException;\nimport com.google.android.exoplayer2.upstream.DataSpec;\nimport com.google.android.exoplayer2.upstream.DataSpec.HttpMethod;\nimport com.google.android.exoplayer2.upstream.DefaultHttpDataSource;\nimport com.google.android.exoplayer2.upstream.HttpDataSource;\nimport com.google.android.exoplayer2.upstream.HttpUtil;\nimport com.google.android.exoplayer2.upstream.TransferListener;\nimport com.google.android.exoplayer2.util.Log;\nimport com.google.android.exoplayer2.util.Util;\nimport com.google.common.base.Predicate;\nimport com.google.common.collect.ForwardingMap;\nimport com.google.common.collect.ImmutableMap;\nimport com.google.common.collect.Sets;\nimport com.google.common.net.HttpHeaders;\n\nimport org.schabi.newpipe.DownloaderImpl;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InterruptedIOException;\nimport java.io.OutputStream;\nimport java.lang.reflect.Method;\nimport java.net.HttpURLConnection;\nimport java.net.MalformedURLException;\nimport java.net.NoRouteToHostException;\nimport java.net.URL;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.zip.GZIPInputStream;\n\n/**\n * An {@link HttpDataSource} that uses Android's {@link HttpURLConnection}, based on\n * {@link com.google.android.exoplayer2.upstream.DefaultHttpDataSource}, for YouTube streams.\n *\n * <p>\n * It adds more headers to {@code videoplayback} URLs, such as {@code Origin}, {@code Referer}\n * (only where it's relevant) and also more parameters, such as {@code rn} and replaces the use of\n * the {@code Range} header by the corresponding parameter ({@code range}), if enabled.\n * </p>\n *\n * There are many unused methods in this class because everything was copied from {@link\n * com.google.android.exoplayer2.upstream.DefaultHttpDataSource} with as little changes as possible.\n * SonarQube warnings were also suppressed for the same reason.\n */\n@SuppressWarnings({\"squid:S3011\", \"squid:S4738\"})\npublic final class YoutubeHttpDataSource extends BaseDataSource implements HttpDataSource {\n\n    /**\n     * {@link DataSource.Factory} for {@link YoutubeHttpDataSource} instances.\n     */\n    public static final class Factory implements HttpDataSource.Factory {\n\n        private final RequestProperties defaultRequestProperties;\n\n        @Nullable\n        private TransferListener transferListener;\n        @Nullable\n        private Predicate<String> contentTypePredicate;\n        private int connectTimeoutMs;\n        private int readTimeoutMs;\n        private boolean allowCrossProtocolRedirects;\n        private boolean keepPostFor302Redirects;\n\n        private boolean rangeParameterEnabled;\n        private boolean rnParameterEnabled;\n\n        /**\n         * Creates an instance.\n         */\n        public Factory() {\n            defaultRequestProperties = new RequestProperties();\n            connectTimeoutMs = DEFAULT_CONNECT_TIMEOUT_MILLIS;\n            readTimeoutMs = DEFAULT_READ_TIMEOUT_MILLIS;\n        }\n\n        @NonNull\n        @Override\n        public Factory setDefaultRequestProperties(\n                @NonNull final Map<String, String> defaultRequestPropertiesMap) {\n            defaultRequestProperties.clearAndSet(defaultRequestPropertiesMap);\n            return this;\n        }\n\n        /**\n         * Sets the connect timeout, in milliseconds.\n         *\n         * <p>\n         * The default is {@link DefaultHttpDataSource#DEFAULT_CONNECT_TIMEOUT_MILLIS}.\n         * </p>\n         *\n         * @param connectTimeoutMsValue The connect timeout, in milliseconds, that will be used.\n         * @return This factory.\n         */\n        public Factory setConnectTimeoutMs(final int connectTimeoutMsValue) {\n            connectTimeoutMs = connectTimeoutMsValue;\n            return this;\n        }\n\n        /**\n         * Sets the read timeout, in milliseconds.\n         *\n         * <p>The default is {@link DefaultHttpDataSource#DEFAULT_READ_TIMEOUT_MILLIS}.\n         *\n         * @param readTimeoutMsValue The connect timeout, in milliseconds, that will be used.\n         * @return This factory.\n         */\n        public Factory setReadTimeoutMs(final int readTimeoutMsValue) {\n            readTimeoutMs = readTimeoutMsValue;\n            return this;\n        }\n\n        /**\n         * Sets whether to allow cross protocol redirects.\n         *\n         * <p>The default is {@code false}.\n         *\n         * @param allowCrossProtocolRedirectsValue Whether to allow cross protocol redirects.\n         * @return This factory.\n         */\n        public Factory setAllowCrossProtocolRedirects(\n                final boolean allowCrossProtocolRedirectsValue) {\n            allowCrossProtocolRedirects = allowCrossProtocolRedirectsValue;\n            return this;\n        }\n\n        /**\n         * Sets whether the use of the {@code range} parameter instead of the {@code Range} header\n         * to request ranges of streams is enabled.\n         *\n         * <p>\n         * Note that it must be not enabled on streams which are using a {@link\n         * com.google.android.exoplayer2.source.ProgressiveMediaSource}, as it will break playback\n         * for them (some exceptions may be thrown).\n         * </p>\n         *\n         * @param rangeParameterEnabledValue whether the use of the {@code range} parameter instead\n         *                                   of the {@code Range} header (must be only enabled when\n         *                                   non-{@code ProgressiveMediaSource}s)\n         * @return This factory.\n         */\n        public Factory setRangeParameterEnabled(final boolean rangeParameterEnabledValue) {\n            rangeParameterEnabled = rangeParameterEnabledValue;\n            return this;\n        }\n\n        /**\n         * Sets whether the use of the {@code rn}, which stands for request number, parameter is\n         * enabled.\n         *\n         * <p>\n         * Note that it should be not enabled on streams which are using {@code /} to delimit URLs\n         * parameters, such as the streams of HLS manifests.\n         * </p>\n         *\n         * @param rnParameterEnabledValue whether the appending the {@code rn} parameter to\n         *                                {@code videoplayback} URLs\n         * @return This factory.\n         */\n        public Factory setRnParameterEnabled(final boolean rnParameterEnabledValue) {\n            rnParameterEnabled = rnParameterEnabledValue;\n            return this;\n        }\n\n        /**\n         * Sets a content type {@link Predicate}. If a content type is rejected by the predicate\n         * then a {@link HttpDataSource.InvalidContentTypeException} is thrown from\n         * {@link YoutubeHttpDataSource#open(DataSpec)}.\n         *\n         * <p>\n         * The default is {@code null}.\n         * </p>\n         *\n         * @param contentTypePredicateToSet The content type {@link Predicate}, or {@code null} to\n         *                                  clear a predicate that was previously set.\n         * @return This factory.\n         */\n        public Factory setContentTypePredicate(\n                @Nullable final Predicate<String> contentTypePredicateToSet) {\n            this.contentTypePredicate = contentTypePredicateToSet;\n            return this;\n        }\n\n        /**\n         * Sets the {@link TransferListener} that will be used.\n         *\n         * <p>The default is {@code null}.\n         *\n         * <p>See {@link DataSource#addTransferListener(TransferListener)}.\n         *\n         * @param transferListenerToUse The listener that will be used.\n         * @return This factory.\n         */\n        public Factory setTransferListener(\n                @Nullable final TransferListener transferListenerToUse) {\n            this.transferListener = transferListenerToUse;\n            return this;\n        }\n\n        /**\n         * Sets whether we should keep the POST method and body when we have HTTP 302 redirects for\n         * a POST request.\n         *\n         * @param keepPostFor302RedirectsValue Whether we should keep the POST method and body when\n         *                                     we have HTTP 302 redirects for a POST request.\n         * @return This factory.\n         */\n        public Factory setKeepPostFor302Redirects(final boolean keepPostFor302RedirectsValue) {\n            this.keepPostFor302Redirects = keepPostFor302RedirectsValue;\n            return this;\n        }\n\n        @NonNull\n        @Override\n        public YoutubeHttpDataSource createDataSource() {\n            final YoutubeHttpDataSource dataSource = new YoutubeHttpDataSource(\n                    connectTimeoutMs,\n                    readTimeoutMs,\n                    allowCrossProtocolRedirects,\n                    rangeParameterEnabled,\n                    rnParameterEnabled,\n                    defaultRequestProperties,\n                    contentTypePredicate,\n                    keepPostFor302Redirects);\n            if (transferListener != null) {\n                dataSource.addTransferListener(transferListener);\n            }\n            return dataSource;\n        }\n    }\n\n    private static final String TAG = YoutubeHttpDataSource.class.getSimpleName();\n    private static final int MAX_REDIRECTS = 20; // Same limit as okhttp.\n    private static final int HTTP_STATUS_TEMPORARY_REDIRECT = 307;\n    private static final int HTTP_STATUS_PERMANENT_REDIRECT = 308;\n    private static final long MAX_BYTES_TO_DRAIN = 2048;\n\n    private static final String RN_PARAMETER = \"&rn=\";\n    private static final String YOUTUBE_BASE_URL = \"https://www.youtube.com\";\n    private static final byte[] POST_BODY = new byte[] {0x78, 0};\n\n    private final boolean allowCrossProtocolRedirects;\n    private final boolean rangeParameterEnabled;\n    private final boolean rnParameterEnabled;\n\n    private final int connectTimeoutMillis;\n    private final int readTimeoutMillis;\n    @Nullable\n    private final RequestProperties defaultRequestProperties;\n    private final RequestProperties requestProperties;\n    private final boolean keepPostFor302Redirects;\n\n    @Nullable\n    private final Predicate<String> contentTypePredicate;\n    @Nullable\n    private DataSpec dataSpec;\n    @Nullable\n    private HttpURLConnection connection;\n    @Nullable\n    private InputStream inputStream;\n    private boolean opened;\n    private int responseCode;\n    private long bytesToRead;\n    private long bytesRead;\n\n    private long requestNumber;\n\n    @SuppressWarnings(\"checkstyle:ParameterNumber\")\n    private YoutubeHttpDataSource(final int connectTimeoutMillis,\n                                  final int readTimeoutMillis,\n                                  final boolean allowCrossProtocolRedirects,\n                                  final boolean rangeParameterEnabled,\n                                  final boolean rnParameterEnabled,\n                                  @Nullable final RequestProperties defaultRequestProperties,\n                                  @Nullable final Predicate<String> contentTypePredicate,\n                                  final boolean keepPostFor302Redirects) {\n        super(true);\n        this.connectTimeoutMillis = connectTimeoutMillis;\n        this.readTimeoutMillis = readTimeoutMillis;\n        this.allowCrossProtocolRedirects = allowCrossProtocolRedirects;\n        this.rangeParameterEnabled = rangeParameterEnabled;\n        this.rnParameterEnabled = rnParameterEnabled;\n        this.defaultRequestProperties = defaultRequestProperties;\n        this.contentTypePredicate = contentTypePredicate;\n        this.requestProperties = new RequestProperties();\n        this.keepPostFor302Redirects = keepPostFor302Redirects;\n        this.requestNumber = 0;\n    }\n\n    @Override\n    @Nullable\n    public Uri getUri() {\n        return connection == null ? null : Uri.parse(connection.getURL().toString());\n    }\n\n    @Override\n    public int getResponseCode() {\n        return connection == null || responseCode <= 0 ? -1 : responseCode;\n    }\n\n    @NonNull\n    @Override\n    public Map<String, List<String>> getResponseHeaders() {\n        if (connection == null) {\n            return ImmutableMap.of();\n        }\n        // connection.getHeaderFields() always contains a null key with a value like\n        // [\"HTTP/1.1 200 OK\"]. The response code is available from\n        // HttpURLConnection#getResponseCode() and the HTTP version is fixed when establishing the\n        // connection.\n        // DataSource#getResponseHeaders() doesn't allow null keys in the returned map, so we need\n        // to remove it.\n        // connection.getHeaderFields() returns a special unmodifiable case-insensitive Map\n        // so we can't just remove the null key or make a copy without the null key. Instead we\n        // wrap it in a ForwardingMap subclass that ignores and filters out null keys in the read\n        // methods.\n        return new NullFilteringHeadersMap(connection.getHeaderFields());\n    }\n\n    @Override\n    public void setRequestProperty(@NonNull final String name, @NonNull final String value) {\n        checkNotNull(name);\n        checkNotNull(value);\n        requestProperties.set(name, value);\n    }\n\n    @Override\n    public void clearRequestProperty(@NonNull final String name) {\n        checkNotNull(name);\n        requestProperties.remove(name);\n    }\n\n    @Override\n    public void clearAllRequestProperties() {\n        requestProperties.clear();\n    }\n\n    /**\n     * Opens the source to read the specified data.\n     */\n    @Override\n    public long open(@NonNull final DataSpec dataSpecParameter) throws HttpDataSourceException {\n        this.dataSpec = dataSpecParameter;\n        bytesRead = 0;\n        bytesToRead = 0;\n        transferInitializing(dataSpecParameter);\n\n        final HttpURLConnection httpURLConnection;\n        final String responseMessage;\n        try {\n            this.connection = makeConnection(dataSpec);\n            httpURLConnection = this.connection;\n            responseCode = httpURLConnection.getResponseCode();\n            responseMessage = httpURLConnection.getResponseMessage();\n        } catch (final IOException e) {\n            closeConnectionQuietly();\n            throw HttpDataSourceException.createForIOException(e, dataSpec,\n                    HttpDataSourceException.TYPE_OPEN);\n        }\n\n        // Check for a valid response code.\n        if (responseCode < 200 || responseCode > 299) {\n            final Map<String, List<String>> headers = httpURLConnection.getHeaderFields();\n            if (responseCode == 416) {\n                final long documentSize = HttpUtil.getDocumentSize(\n                        httpURLConnection.getHeaderField(HttpHeaders.CONTENT_RANGE));\n                if (dataSpecParameter.position == documentSize) {\n                    opened = true;\n                    transferStarted(dataSpecParameter);\n                    return dataSpecParameter.length != C.LENGTH_UNSET\n                            ? dataSpecParameter.length\n                            : 0;\n                }\n            }\n\n            final InputStream errorStream = httpURLConnection.getErrorStream();\n            byte[] errorResponseBody;\n            try {\n                errorResponseBody = errorStream != null\n                        ? Util.toByteArray(errorStream)\n                        : Util.EMPTY_BYTE_ARRAY;\n            } catch (final IOException e) {\n                errorResponseBody = Util.EMPTY_BYTE_ARRAY;\n            }\n\n            closeConnectionQuietly();\n            final IOException cause = responseCode == 416 ? new DataSourceException(\n                    PlaybackException.ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE)\n                    : null;\n            throw new InvalidResponseCodeException(responseCode, responseMessage, cause, headers,\n                    dataSpec, errorResponseBody);\n        }\n\n        // Check for a valid content type.\n        final String contentType = httpURLConnection.getContentType();\n        if (contentTypePredicate != null && !contentTypePredicate.apply(contentType)) {\n            closeConnectionQuietly();\n            throw new InvalidContentTypeException(contentType, dataSpecParameter);\n        }\n\n        final long bytesToSkip;\n        if (!rangeParameterEnabled) {\n            // If we requested a range starting from a non-zero position and received a 200 rather\n            // than a 206, then the server does not support partial requests. We'll need to\n            // manually skip to the requested position.\n            bytesToSkip = responseCode == 200 && dataSpecParameter.position != 0\n                    ? dataSpecParameter.position\n                    : 0;\n        } else {\n            bytesToSkip = 0;\n        }\n\n\n        // Determine the length of the data to be read, after skipping.\n        final boolean isCompressed = isCompressed(httpURLConnection);\n        if (!isCompressed) {\n            if (dataSpecParameter.length != C.LENGTH_UNSET) {\n                bytesToRead = dataSpecParameter.length;\n            } else {\n                final long contentLength = HttpUtil.getContentLength(\n                        httpURLConnection.getHeaderField(HttpHeaders.CONTENT_LENGTH),\n                        httpURLConnection.getHeaderField(HttpHeaders.CONTENT_RANGE));\n                bytesToRead = contentLength != C.LENGTH_UNSET\n                        ? (contentLength - bytesToSkip)\n                        : C.LENGTH_UNSET;\n            }\n        } else {\n            // Gzip is enabled. If the server opts to use gzip then the content length in the\n            // response will be that of the compressed data, which isn't what we want. Always use\n            // the dataSpec length in this case.\n            bytesToRead = dataSpecParameter.length;\n        }\n\n        try {\n            inputStream = httpURLConnection.getInputStream();\n            if (isCompressed) {\n                inputStream = new GZIPInputStream(inputStream);\n            }\n        } catch (final IOException e) {\n            closeConnectionQuietly();\n            throw new HttpDataSourceException(e, dataSpec,\n                    PlaybackException.ERROR_CODE_IO_UNSPECIFIED,\n                    HttpDataSourceException.TYPE_OPEN);\n        }\n\n        opened = true;\n        transferStarted(dataSpecParameter);\n\n        try {\n            skipFully(bytesToSkip, dataSpec);\n        } catch (final IOException e) {\n            closeConnectionQuietly();\n            if (e instanceof HttpDataSourceException) {\n                throw (HttpDataSourceException) e;\n            }\n            throw new HttpDataSourceException(e, dataSpec,\n                    PlaybackException.ERROR_CODE_IO_UNSPECIFIED,\n                    HttpDataSourceException.TYPE_OPEN);\n        }\n\n        return bytesToRead;\n    }\n\n    @Override\n    public int read(@NonNull final byte[] buffer, final int offset, final int length)\n            throws HttpDataSourceException {\n        try {\n            return readInternal(buffer, offset, length);\n        } catch (final IOException e) {\n            throw HttpDataSourceException.createForIOException(e, castNonNull(dataSpec),\n                    HttpDataSourceException.TYPE_READ);\n        }\n    }\n\n    @Override\n    public void close() throws HttpDataSourceException {\n        try {\n            final InputStream connectionInputStream = this.inputStream;\n            if (connectionInputStream != null) {\n                final long bytesRemaining = bytesToRead == C.LENGTH_UNSET\n                        ? C.LENGTH_UNSET\n                        : bytesToRead - bytesRead;\n                maybeTerminateInputStream(connection, bytesRemaining);\n\n                try {\n                    connectionInputStream.close();\n                } catch (final IOException e) {\n                    throw new HttpDataSourceException(e, castNonNull(dataSpec),\n                            PlaybackException.ERROR_CODE_IO_UNSPECIFIED,\n                            HttpDataSourceException.TYPE_CLOSE);\n                }\n            }\n        } finally {\n            inputStream = null;\n            closeConnectionQuietly();\n            if (opened) {\n                opened = false;\n                transferEnded();\n            }\n        }\n    }\n\n    @NonNull\n    private HttpURLConnection makeConnection(@NonNull final DataSpec dataSpecToUse)\n            throws IOException {\n        URL url = new URL(dataSpecToUse.uri.toString());\n        @HttpMethod int httpMethod = dataSpecToUse.httpMethod;\n        @Nullable byte[] httpBody = dataSpecToUse.httpBody;\n        final long position = dataSpecToUse.position;\n        final long length = dataSpecToUse.length;\n        final boolean allowGzip = dataSpecToUse.isFlagSet(DataSpec.FLAG_ALLOW_GZIP);\n\n        if (!allowCrossProtocolRedirects && !keepPostFor302Redirects) {\n            // HttpURLConnection disallows cross-protocol redirects, but otherwise performs\n            // redirection automatically. This is the behavior we want, so use it.\n            return makeConnection(url, httpMethod, httpBody, position, length, allowGzip, true,\n                    dataSpecToUse.httpRequestHeaders);\n        }\n\n        // We need to handle redirects ourselves to allow cross-protocol redirects or to keep the\n        // POST request method for 302.\n        int redirectCount = 0;\n        while (redirectCount++ <= MAX_REDIRECTS) {\n            final HttpURLConnection httpURLConnection = makeConnection(url, httpMethod, httpBody,\n                    position, length, allowGzip, false, dataSpecToUse.httpRequestHeaders);\n            final int httpURLConnectionResponseCode = httpURLConnection.getResponseCode();\n            final String location = httpURLConnection.getHeaderField(\"Location\");\n            if ((httpMethod == DataSpec.HTTP_METHOD_GET || httpMethod == DataSpec.HTTP_METHOD_HEAD)\n                    && (httpURLConnectionResponseCode == HttpURLConnection.HTTP_MULT_CHOICE\n                    || httpURLConnectionResponseCode == HttpURLConnection.HTTP_MOVED_PERM\n                    || httpURLConnectionResponseCode == HttpURLConnection.HTTP_MOVED_TEMP\n                    || httpURLConnectionResponseCode == HttpURLConnection.HTTP_SEE_OTHER\n                    || httpURLConnectionResponseCode == HTTP_STATUS_TEMPORARY_REDIRECT\n                    || httpURLConnectionResponseCode == HTTP_STATUS_PERMANENT_REDIRECT)) {\n                httpURLConnection.disconnect();\n                url = handleRedirect(url, location, dataSpecToUse);\n            } else if (httpMethod == DataSpec.HTTP_METHOD_POST\n                    && (httpURLConnectionResponseCode == HttpURLConnection.HTTP_MULT_CHOICE\n                    || httpURLConnectionResponseCode == HttpURLConnection.HTTP_MOVED_PERM\n                    || httpURLConnectionResponseCode == HttpURLConnection.HTTP_MOVED_TEMP\n                    || httpURLConnectionResponseCode == HttpURLConnection.HTTP_SEE_OTHER)) {\n                httpURLConnection.disconnect();\n                final boolean shouldKeepPost = keepPostFor302Redirects\n                        && responseCode == HttpURLConnection.HTTP_MOVED_TEMP;\n                if (!shouldKeepPost) {\n                    // POST request follows the redirect and is transformed into a GET request.\n                    httpMethod = DataSpec.HTTP_METHOD_GET;\n                    httpBody = null;\n                }\n                url = handleRedirect(url, location, dataSpecToUse);\n            } else {\n                return httpURLConnection;\n            }\n        }\n\n        // If we get here we've been redirected more times than are permitted.\n        throw new HttpDataSourceException(\n                new NoRouteToHostException(\"Too many redirects: \" + redirectCount),\n                dataSpecToUse,\n                PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED,\n                HttpDataSourceException.TYPE_OPEN);\n    }\n\n    /**\n     * Configures a connection and opens it.\n     *\n     * @param url               The url to connect to.\n     * @param httpMethod        The http method.\n     * @param httpBody          The body data, or {@code null} if not required.\n     * @param position          The byte offset of the requested data.\n     * @param length            The length of the requested data, or {@link C#LENGTH_UNSET}.\n     * @param allowGzip         Whether to allow the use of gzip.\n     * @param followRedirects   Whether to follow redirects.\n     * @param requestParameters parameters (HTTP headers) to include in request.\n     * @return the connection opened\n     */\n    @SuppressWarnings(\"checkstyle:ParameterNumber\")\n    @NonNull\n    private HttpURLConnection makeConnection(\n            @NonNull final URL url,\n            @HttpMethod final int httpMethod,\n            @Nullable final byte[] httpBody,\n            final long position,\n            final long length,\n            final boolean allowGzip,\n            final boolean followRedirects,\n            final Map<String, String> requestParameters) throws IOException {\n        // This is the method that contains breaking changes with respect to DefaultHttpDataSource!\n\n        String requestUrl = url.toString();\n\n        // Don't add the request number parameter if it has been already added (for instance in\n        // DASH manifests) or if that's not a videoplayback URL\n        final boolean isVideoPlaybackUrl = url.getPath().startsWith(\"/videoplayback\");\n        if (isVideoPlaybackUrl && rnParameterEnabled && !requestUrl.contains(RN_PARAMETER)) {\n            requestUrl += RN_PARAMETER + requestNumber;\n            ++requestNumber;\n        }\n\n        if (rangeParameterEnabled && isVideoPlaybackUrl) {\n            final String rangeParameterBuilt = buildRangeParameter(position, length);\n            if (rangeParameterBuilt != null) {\n                requestUrl += rangeParameterBuilt;\n            }\n        }\n\n        final HttpURLConnection httpURLConnection = openConnection(new URL(requestUrl));\n        httpURLConnection.setConnectTimeout(connectTimeoutMillis);\n        httpURLConnection.setReadTimeout(readTimeoutMillis);\n\n        final Map<String, String> requestHeaders = new HashMap<>();\n        if (defaultRequestProperties != null) {\n            requestHeaders.putAll(defaultRequestProperties.getSnapshot());\n        }\n        requestHeaders.putAll(requestProperties.getSnapshot());\n        requestHeaders.putAll(requestParameters);\n\n        for (final Map.Entry<String, String> property : requestHeaders.entrySet()) {\n            httpURLConnection.setRequestProperty(property.getKey(), property.getValue());\n        }\n\n        if (!rangeParameterEnabled) {\n            final String rangeHeader = buildRangeRequestHeader(position, length);\n            if (rangeHeader != null) {\n                httpURLConnection.setRequestProperty(HttpHeaders.RANGE, rangeHeader);\n            }\n        }\n\n        if (isWebStreamingUrl(requestUrl)\n                || isWebEmbeddedPlayerStreamingUrl(requestUrl)) {\n            httpURLConnection.setRequestProperty(HttpHeaders.ORIGIN, YOUTUBE_BASE_URL);\n            httpURLConnection.setRequestProperty(HttpHeaders.REFERER, YOUTUBE_BASE_URL);\n            httpURLConnection.setRequestProperty(HttpHeaders.SEC_FETCH_DEST, \"empty\");\n            httpURLConnection.setRequestProperty(HttpHeaders.SEC_FETCH_MODE, \"cors\");\n            httpURLConnection.setRequestProperty(HttpHeaders.SEC_FETCH_SITE, \"cross-site\");\n        }\n\n        httpURLConnection.setRequestProperty(HttpHeaders.TE, \"trailers\");\n\n        final boolean isAndroidStreamingUrl = isAndroidStreamingUrl(requestUrl);\n        final boolean isIosStreamingUrl = isIosStreamingUrl(requestUrl);\n        if (isAndroidStreamingUrl) {\n            // Improvement which may be done: find the content country used to request YouTube\n            // contents to add it in the user agent instead of using the default\n            httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT,\n                    getAndroidUserAgent(null));\n        } else if (isIosStreamingUrl) {\n            httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT,\n                    getIosUserAgent(null));\n        } else {\n            // non-mobile user agent\n            httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, DownloaderImpl.USER_AGENT);\n        }\n\n        httpURLConnection.setRequestProperty(HttpHeaders.ACCEPT_ENCODING,\n                allowGzip ? \"gzip\" : \"identity\");\n        httpURLConnection.setInstanceFollowRedirects(followRedirects);\n        // Most clients use POST requests to fetch contents\n        httpURLConnection.setRequestMethod(\"POST\");\n        httpURLConnection.setDoOutput(true);\n        httpURLConnection.setFixedLengthStreamingMode(POST_BODY.length);\n        httpURLConnection.connect();\n\n        final OutputStream os = httpURLConnection.getOutputStream();\n        os.write(POST_BODY);\n        os.close();\n\n        return httpURLConnection;\n    }\n\n    /**\n     * Creates an {@link HttpURLConnection} that is connected with the {@code url}.\n     *\n     * @param url the {@link URL} to create an {@link HttpURLConnection}\n     * @return an {@link HttpURLConnection} created with the {@code url}\n     */\n    private HttpURLConnection openConnection(@NonNull final URL url) throws IOException {\n        return (HttpURLConnection) url.openConnection();\n    }\n\n    /**\n     * Handles a redirect.\n     *\n     * @param originalUrl              The original URL.\n     * @param location                 The Location header in the response. May be {@code null}.\n     * @param dataSpecToHandleRedirect The {@link DataSpec}.\n     * @return The next URL.\n     * @throws HttpDataSourceException If redirection isn't possible.\n     */\n    @NonNull\n    private URL handleRedirect(final URL originalUrl,\n                               @Nullable final String location,\n                               final DataSpec dataSpecToHandleRedirect)\n            throws HttpDataSourceException {\n        if (location == null) {\n            throw new HttpDataSourceException(\"Null location redirect\", dataSpecToHandleRedirect,\n                    PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED,\n                    HttpDataSourceException.TYPE_OPEN);\n        }\n\n        // Form the new url.\n        final URL url;\n        try {\n            url = new URL(originalUrl, location);\n        } catch (final MalformedURLException e) {\n            throw new HttpDataSourceException(e, dataSpecToHandleRedirect,\n                    PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED,\n                    HttpDataSourceException.TYPE_OPEN);\n        }\n\n        // Check that the protocol of the new url is supported.\n        final String protocol = url.getProtocol();\n        if (!\"https\".equals(protocol) && !\"http\".equals(protocol)) {\n            throw new HttpDataSourceException(\"Unsupported protocol redirect: \" + protocol,\n                    dataSpecToHandleRedirect,\n                    PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED,\n                    HttpDataSourceException.TYPE_OPEN);\n        }\n\n        if (!allowCrossProtocolRedirects && !protocol.equals(originalUrl.getProtocol())) {\n            throw new HttpDataSourceException(\n                    \"Disallowed cross-protocol redirect (\"\n                            + originalUrl.getProtocol()\n                            + \" to \"\n                            + protocol\n                            + \")\",\n                    dataSpecToHandleRedirect,\n                    PlaybackException.ERROR_CODE_IO_NETWORK_CONNECTION_FAILED,\n                    HttpDataSourceException.TYPE_OPEN);\n        }\n\n        return url;\n    }\n\n    /**\n     * Attempts to skip the specified number of bytes in full.\n     *\n     * @param bytesToSkip   The number of bytes to skip.\n     * @param dataSpecToUse The {@link DataSpec}.\n     * @throws IOException If the thread is interrupted during the operation, or if the data ended\n     * before skipping the specified number of bytes.\n     */\n    @SuppressWarnings(\"checkstyle:FinalParameters\")\n    private void skipFully(long bytesToSkip, final DataSpec dataSpecToUse) throws IOException {\n        if (bytesToSkip == 0) {\n            return;\n        }\n\n        final byte[] skipBuffer = new byte[4096];\n        while (bytesToSkip > 0) {\n            final int readLength = (int) min(bytesToSkip, skipBuffer.length);\n            final int read = castNonNull(inputStream).read(skipBuffer, 0, readLength);\n            if (Thread.currentThread().isInterrupted()) {\n                throw new HttpDataSourceException(\n                        new InterruptedIOException(),\n                        dataSpecToUse,\n                        PlaybackException.ERROR_CODE_IO_UNSPECIFIED,\n                        HttpDataSourceException.TYPE_OPEN);\n            }\n\n            if (read == -1) {\n                throw new HttpDataSourceException(\n                        dataSpecToUse,\n                        PlaybackException.ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE,\n                        HttpDataSourceException.TYPE_OPEN);\n            }\n\n            bytesToSkip -= read;\n            bytesTransferred(read);\n        }\n    }\n\n    /**\n     * Reads up to {@code length} bytes of data and stores them into {@code buffer}, starting at\n     * index {@code offset}.\n     *\n     * <p>\n     * This method blocks until at least one byte of data can be read, the end of the opened range\n     * is detected, or an exception is thrown.\n     * </p>\n     *\n     * @param buffer     The buffer into which the read data should be stored.\n     * @param offset     The start offset into {@code buffer} at which data should be written.\n     * @param readLength The maximum number of bytes to read.\n     * @return The number of bytes read, or {@link C#RESULT_END_OF_INPUT} if the end of the opened\n     * range is reached.\n     * @throws IOException If an error occurs reading from the source.\n     */\n    @SuppressWarnings(\"checkstyle:FinalParameters\")\n    private int readInternal(final byte[] buffer, final int offset, int readLength)\n            throws IOException {\n        if (readLength == 0) {\n            return 0;\n        }\n        if (bytesToRead != C.LENGTH_UNSET) {\n            final long bytesRemaining = bytesToRead - bytesRead;\n            if (bytesRemaining == 0) {\n                return C.RESULT_END_OF_INPUT;\n            }\n            readLength = (int) min(readLength, bytesRemaining);\n        }\n\n        final int read = castNonNull(inputStream).read(buffer, offset, readLength);\n        if (read == -1) {\n            return C.RESULT_END_OF_INPUT;\n        }\n\n        bytesRead += read;\n        bytesTransferred(read);\n        return read;\n    }\n\n    /**\n     * On platform API levels 19 and 20, okhttp's implementation of {@link InputStream#close} can\n     * block for a long time if the stream has a lot of data remaining. Call this method before\n     * closing the input stream to make a best effort to cause the input stream to encounter an\n     * unexpected end of input, working around this issue. On other platform API levels, the method\n     * does nothing.\n     *\n     * @param connection     The connection whose {@link InputStream} should be terminated.\n     * @param bytesRemaining The number of bytes remaining to be read from the input stream if its\n     *                       length is known. {@link C#LENGTH_UNSET} otherwise.\n     */\n    private static void maybeTerminateInputStream(@Nullable final HttpURLConnection connection,\n                                                  final long bytesRemaining) {\n        if (connection == null || Util.SDK_INT < 19 || Util.SDK_INT > 20) {\n            return;\n        }\n\n        try {\n            final InputStream inputStream = connection.getInputStream();\n            if (bytesRemaining == C.LENGTH_UNSET) {\n                // If the input stream has already ended, do nothing. The socket may be re-used.\n                if (inputStream.read() == -1) {\n                    return;\n                }\n            } else if (bytesRemaining <= MAX_BYTES_TO_DRAIN) {\n                // There isn't much data left. Prefer to allow it to drain, which may allow the\n                // socket to be re-used.\n                return;\n            }\n            final String className = inputStream.getClass().getName();\n            if (\"com.android.okhttp.internal.http.HttpTransport$ChunkedInputStream\"\n                    .equals(className)\n                    || \"com.android.okhttp.internal.http.HttpTransport$FixedLengthInputStream\"\n                        .equals(className)) {\n                final Class<?> superclass = inputStream.getClass().getSuperclass();\n                final Method unexpectedEndOfInput = checkNotNull(superclass).getDeclaredMethod(\n                        \"unexpectedEndOfInput\");\n                unexpectedEndOfInput.setAccessible(true);\n                unexpectedEndOfInput.invoke(inputStream);\n            }\n        } catch (final Exception e) {\n            // If an IOException then the connection didn't ever have an input stream, or it was\n            // closed already. If another type of exception then something went wrong, most likely\n            // the device isn't using okhttp.\n        }\n    }\n\n    /**\n     * Closes the current connection quietly, if there is one.\n     */\n    private void closeConnectionQuietly() {\n        if (connection != null) {\n            try {\n                connection.disconnect();\n            } catch (final Exception e) {\n                Log.e(TAG, \"Unexpected error while disconnecting\", e);\n            }\n            connection = null;\n        }\n    }\n\n    private static boolean isCompressed(@NonNull final HttpURLConnection connection) {\n        final String contentEncoding = connection.getHeaderField(\"Content-Encoding\");\n        return \"gzip\".equalsIgnoreCase(contentEncoding);\n    }\n\n    /**\n     * Builds a {@code range} parameter for the given position and length.\n     *\n     * <p>\n     * To fetch its contents, YouTube use range requests which append a {@code range} parameter\n     * to videoplayback URLs instead of the {@code Range} header (even if the server respond\n     * correctly when requesting a range of a ressouce with it).\n     * </p>\n     *\n     * <p>\n     * The parameter works in the same way as the header.\n     * </p>\n     *\n     * @param position The request position.\n     * @param length The request length, or {@link C#LENGTH_UNSET} if the request is unbounded.\n     * @return The corresponding {@code range} parameter, or {@code null} if this parameter is\n     * unnecessary because the whole resource is being requested.\n     */\n    @Nullable\n    private static String buildRangeParameter(final long position, final long length) {\n        if (position == 0 && length == C.LENGTH_UNSET) {\n            return null;\n        }\n\n        final StringBuilder rangeParameter = new StringBuilder();\n        rangeParameter.append(\"&range=\");\n        rangeParameter.append(position);\n        rangeParameter.append(\"-\");\n        if (length != C.LENGTH_UNSET) {\n            rangeParameter.append(position + length - 1);\n        }\n        return rangeParameter.toString();\n    }\n\n    private static final class NullFilteringHeadersMap\n            extends ForwardingMap<String, List<String>> {\n        private final Map<String, List<String>> headers;\n\n        NullFilteringHeadersMap(final Map<String, List<String>> headers) {\n            this.headers = headers;\n        }\n\n        @NonNull\n        @Override\n        protected Map<String, List<String>> delegate() {\n            return headers;\n        }\n\n        @Override\n        public boolean containsKey(@Nullable final Object key) {\n            return key != null && super.containsKey(key);\n        }\n\n        @Nullable\n        @Override\n        public List<String> get(@Nullable final Object key) {\n            return key == null ? null : super.get(key);\n        }\n\n        @NonNull\n        @Override\n        public Set<String> keySet() {\n            return Sets.filter(super.keySet(), Objects::nonNull);\n        }\n\n        @NonNull\n        @Override\n        public Set<Entry<String, List<String>>> entrySet() {\n            return Sets.filter(super.entrySet(), entry -> entry.getKey() != null);\n        }\n\n        @Override\n        public int size() {\n            return super.size() - (super.containsKey(null) ? 1 : 0);\n        }\n\n        @Override\n        public boolean isEmpty() {\n            return super.isEmpty() || (super.size() == 1 && super.containsKey(null));\n        }\n\n        @Override\n        public boolean containsValue(@Nullable final Object value) {\n            return super.standardContainsValue(value);\n        }\n\n        @Override\n        public boolean equals(@Nullable final Object object) {\n            return object != null && super.standardEquals(object);\n        }\n\n        @Override\n        public int hashCode() {\n            return super.standardHashCode();\n        }\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/event/OnKeyDownListener.java",
    "content": "package org.schabi.newpipe.player.event;\n\npublic interface OnKeyDownListener {\n    boolean onKeyDown(int keyCode);\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/event/PlayerEventListener.java",
    "content": "package org.schabi.newpipe.player.event;\n\nimport com.google.android.exoplayer2.PlaybackParameters;\n\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\n\npublic interface PlayerEventListener {\n    void onQueueUpdate(PlayQueue queue);\n    void onPlaybackUpdate(int state, int repeatMode, boolean shuffled,\n                          PlaybackParameters parameters);\n    void onProgressUpdate(int currentProgress, int duration, int bufferPercent);\n    void onMetadataUpdate(StreamInfo info, PlayQueue queue);\n    default void onAudioTrackUpdate() { }\n    void onServiceStopped();\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/event/PlayerServiceEventListener.java",
    "content": "package org.schabi.newpipe.player.event;\n\nimport com.google.android.exoplayer2.PlaybackException;\n\npublic interface PlayerServiceEventListener extends PlayerEventListener {\n    void onViewCreated();\n\n    void onFullscreenStateChanged(boolean fullscreen);\n\n    void onScreenRotationButtonClicked();\n\n    void onMoreOptionsLongClicked();\n\n    void onPlayerError(PlaybackException error, boolean isCatchableException);\n\n    void hideSystemUiIfNeeded();\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/event/PlayerServiceExtendedEventListener.java",
    "content": "package org.schabi.newpipe.player.event;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.player.PlayerService;\nimport org.schabi.newpipe.player.Player;\n\n/**\n * In addition to {@link PlayerServiceEventListener}, provides callbacks for service and player\n * connections and disconnections. \"Connected\" here means that the service (resp. the\n * player) is running and is bound to {@link org.schabi.newpipe.player.helper.PlayerHolder}.\n * \"Disconnected\" means that either the service (resp. the player) was stopped completely, or that\n * {@link org.schabi.newpipe.player.helper.PlayerHolder} is not bound.\n */\npublic interface PlayerServiceExtendedEventListener extends PlayerServiceEventListener {\n    /**\n     * The player service just connected to {@link org.schabi.newpipe.player.helper.PlayerHolder},\n     * but the player may not be active at this moment, e.g. in case the service is running to\n     * respond to Android Auto media browser queries without playing anything.\n     * {@link #onPlayerConnected(Player, boolean)} will be called right after this function if there\n     * is a player.\n     *\n     * @param playerService the newly connected player service\n     */\n    void onServiceConnected(@NonNull PlayerService playerService);\n\n    /**\n     * The player service is already connected and the player was just started.\n     *\n     * @param player the newly connected or started player\n     * @param playAfterConnect whether to open the video player in the video details fragment\n     */\n    void onPlayerConnected(@NonNull Player player, boolean playAfterConnect);\n\n    /**\n     * The player got disconnected, for one of these reasons: the player is getting closed while\n     * leaving the service open for future media browser queries, the service is stopping\n     * completely, or {@link org.schabi.newpipe.player.helper.PlayerHolder} is unbinding.\n     */\n    void onPlayerDisconnected();\n\n    /**\n     * The service got disconnected from {@link org.schabi.newpipe.player.helper.PlayerHolder},\n     * either because {@link org.schabi.newpipe.player.helper.PlayerHolder} is unbinding or because\n     * the service is stopping completely.\n     */\n    void onServiceDisconnected();\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/gesture/BasePlayerGestureListener.kt",
    "content": "package org.schabi.newpipe.player.gesture\n\nimport android.os.Handler\nimport android.os.Looper\nimport android.util.Log\nimport android.view.GestureDetector\nimport android.view.MotionEvent\nimport android.view.View\nimport androidx.core.os.postDelayed\nimport org.schabi.newpipe.databinding.PlayerBinding\nimport org.schabi.newpipe.player.Player\nimport org.schabi.newpipe.player.ui.VideoPlayerUi\n\n/**\n * Base gesture handling for [Player]\n *\n * This class contains the logic for the player gestures like View preparations\n * and provides some abstract methods to make it easier separating the logic from the UI.\n */\nabstract class BasePlayerGestureListener(\n    private val playerUi: VideoPlayerUi\n) : GestureDetector.SimpleOnGestureListener(), View.OnTouchListener {\n\n    protected val player: Player = playerUi.player\n    protected val binding: PlayerBinding = playerUi.binding\n\n    override fun onTouch(v: View, event: MotionEvent): Boolean {\n        playerUi.gestureDetector.onTouchEvent(event)\n        return false\n    }\n\n    private fun onDoubleTap(\n        event: MotionEvent,\n        portion: DisplayPortion\n    ) {\n        if (DEBUG) {\n            Log.d(\n                TAG,\n                \"onDoubleTap called with playerType = [\" +\n                    player.playerType + \"], portion = [\" + portion + \"]\"\n            )\n        }\n        if (playerUi.isSomePopupMenuVisible) {\n            playerUi.hideControls(0, 0)\n        }\n        if (portion === DisplayPortion.LEFT || portion === DisplayPortion.RIGHT) {\n            startMultiDoubleTap(event)\n        } else if (portion === DisplayPortion.MIDDLE) {\n            player.playPause()\n            if (player.isPlaying) {\n                playerUi.hideControls(0, 0)\n            }\n        }\n    }\n\n    protected fun onSingleTap() {\n        if (playerUi.isControlsVisible) {\n            playerUi.hideControls(150, 0)\n            return\n        }\n        // -- Controls are not visible --\n\n        // When player is completed show controls and don't hide them later\n        if (player.currentState == Player.STATE_COMPLETED) {\n            playerUi.showControls(0)\n        } else {\n            playerUi.showControlsThenHide()\n        }\n    }\n\n    open fun onScrollEnd(event: MotionEvent) {\n        if (DEBUG) {\n            Log.d(\n                TAG,\n                \"onScrollEnd called with playerType = [\" +\n                    player.playerType + \"]\"\n            )\n        }\n        if (playerUi.isControlsVisible && player.currentState == Player.STATE_PLAYING) {\n            playerUi.hideControls(\n                VideoPlayerUi.DEFAULT_CONTROLS_DURATION,\n                VideoPlayerUi.DEFAULT_CONTROLS_HIDE_TIME\n            )\n        }\n    }\n\n    // ///////////////////////////////////////////////////////////////////\n    // Simple gestures\n    // ///////////////////////////////////////////////////////////////////\n\n    override fun onDown(e: MotionEvent): Boolean {\n        if (DEBUG) {\n            Log.d(TAG, \"onDown called with e = [$e]\")\n        }\n\n        if (isDoubleTapping && isDoubleTapEnabled) {\n            doubleTapControls?.onDoubleTapProgressDown(getDisplayPortion(e))\n            return true\n        }\n\n        if (onDownNotDoubleTapping(e)) {\n            return super.onDown(e)\n        }\n        return true\n    }\n\n    /**\n     * @return true if `super.onDown(e)` should be called, false otherwise\n     */\n    open fun onDownNotDoubleTapping(e: MotionEvent): Boolean {\n        return false // do not call super.onDown(e) by default, overridden for popup player\n    }\n\n    override fun onDoubleTap(e: MotionEvent): Boolean {\n        if (DEBUG) {\n            Log.d(TAG, \"onDoubleTap called with e = [$e]\")\n        }\n\n        onDoubleTap(e, getDisplayPortion(e))\n        return true\n    }\n\n    // ///////////////////////////////////////////////////////////////////\n    // Multi double tapping\n    // ///////////////////////////////////////////////////////////////////\n\n    private var doubleTapControls: DoubleTapListener? = null\n\n    private val isDoubleTapEnabled: Boolean\n        get() = doubleTapDelay > 0\n\n    var isDoubleTapping = false\n        private set\n\n    fun doubleTapControls(listener: DoubleTapListener) = apply {\n        doubleTapControls = listener\n    }\n\n    private var doubleTapDelay = DOUBLE_TAP_DELAY\n    private val doubleTapHandler: Handler = Handler(Looper.getMainLooper())\n\n    private fun startMultiDoubleTap(e: MotionEvent) {\n        if (!isDoubleTapping) {\n            if (DEBUG) {\n                Log.d(TAG, \"startMultiDoubleTap called with e = [$e]\")\n            }\n\n            keepInDoubleTapMode()\n            doubleTapControls?.onDoubleTapStarted(getDisplayPortion(e))\n        }\n    }\n\n    fun keepInDoubleTapMode() {\n        if (DEBUG) {\n            Log.d(TAG, \"keepInDoubleTapMode called\")\n        }\n\n        isDoubleTapping = true\n        doubleTapHandler.removeCallbacksAndMessages(DOUBLE_TAP)\n        doubleTapHandler.postDelayed(DOUBLE_TAP_DELAY, DOUBLE_TAP) {\n            if (DEBUG) {\n                Log.d(TAG, \"doubleTapRunnable called\")\n            }\n\n            isDoubleTapping = false\n            doubleTapControls?.onDoubleTapFinished()\n        }\n    }\n\n    fun endMultiDoubleTap() {\n        if (DEBUG) {\n            Log.d(TAG, \"endMultiDoubleTap called\")\n        }\n\n        isDoubleTapping = false\n        doubleTapHandler.removeCallbacksAndMessages(DOUBLE_TAP)\n        doubleTapControls?.onDoubleTapFinished()\n    }\n\n    // ///////////////////////////////////////////////////////////////////\n    // Utils\n    // ///////////////////////////////////////////////////////////////////\n\n    abstract fun getDisplayPortion(e: MotionEvent): DisplayPortion\n\n    // Currently needed for scrolling since there is no action more the middle portion\n    abstract fun getDisplayHalfPortion(e: MotionEvent): DisplayPortion\n\n    companion object {\n        private const val TAG = \"BasePlayerGestListener\"\n        private val DEBUG = Player.DEBUG\n\n        private const val DOUBLE_TAP = \"doubleTap\"\n        private const val DOUBLE_TAP_DELAY = 550L\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/gesture/CustomBottomSheetBehavior.java",
    "content": "package org.schabi.newpipe.player.gesture;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.widget.FrameLayout;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.coordinatorlayout.widget.CoordinatorLayout;\n\nimport com.google.android.material.bottomsheet.BottomSheetBehavior;\n\nimport org.schabi.newpipe.R;\n\nimport java.util.List;\n\npublic class CustomBottomSheetBehavior extends BottomSheetBehavior<FrameLayout> {\n\n    public CustomBottomSheetBehavior(@NonNull final Context context,\n                                     @Nullable final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    Rect globalRect = new Rect();\n    private boolean skippingInterception = false;\n    private final List<Integer> skipInterceptionOfElements = List.of(\n            R.id.detail_content_root_layout, R.id.relatedItemsLayout,\n            R.id.itemsListPanel, R.id.view_pager, R.id.tab_layout, R.id.bottomControls,\n            R.id.playPauseButton, R.id.playPreviousButton, R.id.playNextButton);\n\n    @Override\n    public boolean onInterceptTouchEvent(@NonNull final CoordinatorLayout parent,\n                                         @NonNull final FrameLayout child,\n                                         @NonNull final MotionEvent event) {\n        // Drop following when action ends\n        if (event.getAction() == MotionEvent.ACTION_CANCEL\n                || event.getAction() == MotionEvent.ACTION_UP) {\n            skippingInterception = false;\n        }\n\n        // Found that user still swiping, continue following\n        if (skippingInterception || getState() == BottomSheetBehavior.STATE_SETTLING) {\n            return false;\n        }\n\n        // The interception listens for the child view with the id \"fragment_player_holder\",\n        // so the following two-finger gesture will be triggered only for the player view on\n        // portrait and for the top controls (visible) on landscape.\n        setSkipCollapsed(event.getPointerCount() == 2);\n        if (event.getPointerCount() == 2) {\n            return super.onInterceptTouchEvent(parent, child, event);\n        }\n\n        // Don't need to do anything if bottomSheet isn't expanded\n        if (getState() == BottomSheetBehavior.STATE_EXPANDED\n                && event.getAction() == MotionEvent.ACTION_DOWN) {\n            // Without overriding scrolling will not work when user touches these elements\n            for (final int element : skipInterceptionOfElements) {\n                final View view = child.findViewById(element);\n                if (view != null) {\n                    final boolean visible = view.getGlobalVisibleRect(globalRect);\n                    if (visible\n                            && globalRect.contains((int) event.getRawX(), (int) event.getRawY())) {\n                        // Makes bottom part of the player draggable in portrait when\n                        // playbackControlRoot is hidden\n                        if (element == R.id.bottomControls\n                                && child.findViewById(R.id.playbackControlRoot)\n                                .getVisibility() != View.VISIBLE) {\n                            return super.onInterceptTouchEvent(parent, child, event);\n                        }\n                        skippingInterception = true;\n                        return false;\n                    }\n                }\n            }\n        }\n\n        return super.onInterceptTouchEvent(parent, child, event);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/gesture/DisplayPortion.kt",
    "content": "package org.schabi.newpipe.player.gesture\n\nenum class DisplayPortion {\n    LEFT,\n    MIDDLE,\n    RIGHT,\n    LEFT_HALF,\n    RIGHT_HALF\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/gesture/DoubleTapListener.kt",
    "content": "package org.schabi.newpipe.player.gesture\n\ninterface DoubleTapListener {\n    fun onDoubleTapStarted(portion: DisplayPortion)\n    fun onDoubleTapProgressDown(portion: DisplayPortion)\n    fun onDoubleTapFinished()\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/gesture/MainPlayerGestureListener.kt",
    "content": "package org.schabi.newpipe.player.gesture\n\nimport android.util.Log\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.View.OnTouchListener\nimport android.widget.ProgressBar\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.appcompat.content.res.AppCompatResources\nimport androidx.core.view.isVisible\nimport kotlin.math.abs\nimport org.schabi.newpipe.MainActivity\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.ktx.AnimationType\nimport org.schabi.newpipe.ktx.animate\nimport org.schabi.newpipe.player.Player\nimport org.schabi.newpipe.player.helper.AudioReactor\nimport org.schabi.newpipe.player.helper.PlayerHelper\nimport org.schabi.newpipe.player.ui.MainPlayerUi\nimport org.schabi.newpipe.util.ThemeHelper.getAndroidDimenPx\n\n/**\n * GestureListener for the player\n *\n * While [BasePlayerGestureListener] contains the logic behind the single gestures\n * this class focuses on the visual aspect like hiding and showing the controls or changing\n * volume/brightness during scrolling for specific events.\n */\nclass MainPlayerGestureListener(\n    private val playerUi: MainPlayerUi\n) : BasePlayerGestureListener(playerUi), OnTouchListener {\n    private var isMoving = false\n\n    override fun onTouch(v: View, event: MotionEvent): Boolean {\n        super.onTouch(v, event)\n        if (event.action == MotionEvent.ACTION_UP && isMoving) {\n            isMoving = false\n            onScrollEnd(event)\n        }\n        return when (event.action) {\n            MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> {\n                v.parent?.requestDisallowInterceptTouchEvent(playerUi.isFullscreen)\n                true\n            }\n\n            MotionEvent.ACTION_UP -> {\n                v.parent?.requestDisallowInterceptTouchEvent(false)\n                false\n            }\n\n            else -> true\n        }\n    }\n\n    override fun onSingleTapConfirmed(e: MotionEvent): Boolean {\n        if (DEBUG) {\n            Log.d(TAG, \"onSingleTapConfirmed() called with: e = [$e]\")\n        }\n\n        if (isDoubleTapping) {\n            return true\n        }\n        super.onSingleTapConfirmed(e)\n\n        if (player.currentState != Player.STATE_BLOCKED) {\n            onSingleTap()\n        }\n        return true\n    }\n\n    private fun onScrollVolume(distanceY: Float) {\n        val bar: ProgressBar = binding.volumeProgressBar\n        val audioReactor: AudioReactor = player.audioReactor\n\n        // If we just started sliding, change the progress bar to match the system volume\n        if (!binding.volumeRelativeLayout.isVisible) {\n            val volumePercent: Float = audioReactor.volume / audioReactor.maxVolume.toFloat()\n            bar.progress = (volumePercent * bar.max).toInt()\n        }\n\n        // Update progress bar\n        binding.volumeProgressBar.incrementProgressBy(distanceY.toInt())\n\n        // Update volume\n        val currentProgressPercent: Float = bar.progress / bar.max.toFloat()\n        val currentVolume = (audioReactor.maxVolume * currentProgressPercent).toInt()\n        audioReactor.volume = currentVolume\n        if (DEBUG) {\n            Log.d(TAG, \"onScroll().volumeControl, currentVolume = $currentVolume\")\n        }\n\n        // Update player center image\n        binding.volumeImageView.setImageDrawable(\n            AppCompatResources.getDrawable(\n                player.context,\n                when {\n                    currentProgressPercent <= 0 -> R.drawable.ic_volume_off\n                    currentProgressPercent < 0.25 -> R.drawable.ic_volume_mute\n                    currentProgressPercent < 0.75 -> R.drawable.ic_volume_down\n                    else -> R.drawable.ic_volume_up\n                }\n            )\n        )\n\n        // Make sure the correct layout is visible\n        if (!binding.volumeRelativeLayout.isVisible) {\n            binding.volumeRelativeLayout.animate(true, 200, AnimationType.SCALE_AND_ALPHA)\n        }\n        binding.brightnessRelativeLayout.isVisible = false\n    }\n\n    private fun onScrollBrightness(distanceY: Float) {\n        val parent: AppCompatActivity = playerUi.parentActivity.orElse(null) ?: return\n        val window = parent.window\n        val layoutParams = window.attributes\n        val bar: ProgressBar = binding.brightnessProgressBar\n\n        // Update progress bar\n        val oldBrightness = layoutParams.screenBrightness\n        bar.progress = (bar.max * oldBrightness.coerceIn(0f, 1f)).toInt()\n        bar.incrementProgressBy(distanceY.toInt())\n\n        // Update brightness\n        val currentProgressPercent = bar.progress.toFloat() / bar.max\n        layoutParams.screenBrightness = currentProgressPercent\n        window.attributes = layoutParams\n\n        // Save current brightness level\n        PlayerHelper.setScreenBrightness(parent, currentProgressPercent)\n        if (DEBUG) {\n            Log.d(\n                TAG,\n                \"onScroll().brightnessControl, \" +\n                    \"currentBrightness = \" + currentProgressPercent\n            )\n        }\n\n        // Update player center image\n        binding.brightnessImageView.setImageDrawable(\n            AppCompatResources.getDrawable(\n                player.context,\n                when {\n                    currentProgressPercent < 0.25 -> R.drawable.ic_brightness_low\n                    currentProgressPercent < 0.75 -> R.drawable.ic_brightness_medium\n                    else -> R.drawable.ic_brightness_high\n                }\n            )\n        )\n\n        // Make sure the correct layout is visible\n        if (!binding.brightnessRelativeLayout.isVisible) {\n            binding.brightnessRelativeLayout.animate(true, 200, AnimationType.SCALE_AND_ALPHA)\n        }\n        binding.volumeRelativeLayout.isVisible = false\n    }\n\n    override fun onScrollEnd(event: MotionEvent) {\n        super.onScrollEnd(event)\n        if (binding.volumeRelativeLayout.isVisible) {\n            binding.volumeRelativeLayout.animate(false, 200, AnimationType.SCALE_AND_ALPHA, 200)\n        }\n        if (binding.brightnessRelativeLayout.isVisible) {\n            binding.brightnessRelativeLayout.animate(false, 200, AnimationType.SCALE_AND_ALPHA, 200)\n        }\n    }\n\n    override fun onScroll(\n        initialEvent: MotionEvent?,\n        movingEvent: MotionEvent,\n        distanceX: Float,\n        distanceY: Float\n    ): Boolean {\n        if (initialEvent == null || !playerUi.isFullscreen) {\n            return false\n        }\n\n        // Calculate heights of status and navigation bars\n        val statusBarHeight = getAndroidDimenPx(player.context, \"status_bar_height\")\n        val navigationBarHeight = getAndroidDimenPx(player.context, \"navigation_bar_height\")\n\n        // Do not handle this event if initially it started from status or navigation bars\n        val isTouchingStatusBar = initialEvent.y < statusBarHeight\n        val isTouchingNavigationBar = initialEvent.y > (binding.root.height - navigationBarHeight)\n        if (isTouchingStatusBar || isTouchingNavigationBar) {\n            return false\n        }\n\n        val insideThreshold = abs(movingEvent.y - initialEvent.y) <= MOVEMENT_THRESHOLD\n        if (\n            !isMoving && (insideThreshold || abs(distanceX) > abs(distanceY)) ||\n            player.currentState == Player.STATE_COMPLETED\n        ) {\n            return false\n        }\n\n        isMoving = true\n\n        // -- Brightness and Volume control --\n        if (getDisplayHalfPortion(initialEvent) == DisplayPortion.RIGHT_HALF) {\n            when (PlayerHelper.getActionForRightGestureSide(player.context)) {\n                player.context.getString(R.string.volume_control_key) ->\n                    onScrollVolume(distanceY)\n\n                player.context.getString(R.string.brightness_control_key) ->\n                    onScrollBrightness(distanceY)\n            }\n        } else {\n            when (PlayerHelper.getActionForLeftGestureSide(player.context)) {\n                player.context.getString(R.string.volume_control_key) ->\n                    onScrollVolume(distanceY)\n\n                player.context.getString(R.string.brightness_control_key) ->\n                    onScrollBrightness(distanceY)\n            }\n        }\n\n        return true\n    }\n\n    override fun getDisplayPortion(e: MotionEvent): DisplayPortion {\n        return when {\n            e.x < binding.root.width / 3.0 -> DisplayPortion.LEFT\n            e.x > binding.root.width * 2.0 / 3.0 -> DisplayPortion.RIGHT\n            else -> DisplayPortion.MIDDLE\n        }\n    }\n\n    override fun getDisplayHalfPortion(e: MotionEvent): DisplayPortion {\n        return when {\n            e.x < binding.root.width / 2.0 -> DisplayPortion.LEFT_HALF\n            else -> DisplayPortion.RIGHT_HALF\n        }\n    }\n\n    companion object {\n        private val TAG = MainPlayerGestureListener::class.java.simpleName\n        private val DEBUG = MainActivity.DEBUG\n        private const val MOVEMENT_THRESHOLD = 40\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt",
    "content": "package org.schabi.newpipe.player.gesture\n\nimport android.util.Log\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.ViewConfiguration\nimport androidx.core.view.isVisible\nimport kotlin.math.abs\nimport kotlin.math.hypot\nimport kotlin.math.max\nimport kotlin.math.min\nimport org.schabi.newpipe.MainActivity\nimport org.schabi.newpipe.ktx.AnimationType\nimport org.schabi.newpipe.ktx.animate\nimport org.schabi.newpipe.player.ui.PopupPlayerUi\n\nclass PopupPlayerGestureListener(\n    private val playerUi: PopupPlayerUi\n) : BasePlayerGestureListener(playerUi) {\n\n    private var isMoving = false\n\n    private var initialPopupX: Int = -1\n    private var initialPopupY: Int = -1\n    private var isResizing = false\n\n    // initial coordinates and distance between fingers\n    private var initPointerDistance = -1.0\n    private var initFirstPointerX = -1f\n    private var initFirstPointerY = -1f\n    private var initSecPointerX = -1f\n    private var initSecPointerY = -1f\n\n    override fun onTouch(v: View, event: MotionEvent): Boolean {\n        super.onTouch(v, event)\n        if (event.pointerCount == 2 && !isMoving && !isResizing) {\n            if (DEBUG) {\n                Log.d(TAG, \"onTouch() 2 finger pointer detected, enabling resizing.\")\n            }\n            onPopupResizingStart()\n\n            // record coordinates of fingers\n            initFirstPointerX = event.getX(0)\n            initFirstPointerY = event.getY(0)\n            initSecPointerX = event.getX(1)\n            initSecPointerY = event.getY(1)\n            // record distance between fingers\n            initPointerDistance = hypot(\n                initFirstPointerX - initSecPointerX.toDouble(),\n                initFirstPointerY - initSecPointerY.toDouble()\n            )\n\n            isResizing = true\n        }\n        if (event.action == MotionEvent.ACTION_MOVE && !isMoving && isResizing) {\n            if (DEBUG) {\n                Log.d(\n                    TAG,\n                    \"onTouch() ACTION_MOVE > v = [$v], e1.getRaw =\" +\n                        \"[${event.rawX}, ${event.rawY}]\"\n                )\n            }\n            return handleMultiDrag(event)\n        }\n        if (event.action == MotionEvent.ACTION_UP) {\n            if (DEBUG) {\n                Log.d(\n                    TAG,\n                    \"onTouch() ACTION_UP > v = [$v], e1.getRaw =\" +\n                        \" [${event.rawX}, ${event.rawY}]\"\n                )\n            }\n            if (isMoving) {\n                isMoving = false\n                onScrollEnd(event)\n            }\n            if (isResizing) {\n                isResizing = false\n\n                initPointerDistance = (-1).toDouble()\n                initFirstPointerX = (-1).toFloat()\n                initFirstPointerY = (-1).toFloat()\n                initSecPointerX = (-1).toFloat()\n                initSecPointerY = (-1).toFloat()\n\n                onPopupResizingEnd()\n                player.changeState(player.currentState)\n            }\n            if (!playerUi.isPopupClosing) {\n                playerUi.savePopupPositionAndSizeToPrefs()\n            }\n        }\n\n        v.performClick()\n        return true\n    }\n\n    override fun onScrollEnd(event: MotionEvent) {\n        super.onScrollEnd(event)\n        if (playerUi.isInsideClosingRadius(event)) {\n            playerUi.closePopup()\n        } else if (!playerUi.isPopupClosing) {\n            playerUi.closeOverlayBinding.closeButton.animate(false, 200)\n            binding.closingOverlay.animate(false, 200)\n        }\n    }\n\n    private fun handleMultiDrag(event: MotionEvent): Boolean {\n        if (initPointerDistance == -1.0 || event.pointerCount != 2) {\n            return false\n        }\n\n        // get the movements of the fingers\n        val firstPointerMove = hypot(\n            event.getX(0) - initFirstPointerX.toDouble(),\n            event.getY(0) - initFirstPointerY.toDouble()\n        )\n        val secPointerMove = hypot(\n            event.getX(1) - initSecPointerX.toDouble(),\n            event.getY(1) - initSecPointerY.toDouble()\n        )\n\n        // minimum threshold beyond which pinch gesture will work\n        val minimumMove = ViewConfiguration.get(player.context).scaledTouchSlop\n        if (max(firstPointerMove, secPointerMove) <= minimumMove) {\n            return false\n        }\n\n        // calculate current distance between the pointers\n        val currentPointerDistance = hypot(\n            event.getX(0) - event.getX(1).toDouble(),\n            event.getY(0) - event.getY(1).toDouble()\n        )\n\n        val popupWidth = playerUi.popupLayoutParams.width.toDouble()\n        // change co-ordinates of popup so the center stays at the same position\n        val newWidth = popupWidth * currentPointerDistance / initPointerDistance\n        initPointerDistance = currentPointerDistance\n        playerUi.popupLayoutParams.x += ((popupWidth - newWidth) / 2.0).toInt()\n\n        playerUi.checkPopupPositionBounds()\n        playerUi.updateScreenSize()\n        playerUi.changePopupSize(min(playerUi.screenWidth.toDouble(), newWidth).toInt())\n        return true\n    }\n\n    private fun onPopupResizingStart() {\n        if (DEBUG) {\n            Log.d(TAG, \"onPopupResizingStart called\")\n        }\n        binding.loadingPanel.visibility = View.GONE\n        playerUi.hideControls(0, 0)\n        binding.fastSeekOverlay.animate(false, 0)\n        binding.currentDisplaySeek.animate(false, 0, AnimationType.ALPHA, 0)\n    }\n\n    private fun onPopupResizingEnd() {\n        if (DEBUG) {\n            Log.d(TAG, \"onPopupResizingEnd called\")\n        }\n    }\n\n    override fun onLongPress(e: MotionEvent) {\n        playerUi.updateScreenSize()\n        playerUi.checkPopupPositionBounds()\n        playerUi.changePopupSize(playerUi.screenWidth)\n    }\n\n    override fun onFling(\n        e1: MotionEvent?,\n        e2: MotionEvent,\n        velocityX: Float,\n        velocityY: Float\n    ): Boolean {\n        return if (player.popupPlayerSelected()) {\n            val absVelocityX = abs(velocityX)\n            val absVelocityY = abs(velocityY)\n            if (absVelocityX.coerceAtLeast(absVelocityY) > TOSS_FLING_VELOCITY) {\n                if (absVelocityX > TOSS_FLING_VELOCITY) {\n                    playerUi.popupLayoutParams.x = velocityX.toInt()\n                }\n                if (absVelocityY > TOSS_FLING_VELOCITY) {\n                    playerUi.popupLayoutParams.y = velocityY.toInt()\n                }\n                playerUi.checkPopupPositionBounds()\n                playerUi.windowManager.updateViewLayout(binding.root, playerUi.popupLayoutParams)\n                return true\n            }\n            return false\n        } else {\n            true\n        }\n    }\n\n    override fun onDownNotDoubleTapping(e: MotionEvent): Boolean {\n        // Fix popup position when the user touch it, it may have the wrong one\n        // because the soft input is visible (the draggable area is currently resized).\n        playerUi.updateScreenSize()\n        playerUi.checkPopupPositionBounds()\n        playerUi.popupLayoutParams.let {\n            initialPopupX = it.x\n            initialPopupY = it.y\n        }\n        return true // we want `super.onDown(e)` to be called\n    }\n\n    override fun onSingleTapConfirmed(e: MotionEvent): Boolean {\n        if (DEBUG) {\n            Log.d(TAG, \"onSingleTapConfirmed() called with: e = [$e]\")\n        }\n\n        if (isDoubleTapping) {\n            return true\n        }\n        if (player.exoPlayerIsNull()) {\n            return false\n        }\n\n        onSingleTap()\n        return true\n    }\n\n    override fun onScroll(\n        initialEvent: MotionEvent?,\n        movingEvent: MotionEvent,\n        distanceX: Float,\n        distanceY: Float\n    ): Boolean {\n        if (initialEvent == null) {\n            return false\n        }\n\n        if (isResizing) {\n            return super.onScroll(initialEvent, movingEvent, distanceX, distanceY)\n        }\n\n        if (!isMoving) {\n            playerUi.closeOverlayBinding.closeButton.animate(true, 200)\n        }\n\n        isMoving = true\n\n        val diffX = (movingEvent.rawX - initialEvent.rawX)\n        val posX = (initialPopupX + diffX).coerceIn(\n            0f,\n            (playerUi.screenWidth - playerUi.popupLayoutParams.width).toFloat()\n                .coerceAtLeast(0f)\n        )\n        val diffY = (movingEvent.rawY - initialEvent.rawY)\n        val posY = (initialPopupY + diffY).coerceIn(\n            0f,\n            (playerUi.screenHeight - playerUi.popupLayoutParams.height).toFloat()\n                .coerceAtLeast(0f)\n        )\n\n        playerUi.popupLayoutParams.x = posX.toInt()\n        playerUi.popupLayoutParams.y = posY.toInt()\n\n        // -- Determine if the ClosingOverlayView (red X) has to be shown or hidden --\n        val showClosingOverlayView: Boolean = playerUi.isInsideClosingRadius(movingEvent)\n        // Check if an view is in expected state and if not animate it into the correct state\n        if (binding.closingOverlay.isVisible != showClosingOverlayView) {\n            binding.closingOverlay.animate(showClosingOverlayView, 200)\n        }\n\n        playerUi.windowManager.updateViewLayout(binding.root, playerUi.popupLayoutParams)\n        return true\n    }\n\n    override fun getDisplayPortion(e: MotionEvent): DisplayPortion {\n        return when {\n            e.x < playerUi.popupLayoutParams.width / 3.0 -> DisplayPortion.LEFT\n            e.x > playerUi.popupLayoutParams.width * 2.0 / 3.0 -> DisplayPortion.RIGHT\n            else -> DisplayPortion.MIDDLE\n        }\n    }\n\n    override fun getDisplayHalfPortion(e: MotionEvent): DisplayPortion {\n        return when {\n            e.x < playerUi.popupLayoutParams.width / 2.0 -> DisplayPortion.LEFT_HALF\n            else -> DisplayPortion.RIGHT_HALF\n        }\n    }\n\n    companion object {\n        private val TAG = PopupPlayerGestureListener::class.java.simpleName\n        private val DEBUG = MainActivity.DEBUG\n        private const val TOSS_FLING_VELOCITY = 2500\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.animation.ValueAnimator;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.media.AudioManager;\nimport android.media.audiofx.AudioEffect;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.core.content.ContextCompat;\nimport androidx.media.AudioFocusRequestCompat;\nimport androidx.media.AudioManagerCompat;\n\nimport com.google.android.exoplayer2.ExoPlayer;\nimport com.google.android.exoplayer2.analytics.AnalyticsListener;\n\npublic class AudioReactor implements AudioManager.OnAudioFocusChangeListener, AnalyticsListener {\n\n    private static final String TAG = \"AudioFocusReactor\";\n\n    private static final int DUCK_DURATION = 1500;\n    private static final float DUCK_AUDIO_TO = .2f;\n\n    private static final int FOCUS_GAIN_TYPE = AudioManagerCompat.AUDIOFOCUS_GAIN;\n    private static final int STREAM_TYPE = AudioManager.STREAM_MUSIC;\n\n    private final ExoPlayer player;\n    private final Context context;\n    private final AudioManager audioManager;\n\n    private final AudioFocusRequestCompat request;\n\n    public AudioReactor(@NonNull final Context context,\n                        @NonNull final ExoPlayer player) {\n        this.player = player;\n        this.context = context;\n        this.audioManager = ContextCompat.getSystemService(context, AudioManager.class);\n        player.addAnalyticsListener(this);\n\n        request = new AudioFocusRequestCompat.Builder(FOCUS_GAIN_TYPE)\n                //.setAcceptsDelayedFocusGain(true)\n                .setWillPauseWhenDucked(true)\n                .setOnAudioFocusChangeListener(this)\n                .build();\n    }\n\n    public void dispose() {\n        abandonAudioFocus();\n        player.removeAnalyticsListener(this);\n        notifyAudioSessionUpdate(false, player.getAudioSessionId());\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Audio Manager\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public void requestAudioFocus() {\n        AudioManagerCompat.requestAudioFocus(audioManager, request);\n    }\n\n    public void abandonAudioFocus() {\n        AudioManagerCompat.abandonAudioFocusRequest(audioManager, request);\n    }\n\n    public int getVolume() {\n        return audioManager.getStreamVolume(STREAM_TYPE);\n    }\n\n    public void setVolume(final int volume) {\n        audioManager.setStreamVolume(STREAM_TYPE, volume, 0);\n    }\n\n    public int getMaxVolume() {\n        return AudioManagerCompat.getStreamMaxVolume(audioManager, STREAM_TYPE);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // AudioFocus\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onAudioFocusChange(final int focusChange) {\n        Log.d(TAG, \"onAudioFocusChange() called with: focusChange = [\" + focusChange + \"]\");\n        switch (focusChange) {\n            case AudioManager.AUDIOFOCUS_GAIN:\n                onAudioFocusGain();\n                break;\n            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:\n                onAudioFocusLossCanDuck();\n                break;\n            case AudioManager.AUDIOFOCUS_LOSS:\n            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:\n                onAudioFocusLoss();\n                break;\n        }\n    }\n\n    private void onAudioFocusGain() {\n        Log.d(TAG, \"onAudioFocusGain() called\");\n        player.setVolume(DUCK_AUDIO_TO);\n        animateAudio(DUCK_AUDIO_TO, 1.0f);\n\n        if (PlayerHelper.isResumeAfterAudioFocusGain(context)) {\n            player.play();\n        }\n    }\n\n    private void onAudioFocusLoss() {\n        Log.d(TAG, \"onAudioFocusLoss() called\");\n        player.pause();\n    }\n\n    private void onAudioFocusLossCanDuck() {\n        Log.d(TAG, \"onAudioFocusLossCanDuck() called\");\n        // Set the volume to 1/10 on ducking\n        player.setVolume(DUCK_AUDIO_TO);\n    }\n\n    private void animateAudio(final float from, final float to) {\n        final ValueAnimator valueAnimator = new ValueAnimator();\n        valueAnimator.setFloatValues(from, to);\n        valueAnimator.setDuration(AudioReactor.DUCK_DURATION);\n        valueAnimator.addListener(new AnimatorListenerAdapter() {\n            @Override\n            public void onAnimationStart(final Animator animation) {\n                player.setVolume(from);\n            }\n\n            @Override\n            public void onAnimationCancel(final Animator animation) {\n                player.setVolume(to);\n            }\n\n            @Override\n            public void onAnimationEnd(final Animator animation) {\n                player.setVolume(to);\n            }\n        });\n        valueAnimator.addUpdateListener(animation ->\n                player.setVolume(((float) animation.getAnimatedValue())));\n        valueAnimator.start();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Audio Processing\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onAudioSessionIdChanged(@NonNull final EventTime eventTime,\n                                        final int audioSessionId) {\n        notifyAudioSessionUpdate(true, audioSessionId);\n    }\n    private void notifyAudioSessionUpdate(final boolean active, final int audioSessionId) {\n        final Intent intent = new Intent(active\n                ? AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION\n                : AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION);\n        intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSessionId);\n        intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.getPackageName());\n        context.sendBroadcast(intent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/CacheFactory.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\n\nimport com.google.android.exoplayer2.upstream.DataSource;\nimport com.google.android.exoplayer2.upstream.DefaultDataSource;\nimport com.google.android.exoplayer2.upstream.FileDataSource;\nimport com.google.android.exoplayer2.upstream.TransferListener;\nimport com.google.android.exoplayer2.upstream.cache.CacheDataSink;\nimport com.google.android.exoplayer2.upstream.cache.CacheDataSource;\nimport com.google.android.exoplayer2.upstream.cache.SimpleCache;\n\nfinal class CacheFactory implements DataSource.Factory {\n    private static final int CACHE_FLAGS = CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR;\n\n    private final Context context;\n    private final TransferListener transferListener;\n    private final DataSource.Factory upstreamDataSourceFactory;\n    private final SimpleCache cache;\n\n    CacheFactory(final Context context,\n                 final TransferListener transferListener,\n                 final SimpleCache cache,\n                 final DataSource.Factory upstreamDataSourceFactory) {\n        this.context = context;\n        this.transferListener = transferListener;\n        this.cache = cache;\n        this.upstreamDataSourceFactory = upstreamDataSourceFactory;\n    }\n\n    @NonNull\n    @Override\n    public DataSource createDataSource() {\n        final DefaultDataSource dataSource = new DefaultDataSource.Factory(context,\n                upstreamDataSourceFactory)\n                .setTransferListener(transferListener)\n                .createDataSource();\n\n        final FileDataSource fileSource = new FileDataSource();\n        final CacheDataSink dataSink =\n                new CacheDataSink(cache, PlayerHelper.getPreferredFileSize());\n        return new CacheDataSource(cache, dataSource, fileSource, dataSink, CACHE_FLAGS, null);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/CustomMediaCodecVideoRenderer.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport android.content.Context;\nimport android.os.Handler;\n\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.mediacodec.MediaCodecAdapter;\nimport com.google.android.exoplayer2.mediacodec.MediaCodecSelector;\nimport com.google.android.exoplayer2.video.MediaCodecVideoRenderer;\nimport com.google.android.exoplayer2.video.VideoRendererEventListener;\n\n/**\n * A {@link MediaCodecVideoRenderer} which always enable the output surface workaround that\n * ExoPlayer enables on several devices which are known to implement\n * {@link android.media.MediaCodec#setOutputSurface(android.view.Surface)\n * MediaCodec.setOutputSurface(Surface)} incorrectly.\n *\n * <p>\n * See {@link MediaCodecVideoRenderer#codecNeedsSetOutputSurfaceWorkaround(String)} for more\n * details.\n * </p>\n *\n * <p>\n * This custom {@link MediaCodecVideoRenderer} may be useful in the case a device is affected by\n * this issue but is not present in ExoPlayer's list.\n * </p>\n *\n * <p>\n * This class has only effect on devices with Android 6 and higher, as the {@code setOutputSurface}\n * method is only implemented in these Android versions and the method used as a workaround is\n * always applied on older Android versions (releasing and re-instantiating video codec instances).\n * </p>\n */\npublic final class CustomMediaCodecVideoRenderer extends MediaCodecVideoRenderer {\n\n    @SuppressWarnings({\"checkstyle:ParameterNumber\", \"squid:S107\"})\n    public CustomMediaCodecVideoRenderer(final Context context,\n                                         final MediaCodecAdapter.Factory codecAdapterFactory,\n                                         final MediaCodecSelector mediaCodecSelector,\n                                         final long allowedJoiningTimeMs,\n                                         final boolean enableDecoderFallback,\n                                         @Nullable final Handler eventHandler,\n                                         @Nullable final VideoRendererEventListener eventListener,\n                                         final int maxDroppedFramesToNotify) {\n        super(context, codecAdapterFactory, mediaCodecSelector, allowedJoiningTimeMs,\n                enableDecoderFallback, eventHandler, eventListener, maxDroppedFramesToNotify);\n    }\n\n    @Override\n    protected boolean codecNeedsSetOutputSurfaceWorkaround(final String name) {\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/CustomRenderersFactory.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport android.content.Context;\nimport android.os.Handler;\n\nimport com.google.android.exoplayer2.DefaultRenderersFactory;\nimport com.google.android.exoplayer2.Renderer;\nimport com.google.android.exoplayer2.mediacodec.MediaCodecSelector;\nimport com.google.android.exoplayer2.video.VideoRendererEventListener;\n\nimport java.util.ArrayList;\n\n/**\n * A {@link DefaultRenderersFactory} which only uses {@link CustomMediaCodecVideoRenderer} as an\n * implementation of video codec renders.\n *\n * <p>\n * As no ExoPlayer extension is currently used, the reflection code used by ExoPlayer to try to\n * load video extension libraries is not needed in our case and has been removed. This should be\n * changed in the case an extension is shipped with the app, such as the AV1 one.\n * </p>\n */\npublic final class CustomRenderersFactory extends DefaultRenderersFactory {\n\n    public CustomRenderersFactory(final Context context) {\n        super(context);\n    }\n\n    @SuppressWarnings(\"checkstyle:ParameterNumber\")\n    @Override\n    protected void buildVideoRenderers(final Context context,\n                                       @ExtensionRendererMode final int extensionRendererMode,\n                                       final MediaCodecSelector mediaCodecSelector,\n                                       final boolean enableDecoderFallback,\n                                       final Handler eventHandler,\n                                       final VideoRendererEventListener eventListener,\n                                       final long allowedVideoJoiningTimeMs,\n                                       final ArrayList<Renderer> out) {\n        out.add(new CustomMediaCodecVideoRenderer(context, getCodecAdapterFactory(),\n                mediaCodecSelector, allowedVideoJoiningTimeMs, enableDecoderFallback, eventHandler,\n                eventListener, MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport com.google.android.exoplayer2.DefaultLoadControl;\n\npublic class LoadController extends DefaultLoadControl {\n\n    public static final String TAG = \"LoadController\";\n    private boolean preloadingEnabled = true;\n\n    @Override\n    public void onPrepared() {\n        preloadingEnabled = true;\n        super.onPrepared();\n    }\n\n    @Override\n    public void onStopped() {\n        preloadingEnabled = true;\n        super.onStopped();\n    }\n\n    @Override\n    public void onReleased() {\n        preloadingEnabled = true;\n        super.onReleased();\n    }\n\n    @Override\n    public boolean shouldContinueLoading(final long playbackPositionUs,\n                                         final long bufferedDurationUs,\n                                         final float playbackSpeed) {\n        if (!preloadingEnabled) {\n            return false;\n        }\n        return super.shouldContinueLoading(\n                playbackPositionUs, bufferedDurationUs, playbackSpeed);\n    }\n\n    public void disablePreloadingOfCurrentTrack() {\n        preloadingEnabled = false;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/LockManager.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport android.content.Context;\nimport android.net.wifi.WifiManager;\nimport android.os.PowerManager;\nimport android.util.Log;\n\nimport androidx.core.content.ContextCompat;\n\npublic class LockManager {\n    private final String TAG = \"LockManager@\" + hashCode();\n\n    private final PowerManager powerManager;\n    private final WifiManager wifiManager;\n\n    private PowerManager.WakeLock wakeLock;\n    private WifiManager.WifiLock wifiLock;\n\n    public LockManager(final Context context) {\n        powerManager = ContextCompat.getSystemService(context.getApplicationContext(),\n                PowerManager.class);\n        wifiManager = ContextCompat.getSystemService(context, WifiManager.class);\n    }\n\n    public void acquireWifiAndCpu() {\n        Log.d(TAG, \"acquireWifiAndCpu() called\");\n        if (wakeLock != null && wakeLock.isHeld() && wifiLock != null && wifiLock.isHeld()) {\n            return;\n        }\n\n        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);\n        wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL, TAG);\n\n        if (wakeLock != null) {\n            wakeLock.acquire();\n        }\n        if (wifiLock != null) {\n            wifiLock.acquire();\n        }\n    }\n\n    public void releaseWifiAndCpu() {\n        Log.d(TAG, \"releaseWifiAndCpu() called\");\n        if (wakeLock != null && wakeLock.isHeld()) {\n            wakeLock.release();\n        }\n        if (wifiLock != null && wifiLock.isHeld()) {\n            wifiLock.release();\n        }\n\n        wakeLock = null;\n        wifiLock = null;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport static org.schabi.newpipe.ktx.ViewUtils.animateRotation;\nimport static org.schabi.newpipe.player.Player.DEBUG;\nimport static org.schabi.newpipe.util.ThemeHelper.resolveDrawable;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.LayerDrawable;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.CheckBox;\nimport android.widget.SeekBar;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.core.math.MathUtils;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.preference.PreferenceManager;\n\nimport com.evernote.android.state.State;\nimport com.livefront.bridge.Bridge;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.DialogPlaybackParameterBinding;\nimport org.schabi.newpipe.player.ui.VideoPlayerUi;\nimport org.schabi.newpipe.util.SimpleOnSeekBarChangeListener;\nimport org.schabi.newpipe.util.SliderStrategy;\n\nimport java.util.Map;\nimport java.util.Objects;\nimport java.util.function.Consumer;\nimport java.util.function.DoubleConsumer;\nimport java.util.function.DoubleFunction;\nimport java.util.function.DoubleSupplier;\n\npublic class PlaybackParameterDialog extends DialogFragment {\n    private static final String TAG = \"PlaybackParameterDialog\";\n\n    // Minimum allowable range in ExoPlayer\n    private static final double MIN_PITCH_OR_SPEED = 0.10f;\n    private static final double MAX_PITCH_OR_SPEED = 3.00f;\n\n    private static final boolean PITCH_CTRL_MODE_PERCENT = false;\n    private static final boolean PITCH_CTRL_MODE_SEMITONE = true;\n\n    private static final double STEP_1_PERCENT_VALUE = 0.01f;\n    private static final double STEP_5_PERCENT_VALUE = 0.05f;\n    private static final double STEP_10_PERCENT_VALUE = 0.10f;\n    private static final double STEP_25_PERCENT_VALUE = 0.25f;\n    private static final double STEP_100_PERCENT_VALUE = 1.00f;\n\n    private static final double DEFAULT_TEMPO = 1.00f;\n    private static final double DEFAULT_PITCH_PERCENT = 1.00f;\n    private static final double DEFAULT_STEP = STEP_25_PERCENT_VALUE;\n    private static final boolean DEFAULT_SKIP_SILENCE = false;\n\n    private static final SliderStrategy QUADRATIC_STRATEGY = new SliderStrategy.Quadratic(\n            MIN_PITCH_OR_SPEED,\n            MAX_PITCH_OR_SPEED,\n            1.00f,\n            10_000);\n\n    private static final SliderStrategy SEMITONE_STRATEGY = new SliderStrategy() {\n        @Override\n        public int progressOf(final double value) {\n            return PlayerSemitoneHelper.percentToSemitones(value) + 12;\n        }\n\n        @Override\n        public double valueOf(final int progress) {\n            return PlayerSemitoneHelper.semitonesToPercent(progress - 12);\n        }\n    };\n\n    @Nullable\n    private Callback callback;\n\n    @State\n    double initialTempo = DEFAULT_TEMPO;\n    @State\n    double initialPitchPercent = DEFAULT_PITCH_PERCENT;\n    @State\n    boolean initialSkipSilence = DEFAULT_SKIP_SILENCE;\n\n    @State\n    double tempo = DEFAULT_TEMPO;\n    @State\n    double pitchPercent = DEFAULT_PITCH_PERCENT;\n    @State\n    boolean skipSilence = DEFAULT_SKIP_SILENCE;\n\n    private DialogPlaybackParameterBinding binding;\n\n    public static PlaybackParameterDialog newInstance(\n            final double playbackTempo,\n            final double playbackPitch,\n            final boolean playbackSkipSilence,\n            final Callback callback\n    ) {\n        final PlaybackParameterDialog dialog = new PlaybackParameterDialog();\n        dialog.callback = callback;\n\n        dialog.initialTempo = playbackTempo;\n        dialog.initialPitchPercent = playbackPitch;\n        dialog.initialSkipSilence = playbackSkipSilence;\n\n        dialog.tempo = dialog.initialTempo;\n        dialog.pitchPercent = dialog.initialPitchPercent;\n        dialog.skipSilence = dialog.initialSkipSilence;\n\n        return dialog;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Lifecycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onAttach(@NonNull final Context context) {\n        super.onAttach(context);\n        if (context instanceof Callback) {\n            callback = (Callback) context;\n        } else if (callback == null) {\n            dismiss();\n        }\n    }\n\n    @Override\n    public void onSaveInstanceState(@NonNull final Bundle outState) {\n        super.onSaveInstanceState(outState);\n        Bridge.saveInstanceState(this, outState);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Dialog\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(@Nullable final Bundle savedInstanceState) {\n        Bridge.restoreInstanceState(this, savedInstanceState);\n\n        binding = DialogPlaybackParameterBinding.inflate(getLayoutInflater());\n        initUI();\n\n        final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(requireActivity())\n                .setView(binding.getRoot())\n                .setCancelable(true)\n                .setNegativeButton(R.string.cancel, (dialogInterface, i) -> {\n                    setAndUpdateTempo(initialTempo);\n                    setAndUpdatePitch(initialPitchPercent);\n                    setAndUpdateSkipSilence(initialSkipSilence);\n                    updateCallback();\n                })\n                .setNeutralButton(R.string.playback_reset, (dialogInterface, i) -> {\n                    setAndUpdateTempo(DEFAULT_TEMPO);\n                    setAndUpdatePitch(DEFAULT_PITCH_PERCENT);\n                    setAndUpdateSkipSilence(DEFAULT_SKIP_SILENCE);\n                    updateCallback();\n                })\n                .setPositiveButton(R.string.ok, (dialogInterface, i) -> updateCallback());\n\n        return dialogBuilder.create();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // UI Initialization and Control\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void initUI() {\n        // Tempo\n        setText(binding.tempoMinimumText, PlayerHelper::formatSpeed, MIN_PITCH_OR_SPEED);\n        setText(binding.tempoMaximumText, PlayerHelper::formatSpeed, MAX_PITCH_OR_SPEED);\n\n        binding.tempoSeekbar.setMax(QUADRATIC_STRATEGY.progressOf(MAX_PITCH_OR_SPEED));\n        setAndUpdateTempo(tempo);\n        binding.tempoSeekbar.setOnSeekBarChangeListener(\n                getTempoOrPitchSeekbarChangeListener(\n                        QUADRATIC_STRATEGY,\n                        this::onTempoSliderUpdated));\n\n        registerOnStepClickListener(\n                binding.tempoStepDown,\n                () -> tempo,\n                -1,\n                this::onTempoSliderUpdated);\n        registerOnStepClickListener(\n                binding.tempoStepUp,\n                () -> tempo,\n                1,\n                this::onTempoSliderUpdated);\n\n        // Pitch\n        binding.pitchToogleControlModes.setOnClickListener(v -> {\n            final boolean isCurrentlyVisible =\n                    binding.pitchControlModeTabs.getVisibility() == View.GONE;\n            binding.pitchControlModeTabs.setVisibility(isCurrentlyVisible\n                    ? View.VISIBLE\n                    : View.GONE);\n            animateRotation(binding.pitchToogleControlModes,\n                    VideoPlayerUi.DEFAULT_CONTROLS_DURATION,\n                    isCurrentlyVisible ? 180 : 0);\n        });\n\n        getPitchControlModeComponentMappings()\n                .forEach(this::setupPitchControlModeTextView);\n        // Initialization is done at the end\n\n        // Pitch - Percent\n        setText(binding.pitchPercentMinimumText, PlayerHelper::formatPitch, MIN_PITCH_OR_SPEED);\n        setText(binding.pitchPercentMaximumText, PlayerHelper::formatPitch, MAX_PITCH_OR_SPEED);\n\n        binding.pitchPercentSeekbar.setMax(QUADRATIC_STRATEGY.progressOf(MAX_PITCH_OR_SPEED));\n        setAndUpdatePitch(pitchPercent);\n        binding.pitchPercentSeekbar.setOnSeekBarChangeListener(\n                getTempoOrPitchSeekbarChangeListener(\n                        QUADRATIC_STRATEGY,\n                        this::onPitchPercentSliderUpdated));\n\n        registerOnStepClickListener(\n                binding.pitchPercentStepDown,\n                () -> pitchPercent,\n                -1,\n                this::onPitchPercentSliderUpdated);\n        registerOnStepClickListener(\n                binding.pitchPercentStepUp,\n                () -> pitchPercent,\n                1,\n                this::onPitchPercentSliderUpdated);\n\n        // Pitch - Semitone\n        binding.pitchSemitoneSeekbar.setOnSeekBarChangeListener(\n                getTempoOrPitchSeekbarChangeListener(\n                        SEMITONE_STRATEGY,\n                        this::onPitchPercentSliderUpdated));\n\n        registerOnSemitoneStepClickListener(\n                binding.pitchSemitoneStepDown,\n                -1,\n                this::onPitchPercentSliderUpdated);\n        registerOnSemitoneStepClickListener(\n                binding.pitchSemitoneStepUp,\n                1,\n                this::onPitchPercentSliderUpdated);\n\n        // Steps\n        getStepSizeComponentMappings()\n                .forEach(this::setupStepTextView);\n        // Initialize UI\n        setStepSizeToUI(getCurrentStepSize());\n\n        // Bottom controls\n        bindCheckboxWithBoolPref(\n                binding.unhookCheckbox,\n                R.string.playback_unhook_key,\n                true,\n                isChecked -> {\n                    if (!isChecked) {\n                        // when unchecked, slide back to the minimum of current tempo or pitch\n                        ensureHookIsValidAndUpdateCallBack();\n                    }\n                });\n\n        setAndUpdateSkipSilence(skipSilence);\n        binding.skipSilenceCheckbox.setOnCheckedChangeListener((compoundButton, isChecked) -> {\n            skipSilence = isChecked;\n            updateCallback();\n        });\n\n        // PitchControlMode has to be initialized at the end because it requires the unhookCheckbox\n        changePitchControlMode(isCurrentPitchControlModeSemitone());\n    }\n\n    // -- General formatting --\n\n    private void setText(\n            final TextView textView,\n            final DoubleFunction<String> formatter,\n            final double value\n    ) {\n        Objects.requireNonNull(textView).setText(formatter.apply(value));\n    }\n\n    // -- Steps --\n\n    private void registerOnStepClickListener(\n            final TextView stepTextView,\n            final DoubleSupplier currentValueSupplier,\n            final double direction, // -1 for step down, +1 for step up\n            final DoubleConsumer newValueConsumer\n    ) {\n        stepTextView.setOnClickListener(view -> {\n            newValueConsumer.accept(\n                    currentValueSupplier.getAsDouble() + 1 * getCurrentStepSize() * direction);\n            updateCallback();\n        });\n    }\n\n    private void registerOnSemitoneStepClickListener(\n            final TextView stepTextView,\n            final int direction, // -1 for step down, +1 for step up\n            final DoubleConsumer newValueConsumer\n    ) {\n        stepTextView.setOnClickListener(view -> {\n            newValueConsumer.accept(PlayerSemitoneHelper.semitonesToPercent(\n                    PlayerSemitoneHelper.percentToSemitones(this.pitchPercent) + direction));\n            updateCallback();\n        });\n    }\n\n    // -- Pitch --\n\n    private void setupPitchControlModeTextView(\n            final boolean semitones,\n            final TextView textView\n    ) {\n        textView.setOnClickListener(view -> {\n            PreferenceManager.getDefaultSharedPreferences(requireContext())\n                    .edit()\n                    .putBoolean(getString(R.string.playback_adjust_by_semitones_key), semitones)\n                    .apply();\n\n            changePitchControlMode(semitones);\n        });\n    }\n\n    private Map<Boolean, TextView> getPitchControlModeComponentMappings() {\n        return Map.of(PITCH_CTRL_MODE_PERCENT, binding.pitchControlModePercent,\n                PITCH_CTRL_MODE_SEMITONE, binding.pitchControlModeSemitone);\n    }\n\n    private void changePitchControlMode(final boolean semitones) {\n        // Bring all textviews into a normal state\n        final Map<Boolean, TextView> pitchCtrlModeComponentMapping =\n                getPitchControlModeComponentMappings();\n        pitchCtrlModeComponentMapping.forEach((v, textView) -> textView.setBackground(\n                resolveDrawable(requireContext(), android.R.attr.selectableItemBackground)));\n\n        // Mark the selected textview\n        final TextView textView = pitchCtrlModeComponentMapping.get(semitones);\n        if (textView != null) {\n            textView.setBackground(new LayerDrawable(new Drawable[]{\n                    resolveDrawable(requireContext(), R.attr.dashed_border),\n                    resolveDrawable(requireContext(), android.R.attr.selectableItemBackground)\n            }));\n        }\n\n        // Show or hide component\n        binding.pitchPercentControl.setVisibility(semitones ? View.GONE : View.VISIBLE);\n        binding.pitchSemitoneControl.setVisibility(semitones ? View.VISIBLE : View.GONE);\n\n        if (semitones) {\n            // Recalculate pitch percent when changing to semitone\n            // (as it could be an invalid semitone value)\n            final double newPitchPercent = calcValidPitch(pitchPercent);\n\n            // If the values differ set the new pitch\n            if (this.pitchPercent != newPitchPercent) {\n                if (DEBUG) {\n                    Log.d(TAG, \"Bringing pitchPercent to correct corresponding semitone: \"\n                            + \"currentPitchPercent = \" + pitchPercent + \", \"\n                            + \"newPitchPercent = \" + newPitchPercent\n                    );\n                }\n                this.onPitchPercentSliderUpdated(newPitchPercent);\n                updateCallback();\n            }\n        } else if (!binding.unhookCheckbox.isChecked()) {\n            // When changing to percent it's possible that tempo is != pitch\n            ensureHookIsValidAndUpdateCallBack();\n        }\n    }\n\n    private boolean isCurrentPitchControlModeSemitone() {\n        return PreferenceManager.getDefaultSharedPreferences(requireContext())\n                .getBoolean(\n                        getString(R.string.playback_adjust_by_semitones_key),\n                        PITCH_CTRL_MODE_PERCENT);\n    }\n\n    // -- Steps (Set) --\n\n    private void setupStepTextView(\n            final double stepSizeValue,\n            final TextView textView\n    ) {\n        setText(textView, PlaybackParameterDialog::getPercentString, stepSizeValue);\n        textView.setOnClickListener(view -> {\n            PreferenceManager.getDefaultSharedPreferences(requireContext())\n                    .edit()\n                    .putFloat(getString(R.string.adjustment_step_key), (float) stepSizeValue)\n                    .apply();\n\n            setStepSizeToUI(stepSizeValue);\n        });\n    }\n\n    private Map<Double, TextView> getStepSizeComponentMappings() {\n        return Map.of(STEP_1_PERCENT_VALUE, binding.stepSizeOnePercent,\n                STEP_5_PERCENT_VALUE, binding.stepSizeFivePercent,\n                STEP_10_PERCENT_VALUE, binding.stepSizeTenPercent,\n                STEP_25_PERCENT_VALUE, binding.stepSizeTwentyFivePercent,\n                STEP_100_PERCENT_VALUE, binding.stepSizeOneHundredPercent);\n    }\n\n    private void setStepSizeToUI(final double newStepSize) {\n        // Bring all textviews into a normal state\n        final Map<Double, TextView> stepSiteComponentMapping = getStepSizeComponentMappings();\n        stepSiteComponentMapping.forEach((v, textView) -> textView.setBackground(\n                resolveDrawable(requireContext(), android.R.attr.selectableItemBackground)));\n\n        // Mark the selected textview\n        final TextView textView = stepSiteComponentMapping.get(newStepSize);\n        if (textView != null) {\n            textView.setBackground(new LayerDrawable(new Drawable[]{\n                    resolveDrawable(requireContext(), R.attr.dashed_border),\n                    resolveDrawable(requireContext(), android.R.attr.selectableItemBackground)\n            }));\n        }\n\n        // Bind to the corresponding control components\n        binding.tempoStepUp.setText(getStepUpPercentString(newStepSize));\n        binding.tempoStepDown.setText(getStepDownPercentString(newStepSize));\n\n        binding.pitchPercentStepUp.setText(getStepUpPercentString(newStepSize));\n        binding.pitchPercentStepDown.setText(getStepDownPercentString(newStepSize));\n    }\n\n    private double getCurrentStepSize() {\n        return PreferenceManager.getDefaultSharedPreferences(requireContext())\n                .getFloat(getString(R.string.adjustment_step_key), (float) DEFAULT_STEP);\n    }\n\n    // -- Additional options --\n\n    private void setAndUpdateSkipSilence(final boolean newSkipSilence) {\n        this.skipSilence = newSkipSilence;\n        binding.skipSilenceCheckbox.setChecked(newSkipSilence);\n    }\n\n    @SuppressWarnings(\"SameParameterValue\") // this method was written to be reusable\n    private void bindCheckboxWithBoolPref(\n            @NonNull final CheckBox checkBox,\n            @StringRes final int resId,\n            final boolean defaultValue,\n            @NonNull final Consumer<Boolean> onInitialValueOrValueChange\n    ) {\n        final boolean prefValue = PreferenceManager\n                .getDefaultSharedPreferences(requireContext())\n                .getBoolean(getString(resId), defaultValue);\n\n        checkBox.setChecked(prefValue);\n\n        onInitialValueOrValueChange.accept(prefValue);\n\n        checkBox.setOnCheckedChangeListener((compoundButton, isChecked) -> {\n            // save whether pitch and tempo are unhooked or not\n            PreferenceManager.getDefaultSharedPreferences(requireContext())\n                    .edit()\n                    .putBoolean(getString(resId), isChecked)\n                    .apply();\n\n            onInitialValueOrValueChange.accept(isChecked);\n        });\n    }\n\n    /**\n     * Ensures that the slider hook is valid and if not sets and updates the sliders accordingly.\n     * <br/>\n     * You have to ensure by yourself that the hooking is active.\n     */\n    private void ensureHookIsValidAndUpdateCallBack() {\n        if (tempo != pitchPercent) {\n            setSliders(Math.min(tempo, pitchPercent));\n            updateCallback();\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Sliders\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private SeekBar.OnSeekBarChangeListener getTempoOrPitchSeekbarChangeListener(\n            final SliderStrategy sliderStrategy,\n            final DoubleConsumer newValueConsumer\n    ) {\n        return new SimpleOnSeekBarChangeListener() {\n            @Override\n            public void onProgressChanged(@NonNull final SeekBar seekBar,\n                                          final int progress,\n                                          final boolean fromUser) {\n                if (fromUser) { // ensure that the user triggered the change\n                    newValueConsumer.accept(sliderStrategy.valueOf(progress));\n                    updateCallback();\n                }\n            }\n        };\n    }\n\n    private void onTempoSliderUpdated(final double newTempo) {\n        if (!binding.unhookCheckbox.isChecked()) {\n            setSliders(newTempo);\n        } else {\n            setAndUpdateTempo(newTempo);\n        }\n    }\n\n    private void onPitchPercentSliderUpdated(final double newPitch) {\n        if (!binding.unhookCheckbox.isChecked()) {\n            setSliders(newPitch);\n        } else {\n            setAndUpdatePitch(newPitch);\n        }\n    }\n\n    private void setSliders(final double newValue) {\n        setAndUpdateTempo(newValue);\n        setAndUpdatePitch(newValue);\n    }\n\n    private void setAndUpdateTempo(final double newTempo) {\n        this.tempo = MathUtils.clamp(newTempo, MIN_PITCH_OR_SPEED, MAX_PITCH_OR_SPEED);\n\n        binding.tempoSeekbar.setProgress(QUADRATIC_STRATEGY.progressOf(tempo));\n        setText(binding.tempoCurrentText, PlayerHelper::formatSpeed, tempo);\n    }\n\n    private void setAndUpdatePitch(final double newPitch) {\n        this.pitchPercent = calcValidPitch(newPitch);\n\n        binding.pitchPercentSeekbar.setProgress(QUADRATIC_STRATEGY.progressOf(pitchPercent));\n        binding.pitchSemitoneSeekbar.setProgress(SEMITONE_STRATEGY.progressOf(pitchPercent));\n        setText(binding.pitchPercentCurrentText,\n                PlayerHelper::formatPitch,\n                pitchPercent);\n        setText(binding.pitchSemitoneCurrentText,\n                PlayerSemitoneHelper::formatPitchSemitones,\n                pitchPercent);\n    }\n\n    private double calcValidPitch(final double newPitch) {\n        final double calcPitch = MathUtils.clamp(newPitch, MIN_PITCH_OR_SPEED, MAX_PITCH_OR_SPEED);\n\n        if (!isCurrentPitchControlModeSemitone()) {\n            return calcPitch;\n        }\n\n        return PlayerSemitoneHelper.semitonesToPercent(\n                PlayerSemitoneHelper.percentToSemitones(calcPitch));\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Helper\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void updateCallback() {\n        if (callback == null) {\n            return;\n        }\n        if (DEBUG) {\n            Log.d(TAG, \"Updating callback: \"\n                    + \"tempo = \" + tempo + \", \"\n                    + \"pitchPercent = \" + pitchPercent + \", \"\n                    + \"skipSilence = \" + skipSilence\n            );\n        }\n        callback.onPlaybackParameterChanged((float) tempo, (float) pitchPercent, skipSilence);\n    }\n\n    @NonNull\n    private static String getStepUpPercentString(final double percent) {\n        return '+' + getPercentString(percent);\n    }\n\n    @NonNull\n    private static String getStepDownPercentString(final double percent) {\n        return '-' + getPercentString(percent);\n    }\n\n    @NonNull\n    private static String getPercentString(final double percent) {\n        return PlayerHelper.formatPitch(percent);\n    }\n\n    public interface Callback {\n        void onPlaybackParameterChanged(float playbackTempo, float playbackPitch,\n                                        boolean playbackSkipSilence);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/PlayerDataSource.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport static org.schabi.newpipe.MainActivity.DEBUG;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.database.StandaloneDatabaseProvider;\nimport com.google.android.exoplayer2.source.ProgressiveMediaSource;\nimport com.google.android.exoplayer2.source.SingleSampleMediaSource;\nimport com.google.android.exoplayer2.source.dash.DashMediaSource;\nimport com.google.android.exoplayer2.source.dash.DefaultDashChunkSource;\nimport com.google.android.exoplayer2.source.hls.HlsMediaSource;\nimport com.google.android.exoplayer2.source.hls.playlist.DefaultHlsPlaylistTracker;\nimport com.google.android.exoplayer2.source.smoothstreaming.DefaultSsChunkSource;\nimport com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource;\nimport com.google.android.exoplayer2.upstream.DataSource;\nimport com.google.android.exoplayer2.upstream.DefaultDataSource;\nimport com.google.android.exoplayer2.upstream.DefaultHttpDataSource;\nimport com.google.android.exoplayer2.upstream.TransferListener;\nimport com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor;\nimport com.google.android.exoplayer2.upstream.cache.SimpleCache;\n\nimport org.schabi.newpipe.DownloaderImpl;\nimport org.schabi.newpipe.extractor.services.youtube.dashmanifestcreators.YoutubeOtfDashManifestCreator;\nimport org.schabi.newpipe.extractor.services.youtube.dashmanifestcreators.YoutubePostLiveStreamDvrDashManifestCreator;\nimport org.schabi.newpipe.extractor.services.youtube.dashmanifestcreators.YoutubeProgressiveDashManifestCreator;\nimport org.schabi.newpipe.player.datasource.NonUriHlsDataSourceFactory;\nimport org.schabi.newpipe.player.datasource.YoutubeHttpDataSource;\n\nimport java.io.File;\n\npublic class PlayerDataSource {\n    public static final String TAG = PlayerDataSource.class.getSimpleName();\n\n    public static final int LIVE_STREAM_EDGE_GAP_MILLIS = 10000;\n\n    /**\n     * An approximately 4.3 times greater value than the\n     * {@link DefaultHlsPlaylistTracker#DEFAULT_PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT default}\n     * to ensure that (very) low latency livestreams which got stuck for a moment don't crash too\n     * early.\n     */\n    private static final double PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT = 15;\n\n    /**\n     * The maximum number of generated manifests per cache, in\n     * {@link YoutubeProgressiveDashManifestCreator}, {@link YoutubeOtfDashManifestCreator} and\n     * {@link YoutubePostLiveStreamDvrDashManifestCreator}.\n     */\n    private static final int MAX_MANIFEST_CACHE_SIZE = 500;\n\n    /**\n     * The folder name in which the ExoPlayer cache will be written.\n     */\n    private static final String CACHE_FOLDER_NAME = \"exoplayer\";\n\n    /**\n     * The {@link SimpleCache} instance which will be used to build\n     * {@link com.google.android.exoplayer2.upstream.cache.CacheDataSource}s instances (with\n     * {@link CacheFactory}).\n     */\n    private static SimpleCache cache;\n\n\n    private final int progressiveLoadIntervalBytes;\n\n    // Generic Data Source Factories (without or with cache)\n    private final DataSource.Factory cachelessDataSourceFactory;\n    private final CacheFactory cacheDataSourceFactory;\n\n    // YouTube-specific Data Source Factories (with cache)\n    // They use YoutubeHttpDataSource.Factory, with different parameters each\n    private final CacheFactory ytHlsCacheDataSourceFactory;\n    private final CacheFactory ytDashCacheDataSourceFactory;\n    private final CacheFactory ytProgressiveDashCacheDataSourceFactory;\n\n\n    public PlayerDataSource(final Context context,\n                            final TransferListener transferListener) {\n\n        progressiveLoadIntervalBytes = PlayerHelper.getProgressiveLoadIntervalBytes(context);\n\n        // make sure the static cache was created: needed by CacheFactories below\n        instantiateCacheIfNeeded(context);\n\n        // generic data source factories use DefaultHttpDataSource.Factory\n        cachelessDataSourceFactory = new DefaultDataSource.Factory(context,\n                new DefaultHttpDataSource.Factory().setUserAgent(DownloaderImpl.USER_AGENT))\n                .setTransferListener(transferListener);\n        cacheDataSourceFactory = new CacheFactory(context, transferListener, cache,\n                new DefaultHttpDataSource.Factory().setUserAgent(DownloaderImpl.USER_AGENT));\n\n        // YouTube-specific data source factories use getYoutubeHttpDataSourceFactory()\n        ytHlsCacheDataSourceFactory = new CacheFactory(context, transferListener, cache,\n                getYoutubeHttpDataSourceFactory(false, false));\n        ytDashCacheDataSourceFactory = new CacheFactory(context, transferListener, cache,\n                getYoutubeHttpDataSourceFactory(true, true));\n        ytProgressiveDashCacheDataSourceFactory = new CacheFactory(context, transferListener, cache,\n                getYoutubeHttpDataSourceFactory(false, true));\n\n        // set the maximum size to manifest creators\n        YoutubeProgressiveDashManifestCreator.getCache().setMaximumSize(MAX_MANIFEST_CACHE_SIZE);\n        YoutubeOtfDashManifestCreator.getCache().setMaximumSize(MAX_MANIFEST_CACHE_SIZE);\n        YoutubePostLiveStreamDvrDashManifestCreator.getCache().setMaximumSize(\n                MAX_MANIFEST_CACHE_SIZE);\n    }\n\n\n    //region Live media source factories\n    public SsMediaSource.Factory getLiveSsMediaSourceFactory() {\n        return getSSMediaSourceFactory().setLivePresentationDelayMs(LIVE_STREAM_EDGE_GAP_MILLIS);\n    }\n\n    public HlsMediaSource.Factory getLiveHlsMediaSourceFactory() {\n        return new HlsMediaSource.Factory(cachelessDataSourceFactory)\n                .setAllowChunklessPreparation(true)\n                .setPlaylistTrackerFactory((dataSourceFactory, loadErrorHandlingPolicy,\n                                            playlistParserFactory) ->\n                        new DefaultHlsPlaylistTracker(dataSourceFactory, loadErrorHandlingPolicy,\n                                playlistParserFactory,\n                                PLAYLIST_STUCK_TARGET_DURATION_COEFFICIENT));\n    }\n\n    public DashMediaSource.Factory getLiveDashMediaSourceFactory() {\n        return new DashMediaSource.Factory(\n                getDefaultDashChunkSourceFactory(cachelessDataSourceFactory),\n                cachelessDataSourceFactory);\n    }\n\n    public DashMediaSource.Factory getLiveYoutubeDashMediaSourceFactory() {\n        return new DashMediaSource.Factory(\n                getDefaultDashChunkSourceFactory(cachelessDataSourceFactory),\n                cachelessDataSourceFactory)\n                .setManifestParser(new YoutubeDashLiveManifestParser());\n    }\n    //endregion\n\n\n    //region Generic media source factories\n    public HlsMediaSource.Factory getHlsMediaSourceFactory(\n            @Nullable final NonUriHlsDataSourceFactory.Builder hlsDataSourceFactoryBuilder) {\n        if (hlsDataSourceFactoryBuilder != null) {\n            hlsDataSourceFactoryBuilder.setDataSourceFactory(cacheDataSourceFactory);\n            return new HlsMediaSource.Factory(hlsDataSourceFactoryBuilder.build());\n        }\n\n        return new HlsMediaSource.Factory(cacheDataSourceFactory);\n    }\n\n    public DashMediaSource.Factory getDashMediaSourceFactory() {\n        return new DashMediaSource.Factory(\n                getDefaultDashChunkSourceFactory(cacheDataSourceFactory),\n                cacheDataSourceFactory);\n    }\n\n    public ProgressiveMediaSource.Factory getProgressiveMediaSourceFactory() {\n        return new ProgressiveMediaSource.Factory(cacheDataSourceFactory)\n                .setContinueLoadingCheckIntervalBytes(progressiveLoadIntervalBytes);\n    }\n\n    public SsMediaSource.Factory getSSMediaSourceFactory() {\n        return new SsMediaSource.Factory(\n                new DefaultSsChunkSource.Factory(cachelessDataSourceFactory),\n                cachelessDataSourceFactory);\n    }\n\n    public SingleSampleMediaSource.Factory getSingleSampleMediaSourceFactory() {\n        return new SingleSampleMediaSource.Factory(cacheDataSourceFactory);\n    }\n    //endregion\n\n\n    //region YouTube media source factories\n    public HlsMediaSource.Factory getYoutubeHlsMediaSourceFactory() {\n        return new HlsMediaSource.Factory(ytHlsCacheDataSourceFactory);\n    }\n\n    public DashMediaSource.Factory getYoutubeDashMediaSourceFactory() {\n        return new DashMediaSource.Factory(\n                getDefaultDashChunkSourceFactory(ytDashCacheDataSourceFactory),\n                ytDashCacheDataSourceFactory);\n    }\n\n    public ProgressiveMediaSource.Factory getYoutubeProgressiveMediaSourceFactory() {\n        return new ProgressiveMediaSource.Factory(ytProgressiveDashCacheDataSourceFactory)\n                .setContinueLoadingCheckIntervalBytes(progressiveLoadIntervalBytes);\n    }\n    //endregion\n\n\n    //region Static methods\n    private static DefaultDashChunkSource.Factory getDefaultDashChunkSourceFactory(\n            final DataSource.Factory dataSourceFactory) {\n        return new DefaultDashChunkSource.Factory(dataSourceFactory);\n    }\n\n    private static YoutubeHttpDataSource.Factory getYoutubeHttpDataSourceFactory(\n            final boolean rangeParameterEnabled,\n            final boolean rnParameterEnabled) {\n        return new YoutubeHttpDataSource.Factory()\n                .setRangeParameterEnabled(rangeParameterEnabled)\n                .setRnParameterEnabled(rnParameterEnabled);\n    }\n\n    private static void instantiateCacheIfNeeded(final Context context) {\n        if (cache == null) {\n            final File cacheDir = new File(context.getExternalCacheDir(), CACHE_FOLDER_NAME);\n            if (DEBUG) {\n                Log.d(TAG, \"instantiateCacheIfNeeded: cacheDir = \" + cacheDir.getAbsolutePath());\n            }\n            if (!cacheDir.exists() && !cacheDir.mkdir()) {\n                Log.w(TAG, \"instantiateCacheIfNeeded: could not create cache dir\");\n            }\n\n            final LeastRecentlyUsedCacheEvictor evictor =\n                    new LeastRecentlyUsedCacheEvictor(PlayerHelper.getPreferredCacheSize());\n            cache = new SimpleCache(cacheDir, evictor, new StandaloneDatabaseProvider(context));\n        }\n    }\n    //endregion\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport static org.schabi.newpipe.player.helper.PlayerHelper.AutoplayType.AUTOPLAY_TYPE_ALWAYS;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.AutoplayType.AUTOPLAY_TYPE_NEVER;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.AutoplayType.AUTOPLAY_TYPE_WIFI;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_BACKGROUND;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_NONE;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_POPUP;\nimport static java.lang.annotation.RetentionPolicy.SOURCE;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.pm.PackageManager;\nimport android.provider.Settings;\nimport android.view.accessibility.CaptioningManager;\n\nimport androidx.annotation.IntDef;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.content.ContextCompat;\nimport androidx.preference.PreferenceManager;\n\nimport com.google.android.exoplayer2.PlaybackParameters;\nimport com.google.android.exoplayer2.SeekParameters;\nimport com.google.android.exoplayer2.source.ProgressiveMediaSource;\nimport com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection;\nimport com.google.android.exoplayer2.trackselection.ExoTrackSelection;\nimport com.google.android.exoplayer2.ui.AspectRatioFrameLayout;\nimport com.google.android.exoplayer2.ui.AspectRatioFrameLayout.ResizeMode;\nimport com.google.android.exoplayer2.ui.CaptionStyleCompat;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.extractor.stream.SubtitlesStream;\nimport org.schabi.newpipe.extractor.utils.Utils;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.player.playqueue.SinglePlayQueue;\nimport org.schabi.newpipe.util.ListHelper;\nimport org.schabi.newpipe.util.Localization;\n\nimport java.lang.annotation.Retention;\nimport java.text.DecimalFormat;\nimport java.text.DecimalFormatSymbols;\nimport java.text.NumberFormat;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.concurrent.TimeUnit;\nimport java.util.stream.Collectors;\n\npublic final class PlayerHelper {\n    private static final FormattersProvider FORMATTERS_PROVIDER = new FormattersProvider();\n\n    @Retention(SOURCE)\n    @IntDef({AUTOPLAY_TYPE_ALWAYS, AUTOPLAY_TYPE_WIFI,\n            AUTOPLAY_TYPE_NEVER})\n    public @interface AutoplayType {\n        int AUTOPLAY_TYPE_ALWAYS = 0;\n        int AUTOPLAY_TYPE_WIFI = 1;\n        int AUTOPLAY_TYPE_NEVER = 2;\n    }\n\n    @Retention(SOURCE)\n    @IntDef({MINIMIZE_ON_EXIT_MODE_NONE, MINIMIZE_ON_EXIT_MODE_BACKGROUND,\n            MINIMIZE_ON_EXIT_MODE_POPUP})\n    public @interface MinimizeMode {\n        int MINIMIZE_ON_EXIT_MODE_NONE = 0;\n        int MINIMIZE_ON_EXIT_MODE_BACKGROUND = 1;\n        int MINIMIZE_ON_EXIT_MODE_POPUP = 2;\n    }\n\n    private PlayerHelper() {\n    }\n\n    // region Exposed helpers\n\n    public static void resetFormat() {\n        FORMATTERS_PROVIDER.reset();\n    }\n\n    @NonNull\n    public static String getTimeString(final long milliSeconds) {\n        final long seconds = (milliSeconds % 60000) / 1000;\n        final long minutes = (milliSeconds % 3600000) / 60000;\n        final long hours = (milliSeconds % 86400000) / 3600000;\n        final long days = (milliSeconds % (86400000 * 7)) / 86400000;\n\n        final Formatters formatters = FORMATTERS_PROVIDER.formatters();\n        if (days > 0) {\n            return formatters.stringFormat(\"%d:%02d:%02d:%02d\", days, hours, minutes, seconds);\n        }\n\n        return hours > 0\n            ? formatters.stringFormat(\"%d:%02d:%02d\", hours, minutes, seconds)\n            : formatters.stringFormat(\"%02d:%02d\", minutes, seconds);\n    }\n\n    @NonNull\n    public static String formatSpeed(final double speed) {\n        return FORMATTERS_PROVIDER.formatters().speed().format(speed);\n    }\n\n    @NonNull\n    public static String formatPitch(final double pitch) {\n        return FORMATTERS_PROVIDER.formatters().pitch().format(pitch);\n    }\n\n    @NonNull\n    public static String captionLanguageOf(@NonNull final Context context,\n                                           @NonNull final SubtitlesStream subtitles) {\n        final String displayName = subtitles.getDisplayLanguageName();\n        return displayName + (subtitles.isAutoGenerated()\n                ? \" (\" + context.getString(R.string.caption_auto_generated) + \")\" : \"\");\n    }\n\n    @NonNull\n    public static String captionLanguageStemOf(@NonNull final String language) {\n        if (!language.contains(\"(\") || !language.contains(\")\")) {\n            return language;\n        }\n\n        if (language.startsWith(\"(\")) {\n            // language text is right-to-left\n            final String[] parts = language.split(\"\\\\)\");\n            return parts[parts.length - 1].trim();\n        }\n\n        return language.split(\"\\\\(\")[0].trim();\n    }\n\n    @NonNull\n    public static String resizeTypeOf(@NonNull final Context context,\n                                      @ResizeMode final int resizeMode) {\n        switch (resizeMode) {\n            case AspectRatioFrameLayout.RESIZE_MODE_FIT:\n                return context.getString(R.string.resize_fit);\n            case AspectRatioFrameLayout.RESIZE_MODE_FILL:\n                return context.getString(R.string.resize_fill);\n            case AspectRatioFrameLayout.RESIZE_MODE_ZOOM:\n                return context.getString(R.string.resize_zoom);\n            case AspectRatioFrameLayout.RESIZE_MODE_FIXED_HEIGHT:\n            case AspectRatioFrameLayout.RESIZE_MODE_FIXED_WIDTH:\n            default:\n                throw new IllegalArgumentException(\"Unrecognized resize mode: \" + resizeMode);\n        }\n    }\n\n    /**\n     * Given a {@link StreamInfo} and the existing queue items,\n     * provide the {@link SinglePlayQueue} consisting of the next video for auto queueing.\n     * <p>\n     * This method detects and prevents cycles by naively checking\n     * if a candidate next video's url already exists in the existing items.\n     * </p>\n     * <p>\n     * The first item in {@link StreamInfo#getRelatedItems()} is checked first.\n     * If it is non-null and is not part of the existing items, it will be used as the next stream.\n     * Otherwise, a random stream with non-repeating url will be selected\n     * from the {@link StreamInfo#getRelatedItems()}. Non-stream items are ignored.\n     * </p>\n     *\n     * @param info          currently playing stream\n     * @param existingItems existing items in the queue\n     * @return {@link SinglePlayQueue} with the next stream to queue\n     */\n    @Nullable\n    public static PlayQueue autoQueueOf(@NonNull final StreamInfo info,\n                                        @NonNull final List<PlayQueueItem> existingItems) {\n        final Set<String> urls = existingItems.stream()\n                .map(PlayQueueItem::getUrl)\n                .collect(Collectors.toUnmodifiableSet());\n\n        final List<InfoItem> relatedItems = info.getRelatedItems();\n        if (Utils.isNullOrEmpty(relatedItems)) {\n            return null;\n        }\n\n        if (relatedItems.get(0) instanceof StreamInfoItem\n                && !urls.contains(relatedItems.get(0).getUrl())) {\n            return getAutoQueuedSinglePlayQueue((StreamInfoItem) relatedItems.get(0));\n        }\n\n        final List<StreamInfoItem> autoQueueItems = new ArrayList<>();\n        for (final InfoItem item : relatedItems) {\n            if (item instanceof StreamInfoItem && !urls.contains(item.getUrl())) {\n                autoQueueItems.add((StreamInfoItem) item);\n            }\n        }\n\n        Collections.shuffle(autoQueueItems);\n        return autoQueueItems.isEmpty()\n                ? null : getAutoQueuedSinglePlayQueue(autoQueueItems.get(0));\n    }\n\n    // endregion\n    // region Resolution\n\n    public static boolean isResumeAfterAudioFocusGain(@NonNull final Context context) {\n        return getPreferences(context)\n                .getBoolean(context.getString(R.string.resume_on_audio_focus_gain_key), false);\n    }\n\n    public static String getActionForRightGestureSide(@NonNull final Context context) {\n        return getPreferences(context)\n                .getString(context.getString(R.string.right_gesture_control_key),\n                        context.getString(R.string.default_right_gesture_control_value));\n    }\n\n    public static String getActionForLeftGestureSide(@NonNull final Context context) {\n        return getPreferences(context)\n                .getString(context.getString(R.string.left_gesture_control_key),\n                        context.getString(R.string.default_left_gesture_control_value));\n    }\n\n    public static boolean isStartMainPlayerFullscreenEnabled(@NonNull final Context context) {\n        return getPreferences(context)\n                .getBoolean(context.getString(R.string.start_main_player_fullscreen_key), false);\n    }\n\n    public static boolean isAutoQueueEnabled(@NonNull final Context context) {\n        return getPreferences(context)\n                .getBoolean(context.getString(R.string.auto_queue_key), false);\n    }\n\n    public static boolean isClearingQueueConfirmationRequired(@NonNull final Context context) {\n        return getPreferences(context)\n                .getBoolean(context.getString(R.string.clear_queue_confirmation_key), false);\n    }\n\n    @MinimizeMode\n    public static int getMinimizeOnExitAction(@NonNull final Context context) {\n        final String action = getPreferences(context)\n                .getString(context.getString(R.string.minimize_on_exit_key), \"\");\n        if (action.equals(context.getString(R.string.minimize_on_exit_popup_key))) {\n            return MINIMIZE_ON_EXIT_MODE_POPUP;\n        } else if (action.equals(context.getString(R.string.minimize_on_exit_none_key))) {\n            return MINIMIZE_ON_EXIT_MODE_NONE;\n        } else {\n            return MINIMIZE_ON_EXIT_MODE_BACKGROUND; // default\n        }\n    }\n\n    @AutoplayType\n    public static int getAutoplayType(@NonNull final Context context) {\n        final String type = getPreferences(context).getString(\n                context.getString(R.string.autoplay_key), \"\");\n        if (type.equals(context.getString(R.string.autoplay_always_key))) {\n            return AUTOPLAY_TYPE_ALWAYS;\n        } else if (type.equals(context.getString(R.string.autoplay_never_key))) {\n            return AUTOPLAY_TYPE_NEVER;\n        } else {\n            return AUTOPLAY_TYPE_WIFI; // default\n        }\n    }\n\n    public static boolean isAutoplayAllowedByUser(@NonNull final Context context) {\n        switch (PlayerHelper.getAutoplayType(context)) {\n            case PlayerHelper.AutoplayType.AUTOPLAY_TYPE_NEVER:\n                return false;\n            case PlayerHelper.AutoplayType.AUTOPLAY_TYPE_WIFI:\n                return !ListHelper.isMeteredNetwork(context);\n            case PlayerHelper.AutoplayType.AUTOPLAY_TYPE_ALWAYS:\n            default:\n                return true;\n        }\n    }\n\n    @NonNull\n    public static SeekParameters getSeekParameters(@NonNull final Context context) {\n        return isUsingInexactSeek(context) ? SeekParameters.CLOSEST_SYNC : SeekParameters.EXACT;\n    }\n\n    public static long getPreferredCacheSize() {\n        return 64 * 1024 * 1024L;\n    }\n\n    public static long getPreferredFileSize() {\n        return 2 * 1024 * 1024L; // ExoPlayer CacheDataSink.MIN_RECOMMENDED_FRAGMENT_SIZE\n    }\n\n    @NonNull\n    public static ExoTrackSelection.Factory getQualitySelector() {\n        return new AdaptiveTrackSelection.Factory(\n                1000,\n                AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS,\n                AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS,\n                AdaptiveTrackSelection.DEFAULT_BANDWIDTH_FRACTION);\n    }\n\n    @NonNull\n    public static CaptionStyleCompat getCaptionStyle(@NonNull final Context context) {\n        final CaptioningManager captioningManager = ContextCompat.getSystemService(context,\n                CaptioningManager.class);\n        if (captioningManager == null || !captioningManager.isEnabled()) {\n            return CaptionStyleCompat.DEFAULT;\n        }\n\n        return CaptionStyleCompat.createFromCaptionStyle(captioningManager.getUserStyle());\n    }\n\n    /**\n     * Get scaling for captions based on system font scaling.\n     * <p>Options:</p>\n     * <ul>\n     *     <li>Very small: 0.25f</li>\n     *     <li>Small: 0.5f</li>\n     *     <li>Normal: 1.0f</li>\n     *     <li>Large: 1.5f</li>\n     *     <li>Very large: 2.0f</li>\n     * </ul>\n     *\n     * @param context Android app context\n     * @return caption scaling\n     */\n    public static float getCaptionScale(@NonNull final Context context) {\n        final CaptioningManager captioningManager = ContextCompat.getSystemService(context,\n                CaptioningManager.class);\n        if (captioningManager == null || !captioningManager.isEnabled()) {\n            return 1.0f;\n        }\n\n        return captioningManager.getFontScale();\n    }\n\n    /**\n     * @param context the Android context\n     * @return the screen brightness to use. A value less than 0 (the default) means to use the\n     * preferred screen brightness\n     */\n    public static float getScreenBrightness(@NonNull final Context context) {\n        final SharedPreferences sp = getPreferences(context);\n        final long timestamp =\n                sp.getLong(context.getString(R.string.screen_brightness_timestamp_key), 0);\n        // Hypothesis: 4h covers a viewing block, e.g. evening.\n        // External lightning conditions will change in the next\n        // viewing block so we fall back to the default brightness\n        if ((System.currentTimeMillis() - timestamp) > TimeUnit.HOURS.toMillis(4)) {\n            return -1;\n        } else {\n            return sp.getFloat(context.getString(R.string.screen_brightness_key), -1);\n        }\n    }\n\n    public static void setScreenBrightness(@NonNull final Context context,\n                                           final float screenBrightness) {\n        getPreferences(context).edit()\n                .putFloat(context.getString(R.string.screen_brightness_key), screenBrightness)\n                .putLong(context.getString(R.string.screen_brightness_timestamp_key),\n                        System.currentTimeMillis())\n                .apply();\n    }\n\n    public static boolean globalScreenOrientationLocked(final Context context) {\n        // 1: Screen orientation changes using accelerometer\n        // 0: Screen orientation is locked\n        // if the accelerometer sensor is missing completely, assume locked orientation\n        return android.provider.Settings.System.getInt(\n                context.getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 0) == 0\n                    || !context.getPackageManager()\n                        .hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER);\n    }\n\n    public static int getProgressiveLoadIntervalBytes(@NonNull final Context context) {\n        final String preferredIntervalBytes = getPreferences(context).getString(\n                context.getString(R.string.progressive_load_interval_key),\n                context.getString(R.string.progressive_load_interval_default_value));\n\n        if (context.getString(R.string.progressive_load_interval_exoplayer_default_value)\n                .equals(preferredIntervalBytes)) {\n            return ProgressiveMediaSource.DEFAULT_LOADING_CHECK_INTERVAL_BYTES;\n        }\n        // Keeping the same KiB unit used by ProgressiveMediaSource\n        return Integer.parseInt(preferredIntervalBytes) * 1024;\n    }\n\n    // endregion\n    // region Private helpers\n\n    @NonNull\n    private static SharedPreferences getPreferences(@NonNull final Context context) {\n        return PreferenceManager.getDefaultSharedPreferences(context);\n    }\n\n    private static boolean isUsingInexactSeek(@NonNull final Context context) {\n        return getPreferences(context)\n                .getBoolean(context.getString(R.string.use_inexact_seek_key), false);\n    }\n\n    private static SinglePlayQueue getAutoQueuedSinglePlayQueue(\n            final StreamInfoItem streamInfoItem) {\n        final SinglePlayQueue singlePlayQueue = new SinglePlayQueue(streamInfoItem);\n        Objects.requireNonNull(singlePlayQueue.getItem()).setAutoQueued(true);\n        return singlePlayQueue;\n    }\n\n    // endregion\n    // region Utils used by player\n\n    @ResizeMode\n    public static int retrieveResizeModeFromPrefs(final Player player) {\n        return player.getPrefs().getInt(player.getContext().getString(R.string.last_resize_mode),\n                AspectRatioFrameLayout.RESIZE_MODE_FIT);\n    }\n\n    @SuppressLint(\"SwitchIntDef\") // only fit, fill and zoom are supported by NewPipe\n    @ResizeMode\n    public static int nextResizeModeAndSaveToPrefs(final Player player,\n                                                   @ResizeMode final int resizeMode) {\n        final int newResizeMode;\n        switch (resizeMode) {\n            case AspectRatioFrameLayout.RESIZE_MODE_FIT:\n                newResizeMode = AspectRatioFrameLayout.RESIZE_MODE_FILL;\n                break;\n            case AspectRatioFrameLayout.RESIZE_MODE_FILL:\n                newResizeMode = AspectRatioFrameLayout.RESIZE_MODE_ZOOM;\n                break;\n            case AspectRatioFrameLayout.RESIZE_MODE_ZOOM:\n            default:\n                newResizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT;\n                break;\n        }\n\n        // save the new resize mode so it can be restored in a future session\n        player.getPrefs().edit().putInt(\n                player.getContext().getString(R.string.last_resize_mode), newResizeMode).apply();\n        return newResizeMode;\n    }\n\n    public static PlaybackParameters retrievePlaybackParametersFromPrefs(final Player player) {\n        final float speed = player.getPrefs().getFloat(player.getContext().getString(\n                R.string.playback_speed_key), player.getPlaybackSpeed());\n        final float pitch = player.getPrefs().getFloat(player.getContext().getString(\n                R.string.playback_pitch_key), player.getPlaybackPitch());\n        return new PlaybackParameters(speed, pitch);\n    }\n\n    public static void savePlaybackParametersToPrefs(final Player player,\n                                                     final float speed,\n                                                     final float pitch,\n                                                     final boolean skipSilence) {\n        player.getPrefs().edit()\n                .putFloat(player.getContext().getString(R.string.playback_speed_key), speed)\n                .putFloat(player.getContext().getString(R.string.playback_pitch_key), pitch)\n                .putBoolean(player.getContext().getString(R.string.playback_skip_silence_key),\n                        skipSilence)\n                .apply();\n    }\n\n    public static float getMinimumVideoHeight(final float width) {\n        return width / (16.0f / 9.0f); // Respect the 16:9 ratio that most videos have\n    }\n\n    public static int retrieveSeekDurationFromPreferences(final Player player) {\n        return Integer.parseInt(Objects.requireNonNull(player.getPrefs().getString(\n                player.getContext().getString(R.string.seek_duration_key),\n                player.getContext().getString(R.string.seek_duration_default_value))));\n    }\n\n    // endregion\n    // region Format\n\n    static class FormattersProvider {\n        private Formatters formatters;\n\n        public Formatters formatters() {\n            if (formatters == null) {\n                formatters = Formatters.create();\n            }\n            return formatters;\n        }\n\n        public void reset() {\n            formatters = null;\n        }\n    }\n\n    record Formatters(\n        Locale locale,\n        NumberFormat speed,\n        NumberFormat pitch) {\n\n        static Formatters create() {\n            final Locale locale = Localization.getAppLocale();\n            final DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(locale);\n            return new Formatters(\n                locale,\n                new DecimalFormat(\"0.##x\", dfs),\n                new DecimalFormat(\"##%\", dfs));\n        }\n\n        String stringFormat(final String format, final Object... args) {\n            return String.format(locale, format, args);\n        }\n    }\n\n    // endregion\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/PlayerHolder.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.ServiceConnection;\nimport android.os.IBinder;\nimport android.util.Log;\n\nimport androidx.annotation.Nullable;\nimport androidx.core.content.ContextCompat;\n\nimport com.google.android.exoplayer2.PlaybackException;\nimport com.google.android.exoplayer2.PlaybackParameters;\n\nimport org.schabi.newpipe.App;\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.player.PlayerService;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.PlayerType;\nimport org.schabi.newpipe.player.event.PlayerServiceEventListener;\nimport org.schabi.newpipe.player.event.PlayerServiceExtendedEventListener;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.util.NavigationHelper;\n\nimport java.util.Optional;\nimport java.util.function.Consumer;\n\npublic final class PlayerHolder {\n\n    private PlayerHolder() {\n    }\n\n    private static PlayerHolder instance;\n    public static synchronized PlayerHolder getInstance() {\n        if (PlayerHolder.instance == null) {\n            PlayerHolder.instance = new PlayerHolder();\n        }\n        return PlayerHolder.instance;\n    }\n\n    private static final boolean DEBUG = MainActivity.DEBUG;\n    private static final String TAG = PlayerHolder.class.getSimpleName();\n\n    @Nullable private PlayerServiceExtendedEventListener listener;\n\n    private final PlayerServiceConnection serviceConnection = new PlayerServiceConnection();\n    private boolean bound;\n    @Nullable private PlayerService playerService;\n\n    private Optional<Player> getPlayer() {\n        return Optional.ofNullable(playerService)\n                .flatMap(s -> Optional.ofNullable(s.getPlayer()));\n    }\n\n    private Optional<PlayQueue> getPlayQueue() {\n        // player play queue might be null e.g. while player is starting\n        return getPlayer().flatMap(p -> Optional.ofNullable(p.getPlayQueue()));\n    }\n\n    /**\n     * Returns the current {@link PlayerType} of the {@link PlayerService} service,\n     * otherwise `null` if no service is running.\n     *\n     * @return Current PlayerType\n     */\n    @Nullable\n    public PlayerType getType() {\n        return getPlayer().map(Player::getPlayerType).orElse(null);\n    }\n\n    public boolean isPlaying() {\n        return getPlayer().map(Player::isPlaying).orElse(false);\n    }\n\n    public boolean isPlayerOpen() {\n        return getPlayer().isPresent();\n    }\n\n    /**\n     * Use this method to only allow the user to manipulate the play queue (e.g. by enqueueing via\n     * the stream long press menu) when there actually is a play queue to manipulate.\n     * @return true only if the player is open and its play queue is ready (i.e. it is not null)\n     */\n    public boolean isPlayQueueReady() {\n        return getPlayQueue().isPresent();\n    }\n\n    public boolean isBound() {\n        return bound;\n    }\n\n    public int getQueueSize() {\n        return getPlayQueue().map(PlayQueue::size).orElse(0);\n    }\n\n    public int getQueuePosition() {\n        return getPlayQueue().map(PlayQueue::getIndex).orElse(0);\n    }\n\n    public void setListener(@Nullable final PlayerServiceExtendedEventListener newListener) {\n        listener = newListener;\n\n        if (listener == null) {\n            return;\n        }\n\n        // Force reload data from service\n        if (playerService != null) {\n            listener.onServiceConnected(playerService);\n            startPlayerListener();\n            // ^ will call listener.onPlayerConnected() down the line if there is an active player\n        }\n    }\n\n    // helper to handle context in common place as using the same\n    // context to bind/unbind a service is crucial\n    private Context getCommonContext() {\n        return App.getInstance();\n    }\n\n    public void startService(final boolean playAfterConnect,\n                             final PlayerServiceExtendedEventListener newListener) {\n        if (DEBUG) {\n            Log.d(TAG, \"startService() called with playAfterConnect=\" + playAfterConnect);\n        }\n        final Context context = getCommonContext();\n        setListener(newListener);\n        if (bound) {\n            return;\n        }\n        // startService() can be called concurrently and it will give a random crashes\n        // and NullPointerExceptions inside the service because the service will be\n        // bound twice. Prevent it with unbinding first\n        unbind(context);\n        final Intent intent = new Intent(context, PlayerService.class);\n        intent.putExtra(PlayerService.SHOULD_START_FOREGROUND_EXTRA, true);\n        ContextCompat.startForegroundService(context, intent);\n        serviceConnection.doPlayAfterConnect(playAfterConnect);\n        bind(context);\n    }\n\n    public void stopService() {\n        if (DEBUG) {\n            Log.d(TAG, \"stopService() called\");\n        }\n        if (playerService != null) {\n            playerService.destroyPlayerAndStopService();\n        }\n        final Context context = getCommonContext();\n        unbind(context);\n        // destroyPlayerAndStopService() already runs the next line of code, but run it again just\n        // to make sure to stop the service even if playerService is null by any chance.\n        context.stopService(new Intent(context, PlayerService.class));\n    }\n\n    class PlayerServiceConnection implements ServiceConnection {\n\n        private boolean playAfterConnect = false;\n\n        /**\n         * @param playAfterConnection Sets the value of `playAfterConnect` to pass to the {@link\n         * PlayerServiceExtendedEventListener#onPlayerConnected(Player, boolean)} the next time it\n         * is called. The value of `playAfterConnect` will be reset to false after that.\n         */\n        public void doPlayAfterConnect(final boolean playAfterConnection) {\n            this.playAfterConnect = playAfterConnection;\n        }\n\n        @Override\n        public void onServiceDisconnected(final ComponentName compName) {\n            if (DEBUG) {\n                Log.d(TAG, \"Player service is disconnected\");\n            }\n\n            final Context context = getCommonContext();\n            unbind(context);\n        }\n\n        @Override\n        public void onServiceConnected(final ComponentName compName, final IBinder service) {\n            if (DEBUG) {\n                Log.d(TAG, \"Player service is connected\");\n            }\n            final PlayerService.LocalBinder localBinder = (PlayerService.LocalBinder) service;\n\n            playerService = localBinder.getService();\n            if (listener != null) {\n                listener.onServiceConnected(playerService);\n            }\n            startPlayerListener();\n            // ^ will call listener.onPlayerConnected() down the line if there is an active player\n\n            if (playerService != null && playerService.getPlayer() != null) {\n                // notify the main activity that binding the service has completed and that there is\n                // a player, so that it can open the bottom mini-player\n                NavigationHelper.sendPlayerStartedEvent(localBinder.getService());\n            }\n        }\n    }\n\n    private void bind(final Context context) {\n        if (DEBUG) {\n            Log.d(TAG, \"bind() called\");\n        }\n        // BIND_AUTO_CREATE starts the service if it's not already running\n        bound = bind(context, Context.BIND_AUTO_CREATE);\n        if (!bound) {\n            context.unbindService(serviceConnection);\n        }\n    }\n\n    public void tryBindIfNeeded(final Context context) {\n        if (!bound) {\n            // flags=0 means the service will not be started if it does not already exist. In this\n            // case the return value is not useful, as a value of \"true\" does not really indicate\n            // that the service is going to be bound.\n            bind(context, 0);\n        }\n    }\n\n    private boolean bind(final Context context, final int flags) {\n        final Intent serviceIntent = new Intent(context, PlayerService.class);\n        serviceIntent.setAction(PlayerService.BIND_PLAYER_HOLDER_ACTION);\n        return context.bindService(serviceIntent, serviceConnection, flags);\n    }\n\n    private void unbind(final Context context) {\n        if (DEBUG) {\n            Log.d(TAG, \"unbind() called\");\n        }\n\n        if (bound) {\n            context.unbindService(serviceConnection);\n            bound = false;\n            stopPlayerListener();\n            playerService = null;\n            if (listener != null) {\n                listener.onPlayerDisconnected();\n                listener.onServiceDisconnected();\n            }\n        }\n    }\n\n    private void startPlayerListener() {\n        if (playerService != null) {\n            // setting the player listener will take care of calling relevant callbacks if the\n            // player in the service is (not) already active, also see playerStateListener below\n            playerService.setPlayerListener(playerStateListener);\n        }\n        getPlayer().ifPresent(p -> p.setFragmentListener(internalListener));\n    }\n\n    private void stopPlayerListener() {\n        if (playerService != null) {\n            playerService.setPlayerListener(null);\n        }\n        getPlayer().ifPresent(p -> p.removeFragmentListener(internalListener));\n    }\n\n    /**\n     * This listener will be held by the players created by {@link PlayerService}.\n     */\n    private final PlayerServiceEventListener internalListener =\n            new PlayerServiceEventListener() {\n                @Override\n                public void onViewCreated() {\n                    if (listener != null) {\n                        listener.onViewCreated();\n                    }\n                }\n\n                @Override\n                public void onFullscreenStateChanged(final boolean fullscreen) {\n                    if (listener != null) {\n                        listener.onFullscreenStateChanged(fullscreen);\n                    }\n                }\n\n                @Override\n                public void onScreenRotationButtonClicked() {\n                    if (listener != null) {\n                        listener.onScreenRotationButtonClicked();\n                    }\n                }\n\n                @Override\n                public void onMoreOptionsLongClicked() {\n                    if (listener != null) {\n                        listener.onMoreOptionsLongClicked();\n                    }\n                }\n\n                @Override\n                public void onPlayerError(final PlaybackException error,\n                                          final boolean isCatchableException) {\n                    if (listener != null) {\n                        listener.onPlayerError(error, isCatchableException);\n                    }\n                }\n\n                @Override\n                public void hideSystemUiIfNeeded() {\n                    if (listener != null) {\n                        listener.hideSystemUiIfNeeded();\n                    }\n                }\n\n                @Override\n                public void onQueueUpdate(final PlayQueue queue) {\n                    if (listener != null) {\n                        listener.onQueueUpdate(queue);\n                    }\n                }\n\n                @Override\n                public void onPlaybackUpdate(final int state,\n                                             final int repeatMode,\n                                             final boolean shuffled,\n                                             final PlaybackParameters parameters) {\n                    if (listener != null) {\n                        listener.onPlaybackUpdate(state, repeatMode, shuffled, parameters);\n                    }\n                }\n\n                @Override\n                public void onProgressUpdate(final int currentProgress,\n                                             final int duration,\n                                             final int bufferPercent) {\n                    if (listener != null) {\n                        listener.onProgressUpdate(currentProgress, duration, bufferPercent);\n                    }\n                }\n\n                @Override\n                public void onMetadataUpdate(final StreamInfo info, final PlayQueue queue) {\n                    if (listener != null) {\n                        listener.onMetadataUpdate(info, queue);\n                    }\n                }\n\n                @Override\n                public void onServiceStopped() {\n                    if (listener != null) {\n                        listener.onServiceStopped();\n                    }\n                    unbind(getCommonContext());\n                }\n            };\n\n    /**\n     * This listener will be held by bound {@link PlayerService}s to notify of the player starting\n     * or stopping. This is necessary since the service outlives the player e.g. to answer Android\n     * Auto media browser queries.\n     */\n    private final Consumer<Player> playerStateListener = (@Nullable final Player player) -> {\n        if (listener != null) {\n            if (player == null) {\n                // player.fragmentListener=null is already done by player.stopActivityBinding(),\n                // which is called by player.destroy(), which is in turn called by PlayerService\n                // before setting its player to null\n                listener.onPlayerDisconnected();\n            } else {\n                listener.onPlayerConnected(player, serviceConnection.playAfterConnect);\n                // reset the value of playAfterConnect: if it was true before, it is now \"consumed\"\n                serviceConnection.playAfterConnect = false;\n                player.setFragmentListener(internalListener);\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/PlayerSemitoneHelper.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport androidx.core.math.MathUtils;\n\n/**\n * Converts between percent and 12-tone equal temperament semitones.\n * <br/>\n * @see\n * <a href=\"https://en.wikipedia.org/wiki/Equal_temperament#Twelve-tone_equal_temperament\">\n *     Wikipedia: Equal temperament#Twelve-tone equal temperament\n * </a>\n */\npublic final class PlayerSemitoneHelper {\n    public static final int SEMITONE_COUNT = 12;\n\n    private PlayerSemitoneHelper() {\n        // No impl\n    }\n\n    public static String formatPitchSemitones(final double percent) {\n        return formatPitchSemitones(percentToSemitones(percent));\n    }\n\n    public static String formatPitchSemitones(final int semitones) {\n        return semitones > 0 ? \"+\" + semitones : \"\" + semitones;\n    }\n\n    public static double semitonesToPercent(final int semitones) {\n        return Math.pow(2, ensureSemitonesInRange(semitones) / (double) SEMITONE_COUNT);\n    }\n\n    public static int percentToSemitones(final double percent) {\n        return ensureSemitonesInRange(\n                (int) Math.round(SEMITONE_COUNT * Math.log(percent) / Math.log(2)));\n    }\n\n    private static int ensureSemitonesInRange(final int semitones) {\n        return MathUtils.clamp(semitones, -SEMITONE_COUNT, SEMITONE_COUNT);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/helper/YoutubeDashLiveManifestParser.java",
    "content": "package org.schabi.newpipe.player.helper;\n\nimport android.net.Uri;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.source.dash.manifest.DashManifest;\nimport com.google.android.exoplayer2.source.dash.manifest.DashManifestParser;\nimport com.google.android.exoplayer2.source.dash.manifest.Period;\nimport com.google.android.exoplayer2.source.dash.manifest.ProgramInformation;\nimport com.google.android.exoplayer2.source.dash.manifest.ServiceDescriptionElement;\nimport com.google.android.exoplayer2.source.dash.manifest.UtcTimingElement;\n\nimport java.util.List;\n\n/**\n * A {@link DashManifestParser} fixing YouTube DASH manifests to allow starting playback from the\n * newest period available instead of the earliest one in some cases.\n *\n * <p>\n * It changes the {@code availabilityStartTime} passed to a custom value doing the workaround.\n * A better approach to fix the issue should be investigated and used in the future.\n * </p>\n */\npublic class YoutubeDashLiveManifestParser extends DashManifestParser {\n\n    // Result of Util.parseXsDateTime(\"1970-01-01T00:00:00Z\")\n    private static final long AVAILABILITY_START_TIME_TO_USE = 0;\n\n    // There is no computation made with the availabilityStartTime value in the\n    // parseMediaPresentationDescription method itself, so we can just override methods called in\n    // this method using the workaround value\n    // Overriding parsePeriod does not seem to be needed\n\n    @SuppressWarnings(\"checkstyle:ParameterNumber\")\n    @NonNull\n    @Override\n    protected DashManifest buildMediaPresentationDescription(\n            final long availabilityStartTime,\n            final long durationMs,\n            final long minBufferTimeMs,\n            final boolean dynamic,\n            final long minUpdateTimeMs,\n            final long timeShiftBufferDepthMs,\n            final long suggestedPresentationDelayMs,\n            final long publishTimeMs,\n            @Nullable final ProgramInformation programInformation,\n            @Nullable final UtcTimingElement utcTiming,\n            @Nullable final ServiceDescriptionElement serviceDescription,\n            @Nullable final Uri location,\n            @NonNull final List<Period> periods) {\n        return super.buildMediaPresentationDescription(\n                AVAILABILITY_START_TIME_TO_USE,\n                durationMs,\n                minBufferTimeMs,\n                dynamic,\n                minUpdateTimeMs,\n                timeShiftBufferDepthMs,\n                suggestedPresentationDelayMs,\n                publishTimeMs,\n                programInformation,\n                utcTiming,\n                serviceDescription,\n                location,\n                periods);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserCommon.kt",
    "content": "package org.schabi.newpipe.player.mediabrowser\n\nimport org.schabi.newpipe.BuildConfig\nimport org.schabi.newpipe.extractor.InfoItem.InfoType\nimport org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException\n\ninternal const val ID_AUTHORITY = BuildConfig.APPLICATION_ID\ninternal const val ID_ROOT = \"//$ID_AUTHORITY\"\ninternal const val ID_BOOKMARKS = \"playlists\"\ninternal const val ID_HISTORY = \"history\"\ninternal const val ID_INFO_ITEM = \"item\"\n\ninternal const val ID_LOCAL = \"local\"\ninternal const val ID_REMOTE = \"remote\"\ninternal const val ID_URL = \"url\"\ninternal const val ID_STREAM = \"stream\"\ninternal const val ID_PLAYLIST = \"playlist\"\ninternal const val ID_CHANNEL = \"channel\"\n\ninternal fun infoItemTypeToString(type: InfoType): String {\n    return when (type) {\n        InfoType.STREAM -> ID_STREAM\n        InfoType.PLAYLIST -> ID_PLAYLIST\n        InfoType.CHANNEL -> ID_CHANNEL\n        else -> error(\"Unexpected value: $type\")\n    }\n}\n\ninternal fun infoItemTypeFromString(type: String): InfoType {\n    return when (type) {\n        ID_STREAM -> InfoType.STREAM\n        ID_PLAYLIST -> InfoType.PLAYLIST\n        ID_CHANNEL -> InfoType.CHANNEL\n        else -> error(\"Unexpected value: $type\")\n    }\n}\n\ninternal fun parseError(mediaId: String): ContentNotAvailableException {\n    return ContentNotAvailableException(\"Failed to parse media ID $mediaId\")\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserImpl.kt",
    "content": "package org.schabi.newpipe.player.mediabrowser\n\nimport android.content.ContentResolver\nimport android.content.Context\nimport android.net.Uri\nimport android.os.Bundle\nimport android.support.v4.media.MediaBrowserCompat\nimport android.support.v4.media.MediaDescriptionCompat\nimport android.util.Log\nimport androidx.annotation.DrawableRes\nimport androidx.core.net.toUri\nimport androidx.media.MediaBrowserServiceCompat\nimport androidx.media.MediaBrowserServiceCompat.BrowserRoot.EXTRA_RECENT\nimport androidx.media.MediaBrowserServiceCompat.Result\nimport androidx.media.utils.MediaConstants\nimport io.reactivex.rxjava3.core.Flowable\nimport io.reactivex.rxjava3.core.Single\nimport io.reactivex.rxjava3.disposables.CompositeDisposable\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport java.util.function.Consumer\nimport org.schabi.newpipe.MainActivity.DEBUG\nimport org.schabi.newpipe.NewPipeDatabase\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.history.model.StreamHistoryEntry\nimport org.schabi.newpipe.database.playlist.PlaylistLocalItem\nimport org.schabi.newpipe.database.playlist.PlaylistStreamEntry\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity\nimport org.schabi.newpipe.extractor.InfoItem\nimport org.schabi.newpipe.extractor.InfoItem.InfoType\nimport org.schabi.newpipe.extractor.channel.ChannelInfoItem\nimport org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException\nimport org.schabi.newpipe.extractor.playlist.PlaylistInfoItem\nimport org.schabi.newpipe.extractor.search.SearchInfo\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem\nimport org.schabi.newpipe.local.bookmark.MergedPlaylistManager\nimport org.schabi.newpipe.local.playlist.LocalPlaylistManager\nimport org.schabi.newpipe.local.playlist.RemotePlaylistManager\nimport org.schabi.newpipe.util.ExtractorHelper\nimport org.schabi.newpipe.util.ServiceHelper\nimport org.schabi.newpipe.util.image.ImageStrategy\n\n/**\n * This class is used to cleanly separate the Service implementation (in\n * [org.schabi.newpipe.player.PlayerService]) and the media browser implementation (in this file).\n *\n * @param notifyChildrenChanged takes the parent id of the children that changed\n */\nclass MediaBrowserImpl(\n    private val context: Context,\n    // parentId\n    notifyChildrenChanged: Consumer<String>\n) {\n    private val packageValidator = PackageValidator(context)\n    private val database = NewPipeDatabase.getInstance(context)\n    private var disposables = CompositeDisposable()\n\n    init {\n        // this will listen to changes in the bookmarks until this MediaBrowserImpl is dispose()d\n        disposables.add(\n            getMergedPlaylists().subscribe { notifyChildrenChanged.accept(ID_BOOKMARKS) }\n        )\n    }\n\n    //region Cleanup\n    fun dispose() {\n        disposables.dispose()\n    }\n    //endregion\n\n    //region onGetRoot\n    fun onGetRoot(\n        clientPackageName: String,\n        clientUid: Int,\n        rootHints: Bundle?\n    ): MediaBrowserServiceCompat.BrowserRoot? {\n        if (DEBUG) {\n            Log.d(TAG, \"onGetRoot($clientPackageName, $clientUid, $rootHints)\")\n        }\n\n        if (!packageValidator.isKnownCaller(clientPackageName, clientUid)) {\n            // this is a caller we can't trust (see PackageValidator's rules taken from uamp)\n            return null\n        }\n\n        if (rootHints?.getBoolean(EXTRA_RECENT, false) == true) {\n            // the system is asking for a root to do media resumption, but we can't handle that yet,\n            // see https://developer.android.com/media/implement/surfaces/mobile#mediabrowserservice_implementation\n            return null\n        }\n\n        val extras = Bundle()\n        extras.putBoolean(\n            MediaConstants.BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED,\n            true\n        )\n        return MediaBrowserServiceCompat.BrowserRoot(ID_ROOT, extras)\n    }\n    //endregion\n\n    //region onLoadChildren\n    fun onLoadChildren(parentId: String, result: Result<List<MediaBrowserCompat.MediaItem>>) {\n        if (DEBUG) {\n            Log.d(TAG, \"onLoadChildren($parentId)\")\n        }\n\n        result.detach() // allows sendResult() to happen later\n        disposables.add(\n            onLoadChildren(parentId)\n                .subscribe(\n                    { result.sendResult(it) },\n                    { throwable ->\n                        // null indicates an error, see the docs of MediaSessionCompat.onSearch()\n                        result.sendResult(null)\n                        Log.e(TAG, \"onLoadChildren error for parentId=$parentId: $throwable\")\n                    }\n                )\n        )\n    }\n\n    private fun onLoadChildren(parentId: String): Single<List<MediaBrowserCompat.MediaItem>> {\n        try {\n            val parentIdUri = parentId.toUri()\n            val path = ArrayList(parentIdUri.pathSegments)\n\n            if (path.isEmpty()) {\n                return Single.just(\n                    listOf(\n                        createRootMediaItem(\n                            ID_BOOKMARKS,\n                            context.resources.getString(R.string.tab_bookmarks_short),\n                            R.drawable.ic_bookmark_white\n                        ),\n                        createRootMediaItem(\n                            ID_HISTORY,\n                            context.resources.getString(R.string.action_history),\n                            R.drawable.ic_history_white\n                        )\n                    )\n                )\n            }\n\n            when (path.removeAt(0)) {\n                ID_BOOKMARKS -> {\n                    if (path.isEmpty()) {\n                        return populateBookmarks()\n                    }\n                    if (path.size == 2) {\n                        val localOrRemote = path[0]\n                        val playlistId = path[1].toLong()\n                        if (localOrRemote == ID_LOCAL) {\n                            return populateLocalPlaylist(playlistId)\n                        } else if (localOrRemote == ID_REMOTE) {\n                            return populateRemotePlaylist(playlistId)\n                        }\n                    }\n                    Log.w(TAG, \"Unknown playlist URI: $parentId\")\n                    throw parseError(parentId)\n                }\n\n                ID_HISTORY -> return populateHistory()\n\n                else -> throw parseError(parentId)\n            }\n        } catch (e: ContentNotAvailableException) {\n            return Single.error(e)\n        }\n    }\n\n    private fun createRootMediaItem(\n        mediaId: String?,\n        folderName: String?,\n        @DrawableRes iconResId: Int\n    ): MediaBrowserCompat.MediaItem {\n        val builder = MediaDescriptionCompat.Builder()\n        builder.setMediaId(mediaId)\n        builder.setTitle(folderName)\n        val resources = context.resources\n        builder.setIconUri(\n            Uri.Builder()\n                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)\n                .authority(resources.getResourcePackageName(iconResId))\n                .appendPath(resources.getResourceTypeName(iconResId))\n                .appendPath(resources.getResourceEntryName(iconResId))\n                .build()\n        )\n\n        val extras = Bundle()\n        extras.putString(\n            MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE,\n            context.getString(R.string.app_name)\n        )\n        builder.setExtras(extras)\n        return MediaBrowserCompat.MediaItem(\n            builder.build(),\n            MediaBrowserCompat.MediaItem.FLAG_BROWSABLE\n        )\n    }\n\n    private fun createPlaylistMediaItem(playlist: PlaylistLocalItem): MediaBrowserCompat.MediaItem {\n        val builder = MediaDescriptionCompat.Builder()\n        builder\n            .setMediaId(createMediaIdForInfoItem(playlist is PlaylistRemoteEntity, playlist.uid))\n            .setTitle(playlist.orderingName)\n            .setIconUri(imageUriOrNullIfDisabled(playlist.thumbnailUrl))\n\n        val extras = Bundle()\n        extras.putString(\n            MediaConstants.DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE,\n            context.resources.getString(R.string.tab_bookmarks)\n        )\n        builder.setExtras(extras)\n        return MediaBrowserCompat.MediaItem(\n            builder.build(),\n            MediaBrowserCompat.MediaItem.FLAG_BROWSABLE\n        )\n    }\n\n    private fun createInfoItemMediaItem(item: InfoItem): MediaBrowserCompat.MediaItem? {\n        val builder = MediaDescriptionCompat.Builder()\n        builder.setMediaId(createMediaIdForInfoItem(item))\n            .setTitle(item.name)\n\n        when (item.infoType) {\n            InfoType.STREAM -> builder.setSubtitle((item as StreamInfoItem).uploaderName)\n            InfoType.PLAYLIST -> builder.setSubtitle((item as PlaylistInfoItem).uploaderName)\n            InfoType.CHANNEL -> builder.setSubtitle((item as ChannelInfoItem).description)\n            else -> return null\n        }\n\n        ImageStrategy.choosePreferredImage(item.thumbnails)?.let {\n            builder.setIconUri(imageUriOrNullIfDisabled(it))\n        }\n\n        return MediaBrowserCompat.MediaItem(\n            builder.build(),\n            MediaBrowserCompat.MediaItem.FLAG_PLAYABLE\n        )\n    }\n\n    private fun buildMediaId(): Uri.Builder {\n        return Uri.Builder().authority(ID_AUTHORITY)\n    }\n\n    private fun buildPlaylistMediaId(playlistType: String?): Uri.Builder {\n        return buildMediaId()\n            .appendPath(ID_BOOKMARKS)\n            .appendPath(playlistType)\n    }\n\n    private fun buildLocalPlaylistItemMediaId(isRemote: Boolean, playlistId: Long): Uri.Builder {\n        return buildPlaylistMediaId(if (isRemote) ID_REMOTE else ID_LOCAL)\n            .appendPath(playlistId.toString())\n    }\n\n    private fun buildInfoItemMediaId(item: InfoItem): Uri.Builder {\n        return buildMediaId()\n            .appendPath(ID_INFO_ITEM)\n            .appendPath(infoItemTypeToString(item.infoType))\n            .appendPath(item.serviceId.toString())\n            .appendQueryParameter(ID_URL, item.url)\n    }\n\n    private fun createMediaIdForInfoItem(isRemote: Boolean, playlistId: Long): String {\n        return buildLocalPlaylistItemMediaId(isRemote, playlistId)\n            .build().toString()\n    }\n\n    private fun createLocalPlaylistStreamMediaItem(\n        playlistId: Long,\n        item: PlaylistStreamEntry,\n        index: Int\n    ): MediaBrowserCompat.MediaItem {\n        val builder = MediaDescriptionCompat.Builder()\n        builder.setMediaId(createMediaIdForPlaylistIndex(false, playlistId, index))\n            .setTitle(item.streamEntity.title)\n            .setSubtitle(item.streamEntity.uploader)\n            .setIconUri(imageUriOrNullIfDisabled(item.streamEntity.thumbnailUrl))\n\n        return MediaBrowserCompat.MediaItem(\n            builder.build(),\n            MediaBrowserCompat.MediaItem.FLAG_PLAYABLE\n        )\n    }\n\n    private fun createRemotePlaylistStreamMediaItem(\n        playlistId: Long,\n        item: StreamInfoItem,\n        index: Int\n    ): MediaBrowserCompat.MediaItem {\n        val builder = MediaDescriptionCompat.Builder()\n        builder.setMediaId(createMediaIdForPlaylistIndex(true, playlistId, index))\n            .setTitle(item.name)\n            .setSubtitle(item.uploaderName)\n\n        ImageStrategy.choosePreferredImage(item.thumbnails)?.let {\n            builder.setIconUri(imageUriOrNullIfDisabled(it))\n        }\n\n        return MediaBrowserCompat.MediaItem(\n            builder.build(),\n            MediaBrowserCompat.MediaItem.FLAG_PLAYABLE\n        )\n    }\n\n    private fun createMediaIdForPlaylistIndex(\n        isRemote: Boolean,\n        playlistId: Long,\n        index: Int\n    ): String {\n        return buildLocalPlaylistItemMediaId(isRemote, playlistId)\n            .appendPath(index.toString())\n            .build().toString()\n    }\n\n    private fun createMediaIdForInfoItem(item: InfoItem): String {\n        return buildInfoItemMediaId(item).build().toString()\n    }\n\n    private fun populateHistory(): Single<List<MediaBrowserCompat.MediaItem>> {\n        val history = database.streamHistoryDAO().history.firstOrError()\n        return history.map { items ->\n            items.map { this.createHistoryMediaItem(it) }\n        }\n    }\n\n    private fun createHistoryMediaItem(streamHistoryEntry: StreamHistoryEntry): MediaBrowserCompat.MediaItem {\n        val builder = MediaDescriptionCompat.Builder()\n        val mediaId = buildMediaId()\n            .appendPath(ID_HISTORY)\n            .appendPath(streamHistoryEntry.streamId.toString())\n            .build().toString()\n        builder.setMediaId(mediaId)\n            .setTitle(streamHistoryEntry.streamEntity.title)\n            .setSubtitle(streamHistoryEntry.streamEntity.uploader)\n            .setIconUri(imageUriOrNullIfDisabled(streamHistoryEntry.streamEntity.thumbnailUrl))\n\n        return MediaBrowserCompat.MediaItem(\n            builder.build(),\n            MediaBrowserCompat.MediaItem.FLAG_PLAYABLE\n        )\n    }\n\n    private fun getMergedPlaylists(): Flowable<MutableList<PlaylistLocalItem>> {\n        return MergedPlaylistManager.getMergedOrderedPlaylists(\n            LocalPlaylistManager(database),\n            RemotePlaylistManager(database)\n        )\n    }\n\n    private fun populateBookmarks(): Single<List<MediaBrowserCompat.MediaItem>> {\n        val playlists = getMergedPlaylists().firstOrError()\n        return playlists.map { playlist ->\n            playlist.map { this.createPlaylistMediaItem(it) }\n        }\n    }\n\n    private fun populateLocalPlaylist(playlistId: Long): Single<List<MediaBrowserCompat.MediaItem>> {\n        val playlist = LocalPlaylistManager(database).getPlaylistStreams(playlistId).firstOrError()\n        return playlist.map { items ->\n            items.mapIndexed { index, item ->\n                createLocalPlaylistStreamMediaItem(playlistId, item, index)\n            }\n        }\n    }\n\n    private fun populateRemotePlaylist(playlistId: Long): Single<List<MediaBrowserCompat.MediaItem>> {\n        return RemotePlaylistManager(database).getPlaylist(playlistId).firstOrError()\n            .flatMap { ExtractorHelper.getPlaylistInfo(it.serviceId, it.url, false) }\n            .map {\n                // ignore it.errors, i.e. ignore errors about specific items, since there would\n                // be no way to show the error properly in Android Auto anyway\n                it.relatedItems.mapIndexed { index, item ->\n                    createRemotePlaylistStreamMediaItem(playlistId, item, index)\n                }\n            }\n    }\n    //endregion\n\n    //region Search\n    fun onSearch(\n        query: String,\n        result: Result<List<MediaBrowserCompat.MediaItem>>\n    ) {\n        if (DEBUG) {\n            Log.d(TAG, \"onSearch($query)\")\n        }\n\n        result.detach() // allows sendResult() to happen later\n        disposables.add(\n            searchMusicBySongTitle(query)\n                // ignore it.errors, i.e. ignore errors about specific items, since there would\n                // be no way to show the error properly in Android Auto anyway\n                .map { it.relatedItems.mapNotNull(this::createInfoItemMediaItem) }\n                .subscribeOn(Schedulers.io())\n                .subscribe(\n                    { result.sendResult(it) },\n                    { throwable ->\n                        // null indicates an error, see the docs of MediaSessionCompat.onSearch()\n                        result.sendResult(null)\n                        Log.e(TAG, \"Search error for query=\\\"$query\\\": $throwable\")\n                    }\n                )\n        )\n    }\n\n    private fun searchMusicBySongTitle(query: String?): Single<SearchInfo> {\n        val serviceId = ServiceHelper.getSelectedServiceId(context)\n        return ExtractorHelper.searchFor(serviceId, query, listOf(), \"\")\n    }\n    //endregion\n\n    companion object {\n        private val TAG: String = MediaBrowserImpl::class.java.getSimpleName()\n\n        fun imageUriOrNullIfDisabled(url: String?): Uri? {\n            return if (ImageStrategy.shouldLoadImages()) {\n                url?.toUri()\n            } else {\n                null\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserPlaybackPreparer.kt",
    "content": "package org.schabi.newpipe.player.mediabrowser\n\nimport android.content.Context\nimport android.net.Uri\nimport android.os.Bundle\nimport android.os.ResultReceiver\nimport android.support.v4.media.session.PlaybackStateCompat\nimport android.util.Log\nimport androidx.core.content.ContextCompat\nimport androidx.core.net.toUri\nimport com.google.android.exoplayer2.Player\nimport com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector.PlaybackPreparer\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.core.Single\nimport io.reactivex.rxjava3.disposables.Disposable\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport java.util.function.BiConsumer\nimport java.util.function.Consumer\nimport org.schabi.newpipe.MainActivity\nimport org.schabi.newpipe.NewPipeDatabase\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.error.ErrorInfo\nimport org.schabi.newpipe.extractor.InfoItem.InfoType\nimport org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException\nimport org.schabi.newpipe.extractor.linkhandler.ListLinkHandler\nimport org.schabi.newpipe.local.playlist.LocalPlaylistManager\nimport org.schabi.newpipe.local.playlist.RemotePlaylistManager\nimport org.schabi.newpipe.player.playqueue.ChannelTabPlayQueue\nimport org.schabi.newpipe.player.playqueue.PlayQueue\nimport org.schabi.newpipe.player.playqueue.PlaylistPlayQueue\nimport org.schabi.newpipe.player.playqueue.SinglePlayQueue\nimport org.schabi.newpipe.util.ChannelTabHelper\nimport org.schabi.newpipe.util.ExtractorHelper\nimport org.schabi.newpipe.util.NavigationHelper\n\n/**\n * This class is used to cleanly separate the Service implementation (in\n * [org.schabi.newpipe.player.PlayerService]) and the playback preparer implementation (in this\n * file). We currently use the playback preparer only in conjunction with the media browser: the\n * playback preparer will receive the media URLs generated by [MediaBrowserImpl] and will start\n * playback of the corresponding streams or playlists.\n *\n * @param setMediaSessionError takes an error String and an error code from [PlaybackStateCompat],\n * calls `sessionConnector.setCustomErrorMessage(errorString, errorCode)`\n * @param clearMediaSessionError calls `sessionConnector.setCustomErrorMessage(null)`\n * @param onPrepare takes playWhenReady, calls `player.prepare()`; this is needed because\n * `MediaSessionConnector`'s `onPlay()` method calls this class'  [onPrepare] instead of\n * `player.prepare()` if the playback preparer is not null, but we want the original behavior\n */\nclass MediaBrowserPlaybackPreparer(\n    private val context: Context,\n    private val setMediaSessionError: BiConsumer<CharSequence, Int>, // error string, error code\n    private val clearMediaSessionError: Runnable,\n    private val onPrepare: Consumer<Boolean>\n) : PlaybackPreparer {\n    private val database = NewPipeDatabase.getInstance(context)\n    private var disposable: Disposable? = null\n\n    fun dispose() {\n        disposable?.dispose()\n    }\n\n    //region Overrides\n    override fun getSupportedPrepareActions(): Long {\n        return PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID\n    }\n\n    override fun onPrepare(playWhenReady: Boolean) {\n        onPrepare.accept(playWhenReady)\n    }\n\n    override fun onPrepareFromMediaId(mediaId: String, playWhenReady: Boolean, extras: Bundle?) {\n        if (MainActivity.DEBUG) {\n            Log.d(TAG, \"onPrepareFromMediaId($mediaId, $playWhenReady, $extras)\")\n        }\n\n        disposable?.dispose()\n        disposable = extractPlayQueueFromMediaId(mediaId)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .subscribe(\n                { playQueue ->\n                    clearMediaSessionError.run()\n                    NavigationHelper.playOnBackgroundPlayer(context, playQueue, playWhenReady)\n                },\n                { throwable ->\n                    Log.e(TAG, \"Failed to start playback of media ID [$mediaId]\", throwable)\n                    onPrepareError(throwable)\n                }\n            )\n    }\n\n    override fun onPrepareFromSearch(query: String, playWhenReady: Boolean, extras: Bundle?) {\n        onUnsupportedError()\n    }\n\n    override fun onPrepareFromUri(uri: Uri, playWhenReady: Boolean, extras: Bundle?) {\n        onUnsupportedError()\n    }\n\n    override fun onCommand(\n        player: Player,\n        command: String,\n        extras: Bundle?,\n        cb: ResultReceiver?\n    ): Boolean {\n        return false\n    }\n    //endregion\n\n    //region Errors\n    private fun onUnsupportedError() {\n        setMediaSessionError.accept(\n            ContextCompat.getString(context, R.string.content_not_supported),\n            PlaybackStateCompat.ERROR_CODE_NOT_SUPPORTED\n        )\n    }\n\n    private fun onPrepareError(throwable: Throwable) {\n        setMediaSessionError.accept(\n            ErrorInfo.getMessage(throwable, null, null).getText(context),\n            PlaybackStateCompat.ERROR_CODE_APP_ERROR\n        )\n    }\n    //endregion\n\n    //region Building play queues from playlists and history\n    private fun extractLocalPlayQueue(playlistId: Long, index: Int): Single<PlayQueue> {\n        return LocalPlaylistManager(database).getPlaylistStreams(playlistId).firstOrError()\n            .map { items -> SinglePlayQueue(items.map { it.toStreamInfoItem() }, index) }\n    }\n\n    private fun extractRemotePlayQueue(playlistId: Long, index: Int): Single<PlayQueue> {\n        return RemotePlaylistManager(database).getPlaylist(playlistId).firstOrError()\n            .flatMap { ExtractorHelper.getPlaylistInfo(it.serviceId, it.url, false) }\n            // ignore info.errors, i.e. ignore errors about specific items, since there would\n            // be no way to show the error properly in Android Auto anyway\n            .map { info -> PlaylistPlayQueue(info, index) }\n    }\n\n    private fun extractPlayQueueFromMediaId(mediaId: String): Single<PlayQueue> {\n        try {\n            val mediaIdUri = mediaId.toUri()\n            val path = ArrayList(mediaIdUri.pathSegments)\n            if (path.isEmpty()) {\n                throw parseError(mediaId)\n            }\n\n            return when (path.removeAt(0)) {\n                ID_BOOKMARKS -> extractPlayQueueFromPlaylistMediaId(\n                    mediaId,\n                    path,\n                    mediaIdUri.getQueryParameter(ID_URL)\n                )\n\n                ID_HISTORY -> extractPlayQueueFromHistoryMediaId(mediaId, path)\n\n                ID_INFO_ITEM -> extractPlayQueueFromInfoItemMediaId(\n                    mediaId,\n                    path,\n                    mediaIdUri.getQueryParameter(ID_URL) ?: throw parseError(mediaId)\n                )\n\n                else -> throw parseError(mediaId)\n            }\n        } catch (e: ContentNotAvailableException) {\n            return Single.error(e)\n        }\n    }\n\n    @Throws(ContentNotAvailableException::class)\n    private fun extractPlayQueueFromPlaylistMediaId(\n        mediaId: String,\n        path: MutableList<String>,\n        url: String?\n    ): Single<PlayQueue> {\n        if (path.isEmpty()) {\n            throw parseError(mediaId)\n        }\n\n        when (val playlistType = path.removeAt(0)) {\n            ID_LOCAL, ID_REMOTE -> {\n                if (path.size != 2) {\n                    throw parseError(mediaId)\n                }\n                val playlistId = path[0].toLong()\n                val index = path[1].toInt()\n                return if (playlistType == ID_LOCAL) {\n                    extractLocalPlayQueue(playlistId, index)\n                } else {\n                    extractRemotePlayQueue(playlistId, index)\n                }\n            }\n\n            ID_URL -> {\n                if (path.size != 1 || url == null) {\n                    throw parseError(mediaId)\n                }\n\n                val serviceId = path[0].toInt()\n                return ExtractorHelper.getPlaylistInfo(serviceId, url, false)\n                    .map { PlaylistPlayQueue(it) }\n            }\n\n            else -> throw parseError(mediaId)\n        }\n    }\n\n    @Throws(ContentNotAvailableException::class)\n    private fun extractPlayQueueFromHistoryMediaId(\n        mediaId: String,\n        path: List<String>\n    ): Single<PlayQueue> {\n        if (path.size != 1) {\n            throw parseError(mediaId)\n        }\n\n        val streamId = path[0].toLong()\n        return database.streamHistoryDAO().history\n            .firstOrError()\n            .map { items ->\n                val infoItems = items\n                    .filter { it.streamId == streamId }\n                    .map { it.toStreamInfoItem() }\n                SinglePlayQueue(infoItems, 0)\n            }\n    }\n\n    @Throws(ContentNotAvailableException::class)\n    private fun extractPlayQueueFromInfoItemMediaId(\n        mediaId: String,\n        path: List<String>,\n        url: String\n    ): Single<PlayQueue> {\n        if (path.size != 2) {\n            throw parseError(mediaId)\n        }\n\n        val serviceId = path[1].toInt()\n        return when (infoItemTypeFromString(path[0])) {\n            InfoType.STREAM -> ExtractorHelper.getStreamInfo(serviceId, url, false)\n                .map { SinglePlayQueue(it) }\n\n            InfoType.PLAYLIST -> ExtractorHelper.getPlaylistInfo(serviceId, url, false)\n                .map { PlaylistPlayQueue(it) }\n\n            InfoType.CHANNEL -> ExtractorHelper.getChannelInfo(serviceId, url, false)\n                .map { info ->\n                    val playableTab = info.tabs\n                        .firstOrNull { ChannelTabHelper.isStreamsTab(it) }\n                        ?: throw ContentNotAvailableException(\"No streams tab found\")\n                    return@map ChannelTabPlayQueue(serviceId, ListLinkHandler(playableTab))\n                }\n\n            else -> throw parseError(mediaId)\n        }\n    }\n    //endregion\n\n    companion object {\n        private val TAG = MediaBrowserPlaybackPreparer::class.simpleName\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediabrowser/PackageValidator.kt",
    "content": "/*\n * Copyright 2018 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// THIS FILE WAS TAKEN FROM UAMP, EXCEPT FOR THINGS RELATED TO THE WHITELIST. UPDATE IT WHEN NEEDED.\n// https://github.com/android/uamp/blob/329a21b63c247e9bd35f6858d4fc0e448fa38603/common/src/main/java/com/example/android/uamp/media/PackageValidator.kt\n\npackage org.schabi.newpipe.player.mediabrowser\n\nimport android.Manifest.permission.MEDIA_CONTENT_CONTROL\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.content.pm.PackageInfo\nimport android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED\nimport android.content.pm.PackageManager\nimport android.os.Process\nimport android.support.v4.media.session.MediaSessionCompat\nimport android.util.Log\nimport androidx.core.app.NotificationManagerCompat\nimport androidx.media.MediaBrowserServiceCompat\nimport java.security.MessageDigest\nimport java.security.NoSuchAlgorithmException\nimport org.schabi.newpipe.BuildConfig\n\n/**\n * Validates that the calling package is authorized to browse a [MediaBrowserServiceCompat].\n *\n * The list of allowed signing certificates and their corresponding package names is defined in\n * res/xml/allowed_media_browser_callers.xml.\n *\n * If you want to add a new caller to allowed_media_browser_callers.xml and you don't know\n * its signature, this class will print to logcat (INFO level) a message with the proper\n * xml tags to add to allow the caller.\n *\n * For more information, see res/xml/allowed_media_browser_callers.xml.\n */\ninternal class PackageValidator(context: Context) {\n    private val context: Context = context.applicationContext\n    private val packageManager: PackageManager = this.context.packageManager\n    private val platformSignature: String = getSystemSignature()\n    private val callerChecked = mutableMapOf<String, Pair<Int, Boolean>>()\n\n    /**\n     * Checks whether the caller attempting to connect to a [MediaBrowserServiceCompat] is known.\n     * See [MusicService.onGetRoot] for where this is utilized.\n     *\n     * @param callingPackage The package name of the caller.\n     * @param callingUid The user id of the caller.\n     * @return `true` if the caller is known, `false` otherwise.\n     */\n    fun isKnownCaller(callingPackage: String, callingUid: Int): Boolean {\n        // If the caller has already been checked, return the previous result here.\n        val (checkedUid, checkResult) = callerChecked[callingPackage] ?: Pair(0, false)\n        if (checkedUid == callingUid) {\n            return checkResult\n        }\n\n        /**\n         * Because some of these checks can be slow, we save the results in [callerChecked] after\n         * this code is run.\n         *\n         * In particular, there's little reason to recompute the calling package's certificate\n         * signature (SHA-256) each call.\n         *\n         * This is safe to do as we know the UID matches the package's UID (from the check above),\n         * and app UIDs are set at install time. Additionally, a package name + UID is guaranteed to\n         * be constant until a reboot. (After a reboot then a previously assigned UID could be\n         * reassigned.)\n         */\n\n        // Build the caller info for the rest of the checks here.\n        val callerPackageInfo = buildCallerInfo(callingPackage)\n            ?: error(\"Caller wasn't found in the system?\")\n\n        // Verify that things aren't ... broken. (This test should always pass.)\n        check(callerPackageInfo.uid == callingUid) {\n            \"Caller's package UID doesn't match caller's actual UID?\"\n        }\n\n        val callerSignature = callerPackageInfo.signature\n\n        val isCallerKnown = when {\n            // If it's our own app making the call, allow it.\n            callingUid == Process.myUid() -> true\n\n            // If the system is making the call, allow it.\n            callingUid == Process.SYSTEM_UID -> true\n\n            // If the app was signed by the same certificate as the platform itself, also allow it.\n            callerSignature == platformSignature -> true\n\n            /*\n             * [MEDIA_CONTENT_CONTROL] permission is only available to system applications, and\n             * while it isn't required to allow these apps to connect to a\n             * [MediaBrowserServiceCompat], allowing this ensures optimal compatability with apps\n             * such as Android TV and the Google Assistant.\n             */\n            callerPackageInfo.permissions.contains(MEDIA_CONTENT_CONTROL) -> true\n\n            /*\n             * If the calling app has a notification listener it is able to retrieve notifications\n             * and can connect to an active [MediaSessionCompat].\n             *\n             * It's not required to allow apps with a notification listener to\n             * connect to your [MediaBrowserServiceCompat], but it does allow easy compatibility\n             * with apps such as Wear OS.\n             */\n            NotificationManagerCompat.getEnabledListenerPackages(this.context)\n                .contains(callerPackageInfo.packageName) -> true\n\n            // If none of the previous checks succeeded, then the caller is unrecognized.\n            else -> false\n        }\n\n        if (!isCallerKnown) {\n            logUnknownCaller(callerPackageInfo)\n        }\n\n        // Save our work for next time.\n        callerChecked[callingPackage] = Pair(callingUid, isCallerKnown)\n        return isCallerKnown\n    }\n\n    /**\n     * Logs an info level message with details of how to add a caller to the allowed callers list\n     * when the app is debuggable.\n     */\n    private fun logUnknownCaller(callerPackageInfo: CallerPackageInfo) {\n        if (BuildConfig.DEBUG) {\n            Log.w(TAG, \"Unknown caller $callerPackageInfo\")\n        }\n    }\n\n    /**\n     * Builds a [CallerPackageInfo] for a given package that can be used for all the\n     * various checks that are performed before allowing an app to connect to a\n     * [MediaBrowserServiceCompat].\n     */\n    private fun buildCallerInfo(callingPackage: String): CallerPackageInfo? {\n        val packageInfo = getPackageInfo(callingPackage) ?: return null\n\n        val appName = packageInfo.applicationInfo?.loadLabel(packageManager).toString()\n        val uid = packageInfo.applicationInfo?.uid ?: -1\n        val signature = getSignature(packageInfo)\n\n        val requestedPermissions = packageInfo.requestedPermissions?.asSequence().orEmpty()\n        val permissionFlags = packageInfo.requestedPermissionsFlags?.asSequence().orEmpty()\n        val activePermissions = (requestedPermissions zip permissionFlags)\n            .filter { (permission, flag) -> flag and REQUESTED_PERMISSION_GRANTED != 0 }\n            .mapTo(mutableSetOf()) { (permission, flag) -> permission }\n\n        return CallerPackageInfo(appName, callingPackage, uid, signature, activePermissions.toSet())\n    }\n\n    /**\n     * Looks up the [PackageInfo] for a package name.\n     * This requests both the signatures (for checking if an app is on the allow list) and\n     * the app's permissions, which allow for more flexibility in the allow list.\n     *\n     * @return [PackageInfo] for the package name or null if it's not found.\n     */\n    @Suppress(\"deprecation\")\n    @SuppressLint(\"PackageManagerGetSignatures\")\n    private fun getPackageInfo(callingPackage: String): PackageInfo? = packageManager.getPackageInfo(\n        callingPackage,\n        PackageManager.GET_SIGNATURES or PackageManager.GET_PERMISSIONS\n    )\n\n    /**\n     * Gets the signature of a given package's [PackageInfo].\n     *\n     * The \"signature\" is a SHA-256 hash of the public key of the signing certificate used by\n     * the app.\n     *\n     * If the app is not found, or if the app does not have exactly one signature, this method\n     * returns `null` as the signature.\n     */\n    @Suppress(\"deprecation\")\n    private fun getSignature(packageInfo: PackageInfo): String? = if (packageInfo.signatures == null || packageInfo.signatures!!.size != 1) {\n        // Security best practices dictate that an app should be signed with exactly one (1)\n        // signature. Because of this, if there are multiple signatures, reject it.\n        null\n    } else {\n        val certificate = packageInfo.signatures!![0].toByteArray()\n        getSignatureSha256(certificate)\n    }\n\n    /**\n     * Finds the Android platform signing key signature. This key is never null.\n     */\n    private fun getSystemSignature(): String = getPackageInfo(ANDROID_PLATFORM)?.let { platformInfo ->\n        getSignature(platformInfo)\n    } ?: error(\"Platform signature not found\")\n\n    /**\n     * Creates a SHA-256 signature given a certificate byte array.\n     */\n    private fun getSignatureSha256(certificate: ByteArray): String {\n        val md: MessageDigest\n        try {\n            md = MessageDigest.getInstance(\"SHA256\")\n        } catch (noSuchAlgorithmException: NoSuchAlgorithmException) {\n            Log.e(TAG, \"No such algorithm: $noSuchAlgorithmException\")\n            throw RuntimeException(\"Could not find SHA256 hash algorithm\", noSuchAlgorithmException)\n        }\n        md.update(certificate)\n\n        // This code takes the byte array generated by `md.digest()` and joins each of the bytes\n        // to a string, applying the string format `%02x` on each digit before it's appended, with\n        // a colon (':') between each of the items.\n        // For example: input=[0,2,4,6,8,10,12], output=\"00:02:04:06:08:0a:0c\"\n        return md.digest().joinToString(\":\") { String.format(\"%02x\", it) }\n    }\n\n    /**\n     * Convenience class to hold all of the information about an app that's being checked\n     * to see if it's a known caller.\n     */\n    private data class CallerPackageInfo(\n        val name: String,\n        val packageName: String,\n        val uid: Int,\n        val signature: String?,\n        val permissions: Set<String>\n    )\n}\n\nprivate const val TAG = \"PackageValidator\"\nprivate const val ANDROID_PLATFORM = \"android\"\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediaitem/ExceptionTag.java",
    "content": "package org.schabi.newpipe.player.mediaitem;\n\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamType;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.util.image.ImageStrategy;\n\nimport java.util.List;\nimport java.util.Optional;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\n/**\n * This {@link MediaItemTag} object is designed to contain metadata for a stream\n * that has failed to load. It supplies metadata from an underlying\n * {@link PlayQueueItem}, which is used by the internal players to resolve actual\n * playback info.\n *\n * This {@link MediaItemTag} does not contain any {@link StreamInfo} that can be\n * used to start playback and can be detected by checking {@link ExceptionTag#getErrors()}\n * when in generic form.\n **/\npublic final class ExceptionTag implements MediaItemTag {\n    @NonNull\n    private final PlayQueueItem item;\n    @NonNull\n    private final List<Exception> errors;\n    @Nullable\n    private final Object extras;\n\n    private ExceptionTag(@NonNull final PlayQueueItem item,\n                         @NonNull final List<Exception> errors,\n                         @Nullable final Object extras) {\n        this.item = item;\n        this.errors = errors;\n        this.extras = extras;\n    }\n\n    public static ExceptionTag of(@NonNull final PlayQueueItem playQueueItem,\n                                  @NonNull final List<Exception> errors) {\n        return new ExceptionTag(playQueueItem, errors, null);\n    }\n\n    @NonNull\n    @Override\n    public List<Exception> getErrors() {\n        return errors;\n    }\n\n    @Override\n    public int getServiceId() {\n        return item.getServiceId();\n    }\n\n    @Override\n    public String getTitle() {\n        return item.getTitle();\n    }\n\n    @Override\n    public String getUploaderName() {\n        return item.getUploader();\n    }\n\n    @Override\n    public long getDurationSeconds() {\n        return item.getDuration();\n    }\n\n    @Override\n    public String getStreamUrl() {\n        return item.getUrl();\n    }\n\n    @Override\n    public String getThumbnailUrl() {\n        return ImageStrategy.choosePreferredImage(item.getThumbnails());\n    }\n\n    @Override\n    public String getUploaderUrl() {\n        return item.getUploaderUrl();\n    }\n\n    @Override\n    public StreamType getStreamType() {\n        return item.getStreamType();\n    }\n\n    @Override\n    public <T> Optional<T> getMaybeExtras(@NonNull final Class<T> type) {\n        return Optional.ofNullable(extras).map(type::cast);\n    }\n\n    @Override\n    public <T> MediaItemTag withExtras(@NonNull final T extra) {\n        return new ExceptionTag(item, errors, extra);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediaitem/MediaItemTag.java",
    "content": "package org.schabi.newpipe.player.mediaitem;\n\nimport android.net.Uri;\n\nimport com.google.android.exoplayer2.MediaItem;\nimport com.google.android.exoplayer2.MediaItem.RequestMetadata;\nimport com.google.android.exoplayer2.MediaMetadata;\nimport com.google.android.exoplayer2.Player;\n\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamType;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\n\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.UUID;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\n/**\n * Metadata container and accessor used by player internals.\n *\n * This interface ensures consistency of fetching metadata on each stream,\n * which is encapsulated in a {@link MediaItem} and delivered via ExoPlayer's\n * {@link Player.Listener} on event triggers to the downstream users.\n **/\npublic interface MediaItemTag {\n\n    List<Exception> getErrors();\n\n    int getServiceId();\n\n    String getTitle();\n\n    String getUploaderName();\n\n    long getDurationSeconds();\n\n    String getStreamUrl();\n\n    String getThumbnailUrl();\n\n    String getUploaderUrl();\n\n    StreamType getStreamType();\n\n    @NonNull\n    default Optional<StreamInfo> getMaybeStreamInfo() {\n        return Optional.empty();\n    }\n\n    @NonNull\n    default Optional<Quality> getMaybeQuality() {\n        return Optional.empty();\n    }\n\n    @NonNull\n    default Optional<AudioTrack> getMaybeAudioTrack() {\n        return Optional.empty();\n    }\n\n    <T> Optional<T> getMaybeExtras(@NonNull Class<T> type);\n\n    <T> MediaItemTag withExtras(@NonNull T extra);\n\n    @NonNull\n    static Optional<MediaItemTag> from(@Nullable final MediaItem mediaItem) {\n        return Optional.ofNullable(mediaItem)\n                .map(item -> item.localConfiguration)\n                .map(localConfiguration -> localConfiguration.tag)\n                .filter(MediaItemTag.class::isInstance)\n                .map(MediaItemTag.class::cast);\n    }\n\n    @NonNull\n    default String makeMediaId() {\n        return UUID.randomUUID().toString() + \"[\" + getTitle() + \"]\";\n    }\n\n    @NonNull\n    default MediaItem asMediaItem() {\n        final String thumbnailUrl = getThumbnailUrl();\n        final MediaMetadata mediaMetadata = new MediaMetadata.Builder()\n                .setArtworkUri(thumbnailUrl == null ? null : Uri.parse(thumbnailUrl))\n                .setArtist(getUploaderName())\n                .setDescription(getTitle())\n                .setDisplayTitle(getTitle())\n                .setTitle(getTitle())\n                .build();\n\n        final RequestMetadata requestMetaData = new RequestMetadata.Builder()\n                .setMediaUri(Uri.parse(getStreamUrl()))\n                .build();\n\n        return MediaItem.fromUri(getStreamUrl())\n                .buildUpon()\n                .setMediaId(makeMediaId())\n                .setMediaMetadata(mediaMetadata)\n                .setRequestMetadata(requestMetaData)\n                .setTag(this)\n                .build();\n    }\n\n    final class Quality {\n        @NonNull\n        private final List<VideoStream> sortedVideoStreams;\n        private final int selectedVideoStreamIndex;\n\n        private Quality(@NonNull final List<VideoStream> sortedVideoStreams,\n                        final int selectedVideoStreamIndex) {\n            this.sortedVideoStreams = sortedVideoStreams;\n            this.selectedVideoStreamIndex = selectedVideoStreamIndex;\n        }\n\n        static Quality of(@NonNull final List<VideoStream> sortedVideoStreams,\n                          final int selectedVideoStreamIndex) {\n            return new Quality(sortedVideoStreams, selectedVideoStreamIndex);\n        }\n\n        @NonNull\n        public List<VideoStream> getSortedVideoStreams() {\n            return sortedVideoStreams;\n        }\n\n        public int getSelectedVideoStreamIndex() {\n            return selectedVideoStreamIndex;\n        }\n\n        @Nullable\n        public VideoStream getSelectedVideoStream() {\n            return selectedVideoStreamIndex < 0\n                    || selectedVideoStreamIndex >= sortedVideoStreams.size()\n                    ? null : sortedVideoStreams.get(selectedVideoStreamIndex);\n        }\n    }\n\n    final class AudioTrack {\n        @NonNull\n        private final List<AudioStream> audioStreams;\n        private final int selectedAudioStreamIndex;\n\n        private AudioTrack(@NonNull final List<AudioStream> audioStreams,\n                           final int selectedAudioStreamIndex) {\n            this.audioStreams = audioStreams;\n            this.selectedAudioStreamIndex = selectedAudioStreamIndex;\n        }\n\n        static AudioTrack of(@NonNull final List<AudioStream> audioStreams,\n                             final int selectedAudioStreamIndex) {\n            return new AudioTrack(audioStreams, selectedAudioStreamIndex);\n        }\n\n        @NonNull\n        public List<AudioStream> getAudioStreams() {\n            return audioStreams;\n        }\n\n        public int getSelectedAudioStreamIndex() {\n            return selectedAudioStreamIndex;\n        }\n\n        @Nullable\n        public AudioStream getSelectedAudioStream() {\n            return selectedAudioStreamIndex < 0\n                    || selectedAudioStreamIndex >= audioStreams.size()\n                    ? null : audioStreams.get(selectedAudioStreamIndex);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediaitem/PlaceholderTag.java",
    "content": "package org.schabi.newpipe.player.mediaitem;\n\nimport org.schabi.newpipe.extractor.stream.StreamType;\nimport org.schabi.newpipe.util.Constants;\n\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Optional;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\n/**\n * This is a Placeholding {@link MediaItemTag}, designed as a dummy metadata object for\n * any stream that has not been resolved.\n *\n * This object cannot be instantiated and does not hold real metadata of any form.\n * */\npublic final class PlaceholderTag implements MediaItemTag {\n    public static final PlaceholderTag EMPTY = new PlaceholderTag(null);\n    private static final String UNKNOWN_VALUE_INTERNAL = \"Placeholder\";\n\n    @Nullable\n    private final Object extras;\n\n    private PlaceholderTag(@Nullable final Object extras) {\n        this.extras = extras;\n    }\n\n    @NonNull\n    @Override\n    public List<Exception> getErrors() {\n        return Collections.emptyList();\n    }\n\n    @Override\n    public int getServiceId() {\n        return Constants.NO_SERVICE_ID;\n    }\n\n    @Override\n    public String getTitle() {\n        return UNKNOWN_VALUE_INTERNAL;\n    }\n\n    @Override\n    public String getUploaderName() {\n        return UNKNOWN_VALUE_INTERNAL;\n    }\n\n    @Override\n    public long getDurationSeconds() {\n        return 0;\n    }\n\n    @Override\n    public String getStreamUrl() {\n        return UNKNOWN_VALUE_INTERNAL;\n    }\n\n    @Override\n    public String getThumbnailUrl() {\n        return UNKNOWN_VALUE_INTERNAL;\n    }\n\n    @Override\n    public String getUploaderUrl() {\n        return UNKNOWN_VALUE_INTERNAL;\n    }\n\n    @Override\n    public StreamType getStreamType() {\n        return StreamType.NONE;\n    }\n\n    @Override\n    public <T> Optional<T> getMaybeExtras(@NonNull final Class<T> type) {\n        return Optional.ofNullable(extras).map(type::cast);\n    }\n\n    @Override\n    public <T> MediaItemTag withExtras(@NonNull final T extra) {\n        return new PlaceholderTag(extra);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediaitem/StreamInfoTag.java",
    "content": "package org.schabi.newpipe.player.mediaitem;\n\nimport com.google.android.exoplayer2.MediaItem;\n\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamType;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\nimport org.schabi.newpipe.util.image.ImageStrategy;\n\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Optional;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\n/**\n * This {@link MediaItemTag} object contains metadata for a resolved stream\n * that is ready for playback. This object guarantees the {@link StreamInfo}\n * is available and may provide the {@link Quality} of video stream used in\n * the {@link MediaItem}.\n **/\npublic final class StreamInfoTag implements MediaItemTag {\n    @NonNull\n    private final StreamInfo streamInfo;\n    @Nullable\n    private final MediaItemTag.Quality quality;\n    @Nullable\n    private final MediaItemTag.AudioTrack audioTrack;\n    @Nullable\n    private final Object extras;\n\n    private StreamInfoTag(@NonNull final StreamInfo streamInfo,\n                          @Nullable final MediaItemTag.Quality quality,\n                          @Nullable final MediaItemTag.AudioTrack audioTrack,\n                          @Nullable final Object extras) {\n        this.streamInfo = streamInfo;\n        this.quality = quality;\n        this.audioTrack = audioTrack;\n        this.extras = extras;\n    }\n\n    public static StreamInfoTag of(@NonNull final StreamInfo streamInfo,\n                                   @NonNull final List<VideoStream> sortedVideoStreams,\n                                   final int selectedVideoStreamIndex,\n                                   @NonNull final List<AudioStream> audioStreams,\n                                   final int selectedAudioStreamIndex) {\n        final Quality quality = Quality.of(sortedVideoStreams, selectedVideoStreamIndex);\n        final AudioTrack audioTrack =\n                AudioTrack.of(audioStreams, selectedAudioStreamIndex);\n        return new StreamInfoTag(streamInfo, quality, audioTrack, null);\n    }\n\n    public static StreamInfoTag of(@NonNull final StreamInfo streamInfo,\n                                   @NonNull final List<AudioStream> audioStreams,\n                                   final int selectedAudioStreamIndex) {\n        final AudioTrack audioTrack =\n                AudioTrack.of(audioStreams, selectedAudioStreamIndex);\n        return new StreamInfoTag(streamInfo, null, audioTrack, null);\n    }\n\n    public static StreamInfoTag of(@NonNull final StreamInfo streamInfo) {\n        return new StreamInfoTag(streamInfo, null, null, null);\n    }\n\n    @Override\n    public List<Exception> getErrors() {\n        return Collections.emptyList();\n    }\n\n    @Override\n    public int getServiceId() {\n        return streamInfo.getServiceId();\n    }\n\n    @Override\n    public String getTitle() {\n        return streamInfo.getName();\n    }\n\n    @Override\n    public String getUploaderName() {\n        return streamInfo.getUploaderName();\n    }\n\n    @Override\n    public long getDurationSeconds() {\n        return streamInfo.getDuration();\n    }\n\n    @Override\n    public String getStreamUrl() {\n        return streamInfo.getUrl();\n    }\n\n    @Override\n    public String getThumbnailUrl() {\n        return ImageStrategy.choosePreferredImage(streamInfo.getThumbnails());\n    }\n\n    @Override\n    public String getUploaderUrl() {\n        return streamInfo.getUploaderUrl();\n    }\n\n    @Override\n    public StreamType getStreamType() {\n        return streamInfo.getStreamType();\n    }\n\n    @NonNull\n    @Override\n    public Optional<StreamInfo> getMaybeStreamInfo() {\n        return Optional.of(streamInfo);\n    }\n\n    @NonNull\n    @Override\n    public Optional<Quality> getMaybeQuality() {\n        return Optional.ofNullable(quality);\n    }\n\n    @NonNull\n    @Override\n    public Optional<AudioTrack> getMaybeAudioTrack() {\n        return Optional.ofNullable(audioTrack);\n    }\n\n    @Override\n    public <T> Optional<T> getMaybeExtras(@NonNull final Class<T> type) {\n        return Optional.ofNullable(extras).map(type::cast);\n    }\n\n    @Override\n    public StreamInfoTag withExtras(@NonNull final Object extra) {\n        return new StreamInfoTag(streamInfo, quality, audioTrack, extra);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java",
    "content": "package org.schabi.newpipe.player.mediasession;\n\nimport static org.schabi.newpipe.MainActivity.DEBUG;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_RECREATE_NOTIFICATION;\n\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.graphics.Bitmap;\nimport android.os.Build;\nimport android.support.v4.media.MediaMetadataCompat;\nimport android.support.v4.media.session.MediaSessionCompat;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.media.session.MediaButtonReceiver;\n\nimport com.google.android.exoplayer2.ForwardingPlayer;\nimport com.google.android.exoplayer2.Player.RepeatMode;\nimport com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.notification.NotificationActionData;\nimport org.schabi.newpipe.player.notification.NotificationConstants;\nimport org.schabi.newpipe.player.ui.PlayerUi;\nimport org.schabi.newpipe.player.ui.VideoPlayerUi;\nimport org.schabi.newpipe.util.StreamTypeUtil;\n\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\nimport java.util.stream.IntStream;\n\npublic class MediaSessionPlayerUi extends PlayerUi\n        implements SharedPreferences.OnSharedPreferenceChangeListener {\n    private static final String TAG = \"MediaSessUi\";\n\n    @NonNull\n    private final MediaSessionCompat mediaSession;\n    @NonNull\n    private final MediaSessionConnector sessionConnector;\n\n    private final String ignoreHardwareMediaButtonsKey;\n    private boolean shouldIgnoreHardwareMediaButtons = false;\n\n    // used to check whether any notification action changed, before sending costly updates\n    private List<NotificationActionData> prevNotificationActions = List.of();\n\n\n    public MediaSessionPlayerUi(@NonNull final Player player,\n                                @NonNull final MediaSessionCompat mediaSession,\n                                @NonNull final MediaSessionConnector sessionConnector) {\n        super(player);\n        this.mediaSession = mediaSession;\n        this.sessionConnector = sessionConnector;\n        this.ignoreHardwareMediaButtonsKey =\n                context.getString(R.string.ignore_hardware_media_buttons_key);\n    }\n\n    @Override\n    public void initPlayer() {\n        super.initPlayer();\n        destroyPlayer(); // release previously used resources\n\n        mediaSession.setActive(true);\n\n        sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, player));\n        sessionConnector.setPlayer(getForwardingPlayer());\n\n        // It seems like events from the Media Control UI in the notification area don't go through\n        // this function, so it's safe to just ignore all events in case we want to ignore the\n        // hardware media buttons. Returning true stops all further event processing of the system.\n        sessionConnector.setMediaButtonEventHandler((p, i) -> shouldIgnoreHardwareMediaButtons);\n\n        // listen to changes to ignore_hardware_media_buttons_key\n        updateShouldIgnoreHardwareMediaButtons(player.getPrefs());\n        player.getPrefs().registerOnSharedPreferenceChangeListener(this);\n\n        sessionConnector.setMetadataDeduplicationEnabled(true);\n        sessionConnector.setMediaMetadataProvider(exoPlayer -> buildMediaMetadata());\n\n        // force updating media session actions by resetting the previous ones\n        prevNotificationActions = List.of();\n        updateMediaSessionActions();\n    }\n\n    @Override\n    public void destroyPlayer() {\n        super.destroyPlayer();\n        player.getPrefs().unregisterOnSharedPreferenceChangeListener(this);\n        sessionConnector.setMediaButtonEventHandler(null);\n        sessionConnector.setPlayer(null);\n        sessionConnector.setQueueNavigator(null);\n        mediaSession.setActive(false);\n        prevNotificationActions = List.of();\n    }\n\n    @Override\n    public void onThumbnailLoaded(@Nullable final Bitmap bitmap) {\n        super.onThumbnailLoaded(bitmap);\n        // the thumbnail is now loaded: invalidate the metadata to trigger a metadata update\n        sessionConnector.invalidateMediaSessionMetadata();\n    }\n\n\n    @Override\n    public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences,\n                                          final String key) {\n        if (key == null || key.equals(ignoreHardwareMediaButtonsKey)) {\n            updateShouldIgnoreHardwareMediaButtons(sharedPreferences);\n        }\n    }\n\n    public void updateShouldIgnoreHardwareMediaButtons(final SharedPreferences sharedPreferences) {\n        shouldIgnoreHardwareMediaButtons =\n                sharedPreferences.getBoolean(ignoreHardwareMediaButtonsKey, false);\n    }\n\n\n    public void handleMediaButtonIntent(final Intent intent) {\n        MediaButtonReceiver.handleIntent(mediaSession, intent);\n    }\n\n    public Optional<MediaSessionCompat.Token> getSessionToken() {\n        return Optional.ofNullable(mediaSession).map(MediaSessionCompat::getSessionToken);\n    }\n\n\n    private ForwardingPlayer getForwardingPlayer() {\n        // ForwardingPlayer means that all media session actions called on this player are\n        // forwarded directly to the connected exoplayer, except for the overridden methods. So\n        // override play and pause since our player adds more functionality to them over exoplayer.\n        return new ForwardingPlayer(player.getExoPlayer()) {\n            @Override\n            public void play() {\n                player.play();\n                // hide the player controls even if the play command came from the media session\n                player.UIs().get(VideoPlayerUi.class).ifPresent(ui -> ui.hideControls(0, 0));\n            }\n\n            @Override\n            public void pause() {\n                player.pause();\n            }\n        };\n    }\n\n    private MediaMetadataCompat buildMediaMetadata() {\n        if (DEBUG) {\n            Log.d(TAG, \"buildMediaMetadata called\");\n        }\n\n        // set title and artist\n        final MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder()\n                .putString(MediaMetadataCompat.METADATA_KEY_TITLE, player.getVideoTitle())\n                .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, player.getUploaderName());\n\n        // set duration (-1 for livestreams or if unknown, see the METADATA_KEY_DURATION docs)\n        final long duration = player.getCurrentStreamInfo()\n                .filter(info -> !StreamTypeUtil.isLiveStream(info.getStreamType()))\n                .map(info -> info.getDuration() * 1000L)\n                .orElse(-1L);\n        builder.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration);\n\n        // set album art, unless the user asked not to, or there is no thumbnail available\n        final boolean showThumbnail = player.getPrefs().getBoolean(\n                context.getString(R.string.show_thumbnail_key), true);\n        Optional.ofNullable(player.getThumbnail())\n                .filter(bitmap -> showThumbnail)\n                .ifPresent(bitmap -> {\n                    builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, bitmap);\n                    builder.putBitmap(MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON, bitmap);\n                });\n\n        return builder.build();\n    }\n\n\n    private void updateMediaSessionActions() {\n        // On Android 13+ (or Android T or API 33+) the actions in the player notification can't be\n        // controlled directly anymore, but are instead derived from custom media session actions.\n        // However the system allows customizing only two of these actions, since the other three\n        // are fixed to play-pause-buffering, previous, next.\n\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {\n            // Although setting media session actions on older android versions doesn't seem to\n            // cause any trouble, it also doesn't seem to do anything, so we don't do anything to\n            // save battery. Check out NotificationUtil.updateActions() to see what happens on\n            // older android versions.\n            return;\n        }\n\n        if (!mediaSession.isActive()) {\n            // mediaSession will be inactive after destroyPlayer is called\n            return;\n        }\n\n        // only use the fourth and fifth actions (the settings page also shows only the last 2 on\n        // Android 13+)\n        final List<NotificationActionData> newNotificationActions = IntStream.of(3, 4)\n                .map(i -> player.getPrefs().getInt(\n                        player.getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]),\n                        NotificationConstants.SLOT_DEFAULTS[i]))\n                .mapToObj(action -> NotificationActionData\n                        .fromNotificationActionEnum(player, action))\n                .filter(Objects::nonNull)\n                .collect(Collectors.toList());\n\n        // avoid costly notification actions update, if nothing changed from last time\n        if (!newNotificationActions.equals(prevNotificationActions)) {\n            prevNotificationActions = newNotificationActions;\n            sessionConnector.setCustomActionProviders(\n                    newNotificationActions.stream()\n                            .map(data -> new SessionConnectorActionProvider(data, context))\n                            .toArray(SessionConnectorActionProvider[]::new));\n        }\n    }\n\n    @Override\n    public void onBlocked() {\n        super.onBlocked();\n        updateMediaSessionActions();\n    }\n\n    @Override\n    public void onPlaying() {\n        super.onPlaying();\n        updateMediaSessionActions();\n    }\n\n    @Override\n    public void onBuffering() {\n        super.onBuffering();\n        updateMediaSessionActions();\n    }\n\n    @Override\n    public void onPaused() {\n        super.onPaused();\n        updateMediaSessionActions();\n    }\n\n    @Override\n    public void onPausedSeek() {\n        super.onPausedSeek();\n        updateMediaSessionActions();\n    }\n\n    @Override\n    public void onCompleted() {\n        super.onCompleted();\n        updateMediaSessionActions();\n    }\n\n    @Override\n    public void onRepeatModeChanged(@RepeatMode final int repeatMode) {\n        super.onRepeatModeChanged(repeatMode);\n        updateMediaSessionActions();\n    }\n\n    @Override\n    public void onShuffleModeEnabledChanged(final boolean shuffleModeEnabled) {\n        super.onShuffleModeEnabledChanged(shuffleModeEnabled);\n        updateMediaSessionActions();\n    }\n\n    @Override\n    public void onBroadcastReceived(final Intent intent) {\n        super.onBroadcastReceived(intent);\n        if (ACTION_RECREATE_NOTIFICATION.equals(intent.getAction())) {\n            // the notification actions changed\n            updateMediaSessionActions();\n        }\n    }\n\n    @Override\n    public void onMetadataChanged(@NonNull final StreamInfo info) {\n        super.onMetadataChanged(info);\n        updateMediaSessionActions();\n    }\n\n    @Override\n    public void onPlayQueueEdited() {\n        super.onPlayQueueEdited();\n        updateMediaSessionActions();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediasession/PlayQueueNavigator.java",
    "content": "package org.schabi.newpipe.player.mediasession;\n\nimport static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_NEXT;\nimport static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS;\nimport static android.support.v4.media.session.PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM;\n\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.ResultReceiver;\nimport android.support.v4.media.MediaDescriptionCompat;\nimport android.support.v4.media.MediaMetadataCompat;\nimport android.support.v4.media.session.MediaSessionCompat;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;\nimport com.google.android.exoplayer2.util.Util;\n\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.util.image.ImageStrategy;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Optional;\n\npublic class PlayQueueNavigator implements MediaSessionConnector.QueueNavigator {\n    private static final int MAX_QUEUE_SIZE = 10;\n\n    private final MediaSessionCompat mediaSession;\n    private final Player player;\n\n    private long activeQueueItemId;\n\n    public PlayQueueNavigator(@NonNull final MediaSessionCompat mediaSession,\n                              @NonNull final Player player) {\n        this.mediaSession = mediaSession;\n        this.player = player;\n\n        this.activeQueueItemId = MediaSessionCompat.QueueItem.UNKNOWN_ID;\n    }\n\n    @Override\n    public long getSupportedQueueNavigatorActions(\n            @Nullable final com.google.android.exoplayer2.Player exoPlayer) {\n        return ACTION_SKIP_TO_NEXT | ACTION_SKIP_TO_PREVIOUS | ACTION_SKIP_TO_QUEUE_ITEM;\n    }\n\n    @Override\n    public void onTimelineChanged(@NonNull final com.google.android.exoplayer2.Player exoPlayer) {\n        publishFloatingQueueWindow();\n    }\n\n    @Override\n    public void onCurrentMediaItemIndexChanged(\n            @NonNull final com.google.android.exoplayer2.Player exoPlayer) {\n        if (activeQueueItemId == MediaSessionCompat.QueueItem.UNKNOWN_ID\n                || exoPlayer.getCurrentTimeline().getWindowCount() > MAX_QUEUE_SIZE) {\n            publishFloatingQueueWindow();\n        } else if (!exoPlayer.getCurrentTimeline().isEmpty()) {\n            activeQueueItemId = exoPlayer.getCurrentMediaItemIndex();\n        }\n    }\n\n    @Override\n    public long getActiveQueueItemId(\n            @Nullable final com.google.android.exoplayer2.Player exoPlayer) {\n        return Optional.ofNullable(player.getPlayQueue()).map(PlayQueue::getIndex).orElse(-1);\n    }\n\n    @Override\n    public void onSkipToPrevious(@NonNull final com.google.android.exoplayer2.Player exoPlayer) {\n        player.playPrevious();\n    }\n\n    @Override\n    public void onSkipToQueueItem(@NonNull final com.google.android.exoplayer2.Player exoPlayer,\n                                  final long id) {\n        if (player.getPlayQueue() != null) {\n            player.selectQueueItem(player.getPlayQueue().getItem((int) id));\n        }\n    }\n\n    @Override\n    public void onSkipToNext(@NonNull final com.google.android.exoplayer2.Player exoPlayer) {\n        player.playNext();\n    }\n\n    private void publishFloatingQueueWindow() {\n        final int windowCount = Optional.ofNullable(player.getPlayQueue())\n                .map(PlayQueue::size)\n                .orElse(0);\n        if (windowCount == 0) {\n            mediaSession.setQueue(Collections.emptyList());\n            activeQueueItemId = MediaSessionCompat.QueueItem.UNKNOWN_ID;\n            return;\n        }\n\n        // Yes this is almost a copypasta, got a problem with that? =\\\n        final int currentWindowIndex = player.getPlayQueue().getIndex();\n        final int queueSize = Math.min(MAX_QUEUE_SIZE, windowCount);\n        final int startIndex = Util.constrainValue(currentWindowIndex - ((queueSize - 1) / 2), 0,\n                windowCount - queueSize);\n\n        final List<MediaSessionCompat.QueueItem> queue = new ArrayList<>();\n        for (int i = startIndex; i < startIndex + queueSize; i++) {\n            queue.add(new MediaSessionCompat.QueueItem(getQueueMetadata(i), i));\n        }\n        mediaSession.setQueue(queue);\n        activeQueueItemId = currentWindowIndex;\n    }\n\n    public MediaDescriptionCompat getQueueMetadata(final int index) {\n        if (player.getPlayQueue() == null) {\n            return null;\n        }\n        final PlayQueueItem item = player.getPlayQueue().getItem(index);\n        if (item == null) {\n            return null;\n        }\n\n        final MediaDescriptionCompat.Builder descBuilder = new MediaDescriptionCompat.Builder()\n                .setMediaId(String.valueOf(index))\n                .setTitle(item.getTitle())\n                .setSubtitle(item.getUploader());\n\n        // set additional metadata for A2DP/AVRCP (Audio/Video Bluetooth profiles)\n        final Bundle additionalMetadata = new Bundle();\n        additionalMetadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, item.getTitle());\n        additionalMetadata.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, item.getUploader());\n        additionalMetadata\n                .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, item.getDuration() * 1000);\n        additionalMetadata.putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, index + 1L);\n        additionalMetadata\n                .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, player.getPlayQueue().size());\n        descBuilder.setExtras(additionalMetadata);\n\n        try {\n            descBuilder.setIconUri(Uri.parse(\n                    ImageStrategy.choosePreferredImage(item.getThumbnails())));\n        } catch (final Throwable e) {\n            // no thumbnail available at all, or the user disabled image loading,\n            // or the obtained url is not a valid `Uri`\n        }\n\n        return descBuilder.build();\n    }\n\n    @Override\n    public boolean onCommand(@NonNull final com.google.android.exoplayer2.Player exoPlayer,\n                             @NonNull final String command,\n                             @Nullable final Bundle extras,\n                             @Nullable final ResultReceiver cb) {\n        return false;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediasession/SessionConnectorActionProvider.java",
    "content": "package org.schabi.newpipe.player.mediasession;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.v4.media.session.PlaybackStateCompat;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.Player;\nimport com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;\n\nimport org.schabi.newpipe.player.notification.NotificationActionData;\n\nimport java.lang.ref.WeakReference;\n\npublic class SessionConnectorActionProvider implements MediaSessionConnector.CustomActionProvider {\n\n    private final NotificationActionData data;\n    @NonNull\n    private final WeakReference<Context> context;\n\n    public SessionConnectorActionProvider(final NotificationActionData notificationActionData,\n                                          @NonNull final Context context) {\n        this.data = notificationActionData;\n        this.context = new WeakReference<>(context);\n    }\n\n    @Override\n    public void onCustomAction(@NonNull final Player player,\n                               @NonNull final String action,\n                               @Nullable final Bundle extras) {\n        final Context actualContext = context.get();\n        if (actualContext != null) {\n            actualContext.sendBroadcast(new Intent(action));\n        }\n    }\n\n    @Nullable\n    @Override\n    public PlaybackStateCompat.CustomAction getCustomAction(@NonNull final Player player) {\n        return new PlaybackStateCompat.CustomAction.Builder(\n                data.action(), data.name(), data.icon()\n        ).build();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java",
    "content": "package org.schabi.newpipe.player.mediasource;\n\nimport android.util.Log;\n\nimport com.google.android.exoplayer2.MediaItem;\nimport com.google.android.exoplayer2.PlaybackException;\nimport com.google.android.exoplayer2.Timeline;\nimport com.google.android.exoplayer2.source.BaseMediaSource;\nimport com.google.android.exoplayer2.source.MediaPeriod;\nimport com.google.android.exoplayer2.source.SilenceMediaSource;\nimport com.google.android.exoplayer2.source.SinglePeriodTimeline;\nimport com.google.android.exoplayer2.upstream.Allocator;\nimport com.google.android.exoplayer2.upstream.TransferListener;\n\nimport org.schabi.newpipe.player.mediaitem.ExceptionTag;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\n\nimport java.io.IOException;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\npublic class FailedMediaSource extends BaseMediaSource implements ManagedMediaSource {\n    /**\n     * Play 2 seconds of silenced audio when a stream fails to resolve due to a known issue,\n     * such as {@link org.schabi.newpipe.extractor.exceptions.ExtractionException}.\n     *\n     * This silence duration allows user to react and have time to jump to a previous stream,\n     * while still provide a smooth playback experience. A duration lower than 1 second is\n     * not recommended, it may cause ExoPlayer to buffer for a while.\n     * */\n    public static final long SILENCE_DURATION_US = TimeUnit.SECONDS.toMicros(2);\n    public static final MediaPeriod SILENT_MEDIA = makeSilentMediaPeriod(SILENCE_DURATION_US);\n\n    private final String TAG = \"FailedMediaSource@\" + Integer.toHexString(hashCode());\n    private final PlayQueueItem playQueueItem;\n    private final Exception error;\n    private final long retryTimestamp;\n    private final MediaItem mediaItem;\n    /**\n     * Fail the play queue item associated with this source, with potential future retries.\n     *\n     * The error will be propagated if the cause for load exception is unspecified.\n     * This means the error might be caused by reasons outside of extraction (e.g. no network).\n     * Otherwise, a silenced stream will play instead.\n     *\n     * @param playQueueItem  play queue item\n     * @param error          exception that was the reason to fail\n     * @param retryTimestamp epoch timestamp when this MediaSource can be refreshed\n     */\n    public FailedMediaSource(@NonNull final PlayQueueItem playQueueItem,\n                             @NonNull final Exception error,\n                             final long retryTimestamp) {\n        this.playQueueItem = playQueueItem;\n        this.error = error;\n        this.retryTimestamp = retryTimestamp;\n        this.mediaItem = ExceptionTag.of(playQueueItem, List.of(error)).withExtras(this)\n                .asMediaItem();\n    }\n\n    public static FailedMediaSource of(@NonNull final PlayQueueItem playQueueItem,\n                                       @NonNull final FailedMediaSourceException error) {\n        return new FailedMediaSource(playQueueItem, error, Long.MAX_VALUE);\n    }\n\n    public static FailedMediaSource of(@NonNull final PlayQueueItem playQueueItem,\n                                       @NonNull final Exception error,\n                                       final long retryWaitMillis) {\n        return new FailedMediaSource(playQueueItem, error,\n                System.currentTimeMillis() + retryWaitMillis);\n    }\n\n    public PlayQueueItem getStream() {\n        return playQueueItem;\n    }\n\n    public Exception getError() {\n        return error;\n    }\n\n    private boolean canRetry() {\n        return System.currentTimeMillis() >= retryTimestamp;\n    }\n\n    @Override\n    public MediaItem getMediaItem() {\n        return mediaItem;\n    }\n\n    /**\n     * Prepares the source with {@link Timeline} info on the silence playback when the error\n     * is classed as {@link FailedMediaSourceException}, for example, when the error is\n     * {@link org.schabi.newpipe.extractor.exceptions.ExtractionException ExtractionException}.\n     * These types of error are swallowed by {@link FailedMediaSource}, and the underlying\n     * exception is carried to the {@link MediaItem} metadata during playback.\n     * <br><br>\n     * If the exception is not known, e.g. {@link java.net.UnknownHostException} or some\n     * other network issue, then no source info is refreshed and\n     * {@link #maybeThrowSourceInfoRefreshError()} be will triggered.\n     * <br><br>\n     * Note that this method is called only once until {@link #releaseSourceInternal()} is called,\n     * so if no action is done in here, playback will stall unless\n     * {@link #maybeThrowSourceInfoRefreshError()} is called.\n     *\n     * @param mediaTransferListener No data transfer listener needed, ignored here.\n     */\n    @Override\n    protected void prepareSourceInternal(@Nullable final TransferListener mediaTransferListener) {\n        Log.e(TAG, \"Loading failed source: \", error);\n        if (error instanceof FailedMediaSourceException) {\n            refreshSourceInfo(makeSilentMediaTimeline(SILENCE_DURATION_US, mediaItem));\n        }\n    }\n\n    /**\n     * If the error is not known, e.g. network issue, then the exception is not swallowed here in\n     * {@link FailedMediaSource}. The exception is then propagated to the player, which\n     * {@link org.schabi.newpipe.player.Player Player} can react to inside\n     * {@link com.google.android.exoplayer2.Player.Listener#onPlayerError(PlaybackException)}.\n     *\n     * @throws IOException An error which will always result in\n     * {@link com.google.android.exoplayer2.PlaybackException#ERROR_CODE_IO_UNSPECIFIED}.\n     */\n    @Override\n    public void maybeThrowSourceInfoRefreshError() throws IOException {\n        if (!(error instanceof FailedMediaSourceException)) {\n            throw new IOException(error);\n        }\n    }\n\n    /**\n     * This method is only called if {@link #prepareSourceInternal(TransferListener)}\n     * refreshes the source info with no exception. All parameters are ignored as this\n     * returns a static and reused piece of silent audio.\n     *\n     * @param id                The identifier of the period.\n     * @param allocator         An {@link Allocator} from which to obtain media buffer allocations.\n     * @param startPositionUs   The expected start position, in microseconds.\n     * @return The common {@link MediaPeriod} holding the silence.\n     */\n    @Override\n    public MediaPeriod createPeriod(final MediaPeriodId id,\n                                    final Allocator allocator,\n                                    final long startPositionUs) {\n        return SILENT_MEDIA;\n    }\n\n    @Override\n    public void releasePeriod(final MediaPeriod mediaPeriod) {\n        /* Do Nothing (we want to keep re-using the Silent MediaPeriod) */\n    }\n\n    @Override\n    protected void releaseSourceInternal() {\n        /* Do Nothing, no clean-up for processing/extra thread is needed by this MediaSource */\n    }\n\n    @Override\n    public boolean shouldBeReplacedWith(@NonNull final PlayQueueItem newIdentity,\n                                        final boolean isInterruptable) {\n        return newIdentity != playQueueItem || canRetry();\n    }\n\n    @Override\n    public boolean isStreamEqual(@NonNull final PlayQueueItem stream) {\n        return playQueueItem == stream;\n    }\n\n    public static class FailedMediaSourceException extends Exception {\n        FailedMediaSourceException(final String message) {\n            super(message);\n        }\n\n        FailedMediaSourceException(final Throwable cause) {\n            super(cause);\n        }\n    }\n\n    public static final class MediaSourceResolutionException extends FailedMediaSourceException {\n        public MediaSourceResolutionException(final String message) {\n            super(message);\n        }\n    }\n\n    public static final class StreamInfoLoadException extends FailedMediaSourceException {\n        public StreamInfoLoadException(final Throwable cause) {\n            super(cause);\n        }\n    }\n\n    private static Timeline makeSilentMediaTimeline(final long durationUs,\n                                                    @NonNull final MediaItem mediaItem) {\n        return new SinglePeriodTimeline(\n                durationUs,\n                /* isSeekable= */ true,\n                /* isDynamic= */ false,\n                /* useLiveConfiguration= */ false,\n                /* manifest= */ null,\n                mediaItem);\n    }\n\n    private static MediaPeriod makeSilentMediaPeriod(final long durationUs) {\n        return new SilenceMediaSource.Factory()\n                .setDurationUs(durationUs)\n                .createMediaSource()\n                .createPeriod(null, null, 0);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediasource/LoadedMediaSource.java",
    "content": "package org.schabi.newpipe.player.mediasource;\n\nimport androidx.annotation.NonNull;\n\nimport com.google.android.exoplayer2.MediaItem;\nimport com.google.android.exoplayer2.source.MediaSource;\nimport com.google.android.exoplayer2.source.WrappingMediaSource;\n\nimport org.schabi.newpipe.player.mediaitem.MediaItemTag;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\n\npublic class LoadedMediaSource extends WrappingMediaSource implements ManagedMediaSource {\n    private final PlayQueueItem stream;\n    private final MediaItem mediaItem;\n    private final long expireTimestamp;\n\n    /**\n     * Uses a {@link WrappingMediaSource} to wrap one child {@link MediaSource}s\n     * containing actual media. This wrapper {@link LoadedMediaSource} holds the expiration\n     * timestamp as a {@link ManagedMediaSource} to allow explicit playlist management under\n     * {@link ManagedMediaSourcePlaylist}.\n     *\n     * @param source            The child media source with actual media.\n     * @param tag               Metadata for the child media source.\n     * @param stream            The queue item associated with the media source.\n     * @param expireTimestamp   The timestamp when the media source expires and might not be\n     *                          available for playback.\n     */\n    public LoadedMediaSource(@NonNull final MediaSource source,\n                             @NonNull final MediaItemTag tag,\n                             @NonNull final PlayQueueItem stream,\n                             final long expireTimestamp) {\n        super(source);\n        this.stream = stream;\n        this.expireTimestamp = expireTimestamp;\n\n        this.mediaItem = tag.withExtras(this).asMediaItem();\n    }\n\n    public PlayQueueItem getStream() {\n        return stream;\n    }\n\n    private boolean isExpired() {\n        return System.currentTimeMillis() >= expireTimestamp;\n    }\n\n    @NonNull\n    @Override\n    public MediaItem getMediaItem() {\n        return mediaItem;\n    }\n\n    @Override\n    public boolean shouldBeReplacedWith(@NonNull final PlayQueueItem newIdentity,\n                                        final boolean isInterruptable) {\n        return newIdentity != stream || (isInterruptable && isExpired());\n    }\n\n    @Override\n    public boolean isStreamEqual(@NonNull final PlayQueueItem otherStream) {\n        return this.stream == otherStream;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSource.java",
    "content": "package org.schabi.newpipe.player.mediasource;\n\nimport androidx.annotation.NonNull;\n\nimport com.google.android.exoplayer2.source.MediaSource;\n\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\n\npublic interface ManagedMediaSource extends MediaSource {\n    /**\n     * Determines whether or not this {@link ManagedMediaSource} can be replaced.\n     *\n     * @param newIdentity     a stream the {@link ManagedMediaSource} should encapsulate over, if\n     *                        it is different from the existing stream in the\n     *                        {@link ManagedMediaSource}, then it should be replaced.\n     * @param isInterruptable specifies if this {@link ManagedMediaSource} potentially\n     *                        being played.\n     * @return whether this could be replaces\n     */\n    boolean shouldBeReplacedWith(@NonNull PlayQueueItem newIdentity, boolean isInterruptable);\n\n    /**\n     * Determines if the {@link PlayQueueItem} is the one the\n     * {@link ManagedMediaSource} encapsulates over.\n     *\n     * @param stream play queue item to check\n     * @return whether this source is for the specified stream\n     */\n    boolean isStreamEqual(@NonNull PlayQueueItem stream);\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSourcePlaylist.java",
    "content": "package org.schabi.newpipe.player.mediasource;\n\nimport android.os.Handler;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.source.ConcatenatingMediaSource;\nimport com.google.android.exoplayer2.source.ShuffleOrder;\n\nimport org.schabi.newpipe.player.mediaitem.MediaItemTag;\n\npublic class ManagedMediaSourcePlaylist {\n    @NonNull\n    private final ConcatenatingMediaSource internalSource;\n\n    public ManagedMediaSourcePlaylist() {\n        internalSource = new ConcatenatingMediaSource(/*isPlaylistAtomic=*/false,\n                new ShuffleOrder.UnshuffledShuffleOrder(0));\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // MediaSource Delegations\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public int size() {\n        return internalSource.getSize();\n    }\n\n    /**\n     * Returns the {@link ManagedMediaSource} at the given index of the playlist.\n     * If the index is invalid, then null is returned.\n     *\n     * @param index index of {@link ManagedMediaSource} to get from the playlist\n     * @return the {@link ManagedMediaSource} at the given index of the playlist\n     */\n    @Nullable\n    public ManagedMediaSource get(final int index) {\n        if (index < 0 || index >= size()) {\n            return null;\n        }\n\n        return MediaItemTag\n                .from(internalSource.getMediaSource(index).getMediaItem())\n                .flatMap(tag -> tag.getMaybeExtras(ManagedMediaSource.class))\n                .orElse(null);\n    }\n\n    @NonNull\n    public ConcatenatingMediaSource getParentMediaSource() {\n        return internalSource;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playlist Manipulation\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * Expands the {@link ConcatenatingMediaSource} by appending it with a\n     * {@link PlaceholderMediaSource}.\n     *\n     * @see #append(ManagedMediaSource)\n     */\n    public synchronized void expand() {\n        append(PlaceholderMediaSource.COPY);\n    }\n\n    /**\n     * Appends a {@link ManagedMediaSource} to the end of {@link ConcatenatingMediaSource}.\n     *\n     * @see ConcatenatingMediaSource#addMediaSource\n     * @param source {@link ManagedMediaSource} to append\n     */\n    public synchronized void append(@NonNull final ManagedMediaSource source) {\n        internalSource.addMediaSource(source);\n    }\n\n    /**\n     * Removes a {@link ManagedMediaSource} from {@link ConcatenatingMediaSource}\n     * at the given index. If this index is out of bound, then the removal is ignored.\n     *\n     * @see ConcatenatingMediaSource#removeMediaSource(int)\n     * @param index of {@link ManagedMediaSource} to be removed\n     */\n    public synchronized void remove(final int index) {\n        if (index < 0 || index > internalSource.getSize()) {\n            return;\n        }\n\n        internalSource.removeMediaSource(index);\n    }\n\n    /**\n     * Moves a {@link ManagedMediaSource} in {@link ConcatenatingMediaSource}\n     * from the given source index to the target index. If either index is out of bound,\n     * then the call is ignored.\n     *\n     * @see ConcatenatingMediaSource#moveMediaSource(int, int)\n     * @param source original index of {@link ManagedMediaSource}\n     * @param target new index of {@link ManagedMediaSource}\n     */\n    public synchronized void move(final int source, final int target) {\n        if (source < 0 || target < 0) {\n            return;\n        }\n        if (source >= internalSource.getSize() || target >= internalSource.getSize()) {\n            return;\n        }\n\n        internalSource.moveMediaSource(source, target);\n    }\n\n    /**\n     * Invalidates the {@link ManagedMediaSource} at the given index by replacing it\n     * with a {@link PlaceholderMediaSource}.\n     *\n     * @see #update(int, ManagedMediaSource, Handler, Runnable)\n     * @param index            index of {@link ManagedMediaSource} to invalidate\n     * @param handler          the {@link Handler} to run {@code finalizingAction}\n     * @param finalizingAction a {@link Runnable} which is executed immediately\n     *                         after the media source has been removed from the playlist\n     */\n    public synchronized void invalidate(final int index,\n                                        @Nullable final Handler handler,\n                                        @Nullable final Runnable finalizingAction) {\n        if (get(index) == PlaceholderMediaSource.COPY) {\n            return;\n        }\n        update(index, PlaceholderMediaSource.COPY, handler, finalizingAction);\n    }\n\n    /**\n     * Updates the {@link ManagedMediaSource} in {@link ConcatenatingMediaSource}\n     * at the given index with a given {@link ManagedMediaSource}.\n     *\n     * @see #update(int, ManagedMediaSource, Handler, Runnable)\n     * @param index  index of {@link ManagedMediaSource} to update\n     * @param source new {@link ManagedMediaSource} to use\n     */\n    public synchronized void update(final int index, @NonNull final ManagedMediaSource source) {\n        update(index, source, null, /*doNothing=*/null);\n    }\n\n    /**\n     * Updates the {@link ManagedMediaSource} in {@link ConcatenatingMediaSource}\n     * at the given index with a given {@link ManagedMediaSource}. If the index is out of bound,\n     * then the replacement is ignored.\n     *\n     * @see ConcatenatingMediaSource#addMediaSource\n     * @see ConcatenatingMediaSource#removeMediaSource(int, Handler, Runnable)\n     * @param index            index of {@link ManagedMediaSource} to update\n     * @param source           new {@link ManagedMediaSource} to use\n     * @param handler          the {@link Handler} to run {@code finalizingAction}\n     * @param finalizingAction a {@link Runnable} which is executed immediately\n     *                         after the media source has been removed from the playlist\n     */\n    public synchronized void update(final int index, @NonNull final ManagedMediaSource source,\n                                    @Nullable final Handler handler,\n                                    @Nullable final Runnable finalizingAction) {\n        if (index < 0 || index >= internalSource.getSize()) {\n            return;\n        }\n\n        // Add and remove are sequential on the same thread, therefore here, the exoplayer\n        // message queue must receive and process add before remove, effectively treating them\n        // as atomic.\n\n        // Since the finalizing action occurs strictly after the timeline has completed\n        // all its changes on the playback thread, thus, it is possible, in the meantime,\n        // other calls that modifies the playlist media source occur in between. This makes\n        // it unsafe to call remove as the finalizing action of add.\n        internalSource.addMediaSource(index + 1, source);\n\n        // Because of the above race condition, it is thus only safe to synchronize the player\n        // in the finalizing action AFTER the removal is complete and the timeline has changed.\n        internalSource.removeMediaSource(index, handler, finalizingAction);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/mediasource/PlaceholderMediaSource.java",
    "content": "package org.schabi.newpipe.player.mediasource;\n\nimport com.google.android.exoplayer2.MediaItem;\nimport com.google.android.exoplayer2.Timeline;\nimport com.google.android.exoplayer2.source.CompositeMediaSource;\nimport com.google.android.exoplayer2.source.MediaPeriod;\nimport com.google.android.exoplayer2.source.MediaSource;\nimport com.google.android.exoplayer2.upstream.Allocator;\n\nimport org.schabi.newpipe.player.mediaitem.PlaceholderTag;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\n\nimport androidx.annotation.NonNull;\n\nfinal class PlaceholderMediaSource\n        extends CompositeMediaSource<Void> implements ManagedMediaSource {\n    public static final PlaceholderMediaSource COPY = new PlaceholderMediaSource();\n    private static final MediaItem MEDIA_ITEM = PlaceholderTag.EMPTY.withExtras(COPY).asMediaItem();\n\n    private PlaceholderMediaSource() { }\n\n    @Override\n    public MediaItem getMediaItem() {\n        return MEDIA_ITEM;\n    }\n\n    @Override\n    protected void onChildSourceInfoRefreshed(final Void id,\n                                              final MediaSource mediaSource,\n                                              final Timeline timeline) {\n        /* Do nothing, no timeline updates or error will stall playback */\n    }\n\n    @Override\n    public MediaPeriod createPeriod(final MediaPeriodId id, final Allocator allocator,\n                                    final long startPositionUs) {\n        return null;\n    }\n\n    @Override\n    public void releasePeriod(final MediaPeriod mediaPeriod) { }\n\n    @Override\n    public boolean shouldBeReplacedWith(@NonNull final PlayQueueItem newIdentity,\n                                        final boolean isInterruptable) {\n        return true;\n    }\n\n    @Override\n    public boolean isStreamEqual(@NonNull final PlayQueueItem stream) {\n        return false;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java",
    "content": "package org.schabi.newpipe.player.notification;\n\nimport static com.google.android.exoplayer2.Player.REPEAT_MODE_ALL;\nimport static com.google.android.exoplayer2.Player.REPEAT_MODE_ONE;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_FORWARD;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_FAST_REWIND;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_NEXT;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PAUSE;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PREVIOUS;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_REPEAT;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_SHUFFLE;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\n\nimport androidx.annotation.DrawableRes;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.player.Player;\n\nimport java.util.Objects;\n\npublic final class NotificationActionData {\n\n    @NonNull\n    private final String action;\n    @NonNull\n    private final String name;\n    @DrawableRes\n    private final int icon;\n\n\n    public NotificationActionData(@NonNull final String action, @NonNull final String name,\n                                  @DrawableRes final int icon) {\n        this.action = action;\n        this.name = name;\n        this.icon = icon;\n    }\n\n    @NonNull\n    public String action() {\n        return action;\n    }\n\n    @NonNull\n    public String name() {\n        return name;\n    }\n\n    @DrawableRes\n    public int icon() {\n        return icon;\n    }\n\n\n    @SuppressLint(\"PrivateResource\") // we currently use Exoplayer's internal strings and icons\n    @Nullable\n    public static NotificationActionData fromNotificationActionEnum(\n            @NonNull final Player player,\n            @NotificationConstants.Action final int selectedAction\n    ) {\n\n        final int baseActionIcon = NotificationConstants.ACTION_ICONS[selectedAction];\n        final Context ctx = player.getContext();\n\n        switch (selectedAction) {\n            case NotificationConstants.PREVIOUS:\n                return new NotificationActionData(ACTION_PLAY_PREVIOUS,\n                        ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_previous_description), baseActionIcon);\n\n            case NotificationConstants.NEXT:\n                return new NotificationActionData(ACTION_PLAY_NEXT,\n                        ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_next_description), baseActionIcon);\n\n            case NotificationConstants.REWIND:\n                return new NotificationActionData(ACTION_FAST_REWIND,\n                        ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_rewind_description), baseActionIcon);\n\n            case NotificationConstants.FORWARD:\n                return new NotificationActionData(ACTION_FAST_FORWARD,\n                        ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_fastforward_description), baseActionIcon);\n\n            case NotificationConstants.SMART_REWIND_PREVIOUS:\n                if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) {\n                    return new NotificationActionData(ACTION_PLAY_PREVIOUS,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_previous_description),\n                            com.google.android.exoplayer2.ui.R.drawable.exo_notification_previous);\n                } else {\n                    return new NotificationActionData(ACTION_FAST_REWIND,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_rewind_description),\n                            com.google.android.exoplayer2.ui.R.drawable.exo_controls_rewind);\n                }\n\n            case NotificationConstants.SMART_FORWARD_NEXT:\n                if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) {\n                    return new NotificationActionData(ACTION_PLAY_NEXT,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_next_description),\n                            com.google.android.exoplayer2.ui.R.drawable.exo_notification_next);\n                } else {\n                    return new NotificationActionData(ACTION_FAST_FORWARD,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_fastforward_description),\n                            com.google.android.exoplayer2.ui.R.drawable.exo_controls_fastforward);\n                }\n\n            case NotificationConstants.PLAY_PAUSE_BUFFERING:\n                if (player.getCurrentState() == Player.STATE_PREFLIGHT\n                        || player.getCurrentState() == Player.STATE_BLOCKED\n                        || player.getCurrentState() == Player.STATE_BUFFERING) {\n                    return new NotificationActionData(ACTION_PLAY_PAUSE,\n                            ctx.getString(R.string.notification_action_buffering),\n                            R.drawable.ic_hourglass_top);\n                }\n\n                // fallthrough\n            case NotificationConstants.PLAY_PAUSE:\n                if (player.getCurrentState() == Player.STATE_COMPLETED) {\n                    return new NotificationActionData(ACTION_PLAY_PAUSE,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_pause_description),\n                            R.drawable.ic_replay);\n                } else if (player.isPlaying()\n                        || player.getCurrentState() == Player.STATE_PREFLIGHT\n                        || player.getCurrentState() == Player.STATE_BLOCKED\n                        || player.getCurrentState() == Player.STATE_BUFFERING) {\n                    return new NotificationActionData(ACTION_PLAY_PAUSE,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_pause_description),\n                            com.google.android.exoplayer2.ui.R.drawable.exo_notification_pause);\n                } else {\n                    return new NotificationActionData(ACTION_PLAY_PAUSE,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_play_description),\n                            com.google.android.exoplayer2.ui.R.drawable.exo_notification_play);\n                }\n\n            case NotificationConstants.REPEAT:\n                if (player.getRepeatMode() == REPEAT_MODE_ALL) {\n                    return new NotificationActionData(ACTION_REPEAT,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_repeat_all_description),\n                            com.google.android.exoplayer2.ext.mediasession.R.drawable\n                                    .exo_media_action_repeat_all);\n                } else if (player.getRepeatMode() == REPEAT_MODE_ONE) {\n                    return new NotificationActionData(ACTION_REPEAT,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_repeat_one_description),\n                            com.google.android.exoplayer2.ext.mediasession.R.drawable\n                                    .exo_media_action_repeat_one);\n                } else /* player.getRepeatMode() == REPEAT_MODE_OFF */ {\n                    return new NotificationActionData(ACTION_REPEAT,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_repeat_off_description),\n                            com.google.android.exoplayer2.ext.mediasession.R.drawable\n                                    .exo_media_action_repeat_off);\n                }\n\n            case NotificationConstants.SHUFFLE:\n                if (player.getPlayQueue() != null && player.getPlayQueue().isShuffled()) {\n                    return new NotificationActionData(ACTION_SHUFFLE,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_shuffle_on_description),\n                            com.google.android.exoplayer2.ui.R.drawable.exo_controls_shuffle_on);\n                } else {\n                    return new NotificationActionData(ACTION_SHUFFLE,\n                            ctx.getString(com.google.android.exoplayer2.ui.R.string\n                                    .exo_controls_shuffle_off_description),\n                            com.google.android.exoplayer2.ui.R.drawable.exo_controls_shuffle_off);\n                }\n\n            case NotificationConstants.CLOSE:\n                return new NotificationActionData(ACTION_CLOSE, ctx.getString(R.string.close),\n                        R.drawable.ic_close);\n\n            case NotificationConstants.NOTHING:\n            default:\n                // do nothing\n                return null;\n        }\n    }\n\n\n    @Override\n    public boolean equals(@Nullable final Object obj) {\n        return (obj instanceof NotificationActionData other)\n                && this.action.equals(other.action)\n                && this.name.equals(other.name)\n                && this.icon == other.icon;\n    }\n\n    @Override\n    public int hashCode() {\n        return Objects.hash(action, name, icon);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java",
    "content": "package org.schabi.newpipe.player.notification;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\nimport androidx.annotation.DrawableRes;\nimport androidx.annotation.IntDef;\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.App;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.util.Localization;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.SortedSet;\nimport java.util.TreeSet;\n\npublic final class NotificationConstants {\n\n    private NotificationConstants() {\n    }\n\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Intent actions\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private static final String BASE_ACTION =\n            App.PACKAGE_NAME + \".player.MainPlayer.\";\n    public static final String ACTION_CLOSE =\n            BASE_ACTION + \"CLOSE\";\n    public static final String ACTION_PLAY_PAUSE =\n            BASE_ACTION + \".player.MainPlayer.PLAY_PAUSE\";\n    public static final String ACTION_REPEAT =\n            BASE_ACTION + \".player.MainPlayer.REPEAT\";\n    public static final String ACTION_PLAY_NEXT =\n            BASE_ACTION + \".player.MainPlayer.ACTION_PLAY_NEXT\";\n    public static final String ACTION_PLAY_PREVIOUS =\n            BASE_ACTION + \".player.MainPlayer.ACTION_PLAY_PREVIOUS\";\n    public static final String ACTION_FAST_REWIND =\n            BASE_ACTION + \".player.MainPlayer.ACTION_FAST_REWIND\";\n    public static final String ACTION_FAST_FORWARD =\n            BASE_ACTION + \".player.MainPlayer.ACTION_FAST_FORWARD\";\n    public static final String ACTION_SHUFFLE =\n            BASE_ACTION + \".player.MainPlayer.ACTION_SHUFFLE\";\n    public static final String ACTION_RECREATE_NOTIFICATION =\n            BASE_ACTION + \".player.MainPlayer.ACTION_RECREATE_NOTIFICATION\";\n\n\n    public static final int NOTHING = 0;\n    public static final int PREVIOUS = 1;\n    public static final int NEXT = 2;\n    public static final int REWIND = 3;\n    public static final int FORWARD = 4;\n    public static final int SMART_REWIND_PREVIOUS = 5;\n    public static final int SMART_FORWARD_NEXT = 6;\n    public static final int PLAY_PAUSE = 7;\n    public static final int PLAY_PAUSE_BUFFERING = 8;\n    public static final int REPEAT = 9;\n    public static final int SHUFFLE = 10;\n    public static final int CLOSE = 11;\n\n    @Retention(RetentionPolicy.SOURCE)\n    @IntDef({NOTHING, PREVIOUS, NEXT, REWIND, FORWARD,\n            SMART_REWIND_PREVIOUS, SMART_FORWARD_NEXT, PLAY_PAUSE, PLAY_PAUSE_BUFFERING, REPEAT,\n            SHUFFLE, CLOSE})\n    public @interface Action { }\n\n    @Action\n    public static final int[] ALL_ACTIONS = {NOTHING, PREVIOUS, NEXT, REWIND, FORWARD,\n            SMART_REWIND_PREVIOUS, SMART_FORWARD_NEXT, PLAY_PAUSE, PLAY_PAUSE_BUFFERING, REPEAT,\n            SHUFFLE, CLOSE};\n\n    @DrawableRes\n    public static final int[] ACTION_ICONS = {\n            0,\n            com.google.android.exoplayer2.ui.R.drawable.exo_icon_previous,\n            com.google.android.exoplayer2.ui.R.drawable.exo_icon_next,\n            com.google.android.exoplayer2.ui.R.drawable.exo_icon_rewind,\n            com.google.android.exoplayer2.ui.R.drawable.exo_icon_fastforward,\n            com.google.android.exoplayer2.ui.R.drawable.exo_icon_previous,\n            com.google.android.exoplayer2.ui.R.drawable.exo_icon_next,\n            R.drawable.ic_pause,\n            R.drawable.ic_hourglass_top,\n            com.google.android.exoplayer2.ui.R.drawable.exo_icon_repeat_all,\n            com.google.android.exoplayer2.ui.R.drawable.exo_icon_shuffle_on,\n            R.drawable.ic_close,\n    };\n\n\n    @Action\n    public static final int[] SLOT_DEFAULTS = {\n            SMART_REWIND_PREVIOUS,\n            PLAY_PAUSE_BUFFERING,\n            SMART_FORWARD_NEXT,\n            REPEAT,\n            CLOSE,\n    };\n\n    public static final int[] SLOT_PREF_KEYS = {\n            R.string.notification_slot_0_key,\n            R.string.notification_slot_1_key,\n            R.string.notification_slot_2_key,\n            R.string.notification_slot_3_key,\n            R.string.notification_slot_4_key,\n    };\n\n\n    public static final List<Integer> SLOT_COMPACT_DEFAULTS = List.of(0, 1, 2);\n\n    public static final int[] SLOT_COMPACT_PREF_KEYS = {\n            R.string.notification_slot_compact_0_key,\n            R.string.notification_slot_compact_1_key,\n            R.string.notification_slot_compact_2_key,\n    };\n\n\n    public static String getActionName(@NonNull final Context context, @Action final int action) {\n        switch (action) {\n            case PREVIOUS:\n                return context.getString(com.google.android.exoplayer2.ui.R.string\n                        .exo_controls_previous_description);\n            case NEXT:\n                return context.getString(com.google.android.exoplayer2.ui.R.string\n                        .exo_controls_next_description);\n            case REWIND:\n                return context.getString(com.google.android.exoplayer2.ui.R.string\n                        .exo_controls_rewind_description);\n            case FORWARD:\n                return context.getString(com.google.android.exoplayer2.ui.R.string\n                        .exo_controls_fastforward_description);\n            case SMART_REWIND_PREVIOUS:\n                return Localization.concatenateStrings(\n                        context.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_rewind_description),\n                        context.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_previous_description));\n            case SMART_FORWARD_NEXT:\n                return Localization.concatenateStrings(\n                        context.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_fastforward_description),\n                        context.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_next_description));\n            case PLAY_PAUSE:\n                return Localization.concatenateStrings(\n                        context.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_play_description),\n                        context.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_pause_description));\n            case PLAY_PAUSE_BUFFERING:\n                return Localization.concatenateStrings(\n                        context.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_play_description),\n                        context.getString(com.google.android.exoplayer2.ui.R.string\n                                .exo_controls_pause_description),\n                        context.getString(R.string.notification_action_buffering));\n            case REPEAT:\n                return context.getString(R.string.notification_action_repeat);\n            case SHUFFLE:\n                return context.getString(R.string.notification_action_shuffle);\n            case CLOSE:\n                return context.getString(R.string.close);\n            case NOTHING: default:\n                return context.getString(R.string.notification_action_nothing);\n        }\n    }\n\n\n    /**\n     * @param context the context to use\n     * @param sharedPreferences the shared preferences to query values from\n     * @return a sorted list of the indices of the slots to use as compact slots\n     */\n    public static Collection<Integer> getCompactSlotsFromPreferences(\n            @NonNull final Context context,\n            final SharedPreferences sharedPreferences) {\n        final SortedSet<Integer> compactSlots = new TreeSet<>();\n        for (int i = 0; i < 3; i++) {\n            final int compactSlot = sharedPreferences.getInt(\n                    context.getString(SLOT_COMPACT_PREF_KEYS[i]), Integer.MAX_VALUE);\n\n            if (compactSlot == Integer.MAX_VALUE) {\n                // settings not yet populated, return default values\n                return SLOT_COMPACT_DEFAULTS;\n            }\n\n            if (compactSlot >= 0) {\n                // compact slot is < 0 if there are less than 3 checked checkboxes\n                compactSlots.add(compactSlot);\n            }\n        }\n        return compactSlots;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/notification/NotificationPlayerUi.java",
    "content": "package org.schabi.newpipe.player.notification;\n\nimport static org.schabi.newpipe.player.helper.PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_NONE;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_RECREATE_NOTIFICATION;\n\nimport android.content.Intent;\nimport android.graphics.Bitmap;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.Player.RepeatMode;\n\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.helper.PlayerHelper;\nimport org.schabi.newpipe.player.ui.PlayerUi;\n\npublic final class NotificationPlayerUi extends PlayerUi {\n    private final NotificationUtil notificationUtil;\n\n    public NotificationPlayerUi(@NonNull final Player player) {\n        super(player);\n        notificationUtil = new NotificationUtil(player);\n    }\n\n    @Override\n    public void destroy() {\n        super.destroy();\n        notificationUtil.cancelNotificationAndStopForeground();\n    }\n\n    @Override\n    public void onThumbnailLoaded(@Nullable final Bitmap bitmap) {\n        super.onThumbnailLoaded(bitmap);\n        notificationUtil.updateThumbnail();\n    }\n\n    @Override\n    public void onBlocked() {\n        super.onBlocked();\n        notificationUtil.createNotificationIfNeededAndUpdate(false);\n    }\n\n    @Override\n    public void onPlaying() {\n        super.onPlaying();\n        notificationUtil.createNotificationIfNeededAndUpdate(false);\n    }\n\n    @Override\n    public void onBuffering() {\n        super.onBuffering();\n        if (notificationUtil.shouldUpdateBufferingSlot()) {\n            notificationUtil.createNotificationIfNeededAndUpdate(false);\n        }\n    }\n\n    @Override\n    public void onPaused() {\n        super.onPaused();\n\n        // Remove running notification when user does not want minimization to background or popup\n        if (PlayerHelper.getMinimizeOnExitAction(context) == MINIMIZE_ON_EXIT_MODE_NONE\n                && player.videoPlayerSelected()) {\n            notificationUtil.cancelNotificationAndStopForeground();\n        } else {\n            notificationUtil.createNotificationIfNeededAndUpdate(false);\n        }\n    }\n\n    @Override\n    public void onPausedSeek() {\n        super.onPausedSeek();\n        notificationUtil.createNotificationIfNeededAndUpdate(false);\n    }\n\n    @Override\n    public void onCompleted() {\n        super.onCompleted();\n        notificationUtil.createNotificationIfNeededAndUpdate(false);\n    }\n\n    @Override\n    public void onRepeatModeChanged(@RepeatMode final int repeatMode) {\n        super.onRepeatModeChanged(repeatMode);\n        notificationUtil.createNotificationIfNeededAndUpdate(false);\n    }\n\n    @Override\n    public void onShuffleModeEnabledChanged(final boolean shuffleModeEnabled) {\n        super.onShuffleModeEnabledChanged(shuffleModeEnabled);\n        notificationUtil.createNotificationIfNeededAndUpdate(false);\n    }\n\n    @Override\n    public void onBroadcastReceived(final Intent intent) {\n        super.onBroadcastReceived(intent);\n        if (ACTION_RECREATE_NOTIFICATION.equals(intent.getAction())) {\n            notificationUtil.createNotificationIfNeededAndUpdate(true);\n        }\n    }\n\n    @Override\n    public void onMetadataChanged(@NonNull final StreamInfo info) {\n        super.onMetadataChanged(info);\n        notificationUtil.createNotificationIfNeededAndUpdate(true);\n    }\n\n    @Override\n    public void onPlayQueueEdited() {\n        super.onPlayQueueEdited();\n        notificationUtil.createNotificationIfNeededAndUpdate(false);\n    }\n\n    public void createNotificationAndStartForeground() {\n        notificationUtil.createNotificationAndStartForeground();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/notification/NotificationUtil.java",
    "content": "package org.schabi.newpipe.player.notification;\n\nimport static android.app.PendingIntent.FLAG_UPDATE_CURRENT;\nimport static androidx.media.app.NotificationCompat.MediaStyle;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_CLOSE;\n\nimport android.annotation.SuppressLint;\nimport android.app.Notification;\nimport android.app.PendingIntent;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.ServiceInfo;\nimport android.graphics.Bitmap;\nimport android.os.Build;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.app.NotificationCompat;\nimport androidx.core.app.NotificationManagerCompat;\nimport androidx.core.app.PendingIntentCompat;\nimport androidx.core.app.ServiceCompat;\nimport androidx.core.content.ContextCompat;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.PlayerIntentType;\nimport org.schabi.newpipe.player.PlayerService;\nimport org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi;\nimport org.schabi.newpipe.util.NavigationHelper;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Optional;\n\n/**\n * This is a utility class for player notifications.\n */\npublic final class NotificationUtil {\n    private static final String TAG = NotificationUtil.class.getSimpleName();\n    private static final boolean DEBUG = Player.DEBUG;\n    private static final int NOTIFICATION_ID = 123789;\n\n    @NotificationConstants.Action\n    private final int[] notificationSlots = NotificationConstants.SLOT_DEFAULTS.clone();\n\n    private NotificationManagerCompat notificationManager;\n    private NotificationCompat.Builder notificationBuilder;\n\n    private final Player player;\n\n    public NotificationUtil(final Player player) {\n        this.player = player;\n    }\n\n\n    /////////////////////////////////////////////////////\n    // NOTIFICATION\n    /////////////////////////////////////////////////////\n\n    /**\n     * Creates the notification if it does not exist already and recreates it if forceRecreate is\n     * true. Updates the notification with the data in the player.\n     * @param forceRecreate whether to force the recreation of the notification even if it already\n     *                      exists\n     */\n    public synchronized void createNotificationIfNeededAndUpdate(final boolean forceRecreate) {\n        if (forceRecreate || notificationBuilder == null) {\n            notificationBuilder = createNotification();\n        }\n        updateNotification();\n        if (notificationManager.areNotificationsEnabled()) {\n            notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());\n        }\n    }\n\n    public synchronized void updateThumbnail() {\n        if (notificationBuilder != null) {\n            if (DEBUG) {\n                Log.d(TAG, \"updateThumbnail() called with thumbnail = [\" + Integer.toHexString(\n                        Optional.ofNullable(player.getThumbnail()).map(Objects::hashCode).orElse(0))\n                        + \"], title = [\" + player.getVideoTitle() + \"]\");\n            }\n\n            setLargeIcon(notificationBuilder);\n            if (notificationManager.areNotificationsEnabled()) {\n                notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());\n            }\n        }\n    }\n\n    private synchronized NotificationCompat.Builder createNotification() {\n        if (DEBUG) {\n            Log.d(TAG, \"createNotification()\");\n        }\n        notificationManager = NotificationManagerCompat.from(player.getContext());\n\n        // setup media style (compact notification slots and media session)\n        final MediaStyle mediaStyle = new MediaStyle();\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {\n            // notification actions are ignored on Android 13+, and are replaced by code in\n            // MediaSessionPlayerUi\n            final int[] compactSlots = initializeNotificationSlots();\n            mediaStyle.setShowActionsInCompactView(compactSlots);\n        }\n        player.UIs()\n                .get(MediaSessionPlayerUi.class)\n                .flatMap(MediaSessionPlayerUi::getSessionToken)\n                .ifPresent(mediaStyle::setMediaSession);\n\n        // setup notification builder\n        final var builder = setupNotificationBuilder(player.getContext(), mediaStyle)\n                .setColorized(player.getPrefs().getBoolean(\n                        player.getContext().getString(R.string.notification_colorize_key), true));\n\n        // set the initial value for the video thumbnail, updatable with updateNotificationThumbnail\n        setLargeIcon(builder);\n\n        return builder;\n    }\n\n    /**\n     * Updates the notification builder and the button icons depending on the playback state.\n     */\n    private synchronized void updateNotification() {\n        if (DEBUG) {\n            Log.d(TAG, \"updateNotification()\");\n        }\n\n        // also update content intent, in case the user switched players\n        notificationBuilder.setContentIntent(PendingIntentCompat.getActivity(player.getContext(),\n                NOTIFICATION_ID, getIntentForNotification(), FLAG_UPDATE_CURRENT, false));\n        notificationBuilder.setContentTitle(player.getVideoTitle());\n        notificationBuilder.setContentText(player.getUploaderName());\n        notificationBuilder.setTicker(player.getVideoTitle());\n\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {\n            // notification actions are ignored on Android 13+, and are replaced by code in\n            // MediaSessionPlayerUi\n            updateActions(notificationBuilder);\n        }\n    }\n\n\n    @SuppressLint(\"RestrictedApi\")\n    public boolean shouldUpdateBufferingSlot() {\n        if (notificationBuilder == null) {\n            // if there is no notification active, there is no point in updating it\n            return false;\n        } else if (notificationBuilder.mActions.size() < 3) {\n            // this should never happen, but let's make sure notification actions are populated\n            return true;\n        }\n\n        // only second and third slot could contain PLAY_PAUSE_BUFFERING, update them only if they\n        // are not already in the buffering state (the only one with a null action intent)\n        return (notificationSlots[1] == NotificationConstants.PLAY_PAUSE_BUFFERING\n                && notificationBuilder.mActions.get(1).actionIntent != null)\n                || (notificationSlots[2] == NotificationConstants.PLAY_PAUSE_BUFFERING\n                && notificationBuilder.mActions.get(2).actionIntent != null);\n    }\n\n    public static void startForegroundWithDummyNotification(final PlayerService service) {\n        final var builder = setupNotificationBuilder(service, new MediaStyle());\n        startForeground(service, builder.build());\n    }\n\n    public void createNotificationAndStartForeground() {\n        if (notificationBuilder == null) {\n            notificationBuilder = createNotification();\n        }\n        updateNotification();\n        startForeground(player.getService(), notificationBuilder.build());\n    }\n\n    public void cancelNotificationAndStopForeground() {\n        ServiceCompat.stopForeground(player.getService(), ServiceCompat.STOP_FOREGROUND_REMOVE);\n\n        if (notificationManager != null) {\n            notificationManager.cancel(NOTIFICATION_ID);\n        }\n        notificationManager = null;\n        notificationBuilder = null;\n    }\n\n\n    /////////////////////////////////////////////////////\n    // STATIC FUNCTIONS IN COMMON BETWEEN DUMMY AND REAL NOTIFICATION\n    /////////////////////////////////////////////////////\n\n    private static NotificationCompat.Builder setupNotificationBuilder(final Context context,\n                                                                       final MediaStyle style) {\n        return new NotificationCompat.Builder(context,\n                context.getString(R.string.notification_channel_id))\n                .setStyle(style)\n                .setPriority(NotificationCompat.PRIORITY_HIGH)\n                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n                .setCategory(NotificationCompat.CATEGORY_TRANSPORT)\n                .setShowWhen(false)\n                .setSmallIcon(R.drawable.ic_newpipe_triangle_white)\n                .setColor(ContextCompat.getColor(context, R.color.dark_background_color))\n                .setDeleteIntent(PendingIntentCompat.getBroadcast(context,\n                        NOTIFICATION_ID, new Intent(ACTION_CLOSE), FLAG_UPDATE_CURRENT, false));\n    }\n\n    private static void startForeground(final PlayerService service,\n                                        final Notification notification) {\n        // ServiceInfo constants are not used below Android Q, so 0 is set here\n        final int serviceType = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q\n                ? ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK : 0;\n        ServiceCompat.startForeground(service, NOTIFICATION_ID, notification, serviceType);\n    }\n\n\n    /////////////////////////////////////////////////////\n    // ACTIONS\n    /////////////////////////////////////////////////////\n\n    /**\n     * The compact slots array from settings contains indices from 0 to 4, each referring to one of\n     * the five actions configurable by the user. However, if the user sets an action to \"Nothing\",\n     * then all of the actions coming after will have a \"settings index\" different than the index\n     * of the corresponding action when sent to the system.\n     *\n     * @return the indices of compact slots referred to the list of non-nothing actions that will be\n     *         sent to the system\n     */\n    private int[] initializeNotificationSlots() {\n        final Collection<Integer> settingsCompactSlots = NotificationConstants\n                .getCompactSlotsFromPreferences(player.getContext(), player.getPrefs());\n        final List<Integer> adjustedCompactSlots = new ArrayList<>();\n\n        int nonNothingIndex = 0;\n        for (int i = 0; i < 5; ++i) {\n            notificationSlots[i] = player.getPrefs().getInt(\n                    player.getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]),\n                    NotificationConstants.SLOT_DEFAULTS[i]);\n\n            if (notificationSlots[i] != NotificationConstants.NOTHING) {\n                if (settingsCompactSlots.contains(i)) {\n                    adjustedCompactSlots.add(nonNothingIndex);\n                }\n                nonNothingIndex += 1;\n            }\n        }\n\n        return adjustedCompactSlots.stream().mapToInt(Integer::intValue).toArray();\n    }\n\n    @SuppressLint(\"RestrictedApi\")\n    private void updateActions(final NotificationCompat.Builder builder) {\n        builder.mActions.clear();\n        for (int i = 0; i < 5; ++i) {\n            addAction(builder, notificationSlots[i]);\n        }\n    }\n\n    private void addAction(final NotificationCompat.Builder builder,\n                           @NotificationConstants.Action final int slot) {\n        @Nullable final NotificationActionData data =\n                NotificationActionData.fromNotificationActionEnum(player, slot);\n        if (data == null) {\n            return;\n        }\n\n        final PendingIntent intent = PendingIntentCompat.getBroadcast(player.getContext(),\n                NOTIFICATION_ID, new Intent(data.action()), FLAG_UPDATE_CURRENT, false);\n        builder.addAction(new NotificationCompat.Action(data.icon(), data.name(), intent));\n    }\n\n    private Intent getIntentForNotification() {\n        if (player.audioPlayerSelected() || player.popupPlayerSelected()) {\n            // Means we play in popup or audio only. Let's show the play queue\n            return NavigationHelper.getPlayQueueActivityIntent(player.getContext());\n        } else {\n            // We are playing in fragment. Don't open another activity just show fragment. That's it\n            final Intent intent = NavigationHelper.getPlayerIntent(\n                    player.getContext(), MainActivity.class, null,\n                    PlayerIntentType.AllOthers);\n            intent.putExtra(Player.RESUME_PLAYBACK, true);\n            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n            intent.setAction(Intent.ACTION_MAIN);\n            intent.addCategory(Intent.CATEGORY_LAUNCHER);\n            return intent;\n        }\n    }\n\n\n    /////////////////////////////////////////////////////\n    // BITMAP\n    /////////////////////////////////////////////////////\n\n    private void setLargeIcon(final NotificationCompat.Builder builder) {\n        final boolean showThumbnail = player.getPrefs().getBoolean(\n                player.getContext().getString(R.string.show_thumbnail_key), true);\n        final Bitmap thumbnail = player.getThumbnail();\n        if (thumbnail == null || !showThumbnail) {\n            // since the builder is reused, make sure the thumbnail is unset if there is not one\n            builder.setLargeIcon((Bitmap) null);\n            return;\n        }\n\n        final boolean scaleImageToSquareAspectRatio = player.getPrefs().getBoolean(\n                player.getContext().getString(R.string.scale_to_square_image_in_notifications_key),\n                false);\n        if (scaleImageToSquareAspectRatio) {\n            builder.setLargeIcon(getBitmapWithSquareAspectRatio(thumbnail));\n        } else {\n            builder.setLargeIcon(thumbnail);\n        }\n    }\n\n    private Bitmap getBitmapWithSquareAspectRatio(@NonNull final Bitmap bitmap) {\n        // Find the smaller dimension and then take a center portion of the image that\n        // has that size.\n        final int w = bitmap.getWidth();\n        final int h = bitmap.getHeight();\n        final int dstSize = Math.min(w, h);\n        final int x = (w - dstSize) / 2;\n        final int y = (h - dstSize) / 2;\n        return Bitmap.createBitmap(bitmap, x, y, dstSize, dstSize);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playback/MediaSourceManager.java",
    "content": "package org.schabi.newpipe.player.playback;\n\nimport android.os.Handler;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.collection.ArraySet;\n\nimport org.reactivestreams.Subscriber;\nimport org.reactivestreams.Subscription;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.player.mediaitem.MediaItemTag;\nimport org.schabi.newpipe.player.mediasource.FailedMediaSource;\nimport org.schabi.newpipe.player.mediasource.LoadedMediaSource;\nimport org.schabi.newpipe.player.mediasource.ManagedMediaSource;\nimport org.schabi.newpipe.player.mediasource.ManagedMediaSourcePlaylist;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.MoveEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.RemoveEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.ReorderEvent;\n\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Observable;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.internal.subscriptions.EmptySubscription;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\nimport io.reactivex.rxjava3.subjects.PublishSubject;\n\nimport static org.schabi.newpipe.player.mediasource.FailedMediaSource.MediaSourceResolutionException;\nimport static org.schabi.newpipe.player.mediasource.FailedMediaSource.StreamInfoLoadException;\nimport static org.schabi.newpipe.player.playqueue.PlayQueue.DEBUG;\nimport static org.schabi.newpipe.util.ServiceHelper.getCacheExpirationMillis;\n\npublic class MediaSourceManager {\n    @NonNull\n    private final String TAG = \"MediaSourceManager@\" + hashCode();\n\n    /**\n     * Determines how many streams before and after the current stream should be loaded.\n     * The default value (1) ensures seamless playback under typical network settings.\n     * <p>\n     * The streams after the current will be loaded into the playlist timeline while the\n     * streams before will only be cached for future usage.\n     * </p>\n     *\n     * @see #onMediaSourceReceived(PlayQueueItem, ManagedMediaSource)\n     */\n    private static final int WINDOW_SIZE = 1;\n\n    /**\n     * Determines the maximum number of disposables allowed in the {@link #loaderReactor}.\n     * Once exceeded, new calls to {@link #loadImmediate()} will evict all disposables in the\n     * {@link #loaderReactor} in order to load a new set of items.\n     *\n     * @see #loadImmediate()\n     * @see #maybeLoadItem(PlayQueueItem)\n     */\n    private static final int MAXIMUM_LOADER_SIZE = WINDOW_SIZE * 2 + 1;\n\n    @NonNull\n    private final PlaybackListener playbackListener;\n    @NonNull\n    private final PlayQueue playQueue;\n\n    /**\n     * Determines the gap time between the playback position and the playback duration which\n     * the {@link #getEdgeIntervalSignal()} begins to request loading.\n     *\n     * @see #progressUpdateIntervalMillis\n     */\n    private final long playbackNearEndGapMillis;\n\n    /**\n     * Determines the interval which the {@link #getEdgeIntervalSignal()} waits for between\n     * each request for loading, once {@link #playbackNearEndGapMillis} has reached.\n     */\n    private final long progressUpdateIntervalMillis;\n\n    @NonNull\n    private final Observable<Long> nearEndIntervalSignal;\n\n    /**\n     * Process only the last load order when receiving a stream of load orders (lessens I/O).\n     * <p>\n     * The higher it is, the less loading occurs during rapid noncritical timeline changes.\n     * </p>\n     * <p>\n     * Not recommended to go below 100ms.\n     * </p>\n     *\n     * @see #loadDebounced()\n     */\n    private final long loadDebounceMillis;\n\n    @NonNull\n    private final Disposable debouncedLoader;\n    @NonNull\n    private final PublishSubject<Long> debouncedSignal;\n\n    @NonNull\n    private Subscription playQueueReactor;\n\n    @NonNull\n    private final CompositeDisposable loaderReactor;\n    @NonNull\n    private final Set<PlayQueueItem> loadingItems;\n\n    @NonNull\n    private final AtomicBoolean isBlocked;\n\n    @NonNull\n    private ManagedMediaSourcePlaylist playlist;\n\n    private final Handler removeMediaSourceHandler = new Handler();\n\n    public MediaSourceManager(@NonNull final PlaybackListener listener,\n                              @NonNull final PlayQueue playQueue) {\n        this(listener, playQueue, 400L,\n                /*playbackNearEndGapMillis=*/TimeUnit.MILLISECONDS.convert(30, TimeUnit.SECONDS),\n                /*progressUpdateIntervalMillis*/TimeUnit.MILLISECONDS.convert(2, TimeUnit.SECONDS));\n    }\n\n    private MediaSourceManager(@NonNull final PlaybackListener listener,\n                               @NonNull final PlayQueue playQueue,\n                               final long loadDebounceMillis,\n                               final long playbackNearEndGapMillis,\n                               final long progressUpdateIntervalMillis) {\n        if (playQueue.getBroadcastReceiver() == null) {\n            throw new IllegalArgumentException(\"Play Queue has not been initialized.\");\n        }\n        if (playbackNearEndGapMillis < progressUpdateIntervalMillis) {\n            throw new IllegalArgumentException(\"Playback end gap=[\" + playbackNearEndGapMillis\n                    + \" ms] must be longer than update interval=[ \" + progressUpdateIntervalMillis\n                    + \" ms] for them to be useful.\");\n        }\n\n        this.playbackListener = listener;\n        this.playQueue = playQueue;\n\n        this.playbackNearEndGapMillis = playbackNearEndGapMillis;\n        this.progressUpdateIntervalMillis = progressUpdateIntervalMillis;\n        this.nearEndIntervalSignal = getEdgeIntervalSignal();\n\n        this.loadDebounceMillis = loadDebounceMillis;\n        this.debouncedSignal = PublishSubject.create();\n        this.debouncedLoader = getDebouncedLoader();\n\n        this.playQueueReactor = EmptySubscription.INSTANCE;\n        this.loaderReactor = new CompositeDisposable();\n\n        this.isBlocked = new AtomicBoolean(false);\n\n        this.playlist = new ManagedMediaSourcePlaylist();\n\n        this.loadingItems = Collections.synchronizedSet(new ArraySet<>());\n\n        playQueue.getBroadcastReceiver()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(getReactor());\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Exposed Methods\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * Dispose the manager and releases all message buses and loaders.\n     */\n    public void dispose() {\n        if (DEBUG) {\n            Log.d(TAG, \"close() called.\");\n        }\n\n        debouncedSignal.onComplete();\n        debouncedLoader.dispose();\n\n        playQueueReactor.cancel();\n        loaderReactor.dispose();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Event Reactor\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private Subscriber<PlayQueueEvent> getReactor() {\n        return new Subscriber<>() {\n            @Override\n            public void onSubscribe(@NonNull final Subscription d) {\n                playQueueReactor.cancel();\n                playQueueReactor = d;\n                playQueueReactor.request(1);\n            }\n\n            @Override\n            public void onNext(@NonNull final PlayQueueEvent playQueueMessage) {\n                onPlayQueueChanged(playQueueMessage);\n            }\n\n            @Override\n            public void onError(@NonNull final Throwable e) {\n            }\n\n            @Override\n            public void onComplete() {\n            }\n        };\n    }\n\n    private void onPlayQueueChanged(final PlayQueueEvent event) {\n        if (playQueue.isEmpty() && playQueue.isComplete()) {\n            playbackListener.onPlaybackShutdown();\n            return;\n        }\n\n        // Event specific action\n        switch (event.type()) {\n            case INIT:\n            case ERROR:\n                maybeBlock();\n            case APPEND:\n                populateSources();\n                break;\n            case SELECT:\n                maybeRenewCurrentIndex();\n                break;\n            case REMOVE:\n                final RemoveEvent removeEvent = (RemoveEvent) event;\n                playlist.remove(removeEvent.getRemoveIndex());\n                break;\n            case MOVE:\n                final MoveEvent moveEvent = (MoveEvent) event;\n                playlist.move(moveEvent.getFromIndex(), moveEvent.getToIndex());\n                break;\n            case REORDER:\n                // Need to move to ensure the playing index from play queue matches that of\n                // the source timeline, and then window correction can take care of the rest\n                final ReorderEvent reorderEvent = (ReorderEvent) event;\n                playlist.move(reorderEvent.getFromSelectedIndex(),\n                        reorderEvent.getToSelectedIndex());\n                break;\n            case RECOVERY:\n            default:\n                break;\n        }\n\n        // Loading and Syncing\n        switch (event.type()) {\n            case INIT: case REORDER: case ERROR: case SELECT:\n                loadImmediate(); // low frequency, critical events\n                break;\n            case APPEND: case REMOVE: case MOVE: case RECOVERY:\n            default:\n                loadDebounced(); // high frequency or noncritical events\n                break;\n        }\n\n        // update ui and notification\n        switch (event.type()) {\n            case APPEND: case REMOVE: case MOVE: case REORDER:\n                playbackListener.onPlayQueueEdited();\n        }\n\n        if (!isPlayQueueReady()) {\n            maybeBlock();\n            playQueue.fetch();\n        }\n        playQueueReactor.request(1);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playback Locking\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private boolean isPlayQueueReady() {\n        final boolean isWindowLoaded = playQueue.size() - playQueue.getIndex() > WINDOW_SIZE;\n        return playQueue.isComplete() || isWindowLoaded;\n    }\n\n    private boolean isPlaybackReady() {\n        if (playlist.size() != playQueue.size()) {\n            return false;\n        }\n\n        final ManagedMediaSource mediaSource = playlist.get(playQueue.getIndex());\n        final PlayQueueItem playQueueItem = playQueue.getItem();\n        if (mediaSource == null || playQueueItem == null) {\n            return false;\n        }\n\n        return mediaSource.isStreamEqual(playQueueItem);\n    }\n\n    private void maybeBlock() {\n        if (DEBUG) {\n            Log.d(TAG, \"maybeBlock() called.\");\n        }\n\n        if (isBlocked.get()) {\n            return;\n        }\n\n        playbackListener.onPlaybackBlock();\n        resetSources();\n\n        isBlocked.set(true);\n    }\n\n    private boolean maybeUnblock() {\n        if (DEBUG) {\n            Log.d(TAG, \"maybeUnblock() called.\");\n        }\n\n        if (isBlocked.get()) {\n            isBlocked.set(false);\n            playbackListener.onPlaybackUnblock(playlist.getParentMediaSource());\n            return true;\n        }\n\n        return false;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Metadata Synchronization\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void maybeSync(final boolean wasBlocked) {\n        if (DEBUG) {\n            Log.d(TAG, \"maybeSync() called.\");\n        }\n\n        final PlayQueueItem currentItem = playQueue.getItem();\n        if (isBlocked.get() || currentItem == null) {\n            return;\n        }\n\n        playbackListener.onPlaybackSynchronize(currentItem, wasBlocked);\n    }\n\n    private synchronized void maybeSynchronizePlayer() {\n        if (isPlayQueueReady() && isPlaybackReady()) {\n            final boolean isBlockReleased = maybeUnblock();\n            maybeSync(isBlockReleased);\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // MediaSource Loading\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private Observable<Long> getEdgeIntervalSignal() {\n        return Observable.interval(progressUpdateIntervalMillis,\n                                   TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())\n                .filter(ignored ->\n                        playbackListener.isApproachingPlaybackEdge(playbackNearEndGapMillis));\n    }\n\n    private Disposable getDebouncedLoader() {\n        return debouncedSignal.mergeWith(nearEndIntervalSignal)\n                .debounce(loadDebounceMillis, TimeUnit.MILLISECONDS)\n                .subscribeOn(Schedulers.single())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(timestamp -> loadImmediate());\n    }\n\n    private void loadDebounced() {\n        debouncedSignal.onNext(System.currentTimeMillis());\n    }\n\n    private void loadImmediate() {\n        if (DEBUG) {\n            Log.d(TAG, \"MediaSource - loadImmediate() called\");\n        }\n        final ItemsToLoad itemsToLoad = getItemsToLoad(playQueue);\n        if (itemsToLoad == null) {\n            return;\n        }\n\n        // Evict the previous items being loaded to free up memory, before start loading new ones\n        maybeClearLoaders();\n\n        maybeLoadItem(itemsToLoad.center);\n        for (final PlayQueueItem item : itemsToLoad.neighbors) {\n            maybeLoadItem(item);\n        }\n    }\n\n    private void maybeLoadItem(@NonNull final PlayQueueItem item) {\n        if (DEBUG) {\n            Log.d(TAG, \"maybeLoadItem() called.\");\n        }\n        if (playQueue.indexOf(item) >= playlist.size()) {\n            return;\n        }\n\n        if (!loadingItems.contains(item) && isCorrectionNeeded(item)) {\n            if (DEBUG) {\n                Log.d(TAG, \"MediaSource - Loading=[\" + item.getTitle() + \"] \"\n                        + \"with url=[\" + item.getUrl() + \"]\");\n            }\n\n            loadingItems.add(item);\n            final Disposable loader = getLoadedMediaSource(item)\n                    .observeOn(AndroidSchedulers.mainThread())\n                    /* No exception handling since getLoadedMediaSource guarantees nonnull return */\n                    .subscribe(mediaSource -> onMediaSourceReceived(item, mediaSource));\n            loaderReactor.add(loader);\n        }\n    }\n\n    private Single<ManagedMediaSource> getLoadedMediaSource(@NonNull final PlayQueueItem stream) {\n        return stream.getStream()\n                .map(streamInfo -> Optional\n                        .ofNullable(playbackListener.sourceOf(stream, streamInfo))\n                        .<ManagedMediaSource>flatMap(source ->\n                                MediaItemTag.from(source.getMediaItem())\n                                        .map(tag -> {\n                                            final int serviceId = streamInfo.getServiceId();\n                                            final long expiration = System.currentTimeMillis()\n                                                    + getCacheExpirationMillis(serviceId);\n                                            return new LoadedMediaSource(source, tag, stream,\n                                                    expiration);\n                                        })\n                        )\n                        .orElseGet(() -> {\n                            final String message = \"Unable to resolve source from stream info. \"\n                                    + \"URL: \" + stream.getUrl()\n                                    + \", audio count: \" + streamInfo.getAudioStreams().size()\n                                    + \", video count: \" + streamInfo.getVideoOnlyStreams().size()\n                                    + \", \" + streamInfo.getVideoStreams().size();\n                            return FailedMediaSource.of(stream,\n                                    new MediaSourceResolutionException(message));\n                        })\n                )\n                .onErrorReturn(throwable -> {\n                    if (throwable instanceof ExtractionException) {\n                        return FailedMediaSource.of(stream, new StreamInfoLoadException(throwable));\n                    }\n                    // Non-source related error expected here (e.g. network),\n                    // should allow retry shortly after the error.\n                    final long allowRetryIn = TimeUnit.MILLISECONDS.convert(3,\n                            TimeUnit.SECONDS);\n                    return FailedMediaSource.of(stream, new Exception(throwable), allowRetryIn);\n                });\n    }\n\n    private void onMediaSourceReceived(@NonNull final PlayQueueItem item,\n                                       @NonNull final ManagedMediaSource mediaSource) {\n        if (DEBUG) {\n            Log.d(TAG, \"MediaSource - Loaded=[\" + item.getTitle()\n                    + \"] with url=[\" + item.getUrl() + \"]\");\n        }\n\n        loadingItems.remove(item);\n\n        final int itemIndex = playQueue.indexOf(item);\n        // Only update the playlist timeline for items at the current index or after.\n        if (isCorrectionNeeded(item)) {\n            if (DEBUG) {\n                Log.d(TAG, \"MediaSource - Updating index=[\" + itemIndex + \"] with \"\n                        + \"title=[\" + item.getTitle() + \"] at url=[\" + item.getUrl() + \"]\");\n            }\n            playlist.update(itemIndex, mediaSource, removeMediaSourceHandler,\n                    this::maybeSynchronizePlayer);\n        }\n    }\n\n    /**\n     * Checks if the corresponding MediaSource in\n     * {@link com.google.android.exoplayer2.source.ConcatenatingMediaSource}\n     * for a given {@link PlayQueueItem} needs replacement, either due to gapless playback\n     * readiness or playlist desynchronization.\n     * <p>\n     * If the given {@link PlayQueueItem} is currently being played and is already loaded,\n     * then correction is not only needed if the playlist is desynchronized. Otherwise, the\n     * check depends on the status (e.g. expiration or placeholder) of the\n     * {@link ManagedMediaSource}.\n     * </p>\n     *\n     * @param item {@link PlayQueueItem} to check\n     * @return whether a correction is needed\n     */\n    private boolean isCorrectionNeeded(@NonNull final PlayQueueItem item) {\n        final int index = playQueue.indexOf(item);\n        final ManagedMediaSource mediaSource = playlist.get(index);\n        return mediaSource != null && mediaSource.shouldBeReplacedWith(item,\n                index != playQueue.getIndex());\n    }\n\n    /**\n     * Checks if the current playing index contains an expired {@link ManagedMediaSource}.\n     * If so, the expired source is replaced by a dummy {@link ManagedMediaSource} and\n     * {@link #loadImmediate()} is called to reload the current item.\n     * <br><br>\n     * If not, then the media source at the current index is ready for playback, and\n     * {@link #maybeSynchronizePlayer()} is called.\n     * <br><br>\n     * Under both cases, {@link #maybeSync(boolean)} will be called to ensure the listener\n     * is up-to-date.\n     */\n    private void maybeRenewCurrentIndex() {\n        final int currentIndex = playQueue.getIndex();\n        final PlayQueueItem currentItem = playQueue.getItem();\n        final ManagedMediaSource currentSource = playlist.get(currentIndex);\n        if (currentItem == null || currentSource == null) {\n            return;\n        }\n\n        if (!currentSource.shouldBeReplacedWith(currentItem, true)) {\n            maybeSynchronizePlayer();\n            return;\n        }\n\n        if (DEBUG) {\n            Log.d(TAG, \"MediaSource - Reloading currently playing, \"\n                    + \"index=[\" + currentIndex + \"], item=[\" + currentItem.getTitle() + \"]\");\n        }\n        playlist.invalidate(currentIndex, removeMediaSourceHandler, this::loadImmediate);\n    }\n\n    private void maybeClearLoaders() {\n        if (DEBUG) {\n            Log.d(TAG, \"MediaSource - maybeClearLoaders() called.\");\n        }\n        if (!loadingItems.contains(playQueue.getItem())\n                && loaderReactor.size() > MAXIMUM_LOADER_SIZE) {\n            loaderReactor.clear();\n            loadingItems.clear();\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // MediaSource Playlist Helpers\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void resetSources() {\n        if (DEBUG) {\n            Log.d(TAG, \"resetSources() called.\");\n        }\n        playlist = new ManagedMediaSourcePlaylist();\n    }\n\n    private void populateSources() {\n        if (DEBUG) {\n            Log.d(TAG, \"populateSources() called.\");\n        }\n        while (playlist.size() < playQueue.size()) {\n            playlist.expand();\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Manager Helpers\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Nullable\n    private static ItemsToLoad getItemsToLoad(@NonNull final PlayQueue playQueue) {\n        // The current item has higher priority\n        final int currentIndex = playQueue.getIndex();\n        final PlayQueueItem currentItem = playQueue.getItem(currentIndex);\n        if (currentItem == null) {\n            return null;\n        }\n\n        // The rest are just for seamless playback\n        // Although timeline is not updated prior to the current index, these sources are still\n        // loaded into the cache for faster retrieval at a potentially later time.\n        final int leftBound = Math.max(0, currentIndex - MediaSourceManager.WINDOW_SIZE);\n        final int rightLimit = currentIndex + MediaSourceManager.WINDOW_SIZE + 1;\n        final int rightBound = Math.min(playQueue.size(), rightLimit);\n        final Set<PlayQueueItem> neighbors = new ArraySet<>(\n                playQueue.getStreams().subList(leftBound, rightBound));\n\n        // Do a round robin\n        final int excess = rightLimit - playQueue.size();\n        if (excess >= 0) {\n            neighbors.addAll(playQueue.getStreams()\n                    .subList(0, Math.min(playQueue.size(), excess)));\n        }\n        neighbors.remove(currentItem);\n\n        return new ItemsToLoad(currentItem, neighbors);\n    }\n\n    private static class ItemsToLoad {\n        @NonNull\n        private final PlayQueueItem center;\n        @NonNull\n        private final Collection<PlayQueueItem> neighbors;\n\n        ItemsToLoad(@NonNull final PlayQueueItem center,\n                    @NonNull final Collection<PlayQueueItem> neighbors) {\n            this.center = center;\n            this.neighbors = neighbors;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playback/PlaybackListener.java",
    "content": "package org.schabi.newpipe.player.playback;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.source.MediaSource;\n\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\n\npublic interface PlaybackListener {\n    /**\n     * Called to check if the currently playing stream is approaching the end of its playback.\n     * Implementation should return true when the current playback position is progressing within\n     * timeToEndMillis or less to its playback during.\n     * <p>\n     * May be called at any time.\n     * </p>\n     *\n     * @param timeToEndMillis\n     * @return whether the stream is approaching end of playback\n     */\n    boolean isApproachingPlaybackEdge(long timeToEndMillis);\n\n    /**\n     * Called when the stream at the current queue index is not ready yet.\n     * Signals to the listener to block the player from playing anything and notify the source\n     * is now invalid.\n     * <p>\n     * May be called at any time.\n     * </p>\n     */\n    void onPlaybackBlock();\n\n    /**\n     * Called when the stream at the current queue index is ready.\n     * Signals to the listener to resume the player by preparing a new source.\n     * <p>\n     * May be called only when the player is blocked.\n     * </p>\n     *\n     * @param mediaSource\n     */\n    void onPlaybackUnblock(MediaSource mediaSource);\n\n    /**\n     * Called when the queue index is refreshed.\n     * Signals to the listener to synchronize the player's window to the manager's\n     * window.\n     * <p>\n     * May be called anytime at any amount once unblock is called.\n     * </p>\n     *\n     * @param item          item the player should be playing/synchronized to\n     * @param wasBlocked    was the player recently released from blocking state\n     */\n    void onPlaybackSynchronize(@NonNull PlayQueueItem item, boolean wasBlocked);\n\n    /**\n     * Requests the listener to resolve a stream info into a media source\n     * according to the listener's implementation (background, popup or main video player).\n     * <p>\n     * May be called at any time.\n     * </p>\n     * @param item\n     * @param info\n     * @return the corresponding {@link MediaSource}\n     */\n    @Nullable\n    MediaSource sourceOf(PlayQueueItem item, StreamInfo info);\n\n    /**\n     * Called when the play queue can no longer be played or used.\n     * Currently, this means the play queue is empty and complete.\n     * Signals to the listener that it should shutdown.\n     * <p>\n     * May be called at any time.\n     * </p>\n     */\n    void onPlaybackShutdown();\n\n    /**\n     * Called whenever the play queue was edited (items were added, deleted or moved),\n     * use this to e.g. update notification buttons or fragment ui.\n     * <p>\n     * May be called at any time.\n     * </p>\n     */\n    void onPlayQueueEdited();\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playback/SurfaceHolderCallback.java",
    "content": "package org.schabi.newpipe.player.playback;\n\nimport android.content.Context;\nimport android.view.SurfaceHolder;\n\nimport com.google.android.exoplayer2.Player;\nimport com.google.android.exoplayer2.video.PlaceholderSurface;\n\n/**\n * Prevent error message: 'Unrecoverable player error occurred'\n * In case of rotation some users see this kind of an error which is preventable\n * having a Callback that handles the lifecycle of the surface.\n * <p>\n * How?: In case we are no longer able to write to the surface eg. through rotation/putting in\n * background we set set a DummySurface. Although it it works on API >= 23 only.\n * Result: we get a little video interruption (audio is still fine) but we won't get the\n * 'Unrecoverable player error occurred' error message.\n * <p>\n * This implementation is based on:\n * 'ExoPlayer stuck in buffering after re-adding the surface view a few time #2703'\n * <p>\n * -> exoplayer fix suggestion link\n * https://github.com/google/ExoPlayer/issues/2703#issuecomment-300599981\n */\npublic final class SurfaceHolderCallback implements SurfaceHolder.Callback {\n\n    private final Context context;\n    private final Player player;\n    private PlaceholderSurface placeholderSurface;\n\n    public SurfaceHolderCallback(final Context context, final Player player) {\n        this.context = context;\n        this.player = player;\n    }\n\n    @Override\n    public void surfaceCreated(final SurfaceHolder holder) {\n        player.setVideoSurface(holder.getSurface());\n    }\n\n    @Override\n    public void surfaceChanged(final SurfaceHolder holder,\n                               final int format,\n                               final int width,\n                               final int height) {\n    }\n\n    @Override\n    public void surfaceDestroyed(final SurfaceHolder holder) {\n        if (placeholderSurface == null) {\n            placeholderSurface = PlaceholderSurface.newInstanceV17(context, false);\n        }\n        player.setVideoSurface(placeholderSurface);\n    }\n\n    public void release() {\n        if (placeholderSurface != null) {\n            placeholderSurface.release();\n            placeholderSurface = null;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playqueue/AbstractInfoPlayQueue.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.ListExtractor;\nimport org.schabi.newpipe.extractor.ListInfo;\nimport org.schabi.newpipe.extractor.Page;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\nimport io.reactivex.rxjava3.core.SingleObserver;\nimport io.reactivex.rxjava3.disposables.Disposable;\n\nabstract class AbstractInfoPlayQueue<T extends ListInfo<? extends InfoItem>>\n        extends PlayQueue {\n    boolean isInitial;\n    private boolean isComplete;\n\n    final int serviceId;\n    final String baseUrl;\n    @Nullable\n    Page nextPage;\n\n    private transient Disposable fetchReactor;\n\n    protected AbstractInfoPlayQueue(final T info) {\n        this(info, 0);\n    }\n\n    protected AbstractInfoPlayQueue(final T info, final int index) {\n        this(info.getServiceId(), info.getUrl(), info.getNextPage(),\n                info.getRelatedItems()\n                        .stream()\n                        .filter(StreamInfoItem.class::isInstance)\n                        .map(StreamInfoItem.class::cast)\n                        .collect(Collectors.toList()),\n                index);\n    }\n\n    protected AbstractInfoPlayQueue(final int serviceId,\n                                    final String url,\n                                    final Page nextPage,\n                                    final List<StreamInfoItem> streams,\n                                    final int index) {\n        super(index, extractListItems(streams));\n\n        this.baseUrl = url;\n        this.nextPage = nextPage;\n        this.serviceId = serviceId;\n\n        this.isInitial = streams.isEmpty();\n        this.isComplete = !isInitial && !Page.isValid(nextPage);\n    }\n\n    protected abstract String getTag();\n\n    @Override\n    public boolean isComplete() {\n        return isComplete;\n    }\n\n    SingleObserver<T> getHeadListObserver() {\n        return new SingleObserver<>() {\n            @Override\n            public void onSubscribe(@NonNull final Disposable d) {\n                if (isComplete || !isInitial || (fetchReactor != null\n                        && !fetchReactor.isDisposed())) {\n                    d.dispose();\n                } else {\n                    fetchReactor = d;\n                }\n            }\n\n            @Override\n            public void onSuccess(@NonNull final T result) {\n                isInitial = false;\n                if (!result.hasNextPage()) {\n                    isComplete = true;\n                }\n                nextPage = result.getNextPage();\n\n                append(extractListItems(result.getRelatedItems()\n                        .stream()\n                        .filter(StreamInfoItem.class::isInstance)\n                        .map(StreamInfoItem.class::cast)\n                        .collect(Collectors.toList())));\n\n                fetchReactor.dispose();\n                fetchReactor = null;\n            }\n\n            @Override\n            public void onError(@NonNull final Throwable e) {\n                Log.e(getTag(), \"Error fetching more playlist, marking playlist as complete.\", e);\n                isComplete = true;\n                notifyChange();\n            }\n        };\n    }\n\n    SingleObserver<ListExtractor.InfoItemsPage<? extends InfoItem>> getNextPageObserver() {\n        return new SingleObserver<>() {\n            @Override\n            public void onSubscribe(@NonNull final Disposable d) {\n                if (isComplete || isInitial || (fetchReactor != null\n                        && !fetchReactor.isDisposed())) {\n                    d.dispose();\n                } else {\n                    fetchReactor = d;\n                }\n            }\n\n            @Override\n            public void onSuccess(\n                    @NonNull final ListExtractor.InfoItemsPage<? extends InfoItem> result) {\n                if (!result.hasNextPage()) {\n                    isComplete = true;\n                }\n                nextPage = result.getNextPage();\n\n                append(extractListItems(result.getItems()\n                        .stream()\n                        .filter(StreamInfoItem.class::isInstance)\n                        .map(StreamInfoItem.class::cast)\n                        .collect(Collectors.toList())));\n\n                fetchReactor.dispose();\n                fetchReactor = null;\n            }\n\n            @Override\n            public void onError(@NonNull final Throwable e) {\n                Log.e(getTag(), \"Error fetching more playlist, marking playlist as complete.\", e);\n                isComplete = true;\n                notifyChange();\n            }\n        };\n    }\n\n    @Override\n    public void dispose() {\n        super.dispose();\n        if (fetchReactor != null) {\n            fetchReactor.dispose();\n        }\n        fetchReactor = null;\n    }\n\n    private static List<PlayQueueItem> extractListItems(final List<StreamInfoItem> infoItems) {\n        return infoItems.stream().map(PlayQueueItem::new).collect(Collectors.toList());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playqueue/ChannelTabPlayQueue.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\n\nimport org.schabi.newpipe.extractor.Page;\nimport org.schabi.newpipe.extractor.channel.tabs.ChannelTabInfo;\nimport org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.util.ExtractorHelper;\n\nimport java.util.Collections;\nimport java.util.List;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic final class ChannelTabPlayQueue extends AbstractInfoPlayQueue<ChannelTabInfo> {\n\n    final ListLinkHandler linkHandler;\n\n    public ChannelTabPlayQueue(final int serviceId,\n                               final ListLinkHandler linkHandler,\n                               final Page nextPage,\n                               final List<StreamInfoItem> streams,\n                               final int index) {\n        super(serviceId, linkHandler.getUrl(), nextPage, streams, index);\n        this.linkHandler = linkHandler;\n    }\n\n    public ChannelTabPlayQueue(final int serviceId,\n                               final ListLinkHandler linkHandler) {\n        this(serviceId, linkHandler, null, Collections.emptyList(), 0);\n    }\n\n    @Override\n    protected String getTag() {\n        return \"ChannelTabPlayQueue@\" + Integer.toHexString(hashCode());\n    }\n\n    @Override\n    public void fetch() {\n        if (isInitial) {\n            ExtractorHelper.getChannelTab(this.serviceId, this.linkHandler, false)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(getHeadListObserver());\n        } else {\n            ExtractorHelper.getMoreChannelTabItems(this.serviceId, this.linkHandler, this.nextPage)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(getNextPageObserver());\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.AppendEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.ErrorEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.InitEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.MoveEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.RecoveryEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.RemoveEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.ReorderEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.SelectEvent;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.BackpressureStrategy;\nimport io.reactivex.rxjava3.core.Flowable;\nimport io.reactivex.rxjava3.subjects.PublishSubject;\n\n/**\n * PlayQueue is responsible for keeping track of a list of streams and the index of\n * the stream that should be currently playing.\n * <p>\n * This class contains basic manipulation of a playlist while also functions as a\n * message bus, providing all listeners with new updates to the play queue.\n * </p>\n * <p>\n * This class can be serialized for passing intents, but in order to start the\n * message bus, it must be initialized.\n * </p>\n */\npublic abstract class PlayQueue implements Serializable {\n    public static final boolean DEBUG = MainActivity.DEBUG;\n    @NonNull\n    private final AtomicInteger queueIndex;\n    private final List<PlayQueueItem> history = new ArrayList<>();\n\n    private List<PlayQueueItem> backup;\n    private List<PlayQueueItem> streams;\n\n    private transient PublishSubject<PlayQueueEvent> eventBroadcast;\n    private transient Flowable<PlayQueueEvent> broadcastReceiver;\n    private transient boolean disposed = false;\n\n    PlayQueue(final int index, final List<PlayQueueItem> startWith) {\n        streams = new ArrayList<>(startWith);\n\n        if (streams.size() > index) {\n            history.add(streams.get(index));\n        }\n\n        queueIndex = new AtomicInteger(index);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playlist actions\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * Initializes the play queue message buses.\n     * <p>\n     * Also starts a self reporter for logging if debug mode is enabled.\n     * </p>\n     */\n    public void init() {\n        eventBroadcast = PublishSubject.create();\n\n        broadcastReceiver = eventBroadcast.toFlowable(BackpressureStrategy.BUFFER)\n                .observeOn(AndroidSchedulers.mainThread())\n                .startWithItem(new InitEvent());\n    }\n\n    /**\n     * Dispose the play queue by stopping all message buses.\n     */\n    public void dispose() {\n        if (eventBroadcast != null) {\n            eventBroadcast.onComplete();\n        }\n\n        eventBroadcast = null;\n        broadcastReceiver = null;\n        disposed = true;\n    }\n\n    /**\n     * Checks if the queue is complete.\n     * <p>\n     * A queue is complete if it has loaded all items in an external playlist\n     * single stream or local queues are always complete.\n     * </p>\n     *\n     * @return whether the queue is complete\n     */\n    public abstract boolean isComplete();\n\n    /**\n     * Load partial queue in the background, does nothing if the queue is complete.\n     */\n    public abstract void fetch();\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Readonly ops\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * @return the current index that should be played\n     */\n    public int getIndex() {\n        return queueIndex.get();\n    }\n\n    /**\n     * Changes the current playing index to a new index.\n     * <p>\n     * This method is guarded using in a circular manner for index exceeding the play queue size.\n     * </p>\n     * <p>\n     * Will emit a {@link SelectEvent} if the index is not the current playing index.\n     * </p>\n     *\n     * @param index the index to be set\n     */\n    public synchronized void setIndex(final int index) {\n        final int oldIndex = getIndex();\n\n        final int newIndex;\n\n        if (index < 0) {\n            newIndex = 0;\n        } else if (index < streams.size()) {\n            // Regular assignment for index in bounds\n            newIndex = index;\n        } else if (streams.isEmpty()) {\n            // Out of bounds from here on\n            // Need to check if stream is empty to prevent arithmetic error and negative index\n            newIndex = 0;\n        } else if (isComplete()) {\n            // Circular indexing\n            newIndex = index % streams.size();\n        } else {\n            // Index of last element\n            newIndex = streams.size() - 1;\n        }\n\n        queueIndex.set(newIndex);\n\n        if (oldIndex != newIndex) {\n            history.add(streams.get(newIndex));\n        }\n\n        /*\n        TODO: Documentation states that a SelectEvent will only be emitted if the new index is...\n        different from the old one but this is emitted regardless? Not sure what this what it does\n        exactly so I won't touch it\n         */\n        broadcast(new SelectEvent(oldIndex, newIndex));\n    }\n\n    /**\n     * @return the current item that should be played, or null if the queue is empty\n     */\n    @Nullable\n    public PlayQueueItem getItem() {\n        return getItem(getIndex());\n    }\n\n    /**\n     * @param index the index of the item to return\n     * @return the item at the given index, or null if the index is out of bounds\n     */\n    @Nullable\n    public PlayQueueItem getItem(final int index) {\n        if (index < 0 || index >= streams.size()) {\n            return null;\n        }\n        return streams.get(index);\n    }\n\n    /**\n     * Returns the index of the given item using referential equality.\n     * May be null despite play queue contains identical item.\n     *\n     * @param item the item to find the index of\n     * @return the index of the given item\n     */\n    public int indexOf(@NonNull final PlayQueueItem item) {\n        return streams.indexOf(item);\n    }\n\n    /**\n     * @return the current size of play queue.\n     */\n    public int size() {\n        return streams.size();\n    }\n\n    /**\n     * Checks if the play queue is empty.\n     *\n     * @return whether the play queue is empty\n     */\n    public boolean isEmpty() {\n        return streams.isEmpty();\n    }\n\n    /**\n     * Determines if the current play queue is shuffled.\n     *\n     * @return whether the play queue is shuffled\n     */\n    public boolean isShuffled() {\n        return backup != null;\n    }\n\n    /**\n     * @return an immutable view of the play queue\n     */\n    @NonNull\n    public List<PlayQueueItem> getStreams() {\n        return Collections.unmodifiableList(streams);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Write ops\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * Returns the play queue's update broadcast.\n     * May be null if the play queue message bus is not initialized.\n     *\n     * @return the play queue's update broadcast\n     */\n    @Nullable\n    public Flowable<PlayQueueEvent> getBroadcastReceiver() {\n        return broadcastReceiver;\n    }\n\n    /**\n     * Changes the current playing index by an offset amount.\n     * <p>\n     * Will emit a {@link SelectEvent} if offset is non-zero.\n     * </p>\n     *\n     * @param offset the offset relative to the current index\n     */\n    public synchronized void offsetIndex(final int offset) {\n        setIndex(getIndex() + offset);\n    }\n\n    /**\n     * Notifies that a change has occurred.\n     */\n    public synchronized void notifyChange() {\n        broadcast(new AppendEvent(0));\n    }\n\n    /**\n     * Appends the given {@link PlayQueueItem}s to the current play queue.\n     * <p>\n     * If the play queue is shuffled, then append the items to the backup queue as is and\n     * append the shuffle items to the play queue.\n     * </p>\n     * <p>\n     * Will emit a {@link AppendEvent} on any given context.\n     * </p>\n     *\n     * @param items {@link PlayQueueItem}s to append\n     */\n    public synchronized void append(@NonNull final List<PlayQueueItem> items) {\n        final List<PlayQueueItem> itemList = new ArrayList<>(items);\n\n        if (isShuffled()) {\n            backup.addAll(itemList);\n            Collections.shuffle(itemList);\n        }\n        if (!streams.isEmpty() && streams.get(streams.size() - 1).isAutoQueued()\n                && !itemList.get(0).isAutoQueued()) {\n            streams.remove(streams.size() - 1);\n        }\n        streams.addAll(itemList);\n\n        broadcast(new AppendEvent(itemList.size()));\n    }\n\n    /**\n     * Add the given item after the current stream.\n     *\n     * @param item item to add.\n     * @param skipIfSame if set, skip adding if the next stream is the same stream.\n     */\n    public void enqueueNext(@NonNull final PlayQueueItem item, final boolean skipIfSame) {\n        final int currentIndex = getIndex();\n        // if the next item is the same item as the one we want to enqueue, skip if flag is true\n        if (skipIfSame && item.isSameItem(getItem(currentIndex + 1))) {\n            return;\n        }\n        append(List.of(item));\n        move(size() - 1, currentIndex + 1);\n    }\n\n    /**\n     * Removes the item at the given index from the play queue.\n     * <p>\n     * The current playing index will decrement if it is greater than the index being removed.\n     * On cases where the current playing index exceeds the playlist range, it is set to 0.\n     * </p>\n     * <p>\n     * Will emit a {@link RemoveEvent} if the index is within the play queue index range.\n     * </p>\n     *\n     * @param index the index of the item to remove\n     */\n    public synchronized void remove(final int index) {\n        if (index >= streams.size() || index < 0) {\n            return;\n        }\n        removeInternal(index);\n        broadcast(new RemoveEvent(index, getIndex()));\n    }\n\n    /**\n     * Report an exception for the item at the current index in order and skip to the next one\n     * <p>\n     * This is done as a separate event as the underlying manager may have\n     * different implementation regarding exceptions.\n     * </p>\n     */\n    public synchronized void error() {\n        final int oldIndex = getIndex();\n        queueIndex.incrementAndGet();\n        if (streams.size() > queueIndex.get()) {\n            history.add(streams.get(queueIndex.get()));\n        }\n        broadcast(new ErrorEvent(oldIndex, getIndex()));\n    }\n\n    private synchronized void removeInternal(final int removeIndex) {\n        final int currentIndex = queueIndex.get();\n        final int size = size();\n\n        if (currentIndex > removeIndex) {\n            queueIndex.decrementAndGet();\n\n        } else if (currentIndex >= size) {\n            queueIndex.set(currentIndex % (size - 1));\n\n        } else if (currentIndex == removeIndex && currentIndex == size - 1) {\n            queueIndex.set(0);\n        }\n\n        if (backup != null) {\n            backup.remove(getItem(removeIndex));\n        }\n\n        history.remove(streams.remove(removeIndex));\n        if (streams.size() > queueIndex.get()) {\n            history.add(streams.get(queueIndex.get()));\n        }\n    }\n\n    /**\n     * Moves a queue item at the source index to the target index.\n     * <p>\n     * If the item being moved is the currently playing, then the current playing index is set\n     * to that of the target.\n     * If the moved item is not the currently playing and moves to an index <b>AFTER</b> the\n     * current playing index, then the current playing index is decremented.\n     * Vice versa if the an item after the currently playing is moved <b>BEFORE</b>.\n     * </p>\n     *\n     * @param source the original index of the item\n     * @param target the new index of the item\n     */\n    public synchronized void move(final int source, final int target) {\n        if (source < 0 || target < 0) {\n            return;\n        }\n        if (source >= streams.size() || target >= streams.size()) {\n            return;\n        }\n\n        final int current = getIndex();\n        if (source == current) {\n            queueIndex.set(target);\n        } else if (source < current && target >= current) {\n            queueIndex.decrementAndGet();\n        } else if (source > current && target <= current) {\n            queueIndex.incrementAndGet();\n        }\n\n        final PlayQueueItem playQueueItem = streams.remove(source);\n        playQueueItem.setAutoQueued(false);\n        streams.add(target, playQueueItem);\n        broadcast(new MoveEvent(source, target));\n    }\n\n    /**\n     * Sets the recovery record of the item at the index.\n     * <p>\n     * Broadcasts a recovery event.\n     * </p>\n     *\n     * @param index    index of the item\n     * @param position the recovery position\n     */\n    public synchronized void setRecovery(final int index, final long position) {\n        if (index < 0 || index >= streams.size()) {\n            return;\n        }\n\n        streams.get(index).setRecoveryPosition(position);\n        broadcast(new RecoveryEvent(index, position));\n    }\n\n    /**\n     * Revoke the recovery record of the item at the index.\n     * <p>\n     * Broadcasts a recovery event.\n     * </p>\n     *\n     * @param index index of the item\n     */\n    public synchronized void unsetRecovery(final int index) {\n        setRecovery(index, PlayQueueItem.RECOVERY_UNSET);\n    }\n\n    /**\n     * Shuffles the current play queue\n     * <p>\n     * This method first backs up the existing play queue and item being played. Then a newly\n     * shuffled play queue will be generated along with currently playing item placed at the\n     * beginning of the queue. This item will also be added to the history.\n     * </p>\n     * <p>\n     * Will emit a {@link ReorderEvent} if shuffled.\n     * </p>\n     *\n     * @implNote Does nothing if the queue has a size <= 2 (the currently playing video must stay on\n     * top, so shuffling a size-2 list does nothing)\n     */\n    public synchronized void shuffle() {\n        // Create a backup if it doesn't already exist\n        // Note: The backup-list has to be created at all cost (even when size <= 2).\n        // Otherwise it's not possible to enter shuffle-mode!\n        if (backup == null) {\n            backup = new ArrayList<>(streams);\n        }\n        // Can't shuffle a list that's empty or only has one element\n        if (size() <= 2) {\n            return;\n        }\n\n        final int originalIndex = getIndex();\n        final PlayQueueItem currentItem = getItem();\n\n        Collections.shuffle(streams);\n\n        // Move currentItem to the head of the queue\n        streams.remove(currentItem);\n        streams.add(0, currentItem);\n        queueIndex.set(0);\n\n        history.add(currentItem);\n\n        broadcast(new ReorderEvent(originalIndex, 0));\n    }\n\n    /**\n     * Unshuffles the current play queue if a backup play queue exists.\n     * <p>\n     * This method undoes shuffling and index will be set to the previously playing item if found,\n     * otherwise, the index will reset to 0.\n     * </p>\n     * <p>\n     * Will emit a {@link ReorderEvent} if a backup exists.\n     * </p>\n     */\n    public synchronized void unshuffle() {\n        if (backup == null) {\n            return;\n        }\n        final int originIndex = getIndex();\n        final PlayQueueItem current = getItem();\n\n        streams = backup;\n        backup = null;\n\n        final int newIndex = streams.indexOf(current);\n        if (newIndex != -1) {\n            queueIndex.set(newIndex);\n        } else {\n            queueIndex.set(0);\n        }\n        if (streams.size() > queueIndex.get()) {\n            history.add(streams.get(queueIndex.get()));\n        }\n\n        broadcast(new ReorderEvent(originIndex, queueIndex.get()));\n    }\n\n    /**\n     * Selects previous played item.\n     *\n     * This method removes currently playing item from history and\n     * starts playing the last item from history if it exists\n     *\n     * @return true if history is not empty and the item can be played\n     * */\n    public synchronized boolean previous() {\n        if (history.size() <= 1) {\n            return false;\n        }\n\n        history.remove(history.size() - 1);\n\n        final PlayQueueItem last = history.remove(history.size() - 1);\n        setIndex(indexOf(last));\n\n        return true;\n    }\n\n    /*\n     * Compares two PlayQueues. Useful when a user switches players but queue is the same so\n     * we don't have to do anything with new queue.\n     * This method also gives a chance to track history of items in a queue in\n     * VideoDetailFragment without duplicating items from two identical queues\n     */\n    public boolean equalStreams(@Nullable final PlayQueue other) {\n        if (other == null) {\n            return false;\n        }\n        if (size() != other.size()) {\n            return false;\n        }\n        for (int i = 0; i < size(); i++) {\n            final PlayQueueItem stream = streams.get(i);\n            final PlayQueueItem otherStream = other.streams.get(i);\n            // Check is based on serviceId and URL\n            if (!stream.isSameItem(otherStream)) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    public boolean equalStreamsAndIndex(@Nullable final PlayQueue other) {\n        if (equalStreams(other)) {\n            //noinspection ConstantConditions\n            return other.getIndex() == getIndex(); //NOSONAR: other is not null\n        }\n        return false;\n    }\n\n    public boolean isDisposed() {\n        return disposed;\n    }\n    /*//////////////////////////////////////////////////////////////////////////\n    // Rx Broadcast\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void broadcast(@NonNull final PlayQueueEvent event) {\n        if (eventBroadcast != null) {\n            eventBroadcast.onNext(event);\n        }\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueAdapter.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.AppendEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.ErrorEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.MoveEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.RemoveEvent;\nimport org.schabi.newpipe.player.playqueue.PlayQueueEvent.SelectEvent;\nimport org.schabi.newpipe.util.FallbackViewHolder;\n\nimport java.util.List;\n\nimport io.reactivex.rxjava3.core.Observer;\nimport io.reactivex.rxjava3.disposables.Disposable;\n\n/**\n * Created by Christian Schabesberger on 01.08.16.\n * <p>\n * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>\n * InfoListAdapter.java is part of NewPipe.\n * </p>\n * <p>\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * </p>\n * <p>\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * </p>\n * <p>\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n * </p>\n */\n\npublic class PlayQueueAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n    private static final String TAG = PlayQueueAdapter.class.toString();\n\n    private static final int ITEM_VIEW_TYPE_ID = 0;\n    private static final int FOOTER_VIEW_TYPE_ID = 1;\n\n    private final PlayQueueItemBuilder playQueueItemBuilder;\n    private final PlayQueue playQueue;\n    private boolean showFooter = false;\n    private View footer = null;\n\n    private Disposable playQueueReactor;\n\n    public PlayQueueAdapter(final Context context, final PlayQueue playQueue) {\n        if (playQueue.getBroadcastReceiver() == null) {\n            throw new IllegalStateException(\"Play Queue has not been initialized.\");\n        }\n\n        this.playQueueItemBuilder = new PlayQueueItemBuilder(context);\n        this.playQueue = playQueue;\n\n        playQueue.getBroadcastReceiver().toObservable().subscribe(getReactor());\n    }\n\n    private Observer<PlayQueueEvent> getReactor() {\n        return new Observer<PlayQueueEvent>() {\n            @Override\n            public void onSubscribe(@NonNull final Disposable d) {\n                if (playQueueReactor != null) {\n                    playQueueReactor.dispose();\n                }\n                playQueueReactor = d;\n            }\n\n            @Override\n            public void onNext(@NonNull final PlayQueueEvent playQueueMessage) {\n                if (playQueueReactor != null) {\n                    onPlayQueueChanged(playQueueMessage);\n                }\n            }\n\n            @Override\n            public void onError(@NonNull final Throwable e) { }\n\n            @Override\n            public void onComplete() {\n                dispose();\n            }\n        };\n\n    }\n\n    private void onPlayQueueChanged(final PlayQueueEvent message) {\n        switch (message.type()) {\n            case RECOVERY:\n                // Do nothing.\n                break;\n            case SELECT:\n                final SelectEvent selectEvent = (SelectEvent) message;\n                notifyItemChanged(selectEvent.getOldIndex());\n                notifyItemChanged(selectEvent.getNewIndex());\n                break;\n            case APPEND:\n                final AppendEvent appendEvent = (AppendEvent) message;\n                notifyItemRangeInserted(playQueue.size(), appendEvent.getAmount());\n                break;\n            case ERROR:\n                final ErrorEvent errorEvent = (ErrorEvent) message;\n                notifyItemChanged(errorEvent.getErrorIndex());\n                notifyItemChanged(errorEvent.getQueueIndex());\n                break;\n            case REMOVE:\n                final RemoveEvent removeEvent = (RemoveEvent) message;\n                notifyItemRemoved(removeEvent.getRemoveIndex());\n                notifyItemChanged(removeEvent.getQueueIndex());\n                break;\n            case MOVE:\n                final MoveEvent moveEvent = (MoveEvent) message;\n                notifyItemMoved(moveEvent.getFromIndex(), moveEvent.getToIndex());\n                break;\n            case INIT:\n            case REORDER:\n            default:\n                notifyDataSetChanged();\n                break;\n        }\n    }\n\n    public void dispose() {\n        if (playQueueReactor != null) {\n            playQueueReactor.dispose();\n        }\n        playQueueReactor = null;\n    }\n\n    public void setSelectedListener(final PlayQueueItemBuilder.OnSelectedListener listener) {\n        playQueueItemBuilder.setOnSelectedListener(listener);\n    }\n\n    public void unsetSelectedListener() {\n        playQueueItemBuilder.setOnSelectedListener(null);\n    }\n\n    public void setFooter(final View footer) {\n        this.footer = footer;\n        notifyItemChanged(playQueue.size());\n    }\n\n    public void showFooter(final boolean show) {\n        showFooter = show;\n        notifyItemChanged(playQueue.size());\n    }\n\n    public List<PlayQueueItem> getItems() {\n        return playQueue.getStreams();\n    }\n\n    @Override\n    public int getItemCount() {\n        int count = playQueue.getStreams().size();\n        if (footer != null && showFooter) {\n            count++;\n        }\n        return count;\n    }\n\n    @Override\n    public int getItemViewType(final int position) {\n        if (footer != null && position == playQueue.getStreams().size() && showFooter) {\n            return FOOTER_VIEW_TYPE_ID;\n        }\n\n        return ITEM_VIEW_TYPE_ID;\n    }\n\n    @NonNull\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent,\n                                                      final int type) {\n        switch (type) {\n            case FOOTER_VIEW_TYPE_ID:\n                return new HFHolder(footer);\n            case ITEM_VIEW_TYPE_ID:\n                return new PlayQueueItemHolder(LayoutInflater.from(parent.getContext())\n                        .inflate(R.layout.play_queue_item, parent, false));\n            default:\n                Log.e(TAG, \"Attempting to create view holder with undefined type: \" + type);\n                return new FallbackViewHolder(new View(parent.getContext()));\n        }\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder,\n                                 final int position) {\n        if (holder instanceof PlayQueueItemHolder) {\n            final PlayQueueItemHolder itemHolder = (PlayQueueItemHolder) holder;\n\n            // Build the list item\n            playQueueItemBuilder\n                    .buildStreamInfoItem(itemHolder, playQueue.getStreams().get(position));\n\n            // Check if the current item should be selected/highlighted\n            final boolean isSelected = playQueue.getIndex() == position;\n            itemHolder.itemView.setSelected(isSelected);\n        } else if (holder instanceof HFHolder && position == playQueue.getStreams().size()\n                && footer != null && showFooter) {\n            ((HFHolder) holder).view = footer;\n        }\n    }\n\n    public static class HFHolder extends RecyclerView.ViewHolder {\n        public View view;\n\n        public HFHolder(final View v) {\n            super(v);\n            view = v;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueEvent.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2017-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.player.playqueue\n\nimport java.io.Serializable\n\nsealed interface PlayQueueEvent : Serializable {\n    fun type(): Type\n\n    class InitEvent : PlayQueueEvent {\n        override fun type() = Type.INIT\n    }\n\n    // sent when the index is changed\n    class SelectEvent(val oldIndex: Int, val newIndex: Int) : PlayQueueEvent {\n        override fun type() = Type.SELECT\n    }\n\n    // sent when more streams are added to the play queue\n    class AppendEvent(val amount: Int) : PlayQueueEvent {\n        override fun type() = Type.APPEND\n    }\n\n    // sent when a pending stream is removed from the play queue\n    class RemoveEvent(val removeIndex: Int, val queueIndex: Int) : PlayQueueEvent {\n        override fun type() = Type.REMOVE\n    }\n\n    // sent when two streams swap place in the play queue\n    class MoveEvent(val fromIndex: Int, val toIndex: Int) : PlayQueueEvent {\n        override fun type() = Type.MOVE\n    }\n\n    // sent when queue is shuffled\n    class ReorderEvent(val fromSelectedIndex: Int, val toSelectedIndex: Int) : PlayQueueEvent {\n        override fun type() = Type.REORDER\n    }\n\n    // sent when recovery record is set on a stream\n    class RecoveryEvent(val index: Int, val position: Long) : PlayQueueEvent {\n        override fun type() = Type.RECOVERY\n    }\n\n    // sent when the item at index has caused an exception\n    class ErrorEvent(val errorIndex: Int, val queueIndex: Int) : PlayQueueEvent {\n        override fun type() = Type.ERROR\n    }\n\n    // It is necessary only for use in java code. Remove it and use kotlin pattern\n    // matching when all users of this enum are converted to kotlin\n    enum class Type { INIT, SELECT, APPEND, REMOVE, MOVE, REORDER, RECOVERY, ERROR }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItem.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.extractor.Image;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.extractor.stream.StreamType;\nimport org.schabi.newpipe.util.ExtractorHelper;\n\nimport java.io.Serializable;\nimport java.util.List;\n\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic class PlayQueueItem implements Serializable {\n    public static final long RECOVERY_UNSET = Long.MIN_VALUE;\n    private static final String EMPTY_STRING = \"\";\n\n    @NonNull\n    private final String title;\n    @NonNull\n    private final String url;\n    private final int serviceId;\n    private final long duration;\n    @NonNull\n    private final List<Image> thumbnails;\n    @NonNull\n    private final String uploader;\n    private final String uploaderUrl;\n    @NonNull\n    private final StreamType streamType;\n\n    private boolean isAutoQueued;\n\n    private long recoveryPosition;\n    private Throwable error;\n\n    public PlayQueueItem(@NonNull final StreamInfo info) {\n        this(info.getName(), info.getUrl(), info.getServiceId(), info.getDuration(),\n                info.getThumbnails(), info.getUploaderName(),\n                info.getUploaderUrl(), info.getStreamType());\n\n        if (info.getStartPosition() > 0) {\n            setRecoveryPosition(info.getStartPosition() * 1000);\n        }\n    }\n\n    PlayQueueItem(@NonNull final StreamInfoItem item) {\n        this(item.getName(), item.getUrl(), item.getServiceId(), item.getDuration(),\n                item.getThumbnails(), item.getUploaderName(),\n                item.getUploaderUrl(), item.getStreamType());\n    }\n\n    @SuppressWarnings(\"ParameterNumber\")\n    private PlayQueueItem(@Nullable final String name, @Nullable final String url,\n                          final int serviceId, final long duration,\n                          final List<Image> thumbnails, @Nullable final String uploader,\n                          final String uploaderUrl, @NonNull final StreamType streamType) {\n        this.title = name != null ? name : EMPTY_STRING;\n        this.url = url != null ? url : EMPTY_STRING;\n        this.serviceId = serviceId;\n        this.duration = duration;\n        this.thumbnails = thumbnails;\n        this.uploader = uploader != null ? uploader : EMPTY_STRING;\n        this.uploaderUrl = uploaderUrl;\n        this.streamType = streamType;\n\n        this.recoveryPosition = RECOVERY_UNSET;\n    }\n\n    /** Whether these two items should be treated as the same stream\n     * for the sake of keeping the same player running when e.g. jumping between timestamps.\n     *\n     * @param other the {@link PlayQueueItem} to compare against.\n     * @return whether the two items are the same so the stream can be re-used.\n     */\n    public boolean isSameItem(@Nullable final PlayQueueItem other) {\n        if (other == null) {\n            return false;\n        }\n        // We assume that the same service & URL uniquely determines\n        // that we can keep the same stream running.\n        return serviceId == other.serviceId\n                && url.equals(other.url);\n    }\n\n    @NonNull\n    public String getTitle() {\n        return title;\n    }\n\n    @NonNull\n    public String getUrl() {\n        return url;\n    }\n\n    public int getServiceId() {\n        return serviceId;\n    }\n\n    public long getDuration() {\n        return duration;\n    }\n\n    @NonNull\n    public List<Image> getThumbnails() {\n        return thumbnails;\n    }\n\n    @NonNull\n    public String getUploader() {\n        return uploader;\n    }\n\n    public String getUploaderUrl() {\n        return uploaderUrl;\n    }\n\n    @NonNull\n    public StreamType getStreamType() {\n        return streamType;\n    }\n\n    public long getRecoveryPosition() {\n        return recoveryPosition;\n    }\n\n    /*package-private*/ void setRecoveryPosition(final long recoveryPosition) {\n        this.recoveryPosition = recoveryPosition;\n    }\n\n    @Nullable\n    public Throwable getError() {\n        return error;\n    }\n\n    @NonNull\n    public Single<StreamInfo> getStream() {\n        return ExtractorHelper.getStreamInfo(this.serviceId, this.url, false)\n                .subscribeOn(Schedulers.io())\n                .doOnError(throwable -> error = throwable);\n    }\n\n    public boolean isAutoQueued() {\n        return isAutoQueued;\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Item States, keep external access out\n    ////////////////////////////////////////////////////////////////////////////\n\n    public void setAutoQueued(final boolean autoQueued) {\n        isAutoQueued = autoQueued;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemBuilder.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\nimport android.content.Context;\nimport android.text.TextUtils;\nimport android.view.MotionEvent;\nimport android.view.View;\n\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.ServiceHelper;\nimport org.schabi.newpipe.util.image.CoilHelper;\n\npublic class PlayQueueItemBuilder {\n    private static final String TAG = PlayQueueItemBuilder.class.toString();\n    private OnSelectedListener onItemClickListener;\n\n    public PlayQueueItemBuilder(final Context context) {\n    }\n\n    public void setOnSelectedListener(final OnSelectedListener listener) {\n        this.onItemClickListener = listener;\n    }\n\n    public void buildStreamInfoItem(final PlayQueueItemHolder holder, final PlayQueueItem item) {\n        if (!TextUtils.isEmpty(item.getTitle())) {\n            holder.itemVideoTitleView.setText(item.getTitle());\n        }\n        holder.itemAdditionalDetailsView.setText(Localization.concatenateStrings(item.getUploader(),\n                ServiceHelper.getNameOfServiceById(item.getServiceId())));\n\n        if (item.getDuration() > 0) {\n            holder.itemDurationView.setText(Localization.getDurationString(item.getDuration()));\n        } else {\n            holder.itemDurationView.setVisibility(View.GONE);\n        }\n\n        CoilHelper.INSTANCE.loadThumbnail(holder.itemThumbnailView, item.getThumbnails());\n\n        holder.itemRoot.setOnClickListener(view -> {\n            if (onItemClickListener != null) {\n                onItemClickListener.selected(item, view);\n            }\n        });\n\n        holder.itemRoot.setOnLongClickListener(view -> {\n            if (onItemClickListener != null) {\n                onItemClickListener.held(item, view);\n                return true;\n            }\n            return false;\n        });\n\n        holder.itemHandle.setOnTouchListener(getOnTouchListener(holder));\n    }\n\n    private View.OnTouchListener getOnTouchListener(final PlayQueueItemHolder holder) {\n        return (view, motionEvent) -> {\n            view.performClick();\n            if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN\n                    && onItemClickListener != null) {\n                onItemClickListener.onStartDrag(holder);\n            }\n            return false;\n        };\n    }\n\n    public interface OnSelectedListener {\n        void selected(PlayQueueItem item, View view);\n\n        void held(PlayQueueItem item, View view);\n\n        void onStartDrag(PlayQueueItemHolder viewHolder);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemHolder.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.R;\n\n/**\n * Created by Christian Schabesberger on 01.08.16.\n * <p>\n * Copyright (C) Christian Schabesberger 2016 <chris.schabesberger@mailbox.org>\n * StreamInfoItemHolder.java is part of NewPipe.\n * </p>\n * <p>\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * </p>\n * <p>\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * </p>\n * <p>\n * You should have received a copy of the GNU General Public License\n * along with NewPipe. If not, see <http://www.gnu.org/licenses/>.\n * </p>\n */\n\npublic class PlayQueueItemHolder extends RecyclerView.ViewHolder {\n    public final TextView itemVideoTitleView;\n    public final TextView itemDurationView;\n    final TextView itemAdditionalDetailsView;\n\n    public final ImageView itemThumbnailView;\n    final ImageView itemHandle;\n\n    public final View itemRoot;\n\n    PlayQueueItemHolder(final View v) {\n        super(v);\n        itemRoot = v.findViewById(R.id.itemRoot);\n        itemVideoTitleView = v.findViewById(R.id.itemVideoTitleView);\n        itemDurationView = v.findViewById(R.id.itemDurationView);\n        itemAdditionalDetailsView = v.findViewById(R.id.itemAdditionalDetails);\n        itemThumbnailView = v.findViewById(R.id.itemThumbnailView);\n        itemHandle = v.findViewById(R.id.itemHandle);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueueItemTouchCallback.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\nimport androidx.annotation.NonNull;\nimport androidx.core.math.MathUtils;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport androidx.recyclerview.widget.RecyclerView;\n\npublic abstract class PlayQueueItemTouchCallback extends ItemTouchHelper.SimpleCallback {\n    private static final int MINIMUM_INITIAL_DRAG_VELOCITY = 10;\n    private static final int MAXIMUM_INITIAL_DRAG_VELOCITY = 25;\n\n    public PlayQueueItemTouchCallback() {\n        super(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.RIGHT);\n    }\n\n    public abstract void onMove(int sourceIndex, int targetIndex);\n\n    public abstract void onSwiped(int index);\n\n    @Override\n    public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView,\n                                            final int viewSize,\n                                            final int viewSizeOutOfBounds,\n                                            final int totalSize,\n                                            final long msSinceStartScroll) {\n        final int standardSpeed = super.interpolateOutOfBoundsScroll(recyclerView, viewSize,\n                viewSizeOutOfBounds, totalSize, msSinceStartScroll);\n        final int clampedAbsVelocity = MathUtils.clamp(Math.abs(standardSpeed),\n                MINIMUM_INITIAL_DRAG_VELOCITY, MAXIMUM_INITIAL_DRAG_VELOCITY);\n        return clampedAbsVelocity * (int) Math.signum(viewSizeOutOfBounds);\n    }\n\n    @Override\n    public boolean onMove(@NonNull final RecyclerView recyclerView,\n                          final RecyclerView.ViewHolder source,\n                          final RecyclerView.ViewHolder target) {\n        if (source.getItemViewType() != target.getItemViewType()) {\n            return false;\n        }\n\n        final int sourceIndex = source.getLayoutPosition();\n        final int targetIndex = target.getLayoutPosition();\n        onMove(sourceIndex, targetIndex);\n        return true;\n    }\n\n    @Override\n    public boolean isLongPressDragEnabled() {\n        return false;\n    }\n\n    @Override\n    public boolean isItemViewSwipeEnabled() {\n        return true;\n    }\n\n    @Override\n    public void onSwiped(final RecyclerView.ViewHolder viewHolder, final int swipeDir) {\n        onSwiped(viewHolder.getBindingAdapterPosition());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playqueue/PlaylistPlayQueue.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\nimport org.schabi.newpipe.extractor.Page;\nimport org.schabi.newpipe.extractor.playlist.PlaylistInfo;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.util.ExtractorHelper;\n\nimport java.util.List;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic final class PlaylistPlayQueue extends AbstractInfoPlayQueue<PlaylistInfo> {\n\n    public PlaylistPlayQueue(final PlaylistInfo info) {\n        super(info);\n    }\n\n    public PlaylistPlayQueue(final PlaylistInfo info, final int index) {\n        super(info, index);\n    }\n\n    public PlaylistPlayQueue(final int serviceId,\n                             final String url,\n                             final Page nextPage,\n                             final List<StreamInfoItem> streams,\n                             final int index) {\n        super(serviceId, url, nextPage, streams, index);\n    }\n\n    @Override\n    protected String getTag() {\n        return \"PlaylistPlayQueue@\" + Integer.toHexString(hashCode());\n    }\n\n    @Override\n    public void fetch() {\n        if (this.isInitial) {\n            ExtractorHelper.getPlaylistInfo(this.serviceId, this.baseUrl, false)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(getHeadListObserver());\n        } else {\n            ExtractorHelper.getMorePlaylistItems(this.serviceId, this.baseUrl, this.nextPage)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .subscribe(getNextPageObserver());\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/playqueue/SinglePlayQueue.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\npublic final class SinglePlayQueue extends PlayQueue {\n    public SinglePlayQueue(final StreamInfoItem item) {\n        super(0, List.of(new PlayQueueItem(item)));\n    }\n\n    public SinglePlayQueue(final StreamInfo info) {\n        super(0, List.of(new PlayQueueItem(info)));\n    }\n    public SinglePlayQueue(final PlayQueueItem item) {\n        super(0, List.of(item));\n    }\n    public SinglePlayQueue(final StreamInfo info, final long startPosition) {\n        super(0, List.of(new PlayQueueItem(info)));\n        getItem().setRecoveryPosition(startPosition);\n    }\n\n    public SinglePlayQueue(@NonNull final List<StreamInfoItem> items, final int index) {\n        super(index, playQueueItemsOf(items));\n    }\n\n    private static List<PlayQueueItem> playQueueItemsOf(@NonNull final List<StreamInfoItem> items) {\n        return items.stream().map(PlayQueueItem::new).collect(Collectors.toList());\n    }\n\n    @Override\n    public boolean isComplete() {\n        return true;\n    }\n\n    @Override\n    public void fetch() {\n        // Item was already passed in constructor.\n        // No further items need to be fetched as this is a PlayQueue with only one item\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/resolver/AudioPlaybackResolver.java",
    "content": "package org.schabi.newpipe.player.resolver;\n\nimport static org.schabi.newpipe.util.ListHelper.getFilteredAudioStreams;\nimport static org.schabi.newpipe.util.ListHelper.getPlayableStreams;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.source.MediaSource;\n\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.Stream;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\nimport org.schabi.newpipe.player.helper.PlayerDataSource;\nimport org.schabi.newpipe.player.mediaitem.MediaItemTag;\nimport org.schabi.newpipe.player.mediaitem.StreamInfoTag;\nimport org.schabi.newpipe.util.ListHelper;\n\nimport java.util.List;\n\npublic class AudioPlaybackResolver implements PlaybackResolver {\n    private static final String TAG = AudioPlaybackResolver.class.getSimpleName();\n\n    @NonNull\n    private final Context context;\n    @NonNull\n    private final PlayerDataSource dataSource;\n    @Nullable\n    private String audioTrack;\n\n    public AudioPlaybackResolver(@NonNull final Context context,\n                                 @NonNull final PlayerDataSource dataSource) {\n        this.context = context;\n        this.dataSource = dataSource;\n    }\n\n    /**\n     * Get a media source providing audio. If a service has no separate {@link AudioStream}s we\n     * use a video stream as audio source to support audio background playback.\n     *\n     * @param info of the stream\n     * @return the audio source to use or null if none could be found\n     */\n    @Override\n    @Nullable\n    public MediaSource resolve(@NonNull final StreamInfo info) {\n        final MediaSource liveSource = PlaybackResolver.maybeBuildLiveMediaSource(dataSource, info);\n        if (liveSource != null) {\n            return liveSource;\n        }\n\n        final List<AudioStream> audioStreams =\n                getFilteredAudioStreams(context, info.getAudioStreams());\n        final Stream stream;\n        final MediaItemTag tag;\n\n        if (!audioStreams.isEmpty()) {\n            final int audioIndex =\n                    ListHelper.getAudioFormatIndex(context, audioStreams, audioTrack);\n            stream = getStreamForIndex(audioIndex, audioStreams);\n            tag = StreamInfoTag.of(info, audioStreams, audioIndex);\n        } else {\n            final List<VideoStream> videoStreams =\n                    getPlayableStreams(info.getVideoStreams(), info.getServiceId());\n            if (!videoStreams.isEmpty()) {\n                final int index = ListHelper.getDefaultResolutionIndex(context, videoStreams);\n                stream = getStreamForIndex(index, videoStreams);\n                tag = StreamInfoTag.of(info);\n            } else {\n                return null;\n            }\n        }\n\n        try {\n            return PlaybackResolver.buildMediaSource(\n                    dataSource, stream, info, PlaybackResolver.cacheKeyOf(info, stream), tag);\n        } catch (final ResolverException e) {\n            Log.e(TAG, \"Unable to create audio source\", e);\n            return null;\n        }\n    }\n\n    @Nullable\n    Stream getStreamForIndex(final int index, @NonNull final List<? extends Stream> streams) {\n        if (index >= 0 && index < streams.size()) {\n            return streams.get(index);\n        }\n        return null;\n    }\n\n    @Nullable\n    public String getAudioTrack() {\n        return audioTrack;\n    }\n\n    public void setAudioTrack(@Nullable final String audioLanguage) {\n        this.audioTrack = audioLanguage;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java",
    "content": "package org.schabi.newpipe.player.resolver;\n\nimport static org.schabi.newpipe.extractor.stream.AudioStream.UNKNOWN_BITRATE;\nimport static org.schabi.newpipe.extractor.stream.VideoStream.RESOLUTION_UNKNOWN;\nimport static org.schabi.newpipe.player.helper.PlayerDataSource.LIVE_STREAM_EDGE_GAP_MILLIS;\n\nimport android.net.Uri;\nimport android.util.Log;\n\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.C;\nimport com.google.android.exoplayer2.MediaItem;\nimport com.google.android.exoplayer2.source.MediaSource;\nimport com.google.android.exoplayer2.source.ProgressiveMediaSource;\nimport com.google.android.exoplayer2.source.dash.DashMediaSource;\nimport com.google.android.exoplayer2.source.dash.manifest.DashManifest;\nimport com.google.android.exoplayer2.source.dash.manifest.DashManifestParser;\nimport com.google.android.exoplayer2.source.hls.HlsMediaSource;\nimport com.google.android.exoplayer2.source.smoothstreaming.SsMediaSource;\nimport com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest;\nimport com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifestParser;\n\nimport org.schabi.newpipe.extractor.MediaFormat;\nimport org.schabi.newpipe.extractor.ServiceList;\nimport org.schabi.newpipe.extractor.services.youtube.ItagItem;\nimport org.schabi.newpipe.extractor.services.youtube.dashmanifestcreators.CreationException;\nimport org.schabi.newpipe.extractor.services.youtube.dashmanifestcreators.YoutubeOtfDashManifestCreator;\nimport org.schabi.newpipe.extractor.services.youtube.dashmanifestcreators.YoutubePostLiveStreamDvrDashManifestCreator;\nimport org.schabi.newpipe.extractor.services.youtube.dashmanifestcreators.YoutubeProgressiveDashManifestCreator;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.DeliveryMethod;\nimport org.schabi.newpipe.extractor.stream.Stream;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamType;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\nimport org.schabi.newpipe.player.datasource.NonUriHlsDataSourceFactory;\nimport org.schabi.newpipe.player.helper.PlayerDataSource;\nimport org.schabi.newpipe.player.mediaitem.MediaItemTag;\nimport org.schabi.newpipe.player.mediaitem.StreamInfoTag;\nimport org.schabi.newpipe.util.StreamTypeUtil;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Objects;\n\n/**\n * This interface is just a shorthand for {@link Resolver} with {@link StreamInfo} as source and\n * {@link MediaSource} as product. It contains many static methods that can be used by classes\n * implementing this interface, and nothing else.\n */\npublic interface PlaybackResolver extends Resolver<StreamInfo, MediaSource> {\n    String TAG = PlaybackResolver.class.getSimpleName();\n\n\n    //region Cache key generation\n    private static StringBuilder commonCacheKeyOf(final StreamInfo info,\n                                                  final Stream stream,\n                                                  final boolean resolutionOrBitrateUnknown) {\n        // stream info service id\n        final StringBuilder cacheKey = new StringBuilder(info.getServiceId());\n\n        // stream info id\n        cacheKey.append(\" \");\n        cacheKey.append(info.getId());\n\n        // stream id (even if unknown)\n        cacheKey.append(\" \");\n        cacheKey.append(stream.getId());\n\n        // mediaFormat (if not null)\n        final MediaFormat mediaFormat = stream.getFormat();\n        if (mediaFormat != null) {\n            cacheKey.append(\" \");\n            cacheKey.append(mediaFormat.getName());\n        }\n\n        // content (only if other information is missing)\n        // If the media format and the resolution/bitrate are both missing, then we don't have\n        // enough information to distinguish this stream from other streams.\n        // So, only in that case, we use the content (i.e. url or manifest) to differentiate\n        // between streams.\n        // Note that if the content were used even when other information is present, then two\n        // streams with the same stats but with different contents (e.g. because the url was\n        // refreshed) will be considered different (i.e. with a different cacheKey), making the\n        // cache useless.\n        if (resolutionOrBitrateUnknown && mediaFormat == null) {\n            cacheKey.append(\" \");\n            cacheKey.append(Objects.hash(stream.getContent(), stream.getManifestUrl()));\n        }\n\n        return cacheKey;\n    }\n\n    /**\n     * Builds the cache key of a {@link VideoStream video stream}.\n     *\n     * <p>\n     * A cache key is unique to the features of the provided video stream, and when possible\n     * independent of <i>transient</i> parameters (such as the URL of the stream).\n     * This ensures that there are no conflicts, but also that the cache is used as much as\n     * possible: the same cache should be used for two streams which have the same features but\n     * e.g. a different URL, since the URL might have been reloaded in the meantime, but the stream\n     * actually referenced by the URL is still the same.\n     * </p>\n     *\n     * @param info        the {@link StreamInfo stream info}, to distinguish between streams with\n     *                    the same features but coming from different stream infos\n     * @param videoStream the {@link VideoStream video stream} for which the cache key should be\n     *                    created\n     * @return a key to be used to store the cache of the provided {@link VideoStream video stream}\n     */\n    static String cacheKeyOf(final StreamInfo info, final VideoStream videoStream) {\n        final boolean resolutionUnknown = videoStream.getResolution().equals(RESOLUTION_UNKNOWN);\n        final StringBuilder cacheKey = commonCacheKeyOf(info, videoStream, resolutionUnknown);\n\n        // resolution (if known)\n        if (!resolutionUnknown) {\n            cacheKey.append(\" \");\n            cacheKey.append(videoStream.getResolution());\n        }\n\n        // isVideoOnly\n        cacheKey.append(\" \");\n        cacheKey.append(videoStream.isVideoOnly());\n\n        return cacheKey.toString();\n    }\n\n    /**\n     * Builds the cache key of an audio stream.\n     *\n     * <p>\n     * A cache key is unique to the features of the provided {@link AudioStream audio stream}, and\n     * when possible independent of <i>transient</i> parameters (such as the URL of the stream).\n     * This ensures that there are no conflicts, but also that the cache is used as much as\n     * possible: the same cache should be used for two streams which have the same features but\n     * e.g. a different URL, since the URL might have been reloaded in the meantime, but the stream\n     * actually referenced by the URL is still the same.\n     * </p>\n     *\n     * @param info        the {@link StreamInfo stream info}, to distinguish between streams with\n     *                    the same features but coming from different stream infos\n     * @param audioStream the {@link AudioStream audio stream} for which the cache key should be\n     *                    created\n     * @return a key to be used to store the cache of the provided {@link AudioStream audio stream}\n     */\n    static String cacheKeyOf(final StreamInfo info, final AudioStream audioStream) {\n        final boolean averageBitrateUnknown = audioStream.getAverageBitrate() == UNKNOWN_BITRATE;\n        final StringBuilder cacheKey = commonCacheKeyOf(info, audioStream, averageBitrateUnknown);\n\n        // averageBitrate (if known)\n        if (!averageBitrateUnknown) {\n            cacheKey.append(\" \");\n            cacheKey.append(audioStream.getAverageBitrate());\n        }\n\n        if (audioStream.getAudioTrackId() != null) {\n            cacheKey.append(\" \");\n            cacheKey.append(audioStream.getAudioTrackId());\n        }\n\n        if (audioStream.getAudioLocale() != null) {\n            cacheKey.append(\" \");\n            cacheKey.append(audioStream.getAudioLocale().getISO3Language());\n        }\n\n        return cacheKey.toString();\n    }\n\n    /**\n     * Use common base type {@link Stream} to handle {@link AudioStream} or {@link VideoStream}\n     * transparently. For more info see {@link #cacheKeyOf(StreamInfo, AudioStream)} or\n     * {@link #cacheKeyOf(StreamInfo, VideoStream)}.\n     *\n     * @param info   the {@link StreamInfo stream info}, to distinguish between streams with\n     *               the same features but coming from different stream infos\n     * @param stream the {@link Stream} ({@link AudioStream} or {@link VideoStream})\n     *               for which the cache key should be created\n     * @return a key to be used to store the cache of the provided {@link Stream}\n     */\n    static String cacheKeyOf(final StreamInfo info, final Stream stream) {\n        if (stream instanceof AudioStream) {\n            return cacheKeyOf(info, (AudioStream) stream);\n        } else if (stream instanceof VideoStream) {\n            return cacheKeyOf(info, (VideoStream) stream);\n        }\n        throw new RuntimeException(\"no audio or video stream. That should never happen\");\n    }\n    //endregion\n\n\n    //region Live media sources\n    @Nullable\n    static MediaSource maybeBuildLiveMediaSource(final PlayerDataSource dataSource,\n                                                 final StreamInfo info) {\n        if (!StreamTypeUtil.isLiveStream(info.getStreamType())) {\n            return null;\n        }\n\n        try {\n            final StreamInfoTag tag = StreamInfoTag.of(info);\n            // Prefer DASH over HLS because of an exoPlayer bug that causes the background player to\n            // also fetch the video stream even if it is supposed to just fetch the audio stream.\n            if (!info.getDashMpdUrl().isEmpty()) {\n                return buildLiveMediaSource(\n                        dataSource, info.getDashMpdUrl(), C.CONTENT_TYPE_DASH, tag);\n            }\n            if (!info.getHlsUrl().isEmpty()) {\n                return buildLiveMediaSource(dataSource, info.getHlsUrl(), C.CONTENT_TYPE_HLS, tag);\n            }\n        } catch (final Exception e) {\n            Log.w(TAG, \"Error when generating live media source, falling back to standard sources\",\n                    e);\n        }\n\n        return null;\n    }\n\n    static MediaSource buildLiveMediaSource(final PlayerDataSource dataSource,\n                                            final String sourceUrl,\n                                            @C.ContentType final int type,\n                                            final MediaItemTag metadata) throws ResolverException {\n        final MediaSource.Factory factory;\n        switch (type) {\n            case C.CONTENT_TYPE_SS:\n                factory = dataSource.getLiveSsMediaSourceFactory();\n                break;\n            case C.CONTENT_TYPE_DASH:\n                if (metadata.getServiceId() == ServiceList.YouTube.getServiceId()) {\n                    factory = dataSource.getLiveYoutubeDashMediaSourceFactory();\n                } else {\n                    factory = dataSource.getLiveDashMediaSourceFactory();\n                }\n                break;\n            case C.CONTENT_TYPE_HLS:\n                factory = dataSource.getLiveHlsMediaSourceFactory();\n                break;\n            case C.CONTENT_TYPE_OTHER:\n            case C.CONTENT_TYPE_RTSP:\n            default:\n                throw new ResolverException(\"Unsupported type: \" + type);\n        }\n\n        return factory.createMediaSource(\n                new MediaItem.Builder()\n                        .setTag(metadata)\n                        .setUri(Uri.parse(sourceUrl))\n                        .setLiveConfiguration(\n                                new MediaItem.LiveConfiguration.Builder()\n                                        .setTargetOffsetMs(LIVE_STREAM_EDGE_GAP_MILLIS)\n                                        .build())\n                        .build());\n    }\n    //endregion\n\n\n    //region Generic media sources\n    static MediaSource buildMediaSource(final PlayerDataSource dataSource,\n                                        final Stream stream,\n                                        final StreamInfo streamInfo,\n                                        final String cacheKey,\n                                        final MediaItemTag metadata) throws ResolverException {\n        if (streamInfo.getService() == ServiceList.YouTube) {\n            return createYoutubeMediaSource(stream, streamInfo, dataSource, cacheKey, metadata);\n        }\n\n        final DeliveryMethod deliveryMethod = stream.getDeliveryMethod();\n        switch (deliveryMethod) {\n            case PROGRESSIVE_HTTP:\n                return buildProgressiveMediaSource(dataSource, stream, cacheKey, metadata);\n            case DASH:\n                return buildDashMediaSource(dataSource, stream, cacheKey, metadata);\n            case HLS:\n                return buildHlsMediaSource(dataSource, stream, cacheKey, metadata);\n            case SS:\n                return buildSSMediaSource(dataSource, stream, cacheKey, metadata);\n            // Torrent streams are not supported by ExoPlayer\n            default:\n                throw new ResolverException(\"Unsupported delivery type: \" + deliveryMethod);\n        }\n    }\n\n    private static ProgressiveMediaSource buildProgressiveMediaSource(\n            final PlayerDataSource dataSource,\n            final Stream stream,\n            final String cacheKey,\n            final MediaItemTag metadata) throws ResolverException {\n        if (!stream.isUrl()) {\n            throw new ResolverException(\"Non URI progressive contents are not supported\");\n        }\n        throwResolverExceptionIfUrlNullOrEmpty(stream.getContent());\n        return dataSource.getProgressiveMediaSourceFactory().createMediaSource(\n                new MediaItem.Builder()\n                        .setTag(metadata)\n                        .setUri(Uri.parse(stream.getContent()))\n                        .setCustomCacheKey(cacheKey)\n                        .build());\n    }\n\n    private static DashMediaSource buildDashMediaSource(final PlayerDataSource dataSource,\n                                                        final Stream stream,\n                                                        final String cacheKey,\n                                                        final MediaItemTag metadata)\n            throws ResolverException {\n\n        if (stream.isUrl()) {\n            throwResolverExceptionIfUrlNullOrEmpty(stream.getContent());\n            return dataSource.getDashMediaSourceFactory().createMediaSource(\n                    new MediaItem.Builder()\n                            .setTag(metadata)\n                            .setUri(Uri.parse(stream.getContent()))\n                            .setCustomCacheKey(cacheKey)\n                            .build());\n        }\n\n        try {\n            return dataSource.getDashMediaSourceFactory().createMediaSource(\n                    createDashManifest(stream.getContent(), stream),\n                    new MediaItem.Builder()\n                            .setTag(metadata)\n                            .setUri(manifestUrlToUri(stream.getManifestUrl()))\n                            .setCustomCacheKey(cacheKey)\n                            .build());\n        } catch (final IOException e) {\n            throw new ResolverException(\n                    \"Could not create a DASH media source/manifest from the manifest text\", e);\n        }\n    }\n\n    private static DashManifest createDashManifest(final String manifestContent,\n                                                   final Stream stream) throws IOException {\n        return new DashManifestParser().parse(manifestUrlToUri(stream.getManifestUrl()),\n                new ByteArrayInputStream(manifestContent.getBytes(StandardCharsets.UTF_8)));\n    }\n\n    private static HlsMediaSource buildHlsMediaSource(final PlayerDataSource dataSource,\n                                                      final Stream stream,\n                                                      final String cacheKey,\n                                                      final MediaItemTag metadata)\n            throws ResolverException {\n        if (stream.isUrl()) {\n            throwResolverExceptionIfUrlNullOrEmpty(stream.getContent());\n            return dataSource.getHlsMediaSourceFactory(null).createMediaSource(\n                    new MediaItem.Builder()\n                            .setTag(metadata)\n                            .setUri(Uri.parse(stream.getContent()))\n                            .setCustomCacheKey(cacheKey)\n                            .build());\n        }\n\n        final NonUriHlsDataSourceFactory.Builder hlsDataSourceFactoryBuilder =\n                new NonUriHlsDataSourceFactory.Builder();\n        hlsDataSourceFactoryBuilder.setPlaylistString(stream.getContent());\n\n        return dataSource.getHlsMediaSourceFactory(hlsDataSourceFactoryBuilder)\n                .createMediaSource(new MediaItem.Builder()\n                        .setTag(metadata)\n                        .setUri(manifestUrlToUri(stream.getManifestUrl()))\n                        .setCustomCacheKey(cacheKey)\n                        .build());\n    }\n\n    private static SsMediaSource buildSSMediaSource(final PlayerDataSource dataSource,\n                                                    final Stream stream,\n                                                    final String cacheKey,\n                                                    final MediaItemTag metadata)\n            throws ResolverException {\n        if (stream.isUrl()) {\n            throwResolverExceptionIfUrlNullOrEmpty(stream.getContent());\n            return dataSource.getSSMediaSourceFactory().createMediaSource(\n                    new MediaItem.Builder()\n                            .setTag(metadata)\n                            .setUri(Uri.parse(stream.getContent()))\n                            .setCustomCacheKey(cacheKey)\n                            .build());\n        }\n\n        final Uri manifestUri = manifestUrlToUri(stream.getManifestUrl());\n\n        final SsManifest smoothStreamingManifest;\n        try {\n            final ByteArrayInputStream smoothStreamingManifestInput = new ByteArrayInputStream(\n                    stream.getContent().getBytes(StandardCharsets.UTF_8));\n            smoothStreamingManifest = new SsManifestParser().parse(manifestUri,\n                    smoothStreamingManifestInput);\n        } catch (final IOException e) {\n            throw new ResolverException(\"Error when parsing manual SS manifest\", e);\n        }\n\n        return dataSource.getSSMediaSourceFactory().createMediaSource(\n                smoothStreamingManifest,\n                new MediaItem.Builder()\n                        .setTag(metadata)\n                        .setUri(manifestUri)\n                        .setCustomCacheKey(cacheKey)\n                        .build());\n    }\n    //endregion\n\n\n    //region YouTube media sources\n    private static MediaSource createYoutubeMediaSource(final Stream stream,\n                                                        final StreamInfo streamInfo,\n                                                        final PlayerDataSource dataSource,\n                                                        final String cacheKey,\n                                                        final MediaItemTag metadata)\n            throws ResolverException {\n        if (!(stream instanceof AudioStream || stream instanceof VideoStream)) {\n            throw new ResolverException(\"Generation of YouTube DASH manifest for \"\n                    + stream.getClass().getSimpleName() + \" is not supported\");\n        }\n\n        final StreamType streamType = streamInfo.getStreamType();\n        if (streamType == StreamType.VIDEO_STREAM) {\n            return createYoutubeMediaSourceOfVideoStreamType(dataSource, stream, streamInfo,\n                    cacheKey, metadata);\n        } else if (streamType == StreamType.POST_LIVE_STREAM) {\n            // If the content is not an URL, uses the DASH delivery method and if the stream type\n            // of the stream is a post live stream, it means that the content is an ended\n            // livestream so we need to generate the manifest corresponding to the content\n            // (which is the last segment of the stream)\n\n            try {\n                final ItagItem itagItem = Objects.requireNonNull(stream.getItagItem());\n                final String manifestString = YoutubePostLiveStreamDvrDashManifestCreator\n                        .fromPostLiveStreamDvrStreamingUrl(stream.getContent(),\n                                itagItem,\n                                itagItem.getTargetDurationSec(),\n                                streamInfo.getDuration());\n                return buildYoutubeManualDashMediaSource(dataSource,\n                        createDashManifest(manifestString, stream), stream, cacheKey,\n                        metadata);\n            } catch (final CreationException | IOException | NullPointerException e) {\n                throw new ResolverException(\n                        \"Error when generating the DASH manifest of YouTube ended live stream\", e);\n            }\n        } else {\n            throw new ResolverException(\n                    \"DASH manifest generation of YouTube livestreams is not supported\");\n        }\n    }\n\n    private static MediaSource createYoutubeMediaSourceOfVideoStreamType(\n            final PlayerDataSource dataSource,\n            final Stream stream,\n            final StreamInfo streamInfo,\n            final String cacheKey,\n            final MediaItemTag metadata) throws ResolverException {\n        final DeliveryMethod deliveryMethod = stream.getDeliveryMethod();\n        switch (deliveryMethod) {\n            case PROGRESSIVE_HTTP:\n                if ((stream instanceof VideoStream && ((VideoStream) stream).isVideoOnly())\n                        || stream instanceof AudioStream) {\n                    try {\n                        final String manifestString = YoutubeProgressiveDashManifestCreator\n                                .fromProgressiveStreamingUrl(stream.getContent(),\n                                        Objects.requireNonNull(stream.getItagItem()),\n                                        streamInfo.getDuration());\n                        return buildYoutubeManualDashMediaSource(dataSource,\n                                createDashManifest(manifestString, stream), stream, cacheKey,\n                                metadata);\n                    } catch (final CreationException | IOException | NullPointerException e) {\n                        Log.w(TAG, \"Error when generating or parsing DASH manifest of \"\n                                + \"YouTube progressive stream, falling back to a \"\n                                + \"ProgressiveMediaSource.\", e);\n                        return buildYoutubeProgressiveMediaSource(dataSource, stream, cacheKey,\n                                metadata);\n                    }\n                } else {\n                    // Legacy progressive streams, subtitles are handled by\n                    // VideoPlaybackResolver\n                    return buildYoutubeProgressiveMediaSource(dataSource, stream, cacheKey,\n                            metadata);\n                }\n            case DASH:\n                // If the content is not a URL, uses the DASH delivery method and if the stream\n                // type of the stream is a video stream, it means the content is an OTF stream\n                // so we need to generate the manifest corresponding to the content (which is\n                // the base URL of the OTF stream).\n\n                try {\n                    final String manifestString = YoutubeOtfDashManifestCreator\n                            .fromOtfStreamingUrl(stream.getContent(),\n                                    Objects.requireNonNull(stream.getItagItem()),\n                                    streamInfo.getDuration());\n                    return buildYoutubeManualDashMediaSource(dataSource,\n                            createDashManifest(manifestString, stream), stream, cacheKey,\n                            metadata);\n                } catch (final CreationException | IOException | NullPointerException e) {\n                    Log.e(TAG,\n                            \"Error when generating the DASH manifest of YouTube OTF stream\", e);\n                    throw new ResolverException(\n                            \"Error when generating the DASH manifest of YouTube OTF stream\", e);\n                }\n            case HLS:\n                return dataSource.getYoutubeHlsMediaSourceFactory().createMediaSource(\n                        new MediaItem.Builder()\n                                .setTag(metadata)\n                                .setUri(Uri.parse(stream.getContent()))\n                                .setCustomCacheKey(cacheKey)\n                                .build());\n            default:\n                throw new ResolverException(\"Unsupported delivery method for YouTube contents: \"\n                        + deliveryMethod);\n        }\n    }\n\n    private static DashMediaSource buildYoutubeManualDashMediaSource(\n            final PlayerDataSource dataSource,\n            final DashManifest dashManifest,\n            final Stream stream,\n            final String cacheKey,\n            final MediaItemTag metadata) {\n        return dataSource.getYoutubeDashMediaSourceFactory().createMediaSource(dashManifest,\n                new MediaItem.Builder()\n                        .setTag(metadata)\n                        .setUri(Uri.parse(stream.getContent()))\n                        .setCustomCacheKey(cacheKey)\n                        .build());\n    }\n\n    private static ProgressiveMediaSource buildYoutubeProgressiveMediaSource(\n            final PlayerDataSource dataSource,\n            final Stream stream,\n            final String cacheKey,\n            final MediaItemTag metadata) {\n        return dataSource.getYoutubeProgressiveMediaSourceFactory()\n                .createMediaSource(new MediaItem.Builder()\n                        .setTag(metadata)\n                        .setUri(Uri.parse(stream.getContent()))\n                        .setCustomCacheKey(cacheKey)\n                        .build());\n    }\n    //endregion\n\n\n    //region Utils\n    private static Uri manifestUrlToUri(final String manifestUrl) {\n        return Uri.parse(Objects.requireNonNullElse(manifestUrl, \"\"));\n    }\n\n    private static void throwResolverExceptionIfUrlNullOrEmpty(@Nullable final String url)\n            throws ResolverException {\n        if (url == null) {\n            throw new ResolverException(\"Null stream URL\");\n        } else if (url.isEmpty()) {\n            throw new ResolverException(\"Empty stream URL\");\n        }\n    }\n    //endregion\n\n\n    //region Resolver exception\n    final class ResolverException extends Exception {\n        public ResolverException(final String message) {\n            super(message);\n        }\n\n        public ResolverException(final String message, final Throwable cause) {\n            super(message, cause);\n        }\n    }\n    //endregion\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/resolver/Resolver.java",
    "content": "package org.schabi.newpipe.player.resolver;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\npublic interface Resolver<Source, Product> {\n    @Nullable\n    Product resolve(@NonNull Source source);\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java",
    "content": "package org.schabi.newpipe.player.resolver;\n\nimport android.content.Context;\nimport android.net.Uri;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.C;\nimport com.google.android.exoplayer2.MediaItem;\nimport com.google.android.exoplayer2.source.MediaSource;\nimport com.google.android.exoplayer2.source.MergingMediaSource;\n\nimport org.schabi.newpipe.extractor.MediaFormat;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.SubtitlesStream;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\nimport org.schabi.newpipe.player.helper.PlayerDataSource;\nimport org.schabi.newpipe.player.helper.PlayerHelper;\nimport org.schabi.newpipe.player.mediaitem.MediaItemTag;\nimport org.schabi.newpipe.player.mediaitem.StreamInfoTag;\nimport org.schabi.newpipe.util.ListHelper;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\n\nimport static com.google.android.exoplayer2.C.TIME_UNSET;\nimport static org.schabi.newpipe.util.ListHelper.getFilteredAudioStreams;\nimport static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams;\nimport static org.schabi.newpipe.util.ListHelper.getPlayableStreams;\n\npublic class VideoPlaybackResolver implements PlaybackResolver {\n    private static final String TAG = VideoPlaybackResolver.class.getSimpleName();\n\n    @NonNull\n    private final Context context;\n    @NonNull\n    private final PlayerDataSource dataSource;\n    @NonNull\n    private final QualityResolver qualityResolver;\n    private SourceType streamSourceType;\n\n    @Nullable\n    private String playbackQuality;\n    @Nullable\n    private String audioTrack;\n\n    public enum SourceType {\n        LIVE_STREAM,\n        VIDEO_WITH_SEPARATED_AUDIO,\n        VIDEO_WITH_AUDIO_OR_AUDIO_ONLY\n    }\n\n    public VideoPlaybackResolver(@NonNull final Context context,\n                                 @NonNull final PlayerDataSource dataSource,\n                                 @NonNull final QualityResolver qualityResolver) {\n        this.context = context;\n        this.dataSource = dataSource;\n        this.qualityResolver = qualityResolver;\n    }\n\n    @Override\n    @Nullable\n    public MediaSource resolve(@NonNull final StreamInfo info) {\n        final MediaSource liveSource = PlaybackResolver.maybeBuildLiveMediaSource(dataSource, info);\n        if (liveSource != null) {\n            streamSourceType = SourceType.LIVE_STREAM;\n            return liveSource;\n        }\n\n        final List<MediaSource> mediaSources = new ArrayList<>();\n\n        // Create video stream source\n        final List<VideoStream> videoStreamsList = ListHelper.getSortedStreamVideosList(context,\n                getPlayableStreams(info.getVideoStreams(), info.getServiceId()),\n                getPlayableStreams(info.getVideoOnlyStreams(), info.getServiceId()), false, true);\n        final List<AudioStream> audioStreamsList =\n                getFilteredAudioStreams(context, info.getAudioStreams());\n\n        final int videoIndex;\n        if (videoStreamsList.isEmpty()) {\n            videoIndex = -1;\n        } else if (playbackQuality == null) {\n            videoIndex = qualityResolver.getDefaultResolutionIndex(videoStreamsList);\n        } else {\n            videoIndex = qualityResolver.getOverrideResolutionIndex(videoStreamsList,\n                    getPlaybackQuality());\n        }\n\n        final int audioIndex =\n                ListHelper.getAudioFormatIndex(context, audioStreamsList, audioTrack);\n        final MediaItemTag tag =\n                StreamInfoTag.of(info, videoStreamsList, videoIndex, audioStreamsList, audioIndex);\n        @Nullable final VideoStream video = tag.getMaybeQuality()\n                .map(MediaItemTag.Quality::getSelectedVideoStream)\n                .orElse(null);\n        @Nullable final AudioStream audio = tag.getMaybeAudioTrack()\n                .map(MediaItemTag.AudioTrack::getSelectedAudioStream)\n                .orElse(null);\n\n        if (video != null) {\n            try {\n                final MediaSource streamSource = PlaybackResolver.buildMediaSource(\n                        dataSource, video, info, PlaybackResolver.cacheKeyOf(info, video), tag);\n                mediaSources.add(streamSource);\n            } catch (final ResolverException e) {\n                Log.e(TAG, \"Unable to create video source\", e);\n                return null;\n            }\n        }\n\n        // Use the audio stream if there is no video stream, or\n        // merge with audio stream in case if video does not contain audio\n        if (audio != null && (video == null || video.isVideoOnly() || audioTrack != null)) {\n            try {\n                final MediaSource audioSource = PlaybackResolver.buildMediaSource(\n                        dataSource, audio, info, PlaybackResolver.cacheKeyOf(info, audio), tag);\n                mediaSources.add(audioSource);\n                streamSourceType = SourceType.VIDEO_WITH_SEPARATED_AUDIO;\n            } catch (final ResolverException e) {\n                Log.e(TAG, \"Unable to create audio source\", e);\n                return null;\n            }\n        } else {\n            streamSourceType = SourceType.VIDEO_WITH_AUDIO_OR_AUDIO_ONLY;\n        }\n\n        // If there is no audio or video sources, then this media source cannot be played back\n        if (mediaSources.isEmpty()) {\n            return null;\n        }\n\n        // Below are auxiliary media sources\n\n        // Create subtitle sources\n        final List<SubtitlesStream> subtitlesStreams = info.getSubtitles();\n        if (subtitlesStreams != null) {\n            // Torrent and non URL subtitles are not supported by ExoPlayer\n            final List<SubtitlesStream> nonTorrentAndUrlStreams = getUrlAndNonTorrentStreams(\n                    subtitlesStreams);\n            for (final SubtitlesStream subtitle : nonTorrentAndUrlStreams) {\n                final MediaFormat mediaFormat = subtitle.getFormat();\n                if (mediaFormat != null) {\n                    @C.RoleFlags final int textRoleFlag = subtitle.isAutoGenerated()\n                            ? C.ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND\n                            : C.ROLE_FLAG_CAPTION;\n                    final MediaItem.SubtitleConfiguration textMediaItem =\n                            new MediaItem.SubtitleConfiguration.Builder(\n                                    Uri.parse(subtitle.getContent()))\n                                    .setMimeType(mediaFormat.getMimeType())\n                                    .setRoleFlags(textRoleFlag)\n                                    .setLanguage(PlayerHelper.captionLanguageOf(context, subtitle))\n                                    .build();\n                    final MediaSource textSource = dataSource.getSingleSampleMediaSourceFactory()\n                            .createMediaSource(textMediaItem, TIME_UNSET);\n                    mediaSources.add(textSource);\n                }\n            }\n        }\n\n        if (mediaSources.size() == 1) {\n            return mediaSources.get(0);\n        } else {\n            return new MergingMediaSource(true, mediaSources.toArray(new MediaSource[0]));\n        }\n    }\n\n    /**\n     * Returns the last resolved {@link StreamInfo}'s {@link SourceType source type}.\n     *\n     * @return {@link Optional#empty()} if nothing was resolved, otherwise the {@link SourceType}\n     * of the last resolved {@link StreamInfo} inside an {@link Optional}\n     */\n    public Optional<SourceType> getStreamSourceType() {\n        return Optional.ofNullable(streamSourceType);\n    }\n\n    @Nullable\n    public String getPlaybackQuality() {\n        return playbackQuality;\n    }\n\n    public void setPlaybackQuality(@Nullable final String playbackQuality) {\n        this.playbackQuality = playbackQuality;\n    }\n\n    @Nullable\n    public String getAudioTrack() {\n        return audioTrack;\n    }\n\n    public void setAudioTrack(@Nullable final String audioLanguage) {\n        this.audioTrack = audioLanguage;\n    }\n\n    public interface QualityResolver {\n        int getDefaultResolutionIndex(List<VideoStream> sortedVideos);\n\n        int getOverrideResolutionIndex(List<VideoStream> sortedVideos, String playbackQuality);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHelper.java",
    "content": "package org.schabi.newpipe.player.seekbarpreview;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.ImageView;\n\nimport androidx.annotation.IntDef;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.graphics.BitmapCompat;\nimport androidx.core.math.MathUtils;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.util.DeviceUtils;\n\nimport java.lang.annotation.Retention;\nimport java.util.function.IntSupplier;\n\nimport static java.lang.annotation.RetentionPolicy.SOURCE;\nimport static org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHelper.SeekbarPreviewThumbnailType.HIGH_QUALITY;\nimport static org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHelper.SeekbarPreviewThumbnailType.LOW_QUALITY;\nimport static org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHelper.SeekbarPreviewThumbnailType.NONE;\n\n/**\n * Helper for the seekbar preview.\n */\npublic final class SeekbarPreviewThumbnailHelper {\n\n    // This has to be <= 23 chars on devices running Android 7 or lower (API <= 25)\n    // or it fails with an IllegalArgumentException\n    // https://stackoverflow.com/a/54744028\n    public static final String TAG = \"SeekbarPrevThumbHelper\";\n\n    private SeekbarPreviewThumbnailHelper() {\n        // No impl pls\n    }\n\n    @Retention(SOURCE)\n    @IntDef({HIGH_QUALITY, LOW_QUALITY,\n            NONE})\n    public @interface SeekbarPreviewThumbnailType {\n        int HIGH_QUALITY = 0;\n        int LOW_QUALITY = 1;\n        int NONE = 2;\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Settings Resolution\n    ///////////////////////////////////////////////////////////////////////////\n\n    @SeekbarPreviewThumbnailType\n    public static int getSeekbarPreviewThumbnailType(@NonNull final Context context) {\n        final String type = PreferenceManager.getDefaultSharedPreferences(context).getString(\n                context.getString(R.string.seekbar_preview_thumbnail_key), \"\");\n        if (type.equals(context.getString(R.string.seekbar_preview_thumbnail_none))) {\n            return NONE;\n        } else if (type.equals(context.getString(R.string.seekbar_preview_thumbnail_low_quality))) {\n            return LOW_QUALITY;\n        } else {\n            return HIGH_QUALITY; // default\n        }\n    }\n\n    public static void tryResizeAndSetSeekbarPreviewThumbnail(\n            @NonNull final Context context,\n            @Nullable final Bitmap previewThumbnail,\n            @NonNull final ImageView currentSeekbarPreviewThumbnail,\n            @NonNull final IntSupplier baseViewWidthSupplier) {\n        if (previewThumbnail == null) {\n            currentSeekbarPreviewThumbnail.setVisibility(View.GONE);\n            return;\n        }\n\n        currentSeekbarPreviewThumbnail.setVisibility(View.VISIBLE);\n\n        // Resize original bitmap\n        try {\n            final int srcWidth = previewThumbnail.getWidth() > 0 ? previewThumbnail.getWidth() : 1;\n            final int newWidth = MathUtils.clamp(\n                    // Use 1/4 of the width for the preview\n                    Math.round(baseViewWidthSupplier.getAsInt() / 4f),\n                    // But have a min width of 10dp\n                    DeviceUtils.dpToPx(10, context),\n                    // And scaling more than that factor looks really pixelated -> max\n                    Math.round(srcWidth * 2.5f));\n\n            final float scaleFactor = (float) newWidth / srcWidth;\n            final int newHeight = (int) (previewThumbnail.getHeight() * scaleFactor);\n\n            currentSeekbarPreviewThumbnail.setImageBitmap(BitmapCompat\n                    .createScaledBitmap(previewThumbnail, newWidth, newHeight, null, true));\n        } catch (final Exception ex) {\n            Log.e(TAG, \"Failed to resize and set seekbar preview thumbnail\", ex);\n            currentSeekbarPreviewThumbnail.setVisibility(View.GONE);\n        } finally {\n            previewThumbnail.recycle();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/seekbarpreview/SeekbarPreviewThumbnailHolder.java",
    "content": "package org.schabi.newpipe.player.seekbarpreview;\n\nimport static org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHelper.SeekbarPreviewThumbnailType;\nimport static org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHelper.getSeekbarPreviewThumbnailType;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.collection.SparseArrayCompat;\n\nimport com.google.common.base.Stopwatch;\n\nimport org.schabi.newpipe.App;\nimport org.schabi.newpipe.extractor.stream.Frameset;\nimport org.schabi.newpipe.util.image.CoilHelper;\n\nimport java.util.Comparator;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.UUID;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\nimport java.util.function.Supplier;\n\npublic class SeekbarPreviewThumbnailHolder {\n\n    // This has to be <= 23 chars on devices running Android 7 or lower (API <= 25)\n    // or it fails with an IllegalArgumentException\n    // https://stackoverflow.com/a/54744028\n    public static final String TAG = \"SeekbarPrevThumbHolder\";\n\n    // Key = Position of the picture in milliseconds\n    // Supplier = Supplies the bitmap for that position\n    private final SparseArrayCompat<Supplier<Bitmap>> seekbarPreviewData =\n            new SparseArrayCompat<>();\n\n    // This ensures that if the reset is still undergoing\n    // and another reset starts, only the last reset is processed\n    private UUID currentUpdateRequestIdentifier = UUID.randomUUID();\n\n    public void resetFrom(@NonNull final Context context, final List<Frameset> framesets) {\n        final int seekbarPreviewType = getSeekbarPreviewThumbnailType(context);\n\n        final UUID updateRequestIdentifier = UUID.randomUUID();\n        this.currentUpdateRequestIdentifier = updateRequestIdentifier;\n\n        final ExecutorService executorService = Executors.newSingleThreadExecutor();\n        executorService.submit(() -> {\n            try {\n                resetFromAsync(seekbarPreviewType, framesets, updateRequestIdentifier);\n            } catch (final Exception ex) {\n                Log.e(TAG, \"Failed to execute async\", ex);\n            }\n        });\n        // ensure that the executorService stops/destroys it's threads\n        // after the task is finished\n        executorService.shutdown();\n    }\n\n    private void resetFromAsync(final int seekbarPreviewType, final List<Frameset> framesets,\n                                final UUID updateRequestIdentifier) {\n        Log.d(TAG, \"Clearing seekbarPreviewData\");\n        synchronized (seekbarPreviewData) {\n            seekbarPreviewData.clear();\n        }\n\n        if (seekbarPreviewType == SeekbarPreviewThumbnailType.NONE) {\n            Log.d(TAG, \"Not processing seekbarPreviewData due to settings\");\n            return;\n        }\n\n        final Frameset frameset = getFrameSetForType(framesets, seekbarPreviewType);\n        if (frameset == null) {\n            Log.d(TAG, \"No frameset was found to fill seekbarPreviewData\");\n            return;\n        }\n\n        Log.d(TAG, \"Frameset quality info: \"\n                + \"[width=\" + frameset.getFrameWidth()\n                + \", heigh=\" + frameset.getFrameHeight() + \"]\");\n\n        // Abort method execution if we are not the latest request\n        if (!isRequestIdentifierCurrent(updateRequestIdentifier)) {\n            return;\n        }\n\n        generateDataFrom(frameset, updateRequestIdentifier);\n    }\n\n    private Frameset getFrameSetForType(final List<Frameset> framesets,\n                                        final int seekbarPreviewType) {\n        if (seekbarPreviewType == SeekbarPreviewThumbnailType.HIGH_QUALITY) {\n            Log.d(TAG, \"Strategy for seekbarPreviewData: high quality\");\n            return framesets.stream()\n                    .max(Comparator.comparingInt(fs -> fs.getFrameHeight() * fs.getFrameWidth()))\n                    .orElse(null);\n        } else {\n            Log.d(TAG, \"Strategy for seekbarPreviewData: low quality\");\n            return framesets.stream()\n                    .min(Comparator.comparingInt(fs -> fs.getFrameHeight() * fs.getFrameWidth()))\n                    .orElse(null);\n        }\n    }\n\n    private void generateDataFrom(final Frameset frameset, final UUID updateRequestIdentifier) {\n        Log.d(TAG, \"Starting generation of seekbarPreviewData\");\n        final Stopwatch sw = Log.isLoggable(TAG, Log.DEBUG) ? Stopwatch.createStarted() : null;\n\n        int currentPosMs = 0;\n        int pos = 1;\n\n        final int urlFrameCount = frameset.getFramesPerPageX() * frameset.getFramesPerPageY();\n\n        // Process each url in the frameset\n        for (final String url : frameset.getUrls()) {\n            // get the bitmap\n            final Bitmap srcBitMap = getBitMapFrom(url);\n\n            // The data is not added directly to \"seekbarPreviewData\" due to\n            // concurrency and checks for \"updateRequestIdentifier\"\n            final var generatedDataForUrl = new SparseArrayCompat<Supplier<Bitmap>>(urlFrameCount);\n\n            // The bitmap consists of several images, which we process here\n            // foreach frame in the returned bitmap\n            for (int i = 0; i < urlFrameCount; i++) {\n                // Frames outside the video length are skipped\n                if (pos > frameset.getTotalCount()) {\n                    break;\n                }\n\n                // Get the bounds where the frame is found\n                final int[] bounds = frameset.getFrameBoundsAt(currentPosMs);\n                generatedDataForUrl.put(currentPosMs,\n                                        createBitmapSupplier(srcBitMap, bounds, frameset));\n\n                currentPosMs += frameset.getDurationPerFrame();\n                pos++;\n            }\n\n            // Check if we are still the latest request\n            // If not abort method execution\n            if (isRequestIdentifierCurrent(updateRequestIdentifier)) {\n                synchronized (seekbarPreviewData) {\n                    seekbarPreviewData.putAll(generatedDataForUrl);\n                }\n            } else {\n                Log.d(TAG, \"Aborted of generation of seekbarPreviewData\");\n                break;\n            }\n        }\n\n        if (sw != null) {\n            Log.d(TAG, \"Generation of seekbarPreviewData took \" + sw.stop());\n        }\n    }\n\n    private Supplier<Bitmap> createBitmapSupplier(final Bitmap srcBitMap,\n                                                  final int[] bounds,\n                                                  final Frameset frameset) {\n        return () -> {\n            // It can happen, that the original bitmap could not be downloaded\n            // (or it was recycled though that should not happen)\n            // In such a case - we don't want a NullPointer/\n            // \"cannot use a recycled source in createBitmap\" Exception -> simply return null\n            if (srcBitMap == null || srcBitMap.isRecycled()) {\n                return null;\n            }\n\n            // Under some rare circumstances the YouTube API returns slightly too small storyboards,\n            // (or not the matching frame width/height)\n            // This would lead to createBitmap cutting out a bitmap that is out of bounds,\n            // so we need to adjust the bounds accordingly\n            if (srcBitMap.getWidth() < bounds[1] + frameset.getFrameWidth()) {\n                bounds[1] = srcBitMap.getWidth() - frameset.getFrameWidth();\n            }\n\n            if (srcBitMap.getHeight() < bounds[2] + frameset.getFrameHeight()) {\n                bounds[2] = srcBitMap.getHeight() - frameset.getFrameHeight();\n            }\n\n            // Cut out the corresponding bitmap form the \"srcBitMap\"\n            final Bitmap cutOutBitmap = Bitmap.createBitmap(srcBitMap, bounds[1], bounds[2],\n                    frameset.getFrameWidth(), frameset.getFrameHeight());\n\n            // If the cut out bitmap is identical to its source,\n            // we need to copy the bitmap to create a new instance.\n            // createBitmap allows itself to return the original object that is was created with\n            // this leads to recycled bitmaps being returned (if they are identical)\n            // Reference: https://stackoverflow.com/a/23683075 + first comment\n            // Fixes: https://github.com/TeamNewPipe/NewPipe/issues/11461\n            return cutOutBitmap == srcBitMap\n                    ? cutOutBitmap.copy(cutOutBitmap.getConfig(), true) : cutOutBitmap;\n        };\n    }\n\n    @Nullable\n    private Bitmap getBitMapFrom(final String url) {\n        if (url == null) {\n            Log.w(TAG, \"url is null; This should never happen\");\n            return null;\n        }\n\n        final Stopwatch sw = Log.isLoggable(TAG, Log.DEBUG) ? Stopwatch.createStarted() : null;\n        try {\n            Log.d(TAG, \"Downloading bitmap for seekbarPreview from '\" + url + \"'\");\n\n            // Gets the bitmap within the timeout of 15 seconds imposed by default by OkHttpClient\n            // Ensure that you are not running on the main thread, otherwise this will hang\n            final var bitmap = CoilHelper.INSTANCE.loadBitmapBlocking(App.getInstance(), url);\n\n            if (sw != null) {\n                Log.d(TAG, \"Download of bitmap for seekbarPreview from '\" + url + \"' took \"\n                        + sw.stop());\n            }\n\n            return bitmap;\n        } catch (final Exception ex) {\n            Log.w(TAG, \"Failed to get bitmap for seekbarPreview from url='\" + url\n                    + \"' in time\", ex);\n            return null;\n        }\n    }\n\n    private boolean isRequestIdentifierCurrent(final UUID requestIdentifier) {\n        return this.currentUpdateRequestIdentifier.equals(requestIdentifier);\n    }\n\n    public Optional<Bitmap> getBitmapAt(final int positionInMs) {\n        // Get the frame supplier closest to the requested position\n        Supplier<Bitmap> closestFrame = () -> null;\n        synchronized (seekbarPreviewData) {\n            int min = Integer.MAX_VALUE;\n            for (int i = 0; i < seekbarPreviewData.size(); i++) {\n                final int pos = Math.abs(seekbarPreviewData.keyAt(i) - positionInMs);\n                if (pos < min) {\n                    closestFrame = seekbarPreviewData.valueAt(i);\n                    min = pos;\n                }\n            }\n        }\n\n        return Optional.ofNullable(closestFrame.get());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/ui/BackgroundPlayerUi.java",
    "content": "package org.schabi.newpipe.player.ui;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.player.Player;\n\n/**\n * This is not a \"graphical\" UI for the background player, but it is used to disable fetching video\n * and text tracks with it.\n *\n * <p>\n * This allows reducing data usage for manifest sources with demuxed audio and video,\n * such as livestreams.\n * </p>\n */\npublic class BackgroundPlayerUi extends PlayerUi {\n\n    public BackgroundPlayerUi(@NonNull final Player player) {\n        super(player);\n    }\n\n    @Override\n    public void initPlayback() {\n        super.initPlayback();\n\n        // Make sure to disable video and subtitles track types\n        player.useVideoAndSubtitles(false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java",
    "content": "package org.schabi.newpipe.player.ui;\n\nimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;\nimport static org.schabi.newpipe.MainActivity.DEBUG;\nimport static org.schabi.newpipe.QueueItemMenuUtil.openPopupMenu;\nimport static org.schabi.newpipe.extractor.ServiceList.YouTube;\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\nimport static org.schabi.newpipe.player.Player.STATE_COMPLETED;\nimport static org.schabi.newpipe.player.Player.STATE_PAUSED;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_BACKGROUND;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_NONE;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.MinimizeMode.MINIMIZE_ON_EXIT_MODE_POPUP;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.getMinimizeOnExitAction;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.getTimeString;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.globalScreenOrientationLocked;\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_PLAY_PAUSE;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.res.Resources;\nimport android.database.ContentObserver;\nimport android.graphics.Bitmap;\nimport android.graphics.Color;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.provider.Settings;\nimport android.util.Log;\nimport android.view.KeyEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.ViewParent;\nimport android.view.WindowManager;\nimport android.widget.FrameLayout;\nimport android.widget.LinearLayout;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.content.res.AppCompatResources;\nimport androidx.fragment.app.FragmentActivity;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.google.android.exoplayer2.ui.SubtitleView;\nimport com.google.android.exoplayer2.video.VideoSize;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.PlayerBinding;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamSegment;\nimport org.schabi.newpipe.fragments.OnScrollBelowItemsListener;\nimport org.schabi.newpipe.fragments.detail.VideoDetailFragment;\nimport org.schabi.newpipe.info_list.StreamSegmentAdapter;\nimport org.schabi.newpipe.info_list.StreamSegmentItem;\nimport org.schabi.newpipe.ktx.AnimationType;\nimport org.schabi.newpipe.local.dialog.PlaylistDialog;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.event.PlayerServiceEventListener;\nimport org.schabi.newpipe.player.gesture.BasePlayerGestureListener;\nimport org.schabi.newpipe.player.gesture.MainPlayerGestureListener;\nimport org.schabi.newpipe.player.helper.PlaybackParameterDialog;\nimport org.schabi.newpipe.player.helper.PlayerHelper;\nimport org.schabi.newpipe.player.mediaitem.MediaItemTag;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueueAdapter;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItemBuilder;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItemHolder;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItemTouchCallback;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.external_communication.KoreUtils;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\n\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\n\npublic final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutChangeListener {\n    private static final String TAG = MainPlayerUi.class.getSimpleName();\n\n    // see the Javadoc of calculateMaxEndScreenThumbnailHeight for information\n    private static final int DETAIL_ROOT_MINIMUM_HEIGHT = 85; // dp\n    private static final int DETAIL_TITLE_TEXT_SIZE_TV = 16; // sp\n    private static final int DETAIL_TITLE_TEXT_SIZE_TABLET = 15; // sp\n\n    private boolean isFullscreen = false;\n    private boolean isVerticalVideo = false;\n    private boolean fragmentIsVisible = false;\n\n    private ContentObserver settingsContentObserver;\n\n    private PlayQueueAdapter playQueueAdapter;\n    private StreamSegmentAdapter segmentAdapter;\n    private boolean isQueueVisible = false;\n    private boolean areSegmentsVisible = false;\n\n    // fullscreen player\n    private ItemTouchHelper itemTouchHelper;\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Constructor, setup, destroy\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Constructor, setup, destroy\n\n    public MainPlayerUi(@NonNull final Player player,\n                        @NonNull final PlayerBinding playerBinding) {\n        super(player, playerBinding);\n    }\n\n    /**\n     * Open fullscreen on tablets where the option to have the main player start automatically in\n     * fullscreen mode is on. Rotating the device to landscape is already done in {@link\n     * VideoDetailFragment#openVideoPlayer(boolean)} when the thumbnail is clicked, and that's\n     * enough for phones, but not for tablets since the mini player can be also shown in landscape.\n     */\n    private void directlyOpenFullscreenIfNeeded() {\n        if (PlayerHelper.isStartMainPlayerFullscreenEnabled(player.getService())\n                && DeviceUtils.isTablet(player.getService())\n                && PlayerHelper.globalScreenOrientationLocked(player.getService())) {\n            player.getFragmentListener().ifPresent(\n                    PlayerServiceEventListener::onScreenRotationButtonClicked);\n        }\n    }\n\n    @Override\n    public void setupAfterIntent() {\n        // needed for tablets, check the function for a better explanation\n        directlyOpenFullscreenIfNeeded();\n\n        super.setupAfterIntent();\n\n        initVideoPlayer();\n        // Android TV: without it focus will frame the whole player\n        binding.playPauseButton.requestFocus();\n\n        // Note: This is for automatically playing (when \"Resume playback\" is off), see #6179\n        if (player.getPlayWhenReady()) {\n            player.play();\n        } else {\n            player.pause();\n        }\n    }\n\n    @Override\n    BasePlayerGestureListener buildGestureListener() {\n        return new MainPlayerGestureListener(this);\n    }\n\n    @Override\n    protected void initListeners() {\n        super.initListeners();\n\n        binding.screenRotationButton.setOnClickListener(makeOnClickListener(() -> {\n            // Only if it's not a vertical video or vertical video but in landscape with locked\n            // orientation a screen orientation can be changed automatically\n            if (!isVerticalVideo || (isLandscape() && globalScreenOrientationLocked(context))) {\n                player.getFragmentListener()\n                        .ifPresent(PlayerServiceEventListener::onScreenRotationButtonClicked);\n            } else {\n                toggleFullscreen();\n            }\n        }));\n        binding.queueButton.setOnClickListener(v -> onQueueClicked());\n        binding.segmentsButton.setOnClickListener(v -> onSegmentsClicked());\n\n        binding.addToPlaylistButton.setOnClickListener(v ->\n                getParentActivity().map(FragmentActivity::getSupportFragmentManager)\n                        .ifPresent(fragmentManager ->\n                                PlaylistDialog.showForPlayQueue(player, fragmentManager)));\n\n        settingsContentObserver = new ContentObserver(new Handler(Looper.getMainLooper())) {\n            @Override\n            public void onChange(final boolean selfChange) {\n                setupScreenRotationButton();\n            }\n        };\n        context.getContentResolver().registerContentObserver(\n                Settings.System.getUriFor(Settings.System.ACCELEROMETER_ROTATION), false,\n                settingsContentObserver);\n\n        binding.getRoot().addOnLayoutChangeListener(this);\n\n        binding.moreOptionsButton.setOnLongClickListener(v -> {\n            player.getFragmentListener()\n                    .ifPresent(PlayerServiceEventListener::onMoreOptionsLongClicked);\n            hideControls(0, 0);\n            hideSystemUIIfNeeded();\n            return true;\n        });\n    }\n\n    @Override\n    protected void deinitListeners() {\n        super.deinitListeners();\n\n        binding.queueButton.setOnClickListener(null);\n        binding.segmentsButton.setOnClickListener(null);\n        binding.addToPlaylistButton.setOnClickListener(null);\n\n        context.getContentResolver().unregisterContentObserver(settingsContentObserver);\n\n        binding.getRoot().removeOnLayoutChangeListener(this);\n    }\n\n    @Override\n    public void initPlayback() {\n        super.initPlayback();\n\n        if (playQueueAdapter != null) {\n            playQueueAdapter.dispose();\n        }\n        playQueueAdapter = new PlayQueueAdapter(context,\n                Objects.requireNonNull(player.getPlayQueue()));\n        segmentAdapter = new StreamSegmentAdapter(getStreamSegmentListener());\n\n        // Make sure video and text tracks are enabled if the user is in the app, in the case user\n        // switched from background player to main player\n        player.useVideoAndSubtitles(fragmentIsVisible);\n    }\n\n    @Override\n    public void removeViewFromParent() {\n        // view was added to fragment\n        final ViewParent parent = binding.getRoot().getParent();\n        if (parent instanceof ViewGroup) {\n            ((ViewGroup) parent).removeView(binding.getRoot());\n        }\n    }\n\n    @Override\n    public void destroy() {\n        super.destroy();\n\n        // Exit from fullscreen when user closes the player via notification\n        if (isFullscreen) {\n            toggleFullscreen();\n        }\n\n        removeViewFromParent();\n    }\n\n    @Override\n    public void destroyPlayer() {\n        super.destroyPlayer();\n\n        if (playQueueAdapter != null) {\n            playQueueAdapter.unsetSelectedListener();\n            playQueueAdapter.dispose();\n        }\n    }\n\n    @Override\n    public void smoothStopForImmediateReusing() {\n        super.smoothStopForImmediateReusing();\n        // Android TV will handle back button in case controls will be visible\n        // (one more additional unneeded click while the player is hidden)\n        hideControls(0, 0);\n        closeItemsList();\n    }\n\n    private void initVideoPlayer() {\n        // restore last resize mode\n        setResizeMode(PlayerHelper.retrieveResizeModeFromPrefs(player));\n        binding.getRoot().setLayoutParams(new FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT));\n    }\n\n    @Override\n    protected void setupElementsVisibility() {\n        super.setupElementsVisibility();\n\n        closeItemsList();\n        showHideKodiButton();\n        binding.fullScreenButton.setVisibility(View.GONE);\n        setupScreenRotationButton();\n        binding.resizeTextView.setVisibility(View.VISIBLE);\n        binding.getRoot().findViewById(R.id.metadataView).setVisibility(View.VISIBLE);\n        binding.moreOptionsButton.setVisibility(View.VISIBLE);\n        binding.topControls.setOrientation(LinearLayout.VERTICAL);\n        binding.primaryControls.getLayoutParams().width = MATCH_PARENT;\n        binding.secondaryControls.setVisibility(View.INVISIBLE);\n        binding.moreOptionsButton.setImageDrawable(AppCompatResources.getDrawable(context,\n                R.drawable.ic_expand_more));\n        binding.share.setVisibility(View.VISIBLE);\n        binding.openInBrowser.setVisibility(View.VISIBLE);\n        binding.switchMute.setVisibility(View.VISIBLE);\n        binding.playerCloseButton.setVisibility(isFullscreen ? View.GONE : View.VISIBLE);\n        // Top controls have a large minHeight which is allows to drag the player\n        // down in fullscreen mode (just larger area to make easy to locate by finger)\n        binding.topControls.setClickable(true);\n        binding.topControls.setFocusable(true);\n\n        binding.metadataView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE);\n\n        // Reset workaround changes from popup player\n        binding.audioTrackTextView.setMaxWidth(Integer.MAX_VALUE);\n    }\n\n    @Override\n    protected void setupElementsSize(final Resources resources) {\n        setupElementsSize(\n                resources.getDimensionPixelSize(R.dimen.player_main_buttons_min_width),\n                resources.getDimensionPixelSize(R.dimen.player_main_top_padding),\n                resources.getDimensionPixelSize(R.dimen.player_main_controls_padding),\n                resources.getDimensionPixelSize(R.dimen.player_main_buttons_padding)\n        );\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Broadcast receiver\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Broadcast receiver\n\n    @Override\n    public void onBroadcastReceived(final Intent intent) {\n        super.onBroadcastReceived(intent);\n        if (Intent.ACTION_CONFIGURATION_CHANGED.equals(intent.getAction())) {\n            // Close it because when changing orientation from portrait\n            // (in fullscreen mode) the size of queue layout can be larger than the screen size\n            closeItemsList();\n        } else if (ACTION_PLAY_PAUSE.equals(intent.getAction())) {\n            // Ensure that we have audio-only stream playing when a user\n            // started to play from notification's play button from outside of the app\n            if (!fragmentIsVisible) {\n                onFragmentStopped();\n            }\n        } else if (VideoDetailFragment.ACTION_VIDEO_FRAGMENT_STOPPED.equals(intent.getAction())) {\n            fragmentIsVisible = false;\n            onFragmentStopped();\n        } else if (VideoDetailFragment.ACTION_VIDEO_FRAGMENT_RESUMED.equals(intent.getAction())) {\n            // Restore video source when user returns to the fragment\n            fragmentIsVisible = true;\n            player.useVideoAndSubtitles(true);\n\n            // When a user returns from background, the system UI will always be shown even if\n            // controls are invisible: hide it in that case\n            if (!isControlsVisible()) {\n                hideSystemUIIfNeeded();\n            }\n        }\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Fragment binding\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Fragment binding\n\n    @Override\n    public void onFragmentListenerSet() {\n        super.onFragmentListenerSet();\n        fragmentIsVisible = true;\n        // Apply window insets because Android will not do it when orientation changes\n        // from landscape to portrait\n        if (!isFullscreen) {\n            binding.playbackControlRoot.setPadding(0, 0, 0, 0);\n        }\n        binding.itemsListPanel.setPadding(0, 0, 0, 0);\n        player.getFragmentListener().ifPresent(PlayerServiceEventListener::onViewCreated);\n    }\n\n    /**\n     * This will be called when a user goes to another app/activity, turns off a screen.\n     * We don't want to interrupt playback and don't want to see notification so\n     * next lines of code will enable audio-only playback only if needed\n     */\n    private void onFragmentStopped() {\n        if (player.isPlaying() || player.isLoading()) {\n            switch (getMinimizeOnExitAction(context)) {\n                case MINIMIZE_ON_EXIT_MODE_BACKGROUND:\n                    player.useVideoAndSubtitles(false);\n                    break;\n                case MINIMIZE_ON_EXIT_MODE_POPUP:\n                    getParentActivity().ifPresent(activity -> {\n                        player.setRecovery();\n                        NavigationHelper.playOnPopupPlayer(activity, player.getPlayQueue(), true);\n                    });\n                    break;\n                case MINIMIZE_ON_EXIT_MODE_NONE: default:\n                    player.pause();\n                    break;\n            }\n        }\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playback states\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Playback states\n\n    @Override\n    public void onUpdateProgress(final int currentProgress,\n                                 final int duration,\n                                 final int bufferPercent) {\n        super.onUpdateProgress(currentProgress, duration, bufferPercent);\n\n        if (areSegmentsVisible) {\n            segmentAdapter.selectSegmentAt(getNearestStreamSegmentPosition(currentProgress));\n        }\n        if (isQueueVisible) {\n            updateQueueTime(currentProgress);\n        }\n    }\n\n    @Override\n    public void onPlaying() {\n        super.onPlaying();\n        checkLandscape();\n    }\n\n    @Override\n    public void onCompleted() {\n        super.onCompleted();\n        if (isFullscreen) {\n            toggleFullscreen();\n        }\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Controls showing / hiding\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Controls showing / hiding\n\n    @Override\n    protected void showOrHideButtons() {\n        super.showOrHideButtons();\n        @Nullable final PlayQueue playQueue = player.getPlayQueue();\n        if (playQueue == null) {\n            return;\n        }\n\n        final boolean showQueue = !playQueue.getStreams().isEmpty();\n        final boolean showSegment = !player.getCurrentStreamInfo()\n                .map(StreamInfo::getStreamSegments)\n                .map(List::isEmpty)\n                .orElse(/*no stream info=*/true);\n\n        binding.queueButton.setVisibility(showQueue ? View.VISIBLE : View.GONE);\n        binding.queueButton.setAlpha(showQueue ? 1.0f : 0.0f);\n        binding.segmentsButton.setVisibility(showSegment ? View.VISIBLE : View.GONE);\n        binding.segmentsButton.setAlpha(showSegment ? 1.0f : 0.0f);\n    }\n\n    @Override\n    public void showSystemUIPartially() {\n        if (isFullscreen) {\n            getParentActivity().map(Activity::getWindow).ifPresent(window -> {\n                window.setStatusBarColor(Color.TRANSPARENT);\n                window.setNavigationBarColor(Color.TRANSPARENT);\n                final int visibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE\n                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN\n                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;\n                window.getDecorView().setSystemUiVisibility(visibility);\n                window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);\n            });\n        }\n    }\n\n    @Override\n    public void hideSystemUIIfNeeded() {\n        player.getFragmentListener().ifPresent(PlayerServiceEventListener::hideSystemUiIfNeeded);\n    }\n\n    /**\n     * Calculate the maximum allowed height for the {@link R.id.endScreen}\n     * to prevent it from enlarging the player.\n     * <p>\n     * The calculating follows these rules:\n     * <ul>\n     * <li>\n     *     Show at least stream title and content creator on TVs and tablets when in landscape\n     *     (always the case for TVs) and not in fullscreen mode. This requires to have at least\n     *     {@link #DETAIL_ROOT_MINIMUM_HEIGHT} free space for {@link R.id.detail_root} and\n     *     additional space for the stream title text size ({@link R.id.detail_title_root_layout}).\n     *     The text size is {@link #DETAIL_TITLE_TEXT_SIZE_TABLET} on tablets and\n     *     {@link #DETAIL_TITLE_TEXT_SIZE_TV} on TVs, see {@link R.id.titleTextView}.\n     * </li>\n     * <li>\n     *     Otherwise, the max thumbnail height is the screen height.\n     * </li>\n     * </ul>\n     *\n     * @param bitmap the bitmap that needs to be resized to fit the end screen\n     * @return the maximum height for the end screen thumbnail\n     */\n    @Override\n    protected float calculateMaxEndScreenThumbnailHeight(@NonNull final Bitmap bitmap) {\n        final int screenHeight = context.getResources().getDisplayMetrics().heightPixels;\n\n        if (DeviceUtils.isTv(context) && !isFullscreen()) {\n            final int videoInfoHeight = DeviceUtils.dpToPx(DETAIL_ROOT_MINIMUM_HEIGHT, context)\n                    + DeviceUtils.spToPx(DETAIL_TITLE_TEXT_SIZE_TV, context);\n            return Math.min(bitmap.getHeight(), screenHeight - videoInfoHeight);\n        } else if (DeviceUtils.isTablet(context) && isLandscape() && !isFullscreen()) {\n            final int videoInfoHeight = DeviceUtils.dpToPx(DETAIL_ROOT_MINIMUM_HEIGHT, context)\n                    + DeviceUtils.spToPx(DETAIL_TITLE_TEXT_SIZE_TABLET, context);\n            return Math.min(bitmap.getHeight(), screenHeight - videoInfoHeight);\n        } else { // fullscreen player: max height is the device height\n            return Math.min(bitmap.getHeight(), screenHeight);\n        }\n    }\n\n    private void showHideKodiButton() {\n        // show kodi button if it supports the current service and it is enabled in settings\n        @Nullable final PlayQueue playQueue = player.getPlayQueue();\n        binding.playWithKodi.setVisibility(playQueue != null && playQueue.getItem() != null\n                && KoreUtils.shouldShowPlayWithKodi(context, playQueue.getItem().getServiceId())\n                ? View.VISIBLE : View.GONE);\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Captions (text tracks)\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Captions (text tracks)\n\n    @Override\n    protected void setupSubtitleView(final float captionScale) {\n        binding.subtitleView.setFractionalTextSize(\n                SubtitleView.DEFAULT_TEXT_SIZE_FRACTION * captionScale);\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Gestures\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Gestures\n\n    @SuppressWarnings(\"checkstyle:ParameterNumber\")\n    @Override\n    public void onLayoutChange(final View view, final int l, final int t, final int r, final int b,\n                               final int ol, final int ot, final int or, final int ob) {\n        if (l != ol || t != ot || r != or || b != ob) {\n            // Use a smaller value to be consistent across screen orientations, and to make usage\n            // easier. Multiply by 3/4 to ensure the user does not need to move the finger up to the\n            // screen border, in order to reach the maximum volume/brightness.\n            final int width = r - l;\n            final int height = b - t;\n            final int min = Math.min(width, height);\n            final int maxGestureLength = (int) (min * 0.75);\n\n            if (DEBUG) {\n                Log.d(TAG, \"maxGestureLength = \" + maxGestureLength);\n            }\n\n            binding.volumeProgressBar.setMax(maxGestureLength);\n            binding.brightnessProgressBar.setMax(maxGestureLength);\n\n            setInitialGestureValues();\n            binding.itemsListPanel.getLayoutParams().height =\n                    height - binding.itemsListPanel.getTop();\n        }\n    }\n\n    private void setInitialGestureValues() {\n        if (player.getAudioReactor() != null) {\n            final float currentVolumeNormalized = (float) player.getAudioReactor().getVolume()\n                    / player.getAudioReactor().getMaxVolume();\n            binding.volumeProgressBar.setProgress(\n                    (int) (binding.volumeProgressBar.getMax() * currentVolumeNormalized));\n        }\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Play queue, segments and streams\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Play queue, segments and streams\n\n    @Override\n    public void onMetadataChanged(@NonNull final StreamInfo info) {\n        super.onMetadataChanged(info);\n        showHideKodiButton();\n        if (areSegmentsVisible) {\n            if (segmentAdapter.setItems(info)) {\n                final int adapterPosition = getNearestStreamSegmentPosition(\n                        player.getExoPlayer().getCurrentPosition());\n                segmentAdapter.selectSegmentAt(adapterPosition);\n                binding.itemsList.scrollToPosition(adapterPosition);\n            } else {\n                closeItemsList();\n            }\n        }\n    }\n\n    @Override\n    public void onPlayQueueEdited() {\n        super.onPlayQueueEdited();\n        showOrHideButtons();\n    }\n\n    private void onQueueClicked() {\n        isQueueVisible = true;\n\n        hideSystemUIIfNeeded();\n        buildQueue();\n\n        binding.itemsListHeaderTitle.setVisibility(View.GONE);\n        binding.itemsListHeaderDuration.setVisibility(View.VISIBLE);\n        binding.shuffleButton.setVisibility(View.VISIBLE);\n        binding.repeatButton.setVisibility(View.VISIBLE);\n        binding.addToPlaylistButton.setVisibility(View.VISIBLE);\n\n        hideControls(0, 0);\n        binding.itemsListPanel.requestFocus();\n        animate(binding.itemsListPanel, true, DEFAULT_CONTROLS_DURATION,\n                AnimationType.SLIDE_AND_ALPHA);\n\n        @Nullable final PlayQueue playQueue = player.getPlayQueue();\n        if (playQueue != null) {\n            binding.itemsList.scrollToPosition(playQueue.getIndex());\n        }\n\n        updateQueueTime((int) player.getExoPlayer().getCurrentPosition());\n    }\n\n    private void buildQueue() {\n        binding.itemsList.setAdapter(playQueueAdapter);\n        binding.itemsList.setClickable(true);\n        binding.itemsList.setLongClickable(true);\n\n        binding.itemsList.clearOnScrollListeners();\n        binding.itemsList.addOnScrollListener(getQueueScrollListener());\n\n        itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());\n        itemTouchHelper.attachToRecyclerView(binding.itemsList);\n\n        playQueueAdapter.setSelectedListener(getOnSelectedListener());\n\n        binding.itemsListClose.setOnClickListener(view -> closeItemsList());\n    }\n\n    private void onSegmentsClicked() {\n        areSegmentsVisible = true;\n\n        hideSystemUIIfNeeded();\n        buildSegments();\n\n        binding.itemsListHeaderTitle.setVisibility(View.VISIBLE);\n        binding.itemsListHeaderDuration.setVisibility(View.GONE);\n        binding.shuffleButton.setVisibility(View.GONE);\n        binding.repeatButton.setVisibility(View.GONE);\n        binding.addToPlaylistButton.setVisibility(View.GONE);\n\n        hideControls(0, 0);\n        binding.itemsListPanel.requestFocus();\n        animate(binding.itemsListPanel, true, DEFAULT_CONTROLS_DURATION,\n                AnimationType.SLIDE_AND_ALPHA);\n\n        final int adapterPosition = getNearestStreamSegmentPosition(\n                player.getExoPlayer().getCurrentPosition());\n        segmentAdapter.selectSegmentAt(adapterPosition);\n        binding.itemsList.scrollToPosition(adapterPosition);\n    }\n\n    private void buildSegments() {\n        binding.itemsList.setAdapter(segmentAdapter);\n        binding.itemsList.setClickable(true);\n        binding.itemsList.setLongClickable(true);\n\n        binding.itemsList.clearOnScrollListeners();\n        if (itemTouchHelper != null) {\n            itemTouchHelper.attachToRecyclerView(null);\n        }\n\n        player.getCurrentStreamInfo().ifPresent(segmentAdapter::setItems);\n\n        binding.shuffleButton.setVisibility(View.GONE);\n        binding.repeatButton.setVisibility(View.GONE);\n        binding.addToPlaylistButton.setVisibility(View.GONE);\n        binding.itemsListClose.setOnClickListener(view -> closeItemsList());\n    }\n\n    public void closeItemsList() {\n        if (isQueueVisible || areSegmentsVisible) {\n            isQueueVisible = false;\n            areSegmentsVisible = false;\n\n            if (itemTouchHelper != null) {\n                itemTouchHelper.attachToRecyclerView(null);\n            }\n\n            animate(binding.itemsListPanel, false, DEFAULT_CONTROLS_DURATION,\n                    AnimationType.SLIDE_AND_ALPHA, 0, () ->\n                        // Even when queueLayout is GONE it receives touch events\n                        // and ruins normal behavior of the app. This line fixes it\n                        binding.itemsListPanel.setTranslationY(\n                                -binding.itemsListPanel.getHeight() * 5.0f));\n\n            // clear focus, otherwise a white rectangle remains on top of the player\n            binding.itemsListClose.clearFocus();\n            binding.playPauseButton.requestFocus();\n        }\n    }\n\n    private OnScrollBelowItemsListener getQueueScrollListener() {\n        return new OnScrollBelowItemsListener() {\n            @Override\n            public void onScrolledDown(final RecyclerView recyclerView) {\n                @Nullable final PlayQueue playQueue = player.getPlayQueue();\n                if (playQueue != null && !playQueue.isComplete()) {\n                    playQueue.fetch();\n                } else if (binding != null) {\n                    binding.itemsList.clearOnScrollListeners();\n                }\n            }\n        };\n    }\n\n    private StreamSegmentAdapter.StreamSegmentListener getStreamSegmentListener() {\n        return new StreamSegmentAdapter.StreamSegmentListener() {\n            @Override\n            public void onItemClick(@NonNull final StreamSegmentItem item, final int seconds) {\n                segmentAdapter.selectSegment(item);\n                player.seekTo(seconds * 1000L);\n                player.triggerProgressUpdate();\n            }\n\n            @Override\n            public void onItemLongClick(@NonNull final StreamSegmentItem item, final int seconds) {\n                @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata();\n                if (currentMetadata == null\n                        || currentMetadata.getServiceId() != YouTube.getServiceId()) {\n                    return;\n                }\n\n                final PlayQueueItem currentItem = player.getCurrentItem();\n                if (currentItem != null) {\n                    String videoUrl = player.getVideoUrl();\n                    videoUrl += (\"&t=\" + seconds);\n                    ShareUtils.shareText(context, currentItem.getTitle(),\n                            videoUrl, currentItem.getThumbnails());\n                }\n            }\n        };\n    }\n\n    private int getNearestStreamSegmentPosition(final long playbackPosition) {\n        final List<StreamSegment> segments = player.getCurrentStreamInfo()\n                .map(StreamInfo::getStreamSegments)\n                .orElse(Collections.emptyList());\n\n        int nearestPosition = 0;\n        for (final var segment : segments) {\n            if (segment.getStartTimeSeconds() * 1000L > playbackPosition) {\n                break;\n            }\n            nearestPosition++;\n        }\n        return Math.max(0, nearestPosition - 1);\n    }\n\n    private ItemTouchHelper.SimpleCallback getItemTouchCallback() {\n        return new PlayQueueItemTouchCallback() {\n            @Override\n            public void onMove(final int sourceIndex, final int targetIndex) {\n                @Nullable final PlayQueue playQueue = player.getPlayQueue();\n                if (playQueue != null) {\n                    playQueue.move(sourceIndex, targetIndex);\n                }\n            }\n\n            @Override\n            public void onSwiped(final int index) {\n                @Nullable final PlayQueue playQueue = player.getPlayQueue();\n                if (playQueue != null && index != -1) {\n                    playQueue.remove(index);\n                }\n            }\n        };\n    }\n\n    private PlayQueueItemBuilder.OnSelectedListener getOnSelectedListener() {\n        return new PlayQueueItemBuilder.OnSelectedListener() {\n            @Override\n            public void selected(final PlayQueueItem item, final View view) {\n                player.selectQueueItem(item);\n            }\n\n            @Override\n            public void held(final PlayQueueItem item, final View view) {\n                @Nullable final PlayQueue playQueue = player.getPlayQueue();\n                @Nullable final AppCompatActivity parentActivity = getParentActivity().orElse(null);\n                if (playQueue != null && parentActivity != null && playQueue.indexOf(item) != -1) {\n                    openPopupMenu(player.getPlayQueue(), item, view, true,\n                            parentActivity.getSupportFragmentManager(), context);\n                }\n            }\n\n            @Override\n            public void onStartDrag(final PlayQueueItemHolder viewHolder) {\n                if (itemTouchHelper != null) {\n                    itemTouchHelper.startDrag(viewHolder);\n                }\n            }\n        };\n    }\n\n    private void updateQueueTime(final int currentTime) {\n        @Nullable final PlayQueue playQueue = player.getPlayQueue();\n        if (playQueue == null) {\n            return;\n        }\n\n        final int currentStream = playQueue.getIndex();\n        final List<PlayQueueItem> streams = playQueue.getStreams();\n\n        final long before = streams.subList(0, currentStream).stream()\n                .collect(Collectors.summingLong(PlayQueueItem::getDuration)) * 1000;\n\n        final long after = streams.subList(currentStream, streams.size()).stream()\n                .collect(Collectors.summingLong(PlayQueueItem::getDuration)) * 1000;\n\n        binding.itemsListHeaderDuration.setText(\n                String.format(\"%s/%s\",\n                        getTimeString(currentTime + before),\n                        getTimeString(before + after)\n                ));\n    }\n\n    @Override\n    protected boolean isAnyListViewOpen() {\n        return isQueueVisible || areSegmentsVisible;\n    }\n\n    @Override\n    public boolean isFullscreen() {\n        return isFullscreen;\n    }\n\n    public boolean isVerticalVideo() {\n        return isVerticalVideo;\n    }\n\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Click listeners\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Click listeners\n\n    @Override\n    protected void onPlaybackSpeedClicked() {\n        getParentActivity().ifPresent(activity ->\n                PlaybackParameterDialog.newInstance(player.getPlaybackSpeed(),\n                                player.getPlaybackPitch(), player.getPlaybackSkipSilence(),\n                                player::setPlaybackParameters)\n                        .show(activity.getSupportFragmentManager(), null));\n    }\n\n    @Override\n    public boolean onKeyDown(final int keyCode) {\n        if (keyCode == KeyEvent.KEYCODE_SPACE && isFullscreen) {\n            player.playPause();\n            if (player.isPlaying()) {\n                hideControls(0, 0);\n            }\n            return true;\n        }\n        return super.onKeyDown(keyCode);\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Video size, orientation, fullscreen\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Video size, orientation, fullscreen\n\n    private void setupScreenRotationButton() {\n        binding.screenRotationButton.setVisibility(globalScreenOrientationLocked(context)\n                || isVerticalVideo || DeviceUtils.isTablet(context)\n                ? View.VISIBLE : View.GONE);\n        binding.screenRotationButton.setImageDrawable(AppCompatResources.getDrawable(context,\n                isFullscreen ? R.drawable.ic_fullscreen_exit\n                        : R.drawable.ic_fullscreen));\n    }\n\n    @Override\n    public void onVideoSizeChanged(@NonNull final VideoSize videoSize) {\n        super.onVideoSizeChanged(videoSize);\n        isVerticalVideo = videoSize.width < videoSize.height;\n\n        if (globalScreenOrientationLocked(context)\n                && isFullscreen\n                && isLandscape() == isVerticalVideo\n                && !DeviceUtils.isTv(context)\n                && !DeviceUtils.isTablet(context)) {\n            // set correct orientation\n            player.getFragmentListener().ifPresent(\n                    PlayerServiceEventListener::onScreenRotationButtonClicked);\n        }\n\n        setupScreenRotationButton();\n    }\n\n    public void toggleFullscreen() {\n        if (DEBUG) {\n            Log.d(TAG, \"toggleFullscreen() called\");\n        }\n        final PlayerServiceEventListener fragmentListener = player.getFragmentListener()\n                .orElse(null);\n        if (fragmentListener == null || player.exoPlayerIsNull()) {\n            return;\n        }\n\n        isFullscreen = !isFullscreen;\n        if (isFullscreen) {\n            // Android needs tens milliseconds to send new insets but a user is able to see\n            // how controls changes it's position from `0` to `nav bar height` padding.\n            // So just hide the controls to hide this visual inconsistency\n            hideControls(0, 0);\n        } else {\n            // Apply window insets because Android will not do it when orientation changes\n            // from landscape to portrait (open vertical video to reproduce)\n            binding.playbackControlRoot.setPadding(0, 0, 0, 0);\n        }\n        fragmentListener.onFullscreenStateChanged(isFullscreen);\n\n        binding.metadataView.setVisibility(isFullscreen ? View.VISIBLE : View.GONE);\n        binding.playerCloseButton.setVisibility(isFullscreen ? View.GONE : View.VISIBLE);\n        setupScreenRotationButton();\n    }\n\n    public void checkLandscape() {\n        // check if landscape is correct\n        final boolean videoInLandscapeButNotInFullscreen = isLandscape()\n                && !isFullscreen\n                && !player.isAudioOnly();\n        final boolean notPaused = player.getCurrentState() != STATE_COMPLETED\n                && player.getCurrentState() != STATE_PAUSED;\n\n        if (videoInLandscapeButNotInFullscreen\n                && notPaused\n                && !DeviceUtils.isTablet(context)) {\n            toggleFullscreen();\n        }\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Getters\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Getters\n\n    private Optional<Context> getParentContext() {\n        return Optional.ofNullable(binding.getRoot().getParent())\n                .filter(ViewGroup.class::isInstance)\n                .map(parent -> ((ViewGroup) parent).getContext());\n    }\n\n    public Optional<AppCompatActivity> getParentActivity() {\n        return getParentContext()\n                .filter(AppCompatActivity.class::isInstance)\n                .map(AppCompatActivity.class::cast);\n    }\n\n    public boolean isLandscape() {\n        // DisplayMetrics from activity context knows about MultiWindow feature\n        // while DisplayMetrics from app context doesn't\n        return DeviceUtils.isLandscape(getParentContext().orElse(player.getService()));\n    }\n    //endregion\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/ui/PlayerUi.java",
    "content": "package org.schabi.newpipe.player.ui;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.graphics.Bitmap;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.google.android.exoplayer2.PlaybackParameters;\nimport com.google.android.exoplayer2.Player.RepeatMode;\nimport com.google.android.exoplayer2.Tracks;\nimport com.google.android.exoplayer2.text.Cue;\nimport com.google.android.exoplayer2.video.VideoSize;\n\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.player.Player;\n\nimport java.util.List;\n\n/**\n * A player UI is a component that can seamlessly connect and disconnect from the {@link Player} and\n * provide a user interface of some sort. Try to extend this class instead of adding more code to\n * {@link Player}!\n */\npublic abstract class PlayerUi {\n\n    @NonNull protected final Context context;\n    @NonNull protected final Player player;\n\n    /**\n     * @param player the player instance that will be usable throughout the lifetime of this UI; its\n     *               context should already have been initialized\n     */\n    protected PlayerUi(@NonNull final Player player) {\n        this.context = player.getContext();\n        this.player = player;\n    }\n\n    /**\n     * @return the player instance this UI was constructed with\n     */\n    @NonNull\n    public Player getPlayer() {\n        return player;\n    }\n\n\n    /**\n     * Called after the player received an intent and processed it.\n     */\n    public void setupAfterIntent() {\n    }\n\n    /**\n     * Called right after the exoplayer instance is constructed, or right after this UI is\n     * constructed if the exoplayer is already available then. Note that the exoplayer instance\n     * could be built and destroyed multiple times during the lifetime of the player, so this method\n     * might be called multiple times.\n     */\n    public void initPlayer() {\n    }\n\n    /**\n     * Called when playback in the exoplayer is about to start, or right after this UI is\n     * constructed if the exoplayer and the play queue are already available then. The play queue\n     * will therefore always be not null.\n     */\n    public void initPlayback() {\n    }\n\n    /**\n     * Called when the exoplayer instance is about to be destroyed. Note that the exoplayer instance\n     * could be built and destroyed multiple times during the lifetime of the player, so this method\n     * might be called multiple times. Be sure to unset any video surface view or play queue\n     * listeners! This will also be called when this UI is being discarded, just before {@link\n     * #destroy()}.\n     */\n    public void destroyPlayer() {\n    }\n\n    /**\n     * Called when this UI is being discarded, either because the player is switching to a different\n     * UI or because the player is shutting down completely.\n     */\n    public void destroy() {\n    }\n\n    /**\n     * Called when the player is smooth-stopping, that is, transitioning smoothly to a new play\n     * queue after the user tapped on a new video stream while a stream was playing in the video\n     * detail fragment.\n     */\n    public void smoothStopForImmediateReusing() {\n    }\n\n    /**\n     * Called when the video detail fragment listener is connected with the player, or right after\n     * this UI is constructed if the listener is already connected then.\n     */\n    public void onFragmentListenerSet() {\n    }\n\n    /**\n     * Broadcasts that the player receives will also be notified to UIs here. If you want to\n     * register new broadcast actions to receive here, add them to {@link\n     * Player#setupBroadcastReceiver()}.\n     * @param intent the broadcast intent received by the player\n     */\n    public void onBroadcastReceived(final Intent intent) {\n    }\n\n    /**\n     * Called when stream progress (i.e. the current time in the seekbar) or stream duration change.\n     * Will surely be called every {@link Player#PROGRESS_LOOP_INTERVAL_MILLIS} while a stream is\n     * playing.\n     * @param currentProgress the current progress in milliseconds\n     * @param duration        the duration of the stream being played\n     * @param bufferPercent   the percentage of stream already buffered, see {@link\n     *                        com.google.android.exoplayer2.BasePlayer#getBufferedPercentage()}\n     */\n    public void onUpdateProgress(final int currentProgress,\n                                 final int duration,\n                                 final int bufferPercent) {\n    }\n\n    public void onPrepared() {\n    }\n\n    public void onBlocked() {\n    }\n\n    public void onPlaying() {\n    }\n\n    public void onBuffering() {\n    }\n\n    public void onPaused() {\n    }\n\n    public void onPausedSeek() {\n    }\n\n    public void onCompleted() {\n    }\n\n    public void onRepeatModeChanged(@RepeatMode final int repeatMode) {\n    }\n\n    public void onShuffleModeEnabledChanged(final boolean shuffleModeEnabled) {\n    }\n\n    public void onMuteUnmuteChanged(final boolean isMuted) {\n    }\n\n    /**\n     * @see com.google.android.exoplayer2.Player.Listener#onTracksChanged(Tracks)\n     * @param currentTracks the available tracks information\n     */\n    public void onTextTracksChanged(@NonNull final Tracks currentTracks) {\n    }\n\n    /**\n     * @see com.google.android.exoplayer2.Player.Listener#onPlaybackParametersChanged\n     * @param playbackParameters the new playback parameters\n     */\n    public void onPlaybackParametersChanged(@NonNull final PlaybackParameters playbackParameters) {\n    }\n\n    /**\n     * @see com.google.android.exoplayer2.Player.Listener#onRenderedFirstFrame\n     */\n    public void onRenderedFirstFrame() {\n    }\n\n    /**\n     * @see com.google.android.exoplayer2.text.TextOutput#onCues\n     * @param cues the cues to pass to the subtitle view\n     */\n    public void onCues(@NonNull final List<Cue> cues) {\n    }\n\n    /**\n     * Called when the stream being played changes.\n     * @param info the {@link StreamInfo} metadata object, along with data about the selected and\n     *             available video streams (to be used to build the resolution menus, for example)\n     */\n    public void onMetadataChanged(@NonNull final StreamInfo info) {\n    }\n\n    /**\n     * Called when the thumbnail for the current metadata was loaded.\n     * @param bitmap the thumbnail to process, or null if there is no thumbnail or there was an\n     *               error when loading the thumbnail\n     */\n    public void onThumbnailLoaded(@Nullable final Bitmap bitmap) {\n    }\n\n    /**\n     * Called when the play queue was edited: a stream was appended, moved or removed.\n     */\n    public void onPlayQueueEdited() {\n    }\n\n    /**\n     * @param videoSize the new video size, useful to set the surface aspect ratio\n     * @see com.google.android.exoplayer2.Player.Listener#onVideoSizeChanged\n     */\n    public void onVideoSizeChanged(@NonNull final VideoSize videoSize) {\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/ui/PlayerUiList.java",
    "content": "package org.schabi.newpipe.player.ui;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.function.Consumer;\n\npublic final class PlayerUiList {\n    final List<PlayerUi> playerUis = new ArrayList<>();\n\n    /**\n     * Creates a {@link PlayerUiList} starting with the provided player uis. The provided player uis\n     * will not be prepared like those passed to {@link #addAndPrepare(PlayerUi)}, because when\n     * the {@link PlayerUiList} constructor is called, the player is still not running and it\n     * wouldn't make sense to initialize uis then. Instead the player will initialize them by doing\n     * proper calls to {@link #call(Consumer)}.\n     *\n     * @param initialPlayerUis the player uis this list should start with; the order will be kept\n     */\n    public PlayerUiList(final PlayerUi... initialPlayerUis) {\n        playerUis.addAll(List.of(initialPlayerUis));\n    }\n\n    /**\n     * Adds the provided player ui to the list and calls on it the initialization functions that\n     * apply based on the current player state. The preparation step needs to be done since when UIs\n     * are removed and re-added, the player will not call e.g. initPlayer again since the exoplayer\n     * is already initialized, but we need to notify the newly built UI that the player is ready\n     * nonetheless.\n     * @param playerUi the player ui to prepare and add to the list; its {@link\n     *                 PlayerUi#getPlayer()} will be used to query information about the player\n     *                 state\n     */\n    public void addAndPrepare(final PlayerUi playerUi) {\n        if (playerUi.getPlayer().getFragmentListener().isPresent()) {\n            // make sure UIs know whether a service is connected or not\n            playerUi.onFragmentListenerSet();\n        }\n\n        if (!playerUi.getPlayer().exoPlayerIsNull()) {\n            playerUi.initPlayer();\n            if (playerUi.getPlayer().getPlayQueue() != null) {\n                playerUi.initPlayback();\n            }\n        }\n\n        playerUis.add(playerUi);\n    }\n\n    /**\n     * Destroys all matching player UIs and removes them from the list.\n     * @param playerUiType the class of the player UI to destroy; the {@link\n     *                     Class#isInstance(Object)} method will be used, so even subclasses will be\n     *                     destroyed and removed\n     * @param <T>          the class type parameter\n     */\n    public <T> void destroyAll(final Class<T> playerUiType) {\n        playerUis.stream()\n                .filter(playerUiType::isInstance)\n                .forEach(playerUi -> {\n                    playerUi.destroyPlayer();\n                    playerUi.destroy();\n                });\n        playerUis.removeIf(playerUiType::isInstance);\n    }\n\n    /**\n     * @param playerUiType the class of the player UI to return; the {@link\n     *                     Class#isInstance(Object)} method will be used, so even subclasses could\n     *                     be returned\n     * @param <T>          the class type parameter\n     * @return the first player UI of the required type found in the list, or an empty {@link\n     *         Optional} otherwise\n     */\n    public <T> Optional<T> get(final Class<T> playerUiType) {\n        return playerUis.stream()\n                .filter(playerUiType::isInstance)\n                .map(playerUiType::cast)\n                .findFirst();\n    }\n\n    /**\n     * Calls the provided consumer on all player UIs in the list, in order of addition.\n     * @param consumer the consumer to call with player UIs\n     */\n    public void call(final Consumer<PlayerUi> consumer) {\n        //noinspection SimplifyStreamApiCallChains\n        playerUis.stream().forEachOrdered(consumer);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java",
    "content": "package org.schabi.newpipe.player.ui;\n\nimport static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;\nimport static org.schabi.newpipe.MainActivity.DEBUG;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.getMinimumVideoHeight;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.res.Resources;\nimport android.graphics.Bitmap;\nimport android.graphics.PixelFormat;\nimport android.os.Build;\nimport android.util.DisplayMetrics;\nimport android.util.Log;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.WindowInsets;\nimport android.view.WindowManager;\nimport android.view.animation.AnticipateInterpolator;\nimport android.widget.LinearLayout;\n\nimport androidx.annotation.NonNull;\nimport androidx.core.content.ContextCompat;\nimport androidx.core.math.MathUtils;\n\nimport com.google.android.exoplayer2.ui.AspectRatioFrameLayout;\nimport com.google.android.exoplayer2.ui.SubtitleView;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.PlayerBinding;\nimport org.schabi.newpipe.databinding.PlayerPopupCloseOverlayBinding;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.gesture.BasePlayerGestureListener;\nimport org.schabi.newpipe.player.gesture.PopupPlayerGestureListener;\nimport org.schabi.newpipe.player.helper.PlayerHelper;\nimport org.schabi.newpipe.util.DeviceUtils;\n\npublic final class PopupPlayerUi extends VideoPlayerUi {\n    private static final String TAG = PopupPlayerUi.class.getSimpleName();\n\n    /**\n     * Maximum opacity allowed for Android 12 and higher to allow touches on other apps when using\n     * NewPipe's popup player.\n     *\n     * <p>\n     * This value is hardcoded instead of being get dynamically with the method linked of the\n     * constant documentation below, because it is not static and popup player layout parameters\n     * are generated with static methods.\n     * </p>\n     *\n     * @see WindowManager.LayoutParams#FLAG_NOT_TOUCHABLE\n     */\n    private static final float MAXIMUM_OPACITY_ALLOWED_FOR_S_AND_HIGHER = 0.8f;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Popup player\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private PlayerPopupCloseOverlayBinding closeOverlayBinding;\n\n    private boolean isPopupClosing = false;\n\n    private int screenWidth;\n    private int screenHeight;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Popup player window manager\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public static final int IDLE_WINDOW_FLAGS = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE\n            | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;\n    public static final int ONGOING_PLAYBACK_WINDOW_FLAGS = IDLE_WINDOW_FLAGS\n            | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;\n\n    private WindowManager.LayoutParams popupLayoutParams; // null if player is not popup\n    private final WindowManager windowManager;\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Constructor, setup, destroy\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Constructor, setup, destroy\n\n    public PopupPlayerUi(@NonNull final Player player,\n                         @NonNull final PlayerBinding playerBinding) {\n        super(player, playerBinding);\n        windowManager = ContextCompat.getSystemService(context, WindowManager.class);\n    }\n\n    @Override\n    public void setupAfterIntent() {\n        super.setupAfterIntent();\n        initPopup();\n        initPopupCloseOverlay();\n    }\n\n    @Override\n    BasePlayerGestureListener buildGestureListener() {\n        return new PopupPlayerGestureListener(this);\n    }\n\n    @SuppressLint(\"RtlHardcoded\")\n    private void initPopup() {\n        if (DEBUG) {\n            Log.d(TAG, \"initPopup() called\");\n        }\n\n        // Popup is already added to windowManager\n        if (popupHasParent()) {\n            return;\n        }\n\n        updateScreenSize();\n\n        popupLayoutParams = retrievePopupLayoutParamsFromPrefs();\n        binding.surfaceView.setHeights(popupLayoutParams.height, popupLayoutParams.height);\n\n        checkPopupPositionBounds();\n\n        binding.loadingPanel.setMinimumWidth(popupLayoutParams.width);\n        binding.loadingPanel.setMinimumHeight(popupLayoutParams.height);\n\n        windowManager.addView(binding.getRoot(), popupLayoutParams);\n        setupVideoSurfaceIfNeeded(); // now there is a parent, we can setup video surface\n\n        // Popup doesn't have aspectRatio selector, using FIT automatically\n        setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);\n    }\n\n    @SuppressLint(\"RtlHardcoded\")\n    private void initPopupCloseOverlay() {\n        if (DEBUG) {\n            Log.d(TAG, \"initPopupCloseOverlay() called\");\n        }\n\n        // closeOverlayView is already added to windowManager\n        if (closeOverlayBinding != null) {\n            return;\n        }\n\n        closeOverlayBinding = PlayerPopupCloseOverlayBinding.inflate(LayoutInflater.from(context));\n\n        final WindowManager.LayoutParams closeOverlayLayoutParams = buildCloseOverlayLayoutParams();\n        closeOverlayBinding.closeButton.setVisibility(View.GONE);\n        windowManager.addView(closeOverlayBinding.getRoot(), closeOverlayLayoutParams);\n    }\n\n    @Override\n    public void initPlayback() {\n        super.initPlayback();\n        // Make sure video and text tracks are enabled if the screen is turned on (which should\n        // always be the case), in the case user switched from background player to popup player\n        player.useVideoAndSubtitles(player.isScreenOn());\n    }\n\n    @Override\n    protected void setupElementsVisibility() {\n        binding.fullScreenButton.setVisibility(View.VISIBLE);\n        binding.screenRotationButton.setVisibility(View.GONE);\n        binding.resizeTextView.setVisibility(View.GONE);\n        binding.getRoot().findViewById(R.id.metadataView).setVisibility(View.GONE);\n        binding.queueButton.setVisibility(View.GONE);\n        binding.segmentsButton.setVisibility(View.GONE);\n        binding.moreOptionsButton.setVisibility(View.GONE);\n        binding.topControls.setOrientation(LinearLayout.HORIZONTAL);\n        binding.primaryControls.getLayoutParams().width = WRAP_CONTENT;\n        binding.secondaryControls.setAlpha(1.0f);\n        binding.secondaryControls.setVisibility(View.VISIBLE);\n        binding.secondaryControls.setTranslationY(0);\n        binding.share.setVisibility(View.GONE);\n        binding.playWithKodi.setVisibility(View.GONE);\n        binding.openInBrowser.setVisibility(View.GONE);\n        binding.switchMute.setVisibility(View.GONE);\n        binding.playerCloseButton.setVisibility(View.GONE);\n        binding.topControls.bringToFront();\n        binding.topControls.setClickable(false);\n        binding.topControls.setFocusable(false);\n        binding.bottomControls.bringToFront();\n        // Workaround that UI elements are pushed off screen\n        binding.audioTrackTextView.setMaxWidth(DeviceUtils.dpToPx(48, context));\n        super.setupElementsVisibility();\n    }\n\n    @Override\n    protected void setupElementsSize(final Resources resources) {\n        setupElementsSize(\n                0,\n                0,\n                resources.getDimensionPixelSize(R.dimen.player_popup_controls_padding),\n                resources.getDimensionPixelSize(R.dimen.player_popup_buttons_padding)\n        );\n    }\n\n    @Override\n    public void removeViewFromParent() {\n        // view was added by windowManager for popup player\n        windowManager.removeViewImmediate(binding.getRoot());\n    }\n\n    @Override\n    public void destroy() {\n        super.destroy();\n        removePopupFromView();\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Broadcast receiver\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Broadcast receiver\n\n    @Override\n    public void onBroadcastReceived(final Intent intent) {\n        super.onBroadcastReceived(intent);\n        if (Intent.ACTION_CONFIGURATION_CHANGED.equals(intent.getAction())) {\n            updateScreenSize();\n            changePopupSize(popupLayoutParams.width);\n            checkPopupPositionBounds();\n        } else if (player.isPlaying() || player.isLoading()) {\n            if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {\n                // Use only audio source when screen turns off while popup player is playing\n                player.useVideoAndSubtitles(false);\n            } else if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {\n                // Restore video source when screen turns on and user was watching video in popup\n                player.useVideoAndSubtitles(true);\n            }\n        }\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Popup position and size\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Popup position and size\n\n    /**\n     * Check if {@link #popupLayoutParams}' position is within a arbitrary boundary\n     * that goes from (0, 0) to (screenWidth, screenHeight).\n     * <p>\n     * If it's out of these boundaries, {@link #popupLayoutParams}' position is changed\n     * and {@code true} is returned to represent this change.\n     * </p>\n     */\n    public void checkPopupPositionBounds() {\n        if (DEBUG) {\n            Log.d(TAG, \"checkPopupPositionBounds() called with: \"\n                    + \"screenWidth = [\" + screenWidth + \"], \"\n                    + \"screenHeight = [\" + screenHeight + \"]\");\n        }\n        if (popupLayoutParams == null) {\n            return;\n        }\n\n        popupLayoutParams.x = MathUtils.clamp(popupLayoutParams.x, 0, screenWidth\n                - popupLayoutParams.width);\n        popupLayoutParams.y = MathUtils.clamp(popupLayoutParams.y, 0, screenHeight\n                - popupLayoutParams.height);\n    }\n\n    public void updateScreenSize() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {\n            final var windowMetrics = windowManager.getCurrentWindowMetrics();\n            final var bounds = windowMetrics.getBounds();\n            final var windowInsets = windowMetrics.getWindowInsets();\n            final var insets = windowInsets.getInsetsIgnoringVisibility(\n                    WindowInsets.Type.navigationBars() | WindowInsets.Type.displayCutout());\n            screenWidth = bounds.width() - (insets.left + insets.right);\n            screenHeight = bounds.height() - (insets.top + insets.bottom);\n        } else {\n            final DisplayMetrics metrics = new DisplayMetrics();\n            windowManager.getDefaultDisplay().getMetrics(metrics);\n            screenWidth = metrics.widthPixels;\n            screenHeight = metrics.heightPixels;\n        }\n        if (DEBUG) {\n            Log.d(TAG, \"updateScreenSize() called: screenWidth = [\"\n                    + screenWidth + \"], screenHeight = [\" + screenHeight + \"]\");\n        }\n    }\n\n    /**\n     * Changes the size of the popup based on the width.\n     * @param width the new width, height is calculated with\n     *              {@link PlayerHelper#getMinimumVideoHeight(float)}\n     */\n    public void changePopupSize(final int width) {\n        if (DEBUG) {\n            Log.d(TAG, \"changePopupSize() called with: width = [\" + width + \"]\");\n        }\n\n        if (anyPopupViewIsNull()) {\n            return;\n        }\n\n        final float minimumWidth = context.getResources().getDimension(R.dimen.popup_minimum_width);\n        final int actualWidth = MathUtils.clamp(width, (int) minimumWidth, screenWidth);\n        final int actualHeight = (int) getMinimumVideoHeight(width);\n        if (DEBUG) {\n            Log.d(TAG, \"updatePopupSize() updated values:\"\n                    + \"  width = [\" + actualWidth + \"], height = [\" + actualHeight + \"]\");\n        }\n\n        popupLayoutParams.width = actualWidth;\n        popupLayoutParams.height = actualHeight;\n        binding.surfaceView.setHeights(popupLayoutParams.height, popupLayoutParams.height);\n        windowManager.updateViewLayout(binding.getRoot(), popupLayoutParams);\n    }\n\n    @Override\n    protected float calculateMaxEndScreenThumbnailHeight(@NonNull final Bitmap bitmap) {\n        // no need for the end screen thumbnail to be resized on popup player: it's only needed\n        // for the main player so that it is enlarged correctly inside the fragment\n        return bitmap.getHeight();\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Popup closing\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Popup closing\n\n    public void closePopup() {\n        if (DEBUG) {\n            Log.d(TAG, \"closePopup() called, isPopupClosing = \" + isPopupClosing);\n        }\n        if (isPopupClosing) {\n            return;\n        }\n        isPopupClosing = true;\n\n        player.saveStreamProgressState();\n        windowManager.removeView(binding.getRoot());\n\n        animatePopupOverlayAndFinishService();\n    }\n\n    public boolean isPopupClosing() {\n        return isPopupClosing;\n    }\n\n    public void removePopupFromView() {\n        // wrap in try-catch since it could sometimes generate errors randomly\n        try {\n            if (popupHasParent()) {\n                windowManager.removeView(binding.getRoot());\n            }\n        } catch (final IllegalArgumentException e) {\n            Log.w(TAG, \"Failed to remove popup from window manager\", e);\n        }\n\n        try {\n            final boolean closeOverlayHasParent = closeOverlayBinding != null\n                    && closeOverlayBinding.getRoot().getParent() != null;\n            if (closeOverlayHasParent) {\n                windowManager.removeView(closeOverlayBinding.getRoot());\n            }\n        } catch (final IllegalArgumentException e) {\n            Log.w(TAG, \"Failed to remove popup overlay from window manager\", e);\n        }\n    }\n\n    private void animatePopupOverlayAndFinishService() {\n        final int targetTranslationY =\n                (int) (closeOverlayBinding.closeButton.getRootView().getHeight()\n                        - closeOverlayBinding.closeButton.getY());\n\n        closeOverlayBinding.closeButton.animate().setListener(null).cancel();\n        closeOverlayBinding.closeButton.animate()\n                .setInterpolator(new AnticipateInterpolator())\n                .translationY(targetTranslationY)\n                .setDuration(400)\n                .setListener(new AnimatorListenerAdapter() {\n                    @Override\n                    public void onAnimationCancel(final Animator animation) {\n                        end();\n                    }\n\n                    @Override\n                    public void onAnimationEnd(final Animator animation) {\n                        end();\n                    }\n\n                    private void end() {\n                        windowManager.removeView(closeOverlayBinding.getRoot());\n                        closeOverlayBinding = null;\n                        player.getService().destroyPlayerAndStopService();\n                    }\n                }).start();\n    }\n    //endregion\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playback states\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Playback states\n\n    private void changePopupWindowFlags(final int flags) {\n        if (DEBUG) {\n            Log.d(TAG, \"changePopupWindowFlags() called with: flags = [\" + flags + \"]\");\n        }\n\n        if (!anyPopupViewIsNull()) {\n            popupLayoutParams.flags = flags;\n            windowManager.updateViewLayout(binding.getRoot(), popupLayoutParams);\n        }\n    }\n\n    @Override\n    public void onPlaying() {\n        super.onPlaying();\n        changePopupWindowFlags(ONGOING_PLAYBACK_WINDOW_FLAGS);\n    }\n\n    @Override\n    public void onPaused() {\n        super.onPaused();\n        changePopupWindowFlags(IDLE_WINDOW_FLAGS);\n    }\n\n    @Override\n    public void onCompleted() {\n        super.onCompleted();\n        changePopupWindowFlags(IDLE_WINDOW_FLAGS);\n    }\n\n    @Override\n    protected void setupSubtitleView(final float captionScale) {\n        binding.subtitleView.setFractionalTextSize(\n                SubtitleView.DEFAULT_TEXT_SIZE_FRACTION * captionScale);\n    }\n\n    @Override\n    protected void onPlaybackSpeedClicked() {\n        playbackSpeedPopupMenu.show();\n        isSomePopupMenuVisible = true;\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Gestures\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Gestures\n\n    private int distanceFromCloseButton(@NonNull final MotionEvent popupMotionEvent) {\n        final int closeOverlayButtonX = closeOverlayBinding.closeButton.getLeft()\n                + closeOverlayBinding.closeButton.getWidth() / 2;\n        final int closeOverlayButtonY = closeOverlayBinding.closeButton.getTop()\n                + closeOverlayBinding.closeButton.getHeight() / 2;\n\n        final float fingerX = popupLayoutParams.x + popupMotionEvent.getX();\n        final float fingerY = popupLayoutParams.y + popupMotionEvent.getY();\n\n        return (int) Math.sqrt(Math.pow(closeOverlayButtonX - fingerX, 2)\n                + Math.pow(closeOverlayButtonY - fingerY, 2));\n    }\n\n    private float getClosingRadius() {\n        final int buttonRadius = closeOverlayBinding.closeButton.getWidth() / 2;\n        // 20% wider than the button itself\n        return buttonRadius * 1.2f;\n    }\n\n    public boolean isInsideClosingRadius(@NonNull final MotionEvent popupMotionEvent) {\n        return distanceFromCloseButton(popupMotionEvent) <= getClosingRadius();\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Popup & closing overlay layout params + saving popup position and size\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Popup & closing overlay layout params + saving popup position and size\n\n    /**\n     * {@code screenWidth} and {@code screenHeight} must have been initialized.\n     * @return the popup starting layout params\n     */\n    @SuppressLint(\"RtlHardcoded\")\n    public WindowManager.LayoutParams retrievePopupLayoutParamsFromPrefs() {\n        final SharedPreferences prefs = getPlayer().getPrefs();\n        final Context context = getPlayer().getContext();\n\n        final boolean popupRememberSizeAndPos = prefs.getBoolean(\n                context.getString(R.string.popup_remember_size_pos_key), true);\n        final float defaultSize = context.getResources().getDimension(R.dimen.popup_default_width);\n        final float popupWidth = popupRememberSizeAndPos\n                ? prefs.getFloat(context.getString(R.string.popup_saved_width_key), defaultSize)\n                : defaultSize;\n        final float popupHeight = getMinimumVideoHeight(popupWidth);\n\n        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(\n                (int) popupWidth, (int) popupHeight,\n                popupLayoutParamType(),\n                IDLE_WINDOW_FLAGS,\n                PixelFormat.TRANSLUCENT);\n        params.gravity = Gravity.LEFT | Gravity.TOP;\n        params.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;\n\n        final int centerX = (int) (screenWidth / 2f - popupWidth / 2f);\n        final int centerY = (int) (screenHeight / 2f - popupHeight / 2f);\n        params.x = popupRememberSizeAndPos\n                ? prefs.getInt(context.getString(R.string.popup_saved_x_key), centerX) : centerX;\n        params.y = popupRememberSizeAndPos\n                ? prefs.getInt(context.getString(R.string.popup_saved_y_key), centerY) : centerY;\n\n        return params;\n    }\n\n    public void savePopupPositionAndSizeToPrefs() {\n        if (getPopupLayoutParams() != null) {\n            final Context context = getPlayer().getContext();\n            getPlayer().getPrefs().edit()\n                    .putFloat(context.getString(R.string.popup_saved_width_key),\n                            popupLayoutParams.width)\n                    .putInt(context.getString(R.string.popup_saved_x_key),\n                            popupLayoutParams.x)\n                    .putInt(context.getString(R.string.popup_saved_y_key),\n                            popupLayoutParams.y)\n                    .apply();\n        }\n    }\n\n    @SuppressLint(\"RtlHardcoded\")\n    public static WindowManager.LayoutParams buildCloseOverlayLayoutParams() {\n        final int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE\n                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE\n                | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;\n\n        final WindowManager.LayoutParams closeOverlayLayoutParams = new WindowManager.LayoutParams(\n                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,\n                popupLayoutParamType(),\n                flags,\n                PixelFormat.TRANSLUCENT);\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n            // Setting maximum opacity allowed for touch events to other apps for Android 12 and\n            // higher to prevent non interaction when using other apps with the popup player\n            closeOverlayLayoutParams.alpha = MAXIMUM_OPACITY_ALLOWED_FOR_S_AND_HIGHER;\n        }\n\n        closeOverlayLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;\n        closeOverlayLayoutParams.softInputMode =\n                WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;\n        return closeOverlayLayoutParams;\n    }\n\n    public static int popupLayoutParamType() {\n        return Build.VERSION.SDK_INT < Build.VERSION_CODES.O\n                ? WindowManager.LayoutParams.TYPE_PHONE\n                : WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Getters\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Getters\n\n    private boolean popupHasParent() {\n        return binding != null\n                && binding.getRoot().getLayoutParams() instanceof WindowManager.LayoutParams\n                && binding.getRoot().getParent() != null;\n    }\n\n    private boolean anyPopupViewIsNull() {\n        return popupLayoutParams == null || windowManager == null\n                || binding.getRoot().getParent() == null;\n    }\n\n    public PlayerPopupCloseOverlayBinding getCloseOverlayBinding() {\n        return closeOverlayBinding;\n    }\n\n    public WindowManager.LayoutParams getPopupLayoutParams() {\n        return popupLayoutParams;\n    }\n\n    public WindowManager getWindowManager() {\n        return windowManager;\n    }\n\n    public int getScreenHeight() {\n        return screenHeight;\n    }\n\n    public int getScreenWidth() {\n        return screenWidth;\n    }\n    //endregion\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java",
    "content": "package org.schabi.newpipe.player.ui;\n\nimport static com.google.android.exoplayer2.Player.REPEAT_MODE_ALL;\nimport static com.google.android.exoplayer2.Player.REPEAT_MODE_ONE;\nimport static org.schabi.newpipe.MainActivity.DEBUG;\nimport static org.schabi.newpipe.ktx.ViewUtils.animate;\nimport static org.schabi.newpipe.ktx.ViewUtils.animateRotation;\nimport static org.schabi.newpipe.player.Player.RENDERER_UNAVAILABLE;\nimport static org.schabi.newpipe.player.Player.STATE_BUFFERING;\nimport static org.schabi.newpipe.player.Player.STATE_COMPLETED;\nimport static org.schabi.newpipe.player.Player.STATE_PAUSED;\nimport static org.schabi.newpipe.player.Player.STATE_PAUSED_SEEK;\nimport static org.schabi.newpipe.player.Player.STATE_PLAYING;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.formatSpeed;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.getTimeString;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.nextResizeModeAndSaveToPrefs;\nimport static org.schabi.newpipe.player.helper.PlayerHelper.retrieveSeekDurationFromPreferences;\n\nimport android.content.Intent;\nimport android.content.res.Resources;\nimport android.graphics.Bitmap;\nimport android.graphics.Color;\nimport android.graphics.PorterDuff;\nimport android.graphics.PorterDuffColorFilter;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.util.Log;\nimport android.view.GestureDetector;\nimport android.view.Gravity;\nimport android.view.KeyEvent;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.SeekBar;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.content.res.AppCompatResources;\nimport androidx.appcompat.view.ContextThemeWrapper;\nimport androidx.appcompat.widget.AppCompatImageButton;\nimport androidx.appcompat.widget.PopupMenu;\nimport androidx.core.graphics.BitmapCompat;\nimport androidx.core.graphics.Insets;\nimport androidx.core.math.MathUtils;\nimport androidx.core.view.ViewCompat;\nimport androidx.core.view.WindowInsetsCompat;\n\nimport com.google.android.exoplayer2.C;\nimport com.google.android.exoplayer2.ExoPlayer;\nimport com.google.android.exoplayer2.Format;\nimport com.google.android.exoplayer2.PlaybackParameters;\nimport com.google.android.exoplayer2.Player.RepeatMode;\nimport com.google.android.exoplayer2.Tracks;\nimport com.google.android.exoplayer2.text.Cue;\nimport com.google.android.exoplayer2.ui.AspectRatioFrameLayout;\nimport com.google.android.exoplayer2.ui.CaptionStyleCompat;\nimport com.google.android.exoplayer2.video.VideoSize;\n\nimport org.schabi.newpipe.App;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.PlayerBinding;\nimport org.schabi.newpipe.extractor.MediaFormat;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\nimport org.schabi.newpipe.fragments.detail.VideoDetailFragment;\nimport org.schabi.newpipe.ktx.AnimationType;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.gesture.BasePlayerGestureListener;\nimport org.schabi.newpipe.player.gesture.DisplayPortion;\nimport org.schabi.newpipe.player.helper.PlayerHelper;\nimport org.schabi.newpipe.player.mediaitem.MediaItemTag;\nimport org.schabi.newpipe.player.playback.SurfaceHolderCallback;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHelper;\nimport org.schabi.newpipe.player.seekbarpreview.SeekbarPreviewThumbnailHolder;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.external_communication.KoreUtils;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\nimport org.schabi.newpipe.views.player.PlayerFastSeekOverlay;\n\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\n\npublic abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBarChangeListener,\n        PopupMenu.OnMenuItemClickListener, PopupMenu.OnDismissListener {\n    private static final String TAG = VideoPlayerUi.class.getSimpleName();\n\n    // time constants\n    public static final long DEFAULT_CONTROLS_DURATION = 300; // 300 millis\n    public static final long DEFAULT_CONTROLS_HIDE_TIME = 2000;  // 2 Seconds\n    public static final long DPAD_CONTROLS_HIDE_TIME = 7000;  // 7 Seconds\n    public static final int SEEK_OVERLAY_DURATION = 450; // 450 millis\n\n    // other constants (TODO remove playback speeds and use normal menu for popup, too)\n    private static final float[] PLAYBACK_SPEEDS = {0.5f, 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f};\n\n    private enum PlayButtonAction {\n        PLAY, PAUSE, REPLAY\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Views\n    //////////////////////////////////////////////////////////////////////////*/\n\n    protected PlayerBinding binding;\n    private final Handler controlsVisibilityHandler = new Handler(Looper.getMainLooper());\n    @Nullable\n    private SurfaceHolderCallback surfaceHolderCallback;\n    boolean surfaceIsSetup = false;\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Popup menus (\"popup\" means that they pop up, not that they belong to the popup player)\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private static final int POPUP_MENU_ID_QUALITY = 69;\n    private static final int POPUP_MENU_ID_AUDIO_TRACK = 70;\n    private static final int POPUP_MENU_ID_PLAYBACK_SPEED = 79;\n    private static final int POPUP_MENU_ID_CAPTION = 89;\n\n    protected boolean isSomePopupMenuVisible = false;\n    private PopupMenu qualityPopupMenu;\n    private PopupMenu audioTrackPopupMenu;\n    protected PopupMenu playbackSpeedPopupMenu;\n    private PopupMenu captionPopupMenu;\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Gestures\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private GestureDetector gestureDetector;\n    private BasePlayerGestureListener playerGestureListener;\n    @Nullable\n    private View.OnLayoutChangeListener onLayoutChangeListener = null;\n\n    @NonNull\n    private final SeekbarPreviewThumbnailHolder seekbarPreviewThumbnailHolder =\n            new SeekbarPreviewThumbnailHolder();\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Constructor, setup, destroy\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Constructor, setup, destroy\n\n    protected VideoPlayerUi(@NonNull final Player player,\n                            @NonNull final PlayerBinding playerBinding) {\n        super(player);\n        binding = playerBinding;\n        setupFromView();\n    }\n\n    public void setupFromView() {\n        initViews();\n        initListeners();\n        setupPlayerSeekOverlay();\n    }\n\n    private void initViews() {\n        setupSubtitleView();\n\n        binding.resizeTextView\n                .setText(PlayerHelper.resizeTypeOf(context, binding.surfaceView.getResizeMode()));\n\n        binding.playbackSeekBar.getThumb()\n                .setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_IN));\n        binding.playbackSeekBar.getProgressDrawable()\n                .setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY));\n\n        final ContextThemeWrapper themeWrapper = new ContextThemeWrapper(context,\n                R.style.DarkPopupMenu);\n\n        qualityPopupMenu = new PopupMenu(themeWrapper, binding.qualityTextView);\n        audioTrackPopupMenu = new PopupMenu(themeWrapper, binding.audioTrackTextView);\n        playbackSpeedPopupMenu = new PopupMenu(context, binding.playbackSpeed);\n        captionPopupMenu = new PopupMenu(themeWrapper, binding.captionTextView);\n\n        binding.progressBarLoadingPanel.getIndeterminateDrawable()\n                .setColorFilter(new PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.MULTIPLY));\n\n        binding.titleTextView.setSelected(true);\n        binding.channelTextView.setSelected(true);\n\n        // Prevent hiding of bottom sheet via swipe inside queue\n        binding.itemsList.setNestedScrollingEnabled(false);\n    }\n\n    abstract BasePlayerGestureListener buildGestureListener();\n\n    protected void initListeners() {\n        binding.qualityTextView.setOnClickListener(makeOnClickListener(this::onQualityClicked));\n        binding.audioTrackTextView.setOnClickListener(\n                makeOnClickListener(this::onAudioTracksClicked));\n        binding.playbackSpeed.setOnClickListener(makeOnClickListener(this::onPlaybackSpeedClicked));\n\n        binding.playbackSeekBar.setOnSeekBarChangeListener(this);\n        binding.captionTextView.setOnClickListener(makeOnClickListener(this::onCaptionClicked));\n        binding.resizeTextView.setOnClickListener(makeOnClickListener(this::onResizeClicked));\n        binding.playbackLiveSync.setOnClickListener(makeOnClickListener(player::seekToDefault));\n\n        playerGestureListener = buildGestureListener();\n        gestureDetector = new GestureDetector(context, playerGestureListener);\n        binding.getRoot().setOnTouchListener(playerGestureListener);\n\n        binding.repeatButton.setOnClickListener(v -> onRepeatClicked());\n        binding.shuffleButton.setOnClickListener(v -> onShuffleClicked());\n\n        binding.playPauseButton.setOnClickListener(makeOnClickListener(player::playPause));\n        binding.playPreviousButton.setOnClickListener(makeOnClickListener(player::playPrevious));\n        binding.playNextButton.setOnClickListener(makeOnClickListener(player::playNext));\n\n        binding.moreOptionsButton.setOnClickListener(\n                makeOnClickListener(this::onMoreOptionsClicked));\n        binding.share.setOnClickListener(makeOnClickListener(() -> {\n            final PlayQueueItem currentItem = player.getCurrentItem();\n            if (currentItem != null) {\n                ShareUtils.shareText(context, currentItem.getTitle(),\n                        player.getVideoUrlAtCurrentTime(), currentItem.getThumbnails());\n            }\n        }));\n        binding.share.setOnLongClickListener(v -> {\n            ShareUtils.copyToClipboard(context, player.getVideoUrlAtCurrentTime());\n            return true;\n        });\n        binding.fullScreenButton.setOnClickListener(makeOnClickListener(() -> {\n            player.setRecovery();\n            NavigationHelper.playOnMainPlayer(context,\n                    Objects.requireNonNull(player.getPlayQueue()), true);\n        }));\n        binding.playWithKodi.setOnClickListener(makeOnClickListener(this::onPlayWithKodiClicked));\n        binding.openInBrowser.setOnClickListener(makeOnClickListener(this::onOpenInBrowserClicked));\n        binding.playerCloseButton.setOnClickListener(makeOnClickListener(() ->\n                // set package to this app's package to prevent the intent from being seen outside\n                context.sendBroadcast(new Intent(VideoDetailFragment.ACTION_HIDE_MAIN_PLAYER)\n                        .setPackage(App.PACKAGE_NAME))\n        ));\n        binding.switchMute.setOnClickListener(makeOnClickListener(player::toggleMute));\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.itemsListPanel, (view, windowInsets) -> {\n            final Insets cutout = windowInsets.getInsets(WindowInsetsCompat.Type.displayCutout());\n            if (!cutout.equals(Insets.NONE)) {\n                view.setPadding(cutout.left, cutout.top, cutout.right, cutout.bottom);\n            }\n            return windowInsets;\n        });\n\n        // PlaybackControlRoot already consumed window insets but we should pass them to\n        // player_overlays and fast_seek_overlay too. Without it they will be off-centered.\n        onLayoutChangeListener =\n                (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {\n                    binding.playerOverlays.setPadding(v.getPaddingLeft(), v.getPaddingTop(),\n                            v.getPaddingRight(), v.getPaddingBottom());\n\n                    // If we added padding to the fast seek overlay, too, it would not go under the\n                    // system ui. Instead we apply negative margins equal to the window insets of\n                    // the opposite side, so that the view covers all of the player (overflowing on\n                    // some sides) and its center coincides with the center of other controls.\n                    final RelativeLayout.LayoutParams fastSeekParams = (RelativeLayout.LayoutParams)\n                            binding.fastSeekOverlay.getLayoutParams();\n                    fastSeekParams.leftMargin = -v.getPaddingRight();\n                    fastSeekParams.topMargin = -v.getPaddingBottom();\n                    fastSeekParams.rightMargin = -v.getPaddingLeft();\n                    fastSeekParams.bottomMargin = -v.getPaddingTop();\n                };\n        binding.playbackControlRoot.addOnLayoutChangeListener(onLayoutChangeListener);\n    }\n\n    protected void deinitListeners() {\n        binding.qualityTextView.setOnClickListener(null);\n        binding.audioTrackTextView.setOnClickListener(null);\n        binding.playbackSpeed.setOnClickListener(null);\n        binding.playbackSeekBar.setOnSeekBarChangeListener(null);\n        binding.captionTextView.setOnClickListener(null);\n        binding.resizeTextView.setOnClickListener(null);\n        binding.playbackLiveSync.setOnClickListener(null);\n\n        binding.getRoot().setOnTouchListener(null);\n        playerGestureListener = null;\n        gestureDetector = null;\n\n        binding.repeatButton.setOnClickListener(null);\n        binding.shuffleButton.setOnClickListener(null);\n\n        binding.playPauseButton.setOnClickListener(null);\n        binding.playPreviousButton.setOnClickListener(null);\n        binding.playNextButton.setOnClickListener(null);\n\n        binding.moreOptionsButton.setOnClickListener(null);\n        binding.moreOptionsButton.setOnLongClickListener(null);\n        binding.share.setOnClickListener(null);\n        binding.share.setOnLongClickListener(null);\n        binding.fullScreenButton.setOnClickListener(null);\n        binding.screenRotationButton.setOnClickListener(null);\n        binding.playWithKodi.setOnClickListener(null);\n        binding.openInBrowser.setOnClickListener(null);\n        binding.playerCloseButton.setOnClickListener(null);\n        binding.switchMute.setOnClickListener(null);\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.itemsListPanel, null);\n\n        binding.playbackControlRoot.removeOnLayoutChangeListener(onLayoutChangeListener);\n    }\n\n    /**\n     * Initializes the Fast-For/Backward overlay.\n     */\n    private void setupPlayerSeekOverlay() {\n        binding.fastSeekOverlay\n                .seekSecondsSupplier(() -> retrieveSeekDurationFromPreferences(player) / 1000)\n                .performListener(new PlayerFastSeekOverlay.PerformListener() {\n\n                    @Override\n                    public void onDoubleTap() {\n                        animate(binding.fastSeekOverlay, true, SEEK_OVERLAY_DURATION);\n                    }\n\n                    @Override\n                    public void onDoubleTapEnd() {\n                        animate(binding.fastSeekOverlay, false, SEEK_OVERLAY_DURATION);\n                    }\n\n                    @NonNull\n                    @Override\n                    public FastSeekDirection getFastSeekDirection(\n                            @NonNull final DisplayPortion portion\n                    ) {\n                        if (player.exoPlayerIsNull()) {\n                            // Abort seeking\n                            playerGestureListener.endMultiDoubleTap();\n                            return FastSeekDirection.NONE;\n                        }\n                        if (portion == DisplayPortion.LEFT) {\n                            // Check if it's possible to rewind\n                            // Small puffer to eliminate infinite rewind seeking\n                            if (player.getExoPlayer().getCurrentPosition() < 500L) {\n                                return FastSeekDirection.NONE;\n                            }\n                            return FastSeekDirection.BACKWARD;\n                        } else if (portion == DisplayPortion.RIGHT) {\n                            // Check if it's possible to fast-forward\n                            if (player.getCurrentState() == STATE_COMPLETED\n                                    || player.getExoPlayer().getCurrentPosition()\n                                    >= player.getExoPlayer().getDuration()) {\n                                return FastSeekDirection.NONE;\n                            }\n                            return FastSeekDirection.FORWARD;\n                        }\n                        /* portion == DisplayPortion.MIDDLE */\n                        return FastSeekDirection.NONE;\n                    }\n\n                    @Override\n                    public void seek(final boolean forward) {\n                        playerGestureListener.keepInDoubleTapMode();\n                        if (forward) {\n                            player.fastForward();\n                        } else {\n                            player.fastRewind();\n                        }\n                    }\n                });\n        playerGestureListener.doubleTapControls(binding.fastSeekOverlay);\n    }\n\n    public void deinitPlayerSeekOverlay() {\n        binding.fastSeekOverlay\n                .seekSecondsSupplier(null)\n                .performListener(null);\n    }\n\n    @Override\n    public void setupAfterIntent() {\n        super.setupAfterIntent();\n        setupElementsVisibility();\n        setupElementsSize(context.getResources());\n        binding.getRoot().setVisibility(View.VISIBLE);\n        binding.playPauseButton.requestFocus();\n    }\n\n    @Override\n    public void initPlayer() {\n        super.initPlayer();\n        setupVideoSurfaceIfNeeded();\n    }\n\n    @Override\n    public void initPlayback() {\n        super.initPlayback();\n\n        // #6825 - Ensure that the shuffle-button is in the correct state on the UI\n        setShuffleButton(player.getExoPlayer().getShuffleModeEnabled());\n    }\n\n    public abstract void removeViewFromParent();\n\n    @Override\n    public void destroyPlayer() {\n        super.destroyPlayer();\n        clearVideoSurface();\n    }\n\n    @Override\n    public void destroy() {\n        super.destroy();\n        binding.endScreen.setImageDrawable(null);\n        deinitPlayerSeekOverlay();\n        deinitListeners();\n    }\n\n    protected void setupElementsVisibility() {\n        setMuteButton(player.isMuted());\n        animateRotation(binding.moreOptionsButton, DEFAULT_CONTROLS_DURATION, 0);\n    }\n\n    protected abstract void setupElementsSize(Resources resources);\n\n    protected void setupElementsSize(final int buttonsMinWidth,\n                                     final int playerTopPad,\n                                     final int controlsPad,\n                                     final int buttonsPad) {\n        binding.topControls.setPaddingRelative(controlsPad, playerTopPad, controlsPad, 0);\n        binding.bottomControls.setPaddingRelative(controlsPad, 0, controlsPad, 0);\n        binding.qualityTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad);\n        binding.audioTrackTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad);\n        binding.playbackSpeed.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad);\n        binding.playbackSpeed.setMinimumWidth(buttonsMinWidth);\n        binding.captionTextView.setPadding(buttonsPad, buttonsPad, buttonsPad, buttonsPad);\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Broadcast receiver\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Broadcast receiver\n\n    @Override\n    public void onBroadcastReceived(final Intent intent) {\n        super.onBroadcastReceived(intent);\n        if (Intent.ACTION_CONFIGURATION_CHANGED.equals(intent.getAction())) {\n            // When the orientation changes, the screen height might be smaller. If the end screen\n            // thumbnail is not re-scaled, it can be larger than the current screen height and thus\n            // enlarging the whole player. This causes the seekbar to be out of the visible area.\n            updateEndScreenThumbnail(player.getThumbnail());\n        }\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Thumbnail\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Thumbnail\n\n    /**\n     * Scale the player audio / end screen thumbnail down if necessary.\n     * <p>\n     * This is necessary when the thumbnail's height is larger than the device's height\n     * and thus is enlarging the player's height\n     * causing the bottom playback controls to be out of the visible screen.\n     * </p>\n     */\n    @Override\n    public void onThumbnailLoaded(@Nullable final Bitmap bitmap) {\n        super.onThumbnailLoaded(bitmap);\n        updateEndScreenThumbnail(bitmap);\n    }\n\n    private void updateEndScreenThumbnail(@Nullable final Bitmap thumbnail) {\n        if (thumbnail == null) {\n            // remove end screen thumbnail\n            binding.endScreen.setImageDrawable(null);\n            return;\n        }\n\n        final float endScreenHeight = calculateMaxEndScreenThumbnailHeight(thumbnail);\n        final Bitmap endScreenBitmap = BitmapCompat.createScaledBitmap(\n                thumbnail,\n                (int) (thumbnail.getWidth() / (thumbnail.getHeight() / endScreenHeight)),\n                (int) endScreenHeight,\n                null,\n                true);\n\n        if (DEBUG) {\n            Log.d(TAG, \"Thumbnail - onThumbnailLoaded() called with: \"\n                    + \"currentThumbnail = [\" + thumbnail + \"], \"\n                    + thumbnail.getWidth() + \"x\" + thumbnail.getHeight()\n                    + \", scaled end screen height = \" + endScreenHeight\n                    + \", scaled end screen width = \" + endScreenBitmap.getWidth());\n        }\n\n        binding.endScreen.setImageBitmap(endScreenBitmap);\n    }\n\n    protected abstract float calculateMaxEndScreenThumbnailHeight(@NonNull Bitmap bitmap);\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Progress loop and updates\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Progress loop and updates\n\n    @Override\n    public void onUpdateProgress(final int currentProgress,\n                                 final int duration,\n                                 final int bufferPercent) {\n\n        if (duration != binding.playbackSeekBar.getMax()) {\n            setVideoDurationToControls(duration);\n        }\n        if (player.getCurrentState() != STATE_PAUSED) {\n            updatePlayBackElementsCurrentDuration(currentProgress);\n        }\n        if (player.isLoading() || bufferPercent > 90) {\n            binding.playbackSeekBar.setSecondaryProgress(\n                    (int) (binding.playbackSeekBar.getMax() * ((float) bufferPercent / 100)));\n        }\n        if (DEBUG && bufferPercent % 20 == 0) { //Limit log\n            Log.d(TAG, \"notifyProgressUpdateToListeners() called with: \"\n                    + \"isVisible = \" + isControlsVisible() + \", \"\n                    + \"currentProgress = [\" + currentProgress + \"], \"\n                    + \"duration = [\" + duration + \"], bufferPercent = [\" + bufferPercent + \"]\");\n        }\n        binding.playbackLiveSync.setClickable(!player.isLiveEdge());\n    }\n\n    /**\n     * Sets the current duration into the corresponding elements.\n     *\n     * @param currentProgress the current progress, in milliseconds\n     */\n    private void updatePlayBackElementsCurrentDuration(final int currentProgress) {\n        // Don't set seekbar progress while user is seeking\n        if (player.getCurrentState() != STATE_PAUSED_SEEK) {\n            binding.playbackSeekBar.setProgress(currentProgress);\n        }\n        binding.playbackCurrentTime.setText(getTimeString(currentProgress));\n    }\n\n    /**\n     * Sets the video duration time into all control components (e.g. seekbar).\n     *\n     * @param duration the video duration, in milliseconds\n     */\n    private void setVideoDurationToControls(final int duration) {\n        binding.playbackEndTime.setText(getTimeString(duration));\n\n        binding.playbackSeekBar.setMax(duration);\n        // This is important for Android TVs otherwise it would apply the default from\n        // setMax/Min methods which is (max - min) / 20\n        binding.playbackSeekBar.setKeyProgressIncrement(\n                PlayerHelper.retrieveSeekDurationFromPreferences(player));\n    }\n\n    @Override // seekbar listener\n    public void onProgressChanged(final SeekBar seekBar, final int progress,\n                                  final boolean fromUser) {\n        // Currently we don't need method execution when fromUser is false\n        if (!fromUser) {\n            return;\n        }\n        if (DEBUG) {\n            Log.d(TAG, \"onProgressChanged() called with: \"\n                    + \"seekBar = [\" + seekBar + \"], progress = [\" + progress + \"]\");\n        }\n\n        binding.currentDisplaySeek.setText(getTimeString(progress));\n\n        // Seekbar Preview Thumbnail\n        SeekbarPreviewThumbnailHelper\n                .tryResizeAndSetSeekbarPreviewThumbnail(\n                        player.getContext(),\n                        seekbarPreviewThumbnailHolder.getBitmapAt(progress).orElse(null),\n                        binding.currentSeekbarPreviewThumbnail,\n                        binding.subtitleView::getWidth);\n\n        adjustSeekbarPreviewContainer();\n    }\n\n\n    private void adjustSeekbarPreviewContainer() {\n        try {\n            // Should only be required when an error occurred before\n            // and the layout was positioned in the center\n            binding.bottomSeekbarPreviewLayout.setGravity(Gravity.NO_GRAVITY);\n\n            // Calculate the current left position of seekbar progress in px\n            // More info: https://stackoverflow.com/q/20493577\n            final int currentSeekbarLeft =\n                    binding.playbackSeekBar.getLeft()\n                            + binding.playbackSeekBar.getPaddingLeft()\n                            + binding.playbackSeekBar.getThumb().getBounds().left;\n\n            // Calculate the (unchecked) left position of the container\n            final int uncheckedContainerLeft =\n                    currentSeekbarLeft - (binding.seekbarPreviewContainer.getWidth() / 2);\n\n            // Fix the position so it's within the boundaries\n            final int checkedContainerLeft = MathUtils.clamp(uncheckedContainerLeft,\n                    0, binding.playbackWindowRoot.getWidth()\n                            - binding.seekbarPreviewContainer.getWidth());\n\n            // See also: https://stackoverflow.com/a/23249734\n            final LinearLayout.LayoutParams params =\n                    new LinearLayout.LayoutParams(\n                            binding.seekbarPreviewContainer.getLayoutParams());\n            params.setMarginStart(checkedContainerLeft);\n            binding.seekbarPreviewContainer.setLayoutParams(params);\n        } catch (final Exception ex) {\n            Log.e(TAG, \"Failed to adjust seekbarPreviewContainer\", ex);\n            // Fallback - position in the middle\n            binding.bottomSeekbarPreviewLayout.setGravity(Gravity.CENTER);\n        }\n    }\n\n    @Override // seekbar listener\n    public void onStartTrackingTouch(final SeekBar seekBar) {\n        if (DEBUG) {\n            Log.d(TAG, \"onStartTrackingTouch() called with: seekBar = [\" + seekBar + \"]\");\n        }\n        if (player.getCurrentState() != STATE_PAUSED_SEEK) {\n            player.changeState(STATE_PAUSED_SEEK);\n        }\n\n        showControls(0);\n        animate(binding.currentDisplaySeek, true, DEFAULT_CONTROLS_DURATION,\n                AnimationType.SCALE_AND_ALPHA);\n        animate(binding.currentSeekbarPreviewThumbnail, true, DEFAULT_CONTROLS_DURATION,\n                AnimationType.SCALE_AND_ALPHA);\n    }\n\n    @Override // seekbar listener\n    public void onStopTrackingTouch(final SeekBar seekBar) {\n        if (DEBUG) {\n            Log.d(TAG, \"onStopTrackingTouch() called with: seekBar = [\" + seekBar + \"]\");\n        }\n\n        player.seekTo(seekBar.getProgress());\n        if (player.getExoPlayer().getDuration() == seekBar.getProgress()) {\n            player.getExoPlayer().play();\n        }\n\n        binding.playbackCurrentTime.setText(getTimeString(seekBar.getProgress()));\n        animate(binding.currentDisplaySeek, false, 200, AnimationType.SCALE_AND_ALPHA);\n        animate(binding.currentSeekbarPreviewThumbnail, false, 200, AnimationType.SCALE_AND_ALPHA);\n\n        if (player.getCurrentState() == STATE_PAUSED_SEEK) {\n            player.changeState(STATE_BUFFERING);\n        }\n        if (!player.isProgressLoopRunning()) {\n            player.startProgressLoop();\n        }\n\n        showControlsThenHide();\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Controls showing / hiding\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Controls showing / hiding\n\n    public boolean isControlsVisible() {\n        return binding != null && binding.playbackControlRoot.getVisibility() == View.VISIBLE;\n    }\n\n    public void showControlsThenHide() {\n        if (DEBUG) {\n            Log.d(TAG, \"showControlsThenHide() called\");\n        }\n\n        showOrHideButtons();\n        showSystemUIPartially();\n\n        final long hideTime = binding.playbackControlRoot.isInTouchMode()\n                ? DEFAULT_CONTROLS_HIDE_TIME\n                : DPAD_CONTROLS_HIDE_TIME;\n\n        showHideShadow(true, DEFAULT_CONTROLS_DURATION);\n        animate(binding.playbackControlRoot, true, DEFAULT_CONTROLS_DURATION,\n                AnimationType.ALPHA, 0, () -> hideControls(DEFAULT_CONTROLS_DURATION, hideTime));\n    }\n\n    public void showControls(final long duration) {\n        if (DEBUG) {\n            Log.d(TAG, \"showControls() called\");\n        }\n        showOrHideButtons();\n        showSystemUIPartially();\n        controlsVisibilityHandler.removeCallbacksAndMessages(null);\n        showHideShadow(true, duration);\n        animate(binding.playbackControlRoot, true, duration);\n    }\n\n    public void hideControls(final long duration, final long delay) {\n        if (DEBUG) {\n            Log.d(TAG, \"hideControls() called with: duration = [\" + duration\n                    + \"], delay = [\" + delay + \"]\");\n        }\n\n        showOrHideButtons();\n\n        controlsVisibilityHandler.removeCallbacksAndMessages(null);\n        controlsVisibilityHandler.postDelayed(() -> {\n            showHideShadow(false, duration);\n            animate(binding.playbackControlRoot, false, duration, AnimationType.ALPHA,\n                    0, this::hideSystemUIIfNeeded);\n        }, delay);\n    }\n\n    public void showHideShadow(final boolean show, final long duration) {\n        animate(binding.playbackControlsShadow, show, duration, AnimationType.ALPHA, 0, null);\n        animate(binding.playerTopShadow, show, duration, AnimationType.ALPHA, 0, null);\n        animate(binding.playerBottomShadow, show, duration, AnimationType.ALPHA, 0, null);\n    }\n\n    protected void showOrHideButtons() {\n        @Nullable final PlayQueue playQueue = player.getPlayQueue();\n        if (playQueue == null) {\n            return;\n        }\n\n        final boolean showPrev = playQueue.getIndex() != 0;\n        final boolean showNext = playQueue.getIndex() + 1 != playQueue.getStreams().size();\n\n        binding.playPreviousButton.setVisibility(showPrev ? View.VISIBLE : View.INVISIBLE);\n        binding.playPreviousButton.setAlpha(showPrev ? 1.0f : 0.0f);\n        binding.playNextButton.setVisibility(showNext ? View.VISIBLE : View.INVISIBLE);\n        binding.playNextButton.setAlpha(showNext ? 1.0f : 0.0f);\n    }\n\n    protected void showSystemUIPartially() {\n        // system UI is really changed only by MainPlayerUi, so overridden there\n    }\n\n    protected void hideSystemUIIfNeeded() {\n        // system UI is really changed only by MainPlayerUi, so overridden there\n    }\n\n    protected boolean isAnyListViewOpen() {\n        // only MainPlayerUi has list views for the queue and for segments, so overridden there\n        return false;\n    }\n\n    public boolean isFullscreen() {\n        // only MainPlayerUi can be in fullscreen, so overridden there\n        return false;\n    }\n\n    /**\n     * Update the play/pause button ({@link R.id.playPauseButton}) to reflect the action\n     * that will be performed when the button is clicked..\n     * @param action the action that is performed when the play/pause button is clicked\n     */\n    private void updatePlayPauseButton(final PlayButtonAction action) {\n        final AppCompatImageButton button = binding.playPauseButton;\n        switch (action) {\n            case PLAY:\n                button.setContentDescription(context.getString(R.string.play));\n                button.setImageResource(R.drawable.ic_play_arrow);\n                break;\n            case PAUSE:\n                button.setContentDescription(context.getString(R.string.pause));\n                button.setImageResource(R.drawable.ic_pause);\n                break;\n            case REPLAY:\n                button.setContentDescription(context.getString(R.string.replay));\n                button.setImageResource(R.drawable.ic_replay);\n                break;\n        }\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Playback states\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Playback states\n\n    @Override\n    public void onPrepared() {\n        super.onPrepared();\n        setVideoDurationToControls((int) player.getExoPlayer().getDuration());\n        binding.playbackSpeed.setText(formatSpeed(player.getPlaybackSpeed()));\n    }\n\n    @Override\n    public void onBlocked() {\n        super.onBlocked();\n\n        // if we are e.g. switching players, hide controls\n        hideControls(DEFAULT_CONTROLS_DURATION, 0);\n\n        binding.playbackSeekBar.setEnabled(false);\n        binding.playbackSeekBar.getThumb()\n                .setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_IN));\n\n        binding.loadingPanel.setBackgroundColor(Color.BLACK);\n        animate(binding.loadingPanel, true, 0);\n        animate(binding.surfaceForeground, true, 100);\n\n        updatePlayPauseButton(PlayButtonAction.PLAY);\n        animatePlayButtons(false, 100);\n        binding.getRoot().setKeepScreenOn(false);\n    }\n\n    @Override\n    public void onPlaying() {\n        super.onPlaying();\n\n        updateStreamRelatedViews();\n\n        binding.playbackSeekBar.setEnabled(true);\n        binding.playbackSeekBar.getThumb()\n                .setColorFilter(new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_IN));\n\n        binding.loadingPanel.setVisibility(View.GONE);\n\n        animate(binding.currentDisplaySeek, false, 200, AnimationType.SCALE_AND_ALPHA);\n\n        animate(binding.playPauseButton, false, 80, AnimationType.SCALE_AND_ALPHA, 0,\n                () -> {\n                    updatePlayPauseButton(PlayButtonAction.PAUSE);\n                    animatePlayButtons(true, 200);\n                    if (!isAnyListViewOpen()) {\n                        binding.playPauseButton.requestFocus();\n                    }\n                });\n\n        binding.getRoot().setKeepScreenOn(true);\n    }\n\n    @Override\n    public void onBuffering() {\n        super.onBuffering();\n        binding.loadingPanel.setBackgroundColor(Color.TRANSPARENT);\n        binding.loadingPanel.setVisibility(View.VISIBLE);\n        binding.getRoot().setKeepScreenOn(true);\n    }\n\n    @Override\n    public void onPaused() {\n        super.onPaused();\n\n        // Don't let UI elements popup during double tap seeking. This state is entered sometimes\n        // during seeking/loading. This if-else check ensures that the controls aren't popping up.\n        if (!playerGestureListener.isDoubleTapping()) {\n            showControls(400);\n            binding.loadingPanel.setVisibility(View.GONE);\n\n            animate(binding.playPauseButton, false, 80, AnimationType.SCALE_AND_ALPHA, 0,\n                    () -> {\n                        updatePlayPauseButton(PlayButtonAction.PLAY);\n                        animatePlayButtons(true, 200);\n                        if (!isAnyListViewOpen()) {\n                            binding.playPauseButton.requestFocus();\n                        }\n                    });\n        }\n\n        binding.getRoot().setKeepScreenOn(false);\n    }\n\n    @Override\n    public void onPausedSeek() {\n        super.onPausedSeek();\n        animatePlayButtons(false, 100);\n        binding.getRoot().setKeepScreenOn(true);\n    }\n\n    @Override\n    public void onCompleted() {\n        super.onCompleted();\n\n        animate(binding.playPauseButton, false, 0, AnimationType.SCALE_AND_ALPHA, 0,\n                () -> {\n                    updatePlayPauseButton(PlayButtonAction.REPLAY);\n                    animatePlayButtons(true, DEFAULT_CONTROLS_DURATION);\n                });\n\n        binding.getRoot().setKeepScreenOn(false);\n\n        // When a (short) video ends the elements have to display the correct values - see #6180\n        updatePlayBackElementsCurrentDuration(binding.playbackSeekBar.getMax());\n\n        showControls(500);\n        animate(binding.currentDisplaySeek, false, 200, AnimationType.SCALE_AND_ALPHA);\n        binding.loadingPanel.setVisibility(View.GONE);\n        animate(binding.surfaceForeground, true, 100);\n    }\n\n    private void animatePlayButtons(final boolean show, final long duration) {\n        animate(binding.playPauseButton, show, duration, AnimationType.SCALE_AND_ALPHA);\n\n        @Nullable final PlayQueue playQueue = player.getPlayQueue();\n        if (playQueue == null) {\n            return;\n        }\n\n        if (!show || playQueue.getIndex() > 0) {\n            animate(\n                    binding.playPreviousButton,\n                    show,\n                    duration,\n                    AnimationType.SCALE_AND_ALPHA);\n        }\n        if (!show || playQueue.getIndex() + 1 < playQueue.getStreams().size()) {\n            animate(\n                    binding.playNextButton,\n                    show,\n                    duration,\n                    AnimationType.SCALE_AND_ALPHA);\n        }\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Repeat, shuffle, mute\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Repeat, shuffle, mute\n\n    public void onRepeatClicked() {\n        if (DEBUG) {\n            Log.d(TAG, \"onRepeatClicked() called\");\n        }\n        player.cycleNextRepeatMode();\n    }\n\n    public void onShuffleClicked() {\n        if (DEBUG) {\n            Log.d(TAG, \"onShuffleClicked() called\");\n        }\n        player.toggleShuffleModeEnabled();\n    }\n\n    @Override\n    public void onRepeatModeChanged(@RepeatMode final int repeatMode) {\n        super.onRepeatModeChanged(repeatMode);\n\n        if (repeatMode == REPEAT_MODE_ALL) {\n            binding.repeatButton.setImageResource(\n                    com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_all);\n        } else if (repeatMode == REPEAT_MODE_ONE) {\n            binding.repeatButton.setImageResource(\n                    com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_one);\n        } else /* repeatMode == REPEAT_MODE_OFF */ {\n            binding.repeatButton.setImageResource(\n                    com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_off);\n        }\n    }\n\n    @Override\n    public void onShuffleModeEnabledChanged(final boolean shuffleModeEnabled) {\n        super.onShuffleModeEnabledChanged(shuffleModeEnabled);\n        setShuffleButton(shuffleModeEnabled);\n    }\n\n    @Override\n    public void onMuteUnmuteChanged(final boolean isMuted) {\n        super.onMuteUnmuteChanged(isMuted);\n        setMuteButton(isMuted);\n    }\n\n    private void setMuteButton(final boolean isMuted) {\n        binding.switchMute.setImageDrawable(AppCompatResources.getDrawable(context, isMuted\n                ? R.drawable.ic_volume_off : R.drawable.ic_volume_up));\n    }\n\n    private void setShuffleButton(final boolean shuffled) {\n        binding.shuffleButton.setImageAlpha(shuffled ? 255 : 77);\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Other player listeners\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Other player listeners\n\n    @Override\n    public void onPlaybackParametersChanged(@NonNull final PlaybackParameters playbackParameters) {\n        super.onPlaybackParametersChanged(playbackParameters);\n        binding.playbackSpeed.setText(formatSpeed(playbackParameters.speed));\n    }\n\n    @Override\n    public void onRenderedFirstFrame() {\n        super.onRenderedFirstFrame();\n        //TODO check if this causes black screen when switching to fullscreen\n        animate(binding.surfaceForeground, false, DEFAULT_CONTROLS_DURATION);\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Metadata & stream related views\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Metadata & stream related views\n\n    @Override\n    public void onMetadataChanged(@NonNull final StreamInfo info) {\n        super.onMetadataChanged(info);\n\n        updateStreamRelatedViews();\n\n        binding.titleTextView.setText(info.getName());\n        binding.channelTextView.setText(info.getUploaderName());\n\n        this.seekbarPreviewThumbnailHolder.resetFrom(player.getContext(), info.getPreviewFrames());\n    }\n\n    private void updateStreamRelatedViews() {\n        player.getCurrentStreamInfo().ifPresent(info -> {\n            binding.qualityTextView.setVisibility(View.GONE);\n            binding.audioTrackTextView.setVisibility(View.GONE);\n            binding.playbackSpeed.setVisibility(View.GONE);\n\n            binding.playbackEndTime.setVisibility(View.GONE);\n            binding.playbackLiveSync.setVisibility(View.GONE);\n\n            switch (info.getStreamType()) {\n                case AUDIO_STREAM:\n                case POST_LIVE_AUDIO_STREAM:\n                    binding.surfaceView.setVisibility(View.GONE);\n                    binding.endScreen.setVisibility(View.VISIBLE);\n                    binding.playbackEndTime.setVisibility(View.VISIBLE);\n                    break;\n\n                case AUDIO_LIVE_STREAM:\n                    binding.surfaceView.setVisibility(View.GONE);\n                    binding.endScreen.setVisibility(View.VISIBLE);\n                    binding.playbackLiveSync.setVisibility(View.VISIBLE);\n                    break;\n\n                case LIVE_STREAM:\n                    binding.surfaceView.setVisibility(View.VISIBLE);\n                    binding.endScreen.setVisibility(View.GONE);\n                    binding.playbackLiveSync.setVisibility(View.VISIBLE);\n                    break;\n\n                case VIDEO_STREAM:\n                case POST_LIVE_STREAM:\n                    if (player.getCurrentMetadata() != null\n                            && player.getCurrentMetadata().getMaybeQuality().isEmpty()\n                            || (info.getVideoStreams().isEmpty()\n                            && info.getVideoOnlyStreams().isEmpty())) {\n                        break;\n                    }\n\n                    buildQualityMenu();\n                    buildAudioTrackMenu();\n\n                    binding.qualityTextView.setVisibility(View.VISIBLE);\n                    binding.surfaceView.setVisibility(View.VISIBLE);\n                    // fallthrough\n                default:\n                    binding.endScreen.setVisibility(View.GONE);\n                    binding.playbackEndTime.setVisibility(View.VISIBLE);\n                    break;\n            }\n\n            buildPlaybackSpeedMenu();\n            binding.playbackSpeed.setVisibility(View.VISIBLE);\n        });\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Popup menus (\"popup\" means that they pop up, not that they belong to the popup player)\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Popup menus (\"popup\" means that they pop up, not that they belong to the popup player)\n\n    private void buildQualityMenu() {\n        if (qualityPopupMenu == null) {\n            return;\n        }\n        qualityPopupMenu.getMenu().removeGroup(POPUP_MENU_ID_QUALITY);\n\n        final List<VideoStream> availableStreams = Optional.ofNullable(player.getCurrentMetadata())\n                .flatMap(MediaItemTag::getMaybeQuality)\n                .map(MediaItemTag.Quality::getSortedVideoStreams)\n                .orElse(null);\n        if (availableStreams == null) {\n            return;\n        }\n\n        for (int i = 0; i < availableStreams.size(); i++) {\n            final VideoStream videoStream = availableStreams.get(i);\n            qualityPopupMenu.getMenu().add(POPUP_MENU_ID_QUALITY, i, Menu.NONE, MediaFormat\n                    .getNameById(videoStream.getFormatId()) + \" \" + videoStream.getResolution());\n        }\n        qualityPopupMenu.setOnMenuItemClickListener(this);\n        qualityPopupMenu.setOnDismissListener(this);\n\n        player.getSelectedVideoStream()\n                .ifPresent(s -> binding.qualityTextView.setText(s.getResolution()));\n    }\n\n    private void buildAudioTrackMenu() {\n        if (audioTrackPopupMenu == null) {\n            return;\n        }\n        audioTrackPopupMenu.getMenu().removeGroup(POPUP_MENU_ID_AUDIO_TRACK);\n\n        final List<AudioStream> availableStreams = Optional.ofNullable(player.getCurrentMetadata())\n                .flatMap(MediaItemTag::getMaybeAudioTrack)\n                .map(MediaItemTag.AudioTrack::getAudioStreams)\n                .orElse(null);\n        if (availableStreams == null || availableStreams.size() < 2) {\n            return;\n        }\n\n        for (int i = 0; i < availableStreams.size(); i++) {\n            final AudioStream audioStream = availableStreams.get(i);\n            audioTrackPopupMenu.getMenu().add(POPUP_MENU_ID_AUDIO_TRACK, i, Menu.NONE,\n                    Localization.audioTrackName(context, audioStream));\n        }\n\n        player.getSelectedAudioStream()\n                .ifPresent(s -> binding.audioTrackTextView.setText(\n                        Localization.audioTrackName(context, s)));\n        binding.audioTrackTextView.setVisibility(View.VISIBLE);\n        audioTrackPopupMenu.setOnMenuItemClickListener(this);\n        audioTrackPopupMenu.setOnDismissListener(this);\n    }\n\n    private void buildPlaybackSpeedMenu() {\n        if (playbackSpeedPopupMenu == null) {\n            return;\n        }\n        playbackSpeedPopupMenu.getMenu().removeGroup(POPUP_MENU_ID_PLAYBACK_SPEED);\n\n        for (int i = 0; i < PLAYBACK_SPEEDS.length; i++) {\n            playbackSpeedPopupMenu.getMenu().add(POPUP_MENU_ID_PLAYBACK_SPEED, i, Menu.NONE,\n                    formatSpeed(PLAYBACK_SPEEDS[i]));\n        }\n        binding.playbackSpeed.setText(formatSpeed(player.getPlaybackSpeed()));\n        playbackSpeedPopupMenu.setOnMenuItemClickListener(this);\n        playbackSpeedPopupMenu.setOnDismissListener(this);\n    }\n\n    private void buildCaptionMenu(@NonNull final List<String> availableLanguages) {\n        if (captionPopupMenu == null) {\n            return;\n        }\n        captionPopupMenu.getMenu().removeGroup(POPUP_MENU_ID_CAPTION);\n\n        captionPopupMenu.setOnDismissListener(this);\n\n        // Add option for turning off caption\n        final MenuItem captionOffItem = captionPopupMenu.getMenu().add(POPUP_MENU_ID_CAPTION,\n                0, Menu.NONE, R.string.caption_none);\n        captionOffItem.setOnMenuItemClickListener(menuItem -> {\n            final int textRendererIndex = player.getCaptionRendererIndex();\n            if (textRendererIndex != RENDERER_UNAVAILABLE) {\n                player.getTrackSelector().setParameters(player.getTrackSelector()\n                        .buildUponParameters().setRendererDisabled(textRendererIndex, true));\n            }\n            player.getPrefs().edit()\n                    .remove(context.getString(R.string.caption_user_set_key)).apply();\n            return true;\n        });\n\n        // Add all available captions\n        for (int i = 0; i < availableLanguages.size(); i++) {\n            final String captionLanguage = availableLanguages.get(i);\n            final MenuItem captionItem = captionPopupMenu.getMenu().add(POPUP_MENU_ID_CAPTION,\n                    i + 1, Menu.NONE, captionLanguage);\n            captionItem.setOnMenuItemClickListener(menuItem -> {\n                final int textRendererIndex = player.getCaptionRendererIndex();\n                if (textRendererIndex != RENDERER_UNAVAILABLE) {\n                    // DefaultTrackSelector will select for text tracks in the following order.\n                    // When multiple tracks share the same rank, a random track will be chosen.\n                    // 1. ANY track exactly matching preferred language name\n                    // 2. ANY track exactly matching preferred language stem\n                    // 3. ROLE_FLAG_CAPTION track matching preferred language stem\n                    // 4. ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND track matching preferred language stem\n                    // This means if a caption track of preferred language is not available,\n                    // then an auto-generated track of that language will be chosen automatically.\n                    player.getTrackSelector().setParameters(player.getTrackSelector()\n                            .buildUponParameters()\n                            .setPreferredTextLanguages(captionLanguage,\n                                    PlayerHelper.captionLanguageStemOf(captionLanguage))\n                            .setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION)\n                            .setRendererDisabled(textRendererIndex, false));\n                    player.getPrefs().edit().putString(context.getString(\n                            R.string.caption_user_set_key), captionLanguage).apply();\n                }\n                return true;\n            });\n        }\n        captionPopupMenu.setOnDismissListener(this);\n\n        // apply caption language from previous user preference\n        final int textRendererIndex = player.getCaptionRendererIndex();\n        if (textRendererIndex == RENDERER_UNAVAILABLE) {\n            return;\n        }\n\n        // If user prefers to show no caption, then disable the renderer.\n        // Otherwise, DefaultTrackSelector may automatically find an available caption\n        // and display that.\n        final String userPreferredLanguage =\n                player.getPrefs().getString(context.getString(R.string.caption_user_set_key), null);\n        if (userPreferredLanguage == null) {\n            player.getTrackSelector().setParameters(player.getTrackSelector().buildUponParameters()\n                    .setRendererDisabled(textRendererIndex, true));\n            return;\n        }\n\n        // Only set preferred language if it does not match the user preference,\n        // otherwise there might be an infinite cycle at onTextTracksChanged.\n        final List<String> selectedPreferredLanguages =\n                player.getTrackSelector().getParameters().preferredTextLanguages;\n        if (!selectedPreferredLanguages.contains(userPreferredLanguage)) {\n            player.getTrackSelector().setParameters(player.getTrackSelector().buildUponParameters()\n                    .setPreferredTextLanguages(userPreferredLanguage,\n                            PlayerHelper.captionLanguageStemOf(userPreferredLanguage))\n                    .setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION)\n                    .setRendererDisabled(textRendererIndex, false));\n        }\n    }\n\n    protected abstract void onPlaybackSpeedClicked();\n\n    private void onQualityClicked() {\n        qualityPopupMenu.show();\n        isSomePopupMenuVisible = true;\n\n        player.getSelectedVideoStream()\n                .map(s -> MediaFormat.getNameById(s.getFormatId()) + \" \" + s.getResolution())\n                .ifPresent(binding.qualityTextView::setText);\n    }\n\n    private void onAudioTracksClicked() {\n        audioTrackPopupMenu.show();\n        isSomePopupMenuVisible = true;\n    }\n\n    /**\n     * Called when an item of the quality selector or the playback speed selector is selected.\n     */\n    @Override\n    public boolean onMenuItemClick(@NonNull final MenuItem menuItem) {\n        if (DEBUG) {\n            Log.d(TAG, \"onMenuItemClick() called with: \"\n                    + \"menuItem = [\" + menuItem + \"], \"\n                    + \"menuItem.getItemId = [\" + menuItem.getItemId() + \"]\");\n        }\n\n        if (menuItem.getGroupId() == POPUP_MENU_ID_QUALITY) {\n            onQualityItemClick(menuItem);\n            return true;\n        } else if (menuItem.getGroupId() == POPUP_MENU_ID_AUDIO_TRACK) {\n            onAudioTrackItemClick(menuItem);\n            return true;\n        } else if (menuItem.getGroupId() == POPUP_MENU_ID_PLAYBACK_SPEED) {\n            final int speedIndex = menuItem.getItemId();\n            final float speed = PLAYBACK_SPEEDS[speedIndex];\n\n            player.setPlaybackSpeed(speed);\n            binding.playbackSpeed.setText(formatSpeed(speed));\n        }\n\n        return false;\n    }\n\n    private void onQualityItemClick(@NonNull final MenuItem menuItem) {\n        final int menuItemIndex = menuItem.getItemId();\n        @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata();\n        if (currentMetadata == null || currentMetadata.getMaybeQuality().isEmpty()) {\n            return;\n        }\n\n        final MediaItemTag.Quality quality = currentMetadata.getMaybeQuality().get();\n        final List<VideoStream> availableStreams = quality.getSortedVideoStreams();\n        final int selectedStreamIndex = quality.getSelectedVideoStreamIndex();\n        if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) {\n            return;\n        }\n\n        final String newResolution = availableStreams.get(menuItemIndex).getResolution();\n        player.setPlaybackQuality(newResolution);\n\n        binding.qualityTextView.setText(menuItem.getTitle());\n    }\n\n    private void onAudioTrackItemClick(@NonNull final MenuItem menuItem) {\n        final int menuItemIndex = menuItem.getItemId();\n        @Nullable final MediaItemTag currentMetadata = player.getCurrentMetadata();\n        if (currentMetadata == null || currentMetadata.getMaybeAudioTrack().isEmpty()) {\n            return;\n        }\n\n        final MediaItemTag.AudioTrack audioTrack =\n                currentMetadata.getMaybeAudioTrack().get();\n        final List<AudioStream> availableStreams = audioTrack.getAudioStreams();\n        final int selectedStreamIndex = audioTrack.getSelectedAudioStreamIndex();\n        if (selectedStreamIndex == menuItemIndex || availableStreams.size() <= menuItemIndex) {\n            return;\n        }\n\n        final String newAudioTrack = availableStreams.get(menuItemIndex).getAudioTrackId();\n        player.setAudioTrack(newAudioTrack);\n\n        binding.audioTrackTextView.setText(menuItem.getTitle());\n    }\n\n    /**\n     * Called when some popup menu is dismissed.\n     */\n    @Override\n    public void onDismiss(@Nullable final PopupMenu menu) {\n        if (DEBUG) {\n            Log.d(TAG, \"onDismiss() called with: menu = [\" + menu + \"]\");\n        }\n        isSomePopupMenuVisible = false; //TODO check if this works\n        player.getSelectedVideoStream()\n                .ifPresent(s -> binding.qualityTextView.setText(s.getResolution()));\n\n        if (player.isPlaying()) {\n            hideControls(DEFAULT_CONTROLS_DURATION, 0);\n            hideSystemUIIfNeeded();\n        }\n    }\n\n    private void onCaptionClicked() {\n        if (DEBUG) {\n            Log.d(TAG, \"onCaptionClicked() called\");\n        }\n        captionPopupMenu.show();\n        isSomePopupMenuVisible = true;\n    }\n\n    public boolean isSomePopupMenuVisible() {\n        return isSomePopupMenuVisible;\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Captions (text tracks)\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Captions (text tracks)\n\n    @Override\n    public void onTextTracksChanged(@NonNull final Tracks currentTracks) {\n        super.onTextTracksChanged(currentTracks);\n\n        final boolean trackTypeTextSupported = !currentTracks.containsType(C.TRACK_TYPE_TEXT)\n                || currentTracks.isTypeSupported(C.TRACK_TYPE_TEXT, false);\n        if (getPlayer().getTrackSelector().getCurrentMappedTrackInfo() == null\n                || !trackTypeTextSupported) {\n            binding.captionTextView.setVisibility(View.GONE);\n            return;\n        }\n\n        // Extract all loaded languages\n        final List<Tracks.Group> textTracks = currentTracks\n                .getGroups()\n                .stream()\n                .filter(trackGroupInfo -> C.TRACK_TYPE_TEXT == trackGroupInfo.getType())\n                .collect(Collectors.toList());\n        final List<String> availableLanguages = textTracks.stream()\n                .map(Tracks.Group::getMediaTrackGroup)\n                .filter(textTrack -> textTrack.length > 0)\n                .map(textTrack -> textTrack.getFormat(0).language)\n                .collect(Collectors.toList());\n\n        // Find selected text track\n        final Optional<Format> selectedTracks = textTracks.stream()\n                .filter(Tracks.Group::isSelected)\n                .filter(info -> info.getMediaTrackGroup().length >= 1)\n                .map(info -> info.getMediaTrackGroup().getFormat(0))\n                .findFirst();\n\n        // Build UI\n        buildCaptionMenu(availableLanguages);\n        if (player.getTrackSelector().getParameters().getRendererDisabled(\n                player.getCaptionRendererIndex()) || selectedTracks.isEmpty()) {\n            binding.captionTextView.setText(R.string.caption_none);\n        } else {\n            binding.captionTextView.setText(selectedTracks.get().language);\n        }\n        binding.captionTextView.setVisibility(\n                availableLanguages.isEmpty() ? View.GONE : View.VISIBLE);\n    }\n\n    @Override\n    public void onCues(@NonNull final List<Cue> cues) {\n        super.onCues(cues);\n        binding.subtitleView.setCues(cues);\n    }\n\n    private void setupSubtitleView() {\n        setupSubtitleView(PlayerHelper.getCaptionScale(context));\n        final CaptionStyleCompat captionStyle = PlayerHelper.getCaptionStyle(context);\n        binding.subtitleView.setApplyEmbeddedStyles(captionStyle == CaptionStyleCompat.DEFAULT);\n        binding.subtitleView.setStyle(captionStyle);\n    }\n\n    /**\n     *\n     * @param captionScale Value returned by {@link PlayerHelper#getCaptionScale}.\n     */\n    protected abstract void setupSubtitleView(float captionScale);\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Click listeners\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Click listeners\n\n    /**\n     * Create on-click listener which manages the player controls after the view on-click action.\n     *\n     * @param runnable The action to be executed.\n     * @return The view click listener.\n     */\n    protected View.OnClickListener makeOnClickListener(@NonNull final Runnable runnable) {\n        return v -> {\n            if (DEBUG) {\n                Log.d(TAG, \"onClick() called with: v = [\" + v + \"]\");\n            }\n\n            runnable.run();\n\n            // Manages the player controls after handling the view click.\n            if (player.getCurrentState() == STATE_COMPLETED) {\n                return;\n            }\n            controlsVisibilityHandler.removeCallbacksAndMessages(null);\n            showHideShadow(true, DEFAULT_CONTROLS_DURATION);\n            animate(binding.playbackControlRoot, true, DEFAULT_CONTROLS_DURATION,\n                    AnimationType.ALPHA, 0, () -> {\n                        if (player.getCurrentState() == STATE_PLAYING && !isSomePopupMenuVisible) {\n                            if (v == binding.playPauseButton\n                                    // Hide controls in fullscreen immediately\n                                    || (v == binding.screenRotationButton && isFullscreen())) {\n                                hideControls(0, 0);\n                            } else {\n                                hideControls(DEFAULT_CONTROLS_DURATION, DEFAULT_CONTROLS_HIDE_TIME);\n                            }\n                        }\n                    });\n        };\n    }\n\n    public boolean onKeyDown(final int keyCode) {\n        switch (keyCode) {\n            case KeyEvent.KEYCODE_BACK:\n                if (DeviceUtils.isTv(context) && isControlsVisible()) {\n                    hideControls(0, 0);\n                    return true;\n                }\n                break;\n            case KeyEvent.KEYCODE_DPAD_UP:\n            case KeyEvent.KEYCODE_DPAD_LEFT:\n            case KeyEvent.KEYCODE_DPAD_DOWN:\n            case KeyEvent.KEYCODE_DPAD_RIGHT:\n            case KeyEvent.KEYCODE_DPAD_CENTER:\n                if ((binding.getRoot().hasFocus() && !binding.playbackControlRoot.hasFocus())\n                        || isAnyListViewOpen()) {\n                    // do not interfere with focus in playlist and play queue etc.\n                    break;\n                }\n\n                if (player.getCurrentState() == org.schabi.newpipe.player.Player.STATE_BLOCKED) {\n                    return true;\n                }\n\n                if (isControlsVisible()) {\n                    hideControls(DEFAULT_CONTROLS_DURATION, DPAD_CONTROLS_HIDE_TIME);\n                } else {\n                    binding.playPauseButton.requestFocus();\n                    showControlsThenHide();\n                    showSystemUIPartially();\n                    return true;\n                }\n                break;\n            default:\n                break; // ignore other keys\n        }\n\n        return false;\n    }\n\n    private void onMoreOptionsClicked() {\n        if (DEBUG) {\n            Log.d(TAG, \"onMoreOptionsClicked() called\");\n        }\n\n        final boolean isMoreControlsVisible =\n                binding.secondaryControls.getVisibility() == View.VISIBLE;\n\n        animateRotation(binding.moreOptionsButton, DEFAULT_CONTROLS_DURATION,\n                isMoreControlsVisible ? 0 : 180);\n        animate(binding.secondaryControls, !isMoreControlsVisible, DEFAULT_CONTROLS_DURATION,\n                AnimationType.SLIDE_AND_ALPHA, 0, () -> {\n                    // Fix for a ripple effect on background drawable.\n                    // When view returns from GONE state it takes more milliseconds than returning\n                    // from INVISIBLE state. And the delay makes ripple background end to fast\n                    if (isMoreControlsVisible) {\n                        binding.secondaryControls.setVisibility(View.INVISIBLE);\n                    }\n                });\n        showControls(DEFAULT_CONTROLS_DURATION);\n    }\n\n    private void onPlayWithKodiClicked() {\n        if (player.getCurrentMetadata() != null) {\n            player.pause();\n            KoreUtils.playWithKore(context, Uri.parse(player.getVideoUrl()));\n        }\n    }\n\n    private void onOpenInBrowserClicked() {\n        player.getCurrentStreamInfo().ifPresent(streamInfo ->\n                ShareUtils.openUrlInBrowser(player.getContext(), streamInfo.getOriginalUrl()));\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Video size\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Video size\n\n    protected void setResizeMode(@AspectRatioFrameLayout.ResizeMode final int resizeMode) {\n        binding.surfaceView.setResizeMode(resizeMode);\n        binding.resizeTextView.setText(PlayerHelper.resizeTypeOf(context, resizeMode));\n    }\n\n    void onResizeClicked() {\n        setResizeMode(nextResizeModeAndSaveToPrefs(player, binding.surfaceView.getResizeMode()));\n    }\n\n    @Override\n    public void onVideoSizeChanged(@NonNull final VideoSize videoSize) {\n        super.onVideoSizeChanged(videoSize);\n        // Starting with ExoPlayer 2.19.0, the VideoSize will report a width and height of 0\n        // if the renderer is disabled. In that case, we skip updating the aspect ratio.\n        if (videoSize.width == 0 || videoSize.height == 0) {\n            return;\n        }\n        binding.surfaceView.setAspectRatio(((float) videoSize.width) / videoSize.height);\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // SurfaceHolderCallback helpers\n    //////////////////////////////////////////////////////////////////////////*/\n    //region SurfaceHolderCallback helpers\n\n    /**\n     * Connects the video surface to the exo player. This can be called anytime without the risk for\n     * issues to occur, since the player will run just fine when no surface is connected. Therefore\n     * the video surface will be setup only when all of these conditions are true: it is not already\n     * setup (this just prevents wasting resources to setup the surface again), there is an exo\n     * player, the root view is attached to a parent and the surface view is valid/unreleased (the\n     * latter two conditions prevent \"The surface has been released\" errors). So this function can\n     * be called many times and even while the UI is in unready states.\n     */\n    public void setupVideoSurfaceIfNeeded() {\n        if (!surfaceIsSetup && player.getExoPlayer() != null\n                && binding.getRoot().getParent() != null) {\n            // make sure there is nothing left over from previous calls\n            clearVideoSurface();\n\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // >=API23\n                surfaceHolderCallback = new SurfaceHolderCallback(context, player.getExoPlayer());\n                binding.surfaceView.getHolder().addCallback(surfaceHolderCallback);\n\n                // ensure player is using an unreleased surface, which the surfaceView might not be\n                // when starting playback on background or during player switching\n                if (binding.surfaceView.getHolder().getSurface().isValid()) {\n                    // initially set the surface manually otherwise\n                    // onRenderedFirstFrame() will not be called\n                    player.getExoPlayer().setVideoSurfaceHolder(binding.surfaceView.getHolder());\n                }\n            } else {\n                player.getExoPlayer().setVideoSurfaceView(binding.surfaceView);\n            }\n\n            surfaceIsSetup = true;\n        }\n    }\n\n    private void clearVideoSurface() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M // >=API23\n                && surfaceHolderCallback != null) {\n            binding.surfaceView.getHolder().removeCallback(surfaceHolderCallback);\n            surfaceHolderCallback.release();\n            surfaceHolderCallback = null;\n        }\n        Optional.ofNullable(player.getExoPlayer()).ifPresent(ExoPlayer::clearVideoSurface);\n        surfaceIsSetup = false;\n    }\n    //endregion\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Getters\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Getters\n\n    public PlayerBinding getBinding() {\n        return binding;\n    }\n\n    public GestureDetector getGestureDetector() {\n        return gestureDetector;\n    }\n    //endregion\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.content.ActivityNotFoundException;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.provider.Settings;\nimport android.widget.Toast;\n\nimport androidx.core.app.ActivityCompat;\nimport androidx.preference.Preference;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.util.Constants;\nimport org.schabi.newpipe.util.ThemeHelper;\n\npublic class AppearanceSettingsFragment extends BasePreferenceFragment {\n\n    @Override\n    public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {\n        addPreferencesFromResourceRegistry();\n\n        final String themeKey = getString(R.string.theme_key);\n        // the key of the active theme when settings were opened (or recreated after theme change)\n        final String startThemeKey = defaultPreferences\n                .getString(themeKey, getString(R.string.default_theme_value));\n        final String autoDeviceThemeKey = getString(R.string.auto_device_theme_key);\n        findPreference(themeKey).setOnPreferenceChangeListener((preference, newValue) -> {\n            if (newValue.toString().equals(autoDeviceThemeKey)) {\n                Toast.makeText(getContext(), getString(R.string.select_night_theme_toast),\n                        Toast.LENGTH_LONG).show();\n            }\n\n            applyThemeChange(startThemeKey, themeKey, newValue);\n            return false;\n        });\n\n        final String nightThemeKey = getString(R.string.night_theme_key);\n        if (startThemeKey.equals(autoDeviceThemeKey)) {\n            final String startNightThemeKey = defaultPreferences\n                    .getString(nightThemeKey, getString(R.string.default_night_theme_value));\n\n            findPreference(nightThemeKey).setOnPreferenceChangeListener((preference, newValue) -> {\n                applyThemeChange(startNightThemeKey, nightThemeKey, newValue);\n                return false;\n            });\n        } else {\n            // disable the night theme selection\n            final Preference preference = findPreference(nightThemeKey);\n            if (preference != null) {\n                preference.setEnabled(false);\n                preference.setSummary(getString(R.string.night_theme_available,\n                        getString(R.string.auto_device_theme_title)));\n            }\n        }\n    }\n\n    @Override\n    public boolean onPreferenceTreeClick(final Preference preference) {\n        if (getString(R.string.caption_settings_key).equals(preference.getKey())) {\n            try {\n                startActivity(new Intent(Settings.ACTION_CAPTIONING_SETTINGS));\n            } catch (final ActivityNotFoundException e) {\n                Toast.makeText(getActivity(), R.string.general_error, Toast.LENGTH_SHORT).show();\n            }\n        }\n\n        return super.onPreferenceTreeClick(preference);\n    }\n\n    private void applyThemeChange(final String beginningThemeKey,\n                                  final String themeKey,\n                                  final Object newValue) {\n        defaultPreferences.edit().putBoolean(Constants.KEY_THEME_CHANGE, true).apply();\n        defaultPreferences.edit().putString(themeKey, newValue.toString()).apply();\n\n        ThemeHelper.setDayNightMode(requireContext(), newValue.toString());\n\n        if (!newValue.equals(beginningThemeKey) && getActivity() != null) {\n            // if it's not the current theme\n            ActivityCompat.recreate(getActivity());\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/BackupRestoreSettingsFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport static org.schabi.newpipe.extractor.utils.Utils.isBlank;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.widget.Toast;\n\nimport androidx.activity.result.ActivityResult;\nimport androidx.activity.result.ActivityResultLauncher;\nimport androidx.activity.result.contract.ActivityResultContracts;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.preference.Preference;\nimport androidx.preference.PreferenceManager;\n\nimport com.grack.nanojson.JsonParserException;\n\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.local.subscription.SubscriptionsImportExportHelper;\nimport org.schabi.newpipe.settings.export.BackupFileLocator;\nimport org.schabi.newpipe.settings.export.ImportExportManager;\nimport org.schabi.newpipe.streams.io.NoFileManagerSafeGuard;\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.ZipHelper;\n\nimport java.io.IOException;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.Locale;\nimport java.util.concurrent.ExecutorService;\nimport java.util.concurrent.Executors;\n\npublic class BackupRestoreSettingsFragment extends BasePreferenceFragment {\n\n    private static final String ZIP_MIME_TYPE = \"application/zip\";\n\n    private final SimpleDateFormat exportDateFormat =\n            new SimpleDateFormat(\"yyyyMMdd_HHmmss\", Locale.US);\n    private ImportExportManager manager;\n    private String importExportDataPathKey;\n    private final ActivityResultLauncher<Intent> requestImportPathLauncher =\n            registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),\n                    this::requestImportPathResult);\n    private final ActivityResultLauncher<Intent> requestExportPathLauncher =\n            registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),\n                    this::requestExportPathResult);\n    private SubscriptionsImportExportHelper importExportHelper;\n\n\n    @Override\n    public void onAttach(@NonNull final Context context) {\n        super.onAttach(context);\n        importExportHelper = new SubscriptionsImportExportHelper(this);\n    }\n\n    @Override\n    public void onCreatePreferences(@Nullable final Bundle savedInstanceState,\n                                    @Nullable final String rootKey) {\n        manager = new ImportExportManager(new BackupFileLocator(requireContext()));\n\n        importExportDataPathKey = getString(R.string.import_export_data_path);\n\n        addPreferencesFromResourceRegistry();\n\n        final Preference importDataPreference = requirePreference(R.string.import_data);\n        importDataPreference.setOnPreferenceClickListener((Preference p) -> {\n            NoFileManagerSafeGuard.launchSafe(\n                    requestImportPathLauncher,\n                    StoredFileHelper.getPicker(requireContext(),\n                            ZIP_MIME_TYPE, getImportExportDataUri()),\n                    TAG,\n                    getContext()\n            );\n\n            return true;\n        });\n\n        final Preference exportDataPreference = requirePreference(R.string.export_data);\n        exportDataPreference.setOnPreferenceClickListener((final Preference p) -> {\n            NoFileManagerSafeGuard.launchSafe(\n                    requestExportPathLauncher,\n                    StoredFileHelper.getNewPicker(requireContext(),\n                            \"NewPipeData-\" + exportDateFormat.format(new Date()) + \".zip\",\n                            ZIP_MIME_TYPE, getImportExportDataUri()),\n                    TAG,\n                    getContext()\n            );\n\n            return true;\n        });\n\n        final Preference resetSettings = requirePreference(R.string.reset_settings);\n        // Resets all settings by deleting shared preference and restarting the app\n        // A dialogue will pop up to confirm if user intends to reset all settings\n        resetSettings.setOnPreferenceClickListener(preference -> {\n            // Show Alert Dialogue\n            final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());\n            builder.setMessage(R.string.reset_all_settings);\n            builder.setCancelable(true);\n            builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> {\n                // Deletes all shared preferences xml files.\n                final SharedPreferences sharedPreferences =\n                        PreferenceManager.getDefaultSharedPreferences(requireContext());\n                sharedPreferences.edit().clear().apply();\n                // Restarts the app\n                if (getActivity() == null) {\n                    return;\n                }\n                NavigationHelper.restartApp(getActivity());\n            });\n            builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> {\n            });\n            final AlertDialog alertDialog = builder.create();\n            alertDialog.show();\n            return true;\n        });\n\n        final Preference exportSubsPreference =\n                requirePreference(R.string.export_subscriptions_key);\n        exportSubsPreference.setOnPreferenceClickListener(reference -> {\n            importExportHelper.onExportSelected();\n            return true;\n        });\n\n        final Preference importSubsPreference =\n                requirePreference(R.string.import_subscriptions_key);\n        importSubsPreference.setOnPreferenceClickListener(preference -> {\n            importExportHelper.onImportPreviousSelected();\n            return true;\n        });\n\n    }\n\n    private void requestExportPathResult(final ActivityResult result) {\n        if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {\n            // will be saved only on success\n            final Uri lastExportDataUri = result.getData().getData();\n\n            final StoredFileHelper file = new StoredFileHelper(\n                    requireContext(), result.getData().getData(), ZIP_MIME_TYPE);\n\n            exportDatabase(file, lastExportDataUri);\n        }\n    }\n\n    private void requestImportPathResult(final ActivityResult result) {\n        if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {\n            // will be saved only on success\n            final Uri lastImportDataUri = result.getData().getData();\n\n            final StoredFileHelper file = new StoredFileHelper(\n                    requireContext(), result.getData().getData(), ZIP_MIME_TYPE);\n\n            new androidx.appcompat.app.AlertDialog.Builder(requireActivity())\n                    .setMessage(R.string.override_current_data)\n                    .setPositiveButton(R.string.ok, (d, id) ->\n                            importDatabase(file, lastImportDataUri))\n                    .setNegativeButton(R.string.cancel, (d, id) ->\n                            d.cancel())\n                    .show();\n        }\n    }\n\n    private void exportDatabase(final StoredFileHelper file, final Uri exportDataUri) {\n        try (ExecutorService executor = Executors.newSingleThreadExecutor()) {\n            //checkpoint before export\n            executor.submit(NewPipeDatabase::checkpoint).get();\n\n            final SharedPreferences preferences = PreferenceManager\n                    .getDefaultSharedPreferences(requireContext());\n            manager.exportDatabase(preferences, file);\n\n            saveLastImportExportDataUri(exportDataUri); // save export path only on success\n            Toast.makeText(requireContext(), R.string.export_complete_toast, Toast.LENGTH_SHORT)\n                    .show();\n        } catch (final Exception e) {\n            showErrorSnackbar(e, \"Exporting database and settings\");\n        }\n    }\n\n    private void importDatabase(final StoredFileHelper file, final Uri importDataUri) {\n        // check if file is supported\n        if (!ZipHelper.isValidZipFile(file)) {\n            Toast.makeText(requireContext(), R.string.no_valid_zip_file, Toast.LENGTH_SHORT)\n                    .show();\n            return;\n        }\n\n        try {\n            manager.ensureDbDirectoryExists();\n\n            // replace the current database\n            if (!manager.extractDb(file)) {\n                Toast.makeText(requireContext(), R.string.could_not_import_all_files,\n                                Toast.LENGTH_LONG)\n                        .show();\n            }\n\n            // if settings file exist, ask if it should be imported.\n            final boolean hasJsonPrefs = manager.exportHasJsonPrefs(file);\n            if (hasJsonPrefs || manager.exportHasSerializedPrefs(file)) {\n                new androidx.appcompat.app.AlertDialog.Builder(requireContext())\n                        .setTitle(R.string.import_settings)\n                        .setMessage(hasJsonPrefs ? null : requireContext()\n                                .getString(R.string.import_settings_vulnerable_format))\n                        .setOnDismissListener(dialog -> finishImport(importDataUri))\n                        .setNegativeButton(R.string.cancel, (dialog, which) -> {\n                            dialog.dismiss();\n                            finishImport(importDataUri);\n                        })\n                        .setPositiveButton(R.string.ok, (dialog, which) -> {\n                            dialog.dismiss();\n                            final Context context = requireContext();\n                            final SharedPreferences prefs = PreferenceManager\n                                    .getDefaultSharedPreferences(context);\n                            try {\n                                if (hasJsonPrefs) {\n                                    manager.loadJsonPrefs(file, prefs);\n                                } else {\n                                    manager.loadSerializedPrefs(file, prefs);\n                                }\n                            } catch (IOException | ClassNotFoundException | JsonParserException e) {\n                                createErrorNotification(e, \"Importing preferences\");\n                                return;\n                            }\n                            cleanImport(context, prefs);\n                            finishImport(importDataUri);\n                        })\n                        .show();\n            } else {\n                finishImport(importDataUri);\n            }\n        } catch (final Exception e) {\n            showErrorSnackbar(e, \"Importing database and settings\");\n        }\n    }\n\n    /**\n     * Remove settings that are not supposed to be imported on different devices\n     * and reset them to default values.\n     * @param context the context used for the import\n     * @param prefs the preferences used while running the import\n     */\n    private void cleanImport(@NonNull final Context context,\n                             @NonNull final SharedPreferences prefs) {\n        // Check if media tunnelling needs to be disabled automatically,\n        // if it was disabled automatically in the imported preferences.\n        final String tunnelingKey = context.getString(R.string.disable_media_tunneling_key);\n        final String automaticTunnelingKey =\n                context.getString(R.string.disabled_media_tunneling_automatically_key);\n        // R.string.disable_media_tunneling_key should always be true\n        // if R.string.disabled_media_tunneling_automatically_key equals 1,\n        // but we double check here just to be sure and to avoid regressions\n        // caused by possible later modification of the media tunneling functionality.\n        // R.string.disabled_media_tunneling_automatically_key == 0:\n        //     automatic value overridden by user in settings\n        // R.string.disabled_media_tunneling_automatically_key == -1: not set\n        final boolean wasMediaTunnelingDisabledAutomatically =\n                prefs.getInt(automaticTunnelingKey, -1) == 1\n                        && prefs.getBoolean(tunnelingKey, false);\n        if (wasMediaTunnelingDisabledAutomatically) {\n            prefs.edit()\n                    .putInt(automaticTunnelingKey, -1)\n                    .putBoolean(tunnelingKey, false)\n                    .apply();\n            NewPipeSettings.setMediaTunneling(context);\n        }\n    }\n\n    /**\n     * Save import path and restart app.\n     *\n     * @param importDataUri The import path to save\n     */\n    private void finishImport(final Uri importDataUri) {\n        // save import path only on success\n        saveLastImportExportDataUri(importDataUri);\n        // restart app to properly load db\n        NavigationHelper.restartApp(requireActivity());\n    }\n\n    private Uri getImportExportDataUri() {\n        final String path = defaultPreferences.getString(importExportDataPathKey, null);\n        return isBlank(path) ? null : Uri.parse(path);\n    }\n\n    private void saveLastImportExportDataUri(final Uri importExportDataUri) {\n        final SharedPreferences.Editor editor = defaultPreferences.edit()\n                .putString(importExportDataPathKey, importExportDataUri.toString());\n        editor.apply();\n    }\n\n    private void showErrorSnackbar(final Throwable e, final String request) {\n        ErrorUtil.showSnackbar(this, new ErrorInfo(e, UserAction.DATABASE_IMPORT_EXPORT, request));\n    }\n\n    private void createErrorNotification(final Throwable e, final String request) {\n        ErrorUtil.createNotification(\n                requireContext(),\n                new ErrorInfo(e, UserAction.DATABASE_IMPORT_EXPORT, request)\n        );\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\nimport androidx.preference.Preference;\nimport androidx.preference.PreferenceFragmentCompat;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.util.ThemeHelper;\n\nimport java.util.Objects;\n\npublic abstract class BasePreferenceFragment extends PreferenceFragmentCompat {\n    protected final String TAG = getClass().getSimpleName() + \"@\" + Integer.toHexString(hashCode());\n    protected static final boolean DEBUG = MainActivity.DEBUG;\n\n    SharedPreferences defaultPreferences;\n\n    @Override\n    public void onCreate(@Nullable final Bundle savedInstanceState) {\n        defaultPreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity());\n        super.onCreate(savedInstanceState);\n    }\n\n    protected void addPreferencesFromResourceRegistry() {\n        addPreferencesFromResource(\n                SettingsResourceRegistry.getInstance().getPreferencesResId(this.getClass()));\n    }\n\n    @Override\n    public void onViewCreated(@NonNull final View rootView,\n                              @Nullable final Bundle savedInstanceState) {\n        super.onViewCreated(rootView, savedInstanceState);\n        setDivider(null);\n        ThemeHelper.setTitleToAppCompatActivity(getActivity(), getPreferenceScreen().getTitle());\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        ThemeHelper.setTitleToAppCompatActivity(getActivity(), getPreferenceScreen().getTitle());\n    }\n\n    @NonNull\n    public final <T extends Preference> T requirePreference(@StringRes final int resId) {\n        final T preference = findPreference(getString(resId));\n        Objects.requireNonNull(preference);\n        return preference;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.provider.Settings;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport androidx.appcompat.app.AppCompatDelegate;\nimport androidx.core.os.LocaleListCompat;\nimport androidx.preference.Preference;\n\nimport org.schabi.newpipe.DownloaderImpl;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.player.helper.PlayerHelper;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.image.ImageStrategy;\nimport org.schabi.newpipe.util.image.PreferredImageQuality;\n\nimport java.util.Locale;\n\nimport coil3.SingletonImageLoader;\n\npublic class ContentSettingsFragment extends BasePreferenceFragment {\n    private String youtubeRestrictedModeEnabledKey;\n\n    @Override\n    public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {\n        youtubeRestrictedModeEnabledKey = getString(R.string.youtube_restricted_mode_enabled);\n\n        addPreferencesFromResourceRegistry();\n\n        setupAppLanguagePreferences();\n        setupImageQualityPref();\n    }\n\n    private void setupAppLanguagePreferences() {\n        final Preference appLanguagePref = requirePreference(R.string.app_language_key);\n        // Android 13+ allows to set app specific languages\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n            appLanguagePref.setVisible(false);\n\n            final Preference newAppLanguagePref =\n                    requirePreference(R.string.app_language_android_13_and_up_key);\n            newAppLanguagePref.setSummaryProvider(preference -> {\n                final Locale loc = AppCompatDelegate.getApplicationLocales().get(0);\n                return loc != null ? loc.getDisplayName() : getString(R.string.systems_language);\n            });\n            newAppLanguagePref.setOnPreferenceClickListener(preference -> {\n                final Intent intent = new Intent(Settings.ACTION_APP_LOCALE_SETTINGS)\n                        .setData(Uri.fromParts(\"package\", requireContext().getPackageName(), null));\n                startActivity(intent);\n                return true;\n            });\n            newAppLanguagePref.setVisible(true);\n            return;\n        }\n\n        appLanguagePref.setOnPreferenceChangeListener((preference, newValue) -> {\n            final String language = (String) newValue;\n            final String systemLang = getString(R.string.default_localization_key);\n            final String tag = systemLang.equals(language) ? null : language;\n            AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(tag));\n            return true;\n        });\n    }\n\n    private void setupImageQualityPref() {\n        requirePreference(R.string.image_quality_key).setOnPreferenceChangeListener(\n            (preference, newValue) -> {\n                ImageStrategy.setPreferredImageQuality(PreferredImageQuality\n                    .fromPreferenceKey(requireContext(), (String) newValue));\n                final var loader = SingletonImageLoader.get(preference.getContext());\n                loader.getMemoryCache().clear();\n                loader.getDiskCache().clear();\n                Toast.makeText(preference.getContext(),\n                                R.string.thumbnail_cache_wipe_complete_notice, Toast.LENGTH_SHORT)\n                        .show();\n                return true;\n            });\n    }\n\n    @Override\n    public boolean onPreferenceTreeClick(final Preference preference) {\n        if (preference.getKey().equals(youtubeRestrictedModeEnabledKey)) {\n            final Context context = getContext();\n            if (context != null) {\n                DownloaderImpl.getInstance().updateYoutubeRestrictedModeCookies(context);\n            } else {\n                Log.w(TAG, \"onPreferenceTreeClick: null context\");\n            }\n        }\n\n        return super.onPreferenceTreeClick(preference);\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n\n        final Context context = requireContext();\n        NewPipe.setupLocalization(\n            Localization.getPreferredLocalization(context),\n            Localization.getPreferredContentCountry(context));\n        PlayerHelper.resetFormat();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/DebugSettingsFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.content.Intent;\nimport android.os.Bundle;\n\nimport androidx.preference.Preference;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.local.feed.notifications.NotificationWorker;\n\nimport java.util.Optional;\n\npublic class DebugSettingsFragment extends BasePreferenceFragment {\n    private static final String DUMMY = \"Dummy\";\n\n    @Override\n    public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {\n        addPreferencesFromResourceRegistry();\n\n        final Preference allowHeapDumpingPreference =\n                requirePreference(R.string.allow_heap_dumping_key);\n        final Preference showMemoryLeaksPreference =\n                requirePreference(R.string.show_memory_leaks_key);\n        final Preference checkNewStreamsPreference =\n                requirePreference(R.string.check_new_streams_key);\n        final Preference crashTheAppPreference =\n                requirePreference(R.string.crash_the_app_key);\n        final Preference showErrorSnackbarPreference =\n                requirePreference(R.string.show_error_snackbar_key);\n        final Preference createErrorNotificationPreference =\n                requirePreference(R.string.create_error_notification_key);\n\n\n        final Optional<DebugSettingsBVDLeakCanaryAPI> optBVLeakCanary = getBVDLeakCanary();\n\n        allowHeapDumpingPreference.setEnabled(optBVLeakCanary.isPresent());\n        showMemoryLeaksPreference.setEnabled(optBVLeakCanary.isPresent());\n\n        if (optBVLeakCanary.isPresent()) {\n            final DebugSettingsBVDLeakCanaryAPI pdLeakCanary = optBVLeakCanary.get();\n\n            showMemoryLeaksPreference.setOnPreferenceClickListener(preference -> {\n                startActivity(pdLeakCanary.getNewLeakDisplayActivityIntent());\n                return true;\n            });\n        } else {\n            allowHeapDumpingPreference.setSummary(R.string.leak_canary_not_available);\n            showMemoryLeaksPreference.setSummary(R.string.leak_canary_not_available);\n        }\n\n        checkNewStreamsPreference.setOnPreferenceClickListener(preference -> {\n            NotificationWorker.runNow(preference.getContext());\n            return true;\n        });\n\n        crashTheAppPreference.setOnPreferenceClickListener(preference -> {\n            throw new RuntimeException(DUMMY);\n        });\n\n        showErrorSnackbarPreference.setOnPreferenceClickListener(preference -> {\n            ErrorUtil.showUiErrorSnackbar(DebugSettingsFragment.this,\n                    DUMMY, new RuntimeException(DUMMY));\n            return true;\n        });\n\n        createErrorNotificationPreference.setOnPreferenceClickListener(preference -> {\n            ErrorUtil.createNotification(requireContext(),\n                    new ErrorInfo(new RuntimeException(DUMMY), UserAction.UI_ERROR, DUMMY));\n            return true;\n        });\n    }\n\n    /**\n     * Tries to find the {@link DebugSettingsBVDLeakCanaryAPI#IMPL_CLASS} and loads it if available.\n     * @return An {@link Optional} which is empty if the implementation class couldn't be loaded.\n     */\n    private Optional<DebugSettingsBVDLeakCanaryAPI> getBVDLeakCanary() {\n        try {\n            // Try to find the implementation of the LeakCanary API\n            return Optional.of((DebugSettingsBVDLeakCanaryAPI)\n                    Class.forName(DebugSettingsBVDLeakCanaryAPI.IMPL_CLASS)\n                            .getDeclaredConstructor()\n                            .newInstance());\n        } catch (final Exception e) {\n            return Optional.empty();\n        }\n    }\n\n    /**\n     * Build variant dependent (BVD) leak canary API for this fragment.\n     * Why is LeakCanary not used directly? Because it can't be assured\n     */\n    public interface DebugSettingsBVDLeakCanaryAPI {\n        String IMPL_CLASS =\n                \"org.schabi.newpipe.settings.DebugSettingsBVDLeakCanary\";\n\n        Intent getNewLeakDisplayActivityIntent();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.app.Activity;\nimport android.content.ContentResolver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.util.Log;\n\nimport androidx.activity.result.ActivityResult;\nimport androidx.activity.result.ActivityResultLauncher;\nimport androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.StringRes;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.preference.Preference;\nimport androidx.preference.SwitchPreferenceCompat;\n\nimport com.nononsenseapps.filepicker.Utils;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.streams.io.NoFileManagerSafeGuard;\nimport org.schabi.newpipe.streams.io.StoredDirectoryHelper;\nimport org.schabi.newpipe.util.FilePickerActivityHelper;\n\nimport java.io.File;\nimport java.io.IOException;\n\npublic class DownloadSettingsFragment extends BasePreferenceFragment {\n    public static final boolean IGNORE_RELEASE_ON_OLD_PATH = true;\n    private String downloadPathVideoPreference;\n    private String downloadPathAudioPreference;\n    private String storageUseSafPreference;\n\n    private Preference prefPathVideo;\n    private Preference prefPathAudio;\n    private Preference prefStorageAsk;\n\n    private Context ctx;\n    private final ActivityResultLauncher<Intent> requestDownloadVideoPathLauncher =\n            registerForActivityResult(\n                    new StartActivityForResult(), this::requestDownloadVideoPathResult);\n    private final ActivityResultLauncher<Intent> requestDownloadAudioPathLauncher =\n            registerForActivityResult(\n                    new StartActivityForResult(), this::requestDownloadAudioPathResult);\n\n    @Override\n    public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {\n        addPreferencesFromResourceRegistry();\n\n        downloadPathVideoPreference = getString(R.string.download_path_video_key);\n        downloadPathAudioPreference = getString(R.string.download_path_audio_key);\n        storageUseSafPreference = getString(R.string.storage_use_saf);\n        final String downloadStorageAsk = getString(R.string.downloads_storage_ask);\n\n        prefPathVideo = findPreference(downloadPathVideoPreference);\n        prefPathAudio = findPreference(downloadPathAudioPreference);\n        prefStorageAsk = findPreference(downloadStorageAsk);\n\n        final SwitchPreferenceCompat prefUseSaf = findPreference(storageUseSafPreference);\n        prefUseSaf.setChecked(NewPipeSettings.useStorageAccessFramework(ctx));\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n            prefUseSaf.setEnabled(false);\n            prefUseSaf.setSummary(R.string.downloads_storage_use_saf_summary_api_29);\n            prefStorageAsk.setSummary(R.string.downloads_storage_ask_summary_no_saf_notice);\n        }\n\n        updatePreferencesSummary();\n        updatePathPickers(!defaultPreferences.getBoolean(downloadStorageAsk, false));\n\n        if (hasInvalidPath(downloadPathVideoPreference)\n                || hasInvalidPath(downloadPathAudioPreference)) {\n            updatePreferencesSummary();\n        }\n\n        prefStorageAsk.setOnPreferenceChangeListener((preference, value) -> {\n            updatePathPickers(!(boolean) value);\n            return true;\n        });\n    }\n\n    @Override\n    public void onAttach(@NonNull final Context context) {\n        super.onAttach(context);\n        ctx = context;\n    }\n\n    @Override\n    public void onDetach() {\n        super.onDetach();\n        ctx = null;\n        prefStorageAsk.setOnPreferenceChangeListener(null);\n    }\n\n    private void updatePreferencesSummary() {\n        showPathInSummary(downloadPathVideoPreference, R.string.download_path_summary,\n                prefPathVideo);\n        showPathInSummary(downloadPathAudioPreference, R.string.download_path_audio_summary,\n                prefPathAudio);\n    }\n\n    private void showPathInSummary(final String prefKey, @StringRes final int defaultString,\n                                   final Preference target) {\n        final Uri uri = Uri.parse(defaultPreferences.getString(prefKey, \"\"));\n        if (uri.equals(Uri.EMPTY)) {\n            target.setSummary(getString(defaultString));\n            return;\n        }\n\n        final String summary = ContentResolver.SCHEME_FILE.equals(uri.getScheme())\n                ? uri.getPath() : uri.toString();\n        target.setSummary(summary);\n    }\n\n    private boolean isFileUri(final String path) {\n        return path.charAt(0) == File.separatorChar || path.startsWith(ContentResolver.SCHEME_FILE);\n    }\n\n    private boolean hasInvalidPath(final String prefKey) {\n        final String value = defaultPreferences.getString(prefKey, null);\n        return value == null || value.isEmpty();\n    }\n\n    private void updatePathPickers(final boolean enabled) {\n        prefPathVideo.setEnabled(enabled);\n        prefPathAudio.setEnabled(enabled);\n    }\n\n    // FIXME: after releasing the old path, all downloads created on the folder becomes inaccessible\n    private void forgetSAFTree(final Context context, final String oldPath) {\n        if (IGNORE_RELEASE_ON_OLD_PATH) {\n            return;\n        }\n\n        if (oldPath == null || oldPath.isEmpty() || isFileUri(oldPath)) {\n            return;\n        }\n\n        try {\n            final Uri uri = Uri.parse(oldPath);\n\n            context.getContentResolver()\n                    .releasePersistableUriPermission(uri, StoredDirectoryHelper.PERMISSION_FLAGS);\n            context.revokeUriPermission(uri, StoredDirectoryHelper.PERMISSION_FLAGS);\n\n            Log.i(TAG, \"Revoke old path permissions success on \" + oldPath);\n        } catch (final Exception err) {\n            Log.e(TAG, \"Error revoking old path permissions on \" + oldPath, err);\n        }\n    }\n\n    private void showMessageDialog(@StringRes final int title, @StringRes final int message) {\n        new AlertDialog.Builder(ctx)\n                .setTitle(title)\n                .setMessage(message)\n                .setPositiveButton(getString(R.string.ok), null)\n                .show();\n    }\n\n    @Override\n    public boolean onPreferenceTreeClick(@NonNull final Preference preference) {\n        if (DEBUG) {\n            Log.d(TAG, \"onPreferenceTreeClick() called with: \"\n                    + \"preference = [\" + preference + \"]\");\n        }\n\n        final String key = preference.getKey();\n\n        if (key.equals(storageUseSafPreference)) {\n            if (!NewPipeSettings.useStorageAccessFramework(ctx)) {\n                NewPipeSettings.saveDefaultVideoDownloadDirectory(ctx);\n                NewPipeSettings.saveDefaultAudioDownloadDirectory(ctx);\n            } else {\n                defaultPreferences.edit().putString(downloadPathVideoPreference, null)\n                        .putString(downloadPathAudioPreference, null).apply();\n            }\n            updatePreferencesSummary();\n            return true;\n        } else if (key.equals(downloadPathVideoPreference)) {\n            launchDirectoryPicker(requestDownloadVideoPathLauncher);\n        } else if (key.equals(downloadPathAudioPreference)) {\n            launchDirectoryPicker(requestDownloadAudioPathLauncher);\n        } else {\n            return super.onPreferenceTreeClick(preference);\n        }\n\n        return true;\n    }\n\n    private void launchDirectoryPicker(final ActivityResultLauncher<Intent> launcher) {\n        NoFileManagerSafeGuard.launchSafe(\n                launcher,\n                StoredDirectoryHelper.getPicker(ctx),\n                TAG,\n                ctx\n        );\n    }\n\n    private void requestDownloadVideoPathResult(final ActivityResult result) {\n        requestDownloadPathResult(result, downloadPathVideoPreference);\n    }\n\n    private void requestDownloadAudioPathResult(final ActivityResult result) {\n        requestDownloadPathResult(result, downloadPathAudioPreference);\n    }\n\n    private void requestDownloadPathResult(final ActivityResult result, final String key) {\n        if (result.getResultCode() != Activity.RESULT_OK) {\n            return;\n        }\n\n        Uri uri = null;\n        if (result.getData() != null) {\n            uri = result.getData().getData();\n        }\n        if (uri == null) {\n            showMessageDialog(R.string.general_error, R.string.invalid_directory);\n            return;\n        }\n\n\n        // revoke permissions on the old save path (required for SAF only)\n        final Context context = requireContext();\n\n        forgetSAFTree(context, defaultPreferences.getString(key, \"\"));\n\n        if (!FilePickerActivityHelper.isOwnFileUri(context, uri)) {\n            // steps to acquire the selected path:\n            //     1. acquire permissions on the new save path\n            //     2. save the new path, if step(2) was successful\n            try {\n                context.grantUriPermission(context.getPackageName(), uri,\n                        StoredDirectoryHelper.PERMISSION_FLAGS);\n\n                final StoredDirectoryHelper mainStorage =\n                        new StoredDirectoryHelper(context, uri, null);\n                Log.i(TAG, \"Acquiring tree success from \" + uri.toString());\n\n                if (!mainStorage.canWrite()) {\n                    throw new IOException(\"No write permissions on \" + uri.toString());\n                }\n            } catch (final IOException err) {\n                Log.e(TAG, \"Error acquiring tree from \" + uri.toString(), err);\n                showMessageDialog(R.string.general_error, R.string.no_available_dir);\n                return;\n            }\n        } else {\n            final File target = Utils.getFileForUri(uri);\n            if (!target.canWrite()) {\n                showMessageDialog(R.string.download_to_sdcard_error_title,\n                        R.string.download_to_sdcard_error_message);\n                return;\n            }\n            uri = Uri.fromFile(target);\n        }\n\n        defaultPreferences.edit().putString(key, uri.toString()).apply();\n        updatePreferencesSummary();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/ExoPlayerSettingsFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\n\nimport androidx.annotation.Nullable;\nimport androidx.preference.Preference;\nimport androidx.preference.PreferenceManager;\nimport androidx.preference.SwitchPreferenceCompat;\n\nimport org.schabi.newpipe.R;\n\npublic class ExoPlayerSettingsFragment extends BasePreferenceFragment {\n\n    @Override\n    public void onCreatePreferences(@Nullable final Bundle savedInstanceState,\n                                    @Nullable final String rootKey) {\n        addPreferencesFromResourceRegistry();\n\n        final String disabledMediaTunnelingAutomaticallyKey =\n                getString(R.string.disabled_media_tunneling_automatically_key);\n        final SwitchPreferenceCompat disableMediaTunnelingPref =\n                (SwitchPreferenceCompat) requirePreference(R.string.disable_media_tunneling_key);\n        final SharedPreferences prefs = PreferenceManager\n                .getDefaultSharedPreferences(requireContext());\n        final boolean mediaTunnelingAutomaticallyDisabled =\n                prefs.getInt(disabledMediaTunnelingAutomaticallyKey, -1) == 1;\n        final String summaryText = getString(R.string.disable_media_tunneling_summary);\n        disableMediaTunnelingPref.setSummary(mediaTunnelingAutomaticallyDisabled\n                ? summaryText + \" \" + getString(R.string.disable_media_tunneling_automatic_info)\n                : summaryText);\n\n        disableMediaTunnelingPref.setOnPreferenceChangeListener((Preference p, Object enabled) -> {\n                    if (Boolean.FALSE.equals(enabled)) {\n                        PreferenceManager.getDefaultSharedPreferences(requireContext())\n                                .edit()\n                                .putInt(disabledMediaTunnelingAutomaticallyKey, 0)\n                                .apply();\n                        // the info text might have been shown before\n                        p.setSummary(R.string.disable_media_tunneling_summary);\n                    }\n                    return true;\n                });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.preference.Preference;\n\nimport org.schabi.newpipe.DownloaderImpl;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.ReCaptchaActivity;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.local.history.HistoryRecordManager;\nimport org.schabi.newpipe.util.InfoCache;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\n\npublic class HistorySettingsFragment extends BasePreferenceFragment {\n    private String cacheWipeKey;\n    private String viewsHistoryClearKey;\n    private String playbackStatesClearKey;\n    private String searchHistoryClearKey;\n    private HistoryRecordManager recordManager;\n    private CompositeDisposable disposables;\n\n    @Override\n    public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {\n        addPreferencesFromResourceRegistry();\n\n        cacheWipeKey = getString(R.string.metadata_cache_wipe_key);\n        viewsHistoryClearKey = getString(R.string.clear_views_history_key);\n        playbackStatesClearKey = getString(R.string.clear_playback_states_key);\n        searchHistoryClearKey = getString(R.string.clear_search_history_key);\n        recordManager = new HistoryRecordManager(getActivity());\n        disposables = new CompositeDisposable();\n\n        final Preference clearCookiePref = requirePreference(R.string.clear_cookie_key);\n        clearCookiePref.setOnPreferenceClickListener(preference -> {\n            defaultPreferences.edit()\n                    .putString(getString(R.string.recaptcha_cookies_key), \"\").apply();\n            DownloaderImpl.getInstance().setCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY, \"\");\n            Toast.makeText(getActivity(), R.string.recaptcha_cookies_cleared,\n                    Toast.LENGTH_SHORT).show();\n            clearCookiePref.setEnabled(false);\n            return true;\n        });\n\n        if (defaultPreferences.getString(getString(R.string.recaptcha_cookies_key), \"\").isEmpty()) {\n            clearCookiePref.setEnabled(false);\n        }\n    }\n\n    @Override\n    public boolean onPreferenceTreeClick(final Preference preference) {\n        if (preference.getKey().equals(cacheWipeKey)) {\n            InfoCache.getInstance().clearCache();\n            Toast.makeText(requireContext(),\n                    R.string.metadata_cache_wipe_complete_notice, Toast.LENGTH_SHORT).show();\n        } else if (preference.getKey().equals(viewsHistoryClearKey)) {\n            openDeleteWatchHistoryDialog(requireContext(), recordManager, disposables);\n        } else if (preference.getKey().equals(playbackStatesClearKey)) {\n            openDeletePlaybackStatesDialog(requireContext(), recordManager, disposables);\n        } else if (preference.getKey().equals(searchHistoryClearKey)) {\n            openDeleteSearchHistoryDialog(requireContext(), recordManager, disposables);\n        } else {\n            return super.onPreferenceTreeClick(preference);\n        }\n        return true;\n    }\n\n    private static Disposable getDeletePlaybackStatesDisposable(\n            @NonNull final Context context, final HistoryRecordManager recordManager) {\n        return recordManager.deleteCompleteStreamStateHistory()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(\n                        howManyDeleted -> Toast.makeText(context,\n                                R.string.watch_history_states_deleted,  Toast.LENGTH_SHORT).show(),\n                        throwable -> ErrorUtil.openActivity(context,\n                                new ErrorInfo(throwable, UserAction.DELETE_FROM_HISTORY,\n                                        \"Delete playback states\")));\n    }\n\n    private static Disposable getWholeStreamHistoryDisposable(\n            @NonNull final Context context, final HistoryRecordManager recordManager) {\n        return recordManager.deleteWholeStreamHistory()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(\n                        howManyDeleted -> Toast.makeText(context,\n                                R.string.watch_history_deleted, Toast.LENGTH_SHORT).show(),\n                        throwable -> ErrorUtil.openActivity(context,\n                                new ErrorInfo(throwable, UserAction.DELETE_FROM_HISTORY,\n                                        \"Delete from history\")));\n    }\n\n    private static Disposable getRemoveOrphanedRecordsDisposable(\n            @NonNull final Context context, final HistoryRecordManager recordManager) {\n        return recordManager.removeOrphanedRecords()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(\n                        howManyDeleted -> { },\n                        throwable -> ErrorUtil.openActivity(context,\n                                new ErrorInfo(throwable, UserAction.DELETE_FROM_HISTORY,\n                                        \"Clear orphaned records\")));\n    }\n\n    private static Disposable getDeleteSearchHistoryDisposable(\n            @NonNull final Context context, final HistoryRecordManager recordManager) {\n        return recordManager.deleteCompleteSearchHistory()\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(\n                        howManyDeleted -> Toast.makeText(context,\n                                R.string.search_history_deleted, Toast.LENGTH_SHORT).show(),\n                        throwable -> ErrorUtil.openActivity(context,\n                                new ErrorInfo(throwable, UserAction.DELETE_FROM_HISTORY,\n                                        \"Delete search history\")));\n    }\n\n    public static void openDeleteWatchHistoryDialog(@NonNull final Context context,\n                                                    final HistoryRecordManager recordManager,\n                                                    final CompositeDisposable disposables) {\n        new AlertDialog.Builder(context)\n                .setTitle(R.string.delete_view_history_alert)\n                .setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss()))\n                .setPositiveButton(R.string.delete, ((dialog, which) -> {\n                    disposables.add(getDeletePlaybackStatesDisposable(context, recordManager));\n                    disposables.add(getWholeStreamHistoryDisposable(context, recordManager));\n                    disposables.add(getRemoveOrphanedRecordsDisposable(context, recordManager));\n                }))\n                .show();\n    }\n\n    public static void openDeletePlaybackStatesDialog(@NonNull final Context context,\n                                                      final HistoryRecordManager recordManager,\n                                                      final CompositeDisposable disposables) {\n        new AlertDialog.Builder(context)\n                .setTitle(R.string.delete_playback_states_alert)\n                .setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss()))\n                .setPositiveButton(R.string.delete, ((dialog, which) ->\n                        disposables.add(getDeletePlaybackStatesDisposable(context, recordManager))))\n                .show();\n    }\n\n    public static void openDeleteSearchHistoryDialog(@NonNull final Context context,\n                                                     final HistoryRecordManager recordManager,\n                                                     final CompositeDisposable disposables) {\n        new AlertDialog.Builder(context)\n                .setTitle(R.string.delete_search_history_alert)\n                .setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss()))\n                .setPositiveButton(R.string.delete, ((dialog, which) ->\n                        disposables.add(getDeleteSearchHistoryDisposable(context, recordManager))))\n                .show();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/MainSettingsFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.os.Bundle;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.util.ReleaseVersionUtil;\n\npublic class MainSettingsFragment extends BasePreferenceFragment {\n    public static final boolean DEBUG = MainActivity.DEBUG;\n\n    private SettingsActivity settingsActivity;\n\n    @Override\n    public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {\n        addPreferencesFromResourceRegistry();\n\n        setHasOptionsMenu(true); // Otherwise onCreateOptionsMenu is not called\n\n        // Check if the app is updatable\n        if (!ReleaseVersionUtil.INSTANCE.isReleaseApk()) {\n            getPreferenceScreen().removePreference(\n                    requirePreference(R.string.update_pref_screen_key));\n\n            defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), false).apply();\n        }\n\n        // Hide debug preferences in RELEASE build variant\n        if (!DEBUG) {\n            getPreferenceScreen().removePreference(\n                    requirePreference(R.string.debug_pref_screen_key));\n        }\n    }\n\n    @Override\n    public void onCreateOptionsMenu(\n            @NonNull final Menu menu,\n            @NonNull final MenuInflater inflater\n    ) {\n        super.onCreateOptionsMenu(menu, inflater);\n\n        // -- Link settings activity and register menu --\n        settingsActivity = (SettingsActivity) getActivity();\n\n        inflater.inflate(R.menu.menu_settings_main_fragment, menu);\n\n        final MenuItem menuSearchItem = menu.getItem(0);\n\n        settingsActivity.setMenuSearchItem(menuSearchItem);\n\n        menuSearchItem.setOnMenuItemClickListener(ev -> {\n            settingsActivity.setSearchActive(true);\n            return true;\n        });\n    }\n\n    @Override\n    public void onDestroy() {\n        // Unlink activity so that we don't get memory problems\n        if (settingsActivity != null) {\n            settingsActivity.setMenuSearchItem(null);\n            settingsActivity = null;\n        }\n        super.onDestroy();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/NewPipeSettings.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.os.Build;\nimport android.os.Environment;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.StringRes;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.App;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.settings.migration.MigrationManager;\nimport org.schabi.newpipe.util.DeviceUtils;\n\nimport java.io.File;\nimport java.util.Set;\n\n/*\n * Created by k3b on 07.01.2016.\n *\n * Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org>\n * NewPipeSettings.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/**\n * Helper class for global settings.\n */\npublic final class NewPipeSettings {\n    private NewPipeSettings() { }\n\n    public static void initSettings(final Context context) {\n        // first run migrations, then setDefaultValues, since the latter requires the correct types\n        MigrationManager.runMigrationsIfNeeded(context);\n\n        // readAgain is true so that if new settings are added their default value is set\n        PreferenceManager.setDefaultValues(context, R.xml.main_settings, true);\n        PreferenceManager.setDefaultValues(context, R.xml.video_audio_settings, true);\n        PreferenceManager.setDefaultValues(context, R.xml.download_settings, true);\n        PreferenceManager.setDefaultValues(context, R.xml.appearance_settings, true);\n        PreferenceManager.setDefaultValues(context, R.xml.history_settings, true);\n        PreferenceManager.setDefaultValues(context, R.xml.content_settings, true);\n        PreferenceManager.setDefaultValues(context, R.xml.player_notification_settings, true);\n        PreferenceManager.setDefaultValues(context, R.xml.update_settings, true);\n        PreferenceManager.setDefaultValues(context, R.xml.debug_settings, true);\n        PreferenceManager.setDefaultValues(context, R.xml.backup_restore_settings, true);\n\n        saveDefaultVideoDownloadDirectory(context);\n        saveDefaultAudioDownloadDirectory(context);\n\n        disableMediaTunnelingIfNecessary(context);\n    }\n\n    static void saveDefaultVideoDownloadDirectory(final Context context) {\n        saveDefaultDirectory(context, R.string.download_path_video_key,\n                Environment.DIRECTORY_MOVIES);\n    }\n\n    static void saveDefaultAudioDownloadDirectory(final Context context) {\n        saveDefaultDirectory(context, R.string.download_path_audio_key,\n                Environment.DIRECTORY_MUSIC);\n    }\n\n    private static void saveDefaultDirectory(final Context context, final int keyID,\n                                             final String defaultDirectoryName) {\n        if (!useStorageAccessFramework(context)) {\n            final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);\n            final String key = context.getString(keyID);\n            final String downloadPath = prefs.getString(key, null);\n            if (!isNullOrEmpty(downloadPath)) {\n                return;\n            }\n\n            final SharedPreferences.Editor spEditor = prefs.edit();\n            spEditor.putString(key, getNewPipeChildFolderPathForDir(getDir(defaultDirectoryName)));\n            spEditor.apply();\n        }\n    }\n\n    @NonNull\n    public static File getDir(final String defaultDirectoryName) {\n        return new File(Environment.getExternalStorageDirectory(), defaultDirectoryName);\n    }\n\n    private static String getNewPipeChildFolderPathForDir(final File dir) {\n        return new File(dir, \"NewPipe\").toURI().toString();\n    }\n\n    public static boolean useStorageAccessFramework(final Context context) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n            return true;\n        } else if (DeviceUtils.isFireTv()) {\n            // There's a FireOS bug which prevents SAF open/close dialogs from being confirmed with\n            // a remote (see #6455).\n            return false;\n        }\n\n        final String key = context.getString(R.string.storage_use_saf);\n        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);\n\n        return prefs.getBoolean(key, true);\n    }\n\n    private static boolean showSearchSuggestions(final Context context,\n                                                 final SharedPreferences sharedPreferences,\n                                                 @StringRes final int key) {\n        final Set<String> enabledSearchSuggestions = sharedPreferences.getStringSet(\n                context.getString(R.string.show_search_suggestions_key), null);\n\n        if (enabledSearchSuggestions == null) {\n            return true; // defaults to true\n        } else {\n            return enabledSearchSuggestions.contains(context.getString(key));\n        }\n    }\n\n    public static boolean showLocalSearchSuggestions(final Context context,\n                                                     final SharedPreferences sharedPreferences) {\n        return showSearchSuggestions(context, sharedPreferences,\n                R.string.show_local_search_suggestions_key);\n    }\n\n    public static boolean showRemoteSearchSuggestions(final Context context,\n                                                      final SharedPreferences sharedPreferences) {\n        return showSearchSuggestions(context, sharedPreferences,\n                R.string.show_remote_search_suggestions_key);\n    }\n\n    private static void disableMediaTunnelingIfNecessary(@NonNull final Context context) {\n        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);\n        final String disabledTunnelingKey = context.getString(R.string.disable_media_tunneling_key);\n        final String disabledTunnelingAutomaticallyKey =\n                context.getString(R.string.disabled_media_tunneling_automatically_key);\n        final String blacklistVersionKey =\n                context.getString(R.string.media_tunneling_device_blacklist_version);\n\n        final int lastMediaTunnelingUpdate = prefs.getInt(blacklistVersionKey, 0);\n        final boolean wasDeviceBlacklistUpdated =\n                DeviceUtils.MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION != lastMediaTunnelingUpdate;\n        final boolean wasMediaTunnelingEnabledByUser =\n                prefs.getInt(disabledTunnelingAutomaticallyKey, -1) == 0\n                        && !prefs.getBoolean(disabledTunnelingKey, false);\n\n        if (App.getInstance().isFirstRun()\n                || (wasDeviceBlacklistUpdated && !wasMediaTunnelingEnabledByUser)) {\n            setMediaTunneling(context);\n        }\n    }\n\n    /**\n     * Check if device does not support media tunneling\n     * and disable that exoplayer feature if necessary.\n     * @see DeviceUtils#shouldSupportMediaTunneling()\n     * @param context\n     */\n    public static void setMediaTunneling(@NonNull final Context context) {\n        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);\n        if (!DeviceUtils.shouldSupportMediaTunneling()) {\n            prefs.edit()\n                    .putBoolean(context.getString(R.string.disable_media_tunneling_key), true)\n                    .putInt(context.getString(\n                            R.string.disabled_media_tunneling_automatically_key), 1)\n                    .putInt(context.getString(R.string.media_tunneling_device_blacklist_version),\n                            DeviceUtils.MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION)\n                    .apply();\n        } else {\n            prefs.edit()\n                    .putInt(context.getString(R.string.media_tunneling_device_blacklist_version),\n                            DeviceUtils.MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION).apply();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/NotificationSettingsFragment.kt",
    "content": "package org.schabi.newpipe.settings\n\nimport android.os.Bundle\n\nclass NotificationSettingsFragment : BasePreferenceFragment() {\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        addPreferencesFromResourceRegistry()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/NotificationsSettingsFragment.kt",
    "content": "package org.schabi.newpipe.settings\n\nimport android.content.SharedPreferences\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener\nimport android.graphics.Color\nimport android.os.Build\nimport android.os.Bundle\nimport androidx.preference.Preference\nimport androidx.preference.SwitchPreference\nimport com.google.android.material.snackbar.Snackbar\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.disposables.Disposable\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.subscription.NotificationMode\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\nimport org.schabi.newpipe.error.ErrorInfo\nimport org.schabi.newpipe.error.ErrorUtil\nimport org.schabi.newpipe.error.UserAction\nimport org.schabi.newpipe.local.feed.notifications.NotificationHelper\nimport org.schabi.newpipe.local.feed.notifications.NotificationWorker\nimport org.schabi.newpipe.local.feed.notifications.ScheduleOptions\nimport org.schabi.newpipe.local.subscription.SubscriptionManager\n\nclass NotificationsSettingsFragment : BasePreferenceFragment(), OnSharedPreferenceChangeListener {\n\n    private var streamsNotificationsPreference: SwitchPreference? = null\n    private var notificationWarningSnackbar: Snackbar? = null\n    private var loader: Disposable? = null\n\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        addPreferencesFromResource(R.xml.notifications_settings)\n        streamsNotificationsPreference = requirePreference(R.string.enable_streams_notifications)\n\n        // main check is done in onResume, but also do it here to prevent flickering\n        updateEnabledState(NotificationHelper.areNotificationsEnabledOnDevice(requireContext()))\n    }\n\n    override fun onStart() {\n        super.onStart()\n        defaultPreferences.registerOnSharedPreferenceChangeListener(this)\n    }\n\n    override fun onStop() {\n        defaultPreferences.unregisterOnSharedPreferenceChangeListener(this)\n        super.onStop()\n    }\n\n    override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {\n        val context = context ?: return\n        if (key == getString(R.string.streams_notifications_interval_key) ||\n            key == getString(R.string.streams_notifications_network_key)\n        ) {\n            // apply new configuration\n            NotificationWorker.schedule(context, ScheduleOptions.from(context), true)\n        } else if (key == getString(R.string.enable_streams_notifications)) {\n            if (NotificationHelper.areNewStreamsNotificationsEnabled(context)) {\n                // Start the worker, because notifications were disabled previously.\n                NotificationWorker.schedule(context)\n            } else {\n                // The user disabled the notifications. Cancel the worker to save energy.\n                // A new one will be created once the notifications are enabled again.\n                NotificationWorker.cancel(context)\n            }\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        // Check whether the notifications are disabled in the device's app settings.\n        // If they are disabled, show a snackbar informing the user about that\n        // while allowing them to open the device's app settings.\n        val enabled = NotificationHelper.areNotificationsEnabledOnDevice(requireContext())\n        updateEnabledState(enabled)\n        if (!enabled) {\n            if (notificationWarningSnackbar == null) {\n                notificationWarningSnackbar = Snackbar.make(\n                    listView,\n                    R.string.notifications_disabled,\n                    Snackbar.LENGTH_INDEFINITE\n                ).apply {\n                    setAction(R.string.settings) {\n                        NotificationHelper.openNewPipeSystemNotificationSettings(it.context)\n                    }\n                    setActionTextColor(Color.YELLOW)\n                    addCallback(object : Snackbar.Callback() {\n                        override fun onDismissed(transientBottomBar: Snackbar, event: Int) {\n                            super.onDismissed(transientBottomBar, event)\n                            notificationWarningSnackbar = null\n                        }\n                    })\n                    show()\n                }\n            }\n        }\n\n        // (Re-)Create loader\n        loader?.dispose()\n        loader = SubscriptionManager(requireContext())\n            .subscriptions()\n            .observeOn(AndroidSchedulers.mainThread())\n            .subscribe(this::updateSubscriptions, this::onError)\n    }\n\n    override fun onPause() {\n        loader?.dispose()\n        loader = null\n\n        notificationWarningSnackbar?.dismiss()\n        notificationWarningSnackbar = null\n\n        super.onPause()\n    }\n\n    private fun updateEnabledState(enabled: Boolean) {\n        // On Android 13 player notifications are exempt from notification settings\n        // so the preferences in app should always be available.\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n            streamsNotificationsPreference?.isEnabled = enabled\n        } else {\n            preferenceScreen.isEnabled = enabled\n        }\n    }\n\n    private fun updateSubscriptions(subscriptions: List<SubscriptionEntity>) {\n        val notified = subscriptions.count { it.notificationMode != NotificationMode.DISABLED }\n        val preference = requirePreference<Preference>(R.string.streams_notifications_channels_key)\n        preference.summary = \"$notified/${subscriptions.size}\"\n    }\n\n    private fun onError(e: Throwable) {\n        ErrorUtil.showSnackbar(\n            this,\n            ErrorInfo(e, UserAction.SUBSCRIPTION_GET, \"Get subscriptions list\")\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\nimport android.text.InputType;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.RadioButton;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.fragment.app.Fragment;\nimport androidx.preference.PreferenceManager;\nimport androidx.recyclerview.widget.DiffUtil;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.ListAdapter;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.grack.nanojson.JsonStringWriter;\nimport com.grack.nanojson.JsonWriter;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.DialogEditTextBinding;\nimport org.schabi.newpipe.databinding.FragmentInstanceListBinding;\nimport org.schabi.newpipe.databinding.ItemInstanceBinding;\nimport org.schabi.newpipe.extractor.services.peertube.PeertubeInstance;\nimport org.schabi.newpipe.util.Constants;\nimport org.schabi.newpipe.util.PeertubeHelper;\nimport org.schabi.newpipe.util.ThemeHelper;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic class PeertubeInstanceListFragment extends Fragment {\n    private PeertubeInstance selectedInstance;\n    private String savedInstanceListKey;\n    private InstanceListAdapter instanceListAdapter;\n\n    private FragmentInstanceListBinding binding;\n    private SharedPreferences sharedPreferences;\n\n    private CompositeDisposable disposables = new CompositeDisposable();\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Lifecycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(@Nullable final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext());\n        savedInstanceListKey = getString(R.string.peertube_instance_list_key);\n        selectedInstance = PeertubeHelper.getCurrentInstance();\n\n        setHasOptionsMenu(true);\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        binding = FragmentInstanceListBinding.inflate(inflater, container, false);\n        return binding.getRoot();\n    }\n\n    @Override\n    public void onViewCreated(@NonNull final View rootView,\n                              @Nullable final Bundle savedInstanceState) {\n        super.onViewCreated(rootView, savedInstanceState);\n\n        binding.instanceHelpTV.setText(getString(R.string.peertube_instance_url_help,\n                getString(R.string.peertube_instance_list_url)));\n        binding.addInstanceButton.setOnClickListener(v -> showAddItemDialog(requireContext()));\n        binding.instances.setLayoutManager(new LinearLayoutManager(requireContext()));\n\n        final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());\n        itemTouchHelper.attachToRecyclerView(binding.instances);\n\n        instanceListAdapter = new InstanceListAdapter(requireContext(), itemTouchHelper);\n        binding.instances.setAdapter(instanceListAdapter);\n        instanceListAdapter.submitList(PeertubeHelper.getInstanceList(requireContext()));\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        ThemeHelper.setTitleToAppCompatActivity(getActivity(),\n                getString(R.string.peertube_instance_url_title));\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        saveChanges();\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        if (disposables != null) {\n            disposables.clear();\n        }\n        disposables = null;\n    }\n\n    @Override\n    public void onDestroyView() {\n        binding = null;\n        super.onDestroyView();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Menu\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) {\n        super.onCreateOptionsMenu(menu, inflater);\n        inflater.inflate(R.menu.menu_chooser_fragment, menu);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(final MenuItem item) {\n        if (item.getItemId() == R.id.menu_item_restore_default) {\n            restoreDefaults();\n            return true;\n        }\n\n        return super.onOptionsItemSelected(item);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void selectInstance(final PeertubeInstance instance) {\n        selectedInstance = PeertubeHelper.selectInstance(instance, requireContext());\n        sharedPreferences.edit().putBoolean(Constants.KEY_MAIN_PAGE_CHANGE, true).apply();\n    }\n\n    private void saveChanges() {\n        final JsonStringWriter jsonWriter = JsonWriter.string().object().array(\"instances\");\n        for (final PeertubeInstance instance : instanceListAdapter.getCurrentList()) {\n            jsonWriter.object();\n            jsonWriter.value(\"name\", instance.getName());\n            jsonWriter.value(\"url\", instance.getUrl());\n            jsonWriter.end();\n        }\n        final String jsonToSave = jsonWriter.end().end().done();\n        sharedPreferences.edit().putString(savedInstanceListKey, jsonToSave).apply();\n    }\n\n    private void restoreDefaults() {\n        final Context context = requireContext();\n        new AlertDialog.Builder(context)\n                .setTitle(R.string.restore_defaults)\n                .setMessage(R.string.restore_defaults_confirmation)\n                .setNegativeButton(R.string.cancel, null)\n                .setPositiveButton(R.string.ok, (dialog, which) -> {\n                    sharedPreferences.edit().remove(savedInstanceListKey).apply();\n                    selectInstance(PeertubeInstance.DEFAULT_INSTANCE);\n                    instanceListAdapter.submitList(PeertubeHelper.getInstanceList(context));\n                })\n                .show();\n    }\n\n    private void showAddItemDialog(final Context c) {\n        final var dialogBinding = DialogEditTextBinding.inflate(getLayoutInflater());\n        dialogBinding.dialogEditText.setInputType(\n                InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI);\n        dialogBinding.dialogEditText.setHint(R.string.peertube_instance_add_help);\n\n        new AlertDialog.Builder(c)\n                .setTitle(R.string.peertube_instance_add_title)\n                .setIcon(R.drawable.ic_placeholder_peertube)\n                .setView(dialogBinding.getRoot())\n                .setNegativeButton(R.string.cancel, null)\n                .setPositiveButton(R.string.ok, (dialog1, which) -> {\n                    final String url = dialogBinding.dialogEditText.getText().toString();\n                    addInstance(url);\n                })\n                .show();\n    }\n\n    private void addInstance(final String url) {\n        final String cleanUrl = cleanUrl(url);\n        if (cleanUrl == null) {\n            return;\n        }\n        binding.loadingProgressBar.setVisibility(View.VISIBLE);\n        final Disposable disposable = Single.fromCallable(() -> {\n            final PeertubeInstance instance = new PeertubeInstance(cleanUrl);\n            instance.fetchInstanceMetaData();\n            return instance;\n        }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())\n                .subscribe((instance) -> {\n                    binding.loadingProgressBar.setVisibility(View.GONE);\n                    add(instance);\n                }, e -> {\n                    binding.loadingProgressBar.setVisibility(View.GONE);\n                    Toast.makeText(getActivity(), R.string.peertube_instance_add_fail,\n                            Toast.LENGTH_SHORT).show();\n                });\n        disposables.add(disposable);\n    }\n\n    @Nullable\n    private String cleanUrl(final String url) {\n        String cleanUrl = url.trim();\n        // if protocol not present, add https\n        if (!cleanUrl.startsWith(\"http\")) {\n            cleanUrl = \"https://\" + cleanUrl;\n        }\n        // remove trailing slash\n        cleanUrl = cleanUrl.replaceAll(\"/$\", \"\");\n        // only allow https\n        if (!cleanUrl.startsWith(\"https://\")) {\n            Toast.makeText(getActivity(), R.string.peertube_instance_add_https_only,\n                    Toast.LENGTH_SHORT).show();\n            return null;\n        }\n        // only allow if not already exists\n        for (final PeertubeInstance instance : instanceListAdapter.getCurrentList()) {\n            if (instance.getUrl().equals(cleanUrl)) {\n                Toast.makeText(getActivity(), R.string.peertube_instance_add_exists,\n                        Toast.LENGTH_SHORT).show();\n                return null;\n            }\n        }\n        return cleanUrl;\n    }\n\n    private void add(final PeertubeInstance instance) {\n        final var list = new ArrayList<>(instanceListAdapter.getCurrentList());\n        list.add(instance);\n        instanceListAdapter.submitList(list);\n    }\n\n    private ItemTouchHelper.SimpleCallback getItemTouchCallback() {\n        return new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,\n                ItemTouchHelper.START | ItemTouchHelper.END) {\n            @Override\n            public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView,\n                                                    final int viewSize,\n                                                    final int viewSizeOutOfBounds,\n                                                    final int totalSize,\n                                                    final long msSinceStartScroll) {\n                final int standardSpeed = super.interpolateOutOfBoundsScroll(recyclerView, viewSize,\n                        viewSizeOutOfBounds, totalSize, msSinceStartScroll);\n                final int minimumAbsVelocity = Math.max(12, Math.abs(standardSpeed));\n                return minimumAbsVelocity * (int) Math.signum(viewSizeOutOfBounds);\n            }\n\n            @Override\n            public boolean onMove(@NonNull final RecyclerView recyclerView,\n                                  @NonNull final RecyclerView.ViewHolder source,\n                                  @NonNull final RecyclerView.ViewHolder target) {\n                if (source.getItemViewType() != target.getItemViewType()\n                        || instanceListAdapter == null) {\n                    return false;\n                }\n\n                final int sourceIndex = source.getBindingAdapterPosition();\n                final int targetIndex = target.getBindingAdapterPosition();\n                instanceListAdapter.swapItems(sourceIndex, targetIndex);\n                return true;\n            }\n\n            @Override\n            public boolean isLongPressDragEnabled() {\n                return false;\n            }\n\n            @Override\n            public boolean isItemViewSwipeEnabled() {\n                return true;\n            }\n\n            @Override\n            public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder,\n                                 final int swipeDir) {\n                final int position = viewHolder.getBindingAdapterPosition();\n                // do not allow swiping the selected instance\n                if (instanceListAdapter.getCurrentList().get(position).getUrl()\n                        .equals(selectedInstance.getUrl())) {\n                    instanceListAdapter.notifyItemChanged(position);\n                    return;\n                }\n                final var list = new ArrayList<>(instanceListAdapter.getCurrentList());\n                list.remove(position);\n\n                if (list.isEmpty()) {\n                    list.add(selectedInstance);\n                }\n\n                instanceListAdapter.submitList(list);\n            }\n        };\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // List Handling\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private class InstanceListAdapter\n            extends ListAdapter<PeertubeInstance, InstanceListAdapter.TabViewHolder> {\n        private final LayoutInflater inflater;\n        private final ItemTouchHelper itemTouchHelper;\n        private RadioButton lastChecked;\n\n        InstanceListAdapter(final Context context, final ItemTouchHelper itemTouchHelper) {\n            super(new PeertubeInstanceCallback());\n            this.itemTouchHelper = itemTouchHelper;\n            this.inflater = LayoutInflater.from(context);\n        }\n\n        public void swapItems(final int fromPosition, final int toPosition) {\n            final var list = new ArrayList<>(getCurrentList());\n            Collections.swap(list, fromPosition, toPosition);\n            submitList(list);\n        }\n\n        @NonNull\n        @Override\n        public InstanceListAdapter.TabViewHolder onCreateViewHolder(@NonNull final ViewGroup parent,\n                                                                    final int viewType) {\n            return new InstanceListAdapter.TabViewHolder(ItemInstanceBinding.inflate(inflater,\n                    parent, false));\n        }\n\n        @Override\n        public void onBindViewHolder(@NonNull final InstanceListAdapter.TabViewHolder holder,\n                                     final int position) {\n            holder.bind(position);\n        }\n\n        class TabViewHolder extends RecyclerView.ViewHolder {\n            private final ItemInstanceBinding itemBinding;\n\n            TabViewHolder(final ItemInstanceBinding binding) {\n                super(binding.getRoot());\n                this.itemBinding = binding;\n            }\n\n            @SuppressLint(\"ClickableViewAccessibility\")\n            void bind(final int position) {\n                itemBinding.handle.setOnTouchListener((view, motionEvent) -> {\n                    if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {\n                        if (itemTouchHelper != null && getItemCount() > 1) {\n                            itemTouchHelper.startDrag(this);\n                            return true;\n                        }\n                    }\n                    return false;\n                });\n\n                final PeertubeInstance instance = getItem(position);\n                itemBinding.instanceName.setText(instance.getName());\n                itemBinding.instanceUrl.setText(instance.getUrl());\n                itemBinding.selectInstanceRB.setOnCheckedChangeListener(null);\n                if (selectedInstance.getUrl().equals(instance.getUrl())) {\n                    if (lastChecked != null && lastChecked != itemBinding.selectInstanceRB) {\n                        lastChecked.setChecked(false);\n                    }\n                    itemBinding.selectInstanceRB.setChecked(true);\n                    lastChecked = itemBinding.selectInstanceRB;\n                }\n                itemBinding.selectInstanceRB.setOnCheckedChangeListener((buttonView, isChecked) -> {\n                    if (isChecked) {\n                        selectInstance(instance);\n                        if (lastChecked != null && lastChecked != itemBinding.selectInstanceRB) {\n                            lastChecked.setChecked(false);\n                        }\n                        lastChecked = itemBinding.selectInstanceRB;\n                    }\n                });\n                itemBinding.instanceIcon.setImageResource(R.drawable.ic_placeholder_peertube);\n            }\n        }\n    }\n\n    private static final class PeertubeInstanceCallback\n            extends DiffUtil.ItemCallback<PeertubeInstance> {\n        @Override\n        public boolean areItemsTheSame(@NonNull final PeertubeInstance oldItem,\n                                       @NonNull final PeertubeInstance newItem) {\n            return oldItem.getUrl().equals(newItem.getUrl());\n        }\n\n        @Override\n        public boolean areContentsTheSame(@NonNull final PeertubeInstance oldItem,\n                                          @NonNull final PeertubeInstance newItem) {\n            return oldItem.getName().equals(newItem.getName())\n                    && oldItem.getUrl().equals(newItem.getUrl());\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/PlayerNotificationSettingsFragment.kt",
    "content": "package org.schabi.newpipe.settings\n\nimport android.os.Bundle\n\nclass PlayerNotificationSettingsFragment : BasePreferenceFragment() {\n    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {\n        addPreferencesFromResourceRegistry()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.content.DialogInterface;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.local.subscription.SubscriptionManager;\nimport org.schabi.newpipe.util.ThemeHelper;\nimport org.schabi.newpipe.util.image.CoilHelper;\n\nimport java.util.List;\nimport java.util.Vector;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Observer;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\n/**\n * Created by Christian Schabesberger on 26.09.17.\n * SelectChannelFragment.java is part of NewPipe.\n * <p>\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * </p>\n * <p>\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * </p>\n * <p>\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n * </p>\n */\n\npublic class SelectChannelFragment extends DialogFragment {\n\n    private OnSelectedListener onSelectedListener = null;\n    private OnCancelListener onCancelListener = null;\n\n    private ProgressBar progressBar;\n    private TextView emptyView;\n    private RecyclerView recyclerView;\n\n    private List<SubscriptionEntity> subscriptions = new Vector<>();\n\n    public void setOnSelectedListener(final OnSelectedListener listener) {\n        onSelectedListener = listener;\n    }\n\n    public void setOnCancelListener(final OnCancelListener listener) {\n        onCancelListener = listener;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(@Nullable final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setStyle(STYLE_NO_TITLE, ThemeHelper.getMinWidthDialogTheme(requireContext()));\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        final View v = inflater.inflate(R.layout.select_channel_fragment, container, false);\n        recyclerView = v.findViewById(R.id.items_list);\n        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));\n        final SelectChannelAdapter channelAdapter = new SelectChannelAdapter();\n        recyclerView.setAdapter(channelAdapter);\n\n        progressBar = v.findViewById(R.id.progressBar);\n        emptyView = v.findViewById(R.id.empty_state_view);\n        progressBar.setVisibility(View.VISIBLE);\n        recyclerView.setVisibility(View.GONE);\n        emptyView.setVisibility(View.GONE);\n\n\n        final SubscriptionManager subscriptionManager = new SubscriptionManager(requireContext());\n        subscriptionManager.subscriptions().toObservable()\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(getSubscriptionObserver());\n\n        return v;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Handle actions\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCancel(@NonNull final DialogInterface dialogInterface) {\n        super.onCancel(dialogInterface);\n        if (onCancelListener != null) {\n            onCancelListener.onCancel();\n        }\n    }\n\n    private void clickedItem(final int position) {\n        if (onSelectedListener != null) {\n            final SubscriptionEntity entry = subscriptions.get(position);\n            onSelectedListener\n                    .onChannelSelected(entry.getServiceId(), entry.getUrl(), entry.getName());\n        }\n        dismiss();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Item handling\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void displayChannels(final List<SubscriptionEntity> newSubscriptions) {\n        this.subscriptions = newSubscriptions;\n        progressBar.setVisibility(View.GONE);\n        if (newSubscriptions.isEmpty()) {\n            emptyView.setVisibility(View.VISIBLE);\n            return;\n        }\n        recyclerView.setVisibility(View.VISIBLE);\n\n    }\n\n    private Observer<List<SubscriptionEntity>> getSubscriptionObserver() {\n        return new Observer<List<SubscriptionEntity>>() {\n            @Override\n            public void onSubscribe(@NonNull final Disposable disposable) { }\n\n            @Override\n            public void onNext(@NonNull final List<SubscriptionEntity> newSubscriptions) {\n                displayChannels(newSubscriptions);\n            }\n\n            @Override\n            public void onError(@NonNull final Throwable exception) {\n                ErrorUtil.showUiErrorSnackbar(SelectChannelFragment.this,\n                        \"Loading subscription\", exception);\n            }\n\n            @Override\n            public void onComplete() { }\n        };\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Interfaces\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public interface OnSelectedListener {\n        void onChannelSelected(int serviceId, String url, String name);\n    }\n\n    public interface OnCancelListener {\n        void onCancel();\n    }\n\n    private final class SelectChannelAdapter\n            extends RecyclerView.Adapter<SelectChannelAdapter.SelectChannelItemHolder> {\n        @NonNull\n        @Override\n        public SelectChannelItemHolder onCreateViewHolder(final ViewGroup parent,\n                                                          final int viewType) {\n            final View item = LayoutInflater.from(parent.getContext())\n                    .inflate(R.layout.select_channel_item, parent, false);\n            return new SelectChannelItemHolder(item);\n        }\n\n        @Override\n        public void onBindViewHolder(final SelectChannelItemHolder holder, final int position) {\n            final SubscriptionEntity entry = subscriptions.get(position);\n            holder.titleView.setText(entry.getName());\n            holder.view.setOnClickListener(view -> clickedItem(position));\n            CoilHelper.INSTANCE.loadAvatar(holder.thumbnailView, entry.getAvatarUrl());\n        }\n\n        @Override\n        public int getItemCount() {\n            return subscriptions.size();\n        }\n\n        public class SelectChannelItemHolder extends RecyclerView.ViewHolder {\n            public final View view;\n            final ImageView thumbnailView;\n            final TextView titleView;\n            SelectChannelItemHolder(final View v) {\n                super(v);\n                this.view = v;\n                thumbnailView = v.findViewById(R.id.itemThumbnailView);\n                titleView = v.findViewById(R.id.itemTitleView);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/SelectFeedGroupFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.content.DialogInterface;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.AppDatabase;\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.util.ThemeHelper;\n\nimport java.util.List;\nimport java.util.Vector;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Observer;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\n/**\n * Created by Christian Schabesberger on 26.09.17.\n * SelectChannelFragment.java is part of NewPipe.\n * <p>\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * </p>\n * <p>\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * </p>\n * <p>\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n * </p>\n */\n\npublic class SelectFeedGroupFragment extends DialogFragment {\n\n    private OnSelectedListener onSelectedListener = null;\n    private OnCancelListener onCancelListener = null;\n\n    private ProgressBar progressBar;\n    private TextView emptyView;\n    private RecyclerView recyclerView;\n\n    private List<FeedGroupEntity> feedGroups = new Vector<>();\n\n    public void setOnSelectedListener(final OnSelectedListener listener) {\n        onSelectedListener = listener;\n    }\n\n    public void setOnCancelListener(final OnCancelListener listener) {\n        onCancelListener = listener;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(@Nullable final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setStyle(STYLE_NO_TITLE, ThemeHelper.getMinWidthDialogTheme(requireContext()));\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        final View v = inflater.inflate(R.layout.select_feed_group_fragment, container, false);\n        recyclerView = v.findViewById(R.id.items_list);\n        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));\n        final SelectFeedGroupAdapter feedGroupAdapter = new SelectFeedGroupAdapter();\n        recyclerView.setAdapter(feedGroupAdapter);\n\n        progressBar = v.findViewById(R.id.progressBar);\n        emptyView = v.findViewById(R.id.empty_state_view);\n        progressBar.setVisibility(View.VISIBLE);\n        recyclerView.setVisibility(View.GONE);\n        emptyView.setVisibility(View.GONE);\n\n\n        final AppDatabase database = NewPipeDatabase.getInstance(requireContext());\n        database.feedGroupDAO().getAll().toObservable()\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(getFeedGroupObserver());\n\n        return v;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Handle actions\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCancel(@NonNull final DialogInterface dialogInterface) {\n        super.onCancel(dialogInterface);\n        if (onCancelListener != null) {\n            onCancelListener.onCancel();\n        }\n    }\n\n    private void clickedItem(final int position) {\n        if (onSelectedListener != null) {\n            final FeedGroupEntity entry = feedGroups.get(position);\n            onSelectedListener\n                    .onFeedGroupSelected(entry.getUid(), entry.getName(),\n                            entry.getIcon().getDrawableResource());\n        }\n        dismiss();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Item handling\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void displayFeedGroups(final List<FeedGroupEntity> newFeedGroups) {\n        this.feedGroups = newFeedGroups;\n        progressBar.setVisibility(View.GONE);\n        if (newFeedGroups.isEmpty()) {\n            emptyView.setVisibility(View.VISIBLE);\n            return;\n        }\n        recyclerView.setVisibility(View.VISIBLE);\n\n    }\n\n    private Observer<List<FeedGroupEntity>> getFeedGroupObserver() {\n        return new Observer<List<FeedGroupEntity>>() {\n            @Override\n            public void onSubscribe(@NonNull final Disposable disposable) { }\n\n            @Override\n            public void onNext(@NonNull final List<FeedGroupEntity> newGroups) {\n                displayFeedGroups(newGroups);\n            }\n\n            @Override\n            public void onError(@NonNull final Throwable exception) {\n                ErrorUtil.showUiErrorSnackbar(SelectFeedGroupFragment.this,\n                        \"Loading Feed Groups\", exception);\n            }\n\n            @Override\n            public void onComplete() { }\n        };\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Interfaces\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public interface OnSelectedListener {\n        void onFeedGroupSelected(Long groupId, String name, int icon);\n    }\n\n    public interface OnCancelListener {\n        void onCancel();\n    }\n\n    private final class SelectFeedGroupAdapter\n            extends RecyclerView.Adapter<SelectFeedGroupAdapter.SelectFeedGroupItemHolder> {\n        @NonNull\n        @Override\n        public SelectFeedGroupItemHolder onCreateViewHolder(final ViewGroup parent,\n                                                          final int viewType) {\n            final View item = LayoutInflater.from(parent.getContext())\n                    .inflate(R.layout.select_feed_group_item, parent, false);\n            return new SelectFeedGroupItemHolder(item);\n        }\n\n        @Override\n        public void onBindViewHolder(final SelectFeedGroupItemHolder holder, final int position) {\n            final FeedGroupEntity entry = feedGroups.get(position);\n            holder.titleView.setText(entry.getName());\n            holder.view.setOnClickListener(view -> clickedItem(position));\n            holder.thumbnailView.setImageResource(entry.getIcon().getDrawableResource());\n        }\n\n        @Override\n        public int getItemCount() {\n            return feedGroups.size();\n        }\n\n        public class SelectFeedGroupItemHolder extends RecyclerView.ViewHolder {\n            public final View view;\n            final ImageView thumbnailView;\n            final TextView titleView;\n            SelectFeedGroupItemHolder(final View v) {\n                super(v);\n                this.view = v;\n                thumbnailView = v.findViewById(R.id.itemThumbnailView);\n                titleView = v.findViewById(R.id.itemTitleView);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.content.res.AppCompatResources;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.util.KioskTranslator;\nimport org.schabi.newpipe.util.ServiceHelper;\nimport org.schabi.newpipe.util.ThemeHelper;\n\nimport java.util.List;\nimport java.util.Vector;\n\n/**\n * Created by Christian Schabesberger on 09.10.17.\n * SelectKioskFragment.java is part of NewPipe.\n * <p>\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * </p>\n * <p>\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * </p>\n * <p>\n * You should have received a copy of the GNU General Public License\n * along with NewPipe. If not, see <http://www.gnu.org/licenses/>.\n * </p>\n */\n\npublic class SelectKioskFragment extends DialogFragment {\n    private SelectKioskAdapter selectKioskAdapter = null;\n\n    private OnSelectedListener onSelectedListener = null;\n\n    public void setOnSelectedListener(final OnSelectedListener listener) {\n        onSelectedListener = listener;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Init\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(@Nullable final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setStyle(STYLE_NO_TITLE, ThemeHelper.getMinWidthDialogTheme(requireContext()));\n    }\n\n    @Override\n    public View onCreateView(final LayoutInflater inflater, final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        final View v = inflater.inflate(R.layout.select_kiosk_fragment, container, false);\n        final RecyclerView recyclerView = v.findViewById(R.id.items_list);\n        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));\n        try {\n            selectKioskAdapter = new SelectKioskAdapter();\n        } catch (final Exception e) {\n            ErrorUtil.showUiErrorSnackbar(this, \"Selecting kiosk\", e);\n        }\n        recyclerView.setAdapter(selectKioskAdapter);\n\n        return v;\n    }\n\n   /*//////////////////////////////////////////////////////////////////////////\n    // Handle actions\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void clickedItem(final SelectKioskAdapter.Entry entry) {\n        if (onSelectedListener != null) {\n            onSelectedListener.onKioskSelected(entry.serviceId, entry.kioskId, entry.kioskName);\n        }\n        dismiss();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Interfaces\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public interface OnSelectedListener {\n        void onKioskSelected(int serviceId, String kioskId, String kioskName);\n    }\n\n    private class SelectKioskAdapter\n            extends RecyclerView.Adapter<SelectKioskAdapter.SelectKioskItemHolder> {\n        private final List<Entry> kioskList = new Vector<>();\n\n        SelectKioskAdapter() throws Exception {\n            for (final StreamingService service : NewPipe.getServices()) {\n                for (final String kioskId : service.getKioskList().getAvailableKiosks()) {\n                    final String name = String.format(getString(R.string.service_kiosk_string),\n                            service.getServiceInfo().getName(),\n                            KioskTranslator.getTranslatedKioskName(kioskId, getContext()));\n                    kioskList.add(new Entry(ServiceHelper.getIcon(service.getServiceId()),\n                            service.getServiceId(), kioskId, name));\n                }\n            }\n        }\n\n        public int getItemCount() {\n            return kioskList.size();\n        }\n\n        @NonNull\n        public SelectKioskItemHolder onCreateViewHolder(final ViewGroup parent, final int type) {\n            final View item = LayoutInflater.from(parent.getContext())\n                    .inflate(R.layout.select_kiosk_item, parent, false);\n            return new SelectKioskItemHolder(item);\n        }\n\n        public void onBindViewHolder(final SelectKioskItemHolder holder, final int position) {\n            final Entry entry = kioskList.get(position);\n            holder.titleView.setText(entry.kioskName);\n            holder.thumbnailView\n                    .setImageDrawable(AppCompatResources.getDrawable(requireContext(), entry.icon));\n            holder.view.setOnClickListener(view -> clickedItem(entry));\n        }\n\n        class Entry {\n            final int icon;\n            final int serviceId;\n            final String kioskId;\n            final String kioskName;\n\n            Entry(final int i, final int si, final String ki, final String kn) {\n                icon = i;\n                serviceId = si;\n                kioskId = ki;\n                kioskName = kn;\n            }\n        }\n\n        public class SelectKioskItemHolder extends RecyclerView.ViewHolder {\n            public final View view;\n            final ImageView thumbnailView;\n            final TextView titleView;\n\n            SelectKioskItemHolder(final View v) {\n                super(v);\n                this.view = v;\n                thumbnailView = v.findViewById(R.id.itemThumbnailView);\n                titleView = v.findViewById(R.id.itemTitleView);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/SelectPlaylistFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport static org.schabi.newpipe.local.bookmark.MergedPlaylistManager.getMergedOrderedPlaylists;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.DialogFragment;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.AppDatabase;\nimport org.schabi.newpipe.database.LocalItem;\nimport org.schabi.newpipe.database.playlist.PlaylistLocalItem;\nimport org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.local.playlist.LocalPlaylistManager;\nimport org.schabi.newpipe.local.playlist.RemotePlaylistManager;\nimport org.schabi.newpipe.util.image.CoilHelper;\n\nimport java.util.List;\nimport java.util.Vector;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.disposables.Disposable;\n\npublic class SelectPlaylistFragment extends DialogFragment {\n\n    private OnSelectedListener onSelectedListener = null;\n\n    private ProgressBar progressBar;\n    private TextView emptyView;\n    private RecyclerView recyclerView;\n    private Disposable disposable = null;\n\n    private List<PlaylistLocalItem> playlists = new Vector<>();\n\n    public void setOnSelectedListener(final OnSelectedListener listener) {\n        onSelectedListener = listener;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Fragment's Lifecycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        final View v = inflater.inflate(R.layout.select_playlist_fragment, container, false);\n        progressBar = v.findViewById(R.id.progressBar);\n        recyclerView = v.findViewById(R.id.items_list);\n        emptyView = v.findViewById(R.id.empty_state_view);\n\n        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));\n        final SelectPlaylistAdapter playlistAdapter = new SelectPlaylistAdapter();\n        recyclerView.setAdapter(playlistAdapter);\n\n        loadPlaylists();\n        return v;\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        if (disposable != null) {\n            disposable.dispose();\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Load and display playlists\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void loadPlaylists() {\n        progressBar.setVisibility(View.VISIBLE);\n        recyclerView.setVisibility(View.GONE);\n        emptyView.setVisibility(View.GONE);\n\n        final AppDatabase database = NewPipeDatabase.getInstance(requireContext());\n        final LocalPlaylistManager localPlaylistManager = new LocalPlaylistManager(database);\n        final RemotePlaylistManager remotePlaylistManager = new RemotePlaylistManager(database);\n\n        disposable = getMergedOrderedPlaylists(localPlaylistManager, remotePlaylistManager)\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(this::displayPlaylists, this::onError);\n    }\n\n    private void displayPlaylists(final List<PlaylistLocalItem> newPlaylists) {\n        playlists = newPlaylists;\n        progressBar.setVisibility(View.GONE);\n        emptyView.setVisibility(newPlaylists.isEmpty() ? View.VISIBLE : View.GONE);\n        recyclerView.setVisibility(newPlaylists.isEmpty() ? View.GONE : View.VISIBLE);\n    }\n\n    protected void onError(final Throwable e) {\n        ErrorUtil.showSnackbar(requireActivity(), new ErrorInfo(e,\n                UserAction.UI_ERROR, \"Loading playlists\"));\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Handle actions\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void clickedItem(final int position) {\n        if (onSelectedListener != null) {\n            final LocalItem selectedItem = playlists.get(position);\n\n            if (selectedItem instanceof PlaylistMetadataEntry) {\n                final PlaylistMetadataEntry entry = ((PlaylistMetadataEntry) selectedItem);\n                onSelectedListener.onLocalPlaylistSelected(entry.getUid(), entry.getOrderingName());\n\n            } else if (selectedItem instanceof PlaylistRemoteEntity) {\n                final PlaylistRemoteEntity entry = ((PlaylistRemoteEntity) selectedItem);\n                onSelectedListener.onRemotePlaylistSelected(\n                        entry.getServiceId(), entry.getUrl(), entry.getOrderingName());\n            }\n        }\n        dismiss();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Interfaces\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public interface OnSelectedListener {\n        void onLocalPlaylistSelected(long id, String name);\n        void onRemotePlaylistSelected(int serviceId, String url, String name);\n    }\n\n    private final class SelectPlaylistAdapter\n            extends RecyclerView.Adapter<SelectPlaylistAdapter.SelectPlaylistItemHolder> {\n        @NonNull\n        @Override\n        public SelectPlaylistItemHolder onCreateViewHolder(final ViewGroup parent,\n                                                           final int viewType) {\n            final View item = LayoutInflater.from(parent.getContext())\n                    .inflate(R.layout.list_playlist_mini_item, parent, false);\n            return new SelectPlaylistItemHolder(item);\n        }\n\n        @Override\n        public void onBindViewHolder(@NonNull final SelectPlaylistItemHolder holder,\n                                     final int position) {\n            final PlaylistLocalItem selectedItem = playlists.get(position);\n\n            if (selectedItem instanceof PlaylistMetadataEntry entry) {\n                holder.titleView.setText(entry.getOrderingName());\n                holder.view.setOnClickListener(view -> clickedItem(position));\n                CoilHelper.INSTANCE.loadPlaylistThumbnail(holder.thumbnailView,\n                        entry.getThumbnailUrl());\n\n            } else if (selectedItem instanceof PlaylistRemoteEntity entry) {\n                holder.titleView.setText(entry.getOrderingName());\n                holder.view.setOnClickListener(view -> clickedItem(position));\n                CoilHelper.INSTANCE.loadPlaylistThumbnail(holder.thumbnailView,\n                        entry.getThumbnailUrl());\n            }\n        }\n\n        @Override\n        public int getItemCount() {\n            return playlists.size();\n        }\n\n        public class SelectPlaylistItemHolder extends RecyclerView.ViewHolder {\n            public final View view;\n            final ImageView thumbnailView;\n            final TextView titleView;\n\n            SelectPlaylistItemHolder(final View v) {\n                super(v);\n                this.view = v;\n                thumbnailView = v.findViewById(R.id.itemThumbnailView);\n                titleView = v.findViewById(R.id.itemTitleView);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.widget.EditText;\n\nimport androidx.annotation.IdRes;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.preference.Preference;\nimport androidx.preference.PreferenceFragmentCompat;\n\nimport com.evernote.android.state.State;\nimport com.jakewharton.rxbinding4.widget.RxTextView;\nimport com.livefront.bridge.Bridge;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.SettingsLayoutBinding;\nimport org.schabi.newpipe.settings.preferencesearch.PreferenceParser;\nimport org.schabi.newpipe.settings.preferencesearch.PreferenceSearchConfiguration;\nimport org.schabi.newpipe.settings.preferencesearch.PreferenceSearchFragment;\nimport org.schabi.newpipe.settings.preferencesearch.PreferenceSearchItem;\nimport org.schabi.newpipe.settings.preferencesearch.PreferenceSearchResultHighlighter;\nimport org.schabi.newpipe.settings.preferencesearch.PreferenceSearchResultListener;\nimport org.schabi.newpipe.settings.preferencesearch.PreferenceSearcher;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.KeyboardUtil;\nimport org.schabi.newpipe.util.ReleaseVersionUtil;\nimport org.schabi.newpipe.util.ThemeHelper;\nimport org.schabi.newpipe.views.FocusOverlayView;\n\nimport java.util.concurrent.TimeUnit;\n\n/*\n * Created by Christian Schabesberger on 31.08.15.\n *\n * Copyright (C) Christian Schabesberger 2015 <chris.schabesberger@mailbox.org>\n * SettingsActivity.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic class SettingsActivity extends AppCompatActivity implements\n        PreferenceFragmentCompat.OnPreferenceStartFragmentCallback,\n        PreferenceSearchResultListener {\n    private static final String TAG = \"SettingsActivity\";\n    private static final boolean DEBUG = MainActivity.DEBUG;\n\n    @IdRes\n    private static final int FRAGMENT_HOLDER_ID = R.id.settings_fragment_holder;\n\n    private PreferenceSearchFragment searchFragment;\n\n    @Nullable\n    private MenuItem menuSearchItem;\n\n    private View searchContainer;\n    private EditText searchEditText;\n\n    // State\n    @State\n    String searchText;\n    @State\n    boolean wasSearchActive;\n\n    @Override\n    protected void onCreate(final Bundle savedInstanceBundle) {\n        setTheme(ThemeHelper.getSettingsThemeStyle(this));\n\n        super.onCreate(savedInstanceBundle);\n        Bridge.restoreInstanceState(this, savedInstanceBundle);\n        final boolean restored = savedInstanceBundle != null;\n\n        final SettingsLayoutBinding settingsLayoutBinding =\n                SettingsLayoutBinding.inflate(getLayoutInflater());\n        setContentView(settingsLayoutBinding.getRoot());\n        initSearch(settingsLayoutBinding, restored);\n\n        setSupportActionBar(settingsLayoutBinding.settingsToolbarLayout.toolbar);\n\n        if (restored) {\n            // Restore state\n            if (this.wasSearchActive) {\n                setSearchActive(true);\n                if (!TextUtils.isEmpty(this.searchText)) {\n                    this.searchEditText.setText(this.searchText);\n                }\n            }\n        } else {\n            getSupportFragmentManager().beginTransaction()\n                    .replace(R.id.settings_fragment_holder, new MainSettingsFragment())\n                    .commit();\n        }\n\n        if (DeviceUtils.isTv(this)) {\n            FocusOverlayView.setupFocusObserver(this);\n        }\n    }\n\n    @Override\n    protected void onSaveInstanceState(@NonNull final Bundle outState) {\n        super.onSaveInstanceState(outState);\n        Bridge.saveInstanceState(this, outState);\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(final Menu menu) {\n        final ActionBar actionBar = getSupportActionBar();\n        if (actionBar != null) {\n            actionBar.setDisplayHomeAsUpEnabled(true);\n            actionBar.setDisplayShowTitleEnabled(true);\n        }\n\n        return super.onCreateOptionsMenu(menu);\n    }\n\n    @Override\n    public void onBackPressed() {\n        if (isSearchActive()) {\n            setSearchActive(false);\n            return;\n        }\n        super.onBackPressed();\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(final MenuItem item) {\n        final int id = item.getItemId();\n        if (id == android.R.id.home) {\n            // Check if the search is active and if so: Close it\n            if (isSearchActive()) {\n                setSearchActive(false);\n                return true;\n            }\n\n            if (getSupportFragmentManager().getBackStackEntryCount() == 0) {\n                finish();\n            } else {\n                getSupportFragmentManager().popBackStack();\n            }\n        }\n\n        return super.onOptionsItemSelected(item);\n    }\n\n    @Override\n    public boolean onPreferenceStartFragment(@NonNull final PreferenceFragmentCompat caller,\n                                             final Preference preference) {\n        showSettingsFragment(instantiateFragment(preference.getFragment()));\n        return true;\n    }\n\n    private Fragment instantiateFragment(@NonNull final String className) {\n        return getSupportFragmentManager()\n                .getFragmentFactory()\n                .instantiate(this.getClassLoader(), className);\n    }\n\n    private void showSettingsFragment(final Fragment fragment) {\n        getSupportFragmentManager().beginTransaction()\n                .setCustomAnimations(R.animator.custom_fade_in, R.animator.custom_fade_out,\n                        R.animator.custom_fade_in, R.animator.custom_fade_out)\n                .replace(FRAGMENT_HOLDER_ID, fragment)\n                .addToBackStack(null)\n                .commit();\n    }\n\n    @Override\n    protected void onDestroy() {\n        setMenuSearchItem(null);\n        searchFragment = null;\n        super.onDestroy();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Search\n    //////////////////////////////////////////////////////////////////////////*/\n    //region Search\n\n    private void initSearch(\n            final SettingsLayoutBinding settingsLayoutBinding,\n            final boolean restored\n    ) {\n        searchContainer =\n                settingsLayoutBinding.settingsToolbarLayout.toolbar\n                        .findViewById(R.id.toolbar_search_container);\n\n        // Configure input field for search\n        searchEditText = searchContainer.findViewById(R.id.toolbar_search_edit_text);\n        RxTextView.textChanges(searchEditText)\n                // Wait some time after the last input before actually searching\n                .debounce(200, TimeUnit.MILLISECONDS)\n                .subscribe(v -> runOnUiThread(this::onSearchChanged));\n\n        // Configure clear button\n        searchContainer.findViewById(R.id.toolbar_search_clear)\n                .setOnClickListener(ev -> resetSearchText());\n\n        ensureSearchRepresentsApplicationState();\n\n        // Build search configuration using SettingsResourceRegistry\n        final PreferenceSearchConfiguration config = new PreferenceSearchConfiguration();\n\n\n        // Build search items\n        final Context searchContext = getApplicationContext();\n        final PreferenceParser parser = new PreferenceParser(searchContext, config);\n        final PreferenceSearcher searcher = new PreferenceSearcher(config);\n\n        // Find all searchable SettingsResourceRegistry fragments\n        SettingsResourceRegistry.getInstance().getAllEntries().stream()\n                .filter(SettingsResourceRegistry.SettingRegistryEntry::isSearchable)\n                // Get the resId\n                .map(SettingsResourceRegistry.SettingRegistryEntry::getPreferencesResId)\n                // Parse\n                .map(parser::parse)\n                // Add it to the searcher\n                .forEach(searcher::add);\n\n        if (restored) {\n            searchFragment = (PreferenceSearchFragment) getSupportFragmentManager()\n                    .findFragmentByTag(PreferenceSearchFragment.NAME);\n            if (searchFragment != null) {\n                // Hide/Remove the search fragment otherwise we get an exception\n                // when adding it (because it's already present)\n                hideSearchFragment();\n            }\n        }\n        if (searchFragment == null) {\n            searchFragment = new PreferenceSearchFragment();\n        }\n        searchFragment.setSearcher(searcher);\n    }\n\n    /**\n     * Ensures that the search shows the correct/available search results.\n     * <br/>\n     * Some features are e.g. only available for debug builds, these should not\n     * be found when searching inside a release.\n     */\n    private void ensureSearchRepresentsApplicationState() {\n        // Check if the update settings are available\n        if (!ReleaseVersionUtil.INSTANCE.isReleaseApk()) {\n            SettingsResourceRegistry.getInstance()\n                    .getEntryByPreferencesResId(R.xml.update_settings)\n                    .setSearchable(false);\n        }\n\n        // Hide debug preferences in RELEASE build variant\n        if (DEBUG) {\n            SettingsResourceRegistry.getInstance()\n                    .getEntryByPreferencesResId(R.xml.debug_settings)\n                    .setSearchable(true);\n        }\n    }\n\n    public void setMenuSearchItem(final MenuItem menuSearchItem) {\n        this.menuSearchItem = menuSearchItem;\n\n        // Ensure that the item is in the correct state when adding it. This is due to\n        // Android's lifecycle (the Activity is recreated before the Fragment that registers this)\n        if (menuSearchItem != null) {\n            menuSearchItem.setVisible(!isSearchActive());\n        }\n    }\n\n    public void setSearchActive(final boolean active) {\n        if (DEBUG) {\n            Log.d(TAG, \"setSearchActive called active=\" + active);\n        }\n\n        // Ignore if search is already in correct state\n        if (isSearchActive() == active) {\n            return;\n        }\n\n        wasSearchActive = active;\n\n        searchContainer.setVisibility(active ? View.VISIBLE : View.GONE);\n        if (menuSearchItem != null) {\n            menuSearchItem.setVisible(!active);\n        }\n\n        if (active) {\n            getSupportFragmentManager()\n                    .beginTransaction()\n                    .add(FRAGMENT_HOLDER_ID, searchFragment, PreferenceSearchFragment.NAME)\n                    .addToBackStack(PreferenceSearchFragment.NAME)\n                    .commit();\n\n            KeyboardUtil.showKeyboard(this, searchEditText);\n        } else if (searchFragment != null) {\n            hideSearchFragment();\n            getSupportFragmentManager()\n                    .popBackStack(\n                        PreferenceSearchFragment.NAME,\n                        FragmentManager.POP_BACK_STACK_INCLUSIVE);\n\n            KeyboardUtil.hideKeyboard(this, searchEditText);\n        }\n\n        resetSearchText();\n    }\n\n    private void hideSearchFragment() {\n        getSupportFragmentManager().beginTransaction().remove(searchFragment).commit();\n    }\n\n    private void resetSearchText() {\n        searchEditText.setText(\"\");\n    }\n\n    private boolean isSearchActive() {\n        return searchContainer.getVisibility() == View.VISIBLE;\n    }\n\n    private void onSearchChanged() {\n        if (!isSearchActive()) {\n            return;\n        }\n\n        if (searchFragment != null) {\n            searchText = this.searchEditText.getText().toString();\n            searchFragment.updateSearchResults(searchText);\n        }\n    }\n\n    @Override\n    public void onSearchResultClicked(@NonNull final PreferenceSearchItem result) {\n        if (DEBUG) {\n            Log.d(TAG, \"onSearchResultClicked called result=\" + result);\n        }\n\n        // Hide the search\n        setSearchActive(false);\n\n        // -- Highlight the result --\n        // Find out which fragment class we need\n        final Class<? extends Fragment> targetedFragmentClass =\n                SettingsResourceRegistry.getInstance()\n                        .getFragmentClass(result.getSearchIndexItemResId());\n\n        if (targetedFragmentClass == null) {\n            // This should never happen\n            Log.w(TAG, \"Unable to locate fragment class for resId=\"\n                    + result.getSearchIndexItemResId());\n            return;\n        }\n\n        // Check if the currentFragment is the one which contains the result\n        Fragment currentFragment =\n                getSupportFragmentManager().findFragmentById(FRAGMENT_HOLDER_ID);\n        if (!targetedFragmentClass.equals(currentFragment.getClass())) {\n            // If it's not the correct one display the correct one\n            currentFragment = instantiateFragment(targetedFragmentClass.getName());\n            showSettingsFragment(currentFragment);\n        }\n\n        // Run the highlighting\n        if (currentFragment instanceof PreferenceFragmentCompat) {\n            PreferenceSearchResultHighlighter\n                    .highlight(result, (PreferenceFragmentCompat) currentFragment);\n        }\n    }\n\n    //endregion\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/SettingsResourceRegistry.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.XmlRes;\nimport androidx.fragment.app.Fragment;\n\nimport org.schabi.newpipe.R;\n\nimport java.util.HashSet;\nimport java.util.Objects;\nimport java.util.Set;\n\n/**\n * A registry that contains information about SettingsFragments.\n * <br/>\n * includes:\n * <ul>\n *     <li>Class of the SettingsFragment</li>\n *     <li>XML-Resource</li>\n *     <li>...</li>\n * </ul>\n *\n * E.g. used by the preference search.\n */\npublic final class SettingsResourceRegistry {\n\n    private static final SettingsResourceRegistry INSTANCE = new SettingsResourceRegistry();\n\n    private final Set<SettingRegistryEntry> registeredEntries = new HashSet<>();\n\n    private SettingsResourceRegistry() {\n        add(MainSettingsFragment.class, R.xml.main_settings).setSearchable(false);\n\n        add(AppearanceSettingsFragment.class, R.xml.appearance_settings);\n        add(ContentSettingsFragment.class, R.xml.content_settings);\n        add(DebugSettingsFragment.class, R.xml.debug_settings).setSearchable(false);\n        add(DownloadSettingsFragment.class, R.xml.download_settings);\n        add(HistorySettingsFragment.class, R.xml.history_settings);\n        add(NotificationSettingsFragment.class, R.xml.notifications_settings);\n        add(PlayerNotificationSettingsFragment.class, R.xml.player_notification_settings);\n        add(UpdateSettingsFragment.class, R.xml.update_settings);\n        add(VideoAudioSettingsFragment.class, R.xml.video_audio_settings);\n        add(ExoPlayerSettingsFragment.class, R.xml.exoplayer_settings);\n        add(BackupRestoreSettingsFragment.class, R.xml.backup_restore_settings);\n    }\n\n    private SettingRegistryEntry add(\n            @NonNull final Class<? extends Fragment> fragmentClass,\n            @XmlRes final int preferencesResId\n    ) {\n        final SettingRegistryEntry entry =\n                new SettingRegistryEntry(fragmentClass, preferencesResId);\n        this.registeredEntries.add(entry);\n        return entry;\n    }\n\n    public SettingRegistryEntry getEntryByFragmentClass(\n            final Class<? extends Fragment> fragmentClass\n    ) {\n        Objects.requireNonNull(fragmentClass);\n        return registeredEntries.stream()\n                .filter(e -> Objects.equals(e.getFragmentClass(), fragmentClass))\n                .findFirst()\n                .orElse(null);\n    }\n\n    public SettingRegistryEntry getEntryByPreferencesResId(@XmlRes final int preferencesResId) {\n        return registeredEntries.stream()\n                .filter(e -> Objects.equals(e.getPreferencesResId(), preferencesResId))\n                .findFirst()\n                .orElse(null);\n    }\n\n    public int getPreferencesResId(@NonNull final Class<? extends Fragment> fragmentClass) {\n        final SettingRegistryEntry entry = getEntryByFragmentClass(fragmentClass);\n        if (entry == null) {\n            return -1;\n        }\n        return entry.getPreferencesResId();\n    }\n\n    public Class<? extends Fragment> getFragmentClass(@XmlRes final int preferencesResId) {\n        final SettingRegistryEntry entry = getEntryByPreferencesResId(preferencesResId);\n        if (entry == null) {\n            return null;\n        }\n        return entry.getFragmentClass();\n    }\n\n    public Set<SettingRegistryEntry> getAllEntries() {\n        return new HashSet<>(registeredEntries);\n    }\n\n    public static SettingsResourceRegistry getInstance() {\n        return INSTANCE;\n    }\n\n\n    public static class SettingRegistryEntry {\n        @NonNull\n        private final Class<? extends Fragment> fragmentClass;\n        @XmlRes\n        private final int preferencesResId;\n\n        private boolean searchable = true;\n\n        public SettingRegistryEntry(\n                @NonNull final Class<? extends Fragment> fragmentClass,\n                @XmlRes final int preferencesResId\n        ) {\n            this.fragmentClass = Objects.requireNonNull(fragmentClass);\n            this.preferencesResId = preferencesResId;\n        }\n\n        @SuppressWarnings(\"HiddenField\")\n        public SettingRegistryEntry setSearchable(final boolean searchable) {\n            this.searchable = searchable;\n            return this;\n        }\n\n        @NonNull\n        public Class<? extends Fragment> getFragmentClass() {\n            return fragmentClass;\n        }\n\n        public int getPreferencesResId() {\n            return preferencesResId;\n        }\n\n        public boolean isSearchable() {\n            return searchable;\n        }\n\n        @Override\n        public boolean equals(final Object o) {\n            if (this == o) {\n                return true;\n            }\n            if (o == null || getClass() != o.getClass()) {\n                return false;\n            }\n            final SettingRegistryEntry that = (SettingRegistryEntry) o;\n            return getPreferencesResId() == that.getPreferencesResId()\n                    && getFragmentClass().equals(that.getFragmentClass());\n        }\n\n        @Override\n        public int hashCode() {\n            return Objects.hash(getFragmentClass(), getPreferencesResId());\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.app.AlertDialog;\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.widget.Toast;\n\nimport androidx.preference.Preference;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.NewVersionWorker;\nimport org.schabi.newpipe.R;\n\npublic class UpdateSettingsFragment extends BasePreferenceFragment {\n    private final Preference.OnPreferenceChangeListener updatePreferenceChange = (p, nVal) -> {\n        final boolean checkForUpdates = (boolean) nVal;\n        defaultPreferences.edit()\n                .putBoolean(getString(R.string.update_app_key), checkForUpdates)\n                .apply();\n\n        if (checkForUpdates) {\n            NewVersionWorker.enqueueNewVersionCheckingWork(requireContext(), true);\n        }\n        return true;\n    };\n\n    private final Preference.OnPreferenceClickListener manualUpdateClick = preference -> {\n        Toast.makeText(getContext(), R.string.checking_updates_toast, Toast.LENGTH_SHORT).show();\n        NewVersionWorker.enqueueNewVersionCheckingWork(requireContext(), true);\n        return true;\n    };\n\n    @Override\n    public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {\n        addPreferencesFromResourceRegistry();\n\n        requirePreference(R.string.update_app_key)\n                .setOnPreferenceChangeListener(updatePreferenceChange);\n        requirePreference(R.string.manual_update_key)\n                .setOnPreferenceClickListener(manualUpdateClick);\n    }\n\n    public static void askForConsentToUpdateChecks(final Context context) {\n        new AlertDialog.Builder(context)\n                .setTitle(context.getString(R.string.check_for_updates))\n                .setMessage(context.getString(R.string.auto_update_check_description))\n                .setPositiveButton(context.getString(R.string.yes), (d, w) -> {\n                    d.dismiss();\n                    setAutoUpdateCheckEnabled(context, true);\n                })\n                .setNegativeButton(R.string.no, (d, w) -> {\n                    d.dismiss();\n                    // set explicitly to false, since the default is true on previous versions\n                    setAutoUpdateCheckEnabled(context, false);\n                })\n                .show();\n    }\n\n    private static void setAutoUpdateCheckEnabled(final Context context, final boolean enabled) {\n        PreferenceManager.getDefaultSharedPreferences(context)\n                .edit()\n                .putBoolean(context.getString(R.string.update_app_key), enabled)\n                .putBoolean(context.getString(R.string.update_check_consent_key), true)\n                .apply();\n    }\n\n    /**\n     * Whether the user was asked for consent to automatically check for app updates.\n     * @param context\n     * @return true if the user was asked for consent, false otherwise\n     */\n    public static boolean wasUserAskedForConsent(final Context context) {\n        return PreferenceManager.getDefaultSharedPreferences(context)\n                .getBoolean(context.getString(R.string.update_check_consent_key), false);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java",
    "content": "package org.schabi.newpipe.settings;\n\nimport android.content.SharedPreferences;\nimport android.content.res.Resources;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.provider.Settings;\nimport android.text.format.DateUtils;\nimport android.widget.Toast;\n\nimport androidx.preference.ListPreference;\n\nimport com.google.android.material.snackbar.Snackbar;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.util.ListHelper;\nimport org.schabi.newpipe.util.PermissionHelper;\n\nimport java.util.LinkedList;\nimport java.util.List;\n\npublic class VideoAudioSettingsFragment extends BasePreferenceFragment {\n    private SharedPreferences.OnSharedPreferenceChangeListener listener;\n\n    @Override\n    public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {\n        addPreferencesFromResourceRegistry();\n\n        updateSeekOptions();\n        updateResolutionOptions();\n        listener = (sharedPreferences, key) -> {\n\n            // on M and above, if user chooses to minimise to popup player on exit\n            // and the app doesn't have display over other apps permission,\n            // show a snackbar to let the user give permission\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M\n                    && getString(R.string.minimize_on_exit_key).equals(key)) {\n                final String newSetting = sharedPreferences.getString(key, null);\n                if (newSetting != null\n                        && newSetting.equals(getString(R.string.minimize_on_exit_popup_key))\n                        && !Settings.canDrawOverlays(getContext())) {\n\n                    Snackbar.make(getListView(), R.string.permission_display_over_apps,\n                            Snackbar.LENGTH_INDEFINITE)\n                            .setAction(R.string.settings, view ->\n                                    PermissionHelper.checkSystemAlertWindowPermission(getContext()))\n                            .show();\n\n                }\n            } else if (getString(R.string.use_inexact_seek_key).equals(key)) {\n                updateSeekOptions();\n            } else if (getString(R.string.show_higher_resolutions_key).equals(key)) {\n                updateResolutionOptions();\n            }\n        };\n    }\n\n    /**\n     * Update default resolution, default popup resolution & mobile data resolution options.\n     * <br />\n     * Show high resolutions when \"Show higher resolution\" option is enabled.\n     * Set default resolution to \"best resolution\" when \"Show higher resolution\" option\n     * is disabled.\n     */\n    private void updateResolutionOptions() {\n        final Resources resources = getResources();\n        final boolean showHigherResolutions =  getPreferenceManager().getSharedPreferences()\n                .getBoolean(resources.getString(R.string.show_higher_resolutions_key), false);\n\n        // get sorted resolution lists\n        final List<String> resolutionListDescriptions = ListHelper.getSortedResolutionList(\n                resources,\n                R.array.resolution_list_description,\n                R.array.high_resolution_list_descriptions,\n                showHigherResolutions);\n        final List<String> resolutionListValues = ListHelper.getSortedResolutionList(\n                resources,\n                R.array.resolution_list_values,\n                R.array.high_resolution_list_values,\n                showHigherResolutions);\n        final List<String> limitDataUsageResolutionValues = ListHelper.getSortedResolutionList(\n                resources,\n                R.array.limit_data_usage_values_list,\n                R.array.high_resolution_limit_data_usage_values_list,\n                showHigherResolutions);\n        final List<String> limitDataUsageResolutionDescriptions = ListHelper\n                .getSortedResolutionList(resources,\n                R.array.limit_data_usage_description_list,\n                R.array.high_resolution_list_descriptions,\n                showHigherResolutions);\n\n        // get resolution preferences\n        final ListPreference defaultResolution = requirePreference(\n                R.string.default_resolution_key);\n        final ListPreference defaultPopupResolution = requirePreference(\n                R.string.default_popup_resolution_key);\n        final ListPreference mobileDataResolution = requirePreference(\n                R.string.limit_mobile_data_usage_key);\n\n        // update resolution preferences with new resolutions, entries & values for each\n        defaultResolution.setEntries(resolutionListDescriptions.toArray(new String[0]));\n        defaultResolution.setEntryValues(resolutionListValues.toArray(new String[0]));\n        defaultPopupResolution.setEntries(resolutionListDescriptions.toArray(new String[0]));\n        defaultPopupResolution.setEntryValues(resolutionListValues.toArray(new String[0]));\n        mobileDataResolution.setEntries(\n                limitDataUsageResolutionDescriptions.toArray(new String[0]));\n        mobileDataResolution.setEntryValues(limitDataUsageResolutionValues.toArray(new String[0]));\n\n        // if \"Show higher resolution\" option is disabled,\n        // set default resolution to \"best resolution\"\n        if (!showHigherResolutions) {\n            if (ListHelper.isHighResolutionSelected(defaultResolution.getValue(),\n                    R.array.high_resolution_list_values,\n                    resources)) {\n                defaultResolution.setValueIndex(0);\n            }\n            if (ListHelper.isHighResolutionSelected(defaultPopupResolution.getValue(),\n                    R.array.high_resolution_list_values,\n                    resources)) {\n                defaultPopupResolution.setValueIndex(0);\n            }\n            if (ListHelper.isHighResolutionSelected(mobileDataResolution.getValue(),\n                    R.array.high_resolution_limit_data_usage_values_list,\n                    resources)) {\n                mobileDataResolution.setValueIndex(0);\n            }\n        }\n    }\n\n    /**\n     * Update fast-forward/-rewind seek duration options\n     * according to language and inexact seek setting.\n     * Exoplayer can't seek 5 seconds in audio when using inexact seek.\n     */\n    private void updateSeekOptions() {\n        // initializing R.array.seek_duration_description to display the translation of seconds\n        final Resources res = getResources();\n        final String[] durationsValues = res.getStringArray(R.array.seek_duration_value);\n        final List<String> displayedDurationValues = new LinkedList<>();\n        final List<String> displayedDescriptionValues = new LinkedList<>();\n        int currentDurationValue;\n        final boolean inexactSeek = getPreferenceManager().getSharedPreferences()\n                .getBoolean(res.getString(R.string.use_inexact_seek_key), false);\n\n        for (final String durationsValue : durationsValues) {\n            currentDurationValue =\n                    Integer.parseInt(durationsValue) / (int) DateUtils.SECOND_IN_MILLIS;\n            if (inexactSeek && currentDurationValue % 10 == 5) {\n                continue;\n            }\n\n            displayedDurationValues.add(durationsValue);\n            try {\n                displayedDescriptionValues.add(String.format(\n                        res.getQuantityString(R.plurals.seconds,\n                                currentDurationValue),\n                        currentDurationValue));\n            } catch (final Resources.NotFoundException ignored) {\n                // if this happens, the translation is missing,\n                // and the english string will be displayed instead\n            }\n        }\n\n        final ListPreference durations = requirePreference(R.string.seek_duration_key);\n        durations.setEntryValues(displayedDurationValues.toArray(new CharSequence[0]));\n        durations.setEntries(displayedDescriptionValues.toArray(new CharSequence[0]));\n        final int selectedDuration = Integer.parseInt(durations.getValue());\n        if (inexactSeek && selectedDuration / (int) DateUtils.SECOND_IN_MILLIS % 10 == 5) {\n            final int newDuration = selectedDuration / (int) DateUtils.SECOND_IN_MILLIS + 5;\n            durations.setValue(Integer.toString(newDuration * (int) DateUtils.SECOND_IN_MILLIS));\n\n            final Toast toast = Toast\n                    .makeText(getContext(),\n                            getString(R.string.new_seek_duration_toast, newDuration),\n                            Toast.LENGTH_LONG);\n            toast.show();\n        }\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        getPreferenceManager().getSharedPreferences()\n                .registerOnSharedPreferenceChangeListener(listener);\n\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        getPreferenceManager().getSharedPreferences()\n                .unregisterOnSharedPreferenceChangeListener(listener);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/custom/DurationListPreference.kt",
    "content": "package org.schabi.newpipe.settings.custom\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.preference.ListPreference\nimport org.schabi.newpipe.util.Localization\n\n/**\n * An extension of a common ListPreference where it sets the duration values to human readable strings.\n *\n * The values in the entry values array will be interpreted as seconds. If the value of a specific position\n * is less than or equals to zero, its original entry title will be used.\n *\n * If the entry values array have anything other than numbers in it, an exception will be raised.\n */\nclass DurationListPreference : ListPreference {\n    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)\n    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)\n    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)\n    constructor(context: Context) : super(context)\n\n    override fun onAttached() {\n        super.onAttached()\n\n        val originalEntryTitles = entries\n        val originalEntryValues = entryValues\n        val newEntryTitles = arrayOfNulls<CharSequence>(originalEntryValues.size)\n\n        for (i in originalEntryValues.indices) {\n            val currentDurationValue: Int\n            try {\n                currentDurationValue = (originalEntryValues[i] as String).toInt()\n            } catch (e: NumberFormatException) {\n                throw RuntimeException(\"Invalid number was set in the preference entry values array\", e)\n            }\n\n            if (currentDurationValue <= 0) {\n                newEntryTitles[i] = originalEntryTitles[i]\n            } else {\n                newEntryTitles[i] = Localization.localizeDuration(context, currentDurationValue)\n            }\n        }\n\n        entries = newEntryTitles\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java",
    "content": "package org.schabi.newpipe.settings.custom;\n\nimport static org.schabi.newpipe.player.notification.NotificationConstants.ACTION_RECREATE_NOTIFICATION;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.os.Build;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.widget.CheckBox;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.preference.Preference;\nimport androidx.preference.PreferenceViewHolder;\n\nimport org.schabi.newpipe.App;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.player.notification.NotificationConstants;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.IntStream;\n\npublic class NotificationActionsPreference extends Preference {\n\n    public NotificationActionsPreference(final Context context, final AttributeSet attrs) {\n        super(context, attrs);\n        setLayoutResource(R.layout.settings_notification);\n    }\n\n\n    private NotificationSlot[] notificationSlots;\n    private List<Integer> compactSlots;\n\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Lifecycle\n    ////////////////////////////////////////////////////////////////////////////\n\n    @Override\n    public void onBindViewHolder(@NonNull final PreferenceViewHolder holder) {\n        super.onBindViewHolder(holder);\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n            ((TextView) holder.itemView.findViewById(R.id.summary))\n                    .setText(R.string.notification_actions_summary_android13);\n        }\n\n        holder.itemView.setClickable(false);\n        setupActions(holder.itemView);\n    }\n\n    @Override\n    public void onDetached() {\n        super.onDetached();\n        saveChanges();\n        // set package to this app's package to prevent the intent from being seen outside\n        getContext().sendBroadcast(new Intent(ACTION_RECREATE_NOTIFICATION)\n                .setPackage(App.PACKAGE_NAME));\n    }\n\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Setup\n    ////////////////////////////////////////////////////////////////////////////\n\n    private void setupActions(@NonNull final View view) {\n        compactSlots = new ArrayList<>(NotificationConstants.getCompactSlotsFromPreferences(\n                getContext(), getSharedPreferences()));\n        notificationSlots = IntStream.range(0, 5)\n                .mapToObj(i -> new NotificationSlot(getContext(), getSharedPreferences(), i, view,\n                        compactSlots.contains(i), this::onToggleCompactSlot))\n                .toArray(NotificationSlot[]::new);\n    }\n\n    private void onToggleCompactSlot(final int i, final CheckBox checkBox) {\n        if (checkBox.isChecked()) {\n            compactSlots.remove((Integer) i);\n        } else if (compactSlots.size() < 3) {\n            compactSlots.add(i);\n        } else {\n            Toast.makeText(getContext(),\n                    R.string.notification_actions_at_most_three,\n                    Toast.LENGTH_SHORT).show();\n            return;\n        }\n\n        checkBox.toggle();\n    }\n\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Saving\n    ////////////////////////////////////////////////////////////////////////////\n\n    private void saveChanges() {\n        if (compactSlots != null && notificationSlots != null) {\n            final SharedPreferences.Editor editor = getSharedPreferences().edit();\n\n            for (int i = 0; i < 3; i++) {\n                editor.putInt(getContext().getString(\n                        NotificationConstants.SLOT_COMPACT_PREF_KEYS[i]),\n                        (i < compactSlots.size() ? compactSlots.get(i) : -1));\n            }\n\n            for (int i = 0; i < 5; i++) {\n                editor.putInt(getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]),\n                        notificationSlots[i].getSelectedAction());\n            }\n\n            editor.apply();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/custom/NotificationSlot.java",
    "content": "package org.schabi.newpipe.settings.custom;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.res.ColorStateList;\nimport android.os.Build;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.CheckBox;\nimport android.widget.ImageView;\nimport android.widget.RadioButton;\nimport android.widget.RadioGroup;\nimport android.widget.TextView;\n\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.appcompat.content.res.AppCompatResources;\nimport androidx.core.widget.TextViewCompat;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.databinding.ListRadioIconItemBinding;\nimport org.schabi.newpipe.databinding.SingleChoiceDialogViewBinding;\nimport org.schabi.newpipe.player.notification.NotificationConstants;\nimport org.schabi.newpipe.util.DeviceUtils;\nimport org.schabi.newpipe.util.ThemeHelper;\nimport org.schabi.newpipe.views.FocusOverlayView;\n\nimport java.util.Objects;\nimport java.util.function.BiConsumer;\n\nclass NotificationSlot {\n\n    private static final int[] SLOT_ITEMS = {\n            R.id.notificationAction0,\n            R.id.notificationAction1,\n            R.id.notificationAction2,\n            R.id.notificationAction3,\n            R.id.notificationAction4,\n    };\n\n    private static final int[] SLOT_TITLES = {\n            R.string.notification_action_0_title,\n            R.string.notification_action_1_title,\n            R.string.notification_action_2_title,\n            R.string.notification_action_3_title,\n            R.string.notification_action_4_title,\n    };\n\n    private final int i;\n    private @NotificationConstants.Action int selectedAction;\n    private final Context context;\n    private final BiConsumer<Integer, CheckBox> onToggleCompactSlot;\n\n    private ImageView icon;\n    private TextView summary;\n\n    NotificationSlot(final Context context,\n                     final SharedPreferences prefs,\n                     final int actionIndex,\n                     final View parentView,\n                     final boolean isCompactSlotChecked,\n                     final BiConsumer<Integer, CheckBox> onToggleCompactSlot) {\n        this.context = context;\n        this.i = actionIndex;\n        this.onToggleCompactSlot = onToggleCompactSlot;\n\n        selectedAction = Objects.requireNonNull(prefs).getInt(\n                context.getString(NotificationConstants.SLOT_PREF_KEYS[i]),\n                NotificationConstants.SLOT_DEFAULTS[i]);\n        final View view = parentView.findViewById(SLOT_ITEMS[i]);\n\n        // only show the last two notification slots on Android 13+\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || i >= 3) {\n            setupSelectedAction(view);\n            setupTitle(view);\n            setupCheckbox(view, isCompactSlotChecked);\n        } else {\n            view.setVisibility(View.GONE);\n        }\n    }\n\n    void setupTitle(final View view) {\n        ((TextView) view.findViewById(R.id.notificationActionTitle))\n                .setText(SLOT_TITLES[i]);\n        view.findViewById(R.id.notificationActionClickableArea).setOnClickListener(\n                v -> openActionChooserDialog());\n    }\n\n    void setupCheckbox(final View view, final boolean isCompactSlotChecked) {\n        final CheckBox compactSlotCheckBox = view.findViewById(R.id.notificationActionCheckBox);\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n            // there are no compact slots to customize on Android 13+\n            compactSlotCheckBox.setVisibility(View.GONE);\n            view.findViewById(R.id.notificationActionCheckBoxClickableArea)\n                    .setVisibility(View.GONE);\n            return;\n        }\n\n        compactSlotCheckBox.setChecked(isCompactSlotChecked);\n        view.findViewById(R.id.notificationActionCheckBoxClickableArea).setOnClickListener(\n                v -> onToggleCompactSlot.accept(i, compactSlotCheckBox));\n    }\n\n    void setupSelectedAction(final View view) {\n        icon = view.findViewById(R.id.notificationActionIcon);\n        summary = view.findViewById(R.id.notificationActionSummary);\n        updateInfo();\n    }\n\n    void updateInfo() {\n        if (NotificationConstants.ACTION_ICONS[selectedAction] == 0) {\n            icon.setImageDrawable(null);\n        } else {\n            icon.setImageDrawable(AppCompatResources.getDrawable(context,\n                    NotificationConstants.ACTION_ICONS[selectedAction]));\n        }\n\n        summary.setText(NotificationConstants.getActionName(context, selectedAction));\n    }\n\n    void openActionChooserDialog() {\n        final LayoutInflater inflater = LayoutInflater.from(context);\n        final SingleChoiceDialogViewBinding binding =\n                SingleChoiceDialogViewBinding.inflate(inflater);\n\n        final AlertDialog alertDialog = new AlertDialog.Builder(context)\n                .setTitle(SLOT_TITLES[i])\n                .setView(binding.getRoot())\n                .setCancelable(true)\n                .create();\n\n        final View.OnClickListener radioButtonsClickListener = v -> {\n            selectedAction = NotificationConstants.ALL_ACTIONS[v.getId()];\n            updateInfo();\n            alertDialog.dismiss();\n        };\n\n        for (int id = 0; id < NotificationConstants.ALL_ACTIONS.length; ++id) {\n            final int action = NotificationConstants.ALL_ACTIONS[id];\n            final RadioButton radioButton = ListRadioIconItemBinding.inflate(inflater)\n                    .getRoot();\n\n            // if present set action icon with correct color\n            final int iconId = NotificationConstants.ACTION_ICONS[action];\n            if (iconId != 0) {\n                radioButton.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, iconId, 0);\n\n                final var color = ColorStateList.valueOf(ThemeHelper\n                        .resolveColorFromAttr(context, android.R.attr.textColorPrimary));\n                TextViewCompat.setCompoundDrawableTintList(radioButton, color);\n            }\n\n            radioButton.setText(NotificationConstants.getActionName(context, action));\n            radioButton.setChecked(action == selectedAction);\n            radioButton.setId(id);\n            radioButton.setLayoutParams(new RadioGroup.LayoutParams(\n                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));\n            radioButton.setOnClickListener(radioButtonsClickListener);\n            binding.list.addView(radioButton);\n        }\n        alertDialog.show();\n\n        if (DeviceUtils.isTv(context)) {\n            FocusOverlayView.setupFocusObserver(alertDialog);\n        }\n    }\n\n    @NotificationConstants.Action\n    public int getSelectedAction() {\n        return selectedAction;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/export/BackupFileLocator.kt",
    "content": "package org.schabi.newpipe.settings.export\n\nimport android.content.Context\nimport java.nio.file.Path\nimport kotlin.io.path.div\n\n/**\n * Locates specific files of NewPipe based on the home directory of the app.\n */\nclass BackupFileLocator(context: Context) {\n    companion object {\n        const val FILE_NAME_DB = \"newpipe.db\"\n\n        @Deprecated(\n            \"Serializing preferences with Java's ObjectOutputStream is vulnerable to injections\",\n            replaceWith = ReplaceWith(\"FILE_NAME_JSON_PREFS\")\n        )\n        const val FILE_NAME_SERIALIZED_PREFS = \"newpipe.settings\"\n        const val FILE_NAME_JSON_PREFS = \"preferences.json\"\n    }\n\n    val db: Path = context.getDatabasePath(FILE_NAME_DB).toPath()\n    val dbJournal: Path = db.resolveSibling(\"$FILE_NAME_DB-journal\")\n    val dbShm: Path = db.resolveSibling(\"$FILE_NAME_DB-shm\")\n    val dbWal: Path = db.resolveSibling(\"$FILE_NAME_DB-wal\")\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/export/ImportExportManager.kt",
    "content": "package org.schabi.newpipe.settings.export\n\nimport android.content.SharedPreferences\nimport com.grack.nanojson.JsonArray\nimport com.grack.nanojson.JsonParser\nimport com.grack.nanojson.JsonParserException\nimport com.grack.nanojson.JsonWriter\nimport java.io.FileNotFoundException\nimport java.io.IOException\nimport java.io.ObjectOutputStream\nimport java.util.zip.ZipOutputStream\nimport kotlin.io.path.createParentDirectories\nimport kotlin.io.path.deleteIfExists\nimport org.schabi.newpipe.streams.io.SharpOutputStream\nimport org.schabi.newpipe.streams.io.StoredFileHelper\nimport org.schabi.newpipe.util.ZipHelper\n\nclass ImportExportManager(private val fileLocator: BackupFileLocator) {\n    companion object {\n        const val TAG = \"ImportExportManager\"\n    }\n\n    /**\n     * Exports given [SharedPreferences] to the file in given outputPath.\n     * It also creates the file.\n     */\n    @Throws(Exception::class)\n    fun exportDatabase(preferences: SharedPreferences, file: StoredFileHelper) {\n        // truncate the file before writing to it, otherwise if the new content is smaller than the\n        // previous file size, the file will retain part of the previous content and be corrupted\n        ZipOutputStream(SharpOutputStream(file.openAndTruncateStream()).buffered()).use { outZip ->\n            // add the database\n            val name = BackupFileLocator.FILE_NAME_DB\n            ZipHelper.addFileToZip(outZip, name, fileLocator.db)\n\n            // add the legacy vulnerable serialized preferences (will be removed in the future)\n            ZipHelper.addFileToZip(\n                outZip,\n                BackupFileLocator.FILE_NAME_SERIALIZED_PREFS\n            ) { byteOutput ->\n                ObjectOutputStream(byteOutput).use { output ->\n                    output.writeObject(preferences.all)\n                    output.flush()\n                }\n            }\n\n            // add the JSON preferences\n            ZipHelper.addFileToZip(\n                outZip,\n                BackupFileLocator.FILE_NAME_JSON_PREFS\n            ) { byteOutput ->\n                JsonWriter\n                    .indent(\"\")\n                    .on(byteOutput)\n                    .`object`(preferences.all)\n                    .done()\n            }\n        }\n    }\n\n    /**\n     * Tries to create database directory if it does not exist.\n     */\n    @Throws(IOException::class)\n    fun ensureDbDirectoryExists() {\n        fileLocator.db.createParentDirectories()\n    }\n\n    /**\n     * Extracts the database from the given file to the app's database directory.\n     * The current app's database will be overwritten.\n     * @param file the .zip file to extract the database from\n     * @return true if the database was successfully extracted, false otherwise\n     */\n    fun extractDb(file: StoredFileHelper): Boolean {\n        val name = BackupFileLocator.FILE_NAME_DB\n        val success = ZipHelper.extractFileFromZip(file, name, fileLocator.db)\n\n        if (success) {\n            fileLocator.dbJournal.deleteIfExists()\n            fileLocator.dbWal.deleteIfExists()\n            fileLocator.dbShm.deleteIfExists()\n        }\n\n        return success\n    }\n\n    @Deprecated(\n        \"Serializing preferences with Java's ObjectOutputStream is vulnerable to injections\",\n        replaceWith = ReplaceWith(\"exportHasJsonPrefs\")\n    )\n    fun exportHasSerializedPrefs(zipFile: StoredFileHelper): Boolean {\n        return ZipHelper.zipContainsFile(zipFile, BackupFileLocator.FILE_NAME_SERIALIZED_PREFS)\n    }\n\n    fun exportHasJsonPrefs(zipFile: StoredFileHelper): Boolean {\n        return ZipHelper.zipContainsFile(zipFile, BackupFileLocator.FILE_NAME_JSON_PREFS)\n    }\n\n    /**\n     * Remove all shared preferences from the app and load the preferences supplied to the manager.\n     */\n    @Deprecated(\n        \"Serializing preferences with Java's ObjectOutputStream is vulnerable to injections\",\n        replaceWith = ReplaceWith(\"loadJsonPrefs\")\n    )\n    @Throws(IOException::class, ClassNotFoundException::class)\n    fun loadSerializedPrefs(zipFile: StoredFileHelper, preferences: SharedPreferences) {\n        ZipHelper.extractFileFromZip(zipFile, BackupFileLocator.FILE_NAME_SERIALIZED_PREFS) {\n            PreferencesObjectInputStream(it).use { input ->\n                @Suppress(\"UNCHECKED_CAST\")\n                val entries = input.readObject() as Map<String, *>\n\n                val editor = preferences.edit()\n                editor.clear()\n\n                for ((key, value) in entries) {\n                    when (value) {\n                        is Boolean -> editor.putBoolean(key, value)\n\n                        is Float -> editor.putFloat(key, value)\n\n                        is Int -> editor.putInt(key, value)\n\n                        is Long -> editor.putLong(key, value)\n\n                        is String -> editor.putString(key, value)\n\n                        is Set<*> -> {\n                            // There are currently only Sets with type String possible\n                            @Suppress(\"UNCHECKED_CAST\")\n                            editor.putStringSet(key, value as Set<String>?)\n                        }\n                    }\n                }\n\n                if (!editor.commit()) {\n                    throw IOException(\"Unable to commit loadSerializedPrefs\")\n                }\n            }\n        }.let { fileExists ->\n            if (!fileExists) {\n                throw FileNotFoundException(BackupFileLocator.FILE_NAME_SERIALIZED_PREFS)\n            }\n        }\n    }\n\n    /**\n     * Remove all shared preferences from the app and load the preferences supplied to the manager.\n     */\n    @Throws(IOException::class, JsonParserException::class)\n    fun loadJsonPrefs(zipFile: StoredFileHelper, preferences: SharedPreferences) {\n        ZipHelper.extractFileFromZip(zipFile, BackupFileLocator.FILE_NAME_JSON_PREFS) {\n            val jsonObject = JsonParser.`object`().from(it)\n\n            val editor = preferences.edit()\n            editor.clear()\n\n            for ((key, value) in jsonObject) {\n                when (value) {\n                    is Boolean -> editor.putBoolean(key, value)\n\n                    is Float -> editor.putFloat(key, value)\n\n                    is Int -> editor.putInt(key, value)\n\n                    is Long -> editor.putLong(key, value)\n\n                    is String -> editor.putString(key, value)\n\n                    is JsonArray -> {\n                        editor.putStringSet(key, value.mapNotNull { e -> e as? String }.toSet())\n                    }\n                }\n            }\n\n            if (!editor.commit()) {\n                throw IOException(\"Unable to commit loadJsonPrefs\")\n            }\n        }.let { fileExists ->\n            if (!fileExists) {\n                throw FileNotFoundException(BackupFileLocator.FILE_NAME_JSON_PREFS)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/export/PreferencesObjectInputStream.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2024-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.settings.export\n\nimport java.io.IOException\nimport java.io.InputStream\nimport java.io.ObjectInputStream\nimport java.io.ObjectStreamClass\n\n/**\n * An [ObjectInputStream] that only allows preferences-related types to be deserialized, to\n * prevent injections. The only allowed types are: all primitive types, all boxed primitive types,\n * null, strings. HashMap, HashSet and arrays of previously defined types are also allowed. Sources:\n * [cmu.edu](https://wiki.sei.cmu.edu/confluence/display/java/SER00-J.+Enable+serialization+compatibility+during+class+evolution) * ,\n * [OWASP cheatsheet](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html#harden-your-own-javaioobjectinputstream) * ,\n * [Apache's `ValidatingObjectInputStream`](https://commons.apache.org/proper/commons-io/apidocs/src-html/org/apache/commons/io/serialization/ValidatingObjectInputStream.html#line-118) *\n */\nclass PreferencesObjectInputStream(stream: InputStream) : ObjectInputStream(stream) {\n    @Throws(ClassNotFoundException::class, IOException::class)\n    override fun resolveClass(desc: ObjectStreamClass): Class<*> {\n        if (desc.name in CLASS_WHITELIST) {\n            return super.resolveClass(desc)\n        } else {\n            throw ClassNotFoundException(\"Class not allowed: $desc.name\")\n        }\n    }\n\n    companion object {\n        /**\n         * Primitive types, strings and other built-in types do not pass through resolveClass() but\n         * instead have a custom encoding; see\n         * [\n         * official docs](https://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html#10152).\n         */\n        private val CLASS_WHITELIST = setOf<String>(\n            \"java.lang.Boolean\",\n            \"java.lang.Byte\",\n            \"java.lang.Character\",\n            \"java.lang.Short\",\n            \"java.lang.Integer\",\n            \"java.lang.Long\",\n            \"java.lang.Float\",\n            \"java.lang.Double\",\n            \"java.lang.Void\",\n            \"java.util.HashMap\",\n            \"java.util.HashSet\"\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/migration/MigrationManager.java",
    "content": "package org.schabi.newpipe.settings.migration;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.core.util.Consumer;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorUtil;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * MigrationManager is responsible for running migrations and showing the user information about\n * the migrations that were applied.\n */\npublic final class MigrationManager {\n\n    private static final String TAG = MigrationManager.class.getSimpleName();\n    /**\n     * List of UI actions that are performed after the UI is initialized (e.g. showing alert\n     * dialogs) to inform the user about changes that were applied by migrations.\n     */\n    private static final List<Consumer<Context>> MIGRATION_INFO = new ArrayList<>();\n\n    private MigrationManager() {\n        // MigrationManager is a utility class that is completely static\n    }\n\n    /**\n     * Run all migrations that are needed for the current version of NewPipe.\n     * This method should be called at the start of the application, before any other operations\n     * that depend on the settings.\n     *\n     * @param context Context that can be used to run migrations\n     */\n    public static void runMigrationsIfNeeded(@NonNull final Context context) {\n        SettingMigrations.runMigrationsIfNeeded(context);\n    }\n\n    /**\n     * Perform UI actions informing about migrations that took place if they are present.\n     * @param context Context that can be used to show dialogs/snackbars/toasts\n     */\n    public static void showUserInfoIfPresent(@NonNull final Context context) {\n        if (MIGRATION_INFO.isEmpty()) {\n            return;\n        }\n\n        try {\n            MIGRATION_INFO.get(0).accept(context);\n        } catch (final Exception e) {\n            ErrorUtil.showUiErrorSnackbar(context, \"Showing migration info to the user\", e);\n            // Remove the migration that caused the error and continue with the next one\n            MIGRATION_INFO.remove(0);\n            showUserInfoIfPresent(context);\n        }\n    }\n\n    /**\n     * Add a migration info action that will be executed after the UI is initialized.\n     * This can be used to show dialogs/snackbars/toasts to inform the user about changes that\n     * were applied by migrations.\n     *\n     * @param info the action to be executed\n     */\n    public static void addMigrationInfo(final Consumer<Context> info) {\n        MIGRATION_INFO.add(info);\n    }\n\n    /**\n     * This method should be called when the user dismisses the migration info\n     * to check if there are any more migration info actions to be shown.\n     * @param context Context that can be used to show dialogs/snackbars/toasts\n     */\n    public static void onMigrationInfoDismissed(@NonNull final Context context) {\n        MIGRATION_INFO.remove(0);\n        showUserInfoIfPresent(context);\n    }\n\n    /**\n     * Creates a dialog to inform the user about the migration.\n     * @param uiContext Context that can be used to show dialogs/snackbars/toasts\n     * @param title the title of the dialog\n     * @param message the message of the dialog\n     * @return the dialog that can be shown to the user with a custom dismiss listener\n     */\n    static AlertDialog createMigrationInfoDialog(@NonNull final Context uiContext,\n                                                 @NonNull final String title,\n                                                 @NonNull final String message) {\n        return new AlertDialog.Builder(uiContext)\n                .setTitle(title)\n                .setMessage(message)\n                .setPositiveButton(R.string.ok, null)\n                .setOnDismissListener(dialog ->\n                        MigrationManager.onMigrationInfoDismissed(uiContext))\n                .setCancelable(false) // prevents the dialog from being dismissed accidentally\n                .create();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java",
    "content": "package org.schabi.newpipe.settings.migration;\n\nimport static org.schabi.newpipe.MainActivity.DEBUG;\nimport static org.schabi.newpipe.extractor.ServiceList.SoundCloud;\nimport static org.schabi.newpipe.extractor.ServiceList.YouTube;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.core.util.Consumer;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.App;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.settings.tabs.Tab;\nimport org.schabi.newpipe.settings.tabs.TabsManager;\nimport org.schabi.newpipe.util.DeviceUtils;\n\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.stream.Collectors;\n\n/**\n * This class contains the code to migrate the settings from one version to another.\n * Migrations are run automatically when the app is started and the settings version changed.\n * <br>\n * In order to add a migration, follow these steps, given {@code P} is the previous version:\n * <ul>\n * <li>in the class body add a new {@code MIGRATION_P_P+1 = new Migration(P, P+1) { ... }} and put\n *     in the {@code migrate()} method the code that need to be run\n *     when migrating from {@code P} to {@code P+1}</li>\n * <li>add {@code MIGRATION_P_P+1} at the end of {@link SettingMigrations#SETTING_MIGRATIONS}</li>\n * <li>increment {@link SettingMigrations#VERSION}'s value by 1\n *     (so it becomes {@code P+1})</li>\n * </ul>\n * Migrations can register UI actions using {@link MigrationManager#addMigrationInfo(Consumer)}\n * that will be performed after the UI is initialized to inform the user about changes\n * that were applied by migrations.\n */\npublic final class SettingMigrations {\n\n    private static final String TAG = SettingMigrations.class.toString();\n    private static SharedPreferences sp;\n\n    private static final Migration MIGRATION_0_1 = new Migration(0, 1) {\n        @Override\n        public void migrate(@NonNull final Context context) {\n            // We changed the content of the dialog which opens when sharing a link to NewPipe\n            // by removing the \"open detail page\" option.\n            // Therefore, show the dialog once again to ensure users need to choose again and are\n            // aware of the changed dialog.\n            final SharedPreferences.Editor editor = sp.edit();\n            editor.putString(context.getString(R.string.preferred_open_action_key),\n                    context.getString(R.string.always_ask_open_action_key));\n            editor.apply();\n        }\n    };\n\n    private static final Migration MIGRATION_1_2 = new Migration(1, 2) {\n        @Override\n        protected void migrate(@NonNull final Context context) {\n            // The new application workflow introduced in #2907 allows minimizing videos\n            // while playing to do other stuff within the app.\n            // For an even better workflow, we minimize a stream when switching the app to play in\n            // background.\n            // Therefore, set default value to background, if it has not been changed yet.\n            final String minimizeOnExitKey = context.getString(R.string.minimize_on_exit_key);\n            if (sp.getString(minimizeOnExitKey, \"\")\n                    .equals(context.getString(R.string.minimize_on_exit_none_key))) {\n                final SharedPreferences.Editor editor = sp.edit();\n                editor.putString(minimizeOnExitKey,\n                        context.getString(R.string.minimize_on_exit_background_key));\n                editor.apply();\n            }\n        }\n    };\n\n    private static final Migration MIGRATION_2_3 = new Migration(2, 3) {\n        @Override\n        protected void migrate(@NonNull final Context context) {\n            // Storage Access Framework implementation was improved in #5415, allowing the modern\n            // and standard way to access folders and files to be used consistently everywhere.\n            // We reset the setting to its default value, i.e. \"use SAF\", since now there are no\n            // more issues with SAF and users should use that one instead of the old\n            // NoNonsenseFilePicker. Also, there's a bug on FireOS in which SAF open/close\n            // dialogs cannot be confirmed with a remote (see #6455).\n            sp.edit().putBoolean(\n                    context.getString(R.string.storage_use_saf),\n                    !DeviceUtils.isFireTv()\n            ).apply();\n        }\n    };\n\n    private static final Migration MIGRATION_3_4 = new Migration(3, 4) {\n        @Override\n        protected void migrate(@NonNull final Context context) {\n            // Pull request #3546 added support for choosing the type of search suggestions to\n            // show, replacing the on-off switch used before, so migrate the previous user choice\n\n            final String showSearchSuggestionsKey =\n                    context.getString(R.string.show_search_suggestions_key);\n\n            boolean addAllSearchSuggestionTypes;\n            try {\n                addAllSearchSuggestionTypes = sp.getBoolean(showSearchSuggestionsKey, true);\n            } catch (final ClassCastException e) {\n                // just in case it was not a boolean for some reason, let's consider it a \"true\"\n                addAllSearchSuggestionTypes = true;\n            }\n\n            final Set<String> showSearchSuggestionsValueList = new HashSet<>();\n            if (addAllSearchSuggestionTypes) {\n                // if the preference was true, all suggestions will be shown, otherwise none\n                Collections.addAll(showSearchSuggestionsValueList, context.getResources()\n                        .getStringArray(R.array.show_search_suggestions_value_list));\n            }\n\n            sp.edit().putStringSet(\n                    showSearchSuggestionsKey, showSearchSuggestionsValueList).apply();\n        }\n    };\n\n    private static final Migration MIGRATION_4_5 = new Migration(4, 5) {\n        @Override\n        protected void migrate(@NonNull final Context context) {\n            final boolean brightness = sp.getBoolean(\"brightness_gesture_control\", true);\n            final boolean volume = sp.getBoolean(\"volume_gesture_control\", true);\n\n            final SharedPreferences.Editor editor = sp.edit();\n\n            editor.putString(context.getString(R.string.right_gesture_control_key),\n                    context.getString(volume\n                            ? R.string.volume_control_key : R.string.none_control_key));\n            editor.putString(context.getString(R.string.left_gesture_control_key),\n                    context.getString(brightness\n                            ? R.string.brightness_control_key : R.string.none_control_key));\n\n            editor.apply();\n        }\n    };\n\n    private static final Migration MIGRATION_5_6 = new Migration(5, 6) {\n        @Override\n        protected void migrate(@NonNull final Context context) {\n            final boolean loadImages = sp.getBoolean(\"download_thumbnail_key\", true);\n\n            sp.edit()\n                    .putString(context.getString(R.string.image_quality_key),\n                            context.getString(loadImages\n                                    ? R.string.image_quality_default\n                                    : R.string.image_quality_none_key))\n                    .apply();\n        }\n    };\n\n    private static final Migration MIGRATION_6_7 = new Migration(6, 7) {\n        @Override\n        protected void migrate(@NonNull final Context context) {\n            // The SoundCloud Top 50 Kiosk was removed in the extractor,\n            // so we remove the corresponding tab if it exists.\n            final TabsManager tabsManager = TabsManager.getManager(context);\n            final List<Tab> tabs = tabsManager.getTabs();\n            final List<Tab> cleanedTabs = tabs.stream()\n                    .filter(tab -> !(tab instanceof Tab.KioskTab kioskTab\n                            && kioskTab.getKioskServiceId() == SoundCloud.getServiceId()\n                            && kioskTab.getKioskId().equals(\"Top 50\")))\n                    .collect(Collectors.toUnmodifiableList());\n            if (tabs.size() != cleanedTabs.size()) {\n                tabsManager.saveTabs(cleanedTabs);\n                // create an AlertDialog to inform the user about the change\n                MigrationManager.addMigrationInfo(uiContext ->\n                        MigrationManager.createMigrationInfoDialog(\n                                uiContext,\n                                uiContext.getString(R.string.migration_info_6_7_title),\n                                uiContext.getString(R.string.migration_info_6_7_message))\n                                .show());\n            }\n        }\n    };\n\n    private static final Migration MIGRATION_7_8 = new Migration(7, 8) {\n        @Override\n        protected void migrate(@NonNull final Context context) {\n            // YouTube remove the combined Trending kiosk, see\n            // https://github.com/TeamNewPipe/NewPipe/discussions/12445 for more information.\n            // If the user has a dedicated YouTube/Trending kiosk tab,\n            // it is removed and replaced with the new live kiosk tab.\n            // The default trending kiosk tab is not touched\n            // because it uses the default kiosk provided by the extractor\n            // and is thus updated automatically.\n            final TabsManager tabsManager = TabsManager.getManager(context);\n            final List<Tab> tabs = tabsManager.getTabs();\n            final List<Tab> cleanedTabs = tabs.stream()\n                    .filter(tab -> !(tab instanceof Tab.KioskTab kioskTab\n                            && kioskTab.getKioskServiceId() == YouTube.getServiceId()\n                            && kioskTab.getKioskId().equals(\"Trending\")))\n                    .collect(Collectors.toUnmodifiableList());\n            if (tabs.size() != cleanedTabs.size()) {\n                tabsManager.saveTabs(cleanedTabs);\n            }\n\n            final boolean hasDefaultTrendingTab = tabs.stream()\n                    .anyMatch(tab -> tab instanceof Tab.DefaultKioskTab);\n\n            if (tabs.size() != cleanedTabs.size() || hasDefaultTrendingTab) {\n                // User is informed about the change\n                MigrationManager.addMigrationInfo(uiContext ->\n                        MigrationManager.createMigrationInfoDialog(\n                                        uiContext,\n                                        uiContext.getString(R.string.migration_info_7_8_title),\n                                        uiContext.getString(R.string.migration_info_7_8_message))\n                                .show());\n            }\n        }\n    };\n\n    /**\n     * List of all implemented migrations.\n     * <p>\n     * <b>Append new migrations to the end of the list</b> to keep it sorted ascending.\n     * If not sorted correctly, migrations which depend on each other, may fail.\n     */\n    private static final Migration[] SETTING_MIGRATIONS = {\n            MIGRATION_0_1,\n            MIGRATION_1_2,\n            MIGRATION_2_3,\n            MIGRATION_3_4,\n            MIGRATION_4_5,\n            MIGRATION_5_6,\n            MIGRATION_6_7,\n            MIGRATION_7_8,\n    };\n\n    /**\n     * Version number for preferences. Must be incremented every time a migration is necessary.\n     */\n    private static final int VERSION = 8;\n\n\n    static void runMigrationsIfNeeded(@NonNull final Context context) {\n        // setup migrations and check if there is something to do\n        sp = PreferenceManager.getDefaultSharedPreferences(context);\n        final String lastPrefVersionKey = context.getString(R.string.last_used_preferences_version);\n        final int lastPrefVersion = sp.getInt(lastPrefVersionKey, 0);\n\n        // no migration to run, already up to date\n        if (App.getInstance().isFirstRun()) {\n            sp.edit().putInt(lastPrefVersionKey, VERSION).apply();\n            return;\n        } else if (lastPrefVersion == VERSION) {\n            return;\n        }\n\n        // run migrations\n        int currentVersion = lastPrefVersion;\n        for (final Migration currentMigration : SETTING_MIGRATIONS) {\n            try {\n                if (currentMigration.shouldMigrate(currentVersion)) {\n                    if (DEBUG) {\n                        Log.d(TAG, \"Migrating preferences from version \"\n                                + currentVersion + \" to \" + currentMigration.newVersion);\n                    }\n                    currentMigration.migrate(context);\n                    currentVersion = currentMigration.newVersion;\n                }\n            } catch (final Exception e) {\n                // save the version with the last successful migration and report the error\n                sp.edit().putInt(lastPrefVersionKey, currentVersion).apply();\n                ErrorUtil.openActivity(context, new ErrorInfo(\n                        e,\n                        UserAction.PREFERENCES_MIGRATION,\n                        \"Migrating preferences from version \" + lastPrefVersion + \" to \"\n                                + VERSION + \". \"\n                                + \"Error at \" + currentVersion  + \" => \" + ++currentVersion\n                ));\n                return;\n            }\n        }\n\n        // store the current preferences version\n        sp.edit().putInt(lastPrefVersionKey, currentVersion).apply();\n    }\n\n    private SettingMigrations() { }\n\n    abstract static class Migration {\n        public final int oldVersion;\n        public final int newVersion;\n\n        protected Migration(final int oldVersion, final int newVersion) {\n            this.oldVersion = oldVersion;\n            this.newVersion = newVersion;\n        }\n\n        /**\n         * @param currentVersion current settings version\n         * @return Returns whether this migration should be run.\n         * A migration is necessary if the old version of this migration is lower than or equal to\n         * the current settings version.\n         */\n        private boolean shouldMigrate(final int currentVersion) {\n            return oldVersion >= currentVersion;\n        }\n\n        protected abstract void migrate(@NonNull Context context);\n\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigAdapter.kt",
    "content": "package org.schabi.newpipe.settings.notifications\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport org.schabi.newpipe.database.subscription.NotificationMode\nimport org.schabi.newpipe.database.subscription.SubscriptionEntity\nimport org.schabi.newpipe.databinding.ItemNotificationConfigBinding\nimport org.schabi.newpipe.settings.notifications.NotificationModeConfigAdapter.SubscriptionHolder\n\n/**\n * This [RecyclerView.Adapter] is used in the [NotificationModeConfigFragment].\n * The adapter holds all subscribed channels and their [NotificationMode]s\n * and provides the needed data structures and methods for this task.\n */\nclass NotificationModeConfigAdapter(\n    private val listener: ModeToggleListener\n) : ListAdapter<SubscriptionItem, SubscriptionHolder>(DiffCallback) {\n    override fun onCreateViewHolder(parent: ViewGroup, i: Int): SubscriptionHolder {\n        return SubscriptionHolder(\n            ItemNotificationConfigBinding\n                .inflate(LayoutInflater.from(parent.context), parent, false)\n        )\n    }\n\n    override fun onBindViewHolder(holder: SubscriptionHolder, position: Int) {\n        holder.bind(currentList[position])\n    }\n\n    fun update(newData: List<SubscriptionEntity>) {\n        val items = newData.map {\n            SubscriptionItem(it.uid, it.name!!, it.notificationMode, it.serviceId, it.url!!)\n        }\n        submitList(items)\n    }\n\n    inner class SubscriptionHolder(\n        private val itemBinding: ItemNotificationConfigBinding\n    ) : RecyclerView.ViewHolder(itemBinding.root) {\n        init {\n            itemView.setOnClickListener {\n                val mode = if (itemBinding.root.isChecked) {\n                    NotificationMode.DISABLED\n                } else {\n                    NotificationMode.ENABLED\n                }\n                listener.onModeChange(bindingAdapterPosition, mode)\n            }\n        }\n\n        fun bind(data: SubscriptionItem) {\n            itemBinding.root.text = data.title\n            itemBinding.root.isChecked = data.notificationMode != NotificationMode.DISABLED\n        }\n    }\n\n    private object DiffCallback : DiffUtil.ItemCallback<SubscriptionItem>() {\n        override fun areItemsTheSame(oldItem: SubscriptionItem, newItem: SubscriptionItem): Boolean {\n            return oldItem.id == newItem.id\n        }\n\n        override fun areContentsTheSame(oldItem: SubscriptionItem, newItem: SubscriptionItem): Boolean {\n            return oldItem == newItem\n        }\n\n        override fun getChangePayload(oldItem: SubscriptionItem, newItem: SubscriptionItem): Any? {\n            return if (oldItem.notificationMode != newItem.notificationMode) {\n                newItem.notificationMode\n            } else {\n                super.getChangePayload(oldItem, newItem)\n            }\n        }\n    }\n\n    fun interface ModeToggleListener {\n        /**\n         * Triggered when the UI representation of a notification mode is changed.\n         */\n        fun onModeChange(position: Int, @NotificationMode mode: Int)\n    }\n}\n\ndata class SubscriptionItem(\n    val id: Long,\n    val title: String,\n    @NotificationMode\n    val notificationMode: Int,\n    val serviceId: Int,\n    val url: String\n)\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/notifications/NotificationModeConfigFragment.kt",
    "content": "package org.schabi.newpipe.settings.notifications\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.disposables.CompositeDisposable\nimport io.reactivex.rxjava3.disposables.Disposable\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.database.subscription.NotificationMode\nimport org.schabi.newpipe.databinding.FragmentChannelsNotificationsBinding\nimport org.schabi.newpipe.local.subscription.SubscriptionManager\n\n/**\n * [NotificationModeConfigFragment] is a settings fragment\n * which allows changing the [NotificationMode] of all subscribed channels.\n * The [NotificationMode] can either be changed one by one or toggled for all channels.\n */\nclass NotificationModeConfigFragment : Fragment() {\n    private var _binding: FragmentChannelsNotificationsBinding? = null\n    private val binding get() = _binding!!\n\n    private val disposables = CompositeDisposable()\n    private var loader: Disposable? = null\n    private lateinit var adapter: NotificationModeConfigAdapter\n    private lateinit var subscriptionManager: SubscriptionManager\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n        subscriptionManager = SubscriptionManager(context)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setHasOptionsMenu(true)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        _binding = FragmentChannelsNotificationsBinding.inflate(inflater, container, false)\n        return binding.root\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        adapter = NotificationModeConfigAdapter { position, mode ->\n            // Notification mode has been changed via the UI.\n            // Now change it in the database.\n            updateNotificationMode(adapter.currentList[position], mode)\n        }\n        binding.recyclerView.adapter = adapter\n        loader?.dispose()\n        loader = subscriptionManager.subscriptions()\n            .observeOn(AndroidSchedulers.mainThread())\n            .subscribe(adapter::update)\n    }\n\n    override fun onDestroyView() {\n        loader?.dispose()\n        loader = null\n        _binding = null\n        super.onDestroyView()\n    }\n\n    override fun onDestroy() {\n        disposables.dispose()\n        super.onDestroy()\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        super.onCreateOptionsMenu(menu, inflater)\n        inflater.inflate(R.menu.menu_notifications_channels, menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            R.id.action_toggle_all -> {\n                toggleAll()\n                true\n            }\n\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun toggleAll() {\n        val mode = adapter.currentList.firstOrNull()?.notificationMode ?: return\n        val newMode = when (mode) {\n            NotificationMode.DISABLED -> NotificationMode.ENABLED\n            else -> NotificationMode.DISABLED\n        }\n        adapter.currentList.forEach { updateNotificationMode(it, newMode) }\n    }\n\n    private fun updateNotificationMode(item: SubscriptionItem, @NotificationMode mode: Int) {\n        disposables.add(\n            subscriptionManager.updateNotificationMode(item.serviceId, item.url, mode)\n                .subscribeOn(Schedulers.io())\n                .subscribe()\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceFuzzySearchFunction.java",
    "content": "package org.schabi.newpipe.settings.preferencesearch;\n\nimport android.text.TextUtils;\nimport android.util.Pair;\n\nimport org.apache.commons.text.similarity.FuzzyScore;\n\nimport java.util.Comparator;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.function.Function;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\npublic class PreferenceFuzzySearchFunction\n        implements PreferenceSearchConfiguration.PreferenceSearchFunction {\n\n    private static final FuzzyScore FUZZY_SCORE = new FuzzyScore(Locale.ROOT);\n\n    @Override\n    public Stream<PreferenceSearchItem> search(\n            final Stream<PreferenceSearchItem> allAvailable,\n            final String keyword\n    ) {\n        final int maxScore = (keyword.length() + 1) * 3 - 2; // First can't get +2 bonus score\n\n        return allAvailable\n                // General search\n                // Check all fields if anyone contains something that kind of matches the keyword\n                .map(item -> new FuzzySearchGeneralDTO(item, keyword))\n                .filter(dto -> dto.getScore() / maxScore >= 0.3f)\n                .map(FuzzySearchGeneralDTO::getItem)\n                // Specific search - Used for determining order of search results\n                // Calculate a score based on specific search fields\n                .map(item -> new FuzzySearchSpecificDTO(item, keyword))\n                .sorted(Comparator.comparingDouble(FuzzySearchSpecificDTO::getScore).reversed())\n                .map(FuzzySearchSpecificDTO::getItem)\n                // Limit the amount of search results\n                .limit(20);\n    }\n\n    static class FuzzySearchGeneralDTO {\n        private final PreferenceSearchItem item;\n        private final float score;\n\n        FuzzySearchGeneralDTO(\n                final PreferenceSearchItem item,\n                final String keyword) {\n            this.item = item;\n            this.score = FUZZY_SCORE.fuzzyScore(\n                    TextUtils.join(\";\", item.getAllRelevantSearchFields()),\n                    keyword);\n        }\n\n        public PreferenceSearchItem getItem() {\n            return item;\n        }\n\n        public float getScore() {\n            return score;\n        }\n    }\n\n    static class FuzzySearchSpecificDTO {\n        private static final Map<Function<PreferenceSearchItem, String>, Float> WEIGHT_MAP = Map.of(\n                // The user will most likely look for the title -> prioritize it\n                PreferenceSearchItem::getTitle, 1.5f,\n                // The summary is also important as it usually contains a larger desc\n                // Example: Searching for '4k' → 'show higher resolution' is shown\n                PreferenceSearchItem::getSummary, 1f,\n                // Entries are also important as they provide all known/possible values\n                // Example: Searching where the resolution can be changed to 720p\n                PreferenceSearchItem::getEntries, 1f\n        );\n\n        private final PreferenceSearchItem item;\n        private final double score;\n\n        FuzzySearchSpecificDTO(final PreferenceSearchItem item, final String keyword) {\n            this.item = item;\n            this.score = WEIGHT_MAP.entrySet().stream()\n                    .map(entry -> new Pair<>(entry.getKey().apply(item), entry.getValue()))\n                    .filter(pair -> !pair.first.isEmpty())\n                    .collect(Collectors.averagingDouble(pair ->\n                            FUZZY_SCORE.fuzzyScore(pair.first, keyword) * pair.second));\n        }\n\n        public PreferenceSearchItem getItem() {\n            return item;\n        }\n\n        public double getScore() {\n            return score;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceParser.java",
    "content": "package org.schabi.newpipe.settings.preferencesearch;\n\nimport android.content.Context;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.XmlRes;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.util.Localization;\nimport org.xmlpull.v1.XmlPullParser;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Parses the corresponding preference-file(s).\n */\npublic class PreferenceParser {\n    private static final String TAG = \"PreferenceParser\";\n\n    private static final String NS_ANDROID = \"http://schemas.android.com/apk/res/android\";\n    private static final String NS_SEARCH = \"http://schemas.android.com/apk/preferencesearch\";\n\n    private final Context context;\n    private final Map<String, ?> allPreferences;\n    private final PreferenceSearchConfiguration searchConfiguration;\n\n    public PreferenceParser(\n            final Context context,\n            final PreferenceSearchConfiguration searchConfiguration\n    ) {\n        this.context = context;\n        this.allPreferences =  PreferenceManager.getDefaultSharedPreferences(context).getAll();\n        this.searchConfiguration = searchConfiguration;\n    }\n\n    public List<PreferenceSearchItem> parse(\n            @XmlRes final int resId\n    ) {\n        final List<PreferenceSearchItem> results = new ArrayList<>();\n        final XmlPullParser xpp = context.getResources().getXml(resId);\n\n        try {\n            xpp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);\n            xpp.setFeature(XmlPullParser.FEATURE_REPORT_NAMESPACE_ATTRIBUTES, true);\n\n            final List<String> breadcrumbs = new ArrayList<>();\n            while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {\n                if (xpp.getEventType() == XmlPullParser.START_TAG) {\n                    final PreferenceSearchItem result = parseSearchResult(\n                            xpp,\n                            Localization.concatenateStrings(\" > \", breadcrumbs),\n                            resId\n                    );\n\n                    if (!searchConfiguration.getParserIgnoreElements().contains(xpp.getName())\n                            && result.hasData()\n                            && !\"true\".equals(getAttribute(xpp, NS_SEARCH, \"ignore\"))) {\n                        results.add(result);\n                    }\n                    if (searchConfiguration.getParserContainerElements().contains(xpp.getName())) {\n                        // This code adds breadcrumbs for certain containers (e.g. PreferenceScreen)\n                        // Example: Video and Audio > Player\n                        breadcrumbs.add(result.getTitle() == null ? \"\" : result.getTitle());\n                    }\n                } else if (xpp.getEventType() == XmlPullParser.END_TAG\n                        && searchConfiguration.getParserContainerElements()\n                            .contains(xpp.getName())) {\n                    breadcrumbs.remove(breadcrumbs.size() - 1);\n                }\n\n                xpp.next();\n            }\n        } catch (final Exception e) {\n            Log.w(TAG, \"Failed to parse resid=\" + resId, e);\n        }\n        return results;\n    }\n\n    private String getAttribute(\n            final XmlPullParser xpp,\n            @NonNull final String attribute\n    ) {\n        final String nsSearchAttr = getAttribute(xpp, NS_SEARCH, attribute);\n        if (nsSearchAttr != null) {\n            return nsSearchAttr;\n        }\n        return getAttribute(xpp, NS_ANDROID, attribute);\n    }\n\n    private String getAttribute(\n            final XmlPullParser xpp,\n            @NonNull final String namespace,\n            @NonNull final String attribute\n    ) {\n        return xpp.getAttributeValue(namespace, attribute);\n    }\n\n    private PreferenceSearchItem parseSearchResult(\n            final XmlPullParser xpp,\n            final String breadcrumbs,\n            @XmlRes final int searchIndexItemResId\n    ) {\n        final String key = readString(getAttribute(xpp, \"key\"));\n        final String[] entries = readStringArray(getAttribute(xpp, \"entries\"));\n        final String[] entryValues = readStringArray(getAttribute(xpp, \"entryValues\"));\n\n        return new PreferenceSearchItem(\n            key,\n            tryFillInPreferenceValue(\n                readString(getAttribute(xpp, \"title\")),\n                key,\n                entries,\n                entryValues),\n            tryFillInPreferenceValue(\n                readString(getAttribute(xpp, \"summary\")),\n                key,\n                entries,\n                entryValues),\n            TextUtils.join(\",\", entries),\n            breadcrumbs,\n            searchIndexItemResId\n        );\n    }\n\n    private String[] readStringArray(@Nullable final String s) {\n        if (s == null) {\n            return new String[0];\n        }\n        if (s.startsWith(\"@\")) {\n            try {\n                return context.getResources().getStringArray(Integer.parseInt(s.substring(1)));\n            } catch (final Exception e) {\n                Log.w(TAG, \"Unable to readStringArray from '\" + s + \"'\", e);\n            }\n        }\n        return new String[0];\n    }\n\n    private String readString(@Nullable final String s) {\n        if (s == null) {\n            return \"\";\n        }\n        if (s.startsWith(\"@\")) {\n            try {\n                return context.getString(Integer.parseInt(s.substring(1)));\n            } catch (final Exception e) {\n                Log.w(TAG, \"Unable to readString from '\" + s + \"'\", e);\n            }\n        }\n        return s;\n    }\n\n    private String tryFillInPreferenceValue(\n            @Nullable final String s,\n            @Nullable final String key,\n            final String[] entries,\n            final String[] entryValues\n    ) {\n        if (s == null) {\n            return \"\";\n        }\n        if (key == null) {\n            return s;\n        }\n\n        // Resolve value\n        Object prefValue = allPreferences.get(key);\n        if (prefValue == null) {\n            return s;\n        }\n\n        /*\n         * Resolve ListPreference values\n         *\n         * entryValues = Values/Keys that are saved\n         * entries     = Actual human readable names\n         */\n        if (entries.length > 0 && entryValues.length == entries.length) {\n            final int entryIndex = Arrays.asList(entryValues).indexOf(prefValue);\n            if (entryIndex != -1) {\n                prefValue = entries[entryIndex];\n            }\n        }\n\n        return String.format(s, prefValue.toString());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchAdapter.java",
    "content": "package org.schabi.newpipe.settings.preferencesearch;\n\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.recyclerview.widget.DiffUtil;\nimport androidx.recyclerview.widget.ListAdapter;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.databinding.SettingsPreferencesearchListItemResultBinding;\n\nimport java.util.function.Consumer;\n\nclass PreferenceSearchAdapter\n        extends ListAdapter<PreferenceSearchItem, PreferenceSearchAdapter.PreferenceViewHolder> {\n    private Consumer<PreferenceSearchItem> onItemClickListener;\n\n    PreferenceSearchAdapter() {\n        super(new PreferenceCallback());\n    }\n\n    @NonNull\n    @Override\n    public PreferenceViewHolder onCreateViewHolder(@NonNull final ViewGroup parent,\n                                                   final int viewType) {\n        return new PreferenceViewHolder(SettingsPreferencesearchListItemResultBinding.inflate(\n                LayoutInflater.from(parent.getContext()), parent, false));\n    }\n\n    @Override\n    public void onBindViewHolder(@NonNull final PreferenceViewHolder holder, final int position) {\n        final PreferenceSearchItem item = getItem(position);\n\n        holder.binding.title.setText(item.getTitle());\n\n        if (item.getSummary().isEmpty()) {\n            holder.binding.summary.setVisibility(View.GONE);\n        } else {\n            holder.binding.summary.setVisibility(View.VISIBLE);\n            holder.binding.summary.setText(item.getSummary());\n        }\n\n        if (item.getBreadcrumbs().isEmpty()) {\n            holder.binding.breadcrumbs.setVisibility(View.GONE);\n        } else {\n            holder.binding.breadcrumbs.setVisibility(View.VISIBLE);\n            holder.binding.breadcrumbs.setText(item.getBreadcrumbs());\n        }\n\n        holder.itemView.setOnClickListener(v -> {\n            if (onItemClickListener != null) {\n                onItemClickListener.accept(item);\n            }\n        });\n    }\n\n    void setOnItemClickListener(final Consumer<PreferenceSearchItem> onItemClickListener) {\n        this.onItemClickListener = onItemClickListener;\n    }\n\n    static class PreferenceViewHolder extends RecyclerView.ViewHolder {\n        final SettingsPreferencesearchListItemResultBinding binding;\n\n        PreferenceViewHolder(final SettingsPreferencesearchListItemResultBinding binding) {\n            super(binding.getRoot());\n            this.binding = binding;\n        }\n    }\n\n    private static final class PreferenceCallback\n            extends DiffUtil.ItemCallback<PreferenceSearchItem> {\n        @Override\n        public boolean areItemsTheSame(@NonNull final PreferenceSearchItem oldItem,\n                                       @NonNull final PreferenceSearchItem newItem) {\n            return oldItem.getKey().equals(newItem.getKey());\n        }\n\n        @Override\n        public boolean areContentsTheSame(@NonNull final PreferenceSearchItem oldItem,\n                                          @NonNull final PreferenceSearchItem newItem) {\n            return oldItem.getAllRelevantSearchFields().equals(newItem\n                    .getAllRelevantSearchFields());\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchConfiguration.java",
    "content": "package org.schabi.newpipe.settings.preferencesearch;\n\nimport androidx.preference.PreferenceCategory;\nimport androidx.preference.PreferenceScreen;\n\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.stream.Stream;\n\npublic class PreferenceSearchConfiguration {\n    private PreferenceSearchFunction searcher = new PreferenceFuzzySearchFunction();\n\n    private final List<String> parserIgnoreElements = List.of(\n            PreferenceCategory.class.getSimpleName());\n    private final List<String> parserContainerElements = List.of(\n            PreferenceCategory.class.getSimpleName(),\n            PreferenceScreen.class.getSimpleName());\n\n\n    public void setSearcher(final PreferenceSearchFunction searcher) {\n        this.searcher = Objects.requireNonNull(searcher);\n    }\n\n    public PreferenceSearchFunction getSearcher() {\n        return searcher;\n    }\n\n    public List<String> getParserIgnoreElements() {\n        return parserIgnoreElements;\n    }\n\n    public List<String> getParserContainerElements() {\n        return parserContainerElements;\n    }\n\n    @FunctionalInterface\n    public interface PreferenceSearchFunction {\n        Stream<PreferenceSearchItem> search(\n                Stream<PreferenceSearchItem> allAvailable,\n                String keyword);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchFragment.java",
    "content": "package org.schabi.newpipe.settings.preferencesearch;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.fragment.app.Fragment;\nimport androidx.recyclerview.widget.LinearLayoutManager;\n\nimport org.schabi.newpipe.databinding.SettingsPreferencesearchFragmentBinding;\n\nimport java.util.List;\n\n/**\n * Displays the search results.\n */\npublic class PreferenceSearchFragment extends Fragment {\n    public static final String NAME = PreferenceSearchFragment.class.getSimpleName();\n\n    private PreferenceSearcher searcher;\n\n    private SettingsPreferencesearchFragmentBinding binding;\n    private PreferenceSearchAdapter adapter;\n\n    public void setSearcher(final PreferenceSearcher searcher) {\n        this.searcher = searcher;\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(\n            @NonNull final LayoutInflater inflater,\n            @Nullable final ViewGroup container,\n            @Nullable final Bundle savedInstanceState\n    ) {\n        binding = SettingsPreferencesearchFragmentBinding.inflate(inflater, container, false);\n\n        binding.searchResults.setLayoutManager(new LinearLayoutManager(getContext()));\n\n        adapter = new PreferenceSearchAdapter();\n        adapter.setOnItemClickListener(this::onItemClicked);\n        binding.searchResults.setAdapter(adapter);\n\n        return binding.getRoot();\n    }\n\n    public void updateSearchResults(final String keyword) {\n        if (adapter == null || searcher == null) {\n            return;\n        }\n\n        final List<PreferenceSearchItem> results = searcher.searchFor(keyword);\n        adapter.submitList(results);\n        setEmptyViewShown(results.isEmpty());\n    }\n\n    private void setEmptyViewShown(final boolean shown) {\n        binding.emptyStateView.setVisibility(shown ? View.VISIBLE : View.GONE);\n        binding.searchResults.setVisibility(shown ? View.GONE : View.VISIBLE);\n    }\n\n    public void onItemClicked(final PreferenceSearchItem item) {\n        if (!(getActivity() instanceof PreferenceSearchResultListener)) {\n            throw new ClassCastException(\n                getActivity().toString() + \" must implement SearchPreferenceResultListener\");\n        }\n\n        ((PreferenceSearchResultListener) getActivity()).onSearchResultClicked(item);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchItem.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2022-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.settings.preferencesearch\n\nimport androidx.annotation.XmlRes\n\n/**\n * Represents a preference-item inside the search.\n *\n * @param key Key of the setting/preference. E.g. used inside [android.content.SharedPreferences].\n * @param title Title of the setting, e.g. 'Default resolution' or 'Show higher resolutions'.\n * @param summary Summary of the setting, e.g. '480p' or 'Only some devices can play 2k/4k'.\n * @param entries Possible entries of the setting, e.g. 480p,720p,...\n * @param breadcrumbs Breadcrumbs - a hint where the setting is located e.g. 'Video and Audio > Player'\n * @param searchIndexItemResId The xml-resource where this item was found/built from.\n */\n\ndata class PreferenceSearchItem(\n    val key: String,\n    val title: String,\n    val summary: String,\n    val entries: String,\n    val breadcrumbs: String,\n    @XmlRes val searchIndexItemResId: Int\n) {\n    val allRelevantSearchFields: List<String>\n        get() = listOf(title, summary, entries, breadcrumbs)\n\n    fun hasData(): Boolean {\n        return !key.isEmpty() && !title.isEmpty()\n    }\n\n    override fun toString(): String {\n        return \"PreferenceItem: $title $summary $key\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultHighlighter.java",
    "content": "package org.schabi.newpipe.settings.preferencesearch;\n\nimport android.content.res.Resources;\nimport android.content.res.TypedArray;\nimport android.graphics.PorterDuff;\nimport android.graphics.PorterDuffColorFilter;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.RippleDrawable;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.util.Log;\nimport android.util.TypedValue;\n\nimport androidx.appcompat.content.res.AppCompatResources;\nimport androidx.preference.Preference;\nimport androidx.preference.PreferenceFragmentCompat;\nimport androidx.preference.PreferenceGroup;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport org.schabi.newpipe.R;\n\n\npublic final class PreferenceSearchResultHighlighter {\n    private static final String TAG = \"PrefSearchResHighlter\";\n\n    private PreferenceSearchResultHighlighter() {\n    }\n\n    /**\n     * Highlight the specified preference.\n     * <br/>\n     * Note: This function is Thread independent (can be called from outside of the main thread).\n     *\n     * @param item The item to highlight\n     * @param prefsFragment The fragment where the items is located on\n     */\n    public static void highlight(\n            final PreferenceSearchItem item,\n            final PreferenceFragmentCompat prefsFragment\n    ) {\n        new Handler(Looper.getMainLooper()).post(() -> doHighlight(item, prefsFragment));\n    }\n\n    private static void doHighlight(\n            final PreferenceSearchItem item,\n            final PreferenceFragmentCompat prefsFragment\n    ) {\n        final Preference prefResult = prefsFragment.findPreference(item.getKey());\n\n        if (prefResult == null) {\n            Log.w(TAG, \"Preference '\" + item.getKey() + \"' not found on '\" + prefsFragment + \"'\");\n            return;\n        }\n\n        final RecyclerView recyclerView = prefsFragment.getListView();\n        final RecyclerView.Adapter<?> adapter = recyclerView.getAdapter();\n        if (adapter instanceof PreferenceGroup.PreferencePositionCallback) {\n            final int position = ((PreferenceGroup.PreferencePositionCallback) adapter)\n                    .getPreferenceAdapterPosition(prefResult);\n            if (position != RecyclerView.NO_POSITION) {\n                recyclerView.scrollToPosition(position);\n                recyclerView.postDelayed(() -> {\n                    final RecyclerView.ViewHolder holder =\n                            recyclerView.findViewHolderForAdapterPosition(position);\n                    if (holder != null) {\n                        final Drawable background = holder.itemView.getBackground();\n                        if (background instanceof RippleDrawable) {\n                            showRippleAnimation((RippleDrawable) background);\n                            return;\n                        }\n                    }\n                    highlightFallback(prefsFragment, prefResult);\n                }, 200);\n                return;\n            }\n        }\n        highlightFallback(prefsFragment, prefResult);\n    }\n\n    /**\n     * Alternative highlighting (shows an → arrow in front of the setting)if ripple does not work.\n     *\n     * @param prefsFragment\n     * @param prefResult\n     */\n    private static void highlightFallback(\n            final PreferenceFragmentCompat prefsFragment,\n            final Preference prefResult\n    ) {\n        // Get primary color from text for highlight icon\n        final TypedValue typedValue = new TypedValue();\n        final Resources.Theme theme = prefsFragment.getActivity().getTheme();\n        theme.resolveAttribute(android.R.attr.textColorPrimary, typedValue, true);\n        final TypedArray arr = prefsFragment.getActivity()\n                .obtainStyledAttributes(\n                        typedValue.data,\n                        new int[]{android.R.attr.textColorPrimary});\n        final int color = arr.getColor(0, 0xffE53935);\n        arr.recycle();\n\n        // Show highlight icon\n        final Drawable oldIcon = prefResult.getIcon();\n        final boolean oldSpaceReserved = prefResult.isIconSpaceReserved();\n        final Drawable highlightIcon =\n                AppCompatResources.getDrawable(\n                        prefsFragment.requireContext(),\n                        R.drawable.ic_play_arrow);\n        highlightIcon.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));\n        prefResult.setIcon(highlightIcon);\n\n        prefsFragment.scrollToPreference(prefResult);\n\n        new Handler(Looper.getMainLooper()).postDelayed(() -> {\n            prefResult.setIcon(oldIcon);\n            prefResult.setIconSpaceReserved(oldSpaceReserved);\n        }, 1000);\n    }\n\n    private static void showRippleAnimation(final RippleDrawable rippleDrawable) {\n        rippleDrawable.setState(\n                new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled});\n        new Handler(Looper.getMainLooper())\n                .postDelayed(() -> rippleDrawable.setState(new int[]{}), 1000);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearchResultListener.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2022-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.settings.preferencesearch\n\ninterface PreferenceSearchResultListener {\n    fun onSearchResultClicked(result: PreferenceSearchItem)\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/preferencesearch/PreferenceSearcher.java",
    "content": "package org.schabi.newpipe.settings.preferencesearch;\n\nimport android.text.TextUtils;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\npublic class PreferenceSearcher {\n    private final List<PreferenceSearchItem> allEntries = new ArrayList<>();\n\n    private final PreferenceSearchConfiguration configuration;\n\n    public PreferenceSearcher(final PreferenceSearchConfiguration configuration) {\n        this.configuration = configuration;\n    }\n\n    public void add(final List<PreferenceSearchItem> items) {\n        allEntries.addAll(items);\n    }\n\n    List<PreferenceSearchItem> searchFor(final String keyword) {\n        if (TextUtils.isEmpty(keyword)) {\n            return Collections.emptyList();\n        }\n\n        return configuration.getSearcher()\n                .search(allEntries.stream(), keyword)\n                .collect(Collectors.toList());\n    }\n\n    public void clear() {\n        allEntries.clear();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/preferencesearch/package-info.java",
    "content": "/**\n * Contains classes for searching inside the preferences.\n * <br/>\n * This code is based on\n * <a href=\"https://github.com/ByteHamster/SearchPreference\">ByteHamster/SearchPreference</a>\n * (MIT license) but was heavily modified/refactored for our use.\n *\n * @author litetex\n */\npackage org.schabi.newpipe.settings.preferencesearch;\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/tabs/AddTabDialog.java",
    "content": "package org.schabi.newpipe.settings.tabs;\n\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\nimport android.widget.TextView;\n\nimport androidx.annotation.DrawableRes;\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.appcompat.widget.AppCompatImageView;\n\nimport org.schabi.newpipe.R;\n\npublic final class AddTabDialog {\n    private final AlertDialog dialog;\n\n    AddTabDialog(@NonNull final Context context, @NonNull final ChooseTabListItem[] items,\n                 @NonNull final DialogInterface.OnClickListener actions) {\n\n        dialog = new AlertDialog.Builder(context)\n                .setTitle(context.getString(R.string.tab_choose))\n                .setAdapter(new DialogListAdapter(context, items), actions)\n                .create();\n    }\n\n    public void show() {\n        dialog.show();\n    }\n\n    static final class ChooseTabListItem {\n        final int tabId;\n        final String itemName;\n        @DrawableRes\n        final int itemIcon;\n\n        ChooseTabListItem(final Context context, final Tab tab) {\n            this(tab.getTabId(), tab.getTabName(context), tab.getTabIconRes(context));\n        }\n\n        ChooseTabListItem(final int tabId, final String itemName,\n                          @DrawableRes final int itemIcon) {\n            this.tabId = tabId;\n            this.itemName = itemName;\n            this.itemIcon = itemIcon;\n        }\n    }\n\n    private static final class DialogListAdapter extends BaseAdapter {\n        private final LayoutInflater inflater;\n        private final ChooseTabListItem[] items;\n\n        @DrawableRes\n        private final int fallbackIcon;\n\n        private DialogListAdapter(final Context context, final ChooseTabListItem[] items) {\n            this.inflater = LayoutInflater.from(context);\n            this.items = items;\n            this.fallbackIcon = R.drawable.ic_whatshot;\n        }\n\n        @Override\n        public int getCount() {\n            return items.length;\n        }\n\n        @Override\n        public ChooseTabListItem getItem(final int position) {\n            return items[position];\n        }\n\n        @Override\n        public long getItemId(final int position) {\n            return getItem(position).tabId;\n        }\n\n        @Override\n        public View getView(final int position, final View view, final ViewGroup parent) {\n            View convertView = view;\n            if (convertView == null) {\n                convertView = inflater.inflate(R.layout.list_choose_tabs_dialog, parent, false);\n            }\n\n            final ChooseTabListItem item = getItem(position);\n            final AppCompatImageView tabIconView = convertView.findViewById(R.id.tabIcon);\n            final TextView tabNameView = convertView.findViewById(R.id.tabName);\n\n            tabIconView.setImageResource(item.itemIcon > 0 ? item.itemIcon : fallbackIcon);\n            tabNameView.setText(item.itemName);\n\n            return convertView;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java",
    "content": "package org.schabi.newpipe.settings.tabs;\n\nimport static org.schabi.newpipe.settings.tabs.Tab.typeFrom;\nimport static org.schabi.newpipe.util.ServiceHelper.getNameOfServiceById;\n\nimport android.annotation.SuppressLint;\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.appcompat.widget.AppCompatImageView;\nimport androidx.fragment.app.Fragment;\nimport androidx.recyclerview.widget.ItemTouchHelper;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.google.android.material.floatingactionbutton.FloatingActionButton;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.settings.SelectChannelFragment;\nimport org.schabi.newpipe.settings.SelectKioskFragment;\nimport org.schabi.newpipe.settings.SelectPlaylistFragment;\nimport org.schabi.newpipe.settings.SelectFeedGroupFragment;\nimport org.schabi.newpipe.settings.tabs.AddTabDialog.ChooseTabListItem;\nimport org.schabi.newpipe.util.ThemeHelper;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\npublic class ChooseTabsFragment extends Fragment {\n    private TabsManager tabsManager;\n\n    private final List<Tab> tabList = new ArrayList<>();\n    private ChooseTabsFragment.SelectedTabsAdapter selectedTabsAdapter;\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Lifecycle\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreate(@Nullable final Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        tabsManager = TabsManager.getManager(requireContext());\n        updateTabList();\n\n        setHasOptionsMenu(true);\n    }\n\n    @Override\n    public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,\n                             final Bundle savedInstanceState) {\n        return inflater.inflate(R.layout.fragment_choose_tabs, container, false);\n    }\n\n    @Override\n    public void onViewCreated(@NonNull final View rootView,\n                              @Nullable final Bundle savedInstanceState) {\n        super.onViewCreated(rootView, savedInstanceState);\n\n        initButton(rootView);\n\n        final RecyclerView listSelectedTabs = rootView.findViewById(R.id.selectedTabs);\n        listSelectedTabs.setLayoutManager(new LinearLayoutManager(requireContext()));\n\n        final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(getItemTouchCallback());\n        itemTouchHelper.attachToRecyclerView(listSelectedTabs);\n\n        selectedTabsAdapter = new SelectedTabsAdapter(requireContext(), itemTouchHelper);\n        listSelectedTabs.setAdapter(selectedTabsAdapter);\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        ThemeHelper.setTitleToAppCompatActivity(getActivity(),\n                getString(R.string.main_page_content));\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n        saveChanges();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Menu\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Override\n    public void onCreateOptionsMenu(@NonNull final Menu menu,\n                                    @NonNull final MenuInflater inflater) {\n        super.onCreateOptionsMenu(menu, inflater);\n        inflater.inflate(R.menu.menu_chooser_fragment, menu);\n        menu.findItem(R.id.menu_item_restore_default).setOnMenuItemClickListener(item -> {\n            restoreDefaults();\n            return true;\n        });\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private void updateTabList() {\n        tabList.clear();\n        tabList.addAll(tabsManager.getTabs());\n    }\n\n    private void saveChanges() {\n        tabsManager.saveTabs(tabList);\n    }\n\n    private void restoreDefaults() {\n        new AlertDialog.Builder(requireContext())\n                .setTitle(R.string.restore_defaults)\n                .setMessage(R.string.restore_defaults_confirmation)\n                .setNegativeButton(R.string.cancel, null)\n                .setPositiveButton(R.string.ok, (dialog, which) -> {\n                    tabsManager.resetTabs();\n                    updateTabList();\n                    selectedTabsAdapter.notifyDataSetChanged();\n                })\n                .show();\n    }\n\n    private void initButton(final View rootView) {\n        final FloatingActionButton fab = rootView.findViewById(R.id.addTabsButton);\n        fab.setOnClickListener(v -> {\n            final ChooseTabListItem[] availableTabs = getAvailableTabs(requireContext());\n\n            if (availableTabs.length == 0) {\n                //Toast.makeText(requireContext(), \"No available tabs\", Toast.LENGTH_SHORT).show();\n                return;\n            }\n\n            final Dialog.OnClickListener actionListener = (dialog, which) -> {\n                final ChooseTabListItem selected = availableTabs[which];\n                addTab(selected.tabId);\n            };\n\n            new AddTabDialog(requireContext(), availableTabs, actionListener)\n                    .show();\n        });\n    }\n\n    private void addTab(final Tab tab) {\n        tabList.add(tab);\n        selectedTabsAdapter.notifyDataSetChanged();\n    }\n\n    private void addTab(final int tabId) {\n        final Tab.Type type = typeFrom(tabId);\n\n        if (type == null) {\n            ErrorUtil.showSnackbar(this,\n                    new ErrorInfo(new IllegalStateException(\"Tab id not found: \" + tabId),\n                            UserAction.SOMETHING_ELSE, \"Choosing tabs on settings\"));\n            return;\n        }\n\n        switch (type) {\n            case KIOSK:\n                final SelectKioskFragment selectKioskFragment = new SelectKioskFragment();\n                selectKioskFragment.setOnSelectedListener((serviceId, kioskId, kioskName) ->\n                        addTab(new Tab.KioskTab(serviceId, kioskId)));\n                selectKioskFragment.show(getParentFragmentManager(), \"select_kiosk\");\n                return;\n            case CHANNEL:\n                final SelectChannelFragment selectChannelFragment = new SelectChannelFragment();\n                selectChannelFragment.setOnSelectedListener((serviceId, url, name) ->\n                        addTab(new Tab.ChannelTab(serviceId, url, name)));\n                selectChannelFragment.show(getParentFragmentManager(), \"select_channel\");\n                return;\n            case PLAYLIST:\n                final SelectPlaylistFragment selectPlaylistFragment = new SelectPlaylistFragment();\n                selectPlaylistFragment.setOnSelectedListener(\n                        new SelectPlaylistFragment.OnSelectedListener() {\n                            @Override\n                            public void onLocalPlaylistSelected(final long id, final String name) {\n                                addTab(new Tab.PlaylistTab(id, name));\n                            }\n\n                            @Override\n                            public void onRemotePlaylistSelected(\n                                    final int serviceId, final String url, final String name) {\n                                addTab(new Tab.PlaylistTab(serviceId, url, name));\n                            }\n                        });\n                selectPlaylistFragment.show(getParentFragmentManager(), \"select_playlist\");\n                return;\n            case FEEDGROUP:\n                final SelectFeedGroupFragment selectFeedGroupFragment =\n                        new SelectFeedGroupFragment();\n                selectFeedGroupFragment.setOnSelectedListener(\n                        (groupId, name, iconId) ->\n                                addTab(new Tab.FeedGroupTab(groupId, name, iconId)));\n                selectFeedGroupFragment.show(getParentFragmentManager(), \"select_feed_group\");\n                return;\n            default:\n                addTab(type.getTab());\n                break;\n        }\n    }\n\n    private ChooseTabListItem[] getAvailableTabs(final Context context) {\n        final ArrayList<ChooseTabListItem> returnList = new ArrayList<>();\n\n        for (final Tab.Type type : Tab.Type.values()) {\n            final Tab tab = type.getTab();\n            switch (type) {\n                case BLANK:\n                    if (!tabList.contains(tab)) {\n                        returnList.add(new ChooseTabListItem(tab.getTabId(),\n                                getString(R.string.blank_page_summary),\n                                tab.getTabIconRes(context)));\n                    }\n                    break;\n                case KIOSK:\n                    returnList.add(new ChooseTabListItem(tab.getTabId(),\n                            getString(R.string.kiosk_page_summary),\n                            R.drawable.ic_whatshot));\n                    break;\n                case CHANNEL:\n                    returnList.add(new ChooseTabListItem(tab.getTabId(),\n                            getString(R.string.channel_page_summary),\n                            tab.getTabIconRes(context)));\n                    break;\n                case DEFAULT_KIOSK:\n                    if (!tabList.contains(tab)) {\n                        returnList.add(new ChooseTabListItem(tab.getTabId(),\n                                getString(R.string.default_kiosk_page_summary),\n                                R.drawable.ic_whatshot));\n                    }\n                    break;\n                case PLAYLIST:\n                    returnList.add(new ChooseTabListItem(tab.getTabId(),\n                            getString(R.string.playlist_page_summary),\n                            tab.getTabIconRes(context)));\n                    break;\n                case FEEDGROUP:\n                    returnList.add(new ChooseTabListItem(tab.getTabId(),\n                            getString(R.string.feed_group_page_summary),\n                            tab.getTabIconRes(context)));\n                    break;\n                default:\n                    if (!tabList.contains(tab)) {\n                        returnList.add(new ChooseTabListItem(context, tab));\n                    }\n                    break;\n            }\n        }\n\n        return returnList.toArray(new ChooseTabListItem[0]);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // List Handling\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private ItemTouchHelper.SimpleCallback getItemTouchCallback() {\n        return new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN,\n                ItemTouchHelper.START | ItemTouchHelper.END) {\n            @Override\n            public int interpolateOutOfBoundsScroll(@NonNull final RecyclerView recyclerView,\n                                                    final int viewSize,\n                                                    final int viewSizeOutOfBounds,\n                                                    final int totalSize,\n                                                    final long msSinceStartScroll) {\n                final int standardSpeed = super.interpolateOutOfBoundsScroll(recyclerView, viewSize,\n                        viewSizeOutOfBounds, totalSize, msSinceStartScroll);\n                final int minimumAbsVelocity = Math.max(12,\n                        Math.abs(standardSpeed));\n                return minimumAbsVelocity * (int) Math.signum(viewSizeOutOfBounds);\n            }\n\n            @Override\n            public boolean onMove(@NonNull final RecyclerView recyclerView,\n                                  @NonNull final RecyclerView.ViewHolder source,\n                                  @NonNull final RecyclerView.ViewHolder target) {\n                if (source.getItemViewType() != target.getItemViewType()\n                        || selectedTabsAdapter == null) {\n                    return false;\n                }\n\n                final int sourceIndex = source.getBindingAdapterPosition();\n                final int targetIndex = target.getBindingAdapterPosition();\n                selectedTabsAdapter.swapItems(sourceIndex, targetIndex);\n                return true;\n            }\n\n            @Override\n            public boolean isLongPressDragEnabled() {\n                return false;\n            }\n\n            @Override\n            public boolean isItemViewSwipeEnabled() {\n                return true;\n            }\n\n            @Override\n            public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder,\n                                 final int swipeDir) {\n                final int position = viewHolder.getBindingAdapterPosition();\n                tabList.remove(position);\n                selectedTabsAdapter.notifyItemRemoved(position);\n\n                if (tabList.isEmpty()) {\n                    tabList.add(Tab.Type.BLANK.getTab());\n                    selectedTabsAdapter.notifyItemInserted(0);\n                }\n            }\n        };\n    }\n\n    private class SelectedTabsAdapter\n            extends RecyclerView.Adapter<ChooseTabsFragment.SelectedTabsAdapter.TabViewHolder> {\n        private final LayoutInflater inflater;\n        private final ItemTouchHelper itemTouchHelper;\n\n        SelectedTabsAdapter(final Context context, final ItemTouchHelper itemTouchHelper) {\n            this.itemTouchHelper = itemTouchHelper;\n            this.inflater = LayoutInflater.from(context);\n        }\n\n        public void swapItems(final int fromPosition, final int toPosition) {\n            Collections.swap(tabList, fromPosition, toPosition);\n            notifyItemMoved(fromPosition, toPosition);\n        }\n\n        @NonNull\n        @Override\n        public ChooseTabsFragment.SelectedTabsAdapter.TabViewHolder onCreateViewHolder(\n                @NonNull final ViewGroup parent, final int viewType) {\n            final View view = inflater.inflate(R.layout.list_choose_tabs, parent, false);\n            return new ChooseTabsFragment.SelectedTabsAdapter.TabViewHolder(view);\n        }\n\n        @Override\n        public void onBindViewHolder(\n                @NonNull final ChooseTabsFragment.SelectedTabsAdapter.TabViewHolder holder,\n                final int position) {\n            holder.bind(position, holder);\n        }\n\n        @Override\n        public int getItemCount() {\n            return tabList.size();\n        }\n\n        class TabViewHolder extends RecyclerView.ViewHolder {\n            private final AppCompatImageView tabIconView;\n            private final TextView tabNameView;\n            private final ImageView handle;\n\n            TabViewHolder(final View itemView) {\n                super(itemView);\n\n                tabNameView = itemView.findViewById(R.id.tabName);\n                tabIconView = itemView.findViewById(R.id.tabIcon);\n                handle = itemView.findViewById(R.id.handle);\n            }\n\n            @SuppressLint(\"ClickableViewAccessibility\")\n            void bind(final int position, final TabViewHolder holder) {\n                handle.setOnTouchListener(getOnTouchListener(holder));\n\n                final Tab tab = tabList.get(position);\n                final Tab.Type type = Tab.typeFrom(tab.getTabId());\n\n                if (type == null) {\n                    return;\n                }\n\n                tabNameView.setText(getTabName(type, tab));\n                tabIconView.setImageResource(tab.getTabIconRes(requireContext()));\n            }\n\n            private String getTabName(@NonNull final Tab.Type type, @NonNull final Tab tab) {\n                switch (type) {\n                    case BLANK:\n                        return getString(R.string.blank_page_summary);\n                    case DEFAULT_KIOSK:\n                        return getString(R.string.default_kiosk_page_summary);\n                    case KIOSK:\n                        return getNameOfServiceById(((Tab.KioskTab) tab).getKioskServiceId())\n                                + \"/\" + tab.getTabName(requireContext());\n                    case CHANNEL:\n                        return getNameOfServiceById(((Tab.ChannelTab) tab).getChannelServiceId())\n                                + \"/\" + tab.getTabName(requireContext());\n                    case PLAYLIST:\n                        final int serviceId = ((Tab.PlaylistTab) tab).getPlaylistServiceId();\n                        final String serviceName = serviceId == -1\n                                ? getString(R.string.local)\n                                : getNameOfServiceById(serviceId);\n                        return serviceName + \"/\" + tab.getTabName(requireContext());\n                    case FEEDGROUP:\n                        return getString(R.string.feed_groups_header_title)\n                                + \"/\" + ((Tab.FeedGroupTab) tab).getFeedGroupName();\n                    default:\n                        return tab.getTabName(requireContext());\n                }\n            }\n\n            @SuppressLint(\"ClickableViewAccessibility\")\n            private View.OnTouchListener getOnTouchListener(final RecyclerView.ViewHolder item) {\n                return (view, motionEvent) -> {\n                    if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) {\n                        if (itemTouchHelper != null && getItemCount() > 1) {\n                            itemTouchHelper.startDrag(item);\n                            return true;\n                        }\n                    }\n                    return false;\n                };\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java",
    "content": "package org.schabi.newpipe.settings.tabs;\n\nimport android.content.Context;\n\nimport androidx.annotation.DrawableRes;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.fragment.app.Fragment;\n\nimport com.grack.nanojson.JsonObject;\nimport com.grack.nanojson.JsonStringWriter;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.LocalItem.LocalItemType;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.fragments.BlankFragment;\nimport org.schabi.newpipe.fragments.list.channel.ChannelFragment;\nimport org.schabi.newpipe.fragments.list.kiosk.DefaultKioskFragment;\nimport org.schabi.newpipe.fragments.list.kiosk.KioskFragment;\nimport org.schabi.newpipe.fragments.list.playlist.PlaylistFragment;\nimport org.schabi.newpipe.local.bookmark.BookmarkFragment;\nimport org.schabi.newpipe.local.feed.FeedFragment;\nimport org.schabi.newpipe.local.history.StatisticsPlaylistFragment;\nimport org.schabi.newpipe.local.playlist.LocalPlaylistFragment;\nimport org.schabi.newpipe.local.subscription.SubscriptionFragment;\nimport org.schabi.newpipe.util.KioskTranslator;\nimport org.schabi.newpipe.util.ServiceHelper;\n\nimport java.util.Objects;\n\npublic abstract class Tab {\n    private static final String JSON_TAB_ID_KEY = \"tab_id\";\n\n    private static final String NO_NAME = \"<no-name>\";\n    private static final String NO_ID = \"<no-id>\";\n    private static final String NO_URL = \"<no-url>\";\n\n    Tab() {\n    }\n\n    Tab(@NonNull final JsonObject jsonObject) {\n        readDataFromJson(jsonObject);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Tab Handling\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @Nullable\n    public static Tab from(@NonNull final JsonObject jsonObject) {\n        final int tabId = jsonObject.getInt(Tab.JSON_TAB_ID_KEY, -1);\n\n        if (tabId == -1) {\n            return null;\n        }\n\n        return from(tabId, jsonObject);\n    }\n\n    @Nullable\n    public static Tab from(final int tabId) {\n        return from(tabId, null);\n    }\n\n    @Nullable\n    public static Type typeFrom(final int tabId) {\n        for (final Type available : Type.values()) {\n            if (available.getTabId() == tabId) {\n                return available;\n            }\n        }\n        return null;\n    }\n\n    @Nullable\n    private static Tab from(final int tabId, @Nullable final JsonObject jsonObject) {\n        final Type type = typeFrom(tabId);\n\n        if (type == null) {\n            return null;\n        }\n\n        if (jsonObject != null) {\n            switch (type) {\n                case KIOSK:\n                    return new KioskTab(jsonObject);\n                case CHANNEL:\n                    return new ChannelTab(jsonObject);\n                case PLAYLIST:\n                    return new PlaylistTab(jsonObject);\n                case FEEDGROUP:\n                    return new FeedGroupTab(jsonObject);\n            }\n        }\n\n        return type.getTab();\n    }\n\n    public abstract int getTabId();\n\n    public abstract String getTabName(Context context);\n\n    @DrawableRes\n    public abstract int getTabIconRes(Context context);\n\n    /**\n     * Return a instance of the fragment that this tab represent.\n     *\n     * @param context Android app context\n     * @return the fragment this tab represents\n     */\n    public abstract Fragment getFragment(Context context) throws ExtractionException;\n\n    @Override\n    public boolean equals(final Object obj) {\n        if (!(obj instanceof Tab)) {\n            return false;\n        }\n        final Tab other = (Tab) obj;\n        return getTabId() == other.getTabId();\n    }\n\n    @Override\n    public int hashCode() {\n        return Objects.hashCode(getTabId());\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // JSON Handling\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public void writeJsonOn(final JsonStringWriter jsonSink) {\n        jsonSink.object();\n\n        jsonSink.value(JSON_TAB_ID_KEY, getTabId());\n        writeDataToJson(jsonSink);\n\n        jsonSink.end();\n    }\n\n    protected void writeDataToJson(final JsonStringWriter writerSink) {\n        // No-op\n    }\n\n    protected void readDataFromJson(final JsonObject jsonObject) {\n        // No-op\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Implementations\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public enum Type {\n        BLANK(new BlankTab()),\n        DEFAULT_KIOSK(new DefaultKioskTab()),\n        SUBSCRIPTIONS(new SubscriptionsTab()),\n        FEED(new FeedTab()),\n        BOOKMARKS(new BookmarksTab()),\n        HISTORY(new HistoryTab()),\n        KIOSK(new KioskTab()),\n        CHANNEL(new ChannelTab()),\n        PLAYLIST(new PlaylistTab()),\n        FEEDGROUP(new FeedGroupTab());\n\n        private final Tab tab;\n\n        Type(final Tab tab) {\n            this.tab = tab;\n        }\n\n        public int getTabId() {\n            return tab.getTabId();\n        }\n\n        public Tab getTab() {\n            return tab;\n        }\n    }\n\n    public static class BlankTab extends Tab {\n        public static final int ID = 0;\n\n        @Override\n        public int getTabId() {\n            return ID;\n        }\n\n        @Override\n        public String getTabName(final Context context) {\n            // TODO: find a better name for the blank tab (maybe \"blank_tab\") or replace it with\n            //       context.getString(R.string.app_name);\n            return \"NewPipe\"; // context.getString(R.string.blank_page_summary);\n        }\n\n        @DrawableRes\n        @Override\n        public int getTabIconRes(final Context context) {\n            return R.drawable.ic_crop_portrait;\n        }\n\n        @Override\n        public BlankFragment getFragment(final Context context) {\n            return new BlankFragment();\n        }\n    }\n\n    public static class SubscriptionsTab extends Tab {\n        public static final int ID = 1;\n\n        @Override\n        public int getTabId() {\n            return ID;\n        }\n\n        @Override\n        public String getTabName(final Context context) {\n            return context.getString(R.string.tab_subscriptions);\n        }\n\n        @DrawableRes\n        @Override\n        public int getTabIconRes(final Context context) {\n            return R.drawable.ic_tv;\n        }\n\n        @Override\n        public SubscriptionFragment getFragment(final Context context) {\n            return new SubscriptionFragment();\n        }\n\n    }\n\n    public static class FeedTab extends Tab {\n        public static final int ID = 2;\n\n        @Override\n        public int getTabId() {\n            return ID;\n        }\n\n        @Override\n        public String getTabName(final Context context) {\n            return context.getString(R.string.fragment_feed_title);\n        }\n\n        @DrawableRes\n        @Override\n        public int getTabIconRes(final Context context) {\n            return R.drawable.ic_subscriptions;\n        }\n\n        @Override\n        public FeedFragment getFragment(final Context context) {\n            return new FeedFragment();\n        }\n    }\n\n    public static class BookmarksTab extends Tab {\n        public static final int ID = 3;\n\n        @Override\n        public int getTabId() {\n            return ID;\n        }\n\n        @Override\n        public String getTabName(final Context context) {\n            return context.getString(R.string.tab_bookmarks);\n        }\n\n        @DrawableRes\n        @Override\n        public int getTabIconRes(final Context context) {\n            return R.drawable.ic_bookmark;\n        }\n\n        @Override\n        public BookmarkFragment getFragment(final Context context) {\n            return new BookmarkFragment();\n        }\n    }\n\n    public static class HistoryTab extends Tab {\n        public static final int ID = 4;\n\n        @Override\n        public int getTabId() {\n            return ID;\n        }\n\n        @Override\n        public String getTabName(final Context context) {\n            return context.getString(R.string.title_activity_history);\n        }\n\n        @DrawableRes\n        @Override\n        public int getTabIconRes(final Context context) {\n            return R.drawable.ic_history;\n        }\n\n        @Override\n        public StatisticsPlaylistFragment getFragment(final Context context) {\n            return new StatisticsPlaylistFragment();\n        }\n    }\n\n    public static class KioskTab extends Tab {\n        public static final int ID = 5;\n        private static final String JSON_KIOSK_SERVICE_ID_KEY = \"service_id\";\n        private static final String JSON_KIOSK_ID_KEY = \"kiosk_id\";\n        private int kioskServiceId;\n        private String kioskId;\n\n        private KioskTab() {\n            this(-1, NO_ID);\n        }\n\n        public KioskTab(final int kioskServiceId, final String kioskId) {\n            this.kioskServiceId = kioskServiceId;\n            this.kioskId = kioskId;\n        }\n\n        public KioskTab(final JsonObject jsonObject) {\n            super(jsonObject);\n        }\n\n        @Override\n        public int getTabId() {\n            return ID;\n        }\n\n        @Override\n        public String getTabName(final Context context) {\n            return KioskTranslator.getTranslatedKioskName(kioskId, context);\n        }\n\n        @DrawableRes\n        @Override\n        public int getTabIconRes(final Context context) {\n            final int kioskIcon = KioskTranslator.getKioskIcon(kioskId);\n\n            if (kioskIcon <= 0) {\n                throw new IllegalStateException(\"Kiosk ID is not valid: \\\"\" + kioskId + \"\\\"\");\n            }\n\n            return kioskIcon;\n        }\n\n        @Override\n        public KioskFragment getFragment(final Context context) throws ExtractionException {\n            return KioskFragment.getInstance(kioskServiceId, kioskId);\n        }\n\n        @Override\n        protected void writeDataToJson(final JsonStringWriter writerSink) {\n            writerSink.value(JSON_KIOSK_SERVICE_ID_KEY, kioskServiceId)\n                    .value(JSON_KIOSK_ID_KEY, kioskId);\n        }\n\n        @Override\n        protected void readDataFromJson(final JsonObject jsonObject) {\n            kioskServiceId = jsonObject.getInt(JSON_KIOSK_SERVICE_ID_KEY, -1);\n            kioskId = jsonObject.getString(JSON_KIOSK_ID_KEY, NO_ID);\n        }\n\n        @Override\n        public boolean equals(final Object obj) {\n            if (!(obj instanceof KioskTab)) {\n                return false;\n            }\n            final KioskTab other = (KioskTab) obj;\n            return super.equals(obj)\n                    && kioskServiceId == other.kioskServiceId\n                    && kioskId.equals(other.kioskId);\n        }\n\n        @Override\n        public int hashCode() {\n            return Objects.hash(getTabId(), kioskServiceId, kioskId);\n        }\n\n        public int getKioskServiceId() {\n            return kioskServiceId;\n        }\n\n        public String getKioskId() {\n            return kioskId;\n        }\n    }\n\n    public static class ChannelTab extends Tab {\n        public static final int ID = 6;\n        private static final String JSON_CHANNEL_SERVICE_ID_KEY = \"channel_service_id\";\n        private static final String JSON_CHANNEL_URL_KEY = \"channel_url\";\n        private static final String JSON_CHANNEL_NAME_KEY = \"channel_name\";\n        private int channelServiceId;\n        private String channelUrl;\n        private String channelName;\n\n        private ChannelTab() {\n            this(-1, NO_URL, NO_NAME);\n        }\n\n        public ChannelTab(final int channelServiceId, final String channelUrl,\n                          final String channelName) {\n            this.channelServiceId = channelServiceId;\n            this.channelUrl = channelUrl;\n            this.channelName = channelName;\n        }\n\n        public ChannelTab(final JsonObject jsonObject) {\n            super(jsonObject);\n        }\n\n        @Override\n        public int getTabId() {\n            return ID;\n        }\n\n        @Override\n        public String getTabName(final Context context) {\n            return channelName;\n        }\n\n        @DrawableRes\n        @Override\n        public int getTabIconRes(final Context context) {\n            return R.drawable.ic_tv;\n        }\n\n        @Override\n        public ChannelFragment getFragment(final Context context) {\n            return ChannelFragment.getInstance(channelServiceId, channelUrl, channelName);\n        }\n\n        @Override\n        protected void writeDataToJson(final JsonStringWriter writerSink) {\n            writerSink.value(JSON_CHANNEL_SERVICE_ID_KEY, channelServiceId)\n                    .value(JSON_CHANNEL_URL_KEY, channelUrl)\n                    .value(JSON_CHANNEL_NAME_KEY, channelName);\n        }\n\n        @Override\n        protected void readDataFromJson(final JsonObject jsonObject) {\n            channelServiceId = jsonObject.getInt(JSON_CHANNEL_SERVICE_ID_KEY, -1);\n            channelUrl = jsonObject.getString(JSON_CHANNEL_URL_KEY, NO_URL);\n            channelName = jsonObject.getString(JSON_CHANNEL_NAME_KEY, NO_NAME);\n        }\n\n        @Override\n        public boolean equals(final Object obj) {\n            if (!(obj instanceof ChannelTab)) {\n                return false;\n            }\n            final ChannelTab other = (ChannelTab) obj;\n            return super.equals(obj)\n                    && channelServiceId == other.channelServiceId\n                    && channelUrl.equals(other.channelUrl)\n                    && channelName.equals(other.channelName);\n        }\n\n        @Override\n        public int hashCode() {\n            return Objects.hash(getTabId(), channelServiceId, channelUrl, channelName);\n        }\n\n        public int getChannelServiceId() {\n            return channelServiceId;\n        }\n\n        public String getChannelUrl() {\n            return channelUrl;\n        }\n\n        public String getChannelName() {\n            return channelName;\n        }\n    }\n\n    public static class DefaultKioskTab extends Tab {\n        public static final int ID = 7;\n\n        @Override\n        public int getTabId() {\n            return ID;\n        }\n\n        @Override\n        public String getTabName(final Context context) {\n            return KioskTranslator.getTranslatedKioskName(getDefaultKioskId(context), context);\n        }\n\n        @DrawableRes\n        @Override\n        public int getTabIconRes(final Context context) {\n            return KioskTranslator.getKioskIcon(getDefaultKioskId(context));\n        }\n\n        @Override\n        public DefaultKioskFragment getFragment(final Context context) {\n            return new DefaultKioskFragment();\n        }\n\n        private String getDefaultKioskId(final Context context) {\n            final int kioskServiceId = ServiceHelper.getSelectedServiceId(context);\n\n            String kioskId = \"\";\n            try {\n                final StreamingService service = NewPipe.getService(kioskServiceId);\n                kioskId = service.getKioskList().getDefaultKioskId();\n            } catch (final ExtractionException e) {\n                ErrorUtil.showSnackbar(context, new ErrorInfo(e,\n                        UserAction.REQUESTED_KIOSK, \"Loading default kiosk for selected service\"));\n            }\n            return kioskId;\n        }\n    }\n\n    public static class PlaylistTab extends Tab {\n        public static final int ID = 8;\n        private static final String JSON_PLAYLIST_SERVICE_ID_KEY = \"playlist_service_id\";\n        private static final String JSON_PLAYLIST_URL_KEY = \"playlist_url\";\n        private static final String JSON_PLAYLIST_NAME_KEY = \"playlist_name\";\n        private static final String JSON_PLAYLIST_ID_KEY = \"playlist_id\";\n        private static final String JSON_PLAYLIST_TYPE_KEY = \"playlist_type\";\n        private int playlistServiceId;\n        private String playlistUrl;\n        private String playlistName;\n        private long playlistId;\n        private LocalItemType playlistType;\n\n        private PlaylistTab() {\n            this(-1, NO_NAME);\n        }\n\n        public PlaylistTab(final long playlistId, final String playlistName) {\n            this.playlistName = playlistName;\n            this.playlistId = playlistId;\n            this.playlistType = LocalItemType.PLAYLIST_LOCAL_ITEM;\n            this.playlistServiceId = -1;\n            this.playlistUrl = NO_URL;\n        }\n\n        public PlaylistTab(final int playlistServiceId, final String playlistUrl,\n                           final String playlistName) {\n            this.playlistServiceId = playlistServiceId;\n            this.playlistUrl = playlistUrl;\n            this.playlistName = playlistName;\n            this.playlistType = LocalItemType.PLAYLIST_REMOTE_ITEM;\n            this.playlistId = -1;\n        }\n\n        public PlaylistTab(final JsonObject jsonObject) {\n            super(jsonObject);\n        }\n\n        @Override\n        public int getTabId() {\n            return ID;\n        }\n\n        @Override\n        public String getTabName(final Context context) {\n            return playlistName;\n        }\n\n        @DrawableRes\n        @Override\n        public int getTabIconRes(final Context context) {\n            return R.drawable.ic_bookmark;\n        }\n\n        @Override\n        public Fragment getFragment(final Context context) {\n            if (playlistType == LocalItemType.PLAYLIST_LOCAL_ITEM) {\n                return LocalPlaylistFragment.getInstance(playlistId, playlistName);\n\n            } else { // playlistType == LocalItemType.PLAYLIST_REMOTE_ITEM\n                return PlaylistFragment.getInstance(playlistServiceId, playlistUrl, playlistName);\n            }\n        }\n\n        @Override\n        protected void writeDataToJson(final JsonStringWriter writerSink) {\n            writerSink.value(JSON_PLAYLIST_SERVICE_ID_KEY, playlistServiceId)\n                    .value(JSON_PLAYLIST_URL_KEY, playlistUrl)\n                    .value(JSON_PLAYLIST_NAME_KEY, playlistName)\n                    .value(JSON_PLAYLIST_ID_KEY, playlistId)\n                    .value(JSON_PLAYLIST_TYPE_KEY, playlistType.toString());\n        }\n\n        @Override\n        protected void readDataFromJson(final JsonObject jsonObject) {\n            playlistServiceId = jsonObject.getInt(JSON_PLAYLIST_SERVICE_ID_KEY, -1);\n            playlistUrl = jsonObject.getString(JSON_PLAYLIST_URL_KEY, NO_URL);\n            playlistName = jsonObject.getString(JSON_PLAYLIST_NAME_KEY, NO_NAME);\n            playlistId = jsonObject.getInt(JSON_PLAYLIST_ID_KEY, -1);\n            playlistType = LocalItemType.valueOf(\n                    jsonObject.getString(JSON_PLAYLIST_TYPE_KEY,\n                            LocalItemType.PLAYLIST_LOCAL_ITEM.toString())\n            );\n        }\n\n        @Override\n        public boolean equals(final Object obj) {\n            if (!(obj instanceof PlaylistTab)) {\n                return false;\n            }\n\n            final PlaylistTab other = (PlaylistTab) obj;\n\n            return super.equals(obj)\n                    && playlistServiceId == other.playlistServiceId // Remote\n                    && playlistId == other.playlistId // Local\n                    && playlistUrl.equals(other.playlistUrl)\n                    && playlistName.equals(other.playlistName)\n                    && playlistType == other.playlistType;\n        }\n\n        @Override\n        public int hashCode() {\n            return Objects.hash(\n                    getTabId(),\n                    playlistServiceId,\n                    playlistId,\n                    playlistUrl,\n                    playlistName,\n                    playlistType\n            );\n        }\n\n        public int getPlaylistServiceId() {\n            return playlistServiceId;\n        }\n\n        public String getPlaylistUrl() {\n            return playlistUrl;\n        }\n\n        public String getPlaylistName() {\n            return playlistName;\n        }\n\n        public long getPlaylistId() {\n            return playlistId;\n        }\n\n        public LocalItemType getPlaylistType() {\n            return playlistType;\n        }\n    }\n    public static class FeedGroupTab extends Tab {\n        public static final int ID = 9;\n        private static final String JSON_FEED_GROUP_ID_KEY = \"feed_group_id\";\n        private static final String JSON_FEED_GROUP_NAME_KEY = \"feed_group_name\";\n        private static final String JSON_FEED_GROUP_ICON_KEY = \"feed_group_icon\";\n        private Long feedGroupId;\n        private String feedGroupName;\n        private int iconId;\n\n        private FeedGroupTab() {\n            this((long) -1, NO_NAME, R.drawable.ic_asterisk);\n        }\n\n        public FeedGroupTab(final Long feedGroupId, final String feedGroupName,\n                               final int iconId) {\n            this.feedGroupId = feedGroupId;\n            this.feedGroupName = feedGroupName;\n            this.iconId = iconId;\n\n        }\n\n        public FeedGroupTab(final JsonObject jsonObject) {\n            super(jsonObject);\n        }\n\n        @Override\n        public int getTabId() {\n            return ID;\n        }\n\n        @Override\n        public String getTabName(final Context context) {\n            return context.getString(R.string.fragment_feed_title);\n        }\n\n        @DrawableRes\n        @Override\n        public int getTabIconRes(final Context context) {\n            return this.iconId;\n        }\n\n        @Override\n        public FeedFragment getFragment(final Context context) {\n            return FeedFragment.newInstance(feedGroupId, feedGroupName);\n        }\n\n        @Override\n        protected void writeDataToJson(final JsonStringWriter writerSink) {\n            writerSink.value(JSON_FEED_GROUP_ID_KEY, feedGroupId)\n                    .value(JSON_FEED_GROUP_NAME_KEY, feedGroupName)\n                    .value(JSON_FEED_GROUP_ICON_KEY, iconId);\n        }\n\n        @Override\n        protected void readDataFromJson(final JsonObject jsonObject) {\n            feedGroupId = jsonObject.getLong(JSON_FEED_GROUP_ID_KEY, -1);\n            feedGroupName = jsonObject.getString(JSON_FEED_GROUP_NAME_KEY, NO_NAME);\n            iconId = jsonObject.getInt(JSON_FEED_GROUP_ICON_KEY, R.drawable.ic_asterisk);\n        }\n\n        @Override\n        public boolean equals(final Object obj) {\n            if (!(obj instanceof FeedGroupTab)) {\n                return false;\n            }\n            final FeedGroupTab other = (FeedGroupTab) obj;\n            return super.equals(obj)\n                    && feedGroupId.equals(other.feedGroupId)\n                    && feedGroupName.equals(other.feedGroupName)\n                    && iconId == other.iconId;\n        }\n\n        @Override\n        public int hashCode() {\n            return Objects.hash(getTabId(), feedGroupId, feedGroupName, iconId);\n        }\n\n        public Long getFeedGroupId() {\n            return feedGroupId;\n        }\n\n        public String getFeedGroupName() {\n            return feedGroupName;\n        }\n\n        public int getIconId() {\n            return iconId;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/tabs/TabsJsonHelper.java",
    "content": "package org.schabi.newpipe.settings.tabs;\n\nimport androidx.annotation.Nullable;\n\nimport com.grack.nanojson.JsonArray;\nimport com.grack.nanojson.JsonObject;\nimport com.grack.nanojson.JsonParser;\nimport com.grack.nanojson.JsonParserException;\nimport com.grack.nanojson.JsonStringWriter;\nimport com.grack.nanojson.JsonWriter;\n\nimport java.util.List;\nimport java.util.Objects;\nimport java.util.stream.Collectors;\n\n/**\n * Class to get a JSON representation of a list of tabs, and the other way around.\n */\npublic final class TabsJsonHelper {\n    private static final String JSON_TABS_ARRAY_KEY = \"tabs\";\n\n    private static final List<Tab> FALLBACK_INITIAL_TABS_LIST = List.of(\n            Tab.Type.DEFAULT_KIOSK.getTab(),\n            Tab.Type.FEED.getTab(),\n            Tab.Type.SUBSCRIPTIONS.getTab(),\n            Tab.Type.BOOKMARKS.getTab());\n\n    private TabsJsonHelper() { }\n\n    /**\n     * Try to reads the passed JSON and returns the list of tabs if no error were encountered.\n     * <p>\n     * If the JSON is null or empty, or the list of tabs that it represents is empty, the\n     * {@link #getDefaultTabs fallback list} will be returned.\n     * <p>\n     * Tabs with invalid ids (i.e. not in the {@link Tab.Type} enum) will be ignored.\n     *\n     * @param tabsJson a JSON string got from {@link #getJsonToSave(List)}.\n     * @return a list of {@link Tab tabs}.\n     * @throws InvalidJsonException if the JSON string is not valid\n     */\n    public static List<Tab> getTabsFromJson(@Nullable final String tabsJson)\n            throws InvalidJsonException {\n        if (tabsJson == null || tabsJson.isEmpty()) {\n            return getDefaultTabs();\n        }\n\n        try {\n            final JsonObject outerJsonObject = JsonParser.object().from(tabsJson);\n\n            if (!outerJsonObject.has(JSON_TABS_ARRAY_KEY)) {\n                throw new InvalidJsonException(\"JSON doesn't contain \\\"\" + JSON_TABS_ARRAY_KEY\n                        + \"\\\" array\");\n            }\n\n            final JsonArray tabsArray = outerJsonObject.getArray(JSON_TABS_ARRAY_KEY, null);\n\n            final var returnTabs = tabsArray.streamAsJsonObjects()\n                    .map(Tab::from)\n                    .filter(Objects::nonNull)\n                    .collect(Collectors.toUnmodifiableList());\n\n            return returnTabs.isEmpty() ? getDefaultTabs() : returnTabs;\n        } catch (final JsonParserException e) {\n            throw new InvalidJsonException(e);\n        }\n    }\n\n    /**\n     * Get a JSON representation from a list of tabs.\n     *\n     * @param tabList a list of {@link Tab tabs}.\n     * @return a JSON string representing the list of tabs\n     */\n    public static String getJsonToSave(@Nullable final List<Tab> tabList) {\n        final JsonStringWriter jsonWriter = JsonWriter.string();\n        jsonWriter.object();\n\n        jsonWriter.array(JSON_TABS_ARRAY_KEY);\n        if (tabList != null) {\n            for (final Tab tab : tabList) {\n                tab.writeJsonOn(jsonWriter);\n            }\n        }\n        jsonWriter.end();\n\n        jsonWriter.end();\n        return jsonWriter.done();\n    }\n\n    public static List<Tab> getDefaultTabs() {\n        return FALLBACK_INITIAL_TABS_LIST;\n    }\n\n    public static final class InvalidJsonException extends Exception {\n        private InvalidJsonException() {\n            super();\n        }\n\n        private InvalidJsonException(final String message) {\n            super(message);\n        }\n\n        private InvalidJsonException(final Throwable cause) {\n            super(cause);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/settings/tabs/TabsManager.java",
    "content": "package org.schabi.newpipe.settings.tabs;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.widget.Toast;\n\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.R;\n\nimport java.util.List;\n\npublic final class TabsManager {\n    private final SharedPreferences sharedPreferences;\n    private final String savedTabsKey;\n    private final Context context;\n    private SavedTabsChangeListener savedTabsChangeListener;\n    private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener;\n\n    private TabsManager(final Context context) {\n        this.context = context;\n        this.sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);\n        this.savedTabsKey = context.getString(R.string.saved_tabs_key);\n    }\n\n    public static TabsManager getManager(final Context context) {\n        return new TabsManager(context);\n    }\n\n    public List<Tab> getTabs() {\n        final String savedJson = sharedPreferences.getString(savedTabsKey, null);\n        try {\n            return TabsJsonHelper.getTabsFromJson(savedJson);\n        } catch (final TabsJsonHelper.InvalidJsonException e) {\n            Toast.makeText(context, R.string.saved_tabs_invalid_json, Toast.LENGTH_SHORT).show();\n            return getDefaultTabs();\n        }\n    }\n\n    public void saveTabs(final List<Tab> tabList) {\n        final String jsonToSave = TabsJsonHelper.getJsonToSave(tabList);\n        sharedPreferences.edit().putString(savedTabsKey, jsonToSave).apply();\n    }\n\n    public void resetTabs() {\n        sharedPreferences.edit().remove(savedTabsKey).apply();\n    }\n\n    public List<Tab> getDefaultTabs() {\n        return TabsJsonHelper.getDefaultTabs();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Listener\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public void setSavedTabsListener(final SavedTabsChangeListener listener) {\n        if (preferenceChangeListener != null) {\n            sharedPreferences.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);\n        }\n        savedTabsChangeListener = listener;\n        preferenceChangeListener = getPreferenceChangeListener();\n        sharedPreferences.registerOnSharedPreferenceChangeListener(preferenceChangeListener);\n    }\n\n    public void unsetSavedTabsListener() {\n        if (preferenceChangeListener != null) {\n            sharedPreferences.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);\n        }\n        preferenceChangeListener = null;\n        savedTabsChangeListener = null;\n    }\n\n    private SharedPreferences.OnSharedPreferenceChangeListener getPreferenceChangeListener() {\n        return (sp, key) -> {\n            if (savedTabsKey.equals(key) && savedTabsChangeListener != null) {\n                savedTabsChangeListener.onTabsChanged();\n            }\n        };\n    }\n\n    public interface SavedTabsChangeListener {\n        void onTabsChanged();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/DataReader.java",
    "content": "package org.schabi.newpipe.streams;\n\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.EOFException;\nimport java.io.IOException;\nimport java.io.InputStream;\n\n/**\n * @author kapodamy\n */\npublic class DataReader {\n    public static final int SHORT_SIZE = 2;\n    public static final int LONG_SIZE = 8;\n    public static final int INTEGER_SIZE = 4;\n    public static final int FLOAT_SIZE = 4;\n\n    private static final int BUFFER_SIZE = 128 * 1024; // 128 KiB\n\n    private long position = 0;\n    private final SharpStream stream;\n\n    private InputStream view;\n    private int viewSize;\n\n    public DataReader(final SharpStream stream) {\n        this.stream = stream;\n        this.readOffset = this.readBuffer.length;\n    }\n\n    public long position() {\n        return position;\n    }\n\n    public int read() throws IOException {\n        if (fillBuffer()) {\n            return -1;\n        }\n\n        position++;\n        readCount--;\n\n        return readBuffer[readOffset++] & 0xFF;\n    }\n\n    public long skipBytes(final long byteAmount) throws IOException {\n        long amount = byteAmount;\n        if (readCount < 0) {\n            return 0;\n        } else if (readCount == 0) {\n            amount = stream.skip(amount);\n        } else {\n            if (readCount > amount) {\n                readCount -= (int) amount;\n                readOffset += (int) amount;\n            } else {\n                amount = readCount + stream.skip(amount - readCount);\n                readCount = 0;\n                readOffset = readBuffer.length;\n            }\n        }\n\n        position += amount;\n        return amount;\n    }\n\n    public int readInt() throws IOException {\n        primitiveRead(INTEGER_SIZE);\n        return primitive[0] << 24 | primitive[1] << 16 | primitive[2] << 8 | primitive[3];\n    }\n\n    public long readUnsignedInt()  throws IOException {\n        final long value = readInt();\n        return value & 0xffffffffL;\n    }\n\n\n    public short readShort() throws IOException {\n        primitiveRead(SHORT_SIZE);\n        return (short) (primitive[0] << 8 | primitive[1]);\n    }\n\n    public long readLong() throws IOException {\n        primitiveRead(LONG_SIZE);\n        final long high =\n                primitive[0] << 24 | primitive[1] << 16 | primitive[2] << 8 | primitive[3];\n        final long low = primitive[4] << 24 | primitive[5] << 16 | primitive[6] << 8 | primitive[7];\n        return high << 32 | low;\n    }\n\n    public int read(final byte[] buffer) throws IOException {\n        return read(buffer, 0, buffer.length);\n    }\n\n    public int read(final byte[] buffer, final int off, final int c) throws IOException {\n        int offset = off;\n        int count = c;\n\n        if (readCount < 0) {\n            return -1;\n        }\n        int total = 0;\n\n        if (count >= readBuffer.length) {\n            if (readCount > 0) {\n                System.arraycopy(readBuffer, readOffset, buffer, offset, readCount);\n                readOffset += readCount;\n\n                offset += readCount;\n                count -= readCount;\n\n                total = readCount;\n                readCount = 0;\n            }\n            total += Math.max(stream.read(buffer, offset, count), 0);\n        } else {\n            while (count > 0 && !fillBuffer()) {\n                final int read = Math.min(readCount, count);\n                System.arraycopy(readBuffer, readOffset, buffer, offset, read);\n\n                readOffset += read;\n                readCount -= read;\n\n                offset += read;\n                count -= read;\n\n                total += read;\n            }\n        }\n\n        position += total;\n        return total;\n    }\n\n    public boolean available() {\n        return readCount > 0 || stream.available() > 0;\n    }\n\n    public void rewind() throws IOException {\n        stream.rewind();\n\n        if ((position - viewSize) > 0) {\n            viewSize = 0; // drop view\n        } else {\n            viewSize += position;\n        }\n\n        position = 0;\n        readOffset = readBuffer.length;\n        readCount = 0;\n    }\n\n    public boolean canRewind() {\n        return stream.canRewind();\n    }\n\n    /**\n     * Wraps this instance of {@code DataReader} into {@code InputStream}\n     * object. Note: Any read in the {@code DataReader} will not modify\n     * (decrease) the view size\n     *\n     * @param size the size of the view\n     * @return the view\n     */\n    public InputStream getView(final int size) {\n        if (view == null) {\n            view = new InputStream() {\n                @Override\n                public int read() throws IOException {\n                    if (viewSize < 1) {\n                        return -1;\n                    }\n                    final int res = DataReader.this.read();\n                    if (res > 0) {\n                        viewSize--;\n                    }\n                    return res;\n                }\n\n                @Override\n                public int read(final byte[] buffer) throws IOException {\n                    return read(buffer, 0, buffer.length);\n                }\n\n                @Override\n                public int read(final byte[] buffer, final int offset, final int count)\n                        throws IOException {\n                    if (viewSize < 1) {\n                        return -1;\n                    }\n\n                    final int res = DataReader.this.read(buffer, offset, Math.min(viewSize, count));\n                    viewSize -= res;\n\n                    return res;\n                }\n\n                @Override\n                public long skip(final long amount) throws IOException {\n                    if (viewSize < 1) {\n                        return 0;\n                    }\n                    final int res = (int) DataReader.this.skipBytes(Math.min(amount, viewSize));\n                    viewSize -= res;\n\n                    return res;\n                }\n\n                @Override\n                public int available() {\n                    return viewSize;\n                }\n\n                @Override\n                public void close() {\n                    viewSize = 0;\n                }\n\n                @Override\n                public boolean markSupported() {\n                    return false;\n                }\n\n            };\n        }\n        viewSize = size;\n\n        return view;\n    }\n\n    private final short[] primitive = new short[LONG_SIZE];\n\n    private void primitiveRead(final int amount) throws IOException {\n        final byte[] buffer = new byte[amount];\n        final int read = read(buffer, 0, amount);\n\n        if (read != amount) {\n            throw new EOFException(\"Truncated stream, missing \"\n                    + (amount - read) + \" bytes\");\n        }\n\n        for (int i = 0; i < amount; i++) {\n            // the \"byte\" data type in java is signed and is very annoying\n            primitive[i] = (short) (buffer[i] & 0xFF);\n        }\n    }\n\n    private final byte[] readBuffer = new byte[BUFFER_SIZE];\n    private int readOffset;\n    private int readCount;\n\n    private boolean fillBuffer() throws IOException {\n        if (readCount < 0) {\n            return true;\n        }\n        if (readOffset >= readBuffer.length) {\n            readCount = stream.read(readBuffer);\n            if (readCount < 1) {\n                readCount = -1;\n                return true;\n            }\n            readOffset = 0;\n        }\n\n        return readCount < 1;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/Mp4DashReader.java",
    "content": "package org.schabi.newpipe.streams;\n\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.EOFException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.ByteBuffer;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.NoSuchElementException;\n\n/**\n * @author kapodamy\n */\npublic class Mp4DashReader {\n    private static final int ATOM_MOOF = 0x6D6F6F66;\n    private static final int ATOM_MFHD = 0x6D666864;\n    private static final int ATOM_TRAF = 0x74726166;\n    private static final int ATOM_TFHD = 0x74666864;\n    private static final int ATOM_TFDT = 0x74666474;\n    private static final int ATOM_TRUN = 0x7472756E;\n    private static final int ATOM_MDIA = 0x6D646961;\n    private static final int ATOM_FTYP = 0x66747970;\n    private static final int ATOM_SIDX = 0x73696478;\n    private static final int ATOM_MOOV = 0x6D6F6F76;\n    private static final int ATOM_MDAT = 0x6D646174;\n    private static final int ATOM_MVHD = 0x6D766864;\n    private static final int ATOM_TRAK = 0x7472616B;\n    private static final int ATOM_MVEX = 0x6D766578;\n    private static final int ATOM_TREX = 0x74726578;\n    private static final int ATOM_TKHD = 0x746B6864;\n    private static final int ATOM_MFRA = 0x6D667261;\n    private static final int ATOM_MDHD = 0x6D646864;\n    private static final int ATOM_EDTS = 0x65647473;\n    private static final int ATOM_ELST = 0x656C7374;\n    private static final int ATOM_HDLR = 0x68646C72;\n    private static final int ATOM_MINF = 0x6D696E66;\n    private static final int ATOM_DINF = 0x64696E66;\n    private static final int ATOM_STBL = 0x7374626C;\n    private static final int ATOM_STSD = 0x73747364;\n    private static final int ATOM_VMHD = 0x766D6864;\n    private static final int ATOM_SMHD = 0x736D6864;\n\n    private static final int BRAND_DASH = 0x64617368;\n    private static final int BRAND_ISO5 = 0x69736F35;\n\n    private static final int HANDLER_VIDE = 0x76696465;\n    private static final int HANDLER_SOUN = 0x736F756E;\n    private static final int HANDLER_SUBT = 0x73756274;\n\n    private final DataReader stream;\n\n    private Mp4Track[] tracks = null;\n    private int[] brands = null;\n\n    private Box box;\n    private Moof moof;\n\n    private boolean chunkZero = false;\n\n    private int selectedTrack = -1;\n    private Box backupBox = null;\n\n    public enum TrackKind {\n        Audio, Video, Subtitles, Other\n    }\n\n    public Mp4DashReader(final SharpStream source) {\n        this.stream = new DataReader(source);\n    }\n\n    public void parse() throws IOException, NoSuchElementException {\n        if (selectedTrack > -1) {\n            return;\n        }\n\n        box = readBox(ATOM_FTYP);\n        brands = parseFtyp(box);\n        switch (brands[0]) {\n            case BRAND_DASH:\n            case BRAND_ISO5:// ¿why not?\n                break;\n            default:\n                throw new NoSuchElementException(\n                        \"Not a MPEG-4 DASH container, major brand is not 'dash' or 'iso5' is \"\n                                + boxName(brands[0])\n                );\n        }\n\n        Moov moov = null;\n        int i;\n\n        while (box.type != ATOM_MOOF) {\n            ensure(box);\n            box = readBox();\n\n            switch (box.type) {\n                case ATOM_MOOV:\n                    moov = parseMoov(box);\n                    break;\n                case ATOM_SIDX:\n                case ATOM_MFRA:\n                    break;\n            }\n        }\n\n        if (moov == null) {\n            throw new IOException(\"The provided Mp4 doesn't have the 'moov' box\");\n        }\n\n        tracks = new Mp4Track[moov.trak.length];\n\n        for (i = 0; i < tracks.length; i++) {\n            tracks[i] = new Mp4Track();\n            tracks[i].trak = moov.trak[i];\n\n            if (moov.mvexTrex != null) {\n                for (final Trex mvexTrex : moov.mvexTrex) {\n                    if (tracks[i].trak.tkhd.trackId == mvexTrex.trackId) {\n                        tracks[i].trex = mvexTrex;\n                    }\n                }\n            }\n\n            switch (moov.trak[i].mdia.hdlr.subType) {\n                case HANDLER_VIDE:\n                    tracks[i].kind = TrackKind.Video;\n                    break;\n                case HANDLER_SOUN:\n                    tracks[i].kind = TrackKind.Audio;\n                    break;\n                case HANDLER_SUBT:\n                    tracks[i].kind = TrackKind.Subtitles;\n                    break;\n                default:\n                    tracks[i].kind = TrackKind.Other;\n                    break;\n            }\n        }\n\n        backupBox = box;\n    }\n\n    Mp4Track selectTrack(final int index) {\n        selectedTrack = index;\n        return tracks[index];\n    }\n\n    public int[] getBrands() {\n        if (brands == null) {\n            throw new IllegalStateException(\"Not parsed\");\n        }\n        return brands;\n    }\n\n    public void rewind() throws IOException {\n        if (!stream.canRewind()) {\n            throw new IOException(\"The provided stream doesn't allow seek\");\n        }\n        if (box == null) {\n            return;\n        }\n\n        box = backupBox;\n        chunkZero = false;\n\n        stream.rewind();\n        stream.skipBytes(backupBox.offset + (DataReader.INTEGER_SIZE * 2));\n    }\n\n    public Mp4Track[] getAvailableTracks() {\n        return tracks;\n    }\n\n    public Mp4DashChunk getNextChunk(final boolean infoOnly) throws IOException {\n        final Mp4Track track = tracks[selectedTrack];\n\n        while (stream.available()) {\n\n            if (chunkZero) {\n                ensure(box);\n                if (!stream.available()) {\n                    break;\n                }\n                box = readBox();\n            } else {\n                chunkZero = true;\n            }\n\n            switch (box.type) {\n                case ATOM_MOOF:\n                    if (moof != null) {\n                        throw new IOException(\"moof found without mdat\");\n                    }\n\n                    moof = parseMoof(box, track.trak.tkhd.trackId);\n\n                    if (moof.traf != null) {\n\n                        if (hasFlag(moof.traf.trun.bFlags, 0x0001)) {\n                            moof.traf.trun.dataOffset -= box.size + 8;\n                            if (moof.traf.trun.dataOffset < 0) {\n                                throw new IOException(\"trun box has wrong data offset, \"\n                                        + \"points outside of concurrent mdat box\");\n                            }\n                        }\n\n                        if (moof.traf.trun.chunkSize < 1) {\n                            if (hasFlag(moof.traf.tfhd.bFlags, 0x10)) {\n                                moof.traf.trun.chunkSize = moof.traf.tfhd.defaultSampleSize\n                                        * moof.traf.trun.entryCount;\n                            } else {\n                                moof.traf.trun.chunkSize = (int) (box.size - 8);\n                            }\n                        }\n                        if (!hasFlag(moof.traf.trun.bFlags, 0x900)\n                                && moof.traf.trun.chunkDuration == 0) {\n                            if (hasFlag(moof.traf.tfhd.bFlags, 0x20)) {\n                                moof.traf.trun.chunkDuration = moof.traf.tfhd.defaultSampleDuration\n                                        * moof.traf.trun.entryCount;\n                            }\n                        }\n                    }\n                    break;\n                case ATOM_MDAT:\n                    if (moof == null) {\n                        throw new IOException(\"mdat found without moof\");\n                    }\n\n                    if (moof.traf == null) {\n                        moof = null;\n                        continue; // find another chunk\n                    }\n\n                    final Mp4DashChunk chunk = new Mp4DashChunk();\n                    chunk.moof = moof;\n                    if (!infoOnly) {\n                        chunk.data = stream.getView(moof.traf.trun.chunkSize);\n                    }\n\n                    moof = null;\n\n                    stream.skipBytes(chunk.moof.traf.trun.dataOffset);\n                    return chunk;\n                default:\n            }\n        }\n\n        return null;\n    }\n\n    public static boolean hasFlag(final int flags, final int mask) {\n        return (flags & mask) == mask;\n    }\n\n    private String boxName(final Box ref) {\n        return boxName(ref.type);\n    }\n\n    private String boxName(final int type) {\n        return new String(ByteBuffer.allocate(4).putInt(type).array(), StandardCharsets.UTF_8);\n    }\n\n    private Box readBox() throws IOException {\n        final Box b = new Box();\n        b.offset = stream.position();\n        b.size = stream.readUnsignedInt();\n        b.type = stream.readInt();\n\n        if (b.size == 1) {\n            b.size = stream.readLong();\n        }\n\n        return b;\n    }\n\n    private Box readBox(final int expected) throws IOException {\n        final Box b = readBox();\n        if (b.type != expected) {\n            throw new NoSuchElementException(\"expected \" + boxName(expected)\n                    + \" found \" + boxName(b));\n        }\n        return b;\n    }\n\n    private byte[] readFullBox(final Box ref) throws IOException {\n        // full box reading is limited to 2 GiB, and should be enough\n        final int size = (int) ref.size;\n\n        final ByteBuffer buffer = ByteBuffer.allocate(size);\n        buffer.putInt(size);\n        buffer.putInt(ref.type);\n\n        final int read = size - 8;\n\n        if (stream.read(buffer.array(), 8, read) != read) {\n            throw new EOFException(String.format(\"EOF reached in box: type=%s offset=%s size=%s\",\n                    boxName(ref.type), ref.offset, ref.size));\n        }\n\n        return buffer.array();\n    }\n\n    private void ensure(final Box ref) throws IOException {\n        final long skip = ref.offset + ref.size - stream.position();\n\n        if (skip == 0) {\n            return;\n        } else if (skip < 0) {\n            throw new EOFException(String.format(\n                    \"parser go beyond limits of the box. type=%s offset=%s size=%s position=%s\",\n                    boxName(ref), ref.offset, ref.size, stream.position()\n            ));\n        }\n\n        stream.skipBytes((int) skip);\n    }\n\n    private Box untilBox(final Box ref, final int... expected) throws IOException {\n        Box b;\n        while (stream.position() < (ref.offset + ref.size)) {\n            b = readBox();\n            for (final int type : expected) {\n                if (b.type == type) {\n                    return b;\n                }\n            }\n            ensure(b);\n        }\n\n        return null;\n    }\n\n    private Box untilAnyBox(final Box ref) throws IOException {\n        if (stream.position() >= (ref.offset + ref.size)) {\n            return null;\n        }\n\n        return readBox();\n    }\n\n    private Moof parseMoof(final Box ref, final int trackId) throws IOException {\n        final Moof obj = new Moof();\n\n        Box b = readBox(ATOM_MFHD);\n        obj.mfhdSequenceNumber = parseMfhd();\n        ensure(b);\n\n        while ((b = untilBox(ref, ATOM_TRAF)) != null) {\n            obj.traf = parseTraf(b, trackId);\n            ensure(b);\n\n            if (obj.traf != null) {\n                return obj;\n            }\n        }\n\n        return obj;\n    }\n\n    private int parseMfhd() throws IOException {\n        // version\n        // flags\n        stream.skipBytes(4);\n\n        return stream.readInt();\n    }\n\n    private Traf parseTraf(final Box ref, final int trackId) throws IOException {\n        final Traf traf = new Traf();\n\n        Box b = readBox(ATOM_TFHD);\n        traf.tfhd = parseTfhd(trackId);\n        ensure(b);\n\n        if (traf.tfhd == null) {\n            return null;\n        }\n\n        b = untilBox(ref, ATOM_TRUN, ATOM_TFDT);\n\n        if (b.type == ATOM_TFDT) {\n            traf.tfdt = parseTfdt();\n            ensure(b);\n            b = readBox(ATOM_TRUN);\n        }\n\n        traf.trun = parseTrun();\n        ensure(b);\n\n        return traf;\n    }\n\n    private Tfhd parseTfhd(final int trackId) throws IOException {\n        final Tfhd obj = new Tfhd();\n\n        obj.bFlags = stream.readInt();\n        obj.trackId = stream.readInt();\n\n        if (trackId != -1 && obj.trackId != trackId) {\n            return null;\n        }\n\n        if (hasFlag(obj.bFlags, 0x01)) {\n            stream.skipBytes(8);\n        }\n        if (hasFlag(obj.bFlags, 0x02)) {\n            stream.skipBytes(4);\n        }\n        if (hasFlag(obj.bFlags, 0x08)) {\n            obj.defaultSampleDuration = stream.readInt();\n        }\n        if (hasFlag(obj.bFlags, 0x10)) {\n            obj.defaultSampleSize = stream.readInt();\n        }\n        if (hasFlag(obj.bFlags, 0x20)) {\n            obj.defaultSampleFlags = stream.readInt();\n        }\n\n        return obj;\n    }\n\n    private long parseTfdt() throws IOException {\n        final int version = stream.read();\n        stream.skipBytes(3); // flags\n        return version == 0 ? stream.readUnsignedInt() : stream.readLong();\n    }\n\n    private Trun parseTrun() throws IOException {\n        final Trun obj = new Trun();\n        obj.bFlags = stream.readInt();\n        obj.entryCount = stream.readInt(); // unsigned int\n\n        obj.entriesRowSize = 0;\n        if (hasFlag(obj.bFlags, 0x0100)) {\n            obj.entriesRowSize += 4;\n        }\n        if (hasFlag(obj.bFlags, 0x0200)) {\n            obj.entriesRowSize += 4;\n        }\n        if (hasFlag(obj.bFlags, 0x0400)) {\n            obj.entriesRowSize += 4;\n        }\n        if (hasFlag(obj.bFlags, 0x0800)) {\n            obj.entriesRowSize += 4;\n        }\n        obj.bEntries = new byte[obj.entriesRowSize * obj.entryCount];\n\n        if (hasFlag(obj.bFlags, 0x0001)) {\n            obj.dataOffset = stream.readInt();\n        }\n        if (hasFlag(obj.bFlags, 0x0004)) {\n            obj.bFirstSampleFlags = stream.readInt();\n        }\n\n        stream.read(obj.bEntries);\n\n        for (int i = 0; i < obj.entryCount; i++) {\n            final TrunEntry entry = obj.getEntry(i);\n            if (hasFlag(obj.bFlags, 0x0100)) {\n                obj.chunkDuration += entry.sampleDuration;\n            }\n            if (hasFlag(obj.bFlags, 0x0200)) {\n                obj.chunkSize += entry.sampleSize;\n            }\n            if (hasFlag(obj.bFlags, 0x0800)) {\n                if (!hasFlag(obj.bFlags, 0x0100)) {\n                    obj.chunkDuration += entry.sampleCompositionTimeOffset;\n                }\n            }\n        }\n\n        return obj;\n    }\n\n    private int[] parseFtyp(final Box ref) throws IOException {\n        int i = 0;\n        final int[] list = new int[(int) ((ref.offset + ref.size - stream.position() - 4) / 4)];\n\n        list[i++] = stream.readInt(); // major brand\n\n        stream.skipBytes(4); // minor version\n\n        for (; i < list.length; i++) {\n            list[i] = stream.readInt(); // compatible brands\n        }\n\n        return list;\n    }\n\n    private Mvhd parseMvhd() throws IOException {\n        final int version = stream.read();\n        stream.skipBytes(3); // flags\n\n        // creation entries_time\n        // modification entries_time\n        stream.skipBytes(2 * (version == 0 ? 4 : 8));\n\n        final Mvhd obj = new Mvhd();\n        obj.timeScale = stream.readUnsignedInt();\n\n        // chunkDuration\n        stream.skipBytes(version == 0 ? 4 : 8);\n\n        // rate\n        // volume\n        // reserved\n        // matrix array\n        // predefined\n        stream.skipBytes(76);\n\n        obj.nextTrackId = stream.readUnsignedInt();\n\n        return obj;\n    }\n\n    private Tkhd parseTkhd() throws IOException {\n        final int version = stream.read();\n\n        final Tkhd obj = new Tkhd();\n\n        // flags\n        // creation entries_time\n        // modification entries_time\n        stream.skipBytes(3 + (2 * (version == 0 ? 4 : 8)));\n\n        obj.trackId = stream.readInt();\n\n        stream.skipBytes(4); // reserved\n\n        obj.duration = version == 0 ? stream.readUnsignedInt() : stream.readLong();\n\n        stream.skipBytes(2 * 4); // reserved\n\n        obj.bLayer = stream.readShort();\n        obj.bAlternateGroup = stream.readShort();\n        obj.bVolume = stream.readShort();\n\n        stream.skipBytes(2); // reserved\n\n        obj.matrix = new byte[9 * 4];\n        stream.read(obj.matrix);\n\n        obj.bWidth = stream.readInt();\n        obj.bHeight = stream.readInt();\n\n        return obj;\n    }\n\n    private Trak parseTrak(final Box ref) throws IOException {\n        final Trak trak = new Trak();\n\n        Box b = readBox(ATOM_TKHD);\n        trak.tkhd = parseTkhd();\n        ensure(b);\n\n        while ((b = untilBox(ref, ATOM_MDIA, ATOM_EDTS)) != null) {\n            switch (b.type) {\n                case ATOM_MDIA:\n                    trak.mdia = parseMdia(b);\n                    break;\n                case ATOM_EDTS:\n                    trak.edstElst = parseEdts(b);\n                    break;\n            }\n\n            ensure(b);\n        }\n\n        return trak;\n    }\n\n    private Mdia parseMdia(final Box ref) throws IOException {\n        final Mdia obj = new Mdia();\n\n        Box b;\n        while ((b = untilBox(ref, ATOM_MDHD, ATOM_HDLR, ATOM_MINF)) != null) {\n            switch (b.type) {\n                case ATOM_MDHD:\n                    obj.mdhd = readFullBox(b);\n\n                    // read time scale\n                    final ByteBuffer buffer = ByteBuffer.wrap(obj.mdhd);\n                    final byte version = buffer.get(8);\n                    buffer.position(12 + ((version == 0 ? 4 : 8) * 2));\n                    obj.mdhdTimeScale = buffer.getInt();\n                    break;\n                case ATOM_HDLR:\n                    obj.hdlr = parseHdlr(b);\n                    break;\n                case ATOM_MINF:\n                    obj.minf = parseMinf(b);\n                    break;\n            }\n            ensure(b);\n        }\n\n        return obj;\n    }\n\n    private Hdlr parseHdlr(final Box ref) throws IOException {\n        // version\n        // flags\n        stream.skipBytes(4);\n\n        final Hdlr obj = new Hdlr();\n        obj.bReserved = new byte[12];\n\n        obj.type = stream.readInt();\n        obj.subType = stream.readInt();\n        stream.read(obj.bReserved);\n\n        // component name (is a ansi/ascii string)\n        stream.skipBytes((ref.offset + ref.size) - stream.position());\n\n        return obj;\n    }\n\n    private Moov parseMoov(final Box ref) throws IOException {\n        Box b = readBox(ATOM_MVHD);\n        final Moov moov = new Moov();\n        moov.mvhd = parseMvhd();\n        ensure(b);\n\n        final ArrayList<Trak> tmp = new ArrayList<>((int) moov.mvhd.nextTrackId);\n        while ((b = untilBox(ref, ATOM_TRAK, ATOM_MVEX)) != null) {\n\n            switch (b.type) {\n                case ATOM_TRAK:\n                    tmp.add(parseTrak(b));\n                    break;\n                case ATOM_MVEX:\n                    moov.mvexTrex = parseMvex(b, (int) moov.mvhd.nextTrackId);\n                    break;\n            }\n\n            ensure(b);\n        }\n\n        moov.trak = tmp.toArray(new Trak[0]);\n\n        return moov;\n    }\n\n    private Trex[] parseMvex(final Box ref, final int possibleTrackCount) throws IOException {\n        final ArrayList<Trex> tmp = new ArrayList<>(possibleTrackCount);\n\n        Box b;\n        while ((b = untilBox(ref, ATOM_TREX)) != null) {\n            tmp.add(parseTrex());\n            ensure(b);\n        }\n\n        return tmp.toArray(new Trex[0]);\n    }\n\n    private Trex parseTrex() throws IOException {\n        // version\n        // flags\n        stream.skipBytes(4);\n\n        final Trex obj = new Trex();\n        obj.trackId = stream.readInt();\n        obj.defaultSampleDescriptionIndex = stream.readInt();\n        obj.defaultSampleDuration = stream.readInt();\n        obj.defaultSampleSize = stream.readInt();\n        obj.defaultSampleFlags = stream.readInt();\n\n        return obj;\n    }\n\n    private Elst parseEdts(final Box ref) throws IOException {\n        final Box b = untilBox(ref, ATOM_ELST);\n        if (b == null) {\n            return null;\n        }\n\n        final Elst obj = new Elst();\n\n        final boolean v1 = stream.read() == 1;\n        stream.skipBytes(3); // flags\n\n        final int entryCount = stream.readInt();\n        if (entryCount < 1) {\n            obj.bMediaRate = 0x00010000; // default media rate (1.0)\n            return obj;\n        }\n\n        if (v1) {\n            stream.skipBytes(DataReader.LONG_SIZE); // segment duration\n            obj.mediaTime = stream.readLong();\n            // ignore all remain entries\n            stream.skipBytes((entryCount - 1) * (DataReader.LONG_SIZE * 2));\n        } else {\n            stream.skipBytes(DataReader.INTEGER_SIZE); // segment duration\n            obj.mediaTime = stream.readInt();\n        }\n\n        obj.bMediaRate = stream.readInt();\n\n        return obj;\n    }\n\n    private Minf parseMinf(final Box ref) throws IOException {\n        final Minf obj = new Minf();\n\n        Box b;\n        while ((b = untilAnyBox(ref)) != null) {\n\n            switch (b.type) {\n                case ATOM_DINF:\n                    obj.dinf = readFullBox(b);\n                    break;\n                case ATOM_STBL:\n                    obj.stblStsd = parseStbl(b);\n                    break;\n                case ATOM_VMHD:\n                case ATOM_SMHD:\n                    obj.mhd = readFullBox(b);\n                    break;\n\n            }\n            ensure(b);\n        }\n\n        return obj;\n    }\n\n    /**\n     * This only reads the \"stsd\" box inside.\n     *\n     * @param ref stbl box\n     * @return stsd box inside\n     */\n    private byte[] parseStbl(final Box ref) throws IOException {\n        final Box b = untilBox(ref, ATOM_STSD);\n\n        if (b == null) {\n            return new byte[0]; // this never should happens (missing codec startup data)\n        }\n\n        return readFullBox(b);\n    }\n\n    static class Box {\n        int type;\n        long offset;\n        long size;\n    }\n\n    public static class Moof {\n        int mfhdSequenceNumber;\n        public Traf traf;\n    }\n\n    public static class Traf {\n        public Tfhd tfhd;\n        long tfdt;\n        public Trun trun;\n    }\n\n    public static class Tfhd {\n        int bFlags;\n        public int trackId;\n        int defaultSampleDuration;\n        int defaultSampleSize;\n        int defaultSampleFlags;\n    }\n\n    static class TrunEntry {\n        int sampleDuration;\n        int sampleSize;\n        int sampleFlags;\n        int sampleCompositionTimeOffset;\n\n        boolean hasCompositionTimeOffset;\n        boolean isKeyframe;\n\n    }\n\n    public static class Trun {\n        public int chunkDuration;\n        public int chunkSize;\n\n        public int bFlags;\n        int bFirstSampleFlags;\n        int dataOffset;\n\n        public int entryCount;\n        byte[] bEntries;\n        int entriesRowSize;\n\n        public TrunEntry getEntry(final int i) {\n            final ByteBuffer buffer = ByteBuffer.wrap(bEntries, i * entriesRowSize, entriesRowSize);\n            final TrunEntry entry = new TrunEntry();\n\n            if (hasFlag(bFlags, 0x0100)) {\n                entry.sampleDuration = buffer.getInt();\n            }\n            if (hasFlag(bFlags, 0x0200)) {\n                entry.sampleSize = buffer.getInt();\n            }\n            if (hasFlag(bFlags, 0x0400)) {\n                entry.sampleFlags = buffer.getInt();\n            }\n            if (hasFlag(bFlags, 0x0800)) {\n                entry.sampleCompositionTimeOffset = buffer.getInt();\n            }\n\n            entry.hasCompositionTimeOffset = hasFlag(bFlags, 0x0800);\n            entry.isKeyframe = !hasFlag(entry.sampleFlags, 0x10000);\n\n            return entry;\n        }\n\n        public TrunEntry getAbsoluteEntry(final int i, final Tfhd header) {\n            final TrunEntry entry = getEntry(i);\n\n            if (!hasFlag(bFlags, 0x0100) && hasFlag(header.bFlags, 0x20)) {\n                entry.sampleFlags = header.defaultSampleFlags;\n            }\n\n            if (!hasFlag(bFlags, 0x0200) && hasFlag(header.bFlags, 0x10)) {\n                entry.sampleSize = header.defaultSampleSize;\n            }\n\n            if (!hasFlag(bFlags, 0x0100) && hasFlag(header.bFlags, 0x08)) {\n                entry.sampleDuration = header.defaultSampleDuration;\n            }\n\n            if (i == 0 && hasFlag(bFlags, 0x0004)) {\n                entry.sampleFlags = bFirstSampleFlags;\n            }\n\n            return entry;\n        }\n    }\n\n    public static class Tkhd {\n        int trackId;\n        long duration;\n        short bVolume;\n        int bWidth;\n        int bHeight;\n        byte[] matrix;\n        short bLayer;\n        short bAlternateGroup;\n    }\n\n    public static class Trak {\n        public Tkhd tkhd;\n        public Elst edstElst;\n        public Mdia mdia;\n\n    }\n\n    static class Mvhd {\n        long timeScale;\n        long nextTrackId;\n    }\n\n    static class Moov {\n        Mvhd mvhd;\n        Trak[] trak;\n        Trex[] mvexTrex;\n    }\n\n    public static class Trex {\n        private int trackId;\n        int defaultSampleDescriptionIndex;\n        int defaultSampleDuration;\n        int defaultSampleSize;\n        int defaultSampleFlags;\n    }\n\n    public static class Elst {\n        public long mediaTime;\n        public int bMediaRate;\n    }\n\n    public static class Mdia {\n        public int mdhdTimeScale;\n        public byte[] mdhd;\n        public Hdlr hdlr;\n        public Minf minf;\n    }\n\n    public static class Hdlr {\n        public int type;\n        public int subType;\n        public byte[] bReserved;\n    }\n\n    public static class Minf {\n        public byte[] dinf;\n        public byte[] stblStsd;\n        public byte[] mhd;\n    }\n\n    public static class Mp4Track {\n        public TrackKind kind;\n        public Trak trak;\n        public Trex trex;\n    }\n\n    public static class Mp4DashChunk {\n        public InputStream data;\n        public Moof moof;\n        private int i = 0;\n\n        public TrunEntry getNextSampleInfo() {\n            if (i >= moof.traf.trun.entryCount) {\n                return null;\n            }\n            return moof.traf.trun.getAbsoluteEntry(i++, moof.traf.tfhd);\n        }\n\n        public Mp4DashSample getNextSample() throws IOException {\n            if (data == null) {\n                throw new IllegalStateException(\"This chunk has info only\");\n            }\n            if (i >= moof.traf.trun.entryCount) {\n                return null;\n            }\n\n            final Mp4DashSample sample = new Mp4DashSample();\n            sample.info = moof.traf.trun.getAbsoluteEntry(i++, moof.traf.tfhd);\n            sample.data = new byte[sample.info.sampleSize];\n\n            if (data.read(sample.data) != sample.info.sampleSize) {\n                throw new EOFException(\"EOF reached while reading a sample\");\n            }\n\n            return sample;\n        }\n    }\n\n    public static class Mp4DashSample {\n        public TrunEntry info;\n        public byte[] data;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/Mp4FromDashWriter.java",
    "content": "package org.schabi.newpipe.streams;\n\nimport org.schabi.newpipe.streams.Mp4DashReader.Hdlr;\nimport org.schabi.newpipe.streams.Mp4DashReader.Mdia;\nimport org.schabi.newpipe.streams.Mp4DashReader.Mp4DashChunk;\nimport org.schabi.newpipe.streams.Mp4DashReader.Mp4DashSample;\nimport org.schabi.newpipe.streams.Mp4DashReader.Mp4Track;\nimport org.schabi.newpipe.streams.Mp4DashReader.TrackKind;\nimport org.schabi.newpipe.streams.Mp4DashReader.TrunEntry;\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.IOException;\nimport java.nio.ByteBuffer;\nimport java.util.ArrayList;\n\n/**\n * @author kapodamy\n */\npublic class Mp4FromDashWriter {\n    private static final int EPOCH_OFFSET = 2082844800;\n    private static final short DEFAULT_TIMESCALE = 1000;\n    private static final byte SAMPLES_PER_CHUNK_INIT = 2;\n    // ffmpeg uses 2, basic uses 1 (with 60fps uses 21 or 22). NewPipe will use 6\n    private static final byte SAMPLES_PER_CHUNK = 6;\n    // near 3.999 GiB\n    private static final long THRESHOLD_FOR_CO64 = 0xFFFEFFFFL;\n    // 2.2 MiB enough for: 1080p 60fps 00h35m00s\n    private static final int THRESHOLD_MOOV_LENGTH = (256 * 1024) + (2048 * 1024);\n\n    private final long time;\n\n    private ByteBuffer auxBuffer;\n    private SharpStream outStream;\n\n    private long lastWriteOffset = -1;\n    private long writeOffset;\n\n    private boolean moovSimulation = true;\n\n    private boolean done = false;\n    private boolean parsed = false;\n\n    private Mp4Track[] tracks;\n    private SharpStream[] sourceTracks;\n\n    private Mp4DashReader[] readers;\n    private Mp4DashChunk[] readersChunks;\n\n    private int overrideMainBrand = 0x00;\n\n    private final ArrayList<Integer> compatibleBrands = new ArrayList<>(5);\n\n    public Mp4FromDashWriter(final SharpStream... sources) throws IOException {\n        for (final SharpStream src : sources) {\n            if (!src.canRewind() && !src.canRead()) {\n                throw new IOException(\"All sources must be readable and allow rewind\");\n            }\n        }\n\n        sourceTracks = sources;\n        readers = new Mp4DashReader[sourceTracks.length];\n        readersChunks = new Mp4DashChunk[readers.length];\n        time = (System.currentTimeMillis() / 1000L) + EPOCH_OFFSET;\n\n        compatibleBrands.add(0x6D703431); // mp41\n        compatibleBrands.add(0x69736F6D); // isom\n        compatibleBrands.add(0x69736F32); // iso2\n    }\n\n    public Mp4Track[] getTracksFromSource(final int sourceIndex) throws IllegalStateException {\n        if (!parsed) {\n            throw new IllegalStateException(\"All sources must be parsed first\");\n        }\n\n        return readers[sourceIndex].getAvailableTracks();\n    }\n\n    public void parseSources() throws IOException, IllegalStateException {\n        if (done) {\n            throw new IllegalStateException(\"already done\");\n        }\n        if (parsed) {\n            throw new IllegalStateException(\"already parsed\");\n        }\n\n        try {\n            for (int i = 0; i < readers.length; i++) {\n                readers[i] = new Mp4DashReader(sourceTracks[i]);\n                readers[i].parse();\n            }\n\n        } finally {\n            parsed = true;\n        }\n    }\n\n    public void selectTracks(final int... trackIndex) throws IOException {\n        if (done) {\n            throw new IOException(\"already done\");\n        }\n        if (tracks != null) {\n            throw new IOException(\"tracks already selected\");\n        }\n\n        try {\n            tracks = new Mp4Track[readers.length];\n            for (int i = 0; i < readers.length; i++) {\n                tracks[i] = readers[i].selectTrack(trackIndex[i]);\n            }\n        } finally {\n            parsed = true;\n        }\n    }\n\n    public void setMainBrand(final int brand) {\n        overrideMainBrand = brand;\n    }\n\n    public boolean isDone() {\n        return done;\n    }\n\n    public boolean isParsed() {\n        return parsed;\n    }\n\n    public void close() throws IOException {\n        done = true;\n        parsed = true;\n\n        for (final SharpStream src : sourceTracks) {\n            src.close();\n        }\n\n        tracks = null;\n        sourceTracks = null;\n\n        readers = null;\n        readersChunks = null;\n\n        auxBuffer = null;\n        outStream = null;\n    }\n\n    @SuppressWarnings(\"MethodLength\")\n    public void build(final SharpStream output) throws IOException {\n        if (done) {\n            throw new RuntimeException(\"already done\");\n        }\n        if (!output.canWrite()) {\n            throw new IOException(\"the provided output is not writable\");\n        }\n\n        //\n        // WARNING: the muxer requires at least 8 samples of every track\n        //          not allowed for very short tracks (less than 0.5 seconds)\n        //\n        outStream = output;\n        long read = 8; // mdat box header size\n        long totalSampleSize = 0;\n        final int[] sampleExtra = new int[readers.length];\n        final int[] defaultMediaTime = new int[readers.length];\n        final int[] defaultSampleDuration = new int[readers.length];\n        final int[] sampleCount = new int[readers.length];\n\n        final TablesInfo[] tablesInfo = new TablesInfo[tracks.length];\n        for (int i = 0; i < tablesInfo.length; i++) {\n            tablesInfo[i] = new TablesInfo();\n        }\n\n        final int singleSampleBuffer;\n        if (tracks.length == 1 && tracks[0].kind == TrackKind.Audio) {\n            // near 1 second of audio data per chunk, avoid split the audio stream in large chunks\n            singleSampleBuffer = tracks[0].trak.mdia.mdhdTimeScale / 1000;\n        } else {\n            singleSampleBuffer = -1;\n        }\n\n\n        for (int i = 0; i < readers.length; i++) {\n            int samplesSize = 0;\n            int sampleSizeChanges = 0;\n            int compositionOffsetLast = -1;\n\n            Mp4DashChunk chunk;\n            while ((chunk = readers[i].getNextChunk(true)) != null) {\n\n                if (defaultMediaTime[i] < 1 && chunk.moof.traf.tfhd.defaultSampleDuration > 0) {\n                    defaultMediaTime[i] = chunk.moof.traf.tfhd.defaultSampleDuration;\n                }\n\n                read += chunk.moof.traf.trun.chunkSize;\n                sampleExtra[i] += chunk.moof.traf.trun.chunkDuration; // calculate track duration\n\n                TrunEntry info;\n                while ((info = chunk.getNextSampleInfo()) != null) {\n                    if (info.isKeyframe) {\n                        tablesInfo[i].stss++;\n                    }\n\n                    if (info.sampleDuration > defaultSampleDuration[i]) {\n                        defaultSampleDuration[i] = info.sampleDuration;\n                    }\n\n                    tablesInfo[i].stsz++;\n                    if (samplesSize != info.sampleSize) {\n                        samplesSize = info.sampleSize;\n                        sampleSizeChanges++;\n                    }\n\n                    if (info.hasCompositionTimeOffset) {\n                        if (info.sampleCompositionTimeOffset != compositionOffsetLast) {\n                            tablesInfo[i].ctts++;\n                            compositionOffsetLast = info.sampleCompositionTimeOffset;\n                        }\n                    }\n\n                    totalSampleSize += info.sampleSize;\n                }\n            }\n\n            if (defaultMediaTime[i] < 1) {\n                defaultMediaTime[i] = defaultSampleDuration[i];\n            }\n\n            readers[i].rewind();\n\n            if (singleSampleBuffer > 0) {\n                initChunkTables(tablesInfo[i], singleSampleBuffer, singleSampleBuffer);\n            } else {\n                initChunkTables(tablesInfo[i], SAMPLES_PER_CHUNK_INIT, SAMPLES_PER_CHUNK);\n            }\n\n            sampleCount[i] = tablesInfo[i].stsz;\n\n            if (sampleSizeChanges == 1) {\n                tablesInfo[i].stsz = 0;\n                tablesInfo[i].stszDefault = samplesSize;\n            } else {\n                tablesInfo[i].stszDefault = 0;\n            }\n\n            if (tablesInfo[i].stss == tablesInfo[i].stsz) {\n                tablesInfo[i].stss = -1; // for audio tracks (all samples are keyframes)\n            }\n\n            // ensure track duration\n            if (tracks[i].trak.tkhd.duration < 1) {\n                tracks[i].trak.tkhd.duration = sampleExtra[i]; // this never should happen\n            }\n        }\n\n\n        final boolean is64 = read > THRESHOLD_FOR_CO64;\n\n        // calculate the moov size\n        final int auxSize = makeMoov(defaultMediaTime, tablesInfo, is64);\n\n        if (auxSize < THRESHOLD_MOOV_LENGTH) {\n            auxBuffer = ByteBuffer.allocate(auxSize); // cache moov in the memory\n        }\n\n        moovSimulation = false;\n        writeOffset = 0;\n\n        final int ftypSize = makeFtyp();\n\n        // reserve moov space in the output stream\n        if (auxSize > 0) {\n            int length = auxSize;\n            final byte[] buffer = new byte[64 * 1024]; // 64 KiB\n            while (length > 0) {\n                final int count = Math.min(length, buffer.length);\n                outWrite(buffer, count);\n                length -= count;\n            }\n        }\n\n        if (auxBuffer == null) {\n            outSeek(ftypSize);\n        }\n\n        // tablesInfo contains row counts\n        // and after returning from makeMoov() will contain those table offsets\n        makeMoov(defaultMediaTime, tablesInfo, is64);\n\n        // write tables: stts stsc sbgp\n        // reset for ctts table: sampleCount sampleExtra\n        for (int i = 0; i < readers.length; i++) {\n            writeEntryArray(tablesInfo[i].stts, 2, sampleCount[i], defaultSampleDuration[i]);\n            writeEntryArray(tablesInfo[i].stsc, tablesInfo[i].stscBEntries.length,\n                    tablesInfo[i].stscBEntries);\n            tablesInfo[i].stscBEntries = null;\n            if (tablesInfo[i].ctts > 0) {\n                sampleCount[i] = 1; // the index is not base zero\n                sampleExtra[i] = -1;\n            }\n            if (tablesInfo[i].sbgp > 0) {\n                writeEntryArray(tablesInfo[i].sbgp, 1, sampleCount[i]);\n            }\n        }\n\n        if (auxBuffer == null) {\n            outRestore();\n        }\n\n        outWrite(makeMdat(totalSampleSize, is64));\n\n        final int[] sampleIndex = new int[readers.length];\n        final int[] sizes =\n                new int[singleSampleBuffer > 0 ? singleSampleBuffer : SAMPLES_PER_CHUNK];\n        final int[] sync = new int[singleSampleBuffer > 0 ? singleSampleBuffer : SAMPLES_PER_CHUNK];\n\n        int written = readers.length;\n        while (written > 0) {\n            written = 0;\n\n            for (int i = 0; i < readers.length; i++) {\n                if (sampleIndex[i] < 0) {\n                    continue; // track is done\n                }\n\n                final long chunkOffset = writeOffset;\n                int syncCount = 0;\n                final int limit;\n                if (singleSampleBuffer > 0) {\n                    limit = singleSampleBuffer;\n                } else {\n                    limit = sampleIndex[i] == 0 ? SAMPLES_PER_CHUNK_INIT : SAMPLES_PER_CHUNK;\n                }\n\n                int j = 0;\n                for (; j < limit; j++) {\n                    final Mp4DashSample sample = getNextSample(i);\n\n                    if (sample == null) {\n                        if (tablesInfo[i].ctts > 0 && sampleExtra[i] >= 0) {\n                            writeEntryArray(tablesInfo[i].ctts, 1, sampleCount[i],\n                                    sampleExtra[i]); // flush last entries\n                            outRestore();\n                        }\n                        sampleIndex[i] = -1;\n                        break;\n                    }\n\n                    sampleIndex[i]++;\n\n                    if (tablesInfo[i].ctts > 0) {\n                        if (sample.info.sampleCompositionTimeOffset == sampleExtra[i]) {\n                            sampleCount[i]++;\n                        } else {\n                            if (sampleExtra[i] >= 0) {\n                                tablesInfo[i].ctts = writeEntryArray(tablesInfo[i].ctts, 2,\n                                        sampleCount[i], sampleExtra[i]);\n                                outRestore();\n                            }\n                            sampleCount[i] = 1;\n                            sampleExtra[i] = sample.info.sampleCompositionTimeOffset;\n                        }\n                    }\n\n                    if (tablesInfo[i].stss > 0 && sample.info.isKeyframe) {\n                        sync[syncCount++] = sampleIndex[i];\n                    }\n\n                    if (tablesInfo[i].stsz > 0) {\n                        sizes[j] = sample.data.length;\n                    }\n\n                    outWrite(sample.data, sample.data.length);\n                }\n\n                if (j > 0) {\n                    written++;\n\n                    if (tablesInfo[i].stsz > 0) {\n                        tablesInfo[i].stsz = writeEntryArray(tablesInfo[i].stsz, j, sizes);\n                    }\n\n                    if (syncCount > 0) {\n                        tablesInfo[i].stss = writeEntryArray(tablesInfo[i].stss, syncCount, sync);\n                    }\n\n                    if (tablesInfo[i].stco > 0) {\n                        if (is64) {\n                            tablesInfo[i].stco = writeEntry64(tablesInfo[i].stco, chunkOffset);\n                        } else {\n                            tablesInfo[i].stco = writeEntryArray(tablesInfo[i].stco, 1,\n                                    (int) chunkOffset);\n                        }\n                    }\n\n                    outRestore();\n                }\n            }\n        }\n\n        if (auxBuffer != null) {\n            // dump moov\n            outSeek(ftypSize);\n            outStream.write(auxBuffer.array(), 0, auxBuffer.capacity());\n            auxBuffer = null;\n        }\n    }\n\n    private Mp4DashSample getNextSample(final int track) throws IOException {\n        if (readersChunks[track] == null) {\n            readersChunks[track] = readers[track].getNextChunk(false);\n            if (readersChunks[track] == null) {\n                return null; // EOF reached\n            }\n        }\n\n        final Mp4DashSample sample = readersChunks[track].getNextSample();\n        if (sample == null) {\n            readersChunks[track] = null;\n            return getNextSample(track);\n        } else {\n            return sample;\n        }\n    }\n\n\n    private int writeEntry64(final int offset, final long value) throws IOException {\n        outBackup();\n\n        auxSeek(offset);\n        auxWrite(ByteBuffer.allocate(8).putLong(value).array());\n\n        return offset + 8;\n    }\n\n    private int writeEntryArray(final int offset, final int count, final int... values)\n            throws IOException {\n        outBackup();\n\n        auxSeek(offset);\n\n        final int size = count * 4;\n        final ByteBuffer buffer = ByteBuffer.allocate(size);\n\n        for (int i = 0; i < count; i++) {\n            buffer.putInt(values[i]);\n        }\n\n        auxWrite(buffer.array());\n\n        return offset + size;\n    }\n\n    private void outBackup() {\n        if (auxBuffer == null && lastWriteOffset < 0) {\n            lastWriteOffset = writeOffset;\n        }\n    }\n\n    /**\n     * Restore to the previous position before the first call to writeEntry64()\n     * or writeEntryArray() methods.\n     */\n    private void outRestore() throws IOException {\n        if (lastWriteOffset > 0) {\n            outSeek(lastWriteOffset);\n            lastWriteOffset = -1;\n        }\n    }\n\n    private void initChunkTables(final TablesInfo tables, final int firstCount,\n                                 final int successiveCount) {\n        // tables.stsz holds amount of samples of the track (total)\n        final int totalSamples = (tables.stsz - firstCount);\n        final float chunkAmount = totalSamples / (float) successiveCount;\n        final int remainChunkOffset = (int) Math.ceil(chunkAmount);\n        final boolean remain = remainChunkOffset != (int) chunkAmount;\n        int index = 0;\n\n        tables.stsc = 1;\n        if (firstCount != successiveCount) {\n            tables.stsc++;\n        }\n        if (remain) {\n            tables.stsc++;\n        }\n\n        // stsc_table_entry = [first_chunk, samples_per_chunk, sample_description_index]\n        tables.stscBEntries = new int[tables.stsc * 3];\n        tables.stco = remainChunkOffset + 1; // total entries in chunk offset box\n\n        tables.stscBEntries[index++] = 1;\n        tables.stscBEntries[index++] = firstCount;\n        tables.stscBEntries[index++] = 1;\n\n        if (firstCount != successiveCount) {\n            tables.stscBEntries[index++] = 2;\n            tables.stscBEntries[index++] = successiveCount;\n            tables.stscBEntries[index++] = 1;\n        }\n\n        if (remain) {\n            tables.stscBEntries[index++] = remainChunkOffset + 1;\n            tables.stscBEntries[index++] = totalSamples % successiveCount;\n            tables.stscBEntries[index] = 1;\n        }\n    }\n\n    private void outWrite(final byte[] buffer) throws IOException {\n        outWrite(buffer, buffer.length);\n    }\n\n    private void outWrite(final byte[] buffer, final int count) throws IOException {\n        writeOffset += count;\n        outStream.write(buffer, 0, count);\n    }\n\n    private void outSeek(final long offset) throws IOException {\n        if (outStream.canSeek()) {\n            outStream.seek(offset);\n            writeOffset = offset;\n        } else if (outStream.canRewind()) {\n            outStream.rewind();\n            writeOffset = 0;\n            outSkip(offset);\n        } else {\n            throw new IOException(\"cannot seek or rewind the output stream\");\n        }\n    }\n\n    private void outSkip(final long amount) throws IOException {\n        outStream.skip(amount);\n        writeOffset += amount;\n    }\n\n    private int lengthFor(final int offset) throws IOException {\n        final int size = auxOffset() - offset;\n\n        if (moovSimulation) {\n            return size;\n        }\n\n        auxSeek(offset);\n        auxWrite(size);\n        auxSkip(size - 4);\n\n        return size;\n    }\n\n    private int make(final int type, final int extra, final int columns, final int rows)\n            throws IOException {\n        final byte base = 16;\n        final int size = columns * rows * 4;\n        int total = size + base;\n        int offset = auxOffset();\n\n        if (extra >= 0) {\n            total += 4;\n        }\n\n        auxWrite(ByteBuffer.allocate(12)\n                .putInt(total)\n                .putInt(type)\n                .putInt(0x00)// default version & flags\n                .array()\n        );\n\n        if (extra >= 0) {\n            offset += 4;\n            auxWrite(extra);\n        }\n\n        auxWrite(rows);\n        auxSkip(size);\n\n        return offset + base;\n    }\n\n    private void auxWrite(final int value) throws IOException {\n        auxWrite(ByteBuffer.allocate(4)\n                .putInt(value)\n                .array()\n        );\n    }\n\n    private void auxWrite(final byte[] buffer) throws IOException {\n        if (moovSimulation) {\n            writeOffset += buffer.length;\n        } else if (auxBuffer == null) {\n            outWrite(buffer, buffer.length);\n        } else {\n            auxBuffer.put(buffer);\n        }\n    }\n\n    private void auxSeek(final int offset) throws IOException {\n        if (moovSimulation) {\n            writeOffset = offset;\n        } else if (auxBuffer == null) {\n            outSeek(offset);\n        } else {\n            auxBuffer.position(offset);\n        }\n    }\n\n    private void auxSkip(final int amount) throws IOException {\n        if (moovSimulation) {\n            writeOffset += amount;\n        } else if (auxBuffer == null) {\n            outSkip(amount);\n        } else {\n            auxBuffer.position(auxBuffer.position() + amount);\n        }\n    }\n\n    private int auxOffset() {\n        return auxBuffer == null ? (int) writeOffset : auxBuffer.position();\n    }\n\n    private int makeFtyp() throws IOException {\n        int size = 16 + (compatibleBrands.size() * 4);\n        if (overrideMainBrand != 0) {\n            size += 4;\n        }\n\n        final ByteBuffer buffer = ByteBuffer.allocate(size);\n        buffer.putInt(size);\n        buffer.putInt(0x66747970); // \"ftyp\"\n\n        if (overrideMainBrand == 0) {\n            buffer.putInt(0x6D703432); // mayor brand \"mp42\"\n            buffer.putInt(512); // default minor version\n        } else {\n            buffer.putInt(overrideMainBrand);\n            buffer.putInt(0);\n            buffer.putInt(0x6D703432); // \"mp42\" compatible brand\n        }\n\n        for (final Integer brand : compatibleBrands) {\n            buffer.putInt(brand); // compatible brand\n        }\n\n        outWrite(buffer.array());\n\n        return size;\n    }\n\n    private byte[] makeMdat(final long refSize, final boolean is64) {\n        long size = refSize;\n        if (is64) {\n            size += 16;\n        } else {\n            size += 8;\n        }\n\n        final ByteBuffer buffer = ByteBuffer.allocate(is64 ? 16 : 8)\n                .putInt(is64 ? 0x01 : (int) size)\n                .putInt(0x6D646174); // mdat\n\n        if (is64) {\n            buffer.putLong(size);\n        }\n\n        return buffer.array();\n    }\n\n    private void makeMvhd(final long longestTrack) throws IOException {\n        auxWrite(new byte[]{\n                0x00, 0x00, 0x00, 0x78, 0x6D, 0x76, 0x68, 0x64, 0x01, 0x00, 0x00, 0x00\n        });\n        auxWrite(ByteBuffer.allocate(28)\n                .putLong(time)\n                .putLong(time)\n                .putInt(DEFAULT_TIMESCALE)\n                .putLong(longestTrack)\n                .array()\n        );\n\n        auxWrite(new byte[]{\n                0x00, 0x01, 0x00, 0x00, 0x01, 0x00, // default volume and rate\n                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // reserved values\n                // default matrix\n                0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                0x00, 0x00, 0x00, 0x00,\n                0x40, 0x00, 0x00, 0x00\n        });\n        auxWrite(new byte[24]); // predefined\n        auxWrite(ByteBuffer.allocate(4)\n                .putInt(tracks.length + 1)\n                .array()\n        );\n    }\n\n    private int makeMoov(final int[] defaultMediaTime, final TablesInfo[] tablesInfo,\n                         final boolean is64) throws RuntimeException, IOException {\n        final int start = auxOffset();\n\n        auxWrite(new byte[]{\n                0x00, 0x00, 0x00, 0x00, 0x6D, 0x6F, 0x6F, 0x76\n        });\n\n        long longestTrack = 0;\n        final long[] durations = new long[tracks.length];\n\n        for (int i = 0; i < durations.length; i++) {\n            durations[i] = (long) Math.ceil(\n                    ((double) tracks[i].trak.tkhd.duration / tracks[i].trak.mdia.mdhdTimeScale)\n                            * DEFAULT_TIMESCALE);\n\n            if (durations[i] > longestTrack) {\n                longestTrack = durations[i];\n            }\n        }\n\n        makeMvhd(longestTrack);\n\n        for (int i = 0; i < tracks.length; i++) {\n            if (tracks[i].trak.tkhd.matrix.length != 36) {\n                throw\n                    new RuntimeException(\"bad track matrix length (expected 36) in track n°\" + i);\n            }\n            makeTrak(i, durations[i], defaultMediaTime[i], tablesInfo[i], is64);\n        }\n\n        return lengthFor(start);\n    }\n\n    private void makeTrak(final int index, final long duration, final int defaultMediaTime,\n                          final TablesInfo tables, final boolean is64) throws IOException {\n        final int start = auxOffset();\n\n        auxWrite(new byte[]{\n                // trak header\n                0x00, 0x00, 0x00, 0x00, 0x74, 0x72, 0x61, 0x6B,\n                // tkhd header\n                0x00, 0x00, 0x00, 0x68, 0x74, 0x6B, 0x68, 0x64, 0x01, 0x00, 0x00, 0x03\n        });\n\n        final ByteBuffer buffer = ByteBuffer.allocate(48);\n        buffer.putLong(time);\n        buffer.putLong(time);\n        buffer.putInt(index + 1);\n        buffer.position(24);\n        buffer.putLong(duration);\n        buffer.position(40);\n        buffer.putShort(tracks[index].trak.tkhd.bLayer);\n        buffer.putShort(tracks[index].trak.tkhd.bAlternateGroup);\n        buffer.putShort(tracks[index].trak.tkhd.bVolume);\n        auxWrite(buffer.array());\n\n        auxWrite(tracks[index].trak.tkhd.matrix);\n        auxWrite(ByteBuffer.allocate(8)\n                .putInt(tracks[index].trak.tkhd.bWidth)\n                .putInt(tracks[index].trak.tkhd.bHeight)\n                .array()\n        );\n\n        auxWrite(new byte[]{\n                0x00, 0x00, 0x00, 0x24, 0x65, 0x64, 0x74, 0x73, // edts header\n                0x00, 0x00, 0x00, 0x1C, 0x65, 0x6C, 0x73, 0x74,\n                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 // elst header\n        });\n\n        final int bMediaRate;\n        final int mediaTime;\n\n        if (tracks[index].trak.edstElst == null) {\n            // is a audio track ¿is edst/elst optional for audio tracks?\n            mediaTime = 0x00; // ffmpeg set this value as zero, instead of defaultMediaTime\n            bMediaRate = 0x00010000;\n        } else {\n            mediaTime = (int) tracks[index].trak.edstElst.mediaTime;\n            bMediaRate = tracks[index].trak.edstElst.bMediaRate;\n        }\n\n        auxWrite(ByteBuffer\n                .allocate(12)\n                .putInt((int) duration)\n                .putInt(mediaTime)\n                .putInt(bMediaRate)\n                .array()\n        );\n\n        makeMdia(tracks[index].trak.mdia, tables, is64, tracks[index].kind == TrackKind.Audio);\n\n        lengthFor(start);\n    }\n\n    private void makeMdia(final Mdia mdia, final TablesInfo tablesInfo, final boolean is64,\n                          final boolean isAudio) throws IOException {\n        final int startMdia = auxOffset();\n        auxWrite(new byte[]{0x00, 0x00, 0x00, 0x00, 0x6D, 0x64, 0x69, 0x61}); // mdia\n        auxWrite(mdia.mdhd);\n        auxWrite(makeHdlr(mdia.hdlr));\n\n        final int startMinf = auxOffset();\n        auxWrite(new byte[]{0x00, 0x00, 0x00, 0x00, 0x6D, 0x69, 0x6E, 0x66}); // minf\n        auxWrite(mdia.minf.mhd);\n        auxWrite(mdia.minf.dinf);\n\n        final int startStbl = auxOffset();\n        auxWrite(new byte[]{0x00, 0x00, 0x00, 0x00, 0x73, 0x74, 0x62, 0x6C}); // stbl\n        auxWrite(mdia.minf.stblStsd);\n\n        //\n        // In audio tracks the following tables is not required: ssts ctts\n        // And stsz can be empty if has a default sample size\n        //\n        if (moovSimulation) {\n            make(0x73747473, -1, 2, 1); // stts\n            if (tablesInfo.stss > 0) {\n                make(0x73747373, -1, 1, tablesInfo.stss);\n            }\n            if (tablesInfo.ctts > 0) {\n                make(0x63747473, -1, 2, tablesInfo.ctts);\n            }\n            make(0x73747363, -1, 3, tablesInfo.stsc);\n            make(0x7374737A, tablesInfo.stszDefault, 1, tablesInfo.stsz);\n            make(is64 ? 0x636F3634 : 0x7374636F, -1, is64 ? 2 : 1, tablesInfo.stco);\n        } else {\n            tablesInfo.stts = make(0x73747473, -1, 2, 1);\n            if (tablesInfo.stss > 0) {\n                tablesInfo.stss = make(0x73747373, -1, 1, tablesInfo.stss);\n            }\n            if (tablesInfo.ctts > 0) {\n                tablesInfo.ctts = make(0x63747473, -1, 2, tablesInfo.ctts);\n            }\n            tablesInfo.stsc = make(0x73747363, -1, 3, tablesInfo.stsc);\n            tablesInfo.stsz = make(0x7374737A, tablesInfo.stszDefault, 1, tablesInfo.stsz);\n            tablesInfo.stco = make(is64 ? 0x636F3634 : 0x7374636F, -1, is64 ? 2 : 1,\n                    tablesInfo.stco);\n        }\n\n        if (isAudio) {\n            auxWrite(makeSgpd());\n            tablesInfo.sbgp = makeSbgp(); // during simulation the returned offset is ignored\n        }\n\n        lengthFor(startStbl);\n        lengthFor(startMinf);\n        lengthFor(startMdia);\n    }\n\n    private byte[] makeHdlr(final Hdlr hdlr) {\n        final ByteBuffer buffer = ByteBuffer.wrap(new byte[]{\n                0x00, 0x00, 0x00, 0x21, 0x68, 0x64, 0x6C, 0x72, // hdlr\n                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                0x00// null string character\n        });\n\n        buffer.position(12);\n        buffer.putInt(hdlr.type);\n        buffer.putInt(hdlr.subType);\n        buffer.put(hdlr.bReserved); // always is a zero array\n\n        return buffer.array();\n    }\n\n    private int makeSbgp() throws IOException {\n        final int offset = auxOffset();\n\n        auxWrite(new byte[] {\n                0x00, 0x00, 0x00, 0x1C, // box size\n                0x73, 0x62, 0x67, 0x70, // \"sbpg\"\n                0x00, 0x00, 0x00, 0x00, // default box flags\n                0x72, 0x6F, 0x6C, 0x6C, // group type \"roll\"\n                0x00, 0x00, 0x00, 0x01, // group table size\n                0x00, 0x00, 0x00, 0x00, // group[0] total samples (to be set later)\n                0x00, 0x00, 0x00, 0x01 // group[0] description index\n        });\n\n        return offset + 0x14;\n    }\n\n    private byte[] makeSgpd() {\n        /*\n         * Sample Group Description Box\n         *\n         * ¿whats does?\n         * the table inside of this box gives information about the\n         * characteristics of sample groups. The descriptive information is any other\n         * information needed to define or characterize the sample group.\n         *\n         * ¿is replicable this box?\n         * NO due lacks of documentation about this box but...\n         * most of m4a encoders and ffmpeg uses this box with dummy values (same values)\n         */\n\n        final ByteBuffer buffer = ByteBuffer.wrap(new byte[] {\n                0x00, 0x00, 0x00, 0x1A, // box size\n                0x73, 0x67, 0x70, 0x64, // \"sgpd\"\n                0x01, 0x00, 0x00, 0x00, // box flags (unknown flag sets)\n                0x72, 0x6F, 0x6C, 0x6C, // ¿¿group type??\n                0x00, 0x00, 0x00, 0x02, // ¿¿??\n                0x00, 0x00, 0x00, 0x01, // ¿¿??\n                (byte) 0xFF, (byte) 0xFF // ¿¿??\n        });\n\n        return buffer.array();\n    }\n\n    static class TablesInfo {\n        int stts;\n        int stsc;\n        int[] stscBEntries;\n        int ctts;\n        int stsz;\n        int stszDefault;\n        int stss;\n        int stco;\n        int sbgp;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/OggFromWebMWriter.java",
    "content": "package org.schabi.newpipe.streams;\n\nimport static org.schabi.newpipe.MainActivity.DEBUG;\n\nimport android.util.Log;\nimport android.util.Pair;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.streams.WebMReader.Cluster;\nimport org.schabi.newpipe.streams.WebMReader.Segment;\nimport org.schabi.newpipe.streams.WebMReader.SimpleBlock;\nimport org.schabi.newpipe.streams.WebMReader.WebMTrack;\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\nimport java.time.format.DateTimeFormatter;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n * @author kapodamy\n */\npublic class OggFromWebMWriter implements Closeable {\n    private static final byte FLAG_UNSET = 0x00;\n    //private static final byte FLAG_CONTINUED = 0x01;\n    private static final byte FLAG_FIRST = 0x02;\n    private static final byte FLAG_LAST = 0x04;\n\n    private static final byte HEADER_CHECKSUM_OFFSET = 22;\n    private static final byte HEADER_SIZE = 27;\n\n    private static final int TIME_SCALE_NS = 1000000000;\n\n    private boolean done = false;\n    private boolean parsed = false;\n\n    private final SharpStream source;\n    private final SharpStream output;\n\n    private int sequenceCount = 0;\n    private final int streamId;\n    private byte packetFlag = FLAG_FIRST;\n\n    private WebMReader webm = null;\n    private WebMTrack webmTrack = null;\n    private Segment webmSegment = null;\n    private Cluster webmCluster = null;\n    private SimpleBlock webmBlock = null;\n\n    private long webmBlockLastTimecode = 0;\n    private long webmBlockNearDuration = 0;\n\n    private short segmentTableSize = 0;\n    private final byte[] segmentTable = new byte[255];\n    private long segmentTableNextTimestamp = TIME_SCALE_NS;\n\n    private final int[] crc32Table = new int[256];\n    private final StreamInfo streamInfo;\n\n    public OggFromWebMWriter(@NonNull final SharpStream source, @NonNull final SharpStream target,\n                             @Nullable final StreamInfo streamInfo) {\n        if (!source.canRead() || !source.canRewind()) {\n            throw new IllegalArgumentException(\"source stream must be readable and allows seeking\");\n        }\n        if (!target.canWrite() || !target.canRewind()) {\n            throw new IllegalArgumentException(\"output stream must be writable and allows seeking\");\n        }\n\n        this.source = source;\n        this.output = target;\n        this.streamInfo = streamInfo;\n\n        this.streamId = (int) System.currentTimeMillis();\n\n        populateCrc32Table();\n    }\n\n    public boolean isDone() {\n        return done;\n    }\n\n    public boolean isParsed() {\n        return parsed;\n    }\n\n    public WebMTrack[] getTracksFromSource() throws IllegalStateException {\n        if (!parsed) {\n            throw new IllegalStateException(\"source must be parsed first\");\n        }\n\n        return webm.getAvailableTracks();\n    }\n\n    public void parseSource() throws IOException, IllegalStateException {\n        if (done) {\n            throw new IllegalStateException(\"already done\");\n        }\n        if (parsed) {\n            throw new IllegalStateException(\"already parsed\");\n        }\n\n        try {\n            webm = new WebMReader(source);\n            webm.parse();\n            webmSegment = webm.getNextSegment();\n        } finally {\n            parsed = true;\n        }\n    }\n\n    public void selectTrack(final int trackIndex) throws IOException {\n        if (!parsed) {\n            throw new IllegalStateException(\"source must be parsed first\");\n        }\n        if (done) {\n            throw new IOException(\"already done\");\n        }\n        if (webmTrack != null) {\n            throw new IOException(\"tracks already selected\");\n        }\n\n        switch (webm.getAvailableTracks()[trackIndex].kind) {\n            case Audio:\n            case Video:\n                break;\n            default:\n                throw new UnsupportedOperationException(\"the track must an audio or video stream\");\n        }\n\n        try {\n            webmTrack = webm.selectTrack(trackIndex);\n        } finally {\n            parsed = true;\n        }\n    }\n\n    @Override\n    public void close() throws IOException {\n        done = true;\n        parsed = true;\n\n        webmTrack = null;\n        webm = null;\n\n        if (!output.isClosed()) {\n            output.flush();\n        }\n\n        source.close();\n        output.close();\n    }\n\n    public void build() throws IOException {\n        final float resolution;\n        SimpleBlock bloq;\n        final ByteBuffer header = ByteBuffer.allocate(27 + (255 * 255));\n        final ByteBuffer page = ByteBuffer.allocate(64 * 1024);\n\n        header.order(ByteOrder.LITTLE_ENDIAN);\n\n        /* step 1: get the amount of frames per seconds */\n        switch (webmTrack.kind) {\n            case Audio:\n                resolution = getSampleFrequencyFromTrack(webmTrack.bMetadata);\n                if (resolution == 0f) {\n                    throw new RuntimeException(\"cannot get the audio sample rate\");\n                }\n                break;\n            case Video:\n                // WARNING: untested\n                if (webmTrack.defaultDuration == 0) {\n                    throw new RuntimeException(\"missing default frame time\");\n                }\n                resolution = 1000f / ((float) webmTrack.defaultDuration\n                        / webmSegment.info.timecodeScale);\n                break;\n            default:\n                throw new RuntimeException(\"not implemented\");\n        }\n\n        /* step 2: create packet with code init data */\n        if (webmTrack.codecPrivate != null) {\n            addPacketSegment(webmTrack.codecPrivate.length);\n            makePacketheader(0x00, header, webmTrack.codecPrivate);\n            write(header);\n            output.write(webmTrack.codecPrivate);\n        }\n\n        /* step 3: create packet with metadata */\n        final byte[] buffer = makeMetadata();\n        if (buffer != null) {\n            addPacketSegment(buffer.length);\n            makePacketheader(0x00, header, buffer);\n            write(header);\n            output.write(buffer);\n        }\n\n        /* step 4: calculate amount of packets */\n        while (webmSegment != null) {\n            bloq = getNextBlock();\n\n            if (bloq != null && addPacketSegment(bloq)) {\n                final int pos = page.position();\n                //noinspection ResultOfMethodCallIgnored\n                bloq.data.read(page.array(), pos, bloq.dataSize);\n                page.position(pos + bloq.dataSize);\n                continue;\n            }\n\n            // calculate the current packet duration using the next block\n            double elapsedNs = webmTrack.codecDelay;\n\n            if (bloq == null) {\n                packetFlag = FLAG_LAST; // note: if the flag is FLAG_CONTINUED, is changed\n                elapsedNs += webmBlockLastTimecode;\n\n                if (webmTrack.defaultDuration > 0) {\n                    elapsedNs += webmTrack.defaultDuration;\n                } else {\n                    // hardcoded way, guess the sample duration\n                    elapsedNs += webmBlockNearDuration;\n                }\n            } else {\n                elapsedNs += bloq.absoluteTimeCodeNs;\n            }\n\n            // get the sample count in the page\n            elapsedNs = elapsedNs / TIME_SCALE_NS;\n            elapsedNs = Math.ceil(elapsedNs * resolution);\n\n            // create header and calculate page checksum\n            int checksum = makePacketheader((long) elapsedNs, header, null);\n            checksum = calcCrc32(checksum, page.array(), page.position());\n\n            header.putInt(HEADER_CHECKSUM_OFFSET, checksum);\n\n            // dump data\n            write(header);\n            write(page);\n\n            webmBlock = bloq;\n        }\n    }\n\n    private int makePacketheader(final long granPos, @NonNull final ByteBuffer buffer,\n                                 final byte[] immediatePage) {\n        short length = HEADER_SIZE;\n\n        buffer.putInt(0x5367674f); // \"OggS\" binary string in little-endian\n        buffer.put((byte) 0x00); // version\n        buffer.put(packetFlag); // type\n\n        buffer.putLong(granPos); // granulate position\n\n        buffer.putInt(streamId); // bitstream serial number\n        buffer.putInt(sequenceCount++); // page sequence number\n\n        buffer.putInt(0x00); // page checksum\n\n        buffer.put((byte) segmentTableSize); // segment table\n        buffer.put(segmentTable, 0, segmentTableSize); // segment size\n\n        length += segmentTableSize;\n\n        clearSegmentTable(); // clear segment table for next header\n\n        int checksumCrc32 = calcCrc32(0x00, buffer.array(), length);\n\n        if (immediatePage != null) {\n            checksumCrc32 = calcCrc32(checksumCrc32, immediatePage, immediatePage.length);\n            buffer.putInt(HEADER_CHECKSUM_OFFSET, checksumCrc32);\n            segmentTableNextTimestamp -= TIME_SCALE_NS;\n        }\n\n        return checksumCrc32;\n    }\n\n    @Nullable\n    private byte[] makeMetadata() {\n        if (DEBUG) {\n            Log.d(\"OggFromWebMWriter\", \"Downloading media with codec ID \" + webmTrack.codecId);\n        }\n\n        if (\"A_OPUS\".equals(webmTrack.codecId)) {\n            final var metadata = new ArrayList<Pair<String, String>>();\n            if (streamInfo != null) {\n                metadata.add(Pair.create(\"COMMENT\", streamInfo.getUrl()));\n                metadata.add(Pair.create(\"GENRE\", streamInfo.getCategory()));\n                metadata.add(Pair.create(\"ARTIST\", streamInfo.getUploaderName()));\n                metadata.add(Pair.create(\"TITLE\", streamInfo.getName()));\n                metadata.add(Pair.create(\"DATE\", streamInfo\n                        .getUploadDate()\n                        .getLocalDateTime()\n                        .format(DateTimeFormatter.ISO_DATE)));\n            }\n\n            if (DEBUG) {\n                Log.d(\"OggFromWebMWriter\", \"Creating metadata header with this data:\");\n                metadata.forEach(p -> {\n                    Log.d(\"OggFromWebMWriter\", p.first + \"=\" + p.second);\n                });\n            }\n\n            return makeOpusTagsHeader(metadata);\n        } else if (\"A_VORBIS\".equals(webmTrack.codecId)) {\n            return new byte[]{\n                    0x03, // ¿¿¿???\n                    0x76, 0x6f, 0x72, 0x62, 0x69, 0x73, // \"vorbis\" binary string\n                    0x00, 0x00, 0x00, 0x00, // writing application string size (not present)\n                    0x00, 0x00, 0x00, 0x00 // additional tags count (zero means no tags)\n            };\n        }\n\n        // not implemented for the desired codec\n        return null;\n    }\n\n    /**\n     * This creates a single metadata tag for use in opus metadata headers. It contains the four\n     * byte string length field and includes the string as-is. This cannot be used independently,\n     * but must follow a proper \"OpusTags\" header.\n     *\n     * @param pair A key-value pair in the format \"KEY=some value\"\n     * @return The binary data of the encoded metadata tag\n     */\n    private static byte[] makeOpusMetadataTag(final Pair<String, String> pair) {\n        final var keyValue = pair.first.toUpperCase() + \"=\" + pair.second.trim();\n\n        final var bytes = keyValue.getBytes();\n        final var buf = ByteBuffer.allocate(4 + bytes.length);\n        buf.order(ByteOrder.LITTLE_ENDIAN);\n        buf.putInt(bytes.length);\n        buf.put(bytes);\n        return buf.array();\n    }\n\n    /**\n     * This returns a complete \"OpusTags\" header, created from the provided metadata tags.\n     * <p>\n     * You probably want to use makeOpusMetadata(), which uses this function to create\n     * a header with sensible metadata filled in.\n     *\n     * @param keyValueLines A list of pairs of the tags. This can also be though of as a mapping\n     *                      from one key to multiple values.\n     * @return The binary header\n     */\n    private static byte[] makeOpusTagsHeader(final List<Pair<String, String>> keyValueLines) {\n        final var tags = keyValueLines\n                .stream()\n                .filter(p -> !p.second.isBlank())\n                .map(OggFromWebMWriter::makeOpusMetadataTag)\n                .collect(Collectors.toUnmodifiableList());\n\n        final var tagsBytes = tags.stream().collect(Collectors.summingInt(arr -> arr.length));\n\n        // Fixed header fields + dynamic fields\n        final var byteCount = 16 + tagsBytes;\n\n        final var head = ByteBuffer.allocate(byteCount);\n        head.order(ByteOrder.LITTLE_ENDIAN);\n        head.put(new byte[]{\n                0x4F, 0x70, 0x75, 0x73, 0x54, 0x61, 0x67, 0x73, // \"OpusTags\" binary string\n                0x00, 0x00, 0x00, 0x00, // vendor (aka. Encoder) string of length 0\n        });\n        head.putInt(tags.size()); // 4 bytes for tag count\n        tags.forEach(head::put); // dynamic amount of tag bytes\n\n        return head.array();\n    }\n\n    private void write(final ByteBuffer buffer) throws IOException {\n        output.write(buffer.array(), 0, buffer.position());\n        buffer.position(0);\n    }\n\n    @Nullable\n    private SimpleBlock getNextBlock() throws IOException {\n        SimpleBlock res;\n\n        if (webmBlock != null) {\n            res = webmBlock;\n            webmBlock = null;\n            return res;\n        }\n\n        if (webmSegment == null) {\n            webmSegment = webm.getNextSegment();\n            if (webmSegment == null) {\n                return null; // no more blocks in the selected track\n            }\n        }\n\n        if (webmCluster == null) {\n            webmCluster = webmSegment.getNextCluster();\n            if (webmCluster == null) {\n                webmSegment = null;\n                return getNextBlock();\n            }\n        }\n\n        res = webmCluster.getNextSimpleBlock();\n        if (res == null) {\n            webmCluster = null;\n            return getNextBlock();\n        }\n\n        webmBlockNearDuration = res.absoluteTimeCodeNs - webmBlockLastTimecode;\n        webmBlockLastTimecode = res.absoluteTimeCodeNs;\n\n        return res;\n    }\n\n    private float getSampleFrequencyFromTrack(final byte[] bMetadata) {\n        // hardcoded way\n        final ByteBuffer buffer = ByteBuffer.wrap(bMetadata);\n\n        while (buffer.remaining() >= 6) {\n            final int id = buffer.getShort() & 0xFFFF;\n            if (id == 0x0000B584) {\n                return buffer.getFloat();\n            }\n        }\n\n        return 0.0f;\n    }\n\n    private void clearSegmentTable() {\n        segmentTableNextTimestamp += TIME_SCALE_NS;\n        packetFlag = FLAG_UNSET;\n        segmentTableSize = 0;\n    }\n\n    private boolean addPacketSegment(final SimpleBlock block) {\n        final long timestamp = block.absoluteTimeCodeNs + webmTrack.codecDelay;\n\n        if (timestamp >= segmentTableNextTimestamp) {\n            return false;\n        }\n\n        return addPacketSegment(block.dataSize);\n    }\n\n    private boolean addPacketSegment(final int size) {\n        if (size > 65025) {\n            throw new UnsupportedOperationException(\"page size cannot be larger than 65025\");\n        }\n\n        int available = (segmentTable.length - segmentTableSize) * 255;\n        final boolean extra = (size % 255) == 0;\n\n        if (extra) {\n            // add a zero byte entry in the table\n            // required to indicate the sample size is multiple of 255\n            available -= 255;\n        }\n\n        // check if possible add the segment, without overflow the table\n        if (available < size) {\n            return false; // not enough space on the page\n        }\n\n        for (int seg = size; seg > 0; seg -= 255) {\n            segmentTable[segmentTableSize++] = (byte) Math.min(seg, 255);\n        }\n\n        if (extra) {\n            segmentTable[segmentTableSize++] = 0x00;\n        }\n\n        return true;\n    }\n\n    private void populateCrc32Table() {\n        for (int i = 0; i < 0x100; i++) {\n            int crc = i << 24;\n            for (int j = 0; j < 8; j++) {\n                final long b = crc >>> 31;\n                crc <<= 1;\n                crc ^= (int) (0x100000000L - b) & 0x04c11db7;\n            }\n            crc32Table[i] = crc;\n        }\n    }\n\n    private int calcCrc32(final int initialCrc, final byte[] buffer, final int size) {\n        int crc = initialCrc;\n        for (int i = 0; i < size; i++) {\n            final int reg = (crc >>> 24) & 0xff;\n            crc = (crc << 8) ^ crc32Table[reg ^ (buffer[i] & 0xff)];\n        }\n\n        return crc;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/SrtFromTtmlWriter.java",
    "content": "package org.schabi.newpipe.streams;\n\nimport org.jsoup.Jsoup;\nimport org.jsoup.nodes.Document;\nimport org.jsoup.nodes.Element;\nimport org.jsoup.nodes.Node;\nimport org.jsoup.nodes.TextNode;\nimport org.jsoup.parser.Parser;\nimport org.jsoup.select.Elements;\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.IOException;\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\n\n/**\n * Converts TTML subtitles to SRT format.\n *\n * References:\n *  - TTML 2.0 (W3C): https://www.w3.org/TR/ttml2/\n *  - SRT format: https://en.wikipedia.org/wiki/SubRip\n */\npublic class SrtFromTtmlWriter {\n    private static final String NEW_LINE = \"\\r\\n\";\n\n    private final SharpStream out;\n    private final boolean ignoreEmptyFrames;\n    private final Charset charset = StandardCharsets.UTF_8;\n\n    // According to the SubRip (.srt) specification, subtitle\n    // numbering must start from 1.\n    // Some players accept 0 or even negative indices,\n    // but to ensure compliance we start at 1.\n    private int frameIndex = 1;\n\n    public SrtFromTtmlWriter(final SharpStream out, final boolean ignoreEmptyFrames) {\n        this.out = out;\n        this.ignoreEmptyFrames = ignoreEmptyFrames;\n    }\n\n    private static String getTimestamp(final Element frame, final String attr) {\n        return frame\n                .attr(attr)\n                .replace('.', ','); // SRT subtitles uses comma as decimal separator\n    }\n\n    private void writeFrame(final String begin, final String end, final StringBuilder text)\n            throws IOException {\n        writeString(String.valueOf(frameIndex));\n        frameIndex += 1;\n        writeString(NEW_LINE);\n        writeString(begin);\n        writeString(\" --> \");\n        writeString(end);\n        writeString(NEW_LINE);\n        writeString(text.toString());\n        writeString(NEW_LINE);\n        writeString(NEW_LINE);\n    }\n\n    private void writeString(final String text) throws IOException {\n        out.write(text.getBytes(charset));\n    }\n\n    /**\n     * Decode XML or HTML entities into their actual (literal) characters.\n     *\n     * TTML is XML-based, so text nodes may contain escaped entities\n     * instead of direct characters. For example:\n     *\n     *   \"&amp;\"          → \"&\"\n     *   \"&lt;\"           → \"<\"\n     *   \"&gt;\"           → \">\"\n     *   \"&#x9;\"          → \"\\t\" (TAB)\n     *   \"&#xA;\" (&#10;)  → \"\\n\" (LINE FEED)\n     *\n     * XML files cannot contain characters like \"<\", \">\", \"&\" directly,\n     * so they must be represented using their entity-encoded forms.\n     *\n     * Jsoup sometimes leaves nested or encoded entities unresolved\n     * (e.g. inside <p> text nodes in TTML files), so this function\n     * acts as a final “safety net” to ensure all entities are decoded\n     * before further normalization.\n     *\n     * Character representation layers for reference:\n     *   - Literal characters: <, >, &\n     *       → appear in runtime/output text (e.g. final SRT output)\n     *   - Escaped entities: &lt;, &gt;, &amp;\n     *       → appear in XML/HTML/TTML source files\n     *   - Numeric entities: &#xA0;, &#x9;, &#xD;\n     *       → appear mainly in XML/TTML files (also valid in HTML)\n     *         for non-printable or special characters\n     *   - Unicode escapes: \\u00A0 (Java/Unicode internal form)\n     *       → appear only in Java source code (NOT valid in XML)\n     *\n     * XML entities include both named (&amp;, &lt;) and numeric\n     * (&#xA0;, &#160;) forms.\n     *\n     * @param encodedEntities The raw text fragment possibly containing\n     *                        encoded XML entities.\n     * @return A decoded string where all entities are replaced by their\n     *         actual (literal) characters.\n     */\n    private String decodeXmlEntities(final String encodedEntities) {\n        return Parser.unescapeEntities(encodedEntities, true);\n    }\n\n    /**\n     * Handle rare XML entity characters like LF: &#xA;(`\\n`),\n     * CR: &#xD;(`\\r`) and CRLF: (`\\r\\n`).\n     *\n     * These are technically valid in TTML (XML allows them)\n     * but unusual in practice, since most TTML line breaks\n     * are represented as <br/> tags instead.\n     * As a defensive approach, we normalize them:\n     *\n     * - Windows (\\r\\n), macOS (\\r), and Unix (\\n) → unified SRT NEW_LINE (\\r\\n)\n     *\n     * Although well-formed TTML normally encodes line breaks\n     * as <br/> tags, some auto-generated or malformed TTML files\n     * may embed literal newline entities (&#xA;, &#xD;). This\n     * normalization ensures these cases render properly in SRT\n     * players instead of breaking the subtitle structure.\n     *\n     * @param text To be normalized text with actual characters.\n     * @return Unified SRT NEW_LINE converted from all kinds of line breaks.\n     */\n    private String normalizeLineBreakForSrt(final String text) {\n        String cleaned = text;\n\n        // NOTE:\n        // The order of newline replacements must NOT change,\n        // or duplicated line breaks (e.g. \\r\\n → \\n\\n) will occur.\n        cleaned = cleaned.replace(\"\\r\\n\", \"\\n\")\n                         .replace(\"\\r\", \"\\n\");\n\n        cleaned = cleaned.replace(\"\\n\", NEW_LINE);\n\n        return cleaned;\n    }\n\n    private String normalizeForSrt(final String actualText) {\n        String cleaned = actualText;\n\n        // Replace NBSP \"non-breaking space\" (\\u00A0) with regular space ' '(\\u0020).\n        //\n        // Why:\n        // - Some viewers render NBSP(\\u00A0) incorrectly:\n        //   * MPlayer 1.5: shown as “??”\n        //   * Linux command `cat -A`: displayed as control-like markers\n        //     (M-BM-)\n        //   * Acode (Android editor): displayed as visible replacement\n        //     glyphs (red dots)\n        // - Other viewers show it as a normal space (e.g., VS Code 1.104.0,\n        //   vlc 3.0.20, mpv 0.37.0, Totem 43.0)\n        // → Mixed rendering creates inconsistency and may confuse users.\n        //\n        // Details:\n        // - YouTube TTML subtitles use both regular spaces (\\u0020)\n        //   and non-breaking spaces (\\u00A0).\n        // - SRT subtitles only support regular spaces (\\u0020),\n        //   so \\u00A0 may cause display issues.\n        // - \\u00A0 and \\u0020 are visually identical (i.e., they both\n        //   appear as spaces ' '), but they differ in Unicode encoding,\n        //   and NBSP (\\u00A0) renders differently in different viewers.\n        // - SRT is a plain-text format and does not interpret\n        //   \"non-breaking\" behavior.\n        //\n        // Conclusion:\n        // - Ensure uniform behavior, so replace it to a regular space\n        //   without \"non-breaking\" behavior.\n        //\n        // References:\n        //   - Unicode U+00A0 NBSP (Latin-1 Supplement):\n        //     https://unicode.org/charts/PDF/U0080.pdf\n        cleaned = cleaned.replace('\\u00A0', ' ') // Non-breaking space\n                 .replace('\\u202F', ' ') // Narrow no-break space\n                 .replace('\\u205F', ' ') // Medium mathematical space\n                 .replace('\\u3000', ' ') // Ideographic space\n                 // \\u2000 ~ \\u200A are whitespace characters (e.g.,\n                 // en space, em space), replaced with regular space (\\u0020).\n                 .replaceAll(\"[\\\\u2000-\\\\u200A]\", \" \"); // Whitespace characters\n\n        // \\u200B ~ \\u200F are a range of non-spacing characters\n        // (e.g., zero-width space, zero-width non-joiner, etc.),\n        // which have no effect in *.SRT files and may cause\n        // display issues.\n        // These characters are invisible to the human eye, and\n        // they still exist in the encoding, so they need to be\n        // removed.\n        // After removal, the actual content becomes completely\n        // empty \"\", meaning there are no characters left, just\n        // an empty space, which helps avoid formatting issues\n        // in subtitles.\n        cleaned = cleaned.replaceAll(\"[\\\\u200B-\\\\u200F]\", \"\"); // Non-spacing characters\n\n        // Remove control characters (\\u0000 ~ \\u001F, except\n        // \\n, \\r, \\t).\n        // - These are ASCII C0 control codes (e.g. \\u0001 SOH,\n        //   \\u0008 BS, \\u001F US), invisible and irrelevant in\n        //   subtitles, may cause square boxes (?) in players.\n        // - Reference:\n        //   Unicode Basic Latin (https://unicode.org/charts/PDF/U0000.pdf)\n        //   ASCII Control (https://en.wikipedia.org/wiki/ASCII#Control_characters)\n        cleaned = cleaned.replaceAll(\"[\\\\u0000-\\\\u0008\\\\u000B\\\\u000C\\\\u000E-\\\\u001F]\", \"\");\n\n        // Reasoning:\n        // - subtitle files generally don't require tabs for alignment.\n        // - Tabs can be displayed with varying widths across different\n        //   editors or platforms, which may cause display issues.\n        // - Replace it with a single space for consistent display\n        //   across different editors or platforms.\n        cleaned = cleaned.replace('\\t', ' ');\n\n        cleaned = normalizeLineBreakForSrt(cleaned);\n\n        return cleaned;\n    }\n\n    private String sanitizeFragment(final String raw) {\n        if (null == raw) {\n            return \"\";\n        }\n\n        final String actualCharacters = decodeXmlEntities(raw);\n\n        final String srtSafeText = normalizeForSrt(actualCharacters);\n\n        return srtSafeText;\n    }\n\n    // Recursively process all child nodes to ensure text inside\n    // nested tags (e.g., <span>) is also extracted.\n    private void traverseChildNodesForNestedTags(final Node parent,\n                                                 final StringBuilder text) {\n        for (final Node child : parent.childNodes()) {\n            extractText(child, text);\n        }\n    }\n\n    // CHECKSTYLE:OFF checkstyle:JavadocStyle\n    // checkstyle does not understand that span tags are inside a code block\n    /**\n     * <p>Recursive method to extract text from all nodes.</p>\n     * <p>\n     *   This method processes {@link TextNode}s and {@code <br>} tags,\n     *   recursively extracting text from nested tags\n     *   (e.g. extracting text from nested {@code <span>} tags).\n     *   Newlines are added for {@code <br>} tags.\n     * </p>\n     * @param node the current node to process\n     * @param text the {@link StringBuilder} to append the extracted text to\n     */\n    // --------------------------------------------------------------------\n    // [INTERNAL NOTE] TTML text layer explanation\n    //\n    // TTML parsing involves multiple text \"layers\":\n    //   1. Raw XML entities (e.g., &lt;, &#xA0;) are decoded by Jsoup.\n    //   2. extractText() works on DOM TextNodes (already parsed strings).\n    //   3. sanitizeFragment() decodes remaining entities and fixes\n    //      Unicode quirks.\n    //   4. normalizeForSrt() ensures literal text is safe for SRT output.\n    //\n    // In short:\n    //   Jsoup handles XML-level syntax,\n    //   our code handles text-level normalization for subtitles.\n    // --------------------------------------------------------------------\n    private void extractText(final Node node, final StringBuilder text) {\n        if (node instanceof TextNode textNode) {\n            String rawTtmlFragment = textNode.getWholeText();\n            String srtContent = sanitizeFragment(rawTtmlFragment);\n            text.append(srtContent);\n        } else if (node instanceof Element element) {\n            // <br> is a self-closing HTML tag used to insert a line break.\n            if (element.tagName().equalsIgnoreCase(\"br\")) {\n                // Add a newline for <br> tags\n                text.append(NEW_LINE);\n            }\n        }\n\n        traverseChildNodesForNestedTags(node, text);\n    }\n    // CHECKSTYLE:ON\n\n    public void build(final SharpStream ttml) throws IOException {\n        /*\n         * TTML parser with BASIC support\n         * multiple CUE is not supported\n         * styling is not supported\n         * tag timestamps (in auto-generated subtitles) are not supported, maybe in the future\n         * also TimestampTagOption enum is not applicable\n         * Language parsing is not supported\n         */\n\n        // parse XML\n        final byte[] buffer = new byte[(int) ttml.available()];\n        ttml.read(buffer);\n        final Document doc = Jsoup.parse(new ByteArrayInputStream(buffer), \"UTF-8\", \"\",\n                Parser.xmlParser());\n\n        final StringBuilder text = new StringBuilder(128);\n        final Elements paragraphList = doc.select(\"body > div > p\");\n\n        // check if has frames\n        if (paragraphList.isEmpty()) {\n            return;\n        }\n\n        for (final Element paragraph : paragraphList) {\n            text.setLength(0);\n\n            // Recursively extract text from all child nodes\n            extractText(paragraph, text);\n\n            if (ignoreEmptyFrames && text.length() < 1) {\n                continue;\n            }\n\n            final String begin = getTimestamp(paragraph, \"begin\");\n            final String end = getTimestamp(paragraph, \"end\");\n\n            writeFrame(begin, end, text);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/WebMReader.java",
    "content": "package org.schabi.newpipe.streams;\n\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.EOFException;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\nimport java.util.NoSuchElementException;\n\n/**\n *\n * @author kapodamy\n */\npublic class WebMReader {\n    private static final int ID_EMBL = 0x0A45DFA3;\n    private static final int ID_EMBL_READ_VERSION = 0x02F7;\n    private static final int ID_EMBL_DOC_TYPE = 0x0282;\n    private static final int ID_EMBL_DOC_TYPE_READ_VERSION = 0x0285;\n\n    private static final int ID_SEGMENT = 0x08538067;\n\n    private static final int ID_INFO = 0x0549A966;\n    private static final int ID_TIMECODE_SCALE = 0x0AD7B1;\n    private static final int ID_DURATION = 0x489;\n\n    private static final int ID_TRACKS = 0x0654AE6B;\n    private static final int ID_TRACK_ENTRY = 0x2E;\n    private static final int ID_TRACK_NUMBER = 0x57;\n    private static final int ID_TRACK_TYPE = 0x03;\n    private static final int ID_CODEC_ID = 0x06;\n    private static final int ID_CODEC_PRIVATE = 0x23A2;\n    private static final int ID_VIDEO = 0x60;\n    private static final int ID_AUDIO = 0x61;\n    private static final int ID_DEFAULT_DURATION = 0x3E383;\n    private static final int ID_FLAG_LACING = 0x1C;\n    private static final int ID_CODEC_DELAY = 0x16AA;\n    private static final int ID_SEEK_PRE_ROLL = 0x16BB;\n\n    private static final int ID_CLUSTER = 0x0F43B675;\n    private static final int ID_TIMECODE = 0x67;\n    private static final int ID_SIMPLE_BLOCK = 0x23;\n    private static final int ID_BLOCK = 0x21;\n    private static final int ID_GROUP_BLOCK = 0x20;\n\n\n    public enum TrackKind {\n        Audio/*2*/, Video/*1*/, Other\n    }\n\n    private final DataReader stream;\n    private Segment segment;\n    private WebMTrack[] tracks;\n    private int selectedTrack;\n    private boolean done;\n    private boolean firstSegment;\n\n    public WebMReader(final SharpStream source) {\n        this.stream = new DataReader(source);\n    }\n\n    public void parse() throws IOException {\n        Element elem = readElement(ID_EMBL);\n        if (!readEbml(elem, 1, 2)) {\n            throw new UnsupportedOperationException(\"Unsupported EBML data (WebM)\");\n        }\n        ensure(elem);\n\n        elem = untilElement(null, ID_SEGMENT);\n        if (elem == null) {\n            throw new IOException(\"Fragment element not found\");\n        }\n        segment = readSegment(elem, 0, true);\n        tracks = segment.tracks;\n        selectedTrack = -1;\n        done = false;\n        firstSegment = true;\n    }\n\n    public WebMTrack[] getAvailableTracks() {\n        return tracks;\n    }\n\n    public WebMTrack selectTrack(final int index) {\n        selectedTrack = index;\n        return tracks[index];\n    }\n\n    public Segment getNextSegment() throws IOException {\n        if (done) {\n            return null;\n        }\n\n        if (firstSegment && segment != null) {\n            firstSegment = false;\n            return segment;\n        }\n\n        ensure(segment.ref);\n        // WARNING: track cannot be the same or have different index in new segments\n        final Element elem = untilElement(null, ID_SEGMENT);\n        if (elem == null) {\n            done = true;\n            return null;\n        }\n        segment = readSegment(elem, 0, false);\n\n        return segment;\n    }\n\n    private long readNumber(final Element parent) throws IOException {\n        int length = (int) parent.contentSize;\n        long value = 0;\n        while (length-- > 0) {\n            final int read = stream.read();\n            if (read == -1) {\n                throw new EOFException();\n            }\n            value = (value << 8) | read;\n        }\n        return value;\n    }\n\n    private String readString(final Element parent) throws IOException {\n        return new String(readBlob(parent), StandardCharsets.UTF_8); // or use \"utf-8\"\n    }\n\n    private byte[] readBlob(final Element parent) throws IOException {\n        final long length = parent.contentSize;\n        final byte[] buffer = new byte[(int) length];\n        final int read = stream.read(buffer);\n        if (read < length) {\n            throw new EOFException();\n        }\n        return buffer;\n    }\n\n    private long readEncodedNumber() throws IOException {\n        int value = stream.read();\n\n        if (value > 0) {\n            byte size = 1;\n            int mask = 0x80;\n\n            while (size < 9) {\n                if ((value & mask) == mask) {\n                    mask = 0xFF;\n                    mask >>= size;\n\n                    long number = value & mask;\n\n                    for (int i = 1; i < size; i++) {\n                        value = stream.read();\n                        number <<= 8;\n                        number |= value;\n                    }\n\n                    return number;\n                }\n\n                mask >>= 1;\n                size++;\n            }\n        }\n\n        throw new IOException(\"Invalid encoded length\");\n    }\n\n    private Element readElement() throws IOException {\n        final Element elem = new Element();\n        elem.offset = stream.position();\n        elem.type = (int) readEncodedNumber();\n        elem.contentSize = readEncodedNumber();\n        elem.size = elem.contentSize + stream.position() - elem.offset;\n\n        return elem;\n    }\n\n    private Element readElement(final int expected) throws IOException {\n        final Element elem = readElement();\n        if (expected != 0 && elem.type != expected) {\n            throw new NoSuchElementException(\"expected \" + elementID(expected)\n                    + \" found \" + elementID(elem.type));\n        }\n\n        return elem;\n    }\n\n    private Element untilElement(final Element ref, final int... expected) throws IOException {\n        Element elem;\n        while (ref == null ? stream.available() : (stream.position() < (ref.offset + ref.size))) {\n            elem = readElement();\n            if (expected.length < 1) {\n                return elem;\n            }\n            for (final int type : expected) {\n                if (elem.type == type) {\n                    return elem;\n                }\n            }\n\n            ensure(elem);\n        }\n\n        return null;\n    }\n\n    private String elementID(final long type) {\n        return \"0x\".concat(Long.toHexString(type));\n    }\n\n    private void ensure(final Element ref) throws IOException {\n        final long skip = (ref.offset + ref.size) - stream.position();\n\n        if (skip == 0) {\n            return;\n        } else if (skip < 0) {\n            throw new EOFException(String.format(\n                    \"parser go beyond limits of the Element. type=%s offset=%s size=%s position=%s\",\n                    elementID(ref.type), ref.offset, ref.size, stream.position()\n            ));\n        }\n\n        stream.skipBytes(skip);\n    }\n\n    private boolean readEbml(final Element ref, final int minReadVersion,\n                             final int minDocTypeVersion) throws IOException {\n        Element elem = untilElement(ref, ID_EMBL_READ_VERSION);\n        if (elem == null) {\n            return false;\n        }\n        if (readNumber(elem) > minReadVersion) {\n            return false;\n        }\n\n        elem = untilElement(ref, ID_EMBL_DOC_TYPE);\n        if (elem == null) {\n            return false;\n        }\n        if (!readString(elem).equals(\"webm\")) {\n            return false;\n        }\n        elem = untilElement(ref, ID_EMBL_DOC_TYPE_READ_VERSION);\n\n        return elem != null && readNumber(elem) <= minDocTypeVersion;\n    }\n\n    private Info readInfo(final Element ref) throws IOException {\n        Element elem;\n        final Info info = new Info();\n\n        while ((elem = untilElement(ref, ID_TIMECODE_SCALE, ID_DURATION)) != null) {\n            switch (elem.type) {\n                case ID_TIMECODE_SCALE:\n                    info.timecodeScale = readNumber(elem);\n                    break;\n                case ID_DURATION:\n                    info.duration = readNumber(elem);\n                    break;\n            }\n            ensure(elem);\n        }\n\n        if (info.timecodeScale == 0) {\n            throw new NoSuchElementException(\"Element Timecode not found\");\n        }\n\n        return info;\n    }\n\n    private Segment readSegment(final Element ref, final int trackLacingExpected,\n                                final boolean metadataExpected) throws IOException {\n        final Segment obj = new Segment(ref);\n        Element elem;\n        while ((elem = untilElement(ref, ID_INFO, ID_TRACKS, ID_CLUSTER)) != null) {\n            if (elem.type == ID_CLUSTER) {\n                obj.currentCluster = elem;\n                break;\n            }\n            switch (elem.type) {\n                case ID_INFO:\n                    obj.info = readInfo(elem);\n                    break;\n                case ID_TRACKS:\n                    obj.tracks = readTracks(elem, trackLacingExpected);\n                    break;\n            }\n            ensure(elem);\n        }\n\n        if (metadataExpected && (obj.info == null || obj.tracks == null)) {\n            throw new RuntimeException(\n                    \"Cluster element found without Info and/or Tracks element at position \"\n                            + ref.offset);\n        }\n\n        return obj;\n    }\n\n    private WebMTrack[] readTracks(final Element ref, final int lacingExpected) throws IOException {\n        final ArrayList<WebMTrack> trackEntries = new ArrayList<>(2);\n        Element elemTrackEntry;\n\n        while ((elemTrackEntry = untilElement(ref, ID_TRACK_ENTRY)) != null) {\n            final WebMTrack entry = new WebMTrack();\n            boolean drop = false;\n            Element elem;\n            while ((elem = untilElement(elemTrackEntry)) != null) {\n                switch (elem.type) {\n                    case ID_TRACK_NUMBER:\n                        entry.trackNumber = readNumber(elem);\n                        break;\n                    case ID_TRACK_TYPE:\n                        entry.trackType = (int) readNumber(elem);\n                        break;\n                    case ID_CODEC_ID:\n                        entry.codecId = readString(elem);\n                        break;\n                    case ID_CODEC_PRIVATE:\n                        entry.codecPrivate = readBlob(elem);\n                        break;\n                    case ID_AUDIO:\n                    case ID_VIDEO:\n                        entry.bMetadata = readBlob(elem);\n                        break;\n                    case ID_DEFAULT_DURATION:\n                        entry.defaultDuration = readNumber(elem);\n                        break;\n                    case ID_FLAG_LACING:\n                        drop = readNumber(elem) != lacingExpected;\n                        break;\n                    case ID_CODEC_DELAY:\n                        entry.codecDelay = readNumber(elem);\n                        break;\n                    case ID_SEEK_PRE_ROLL:\n                        entry.seekPreRoll = readNumber(elem);\n                        break;\n                    default:\n                        break;\n                }\n                ensure(elem);\n            }\n            if (!drop) {\n                trackEntries.add(entry);\n            }\n            ensure(elemTrackEntry);\n        }\n\n        final WebMTrack[] entries = trackEntries.toArray(new WebMTrack[0]);\n\n        for (final WebMTrack entry : entries) {\n            switch (entry.trackType) {\n                case 1:\n                    entry.kind = TrackKind.Video;\n                    break;\n                case 2:\n                    entry.kind = TrackKind.Audio;\n                    break;\n                default:\n                    entry.kind = TrackKind.Other;\n                    break;\n            }\n        }\n\n        return entries;\n    }\n\n    private SimpleBlock readSimpleBlock(final Element ref) throws IOException {\n        final SimpleBlock obj = new SimpleBlock(ref);\n        obj.trackNumber = readEncodedNumber();\n        obj.relativeTimeCode = stream.readShort();\n        obj.flags = (byte) stream.read();\n        obj.dataSize = (int) ((ref.offset + ref.size) - stream.position());\n        obj.createdFromBlock = ref.type == ID_BLOCK;\n\n        // NOTE: lacing is not implemented, and will be mixed with the stream data\n        if (obj.dataSize < 0) {\n            throw new IOException(String.format(\n                    \"Unexpected SimpleBlock element size, missing %s bytes\", -obj.dataSize));\n        }\n        return obj;\n    }\n\n    private Cluster readCluster(final Element ref) throws IOException {\n        final Cluster obj = new Cluster(ref);\n\n        final Element elem = untilElement(ref, ID_TIMECODE);\n        if (elem == null) {\n            throw new NoSuchElementException(\"Cluster at \" + ref.offset\n                    + \" without Timecode element\");\n        }\n        obj.timecode = readNumber(elem);\n\n        return obj;\n    }\n\n    static class Element {\n        int type;\n        long offset;\n        long contentSize;\n        long size;\n    }\n\n    public static class Info {\n        public long timecodeScale;\n        public long duration;\n    }\n\n    public static class WebMTrack {\n        public long trackNumber;\n        protected int trackType;\n        public String codecId;\n        public byte[] codecPrivate;\n        public byte[] bMetadata;\n        public TrackKind kind;\n        public long defaultDuration = -1;\n        public long codecDelay = -1;\n        public long seekPreRoll = -1;\n    }\n\n    public class Segment {\n        Segment(final Element ref) {\n            this.ref = ref;\n            this.firstClusterInSegment = true;\n        }\n\n        public Info info;\n        WebMTrack[] tracks;\n        private Element currentCluster;\n        private final Element ref;\n        boolean firstClusterInSegment;\n\n        public Cluster getNextCluster() throws IOException {\n            if (done) {\n                return null;\n            }\n            if (firstClusterInSegment && segment.currentCluster != null) {\n                firstClusterInSegment = false;\n                return readCluster(segment.currentCluster);\n            }\n            ensure(segment.currentCluster);\n\n            final Element elem = untilElement(segment.ref, ID_CLUSTER);\n            if (elem == null) {\n                return null;\n            }\n\n            segment.currentCluster = elem;\n\n            return readCluster(segment.currentCluster);\n        }\n    }\n\n    public static class SimpleBlock {\n        public InputStream data;\n        public boolean createdFromBlock;\n\n        SimpleBlock(final Element ref) {\n            this.ref = ref;\n        }\n\n        public long trackNumber;\n        public short relativeTimeCode;\n        public long absoluteTimeCodeNs;\n        public byte flags;\n        public int dataSize;\n        private final Element ref;\n\n        public boolean isKeyframe() {\n            return (flags & 0x80) == 0x80;\n        }\n    }\n\n    public class Cluster {\n        Element ref;\n        SimpleBlock currentSimpleBlock = null;\n        Element currentBlockGroup = null;\n        public long timecode;\n\n        Cluster(final Element ref) {\n            this.ref = ref;\n        }\n\n        boolean insideClusterBounds() {\n            return stream.position() >= (ref.offset + ref.size);\n        }\n\n        public SimpleBlock getNextSimpleBlock() throws IOException {\n            if (insideClusterBounds()) {\n                return null;\n            }\n\n            if (currentBlockGroup != null) {\n                ensure(currentBlockGroup);\n                currentBlockGroup = null;\n                currentSimpleBlock = null;\n            } else if (currentSimpleBlock != null) {\n                ensure(currentSimpleBlock.ref);\n            }\n\n            while (!insideClusterBounds()) {\n                Element elem = untilElement(ref, ID_SIMPLE_BLOCK, ID_GROUP_BLOCK);\n                if (elem == null) {\n                    return null;\n                }\n\n                if (elem.type == ID_GROUP_BLOCK) {\n                    currentBlockGroup = elem;\n                    elem = untilElement(currentBlockGroup, ID_BLOCK);\n\n                    if (elem == null) {\n                        ensure(currentBlockGroup);\n                        currentBlockGroup = null;\n                        continue;\n                    }\n                }\n\n                currentSimpleBlock = readSimpleBlock(elem);\n                if (currentSimpleBlock.trackNumber == tracks[selectedTrack].trackNumber) {\n                    currentSimpleBlock.data = stream.getView(currentSimpleBlock.dataSize);\n\n                    // calculate the timestamp in nanoseconds\n                    currentSimpleBlock.absoluteTimeCodeNs = currentSimpleBlock.relativeTimeCode\n                            + this.timecode;\n                    currentSimpleBlock.absoluteTimeCodeNs *= segment.info.timecodeScale;\n\n                    return currentSimpleBlock;\n                }\n\n                ensure(elem);\n            }\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/WebMWriter.java",
    "content": "package org.schabi.newpipe.streams;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.streams.WebMReader.Cluster;\nimport org.schabi.newpipe.streams.WebMReader.Segment;\nimport org.schabi.newpipe.streams.WebMReader.SimpleBlock;\nimport org.schabi.newpipe.streams.WebMReader.WebMTrack;\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.Closeable;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.nio.ByteBuffer;\nimport java.nio.charset.StandardCharsets;\nimport java.util.ArrayList;\n\n/**\n * @author kapodamy\n */\npublic class WebMWriter implements Closeable {\n    private static final int BUFFER_SIZE = 8 * 1024;\n    private static final int DEFAULT_TIMECODE_SCALE = 1000000;\n    private static final int INTERV = 100; // 100ms on 1000000us timecode scale\n    private static final int DEFAULT_CUES_EACH_MS = 5000; // 5000ms on 1000000us timecode scale\n    private static final byte CLUSTER_HEADER_SIZE = 8;\n    private static final int CUE_RESERVE_SIZE = 65535;\n    private static final byte MINIMUM_EBML_VOID_SIZE = 4;\n\n    private WebMReader.WebMTrack[] infoTracks;\n    private SharpStream[] sourceTracks;\n\n    private WebMReader[] readers;\n\n    private boolean done = false;\n    private boolean parsed = false;\n\n    private long written = 0;\n\n    private Segment[] readersSegment;\n    private Cluster[] readersCluster;\n\n    private ArrayList<ClusterInfo> clustersOffsetsSizes;\n\n    private byte[] outBuffer;\n    private ByteBuffer outByteBuffer;\n\n    public WebMWriter(final SharpStream... source) {\n        sourceTracks = source;\n        readers = new WebMReader[sourceTracks.length];\n        infoTracks = new WebMTrack[sourceTracks.length];\n        outBuffer = new byte[BUFFER_SIZE];\n        outByteBuffer = ByteBuffer.wrap(outBuffer);\n        clustersOffsetsSizes = new ArrayList<>(256);\n    }\n\n    public WebMTrack[] getTracksFromSource(final int sourceIndex) throws IllegalStateException {\n        if (done) {\n            throw new IllegalStateException(\"already done\");\n        }\n        if (!parsed) {\n            throw new IllegalStateException(\"All sources must be parsed first\");\n        }\n\n        return readers[sourceIndex].getAvailableTracks();\n    }\n\n    public void parseSources() throws IOException, IllegalStateException {\n        if (done) {\n            throw new IllegalStateException(\"already done\");\n        }\n        if (parsed) {\n            throw new IllegalStateException(\"already parsed\");\n        }\n\n        try {\n            for (int i = 0; i < readers.length; i++) {\n                readers[i] = new WebMReader(sourceTracks[i]);\n                readers[i].parse();\n            }\n\n        } finally {\n            parsed = true;\n        }\n    }\n\n    public void selectTracks(final int... trackIndex) throws IOException {\n        try {\n            readersSegment = new Segment[readers.length];\n            readersCluster = new Cluster[readers.length];\n\n            for (int i = 0; i < readers.length; i++) {\n                infoTracks[i] = readers[i].selectTrack(trackIndex[i]);\n                readersSegment[i] = readers[i].getNextSegment();\n            }\n        } finally {\n            parsed = true;\n        }\n    }\n\n    public boolean isDone() {\n        return done;\n    }\n\n    @Override\n    public void close() {\n        done = true;\n        parsed = true;\n\n        for (final SharpStream src : sourceTracks) {\n            src.close();\n        }\n\n        sourceTracks = null;\n        readers = null;\n        infoTracks = null;\n        readersSegment = null;\n        readersCluster = null;\n        outBuffer = null;\n        outByteBuffer = null;\n        clustersOffsetsSizes = null;\n    }\n\n    @SuppressWarnings(\"MethodLength\")\n    public void build(final SharpStream out) throws IOException, RuntimeException {\n        if (!out.canRewind()) {\n            throw new IOException(\"The output stream must be allow seek\");\n        }\n\n        makeEBML(out);\n\n        final long offsetSegmentSizeSet = written + 5;\n        final long offsetInfoDurationSet = written + 94;\n        final long offsetClusterSet = written + 58;\n        final long offsetCuesSet = written + 75;\n\n        final ArrayList<byte[]> listBuffer = new ArrayList<>(4);\n\n        /* segment */\n        listBuffer.add(new byte[]{\n                0x18, 0x53, (byte) 0x80, 0x67, 0x01,\n                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00// segment content size\n        });\n\n        final long segmentOffset = written + listBuffer.get(0).length;\n\n        /* seek head */\n        listBuffer.add(new byte[]{\n                0x11, 0x4d, (byte) 0x9b, 0x74, (byte) 0xbe,\n                0x4d, (byte) 0xbb, (byte) 0x8b,\n                0x53, (byte) 0xab, (byte) 0x84, 0x15, 0x49, (byte) 0xa9, 0x66, 0x53,\n                (byte) 0xac, (byte) 0x81,\n                /*info offset*/ 0x43,\n                0x4d, (byte) 0xbb, (byte) 0x8b, 0x53, (byte) 0xab,\n                (byte) 0x84, 0x16, 0x54, (byte) 0xae, 0x6b, 0x53, (byte) 0xac, (byte) 0x81,\n                /*tracks offset*/ 0x56,\n                0x4d, (byte) 0xbb, (byte) 0x8e, 0x53, (byte) 0xab, (byte) 0x84, 0x1f,\n                0x43, (byte) 0xb6, 0x75, 0x53, (byte) 0xac, (byte) 0x84,\n                /*cluster offset [2]*/ 0x00, 0x00, 0x00, 0x00,\n                0x4d, (byte) 0xbb, (byte) 0x8e, 0x53, (byte) 0xab, (byte) 0x84, 0x1c, 0x53,\n                (byte) 0xbb, 0x6b, 0x53, (byte) 0xac, (byte) 0x84,\n                /*cues offset [7]*/ 0x00, 0x00, 0x00, 0x00\n        });\n\n        /* info */\n        listBuffer.add(new byte[]{\n                0x15, 0x49, (byte) 0xa9, 0x66, (byte) 0x8e, 0x2a, (byte) 0xd7, (byte) 0xb1\n        });\n        // the segment duration MUST NOT exceed 4 bytes\n        listBuffer.add(encode(DEFAULT_TIMECODE_SCALE, true));\n        listBuffer.add(new byte[]{0x44, (byte) 0x89, (byte) 0x84,\n                0x00, 0x00, 0x00, 0x00, // info.duration\n        });\n\n        /* tracks */\n        listBuffer.addAll(makeTracks());\n\n        dump(listBuffer, out);\n\n        // reserve space for Cues element\n        final long cueOffset = written;\n        makeEbmlVoid(out, CUE_RESERVE_SIZE, true);\n\n        final int[] defaultSampleDuration = new int[infoTracks.length];\n        final long[] duration = new long[infoTracks.length];\n\n        for (int i = 0; i < infoTracks.length; i++) {\n            if (infoTracks[i].defaultDuration < 0) {\n                defaultSampleDuration[i] = -1; // not available\n            } else {\n                defaultSampleDuration[i] = (int) Math.ceil(infoTracks[i].defaultDuration\n                        / (float) DEFAULT_TIMECODE_SCALE);\n            }\n            duration[i] = -1;\n        }\n\n        // Select a track for the cue\n        final int cuesForTrackId = selectTrackForCue();\n        long nextCueTime = infoTracks[cuesForTrackId].trackType == 1 ? -1 : 0;\n        final ArrayList<KeyFrame> keyFrames = new ArrayList<>(32);\n\n        int firstClusterOffset = (int) written;\n        long currentClusterOffset = makeCluster(out, 0, 0, true);\n\n        long baseTimecode = 0;\n        long limitTimecode = -1;\n        int limitTimecodeByTrackId = cuesForTrackId;\n\n        int blockWritten = Integer.MAX_VALUE;\n\n        int newClusterByTrackId = -1;\n\n        while (blockWritten > 0) {\n            blockWritten = 0;\n            int i = 0;\n            while (i < readers.length) {\n                final Block bloq = getNextBlockFrom(i);\n                if (bloq == null) {\n                    i++;\n                    continue;\n                }\n\n                if (bloq.data == null) {\n                    blockWritten = 1; // fake block\n                    newClusterByTrackId = i;\n                    i++;\n                    continue;\n                }\n\n                if (newClusterByTrackId == i) {\n                    limitTimecodeByTrackId = i;\n                    newClusterByTrackId = -1;\n                    baseTimecode = bloq.absoluteTimecode;\n                    limitTimecode = baseTimecode + INTERV;\n                    currentClusterOffset = makeCluster(out, baseTimecode, currentClusterOffset,\n                            true);\n                }\n\n                if (cuesForTrackId == i) {\n                    if ((nextCueTime > -1 && bloq.absoluteTimecode >= nextCueTime)\n                            || (nextCueTime < 0 && bloq.isKeyframe())) {\n                        if (nextCueTime > -1) {\n                            nextCueTime += DEFAULT_CUES_EACH_MS;\n                        }\n                        keyFrames.add(new KeyFrame(segmentOffset, currentClusterOffset, written,\n                                bloq.absoluteTimecode));\n                    }\n                }\n\n                writeBlock(out, bloq, baseTimecode);\n                blockWritten++;\n\n                if (defaultSampleDuration[i] < 0 && duration[i] >= 0) {\n                    // if the sample duration in unknown,\n                    // calculate using current_duration - previous_duration\n                    defaultSampleDuration[i] = (int) (bloq.absoluteTimecode - duration[i]);\n                }\n                duration[i] = bloq.absoluteTimecode;\n\n                if (limitTimecode < 0) {\n                    limitTimecode = bloq.absoluteTimecode + INTERV;\n                    continue;\n                }\n\n                if (bloq.absoluteTimecode >= limitTimecode) {\n                    if (limitTimecodeByTrackId != i) {\n                        limitTimecode += INTERV - (bloq.absoluteTimecode - limitTimecode);\n                    }\n                    i++;\n                }\n            }\n        }\n\n        makeCluster(out, -1, currentClusterOffset, false);\n\n        final long segmentSize = written - offsetSegmentSizeSet - 7;\n\n        /* Segment size */\n        seekTo(out, offsetSegmentSizeSet);\n        outByteBuffer.putLong(0, segmentSize);\n        out.write(outBuffer, 1, DataReader.LONG_SIZE - 1);\n\n        /* Segment duration */\n        long longestDuration = 0;\n        for (int i = 0; i < duration.length; i++) {\n            if (defaultSampleDuration[i] > 0) {\n                duration[i] += defaultSampleDuration[i];\n            }\n            if (duration[i] > longestDuration) {\n                longestDuration = duration[i];\n            }\n        }\n        seekTo(out, offsetInfoDurationSet);\n        outByteBuffer.putFloat(0, longestDuration);\n        dump(outBuffer, DataReader.FLOAT_SIZE, out);\n\n        /* first Cluster offset */\n        firstClusterOffset -= segmentOffset;\n        writeInt(out, offsetClusterSet, firstClusterOffset);\n\n        seekTo(out, cueOffset);\n\n        /* Cue */\n        short cueSize = 0;\n        dump(new byte[]{0x1c, 0x53, (byte) 0xbb, 0x6b, 0x20, 0x00, 0x00}, out); // header size is 7\n\n        for (final KeyFrame keyFrame : keyFrames) {\n            final int size = makeCuePoint(cuesForTrackId, keyFrame, outBuffer);\n\n            if ((cueSize + size + 7 + MINIMUM_EBML_VOID_SIZE) > CUE_RESERVE_SIZE) {\n                break; // no space left\n            }\n\n            cueSize += size;\n            dump(outBuffer, size, out);\n        }\n\n        makeEbmlVoid(out, CUE_RESERVE_SIZE - cueSize - 7, false);\n\n        seekTo(out, cueOffset + 5);\n        outByteBuffer.putShort(0, cueSize);\n        dump(outBuffer, DataReader.SHORT_SIZE, out);\n\n        /* seek head, seek for cues element */\n        writeInt(out, offsetCuesSet, (int) (cueOffset - segmentOffset));\n\n        for (final ClusterInfo cluster : clustersOffsetsSizes) {\n            writeInt(out, cluster.offset, cluster.size | 0x10000000);\n        }\n    }\n\n    private Block getNextBlockFrom(final int internalTrackId) throws IOException {\n        if (readersSegment[internalTrackId] == null) {\n            readersSegment[internalTrackId] = readers[internalTrackId].getNextSegment();\n            if (readersSegment[internalTrackId] == null) {\n                return null; // no more blocks in the selected track\n            }\n        }\n\n        if (readersCluster[internalTrackId] == null) {\n            readersCluster[internalTrackId] = readersSegment[internalTrackId].getNextCluster();\n            if (readersCluster[internalTrackId] == null) {\n                readersSegment[internalTrackId] = null;\n                return getNextBlockFrom(internalTrackId);\n            }\n        }\n\n        final SimpleBlock res = readersCluster[internalTrackId].getNextSimpleBlock();\n        if (res == null) {\n            readersCluster[internalTrackId] = null;\n            return new Block(); // fake block to indicate the end of the cluster\n        }\n\n        final Block bloq = new Block();\n        bloq.data = res.data;\n        bloq.dataSize = res.dataSize;\n        bloq.trackNumber = internalTrackId;\n        bloq.flags = res.flags;\n        bloq.absoluteTimecode = res.absoluteTimeCodeNs / DEFAULT_TIMECODE_SCALE;\n\n        return bloq;\n    }\n\n    private void seekTo(final SharpStream stream, final long offset) throws IOException {\n        if (stream.canSeek()) {\n            stream.seek(offset);\n        } else {\n            if (offset > written) {\n                stream.skip(offset - written);\n            } else {\n                stream.rewind();\n                stream.skip(offset);\n            }\n        }\n\n        written = offset;\n    }\n\n    private void writeInt(final SharpStream stream, final long offset, final int number)\n            throws IOException {\n        seekTo(stream, offset);\n        outByteBuffer.putInt(0, number);\n        dump(outBuffer, DataReader.INTEGER_SIZE, stream);\n    }\n\n    private void writeBlock(final SharpStream stream, final Block bloq, final long clusterTimecode)\n            throws IOException {\n        final long relativeTimeCode = bloq.absoluteTimecode - clusterTimecode;\n\n        if (relativeTimeCode < Short.MIN_VALUE || relativeTimeCode > Short.MAX_VALUE) {\n            throw new IndexOutOfBoundsException(\"SimpleBlock timecode overflow.\");\n        }\n\n        final ArrayList<byte[]> listBuffer = new ArrayList<>(5);\n        listBuffer.add(new byte[]{(byte) 0xa3});\n        listBuffer.add(null); // block size\n        listBuffer.add(encode(bloq.trackNumber + 1, false));\n        listBuffer.add(ByteBuffer.allocate(DataReader.SHORT_SIZE).putShort((short) relativeTimeCode)\n                .array());\n        listBuffer.add(new byte[]{bloq.flags});\n\n        int blockSize = bloq.dataSize;\n        for (int i = 2; i < listBuffer.size(); i++) {\n            blockSize += listBuffer.get(i).length;\n        }\n        listBuffer.set(1, encode(blockSize, false));\n\n        dump(listBuffer, stream);\n\n        int read;\n        while ((read = bloq.data.read(outBuffer)) > 0) {\n            dump(outBuffer, read, stream);\n        }\n    }\n\n    private long makeCluster(final SharpStream stream, final long timecode, final long offsetStart,\n                             final boolean create) throws IOException {\n        ClusterInfo cluster;\n        long offset = offsetStart;\n\n        if (offset > 0) {\n            // save the size of the previous cluster (maximum 256 MiB)\n            cluster = clustersOffsetsSizes.get(clustersOffsetsSizes.size() - 1);\n            cluster.size = (int) (written - offset - CLUSTER_HEADER_SIZE);\n        }\n\n        offset = written;\n\n        if (create) {\n            /* cluster */\n            dump(new byte[]{0x1f, 0x43, (byte) 0xb6, 0x75}, stream);\n\n            cluster = new ClusterInfo();\n            cluster.offset = written;\n            clustersOffsetsSizes.add(cluster);\n\n            dump(new byte[]{\n                    0x10, 0x00, 0x00, 0x00,\n                    /* timestamp */\n                    (byte) 0xe7\n            }, stream);\n\n            dump(encode(timecode, true), stream);\n        }\n\n        return offset;\n    }\n\n    private void makeEBML(final SharpStream stream) throws IOException {\n        // default values\n        dump(new byte[]{\n                0x1A, 0x45, (byte) 0xDF, (byte) 0xA3, 0x01, 0x00, 0x00, 0x00,\n                0x00, 0x00, 0x00, 0x1F, 0x42, (byte) 0x86, (byte) 0x81, 0x01,\n                0x42, (byte) 0xF7, (byte) 0x81, 0x01, 0x42, (byte) 0xF2, (byte) 0x81, 0x04,\n                0x42, (byte) 0xF3, (byte) 0x81, 0x08, 0x42, (byte) 0x82, (byte) 0x84, 0x77,\n                0x65, 0x62, 0x6D, 0x42, (byte) 0x87, (byte) 0x81, 0x02,\n                0x42, (byte) 0x85, (byte) 0x81, 0x02\n        }, stream);\n    }\n\n    private ArrayList<byte[]> makeTracks() {\n        final ArrayList<byte[]> buffer = new ArrayList<>(1);\n        buffer.add(new byte[]{0x16, 0x54, (byte) 0xae, 0x6b});\n        buffer.add(null);\n\n        for (int i = 0; i < infoTracks.length; i++) {\n            buffer.addAll(makeTrackEntry(i, infoTracks[i]));\n        }\n\n        return lengthFor(buffer);\n    }\n\n    private ArrayList<byte[]> makeTrackEntry(final int internalTrackId, final WebMTrack track) {\n        final byte[] id = encode(internalTrackId + 1, true);\n        final ArrayList<byte[]> buffer = new ArrayList<>(12);\n\n        /* track */\n        buffer.add(new byte[]{(byte) 0xae});\n        buffer.add(null);\n\n        /* track number */\n        buffer.add(new byte[]{(byte) 0xd7});\n        buffer.add(id);\n\n        /* track uid */\n        buffer.add(new byte[]{0x73, (byte) 0xc5});\n        buffer.add(id);\n\n        /* flag lacing */\n        buffer.add(new byte[]{(byte) 0x9c, (byte) 0x81, 0x00});\n\n        /* lang */\n        buffer.add(new byte[]{0x22, (byte) 0xb5, (byte) 0x9c, (byte) 0x83, 0x75, 0x6e, 0x64});\n\n        /* codec id */\n        buffer.add(new byte[]{(byte) 0x86});\n        buffer.addAll(encode(track.codecId));\n\n        /* codec delay*/\n        if (track.codecDelay >= 0) {\n            buffer.add(new byte[]{0x56, (byte) 0xAA});\n            buffer.add(encode(track.codecDelay, true));\n        }\n\n        /* codec seek pre-roll*/\n        if (track.seekPreRoll >= 0) {\n            buffer.add(new byte[]{0x56, (byte) 0xBB});\n            buffer.add(encode(track.seekPreRoll, true));\n        }\n\n        /* type */\n        buffer.add(new byte[]{(byte) 0x83});\n        buffer.add(encode(track.trackType, true));\n\n        /* default duration */\n        if (track.defaultDuration >= 0) {\n            buffer.add(new byte[]{0x23, (byte) 0xe3, (byte) 0x83});\n            buffer.add(encode(track.defaultDuration, true));\n        }\n\n        /* audio/video */\n        if ((track.trackType == 1 || track.trackType == 2) && valid(track.bMetadata)) {\n            buffer.add(new byte[]{(byte) (track.trackType == 1 ? 0xe0 : 0xe1)});\n            buffer.add(encode(track.bMetadata.length, false));\n            buffer.add(track.bMetadata);\n        }\n\n        /* codec private*/\n        if (valid(track.codecPrivate)) {\n            buffer.add(new byte[]{0x63, (byte) 0xa2});\n            buffer.add(encode(track.codecPrivate.length, false));\n            buffer.add(track.codecPrivate);\n        }\n\n        return lengthFor(buffer);\n    }\n\n    private int makeCuePoint(final int internalTrackId, final KeyFrame keyFrame,\n                             final byte[] buffer) {\n        final ArrayList<byte[]> cue = new ArrayList<>(5);\n\n        /* CuePoint */\n        cue.add(new byte[]{(byte) 0xbb});\n        cue.add(null);\n\n        /* CueTime */\n        cue.add(new byte[]{(byte) 0xb3});\n        cue.add(encode(keyFrame.duration, true));\n\n        /* CueTrackPosition */\n        cue.addAll(makeCueTrackPosition(internalTrackId, keyFrame));\n\n        int size = 0;\n        lengthFor(cue);\n\n        for (final byte[] buff : cue) {\n            System.arraycopy(buff, 0, buffer, size, buff.length);\n            size += buff.length;\n        }\n\n        return size;\n    }\n\n    private ArrayList<byte[]> makeCueTrackPosition(final int internalTrackId,\n                                                   final KeyFrame keyFrame) {\n        final ArrayList<byte[]> buffer = new ArrayList<>(8);\n\n        /* CueTrackPositions */\n        buffer.add(new byte[]{(byte) 0xb7});\n        buffer.add(null);\n\n        /* CueTrack */\n        buffer.add(new byte[]{(byte) 0xf7});\n        buffer.add(encode(internalTrackId + 1, true));\n\n        /* CueClusterPosition */\n        buffer.add(new byte[]{(byte) 0xf1});\n        buffer.add(encode(keyFrame.clusterPosition, true));\n\n        /* CueRelativePosition */\n        if (keyFrame.relativePosition > 0) {\n            buffer.add(new byte[]{(byte) 0xf0});\n            buffer.add(encode(keyFrame.relativePosition, true));\n        }\n\n        return lengthFor(buffer);\n    }\n\n    private void makeEbmlVoid(final SharpStream out, final int amount, final boolean wipe)\n            throws IOException {\n        int size = amount;\n\n        /* ebml void */\n        outByteBuffer.putShort(0, (short) 0xec20);\n        outByteBuffer.putShort(2, (short) (size - 4));\n\n        dump(outBuffer, 4, out);\n\n        if (wipe) {\n            size -= 4;\n            while (size > 0) {\n                final int write = Math.min(size, outBuffer.length);\n                dump(outBuffer, write, out);\n                size -= write;\n            }\n        }\n    }\n\n    private void dump(final byte[] buffer, final SharpStream stream) throws IOException {\n        dump(buffer, buffer.length, stream);\n    }\n\n    private void dump(final byte[] buffer, final int count, final SharpStream stream)\n            throws IOException {\n        stream.write(buffer, 0, count);\n        written += count;\n    }\n\n    private void dump(final ArrayList<byte[]> buffers, final SharpStream stream)\n            throws IOException {\n        for (final byte[] buffer : buffers) {\n            stream.write(buffer);\n            written += buffer.length;\n        }\n    }\n\n    private ArrayList<byte[]> lengthFor(final ArrayList<byte[]> buffer) {\n        long size = 0;\n        for (int i = 2; i < buffer.size(); i++) {\n            size += buffer.get(i).length;\n        }\n        buffer.set(1, encode(size, false));\n        return buffer;\n    }\n\n    private byte[] encode(final long number, final boolean withLength) {\n        int length = -1;\n        for (int i = 1; i <= 7; i++) {\n            if (number < Math.pow(2, 7 * i)) {\n                length = i;\n                break;\n            }\n        }\n\n        if (length < 1) {\n            throw new ArithmeticException(\"Can't encode a number of bigger than 7 bytes\");\n        }\n\n        if (number == (Math.pow(2, 7 * length)) - 1) {\n            length++;\n        }\n\n        final int offset = withLength ? 1 : 0;\n        final byte[] buffer = new byte[offset + length];\n        final long marker = Math.floorDiv(length - 1, 8);\n\n        int shift = 0;\n        for (int i = length - 1; i >= 0; i--, shift += 8) {\n            long b = number >>> shift;\n            if (!withLength && i == marker) {\n                b = b | (0x80 >>> (length - 1));\n            }\n            buffer[offset + i] = (byte) b;\n        }\n\n        if (withLength) {\n            buffer[0] = (byte) (0x80 | length);\n        }\n\n        return buffer;\n    }\n\n    private ArrayList<byte[]> encode(final String value) {\n        final byte[] str = value.getBytes(StandardCharsets.UTF_8); // or use \"utf-8\"\n\n        final ArrayList<byte[]> buffer = new ArrayList<>(2);\n        buffer.add(encode(str.length, false));\n        buffer.add(str);\n\n        return buffer;\n    }\n\n    private boolean valid(final byte[] buffer) {\n        return buffer != null && buffer.length > 0;\n    }\n\n    private int selectTrackForCue() {\n        int i = 0;\n        int videoTracks = 0;\n        int audioTracks = 0;\n\n        for (; i < infoTracks.length; i++) {\n            switch (infoTracks[i].trackType) {\n                case 1:\n                    videoTracks++;\n                    break;\n                case 2:\n                    audioTracks++;\n                    break;\n            }\n        }\n\n        final int kind;\n        if (audioTracks == infoTracks.length) {\n            kind = 2;\n        } else if (videoTracks == infoTracks.length) {\n            kind = 1;\n        } else if (videoTracks > 0) {\n            kind = 1;\n        } else if (audioTracks > 0) {\n            kind = 2;\n        } else {\n            return 0;\n        }\n\n        // TODO: in the above code, find and select the shortest track for the desired kind\n        for (i = 0; i < infoTracks.length; i++) {\n            if (kind == infoTracks[i].trackType) {\n                return i;\n            }\n        }\n\n        return 0;\n    }\n\n    static class KeyFrame {\n        KeyFrame(final long segment, final long cluster, final long block, final long timecode) {\n            clusterPosition = cluster - segment;\n            relativePosition = (int) (block - cluster - CLUSTER_HEADER_SIZE);\n            duration = timecode;\n        }\n\n        final long clusterPosition;\n        final int relativePosition;\n        final long duration;\n    }\n\n    static class Block {\n        InputStream data;\n        int trackNumber;\n        byte flags;\n        int dataSize;\n        long absoluteTimecode;\n\n        boolean isKeyframe() {\n            return (flags & 0x80) == 0x80;\n        }\n\n        @NonNull\n        @Override\n        public String toString() {\n            return String.format(\"trackNumber=%s  isKeyFrame=%S  absoluteTimecode=%s\", trackNumber,\n                    isKeyframe(), absoluteTimecode);\n        }\n    }\n\n    static class ClusterInfo {\n        long offset;\n        int size;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/io/NoFileManagerSafeGuard.java",
    "content": "package org.schabi.newpipe.streams.io;\n\nimport android.content.ActivityNotFoundException;\nimport android.content.Context;\nimport android.os.Build;\nimport android.util.Log;\n\nimport androidx.activity.result.ActivityResultLauncher;\nimport androidx.appcompat.app.AlertDialog;\n\nimport org.schabi.newpipe.R;\n\n/**\n * Helper for when no file-manager/activity was found.\n */\npublic final class NoFileManagerSafeGuard {\n    private NoFileManagerSafeGuard() {\n        // No impl\n    }\n\n    /**\n     * Shows an alert dialog when no file-manager is found.\n     * @param context Context\n     */\n    private static void showActivityNotFoundAlert(final Context context) {\n        if (context == null) {\n            throw new IllegalArgumentException(\n                    \"Unable to open no file manager alert dialog: Context is null\");\n        }\n\n        final String message;\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n            // Android 10+ only allows SAF\n            message = context.getString(R.string.no_appropriate_file_manager_message_android_10);\n        } else {\n            message = context.getString(\n                    R.string.no_appropriate_file_manager_message,\n                    context.getString(R.string.downloads_storage_use_saf_title));\n        }\n\n\n        new AlertDialog.Builder(context)\n                .setTitle(R.string.no_app_to_open_intent)\n                .setMessage(message)\n                .setPositiveButton(R.string.ok, null)\n                .show();\n    }\n\n    /**\n     * Launches the file manager safely.\n     *\n     * If no file manager is found (which is normally only the case when the user uninstalled\n     * the default file manager or the OS lacks one) an alert dialog shows up, asking the user\n     * to fix the situation.\n     *\n     * @param activityResultLauncher see {@link ActivityResultLauncher#launch(Object)}\n     * @param input see {@link ActivityResultLauncher#launch(Object)}\n     * @param tag Tag used for logging\n     * @param context Context\n     * @param <I> see {@link ActivityResultLauncher#launch(Object)}\n     */\n    public static <I> void launchSafe(\n            final ActivityResultLauncher<I> activityResultLauncher,\n            final I input,\n            final String tag,\n            final Context context\n    ) {\n        try {\n            activityResultLauncher.launch(input);\n        } catch (final ActivityNotFoundException aex) {\n            Log.w(tag, \"Unable to launch file/directory picker\", aex);\n            NoFileManagerSafeGuard.showActivityNotFoundAlert(context);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/io/SharpInputStream.java",
    "content": "package org.schabi.newpipe.streams.io;\n\nimport androidx.annotation.NonNull;\n\nimport java.io.IOException;\nimport java.io.InputStream;\n\n/**\n * Simply wraps a readable {@link SharpStream} allowing it to be used with built-in Java stuff that\n * supports {@link InputStream}.\n */\npublic class SharpInputStream extends InputStream {\n    private final SharpStream stream;\n\n    public SharpInputStream(final SharpStream stream) throws IOException {\n        if (!stream.canRead()) {\n            throw new IOException(\"SharpStream is not readable\");\n        }\n        this.stream = stream;\n    }\n\n    @Override\n    public int read() throws IOException {\n        return stream.read();\n    }\n\n    @Override\n    public int read(@NonNull final byte[] b) throws IOException {\n        return stream.read(b);\n    }\n\n    @Override\n    public int read(@NonNull final byte[] b, final int off, final int len) throws IOException {\n        return stream.read(b, off, len);\n    }\n\n    @Override\n    public long skip(final long n) throws IOException {\n        return stream.skip(n);\n    }\n\n    @Override\n    public int available() {\n        final long res = stream.available();\n        return res > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) res;\n    }\n\n    @Override\n    public void close() {\n        stream.close();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/io/SharpOutputStream.java",
    "content": "package org.schabi.newpipe.streams.io;\n\nimport androidx.annotation.NonNull;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\n\n/**\n * Simply wraps a writable {@link SharpStream} allowing it to be used with built-in Java stuff that\n * supports {@link OutputStream}.\n */\npublic class SharpOutputStream extends OutputStream {\n    private final SharpStream stream;\n\n    public SharpOutputStream(final SharpStream stream) throws IOException {\n        if (!stream.canWrite()) {\n            throw new IOException(\"SharpStream is not writable\");\n        }\n        this.stream = stream;\n    }\n\n    @Override\n    public void write(final int b) throws IOException {\n        stream.write((byte) b);\n    }\n\n    @Override\n    public void write(@NonNull final byte[] b) throws IOException {\n        stream.write(b);\n    }\n\n    @Override\n    public void write(@NonNull final byte[] b, final int off, final int len) throws IOException {\n        stream.write(b, off, len);\n    }\n\n    @Override\n    public void flush() throws IOException {\n        stream.flush();\n    }\n\n    @Override\n    public void close() {\n        stream.close();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/io/SharpStream.java",
    "content": "package org.schabi.newpipe.streams.io;\n\nimport java.io.Closeable;\nimport java.io.Flushable;\nimport java.io.IOException;\n\n/**\n * Based on C#'s Stream class. SharpStream is a wrapper around the 2 different APIs for SAF\n * ({@link us.shandian.giga.io.FileStreamSAF}) and non-SAF ({@link us.shandian.giga.io.FileStream}).\n * It has both input and output like in C#, while in Java those are usually different classes.\n * {@link SharpInputStream} and {@link SharpOutputStream} are simple classes that wrap\n * {@link SharpStream} and extend respectively {@link java.io.InputStream} and\n * {@link java.io.OutputStream}, since unfortunately a class can only extend one class, so that a\n * sharp stream can be used with built-in Java stuff that supports {@link java.io.InputStream}\n * or {@link java.io.OutputStream}.\n */\npublic abstract class SharpStream implements Closeable, Flushable {\n    public abstract int read() throws IOException;\n\n    public abstract int read(byte[] buffer) throws IOException;\n\n    public abstract int read(byte[] buffer, int offset, int count) throws IOException;\n\n    public abstract long skip(long amount) throws IOException;\n\n    public abstract long available();\n\n    public abstract void rewind() throws IOException;\n\n    public abstract boolean isClosed();\n\n    @Override\n    public abstract void close();\n\n    public abstract boolean canRewind();\n\n    public abstract boolean canRead();\n\n    public abstract boolean canWrite();\n\n    public boolean canSetLength() {\n        return false;\n    }\n\n    public boolean canSeek() {\n        return false;\n    }\n\n    public abstract void write(byte value) throws IOException;\n\n    public abstract void write(byte[] buffer) throws IOException;\n\n    public abstract void write(byte[] buffer, int offset, int count) throws IOException;\n\n    public void flush() throws IOException {\n        // STUB\n    }\n\n    public void setLength(final long length) throws IOException {\n        throw new IOException(\"Not implemented\");\n    }\n\n    public void seek(final long offset) throws IOException {\n        throw new IOException(\"Not implemented\");\n    }\n\n    public long length() throws IOException {\n        throw new UnsupportedOperationException(\"Unsupported operation\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/io/StoredDirectoryHelper.java",
    "content": "package org.schabi.newpipe.streams.io;\n\nimport static android.provider.DocumentsContract.Document.COLUMN_DISPLAY_NAME;\nimport static android.provider.DocumentsContract.Root.COLUMN_DOCUMENT_ID;\nimport static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;\n\nimport android.content.ContentResolver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.os.ParcelFileDescriptor;\nimport android.provider.DocumentsContract;\nimport android.system.Os;\nimport android.system.StructStatVfs;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.documentfile.provider.DocumentFile;\n\nimport org.schabi.newpipe.settings.NewPipeSettings;\nimport org.schabi.newpipe.util.FilePickerActivityHelper;\n\nimport java.io.FileDescriptor;\nimport java.io.IOException;\nimport java.net.URI;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport java.util.stream.Stream;\n\npublic class StoredDirectoryHelper {\n    private static final String TAG = StoredDirectoryHelper.class.getSimpleName();\n    public static final int PERMISSION_FLAGS = Intent.FLAG_GRANT_READ_URI_PERMISSION\n            | Intent.FLAG_GRANT_WRITE_URI_PERMISSION;\n\n    private Path ioTree;\n    private DocumentFile docTree;\n\n    /**\n     * Context is `null` for non-SAF files, i.e. files that use `ioTree`.\n     */\n    @Nullable\n    private Context context;\n\n    private final String tag;\n\n    public StoredDirectoryHelper(@NonNull final Context context, @NonNull final Uri path,\n                                 final String tag) throws IOException {\n        this.tag = tag;\n\n        if (ContentResolver.SCHEME_FILE.equalsIgnoreCase(path.getScheme())) {\n            ioTree = Paths.get(URI.create(path.toString()));\n            return;\n        }\n\n        this.context = context;\n\n        try {\n            this.context.getContentResolver().takePersistableUriPermission(path, PERMISSION_FLAGS);\n        } catch (final Exception e) {\n            throw new IOException(e);\n        }\n\n        this.docTree = DocumentFile.fromTreeUri(context, path);\n\n        if (this.docTree == null) {\n            throw new IOException(\"Failed to create the tree from Uri\");\n        }\n    }\n\n    public StoredFileHelper createFile(final String filename, final String mime) {\n        return createFile(filename, mime, false);\n    }\n\n    public StoredFileHelper createUniqueFile(final String name, final String mime) {\n        final List<String> matches = new ArrayList<>();\n        final String[] filename = splitFilename(name);\n        final String lcFileName = filename[0].toLowerCase();\n\n        if (docTree == null) {\n            try (Stream<Path> stream = Files.list(ioTree)) {\n                matches.addAll(stream.map(path -> path.getFileName().toString().toLowerCase())\n                        .filter(fileName -> fileName.startsWith(lcFileName))\n                        .collect(Collectors.toList()));\n            } catch (final IOException e) {\n                Log.e(TAG, \"Exception while traversing \" + ioTree, e);\n            }\n        } else {\n            // warning: SAF file listing is very slow\n            final Uri docTreeChildren = DocumentsContract.buildChildDocumentsUriUsingTree(\n                    docTree.getUri(), DocumentsContract.getDocumentId(docTree.getUri()));\n\n            final String[] projection = new String[]{COLUMN_DISPLAY_NAME};\n            final String selection = \"(LOWER(\" + COLUMN_DISPLAY_NAME + \") LIKE ?%\";\n            final ContentResolver cr = context.getContentResolver();\n\n            try (Cursor cursor = cr.query(docTreeChildren, projection, selection,\n                    new String[]{lcFileName}, null)) {\n                if (cursor != null) {\n                    while (cursor.moveToNext()) {\n                        addIfStartWith(matches, lcFileName, cursor.getString(0));\n                    }\n                }\n            }\n        }\n\n        if (matches.isEmpty()) {\n            return createFile(name, mime, true);\n        }\n\n        // check if the filename is in use\n        String lcName = name.toLowerCase();\n        for (final String testName : matches) {\n            if (testName.equals(lcName)) {\n                lcName = null;\n                break;\n            }\n        }\n\n        // create file if filename not in use\n        if (lcName != null) {\n            return createFile(name, mime, true);\n        }\n\n        Collections.sort(matches, String::compareTo);\n\n        for (int i = 1; i < 1000; i++) {\n            if (Collections.binarySearch(matches, makeFileName(lcFileName, i, filename[1])) < 0) {\n                return createFile(makeFileName(filename[0], i, filename[1]), mime, true);\n            }\n        }\n\n        return createFile(String.valueOf(System.currentTimeMillis()).concat(filename[1]), mime,\n                false);\n    }\n\n    private StoredFileHelper createFile(final String filename, final String mime,\n                                        final boolean safe) {\n        final StoredFileHelper storage;\n\n        try {\n            if (docTree == null) {\n                storage = new StoredFileHelper(ioTree, filename, mime);\n            } else {\n                storage = new StoredFileHelper(context, docTree, filename, mime, safe);\n            }\n        } catch (final IOException e) {\n            return null;\n        }\n\n        storage.tag = tag;\n\n        return storage;\n    }\n\n    public Uri getUri() {\n        return docTree == null ? Uri.fromFile(ioTree.toFile()) : docTree.getUri();\n    }\n\n    public boolean exists() {\n        return docTree == null ? Files.exists(ioTree) : docTree.exists();\n    }\n\n    /**\n     * Indicates whether it's using the {@code java.io} API.\n     *\n     * @return {@code true} for Java I/O API, otherwise, {@code false} for Storage Access Framework\n     */\n    public boolean isDirect() {\n        return docTree == null;\n    }\n\n    /**\n     * Get free memory of the storage partition this file belongs to (root of the directory).\n     * See <a href=\"https://stackoverflow.com/q/31171838\">StackOverflow</a> and\n     * <a href=\"https://pubs.opengroup.org/onlinepubs/9699919799/functions/fstatvfs.html\">\n     *     {@code statvfs()} and {@code fstatvfs()} docs</a>\n     *\n     * @return amount of free memory in the volume of current directory (bytes), or {@link\n     * Long#MAX_VALUE} if an error occurred\n     */\n    public long getFreeStorageSpace() {\n        try {\n            final StructStatVfs stat;\n\n            if (ioTree != null) {\n                // non-SAF file, use statvfs with the path directly (also, `context` would be null\n                // for non-SAF files, so we wouldn't be able to call `getContentResolver` anyway)\n                stat = Os.statvfs(ioTree.toString());\n\n            } else {\n                // SAF file, we can't get a path directly, so obtain a file descriptor first\n                // and then use fstatvfs with the file descriptor\n                try (ParcelFileDescriptor parcelFileDescriptor =\n                             context.getContentResolver().openFileDescriptor(getUri(), \"r\")) {\n                    if (parcelFileDescriptor == null) {\n                        return Long.MAX_VALUE;\n                    }\n                    final FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();\n                    stat = Os.fstatvfs(fileDescriptor);\n                }\n            }\n\n            // this is the same formula used inside the FsStat class\n            return stat.f_bavail * stat.f_frsize;\n        } catch (final Throwable e) {\n            // ignore any error\n            Log.e(TAG, \"Could not get free storage space\", e);\n            return Long.MAX_VALUE;\n        }\n    }\n\n    /**\n     * Only using Java I/O. Creates the directory named by this abstract pathname, including any\n     * necessary but nonexistent parent directories.\n     * Note that if this operation fails it may have succeeded in creating some of the necessary\n     * parent directories.\n     *\n     * @return <code>true</code> if and only if the directory was created,\n     * along with all necessary parent directories or already exists; <code>false</code>\n     * otherwise\n     */\n    public boolean mkdirs() {\n        if (docTree == null) {\n            try {\n                Files.createDirectories(ioTree);\n            } catch (final IOException e) {\n                Log.e(TAG, \"Error while creating directories at \" + ioTree, e);\n            }\n            return Files.exists(ioTree);\n        }\n\n        if (docTree.exists()) {\n            return true;\n        }\n\n        try {\n            DocumentFile parent;\n            String child = docTree.getName();\n\n            while (true) {\n                parent = docTree.getParentFile();\n                if (parent == null || child == null) {\n                    break;\n                }\n                if (parent.exists()) {\n                    return true;\n                }\n\n                parent.createDirectory(child);\n\n                child = parent.getName(); // for the next iteration\n            }\n        } catch (final Exception ignored) {\n            // no more parent directories or unsupported by the storage provider\n        }\n\n        return false;\n    }\n\n    public String getTag() {\n        return tag;\n    }\n\n    public Uri findFile(final String filename) {\n        if (docTree == null) {\n            final Path res = ioTree.resolve(filename);\n            return Files.exists(res) ? Uri.fromFile(res.toFile()) : null;\n        }\n\n        final DocumentFile res = findFileSAFHelper(context, docTree, filename);\n        return res == null ? null : res.getUri();\n    }\n\n    public boolean canWrite() {\n        return docTree == null ? Files.isWritable(ioTree) : docTree.canWrite();\n    }\n\n    /**\n     * @return {@code false} if the storage is direct, or the SAF storage is valid; {@code true} if\n     * SAF access to this SAF storage is denied (e.g. the user clicked on {@code Android settings ->\n     * Apps & notifications -> NewPipe -> Storage & cache -> Clear access});\n     */\n    public boolean isInvalidSafStorage() {\n        return docTree != null && docTree.getName() == null;\n    }\n\n    @NonNull\n    @Override\n    public String toString() {\n        return (docTree == null ? Uri.fromFile(ioTree.toFile()) : docTree.getUri()).toString();\n    }\n\n    ////////////////////\n    //      Utils\n    ///////////////////\n\n    private static void addIfStartWith(final List<String> list, @NonNull final String base,\n                                       final String str) {\n        if (isNullOrEmpty(str)) {\n            return;\n        }\n        final String lowerStr = str.toLowerCase();\n        if (lowerStr.startsWith(base)) {\n            list.add(lowerStr);\n        }\n    }\n\n    /**\n     * Splits the filename into the name and extension.\n     *\n     * @param filename The filename to split\n     * @return A String array with the name at index 0 and extension at index 1\n     */\n    private static String[] splitFilename(@NonNull final String filename) {\n        final int dotIndex = filename.lastIndexOf('.');\n\n        if (dotIndex < 0 || (dotIndex == filename.length() - 1)) {\n            return new String[]{filename, \"\"};\n        }\n\n        return new String[]{filename.substring(0, dotIndex), filename.substring(dotIndex)};\n    }\n\n    private static String makeFileName(final String name, final int idx, final String ext) {\n        return name + \"(\" + idx + \")\" + ext;\n    }\n\n    /**\n     * Fast (but not enough) file/directory finder under the storage access framework.\n     *\n     * @param context  The context\n     * @param tree     Directory where search\n     * @param filename Target filename\n     * @return A {@link DocumentFile} contain the reference, otherwise, null\n     */\n    static DocumentFile findFileSAFHelper(@Nullable final Context context, final DocumentFile tree,\n                                          final String filename) {\n        if (context == null) {\n            return tree.findFile(filename); // warning: this is very slow\n        }\n\n        if (!tree.canRead()) {\n            return null; // missing read permission\n        }\n\n        final int name = 0;\n        final int documentId = 1;\n\n        // LOWER() SQL function is not supported\n        final String selection = COLUMN_DISPLAY_NAME + \" = ?\";\n        //final String selection = COLUMN_DISPLAY_NAME + \" LIKE ?%\";\n\n        final Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(tree.getUri(),\n                DocumentsContract.getDocumentId(tree.getUri()));\n        final String[] projection = {COLUMN_DISPLAY_NAME, COLUMN_DOCUMENT_ID};\n        final ContentResolver contentResolver = context.getContentResolver();\n\n        final String lowerFilename = filename.toLowerCase();\n\n        try (Cursor cursor = contentResolver.query(childrenUri, projection, selection,\n                new String[]{lowerFilename}, null)) {\n            if (cursor == null) {\n                return null;\n            }\n\n            while (cursor.moveToNext()) {\n                if (cursor.isNull(name)\n                        || !cursor.getString(name).toLowerCase().startsWith(lowerFilename)) {\n                    continue;\n                }\n\n                return DocumentFile.fromSingleUri(context,\n                        DocumentsContract.buildDocumentUriUsingTree(tree.getUri(),\n                                cursor.getString(documentId)));\n            }\n        }\n\n        return null;\n    }\n\n    public static Intent getPicker(final Context ctx) {\n        if (NewPipeSettings.useStorageAccessFramework(ctx)) {\n            return new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)\n                    .putExtra(\"android.content.extra.SHOW_ADVANCED\", true)\n                    .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION\n                            | StoredDirectoryHelper.PERMISSION_FLAGS);\n        } else {\n            return new Intent(ctx, FilePickerActivityHelper.class)\n                    .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_MULTIPLE, false)\n                    .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_CREATE_DIR, true)\n                    .putExtra(FilePickerActivityHelper.EXTRA_MODE,\n                            FilePickerActivityHelper.MODE_DIR);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/streams/io/StoredFileHelper.java",
    "content": "package org.schabi.newpipe.streams.io;\n\nimport android.content.ContentResolver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Environment;\nimport android.provider.DocumentsContract;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.documentfile.provider.DocumentFile;\n\nimport com.nononsenseapps.filepicker.Utils;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.settings.NewPipeSettings;\nimport org.schabi.newpipe.util.FilePickerActivityHelper;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.Serializable;\nimport java.net.URI;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.Paths;\n\nimport us.shandian.giga.io.FileStream;\nimport us.shandian.giga.io.FileStreamSAF;\n\npublic class StoredFileHelper implements Serializable {\n    private static final boolean DEBUG = MainActivity.DEBUG;\n    private static final String TAG = StoredFileHelper.class.getSimpleName();\n\n    private static final long serialVersionUID = 0L;\n    public static final String DEFAULT_MIME = \"application/octet-stream\";\n\n    private transient DocumentFile docFile;\n    private transient DocumentFile docTree;\n    private transient Path ioPath;\n    private transient Context context;\n\n    protected String source;\n    private String sourceTree;\n\n    protected String tag;\n\n    private String srcName;\n    private String srcType;\n\n    public StoredFileHelper(final Context context, final Uri uri, final String mime) {\n        if (FilePickerActivityHelper.isOwnFileUri(context, uri)) {\n            final File ioFile = Utils.getFileForUri(uri);\n            ioPath = ioFile.toPath();\n            source = Uri.fromFile(ioFile).toString();\n        } else {\n            docFile = DocumentFile.fromSingleUri(context, uri);\n            source = uri.toString();\n        }\n\n        this.context = context;\n        this.srcType = mime;\n    }\n\n    public StoredFileHelper(@Nullable final Uri parent, final String filename, final String mime,\n                            final String tag) {\n        this.source = null; // this instance will be \"invalid\" see invalidate()/isInvalid() methods\n\n        this.srcName = filename;\n        this.srcType = mime == null ? DEFAULT_MIME : mime;\n        if (parent != null) {\n            this.sourceTree = parent.toString();\n        }\n\n        this.tag = tag;\n    }\n\n    StoredFileHelper(@Nullable final Context context, final DocumentFile tree,\n                     final String filename, final String mime, final boolean safe)\n            throws IOException {\n        this.docTree = tree;\n        this.context = context;\n\n        final DocumentFile res;\n\n        if (safe) {\n            // no conflicts (the filename is not in use)\n            res = this.docTree.createFile(mime, filename);\n            if (res == null) {\n                throw new IOException(\"Cannot create the file\");\n            }\n        } else {\n            res = createSAF(context, mime, filename);\n        }\n\n        this.docFile = res;\n\n        this.source = docFile.getUri().toString();\n        this.sourceTree = docTree.getUri().toString();\n\n        this.srcName = this.docFile.getName();\n        this.srcType = this.docFile.getType();\n    }\n\n    StoredFileHelper(final Path location, final String filename, final String mime)\n            throws IOException {\n        ioPath = location.resolve(filename);\n\n        Files.deleteIfExists(ioPath);\n        Files.createFile(ioPath);\n\n        source = Uri.fromFile(ioPath.toFile()).toString();\n        sourceTree = Uri.fromFile(location.toFile()).toString();\n\n        srcName = ioPath.getFileName().toString();\n        srcType = mime;\n    }\n\n    public StoredFileHelper(final Context context, @Nullable final Uri parent,\n                            @NonNull final Uri path, final String tag) throws IOException {\n        this.tag = tag;\n        this.source = path.toString();\n\n        if (path.getScheme() == null\n                || path.getScheme().equalsIgnoreCase(ContentResolver.SCHEME_FILE)) {\n            this.ioPath = Paths.get(URI.create(this.source));\n        } else {\n            final DocumentFile file = DocumentFile.fromSingleUri(context, path);\n\n            if (file == null) {\n                throw new IOException(\"SAF not available\");\n            }\n\n            this.context = context;\n\n            if (file.getName() == null) {\n                this.source = null;\n                return;\n            } else {\n                this.docFile = file;\n                takePermissionSAF();\n            }\n        }\n\n        if (parent != null) {\n            if (!ContentResolver.SCHEME_FILE.equals(parent.getScheme())) {\n                this.docTree = DocumentFile.fromTreeUri(context, parent);\n            }\n\n            this.sourceTree = parent.toString();\n        }\n\n        this.srcName = getName();\n        this.srcType = getType();\n    }\n\n\n    public static StoredFileHelper deserialize(@NonNull final StoredFileHelper storage,\n                                               final Context context) throws IOException {\n        final Uri treeUri = storage.sourceTree == null ? null : Uri.parse(storage.sourceTree);\n\n        if (storage.isInvalid()) {\n            return new StoredFileHelper(treeUri, storage.srcName, storage.srcType, storage.tag);\n        }\n\n        final StoredFileHelper instance = new StoredFileHelper(context, treeUri,\n                Uri.parse(storage.source), storage.tag);\n\n        // under SAF, if the target document is deleted, conserve the filename and mime\n        if (instance.srcName == null) {\n            instance.srcName = storage.srcName;\n        }\n        if (instance.srcType == null) {\n            instance.srcType = storage.srcType;\n        }\n\n        return instance;\n    }\n\n    public SharpStream getStream() throws IOException {\n        assertValid();\n\n        if (docFile == null) {\n            return new FileStream(ioPath.toFile());\n        } else {\n            return new FileStreamSAF(context.getContentResolver(), docFile.getUri());\n        }\n    }\n\n    public SharpStream openAndTruncateStream() throws IOException {\n        final SharpStream sharpStream = getStream();\n        try {\n            sharpStream.setLength(0);\n        } catch (final Throwable e) {\n            // we can't use try-with-resources here, since we only want to close the stream if an\n            // exception occurs, but leave it open if everything goes well\n            sharpStream.close();\n            throw e;\n        }\n        return sharpStream;\n    }\n\n    /**\n     * Indicates whether it's using the {@code java.io} API.\n     *\n     * @return {@code true} for Java I/O API, otherwise, {@code false} for Storage Access Framework\n     */\n    public boolean isDirect() {\n        assertValid();\n\n        return docFile == null;\n    }\n\n    public boolean isInvalid() {\n        return source == null;\n    }\n\n    public Uri getUri() {\n        assertValid();\n\n        return docFile == null ? Uri.fromFile(ioPath.toFile()) : docFile.getUri();\n    }\n\n    public Uri getParentUri() {\n        assertValid();\n\n        return sourceTree == null ? null : Uri.parse(sourceTree);\n    }\n\n    public void truncate() throws IOException {\n        assertValid();\n\n        try (SharpStream fs = getStream()) {\n            fs.setLength(0);\n        }\n    }\n\n    public boolean delete() {\n        if (source == null) {\n            return true;\n        }\n        if (docFile == null) {\n            try {\n                return Files.deleteIfExists(ioPath);\n            } catch (final IOException e) {\n                Log.e(TAG, \"Exception while deleting \" + ioPath, e);\n                return false;\n            }\n        }\n\n        final boolean res = docFile.delete();\n\n        try {\n            final int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION\n                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION;\n            context.getContentResolver().releasePersistableUriPermission(docFile.getUri(), flags);\n        } catch (final Exception ex) {\n            // nothing to do\n        }\n\n        return res;\n    }\n\n    public long length() {\n        assertValid();\n\n        if (docFile == null) {\n            try {\n                return Files.size(ioPath);\n            } catch (final IOException e) {\n                Log.e(TAG, \"Exception while getting the size of \" + ioPath, e);\n                return 0;\n            }\n        } else {\n            return docFile.length();\n        }\n    }\n\n    public boolean canWrite() {\n        if (source == null) {\n            return false;\n        }\n        return docFile == null ? Files.isWritable(ioPath) : docFile.canWrite();\n    }\n\n    public String getName() {\n        if (source == null) {\n            return srcName;\n        } else if (docFile == null) {\n            return ioPath.getFileName().toString();\n        }\n\n        final String name = docFile.getName();\n        return name == null ? srcName : name;\n    }\n\n    public String getType() {\n        if (source == null || docFile == null) {\n            return srcType;\n        }\n\n        final String type = docFile.getType();\n        return type == null ? srcType : type;\n    }\n\n    public String getTag() {\n        return tag;\n    }\n\n    public boolean existsAsFile() {\n        if (source == null || (docFile == null && ioPath == null)) {\n            if (DEBUG) {\n                Log.d(TAG, \"existsAsFile called but something is null: source = [\"\n                        + (source == null ? \"null => storage is invalid\" : source)\n                        + \"], docFile = [\" + docFile + \"], ioPath = [\" + ioPath + \"]\");\n            }\n            return false;\n        }\n\n        // WARNING: DocumentFile.exists() and DocumentFile.isFile() methods are slow\n        // docFile.isVirtual() means it is non-physical?\n        return docFile == null\n                ? Files.isRegularFile(ioPath)\n                : (docFile.exists() && docFile.isFile());\n    }\n\n    public boolean create() {\n        assertValid();\n        final boolean result;\n\n        if (docFile == null) {\n            try {\n                Files.createFile(ioPath);\n                result = true;\n            } catch (final IOException e) {\n                Log.e(TAG, \"Exception while creating \" + ioPath, e);\n                return false;\n            }\n        } else if (docTree == null) {\n            result = false;\n        } else {\n            if (!docTree.canRead() || !docTree.canWrite()) {\n                return false;\n            }\n            try {\n                docFile = createSAF(context, srcType, srcName);\n                if (docFile.getName() == null) {\n                    return false;\n                }\n                result = true;\n            } catch (final IOException e) {\n                return false;\n            }\n        }\n\n        if (result) {\n            source = (docFile == null ? Uri.fromFile(ioPath.toFile()) : docFile.getUri())\n                    .toString();\n            srcName = getName();\n            srcType = getType();\n        }\n\n        return result;\n    }\n\n    public void invalidate() {\n        if (source == null) {\n            return;\n        }\n\n        srcName = getName();\n        srcType = getType();\n\n        source = null;\n\n        docTree = null;\n        docFile = null;\n        ioPath = null;\n        context = null;\n    }\n\n    public boolean equals(final StoredFileHelper storage) {\n        if (this == storage) {\n            return true;\n        }\n\n        // note: do not compare tags, files can have the same parent folder\n        //if (stringMismatch(this.tag, storage.tag)) return false;\n\n        if (stringMismatch(getLowerCase(this.sourceTree), getLowerCase(this.sourceTree))) {\n            return false;\n        }\n\n        if (this.isInvalid() || storage.isInvalid()) {\n            if (this.srcName == null || storage.srcName == null || this.srcType == null\n                    || storage.srcType == null) {\n                return false;\n            }\n\n            return this.srcName.equalsIgnoreCase(storage.srcName)\n                    && this.srcType.equalsIgnoreCase(storage.srcType);\n        }\n\n        if (this.isDirect() != storage.isDirect()) {\n            return false;\n        }\n\n        if (this.isDirect()) {\n            return this.ioPath.equals(storage.ioPath);\n        }\n\n        return DocumentsContract.getDocumentId(this.docFile.getUri())\n                .equalsIgnoreCase(DocumentsContract.getDocumentId(storage.docFile.getUri()));\n    }\n\n    @NonNull\n    @Override\n    public String toString() {\n        if (source == null) {\n            return \"[Invalid state] name=\" + srcName + \"  type=\" + srcType + \"  tag=\" + tag;\n        } else {\n            return \"sourceFile=\" + source + \"  treeSource=\" + (sourceTree == null ? \"\" : sourceTree)\n                    + \"  tag=\" + tag;\n        }\n    }\n\n\n    private void assertValid() {\n        if (source == null) {\n            throw new IllegalStateException(\"In invalid state\");\n        }\n    }\n\n    private void takePermissionSAF() throws IOException {\n        try {\n            context.getContentResolver().takePersistableUriPermission(docFile.getUri(),\n                    StoredDirectoryHelper.PERMISSION_FLAGS);\n        } catch (final Exception e) {\n            if (docFile.getName() == null) {\n                throw new IOException(e);\n            }\n        }\n    }\n\n    @NonNull\n    private DocumentFile createSAF(@Nullable final Context ctx, final String mime,\n                                   final String filename) throws IOException {\n        DocumentFile res = StoredDirectoryHelper.findFileSAFHelper(ctx, docTree, filename);\n\n        if (res != null && res.exists() && res.isDirectory()) {\n            if (!res.delete()) {\n                throw new IOException(\"Directory with the same name found but cannot delete\");\n            }\n            res = null;\n        }\n\n        if (res == null) {\n            res = this.docTree.createFile(srcType == null ? DEFAULT_MIME : mime, filename);\n            if (res == null) {\n                throw new IOException(\"Cannot create the file\");\n            }\n        }\n\n        return res;\n    }\n\n    private String getLowerCase(final String str) {\n        return str == null ? null : str.toLowerCase();\n    }\n\n    private boolean stringMismatch(final String str1, final String str2) {\n        if (str1 == null && str2 == null) {\n            return false;\n        }\n        if ((str1 == null) != (str2 == null)) {\n            return true;\n        }\n\n        return !str1.equals(str2);\n    }\n\n    public static Intent getPicker(@NonNull final Context ctx,\n                                   @NonNull final String mimeType) {\n        if (NewPipeSettings.useStorageAccessFramework(ctx)) {\n            return new Intent(Intent.ACTION_OPEN_DOCUMENT)\n                    .putExtra(\"android.content.extra.SHOW_ADVANCED\", true)\n                    .setType(mimeType)\n                    .addCategory(Intent.CATEGORY_OPENABLE)\n                    .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION\n                            | StoredDirectoryHelper.PERMISSION_FLAGS);\n        } else {\n            return new Intent(ctx, FilePickerActivityHelper.class)\n                    .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_MULTIPLE, false)\n                    .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_CREATE_DIR, true)\n                    .putExtra(FilePickerActivityHelper.EXTRA_SINGLE_CLICK, true)\n                    .putExtra(FilePickerActivityHelper.EXTRA_MODE,\n                            FilePickerActivityHelper.MODE_FILE);\n        }\n    }\n\n    public static Intent getPicker(@NonNull final Context ctx,\n                                   @NonNull final String mimeType,\n                                   @Nullable final Uri initialPath) {\n        return applyInitialPathToPickerIntent(ctx, getPicker(ctx, mimeType), initialPath, null);\n    }\n\n    public static Intent getNewPicker(@NonNull final Context ctx,\n                                      @Nullable final String filename,\n                                      @NonNull final String mimeType,\n                                      @Nullable final Uri initialPath) {\n        final Intent i;\n        if (NewPipeSettings.useStorageAccessFramework(ctx)) {\n            i = new Intent(Intent.ACTION_CREATE_DOCUMENT)\n                    .putExtra(\"android.content.extra.SHOW_ADVANCED\", true)\n                    .setType(mimeType)\n                    .addCategory(Intent.CATEGORY_OPENABLE)\n                    .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION\n                            | StoredDirectoryHelper.PERMISSION_FLAGS);\n            if (filename != null) {\n                i.putExtra(Intent.EXTRA_TITLE, filename);\n            }\n        } else {\n            i = new Intent(ctx, FilePickerActivityHelper.class)\n                    .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_MULTIPLE, false)\n                    .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_CREATE_DIR, true)\n                    .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_EXISTING_FILE, true)\n                    .putExtra(FilePickerActivityHelper.EXTRA_MODE,\n                            FilePickerActivityHelper.MODE_NEW_FILE);\n        }\n        return applyInitialPathToPickerIntent(ctx, i, initialPath, filename);\n    }\n\n    private static Intent applyInitialPathToPickerIntent(@NonNull final Context ctx,\n                                                         @NonNull final Intent intent,\n                                                         @Nullable final Uri initialPath,\n                                                         @Nullable final String filename) {\n\n        if (NewPipeSettings.useStorageAccessFramework(ctx)) {\n            if (initialPath == null) {\n                return intent; // nothing to do, no initial path provided\n            }\n\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n                return intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, initialPath);\n            } else {\n                return intent; // can't set initial path on API < 26\n            }\n\n        } else {\n            if (initialPath == null && filename == null) {\n                return intent; // nothing to do, no initial path and no file name provided\n            }\n\n            File file;\n            if (initialPath == null) {\n                // The only way to set the previewed filename in non-SAF FilePicker is to set a\n                // starting path ending with that filename. So when the initialPath is null but\n                // filename isn't just default to the external storage directory.\n                file = Environment.getExternalStorageDirectory();\n            } else {\n                try {\n                    file = Utils.getFileForUri(initialPath);\n                } catch (final Throwable ignored) {\n                    // getFileForUri() can't decode paths to 'storage', fallback to this\n                    file = new File(initialPath.toString());\n                }\n            }\n\n            // remove any filename at the end of the path (get the parent directory in that case)\n            if (!file.exists() || !file.isDirectory()) {\n                file = file.getParentFile();\n                if (file == null || !file.exists()) {\n                    // default to the external storage directory in case of an invalid path\n                    file = Environment.getExternalStorageDirectory();\n                }\n                // else: file is surely a directory\n            }\n\n            if (filename != null) {\n                // append a filename so that the non-SAF FilePicker shows it as the preview\n                file = new File(file, filename);\n            }\n\n            return intent\n                    .putExtra(FilePickerActivityHelper.EXTRA_START_PATH, file.getAbsolutePath());\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/AudioTrackAdapter.java",
    "content": "package org.schabi.newpipe.util;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.util.StreamItemAdapter.StreamInfoWrapper;\n\nimport java.io.Serializable;\nimport java.util.List;\nimport java.util.stream.Collectors;\n\n/**\n * A list adapter for groups of {@link AudioStream}s (audio tracks).\n */\npublic class AudioTrackAdapter extends BaseAdapter {\n    private final AudioTracksWrapper tracksWrapper;\n\n    public AudioTrackAdapter(final AudioTracksWrapper tracksWrapper) {\n        this.tracksWrapper = tracksWrapper;\n    }\n\n    @Override\n    public int getCount() {\n        return tracksWrapper.size();\n    }\n\n    @Override\n    public List<AudioStream> getItem(final int position) {\n        return tracksWrapper.getTracksList().get(position).getStreamsList();\n    }\n\n    @Override\n    public long getItemId(final int position) {\n        return position;\n    }\n\n    @Override\n    public View getView(final int position, final View convertView, final ViewGroup parent) {\n        final var context = parent.getContext();\n        final View view;\n        if (convertView == null) {\n            view = LayoutInflater.from(context).inflate(\n                    R.layout.stream_quality_item, parent, false);\n        } else {\n            view = convertView;\n        }\n\n        final ImageView woSoundIconView = view.findViewById(R.id.wo_sound_icon);\n        final TextView formatNameView = view.findViewById(R.id.stream_format_name);\n        final TextView qualityView = view.findViewById(R.id.stream_quality);\n        final TextView sizeView = view.findViewById(R.id.stream_size);\n\n        final List<AudioStream> streams = getItem(position);\n        final AudioStream stream = streams.get(0);\n\n        woSoundIconView.setVisibility(View.GONE);\n        sizeView.setVisibility(View.VISIBLE);\n\n        if (stream.getAudioTrackId() != null) {\n            formatNameView.setText(stream.getAudioTrackId());\n        }\n        qualityView.setText(Localization.audioTrackName(context, stream));\n\n        return view;\n    }\n\n    public static class AudioTracksWrapper implements Serializable {\n        private final List<StreamInfoWrapper<AudioStream>> tracksList;\n\n        public AudioTracksWrapper(@NonNull final List<List<AudioStream>> groupedAudioStreams,\n                                  @Nullable final Context context) {\n            this.tracksList = groupedAudioStreams.stream().map(streams ->\n                    new StreamInfoWrapper<>(streams, context)).collect(Collectors.toList());\n        }\n\n        public List<StreamInfoWrapper<AudioStream>> getTracksList() {\n            return tracksList;\n        }\n\n        public int size() {\n            return tracksList.size();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/BridgeStateSaverInitializer.java",
    "content": "package org.schabi.newpipe.util;\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.os.Parcelable;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.evernote.android.state.StateSaver;\nimport com.livefront.bridge.Bridge;\nimport com.livefront.bridge.SavedStateHandler;\nimport com.livefront.bridge.ViewSavedStateHandler;\n\n/**\n * Configures Bridge's state saver.\n */\npublic final class BridgeStateSaverInitializer {\n\n    public static void init(final Context context) {\n        Bridge.initialize(\n            context,\n            new SavedStateHandler() {\n                @Override\n                public void saveInstanceState(\n                    @NonNull final Object target,\n                    @NonNull final Bundle state) {\n                    StateSaver.saveInstanceState(target, state);\n                }\n\n                @Override\n                public void restoreInstanceState(\n                    @NonNull final Object target,\n                    @Nullable final Bundle state) {\n                    StateSaver.restoreInstanceState(target, state);\n                }\n            },\n            new ViewSavedStateHandler() {\n                @NonNull\n                @Override\n                public <T extends View> Parcelable saveInstanceState(\n                    @NonNull final T target,\n                    @Nullable final Parcelable parentState) {\n                    return StateSaver.saveInstanceState(target, parentState);\n                }\n\n                @Nullable\n                @Override\n                public <T extends View> Parcelable restoreInstanceState(\n                    @NonNull final T target,\n                    @Nullable final Parcelable state) {\n                    return StateSaver.restoreInstanceState(target, state);\n                }\n            }\n        );\n    }\n\n    private BridgeStateSaverInitializer() {\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/ChannelTabHelper.java",
    "content": "package org.schabi.newpipe.util;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\nimport androidx.annotation.StringRes;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.channel.tabs.ChannelTabs;\nimport org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;\n\nimport java.util.List;\nimport java.util.Set;\n\npublic final class ChannelTabHelper {\n    private ChannelTabHelper() {\n    }\n\n    /**\n     * @param tab the channel tab to check\n     * @return whether the tab should contain (playable) streams or not\n     */\n    public static boolean isStreamsTab(final String tab) {\n        switch (tab) {\n            case ChannelTabs.VIDEOS:\n            case ChannelTabs.TRACKS:\n            case ChannelTabs.LIKES:\n            case ChannelTabs.SHORTS:\n            case ChannelTabs.LIVESTREAMS:\n                return true;\n            default:\n                return false;\n        }\n    }\n\n    /**\n     * @param tab the channel tab link handler to check\n     * @return whether the tab should contain (playable) streams or not\n     */\n    public static boolean isStreamsTab(final ListLinkHandler tab) {\n        final List<String> contentFilters = tab.getContentFilters();\n        if (contentFilters.isEmpty()) {\n            return false; // this should never happen, but check just to be sure\n        } else {\n            return isStreamsTab(contentFilters.get(0));\n        }\n    }\n\n    @StringRes\n    private static int getShowTabKey(final String tab) {\n        switch (tab) {\n            case ChannelTabs.VIDEOS:\n                return R.string.show_channel_tabs_videos;\n            case ChannelTabs.TRACKS:\n                return R.string.show_channel_tabs_tracks;\n            case ChannelTabs.SHORTS:\n                return R.string.show_channel_tabs_shorts;\n            case ChannelTabs.LIVESTREAMS:\n                return R.string.show_channel_tabs_livestreams;\n            case ChannelTabs.CHANNELS:\n                return R.string.show_channel_tabs_channels;\n            case ChannelTabs.PLAYLISTS:\n                return R.string.show_channel_tabs_playlists;\n            case ChannelTabs.ALBUMS:\n                return R.string.show_channel_tabs_albums;\n            case ChannelTabs.LIKES:\n                return R.string.show_channel_tabs_likes;\n            default:\n                return -1;\n        }\n    }\n\n    @StringRes\n    private static int getFetchFeedTabKey(final String tab) {\n        switch (tab) {\n            case ChannelTabs.VIDEOS:\n                return R.string.fetch_channel_tabs_videos;\n            case ChannelTabs.TRACKS:\n                return R.string.fetch_channel_tabs_tracks;\n            case ChannelTabs.SHORTS:\n                return R.string.fetch_channel_tabs_shorts;\n            case ChannelTabs.LIVESTREAMS:\n                return R.string.fetch_channel_tabs_livestreams;\n            case ChannelTabs.LIKES:\n                return R.string.fetch_channel_tabs_likes;\n            default:\n                return -1;\n        }\n    }\n\n    @StringRes\n    public static int getTranslationKey(final String tab) {\n        switch (tab) {\n            case ChannelTabs.VIDEOS:\n                return R.string.channel_tab_videos;\n            case ChannelTabs.TRACKS:\n                return R.string.channel_tab_tracks;\n            case ChannelTabs.SHORTS:\n                return R.string.channel_tab_shorts;\n            case ChannelTabs.LIVESTREAMS:\n                return R.string.channel_tab_livestreams;\n            case ChannelTabs.CHANNELS:\n                return R.string.channel_tab_channels;\n            case ChannelTabs.PLAYLISTS:\n                return R.string.channel_tab_playlists;\n            case ChannelTabs.ALBUMS:\n                return R.string.channel_tab_albums;\n            case ChannelTabs.LIKES:\n                return R.string.channel_tab_likes;\n            default:\n                return R.string.unknown_content;\n        }\n    }\n\n    public static boolean showChannelTab(final Context context,\n                                         final SharedPreferences sharedPreferences,\n                                         @StringRes final int key) {\n        final Set<String> enabledTabs = sharedPreferences.getStringSet(\n                context.getString(R.string.show_channel_tabs_key), null);\n        if (enabledTabs == null) {\n            return true; // default to true\n        } else {\n            return enabledTabs.contains(context.getString(key));\n        }\n    }\n\n    public static boolean showChannelTab(final Context context,\n                                         final SharedPreferences sharedPreferences,\n                                         final String tab) {\n        final int key = ChannelTabHelper.getShowTabKey(tab);\n        if (key == -1) {\n            return false;\n        }\n        return showChannelTab(context, sharedPreferences, key);\n    }\n\n    public static boolean fetchFeedChannelTab(final Context context,\n                                              final SharedPreferences sharedPreferences,\n                                              final ListLinkHandler tab) {\n        final List<String> contentFilters = tab.getContentFilters();\n        if (contentFilters.isEmpty()) {\n            return false; // this should never happen, but check just to be sure\n        }\n\n        final int key = ChannelTabHelper.getFetchFeedTabKey(contentFilters.get(0));\n        if (key == -1) {\n            return false;\n        }\n\n        final Set<String> enabledTabs = sharedPreferences.getStringSet(\n                context.getString(R.string.feed_fetch_channel_tabs_key), null);\n        if (enabledTabs == null) {\n            return true; // default to true\n        } else {\n            return enabledTabs.contains(context.getString(key));\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/Constants.kt",
    "content": "@file:JvmName(\"Constants\")\n\npackage org.schabi.newpipe.util\n\n/**\n * Default duration when using throttle functions across the app, in milliseconds.\n */\nconst val DEFAULT_THROTTLE_TIMEOUT = 120L\n\nconst val KEY_SERVICE_ID = \"key_service_id\"\nconst val KEY_URL = \"key_url\"\nconst val KEY_TITLE = \"key_title\"\nconst val KEY_LINK_TYPE = \"key_link_type\"\nconst val KEY_OPEN_SEARCH = \"key_open_search\"\nconst val KEY_SEARCH_STRING = \"key_search_string\"\n\nconst val KEY_THEME_CHANGE = \"key_theme_change\"\nconst val KEY_MAIN_PAGE_CHANGE = \"key_main_page_change\"\n\nconst val NO_SERVICE_ID = -1\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/DependentPreferenceHelper.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2023-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.util\n\nimport android.content.Context\nimport androidx.preference.PreferenceManager\nimport org.schabi.newpipe.R\n\n/**\n * For preferences with dependencies and multiple use case,\n * this class can be used to reduce the lines of code.\n */\nobject DependentPreferenceHelper {\n    /**\n     * Option `Resume playback` depends on `Watch history`, this method can be used to retrieve if\n     * `Resume playback` and its dependencies are all enabled.\n     *\n     * @param context the Android context\n     * @return returns true if `Resume playback` and `Watch history` are both enabled\n     */\n    @JvmStatic\n    fun getResumePlaybackEnabled(context: Context): Boolean {\n        val prefs = PreferenceManager.getDefaultSharedPreferences(context)\n\n        return prefs.getBoolean(context.getString(R.string.enable_watch_history_key), true) &&\n            prefs.getBoolean(context.getString(R.string.enable_playback_resume_key), true)\n    }\n\n    /**\n     * Option `Position in lists` depends on `Watch history`, this method can be used to retrieve if\n     * `Position in lists` and its dependencies are all enabled.\n     *\n     * @param context the Android context\n     * @return returns true if `Positions in lists` and `Watch history` are both enabled\n     */\n    @JvmStatic\n    fun getPositionsInListsEnabled(context: Context): Boolean {\n        val prefs = PreferenceManager.getDefaultSharedPreferences(context)\n\n        return prefs.getBoolean(context.getString(R.string.enable_watch_history_key), true) &&\n            prefs.getBoolean(context.getString(R.string.enable_playback_state_lists_key), true)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java",
    "content": "package org.schabi.newpipe.util;\n\nimport static android.content.Context.INPUT_SERVICE;\n\nimport android.annotation.SuppressLint;\nimport android.app.UiModeManager;\nimport android.content.Context;\nimport android.content.pm.PackageManager;\nimport android.content.res.Configuration;\nimport android.graphics.Point;\nimport android.hardware.input.InputManager;\nimport android.os.BatteryManager;\nimport android.os.Build;\nimport android.provider.Settings;\nimport android.util.TypedValue;\nimport android.view.InputDevice;\nimport android.view.KeyEvent;\nimport android.view.WindowInsets;\nimport android.view.WindowManager;\nimport android.webkit.CookieManager;\n\nimport androidx.annotation.Dimension;\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.core.content.ContextCompat;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.App;\nimport org.schabi.newpipe.R;\n\nimport java.lang.reflect.Method;\n\npublic final class DeviceUtils {\n\n    private static final String AMAZON_FEATURE_FIRE_TV = \"amazon.hardware.fire_tv\";\n    private static final boolean SAMSUNG = Build.MANUFACTURER.equals(\"samsung\");\n    private static Boolean isTV = null;\n    private static Boolean isFireTV = null;\n\n    /**\n     * <p>The app version code that corresponds to the last update\n     * of the media tunneling device blacklist.</p>\n     * <p>The value of this variable needs to be updated everytime a new device that does not\n     * support media tunneling to match the <strong>upcoming</strong> version code.</p>\n     * @see #shouldSupportMediaTunneling()\n     */\n    public static final int MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION = 994;\n\n    // region: devices not supporting media tunneling / media tunneling blacklist\n    /**\n     * <p>Formuler Z8 Pro, Z8, CC, Z Alpha, Z+ Neo.</p>\n     * <p>Blacklist reason: black screen</p>\n     * <p>Board: HiSilicon Hi3798MV200</p>\n     */\n    private static final boolean HI3798MV200 = Build.VERSION.SDK_INT == 24\n            && Build.DEVICE.equals(\"Hi3798MV200\");\n    /**\n     * <p>Zephir TS43UHD-2.</p>\n     * <p>Blacklist reason: black screen</p>\n     */\n    private static final boolean CVT_MT5886_EU_1G = Build.VERSION.SDK_INT == 24\n            && Build.DEVICE.equals(\"cvt_mt5886_eu_1g\");\n    /**\n     * Hilife TV.\n     * <p>Blacklist reason: black screen</p>\n     */\n    private static final boolean REALTEKATV = Build.VERSION.SDK_INT == 25\n            && Build.DEVICE.equals(\"RealtekATV\");\n    /**\n     * <p>Phillips 4K (O)LED TV.</p>\n     * Supports custom ROMs with different API levels\n     */\n    private static final boolean PH7M_EU_5596 = Build.VERSION.SDK_INT >= 26\n            && Build.DEVICE.equals(\"PH7M_EU_5596\");\n    /**\n     * <p>Philips QM16XE.</p>\n     * <p>Blacklist reason: black screen</p>\n     */\n    private static final boolean QM16XE_U = Build.VERSION.SDK_INT == 23\n            && Build.DEVICE.equals(\"QM16XE_U\");\n    /**\n     * <p>Sony Bravia VH1.</p>\n     * <p>Processor: MT5895</p>\n     * <p>Blacklist reason: fullscreen crash / stuttering</p>\n     */\n    private static final boolean BRAVIA_VH1 = Build.VERSION.SDK_INT == 29\n            && Build.DEVICE.equals(\"BRAVIA_VH1\");\n    /**\n     * <p>Sony Bravia VH2.</p>\n     * <p>Blacklist reason: fullscreen crash; this includes model A90J as reported in\n     * <a href=\"https://github.com/TeamNewPipe/NewPipe/issues/9023#issuecomment-1387106242\">\n     * #9023</a></p>\n     */\n    private static final boolean BRAVIA_VH2 = Build.VERSION.SDK_INT == 29\n            && Build.DEVICE.equals(\"BRAVIA_VH2\");\n    /**\n     * <p>Sony Bravia Android TV platform 2.</p>\n     * Uses a MediaTek MT5891 (MT5596) SoC.\n     * @see <a href=\"https://github.com/CiNcH83/bravia_atv2\">\n     *     https://github.com/CiNcH83/bravia_atv2</a>\n     */\n    private static final boolean BRAVIA_ATV2 = Build.DEVICE.equals(\"BRAVIA_ATV2\");\n    /**\n     * <p>Sony Bravia Android TV platform 3 4K.</p>\n     * <p>Uses ARM MT5891 and a {@link #BRAVIA_ATV2} motherboard.</p>\n     *\n     * @see <a href=\"https://browser.geekbench.com/v4/cpu/9101105\">\n     *     https://browser.geekbench.com/v4/cpu/9101105</a>\n     */\n    private static final boolean BRAVIA_ATV3_4K = Build.DEVICE.equals(\"BRAVIA_ATV3_4K\");\n    /**\n     * <p>Panasonic 4KTV-JUP.</p>\n     * <p>Blacklist reason: fullscreen crash</p>\n     */\n    private static final boolean TX_50JXW834 = Build.DEVICE.equals(\"TX_50JXW834\");\n    /**\n     * <p>Bouygtel4K / Bouygues Telecom Bbox 4K.</p>\n     * <p>Blacklist reason: black screen; reported at\n     * <a href=\"https://github.com/TeamNewPipe/NewPipe/pull/10122#issuecomment-1638475769\">\n     *     #10122</a></p>\n     */\n    private static final boolean HMB9213NW = Build.DEVICE.equals(\"HMB9213NW\");\n    // endregion\n\n    private DeviceUtils() {\n    }\n\n    public static boolean isFireTv() {\n        if (isFireTV != null) {\n            return isFireTV;\n        }\n\n        isFireTV =\n                App.getInstance().getPackageManager().hasSystemFeature(AMAZON_FEATURE_FIRE_TV);\n        return isFireTV;\n    }\n\n    public static boolean isTv(final Context context) {\n        if (isTV != null) {\n            return isTV;\n        }\n\n        final PackageManager pm = App.getInstance().getPackageManager();\n\n        // from doc: https://developer.android.com/training/tv/start/hardware.html#runtime-check\n        boolean isTv = ContextCompat.getSystemService(context, UiModeManager.class)\n                .getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION\n                || isFireTv()\n                || pm.hasSystemFeature(PackageManager.FEATURE_LEANBACK);\n\n        // from https://stackoverflow.com/a/58932366\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n            final boolean isBatteryAbsent = context.getSystemService(BatteryManager.class)\n                    .getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) == 0;\n            isTv = isTv || (isBatteryAbsent\n                    && !pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)\n                    && pm.hasSystemFeature(PackageManager.FEATURE_USB_HOST)\n                    && pm.hasSystemFeature(PackageManager.FEATURE_ETHERNET));\n        }\n\n        DeviceUtils.isTV = isTv;\n        return DeviceUtils.isTV;\n    }\n\n    /**\n     * Checks if the device is in desktop or DeX mode. This function should only\n     * be invoked once on view load as it is using reflection for the DeX checks.\n     * @param context the context to use for services and config.\n     * @return true if the Android device is in desktop mode or using DeX.\n     */\n    @SuppressWarnings(\"JavaReflectionMemberAccess\")\n    public static boolean isDesktopMode(@NonNull final Context context) {\n        // Adapted from https://stackoverflow.com/a/64615568\n        // to check for all input devices that have an active cursor\n        final InputManager im = (InputManager) context.getSystemService(INPUT_SERVICE);\n        for (final int id : im.getInputDeviceIds()) {\n            final InputDevice inputDevice = im.getInputDevice(id);\n            if (inputDevice.supportsSource(InputDevice.SOURCE_BLUETOOTH_STYLUS)\n                    || inputDevice.supportsSource(InputDevice.SOURCE_MOUSE)\n                    || inputDevice.supportsSource(InputDevice.SOURCE_STYLUS)\n                    || inputDevice.supportsSource(InputDevice.SOURCE_TOUCHPAD)\n                    || inputDevice.supportsSource(InputDevice.SOURCE_TRACKBALL)) {\n                return true;\n            }\n        }\n\n        final UiModeManager uiModeManager =\n                ContextCompat.getSystemService(context, UiModeManager.class);\n        if (uiModeManager != null\n                && uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_DESK) {\n            return true;\n        }\n\n        if (!SAMSUNG) {\n            return false;\n            // DeX is Samsung-specific, skip the checks below on non-Samsung devices\n        }\n        // DeX check for standalone and multi-window mode, from:\n        // https://developer.samsung.com/samsung-dex/modify-optimizing.html\n        try {\n            final Configuration config = context.getResources().getConfiguration();\n            final Class<?> configClass = config.getClass();\n            final int semDesktopModeEnabledConst =\n                    configClass.getField(\"SEM_DESKTOP_MODE_ENABLED\").getInt(configClass);\n            final int currentMode =\n                    configClass.getField(\"semDesktopModeEnabled\").getInt(config);\n            if (semDesktopModeEnabledConst == currentMode) {\n                return true;\n            }\n        } catch (final NoSuchFieldException | IllegalAccessException ignored) {\n            // Device doesn't seem to support DeX\n        }\n\n        @SuppressLint(\"WrongConstant\") final Object desktopModeManager = context\n                .getApplicationContext()\n                .getSystemService(\"desktopmode\");\n\n        if (desktopModeManager != null) {\n            try {\n                final Method getDesktopModeStateMethod = desktopModeManager.getClass()\n                        .getDeclaredMethod(\"getDesktopModeState\");\n                final Object desktopModeState = getDesktopModeStateMethod\n                        .invoke(desktopModeManager);\n                final Class<?> desktopModeStateClass = desktopModeState.getClass();\n                final Method getEnabledMethod = desktopModeStateClass\n                        .getDeclaredMethod(\"getEnabled\");\n                final int enabledStatus = (int) getEnabledMethod.invoke(desktopModeState);\n                if (enabledStatus == desktopModeStateClass\n                        .getDeclaredField(\"ENABLED\").getInt(desktopModeStateClass)) {\n                    return true;\n                }\n            } catch (final Exception ignored) {\n                // Device does not support DeX 3.0 or something went wrong when trying to determine\n                // if it supports this feature\n            }\n        }\n\n        return false;\n    }\n\n    public static boolean isTablet(@NonNull final Context context) {\n        final String tabletModeSetting = PreferenceManager.getDefaultSharedPreferences(context)\n                .getString(context.getString(R.string.tablet_mode_key), \"\");\n\n        if (tabletModeSetting.equals(context.getString(R.string.tablet_mode_on_key))) {\n            return true;\n        } else if (tabletModeSetting.equals(context.getString(R.string.tablet_mode_off_key))) {\n            return false;\n        }\n\n        // else automatically determine whether we are in a tablet or not\n        return (context.getResources().getConfiguration().screenLayout\n                & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;\n    }\n\n    public static boolean isConfirmKey(final int keyCode) {\n        switch (keyCode) {\n            case KeyEvent.KEYCODE_DPAD_CENTER:\n            case KeyEvent.KEYCODE_ENTER:\n            case KeyEvent.KEYCODE_SPACE:\n            case KeyEvent.KEYCODE_NUMPAD_ENTER:\n                return true;\n            default:\n                return false;\n        }\n    }\n\n    public static int dpToPx(@Dimension(unit = Dimension.DP) final int dp,\n                             @NonNull final Context context) {\n        return (int) TypedValue.applyDimension(\n                TypedValue.COMPLEX_UNIT_DIP,\n                dp,\n                context.getResources().getDisplayMetrics());\n    }\n\n    public static int spToPx(@Dimension(unit = Dimension.SP) final int sp,\n                             @NonNull final Context context) {\n        return (int) TypedValue.applyDimension(\n                TypedValue.COMPLEX_UNIT_SP,\n                sp,\n                context.getResources().getDisplayMetrics());\n    }\n\n    public static boolean isLandscape(final Context context) {\n        return context.getResources().getDisplayMetrics().heightPixels < context.getResources()\n                .getDisplayMetrics().widthPixels;\n    }\n\n    public static boolean isInMultiWindow(final AppCompatActivity activity) {\n        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && activity.isInMultiWindowMode();\n    }\n\n    public static boolean hasAnimationsAnimatorDurationEnabled(final Context context) {\n        return Settings.System.getFloat(\n                context.getContentResolver(),\n                Settings.Global.ANIMATOR_DURATION_SCALE,\n                1F) != 0F;\n    }\n\n    public static int getWindowHeight(@NonNull final WindowManager windowManager) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {\n            final var windowMetrics = windowManager.getCurrentWindowMetrics();\n            final var windowInsets = windowMetrics.getWindowInsets();\n            final var insets = windowInsets.getInsetsIgnoringVisibility(\n                    WindowInsets.Type.navigationBars() | WindowInsets.Type.displayCutout());\n            return windowMetrics.getBounds().height() - (insets.top + insets.bottom);\n        } else {\n            final Point point = new Point();\n            windowManager.getDefaultDisplay().getSize(point);\n            return point.y;\n        }\n    }\n\n    /**\n     * <p>Some devices have broken tunneled video playback but claim to support it.</p>\n     * <p>This can cause a black video player surface while attempting to play a video or\n     * crashes while entering or exiting the full screen player.\n     * The issue effects Android TVs most commonly.\n     * See <a href=\"https://github.com/TeamNewPipe/NewPipe/issues/5911\">#5911</a> and\n     * <a href=\"https://github.com/TeamNewPipe/NewPipe/issues/9023\">#9023</a> for more info.</p>\n     * @Note Update {@link #MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION}\n     * when adding a new device to the method.\n     * @return {@code false} if affected device; {@code true} otherwise\n     */\n    public static boolean shouldSupportMediaTunneling() {\n        // Maintainers note: update MEDIA_TUNNELING_DEVICES_UPDATE_APP_VERSION_CODE\n        return !HI3798MV200\n                && !CVT_MT5886_EU_1G\n                && !REALTEKATV\n                && !QM16XE_U\n                && !BRAVIA_VH1\n                && !BRAVIA_VH2\n                && !BRAVIA_ATV2\n                && !BRAVIA_ATV3_4K\n                && !PH7M_EU_5596\n                && !TX_50JXW834\n                && !HMB9213NW;\n    }\n\n    /**\n     * @return whether the device has support for WebView, see\n     * <a href=\"https://stackoverflow.com/a/69626735\">https://stackoverflow.com/a/69626735</a>\n     */\n    public static boolean supportsWebView() {\n        try {\n            CookieManager.getInstance();\n            return true;\n        } catch (final Throwable ignored) {\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java",
    "content": "/*\n * Copyright 2017 Mauricio Colli <mauriciocolli@outlook.com>\n * ExtractorHelper.java is part of NewPipe\n *\n * License: GPL-3.0+\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\npackage org.schabi.newpipe.util;\n\nimport static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;\nimport static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.text.HtmlCompat;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.Info;\nimport org.schabi.newpipe.extractor.InfoItem;\nimport org.schabi.newpipe.extractor.ListExtractor.InfoItemsPage;\nimport org.schabi.newpipe.extractor.MetaInfo;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.Page;\nimport org.schabi.newpipe.extractor.channel.ChannelInfo;\nimport org.schabi.newpipe.extractor.channel.tabs.ChannelTabInfo;\nimport org.schabi.newpipe.extractor.comments.CommentsInfo;\nimport org.schabi.newpipe.extractor.comments.CommentsInfoItem;\nimport org.schabi.newpipe.extractor.kiosk.KioskInfo;\nimport org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;\nimport org.schabi.newpipe.extractor.playlist.PlaylistInfo;\nimport org.schabi.newpipe.extractor.search.SearchInfo;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.extractor.suggestion.SuggestionExtractor;\nimport org.schabi.newpipe.util.text.TextLinkifier;\n\nimport java.util.Collections;\nimport java.util.List;\n\nimport io.reactivex.rxjava3.core.Maybe;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\n\npublic final class ExtractorHelper {\n    private static final String TAG = ExtractorHelper.class.getSimpleName();\n    private static final InfoCache CACHE = InfoCache.getInstance();\n\n    private ExtractorHelper() {\n        //no instance\n    }\n\n    private static void checkServiceId(final int serviceId) {\n        if (serviceId == Constants.NO_SERVICE_ID) {\n            throw new IllegalArgumentException(\"serviceId is NO_SERVICE_ID\");\n        }\n    }\n\n    public static Single<SearchInfo> searchFor(final int serviceId, final String searchString,\n                                               final List<String> contentFilter,\n                                               final String sortFilter) {\n        checkServiceId(serviceId);\n        return Single.fromCallable(() ->\n                SearchInfo.getInfo(NewPipe.getService(serviceId),\n                        NewPipe.getService(serviceId)\n                                .getSearchQHFactory()\n                                .fromQuery(searchString, contentFilter, sortFilter)));\n    }\n\n    public static Single<InfoItemsPage<InfoItem>> getMoreSearchItems(\n            final int serviceId,\n            final String searchString,\n            final List<String> contentFilter,\n            final String sortFilter,\n            final Page page) {\n        checkServiceId(serviceId);\n        return Single.fromCallable(() ->\n                SearchInfo.getMoreItems(NewPipe.getService(serviceId),\n                        NewPipe.getService(serviceId)\n                                .getSearchQHFactory()\n                                .fromQuery(searchString, contentFilter, sortFilter), page));\n\n    }\n\n    public static Single<List<String>> suggestionsFor(final int serviceId, final String query) {\n        checkServiceId(serviceId);\n        return Single.fromCallable(() -> {\n            final SuggestionExtractor extractor = NewPipe.getService(serviceId)\n                    .getSuggestionExtractor();\n            return extractor != null\n                    ? extractor.suggestionList(query)\n                    : Collections.emptyList();\n        });\n    }\n\n    public static Single<StreamInfo> getStreamInfo(final int serviceId, final String url,\n                                                   final boolean forceLoad) {\n        checkServiceId(serviceId);\n        return checkCache(forceLoad, serviceId, url, InfoCache.Type.STREAM,\n                Single.fromCallable(() -> StreamInfo.getInfo(NewPipe.getService(serviceId), url)));\n    }\n\n    public static Single<ChannelInfo> getChannelInfo(final int serviceId, final String url,\n                                                     final boolean forceLoad) {\n        checkServiceId(serviceId);\n        return checkCache(forceLoad, serviceId, url, InfoCache.Type.CHANNEL,\n                Single.fromCallable(() ->\n                        ChannelInfo.getInfo(NewPipe.getService(serviceId), url)));\n    }\n\n    public static Single<ChannelTabInfo> getChannelTab(final int serviceId,\n                                                       final ListLinkHandler listLinkHandler,\n                                                       final boolean forceLoad) {\n        checkServiceId(serviceId);\n        return checkCache(forceLoad, serviceId,\n                listLinkHandler.getUrl(), InfoCache.Type.CHANNEL_TAB,\n                Single.fromCallable(() ->\n                        ChannelTabInfo.getInfo(NewPipe.getService(serviceId), listLinkHandler)));\n    }\n\n    public static Single<InfoItemsPage<InfoItem>> getMoreChannelTabItems(\n            final int serviceId,\n            final ListLinkHandler listLinkHandler,\n            final Page nextPage) {\n        checkServiceId(serviceId);\n        return Single.fromCallable(() ->\n                ChannelTabInfo.getMoreItems(NewPipe.getService(serviceId),\n                        listLinkHandler, nextPage));\n    }\n\n    public static Single<CommentsInfo> getCommentsInfo(final int serviceId,\n                                                       final String url,\n                                                       final boolean forceLoad) {\n        checkServiceId(serviceId);\n        return checkCache(forceLoad, serviceId, url, InfoCache.Type.COMMENTS,\n                Single.fromCallable(() ->\n                        CommentsInfo.getInfo(NewPipe.getService(serviceId), url)));\n    }\n\n    public static Single<InfoItemsPage<CommentsInfoItem>> getMoreCommentItems(\n            final int serviceId,\n            final CommentsInfo info,\n            final Page nextPage) {\n        checkServiceId(serviceId);\n        return Single.fromCallable(() ->\n                CommentsInfo.getMoreItems(NewPipe.getService(serviceId), info, nextPage));\n    }\n\n    public static Single<InfoItemsPage<CommentsInfoItem>> getMoreCommentItems(\n            final int serviceId,\n            final String url,\n            final Page nextPage) {\n        checkServiceId(serviceId);\n        return Single.fromCallable(() ->\n                CommentsInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage));\n    }\n\n    public static Single<PlaylistInfo> getPlaylistInfo(final int serviceId,\n                                                       final String url,\n                                                       final boolean forceLoad) {\n        checkServiceId(serviceId);\n        return checkCache(forceLoad, serviceId, url, InfoCache.Type.PLAYLIST,\n                Single.fromCallable(() ->\n                        PlaylistInfo.getInfo(NewPipe.getService(serviceId), url)));\n    }\n\n    public static Single<InfoItemsPage<StreamInfoItem>> getMorePlaylistItems(final int serviceId,\n                                                                             final String url,\n                                                                             final Page nextPage) {\n        checkServiceId(serviceId);\n        return Single.fromCallable(() ->\n                PlaylistInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage));\n    }\n\n    public static Single<KioskInfo> getKioskInfo(final int serviceId,\n                                                 final String url,\n                                                 final boolean forceLoad) {\n        return checkCache(forceLoad, serviceId, url, InfoCache.Type.KIOSK,\n                Single.fromCallable(() -> KioskInfo.getInfo(NewPipe.getService(serviceId), url)));\n    }\n\n    public static Single<InfoItemsPage<StreamInfoItem>> getMoreKioskItems(final int serviceId,\n                                                                          final String url,\n                                                                          final Page nextPage) {\n        return Single.fromCallable(() ->\n                KioskInfo.getMoreItems(NewPipe.getService(serviceId), url, nextPage));\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Cache\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * Check if we can load it from the cache (forceLoad parameter), if we can't,\n     * load from the network (Single loadFromNetwork)\n     * and put the results in the cache.\n     *\n     * @param <I>             the item type's class that extends {@link Info}\n     * @param forceLoad       whether to force loading from the network instead of from the cache\n     * @param serviceId       the service to load from\n     * @param url             the URL to load\n     * @param cacheType       the {@link InfoCache.Type} of the item\n     * @param loadFromNetwork the {@link Single} to load the item from the network\n     * @return a {@link Single} that loads the item\n     */\n    private static <I extends Info> Single<I> checkCache(final boolean forceLoad,\n                                                         final int serviceId,\n                                                         @NonNull final String url,\n                                                         @NonNull final InfoCache.Type cacheType,\n                                                         @NonNull final Single<I> loadFromNetwork) {\n        checkServiceId(serviceId);\n        final Single<I> actualLoadFromNetwork = loadFromNetwork\n                .doOnSuccess(info -> CACHE.putInfo(serviceId, url, info, cacheType));\n\n        final Single<I> load;\n        if (forceLoad) {\n            CACHE.removeInfo(serviceId, url, cacheType);\n            load = actualLoadFromNetwork;\n        } else {\n            load = Maybe.concat(ExtractorHelper.loadFromCache(serviceId, url, cacheType),\n                            actualLoadFromNetwork.toMaybe())\n                    .firstElement() // Take the first valid\n                    .toSingle();\n        }\n\n        return load;\n    }\n\n    /**\n     * Default implementation uses the {@link InfoCache} to get cached results.\n     *\n     * @param <I>       the item type's class that extends {@link Info}\n     * @param serviceId the service to load from\n     * @param url       the URL to load\n     * @param cacheType the {@link InfoCache.Type} of the item\n     * @return a {@link Single} that loads the item\n     */\n    private static <I extends Info> Maybe<I> loadFromCache(\n            final int serviceId,\n            @NonNull final String url,\n            @NonNull final InfoCache.Type cacheType) {\n        checkServiceId(serviceId);\n        return Maybe.defer(() -> {\n            //noinspection unchecked\n            final I info = (I) CACHE.getFromKey(serviceId, url, cacheType);\n            if (MainActivity.DEBUG) {\n                Log.d(TAG, \"loadFromCache() called, info > \" + info);\n            }\n\n            // Only return info if it's not null (it is cached)\n            if (info != null) {\n                return Maybe.just(info);\n            }\n\n            return Maybe.empty();\n        });\n    }\n\n    public static boolean isCached(final int serviceId,\n                                   @NonNull final String url,\n                                   @NonNull final InfoCache.Type cacheType) {\n        return null != loadFromCache(serviceId, url, cacheType).blockingGet();\n    }\n\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * Formats the text contained in the meta info list as HTML and puts it into the text view,\n     * while also making the separator visible. If the list is null or empty, or the user chose not\n     * to see meta information, both the text view and the separator are hidden\n     *\n     * @param metaInfos         a list of meta information, can be null or empty\n     * @param metaInfoTextView  the text view in which to show the formatted HTML\n     * @param metaInfoSeparator another view to be shown or hidden accordingly to the text view\n     * @param disposables       disposables created by the method are added here and their lifecycle\n     *                          should be handled by the calling class\n     */\n    public static void showMetaInfoInTextView(@Nullable final List<MetaInfo> metaInfos,\n                                              final TextView metaInfoTextView,\n                                              final View metaInfoSeparator,\n                                              final CompositeDisposable disposables) {\n        final Context context = metaInfoTextView.getContext();\n        if (metaInfos == null || metaInfos.isEmpty()\n                || !PreferenceManager.getDefaultSharedPreferences(context).getBoolean(\n                context.getString(R.string.show_meta_info_key), true)) {\n            metaInfoTextView.setVisibility(View.GONE);\n            metaInfoSeparator.setVisibility(View.GONE);\n\n        } else {\n            final StringBuilder stringBuilder = new StringBuilder();\n            for (final MetaInfo metaInfo : metaInfos) {\n                if (!isNullOrEmpty(metaInfo.getTitle())) {\n                    stringBuilder.append(\"<b>\").append(metaInfo.getTitle()).append(\"</b>\")\n                            .append(Localization.DOT_SEPARATOR);\n                }\n\n                String content = metaInfo.getContent().getContent().trim();\n                if (content.endsWith(\".\")) {\n                    content = content.substring(0, content.length() - 1); // remove . at end\n                }\n                stringBuilder.append(content);\n\n                for (int i = 0; i < metaInfo.getUrls().size(); i++) {\n                    if (i == 0) {\n                        stringBuilder.append(Localization.DOT_SEPARATOR);\n                    } else {\n                        stringBuilder.append(\"<br/><br/>\");\n                    }\n\n                    stringBuilder\n                            .append(\"<a href=\\\"\").append(metaInfo.getUrls().get(i)).append(\"\\\">\")\n                            .append(capitalizeIfAllUppercase(metaInfo.getUrlTexts().get(i).trim()))\n                            .append(\"</a>\");\n                }\n            }\n\n            metaInfoSeparator.setVisibility(View.VISIBLE);\n            TextLinkifier.fromHtml(metaInfoTextView, stringBuilder.toString(),\n                    HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING, null, null, disposables,\n                    SET_LINK_MOVEMENT_METHOD);\n        }\n    }\n\n    private static String capitalizeIfAllUppercase(final String text) {\n        for (int i = 0; i < text.length(); i++) {\n            if (Character.isLowerCase(text.charAt(i))) {\n                return text; // there is at least a lowercase letter -> not all uppercase\n            }\n        }\n\n        if (text.isEmpty()) {\n            return text;\n        } else {\n            return text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/FallbackViewHolder.java",
    "content": "package org.schabi.newpipe.util;\n\nimport android.view.View;\n\nimport androidx.recyclerview.widget.RecyclerView;\n\npublic class FallbackViewHolder extends RecyclerView.ViewHolder {\n    public FallbackViewHolder(final View itemView) {\n        super(itemView);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/FilePickerActivityHelper.java",
    "content": "package org.schabi.newpipe.util;\n\nimport android.content.Context;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Environment;\nimport android.util.TypedValue;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.loader.content.Loader;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.recyclerview.widget.SortedList;\n\nimport com.nononsenseapps.filepicker.AbstractFilePickerFragment;\nimport com.nononsenseapps.filepicker.FilePickerFragment;\n\nimport org.schabi.newpipe.R;\n\nimport java.io.File;\n\npublic class FilePickerActivityHelper extends com.nononsenseapps.filepicker.FilePickerActivity {\n    private CustomFilePickerFragment currentFragment;\n\n    public static boolean isOwnFileUri(@NonNull final Context context, @NonNull final Uri uri) {\n        if (uri.getAuthority() == null) {\n            return false;\n        }\n        return uri.getAuthority().startsWith(context.getPackageName());\n    }\n\n    @Override\n    public void onCreate(final Bundle savedInstanceState) {\n        if (ThemeHelper.isLightThemeSelected(this)) {\n            this.setTheme(R.style.FilePickerThemeLight);\n        } else {\n            this.setTheme(R.style.FilePickerThemeDark);\n        }\n        super.onCreate(savedInstanceState);\n    }\n\n    @Override\n    public void onBackPressed() {\n        // If at top most level, normal behaviour\n        if (currentFragment.isBackTop()) {\n            super.onBackPressed();\n        } else {\n            // Else go up\n            currentFragment.goUp();\n        }\n    }\n\n    @Override\n    protected AbstractFilePickerFragment<File> getFragment(@Nullable final String startPath,\n                                                           final int mode,\n                                                           final boolean allowMultiple,\n                                                           final boolean allowCreateDir,\n                                                           final boolean allowExistingFile,\n                                                           final boolean singleClick) {\n        final CustomFilePickerFragment fragment = new CustomFilePickerFragment();\n        fragment.setArgs(startPath != null ? startPath\n                        : Environment.getExternalStorageDirectory().getPath(),\n                mode, allowMultiple, allowCreateDir, allowExistingFile, singleClick);\n        currentFragment = fragment;\n        return currentFragment;\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Internal\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public static class CustomFilePickerFragment extends FilePickerFragment {\n        @Override\n        public View onCreateView(@NonNull final LayoutInflater inflater, final ViewGroup container,\n                                 final Bundle savedInstanceState) {\n            return super.onCreateView(inflater, container, savedInstanceState);\n        }\n\n        @NonNull\n        @Override\n        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent,\n                                                          final int viewType) {\n            final RecyclerView.ViewHolder viewHolder = super.onCreateViewHolder(parent, viewType);\n\n            final View view = viewHolder.itemView.findViewById(android.R.id.text1);\n            if (view instanceof TextView) {\n                ((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_PX,\n                        getResources().getDimension(R.dimen.file_picker_items_text_size));\n            }\n\n            return viewHolder;\n        }\n\n        @Override\n        public void onClickOk(@NonNull final View view) {\n            if (mode == MODE_NEW_FILE && getNewFileName().isEmpty()) {\n                if (mToast != null) {\n                    mToast.cancel();\n                }\n                mToast = Toast.makeText(getActivity(), R.string.file_name_empty_error,\n                        Toast.LENGTH_SHORT);\n                mToast.show();\n                return;\n            }\n\n            super.onClickOk(view);\n        }\n\n        @Override\n        protected boolean isItemVisible(@NonNull final File file) {\n            if (file.isDirectory() && file.isHidden()) {\n                return true;\n            }\n            return super.isItemVisible(file);\n        }\n\n        public File getBackTop() {\n            if (getArguments() == null) {\n                return Environment.getExternalStorageDirectory();\n            }\n\n            final String path = getArguments().getString(KEY_START_PATH, \"/\");\n            if (path.contains(Environment.getExternalStorageDirectory().getPath())) {\n                return Environment.getExternalStorageDirectory();\n            }\n\n            return getPath(path);\n        }\n\n        public boolean isBackTop() {\n            return compareFiles(mCurrentPath,\n                    getBackTop()) == 0 || compareFiles(mCurrentPath, new File(\"/\")) == 0;\n        }\n\n        @Override\n        public void onLoadFinished(@NonNull final Loader<SortedList<File>> loader,\n                                   final SortedList<File> data) {\n            super.onLoadFinished(loader, data);\n            layoutManager.scrollToPosition(0);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/FilenameUtils.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.util\n\nimport android.content.Context\nimport androidx.preference.PreferenceManager\nimport java.util.regex.Matcher\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.ktx.getStringSafe\n\nobject FilenameUtils {\n    private const val CHARSET_MOST_SPECIAL = \"[\\\\n\\\\r|?*<\\\":\\\\\\\\>/']+\"\n    private const val CHARSET_ONLY_LETTERS_AND_DIGITS = \"[^\\\\w\\\\d]+\"\n\n    /**\n     * #143 #44 #42 #22: make sure that the filename does not contain illegal chars.\n     *\n     * @param context the context to retrieve strings and preferences from\n     * @param title the title to create a filename from\n     * @return the filename\n     */\n    @JvmStatic\n    fun createFilename(context: Context, title: String): String {\n        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)\n\n        val charsetLd = context.getString(R.string.charset_letters_and_digits_value)\n        val charsetMs = context.getString(R.string.charset_most_special_value)\n        val defaultCharset = context.getString(R.string.default_file_charset_value)\n\n        val replacementChar = sharedPreferences.getStringSafe(\n            context.getString(R.string.settings_file_replacement_character_key),\n            \"_\"\n        )\n        val selectedCharset = sharedPreferences.getStringSafe(\n            context.getString(R.string.settings_file_charset_key),\n            \"\"\n        ).ifEmpty { defaultCharset }\n\n        val charset = when (selectedCharset) {\n            charsetLd -> CHARSET_ONLY_LETTERS_AND_DIGITS\n            charsetMs -> CHARSET_MOST_SPECIAL\n            else -> selectedCharset // Is the user using a custom charset?\n        }\n\n        return createFilename(title, charset, Matcher.quoteReplacement(replacementChar))\n    }\n\n    /**\n     * Create a valid filename.\n     *\n     * @param title the title to create a filename from\n     * @param invalidCharacters patter matching invalid characters\n     * @param replacementChar the replacement\n     * @return the filename\n     */\n    private fun createFilename(\n        title: String,\n        invalidCharacters: String,\n        replacementChar: String\n    ): String {\n        return title.replace(invalidCharacters.toRegex(), replacementChar)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/InfoCache.java",
    "content": "/*\n * Copyright 2017 Mauricio Colli <mauriciocolli@outlook.com>\n * InfoCache.java is part of NewPipe\n *\n * License: GPL-3.0+\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\npackage org.schabi.newpipe.util;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.collection.LruCache;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.extractor.Info;\n\nimport java.util.Map;\n\npublic final class InfoCache {\n    private final String TAG = getClass().getSimpleName();\n    private static final boolean DEBUG = MainActivity.DEBUG;\n\n    private static final InfoCache INSTANCE = new InfoCache();\n    private static final int MAX_ITEMS_ON_CACHE = 60;\n    /**\n     * Trim the cache to this size.\n     */\n    private static final int TRIM_CACHE_TO = 30;\n\n    private static final LruCache<String, CacheData> LRU_CACHE = new LruCache<>(MAX_ITEMS_ON_CACHE);\n\n    private InfoCache() {\n        // no instance\n    }\n\n    /**\n     * Identifies the type of {@link Info} to put into the cache.\n     */\n    public enum Type {\n        STREAM,\n        CHANNEL,\n        CHANNEL_TAB,\n        COMMENTS,\n        PLAYLIST,\n        KIOSK,\n    }\n\n    public static InfoCache getInstance() {\n        return INSTANCE;\n    }\n\n    @NonNull\n    private static String keyOf(final int serviceId,\n                                @NonNull final String url,\n                                @NonNull final Type cacheType) {\n        return serviceId + \":\" + cacheType.ordinal() + \":\" + url;\n    }\n\n    private static void removeStaleCache() {\n        for (final Map.Entry<String, CacheData> entry : InfoCache.LRU_CACHE.snapshot().entrySet()) {\n            final CacheData data = entry.getValue();\n            if (data != null && data.isExpired()) {\n                InfoCache.LRU_CACHE.remove(entry.getKey());\n            }\n        }\n    }\n\n    @Nullable\n    private static Info getInfo(@NonNull final String key) {\n        final CacheData data = InfoCache.LRU_CACHE.get(key);\n        if (data == null) {\n            return null;\n        }\n\n        if (data.isExpired()) {\n            InfoCache.LRU_CACHE.remove(key);\n            return null;\n        }\n\n        return data.info;\n    }\n\n    @Nullable\n    public Info getFromKey(final int serviceId,\n                           @NonNull final String url,\n                           @NonNull final Type cacheType) {\n        if (DEBUG) {\n            Log.d(TAG, \"getFromKey() called with: \"\n                    + \"serviceId = [\" + serviceId + \"], url = [\" + url + \"]\");\n        }\n        synchronized (LRU_CACHE) {\n            return getInfo(keyOf(serviceId, url, cacheType));\n        }\n    }\n\n    public void putInfo(final int serviceId,\n                        @NonNull final String url,\n                        @NonNull final Info info,\n                        @NonNull final Type cacheType) {\n        if (DEBUG) {\n            Log.d(TAG, \"putInfo() called with: info = [\" + info + \"]\");\n        }\n\n        final long expirationMillis = ServiceHelper.getCacheExpirationMillis(info.getServiceId());\n        synchronized (LRU_CACHE) {\n            final CacheData data = new CacheData(info, expirationMillis);\n            LRU_CACHE.put(keyOf(serviceId, url, cacheType), data);\n        }\n    }\n\n    public void removeInfo(final int serviceId,\n                           @NonNull final String url,\n                           @NonNull final Type cacheType) {\n        if (DEBUG) {\n            Log.d(TAG, \"removeInfo() called with: \"\n                    + \"serviceId = [\" + serviceId + \"], url = [\" + url + \"]\");\n        }\n        synchronized (LRU_CACHE) {\n            LRU_CACHE.remove(keyOf(serviceId, url, cacheType));\n        }\n    }\n\n    public void clearCache() {\n        if (DEBUG) {\n            Log.d(TAG, \"clearCache() called\");\n        }\n        synchronized (LRU_CACHE) {\n            LRU_CACHE.evictAll();\n        }\n    }\n\n    public void trimCache() {\n        if (DEBUG) {\n            Log.d(TAG, \"trimCache() called\");\n        }\n        synchronized (LRU_CACHE) {\n            removeStaleCache();\n            LRU_CACHE.trimToSize(TRIM_CACHE_TO);\n        }\n    }\n\n    public long getSize() {\n        synchronized (LRU_CACHE) {\n            return LRU_CACHE.size();\n        }\n    }\n\n    private static final class CacheData {\n        private final long expireTimestamp;\n        private final Info info;\n\n        private CacheData(@NonNull final Info info, final long timeoutMillis) {\n            this.expireTimestamp = System.currentTimeMillis() + timeoutMillis;\n            this.info = info;\n        }\n\n        private boolean isExpired() {\n            return System.currentTimeMillis() > expireTimestamp;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/KeyboardUtil.java",
    "content": "package org.schabi.newpipe.util;\n\nimport android.app.Activity;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.EditText;\n\nimport androidx.core.content.ContextCompat;\n\n/**\n * Utility class for the Android keyboard.\n * <p>\n * See also <a href=\"https://stackoverflow.com/q/1109022\">https://stackoverflow.com/q/1109022</a>\n * </p>\n */\npublic final class KeyboardUtil {\n    private KeyboardUtil() {\n    }\n\n    public static void showKeyboard(final Activity activity, final EditText editText) {\n        if (activity == null || editText == null) {\n            return;\n        }\n\n        if (editText.requestFocus()) {\n            final InputMethodManager imm = ContextCompat.getSystemService(activity,\n                    InputMethodManager.class);\n            if (!imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED)) {\n                /*\n                 * Sometimes the keyboard can't be shown because Android's ImeFocusController is in\n                 * a incorrect state e.g. when animations are disabled or the unfocus event of the\n                 * previous view arrives in the wrong moment (see #7647 for details).\n                 * The invalid state can be fixed by to re-focusing the editText.\n                 */\n                editText.clearFocus();\n                editText.requestFocus();\n\n                // Try again\n                imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);\n            }\n        }\n    }\n\n    public static void hideKeyboard(final Activity activity, final EditText editText) {\n        if (activity == null || editText == null) {\n            return;\n        }\n\n        final InputMethodManager imm = ContextCompat.getSystemService(activity,\n                InputMethodManager.class);\n        imm.hideSoftInputFromWindow(editText.getWindowToken(),\n                InputMethodManager.HIDE_NOT_ALWAYS);\n\n        editText.clearFocus();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/KioskTranslator.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2017-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.util\n\nimport android.content.Context\nimport org.schabi.newpipe.R\n\nobject KioskTranslator {\n    @JvmStatic\n    fun getTranslatedKioskName(kioskId: String, context: Context): String {\n        return when (kioskId) {\n            \"Trending\" -> context.getString(R.string.trending)\n            \"Top 50\" -> context.getString(R.string.top_50)\n            \"New & hot\" -> context.getString(R.string.new_and_hot)\n            \"Local\" -> context.getString(R.string.local)\n            \"Recently added\" -> context.getString(R.string.recently_added)\n            \"Most liked\" -> context.getString(R.string.most_liked)\n            \"conferences\" -> context.getString(R.string.conferences)\n            \"recent\" -> context.getString(R.string.recent)\n            \"live\" -> context.getString(R.string.duration_live)\n            \"Featured\" -> context.getString(R.string.featured)\n            \"Radio\" -> context.getString(R.string.radio)\n            \"trending_gaming\" -> context.getString(R.string.trending_gaming)\n            \"trending_music\" -> context.getString(R.string.trending_music)\n            \"trending_movies_and_shows\" -> context.getString(R.string.trending_movies)\n            \"trending_podcasts_episodes\" -> context.getString(R.string.trending_podcasts)\n            else -> kioskId\n        }\n    }\n\n    @JvmStatic\n    fun getKioskIcon(kioskId: String): Int {\n        return when (kioskId) {\n            \"Trending\", \"Top 50\", \"New & hot\", \"conferences\" -> R.drawable.ic_whatshot\n            \"Local\" -> R.drawable.ic_home\n            \"Recently added\", \"recent\" -> R.drawable.ic_add_circle_outline\n            \"Most liked\" -> R.drawable.ic_thumb_up\n            \"live\" -> R.drawable.ic_live_tv\n            \"Featured\" -> R.drawable.ic_stars\n            \"Radio\" -> R.drawable.ic_radio\n            \"trending_gaming\" -> R.drawable.ic_videogame_asset\n            \"trending_music\" -> R.drawable.ic_music_note\n            \"trending_movies_and_shows\" -> R.drawable.ic_movie\n            \"trending_podcasts_episodes\" -> R.drawable.ic_podcasts\n            else -> 0\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/ListHelper.java",
    "content": "package org.schabi.newpipe.util;\n\nimport static org.schabi.newpipe.extractor.ServiceList.YouTube;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.res.Resources;\nimport android.net.ConnectivityManager;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\nimport androidx.core.content.ContextCompat;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.MediaFormat;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.AudioTrackType;\nimport org.schabi.newpipe.extractor.stream.DeliveryMethod;\nimport org.schabi.newpipe.extractor.stream.Stream;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Objects;\nimport java.util.Set;\nimport java.util.function.Predicate;\nimport java.util.stream.Collectors;\n\npublic final class ListHelper {\n    // Video format in order of quality. 0=lowest quality, n=highest quality\n    private static final List<MediaFormat> VIDEO_FORMAT_QUALITY_RANKING =\n            List.of(MediaFormat.v3GPP, MediaFormat.WEBM, MediaFormat.MPEG_4);\n\n    // Audio format in order of quality. 0=lowest quality, n=highest quality\n    private static final List<MediaFormat> AUDIO_FORMAT_QUALITY_RANKING =\n            List.of(MediaFormat.MP3, MediaFormat.WEBMA, MediaFormat.M4A);\n    // Audio format in order of efficiency. 0=least efficient, n=most efficient\n    private static final List<MediaFormat> AUDIO_FORMAT_EFFICIENCY_RANKING =\n            List.of(MediaFormat.MP3, MediaFormat.M4A, MediaFormat.WEBMA);\n    // Use a Set for better performance\n    private static final Set<String> HIGH_RESOLUTION_LIST = Set.of(\"1440p\", \"2160p\");\n    // Audio track types in order of priority. 0=lowest, n=highest\n    private static final List<AudioTrackType> AUDIO_TRACK_TYPE_RANKING =\n            List.of(AudioTrackType.DESCRIPTIVE, AudioTrackType.SECONDARY, AudioTrackType.DUBBED,\n                    AudioTrackType.ORIGINAL);\n    // Audio track types in order of priority when descriptive audio is preferred.\n    private static final List<AudioTrackType> AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE =\n            List.of(AudioTrackType.SECONDARY, AudioTrackType.DUBBED, AudioTrackType.ORIGINAL,\n                    AudioTrackType.DESCRIPTIVE);\n\n    /**\n     * List of supported YouTube Itag ids.\n     * The original order is kept.\n     * @see {@link org.schabi.newpipe.extractor.services.youtube.ItagItem#ITAG_LIST}\n     */\n    private static final List<Integer> SUPPORTED_ITAG_IDS =\n            List.of(\n                    17, 36, // video v3GPP\n                    18, 34, 35, 59, 78, 22, 37, 38, // video MPEG4\n                    43, 44, 45, 46, // video webm\n                    171, 172, 139, 140, 141, 249, 250, 251, // audio\n                    160, 133, 134, 135, 212, 136, 298, 137, 299, 266, // video only\n                    278, 242, 243, 244, 245, 246, 247, 248, 271, 272, 302, 303, 308, 313, 315\n            );\n\n    private ListHelper() { }\n\n    /**\n     * @param context      Android app context\n     * @param videoStreams list of the video streams to check\n     * @return index of the video stream with the default index\n     * @see #getDefaultResolutionIndex(String, String, MediaFormat, List)\n     */\n    public static int getDefaultResolutionIndex(final Context context,\n                                                final List<VideoStream> videoStreams) {\n        final String defaultResolution = computeDefaultResolution(context,\n                R.string.default_resolution_key, R.string.default_resolution_value);\n        return getDefaultResolutionWithDefaultFormat(context, defaultResolution, videoStreams);\n    }\n\n    /**\n     * @param context           Android app context\n     * @param videoStreams      list of the video streams to check\n     * @param defaultResolution the default resolution to look for\n     * @return index of the video stream with the default index\n     * @see #getDefaultResolutionIndex(String, String, MediaFormat, List)\n     */\n    public static int getResolutionIndex(final Context context,\n                                         final List<VideoStream> videoStreams,\n                                         final String defaultResolution) {\n        return getDefaultResolutionWithDefaultFormat(context, defaultResolution, videoStreams);\n    }\n\n    /**\n     * @param context      Android app context\n     * @param videoStreams list of the video streams to check\n     * @return index of the video stream with the default index\n     * @see #getDefaultResolutionIndex(String, String, MediaFormat, List)\n     */\n    public static int getPopupDefaultResolutionIndex(final Context context,\n                                                     final List<VideoStream> videoStreams) {\n        final String defaultResolution = computeDefaultResolution(context,\n                R.string.default_popup_resolution_key, R.string.default_popup_resolution_value);\n        return getDefaultResolutionWithDefaultFormat(context, defaultResolution, videoStreams);\n    }\n\n    /**\n     * @param context           Android app context\n     * @param videoStreams      list of the video streams to check\n     * @param defaultResolution the default resolution to look for\n     * @return index of the video stream with the default index\n     * @see #getDefaultResolutionIndex(String, String, MediaFormat, List)\n     */\n    public static int getPopupResolutionIndex(final Context context,\n                                              final List<VideoStream> videoStreams,\n                                              final String defaultResolution) {\n        return getDefaultResolutionWithDefaultFormat(context, defaultResolution, videoStreams);\n    }\n\n    public static int getDefaultAudioFormat(final Context context,\n                                            final List<AudioStream> audioStreams) {\n        return getAudioIndexByHighestRank(audioStreams,\n                getAudioTrackComparator(context).thenComparing(getAudioFormatComparator(context)));\n    }\n\n    public static int getDefaultAudioTrackGroup(final Context context,\n                                                final List<List<AudioStream>> groupedAudioStreams) {\n        if (groupedAudioStreams == null || groupedAudioStreams.isEmpty()) {\n            return -1;\n        }\n\n        final Comparator<AudioStream> cmp = getAudioTrackComparator(context);\n        final List<AudioStream> highestRanked = groupedAudioStreams.stream()\n                .max((o1, o2) -> cmp.compare(o1.get(0), o2.get(0)))\n                .orElse(null);\n        return groupedAudioStreams.indexOf(highestRanked);\n    }\n\n    public static int getAudioFormatIndex(final Context context,\n                                          final List<AudioStream> audioStreams,\n                                          @Nullable final String trackId) {\n        if (trackId != null) {\n            for (int i = 0; i < audioStreams.size(); i++) {\n                final AudioStream s = audioStreams.get(i);\n                if (s.getAudioTrackId() != null\n                        && s.getAudioTrackId().equals(trackId)) {\n                    return i;\n                }\n            }\n        }\n        return getDefaultAudioFormat(context, audioStreams);\n    }\n\n    /**\n     * Return a {@link Stream} list which uses the given delivery method from a {@link Stream}\n     * list.\n     *\n     * @param streamList     the original {@link Stream stream} list\n     * @param deliveryMethod the {@link DeliveryMethod delivery method}\n     * @param <S>            the item type's class that extends {@link Stream}\n     * @return a {@link Stream stream} list which uses the given delivery method\n     */\n    @NonNull\n    public static <S extends Stream> List<S> getStreamsOfSpecifiedDelivery(\n            @Nullable final List<S> streamList,\n            final DeliveryMethod deliveryMethod) {\n        return getFilteredStreamList(streamList,\n                stream -> stream.getDeliveryMethod() == deliveryMethod);\n    }\n\n    /**\n     * Return a {@link Stream} list which only contains URL streams and non-torrent streams.\n     *\n     * @param streamList the original stream list\n     * @param <S>        the item type's class that extends {@link Stream}\n     * @return a stream list which only contains URL streams and non-torrent streams\n     */\n    @NonNull\n    public static <S extends Stream> List<S> getUrlAndNonTorrentStreams(\n            @Nullable final List<S> streamList) {\n        return getFilteredStreamList(streamList,\n                stream -> stream.isUrl() && stream.getDeliveryMethod() != DeliveryMethod.TORRENT);\n    }\n\n    /**\n     * Return a {@link Stream} list which only contains streams which can be played by the player.\n     *\n     * <p>\n     * Some formats are not supported, see {@link #SUPPORTED_ITAG_IDS} for more details.\n     * Torrent streams are also removed, because they cannot be retrieved, like OPUS streams using\n     * HLS as their delivery method, since they are not supported by ExoPlayer.\n     * </p>\n     *\n     * @param <S>        the item type's class that extends {@link Stream}\n     * @param streamList the original stream list\n     * @param serviceId  the service ID from which the streams' list comes from\n     * @return a stream list which only contains streams that can be played the player\n     */\n    @NonNull\n    public static <S extends Stream> List<S> getPlayableStreams(\n            @Nullable final List<S> streamList, final int serviceId) {\n        final int youtubeServiceId = YouTube.getServiceId();\n        return getFilteredStreamList(streamList,\n                stream -> stream.getDeliveryMethod() != DeliveryMethod.TORRENT\n                        && (stream.getDeliveryMethod() != DeliveryMethod.HLS\n                        || stream.getFormat() != MediaFormat.OPUS)\n                        && (serviceId != youtubeServiceId\n                        || stream.getItagItem() == null\n                        || SUPPORTED_ITAG_IDS.contains(stream.getItagItem().id)));\n    }\n\n    /**\n     * Join the two lists of video streams (video_only and normal videos),\n     * and sort them according with default format chosen by the user.\n     *\n     * @param context                the context to search for the format to give preference\n     * @param videoStreams           the normal videos list\n     * @param videoOnlyStreams       the video-only stream list\n     * @param ascendingOrder         true -> smallest to greatest | false -> greatest to smallest\n     * @param preferVideoOnlyStreams if video-only streams should preferred when both video-only\n     *                               streams and normal video streams are available\n     * @return the sorted list\n     */\n    @NonNull\n    public static List<VideoStream> getSortedStreamVideosList(\n            @NonNull final Context context,\n            @Nullable final List<VideoStream> videoStreams,\n            @Nullable final List<VideoStream> videoOnlyStreams,\n            final boolean ascendingOrder,\n            final boolean preferVideoOnlyStreams) {\n        final SharedPreferences preferences =\n                PreferenceManager.getDefaultSharedPreferences(context);\n\n        final boolean showHigherResolutions = preferences.getBoolean(\n                context.getString(R.string.show_higher_resolutions_key), false);\n        final MediaFormat defaultFormat = getDefaultFormat(context,\n                R.string.default_video_format_key, R.string.default_video_format_value);\n\n        return getSortedStreamVideosList(defaultFormat, showHigherResolutions, videoStreams,\n                videoOnlyStreams, ascendingOrder, preferVideoOnlyStreams);\n    }\n\n    /**\n     * Get a sorted list containing a set of default resolution info\n     * and additional resolution info if showHigherResolutions is true.\n     *\n     * @param resources the resources to get the resolutions from\n     * @param defaultResolutionKey the settings key of the default resolution\n     * @param additionalResolutionKey the settings key of the additional resolutions\n     * @param showHigherResolutions if higher resolutions should be included in the sorted list\n     * @return a sorted list containing the default and maybe additional resolutions\n     */\n    public static List<String> getSortedResolutionList(\n            final Resources resources,\n            final int defaultResolutionKey,\n            final int additionalResolutionKey,\n            final boolean showHigherResolutions) {\n        final List<String> resolutions = new ArrayList<>(Arrays.asList(\n                resources.getStringArray(defaultResolutionKey)));\n        if (!showHigherResolutions) {\n            return resolutions;\n        }\n        final List<String> additionalResolutions = Arrays.asList(\n                resources.getStringArray(additionalResolutionKey));\n        // keep \"best resolution\" at the top\n        resolutions.addAll(1, additionalResolutions);\n        return resolutions;\n    }\n\n    public static boolean isHighResolutionSelected(final String selectedResolution,\n                                             final int additionalResolutionKey,\n                                             final Resources resources) {\n        return Arrays.asList(resources.getStringArray(\n                        additionalResolutionKey))\n                .contains(selectedResolution);\n    }\n\n    /**\n     * Filter the list of audio streams and return a list with the preferred stream for\n     * each audio track. Streams are sorted with the preferred language in the first position.\n     *\n     * @param context      the context to search for the track to give preference\n     * @param audioStreams the list of audio streams\n     * @return the sorted, filtered list\n     */\n    public static List<AudioStream> getFilteredAudioStreams(\n            @NonNull final Context context,\n            @Nullable final List<AudioStream> audioStreams) {\n        if (audioStreams == null) {\n            return Collections.emptyList();\n        }\n\n        final HashMap<String, AudioStream> collectedStreams = new HashMap<>();\n\n        final Comparator<AudioStream> cmp = getAudioFormatComparator(context);\n\n        for (final AudioStream stream : audioStreams) {\n            if (stream.getDeliveryMethod() == DeliveryMethod.TORRENT\n                    || (stream.getDeliveryMethod() == DeliveryMethod.HLS\n                    && stream.getFormat() == MediaFormat.OPUS)) {\n                continue;\n            }\n\n            final String trackId = Objects.toString(stream.getAudioTrackId(), \"\");\n\n            final AudioStream presentStream = collectedStreams.get(trackId);\n            if (presentStream == null || cmp.compare(stream, presentStream) > 0) {\n                collectedStreams.put(trackId, stream);\n            }\n        }\n\n        // Filter unknown audio tracks if there are multiple tracks\n        if (collectedStreams.size() > 1) {\n            collectedStreams.remove(\"\");\n        }\n\n        // Sort collected streams by name\n        return collectedStreams.values().stream().sorted(getAudioTrackNameComparator())\n                .collect(Collectors.toList());\n    }\n\n    /**\n     * Group the list of audioStreams by their track ID and sort the resulting list by track name.\n     *\n     * @param context      app context to get track names for sorting\n     * @param audioStreams list of audio streams\n     * @return list of audio streams lists representing individual tracks\n     */\n    public static List<List<AudioStream>> getGroupedAudioStreams(\n            @NonNull final Context context,\n            @Nullable final List<AudioStream> audioStreams) {\n        if (audioStreams == null) {\n            return Collections.emptyList();\n        }\n\n        final HashMap<String, List<AudioStream>> collectedStreams = new HashMap<>();\n\n        for (final AudioStream stream : audioStreams) {\n            final String trackId = Objects.toString(stream.getAudioTrackId(), \"\");\n            if (collectedStreams.containsKey(trackId)) {\n                collectedStreams.get(trackId).add(stream);\n            } else {\n                final List<AudioStream> list = new ArrayList<>();\n                list.add(stream);\n                collectedStreams.put(trackId, list);\n            }\n        }\n\n        // Filter unknown audio tracks if there are multiple tracks\n        if (collectedStreams.size() > 1) {\n            collectedStreams.remove(\"\");\n        }\n\n        // Sort tracks alphabetically, sort track streams by quality\n        final Comparator<AudioStream> nameCmp = getAudioTrackNameComparator();\n        final Comparator<AudioStream> formatCmp = getAudioFormatComparator(context);\n\n        return collectedStreams.values().stream()\n                .sorted((o1, o2) -> nameCmp.compare(o1.get(0), o2.get(0)))\n                .map(streams -> streams.stream().sorted(formatCmp).collect(Collectors.toList()))\n                .collect(Collectors.toList());\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Utils\n    //////////////////////////////////////////////////////////////////////////*/\n\n    /**\n     * Get a filtered stream list, by using Java 8 Stream's API and the given predicate.\n     *\n     * @param streamList          the stream list to filter\n     * @param streamListPredicate the predicate which will be used to filter streams\n     * @param <S>                 the item type's class that extends {@link Stream}\n     * @return a new stream list filtered using the given predicate\n     */\n    private static <S extends Stream> List<S> getFilteredStreamList(\n            @Nullable final List<S> streamList,\n            final Predicate<S> streamListPredicate) {\n        if (streamList == null) {\n            return Collections.emptyList();\n        }\n\n        return streamList.stream()\n                .filter(streamListPredicate)\n                .collect(Collectors.toList());\n    }\n\n    private static String computeDefaultResolution(@NonNull final Context context, final int key,\n                                                   final int value) {\n        final SharedPreferences preferences =\n                PreferenceManager.getDefaultSharedPreferences(context);\n\n        // Load the preferred resolution otherwise the best available\n        String resolution = preferences != null\n                ? preferences.getString(context.getString(key), context.getString(value))\n                : context.getString(R.string.best_resolution_key);\n\n        final String maxResolution = getResolutionLimit(context);\n        if (maxResolution != null\n                && (resolution.equals(context.getString(R.string.best_resolution_key))\n                || compareVideoStreamResolution(maxResolution, resolution) < 1)) {\n            resolution = maxResolution;\n        }\n        return resolution;\n    }\n\n    /**\n     * Return the index of the default stream in the list, that will be sorted in the process, based\n     * on the parameters defaultResolution and defaultFormat.\n     *\n     * @param defaultResolution the default resolution to look for\n     * @param bestResolutionKey key of the best resolution\n     * @param defaultFormat     the default format to look for\n     * @param videoStreams      a mutable list of the video streams to check (it will be sorted in\n     *                          place)\n     * @return index of the default resolution&format in the sorted videoStreams\n     */\n    static int getDefaultResolutionIndex(final String defaultResolution,\n                                         final String bestResolutionKey,\n                                         final MediaFormat defaultFormat,\n                                         @Nullable final List<VideoStream> videoStreams) {\n        if (videoStreams == null || videoStreams.isEmpty()) {\n            return -1;\n        }\n\n        sortStreamList(videoStreams, false);\n        if (defaultResolution.equals(bestResolutionKey)) {\n            return 0;\n        }\n\n        final int defaultStreamIndex =\n                getVideoStreamIndex(defaultResolution, defaultFormat, videoStreams);\n\n        // this is actually an error,\n        // but maybe there is really no stream fitting to the default value.\n        if (defaultStreamIndex == -1) {\n            return 0;\n        }\n        return defaultStreamIndex;\n    }\n\n    /**\n     * Join the two lists of video streams (video_only and normal videos),\n     * and sort them according with default format chosen by the user.\n     *\n     * @param defaultFormat          format to give preference\n     * @param showHigherResolutions  show >1080p resolutions\n     * @param videoStreams           normal videos list\n     * @param videoOnlyStreams       video only stream list\n     * @param ascendingOrder         true -> smallest to greatest | false -> greatest to smallest\n     * @param preferVideoOnlyStreams if video-only streams should preferred when both video-only\n     *                               streams and normal video streams are available\n     * @return the sorted list\n     */\n    @NonNull\n    static List<VideoStream> getSortedStreamVideosList(\n            @Nullable final MediaFormat defaultFormat,\n            final boolean showHigherResolutions,\n            @Nullable final List<VideoStream> videoStreams,\n            @Nullable final List<VideoStream> videoOnlyStreams,\n            final boolean ascendingOrder,\n            final boolean preferVideoOnlyStreams\n    ) {\n        // Determine order of streams\n        // The last added list is preferred\n        final List<List<VideoStream>> videoStreamsOrdered =\n                preferVideoOnlyStreams\n                        ? Arrays.asList(videoStreams, videoOnlyStreams)\n                        : Arrays.asList(videoOnlyStreams, videoStreams);\n\n        final List<VideoStream> allInitialStreams = videoStreamsOrdered.stream()\n                // Ignore lists that are null\n                .filter(Objects::nonNull)\n                .flatMap(List::stream)\n                // Filter out higher resolutions (or not if high resolutions should always be shown)\n                .filter(stream -> showHigherResolutions\n                        || !HIGH_RESOLUTION_LIST.contains(stream.getResolution()\n                        // Replace any frame rate with nothing\n                        .replaceAll(\"p\\\\d+$\", \"p\")))\n                .collect(Collectors.toList());\n\n        final HashMap<String, VideoStream> hashMap = new HashMap<>();\n        // Add all to the hashmap\n        for (final VideoStream videoStream : allInitialStreams) {\n            hashMap.put(videoStream.getResolution(), videoStream);\n        }\n\n        // Override the values when the key == resolution, with the defaultFormat\n        for (final VideoStream videoStream : allInitialStreams) {\n            if (videoStream.getFormat() == defaultFormat) {\n                hashMap.put(videoStream.getResolution(), videoStream);\n            }\n        }\n\n        // Return the sorted list\n        return sortStreamList(new ArrayList<>(hashMap.values()), ascendingOrder);\n    }\n\n    /**\n     * Sort the streams list depending on the parameter ascendingOrder;\n     * <p>\n     * It works like that:<br>\n     * - Take a string resolution, remove the letters, replace \"0p60\" (for 60fps videos) with \"1\"\n     * and sort by the greatest:<br>\n     * <blockquote><pre>\n     *      720p     ->  720\n     *      720p60   ->  721\n     *      360p     ->  360\n     *      1080p    ->  1080\n     *      1080p60  ->  1081\n     * <br>\n     * ascendingOrder  ? 360 < 720 < 721 < 1080 < 1081\n     * !ascendingOrder ? 1081 < 1080 < 721 < 720 < 360</pre></blockquote>\n     *\n     * @param videoStreams   list that the sorting will be applied\n     * @param ascendingOrder true -> smallest to greatest | false -> greatest to smallest\n     * @return The sorted list (same reference as parameter videoStreams)\n     */\n    private static List<VideoStream> sortStreamList(final List<VideoStream> videoStreams,\n                                                    final boolean ascendingOrder) {\n        // Compares the quality of two video streams.\n        final Comparator<VideoStream> comparator = Comparator.nullsLast(Comparator\n                .comparing(VideoStream::getResolution, ListHelper::compareVideoStreamResolution)\n                .thenComparingInt(s -> VIDEO_FORMAT_QUALITY_RANKING.indexOf(s.getFormat())));\n        Collections.sort(videoStreams, ascendingOrder ? comparator : comparator.reversed());\n        return videoStreams;\n    }\n\n    /**\n     * Get the audio-stream from the list with the highest rank, depending on the comparator.\n     * Format will be ignored if it yields no results.\n     *\n     * @param audioStreams List of audio streams\n     * @param comparator   The comparator used for determining the max/best/highest ranked value\n     * @return Index of audio stream that produces the highest ranked result or -1 if not found\n     */\n    static int getAudioIndexByHighestRank(@Nullable final List<AudioStream> audioStreams,\n                                          final Comparator<AudioStream> comparator) {\n        if (audioStreams == null || audioStreams.isEmpty()) {\n            return -1;\n        }\n\n        final AudioStream highestRankedAudioStream = audioStreams.stream()\n                .max(comparator).orElse(null);\n\n        return audioStreams.indexOf(highestRankedAudioStream);\n    }\n\n    /**\n     * Locates a possible match for the given resolution and format in the provided list.\n     *\n     * <p>In this order:</p>\n     *\n     * <ol>\n     * <li>Find a format and resolution match</li>\n     * <li>Find a format and resolution match and ignore the refresh</li>\n     * <li>Find a resolution match</li>\n     * <li>Find a resolution match and ignore the refresh</li>\n     * <li>Find a resolution just below the requested resolution and ignore the refresh</li>\n     * <li>Give up</li>\n     * </ol>\n     *\n     * @param targetResolution the resolution to look for\n     * @param targetFormat     the format to look for\n     * @param videoStreams     the available video streams\n     * @return the index of the preferred video stream\n     */\n    static int getVideoStreamIndex(@NonNull final String targetResolution,\n                                   final MediaFormat targetFormat,\n                                   @NonNull final List<VideoStream> videoStreams) {\n        int fullMatchIndex = -1;\n        int fullMatchNoRefreshIndex = -1;\n        int resMatchOnlyIndex = -1;\n        int resMatchOnlyNoRefreshIndex = -1;\n        int lowerResMatchNoRefreshIndex = -1;\n        final String targetResolutionNoRefresh = targetResolution.replaceAll(\"p\\\\d+$\", \"p\");\n\n        for (int idx = 0; idx < videoStreams.size(); idx++) {\n            final MediaFormat format = targetFormat == null\n                    ? null\n                    : videoStreams.get(idx).getFormat();\n            final String resolution = videoStreams.get(idx).getResolution();\n            final String resolutionNoRefresh = resolution.replaceAll(\"p\\\\d+$\", \"p\");\n\n            if (format == targetFormat && resolution.equals(targetResolution)) {\n                fullMatchIndex = idx;\n            }\n\n            if (format == targetFormat && resolutionNoRefresh.equals(targetResolutionNoRefresh)) {\n                fullMatchNoRefreshIndex = idx;\n            }\n\n            if (resMatchOnlyIndex == -1 && resolution.equals(targetResolution)) {\n                resMatchOnlyIndex = idx;\n            }\n\n            if (resMatchOnlyNoRefreshIndex == -1\n                    && resolutionNoRefresh.equals(targetResolutionNoRefresh)) {\n                resMatchOnlyNoRefreshIndex = idx;\n            }\n\n            if (lowerResMatchNoRefreshIndex == -1 && compareVideoStreamResolution(\n                    resolutionNoRefresh, targetResolutionNoRefresh) < 0) {\n                lowerResMatchNoRefreshIndex = idx;\n            }\n        }\n\n        if (fullMatchIndex != -1) {\n            return fullMatchIndex;\n        }\n        if (fullMatchNoRefreshIndex != -1) {\n            return fullMatchNoRefreshIndex;\n        }\n        if (resMatchOnlyIndex != -1) {\n            return resMatchOnlyIndex;\n        }\n        if (resMatchOnlyNoRefreshIndex != -1) {\n            return resMatchOnlyNoRefreshIndex;\n        }\n        return lowerResMatchNoRefreshIndex;\n    }\n\n    /**\n     * Fetches the desired resolution or returns the default if it is not found.\n     * The resolution will be reduced if video chocking is active.\n     *\n     * @param context           Android app context\n     * @param defaultResolution the default resolution\n     * @param videoStreams      the list of video streams to check\n     * @return the index of the preferred video stream\n     */\n    private static int getDefaultResolutionWithDefaultFormat(@NonNull final Context context,\n                                                             final String defaultResolution,\n                                                             final List<VideoStream> videoStreams) {\n        final MediaFormat defaultFormat = getDefaultFormat(context,\n                R.string.default_video_format_key, R.string.default_video_format_value);\n        return getDefaultResolutionIndex(defaultResolution,\n                context.getString(R.string.best_resolution_key), defaultFormat, videoStreams);\n    }\n\n    @Nullable\n    private static MediaFormat getDefaultFormat(@NonNull final Context context,\n                                                @StringRes final int defaultFormatKey,\n                                                @StringRes final int defaultFormatValueKey) {\n        final SharedPreferences preferences =\n                PreferenceManager.getDefaultSharedPreferences(context);\n\n        final String defaultFormat = context.getString(defaultFormatValueKey);\n        final String defaultFormatString = preferences.getString(\n                context.getString(defaultFormatKey),\n                defaultFormat\n        );\n\n        return getMediaFormatFromKey(context, defaultFormatString);\n    }\n\n    @Nullable\n    private static MediaFormat getMediaFormatFromKey(@NonNull final Context context,\n                                                     @NonNull final String formatKey) {\n        MediaFormat format = null;\n        if (formatKey.equals(context.getString(R.string.video_webm_key))) {\n            format = MediaFormat.WEBM;\n        } else if (formatKey.equals(context.getString(R.string.video_mp4_key))) {\n            format = MediaFormat.MPEG_4;\n        } else if (formatKey.equals(context.getString(R.string.video_3gp_key))) {\n            format = MediaFormat.v3GPP;\n        } else if (formatKey.equals(context.getString(R.string.audio_webm_key))) {\n            format = MediaFormat.WEBMA;\n        } else if (formatKey.equals(context.getString(R.string.audio_m4a_key))) {\n            format = MediaFormat.M4A;\n        }\n        return format;\n    }\n\n    private static int compareVideoStreamResolution(@NonNull final String r1,\n                                                    @NonNull final String r2) {\n        try {\n            final int res1 = Integer.parseInt(r1.replaceAll(\"0p\\\\d+$\", \"1\")\n                    .replaceAll(\"[^\\\\d.]\", \"\"));\n            final int res2 = Integer.parseInt(r2.replaceAll(\"0p\\\\d+$\", \"1\")\n                    .replaceAll(\"[^\\\\d.]\", \"\"));\n            return res1 - res2;\n        } catch (final NumberFormatException e) {\n            // Consider the first one greater because we don't know if the two streams are\n            // different or not (a NumberFormatException was thrown so we don't know the resolution\n            // of one stream or of all streams)\n            return 1;\n        }\n    }\n\n    static boolean isLimitingDataUsage(@NonNull final Context context) {\n        return getResolutionLimit(context) != null;\n    }\n\n    /**\n     * The maximum resolution allowed.\n     *\n     * @param context App context\n     * @return maximum resolution allowed or null if there is no maximum\n     */\n    private static String getResolutionLimit(@NonNull final Context context) {\n        String resolutionLimit = null;\n        if (isMeteredNetwork(context)) {\n            final SharedPreferences preferences =\n                    PreferenceManager.getDefaultSharedPreferences(context);\n            final String defValue = context.getString(R.string.limit_data_usage_none_key);\n            final String value = preferences.getString(\n                    context.getString(R.string.limit_mobile_data_usage_key), defValue);\n            resolutionLimit = defValue.equals(value) ? null : value;\n        }\n        return resolutionLimit;\n    }\n\n    /**\n     * The current network is metered (like mobile data)?\n     *\n     * @param context App context\n     * @return {@code true} if connected to a metered network\n     */\n    public static boolean isMeteredNetwork(@NonNull final Context context) {\n        final ConnectivityManager manager =\n                ContextCompat.getSystemService(context, ConnectivityManager.class);\n        if (manager == null || manager.getActiveNetworkInfo() == null) {\n            return false;\n        }\n\n        return manager.isActiveNetworkMetered();\n    }\n\n    /**\n     * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate.\n     *\n     * <p>The preferred stream will be ordered last.</p>\n     *\n     * @param context app context\n     * @return Comparator\n     */\n    private static Comparator<AudioStream> getAudioFormatComparator(\n            final @NonNull Context context) {\n        final MediaFormat defaultFormat = getDefaultFormat(context,\n                R.string.default_audio_format_key, R.string.default_audio_format_value);\n        return getAudioFormatComparator(defaultFormat, isLimitingDataUsage(context));\n    }\n\n    /**\n     * Get a {@link Comparator} to compare {@link AudioStream}s by their format and bitrate.\n     *\n     * <p>The preferred stream will be ordered last.</p>\n     *\n     * @param defaultFormat  the default format to look for\n     * @param limitDataUsage choose low bitrate audio stream\n     * @return Comparator\n     */\n    static Comparator<AudioStream> getAudioFormatComparator(\n            @Nullable final MediaFormat defaultFormat, final boolean limitDataUsage) {\n        final List<MediaFormat> formatRanking = limitDataUsage\n                ? AUDIO_FORMAT_EFFICIENCY_RANKING : AUDIO_FORMAT_QUALITY_RANKING;\n\n        Comparator<AudioStream> bitrateComparator =\n                Comparator.comparingInt(AudioStream::getAverageBitrate);\n        if (limitDataUsage) {\n            bitrateComparator = bitrateComparator.reversed();\n        }\n\n        return Comparator.comparing(AudioStream::getFormat, (o1, o2) -> {\n            if (defaultFormat != null) {\n                return Boolean.compare(o1 == defaultFormat, o2 == defaultFormat);\n            }\n            return 0;\n        }).thenComparing(bitrateComparator).thenComparingInt(\n                stream -> formatRanking.indexOf(stream.getFormat()));\n    }\n\n    /**\n     * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks.\n     *\n     * <p>Tracks will be compared this order:</p>\n     * <ol>\n     * <li>If {@code preferOriginalAudio}: use original audio</li>\n     * <li>Language matches {@code preferredLanguage}</li>\n     * <li>\n     *     Track type ranks highest in this order:\n     *     <i>Original</i> > <i>Dubbed</i> > <i>Descriptive</i>\n     *     <p>If {@code preferDescriptiveAudio}:\n     *     <i>Descriptive</i> > <i>Dubbed</i> > <i>Original</i></p>\n     * </li>\n     * <li>Language is English</li>\n     * </ol>\n     *\n     * <p>The preferred track will be ordered last.</p>\n     *\n     * @param context App context\n     * @return Comparator\n     */\n    private static Comparator<AudioStream> getAudioTrackComparator(\n            @NonNull final Context context) {\n        final SharedPreferences preferences =\n                PreferenceManager.getDefaultSharedPreferences(context);\n        final Locale preferredLanguage = Localization.getPreferredLocale(context);\n        final boolean preferOriginalAudio =\n                preferences.getBoolean(context.getString(R.string.prefer_original_audio_key),\n                        true);\n        final boolean preferDescriptiveAudio =\n                preferences.getBoolean(context.getString(R.string.prefer_descriptive_audio_key),\n                        false);\n\n        return getAudioTrackComparator(preferredLanguage, preferOriginalAudio,\n                preferDescriptiveAudio);\n    }\n\n    /**\n     * Get a {@link Comparator} to compare {@link AudioStream}s by their tracks.\n     *\n     * <p>Tracks will be compared this order:</p>\n     * <ol>\n     * <li>If {@code preferOriginalAudio}: use original audio</li>\n     * <li>Language matches {@code preferredLanguage}</li>\n     * <li>\n     *     Track type ranks highest in this order:\n     *     <i>Original</i> > <i>Dubbed</i> > <i>Descriptive</i>\n     *     <p>If {@code preferDescriptiveAudio}:\n     *     <i>Descriptive</i> > <i>Dubbed</i> > <i>Original</i></p>\n     * </li>\n     * <li>Language is English</li>\n     * </ol>\n     *\n     * <p>The preferred track will be ordered last.</p>\n     *\n     * @param preferredLanguage      Preferred audio stream language\n     * @param preferOriginalAudio    Get the original audio track regardless of its language\n     * @param preferDescriptiveAudio Prefer the descriptive audio track if available\n     * @return Comparator\n     */\n    static Comparator<AudioStream> getAudioTrackComparator(\n            final Locale preferredLanguage,\n            final boolean preferOriginalAudio,\n            final boolean preferDescriptiveAudio) {\n        final String langCode = preferredLanguage.getISO3Language();\n        final List<AudioTrackType> trackTypeRanking = preferDescriptiveAudio\n                ? AUDIO_TRACK_TYPE_RANKING_DESCRIPTIVE : AUDIO_TRACK_TYPE_RANKING;\n\n        return Comparator.comparing(AudioStream::getAudioTrackType, (o1, o2) -> {\n                    if (preferOriginalAudio) {\n                        return Boolean.compare(\n                                o1 == AudioTrackType.ORIGINAL, o2 == AudioTrackType.ORIGINAL);\n                    }\n                    return 0;\n                }).thenComparing(AudioStream::getAudioLocale,\n                        Comparator.nullsFirst(Comparator.comparing(\n                                locale -> locale.getISO3Language().equals(langCode))))\n                .thenComparing(AudioStream::getAudioTrackType,\n                        Comparator.nullsFirst(Comparator.comparingInt(trackTypeRanking::indexOf)))\n                .thenComparing(AudioStream::getAudioLocale,\n                        Comparator.nullsFirst(Comparator.comparing(\n                                locale -> locale.getISO3Language().equals(\n                                        Locale.ENGLISH.getISO3Language()))));\n    }\n\n    /**\n     * Get a {@link Comparator} to compare {@link AudioStream}s by their languages and track types\n     * for alphabetical sorting.\n     *\n     * @return Comparator\n     */\n    private static Comparator<AudioStream> getAudioTrackNameComparator() {\n        final Locale appLoc = Localization.getAppLocale();\n\n        return Comparator.comparing(AudioStream::getAudioLocale, Comparator.nullsLast(\n                        Comparator.comparing(locale -> locale.getDisplayName(appLoc))))\n                .thenComparing(AudioStream::getAudioTrackType, Comparator.nullsLast(\n                        Comparator.naturalOrder()));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/Localization.java",
    "content": "package org.schabi.newpipe.util;\n\nimport static org.schabi.newpipe.MainActivity.DEBUG;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.res.Resources;\nimport android.icu.text.CompactDecimalFormat;\nimport android.os.Build;\nimport android.text.BidiFormatter;\nimport android.text.TextUtils;\nimport android.text.format.DateUtils;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.PluralsRes;\nimport androidx.annotation.StringRes;\nimport androidx.appcompat.app.AppCompatDelegate;\nimport androidx.core.math.MathUtils;\nimport androidx.core.os.LocaleListCompat;\nimport androidx.preference.PreferenceManager;\n\nimport org.ocpsoft.prettytime.PrettyTime;\nimport org.ocpsoft.prettytime.units.Decade;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.ListExtractor;\nimport org.schabi.newpipe.extractor.localization.ContentCountry;\nimport org.schabi.newpipe.extractor.localization.DateWrapper;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.AudioTrackType;\n\nimport java.math.BigDecimal;\nimport java.math.RoundingMode;\nimport java.text.NumberFormat;\nimport java.time.OffsetDateTime;\nimport java.time.ZoneId;\nimport java.time.format.DateTimeFormatter;\nimport java.time.format.FormatStyle;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.stream.Collectors;\n\n\n/*\n * Created by chschtsch on 12/29/15.\n *\n * Copyright (C) Gregory Arkhipov 2015\n * Localization.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic final class Localization {\n    private static final String TAG = Localization.class.toString();\n    public static final String DOT_SEPARATOR = \" • \";\n    private static PrettyTime prettyTime;\n\n    private Localization() { }\n\n    @NonNull\n    public static String concatenateStrings(final String... strings) {\n        return concatenateStrings(DOT_SEPARATOR, Arrays.asList(strings));\n    }\n\n    @NonNull\n    public static String concatenateStrings(final String delimiter, final List<String> strings) {\n        return strings.stream()\n                .filter(string -> !TextUtils.isEmpty(string))\n                .collect(Collectors.joining(delimiter));\n    }\n\n    /**\n     * Localize a user name like <code>@foobar</code>.\n     *\n     * Will correctly handle right-to-left usernames by using a {@link BidiFormatter}.\n     * For right-to-left usernames, it will put the @ on the right side to read more naturally.\n     *\n     * @param plainName username, with an optional leading <code>@</code>\n     * @return a usernames that can include RTL-characters\n     */\n    @NonNull\n    public static String localizeUserName(final String plainName) {\n        return BidiFormatter.getInstance().unicodeWrap(plainName);\n    }\n\n    public static org.schabi.newpipe.extractor.localization.Localization getPreferredLocalization(\n            final Context context) {\n        return org.schabi.newpipe.extractor.localization.Localization\n                .fromLocale(getPreferredLocale(context));\n    }\n\n    public static ContentCountry getPreferredContentCountry(@NonNull final Context context) {\n        final String contentCountry = PreferenceManager.getDefaultSharedPreferences(context)\n                .getString(context.getString(R.string.content_country_key),\n                        context.getString(R.string.default_localization_key));\n        if (contentCountry.equals(context.getString(R.string.default_localization_key))) {\n            return new ContentCountry(Locale.getDefault().getCountry());\n        }\n        return new ContentCountry(contentCountry);\n    }\n\n    public static Locale getPreferredLocale(@NonNull final Context context) {\n        return getLocaleFromPrefs(context, R.string.content_language_key);\n    }\n\n    public static Locale getAppLocale() {\n        final Locale customLocale = AppCompatDelegate.getApplicationLocales().get(0);\n        return customLocale != null ? customLocale : Locale.getDefault();\n    }\n\n    public static String localizeNumber(final long number) {\n        return localizeNumber((double) number);\n    }\n\n    public static String localizeNumber(final double number) {\n        return NumberFormat.getInstance(getAppLocale()).format(number);\n    }\n\n    public static String formatDate(@NonNull final OffsetDateTime offsetDateTime) {\n        return DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)\n            .withLocale(getAppLocale())\n            .format(offsetDateTime.atZoneSameInstant(ZoneId.systemDefault()));\n    }\n\n    @SuppressLint(\"StringFormatInvalid\")\n    public static String localizeUploadDate(@NonNull final Context context,\n                                            @NonNull final OffsetDateTime offsetDateTime) {\n        return context.getString(R.string.upload_date_text, formatDate(offsetDateTime));\n    }\n\n    public static String localizeViewCount(@NonNull final Context context, final long viewCount) {\n        return getQuantity(context, R.plurals.views, R.string.no_views, viewCount,\n                localizeNumber(viewCount));\n    }\n\n    public static String localizeStreamCount(@NonNull final Context context,\n                                             final long streamCount) {\n        switch ((int) streamCount) {\n            case (int) ListExtractor.ITEM_COUNT_UNKNOWN:\n                return \"\";\n            case (int) ListExtractor.ITEM_COUNT_INFINITE:\n                return context.getString(R.string.infinite_videos);\n            case (int) ListExtractor.ITEM_COUNT_MORE_THAN_100:\n                return context.getString(R.string.more_than_100_videos);\n            default:\n                return getQuantity(context, R.plurals.videos, R.string.no_videos, streamCount,\n                        localizeNumber(streamCount));\n        }\n    }\n\n    public static String localizeStreamCountMini(@NonNull final Context context,\n                                                 final long streamCount) {\n        switch ((int) streamCount) {\n            case (int) ListExtractor.ITEM_COUNT_UNKNOWN:\n                return \"\";\n            case (int) ListExtractor.ITEM_COUNT_INFINITE:\n                return context.getString(R.string.infinite_videos_mini);\n            case (int) ListExtractor.ITEM_COUNT_MORE_THAN_100:\n                return context.getString(R.string.more_than_100_videos_mini);\n            default:\n                return String.valueOf(streamCount);\n        }\n    }\n\n    public static String localizeWatchingCount(@NonNull final Context context,\n                                               final long watchingCount) {\n        return getQuantity(context, R.plurals.watching, R.string.no_one_watching, watchingCount,\n                localizeNumber(watchingCount));\n    }\n\n    public static String shortCount(@NonNull final Context context, final long count) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n            return CompactDecimalFormat.getInstance(getAppLocale(),\n                    CompactDecimalFormat.CompactStyle.SHORT).format(count);\n        }\n\n        final double value = (double) count;\n        if (count >= 1000000000) {\n            final double shortenedValue = value / 1000000000;\n            final int scale = shortenedValue >= 100 ? 0 : 1;\n            return context.getString(R.string.short_billion,\n                    localizeNumber(round(shortenedValue, scale)));\n        } else if (count >= 1000000) {\n            final double shortenedValue = value / 1000000;\n            final int scale = shortenedValue >= 100 ? 0 : 1;\n            return context.getString(R.string.short_million,\n                    localizeNumber(round(shortenedValue, scale)));\n        } else if (count >= 1000) {\n            final double shortenedValue = value / 1000;\n            final int scale = shortenedValue >= 100 ? 0 : 1;\n            return context.getString(R.string.short_thousand,\n                    localizeNumber(round(shortenedValue, scale)));\n        } else {\n            return localizeNumber(value);\n        }\n    }\n\n    public static String listeningCount(@NonNull final Context context, final long listeningCount) {\n        return getQuantity(context, R.plurals.listening, R.string.no_one_listening, listeningCount,\n                shortCount(context, listeningCount));\n    }\n\n    public static String shortWatchingCount(@NonNull final Context context,\n                                            final long watchingCount) {\n        return getQuantity(context, R.plurals.watching, R.string.no_one_watching, watchingCount,\n                shortCount(context, watchingCount));\n    }\n\n    public static String shortViewCount(@NonNull final Context context, final long viewCount) {\n        return getQuantity(context, R.plurals.views, R.string.no_views, viewCount,\n                shortCount(context, viewCount));\n    }\n\n    public static String shortSubscriberCount(@NonNull final Context context,\n                                              final long subscriberCount) {\n        return getQuantity(context, R.plurals.subscribers, R.string.no_subscribers, subscriberCount,\n                shortCount(context, subscriberCount));\n    }\n\n    public static String downloadCount(@NonNull final Context context, final int downloadCount) {\n        return getQuantity(context, R.plurals.download_finished_notification, 0,\n                downloadCount, shortCount(context, downloadCount));\n    }\n\n    public static String deletedDownloadCount(@NonNull final Context context,\n                                              final int deletedCount) {\n        return getQuantity(context, R.plurals.deleted_downloads_toast, 0,\n                deletedCount, shortCount(context, deletedCount));\n    }\n\n    public static String replyCount(@NonNull final Context context, final int replyCount) {\n        return getQuantity(context, R.plurals.replies, 0, replyCount,\n                String.valueOf(replyCount));\n    }\n\n    /**\n     * @param context the Android context\n     * @param likeCount the like count, possibly negative if unknown\n     * @return if {@code likeCount} is smaller than {@code 0}, the string {@code \"-\"}, otherwise\n     *         the result of calling {@link #shortCount(Context, long)} on the like count\n     */\n    public static String likeCount(@NonNull final Context context, final int likeCount) {\n        if (likeCount < 0) {\n            return \"-\";\n        } else {\n            return shortCount(context, likeCount);\n        }\n    }\n\n    /**\n     * Get a readable text for a duration in the format {@code hours:minutes:seconds}.\n     *\n     * @param duration the duration in seconds\n     * @return a formatted duration String or {@code 00:00} if the duration is zero.\n     */\n    public static String getDurationString(final long duration) {\n        return DateUtils.formatElapsedTime(Math.max(duration, 0));\n    }\n\n    /**\n     * Get a readable text for a duration in the format {@code hours:minutes:seconds+}. If the given\n     * duration is incomplete, a plus is appended to the duration string.\n     *\n     * @param duration the duration in seconds\n     * @param isDurationComplete whether the given duration is complete or whether info is missing\n     * @param showDurationPrefix whether the duration-prefix shall be shown\n     * @return a formatted duration String or {@code 00:00} if the duration is zero.\n     */\n    public static String getDurationString(final long duration, final boolean isDurationComplete,\n                                           final boolean showDurationPrefix) {\n        final String output = getDurationString(duration);\n        final String durationPrefix = showDurationPrefix ? \"⏱ \" : \"\";\n        final String durationPostfix = isDurationComplete ? \"\" : \"+\";\n        return durationPrefix + output + durationPostfix;\n    }\n\n    /**\n     * Localize an amount of seconds into a human readable string.\n     *\n     * <p>The seconds will be converted to the closest whole time unit.\n     * <p>For example, 60 seconds would give \"1 minute\", 119 would also give \"1 minute\".\n     *\n     * @param context        used to get plurals resources.\n     * @param durationInSecs an amount of seconds.\n     * @return duration in a human readable string.\n     */\n    @NonNull\n    public static String localizeDuration(@NonNull final Context context,\n                                          final int durationInSecs) {\n        if (durationInSecs < 0) {\n            throw new IllegalArgumentException(\"duration can not be negative\");\n        }\n\n        final int days = (int) (durationInSecs / (24 * 60 * 60L));\n        final int hours = (int) (durationInSecs % (24 * 60 * 60L) / (60 * 60L));\n        final int minutes = (int) (durationInSecs % (24 * 60 * 60L) % (60 * 60L) / 60L);\n        final int seconds = (int) (durationInSecs % (24 * 60 * 60L) % (60 * 60L) % 60L);\n\n        final Resources resources = context.getResources();\n\n        if (days > 0) {\n            return resources.getQuantityString(R.plurals.days, days, days);\n        } else if (hours > 0) {\n            return resources.getQuantityString(R.plurals.hours, hours, hours);\n        } else if (minutes > 0) {\n            return resources.getQuantityString(R.plurals.minutes, minutes, minutes);\n        } else {\n            return resources.getQuantityString(R.plurals.seconds, seconds, seconds);\n        }\n    }\n\n    /**\n     * Get the localized name of an audio track.\n     *\n     * <p>Examples of results returned by this method:</p>\n     * <ul>\n     *     <li>English (original)</li>\n     *     <li>English (descriptive)</li>\n     *     <li>Spanish (Spain) (dubbed)</li>\n     * </ul>\n     *\n     * @param context the context used to get the app language\n     * @param track   an {@link AudioStream} of the track\n     * @return the localized name of the audio track\n     */\n    public static String audioTrackName(@NonNull final Context context, final AudioStream track) {\n        final String name;\n        if (track.getAudioLocale() != null) {\n            name = track.getAudioLocale().getDisplayName();\n        } else if (track.getAudioTrackName() != null) {\n            name = track.getAudioTrackName();\n        } else {\n            name = context.getString(R.string.unknown_audio_track);\n        }\n\n        if (track.getAudioTrackType() != null) {\n            final String trackType = audioTrackType(context, track.getAudioTrackType());\n            return context.getString(R.string.audio_track_name, name, trackType);\n        }\n        return name;\n    }\n\n    @NonNull\n    private static String audioTrackType(@NonNull final Context context,\n                                         @NonNull final AudioTrackType trackType) {\n        return switch (trackType) {\n            case ORIGINAL -> context.getString(R.string.audio_track_type_original);\n            case DUBBED -> context.getString(R.string.audio_track_type_dubbed);\n            case DESCRIPTIVE -> context.getString(R.string.audio_track_type_descriptive);\n            case SECONDARY -> context.getString(R.string.audio_track_type_secondary);\n        };\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Pretty Time\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public static void initPrettyTime(@NonNull final PrettyTime time) {\n        prettyTime = time;\n        // Do not use decades as YouTube doesn't either.\n        prettyTime.removeUnit(Decade.class);\n    }\n\n    public static PrettyTime resolvePrettyTime() {\n        return new PrettyTime(getAppLocale());\n    }\n\n    public static String relativeTime(@NonNull final OffsetDateTime offsetDateTime) {\n        return prettyTime.formatUnrounded(offsetDateTime);\n    }\n\n    /**\n     * @param context the Android context; if {@code null} then even if in debug mode and the\n     *                setting is enabled, {@code textual} will not be shown next to {@code parsed}\n     * @param parsed  the textual date or time ago parsed by NewPipeExtractor, or {@code null} if\n     *                the extractor could not parse it\n     * @param textual the original textual date or time ago string as provided by services\n     * @return {@link #relativeTime(OffsetDateTime)} is used if {@code parsed != null}, otherwise\n     *         {@code textual} is returned. If in debug mode, {@code context != null},\n     *         {@code parsed != null} and the relevant setting is enabled, {@code textual} will\n     *         be appended to the returned string for debugging purposes.\n     */\n    @Nullable\n    public static String relativeTimeOrTextual(@Nullable final Context context,\n                                               @Nullable final DateWrapper parsed,\n                                               @Nullable final String textual) {\n        if (parsed == null) {\n            return textual;\n        } else if (DEBUG && context != null && PreferenceManager\n                .getDefaultSharedPreferences(context)\n                .getBoolean(context.getString(R.string.show_original_time_ago_key), false)) {\n            return relativeTime(parsed.offsetDateTime()) + \" (\" + textual + \")\";\n        } else {\n            return relativeTime(parsed.offsetDateTime());\n        }\n    }\n\n    private static Locale getLocaleFromPrefs(@NonNull final Context context,\n                                             @StringRes final int prefKey) {\n        final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);\n        final String defaultKey = context.getString(R.string.default_localization_key);\n        final String languageCode = sp.getString(context.getString(prefKey), defaultKey);\n\n        if (languageCode.equals(defaultKey)) {\n            return Locale.getDefault();\n        } else {\n            return Locale.forLanguageTag(languageCode);\n        }\n    }\n\n    private static double round(final double value, final int scale) {\n        return new BigDecimal(value).setScale(scale, RoundingMode.HALF_UP).doubleValue();\n    }\n\n    /**\n     * A wrapper around {@code context.getResources().getQuantityString()} with some safeguard.\n     *\n     * @param context the Android context\n     * @param pluralId the ID of the plural resource\n     * @param zeroCaseStringId the resource ID of the string to use in case {@code count=0},\n     *                         or 0 if the plural resource should be used in the zero case too\n     * @param count the number that should be used to pick the correct plural form\n     * @param formattedCount the formatting parameter to substitute inside the plural resource,\n     *                       ideally just {@code count} converted to string\n     * @return the formatted string with the correct pluralization\n     */\n    private static String getQuantity(@NonNull final Context context,\n                                      @PluralsRes final int pluralId,\n                                      @StringRes final int zeroCaseStringId,\n                                      final long count,\n                                      final String formattedCount) {\n        if (count == 0 && zeroCaseStringId != 0) {\n            return context.getString(zeroCaseStringId);\n        }\n\n        // As we use the already formatted count\n        // is not the responsibility of this method handle long numbers\n        // (it probably will fall in the \"other\" category,\n        // or some language have some specific rule... then we have to change it)\n        final int safeCount = (int) MathUtils.clamp(count, Integer.MIN_VALUE, Integer.MAX_VALUE);\n        return context.getResources().getQuantityString(pluralId, safeCount, formattedCount);\n    }\n\n    // Starting with pull request #12093, NewPipe exclusively uses Android's\n    // public per-app language APIs to read and set the UI language for NewPipe.\n    // The following code will migrate any existing custom app language in SharedPreferences to\n    // use the public per-app language APIs instead.\n    // For reference, see\n    // https://android-developers.googleblog.com/2022/11/per-app-language-preferences-part-1.html\n    public static void migrateAppLanguageSettingIfNecessary(@NonNull final Context context) {\n        final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);\n        final String appLanguageKey = context.getString(R.string.app_language_key);\n        final String appLanguageValue = sp.getString(appLanguageKey, null);\n        if (appLanguageValue != null) {\n            // The app language key is used on Android versions < 33\n            // for more info, see ContentSettingsFragment\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n                sp.edit().remove(appLanguageKey).apply();\n            }\n            final String appLanguageDefaultValue =\n                    context.getString(R.string.default_localization_key);\n            if (!appLanguageValue.equals(appLanguageDefaultValue)) {\n                try {\n                    AppCompatDelegate.setApplicationLocales(\n                        LocaleListCompat.forLanguageTags(appLanguageValue));\n                } catch (final RuntimeException e) {\n                    Log.e(TAG, \"Failed to migrate previous custom app language \"\n                            + \"setting to public per-app language APIs\"\n                    );\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java",
    "content": "package org.schabi.newpipe.util;\n\nimport static android.text.TextUtils.isEmpty;\nimport static org.schabi.newpipe.util.ListHelper.getUrlAndNonTorrentStreams;\n\nimport android.annotation.SuppressLint;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.core.content.ContextCompat;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentActivity;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.fragment.app.FragmentTransaction;\n\nimport com.jakewharton.processphoenix.ProcessPhoenix;\n\nimport org.schabi.newpipe.MainActivity;\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.RouterActivity;\nimport org.schabi.newpipe.about.AboutActivity;\nimport org.schabi.newpipe.database.feed.model.FeedGroupEntity;\nimport org.schabi.newpipe.download.DownloadActivity;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.comments.CommentsInfoItem;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.DeliveryMethod;\nimport org.schabi.newpipe.extractor.stream.Stream;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\nimport org.schabi.newpipe.fragments.MainFragment;\nimport org.schabi.newpipe.fragments.detail.VideoDetailFragment;\nimport org.schabi.newpipe.fragments.list.channel.ChannelFragment;\nimport org.schabi.newpipe.fragments.list.comments.CommentRepliesFragment;\nimport org.schabi.newpipe.fragments.list.kiosk.KioskFragment;\nimport org.schabi.newpipe.fragments.list.playlist.PlaylistFragment;\nimport org.schabi.newpipe.fragments.list.search.SearchFragment;\nimport org.schabi.newpipe.local.bookmark.BookmarkFragment;\nimport org.schabi.newpipe.local.feed.FeedFragment;\nimport org.schabi.newpipe.local.history.StatisticsPlaylistFragment;\nimport org.schabi.newpipe.local.playlist.LocalPlaylistFragment;\nimport org.schabi.newpipe.local.subscription.SubscriptionFragment;\nimport org.schabi.newpipe.local.subscription.SubscriptionsImportFragment;\nimport org.schabi.newpipe.player.PlayQueueActivity;\nimport org.schabi.newpipe.player.Player;\nimport org.schabi.newpipe.player.PlayerIntentType;\nimport org.schabi.newpipe.player.PlayerService;\nimport org.schabi.newpipe.player.PlayerType;\nimport org.schabi.newpipe.player.TimestampChangeData;\nimport org.schabi.newpipe.player.helper.PlayerHelper;\nimport org.schabi.newpipe.player.helper.PlayerHolder;\nimport org.schabi.newpipe.player.playqueue.PlayQueue;\nimport org.schabi.newpipe.player.playqueue.PlayQueueItem;\nimport org.schabi.newpipe.settings.SettingsActivity;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\n\nimport java.util.List;\nimport java.util.Optional;\n\npublic final class NavigationHelper {\n    public static final String MAIN_FRAGMENT_TAG = \"main_fragment_tag\";\n    public static final String SEARCH_FRAGMENT_TAG = \"search_fragment_tag\";\n\n    private static final String TAG = NavigationHelper.class.getSimpleName();\n\n    private NavigationHelper() {\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Players\n    //////////////////////////////////////////////////////////////////////////*/\n    /* INTENT */\n    @NonNull\n    public static <T> Intent getPlayerIntent(@NonNull final Context context,\n                                             @NonNull final Class<T> targetClazz,\n                                             @Nullable final PlayQueue playQueue,\n                                             @NonNull final PlayerIntentType playerIntentType) {\n        final String cacheKey = Optional.ofNullable(playQueue)\n                .map(queue -> SerializedCache.getInstance().put(queue, PlayQueue.class))\n                .orElse(null);\n        return new Intent(context, targetClazz)\n                .putExtra(Player.PLAY_QUEUE_KEY, cacheKey)\n                .putExtra(Player.PLAYER_TYPE, PlayerType.MAIN)\n                .putExtra(PlayerService.SHOULD_START_FOREGROUND_EXTRA, true)\n                .putExtra(Player.PLAYER_INTENT_TYPE, playerIntentType);\n    }\n\n    @NonNull\n    public static Intent getPlayerTimestampIntent(@NonNull final Context context,\n                                                  @NonNull final TimestampChangeData data) {\n        return new Intent(context, PlayerService.class)\n                .putExtra(Player.PLAYER_INTENT_TYPE, PlayerIntentType.TimestampChange)\n                .putExtra(Player.PLAYER_INTENT_DATA, data);\n    }\n\n    @NonNull\n    public static <T> Intent getPlayerEnqueueNextIntent(@NonNull final Context context,\n                                                        @NonNull final Class<T> targetClazz,\n                                                        @Nullable final PlayQueue playQueue) {\n        return getPlayerIntent(context, targetClazz, playQueue, PlayerIntentType.EnqueueNext)\n                // see comment in `getPlayerEnqueueIntent` as to why `resumePlayback` is false\n                .putExtra(Player.RESUME_PLAYBACK, false);\n    }\n\n    /* PLAY */\n    public static void playOnMainPlayer(final AppCompatActivity activity,\n                                        @NonNull final PlayQueue playQueue) {\n        final PlayQueueItem item = playQueue.getItem();\n        if (item != null) {\n            openVideoDetailFragment(activity, activity.getSupportFragmentManager(),\n                    item.getServiceId(), item.getUrl(), item.getTitle(), playQueue,\n                    false);\n        }\n    }\n\n    public static void playOnMainPlayer(final Context context,\n                                        @NonNull final PlayQueue playQueue,\n                                        final boolean switchingPlayers) {\n        final PlayQueueItem item = playQueue.getItem();\n        if (item != null) {\n            openVideoDetail(context,\n                    item.getServiceId(), item.getUrl(), item.getTitle(), playQueue,\n                    switchingPlayers);\n        }\n    }\n\n    public static void playOnPopupPlayer(final Context context,\n                                         final PlayQueue queue,\n                                         final boolean resumePlayback) {\n        if (!PermissionHelper.isPopupEnabledElseAsk(context)) {\n            return;\n        }\n\n        Toast.makeText(context, R.string.popup_playing_toast, Toast.LENGTH_SHORT).show();\n\n        final var intent = getPlayerIntent(context, PlayerService.class, queue,\n                PlayerIntentType.AllOthers)\n                .putExtra(Player.PLAYER_TYPE, PlayerType.POPUP)\n                .putExtra(Player.RESUME_PLAYBACK, resumePlayback);\n        ContextCompat.startForegroundService(context, intent);\n    }\n\n    public static void playOnBackgroundPlayer(final Context context,\n                                              final PlayQueue queue,\n                                              final boolean resumePlayback) {\n        Toast.makeText(context, R.string.background_player_playing_toast, Toast.LENGTH_SHORT)\n                .show();\n\n        final Intent intent = getPlayerIntent(context, PlayerService.class, queue,\n                PlayerIntentType.AllOthers)\n                .putExtra(Player.PLAYER_TYPE, PlayerType.AUDIO)\n                .putExtra(Player.RESUME_PLAYBACK, resumePlayback);\n        ContextCompat.startForegroundService(context, intent);\n    }\n\n    /* ENQUEUE */\n    public static void enqueueOnPlayer(final Context context,\n                                       final PlayQueue queue,\n                                       final PlayerType playerType) {\n        if (playerType == PlayerType.POPUP && !PermissionHelper.isPopupEnabledElseAsk(context)) {\n            return;\n        }\n\n        Toast.makeText(context, R.string.enqueued, Toast.LENGTH_SHORT).show();\n\n        // when enqueueing `resumePlayback` is always `false` since:\n        // - if there is a video already playing, the value of `resumePlayback` just doesn't make\n        //   any difference.\n        // - if there is nothing already playing, it is useful for the enqueue action to have a\n        //   slightly different behaviour than the normal play action: the latter resumes playback,\n        //   the former doesn't. (note that enqueue can be triggered when nothing is playing only\n        //   by long pressing the video detail fragment, playlist or channel controls\n        final Intent intent = getPlayerIntent(context, PlayerService.class, queue,\n                PlayerIntentType.Enqueue)\n                .putExtra(Player.RESUME_PLAYBACK, false)\n                .putExtra(Player.PLAYER_TYPE, playerType);\n        ContextCompat.startForegroundService(context, intent);\n    }\n\n    public static void enqueueOnPlayer(final Context context, final PlayQueue queue) {\n        PlayerType playerType = PlayerHolder.getInstance().getType();\n        if (playerType == null) {\n            Log.e(TAG, \"Enqueueing but no player is open; defaulting to background player\");\n            playerType = PlayerType.AUDIO;\n        }\n\n        enqueueOnPlayer(context, queue, playerType);\n    }\n\n    /* ENQUEUE NEXT */\n    public static void enqueueNextOnPlayer(final Context context, final PlayQueue queue) {\n        PlayerType playerType = PlayerHolder.getInstance().getType();\n        if (playerType == null) {\n            Log.e(TAG, \"Enqueueing next but no player is open; defaulting to background player\");\n            playerType = PlayerType.AUDIO;\n        }\n        Toast.makeText(context, R.string.enqueued_next, Toast.LENGTH_SHORT).show();\n        final Intent intent = getPlayerEnqueueNextIntent(context, PlayerService.class, queue)\n                .putExtra(Player.PLAYER_TYPE, playerType);\n        ContextCompat.startForegroundService(context, intent);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // External Players\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public static void playOnExternalAudioPlayer(@NonNull final Context context,\n                                                 @NonNull final StreamInfo info) {\n        final List<AudioStream> audioStreams = info.getAudioStreams();\n        if (audioStreams == null || audioStreams.isEmpty()) {\n            Toast.makeText(context, R.string.audio_streams_empty, Toast.LENGTH_SHORT).show();\n            return;\n        }\n\n        final List<AudioStream> audioStreamsForExternalPlayers =\n                getUrlAndNonTorrentStreams(audioStreams);\n        if (audioStreamsForExternalPlayers.isEmpty()) {\n            Toast.makeText(context, R.string.no_audio_streams_available_for_external_players,\n                    Toast.LENGTH_SHORT).show();\n            return;\n        }\n\n        final int index = ListHelper.getDefaultAudioFormat(context, audioStreamsForExternalPlayers);\n        final AudioStream audioStream = audioStreamsForExternalPlayers.get(index);\n\n        playOnExternalPlayer(context, info.getName(), info.getUploaderName(), audioStream);\n    }\n\n    public static void playOnExternalVideoPlayer(final Context context,\n                                                 @NonNull final StreamInfo info) {\n        final List<VideoStream> videoStreams = info.getVideoStreams();\n        if (videoStreams == null || videoStreams.isEmpty()) {\n            Toast.makeText(context, R.string.video_streams_empty, Toast.LENGTH_SHORT).show();\n            return;\n        }\n\n        final List<VideoStream> videoStreamsForExternalPlayers =\n                ListHelper.getSortedStreamVideosList(context,\n                        getUrlAndNonTorrentStreams(videoStreams), null, false, false);\n        if (videoStreamsForExternalPlayers.isEmpty()) {\n            Toast.makeText(context, R.string.no_video_streams_available_for_external_players,\n                    Toast.LENGTH_SHORT).show();\n            return;\n        }\n\n        final int index = ListHelper.getDefaultResolutionIndex(context,\n                videoStreamsForExternalPlayers);\n\n        final VideoStream videoStream = videoStreamsForExternalPlayers.get(index);\n        playOnExternalPlayer(context, info.getName(), info.getUploaderName(), videoStream);\n    }\n\n    public static void playOnExternalPlayer(@NonNull final Context context,\n                                            @Nullable final String name,\n                                            @Nullable final String artist,\n                                            @NonNull final Stream stream) {\n        final DeliveryMethod deliveryMethod = stream.getDeliveryMethod();\n        final String mimeType;\n\n        if (!stream.isUrl() || deliveryMethod == DeliveryMethod.TORRENT) {\n            Toast.makeText(context, R.string.selected_stream_external_player_not_supported,\n                    Toast.LENGTH_SHORT).show();\n            return;\n        }\n\n        switch (deliveryMethod) {\n            case PROGRESSIVE_HTTP:\n                if (stream.getFormat() == null) {\n                    if (stream instanceof AudioStream) {\n                        mimeType = \"audio/*\";\n                    } else if (stream instanceof VideoStream) {\n                        mimeType = \"video/*\";\n                    } else {\n                        // This should never be reached, because subtitles are not opened in\n                        // external players\n                        return;\n                    }\n                } else {\n                    mimeType = stream.getFormat().getMimeType();\n                }\n                break;\n            case HLS:\n                mimeType = \"application/x-mpegURL\";\n                break;\n            case DASH:\n                mimeType = \"application/dash+xml\";\n                break;\n            case SS:\n                mimeType = \"application/vnd.ms-sstr+xml\";\n                break;\n            default:\n                // Torrent streams are not exposed to external players\n                mimeType = \"\";\n        }\n\n        final Intent intent = new Intent();\n        intent.setAction(Intent.ACTION_VIEW);\n        intent.setDataAndType(Uri.parse(stream.getContent()), mimeType);\n        intent.putExtra(Intent.EXTRA_TITLE, name);\n        intent.putExtra(\"title\", name);\n        intent.putExtra(\"artist\", artist);\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n\n        resolveActivityOrAskToInstall(context, intent);\n    }\n\n    public static void resolveActivityOrAskToInstall(@NonNull final Context context,\n                                                     @NonNull final Intent intent) {\n        if (!ShareUtils.tryOpenIntentInApp(context, intent)) {\n            if (context instanceof Activity) {\n                new AlertDialog.Builder(context)\n                        .setMessage(R.string.no_player_found)\n                        .setPositiveButton(R.string.install, (dialog, which) ->\n                                ShareUtils.installApp(context,\n                                        context.getString(R.string.vlc_package)))\n                        .setNegativeButton(R.string.cancel, (dialog, which) ->\n                                Log.i(\"NavigationHelper\", \"You unlocked a secret unicorn.\"))\n                        .show();\n            } else {\n                Toast.makeText(context, R.string.no_player_found_toast, Toast.LENGTH_LONG).show();\n            }\n        }\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Through FragmentManager\n    //////////////////////////////////////////////////////////////////////////*/\n\n    @SuppressLint(\"CommitTransaction\")\n    private static FragmentTransaction defaultTransaction(final FragmentManager fragmentManager) {\n        return fragmentManager.beginTransaction()\n                .setCustomAnimations(R.animator.custom_fade_in, R.animator.custom_fade_out,\n                        R.animator.custom_fade_in, R.animator.custom_fade_out);\n    }\n\n    public static void gotoMainFragment(final FragmentManager fragmentManager) {\n        final boolean popped = fragmentManager.popBackStackImmediate(MAIN_FRAGMENT_TAG, 0);\n        if (!popped) {\n            openMainFragment(fragmentManager);\n        }\n    }\n\n    public static void openMainFragment(final FragmentManager fragmentManager) {\n        InfoCache.getInstance().trimCache();\n\n        fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_holder, new MainFragment())\n                .addToBackStack(MAIN_FRAGMENT_TAG)\n                .commit();\n    }\n\n    public static boolean tryGotoSearchFragment(final FragmentManager fragmentManager) {\n        if (MainActivity.DEBUG) {\n            for (int i = 0; i < fragmentManager.getBackStackEntryCount(); i++) {\n                Log.d(\"NavigationHelper\", \"tryGoToSearchFragment() [\" + i + \"]\"\n                        + \" = [\" + fragmentManager.getBackStackEntryAt(i) + \"]\");\n            }\n        }\n\n        return fragmentManager.popBackStackImmediate(SEARCH_FRAGMENT_TAG, 0);\n    }\n\n    public static void openSearchFragment(final FragmentManager fragmentManager,\n                                          final int serviceId, final String searchString) {\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_holder, SearchFragment.getInstance(serviceId, searchString))\n                .addToBackStack(SEARCH_FRAGMENT_TAG)\n                .commit();\n    }\n\n    public static void expandMainPlayer(final Context context) {\n        context.sendBroadcast(new Intent(VideoDetailFragment.ACTION_SHOW_MAIN_PLAYER));\n    }\n\n    public static void sendPlayerStartedEvent(final Context context) {\n        context.sendBroadcast(new Intent(VideoDetailFragment.ACTION_PLAYER_STARTED));\n    }\n\n    public static void showMiniPlayer(final FragmentManager fragmentManager) {\n        final VideoDetailFragment instance = VideoDetailFragment.getInstanceInCollapsedState();\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_player_holder, instance)\n                .runOnCommit(() -> sendPlayerStartedEvent(instance.requireActivity()))\n                .commitAllowingStateLoss();\n    }\n\n    private interface RunnableWithVideoDetailFragment {\n        void run(VideoDetailFragment detailFragment);\n    }\n\n    public static void openVideoDetailFragment(@NonNull final Context context,\n                                               @NonNull final FragmentManager fragmentManager,\n                                               final int serviceId,\n                                               @Nullable final String url,\n                                               @NonNull final String title,\n                                               @Nullable final PlayQueue playQueue,\n                                               final boolean switchingPlayers) {\n\n        final boolean autoPlay;\n        @Nullable final PlayerType playerType = PlayerHolder.getInstance().getType();\n        if (playerType == null) {\n            // no player open\n            autoPlay = PlayerHelper.isAutoplayAllowedByUser(context);\n        } else if (switchingPlayers) {\n            // switching player to main player\n            autoPlay = PlayerHolder.getInstance().isPlaying(); // keep play/pause state\n        } else if (playerType == PlayerType.MAIN) {\n            // opening new stream while already playing in main player\n            autoPlay = PlayerHelper.isAutoplayAllowedByUser(context);\n        } else {\n            // opening new stream while already playing in another player\n            autoPlay = false;\n        }\n\n        final RunnableWithVideoDetailFragment onVideoDetailFragmentReady = detailFragment -> {\n            expandMainPlayer(detailFragment.requireActivity());\n            detailFragment.setAutoPlay(autoPlay);\n            if (switchingPlayers) {\n                // Situation when user switches from players to main player. All needed data is\n                // here, we can start watching (assuming newQueue equals playQueue).\n                // Starting directly in fullscreen if the previous player type was popup.\n                detailFragment.openVideoPlayer(playerType == PlayerType.POPUP\n                        || PlayerHelper.isStartMainPlayerFullscreenEnabled(context));\n            } else {\n                detailFragment.selectAndLoadVideo(serviceId, url, title, playQueue);\n            }\n            detailFragment.scrollToTop();\n        };\n\n        final Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_player_holder);\n        if (fragment instanceof VideoDetailFragment && fragment.isVisible()) {\n            onVideoDetailFragmentReady.run((VideoDetailFragment) fragment);\n        } else {\n            // Specify no url here, otherwise the VideoDetailFragment will start loading the\n            // stream automatically if it's the first time it is being opened, but then\n            // onVideoDetailFragmentReady will kick in and start another loading process.\n            // See VideoDetailFragment.wasCleared() and its usage in doInitialLoadLogic().\n            final VideoDetailFragment instance = VideoDetailFragment\n                    .getInstance(serviceId, null, title, playQueue);\n            instance.setAutoPlay(autoPlay);\n\n            defaultTransaction(fragmentManager)\n                    .replace(R.id.fragment_player_holder, instance)\n                    .runOnCommit(() -> onVideoDetailFragmentReady.run(instance))\n                    .commit();\n        }\n    }\n\n    public static void openChannelFragment(final FragmentManager fragmentManager,\n                                           final int serviceId, final String url,\n                                           @NonNull final String name) {\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_holder, ChannelFragment.getInstance(serviceId, url, name))\n                .addToBackStack(null)\n                .commit();\n    }\n\n    public static void openChannelFragment(@NonNull final Fragment fragment,\n                                           @NonNull final StreamInfoItem item,\n                                           final String uploaderUrl) {\n        // For some reason `getParentFragmentManager()` doesn't work, but this does.\n        openChannelFragment(\n                fragment.requireActivity().getSupportFragmentManager(),\n                item.getServiceId(), uploaderUrl, item.getUploaderName());\n    }\n\n    /**\n     * Opens the comment author channel fragment, if the {@link CommentsInfoItem#getUploaderUrl()}\n     * of {@code comment} is non-null. Shows a UI-error snackbar if something goes wrong.\n     *\n     * @param activity the activity with the fragment manager and in which to show the snackbar\n     * @param comment the comment whose uploader/author will be opened\n     */\n    public static void openCommentAuthorIfPresent(@NonNull final FragmentActivity activity,\n                                                  @NonNull final CommentsInfoItem comment) {\n        if (isEmpty(comment.getUploaderUrl())) {\n            return;\n        }\n        try {\n            openChannelFragment(activity.getSupportFragmentManager(), comment.getServiceId(),\n                    comment.getUploaderUrl(), comment.getUploaderName());\n        } catch (final Exception e) {\n            ErrorUtil.showUiErrorSnackbar(activity, \"Opening channel fragment\", e);\n        }\n    }\n\n    public static void openCommentRepliesFragment(@NonNull final FragmentActivity activity,\n                                                  @NonNull final CommentsInfoItem comment) {\n        closeCommentRepliesFragments(activity);\n        defaultTransaction(activity.getSupportFragmentManager())\n                .replace(R.id.fragment_holder, new CommentRepliesFragment(comment),\n                        CommentRepliesFragment.TAG)\n                .addToBackStack(CommentRepliesFragment.TAG)\n                .commit();\n    }\n\n    /**\n     * Closes all open {@link CommentRepliesFragment}s in {@code activity},\n     * including those that are not at the top of the back stack.\n     * This is needed to prevent multiple open CommentRepliesFragments\n     * Ideally there should only be one since we remove existing before opening a new one.\n     * @param activity the activity in which to close the CommentRepliesFragments\n     */\n    public static void closeCommentRepliesFragments(@NonNull final FragmentActivity activity) {\n        final FragmentManager fm = activity.getSupportFragmentManager();\n\n        // Remove all existing fragment instances tagged as CommentRepliesFragment\n        final FragmentTransaction tx = defaultTransaction(fm);\n        boolean removed = false;\n        for (final Fragment fragment : fm.getFragments()) {\n            if (fragment != null && CommentRepliesFragment.TAG.equals(fragment.getTag())) {\n                tx.remove(fragment);\n                removed = true;\n            }\n        }\n        if (removed) {\n            tx.commit();\n        }\n\n        // Only pop back stack entries named CommentRepliesFragment.TAG if they are at the top.\n        while (fm.getBackStackEntryCount() > 0\n                && CommentRepliesFragment.TAG.equals(\n                        fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName()\n                    )\n        ) {\n            fm.popBackStackImmediate(CommentRepliesFragment.TAG,\n                    FragmentManager.POP_BACK_STACK_INCLUSIVE);\n        }\n\n    }\n\n    public static void openPlaylistFragment(final FragmentManager fragmentManager,\n                                            final int serviceId, final String url,\n                                            @NonNull final String name) {\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_holder, PlaylistFragment.getInstance(serviceId, url, name))\n                .addToBackStack(null)\n                .commit();\n    }\n\n    public static void openFeedFragment(final FragmentManager fragmentManager) {\n        openFeedFragment(fragmentManager, FeedGroupEntity.GROUP_ALL_ID, null);\n    }\n\n    public static void openFeedFragment(final FragmentManager fragmentManager, final long groupId,\n                                        @Nullable final String groupName) {\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_holder, FeedFragment.newInstance(groupId, groupName))\n                .addToBackStack(null)\n                .commit();\n    }\n\n    public static void openBookmarksFragment(final FragmentManager fragmentManager) {\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_holder, new BookmarkFragment())\n                .addToBackStack(null)\n                .commit();\n    }\n\n    public static void openSubscriptionFragment(final FragmentManager fragmentManager) {\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_holder, new SubscriptionFragment())\n                .addToBackStack(null)\n                .commit();\n    }\n\n    public static void openKioskFragment(final FragmentManager fragmentManager, final int serviceId,\n                                         final String kioskId) throws ExtractionException {\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_holder, KioskFragment.getInstance(serviceId, kioskId))\n                .addToBackStack(null)\n                .commit();\n    }\n\n    public static void openLocalPlaylistFragment(final FragmentManager fragmentManager,\n                                                 final long playlistId, final String name) {\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_holder, LocalPlaylistFragment.getInstance(playlistId,\n                        name == null ? \"\" : name))\n                .addToBackStack(null)\n                .commit();\n    }\n\n    public static void openStatisticFragment(final FragmentManager fragmentManager) {\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_holder, new StatisticsPlaylistFragment())\n                .addToBackStack(null)\n                .commit();\n    }\n\n    public static void openSubscriptionsImportFragment(final FragmentManager fragmentManager,\n                                                       final int serviceId) {\n        defaultTransaction(fragmentManager)\n                .replace(R.id.fragment_holder, SubscriptionsImportFragment.getInstance(serviceId))\n                .addToBackStack(null)\n                .commit();\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Through Intents\n    //////////////////////////////////////////////////////////////////////////*/\n\n    public static void openSearch(final Context context, final int serviceId,\n                                  final String searchString) {\n        final Intent mIntent = new Intent(context, MainActivity.class);\n        mIntent.putExtra(Constants.KEY_SERVICE_ID, serviceId);\n        mIntent.putExtra(Constants.KEY_SEARCH_STRING, searchString);\n        mIntent.putExtra(Constants.KEY_OPEN_SEARCH, true);\n        context.startActivity(mIntent);\n    }\n\n    public static void openVideoDetail(final Context context,\n                                       final int serviceId,\n                                       final String url,\n                                       @NonNull final String title,\n                                       @Nullable final PlayQueue playQueue,\n                                       final boolean switchingPlayers) {\n\n        final Intent intent = getStreamIntent(context, serviceId, url, title)\n                .putExtra(VideoDetailFragment.KEY_SWITCHING_PLAYERS, switchingPlayers);\n\n        if (playQueue != null) {\n            final String cacheKey = SerializedCache.getInstance().put(playQueue, PlayQueue.class);\n            if (cacheKey != null) {\n                intent.putExtra(Player.PLAY_QUEUE_KEY, cacheKey);\n            }\n        }\n        context.startActivity(intent);\n    }\n\n    /**\n     * Opens {@link ChannelFragment}.\n     * Use this instead of {@link #openChannelFragment(FragmentManager, int, String, String)}\n     * when no fragments are used / no FragmentManager is available.\n     * @param context\n     * @param serviceId\n     * @param url\n     * @param title\n     */\n    public static void openChannelFragmentUsingIntent(final Context context,\n                                                      final int serviceId,\n                                                      final String url,\n                                                      @NonNull final String title) {\n        final Intent intent = getOpenIntent(context, url, serviceId,\n                StreamingService.LinkType.CHANNEL);\n        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        intent.putExtra(Constants.KEY_TITLE, title);\n\n        context.startActivity(intent);\n    }\n\n    public static void openMainActivity(final Context context) {\n        final Intent mIntent = new Intent(context, MainActivity.class);\n        mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        mIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);\n        context.startActivity(mIntent);\n    }\n\n    public static void openRouterActivity(final Context context, final String url) {\n        final Intent mIntent = new Intent(context, RouterActivity.class);\n        mIntent.setData(Uri.parse(url));\n        context.startActivity(mIntent);\n    }\n\n    public static void openAbout(final Context context) {\n        final Intent intent = new Intent(context, AboutActivity.class);\n        context.startActivity(intent);\n    }\n\n    public static void openSettings(final Context context) {\n        final Intent intent = new Intent(context, SettingsActivity.class);\n        context.startActivity(intent);\n    }\n\n    public static void openDownloads(final Activity activity) {\n        if (PermissionHelper.checkStoragePermissions(\n                activity, PermissionHelper.DOWNLOADS_REQUEST_CODE)) {\n            final Intent intent = new Intent(activity, DownloadActivity.class);\n            activity.startActivity(intent);\n        }\n    }\n\n    public static Intent getPlayQueueActivityIntent(final Context context) {\n        final Intent intent = new Intent(context, PlayQueueActivity.class);\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {\n            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        }\n        return intent;\n    }\n\n    public static void openPlayQueue(final Context context) {\n        final Intent intent = new Intent(context, PlayQueueActivity.class);\n        context.startActivity(intent);\n    }\n\n    /*//////////////////////////////////////////////////////////////////////////\n    // Link handling\n    //////////////////////////////////////////////////////////////////////////*/\n\n    private static Intent getOpenIntent(final Context context, final String url,\n                                        final int serviceId, final StreamingService.LinkType type) {\n        final Intent mIntent = new Intent(context, MainActivity.class);\n        mIntent.putExtra(Constants.KEY_SERVICE_ID, serviceId);\n        mIntent.putExtra(Constants.KEY_URL, url);\n        mIntent.putExtra(Constants.KEY_LINK_TYPE, type);\n        return mIntent;\n    }\n\n    public static Intent getIntentByLink(final Context context, final String url)\n            throws ExtractionException {\n        return getIntentByLink(context, NewPipe.getServiceByUrl(url), url);\n    }\n\n    public static Intent getIntentByLink(final Context context,\n                                         final StreamingService service,\n                                         final String url) throws ExtractionException {\n        final StreamingService.LinkType linkType = service.getLinkTypeByUrl(url);\n\n        if (linkType == StreamingService.LinkType.NONE) {\n            throw new ExtractionException(\"Url not known to service. service=\" + service\n                    + \" url=\" + url);\n        }\n\n        return getOpenIntent(context, url, service.getServiceId(), linkType);\n    }\n\n    public static Intent getChannelIntent(final Context context,\n                                          final int serviceId,\n                                          final String url) {\n        return getOpenIntent(context, url, serviceId, StreamingService.LinkType.CHANNEL);\n    }\n\n    public static Intent getStreamIntent(final Context context,\n                                         final int serviceId,\n                                         final String url,\n                                         @Nullable final String title) {\n        return getOpenIntent(context, url, serviceId, StreamingService.LinkType.STREAM)\n                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n                .putExtra(Constants.KEY_TITLE, title);\n    }\n\n    /**\n     * Finish this <code>Activity</code> as well as all <code>Activities</code> running below it\n     * and then start <code>MainActivity</code>.\n     *\n     * @param activity the activity to finish\n     */\n    public static void restartApp(final Activity activity) {\n        NewPipeDatabase.close();\n\n        ProcessPhoenix.triggerRebirth(activity.getApplicationContext());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/NewPipeTextViewHelper.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2021-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.util\n\nimport android.text.Selection\nimport android.text.Spannable\nimport android.widget.TextView\nimport org.schabi.newpipe.util.external_communication.ShareUtils\n\nobject NewPipeTextViewHelper {\n    /**\n     * Share the selected text of [NewPipeTextViews][org.schabi.newpipe.views.NewPipeTextView] and\n     * [NewPipeEditTexts][org.schabi.newpipe.views.NewPipeEditText] with\n     * [ShareUtils.shareText].\n     *\n     *\n     *\n     * This allows EMUI users to get the Android share sheet instead of the EMUI share sheet when\n     * using the `Share` command of the popup menu which appears when selecting text.\n     *\n     *\n     * @param textView the [TextView] on which sharing the selected text. It should be a\n     * [org.schabi.newpipe.views.NewPipeTextView] or a [org.schabi.newpipe.views.NewPipeEditText]\n     * (even if [standard TextViews][TextView] are supported).\n     */\n    @JvmStatic\n    fun shareSelectedTextWithShareUtils(textView: TextView) {\n        val textViewText = textView.getText()\n        shareSelectedTextIfNotNullAndNotEmpty(textView, getSelectedText(textView, textViewText))\n        if (textViewText is Spannable) {\n            Selection.setSelection(textViewText, textView.selectionEnd)\n        }\n    }\n\n    private fun getSelectedText(textView: TextView, text: CharSequence?): CharSequence? {\n        if (!textView.hasSelection() || text == null) {\n            return null\n        }\n\n        val start = textView.selectionStart\n        val end = textView.selectionEnd\n        return if (start > end) {\n            text.subSequence(end, start)\n        } else {\n            text.subSequence(start, end)\n        }\n    }\n\n    private fun shareSelectedTextIfNotNullAndNotEmpty(\n        textView: TextView,\n        selectedText: CharSequence?\n    ) {\n        if (!selectedText.isNullOrEmpty()) {\n            ShareUtils.shareText(textView.context, \"\", selectedText.toString())\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/OnClickGesture.java",
    "content": "package org.schabi.newpipe.util;\n\nimport androidx.recyclerview.widget.RecyclerView;\n\npublic interface OnClickGesture<T> {\n    void selected(T selectedItem);\n\n    default void held(final T selectedItem) {\n        // Optional gesture\n    }\n\n    default void drag(final T selectedItem, final RecyclerView.ViewHolder viewHolder) {\n        // Optional gesture\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/PeertubeHelper.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2019-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.util\n\nimport android.content.Context\nimport androidx.core.content.edit\nimport androidx.preference.PreferenceManager\nimport com.grack.nanojson.JsonObject\nimport com.grack.nanojson.JsonParser\nimport com.grack.nanojson.JsonWriter\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.extractor.ServiceList\nimport org.schabi.newpipe.extractor.services.peertube.PeertubeInstance\n\nobject PeertubeHelper {\n\n    @JvmStatic\n    val currentInstance: PeertubeInstance\n        get() = ServiceList.PeerTube.instance\n\n    @JvmStatic\n    fun getInstanceList(context: Context): List<PeertubeInstance> {\n        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)\n        val savedInstanceListKey = context.getString(R.string.peertube_instance_list_key)\n        val savedJson = sharedPreferences.getString(savedInstanceListKey, null)\n            ?: return listOf(currentInstance)\n\n        return runCatching {\n            JsonParser.`object`().from(savedJson).getArray(\"instances\")\n                .filterIsInstance<JsonObject>()\n                .map { PeertubeInstance(it.getString(\"url\"), it.getString(\"name\")) }\n        }.getOrDefault(listOf(currentInstance))\n    }\n\n    @JvmStatic\n    fun selectInstance(instance: PeertubeInstance, context: Context): PeertubeInstance {\n        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)\n        val selectedInstanceKey = context.getString(R.string.peertube_selected_instance_key)\n\n        val jsonWriter = JsonWriter.string().`object`()\n        jsonWriter.value(\"name\", instance.name)\n        jsonWriter.value(\"url\", instance.url)\n        val jsonToSave = jsonWriter.end().done()\n\n        sharedPreferences.edit { putString(selectedInstanceKey, jsonToSave) }\n        ServiceList.PeerTube.instance = instance\n        return instance\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/PermissionHelper.java",
    "content": "package org.schabi.newpipe.util;\n\nimport android.Manifest;\nimport android.app.Activity;\nimport android.content.ActivityNotFoundException;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.PackageManager;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.provider.Settings;\nimport android.text.Html;\nimport android.widget.Toast;\n\nimport androidx.annotation.RequiresApi;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.core.app.ActivityCompat;\nimport androidx.core.content.ContextCompat;\n\nimport org.schabi.newpipe.App;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.settings.NewPipeSettings;\n\npublic final class PermissionHelper {\n    public static final int POST_NOTIFICATIONS_REQUEST_CODE = 779;\n    public static final int DOWNLOAD_DIALOG_REQUEST_CODE = 778;\n    public static final int DOWNLOADS_REQUEST_CODE = 777;\n\n    private PermissionHelper() { }\n\n    public static boolean checkStoragePermissions(final Activity activity, final int requestCode) {\n        if (NewPipeSettings.useStorageAccessFramework(activity)) {\n            return true; // Storage permissions are not needed for SAF\n        }\n\n        if (!checkReadStoragePermissions(activity, requestCode)) {\n            return false;\n        }\n        return checkWriteStoragePermissions(activity, requestCode);\n    }\n\n    public static boolean checkReadStoragePermissions(final Activity activity,\n                                                      final int requestCode) {\n        if (ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE)\n                != PackageManager.PERMISSION_GRANTED) {\n            ActivityCompat.requestPermissions(activity,\n                    new String[]{\n                            Manifest.permission.READ_EXTERNAL_STORAGE,\n                            Manifest.permission.WRITE_EXTERNAL_STORAGE},\n                    requestCode);\n\n            return false;\n        }\n        return true;\n    }\n\n\n    public static boolean checkWriteStoragePermissions(final Activity activity,\n                                                       final int requestCode) {\n        // Here, thisActivity is the current activity\n        if (ContextCompat.checkSelfPermission(activity,\n                Manifest.permission.WRITE_EXTERNAL_STORAGE)\n                != PackageManager.PERMISSION_GRANTED) {\n\n            // Should we show an explanation?\n            /*if (ActivityCompat.shouldShowRequestPermissionRationale(activity,\n                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {\n\n                // Show an explanation to the user *asynchronously* -- don't block\n                // this thread waiting for the user's response! After the user\n                // sees the explanation, try again to request the permission.\n            } else {*/\n\n            // No explanation needed, we can request the permission.\n            ActivityCompat.requestPermissions(activity,\n                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode);\n\n            // PERMISSION_WRITE_STORAGE is an\n            // app-defined int constant. The callback method gets the\n            // result of the request.\n            /*}*/\n            return false;\n        }\n        return true;\n    }\n\n    public static boolean checkPostNotificationsPermission(final Activity activity,\n                                                           final int requestCode) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU\n                && ContextCompat.checkSelfPermission(activity,\n                Manifest.permission.POST_NOTIFICATIONS)\n                != PackageManager.PERMISSION_GRANTED) {\n            if (!App.getInstance().getNotificationsRequested()) {\n                ActivityCompat.requestPermissions(activity,\n                        new String[]{Manifest.permission.POST_NOTIFICATIONS}, requestCode);\n                App.getInstance().setNotificationsRequested();\n                return false;\n            }\n        }\n        return true;\n    }\n\n    /**\n     * In order to be able to draw over other apps,\n     * the permission android.permission.SYSTEM_ALERT_WINDOW have to be granted.\n     * <p>\n     * On < API 23 (MarshMallow) the permission was granted\n     * when the user installed the application (via AndroidManifest),\n     * on > 23, however, it have to start a activity asking the user if he agrees.\n     * </p>\n     * <p>\n     * This method just return if the app has permission to draw over other apps,\n     * and if it doesn't, it will try to get the permission.\n     * </p>\n     *\n     * @param context {@link Context}\n     * @return {@link Settings#canDrawOverlays(Context)}\n     **/\n    @RequiresApi(api = Build.VERSION_CODES.M)\n    public static boolean checkSystemAlertWindowPermission(final Context context) {\n        if (!Settings.canDrawOverlays(context)) {\n            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {\n                final Intent i = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,\n                        Uri.parse(\"package:\" + context.getPackageName()));\n                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n                try {\n                    context.startActivity(i);\n                } catch (final ActivityNotFoundException ignored) {\n                }\n                return false;\n            // from Android R the ACTION_MANAGE_OVERLAY_PERMISSION will only point to the menu,\n            // so let’s add a dialog that points the user to the right setting.\n            } else {\n                final String appName = context.getApplicationInfo()\n                        .loadLabel(context.getPackageManager()).toString();\n                final String title = context.getString(R.string.permission_display_over_apps);\n                final String permissionName =\n                        context.getString(R.string.permission_display_over_apps_permission_name);\n                final String appNameItalic = \"<i>\" + appName + \"</i>\";\n                final String permissionNameItalic = \"<i>\" + permissionName + \"</i>\";\n                final String message =\n                        context.getString(R.string.permission_display_over_apps_message,\n                                appNameItalic,\n                                permissionNameItalic\n                        );\n                new AlertDialog.Builder(context)\n                        .setTitle(title)\n                        .setMessage(Html.fromHtml(message, Html.FROM_HTML_MODE_COMPACT))\n                        .setPositiveButton(\"OK\", (dialog, which) -> {\n                            // we don’t need the package name here, since it won’t do anything on >R\n                            final Intent intent =\n                                    new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);\n                            try {\n                                context.startActivity(intent);\n                            } catch (final ActivityNotFoundException ignored) {\n                            }\n                        })\n                        .setCancelable(true)\n                        .show();\n                return false;\n            }\n\n        } else {\n            return true;\n        }\n    }\n\n    /**\n     * Determines whether the popup is enabled, and if it is not, starts the system activity to\n     * request the permission with {@link #checkSystemAlertWindowPermission(Context)} and shows a\n     * toast to the user explaining why the permission is needed.\n     *\n     * @param context the Android context\n     * @return whether the popup is enabled\n     */\n    public static boolean isPopupEnabledElseAsk(final Context context) {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M\n                || checkSystemAlertWindowPermission(context)) {\n            return true;\n        } else {\n            Toast.makeText(context, R.string.msg_popup_permission, Toast.LENGTH_LONG).show();\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/PlayButtonHelper.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2023-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.util\n\nimport android.content.Context\nimport android.view.View\nimport android.view.View.OnLongClickListener\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.preference.PreferenceManager\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.PlaylistControlBinding\nimport org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder\nimport org.schabi.newpipe.player.PlayerType\n\n/**\n * Utility class for play buttons and their respective click listeners.\n */\nobject PlayButtonHelper {\n    /**\n     * Initialize [OnClickListener][View.OnClickListener]\n     * and [OnLongClickListener][OnLongClickListener] for playlist control\n     * buttons defined in [R.layout.playlist_control].\n     *\n     * @param activity The activity to use for the [Toast][Toast].\n     * @param playlistControlBinding The binding of the\n     * [playlist control layout][R.layout.playlist_control].\n     * @param fragment The fragment to get the play queue from.\n     */\n    @JvmStatic\n    fun initPlaylistControlClickListener(\n        activity: AppCompatActivity,\n        playlistControlBinding: PlaylistControlBinding,\n        fragment: PlaylistControlViewHolder\n    ) {\n        // click listener\n        playlistControlBinding.playlistCtrlPlayAllButton.setOnClickListener {\n            NavigationHelper.playOnMainPlayer(activity, fragment.getPlayQueue())\n            showHoldToAppendToastIfNeeded(activity)\n        }\n        playlistControlBinding.playlistCtrlPlayPopupButton.setOnClickListener {\n            NavigationHelper.playOnPopupPlayer(activity, fragment.getPlayQueue(), false)\n            showHoldToAppendToastIfNeeded(activity)\n        }\n        playlistControlBinding.playlistCtrlPlayBgButton.setOnClickListener {\n            NavigationHelper.playOnBackgroundPlayer(activity, fragment.getPlayQueue(), false)\n            showHoldToAppendToastIfNeeded(activity)\n        }\n\n        // long click listener\n        playlistControlBinding.playlistCtrlPlayAllButton.setOnLongClickListener {\n            NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.MAIN)\n            true\n        }\n        playlistControlBinding.playlistCtrlPlayPopupButton.setOnLongClickListener {\n            NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.POPUP)\n            true\n        }\n        playlistControlBinding.playlistCtrlPlayBgButton.setOnLongClickListener {\n            NavigationHelper.enqueueOnPlayer(activity, fragment.getPlayQueue(), PlayerType.AUDIO)\n            true\n        }\n    }\n\n    /**\n     * Show the \"hold to append\" toast if the corresponding preference is enabled.\n     *\n     * @param context The context to show the toast.\n     */\n    private fun showHoldToAppendToastIfNeeded(context: Context) {\n        if (shouldShowHoldToAppendTip(context)) {\n            Toast.makeText(context, R.string.hold_to_append, Toast.LENGTH_SHORT).show()\n        }\n    }\n\n    /**\n     * Check if the \"hold to append\" toast should be shown.\n     *\n     *\n     *\n     * The tip is shown if the corresponding preference is enabled.\n     * This is the default behaviour.\n     *\n     *\n     * @param context The context to get the preference.\n     * @return `true` if the tip should be shown, `false` otherwise.\n     */\n    @JvmStatic\n    fun shouldShowHoldToAppendTip(context: Context): Boolean {\n        return PreferenceManager.getDefaultSharedPreferences(context)\n            .getBoolean(context.getString(R.string.show_hold_to_append_key), true)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/ReleaseVersionUtil.kt",
    "content": "package org.schabi.newpipe.util\n\nimport android.content.pm.PackageManager\nimport androidx.core.content.pm.PackageInfoCompat\nimport java.time.Instant\nimport java.time.ZonedDateTime\nimport java.time.format.DateTimeFormatter\nimport org.schabi.newpipe.App\nimport org.schabi.newpipe.error.ErrorInfo\nimport org.schabi.newpipe.error.ErrorUtil.Companion.createNotification\nimport org.schabi.newpipe.error.UserAction\n\nobject ReleaseVersionUtil {\n    // Public key of the certificate that is used in NewPipe release versions\n    private const val RELEASE_CERT_PUBLIC_KEY_SHA256 =\n        \"cb84069bd68116bafae5ee4ee5b08a567aa6d898404e7cb12f9e756df5cf5cab\"\n\n    @OptIn(ExperimentalStdlibApi::class)\n    val isReleaseApk by lazy {\n        @Suppress(\"NewApi\")\n        val certificates = mapOf(\n            RELEASE_CERT_PUBLIC_KEY_SHA256.hexToByteArray() to PackageManager.CERT_INPUT_SHA256\n        )\n        val app = App.instance\n        try {\n            PackageInfoCompat.hasSignatures(app.packageManager, app.packageName, certificates, false)\n        } catch (e: PackageManager.NameNotFoundException) {\n            createNotification(\n                app,\n                ErrorInfo(e, UserAction.CHECK_FOR_NEW_APP_VERSION, \"Could not find package info\")\n            )\n            false\n        }\n    }\n\n    fun isLastUpdateCheckExpired(expiry: Long): Boolean {\n        return Instant.ofEpochSecond(expiry) < Instant.now()\n    }\n\n    /**\n     * Coerce expiry date time in between 6 hours and 72 hours from now\n     *\n     * @return Epoch second of expiry date time\n     */\n    fun coerceUpdateCheckExpiry(expiryString: String?): Long {\n        val nowPlus6Hours = ZonedDateTime.now().plusHours(6)\n        val expiry = expiryString?.let {\n            ZonedDateTime.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(it))\n                .coerceIn(nowPlus6Hours, nowPlus6Hours.plusHours(66))\n        } ?: nowPlus6Hours\n        return expiry.toEpochSecond()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/SavedState.kt",
    "content": "package org.schabi.newpipe.util\n\nimport android.os.Parcelable\nimport kotlinx.parcelize.Parcelize\n\n/**\n * Information about the saved state on the disk.\n */\n@Parcelize\nclass SavedState(\n    /**\n     * Get the prefix of the saved file.\n     *\n     * @return the file prefix\n     */\n    val prefixFileSaved: String,\n    /**\n     * Get the path to the saved file.\n     *\n     * @return the path to the saved file\n     */\n    val pathFileSaved: String\n) : Parcelable {\n    override fun toString() = \"$prefixFileSaved > $pathFileSaved\"\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/SecondaryStreamHelper.java",
    "content": "package org.schabi.newpipe.util;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.extractor.MediaFormat;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.Stream;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\nimport org.schabi.newpipe.util.StreamItemAdapter.StreamInfoWrapper;\n\nimport java.util.List;\n\npublic class SecondaryStreamHelper<T extends Stream> {\n    private final int position;\n    private final StreamInfoWrapper<T> streams;\n\n    public SecondaryStreamHelper(@NonNull final StreamInfoWrapper<T> streams,\n                                 final T selectedStream) {\n        this.streams = streams;\n        this.position = streams.getStreamsList().indexOf(selectedStream);\n        if (this.position < 0) {\n            throw new RuntimeException(\"selected stream not found\");\n        }\n    }\n\n    /**\n     * Finds an audio stream compatible with the provided video-only stream, so that the two streams\n     * can be combined in a single file by the downloader. If there are multiple available audio\n     * streams, chooses either the highest or the lowest quality one based on\n     * {@link ListHelper#isLimitingDataUsage(Context)}.\n     *\n     * @param context      Android context\n     * @param audioStreams list of audio streams\n     * @param videoStream  desired video-ONLY stream\n     * @return the selected audio stream or null if a candidate was not found\n     */\n    @Nullable\n    public static AudioStream getAudioStreamFor(@NonNull final Context context,\n                                                @NonNull final List<AudioStream> audioStreams,\n                                                @NonNull final VideoStream videoStream) {\n        final MediaFormat mediaFormat = videoStream.getFormat();\n\n        if (mediaFormat == MediaFormat.WEBM) {\n            return audioStreams\n                    .stream()\n                    .filter(audioStream -> audioStream.getFormat() == MediaFormat.WEBMA\n                            || audioStream.getFormat() == MediaFormat.WEBMA_OPUS)\n                    .max(ListHelper.getAudioFormatComparator(MediaFormat.WEBMA,\n                            ListHelper.isLimitingDataUsage(context)))\n                    .orElse(null);\n\n        } else if (mediaFormat == MediaFormat.MPEG_4) {\n            return audioStreams\n                    .stream()\n                    .filter(audioStream -> audioStream.getFormat() == MediaFormat.M4A)\n                    .max(ListHelper.getAudioFormatComparator(MediaFormat.M4A,\n                            ListHelper.isLimitingDataUsage(context)))\n                    .orElse(null);\n\n        } else {\n            return null;\n        }\n    }\n\n    public T getStream() {\n        return streams.getStreamsList().get(position);\n    }\n\n    public long getSizeInBytes() {\n        return streams.getSizeInBytes(position);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/SerializedCache.java",
    "content": "package org.schabi.newpipe.util;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.collection.LruCache;\n\nimport org.schabi.newpipe.MainActivity;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.io.Serializable;\nimport java.util.UUID;\n\npublic final class SerializedCache {\n    private static final boolean DEBUG = MainActivity.DEBUG;\n    private static final SerializedCache INSTANCE = new SerializedCache();\n    private static final int MAX_ITEMS_ON_CACHE = 5;\n    private static final LruCache<String, CacheData<?>> LRU_CACHE =\n            new LruCache<>(MAX_ITEMS_ON_CACHE);\n    private static final String TAG = \"SerializedCache\";\n\n    private SerializedCache() {\n        //no instance\n    }\n\n    public static SerializedCache getInstance() {\n        return INSTANCE;\n    }\n\n    @Nullable\n    public <T> T take(@NonNull final String key, @NonNull final Class<T> type) {\n        if (DEBUG) {\n            Log.d(TAG, \"take() called with: key = [\" + key + \"]\");\n        }\n        synchronized (LRU_CACHE) {\n            return LRU_CACHE.get(key) != null ? getItem(LRU_CACHE.remove(key), type) : null;\n        }\n    }\n\n    @Nullable\n    public <T> T get(@NonNull final String key, @NonNull final Class<T> type) {\n        if (DEBUG) {\n            Log.d(TAG, \"get() called with: key = [\" + key + \"]\");\n        }\n        synchronized (LRU_CACHE) {\n            final CacheData<?> data = LRU_CACHE.get(key);\n            return data != null ? getItem(data, type) : null;\n        }\n    }\n\n    @Nullable\n    public <T extends Serializable> String put(@NonNull final T item,\n                                               @NonNull final Class<T> type) {\n        final String key = UUID.randomUUID().toString();\n        return put(key, item, type) ? key : null;\n    }\n\n    public <T extends Serializable> boolean put(@NonNull final String key, @NonNull final T item,\n                                                @NonNull final Class<T> type) {\n        if (DEBUG) {\n            Log.d(TAG, \"put() called with: key = [\" + key + \"], item = [\" + item + \"]\");\n        }\n        synchronized (LRU_CACHE) {\n            try {\n                LRU_CACHE.put(key, new CacheData<>(clone(item, type), type));\n                return true;\n            } catch (final Exception error) {\n                Log.e(TAG, \"Serialization failed for: \", error);\n            }\n        }\n        return false;\n    }\n\n    public void clear() {\n        if (DEBUG) {\n            Log.d(TAG, \"clear() called\");\n        }\n        synchronized (LRU_CACHE) {\n            LRU_CACHE.evictAll();\n        }\n    }\n\n    public long size() {\n        synchronized (LRU_CACHE) {\n            return LRU_CACHE.size();\n        }\n    }\n\n    @Nullable\n    private <T> T getItem(@NonNull final CacheData<?> data, @NonNull final Class<T> type) {\n        return type.isAssignableFrom(data.type) ? type.cast(data.item) : null;\n    }\n\n    @NonNull\n    private <T extends Serializable> T clone(@NonNull final T item,\n                                             @NonNull final Class<T> type) throws Exception {\n        final ByteArrayOutputStream bytesOutput = new ByteArrayOutputStream();\n        try (ObjectOutputStream objectOutput = new ObjectOutputStream(bytesOutput)) {\n            objectOutput.writeObject(item);\n            objectOutput.flush();\n        }\n        final Object clone = new ObjectInputStream(\n                new ByteArrayInputStream(bytesOutput.toByteArray())).readObject();\n        return type.cast(clone);\n    }\n\n    private static final class CacheData<T> {\n        private final T item;\n        private final Class<T> type;\n\n        private CacheData(@NonNull final T item, @NonNull final Class<T> type) {\n            this.item = item;\n            this.type = type;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/ServiceHelper.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2018-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.util\n\nimport android.content.Context\nimport androidx.annotation.DrawableRes\nimport androidx.annotation.StringRes\nimport androidx.core.content.edit\nimport androidx.preference.PreferenceManager\nimport com.grack.nanojson.JsonParser\nimport java.util.concurrent.TimeUnit\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.extractor.NewPipe\nimport org.schabi.newpipe.extractor.ServiceList\nimport org.schabi.newpipe.extractor.StreamingService\nimport org.schabi.newpipe.extractor.services.peertube.PeertubeInstance\nimport org.schabi.newpipe.ktx.getStringSafe\n\nobject ServiceHelper {\n    private val DEFAULT_FALLBACK_SERVICE: StreamingService = ServiceList.YouTube\n\n    @JvmStatic\n    @DrawableRes\n    fun getIcon(serviceId: Int): Int {\n        return when (serviceId) {\n            0 -> R.drawable.ic_smart_display\n            1 -> R.drawable.ic_cloud\n            2 -> R.drawable.ic_placeholder_media_ccc\n            3 -> R.drawable.ic_placeholder_peertube\n            4 -> R.drawable.ic_placeholder_bandcamp\n            else -> R.drawable.ic_circle\n        }\n    }\n\n    @JvmStatic\n    fun getTranslatedFilterString(filter: String, context: Context): String {\n        return when (filter) {\n            \"all\" -> context.getString(R.string.all)\n            \"videos\", \"sepia_videos\", \"music_videos\" -> context.getString(R.string.videos_string)\n            \"channels\" -> context.getString(R.string.channels)\n            \"playlists\", \"music_playlists\" -> context.getString(R.string.playlists)\n            \"tracks\" -> context.getString(R.string.tracks)\n            \"users\" -> context.getString(R.string.users)\n            \"conferences\" -> context.getString(R.string.conferences)\n            \"events\" -> context.getString(R.string.events)\n            \"music_songs\" -> context.getString(R.string.songs)\n            \"music_albums\" -> context.getString(R.string.albums)\n            \"music_artists\" -> context.getString(R.string.artists)\n            else -> filter\n        }\n    }\n\n    /**\n     * Get a resource string with instructions for importing subscriptions for each service.\n     *\n     * @param serviceId service to get the instructions for\n     * @return the string resource containing the instructions or -1 if the service don't support it\n     */\n    @JvmStatic\n    @StringRes\n    fun getImportInstructions(serviceId: Int): Int {\n        return when (serviceId) {\n            0 -> R.string.import_youtube_instructions\n            1 -> R.string.import_soundcloud_instructions\n            else -> -1\n        }\n    }\n\n    /**\n     * For services that support importing from a channel url, return a hint that will\n     * be used in the EditText that the user will type in his channel url.\n     *\n     * @param serviceId service to get the hint for\n     * @return the hint's string resource or -1 if the service don't support it\n     */\n    @JvmStatic\n    @StringRes\n    fun getImportInstructionsHint(serviceId: Int): Int {\n        return when (serviceId) {\n            1 -> R.string.import_soundcloud_instructions_hint\n            else -> -1\n        }\n    }\n\n    @JvmStatic\n    fun getSelectedServiceId(context: Context): Int {\n        return (getSelectedService(context) ?: DEFAULT_FALLBACK_SERVICE).serviceId\n    }\n\n    @JvmStatic\n    fun getSelectedService(context: Context): StreamingService? {\n        val serviceName: String = PreferenceManager.getDefaultSharedPreferences(context)\n            .getStringSafe(\n                context.getString(R.string.current_service_key),\n                context.getString(R.string.default_service_value)\n            )\n\n        return runCatching { NewPipe.getService(serviceName) }.getOrNull()\n    }\n\n    @JvmStatic\n    fun getNameOfServiceById(serviceId: Int): String {\n        return ServiceList.all().stream()\n            .filter { it.serviceId == serviceId }\n            .findFirst()\n            .map(StreamingService::getServiceInfo)\n            .map(StreamingService.ServiceInfo::getName)\n            .orElse(\"<unknown>\")\n    }\n\n    /**\n     * @param serviceId the id of the service\n     * @return the service corresponding to the provided id\n     * @throws java.util.NoSuchElementException if there is no service with the provided id\n     */\n    @JvmStatic\n    fun getServiceById(serviceId: Int): StreamingService {\n        return ServiceList.all().firstNotNullOf { it.takeIf { it.serviceId == serviceId } }\n    }\n\n    @JvmStatic\n    fun setSelectedServiceId(context: Context, serviceId: Int) {\n        val serviceName = runCatching { NewPipe.getService(serviceId).serviceInfo.name }\n            .getOrDefault(DEFAULT_FALLBACK_SERVICE.serviceInfo.name)\n\n        setSelectedServicePreferences(context, serviceName)\n    }\n\n    private fun setSelectedServicePreferences(context: Context, serviceName: String?) {\n        val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)\n        sharedPreferences.edit { putString(context.getString(R.string.current_service_key), serviceName) }\n    }\n\n    @JvmStatic\n    fun getCacheExpirationMillis(serviceId: Int): Long {\n        return if (serviceId == ServiceList.SoundCloud.serviceId) {\n            TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES)\n        } else {\n            TimeUnit.MILLISECONDS.convert(1, TimeUnit.HOURS)\n        }\n    }\n\n    fun initService(context: Context, serviceId: Int) {\n        if (serviceId == ServiceList.PeerTube.serviceId) {\n            val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)\n            val json = sharedPreferences.getString(\n                context.getString(R.string.peertube_selected_instance_key),\n                null\n            ) ?: return\n\n            val jsonObject = runCatching { JsonParser.`object`().from(json) }\n                .getOrElse { return@initService }\n\n            ServiceList.PeerTube.instance = PeertubeInstance(\n                jsonObject.getString(\"url\"),\n                jsonObject.getString(\"name\")\n            )\n        }\n    }\n\n    @JvmStatic\n    fun initServices(context: Context) {\n        ServiceList.all().forEach { initService(context, it.serviceId) }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/SimpleOnSeekBarChangeListener.kt",
    "content": "package org.schabi.newpipe.util\n\nimport android.widget.SeekBar\n\n/**\n * Why the hell didn't they make a stub implementation for this?\n */\nabstract class SimpleOnSeekBarChangeListener : SeekBar.OnSeekBarChangeListener {\n    override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {}\n    override fun onStartTrackingTouch(seekBar: SeekBar) {}\n    override fun onStopTrackingTouch(seekBar: SeekBar) {}\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/SliderStrategy.java",
    "content": "package org.schabi.newpipe.util;\n\npublic interface SliderStrategy {\n    /**\n     * Converts from zeroed double with a minimum offset to the nearest rounded slider\n     * equivalent integer.\n     *\n     * @param value the value to convert\n     * @return the converted value\n     */\n    int progressOf(double value);\n\n    /**\n     * Converts from slider integer value to an equivalent double value with a given\n     * minimum offset.\n     *\n     * @param progress the value to convert\n     * @return the converted value\n     */\n    double valueOf(int progress);\n\n    // TODO: also implement linear strategy when needed\n\n    final class Quadratic implements SliderStrategy {\n        private final double leftGap;\n        private final double rightGap;\n        private final double center;\n\n        private final int centerProgress;\n\n        /**\n         * Quadratic slider strategy that scales the value of a slider given how far the slider\n         * progress is from the center of the slider. The further away from the center,\n         * the faster the interpreted value changes, and vice versa.\n         *\n         * @param minimum     the minimum value of the interpreted value of the slider.\n         * @param maximum     the maximum value of the interpreted value of the slider.\n         * @param center      center of the interpreted value between the minimum and maximum, which\n         *                    will be used as the center value on the slider progress. Doesn't need\n         *                    to be the average of the minimum and maximum values, but must be in\n         *                    between the two.\n         * @param maxProgress the maximum possible progress of the slider, this is the\n         *                    value that is shown for the UI and controls the granularity of\n         *                    the slider. Should be as large as possible to avoid floating\n         *                    point round-off error. Using odd number is recommended.\n         */\n        public Quadratic(final double minimum, final double maximum, final double center,\n                         final int maxProgress) {\n            if (center < minimum || center > maximum) {\n                throw new IllegalArgumentException(\"Center must be in between minimum and maximum\");\n            }\n\n            this.leftGap = minimum - center;\n            this.rightGap = maximum - center;\n            this.center = center;\n\n            this.centerProgress = maxProgress / 2;\n        }\n\n        @Override\n        public int progressOf(final double value) {\n            final double difference = value - center;\n            final double root = difference >= 0 ? Math.sqrt(difference / rightGap)\n                    : -Math.sqrt(Math.abs(difference / leftGap));\n            final double offset = Math.round(root * centerProgress);\n\n            return (int) (centerProgress + offset);\n        }\n\n        @Override\n        public double valueOf(final int progress) {\n            final int offset = progress - centerProgress;\n            final double square = Math.pow(((double) offset) / ((double) centerProgress), 2);\n            final double difference = square * (offset >= 0 ? rightGap : leftGap);\n\n            return difference + center;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/SparseItemUtil.java",
    "content": "package org.schabi.newpipe.util;\n\nimport static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;\n\nimport android.content.Context;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.NewPipeDatabase;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.database.stream.model.StreamEntity;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.player.playqueue.SinglePlayQueue;\n\nimport java.util.function.Consumer;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Completable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\n/**\n * Utility class for fetching additional data for stream items when needed.\n */\npublic final class SparseItemUtil {\n    private SparseItemUtil() {\n    }\n\n    /**\n     * Use this to certainly obtain an single play queue with all of the data filled in when the\n     * stream info item you are handling might be sparse, e.g. because it was fetched via a {@link\n     * org.schabi.newpipe.extractor.feed.FeedExtractor}. FeedExtractors provide a fast and\n     * lightweight method to fetch info, but the info might be incomplete (see\n     * {@link org.schabi.newpipe.local.feed.service.FeedLoadService} for more details).\n     *\n     * @param context  Android context\n     * @param item     item which is checked and eventually loaded completely\n     * @param callback callback to call with the single play queue built from the original item if\n     *                 all info was available, otherwise from the fetched {@link\n     *                 org.schabi.newpipe.extractor.stream.StreamInfo}\n     */\n    public static void fetchItemInfoIfSparse(@NonNull final Context context,\n                                             @NonNull final StreamInfoItem item,\n                                             @NonNull final Consumer<SinglePlayQueue> callback) {\n        if ((StreamTypeUtil.isLiveStream(item.getStreamType()) || item.getDuration() >= 0)\n                && !isNullOrEmpty(item.getUploaderUrl())) {\n            // if the duration is >= 0 (provided that the item is not a livestream) and there is an\n            // uploader url, probably all info is already there, so there is no need to fetch it\n            callback.accept(new SinglePlayQueue(item));\n            return;\n        }\n\n        // either the duration or the uploader url are not available, so fetch more info\n        fetchStreamInfoAndSaveToDatabase(context, item.getServiceId(), item.getUrl(),\n                streamInfo -> callback.accept(new SinglePlayQueue(streamInfo)));\n    }\n\n    /**\n     * Use this to certainly obtain an uploader url when the stream info item or play queue item you\n     * are handling might not have the uploader url (e.g. because it was fetched with {@link\n     * org.schabi.newpipe.extractor.feed.FeedExtractor}). A toast is shown if loading details is\n     * required.\n     *\n     * @param context     Android context\n     * @param serviceId   serviceId of the item\n     * @param url         item url\n     * @param uploaderUrl uploaderUrl of the item; if null or empty will be fetched\n     * @param callback    callback to be called with either the original uploaderUrl, if it was a\n     *                    valid url, otherwise with the uploader url obtained by fetching the {@link\n     *                    org.schabi.newpipe.extractor.stream.StreamInfo} corresponding to the item\n     */\n    public static void fetchUploaderUrlIfSparse(@NonNull final Context context,\n                                                final int serviceId,\n                                                @NonNull final String url,\n                                                @Nullable final String uploaderUrl,\n                                                @NonNull final Consumer<String> callback) {\n        if (!isNullOrEmpty(uploaderUrl)) {\n            callback.accept(uploaderUrl);\n            return;\n        }\n        fetchStreamInfoAndSaveToDatabase(context, serviceId, url,\n                streamInfo -> callback.accept(streamInfo.getUploaderUrl()));\n    }\n\n    /**\n     * Loads the stream info corresponding to the given data on an I/O thread, stores the result in\n     * the database and calls the callback on the main thread with the result. A toast will be shown\n     * to the user about loading stream details, so this needs to be called on the main thread.\n     *\n     * @param context   Android context\n     * @param serviceId service id of the stream to load\n     * @param url       url of the stream to load\n     * @param callback  callback to be called with the result\n     */\n    public static void fetchStreamInfoAndSaveToDatabase(@NonNull final Context context,\n                                                        final int serviceId,\n                                                        @NonNull final String url,\n                                                        final Consumer<StreamInfo> callback) {\n        Toast.makeText(context, R.string.loading_stream_details, Toast.LENGTH_SHORT).show();\n        ExtractorHelper.getStreamInfo(serviceId, url, false)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(result -> {\n                    // save to database in the background (not on main thread)\n                    Completable.fromAction(() -> NewPipeDatabase.getInstance(context)\n                            .streamDAO().upsert(new StreamEntity(result)))\n                            .subscribeOn(Schedulers.io())\n                            .observeOn(Schedulers.io())\n                            .doOnError(throwable ->\n                                    ErrorUtil.createNotification(context,\n                                            new ErrorInfo(throwable, UserAction.REQUESTED_STREAM,\n                                                    \"Saving stream info to database\", result)))\n                            .subscribe();\n\n                    // call callback on main thread with the obtained result\n                    callback.accept(result);\n                }, throwable -> ErrorUtil.createNotification(context,\n                        new ErrorInfo(throwable, UserAction.REQUESTED_STREAM,\n                                \"Loading stream info: \" + url, serviceId, url)\n                ));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/StateSaver.java",
    "content": "/*\n * Copyright 2017 Mauricio Colli <mauriciocolli@outlook.com>\n * StateSaver.java is part of NewPipe\n *\n * License: GPL-3.0+\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\npackage org.schabi.newpipe.util;\n\n\nimport android.content.Context;\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.os.BundleCompat;\n\nimport org.schabi.newpipe.BuildConfig;\nimport org.schabi.newpipe.MainActivity;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.util.LinkedList;\nimport java.util.Queue;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * A way to save state to disk or in a in-memory map\n * if it's just changing configurations (i.e. rotating the phone).\n */\npublic final class StateSaver {\n    public static final String KEY_SAVED_STATE = \"key_saved_state\";\n    private static final ConcurrentHashMap<String, Queue<Object>> STATE_OBJECTS_HOLDER =\n            new ConcurrentHashMap<>();\n    private static final String TAG = \"StateSaver\";\n    private static final String CACHE_DIR_NAME = \"state_cache\";\n    private static String cacheDirPath;\n\n    private StateSaver() {\n        //no instance\n    }\n\n    /**\n     * Initialize the StateSaver, usually you want to call this in the Application class.\n     *\n     * @param context used to get the available cache dir\n     */\n    public static void init(final Context context) {\n        final File externalCacheDir = context.getExternalCacheDir();\n        if (externalCacheDir != null) {\n            cacheDirPath = externalCacheDir.getAbsolutePath();\n        }\n        if (TextUtils.isEmpty(cacheDirPath)) {\n            cacheDirPath = context.getCacheDir().getAbsolutePath();\n        }\n    }\n\n    /**\n     * @param outState\n     * @param writeRead\n     * @return the saved state\n     * @see #tryToRestore(SavedState, WriteRead)\n     */\n    public static SavedState tryToRestore(final Bundle outState, final WriteRead writeRead) {\n        if (outState == null || writeRead == null) {\n            return null;\n        }\n\n        final SavedState savedState = BundleCompat.getParcelable(\n                outState, KEY_SAVED_STATE, SavedState.class);\n        if (savedState == null) {\n            return null;\n        }\n\n        return tryToRestore(savedState, writeRead);\n    }\n\n    /**\n     * Try to restore the state from memory and disk,\n     * using the {@link StateSaver.WriteRead#readFrom(Queue)} from the writeRead.\n     *\n     * @param savedState\n     * @param writeRead\n     * @return the saved state\n     */\n    @Nullable\n    private static SavedState tryToRestore(@NonNull final SavedState savedState,\n                                           @NonNull final WriteRead writeRead) {\n        if (MainActivity.DEBUG) {\n            Log.d(TAG, \"tryToRestore() called with: savedState = [\" + savedState + \"], \"\n                    + \"writeRead = [\" + writeRead + \"]\");\n        }\n\n        try {\n            Queue<Object> savedObjects =\n                    STATE_OBJECTS_HOLDER.remove(savedState.getPrefixFileSaved());\n            if (savedObjects != null) {\n                writeRead.readFrom(savedObjects);\n                if (MainActivity.DEBUG) {\n                    Log.d(TAG, \"tryToSave: reading objects from holder > \" + savedObjects\n                            + \", stateObjectsHolder > \" + STATE_OBJECTS_HOLDER);\n                }\n                return savedState;\n            }\n\n            final File file = new File(savedState.getPathFileSaved());\n            if (!file.exists()) {\n                if (MainActivity.DEBUG) {\n                    Log.d(TAG, \"Cache file doesn't exist: \" + file.getAbsolutePath());\n                }\n                return null;\n            }\n\n            try (FileInputStream fileInputStream = new FileInputStream(file);\n                 ObjectInputStream inputStream = new ObjectInputStream(fileInputStream)) {\n                //noinspection unchecked\n                savedObjects = (Queue<Object>) inputStream.readObject();\n            }\n\n            if (savedObjects != null) {\n                writeRead.readFrom(savedObjects);\n            }\n\n            return savedState;\n        } catch (final Exception e) {\n            Log.e(TAG, \"Failed to restore state\", e);\n        }\n        return null;\n    }\n\n    /**\n     * @param isChangingConfig\n     * @param savedState\n     * @param outState\n     * @param writeRead\n     * @return the saved state or {@code null}\n     * @see #tryToSave(boolean, String, String, WriteRead)\n     */\n    @Nullable\n    public static SavedState tryToSave(final boolean isChangingConfig,\n                                       @Nullable final SavedState savedState, final Bundle outState,\n                                       final WriteRead writeRead) {\n        @NonNull final String currentSavedPrefix;\n        if (savedState == null || TextUtils.isEmpty(savedState.getPrefixFileSaved())) {\n            // Generate unique prefix\n            currentSavedPrefix = System.nanoTime() - writeRead.hashCode() + \"\";\n        } else {\n            // Reuse prefix\n            currentSavedPrefix = savedState.getPrefixFileSaved();\n        }\n\n        final SavedState newSavedState = tryToSave(isChangingConfig, currentSavedPrefix,\n                writeRead.generateSuffix(), writeRead);\n        if (newSavedState != null) {\n            outState.putParcelable(StateSaver.KEY_SAVED_STATE, newSavedState);\n            return newSavedState;\n        }\n\n        return null;\n    }\n\n    /**\n     * If it's not changing configuration (i.e. rotating screen),\n     * try to write the state from {@link StateSaver.WriteRead#writeTo(Queue)}\n     * to the file with the name of prefixFileName + suffixFileName,\n     * in a cache folder got from the {@link #init(Context)}.\n     * <p>\n     * It checks if the file already exists and if it does, just return the path,\n     * so a good way to save is:\n     * </p>\n     * <ul>\n     * <li>A fixed prefix for the file</li>\n     * <li>A changing suffix</li>\n     * </ul>\n     *\n     * @param isChangingConfig\n     * @param prefixFileName\n     * @param suffixFileName\n     * @param writeRead\n     * @return the saved state or {@code null}\n     */\n    @Nullable\n    private static SavedState tryToSave(final boolean isChangingConfig, final String prefixFileName,\n                                        final String suffixFileName, final WriteRead writeRead) {\n        if (MainActivity.DEBUG) {\n            Log.d(TAG, \"tryToSave() called with: \"\n                    + \"isChangingConfig = [\" + isChangingConfig + \"], \"\n                    + \"prefixFileName = [\" + prefixFileName + \"], \"\n                    + \"suffixFileName = [\" + suffixFileName + \"], \"\n                    + \"writeRead = [\" + writeRead + \"]\");\n        }\n\n        final LinkedList<Object> savedObjects = new LinkedList<>();\n        writeRead.writeTo(savedObjects);\n\n        if (isChangingConfig) {\n            if (savedObjects.size() > 0) {\n                STATE_OBJECTS_HOLDER.put(prefixFileName, savedObjects);\n                return new SavedState(prefixFileName, \"\");\n            } else {\n                if (MainActivity.DEBUG) {\n                    Log.d(TAG, \"Nothing to save\");\n                }\n                return null;\n            }\n        }\n\n        try {\n            File cacheDir = new File(cacheDirPath);\n            if (!cacheDir.exists()) {\n                throw new RuntimeException(\"Cache dir does not exist > \" + cacheDirPath);\n            }\n            cacheDir = new File(cacheDir, CACHE_DIR_NAME);\n            if (!cacheDir.exists()) {\n                if (!cacheDir.mkdir()) {\n                    if (BuildConfig.DEBUG) {\n                        Log.e(TAG,\n                                \"Failed to create cache directory \" + cacheDir.getAbsolutePath());\n                    }\n                    return null;\n                }\n            }\n\n            final File file = new File(cacheDir, prefixFileName\n                    + (TextUtils.isEmpty(suffixFileName) ? \".cache\" : suffixFileName));\n            if (file.exists() && file.length() > 0) {\n                // If the file already exists, just return it\n                return new SavedState(prefixFileName, file.getAbsolutePath());\n            } else {\n                // Delete any file that contains the prefix\n                final File[] files = cacheDir.listFiles((dir, name) ->\n                        name.contains(prefixFileName));\n                for (final File fileToDelete : files) {\n                    fileToDelete.delete();\n                }\n            }\n\n            try (FileOutputStream fileOutputStream = new FileOutputStream(file);\n                 ObjectOutputStream outputStream = new ObjectOutputStream(fileOutputStream)) {\n                outputStream.writeObject(savedObjects);\n            }\n\n            return new SavedState(prefixFileName, file.getAbsolutePath());\n        } catch (final Exception e) {\n            Log.e(TAG, \"Failed to save state\", e);\n        }\n        return null;\n    }\n\n    /**\n     * Delete the cache file contained in the savedState.\n     * Also remove any possible-existing value in the memory-cache.\n     *\n     * @param savedState the saved state to delete\n     */\n    public static void onDestroy(final SavedState savedState) {\n        if (MainActivity.DEBUG) {\n            Log.d(TAG, \"onDestroy() called with: savedState = [\" + savedState + \"]\");\n        }\n\n        if (savedState != null && !savedState.getPathFileSaved().isEmpty()) {\n            STATE_OBJECTS_HOLDER.remove(savedState.getPrefixFileSaved());\n            try {\n                //noinspection ResultOfMethodCallIgnored\n                new File(savedState.getPathFileSaved()).delete();\n            } catch (final Exception ignored) {\n            }\n        }\n    }\n\n    /**\n     * Clear all the files in cache (in memory and disk).\n     */\n    public static void clearStateFiles() {\n        if (MainActivity.DEBUG) {\n            Log.d(TAG, \"clearStateFiles() called\");\n        }\n\n        STATE_OBJECTS_HOLDER.clear();\n        File cacheDir = new File(cacheDirPath);\n        if (!cacheDir.exists()) {\n            return;\n        }\n\n        cacheDir = new File(cacheDir, CACHE_DIR_NAME);\n        if (cacheDir.exists()) {\n            final File[] list = cacheDir.listFiles();\n            if (list != null) {\n                for (final File file : list) {\n                    file.delete();\n                }\n            }\n        }\n    }\n\n    /**\n     * Used for describing how to save/read the objects.\n     * <p>\n     * Queue was chosen by its FIFO property.\n     */\n    public interface WriteRead {\n        /**\n         * Generate a changing suffix that will name the cache file,\n         * and be used to identify if it changed (thus reducing useless reading/saving).\n         *\n         * @return a unique value\n         */\n        String generateSuffix();\n\n        /**\n         * Add to this queue objects that you want to save.\n         *\n         * @param objectsToSave the objects to save\n         */\n        void writeTo(Queue<Object> objectsToSave);\n\n        /**\n         * Poll saved objects from the queue in the order they were written.\n         *\n         * @param savedObjects queue of objects returned by {@link #writeTo(Queue)}\n         */\n        void readFrom(@NonNull Queue<Object> savedObjects) throws Exception;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/StreamItemAdapter.java",
    "content": "package org.schabi.newpipe.util;\n\nimport static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\nimport android.widget.ImageView;\nimport android.widget.Spinner;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.VisibleForTesting;\nimport androidx.collection.SparseArrayCompat;\n\nimport org.schabi.newpipe.DownloaderImpl;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.MediaFormat;\nimport org.schabi.newpipe.extractor.downloader.Response;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.Stream;\nimport org.schabi.newpipe.extractor.stream.SubtitlesStream;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\nimport org.schabi.newpipe.extractor.utils.Utils;\n\nimport java.io.Serializable;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.concurrent.Callable;\nimport java.util.stream.Collectors;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\nimport us.shandian.giga.util.Utility;\n\n/**\n * A list adapter for a list of {@link Stream streams}.\n * It currently supports {@link VideoStream}, {@link AudioStream} and {@link SubtitlesStream}.\n *\n * @param <T> the primary stream type's class extending {@link Stream}\n * @param <U> the secondary stream type's class extending {@link Stream}\n */\npublic class StreamItemAdapter<T extends Stream, U extends Stream> extends BaseAdapter {\n    @NonNull\n    private final StreamInfoWrapper<T> streamsWrapper;\n    @NonNull\n    private final SparseArrayCompat<SecondaryStreamHelper<U>> secondaryStreams;\n\n    /**\n     * Indicates that at least one of the primary streams is an instance of {@link VideoStream},\n     * has no audio ({@link VideoStream#isVideoOnly()} returns true) and has no secondary stream\n     * associated with it.\n     */\n    private final boolean hasAnyVideoOnlyStreamWithNoSecondaryStream;\n\n    public StreamItemAdapter(\n            @NonNull final StreamInfoWrapper<T> streamsWrapper,\n            @NonNull final SparseArrayCompat<SecondaryStreamHelper<U>> secondaryStreams\n    ) {\n        this.streamsWrapper = streamsWrapper;\n        this.secondaryStreams = secondaryStreams;\n\n        this.hasAnyVideoOnlyStreamWithNoSecondaryStream =\n                checkHasAnyVideoOnlyStreamWithNoSecondaryStream();\n    }\n\n    public StreamItemAdapter(final StreamInfoWrapper<T> streamsWrapper) {\n        this(streamsWrapper, new SparseArrayCompat<>(0));\n    }\n\n    public List<T> getAll() {\n        return streamsWrapper.getStreamsList();\n    }\n\n    public SparseArrayCompat<SecondaryStreamHelper<U>> getAllSecondary() {\n        return secondaryStreams;\n    }\n\n    @Override\n    public int getCount() {\n        return streamsWrapper.getStreamsList().size();\n    }\n\n    @Override\n    public T getItem(final int position) {\n        return streamsWrapper.getStreamsList().get(position);\n    }\n\n    @Override\n    public long getItemId(final int position) {\n        return position;\n    }\n\n    @Override\n    public View getDropDownView(final int position,\n                                final View convertView,\n                                final ViewGroup parent) {\n        return getCustomView(position, convertView, parent, true);\n    }\n\n    @Override\n    public View getView(final int position, final View convertView, final ViewGroup parent) {\n        return getCustomView(((Spinner) parent).getSelectedItemPosition(),\n                convertView, parent, false);\n    }\n\n    @NonNull\n    private View getCustomView(final int position,\n                               final View view,\n                               final ViewGroup parent,\n                               final boolean isDropdownItem) {\n        final var context = parent.getContext();\n        View convertView = view;\n        if (convertView == null) {\n            convertView = LayoutInflater.from(context).inflate(\n                    R.layout.stream_quality_item, parent, false);\n        }\n\n        final ImageView woSoundIconView = convertView.findViewById(R.id.wo_sound_icon);\n        final TextView formatNameView = convertView.findViewById(R.id.stream_format_name);\n        final TextView qualityView = convertView.findViewById(R.id.stream_quality);\n        final TextView sizeView = convertView.findViewById(R.id.stream_size);\n\n        final T stream = getItem(position);\n        final MediaFormat mediaFormat = streamsWrapper.getFormat(position);\n\n        int woSoundIconVisibility = View.GONE;\n        String qualityString;\n\n        if (stream instanceof VideoStream) {\n            final VideoStream videoStream = ((VideoStream) stream);\n            qualityString = videoStream.getResolution();\n\n            if (hasAnyVideoOnlyStreamWithNoSecondaryStream) {\n                if (videoStream.isVideoOnly()) {\n                    woSoundIconVisibility = secondaryStreams.get(position) != null\n                            // It has a secondary stream associated with it, so check if it's a\n                            // dropdown view so it doesn't look out of place (missing margin)\n                            // compared to those that don't.\n                            ? (isDropdownItem ? View.INVISIBLE : View.GONE)\n                            // It doesn't have a secondary stream, icon is visible no matter what.\n                            : View.VISIBLE;\n                } else if (isDropdownItem) {\n                    woSoundIconVisibility = View.INVISIBLE;\n                }\n            }\n        } else if (stream instanceof AudioStream) {\n            final AudioStream audioStream = ((AudioStream) stream);\n            if (audioStream.getAverageBitrate() > 0) {\n                qualityString = audioStream.getAverageBitrate() + \"kbps\";\n            } else {\n                qualityString = context.getString(R.string.unknown_quality);\n            }\n        } else if (stream instanceof SubtitlesStream) {\n            qualityString = ((SubtitlesStream) stream).getDisplayLanguageName();\n            if (((SubtitlesStream) stream).isAutoGenerated()) {\n                qualityString += \" (\" + context.getString(R.string.caption_auto_generated) + \")\";\n            }\n        } else {\n            if (mediaFormat == null) {\n                qualityString = context.getString(R.string.unknown_quality);\n            } else {\n                qualityString = mediaFormat.getSuffix();\n            }\n        }\n\n        if (streamsWrapper.getSizeInBytes(position) > 0) {\n            final var secondary = secondaryStreams.get(position);\n            if (secondary != null) {\n                final long size = secondary.getSizeInBytes()\n                        + streamsWrapper.getSizeInBytes(position);\n                sizeView.setText(Utility.formatBytes(size));\n            } else {\n                sizeView.setText(streamsWrapper.getFormattedSize(position));\n            }\n            sizeView.setVisibility(View.VISIBLE);\n        } else {\n            sizeView.setVisibility(View.GONE);\n        }\n\n        if (stream instanceof SubtitlesStream) {\n            formatNameView.setText(((SubtitlesStream) stream).getLanguageTag());\n        } else {\n            if (mediaFormat == null) {\n                formatNameView.setText(context.getString(R.string.unknown_format));\n            } else if (mediaFormat == MediaFormat.WEBMA_OPUS) {\n                // noinspection AndroidLintSetTextI18n\n                formatNameView.setText(\"opus\");\n            } else {\n                formatNameView.setText(mediaFormat.getName());\n            }\n        }\n\n        qualityView.setText(qualityString);\n        woSoundIconView.setVisibility(woSoundIconVisibility);\n\n        return convertView;\n    }\n\n    /**\n     * @return if there are any video-only streams with no secondary stream associated with them.\n     * @see #hasAnyVideoOnlyStreamWithNoSecondaryStream\n     */\n    private boolean checkHasAnyVideoOnlyStreamWithNoSecondaryStream() {\n        for (int i = 0; i < streamsWrapper.getStreamsList().size(); i++) {\n            final T stream = streamsWrapper.getStreamsList().get(i);\n            if (stream instanceof VideoStream) {\n                final boolean videoOnly = ((VideoStream) stream).isVideoOnly();\n                if (videoOnly && secondaryStreams.get(i) == null) {\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * A wrapper class that includes a way of storing the stream sizes.\n     *\n     * @param <T> the stream type's class extending {@link Stream}\n     */\n    public static class StreamInfoWrapper<T extends Stream> implements Serializable {\n        private static final StreamInfoWrapper<Stream> EMPTY =\n                new StreamInfoWrapper<>(Collections.emptyList(), null);\n        private static final int SIZE_UNSET = -2;\n\n        private final List<T> streamsList;\n        private final long[] streamSizes;\n        private final MediaFormat[] streamFormats;\n        private final String unknownSize;\n\n        public StreamInfoWrapper(@NonNull final List<T> streamList,\n                                 @Nullable final Context context) {\n            this.streamsList = streamList;\n            this.streamSizes = new long[streamsList.size()];\n            this.unknownSize = context == null\n                    ? \"--.-\" : context.getString(R.string.unknown_content);\n            this.streamFormats = new MediaFormat[streamsList.size()];\n            resetInfo();\n        }\n\n        /**\n         * Helper method to fetch the sizes and missing media formats\n         * of all the streams in a wrapper.\n         *\n         * @param <X> the stream type's class extending {@link Stream}\n         * @param streamsWrapper the wrapper\n         * @return a {@link Single} that returns a boolean indicating if any elements were changed\n         */\n        @NonNull\n        public static <X extends Stream> Single<Boolean> fetchMoreInfoForWrapper(\n                final StreamInfoWrapper<X> streamsWrapper) {\n            final Callable<Boolean> fetchAndSet = () -> {\n                boolean hasChanged = false;\n                for (final X stream : streamsWrapper.getStreamsList()) {\n                    final boolean changeSize = streamsWrapper.getSizeInBytes(stream) <= SIZE_UNSET;\n                    final boolean changeFormat = stream.getFormat() == null;\n                    if (!changeSize && !changeFormat) {\n                        continue;\n                    }\n                    final Response response = DownloaderImpl.getInstance()\n                            .head(stream.getContent());\n                    if (changeSize) {\n                        final String contentLength = response.getHeader(\"Content-Length\");\n                        if (!isNullOrEmpty(contentLength)) {\n                            streamsWrapper.setSize(stream, Long.parseLong(contentLength));\n                            hasChanged = true;\n                        }\n                    }\n                    if (changeFormat) {\n                        hasChanged = retrieveMediaFormat(stream, streamsWrapper, response)\n                                || hasChanged;\n                    }\n                }\n                return hasChanged;\n            };\n\n            return Single.fromCallable(fetchAndSet)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .onErrorReturnItem(true);\n        }\n\n        /**\n         * Try to retrieve the {@link MediaFormat} for a stream from the request headers.\n         *\n         * @param <X>            the stream type to get the {@link MediaFormat} for\n         * @param stream         the stream to find the {@link MediaFormat} for\n         * @param streamsWrapper the wrapper to store the found {@link MediaFormat} in\n         * @param response       the response of the head request for the given stream\n         * @return {@code true} if the media format could be retrieved; {@code false} otherwise\n         */\n        @VisibleForTesting\n        public static <X extends Stream> boolean retrieveMediaFormat(\n                @NonNull final X stream,\n                @NonNull final StreamInfoWrapper<X> streamsWrapper,\n                @NonNull final Response response) {\n            return retrieveMediaFormatFromFileTypeHeaders(stream, streamsWrapper, response)\n                    || retrieveMediaFormatFromContentDispositionHeader(\n                            stream, streamsWrapper, response)\n                    || retrieveMediaFormatFromContentTypeHeader(stream, streamsWrapper, response);\n        }\n\n        @VisibleForTesting\n        public static <X extends Stream> boolean retrieveMediaFormatFromFileTypeHeaders(\n                @NonNull final X stream,\n                @NonNull final StreamInfoWrapper<X> streamsWrapper,\n                @NonNull final Response response) {\n            // try to use additional headers from CDNs or servers,\n            // e.g. x-amz-meta-file-type (e.g. for SoundCloud)\n            final List<String> keys = response.responseHeaders().keySet().stream()\n                    .filter(k -> k.endsWith(\"file-type\")).collect(Collectors.toList());\n            if (!keys.isEmpty()) {\n                for (final String key : keys) {\n                    final String suffix = response.getHeader(key);\n                    final MediaFormat format = MediaFormat.getFromSuffix(suffix);\n                    if (format != null) {\n                        streamsWrapper.setFormat(stream, format);\n                        return true;\n                    }\n                }\n            }\n            return false;\n        }\n\n        /**\n         * <p>Retrieve a {@link MediaFormat} from a HTTP Content-Disposition header\n         * for a stream and store the info in a wrapper.</p>\n         * @see\n         * <a href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition\">\n         *     mdn Web Docs for the HTTP Content-Disposition Header</a>\n         * @param stream the stream to get the {@link MediaFormat} for\n         * @param streamsWrapper the wrapper to store the {@link MediaFormat} in\n         * @param response the response to get the Content-Disposition header from\n         * @return {@code true} if the {@link MediaFormat} could be retrieved from the response;\n         * otherwise {@code false}\n         * @param <X>\n         */\n        @VisibleForTesting\n        public static <X extends Stream> boolean retrieveMediaFormatFromContentDispositionHeader(\n                @NonNull final X stream,\n                @NonNull final StreamInfoWrapper<X> streamsWrapper,\n                @NonNull final Response response) {\n            // parse the Content-Disposition header,\n            // see\n            // there can be two filename directives\n            String contentDisposition = response.getHeader(\"Content-Disposition\");\n            if (contentDisposition == null) {\n                return false;\n            }\n            try {\n                contentDisposition = Utils.decodeUrlUtf8(contentDisposition);\n                final String[] parts = contentDisposition.split(\";\");\n                for (String part : parts) {\n                    final String fileName;\n                    part = part.trim();\n\n                    // extract the filename\n                    if (part.startsWith(\"filename=\")) {\n                        // remove directive and decode\n                        fileName = Utils.decodeUrlUtf8(part.substring(9));\n                    } else if (part.startsWith(\"filename*=\")) {\n                        fileName = Utils.decodeUrlUtf8(part.substring(10));\n                    } else {\n                        continue;\n                    }\n\n                    // extract the file extension / suffix\n                    final String[] p = fileName.split(\"\\\\.\");\n                    String suffix = p[p.length - 1];\n                    if (suffix.endsWith(\"\\\"\") || suffix.endsWith(\"'\")) {\n                        // remove trailing quotes if present, end index is exclusive\n                        suffix = suffix.substring(0, suffix.length() - 1);\n                    }\n\n                    // get the corresponding media format\n                    final MediaFormat format = MediaFormat.getFromSuffix(suffix);\n                    if (format != null) {\n                        streamsWrapper.setFormat(stream, format);\n                        return true;\n                    }\n                }\n            } catch (final Exception ignored) {\n                // fail silently\n            }\n            return false;\n        }\n\n        @VisibleForTesting\n        public static <X extends Stream> boolean retrieveMediaFormatFromContentTypeHeader(\n                @NonNull final X stream,\n                @NonNull final StreamInfoWrapper<X> streamsWrapper,\n                @NonNull final Response response) {\n            // try to get the format by content type\n            // some mime types are not unique for every format, those are omitted\n            final String contentTypeHeader = response.getHeader(\"Content-Type\");\n            if (contentTypeHeader == null) {\n                return false;\n            }\n\n            @Nullable MediaFormat foundFormat = null;\n            for (final MediaFormat format : MediaFormat.getAllFromMimeType(contentTypeHeader)) {\n                if (foundFormat == null) {\n                    foundFormat = format;\n                } else if (foundFormat.id != format.id) {\n                    return false;\n                }\n            }\n            if (foundFormat != null) {\n                streamsWrapper.setFormat(stream, foundFormat);\n                return true;\n            }\n            return false;\n        }\n\n        public void resetInfo() {\n            Arrays.fill(streamSizes, SIZE_UNSET);\n            for (int i = 0; i < streamsList.size(); i++) {\n                streamFormats[i] = streamsList.get(i) == null // test for invalid streams\n                        ? null : streamsList.get(i).getFormat();\n            }\n        }\n\n        public static <X extends Stream> StreamInfoWrapper<X> empty() {\n            //noinspection unchecked\n            return (StreamInfoWrapper<X>) EMPTY;\n        }\n\n        public List<T> getStreamsList() {\n            return streamsList;\n        }\n\n        public long getSizeInBytes(final int streamIndex) {\n            return streamSizes[streamIndex];\n        }\n\n        public long getSizeInBytes(final T stream) {\n            return streamSizes[streamsList.indexOf(stream)];\n        }\n\n        public String getFormattedSize(final int streamIndex) {\n            return formatSize(getSizeInBytes(streamIndex));\n        }\n\n        private String formatSize(final long size) {\n            if (size > -1) {\n                return Utility.formatBytes(size);\n            }\n            return unknownSize;\n        }\n\n        public void setSize(final T stream, final long sizeInBytes) {\n            streamSizes[streamsList.indexOf(stream)] = sizeInBytes;\n        }\n\n        public MediaFormat getFormat(final int streamIndex) {\n            return streamFormats[streamIndex];\n        }\n\n        public void setFormat(final T stream, final MediaFormat format) {\n            streamFormats[streamsList.indexOf(stream)] = format;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/StreamTypeUtil.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2021-2026 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.util\n\nimport org.schabi.newpipe.extractor.stream.StreamType\n\n/**\n * Utility class for [StreamType].\n */\nobject StreamTypeUtil {\n    /**\n     * Check if the [StreamType] of a stream is a livestream.\n     *\n     * @param streamType the stream type of the stream\n     * @return whether the stream type is [StreamType.AUDIO_STREAM],\n     * [StreamType.AUDIO_LIVE_STREAM] or [StreamType.POST_LIVE_AUDIO_STREAM]\n     */\n    @JvmStatic\n    fun isAudio(streamType: StreamType): Boolean {\n        return streamType == StreamType.AUDIO_STREAM ||\n            streamType == StreamType.AUDIO_LIVE_STREAM ||\n            streamType == StreamType.POST_LIVE_AUDIO_STREAM\n    }\n\n    /**\n     * Check if the [StreamType] of a stream is a livestream.\n     *\n     * @param streamType the stream type of the stream\n     * @return whether the stream type is [StreamType.VIDEO_STREAM],\n     * [StreamType.LIVE_STREAM] or [StreamType.POST_LIVE_STREAM]\n     */\n    @JvmStatic\n    fun isVideo(streamType: StreamType): Boolean {\n        return streamType == StreamType.VIDEO_STREAM ||\n            streamType == StreamType.LIVE_STREAM ||\n            streamType == StreamType.POST_LIVE_STREAM\n    }\n\n    /**\n     * Check if the [StreamType] of a stream is a livestream.\n     *\n     * @param streamType the stream type of the stream\n     * @return whether the stream type is [StreamType.LIVE_STREAM] or\n     * [StreamType.AUDIO_LIVE_STREAM]\n     */\n    @JvmStatic\n    fun isLiveStream(streamType: StreamType): Boolean {\n        return streamType == StreamType.LIVE_STREAM ||\n            streamType == StreamType.AUDIO_LIVE_STREAM\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java",
    "content": "/*\n * Copyright 2018 Mauricio Colli <mauriciocolli@outlook.com>\n * ThemeHelper.java is part of NewPipe\n *\n * License: GPL-3.0+\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\npackage org.schabi.newpipe.util;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.res.Configuration;\nimport android.content.res.Resources;\nimport android.graphics.drawable.Drawable;\nimport android.util.TypedValue;\n\nimport androidx.annotation.AttrRes;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StyleRes;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.app.AppCompatDelegate;\nimport androidx.appcompat.content.res.AppCompatResources;\nimport androidx.core.content.ContextCompat;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.info_list.ItemViewMode;\n\npublic final class ThemeHelper {\n    private ThemeHelper() {\n    }\n\n    /**\n     * Apply the selected theme (on NewPipe settings) in the context\n     * with the default style (see {@link #setTheme(Context, int)}).\n     *\n     * ThemeHelper.setDayNightMode should be called before\n     * the applying theme for the first time in session\n     *\n     * @param context context that the theme will be applied\n     */\n    public static void setTheme(final Context context) {\n        setTheme(context, -1);\n    }\n\n    /**\n     * Apply the selected theme (on NewPipe settings) in the context,\n     * themed according with the styles defined for the service .\n     *\n     * ThemeHelper.setDayNightMode should be called before\n     * the applying theme for the first time in session\n     *\n     * @param context   context that the theme will be applied\n     * @param serviceId the theme will be styled to the service with this id,\n     *                  pass -1 to get the default style\n     */\n    public static void setTheme(final Context context, final int serviceId) {\n        context.setTheme(getThemeForService(context, serviceId));\n    }\n\n    /**\n     * Return true if the selected theme (on NewPipe settings) is the Light theme.\n     *\n     * @param context context to get the preference\n     * @return whether the light theme is selected\n     */\n    public static boolean isLightThemeSelected(final Context context) {\n        final String selectedThemeKey = getSelectedThemeKey(context);\n        final Resources res = context.getResources();\n\n        return selectedThemeKey.equals(res.getString(R.string.light_theme_key))\n                || (selectedThemeKey.equals(res.getString(R.string.auto_device_theme_key))\n                && !isDeviceDarkThemeEnabled(context));\n    }\n\n    /**\n     * Return a dialog theme styled according to the (default) selected theme.\n     *\n     * @param context context to get the selected theme\n     * @return the dialog style (the default one)\n     */\n    @StyleRes\n    public static int getDialogTheme(final Context context) {\n        return isLightThemeSelected(context) ? R.style.LightDialogTheme : R.style.DarkDialogTheme;\n    }\n\n    /**\n     * Return a min-width dialog theme styled according to the (default) selected theme.\n     *\n     * @param context context to get the selected theme\n     * @return the dialog style (the default one)\n     */\n    @StyleRes\n    public static int getMinWidthDialogTheme(final Context context) {\n        return isLightThemeSelected(context) ? R.style.LightDialogMinWidthTheme\n                : R.style.DarkDialogMinWidthTheme;\n    }\n\n    /**\n     * Return the selected theme styled according to the serviceId.\n     *\n     * @param context   context to get the selected theme\n     * @param serviceId return a theme styled to this service,\n     *                  -1 to get the default\n     * @return the selected style (styled)\n     */\n    @StyleRes\n    public static int getThemeForService(final Context context, final int serviceId) {\n        final Resources res = context.getResources();\n        final String lightThemeKey = res.getString(R.string.light_theme_key);\n        final String blackThemeKey = res.getString(R.string.black_theme_key);\n        final String automaticDeviceThemeKey = res.getString(R.string.auto_device_theme_key);\n\n        final String selectedThemeKey = getSelectedThemeKey(context);\n\n\n        int baseTheme = R.style.DarkTheme; // default to dark theme\n        if (selectedThemeKey.equals(lightThemeKey)) {\n            baseTheme = R.style.LightTheme;\n        } else if (selectedThemeKey.equals(blackThemeKey)) {\n            baseTheme = R.style.BlackTheme;\n        } else if (selectedThemeKey.equals(automaticDeviceThemeKey)) {\n\n            if (isDeviceDarkThemeEnabled(context)) {\n                // use the dark theme variant preferred by the user\n                final String selectedNightThemeKey = getSelectedNightThemeKey(context);\n                if (selectedNightThemeKey.equals(blackThemeKey)) {\n                    baseTheme = R.style.BlackTheme;\n                } else {\n                    baseTheme = R.style.DarkTheme;\n                }\n            } else {\n                // there is only one day theme\n                baseTheme = R.style.LightTheme;\n            }\n        }\n\n        if (serviceId <= -1) {\n            return baseTheme;\n        }\n\n        final StreamingService service;\n        try {\n            service = NewPipe.getService(serviceId);\n        } catch (final ExtractionException ignored) {\n            return baseTheme;\n        }\n\n        String themeName = \"DarkTheme\"; // default\n        if (baseTheme == R.style.LightTheme) {\n            themeName = \"LightTheme\";\n        } else if (baseTheme == R.style.BlackTheme) {\n            themeName = \"BlackTheme\";\n        }\n\n        themeName += \".\" + service.getServiceInfo().getName();\n        final int resourceId = context.getResources()\n                .getIdentifier(themeName, \"style\", context.getPackageName());\n\n        if (resourceId > 0) {\n            return resourceId;\n        }\n        return baseTheme;\n    }\n\n    @StyleRes\n    public static int getSettingsThemeStyle(final Context context) {\n        final Resources res = context.getResources();\n        final String lightTheme = res.getString(R.string.light_theme_key);\n        final String blackTheme = res.getString(R.string.black_theme_key);\n        final String automaticDeviceTheme = res.getString(R.string.auto_device_theme_key);\n\n\n        final String selectedTheme = getSelectedThemeKey(context);\n\n        if (selectedTheme.equals(lightTheme)) {\n            return R.style.LightSettingsTheme;\n        } else if (selectedTheme.equals(blackTheme)) {\n            return R.style.BlackSettingsTheme;\n        } else if (selectedTheme.equals(automaticDeviceTheme)) {\n            if (isDeviceDarkThemeEnabled(context)) {\n                // use the dark theme variant preferred by the user\n                final String selectedNightTheme = getSelectedNightThemeKey(context);\n                if (selectedNightTheme.equals(blackTheme)) {\n                    return R.style.BlackSettingsTheme;\n                } else {\n                    return R.style.DarkSettingsTheme;\n                }\n            } else {\n                // there is only one day theme\n                return R.style.LightSettingsTheme;\n            }\n        } else {\n            // default to dark theme\n            return R.style.DarkSettingsTheme;\n        }\n    }\n\n    /**\n     * Get a color from an attr styled according to the context's theme.\n     *\n     * @param context   Android app context\n     * @param attrColor attribute reference of the resource\n     * @return the color\n     */\n    public static int resolveColorFromAttr(final Context context, @AttrRes final int attrColor) {\n        final TypedValue value = new TypedValue();\n        context.getTheme().resolveAttribute(attrColor, value, true);\n\n        if (value.resourceId != 0) {\n            return ContextCompat.getColor(context, value.resourceId);\n        }\n\n        return value.data;\n    }\n\n    /**\n     * Resolves a {@link Drawable} by it's id.\n     *\n     * @param context   Context\n     * @param attrResId Resource id\n     * @return the {@link Drawable}\n     */\n    public static Drawable resolveDrawable(@NonNull final Context context,\n                                           @AttrRes final int attrResId) {\n        final TypedValue typedValue = new TypedValue();\n        context.getTheme().resolveAttribute(attrResId, typedValue, true);\n        return AppCompatResources.getDrawable(context, typedValue.resourceId);\n    }\n\n    /**\n     * Gets a runtime dimen from the {@code android} package. Should be used for dimens for which\n     * normal accessing with {@code R.dimen.} is not available.\n     *\n     * @param context context\n     * @param name    dimen resource name (e.g. navigation_bar_height)\n     * @return the obtained dimension, in pixels, or 0 if the resource could not be resolved\n     */\n    public static int getAndroidDimenPx(@NonNull final Context context, final String name) {\n        final int resId = context.getResources().getIdentifier(name, \"dimen\", \"android\");\n        if (resId <= 0) {\n            return 0;\n        }\n        return context.getResources().getDimensionPixelSize(resId);\n    }\n\n    private static String getSelectedThemeKey(final Context context) {\n        final String themeKey = context.getString(R.string.theme_key);\n        final String defaultTheme = context.getString(R.string.default_theme_value);\n        return PreferenceManager.getDefaultSharedPreferences(context)\n                .getString(themeKey, defaultTheme);\n    }\n\n    private static String getSelectedNightThemeKey(final Context context) {\n        final String nightThemeKey = context.getString(R.string.night_theme_key);\n        final String defaultNightTheme = context.getResources()\n                .getString(R.string.default_night_theme_value);\n        return PreferenceManager.getDefaultSharedPreferences(context)\n                .getString(nightThemeKey, defaultNightTheme);\n    }\n\n    /**\n     * Sets the title to the activity, if the activity is an {@link AppCompatActivity} and has an\n     * action bar.\n     *\n     * @param activity the activity to set the title of\n     * @param title    the title to set to the activity\n     */\n    public static void setTitleToAppCompatActivity(@Nullable final Activity activity,\n                                                   final CharSequence title) {\n        if (activity instanceof AppCompatActivity) {\n            final ActionBar actionBar = ((AppCompatActivity) activity).getSupportActionBar();\n            if (actionBar != null) {\n                actionBar.setTitle(title);\n            }\n        }\n    }\n\n    /**\n     * Get the device theme\n     * <p>\n     * It will return true if the device 's theme is dark, false otherwise.\n     * <p>\n     * From https://developer.android.com/guide/topics/ui/look-and-feel/darktheme#java\n     *\n     * @param context the context to use\n     * @return true:dark theme, false:light or unknown\n     */\n    public static boolean isDeviceDarkThemeEnabled(final Context context) {\n        final int deviceTheme = context.getResources().getConfiguration().uiMode\n                & Configuration.UI_MODE_NIGHT_MASK;\n        switch (deviceTheme) {\n            case Configuration.UI_MODE_NIGHT_YES:\n                return true;\n            case Configuration.UI_MODE_NIGHT_UNDEFINED:\n            case Configuration.UI_MODE_NIGHT_NO:\n            default:\n                return false;\n        }\n    }\n\n    public static void setDayNightMode(final Context context) {\n        setDayNightMode(context, ThemeHelper.getSelectedThemeKey(context));\n    }\n\n    public static void setDayNightMode(final Context context, final String selectedThemeKey) {\n        final Resources res = context.getResources();\n\n        if (selectedThemeKey.equals(res.getString(R.string.light_theme_key))) {\n            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);\n        } else if (selectedThemeKey.equals(res.getString(R.string.dark_theme_key))\n                || selectedThemeKey.equals(res.getString(R.string.black_theme_key))) {\n            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);\n        } else {\n            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);\n        }\n    }\n\n    /**\n     * Returns whether the grid layout or the list layout should be used. If the user set \"auto\"\n     * mode in settings, decides based on screen orientation (landscape) and size.\n     *\n     * @param context the context to use\n     * @return true:use grid layout, false:use list layout\n     */\n    public static boolean shouldUseGridLayout(final Context context) {\n        final ItemViewMode mode = getItemViewMode(context);\n        return mode == ItemViewMode.GRID;\n    }\n\n    /**\n     * Calculates the number of grid channel info items that can fit horizontally on the screen.\n     *\n     * @param context the context to use\n     * @return the span count of grid channel info items\n     */\n    public static int getGridSpanCountChannels(final Context context) {\n        return getGridSpanCount(context,\n                context.getResources().getDimensionPixelSize(R.dimen.channel_item_grid_min_width));\n    }\n\n    /**\n     * Returns item view mode.\n     * @param context to read preference and parse string\n     * @return Returns one of ItemViewMode\n     */\n    public static ItemViewMode getItemViewMode(final Context context) {\n        final String listMode = PreferenceManager.getDefaultSharedPreferences(context)\n                .getString(context.getString(R.string.list_view_mode_key),\n                        context.getString(R.string.list_view_mode_value));\n        final ItemViewMode result;\n        if (listMode.equals(context.getString(R.string.list_view_mode_list_key))) {\n            result = ItemViewMode.LIST;\n        } else if (listMode.equals(context.getString(R.string.list_view_mode_grid_key))) {\n            result = ItemViewMode.GRID;\n        } else if (listMode.equals(context.getString(R.string.list_view_mode_card_key))) {\n            result = ItemViewMode.CARD;\n        } else {\n            // Auto mode - evaluate whether to use Grid based on screen real estate.\n            final Configuration configuration = context.getResources().getConfiguration();\n            final boolean useGrid = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE\n                    && configuration.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE);\n            if (useGrid) {\n                result = ItemViewMode.GRID;\n            } else {\n                result = ItemViewMode.LIST;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * Calculates the number of grid stream info items that can fit horizontally on the screen. The\n     * width of a grid stream info item is obtained from the thumbnail width plus the right and left\n     * paddings.\n     *\n     * @param context the context to use\n     * @return the span count of grid stream info items\n     */\n    public static int getGridSpanCountStreams(final Context context) {\n        final Resources res = context.getResources();\n        return getGridSpanCount(context,\n                res.getDimensionPixelSize(R.dimen.video_item_grid_thumbnail_image_width)\n                        + res.getDimensionPixelSize(R.dimen.video_item_search_padding) * 2);\n    }\n\n    /**\n     * Calculates the number of grid items that can fit horizontally on the screen based on the\n     * minimum width.\n     *\n     * @param context the context to use\n     * @param minWidth the minimum width of items in the grid\n     * @return the span count of grid list items\n     */\n    public static int getGridSpanCount(final Context context, final int minWidth) {\n        return Math.max(1, context.getResources().getDisplayMetrics().widthPixels / minWidth);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/ZipHelper.java",
    "content": "package org.schabi.newpipe.util;\n\nimport org.schabi.newpipe.streams.io.SharpInputStream;\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\n\nimport java.io.BufferedInputStream;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.OutputStream;\nimport java.nio.file.Files;\nimport java.nio.file.Path;\nimport java.nio.file.StandardCopyOption;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipInputStream;\nimport java.util.zip.ZipOutputStream;\n\n/**\n * Created by Christian Schabesberger on 28.01.18.\n * Copyright 2018 Christian Schabesberger <chris.schabesberger@mailbox.org>\n * ZipHelper.java is part of NewPipe\n * <p>\n * License: GPL-3.0+\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * <p>\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * <p>\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\npublic final class ZipHelper {\n    @FunctionalInterface\n    public interface InputStreamConsumer {\n        void acceptStream(InputStream inputStream) throws IOException;\n    }\n\n    @FunctionalInterface\n    public interface OutputStreamConsumer {\n        void acceptStream(OutputStream outputStream) throws IOException;\n    }\n\n\n    private ZipHelper() { }\n\n\n    /**\n     * This function helps to create zip files. Caution, this will overwrite the original file.\n     *\n     * @param outZip     the ZipOutputStream where the data should be stored in\n     * @param nameInZip  the path of the file inside the zip\n     * @param path       the path of the file on the disk that should be added to zip\n     */\n    public static void addFileToZip(final ZipOutputStream outZip,\n                                    final String nameInZip,\n                                    final Path path) throws IOException {\n        try (var inputStream = Files.newInputStream(path)) {\n            addFileToZip(outZip, nameInZip, inputStream);\n        }\n    }\n\n    /**\n     * This function helps to create zip files. Caution this will overwrite the original file.\n     *\n     * @param outZip         the ZipOutputStream where the data should be stored in\n     * @param nameInZip      the path of the file inside the zip\n     * @param streamConsumer will be called with an output stream that will go to the output file\n     */\n    public static void addFileToZip(final ZipOutputStream outZip,\n                                    final String nameInZip,\n                                    final OutputStreamConsumer streamConsumer) throws IOException {\n        final byte[] bytes;\n        try (var byteOutput = new ByteArrayOutputStream()) {\n            streamConsumer.acceptStream(byteOutput);\n            bytes = byteOutput.toByteArray();\n        }\n\n        try (var byteInput = new ByteArrayInputStream(bytes)) {\n            addFileToZip(outZip, nameInZip, byteInput);\n        }\n    }\n\n    /**\n     * This function helps to create zip files. Caution this will overwrite the original file.\n     *\n     * @param outZip      the ZipOutputStream where the data should be stored in\n     * @param nameInZip   the path of the file inside the zip\n     * @param inputStream the content to put inside the file\n     */\n    private static void addFileToZip(final ZipOutputStream outZip,\n                                     final String nameInZip,\n                                     final InputStream inputStream) throws IOException {\n        outZip.putNextEntry(new ZipEntry(nameInZip));\n        inputStream.transferTo(outZip);\n    }\n\n    /**\n     * This will extract data from ZipInputStream. Caution, this will overwrite the original file.\n     *\n     * @param zipFile    the zip file to extract from\n     * @param nameInZip  the path of the file inside the zip\n     * @param path       the path of the file on the disk where the data should be extracted to\n     * @return will return true if the file was found within the zip file\n     */\n    public static boolean extractFileFromZip(final StoredFileHelper zipFile,\n                                             final String nameInZip,\n                                             final Path path) throws IOException {\n        return extractFileFromZip(zipFile, nameInZip, input ->\n                Files.copy(input, path, StandardCopyOption.REPLACE_EXISTING));\n    }\n\n    /**\n     * This will extract data from ZipInputStream.\n     *\n     * @param zipFile        the zip file to extract from\n     * @param nameInZip      the path of the file inside the zip\n     * @param streamConsumer will be called with the input stream from the file inside the zip\n     * @return will return true if the file was found within the zip file\n     */\n    public static boolean extractFileFromZip(final StoredFileHelper zipFile,\n                                             final String nameInZip,\n                                             final InputStreamConsumer streamConsumer)\n            throws IOException {\n        try (ZipInputStream inZip = new ZipInputStream(new BufferedInputStream(\n                new SharpInputStream(zipFile.getStream())))) {\n            ZipEntry ze;\n            while ((ze = inZip.getNextEntry()) != null) {\n                if (ze.getName().equals(nameInZip)) {\n                    streamConsumer.acceptStream(inZip);\n                    return true;\n                }\n            }\n\n            return false;\n        }\n    }\n\n    /**\n     * @param zipFile   the zip file\n     * @param fileInZip the filename to check\n     * @return whether the provided filename is in the zip; only the first level is checked\n     */\n    public static boolean zipContainsFile(final StoredFileHelper zipFile, final String fileInZip)\n            throws Exception {\n        try (ZipInputStream inZip = new ZipInputStream(new BufferedInputStream(\n                new SharpInputStream(zipFile.getStream())))) {\n            ZipEntry ze;\n\n            while ((ze = inZip.getNextEntry()) != null) {\n                if (ze.getName().equals(fileInZip)) {\n                    return true;\n                }\n            }\n            return false;\n        }\n    }\n\n    public static boolean isValidZipFile(final StoredFileHelper file) {\n        try (ZipInputStream ignored = new ZipInputStream(new BufferedInputStream(\n                new SharpInputStream(file.getStream())))) {\n            return true;\n        } catch (final IOException ioe) {\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSavable.java",
    "content": "package org.schabi.newpipe.util.debounce;\n\nimport org.schabi.newpipe.error.ErrorInfo;\n\npublic interface DebounceSavable {\n\n    /**\n     * Execute operations to save the data. <br>\n     * Must set {@link DebounceSaver#setIsModified(boolean)} false in this method manually\n     * after the data has been saved.\n     */\n    void saveImmediate();\n\n    void showError(ErrorInfo errorInfo);\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/debounce/DebounceSaver.java",
    "content": "package org.schabi.newpipe.util.debounce;\n\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.UserAction;\n\nimport java.util.concurrent.TimeUnit;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.disposables.Disposable;\nimport io.reactivex.rxjava3.subjects.PublishSubject;\n\npublic class DebounceSaver {\n\n    private final long saveDebounceMillis;\n\n    private final PublishSubject<Long> debouncedSaveSignal;\n\n    private final DebounceSavable debounceSavable;\n\n    // Has the object been modified\n    private final AtomicBoolean isModified;\n\n    // Default 10 seconds\n    private static final long DEFAULT_SAVE_DEBOUNCE_MILLIS = 10000;\n\n\n    /**\n     * Creates a new {@code DebounceSaver}.\n     *\n     * @param saveDebounceMillis    Save the object milliseconds later after the last change\n     *                              occurred.\n     * @param debounceSavable       The object containing data to be saved.\n     */\n    public DebounceSaver(final long saveDebounceMillis, final DebounceSavable debounceSavable) {\n        this.saveDebounceMillis = saveDebounceMillis;\n        debouncedSaveSignal = PublishSubject.create();\n        this.debounceSavable = debounceSavable;\n        this.isModified = new AtomicBoolean();\n    }\n\n    /**\n     * Creates a new {@code DebounceSaver}. Save the object 10 seconds later after the last change\n     * occurred.\n     *\n     * @param debounceSavable       The object containing data to be saved.\n     */\n    public DebounceSaver(final DebounceSavable debounceSavable) {\n        this(DEFAULT_SAVE_DEBOUNCE_MILLIS, debounceSavable);\n    }\n\n    public boolean getIsModified() {\n        return isModified.get();\n    }\n\n    public void setNoChangesToSave() {\n        isModified.set(false);\n    }\n\n    public PublishSubject<Long> getDebouncedSaveSignal() {\n        return debouncedSaveSignal;\n    }\n\n    public Disposable getDebouncedSaver() {\n        return debouncedSaveSignal\n                .debounce(saveDebounceMillis, TimeUnit.MILLISECONDS)\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(ignored -> debounceSavable.saveImmediate(), throwable ->\n                        debounceSavable.showError(new ErrorInfo(throwable,\n                                UserAction.SOMETHING_ELSE, \"Debounced saver\")));\n    }\n\n    public void setHasChangesToSave() {\n        if (isModified == null || debouncedSaveSignal == null) {\n            return;\n        }\n\n        isModified.set(true);\n        debouncedSaveSignal.onNext(System.currentTimeMillis());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/external_communication/KoreUtils.java",
    "content": "package org.schabi.newpipe.util.external_communication;\n\nimport static org.schabi.newpipe.util.external_communication.ShareUtils.installApp;\nimport static org.schabi.newpipe.util.external_communication.ShareUtils.tryOpenIntentInApp;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\n\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.extractor.ServiceList;\n\n/**\n * Util class that provides methods which are related to the Kodi Media Center and its Kore app.\n * @see <a href=\"https://kodi.tv/\">Kodi website</a>\n */\npublic final class KoreUtils {\n    private KoreUtils() { }\n\n    public static boolean isServiceSupportedByKore(final int serviceId) {\n        return (serviceId == ServiceList.YouTube.getServiceId()\n                || serviceId == ServiceList.SoundCloud.getServiceId());\n    }\n\n    public static boolean shouldShowPlayWithKodi(@NonNull final Context context,\n                                                 final int serviceId) {\n        return isServiceSupportedByKore(serviceId)\n                && PreferenceManager.getDefaultSharedPreferences(context)\n                .getBoolean(context.getString(R.string.show_play_with_kodi_key), false);\n    }\n\n    /**\n     * Start an activity to install Kore.\n     *\n     * @param context the context to use\n     */\n    public static void installKore(final Context context) {\n        installApp(context, context.getString(R.string.kore_package));\n    }\n\n    /**\n     * Start Kore app to show a video on Kodi, and if the app is not installed ask the user to\n     * install it.\n     * <p>\n     * For a list of supported urls see the\n     * <a href=\"https://github.com/xbmc/Kore/blob/master/app/src/main/AndroidManifest.xml\">\n     * Kore source code\n     * </a>.\n     *\n     * @param context   the context to use\n     * @param streamUrl the url to the stream to play\n     */\n    public static void playWithKore(final Context context, final Uri streamUrl) {\n        final Intent intent = new Intent(Intent.ACTION_VIEW)\n                .setPackage(context.getString(R.string.kore_package))\n                .setData(streamUrl)\n                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n\n        if (!tryOpenIntentInApp(context, intent)) {\n            new AlertDialog.Builder(context)\n                    .setMessage(R.string.kore_not_found)\n                    .setPositiveButton(R.string.install, (dialog, which) ->\n                            installKore(context))\n                    .setNegativeButton(R.string.cancel, null)\n                    .show();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/external_communication/ShareUtils.java",
    "content": "package org.schabi.newpipe.util.external_communication;\n\nimport static org.schabi.newpipe.MainActivity.DEBUG;\nimport static coil3.Image_androidKt.toBitmap;\n\nimport android.content.ActivityNotFoundException;\nimport android.content.ClipData;\nimport android.content.ClipboardManager;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.content.ContextCompat;\nimport androidx.core.content.FileProvider;\n\nimport org.schabi.newpipe.BuildConfig;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.RouterActivity;\nimport org.schabi.newpipe.extractor.Image;\nimport org.schabi.newpipe.util.image.ImageStrategy;\n\nimport java.nio.file.Files;\nimport java.util.Collections;\nimport java.util.List;\n\nimport coil3.SingletonImageLoader;\nimport coil3.disk.DiskCache;\nimport coil3.memory.MemoryCache;\n\npublic final class ShareUtils {\n    private static final String TAG = ShareUtils.class.getSimpleName();\n\n    private ShareUtils() {\n    }\n\n    /**\n     * Open an Intent to install an app.\n     * <p>\n     * This method tries to open the default app market with the package id passed as the\n     * second param (a system chooser will be opened if there are multiple markets and no default)\n     * and falls back to Google Play Store web URL if no app to handle the market scheme was found.\n     * <p>\n     * It uses {@link #openIntentInApp(Context, Intent)} to open market scheme and {@link\n     * #openUrlInBrowser(Context, String)} to open Google Play Store web URL.\n     *\n     * @param context   the context to use\n     * @param packageId the package id of the app to be installed\n     */\n    public static void installApp(@NonNull final Context context, final String packageId) {\n        // Try market scheme\n        final Intent marketSchemeIntent = new Intent(Intent.ACTION_VIEW,\n                Uri.parse(\"market://details?id=\" + packageId))\n                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        if (!tryOpenIntentInApp(context, marketSchemeIntent)) {\n            // Fall back to Google Play Store Web URL (F-Droid can handle it)\n            openUrlInApp(context, \"https://play.google.com/store/apps/details?id=\" + packageId);\n        }\n    }\n\n    /**\n     * Open the url with the system default browser. If no browser is installed, falls back to\n     * {@link #openAppChooser(Context, Intent, boolean)} (for displaying that no apps are available\n     * to handle the action, or possible OEM-related edge cases).\n     * <p>\n     * This function selects the package to open based on which apps respond to the {@code http://}\n     * schema alone, which should exclude special non-browser apps that are can handle the url (e.g.\n     * the official YouTube app).\n     * <p>\n     * Therefore <b>please prefer {@link #openUrlInApp(Context, String)}</b>, that handles package\n     * resolution in a standard way, unless this is the action of an explicit \"Open in browser\"\n     * button.\n     *\n     * @param context the context to use\n     * @param url     the url to browse\n     **/\n    public static void openUrlInBrowser(@NonNull final Context context, final String url) {\n        // Target a generic http://, so we are sure to get a browser and not e.g. the yt app.\n        // Note that this requires the `http` schema to be added to `<queries>` in the manifest.\n        final Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(\"http://\"));\n\n        final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url))\n                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n\n        // See https://stackoverflow.com/a/58801285 and `setSelector` documentation\n        intent.setSelector(browserIntent);\n        try {\n            context.startActivity(intent);\n        } catch (final ActivityNotFoundException e) {\n            // No browser is available. This should, in the end, yield a nice AOSP error message\n            // indicating that no app is available to handle this action.\n            //\n            // Note: there are some situations where modified OEM ROMs have apps that appear\n            // to be browsers but are actually app choosers. If starting the Activity fails\n            // related to this, opening the system app chooser is still the correct behavior.\n            intent.setSelector(null);\n            openAppChooser(context, intent, true);\n        }\n    }\n\n    /**\n     * Open a url with the system default app using {@link Intent#ACTION_VIEW}, showing a toast in\n     * case of failure.\n     *\n     * @param context the context to use\n     * @param url     the url to open\n     */\n    public static void openUrlInApp(@NonNull final Context context, final String url) {\n        openIntentInApp(context, new Intent(Intent.ACTION_VIEW, Uri.parse(url))\n                .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));\n    }\n\n    /**\n     * Open an intent with the system default app.\n     * <p>\n     * Use {@link #openIntentInApp(Context, Intent)} to show a toast in case of failure.\n     *\n     * @param context the context to use\n     * @param intent  the intent to open\n     * @return true if the intent could be opened successfully, false otherwise\n     */\n    public static boolean tryOpenIntentInApp(@NonNull final Context context,\n                                             @NonNull final Intent intent) {\n        try {\n            context.startActivity(intent);\n        } catch (final ActivityNotFoundException e) {\n            return false;\n        }\n        return true;\n    }\n\n    /**\n     * Open an intent with the system default app, showing a toast in case of failure.\n     * <p>\n     * Use {@link #tryOpenIntentInApp(Context, Intent)} if you don't want the toast. Use {@link\n     * #openUrlInApp(Context, String)} as a shorthand for {@link Intent#ACTION_VIEW} with urls.\n     *\n     * @param context the context to use\n     * @param intent  the intent to\n     */\n    public static void openIntentInApp(@NonNull final Context context,\n                                       @NonNull final Intent intent) {\n        if (!tryOpenIntentInApp(context, intent)) {\n            Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG)\n                    .show();\n        }\n    }\n\n    /**\n     * Open the system chooser to launch an intent.\n     * <p>\n     * This method opens an {@link android.content.Intent#ACTION_CHOOSER} of the intent putted\n     * as the intent param. If the setTitleChooser boolean is true, the string \"Open with\" will be\n     * set as the title of the system chooser.\n     * For Android P and higher, title for {@link android.content.Intent#ACTION_SEND} system\n     * choosers must be set on this intent, not on the\n     * {@link android.content.Intent#ACTION_CHOOSER} intent.\n     *\n     * @param context         the context to use\n     * @param intent          the intent to open\n     * @param setTitleChooser set the title \"Open with\" to the chooser if true, else not\n     */\n    private static void openAppChooser(@NonNull final Context context,\n                                       @NonNull final Intent intent,\n                                       final boolean setTitleChooser) {\n        final Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);\n        chooserIntent.putExtra(Intent.EXTRA_INTENT, intent);\n        chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        if (setTitleChooser) {\n            chooserIntent.putExtra(Intent.EXTRA_TITLE, context.getString(R.string.open_with));\n        }\n\n        // Avoid opening in NewPipe\n        // (Implementation note: if the URL is one for which NewPipe itself\n        // is set as handler on Android >= 12, we actually remove the only eligible app\n        // for this link, and browsers will not be offered to the user. For that, use\n        // `openUrlInBrowser`.)\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n            chooserIntent.putExtra(\n                    Intent.EXTRA_EXCLUDE_COMPONENTS,\n                    new ComponentName[]{new ComponentName(context, RouterActivity.class)}\n            );\n        }\n\n        // Migrate any clip data and flags from the original intent.\n        final int permFlags = intent.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION\n                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION\n                | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION\n                | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);\n        if (permFlags != 0) {\n            ClipData targetClipData = intent.getClipData();\n            if (targetClipData == null && intent.getData() != null) {\n                final ClipData.Item item = new ClipData.Item(intent.getData());\n                final String[] mimeTypes;\n                if (intent.getType() != null) {\n                    mimeTypes = new String[] {intent.getType()};\n                } else {\n                    mimeTypes = new String[] {};\n                }\n                targetClipData = new ClipData(null, mimeTypes, item);\n            }\n            if (targetClipData != null) {\n                chooserIntent.setClipData(targetClipData);\n                chooserIntent.addFlags(permFlags);\n            }\n        }\n\n        try {\n            context.startActivity(chooserIntent);\n        } catch (final ActivityNotFoundException e) {\n            Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show();\n        }\n    }\n\n    /**\n     * Open the android share sheet to share a content.\n     *\n     * <p>\n     * For Android 10+ users, a content preview is shown, which includes the title of the shared\n     * content and an image preview the content, if its URL is not null or empty and its\n     * corresponding image is in the image cache.\n     * </p>\n     *\n     * @param context         the context to use\n     * @param title           the title of the content\n     * @param content         the content to share\n     * @param imagePreviewUrl the image of the subject\n     */\n    public static void shareText(@NonNull final Context context,\n                                 @NonNull final String title,\n                                 final String content,\n                                 final String imagePreviewUrl) {\n        final Intent shareIntent = new Intent(Intent.ACTION_SEND);\n        shareIntent.setType(\"text/plain\");\n        shareIntent.putExtra(Intent.EXTRA_TEXT, content);\n        if (!TextUtils.isEmpty(title)) {\n            shareIntent.putExtra(Intent.EXTRA_TITLE, title);\n            shareIntent.putExtra(Intent.EXTRA_SUBJECT, title);\n        }\n\n        // Content preview in the share sheet has been added in Android 10, so it's not needed to\n        // set a content preview which will be never displayed\n        // See https://developer.android.com/training/sharing/send#adding-rich-content-previews\n        // If loading of images has been disabled, don't try to generate a content preview\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q\n                && !TextUtils.isEmpty(imagePreviewUrl)\n                && ImageStrategy.shouldLoadImages()) {\n\n            final ClipData clipData = generateClipDataForImagePreview(context, imagePreviewUrl);\n            if (clipData != null) {\n                shareIntent.setClipData(clipData);\n                shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);\n            }\n        }\n\n        openAppChooser(context, shareIntent, false);\n    }\n\n    /**\n     * Open the android share sheet to share a content.\n     *\n     * <p>\n     * For Android 10+ users, a content preview is shown, which includes the title of the shared\n     * content and an image preview the content, if the preferred image chosen by {@link\n     * ImageStrategy#choosePreferredImage(List)} is in the image cache.\n     * </p>\n     *\n     * @param context the context to use\n     * @param title   the title of the content\n     * @param content the content to share\n     * @param images  a set of possible {@link Image}s of the subject, among which to choose with\n     *                {@link ImageStrategy#choosePreferredImage(List)} since that's likely to\n     *                provide an image that is in Coil's cache\n     */\n    public static void shareText(@NonNull final Context context,\n                                 @NonNull final String title,\n                                 final String content,\n                                 final List<Image> images) {\n        shareText(context, title, content, ImageStrategy.choosePreferredImage(images));\n    }\n\n    /**\n     * Open the android share sheet to share a content.\n     *\n     * <p>\n     * This calls {@link #shareText(Context, String, String, String)} with an empty string for the\n     * {@code imagePreviewUrl} parameter. This method should be used when the shared content has no\n     * preview thumbnail.\n     * </p>\n     *\n     * @param context the context to use\n     * @param title   the title of the content\n     * @param content the content to share\n     */\n    public static void shareText(@NonNull final Context context,\n                                 @NonNull final String title,\n                                 final String content) {\n        shareText(context, title, content, \"\");\n    }\n\n    /**\n     * Copy the text to clipboard, and indicate to the user whether the operation was completed\n     * successfully using a Toast.\n     *\n     * @param context the context to use\n     * @param text    the text to copy\n     */\n    public static void copyToClipboard(@NonNull final Context context, final String text) {\n        final ClipboardManager clipboardManager =\n                ContextCompat.getSystemService(context, ClipboardManager.class);\n\n        if (clipboardManager == null) {\n            Toast.makeText(context, R.string.permission_denied, Toast.LENGTH_LONG).show();\n            return;\n        }\n\n        try {\n            clipboardManager.setPrimaryClip(ClipData.newPlainText(null, text));\n            if (Build.VERSION.SDK_INT < 33) {\n                // Android 13 has its own \"copied to clipboard\" dialog\n                Toast.makeText(context, R.string.msg_copied, Toast.LENGTH_SHORT).show();\n            }\n        } catch (final Exception e) {\n            Log.e(TAG, \"Error when trying to copy text to clipboard\", e);\n            Toast.makeText(context, R.string.msg_failed_to_copy, Toast.LENGTH_SHORT).show();\n        }\n    }\n\n    /**\n     * Generate a {@link ClipData} with the image of the content shared, if it's in the app cache.\n     *\n     * <p>\n     * In order not to worry about network issues (timeouts, DNS issues, low connection speed, ...)\n     * when sharing a content, only images in the {@link MemoryCache} or {@link DiskCache}\n     * used by the Coil library are used as preview images. If the thumbnail image is not in the\n     * cache, no {@link ClipData} will be generated and {@code null} will be returned.\n     *\n     * <p>\n     * In order to display the image in the content preview of the Android share sheet, an URI of\n     * the content, accessible and readable by other apps has to be generated, so a new file inside\n     * the application cache will be generated, named {@code android_share_sheet_image_preview.jpg}\n     * (if a file under this name already exists, it will be overwritten). The thumbnail will be\n     * compressed in JPEG format, with a {@code 90} compression level.\n     * </p>\n     *\n     * <p>\n     * Note that if an exception occurs when generating the {@link ClipData}, {@code null} is\n     * returned.\n     * </p>\n     *\n     * <p>\n     * Using the result of this method when sharing has only an effect on the system share sheet (if\n     * OEMs didn't change Android system standard behavior) on Android API 29 and higher.\n     * </p>\n     *\n     * @param context      the context to use\n     * @param thumbnailUrl the URL of the content thumbnail\n     * @return a {@link ClipData} of the content thumbnail, or {@code null}\n     */\n    @Nullable\n    private static ClipData generateClipDataForImagePreview(\n            @NonNull final Context context,\n            @NonNull final String thumbnailUrl) {\n        try {\n            // Save the image in memory to the application's cache because we need a URI to the\n            // image to generate a ClipData which will show the share sheet, and so an image file\n            final Context applicationContext = context.getApplicationContext();\n            final var loader = SingletonImageLoader.get(context);\n            final var value = loader.getMemoryCache()\n                    .get(new MemoryCache.Key(thumbnailUrl, Collections.emptyMap()));\n\n            final Bitmap cachedBitmap;\n            if (value != null) {\n                cachedBitmap = toBitmap(value.getImage());\n            } else {\n                try (var snapshot = loader.getDiskCache().openSnapshot(thumbnailUrl)) {\n                    if (snapshot != null) {\n                        cachedBitmap = BitmapFactory.decodeFile(snapshot.getData().toString());\n                    } else {\n                        cachedBitmap = null;\n                    }\n                }\n            }\n\n            if (cachedBitmap == null) {\n                return null;\n            }\n\n            final var path = applicationContext.getCacheDir().toPath()\n                    .resolve(\"android_share_sheet_image_preview.jpg\");\n            // Any existing file will be overwritten\n            try (var outputStream = Files.newOutputStream(path)) {\n                cachedBitmap.compress(Bitmap.CompressFormat.JPEG, 90, outputStream);\n            }\n\n            final ClipData clipData = ClipData.newUri(applicationContext.getContentResolver(), \"\",\n                    FileProvider.getUriForFile(applicationContext,\n                            BuildConfig.APPLICATION_ID + \".provider\",\n                            path.toFile()));\n\n            if (DEBUG) {\n                Log.d(TAG, \"ClipData successfully generated for Android share sheet: \" + clipData);\n            }\n            return clipData;\n        } catch (final Exception e) {\n            Log.w(TAG, \"Error when setting preview image for share sheet\", e);\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/image/CoilHelper.kt",
    "content": "package org.schabi.newpipe.util.image\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.util.Log\nimport android.widget.ImageView\nimport androidx.annotation.DrawableRes\nimport coil3.executeBlocking\nimport coil3.imageLoader\nimport coil3.request.Disposable\nimport coil3.request.ImageRequest\nimport coil3.request.error\nimport coil3.request.placeholder\nimport coil3.request.target\nimport coil3.request.transformations\nimport coil3.size.Size\nimport coil3.target.Target\nimport coil3.toBitmap\nimport coil3.transform.Transformation\nimport kotlin.math.min\nimport org.schabi.newpipe.MainActivity\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.extractor.Image\nimport org.schabi.newpipe.ktx.scale\n\nobject CoilHelper {\n    private val TAG = CoilHelper::class.java.simpleName\n\n    @JvmOverloads\n    fun loadBitmapBlocking(\n        context: Context,\n        url: String?,\n        @DrawableRes placeholderResId: Int = 0\n    ): Bitmap? = context.imageLoader\n        .executeBlocking(getImageRequest(context, url, placeholderResId).build())\n        .image\n        ?.toBitmap()\n\n    fun loadAvatar(\n        target: ImageView,\n        images: List<Image>\n    ) {\n        loadImageDefault(target, images, R.drawable.placeholder_person)\n    }\n\n    fun loadAvatar(\n        target: ImageView,\n        url: String?\n    ) {\n        loadImageDefault(target, url, R.drawable.placeholder_person)\n    }\n\n    fun loadThumbnail(\n        target: ImageView,\n        images: List<Image>\n    ) {\n        loadImageDefault(target, images, R.drawable.placeholder_thumbnail_video)\n    }\n\n    fun loadThumbnail(\n        target: ImageView,\n        url: String?\n    ) {\n        loadImageDefault(target, url, R.drawable.placeholder_thumbnail_video)\n    }\n\n    fun loadScaledDownThumbnail(\n        context: Context,\n        images: List<Image>,\n        target: Target\n    ): Disposable {\n        val url = ImageStrategy.choosePreferredImage(images)\n        val request =\n            getImageRequest(context, url, R.drawable.placeholder_thumbnail_video)\n                .target(target)\n                .transformations(\n                    object : Transformation() {\n                        override val cacheKey = \"COIL_PLAYER_THUMBNAIL_TRANSFORMATION_KEY\"\n\n                        override suspend fun transform(\n                            input: Bitmap,\n                            size: Size\n                        ): Bitmap {\n                            if (MainActivity.DEBUG) {\n                                Log.d(TAG, \"Thumbnail - transform() called\")\n                            }\n\n                            val notificationThumbnailWidth =\n                                min(\n                                    context.resources.getDimension(R.dimen.player_notification_thumbnail_width),\n                                    input.width.toFloat()\n                                ).toInt()\n\n                            var newHeight = input.height / (input.width / notificationThumbnailWidth)\n                            val result = input.scale(notificationThumbnailWidth, newHeight)\n\n                            return if (result == input || !result.isMutable) {\n                                // create a new mutable bitmap to prevent strange crashes on some\n                                // devices (see #4638)\n                                newHeight = input.height / (input.width / (notificationThumbnailWidth - 1))\n                                input.scale(notificationThumbnailWidth, newHeight)\n                            } else {\n                                result\n                            }\n                        }\n                    }\n                ).build()\n\n        return context.imageLoader.enqueue(request)\n    }\n\n    fun loadDetailsThumbnail(\n        target: ImageView,\n        images: List<Image>\n    ) {\n        val url = ImageStrategy.choosePreferredImage(images)\n        loadImageDefault(target, url, R.drawable.placeholder_thumbnail_video, false)\n    }\n\n    fun loadBanner(\n        target: ImageView,\n        images: List<Image>\n    ) {\n        loadImageDefault(target, images, R.drawable.placeholder_channel_banner)\n    }\n\n    fun loadPlaylistThumbnail(\n        target: ImageView,\n        images: List<Image>\n    ) {\n        loadImageDefault(target, images, R.drawable.placeholder_thumbnail_playlist)\n    }\n\n    fun loadPlaylistThumbnail(\n        target: ImageView,\n        url: String?\n    ) {\n        loadImageDefault(target, url, R.drawable.placeholder_thumbnail_playlist)\n    }\n\n    private fun loadImageDefault(\n        target: ImageView,\n        images: List<Image>,\n        @DrawableRes placeholderResId: Int\n    ) {\n        loadImageDefault(target, ImageStrategy.choosePreferredImage(images), placeholderResId)\n    }\n\n    private fun loadImageDefault(\n        target: ImageView,\n        url: String?,\n        @DrawableRes placeholderResId: Int,\n        showPlaceholder: Boolean = true\n    ) {\n        val request =\n            getImageRequest(target.context, url, placeholderResId, showPlaceholder)\n                .target(target)\n                .build()\n        target.context.imageLoader.enqueue(request)\n    }\n\n    private fun getImageRequest(\n        context: Context,\n        url: String?,\n        @DrawableRes placeholderResId: Int,\n        showPlaceholderWhileLoading: Boolean = true\n    ): ImageRequest.Builder {\n        // if the URL was chosen with `choosePreferredImage` it will be null, but check again\n        // `shouldLoadImages` in case the URL was chosen with `imageListToDbUrl` (which is the case\n        // for URLs stored in the database)\n        val takenUrl = url?.takeIf { it.isNotEmpty() && ImageStrategy.shouldLoadImages() }\n\n        return ImageRequest\n            .Builder(context)\n            .data(takenUrl)\n            .error(placeholderResId)\n            .memoryCacheKey(takenUrl)\n            .diskCacheKey(takenUrl)\n            .apply {\n                if (takenUrl != null || showPlaceholderWhileLoading) {\n                    placeholder(placeholderResId)\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/image/ImageStrategy.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2023-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.util.image\n\nimport kotlin.math.abs\nimport org.schabi.newpipe.extractor.Image\nimport org.schabi.newpipe.extractor.Image.ResolutionLevel\n\nobject ImageStrategy {\n    // when preferredImageQuality is LOW or MEDIUM, images are sorted by how close their preferred\n    // image quality is to these values (H stands for \"Height\")\n    private const val BEST_LOW_H = 75\n    private const val BEST_MEDIUM_H = 250\n\n    private var preferredImageQuality = PreferredImageQuality.MEDIUM\n\n    @JvmStatic\n    fun setPreferredImageQuality(preferredImageQuality: PreferredImageQuality) {\n        ImageStrategy.preferredImageQuality = preferredImageQuality\n    }\n\n    @JvmStatic\n    fun shouldLoadImages(): Boolean {\n        return preferredImageQuality != PreferredImageQuality.NONE\n    }\n\n    @JvmStatic\n    fun estimatePixelCount(image: Image, widthOverHeight: Double): Double {\n        if (image.height == Image.HEIGHT_UNKNOWN) {\n            if (image.width == Image.WIDTH_UNKNOWN) {\n                // images whose size is completely unknown will be in their own subgroups, so\n                // any one of them will do, hence returning the same value for all of them\n                return 0.0\n            } else {\n                return image.width * image.width / widthOverHeight\n            }\n        } else if (image.width == Image.WIDTH_UNKNOWN) {\n            return image.height * image.height * widthOverHeight\n        } else {\n            return (image.height * image.width).toDouble()\n        }\n    }\n\n    /**\n     * [choosePreferredImage] contains the description for this function's logic.\n     *\n     * @param images the images from which to choose\n     * @param nonNoneQuality the preferred quality (must NOT be [PreferredImageQuality.NONE])\n     * @return the chosen preferred image, or `null` if the list is empty\n     * @see [choosePreferredImage]\n     */\n    @JvmStatic\n    fun choosePreferredImage(images: List<Image>, nonNoneQuality: PreferredImageQuality): String? {\n        // this will be used to estimate the pixel count for images where only one of height or\n        // width are known\n        val widthOverHeight = images\n            .filter { image ->\n                image.height != Image.HEIGHT_UNKNOWN && image.width != Image.WIDTH_UNKNOWN\n            }\n            .map { image -> (image.width.toDouble()) / image.height }\n            .elementAtOrNull(0) ?: 1.0\n\n        val preferredLevel = nonNoneQuality.toResolutionLevel()\n        // TODO: rewrite using kotlin collections API `groupBy` will be handy\n        val initialComparator =\n            Comparator // the first step splits the images into groups of resolution levels\n                .comparingInt { i: Image ->\n                    return@comparingInt when (i.estimatedResolutionLevel) {\n                        // avoid unknowns as much as possible\n                        ResolutionLevel.UNKNOWN -> 3\n\n                        // prefer a matching resolution level\n                        preferredLevel -> 0\n\n                        // the preferredLevel is only 1 \"step\" away (either HIGH or LOW)\n                        ResolutionLevel.MEDIUM -> 1\n\n                        // the preferredLevel is the furthest away possible (2 \"steps\")\n                        else -> 2\n                    }\n                }\n                // then each level's group is further split into two subgroups, one with known image\n                // size (which is also the preferred subgroup) and the other without\n                .thenComparing { image -> image.height == Image.HEIGHT_UNKNOWN && image.width == Image.WIDTH_UNKNOWN }\n\n        // The third step chooses, within each subgroup with known image size, the best image based\n        // on how close its size is to BEST_LOW_H or BEST_MEDIUM_H (with proper units). Subgroups\n        // without known image size will be left untouched since estimatePixelCount always returns\n        // the same number for those.\n        val finalComparator = when (nonNoneQuality) {\n            PreferredImageQuality.NONE -> initialComparator\n\n            PreferredImageQuality.LOW -> initialComparator.thenComparingDouble { image ->\n                val pixelCount = estimatePixelCount(image, widthOverHeight)\n                abs(pixelCount - BEST_LOW_H * BEST_LOW_H * widthOverHeight)\n            }\n\n            PreferredImageQuality.MEDIUM -> initialComparator.thenComparingDouble { image ->\n                val pixelCount = estimatePixelCount(image, widthOverHeight)\n                abs(pixelCount - BEST_MEDIUM_H * BEST_MEDIUM_H * widthOverHeight)\n            }\n\n            PreferredImageQuality.HIGH -> initialComparator.thenComparingDouble { image ->\n                // this is reversed with a - so that the highest resolution is chosen\n                -estimatePixelCount(image, widthOverHeight)\n            }\n        }\n\n        return images.stream() // using \"min\" basically means \"take the first group, then take the first subgroup,\n            // then choose the best image, while ignoring all other groups and subgroups\"\n            .min(finalComparator)\n            .map(Image::getUrl)\n            .orElse(null)\n    }\n\n    /**\n     * Chooses an image amongst the provided list based on the user preference previously set with\n     * [setPreferredImageQuality]. `null` will be returned in\n     * case the list is empty or the user preference is to not show images.\n     * <br>\n     * These properties will be preferred, from most to least important:\n     *\n     * 1. The image's [Image.estimatedResolutionLevel] is not unknown and is close to [preferredImageQuality]\n     * 2. At least one of the image's width or height are known\n     * 3. The highest resolution image is finally chosen if the user's preference is\n     * [PreferredImageQuality.HIGH], otherwise the chosen image is the one that has the height\n     * closest to [BEST_LOW_H] or [BEST_MEDIUM_H]\n     *\n     * <br>\n     * Use [imageListToDbUrl] if the URL is going to be saved to the database, to avoid\n     * saving nothing in case at the moment of saving the user preference is to not show images.\n     *\n     * @param images the images from which to choose\n     * @return the chosen preferred image, or `null` if the list is empty or the user disabled\n     * images\n     * @see [imageListToDbUrl]\n     */\n    @JvmStatic\n    fun choosePreferredImage(images: List<Image>): String? {\n        if (preferredImageQuality == PreferredImageQuality.NONE) {\n            return null // do not load images\n        }\n\n        return choosePreferredImage(images, preferredImageQuality)\n    }\n\n    /**\n     * Like [choosePreferredImage], except that if [preferredImageQuality] is\n     * [PreferredImageQuality.NONE] an image will be chosen anyway (with preferred quality\n     * [PreferredImageQuality.MEDIUM].\n     * <br></br>\n     * To go back to a list of images (obviously with just the one chosen image) from a URL saved in\n     * the database use [dbUrlToImageList].\n     *\n     * @param images the images from which to choose\n     * @return the chosen preferred image, or `null` if the list is empty\n     * @see [choosePreferredImage]\n     * @see [dbUrlToImageList]\n     */\n    @JvmStatic\n    fun imageListToDbUrl(images: List<Image>): String? {\n        val quality = when (preferredImageQuality) {\n            PreferredImageQuality.NONE -> PreferredImageQuality.MEDIUM\n            else -> preferredImageQuality\n        }\n\n        return choosePreferredImage(images, quality)\n    }\n\n    /**\n     * Wraps the URL (coming from the database) in a `List<Image>` so that it is usable\n     * seamlessly in all of the places where the extractor would return a list of images, including\n     * allowing to build info objects based on database objects.\n     * <br></br>\n     * To obtain a url to save to the database from a list of images use [imageListToDbUrl].\n     *\n     * @param url the URL to wrap coming from the database, or `null` to get an empty list\n     * @return a list containing just one [Image] wrapping the provided URL, with unknown\n     * image size fields, or an empty list if the URL is `null`\n     * @see [imageListToDbUrl]\n     */\n    @JvmStatic\n    fun dbUrlToImageList(url: String?): List<Image> {\n        return when (url) {\n            null -> listOf()\n\n            else -> listOf(\n                Image(\n                    url,\n                    Image.HEIGHT_UNKNOWN,\n                    Image.WIDTH_UNKNOWN,\n                    ResolutionLevel.UNKNOWN\n                )\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/image/PreferredImageQuality.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2023-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.util.image\n\nimport android.content.Context\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.extractor.Image.ResolutionLevel\n\nenum class PreferredImageQuality {\n    NONE,\n    LOW,\n    MEDIUM,\n    HIGH;\n\n    fun toResolutionLevel(): ResolutionLevel {\n        return when (this) {\n            LOW -> ResolutionLevel.LOW\n            MEDIUM -> ResolutionLevel.MEDIUM\n            HIGH -> ResolutionLevel.HIGH\n            NONE -> ResolutionLevel.UNKNOWN\n        }\n    }\n\n    companion object {\n        @JvmStatic\n        fun fromPreferenceKey(context: Context, key: String?): PreferredImageQuality {\n            return when (key) {\n                context.getString(R.string.image_quality_none_key) -> NONE\n                context.getString(R.string.image_quality_low_key) -> LOW\n                context.getString(R.string.image_quality_high_key) -> HIGH\n                else -> MEDIUM // default to medium\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/potoken/JavaScriptUtil.kt",
    "content": "package org.schabi.newpipe.util.potoken\n\nimport com.grack.nanojson.JsonObject\nimport com.grack.nanojson.JsonParser\nimport com.grack.nanojson.JsonWriter\nimport okio.ByteString.Companion.decodeBase64\nimport okio.ByteString.Companion.toByteString\n\n/**\n * Parses the raw challenge data obtained from the Create endpoint and returns an object that can be\n * embedded in a JavaScript snippet.\n */\nfun parseChallengeData(rawChallengeData: String): String {\n    val scrambled = JsonParser.array().from(rawChallengeData)\n\n    val challengeData = if (scrambled.size > 1 && scrambled.isString(1)) {\n        val descrambled = descramble(scrambled.getString(1))\n        JsonParser.array().from(descrambled)\n    } else {\n        scrambled.getArray(0)\n    }\n\n    val messageId = challengeData.getString(0)\n    val interpreterHash = challengeData.getString(3)\n    val program = challengeData.getString(4)\n    val globalName = challengeData.getString(5)\n    val clientExperimentsStateBlob = challengeData.getString(7)\n\n    val privateDoNotAccessOrElseSafeScriptWrappedValue = challengeData.getArray(1, null)?.find { it is String }\n    val privateDoNotAccessOrElseTrustedResourceUrlWrappedValue = challengeData.getArray(2, null)?.find { it is String }\n\n    return JsonWriter.string(\n        JsonObject.builder()\n            .value(\"messageId\", messageId)\n            .`object`(\"interpreterJavascript\")\n            .value(\"privateDoNotAccessOrElseSafeScriptWrappedValue\", privateDoNotAccessOrElseSafeScriptWrappedValue)\n            .value(\"privateDoNotAccessOrElseTrustedResourceUrlWrappedValue\", privateDoNotAccessOrElseTrustedResourceUrlWrappedValue)\n            .end()\n            .value(\"interpreterHash\", interpreterHash)\n            .value(\"program\", program)\n            .value(\"globalName\", globalName)\n            .value(\"clientExperimentsStateBlob\", clientExperimentsStateBlob)\n            .done()\n    )\n}\n\n/**\n * Parses the raw integrity token data obtained from the GenerateIT endpoint to a JavaScript\n * `Uint8Array` that can be embedded directly in JavaScript code, and an [Int] representing the\n * duration of this token in seconds.\n */\nfun parseIntegrityTokenData(rawIntegrityTokenData: String): Pair<String, Long> {\n    val integrityTokenData = JsonParser.array().from(rawIntegrityTokenData)\n    return base64ToU8(integrityTokenData.getString(0)) to integrityTokenData.getLong(1)\n}\n\n/**\n * Converts a string (usually the identifier used as input to `obtainPoToken`) to a JavaScript\n * `Uint8Array` that can be embedded directly in JavaScript code.\n */\nfun stringToU8(identifier: String): String {\n    return newUint8Array(identifier.toByteArray())\n}\n\n/**\n * Takes a poToken encoded as a sequence of bytes represented as integers separated by commas\n * (e.g. \"97,98,99\" would be \"abc\"), which is the output of `Uint8Array::toString()` in JavaScript,\n * and converts it to the specific base64 representation for poTokens.\n */\nfun u8ToBase64(poToken: String): String {\n    return poToken.split(\",\")\n        .map { it.toUByte().toByte() }\n        .toByteArray()\n        .toByteString()\n        .base64()\n        .replace(\"+\", \"-\")\n        .replace(\"/\", \"_\")\n}\n\n/**\n * Takes the scrambled challenge, decodes it from base64, adds 97 to each byte.\n */\nprivate fun descramble(scrambledChallenge: String): String {\n    return base64ToByteString(scrambledChallenge)\n        .map { (it + 97).toByte() }\n        .toByteArray()\n        .decodeToString()\n}\n\n/**\n * Decodes a base64 string encoded in the specific base64 representation used by YouTube, and\n * returns a JavaScript `Uint8Array` that can be embedded directly in JavaScript code.\n */\nprivate fun base64ToU8(base64: String): String {\n    return newUint8Array(base64ToByteString(base64))\n}\n\nprivate fun newUint8Array(contents: ByteArray): String {\n    return \"new Uint8Array([\" + contents.joinToString(separator = \",\") { it.toUByte().toString() } + \"])\"\n}\n\n/**\n * Decodes a base64 string encoded in the specific base64 representation used by YouTube.\n */\nprivate fun base64ToByteString(base64: String): ByteArray {\n    val base64Mod = base64\n        .replace('-', '+')\n        .replace('_', '/')\n        .replace('.', '=')\n\n    return (base64Mod.decodeBase64() ?: throw PoTokenException(\"Cannot base64 decode\"))\n        .toByteArray()\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenException.kt",
    "content": "package org.schabi.newpipe.util.potoken\n\nclass PoTokenException(message: String) : Exception(message)\n\n// to be thrown if the WebView provided by the system is broken\nclass BadWebViewException(message: String) : Exception(message)\n\nfun buildExceptionForJsError(error: String): Exception {\n    return if (error.contains(\"SyntaxError\")) {\n        BadWebViewException(error)\n    } else {\n        PoTokenException(error)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenGenerator.kt",
    "content": "package org.schabi.newpipe.util.potoken\n\nimport android.content.Context\nimport io.reactivex.rxjava3.core.Single\nimport java.io.Closeable\n\n/**\n * This interface was created to allow for multiple methods to generate poTokens in the future (e.g.\n * via WebView and via a local DOM implementation)\n */\ninterface PoTokenGenerator : Closeable {\n    /**\n     * Generates a poToken for the provided identifier, using the `integrityToken` and\n     * `webPoSignalOutput` previously obtained in the initialization of [PoTokenWebView]. Can be\n     * called multiple times.\n     */\n    fun generatePoToken(identifier: String): Single<String>\n\n    /**\n     * @return whether the `integrityToken` is expired, in which case all tokens generated by\n     * [generatePoToken] will be invalid\n     */\n    fun isExpired(): Boolean\n\n    interface Factory {\n        /**\n         * Initializes a [PoTokenGenerator] by loading the BotGuard VM, running it, and obtaining\n         * an `integrityToken`. Can then be used multiple times to generate multiple poTokens with\n         * [generatePoToken].\n         *\n         * @param context used e.g. to load the HTML asset or to instantiate a WebView\n         */\n        fun newPoTokenGenerator(context: Context): Single<PoTokenGenerator>\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt",
    "content": "package org.schabi.newpipe.util.potoken\n\nimport android.os.Handler\nimport android.os.Looper\nimport android.util.Log\nimport org.schabi.newpipe.App\nimport org.schabi.newpipe.BuildConfig\nimport org.schabi.newpipe.extractor.NewPipe\nimport org.schabi.newpipe.extractor.services.youtube.InnertubeClientRequestInfo\nimport org.schabi.newpipe.extractor.services.youtube.PoTokenProvider\nimport org.schabi.newpipe.extractor.services.youtube.PoTokenResult\nimport org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper\nimport org.schabi.newpipe.util.DeviceUtils\n\nobject PoTokenProviderImpl : PoTokenProvider {\n    val TAG = PoTokenProviderImpl::class.simpleName\n    private val webViewSupported by lazy { DeviceUtils.supportsWebView() }\n    private var webViewBadImpl = false // whether the system has a bad WebView implementation\n\n    private object WebPoTokenGenLock\n    private var webPoTokenVisitorData: String? = null\n    private var webPoTokenStreamingPot: String? = null\n    private var webPoTokenGenerator: PoTokenGenerator? = null\n\n    override fun getWebClientPoToken(videoId: String): PoTokenResult? {\n        if (!webViewSupported || webViewBadImpl) {\n            return null\n        }\n\n        try {\n            return getWebClientPoToken(videoId = videoId, forceRecreate = false)\n        } catch (e: RuntimeException) {\n            // RxJava's Single wraps exceptions into RuntimeErrors, so we need to unwrap them here\n            when (val cause = e.cause) {\n                is BadWebViewException -> {\n                    Log.e(TAG, \"Could not obtain poToken because WebView is broken\", e)\n                    webViewBadImpl = true\n                    return null\n                }\n\n                null -> throw e\n\n                else -> throw cause // includes PoTokenException\n            }\n        }\n    }\n\n    /**\n     * @param forceRecreate whether to force the recreation of [webPoTokenGenerator], to be used in\n     * case the current [webPoTokenGenerator] threw an error last time\n     * [PoTokenGenerator.generatePoToken] was called\n     */\n    private fun getWebClientPoToken(videoId: String, forceRecreate: Boolean): PoTokenResult {\n        // just a helper class since Kotlin does not have builtin support for 4-tuples\n        data class Quadruple<T1, T2, T3, T4>(val t1: T1, val t2: T2, val t3: T3, val t4: T4)\n\n        val (poTokenGenerator, visitorData, streamingPot, hasBeenRecreated) =\n            synchronized(WebPoTokenGenLock) {\n                val shouldRecreate = webPoTokenGenerator == null || forceRecreate ||\n                    webPoTokenGenerator!!.isExpired()\n\n                if (shouldRecreate) {\n                    val innertubeClientRequestInfo = InnertubeClientRequestInfo.ofWebClient()\n                    innertubeClientRequestInfo.clientInfo.clientVersion =\n                        YoutubeParsingHelper.getClientVersion()\n\n                    webPoTokenVisitorData = YoutubeParsingHelper.getVisitorDataFromInnertube(\n                        innertubeClientRequestInfo,\n                        NewPipe.getPreferredLocalization(),\n                        NewPipe.getPreferredContentCountry(),\n                        YoutubeParsingHelper.getYouTubeHeaders(),\n                        YoutubeParsingHelper.YOUTUBEI_V1_URL,\n                        null,\n                        false\n                    )\n                    // close the current webPoTokenGenerator on the main thread\n                    webPoTokenGenerator?.let { Handler(Looper.getMainLooper()).post { it.close() } }\n\n                    // create a new webPoTokenGenerator\n                    webPoTokenGenerator = PoTokenWebView\n                        .newPoTokenGenerator(App.instance).blockingGet()\n\n                    // The streaming poToken needs to be generated exactly once before generating\n                    // any other (player) tokens.\n                    webPoTokenStreamingPot = webPoTokenGenerator!!\n                        .generatePoToken(webPoTokenVisitorData!!).blockingGet()\n                }\n\n                return@synchronized Quadruple(\n                    webPoTokenGenerator!!,\n                    webPoTokenVisitorData!!,\n                    webPoTokenStreamingPot!!,\n                    shouldRecreate\n                )\n            }\n\n        val playerPot = try {\n            // Not using synchronized here, since poTokenGenerator would be able to generate\n            // multiple poTokens in parallel if needed. The only important thing is for exactly one\n            // visitorData/streaming poToken to be generated before anything else.\n            poTokenGenerator.generatePoToken(videoId).blockingGet()\n        } catch (throwable: Throwable) {\n            if (hasBeenRecreated) {\n                // the poTokenGenerator has just been recreated (and possibly this is already the\n                // second time we try), so there is likely nothing we can do\n                throw throwable\n            } else {\n                // retry, this time recreating the [webPoTokenGenerator] from scratch;\n                // this might happen for example if NewPipe goes in the background and the WebView\n                // content is lost\n                Log.e(TAG, \"Failed to obtain poToken, retrying\", throwable)\n                return getWebClientPoToken(videoId = videoId, forceRecreate = true)\n            }\n        }\n\n        if (BuildConfig.DEBUG) {\n            Log.d(\n                TAG,\n                \"poToken for $videoId: playerPot=$playerPot, \" +\n                    \"streamingPot=$streamingPot, visitor_data=$visitorData\"\n            )\n        }\n\n        return PoTokenResult(visitorData, playerPot, streamingPot)\n    }\n\n    override fun getWebEmbedClientPoToken(videoId: String): PoTokenResult? = null\n\n    override fun getAndroidClientPoToken(videoId: String): PoTokenResult? = null\n\n    override fun getIosClientPoToken(videoId: String): PoTokenResult? = null\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenWebView.kt",
    "content": "package org.schabi.newpipe.util.potoken\n\nimport android.content.Context\nimport android.os.Handler\nimport android.os.Looper\nimport android.util.Log\nimport android.webkit.ConsoleMessage\nimport android.webkit.JavascriptInterface\nimport android.webkit.WebChromeClient\nimport android.webkit.WebView\nimport androidx.annotation.MainThread\nimport androidx.webkit.WebSettingsCompat\nimport androidx.webkit.WebViewFeature\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers\nimport io.reactivex.rxjava3.core.Single\nimport io.reactivex.rxjava3.core.SingleEmitter\nimport io.reactivex.rxjava3.disposables.CompositeDisposable\nimport io.reactivex.rxjava3.schedulers.Schedulers\nimport java.time.Instant\nimport org.schabi.newpipe.BuildConfig\nimport org.schabi.newpipe.DownloaderImpl\n\nclass PoTokenWebView private constructor(\n    context: Context,\n    // to be used exactly once only during initialization!\n    private val generatorEmitter: SingleEmitter<PoTokenGenerator>\n) : PoTokenGenerator {\n    private val webView = WebView(context)\n    private val disposables = CompositeDisposable() // used only during initialization\n    private val poTokenEmitters = mutableListOf<Pair<String, SingleEmitter<String>>>()\n    private lateinit var expirationInstant: Instant\n\n    //region Initialization\n    init {\n        val webViewSettings = webView.settings\n        //noinspection SetJavaScriptEnabled we want to use JavaScript!\n        webViewSettings.javaScriptEnabled = true\n        if (WebViewFeature.isFeatureSupported(WebViewFeature.SAFE_BROWSING_ENABLE)) {\n            WebSettingsCompat.setSafeBrowsingEnabled(webViewSettings, false)\n        }\n        webViewSettings.userAgentString = USER_AGENT\n        webViewSettings.blockNetworkLoads = true // the WebView does not need internet access\n\n        // so that we can run async functions and get back the result\n        webView.addJavascriptInterface(this, JS_INTERFACE)\n\n        webView.webChromeClient = object : WebChromeClient() {\n            override fun onConsoleMessage(m: ConsoleMessage): Boolean {\n                if (m.message().contains(\"Uncaught\")) {\n                    // There should not be any uncaught errors while executing the code, because\n                    // everything that can fail is guarded by try-catch. Therefore, this likely\n                    // indicates that there was a syntax error in the code, i.e. the WebView only\n                    // supports a really old version of JS.\n\n                    val fmt = \"\\\"${m.message()}\\\", source: ${m.sourceId()} (${m.lineNumber()})\"\n                    val exception = BadWebViewException(fmt)\n                    Log.e(TAG, \"This WebView implementation is broken: $fmt\")\n\n                    onInitializationErrorCloseAndCancel(exception)\n                    popAllPoTokenEmitters().forEach { (_, emitter) -> emitter.onError(exception) }\n                }\n                return super.onConsoleMessage(m)\n            }\n        }\n    }\n\n    /**\n     * Must be called right after instantiating [PoTokenWebView] to perform the actual\n     * initialization. This will asynchronously go through all the steps needed to load BotGuard,\n     * run it, and obtain an `integrityToken`.\n     */\n    private fun loadHtmlAndObtainBotguard(context: Context) {\n        if (BuildConfig.DEBUG) {\n            Log.d(TAG, \"loadHtmlAndObtainBotguard() called\")\n        }\n\n        disposables.add(\n            Single.fromCallable {\n                val html = context.assets.open(\"po_token.html\").bufferedReader()\n                    .use { it.readText() }\n                return@fromCallable html\n            }\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(\n                    { html ->\n                        webView.loadDataWithBaseURL(\n                            \"https://www.youtube.com\",\n                            html.replaceFirst(\n                                \"</script>\",\n                                // calls downloadAndRunBotguard() when the page has finished loading\n                                \"\\n$JS_INTERFACE.downloadAndRunBotguard()</script>\"\n                            ),\n                            \"text/html\",\n                            \"utf-8\",\n                            null\n                        )\n                    },\n                    this::onInitializationErrorCloseAndCancel\n                )\n        )\n    }\n\n    /**\n     * Called during initialization by the JavaScript snippet appended to the HTML page content in\n     * [loadHtmlAndObtainBotguard] after the WebView content has been loaded.\n     */\n    @JavascriptInterface\n    fun downloadAndRunBotguard() {\n        if (BuildConfig.DEBUG) {\n            Log.d(TAG, \"downloadAndRunBotguard() called\")\n        }\n\n        makeBotguardServiceRequest(\n            \"https://www.youtube.com/api/jnn/v1/Create\",\n            \"[ \\\"$REQUEST_KEY\\\" ]\"\n        ) { responseBody ->\n            val parsedChallengeData = parseChallengeData(responseBody)\n            webView.evaluateJavascript(\n                \"\"\"try {\n                    data = $parsedChallengeData\n                    runBotGuard(data).then(function (result) {\n                        this.webPoSignalOutput = result.webPoSignalOutput\n                        $JS_INTERFACE.onRunBotguardResult(result.botguardResponse)\n                    }, function (error) {\n                        $JS_INTERFACE.onJsInitializationError(error + \"\\n\" + error.stack)\n                    })\n                } catch (error) {\n                    $JS_INTERFACE.onJsInitializationError(error + \"\\n\" + error.stack)\n                }\"\"\",\n                null\n            )\n        }\n    }\n\n    /**\n     * Called during initialization by the JavaScript snippets from either\n     * [downloadAndRunBotguard] or [onRunBotguardResult].\n     */\n    @JavascriptInterface\n    fun onJsInitializationError(error: String) {\n        if (BuildConfig.DEBUG) {\n            Log.e(TAG, \"Initialization error from JavaScript: $error\")\n        }\n        onInitializationErrorCloseAndCancel(buildExceptionForJsError(error))\n    }\n\n    /**\n     * Called during initialization by the JavaScript snippet from [downloadAndRunBotguard] after\n     * obtaining the BotGuard execution output [botguardResponse].\n     */\n    @JavascriptInterface\n    fun onRunBotguardResult(botguardResponse: String) {\n        if (BuildConfig.DEBUG) {\n            Log.d(TAG, \"botguardResponse: $botguardResponse\")\n        }\n        makeBotguardServiceRequest(\n            \"https://www.youtube.com/api/jnn/v1/GenerateIT\",\n            \"[ \\\"$REQUEST_KEY\\\", \\\"$botguardResponse\\\" ]\"\n        ) { responseBody ->\n            if (BuildConfig.DEBUG) {\n                Log.d(TAG, \"GenerateIT response: $responseBody\")\n            }\n            val (integrityToken, expirationTimeInSeconds) = parseIntegrityTokenData(responseBody)\n\n            // leave 10 minutes of margin just to be sure\n            expirationInstant = Instant.now().plusSeconds(expirationTimeInSeconds - 600)\n\n            webView.evaluateJavascript(\n                \"this.integrityToken = $integrityToken\"\n            ) {\n                if (BuildConfig.DEBUG) {\n                    Log.d(TAG, \"initialization finished, expiration=${expirationTimeInSeconds}s\")\n                }\n                generatorEmitter.onSuccess(this)\n            }\n        }\n    }\n    //endregion\n\n    //region Obtaining poTokens\n    override fun generatePoToken(identifier: String): Single<String> = Single.create { emitter ->\n        if (BuildConfig.DEBUG) {\n            Log.d(TAG, \"generatePoToken() called with identifier $identifier\")\n        }\n        runOnMainThread(emitter) {\n            addPoTokenEmitter(identifier, emitter)\n            val u8Identifier = stringToU8(identifier)\n            webView.evaluateJavascript(\n                \"\"\"try {\n                        identifier = \"$identifier\"\n                        u8Identifier = $u8Identifier\n                        poTokenU8 = obtainPoToken(webPoSignalOutput, integrityToken, u8Identifier)\n                        poTokenU8String = \"\"\n                        for (i = 0; i < poTokenU8.length; i++) {\n                            if (i != 0) poTokenU8String += \",\"\n                            poTokenU8String += poTokenU8[i]\n                        }\n                        $JS_INTERFACE.onObtainPoTokenResult(identifier, poTokenU8String)\n                    } catch (error) {\n                        $JS_INTERFACE.onObtainPoTokenError(identifier, error + \"\\n\" + error.stack)\n                    }\"\"\"\n            ) {}\n        }\n    }\n\n    /**\n     * Called by the JavaScript snippet from [generatePoToken] when an error occurs in calling the\n     * JavaScript `obtainPoToken()` function.\n     */\n    @JavascriptInterface\n    fun onObtainPoTokenError(identifier: String, error: String) {\n        if (BuildConfig.DEBUG) {\n            Log.e(TAG, \"obtainPoToken error from JavaScript: $error\")\n        }\n        popPoTokenEmitter(identifier)?.onError(buildExceptionForJsError(error))\n    }\n\n    /**\n     * Called by the JavaScript snippet from [generatePoToken] with the original identifier and the\n     * result of the JavaScript `obtainPoToken()` function.\n     */\n    @JavascriptInterface\n    fun onObtainPoTokenResult(identifier: String, poTokenU8: String) {\n        if (BuildConfig.DEBUG) {\n            Log.d(TAG, \"Generated poToken (before decoding): identifier=$identifier poTokenU8=$poTokenU8\")\n        }\n        val poToken = try {\n            u8ToBase64(poTokenU8)\n        } catch (t: Throwable) {\n            popPoTokenEmitter(identifier)?.onError(t)\n            return\n        }\n\n        if (BuildConfig.DEBUG) {\n            Log.d(TAG, \"Generated poToken: identifier=$identifier poToken=$poToken\")\n        }\n        popPoTokenEmitter(identifier)?.onSuccess(poToken)\n    }\n\n    override fun isExpired(): Boolean {\n        return Instant.now().isAfter(expirationInstant)\n    }\n    //endregion\n\n    //region Handling multiple emitters\n\n    /**\n     * Adds the ([identifier], [emitter]) pair to the [poTokenEmitters] list. This makes it so that\n     * multiple poToken requests can be generated invparallel, and the results will be notified to\n     * the right emitters.\n     */\n    private fun addPoTokenEmitter(identifier: String, emitter: SingleEmitter<String>) {\n        synchronized(poTokenEmitters) {\n            poTokenEmitters.add(Pair(identifier, emitter))\n        }\n    }\n\n    /**\n     * Extracts and removes from the [poTokenEmitters] list a [SingleEmitter] based on its\n     * [identifier]. The emitter is supposed to be used immediately after to either signal a success\n     * or an error.\n     */\n    private fun popPoTokenEmitter(identifier: String): SingleEmitter<String>? {\n        return synchronized(poTokenEmitters) {\n            poTokenEmitters.indexOfFirst { it.first == identifier }.takeIf { it >= 0 }?.let {\n                poTokenEmitters.removeAt(it).second\n            }\n        }\n    }\n\n    /**\n     * Clears [poTokenEmitters] and returns its previous contents. The emitters are supposed to be\n     * used immediately after to either signal a success or an error.\n     */\n    private fun popAllPoTokenEmitters(): List<Pair<String, SingleEmitter<String>>> {\n        return synchronized(poTokenEmitters) {\n            val result = poTokenEmitters.toList()\n            poTokenEmitters.clear()\n            result\n        }\n    }\n    //endregion\n\n    //region Utils\n\n    /**\n     * Makes a POST request to [url] with the given [data] by setting the correct headers. Calls\n     * [onInitializationErrorCloseAndCancel] in case of any network errors and also if the response\n     * does not have HTTP code 200, therefore this is supposed to be used only during\n     * initialization. Calls [handleResponseBody] with the response body if the response is\n     * successful. The request is performed in the background and a disposable is added to\n     * [disposables].\n     */\n    private fun makeBotguardServiceRequest(\n        url: String,\n        data: String,\n        handleResponseBody: (String) -> Unit\n    ) {\n        disposables.add(\n            Single.fromCallable {\n                return@fromCallable DownloaderImpl.getInstance().post(\n                    url,\n                    mapOf(\n                        // replace the downloader user agent\n                        \"User-Agent\" to listOf(USER_AGENT),\n                        \"Accept\" to listOf(\"application/json\"),\n                        \"Content-Type\" to listOf(\"application/json+protobuf\"),\n                        \"x-goog-api-key\" to listOf(GOOGLE_API_KEY),\n                        \"x-user-agent\" to listOf(\"grpc-web-javascript/0.1\")\n                    ),\n                    data.toByteArray()\n                )\n            }\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(\n                    { response ->\n                        val httpCode = response.responseCode()\n                        if (httpCode != 200) {\n                            onInitializationErrorCloseAndCancel(\n                                PoTokenException(\"Invalid response code: $httpCode\")\n                            )\n                            return@subscribe\n                        }\n                        val responseBody = response.responseBody()\n                        handleResponseBody(responseBody)\n                    },\n                    this::onInitializationErrorCloseAndCancel\n                )\n        )\n    }\n\n    /**\n     * Handles any error happening during initialization, releasing resources and sending the error\n     * to [generatorEmitter].\n     */\n    private fun onInitializationErrorCloseAndCancel(error: Throwable) {\n        runOnMainThread(generatorEmitter) {\n            close()\n            generatorEmitter.onError(error)\n        }\n    }\n\n    /**\n     * Releases all [webView] and [disposables] resources.\n     */\n    @MainThread\n    override fun close() {\n        disposables.dispose()\n\n        webView.clearHistory()\n        // clears RAM cache and disk cache (globally for all WebViews)\n        webView.clearCache(true)\n\n        // ensures that the WebView isn't doing anything when destroying it\n        webView.loadUrl(\"about:blank\")\n\n        webView.onPause()\n        webView.removeAllViews()\n        webView.destroy()\n    }\n    //endregion\n\n    companion object : PoTokenGenerator.Factory {\n        private val TAG = PoTokenWebView::class.simpleName\n\n        // Public API key used by BotGuard, which has been got by looking at BotGuard requests\n        private const val GOOGLE_API_KEY = \"AIzaSyDyT5W0Jh49F30Pqqtyfdf7pDLFKLJoAnw\" // NOSONAR\n        private const val REQUEST_KEY = \"O43z0dpjhgX20SCx4KAo\"\n        private const val USER_AGENT = \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) \" +\n            \"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.3\"\n        private const val JS_INTERFACE = \"PoTokenWebView\"\n\n        override fun newPoTokenGenerator(context: Context): Single<PoTokenGenerator> = Single.create { emitter ->\n            runOnMainThread(emitter) {\n                val potWv = PoTokenWebView(context, emitter)\n                potWv.loadHtmlAndObtainBotguard(context)\n                emitter.setDisposable(potWv.disposables)\n            }\n        }\n\n        /**\n         * Runs [runnable] on the main thread using `Handler(Looper.getMainLooper()).post()`, and\n         * if the `post` fails emits an error on [emitterIfPostFails].\n         */\n        private fun runOnMainThread(\n            emitterIfPostFails: SingleEmitter<out Any>,\n            runnable: Runnable\n        ) {\n            if (!Handler(Looper.getMainLooper()).post(runnable)) {\n                emitterIfPostFails.onError(PoTokenException(\"Could not run on main thread\"))\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/text/HashtagLongPressClickableSpan.java",
    "content": "package org.schabi.newpipe.util.text;\n\nimport android.content.Context;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\n\nfinal class HashtagLongPressClickableSpan extends LongPressClickableSpan {\n\n    @NonNull\n    private final Context context;\n    @NonNull\n    private final String parsedHashtag;\n    private final int relatedInfoServiceId;\n\n    HashtagLongPressClickableSpan(@NonNull final Context context,\n                                  @NonNull final String parsedHashtag,\n                                  final int relatedInfoServiceId) {\n        this.context = context;\n        this.parsedHashtag = parsedHashtag;\n        this.relatedInfoServiceId = relatedInfoServiceId;\n    }\n\n    @Override\n    public void onClick(@NonNull final View view) {\n        NavigationHelper.openSearch(context, relatedInfoServiceId, parsedHashtag);\n    }\n\n    @Override\n    public void onLongClick(@NonNull final View view) {\n        ShareUtils.copyToClipboard(context, parsedHashtag);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/text/InternalUrlsHandler.java",
    "content": "package org.schabi.newpipe.util.text;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport androidx.core.content.ContextCompat;\n\nimport androidx.annotation.NonNull;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.extractor.exceptions.ParsingException;\nimport org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory;\nimport org.schabi.newpipe.player.TimestampChangeData;\nimport org.schabi.newpipe.util.NavigationHelper;\n\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic final class InternalUrlsHandler {\n    private static final Pattern AMPERSAND_TIMESTAMP_PATTERN = Pattern.compile(\"(.*)&t=(\\\\d+)\");\n\n    private InternalUrlsHandler() {\n    }\n\n    /**\n     * Handle a YouTube timestamp description URL in NewPipe.\n     * <p>\n     * This method will check if the provided url is a YouTube timestamp description URL ({@code\n     * https://www.youtube.com/watch?v=}video_id{@code &t=}time_in_seconds). If yes, the popup\n     * player will be opened when the user will click on the timestamp in the video description,\n     * at the time and for the video indicated in the timestamp.\n     *\n     * @param context     the context to use\n     * @param url         the URL to check if it can be handled\n     * @return true if the URL can be handled by NewPipe, false if it cannot\n     */\n    public static boolean handleUrlDescriptionTimestamp(final Context context,\n                                                        @NonNull final String url) {\n        final Matcher matcher = AMPERSAND_TIMESTAMP_PATTERN.matcher(url);\n        if (!matcher.matches()) {\n            return false;\n        }\n        final String matchedUrl = matcher.group(1);\n        final int seconds;\n        if (matcher.group(2) == null) {\n            seconds = -1;\n        } else {\n            seconds = Integer.parseInt(matcher.group(2));\n        }\n\n        final StreamingService service;\n        final StreamingService.LinkType linkType;\n        try {\n            service = NewPipe.getServiceByUrl(matchedUrl);\n            linkType = service.getLinkTypeByUrl(matchedUrl);\n            if (linkType == StreamingService.LinkType.NONE) {\n                return false;\n            }\n        } catch (final ExtractionException e) {\n            return false;\n        }\n\n        if (linkType == StreamingService.LinkType.STREAM && seconds != -1) {\n            return playOnPopup(context, matchedUrl, service, seconds);\n        } else {\n            NavigationHelper.openRouterActivity(context, matchedUrl);\n            return true;\n        }\n    }\n\n    /**\n     * Play a content in the floating player.\n     *\n     * @param context     the context to be used\n     * @param url         the URL of the content\n     * @param service     the service of the content\n     * @param seconds     the position in seconds at which the floating player will start\n     * @return true if the playback of the content has successfully started or false if not\n     */\n    public static boolean playOnPopup(final Context context,\n                                      final String url,\n                                      @NonNull final StreamingService service,\n                                      final int seconds) {\n        final LinkHandlerFactory factory = service.getStreamLHFactory();\n        final String cleanUrl;\n\n        try {\n            cleanUrl = factory.getUrl(factory.getId(url));\n        } catch (final ParsingException e) {\n            return false;\n        }\n\n        final Intent intent = NavigationHelper.getPlayerTimestampIntent(context,\n                new TimestampChangeData(\n                        service.getServiceId(),\n                        cleanUrl,\n                        seconds\n                ));\n        ContextCompat.startForegroundService(context, intent);\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/text/LongPressClickableSpan.java",
    "content": "package org.schabi.newpipe.util.text;\n\nimport android.text.style.ClickableSpan;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\n\npublic abstract class LongPressClickableSpan extends ClickableSpan {\n\n    public abstract void onLongClick(@NonNull View view);\n\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/text/LongPressLinkMovementMethod.java",
    "content": "package org.schabi.newpipe.util.text;\n\nimport static org.schabi.newpipe.util.text.TouchUtils.getOffsetForHorizontalLine;\n\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.text.Selection;\nimport android.text.Spannable;\nimport android.text.method.LinkMovementMethod;\nimport android.text.method.MovementMethod;\nimport android.view.MotionEvent;\nimport android.view.ViewConfiguration;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\n\n// Class adapted from https://stackoverflow.com/a/31786969\n\npublic class LongPressLinkMovementMethod extends LinkMovementMethod {\n\n    private static final int LONG_PRESS_TIME = ViewConfiguration.getLongPressTimeout();\n\n    private static LongPressLinkMovementMethod instance;\n\n    private Handler longClickHandler;\n    private boolean isLongPressed = false;\n\n    @Override\n    public boolean onTouchEvent(@NonNull final TextView widget,\n                                @NonNull final Spannable buffer,\n                                @NonNull final MotionEvent event) {\n        final int action = event.getAction();\n\n        if (action == MotionEvent.ACTION_CANCEL && longClickHandler != null) {\n            longClickHandler.removeCallbacksAndMessages(null);\n        }\n\n        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {\n            final int offset = getOffsetForHorizontalLine(widget, event);\n            final LongPressClickableSpan[] link = buffer.getSpans(offset, offset,\n                    LongPressClickableSpan.class);\n\n            if (link.length != 0) {\n                if (action == MotionEvent.ACTION_UP) {\n                    if (longClickHandler != null) {\n                        longClickHandler.removeCallbacksAndMessages(null);\n                    }\n                    if (!isLongPressed) {\n                        link[0].onClick(widget);\n                    }\n                    isLongPressed = false;\n                } else {\n                    Selection.setSelection(buffer, buffer.getSpanStart(link[0]),\n                            buffer.getSpanEnd(link[0]));\n                    if (longClickHandler != null) {\n                        longClickHandler.postDelayed(() -> {\n                            link[0].onLongClick(widget);\n                            isLongPressed = true;\n                        }, LONG_PRESS_TIME);\n                    }\n                }\n                return true;\n            }\n        }\n\n        return super.onTouchEvent(widget, buffer, event);\n    }\n\n    public static MovementMethod getInstance() {\n        if (instance == null) {\n            instance = new LongPressLinkMovementMethod();\n            instance.longClickHandler = new Handler(Looper.myLooper());\n        }\n\n        return instance;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/text/TextEllipsizer.java",
    "content": "package org.schabi.newpipe.util.text;\n\nimport android.graphics.Paint;\nimport android.text.Layout;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.text.HtmlCompat;\n\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.stream.Description;\n\nimport java.util.function.Consumer;\n\n\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\n\n/**\n * <p>Class to ellipsize text inside a {@link TextView}.</p>\n * This class provides all utils to automatically ellipsize and expand a text\n */\npublic final class TextEllipsizer {\n    private static final int EXPANDED_LINES = Integer.MAX_VALUE;\n    private static final String ELLIPSIS = \"…\";\n\n    @NonNull private final CompositeDisposable disposable = new CompositeDisposable();\n\n    @NonNull private final TextView view;\n    private final int maxLines;\n    @NonNull private Description content;\n    @Nullable private StreamingService streamingService;\n    @Nullable private String streamUrl;\n    private boolean isEllipsized = false;\n    @Nullable private Boolean canBeEllipsized = null;\n\n    @NonNull private final Paint paintAtContentSize = new Paint();\n    private final float ellipsisWidthPx;\n    @Nullable private Consumer<Boolean> stateChangeListener = null;\n    @Nullable private Consumer<Boolean> onContentChanged;\n\n    public TextEllipsizer(@NonNull final TextView view,\n                          final int maxLines,\n                          @Nullable final StreamingService streamingService) {\n        this.view = view;\n        this.maxLines = maxLines;\n        this.content = Description.EMPTY_DESCRIPTION;\n        this.streamingService = streamingService;\n\n        paintAtContentSize.setTextSize(view.getTextSize());\n        ellipsisWidthPx = paintAtContentSize.measureText(ELLIPSIS);\n    }\n\n    public void setOnContentChanged(@Nullable final Consumer<Boolean> onContentChanged) {\n        this.onContentChanged = onContentChanged;\n    }\n\n    public void setContent(@NonNull final Description content) {\n        this.content = content;\n        canBeEllipsized = null;\n        linkifyContentView(v -> {\n            final int currentMaxLines = view.getMaxLines();\n            view.setMaxLines(EXPANDED_LINES);\n            canBeEllipsized = view.getLineCount() > maxLines;\n            view.setMaxLines(currentMaxLines);\n            if (onContentChanged != null) {\n                onContentChanged.accept(canBeEllipsized);\n            }\n        });\n    }\n\n    public void setStreamUrl(@Nullable final String streamUrl) {\n        this.streamUrl = streamUrl;\n    }\n\n    public void setStreamingService(@NonNull final StreamingService streamingService) {\n        this.streamingService = streamingService;\n    }\n\n    /**\n     * Expand the {@link TextEllipsizer#content} to its full length.\n     */\n    public void expand() {\n        view.setMaxLines(EXPANDED_LINES);\n        linkifyContentView(v -> isEllipsized = false);\n    }\n\n    /**\n     * Shorten the {@link TextEllipsizer#content} to the given number of\n     * {@link TextEllipsizer#maxLines maximum lines} and add trailing '{@code …}'\n     * if the text was shorted.\n     */\n    public void ellipsize() {\n        // expand text to see whether it is necessary to ellipsize the text\n        view.setMaxLines(EXPANDED_LINES);\n        linkifyContentView(v -> {\n            final CharSequence charSeqText = view.getText();\n            if (charSeqText != null && view.getLineCount() > maxLines) {\n                // Note that converting to String removes spans (i.e. links), but that's something\n                // we actually want since when the text is ellipsized we want all clicks on the\n                // comment to expand the comment, not to open links.\n                final String text = charSeqText.toString();\n\n                final Layout layout = view.getLayout();\n                final float lineWidth = layout.getLineWidth(maxLines - 1);\n                final float layoutWidth = layout.getWidth();\n                final int lineStart = layout.getLineStart(maxLines - 1);\n                final int lineEnd = layout.getLineEnd(maxLines - 1);\n\n                // remove characters up until there is enough space for the ellipsis\n                // (also summing 2 more pixels, just to be sure to avoid float rounding errors)\n                int end = lineEnd;\n                float removedCharactersWidth = 0.0f;\n                while (lineWidth - removedCharactersWidth + ellipsisWidthPx + 2.0f > layoutWidth\n                        && end >= lineStart) {\n                    end -= 1;\n                    // recalculate each time to account for ligatures or other similar things\n                    removedCharactersWidth = paintAtContentSize.measureText(\n                            text.substring(end, lineEnd));\n                }\n\n                // remove trailing spaces and newlines\n                while (end > 0 && Character.isWhitespace(text.charAt(end - 1))) {\n                    end -= 1;\n                }\n\n                final String newVal = text.substring(0, end) + ELLIPSIS;\n                view.setText(newVal);\n                isEllipsized = true;\n            } else {\n                isEllipsized = false;\n            }\n            view.setMaxLines(maxLines);\n        });\n    }\n\n    /**\n     * Toggle the view between the ellipsized and expanded state.\n     */\n    public void toggle() {\n        if (isEllipsized) {\n            expand();\n        } else {\n            ellipsize();\n        }\n    }\n\n    /**\n     * Whether the {@link #view} can be ellipsized.\n     * This is only the case when the {@link #content} has more lines\n     * than allowed via {@link #maxLines}.\n     * @return {@code true} if the {@link #content} has more lines than allowed via\n     * {@link #maxLines} and thus can be shortened, {@code false} if the {@code content} fits into\n     * the {@link #view} without being shortened and {@code null} if the initialization is not\n     * completed yet.\n     */\n    @Nullable\n    public Boolean canBeEllipsized() {\n        return canBeEllipsized;\n    }\n\n    private void linkifyContentView(final Consumer<View> consumer) {\n        final boolean oldState = isEllipsized;\n        disposable.clear();\n        TextLinkifier.fromDescription(view, content,\n                HtmlCompat.FROM_HTML_MODE_LEGACY, streamingService, streamUrl, disposable,\n                v -> {\n                    consumer.accept(v);\n                    notifyStateChangeListener(oldState);\n                });\n\n    }\n\n    /**\n     * Add a listener which is called when the given content is changed,\n     * either from <em>ellipsized</em> to <em>full</em> or vice versa.\n     * @param listener The listener to be called, or {@code null} to remove it.\n     *                 The Boolean parameter is the new state.\n     *                 <em>Ellipsized</em> content is represented as {@code true},\n     *                 normal or <em>full</em> content by {@code false}.\n     */\n    public void setStateChangeListener(@Nullable final Consumer<Boolean> listener) {\n        this.stateChangeListener = listener;\n    }\n\n    private void notifyStateChangeListener(final boolean oldState) {\n        if (oldState != isEllipsized && stateChangeListener != null) {\n            stateChangeListener.accept(isEllipsized);\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java",
    "content": "package org.schabi.newpipe.util.text;\n\nimport android.content.Context;\nimport android.text.SpannableStringBuilder;\nimport android.text.style.URLSpan;\nimport android.text.util.Linkify;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.text.HtmlCompat;\n\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.stream.Description;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\n\nimport java.util.function.Consumer;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport io.noties.markwon.Markwon;\nimport io.noties.markwon.linkify.LinkifyPlugin;\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Single;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\n\npublic final class TextLinkifier {\n    public static final String TAG = TextLinkifier.class.getSimpleName();\n\n    // Looks for hashtags with characters from any language (\\p{L}), numbers, or underscores\n    private static final Pattern HASHTAGS_PATTERN = Pattern.compile(\"(#[\\\\p{L}0-9_]+)\");\n\n    public static final Consumer<TextView> SET_LINK_MOVEMENT_METHOD =\n            v -> v.setMovementMethod(LongPressLinkMovementMethod.getInstance());\n\n    private TextLinkifier() {\n    }\n\n    /**\n     * Create links for contents with an {@link Description} in the various possible formats.\n     * <p>\n     * This will call one of these three functions based on the format: {@link #fromHtml},\n     * {@link #fromMarkdown} or {@link #fromPlainText}.\n     *\n     * @param textView           the TextView to set the htmlBlock linked\n     * @param description        the htmlBlock to be linked\n     * @param htmlCompatFlag     the int flag to be set if {@link HtmlCompat#fromHtml(String, int)}\n     *                           will be called (not used for formats different than HTML)\n     * @param relatedInfoService if given, handle hashtags to search for the term in the correct\n     *                           service\n     * @param relatedStreamUrl   if given, used alongside {@code relatedInfoService} to handle\n     *                           timestamps to open the stream in the popup player at the specific\n     *                           time\n     * @param disposables        disposables created by the method are added here and their\n     *                           lifecycle should be handled by the calling class\n     * @param onCompletion       will be run when setting text to the textView completes; use {@link\n     *                           #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable\n     */\n    public static void fromDescription(@NonNull final TextView textView,\n                                       @NonNull final Description description,\n                                       final int htmlCompatFlag,\n                                       @Nullable final StreamingService relatedInfoService,\n                                       @Nullable final String relatedStreamUrl,\n                                       @NonNull final CompositeDisposable disposables,\n                                       @Nullable final Consumer<TextView> onCompletion) {\n        switch (description.getType()) {\n            case Description.HTML:\n                TextLinkifier.fromHtml(textView, description.getContent(), htmlCompatFlag,\n                        relatedInfoService, relatedStreamUrl, disposables, onCompletion);\n                break;\n            case Description.MARKDOWN:\n                TextLinkifier.fromMarkdown(textView, description.getContent(),\n                        relatedInfoService, relatedStreamUrl, disposables, onCompletion);\n                break;\n            case Description.PLAIN_TEXT: default:\n                TextLinkifier.fromPlainText(textView, description.getContent(),\n                        relatedInfoService, relatedStreamUrl, disposables, onCompletion);\n                break;\n        }\n    }\n\n    /**\n     * Create links for contents with an HTML description.\n     *\n     * <p>\n     * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService,\n     * String, CompositeDisposable, Consumer)} after having linked the URLs with\n     * {@link HtmlCompat#fromHtml(String, int)}.\n     * </p>\n     *\n     * @param textView           the {@link TextView} to set the HTML string block linked\n     * @param htmlBlock          the HTML string block to be linked\n     * @param htmlCompatFlag     the int flag to be set when {@link HtmlCompat#fromHtml(String,\n     *                           int)} will be called\n     * @param relatedInfoService if given, handle hashtags to search for the term in the correct\n     *                           service\n     * @param relatedStreamUrl   if given, used alongside {@code relatedInfoService} to handle\n     *                           timestamps to open the stream in the popup player at the specific\n     *                           time\n     * @param disposables        disposables created by the method are added here and their\n     *                           lifecycle should be handled by the calling class\n     * @param onCompletion       will be run when setting text to the textView completes; use {@link\n     *                           #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable\n     */\n    public static void fromHtml(@NonNull final TextView textView,\n                                @NonNull final String htmlBlock,\n                                final int htmlCompatFlag,\n                                @Nullable final StreamingService relatedInfoService,\n                                @Nullable final String relatedStreamUrl,\n                                @NonNull final CompositeDisposable disposables,\n                                @Nullable final Consumer<TextView> onCompletion) {\n        changeLinkIntents(\n                textView, HtmlCompat.fromHtml(htmlBlock, htmlCompatFlag), relatedInfoService,\n                relatedStreamUrl, disposables, onCompletion);\n    }\n\n    /**\n     * Create links for contents with a plain text description.\n     *\n     * <p>\n     * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService,\n     * String, CompositeDisposable, Consumer)} after having linked the URLs with\n     * {@link TextView#setAutoLinkMask(int)} and\n     * {@link TextView#setText(CharSequence, TextView.BufferType)}.\n     * </p>\n     *\n     * @param textView           the {@link TextView} to set the plain text block linked\n     * @param plainTextBlock     the block of plain text to be linked\n     * @param relatedInfoService if given, handle hashtags to search for the term in the correct\n     *                           service\n     * @param relatedStreamUrl   if given, used alongside {@code relatedInfoService} to handle\n     *                           timestamps to open the stream in the popup player at the specific\n     *                           time\n     * @param disposables        disposables created by the method are added here and their\n     *                           lifecycle should be handled by the calling class\n     * @param onCompletion       will be run when setting text to the textView completes; use {@link\n     *                           #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable\n     */\n    public static void fromPlainText(@NonNull final TextView textView,\n                                     @NonNull final String plainTextBlock,\n                                     @Nullable final StreamingService relatedInfoService,\n                                     @Nullable final String relatedStreamUrl,\n                                     @NonNull final CompositeDisposable disposables,\n                                     @Nullable final Consumer<TextView> onCompletion) {\n        textView.setAutoLinkMask(Linkify.WEB_URLS);\n        textView.setText(plainTextBlock, TextView.BufferType.SPANNABLE);\n        changeLinkIntents(textView, textView.getText(), relatedInfoService,\n                relatedStreamUrl, disposables, onCompletion);\n    }\n\n    /**\n     * Create links for contents with a markdown description.\n     *\n     * <p>\n     * This method will call {@link #changeLinkIntents(TextView, CharSequence, StreamingService,\n     * String, CompositeDisposable, Consumer)} after creating a {@link Markwon} object and using\n     * {@link Markwon#setMarkdown(TextView, String)}.\n     * </p>\n     *\n     * @param textView           the {@link TextView} to set the plain text block linked\n     * @param markdownBlock      the block of markdown text to be linked\n     * @param relatedInfoService if given, handle hashtags to search for the term in the correct\n     *                           service\n     * @param relatedStreamUrl   if given, used alongside {@code relatedInfoService} to handle\n     *                           timestamps to open the stream in the popup player at the specific\n     *                           time\n     * @param disposables        disposables created by the method are added here and their\n     *                           lifecycle should be handled by the calling class\n     * @param onCompletion       will be run when setting text to the textView completes; use {@link\n     *                           #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable\n     */\n    public static void fromMarkdown(@NonNull final TextView textView,\n                                    @NonNull final String markdownBlock,\n                                    @Nullable final StreamingService relatedInfoService,\n                                    @Nullable final String relatedStreamUrl,\n                                    @NonNull final CompositeDisposable disposables,\n                                    @Nullable final Consumer<TextView> onCompletion) {\n        final Markwon markwon = Markwon.builder(textView.getContext())\n                .usePlugin(LinkifyPlugin.create()).build();\n        changeLinkIntents(textView, markwon.toMarkdown(markdownBlock),\n                relatedInfoService, relatedStreamUrl, disposables, onCompletion);\n    }\n\n    /**\n     * Change links generated by libraries in the description of a content to a custom link action\n     * and add click listeners on timestamps in this description.\n     *\n     * <p>\n     * Instead of using an {@link android.content.Intent#ACTION_VIEW} intent in the description of\n     * a content, this method will parse the {@link CharSequence} and replace all current web links\n     * with {@link ShareUtils#openUrlInBrowser(Context, String)}.\n     * </p>\n     *\n     * <p>\n     * This method will also add click listeners on timestamps in this description, which will play\n     * the content in the popup player at the time indicated in the timestamp, by using\n     * {@link TextLinkifier#addClickListenersOnTimestamps(Context, SpannableStringBuilder,\n     * StreamingService, String, CompositeDisposable)} method and click listeners on hashtags, by\n     * using {@link TextLinkifier#addClickListenersOnHashtags(Context, SpannableStringBuilder,\n     * StreamingService)}, which will open a search on the current service with the hashtag.\n     * </p>\n     *\n     * <p>\n     * This method is required in order to intercept links and e.g. show a confirmation dialog\n     * before opening a web link.\n     * </p>\n     *\n     * @param textView           the {@link TextView} to which the converted {@link CharSequence}\n     *                           will be applied\n     * @param chars              the {@link CharSequence} to be parsed\n     * @param relatedInfoService if given, handle hashtags to search for the term in the correct\n     *                           service\n     * @param relatedStreamUrl   if given, used alongside {@code relatedInfoService} to handle\n     *                           timestamps to open the stream in the popup player at the specific\n     *                           time\n     * @param disposables        disposables created by the method are added here and their\n     *                           lifecycle should be handled by the calling class\n     * @param onCompletion       will be run when setting text to the textView completes; use {@link\n     *                           #SET_LINK_MOVEMENT_METHOD} to make links clickable and focusable\n     */\n    private static void changeLinkIntents(@NonNull final TextView textView,\n                                          @NonNull final CharSequence chars,\n                                          @Nullable final StreamingService relatedInfoService,\n                                          @Nullable final String relatedStreamUrl,\n                                          @NonNull final CompositeDisposable disposables,\n                                          @Nullable final Consumer<TextView> onCompletion) {\n        disposables.add(Single.fromCallable(() -> {\n                    final Context context = textView.getContext();\n\n                    // add custom click actions on web links\n                    final SpannableStringBuilder textBlockLinked =\n                            new SpannableStringBuilder(chars);\n                    final URLSpan[] urls = textBlockLinked.getSpans(0, chars.length(),\n                            URLSpan.class);\n\n                    for (final URLSpan span : urls) {\n                        final String url = span.getURL();\n                        final LongPressClickableSpan longPressClickableSpan =\n                                new UrlLongPressClickableSpan(context, url);\n\n                        textBlockLinked.setSpan(longPressClickableSpan,\n                                textBlockLinked.getSpanStart(span),\n                                textBlockLinked.getSpanEnd(span),\n                                textBlockLinked.getSpanFlags(span));\n                        textBlockLinked.removeSpan(span);\n                    }\n\n                    // add click actions on plain text timestamps only for description of contents,\n                    // unneeded for meta-info or other TextViews\n                    if (relatedInfoService != null) {\n                        if (relatedStreamUrl != null) {\n                            addClickListenersOnTimestamps(context, textBlockLinked,\n                                    relatedInfoService, relatedStreamUrl, disposables);\n                        }\n                        addClickListenersOnHashtags(context, textBlockLinked, relatedInfoService);\n                    }\n\n                    return textBlockLinked;\n                }).subscribeOn(Schedulers.computation())\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(\n                        textBlockLinked ->\n                                setTextViewCharSequence(textView, textBlockLinked, onCompletion),\n                        throwable -> {\n                            Log.e(TAG, \"Unable to linkify text\", throwable);\n                            // this should never happen, but if it does, just fallback to it\n                            setTextViewCharSequence(textView, chars, onCompletion);\n                        }));\n    }\n\n    /**\n     * Add click listeners which opens a search on hashtags in a plain text.\n     *\n     * <p>\n     * This method finds all timestamps in the {@link SpannableStringBuilder} of the description\n     * using a regular expression, adds for each a {@link LongPressClickableSpan} which opens\n     * {@link NavigationHelper#openSearch(Context, int, String)} and makes a search on the hashtag,\n     * in the service of the content when pressed, and copy the hashtag to clipboard when\n     * long-pressed, if allowed by the caller method (parameter {@code addLongClickCopyListener}).\n     * </p>\n     *\n     * @param context              the {@link Context} to use\n     * @param spannableDescription the {@link SpannableStringBuilder} with the text of the\n     *                             content description\n     * @param relatedInfoService   used to search for the term in the correct service\n     */\n    private static void addClickListenersOnHashtags(\n            @NonNull final Context context,\n            @NonNull final SpannableStringBuilder spannableDescription,\n            @NonNull final StreamingService relatedInfoService) {\n        final String descriptionText = spannableDescription.toString();\n        final Matcher hashtagsMatches = HASHTAGS_PATTERN.matcher(descriptionText);\n\n        while (hashtagsMatches.find()) {\n            final int hashtagStart = hashtagsMatches.start(1);\n            final int hashtagEnd = hashtagsMatches.end(1);\n            final String parsedHashtag = descriptionText.substring(hashtagStart, hashtagEnd);\n\n            // Don't add a LongPressClickableSpan if there is already one, which should be a part\n            // of an URL, already parsed before\n            if (spannableDescription.getSpans(hashtagStart, hashtagEnd,\n                    LongPressClickableSpan.class).length == 0) {\n                final int serviceId = relatedInfoService.getServiceId();\n                spannableDescription.setSpan(\n                        new HashtagLongPressClickableSpan(context, parsedHashtag, serviceId),\n                        hashtagStart, hashtagEnd, 0);\n            }\n        }\n    }\n\n    /**\n     * Add click listeners which opens the popup player on timestamps in a plain text.\n     *\n     * <p>\n     * This method finds all timestamps in the {@link SpannableStringBuilder} of the description\n     * using a regular expression, adds for each a {@link LongPressClickableSpan} which opens the\n     * popup player at the time indicated in the timestamps and copy the timestamp in clipboard\n     * when long-pressed.\n     * </p>\n     *\n     * @param context              the {@link Context} to use\n     * @param spannableDescription the {@link SpannableStringBuilder} with the text of the\n     *                             content description\n     * @param relatedInfoService   the service of the {@code relatedStreamUrl}\n     * @param relatedStreamUrl     what to open in the popup player when timestamps are clicked\n     * @param disposables          disposables created by the method are added here and their\n     *                             lifecycle should be handled by the calling class\n     */\n    private static void addClickListenersOnTimestamps(\n            @NonNull final Context context,\n            @NonNull final SpannableStringBuilder spannableDescription,\n            @NonNull final StreamingService relatedInfoService,\n            @NonNull final String relatedStreamUrl,\n            @NonNull final CompositeDisposable disposables) {\n        final String descriptionText = spannableDescription.toString();\n        final Matcher timestampsMatches = TimestampExtractor.TIMESTAMPS_PATTERN.matcher(\n                descriptionText);\n\n        while (timestampsMatches.find()) {\n            final TimestampExtractor.TimestampMatchDTO timestampMatchDTO =\n                    TimestampExtractor.getTimestampFromMatcher(timestampsMatches, descriptionText);\n\n            if (timestampMatchDTO == null) {\n                continue;\n            }\n\n            spannableDescription.setSpan(\n                    new TimestampLongPressClickableSpan(context, descriptionText, disposables,\n                            relatedInfoService, relatedStreamUrl, timestampMatchDTO),\n                    timestampMatchDTO.timestampStart(),\n                    timestampMatchDTO.timestampEnd(),\n                    0);\n        }\n    }\n\n    private static void setTextViewCharSequence(@NonNull final TextView textView,\n                                                @Nullable final CharSequence charSequence,\n                                                @Nullable final Consumer<TextView> onCompletion) {\n        textView.setText(charSequence);\n        textView.setVisibility(View.VISIBLE);\n        if (onCompletion != null) {\n            onCompletion.accept(textView);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/text/TextViewExtensions.kt",
    "content": "package org.schabi.newpipe.util.text\r\n\r\nimport android.content.res.Resources\r\nimport android.text.SpannableString\r\nimport android.text.method.LinkMovementMethod\r\nimport android.text.util.Linkify\r\nimport android.util.Patterns\r\nimport android.widget.TextView\r\nimport androidx.annotation.StringRes\r\nimport androidx.core.text.parseAsHtml\r\nimport androidx.core.text.toHtml\r\nimport androidx.core.text.toSpanned\r\n\r\n/**\r\n * Takes in a CharSequence [text]\r\n * and makes raw HTTP URLs and HTML anchor tags clickable\r\n */\r\nfun TextView.setTextWithLinks(text: CharSequence) {\r\n    val spanned = SpannableString(text)\r\n    // Using the pattern overload of addLinks since the one with the int masks strips all spans from the text before applying new ones\r\n    Linkify.addLinks(spanned, Patterns.WEB_URL, null)\r\n    this.text = spanned\r\n    this.movementMethod = LinkMovementMethod.getInstance()\r\n}\r\n\r\n/**\r\n * Gets text from string resource with [id] while preserving styling and allowing string format value substitution of [formatArgs]\r\n */\r\nfun Resources.getText(@StringRes id: Int, vararg formatArgs: Any?): CharSequence = getText(id).toSpanned().toHtml().format(*formatArgs).parseAsHtml()\r\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/text/TimestampExtractor.java",
    "content": "package org.schabi.newpipe.util.text;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\n/**\n * Extracts timestamps.\n */\npublic final class TimestampExtractor {\n    public static final Pattern TIMESTAMPS_PATTERN = Pattern.compile(\n            \"(?:^|(?!:)\\\\W)(?:([0-5]?[0-9]):)?([0-5]?[0-9]):([0-5][0-9])(?=$|(?!:)\\\\W)\");\n\n    private TimestampExtractor() {\n        // No impl pls\n    }\n\n    /**\n     * Gets a single timestamp from a matcher.\n     *\n     * @param timestampMatches the matcher which was created using {@link #TIMESTAMPS_PATTERN}\n     * @param baseText         the text where the pattern was applied to / where the matcher is\n     *                         based upon\n     * @return if a match occurred, a {@link TimestampMatchDTO} filled with information, otherwise\n     * {@code null}.\n     */\n    @Nullable\n    public static TimestampMatchDTO getTimestampFromMatcher(\n            @NonNull final Matcher timestampMatches,\n            @NonNull final String baseText) {\n        int timestampStart = timestampMatches.start(1);\n        if (timestampStart == -1) {\n            timestampStart = timestampMatches.start(2);\n        }\n        final int timestampEnd = timestampMatches.end(3);\n\n        final String parsedTimestamp = baseText.substring(timestampStart, timestampEnd);\n        final String[] timestampParts = parsedTimestamp.split(\":\");\n\n        final int seconds;\n        if (timestampParts.length == 3) { // timestamp format: XX:XX:XX\n            seconds = Integer.parseInt(timestampParts[0]) * 3600 // hours\n                    + Integer.parseInt(timestampParts[1]) * 60 // minutes\n                    + Integer.parseInt(timestampParts[2]); // seconds\n        } else if (timestampParts.length == 2) { // timestamp format: XX:XX\n            seconds = Integer.parseInt(timestampParts[0]) * 60 // minutes\n                    + Integer.parseInt(timestampParts[1]); // seconds\n        } else {\n            return null;\n        }\n\n        return new TimestampMatchDTO(timestampStart, timestampEnd, seconds);\n    }\n\n    public record TimestampMatchDTO(int timestampStart, int timestampEnd, int seconds) {\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/text/TimestampLongPressClickableSpan.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2023-2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.util.text\n\nimport android.content.Context\nimport android.view.View\nimport io.reactivex.rxjava3.disposables.CompositeDisposable\nimport org.schabi.newpipe.extractor.ServiceList\nimport org.schabi.newpipe.extractor.StreamingService\nimport org.schabi.newpipe.util.external_communication.ShareUtils\nimport org.schabi.newpipe.util.text.TimestampExtractor.TimestampMatchDTO\n\nclass TimestampLongPressClickableSpan(\n    private val context: Context,\n    private val descriptionText: String,\n    private val disposables: CompositeDisposable,\n    private val relatedInfoService: StreamingService,\n    private val relatedStreamUrl: String,\n    private val timestampMatchDTO: TimestampMatchDTO\n) : LongPressClickableSpan() {\n    override fun onClick(view: View) {\n        InternalUrlsHandler.playOnPopup(\n            context,\n            relatedStreamUrl,\n            relatedInfoService,\n            timestampMatchDTO.seconds()\n        )\n    }\n\n    override fun onLongClick(view: View) {\n        ShareUtils.copyToClipboard(\n            context,\n            getTimestampTextToCopy(\n                relatedInfoService,\n                relatedStreamUrl,\n                descriptionText,\n                timestampMatchDTO\n            )\n        )\n    }\n\n    companion object {\n        private fun getTimestampTextToCopy(\n            relatedInfoService: StreamingService,\n            relatedStreamUrl: String,\n            descriptionText: String,\n            timestampMatchDTO: TimestampMatchDTO\n        ): String {\n            // TODO: use extractor methods to get timestamps when this feature will be implemented in it\n            when (relatedInfoService) {\n                ServiceList.YouTube ->\n                    return relatedStreamUrl + \"&t=\" + timestampMatchDTO.seconds()\n\n                ServiceList.SoundCloud, ServiceList.MediaCCC ->\n                    return relatedStreamUrl + \"#t=\" + timestampMatchDTO.seconds()\n\n                ServiceList.PeerTube ->\n                    return relatedStreamUrl + \"?start=\" + timestampMatchDTO.seconds()\n            }\n\n            // Return timestamp text for other services\n            return descriptionText.substring(\n                timestampMatchDTO.timestampStart(),\n                timestampMatchDTO.timestampEnd()\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/text/TouchUtils.java",
    "content": "package org.schabi.newpipe.util.text;\n\nimport android.text.Layout;\nimport android.view.MotionEvent;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\n\npublic final class TouchUtils {\n\n    private TouchUtils() {\n    }\n\n    /**\n     * Get the character offset on the closest line to the position pressed by the user of a\n     * {@link TextView} from a {@link MotionEvent} which was fired on this {@link TextView}.\n     *\n     * @param textView the {@link TextView} on which the {@link MotionEvent} was fired\n     * @param event    the {@link MotionEvent} which was fired\n     * @return the character offset on the closest line to the position pressed by the user\n     */\n    public static int getOffsetForHorizontalLine(@NonNull final TextView textView,\n                                                 @NonNull final MotionEvent event) {\n\n        int x = (int) event.getX();\n        int y = (int) event.getY();\n\n        x -= textView.getTotalPaddingLeft();\n        y -= textView.getTotalPaddingTop();\n\n        x += textView.getScrollX();\n        y += textView.getScrollY();\n\n        final Layout layout = textView.getLayout();\n        final int line = layout.getLineForVertical(y);\n        return layout.getOffsetForHorizontal(line, x);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/text/UrlLongPressClickableSpan.java",
    "content": "package org.schabi.newpipe.util.text;\n\nimport android.content.Context;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\n\nfinal class UrlLongPressClickableSpan extends LongPressClickableSpan {\n\n    @NonNull\n    private final Context context;\n    @NonNull\n    private final String url;\n\n    UrlLongPressClickableSpan(@NonNull final Context context,\n                              @NonNull final String url) {\n        this.context = context;\n        this.url = url;\n    }\n\n    @Override\n    public void onClick(@NonNull final View view) {\n        if (!InternalUrlsHandler.handleUrlDescriptionTimestamp(context, url)) {\n            ShareUtils.openUrlInApp(context, url);\n        }\n    }\n\n    @Override\n    public void onLongClick(@NonNull final View view) {\n        ShareUtils.copyToClipboard(context, url);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/urlfinder/PatternsCompat.java",
    "content": "/* THIS FILE WAS MODIFIED, CHANGES ARE DOCUMENTED. */\n\n/*\n * Copyright (C) 2016 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage org.schabi.newpipe.util.urlfinder;\n\nimport java.util.regex.Pattern;\n\n/**\n * Commonly used regular expression patterns.\n */\npublic final class PatternsCompat {\n    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n    // CHANGED: Removed unused code //\n    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n    public static final Pattern IP_ADDRESS = Pattern.compile(\n            \"((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\\\.(25[0-5]|2[0-4]\"\n                    + \"[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\\\.(25[0-5]|2[0-4][0-9]|[0-1]\"\n                    + \"[0-9]{2}|[1-9][0-9]|[1-9]|0)\\\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}\"\n                    + \"|[1-9][0-9]|[0-9]))\");\n\n    /**\n     * Valid UCS characters defined in RFC 3987. Excludes space characters.\n     */\n    private static final String UCS_CHAR = \"[\"\n            + \"\\u00A0-\\uD7FF\"\n            + \"\\uF900-\\uFDCF\"\n            + \"\\uFDF0-\\uFFEF\"\n            + \"\\uD800\\uDC00-\\uD83F\\uDFFD\"\n            + \"\\uD840\\uDC00-\\uD87F\\uDFFD\"\n            + \"\\uD880\\uDC00-\\uD8BF\\uDFFD\"\n            + \"\\uD8C0\\uDC00-\\uD8FF\\uDFFD\"\n            + \"\\uD900\\uDC00-\\uD93F\\uDFFD\"\n            + \"\\uD940\\uDC00-\\uD97F\\uDFFD\"\n            + \"\\uD980\\uDC00-\\uD9BF\\uDFFD\"\n            + \"\\uD9C0\\uDC00-\\uD9FF\\uDFFD\"\n            + \"\\uDA00\\uDC00-\\uDA3F\\uDFFD\"\n            + \"\\uDA40\\uDC00-\\uDA7F\\uDFFD\"\n            + \"\\uDA80\\uDC00-\\uDABF\\uDFFD\"\n            + \"\\uDAC0\\uDC00-\\uDAFF\\uDFFD\"\n            + \"\\uDB00\\uDC00-\\uDB3F\\uDFFD\"\n            + \"\\uDB44\\uDC00-\\uDB7F\\uDFFD\"\n            + \"&&[^\\u00A0[\\u2000-\\u200A]\\u2028\\u2029\\u202F\\u3000]]\";\n\n    /**\n     * Valid characters for IRI label defined in RFC 3987.\n     */\n    private static final String LABEL_CHAR = \"a-zA-Z0-9\" + UCS_CHAR;\n\n    /**\n     * RFC 1035 Section 2.3.4 limits the labels to a maximum 63 octets.\n     */\n    private static final String IRI_LABEL =\n            \"[\" + LABEL_CHAR + \"](?:[\" + LABEL_CHAR + \"_\\\\-]{0,61}[\" + LABEL_CHAR + \"]){0,1}\";\n\n    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n    // CHANGED: Removed rtsp from supported protocols //\n    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n    private static final String PROTOCOL = \"(?i:http|https)://\";\n\n    /* A word boundary or end of input.  This is to stop foo.sure from matching as foo.su */\n    private static final String WORD_BOUNDARY = \"(?:\\\\b|$|^)\";\n\n    private static final String USER_INFO = \"(?:[a-zA-Z0-9\\\\$\\\\-\\\\_\\\\.\\\\+\\\\!\\\\*\\\\'\\\\(\\\\)\"\n            + \"\\\\,\\\\;\\\\?\\\\&\\\\=]|(?:\\\\%[a-fA-F0-9]{2})){1,64}(?:\\\\:(?:[a-zA-Z0-9\\\\$\\\\-\\\\_\"\n            + \"\\\\.\\\\+\\\\!\\\\*\\\\'\\\\(\\\\)\\\\,\\\\;\\\\?\\\\&\\\\=]|(?:\\\\%[a-fA-F0-9]{2})){1,25})?\\\\@\";\n\n    private static final String PORT_NUMBER = \"\\\\:\\\\d{1,5}\";\n\n    private static final String PATH_AND_QUERY = \"[/\\\\?](?:(?:[\" + LABEL_CHAR\n            + \";/\\\\?:@&=#~\"  // plus optional query params\n            + \"\\\\-\\\\.\\\\+!\\\\*'\\\\(\\\\),_\\\\$])|(?:%[a-fA-F0-9]{2}))*\";\n\n    /**\n     * Regular expression that matches domain names without a TLD.\n     */\n    private static final String RELAXED_DOMAIN_NAME =\n            \"(?:\" + \"(?:\" + IRI_LABEL + \"(?:\\\\.(?=\\\\S))\" + \"?)+\" + \"|\" + IP_ADDRESS + \")\";\n\n    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n    // CHANGED: Field visibility was modified //\n    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n    /**\n     * Regular expression to match strings that start with a supported protocol. Rules for domain\n     * names and TLDs are more relaxed. TLDs are optional.\n     */\n    /*package*/ static final String WEB_URL_WITH_PROTOCOL = \"(\"\n            + WORD_BOUNDARY\n            + \"(?:\"\n            + \"(?:\" + PROTOCOL + \"(?:\" + USER_INFO + \")?\" + \")\"\n            + \"(?:\" + RELAXED_DOMAIN_NAME + \")?\"\n            + \"(?:\" + PORT_NUMBER + \")?\"\n            + \")\"\n            + \"(?:\" + PATH_AND_QUERY + \")?\"\n            + WORD_BOUNDARY\n            + \")\";\n\n    /**\n     * Do not create this static utility class.\n     */\n    private PatternsCompat() { }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/util/urlfinder/UrlFinder.kt",
    "content": "package org.schabi.newpipe.util.urlfinder\n\nimport java.util.regex.Pattern\n\nclass UrlFinder {\n    companion object {\n        private val WEB_URL_WITH_PROTOCOL = Pattern.compile(PatternsCompat.WEB_URL_WITH_PROTOCOL)\n\n        /**\n         * @return the first url found in the input, null otherwise.\n         */\n        @JvmStatic\n        fun firstUrlFromInput(input: String?): String? {\n            if (input.isNullOrEmpty()) {\n                return null\n            }\n\n            val matcher = WEB_URL_WITH_PROTOCOL.matcher(input)\n\n            if (matcher.find()) {\n                return matcher.group()\n            }\n\n            return null\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/AnimatedProgressBar.java",
    "content": "package org.schabi.newpipe.views;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.animation.AccelerateDecelerateInterpolator;\nimport android.view.animation.Animation;\nimport android.view.animation.Transformation;\nimport android.widget.ProgressBar;\n\nimport androidx.annotation.Nullable;\n\npublic final class AnimatedProgressBar extends ProgressBar {\n    @Nullable\n    private ProgressBarAnimation animation = null;\n\n    public AnimatedProgressBar(final Context context) {\n        super(context);\n    }\n\n    public AnimatedProgressBar(final Context context, final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public AnimatedProgressBar(final Context context, final AttributeSet attrs,\n                               final int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    public synchronized void setProgressAnimated(final int progress) {\n        cancelAnimation();\n        animation = new ProgressBarAnimation(this, getProgress(), progress);\n        startAnimation(animation);\n    }\n\n    private void cancelAnimation() {\n        if (animation != null) {\n            animation.cancel();\n            animation = null;\n        }\n        clearAnimation();\n    }\n\n    private static class ProgressBarAnimation extends Animation {\n\n        private final AnimatedProgressBar progressBar;\n        private final float from;\n        private final float to;\n\n        ProgressBarAnimation(final AnimatedProgressBar progressBar, final float from,\n                             final float to) {\n            super();\n            this.progressBar = progressBar;\n            this.from = from;\n            this.to = to;\n            setDuration(500);\n            setInterpolator(new AccelerateDecelerateInterpolator());\n        }\n\n        @Override\n        protected void applyTransformation(final float interpolatedTime, final Transformation t) {\n            super.applyTransformation(interpolatedTime, t);\n            final float value = from + (to - from) * interpolatedTime;\n            progressBar.setProgress((int) value);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/CustomCollapsingToolbarLayout.java",
    "content": "package org.schabi.newpipe.views;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.view.ViewCompat;\nimport androidx.core.view.WindowInsetsCompat;\n\nimport com.google.android.material.appbar.CollapsingToolbarLayout;\n\npublic class CustomCollapsingToolbarLayout extends CollapsingToolbarLayout {\n    public CustomCollapsingToolbarLayout(@NonNull final Context context) {\n        super(context);\n        overrideListener();\n    }\n\n    public CustomCollapsingToolbarLayout(@NonNull final Context context,\n                                         @Nullable final AttributeSet attrs) {\n        super(context, attrs);\n        overrideListener();\n    }\n\n    public CustomCollapsingToolbarLayout(@NonNull final Context context,\n                                         @Nullable final AttributeSet attrs,\n                                         final int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        overrideListener();\n    }\n\n    /**\n     * CollapsingToolbarLayout sets it's own setOnApplyInsetsListener which consumes\n     * system insets {@link CollapsingToolbarLayout#onWindowInsetChanged(WindowInsetsCompat)}\n     * so we will not receive them in subviews with fitsSystemWindows = true.\n     * Override Google's behavior\n     * */\n    public void overrideListener() {\n        ViewCompat.setOnApplyWindowInsetsListener(this, (v, insets) -> insets);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/ExpandableSurfaceView.java",
    "content": "package org.schabi.newpipe.views;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.SurfaceView;\n\nimport com.google.android.exoplayer2.ui.AspectRatioFrameLayout;\n\nimport static com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_FIT;\nimport static com.google.android.exoplayer2.ui.AspectRatioFrameLayout.RESIZE_MODE_ZOOM;\n\npublic class ExpandableSurfaceView extends SurfaceView {\n    private int resizeMode = RESIZE_MODE_FIT;\n    private int baseHeight = 0;\n    private int maxHeight = 0;\n    private float videoAspectRatio = 0.0f;\n    private float scaleX = 1.0f;\n    private float scaleY = 1.0f;\n\n    public ExpandableSurfaceView(final Context context, final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    @Override\n    protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n        if (videoAspectRatio == 0.0f) {\n            return;\n        }\n\n        int width = MeasureSpec.getSize(widthMeasureSpec);\n        final boolean verticalVideo = videoAspectRatio < 1;\n        // Use maxHeight only on non-fit resize mode and in vertical videos\n        int height = maxHeight != 0\n                && resizeMode != RESIZE_MODE_FIT\n                && verticalVideo ? maxHeight : baseHeight;\n\n        if (width == 0 || height == 0) {\n            return;\n        }\n\n        final float viewAspectRatio = width / ((float) height);\n        final float aspectDeformation = (videoAspectRatio / viewAspectRatio) - 1;\n        scaleX = 1.0f;\n        scaleY = 1.0f;\n\n        if (resizeMode == RESIZE_MODE_FIT) {\n            if (aspectDeformation > 0) {\n                height = (int) (width / videoAspectRatio);\n            } else {\n                width = (int) (height * videoAspectRatio);\n            }\n        } else if (resizeMode == RESIZE_MODE_ZOOM) {\n            if (aspectDeformation < 0) {\n                scaleY = viewAspectRatio / videoAspectRatio;\n            } else {\n                scaleX = videoAspectRatio / viewAspectRatio;\n            }\n        }\n\n        super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),\n                MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));\n    }\n\n    /**\n     * Scale view only in {@link #onLayout} to make transition for ZOOM mode as smooth as possible.\n     */\n    @Override\n    protected void onLayout(final boolean changed,\n                            final int left, final int top, final int right, final int bottom) {\n        setScaleX(scaleX);\n        setScaleY(scaleY);\n    }\n\n    /**\n     * @param base The height that will be used in every resize mode as a minimum height\n     * @param max  The max height for vertical videos in non-FIT resize modes\n     */\n    public void setHeights(final int base, final int max) {\n        if (baseHeight == base && maxHeight == max) {\n            return;\n        }\n        baseHeight = base;\n        maxHeight = max;\n        requestLayout();\n    }\n\n    public void setResizeMode(@AspectRatioFrameLayout.ResizeMode final int newResizeMode) {\n        if (resizeMode == newResizeMode) {\n            return;\n        }\n\n        resizeMode = newResizeMode;\n        requestLayout();\n    }\n\n    @AspectRatioFrameLayout.ResizeMode\n    public int getResizeMode() {\n        return resizeMode;\n    }\n\n    public void setAspectRatio(final float aspectRatio) {\n        if (videoAspectRatio == aspectRatio || aspectRatio == 0 || !Float.isFinite(aspectRatio)) {\n            return;\n        }\n\n        videoAspectRatio = aspectRatio;\n        requestLayout();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/FocusAwareCoordinator.java",
    "content": "/*\n * Copyright (C) Eltex ltd 2019 <eltex@eltex-co.ru>\n * FocusAwareCoordinator.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\npackage org.schabi.newpipe.views;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.WindowInsets;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.coordinatorlayout.widget.CoordinatorLayout;\nimport androidx.core.view.WindowInsetsCompat;\n\nimport org.schabi.newpipe.R;\n\npublic final class FocusAwareCoordinator extends CoordinatorLayout {\n    private final Rect childFocus = new Rect();\n\n    public FocusAwareCoordinator(@NonNull final Context context) {\n        super(context);\n    }\n\n    public FocusAwareCoordinator(@NonNull final Context context,\n                                 @Nullable final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public FocusAwareCoordinator(@NonNull final Context context,\n                                 @Nullable final AttributeSet attrs, final int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    @Override\n    public void requestChildFocus(final View child, final View focused) {\n        super.requestChildFocus(child, focused);\n\n        if (!isInTouchMode()) {\n            if (focused.getHeight() >= getHeight()) {\n                focused.getFocusedRect(childFocus);\n\n                ((ViewGroup) child).offsetDescendantRectToMyCoords(focused, childFocus);\n            } else {\n                focused.getHitRect(childFocus);\n\n                ((ViewGroup) child).offsetDescendantRectToMyCoords((View) focused.getParent(),\n                        childFocus);\n            }\n\n            requestChildRectangleOnScreen(child, childFocus, false);\n        }\n    }\n\n    /**\n     * Applies window insets to all children, not just for the first who consume the insets.\n     * Makes possible for multiple fragments to co-exist. Without this code\n     * the first ViewGroup who consumes will be the last who receive the insets\n     */\n    @Override\n    public WindowInsets dispatchApplyWindowInsets(final WindowInsets insets) {\n        boolean consumed = false;\n        for (int i = 0; i < getChildCount(); i++) {\n            final View child = getChildAt(i);\n            final WindowInsets res = child.dispatchApplyWindowInsets(insets);\n            if (res.isConsumed()) {\n                consumed = true;\n            }\n        }\n\n        return consumed ? WindowInsetsCompat.CONSUMED.toWindowInsets() : insets;\n    }\n\n    /**\n     * Adjusts player's controls manually because onApplyWindowInsets doesn't work when multiple\n     * receivers adjust its bounds. So when two listeners are present (like in profile page)\n     * the player's controls will not receive insets. This method fixes it\n     */\n    @Override\n    public WindowInsets onApplyWindowInsets(final WindowInsets windowInsets) {\n        final var windowInsetsCompat = WindowInsetsCompat.toWindowInsetsCompat(windowInsets, this);\n        final var insets = windowInsetsCompat.getInsets(WindowInsetsCompat.Type.systemBars());\n        final ViewGroup controls = findViewById(R.id.playbackControlRoot);\n        if (controls != null) {\n            controls.setPadding(insets.left, insets.top, insets.right, insets.bottom);\n        }\n        return super.onApplyWindowInsets(windowInsets);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/FocusAwareDrawerLayout.java",
    "content": "/*\n * Copyright (C) Eltex ltd 2019 <eltex@eltex-co.ru>\n * FocusAwareDrawerLayout.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\npackage org.schabi.newpipe.views;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.util.AttributeSet;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.drawerlayout.widget.DrawerLayout;\n\nimport java.util.ArrayList;\n\npublic final class FocusAwareDrawerLayout extends DrawerLayout {\n    public FocusAwareDrawerLayout(@NonNull final Context context) {\n        super(context);\n    }\n\n    public FocusAwareDrawerLayout(@NonNull final Context context,\n                                  @Nullable final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public FocusAwareDrawerLayout(@NonNull final Context context,\n                                  @Nullable final AttributeSet attrs,\n                                  final int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    @Override\n    protected boolean onRequestFocusInDescendants(final int direction,\n                                                  final Rect previouslyFocusedRect) {\n        // SDK implementation of this method picks whatever visible View takes the focus first\n        // without regard to addFocusables. If the open drawer is temporarily empty, the focus\n        // escapes outside of it, which can be confusing\n\n        boolean hasOpenPanels = false;\n\n        for (int i = 0; i < getChildCount(); ++i) {\n            final View child = getChildAt(i);\n\n            final DrawerLayout.LayoutParams lp =\n                    (DrawerLayout.LayoutParams) child.getLayoutParams();\n\n            if (lp.gravity != 0 && isDrawerVisible(child)) {\n                hasOpenPanels = true;\n\n                if (child.requestFocus(direction, previouslyFocusedRect)) {\n                    return true;\n                }\n            }\n        }\n\n        if (hasOpenPanels) {\n            return false;\n        }\n\n        return super.onRequestFocusInDescendants(direction, previouslyFocusedRect);\n    }\n\n    @Override\n    public void addFocusables(final ArrayList<View> views, final int direction,\n                              final int focusableMode) {\n        boolean hasOpenPanels = false;\n        View content = null;\n\n        for (int i = 0; i < getChildCount(); ++i) {\n            final View child = getChildAt(i);\n\n            final DrawerLayout.LayoutParams lp =\n                    (DrawerLayout.LayoutParams) child.getLayoutParams();\n\n            if (lp.gravity == 0) {\n                content = child;\n            } else {\n                if (isDrawerVisible(child)) {\n                    hasOpenPanels = true;\n                    child.addFocusables(views, direction, focusableMode);\n                }\n            }\n        }\n\n        if (content != null && !hasOpenPanels) {\n            content.addFocusables(views, direction, focusableMode);\n        }\n    }\n\n    // this override isn't strictly necessary, but it is helpful when DrawerLayout isn't\n    // the topmost view in hierarchy (such as when system or builtin appcompat ActionBar is used)\n    @Override\n    @SuppressLint(\"RtlHardcoded\")\n    public void openDrawer(@NonNull final View drawerView, final boolean animate) {\n        super.openDrawer(drawerView, animate);\n\n        drawerView.requestFocus(FOCUS_FORWARD);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/FocusAwareSeekBar.java",
    "content": "/*\n * Copyright (C) Eltex ltd 2019 <eltex@eltex-co.ru>\n * FocusAwareDrawerLayout.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\npackage org.schabi.newpipe.views;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.util.AttributeSet;\nimport android.view.KeyEvent;\nimport android.view.ViewTreeObserver;\nimport android.widget.SeekBar;\n\nimport androidx.appcompat.widget.AppCompatSeekBar;\n\nimport org.schabi.newpipe.util.DeviceUtils;\n\n/**\n * SeekBar, adapted for directional navigation. It emulates touch-related callbacks\n * (onStartTrackingTouch/onStopTrackingTouch), so existing code does not need to be changed to\n * work with it.\n  */\npublic final class FocusAwareSeekBar extends AppCompatSeekBar {\n    private NestedListener listener;\n\n    private ViewTreeObserver treeObserver;\n\n    public FocusAwareSeekBar(final Context context) {\n        super(context);\n    }\n\n    public FocusAwareSeekBar(final Context context, final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public FocusAwareSeekBar(final Context context, final AttributeSet attrs,\n                             final int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    @Override\n    public void setOnSeekBarChangeListener(final OnSeekBarChangeListener l) {\n        this.listener = l == null ? null : new NestedListener(l);\n\n        super.setOnSeekBarChangeListener(listener);\n    }\n\n    @Override\n    public boolean onKeyDown(final int keyCode, final KeyEvent event) {\n        if (!isInTouchMode() && DeviceUtils.isConfirmKey(keyCode)) {\n            releaseTrack();\n        }\n\n        return super.onKeyDown(keyCode, event);\n    }\n\n    @Override\n    protected void onFocusChanged(final boolean gainFocus, final int direction,\n                                  final Rect previouslyFocusedRect) {\n        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);\n\n        if (!isInTouchMode() && !gainFocus) {\n            releaseTrack();\n        }\n    }\n\n    private final ViewTreeObserver.OnTouchModeChangeListener touchModeListener = isInTouchMode -> {\n        if (isInTouchMode) {\n            releaseTrack();\n        }\n    };\n\n    @Override\n    protected void onAttachedToWindow() {\n        super.onAttachedToWindow();\n\n        treeObserver = getViewTreeObserver();\n        treeObserver.addOnTouchModeChangeListener(touchModeListener);\n    }\n\n    @Override\n    protected void onDetachedFromWindow() {\n        if (treeObserver == null || !treeObserver.isAlive()) {\n            treeObserver = getViewTreeObserver();\n        }\n\n        treeObserver.removeOnTouchModeChangeListener(touchModeListener);\n        treeObserver = null;\n\n        super.onDetachedFromWindow();\n    }\n\n    private void releaseTrack() {\n        if (listener != null && listener.isSeeking) {\n            listener.onStopTrackingTouch(this);\n        }\n    }\n\n    private static final class NestedListener implements OnSeekBarChangeListener {\n        private final OnSeekBarChangeListener delegate;\n\n        boolean isSeeking;\n\n        private NestedListener(final OnSeekBarChangeListener delegate) {\n            this.delegate = delegate;\n        }\n\n        @Override\n        public void onProgressChanged(final SeekBar seekBar, final int progress,\n                                      final boolean fromUser) {\n            if (!seekBar.isInTouchMode() && !isSeeking && fromUser) {\n                isSeeking = true;\n\n                onStartTrackingTouch(seekBar);\n            }\n\n            delegate.onProgressChanged(seekBar, progress, fromUser);\n        }\n\n        @Override\n        public void onStartTrackingTouch(final SeekBar seekBar) {\n            isSeeking = true;\n\n            delegate.onStartTrackingTouch(seekBar);\n        }\n\n        @Override\n        public void onStopTrackingTouch(final SeekBar seekBar) {\n            isSeeking = false;\n\n            delegate.onStopTrackingTouch(seekBar);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/FocusOverlayView.java",
    "content": "/*\n * Copyright 2019 Alexander Rvachev <rvacheva@nxt.ru>\n * FocusOverlayView.java is part of NewPipe\n *\n * License: GPL-3.0+\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\npackage org.schabi.newpipe.views;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.ColorFilter;\nimport android.graphics.Paint;\nimport android.graphics.PixelFormat;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport android.os.Build;\nimport android.os.Handler;\nimport android.os.Looper;\nimport android.os.Message;\nimport android.view.KeyEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.ViewTreeObserver;\nimport android.view.Window;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.RequiresApi;\n\nimport org.schabi.newpipe.R;\n\nimport java.lang.ref.WeakReference;\n\npublic final class FocusOverlayView extends Drawable implements\n        ViewTreeObserver.OnGlobalFocusChangeListener,\n        ViewTreeObserver.OnDrawListener,\n        ViewTreeObserver.OnGlobalLayoutListener,\n        ViewTreeObserver.OnScrollChangedListener, ViewTreeObserver.OnTouchModeChangeListener {\n\n    private boolean isInTouchMode;\n\n    private final Rect focusRect = new Rect();\n\n    private final Paint rectPaint = new Paint();\n\n    private final Handler animator = new Handler(Looper.getMainLooper()) {\n        @Override\n        public void handleMessage(final Message msg) {\n            updateRect();\n        }\n    };\n\n    private WeakReference<View> focused;\n\n    public FocusOverlayView(final Context context) {\n        rectPaint.setStyle(Paint.Style.STROKE);\n        rectPaint.setStrokeWidth(2);\n        rectPaint.setColor(context.getResources().getColor(R.color.white));\n    }\n\n    @Override\n    public void onGlobalFocusChanged(final View oldFocus, final View newFocus) {\n        if (newFocus != null) {\n            focused = new WeakReference<>(newFocus);\n        } else {\n            focused = null;\n        }\n\n        updateRect();\n\n        animator.sendEmptyMessageDelayed(0, 1000);\n    }\n\n    private void updateRect() {\n        final View focusedView = focused == null ? null : this.focused.get();\n\n        final int l = focusRect.left;\n        final int r = focusRect.right;\n        final int t = focusRect.top;\n        final int b = focusRect.bottom;\n\n        if (focusedView != null && isShown(focusedView)) {\n            focusedView.getGlobalVisibleRect(focusRect);\n        }\n\n        if (shouldClearFocusRect(focusedView, focusRect)) {\n            focusRect.setEmpty();\n        }\n\n        if (l != focusRect.left || r != focusRect.right\n                || t != focusRect.top || b != focusRect.bottom) {\n            invalidateSelf();\n        }\n    }\n\n    private boolean isShown(@NonNull final View view) {\n        return view.getWidth() != 0 && view.getHeight() != 0 && view.isShown();\n    }\n\n    @Override\n    public void onDraw() {\n        updateRect();\n    }\n\n    @Override\n    public void onScrollChanged() {\n        updateRect();\n\n        animator.removeMessages(0);\n        animator.sendEmptyMessageDelayed(0, 1000);\n    }\n\n    @Override\n    public void onGlobalLayout() {\n        updateRect();\n\n        animator.sendEmptyMessageDelayed(0, 1000);\n    }\n\n    @Override\n    public void onTouchModeChanged(final boolean inTouchMode) {\n        this.isInTouchMode = inTouchMode;\n\n        if (inTouchMode) {\n            updateRect();\n        } else {\n            invalidateSelf();\n        }\n    }\n\n    public void setCurrentFocus(final View newFocus) {\n        if (newFocus == null) {\n            return;\n        }\n\n        this.isInTouchMode = newFocus.isInTouchMode();\n\n        onGlobalFocusChanged(null, newFocus);\n    }\n\n    @Override\n    public void draw(@NonNull final Canvas canvas) {\n        if (!isInTouchMode && focusRect.width() != 0) {\n            canvas.drawRect(focusRect, rectPaint);\n        }\n    }\n\n    @Override\n    public int getOpacity() {\n        return PixelFormat.TRANSPARENT;\n    }\n\n    @Override\n    public void setAlpha(final int alpha) {\n    }\n\n    @Override\n    public void setColorFilter(final ColorFilter colorFilter) {\n    }\n\n    /*\n     * When any view in the player looses it's focus (after setVisibility(GONE)) the focus gets\n     * added to the whole fragment which has a width and height equal to the window frame.\n     * The easiest way to avoid the unneeded frame is to skip highlighting of rect that is\n     * equal to the overlayView bounds\n     * */\n    private boolean shouldClearFocusRect(@Nullable final View focusedView, final Rect focusedRect) {\n        return focusedView == null || focusedRect.equals(getBounds());\n    }\n\n    public static void setupFocusObserver(final Dialog dialog) {\n        final Rect displayRect = new Rect();\n\n        final Window window = dialog.getWindow();\n        assert window != null;\n\n        final View decor = window.getDecorView();\n        decor.getWindowVisibleDisplayFrame(displayRect);\n\n        final FocusOverlayView overlay = new FocusOverlayView(dialog.getContext());\n        overlay.setBounds(0, 0, displayRect.width(), displayRect.height());\n\n        setupOverlay(window, overlay);\n    }\n\n    public static void setupFocusObserver(final Activity activity) {\n        final Rect displayRect = new Rect();\n\n        final Window window = activity.getWindow();\n        final View decor = window.getDecorView();\n        decor.getWindowVisibleDisplayFrame(displayRect);\n\n        final FocusOverlayView overlay = new FocusOverlayView(activity);\n        overlay.setBounds(0, 0, displayRect.width(), displayRect.height());\n\n        setupOverlay(window, overlay);\n    }\n\n    private static void setupOverlay(final Window window, final FocusOverlayView overlay) {\n        final ViewGroup decor = (ViewGroup) window.getDecorView();\n        decor.getOverlay().add(overlay);\n\n        fixFocusHierarchy(decor);\n\n        final ViewTreeObserver observer = decor.getViewTreeObserver();\n        observer.addOnScrollChangedListener(overlay);\n        observer.addOnGlobalFocusChangeListener(overlay);\n        observer.addOnGlobalLayoutListener(overlay);\n        observer.addOnTouchModeChangeListener(overlay);\n        observer.addOnDrawListener(overlay);\n\n        overlay.setCurrentFocus(decor.getFocusedChild());\n\n        // Some key presses don't actually move focus, but still result in movement on screen.\n        // For example, MovementMethod of TextView may cause requestRectangleOnScreen() due to\n        // some \"focusable\" spans, which in turn causes CoordinatorLayout to \"scroll\" it's children.\n        // Unfortunately many such forms of \"scrolling\" do not count as scrolling for purpose\n        // of dispatching ViewTreeObserver callbacks, so we have to intercept them by directly\n        // receiving keys from Window.\n        window.setCallback(new SimpleWindowCallback(window.getCallback()) {\n            @Override\n            public boolean dispatchKeyEvent(final KeyEvent event) {\n                final boolean res = super.dispatchKeyEvent(event);\n                overlay.onKey(event);\n                return res;\n            }\n        });\n    }\n\n    private void onKey(final KeyEvent event) {\n        if (event.getAction() != KeyEvent.ACTION_DOWN) {\n            return;\n        }\n\n        updateRect();\n\n        animator.sendEmptyMessageDelayed(0, 100);\n    }\n\n    private static void fixFocusHierarchy(final View decor) {\n        // During Android 8 development some dumb ass decided, that action bar has to be\n        // a keyboard focus cluster. Unfortunately, keyboard clusters do not work for primary\n        // auditory of key navigation — Android TV users (Android TV remotes do not have\n        // keyboard META key for moving between clusters). We have to fix this unfortunate accident\n        // While we are at it, let's deal with touchscreenBlocksFocus too.\n\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {\n            return;\n        }\n\n        if (!(decor instanceof ViewGroup)) {\n            return;\n        }\n\n        clearFocusObstacles((ViewGroup) decor);\n    }\n\n    @RequiresApi(api = Build.VERSION_CODES.O)\n    private static void clearFocusObstacles(final ViewGroup viewGroup) {\n        viewGroup.setTouchscreenBlocksFocus(false);\n\n        if (viewGroup.isKeyboardNavigationCluster()) {\n            viewGroup.setKeyboardNavigationCluster(false);\n\n            return; // clusters aren't supposed to nest\n        }\n\n        final int childCount = viewGroup.getChildCount();\n\n        for (int i = 0; i < childCount; ++i) {\n            final View view = viewGroup.getChildAt(i);\n\n            if (view instanceof ViewGroup) {\n                clearFocusObstacles((ViewGroup) view);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/NewPipeEditText.java",
    "content": "package org.schabi.newpipe.views;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.widget.AppCompatEditText;\n\nimport org.schabi.newpipe.util.NewPipeTextViewHelper;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\n\n/**\n * An {@link AppCompatEditText} which uses {@link ShareUtils#shareText(Context, String, String)}\n * when sharing selected text by using the {@code Share} command of the floating actions.\n *\n * <p>\n * This class allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing\n * text from {@link AppCompatEditText} on EMUI devices.\n * </p>\n */\npublic class NewPipeEditText extends AppCompatEditText {\n\n    public NewPipeEditText(@NonNull final Context context) {\n        super(context);\n    }\n\n    public NewPipeEditText(@NonNull final Context context, @Nullable final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public NewPipeEditText(@NonNull final Context context,\n                           @Nullable final AttributeSet attrs,\n                           final int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    @Override\n    public boolean onTextContextMenuItem(final int id) {\n        if (id == android.R.id.shareText) {\n            NewPipeTextViewHelper.shareSelectedTextWithShareUtils(this);\n            return true;\n        }\n        return super.onTextContextMenuItem(id);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/NewPipeRecyclerView.java",
    "content": "/*\n * Copyright (C) Eltex ltd 2019 <eltex@eltex-co.ru>\n * NewPipeRecyclerView.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\npackage org.schabi.newpipe.views;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.os.Build;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.FocusFinder;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.recyclerview.widget.RecyclerView;\n\npublic class NewPipeRecyclerView extends RecyclerView {\n    private static final String TAG = \"NewPipeRecyclerView\";\n\n    private final Rect focusRect = new Rect();\n    private final Rect tempFocus = new Rect();\n\n    private boolean allowDpadScroll = true;\n\n    public NewPipeRecyclerView(@NonNull final Context context) {\n        super(context);\n\n        init();\n    }\n\n    public NewPipeRecyclerView(@NonNull final Context context,\n                               @Nullable final AttributeSet attrs) {\n        super(context, attrs);\n\n        init();\n    }\n\n    public NewPipeRecyclerView(@NonNull final Context context,\n                               @Nullable final AttributeSet attrs, final int defStyle) {\n        super(context, attrs, defStyle);\n\n        init();\n    }\n\n    private void init() {\n        setFocusable(true);\n\n        setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);\n    }\n\n    public void setFocusScrollAllowed(final boolean allowed) {\n        this.allowDpadScroll = allowed;\n    }\n\n    @Override\n    public View focusSearch(final View focused, final int direction) {\n        // RecyclerView has buggy focusSearch(), that calls into Adapter several times,\n        // but ultimately fails to produce correct results in many cases. To add insult to injury,\n        // it's focusSearch() hard-codes several behaviors, incompatible with widely accepted focus\n        // handling practices: RecyclerView does not allow Adapter to give focus to itself (!!) and\n        // always checks, that returned View is located in \"correct\" direction (which prevents us\n        // from temporarily giving focus to special hidden View).\n        return null;\n    }\n\n    @Override\n    protected void removeDetachedView(final View child, final boolean animate) {\n        if (child.hasFocus()) {\n            // If the focused child is being removed (can happen during very fast scrolling),\n            // temporarily give focus to ourselves. This will usually result in another child\n            // gaining focus (which one does not really matter, because at that point scrolling\n            // is FAST, and that child will soon be off-screen too)\n            requestFocus();\n        }\n\n        super.removeDetachedView(child, animate);\n    }\n\n    // we override focusSearch to always return null, so all moves moves lead to\n    // dispatchUnhandledMove(). As added advantage, we can fully swallow some kinds of moves\n    // (such as downward movement, that happens when loading additional contents is in progress\n\n    @Override\n    public boolean dispatchUnhandledMove(final View focused, final int direction) {\n        tempFocus.setEmpty();\n\n        // save focus rect before further manipulation (both focusSearch() and scrollBy()\n        // can mess with focused View by moving it off-screen and detaching)\n\n        if (focused != null) {\n            final View focusedItem = findContainingItemView(focused);\n            if (focusedItem != null) {\n                focusedItem.getHitRect(focusRect);\n            }\n        }\n\n        // call focusSearch() to initiate layout, but disregard returned View for now\n        final View adapterResult = super.focusSearch(focused, direction);\n        if (adapterResult != null && !isOutside(adapterResult)) {\n            adapterResult.requestFocus(direction);\n            return true;\n        }\n\n        if (arrowScroll(direction)) {\n            // if RecyclerView can not yield focus, but there is still some scrolling space in\n            // indicated, direction, scroll some fixed amount in that direction\n            // (the same logic in ScrollView)\n            return true;\n        }\n\n        if (focused != this && direction == FOCUS_DOWN && !allowDpadScroll) {\n            Log.i(TAG, \"Consuming downward scroll: content load in progress\");\n            return true;\n        }\n\n        if (tryFocusFinder(direction)) {\n            return true;\n        }\n\n        if (adapterResult != null) {\n            adapterResult.requestFocus(direction);\n            return true;\n        }\n\n        return super.dispatchUnhandledMove(focused, direction);\n    }\n\n    private boolean tryFocusFinder(final int direction) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n            // Android 9 implemented bunch of handy changes to focus, that render code below less\n            // useful, and also broke findNextFocusFromRect in way, that render this hack useless\n            return false;\n        }\n\n        final FocusFinder finder = FocusFinder.getInstance();\n\n        // try to use FocusFinder instead of adapter\n        final ViewGroup root = (ViewGroup) getRootView();\n\n        tempFocus.set(focusRect);\n\n        root.offsetDescendantRectToMyCoords(this, tempFocus);\n\n        final View focusFinderResult = finder.findNextFocusFromRect(root, tempFocus, direction);\n        if (focusFinderResult != null && !isOutside(focusFinderResult)) {\n            focusFinderResult.requestFocus(direction);\n            return true;\n        }\n\n        // look for focus in our ancestors, increasing search scope with each failure\n        // this provides much better locality than using FocusFinder with root\n        ViewGroup parent = (ViewGroup) getParent();\n\n        while (parent != root) {\n            tempFocus.set(focusRect);\n\n            parent.offsetDescendantRectToMyCoords(this, tempFocus);\n\n            final View candidate = finder.findNextFocusFromRect(parent, tempFocus, direction);\n            if (candidate != null && candidate.requestFocus(direction)) {\n                return true;\n            }\n\n            parent = (ViewGroup) parent.getParent();\n        }\n\n        return false;\n    }\n\n    private boolean arrowScroll(final int direction) {\n        switch (direction) {\n            case FOCUS_DOWN:\n                if (!canScrollVertically(1)) {\n                    return false;\n                }\n                scrollBy(0, 100);\n                break;\n            case FOCUS_UP:\n                if (!canScrollVertically(-1)) {\n                    return false;\n                }\n                scrollBy(0, -100);\n                break;\n            case FOCUS_LEFT:\n                if (!canScrollHorizontally(-1)) {\n                    return false;\n                }\n                scrollBy(-100, 0);\n                break;\n            case FOCUS_RIGHT:\n                if (!canScrollHorizontally(-1)) {\n                    return false;\n                }\n                scrollBy(100, 0);\n                break;\n            default:\n                return false;\n        }\n\n        return true;\n    }\n\n    private boolean isOutside(final View view) {\n        return findContainingItemView(view) == null;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/NewPipeTextView.java",
    "content": "package org.schabi.newpipe.views;\n\nimport android.content.Context;\nimport android.text.method.MovementMethod;\nimport android.util.AttributeSet;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.appcompat.widget.AppCompatTextView;\n\nimport org.schabi.newpipe.util.NewPipeTextViewHelper;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\n\n/**\n * An {@link AppCompatTextView} which uses {@link ShareUtils#shareText(Context, String, String)}\n * when sharing selected text by using the {@code Share} command of the floating actions.\n *\n * <p>\n * This class allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing\n * text from {@link AppCompatTextView} on EMUI devices and also to keep movement method set when a\n * text change occurs, if the text cannot be selected and text links are clickable.\n * </p>\n */\npublic class NewPipeTextView extends AppCompatTextView {\n\n    public NewPipeTextView(@NonNull final Context context) {\n        super(context);\n    }\n\n    public NewPipeTextView(@NonNull final Context context, @Nullable final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public NewPipeTextView(@NonNull final Context context,\n                           @Nullable final AttributeSet attrs,\n                           final int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    @Override\n    public void setText(final CharSequence text, final BufferType type) {\n        // We need to set again the movement method after a text change because Android resets the\n        // movement method to the default one in the case where the text cannot be selected and\n        // text links are clickable (which is the default case in NewPipe).\n        final MovementMethod movementMethod = this.getMovementMethod();\n        super.setText(text, type);\n        setMovementMethod(movementMethod);\n    }\n\n    @Override\n    public boolean onTextContextMenuItem(final int id) {\n        if (id == android.R.id.shareText) {\n            NewPipeTextViewHelper.shareSelectedTextWithShareUtils(this);\n            return true;\n        }\n        return super.onTextContextMenuItem(id);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/ScrollableTabLayout.java",
    "content": "package org.schabi.newpipe.views;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.View;\n\nimport androidx.annotation.NonNull;\n\nimport com.google.android.material.tabs.TabLayout;\n\n/**\n * A TabLayout that is scrollable when tabs exceed its width.\n * Hides when there are less than 2 tabs.\n */\npublic class ScrollableTabLayout extends TabLayout {\n    private static final String TAG = ScrollableTabLayout.class.getSimpleName();\n\n    private int layoutWidth = 0;\n    private int prevVisibility = View.GONE;\n\n    public ScrollableTabLayout(final Context context) {\n        super(context);\n    }\n\n    public ScrollableTabLayout(final Context context, final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public ScrollableTabLayout(final Context context, final AttributeSet attrs,\n                               final int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    @Override\n    protected void onLayout(final boolean changed, final int l, final int t, final int r,\n                            final int b) {\n        super.onLayout(changed, l, t, r, b);\n\n        remeasureTabs();\n    }\n\n    @Override\n    protected void onSizeChanged(final int w, final int h, final int oldw, final int oldh) {\n        super.onSizeChanged(w, h, oldw, oldh);\n\n        layoutWidth = w;\n    }\n\n    @Override\n    public void addTab(@NonNull final Tab tab, final int position, final boolean setSelected) {\n        super.addTab(tab, position, setSelected);\n\n        hasMultipleTabs();\n\n        // Adding a tab won't decrease total tabs' width so tabMode won't have to change to FIXED\n        if (getTabMode() != MODE_SCROLLABLE) {\n            remeasureTabs();\n        }\n    }\n\n    @Override\n    public void removeTabAt(final int position) {\n        super.removeTabAt(position);\n\n        hasMultipleTabs();\n\n        // Removing a tab won't increase total tabs' width\n        // so tabMode won't have to change to SCROLLABLE\n        if (getTabMode() != MODE_FIXED) {\n            remeasureTabs();\n        }\n    }\n\n    @Override\n    protected void onVisibilityChanged(final View changedView, final int visibility) {\n        super.onVisibilityChanged(changedView, visibility);\n\n        // Check width if some tabs have been added/removed while ScrollableTabLayout was invisible\n        // We don't have to check if it was GONE because then requestLayout() will be called\n        if (changedView == this) {\n            if (prevVisibility == View.INVISIBLE) {\n                remeasureTabs();\n            }\n            prevVisibility = visibility;\n        }\n    }\n\n    private void setMode(final int mode) {\n        if (mode == getTabMode()) {\n            return;\n        }\n\n        setTabMode(mode);\n    }\n\n    /**\n     * Make ScrollableTabLayout not visible if there are less than two tabs.\n     */\n    private void hasMultipleTabs() {\n        if (getTabCount() > 1) {\n            setVisibility(View.VISIBLE);\n        } else {\n            setVisibility(View.GONE);\n        }\n    }\n\n    /**\n     * Calculate minimal width required by tabs and set tabMode accordingly.\n     */\n    private void remeasureTabs() {\n        if (prevVisibility != View.VISIBLE) {\n            return;\n        }\n        if (layoutWidth == 0) {\n            return;\n        }\n\n        final int count = getTabCount();\n        int contentWidth = 0;\n        for (int i = 0; i < count; i++) {\n            final View child = getTabAt(i).view;\n            if (child.getVisibility() == View.VISIBLE) {\n                // Use tab's minimum requested width should actual content be too small\n                contentWidth += Math.max(child.getMinimumWidth(), child.getMeasuredWidth());\n            }\n        }\n\n        if (contentWidth > layoutWidth) {\n            setMode(TabLayout.MODE_SCROLLABLE);\n        } else {\n            setMode(TabLayout.MODE_FIXED);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/SimpleWindowCallback.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2026 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.views\n\nimport android.os.Build\nimport android.view.KeyEvent\nimport android.view.KeyboardShortcutGroup\nimport android.view.Menu\nimport android.view.Window\nimport androidx.annotation.RequiresApi\n\n/**\n * Simple window callback class to allow intercepting key events\n * @see FocusOverlayView.setupOverlay\n */\nopen class SimpleWindowCallback(private val baseCallback: Window.Callback) :\n    Window.Callback by baseCallback {\n\n    override fun dispatchKeyEvent(event: KeyEvent?): Boolean {\n        return baseCallback.dispatchKeyEvent(event)\n    }\n\n    @RequiresApi(Build.VERSION_CODES.O)\n    override fun onPointerCaptureChanged(hasCapture: Boolean) {\n        baseCallback.onPointerCaptureChanged(hasCapture)\n    }\n\n    @RequiresApi(Build.VERSION_CODES.N)\n    override fun onProvideKeyboardShortcuts(\n        data: List<KeyboardShortcutGroup?>?,\n        menu: Menu?,\n        deviceId: Int\n    ) {\n        baseCallback.onProvideKeyboardShortcuts(data, menu, deviceId)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/SuperScrollLayoutManager.java",
    "content": "/*\n * Copyright (C) Eltex ltd 2019 <eltex@eltex-co.ru>\n * SuperScrollLayoutManager.java is part of NewPipe.\n *\n * NewPipe is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * NewPipe is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>.\n */\npackage org.schabi.newpipe.views;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport java.util.ArrayList;\n\npublic final class SuperScrollLayoutManager extends LinearLayoutManager {\n    private final Rect handy = new Rect();\n\n    private final ArrayList<View> focusables = new ArrayList<>();\n\n    public SuperScrollLayoutManager(final Context context) {\n        super(context);\n    }\n\n    @Override\n    public boolean requestChildRectangleOnScreen(@NonNull final RecyclerView parent,\n                                                 @NonNull final View child,\n                                                 @NonNull final Rect rect,\n                                                 final boolean immediate,\n                                                 final boolean focusedChildVisible) {\n        if (!parent.isInTouchMode()) {\n            // only activate when in directional navigation mode (Android TV etc) — fine grained\n            // touch scrolling is better served by nested scroll system\n\n            if (!focusedChildVisible || getFocusedChild() == child) {\n                handy.set(rect);\n\n                parent.offsetDescendantRectToMyCoords(child, handy);\n\n                parent.requestRectangleOnScreen(handy, immediate);\n            }\n        }\n\n        return super.requestChildRectangleOnScreen(parent, child, rect, immediate,\n                focusedChildVisible);\n    }\n\n    @Nullable\n    @Override\n    public View onInterceptFocusSearch(@NonNull final View focused, final int direction) {\n        final View focusedItem = findContainingItemView(focused);\n        if (focusedItem == null) {\n            return super.onInterceptFocusSearch(focused, direction);\n        }\n\n        final int listDirection = getAbsoluteDirection(direction);\n        if (listDirection == 0) {\n            return super.onInterceptFocusSearch(focused, direction);\n        }\n\n        // FocusFinder has an oddity: it considers size of Views more important\n        // than closeness to source View. This means, that big Views far away from current item\n        // are preferred to smaller sub-View of closer item. Setting focusability of closer item\n        // to FOCUS_AFTER_DESCENDANTS does not solve this, because ViewGroup#addFocusables omits\n        // such parent itself from list, if any of children are focusable.\n        // Fortunately we can intercept focus search and implement our own logic, based purely\n        // on position along the LinearLayoutManager axis\n\n        final ViewGroup recycler = (ViewGroup) focusedItem.getParent();\n\n        final int sourcePosition = getPosition(focusedItem);\n        if (sourcePosition == 0 && listDirection < 0) {\n            return super.onInterceptFocusSearch(focused, direction);\n        }\n\n        View preferred = null;\n\n        int distance = Integer.MAX_VALUE;\n\n        focusables.clear();\n\n        recycler.addFocusables(focusables, direction, recycler.isInTouchMode()\n                ? View.FOCUSABLES_TOUCH_MODE\n                : View.FOCUSABLES_ALL);\n\n        try {\n            for (final View view : focusables) {\n                if (view == focused || view == recycler) {\n                    continue;\n                }\n\n                if (view == focusedItem) {\n                    // do not pass focus back to the item View itself - it makes no sense\n                    // (we can still pass focus to it's children however)\n                    continue;\n                }\n\n                final int candidate = getDistance(sourcePosition, view, listDirection);\n                if (candidate < 0) {\n                    continue;\n                }\n\n                if (candidate < distance) {\n                    distance = candidate;\n                    preferred = view;\n                }\n            }\n        } finally {\n            focusables.clear();\n        }\n\n        return preferred;\n    }\n\n    private int getAbsoluteDirection(final int direction) {\n        switch (direction) {\n            default:\n                break;\n            case View.FOCUS_FORWARD:\n                return 1;\n            case View.FOCUS_BACKWARD:\n                return -1;\n        }\n\n        if (getOrientation() == RecyclerView.HORIZONTAL) {\n            switch (direction) {\n                default:\n                    break;\n                case View.FOCUS_LEFT:\n                    return getReverseLayout() ? 1 : -1;\n                case View.FOCUS_RIGHT:\n                    return getReverseLayout() ? -1 : 1;\n            }\n        } else {\n            switch (direction) {\n                default:\n                    break;\n                case View.FOCUS_UP:\n                    return getReverseLayout() ? 1 : -1;\n                case View.FOCUS_DOWN:\n                    return getReverseLayout() ? -1 : 1;\n            }\n        }\n\n        return 0;\n    }\n\n    private int getDistance(final int sourcePosition, final View candidate, final int direction) {\n        final View itemView = findContainingItemView(candidate);\n        if (itemView == null) {\n            return -1;\n        }\n\n        final int position = getPosition(itemView);\n\n        return direction * (position - sourcePosition);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/player/CircleClipTapView.kt",
    "content": "package org.schabi.newpipe.views.player\n\nimport android.content.Context\nimport android.graphics.Canvas\nimport android.graphics.Paint\nimport android.graphics.Path\nimport android.util.AttributeSet\nimport android.view.View\n\nclass CircleClipTapView(context: Context?, attrs: AttributeSet) : View(context, attrs) {\n\n    private var backgroundPaint = Paint()\n\n    private var widthPx = 0\n    private var heightPx = 0\n\n    // Background\n\n    private var shapePath = Path()\n    private var arcSize: Float = 80f\n    private var isLeft = true\n\n    init {\n        requireNotNull(context) { \"Context is null.\" }\n\n        backgroundPaint.apply {\n            style = Paint.Style.FILL\n            isAntiAlias = true\n            color = 0x30000000\n        }\n\n        val dm = context.resources.displayMetrics\n        widthPx = dm.widthPixels\n        heightPx = dm.heightPixels\n\n        updatePathShape()\n    }\n\n    fun updateArcSize(baseView: View) {\n        val newArcSize = baseView.height / 11.4f\n        if (arcSize != newArcSize) {\n            arcSize = newArcSize\n            updatePathShape()\n        }\n    }\n\n    fun updatePosition(newIsLeft: Boolean) {\n        if (isLeft != newIsLeft) {\n            isLeft = newIsLeft\n            updatePathShape()\n        }\n    }\n\n    private fun updatePathShape() {\n        val halfWidth = widthPx * 0.5f\n\n        shapePath.reset()\n\n        val w = if (isLeft) 0f else widthPx.toFloat()\n        val f = if (isLeft) 1 else -1\n\n        shapePath.moveTo(w, 0f)\n        shapePath.lineTo(f * (halfWidth - arcSize) + w, 0f)\n        shapePath.quadTo(\n            f * (halfWidth + arcSize) + w,\n            heightPx.toFloat() / 2,\n            f * (halfWidth - arcSize) + w,\n            heightPx.toFloat()\n        )\n        shapePath.lineTo(w, heightPx.toFloat())\n\n        shapePath.close()\n        invalidate()\n    }\n\n    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {\n        super.onSizeChanged(w, h, oldw, oldh)\n        widthPx = w\n        heightPx = h\n        updatePathShape()\n    }\n\n    override fun onDraw(canvas: Canvas) {\n        super.onDraw(canvas)\n\n        canvas.clipPath(shapePath)\n        canvas.drawPath(shapePath, backgroundPaint)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/player/PlayerFastSeekOverlay.kt",
    "content": "package org.schabi.newpipe.views.player\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.util.Log\nimport android.view.LayoutInflater\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.END\nimport androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.PARENT_ID\nimport androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.START\nimport androidx.constraintlayout.widget.ConstraintSet\nimport org.schabi.newpipe.MainActivity\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.player.gesture.DisplayPortion\nimport org.schabi.newpipe.player.gesture.DoubleTapListener\n\nclass PlayerFastSeekOverlay(context: Context, attrs: AttributeSet?) :\n    ConstraintLayout(context, attrs), DoubleTapListener {\n\n    private var secondsView: SecondsView\n    private var circleClipTapView: CircleClipTapView\n    private var rootConstraintLayout: ConstraintLayout\n\n    private var wasForwarding: Boolean = false\n\n    init {\n        LayoutInflater.from(context).inflate(R.layout.player_fast_seek_overlay, this, true)\n\n        secondsView = findViewById(R.id.seconds_view)\n        circleClipTapView = findViewById(R.id.circle_clip_tap_view)\n        rootConstraintLayout = findViewById(R.id.root_constraint_layout)\n\n        addOnLayoutChangeListener { view, _, _, _, _, _, _, _, _ ->\n            circleClipTapView.updateArcSize(view)\n        }\n    }\n\n    private var performListener: PerformListener? = null\n\n    fun performListener(listener: PerformListener?) = apply {\n        performListener = listener\n    }\n\n    private var seekSecondsSupplier: () -> Int = { 0 }\n\n    fun seekSecondsSupplier(supplier: (() -> Int)?) = apply {\n        seekSecondsSupplier = supplier ?: { 0 }\n    }\n\n    // Indicates whether this (double) tap is the first of a series\n    // Decides whether to call performListener.onAnimationStart or not\n    private var initTap: Boolean = false\n\n    override fun onDoubleTapStarted(portion: DisplayPortion) {\n        if (DEBUG) {\n            Log.d(TAG, \"onDoubleTapStarted called with portion = [$portion]\")\n        }\n\n        initTap = false\n\n        secondsView.stopAnimation()\n    }\n\n    override fun onDoubleTapProgressDown(portion: DisplayPortion) {\n        val shouldForward: Boolean =\n            performListener?.getFastSeekDirection(portion)?.directionAsBoolean ?: return\n\n        if (DEBUG) {\n            Log.d(\n                TAG,\n                \"onDoubleTapProgressDown called with \" +\n                    \"shouldForward = [$shouldForward], \" +\n                    \"wasForwarding = [$wasForwarding], \" +\n                    \"initTap = [$initTap], \"\n            )\n        }\n\n        /*\n         * Check if a initial tap occurred or if direction was switched\n         */\n        if (!initTap || wasForwarding != shouldForward) {\n            // Reset seconds and update position\n            secondsView.seconds = 0\n            changeConstraints(shouldForward)\n            circleClipTapView.updatePosition(!shouldForward)\n            secondsView.setForwarding(shouldForward)\n\n            wasForwarding = shouldForward\n\n            if (!initTap) {\n                initTap = true\n            }\n        }\n\n        performListener?.onDoubleTap()\n\n        secondsView.seconds += seekSecondsSupplier.invoke()\n        performListener?.seek(forward = shouldForward)\n    }\n\n    override fun onDoubleTapFinished() {\n        if (DEBUG) {\n            Log.d(TAG, \"onDoubleTapFinished called with initTap = [$initTap]\")\n        }\n\n        if (initTap) performListener?.onDoubleTapEnd()\n        initTap = false\n\n        secondsView.stopAnimation()\n    }\n\n    private fun changeConstraints(forward: Boolean) {\n        val constraintSet = ConstraintSet()\n        with(constraintSet) {\n            clone(rootConstraintLayout)\n            clear(secondsView.id, if (forward) START else END)\n            connect(\n                secondsView.id,\n                if (forward) END else START,\n                PARENT_ID,\n                if (forward) END else START\n            )\n            secondsView.startAnimation()\n            applyTo(rootConstraintLayout)\n        }\n    }\n\n    interface PerformListener {\n        fun onDoubleTap()\n        fun onDoubleTapEnd()\n\n        /**\n         * Determines if the playback should forward/rewind or do nothing.\n         */\n        fun getFastSeekDirection(portion: DisplayPortion): FastSeekDirection\n        fun seek(forward: Boolean)\n\n        enum class FastSeekDirection(val directionAsBoolean: Boolean?) {\n            NONE(null),\n            FORWARD(true),\n            BACKWARD(false)\n        }\n    }\n\n    companion object {\n        private const val TAG = \"PlayerFastSeekOverlay\"\n        private val DEBUG = MainActivity.DEBUG\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/org/schabi/newpipe/views/player/SecondsView.kt",
    "content": "package org.schabi.newpipe.views.player\n\nimport android.animation.ValueAnimator\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.LayoutInflater\nimport android.widget.LinearLayout\nimport androidx.core.animation.addListener\nimport org.schabi.newpipe.R\nimport org.schabi.newpipe.databinding.PlayerFastSeekSecondsViewBinding\nimport org.schabi.newpipe.util.DeviceUtils\n\nclass SecondsView(context: Context, attrs: AttributeSet?) : LinearLayout(context, attrs) {\n\n    companion object {\n        const val ICON_ANIMATION_DURATION = 750L\n    }\n\n    var cycleDuration: Long = ICON_ANIMATION_DURATION\n        set(value) {\n            firstAnimator.duration = value / 5\n            secondAnimator.duration = value / 5\n            thirdAnimator.duration = value / 5\n            fourthAnimator.duration = value / 5\n            fifthAnimator.duration = value / 5\n            field = value\n        }\n\n    var seconds: Int = 0\n        set(value) {\n            binding.tvSeconds.text = context.resources.getQuantityString(\n                R.plurals.seconds,\n                value,\n                value\n            )\n            field = value\n        }\n\n    // Done as a field so that we don't have to compute on each tab if animations are enabled\n    private val animationsEnabled = DeviceUtils.hasAnimationsAnimatorDurationEnabled(context)\n\n    val binding = PlayerFastSeekSecondsViewBinding.inflate(LayoutInflater.from(context), this)\n\n    init {\n        orientation = VERTICAL\n        layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)\n    }\n\n    fun setForwarding(isForward: Boolean) {\n        binding.triangleContainer.rotation = if (isForward) 0f else 180f\n    }\n\n    fun startAnimation() {\n        stopAnimation()\n\n        if (animationsEnabled) {\n            firstAnimator.start()\n        } else {\n            // If no animations are enable show the arrow(s) without animation\n            showWithoutAnimation()\n        }\n    }\n\n    fun stopAnimation() {\n        firstAnimator.cancel()\n        secondAnimator.cancel()\n        thirdAnimator.cancel()\n        fourthAnimator.cancel()\n        fifthAnimator.cancel()\n\n        reset()\n    }\n\n    private fun reset() {\n        binding.icon1.alpha = 0f\n        binding.icon2.alpha = 0f\n        binding.icon3.alpha = 0f\n    }\n\n    private fun showWithoutAnimation() {\n        binding.icon1.alpha = 1f\n        binding.icon2.alpha = 1f\n        binding.icon3.alpha = 1f\n    }\n\n    private val firstAnimator: ValueAnimator = CustomValueAnimator(\n        {\n            binding.icon1.alpha = 0f\n            binding.icon2.alpha = 0f\n            binding.icon3.alpha = 0f\n        },\n        {\n            binding.icon1.alpha = it\n        },\n        {\n            secondAnimator.start()\n        }\n    )\n\n    private val secondAnimator: ValueAnimator = CustomValueAnimator(\n        {\n            binding.icon1.alpha = 1f\n            binding.icon2.alpha = 0f\n            binding.icon3.alpha = 0f\n        },\n        {\n            binding.icon2.alpha = it\n        },\n        {\n            thirdAnimator.start()\n        }\n    )\n\n    private val thirdAnimator: ValueAnimator = CustomValueAnimator(\n        {\n            binding.icon1.alpha = 1f\n            binding.icon2.alpha = 1f\n            binding.icon3.alpha = 0f\n        },\n        {\n            binding.icon1.alpha = 1f - binding.icon3.alpha\n            binding.icon3.alpha = it\n        },\n        {\n            fourthAnimator.start()\n        }\n    )\n\n    private val fourthAnimator: ValueAnimator = CustomValueAnimator(\n        {\n            binding.icon1.alpha = 0f\n            binding.icon2.alpha = 1f\n            binding.icon3.alpha = 1f\n        },\n        {\n            binding.icon2.alpha = 1f - it\n        },\n        {\n            fifthAnimator.start()\n        }\n    )\n\n    private val fifthAnimator: ValueAnimator = CustomValueAnimator(\n        {\n            binding.icon1.alpha = 0f\n            binding.icon2.alpha = 0f\n            binding.icon3.alpha = 1f\n        },\n        {\n            binding.icon3.alpha = 1f - it\n        },\n        {\n            firstAnimator.start()\n        }\n    )\n\n    private inner class CustomValueAnimator(\n        start: () -> Unit,\n        update: (value: Float) -> Unit,\n        end: () -> Unit\n    ) : ValueAnimator() {\n\n        init {\n            duration = cycleDuration / 5\n            setFloatValues(0f, 1f)\n\n            addUpdateListener { update(it.animatedValue as Float) }\n            addListener(\n                onStart = { start() },\n                onEnd = { end() }\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/get/DownloadInitializer.java",
    "content": "package us.shandian.giga.get;\n\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.IOException;\nimport java.io.InterruptedIOException;\nimport java.net.HttpURLConnection;\nimport java.nio.channels.ClosedByInterruptException;\n\nimport us.shandian.giga.util.Utility;\n\nimport static org.schabi.newpipe.BuildConfig.DEBUG;\nimport static us.shandian.giga.get.DownloadMission.ERROR_HTTP_FORBIDDEN;\n\npublic class DownloadInitializer extends Thread {\n    private static final String TAG = \"DownloadInitializer\";\n    static final int mId = 0;\n    private static final int RESERVE_SPACE_DEFAULT = 5 * 1024 * 1024;// 5 MiB\n    private static final int RESERVE_SPACE_MAXIMUM = 150 * 1024 * 1024;// 150 MiB\n\n    private final DownloadMission mMission;\n    private HttpURLConnection mConn;\n\n    DownloadInitializer(@NonNull DownloadMission mission) {\n        mMission = mission;\n        mConn = null;\n    }\n\n    private void dispose() {\n        try {\n            mConn.getInputStream().close();\n        } catch (Exception e) {\n            // nothing to do\n        }\n    }\n\n    @Override\n    public void run() {\n        if (mMission.current > 0) mMission.resetState(false, true, DownloadMission.ERROR_NOTHING);\n\n        int retryCount = 0;\n        int httpCode = 204;\n\n        while (true) {\n            try {\n                if (mMission.blocks == null && mMission.current == 0) {\n                    // calculate the whole size of the mission\n                    long finalLength = 0;\n                    long lowestSize = Long.MAX_VALUE;\n\n                    for (int i = 0; i < mMission.urls.length && mMission.running; i++) {\n                        mConn = mMission.openConnection(mMission.urls[i], true, 0, 0);\n                        mMission.establishConnection(mId, mConn);\n                        dispose();\n\n                        if (Thread.interrupted()) return;\n                        long length = Utility.getTotalContentLength(mConn);\n\n                        if (i == 0) {\n                            httpCode = mConn.getResponseCode();\n                            mMission.length = length;\n                        }\n\n                        if (length > 0) finalLength += length;\n                        if (length < lowestSize) lowestSize = length;\n                    }\n\n                    mMission.nearLength = finalLength;\n\n                    // reserve space at the start of the file\n                    if (mMission.psAlgorithm != null && mMission.psAlgorithm.reserveSpace) {\n                        if (lowestSize < 1) {\n                            // the length is unknown use the default size\n                            mMission.offsets[0] = RESERVE_SPACE_DEFAULT;\n                        } else {\n                            // use the smallest resource size to download, otherwise, use the maximum\n                            mMission.offsets[0] = lowestSize < RESERVE_SPACE_MAXIMUM ? lowestSize : RESERVE_SPACE_MAXIMUM;\n                        }\n                    }\n                } else {\n                    // ask for the current resource length\n                    mConn = mMission.openConnection(true, 0, 0);\n                    mMission.establishConnection(mId, mConn);\n                    dispose();\n\n                    if (!mMission.running || Thread.interrupted()) return;\n\n                    httpCode = mConn.getResponseCode();\n                    mMission.length = Utility.getTotalContentLength(mConn);\n                }\n\n                if (mMission.length == 0 || httpCode == 204) {\n                    mMission.notifyError(DownloadMission.ERROR_HTTP_NO_CONTENT, null);\n                    return;\n                }\n\n                // check for dynamic generated content\n                if (mMission.length == -1 && mConn.getResponseCode() == 200) {\n                    mMission.blocks = new int[0];\n                    mMission.length = 0;\n                    mMission.unknownLength = true;\n\n                    if (DEBUG) {\n                        Log.d(TAG, \"falling back (unknown length)\");\n                    }\n                } else {\n                    // Open again\n                    mConn = mMission.openConnection(true, mMission.length - 10, mMission.length);\n                    mMission.establishConnection(mId, mConn);\n                    dispose();\n\n                    if (!mMission.running || Thread.interrupted()) return;\n\n                    synchronized (mMission.LOCK) {\n                        if (mConn.getResponseCode() == 206) {\n\n                            if (mMission.threadCount > 1) {\n                                int count = (int) (mMission.length / DownloadMission.BLOCK_SIZE);\n                                if ((count * DownloadMission.BLOCK_SIZE) < mMission.length) count++;\n\n                                mMission.blocks = new int[count];\n                            } else {\n                                // if one thread is required don't calculate blocks, is useless\n                                mMission.blocks = new int[0];\n                                mMission.unknownLength = false;\n                            }\n\n                            if (DEBUG) {\n                                Log.d(TAG, \"http response code = \" + mConn.getResponseCode());\n                            }\n                        } else {\n                            // Fallback to single thread\n                            mMission.blocks = new int[0];\n                            mMission.unknownLength = false;\n\n                            if (DEBUG) {\n                                Log.d(TAG, \"falling back due http response code = \" + mConn.getResponseCode());\n                            }\n                        }\n                    }\n\n                    if (!mMission.running || Thread.interrupted()) return;\n                }\n\n                try (SharpStream fs = mMission.storage.getStream()) {\n                    fs.setLength(mMission.offsets[mMission.current] + mMission.length);\n                    fs.seek(mMission.offsets[mMission.current]);\n                }\n\n                if (!mMission.running || Thread.interrupted()) return;\n\n                if (!mMission.unknownLength && mMission.recoveryInfo != null) {\n                    String entityTag = mConn.getHeaderField(\"ETAG\");\n                    String lastModified = mConn.getHeaderField(\"Last-Modified\");\n                    MissionRecoveryInfo recovery = mMission.recoveryInfo[mMission.current];\n\n                    if (!TextUtils.isEmpty(entityTag)) {\n                        recovery.setValidateCondition(entityTag);\n                    } else if (!TextUtils.isEmpty(lastModified)) {\n                        recovery.setValidateCondition(lastModified);// Note: this is less precise\n                    } else {\n                        recovery.setValidateCondition(null);\n                    }\n                }\n\n                mMission.running = false;\n                break;\n            } catch (InterruptedIOException | ClosedByInterruptException e) {\n                return;\n            } catch (Exception e) {\n                if (!mMission.running || super.isInterrupted()) return;\n\n                if (e instanceof DownloadMission.HttpError && ((DownloadMission.HttpError) e).statusCode == ERROR_HTTP_FORBIDDEN) {\n                    // for youtube streams. The url has expired\n                    interrupt();\n                    mMission.doRecover(ERROR_HTTP_FORBIDDEN);\n                    return;\n                }\n\n                if (e instanceof IOException && e.getMessage().contains(\"Permission denied\")) {\n                    mMission.notifyError(DownloadMission.ERROR_PERMISSION_DENIED, e);\n                    return;\n                }\n\n                if (retryCount++ > mMission.maxRetry) {\n                    Log.e(TAG, \"initializer failed\", e);\n                    mMission.notifyError(e);\n                    return;\n                }\n\n                Log.e(TAG, \"initializer failed, retrying\", e);\n            }\n        }\n\n        mMission.start();\n    }\n\n    @Override\n    public void interrupt() {\n        super.interrupt();\n        if (mConn != null) dispose();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/get/DownloadMission.java",
    "content": "package us.shandian.giga.get;\n\nimport android.os.Handler;\nimport android.system.ErrnoException;\nimport android.system.OsConstants;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport org.schabi.newpipe.DownloaderImpl;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.InterruptedIOException;\nimport java.io.Serializable;\nimport java.net.ConnectException;\nimport java.net.HttpURLConnection;\nimport java.net.SocketTimeoutException;\nimport java.net.URL;\nimport java.net.UnknownHostException;\nimport java.nio.channels.ClosedByInterruptException;\nimport java.util.Objects;\n\nimport javax.net.ssl.SSLException;\n\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\nimport us.shandian.giga.postprocessing.Postprocessing;\nimport us.shandian.giga.service.DownloadManagerService;\nimport us.shandian.giga.util.Utility;\n\nimport static org.schabi.newpipe.BuildConfig.DEBUG;\n\npublic class DownloadMission extends Mission {\n    private static final long serialVersionUID = 6L;// last bump: 07 october 2019\n\n    static final int BUFFER_SIZE = 64 * 1024;\n    static final int BLOCK_SIZE = 512 * 1024;\n\n    private static final String TAG = \"DownloadMission\";\n\n    public static final int ERROR_NOTHING = -1;\n    public static final int ERROR_PATH_CREATION = 1000;\n    public static final int ERROR_FILE_CREATION = 1001;\n    public static final int ERROR_UNKNOWN_EXCEPTION = 1002;\n    public static final int ERROR_PERMISSION_DENIED = 1003;\n    public static final int ERROR_SSL_EXCEPTION = 1004;\n    public static final int ERROR_UNKNOWN_HOST = 1005;\n    public static final int ERROR_CONNECT_HOST = 1006;\n    public static final int ERROR_POSTPROCESSING = 1007;\n    public static final int ERROR_POSTPROCESSING_STOPPED = 1008;\n    public static final int ERROR_POSTPROCESSING_HOLD = 1009;\n    public static final int ERROR_INSUFFICIENT_STORAGE = 1010;\n    public static final int ERROR_PROGRESS_LOST = 1011;\n    public static final int ERROR_TIMEOUT = 1012;\n    public static final int ERROR_RESOURCE_GONE = 1013;\n    public static final int ERROR_HTTP_NO_CONTENT = 204;\n    static final int ERROR_HTTP_FORBIDDEN = 403;\n\n    /**\n     * The urls of the file to download\n     */\n    public String[] urls;\n\n    /**\n     * Number of bytes downloaded and written\n     */\n    public volatile long done;\n\n    /**\n     * Indicates a file generated dynamically on the web server\n     */\n    public boolean unknownLength;\n\n    /**\n     * offset in the file where the data should be written\n     */\n    public long[] offsets;\n\n    /**\n     * Indicates if the post-processing state:\n     * 0: ready\n     * 1: running\n     * 2: completed\n     * 3: hold\n     */\n    public volatile int psState;\n\n    /**\n     * the post-processing algorithm instance\n     */\n    public Postprocessing psAlgorithm;\n\n    /**\n     * The current resource to download, {@code urls[current]} and {@code offsets[current]}\n     */\n    public int current;\n\n    /**\n     * Metadata where the mission state is saved\n     */\n    public transient File metadata;\n\n    /**\n     * maximum attempts\n     */\n    public transient int maxRetry;\n\n    /**\n     * Approximated final length, this represent the sum of all resources sizes\n     */\n    public long nearLength;\n\n    /**\n     * Download blocks, the size is multiple of {@link DownloadMission#BLOCK_SIZE}.\n     * Every entry (block) in this array holds an offset, used to resume the download.\n     * An block offset can be -1 if the block was downloaded successfully.\n     */\n    int[] blocks;\n\n    /**\n     * Download/File resume offset in fallback mode (if applicable) {@link DownloadRunnableFallback}\n     */\n    volatile long fallbackResumeOffset;\n\n    /**\n     * Maximum of download threads running, chosen by the user\n     */\n    public int threadCount = 3;\n\n    /**\n     * information required to recover a download\n     */\n    public MissionRecoveryInfo[] recoveryInfo;\n\n    private transient int finishCount;\n    public transient volatile boolean running;\n    public boolean enqueued;\n\n    public int errCode = ERROR_NOTHING;\n    public Exception errObject = null;\n\n    public transient Handler mHandler;\n    private transient boolean[] blockAcquired;\n\n    private transient long writingToFileNext;\n    private transient volatile boolean writingToFile;\n\n    final Object LOCK = new Lock();\n\n    @NonNull\n    public transient Thread[] threads = new Thread[0];\n    public transient Thread init = null;\n\n    public DownloadMission(String[] urls, StoredFileHelper storage, char kind, Postprocessing psInstance) {\n        if (Objects.requireNonNull(urls).length < 1)\n            throw new IllegalArgumentException(\"urls array is empty\");\n        this.urls = urls;\n        this.kind = kind;\n        this.offsets = new long[urls.length];\n        this.enqueued = true;\n        this.maxRetry = 3;\n        this.storage = storage;\n        this.psAlgorithm = psInstance;\n\n        if (DEBUG && psInstance == null && urls.length > 1) {\n            Log.w(TAG, \"mission created with multiple urls ¿missing post-processing algorithm?\");\n        }\n    }\n\n    /**\n     * Acquire a block\n     *\n     * @return the block or {@code null} if no more blocks left\n     */\n    @Nullable\n    Block acquireBlock() {\n        synchronized (LOCK) {\n            for (int i = 0; i < blockAcquired.length; i++) {\n                if (!blockAcquired[i] && blocks[i] >= 0) {\n                    Block block = new Block();\n                    block.position = i;\n                    block.done = blocks[i];\n\n                    blockAcquired[i] = true;\n                    return block;\n                }\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Release an block\n     *\n     * @param position the index of the block\n     * @param done     amount of bytes downloaded\n     */\n    void releaseBlock(int position, int done) {\n        synchronized (LOCK) {\n            blockAcquired[position] = false;\n            blocks[position] = done;\n        }\n    }\n\n    /**\n     * Opens a connection\n     *\n     * @param headRequest {@code true} for use {@code HEAD} request method, otherwise, {@code GET} is used\n     * @param rangeStart  range start\n     * @param rangeEnd    range end\n     * @return a {@link java.net.URLConnection URLConnection} linking to the URL.\n     * @throws IOException if an I/O exception occurs.\n     */\n    HttpURLConnection openConnection(boolean headRequest, long rangeStart, long rangeEnd) throws IOException {\n        return openConnection(urls[current], headRequest, rangeStart, rangeEnd);\n    }\n\n    HttpURLConnection openConnection(String url, boolean headRequest, long rangeStart, long rangeEnd) throws IOException {\n        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();\n        conn.setInstanceFollowRedirects(true);\n        conn.setRequestProperty(\"User-Agent\", DownloaderImpl.USER_AGENT);\n        conn.setRequestProperty(\"Accept\", \"*/*\");\n        conn.setRequestProperty(\"Accept-Encoding\", \"*\");\n\n        if (headRequest) conn.setRequestMethod(\"HEAD\");\n\n        // BUG workaround: switching between networks can freeze the download forever\n        conn.setConnectTimeout(30000);\n\n        if (rangeStart >= 0) {\n            String req = \"bytes=\" + rangeStart + \"-\";\n            if (rangeEnd > 0) req += rangeEnd;\n\n            conn.setRequestProperty(\"Range\", req);\n        }\n\n        return conn;\n    }\n\n    /**\n     * @param threadId id of the calling thread\n     * @param conn     Opens and establish the communication\n     * @throws IOException if an error occurred connecting to the server.\n     * @throws HttpError   if the HTTP Status-Code is not satisfiable\n     */\n    void establishConnection(int threadId, HttpURLConnection conn) throws IOException, HttpError {\n        int statusCode = conn.getResponseCode();\n\n        if (DEBUG) {\n            Log.d(TAG, threadId + \":[request]  Range=\" + conn.getRequestProperty(\"Range\"));\n            Log.d(TAG, threadId + \":[response] Code=\" + statusCode);\n            Log.d(TAG, threadId + \":[response] Content-Length=\" + conn.getContentLength());\n            Log.d(TAG, threadId + \":[response] Content-Range=\" + conn.getHeaderField(\"Content-Range\"));\n        }\n\n\n        switch (statusCode) {\n            case 204:\n            case 205:\n            case 207:\n                throw new HttpError(statusCode);\n            case 416:\n                return;// let the download thread handle this error\n            default:\n                if (statusCode < 200 || statusCode > 299) {\n                    throw new HttpError(statusCode);\n                }\n        }\n\n    }\n\n\n    private void notify(int what) {\n        mHandler.obtainMessage(what, this).sendToTarget();\n    }\n\n    synchronized void notifyProgress(long deltaLen) {\n        if (unknownLength) {\n            length += deltaLen;// Update length before proceeding\n        }\n\n        done += deltaLen;\n\n        if (metadata == null) return;\n\n        if (!writingToFile && (done > writingToFileNext || deltaLen < 0)) {\n            writingToFile = true;\n            writingToFileNext = done + BLOCK_SIZE;\n            writeThisToFileAsync();\n        }\n    }\n\n    synchronized void notifyError(Exception err) {\n        Log.e(TAG, \"notifyError()\", err);\n\n        if (err instanceof FileNotFoundException) {\n            notifyError(ERROR_FILE_CREATION, null);\n        } else if (err instanceof SSLException) {\n            notifyError(ERROR_SSL_EXCEPTION, null);\n        } else if (err instanceof HttpError) {\n            notifyError(((HttpError) err).statusCode, null);\n        } else if (err instanceof ConnectException) {\n            notifyError(ERROR_CONNECT_HOST, null);\n        } else if (err instanceof UnknownHostException) {\n            notifyError(ERROR_UNKNOWN_HOST, null);\n        } else if (err instanceof SocketTimeoutException) {\n            notifyError(ERROR_TIMEOUT, null);\n        } else {\n            notifyError(ERROR_UNKNOWN_EXCEPTION, err);\n        }\n    }\n\n    public synchronized void notifyError(int code, Exception err) {\n        Log.e(TAG, \"notifyError() code = \" + code, err);\n        if (err != null && err.getCause() instanceof ErrnoException) {\n            int errno = ((ErrnoException) err.getCause()).errno;\n            if (errno == OsConstants.ENOSPC) {\n                code = ERROR_INSUFFICIENT_STORAGE;\n                err = null;\n            } else if (errno == OsConstants.EACCES) {\n                code = ERROR_PERMISSION_DENIED;\n                err = null;\n            }\n        }\n\n        if (err instanceof IOException) {\n            if (err.getMessage().contains(\"Permission denied\")) {\n                code = ERROR_PERMISSION_DENIED;\n                err = null;\n            } else if (err.getMessage().contains(\"ENOSPC\")) {\n                code = ERROR_INSUFFICIENT_STORAGE;\n                err = null;\n            } else if (!storage.canWrite()) {\n                code = ERROR_FILE_CREATION;\n                err = null;\n            }\n        }\n\n        errCode = code;\n        errObject = err;\n\n        switch (code) {\n            case ERROR_SSL_EXCEPTION:\n            case ERROR_UNKNOWN_HOST:\n            case ERROR_CONNECT_HOST:\n            case ERROR_TIMEOUT:\n                // do not change the queue flag for network errors, can be\n                // recovered silently without the user interaction\n                break;\n            default:\n                // also checks for server errors\n                if (code < 500 || code > 599) enqueued = false;\n        }\n\n        notify(DownloadManagerService.MESSAGE_ERROR);\n\n        if (running) pauseThreads();\n    }\n\n    synchronized void notifyFinished() {\n        if (current < urls.length) {\n            if (++finishCount < threads.length) return;\n\n            if (DEBUG) {\n                Log.d(TAG, \"onFinish: downloaded \" + (current + 1) + \"/\" + urls.length);\n            }\n\n            current++;\n            if (current < urls.length) {\n                // prepare next sub-mission\n                offsets[current] = offsets[current - 1] + length;\n                initializer();\n                return;\n            }\n        }\n\n        if (psAlgorithm != null && psState == 0) {\n            threads = new Thread[]{\n                    runAsync(1, this::doPostprocessing)\n            };\n            return;\n        }\n\n\n        // this mission is fully finished\n\n        unknownLength = false;\n        enqueued = false;\n        running = false;\n\n        deleteThisFromFile();\n        notify(DownloadManagerService.MESSAGE_FINISHED);\n    }\n\n    private void notifyPostProcessing(int state) {\n        String action;\n        switch (state) {\n            case 1:\n                action = \"Running\";\n                break;\n            case 2:\n                action = \"Completed\";\n                break;\n            default:\n                action = \"Failed\";\n        }\n\n        Log.d(TAG, action + \" postprocessing on \" + storage.getName());\n\n        if (state == 2) {\n            psState = state;\n            return;\n        }\n\n        synchronized (LOCK) {\n            // don't return without fully write the current state\n            psState = state;\n            writeThisToFile();\n        }\n    }\n\n\n    /**\n     * Start downloading with multiple threads.\n     */\n    public void start() {\n        if (running || isFinished() || urls.length < 1) return;\n\n        // ensure that the previous state is completely paused.\n        joinForThreads(10000);\n\n        running = true;\n        errCode = ERROR_NOTHING;\n\n        if (hasInvalidStorage()) {\n            notifyError(ERROR_FILE_CREATION, null);\n            return;\n        }\n\n        if (current >= urls.length) {\n            notifyFinished();\n            return;\n        }\n\n        notify(DownloadManagerService.MESSAGE_RUNNING);\n\n        if (urls[current] == null) {\n            doRecover(ERROR_RESOURCE_GONE);\n            return;\n        }\n\n        if (blocks == null) {\n            initializer();\n            return;\n        }\n\n        init = null;\n        finishCount = 0;\n        blockAcquired = new boolean[blocks.length];\n\n        if (blocks.length < 1) {\n            threads = new Thread[]{runAsync(1, new DownloadRunnableFallback(this))};\n        } else {\n            int remainingBlocks = 0;\n            for (int block : blocks) if (block >= 0) remainingBlocks++;\n\n            if (remainingBlocks < 1) {\n                notifyFinished();\n                return;\n            }\n\n            threads = new Thread[Math.min(threadCount, remainingBlocks)];\n\n            for (int i = 0; i < threads.length; i++) {\n                threads[i] = runAsync(i + 1, new DownloadRunnable(this, i));\n            }\n        }\n    }\n\n    /**\n     * Pause the mission\n     */\n    public void pause() {\n        if (!running) return;\n\n        if (isPsRunning()) {\n            if (DEBUG) {\n                Log.w(TAG, \"pause during post-processing is not applicable.\");\n            }\n            return;\n        }\n\n        running = false;\n        notify(DownloadManagerService.MESSAGE_PAUSED);\n\n        if (init != null && init.isAlive()) {\n            // NOTE: if start() method is running ¡will no have effect!\n            init.interrupt();\n            synchronized (LOCK) {\n                resetState(false, true, ERROR_NOTHING);\n            }\n            return;\n        }\n\n        if (DEBUG && unknownLength) {\n            Log.w(TAG, \"pausing a download that can not be resumed (range requests not allowed by the server).\");\n        }\n\n        init = null;\n        pauseThreads();\n    }\n\n    private void pauseThreads() {\n        running = false;\n        joinForThreads(-1);\n        writeThisToFile();\n    }\n\n    /**\n     * Removes the downloaded file and the meta file\n     */\n    @Override\n    public boolean delete() {\n        if (psAlgorithm != null) psAlgorithm.cleanupTemporalDir();\n\n        notify(DownloadManagerService.MESSAGE_DELETED);\n\n        boolean res = deleteThisFromFile();\n\n        if (!super.delete()) return false;\n        return res;\n    }\n\n\n    /**\n     * Resets the mission state\n     *\n     * @param rollback       {@code true} true to forget all progress, otherwise, {@code false}\n     * @param persistChanges {@code true} to commit changes to the metadata file, otherwise, {@code false}\n     */\n    public void resetState(boolean rollback, boolean persistChanges, int errorCode) {\n        length = 0;\n        errCode = errorCode;\n        errObject = null;\n        unknownLength = false;\n        threads = new Thread[0];\n        fallbackResumeOffset = 0;\n        blocks = null;\n        blockAcquired = null;\n\n        if (rollback) current = 0;\n        if (persistChanges) writeThisToFile();\n    }\n\n    private void initializer() {\n        init = runAsync(DownloadInitializer.mId, new DownloadInitializer(this));\n    }\n\n    private void writeThisToFileAsync() {\n        runAsync(-2, this::writeThisToFile);\n    }\n\n    /**\n     * Write this {@link DownloadMission} to the meta file asynchronously\n     * if no thread is already running.\n     */\n    void writeThisToFile() {\n        synchronized (LOCK) {\n            if (metadata == null) return;\n            Utility.writeToFile(metadata, this);\n            writingToFile = false;\n        }\n    }\n\n    /**\n     * Indicates if the download if fully finished\n     *\n     * @return true, otherwise, false\n     */\n    public boolean isFinished() {\n        return current >= urls.length && (psAlgorithm == null || psState == 2);\n    }\n\n    /**\n     * Indicates if the download file is corrupt due a failed post-processing\n     *\n     * @return {@code true} if this mission is unrecoverable\n     */\n    public boolean isPsFailed() {\n        switch (errCode) {\n            case ERROR_POSTPROCESSING:\n            case ERROR_POSTPROCESSING_STOPPED:\n                return psAlgorithm.worksOnSameFile;\n        }\n\n        return false;\n    }\n\n    /**\n     * Indicates if a post-processing algorithm is running\n     *\n     * @return true, otherwise, false\n     */\n    public boolean isPsRunning() {\n        return psAlgorithm != null && (psState == 1 || psState == 3);\n    }\n\n    /**\n     * Indicated if the mission is ready\n     *\n     * @return true, otherwise, false\n     */\n    public boolean isInitialized() {\n        return blocks != null; // DownloadMissionInitializer was executed\n    }\n\n    /**\n     * Gets the approximated final length of the file\n     *\n     * @return the length in bytes\n     */\n    public long getLength() {\n        long calculated;\n        if (psState == 1 || psState == 3) {\n            return length;\n        }\n\n        calculated = offsets[current < offsets.length ? current : (offsets.length - 1)] + length;\n        calculated -= offsets[0];// don't count reserved space\n\n        return Math.max(calculated, nearLength);\n    }\n\n    /**\n     * set this mission state on the queue\n     *\n     * @param queue true to add to the queue, otherwise, false\n     */\n    public void setEnqueued(boolean queue) {\n        enqueued = queue;\n        writeThisToFileAsync();\n    }\n\n    /**\n     * Attempts to continue a blocked post-processing\n     *\n     * @param recover {@code true} to retry, otherwise, {@code false} to cancel\n     */\n    public void psContinue(boolean recover) {\n        psState = 1;\n        errCode = recover ? ERROR_NOTHING : ERROR_POSTPROCESSING;\n        threads[0].interrupt();\n    }\n\n    /**\n     * Indicates whatever the backed storage is invalid\n     *\n     * @return {@code true}, if storage is invalid and cannot be used\n     */\n    public boolean hasInvalidStorage() {\n        // Don't consider ERROR_PROGRESS_LOST as invalid storage - it can be recovered\n        return storage == null || !storage.existsAsFile();\n    }\n\n    /**\n     * Indicates whatever is possible to start the mission\n     *\n     * @return {@code true} is this mission its \"healthy\", otherwise, {@code false}\n     */\n    public boolean isCorrupt() {\n        if (urls.length < 1) return false;\n        return (isPsFailed() || errCode == ERROR_POSTPROCESSING_HOLD) || isFinished();\n    }\n\n    /**\n     * Indicates if mission urls has expired and there an attempt to renovate them\n     *\n     * @return {@code true} if the mission is running a recovery procedure, otherwise, {@code false}\n     */\n    public boolean isRecovering() {\n        return threads.length > 0 && threads[0] instanceof DownloadMissionRecover && threads[0].isAlive();\n    }\n\n    private void doPostprocessing() {\n        errCode = ERROR_NOTHING;\n        errObject = null;\n        Thread thread = Thread.currentThread();\n\n        notifyPostProcessing(1);\n\n        if (DEBUG) {\n            thread.setName(\"[\" + TAG + \"]  ps = \" + psAlgorithm + \"  filename = \" + storage.getName());\n        }\n\n        Exception exception = null;\n\n        try {\n            psAlgorithm.run(this);\n        } catch (Exception err) {\n            Log.e(TAG, \"Post-processing failed. \" + psAlgorithm.toString(), err);\n\n            if (err instanceof InterruptedIOException || err instanceof ClosedByInterruptException || thread.isInterrupted()) {\n                notifyError(DownloadMission.ERROR_POSTPROCESSING_STOPPED, null);\n                return;\n            }\n\n            if (errCode == ERROR_NOTHING) errCode = ERROR_POSTPROCESSING;\n\n            exception = err;\n        } finally {\n            notifyPostProcessing(errCode == ERROR_NOTHING ? 2 : 0);\n        }\n\n        if (errCode != ERROR_NOTHING) {\n            if (exception == null) exception = errObject;\n            notifyError(ERROR_POSTPROCESSING, exception);\n            return;\n        }\n\n        notifyFinished();\n    }\n\n    /**\n     * Attempts to recover the download\n     *\n     * @param errorCode error code which trigger the recovery procedure\n     */\n    void doRecover(int errorCode) {\n        Log.i(TAG, \"Attempting to recover the mission: \" + storage.getName());\n\n        if (recoveryInfo == null) {\n            notifyError(errorCode, null);\n            urls = new String[0];// mark this mission as dead\n            return;\n        }\n\n        joinForThreads(0);\n\n        threads = new Thread[]{\n                runAsync(DownloadMissionRecover.mID, new DownloadMissionRecover(this, errorCode))\n        };\n    }\n\n    private boolean deleteThisFromFile() {\n        synchronized (LOCK) {\n            boolean res = metadata.delete();\n            metadata = null;\n            return res;\n        }\n    }\n\n    /**\n     * run a new thread\n     *\n     * @param id  id of new thread (used for debugging only)\n     * @param who the Runnable whose {@code run} method is invoked.\n     */\n    private Thread runAsync(int id, Runnable who) {\n        return runAsync(id, new Thread(who));\n    }\n\n    /**\n     * run a new thread\n     *\n     * @param id  id of new thread (used for debugging only)\n     * @param who the Thread whose {@code run} method is invoked when this thread is started\n     * @return the passed thread\n     */\n    private Thread runAsync(int id, Thread who) {\n        // known thread ids:\n        //   -2:     state saving by  notifyProgress()  method\n        //   -1:     wait for saving the state by  pause()  method\n        //    0:     initializer\n        //  >=1:     any download thread\n\n        if (DEBUG) {\n            who.setName(String.format(\"%s[%s] %s\", TAG, id, storage.getName()));\n        }\n\n        who.start();\n\n        return who;\n    }\n\n    /**\n     * Waits at most {@code millis} milliseconds for the thread to die\n     *\n     * @param millis the time to wait in milliseconds\n     */\n    private void joinForThreads(int millis) {\n        final Thread currentThread = Thread.currentThread();\n\n        if (init != null && init != currentThread && init.isAlive()) {\n            init.interrupt();\n\n            if (millis > 0) {\n                try {\n                    init.join(millis);\n                } catch (InterruptedException e) {\n                    Log.w(TAG, \"Initializer thread is still running\", e);\n                    return;\n                }\n            }\n        }\n\n        // if a thread is still alive, possible reasons:\n        //      slow device\n        //      the user is spamming start/pause buttons\n        //      start() method called quickly after pause()\n\n        for (Thread thread : threads) {\n            if (!thread.isAlive() || thread == Thread.currentThread()) continue;\n            thread.interrupt();\n        }\n\n        try {\n            for (Thread thread : threads) {\n                if (!thread.isAlive()) continue;\n                if (DEBUG) {\n                    Log.w(TAG, \"thread alive: \" + thread.getName());\n                }\n                if (millis > 0) thread.join(millis);\n            }\n        } catch (InterruptedException e) {\n            throw new RuntimeException(\"A download thread is still running\", e);\n        }\n    }\n\n\n    static class HttpError extends Exception {\n        final int statusCode;\n\n        HttpError(int statusCode) {\n            this.statusCode = statusCode;\n        }\n\n        @Override\n        public String getMessage() {\n            return \"HTTP \" + statusCode;\n        }\n    }\n\n    public static class Block {\n        public int position;\n        public int done;\n    }\n\n    private static class Lock implements Serializable {\n        // java.lang.Object cannot be used because is not serializable\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/get/DownloadMissionRecover.java",
    "content": "package us.shandian.giga.get;\n\nimport android.util.Log;\n\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.extractor.StreamingService;\nimport org.schabi.newpipe.extractor.exceptions.ExtractionException;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.DeliveryMethod;\nimport org.schabi.newpipe.extractor.stream.StreamExtractor;\nimport org.schabi.newpipe.extractor.stream.SubtitlesStream;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\n\nimport java.io.IOException;\nimport java.io.InterruptedIOException;\nimport java.net.HttpURLConnection;\nimport java.nio.channels.ClosedByInterruptException;\nimport java.util.List;\n\nimport us.shandian.giga.get.DownloadMission.HttpError;\n\nimport static us.shandian.giga.get.DownloadMission.ERROR_RESOURCE_GONE;\n\npublic class DownloadMissionRecover extends Thread {\n    private static final String TAG = \"DownloadMissionRecover\";\n    static final int mID = -3;\n\n    private final DownloadMission mMission;\n    private final boolean mNotInitialized;\n\n    private final int mErrCode;\n\n    private HttpURLConnection mConn;\n    private MissionRecoveryInfo mRecovery;\n    private StreamExtractor mExtractor;\n\n    DownloadMissionRecover(DownloadMission mission, int errCode) {\n        mMission = mission;\n        mNotInitialized = mission.blocks == null && mission.current == 0;\n        mErrCode = errCode;\n    }\n\n    @Override\n    public void run() {\n        if (mMission.source == null) {\n            mMission.notifyError(mErrCode, null);\n            return;\n        }\n\n        Exception err = null;\n        int attempt = 0;\n\n        while (attempt++ < mMission.maxRetry) {\n            try {\n                tryRecover();\n                return;\n            } catch (InterruptedIOException | ClosedByInterruptException e) {\n                return;\n            } catch (Exception e) {\n                if (!mMission.running || super.isInterrupted()) return;\n                err = e;\n            }\n        }\n\n        // give up\n        mMission.notifyError(mErrCode, err);\n    }\n\n    private void tryRecover() throws ExtractionException, IOException, HttpError {\n        if (mExtractor == null) {\n            try {\n                StreamingService svr = NewPipe.getServiceByUrl(mMission.source);\n                mExtractor = svr.getStreamExtractor(mMission.source);\n                mExtractor.fetchPage();\n            } catch (ExtractionException e) {\n                mExtractor = null;\n                throw e;\n            }\n        }\n\n        // maybe the following check is redundant\n        if (!mMission.running || super.isInterrupted()) return;\n\n        if (!mNotInitialized) {\n            // set the current download url to null in case if the recovery\n            // process is canceled. Next time start() method is called the\n            // recovery will be executed, saving time\n            mMission.urls[mMission.current] = null;\n\n            mRecovery = mMission.recoveryInfo[mMission.current];\n            resolveStream();\n            return;\n        }\n\n        Log.w(TAG, \"mission is not fully initialized, this will take a while\");\n\n        try {\n            for (; mMission.current < mMission.urls.length; mMission.current++) {\n                mRecovery = mMission.recoveryInfo[mMission.current];\n\n                if (test()) continue;\n                if (!mMission.running) return;\n\n                resolveStream();\n                if (!mMission.running) return;\n\n                // before continue, check if the current stream was resolved\n                if (mMission.urls[mMission.current] == null) {\n                    break;\n                }\n            }\n        } finally {\n            mMission.current = 0;\n        }\n\n        mMission.writeThisToFile();\n\n        if (!mMission.running || super.isInterrupted()) return;\n\n        mMission.running = false;\n        mMission.start();\n    }\n\n    private void resolveStream() throws IOException, ExtractionException, HttpError {\n        // FIXME: this getErrorMessage() always returns \"video is unavailable\"\n        /*if (mExtractor.getErrorMessage() != null) {\n            mMission.notifyError(mErrCode, new ExtractionException(mExtractor.getErrorMessage()));\n            return;\n        }*/\n\n        String url = null;\n\n        switch (mRecovery.getKind()) {\n            case 'a':\n                for (final AudioStream audio : mExtractor.getAudioStreams()) {\n                    if (audio.getAverageBitrate() == mRecovery.getDesiredBitrate()\n                            && audio.getFormat() == mRecovery.getFormat()\n                            && audio.getDeliveryMethod() == DeliveryMethod.PROGRESSIVE_HTTP) {\n                        url = audio.getContent();\n                        break;\n                    }\n                }\n                break;\n            case 'v':\n                final List<VideoStream> videoStreams;\n                if (mRecovery.isDesired2())\n                    videoStreams = mExtractor.getVideoOnlyStreams();\n                else\n                    videoStreams = mExtractor.getVideoStreams();\n                for (final VideoStream video : videoStreams) {\n                    if (video.getResolution().equals(mRecovery.getDesired())\n                            && video.getFormat() == mRecovery.getFormat()\n                            && video.getDeliveryMethod() == DeliveryMethod.PROGRESSIVE_HTTP) {\n                        url = video.getContent();\n                        break;\n                    }\n                }\n                break;\n            case 's':\n                for (final SubtitlesStream subtitles : mExtractor.getSubtitles(mRecovery\n                        .getFormat())) {\n                    String tag = subtitles.getLanguageTag();\n                    if (tag.equals(mRecovery.getDesired())\n                            && subtitles.isAutoGenerated() == mRecovery.isDesired2()\n                            && subtitles.getDeliveryMethod() == DeliveryMethod.PROGRESSIVE_HTTP) {\n                        url = subtitles.getContent();\n                        break;\n                    }\n                }\n                break;\n            default:\n                throw new RuntimeException(\"Unknown stream type\");\n        }\n\n        resolve(url);\n    }\n\n    private void resolve(String url) throws IOException, HttpError {\n        if (mRecovery.getValidateCondition() == null) {\n            Log.w(TAG, \"validation condition not defined, the resource can be stale\");\n        }\n\n        if (mMission.unknownLength || mRecovery.getValidateCondition() == null) {\n            recover(url, false);\n            return;\n        }\n\n        ///////////////////////////////////////////////////////////////////////\n        ////// Validate the http resource doing a range request\n        /////////////////////\n        try {\n            mConn = mMission.openConnection(url, true, mMission.length - 10, mMission.length);\n            mConn.setRequestProperty(\"If-Range\", mRecovery.getValidateCondition());\n            mMission.establishConnection(mID, mConn);\n\n            int code = mConn.getResponseCode();\n\n            switch (code) {\n                case 200:\n                case 413:\n                    // stale\n                    recover(url, true);\n                    return;\n                case 206:\n                    // in case of validation using the Last-Modified date, check the resource length\n                    long[] contentRange = parseContentRange(mConn.getHeaderField(\"Content-Range\"));\n                    boolean lengthMismatch = contentRange[2] != -1 && contentRange[2] != mMission.length;\n\n                    recover(url, lengthMismatch);\n                    return;\n            }\n\n            throw new HttpError(code);\n        } finally {\n            disconnect();\n        }\n    }\n\n    private void recover(String url, boolean stale) {\n        Log.i(TAG,\n                String.format(\"recover()  name=%s  isStale=%s  url=%s\", mMission.storage.getName(), stale, url)\n        );\n\n        mMission.urls[mMission.current] = url;\n\n        if (url == null) {\n            mMission.urls = new String[0];\n            mMission.notifyError(ERROR_RESOURCE_GONE, null);\n            return;\n        }\n\n        if (mNotInitialized) return;\n\n        if (stale) {\n            mMission.resetState(false, false, DownloadMission.ERROR_NOTHING);\n        }\n\n        mMission.writeThisToFile();\n\n        if (!mMission.running || super.isInterrupted()) return;\n\n        mMission.running = false;\n        mMission.start();\n    }\n\n    private long[] parseContentRange(String value) {\n        long[] range = new long[3];\n\n        if (value == null) {\n            // this never should happen\n            return range;\n        }\n\n        try {\n            value = value.trim();\n\n            if (!value.startsWith(\"bytes\")) {\n                return range;// unknown range type\n            }\n\n            int space = value.lastIndexOf(' ') + 1;\n            int dash = value.indexOf('-', space) + 1;\n            int bar = value.indexOf('/', dash);\n\n            // start\n            range[0] = Long.parseLong(value.substring(space, dash - 1));\n\n            // end\n            range[1] = Long.parseLong(value.substring(dash, bar));\n\n            // resource length\n            value = value.substring(bar + 1);\n            if (value.equals(\"*\")) {\n                range[2] = -1;// unknown length received from the server but should be valid\n            } else {\n                range[2] = Long.parseLong(value);\n            }\n        } catch (Exception e) {\n            // nothing to do\n        }\n\n        return range;\n    }\n\n    private boolean test() {\n        if (mMission.urls[mMission.current] == null) return false;\n\n        try {\n            mConn = mMission.openConnection(mMission.urls[mMission.current], true, -1, -1);\n            mMission.establishConnection(mID, mConn);\n\n            if (mConn.getResponseCode() == 200) return true;\n        } catch (Exception e) {\n            // nothing to do\n        } finally {\n            disconnect();\n        }\n\n        return false;\n    }\n\n    private void disconnect() {\n        try {\n            try {\n                mConn.getInputStream().close();\n            } finally {\n                mConn.disconnect();\n            }\n        } catch (Exception e) {\n            // nothing to do\n        } finally {\n            mConn = null;\n        }\n    }\n\n    @Override\n    public void interrupt() {\n        super.interrupt();\n        if (mConn != null) disconnect();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/get/DownloadRunnable.java",
    "content": "package us.shandian.giga.get;\n\nimport android.util.Log;\n\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.HttpURLConnection;\nimport java.nio.channels.ClosedByInterruptException;\nimport java.util.Objects;\n\nimport us.shandian.giga.get.DownloadMission.Block;\nimport us.shandian.giga.get.DownloadMission.HttpError;\n\nimport static org.schabi.newpipe.BuildConfig.DEBUG;\nimport static us.shandian.giga.get.DownloadMission.ERROR_HTTP_FORBIDDEN;\n\n\n/**\n * Runnable to download blocks of a file until the file is completely downloaded,\n * an error occurs or the process is stopped.\n */\npublic class DownloadRunnable extends Thread {\n    private static final String TAG = \"DownloadRunnable\";\n\n    private final DownloadMission mMission;\n    private final int mId;\n\n    private HttpURLConnection mConn;\n\n    DownloadRunnable(DownloadMission mission, int id) {\n        mMission = Objects.requireNonNull(mission);\n        mId = id;\n    }\n\n    private void releaseBlock(Block block, long remain) {\n        // set the block offset to -1 if it is completed\n        mMission.releaseBlock(block.position, remain < 0 ? -1 : block.done);\n    }\n\n    @Override\n    public void run() {\n        boolean retry = false;\n        Block block = null;\n        int retryCount = 0;\n        SharpStream f;\n\n        try {\n            f = mMission.storage.getStream();\n        } catch (IOException e) {\n            mMission.notifyError(e);// this never should happen\n            return;\n        }\n\n        while (mMission.running && mMission.errCode == DownloadMission.ERROR_NOTHING) {\n            if (!retry) {\n                block = mMission.acquireBlock();\n            }\n\n            if (block == null) {\n                if (DEBUG) Log.d(TAG, mId + \":no more blocks left, exiting\");\n                break;\n            }\n\n            if (DEBUG) {\n                if (retry)\n                    Log.d(TAG, mId + \":retry block at position=\" + block.position + \" from the start\");\n                else\n                    Log.d(TAG, mId + \":acquired block at position=\" + block.position + \" done=\" + block.done);\n            }\n\n            long start = (long)block.position * DownloadMission.BLOCK_SIZE;\n            long end = start + DownloadMission.BLOCK_SIZE - 1;\n\n            start += block.done;\n\n            if (end >= mMission.length) {\n                end = mMission.length - 1;\n            }\n\n            try {\n                mConn = mMission.openConnection(false, start, end);\n                mMission.establishConnection(mId, mConn);\n\n                // check if the download can be resumed\n                if (mConn.getResponseCode() == 416) {\n                    if (block.done > 0) {\n                        // try again from the start (of the block)\n                        mMission.notifyProgress(-block.done);\n                        block.done = 0;\n                        retry = true;\n                        mConn.disconnect();\n                        continue;\n                    }\n\n                    throw new DownloadMission.HttpError(416);\n                }\n\n                retry = false;\n\n                // The server may be ignoring the range request\n                if (mConn.getResponseCode() != 206) {\n                    if (DEBUG) {\n                        Log.e(TAG, mId + \":Unsupported \" + mConn.getResponseCode());\n                    }\n                    mMission.notifyError(new DownloadMission.HttpError(mConn.getResponseCode()));\n                    break;\n                }\n\n                f.seek(mMission.offsets[mMission.current] + start);\n\n                try (InputStream is = mConn.getInputStream()) {\n                    byte[] buf = new byte[DownloadMission.BUFFER_SIZE];\n                    int len;\n\n                    // use always start <= end\n                    // fixes a deadlock because in some videos, youtube is sending one byte alone\n                    while (start <= end && mMission.running && (len = is.read(buf, 0, buf.length)) != -1) {\n                        f.write(buf, 0, len);\n                        start += len;\n                        block.done += len;\n                        mMission.notifyProgress(len);\n                    }\n                }\n\n                if (DEBUG && mMission.running) {\n                    Log.d(TAG, mId + \":position \" + block.position + \" stopped \" + start + \"/\" + end);\n                }\n            } catch (Exception e) {\n                if (!mMission.running || e instanceof ClosedByInterruptException) break;\n\n                if (e instanceof HttpError && ((HttpError) e).statusCode == ERROR_HTTP_FORBIDDEN) {\n                    // for youtube streams. The url has expired, recover\n                    f.close();\n\n                    if (mId == 1) {\n                        // only the first thread will execute the recovery procedure\n                        mMission.doRecover(ERROR_HTTP_FORBIDDEN);\n                    }\n                    return;\n                }\n\n                if (retryCount++ >= mMission.maxRetry) {\n                    mMission.notifyError(e);\n                    break;\n                }\n\n                retry = true;\n            } finally {\n                if (!retry) releaseBlock(block, end - start);\n            }\n        }\n\n        f.close();\n\n        if (DEBUG) {\n            Log.d(TAG, \"thread \" + mId + \" exited from main download loop\");\n        }\n\n        if (mMission.errCode == DownloadMission.ERROR_NOTHING && mMission.running) {\n            if (DEBUG) {\n                Log.d(TAG, \"no error has happened, notifying\");\n            }\n            mMission.notifyFinished();\n        }\n\n        if (DEBUG && !mMission.running) {\n            Log.d(TAG, \"The mission has been paused. Passing.\");\n        }\n    }\n\n    @Override\n    public void interrupt() {\n        super.interrupt();\n\n        try {\n            if (mConn != null) mConn.disconnect();\n        } catch (Exception e) {\n            // nothing to do\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/get/DownloadRunnableFallback.java",
    "content": "package us.shandian.giga.get;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.HttpURLConnection;\nimport java.nio.channels.ClosedByInterruptException;\n\nimport us.shandian.giga.get.DownloadMission.HttpError;\nimport us.shandian.giga.util.Utility;\n\nimport static org.schabi.newpipe.BuildConfig.DEBUG;\nimport static us.shandian.giga.get.DownloadMission.ERROR_HTTP_FORBIDDEN;\n\n/**\n * Single-threaded fallback mode\n */\npublic class DownloadRunnableFallback extends Thread {\n    private static final String TAG = \"DLRunnableFallback\";\n\n    private final DownloadMission mMission;\n\n    private int mRetryCount = 0;\n    private InputStream mIs;\n    private SharpStream mF;\n    private HttpURLConnection mConn;\n\n    DownloadRunnableFallback(@NonNull DownloadMission mission) {\n        mMission = mission;\n    }\n\n    private void dispose() {\n        try {\n            try {\n                if (mIs != null) mIs.close();\n            } finally {\n                mConn.disconnect();\n            }\n        } catch (IOException e) {\n            // nothing to do\n        }\n\n        if (mF != null) mF.close();\n    }\n\n    @Override\n    public void run() {\n        boolean done;\n        long start = mMission.fallbackResumeOffset;\n\n        if (DEBUG && !mMission.unknownLength && start > 0) {\n            Log.i(TAG, \"Resuming a single-thread download at \" + start);\n        }\n\n        try {\n            long rangeStart = (mMission.unknownLength || start < 1) ? -1 : start;\n\n            int mId = 1;\n            mConn = mMission.openConnection(false, rangeStart, -1);\n\n            if (mRetryCount == 0 && rangeStart == -1) {\n                // workaround: bypass android connection pool\n                mConn.setRequestProperty(\"Range\", \"bytes=0-\");\n            }\n\n            mMission.establishConnection(mId, mConn);\n\n            // check if the download can be resumed\n            if (mConn.getResponseCode() == 416 && start > 0) {\n                mMission.notifyProgress(-start);\n                start = 0;\n                mRetryCount--;\n                throw new DownloadMission.HttpError(416);\n            }\n\n            // secondary check for the file length\n            if (!mMission.unknownLength)\n                mMission.unknownLength = Utility.getContentLength(mConn) == -1;\n\n            if (mMission.unknownLength || mConn.getResponseCode() == 200) {\n                // restart amount of bytes downloaded\n                mMission.done = mMission.offsets[mMission.current] - mMission.offsets[0];\n                start = 0; // reset position to avoid writing at wrong offset\n            }\n\n            mF = mMission.storage.getStream();\n            mF.seek(mMission.offsets[mMission.current] + start);\n\n            mIs = mConn.getInputStream();\n\n            byte[] buf = new byte[DownloadMission.BUFFER_SIZE];\n            int len = 0;\n\n            while (mMission.running && (len = mIs.read(buf, 0, buf.length)) != -1) {\n                mF.write(buf, 0, len);\n                start += len;\n                mMission.notifyProgress(len);\n            }\n\n            dispose();\n\n            // if thread goes interrupted check if the last part is written. This avoid re-download the whole file\n            done = len == -1;\n        } catch (Exception e) {\n            dispose();\n\n            mMission.fallbackResumeOffset = start;\n\n            if (!mMission.running || e instanceof ClosedByInterruptException) return;\n\n            if (e instanceof HttpError && ((HttpError) e).statusCode == ERROR_HTTP_FORBIDDEN) {\n                // for youtube streams. The url has expired, recover\n                dispose();\n                mMission.doRecover(ERROR_HTTP_FORBIDDEN);\n                return;\n            }\n\n            if (mRetryCount++ >= mMission.maxRetry) {\n                mMission.notifyError(e);\n                return;\n            }\n\n            if (DEBUG) {\n                Log.e(TAG, \"got exception, retrying...\", e);\n            }\n\n            run();// try again\n            return;\n        }\n\n        if (done) {\n            mMission.notifyFinished();\n        } else {\n            mMission.fallbackResumeOffset = start;\n        }\n    }\n\n    @Override\n    public void interrupt() {\n        super.interrupt();\n\n        if (mConn != null) {\n            try {\n                mConn.disconnect();\n            } catch (Exception e) {\n                // nothing to do\n            }\n\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/get/FinishedMission.java",
    "content": "package us.shandian.giga.get;\n\nimport androidx.annotation.NonNull;\n\npublic class FinishedMission extends Mission {\n\n    public FinishedMission() {\n    }\n\n    public FinishedMission(@NonNull DownloadMission mission) {\n        source = mission.source;\n        length = mission.length;\n        timestamp = mission.timestamp;\n        kind = mission.kind;\n        storage = mission.storage;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/get/Mission.java",
    "content": "package us.shandian.giga.get;\n\nimport androidx.annotation.NonNull;\n\nimport java.io.Serializable;\nimport java.util.Calendar;\n\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\n\npublic abstract class Mission implements Serializable {\n    private static final long serialVersionUID = 1L;// last bump: 27 march 2019\n\n    /**\n     * Source url of the resource\n     */\n    public String source;\n\n    /**\n     * Length of the current resource\n     */\n    public long length;\n\n    /**\n     * creation timestamp (and maybe unique identifier)\n     */\n    public long timestamp;\n\n    public long getTimestamp() {\n        return timestamp;\n    }\n\n    /**\n     * pre-defined content type\n     */\n    public char kind;\n\n    /**\n     * The downloaded file\n     */\n    public StoredFileHelper storage;\n\n    /**\n     * Delete the downloaded file\n     *\n     * @return {@code true] if and only if the file is successfully deleted, otherwise, {@code false}\n     */\n    public boolean delete() {\n        if (storage != null) return storage.delete();\n        return true;\n    }\n\n    /**\n     * Indicate if this mission is deleted whatever is stored\n     */\n    public transient boolean deleted = false;\n\n    @NonNull\n    @Override\n    public String toString() {\n        final Calendar calendar = Calendar.getInstance();\n        calendar.setTimeInMillis(timestamp);\n        return \"[\" + calendar.getTime().toString() + \"] \" + (storage.isInvalid() ? storage.getName() : storage.getUri());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt",
    "content": "package us.shandian.giga.get\n\nimport android.os.Parcelable\nimport java.io.Serializable\nimport kotlinx.parcelize.Parcelize\nimport org.schabi.newpipe.extractor.MediaFormat\nimport org.schabi.newpipe.extractor.stream.AudioStream\nimport org.schabi.newpipe.extractor.stream.Stream\nimport org.schabi.newpipe.extractor.stream.SubtitlesStream\nimport org.schabi.newpipe.extractor.stream.VideoStream\n\n@Parcelize\nclass MissionRecoveryInfo(\n    var format: MediaFormat?,\n    var desired: String? = null,\n    var isDesired2: Boolean = false,\n    var desiredBitrate: Int = 0,\n    var kind: Char = Char.MIN_VALUE,\n    var validateCondition: String? = null\n) : Serializable, Parcelable {\n    constructor(stream: Stream) : this(format = stream.format) {\n        when (stream) {\n            is AudioStream -> {\n                desiredBitrate = stream.getAverageBitrate()\n                isDesired2 = false\n                kind = 'a'\n            }\n\n            is VideoStream -> {\n                desired = stream.getResolution()\n                isDesired2 = stream.isVideoOnly()\n                kind = 'v'\n            }\n\n            is SubtitlesStream -> {\n                desired = stream.languageTag\n                isDesired2 = stream.isAutoGenerated\n                kind = 's'\n            }\n\n            else -> throw RuntimeException(\"Unknown stream kind\")\n        }\n    }\n\n    override fun toString(): String {\n        val info: String\n        val str = StringBuilder()\n        str.append(\"{type=\")\n        when (kind) {\n            'a' -> {\n                str.append(\"audio\")\n                info = \"bitrate=$desiredBitrate\"\n            }\n\n            'v' -> {\n                str.append(\"video\")\n                info = \"quality=$desired videoOnly=$isDesired2\"\n            }\n\n            's' -> {\n                str.append(\"subtitles\")\n                info = \"language=$desired autoGenerated=$isDesired2\"\n            }\n\n            else -> {\n                info = \"\"\n                str.append(\"other\")\n            }\n        }\n        str.append(\" format=\")\n            .append(format?.getName())\n            .append(' ')\n            .append(info)\n            .append('}')\n        return str.toString()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/get/sqlite/FinishedMissionStore.java",
    "content": "package us.shandian.giga.get.sqlite;\n\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteOpenHelper;\nimport android.net.Uri;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.Objects;\n\nimport us.shandian.giga.get.DownloadMission;\nimport us.shandian.giga.get.FinishedMission;\nimport us.shandian.giga.get.Mission;\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\n\n/**\n * SQLite helper to store finished {@link us.shandian.giga.get.FinishedMission}'s\n */\npublic class FinishedMissionStore extends SQLiteOpenHelper {\n\n    // TODO: use NewPipeSQLiteHelper ('s constants) when playlist branch is merged (?)\n    private static final String DATABASE_NAME = \"downloads.db\";\n\n    private static final int DATABASE_VERSION = 4;\n\n    /**\n     * The table name of download missions (old)\n     */\n    private static final String MISSIONS_TABLE_NAME_v2 = \"download_missions\";\n\n    /**\n     * The table name of download missions\n     */\n    private static final String FINISHED_TABLE_NAME = \"finished_missions\";\n\n    /**\n     * The key to the urls of a mission\n     */\n    private static final String KEY_SOURCE = \"url\";\n\n\n    /**\n     * The key to the done.\n     */\n    private static final String KEY_DONE = \"bytes_downloaded\";\n\n    private static final String KEY_TIMESTAMP = \"timestamp\";\n\n    private static final String KEY_KIND = \"kind\";\n\n    private static final String KEY_PATH = \"path\";\n\n    /**\n     * The statement to create the table\n     */\n    private static final String MISSIONS_CREATE_TABLE =\n            \"CREATE TABLE \" + FINISHED_TABLE_NAME + \" (\" +\n                    KEY_PATH + \" TEXT NOT NULL, \" +\n                    KEY_SOURCE + \" TEXT NOT NULL, \" +\n                    KEY_DONE + \" INTEGER NOT NULL, \" +\n                    KEY_TIMESTAMP + \" INTEGER NOT NULL, \" +\n                    KEY_KIND + \" TEXT NOT NULL, \" +\n                    \" UNIQUE(\" + KEY_TIMESTAMP + \", \" + KEY_PATH + \"));\";\n\n\n    private final Context context;\n\n    public FinishedMissionStore(Context context) {\n        super(context, DATABASE_NAME, null, DATABASE_VERSION);\n        this.context = context;\n    }\n\n    @Override\n    public void onCreate(SQLiteDatabase db) {\n        db.execSQL(MISSIONS_CREATE_TABLE);\n    }\n\n    @Override\n    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n        if (oldVersion == 2) {\n            db.execSQL(\"ALTER TABLE \" + MISSIONS_TABLE_NAME_v2 + \" ADD COLUMN \" + KEY_KIND + \" TEXT;\");\n            oldVersion++;\n        }\n\n        if (oldVersion == 3) {\n            final String KEY_LOCATION = \"location\";\n            final String KEY_NAME = \"name\";\n\n            db.execSQL(MISSIONS_CREATE_TABLE);\n\n            Cursor cursor = db.query(MISSIONS_TABLE_NAME_v2, null, null,\n                    null, null, null, KEY_TIMESTAMP);\n\n            int count = cursor.getCount();\n            if (count > 0) {\n                db.beginTransaction();\n                while (cursor.moveToNext()) {\n                    ContentValues values = new ContentValues();\n                    values.put(\n                            KEY_SOURCE,\n                            cursor.getString(cursor.getColumnIndexOrThrow(KEY_SOURCE))\n                    );\n                    values.put(\n                            KEY_DONE,\n                            cursor.getString(cursor.getColumnIndexOrThrow(KEY_DONE))\n                    );\n                    values.put(\n                            KEY_TIMESTAMP,\n                            cursor.getLong(cursor.getColumnIndexOrThrow(KEY_TIMESTAMP))\n                    );\n                    values.put(KEY_KIND, cursor.getString(cursor.getColumnIndexOrThrow(KEY_KIND)));\n                    values.put(KEY_PATH, Uri.fromFile(\n                            new File(\n                                    cursor.getString(cursor.getColumnIndexOrThrow(KEY_LOCATION)),\n                                    cursor.getString(cursor.getColumnIndexOrThrow(KEY_NAME))\n                            )\n                    ).toString());\n\n                    db.insert(FINISHED_TABLE_NAME, null, values);\n                }\n                db.setTransactionSuccessful();\n                db.endTransaction();\n            }\n\n            cursor.close();\n            db.execSQL(\"DROP TABLE \" + MISSIONS_TABLE_NAME_v2);\n        }\n    }\n\n    /**\n     * Returns all values of the download mission as ContentValues.\n     *\n     * @param downloadMission the download mission\n     * @return the content values\n     */\n    private ContentValues getValuesOfMission(@NonNull Mission downloadMission) {\n        ContentValues values = new ContentValues();\n        values.put(KEY_SOURCE, downloadMission.source);\n        values.put(KEY_PATH, downloadMission.storage.getUri().toString());\n        values.put(KEY_DONE, downloadMission.length);\n        values.put(KEY_TIMESTAMP, downloadMission.timestamp);\n        values.put(KEY_KIND, String.valueOf(downloadMission.kind));\n        return values;\n    }\n\n    private FinishedMission getMissionFromCursor(Cursor cursor) {\n        String kind = Objects.requireNonNull(cursor)\n                .getString(cursor.getColumnIndexOrThrow(KEY_KIND));\n        if (kind == null || kind.isEmpty()) kind = \"?\";\n\n        String path = cursor.getString(cursor.getColumnIndexOrThrow(KEY_PATH));\n\n        FinishedMission mission = new FinishedMission();\n\n        mission.source = cursor.getString(cursor.getColumnIndexOrThrow(KEY_SOURCE));\n        mission.length = cursor.getLong(cursor.getColumnIndexOrThrow(KEY_DONE));\n        mission.timestamp = cursor.getLong(cursor.getColumnIndexOrThrow(KEY_TIMESTAMP));\n        mission.kind = kind.charAt(0);\n\n        try {\n            mission.storage = new StoredFileHelper(context,null, Uri.parse(path), \"\");\n        } catch (Exception e) {\n            Log.e(\"FinishedMissionStore\", \"failed to load the storage path of: \" + path, e);\n            mission.storage = new StoredFileHelper(null, path, \"\", \"\");\n        }\n\n        return mission;\n    }\n\n\n    //////////////////////////////////\n    // Data source methods\n    ///////////////////////////////////\n\n    public ArrayList<FinishedMission> loadFinishedMissions() {\n        SQLiteDatabase database = getReadableDatabase();\n        Cursor cursor = database.query(FINISHED_TABLE_NAME, null, null,\n                null, null, null, KEY_TIMESTAMP + \" DESC\");\n\n        int count = cursor.getCount();\n        if (count == 0) return new ArrayList<>(1);\n\n        ArrayList<FinishedMission> result = new ArrayList<>(count);\n        while (cursor.moveToNext()) {\n            result.add(getMissionFromCursor(cursor));\n        }\n\n        return result;\n    }\n\n    public void addFinishedMission(DownloadMission downloadMission) {\n        ContentValues values = getValuesOfMission(Objects.requireNonNull(downloadMission));\n        SQLiteDatabase database = getWritableDatabase();\n        database.insert(FINISHED_TABLE_NAME, null, values);\n    }\n\n    public void deleteMission(Mission mission) {\n        String ts = String.valueOf(Objects.requireNonNull(mission).timestamp);\n\n        SQLiteDatabase database = getWritableDatabase();\n\n        if (mission instanceof FinishedMission) {\n            if (mission.storage.isInvalid()) {\n                database.delete(FINISHED_TABLE_NAME, KEY_TIMESTAMP + \" = ?\", new String[]{ts});\n            } else {\n                database.delete(FINISHED_TABLE_NAME, KEY_TIMESTAMP + \" = ? AND \" + KEY_PATH + \" = ?\", new String[]{\n                        ts, mission.storage.getUri().toString()\n                });\n            }\n        } else {\n            throw new UnsupportedOperationException(\"DownloadMission\");\n        }\n    }\n\n    public void updateMission(Mission mission) {\n        ContentValues values = getValuesOfMission(Objects.requireNonNull(mission));\n        SQLiteDatabase database = getWritableDatabase();\n        String ts = String.valueOf(mission.timestamp);\n\n        int rowsAffected;\n\n        if (mission instanceof FinishedMission) {\n            if (mission.storage.isInvalid()) {\n                rowsAffected = database.update(FINISHED_TABLE_NAME, values, KEY_TIMESTAMP + \" = ?\", new String[]{ts});\n            } else {\n                rowsAffected = database.update(FINISHED_TABLE_NAME, values, KEY_PATH + \" = ?\", new String[]{\n                        mission.storage.getUri().toString()\n                });\n            }\n        } else {\n            throw new UnsupportedOperationException(\"DownloadMission\");\n        }\n\n        if (rowsAffected != 1) {\n            Log.e(\"FinishedMissionStore\", \"Expected 1 row to be affected by update but got \" + rowsAffected);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/io/ChunkFileInputStream.java",
    "content": "package us.shandian.giga.io;\n\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.IOException;\n\npublic class ChunkFileInputStream extends SharpStream {\n    private static final int REPORT_INTERVAL = 256 * 1024;\n\n    private SharpStream source;\n    private final long offset;\n    private final long length;\n    private long position;\n\n    private long progressReport;\n    private final ProgressReport onProgress;\n\n    public ChunkFileInputStream(SharpStream target, long start, long end, ProgressReport callback) throws IOException {\n        source = target;\n        offset = start;\n        length = end - start;\n        position = 0;\n        onProgress = callback;\n        progressReport = REPORT_INTERVAL;\n\n        if (length < 1) {\n            source.close();\n            throw new IOException(\"The chunk is empty or invalid\");\n        }\n        if (source.length() < end) {\n            try {\n                throw new IOException(String.format(\"invalid file length. expected = %s  found = %s\", end, source.length()));\n            } finally {\n                source.close();\n            }\n        }\n\n        source.seek(offset);\n    }\n\n    /**\n     * Get absolute position on file\n     *\n     * @return the position\n     */\n    public long getFilePointer() {\n        return offset + position;\n    }\n\n    @Override\n    public int read() throws IOException {\n        if ((position + 1) > length) {\n            return 0;\n        }\n\n        int res = source.read();\n        if (res >= 0) {\n            position++;\n        }\n\n        return res;\n    }\n\n    @Override\n    public int read(byte[] b) throws IOException {\n        return read(b, 0, b.length);\n    }\n\n    @Override\n    public int read(byte[] b, int off, int len) throws IOException {\n        if ((position + len) > length) {\n            len = (int) (length - position);\n        }\n        if (len == 0) {\n            return 0;\n        }\n\n        int res = source.read(b, off, len);\n        position += res;\n\n        if (onProgress != null && position > progressReport) {\n            onProgress.report(position);\n            progressReport = position + REPORT_INTERVAL;\n        }\n\n        return res;\n    }\n\n    @Override\n    public long skip(long pos) throws IOException {\n        pos = Math.min(pos + position, length);\n\n        if (pos == 0) {\n            return 0;\n        }\n\n        source.seek(offset + pos);\n\n        long oldPos = position;\n        position = pos;\n\n        return pos - oldPos;\n    }\n\n    @Override\n    public long available() {\n        return length - position;\n    }\n\n    @SuppressWarnings(\"EmptyCatchBlock\")\n    @Override\n    public void close() {\n        source.close();\n        source = null;\n    }\n\n    @Override\n    public boolean isClosed() {\n        return source == null;\n    }\n\n    @Override\n    public void rewind() throws IOException {\n        position = 0;\n        source.seek(offset);\n    }\n\n    @Override\n    public boolean canRewind() {\n        return true;\n    }\n\n    @Override\n    public boolean canRead() {\n        return true;\n    }\n\n    @Override\n    public boolean canWrite() {\n        return false;\n    }\n\n    @Override\n    public void write(byte value) {\n    }\n\n    @Override\n    public void write(byte[] buffer) {\n    }\n\n    @Override\n    public void write(byte[] buffer, int offset, int count) {\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/io/CircularFileWriter.java",
    "content": "package us.shandian.giga.io;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.util.Objects;\n\npublic class CircularFileWriter extends SharpStream {\n\n    private static final int QUEUE_BUFFER_SIZE = 8 * 1024;// 8 KiB\n    private static final int COPY_BUFFER_SIZE = 128 * 1024; // 128 KiB\n    private static final int NOTIFY_BYTES_INTERVAL = 64 * 1024;// 64 KiB\n    private static final int THRESHOLD_AUX_LENGTH = 15 * 1024 * 1024;// 15 MiB\n\n    private final OffsetChecker callback;\n\n    public ProgressReport onProgress;\n    public WriteErrorHandle onWriteError;\n\n    private long reportPosition;\n    private long maxLengthKnown = -1;\n\n    private BufferedFile out;\n    private BufferedFile aux;\n\n    public CircularFileWriter(SharpStream target, File temp, OffsetChecker checker) throws IOException {\n        Objects.requireNonNull(checker);\n\n        if (!temp.exists()) {\n            if (!temp.createNewFile()) {\n                throw new IOException(\"Cannot create a temporal file\");\n            }\n        }\n\n        aux = new BufferedFile(temp);\n        out = new BufferedFile(target);\n\n        callback = checker;\n\n        reportPosition = NOTIFY_BYTES_INTERVAL;\n    }\n\n    private void flushAuxiliar(long amount) throws IOException {\n        if (aux.length < 1) {\n            return;\n        }\n\n        out.flush();\n        aux.flush();\n\n        boolean underflow = aux.offset < aux.length || out.offset < out.length;\n        byte[] buffer = new byte[COPY_BUFFER_SIZE];\n\n        aux.target.seek(0);\n        out.target.seek(out.length);\n\n        long length = amount;\n        while (length > 0) {\n            int read = (int) Math.min(length, Integer.MAX_VALUE);\n            read = aux.target.read(buffer, 0, Math.min(read, buffer.length));\n\n            if (read < 1) {\n                amount -= length;\n                break;\n            }\n\n            out.writeProof(buffer, read);\n            length -= read;\n        }\n\n        if (underflow) {\n            if (out.offset >= out.length) {\n                // calculate the aux underflow pointer\n                if (aux.offset < amount) {\n                    out.offset += aux.offset;\n                    aux.offset = 0;\n                    out.target.seek(out.offset);\n                } else {\n                    aux.offset -= amount;\n                    out.offset = out.length + amount;\n                }\n            } else {\n                aux.offset = 0;\n            }\n        } else {\n            out.offset += amount;\n            aux.offset -= amount;\n        }\n\n        out.length += amount;\n\n        if (out.length > maxLengthKnown) {\n            maxLengthKnown = out.length;\n        }\n\n        if (amount < aux.length) {\n            // move the excess data to the beginning of the file\n            long readOffset = amount;\n            long writeOffset = 0;\n\n            aux.length -= amount;\n            length = aux.length;\n            while (length > 0) {\n                int read = (int) Math.min(length, Integer.MAX_VALUE);\n                read = aux.target.read(buffer, 0, Math.min(read, buffer.length));\n\n                aux.target.seek(writeOffset);\n                aux.writeProof(buffer, read);\n\n                writeOffset += read;\n                readOffset += read;\n                length -= read;\n\n                aux.target.seek(readOffset);\n            }\n\n            aux.target.setLength(aux.length);\n            return;\n        }\n\n        if (aux.length > THRESHOLD_AUX_LENGTH) {\n            aux.target.setLength(THRESHOLD_AUX_LENGTH);// or setLength(0);\n        }\n\n        aux.reset();\n    }\n\n    /**\n     * Flush any buffer and close the output file. Use this method if the\n     * operation is successful\n     *\n     * @return the final length of the file\n     * @throws IOException if an I/O error occurs\n     */\n    public long finalizeFile() throws IOException {\n        flushAuxiliar(aux.length);\n\n        out.flush();\n\n        // change file length (if required)\n        long length = Math.max(maxLengthKnown, out.length);\n        if (length != out.target.length()) {\n            out.target.setLength(length);\n        }\n\n        close();\n\n        return length;\n    }\n\n    /**\n     * Close the file without flushing any buffer\n     */\n    @Override\n    public void close() {\n        if (out != null) {\n            out.close();\n            out = null;\n        }\n        if (aux != null) {\n            aux.close();\n            aux = null;\n        }\n    }\n\n    @Override\n    public void write(byte b) throws IOException {\n        write(new byte[]{b}, 0, 1);\n    }\n\n    @Override\n    public void write(byte[] b) throws IOException {\n        write(b, 0, b.length);\n    }\n\n    @Override\n    public void write(byte[] b, int off, int len) throws IOException {\n        if (len == 0) {\n            return;\n        }\n\n        long available;\n        long offsetOut = out.getOffset();\n        long offsetAux = aux.getOffset();\n        long end = callback.check();\n\n        if (end == -1) {\n            available = Integer.MAX_VALUE;\n        } else if (end < offsetOut) {\n            throw new IOException(\"The reported offset is invalid: \" + end + \"<\" + offsetOut);\n        } else {\n            available = end - offsetOut;\n        }\n\n        boolean usingAux = aux.length > 0 && offsetOut >= out.length;\n        boolean underflow = offsetAux < aux.length || offsetOut < out.length;\n\n        if (usingAux) {\n            // before continue calculate the final length of aux\n            long length = offsetAux + len;\n            if (underflow) {\n                if (aux.length > length) {\n                    length = aux.length;// the length is not changed\n                }\n            } else {\n                length = aux.length + len;\n            }\n\n            aux.write(b, off, len);\n\n            if (length >= THRESHOLD_AUX_LENGTH && length <= available) {\n                flushAuxiliar(available);\n            }\n        } else {\n            if (underflow) {\n                available = out.length - offsetOut;\n            }\n\n            int length = Math.min(len, (int) Math.min(Integer.MAX_VALUE, available));\n            out.write(b, off, length);\n\n            len -= length;\n            off += length;\n\n            if (len > 0) {\n                aux.write(b, off, len);\n            }\n        }\n\n        if (onProgress != null) {\n            long absoluteOffset = out.getOffset() + aux.getOffset();\n            if (absoluteOffset > reportPosition) {\n                reportPosition = absoluteOffset + NOTIFY_BYTES_INTERVAL;\n                onProgress.report(absoluteOffset);\n            }\n        }\n    }\n\n    @Override\n    public void flush() throws IOException {\n        aux.flush();\n        out.flush();\n\n        long total = out.length + aux.length;\n        if (total > maxLengthKnown) {\n            maxLengthKnown = total;// save the current file length in case the method {@code rewind()} is called\n        }\n    }\n\n    @Override\n    public long skip(long amount) throws IOException {\n        seek(out.getOffset() + aux.getOffset() + amount);\n        return amount;\n    }\n\n    @Override\n    public void rewind() throws IOException {\n        if (onProgress != null) {\n            onProgress.report(0);// rollback the whole progress\n        }\n\n        seek(0);\n\n        reportPosition = NOTIFY_BYTES_INTERVAL;\n    }\n\n    @Override\n    public void seek(long offset) throws IOException {\n        long total = out.length + aux.length;\n\n        if (offset == total) {\n            // do not ignore the seek offset if a underflow exists\n            long relativeOffset = out.getOffset() + aux.getOffset();\n            if (relativeOffset == total) {\n                return;\n            }\n        }\n\n        // flush everything, avoid any underflow\n        flush();\n\n        if (offset < 0 || offset > total) {\n            throw new IOException(\"desired offset is outside of range=0-\" + total + \" offset=\" + offset);\n        }\n\n        if (offset > out.length) {\n            out.seek(out.length);\n            aux.seek(offset - out.length);\n        } else {\n            out.seek(offset);\n            aux.seek(0);\n        }\n    }\n\n    @Override\n    public boolean isClosed() {\n        return out == null;\n    }\n\n    @Override\n    public boolean canRewind() {\n        return true;\n    }\n\n    @Override\n    public boolean canWrite() {\n        return true;\n    }\n\n    @Override\n    public boolean canSeek() {\n        return true;\n    }\n\n    // <editor-fold defaultstate=\"collapsed\" desc=\"stub read methods\">\n    @Override\n    public boolean canRead() {\n        return false;\n    }\n\n    @Override\n    public int read() {\n        throw new UnsupportedOperationException(\"write-only\");\n    }\n\n    @Override\n    public int read(byte[] buffer\n    ) {\n        throw new UnsupportedOperationException(\"write-only\");\n    }\n\n    @Override\n    public int read(byte[] buffer, int offset, int count\n    ) {\n        throw new UnsupportedOperationException(\"write-only\");\n    }\n\n    @Override\n    public long available() {\n        throw new UnsupportedOperationException(\"write-only\");\n    }\n    //</editor-fold>\n\n    public interface OffsetChecker {\n\n        /**\n         * Checks the amount of available space ahead\n         *\n         * @return absolute offset in the file where no more data SHOULD NOT be\n         * written. If the value is -1 the whole file will be used\n         */\n        long check();\n    }\n\n    public interface WriteErrorHandle {\n\n        /**\n         * Attempts to handle a I/O exception\n         *\n         * @param err the cause\n         * @return {@code true} to retry and continue, otherwise, {@code false}\n         * and throw the exception\n         */\n        boolean handle(Exception err);\n    }\n\n    class BufferedFile {\n\n        final SharpStream target;\n\n        private long offset;\n        long length;\n\n        private byte[] queue = new byte[QUEUE_BUFFER_SIZE];\n        private int queueSize;\n\n        BufferedFile(File file) throws FileNotFoundException {\n            this.target = new FileStream(file);\n        }\n\n        BufferedFile(SharpStream target) {\n            this.target = target;\n        }\n\n        long getOffset() {\n            return offset + queueSize;// absolute offset in the file\n        }\n\n        void close() {\n            queue = null;\n            target.close();\n        }\n\n        void write(byte[] b, int off, int len) throws IOException {\n            while (len > 0) {\n                // if the queue is full, the method available() will flush the queue\n                int read = Math.min(available(), len);\n\n                // enqueue incoming buffer\n                System.arraycopy(b, off, queue, queueSize, read);\n                queueSize += read;\n\n                len -= read;\n                off += read;\n            }\n\n            long total = offset + queueSize;\n            if (total > length) {\n                length = total;// save length\n            }\n        }\n\n        void flush() throws IOException {\n            writeProof(queue, queueSize);\n            offset += queueSize;\n            queueSize = 0;\n        }\n\n        protected void rewind() throws IOException {\n            offset = 0;\n            target.seek(0);\n        }\n\n        int available() throws IOException {\n            if (queueSize >= queue.length) {\n                flush();\n                return queue.length;\n            }\n\n            return queue.length - queueSize;\n        }\n\n        void reset() throws IOException {\n            offset = 0;\n            length = 0;\n            target.seek(0);\n        }\n\n        void seek(long absoluteOffset) throws IOException {\n            if (absoluteOffset == offset) {\n                return;// nothing to do\n            }\n            offset = absoluteOffset;\n            target.seek(absoluteOffset);\n        }\n\n        void writeProof(byte[] buffer, int length) throws IOException {\n            if (onWriteError == null) {\n                target.write(buffer, 0, length);\n                return;\n            }\n\n            while (true) {\n                try {\n                    target.write(buffer, 0, length);\n                    return;\n                } catch (Exception e) {\n                    if (!onWriteError.handle(e)) {\n                        throw e;// give up\n                    }\n                }\n            }\n        }\n\n        @NonNull\n        @Override\n        public String toString() {\n            String absLength;\n\n            try {\n                absLength = Long.toString(target.length());\n            } catch (IOException e) {\n                absLength = \"[\" + e.getLocalizedMessage() + \"]\";\n            }\n\n            return String.format(\n                    \"offset=%s  length=%s  queue=%s  absLength=%s\",\n                    offset, length, queueSize, absLength\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/io/FileStream.java",
    "content": "package us.shandian.giga.io;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.io.IOException;\nimport java.io.RandomAccessFile;\n\n/**\n * @author kapodamy\n */\npublic class FileStream extends SharpStream {\n\n    public RandomAccessFile source;\n\n    public FileStream(@NonNull File target) throws FileNotFoundException {\n        this.source = new RandomAccessFile(target, \"rw\");\n    }\n\n    public FileStream(@NonNull String path) throws FileNotFoundException {\n        this.source = new RandomAccessFile(path, \"rw\");\n    }\n\n    @Override\n    public int read() throws IOException {\n        return source.read();\n    }\n\n    @Override\n    public int read(byte[] b) throws IOException {\n        return source.read(b);\n    }\n\n    @Override\n    public int read(byte[] b, int off, int len) throws IOException {\n        return source.read(b, off, len);\n    }\n\n    @Override\n    public long skip(long pos) throws IOException {\n        return source.skipBytes((int) pos);\n    }\n\n    @Override\n    public long available() {\n        try {\n            return source.length() - source.getFilePointer();\n        } catch (IOException e) {\n            return 0;\n        }\n    }\n\n    @Override\n    public void close() {\n        if (source == null) return;\n        try {\n            source.close();\n        } catch (IOException err) {\n            // nothing to do\n        }\n        source = null;\n    }\n\n    @Override\n    public boolean isClosed() {\n        return source == null;\n    }\n\n    @Override\n    public void rewind() throws IOException {\n        source.seek(0);\n    }\n\n    @Override\n    public boolean canRewind() {\n        return true;\n    }\n\n    @Override\n    public boolean canRead() {\n        return true;\n    }\n\n    @Override\n    public boolean canWrite() {\n        return true;\n    }\n\n    @Override\n    public boolean canSeek() {\n        return true;\n    }\n\n    @Override\n    public boolean canSetLength() {\n        return true;\n    }\n\n    @Override\n    public void write(byte value) throws IOException {\n        source.write(value);\n    }\n\n    @Override\n    public void write(byte[] buffer) throws IOException {\n        source.write(buffer);\n    }\n\n    @Override\n    public void write(byte[] buffer, int offset, int count) throws IOException {\n        source.write(buffer, offset, count);\n    }\n\n    @Override\n    public void setLength(long length) throws IOException {\n        source.setLength(length);\n    }\n\n    @Override\n    public void seek(long offset) throws IOException {\n        source.seek(offset);\n    }\n\n    @Override\n    public long length() throws IOException {\n        return source.length();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/io/FileStreamSAF.java",
    "content": "package us.shandian.giga.io;\n\nimport android.content.ContentResolver;\nimport android.net.Uri;\nimport android.os.ParcelFileDescriptor;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.nio.channels.FileChannel;\n\npublic class FileStreamSAF extends SharpStream {\n\n    private final FileInputStream in;\n    private final FileOutputStream out;\n    private final FileChannel channel;\n    private final ParcelFileDescriptor file;\n\n    private boolean disposed;\n\n    public FileStreamSAF(@NonNull ContentResolver contentResolver, Uri fileUri) throws IOException {\n        // Notes:\n        // the file must exists first\n        // ¡read-write mode must allow seek!\n        // It is not guaranteed to work with files in the cloud (virtual files), tested in local storage devices\n\n        file = contentResolver.openFileDescriptor(fileUri, \"rw\");\n\n        if (file == null) {\n            throw new IOException(\"Cannot get the ParcelFileDescriptor for \" + fileUri.toString());\n        }\n\n        in = new FileInputStream(file.getFileDescriptor());\n        out = new FileOutputStream(file.getFileDescriptor());\n        channel = out.getChannel();// or use in.getChannel()\n    }\n\n    @Override\n    public int read() throws IOException {\n        return in.read();\n    }\n\n    @Override\n    public int read(byte[] buffer) throws IOException {\n        return in.read(buffer);\n    }\n\n    @Override\n    public int read(byte[] buffer, int offset, int count) throws IOException {\n        return in.read(buffer, offset, count);\n    }\n\n    @Override\n    public long skip(long amount) throws IOException {\n        return in.skip(amount);// ¿or use channel.position(channel.position() + amount)?\n    }\n\n    @Override\n    public long available() {\n        try {\n            return in.available();\n        } catch (IOException e) {\n            return 0;// ¡but not -1!\n        }\n    }\n\n    @Override\n    public void rewind() throws IOException {\n        seek(0);\n    }\n\n    @Override\n    public void close() {\n        try {\n            disposed = true;\n\n            file.close();\n            in.close();\n            out.close();\n            channel.close();\n        } catch (IOException e) {\n            Log.e(\"FileStreamSAF\", \"close() error\", e);\n        }\n    }\n\n    @Override\n    public boolean isClosed() {\n        return disposed;\n    }\n\n    @Override\n    public boolean canRewind() {\n        return true;\n    }\n\n    @Override\n    public boolean canRead() {\n        return true;\n    }\n\n    @Override\n    public boolean canWrite() {\n        return true;\n    }\n\n    @Override\n    public boolean canSetLength() {\n        return true;\n    }\n\n    @Override\n    public boolean canSeek() {\n        return true;\n    }\n\n    @Override\n    public void write(byte value) throws IOException {\n        out.write(value);\n    }\n\n    @Override\n    public void write(byte[] buffer) throws IOException {\n        out.write(buffer);\n    }\n\n    @Override\n    public void write(byte[] buffer, int offset, int count) throws IOException {\n        out.write(buffer, offset, count);\n    }\n\n    @Override\n    public void setLength(long length) throws IOException {\n        channel.truncate(length);\n    }\n\n    @Override\n    public void seek(long offset) throws IOException {\n        channel.position(offset);\n    }\n\n    @Override\n    public long length() throws IOException {\n        return channel.size();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/io/ProgressReport.java",
    "content": "package us.shandian.giga.io;\n\npublic interface ProgressReport {\n\n    /**\n     * Report the size of the new file\n     *\n     * @param progress the new size\n     */\n    void report(long progress);\n}"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/postprocessing/M4aNoDash.java",
    "content": "package us.shandian.giga.postprocessing;\n\nimport org.schabi.newpipe.streams.Mp4DashReader;\nimport org.schabi.newpipe.streams.Mp4FromDashWriter;\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.IOException;\n\nclass M4aNoDash extends Postprocessing {\n\n    M4aNoDash() {\n        super(false, true, ALGORITHM_M4A_NO_DASH);\n    }\n\n    @Override\n    boolean test(SharpStream... sources) throws IOException {\n        // check if the mp4 file is DASH (youtube)\n\n        Mp4DashReader reader = new Mp4DashReader(sources[0]);\n        reader.parse();\n\n        switch (reader.getBrands()[0]) {\n            case 0x64617368:// DASH\n            case 0x69736F35:// ISO5\n                return true;\n            default:\n                return false;\n        }\n    }\n\n    @Override\n    int process(SharpStream out, SharpStream... sources) throws IOException {\n        Mp4FromDashWriter muxer = new Mp4FromDashWriter(sources[0]);\n        muxer.setMainBrand(0x4D344120);// binary string \"M4A \"\n        muxer.parseSources();\n        muxer.selectTracks(0);\n        muxer.build(out);\n\n        return OK_RESULT;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/postprocessing/Mp4FromDashMuxer.java",
    "content": "package us.shandian.giga.postprocessing;\n\nimport org.schabi.newpipe.streams.Mp4FromDashWriter;\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.IOException;\n\n/**\n * @author kapodamy\n */\nclass Mp4FromDashMuxer extends Postprocessing {\n\n    Mp4FromDashMuxer() {\n        super(true, true, ALGORITHM_MP4_FROM_DASH_MUXER);\n    }\n\n    @Override\n    int process(SharpStream out, SharpStream... sources) throws IOException {\n        Mp4FromDashWriter muxer = new Mp4FromDashWriter(sources);\n        muxer.parseSources();\n        muxer.selectTracks(0, 0);\n        muxer.build(out);\n\n        return OK_RESULT;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/postprocessing/OggFromWebmDemuxer.java",
    "content": "package us.shandian.giga.postprocessing;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.streams.OggFromWebMWriter;\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.IOException;\nimport java.nio.ByteBuffer;\n\nclass OggFromWebmDemuxer extends Postprocessing {\n\n    OggFromWebmDemuxer() {\n        super(true, true, ALGORITHM_OGG_FROM_WEBM_DEMUXER);\n    }\n\n    @Override\n    boolean test(SharpStream... sources) throws IOException {\n        ByteBuffer buffer = ByteBuffer.allocate(4);\n        sources[0].read(buffer.array());\n\n        // youtube uses WebM as container, but the file extension (format suffix) is \"*.opus\"\n        // check if the file is a webm/mkv file before proceed\n\n        switch (buffer.getInt()) {\n            case 0x1a45dfa3:\n                return true;// webm/mkv\n            case 0x4F676753:\n                return false;// ogg\n        }\n\n        throw new UnsupportedOperationException(\"file not recognized, failed to demux the audio stream\");\n    }\n\n    @Override\n    int process(SharpStream out, @NonNull SharpStream... sources) throws IOException {\n        OggFromWebMWriter demuxer = new OggFromWebMWriter(sources[0], out, streamInfo);\n        demuxer.parseSource();\n        demuxer.selectTrack(0);\n        demuxer.build();\n\n        return OK_RESULT;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/postprocessing/Postprocessing.java",
    "content": "package us.shandian.giga.postprocessing;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\n\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.Serializable;\n\nimport us.shandian.giga.get.DownloadMission;\nimport us.shandian.giga.io.ChunkFileInputStream;\nimport us.shandian.giga.io.CircularFileWriter;\nimport us.shandian.giga.io.CircularFileWriter.OffsetChecker;\nimport us.shandian.giga.io.ProgressReport;\n\nimport static us.shandian.giga.get.DownloadMission.ERROR_NOTHING;\nimport static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING;\nimport static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING_HOLD;\n\npublic abstract class Postprocessing implements Serializable {\n\n    static transient final byte OK_RESULT = ERROR_NOTHING;\n\n    public transient static final String ALGORITHM_TTML_CONVERTER = \"ttml\";\n    public transient static final String ALGORITHM_WEBM_MUXER = \"webm\";\n    public transient static final String ALGORITHM_MP4_FROM_DASH_MUXER = \"mp4D-mp4\";\n    public transient static final String ALGORITHM_M4A_NO_DASH = \"mp4D-m4a\";\n    public transient static final String ALGORITHM_OGG_FROM_WEBM_DEMUXER = \"webm-ogg-d\";\n\n    public static Postprocessing getAlgorithm(@NonNull String algorithmName, String[] args,\n                                              StreamInfo streamInfo) {\n        Postprocessing instance;\n\n        switch (algorithmName) {\n            case ALGORITHM_TTML_CONVERTER:\n                instance = new TtmlConverter();\n                break;\n            case ALGORITHM_WEBM_MUXER:\n                instance = new WebMMuxer();\n                break;\n            case ALGORITHM_MP4_FROM_DASH_MUXER:\n                instance = new Mp4FromDashMuxer();\n                break;\n            case ALGORITHM_M4A_NO_DASH:\n                instance = new M4aNoDash();\n                break;\n            case ALGORITHM_OGG_FROM_WEBM_DEMUXER:\n                instance = new OggFromWebmDemuxer();\n                break;\n            /*case \"example-algorithm\":\n                instance = new ExampleAlgorithm();*/\n            default:\n                throw new UnsupportedOperationException(\"Unimplemented post-processing algorithm: \" + algorithmName);\n        }\n\n        instance.args = args;\n        instance.streamInfo = streamInfo;\n        return instance;\n    }\n\n    /**\n     * Get a boolean value that indicate if the given algorithm work on the same\n     * file\n     */\n    public boolean worksOnSameFile;\n\n    /**\n     * Indicates whether the selected algorithm needs space reserved at the beginning of the file\n     */\n    public boolean reserveSpace;\n\n    /**\n     * Gets the given algorithm short name\n     */\n    private final String name;\n\n    private String[] args;\n    protected StreamInfo streamInfo;\n\n    private transient DownloadMission mission;\n\n    private transient File tempFile;\n\n    Postprocessing(boolean reserveSpace, boolean worksOnSameFile, String algorithmName) {\n        this.reserveSpace = reserveSpace;\n        this.worksOnSameFile = worksOnSameFile;\n        this.name = algorithmName;// for debugging only\n    }\n\n    public void setTemporalDir(@NonNull File directory) {\n        long rnd = (int) (Math.random() * 100000.0f);\n        tempFile = new File(directory, rnd + \"_\" + System.nanoTime() + \".tmp\");\n    }\n\n    public void cleanupTemporalDir() {\n        if (tempFile != null && tempFile.exists()) {\n            try {\n                //noinspection ResultOfMethodCallIgnored\n                tempFile.delete();\n            } catch (Exception e) {\n                // nothing to do\n            }\n        }\n    }\n\n\n    public void run(DownloadMission target) throws IOException {\n        this.mission = target;\n\n        int result;\n        long finalLength = -1;\n\n        mission.done = 0;\n\n        long length = mission.storage.length() - mission.offsets[0];\n        mission.length = Math.max(length, mission.nearLength);\n\n        final ProgressReport readProgress = (long position) -> {\n            position -= mission.offsets[0];\n            if (position > mission.done) mission.done = position;\n        };\n\n        if (worksOnSameFile) {\n            ChunkFileInputStream[] sources = new ChunkFileInputStream[mission.urls.length];\n            try {\n                for (int i = 0, j = 1; i < sources.length; i++, j++) {\n                    SharpStream source = mission.storage.getStream();\n                    long end = j < sources.length ? mission.offsets[j] : source.length();\n\n                    sources[i] = new ChunkFileInputStream(source, mission.offsets[i], end, readProgress);\n                }\n\n                if (test(sources)) {\n                    for (SharpStream source : sources) source.rewind();\n\n                    OffsetChecker checker = () -> {\n                        for (ChunkFileInputStream source : sources) {\n                            /*\n                             * WARNING: never use rewind() in any chunk after any writing (especially on first chunks)\n                             *          or the CircularFileWriter can lead to unexpected results\n                             */\n                            if (source.isClosed() || source.available() < 1) {\n                                continue;// the selected source is not used anymore\n                            }\n\n                            return source.getFilePointer() - 1;\n                        }\n\n                        return -1;\n                    };\n\n                    try (CircularFileWriter out = new CircularFileWriter(\n                            mission.storage.getStream(), tempFile, checker)) {\n                        out.onProgress = (long position) -> mission.done = position;\n\n                        out.onWriteError = err -> {\n                            mission.psState = 3;\n                            mission.notifyError(ERROR_POSTPROCESSING_HOLD, err);\n\n                            try {\n                                synchronized (this) {\n                                    while (mission.psState == 3)\n                                        wait();\n                                }\n                            } catch (InterruptedException e) {\n                                // nothing to do\n                                Log.e(getClass().getSimpleName(), \"got InterruptedException\");\n                            }\n\n                            return mission.errCode == ERROR_NOTHING;\n                        };\n\n                        result = process(out, sources);\n\n                        if (result == OK_RESULT)\n                            finalLength = out.finalizeFile();\n                    }\n                } else {\n                    result = OK_RESULT;\n                }\n            } finally {\n                for (SharpStream source : sources) {\n                    if (source != null && !source.isClosed()) {\n                        source.close();\n                    }\n                }\n                if (tempFile != null) {\n                    //noinspection ResultOfMethodCallIgnored\n                    tempFile.delete();\n                    tempFile = null;\n                }\n            }\n        } else {\n            result = test() ? process(null) : OK_RESULT;\n        }\n\n        if (result == OK_RESULT) {\n            if (finalLength != -1) {\n                mission.length = finalLength;\n            }\n        } else {\n            mission.errCode = ERROR_POSTPROCESSING;\n            mission.errObject = new RuntimeException(\"post-processing algorithm returned \" + result);\n        }\n\n        if (result != OK_RESULT && worksOnSameFile) mission.storage.delete();\n\n        this.mission = null;\n    }\n\n    /**\n     * Test if the post-processing algorithm can be skipped\n     *\n     * @param sources files to be processed\n     * @return {@code true} if the post-processing is required, otherwise, {@code false}\n     * @throws IOException if an I/O error occurs.\n     */\n    boolean test(SharpStream... sources) throws IOException {\n        return true;\n    }\n\n    /**\n     * Abstract method to execute the post-processing algorithm\n     *\n     * @param out     output stream\n     * @param sources files to be processed\n     * @return an error code, {@code OK_RESULT} means the operation was successful\n     * @throws IOException if an I/O error occurs.\n     */\n    abstract int process(SharpStream out, SharpStream... sources) throws IOException;\n\n    String getArgumentAt(int index, String defaultValue) {\n        if (args == null || index >= args.length) {\n            return defaultValue;\n        }\n\n        return args[index];\n    }\n\n    @NonNull\n    @Override\n    public String toString() {\n        StringBuilder str = new StringBuilder();\n\n        str.append(\"{ name=\").append(name).append('[');\n\n        if (args != null) {\n            for (String arg : args) {\n                str.append(\", \");\n                str.append(arg);\n            }\n            str.delete(0, 1);\n        }\n\n        return str.append(\"] }\").toString();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/postprocessing/TtmlConverter.java",
    "content": "package us.shandian.giga.postprocessing;\n\nimport android.util.Log;\n\nimport org.schabi.newpipe.streams.SrtFromTtmlWriter;\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.IOException;\n\n/**\n * @author kapodamy\n */\nclass TtmlConverter extends Postprocessing {\n    private static final String TAG = \"TtmlConverter\";\n\n    TtmlConverter() {\n        // due how XmlPullParser works, the xml is fully loaded on the ram\n        super(false, true, ALGORITHM_TTML_CONVERTER);\n    }\n\n    @Override\n    int process(SharpStream out, SharpStream... sources) throws IOException {\n        // check if the subtitle is already in srt and copy, this should never happen\n        String format = getArgumentAt(0, null);\n        boolean ignoreEmptyFrames = getArgumentAt(1, \"true\").equals(\"true\");\n\n        if (format == null || format.equals(\"ttml\")) {\n            SrtFromTtmlWriter writer = new SrtFromTtmlWriter(out, ignoreEmptyFrames);\n\n            try {\n                writer.build(sources[0]);\n            } catch (IOException err) {\n                Log.e(TAG, \"subtitle conversion failed due to I/O error\", err);\n                throw err;\n            } catch (Exception err) {\n                Log.e(TAG, \"subtitle conversion failed\", err);\n                throw new IOException(\"TTML to SRT conversion failed\", err);\n            }\n\n            return OK_RESULT;\n        } else if (format.equals(\"srt\")) {\n            byte[] buffer = new byte[8 * 1024];\n            int read;\n            while ((read = sources[0].read(buffer)) > 0) {\n                out.write(buffer, 0, read);\n            }\n            return OK_RESULT;\n        }\n\n        throw new UnsupportedOperationException(\"Can't convert this subtitle, unimplemented format: \" + format);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/postprocessing/WebMMuxer.java",
    "content": "package us.shandian.giga.postprocessing;\n\nimport org.schabi.newpipe.streams.WebMReader.TrackKind;\nimport org.schabi.newpipe.streams.WebMReader.WebMTrack;\nimport org.schabi.newpipe.streams.WebMWriter;\nimport org.schabi.newpipe.streams.io.SharpStream;\n\nimport java.io.IOException;\n\n/**\n * @author kapodamy\n */\nclass WebMMuxer extends Postprocessing {\n\n    WebMMuxer() {\n        super(true, true, ALGORITHM_WEBM_MUXER);\n    }\n\n    @Override\n    int process(SharpStream out, SharpStream... sources) throws IOException {\n        WebMWriter muxer = new WebMWriter(sources);\n        muxer.parseSources();\n\n        // youtube uses a webm with a fake video track that acts as a \"cover image\"\n        int[] indexes = new int[sources.length];\n\n        for (int i = 0; i < sources.length; i++) {\n            WebMTrack[] tracks = muxer.getTracksFromSource(i);\n            for (int j = 0; j < tracks.length; j++) {\n                if (tracks[j].kind == TrackKind.Audio) {\n                    indexes[i] = j;\n                    i = sources.length;\n                    break;\n                }\n            }\n        }\n\n        muxer.selectTracks(indexes);\n        muxer.build(out);\n\n        return OK_RESULT;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/service/DownloadManager.java",
    "content": "package us.shandian.giga.service;\n\nimport android.content.Context;\nimport android.os.Handler;\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.recyclerview.widget.DiffUtil;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.List;\n\nimport us.shandian.giga.get.DownloadMission;\nimport us.shandian.giga.get.FinishedMission;\nimport us.shandian.giga.get.Mission;\nimport us.shandian.giga.get.sqlite.FinishedMissionStore;\nimport org.schabi.newpipe.streams.io.StoredDirectoryHelper;\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\nimport us.shandian.giga.util.Utility;\n\nimport static org.schabi.newpipe.BuildConfig.DEBUG;\nimport static us.shandian.giga.get.DownloadMission.ERROR_NOTHING;\nimport static us.shandian.giga.get.DownloadMission.ERROR_PROGRESS_LOST;\n\npublic class DownloadManager {\n    private static final String TAG = DownloadManager.class.getSimpleName();\n\n    enum NetworkState {Unavailable, Operating, MeteredOperating}\n\n    public static final int SPECIAL_NOTHING = 0;\n    public static final int SPECIAL_PENDING = 1;\n    public static final int SPECIAL_FINISHED = 2;\n\n    public static final String TAG_AUDIO = \"audio\";\n    public static final String TAG_VIDEO = \"video\";\n    private static final String DOWNLOADS_METADATA_FOLDER = \"pending_downloads\";\n\n    private final FinishedMissionStore mFinishedMissionStore;\n\n    private final ArrayList<DownloadMission> mMissionsPending = new ArrayList<>();\n    private final ArrayList<FinishedMission> mMissionsFinished;\n\n    private final Handler mHandler;\n    private final File mPendingMissionsDir;\n\n    private NetworkState mLastNetworkStatus = NetworkState.Unavailable;\n\n    int mPrefMaxRetry;\n    boolean mPrefMeteredDownloads;\n    boolean mPrefQueueLimit;\n    private boolean mSelfMissionsControl;\n\n    StoredDirectoryHelper mMainStorageAudio;\n    StoredDirectoryHelper mMainStorageVideo;\n\n    /**\n     * Create a new instance\n     *\n     * @param context Context for the data source for finished downloads\n     * @param handler Thread required for Messaging\n     */\n    DownloadManager(@NonNull Context context, Handler handler, StoredDirectoryHelper storageVideo, StoredDirectoryHelper storageAudio) {\n        if (DEBUG) {\n            Log.d(TAG, \"new DownloadManager instance. 0x\" + Integer.toHexString(this.hashCode()));\n        }\n\n        mFinishedMissionStore = new FinishedMissionStore(context);\n        mHandler = handler;\n        mMainStorageAudio = storageAudio;\n        mMainStorageVideo = storageVideo;\n        mMissionsFinished = loadFinishedMissions();\n        mPendingMissionsDir = getPendingDir(context);\n\n        loadPendingMissions(context);\n    }\n\n    private static File getPendingDir(@NonNull Context context) {\n        File dir = context.getExternalFilesDir(DOWNLOADS_METADATA_FOLDER);\n        if (testDir(dir)) return dir;\n\n        dir = new File(context.getFilesDir(), DOWNLOADS_METADATA_FOLDER);\n        if (testDir(dir)) return dir;\n\n        throw new RuntimeException(\"path to pending downloads are not accessible\");\n    }\n\n    private static boolean testDir(@Nullable File dir) {\n        if (dir == null) return false;\n\n        try {\n            if (!Utility.mkdir(dir, false)) {\n                Log.e(TAG, \"testDir() cannot create the directory in path: \" + dir.getAbsolutePath());\n                return false;\n            }\n\n            File tmp = new File(dir, \".tmp\");\n            if (!tmp.createNewFile()) return false;\n            return tmp.delete();// if the file was created, SHOULD BE deleted too\n        } catch (Exception e) {\n            Log.e(TAG, \"testDir() failed: \" + dir.getAbsolutePath(), e);\n            return false;\n        }\n    }\n\n    /**\n     * Loads finished missions from the data source and forgets finished missions whose file does\n     * not exist anymore.\n     */\n    private ArrayList<FinishedMission> loadFinishedMissions() {\n        ArrayList<FinishedMission> finishedMissions = mFinishedMissionStore.loadFinishedMissions();\n\n        // check if the files exists, otherwise, forget the download\n        for (int i = finishedMissions.size() - 1; i >= 0; i--) {\n            FinishedMission mission = finishedMissions.get(i);\n\n            if (!mission.storage.existsAsFile()) {\n                if (DEBUG) Log.d(TAG, \"downloaded file removed: \" + mission.storage.getName());\n\n                mFinishedMissionStore.deleteMission(mission);\n                finishedMissions.remove(i);\n            }\n        }\n\n        return finishedMissions;\n    }\n\n    private void loadPendingMissions(Context ctx) {\n        File[] subs = mPendingMissionsDir.listFiles();\n\n        if (subs == null) {\n            Log.e(TAG, \"listFiles() returned null\");\n            return;\n        }\n        if (subs.length < 1) {\n            return;\n        }\n        if (DEBUG) {\n            Log.d(TAG, \"Loading pending downloads from directory: \" + mPendingMissionsDir.getAbsolutePath());\n        }\n\n        File tempDir = pickAvailableTemporalDir(ctx);\n        Log.i(TAG, \"using '\" + tempDir + \"' as temporal directory\");\n\n        for (File sub : subs) {\n            if (!sub.isFile()) continue;\n            if (sub.getName().equals(\".tmp\")) continue;\n\n            DownloadMission mis = Utility.readFromFile(sub);\n            if (mis == null) {\n                //noinspection ResultOfMethodCallIgnored\n                sub.delete();\n                continue;\n            }\n\n            // DON'T delete missions that are truly finished - let them be moved to finished list\n            if (mis.isFinished()) {\n                // Move to finished missions instead of deleting\n                setFinished(mis);\n                //noinspection ResultOfMethodCallIgnored\n                sub.delete();\n                continue;\n            }\n\n            // DON'T delete missions with storage issues - try to recover them\n            if (mis.hasInvalidStorage() && mis.errCode != ERROR_PROGRESS_LOST) {\n                // Only delete if it's truly unrecoverable (not just progress lost)\n                if (mis.storage == null) {\n                    //noinspection ResultOfMethodCallIgnored\n                    sub.delete();\n                    continue;\n                }\n            }\n\n            mis.threads = new Thread[0];\n\n            boolean exists;\n            try {\n                mis.storage = StoredFileHelper.deserialize(mis.storage, ctx);\n                exists = !mis.storage.isInvalid() && mis.storage.existsAsFile();\n            } catch (Exception ex) {\n                Log.e(TAG, \"Failed to load the file source of \" + mis.storage.toString(), ex);\n                // Don't invalidate storage immediately - try to recover first\n                exists = false;\n            }\n\n            if (mis.isPsRunning()) {\n                if (mis.psAlgorithm.worksOnSameFile) {\n                    // Incomplete post-processing results in a corrupted download file\n                    if (exists && mis.storage.isDirect() && !mis.storage.delete())\n                        Log.w(TAG, \"Unable to delete incomplete download file: \" + sub.getPath());\n                }\n\n                mis.psState = 0;\n                mis.errCode = DownloadMission.ERROR_POSTPROCESSING_STOPPED;\n            } else if (!exists) {\n                tryRecover(mis);\n                // Keep the mission even if recovery fails - don't reset to ERROR_PROGRESS_LOST\n                // This allows user to see the failed download and potentially retry\n                if (mis.isInitialized() && mis.errCode == ERROR_NOTHING) {\n                    mis.resetState(true, true, ERROR_PROGRESS_LOST);\n                }\n            }\n\n            if (mis.psAlgorithm != null) {\n                mis.psAlgorithm.cleanupTemporalDir();\n                mis.psAlgorithm.setTemporalDir(tempDir);\n            }\n\n            mis.metadata = sub;\n            mis.maxRetry = mPrefMaxRetry;\n            mis.mHandler = mHandler;\n\n            mMissionsPending.add(mis);\n        }\n\n        if (mMissionsPending.size() > 1)\n            Collections.sort(mMissionsPending, Comparator.comparingLong(Mission::getTimestamp));\n    }\n\n    /**\n     * Start a new download mission\n     *\n     * @param mission the new download mission to add and run (if possible)\n     */\n    void startMission(DownloadMission mission) {\n        synchronized (this) {\n            mission.timestamp = System.currentTimeMillis();\n            mission.mHandler = mHandler;\n            mission.maxRetry = mPrefMaxRetry;\n\n            // create metadata file\n            while (true) {\n                mission.metadata = new File(mPendingMissionsDir, String.valueOf(mission.timestamp));\n                if (!mission.metadata.isFile() && !mission.metadata.exists()) {\n                    try {\n                        if (!mission.metadata.createNewFile())\n                            throw new RuntimeException(\"Cant create download metadata file\");\n                    } catch (IOException e) {\n                        throw new RuntimeException(e);\n                    }\n                    break;\n                }\n                mission.timestamp = System.currentTimeMillis();\n            }\n\n            mSelfMissionsControl = true;\n            mMissionsPending.add(mission);\n\n            // Before continue, save the metadata in case the internet connection is not available\n            Utility.writeToFile(mission.metadata, mission);\n\n            if (mission.storage == null) {\n                // noting to do here\n                mission.errCode = DownloadMission.ERROR_FILE_CREATION;\n                if (mission.errObject != null)\n                    mission.errObject = new IOException(\"DownloadMission.storage == NULL\");\n                return;\n            }\n\n            boolean start = !mPrefQueueLimit || getRunningMissionsCount() < 1;\n\n            if (canDownloadInCurrentNetwork() && start) {\n                mission.start();\n            }\n        }\n    }\n\n\n    public void resumeMission(DownloadMission mission) {\n        if (!mission.running) {\n            mission.start();\n        }\n    }\n\n    public void pauseMission(DownloadMission mission) {\n        if (mission.running) {\n            mission.setEnqueued(false);\n            mission.pause();\n        }\n    }\n\n    public void deleteMission(Mission mission, boolean alsoDeleteFile) {\n        synchronized (this) {\n            if (mission instanceof DownloadMission) {\n                mMissionsPending.remove(mission);\n            } else if (mission instanceof FinishedMission) {\n                mMissionsFinished.remove(mission);\n                mFinishedMissionStore.deleteMission(mission);\n            }\n\n            if (alsoDeleteFile) {\n                mission.delete();\n            }\n        }\n    }\n\n    public void forgetMission(StoredFileHelper storage) {\n        synchronized (this) {\n            Mission mission = getAnyMission(storage);\n            if (mission == null) return;\n\n            if (mission instanceof DownloadMission) {\n                mMissionsPending.remove(mission);\n            } else if (mission instanceof FinishedMission) {\n                mMissionsFinished.remove(mission);\n                mFinishedMissionStore.deleteMission(mission);\n            }\n\n            mission.storage = null;\n            mission.delete();\n        }\n    }\n\n    public void tryRecover(DownloadMission mission) {\n        StoredDirectoryHelper mainStorage = getMainStorage(mission.storage.getTag());\n\n        if (!mission.storage.isInvalid() && mission.storage.create()) return;\n\n        // using javaIO cannot recreate the file\n        // using SAF in older devices (no tree available)\n        //\n        // force the user to pick again the save path\n        mission.storage.invalidate();\n\n        if (mainStorage == null) return;\n\n        // if the user has changed the save path before this download, the original save path will be lost\n        StoredFileHelper newStorage = mainStorage.createFile(mission.storage.getName(), mission.storage.getType());\n\n        if (newStorage != null) mission.storage = newStorage;\n    }\n\n\n    /**\n     * Get a pending mission by its path\n     *\n     * @param storage where the file possible is stored\n     * @return the mission or null if no such mission exists\n     */\n    @Nullable\n    private DownloadMission getPendingMission(StoredFileHelper storage) {\n        for (DownloadMission mission : mMissionsPending) {\n            if (mission.storage.equals(storage)) {\n                return mission;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * Get the index into {@link #mMissionsFinished} of a finished mission by its path, return\n     * {@code -1} if there is no such mission. This function also checks if the matched mission's\n     * file exists, and, if it does not, the related mission is forgotten about (like in {@link\n     * #loadFinishedMissions()}) and {@code -1} is returned.\n     *\n     * @param storage where the file would be stored\n     * @return the mission index or -1 if no such mission exists\n     */\n    private int getFinishedMissionIndex(StoredFileHelper storage) {\n        for (int i = 0; i < mMissionsFinished.size(); i++) {\n            if (mMissionsFinished.get(i).storage.equals(storage)) {\n                // If the file does not exist the mission is not valid anymore. Also checking if\n                // length == 0 since the file picker may create an empty file before yielding it,\n                // but that does not mean the file really belonged to a previous mission.\n                if (!storage.existsAsFile() || storage.length() == 0) {\n                    if (DEBUG) {\n                        Log.d(TAG, \"matched downloaded file removed: \" + storage.getName());\n                    }\n\n                    mFinishedMissionStore.deleteMission(mMissionsFinished.get(i));\n                    mMissionsFinished.remove(i);\n                    return -1; // finished mission whose associated file was removed\n                }\n                return i;\n            }\n        }\n\n        return -1;\n    }\n\n    private Mission getAnyMission(StoredFileHelper storage) {\n        synchronized (this) {\n            Mission mission = getPendingMission(storage);\n            if (mission != null) return mission;\n\n            int idx = getFinishedMissionIndex(storage);\n            if (idx >= 0) return mMissionsFinished.get(idx);\n        }\n\n        return null;\n    }\n\n    int getRunningMissionsCount() {\n        int count = 0;\n        synchronized (this) {\n            for (DownloadMission mission : mMissionsPending) {\n                if (mission.running && !mission.isPsFailed() && !mission.isFinished())\n                    count++;\n            }\n        }\n\n        return count;\n    }\n\n    public void pauseAllMissions(boolean force) {\n        synchronized (this) {\n            for (DownloadMission mission : mMissionsPending) {\n                if (!mission.running || mission.isPsRunning() || mission.isFinished()) continue;\n\n                if (force) {\n                    // avoid waiting for threads\n                    mission.init = null;\n                    mission.threads = new Thread[0];\n                }\n\n                mission.pause();\n            }\n        }\n    }\n\n    public void startAllMissions() {\n        synchronized (this) {\n            for (DownloadMission mission : mMissionsPending) {\n                if (mission.running || mission.isCorrupt()) continue;\n\n                mission.start();\n            }\n        }\n    }\n\n    /**\n     * Set a pending download as finished\n     *\n     * @param mission the desired mission\n     */\n    void setFinished(DownloadMission mission) {\n        synchronized (this) {\n            mMissionsPending.remove(mission);\n            mMissionsFinished.add(0, new FinishedMission(mission));\n            mFinishedMissionStore.addFinishedMission(mission);\n        }\n    }\n\n    /**\n     * runs one or multiple missions in from queue if possible\n     *\n     * @return true if one or multiple missions are running, otherwise, false\n     */\n    boolean runMissions() {\n        synchronized (this) {\n            if (mMissionsPending.size() < 1) return false;\n            if (!canDownloadInCurrentNetwork()) return false;\n\n            if (mPrefQueueLimit) {\n                for (DownloadMission mission : mMissionsPending)\n                    if (!mission.isFinished() && mission.running) return true;\n            }\n\n            boolean flag = false;\n            for (DownloadMission mission : mMissionsPending) {\n                if (mission.running || !mission.enqueued || mission.isFinished())\n                    continue;\n\n                resumeMission(mission);\n                if (mission.errCode != ERROR_NOTHING) continue;\n\n                if (mPrefQueueLimit) return true;\n                flag = true;\n            }\n\n            return flag;\n        }\n    }\n\n    public MissionIterator getIterator() {\n        mSelfMissionsControl = true;\n        return new MissionIterator();\n    }\n\n    /**\n     * Forget all finished downloads, but, doesn't delete any file\n     */\n    public void forgetFinishedDownloads() {\n        synchronized (this) {\n            for (FinishedMission mission : mMissionsFinished) {\n                mFinishedMissionStore.deleteMission(mission);\n            }\n            mMissionsFinished.clear();\n        }\n    }\n\n    private boolean canDownloadInCurrentNetwork() {\n        if (mLastNetworkStatus == NetworkState.Unavailable) return false;\n        return !(mPrefMeteredDownloads && mLastNetworkStatus == NetworkState.MeteredOperating);\n    }\n\n    void handleConnectivityState(NetworkState currentStatus, boolean updateOnly) {\n        if (currentStatus == mLastNetworkStatus) return;\n\n        mLastNetworkStatus = currentStatus;\n        if (currentStatus == NetworkState.Unavailable) return;\n\n        if (!mSelfMissionsControl || updateOnly) {\n            return;// don't touch anything without the user interaction\n        }\n\n        boolean isMetered = mPrefMeteredDownloads && mLastNetworkStatus == NetworkState.MeteredOperating;\n\n        synchronized (this) {\n            for (DownloadMission mission : mMissionsPending) {\n                if (mission.isCorrupt() || mission.isPsRunning()) continue;\n\n                if (mission.running && isMetered) {\n                    mission.pause();\n                } else if (!mission.running && !isMetered && mission.enqueued) {\n                    mission.start();\n                    if (mPrefQueueLimit) break;\n                }\n            }\n        }\n    }\n\n    void updateMaximumAttempts() {\n        synchronized (this) {\n            for (DownloadMission mission : mMissionsPending) mission.maxRetry = mPrefMaxRetry;\n        }\n    }\n\n    public boolean canRecoverMission(DownloadMission mission) {\n        if (mission == null) return false;\n\n        // Can recover missions with progress lost or storage issues\n        return mission.errCode == ERROR_PROGRESS_LOST ||\n                mission.storage == null ||\n                !mission.storage.existsAsFile();\n    }\n\n    public MissionState checkForExistingMission(StoredFileHelper storage) {\n        synchronized (this) {\n            DownloadMission pending = getPendingMission(storage);\n\n            if (pending == null) {\n                if (getFinishedMissionIndex(storage) >= 0) return MissionState.Finished;\n            } else {\n                if (pending.isFinished()) {\n                    return MissionState.Finished;// this never should happen (race-condition)\n                } else {\n                    return pending.running ? MissionState.PendingRunning : MissionState.Pending;\n                }\n            }\n        }\n\n        return MissionState.None;\n    }\n\n    private static boolean isDirectoryAvailable(File directory) {\n        return directory != null && directory.canWrite() && directory.exists();\n    }\n\n    static File pickAvailableTemporalDir(@NonNull Context ctx) {\n        File dir = ctx.getExternalFilesDir(null);\n        if (isDirectoryAvailable(dir)) return dir;\n\n        dir = ctx.getFilesDir();\n        if (isDirectoryAvailable(dir)) return dir;\n\n        // this never should happen\n        dir = ctx.getDir(\"muxing_tmp\", Context.MODE_PRIVATE);\n        if (isDirectoryAvailable(dir)) return dir;\n\n        // fallback to cache dir\n        dir = ctx.getCacheDir();\n        if (isDirectoryAvailable(dir)) return dir;\n\n        throw new RuntimeException(\"Not temporal directories are available\");\n    }\n\n    @Nullable\n    private StoredDirectoryHelper getMainStorage(@NonNull String tag) {\n        if (tag.equals(TAG_AUDIO)) return mMainStorageAudio;\n        if (tag.equals(TAG_VIDEO)) return mMainStorageVideo;\n\n        Log.w(TAG, \"Unknown download category, not [audio video]: \" + tag);\n\n        return null;// this never should happen\n    }\n\n    public class MissionIterator extends DiffUtil.Callback {\n        final Object FINISHED = new Object();\n        final Object PENDING = new Object();\n\n        ArrayList<Object> snapshot;\n        ArrayList<Object> current;\n        ArrayList<Mission> hidden;\n\n        boolean hasFinished = false;\n\n        private MissionIterator() {\n            hidden = new ArrayList<>(2);\n            current = null;\n            snapshot = getSpecialItems();\n        }\n\n        private ArrayList<Object> getSpecialItems() {\n            synchronized (DownloadManager.this) {\n                ArrayList<Mission> pending = new ArrayList<>(mMissionsPending);\n                ArrayList<Mission> finished = new ArrayList<>(mMissionsFinished);\n                List<Mission> remove = new ArrayList<>(hidden);\n\n                // Don't hide recoverable missions\n                remove.removeIf(mission -> {\n                    if (mission instanceof DownloadMission dm && canRecoverMission(dm)) {\n                        return false; // Don't remove recoverable missions\n                    }\n                    return pending.remove(mission) || finished.remove(mission);\n                });\n\n                int fakeTotal = pending.size();\n                if (fakeTotal > 0) fakeTotal++;\n\n                fakeTotal += finished.size();\n                if (finished.size() > 0) fakeTotal++;\n\n                ArrayList<Object> list = new ArrayList<>(fakeTotal);\n                if (pending.size() > 0) {\n                    list.add(PENDING);\n                    list.addAll(pending);\n                }\n                if (finished.size() > 0) {\n                    list.add(FINISHED);\n                    list.addAll(finished);\n                }\n\n                hasFinished = finished.size() > 0;\n\n                return list;\n            }\n        }\n\n        public MissionItem getItem(int position) {\n            Object object = snapshot.get(position);\n\n            if (object == PENDING) return new MissionItem(SPECIAL_PENDING);\n            if (object == FINISHED) return new MissionItem(SPECIAL_FINISHED);\n\n            return new MissionItem(SPECIAL_NOTHING, (Mission) object);\n        }\n\n        public int getSpecialAtItem(int position) {\n            Object object = snapshot.get(position);\n\n            if (object == PENDING) return SPECIAL_PENDING;\n            if (object == FINISHED) return SPECIAL_FINISHED;\n\n            return SPECIAL_NOTHING;\n        }\n\n\n        public void start() {\n            current = getSpecialItems();\n        }\n\n        public void end() {\n            snapshot = current;\n            current = null;\n        }\n\n        public void hide(Mission mission) {\n            hidden.add(mission);\n        }\n\n        public void unHide(Mission mission) {\n            hidden.remove(mission);\n        }\n\n        public boolean hasFinishedMissions() {\n            return hasFinished;\n        }\n\n        /**\n         * Check if exists missions running and paused. Corrupted and hidden missions are not counted\n         *\n         * @return two-dimensional array contains the current missions state.\n         * 1° entry: true if has at least one mission running\n         * 2° entry: true if has at least one mission paused\n         */\n        public boolean[] hasValidPendingMissions() {\n            boolean running = false;\n            boolean paused = false;\n\n            synchronized (DownloadManager.this) {\n                for (DownloadMission mission : mMissionsPending) {\n                    if (hidden.contains(mission) || mission.isCorrupt())\n                        continue;\n\n                    if (mission.running)\n                        running = true;\n                    else\n                        paused = true;\n                }\n            }\n\n            return new boolean[]{running, paused};\n        }\n\n\n        @Override\n        public int getOldListSize() {\n            return snapshot.size();\n        }\n\n        @Override\n        public int getNewListSize() {\n            return current.size();\n        }\n\n        @Override\n        public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {\n            return snapshot.get(oldItemPosition) == current.get(newItemPosition);\n        }\n\n        @Override\n        public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {\n            Object x = snapshot.get(oldItemPosition);\n            Object y = current.get(newItemPosition);\n\n            if (x instanceof Mission && y instanceof Mission) {\n                return ((Mission) x).storage.equals(((Mission) y).storage);\n            }\n\n            return false;\n        }\n    }\n\n    public static class MissionItem {\n        public int special;\n        public Mission mission;\n\n        MissionItem(int s, Mission m) {\n            special = s;\n            mission = m;\n        }\n\n        MissionItem(int s) {\n            this(s, null);\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/service/DownloadManagerService.java",
    "content": "package us.shandian.giga.service;\n\nimport static org.schabi.newpipe.BuildConfig.APPLICATION_ID;\nimport static org.schabi.newpipe.BuildConfig.DEBUG;\n\nimport android.app.Notification;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.app.Service;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.net.ConnectivityManager;\nimport android.net.Network;\nimport android.net.NetworkInfo;\nimport android.net.NetworkRequest;\nimport android.net.Uri;\nimport android.os.Binder;\nimport android.os.Handler;\nimport android.os.Handler.Callback;\nimport android.os.IBinder;\nimport android.os.Message;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.annotation.StringRes;\nimport androidx.collection.SparseArrayCompat;\nimport androidx.core.app.NotificationCompat;\nimport androidx.core.app.NotificationCompat.Builder;\nimport androidx.core.app.PendingIntentCompat;\nimport androidx.core.app.ServiceCompat;\nimport androidx.core.content.ContextCompat;\nimport androidx.core.content.IntentCompat;\nimport androidx.preference.PreferenceManager;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.download.DownloadActivity;\nimport org.schabi.newpipe.extractor.stream.StreamInfo;\nimport org.schabi.newpipe.player.helper.LockManager;\nimport org.schabi.newpipe.streams.io.StoredDirectoryHelper;\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\nimport org.schabi.newpipe.util.Localization;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\nimport us.shandian.giga.get.DownloadMission;\nimport us.shandian.giga.get.MissionRecoveryInfo;\nimport us.shandian.giga.postprocessing.Postprocessing;\nimport us.shandian.giga.service.DownloadManager.NetworkState;\n\npublic class DownloadManagerService extends Service {\n\n    private static final String TAG = \"DownloadManagerService\";\n\n    public static final int MESSAGE_RUNNING = 0;\n    public static final int MESSAGE_PAUSED = 1;\n    public static final int MESSAGE_FINISHED = 2;\n    public static final int MESSAGE_ERROR = 3;\n    public static final int MESSAGE_DELETED = 4;\n\n    private static final int FOREGROUND_NOTIFICATION_ID = 1000;\n    private static final int DOWNLOADS_NOTIFICATION_ID = 1001;\n\n    private static final String EXTRA_URLS = \"DownloadManagerService.extra.urls\";\n    private static final String EXTRA_KIND = \"DownloadManagerService.extra.kind\";\n    private static final String EXTRA_THREADS = \"DownloadManagerService.extra.threads\";\n    private static final String EXTRA_POSTPROCESSING_NAME = \"DownloadManagerService.extra.postprocessingName\";\n    private static final String EXTRA_POSTPROCESSING_ARGS = \"DownloadManagerService.extra.postprocessingArgs\";\n    private static final String EXTRA_NEAR_LENGTH = \"DownloadManagerService.extra.nearLength\";\n    private static final String EXTRA_PATH = \"DownloadManagerService.extra.storagePath\";\n    private static final String EXTRA_PARENT_PATH = \"DownloadManagerService.extra.storageParentPath\";\n    private static final String EXTRA_STORAGE_TAG = \"DownloadManagerService.extra.storageTag\";\n    private static final String EXTRA_RECOVERY_INFO = \"DownloadManagerService.extra.recoveryInfo\";\n    private static final String EXTRA_STREAM_INFO = \"DownloadManagerService.extra.streamInfo\";\n\n    private static final String ACTION_RESET_DOWNLOAD_FINISHED = APPLICATION_ID + \".reset_download_finished\";\n    private static final String ACTION_OPEN_DOWNLOADS_FINISHED = APPLICATION_ID + \".open_downloads_finished\";\n\n    private DownloadManagerBinder mBinder;\n    private DownloadManager mManager;\n    private Notification mNotification;\n    private Handler mHandler;\n    private boolean mForeground = false;\n    private NotificationManager mNotificationManager = null;\n    private boolean mDownloadNotificationEnable = true;\n\n    private int downloadDoneCount = 0;\n    private Builder downloadDoneNotification = null;\n    private StringBuilder downloadDoneList = null;\n\n    private final List<Callback> mEchoObservers = new ArrayList<>(1);\n\n    private ConnectivityManager mConnectivityManager;\n    private ConnectivityManager.NetworkCallback mNetworkStateListenerL = null;\n\n    private SharedPreferences mPrefs = null;\n    private final OnSharedPreferenceChangeListener mPrefChangeListener = this::handlePreferenceChange;\n\n    private boolean mLockAcquired = false;\n    private LockManager mLock = null;\n\n    private int downloadFailedNotificationID = DOWNLOADS_NOTIFICATION_ID + 1;\n    private Builder downloadFailedNotification = null;\n    private final SparseArrayCompat<DownloadMission> mFailedDownloads =\n            new SparseArrayCompat<>(5);\n\n    private Bitmap icLauncher;\n    private Bitmap icDownloadDone;\n    private Bitmap icDownloadFailed;\n\n    private PendingIntent mOpenDownloadList;\n\n    /**\n     * notify media scanner on downloaded media file ...\n     *\n     * @param file the downloaded file uri\n     */\n    private void notifyMediaScanner(Uri file) {\n        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, file));\n    }\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        if (DEBUG) {\n            Log.d(TAG, \"onCreate\");\n        }\n\n        mBinder = new DownloadManagerBinder();\n        mHandler = new Handler(this::handleMessage);\n\n        mPrefs = PreferenceManager.getDefaultSharedPreferences(this);\n\n        mManager = new DownloadManager(this, mHandler, loadMainVideoStorage(), loadMainAudioStorage());\n\n        Intent openDownloadListIntent = new Intent(this, DownloadActivity.class)\n                .setAction(Intent.ACTION_MAIN);\n\n        mOpenDownloadList = PendingIntentCompat.getActivity(this, 0,\n                openDownloadListIntent,\n                PendingIntent.FLAG_UPDATE_CURRENT, false);\n\n        icLauncher = BitmapFactory.decodeResource(this.getResources(), R.mipmap.ic_launcher);\n\n        Builder builder = new Builder(this, getString(R.string.notification_channel_id))\n                .setContentIntent(mOpenDownloadList)\n                .setSmallIcon(android.R.drawable.stat_sys_download)\n                .setLargeIcon(icLauncher)\n                .setContentTitle(getString(R.string.msg_running))\n                .setContentText(getString(R.string.msg_running_detail));\n\n        mNotification = builder.build();\n\n        mNotificationManager = ContextCompat.getSystemService(this,\n                NotificationManager.class);\n        mConnectivityManager = ContextCompat.getSystemService(this,\n                ConnectivityManager.class);\n\n        mNetworkStateListenerL = new ConnectivityManager.NetworkCallback() {\n            @Override\n            public void onAvailable(Network network) {\n                handleConnectivityState(false);\n            }\n\n            @Override\n            public void onLost(Network network) {\n                handleConnectivityState(false);\n            }\n        };\n        mConnectivityManager.registerNetworkCallback(new NetworkRequest.Builder().build(), mNetworkStateListenerL);\n\n        mPrefs.registerOnSharedPreferenceChangeListener(mPrefChangeListener);\n\n        handlePreferenceChange(mPrefs, getString(R.string.downloads_cross_network));\n        handlePreferenceChange(mPrefs, getString(R.string.downloads_maximum_retry));\n        handlePreferenceChange(mPrefs, getString(R.string.downloads_queue_limit));\n\n        mLock = new LockManager(this);\n    }\n\n    @Override\n    public int onStartCommand(final Intent intent, int flags, int startId) {\n        if (DEBUG) {\n            Log.d(TAG, intent == null ? \"Restarting\" : \"Starting\");\n        }\n\n        if (intent == null) return START_NOT_STICKY;\n\n        Log.i(TAG, \"Got intent: \" + intent);\n        String action = intent.getAction();\n        if (action != null) {\n            if (action.equals(Intent.ACTION_RUN)) {\n                mHandler.post(() -> startMission(intent));\n            } else if (downloadDoneNotification != null) {\n                if (action.equals(ACTION_RESET_DOWNLOAD_FINISHED) || action.equals(ACTION_OPEN_DOWNLOADS_FINISHED)) {\n                    downloadDoneCount = 0;\n                    downloadDoneList.setLength(0);\n                }\n                if (action.equals(ACTION_OPEN_DOWNLOADS_FINISHED)) {\n                    startActivity(new Intent(this, DownloadActivity.class)\n                            .setAction(Intent.ACTION_MAIN)\n                            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)\n                    );\n                }\n                return START_NOT_STICKY;\n            }\n        }\n\n        return START_STICKY;\n    }\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n\n        if (DEBUG) {\n            Log.d(TAG, \"Destroying\");\n        }\n\n        ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE);\n\n        if (mNotificationManager != null && downloadDoneNotification != null) {\n            downloadDoneNotification.setDeleteIntent(null);// prevent NewPipe running when is killed, cleared from recent, etc\n            mNotificationManager.notify(DOWNLOADS_NOTIFICATION_ID, downloadDoneNotification.build());\n        }\n\n        manageLock(false);\n\n        mConnectivityManager.unregisterNetworkCallback(mNetworkStateListenerL);\n\n        mPrefs.unregisterOnSharedPreferenceChangeListener(mPrefChangeListener);\n\n        if (icDownloadDone != null) icDownloadDone.recycle();\n        if (icDownloadFailed != null) icDownloadFailed.recycle();\n        if (icLauncher != null) icLauncher.recycle();\n\n        mHandler = null;\n        mManager.pauseAllMissions(true);\n    }\n\n    @Override\n    public IBinder onBind(Intent intent) {\n        return mBinder;\n    }\n\n    private boolean handleMessage(@NonNull Message msg) {\n        if (mHandler == null) return true;\n\n        DownloadMission mission = (DownloadMission) msg.obj;\n\n        switch (msg.what) {\n            case MESSAGE_FINISHED:\n                notifyMediaScanner(mission.storage.getUri());\n                notifyFinishedDownload(mission.storage.getName());\n                mManager.setFinished(mission);\n                handleConnectivityState(false);\n                updateForegroundState(mManager.runMissions());\n                break;\n            case MESSAGE_RUNNING:\n                updateForegroundState(true);\n                break;\n            case MESSAGE_ERROR:\n                notifyFailedDownload(mission);\n                handleConnectivityState(false);\n                updateForegroundState(mManager.runMissions());\n                break;\n            case MESSAGE_PAUSED:\n                updateForegroundState(mManager.getRunningMissionsCount() > 0);\n                break;\n        }\n\n        if (msg.what != MESSAGE_ERROR)\n            mFailedDownloads.remove(mFailedDownloads.indexOfValue(mission));\n\n        for (Callback observer : mEchoObservers)\n            observer.handleMessage(msg);\n\n        return true;\n    }\n\n    private void handleConnectivityState(boolean updateOnly) {\n        NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();\n        NetworkState status;\n\n        if (info == null) {\n            status = NetworkState.Unavailable;\n            Log.i(TAG, \"Active network [connectivity is unavailable]\");\n        } else {\n            boolean connected = info.isConnected();\n            boolean metered = mConnectivityManager.isActiveNetworkMetered();\n\n            if (connected)\n                status = metered ? NetworkState.MeteredOperating : NetworkState.Operating;\n            else\n                status = NetworkState.Unavailable;\n\n            Log.i(TAG, \"Active network [connected=\" + connected + \" metered=\" + metered + \"] \" + info.toString());\n        }\n\n        if (mManager == null) return;// avoid race-conditions while the service is starting\n        mManager.handleConnectivityState(status, updateOnly);\n    }\n\n    private void handlePreferenceChange(SharedPreferences prefs, @NonNull String key) {\n        if (getString(R.string.downloads_maximum_retry).equals(key)) {\n            try {\n                String value = prefs.getString(key, getString(R.string.downloads_maximum_retry_default));\n                mManager.mPrefMaxRetry = value == null ? 0 : Integer.parseInt(value);\n            } catch (Exception e) {\n                mManager.mPrefMaxRetry = 0;\n            }\n            mManager.updateMaximumAttempts();\n        } else if (getString(R.string.downloads_cross_network).equals(key)) {\n            mManager.mPrefMeteredDownloads = prefs.getBoolean(key, false);\n        } else if (getString(R.string.downloads_queue_limit).equals(key)) {\n            mManager.mPrefQueueLimit = prefs.getBoolean(key, true);\n        } else if (getString(R.string.download_path_video_key).equals(key)) {\n            mManager.mMainStorageVideo = loadMainVideoStorage();\n        } else if (getString(R.string.download_path_audio_key).equals(key)) {\n            mManager.mMainStorageAudio = loadMainAudioStorage();\n        }\n    }\n\n    public void updateForegroundState(boolean state) {\n        if (state == mForeground) return;\n\n        if (state) {\n            startForeground(FOREGROUND_NOTIFICATION_ID, mNotification);\n        } else {\n            ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE);\n        }\n\n        manageLock(state);\n\n        mForeground = state;\n    }\n\n    /**\n     * Start a new download mission\n     *\n     * @param context      the activity context\n     * @param urls         array of urls to download\n     * @param storage      where the file is saved\n     * @param kind         type of file (a: audio  v: video  s: subtitle ?: file-extension defined)\n     * @param threads      the number of threads maximal used to download chunks of the file.\n     * @param psName       the name of the required post-processing algorithm, or {@code null} to ignore.\n     * @param streamInfo   stream metadata that may be written into the downloaded file.\n     * @param psArgs       the arguments for the post-processing algorithm.\n     * @param nearLength   the approximated final length of the file\n     * @param recoveryInfo array of MissionRecoveryInfo, in case is required recover the download\n     */\n    public static void startMission(Context context, String[] urls, StoredFileHelper storage,\n                                    char kind, int threads, StreamInfo streamInfo, String psName,\n                                    String[] psArgs, long nearLength,\n                                    ArrayList<MissionRecoveryInfo> recoveryInfo) {\n        final Intent intent = new Intent(context, DownloadManagerService.class)\n                .setAction(Intent.ACTION_RUN)\n                .putExtra(EXTRA_URLS, urls)\n                .putExtra(EXTRA_KIND, kind)\n                .putExtra(EXTRA_THREADS, threads)\n                .putExtra(EXTRA_POSTPROCESSING_NAME, psName)\n                .putExtra(EXTRA_POSTPROCESSING_ARGS, psArgs)\n                .putExtra(EXTRA_NEAR_LENGTH, nearLength)\n                .putExtra(EXTRA_RECOVERY_INFO, recoveryInfo)\n                .putExtra(EXTRA_PARENT_PATH, storage.getParentUri())\n                .putExtra(EXTRA_PATH, storage.getUri())\n                .putExtra(EXTRA_STORAGE_TAG, storage.getTag())\n                .putExtra(EXTRA_STREAM_INFO, streamInfo);\n\n        context.startService(intent);\n    }\n\n    private void startMission(Intent intent) {\n        String[] urls = intent.getStringArrayExtra(EXTRA_URLS);\n        Uri path = IntentCompat.getParcelableExtra(intent, EXTRA_PATH, Uri.class);\n        Uri parentPath = IntentCompat.getParcelableExtra(intent, EXTRA_PARENT_PATH, Uri.class);\n        int threads = intent.getIntExtra(EXTRA_THREADS, 1);\n        char kind = intent.getCharExtra(EXTRA_KIND, '?');\n        String psName = intent.getStringExtra(EXTRA_POSTPROCESSING_NAME);\n        String[] psArgs = intent.getStringArrayExtra(EXTRA_POSTPROCESSING_ARGS);\n        long nearLength = intent.getLongExtra(EXTRA_NEAR_LENGTH, 0);\n        String tag = intent.getStringExtra(EXTRA_STORAGE_TAG);\n        StreamInfo streamInfo = (StreamInfo)intent.getSerializableExtra(EXTRA_STREAM_INFO);\n        final var recovery = IntentCompat.getParcelableArrayListExtra(intent, EXTRA_RECOVERY_INFO,\n                MissionRecoveryInfo.class);\n        Objects.requireNonNull(recovery);\n\n        StoredFileHelper storage;\n        try {\n            storage = new StoredFileHelper(this, parentPath, path, tag);\n        } catch (IOException e) {\n            throw new RuntimeException(e);// this never should happen\n        }\n\n        Postprocessing ps;\n        if (psName == null)\n            ps = null;\n        else\n            ps = Postprocessing.getAlgorithm(psName, psArgs, streamInfo);\n\n        final DownloadMission mission = new DownloadMission(urls, storage, kind, ps);\n        mission.threadCount = threads;\n        mission.source = streamInfo.getUrl();\n        mission.nearLength = nearLength;\n        mission.recoveryInfo = recovery.toArray(new MissionRecoveryInfo[0]);\n\n        if (ps != null)\n            ps.setTemporalDir(DownloadManager.pickAvailableTemporalDir(this));\n\n        handleConnectivityState(true);// first check the actual network status\n\n        mManager.startMission(mission);\n    }\n\n    public void notifyFinishedDownload(String name) {\n        if (!mDownloadNotificationEnable || mNotificationManager == null) {\n            return;\n        }\n\n        if (downloadDoneNotification == null) {\n            downloadDoneList = new StringBuilder(name.length());\n\n            icDownloadDone = BitmapFactory.decodeResource(this.getResources(), android.R.drawable.stat_sys_download_done);\n            downloadDoneNotification = new Builder(this, getString(R.string.notification_channel_id))\n                    .setAutoCancel(true)\n                    .setLargeIcon(icDownloadDone)\n                    .setSmallIcon(android.R.drawable.stat_sys_download_done)\n                    .setDeleteIntent(makePendingIntent(ACTION_RESET_DOWNLOAD_FINISHED))\n                    .setContentIntent(makePendingIntent(ACTION_OPEN_DOWNLOADS_FINISHED));\n        }\n\n        downloadDoneCount++;\n        if (downloadDoneCount == 1) {\n            downloadDoneList.append(name);\n\n            downloadDoneNotification.setContentTitle(null);\n            downloadDoneNotification.setContentText(Localization.downloadCount(this, downloadDoneCount));\n            downloadDoneNotification.setStyle(new NotificationCompat.BigTextStyle()\n                    .setBigContentTitle(Localization.downloadCount(this, downloadDoneCount))\n                    .bigText(name)\n            );\n        } else {\n            downloadDoneList.append('\\n');\n            downloadDoneList.append(name);\n\n            downloadDoneNotification.setStyle(new NotificationCompat.BigTextStyle().bigText(downloadDoneList));\n            downloadDoneNotification.setContentTitle(Localization.downloadCount(this, downloadDoneCount));\n            downloadDoneNotification.setContentText(downloadDoneList);\n        }\n\n        mNotificationManager.notify(DOWNLOADS_NOTIFICATION_ID, downloadDoneNotification.build());\n    }\n\n    public void notifyFailedDownload(DownloadMission mission) {\n        if (!mDownloadNotificationEnable || mFailedDownloads.containsValue(mission)) return;\n\n        int id = downloadFailedNotificationID++;\n        mFailedDownloads.put(id, mission);\n\n        if (downloadFailedNotification == null) {\n            icDownloadFailed = BitmapFactory.decodeResource(this.getResources(), android.R.drawable.stat_sys_warning);\n            downloadFailedNotification = new Builder(this, getString(R.string.notification_channel_id))\n                    .setAutoCancel(true)\n                    .setLargeIcon(icDownloadFailed)\n                    .setSmallIcon(android.R.drawable.stat_sys_warning)\n                    .setContentIntent(mOpenDownloadList);\n        }\n\n        downloadFailedNotification.setContentTitle(getString(R.string.download_failed));\n        downloadFailedNotification.setContentText(mission.storage.getName());\n        downloadFailedNotification.setStyle(new NotificationCompat.BigTextStyle()\n                .bigText(mission.storage.getName()));\n\n        mNotificationManager.notify(id, downloadFailedNotification.build());\n    }\n\n    private PendingIntent makePendingIntent(String action) {\n        Intent intent = new Intent(this, DownloadManagerService.class).setAction(action);\n        return PendingIntentCompat.getService(this, intent.hashCode(), intent,\n                PendingIntent.FLAG_UPDATE_CURRENT, false);\n    }\n\n    private void manageLock(boolean acquire) {\n        if (acquire == mLockAcquired) return;\n\n        if (acquire)\n            mLock.acquireWifiAndCpu();\n        else\n            mLock.releaseWifiAndCpu();\n\n        mLockAcquired = acquire;\n    }\n\n    private StoredDirectoryHelper loadMainVideoStorage() {\n        return loadMainStorage(R.string.download_path_video_key, DownloadManager.TAG_VIDEO);\n    }\n\n    private StoredDirectoryHelper loadMainAudioStorage() {\n        return loadMainStorage(R.string.download_path_audio_key, DownloadManager.TAG_AUDIO);\n    }\n\n    private StoredDirectoryHelper loadMainStorage(@StringRes int prefKey, String tag) {\n        String path = mPrefs.getString(getString(prefKey), null);\n\n        if (path == null || path.isEmpty()) return null;\n\n        if (path.charAt(0) == File.separatorChar) {\n            Log.i(TAG, \"Old save path style present: \" + path);\n            path = \"\";\n            mPrefs.edit().putString(getString(prefKey), \"\").apply();\n        }\n\n        try {\n            return new StoredDirectoryHelper(this, Uri.parse(path), tag);\n        } catch (Exception e) {\n            Log.e(TAG, \"Failed to load the storage of \" + tag + \" from \" + path, e);\n            Toast.makeText(this, R.string.no_available_dir, Toast.LENGTH_LONG).show();\n        }\n\n        return null;\n    }\n\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n    // Wrappers for DownloadManager\n    ////////////////////////////////////////////////////////////////////////////////////////////////\n\n    public class DownloadManagerBinder extends Binder {\n        public DownloadManager getDownloadManager() {\n            return mManager;\n        }\n\n        @Nullable\n        public StoredDirectoryHelper getMainStorageVideo() {\n            return mManager.mMainStorageVideo;\n        }\n\n        @Nullable\n        public StoredDirectoryHelper getMainStorageAudio() {\n            return mManager.mMainStorageAudio;\n        }\n\n        public boolean askForSavePath() {\n            return DownloadManagerService.this.mPrefs.getBoolean(\n                    DownloadManagerService.this.getString(R.string.downloads_storage_ask),\n                    false\n            );\n        }\n\n        public void addMissionEventListener(Callback handler) {\n            mEchoObservers.add(handler);\n        }\n\n        public void removeMissionEventListener(Callback handler) {\n            mEchoObservers.remove(handler);\n        }\n\n        public void clearDownloadNotifications() {\n            if (mNotificationManager == null) return;\n            if (downloadDoneNotification != null) {\n                mNotificationManager.cancel(DOWNLOADS_NOTIFICATION_ID);\n                downloadDoneList.setLength(0);\n                downloadDoneCount = 0;\n            }\n            if (downloadFailedNotification != null) {\n                for (; downloadFailedNotificationID > DOWNLOADS_NOTIFICATION_ID; downloadFailedNotificationID--) {\n                    mNotificationManager.cancel(downloadFailedNotificationID);\n                }\n                mFailedDownloads.clear();\n                downloadFailedNotificationID++;\n            }\n        }\n\n        public void enableNotifications(boolean enable) {\n            mDownloadNotificationEnable = enable;\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/service/MissionState.java",
    "content": "package us.shandian.giga.service;\n\npublic enum MissionState {\n    None, Pending, PendingRunning, Finished\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java",
    "content": "package us.shandian.giga.ui.adapter;\n\nimport static android.content.Intent.FLAG_GRANT_PREFIX_URI_PERMISSION;\nimport static android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION;\nimport static android.content.Intent.createChooser;\nimport static us.shandian.giga.get.DownloadMission.ERROR_CONNECT_HOST;\nimport static us.shandian.giga.get.DownloadMission.ERROR_FILE_CREATION;\nimport static us.shandian.giga.get.DownloadMission.ERROR_HTTP_NO_CONTENT;\nimport static us.shandian.giga.get.DownloadMission.ERROR_INSUFFICIENT_STORAGE;\nimport static us.shandian.giga.get.DownloadMission.ERROR_NOTHING;\nimport static us.shandian.giga.get.DownloadMission.ERROR_PATH_CREATION;\nimport static us.shandian.giga.get.DownloadMission.ERROR_PERMISSION_DENIED;\nimport static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING;\nimport static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING_HOLD;\nimport static us.shandian.giga.get.DownloadMission.ERROR_POSTPROCESSING_STOPPED;\nimport static us.shandian.giga.get.DownloadMission.ERROR_PROGRESS_LOST;\nimport static us.shandian.giga.get.DownloadMission.ERROR_RESOURCE_GONE;\nimport static us.shandian.giga.get.DownloadMission.ERROR_SSL_EXCEPTION;\nimport static us.shandian.giga.get.DownloadMission.ERROR_TIMEOUT;\nimport static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_EXCEPTION;\nimport static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_HOST;\n\nimport android.annotation.SuppressLint;\nimport android.app.NotificationManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.graphics.Color;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Handler;\nimport android.os.Message;\nimport android.util.Log;\nimport android.view.HapticFeedbackConstants;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.webkit.MimeTypeMap;\nimport android.widget.ImageView;\nimport android.widget.PopupMenu;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.StringRes;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.core.app.NotificationCompat;\nimport androidx.core.content.ContextCompat;\nimport androidx.core.content.FileProvider;\nimport androidx.core.os.HandlerCompat;\nimport androidx.recyclerview.widget.DiffUtil;\nimport androidx.recyclerview.widget.RecyclerView;\nimport androidx.recyclerview.widget.RecyclerView.Adapter;\nimport androidx.recyclerview.widget.RecyclerView.ViewHolder;\n\nimport com.google.android.material.snackbar.Snackbar;\n\nimport org.schabi.newpipe.BuildConfig;\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.error.ErrorInfo;\nimport org.schabi.newpipe.error.ErrorUtil;\nimport org.schabi.newpipe.error.UserAction;\nimport org.schabi.newpipe.extractor.NewPipe;\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\nimport org.schabi.newpipe.util.Localization;\nimport org.schabi.newpipe.util.NavigationHelper;\nimport org.schabi.newpipe.util.external_communication.ShareUtils;\n\nimport java.io.File;\nimport java.net.URI;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Iterator;\nimport java.util.Date;\nimport java.util.Locale;\nimport java.text.DateFormat;\n\nimport io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;\nimport io.reactivex.rxjava3.core.Observable;\nimport io.reactivex.rxjava3.disposables.CompositeDisposable;\nimport io.reactivex.rxjava3.schedulers.Schedulers;\nimport us.shandian.giga.get.DownloadMission;\nimport us.shandian.giga.get.FinishedMission;\nimport us.shandian.giga.get.Mission;\nimport us.shandian.giga.get.MissionRecoveryInfo;\nimport us.shandian.giga.service.DownloadManager;\nimport us.shandian.giga.service.DownloadManagerService;\nimport us.shandian.giga.ui.common.Deleter;\nimport us.shandian.giga.ui.common.ProgressDrawable;\nimport us.shandian.giga.util.Utility;\n\npublic class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callback {\n    private static final String TAG = \"MissionAdapter\";\n    private static final String UNDEFINED_PROGRESS = \"--.-%\";\n    private static final String DEFAULT_MIME_TYPE = \"*/*\";\n    private static final String UNDEFINED_ETA = \"--:--\";\n\n    private static final String UPDATER = \"updater\";\n    private static final String DELETE = \"deleteFinishedDownloads\";\n\n    private static final int HASH_NOTIFICATION_ID = 123790;\n\n    private final Context mContext;\n    private final LayoutInflater mInflater;\n    private final DownloadManager mDownloadManager;\n    private final Deleter mDeleter;\n    private int mLayout;\n    private final DownloadManager.MissionIterator mIterator;\n    private final ArrayList<ViewHolderItem> mPendingDownloadsItems = new ArrayList<>();\n    private final Handler mHandler;\n    private MenuItem mClear;\n    private MenuItem mStartButton;\n    private MenuItem mPauseButton;\n    private final View mEmptyMessage;\n    private RecoverHelper mRecover;\n    private final View mView;\n    private final ArrayList<Mission> mHidden;\n    private Snackbar mSnackbar;\n\n    private final CompositeDisposable compositeDisposable = new CompositeDisposable();\n\n    public MissionAdapter(Context context, @NonNull DownloadManager downloadManager, View emptyMessage, View root) {\n        mContext = context;\n        mDownloadManager = downloadManager;\n\n        mInflater = LayoutInflater.from(mContext);\n        mLayout = R.layout.mission_item;\n\n        mHandler = new Handler(context.getMainLooper());\n\n        mEmptyMessage = emptyMessage;\n\n        mIterator = downloadManager.getIterator();\n\n        mDeleter = new Deleter(root, mContext, this, mDownloadManager, mIterator, mHandler);\n\n        mView = root;\n\n        mHidden = new ArrayList<>();\n\n        checkEmptyMessageVisibility();\n        onResume();\n    }\n\n    @Override\n    @NonNull\n    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {\n        switch (viewType) {\n            case DownloadManager.SPECIAL_PENDING:\n            case DownloadManager.SPECIAL_FINISHED:\n                return new ViewHolderHeader(mInflater.inflate(R.layout.missions_header, parent, false));\n        }\n\n        return new ViewHolderItem(mInflater.inflate(mLayout, parent, false));\n    }\n\n    @Override\n    public void onViewRecycled(@NonNull ViewHolder view) {\n        super.onViewRecycled(view);\n\n        if (view instanceof ViewHolderHeader) return;\n        ViewHolderItem h = (ViewHolderItem) view;\n\n        if (h.item.mission instanceof DownloadMission) {\n            mPendingDownloadsItems.remove(h);\n            if (mPendingDownloadsItems.size() < 1) {\n                checkMasterButtonsVisibility();\n            }\n        }\n\n        h.popupMenu.dismiss();\n        h.item = null;\n        h.resetSpeedMeasure();\n    }\n\n    @Override\n    @SuppressLint(\"SetTextI18n\")\n    public void onBindViewHolder(@NonNull ViewHolder view, @SuppressLint(\"RecyclerView\") int pos) {\n        DownloadManager.MissionItem item = mIterator.getItem(pos);\n\n        if (view instanceof ViewHolderHeader) {\n            if (item.special == DownloadManager.SPECIAL_NOTHING) return;\n            int str;\n            if (item.special == DownloadManager.SPECIAL_PENDING) {\n                str = R.string.missions_header_pending;\n            } else {\n                str = R.string.missions_header_finished;\n                if (mClear != null) mClear.setVisible(true);\n            }\n\n            ((ViewHolderHeader) view).header.setText(str);\n            return;\n        }\n\n        ViewHolderItem h = (ViewHolderItem) view;\n        h.item = item;\n\n        Utility.FileType type = Utility.getFileType(item.mission.kind, item.mission.storage.getName());\n\n        h.icon.setImageResource(Utility.getIconForFileType(type));\n        h.name.setText(item.mission.storage.getName());\n\n        h.progress.setColors(Utility.getBackgroundForFileType(mContext, type), Utility.getForegroundForFileType(mContext, type));\n\n        if (h.item.mission instanceof DownloadMission) {\n            DownloadMission mission = (DownloadMission) item.mission;\n            String length = Utility.formatBytes(mission.getLength());\n            if (mission.running && !mission.isPsRunning()) length += \" --.- kB/s\";\n\n            h.size.setText(length);\n            h.pause.setTitle(mission.unknownLength ? R.string.stop : R.string.pause);\n            updateProgress(h);\n            mPendingDownloadsItems.add(h);\n\n            h.date.setText(\"\");\n        } else {\n            h.progress.setMarquee(false);\n            h.status.setText(\"100%\");\n            h.progress.setProgress(1.0f);\n            h.size.setText(Utility.formatBytes(item.mission.length));\n\n            DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());\n            Date date = new Date(item.mission.timestamp);\n            h.date.setText(dateFormat.format(date));\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return mIterator.getOldListSize();\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        return mIterator.getSpecialAtItem(position);\n    }\n\n    @SuppressLint(\"DefaultLocale\")\n    private void updateProgress(ViewHolderItem h) {\n        if (h == null || h.item == null || h.item.mission instanceof FinishedMission) return;\n\n        DownloadMission mission = (DownloadMission) h.item.mission;\n        double done = mission.done;\n        long length = mission.getLength();\n        long now = System.currentTimeMillis();\n        boolean hasError = mission.errCode != ERROR_NOTHING;\n\n        // hide on error\n        // show if current resource length is not fetched\n        // show if length is unknown\n        h.progress.setMarquee(mission.isRecovering() || !hasError && (!mission.isInitialized() || mission.unknownLength));\n\n        double progress;\n        if (mission.unknownLength) {\n            progress = Double.NaN;\n            h.progress.setProgress(0.0f);\n        } else {\n            progress = done / length;\n        }\n\n        if (hasError) {\n            h.progress.setProgress(isNotFinite(progress) ? 1d : progress);\n            h.status.setText(R.string.msg_error);\n        } else if (isNotFinite(progress)) {\n            h.status.setText(UNDEFINED_PROGRESS);\n        } else {\n            h.status.setText(String.format(\"%.2f%%\", progress * 100));\n            h.progress.setProgress(progress);\n        }\n\n        @StringRes int state;\n        String sizeStr = Utility.formatBytes(length).concat(\"  \");\n\n        if (mission.isPsFailed() || mission.errCode == ERROR_POSTPROCESSING_HOLD) {\n            h.size.setText(sizeStr);\n            return;\n        } else if (!mission.running) {\n            state = mission.enqueued ? R.string.queued : R.string.paused;\n        } else if (mission.isPsRunning()) {\n            state = R.string.post_processing;\n        } else if (mission.isRecovering()) {\n            state = R.string.recovering;\n        } else {\n            state = 0;\n        }\n\n        if (state != 0) {\n            // update state without download speed\n            h.size.setText(sizeStr.concat(\"(\").concat(mContext.getString(state)).concat(\")\"));\n            h.resetSpeedMeasure();\n            return;\n        }\n\n        if (h.lastTimestamp < 0) {\n            h.size.setText(sizeStr);\n            h.lastTimestamp = now;\n            h.lastDone = done;\n            return;\n        }\n\n        long deltaTime = now - h.lastTimestamp;\n        double deltaDone = done - h.lastDone;\n\n        if (h.lastDone > done) {\n            h.lastDone = done;\n            h.size.setText(sizeStr);\n            return;\n        }\n\n        if (deltaDone > 0 && deltaTime > 0) {\n            float speed = (float) ((deltaDone * 1000d) / deltaTime);\n            float averageSpeed = speed;\n\n            if (h.lastSpeedIdx < 0) {\n                Arrays.fill(h.lastSpeed, speed);\n                h.lastSpeedIdx = 0;\n            } else {\n                for (int i = 0; i < h.lastSpeed.length; i++) {\n                    averageSpeed += h.lastSpeed[i];\n                }\n                averageSpeed /= h.lastSpeed.length + 1.0f;\n            }\n\n            String speedStr = Utility.formatSpeed(averageSpeed);\n            String etaStr;\n\n            if (mission.unknownLength) {\n                etaStr = \"\";\n            } else {\n                long eta = (long) Math.ceil((length - done) / averageSpeed);\n                etaStr = Utility.formatBytes((long) done) + \"/\" + Utility.stringifySeconds(eta) + \"  \";\n            }\n\n            h.size.setText(sizeStr.concat(etaStr).concat(speedStr));\n\n            h.lastTimestamp = now;\n            h.lastDone = done;\n            h.lastSpeed[h.lastSpeedIdx++] = speed;\n\n            if (h.lastSpeedIdx >= h.lastSpeed.length) h.lastSpeedIdx = 0;\n        }\n    }\n\n    private void viewWithFileProvider(Mission mission) {\n        if (checkInvalidFile(mission)) return;\n\n        String mimeType = resolveMimeType(mission);\n\n        if (BuildConfig.DEBUG)\n            Log.v(TAG, \"Mime: \" + mimeType + \" package: \" + BuildConfig.APPLICATION_ID + \".provider\");\n\n        Intent viewIntent = new Intent(Intent.ACTION_VIEW);\n        viewIntent.setDataAndType(resolveShareableUri(mission), mimeType);\n        viewIntent.addFlags(FLAG_GRANT_READ_URI_PERMISSION);\n        viewIntent.addFlags(FLAG_GRANT_PREFIX_URI_PERMISSION);\n\n        Intent chooserIntent = createChooser(viewIntent, null);\n        chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | FLAG_GRANT_READ_URI_PERMISSION);\n\n        ShareUtils.openIntentInApp(mContext, chooserIntent);\n    }\n\n    private void shareFile(Mission mission) {\n        if (checkInvalidFile(mission)) return;\n\n        final Intent shareIntent = new Intent(Intent.ACTION_SEND);\n        shareIntent.setType(resolveMimeType(mission));\n        shareIntent.putExtra(Intent.EXTRA_STREAM, resolveShareableUri(mission));\n        shareIntent.addFlags(FLAG_GRANT_READ_URI_PERMISSION);\n\n        final Intent intent = createChooser(shareIntent, null);\n        // unneeded to set a title to the chooser on Android P and higher because the system\n        // ignores this title on these versions\n        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) {\n            intent.putExtra(Intent.EXTRA_TITLE, mContext.getString(R.string.share_dialog_title));\n        }\n        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);\n        intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION);\n\n        mContext.startActivity(intent);\n    }\n\n    /**\n     * Returns an Uri which can be shared to other applications.\n     *\n     * @see <a href=\"https://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed\">\n     * https://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed</a>\n     */\n    private Uri resolveShareableUri(Mission mission) {\n        if (mission.storage.isDirect()) {\n            return FileProvider.getUriForFile(\n                mContext,\n                BuildConfig.APPLICATION_ID + \".provider\",\n                new File(URI.create(mission.storage.getUri().toString()))\n            );\n        } else {\n            return mission.storage.getUri();\n        }\n    }\n\n    private static String resolveMimeType(@NonNull Mission mission) {\n        String mimeType;\n\n        if (!mission.storage.isInvalid()) {\n            mimeType = mission.storage.getType();\n            if (mimeType != null && mimeType.length() > 0 && !mimeType.equals(StoredFileHelper.DEFAULT_MIME))\n                return mimeType;\n        }\n\n        String ext = Utility.getFileExt(mission.storage.getName());\n        if (ext == null) return DEFAULT_MIME_TYPE;\n\n        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext.substring(1));\n\n        return mimeType == null ? DEFAULT_MIME_TYPE : mimeType;\n    }\n\n    private boolean checkInvalidFile(@NonNull Mission mission) {\n        if (mission.storage.existsAsFile()) return false;\n\n        Toast.makeText(mContext, R.string.missing_file, Toast.LENGTH_SHORT).show();\n        return true;\n    }\n\n    private ViewHolderItem getViewHolder(Object mission) {\n        for (ViewHolderItem h : mPendingDownloadsItems) {\n            if (h.item.mission == mission) return h;\n        }\n        return null;\n    }\n\n    @Override\n    public boolean handleMessage(@NonNull Message msg) {\n        if (mStartButton != null && mPauseButton != null) {\n            checkMasterButtonsVisibility();\n        }\n\n        switch (msg.what) {\n            case DownloadManagerService.MESSAGE_ERROR:\n            case DownloadManagerService.MESSAGE_FINISHED:\n            case DownloadManagerService.MESSAGE_DELETED:\n            case DownloadManagerService.MESSAGE_PAUSED:\n                break;\n            default:\n                return false;\n        }\n\n        ViewHolderItem h = getViewHolder(msg.obj);\n        if (h == null) return false;\n\n        switch (msg.what) {\n            case DownloadManagerService.MESSAGE_FINISHED:\n            case DownloadManagerService.MESSAGE_DELETED:\n                // DownloadManager should mark the download as finished\n                applyChanges();\n                return true;\n        }\n\n        updateProgress(h);\n        return true;\n    }\n\n    private void showError(@NonNull DownloadMission mission) {\n        @StringRes int msg = R.string.general_error;\n        String msgEx = null;\n\n        switch (mission.errCode) {\n            case 416:\n                msg = R.string.error_http_unsupported_range;\n                break;\n            case 404:\n                msg = R.string.error_http_not_found;\n                break;\n            case ERROR_NOTHING:\n                return;// this never should happen\n            case ERROR_FILE_CREATION:\n                msg = R.string.error_file_creation;\n                break;\n            case ERROR_HTTP_NO_CONTENT:\n                msg = R.string.error_http_no_content;\n                break;\n            case ERROR_PATH_CREATION:\n                msg = R.string.error_path_creation;\n                break;\n            case ERROR_PERMISSION_DENIED:\n                msg = R.string.permission_denied;\n                break;\n            case ERROR_SSL_EXCEPTION:\n                msg = R.string.error_ssl_exception;\n                break;\n            case ERROR_UNKNOWN_HOST:\n                msg = R.string.error_unknown_host;\n                break;\n            case ERROR_CONNECT_HOST:\n                msg = R.string.error_connect_host;\n                break;\n            case ERROR_POSTPROCESSING_STOPPED:\n                msg = R.string.error_postprocessing_stopped;\n                break;\n            case ERROR_POSTPROCESSING:\n            case ERROR_POSTPROCESSING_HOLD:\n                showError(mission, UserAction.DOWNLOAD_POSTPROCESSING, R.string.error_postprocessing_failed);\n                return;\n            case ERROR_INSUFFICIENT_STORAGE:\n                msg = R.string.error_insufficient_storage_left;\n                break;\n            case ERROR_UNKNOWN_EXCEPTION:\n                if (mission.errObject != null) {\n                    showError(mission, UserAction.DOWNLOAD_FAILED, R.string.general_error);\n                    return;\n                } else {\n                    msg = R.string.msg_error;\n                    break;\n                }\n            case ERROR_PROGRESS_LOST:\n                msg = R.string.error_progress_lost;\n                break;\n            case ERROR_TIMEOUT:\n                msg = R.string.error_timeout;\n                break;\n            case ERROR_RESOURCE_GONE:\n                msg = R.string.error_download_resource_gone;\n                break;\n            default:\n                if (mission.errCode >= 100 && mission.errCode < 600) {\n                    msgEx = \"HTTP \" + mission.errCode;\n                } else if (mission.errObject == null) {\n                    msgEx = \"(not_decelerated_error_code)\";\n                } else {\n                    showError(mission, UserAction.DOWNLOAD_FAILED, msg);\n                    return;\n                }\n                break;\n        }\n\n        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);\n\n        if (msgEx != null)\n            builder.setMessage(msgEx);\n        else\n            builder.setMessage(msg);\n\n        // add report button for non-HTTP errors (range 100-599)\n        if (mission.errObject != null && (mission.errCode < 100 || mission.errCode >= 600)) {\n            @StringRes final int mMsg = msg;\n            builder.setPositiveButton(R.string.error_report_title, (dialog, which) ->\n                    showError(mission, UserAction.DOWNLOAD_FAILED, mMsg)\n            );\n        }\n\n        builder.setNegativeButton(R.string.ok, (dialog, which) -> dialog.cancel())\n                .setTitle(mission.storage.getName())\n                .show();\n    }\n\n    private void showError(DownloadMission mission, UserAction action, @StringRes int reason) {\n        StringBuilder request = new StringBuilder(256);\n        request.append(mission.source);\n\n        request.append(\" [\");\n        if (mission.recoveryInfo != null) {\n            for (MissionRecoveryInfo recovery : mission.recoveryInfo)\n                request.append(' ')\n                        .append(recovery.toString())\n                        .append(' ');\n        }\n        request.append(\"]\");\n\n        Integer service;\n        try {\n            service = NewPipe.getServiceByUrl(mission.source).getServiceId();\n        } catch (Exception e) {\n            service = null;\n        }\n\n        ErrorUtil.createNotification(mContext,\n                new ErrorInfo(ErrorInfo.Companion.throwableToStringList(mission.errObject), action,\n                        request.toString(), service, reason));\n    }\n\n    public void clearFinishedDownloads(boolean delete) {\n        if (delete && mIterator.hasFinishedMissions() && mHidden.isEmpty()) {\n            for (int i = 0; i < mIterator.getOldListSize(); i++) {\n                FinishedMission mission = mIterator.getItem(i).mission instanceof FinishedMission ? (FinishedMission) mIterator.getItem(i).mission : null;\n                if (mission != null) {\n                    mIterator.hide(mission);\n                    mHidden.add(mission);\n                }\n            }\n            applyChanges();\n\n            String msg = Localization.deletedDownloadCount(mContext, mHidden.size());\n            mSnackbar = Snackbar.make(mView, msg, Snackbar.LENGTH_INDEFINITE);\n            mSnackbar.setAction(R.string.undo, s -> {\n                Iterator<Mission> i = mHidden.iterator();\n                while (i.hasNext()) {\n                    mIterator.unHide(i.next());\n                    i.remove();\n                }\n                applyChanges();\n                mHandler.removeCallbacksAndMessages(DELETE);\n            });\n            mSnackbar.setActionTextColor(Color.YELLOW);\n            mSnackbar.show();\n\n            HandlerCompat.postDelayed(mHandler, this::deleteFinishedDownloads, DELETE, 5000);\n        } else if (!delete) {\n            mDownloadManager.forgetFinishedDownloads();\n            applyChanges();\n        }\n    }\n\n    private void deleteFinishedDownloads() {\n        if (mSnackbar != null) mSnackbar.dismiss();\n\n        Iterator<Mission> i = mHidden.iterator();\n        while (i.hasNext()) {\n            Mission mission = i.next();\n            if (mission != null) {\n                mDownloadManager.deleteMission(mission, true);\n                mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri()));\n            }\n            i.remove();\n        }\n    }\n\n    private boolean handlePopupItem(@NonNull ViewHolderItem h, @NonNull MenuItem option) {\n        if (h.item == null) return true;\n\n        int id = option.getItemId();\n        DownloadMission mission = h.item.mission instanceof DownloadMission ? (DownloadMission) h.item.mission : null;\n\n        if (mission != null) {\n            if (id == R.id.start) {\n                h.status.setText(UNDEFINED_PROGRESS);\n                mDownloadManager.resumeMission(mission);\n                return true;\n            } else if (id == R.id.pause) {\n                mDownloadManager.pauseMission(mission);\n                return true;\n            } else if (id == R.id.error_message_view) {\n                showError(mission);\n                return true;\n            } else if (id == R.id.queue) {\n                boolean flag = !h.queue.isChecked();\n                h.queue.setChecked(flag);\n                mission.setEnqueued(flag);\n                updateProgress(h);\n                return true;\n            } else if (id == R.id.retry) {\n                if (mission.isPsRunning()) {\n                    mission.psContinue(true);\n                } else {\n                    mDownloadManager.tryRecover(mission);\n                    if (mission.storage.isInvalid())\n                        mRecover.tryRecover(mission);\n                    else\n                        recoverMission(mission);\n                }\n                return true;\n            } else if (id == R.id.cancel) {\n                mission.psContinue(false);\n                return false;\n            }\n        }\n\n        if (id == R.id.menu_item_share) {\n            shareFile(h.item.mission);\n            return true;\n        } else if (id == R.id.delete) {// delete the entry and the file\n            mDeleter.append(h.item.mission, true);\n            applyChanges();\n            checkMasterButtonsVisibility();\n            return true;\n        } else if (id == R.id.delete_entry) {// just delete the entry\n            mDeleter.append(h.item.mission, false);\n            applyChanges();\n            checkMasterButtonsVisibility();\n            return true;\n        } else if (id == R.id.md5 || id == R.id.sha1) {\n            final StoredFileHelper storage = h.item.mission.storage;\n            if (!storage.existsAsFile()) {\n                Toast.makeText(mContext, R.string.missing_file, Toast.LENGTH_SHORT).show();\n                mDeleter.append(h.item.mission, true);\n                applyChanges();\n                return true;\n            }\n            final NotificationManager notificationManager\n                    = ContextCompat.getSystemService(mContext, NotificationManager.class);\n            final NotificationCompat.Builder progressNotificationBuilder\n                    = new NotificationCompat.Builder(mContext,\n                    mContext.getString(R.string.hash_channel_id))\n                    .setPriority(NotificationCompat.PRIORITY_HIGH)\n                    .setSmallIcon(R.drawable.ic_newpipe_triangle_white)\n                    .setContentTitle(mContext.getString(R.string.msg_calculating_hash))\n                    .setContentText(mContext.getString(R.string.msg_wait))\n                    .setProgress(0, 0, true)\n                    .setOngoing(true);\n\n            notificationManager.notify(HASH_NOTIFICATION_ID, progressNotificationBuilder\n                    .build());\n            compositeDisposable.add(\n                    Observable.fromCallable(() -> Utility.checksum(storage, id))\n                            .subscribeOn(Schedulers.computation())\n                            .observeOn(AndroidSchedulers.mainThread())\n                            .subscribe(result -> {\n                                ShareUtils.copyToClipboard(mContext, result);\n                                notificationManager.cancel(HASH_NOTIFICATION_ID);\n                            })\n            );\n            return true;\n        } else if (id == R.id.source) {\n            try {\n                Intent intent = NavigationHelper.getIntentByLink(mContext, h.item.mission.source);\n                intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);\n                mContext.startActivity(intent);\n            } catch (Exception e) {\n                Log.w(TAG, \"Selected item has a invalid source\", e);\n            }\n            return true;\n        }\n        return false;\n    }\n\n    public void applyChanges() {\n        mIterator.start();\n        DiffUtil.calculateDiff(mIterator, true).dispatchUpdatesTo(this);\n        mIterator.end();\n\n        checkEmptyMessageVisibility();\n        if (mClear != null) mClear.setVisible(mIterator.hasFinishedMissions());\n    }\n\n    public void forceUpdate() {\n        mIterator.start();\n        mIterator.end();\n\n        for (ViewHolderItem item : mPendingDownloadsItems) {\n            item.resetSpeedMeasure();\n        }\n\n        notifyDataSetChanged();\n    }\n\n    public void setLinear(boolean isLinear) {\n        mLayout = isLinear ? R.layout.mission_item_linear : R.layout.mission_item;\n    }\n\n    public void setClearButton(MenuItem clearButton) {\n        if (mClear == null)\n            clearButton.setVisible(mIterator.hasFinishedMissions());\n\n        mClear = clearButton;\n    }\n\n    public void setMasterButtons(MenuItem startButton, MenuItem pauseButton) {\n        boolean init = mStartButton == null || mPauseButton == null;\n\n        mStartButton = startButton;\n        mPauseButton = pauseButton;\n\n        if (init) checkMasterButtonsVisibility();\n    }\n\n    private void checkEmptyMessageVisibility() {\n        int flag = mIterator.getOldListSize() > 0 ? View.GONE : View.VISIBLE;\n        if (mEmptyMessage.getVisibility() != flag) mEmptyMessage.setVisibility(flag);\n    }\n\n    public void checkMasterButtonsVisibility() {\n        boolean[] state = mIterator.hasValidPendingMissions();\n        Log.d(TAG, \"checkMasterButtonsVisibility() running=\" + state[0] + \" paused=\" + state[1]);\n        setButtonVisible(mPauseButton, state[0]);\n        setButtonVisible(mStartButton, state[1]);\n    }\n\n    private static void setButtonVisible(MenuItem button, boolean visible) {\n        if (button.isVisible() != visible)\n            button.setVisible(visible);\n    }\n\n    public void refreshMissionItems() {\n        for (ViewHolderItem h : mPendingDownloadsItems) {\n            if (((DownloadMission) h.item.mission).running) continue;\n            updateProgress(h);\n            h.resetSpeedMeasure();\n        }\n    }\n\n    public void onDestroy() {\n        compositeDisposable.dispose();\n        mDeleter.dispose();\n    }\n\n    public void onResume() {\n        mDeleter.resume();\n        HandlerCompat.postDelayed(mHandler, this::updater, UPDATER, 0);\n    }\n\n    public void onPaused() {\n        mDeleter.pause();\n        mHandler.removeCallbacksAndMessages(UPDATER);\n    }\n\n    public void recoverMission(DownloadMission mission) {\n        ViewHolderItem h = getViewHolder(mission);\n        if (h == null) return;\n\n        mission.errObject = null;\n        mission.resetState(true, false, DownloadMission.ERROR_NOTHING);\n\n        h.status.setText(UNDEFINED_PROGRESS);\n        h.size.setText(Utility.formatBytes(mission.getLength()));\n        h.progress.setMarquee(true);\n\n        mDownloadManager.resumeMission(mission);\n    }\n\n    private void updater() {\n        for (ViewHolderItem h : mPendingDownloadsItems) {\n            // check if the mission is running first\n            if (!((DownloadMission) h.item.mission).running) continue;\n\n            updateProgress(h);\n        }\n\n        HandlerCompat.postDelayed(mHandler, this::updater, UPDATER, 1000);\n    }\n\n    private boolean isNotFinite(double value) {\n        return Double.isNaN(value) || Double.isInfinite(value);\n    }\n\n    public void setRecover(@NonNull RecoverHelper callback) {\n        mRecover = callback;\n    }\n\n\n    class ViewHolderItem extends RecyclerView.ViewHolder {\n        DownloadManager.MissionItem item;\n\n        TextView status;\n        ImageView icon;\n        TextView name;\n        TextView size;\n        TextView date;\n        ProgressDrawable progress;\n\n        PopupMenu popupMenu;\n        MenuItem retry;\n        MenuItem cancel;\n        MenuItem start;\n        MenuItem pause;\n        MenuItem open;\n        MenuItem queue;\n        MenuItem showError;\n        MenuItem delete;\n        MenuItem source;\n        MenuItem checksum;\n\n        long lastTimestamp = -1;\n        double lastDone;\n        int lastSpeedIdx;\n        float[] lastSpeed = new float[3];\n        String estimatedTimeArrival = UNDEFINED_ETA;\n\n        ViewHolderItem(View view) {\n            super(view);\n\n            progress = new ProgressDrawable();\n            itemView.findViewById(R.id.item_bkg).setBackground(progress);\n\n            status = itemView.findViewById(R.id.item_status);\n            name = itemView.findViewById(R.id.item_name);\n            icon = itemView.findViewById(R.id.item_icon);\n            size = itemView.findViewById(R.id.item_size);\n            date = itemView.findViewById(R.id.item_date);\n\n            name.setSelected(true);\n\n            ImageView button = itemView.findViewById(R.id.item_more);\n            popupMenu = buildPopup(button);\n            button.setOnClickListener(v -> showPopupMenu());\n\n            Menu menu = popupMenu.getMenu();\n            retry = menu.findItem(R.id.retry);\n            cancel = menu.findItem(R.id.cancel);\n            start = menu.findItem(R.id.start);\n            pause = menu.findItem(R.id.pause);\n            open = menu.findItem(R.id.menu_item_share);\n            queue = menu.findItem(R.id.queue);\n            showError = menu.findItem(R.id.error_message_view);\n            delete = menu.findItem(R.id.delete);\n            source = menu.findItem(R.id.source);\n            checksum = menu.findItem(R.id.checksum);\n\n            itemView.setHapticFeedbackEnabled(true);\n\n            itemView.setOnClickListener(v -> {\n                if (item.mission instanceof FinishedMission)\n                    viewWithFileProvider(item.mission);\n            });\n\n            itemView.setOnLongClickListener(v -> {\n                v.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);\n                showPopupMenu();\n                return true;\n            });\n        }\n\n        private void showPopupMenu() {\n            retry.setVisible(false);\n            cancel.setVisible(false);\n            start.setVisible(false);\n            pause.setVisible(false);\n            open.setVisible(false);\n            queue.setVisible(false);\n            showError.setVisible(false);\n            delete.setVisible(false);\n            source.setVisible(false);\n            checksum.setVisible(false);\n\n            DownloadMission mission = item.mission instanceof DownloadMission ? (DownloadMission) item.mission : null;\n\n            if (mission != null) {\n                if (mission.hasInvalidStorage()) {\n                    retry.setVisible(true);\n                    delete.setVisible(true);\n                    showError.setVisible(true);\n                } else if (mission.isPsRunning()) {\n                    switch (mission.errCode) {\n                        case ERROR_INSUFFICIENT_STORAGE:\n                        case ERROR_POSTPROCESSING_HOLD:\n                            retry.setVisible(true);\n                            cancel.setVisible(true);\n                            showError.setVisible(true);\n                            break;\n                    }\n                } else {\n                    if (mission.running) {\n                        pause.setVisible(true);\n                    } else {\n                        if (mission.errCode != ERROR_NOTHING) {\n                            showError.setVisible(true);\n                        }\n\n                        queue.setChecked(mission.enqueued);\n\n                        delete.setVisible(true);\n\n                        boolean flag = !mission.isPsFailed() && mission.urls.length > 0;\n                        start.setVisible(flag);\n                        queue.setVisible(flag);\n                    }\n                }\n            } else {\n                open.setVisible(true);\n                delete.setVisible(true);\n                checksum.setVisible(true);\n            }\n\n            if (item.mission.source != null && !item.mission.source.isEmpty()) {\n                source.setVisible(true);\n            }\n\n            popupMenu.show();\n        }\n\n        private PopupMenu buildPopup(final View button) {\n            PopupMenu popup = new PopupMenu(mContext, button);\n            popup.inflate(R.menu.mission);\n            popup.setOnMenuItemClickListener(option -> handlePopupItem(this, option));\n\n            return popup;\n        }\n\n        private void resetSpeedMeasure() {\n            estimatedTimeArrival = UNDEFINED_ETA;\n            lastTimestamp = -1;\n            lastSpeedIdx = -1;\n        }\n    }\n\n    static class ViewHolderHeader extends RecyclerView.ViewHolder {\n        TextView header;\n\n        ViewHolderHeader(View view) {\n            super(view);\n            header = itemView.findViewById(R.id.item_name);\n        }\n    }\n\n    public interface RecoverHelper {\n        void tryRecover(DownloadMission mission);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/ui/common/Deleter.java",
    "content": "package us.shandian.giga.ui.common;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.graphics.Color;\nimport android.os.Handler;\nimport android.view.View;\n\nimport androidx.core.os.HandlerCompat;\n\nimport com.google.android.material.snackbar.Snackbar;\n\nimport org.schabi.newpipe.R;\n\nimport java.util.ArrayList;\nimport java.util.Optional;\n\nimport kotlin.Pair;\nimport us.shandian.giga.get.FinishedMission;\nimport us.shandian.giga.get.Mission;\nimport us.shandian.giga.service.DownloadManager;\nimport us.shandian.giga.service.DownloadManager.MissionIterator;\nimport us.shandian.giga.ui.adapter.MissionAdapter;\n\npublic class Deleter {\n    private static final String COMMIT = \"commit\";\n    private static final String NEXT = \"next\";\n    private static final String SHOW = \"show\";\n\n    private static final int TIMEOUT = 5000;// ms\n    private static final int DELAY = 350;// ms\n    private static final int DELAY_RESUME = 400;// ms\n\n    private Snackbar snackbar;\n    // list of missions to be deleted, and whether to also delete the corresponding file\n    private ArrayList<Pair<Mission, Boolean>> items;\n    private boolean running = true;\n\n    private final Context mContext;\n    private final MissionAdapter mAdapter;\n    private final DownloadManager mDownloadManager;\n    private final MissionIterator mIterator;\n    private final Handler mHandler;\n    private final View mView;\n\n    public Deleter(View v, Context c, MissionAdapter a, DownloadManager d, MissionIterator i, Handler h) {\n        mView = v;\n        mContext = c;\n        mAdapter = a;\n        mDownloadManager = d;\n        mIterator = i;\n        mHandler = h;\n\n        items = new ArrayList<>(2);\n    }\n\n    public void append(Mission item, boolean alsoDeleteFile) {\n        /* If a mission is removed from the list while the Snackbar for a previously\n         * removed item is still showing, commit the action for the previous item\n         * immediately. This prevents Snackbars from stacking up in reverse order.\n         */\n        mHandler.removeCallbacksAndMessages(COMMIT);\n        commit();\n\n        mIterator.hide(item);\n        items.add(0, new Pair<>(item, alsoDeleteFile));\n\n        show();\n    }\n\n    private void forget() {\n        mIterator.unHide(items.remove(0).getFirst());\n        mAdapter.applyChanges();\n\n        show();\n    }\n\n    private void show() {\n        if (items.size() < 1) return;\n\n        pause();\n        running = true;\n\n        HandlerCompat.postDelayed(mHandler, this::next, NEXT, DELAY);\n    }\n\n    private void next() {\n        if (items.size() < 1) return;\n\n        final Optional<String> fileToBeDeleted = items.stream()\n                .filter(Pair::getSecond)\n                .map(p -> p.getFirst().storage.getName())\n                .findFirst();\n\n        String msg;\n        if (fileToBeDeleted.isPresent()) {\n            msg = mContext.getString(R.string.file_deleted)\n                    .concat(\":\\n\")\n                    .concat(fileToBeDeleted.get());\n        } else {\n            msg = mContext.getString(R.string.entry_deleted);\n        }\n\n        snackbar = Snackbar.make(mView, msg, Snackbar.LENGTH_INDEFINITE);\n        snackbar.setAction(R.string.undo, s -> forget());\n        snackbar.setActionTextColor(Color.YELLOW);\n        snackbar.show();\n\n        HandlerCompat.postDelayed(mHandler, this::commit, COMMIT, TIMEOUT);\n    }\n\n    private void commit() {\n        if (items.size() < 1) return;\n\n        while (items.size() > 0) {\n            Pair<Mission, Boolean> missionAndAlsoDeleteFile = items.remove(0);\n            Mission mission = missionAndAlsoDeleteFile.getFirst();\n            boolean alsoDeleteFile = missionAndAlsoDeleteFile.getSecond();\n            if (mission.deleted) continue;\n\n            mIterator.unHide(mission);\n            mDownloadManager.deleteMission(mission, alsoDeleteFile);\n\n            if (mission instanceof FinishedMission) {\n                mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, mission.storage.getUri()));\n            }\n            break;\n        }\n\n        if (items.size() < 1) {\n            pause();\n            return;\n        }\n\n        show();\n    }\n\n    public void pause() {\n        running = false;\n        mHandler.removeCallbacksAndMessages(NEXT);\n        mHandler.removeCallbacksAndMessages(SHOW);\n        mHandler.removeCallbacksAndMessages(COMMIT);\n        if (snackbar != null) snackbar.dismiss();\n    }\n\n    public void resume() {\n        if (!running) {\n            HandlerCompat.postDelayed(mHandler, this::show, SHOW, DELAY_RESUME);\n        }\n    }\n\n    public void dispose() {\n        if (items.size() < 1) return;\n\n        pause();\n\n        for (Pair<Mission, Boolean> missionAndAlsoDeleteFile : items) {\n            Mission mission = missionAndAlsoDeleteFile.getFirst();\n            boolean alsoDeleteFile = missionAndAlsoDeleteFile.getSecond();\n            mDownloadManager.deleteMission(mission, alsoDeleteFile);\n        }\n        items = null;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/ui/common/ProgressDrawable.java",
    "content": "package us.shandian.giga.ui.common;\n\nimport android.graphics.Canvas;\nimport android.graphics.ColorFilter;\nimport android.graphics.Paint;\nimport android.graphics.Path;\nimport android.graphics.PixelFormat;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport android.os.Handler;\nimport android.os.Looper;\n\nimport androidx.annotation.ColorInt;\nimport androidx.annotation.NonNull;\n\npublic class ProgressDrawable extends Drawable {\n    private static final int MARQUEE_INTERVAL = 150;\n\n    private float mProgress;\n    private int mBackgroundColor, mForegroundColor;\n    private Handler mMarqueeHandler;\n    private float mMarqueeProgress;\n    private Path mMarqueeLine;\n    private int mMarqueeSize;\n    private long mMarqueeNext;\n\n    public ProgressDrawable() {\n        mMarqueeLine = null;// marquee disabled\n        mMarqueeProgress = 0.0f;\n        mMarqueeSize = 0;\n        mMarqueeNext = 0;\n    }\n\n    public void setColors(@ColorInt int background, @ColorInt int foreground) {\n        mBackgroundColor = background;\n        mForegroundColor = foreground;\n    }\n\n    public void setProgress(double progress) {\n        mProgress = (float) progress;\n        invalidateSelf();\n    }\n\n    public void setMarquee(boolean marquee) {\n        if (marquee == (mMarqueeLine != null)) {\n            return;\n        }\n        mMarqueeLine = marquee ? new Path() : null;\n        mMarqueeHandler = marquee ? new Handler(Looper.getMainLooper()) : null;\n        mMarqueeSize = 0;\n        mMarqueeNext = 0;\n    }\n\n    @Override\n    public void draw(@NonNull Canvas canvas) {\n        int width = getBounds().width();\n        int height = getBounds().height();\n\n        Paint paint = new Paint();\n\n        paint.setColor(mBackgroundColor);\n        canvas.drawRect(0, 0, width, height, paint);\n\n        paint.setColor(mForegroundColor);\n\n        if (mMarqueeLine != null) {\n            if (mMarqueeSize < 1) setupMarquee(width, height);\n\n            int size = mMarqueeSize;\n            Paint paint2 = new Paint();\n            paint2.setColor(mForegroundColor);\n            paint2.setStrokeWidth(size);\n            paint2.setStyle(Paint.Style.STROKE);\n\n            size *= 2;\n\n            if (mMarqueeProgress >= size) {\n                mMarqueeProgress = 1;\n            } else {\n                mMarqueeProgress++;\n            }\n\n            // render marquee\n            width += size * 2;\n            Path marquee = new Path();\n            for (int i = -size; i < width; i += size) {\n                marquee.addPath(mMarqueeLine, ((float)i + mMarqueeProgress), 0);\n            }\n            marquee.close();\n\n            canvas.drawPath(marquee, paint2);// draw marquee\n\n            if (System.currentTimeMillis() >= mMarqueeNext) {\n                // program next update\n                mMarqueeNext = System.currentTimeMillis() + MARQUEE_INTERVAL;\n                mMarqueeHandler.postDelayed(this::invalidateSelf, MARQUEE_INTERVAL);\n            }\n            return;\n        }\n\n        canvas.drawRect(0, 0, (int) (mProgress * width), height, paint);\n    }\n\n    @Override\n    public void setAlpha(int alpha) {\n        // Unsupported\n    }\n\n    @Override\n    public void setColorFilter(ColorFilter filter) {\n        // Unsupported\n    }\n\n    @Override\n    public int getOpacity() {\n        return PixelFormat.OPAQUE;\n    }\n\n    @Override\n    public void onBoundsChange(Rect rect) {\n        if (mMarqueeLine != null) setupMarquee(rect.width(), rect.height());\n    }\n\n    private void setupMarquee(int width, int height) {\n        mMarqueeSize = (int) ((width * 10.0f) / 100.0f);// the size is 10% of the width\n\n        mMarqueeLine.rewind();\n        mMarqueeLine.moveTo(-mMarqueeSize, -mMarqueeSize);\n        mMarqueeLine.lineTo(-mMarqueeSize * 4, height + mMarqueeSize);\n        mMarqueeLine.close();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/ui/common/ToolbarActivity.java",
    "content": "package us.shandian.giga.ui.common;\n\nimport android.os.Bundle;\n\nimport androidx.appcompat.app.AppCompatActivity;\nimport androidx.appcompat.widget.Toolbar;\n\nimport org.schabi.newpipe.R;\n\npublic abstract class ToolbarActivity extends AppCompatActivity {\n    protected Toolbar mToolbar;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(getLayoutResource());\n\n        mToolbar = this.findViewById(R.id.toolbar);\n\n        setSupportActionBar(mToolbar);\n    }\n\n    protected abstract int getLayoutResource();\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java",
    "content": "package us.shandian.giga.ui.fragment;\n\nimport android.app.Activity;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.ServiceConnection;\nimport android.content.SharedPreferences;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Environment;\nimport android.os.IBinder;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Toast;\n\nimport androidx.activity.result.ActivityResult;\nimport androidx.activity.result.ActivityResultLauncher;\nimport androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult;\nimport androidx.annotation.NonNull;\nimport androidx.appcompat.app.AlertDialog;\nimport androidx.fragment.app.Fragment;\nimport androidx.preference.PreferenceManager;\nimport androidx.recyclerview.widget.GridLayoutManager;\nimport androidx.recyclerview.widget.LinearLayoutManager;\nimport androidx.recyclerview.widget.RecyclerView;\n\nimport com.nononsenseapps.filepicker.Utils;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.settings.NewPipeSettings;\nimport org.schabi.newpipe.streams.io.NoFileManagerSafeGuard;\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\nimport org.schabi.newpipe.util.FilePickerActivityHelper;\n\nimport java.io.File;\nimport java.io.IOException;\n\nimport us.shandian.giga.get.DownloadMission;\nimport us.shandian.giga.service.DownloadManager;\nimport us.shandian.giga.service.DownloadManagerService;\nimport us.shandian.giga.service.DownloadManagerService.DownloadManagerBinder;\nimport us.shandian.giga.ui.adapter.MissionAdapter;\n\npublic class MissionsFragment extends Fragment {\n\n    private static final String TAG = \"MissionsFragment\";\n    private static final int SPAN_SIZE = 2;\n\n    private SharedPreferences mPrefs;\n    private boolean mLinear;\n    private MenuItem mSwitch;\n    private MenuItem mClear = null;\n    private MenuItem mStart = null;\n    private MenuItem mPause = null;\n\n    private RecyclerView mList;\n    private View mEmpty;\n    private MissionAdapter mAdapter;\n    private GridLayoutManager mGridManager;\n    private LinearLayoutManager mLinearManager;\n    private Context mContext;\n\n    private DownloadManagerBinder mBinder;\n    private boolean mForceUpdate;\n\n    private DownloadMission unsafeMissionTarget = null;\n    private final ActivityResultLauncher<Intent> requestDownloadSaveAsLauncher =\n            registerForActivityResult(new StartActivityForResult(), this::requestDownloadSaveAsResult);\n    private final ServiceConnection mConnection = new ServiceConnection() {\n\n        @Override\n        public void onServiceConnected(ComponentName name, IBinder binder) {\n            mBinder = (DownloadManagerBinder) binder;\n            mBinder.clearDownloadNotifications();\n\n            mAdapter = new MissionAdapter(mContext, mBinder.getDownloadManager(), mEmpty, getView());\n\n            mAdapter.setRecover(MissionsFragment.this::recoverMission);\n\n            setAdapterButtons();\n\n            mBinder.addMissionEventListener(mAdapter);\n            mBinder.enableNotifications(false);\n\n            updateList();\n        }\n\n        @Override\n        public void onServiceDisconnected(ComponentName name) {\n            // What to do?\n        }\n\n\n    };\n\n    @Override\n    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        View v = inflater.inflate(R.layout.missions, container, false);\n\n        mPrefs = PreferenceManager.getDefaultSharedPreferences(requireActivity());\n        mLinear = mPrefs.getBoolean(\"linear\", false);\n\n        // Bind the service\n        mContext.bindService(new Intent(mContext, DownloadManagerService.class), mConnection, Context.BIND_AUTO_CREATE);\n\n        // Views\n        mEmpty = v.findViewById(R.id.list_empty_view);\n        mList = v.findViewById(R.id.mission_recycler);\n\n        // Init layouts managers\n        mGridManager = new GridLayoutManager(getActivity(), SPAN_SIZE);\n        mGridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {\n            @Override\n            public int getSpanSize(int position) {\n                switch (mAdapter.getItemViewType(position)) {\n                    case DownloadManager.SPECIAL_PENDING:\n                    case DownloadManager.SPECIAL_FINISHED:\n                        return SPAN_SIZE;\n                    default:\n                        return 1;\n                }\n            }\n        });\n        mLinearManager = new LinearLayoutManager(getActivity());\n\n        setHasOptionsMenu(true);\n\n        return v;\n    }\n\n    /**\n     * Added in API level 23.\n     */\n    @Override\n    public void onAttach(@NonNull Context context) {\n        super.onAttach(context);\n\n        // Bug: in api< 23 this is never called\n        // so mActivity=null\n        // so app crashes with null-pointer exception\n        mContext = context;\n    }\n\n    /**\n     * deprecated in API level 23,\n     * but must remain to allow compatibility with api<23\n     */\n    @SuppressWarnings(\"deprecation\")\n    @Override\n    public void onAttach(@NonNull Activity activity) {\n        super.onAttach(activity);\n\n        mContext = activity;\n    }\n\n\n    @Override\n    public void onDestroy() {\n        super.onDestroy();\n        if (mBinder == null || mAdapter == null) return;\n\n        mBinder.removeMissionEventListener(mAdapter);\n        mBinder.enableNotifications(true);\n        mContext.unbindService(mConnection);\n        mAdapter.onDestroy();\n\n        mBinder = null;\n        mAdapter = null;\n    }\n\n    @Override\n    public void onPrepareOptionsMenu(Menu menu) {\n        mSwitch = menu.findItem(R.id.switch_mode);\n        mClear = menu.findItem(R.id.clear_list);\n        mStart = menu.findItem(R.id.start_downloads);\n        mPause = menu.findItem(R.id.pause_downloads);\n\n        if (mAdapter != null) setAdapterButtons();\n\n        super.onPrepareOptionsMenu(menu);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        int itemId = item.getItemId();\n        if (itemId == R.id.switch_mode) {\n            mLinear = !mLinear;\n            updateList();\n            return true;\n        } else if (itemId == R.id.clear_list) {\n            showClearDownloadHistoryPrompt();\n            return true;\n        } else if (itemId == R.id.start_downloads) {\n            mBinder.getDownloadManager().startAllMissions();\n            return true;\n        } else if (itemId == R.id.pause_downloads) {\n            mBinder.getDownloadManager().pauseAllMissions(false);\n            mAdapter.refreshMissionItems();// update items view\n\n            return super.onOptionsItemSelected(item);\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    public void showClearDownloadHistoryPrompt() {\n        // ask the user whether he wants to just clear history or instead delete files on disk\n        new AlertDialog.Builder(mContext)\n                .setTitle(R.string.clear_download_history)\n                .setMessage(R.string.confirm_prompt)\n                // Intentionally misusing buttons' purpose in order to achieve good order\n                .setNegativeButton(R.string.clear_download_history, (dialog, which) ->\n                        mAdapter.clearFinishedDownloads(false))\n                .setNeutralButton(R.string.cancel, null)\n                .setPositiveButton(R.string.delete_downloaded_files, (dialog, which) ->\n                        showDeleteDownloadedFilesConfirmationPrompt())\n                .show();\n    }\n\n    public void showDeleteDownloadedFilesConfirmationPrompt() {\n        // make sure the user confirms once more before deleting files on disk\n        new AlertDialog.Builder(mContext)\n                .setTitle(R.string.delete_downloaded_files_confirm)\n                .setNegativeButton(R.string.cancel, null)\n                .setPositiveButton(R.string.ok, (dialog, which) ->\n                        mAdapter.clearFinishedDownloads(true))\n                .show();\n    }\n\n    private void updateList() {\n        if (mLinear) {\n            mList.setLayoutManager(mLinearManager);\n        } else {\n            mList.setLayoutManager(mGridManager);\n        }\n\n        // destroy all created views in the recycler\n        mList.setAdapter(null);\n        mAdapter.notifyDataSetChanged();\n\n        // re-attach the adapter in grid/lineal mode\n        mAdapter.setLinear(mLinear);\n        mList.setAdapter(mAdapter);\n\n        if (mSwitch != null) {\n            mSwitch.setIcon(mLinear\n                            ? R.drawable.ic_apps\n                            : R.drawable.ic_list);\n            mSwitch.setTitle(mLinear ? R.string.grid : R.string.list);\n            mPrefs.edit().putBoolean(\"linear\", mLinear).apply();\n        }\n    }\n\n    private void setAdapterButtons() {\n        if (mClear == null || mStart == null || mPause == null) return;\n\n        mAdapter.setClearButton(mClear);\n        mAdapter.setMasterButtons(mStart, mPause);\n    }\n\n    private void recoverMission(@NonNull DownloadMission mission) {\n        unsafeMissionTarget = mission;\n\n        final Uri initialPath;\n        if (NewPipeSettings.useStorageAccessFramework(mContext)) {\n            initialPath = null;\n        } else {\n            final File initialSavePath;\n            if (DownloadManager.TAG_AUDIO.equals(mission.storage.getType())) {\n                initialSavePath = NewPipeSettings.getDir(Environment.DIRECTORY_MUSIC);\n            } else {\n                initialSavePath = NewPipeSettings.getDir(Environment.DIRECTORY_MOVIES);\n            }\n            initialPath = Uri.parse(initialSavePath.getAbsolutePath());\n        }\n\n        NoFileManagerSafeGuard.launchSafe(\n                requestDownloadSaveAsLauncher,\n                StoredFileHelper.getNewPicker(mContext, mission.storage.getName(),\n                        mission.storage.getType(), initialPath),\n                TAG,\n                mContext\n        );\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n\n        if (mAdapter != null) {\n            mAdapter.onResume();\n\n            if (mForceUpdate) {\n                mForceUpdate = false;\n                mAdapter.forceUpdate();\n            }\n\n            mBinder.addMissionEventListener(mAdapter);\n            mAdapter.checkMasterButtonsVisibility();\n        }\n        if (mBinder != null) mBinder.enableNotifications(false);\n    }\n\n    @Override\n    public void onPause() {\n        super.onPause();\n\n        if (mAdapter != null) {\n            mForceUpdate = true;\n            mBinder.removeMissionEventListener(mAdapter);\n            mAdapter.onPaused();\n        }\n\n        if (mBinder != null) mBinder.enableNotifications(true);\n    }\n\n    private void requestDownloadSaveAsResult(final ActivityResult result) {\n        if (result.getResultCode() != Activity.RESULT_OK) {\n            return;\n        }\n\n        if (unsafeMissionTarget == null || result.getData() == null) {\n            return;\n        }\n\n        try {\n            Uri fileUri = result.getData().getData();\n            if (fileUri.getAuthority() != null && FilePickerActivityHelper.isOwnFileUri(mContext, fileUri)) {\n                fileUri = Uri.fromFile(Utils.getFileForUri(fileUri));\n            }\n\n            String tag = unsafeMissionTarget.storage.getTag();\n            unsafeMissionTarget.storage = new StoredFileHelper(mContext, null, fileUri, tag);\n            mAdapter.recoverMission(unsafeMissionTarget);\n        } catch (IOException e) {\n            Toast.makeText(mContext, R.string.general_error, Toast.LENGTH_LONG).show();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/us/shandian/giga/util/Utility.java",
    "content": "package us.shandian.giga.util;\n\nimport android.content.Context;\nimport android.os.Build;\nimport android.os.Environment;\nimport android.os.StatFs;\nimport android.util.Log;\n\nimport androidx.annotation.ColorInt;\nimport androidx.annotation.DrawableRes;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\nimport androidx.core.content.ContextCompat;\n\nimport com.google.android.exoplayer2.util.Util;\n\nimport org.schabi.newpipe.R;\nimport org.schabi.newpipe.streams.io.SharpInputStream;\nimport org.schabi.newpipe.streams.io.StoredFileHelper;\n\nimport java.io.BufferedOutputStream;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.io.Serializable;\nimport java.net.HttpURLConnection;\nimport java.util.Locale;\n\nimport okio.ByteString;\n\npublic class Utility {\n\n    public enum FileType {\n        VIDEO,\n        MUSIC,\n        SUBTITLE,\n        UNKNOWN\n    }\n\n    public static String formatBytes(long bytes) {\n        Locale locale = Locale.getDefault();\n        if (bytes < 1024) {\n            return String.format(locale, \"%d B\", bytes);\n        } else if (bytes < 1024 * 1024) {\n            return String.format(locale, \"%.2f kB\", bytes / 1024d);\n        } else if (bytes < 1024 * 1024 * 1024) {\n            return String.format(locale, \"%.2f MB\", bytes / 1024d / 1024d);\n        } else {\n            return String.format(locale, \"%.2f GB\", bytes / 1024d / 1024d / 1024d);\n        }\n    }\n\n    public static String formatSpeed(double speed) {\n        Locale locale = Locale.getDefault();\n        if (speed < 1024) {\n            return String.format(locale, \"%.2f B/s\", speed);\n        } else if (speed < 1024 * 1024) {\n            return String.format(locale, \"%.2f kB/s\", speed / 1024);\n        } else if (speed < 1024 * 1024 * 1024) {\n            return String.format(locale, \"%.2f MB/s\", speed / 1024 / 1024);\n        } else {\n            return String.format(locale, \"%.2f GB/s\", speed / 1024 / 1024 / 1024);\n        }\n    }\n\n    public static void writeToFile(@NonNull File file, @NonNull Serializable serializable) {\n\n        try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file)))) {\n            objectOutputStream.writeObject(serializable);\n        } catch (Exception e) {\n            //nothing to do\n        }\n        //nothing to do\n    }\n\n    @Nullable\n    @SuppressWarnings(\"unchecked\")\n    public static <T> T readFromFile(File file) {\n        T object;\n\n        try (ObjectInputStream objectInputStream =\n                     new ObjectInputStream(new FileInputStream(file))) {\n            object = (T) objectInputStream.readObject();\n        } catch (Exception e) {\n            Log.e(\"Utility\", \"Failed to deserialize the object\", e);\n            object = null;\n        }\n\n        return object;\n    }\n\n    @Nullable\n    public static String getFileExt(String url) {\n        int index;\n        if ((index = url.indexOf(\"?\")) > -1) {\n            url = url.substring(0, index);\n        }\n\n        index = url.lastIndexOf(\".\");\n        if (index == -1) {\n            return null;\n        } else {\n            String ext = url.substring(index);\n            if ((index = ext.indexOf(\"%\")) > -1) {\n                ext = ext.substring(0, index);\n            }\n            if ((index = ext.indexOf(\"/\")) > -1) {\n                ext = ext.substring(0, index);\n            }\n            return ext.toLowerCase();\n        }\n    }\n\n    public static FileType getFileType(char kind, String file) {\n        switch (kind) {\n            case 'v':\n                return FileType.VIDEO;\n            case 'a':\n                return FileType.MUSIC;\n            case 's':\n                return FileType.SUBTITLE;\n            //default '?':\n        }\n\n        if (file.endsWith(\".srt\") || file.endsWith(\".vtt\") || file.endsWith(\".ssa\")) {\n            return FileType.SUBTITLE;\n        } else if (file.endsWith(\".mp3\") || file.endsWith(\".wav\") || file.endsWith(\".flac\") || file.endsWith(\".m4a\") || file.endsWith(\".opus\")) {\n            return FileType.MUSIC;\n        } else if (file.endsWith(\".mp4\") || file.endsWith(\".mpeg\") || file.endsWith(\".rm\") || file.endsWith(\".rmvb\")\n                || file.endsWith(\".flv\") || file.endsWith(\".webp\") || file.endsWith(\".webm\")) {\n            return FileType.VIDEO;\n        }\n\n        return FileType.UNKNOWN;\n    }\n\n    @ColorInt\n    public static int getBackgroundForFileType(Context ctx, FileType type) {\n        int colorRes;\n        switch (type) {\n            case MUSIC:\n                colorRes = R.color.audio_left_to_load_color;\n                break;\n            case VIDEO:\n                colorRes = R.color.video_left_to_load_color;\n                break;\n            case SUBTITLE:\n                colorRes = R.color.subtitle_left_to_load_color;\n                break;\n            default:\n                colorRes = R.color.gray;\n        }\n\n        return ContextCompat.getColor(ctx, colorRes);\n    }\n\n    @ColorInt\n    public static int getForegroundForFileType(Context ctx, FileType type) {\n        int colorRes;\n        switch (type) {\n            case MUSIC:\n                colorRes = R.color.audio_already_load_color;\n                break;\n            case VIDEO:\n                colorRes = R.color.video_already_load_color;\n                break;\n            case SUBTITLE:\n                colorRes = R.color.subtitle_already_load_color;\n                break;\n            default:\n                colorRes = R.color.gray;\n                break;\n        }\n\n        return ContextCompat.getColor(ctx, colorRes);\n    }\n\n    @DrawableRes\n    public static int getIconForFileType(FileType type) {\n        switch (type) {\n            case MUSIC:\n                return R.drawable.ic_headset;\n            default:\n            case VIDEO:\n                return R.drawable.ic_movie;\n            case SUBTITLE:\n                return R.drawable.ic_subtitles;\n        }\n    }\n\n    public static String checksum(final StoredFileHelper source, final int algorithmId)\n            throws IOException {\n        ByteString byteString;\n        try (var inputStream = new SharpInputStream(source.getStream())) {\n            byteString = ByteString.of(Util.toByteArray(inputStream));\n        }\n        if (algorithmId == R.id.md5) {\n            byteString = byteString.md5();\n        } else if (algorithmId == R.id.sha1) {\n            byteString = byteString.sha1();\n        }\n        return byteString.hex();\n    }\n\n    @SuppressWarnings(\"ResultOfMethodCallIgnored\")\n    public static boolean mkdir(File p, boolean allDirs) {\n        if (p.exists()) return true;\n\n        if (allDirs)\n            p.mkdirs();\n        else\n            p.mkdir();\n\n        return p.exists();\n    }\n\n    public static long getContentLength(HttpURLConnection connection) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n            return connection.getContentLengthLong();\n        }\n\n        try {\n            return Long.parseLong(connection.getHeaderField(\"Content-Length\"));\n        } catch (Exception err) {\n            // nothing to do\n        }\n\n        return -1;\n    }\n\n    /**\n     * Get the content length of the entire file even if the HTTP response is partial\n     * (response code 206).\n     * @param connection http connection\n     * @return content length\n     */\n    public static long getTotalContentLength(final HttpURLConnection connection) {\n        try {\n            if (connection.getResponseCode() == 206) {\n                final String rangeStr = connection.getHeaderField(\"Content-Range\");\n                final String bytesStr = rangeStr.split(\"/\", 2)[1];\n                return Long.parseLong(bytesStr);\n            } else {\n                return getContentLength(connection);\n            }\n        } catch (Exception err) {\n            // nothing to do\n        }\n\n        return -1;\n    }\n\n    private static String pad(int number) {\n        return number < 10 ? (\"0\" + number) : String.valueOf(number);\n    }\n\n    public static String stringifySeconds(final long seconds) {\n        final int h = (int) Math.floorDiv(seconds, 3600);\n        final int m = (int) Math.floorDiv(seconds - (h * 3600L), 60);\n        final int s = (int) (seconds - (h * 3600) - (m * 60));\n\n        String str = \"\";\n\n        if (h < 1 && m < 1) {\n            str = \"00:\";\n        } else {\n            if (h > 0) str = pad(h) + \":\";\n            if (m > 0) str += pad(m) + \":\";\n        }\n\n        return str + pad(s);\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/animator/custom_fade_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <objectAnimator\n        android:duration=\"120\"\n        android:interpolator=\"@android:interpolator/accelerate_decelerate\"\n        android:propertyName=\"alpha\"\n        android:valueFrom=\"0.0f\"\n        android:valueTo=\"1.0f\" />\n</set>\n"
  },
  {
    "path": "app/src/main/res/animator/custom_fade_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <objectAnimator\n        android:duration=\"120\"\n        android:interpolator=\"@android:interpolator/accelerate_decelerate\"\n        android:propertyName=\"alpha\"\n        android:valueFrom=\"1.0f\"\n        android:valueTo=\"0.0f\" />\n</set>\n"
  },
  {
    "path": "app/src/main/res/drawable/background_oval_black_transparent.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"oval\">\n    <solid android:color=\"#64000000\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/dashed_border_black.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@color/black_border_color\"\n        android:dashWidth=\"4dp\"\n        android:dashGap=\"4dp\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/dashed_border_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@color/dark_border_color\"\n        android:dashWidth=\"4dp\"\n        android:dashGap=\"4dp\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/dashed_border_light.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@color/light_border_color\"\n        android:dashWidth=\"4dp\"\n        android:dashGap=\"4dp\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/drawer_header_bottom_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <gradient\n        android:angle=\"90\"\n        android:endColor=\"#00000000\"\n        android:startColor=\"#4D000000\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_add.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_add_circle_outline.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M13,7h-2v4L7,11v2h4v4h2v-4h4v-2h-4L13,7zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_apps.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_arrow_back.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_arrow_drop_down.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M7,10l5,5 5,-5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_arrow_drop_up.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M7,14l5,-5 5,5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_art_track.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M22,13h-8v-2h8v2zM22,7h-8v2h8L22,7zM14,17h8v-2h-8v2zM12,9v6c0,1.1 -0.9,2 -2,2L4,17c-1.1,0 -2,-0.9 -2,-2L2,9c0,-1.1 0.9,-2 2,-2h6c1.1,0 2,0.9 2,2zM10.5,15l-2.25,-3 -1.75,2.26 -1.25,-1.51L3.5,15h7z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_asterisk.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10,2H14L13.21,9.91L19.66,5.27L21.66,8.73L14.42,12L21.66,15.27L19.66,18.73L13.21,14.09L14,22H10L10.79,14.09L4.34,18.73L2.34,15.27L9.58,12L2.34,8.73L4.34,5.27L10.79,9.91L10,2Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_attach_money.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11.8,10.9c-2.27,-0.59 -3,-1.2 -3,-2.15 0,-1.09 1.01,-1.85 2.7,-1.85 1.78,0 2.44,0.85 2.5,2.1h2.21c-0.07,-1.72 -1.12,-3.3 -3.21,-3.81V3h-3v2.16c-1.94,0.42 -3.5,1.68 -3.5,3.61 0,2.31 1.91,3.46 4.7,4.13 2.5,0.6 3,1.48 3,2.41 0,0.69 -0.49,1.79 -2.7,1.79 -2.06,0 -2.87,-0.92 -2.98,-2.1h-2.2c0.12,2.19 1.76,3.42 3.68,3.83V21h3v-2.15c1.95,-0.37 3.5,-1.5 3.5,-3.55 0,-2.84 -2.43,-3.81 -4.7,-4.4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_backup.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM14,13v4h-4v-4H7l5,-5 5,5h-3z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_bookmark.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M17,3H7c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_bookmark_white.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/white\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M17,3H7c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_brightness_high.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,8.69L20,4h-4.69L12,0.69 8.69,4L4,4v4.69L0.69,12 4,15.31L4,20h4.69L12,23.31 15.31,20L20,20v-4.69L23.31,12 20,8.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_brightness_low.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,15.31L23.31,12 20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_brightness_medium.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,15.31L23.31,12 20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69zM12,18V6c3.31,0 6,2.69 6,6s-2.69,6 -6,6z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_bug_report.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_campaign.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M18,11v2h4v-2h-4zM16,17.61c0.96,0.71 2.21,1.65 3.2,2.39 0.4,-0.53 0.8,-1.07 1.2,-1.6 -0.99,-0.74 -2.24,-1.68 -3.2,-2.4 -0.4,0.54 -0.8,1.08 -1.2,1.61zM20.4,5.6c-0.4,-0.53 -0.8,-1.07 -1.2,-1.6 -0.99,0.74 -2.24,1.68 -3.2,2.4 0.4,0.53 0.8,1.07 1.2,1.6 0.96,-0.72 2.21,-1.65 3.2,-2.4zM4,9c-1.1,0 -2,0.9 -2,2v2c0,1.1 0.9,2 2,2h1v4h2v-4h1l5,3L13,6L8,9L4,9zM15.5,12c0,-1.33 -0.58,-2.53 -1.5,-3.35v6.69c0.92,-0.81 1.5,-2.01 1.5,-3.34z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_cast.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M21,3L3,3c-1.1,0 -2,0.9 -2,2v3h2L3,5h18v14h-7v2h7c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM1,18v3h3c0,-1.66 -1.34,-3 -3,-3zM1,14v2c2.76,0 5,2.24 5,5h2c0,-3.87 -3.13,-7 -7,-7zM1,10v2c4.97,0 9,4.03 9,9h2c0,-6.08 -4.93,-11 -11,-11z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_checklist.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M22,7h-9v2h9V7zM22,15h-9v2h9V15zM5.54,11L2,7.46l1.41,-1.41l2.12,2.12l4.24,-4.24l1.41,1.41L5.54,11zM5.54,19L2,15.46l1.41,-1.41l2.12,2.12l4.24,-4.24l1.41,1.41L5.54,19z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_child_care.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M14.5,10.5m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M9.5,10.5m-1.25,0a1.25,1.25 0,1 1,2.5 0a1.25,1.25 0,1 1,-2.5 0\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M22.94,12.66c0.04,-0.21 0.06,-0.43 0.06,-0.66s-0.02,-0.45 -0.06,-0.66c-0.25,-1.51 -1.36,-2.74 -2.81,-3.17 -0.53,-1.12 -1.28,-2.1 -2.19,-2.91C16.36,3.85 14.28,3 12,3s-4.36,0.85 -5.94,2.26c-0.92,0.81 -1.67,1.8 -2.19,2.91 -1.45,0.43 -2.56,1.65 -2.81,3.17 -0.04,0.21 -0.06,0.43 -0.06,0.66s0.02,0.45 0.06,0.66c0.25,1.51 1.36,2.74 2.81,3.17 0.52,1.11 1.27,2.09 2.17,2.89C7.62,20.14 9.71,21 12,21s4.38,-0.86 5.97,-2.28c0.9,-0.8 1.65,-1.79 2.17,-2.89 1.44,-0.43 2.55,-1.65 2.8,-3.17zM19,14c-0.1,0 -0.19,-0.02 -0.29,-0.03 -0.2,0.67 -0.49,1.29 -0.86,1.86C16.6,17.74 14.45,19 12,19s-4.6,-1.26 -5.85,-3.17c-0.37,-0.57 -0.66,-1.19 -0.86,-1.86 -0.1,0.01 -0.19,0.03 -0.29,0.03 -1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2c0.1,0 0.19,0.02 0.29,0.03 0.2,-0.67 0.49,-1.29 0.86,-1.86C7.4,6.26 9.55,5 12,5s4.6,1.26 5.85,3.17c0.37,0.57 0.66,1.19 0.86,1.86 0.1,-0.01 0.19,-0.03 0.29,-0.03 1.1,0 2,0.9 2,2s-0.9,2 -2,2zM7.5,14c0.76,1.77 2.49,3 4.5,3s3.74,-1.23 4.5,-3h-9z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_circle.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportHeight=\"24\"\n    android:viewportWidth=\"24\"\n    android:tint=\"@color/defaultIconTint\" >\n    <path\n        android:pathData=\"M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.49 10,-10S17.52,2 12,2L12,2z\"\n        android:fillColor=\"#FF000000\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_close.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_cloud.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"@color/defaultIconTint\">\n    <path\n        android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96z\"\n        android:fillColor=\"#FF000000\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_cloud_download.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM17,13l-5,5 -5,-5h3V9h4v4h3z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_comment.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M21.99,4c0,-1.1 -0.89,-2 -1.99,-2L4,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h14l4,4 -0.01,-18zM18,14L6,14v-2h12v2zM18,11L6,11L6,9h12v2zM18,8L6,8L6,6h12v2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_computer.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,18c1.1,0 1.99,-0.9 1.99,-2L22,6c0,-1.1 -0.9,-2 -2,-2H4c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2H0v2h24v-2h-4zM4,6h16v10H4V6z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_crop_portrait.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M17,3L7,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,5c0,-1.1 -0.9,-2 -2,-2zM17,19L7,19L7,5h10v14z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_delete.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_description.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M14,2L6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6zM16,18L8,18v-2h8v2zM16,14L8,14v-2h8v2zM13,9L13,3.5L18.5,9L13,9z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_directions_bike.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M15.5,5.5c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM5,12c-2.8,0 -5,2.2 -5,5s2.2,5 5,5 5,-2.2 5,-5 -2.2,-5 -5,-5zM5,20.5c-1.9,0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5 3.5,1.6 3.5,3.5 -1.6,3.5 -3.5,3.5zM10.8,10.5l2.4,-2.4 0.8,0.8c1.3,1.3 3,2.1 5.1,2.1L19.1,9c-1.5,0 -2.7,-0.6 -3.6,-1.5l-1.9,-1.9c-0.5,-0.4 -1,-0.6 -1.6,-0.6s-1.1,0.2 -1.4,0.6L7.8,8.4c-0.4,0.4 -0.6,0.9 -0.6,1.4 0,0.6 0.2,1.1 0.6,1.4L11,14v5h2v-6.2l-2.2,-2.3zM19,12c-2.8,0 -5,2.2 -5,5s2.2,5 5,5 5,-2.2 5,-5 -2.2,-5 -5,-5zM19,20.5c-1.9,0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5 3.5,1.6 3.5,3.5 -1.6,3.5 -3.5,3.5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_directions_car.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M18.92,6.01C18.72,5.42 18.16,5 17.5,5h-11c-0.66,0 -1.21,0.42 -1.42,1.01L3,12v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8l-2.08,-5.99zM6.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5S5.67,13 6.5,13s1.5,0.67 1.5,1.5S7.33,16 6.5,16zM17.5,16c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM5,11l1.5,-4.5h11L19,11L5,11z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_done.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_drag_handle.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,9H4v2h16V9zM4,15h16v-2H4V15z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_expand_more.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16.59,8.59L12,13.17 7.41,8.59 6,10l6,6 6,-6z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_explore.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,10.9c-0.61,0 -1.1,0.49 -1.1,1.1s0.49,1.1 1.1,1.1c0.61,0 1.1,-0.49 1.1,-1.1s-0.49,-1.1 -1.1,-1.1zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM14.19,14.19L6,18l3.81,-8.19L18,6l-3.81,8.19z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_fastfood.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M18.06,22.99h1.66c0.84,0 1.53,-0.64 1.63,-1.46L23,5.05h-5L18,1h-1.97v4.05h-4.97l0.3,2.34c1.71,0.47 3.31,1.32 4.27,2.26 1.44,1.42 2.43,2.89 2.43,5.29v8.05zM1,21.99L1,21h15.03v0.99c0,0.55 -0.45,1 -1.01,1L2.01,22.99c-0.56,0 -1.01,-0.45 -1.01,-1zM16.03,14.99c0,-8 -15.03,-8 -15.03,0h15.03zM1.02,17h15v2h-15z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_favorite.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_file_download.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_filter_list.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10,18h4v-2h-4v2zM3,6v2h18L21,6L3,6zM6,13h12v-2L6,11v2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_fitness_center.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20.57,14.86L22,13.43 20.57,12 17,15.57 8.43,7 12,3.43 10.57,2 9.14,3.43 7.71,2 5.57,4.14 4.14,2.71 2.71,4.14l1.43,1.43L2,7.71l1.43,1.43L2,10.57 3.43,12 7,8.43 15.57,17 12,20.57 13.43,22l1.43,-1.43L16.29,22l2.14,-2.14 1.43,1.43 1.43,-1.43 -1.43,-1.43L22,16.29z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_fullscreen.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M7,14L5,14v5h5v-2L7,17v-3zM5,10h2L7,7h3L10,5L5,5v5zM17,17h-3v2h5v-5h-2v3zM14,5v2h3v3h2L19,5h-5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_fullscreen_exit.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M5,16h3v3h2v-5L5,14v2zM8,8L5,8v2h5L10,5L8,5v3zM14,19h2v-3h3v-2h-5v5zM16,8L16,5h-2v5h5L19,8h-3z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_headset.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,1c-4.97,0 -9,4.03 -9,9v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v2h-4v8h3c1.66,0 3,-1.34 3,-3v-7c0,-4.97 -4.03,-9 -9,-9z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_headset_shadow.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:alpha=\"0.73333333\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:pathData=\"M12,1c-4.97,0 -9,4.03 -9,9v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v2h-4v8h3c1.66,0 3,-1.34 3,-3v-7c0,-4.97 -4.03,-9 -9,-9z\"\n        android:strokeWidth=\"1\"\n        android:strokeAlpha=\"0.34090909\"\n        android:strokeColor=\"#000000\"\n        android:strokeLineCap=\"butt\"\n        android:strokeLineJoin=\"miter\" />\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"M12,1c-4.97,0 -9,4.03 -9,9v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v2h-4v8h3c1.66,0 3,-1.34 3,-3v-7c0,-4.97 -4.03,-9 -9,-9z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_heart.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"#E53935\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_help.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_history.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_history_white.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/white\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_home.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_hourglass_top.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6,2l0.01,6L10,12l-3.99,4.01L6,22h12v-6l-4,-4l4,-3.99V2H6zM16,16.5V20H8v-3.5l4,-4L16,16.5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_info_outline.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11,7h2v2h-2zM11,11h2v6h-2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_insert_emoticon.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM15.5,11c0.83,0 1.5,-0.67 1.5,-1.5S16.33,8 15.5,8 14,8.67 14,9.5s0.67,1.5 1.5,1.5zM8.5,11c0.83,0 1.5,-0.67 1.5,-1.5S9.33,8 8.5,8 7,8.67 7,9.5 7.67,11 8.5,11zM12,17.5c2.33,0 4.31,-1.46 5.11,-3.5L6.89,14c0.8,2.04 2.78,3.5 5.11,3.5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_language.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2 0,0.68 0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2 0,-0.68 0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2 0,0.68 -0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2 0,-0.68 -0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_list.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,13h2v-2L3,11v2zM3,17h2v-2L3,15v2zM3,9h2L5,7L3,7v2zM7,13h14v-2L7,11v2zM7,17h14v-2L7,15v2zM7,7v2h14L21,7L7,7z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_live_tv.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:autoMirrored=\"true\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"@android:color/black\"\n        android:pathData=\"M21,6h-7.59l3.29,-3.29L16,2l-4,4 -4,-4 -0.71,0.71L10.59,6L3,6c-1.1,0 -2,0.89 -2,2v12c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.11 -0.9,-2 -2,-2zM21,20L3,20L3,8h18v12zM9,10v8l7,-4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_menu_book.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:autoMirrored=\"true\"\n    android:height=\"24dp\"\n    android:tint=\"#000000\"\n    android:viewportHeight=\"24\"\n    android:viewportWidth=\"24\"\n    android:width=\"24dp\" >\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M21,5c-1.11,-0.35 -2.33,-0.5 -3.5,-0.5c-1.95,0 -4.05,0.4 -5.5,1.5c-1.45,-1.1 -3.55,-1.5 -5.5,-1.5S2.45,4.9 1,6v14.65c0,0.25 0.25,0.5 0.5,0.5c0.1,0 0.15,-0.05 0.25,-0.05C3.1,20.45 5.05,20 6.5,20c1.95,0 4.05,0.4 5.5,1.5c1.35,-0.85 3.8,-1.5 5.5,-1.5c1.65,0 3.35,0.3 4.75,1.05c0.1,0.05 0.15,0.05 0.25,0.05c0.25,0 0.5,-0.25 0.5,-0.5V6C22.4,5.55 21.75,5.25 21,5zM21,18.5c-1.1,-0.35 -2.3,-0.5 -3.5,-0.5c-1.7,0 -4.15,0.65 -5.5,1.5V8c1.35,-0.85 3.8,-1.5 5.5,-1.5c1.2,0 2.4,0.15 3.5,0.5V18.5z\"/>\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M17.5,10.5c0.88,0 1.73,0.09 2.5,0.26V9.24C19.21,9.09 18.36,9 17.5,9c-1.7,0 -3.24,0.29 -4.5,0.83v1.66C14.13,10.85 15.7,10.5 17.5,10.5z\"/>\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M13,12.49v1.66c1.13,-0.64 2.7,-0.99 4.5,-0.99c0.88,0 1.73,0.09 2.5,0.26V11.9c-0.79,-0.15 -1.64,-0.24 -2.5,-0.24C15.8,11.66 14.26,11.96 13,12.49z\"/>\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M17.5,14.33c-1.7,0 -3.24,0.29 -4.5,0.83v1.66c1.13,-0.64 2.7,-0.99 4.5,-0.99c0.88,0 1.73,0.09 2.5,0.26v-1.52C19.21,14.41 18.36,14.33 17.5,14.33z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_mic.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,14c1.66,0 2.99,-1.34 2.99,-3L15,5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6c0,1.66 1.34,3 3,3zM17.3,11c0,3 -2.54,5.1 -5.3,5.1S6.7,14 6.7,11L5,11c0,3.41 2.72,6.23 6,6.72L11,21h2v-3.28c3.28,-0.48 6,-3.3 6,-6.72h-1.7z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_more_vert.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_motorcycle.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M17.42,10L13.41,6H9V8H12.59L14.59,10H6.5C4,10 2,12 2,14.5C2,17 4,19 6.5,19C8.72,19 10.56,17.38 10.92,15.27L13.04,14C13,14.17 13,14.33 13,14.5C13,17 15,19 17.5,19C20,19 22,17 22,14.5C22,12 20,10 17.5,10M8.84,15.26C8.5,16.27 7.58,17 6.47,17C5.09,17 3.97,15.88 3.97,14.5C3.97,13.12 5.09,12 6.47,12C7.59,12 8.5,12.74 8.84,13.75H6V15.25L8.84,15.26M17.47,17C16.09,17 14.97,15.88 14.97,14.5C14.97,13.12 16.09,12 17.47,12A2.5,2.5 0 0,1 19.97,14.5A2.5,2.5 0 0,1 17.47,17Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_movie.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M18,4l2,4h-3l-2,-4h-2l2,4h-3l-2,-4H8l2,4H7L5,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4h-4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_music_note.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_next.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_notifications.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_palette.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,2C6.49,2 2,6.49 2,12s4.49,10 10,10c1.38,0 2.5,-1.12 2.5,-2.5c0,-0.61 -0.23,-1.2 -0.64,-1.67c-0.08,-0.1 -0.13,-0.21 -0.13,-0.33c0,-0.28 0.22,-0.5 0.5,-0.5H16c3.31,0 6,-2.69 6,-6C22,6.04 17.51,2 12,2zM17.5,13c-0.83,0 -1.5,-0.67 -1.5,-1.5c0,-0.83 0.67,-1.5 1.5,-1.5s1.5,0.67 1.5,1.5C19,12.33 18.33,13 17.5,13zM14.5,9C13.67,9 13,8.33 13,7.5C13,6.67 13.67,6 14.5,6S16,6.67 16,7.5C16,8.33 15.33,9 14.5,9zM5,11.5C5,10.67 5.67,10 6.5,10S8,10.67 8,11.5C8,12.33 7.33,13 6.5,13S5,12.33 5,11.5zM11,7.5C11,8.33 10.33,9 9.5,9S8,8.33 8,7.5C8,6.67 8.67,6 9.5,6S11,6.67 11,7.5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_pause.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_people.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_person.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_pets.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M4.5,9.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M9,5.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M15,5.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.5,9.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M17.34,14.86c-0.87,-1.02 -1.6,-1.89 -2.48,-2.91 -0.46,-0.54 -1.05,-1.08 -1.75,-1.32 -0.11,-0.04 -0.22,-0.07 -0.33,-0.09 -0.25,-0.04 -0.52,-0.04 -0.78,-0.04s-0.53,0 -0.79,0.05c-0.11,0.02 -0.22,0.05 -0.33,0.09 -0.7,0.24 -1.28,0.78 -1.75,1.32 -0.87,1.02 -1.6,1.89 -2.48,2.91 -1.31,1.31 -2.92,2.76 -2.62,4.79 0.29,1.02 1.02,2.03 2.33,2.32 0.73,0.15 3.06,-0.44 5.54,-0.44h0.18c2.48,0 4.81,0.58 5.54,0.44 1.31,-0.29 2.04,-1.31 2.33,-2.32 0.31,-2.04 -1.3,-3.49 -2.61,-4.8z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_picture_in_picture.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,7h-8v6h8L19,7zM21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,1.98 2,1.98h18c1.1,0 2,-0.88 2,-1.98L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19.01L3,19.01L3,4.98h18v14.03z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_pin.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M14.566,1.729l7.705,7.704c0.355,0.355 0.354,0.93 0,1.284l-1.926,1.926c-0.354,0.355 -0.93,0.355 -1.285,0l-7.704,-7.704c-0.354,-0.354 -0.354,-0.929 0,-1.284l1.926,-1.926C13.639,1.374 14.213,1.374 14.566,1.729z\"\n      android:fillColor=\"#FF000000\"/>\n  <path\n      android:pathData=\"M2.369,12.643l8.988,8.989c0.356,0.352 0.929,0.352 1.284,0c1.417,-1.418 1.417,-3.719 0,-5.137l-5.136,-5.136c-1.418,-1.418 -3.718,-1.418 -5.136,0C2.016,11.714 2.016,12.287 2.369,12.643z\"\n      android:fillColor=\"#FF000000\"/>\n  <path\n      android:pathData=\"M13.2823,15.8538l-5.1357,-5.1357l3.8523,-3.8523l5.1357,5.1357z\"\n      android:fillColor=\"#FF000000\"/>\n  <path\n      android:pathData=\"M1.727,22.273c0.355,0.353 0.929,0.353 1.284,0l3.852,-3.853l-1.284,-1.283l-3.852,3.852C1.374,21.345 1.375,21.918 1.727,22.273z\"\n      android:fillColor=\"#FF000000\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_placeholder_bandcamp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportHeight=\"97.75\"\n    android:viewportWidth=\"97.75\"\n    android:tint=\"@color/defaultIconTint\">\n    <path\n        android:pathData=\"M48.875,0C21.882,0 0,21.882 0,48.875S21.882,97.75 48.875,97.75 97.75,75.868 97.75,48.875 75.868,0 48.875,0zM64.835,70.857L12.593,70.857l20.32,-43.965h52.244L64.835,70.857z\"\n        android:fillColor=\"#FF000000\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_placeholder_media_ccc.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportWidth=\"26.458319\"\n    android:viewportHeight=\"26.458332\"\n    android:tint=\"@color/defaultIconTint\">\n  <path\n      android:pathData=\"M13.23,0.302C6.07,0.302 0.264,6.107 0.264,13.267a12.965,12.965 0,0 0,0.847 4.595c0.19,-0.497 0.408,-0.982 0.682,-1.438 0.14,-0.232 0.294,-0.457 0.396,-0.707 0.103,-0.25 0.15,-0.533 0.072,-0.792a1.362,1.362 0,0 0,-0.22 -0.404c-0.092,-0.123 -0.192,-0.24 -0.275,-0.37a1.662,1.662 0,0 1,-0.255 -1.12,1.5 1.5,0 0,1 0.58,-0.987c0.28,-0.208 0.635,-0.3 0.985,-0.288a1.757,1.757 0,0 1,0.346 0.048c0.452,0.11 0.852,0.393 1.148,0.75 0.368,0.447 0.584,1.01 0.637,1.586a3.574,3.574 0,0 1,-0.275 1.693c-0.4,0.955 -1.15,1.725 -1.565,2.673 -0.338,0.775 -0.435,1.638 -0.39,2.483 0.007,0.077 0.018,0.155 0.025,0.234a12.965,12.965 0,0 0,3.62 3.18,17.63 17.63,0 0,1 -0.13,-2.11c0.002,-0.56 0.03,-1.12 0.085,-1.675 -0.34,-0.236 -0.65,-0.51 -0.87,-0.86 -0.392,-0.62 -0.466,-1.408 -0.305,-2.124 0.16,-0.717 0.54,-1.37 0.997,-1.945a7.833,7.833 0,0 1,2.835 -2.223,10.305 10.305,0 0,1 -0.09,-0.126 4.854,4.854 0,0 1,-0.702 -2.176c-0.06,-0.777 0.064,-1.554 0.115,-2.33 0.037,-0.543 0.04,-1.085 0.07,-1.627 0.038,-0.627 0.114,-1.255 0.29,-1.858a2.36,2.36 0,0 1,0.266 -0.63,1.4 1.4,0 0,1 0.594,-0.514c0.274,-0.108 0.51,-0.132 0.776,-0.087 0.22,0.046 0.425,0.156 0.604,0.294 0.18,0.138 0.335,0.304 0.48,0.477a7.298,7.298 0,0 1,1.04 1.617,3.57 3.57,0 0,1 1.09,0 7.287,7.287 0,0 1,1.04 -1.616,3.21 3.21,0 0,1 0.48,-0.476c0.18,-0.14 0.383,-0.248 0.604,-0.295a1.268,1.268 0,0 1,0.78 0.086,1.402 1.402,0 0,1 0.595,0.517c0.124,0.19 0.202,0.408 0.266,0.626 0.175,0.602 0.252,1.23 0.29,1.856 0.03,0.543 0.033,1.087 0.07,1.628 0.05,0.777 0.175,1.554 0.116,2.33a4.855,4.855 0,0 1,-0.705 2.178c-0.03,0.05 -0.07,0.096 -0.103,0.145 0.247,0.278 0.598,0.513 0.898,0.614a1.956,1.956 0,0 0,1.05 0.044,1.65 1.65,0 0,0 0.533,-0.226 1.253,1.253 0,0 0,0.397 -0.418c0.118,-0.21 0.166,-0.45 0.192,-0.687 0.067,-0.61 0,-1.224 -0.05,-1.835 -0.034,-0.396 -0.062,-0.8 0.027,-1.187 0.06,-0.26 0.177,-0.518 0.373,-0.7a1.106,1.106 0,0 1,0.465 -0.255,1.312 1.312,0 0,1 0.53,-0.03c0.38,0.057 0.736,0.274 0.948,0.594 0.12,0.18 0.194,0.39 0.238,0.604 0.044,0.213 0.06,0.43 0.072,0.648 0.04,0.76 0.04,1.522 0.018,2.284 -0.018,0.665 -0.055,1.348 -0.32,1.957 -0.343,0.782 -1.032,1.366 -1.775,1.786a7.052,7.052 0,0 1,-1.588 0.647c0.482,1.54 0.733,3.24 0.733,4.968a17.6,17.6 0,0 1,-0.135 2.125,12.964 12.964,0 0,0 6.384,-11.152c0,-7.16 -5.806,-12.965 -12.965,-12.965zM9.602,16.284v1.483a1.88,1.88 0,0 1,1.083 0.362,1.738 1.738,0 0,1 0.556,0.68c0.122,0.27 0.166,0.576 0.116,0.868a1.493,1.493 0,0 1,-0.332 0.708,1.647 1.647,0 0,1 -0.635,0.458 1.738,1.738 0,0 1,-0.787 0.122v3.73l7.762,-4.208 -7.762,-4.204z\"\n      android:fillColor=\"#FF000000\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_placeholder_peertube.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"400\"\n    android:viewportHeight=\"400\">\n    <path android:fillColor=\"#747474\" android:fillType=\"evenOdd\" android:pathData=\"m62.497,198.29 l-1.302,0.161 0.102,90.941c0.057,50.018 0.228,91.066 0.38,91.218 0.3,0.3 2.723,-0.642 2.723,-1.059 0,-0.14 0.54,-0.478 1.2,-0.751 0.66,-0.273 1.2,-0.655 1.2,-0.849 0,-0.193 0.36,-0.351 0.8,-0.351 0.44,0 0.8,-0.18 0.8,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.193,-0.4 0.428,-0.4s1.213,-0.54 2.172,-1.2c0.959,-0.66 1.924,-1.2 2.143,-1.2 0.22,0 0.643,-0.225 0.941,-0.5 0.742,-0.686 2.767,-1.902 3.616,-2.171 0.385,-0.122 0.7,-0.381 0.7,-0.576 0,-0.194 0.27,-0.353 0.6,-0.353 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.159 0.6,-0.353 0,-0.195 0.315,-0.454 0.7,-0.576 0.687,-0.217 2.906,-1.476 3.3,-1.872 0.11,-0.11 0.692,-0.454 1.293,-0.764 0.602,-0.309 1.449,-0.894 1.884,-1.299 0.434,-0.405 0.985,-0.736 1.223,-0.736 0.238,0 0.82,-0.36 1.292,-0.8 0.472,-0.44 1.095,-0.8 1.383,-0.8 0.289,0 0.525,-0.18 0.525,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.136 0.6,-0.302 0,-0.167 0.585,-0.557 1.3,-0.868 0.715,-0.311 1.39,-0.67 1.5,-0.798 0.248,-0.287 2.057,-1.322 4.3,-2.459 0.935,-0.473 1.7,-1.021 1.7,-1.217 0,-0.196 0.255,-0.356 0.567,-0.356 0.311,0 0.626,-0.167 0.7,-0.37 0.073,-0.204 0.403,-0.429 0.733,-0.5 0.33,-0.072 0.87,-0.405 1.2,-0.741 0.33,-0.336 1.455,-1.055 2.5,-1.599s1.9,-1.124 1.9,-1.289c0,-0.166 0.36,-0.301 0.8,-0.301 0.44,0 0.8,-0.18 0.8,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.881,-0.315 1.317,-0.7 1.005,-0.888 2.949,-2.083 3.858,-2.371 0.385,-0.122 0.7,-0.381 0.7,-0.576 0,-0.194 0.36,-0.353 0.8,-0.353 0.44,0 0.8,-0.158 0.8,-0.351 0,-0.194 0.555,-0.582 1.234,-0.863 0.679,-0.281 1.444,-0.708 1.7,-0.949 0.256,-0.24 1.276,-0.878 2.266,-1.417s2.149,-1.304 2.575,-1.7c0.427,-0.396 1.012,-0.72 1.3,-0.72 0.289,0 0.525,-0.136 0.525,-0.302 0,-0.167 0.585,-0.562 1.3,-0.878 0.715,-0.317 1.649,-0.9 2.075,-1.298 0.427,-0.397 1.012,-0.722 1.3,-0.722 0.289,0 0.525,-0.168 0.525,-0.373s0.359,-0.487 0.798,-0.626c0.438,-0.139 1.023,-0.468 1.3,-0.729 0.276,-0.262 1.357,-0.909 2.402,-1.437 1.045,-0.529 1.9,-1.112 1.9,-1.298 0,-0.185 0.294,-0.337 0.653,-0.337 0.359,0 0.944,-0.324 1.3,-0.72 0.356,-0.397 1.314,-1.031 2.13,-1.411 0.816,-0.38 1.582,-0.85 1.702,-1.045 0.121,-0.195 1.073,-0.766 2.117,-1.269 1.044,-0.502 2.124,-1.136 2.4,-1.408 0.277,-0.272 0.862,-0.609 1.3,-0.748 0.439,-0.139 0.798,-0.421 0.798,-0.626 0,-0.205 0.36,-0.373 0.8,-0.373 0.44,0 0.8,-0.151 0.8,-0.336 0,-0.184 0.405,-0.546 0.9,-0.802 0.495,-0.257 1.62,-0.92 2.5,-1.473 0.88,-0.553 1.87,-1.124 2.2,-1.268 0.33,-0.145 0.69,-0.366 0.8,-0.492 0.358,-0.41 2.57,-1.826 3.8,-2.432 0.66,-0.325 1.491,-0.908 1.847,-1.294 0.356,-0.387 0.941,-0.703 1.3,-0.703 0.359,0 0.653,-0.18 0.653,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.136,-0.8 1.475,-0.8 0.339,0 0.617,-0.168 0.617,-0.373s0.359,-0.487 0.798,-0.626c0.438,-0.139 1.032,-0.467 1.319,-0.727 0.287,-0.261 1.323,-0.9 2.302,-1.42 2.232,-1.186 6.137,-3.755 6.314,-4.154 0.074,-0.165 0.479,-0.3 0.9,-0.3 0.422,0 0.767,-0.18 0.767,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.136,-0.8 1.475,-0.8 0.339,0 0.617,-0.142 0.617,-0.315 0,-0.174 1.035,-0.937 2.3,-1.697 1.265,-0.759 2.36,-1.517 2.433,-1.684 0.074,-0.167 0.479,-0.304 0.9,-0.304 0.422,0 0.767,-0.18 0.767,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.603,-0.135 0.606,-0.3 0.004,-0.165 0.904,-0.74 2,-1.279 2.097,-1.029 2.38,-1.387 1.394,-1.766 -0.33,-0.126 -0.6,-0.495 -0.6,-0.82 0,-0.324 -0.54,-0.909 -1.2,-1.299 -0.66,-0.39 -1.2,-0.85 -1.2,-1.022 0,-0.173 -0.19,-0.314 -0.422,-0.314 -0.232,0 -1.482,-0.72 -2.778,-1.6 -1.296,-0.88 -2.463,-1.6 -2.594,-1.6 -0.247,0 -2.653,-1.624 -3.006,-2.029 -0.11,-0.126 -0.47,-0.347 -0.8,-0.492 -0.33,-0.144 -1.32,-0.706 -2.2,-1.249 -3.131,-1.933 -5.106,-3.03 -5.45,-3.03 -0.193,0 -0.35,-0.18 -0.35,-0.4 0,-0.22 -0.27,-0.4 -0.6,-0.4 -0.33,0 -0.6,-0.159 -0.6,-0.353 0,-0.195 -0.315,-0.454 -0.7,-0.576 -0.843,-0.267 -2.872,-1.483 -3.606,-2.161 -0.292,-0.27 -1.198,-0.804 -2.013,-1.187 -0.814,-0.383 -1.83,-1.018 -2.256,-1.41 -0.427,-0.392 -1.012,-0.713 -1.3,-0.713 -0.289,0 -0.525,-0.158 -0.525,-0.351 0,-0.194 -0.54,-0.576 -1.2,-0.849 -0.66,-0.273 -1.2,-0.655 -1.2,-0.849 0,-0.193 -0.36,-0.351 -0.8,-0.351 -0.44,0 -0.8,-0.139 -0.8,-0.308 0,-0.17 -0.81,-0.751 -1.8,-1.292s-1.8,-1.122 -1.8,-1.292c0,-0.169 -0.194,-0.308 -0.432,-0.308s-1.363,-0.615 -2.5,-1.367 -2.563,-1.591 -3.168,-1.865c-0.605,-0.273 -1.1,-0.648 -1.1,-0.832 0,-0.185 -0.345,-0.336 -0.767,-0.336 -0.421,0 -0.826,-0.135 -0.9,-0.3 -0.167,-0.376 -2.297,-1.675 -3.233,-1.971 -0.385,-0.122 -0.7,-0.381 -0.7,-0.576 0,-0.194 -0.188,-0.353 -0.417,-0.353 -0.229,0 -0.803,-0.36 -1.275,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.27,-0.4 -0.6,-0.4 -0.33,0 -0.6,-0.18 -0.6,-0.4 0,-0.22 -0.27,-0.4 -0.6,-0.4 -0.33,0 -0.6,-0.136 -0.6,-0.302 0,-0.167 -0.526,-0.535 -1.168,-0.82 -0.642,-0.284 -2.268,-1.228 -3.613,-2.097 -1.345,-0.87 -2.62,-1.581 -2.832,-1.581a0.395,0.395 0,0 1,-0.387 -0.4c0,-0.22 -0.236,-0.4 -0.525,-0.4 -0.288,0 -0.877,-0.315 -1.308,-0.7 -0.431,-0.385 -1.814,-1.24 -3.074,-1.9 -1.259,-0.66 -2.291,-1.335 -2.292,-1.5 0,-0.165 -0.271,-0.3 -0.601,-0.3 -0.33,0 -0.6,-0.18 -0.6,-0.4 0,-0.22 -0.36,-0.4 -0.8,-0.4 -0.44,0 -0.8,-0.18 -0.8,-0.4 0,-0.22 -0.27,-0.4 -0.6,-0.4 -0.33,0 -0.6,-0.18 -0.6,-0.4 0,-0.22 -0.27,-0.4 -0.6,-0.4 -0.33,0 -0.6,-0.18 -0.6,-0.4 0,-0.22 -0.236,-0.4 -0.525,-0.4 -0.288,0 -0.911,-0.36 -1.383,-0.8 -0.472,-0.44 -1.054,-0.8 -1.292,-0.8s-0.82,-0.36 -1.292,-0.8c-0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.236,-0.4 -0.525,-0.4 -0.288,0 -0.911,-0.36 -1.383,-0.8 -0.472,-0.44 -0.975,-0.8 -1.117,-0.8 -0.143,0 -1.059,-0.54 -2.037,-1.2 -0.978,-0.66 -1.949,-1.2 -2.158,-1.2 -0.209,0 -0.38,-0.159 -0.38,-0.353 0,-0.195 -0.315,-0.454 -0.7,-0.576 -0.685,-0.217 -2.904,-1.475 -3.3,-1.871 -0.11,-0.11 -1.234,-0.74 -2.499,-1.4 -1.264,-0.66 -2.299,-1.335 -2.3,-1.5 0,-0.165 -0.237,-0.3 -0.526,-0.3 -0.288,0 -0.911,-0.36 -1.383,-0.8 -0.472,-0.44 -1.136,-0.8 -1.475,-0.8 -0.339,0 -0.617,-0.18 -0.617,-0.4 0,-0.22 -0.27,-0.4 -0.6,-0.4 -0.33,0 -0.6,-0.152 -0.6,-0.337 0,-0.186 -0.802,-0.75 -1.782,-1.254 -0.981,-0.504 -2.143,-1.252 -2.584,-1.663 -0.44,-0.41 -1.078,-0.746 -1.417,-0.746 -0.339,0 -0.617,-0.18 -0.617,-0.4 0,-0.22 -0.27,-0.4 -0.6,-0.4 -0.33,0 -0.6,-0.146 -0.6,-0.325 0,-0.179 -0.63,-0.573 -1.4,-0.875 -0.77,-0.302 -1.4,-0.667 -1.4,-0.81 0,-0.144 -0.436,-0.46 -0.969,-0.703 -0.533,-0.243 -1.345,-0.767 -1.805,-1.164 -0.841,-0.727 -3.172,-2.122 -6.326,-3.786 -0.935,-0.493 -1.7,-1.041 -1.7,-1.217 0,-0.176 -0.278,-0.32 -0.617,-0.32 -0.339,0 -1.003,-0.36 -1.475,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.32,-0.4 -0.712,-0.4 -0.391,0 -0.971,-0.36 -1.288,-0.8 -0.317,-0.44 -0.897,-0.8 -1.288,-0.8 -0.392,0 -0.712,-0.18 -0.712,-0.4 0,-0.22 -0.236,-0.4 -0.525,-0.4 -0.288,0 -0.911,-0.36 -1.383,-0.8 -0.472,-0.44 -1.046,-0.8 -1.275,-0.8 -0.229,0 -0.417,-0.159 -0.417,-0.353 0,-0.195 -0.315,-0.454 -0.7,-0.576 -0.909,-0.288 -2.853,-1.483 -3.858,-2.371 -0.436,-0.385 -0.984,-0.671 -1.217,-0.636 -0.234,0.035 -1.011,0.137 -1.728,0.226\"/>\n    <path android:fillColor=\"#241c24\" android:fillType=\"evenOdd\" android:pathData=\"M61.443,15.833c-0.134,0.348 -0.243,41.384 -0.243,91.192v90.56l0.9,0.183c2.602,0.53 3.145,0.527 2.936,-0.019 -0.13,-0.339 0.062,-0.549 0.501,-0.549 0.392,0 1.099,-0.36 1.571,-0.8 0.472,-0.44 1.124,-0.8 1.448,-0.8 0.325,0 0.704,-0.36 0.844,-0.8 0.162,-0.511 0.605,-0.8 1.227,-0.8 0.535,0 0.973,-0.18 0.973,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.251,-0.4 0.557,-0.4 0.307,0 0.648,-0.236 0.759,-0.524 0.11,-0.289 0.939,-0.746 1.842,-1.016 0.903,-0.271 1.642,-0.665 1.642,-0.876 0,-0.211 0.276,-0.384 0.613,-0.384 0.336,0 0.715,-0.269 0.841,-0.598 0.127,-0.328 0.391,-0.498 0.588,-0.376 0.197,0.122 0.358,0.031 0.358,-0.202s0.371,-0.424 0.824,-0.424c0.453,0 0.712,-0.18 0.576,-0.4 -0.136,-0.22 0.089,-0.4 0.501,-0.4 0.411,0 1.135,-0.36 1.607,-0.8 0.472,-0.44 1.136,-0.8 1.475,-0.8 0.339,0 0.617,-0.15 0.617,-0.332 0,-0.183 0.495,-0.588 1.1,-0.9 0.605,-0.313 1.335,-0.883 1.623,-1.268 0.287,-0.385 0.872,-0.7 1.3,-0.7 0.427,0 0.777,-0.18 0.777,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.32,-0.4 0.712,-0.4 0.391,0 0.971,-0.36 1.288,-0.8 0.317,-0.44 0.897,-0.8 1.288,-0.8 0.392,0 0.712,-0.18 0.712,-0.4 0,-0.22 0.225,-0.4 0.5,-0.4 0.275,-0.001 1.018,-0.447 1.652,-0.992 0.634,-0.545 1.276,-0.914 1.427,-0.821 0.152,0.094 0.528,-0.18 0.836,-0.608 0.309,-0.429 0.779,-0.779 1.045,-0.779 0.715,0 5.34,-2.832 5.34,-3.27 0,-0.208 0.165,-0.275 0.368,-0.15 0.202,0.125 0.639,-0.044 0.971,-0.376 0.332,-0.332 0.897,-0.604 1.256,-0.604s0.541,-0.18 0.405,-0.4c-0.136,-0.22 0.033,-0.4 0.376,-0.4 0.343,0 0.624,-0.18 0.624,-0.4 0,-0.22 0.36,-0.4 0.8,-0.4 0.44,0 0.8,-0.18 0.8,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.093,-0.8 1.379,-0.8 0.286,0 0.745,-0.36 1.02,-0.8 0.275,-0.44 0.869,-0.8 1.32,-0.8 0.451,0 0.709,-0.18 0.573,-0.4 -0.136,-0.22 0.078,-0.4 0.476,-0.4 0.398,-0.001 1.242,-0.447 1.876,-0.992 0.634,-0.545 1.29,-0.906 1.458,-0.802 0.169,0.104 0.414,-0.091 0.545,-0.434 0.132,-0.342 0.388,-0.531 0.569,-0.419 0.182,0.112 0.583,-0.146 0.891,-0.574 0.309,-0.429 0.842,-0.779 1.185,-0.779 0.343,0 0.883,-0.36 1.2,-0.8 0.317,-0.44 0.897,-0.8 1.288,-0.8 0.392,0 0.712,-0.18 0.712,-0.4 0,-0.22 0.349,-0.4 0.776,-0.4 0.427,0 0.881,-0.169 1.008,-0.375 0.128,-0.206 0.723,-0.631 1.324,-0.945 2.777,-1.451 3.262,-1.776 3.019,-2.019 -0.143,-0.144 0.096,-0.261 0.531,-0.261 0.435,0 1.14,-0.315 1.567,-0.7 0.426,-0.385 1.315,-0.97 1.975,-1.3 0.66,-0.33 1.549,-0.915 1.975,-1.3 0.427,-0.385 1.012,-0.7 1.3,-0.7 0.289,0 0.525,-0.18 0.525,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.147,-0.8 1.499,-0.8 0.352,0 0.529,-0.18 0.393,-0.4 -0.136,-0.22 0.033,-0.4 0.376,-0.4 0.343,0 0.624,-0.18 0.624,-0.4 0,-0.22 0.36,-0.4 0.8,-0.4 0.44,0 0.8,-0.18 0.8,-0.4 0,-0.22 0.32,-0.4 0.712,-0.4 0.391,0 0.971,-0.36 1.288,-0.8 0.317,-0.44 0.897,-0.8 1.288,-0.8 0.392,0 0.712,-0.18 0.712,-0.4 0,-0.22 0.281,-0.4 0.624,-0.4 0.343,0 0.512,-0.18 0.376,-0.4 -0.136,-0.22 0.123,-0.4 0.576,-0.4 0.453,0 0.824,-0.168 0.824,-0.373s0.375,-0.492 0.834,-0.638c1.035,-0.328 4.918,-2.681 5.099,-3.089 0.074,-0.165 0.396,-0.3 0.717,-0.3 0.321,0 0.97,-0.36 1.442,-0.8 0.472,-0.44 1.095,-0.8 1.383,-0.8 0.289,0 0.525,-0.18 0.525,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.117,-0.8 1.432,-0.8 0.316,0 0.682,-0.281 0.814,-0.625 0.132,-0.344 0.394,-0.531 0.583,-0.414 0.188,0.116 0.684,-0.097 1.102,-0.475 0.419,-0.377 1.25,-0.938 1.847,-1.246 0.598,-0.308 0.975,-0.741 0.839,-0.962 -0.137,-0.221 -0.052,-0.28 0.187,-0.132 0.24,0.148 0.89,-0.184 1.444,-0.738 0.554,-0.555 1.286,-1.008 1.626,-1.008 0.34,0 0.618,-0.18 0.618,-0.4 0,-0.22 0.36,-0.4 0.8,-0.4 0.44,0 0.8,-0.18 0.8,-0.4 0,-0.22 0.32,-0.4 0.712,-0.4 0.391,0 0.971,-0.36 1.288,-0.8 0.317,-0.44 0.897,-0.8 1.288,-0.8 0.392,0 0.712,-0.16 0.712,-0.357 0,-0.196 0.409,-0.459 0.908,-0.584 0.499,-0.125 1.309,-0.602 1.8,-1.059 0.491,-0.457 0.892,-0.706 0.892,-0.554 0,0.153 0.315,0.017 0.7,-0.301 0.385,-0.319 1.192,-0.826 1.793,-1.126 0.602,-0.301 1.449,-0.878 1.884,-1.283 0.434,-0.405 1.078,-0.736 1.43,-0.736 0.352,0 0.529,-0.18 0.393,-0.4 -0.136,-0.22 0.033,-0.4 0.376,-0.4 0.343,0 0.624,-0.18 0.624,-0.4 0,-0.22 0.36,-0.4 0.8,-0.4 0.44,0 0.8,-0.18 0.8,-0.4 0,-0.22 0.272,-0.4 0.604,-0.4 0.332,0 1.168,-0.54 1.859,-1.2 0.691,-0.66 1.555,-1.2 1.921,-1.2 0.366,0 1.052,-0.36 1.524,-0.8 0.472,-0.44 1.124,-0.8 1.448,-0.8 0.325,0 0.704,-0.36 0.844,-0.8 0.162,-0.511 0.605,-0.8 1.227,-0.8 0.535,0 0.973,-0.18 0.973,-0.4 0,-0.22 0.198,-0.4 0.44,-0.4 0.614,0 2.76,-2.365 2.76,-3.042 0,-0.307 0.27,-0.558 0.6,-0.558 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 -0.326,-0.4 -0.725,-0.4 -0.398,0 -1.111,-0.36 -1.583,-0.8 -0.472,-0.44 -1.147,-0.8 -1.499,-0.8 -0.352,0 -0.529,-0.18 -0.393,-0.4 0.136,-0.22 -0.018,-0.4 -0.343,-0.4s-0.653,-0.188 -0.73,-0.418c-0.076,-0.23 -0.541,-0.448 -1.033,-0.485 -0.492,-0.037 -0.996,-0.389 -1.121,-0.782s-0.492,-0.715 -0.817,-0.715c-0.324,0 -0.976,-0.36 -1.448,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.32,-0.4 -0.712,-0.4 -0.391,0 -0.971,-0.36 -1.288,-0.8 -0.317,-0.44 -0.882,-0.8 -1.255,-0.8 -0.373,0 -0.738,-0.167 -0.812,-0.37 -0.073,-0.204 -0.403,-0.429 -0.733,-0.5 -0.33,-0.072 -0.891,-0.445 -1.247,-0.83 -0.356,-0.385 -0.941,-0.7 -1.3,-0.7 -0.359,0 -0.653,-0.147 -0.653,-0.326 0,-0.431 -3.196,-2.221 -3.213,-1.8 -0.008,0.179 -0.329,-0.034 -0.714,-0.474 -0.386,-0.44 -0.931,-0.849 -1.213,-0.909 -0.282,-0.059 -0.894,-0.464 -1.361,-0.9 -0.468,-0.435 -1.187,-0.791 -1.598,-0.791 -0.412,0 -0.637,-0.18 -0.501,-0.4 0.136,-0.22 -0.084,-0.4 -0.488,-0.4 -0.405,0 -0.995,-0.36 -1.312,-0.8 -0.317,-0.44 -0.771,-0.8 -1.009,-0.8 -0.666,0 -2.584,-0.963 -2.588,-1.3 -0.002,-0.165 -0.291,-0.3 -0.643,-0.3 -0.351,0 -1.121,-0.495 -1.71,-1.1 -1.262,-1.295 -2.591,-2.1 -3.468,-2.1 -0.346,0 -0.528,-0.164 -0.403,-0.365 0.124,-0.201 -0.315,-0.605 -0.977,-0.898 -0.661,-0.293 -1.202,-0.668 -1.202,-0.835 0,-0.166 -0.461,-0.302 -1.024,-0.302s-0.929,-0.153 -0.813,-0.34c0.115,-0.187 -0.279,-0.592 -0.877,-0.9 -0.597,-0.308 -1.324,-0.785 -1.614,-1.059 -0.29,-0.275 -0.965,-0.61 -1.5,-0.744s-0.972,-0.385 -0.972,-0.557c0,-0.172 -0.45,-0.426 -1,-0.564 -0.55,-0.138 -1,-0.428 -1,-0.644 0,-0.215 -0.345,-0.392 -0.767,-0.392 -0.421,0 -0.826,-0.135 -0.9,-0.3 -0.249,-0.561 -2.698,-2.1 -3.34,-2.1 -0.352,0 -0.539,-0.164 -0.414,-0.365 0.124,-0.201 -0.315,-0.605 -0.977,-0.898 -0.661,-0.293 -1.202,-0.668 -1.202,-0.835 0,-0.166 -0.32,-0.302 -0.712,-0.302 -0.391,0 -0.971,-0.36 -1.288,-0.8 -0.317,-0.44 -0.897,-0.8 -1.288,-0.8 -0.392,0 -0.712,-0.18 -0.712,-0.4 0,-0.22 -0.36,-0.4 -0.8,-0.4 -0.44,0 -0.8,-0.18 -0.8,-0.4 0,-0.22 -0.281,-0.4 -0.624,-0.4 -0.343,0 -0.512,-0.18 -0.376,-0.4 0.136,-0.22 -0.041,-0.4 -0.393,-0.4 -0.352,0 -1.027,-0.36 -1.499,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.146 -0.525,-0.325 0,-0.179 -0.622,-0.57 -1.382,-0.868 -0.76,-0.298 -1.302,-0.671 -1.204,-0.829 0.145,-0.235 -0.523,-0.541 -1.623,-0.743 -0.105,-0.019 -0.506,-0.316 -0.891,-0.66 -1.218,-1.087 -3.713,-2.575 -4.318,-2.575 -0.32,0 -0.582,-0.18 -0.582,-0.4 0,-0.22 -0.36,-0.4 -0.8,-0.4 -0.44,0 -0.8,-0.18 -0.8,-0.4 0,-0.22 -0.272,-0.4 -0.604,-0.4 -0.332,0 -1.168,-0.54 -1.859,-1.2 -0.691,-0.66 -1.499,-1.2 -1.796,-1.2 -0.298,0 -0.541,-0.18 -0.541,-0.4 0,-0.22 -0.236,-0.4 -0.525,-0.4 -0.288,0 -0.899,-0.349 -1.357,-0.776 -0.458,-0.427 -0.938,-0.671 -1.066,-0.543 -0.128,0.129 -0.347,-0.062 -0.485,-0.424 -0.139,-0.361 -0.511,-0.657 -0.827,-0.657 -0.315,0 -0.96,-0.36 -1.432,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.151 -0.525,-0.336 0,-0.185 -0.726,-0.576 -1.613,-0.868 -1.096,-0.362 -1.449,-0.637 -1.1,-0.858 0.352,-0.224 0.231,-0.328 -0.387,-0.332 -0.495,-0.003 -0.9,-0.143 -0.9,-0.31s-0.379,-0.54 -0.842,-0.829c-0.697,-0.436 -0.795,-0.435 -0.569,0.003 0.149,0.292 -0.086,0.125 -0.523,-0.37 -0.437,-0.495 -1.08,-0.9 -1.43,-0.9 -0.35,0 -0.636,-0.159 -0.636,-0.354 0,-0.195 -0.647,-0.69 -1.439,-1.1l-2.2,-1.141c-0.418,-0.217 -0.761,-0.532 -0.761,-0.7 0,-0.168 -0.294,-0.305 -0.653,-0.305 -0.359,0 -0.944,-0.315 -1.3,-0.7 -0.356,-0.385 -0.917,-0.758 -1.247,-0.83 -0.33,-0.071 -0.66,-0.296 -0.733,-0.5 -0.074,-0.203 -0.489,-0.37 -0.924,-0.37 -0.435,0 -0.679,-0.18 -0.543,-0.4 0.136,-0.22 -0.033,-0.4 -0.376,-0.4 -0.343,0 -0.624,-0.191 -0.624,-0.424 0,-0.233 -0.178,-0.313 -0.397,-0.178 -0.218,0.135 -0.856,-0.215 -1.418,-0.776 -0.562,-0.562 -1.283,-1.022 -1.603,-1.022 -0.32,0 -0.582,-0.18 -0.582,-0.4 0,-0.22 -0.36,-0.4 -0.8,-0.4 -0.44,0 -0.8,-0.18 -0.8,-0.4 0,-0.22 -0.281,-0.4 -0.624,-0.4 -0.343,0 -0.512,-0.18 -0.376,-0.4 0.136,-0.22 -0.046,-0.4 -0.405,-0.4 -0.359,0 -0.924,-0.272 -1.256,-0.604 -0.332,-0.332 -0.797,-0.484 -1.033,-0.338 -0.239,0.148 -0.315,0.08 -0.17,-0.154 0.23,-0.372 -0.587,-0.975 -1.451,-1.069 -0.173,-0.019 -0.443,-0.215 -0.6,-0.435 -0.157,-0.22 -0.69,-0.625 -1.185,-0.9l-1.8,-1c-0.495,-0.275 -0.992,-0.621 -1.104,-0.768 -0.112,-0.147 -0.465,-0.327 -0.784,-0.4 -0.319,-0.073 -0.945,-0.455 -1.391,-0.85 -0.942,-0.834 -2.942,-1.882 -3.594,-1.882 -0.248,0 -0.71,-0.36 -1.027,-0.8 -0.317,-0.44 -0.897,-0.8 -1.288,-0.8 -0.392,0 -0.712,-0.18 -0.712,-0.4a0.41,0.41 0,0 0,-0.417 -0.4c-0.229,0 -0.803,-0.36 -1.275,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.371,-0.4 -0.824,-0.4 -0.453,0 -0.712,-0.18 -0.576,-0.4 0.136,-0.22 -0.033,-0.4 -0.376,-0.4 -0.343,0 -0.624,-0.191 -0.624,-0.424 0,-0.233 -0.157,-0.326 -0.348,-0.208 -0.191,0.118 -0.866,-0.231 -1.5,-0.776s-1.377,-0.991 -1.652,-0.992c-0.275,0 -0.5,-0.18 -0.5,-0.4 0,-0.22 -0.349,-0.4 -0.776,-0.4 -0.427,0 -0.888,-0.18 -1.024,-0.4 -0.365,-0.59 -0.881,-0.487 -1.157,0.233\"/>\n    <path android:fillColor=\"#f46c0c\" android:fillType=\"evenOdd\" android:pathData=\"m209.629,107.854 l-0.829,1.054v88.818c0,67.591 0.114,89.131 0.475,90.132 0.48,1.327 1.59,2.146 1.851,1.365 0.077,-0.233 0.325,-0.423 0.549,-0.423 0.225,0 1.209,-0.54 2.187,-1.2 0.978,-0.66 1.915,-1.2 2.083,-1.2 0.167,0 0.653,-0.315 1.08,-0.7 0.426,-0.385 1.315,-0.97 1.975,-1.3 0.66,-0.33 1.549,-0.915 1.975,-1.3 0.427,-0.385 1.012,-0.7 1.3,-0.7 0.289,0 0.525,-0.18 0.525,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.096,-0.8 1.387,-0.8 0.291,0 0.788,-0.36 1.105,-0.8 0.317,-0.44 0.897,-0.8 1.288,-0.8 0.392,0 0.712,-0.18 0.712,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.136,-0.8 1.475,-0.8 0.339,0 0.617,-0.18 0.617,-0.4 0,-0.22 0.177,-0.4 0.392,-0.4 0.216,0 1.377,-0.63 2.581,-1.4 1.204,-0.77 2.377,-1.4 2.608,-1.4 0.23,0 0.419,-0.158 0.419,-0.351 0,-0.194 0.54,-0.576 1.2,-0.849 0.66,-0.273 1.2,-0.655 1.2,-0.849 0,-0.193 0.236,-0.351 0.525,-0.351 0.288,0 0.88,-0.315 1.315,-0.7 0.435,-0.385 1.053,-0.759 1.372,-0.832 0.319,-0.073 0.672,-0.253 0.784,-0.401 0.112,-0.147 0.699,-0.523 1.304,-0.835 0.605,-0.312 1.1,-0.717 1.1,-0.9 0,-0.182 0.36,-0.332 0.8,-0.332 0.44,0 0.8,-0.18 0.8,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.15 0.6,-0.332 0,-0.183 0.495,-0.583 1.1,-0.888 0.605,-0.306 1.852,-1.056 2.772,-1.668 0.92,-0.611 1.825,-1.112 2.012,-1.112 0.187,0 0.599,-0.36 0.916,-0.8 0.317,-0.44 0.897,-0.8 1.288,-0.8 0.392,0 0.712,-0.18 0.712,-0.4 0,-0.22 0.345,-0.4 0.767,-0.4 0.421,0 0.826,-0.142 0.9,-0.315 0.073,-0.173 1.573,-1.171 3.333,-2.217 4.228,-2.513 4.506,-2.684 6.465,-3.968 0.924,-0.605 1.832,-1.1 2.019,-1.1 0.187,0 0.599,-0.36 0.916,-0.8 0.317,-0.44 0.897,-0.8 1.288,-0.8 0.392,0 0.712,-0.18 0.712,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.136,-0.8 1.475,-0.8 0.339,0 0.617,-0.18 0.617,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.096,-0.8 1.387,-0.8 0.291,0 0.788,-0.36 1.105,-0.8 0.317,-0.44 0.897,-0.8 1.288,-0.8 0.392,0 0.712,-0.18 0.712,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.602,-0.135 0.605,-0.3 0.002,-0.165 0.722,-0.644 1.6,-1.064 0.877,-0.421 1.595,-0.946 1.595,-1.167 0,-0.221 0.105,-0.298 0.233,-0.17 0.209,0.209 2.414,-1.055 3.65,-2.093 0.266,-0.223 0.761,-0.406 1.1,-0.406 0.339,0 0.617,-0.158 0.617,-0.351 0,-0.194 0.54,-0.576 1.2,-0.849 0.66,-0.273 1.2,-0.655 1.2,-0.849 0,-0.193 0.193,-0.351 0.428,-0.351s1.213,-0.54 2.172,-1.2c0.959,-0.66 1.937,-1.2 2.172,-1.2 0.235,0 0.428,-0.18 0.428,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.27,-0.4 0.6,-0.4 0.33,0 0.6,-0.18 0.6,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.136,-0.8 1.475,-0.8 0.339,0 0.617,-0.18 0.617,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.096,-0.8 1.387,-0.8 0.291,0 0.788,-0.36 1.105,-0.8 0.317,-0.44 0.802,-0.8 1.078,-0.8 0.43,0 6.356,-3.423 6.922,-3.998 0.11,-0.112 0.695,-0.458 1.3,-0.77 0.605,-0.312 1.1,-0.717 1.1,-0.9 0,-0.182 0.36,-0.332 0.8,-0.332 0.44,0 0.8,-0.18 0.8,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.911,-0.36 1.383,-0.8 0.472,-0.44 1.096,-0.8 1.387,-0.8 0.291,0 0.788,-0.36 1.105,-0.8 0.317,-0.44 0.897,-0.8 1.288,-0.8 0.392,0 0.712,-0.18 0.712,-0.4 0,-0.22 0.236,-0.4 0.525,-0.4 0.288,0 0.873,-0.315 1.3,-0.7 0.426,-0.385 1.315,-0.969 1.975,-1.297 0.66,-0.329 1.491,-0.914 1.847,-1.3 0.356,-0.387 0.941,-0.703 1.3,-0.703 0.359,0 0.654,-0.135 0.656,-0.3 0.002,-0.165 0.407,-0.501 0.9,-0.748 1.342,-0.669 3.106,-1.675 4.897,-2.79 0.88,-0.548 1.915,-1.099 2.3,-1.226 0.385,-0.126 0.7,-0.388 0.7,-0.583 0,-0.194 0.167,-0.353 0.371,-0.353 0.203,0 1.729,-0.9 3.39,-2s3.205,-2 3.43,-2c0.225,0 0.409,-0.611 0.409,-1.358 0,-1.231 -2.797,-3.842 -4.115,-3.842 -0.135,0 -1.045,-0.54 -2.023,-1.2 -0.978,-0.66 -2.027,-1.2 -2.332,-1.2 -0.304,0 -0.813,-0.36 -1.13,-0.8 -0.317,-0.44 -0.814,-0.8 -1.105,-0.8 -0.291,0 -0.915,-0.36 -1.387,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.32,-0.4 -0.712,-0.4 -0.391,0 -0.971,-0.36 -1.288,-0.8 -0.317,-0.44 -0.729,-0.8 -0.916,-0.8 -0.187,0 -1.125,-0.54 -2.084,-1.2 -0.959,-0.66 -1.937,-1.2 -2.172,-1.2 -0.235,0 -0.428,-0.159 -0.428,-0.353 0,-0.195 -0.315,-0.454 -0.7,-0.576 -0.909,-0.288 -2.853,-1.483 -3.858,-2.371 -0.436,-0.385 -1.029,-0.7 -1.317,-0.7 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.36,-0.4 -0.8,-0.4 -0.44,0 -0.8,-0.167 -0.8,-0.371s-0.72,-0.689 -1.6,-1.077c-0.88,-0.388 -1.6,-0.829 -1.6,-0.98 0,-0.151 -0.585,-0.515 -1.3,-0.809 -0.715,-0.293 -1.649,-0.855 -2.075,-1.248 -0.427,-0.393 -1.012,-0.715 -1.3,-0.715 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.371,-0.4 -0.824,-0.4 -0.453,0 -0.712,-0.18 -0.576,-0.4 0.136,-0.22 -0.033,-0.4 -0.376,-0.4 -0.343,0 -0.624,-0.18 -0.624,-0.4 0,-0.22 -0.278,-0.4 -0.617,-0.4 -0.339,0 -1.003,-0.36 -1.475,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.32,-0.4 -0.712,-0.4 -0.391,0 -0.971,-0.36 -1.288,-0.8 -0.317,-0.44 -0.814,-0.8 -1.105,-0.8 -0.291,0 -0.915,-0.36 -1.387,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.193,-0.4 -0.428,-0.4s-1.213,-0.54 -2.172,-1.2c-0.959,-0.66 -1.937,-1.2 -2.172,-1.2 -0.235,0 -0.429,-0.135 -0.429,-0.3 -0.001,-0.165 -1.036,-0.84 -2.3,-1.5 -1.265,-0.66 -2.389,-1.29 -2.499,-1.401 -0.11,-0.11 -0.695,-0.455 -1.3,-0.767 -0.605,-0.312 -1.1,-0.717 -1.1,-0.9 0,-0.182 -0.36,-0.332 -0.8,-0.332 -0.44,0 -0.8,-0.18 -0.8,-0.4 0,-0.22 -0.371,-0.4 -0.824,-0.4 -0.453,0 -0.712,-0.18 -0.576,-0.4 0.136,-0.22 -0.033,-0.4 -0.376,-0.4 -0.343,0 -0.624,-0.18 -0.624,-0.4 0,-0.22 -0.27,-0.4 -0.6,-0.4 -0.33,0 -0.6,-0.18 -0.6,-0.4 0,-0.22 -0.27,-0.4 -0.6,-0.4 -0.33,0 -0.6,-0.136 -0.6,-0.302 0,-0.167 -0.585,-0.562 -1.3,-0.878 -0.715,-0.317 -1.649,-0.9 -2.075,-1.298 -0.427,-0.397 -1.012,-0.722 -1.3,-0.722 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.278,-0.4 -0.617,-0.4 -0.339,0 -1.003,-0.36 -1.475,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.135 -0.525,-0.301 0,-0.165 -0.855,-0.747 -1.9,-1.294 -1.045,-0.546 -2.138,-1.221 -2.428,-1.499 -0.291,-0.278 -1.371,-1.001 -2.4,-1.606 -1.029,-0.605 -2.412,-1.42 -3.072,-1.811 -0.66,-0.391 -1.515,-0.817 -1.9,-0.947 -0.385,-0.129 -0.7,-0.394 -0.7,-0.589 0,-0.194 -0.32,-0.353 -0.712,-0.353 -0.391,0 -0.971,-0.36 -1.288,-0.8 -0.317,-0.44 -0.814,-0.8 -1.105,-0.8 -0.291,0 -0.915,-0.36 -1.387,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.278,-0.4 -0.617,-0.4 -0.339,0 -1.003,-0.36 -1.475,-0.8 -0.472,-0.44 -1.364,-1.024 -1.983,-1.297 -0.619,-0.274 -1.125,-0.634 -1.125,-0.801 0,-0.166 -0.27,-0.302 -0.6,-0.302 -0.33,0 -0.6,-0.18 -0.6,-0.4 0,-0.22 -0.27,-0.4 -0.6,-0.4 -0.33,0 -0.6,-0.159 -0.6,-0.353 0,-0.195 -0.315,-0.454 -0.7,-0.576 -0.778,-0.246 -2.988,-1.532 -3.3,-1.92 -0.11,-0.136 -1.1,-0.738 -2.2,-1.336 -1.1,-0.599 -2.99,-1.69 -4.2,-2.425 -1.21,-0.736 -2.785,-1.639 -3.5,-2.009 -0.715,-0.37 -1.3,-0.832 -1.3,-1.027 0,-0.195 -0.27,-0.354 -0.6,-0.354 -0.33,0 -0.6,-0.18 -0.6,-0.4 0,-0.22 -0.32,-0.4 -0.712,-0.4 -0.391,0 -0.971,-0.36 -1.288,-0.8 -0.317,-0.44 -0.897,-0.8 -1.288,-0.8 -0.392,0 -0.712,-0.18 -0.712,-0.4 0,-0.22 -0.32,-0.4 -0.712,-0.4 -0.391,0 -0.971,-0.36 -1.288,-0.8 -0.317,-0.44 -0.814,-0.8 -1.105,-0.8 -0.291,0 -0.915,-0.36 -1.387,-0.8 -0.472,-0.44 -1.095,-0.8 -1.383,-0.8 -0.289,0 -0.525,-0.18 -0.525,-0.4 0,-0.22 -0.32,-0.4 -0.712,-0.4 -0.391,0 -0.971,-0.36 -1.288,-0.8 -0.317,-0.44 -0.729,-0.8 -0.916,-0.8 -0.187,0 -1.095,-0.495 -2.019,-1.1 -3.35,-2.196 -6.655,-4.1 -7.115,-4.1 -0.193,0 -0.35,-0.18 -0.35,-0.4 0,-0.22 -0.36,-0.4 -0.8,-0.4 -0.44,0 -0.8,-0.18 -0.8,-0.4 0,-0.722 -0.727,-0.419 -1.571,0.654\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_play_arrow.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M8,5v14l11,-7z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_play_arrow_shadow.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:autoMirrored=\"true\"\n    android:viewportWidth=\"80\"\n    android:viewportHeight=\"80\">\n    <path\n        android:fillColor=\"#00000000\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M12.0447,6.5087 L12.0447,72.7367 69.3276,38.8486Z\"\n        android:strokeWidth=\"7\"\n        android:strokeAlpha=\"0.25\"\n        android:strokeColor=\"#000000\"\n        android:strokeLineCap=\"butt\"\n        android:strokeLineJoin=\"miter\" />\n    <path\n        android:fillColor=\"#00000000\"\n        android:fillType=\"evenOdd\"\n        android:pathData=\"M12.0447,6.5087 L12.0447,72.7367 69.3276,38.8486Z\"\n        android:strokeWidth=\"5\"\n        android:strokeAlpha=\"0.73333333\"\n        android:strokeColor=\"#ffffff\"\n        android:strokeLineCap=\"butt\"\n        android:strokeLineJoin=\"miter\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_play_seek_triangle.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"16dp\"\n    android:height=\"20dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FFFFFF\"\n        android:pathData=\"M3,2 L22,12 L3,22 Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_playlist_add.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M14,10H3v2h11V10zM14,6H3v2h11V6zM18,14v-4h-2v4h-4v2h4v4h2v-4h4v-2H18zM3,16h7v-2H3V16z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_playlist_add_check.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,10h11v2h-11z\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,6h11v2h-11z\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,14h7v2h-7z\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20.59,11.93l-4.25,4.24l-2.12,-2.12l-1.41,1.41l3.53,3.54l5.66,-5.66z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_playlist_play.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,10h11v2h-11z\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,6h11v2h-11z\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,14h7v2h-7z\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16,13l0,8l6,-4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_podcasts.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\" android:height=\"24dp\" android:tint=\"#000000\" android:viewportHeight=\"24\" android:viewportWidth=\"24\" android:width=\"24dp\">\n      \n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M14,12c0,0.74 -0.4,1.38 -1,1.72V22h-2v-8.28c-0.6,-0.35 -1,-0.98 -1,-1.72c0,-1.1 0.9,-2 2,-2S14,10.9 14,12zM12,6c-3.31,0 -6,2.69 -6,6c0,1.74 0.75,3.31 1.94,4.4l1.42,-1.42C8.53,14.25 8,13.19 8,12c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,1.19 -0.53,2.25 -1.36,2.98l1.42,1.42C17.25,15.31 18,13.74 18,12C18,8.69 15.31,6 12,6zM12,2C6.48,2 2,6.48 2,12c0,2.85 1.2,5.41 3.11,7.24l1.42,-1.42C4.98,16.36 4,14.29 4,12c0,-4.41 3.59,-8 8,-8s8,3.59 8,8c0,2.29 -0.98,4.36 -2.53,5.82l1.42,1.42C20.8,17.41 22,14.85 22,12C22,6.48 17.52,2 12,2z\"/>\n    \n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_previous.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_public.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM11,19.93c-3.95,-0.49 -7,-3.85 -7,-7.93 0,-0.62 0.08,-1.21 0.21,-1.79L9,15v1c0,1.1 0.9,2 2,2v1.93zM17.9,17.39c-0.26,-0.81 -1,-1.39 -1.9,-1.39h-1v-3c0,-0.55 -0.45,-1 -1,-1L8,12v-2h2c0.55,0 1,-0.45 1,-1L11,7h2c1.1,0 2,-0.9 2,-2v-0.41c2.93,1.19 5,4.06 5,7.41 0,2.08 -0.8,3.97 -2.1,5.39z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_radio.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3.24,6.15C2.51,6.43 2,7.17 2,8v12c0,1.1 0.89,2 2,2h16c1.11,0 2,-0.9 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2L8.3,6l8.26,-3.34L15.88,1 3.24,6.15zM7,20c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM20,12h-2v-2h-2v2L4,12L4,8h16v4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_refresh.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_repeat.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M7,7h10v3l4,-4 -4,-4v3L5,5v6h2L7,7zM17,17L7,17v-3l-4,4 4,4v-3h12v-6h-2v4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_replay.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M12,5V1L7,6l5,5V7c3.31,0 6,2.69 6,6s-2.69,6 -6,6 -6,-2.69 -6,-6H4c0,4.42 3.58,8 8,8s8,-3.58 8,-8 -3.58,-8 -8,-8z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_restaurant.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11,9L9,9L9,2L7,2v7L5,9L5,2L3,2v7c0,2.12 1.66,3.84 3.75,3.97L6.75,22h2.5v-9.03C11.34,12.84 13,11.12 13,9L13,2h-2v7zM16,6v8h2.5v8L21,22L21,2c-2.76,0 -5,2.24 -5,4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_rss_feed.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6.18,17.82m-2.18,0a2.18,2.18 0,1 1,4.36 0a2.18,2.18 0,1 1,-4.36 0\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M4,4.44v2.83c7.03,0 12.73,5.7 12.73,12.73h2.83c0,-8.59 -6.97,-15.56 -15.56,-15.56zM4,10.1v2.83c3.9,0 7.07,3.17 7.07,7.07h2.83c0,-5.47 -4.43,-9.9 -9.9,-9.9z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_save.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_school.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M5,13.18v4L12,21l7,-3.82v-4L12,17l-7,-3.82zM12,3L1,9l11,6 9,-4.91V17h2V9L12,3z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_search.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_search_add.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,17.59L17.59,19L7,8.41V15H5V5H15V7H8.41L19,17.59Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_select_all.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,5h2L5,3c-1.1,0 -2,0.9 -2,2zM3,13h2v-2L3,11v2zM7,21h2v-2L7,19v2zM3,9h2L5,7L3,7v2zM13,3h-2v2h2L13,3zM19,3v2h2c0,-1.1 -0.9,-2 -2,-2zM5,21v-2L3,19c0,1.1 0.9,2 2,2zM3,17h2v-2L3,15v2zM9,3L7,3v2h2L9,3zM11,21h2v-2h-2v2zM19,13h2v-2h-2v2zM19,21c1.1,0 2,-0.9 2,-2h-2v2zM19,9h2L21,7h-2v2zM19,17h2v-2h-2v2zM15,21h2v-2h-2v2zM15,5h2L17,3h-2v2zM7,17h10L17,7L7,7v10zM9,9h6v6L9,15L9,9z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_settings.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_settings_backup_restore.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M14,12c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2 0.9,2 2,2 2,-0.9 2,-2zM12,3c-4.97,0 -9,4.03 -9,9L0,12l4,4 4,-4L5,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.51,0 -2.91,-0.49 -4.06,-1.3l-1.42,1.44C8.04,20.3 9.94,21 12,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_share.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_shopping_cart.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM1,2v2h2l3.6,7.59 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h12v-2L7.42,15c-0.14,0 -0.25,-0.11 -0.25,-0.25l0.03,-0.12 0.9,-1.63h7.45c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.08,-0.14 0.12,-0.31 0.12,-0.48 0,-0.55 -0.45,-1 -1,-1L5.21,4l-0.94,-2L1,2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_shuffle.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10.59,9.17L5.41,4 4,5.41l5.17,5.17 1.42,-1.41zM14.5,4l2.04,2.04L4,18.59 5.41,20 17.96,7.46 20,9.5L20,4h-5.5zM14.83,13.41l-1.41,1.41 3.13,3.13L14.5,20L20,20v-5.5l-2.04,2.04 -3.13,-3.13z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_smart_display.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:width=\"24dp\"\n    android:viewportHeight=\"24\"\n    android:viewportWidth=\"24\"\n    android:tint=\"@color/defaultIconTint\">\n    <path\n        android:pathData=\"M20 4H4c-1.1 0-2 0.9-2 2v12c0 1.1 0.9 2 2 2h16c1.1 0 2-0.9 2-2V6c0-1.1-0.9-2-2-2zM9.5 16.5v-9l7 4.5-7 4.5z\"\n        android:fillColor=\"#FF000000\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_sort.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,18h6v-2L3,16v2zM3,6v2h18L21,6L3,6zM3,13h12v-2L3,11v2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_stars.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM16.23,18L12,15.45 7.77,18l1.12,-4.81 -3.73,-3.23 4.92,-0.42L12,5l1.92,4.53 4.92,0.42 -3.73,3.23L16.23,18z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_subscriptions.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportHeight=\"24\"\n    android:viewportWidth=\"24\"\n    android:width=\"24dp\" >\n    <path\n        android:fillColor=\"@android:color/white\"\n        android:pathData=\"M20,8L4,8L4,6h16v2zM18,2L6,2v2h12L18,2zM22,12v8c0,1.1 -0.9,2 -2,2L4,22c-1.1,0 -2,-0.9 -2,-2v-8c0,-1.1 0.9,-2 2,-2h16c1.1,0 2,0.9 2,2zM16,16l-6,-3.27v6.53L16,16z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_subtitles.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM4,12h4v2L4,14v-2zM14,18L4,18v-2h10v2zM20,18h-4v-2h4v2zM20,14L10,14v-2h10v2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_telescope.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M21.9,8.9L20.2,9.9L16.2,3L17.9,2L21.9,8.9M9.8,7.9L12.8,13.1L18.9,9.6L15.9,4.4L9.8,7.9M11.4,12.7L9.4,9.2L5.1,11.7L7.1,15.2L11.4,12.7M2.1,14.6L3.1,16.3L5.7,14.8L4.7,13.1L2.1,14.6M12.1,14L11.8,13.6L7.5,16.1L7.8,16.5C8,16.8 8.3,17.1 8.6,17.3L7,22H9L10.4,17.7H10.5L12,22H14L12.1,16.4C12.6,15.7 12.6,14.8 12.1,14Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_thumb_down.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M15,3L6,3c-0.83,0 -1.54,0.5 -1.84,1.22l-3.02,7.05c-0.09,0.23 -0.14,0.47 -0.14,0.73v2c0,1.1 0.9,2 2,2h6.31l-0.95,4.57 -0.03,0.32c0,0.41 0.17,0.79 0.44,1.06L9.83,23l6.59,-6.59c0.36,-0.36 0.58,-0.86 0.58,-1.41L17,5c0,-1.1 -0.9,-2 -2,-2zM19,3v12h4L23,3h-4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_thumb_up.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M1,21h4L5,9L1,9v12zM23,10c0,-1.1 -0.9,-2 -2,-2h-6.31l0.95,-4.57 0.03,-0.32c0,-0.41 -0.17,-0.79 -0.44,-1.06L14.17,1 7.59,7.59C7.22,7.95 7,8.45 7,9v10c0,1.1 0.9,2 2,2h9c0.83,0 1.54,-0.5 1.84,-1.22l3.02,-7.05c0.09,-0.23 0.14,-0.47 0.14,-0.73v-2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_trending_up.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16,6l2.29,2.29 -4.88,4.88 -4,-4L2,16.59 3.41,18l6,-6 4,4 6.3,-6.29L22,12V6z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_tv.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M21,6h-7.59l3.29,-3.29L16,2l-4,4 -4,-4 -0.71,0.71L10.59,6L3,6c-1.1,0 -2,0.89 -2,2v12c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.11 -0.9,-2 -2,-2zM21,20L3,20L3,8h18v12z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_videogame_asset.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M21,6L3,6c-1.1,0 -2,0.9 -2,2v8c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,8c0,-1.1 -0.9,-2 -2,-2zM11,13L8,13v3L6,16v-3L3,13v-2h3L6,8h2v3h3v2zM15.5,15c-0.83,0 -1.5,-0.67 -1.5,-1.5s0.67,-1.5 1.5,-1.5 1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5zM19.5,12c-0.83,0 -1.5,-0.67 -1.5,-1.5S18.67,9 19.5,9s1.5,0.67 1.5,1.5 -0.67,1.5 -1.5,1.5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_visibility_on.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_volume_down.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M18.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM5,9v6h4l5,5V4L9,9H5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_volume_mute.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M7,9v6h4l5,5V4l-5,5H7z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_volume_off.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v2.21l2.45,2.45c0.03,-0.2 0.05,-0.41 0.05,-0.63zM19,12c0,0.94 -0.2,1.82 -0.54,2.64l1.51,1.51C20.63,14.91 21,13.5 21,12c0,-4.28 -2.99,-7.86 -7,-8.77v2.06c2.89,0.86 5,3.54 5,6.71zM4.27,3L3,4.27 7.73,9L3,9v6h4l5,5v-6.73l4.25,4.25c-0.67,0.52 -1.42,0.93 -2.25,1.18v2.06c1.38,-0.31 2.63,-0.95 3.69,-1.81L19.73,21 21,19.73l-9,-9L4.27,3zM12,4L9.91,6.09 12,8.18L12,4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_volume_up.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_watch_later.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,2C6.5,2 2,6.5 2,12s4.5,10 10,10s10,-4.5 10,-10S17.5,2 12,2zM16.2,16.2L11,13V7h1.5v5.2l4.5,2.7L16.2,16.2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_wb_sunny.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6.76,4.84l-1.8,-1.79 -1.41,1.41 1.79,1.79 1.42,-1.41zM4,10.5L1,10.5v2h3v-2zM13,0.55h-2L11,3.5h2L13,0.55zM20.45,4.46l-1.41,-1.41 -1.79,1.79 1.41,1.41 1.79,-1.79zM17.24,18.16l1.79,1.8 1.41,-1.41 -1.8,-1.79 -1.4,1.4zM20,10.5v2h3v-2h-3zM12,5.5c-3.31,0 -6,2.69 -6,6s2.69,6 6,6 6,-2.69 6,-6 -2.69,-6 -6,-6zM11,22.45h2L13,19.5h-2v2.95zM3.55,18.54l1.41,1.41 1.79,-1.8 -1.41,-1.41 -1.79,1.8z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_whatshot.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M13.5,0.67s0.74,2.65 0.74,4.8c0,2.06 -1.35,3.73 -3.41,3.73 -2.07,0 -3.63,-1.67 -3.63,-3.73l0.03,-0.36C5.21,7.51 4,10.62 4,14c0,4.42 3.58,8 8,8s8,-3.58 8,-8C20,8.61 17.41,3.8 13.5,0.67zM11.71,19c-1.78,0 -3.22,-1.4 -3.22,-3.14 0,-1.62 1.05,-2.76 2.81,-3.12 1.77,-0.36 3.6,-1.21 4.62,-2.58 0.39,1.29 0.59,2.65 0.59,4.04 0,2.65 -2.15,4.8 -4.8,4.8z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_work.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"@color/defaultIconTint\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,6h-4L16,4c0,-1.11 -0.89,-2 -2,-2h-4c-1.11,0 -2,0.89 -2,2v2L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM14,6h-4L10,4h4v2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/not_available_monkey.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"2608dp\"\n    android:height=\"1469dp\"\n    android:tint=\"?attr/colorAccent\"\n    android:viewportWidth=\"2608\"\n    android:viewportHeight=\"1469\">\n    <path\n        android:pathData=\"M1495.4,309.4c-12.7,3.1 -29.4,14 -39.4,25.7 -41.7,49 -61.3,150.9 -47.4,246.9 10.5,72.3 39,127 74.9,143.5 27.6,12.8 56.5,4.5 79.5,-22.7 57.5,-68.1 68.2,-234.7 21.4,-331.8 -16.8,-34.8 -37.4,-55.3 -61.9,-61.5 -7,-1.8 -20,-1.8 -27.1,-0.1z\"\n        android:fillColor=\"#000000\"\n        android:strokeColor=\"#00000000\"/>\n    <path\n        android:pathData=\"M1112.6,357.6c-45.9,11.1 -80.9,78.7 -89.6,172.9 -1.6,17.4 -1.4,60.1 0.4,78.6 7,71.1 30.1,129 61.8,154.5 13.9,11.3 26,15.9 41.3,15.7 18.6,-0.1 33.5,-7.3 49.3,-23.8 51.8,-53.8 70.8,-187.9 41.7,-293.8 -18.1,-66.3 -52.6,-106.1 -91.6,-105.6 -4.1,-0 -10,0.7 -13.3,1.5z\"\n        android:fillColor=\"#000000\"\n        android:strokeColor=\"#00000000\"/>\n    <path\n        android:pathData=\"M1339.05,750c-3.8,4.5 -5.2,9.6 -5.1,19.1 0,7 0.5,9.4 2.5,13.5 4.5,9.1 10.2,9.5 15,1 2.1,-3.6 2.4,-5.3 2.4,-15.1 0,-9.5 -0.3,-11.6 -2.3,-15.2 -3.7,-7 -8.4,-8.2 -12.5,-3.3z\"\n        android:fillColor=\"#000000\"\n        android:strokeColor=\"#00000000\"/>\n    <path\n        android:pathData=\"M1296.95,756c-3.2,3.9 -4.7,9.5 -4.8,17.5 0,7.8 0.8,12 3.5,16.8 4,7.1 10.3,6.4 14.2,-1.7 4.6,-9.5 3.5,-25.8 -2.1,-32.6 -3.5,-4 -7.3,-4 -10.8,-0z\"\n        android:fillColor=\"#000000\"\n        android:strokeColor=\"#00000000\"/>\n    <path\n        android:pathData=\"M1304.5,840.6c-34,3.6 -54.9,7.4 -80.5,14.8 -90.8,26.1 -187.2,87.1 -296,187.4 -15.3,14.1 -36,34.3 -36,35.1 0,0.4 3.3,4 7.4,8l7.5,7.4 4.3,-3.8c2.4,-2.1 11.5,-10.7 20.3,-19.1 112,-106.4 215,-171.7 310,-196.5 16.2,-4.2 37.1,-8 55.5,-10 14.3,-1.6 52,-1.6 66,-0 91.9,10.4 176.9,53.2 273.5,137.7 17.4,15.2 65.3,62.3 85.6,84.2l11.4,12.2 7.8,-7.1c4.3,-3.9 7.7,-7.7 7.5,-8.4 -0.5,-2.1 -34.4,-37.9 -56.4,-59.5 -109.9,-107.8 -212,-166 -316.4,-180.2 -14,-1.8 -60.8,-3.3 -71.5,-2.2z\"\n        android:fillColor=\"#000000\"\n        android:strokeColor=\"#00000000\"/>\n</vector>"
  },
  {
    "path": "app/src/main/res/drawable/placeholder_person.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n\n  <path\n      android:pathData=\"M0,0 L24,0 L24,24 L0,24 z\"\n      android:fillColor=\"@color/placeholder_background\" />\n\n  <group android:scaleX=\"0.8333333\"\n      android:scaleY=\"0.8333333\"\n      android:translateX=\"2\"\n      android:translateY=\"2\">\n    <path\n        android:pathData=\"M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z\"\n        android:fillColor=\"@color/placeholder_foreground\" />\n  </group>\n\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/placeholder_thumbnail_playlist.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"16dp\"\n    android:height=\"9dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M0,0h24v24h-24z\"\n      android:fillColor=\"@color/placeholder_background\" />\n  <path\n      android:pathData=\"M13,12L8,17.5L8,6.5\"\n      android:fillColor=\"@color/placeholder_foreground\" />\n  <path\n      android:pathData=\"M16,12L11,17.5L11,6.5\"\n      android:fillColor=\"@color/placeholder_foreground\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/placeholder_thumbnail_video.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"16dp\"\n    android:height=\"9dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M0,0h24v24h-24z\"\n      android:fillColor=\"@color/placeholder_background\" />\n  <path\n      android:pathData=\"M15,12L9,17.5L9,6.5\"\n      android:fillColor=\"@color/placeholder_foreground\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/player_controls_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <gradient\n        android:angle=\"90\"\n        android:endColor=\"#00000000\"\n        android:startColor=\"@color/video_overlay_color\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/player_controls_top_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <gradient\n        android:angle=\"-90\"\n        android:endColor=\"#00000000\"\n        android:startColor=\"@color/video_overlay_color\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/progress_circular_white.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rotate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:fromDegrees=\"-90\"\n    android:toDegrees=\"-90\">\n    <shape\n        android:innerRadiusRatio=\"2.25\"\n        android:shape=\"ring\"\n        android:thicknessRatio=\"17.75\"\n        android:useLevel=\"true\">\n        <solid android:color=\"@android:color/white\" />\n    </shape>\n</rotate>\n"
  },
  {
    "path": "app/src/main/res/drawable/progress_soundcloud_horizontal_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@android:id/background\">\n        <shape>\n            <solid android:color=\"@color/dark_ripple_color\" />\n        </shape>\n    </item>\n    <item android:id=\"@android:id/progress\">\n        <clip>\n            <shape>\n                <solid android:color=\"@color/dark_soundcloud_primary_color\" />\n            </shape>\n        </clip>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/progress_soundcloud_horizontal_light.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@android:id/background\">\n        <shape>\n            <solid android:color=\"@color/light_ripple_color\" />\n        </shape>\n    </item>\n    <item android:id=\"@android:id/progress\">\n        <clip>\n            <shape>\n                <solid android:color=\"@color/light_soundcloud_primary_color\" />\n            </shape>\n        </clip>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/progress_youtube_horizontal_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@android:id/background\">\n        <shape>\n            <solid android:color=\"@color/dark_ripple_color\" />\n        </shape>\n    </item>\n    <item android:id=\"@android:id/progress\">\n        <clip>\n            <shape>\n                <solid android:color=\"@color/dark_youtube_primary_color\" />\n            </shape>\n        </clip>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/progress_youtube_horizontal_light.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:id=\"@android:id/background\">\n        <shape>\n            <solid android:color=\"@color/light_ripple_color\" />\n        </shape>\n    </item>\n    <item android:id=\"@android:id/progress\">\n        <clip>\n            <shape>\n                <solid android:color=\"@color/light_youtube_primary_color\" />\n            </shape>\n        </clip>\n    </item>\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/selector_checked_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" android:enterFadeDuration=\"200\" android:exitFadeDuration=\"200\">\n    <item android:drawable=\"@color/dark_ripple_color\" android:state_checked=\"true\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@color/dark_ripple_color\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@color/dark_selected_color\" android:state_checked=\"true\" />\n    <item android:drawable=\"@android:color/transparent\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/selector_checked_light.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" android:enterFadeDuration=\"200\" android:exitFadeDuration=\"200\">\n    <item android:drawable=\"@color/light_ripple_color\" android:state_checked=\"true\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@color/light_ripple_color\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@color/light_selected_color\" android:state_checked=\"true\" />\n    <item android:drawable=\"@android:color/transparent\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/selector_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@color/selected_background_color\" android:state_selected=\"true\" />\n    <item android:drawable=\"@color/transparent_background_color\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/selector_focused_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@color/selected_background_color\" android:state_focused=\"true\" />\n    <item android:drawable=\"@color/transparent_background_color\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/selector_focused_light.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@color/selected_background_color\" android:state_focused=\"true\" />\n    <item android:drawable=\"@color/transparent_background_color\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/selector_light.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@color/selected_background_color\" android:state_selected=\"true\" />\n    <item android:drawable=\"@color/transparent_background_color\" />\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/splash_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:drawable=\"@color/light_youtube_primary_color\"/>\n\n    <item>\n        <bitmap\n            android:src=\"@drawable/ic_newpipe_triangle_white\"\n            android:gravity=\"center_vertical|center_horizontal\" />\n    </item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable/splash_foreground.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"100dp\"\n    android:height=\"100dp\"\n    android:viewportWidth=\"100\"\n    android:viewportHeight=\"100\">\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"m23.909,10.211v78.869c0,0 7.7,-4.556 12.4,-7.337V67.477,56.739 31.686c0,0 3.707,2.173 8.948,5.24 6.263,3.579 14.57,8.565 21.473,12.655 -9.358,5.483 -16.8,9.876 -22.496,13.234V77.053C57.974,68.927 75.176,58.762 90.762,49.581 75.551,40.634 57.144,29.768 43.467,21.715 31.963,14.94 23.909,10.211 23.909,10.211Z\"\n        android:strokeWidth=\"1.2782383\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/toolbar_shadow_dark.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <gradient\n        android:angle=\"-90\"\n        android:endColor=\"#00000000\"\n        android:startColor=\"@color/dark_shadow_start_color\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/toolbar_shadow_light.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <gradient\n        android:angle=\"-90\"\n        android:endColor=\"#00000000\"\n        android:startColor=\"@color/light_shadow_start_color\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable-mdpi/volunteer_activism_ic.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\">\n  <path\n      android:pathData=\"M640,520 L474,358q-31,-30 -52.5,-66.5T400,212q0,-55 38.5,-93.5T532,80q32,0 60,13.5t48,36.5q20,-23 48,-36.5t60,-13.5q55,0 93.5,38.5T880,212q0,43 -21,79.5T807,358L640,520ZM640,408 L749,301q19,-19 35,-40.5t16,-48.5q0,-22 -15,-37t-37,-15q-14,0 -26.5,5.5T700,182l-60,72 -60,-72q-9,-11 -21.5,-16.5T532,160q-22,0 -37,15t-15,37q0,27 16,48.5t35,40.5l109,107ZM280,740l278,76 238,-74q-5,-9 -14.5,-15.5T760,720L558,720q-27,0 -43,-2t-33,-8l-93,-31 22,-78 81,27q17,5 40,8t68,4q0,-11 -6.5,-21T578,606l-234,-86h-64v220ZM40,880v-440h304q7,0 14,1.5t13,3.5l235,87q33,12 53.5,42t20.5,66h80q50,0 85,33t35,87v40L560,900l-280,-78v58L40,880ZM120,800h80v-280h-80v280ZM640,254Z\"\n      android:fillColor=\"#FF000000\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable-night/ic_heart.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:tint=\"#FF5252\"\n    android:viewportWidth=\"24.0\"\n    android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable-night/splash_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:drawable=\"@color/dark_youtube_primary_color\"/>\n\n    <item>\n        <bitmap\n            android:src=\"@drawable/ic_newpipe_triangle_white\"\n            android:gravity=\"center_vertical|center_horizontal\" />\n    </item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable-night-v23/splash_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:drawable=\"@color/dark_youtube_primary_color\"/>\n\n    <item\n        android:width=\"80dp\"\n        android:height=\"80dp\"\n        android:gravity=\"center\"\n        android:drawable=\"@drawable/splash_foreground\"/>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable-v23/splash_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:drawable=\"@color/light_youtube_primary_color\"/>\n\n    <item\n        android:width=\"80dp\"\n        android:height=\"80dp\"\n        android:gravity=\"center\"\n        android:drawable=\"@drawable/splash_foreground\"/>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/layout/activity_about.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    tools:context=\"org.schabi.newpipe.about.AboutActivity\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingTop=\"@dimen/appbar_padding_top\"\n        android:theme=\"@style/ThemeOverlay.AppCompat.DayNight.ActionBar\"\n        app:popupTheme=\"@style/ThemeOverlay.AppCompat.DayNight.ActionBar\">\n\n        <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/about_toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?attr/actionBarSize\"\n            android:background=\"?attr/colorPrimary\"\n            android:theme=\"@style/ToolbarTheme\"\n            app:layout_scrollFlags=\"scroll|enterAlways\" />\n\n        <com.google.android.material.tabs.TabLayout\n            android:id=\"@+id/about_tabLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:tabTextColor=\"@color/white\"\n            app:tabIndicatorColor=\"@color/white\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <androidx.viewpager2.widget.ViewPager2\n        android:id=\"@+id/about_viewPager2\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_downloader.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include\n        layout=\"@layout/toolbar_layout\"\n        android:id=\"@+id/toolbar_layout\" />\n\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/frame\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_error.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".error.ErrorActivity\">\n\n    <include\n        layout=\"@layout/toolbar_layout\"\n        android:id=\"@+id/toolbar_layout\"/>\n\n    <ScrollView\n        android:id=\"@+id/scrollView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginTop=\"?attr/actionBarSize\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:focusable=\"true\"\n            android:focusableInTouchMode=\"true\"\n            android:orientation=\"vertical\"\n            android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n            android:paddingTop=\"@dimen/activity_vertical_margin\"\n            android:paddingRight=\"@dimen/activity_horizontal_margin\"\n            android:paddingBottom=\"@dimen/activity_vertical_margin\">\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/errorSorryView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center\"\n                android:text=\"@string/sorry_string\"\n                android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                android:textStyle=\"bold\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:paddingTop=\"@dimen/activity_vertical_margin\"\n                android:text=\"@string/what_happened_headline\"\n                android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/errorMessageView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/info_labels\"\n                android:textColor=\"?attr/colorAccent\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:paddingTop=\"@dimen/activity_vertical_margin\"\n                android:text=\"@string/what_device_headline\"\n                android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\">\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/errorInfoLabelsView\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/info_labels\"\n                    android:textColor=\"?attr/colorAccent\" />\n\n                <HorizontalScrollView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:paddingLeft=\"16dp\">\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/errorInfosView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\" />\n\n                </HorizontalScrollView>\n\n            </LinearLayout>\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:paddingTop=\"@dimen/activity_vertical_margin\"\n                android:text=\"@string/error_details_headline\"\n                android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n            <HorizontalScrollView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center\">\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/errorView\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textIsSelectable=\"true\"\n                    android:typeface=\"monospace\" />\n            </HorizontalScrollView>\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:paddingTop=\"@dimen/activity_vertical_margin\"\n                android:text=\"@string/your_comment\"\n                android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n            <org.schabi.newpipe.views.NewPipeEditText\n                android:id=\"@+id/errorCommentBox\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:inputType=\"\" />\n\n            <Button\n                android:id=\"@+id/errorReportEmailButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/error_report_button_text\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"10dp\"\n                android:layout_marginBottom=\"5dp\"\n                android:text=\"@string/error_report_open_github_notice\"\n                android:textStyle=\"bold\" />\n\n            <Button\n                android:id=\"@+id/errorReportCopyButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/copy_for_github\" />\n\n            <Button\n                android:id=\"@+id/errorReportGitHubButton\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/error_report_open_issue_button_text\" />\n\n        </LinearLayout>\n    </ScrollView>\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<org.schabi.newpipe.views.FocusAwareDrawerLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <org.schabi.newpipe.views.FocusAwareCoordinator\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/fragment_holder\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginTop=\"?attr/actionBarSize\" />\n\n        <include\n            layout=\"@layout/toolbar_layout\"\n            android:id=\"@+id/toolbar_layout\"/>\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/fragment_player_holder\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center_horizontal\"\n            app:behavior_hideable=\"true\"\n            app:behavior_peekHeight=\"0dp\"\n            app:layout_behavior=\"org.schabi.newpipe.player.gesture.CustomBottomSheetBehavior\" />\n\n    </org.schabi.newpipe.views.FocusAwareCoordinator>\n\n    <include\n        layout=\"@layout/drawer_layout\"\n        android:id=\"@+id/drawer_layout\" />\n\n</org.schabi.newpipe.views.FocusAwareDrawerLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_player_queue_control.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/main_content\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    tools:context=\"org.schabi.newpipe.player.PlayQueueActivity\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:id=\"@+id/appbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ThemeOverlay.AppCompat.DayNight.ActionBar\"\n        app:popupTheme=\"@style/ThemeOverlay.AppCompat.DayNight.ActionBar\">\n\n        <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?attr/actionBarSize\"\n            android:layout_weight=\"1\"\n            android:background=\"?attr/colorPrimary\"\n            android:theme=\"@style/ToolbarTheme\"\n            app:layout_scrollFlags=\"scroll|enterAlways\"\n            app:title=\"@string/app_name\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/play_queue\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_above=\"@id/metadata\"\n        android:layout_below=\"@id/appbar\"\n        android:scrollbars=\"vertical\"\n        app:layoutManager=\"LinearLayoutManager\"\n        tools:listitem=\"@layout/play_queue_item\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/seek_display\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:layout_above=\"@id/metadata\"\n        android:background=\"#c0000000\"\n        android:paddingLeft=\"30dp\"\n        android:paddingTop=\"5dp\"\n        android:paddingRight=\"30dp\"\n        android:paddingBottom=\"5dp\"\n        android:textColor=\"@android:color/white\"\n        android:textSize=\"22sp\"\n        android:textStyle=\"bold\"\n        android:visibility=\"gone\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"1:06:29\"\n        tools:visibility=\"visible\" />\n\n    <LinearLayout\n        android:id=\"@+id/metadata\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_above=\"@id/progress_bar\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:orientation=\"vertical\"\n        android:padding=\"8dp\"\n        tools:ignore=\"RtlHardcoded,RtlSymmetry\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/song_name\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"marquee\"\n            android:fadingEdge=\"horizontal\"\n            android:marqueeRepeatLimit=\"marquee_forever\"\n            android:scrollHorizontally=\"true\"\n            android:singleLine=\"true\"\n            android:textAppearance=\"?android:attr/textAppearanceLarge\"\n            android:textSize=\"14sp\"\n            tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nec aliquam augue, eget cursus est. Ut id tristique enim, ut scelerisque tellus. Sed ultricies ipsum non mauris ultricies, commodo malesuada velit porta.\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/artist_name\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"marquee\"\n            android:fadingEdge=\"horizontal\"\n            android:marqueeRepeatLimit=\"marquee_forever\"\n            android:scrollHorizontally=\"true\"\n            android:singleLine=\"true\"\n            android:textAppearance=\"?android:attr/textAppearanceMedium\"\n            android:textSize=\"12sp\"\n            tools:text=\"Duis posuere arcu condimentum lobortis mattis.\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/progress_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        android:paddingLeft=\"12dp\"\n        android:paddingRight=\"12dp\"\n        android:layout_above=\"@+id/playback_controls\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/current_time\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:gravity=\"center\"\n            android:minHeight=\"40dp\"\n            android:text=\"-:--:--\"\n            android:textColor=\"?attr/colorAccent\"\n            tools:ignore=\"HardcodedText\"\n            tools:text=\"1:06:29\" />\n\n\n        <androidx.appcompat.widget.AppCompatSeekBar\n            android:id=\"@+id/seek_bar\"\n            style=\"@style/Widget.AppCompat.SeekBar\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:paddingStart=\"12dp\"\n            android:paddingTop=\"6dp\"\n            android:paddingEnd=\"12dp\"\n            android:paddingBottom=\"4dp\"\n            tools:progress=\"25\"\n            tools:secondaryProgress=\"50\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/end_time\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:gravity=\"center\"\n            android:text=\"-:--:--\"\n            android:textColor=\"?attr/colorAccent\"\n            tools:ignore=\"HardcodedText\"\n            tools:text=\"1:23:49\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/live_sync\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:background=\"?attr/selectableItemBackground\"\n            android:gravity=\"center\"\n            android:paddingLeft=\"4dp\"\n            android:paddingRight=\"4dp\"\n            android:text=\"@string/duration_live\"\n            android:textAllCaps=\"true\"\n            android:textColor=\"?attr/colorAccent\"\n            android:visibility=\"gone\" />\n    </LinearLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/playback_controls\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginBottom=\"12dp\"\n        tools:ignore=\"RtlHardcoded\">\n\n        <ImageButton\n            android:id=\"@+id/control_repeat\"\n            android:layout_width=\"30dp\"\n            android:layout_height=\"30dp\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"5dp\"\n            android:layout_marginRight=\"5dp\"\n            android:layout_toLeftOf=\"@+id/control_backward\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:scaleType=\"fitXY\"\n            android:src=\"@drawable/ic_repeat\"\n            app:tint=\"?attr/colorAccent\"\n            tools:ignore=\"ContentDescription\" />\n\n        <androidx.appcompat.widget.AppCompatImageButton\n            android:id=\"@+id/control_backward\"\n            android:layout_width=\"32dp\"\n            android:layout_height=\"32dp\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"5dp\"\n            android:layout_toLeftOf=\"@+id/control_fast_rewind\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:scaleType=\"fitCenter\"\n            android:src=\"@drawable/ic_previous\"\n            android:tint=\"?attr/colorAccent\"\n            tools:ignore=\"ContentDescription\" />\n\n        <ImageButton\n            android:id=\"@+id/control_fast_rewind\"\n            android:layout_width=\"40dp\"\n            android:layout_height=\"40dp\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"5dp\"\n            android:layout_toLeftOf=\"@id/control_play_pause\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:scaleType=\"fitCenter\"\n            android:src=\"@drawable/exo_controls_rewind\"\n            app:tint=\"?attr/colorAccent\" />\n\n        <ImageButton\n            android:id=\"@+id/control_play_pause\"\n            android:layout_width=\"50dp\"\n            android:layout_height=\"50dp\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"5dp\"\n            android:layout_marginRight=\"5dp\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:scaleType=\"fitCenter\"\n            android:src=\"@drawable/ic_pause\"\n            app:tint=\"?attr/colorAccent\"\n            tools:ignore=\"ContentDescription\" />\n\n        <ProgressBar\n            android:id=\"@+id/control_progress_bar\"\n            style=\"?android:attr/progressBarStyleLargeInverse\"\n            android:layout_width=\"50dp\"\n            android:layout_height=\"50dp\"\n            android:layout_centerInParent=\"true\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"5dp\"\n            android:layout_marginRight=\"5dp\"\n            android:background=\"#00000000\"\n            android:clickable=\"false\"\n            android:indeterminate=\"true\"\n            android:padding=\"2dp\"\n            android:scaleType=\"fitCenter\"\n            android:tint=\"?attr/colorAccent\"\n            android:visibility=\"invisible\"\n            tools:visibility=\"visible\" />\n\n\n        <ImageButton\n            android:id=\"@+id/control_fast_forward\"\n            android:layout_width=\"40dp\"\n            android:layout_height=\"40dp\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"5dp\"\n            android:layout_toRightOf=\"@id/control_play_pause\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:scaleType=\"fitCenter\"\n            android:src=\"@drawable/exo_controls_fastforward\"\n            app:tint=\"?attr/colorAccent\" />\n\n        <androidx.appcompat.widget.AppCompatImageButton\n            android:id=\"@+id/control_forward\"\n            android:layout_width=\"32dp\"\n            android:layout_height=\"32dp\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"5dp\"\n            android:layout_toRightOf=\"@+id/control_fast_forward\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:scaleType=\"fitCenter\"\n            android:src=\"@drawable/ic_next\"\n            android:tint=\"?attr/colorAccent\"\n            tools:ignore=\"ContentDescription\" />\n\n        <ImageButton\n            android:id=\"@+id/control_shuffle\"\n            android:layout_width=\"30dp\"\n            android:layout_height=\"30dp\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"5dp\"\n            android:layout_marginRight=\"5dp\"\n            android:layout_toRightOf=\"@+id/control_forward\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:scaleType=\"fitXY\"\n            android:src=\"@drawable/ic_shuffle\"\n            app:tint=\"?attr/colorAccent\"\n            tools:ignore=\"ContentDescription\" />\n\n    </RelativeLayout>\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_recaptcha.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:id=\"@+id/toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"?attr/actionBarSize\"\n        android:background=\"?attr/colorPrimary\"\n        android:gravity=\"center_vertical\"\n        android:minHeight=\"?attr/actionBarSize\" />\n\n    <WebView\n        android:id=\"@+id/reCaptchaWebView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginTop=\"?attr/actionBarSize\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/chip.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- This is used to inflate a chip with a Material theme, otherwise it would crash -->\n<!-- Theme.MaterialComponents.DayNight is used to guarantee auto day/night switching -->\n<com.google.android.material.chip.Chip xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:theme=\"@style/Theme.MaterialComponents.DayNight.Bridge\"\n    app:chipMinTouchTargetSize=\"40dp\"\n    tools:text=\"I'm a correctly themed chip!\" />"
  },
  {
    "path": "app/src/main/res/layout/comment_replies_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <com.google.android.material.imageview.ShapeableImageView\n        android:id=\"@+id/authorAvatar\"\n        android:layout_width=\"42dp\"\n        android:layout_height=\"42dp\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"16dp\"\n        android:focusable=\"false\"\n        android:src=\"@drawable/placeholder_person\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:shapeAppearance=\"@style/CircularImageView\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/authorName\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginTop=\"16dp\"\n        app:layout_goneMarginStart=\"16dp\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"16sp\"\n        app:layout_constraintBottom_toTopOf=\"@+id/uploadDate\"\n        app:layout_constraintEnd_toStartOf=\"@+id/thumbsUpImage\"\n        app:layout_constraintStart_toEndOf=\"@+id/authorAvatar\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"@tools:sample/lorem/random\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/uploadDate\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"14sp\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/authorName\"\n        app:layout_constraintEnd_toStartOf=\"@+id/thumbsUpImage\"\n        app:layout_constraintStart_toStartOf=\"@+id/authorName\"\n        app:layout_constraintTop_toBottomOf=\"@+id/authorName\"\n        tools:text=\"5 months ago\" />\n\n    <ImageView\n        android:id=\"@+id/thumbsUpImage\"\n        android:layout_width=\"21sp\"\n        android:layout_height=\"21sp\"\n        android:layout_marginEnd=\"@dimen/video_item_detail_like_margin\"\n        android:contentDescription=\"@string/detail_likes_img_view_description\"\n        android:src=\"@drawable/ic_thumb_up\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/uploadDate\"\n        app:layout_constraintEnd_toStartOf=\"@+id/thumbsUpCount\"\n        app:layout_constraintTop_toTopOf=\"@+id/authorName\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/thumbsUpCount\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n        android:gravity=\"center\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\"\n        android:textSize=\"14sp\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/uploadDate\"\n        app:layout_constraintEnd_toStartOf=\"@+id/heartImage\"\n        app:layout_constraintTop_toTopOf=\"@+id/authorName\"\n        tools:text=\"12M\" />\n\n    <ImageView\n        android:id=\"@+id/heartImage\"\n        android:layout_width=\"21sp\"\n        android:layout_height=\"21sp\"\n        android:layout_marginEnd=\"4dp\"\n        android:contentDescription=\"@string/detail_heart_img_view_description\"\n        android:src=\"@drawable/ic_heart\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/uploadDate\"\n        app:layout_constraintEnd_toStartOf=\"@+id/pinnedImage\"\n        app:layout_constraintTop_toTopOf=\"@+id/authorName\"\n        app:layout_goneMarginEnd=\"16dp\" />\n\n    <View\n        android:id=\"@+id/authorTouchArea\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_margin=\"8dp\"\n        android:background=\"?attr/selectableItemBackground\"\n        app:layout_constraintBottom_toTopOf=\"@+id/commentContent\"\n        app:layout_constraintEnd_toStartOf=\"@+id/thumbsUpImage\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <ImageView\n        android:id=\"@+id/pinnedImage\"\n        android:layout_width=\"21sp\"\n        android:layout_height=\"21sp\"\n        android:layout_marginEnd=\"16dp\"\n        android:contentDescription=\"@string/detail_pinned_comment_view_description\"\n        android:src=\"@drawable/ic_pin\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/uploadDate\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"@+id/authorName\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/commentContent\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"16dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"14sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/uploadDate\"\n        tools:text=\"@tools:sample/lorem/random[10]\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1px\"\n        android:layout_marginTop=\"16dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:background=\"?attr/separator_color\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/commentContent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_edit_text.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clickable=\"false\"\n    android:paddingLeft=\"@dimen/video_item_search_padding\"\n    android:paddingTop=\"@dimen/video_item_search_padding\"\n    android:paddingRight=\"@dimen/video_item_search_padding\">\n\n    <org.schabi.newpipe.views.NewPipeEditText\n        android:id=\"@+id/dialogEditText\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"10dp\"\n        android:layout_marginEnd=\"10dp\"\n        android:layout_marginBottom=\"6dp\"\n        android:maxLines=\"1\" />\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_feed_group_create.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\">\n\n        <androidx.constraintlayout.widget.ConstraintLayout\n            android:id=\"@+id/options_root\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"180dp\"\n            android:orientation=\"vertical\"\n            android:padding=\"8dp\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\">\n\n            <ImageButton\n                android:id=\"@+id/icon_preview\"\n                android:layout_width=\"64dp\"\n                android:layout_height=\"64dp\"\n                android:layout_gravity=\"center\"\n                android:scaleType=\"centerInside\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                tools:ignore=\"ContentDescription\"\n                tools:src=\"@drawable/ic_asterisk\" />\n\n            <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/group_name_input_container\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"8dp\"\n                android:gravity=\"center_vertical\"\n                android:hint=\"@string/name\"\n                android:paddingTop=\"6dp\"\n                android:paddingBottom=\"6dp\"\n                app:errorEnabled=\"true\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@+id/icon_preview\"\n                app:layout_constraintTop_toTopOf=\"parent\">\n\n                <org.schabi.newpipe.views.NewPipeEditText\n                    android:id=\"@+id/group_name_input\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:importantForAutofill=\"no\"\n                    android:inputType=\"textCapSentences\"\n                    android:maxLines=\"1\"\n                    tools:ignore=\"LabelFor,UnusedAttribute\" />\n\n            </com.google.android.material.textfield.TextInputLayout>\n\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/selected_subscription_count_view\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"6dp\"\n                android:textAppearance=\"@style/TextAppearance.AppCompat.Caption\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/group_name_input_container\"\n                tools:text=\"15 selected\" />\n\n            <Button\n                android:id=\"@+id/select_channel_button\"\n                style=\"@style/Widget.AppCompat.Button.Borderless\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"8dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:layout_marginBottom=\"4dp\"\n                android:text=\"@string/feed_group_dialog_select_subscriptions\"\n                android:textAllCaps=\"true\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/selected_subscription_count_view\" />\n        </androidx.constraintlayout.widget.ConstraintLayout>\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/icon_selector\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:clipToPadding=\"false\"\n            android:padding=\"4dp\"\n            android:paddingTop=\"16dp\"\n            android:paddingBottom=\"16dp\"\n            android:visibility=\"gone\"\n            tools:layoutManager=\"androidx.recyclerview.widget.GridLayoutManager\"\n            tools:listitem=\"@layout/picker_icon_item\"\n            tools:spanCount=\"7\" />\n\n        <LinearLayout\n            android:id=\"@+id/subscriptions_selector\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\">\n\n            <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/subscriptions_header_toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?attr/actionBarSize\"\n                android:gravity=\"center_vertical\"\n                android:theme=\"@style/ContrastToolbarTheme\">\n\n                <LinearLayout\n                    android:id=\"@+id/subscriptions_header_info_container\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"vertical\">\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:gravity=\"start|center_vertical\"\n                        android:text=\"@string/tab_subscriptions\"\n                        android:textColor=\"?android:attr/textColorPrimary\"\n                        android:textSize=\"16sp\"\n                        android:textStyle=\"bold\" />\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/subscriptions_header_info\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:gravity=\"start|center_vertical\"\n                        android:textColor=\"?android:attr/textColorPrimary\"\n                        android:textSize=\"12sp\"\n                        tools:text=\"1 selected\" />\n                </LinearLayout>\n\n                <include\n                    android:id=\"@+id/subscriptions_header_search_container\"\n                    layout=\"@layout/toolbar_search_layout\"\n                    android:visibility=\"gone\" />\n\n            </androidx.appcompat.widget.Toolbar>\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/subscriptions_selector_list\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:clipToPadding=\"false\"\n                android:padding=\"2dp\"\n                tools:itemCount=\"200\"\n                tools:layoutManager=\"androidx.recyclerview.widget.GridLayoutManager\"\n                tools:listitem=\"@layout/picker_subscription_item\"\n                tools:spanCount=\"4\" />\n        </LinearLayout>\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/delete_screen_message\"\n            style=\"@style/TextAppearance.AppCompat.Subhead\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"start\"\n            android:paddingLeft=\"?dialogPreferredPadding\"\n            android:paddingTop=\"16dp\"\n            android:paddingRight=\"?dialogPreferredPadding\"\n            android:paddingBottom=\"16dp\"\n            android:text=\"@string/feed_group_dialog_delete_message\"\n            android:visibility=\"visible\" />\n    </FrameLayout>\n\n    <View\n        android:id=\"@+id/separator\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1dp\"\n        android:background=\"?attr/separator_color\" />\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_vertical\"\n        android:paddingLeft=\"12dp\"\n        android:paddingTop=\"4dp\"\n        android:paddingRight=\"12dp\"\n        android:paddingBottom=\"4dp\">\n\n        <ImageButton\n            android:id=\"@+id/delete_button\"\n            style=\"?buttonBarButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:minWidth=\"0dp\"\n            android:scaleType=\"centerInside\"\n            android:src=\"@drawable/ic_delete\"\n            android:visibility=\"gone\"\n            tools:ignore=\"ContentDescription\"\n            tools:visibility=\"visible\" />\n\n        <Button\n            android:id=\"@+id/cancel_button\"\n            style=\"?buttonBarButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_toStartOf=\"@+id/confirm_button\"\n            android:text=\"@string/cancel\" />\n\n        <Button\n            android:id=\"@+id/confirm_button\"\n            style=\"?buttonBarButtonStyle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentEnd=\"true\"\n            android:text=\"@string/create\" />\n    </RelativeLayout>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_feed_group_reorder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/feed_groups_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\"\n        android:clipToPadding=\"false\"\n        android:padding=\"6dp\"\n        android:scrollbars=\"vertical\"\n        tools:itemCount=\"100\"\n        tools:listitem=\"@layout/feed_group_reorder_item\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1dp\"\n        android:background=\"?attr/separator_color\" />\n\n    <Button\n        android:id=\"@+id/confirm_button\"\n        style=\"?buttonBarButtonStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"end\"\n        android:text=\"@string/ok\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/dialog_playback_parameter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clickable=\"false\"\n    android:paddingStart=\"6dp\"\n    android:paddingTop=\"4dp\"\n    android:paddingEnd=\"6dp\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:scrollbarAlwaysDrawVerticalTrack=\"true\"\n        android:scrollbars=\"vertical\">\n\n        <!-- START HERE -->\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/tempoControlText\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentTop=\"true\"\n            android:layout_centerHorizontal=\"true\"\n            android:gravity=\"center\"\n            android:text=\"@string/playback_tempo\"\n            android:textColor=\"?attr/colorAccent\"\n            android:textStyle=\"bold\" />\n\n        <RelativeLayout\n            android:id=\"@+id/tempoControl\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/tempoControlText\"\n            android:layout_marginTop=\"1dp\"\n            android:orientation=\"horizontal\">\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/tempoStepDown\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:layout_alignParentStart=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:gravity=\"center\"\n                android:text=\"--%\"\n                android:textColor=\"?attr/colorAccent\"\n                android:textStyle=\"bold\"\n                tools:ignore=\"HardcodedText\"\n                tools:text=\"-5%\" />\n\n            <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_marginLeft=\"4dp\"\n                android:layout_marginRight=\"4dp\"\n                android:layout_toStartOf=\"@id/tempoStepUp\"\n                android:layout_toEndOf=\"@id/tempoStepDown\"\n                android:orientation=\"horizontal\">\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/tempoMinimumText\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_alignParentStart=\"true\"\n                    android:layout_marginStart=\"4dp\"\n                    android:gravity=\"center\"\n                    android:text=\"-.--x\"\n                    android:textColor=\"?attr/colorAccent\"\n                    tools:ignore=\"HardcodedText\"\n                    tools:text=\"1.00x\" />\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/tempoCurrentText\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_centerHorizontal=\"true\"\n                    android:gravity=\"center\"\n                    android:text=\"---%\"\n                    android:textColor=\"?attr/colorAccent\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\"\n                    tools:text=\"100%\" />\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/tempoMaximumText\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_alignParentEnd=\"true\"\n                    android:layout_marginEnd=\"4dp\"\n                    android:gravity=\"center\"\n                    android:text=\"---%\"\n                    android:textColor=\"?attr/colorAccent\"\n                    tools:ignore=\"HardcodedText\"\n                    tools:text=\"300%\" />\n\n                <androidx.appcompat.widget.AppCompatSeekBar\n                    android:id=\"@+id/tempoSeekbar\"\n                    style=\"@style/Widget.AppCompat.SeekBar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/tempoCurrentText\"\n                    android:paddingBottom=\"2dp\"\n                    tools:progress=\"50\" />\n            </RelativeLayout>\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/tempoStepUp\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                android:layout_alignParentEnd=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginEnd=\"4dp\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:gravity=\"center\"\n                android:text=\"+-%\"\n                android:textColor=\"?attr/colorAccent\"\n                android:textStyle=\"bold\"\n                tools:ignore=\"HardcodedText\"\n                tools:text=\"+5%\" />\n        </RelativeLayout>\n\n        <View\n            android:id=\"@+id/separatorPitch\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"1dp\"\n            android:layout_below=\"@id/tempoControl\"\n            android:layout_marginStart=\"12dp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_marginEnd=\"12dp\"\n            android:layout_marginBottom=\"5dp\"\n            android:background=\"?attr/separator_color\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/pitchControlText\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/separatorPitch\"\n            android:layout_centerHorizontal=\"true\"\n            android:gravity=\"center\"\n            android:text=\"@string/playback_pitch\"\n            android:textColor=\"?attr/colorAccent\"\n            android:textStyle=\"bold\" />\n\n        <ImageView\n            android:id=\"@+id/pitchToogleControlModes\"\n            android:layout_width=\"22dp\"\n            android:layout_height=\"22dp\"\n            android:layout_below=\"@id/separatorPitch\"\n            android:layout_alignParentEnd=\"true\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:src=\"@drawable/ic_expand_more\"\n            tools:ignore=\"ContentDescription\" />\n\n        <LinearLayout\n            android:id=\"@+id/pitchControlModeTabs\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"22dp\"\n            android:layout_below=\"@id/pitchControlText\"\n            android:layout_marginStart=\"22dp\"\n            android:layout_marginEnd=\"22dp\"\n            android:orientation=\"horizontal\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\">\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/pitchControlModePercent\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"1\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:gravity=\"center\"\n                android:text=\"@string/percent\"\n                android:textColor=\"?attr/colorAccent\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/pitchControlModeSemitone\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"1\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:gravity=\"center\"\n                android:text=\"@string/semitone\"\n                android:textColor=\"?attr/colorAccent\" />\n\n        </LinearLayout>\n\n        <RelativeLayout\n            android:id=\"@+id/pitchControlContainer\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/pitchControlModeTabs\"\n            android:layout_marginTop=\"1dp\">\n\n            <RelativeLayout\n                android:id=\"@+id/pitchPercentControl\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:orientation=\"horizontal\">\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/pitchPercentStepDown\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_alignParentStart=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    android:background=\"?attr/selectableItemBackground\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\"\n                    android:gravity=\"center\"\n                    android:text=\"--%\"\n                    android:textColor=\"?attr/colorAccent\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\"\n                    tools:text=\"-5%\" />\n\n                <RelativeLayout\n                    android:id=\"@+id/pitchPercentDisplay\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_marginLeft=\"4dp\"\n                    android:layout_marginRight=\"4dp\"\n                    android:layout_toStartOf=\"@+id/pitchPercentStepUp\"\n                    android:layout_toEndOf=\"@+id/pitchPercentStepDown\"\n                    android:orientation=\"horizontal\">\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/pitchPercentMinimumText\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_alignParentStart=\"true\"\n                        android:layout_marginStart=\"4dp\"\n                        android:gravity=\"center\"\n                        android:text=\"---%\"\n                        android:textColor=\"?attr/colorAccent\"\n                        tools:ignore=\"HardcodedText\"\n                        tools:text=\"25%\" />\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/pitchPercentCurrentText\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_centerHorizontal=\"true\"\n                        android:gravity=\"center\"\n                        android:text=\"---%\"\n                        android:textColor=\"?attr/colorAccent\"\n                        android:textStyle=\"bold\"\n                        tools:ignore=\"HardcodedText\"\n                        tools:text=\"100%\" />\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/pitchPercentMaximumText\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_alignParentEnd=\"true\"\n                        android:layout_marginEnd=\"4dp\"\n                        android:gravity=\"center\"\n                        android:text=\"---%\"\n                        android:textColor=\"?attr/colorAccent\"\n                        tools:ignore=\"HardcodedText\"\n                        tools:text=\"300%\" />\n\n                    <androidx.appcompat.widget.AppCompatSeekBar\n                        android:id=\"@+id/pitchPercentSeekbar\"\n                        style=\"@style/Widget.AppCompat.SeekBar\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_below=\"@+id/pitchPercentCurrentText\"\n                        android:paddingBottom=\"2dp\"\n                        tools:progress=\"50\" />\n                </RelativeLayout>\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/pitchPercentStepUp\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_alignParentEnd=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    android:layout_marginEnd=\"4dp\"\n                    android:background=\"?attr/selectableItemBackground\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\"\n                    android:gravity=\"center\"\n                    android:text=\"+-%\"\n                    android:textColor=\"?attr/colorAccent\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\"\n                    tools:text=\"+5%\" />\n            </RelativeLayout>\n\n            <RelativeLayout\n                android:id=\"@+id/pitchSemitoneControl\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:orientation=\"horizontal\"\n                tools:visibility=\"gone\">\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/pitchSemitoneStepDown\"\n                    android:layout_width=\"24dp\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_alignParentStart=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    android:background=\"?attr/selectableItemBackground\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\"\n                    android:gravity=\"center\"\n                    android:text=\"♭\"\n                    android:textColor=\"?attr/colorAccent\"\n                    android:textSize=\"24sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n\n                <RelativeLayout\n                    android:id=\"@+id/pitchSemitoneDisplay\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_marginLeft=\"4dp\"\n                    android:layout_marginRight=\"4dp\"\n                    android:layout_toStartOf=\"@+id/pitchSemitoneStepUp\"\n                    android:layout_toEndOf=\"@+id/pitchSemitoneStepDown\"\n                    android:orientation=\"horizontal\">\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/pitchSemitoneMinimumText\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_alignParentStart=\"true\"\n                        android:layout_marginStart=\"4dp\"\n                        android:gravity=\"center\"\n                        android:text=\"-12\"\n                        android:textColor=\"?attr/colorAccent\"\n                        tools:ignore=\"HardcodedText\" />\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/pitchSemitoneCurrentText\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_centerHorizontal=\"true\"\n                        android:gravity=\"center\"\n                        android:textColor=\"?attr/colorAccent\"\n                        android:textStyle=\"bold\"\n                        tools:text=\"0\"\n                        tools:ignore=\"RelativeOverlap\" />\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/pitchSemitoneMaximumText\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_alignParentEnd=\"true\"\n                        android:layout_marginEnd=\"4dp\"\n                        android:gravity=\"center\"\n                        android:text=\"+12\"\n                        android:textColor=\"?attr/colorAccent\"\n                        tools:ignore=\"HardcodedText\" />\n\n                    <androidx.appcompat.widget.AppCompatSeekBar\n                        android:id=\"@+id/pitchSemitoneSeekbar\"\n                        style=\"@style/Widget.AppCompat.SeekBar\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_below=\"@+id/pitchSemitoneCurrentText\"\n                        android:max=\"24\"\n                        android:paddingBottom=\"2dp\"\n                        android:progress=\"12\" />\n                </RelativeLayout>\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/pitchSemitoneStepUp\"\n                    android:layout_width=\"24dp\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_alignParentEnd=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    android:layout_marginEnd=\"4dp\"\n                    android:background=\"?attr/selectableItemBackground\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\"\n                    android:gravity=\"center\"\n                    android:text=\"♯\"\n                    android:textColor=\"?attr/colorAccent\"\n                    android:textSize=\"20sp\"\n                    android:textStyle=\"bold\"\n                    tools:ignore=\"HardcodedText\" />\n            </RelativeLayout>\n        </RelativeLayout>\n\n        <View\n            android:id=\"@+id/separatorStepSizeSelector\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"1dp\"\n            android:layout_below=\"@+id/pitchControlContainer\"\n            android:layout_marginStart=\"12dp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_marginEnd=\"12dp\"\n            android:layout_marginBottom=\"5dp\"\n            android:background=\"?attr/separator_color\" />\n\n        <LinearLayout\n            android:id=\"@+id/stepSizeSelector\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"30dp\"\n            android:layout_below=\"@id/separatorStepSizeSelector\"\n            android:orientation=\"horizontal\">\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/playback_step_type\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"1\"\n                android:clickable=\"false\"\n                android:gravity=\"center\"\n                android:text=\"@string/playback_step\"\n                android:textColor=\"?attr/colorAccent\"\n                android:textStyle=\"bold\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/stepSizeOnePercent\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"1\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:gravity=\"center\"\n                android:textColor=\"?attr/colorAccent\"\n                tools:text=\"1%\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/stepSizeFivePercent\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"1\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:gravity=\"center\"\n                android:textColor=\"?attr/colorAccent\"\n                tools:text=\"5%\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/stepSizeTenPercent\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"1\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:gravity=\"center\"\n                android:textColor=\"?attr/colorAccent\"\n                tools:text=\"10%\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/stepSizeTwentyFivePercent\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"1\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:gravity=\"center\"\n                android:textColor=\"?attr/colorAccent\"\n                tools:text=\"25%\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/stepSizeOneHundredPercent\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"match_parent\"\n                android:layout_weight=\"1\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:gravity=\"center\"\n                android:textColor=\"?attr/colorAccent\"\n                tools:text=\"100%\" />\n        </LinearLayout>\n\n        <View\n            android:id=\"@+id/separatorCheckbox\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"1dp\"\n            android:layout_below=\"@+id/stepSizeSelector\"\n            android:layout_marginStart=\"12dp\"\n            android:layout_marginTop=\"5dp\"\n            android:layout_marginEnd=\"12dp\"\n            android:layout_marginBottom=\"5dp\"\n            android:background=\"?attr/separator_color\" />\n\n        <LinearLayout\n            android:id=\"@+id/additionalOptions\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_below=\"@id/separatorCheckbox\"\n            android:orientation=\"vertical\">\n\n            <CheckBox\n                android:id=\"@+id/unhookCheckbox\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:checked=\"false\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:text=\"@string/unhook_checkbox\" />\n\n            <CheckBox\n                android:id=\"@+id/skipSilenceCheckbox\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:checked=\"false\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:text=\"@string/skip_silence_checkbox\" />\n\n        </LinearLayout>\n\n        <!-- END HERE -->\n\n    </RelativeLayout>\n</ScrollView>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_playlists.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <RelativeLayout\n        android:id=\"@+id/newPlaylist\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:clickable=\"true\"\n        android:focusable=\"true\">\n\n        <ImageView\n            android:id=\"@+id/newPlaylistIcon\"\n            android:layout_width=\"48dp\"\n            android:layout_height=\"28dp\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"12dp\"\n            android:layout_marginRight=\"12dp\"\n            android:src=\"@drawable/ic_playlist_add\"\n            tools:ignore=\"ContentDescription,RtlHardcoded\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"50dp\"\n            android:layout_toRightOf=\"@+id/newPlaylistIcon\"\n            android:gravity=\"left|center\"\n            android:text=\"@string/create_playlist\"\n            android:textAppearance=\"?android:attr/textAppearanceLarge\"\n            android:textSize=\"15sp\"\n            android:textStyle=\"bold\"\n            tools:ignore=\"RtlHardcoded\" />\n    </RelativeLayout>\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/playlist_duplicate\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/newPlaylist\"\n        android:layout_marginHorizontal=\"@dimen/video_item_search_padding\"\n        android:layout_marginBottom=\"@dimen/video_item_search_padding\"\n        android:gravity=\"center\"\n        android:text=\"@string/duplicate_in_playlist\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\"\n        android:textSize=\"13sp\"\n        android:visibility=\"gone\"\n        tools:text=\"@tools:sample/lorem[20]\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:id=\"@+id/separator\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1dp\"\n        android:layout_below=\"@+id/playlist_duplicate\"\n        android:layout_marginLeft=\"@dimen/video_item_search_padding\"\n        android:layout_marginRight=\"@dimen/video_item_search_padding\"\n        android:background=\"?attr/separator_color\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/playlist_list\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/separator\"\n        android:scrollbars=\"vertical\"\n        android:visibility=\"gone\"\n        tools:listitem=\"@layout/list_playlist_mini_item\"\n        tools:visibility=\"visible\" />\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_title.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clickable=\"false\"\n    android:paddingLeft=\"@dimen/video_item_search_padding\"\n    android:paddingTop=\"@dimen/video_item_search_padding\"\n    android:paddingRight=\"@dimen/video_item_search_padding\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:ellipsize=\"marquee\"\n        android:fadingEdge=\"horizontal\"\n        android:marqueeRepeatLimit=\"marquee_forever\"\n        android:scrollHorizontally=\"true\"\n        android:singleLine=\"true\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/channel_item_detail_title_text_size\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. \" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/itemTitleView\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:ellipsize=\"marquee\"\n        android:fadingEdge=\"horizontal\"\n        android:marqueeRepeatLimit=\"marquee_forever\"\n        android:scrollHorizontally=\"true\"\n        android:singleLine=\"true\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        android:visibility=\"gone\"\n        tools:text=\"UPLOADER\"\n        tools:visibility=\"visible\" />\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/download_dialog.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <include\n        android:id=\"@+id/toolbar_layout\"\n        layout=\"@layout/toolbar_layout\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/file_name_text_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/toolbar_layout\"\n        android:layout_marginLeft=\"24dp\"\n        android:layout_marginTop=\"12dp\"\n        android:layout_marginRight=\"24dp\"\n        android:layout_marginBottom=\"6dp\"\n        android:text=\"@string/msg_name\" />\n\n    <org.schabi.newpipe.views.NewPipeEditText\n        android:id=\"@+id/file_name\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/file_name_text_view\"\n        android:layout_marginLeft=\"20dp\"\n        android:layout_marginRight=\"20dp\"\n        android:layout_marginBottom=\"6dp\"\n        android:inputType=\"text\"\n        android:maxLines=\"1\" />\n\n    <RadioGroup\n        android:id=\"@+id/video_audio_group\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/file_name\"\n        android:layout_marginLeft=\"20dp\"\n        android:layout_marginBottom=\"6dp\"\n        android:gravity=\"left\"\n        android:orientation=\"horizontal\"\n        tools:ignore=\"RtlHardcoded\">\n\n        <RadioButton\n            android:id=\"@+id/video_button\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:checked=\"true\"\n            android:text=\"@string/video\" />\n\n        <RadioButton\n            android:id=\"@+id/audio_button\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/audio\" />\n\n        <RadioButton\n            android:id=\"@+id/subtitle_button\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/caption_setting_title\" />\n    </RadioGroup>\n\n    <Spinner\n        android:id=\"@+id/quality_spinner\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/video_audio_group\"\n        android:layout_marginLeft=\"20dp\"\n        android:layout_marginRight=\"20dp\"\n        android:layout_marginBottom=\"12dp\"\n        android:minWidth=\"150dp\"\n        tools:listitem=\"@layout/stream_quality_item\" />\n\n    <Spinner\n        android:id=\"@+id/audio_track_spinner\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/quality_spinner\"\n        android:layout_marginLeft=\"20dp\"\n        android:layout_marginRight=\"20dp\"\n        android:layout_marginBottom=\"12dp\"\n        android:minWidth=\"150dp\"\n        tools:visibility=\"gone\" />\n\n    <Spinner\n        android:id=\"@+id/audio_stream_spinner\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/audio_track_spinner\"\n        android:layout_marginLeft=\"20dp\"\n        android:layout_marginRight=\"20dp\"\n        android:layout_marginBottom=\"12dp\"\n        android:minWidth=\"150dp\"\n        tools:visibility=\"gone\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/audio_track_present_in_video_text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/audio_stream_spinner\"\n        android:layout_marginLeft=\"24dp\"\n        android:layout_marginRight=\"24dp\"\n        android:layout_marginBottom=\"12dp\"\n        android:gravity=\"center\"\n        android:text=\"@string/audio_track_present_in_video\"\n        android:textSize=\"12sp\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/threads_text_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/audio_track_present_in_video_text\"\n        android:layout_marginLeft=\"24dp\"\n        android:layout_marginRight=\"24dp\"\n        android:layout_marginBottom=\"6dp\"\n        android:text=\"@string/msg_threads\" />\n\n    <LinearLayout\n        android:id=\"@+id/threads_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/threads_text_view\"\n        android:layout_marginLeft=\"24dp\"\n        android:layout_marginRight=\"24dp\"\n        android:layout_marginBottom=\"12dp\"\n        android:orientation=\"horizontal\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/threads_count\"\n            android:layout_width=\"25dp\"\n            android:layout_height=\"match_parent\"\n            android:gravity=\"center_vertical\"\n            android:paddingLeft=\"2dp\"\n            tools:ignore=\"RtlHardcoded,RtlSymmetry\"\n            tools:text=\"3\" />\n\n        <SeekBar\n            android:id=\"@+id/threads\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:max=\"31\"\n            android:progress=\"3\" />\n    </LinearLayout>\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/threads_layout\"\n        android:layout_marginLeft=\"24dp\"\n        android:layout_marginRight=\"24dp\"\n        android:layout_marginBottom=\"12dp\"\n        android:gravity=\"center\"\n        android:text=\"@string/streams_not_yet_supported_removed\"\n        android:textSize=\"12sp\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/download_loading_dialog.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <include\n        android:id=\"@+id/toolbar_layout\"\n        layout=\"@layout/toolbar_layout\" />\n\n    <ProgressBar\n        android:id=\"@+id/loader\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"150dp\"\n        android:layout_marginBottom=\"100dp\"\n        android:layout_centerHorizontal=\"true\"\n        android:indeterminate=\"true\" />\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/drawer_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?colorPrimary\"\n    android:nextFocusDown=\"@+id/drawer_header_action_button\">\n\n    <ImageView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:scaleType=\"centerCrop\"\n        android:src=\"@drawable/background_header\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:ignore=\"ContentDescription\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/drawer_header_padding_top\"\n        android:fitsSystemWindows=\"true\"\n        android:gravity=\"bottom\"\n        android:minHeight=\"@dimen/drawer_header_content_min_height\"\n        android:orientation=\"vertical\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"72dp\"\n            android:layout_marginLeft=\"16dp\"\n            android:layout_marginRight=\"16dp\"\n            android:gravity=\"center\"\n            android:orientation=\"horizontal\"\n            tools:ignore=\"UseCompoundDrawables\">\n\n            <ImageView\n                android:layout_width=\"@dimen/drawer_header_newpipe_icon_size\"\n                android:layout_height=\"@dimen/drawer_header_newpipe_icon_size\"\n                android:layout_marginEnd=\"@dimen/drawer_header_newpipe_icon_title_space\"\n                android:src=\"@drawable/splash_foreground\"\n                tools:ignore=\"ContentDescription\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/drawer_header_newpipe_title\"\n                android:layout_width=\"@dimen/drawer_header_newpipe_title_default_width\"\n                android:layout_height=\"match_parent\"\n                android:layout_marginEnd=\"@dimen/drawer_header_newpipe_icon_title_space\"\n                android:ellipsize=\"end\"\n                android:gravity=\"start|center_vertical\"\n                android:hyphenationFrequency=\"full\"\n                android:maxLines=\"1\"\n                android:text=\"@string/app_name\"\n                android:textColor=\"@color/drawer_header_font_color\"\n                android:textStyle=\"bold\"\n                app:autoSizeMaxTextSize=\"@dimen/drawer_header_newpipe_title_max_text_size\"\n                app:autoSizeMinTextSize=\"@dimen/drawer_header_newpipe_title_min_text_size\"\n                app:autoSizeTextType=\"uniform\"\n                tools:ignore=\"UnusedAttribute\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"12dp\"\n            android:background=\"@drawable/drawer_header_bottom_background\"\n            android:gravity=\"center\"\n            android:orientation=\"horizontal\"\n            android:paddingLeft=\"6dp\"\n            android:paddingRight=\"6dp\">\n\n            <LinearLayout\n                android:layout_width=\"0dp\"\n                android:layout_height=\"32dp\"\n                android:layout_weight=\"1\"\n                android:gravity=\"center\"\n                android:orientation=\"horizontal\">\n\n                <ImageView\n                    android:id=\"@+id/drawer_header_service_icon\"\n                    android:layout_width=\"@dimen/drawer_header_service_icon_size\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginLeft=\"6dp\"\n                    android:layout_marginRight=\"6dp\"\n                    android:scaleType=\"fitCenter\"\n                    app:tint=\"@color/drawer_header_font_color\"\n                    tools:ignore=\"ContentDescription\"\n                    tools:src=\"@drawable/ic_smart_display\" />\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/drawer_header_service_view\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:ellipsize=\"end\"\n                    android:maxLines=\"1\"\n                    android:textColor=\"@color/drawer_header_font_color\"\n                    android:textSize=\"@dimen/drawer_header_service_title_text_size\"\n                    tools:text=\"YouTube\" />\n            </LinearLayout>\n\n            <ImageView\n                android:id=\"@+id/drawer_arrow\"\n                android:layout_width=\"24dp\"\n                android:layout_height=\"24dp\"\n                android:layout_marginStart=\"4dp\"\n                android:src=\"@drawable/ic_arrow_drop_down\"\n                app:tint=\"@color/drawer_header_font_color\"\n                tools:ignore=\"ContentDescription\" />\n        </LinearLayout>\n    </LinearLayout>\n\n    <Button\n        android:id=\"@+id/drawer_header_action_button\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:background=\"?selectableItemBackground\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/drawer_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.google.android.material.navigation.NavigationView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/navigation\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"match_parent\"\n    android:layout_gravity=\"start\"\n    android:background=\"?android:attr/windowBackground\"\n    android:orientation=\"vertical\"\n    app:headerLayout=\"@layout/drawer_header\" />\n"
  },
  {
    "path": "app/src/main/res/layout/error_panel.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_horizontal\"\n    android:orientation=\"vertical\"\n    android:padding=\"16dp\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/error_message_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center\"\n        android:text=\"@string/general_error\"\n        android:textSize=\"16sp\"\n        android:textStyle=\"bold\"\n        tools:text=\"Account terminated\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/error_message_service_info_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"6dp\"\n        android:gravity=\"center\"\n        android:text=\"@string/general_error\"\n        android:textSize=\"16sp\"\n        android:visibility=\"gone\"\n        tools:text=\"YouTube provides this reason:\"\n        tools:visibility=\"visible\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/error_message_service_explanation_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:gravity=\"center\"\n        android:text=\"@string/general_error\"\n        android:textSize=\"16sp\"\n        android:textStyle=\"italic\"\n        android:visibility=\"gone\"\n        tools:text=\"This account has been terminated because we received multiple third-party claims of copyright infringement regarding material that the user posted.\"\n        tools:visibility=\"visible\" />\n\n\n    <Button\n        android:id=\"@+id/error_action_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:text=\"@string/error_snackbar_action\"\n        android:textAlignment=\"center\"\n        android:textAllCaps=\"true\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"\n        android:textSize=\"16sp\"\n        android:theme=\"@style/ServiceColoredButton\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <Button\n        android:id=\"@+id/error_retry_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:text=\"@string/retry\"\n        android:textAlignment=\"center\"\n        android:textAllCaps=\"true\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"\n        android:textSize=\"16sp\"\n        android:theme=\"@style/ServiceColoredButton\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <Button\n        android:id=\"@+id/error_open_in_browser\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginBottom=\"8dp\"\n        android:text=\"@string/open_in_browser\"\n        android:textAlignment=\"center\"\n        android:textAllCaps=\"true\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"\n        android:textSize=\"16sp\"\n        android:theme=\"@style/ServiceColoredButton\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/feed_group_add_new_grid_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center_vertical\"\n    android:layout_margin=\"4dp\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:foreground=\"?attr/selectableItemBackground\"\n    app:cardBackgroundColor=\"?attr/card_item_background_color\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"?attr/dashed_border\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\"\n        android:padding=\"4dp\">\n\n        <ImageView\n            android:id=\"@+id/icon\"\n            android:layout_width=\"36dp\"\n            android:layout_height=\"36dp\"\n            android:layout_gravity=\"center\"\n            android:padding=\"4dp\"\n            android:scaleType=\"centerInside\"\n            android:src=\"@drawable/ic_add\"\n            tools:ignore=\"ContentDescription\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center\"\n            android:maxLines=\"1\"\n            android:text=\"@string/feed_create_new_group_button_title\"\n            android:textAllCaps=\"true\"\n            android:textColor=\"?attr/colorAccent\"\n            android:textSize=\"14sp\"\n            android:textStyle=\"bold\" />\n    </LinearLayout>\n</androidx.cardview.widget.CardView>\n"
  },
  {
    "path": "app/src/main/res/layout/feed_group_add_new_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center_vertical\"\n    android:layout_margin=\"4dp\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:foreground=\"?attr/selectableItemBackground\"\n    app:cardBackgroundColor=\"?attr/card_item_background_color\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"?attr/dashed_border\"\n        android:orientation=\"horizontal\">\n\n        <ImageView\n            android:id=\"@+id/icon\"\n            android:layout_width=\"48dp\"\n            android:layout_height=\"48dp\"\n            android:layout_gravity=\"center\"\n            android:padding=\"8dp\"\n            android:scaleType=\"centerInside\"\n            android:src=\"@drawable/ic_add\"\n            tools:ignore=\"ContentDescription\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"1\"\n            android:padding=\"10dp\"\n            android:text=\"@string/feed_create_new_group_button_title\"\n            android:textAllCaps=\"true\"\n            android:textColor=\"?attr/colorAccent\"\n            android:textSize=\"14sp\"\n            android:textStyle=\"bold\" />\n    </LinearLayout>\n</androidx.cardview.widget.CardView>\n"
  },
  {
    "path": "app/src/main/res/layout/feed_group_card_grid_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:foreground=\"?attr/selectableItemBackground\"\n    android:layout_margin=\"4dp\"\n    app:cardBackgroundColor=\"?attr/card_item_background_color\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        android:paddingTop=\"2dp\">\n\n        <ImageView\n            android:id=\"@+id/icon\"\n            android:layout_width=\"36dp\"\n            android:layout_height=\"0dp\"\n            android:layout_gravity=\"center\"\n            android:layout_weight=\"1\"\n            android:padding=\"4dp\"\n            android:scaleType=\"fitCenter\"\n            tools:ignore=\"ContentDescription\"\n            tools:src=\"@drawable/ic_fastfood\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?attr/card_item_contrast_color\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center\"\n            android:maxLines=\"2\"\n            android:padding=\"2dp\"\n            android:textAllCaps=\"false\"\n            android:textColor=\"?attr/colorAccent\"\n            android:textSize=\"14sp\"\n            android:textStyle=\"bold\"\n            tools:text=\"ALL\" />\n    </LinearLayout>\n</androidx.cardview.widget.CardView>\n"
  },
  {
    "path": "app/src/main/res/layout/feed_group_card_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center_vertical\"\n    android:layout_margin=\"4dp\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:foreground=\"?attr/selectableItemBackground\"\n    app:cardBackgroundColor=\"?attr/card_item_background_color\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\">\n\n        <ImageView\n            android:id=\"@+id/icon\"\n            android:layout_width=\"48dp\"\n            android:layout_height=\"48dp\"\n            android:layout_gravity=\"center\"\n            android:padding=\"8dp\"\n            android:scaleType=\"centerInside\"\n            tools:ignore=\"ContentDescription\"\n            tools:src=\"@drawable/ic_fastfood\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center_vertical\"\n            android:background=\"?attr/card_item_contrast_color\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center_vertical\"\n            android:maxLines=\"1\"\n            android:padding=\"10dp\"\n            android:textAllCaps=\"false\"\n            android:textColor=\"?attr/colorAccent\"\n            android:textSize=\"14sp\"\n            android:textStyle=\"bold\"\n            tools:text=\"All\" />\n    </LinearLayout>\n\n</androidx.cardview.widget.CardView>\n"
  },
  {
    "path": "app/src/main/res/layout/feed_group_reorder_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginLeft=\"8dp\"\n    android:layout_marginTop=\"3dp\"\n    android:layout_marginRight=\"8dp\"\n    android:layout_marginBottom=\"3dp\"\n    android:minHeight=\"?listPreferredItemHeightSmall\"\n    android:orientation=\"horizontal\"\n    app:cardBackgroundColor=\"?attr/card_item_background_color\"\n    app:cardCornerRadius=\"5dp\"\n    app:cardElevation=\"2dp\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center_vertical\">\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/group_icon\"\n            android:layout_width=\"24dp\"\n            android:layout_height=\"24dp\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"16dp\"\n            tools:ignore=\"ContentDescription,RtlHardcoded\"\n            tools:src=\"@drawable/ic_kiosk_hot\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/group_name\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"16dp\"\n            android:layout_marginTop=\"6dp\"\n            android:layout_marginBottom=\"6dp\"\n            android:layout_toLeftOf=\"@+id/handle\"\n            android:layout_toRightOf=\"@+id/group_icon\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"2\"\n            android:textAppearance=\"?textAppearanceListItem\"\n            tools:ignore=\"RtlHardcoded\"\n            tools:text=\"Lorem ipsum dolor sit amet\" />\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/handle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:paddingLeft=\"16dp\"\n            android:paddingTop=\"12dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingBottom=\"12dp\"\n            android:src=\"@drawable/ic_drag_handle\"\n            tools:ignore=\"ContentDescription,RtlHardcoded\" />\n    </RelativeLayout>\n</androidx.cardview.widget.CardView>"
  },
  {
    "path": "app/src/main/res/layout/feed_item_carousel.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.recyclerview.widget.RecyclerView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/recycler_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"4dp\"\n    android:scrollbars=\"none\" />\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_about.xml",
    "content": "<androidx.core.widget.NestedScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\"org.schabi.newpipe.about.AboutActivity$AboutFragment\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n        android:paddingTop=\"@dimen/activity_vertical_margin\"\n        android:paddingRight=\"@dimen/activity_horizontal_margin\"\n        android:paddingBottom=\"@dimen/activity_vertical_margin\">\n\n        <ImageView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginBottom=\"8dp\"\n            android:contentDescription=\"@string/app_name\"\n            android:src=\"@mipmap/ic_launcher\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:text=\"@string/app_name\"\n            android:textAppearance=\"@android:style/TextAppearance.Large\" />\n\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/about_app_version\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginBottom=\"16dp\"\n            android:textAppearance=\"@android:style/TextAppearance.Medium\"\n            tools:text=\"0.9.9\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:paddingBottom=\"5dp\"\n            android:text=\"@string/app_description\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingTop=\"10dp\"\n            android:text=\"@string/faq_title\"\n            android:textAppearance=\"@android:style/TextAppearance.Medium\" />\n\n        <TextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/faq_description\" />\n\n        <Button\n            android:id=\"@+id/faq_link\"\n            style=\"@style/Base.Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"end\"\n            android:text=\"@string/faq\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingTop=\"10dp\"\n            android:text=\"@string/contribution_title\"\n            android:textAppearance=\"@android:style/TextAppearance.Medium\" />\n\n        <TextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/contribution_encouragement\" />\n\n        <Button\n            android:id=\"@+id/about_github_link\"\n            style=\"@style/Base.Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"end\"\n            android:text=\"@string/view_on_github\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingTop=\"10dp\"\n            android:text=\"@string/donation_title\"\n            android:textAppearance=\"@android:style/TextAppearance.Medium\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/donation_encouragement\" />\n\n        <Button\n            android:id=\"@+id/about_donation_link\"\n            style=\"@style/Base.Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"end\"\n            android:text=\"@string/give_back\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingTop=\"10dp\"\n            android:text=\"@string/website_title\"\n            android:textAppearance=\"@android:style/TextAppearance.Medium\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/website_encouragement\" />\n\n        <Button\n            android:id=\"@+id/about_website_link\"\n            style=\"@style/Base.Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"end\"\n            android:text=\"@string/open_in_browser\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingTop=\"10dp\"\n            android:text=\"@string/privacy_policy_title\"\n            android:textAppearance=\"@android:style/TextAppearance.Medium\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/privacy_policy_encouragement\" />\n\n        <Button\n            android:id=\"@+id/about_privacy_policy_link\"\n            style=\"@style/Base.Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"end\"\n            android:text=\"@string/read_privacy_policy\" />\n\n    </LinearLayout>\n</androidx.core.widget.NestedScrollView>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_blank.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <include\n        android:id=\"@+id/blank_page_content\"\n        layout=\"@layout/main_bg\" />\n\n    <include\n        android:id=\"@+id/error_panel\"\n        layout=\"@layout/error_panel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_marginTop=\"50dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_bookmarks.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"vertical\"\n        app:layoutManager=\"LinearLayoutManager\"\n        tools:listitem=\"@layout/list_playlist_mini_item\" />\n\n    <!--ERROR PANEL-->\n    <include\n        android:id=\"@+id/error_panel\"\n        layout=\"@layout/error_panel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_marginTop=\"50dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <include\n        android:id=\"@+id/empty_state_view\"\n        layout=\"@layout/list_empty_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:layout_marginTop=\"50dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_channel.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <!-- since ToolbarTheme sets the tint to icons, it would make images all white,\n    therefore app:tint=\"@null\" is used to undo that setting -->\n    <com.google.android.material.appbar.AppBarLayout\n        android:id=\"@+id/app_bar_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\"\n        app:elevation=\"0dp\">\n\n        <org.schabi.newpipe.views.CustomCollapsingToolbarLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:fitsSystemWindows=\"true\"\n            app:layout_scrollFlags=\"scroll|exitUntilCollapsed\">\n\n            <androidx.constraintlayout.widget.ConstraintLayout\n                android:id=\"@+id/channel_metadata\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:fitsSystemWindows=\"true\"\n                android:scaleType=\"centerCrop\"\n                app:layout_collapseMode=\"parallax\">\n\n                <ImageView\n                    android:id=\"@+id/channel_banner_image\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:adjustViewBounds=\"true\"\n                    android:maxHeight=\"70dp\"\n                    android:scaleType=\"fitCenter\"\n                    android:src=\"@drawable/placeholder_channel_banner\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:tint=\"@null\"\n                    tools:ignore=\"ContentDescription\" />\n\n                <com.google.android.material.imageview.ShapeableImageView\n                    android:id=\"@+id/channel_avatar_view\"\n                    android:layout_width=\"@dimen/channel_avatar_size\"\n                    android:layout_height=\"@dimen/channel_avatar_size\"\n                    android:layout_marginVertical=\"8dp\"\n                    android:layout_marginStart=\"8dp\"\n                    android:padding=\"1dp\"\n                    android:src=\"@drawable/placeholder_person\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:layout_constraintVertical_bias=\"1.0\"\n                    app:shapeAppearance=\"@style/CircularImageView\"\n                    app:strokeColor=\"#ffffff\"\n                    app:strokeWidth=\"2dp\"\n                    app:tint=\"@null\" />\n\n                <com.google.android.material.imageview.ShapeableImageView\n                    android:id=\"@+id/sub_channel_avatar_view\"\n                    android:layout_width=\"@dimen/sub_channel_avatar_size\"\n                    android:layout_height=\"@dimen/sub_channel_avatar_size\"\n                    android:padding=\"1dp\"\n                    android:src=\"@drawable/placeholder_person\"\n                    android:visibility=\"gone\"\n                    app:layout_constraintBottom_toBottomOf=\"@id/channel_avatar_view\"\n                    app:layout_constraintEnd_toEndOf=\"@id/channel_avatar_view\"\n                    app:shapeAppearance=\"@style/CircularImageView\"\n                    app:strokeColor=\"#ffffff\"\n                    app:strokeWidth=\"2dp\"\n                    app:tint=\"@null\"\n                    tools:visibility=\"visible\" />\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/channel_title_view\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_marginTop=\"8dp\"\n                    android:layout_marginEnd=\"4dp\"\n                    android:ellipsize=\"end\"\n                    android:lines=\"1\"\n                    android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                    android:textSize=\"16sp\"\n                    app:layout_constraintBottom_toTopOf=\"@+id/sub_channel_title_view\"\n                    app:layout_constraintEnd_toStartOf=\"@+id/channel_subscribe_button\"\n                    app:layout_constraintStart_toEndOf=\"@+id/channel_avatar_view\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/channel_banner_image\"\n                    tools:text=\"@tools:sample/lorem[10]\" />\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/sub_channel_title_view\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_marginEnd=\"4dp\"\n                    android:ellipsize=\"end\"\n                    android:lines=\"1\"\n                    android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                    android:textSize=\"14sp\"\n                    android:visibility=\"gone\"\n                    app:layout_constraintBottom_toTopOf=\"@+id/channel_subscriber_view\"\n                    app:layout_constraintEnd_toStartOf=\"@+id/channel_subscribe_button\"\n                    app:layout_constraintStart_toEndOf=\"@+id/channel_avatar_view\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/channel_title_view\"\n                    tools:text=\"@tools:sample/lorem[10]\"\n                    tools:visibility=\"visible\" />\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/channel_subscriber_view\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginStart=\"8dp\"\n                    android:layout_marginTop=\"2dp\"\n                    android:layout_marginEnd=\"4dp\"\n                    android:layout_marginBottom=\"8dp\"\n                    android:textSize=\"12sp\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toStartOf=\"@+id/channel_subscribe_button\"\n                    app:layout_constraintStart_toEndOf=\"@+id/channel_avatar_view\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/sub_channel_title_view\"\n                    tools:text=\"123,141,411 subscribers\" />\n\n                <androidx.appcompat.widget.AppCompatButton\n                    android:id=\"@+id/channel_subscribe_button\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/subscribe_button_title\"\n                    android:textSize=\"@dimen/channel_rss_title_size\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/channel_banner_image\" />\n            </androidx.constraintlayout.widget.ConstraintLayout>\n        </org.schabi.newpipe.views.CustomCollapsingToolbarLayout>\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@id/app_bar_layout\"\n        android:orientation=\"vertical\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <com.google.android.material.tabs.TabLayout\n            android:id=\"@+id/tab_layout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?attr/colorPrimary\"\n            app:tabGravity=\"fill\"\n            app:tabIndicatorColor=\"@color/white\"\n            app:tabMode=\"scrollable\"\n            app:tabRippleColor=\"@color/white\"\n            app:tabTextColor=\"@color/white\" />\n\n        <androidx.viewpager.widget.ViewPager\n            android:id=\"@+id/view_pager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_below=\"@id/tab_layout\" />\n\n        <ProgressBar\n            android:id=\"@+id/loading_progress_bar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerInParent=\"true\"\n            android:indeterminate=\"true\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\" />\n\n        <LinearLayout\n            android:id=\"@+id/empty_state_view\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerInParent=\"true\"\n            android:orientation=\"vertical\"\n            android:paddingTop=\"90dp\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\">\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/channel_kaomoji\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center\"\n                android:layout_marginBottom=\"10dp\"\n                android:fontFamily=\"monospace\"\n                android:text=\"(︶︹︺)\"\n                android:textSize=\"35sp\"\n                tools:ignore=\"HardcodedText\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/error_content_not_supported\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"20dp\"\n                android:text=\"@string/content_not_supported\"\n                android:textSize=\"15sp\"\n                android:visibility=\"gone\" />\n\n        </LinearLayout>\n\n        <!--ERROR PANEL-->\n        <include\n            android:id=\"@+id/error_panel\"\n            layout=\"@layout/error_panel\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerInParent=\"true\"\n            android:layout_marginTop=\"50dp\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\" />\n    </RelativeLayout>\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_channel_tab.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"vertical\"\n        tools:listitem=\"@layout/list_stream_item\" />\n\n    <ProgressBar\n        android:id=\"@+id/loading_progress_bar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <include\n        android:id=\"@+id/empty_state_view\"\n        layout=\"@layout/list_empty_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:gravity=\"center\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <!--ERROR PANEL-->\n    <include\n        android:id=\"@+id/error_panel\"\n        layout=\"@layout/error_panel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:layout_marginTop=\"50dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_channel_videos.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"vertical\"\n        tools:listitem=\"@layout/list_stream_item\" />\n\n    <ProgressBar\n        android:id=\"@+id/loading_progress_bar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <LinearLayout\n        android:id=\"@+id/empty_state_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:orientation=\"vertical\"\n        android:paddingTop=\"90dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/channel_kaomoji\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"10dp\"\n            android:fontFamily=\"monospace\"\n            android:text=\"(╯°-°)╯\"\n            android:textSize=\"35sp\"\n            tools:ignore=\"HardcodedText,UnusedAttribute\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/channel_no_videos\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"@string/empty_view_no_videos\"\n            android:textSize=\"24sp\" />\n\n    </LinearLayout>\n\n    <!--ERROR PANEL-->\n    <include\n        android:id=\"@+id/error_panel\"\n        layout=\"@layout/error_panel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:layout_marginTop=\"50dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_channels_notifications.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/recycler_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"vertical\"\n        app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\" />\n    \n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_choose_tabs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/helpTextView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"16dp\"\n        android:gravity=\"center\"\n        android:paddingStart=\"8dp\"\n        android:paddingEnd=\"8dp\"\n        android:text=\"@string/main_page_content_swipe_remove\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/selectedTabs\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_marginTop=\"16dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.0\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/helpTextView\"\n        app:layout_constraintVertical_bias=\"1.0\"\n        tools:listitem=\"@layout/list_choose_tabs\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/addTabsButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:src=\"@drawable/ic_add\"\n        app:backgroundTint=\"?attr/colorPrimary\"\n        app:fabSize=\"auto\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_comments.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <org.schabi.newpipe.views.NewPipeRecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"vertical\"\n        tools:listitem=\"@layout/list_comment_item\" />\n\n    <ProgressBar\n        android:id=\"@+id/loading_progress_bar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <LinearLayout\n        android:id=\"@+id/empty_state_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:orientation=\"vertical\"\n        android:paddingTop=\"85dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"10dp\"\n            android:fontFamily=\"monospace\"\n            android:text=\"(╯°-°)╯\"\n            android:textSize=\"35sp\"\n            tools:ignore=\"HardcodedText,UnusedAttribute\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/empty_state_desc\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"@string/empty_view_no_comments\"\n            android:textSize=\"24sp\" />\n\n    </LinearLayout>\n\n    <!--ERROR PANEL-->\n    <include\n        android:id=\"@+id/error_panel\"\n        layout=\"@layout/error_panel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_marginTop=\"16dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\"\n        android:visibility=\"gone\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_description.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:scrollbars=\"vertical\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/constraint_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:animateLayoutChanges=\"true\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/detail_upload_date_view\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_marginTop=\"6dp\"\n            android:layout_marginEnd=\"8dp\"\n            android:textAppearance=\"?android:attr/textAppearanceMedium\"\n            android:textSize=\"@dimen/video_item_detail_upload_date_text_size\"\n            android:textStyle=\"bold\"\n            app:layout_constraintEnd_toStartOf=\"@+id/detail_select_description_button\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"Published on Oct 2, 2009\" />\n\n        <ImageView\n            android:id=\"@+id/detail_select_description_button\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:layout_marginEnd=\"16dp\"\n            android:layout_marginBottom=\"2dp\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:clickable=\"true\"\n            android:contentDescription=\"@string/description_select_enable\"\n            android:focusable=\"true\"\n            android:padding=\"5dp\"\n            android:src=\"@drawable/ic_select_all\"\n            app:layout_constraintBottom_toTopOf=\"@+id/barrier\"\n            app:layout_constraintDimensionRatio=\"1\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <androidx.constraintlayout.widget.Barrier\n            android:id=\"@+id/barrier\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:barrierAllowsGoneWidgets=\"false\"\n            app:barrierDirection=\"top\"\n            app:constraint_referenced_ids=\"detail_description_note_view,detail_description_view\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/detail_description_note_view\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_marginTop=\"8dp\"\n            android:layout_marginEnd=\"16dp\"\n            android:gravity=\"center\"\n            android:text=\"@string/description_select_note\"\n            android:textSize=\"12sp\"\n            android:textStyle=\"italic\"\n            android:visibility=\"gone\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/detail_upload_date_view\"\n            tools:visibility=\"visible\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/detail_description_view\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_marginTop=\"8dp\"\n            android:layout_marginEnd=\"16dp\"\n            android:textAppearance=\"?android:attr/textAppearanceMedium\"\n            android:textSize=\"@dimen/video_item_detail_description_text_size\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/detail_description_note_view\"\n            tools:text=\"Description Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a ultricies ex. Integer sit amet sodales risus. Duis non mi et urna pretium bibendum.\" />\n\n        <LinearLayout\n            android:id=\"@+id/detail_metadata_layout\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginEnd=\"16dp\"\n            android:layout_marginBottom=\"10dp\"\n            android:orientation=\"vertical\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@+id/detail_description_view\" />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</androidx.core.widget.NestedScrollView>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_empty.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.core.widget.NestedScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <include\n            android:id=\"@+id/empty_state_view\"\n            layout=\"@layout/list_empty_view\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginTop=\"90dp\" />\n    </androidx.core.widget.NestedScrollView>\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_feed.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <RelativeLayout\n        android:id=\"@+id/refresh_root_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:paddingTop=\"8dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\">\n\n        <LinearLayout\n            android:id=\"@+id/refresh_info_container\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"12dp\"\n            android:layout_toStartOf=\"@+id/refreshIcon\"\n            android:gravity=\"center_vertical\"\n            android:orientation=\"vertical\">\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/refresh_text\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"end\"\n                android:gravity=\"start|center_vertical\"\n                android:maxLines=\"2\"\n                android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"\n                android:textSize=\"14sp\"\n                tools:text=\"@tools:sample/lorem/random\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/refresh_subtitle_text\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"end\"\n                android:gravity=\"start|center_vertical\"\n                android:maxLines=\"1\"\n                android:textAppearance=\"@style/TextAppearance.AppCompat.Caption\"\n                android:textSize=\"12sp\"\n                tools:text=\"@tools:sample/lorem/random\" />\n        </LinearLayout>\n\n        <ImageView\n            android:id=\"@+id/refreshIcon\"\n            android:layout_width=\"24dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignTop=\"@+id/refresh_info_container\"\n            android:layout_alignBottom=\"@+id/refresh_info_container\"\n            android:layout_alignParentEnd=\"true\"\n            android:layout_marginStart=\"6dp\"\n            android:layout_marginEnd=\"12dp\"\n            android:src=\"@drawable/ic_refresh\"\n            tools:ignore=\"ContentDescription\" />\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"1dp\"\n            android:layout_below=\"@+id/refresh_info_container\"\n            android:layout_marginLeft=\"8dp\"\n            android:layout_marginTop=\"8dp\"\n            android:layout_marginRight=\"8dp\"\n            android:background=\"?attr/separator_color\" />\n    </RelativeLayout>\n\n    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n        android:id=\"@+id/swipeRefreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@+id/refresh_root_view\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/items_list\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:scrollbars=\"vertical\"\n            android:visibility=\"gone\"\n            tools:listitem=\"@layout/list_stream_item\"\n            tools:visibility=\"visible\" />\n\n    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>\n\n    <Button\n        android:id=\"@+id/new_items_loaded_button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignBottom=\"@id/swipeRefreshLayout\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_marginBottom=\"5sp\"\n        android:text=\"@string/feed_new_items\"\n        android:textSize=\"12sp\"\n        android:theme=\"@style/ServiceColoredButton\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\">\n\n        <ProgressBar\n            android:id=\"@+id/loading_progress_bar\"\n            style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:indeterminate=\"true\"\n            android:minWidth=\"128dp\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/loading_progress_text\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:text=\"∞/∞\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Title\"\n            android:textSize=\"16sp\"\n            android:visibility=\"gone\"\n            tools:text=\"1/120\"\n            tools:visibility=\"visible\" />\n    </LinearLayout>\n\n    <!--ERROR PANEL-->\n    <include\n        android:id=\"@+id/error_panel\"\n        layout=\"@layout/error_panel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <include\n        android:id=\"@+id/empty_state_view\"\n        layout=\"@layout/list_empty_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:layout_marginTop=\"50dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\" />\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_import.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/info_text_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_above=\"@+id/inputs_panel\"\n        android:layout_alignParentTop=\"true\"\n        android:gravity=\"center_vertical\"\n        android:padding=\"16dp\"\n        android:scrollbars=\"vertical\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"\n        tools:text=\"@string/import_soundcloud_instructions\" />\n\n    <LinearLayout\n        android:id=\"@+id/inputs_panel\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_centerHorizontal=\"true\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\"\n        android:padding=\"16dp\">\n\n        <org.schabi.newpipe.views.NewPipeEditText\n            android:id=\"@+id/input_text\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"8dp\"\n            android:inputType=\"text\"\n            android:visibility=\"gone\"\n            tools:hint=\"@string/import_soundcloud_instructions_hint\"\n            tools:visibility=\"visible\" />\n\n        <Button\n            android:id=\"@+id/input_button\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?attr/selectableItemBackground\"\n            tools:text=\"@string/import_title\" />\n\n    </LinearLayout>\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_instance_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/instanceHelpTV\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"15dp\"\n        android:autoLink=\"web\"\n        android:text=\"@string/peertube_instance_url_help\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/instances\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@id/instanceHelpTV\"\n        tools:listitem=\"@layout/item_instance\" />\n\n    <!-- LOADING INDICATOR-->\n    <ProgressBar\n        android:id=\"@+id/loading_progress_bar\"\n        style=\"@style/Widget.AppCompat.ProgressBar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/addInstanceButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginRight=\"16dp\"\n        android:layout_marginBottom=\"16dp\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:src=\"@drawable/ic_add\"\n        app:backgroundTint=\"?attr/colorPrimary\"\n        app:fabSize=\"auto\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_kiosk.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <org.schabi.newpipe.views.NewPipeRecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"vertical\"\n        tools:listitem=\"@layout/list_stream_item\" />\n\n    <ProgressBar\n        android:id=\"@+id/loading_progress_bar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <LinearLayout\n        android:id=\"@+id/empty_state_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:orientation=\"vertical\"\n        android:paddingTop=\"90dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"10dp\"\n            android:fontFamily=\"monospace\"\n            android:text=\"(╯°-°)╯\"\n            android:textSize=\"35sp\"\n            tools:ignore=\"HardcodedText,UnusedAttribute\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/empty_state_message\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"@string/empty_view_no_videos\"\n            android:textSize=\"24sp\" />\n\n    </LinearLayout>\n\n    <!--ERROR PANEL-->\n    <include\n        android:id=\"@+id/error_panel\"\n        layout=\"@layout/error_panel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:layout_marginTop=\"50dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_licenses.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.core.widget.NestedScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fillViewport=\"true\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        android:paddingTop=\"@dimen/activity_vertical_margin\"\n        android:paddingBottom=\"@dimen/activity_vertical_margin\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"@dimen/activity_horizontal_margin\"\n            android:layout_marginRight=\"@dimen/activity_vertical_margin\"\n            android:paddingTop=\"10dp\"\n            android:paddingBottom=\"10dp\"\n            android:text=\"@string/app_license_title\"\n            android:textAppearance=\"@android:style/TextAppearance.Large\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"@dimen/activity_horizontal_margin\"\n            android:layout_marginRight=\"@dimen/activity_horizontal_margin\"\n            android:text=\"@string/app_license\" />\n\n        <Button\n            android:id=\"@+id/licenses_app_read_license\"\n            style=\"@style/Base.Widget.AppCompat.Button.Borderless\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"end\"\n            android:layout_marginRight=\"@dimen/activity_vertical_margin\"\n            android:text=\"@string/read_full_license\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n            android:paddingTop=\"10dp\"\n            android:paddingRight=\"@dimen/activity_horizontal_margin\"\n            android:text=\"@string/title_licenses\"\n            android:textAppearance=\"?android:attr/textAppearanceLarge\" />\n\n        <LinearLayout\n            android:id=\"@+id/licenses_software_components\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\" />\n    </LinearLayout>\n</androidx.core.widget.NestedScrollView>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n\n    <org.schabi.newpipe.views.ScrollableTabLayout\n        android:id=\"@+id/main_tab_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/colorPrimary\"\n        app:tabRippleColor=\"@color/white\"\n        app:tabIconTint=\"@color/white\"\n        app:tabIndicatorColor=\"@color/white\"\n        app:tabGravity=\"fill\"\n        app:tabMinWidth=\"60dp\" />\n\n    <androidx.viewpager.widget.ViewPager\n        android:id=\"@+id/pager\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@id/main_tab_layout\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_playlist.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"vertical\"\n        tools:listitem=\"@layout/list_stream_mini_item\" />\n\n    <ProgressBar\n        android:id=\"@+id/loading_progress_bar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <LinearLayout\n        android:id=\"@+id/empty_state_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:orientation=\"vertical\"\n        android:paddingTop=\"90dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"10dp\"\n            android:fontFamily=\"monospace\"\n            android:text=\"(ಠ_ಠ)\"\n            android:textSize=\"35sp\"\n            tools:ignore=\"HardcodedText,UnusedAttribute\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/empty_state_message\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"@string/empty_view_no_videos\"\n            android:textSize=\"24sp\" />\n\n    </LinearLayout>\n\n    <!--ERROR PANEL-->\n    <include\n        android:id=\"@+id/error_panel\"\n        layout=\"@layout/error_panel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:layout_marginTop=\"50dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_related_items.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"vertical\"\n        tools:listitem=\"@layout/list_stream_item\" />\n\n    <ProgressBar\n        android:id=\"@+id/loading_progress_bar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <LinearLayout\n        android:id=\"@+id/empty_state_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:orientation=\"vertical\"\n        android:paddingTop=\"85dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"10dp\"\n            android:fontFamily=\"monospace\"\n            android:text=\"(╯°-°)╯\"\n            android:textSize=\"35sp\"\n            tools:ignore=\"HardcodedText,UnusedAttribute\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"@string/empty_view_no_videos\"\n            android:textSize=\"24sp\" />\n\n    </LinearLayout>\n\n    <!--ERROR PANEL-->\n    <include\n        android:id=\"@+id/error_panel\"\n        layout=\"@layout/error_panel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:layout_marginTop=\"50dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\"\n        android:visibility=\"gone\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/correct_suggestion\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignTop=\"@id/error_panel\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:padding=\"12dp\"\n        android:textSize=\"@dimen/search_suggestion_text_size\"\n        tools:text=\"Showing results for lorem ipsum dolor sit amet consectetur adipisci elit\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/search_meta_info_text_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/correct_suggestion\"\n        android:gravity=\"center\"\n        android:padding=\"12dp\"\n        android:textSize=\"@dimen/video_item_detail_description_text_size\"\n        tools:text=\"Get the latest information from the WHO about coronavirus.\" />\n\n    <View\n        android:id=\"@+id/search_meta_info_separator\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1px\"\n        android:layout_below=\"@id/search_meta_info_text_view\"\n        android:layout_marginLeft=\"8dp\"\n        android:layout_marginRight=\"8dp\"\n        android:background=\"?attr/separator_color\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@+id/search_meta_info_separator\"\n        android:scrollbars=\"vertical\"\n        app:layoutManager=\"LinearLayoutManager\"\n        tools:listitem=\"@layout/list_stream_item\" />\n\n    <ProgressBar\n        android:id=\"@+id/loading_progress_bar\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:indeterminate=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <LinearLayout\n        android:id=\"@+id/empty_state_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:orientation=\"vertical\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"10dp\"\n            android:fontFamily=\"monospace\"\n            android:text=\"╰(°●°╰)\"\n            android:textSize=\"35sp\"\n            tools:ignore=\"HardcodedText,UnusedAttribute\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"@string/search_no_results\"\n            android:textSize=\"24sp\" />\n\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/suggestions_panel\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"?android:attr/windowBackground\"\n        android:focusable=\"true\"\n        android:focusableInTouchMode=\"true\"\n        android:orientation=\"vertical\"\n        android:visibility=\"gone\"\n        tools:background=\"@android:color/transparent\"\n        tools:visibility=\"visible\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/suggestions_list\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:scrollbars=\"vertical\"\n            app:layoutManager=\"LinearLayoutManager\"\n            tools:listitem=\"@layout/item_search_suggestion\" />\n    </LinearLayout>\n\n    <!--ERROR PANEL-->\n    <include\n        android:id=\"@+id/error_panel\"\n        layout=\"@layout/error_panel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_subscription.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scrollbars=\"vertical\"\n        android:visibility=\"gone\"\n        tools:listitem=\"@layout/list_channel_item\" />\n\n    <!--ERROR PANEL-->\n    <include\n        android:id=\"@+id/error_panel\"\n        layout=\"@layout/error_panel\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/items_list\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_marginTop=\"50dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <include\n        android:id=\"@+id/empty_state_view\"\n        layout=\"@layout/list_empty_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/items_list\"\n        android:layout_centerInParent=\"true\"\n        android:layout_marginTop=\"50dp\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"?attr/toolbar_shadow\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_video_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/video_item_detail\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"?attr/windowBackground\"\n    android:focusableInTouchMode=\"true\">\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n        android:id=\"@+id/detail_main_content\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <com.google.android.material.appbar.AppBarLayout\n            android:id=\"@+id/app_bar_layout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@android:color/transparent\"\n            app:elevation=\"0dp\"\n            app:layout_behavior=\"com.google.android.material.appbar.FlingBehavior\">\n\n            <org.schabi.newpipe.views.CustomCollapsingToolbarLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:layout_scrollFlags=\"scroll\">\n\n                <!-- THUMBNAIL -->\n                <FrameLayout\n                    android:id=\"@+id/detail_thumbnail_root_layout\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"@android:color/black\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\"\n                    android:foreground=\"?attr/selectableItemBackground\"\n                    app:layout_collapseMode=\"parallax\">\n\n                    <ImageView\n                        android:id=\"@+id/detail_thumbnail_image_view\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:background=\"?windowBackground\"\n                        android:contentDescription=\"@string/detail_thumbnail_view_description\"\n                        android:minHeight=\"200dp\"\n                        android:scaleType=\"fitCenter\"\n                        tools:ignore=\"RtlHardcoded\"\n                        tools:layout_height=\"200dp\"\n                        tools:src=\"@drawable/placeholder_thumbnail_video\" />\n\n                    <ImageView\n                        android:id=\"@+id/detail_thumbnail_play_button\"\n                        android:layout_width=\"64dp\"\n                        android:layout_height=\"64dp\"\n                        android:layout_gravity=\"center\"\n                        android:background=\"@android:color/transparent\"\n                        android:src=\"@drawable/ic_play_arrow_shadow\"\n                        android:visibility=\"invisible\"\n                        tools:ignore=\"ContentDescription\"\n                        tools:visibility=\"visible\" />\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/touch_append_detail\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center\"\n                        android:background=\"#64000000\"\n                        android:paddingLeft=\"30dp\"\n                        android:paddingTop=\"10dp\"\n                        android:paddingRight=\"30dp\"\n                        android:paddingBottom=\"10dp\"\n                        android:text=\"@string/hold_to_append\"\n                        android:textColor=\"@android:color/white\"\n                        android:textSize=\"20sp\"\n                        android:textStyle=\"bold\"\n                        android:visibility=\"gone\"\n                        tools:ignore=\"RtlHardcoded\"\n                        tools:visibility=\"visible\" />\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/detail_duration_view\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"bottom|right\"\n                        android:layout_marginLeft=\"12dp\"\n                        android:layout_marginTop=\"8dp\"\n                        android:layout_marginRight=\"12dp\"\n                        android:layout_marginBottom=\"8dp\"\n                        android:alpha=\".6\"\n                        android:background=\"#23000000\"\n                        android:gravity=\"center\"\n                        android:paddingLeft=\"6dp\"\n                        android:paddingTop=\"2dp\"\n                        android:paddingRight=\"6dp\"\n                        android:paddingBottom=\"2dp\"\n                        android:textAllCaps=\"true\"\n                        android:textColor=\"@android:color/white\"\n                        android:textSize=\"12sp\"\n                        android:textStyle=\"bold\"\n                        android:visibility=\"gone\"\n                        tools:ignore=\"RtlHardcoded\"\n                        tools:text=\"12:38\"\n                        tools:visibility=\"visible\" />\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/detail_position_view\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"bottom|left\"\n                        android:layout_marginLeft=\"12dp\"\n                        android:layout_marginTop=\"8dp\"\n                        android:layout_marginRight=\"12dp\"\n                        android:layout_marginBottom=\"8dp\"\n                        android:alpha=\".6\"\n                        android:background=\"?colorPrimary\"\n                        android:gravity=\"center\"\n                        android:paddingLeft=\"6dp\"\n                        android:paddingTop=\"2dp\"\n                        android:paddingRight=\"6dp\"\n                        android:paddingBottom=\"2dp\"\n                        android:textAllCaps=\"true\"\n                        android:textColor=\"@android:color/white\"\n                        android:textSize=\"12sp\"\n                        android:textStyle=\"bold\"\n                        android:visibility=\"gone\"\n                        tools:ignore=\"RtlHardcoded\"\n                        tools:text=\"12:38\"\n                        tools:visibility=\"visible\" />\n\n                    <org.schabi.newpipe.views.AnimatedProgressBar\n                        android:id=\"@+id/position_view\"\n                        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"2dp\"\n                        android:layout_gravity=\"bottom\"\n                        android:progressDrawable=\"?attr/progress_horizontal_drawable\"\n                        android:visibility=\"invisible\"\n                        tools:max=\"100\"\n                        tools:progress=\"40\"\n                        tools:visibility=\"visible\" />\n\n                    <!-- Player will be inserted here in realtime -->\n                    <FrameLayout\n                        android:id=\"@+id/player_placeholder\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\" />\n\n                </FrameLayout>\n            </org.schabi.newpipe.views.CustomCollapsingToolbarLayout>\n\n            <!-- CONTENT -->\n            <RelativeLayout\n                android:id=\"@+id/detail_content_root_layout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:layout_scrollFlags=\"scroll\">\n\n                <!-- TITLE -->\n                <FrameLayout\n                    android:id=\"@+id/detail_title_root_layout\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"?attr/selectableItemBackground\"\n                    android:clickable=\"true\"\n                    android:focusable=\"true\"\n                    android:paddingStart=\"12dp\"\n                    tools:ignore=\"RtlSymmetry\">\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/detail_video_title_view\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\"\n                        android:layout_marginEnd=\"30dp\"\n                        android:ellipsize=\"end\"\n                        android:maxLines=\"1\"\n                        android:paddingTop=\"12dp\"\n                        android:paddingBottom=\"8dp\"\n                        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                        android:textSize=\"@dimen/video_item_detail_title_text_size\"\n                        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit sed a ultricies ex. Integer sit amet sodales risus. Duis non mi et urna pretium bibendum. Nunc eleifend est quis ipsum porttitor egestas. Sed facilisis, nisl quis eleifend pellentesque, orci metus egestas dolor, at accumsan eros metus quis libero.\" />\n\n                    <ImageView\n                        android:id=\"@+id/detail_toggle_secondary_controls_view\"\n                        android:layout_width=\"20dp\"\n                        android:layout_height=\"20dp\"\n                        android:layout_gravity=\"top|end\"\n                        android:layout_marginTop=\"11dp\"\n                        android:layout_marginEnd=\"10dp\"\n                        android:src=\"@drawable/ic_expand_more\"\n                        tools:ignore=\"ContentDescription\" />\n\n                </FrameLayout>\n\n                <!-- LOADING INDICATOR-->\n                <ProgressBar\n                    android:id=\"@+id/loading_progress_bar\"\n                    style=\"@style/Widget.AppCompat.ProgressBar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/detail_title_root_layout\"\n                    android:layout_marginTop=\"@dimen/video_item_detail_error_panel_margin\"\n                    android:indeterminate=\"true\"\n                    android:visibility=\"gone\"\n                    tools:visibility=\"visible\" />\n\n                <!--ERROR PANEL-->\n                <include\n                    android:id=\"@+id/error_panel\"\n                    layout=\"@layout/error_panel\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/detail_title_root_layout\"\n                    android:layout_marginTop=\"@dimen/video_item_detail_error_panel_margin\"\n                    android:visibility=\"gone\"\n                    tools:visibility=\"gone\" />\n\n                <!--HIDING ROOT-->\n                <LinearLayout\n                    android:id=\"@+id/detail_content_root_hiding\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_below=\"@+id/detail_title_root_layout\"\n                    android:orientation=\"vertical\"\n                    android:paddingBottom=\"10dp\"\n                    android:visibility=\"gone\"\n                    tools:visibility=\"visible\">\n\n                    <!--DETAIL-->\n                    <RelativeLayout\n                        android:id=\"@+id/detail_root\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"55dp\"\n                        android:layout_marginLeft=\"12dp\"\n                        android:layout_marginTop=\"6dp\"\n                        android:layout_marginRight=\"12dp\"\n                        android:baselineAligned=\"false\"\n                        android:orientation=\"horizontal\">\n\n                        <!--UPLOADER-->\n                        <LinearLayout\n                            android:id=\"@+id/detail_uploader_root_layout\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"match_parent\"\n                            android:layout_toStartOf=\"@id/details_panel\"\n                            android:layout_toLeftOf=\"@id/details_panel\"\n                            android:background=\"?attr/selectableItemBackground\"\n                            android:gravity=\"center_vertical\"\n                            android:orientation=\"horizontal\"\n                            android:padding=\"6dp\">\n\n                            <FrameLayout\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\">\n\n                                <com.google.android.material.imageview.ShapeableImageView\n                                    android:id=\"@+id/detail_sub_channel_thumbnail_view\"\n                                    android:layout_width=\"@dimen/video_item_detail_uploader_image_size\"\n                                    android:layout_height=\"@dimen/video_item_detail_uploader_image_size\"\n                                    android:contentDescription=\"@string/detail_sub_channel_thumbnail_view_description\"\n                                    android:src=\"@drawable/placeholder_person\"\n                                    app:shapeAppearance=\"@style/CircularImageView\" />\n\n                                <com.google.android.material.imageview.ShapeableImageView\n                                    android:id=\"@+id/detail_uploader_thumbnail_view\"\n                                    android:layout_width=\"@dimen/video_item_detail_sub_channel_image_size\"\n                                    android:layout_height=\"@dimen/video_item_detail_sub_channel_image_size\"\n                                    android:layout_gravity=\"bottom|right\"\n                                    android:contentDescription=\"@string/detail_uploader_thumbnail_view_description\"\n                                    android:src=\"@drawable/placeholder_person\"\n                                    app:shapeAppearance=\"@style/CircularImageView\"\n                                    tools:ignore=\"RtlHardcoded\" />\n\n                            </FrameLayout>\n\n                            <LinearLayout\n                                android:layout_width=\"match_parent\"\n                                android:layout_height=\"match_parent\"\n                                android:layout_marginLeft=\"8dp\"\n                                android:gravity=\"center_vertical\"\n                                android:orientation=\"vertical\">\n\n                                <org.schabi.newpipe.views.NewPipeTextView\n                                    android:id=\"@+id/detail_sub_channel_text_view\"\n                                    android:layout_width=\"match_parent\"\n                                    android:layout_height=\"wrap_content\"\n                                    android:ellipsize=\"marquee\"\n                                    android:fadingEdge=\"horizontal\"\n                                    android:marqueeRepeatLimit=\"marquee_forever\"\n                                    android:scrollHorizontally=\"true\"\n                                    android:singleLine=\"true\"\n                                    android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                                    android:textSize=\"@dimen/video_item_detail_sub_channel_text_size\"\n                                    android:textStyle=\"normal|bold\"\n                                    tools:ignore=\"RtlHardcoded\"\n                                    tools:text=\"Channel\" />\n\n                                <org.schabi.newpipe.views.NewPipeTextView\n                                    android:id=\"@+id/detail_uploader_text_view\"\n                                    android:layout_width=\"match_parent\"\n                                    android:layout_height=\"wrap_content\"\n                                    android:ellipsize=\"marquee\"\n                                    android:fadingEdge=\"horizontal\"\n                                    android:marqueeRepeatLimit=\"marquee_forever\"\n                                    android:scrollHorizontally=\"true\"\n                                    android:singleLine=\"true\"\n                                    android:textSize=\"@dimen/video_item_detail_uploader_text_size\"\n                                    tools:ignore=\"RtlHardcoded\"\n                                    tools:text=\"Uploader\" />\n\n                            </LinearLayout>\n                        </LinearLayout>\n\n                        <!-- VIEW & THUMBS -->\n                        <RelativeLayout\n                            android:id=\"@+id/details_panel\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"match_parent\"\n                            android:layout_alignParentEnd=\"true\"\n                            android:layout_alignParentRight=\"true\"\n                            android:paddingLeft=\"6dp\"\n                            android:paddingRight=\"6dp\">\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_view_count_view\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:layout_centerHorizontal=\"true\"\n                                android:layout_marginTop=\"6dp\"\n                                android:layout_marginBottom=\"6dp\"\n                                android:lines=\"1\"\n                                android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                                android:textSize=\"@dimen/video_item_detail_views_text_size\"\n                                tools:ignore=\"RtlHardcoded\"\n                                tools:text=\"2,816,821,505 views\" />\n\n                            <ImageView\n                                android:id=\"@+id/detail_thumbs_up_img_view\"\n                                android:layout_width=\"@dimen/video_item_detail_like_image_width\"\n                                android:layout_height=\"@dimen/video_item_detail_like_image_height\"\n                                android:layout_below=\"@id/detail_view_count_view\"\n                                android:contentDescription=\"@string/detail_likes_img_view_description\"\n                                android:src=\"@drawable/ic_thumb_up\" />\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_thumbs_up_count_view\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"@dimen/video_item_detail_like_image_height\"\n                                android:layout_below=\"@id/detail_view_count_view\"\n                                android:layout_marginLeft=\"@dimen/video_item_detail_like_margin\"\n                                android:layout_toRightOf=\"@id/detail_thumbs_up_img_view\"\n                                android:gravity=\"center_vertical\"\n                                android:lines=\"1\"\n                                android:textAppearance=\"?android:attr/textAppearanceMedium\"\n                                android:textSize=\"@dimen/video_item_detail_likes_text_size\"\n                                tools:ignore=\"RtlHardcoded\"\n                                tools:text=\"12M\" />\n\n                            <ImageView\n                                android:id=\"@+id/detail_thumbs_down_img_view\"\n                                android:layout_width=\"@dimen/video_item_detail_like_image_width\"\n                                android:layout_height=\"@dimen/video_item_detail_like_image_height\"\n                                android:layout_below=\"@id/detail_view_count_view\"\n                                android:layout_marginLeft=\"12dp\"\n                                android:layout_toRightOf=\"@id/detail_thumbs_up_count_view\"\n                                android:contentDescription=\"@string/detail_dislikes_img_view_description\"\n                                android:src=\"@drawable/ic_thumb_down\"\n                                tools:ignore=\"RtlHardcoded\" />\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_thumbs_down_count_view\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"@dimen/video_item_detail_like_image_height\"\n                                android:layout_below=\"@id/detail_view_count_view\"\n                                android:layout_marginLeft=\"@dimen/video_item_detail_like_margin\"\n                                android:layout_toRightOf=\"@id/detail_thumbs_down_img_view\"\n                                android:gravity=\"center_vertical\"\n                                android:lines=\"1\"\n                                android:textAppearance=\"?android:attr/textAppearanceMedium\"\n                                android:textSize=\"@dimen/video_item_detail_likes_text_size\"\n                                tools:ignore=\"RtlHardcoded\"\n                                tools:text=\"10K\" />\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_thumbs_disabled_view\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"@dimen/video_item_detail_like_image_height\"\n                                android:layout_below=\"@id/detail_view_count_view\"\n                                android:layout_marginLeft=\"12dp\"\n                                android:layout_toRightOf=\"@id/detail_thumbs_down_img_view\"\n                                android:gravity=\"center_vertical\"\n                                android:text=\"@string/disabled\"\n                                android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                                android:textSize=\"@dimen/video_item_detail_likes_text_size\"\n                                android:textStyle=\"bold\"\n                                android:visibility=\"gone\"\n                                tools:ignore=\"RtlHardcoded\"\n                                tools:visibility=\"visible\" />\n                        </RelativeLayout>\n                    </RelativeLayout>\n\n                    <!-- CONTROLS -->\n                    <LinearLayout\n                        android:id=\"@+id/detail_control_panel\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:orientation=\"horizontal\"\n                        android:padding=\"@dimen/detail_control_padding\">\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_controls_playlist_append\"\n                            android:layout_width=\"@dimen/detail_control_width\"\n                            android:layout_height=\"@dimen/detail_control_height\"\n                            android:layout_gravity=\"center_vertical\"\n                            android:layout_weight=\"1\"\n                            android:background=\"?attr/selectableItemBackgroundBorderless\"\n                            android:clickable=\"true\"\n                            android:contentDescription=\"@string/add_to_playlist\"\n                            android:drawableTop=\"@drawable/ic_playlist_add\"\n                            android:focusable=\"true\"\n                            android:gravity=\"center\"\n                            android:paddingVertical=\"@dimen/detail_control_padding\"\n                            android:text=\"@string/controls_add_to_playlist_title\"\n                            android:textSize=\"@dimen/detail_control_text_size\" />\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_controls_background\"\n                            android:layout_width=\"@dimen/detail_control_width\"\n                            android:layout_height=\"@dimen/detail_control_height\"\n                            android:layout_gravity=\"center_vertical\"\n                            android:layout_weight=\"1\"\n                            android:background=\"?attr/selectableItemBackgroundBorderless\"\n                            android:clickable=\"true\"\n                            android:contentDescription=\"@string/play_audio\"\n                            android:drawableTop=\"@drawable/ic_headset\"\n                            android:focusable=\"true\"\n                            android:gravity=\"center\"\n                            android:paddingVertical=\"@dimen/detail_control_padding\"\n                            android:text=\"@string/controls_background_title\"\n                            android:textSize=\"@dimen/detail_control_text_size\" />\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_controls_popup\"\n                            android:layout_width=\"@dimen/detail_control_width\"\n                            android:layout_height=\"@dimen/detail_control_height\"\n                            android:layout_gravity=\"center_vertical\"\n                            android:layout_weight=\"1\"\n                            android:background=\"?attr/selectableItemBackgroundBorderless\"\n                            android:clickable=\"true\"\n                            android:contentDescription=\"@string/open_in_popup_mode\"\n                            android:drawableTop=\"@drawable/ic_picture_in_picture\"\n                            android:focusable=\"true\"\n                            android:gravity=\"center\"\n                            android:paddingVertical=\"@dimen/detail_control_padding\"\n                            android:text=\"@string/controls_popup_title\"\n                            android:textSize=\"@dimen/detail_control_text_size\" />\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_controls_download\"\n                            android:layout_width=\"@dimen/detail_control_width\"\n                            android:layout_height=\"@dimen/detail_control_height\"\n                            android:layout_gravity=\"center_vertical\"\n                            android:layout_weight=\"1\"\n                            android:background=\"?attr/selectableItemBackgroundBorderless\"\n                            android:clickable=\"true\"\n                            android:contentDescription=\"@string/controls_download_desc\"\n                            android:drawableTop=\"@drawable/ic_file_download\"\n                            android:focusable=\"true\"\n                            android:gravity=\"center\"\n                            android:paddingVertical=\"@dimen/detail_control_padding\"\n                            android:text=\"@string/download\"\n                            android:textSize=\"@dimen/detail_control_text_size\" />\n\n                    </LinearLayout>\n\n                    <!-- SECONDARY CONTROLS -->\n                    <LinearLayout\n                        android:id=\"@+id/detail_secondary_control_panel\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:orientation=\"horizontal\"\n                        android:paddingHorizontal=\"@dimen/detail_control_padding\"\n                        android:paddingBottom=\"@dimen/detail_control_padding\"\n                        android:visibility=\"gone\"\n                        tools:visibility=\"visible\">\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_controls_share\"\n                            android:layout_width=\"@dimen/detail_control_width\"\n                            android:layout_height=\"@dimen/detail_control_height\"\n                            android:layout_gravity=\"center_vertical\"\n                            android:layout_weight=\"1\"\n                            android:background=\"?attr/selectableItemBackgroundBorderless\"\n                            android:clickable=\"true\"\n                            android:contentDescription=\"@string/share\"\n                            android:drawableTop=\"@drawable/ic_share\"\n                            android:focusable=\"true\"\n                            android:gravity=\"center\"\n                            android:paddingVertical=\"@dimen/detail_control_padding\"\n                            android:text=\"@string/share\"\n                            android:textSize=\"@dimen/detail_control_text_size\" />\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_controls_open_in_browser\"\n                            android:layout_width=\"@dimen/detail_control_width\"\n                            android:layout_height=\"@dimen/detail_control_height\"\n                            android:layout_gravity=\"center_vertical\"\n                            android:layout_weight=\"1\"\n                            android:background=\"?attr/selectableItemBackgroundBorderless\"\n                            android:clickable=\"true\"\n                            android:contentDescription=\"@string/open_in_browser\"\n                            android:drawableTop=\"@drawable/ic_language\"\n                            android:focusable=\"true\"\n                            android:gravity=\"center\"\n                            android:paddingVertical=\"@dimen/detail_control_padding\"\n                            android:text=\"@string/open_in_browser\"\n                            android:textSize=\"@dimen/detail_control_text_size\" />\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_controls_play_with_kodi\"\n                            android:layout_width=\"@dimen/detail_control_width\"\n                            android:layout_height=\"@dimen/detail_control_height\"\n                            android:layout_gravity=\"center_vertical\"\n                            android:layout_weight=\"1\"\n                            android:background=\"?attr/selectableItemBackgroundBorderless\"\n                            android:clickable=\"true\"\n                            android:contentDescription=\"@string/play_with_kodi_title\"\n                            android:drawableTop=\"@drawable/ic_cast\"\n                            android:focusable=\"true\"\n                            android:gravity=\"center\"\n                            android:paddingVertical=\"@dimen/detail_control_padding\"\n                            android:text=\"@string/play_with_kodi_title\"\n                            android:textSize=\"@dimen/detail_control_text_size\" />\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_controls_crash_the_player\"\n                            android:layout_width=\"@dimen/detail_control_width\"\n                            android:layout_height=\"@dimen/detail_control_height\"\n                            android:layout_gravity=\"center_vertical\"\n                            android:layout_weight=\"1\"\n                            android:background=\"?attr/selectableItemBackgroundBorderless\"\n                            android:clickable=\"true\"\n                            android:contentDescription=\"@string/crash_the_player\"\n                            android:drawableTop=\"@drawable/ic_bug_report\"\n                            android:focusable=\"true\"\n                            android:gravity=\"center\"\n                            android:paddingVertical=\"@dimen/detail_control_padding\"\n                            android:text=\"@string/crash_the_player\"\n                            android:textSize=\"@dimen/detail_control_text_size\" />\n\n                    </LinearLayout>\n\n                    <View\n                        android:id=\"@+id/detail_meta_info_separator\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"1px\"\n                        android:layout_marginLeft=\"8dp\"\n                        android:layout_marginRight=\"8dp\"\n                        android:background=\"?attr/separator_color\" />\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/detail_meta_info_text_view\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:gravity=\"center\"\n                        android:padding=\"12dp\"\n                        android:textSize=\"@dimen/video_item_detail_description_text_size\"\n                        tools:text=\"Stream meta info with link\" />\n\n                    <View\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"1px\"\n                        android:layout_marginLeft=\"8dp\"\n                        android:layout_marginRight=\"8dp\"\n                        android:background=\"?attr/separator_color\" />\n\n                </LinearLayout>\n            </RelativeLayout>\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <androidx.viewpager.widget.ViewPager\n            android:id=\"@+id/view_pager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:paddingBottom=\"48dp\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n        <com.google.android.material.tabs.TabLayout\n            android:id=\"@+id/tab_layout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom|center\"\n            app:elevation=\"16dp\"\n            app:tabBackground=\"?attr/windowBackground\"\n            app:tabGravity=\"fill\"\n            app:tabIconTint=\"?attr/colorAccent\"\n            app:tabIndicatorGravity=\"top\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/overlay_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:alpha=\"0.9\"\n        android:background=\"?attr/windowBackground\">\n\n        <ImageButton\n            android:id=\"@+id/overlay_thumbnail\"\n            android:layout_width=\"62dp\"\n            android:layout_height=\"60dp\"\n            android:layout_alignParentStart=\"true\"\n            android:background=\"@color/transparent_background_color\"\n            android:gravity=\"center_vertical\"\n            android:paddingLeft=\"@dimen/video_item_search_padding\"\n            android:paddingRight=\"@dimen/video_item_search_padding\"\n            android:scaleType=\"fitCenter\"\n            tools:ignore=\"ContentDescription\" />\n\n        <LinearLayout\n            android:id=\"@+id/overlay_metadata_layout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"60dp\"\n            android:layout_toStartOf=\"@+id/overlay_buttons_layout\"\n            android:layout_toEndOf=\"@+id/overlay_thumbnail\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:gravity=\"center_vertical\"\n            android:orientation=\"vertical\"\n            android:theme=\"@style/ContrastTintTheme\"\n            tools:ignore=\"RtlHardcoded\">\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/overlay_title_text_view\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"marquee\"\n                android:fadingEdge=\"horizontal\"\n                android:marqueeRepeatLimit=\"marquee_forever\"\n                android:scrollHorizontally=\"true\"\n                android:singleLine=\"true\"\n                android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                android:textSize=\"@dimen/video_item_search_title_text_size\"\n                tools:ignore=\"RtlHardcoded\"\n                tools:text=\"The Video Title LONG very LONVideo Title LONG very LONG\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/overlay_channel_text_view\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"marquee\"\n                android:fadingEdge=\"horizontal\"\n                android:marqueeRepeatLimit=\"marquee_forever\"\n                android:scrollHorizontally=\"true\"\n                android:singleLine=\"true\"\n                android:textAppearance=\"?android:attr/textAppearanceSmall\"\n                android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n                tools:text=\"The Video Artist  LONG very LONG very Long\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:id=\"@+id/overlay_buttons_layout\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"60dp\"\n            android:layout_alignParentEnd=\"true\"\n            android:gravity=\"center_vertical\"\n            android:theme=\"@style/ContrastTintTheme\"\n            tools:ignore=\"RtlHardcoded\">\n\n            <ImageButton\n                android:id=\"@+id/overlay_play_queue_button\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"match_parent\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:contentDescription=\"@string/title_activity_play_queue\"\n                android:scaleType=\"center\"\n                android:src=\"@drawable/ic_list\"\n                tools:ignore=\"RtlHardcoded\" />\n\n            <ImageButton\n                android:id=\"@+id/overlay_play_pause_button\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"match_parent\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:contentDescription=\"@string/pause\"\n                android:focusable=\"true\"\n                android:focusedByDefault=\"true\"\n                android:scaleType=\"center\"\n                android:src=\"@drawable/ic_play_arrow\" />\n\n            <ImageButton\n                android:id=\"@+id/overlay_close_button\"\n                android:layout_width=\"48dp\"\n                android:layout_height=\"match_parent\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:contentDescription=\"@string/close\"\n                android:paddingRight=\"8dp\"\n                android:scaleType=\"center\"\n                android:src=\"@drawable/ic_close\"\n                tools:ignore=\"RtlSymmetry\" />\n\n        </LinearLayout>\n\n    </RelativeLayout>\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/instance_spinner_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@android:id/text1\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"match_parent\"\n    android:maxLength=\"0\" />\n"
  },
  {
    "path": "app/src/main/res/layout/instance_spinner_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Spinner xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/spinner\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"end\"\n    android:prompt=\"@string/choose_instance_prompt\"\n    tools:listitem=\"@layout/instance_spinner_item\" />\n"
  },
  {
    "path": "app/src/main/res/layout/item_instance.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginLeft=\"5dp\"\n    android:layout_marginTop=\"3dp\"\n    android:layout_marginRight=\"5dp\"\n    android:layout_marginBottom=\"3dp\"\n    android:minHeight=\"?listPreferredItemHeightSmall\"\n    android:orientation=\"horizontal\"\n    app:cardCornerRadius=\"5dp\"\n    app:cardElevation=\"4dp\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center_vertical\">\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/instanceIcon\"\n            android:layout_width=\"24dp\"\n            android:layout_height=\"24dp\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"10dp\"\n            tools:ignore=\"ContentDescription,RtlHardcoded\"\n            tools:src=\"@drawable/ic_placeholder_peertube\" />\n\n        <TextView\n            android:id=\"@+id/instanceName\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginTop=\"6dp\"\n            android:layout_toLeftOf=\"@id/selectInstanceRB\"\n            android:layout_toRightOf=\"@+id/instanceIcon\"\n            android:ellipsize=\"marquee\"\n            android:singleLine=\"true\"\n            android:textAppearance=\"?textAppearanceListItem\"\n            tools:ignore=\"RtlHardcoded\"\n            tools:text=\"Framatube\" />\n\n        <TextView\n            android:id=\"@+id/instanceUrl\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/instanceName\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginBottom=\"6dp\"\n            android:layout_toLeftOf=\"@id/selectInstanceRB\"\n            android:layout_toRightOf=\"@id/instanceIcon\"\n            android:autoLink=\"web\"\n            android:ellipsize=\"marquee\"\n            android:singleLine=\"true\"\n            android:textAppearance=\"?textAppearanceListItemSecondary\"\n            tools:ignore=\"RtlHardcoded\"\n            tools:text=\"https://framatube.org\" />\n\n        <RadioButton\n            android:id=\"@+id/selectInstanceRB\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_toLeftOf=\"@id/handle\" />\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/handle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:paddingLeft=\"16dp\"\n            android:paddingTop=\"12dp\"\n            android:paddingRight=\"10dp\"\n            android:paddingBottom=\"12dp\"\n            android:src=\"@drawable/ic_drag_handle\"\n            tools:ignore=\"ContentDescription,RtlHardcoded\" />\n    </RelativeLayout>\n</androidx.cardview.widget.CardView>\n"
  },
  {
    "path": "app/src/main/res/layout/item_metadata.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingVertical=\"6dp\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/metadata_type_view\"\n        android:layout_width=\"96dp\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_vertical|end\"\n        android:textAllCaps=\"true\"\n        android:textColor=\"?android:attr/textColorPrimary\"\n        android:textStyle=\"bold\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Licence\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/metadata_content_view\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@+id/metadata_type_view\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Description Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a ultricies ex. Integer sit amet sodales risus. Duis non mi et urna pretium bibendum.\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_metadata_tags.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fadeScrollbars=\"false\">\n\n    <TextView\n        android:id=\"@+id/metadata_type_view\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        android:gravity=\"center\"\n        android:text=\"@string/metadata_tags\"\n        android:textAllCaps=\"true\"\n        android:textColor=\"?android:attr/textColorPrimary\"\n        android:textStyle=\"bold\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <com.google.android.material.chip.ChipGroup\n        android:id=\"@+id/metadata_tags_chips\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/metadata_type_view\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_notification_config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<CheckedTextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"?listPreferredItemHeightSmall\"\n    android:background=\"?selectableItemBackground\"\n    android:ellipsize=\"end\"\n    android:gravity=\"center_vertical\"\n    android:maxLines=\"2\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"?listPreferredItemPaddingStart\"\n    android:paddingEnd=\"?listPreferredItemPaddingEnd\"\n    android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"\n    android:drawableEnd=\"?android:listChoiceIndicatorMultiple\"\n    tools:text=\"@tools:sample/lorem[4]\" />\n"
  },
  {
    "path": "app/src/main/res/layout/item_search_suggestion.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:theme=\"@style/ContrastTintTheme\">\n\n    <LinearLayout\n        android:id=\"@+id/suggestion_search\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:layout_toStartOf=\"@id/suggestion_insert\"\n        android:layout_toLeftOf=\"@id/suggestion_insert\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:paddingTop=\"8dp\"\n        android:paddingBottom=\"8dp\">\n\n        <ImageView\n            android:id=\"@+id/item_suggestion_icon\"\n            android:layout_width=\"24dp\"\n            android:layout_height=\"24dp\"\n            android:layout_gravity=\"center_vertical\"\n            android:layout_marginLeft=\"16dp\"\n            android:layout_marginRight=\"16dp\"\n            tools:ignore=\"ContentDescription,RtlHardcoded\"\n            tools:src=\"@drawable/ic_history\" />\n\n        <TextView\n            android:id=\"@+id/item_suggestion_query\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"2\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"\n            android:textSize=\"14sp\"\n            tools:ignore=\"RtlHardcoded\"\n            tools:text=\"Search query\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/suggestion_insert\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:paddingLeft=\"16dp\"\n        android:paddingTop=\"10dp\"\n        android:paddingRight=\"16dp\"\n        android:paddingBottom=\"8dp\">\n\n        <ImageView\n            android:layout_width=\"20dp\"\n            android:layout_height=\"20dp\"\n            android:layout_gravity=\"center\"\n            android:src=\"@drawable/ic_search_add\"\n            tools:ignore=\"ContentDescription,RtlHardcoded\" />\n    </LinearLayout>\n\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_software_component.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\">\n\n    <TextView\n        android:id=\"@+id/name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:paddingTop=\"10dp\"\n        android:textAppearance=\"@android:style/TextAppearance.Medium\"\n        tools:text=\"Software Name\" />\n\n    <TextView\n        android:id=\"@+id/copyright\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/name\"\n        android:paddingBottom=\"10dp\"\n        tools:text=\"@string/copyright\" />\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_stream_segment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selector\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:foreground=\"?attr/selectableItemBackground\"\n    android:paddingStart=\"16dp\"\n    android:paddingTop=\"4dp\"\n    android:paddingEnd=\"16dp\"\n    android:paddingBottom=\"4dp\">\n\n    <ImageView\n        android:id=\"@+id/previewImage\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"@dimen/play_queue_thumbnail_width\"\n        android:scaleType=\"fitCenter\"\n        android:src=\"@drawable/placeholder_thumbnail_video\"\n        app:layout_constraintDimensionRatio=\"16:9\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:ignore=\"ContentDescription\" />\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:orientation=\"vertical\"\n        android:paddingStart=\"8dp\"\n        android:paddingEnd=\"0dp\"\n        app:layout_constraintBottom_toBottomOf=\"@id/previewImage\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/previewImage\"\n        app:layout_constraintTop_toTopOf=\"parent\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/textViewTitle\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"1\"\n            android:textAppearance=\"@style/PlayQueueItemTitle\"\n            android:textSize=\"@dimen/video_item_search_title_text_size\"\n            tools:text=\"Lorem ipusum is widely used to create long sample text which is used here too\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/textViewChannel\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"1\"\n            android:textAppearance=\"@style/PlayQueueItemSubtitle\"\n            android:textSize=\"@dimen/video_item_search_title_text_size\"\n\n            tools:text=\"Lorem ipsum creator\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/textViewStartSeconds\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"2dp\"\n            android:textAppearance=\"@style/PlayQueueItemSubtitle\"\n            android:textSize=\"@dimen/video_item_search_upload_date_text_size\"\n            tools:text=\"04:26\" />\n\n    </LinearLayout>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/list_channel_card_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/channel_item_grid_padding\">\n\n    <com.google.android.material.imageview.ShapeableImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"@dimen/channel_item_card_thumbnail_image_size\"\n        android:layout_height=\"@dimen/channel_item_card_thumbnail_image_size\"\n        android:layout_centerHorizontal=\"true\"\n        android:contentDescription=\"@string/detail_uploader_thumbnail_view_description\"\n        android:src=\"@drawable/placeholder_person\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:shapeAppearance=\"@style/CircularImageView\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:src=\"@tools:sample/avatars\" />\n\n    <TextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"@dimen/spacing_mid\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        android:textStyle=\"normal\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/itemThumbnailView\"\n        app:layout_constraintTop_toTopOf=\"@id/itemThumbnailView\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"@sample/channels.json/data/name\" />\n\n    <TextView\n        android:id=\"@+id/itemChannelDescriptionView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/itemTitleView\"\n        android:layout_centerHorizontal=\"true\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"8\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_upload_date_text_size\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@id/itemTitleView\"\n        app:layout_constraintTop_toBottomOf=\"@id/itemTitleView\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"@sample/channels.json/data/description\" />\n\n    <TextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/spacing_micro\"\n        android:gravity=\"center\"\n        android:lines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_upload_date_text_size\"\n        android:textStyle=\"normal\"\n        app:layout_constraintEnd_toEndOf=\"@id/itemThumbnailView\"\n        app:layout_constraintStart_toStartOf=\"@id/itemThumbnailView\"\n        app:layout_constraintTop_toBottomOf=\"@id/itemThumbnailView\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"@sample/channels.json/data/additional\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_channel_grid_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:minWidth=\"@dimen/channel_item_grid_min_width\"\n    android:padding=\"@dimen/channel_item_grid_padding\">\n\n    <com.google.android.material.imageview.ShapeableImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"@dimen/channel_item_grid_thumbnail_image_size\"\n        android:layout_height=\"@dimen/channel_item_grid_thumbnail_image_size\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_margin=\"2dp\"\n        android:contentDescription=\"@string/detail_uploader_thumbnail_view_description\"\n        android:src=\"@drawable/placeholder_person\"\n        app:shapeAppearance=\"@style/CircularImageView\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <TextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/itemThumbnailView\"\n        android:layout_centerHorizontal=\"true\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Channel Title, Lorem ipsum\" />\n\n    <TextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/itemTitleView\"\n        android:layout_centerHorizontal=\"true\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_upload_date_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"10M subscribers • 100 videos\" />\n\n    <TextView\n        android:id=\"@+id/itemChannelDescriptionView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/itemAdditionalDetails\"\n        android:layout_centerHorizontal=\"true\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_upload_date_text_size\"\n        android:gravity=\"center\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"@tools:sample/lorem/random\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_channel_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <TextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/video_item_search_image_right_margin\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemChannelDescriptionView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.5\"\n        app:layout_constraintStart_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Channel Title, Lorem ipsum\" />\n\n    <TextView\n        android:id=\"@+id/itemChannelDescriptionView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"@dimen/channel_item_description_to_details_margin\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemAdditionalDetails\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemTitleView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemTitleView\"\n        tools:text=\"Channel description, Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blandit\" />\n\n    <TextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_upload_date_text_size\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintLeft_toLeftOf=\"@+id/itemTitleView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemChannelDescriptionView\"\n        tools:text=\"10M subscribers • 1000 videos\" />\n\n    <com.google.android.material.imageview.ShapeableImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"@dimen/video_item_search_avatar_image_width\"\n        android:layout_height=\"@dimen/video_item_search_avatar_image_height\"\n        android:layout_marginLeft=\"@dimen/video_item_search_avatar_left_margin\"\n        android:layout_marginRight=\"@dimen/video_item_search_avatar_right_margin\"\n        android:src=\"@drawable/placeholder_person\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@+id/itemTitleView\"\n        app:layout_constraintHorizontal_bias=\"0.5\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:shapeAppearance=\"@style/CircularImageView\"\n        tools:ignore=\"RtlHardcoded\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_channel_mini_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <com.google.android.material.imageview.ShapeableImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"42dp\"\n        android:layout_height=\"42dp\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginStart=\"3dp\"\n        android:layout_marginRight=\"15dp\"\n        android:src=\"@drawable/placeholder_person\"\n        app:shapeAppearance=\"@style/CircularImageView\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <TextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginTop=\"3dp\"\n        android:layout_marginBottom=\"2dp\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Channel Title, Lorem ipsum\" />\n\n    <TextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/itemTitleView\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_upload_date_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"10M subscribers\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_choose_tabs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.cardview.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginLeft=\"5dp\"\n    android:layout_marginTop=\"3dp\"\n    android:layout_marginRight=\"5dp\"\n    android:layout_marginBottom=\"3dp\"\n    android:focusable=\"true\"\n    android:minHeight=\"?listPreferredItemHeightSmall\"\n    android:orientation=\"horizontal\"\n    app:cardCornerRadius=\"5dp\"\n    app:cardElevation=\"4dp\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center_vertical\">\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/tabIcon\"\n            android:layout_width=\"24dp\"\n            android:layout_height=\"24dp\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"16dp\"\n            tools:ignore=\"ContentDescription,RtlHardcoded\"\n            tools:src=\"@drawable/ic_kiosk_hot\" />\n\n        <TextView\n            android:id=\"@+id/tabName\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"16dp\"\n            android:layout_marginTop=\"6dp\"\n            android:layout_marginBottom=\"6dp\"\n            android:layout_toLeftOf=\"@+id/handle\"\n            android:layout_toRightOf=\"@+id/tabIcon\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"2\"\n            android:textAppearance=\"?textAppearanceListItem\"\n            tools:ignore=\"RtlHardcoded\"\n            tools:text=\"Lorem ipsum dolor sit amet\" />\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/handle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:paddingLeft=\"16dp\"\n            android:paddingTop=\"12dp\"\n            android:paddingRight=\"16dp\"\n            android:paddingBottom=\"12dp\"\n            android:src=\"@drawable/ic_drag_handle\"\n            tools:ignore=\"ContentDescription,RtlHardcoded\" />\n    </RelativeLayout>\n</androidx.cardview.widget.CardView>\n"
  },
  {
    "path": "app/src/main/res/layout/list_choose_tabs_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:minHeight=\"?listPreferredItemHeightSmall\"\n    android:orientation=\"horizontal\">\n\n    <androidx.appcompat.widget.AppCompatImageView\n        android:id=\"@+id/tabIcon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginLeft=\"?dialogPreferredPadding\"\n        tools:ignore=\"ContentDescription,RtlHardcoded\"\n        tools:src=\"@drawable/ic_kiosk_hot\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/tabName\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginLeft=\"?dialogPreferredPadding\"\n        android:layout_marginRight=\"?dialogPreferredPadding\"\n        android:layout_toRightOf=\"@+id/tabIcon\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?textAppearanceListItem\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Lorem ipsum dolor sit amet\" />\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_comment_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/comments_vertical_padding\">\n\n    <com.google.android.material.imageview.ShapeableImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"42dp\"\n        android:layout_height=\"42dp\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginEnd=\"@dimen/comment_item_avatar_right_margin\"\n        android:focusable=\"false\"\n        android:src=\"@drawable/placeholder_person\"\n        app:shapeAppearance=\"@style/CircularImageView\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <ImageView\n        android:id=\"@+id/detail_pinned_view\"\n        android:layout_width=\"@dimen/video_item_detail_pinned_image_width\"\n        android:layout_height=\"@dimen/video_item_detail_pinned_image_height\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginEnd=\"@dimen/video_item_detail_pinned_right_margin\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:contentDescription=\"@string/detail_pinned_comment_view_description\"\n        android:src=\"@drawable/ic_pin\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toEndOf=\"@+id/detail_pinned_view\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/comment_item_title_text_size\"\n        tools:text=\"Author Name, Lorem ipsum • 5 months ago\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemCommentContentView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/itemTitleView\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/comment_item_content_text_size\"\n        tools:text=\"@tools:sample/lorem/random[1]\" />\n\n    <ImageView\n        android:id=\"@+id/detail_thumbs_up_img_view\"\n        android:layout_width=\"@dimen/video_item_detail_like_image_width\"\n        android:layout_height=\"@dimen/video_item_detail_like_image_height\"\n        android:layout_below=\"@id/itemCommentContentView\"\n        android:layout_alignBottom=\"@+id/replies_button\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:contentDescription=\"@string/detail_likes_img_view_description\"\n        android:src=\"@drawable/ic_thumb_up\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/detail_thumbs_up_count_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignTop=\"@id/detail_thumbs_up_img_view\"\n        android:layout_alignBottom=\"@id/detail_thumbs_up_img_view\"\n        android:layout_marginStart=\"@dimen/video_item_detail_like_margin\"\n        android:layout_toEndOf=\"@id/detail_thumbs_up_img_view\"\n        android:gravity=\"center\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\"\n        android:textSize=\"@dimen/video_item_detail_likes_text_size\"\n        tools:text=\"12M\" />\n\n    <ImageView\n        android:id=\"@+id/detail_heart_image_view\"\n        android:layout_width=\"@dimen/video_item_detail_heart_image_size\"\n        android:layout_height=\"@dimen/video_item_detail_heart_image_size\"\n        android:layout_alignTop=\"@id/detail_thumbs_up_img_view\"\n        android:layout_alignBottom=\"@id/detail_thumbs_up_img_view\"\n        android:layout_marginStart=\"@dimen/video_item_detail_heart_margin\"\n        android:layout_toEndOf=\"@+id/detail_thumbs_up_count_view\"\n        android:contentDescription=\"@string/detail_heart_img_view_description\"\n        android:src=\"@drawable/ic_heart\" />\n\n    <Button\n        android:id=\"@+id/replies_button\"\n        style=\"?android:attr/borderlessButtonStyle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/itemCommentContentView\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_marginStart=\"@dimen/video_item_detail_heart_margin\"\n        android:minHeight=\"0dp\"\n        tools:text=\"543 replies\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_empty_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center\"\n    android:minHeight=\"128dp\"\n    android:orientation=\"vertical\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"¯\\\\_(ツ)_/¯\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        tools:ignore=\"HardcodedText\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:layout_marginTop=\"6dp\"\n        android:gravity=\"center\"\n        android:paddingHorizontal=\"16dp\"\n        android:text=\"@string/empty_list_subtitle\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_empty_view_subscriptions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center\"\n    android:minHeight=\"128dp\"\n    android:orientation=\"vertical\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"¯\\\\_(ツ)_/¯\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        tools:ignore=\"HardcodedText\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:layout_marginTop=\"6dp\"\n        android:gravity=\"center\"\n        android:paddingHorizontal=\"16dp\"\n        android:text=\"@string/import_subscriptions_hint\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_playlist_bookmark_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"90dp\"\n        android:layout_height=\"50dp\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginRight=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"centerCrop\"\n        android:src=\"@drawable/placeholder_thumbnail_playlist\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemStreamCountView\"\n        android:layout_width=\"45dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignTop=\"@id/itemThumbnailView\"\n        android:layout_alignRight=\"@id/itemThumbnailView\"\n        android:layout_alignBottom=\"@id/itemThumbnailView\"\n        android:background=\"@color/playlist_stream_count_background_color\"\n        android:gravity=\"center\"\n        android:paddingTop=\"4dp\"\n        android:paddingBottom=\"6dp\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        android:textStyle=\"bold\"\n        app:drawableTint=\"@color/duration_text_color\"\n        app:drawableTopCompat=\"@drawable/ic_playlist_play\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"3141\" />\n\n    <ImageView\n        android:id=\"@+id/itemHandle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"55dp\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_alignTop=\"@id/itemTitleView\"\n        android:layout_alignBottom=\"@id/itemUploaderView\"\n        android:contentDescription=\"@string/detail_drag_description\"\n        android:paddingLeft=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"center\"\n        app:srcCompat=\"@drawable/ic_drag_handle\"\n        tools:ignore=\"RtlHardcoded,RtlSymmetry\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toStartOf=\"@id/itemHandle\"\n        android:layout_toLeftOf=\"@id/itemHandle\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemUploaderView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/itemTitleView\"\n        android:layout_toLeftOf=\"@id/itemHandle\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Uploader really long lorem ipsum dolor sit amet consectetur\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_playlist_card_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:paddingTop=\"@dimen/margin_small\"\n    android:paddingBottom=\"@dimen/spacing_micro\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:scaleType=\"fitStart\"\n        android:src=\"@drawable/placeholder_thumbnail_playlist\"\n        app:layout_constraintDimensionRatio=\"16:9\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <View\n        android:id=\"@+id/videoCountOverlay\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:background=\"@color/playlist_stream_count_background_color\"\n        app:layout_constraintBottom_toBottomOf=\"@id/itemThumbnailView\"\n        app:layout_constraintEnd_toEndOf=\"@id/itemThumbnailView\"\n        app:layout_constraintTop_toTopOf=\"@id/itemThumbnailView\"\n        app:layout_constraintWidth_percent=\"0.35\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemStreamCountView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textStyle=\"bold\"\n        app:layout_constraintBottom_toTopOf=\"@id/playIcon\"\n        app:layout_constraintEnd_toEndOf=\"@id/videoCountOverlay\"\n        app:layout_constraintStart_toStartOf=\"@id/videoCountOverlay\"\n        app:layout_constraintTop_toTopOf=\"@id/videoCountOverlay\"\n        app:layout_constraintVertical_chainStyle=\"packed\"\n        tools:text=\"314159\" />\n\n    <!--    playIcon includes 8dp start margin to give center aligned look\n            when placed next to the video count -->\n    <androidx.appcompat.widget.AppCompatImageView\n        android:id=\"@+id/playIcon\"\n        android:layout_width=\"@dimen/player_main_buttons_min_width\"\n        android:layout_height=\"@dimen/player_main_buttons_min_width\"\n        android:layout_marginStart=\"8dp\"\n        android:src=\"@drawable/ic_playlist_play\"\n        android:tint=\"@color/duration_text_color\"\n        app:layout_constraintBottom_toBottomOf=\"@id/videoCountOverlay\"\n        app:layout_constraintEnd_toEndOf=\"@id/videoCountOverlay\"\n        app:layout_constraintStart_toStartOf=\"@id/videoCountOverlay\"\n        app:layout_constraintTop_toBottomOf=\"@id/itemStreamCountView\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"@dimen/margin_small\"\n        android:layout_marginTop=\"@dimen/spacing_nano\"\n        android:layout_marginEnd=\"@dimen/margin_small\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:textAppearanceListItem\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/itemThumbnailView\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemUploaderView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:textAppearanceSmall\"\n        app:layout_constraintEnd_toEndOf=\"@id/itemTitleView\"\n        app:layout_constraintStart_toStartOf=\"@id/itemTitleView\"\n        app:layout_constraintTop_toBottomOf=\"@id/itemTitleView\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Uploader\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_playlist_grid_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"@dimen/video_item_grid_thumbnail_image_width\"\n        android:layout_height=\"@dimen/video_item_grid_thumbnail_image_height\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_marginRight=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"fitStart\"\n        android:src=\"@drawable/placeholder_thumbnail_playlist\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemStreamCountView\"\n        android:layout_width=\"@dimen/playlist_item_thumbnail_stream_count_width\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignTop=\"@id/itemThumbnailView\"\n        android:layout_alignEnd=\"@id/itemThumbnailView\"\n        android:layout_alignBottom=\"@id/itemThumbnailView\"\n        android:background=\"@color/playlist_stream_count_background_color\"\n        android:drawableTop=\"@drawable/ic_playlist_play\"\n        android:drawableTint=\"@color/duration_text_color\"\n        android:gravity=\"center\"\n        android:paddingTop=\"16dp\"\n        android:paddingBottom=\"14dp\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        android:textStyle=\"bold\"\n        tools:text=\"314159\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/itemThumbnailView\"\n        android:layout_alignLeft=\"@id/itemThumbnailView\"\n        android:layout_alignRight=\"@id/itemThumbnailView\"\n        android:layout_marginTop=\"2dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemUploaderView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/itemTitleView\"\n        android:layout_alignLeft=\"@id/itemThumbnailView\"\n        android:layout_alignRight=\"@id/itemThumbnailView\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Uploader\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_playlist_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/video_item_search_height\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"@dimen/video_item_search_thumbnail_image_width\"\n        android:layout_height=\"@dimen/video_item_search_thumbnail_image_height\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginRight=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"fitStart\"\n        android:src=\"@drawable/placeholder_thumbnail_playlist\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemStreamCountView\"\n        android:layout_width=\"@dimen/playlist_item_thumbnail_stream_count_width\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignTop=\"@id/itemThumbnailView\"\n        android:layout_alignEnd=\"@id/itemThumbnailView\"\n        android:layout_alignBottom=\"@id/itemThumbnailView\"\n        android:background=\"@color/playlist_stream_count_background_color\"\n        android:drawableTop=\"@drawable/ic_playlist_play\"\n        android:drawableTint=\"@color/duration_text_color\"\n        android:gravity=\"center\"\n        android:paddingTop=\"16dp\"\n        android:paddingBottom=\"14dp\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        android:textStyle=\"bold\"\n        tools:text=\"314159\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemUploaderView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/itemTitleView\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Uploader\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_playlist_mini_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"90dp\"\n        android:layout_height=\"50dp\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginRight=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"fitStart\"\n        android:src=\"@drawable/placeholder_thumbnail_playlist\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemStreamCountView\"\n        android:layout_width=\"45dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignTop=\"@id/itemThumbnailView\"\n        android:layout_alignEnd=\"@id/itemThumbnailView\"\n        android:layout_alignBottom=\"@id/itemThumbnailView\"\n        android:background=\"@color/playlist_stream_count_background_color\"\n        android:drawableTop=\"@drawable/ic_playlist_play\"\n        android:drawableTint=\"@color/duration_text_color\"\n        android:gravity=\"center\"\n        android:paddingTop=\"4dp\"\n        android:paddingBottom=\"6dp\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        android:textStyle=\"bold\"\n        tools:text=\"3141\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemUploaderView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/itemTitleView\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"Uploader\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_radio_icon_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RadioButton xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/checked_selector\"\n    android:button=\"@null\"\n    android:drawablePadding=\"24dp\"\n    android:ellipsize=\"marquee\"\n    android:gravity=\"center_vertical\"\n    android:maxLines=\"2\"\n    android:minHeight=\"?attr/listPreferredItemHeightSmall\"\n    android:paddingStart=\"?attr/listPreferredItemPaddingLeft\"\n    android:paddingEnd=\"?attr/listPreferredItemPaddingRight\"\n    android:textColor=\"?attr/textColorAlertDialogListItem\"\n    tools:drawableLeft=\"@drawable/ic_play_arrow\"\n    tools:text=\"Lorem ipsum dolor sit amet\" />\n"
  },
  {
    "path": "app/src/main/res/layout/list_stream_card_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingTop=\"@dimen/channel_item_grid_padding\"\n    android:paddingBottom=\"@dimen/channel_item_grid_padding\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"2dp\"\n        android:layout_marginEnd=\"2dp\"\n        android:scaleType=\"centerCrop\"\n        android:src=\"@drawable/placeholder_thumbnail_video\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemProgressView\"\n        app:layout_constraintDimensionRatio=\"16:9\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemDurationView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"@dimen/video_item_search_duration_margin\"\n        android:layout_marginBottom=\"@dimen/video_item_search_duration_margin\"\n        android:background=\"@color/duration_background_color\"\n        android:paddingHorizontal=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingVertical=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:textAllCaps=\"true\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        app:layout_constraintBottom_toBottomOf=\"@id/itemThumbnailView\"\n        app:layout_constraintRight_toRightOf=\"@id/itemThumbnailView\"\n        tools:text=\"1:09:10\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemVideoTitleView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"@dimen/margin_small\"\n        android:layout_marginEnd=\"@dimen/margin_small\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:layout_marginTop=\"@dimen/margin_small\"\n        android:textAppearance=\"?textAppearanceListItem\"\n        app:layout_constraintEnd_toEndOf=\"@id/itemThumbnailView\"\n        app:layout_constraintStart_toStartOf=\"@id/itemThumbnailView\"\n        app:layout_constraintTop_toBottomOf=\"@id/itemThumbnailView\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemUploaderView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"@dimen/spacing_micro\"\n        android:layout_marginEnd=\"@dimen/margin_small\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:includeFontPadding=\"false\"\n        android:textAppearance=\"?android:textAppearanceSmall\"\n        app:layout_constraintEnd_toStartOf=\"@id/itemAdditionalDetails\"\n        app:layout_constraintStart_toStartOf=\"@id/itemVideoTitleView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemVideoTitleView\"\n        tools:text=\"Uploader\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:includeFontPadding=\"false\"\n        android:textAppearance=\"?android:textAppearanceSmall\"\n        app:layout_constraintBottom_toBottomOf=\"@id/itemUploaderView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemVideoTitleView\"\n        app:layout_constraintStart_toEndOf=\"@id/itemUploaderView\"\n        app:layout_constraintTop_toTopOf=\"@id/itemUploaderView\"\n        tools:text=\"2 years ago • 10M views\" />\n\n    <org.schabi.newpipe.views.AnimatedProgressBar\n        android:id=\"@+id/itemProgressView\"\n        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"4dp\"\n        android:progressDrawable=\"?progress_horizontal_drawable\"\n        app:layout_constraintBottom_toBottomOf=\"@id/itemThumbnailView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemThumbnailView\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_stream_grid_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"@dimen/video_item_grid_thumbnail_image_width\"\n        android:layout_height=\"@dimen/video_item_grid_thumbnail_image_height\"\n        android:scaleType=\"fitCenter\"\n        android:src=\"@drawable/placeholder_thumbnail_video\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemDurationView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"@dimen/video_item_search_duration_margin\"\n        android:layout_marginBottom=\"@dimen/video_item_search_duration_margin\"\n        android:background=\"@color/duration_background_color\"\n        android:paddingLeft=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingTop=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:paddingRight=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingBottom=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:textAllCaps=\"true\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemThumbnailView\"\n        tools:text=\"1:09:10\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemVideoTitleView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemUploaderView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemProgressView\"\n        tools:text=\"@tools:sample/lorem[10]\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemUploaderView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemAdditionalDetails\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemVideoTitleView\"\n        tools:text=\"Uploader name long very very long long\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_upload_date_text_size\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemUploaderView\"\n        tools:text=\"2 years ago • 10M views\" />\n\n    <org.schabi.newpipe.views.AnimatedProgressBar\n        android:id=\"@+id/itemProgressView\"\n        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"4dp\"\n        android:progressDrawable=\"?progress_horizontal_drawable\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemThumbnailView\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_stream_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"@dimen/video_item_search_thumbnail_image_width\"\n        android:layout_height=\"@dimen/video_item_search_thumbnail_image_height\"\n        android:scaleType=\"fitCenter\"\n        android:src=\"@drawable/placeholder_thumbnail_video\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemProgressView\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemDurationView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"@dimen/video_item_search_duration_margin\"\n        android:layout_marginBottom=\"@dimen/video_item_search_duration_margin\"\n        android:background=\"@color/duration_background_color\"\n        android:paddingHorizontal=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingVertical=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:textAllCaps=\"true\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        app:layout_constraintBottom_toBottomOf=\"@id/itemThumbnailView\"\n        app:layout_constraintRight_toRightOf=\"@id/itemThumbnailView\"\n        tools:text=\"1:09:10\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemVideoTitleView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"@dimen/video_item_search_image_right_margin\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemUploaderView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemUploaderView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemAdditionalDetails\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemVideoTitleView\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemVideoTitleView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemVideoTitleView\"\n        tools:text=\"Uploader\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_upload_date_text_size\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemVideoTitleView\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemVideoTitleView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemUploaderView\"\n        tools:text=\"2 years ago • 10M views\" />\n\n    <org.schabi.newpipe.views.AnimatedProgressBar\n        android:id=\"@+id/itemProgressView\"\n        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"4dp\"\n        android:progressDrawable=\"?progress_horizontal_drawable\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemThumbnailView\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_stream_mini_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"98dp\"\n        android:layout_height=\"55dp\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginRight=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"fitCenter\"\n        android:src=\"@drawable/placeholder_thumbnail_video\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemDurationView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignRight=\"@id/itemThumbnailView\"\n        android:layout_alignBottom=\"@id/itemThumbnailView\"\n        android:layout_marginRight=\"@dimen/video_item_search_duration_margin\"\n        android:layout_marginBottom=\"@dimen/video_item_search_duration_margin\"\n        android:background=\"@color/duration_background_color\"\n        android:paddingLeft=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingTop=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:paddingRight=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingBottom=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:textAllCaps=\"true\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"1:09:10\" />\n\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemVideoTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemUploaderView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/itemVideoTitleView\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        tools:text=\"Uploader\" />\n\n    <org.schabi.newpipe.views.AnimatedProgressBar\n        android:id=\"@+id/itemProgressView\"\n        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"4dp\"\n        android:layout_below=\"@id/itemThumbnailView\"\n        android:layout_alignStart=\"@id/itemThumbnailView\"\n        android:layout_alignEnd=\"@id/itemThumbnailView\"\n        android:layout_marginTop=\"-2dp\"\n        android:progressDrawable=\"?progress_horizontal_drawable\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_stream_playlist_card_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginTop=\"@dimen/margin_normal\"\n    android:layout_marginBottom=\"@dimen/margin_small\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:scaleType=\"centerCrop\"\n        android:src=\"@drawable/placeholder_thumbnail_video\"\n        app:layout_constraintDimensionRatio=\"16:9\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemDurationView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"@dimen/spacing_nano\"\n        android:layout_marginBottom=\"@dimen/spacing_nano\"\n        android:background=\"@color/duration_background_color\"\n        android:paddingLeft=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingTop=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:paddingRight=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingBottom=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        app:layout_constraintBottom_toBottomOf=\"@id/itemThumbnailView\"\n        app:layout_constraintEnd_toEndOf=\"@id/itemThumbnailView\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"1:09:10\" />\n\n    <ImageView\n        android:id=\"@+id/itemHandle\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"36dp\"\n        android:contentDescription=\"@string/detail_drag_description\"\n        android:paddingLeft=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"center\"\n        android:src=\"@drawable/ic_drag_handle\"\n        app:layout_constraintEnd_toEndOf=\"@id/itemThumbnailView\"\n        app:layout_constraintTop_toBottomOf=\"@id/itemThumbnailView\"\n        tools:ignore=\"RtlHardcoded,RtlSymmetry\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemVideoTitleView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/itemThumbnailView\"\n        android:layout_marginStart=\"@dimen/margin_small\"\n        android:layout_marginTop=\"@dimen/spacing_nano\"\n        android:layout_marginEnd=\"@dimen/spacing_micro\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:textAppearanceListItem\"\n        app:layout_constraintEnd_toStartOf=\"@id/itemHandle\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@id/itemThumbnailView\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique...\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/itemVideoTitleView\"\n        android:layout_marginTop=\"@dimen/spacing_nano\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        app:layout_constraintEnd_toEndOf=\"@id/itemVideoTitleView\"\n        app:layout_constraintStart_toStartOf=\"@id/itemVideoTitleView\"\n        app:layout_constraintTop_toBottomOf=\"@id/itemVideoTitleView\"\n        tools:text=\"Uploader\" />\n\n    <org.schabi.newpipe.views.AnimatedProgressBar\n        android:id=\"@+id/itemProgressView\"\n        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"4dp\"\n        android:progressDrawable=\"?progress_horizontal_drawable\"\n        app:layout_constraintBottom_toBottomOf=\"@id/itemThumbnailView\"\n        app:layout_constraintEnd_toEndOf=\"@id/itemThumbnailView\"\n        app:layout_constraintStart_toStartOf=\"@id/itemThumbnailView\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_stream_playlist_grid_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"@dimen/video_item_grid_thumbnail_image_width\"\n        android:layout_height=\"@dimen/video_item_grid_thumbnail_image_height\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_marginRight=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"fitCenter\"\n        android:src=\"@drawable/placeholder_thumbnail_video\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemDurationView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignRight=\"@id/itemThumbnailView\"\n        android:layout_alignBottom=\"@id/itemThumbnailView\"\n        android:layout_marginRight=\"@dimen/video_item_search_duration_margin\"\n        android:layout_marginBottom=\"@dimen/video_item_search_duration_margin\"\n        android:background=\"@color/duration_background_color\"\n        android:paddingLeft=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingTop=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:paddingRight=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingBottom=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"1:09:10\" />\n\n    <ImageView\n        android:id=\"@+id/itemHandle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"55dp\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_alignParentBottom=\"true\"\n        android:contentDescription=\"@string/detail_drag_description\"\n        android:paddingLeft=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"center\"\n        android:src=\"@drawable/ic_drag_handle\"\n        tools:ignore=\"RtlHardcoded,RtlSymmetry\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemVideoTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/itemThumbnailView\"\n        android:layout_alignStart=\"@id/itemThumbnailView\"\n        android:layout_alignLeft=\"@id/itemThumbnailView\"\n        android:layout_alignEnd=\"@id/itemThumbnailView\"\n        android:layout_alignRight=\"@id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique...\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/itemVideoTitleView\"\n        android:layout_alignStart=\"@id/itemThumbnailView\"\n        android:layout_alignLeft=\"@id/itemThumbnailView\"\n        android:layout_alignEnd=\"@id/itemThumbnailView\"\n        android:layout_alignRight=\"@id/itemThumbnailView\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        tools:text=\"Uploader\" />\n\n    <org.schabi.newpipe.views.AnimatedProgressBar\n        android:id=\"@+id/itemProgressView\"\n        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"4dp\"\n        android:layout_below=\"@id/itemThumbnailView\"\n        android:layout_alignStart=\"@id/itemThumbnailView\"\n        android:layout_alignEnd=\"@id/itemThumbnailView\"\n        android:layout_marginTop=\"-2dp\"\n        android:progressDrawable=\"?progress_horizontal_drawable\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/list_stream_playlist_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"98dp\"\n        android:layout_height=\"55dp\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginRight=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"fitCenter\"\n        android:src=\"@drawable/placeholder_thumbnail_video\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemDurationView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignRight=\"@id/itemThumbnailView\"\n        android:layout_alignBottom=\"@id/itemThumbnailView\"\n        android:layout_marginRight=\"@dimen/video_item_search_duration_margin\"\n        android:layout_marginBottom=\"@dimen/video_item_search_duration_margin\"\n        android:background=\"@color/duration_background_color\"\n        android:paddingLeft=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingTop=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:paddingRight=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingBottom=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"1:09:10\" />\n\n    <ImageView\n        android:id=\"@+id/itemHandle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"55dp\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_gravity=\"center_vertical\"\n        android:contentDescription=\"@string/detail_drag_description\"\n        android:paddingLeft=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"center\"\n        android:src=\"@drawable/ic_drag_handle\"\n        tools:ignore=\"RtlHardcoded,RtlSymmetry\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemVideoTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toStartOf=\"@id/itemHandle\"\n        android:layout_toLeftOf=\"@id/itemHandle\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique...\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/itemVideoTitleView\"\n        android:layout_toStartOf=\"@id/itemHandle\"\n        android:layout_toLeftOf=\"@id/itemHandle\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        tools:text=\"Uploader\" />\n\n    <org.schabi.newpipe.views.AnimatedProgressBar\n        android:id=\"@+id/itemProgressView\"\n        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"4dp\"\n        android:layout_below=\"@id/itemThumbnailView\"\n        android:layout_alignStart=\"@id/itemThumbnailView\"\n        android:layout_alignEnd=\"@id/itemThumbnailView\"\n        android:layout_marginTop=\"-2dp\"\n        android:progressDrawable=\"?progress_horizontal_drawable\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/local_playlist_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/contrast_background_color\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/playlist_title_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:clickable=\"true\"\n        android:ellipsize=\"end\"\n        android:focusable=\"true\"\n        android:maxLines=\"2\"\n        android:paddingHorizontal=\"@dimen/video_item_search_padding\"\n        android:paddingTop=\"@dimen/video_item_search_padding\"\n        android:paddingBottom=\"6dp\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/playlist_detail_title_text_size\"\n        tools:text=\"Mix musics #23 title Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/playlist_stream_count\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/playlist_title_view\"\n        android:layout_alignParentLeft=\"true\"\n        android:ellipsize=\"end\"\n        android:gravity=\"right|center_vertical\"\n        android:maxLines=\"1\"\n        android:paddingHorizontal=\"@dimen/video_item_search_padding\"\n        android:textSize=\"@dimen/playlist_detail_subtext_size\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"234 videos\" />\n\n    <include\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:id=\"@+id/playlist_control\"\n        layout=\"@layout/playlist_control\"\n        android:layout_below=\"@id/playlist_stream_count\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/main_bg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingStart=\"@dimen/activity_horizontal_margin\"\n    android:paddingEnd=\"@dimen/activity_horizontal_margin\"\n    tools:context=\".fragments.detail.VideoDetailFragment\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:layout_marginTop=\"30dp\"\n        android:layout_marginBottom=\"20dp\"\n        android:fontFamily=\"sans-serif-condensed\"\n        android:text=\"@string/app_name\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"40sp\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:gravity=\"center\"\n        android:text=\"@string/main_bg_subtitle\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/mission_item.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <RelativeLayout\n        android:id=\"@+id/item_bkg\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"2dp\"\n        android:background=\"@color/bluegray\">\n\n        <RelativeLayout\n            android:id=\"@+id/item_title_line\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentTop=\"true\"\n            android:layout_marginTop=\"2dp\">\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/item_status\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentLeft=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginLeft=\"6dp\"\n                android:singleLine=\"true\"\n                android:text=\"0%\"\n                android:textColor=\"@color/white\"\n                android:textSize=\"20sp\" />\n\n            <ImageView\n                android:id=\"@+id/item_more\"\n                style=\"?attr/buttonBarButtonStyle\"\n                android:layout_width=\"49dp\"\n                android:layout_height=\"49dp\"\n                android:layout_alignParentRight=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginRight=\"1dp\"\n                android:contentDescription=\"TODO\"\n                android:scaleType=\"center\"\n                android:src=\"@drawable/ic_more_vert\"\n                app:tint=\"?attr/actionColor\" />\n\n        </RelativeLayout>\n\n        <ImageView\n            android:id=\"@+id/item_icon\"\n            android:layout_width=\"72dp\"\n            android:layout_height=\"72dp\"\n            android:layout_below=\"@id/item_title_line\"\n            android:layout_centerHorizontal=\"true\"\n            android:contentDescription=\"TODO\"\n            android:gravity=\"center\"\n            android:padding=\"10dp\"\n            android:scaleType=\"fitXY\"\n            app:tint=\"?attr/actionColor\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/item_name\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/item_icon\"\n            android:ellipsize=\"marquee\"\n            android:marqueeRepeatLimit=\"marquee_forever\"\n            android:padding=\"6dp\"\n            android:scrollHorizontally=\"true\"\n            android:singleLine=\"true\"\n            android:text=\"XXX.xx\"\n            android:textColor=\"@color/white\"\n            android:textSize=\"16sp\"\n            android:textStyle=\"bold\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/item_size\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/item_name\"\n            android:padding=\"6dp\"\n            android:singleLine=\"true\"\n            android:text=\"100.00MB\"\n            android:textColor=\"@color/white\"\n            android:textSize=\"12sp\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/item_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/item_name\"\n            android:layout_alignParentRight=\"true\"\n            android:padding=\"6dp\"\n            android:singleLine=\"true\"\n            android:text=\"\"\n            android:textColor=\"@color/white\"\n            android:textSize=\"12sp\" />\n\n    </RelativeLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/mission_item_linear.xml",
    "content": "<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <RelativeLayout\n        android:id=\"@+id/item_bkg\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"2dp\"\n        android:background=\"@color/bluegray\">\n\n        <ImageView\n            android:id=\"@+id/item_icon\"\n            android:layout_width=\"72dp\"\n            android:layout_height=\"72dp\"\n            android:layout_centerVertical=\"true\"\n            android:contentDescription=\"TODO\"\n            android:gravity=\"center\"\n            android:padding=\"15dp\"\n            android:scaleType=\"fitXY\"\n            app:tint=\"?attr/actionColor\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/item_name\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_toLeftOf=\"@+id/item_more\"\n            android:layout_toRightOf=\"@id/item_icon\"\n            android:ellipsize=\"end\"\n            android:padding=\"6dp\"\n            android:text=\"XXX.xx\"\n            android:textColor=\"@color/white\"\n            android:textSize=\"16sp\"\n            android:textStyle=\"bold\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/item_size\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/item_name\"\n            android:layout_toRightOf=\"@id/item_icon\"\n            android:padding=\"6dp\"\n            android:singleLine=\"true\"\n            android:text=\"100.00MB\"\n            android:textColor=\"@color/white\"\n            android:textSize=\"12sp\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/item_status\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/item_name\"\n            android:layout_marginLeft=\"6dp\"\n            android:layout_marginRight=\"5dp\"\n            android:layout_toLeftOf=\"@+id/item_more\"\n            android:layout_toRightOf=\"@id/item_size\"\n            android:padding=\"6dp\"\n            android:singleLine=\"true\"\n            android:text=\"0%\"\n            android:textColor=\"@color/white\"\n            android:textSize=\"12sp\"\n            android:textStyle=\"bold\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/item_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/item_name\"\n            android:layout_toLeftOf=\"@id/item_more\"\n            android:padding=\"6dp\"\n            android:singleLine=\"true\"\n            android:text=\"\"\n            android:textColor=\"@color/white\"\n            android:textSize=\"12sp\" />\n\n        <ImageView\n            android:id=\"@+id/item_more\"\n            style=\"?attr/buttonBarButtonStyle\"\n            android:layout_width=\"49dp\"\n            android:layout_height=\"49dp\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"4dp\"\n            android:contentDescription=\"TODO\"\n            android:scaleType=\"centerInside\"\n            android:src=\"@drawable/ic_more_vert\"\n            app:tint=\"?attr/actionColor\" />\n\n    </RelativeLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/missions.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <include\n        android:id=\"@+id/list_empty_view\"\n        layout=\"@layout/list_empty_view\"\n        android:visibility=\"gone\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/mission_recycler\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/missions_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"30dp\"\n    android:layout_marginStart=\"8dp\"\n    android:layout_marginLeft=\"8dp\"\n    android:layout_marginTop=\"16dp\"\n    android:layout_marginEnd=\"8dp\"\n    android:layout_marginRight=\"8dp\"\n    android:orientation=\"vertical\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/item_name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_vertical\"\n        android:text=\"relative header\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"16sp\"\n        android:textStyle=\"bold\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/picker_icon_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ImageView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/icon_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:focusable=\"true\"\n    android:minWidth=\"24dp\"\n    android:minHeight=\"24dp\"\n    android:padding=\"8dp\"\n    android:scaleType=\"centerInside\"\n    tools:ignore=\"ContentDescription\"\n    tools:src=\"@drawable/ic_rss_feed\" />\n"
  },
  {
    "path": "app/src/main/res/layout/picker_subscription_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"2dp\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center\"\n        android:minWidth=\"72dp\"\n        android:orientation=\"vertical\"\n        android:padding=\"4dp\">\n\n        <com.google.android.material.imageview.ShapeableImageView\n            android:id=\"@+id/thumbnail_view\"\n            android:layout_width=\"48dp\"\n            android:layout_height=\"48dp\"\n            app:shapeAppearance=\"@style/CircularImageView\"\n            tools:src=\"@drawable/placeholder_person\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/title_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:ellipsize=\"end\"\n            android:gravity=\"center\"\n            android:lines=\"1\"\n            android:maxLines=\"1\"\n            android:textAppearance=\"?android:attr/textAppearanceLarge\"\n            android:textSize=\"10sp\"\n            tools:ignore=\"SmallSp\"\n            tools:text=\"Channel Title, Lorem ipsum\" />\n    </LinearLayout>\n\n    <FrameLayout\n        android:id=\"@+id/selected_highlight\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"?attr/colorControlHighlight\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\">\n\n        <ImageView\n            android:layout_width=\"48dp\"\n            android:layout_height=\"48dp\"\n            android:layout_gravity=\"top|center_horizontal\"\n            android:layout_marginTop=\"4dp\"\n            android:scaleType=\"centerInside\"\n            android:src=\"@drawable/ic_done\"\n            app:tint=\"@color/white\"\n            tools:ignore=\"ContentDescription\" />\n    </FrameLayout>\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/pignate_footer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_horizontal\"\n    android:orientation=\"vertical\">\n\n    <ProgressBar\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"top|center_horizontal\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginBottom=\"8dp\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/play_queue_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selector\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:foreground=\"?attr/selectableItemBackground\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"@dimen/play_queue_thumbnail_width\"\n        android:layout_height=\"@dimen/play_queue_thumbnail_height\"\n        android:layout_marginStart=\"@dimen/video_item_search_image_right_margin\"\n        android:layout_marginTop=\"@dimen/video_item_search_image_right_margin\"\n        android:layout_marginBottom=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"fitCenter\"\n        android:src=\"@drawable/placeholder_thumbnail_video\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemDurationView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignEnd=\"@id/itemThumbnailView\"\n        android:layout_alignBottom=\"@id/itemThumbnailView\"\n        android:layout_marginEnd=\"@dimen/video_item_search_duration_margin\"\n        android:layout_marginBottom=\"@dimen/video_item_search_duration_margin\"\n        android:background=\"@color/duration_background_color\"\n        android:paddingStart=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingTop=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:paddingEnd=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingBottom=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        android:contentDescription=\"@string/duration\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemThumbnailView\"\n        tools:text=\"1:09:10\" />\n\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemVideoTitleView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_toStartOf=\"@id/itemHandle\"\n        android:layout_toEndOf=\"@id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:singleLine=\"true\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemAdditionalDetails\"\n        app:layout_constraintEnd_toStartOf=\"@+id/itemHandle\"\n        app:layout_constraintStart_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_chainStyle=\"packed\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipisci elit. \" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_toStartOf=\"@id/itemHandle\"\n        android:layout_toEndOf=\"@id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:singleLine=\"true\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_upload_date_text_size\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@+id/itemHandle\"\n        app:layout_constraintStart_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemVideoTitleView\"\n        tools:text=\"Uploader uploader uploader uploader uploader · Youtube\" />\n\n    <androidx.appcompat.widget.AppCompatImageView\n        android:id=\"@+id/itemHandle\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"0dp\"\n        android:layout_alignParentRight=\"true\"\n        android:layout_gravity=\"center_vertical\"\n        android:paddingHorizontal=\"@dimen/video_item_search_image_right_margin\"\n        android:scaleType=\"center\"\n        android:src=\"@drawable/ic_drag_handle\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:ignore=\"ContentDescription,RtlHardcoded\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/player.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/black\"\n    android:gravity=\"center\"\n    android:theme=\"@style/WhiteTintTheme\">\n\n    <org.schabi.newpipe.views.ExpandableSurfaceView\n        android:id=\"@+id/surfaceView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_centerInParent=\"true\" />\n\n    <View\n        android:id=\"@+id/surfaceForeground\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignBottom=\"@+id/surfaceView\"\n        android:background=\"@android:color/black\" />\n\n    <com.google.android.exoplayer2.ui.SubtitleView\n        android:id=\"@+id/subtitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_centerInParent=\"true\"\n        android:layout_gravity=\"center\" />\n\n    <View\n        android:id=\"@+id/playerTopShadow\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"30dp\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"@drawable/player_controls_top_background\"\n        android:visibility=\"gone\" />\n\n    <View\n        android:id=\"@+id/playerBottomShadow\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"30dp\"\n        android:layout_alignParentBottom=\"true\"\n        android:background=\"@drawable/player_controls_background\"\n        android:visibility=\"gone\" />\n\n    <ImageView\n        android:id=\"@+id/endScreen\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center\"\n        android:visibility=\"gone\"\n        tools:background=\"@android:color/white\"\n        tools:ignore=\"ContentDescription\"\n        tools:visibility=\"visible\" />\n\n    <View\n        android:id=\"@+id/playbackControlsShadow\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignBottom=\"@+id/playbackControlRoot\"\n        android:background=\"@color/video_overlay_color\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\" />\n\n    <!-- transparent background is needed for selectableItemBackgroundBorderless to work -->\n    <RelativeLayout\n        android:id=\"@+id/playbackControlRoot\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@color/transparent_background_color\"\n        android:fitsSystemWindows=\"true\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\">\n\n        <!-- All top controls in this layout -->\n        <RelativeLayout\n            android:id=\"@+id/playbackWindowRoot\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <LinearLayout\n                android:id=\"@+id/topControls\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentTop=\"true\"\n                android:baselineAligned=\"false\"\n                android:descendantFocusability=\"afterDescendants\"\n                android:gravity=\"top\"\n                android:orientation=\"vertical\"\n                android:paddingStart=\"@dimen/player_main_controls_padding\"\n                android:paddingTop=\"@dimen/player_main_top_padding\"\n                android:paddingEnd=\"@dimen/player_main_controls_padding\">\n\n                <LinearLayout\n                    android:id=\"@+id/primaryControls\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:baselineAligned=\"false\"\n                    android:descendantFocusability=\"afterDescendants\"\n                    android:gravity=\"top\"\n                    android:minHeight=\"45dp\"\n                    tools:ignore=\"RtlHardcoded\">\n\n                    <androidx.appcompat.widget.AppCompatImageButton\n                        android:id=\"@+id/playerCloseButton\"\n                        android:layout_width=\"36dp\"\n                        android:layout_height=\"36dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:clickable=\"true\"\n                        android:contentDescription=\"@string/close\"\n                        android:focusable=\"true\"\n                        android:padding=\"@dimen/player_main_buttons_padding\"\n                        android:scaleType=\"fitXY\"\n                        android:src=\"@drawable/ic_close\"\n                        android:visibility=\"gone\"\n                        app:tint=\"@color/white\"\n                        tools:ignore=\"RtlHardcoded\" />\n\n                    <LinearLayout\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"match_parent\"\n                        android:layout_weight=\"1\"\n                        android:orientation=\"horizontal\">\n\n                        <LinearLayout\n                            android:id=\"@+id/metadataView\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginTop=\"6dp\"\n                            android:layout_marginEnd=\"8dp\"\n                            android:layout_weight=\"1\"\n                            android:gravity=\"top\"\n                            android:orientation=\"vertical\"\n                            tools:ignore=\"NestedWeights,RtlHardcoded\">\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/titleTextView\"\n                                android:layout_width=\"match_parent\"\n                                android:layout_height=\"wrap_content\"\n                                android:ellipsize=\"marquee\"\n                                android:fadingEdge=\"horizontal\"\n                                android:marqueeRepeatLimit=\"marquee_forever\"\n                                android:scrollHorizontally=\"true\"\n                                android:singleLine=\"true\"\n                                android:textColor=\"@android:color/white\"\n                                android:textSize=\"15sp\"\n                                android:textStyle=\"bold\"\n                                tools:ignore=\"RtlHardcoded\"\n                                tools:text=\"The Video Title LONG very LONG\" />\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/channelTextView\"\n                                android:layout_width=\"match_parent\"\n                                android:layout_height=\"wrap_content\"\n                                android:ellipsize=\"marquee\"\n                                android:fadingEdge=\"horizontal\"\n                                android:marqueeRepeatLimit=\"marquee_forever\"\n                                android:scrollHorizontally=\"true\"\n                                android:singleLine=\"true\"\n                                android:textColor=\"@android:color/white\"\n                                android:textSize=\"12sp\"\n                                tools:text=\"The Video Artist  LONG very LONG very Long\" />\n\n                        </LinearLayout>\n\n                        <FrameLayout\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_weight=\"1\">\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/audioTrackTextView\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"35dp\"\n                                android:layout_gravity=\"right\"\n                                android:layout_marginEnd=\"8dp\"\n                                android:background=\"?attr/selectableItemBackground\"\n                                android:ellipsize=\"end\"\n                                android:gravity=\"center\"\n                                android:minWidth=\"0dp\"\n                                android:padding=\"@dimen/player_main_buttons_padding\"\n                                android:singleLine=\"true\"\n                                android:textColor=\"@android:color/white\"\n                                android:textStyle=\"bold\"\n                                android:visibility=\"gone\"\n                                tools:ignore=\"HardcodedText,RtlHardcoded\"\n                                tools:text=\"English (United States) original\"\n                                tools:visibility=\"visible\" />\n                        </FrameLayout>\n\n                    </LinearLayout>\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/qualityTextView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"35dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:background=\"?attr/selectableItemBackground\"\n                        android:gravity=\"center\"\n                        android:minWidth=\"0dp\"\n                        android:padding=\"@dimen/player_main_buttons_padding\"\n                        android:textColor=\"@android:color/white\"\n                        android:textStyle=\"bold\"\n                        tools:ignore=\"HardcodedText,RtlHardcoded\"\n                        tools:text=\"720p\" />\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/playbackSpeed\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"35dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:gravity=\"center\"\n                        android:minWidth=\"0dp\"\n                        android:padding=\"@dimen/player_main_buttons_padding\"\n                        android:textColor=\"@android:color/white\"\n                        android:textStyle=\"bold\"\n                        tools:ignore=\"RtlHardcoded,RtlSymmetry\"\n                        tools:text=\"1x\" />\n\n                    <androidx.appcompat.widget.AppCompatImageButton\n                        android:id=\"@+id/queueButton\"\n                        android:layout_width=\"35dp\"\n                        android:layout_height=\"35dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:clickable=\"true\"\n                        android:contentDescription=\"@string/open_play_queue\"\n                        android:focusable=\"true\"\n                        android:paddingStart=\"3dp\"\n                        android:paddingTop=\"5dp\"\n                        android:paddingEnd=\"3dp\"\n                        android:paddingBottom=\"3dp\"\n                        android:scaleType=\"fitCenter\"\n                        android:src=\"@drawable/ic_list\"\n                        android:visibility=\"gone\"\n                        app:tint=\"@color/white\"\n                        tools:ignore=\"RtlHardcoded\" />\n\n                    <androidx.appcompat.widget.AppCompatImageButton\n                        android:id=\"@+id/segmentsButton\"\n                        android:layout_width=\"35dp\"\n                        android:layout_height=\"35dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:clickable=\"true\"\n                        android:contentDescription=\"@string/chapters\"\n                        android:focusable=\"true\"\n                        android:paddingStart=\"6dp\"\n                        android:paddingTop=\"3dp\"\n                        android:paddingEnd=\"6dp\"\n                        android:paddingBottom=\"3dp\"\n                        android:scaleType=\"fitCenter\"\n                        android:src=\"@drawable/ic_menu_book\"\n                        android:visibility=\"gone\"\n                        app:tint=\"@color/white\"\n                        tools:ignore=\"RtlHardcoded\" />\n\n                    <androidx.appcompat.widget.AppCompatImageButton\n                        android:id=\"@+id/moreOptionsButton\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:clickable=\"true\"\n                        android:contentDescription=\"@string/more_options\"\n                        android:focusable=\"true\"\n                        android:padding=\"@dimen/player_main_buttons_padding\"\n                        android:scaleType=\"fitXY\"\n                        android:src=\"@drawable/ic_expand_more\"\n                        app:tint=\"@color/white\"\n                        tools:ignore=\"RtlHardcoded\" />\n\n                </LinearLayout>\n\n                <LinearLayout\n                    android:id=\"@+id/secondaryControls\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"top\"\n                    android:visibility=\"invisible\"\n                    tools:ignore=\"RtlHardcoded\"\n                    tools:visibility=\"visible\">\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/resizeTextView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"35dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:background=\"?attr/selectableItemBackground\"\n                        android:gravity=\"center\"\n                        android:minWidth=\"50dp\"\n                        android:padding=\"@dimen/player_main_buttons_padding\"\n                        android:textColor=\"@android:color/white\"\n                        android:textStyle=\"bold\"\n                        tools:ignore=\"HardcodedText,RtlHardcoded\"\n                        tools:text=\"FIT\" />\n\n                    <FrameLayout\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"3\">\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/captionTextView\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginEnd=\"8dp\"\n                            android:background=\"?attr/selectableItemBackground\"\n                            android:ellipsize=\"end\"\n                            android:gravity=\"center|left\"\n                            android:lines=\"1\"\n                            android:minWidth=\"50dp\"\n                            android:minHeight=\"35dp\"\n                            android:padding=\"@dimen/player_main_buttons_padding\"\n                            android:textColor=\"@android:color/white\"\n                            android:textStyle=\"bold\"\n                            tools:ignore=\"RelativeOverlap,RtlHardcoded\"\n                            tools:text=\"English\" />\n\n                    </FrameLayout>\n\n                    <androidx.appcompat.widget.AppCompatImageButton\n                        android:id=\"@+id/playWithKodi\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"35dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:clickable=\"true\"\n                        android:contentDescription=\"@string/play_with_kodi_title\"\n                        android:focusable=\"true\"\n                        android:padding=\"@dimen/player_main_buttons_padding\"\n                        android:scaleType=\"fitXY\"\n                        android:src=\"@drawable/ic_cast\"\n                        app:tint=\"@color/white\"\n                        tools:ignore=\"RtlHardcoded\" />\n\n                    <androidx.appcompat.widget.AppCompatImageButton\n                        android:id=\"@+id/openInBrowser\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"35dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:clickable=\"true\"\n                        android:contentDescription=\"@string/open_in_browser\"\n                        android:focusable=\"true\"\n                        android:padding=\"@dimen/player_main_buttons_padding\"\n                        android:scaleType=\"fitXY\"\n                        android:src=\"@drawable/ic_language\"\n                        app:tint=\"@color/white\"\n                        tools:ignore=\"RtlHardcoded\" />\n\n                    <androidx.appcompat.widget.AppCompatImageButton\n                        android:id=\"@+id/share\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"35dp\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:clickable=\"true\"\n                        android:contentDescription=\"@string/share\"\n                        android:focusable=\"true\"\n                        android:padding=\"@dimen/player_main_buttons_padding\"\n                        android:scaleType=\"fitXY\"\n                        android:src=\"@drawable/ic_share\"\n                        app:tint=\"@color/white\"\n                        tools:ignore=\"RtlHardcoded\" />\n\n                    <androidx.appcompat.widget.AppCompatImageButton\n                        android:id=\"@+id/switchMute\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"37dp\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:clickable=\"true\"\n                        android:contentDescription=\"@string/mute\"\n                        android:focusable=\"true\"\n                        android:padding=\"@dimen/player_main_buttons_padding\"\n                        android:scaleType=\"fitXY\"\n                        android:src=\"@drawable/ic_volume_off\"\n                        app:tint=\"@color/white\"\n                        tools:ignore=\"RtlHardcoded\" />\n\n                    <androidx.appcompat.widget.AppCompatImageButton\n                        android:id=\"@+id/fullScreenButton\"\n                        android:layout_width=\"40dp\"\n                        android:layout_height=\"40dp\"\n                        android:background=\"?attr/selectableItemBackgroundBorderless\"\n                        android:clickable=\"true\"\n                        android:contentDescription=\"@string/toggle_fullscreen\"\n                        android:focusable=\"true\"\n                        android:padding=\"@dimen/player_main_buttons_padding\"\n                        android:scaleType=\"fitCenter\"\n                        android:src=\"@drawable/ic_fullscreen\"\n                        android:visibility=\"gone\"\n                        app:tint=\"@color/white\"\n                        tools:ignore=\"RtlHardcoded\"\n                        tools:visibility=\"visible\" />\n\n                </LinearLayout>\n\n            </LinearLayout>\n\n            <LinearLayout\n                android:id=\"@+id/bottomSeekbarPreviewLayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_above=\"@id/bottomControls\"\n                android:orientation=\"horizontal\">\n\n                <LinearLayout\n                    android:id=\"@+id/seekbarPreviewContainer\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center\"\n                    android:orientation=\"vertical\"\n                    android:paddingBottom=\"12dp\">\n\n                    <org.schabi.newpipe.views.NewPipeTextView\n                        android:id=\"@+id/currentDisplaySeek\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:background=\"#60000000\"\n                        android:paddingLeft=\"5dp\"\n                        android:paddingRight=\"5dp\"\n                        android:paddingBottom=\"2dp\"\n                        android:textColor=\"@android:color/white\"\n                        android:textSize=\"18sp\"\n                        android:textStyle=\"bold\"\n                        android:visibility=\"gone\"\n                        tools:ignore=\"RtlHardcoded\"\n                        tools:text=\"1:06:29\"\n                        tools:visibility=\"visible\" />\n\n                    <ImageView\n                        android:id=\"@+id/currentSeekbarPreviewThumbnail\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:paddingTop=\"2dp\"\n                        android:src=\"@drawable/placeholder_thumbnail_video\"\n                        android:visibility=\"gone\"\n                        tools:visibility=\"visible\" />\n\n                </LinearLayout>\n\n            </LinearLayout>\n\n            <LinearLayout\n                android:id=\"@+id/bottomControls\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentBottom=\"true\"\n                android:gravity=\"center\"\n                android:minHeight=\"40dp\"\n                android:orientation=\"horizontal\"\n                android:paddingLeft=\"@dimen/player_main_controls_padding\"\n                android:paddingRight=\"@dimen/player_main_controls_padding\">\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/playbackCurrentTime\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"match_parent\"\n                    android:gravity=\"center\"\n                    android:minHeight=\"30dp\"\n                    android:text=\"-:--:--\"\n                    android:textColor=\"@android:color/white\"\n                    tools:ignore=\"HardcodedText\"\n                    tools:text=\"1:06:29\" />\n\n\n                <org.schabi.newpipe.views.FocusAwareSeekBar\n                    android:id=\"@+id/playbackSeekBar\"\n                    style=\"@style/Widget.AppCompat.SeekBar\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_gravity=\"center\"\n                    android:layout_marginTop=\"2dp\"\n                    android:layout_weight=\"1\"\n                    android:nextFocusDown=\"@id/screenRotationButton\"\n                    tools:progress=\"25\"\n                    tools:secondaryProgress=\"50\" />\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/playbackEndTime\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"match_parent\"\n                    android:gravity=\"center\"\n                    android:text=\"-:--:--\"\n                    android:textColor=\"@android:color/white\"\n                    tools:ignore=\"HardcodedText\"\n                    tools:text=\"1:23:49\" />\n\n                <org.schabi.newpipe.views.NewPipeTextView\n                    android:id=\"@+id/playbackLiveSync\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"match_parent\"\n                    android:background=\"?attr/selectableItemBackgroundBorderless\"\n                    android:gravity=\"center\"\n                    android:paddingLeft=\"4dp\"\n                    android:paddingRight=\"4dp\"\n                    android:text=\"@string/duration_live\"\n                    android:textAllCaps=\"true\"\n                    android:textColor=\"@android:color/white\"\n                    android:visibility=\"gone\"\n                    tools:ignore=\"HardcodedText,RtlHardcoded,RtlSymmetry\" />\n\n                <androidx.appcompat.widget.AppCompatImageButton\n                    android:id=\"@+id/screenRotationButton\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_marginStart=\"4dp\"\n                    android:background=\"?attr/selectableItemBackgroundBorderless\"\n                    android:clickable=\"true\"\n                    android:contentDescription=\"@string/toggle_screen_orientation\"\n                    android:focusable=\"true\"\n                    android:nextFocusUp=\"@id/playbackSeekBar\"\n                    android:padding=\"@dimen/player_main_buttons_padding\"\n                    android:scaleType=\"fitCenter\"\n                    android:src=\"@drawable/ic_fullscreen\"\n                    android:visibility=\"gone\"\n                    app:tint=\"@color/white\"\n                    tools:ignore=\"RtlHardcoded\"\n                    tools:visibility=\"visible\" />\n            </LinearLayout>\n        </RelativeLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:gravity=\"center\"\n            android:orientation=\"horizontal\"\n            android:weightSum=\"5.5\">\n\n            <androidx.appcompat.widget.AppCompatImageButton\n                android:id=\"@+id/playPreviousButton\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"40dp\"\n                android:layout_marginEnd=\"10dp\"\n                android:layout_weight=\"1\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:contentDescription=\"@string/previous_stream\"\n                android:focusable=\"true\"\n                android:scaleType=\"fitCenter\"\n                android:src=\"@drawable/ic_previous\"\n                app:tint=\"@color/white\" />\n\n\n            <androidx.appcompat.widget.AppCompatImageButton\n                android:id=\"@+id/playPauseButton\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"60dp\"\n                android:layout_weight=\"1\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:contentDescription=\"@string/pause\"\n                android:scaleType=\"fitCenter\"\n                android:src=\"@drawable/ic_pause\"\n                app:tint=\"@color/white\" />\n\n            <androidx.appcompat.widget.AppCompatImageButton\n                android:id=\"@+id/playNextButton\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"40dp\"\n                android:layout_marginStart=\"10dp\"\n                android:layout_weight=\"1\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:contentDescription=\"@string/next_stream\"\n                android:focusable=\"true\"\n                android:scaleType=\"fitCenter\"\n                android:src=\"@drawable/ic_next\"\n                app:tint=\"@color/white\" />\n\n        </LinearLayout>\n\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/itemsListPanel\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@color/queue_background_color\"\n        android:visibility=\"gone\"\n        tools:visibility=\"visible\">\n\n        <RelativeLayout\n            android:id=\"@+id/itemsListControl\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"60dp\">\n\n            <androidx.appcompat.widget.AppCompatTextView\n                android:id=\"@+id/itemsListHeaderTitle\"\n                style=\"@style/TextAppearance.AppCompat.Medium\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignEnd=\"@id/itemsListClose\"\n                android:layout_alignParentStart=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginStart=\"16dp\"\n                android:layout_marginEnd=\"56dp\"\n                android:ellipsize=\"end\"\n                android:maxLines=\"2\"\n                android:text=\"@string/chapters\"\n                android:textColor=\"@android:color/white\"\n                android:visibility=\"gone\" />\n\n            <androidx.appcompat.widget.AppCompatImageButton\n                android:id=\"@+id/repeatButton\"\n                android:layout_width=\"50dp\"\n                android:layout_height=\"50dp\"\n                android:layout_alignParentStart=\"true\"\n                android:layout_alignParentLeft=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginStart=\"40dp\"\n                android:layout_marginLeft=\"40dp\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:contentDescription=\"@string/notification_action_repeat\"\n                android:focusable=\"true\"\n                android:padding=\"10dp\"\n                android:scaleType=\"fitXY\"\n                android:src=\"@drawable/exo_controls_repeat_off\"\n                android:tint=\"?attr/colorAccent\"\n                tools:ignore=\"RtlHardcoded\" />\n\n            <androidx.appcompat.widget.AppCompatImageButton\n                android:id=\"@+id/shuffleButton\"\n                android:layout_width=\"50dp\"\n                android:layout_height=\"50dp\"\n                android:layout_centerVertical=\"true\"\n                android:layout_toRightOf=\"@id/repeatButton\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:contentDescription=\"@string/notification_action_shuffle\"\n                android:focusable=\"true\"\n                android:padding=\"10dp\"\n                android:scaleType=\"fitXY\"\n                android:src=\"@drawable/ic_shuffle\"\n                android:tint=\"?attr/colorAccent\"\n                tools:ignore=\"RtlHardcoded\" />\n\n            <androidx.appcompat.widget.AppCompatTextView\n                android:id=\"@+id/itemsListHeaderDuration\"\n                style=\"@style/TextAppearance.AppCompat.Medium\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerVertical=\"true\"\n                android:layout_toStartOf=\"@id/addToPlaylistButton\"\n                android:layout_toEndOf=\"@id/shuffleButton\"\n                android:gravity=\"center\"\n                android:textColor=\"@android:color/white\" />\n\n            <androidx.appcompat.widget.AppCompatImageButton\n                android:id=\"@+id/addToPlaylistButton\"\n                android:layout_width=\"50dp\"\n                android:layout_height=\"50dp\"\n                android:layout_centerVertical=\"true\"\n                android:layout_toLeftOf=\"@+id/itemsListClose\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:contentDescription=\"@string/add_to_playlist\"\n                android:focusable=\"true\"\n                android:padding=\"10dp\"\n                android:scaleType=\"fitXY\"\n                android:src=\"@drawable/ic_playlist_add\"\n                android:tint=\"?attr/colorAccent\"\n                tools:ignore=\"RtlHardcoded\" />\n\n            <androidx.appcompat.widget.AppCompatImageButton\n                android:id=\"@+id/itemsListClose\"\n                android:layout_width=\"50dp\"\n                android:layout_height=\"50dp\"\n                android:layout_alignParentEnd=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginEnd=\"40dp\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:contentDescription=\"@string/close\"\n                android:focusable=\"true\"\n                android:padding=\"10dp\"\n                android:scaleType=\"fitXY\"\n                android:src=\"@drawable/ic_close\"\n                app:tint=\"@color/white\" />\n\n        </RelativeLayout>\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/itemsList\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_below=\"@id/itemsListControl\"\n            android:scrollbars=\"vertical\"\n            android:theme=\"@style/PlayQueueItemTextTheme\"\n            app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\"\n            tools:listitem=\"@layout/play_queue_item\" />\n\n    </RelativeLayout>\n\n    <RelativeLayout\n        android:id=\"@+id/player_overlays\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <RelativeLayout\n            android:id=\"@+id/loading_panel\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"@android:color/black\"\n            tools:visibility=\"gone\">\n\n            <ProgressBar\n                android:id=\"@+id/progressBarLoadingPanel\"\n                style=\"?android:attr/progressBarStyleLargeInverse\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerInParent=\"true\"\n                android:indeterminate=\"true\" />\n        </RelativeLayout>\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center\"\n            tools:ignore=\"RtlHardcoded\">\n\n            <RelativeLayout\n                android:id=\"@+id/volumeRelativeLayout\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerInParent=\"true\"\n                android:background=\"@drawable/background_oval_black_transparent\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\">\n\n                <ProgressBar\n                    android:id=\"@+id/volumeProgressBar\"\n                    style=\"?android:progressBarStyleHorizontal\"\n                    android:layout_width=\"128dp\"\n                    android:layout_height=\"128dp\"\n                    android:indeterminate=\"false\"\n                    android:progressDrawable=\"@drawable/progress_circular_white\" />\n\n                <androidx.appcompat.widget.AppCompatImageView\n                    android:id=\"@+id/volumeImageView\"\n                    android:layout_width=\"70dp\"\n                    android:layout_height=\"70dp\"\n                    android:layout_centerInParent=\"true\"\n                    app:tint=\"@color/white\"\n                    tools:ignore=\"ContentDescription\"\n                    tools:src=\"@drawable/ic_volume_up\" />\n            </RelativeLayout>\n\n            <RelativeLayout\n                android:id=\"@+id/brightnessRelativeLayout\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerInParent=\"true\"\n                android:background=\"@drawable/background_oval_black_transparent\"\n                android:visibility=\"gone\"\n                tools:visibility=\"visible\">\n\n                <ProgressBar\n                    android:id=\"@+id/brightnessProgressBar\"\n                    style=\"?android:progressBarStyleHorizontal\"\n                    android:layout_width=\"128dp\"\n                    android:layout_height=\"128dp\"\n                    android:indeterminate=\"false\"\n                    android:progressDrawable=\"@drawable/progress_circular_white\" />\n\n                <androidx.appcompat.widget.AppCompatImageView\n                    android:id=\"@+id/brightnessImageView\"\n                    android:layout_width=\"70dp\"\n                    android:layout_height=\"70dp\"\n                    android:layout_centerInParent=\"true\"\n                    app:tint=\"@color/white\"\n                    tools:ignore=\"ContentDescription\"\n                    tools:src=\"@drawable/ic_brightness_high\" />\n            </RelativeLayout>\n\n        </RelativeLayout>\n\n    </RelativeLayout>\n\n    <View\n        android:id=\"@+id/closingOverlay\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"#AAFF0000\"\n        android:visibility=\"gone\" />\n\n    <Button\n        android:id=\"@+id/closeButton\"\n        style=\"@style/Widget.AppCompat.Button.Borderless\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:layout_marginTop=\"10dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:text=\"@string/close\"\n        android:textAllCaps=\"true\"\n        android:textColor=\"@color/white\"\n        android:visibility=\"gone\" />\n\n    <org.schabi.newpipe.views.player.PlayerFastSeekOverlay\n        android:id=\"@+id/fast_seek_overlay\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:alpha=\"0\"\n        android:visibility=\"invisible\" /> <!-- Required for the first appearance fading correctly -->\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/player_fast_seek_overlay.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/root_constraint_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <org.schabi.newpipe.views.player.CircleClipTapView\n        android:id=\"@+id/circle_clip_tap_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clickable=\"false\"\n        android:focusable=\"false\" />\n\n    <org.schabi.newpipe.views.player.SecondsView\n        android:id=\"@+id/seconds_view\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:clickable=\"false\"\n        android:focusable=\"false\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintWidth_default=\"percent\"\n        app:layout_constraintWidth_percent=\"0.5\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/player_fast_seek_seconds_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:ignore=\"ContentDescription\"\n    tools:layout_height=\"wrap_content\"\n    tools:layout_width=\"match_parent\"\n    tools:orientation=\"vertical\"\n    tools:parentTag=\"android.widget.LinearLayout\">\n\n    <LinearLayout\n        android:id=\"@+id/triangle_container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_horizontal\"\n        android:orientation=\"horizontal\">\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/icon_1\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_play_seek_triangle\"\n            tools:alpha=\"0.18\" />\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/icon_2\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_play_seek_triangle\"\n            tools:alpha=\"0.5\" />\n\n        <androidx.appcompat.widget.AppCompatImageView\n            android:id=\"@+id/icon_3\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:src=\"@drawable/ic_play_seek_triangle\"\n            tools:alpha=\"1\" />\n\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@+id/tv_seconds\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center\"\n        android:padding=\"4dp\"\n        android:textColor=\"@android:color/white\"\n        android:textSize=\"14sp\"\n        tools:text=\"20 seconds\" />\n\n</merge>\n"
  },
  {
    "path": "app/src/main/res/layout/player_popup_close_overlay.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/closeButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom|center_horizontal\"\n        android:layout_marginBottom=\"24dp\"\n        android:src=\"@drawable/ic_close\"\n        android:contentDescription=\"@string/close\"\n        app:backgroundTint=\"@color/light_youtube_primary_color\"\n        app:borderWidth=\"0dp\"\n        app:fabSize=\"normal\" />\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/playlist_control.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:visibility=\"invisible\"\n    tools:visibility=\"visible\">\n\n    <LinearLayout\n        android:id=\"@+id/playlist_ctrl_play_bg_button\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"@dimen/playlist_ctrl_height\"\n        android:layout_weight=\"1\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:gravity=\"center\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:drawableStart=\"@drawable/ic_headset\"\n            android:drawablePadding=\"4dp\"\n            android:gravity=\"center_vertical\"\n            android:text=\"@string/controls_background_title\"\n            android:textColor=\"?attr/colorAccent\"\n            android:textSize=\"@dimen/channel_rss_title_size\" />\n    </LinearLayout>\n\n    <View\n        android:layout_width=\"1dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginTop=\"@dimen/playlist_ctrl_separator_margin\"\n        android:layout_marginBottom=\"@dimen/playlist_ctrl_separator_margin\"\n        android:background=\"?attr/colorAccent\"\n        android:clickable=\"false\" />\n\n    <LinearLayout\n        android:id=\"@+id/playlist_ctrl_play_all_button\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_weight=\"1\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:gravity=\"center\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:drawableStart=\"@drawable/ic_playlist_play\"\n            android:drawablePadding=\"4dp\"\n            android:gravity=\"center_vertical\"\n            android:text=\"@string/play_all\"\n            android:textColor=\"?attr/colorAccent\"\n            android:textSize=\"@dimen/channel_rss_title_size\" />\n    </LinearLayout>\n\n    <View\n        android:layout_width=\"1dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginTop=\"@dimen/playlist_ctrl_separator_margin\"\n        android:layout_marginBottom=\"@dimen/playlist_ctrl_separator_margin\"\n        android:background=\"?attr/colorAccent\"\n        android:clickable=\"false\" />\n\n    <LinearLayout\n        android:id=\"@+id/playlist_ctrl_play_popup_button\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_weight=\"1\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        android:gravity=\"center\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:drawableStart=\"@drawable/ic_picture_in_picture\"\n            android:drawablePadding=\"4dp\"\n            android:gravity=\"center_vertical\"\n            android:text=\"@string/controls_popup_title\"\n            android:textColor=\"?attr/colorAccent\"\n            android:textSize=\"@dimen/channel_rss_title_size\" />\n    </LinearLayout>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/playlist_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/contrast_background_color\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/playlist_title_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:paddingHorizontal=\"@dimen/video_item_search_padding\"\n        android:paddingTop=\"@dimen/video_item_search_padding\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/playlist_detail_title_text_size\"\n        tools:text=\"Mix musics #23 title Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum\" />\n\n    <RelativeLayout\n        android:id=\"@+id/playlist_meta\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/playlist_title_view\"\n        android:paddingHorizontal=\"@dimen/video_item_search_padding\"\n        android:paddingTop=\"6dp\">\n\n        <RelativeLayout\n            android:id=\"@+id/uploader_layout\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"@dimen/playlist_detail_uploader_layout_height\"\n            android:layout_toStartOf=\"@+id/playlist_stream_count\"\n            android:layout_toLeftOf=\"@+id/playlist_stream_count\"\n            android:background=\"?attr/selectableItemBackground\"\n            android:gravity=\"left|center_vertical\"\n            android:visibility=\"gone\"\n            tools:ignore=\"RtlHardcoded\"\n            tools:visibility=\"visible\">\n\n            <com.google.android.material.imageview.ShapeableImageView\n                android:id=\"@+id/uploader_avatar_view\"\n                android:layout_width=\"@dimen/playlist_detail_uploader_image_size\"\n                android:layout_height=\"@dimen/playlist_detail_uploader_image_size\"\n                android:layout_alignParentLeft=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:padding=\"0.7dp\"\n                android:src=\"@drawable/placeholder_person\"\n                app:shapeAppearance=\"@style/CircularImageView\"\n                app:strokeColor=\"#ffffff\"\n                app:strokeWidth=\"1dp\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/uploader_name\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_toRightOf=\"@+id/uploader_avatar_view\"\n                android:ellipsize=\"end\"\n                android:gravity=\"left|center_vertical\"\n                android:maxLines=\"1\"\n                android:paddingHorizontal=\"6dp\"\n                android:textSize=\"@dimen/playlist_detail_subtext_size\"\n                tools:ignore=\"RtlHardcoded\"\n                tools:text=\"Typical uploader name\" />\n        </RelativeLayout>\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/playlist_stream_count\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignTop=\"@+id/uploader_layout\"\n            android:layout_alignBottom=\"@+id/uploader_layout\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_marginLeft=\"6dp\"\n            android:ellipsize=\"end\"\n            android:gravity=\"right|center_vertical\"\n            android:maxLines=\"1\"\n            android:textSize=\"@dimen/playlist_detail_subtext_size\"\n            tools:ignore=\"RtlHardcoded\"\n            tools:text=\"234 videos\" />\n    </RelativeLayout>\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/playlist_description\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/playlist_meta\"\n        android:paddingHorizontal=\"@dimen/video_item_search_padding\"\n        android:paddingTop=\"6dp\"\n        android:maxLines=\"5\"\n        tools:text=\"This is a multiline playlist description. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blandit Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blandit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blandit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blandit\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/playlist_description_read_more\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/playlist_description\"\n        android:gravity=\"end\"\n        android:paddingHorizontal=\"@dimen/video_item_search_padding\"\n        android:paddingTop=\"6dp\"\n        android:text=\"@string/show_more\"\n        android:layout_marginBottom=\"6dp\"\n        android:textColor=\"?attr/colorPrimary\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@id/playlist_description_read_more\">\n\n        <include\n            android:id=\"@+id/playlist_control\"\n            layout=\"@layout/playlist_control\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/related_items_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:text=\"@string/exo_controls_next_description\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\"\n        android:textSize=\"13sp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@+id/autoplay_switch\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <androidx.appcompat.widget.SwitchCompat\n        android:id=\"@+id/autoplay_switch\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"16dp\"\n        android:text=\"@string/auto_queue_toggle\"\n        android:textColor=\"@android:color/tab_indicator_text\"\n        android:textSize=\"13sp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/select_channel_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:padding=\"13dp\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"10dp\"\n        android:layout_marginLeft=\"10dp\"\n        android:layout_marginTop=\"5dp\"\n        android:layout_marginEnd=\"5dp\"\n        android:layout_marginRight=\"5dp\"\n        android:layout_marginBottom=\"10dp\"\n        android:text=\"@string/select_a_channel\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        tools:listitem=\"@layout/select_channel_item\" />\n\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/empty_state_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"10dp\"\n        android:text=\"@string/no_channel_subscribed_yet\"\n        android:textAppearance=\"?android:attr/textAppearanceListItem\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/select_channel_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:orientation=\"vertical\"\n    android:padding=\"5dp\">\n\n    <com.google.android.material.imageview.ShapeableImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"42dp\"\n        android:layout_height=\"42dp\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginStart=\"3dp\"\n        android:layout_marginRight=\"8dp\"\n        android:src=\"@drawable/placeholder_person\"\n        app:shapeAppearance=\"@style/CircularImageView\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginBottom=\"@dimen/video_item_search_image_right_margin\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceListItem\"\n        tools:text=\"Channel Title, Lorem ipsum\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/select_feed_group_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:padding=\"13dp\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"10dp\"\n        android:layout_marginLeft=\"10dp\"\n        android:layout_marginTop=\"5dp\"\n        android:layout_marginEnd=\"5dp\"\n        android:layout_marginRight=\"5dp\"\n        android:layout_marginBottom=\"10dp\"\n        android:text=\"@string/select_a_feed_group\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        tools:listitem=\"@layout/select_feed_group_item\" />\n\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/empty_state_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"10dp\"\n        android:text=\"@string/no_feed_group_created_yet\"\n        android:textAppearance=\"?android:attr/textAppearanceListItem\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/select_feed_group_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:orientation=\"vertical\"\n    android:padding=\"5dp\">\n\n    <com.google.android.material.imageview.ShapeableImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginStart=\"3dp\"\n        android:layout_marginRight=\"8dp\"\n        android:src=\"@drawable/ic_computer\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"6dp\"\n        android:layout_marginBottom=\"6dp\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceListItem\"\n        tools:text=\"Channel Title, Lorem ipsum\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/select_kiosk_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:padding=\"13dp\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"10dp\"\n        android:layout_marginLeft=\"10dp\"\n        android:layout_marginTop=\"5dp\"\n        android:layout_marginEnd=\"5dp\"\n        android:layout_marginRight=\"5dp\"\n        android:text=\"@string/select_a_kiosk\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        tools:listitem=\"@layout/select_kiosk_item\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/select_kiosk_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:orientation=\"vertical\"\n    android:padding=\"5dp\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"42dp\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginRight=\"5dp\"\n        android:contentDescription=\"TODO\"\n        app:tint=\"@color/contrastColor\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemTitleView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginBottom=\"@dimen/video_item_search_image_right_margin\"\n        android:layout_toEndOf=\"@+id/itemThumbnailView\"\n        android:layout_toRightOf=\"@+id/itemThumbnailView\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceListItem\"\n        tools:text=\"Channel Title, Lorem ipsum\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/select_playlist_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:padding=\"13dp\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"10dp\"\n        android:layout_marginLeft=\"10dp\"\n        android:layout_marginTop=\"5dp\"\n        android:layout_marginEnd=\"5dp\"\n        android:layout_marginRight=\"5dp\"\n        android:layout_marginBottom=\"10dp\"\n        android:text=\"@string/select_a_playlist\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/items_list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        tools:listitem=\"@layout/list_playlist_mini_item\">\n\n    </androidx.recyclerview.widget.RecyclerView>\n\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/empty_state_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"10dp\"\n        android:text=\"@string/no_playlist_bookmarked_yet\"\n        android:textAppearance=\"?android:attr/textAppearanceListItem\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/settings_category_header_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"14dp\"\n        android:background=\"?attr/contrast_background_color\">\n\n        <View\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"5dp\"\n            android:background=\"?attr/toolbar_shadow\" />\n    </FrameLayout>\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1dp\"\n        android:background=\"?attr/separator_color\" />\n\n    <include layout=\"@layout/settings_category_header_title\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/settings_category_header_title.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<org.schabi.newpipe.views.NewPipeTextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@android:id/title\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"start|center_vertical\"\n    android:paddingLeft=\"16dp\"\n    android:paddingTop=\"16dp\"\n    android:paddingRight=\"16dp\"\n    android:textColor=\"?android:attr/textColorPrimary\"\n    android:textSize=\"14sp\"\n    android:textStyle=\"bold\"\n    tools:text=\"Header\" />\n"
  },
  {
    "path": "app/src/main/res/layout/settings_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\"org.schabi.newpipe.MainActivity\">\n\n    <include\n        android:id=\"@+id/settings_toolbar_layout\"\n        layout=\"@layout/toolbar_layout\" />\n\n    <androidx.fragment.app.FragmentContainerView\n        android:id=\"@+id/settings_fragment_holder\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_marginTop=\"?attr/actionBarSize\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/settings_notification.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingTop=\"16dp\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/summary\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:clickable=\"false\"\n        android:focusable=\"false\"\n        android:gravity=\"center\"\n        android:text=\"@string/notification_actions_summary\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintHorizontal_bias=\"0.0\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <include\n        android:id=\"@+id/notificationAction0\"\n        layout=\"@layout/settings_notification_action\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"8dp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/summary\" />\n\n    <include\n        android:id=\"@+id/notificationAction1\"\n        layout=\"@layout/settings_notification_action\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/notificationAction0\" />\n\n    <include\n        android:id=\"@+id/notificationAction2\"\n        layout=\"@layout/settings_notification_action\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/notificationAction1\" />\n\n    <include\n        android:id=\"@+id/notificationAction3\"\n        layout=\"@layout/settings_notification_action\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/notificationAction2\" />\n\n    <include\n        android:id=\"@+id/notificationAction4\"\n        layout=\"@layout/settings_notification_action\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/notificationAction3\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/settings_notification_action.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?android:selectableItemBackground\">\n\n    <androidx.appcompat.widget.AppCompatImageView\n        android:id=\"@+id/notificationActionIcon\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"12dp\"\n        android:layout_marginTop=\"8dp\"\n        android:layout_marginBottom=\"8dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintDimensionRatio=\"1\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:tint=\"?android:textColorPrimary\"\n        tools:ignore=\"ContentDescription\"\n        tools:src=\"@drawable/ic_previous\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/notificationActionTitle\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"8dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"14sp\"\n        app:layout_constraintBottom_toTopOf=\"@+id/notificationActionSummary\"\n        app:layout_constraintEnd_toEndOf=\"@id/notificationActionClickableArea\"\n        app:layout_constraintHorizontal_bias=\"0.0\"\n        app:layout_constraintStart_toEndOf=\"@+id/notificationActionIcon\"\n        app:layout_constraintTop_toTopOf=\"@+id/notificationActionIcon\"\n        app:layout_constraintVertical_chainStyle=\"packed\"\n        tools:text=\"Second action button | Lorem ipsum dolor sit amet, consectetur adipisci elit\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/notificationActionSummary\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"1\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/notificationActionIcon\"\n        app:layout_constraintEnd_toEndOf=\"@+id/notificationActionClickableArea\"\n        app:layout_constraintHorizontal_bias=\"0.0\"\n        app:layout_constraintStart_toStartOf=\"@+id/notificationActionTitle\"\n        app:layout_constraintTop_toBottomOf=\"@+id/notificationActionTitle\"\n        tools:text=\"Play • Pause • Buffering | Lorem ipsum dolor sit amet, consectetur adipisci elit\" />\n\n    <View\n        android:id=\"@+id/notificationActionClickableArea\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:background=\"?android:selectableItemBackground\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toStartOf=\"@id/notificationActionCheckBoxClickableArea\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <CheckBox\n        android:id=\"@+id/notificationActionCheckBox\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:clickable=\"false\"\n        android:focusable=\"false\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/notificationActionCheckBoxClickableArea\"\n        app:layout_constraintEnd_toEndOf=\"@+id/notificationActionCheckBoxClickableArea\"\n        app:layout_constraintStart_toStartOf=\"@+id/notificationActionCheckBoxClickableArea\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <View\n        android:id=\"@+id/notificationActionCheckBoxClickableArea\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:clickable=\"true\"\n        android:focusable=\"true\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintDimensionRatio=\"H,1:1\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/settings_preferencesearch_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:clipToPadding=\"false\"\n    android:orientation=\"vertical\"\n    android:background=\"?android:attr/windowBackground\">\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"4dp\"\n        android:background=\"?attr/toolbar_shadow\" />\n\n    <LinearLayout\n        android:id=\"@+id/empty_state_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\"\n        android:visibility=\"gone\"\n        tools:visibility=\"gone\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:layout_marginBottom=\"10dp\"\n            android:fontFamily=\"monospace\"\n            android:text=\"╰(°●°╰)\"\n            android:textSize=\"35sp\"\n            tools:ignore=\"HardcodedText,UnusedAttribute\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center\"\n            android:text=\"@string/search_no_results\"\n            android:textSize=\"24sp\" />\n\n    </LinearLayout>\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/searchResults\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:clipToPadding=\"false\"\n        android:scrollbars=\"vertical\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/settings_preferencesearch_list_item_result.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?android:attr/selectableItemBackground\"\n    android:orientation=\"vertical\"\n    android:padding=\"16dp\"\n    android:paddingTop=\"12dp\"\n    android:paddingBottom=\"12dp\">\n\n    <TextView\n        android:id=\"@+id/title\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:textColor=\"?android:attr/editTextColor\"\n        android:textSize=\"16sp\"\n        tools:text=\"Title\" />\n\n    <TextView\n        android:id=\"@+id/summary\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:textColor=\"?android:attr/editTextColor\"\n        android:textSize=\"14sp\"\n        tools:text=\"Summary\" />\n\n    <TextView\n        android:id=\"@+id/breadcrumbs\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:alpha=\"0.6\"\n        android:textColor=\"?android:attr/editTextColor\"\n        android:textSize=\"14sp\"\n        tools:text=\"Breadcrumb\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/single_choice_dialog_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!-- -->\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fadeScrollbars=\"false\">\n\n    <RadioGroup\n        android:id=\"@android:id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingTop=\"?attr/listPreferredItemPaddingLeft\" />\n</ScrollView>\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/statistic_playlist_control.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <RelativeLayout\n        android:id=\"@+id/sortButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"?attr/selectableItemBackground\"\n        android:clickable=\"true\"\n        android:focusable=\"true\">\n\n        <ImageView\n            android:id=\"@+id/sortButtonIcon\"\n            android:layout_width=\"48dp\"\n            android:layout_height=\"28dp\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"12dp\"\n            android:layout_marginRight=\"12dp\"\n            android:src=\"@drawable/ic_filter_list\"\n            tools:ignore=\"ContentDescription,RtlHardcoded\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/sortButtonText\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"50dp\"\n            android:layout_toRightOf=\"@id/sortButtonIcon\"\n            android:gravity=\"left|center\"\n            android:text=\"@string/title_most_played\"\n            android:textAppearance=\"?android:attr/textAppearanceLarge\"\n            android:textSize=\"15sp\"\n            android:textStyle=\"bold\"\n            tools:ignore=\"RtlHardcoded\" />\n    </RelativeLayout>\n\n    <include\n        android:id=\"@+id/playlist_control\"\n        layout=\"@layout/playlist_control\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/stream_quality_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"48dp\">\n\n    <ImageView\n        android:id=\"@+id/wo_sound_icon\"\n        android:layout_width=\"20dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginLeft=\"6dp\"\n        android:scaleType=\"fitCenter\"\n        android:src=\"@drawable/ic_volume_off\"\n        tools:ignore=\"ContentDescription,RtlHardcoded\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/stream_format_name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"22dp\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toRightOf=\"@+id/wo_sound_icon\"\n        android:ellipsize=\"end\"\n        android:gravity=\"left|bottom\"\n        android:maxLines=\"1\"\n        android:paddingLeft=\"12dp\"\n        android:paddingRight=\"18dp\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Caption\"\n        android:textSize=\"12sp\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"MPEG-4\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/stream_quality\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"26dp\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_toRightOf=\"@+id/wo_sound_icon\"\n        android:ellipsize=\"end\"\n        android:gravity=\"left|top\"\n        android:maxLines=\"1\"\n        android:paddingLeft=\"12dp\"\n        android:paddingRight=\"18dp\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"\n        android:textSize=\"14sp\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"1080p60\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/stream_size\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"48dp\"\n        android:layout_alignParentRight=\"true\"\n        android:gravity=\"right|center_vertical\"\n        android:maxLines=\"1\"\n        android:paddingLeft=\"8dp\"\n        android:paddingRight=\"8dp\"\n        android:textAppearance=\"@style/TextAppearance.AppCompat.Caption\"\n        android:textSize=\"12sp\"\n        android:visibility=\"gone\"\n        tools:ignore=\"RtlHardcoded\"\n        tools:text=\"123.4 MB\"\n        tools:visibility=\"visible\" />\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/subscription_groups_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/header_title\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"1\"\n        android:ellipsize=\"end\"\n        android:gravity=\"start|center_vertical\"\n        android:maxLines=\"2\"\n        android:minHeight=\"24dp\"\n        android:paddingHorizontal=\"16dp\"\n        android:paddingVertical=\"12dp\"\n        android:textColor=\"?android:attr/textColorPrimary\"\n        android:textSize=\"16sp\"\n        android:textStyle=\"bold\"\n        tools:text=\"Header\" />\n\n    <ImageButton\n        android:id=\"@+id/header_toggle_view_mode\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/list_view_mode\"\n        android:padding=\"8dp\"\n        tools:src=\"@drawable/ic_apps\" />\n\n    <ImageButton\n        android:id=\"@+id/header_sort\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_marginEnd=\"4dp\"\n        android:background=\"?attr/selectableItemBackgroundBorderless\"\n        android:contentDescription=\"@string/sort\"\n        android:padding=\"8dp\"\n        android:src=\"@drawable/ic_sort\" />\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/subscription_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<org.schabi.newpipe.views.NewPipeTextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:ellipsize=\"end\"\n    android:maxLines=\"2\"\n    android:paddingLeft=\"16dp\"\n    android:paddingTop=\"12dp\"\n    android:paddingRight=\"16dp\"\n    android:paddingBottom=\"12dp\"\n    android:textColor=\"?android:attr/textColorPrimary\"\n    android:textSize=\"16sp\"\n    android:textStyle=\"bold\"\n    tools:text=\"Header\" />"
  },
  {
    "path": "app/src/main/res/layout/toolbar_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"vertical\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:id=\"@+id/toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"?attr/actionBarSize\"\n        android:background=\"?attr/colorPrimary\"\n        android:gravity=\"center_vertical\"\n        android:minHeight=\"?attr/actionBarSize\"\n        android:theme=\"@style/ToolbarTheme\">\n\n        <include\n            android:id=\"@+id/toolbar_search_container\"\n            layout=\"@layout/toolbar_search_layout\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\" />\n\n    </androidx.appcompat.widget.Toolbar>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/toolbar_search_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"?attr/actionBarSize\"\n    tools:background=\"?attr/colorPrimary\">\n\n    <org.schabi.newpipe.views.NewPipeEditText\n        android:id=\"@+id/toolbar_search_edit_text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_marginTop=\"4dp\"\n        android:layout_marginRight=\"48dp\"\n        android:layout_marginBottom=\"4dp\"\n        android:background=\"@null\"\n        android:focusable=\"true\"\n        android:focusableInTouchMode=\"true\"\n        android:hint=\"@string/search\"\n        android:textColor=\"?attr/toolbarSearchColor\"\n        android:imeOptions=\"actionSearch|flagNoFullscreen\"\n        android:inputType=\"textFilter|textNoSuggestions\"\n        android:maxLines=\"1\"\n        android:nextFocusDown=\"@+id/suggestions_list\"\n        android:theme=\"@style/ToolbarSearchInputTheme\"\n        tools:ignore=\"RtlHardcoded\" />\n\n    <FrameLayout\n        android:id=\"@+id/toolbar_search_clear\"\n        android:layout_width=\"48dp\"\n        android:layout_height=\"48dp\"\n        android:layout_gravity=\"right|center_vertical\"\n        android:contentDescription=\"@string/clear\"\n        android:focusable=\"true\"\n        tools:ignore=\"RtlHardcoded\">\n\n        <View\n            android:layout_width=\"28dp\"\n            android:layout_height=\"28dp\"\n            android:layout_gravity=\"center\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\" />\n\n        <ImageView\n            android:id=\"@+id/toolbar_search_clear_icon\"\n            android:layout_width=\"24dp\"\n            android:layout_height=\"24dp\"\n            android:layout_gravity=\"center\"\n            android:contentDescription=\"@string/search\"\n            android:scaleType=\"fitCenter\"\n            android:src=\"@drawable/ic_close\"\n            app:tint=\"?attr/toolbarSearchColor\"\n            tools:ignore=\"RtlHardcoded\" />\n    </FrameLayout>\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout-land/activity_player_queue_control.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/main_content\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    tools:context=\"org.schabi.newpipe.player.PlayQueueActivity\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:id=\"@+id/appbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ThemeOverlay.AppCompat.DayNight.ActionBar\"\n        app:popupTheme=\"@style/ThemeOverlay.AppCompat.DayNight.ActionBar\">\n\n        <androidx.appcompat.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?attr/actionBarSize\"\n            android:layout_weight=\"1\"\n            android:background=\"?attr/colorPrimary\"\n            android:theme=\"@style/ToolbarTheme\"\n            app:layout_scrollFlags=\"scroll|enterAlways\"\n            app:title=\"@string/app_name\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/play_queue\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_above=\"@id/progress_bar\"\n        android:layout_below=\"@+id/appbar\"\n        android:layout_toStartOf=\"@+id/control_pane\"\n        android:layout_toLeftOf=\"@+id/control_pane\"\n        android:scrollbars=\"vertical\"\n        app:layoutManager=\"LinearLayoutManager\"\n        tools:listitem=\"@layout/play_queue_item\" />\n\n    <RelativeLayout\n        android:id=\"@+id/control_pane\"\n        android:layout_width=\"200dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_above=\"@id/progress_bar\"\n        android:layout_below=\"@id/appbar\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_alignParentRight=\"true\">\n\n        <LinearLayout\n            android:id=\"@+id/metadata\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_above=\"@+id/playback_controls_top\"\n            android:background=\"?attr/selectableItemBackground\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:orientation=\"vertical\"\n            android:padding=\"8dp\"\n            tools:ignore=\"RtlHardcoded,RtlSymmetry\">\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/song_name\"\n                style=\"@android:style/TextAppearance.StatusBar.EventContent.Title\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"end\"\n                android:maxLines=\"4\"\n                android:textColor=\"?attr/colorAccent\"\n                android:textSize=\"14sp\"\n                tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nec aliquam augue, eget cursus est. Ut id tristique enim, ut scelerisque tellus. Sed ultricies ipsum non mauris ultricies, commodo malesuada velit porta.\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/artist_name\"\n                style=\"@android:style/TextAppearance.StatusBar.EventContent\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"end\"\n                android:maxLines=\"2\"\n                android:textSize=\"12sp\"\n                tools:text=\"Duis posuere arcu condimentum lobortis mattis.\" />\n        </LinearLayout>\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/seek_display\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_above=\"@+id/playback_controls_top\"\n            android:layout_centerInParent=\"true\"\n            android:background=\"#c0000000\"\n            android:paddingLeft=\"30dp\"\n            android:paddingTop=\"5dp\"\n            android:paddingRight=\"30dp\"\n            android:paddingBottom=\"5dp\"\n            android:textColor=\"@android:color/white\"\n            android:textSize=\"22sp\"\n            android:textStyle=\"bold\"\n            android:visibility=\"gone\"\n            tools:ignore=\"RtlHardcoded\"\n            tools:text=\"1:06:29\"\n            tools:visibility=\"visible\" />\n\n        <RelativeLayout\n            android:id=\"@+id/playback_controls_top\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"60dp\"\n            android:layout_above=\"@+id/playback_controls_bottom\"\n            android:orientation=\"horizontal\"\n            android:paddingTop=\"10dp\"\n            tools:ignore=\"RtlHardcoded\">\n\n            <ImageButton\n                android:id=\"@+id/control_fast_rewind\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_toLeftOf=\"@+id/control_play_pause\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:scaleType=\"fitCenter\"\n                android:src=\"@drawable/exo_controls_rewind\"\n                android:contentDescription=\"@string/rewind\"\n                app:tint=\"?attr/colorAccent\" />\n\n            <ImageButton\n                android:id=\"@+id/control_play_pause\"\n                android:layout_width=\"50dp\"\n                android:layout_height=\"50dp\"\n                android:layout_centerInParent=\"true\"\n                android:layout_centerHorizontal=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_marginRight=\"5dp\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:scaleType=\"fitCenter\"\n                android:src=\"@drawable/ic_pause\"\n                android:contentDescription=\"@string/pause\"\n                app:tint=\"?attr/colorAccent\" />\n\n            <ProgressBar\n                android:id=\"@+id/control_progress_bar\"\n                style=\"?android:attr/progressBarStyleLargeInverse\"\n                android:layout_width=\"50dp\"\n                android:layout_height=\"50dp\"\n                android:layout_centerInParent=\"true\"\n                android:layout_centerHorizontal=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_marginRight=\"5dp\"\n                android:background=\"#00000000\"\n                android:clickable=\"false\"\n                android:indeterminate=\"true\"\n                android:padding=\"2dp\"\n                android:scaleType=\"fitCenter\"\n                android:tint=\"?attr/colorAccent\"\n                android:visibility=\"invisible\" />\n\n            <ImageButton\n                android:id=\"@+id/control_fast_forward\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginRight=\"5dp\"\n                android:layout_toRightOf=\"@+id/control_play_pause\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:scaleType=\"fitCenter\"\n                android:src=\"@drawable/exo_controls_fastforward\"\n                android:contentDescription=\"@string/forward\"\n                app:tint=\"?attr/colorAccent\" />\n        </RelativeLayout>\n\n        <RelativeLayout\n            android:id=\"@+id/playback_controls_bottom\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"60dp\"\n            android:layout_alignParentBottom=\"true\"\n            android:orientation=\"horizontal\"\n            android:paddingTop=\"10dp\"\n            tools:ignore=\"RtlHardcoded\">\n\n            <androidx.appcompat.widget.AppCompatImageButton\n                android:id=\"@+id/control_backward\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"35dp\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_marginRight=\"5dp\"\n                android:layout_toLeftOf=\"@+id/control_repeat\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:gravity=\"center\"\n                android:minWidth=\"50dp\"\n                android:scaleType=\"fitCenter\"\n                android:src=\"@drawable/ic_previous\"\n                android:tint=\"?attr/colorAccent\"\n                android:contentDescription=\"@string/previous_stream\" />\n\n            <ImageButton\n                android:id=\"@+id/control_repeat\"\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_toLeftOf=\"@+id/anchor\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:scaleType=\"fitXY\"\n                android:src=\"@drawable/ic_repeat\"\n                android:contentDescription=\"@string/notification_action_repeat\"\n                app:tint=\"?attr/colorAccent\" />\n\n            <View\n                android:id=\"@+id/anchor\"\n                android:layout_width=\"10dp\"\n                android:layout_height=\"1dp\"\n                android:layout_centerInParent=\"true\" />\n\n            <ImageButton\n                android:id=\"@+id/control_shuffle\"\n                android:layout_width=\"30dp\"\n                android:layout_height=\"30dp\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginRight=\"5dp\"\n                android:layout_toRightOf=\"@+id/anchor\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:scaleType=\"fitXY\"\n                android:src=\"@drawable/ic_shuffle\"\n                android:contentDescription=\"@string/notification_action_shuffle\"\n                app:tint=\"?attr/colorAccent\" />\n\n            <androidx.appcompat.widget.AppCompatImageButton\n                android:id=\"@+id/control_forward\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"35dp\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_marginRight=\"5dp\"\n                android:layout_toRightOf=\"@+id/control_shuffle\"\n                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                android:clickable=\"true\"\n                android:focusable=\"true\"\n                android:gravity=\"center\"\n                android:minWidth=\"50dp\"\n                android:scaleType=\"fitCenter\"\n                android:src=\"@drawable/ic_next\"\n                android:tint=\"?attr/colorAccent\"\n                android:contentDescription=\"@string/next_stream\" />\n        </RelativeLayout>\n    </RelativeLayout>\n\n    <LinearLayout\n        android:id=\"@+id/progress_bar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:gravity=\"center\"\n        android:orientation=\"horizontal\"\n        android:paddingLeft=\"16dp\"\n        android:paddingRight=\"16dp\">\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/current_time\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:gravity=\"center\"\n            android:minHeight=\"40dp\"\n            android:text=\"-:--:--\"\n            android:textColor=\"?attr/colorAccent\"\n            tools:ignore=\"HardcodedText\"\n            tools:text=\"1:06:29\" />\n\n        <androidx.appcompat.widget.AppCompatSeekBar\n            android:id=\"@+id/seek_bar\"\n            style=\"@style/Widget.AppCompat.SeekBar\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"1\"\n            android:paddingTop=\"8dp\"\n            android:paddingBottom=\"4dp\"\n            tools:progress=\"25\"\n            tools:secondaryProgress=\"50\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/end_time\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:gravity=\"center\"\n            android:text=\"-:--:--\"\n            android:textColor=\"?attr/colorAccent\"\n            tools:ignore=\"HardcodedText\"\n            tools:text=\"1:23:49\" />\n\n        <org.schabi.newpipe.views.NewPipeTextView\n            android:id=\"@+id/live_sync\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:background=\"?attr/selectableItemBackground\"\n            android:gravity=\"center\"\n            android:paddingLeft=\"4dp\"\n            android:paddingRight=\"4dp\"\n            android:text=\"@string/duration_live\"\n            android:textAllCaps=\"true\"\n            android:textColor=\"?attr/colorAccent\"\n            android:visibility=\"gone\" />\n    </LinearLayout>\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout-land/list_stream_card_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/itemRoot\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:clickable=\"true\"\n    android:focusable=\"true\"\n    android:padding=\"@dimen/video_item_search_padding\">\n\n    <ImageView\n        android:id=\"@+id/itemThumbnailView\"\n        android:layout_width=\"@dimen/video_item_search_thumbnail_image_width\"\n        android:layout_height=\"@dimen/video_item_search_thumbnail_image_height\"\n        android:scaleType=\"fitCenter\"\n        android:src=\"@drawable/placeholder_thumbnail_video\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemProgressView\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemDurationView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"@dimen/video_item_search_duration_margin\"\n        android:layout_marginBottom=\"@dimen/video_item_search_duration_margin\"\n        android:background=\"@color/duration_background_color\"\n        android:paddingHorizontal=\"@dimen/video_item_search_duration_horizontal_padding\"\n        android:paddingVertical=\"@dimen/video_item_search_duration_vertical_padding\"\n        android:textAllCaps=\"true\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textColor=\"@color/duration_text_color\"\n        android:textSize=\"@dimen/video_item_search_duration_text_size\"\n        app:layout_constraintBottom_toBottomOf=\"@id/itemThumbnailView\"\n        app:layout_constraintRight_toRightOf=\"@id/itemThumbnailView\"\n        tools:text=\"1:09:10\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemVideoTitleView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginStart=\"@dimen/video_item_search_image_right_margin\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n        android:textSize=\"@dimen/video_item_search_title_text_size\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemUploaderView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemUploaderView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n        app:layout_constraintBottom_toTopOf=\"@+id/itemAdditionalDetails\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemVideoTitleView\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemVideoTitleView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemVideoTitleView\"\n        tools:text=\"Uploader\" />\n\n    <org.schabi.newpipe.views.NewPipeTextView\n        android:id=\"@+id/itemAdditionalDetails\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:ellipsize=\"end\"\n        android:lines=\"1\"\n        android:textAppearance=\"?android:attr/textAppearanceSmall\"\n        android:textSize=\"@dimen/video_item_search_upload_date_text_size\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemVideoTitleView\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemVideoTitleView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemUploaderView\"\n        tools:text=\"2 years ago • 10M views\" />\n\n    <org.schabi.newpipe.views.AnimatedProgressBar\n        android:id=\"@+id/itemProgressView\"\n        style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"4dp\"\n        android:progressDrawable=\"?progress_horizontal_drawable\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintStart_toStartOf=\"@+id/itemThumbnailView\"\n        app:layout_constraintTop_toBottomOf=\"@+id/itemThumbnailView\" />\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "app/src/main/res/layout-large-land/fragment_video_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/video_item_detail\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"?attr/windowBackground\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:baselineAligned=\"false\"\n        android:focusableInTouchMode=\"true\"\n        android:orientation=\"horizontal\"\n        tools:ignore=\"RtlHardcoded\">\n\n        <org.schabi.newpipe.views.FocusAwareCoordinator\n            android:id=\"@+id/detail_main_content\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_weight=\"5\"\n            android:isScrollContainer=\"true\">\n\n            <com.google.android.material.appbar.AppBarLayout\n                android:id=\"@+id/app_bar_layout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@android:color/transparent\"\n                android:touchscreenBlocksFocus=\"false\"\n                app:elevation=\"0dp\"\n                app:layout_behavior=\"com.google.android.material.appbar.FlingBehavior\">\n\n                <org.schabi.newpipe.views.CustomCollapsingToolbarLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:layout_scrollFlags=\"scroll\">\n\n                    <!-- THUMBNAIL -->\n                    <FrameLayout\n                        android:id=\"@+id/detail_thumbnail_root_layout\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:background=\"@android:color/black\"\n                        android:clickable=\"true\"\n                        android:descendantFocusability=\"afterDescendants\"\n                        android:focusable=\"true\"\n                        android:foreground=\"?attr/selectableItemBackground\"\n                        app:layout_collapseMode=\"parallax\">\n\n                        <ImageView\n                            android:id=\"@+id/detail_thumbnail_image_view\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:background=\"?windowBackground\"\n                            android:contentDescription=\"@string/detail_thumbnail_view_description\"\n                            android:scaleType=\"fitCenter\"\n                            tools:ignore=\"RtlHardcoded\"\n                            tools:layout_height=\"200dp\"\n                            tools:src=\"@drawable/placeholder_thumbnail_video\" />\n\n                        <ImageView\n                            android:id=\"@+id/detail_thumbnail_play_button\"\n                            android:layout_width=\"64dp\"\n                            android:layout_height=\"64dp\"\n                            android:layout_gravity=\"center\"\n                            android:background=\"@android:color/transparent\"\n                            android:src=\"@drawable/ic_play_arrow_shadow\"\n                            android:visibility=\"invisible\"\n                            tools:ignore=\"ContentDescription\"\n                            tools:visibility=\"visible\" />\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/touch_append_detail\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_gravity=\"center\"\n                            android:background=\"#64000000\"\n                            android:paddingLeft=\"30dp\"\n                            android:paddingTop=\"10dp\"\n                            android:paddingRight=\"30dp\"\n                            android:paddingBottom=\"10dp\"\n                            android:text=\"@string/hold_to_append\"\n                            android:textColor=\"@android:color/white\"\n                            android:textSize=\"20sp\"\n                            android:textStyle=\"bold\"\n                            android:visibility=\"gone\"\n                            tools:ignore=\"RtlHardcoded\"\n                            tools:visibility=\"visible\" />\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_duration_view\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_gravity=\"bottom|right\"\n                            android:layout_marginLeft=\"12dp\"\n                            android:layout_marginTop=\"8dp\"\n                            android:layout_marginRight=\"12dp\"\n                            android:layout_marginBottom=\"8dp\"\n                            android:alpha=\".6\"\n                            android:background=\"#23000000\"\n                            android:gravity=\"center\"\n                            android:paddingLeft=\"6dp\"\n                            android:paddingTop=\"2dp\"\n                            android:paddingRight=\"6dp\"\n                            android:paddingBottom=\"2dp\"\n                            android:textAllCaps=\"true\"\n                            android:textColor=\"@android:color/white\"\n                            android:textSize=\"12sp\"\n                            android:textStyle=\"bold\"\n                            android:visibility=\"gone\"\n                            tools:ignore=\"RtlHardcoded\"\n                            tools:text=\"12:38\"\n                            tools:visibility=\"visible\" />\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_position_view\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_gravity=\"bottom|left\"\n                            android:layout_marginLeft=\"12dp\"\n                            android:layout_marginTop=\"8dp\"\n                            android:layout_marginRight=\"12dp\"\n                            android:layout_marginBottom=\"8dp\"\n                            android:alpha=\".6\"\n                            android:background=\"?colorPrimary\"\n                            android:gravity=\"center\"\n                            android:paddingLeft=\"6dp\"\n                            android:paddingTop=\"2dp\"\n                            android:paddingRight=\"6dp\"\n                            android:paddingBottom=\"2dp\"\n                            android:textAllCaps=\"true\"\n                            android:textColor=\"@android:color/white\"\n                            android:textSize=\"12sp\"\n                            android:textStyle=\"bold\"\n                            android:visibility=\"gone\"\n                            tools:text=\"12:38\"\n                            tools:visibility=\"visible\" />\n\n                        <org.schabi.newpipe.views.AnimatedProgressBar\n                            android:id=\"@+id/position_view\"\n                            style=\"@style/Widget.AppCompat.ProgressBar.Horizontal\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"2dp\"\n                            android:layout_gravity=\"bottom\"\n                            android:background=\"@android:color/transparent\"\n                            android:progressDrawable=\"?attr/progress_horizontal_drawable\"\n                            android:visibility=\"invisible\"\n                            tools:max=\"100\"\n                            tools:progress=\"40\"\n                            tools:visibility=\"visible\" />\n\n                        <!-- Player will be inserted here in realtime -->\n                        <FrameLayout\n                            android:id=\"@+id/player_placeholder\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"match_parent\"\n                            android:descendantFocusability=\"afterDescendants\" />\n\n                    </FrameLayout>\n\n                </org.schabi.newpipe.views.CustomCollapsingToolbarLayout>\n\n                <!-- CONTENT -->\n                <RelativeLayout\n                    android:id=\"@+id/detail_content_root_layout\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:layout_scrollFlags=\"scroll\">\n\n                    <!-- TITLE -->\n                    <FrameLayout\n                        android:id=\"@+id/detail_title_root_layout\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:background=\"?attr/selectableItemBackground\"\n                        android:clickable=\"true\"\n                        android:focusable=\"true\"\n                        android:paddingStart=\"12dp\"\n                        tools:ignore=\"RtlSymmetry\">\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_video_title_view\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"match_parent\"\n                            android:layout_marginEnd=\"30dp\"\n                            android:ellipsize=\"end\"\n                            android:maxLines=\"1\"\n                            android:paddingTop=\"12dp\"\n                            android:paddingBottom=\"8dp\"\n                            android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                            android:textSize=\"@dimen/video_item_detail_title_text_size\"\n                            tools:text=\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed a ultricies ex. Integer sit amet sodales risus. Duis non mi et urna pretium bibendum. Nunc eleifend est quis ipsum porttitor egestas. Sed facilisis, nisl quis eleifend pellentesque, orci metus egestas dolor, at accumsan eros metus quis libero.\" />\n\n                        <ImageView\n                            android:id=\"@+id/detail_toggle_secondary_controls_view\"\n                            android:layout_width=\"20dp\"\n                            android:layout_height=\"20dp\"\n                            android:layout_gravity=\"top|end\"\n                            android:layout_marginTop=\"11dp\"\n                            android:layout_marginEnd=\"10dp\"\n                            android:src=\"@drawable/ic_expand_more\"\n                            tools:ignore=\"ContentDescription\" />\n\n                    </FrameLayout>\n\n                    <!-- LOADING INDICATOR-->\n                    <ProgressBar\n                        android:id=\"@+id/loading_progress_bar\"\n                        style=\"@style/Widget.AppCompat.ProgressBar\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_below=\"@id/detail_title_root_layout\"\n                        android:layout_marginTop=\"@dimen/video_item_detail_error_panel_margin\"\n                        android:indeterminate=\"true\"\n                        android:visibility=\"gone\"\n                        tools:visibility=\"visible\" />\n\n                    <!--ERROR PANEL-->\n                    <include\n                        android:id=\"@+id/error_panel\"\n                        layout=\"@layout/error_panel\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_below=\"@id/detail_title_root_layout\"\n                        android:layout_marginTop=\"@dimen/video_item_detail_error_panel_margin\"\n                        android:visibility=\"gone\"\n                        tools:visibility=\"gone\" />\n\n                    <!--HIDING ROOT-->\n                    <LinearLayout\n                        android:id=\"@+id/detail_content_root_hiding\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\"\n                        android:layout_below=\"@+id/detail_title_root_layout\"\n                        android:orientation=\"vertical\"\n                        android:paddingBottom=\"10dp\"\n                        android:visibility=\"gone\"\n                        tools:visibility=\"visible\">\n\n                        <!--DETAIL-->\n                        <RelativeLayout\n                            android:id=\"@+id/detail_root\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"55dp\"\n                            android:layout_marginLeft=\"12dp\"\n                            android:layout_marginTop=\"6dp\"\n                            android:layout_marginRight=\"12dp\"\n                            android:baselineAligned=\"false\"\n                            android:orientation=\"horizontal\">\n\n                            <!--UPLOADER-->\n                            <LinearLayout\n                                android:id=\"@+id/detail_uploader_root_layout\"\n                                android:layout_width=\"match_parent\"\n                                android:layout_height=\"match_parent\"\n                                android:layout_toStartOf=\"@id/details_panel\"\n                                android:layout_toLeftOf=\"@id/details_panel\"\n                                android:background=\"?attr/selectableItemBackground\"\n                                android:focusable=\"true\"\n                                android:gravity=\"center_vertical\"\n                                android:orientation=\"horizontal\"\n                                android:padding=\"6dp\">\n\n                                <FrameLayout\n                                    android:layout_width=\"wrap_content\"\n                                    android:layout_height=\"wrap_content\">\n\n                                    <com.google.android.material.imageview.ShapeableImageView\n                                        android:id=\"@+id/detail_sub_channel_thumbnail_view\"\n                                        android:layout_width=\"@dimen/video_item_detail_uploader_image_size\"\n                                        android:layout_height=\"@dimen/video_item_detail_uploader_image_size\"\n                                        android:contentDescription=\"@string/detail_sub_channel_thumbnail_view_description\"\n                                        android:src=\"@drawable/placeholder_person\"\n                                        app:shapeAppearance=\"@style/CircularImageView\" />\n\n                                    <com.google.android.material.imageview.ShapeableImageView\n                                        android:id=\"@+id/detail_uploader_thumbnail_view\"\n                                        android:layout_width=\"@dimen/video_item_detail_sub_channel_image_size\"\n                                        android:layout_height=\"@dimen/video_item_detail_sub_channel_image_size\"\n                                        android:layout_gravity=\"bottom|right\"\n                                        android:contentDescription=\"@string/detail_uploader_thumbnail_view_description\"\n                                        android:src=\"@drawable/placeholder_person\"\n                                        app:shapeAppearance=\"@style/CircularImageView\" />\n\n                                </FrameLayout>\n\n                                <LinearLayout\n                                    android:layout_width=\"match_parent\"\n                                    android:layout_height=\"match_parent\"\n                                    android:gravity=\"center_vertical\"\n                                    android:orientation=\"vertical\">\n\n                                    <org.schabi.newpipe.views.NewPipeTextView\n                                        android:id=\"@+id/detail_sub_channel_text_view\"\n                                        android:layout_width=\"match_parent\"\n                                        android:layout_height=\"wrap_content\"\n                                        android:layout_marginLeft=\"15dp\"\n                                        android:ellipsize=\"marquee\"\n                                        android:fadingEdge=\"horizontal\"\n                                        android:marqueeRepeatLimit=\"marquee_forever\"\n                                        android:scrollHorizontally=\"true\"\n                                        android:singleLine=\"true\"\n                                        android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                                        android:textSize=\"@dimen/video_item_detail_sub_channel_text_size\"\n                                        android:textStyle=\"bold\"\n                                        tools:ignore=\"RtlHardcoded\"\n                                        tools:text=\"Channel\" />\n\n                                    <org.schabi.newpipe.views.NewPipeTextView\n                                        android:id=\"@+id/detail_uploader_text_view\"\n                                        android:layout_width=\"match_parent\"\n                                        android:layout_height=\"wrap_content\"\n                                        android:layout_marginLeft=\"15dp\"\n                                        android:ellipsize=\"marquee\"\n                                        android:fadingEdge=\"horizontal\"\n                                        android:marqueeRepeatLimit=\"marquee_forever\"\n                                        android:scrollHorizontally=\"true\"\n                                        android:singleLine=\"true\"\n                                        android:textSize=\"@dimen/video_item_detail_uploader_text_size\"\n                                        tools:ignore=\"RtlHardcoded\"\n                                        tools:text=\"Uploader\" />\n                                </LinearLayout>\n\n                            </LinearLayout>\n\n                            <!-- VIEW & THUMBS -->\n                            <RelativeLayout\n                                android:id=\"@+id/details_panel\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"match_parent\"\n                                android:layout_alignParentEnd=\"true\"\n                                android:layout_alignParentRight=\"true\"\n                                android:paddingLeft=\"6dp\"\n                                android:paddingRight=\"6dp\">\n\n                                <org.schabi.newpipe.views.NewPipeTextView\n                                    android:id=\"@+id/detail_view_count_view\"\n                                    android:layout_width=\"wrap_content\"\n                                    android:layout_height=\"wrap_content\"\n                                    android:layout_centerHorizontal=\"true\"\n                                    android:layout_marginTop=\"6dp\"\n                                    android:layout_marginBottom=\"6dp\"\n                                    android:lines=\"1\"\n                                    android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                                    android:textSize=\"@dimen/video_item_detail_views_text_size\"\n                                    tools:ignore=\"RtlHardcoded\"\n                                    tools:text=\"2,816,821,505 views\" />\n\n                                <ImageView\n                                    android:id=\"@+id/detail_thumbs_up_img_view\"\n                                    android:layout_width=\"@dimen/video_item_detail_like_image_width\"\n                                    android:layout_height=\"@dimen/video_item_detail_like_image_height\"\n                                    android:layout_below=\"@id/detail_view_count_view\"\n                                    android:contentDescription=\"@string/detail_likes_img_view_description\"\n                                    android:src=\"@drawable/ic_thumb_up\" />\n\n                                <org.schabi.newpipe.views.NewPipeTextView\n                                    android:id=\"@+id/detail_thumbs_up_count_view\"\n                                    android:layout_width=\"wrap_content\"\n                                    android:layout_height=\"@dimen/video_item_detail_like_image_height\"\n                                    android:layout_below=\"@id/detail_view_count_view\"\n                                    android:layout_marginLeft=\"@dimen/video_item_detail_like_margin\"\n                                    android:layout_toRightOf=\"@id/detail_thumbs_up_img_view\"\n                                    android:gravity=\"center_vertical\"\n                                    android:lines=\"1\"\n                                    android:textAppearance=\"?android:attr/textAppearanceMedium\"\n                                    android:textSize=\"@dimen/video_item_detail_likes_text_size\"\n                                    tools:ignore=\"RtlHardcoded\"\n                                    tools:text=\"12M\" />\n\n                                <ImageView\n                                    android:id=\"@+id/detail_thumbs_down_img_view\"\n                                    android:layout_width=\"@dimen/video_item_detail_like_image_width\"\n                                    android:layout_height=\"@dimen/video_item_detail_like_image_height\"\n                                    android:layout_below=\"@id/detail_view_count_view\"\n                                    android:layout_marginLeft=\"12dp\"\n                                    android:layout_toRightOf=\"@id/detail_thumbs_up_count_view\"\n                                    android:contentDescription=\"@string/detail_dislikes_img_view_description\"\n                                    android:src=\"@drawable/ic_thumb_down\"\n                                    tools:ignore=\"RtlHardcoded\" />\n\n                                <org.schabi.newpipe.views.NewPipeTextView\n                                    android:id=\"@+id/detail_thumbs_down_count_view\"\n                                    android:layout_width=\"wrap_content\"\n                                    android:layout_height=\"@dimen/video_item_detail_like_image_height\"\n                                    android:layout_below=\"@id/detail_view_count_view\"\n                                    android:layout_marginLeft=\"@dimen/video_item_detail_like_margin\"\n                                    android:layout_toRightOf=\"@id/detail_thumbs_down_img_view\"\n                                    android:gravity=\"center_vertical\"\n                                    android:lines=\"1\"\n                                    android:textAppearance=\"?android:attr/textAppearanceMedium\"\n                                    android:textSize=\"@dimen/video_item_detail_likes_text_size\"\n                                    tools:ignore=\"RtlHardcoded\"\n                                    tools:text=\"10K\" />\n\n                                <org.schabi.newpipe.views.NewPipeTextView\n                                    android:id=\"@+id/detail_thumbs_disabled_view\"\n                                    android:layout_width=\"wrap_content\"\n                                    android:layout_height=\"@dimen/video_item_detail_like_image_height\"\n                                    android:layout_below=\"@id/detail_view_count_view\"\n                                    android:layout_marginLeft=\"12dp\"\n                                    android:layout_toRightOf=\"@id/detail_thumbs_down_img_view\"\n                                    android:gravity=\"center_vertical\"\n                                    android:text=\"@string/disabled\"\n                                    android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                                    android:textSize=\"@dimen/video_item_detail_likes_text_size\"\n                                    android:textStyle=\"bold\"\n                                    android:visibility=\"gone\"\n                                    tools:ignore=\"RtlHardcoded\"\n                                    tools:visibility=\"visible\" />\n                            </RelativeLayout>\n                        </RelativeLayout>\n\n                        <!-- CONTROLS -->\n                        <LinearLayout\n                            android:id=\"@+id/detail_control_panel\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:descendantFocusability=\"afterDescendants\"\n                            android:focusable=\"true\"\n                            android:orientation=\"horizontal\"\n                            android:padding=\"@dimen/detail_control_padding\">\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_controls_playlist_append\"\n                                android:layout_width=\"@dimen/detail_control_width\"\n                                android:layout_height=\"@dimen/detail_control_height\"\n                                android:layout_gravity=\"center_vertical\"\n                                android:layout_weight=\"1\"\n                                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                                android:clickable=\"true\"\n                                android:contentDescription=\"@string/add_to_playlist\"\n                                android:drawableTop=\"@drawable/ic_playlist_add\"\n                                android:focusable=\"true\"\n                                android:gravity=\"center\"\n                                android:paddingVertical=\"@dimen/detail_control_padding\"\n                                android:text=\"@string/controls_add_to_playlist_title\"\n                                android:textSize=\"@dimen/detail_control_text_size\" />\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_controls_background\"\n                                android:layout_width=\"@dimen/detail_control_width\"\n                                android:layout_height=\"@dimen/detail_control_height\"\n                                android:layout_gravity=\"center_vertical\"\n                                android:layout_weight=\"1\"\n                                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                                android:clickable=\"true\"\n                                android:contentDescription=\"@string/play_audio\"\n                                android:drawableTop=\"@drawable/ic_headset\"\n                                android:focusable=\"true\"\n                                android:gravity=\"center\"\n                                android:paddingVertical=\"@dimen/detail_control_padding\"\n                                android:text=\"@string/controls_background_title\"\n                                android:textSize=\"@dimen/detail_control_text_size\" />\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_controls_popup\"\n                                android:layout_width=\"@dimen/detail_control_width\"\n                                android:layout_height=\"@dimen/detail_control_height\"\n                                android:layout_gravity=\"center_vertical\"\n                                android:layout_weight=\"1\"\n                                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                                android:clickable=\"true\"\n                                android:contentDescription=\"@string/open_in_popup_mode\"\n                                android:drawableTop=\"@drawable/ic_picture_in_picture\"\n                                android:focusable=\"true\"\n                                android:gravity=\"center\"\n                                android:paddingVertical=\"@dimen/detail_control_padding\"\n                                android:text=\"@string/controls_popup_title\"\n                                android:textSize=\"@dimen/detail_control_text_size\" />\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_controls_download\"\n                                android:layout_width=\"@dimen/detail_control_width\"\n                                android:layout_height=\"@dimen/detail_control_height\"\n                                android:layout_gravity=\"center_vertical\"\n                                android:layout_weight=\"1\"\n                                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                                android:clickable=\"true\"\n                                android:contentDescription=\"@string/controls_download_desc\"\n                                android:drawableTop=\"@drawable/ic_file_download\"\n                                android:focusable=\"true\"\n                                android:gravity=\"center\"\n                                android:paddingVertical=\"@dimen/detail_control_padding\"\n                                android:text=\"@string/download\"\n                                android:textSize=\"@dimen/detail_control_text_size\" />\n\n                        </LinearLayout>\n\n                        <!-- SECONDARY CONTROLS -->\n                        <LinearLayout\n                            android:id=\"@+id/detail_secondary_control_panel\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:descendantFocusability=\"afterDescendants\"\n                            android:focusable=\"true\"\n                            android:orientation=\"horizontal\"\n                            android:paddingHorizontal=\"@dimen/detail_control_padding\"\n                            android:paddingBottom=\"@dimen/detail_control_padding\"\n                            android:visibility=\"gone\"\n                            tools:visibility=\"visible\">\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_controls_share\"\n                                android:layout_width=\"@dimen/detail_control_width\"\n                                android:layout_height=\"@dimen/detail_control_height\"\n                                android:layout_gravity=\"center_vertical\"\n                                android:layout_weight=\"1\"\n                                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                                android:clickable=\"true\"\n                                android:contentDescription=\"@string/share\"\n                                android:drawableTop=\"@drawable/ic_share\"\n                                android:focusable=\"true\"\n                                android:gravity=\"center\"\n                                android:paddingVertical=\"@dimen/detail_control_padding\"\n                                android:text=\"@string/share\"\n                                android:textSize=\"@dimen/detail_control_text_size\" />\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_controls_open_in_browser\"\n                                android:layout_width=\"@dimen/detail_control_width\"\n                                android:layout_height=\"@dimen/detail_control_height\"\n                                android:layout_gravity=\"center_vertical\"\n                                android:layout_weight=\"1\"\n                                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                                android:clickable=\"true\"\n                                android:contentDescription=\"@string/open_in_browser\"\n                                android:drawableTop=\"@drawable/ic_language\"\n                                android:focusable=\"true\"\n                                android:gravity=\"center\"\n                                android:paddingVertical=\"@dimen/detail_control_padding\"\n                                android:text=\"@string/open_in_browser\"\n                                android:textSize=\"@dimen/detail_control_text_size\" />\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_controls_play_with_kodi\"\n                                android:layout_width=\"@dimen/detail_control_width\"\n                                android:layout_height=\"@dimen/detail_control_height\"\n                                android:layout_gravity=\"center_vertical\"\n                                android:layout_weight=\"1\"\n                                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                                android:clickable=\"true\"\n                                android:contentDescription=\"@string/play_with_kodi_title\"\n                                android:drawableTop=\"@drawable/ic_cast\"\n                                android:focusable=\"true\"\n                                android:gravity=\"center\"\n                                android:paddingVertical=\"@dimen/detail_control_padding\"\n                                android:text=\"@string/play_with_kodi_title\"\n                                android:textSize=\"@dimen/detail_control_text_size\" />\n\n                            <org.schabi.newpipe.views.NewPipeTextView\n                                android:id=\"@+id/detail_controls_crash_the_player\"\n                                android:layout_width=\"@dimen/detail_control_width\"\n                                android:layout_height=\"@dimen/detail_control_height\"\n                                android:layout_gravity=\"center_vertical\"\n                                android:layout_weight=\"1\"\n                                android:background=\"?attr/selectableItemBackgroundBorderless\"\n                                android:clickable=\"true\"\n                                android:contentDescription=\"@string/crash_the_player\"\n                                android:drawableTop=\"@drawable/ic_bug_report\"\n                                android:focusable=\"true\"\n                                android:gravity=\"center\"\n                                android:paddingVertical=\"@dimen/detail_control_padding\"\n                                android:text=\"@string/crash_the_player\"\n                                android:textSize=\"@dimen/detail_control_text_size\" />\n\n                        </LinearLayout>\n\n                        <View\n                            android:id=\"@+id/detail_meta_info_separator\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"1px\"\n                            android:layout_marginLeft=\"8dp\"\n                            android:layout_marginRight=\"8dp\"\n                            android:background=\"?attr/separator_color\" />\n\n                        <org.schabi.newpipe.views.NewPipeTextView\n                            android:id=\"@+id/detail_meta_info_text_view\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:gravity=\"center\"\n                            android:padding=\"12dp\"\n                            android:textSize=\"@dimen/video_item_detail_description_text_size\"\n                            tools:text=\"Stream meta info with link\" />\n\n                        <View\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"1px\"\n                            android:layout_marginLeft=\"8dp\"\n                            android:layout_marginRight=\"8dp\"\n                            android:background=\"?attr/separator_color\" />\n\n                    </LinearLayout>\n                </RelativeLayout>\n            </com.google.android.material.appbar.AppBarLayout>\n\n            <androidx.viewpager.widget.ViewPager\n                android:id=\"@+id/view_pager\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:paddingBottom=\"48dp\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n            <com.google.android.material.tabs.TabLayout\n                android:id=\"@+id/tab_layout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"bottom|center\"\n                app:elevation=\"16dp\"\n                app:tabBackground=\"?attr/windowBackground\"\n                app:tabGravity=\"fill\"\n                app:tabIconTint=\"?attr/colorAccent\"\n                app:tabIndicatorGravity=\"top\" />\n\n        </org.schabi.newpipe.views.FocusAwareCoordinator>\n\n        <androidx.fragment.app.FragmentContainerView\n            android:id=\"@+id/relatedItemsLayout\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_weight=\"3\" />\n    </LinearLayout>\n\n\n    <RelativeLayout\n        android:id=\"@+id/overlay_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:alpha=\"0.9\"\n        android:background=\"?attr/windowBackground\"\n        android:descendantFocusability=\"blocksDescendants\">\n\n        <ImageButton\n            android:id=\"@+id/overlay_thumbnail\"\n            android:layout_width=\"85dp\"\n            android:layout_height=\"60dp\"\n            android:layout_alignParentStart=\"true\"\n            android:background=\"@color/transparent_background_color\"\n            android:gravity=\"center_vertical\"\n            android:paddingLeft=\"@dimen/video_item_search_padding\"\n            android:paddingRight=\"@dimen/video_item_search_padding\"\n            android:scaleType=\"fitCenter\"\n            android:src=\"@drawable/placeholder_thumbnail_video\" />\n\n        <LinearLayout\n            android:id=\"@+id/overlay_metadata_layout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"60dp\"\n            android:layout_toStartOf=\"@+id/overlay_buttons_layout\"\n            android:layout_toEndOf=\"@+id/overlay_thumbnail\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:gravity=\"center_vertical\"\n            android:orientation=\"vertical\"\n            android:theme=\"@style/ContrastTintTheme\"\n            tools:ignore=\"RtlHardcoded\">\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/overlay_title_text_view\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"marquee\"\n                android:fadingEdge=\"horizontal\"\n                android:marqueeRepeatLimit=\"marquee_forever\"\n                android:scrollHorizontally=\"true\"\n                android:singleLine=\"true\"\n                android:textAppearance=\"?android:attr/textAppearanceLarge\"\n                android:textSize=\"@dimen/video_item_search_title_text_size\"\n                tools:ignore=\"RtlHardcoded\"\n                tools:text=\"The Video Title LONG very LONVideo Title LONG very LONG\" />\n\n            <org.schabi.newpipe.views.NewPipeTextView\n                android:id=\"@+id/overlay_channel_text_view\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:ellipsize=\"marquee\"\n                android:fadingEdge=\"horizontal\"\n                android:marqueeRepeatLimit=\"marquee_forever\"\n                android:scrollHorizontally=\"true\"\n                android:singleLine=\"true\"\n                android:textAppearance=\"?android:attr/textAppearanceSmall\"\n                android:textSize=\"@dimen/video_item_search_uploader_text_size\"\n                tools:text=\"The Video Artist  LONG very LONG very Long\" />\n\n        </LinearLayout>\n\n        <LinearLayout\n            android:id=\"@+id/overlay_buttons_layout\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"60dp\"\n            android:layout_alignParentEnd=\"true\"\n            android:gravity=\"center_vertical\"\n            android:theme=\"@style/ContrastTintTheme\"\n            tools:ignore=\"RtlHardcoded\">\n\n            <ImageButton\n                android:id=\"@+id/overlay_play_queue_button\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"match_parent\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:contentDescription=\"@string/title_activity_play_queue\"\n                android:scaleType=\"center\"\n                android:src=\"@drawable/ic_list\"\n                tools:ignore=\"ContentDescription,RtlHardcoded\" />\n\n            <ImageButton\n                android:id=\"@+id/overlay_play_pause_button\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"match_parent\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:contentDescription=\"@string/pause\"\n                android:focusable=\"true\"\n                android:focusedByDefault=\"true\"\n                android:scaleType=\"center\"\n                android:src=\"@drawable/ic_play_arrow\" />\n\n            <ImageButton\n                android:id=\"@+id/overlay_close_button\"\n                android:layout_width=\"48dp\"\n                android:layout_height=\"match_parent\"\n                android:background=\"?attr/selectableItemBackground\"\n                android:contentDescription=\"@string/close\"\n                android:paddingRight=\"8dp\"\n                android:scaleType=\"center\"\n                android:src=\"@drawable/ic_close\"\n                tools:ignore=\"RtlSymmetry\" />\n\n        </LinearLayout>\n\n    </RelativeLayout>\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/menu/dialog_url.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/okay\"\n        android:title=\"@string/ok\"\n        app:showAsAction=\"always\" />\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/download_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <item\n        android:id=\"@+id/switch_mode\"\n        android:icon=\"@drawable/ic_apps\"\n        android:title=\"@string/grid\"\n        app:showAsAction=\"always\"\n        tools:ignore=\"AlwaysShowAction\" />\n\n    <item\n        android:id=\"@+id/start_downloads\"\n        android:icon=\"@drawable/ic_play_arrow\"\n        android:title=\"@string/start_downloads\"\n        android:visible=\"false\"\n        app:showAsAction=\"ifRoom\" />\n\n    <item\n        android:id=\"@+id/pause_downloads\"\n        android:icon=\"@drawable/ic_pause\"\n        android:title=\"@string/pause_downloads\"\n        android:visible=\"false\"\n        app:showAsAction=\"ifRoom\" />\n\n    <item\n        android:id=\"@+id/clear_list\"\n        android:icon=\"@drawable/ic_delete\"\n        android:title=\"@string/clear_download_history\"\n        android:visible=\"false\"\n        app:showAsAction=\"ifRoom\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/drawer_items.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <group android:id=\"@+id/menu_services_group\" />\n    <group android:id=\"@+id/menu_tabs_group\" />\n    <group android:id=\"@+id/menu_kiosks_group\" />\n    <group android:id=\"@+id/menu_options_about_group\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/error_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/menu_item_share_error\"\n        android:icon=\"@drawable/ic_share\"\n        android:title=\"@string/share\"\n        app:showAsAction=\"ifRoom\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_channel.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:context=\".fragments.list.impl.ChannelFragment\">\n\n    <item\n        android:id=\"@+id/menu_item_rss\"\n        android:icon=\"@drawable/ic_rss_feed\"\n        android:title=\"@string/rss_button_title\"\n        android:visible=\"false\"\n        app:showAsAction=\"ifRoom\"\n        tools:visible=\"true\" />\n\n    <item\n        android:id=\"@+id/menu_item_share\"\n        android:icon=\"@drawable/ic_share\"\n        android:title=\"@string/share\"\n        app:showAsAction=\"ifRoom\" />\n\n    <item\n        android:id=\"@+id/menu_item_notify\"\n        android:checkable=\"true\"\n        android:orderInCategory=\"1\"\n        android:title=\"@string/get_notified\"\n        android:visible=\"false\"\n        app:showAsAction=\"never\"\n        tools:visible=\"true\" />\n\n    <item\n        android:id=\"@+id/action_settings\"\n        android:orderInCategory=\"2\"\n        android:title=\"@string/settings\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/menu_item_openInBrowser\"\n        android:orderInCategory=\"3\"\n        android:title=\"@string/open_in_browser\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_chooser_fragment.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/menu_item_restore_default\"\n        android:title=\"@string/restore_defaults\"\n        android:icon=\"@drawable/ic_settings_backup_restore\"\n        app:showAsAction=\"always\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_feed_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/menu_item_feed_toggle_played_items\"\n        android:orderInCategory=\"2\"\n        android:icon=\"@drawable/ic_visibility_on\"\n        android:title=\"@string/feed_show_hide_streams\"\n        app:showAsAction=\"ifRoom\" />\n\n    <item\n        android:id=\"@+id/menu_item_feed_help\"\n        android:icon=\"@drawable/ic_help\"\n        android:title=\"@string/fast_mode\"\n        android:orderInCategory=\"4\"\n        app:showAsAction=\"ifRoom\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_feed_group_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <item\n        android:id=\"@+id/action_search\"\n        android:icon=\"@drawable/ic_search\"\n        android:title=\"@string/search\"\n        app:iconTint=\"@color/contrastColor\"\n        app:showAsAction=\"always\"\n        tools:ignore=\"AlwaysShowAction\" />\n\n    <item\n        android:id=\"@+id/feed_group_toggle_show_only_ungrouped_subscriptions\"\n        android:checkable=\"true\"\n        android:checked=\"false\"\n        android:title=\"@string/feed_group_show_only_ungrouped_subscriptions\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_history.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:context=\"org.schabi.newpipe.history.HistoryActivity\">\n\n    <item\n        android:id=\"@+id/action_history_clear\"\n        android:orderInCategory=\"940\"\n        android:title=\"@string/clear_views_history_title\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_local_playlist.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/menu_item_share_playlist\"\n        android:icon=\"@drawable/ic_share\"\n        android:title=\"@string/share\"\n        app:showAsAction=\"ifRoom\" />\n\n    <item\n        android:id=\"@+id/menu_item_rename_playlist\"\n        android:title=\"@string/rename_playlist\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/menu_item_remove_watched\"\n        android:title=\"@string/remove_watched\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/menu_item_remove_duplicates\"\n        android:title=\"@string/remove_duplicates\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_main_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/action_search\"\n        android:icon=\"@drawable/ic_search\"\n        android:orderInCategory=\"1\"\n        android:title=\"@string/search\"\n        app:showAsAction=\"always\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_notifications_channels.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/action_toggle_all\"\n        android:icon=\"@drawable/ic_checklist\"\n        android:title=\"@string/toggle_all\"\n        app:showAsAction=\"ifRoom\" />\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_play_queue.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:context=\".player.PlayQueueActivity\">\n\n    <item\n        android:id=\"@+id/action_append_playlist\"\n        android:icon=\"@drawable/ic_playlist_add\"\n        android:title=\"@string/add_to_playlist\"\n        android:visible=\"true\"\n        app:showAsAction=\"ifRoom\" />\n\n\n    <item\n        android:id=\"@+id/action_playback_speed\"\n        android:title=\"1x\"\n        android:tooltipText=\"@string/playback_speed_control\"\n        android:visible=\"true\"\n        app:showAsAction=\"ifRoom\" />\n\n    <item\n        android:id=\"@+id/action_audio_track\"\n        android:tooltipText=\"@string/audio_track\"\n        android:visible=\"false\"\n        app:showAsAction=\"ifRoom\">\n        <menu />\n    </item>\n\n    <item\n        android:id=\"@+id/action_mute\"\n        android:icon=\"@drawable/ic_volume_off\"\n        android:title=\"@string/mute\"\n        android:visible=\"true\"\n        app:showAsAction=\"ifRoom\" />\n\n    <item\n        android:id=\"@+id/action_settings\"\n        android:orderInCategory=\"1\"\n        android:title=\"@string/settings\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/action_system_audio\"\n        android:orderInCategory=\"2\"\n        android:title=\"@string/play_queue_audio_settings\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/action_switch_main\"\n        android:orderInCategory=\"3\"\n        android:title=\"@string/switch_to_main\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_play_queue_bg.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:context=\"org.schabi.newpipe.history.HistoryActivity\">\n\n    <item\n        android:id=\"@+id/action_switch_popup\"\n        android:orderInCategory=\"1999\"\n        android:title=\"@string/switch_to_popup\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/action_switch_background\"\n        android:orderInCategory=\"999\"\n        android:title=\"@string/switch_to_background\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_play_queue_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:id=\"@+id/menu_item_remove\"\n        android:title=\"@string/play_queue_remove\" />\n    <item\n        android:id=\"@+id/menu_item_details\"\n        android:title=\"@string/play_queue_stream_detail\" />\n    <item\n        android:id=\"@+id/menu_item_append_playlist\"\n        android:title=\"@string/add_to_playlist\" />\n    <item\n        android:id=\"@+id/menu_item_channel_details\"\n        android:title=\"@string/show_channel_details\" />\n    <item\n        android:id=\"@+id/menu_item_share\"\n        android:title=\"@string/share\" />\n    <item\n        android:id=\"@+id/menu_item_download\"\n        android:title=\"@string/download\" />\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_playlist.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <item\n        android:id=\"@+id/menu_item_share\"\n        android:icon=\"@drawable/ic_share\"\n        android:title=\"@string/share\"\n        app:showAsAction=\"ifRoom\" />\n\n    <item\n        android:id=\"@+id/menu_item_bookmark\"\n        android:icon=\"@drawable/ic_playlist_add\"\n        android:title=\"@string/bookmark_playlist\"\n        android:visible=\"true\"\n        app:showAsAction=\"ifRoom\"\n        tools:visible=\"true\" />\n\n    <item\n        android:id=\"@+id/action_settings\"\n        android:orderInCategory=\"1\"\n        android:title=\"@string/settings\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/menu_item_openInBrowser\"\n        android:orderInCategory=\"2\"\n        android:title=\"@string/open_in_browser\"\n        app:showAsAction=\"never\" />\n\n    <item\n        android:id=\"@+id/menu_item_append_playlist\"\n        android:orderInCategory=\"3\"\n        android:title=\"@string/add_to_playlist\"\n        app:showAsAction=\"never\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_recaptcha.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/menu_item_done\"\n        android:icon=\"@drawable/ic_done\"\n        android:title=\"@string/done\"\n        app:showAsAction=\"always\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_settings_main_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/action_search\"\n        android:icon=\"@drawable/ic_search\"\n        android:orderInCategory=\"1\"\n        android:title=\"@string/search\"\n        app:showAsAction=\"always\" />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/mission.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n        android:id=\"@+id/retry\"\n        android:title=\"@string/retry\" />\n\n    <item\n        android:id=\"@+id/cancel\"\n        android:title=\"@string/cancel\" />\n\n    <item\n        android:id=\"@+id/start\"\n        android:title=\"@string/start\" />\n\n    <item\n        android:id=\"@+id/pause\"\n        android:title=\"@string/pause\" />\n\n    <item\n        android:id=\"@+id/queue\"\n        android:checkable=\"true\"\n        android:title=\"@string/enqueue\" />\n\n    <item\n        android:id=\"@+id/menu_item_share\"\n        android:title=\"@string/share\" />\n\n    <item\n        android:id=\"@+id/delete\"\n        android:title=\"@string/delete_file\" />\n\n    <item\n        android:id=\"@+id/delete_entry\"\n        android:title=\"@string/delete_entry\" />\n\n    <item\n        android:id=\"@+id/error_message_view\"\n        android:title=\"@string/show_error\" />\n\n    <item\n        android:id=\"@+id/source\"\n        android:title=\"@string/show_info\" />\n\n    <item\n        android:id=\"@+id/checksum\"\n        android:title=\"@string/checksum\">\n\n        <menu>\n\n            <item\n                android:id=\"@+id/md5\"\n                android:title=\"@string/md5\" />\n\n            <item\n                android:id=\"@+id/sha1\"\n                android:title=\"@string/sha1\" />\n\n        </menu>\n\n    </item>\n</menu>\n"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\" />\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\" />\n    <monochrome android:drawable=\"@mipmap/ic_launcher_foreground\" />\n</adaptive-icon>\n"
  },
  {
    "path": "app/src/main/res/resources.properties",
    "content": "unqualifiedResLocale=en-US\n"
  },
  {
    "path": "app/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <attr name=\"progress_horizontal_drawable\" format=\"reference\" />\n    <!-- Can't refer to colors directly in drawable's xml-->\n    <attr name=\"toolbar_shadow\" format=\"reference\" />\n    <attr name=\"selector\" format=\"reference\" />\n    <attr name=\"checked_selector\" format=\"reference\" />\n    <attr name=\"focused_selector\" format=\"reference\" />\n    <attr name=\"dashed_border\" format=\"reference\" />\n\n    <attr name=\"actionColor\" format=\"color\" />\n    <attr name=\"separator_color\" format=\"color\" />\n    <attr name=\"contrast_background_color\" format=\"color\" />\n    <attr name=\"windowBackground\" format=\"color\" />\n    <attr name=\"colorPrimary\" format=\"color\" />\n    <attr name=\"toolbarSearchColor\" format=\"reference|color\" />\n\n    <attr name=\"card_item_background_color\" format=\"color\" />\n    <attr name=\"card_item_contrast_color\" format=\"color\" />\n    <attr name=\"border_color\" format=\"color\" />\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/bools.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <bool name=\"leak_canary_add_launcher_icon\">false</bool>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <color name=\"contrastColor\">@color/black</color>\n    <color name=\"defaultIconTint\">@color/black</color>\n\n    <color name=\"ic_launcher_background\">#CD201F</color>\n\n    <color name=\"placeholder_background\">#999999</color>\n    <color name=\"placeholder_foreground\">#6C6C6C</color>\n\n    <!-- Light Theme -->\n    <color name=\"light_background_color\">#EEEEEE</color>\n    <color name=\"light_dialog_background_color\">#EEEEEE</color>\n    <color name=\"light_settings_accent_color\">#e53935</color>\n    <color name=\"light_separator_color\">#32000000</color>\n    <color name=\"light_ripple_color\">#48868686</color>\n    <color name=\"light_selected_color\">#2a868686</color>\n    <color name=\"light_contrast_background_color\">#1fa6a6a6</color>\n    <color name=\"light_shadow_start_color\">#5a000000</color>\n    <color name=\"light_license_background_color\">#ffffff</color>\n    <color name=\"light_license_text_color\">#212121</color>\n    <color name=\"light_card_item_background_color\">#F8F8F8</color>\n    <color name=\"light_card_item_contrast_color\">#E9E9E9</color>\n    <color name=\"light_border_color\">#33000000</color>\n\n    <!-- Dark Theme -->\n    <color name=\"dark_background_color\">#222222</color>\n    <color name=\"dark_dialog_background_color\">#424242</color>\n    <color name=\"dark_settings_accent_color\">#ff5252</color>\n    <color name=\"dark_separator_color\">#0affffff</color>\n    <color name=\"dark_ripple_color\">#48ffffff</color>\n    <color name=\"dark_selected_color\">#2affffff</color>\n    <color name=\"dark_contrast_background_color\">#1f717171</color>\n    <color name=\"dark_shadow_start_color\">#82000000</color>\n    <color name=\"dark_license_background_color\">#424242</color>\n    <color name=\"dark_license_text_color\">#ffffff</color>\n    <color name=\"dark_queue_background_color\">#af000000</color>\n    <color name=\"dark_card_item_background_color\">#313131</color>\n    <color name=\"dark_card_item_contrast_color\">#474747</color>\n    <color name=\"dark_border_color\">#33FFFFFF</color>\n\n    <!-- Black Theme -->\n    <color name=\"black_background_color\">#000000</color>\n    <color name=\"black_settings_accent_color\">@color/dark_settings_accent_color</color>\n    <color name=\"black_separator_color\">#1effffff</color>\n    <color name=\"black_contrast_background_color\">#23454545</color>\n    <color name=\"black_card_item_background_color\">#0F0F0F</color>\n    <color name=\"black_card_item_contrast_color\">#202020</color>\n    <color name=\"black_border_color\">#25FFFFFF</color>\n\n    <!-- Miscellaneous -->\n    <color name=\"queue_background_color\">@color/dark_queue_background_color</color>\n    <color name=\"drawer_header_font_color\">#F2FFFFFF</color>\n    <color name=\"duration_background_color\">#aa000000</color>\n    <color name=\"live_duration_background_color\">#c8E53935</color>\n    <color name=\"playlist_stream_count_background_color\">#e6000000</color>\n    <color name=\"duration_text_color\">#EEFFFFFF</color>\n    <color name=\"video_overlay_color\">#64000000</color>\n\n    <color name=\"subscribe_text_color\">#fff</color>\n    <color name=\"subscribed_background_color\">#d6d6d6</color>\n    <color name=\"subscribed_text_color\">#717171</color>\n\n    <color name=\"transparent_background_color\">#00000000</color>\n    <color name=\"selected_background_color\">#96717171</color>\n\n    <!-- GigaGet theme -->\n    <color name=\"bluegray\">#607D8B</color>\n\n    <!-- GigaGet download Theme colors -->\n    <color name=\"audio_left_to_load_color\">#555555</color>\n    <color name=\"audio_already_load_color\">#000000</color>\n    <color name=\"video_left_to_load_color\">#CD5656</color>\n    <color name=\"video_already_load_color\">#BC211D</color>\n    <color name=\"subtitle_left_to_load_color\">#008ea4</color>\n    <color name=\"subtitle_already_load_color\">#005a71</color>\n\n    <!-- GigaGet Component colors -->\n    <color name=\"white\">#FFFFFF</color>\n    <color name=\"white_secondary\">#C9CACB</color>\n\n    <color name=\"gray\">#616161</color>\n\n    <color name=\"black\">#000</color>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/colors_services.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- YouTube -->\n    <color name=\"light_youtube_primary_color\">#e53935</color>\n    <color name=\"light_youtube_accent_color\">#000000</color>\n\n    <color name=\"dark_youtube_primary_color\">#992722</color>\n    <color name=\"dark_youtube_accent_color\">#FFFFFF</color>\n\n    <!-- SoundCloud -->\n    <color name=\"light_soundcloud_primary_color\">#f57c00</color>\n    <color name=\"light_soundcloud_accent_color\">#000000</color>\n\n    <color name=\"dark_soundcloud_primary_color\">#a35300</color>\n    <color name=\"dark_soundcloud_accent_color\">#FFFFFF</color>\n\n    <!-- PeerTube -->\n    <color name=\"light_peertube_primary_color\">#ff6f00</color>\n    <color name=\"light_peertube_accent_color\">#000000</color>\n\n    <color name=\"dark_peertube_primary_color\">#a34700</color>\n    <color name=\"dark_peertube_accent_color\">#FFFFFF</color>\n\n    <!-- media.ccc.de -->\n    <color name=\"light_media_ccc_primary_color\">#9e9e9e</color>\n    <color name=\"light_media_ccc_accent_color\">#000000</color>\n\n    <color name=\"dark_media_ccc_primary_color\">#878787</color>\n    <color name=\"dark_media_ccc_accent_color\">#FFFFFF</color>\n\n    <!-- Bandcamp -->\n    <color name=\"light_bandcamp_primary_color\">#17a0c4</color>\n    <color name=\"light_bandcamp_accent_color\">#000000</color>\n\n    <color name=\"dark_bandcamp_primary_color\">#1383a1</color>\n    <color name=\"dark_bandcamp_accent_color\">#FFFFFF</color>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Common dimensions -->\n    <dimen name=\"margin_normal\">16dp</dimen>\n    <dimen name=\"margin_small\">8dp</dimen>\n    <dimen name=\"spacing_mid\">12dp</dimen>\n    <dimen name=\"spacing_micro\">4dp</dimen>\n    <dimen name=\"spacing_nano\">2dp</dimen>\n\n    <!-- Menu Drawer Dimensions -->\n    <dimen name=\"drawer_header_content_min_height\">120dp</dimen>\n    <dimen name=\"drawer_header_padding_top\">16dp</dimen>\n    <dimen name=\"drawer_header_newpipe_icon_size\">48dp</dimen>\n    <dimen name=\"drawer_header_newpipe_icon_title_space\">12dp</dimen>\n    <dimen name=\"drawer_header_newpipe_title_default_width\">130dp</dimen>\n    <dimen name=\"drawer_header_newpipe_title_max_width\">200dp</dimen>\n    <dimen name=\"drawer_header_newpipe_title_min_text_size\">18sp</dimen>\n    <dimen name=\"drawer_header_newpipe_title_max_text_size\">32sp</dimen>\n    <dimen name=\"drawer_header_service_icon_size\">16dp</dimen>\n    <dimen name=\"drawer_header_service_title_text_size\">14sp</dimen>\n\n    <!-- Video Item Search View Dimensions-->\n    <!-- Text Size -->\n    <dimen name=\"channel_item_detail_title_text_size\">16sp</dimen>\n    <dimen name=\"video_item_search_title_text_size\">14sp</dimen>\n    <dimen name=\"video_item_search_duration_text_size\">11sp</dimen>\n    <dimen name=\"video_item_search_uploader_text_size\">11sp</dimen>\n    <dimen name=\"video_item_search_upload_date_text_size\">12sp</dimen>\n    <!-- Elements Size -->\n    <!-- 16 / 9 ratio-->\n    <dimen name=\"video_item_search_thumbnail_image_width\">124dp</dimen>\n    <dimen name=\"video_item_search_thumbnail_image_height\">70dp</dimen>\n    <dimen name=\"video_item_search_avatar_image_width\">70dp</dimen>\n    <dimen name=\"video_item_search_avatar_image_height\">70dp</dimen>\n    <dimen name=\"video_item_search_avatar_left_margin\">27dp</dimen>\n    <dimen name=\"video_item_search_avatar_right_margin\">33dp</dimen>\n    <dimen name=\"video_item_grid_thumbnail_image_width\">164dp</dimen>\n    <dimen name=\"video_item_grid_thumbnail_image_height\">92dp</dimen>\n\n    <dimen name=\"channel_item_card_thumbnail_image_size\">100dp</dimen>\n    <dimen name=\"channel_item_grid_thumbnail_image_size\">92dp</dimen>\n    <dimen name=\"channel_item_grid_min_width\">128dp</dimen>\n    <!-- Calculated: 2*video_item_search_padding + video_item_search_thumbnail_image_height -->\n    <dimen name=\"video_item_search_height\">96dp</dimen>\n    <!-- Paddings & Margins -->\n    <dimen name=\"video_item_search_padding\">12dp</dimen>\n    <dimen name=\"video_item_search_image_right_margin\">6dp</dimen>\n    <dimen name=\"video_item_search_duration_vertical_padding\">1sp</dimen>\n    <dimen name=\"video_item_search_duration_horizontal_padding\">5sp</dimen>\n    <dimen name=\"video_item_search_duration_margin\">2dp</dimen>\n    <dimen name=\"channel_item_grid_padding\">12dp</dimen>\n    <dimen name=\"comments_horizontal_padding\">16dp</dimen>\n    <dimen name=\"comments_vertical_padding\">12dp</dimen>\n\n    <!-- Players padding & sizes -->\n    <dimen name=\"player_main_controls_padding\">16dp</dimen>\n    <dimen name=\"player_popup_controls_padding\">6dp</dimen>\n    <dimen name=\"player_main_top_padding\">4dp</dimen>\n    <dimen name=\"player_main_buttons_padding\">6dp</dimen>\n    <dimen name=\"player_popup_buttons_padding\">1dp</dimen>\n    <dimen name=\"player_main_buttons_min_width\">40dp</dimen>\n    <dimen name=\"player_notification_thumbnail_width\">200dp</dimen>\n\n    <!-- Miscellaneous -->\n    <dimen name=\"popup_default_width\">180dp</dimen>\n    <dimen name=\"popup_minimum_width\">150dp</dimen>\n    <dimen name=\"comment_item_avatar_right_margin\">9dp</dimen>\n\n    <!-- Video Item Detail View Dimensions-->\n    <!-- Text Size -->\n    <dimen name=\"video_item_detail_title_text_size\">15sp</dimen>\n    <dimen name=\"video_item_detail_views_text_size\">13sp</dimen>\n    <dimen name=\"video_item_detail_likes_text_size\">12sp</dimen>\n    <dimen name=\"video_item_detail_uploader_text_size\">12sp</dimen>\n    <dimen name=\"video_item_detail_sub_channel_text_size\">14sp</dimen>\n    <dimen name=\"video_item_detail_upload_date_text_size\">13sp</dimen>\n    <dimen name=\"video_item_detail_description_text_size\">13sp</dimen>\n    <dimen name=\"channel_rss_title_size\">12sp</dimen>\n    <!-- Elements Size -->\n    <dimen name=\"video_item_detail_uploader_image_size\">32dp</dimen>\n    <dimen name=\"video_item_detail_pinned_image_width\">18sp</dimen>\n    <dimen name=\"video_item_detail_pinned_image_height\">18sp</dimen>\n    <dimen name=\"video_item_detail_sub_channel_image_size\">16dp</dimen>\n    <dimen name=\"video_item_detail_like_image_height\">18sp</dimen>\n    <dimen name=\"video_item_detail_like_image_width\">18sp</dimen>\n    <dimen name=\"video_item_detail_heart_image_size\">18sp</dimen>\n    <dimen name=\"channel_avatar_size\">70dp</dimen>\n    <dimen name=\"sub_channel_avatar_size\">35dp</dimen>\n    <dimen name=\"mini_player_height\">60dp</dimen>\n    <!-- Paddings & Margins -->\n    <dimen name=\"video_item_detail_pinned_right_margin\">5dp</dimen>\n    <dimen name=\"video_item_detail_like_margin\">5dp</dimen>\n    <dimen name=\"video_item_detail_heart_margin\">5dp</dimen>\n    <dimen name=\"video_item_detail_error_panel_margin\">50dp</dimen>\n    <!-- Control panel -->\n    <dimen name=\"detail_control_text_size\">12sp</dimen>\n    <dimen name=\"detail_control_width\">80dp</dimen>\n    <dimen name=\"detail_control_height\">55dp</dimen>\n    <dimen name=\"detail_control_padding\">6dp</dimen>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n    <dimen name=\"appbar_padding_top\">8dp</dimen>\n\n    <!-- Channel View Dimensions-->\n    <!-- Paddings & Margins -->\n    <dimen name=\"channel_item_description_to_details_margin\">4dp</dimen>\n\n    <!-- Playlist View Dimensions-->\n    <dimen name=\"playlist_item_thumbnail_stream_count_width\">60dp</dimen>\n    <dimen name=\"playlist_ctrl_height\">50dp</dimen>\n    <dimen name=\"playlist_ctrl_separator_margin\">10dp</dimen>\n    <!-- Text Size -->\n    <dimen name=\"playlist_detail_title_text_size\">16sp</dimen>\n    <dimen name=\"playlist_detail_subtext_size\">12sp</dimen>\n    <!-- Elements Size -->\n    <dimen name=\"playlist_detail_uploader_image_size\">24dp</dimen>\n    <dimen name=\"playlist_detail_uploader_layout_height\">28dp</dimen>\n\n    <!-- Play queue thumbnail view dimensions (16:9) -->\n    <dimen name=\"play_queue_thumbnail_width\">62dp</dimen>\n    <dimen name=\"play_queue_thumbnail_height\">35dp</dimen>\n\n    <!-- Kiosk view Dimensions-->\n\n    <!-- File picker dimensions -->\n    <dimen name=\"file_picker_items_text_size\">14sp</dimen>\n\n    <!-- Text Size -->\n    <dimen name=\"comment_item_title_text_size\">12sp</dimen>\n    <dimen name=\"comment_item_content_text_size\">12sp</dimen>\n\n    <!-- Feed Groups dimensions-->\n\n    <dimen name=\"search_suggestion_text_size\">16sp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/donottranslate.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"rss_button_title\">RSS</string>\n    <string name=\"vlc_package\">org.videolan.vlc</string>\n    <string name=\"kore_package\">org.xbmc.kore</string>\n    <string name=\"peertube_instance_list_url\">https://joinpeertube.org/instances#instances-list</string>\n    <string name=\"notification_channel_id\">newpipe</string>\n    <string name=\"app_update_notification_channel_id\">newpipeAppUpdate</string>\n    <string name=\"hash_channel_id\">newpipeHash</string>\n    <string name=\"error_report_channel_id\">newpipeErrorReport</string>\n    <string name=\"streams_notification_channel_id\" translatable=\"false\">newpipeNewStreams</string>\n    <string name=\"guru_meditation\">Guru Meditation.</string>\n    <string name=\"empty_view_no_videos\">@string/no_videos</string>\n    <string name=\"empty_view_no_comments\">@string/no_comments</string>\n    <string name=\"more_than_100_videos_mini\">100+</string>\n    <string name=\"infinite_videos_mini\">∞</string>\n    <string name=\"md5\">MD5</string>\n    <string name=\"sha1\">SHA-1</string>\n    <string name=\"recaptcha\">reCAPTCHA</string>\n    <string name=\"github_url\">https://github.com/TeamNewPipe/NewPipe</string>\n    <string name=\"donation_url\">https://newpipe.net/donate/</string>\n    <string name=\"website_url\">https://newpipe.net/</string>\n    <string name=\"privacy_policy_url\">https://newpipe.net/legal/privacy/</string>\n    <string name=\"faq_url\">https://newpipe.net/FAQ/</string>\n    <string name=\"service_kiosk_string\">%1$s/%2$s</string>\n    <string name=\"youtube\">YouTube</string>\n    <string name=\"preferred_open_action_share_menu_title\">@string/app_name</string>\n    <string name=\"leakcanary\">LeakCanary</string>\n    <string name=\"caption_file_name\">%1$s-%2$s</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/settings_keys.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" translatable=\"false\">\n    <!-- App versioning -->\n    <string name=\"last_used_preferences_version\">last_used_preferences_version</string>\n\n    <!-- Service -->\n    <string name=\"current_service_key\">service</string>\n    <string name=\"default_service_value\">@string/youtube</string>\n\n    <string name=\"saved_tabs_key\">saved_tabs_key</string>\n\n    <!-- Key values -->\n    <string name=\"kao_last_checked_key\">kao_last_checked</string>\n\n    <string name=\"download_path_video_key\">download_path</string>\n    <string name=\"download_path_audio_key\">download_path_audio</string>\n\n    <string name=\"use_external_video_player_key\">use_external_video_player</string>\n    <string name=\"use_external_audio_player_key\">use_external_audio_player</string>\n\n    <string name=\"resume_on_audio_focus_gain_key\">resume_on_audio_focus_gain</string>\n    <string name=\"popup_remember_size_pos_key\">popup_remember_size_pos_key</string>\n    <string name=\"use_inexact_seek_key\">use_inexact_seek_key</string>\n    <string name=\"auto_queue_key\">auto_queue_key</string>\n    <string name=\"screen_brightness_key\">screen_brightness_key</string>\n    <string name=\"screen_brightness_timestamp_key\">screen_brightness_timestamp_key</string>\n    <string name=\"clear_queue_confirmation_key\">clear_queue_confirmation_key</string>\n    <string name=\"ignore_hardware_media_buttons_key\">ignore_hardware_media_buttons_key</string>\n\n    <string name=\"popup_saved_width_key\">popup_saved_width</string>\n    <string name=\"popup_saved_x_key\">popup_saved_x</string>\n    <string name=\"popup_saved_y_key\">popup_saved_y</string>\n\n    <string name=\"seek_duration_key\">seek_duration</string>\n    <string name=\"seek_duration_default_value\">10000</string>\n    <string-array name=\"seek_duration_description\">\n        <!--   They are overridden in VideoAudioSettingsFragment.java if the translation\n        (seconds) exist. Otherwise this array is picked-->\n        <item>5 seconds</item>\n        <item>10 seconds</item>\n        <item>15 seconds</item>\n        <item>20 seconds</item>\n        <item>25 seconds</item>\n        <item>30 seconds</item>\n    </string-array>\n    <string-array name=\"seek_duration_value\">\n        <item>5000</item>\n        <item>10000</item>\n        <item>15000</item>\n        <item>20000</item>\n        <item>25000</item>\n        <item>30000</item>\n    </string-array>\n\n    <string name=\"progressive_load_interval_key\">progressive_load_interval</string>\n    <string name=\"progressive_load_interval_default_value\">64</string>\n    <string name=\"progressive_load_interval_exoplayer_default_value\">exoplayer_default</string>\n    <string-array name=\"progressive_load_interval_descriptions\">\n        <item>1 KiB</item>\n        <item>16 KiB</item>\n        <item>64 KiB</item>\n        <item>256 KiB</item>\n        <item>@string/progressive_load_interval_exoplayer_default</item>\n    </string-array>\n    <string-array name=\"progressive_load_interval_values\">\n        <item>1</item>\n        <item>16</item>\n        <item>@string/progressive_load_interval_default_value</item>\n        <item>256</item>\n        <item>@string/progressive_load_interval_exoplayer_default_value</item>\n    </string-array>\n\n    <string name=\"minimize_on_exit_key\">minimize_on_exit_key</string>\n    <string name=\"minimize_on_exit_value\">@string/minimize_on_exit_background_key</string>\n    <string name=\"minimize_on_exit_none_key\">minimize_on_exit_none_key</string>\n    <string name=\"minimize_on_exit_background_key\">minimize_on_exit_background_key</string>\n    <string name=\"minimize_on_exit_popup_key\">minimize_on_exit_popup_key</string>\n    <string-array name=\"minimize_on_exit_action_key\">\n        <item>@string/minimize_on_exit_none_key</item>\n        <item>@string/minimize_on_exit_background_key</item>\n        <item>@string/minimize_on_exit_popup_key</item>\n    </string-array>\n    <string-array name=\"minimize_on_exit_action_description\">\n        <item>@string/minimize_on_exit_none_description</item>\n        <item>@string/minimize_on_exit_background_description</item>\n        <item>@string/minimize_on_exit_popup_description</item>\n    </string-array>\n\n    <string name=\"start_main_player_fullscreen_key\">start_main_player_fullscreen_key</string>\n\n    <string name=\"autoplay_key\">autoplay_key</string>\n    <string name=\"autoplay_value\">@string/autoplay_wifi_key</string>\n    <string name=\"autoplay_always_key\">autoplay_always_key</string>\n    <string name=\"autoplay_wifi_key\">autoplay_wifi_key</string>\n    <string name=\"autoplay_never_key\">autoplay_never_key</string>\n    <string-array name=\"autoplay_type_key\">\n        <item>@string/autoplay_always_key</item>\n        <item>@string/autoplay_wifi_key</item>\n        <item>@string/autoplay_never_key</item>\n    </string-array>\n    <string-array name=\"autoplay_type_description\">\n        <item>@string/always</item>\n        <item>@string/wifi_only</item>\n        <item>@string/never</item>\n    </string-array>\n\n    <string name=\"seekbar_preview_thumbnail_key\">seekbar_preview_thumbnail_key</string>\n    <string name=\"seekbar_preview_thumbnail_high_quality\">seekbar_preview_thumbnail_high_quality</string>\n    <string name=\"seekbar_preview_thumbnail_low_quality\">seekbar_preview_thumbnail_low_quality</string>\n    <string name=\"seekbar_preview_thumbnail_none\">seekbar_preview_thumbnail_none</string>\n    <string-array name=\"seekbar_preview_thumbnail_type_key\">\n        <item>@string/seekbar_preview_thumbnail_high_quality</item>\n        <item>@string/seekbar_preview_thumbnail_low_quality</item>\n        <item>@string/seekbar_preview_thumbnail_none</item>\n    </string-array>\n    <string-array name=\"seekbar_preview_thumbnail_type_description\">\n        <item>@string/high_quality_larger</item>\n        <item>@string/low_quality_smaller</item>\n        <item>@string/dont_show</item>\n    </string-array>\n\n    <string name=\"default_resolution_key\">default_resolution</string>\n    <string name=\"default_resolution_value\">720p60</string>\n    <string name=\"show_higher_resolutions_key\">show_higher_resolutions</string>\n    <string name=\"default_popup_resolution_key\">default_popup_resolution</string>\n    <string name=\"default_popup_resolution_value\">480p</string>\n    <string name=\"best_resolution_key\">best_resolution</string>\n\n    <string-array name=\"high_resolution_list_values\">\n        <item>2160p</item>\n        <item>1440p</item>\n    </string-array>\n\n    <string-array name=\"high_resolution_list_descriptions\">\n        <item>2160p</item>\n        <item>1440p</item>\n    </string-array>\n\n    <string-array name=\"resolution_list_values\">\n        <item>@string/best_resolution_key</item>\n        <item>1080p60</item>\n        <item>1080p</item>\n        <item>720p60</item>\n        <item>720p</item>\n        <item>480p</item>\n        <item>360p</item>\n        <item>240p</item>\n        <item>144p</item>\n    </string-array>\n    <string-array name=\"resolution_list_description\">\n        <item>@string/best_resolution</item>\n        <item>1080p60</item>\n        <item>1080p</item>\n        <item>720p60</item>\n        <item>720p</item>\n        <item>480p</item>\n        <item>360p</item>\n        <item>240p</item>\n        <item>144p</item>\n    </string-array>\n\n    <string name=\"scale_to_square_image_in_notifications_key\">scale_to_square_image_in_notifications</string>\n\n    <string name=\"notification_slot_0_key\">notification_slot_0_key</string>\n    <string name=\"notification_slot_1_key\" tools:ignore=\"Typos\">notification_slot_1_key</string>\n    <string name=\"notification_slot_2_key\">notification_slot_2_key</string>\n    <string name=\"notification_slot_3_key\">notification_slot_3_key</string>\n    <string name=\"notification_slot_4_key\">notification_slot_4_key</string>\n\n    <string name=\"notification_slot_compact_0_key\">notification_slot_compact_0_key</string>\n    <string name=\"notification_slot_compact_1_key\" tools:ignore=\"Typos\">notification_slot_compact_1_key</string>\n    <string name=\"notification_slot_compact_2_key\">notification_slot_compact_2_key</string>\n\n    <string name=\"notification_colorize_key\">notification_colorize_key</string>\n\n    <string name=\"video_mp4_key\">video_mp4</string>\n    <string name=\"video_webm_key\">video_webm</string>\n    <string name=\"video_3gp_key\">video_3gp</string>\n    <string name=\"default_video_format_key\">default_video_format</string>\n    <string name=\"default_video_format_value\">@string/video_mp4_key</string>\n    <string-array name=\"video_format_description_list\">\n        <item>MPEG-4</item>\n        <item>WebM</item>\n        <item>3GP</item>\n    </string-array>\n    <string-array name=\"video_format_values_list\">\n        <item>@string/video_mp4_key</item>\n        <item>@string/video_webm_key</item>\n        <item>@string/video_3gp_key</item>\n    </string-array>\n\n    <string name=\"default_audio_format_key\">default_audio_format</string>\n    <string name=\"default_audio_format_value\">@string/audio_m4a_key</string>\n    <string name=\"audio_m4a_key\">audio_m4a</string>\n    <string name=\"audio_webm_key\">audio_webm</string>\n    <string-array name=\"audio_format_description_list\">\n        <item>M4A</item>\n        <item>WebM</item>\n    </string-array>\n    <string-array name=\"audio_format_values_list\">\n        <item>@string/audio_m4a_key</item>\n        <item>@string/audio_webm_key</item>\n    </string-array>\n\n    <string name=\"left_gesture_control_key\">left_gesture_control</string>\n    <string name=\"default_left_gesture_control_value\">@string/brightness_control_key</string>\n    <string name=\"brightness_control_key\">brightness_control</string>\n    <string name=\"volume_control_key\">volume_control</string>\n    <string name=\"none_control_key\">none_control</string>\n    <string-array name=\"left_gesture_control_description\">\n        <item>@string/brightness</item>\n        <item>@string/volume</item>\n        <item>@string/none</item>\n    </string-array>\n    <string-array name=\"left_gesture_control_values\">\n        <item>@string/brightness_control_key</item>\n        <item>@string/volume_control_key</item>\n        <item>@string/none_control_key</item>\n    </string-array>\n\n    <string name=\"right_gesture_control_key\">right_gesture_control</string>\n    <string name=\"default_right_gesture_control_value\">@string/volume_control_key</string>\n    <string-array name=\"right_gesture_control_description\">\n        <item>@string/volume</item>\n        <item>@string/brightness</item>\n        <item>@string/none</item>\n    </string-array>\n    <string-array name=\"right_gesture_control_values\">\n        <item>@string/volume_control_key</item>\n        <item>@string/brightness_control_key</item>\n        <item>@string/none_control_key</item>\n    </string-array>\n\n    <string name=\"prefer_original_audio_key\">prefer_original_audio</string>\n    <string name=\"prefer_descriptive_audio_key\">prefer_descriptive_audio</string>\n    <string name=\"last_resize_mode\">last_resize_mode</string>\n\n    <string name=\"reset_settings\">reset_settings</string>\n\n    <!-- DEBUG ONLY -->\n    <string name=\"debug_pref_screen_key\">debug_pref_screen_key</string>\n    <string name=\"allow_heap_dumping_key\">allow_heap_dumping_key</string>\n    <string name=\"show_memory_leaks_key\">show_memory_leaks_key</string>\n    <string name=\"allow_disposed_exceptions_key\">allow_disposed_exceptions_key</string>\n    <string name=\"show_original_time_ago_key\">show_original_time_ago_key</string>\n    <string name=\"show_crash_the_player_key\">show_crash_the_player_key</string>\n    <string name=\"check_new_streams_key\">check_new_streams</string>\n    <string name=\"crash_the_app_key\">crash_the_app_key</string>\n    <string name=\"show_error_snackbar_key\">show_error_snackbar_key</string>\n    <string name=\"create_error_notification_key\">create_error_notification_key</string>\n\n    <!-- THEMES -->\n    <string name=\"theme_key\">theme</string>\n    <string name=\"night_theme_key\">night_theme</string>\n    <string name=\"light_theme_key\">light_theme</string>\n    <string name=\"dark_theme_key\">dark_theme</string>\n    <string name=\"black_theme_key\">black_theme</string>\n    <string name=\"auto_device_theme_key\">auto_device_theme</string>\n    <string name=\"default_theme_value\">@string/auto_device_theme_key</string>\n    <string name=\"default_night_theme_value\">@string/dark_theme_key</string>\n    <string-array name=\"theme_values_list\">\n        <item>@string/light_theme_key</item>\n        <item>@string/dark_theme_key</item>\n        <item>@string/black_theme_key</item>\n        <item>@string/auto_device_theme_key</item>\n    </string-array>\n    <string-array name=\"theme_description_list\">\n        <item>@string/light_theme_title</item>\n        <item>@string/dark_theme_title</item>\n        <item>@string/black_theme_title</item>\n        <item>@string/auto_device_theme_title</item>\n    </string-array>\n    <string-array name=\"night_theme_values_list\">\n        <item>@string/dark_theme_key</item>\n        <item>@string/black_theme_key</item>\n    </string-array>\n    <string-array name=\"night_theme_description_list\">\n        <item>@string/dark_theme_title</item>\n        <item>@string/black_theme_title</item>\n    </string-array>\n\n    <!-- Caption Size -->\n    <string name=\"caption_settings_key\">caption_settings_key</string>\n    <string name=\"caption_user_set_key\">caption_user_set_key</string>\n\n    <!-- Main-Tabs Position -->\n    <string name=\"main_tabs_position_key\">main_tabs_position</string>\n\n    <!-- Content & History -->\n    <string name=\"show_channel_tabs_key\">channel_tabs</string>\n    <string name=\"show_channel_tabs_videos\">show_channel_tabs_videos</string>\n    <string name=\"show_channel_tabs_tracks\">show_channel_tabs_tracks</string>\n    <string name=\"show_channel_tabs_shorts\">show_channel_tabs_shorts</string>\n    <string name=\"show_channel_tabs_livestreams\">show_channel_tabs_livestreams</string>\n    <string name=\"show_channel_tabs_channels\">show_channel_tabs_channels</string>\n    <string name=\"show_channel_tabs_playlists\">show_channel_tabs_playlists</string>\n    <string name=\"show_channel_tabs_albums\">show_channel_tabs_albums</string>\n    <string name=\"show_channel_tabs_likes\">show_channel_tabs_likes</string>\n    <string name=\"show_channel_tabs_about\">show_channel_tabs_about</string>\n    <string-array name=\"show_channel_tabs_value_list\">\n        <item>@string/show_channel_tabs_videos</item>\n        <item>@string/show_channel_tabs_tracks</item>\n        <item>@string/show_channel_tabs_shorts</item>\n        <item>@string/show_channel_tabs_livestreams</item>\n        <item>@string/show_channel_tabs_channels</item>\n        <item>@string/show_channel_tabs_playlists</item>\n        <item>@string/show_channel_tabs_albums</item>\n        <item>@string/show_channel_tabs_likes</item>\n        <item>@string/show_channel_tabs_about</item>\n    </string-array>\n    <string-array name=\"show_channel_tabs_description_list\">\n        <item>@string/channel_tab_videos</item>\n        <item>@string/channel_tab_tracks</item>\n        <item>@string/channel_tab_shorts</item>\n        <item>@string/channel_tab_livestreams</item>\n        <item>@string/channel_tab_channels</item>\n        <item>@string/channel_tab_playlists</item>\n        <item>@string/channel_tab_albums</item>\n        <item>@string/channel_tab_likes</item>\n        <item>@string/channel_tab_about</item>\n    </string-array>\n    <string name=\"show_search_suggestions_key\">show_search_suggestions</string>\n    <string name=\"show_local_search_suggestions_key\">show_local_search_suggestions</string>\n    <string name=\"show_remote_search_suggestions_key\">show_remote_search_suggestions</string>\n    <string-array name=\"show_search_suggestions_value_list\">\n        <item>@string/show_local_search_suggestions_key</item>\n        <item>@string/show_remote_search_suggestions_key</item>\n    </string-array>\n    <string-array name=\"show_search_suggestions_description_list\">\n        <item>@string/local_search_suggestions</item>\n        <item>@string/remote_search_suggestions</item>\n    </string-array>\n    <string name=\"playback_adjust_by_semitones_key\">playback_adjust_by_semitones_key</string>\n    <string name=\"show_play_with_kodi_key\">show_play_with_kodi</string>\n    <string name=\"show_comments_key\">show_comments</string>\n    <string name=\"show_next_video_key\">show_next_video</string>\n    <string name=\"show_description_key\">show_description</string>\n    <string name=\"show_meta_info_key\">show_meta_info</string>\n    <string name=\"stream_info_selected_tab_key\">stream_info_selected_tab</string>\n    <string name=\"show_hold_to_append_key\">show_hold_to_append</string>\n    <string name=\"content_language_key\">content_language</string>\n    <string name=\"peertube_instance_setup_key\">peertube_instance_setup</string>\n    <string name=\"peertube_selected_instance_key\">peertube_selected_instance</string>\n    <string name=\"peertube_instance_list_key\">peertube_instance_list</string>\n    <string name=\"content_country_key\">content_country</string>\n    <string name=\"show_age_restricted_content\">show_age_restricted_content</string>\n    <string name=\"youtube_restricted_mode_enabled\">youtube_restricted_mode_enabled</string>\n    <string name=\"enable_search_history_key\">enable_search_history</string>\n    <string name=\"enable_watch_history_key\">enable_watch_history</string>\n    <string name=\"main_page_content_key\">main_page_content</string>\n    <string name=\"enable_playback_resume_key\">enable_playback_resume</string>\n    <string name=\"enable_playback_state_lists_key\">enable_playback_state_lists</string>\n    <string name=\"adjustment_step_key\">adjustment_step_key</string>\n    <string name=\"playback_unhook_key\">playback_unhook_key</string>\n    <string name=\"playback_speed_key\">playback_speed_key</string>\n    <string name=\"playback_pitch_key\">playback_pitch_key</string>\n    <string name=\"playback_skip_silence_key\">playback_skip_silence_key</string>\n\n    <string name=\"app_language_key\">app_language_key</string>\n    <string name=\"app_language_android_13_and_up_key\">app_language_android_13_and_up_key</string>\n\n    <string name=\"feed_update_threshold_key\">feed_update_threshold_key</string>\n    <string name=\"feed_update_threshold_default_value\">300</string>\n    <string name=\"feed_show_watched_items_key\">feed_show_played_items</string>\n    <string name=\"feed_show_partially_watched_items_key\">feed_show_partially_watched_items</string>\n    <string name=\"feed_show_future_items_key\">feed_show_future_items</string>\n\n    <string name=\"show_thumbnail_key\">show_thumbnail_key</string>\n\n    <!-- Values will be localized in runtime -->\n    <string-array name=\"feed_update_threshold_options\">\n        <item>@string/feed_update_threshold_option_always_update</item>\n        <item>5 minutes</item>\n        <item>15 minutes</item>\n        <item>1 hour</item>\n        <item>6 hours</item>\n        <item>12 hours</item>\n        <item>1 day</item>\n    </string-array>\n    <!-- Threshold values in seconds -->\n    <string-array name=\"feed_update_threshold_values\">\n        <item>0</item>\n        <item>300</item>\n        <item>900</item>\n        <item>3600</item>\n        <item>21600</item>\n        <item>43200</item>\n        <item>86400</item>\n    </string-array>\n    <string name=\"feed_use_dedicated_fetch_method_key\">feed_use_dedicated_fetch_method</string>\n\n    <string name=\"feed_fetch_channel_tabs_key\">feed_fetch_channel_tabs</string>\n    <string name=\"fetch_channel_tabs_videos\">fetch_channel_tabs_videos</string>\n    <string name=\"fetch_channel_tabs_tracks\">fetch_channel_tabs_tracks</string>\n    <string name=\"fetch_channel_tabs_shorts\">fetch_channel_tabs_shorts</string>\n    <string name=\"fetch_channel_tabs_livestreams\">fetch_channel_tabs_livestreams</string>\n    <string name=\"fetch_channel_tabs_likes\">fetch_channel_tabs_likes</string>\n    <string-array name=\"feed_fetch_channel_tabs_value_list\">\n        <item>@string/fetch_channel_tabs_videos</item>\n        <item>@string/fetch_channel_tabs_tracks</item>\n        <item>@string/fetch_channel_tabs_shorts</item>\n        <item>@string/fetch_channel_tabs_livestreams</item>\n        <item>@string/fetch_channel_tabs_likes</item>\n    </string-array>\n    <string-array name=\"feed_fetch_channel_tabs_description_list\">\n        <item>@string/channel_tab_videos</item>\n        <item>@string/channel_tab_tracks</item>\n        <item>@string/channel_tab_shorts</item>\n        <item>@string/channel_tab_livestreams</item>\n        <item>@string/channel_tab_likes</item>\n    </string-array>\n\n    <string name=\"import_export_data_path\">import_export_data_path</string>\n    <string name=\"import_data\">import_data</string>\n    <string name=\"export_data\">export_data</string>\n    <string name=\"import_subscriptions_key\">import_subscriptions_key</string>\n    <string name=\"export_subscriptions_key\">export_subscriptions_key</string>\n\n    <string name=\"clear_cookie_key\">clear_cookie</string>\n\n    <string name=\"metadata_cache_wipe_key\">cache_wipe_key</string>\n    <string name=\"clear_views_history_key\">clear_play_history</string>\n    <string name=\"clear_playback_states_key\">clear_playback_states</string>\n    <string name=\"clear_search_history_key\">clear_search_history</string>\n\n    <string name=\"last_used_download_type\">@string/last_download_type_video_key</string>\n    <string name=\"last_download_type_video_key\">last_dl_type_video</string>\n    <string name=\"last_download_type_audio_key\">last_dl_type_audio</string>\n    <string name=\"last_download_type_subtitle_key\">last_dl_type_subtitle</string>\n\n    <string name=\"downloads_storage_ask\">downloads_storage_ask</string>\n    <string name=\"storage_use_saf\">storage_use_saf</string>\n\n    <!-- FileName Downloads  -->\n    <string name=\"settings_file_charset_key\">file_rename_charset</string>\n    <string name=\"settings_file_replacement_character_key\">file_replacement_character</string>\n    <string name=\"settings_file_replacement_character_default_value\">_</string>\n\n\n    <string name=\"charset_letters_and_digits_value\">CHARSET_LETTERS_AND_DIGITS</string>\n    <string name=\"charset_most_special_value\">CHARSET_MOST_SPECIAL</string>\n\n    <string-array name=\"settings_filename_charset\">\n        <item>@string/charset_letters_and_digits_value</item>\n        <item>@string/charset_most_special_value</item>\n    </string-array>\n\n    <string-array name=\"settings_filename_charset_name\">\n        <item>@string/charset_letters_and_digits</item>\n        <item>@string/charset_most_special_characters</item>\n    </string-array>\n\n    <string name=\"default_file_charset_value\">@string/charset_most_special_value</string>\n\n    <string name=\"downloads_maximum_retry\">downloads_max_retry</string>\n    <string name=\"downloads_maximum_retry_default\">3</string>\n    <string-array name=\"downloads_maximum_retry_list\">\n        <item translatable=\"true\">@string/minimize_on_exit_none_description</item>\n        <item>1</item>\n        <item>2</item>\n        <item>3</item>\n        <item>4</item>\n        <item>5</item>\n        <item>7</item>\n        <item>10</item>\n        <item>15</item>\n    </string-array>\n\n    <string name=\"downloads_cross_network\">cross_network_downloads</string>\n    <string name=\"downloads_queue_limit\">downloads_queue_limit</string>\n\n    <string name=\"default_download_threads\">default_download_threads</string>\n\n    <!-- Preferred action on open (open from external app) -->\n    <string name=\"preferred_open_action_key\">preferred_open_action_key</string>\n    <string name=\"preferred_open_action_default\">@string/always_ask_open_action_key</string>\n    <string name=\"preferred_open_action_last_selected_key\">preferred_open_action_last_selected</string>\n\n    <string name=\"show_info_key\">show_info</string>\n    <string name=\"video_player_key\">video_player</string>\n    <string name=\"background_player_key\">background_player</string>\n    <string name=\"popup_player_key\">popup_player</string>\n    <string name=\"download_key\">download</string>\n    <string name=\"add_to_playlist_key\">add_to_playlist</string>\n    <string name=\"enqueue_key\">enqueue</string>\n    <string name=\"always_ask_open_action_key\">always_ask_player</string>\n\n    <string-array name=\"preferred_open_action_description_list\">\n        <item>@string/show_info</item>\n        <item>@string/video_player</item>\n        <item>@string/background_player</item>\n        <item>@string/popup_player</item>\n        <item>@string/download</item>\n        <item>@string/add_to_playlist</item>\n        <item>@string/enqueue_stream</item>\n        <item>@string/always_ask_open_action</item>\n    </string-array>\n    <string-array name=\"preferred_open_action_values_list\">\n        <item>@string/show_info_key</item>\n        <item>@string/video_player_key</item>\n        <item>@string/background_player_key</item>\n        <item>@string/popup_player_key</item>\n        <item>@string/download_key</item>\n        <item>@string/add_to_playlist_key</item>\n        <item>@string/always_ask_open_action_key</item>\n        <item>@string/enqueue_key</item>\n    </string-array>\n\n    <!-- Updates -->\n    <string name=\"update_check_consent_key\">update_check_consent_key</string>\n    <string name=\"update_app_key\">update_app_key</string>\n    <string name=\"manual_update_key\">manual_update_key</string>\n    <string name=\"update_pref_screen_key\">update_pref_screen_key</string>\n    <string name=\"update_expiry_key\">update_expiry_key</string>\n\n    <!-- Localizations   -->\n    <string name=\"default_localization_key\">system</string>\n    <!-- alternatively, load these from some local android data store -->\n    <string-array name=\"language_codes\">\n        <item>@string/default_localization_key</item>\n        <item>af</item>\n        <item>az</item>\n        <item>id</item>\n        <item>ms</item>\n        <item>ca</item>\n        <item>cs</item>\n        <item>da</item>\n        <item>de</item>\n        <item>et</item>\n        <item>en-GB</item>\n        <item>en</item>\n        <item>es</item>\n        <item>es-419</item>\n        <item>eu</item>\n        <item>fil</item>\n        <item>fr</item>\n        <item>fr-CA</item>\n        <item>gl</item>\n        <item>hr</item>\n        <item>zu</item>\n        <item>is</item>\n        <item>it</item>\n        <item>sw</item>\n        <item>lt</item>\n        <item>hu</item>\n        <item>nl</item>\n        <item>nqo</item>\n        <item>no</item>\n        <item>nn</item>\n        <item>uz</item>\n        <item>or</item>\n        <item>pl</item>\n        <item>pt-PT</item>\n        <item>pt</item>\n        <item>ro</item>\n        <item>sq</item>\n        <item>sk</item>\n        <item>sl</item>\n        <item>fi</item>\n        <item>sv</item>\n        <item>bo</item>\n        <item>vi</item>\n        <item>tr</item>\n        <item>bg</item>\n        <item>ky</item>\n        <item>mk</item>\n        <item>mn</item>\n        <item>ru</item>\n        <item>sr</item>\n        <item>uk</item>\n        <item>el</item>\n        <item>hy</item>\n        <item>iw</item>\n        <item>ur</item>\n        <item>ar</item>\n        <item>fa</item>\n        <item>ne</item>\n        <item>mr</item>\n        <item>hi</item>\n        <item>bn</item>\n        <item>pa</item>\n        <item>gu</item>\n        <item>ta</item>\n        <item>te</item>\n        <item>kn</item>\n        <item>ml</item>\n        <item>si</item>\n        <item>th</item>\n        <item>lo</item>\n        <item>my</item>\n        <item>ka</item>\n        <item>am</item>\n        <item>km</item>\n        <item>zh-CN</item>\n        <item>zh-TW</item>\n        <item>zh-HK</item>\n        <item>ja</item>\n        <item>ryu</item>\n        <item>ko</item>\n    </string-array>\n    <string-array name=\"language_names\">\n        <item>@string/systems_language</item>\n        <item>Afrikaans</item>\n        <item>Azərbaycanca</item>\n        <item>Bahasa Indonesia</item>\n        <item>Bahasa Malaysia</item>\n        <item>Català</item>\n        <item>Čeština</item>\n        <item>Dansk</item>\n        <item>Deutsch</item>\n        <item>Eesti</item>\n        <item>English (UK)</item>\n        <item>English (US)</item>\n        <item>Español (España)</item>\n        <item>Español (Latinoamérica)</item>\n        <item>Euskara</item>\n        <item>Filipino</item>\n        <item>Français</item>\n        <item>Français (Canada)</item>\n        <item>Galego</item>\n        <item>Hrvatski</item>\n        <item>IsiZulu</item>\n        <item>Íslenska</item>\n        <item>Italiano</item>\n        <item>Kiswahili</item>\n        <item>Lietuvių</item>\n        <item>Magyar</item>\n        <item>Nederlands</item>\n        <item>ߒߞߏ</item>\n        <item>Norsk</item>\n        <item>Nynorsk</item>\n        <item>O‘zbek</item>\n        <item>ଓଡ଼ିଆ</item>\n        <item>Polski</item>\n        <item>Português</item>\n        <item>Português (Brasil)</item>\n        <item>Română</item>\n        <item>Shqip</item>\n        <item>Slovenčina</item>\n        <item>Slovenščina</item>\n        <item>Suomi</item>\n        <item>Svenska</item>\n        <item>Tibetan བོད་སྐད།</item>\n        <item>Tiếng Việt</item>\n        <item>Türkçe</item>\n        <item>Български</item>\n        <item>Кыргызча</item>\n        <item>Македонски</item>\n        <item>Монгол</item>\n        <item>Русский</item>\n        <item>Српски</item>\n        <item>Українська</item>\n        <item>Ελληνικά</item>\n        <item>Հայերեն</item>\n        <item>עברית</item>\n        <item>اردو</item>\n        <item>العربية</item>\n        <item>فارسی</item>\n        <item>नेपाली</item>\n        <item>मराठी</item>\n        <item>हिन्दी</item>\n        <item>বাংলা</item>\n        <item>ਪੰਜਾਬੀ</item>\n        <item>ગુજરાતી</item>\n        <item>தமிழ்</item>\n        <item>తెలుగు</item>\n        <item>ಕನ್ನಡ</item>\n        <item>മലയാളം</item>\n        <item>සිංහල</item>\n        <item>ภาษาไทย</item>\n        <item>ລາວ</item>\n        <item>ဗမာ</item>\n        <item>ქართული</item>\n        <item>አማርኛ</item>\n        <item>ខ្មែរ</item>\n        <item>中文 (简体)</item>\n        <item>中文 (繁體)</item>\n        <item>中文 (香港)</item>\n        <item>日本語</item>\n        <item>うちなーぐち</item>\n        <item>한국어</item>\n    </string-array>\n\n\n    <string-array name=\"country_names\">\n        <item>@string/systems_language</item>\n        <item>Afghanistan</item>\n        <item>Aland Islands</item>\n        <item>Albania</item>\n        <item>Algeria</item>\n        <item>American Samoa</item>\n        <item>Andorra</item>\n        <item>Angola</item>\n        <item>Anguilla</item>\n        <item>Antartica</item>\n        <item>Antigua and Barbuda</item>\n        <item>Argentina</item>\n        <item>Armenia</item>\n        <item>Aruba</item>\n        <item>Australia</item>\n        <item>Austria</item>\n        <item>Azerbaijan</item>\n        <item>Bahamas</item>\n        <item>Bahrain</item>\n        <item>Bangladesh</item>\n        <item>Barbados</item>\n        <item>Belarus</item>\n        <item>Belgium</item>\n        <item>Belize</item>\n        <item>Benin</item>\n        <item>Bermuda</item>\n        <item>Bhutan</item>\n        <item>Bolivia</item>\n        <item>Bosnia and Herzegovina</item>\n        <item>Botswana</item>\n        <item>Bouvet Island</item>\n        <item>Brazil</item>\n        <item>British Virgin Islands</item>\n        <item>British Indian Ocean Territory</item>\n        <item>Brunei Darussalam</item>\n        <item>Bulgaria</item>\n        <item>Burkina Faso</item>\n        <item>Burundi</item>\n        <item>Cambodia</item>\n        <item>Cameroon</item>\n        <item>Canada</item>\n        <item>Cape Verde</item>\n        <item>Cayman Islands</item>\n        <item>Central African Republic</item>\n        <item>Chad</item>\n        <item>Chile</item>\n        <item>China</item>\n        <item>Hong Kong (China)</item>\n        <item>Macao (China)</item>\n        <item>Christmas Island</item>\n        <item>Cocos (Keeling) Islands</item>\n        <item>Colombia</item>\n        <item>Comoros</item>\n        <item>Brazzaville (Congo)</item>\n        <item>Kinshasa (Congo)</item>\n        <item>Cook Islands</item>\n        <item>Costa Rica</item>\n        <item>Côte d\\'Ivoire</item>\n        <item>Croatia</item>\n        <item>Cuba</item>\n        <item>Cyprus</item>\n        <item>Czech Republic</item>\n        <item>Denmark</item>\n        <item>Djibouti</item>\n        <item>Dominica</item>\n        <item>Dominican Republic</item>\n        <item>Ecuador</item>\n        <item>Egypt</item>\n        <item>El Salvador</item>\n        <item>Equatorial Guinea</item>\n        <item>Eritrea</item>\n        <item>Estonia</item>\n        <item>Ethiopia</item>\n        <item>Falkland Islands (Malvinas)</item>\n        <item>Faroe Islands</item>\n        <item>Fiji</item>\n        <item>Finland</item>\n        <item>France</item>\n        <item>French Guiana</item>\n        <item>French Polynesia</item>\n        <item>French Southern Territories</item>\n        <item>Gabon</item>\n        <item>Gambia</item>\n        <item>Georgia</item>\n        <item>Germany</item>\n        <item>Ghana</item>\n        <item>Gibraltar</item>\n        <item>Greece</item>\n        <item>Greenland</item>\n        <item>Grenada</item>\n        <item>Guadeloupe</item>\n        <item>Guam</item>\n        <item>Guatemala</item>\n        <item>Guernsey</item>\n        <item>Guinea</item>\n        <item>Guinea-Bissau</item>\n        <item>Guyana</item>\n        <item>Haiti</item>\n        <item>Heard and McDonald Islands</item>\n        <item>Holy See (Vatican City State)</item>\n        <item>Honduras</item>\n        <item>Hungary</item>\n        <item>Iceland</item>\n        <item>India</item>\n        <item>Indonesia</item>\n        <item>Iran</item>\n        <item>Iraq</item>\n        <item>Ireland</item>\n        <item>Isle of Man</item>\n        <item>Israel</item>\n        <item>Italy</item>\n        <item>Jamaica</item>\n        <item>Japan</item>\n        <item>Jersey</item>\n        <item>Jordan</item>\n        <item>Kazakhstan</item>\n        <item>Kenya</item>\n        <item>Kiribati</item>\n        <item>North Korea</item>\n        <item>South Korea</item>\n        <item>Kuwait</item>\n        <item>Kyrgyzstan</item>\n        <item>Lao</item>\n        <item>Latvia</item>\n        <item>Lebanon</item>\n        <item>Lesotho</item>\n        <item>Liberia</item>\n        <item>Libya</item>\n        <item>Liechtenstein</item>\n        <item>Lithuania</item>\n        <item>Luxembourg</item>\n        <item>Macedonia</item>\n        <item>Madagascar</item>\n        <item>Malawi</item>\n        <item>Malaysia</item>\n        <item>Maldives</item>\n        <item>Mali</item>\n        <item>Malta</item>\n        <item>Marshall Islands</item>\n        <item>Martinique</item>\n        <item>Mauritania</item>\n        <item>Mauritius</item>\n        <item>Mayotte</item>\n        <item>Mexico</item>\n        <item>Micronesia</item>\n        <item>Moldova</item>\n        <item>Monaco</item>\n        <item>Mongolia</item>\n        <item>Montenegro</item>\n        <item>Montserrat</item>\n        <item>Morocco</item>\n        <item>Mozambique</item>\n        <item>Myanmar</item>\n        <item>Namibia</item>\n        <item>Nauru</item>\n        <item>Nepal</item>\n        <item>Netherlands</item>\n        <item>Netherlands Antilles</item>\n        <item>New Caledonia</item>\n        <item>New Zealand</item>\n        <item>Nicaragua</item>\n        <item>Niger</item>\n        <item>Nigeria</item>\n        <item>Niue</item>\n        <item>Norfolk Island</item>\n        <item>Northern Mariana Islands</item>\n        <item>Norway</item>\n        <item>Oman</item>\n        <item>Pakistan</item>\n        <item>Palau</item>\n        <item>Palestine</item>\n        <item>Panama</item>\n        <item>Papua New Guinea</item>\n        <item>Paraguay</item>\n        <item>Peru</item>\n        <item>Philippines</item>\n        <item>Pitcairn</item>\n        <item>Poland</item>\n        <item>Portugal</item>\n        <item>Puerto Rico</item>\n        <item>Qatar</item>\n        <item>Réunion</item>\n        <item>Romania</item>\n        <item>Russian Federation</item>\n        <item>Rwanda</item>\n        <item>Saint Barthélemy</item>\n        <item>Saint Helena</item>\n        <item>Saint Kitts and Nevis</item>\n        <item>Saint Lucia</item>\n        <item>Saint Martin</item>\n        <item>Saint Pierre and Miquelon</item>\n        <item>Saint Vincent and Grenadines</item>\n        <item>Samoa</item>\n        <item>San Marino</item>\n        <item>Sao Tome and Principe</item>\n        <item>Saudi Arabia</item>\n        <item>Senegal</item>\n        <item>Serbia</item>\n        <item>Seychelles</item>\n        <item>Sierra Leone</item>\n        <item>Singapore</item>\n        <item>Slovakia</item>\n        <item>Slovenia</item>\n        <item>Solomon Islands</item>\n        <item>Somalia</item>\n        <item>South Africa</item>\n        <item>South Georgia and South Sandwich Islands</item>\n        <item>South Sudan</item>\n        <item>Spain</item>\n        <item>Sri Lanka</item>\n        <item>Sudan</item>\n        <item>Suriname</item>\n        <item>Svalbard and Jan Mayen Islands</item>\n        <item>Swaziland</item>\n        <item>Sweden</item>\n        <item>Switzerland</item>\n        <item>Syrian Arab Republic (Syria)</item>\n        <item>Taiwan</item>\n        <item>Tajikistan</item>\n        <item>Tanzania</item>\n        <item>Thailand</item>\n        <item>Timor Leste</item>\n        <item>Togo</item>\n        <item>Tokelau</item>\n        <item>Tonga</item>\n        <item>Trinidad and Tobago</item>\n        <item>Tunisia</item>\n        <item>Turkey</item>\n        <item>Turkmenistan</item>\n        <item>Turks and Caicos Islands</item>\n        <item>Tuvalu</item>\n        <item>Uganda</item>\n        <item>Ukraine</item>\n        <item>United Arab Emirates</item>\n        <item>United Kingdom</item>\n        <item>United States</item>\n        <item>Minor Outlying Islands</item>\n        <item>Uruguay</item>\n        <item>Uzbekistan</item>\n        <item>Vanuatu</item>\n        <item>Venezuela (Bolivarian Republic)</item>\n        <item>Vietnam</item>\n        <item>Virgin Islands</item>\n        <item>Wallis and Futuna Islands</item>\n        <item>Western Sahara</item>\n        <item>Yemen</item>\n        <item>Zambia</item>\n        <item>Zimbabwe</item>\n    </string-array>\n\n    <string-array name=\"country_codes\">\n        <item>@string/default_localization_key</item>\n        <item>AF</item>\n        <item>AX</item>\n        <item>AL</item>\n        <item>DZ</item>\n        <item>AS</item>\n        <item>AD</item>\n        <item>AO</item>\n        <item>AI</item>\n        <item>AQ</item>\n        <item>AG</item>\n        <item>AR</item>\n        <item>AM</item>\n        <item>AW</item>\n        <item>AU</item>\n        <item>AT</item>\n        <item>AZ</item>\n        <item>BS</item>\n        <item>BH</item>\n        <item>BD</item>\n        <item>BB</item>\n        <item>BY</item>\n        <item>BE</item>\n        <item>BZ</item>\n        <item>BJ</item>\n        <item>BM</item>\n        <item>BT</item>\n        <item>BO</item>\n        <item>BA</item>\n        <item>BW</item>\n        <item>BV</item>\n        <item>BR</item>\n        <item>VG</item>\n        <item>IO</item>\n        <item>BN</item>\n        <item>BG</item>\n        <item>BF</item>\n        <item>BI</item>\n        <item>KH</item>\n        <item>CM</item>\n        <item>CA</item>\n        <item>CV</item>\n        <item>KY</item>\n        <item>CF</item>\n        <item>TD</item>\n        <item>CL</item>\n        <item>CN</item>\n        <item>HK</item>\n        <item>MO</item>\n        <item>CX</item>\n        <item>CC</item>\n        <item>CO</item>\n        <item>KM</item>\n        <item>CG</item>\n        <item>CD</item>\n        <item>CK</item>\n        <item>CR</item>\n        <item>CI</item>\n        <item>HR</item>\n        <item>CU</item>\n        <item>CY</item>\n        <item>CZ</item>\n        <item>DK</item>\n        <item>DJ</item>\n        <item>DM</item>\n        <item>DO</item>\n        <item>EC</item>\n        <item>EG</item>\n        <item>SV</item>\n        <item>GQ</item>\n        <item>ER</item>\n        <item>EE</item>\n        <item>ET</item>\n        <item>FK</item>\n        <item>FO</item>\n        <item>FJ</item>\n        <item>FI</item>\n        <item>FR</item>\n        <item>GF</item>\n        <item>PF</item>\n        <item>TF</item>\n        <item>GA</item>\n        <item>GM</item>\n        <item>GE</item>\n        <item>DE</item>\n        <item>GH</item>\n        <item>GI</item>\n        <item>GR</item>\n        <item>GL</item>\n        <item>GD</item>\n        <item>GP</item>\n        <item>GU</item>\n        <item>GT</item>\n        <item>GG</item>\n        <item>GN</item>\n        <item>GW</item>\n        <item>GY</item>\n        <item>HT</item>\n        <item>HM</item>\n        <item>VA</item>\n        <item>HN</item>\n        <item>HU</item>\n        <item>IS</item>\n        <item>IN</item>\n        <item>ID</item>\n        <item>IR</item>\n        <item>IQ</item>\n        <item>IE</item>\n        <item>IM</item>\n        <item>IL</item>\n        <item>IT</item>\n        <item>JM</item>\n        <item>JP</item>\n        <item>JE</item>\n        <item>JO</item>\n        <item>KZ</item>\n        <item>KE</item>\n        <item>KI</item>\n        <item>KP</item>\n        <item>KR</item>\n        <item>KW</item>\n        <item>KG</item>\n        <item>LA</item>\n        <item>LV</item>\n        <item>LB</item>\n        <item>LS</item>\n        <item>LR</item>\n        <item>LY</item>\n        <item>LI</item>\n        <item>LT</item>\n        <item>LU</item>\n        <item>MK</item>\n        <item>MG</item>\n        <item>MW</item>\n        <item>MY</item>\n        <item>MV</item>\n        <item>ML</item>\n        <item>MT</item>\n        <item>MH</item>\n        <item>MQ</item>\n        <item>MR</item>\n        <item>MU</item>\n        <item>YT</item>\n        <item>MX</item>\n        <item>FM</item>\n        <item>MD</item>\n        <item>MC</item>\n        <item>MN</item>\n        <item>ME</item>\n        <item>MS</item>\n        <item>MA</item>\n        <item>MZ</item>\n        <item>MM</item>\n        <item>NA</item>\n        <item>NR</item>\n        <item>NP</item>\n        <item>NL</item>\n        <item>AN</item>\n        <item>NC</item>\n        <item>NZ</item>\n        <item>NI</item>\n        <item>NE</item>\n        <item>NG</item>\n        <item>NU</item>\n        <item>NF</item>\n        <item>MP</item>\n        <item>NO</item>\n        <item>OM</item>\n        <item>PK</item>\n        <item>PW</item>\n        <item>PS</item>\n        <item>PA</item>\n        <item>PG</item>\n        <item>PY</item>\n        <item>PE</item>\n        <item>PH</item>\n        <item>PN</item>\n        <item>PL</item>\n        <item>PT</item>\n        <item>PR</item>\n        <item>QA</item>\n        <item>RE</item>\n        <item>RO</item>\n        <item>RU</item>\n        <item>RW</item>\n        <item>BL</item>\n        <item>SH</item>\n        <item>KN</item>\n        <item>LC</item>\n        <item>MF</item>\n        <item>PM</item>\n        <item>VC</item>\n        <item>WS</item>\n        <item>SM</item>\n        <item>ST</item>\n        <item>SA</item>\n        <item>SN</item>\n        <item>RS</item>\n        <item>SC</item>\n        <item>SL</item>\n        <item>SG</item>\n        <item>SK</item>\n        <item>SI</item>\n        <item>SB</item>\n        <item>SO</item>\n        <item>ZA</item>\n        <item>GS</item>\n        <item>SS</item>\n        <item>ES</item>\n        <item>LK</item>\n        <item>SD</item>\n        <item>SR</item>\n        <item>SJ</item>\n        <item>SZ</item>\n        <item>SE</item>\n        <item>CH</item>\n        <item>SY</item>\n        <item>TW</item>\n        <item>TJ</item>\n        <item>TZ</item>\n        <item>TH</item>\n        <item>TL</item>\n        <item>TG</item>\n        <item>TK</item>\n        <item>TO</item>\n        <item>TT</item>\n        <item>TN</item>\n        <item>TR</item>\n        <item>TM</item>\n        <item>TC</item>\n        <item>TV</item>\n        <item>UG</item>\n        <item>UA</item>\n        <item>AE</item>\n        <item>GB</item>\n        <item>US</item>\n        <item>UM</item>\n        <item>UY</item>\n        <item>UZ</item>\n        <item>VU</item>\n        <item>VE</item>\n        <item>VN</item>\n        <item>VI</item>\n        <item>WF</item>\n        <item>EH</item>\n        <item>YE</item>\n        <item>ZM</item>\n        <item>ZW</item>\n    </string-array>\n\n    <!--The next two arrays are set to change the app language-->\n    <string-array name=\"app_language_code\">\n        <item>@string/default_localization_key</item>\n        <item>ace</item>\n        <item>ar</item>\n        <item>ar-ly</item>\n        <item>az</item>\n        <item>ast</item>\n        <item>be</item>\n        <item>ber</item>\n        <item>bg</item>\n        <item>bn</item>\n        <item>bn-bd</item>\n        <item>bn-in</item>\n        <item>br</item>\n        <item>bs</item>\n        <item>ca</item>\n        <item>ckb</item>\n        <item>cs</item>\n        <item>da</item>\n        <item>de</item>\n        <item>el</item>\n        <item>en</item>\n        <item>eo</item>\n        <item>es</item>\n        <item>et</item>\n        <item>eu</item>\n        <item>fa</item>\n        <item>fi</item>\n        <item>fil</item>\n        <item>fr</item>\n        <item>frc</item>\n        <item>gl</item>\n        <item>gu</item>\n        <item>he</item>\n        <item>hi</item>\n        <item>hr</item>\n        <item>hu</item>\n        <item>hy</item>\n        <item>ia</item>\n        <item>in</item>\n        <item>is</item>\n        <item>it</item>\n        <item>ja</item>\n        <item>jv</item>\n        <item>ka</item>\n        <item>kab</item>\n        <item>kmr</item>\n        <item>kn</item>\n        <item>ko</item>\n        <item>ku</item>\n        <item>la</item>\n        <item>lt</item>\n        <item>lv</item>\n        <item>mk</item>\n        <item>ml</item>\n        <item>mn</item>\n        <item>mr</item>\n        <item>ms</item>\n        <item>nb-no</item>\n        <item>nn</item>\n        <item>ne</item>\n        <item>nl</item>\n        <item>nl-be</item>\n        <!-- nn is placed next to nb-no -->\n        <item>nqo</item>\n        <item>oc</item>\n        <item>or</item>\n        <item>pa</item>\n        <item>pa-pk</item>\n        <item>pl</item>\n        <item>pt</item>\n        <item>pt-br</item>\n        <item>pt-pt</item>\n        <item>ro</item>\n        <item>ru</item>\n        <item>ryu</item>\n        <item>sat</item>\n        <item>sc</item>\n        <item>sk</item>\n        <item>sl</item>\n        <item>so</item>\n        <item>sq</item>\n        <item>sr</item>\n        <item>sv</item>\n        <item>ta</item>\n        <item>te</item>\n        <item>th</item>\n        <item>ti</item>\n        <item>tl</item>\n        <item>tok</item>\n        <item>tr</item>\n        <item>tt</item>\n        <item>tzm</item>\n        <item>uk</item>\n        <item>ur</item>\n        <item>uz</item>\n        <item>vi</item>\n        <item>zh-cn</item>\n        <item>zh-hk</item>\n        <item>zh-tw</item>\n    </string-array>\n    <string-array name=\"app_language_name\">\n        <item>@string/systems_language</item>\n        <item>Basa Acèh</item>\n        <item>العربية</item>\n        <item>العربية (ليبيا)</item>\n        <item>Azərbaycanca</item>\n        <item>Asturianu</item>\n        <item>Беларуская</item>\n        <item>ⵜⴰⵎⴰⵣⵉⵖⵜ</item>\n        <item>български език</item>\n        <item>বাংলা</item>\n        <item>বাংলা (বাংলাদেশ)</item>\n        <item>বাংলা (भारत)</item>\n        <item>Brezhoneg</item>\n        <item>Босански</item>\n        <item>Català</item>\n        <item>کوردیی سۆرانی</item>\n        <item>Čeština</item>\n        <item>Dansk</item>\n        <item>Deutsch</item>\n        <item>Ελληνικά</item>\n        <item>English</item>\n        <item>Esperanto</item>\n        <item>Español</item>\n        <item>Eesti keel</item>\n        <item>Euskara</item>\n        <item>فارسی</item>\n        <item>Suomen kieli</item>\n        <item>Wikang Filipino</item>\n        <item>Français</item>\n        <item>Français (Louisiana)</item>\n        <item>Galego</item>\n        <item>ગુજરાતી</item>\n        <item>עברית</item>\n        <item>हिन्दी</item>\n        <item>Hrvatski</item>\n        <item>magyar</item>\n        <item>Հայերեն</item>\n        <item>Interlingua</item>\n        <item>Bahasa Indonesia</item>\n        <item>Íslenska</item>\n        <item>Italiano</item>\n        <item>日本語</item>\n        <item>ꦧꦱꦗꦮ</item>\n        <item>ქართული</item>\n        <item>Taqbaylit</item>\n        <item>Kurmancî</item>\n        <item>ಕನ್ನಡ</item>\n        <item>한국어</item>\n        <item>کوردی</item>\n        <item>Latina</item>\n        <item>Lietuvių kalba</item>\n        <item>latviski</item>\n        <item>македонски јазик</item>\n        <item>മലയാളം</item>\n        <item>Монгол хэл</item>\n        <item>मराठी</item>\n        <item>Bahasa Melayu</item>\n        <item>Norsk bokmål</item>\n        <item>Norsk Nynorsk</item>\n        <item>नेपाली</item>\n        <item>Nederlands (NL)</item>\n        <item>Nederlands (BE)</item>\n        <!-- nn is placed next to nb-no -->\n        <item>ߒߞߏ</item>\n        <item>Occitan</item>\n        <item>ଓଡ଼ିଆ</item>\n        <item>ਪੰਜਾਬੀ</item>\n        <item>ਪੰਜਾਬੀ (PK)</item>\n        <item>Polski</item>\n        <item>Português</item>\n        <item>Português (BR)</item>\n        <item>Português (PT)</item>\n        <item>Română</item>\n        <item>Pусский</item>\n        <item>うちなーぐち</item>\n        <item>ᱥᱟᱱᱛᱟᱲᱤ</item>\n        <item>sardu</item>\n        <item>Slovenčina</item>\n        <item>Slovenščina</item>\n        <item>Soomaali</item>\n        <item>Shqip</item>\n        <item>Српски</item>\n        <item>Svenska</item>\n        <item>தமிழ்</item>\n        <item>తెలుగు</item>\n        <item>ไทย</item>\n        <item>ትግርኛ</item>\n        <item>Wikang Tagalog </item>\n        <item>Toki Pona</item>\n        <item>Türkçe</item>\n        <item>Татар теле</item>\n        <item>Tamaziɣt</item>\n        <item>українська мова</item>\n        <item>اردو</item>\n        <item>O‘zbek</item>\n        <item>Tiếng Việt</item>\n        <item>简体中文</item>\n        <item>繁體中文（廣東話）</item>\n        <item>正體中文</item>\n    </string-array>\n\n    <!-- Limit mobile data usage  -->\n    <string name=\"limit_mobile_data_usage_key\">limit_mobile_data_usage</string>\n    <string name=\"limit_data_usage_none_key\">limit_data_usage_none</string>\n    <string name=\"limit_mobile_data_usage_value\">@string/limit_data_usage_none_key</string>\n    <string-array name=\"limit_data_usage_values_list\">\n        <item>@string/limit_data_usage_none_key</item>\n        <item>1080p60</item>\n        <item>1080p</item>\n        <item>720p60</item>\n        <item>720p</item>\n        <item>480p</item>\n        <item>360p</item>\n        <item>240p</item>\n        <item>144p</item>\n    </string-array>\n\n    <string-array name=\"high_resolution_limit_data_usage_values_list\">\n        <item>2160p</item>\n        <item>1440p</item>\n    </string-array>\n\n    <string name=\"list_view_mode_key\">list_view_mode</string>\n    <string name=\"list_view_mode_value\">@string/list_view_mode_auto_key</string>\n\n    <!-- TODO: Use these across the app instead of hardcoding it -->\n    <string name=\"list_view_mode_auto_key\">auto</string>\n    <string name=\"list_view_mode_list_key\">list</string>\n    <string name=\"list_view_mode_grid_key\">grid</string>\n    <string name=\"list_view_mode_card_key\">card</string>\n\n    <string-array name=\"list_view_mode_values\">\n        <item>@string/list_view_mode_auto_key</item>\n        <item>@string/list_view_mode_list_key</item>\n        <item>@string/list_view_mode_grid_key</item>\n        <item>@string/list_view_mode_card_key</item>\n    </string-array>\n    <string-array name=\"list_view_mode_description\">\n        <item>@string/auto</item>\n        <item>@string/list</item>\n        <item>@string/grid</item>\n        <item>@string/card</item>\n    </string-array>\n\n    <string name=\"tablet_mode_key\">tablet_mode</string>\n\n    <string name=\"tablet_mode_auto_key\">auto</string>\n    <string name=\"tablet_mode_on_key\">on</string>\n    <string name=\"tablet_mode_off_key\">off</string>\n    <string-array name=\"tablet_mode_values\">\n        <item>@string/tablet_mode_auto_key</item>\n        <item>@string/tablet_mode_on_key</item>\n        <item>@string/tablet_mode_off_key</item>\n    </string-array>\n    <string-array name=\"tablet_mode_description\">\n        <item>@string/auto</item>\n        <item>@string/on</item>\n        <item>@string/off</item>\n    </string-array>\n\n    <string name=\"recaptcha_cookies_key\">recaptcha_cookies_key</string>\n\n    <string name=\"enable_streams_notifications\">enable_streams_notifications</string>\n    <string name=\"streams_notifications_interval_key\">streams_notifications_interval</string>\n    <string name=\"streams_notifications_interval_default\">14400</string>\n    <!-- Values will be localized in runtime -->\n    <string-array name=\"streams_notifications_interval_description\">\n        <item>15 minutes</item>\n        <item>30 minutes</item>\n        <item>1 hour</item>\n        <item>2 hours</item>\n        <item>4 hours</item>\n        <item>12 hours</item>\n        <item>1 day</item>\n    </string-array>\n    <!-- Notifications check frequency in seconds -->\n    <string-array name=\"streams_notifications_interval_values\">\n        <item>900</item>\n        <item>1800</item>\n        <item>3600</item>\n        <item>7200</item>\n        <item>14400</item>\n        <item>43200</item>\n        <item>86400</item>\n    </string-array>\n    <string name=\"streams_notifications_network_key\">streams_notifications_network</string>\n    <string name=\"streams_notifications_network_any\">any</string>\n    <string name=\"streams_notifications_network_wifi\">wifi</string>\n    <string name=\"streams_notifications_network_default\">@string/streams_notifications_network_wifi</string>\n    <string-array name=\"streams_notifications_network_values\">\n        <item>@string/streams_notifications_network_any</item>\n        <item>@string/streams_notifications_network_wifi</item>\n    </string-array>\n    <string-array name=\"streams_notifications_network_description\">\n        <item>@string/any_network</item>\n        <item>@string/wifi_only</item>\n    </string-array>\n    <string name=\"streams_notifications_channels_key\">streams_notifications_channels</string>\n    <string name=\"player_notification_screen_key\">player_notification_screen</string>\n\n    <!-- ExoPlayer settings -->\n    <string name=\"exoplayer_settings_key\">exoplayer_settings_key</string>\n    <string name=\"disable_media_tunneling_key\">disable_media_tunneling_key</string>\n    <string name=\"disabled_media_tunneling_automatically_key\">disabled_media_tunneling_automatically_key</string>\n    <string name=\"media_tunneling_device_blacklist_version\">media_tunneling_device_blacklist_version</string>\n    <string name=\"use_exoplayer_decoder_fallback_key\">use_exoplayer_decoder_fallback_key</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_key\">always_use_exoplayer_set_output_surface_workaround_key</string>\n\n    <!-- Image quality -->\n    <string name=\"image_quality_key\">image_quality_key</string>\n    <string name=\"image_quality_none_key\">image_quality_none</string>\n    <string name=\"image_quality_low_key\">image_quality_low</string>\n    <string name=\"image_quality_medium_key\">image_quality_medium</string>\n    <string name=\"image_quality_high_key\">image_quality_high</string>\n    <string name=\"image_quality_default\">@string/image_quality_medium_key</string>\n    <string-array name=\"image_quality_description\">\n        <item>@string/image_quality_none</item>\n        <item>@string/image_quality_low</item>\n        <item>@string/image_quality_medium</item>\n        <item>@string/image_quality_high</item>\n    </string-array>\n    <string-array name=\"image_quality_values\">\n        <item>@string/image_quality_none_key</item>\n        <item>@string/image_quality_low_key</item>\n        <item>@string/image_quality_medium_key</item>\n        <item>@string/image_quality_high_key</item>\n    </string-array>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:ignore=\"MissingTranslation\">\n    <string name=\"main_bg_subtitle\">Tap the magnifying glass to get started.</string>\n    <string name=\"upload_date_text\">Published on %1$s</string>\n    <string name=\"no_player_found\">No stream player found. Install VLC?</string>\n    <string name=\"no_player_found_toast\">No stream player found (you can install VLC to play it).</string>\n    <string name=\"install\">Install</string>\n    <string name=\"cancel\">Cancel</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"yes\">Yes</string>\n    <string name=\"no\">No</string>\n    <string name=\"open_in_browser\">Open in browser</string>\n    <string name=\"mark_as_watched\">Mark as watched</string>\n    <string name=\"open_in_popup_mode\">Open in popup mode</string>\n    <string name=\"open_with\">Open with</string>\n    <string name=\"share\">Share</string>\n    <string name=\"download\">Download</string>\n    <string name=\"controls_download_desc\">Download stream file</string>\n    <string name=\"search\">Search</string>\n    <string name=\"search_with_service_name\">Search %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Search %1$s (%2$s)</string>\n    <string name=\"settings\">Settings</string>\n    <string name=\"did_you_mean\">Did you mean \\\"%1$s\\\"?</string>\n    <string name=\"search_showing_result_for\">Showing results for: %s</string>\n    <string name=\"share_dialog_title\">Share with</string>\n    <string name=\"use_external_video_player_title\">Use external video player</string>\n    <string name=\"use_external_video_player_summary\">Removes audio at some resolutions</string>\n    <string name=\"use_external_audio_player_title\">Use external audio player</string>\n    <string name=\"subscribe_button_title\">Subscribe</string>\n    <string name=\"subscribed_button_title\">Subscribed</string>\n    <string name=\"unsubscribe\">Unsubscribe</string>\n    <string name=\"channel_unsubscribed\">Channel unsubscribed</string>\n    <string name=\"subscription_change_failed\">Could not change subscription</string>\n    <string name=\"subscription_update_failed\">Could not update subscription</string>\n    <string name=\"show_info\">Show info</string>\n    <string name=\"tab_subscriptions\">Subscriptions</string>\n    <string name=\"tab_bookmarks\">Bookmarked Playlists</string>\n    <string name=\"tab_bookmarks_short\">Playlists</string>\n    <string name=\"tab_choose\">Choose Tab</string>\n    <string name=\"controls_background_title\">Background</string>\n    <string name=\"controls_popup_title\">Popup</string>\n    <string name=\"controls_add_to_playlist_title\">Add To</string>\n    <string name=\"download_path_title\">Video download folder</string>\n    <string name=\"download_path_summary\">Downloaded video files are stored here</string>\n    <string name=\"download_path_dialog_title\">Choose download folder for video files</string>\n    <string name=\"download_path_audio_title\">Audio download folder</string>\n    <string name=\"download_path_audio_summary\">Downloaded audio files are stored here</string>\n    <string name=\"download_path_audio_dialog_title\">Choose download folder for audio files</string>\n    <string name=\"default_resolution_title\">Default resolution</string>\n    <string name=\"default_popup_resolution_title\">Default popup resolution</string>\n    <string name=\"show_higher_resolutions_title\">Show higher resolutions</string>\n    <string name=\"show_higher_resolutions_summary\">Only some devices can play 2K/4K videos</string>\n    <string name=\"play_with_kodi_title\">Play with Kodi</string>\n    <string name=\"kore_not_found\">Install missing Kore app\\?</string>\n    <string name=\"show_play_with_kodi_title\">Show \\\"Play with Kodi\\\" option</string>\n    <string name=\"show_play_with_kodi_summary\">Display an option to play a video via Kodi media center</string>\n    <string name=\"crash_the_player\">Crash the player</string>\n    <string name=\"notification_scale_to_square_image_title\">Crop thumbnail to 1:1 aspect ratio</string>\n    <string name=\"notification_scale_to_square_image_summary\">Crop the video thumbnail shown in the notification from 16:9 to 1:1 aspect ratio</string>\n    <string name=\"notification_action_0_title\">First action button</string>\n    <string name=\"notification_action_1_title\">Second action button</string>\n    <string name=\"notification_action_2_title\">Third action button</string>\n    <string name=\"notification_action_3_title\">Fourth action button</string>\n    <string name=\"notification_action_4_title\">Fifth action button</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"notification_actions_at_most_three\">You can select at most three actions to show in the compact notification!</string>\n    <string name=\"notification_action_repeat\">Repeat</string>\n    <string name=\"notification_action_shuffle\">Shuffle</string>\n    <string name=\"notification_action_buffering\">Buffering</string>\n    <string name=\"notification_action_nothing\">Nothing</string>\n    <string name=\"notification_colorize_title\">Colorize notification</string>\n    <string name=\"notification_colorize_summary\">Have Android customize the notification\\'s color according to the main color in the thumbnail (note that this is not available on all devices)</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Default audio format</string>\n    <string name=\"default_video_format_title\">Default video format</string>\n    <string name=\"theme_title\">Theme</string>\n    <string name=\"night_theme_title\">Night theme</string>\n    <string name=\"light_theme_title\">Light</string>\n    <string name=\"dark_theme_title\">Dark</string>\n    <string name=\"black_theme_title\">Black</string>\n    <string name=\"popup_remember_size_pos_title\">Remember popup properties</string>\n    <string name=\"popup_remember_size_pos_summary\">Remember last size and position of popup</string>\n    <string name=\"use_inexact_seek_title\">Use fast inexact seek</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"seek_duration_title\">Fast-forward/-rewind seek duration</string>\n    <string name=\"progressive_load_interval_title\">Playback load interval size</string>\n    <string name=\"progressive_load_interval_summary\">Change the load interval size on progressive contents (currently %s). A lower value may speed up their initial loading</string>\n    <string name=\"clear_queue_confirmation_title\">Ask for confirmation before clearing a queue</string>\n    <string name=\"clear_queue_confirmation_summary\">Switching from one player to another may replace your queue</string>\n    <string name=\"clear_queue_confirmation_description\">The active player queue will be replaced</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignore hardware media button events</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Useful, for instance, if you are using a headset with broken physical buttons</string>\n    <string name=\"show_comments_title\">Show comments</string>\n    <string name=\"show_comments_summary\">Turn off to hide comments</string>\n    <string name=\"show_next_and_similar_title\">Show \\'Next\\' and \\'Similar\\' videos</string>\n    <string name=\"show_description_title\">Show description</string>\n    <string name=\"show_description_summary\">Turn off to hide video description and additional information</string>\n    <string name=\"show_meta_info_title\">Show meta info</string>\n    <string name=\"show_meta_info_summary\">Turn off to hide meta info boxes with additional information about the stream creator, stream content or a search request</string>\n    <string name=\"prefer_original_audio_title\">Prefer original audio</string>\n    <string name=\"prefer_original_audio_summary\">Select the original audio track regardless of the language</string>\n    <string name=\"prefer_descriptive_audio_title\">Prefer descriptive audio</string>\n    <string name=\"prefer_descriptive_audio_summary\">Select an audio track with descriptions for visually impaired people if available</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Image cache wiped</string>\n    <string name=\"metadata_cache_wipe_title\">Wipe cached metadata</string>\n    <string name=\"metadata_cache_wipe_summary\">Remove all cached webpage data</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metadata cache wiped</string>\n    <string name=\"auto_queue_title\">Auto-enqueue next stream</string>\n    <string name=\"auto_queue_summary\">Continue ending (non-repeating) playback queue by appending a related stream</string>\n    <string name=\"auto_queue_toggle\">Auto-enqueuing</string>\n    <string name=\"left_gesture_control_summary\">Choose gesture for left half of player screen</string>\n    <string name=\"left_gesture_control_title\">Left gesture action</string>\n    <string name=\"right_gesture_control_summary\">Choose gesture for right half of player screen</string>\n    <string name=\"right_gesture_control_title\">Right gesture action</string>\n    <string name=\"brightness\">Brightness</string>\n    <string name=\"volume\">Volume</string>\n    <string name=\"none\">None</string>\n    <string name=\"show_search_suggestions_title\">Search suggestions</string>\n    <string name=\"show_search_suggestions_summary\">Choose the suggestions to show when searching</string>\n    <string name=\"local_search_suggestions\">Local search suggestions</string>\n    <string name=\"remote_search_suggestions\">Remote search suggestions</string>\n    <string name=\"enable_search_history_title\">Search history</string>\n    <string name=\"enable_search_history_summary\">Store search queries locally</string>\n    <string name=\"enable_watch_history_title\">Watch history</string>\n    <string name=\"enable_playback_resume_title\">Resume playback</string>\n    <string name=\"enable_playback_resume_summary\">Restore last playback position</string>\n    <string name=\"enable_playback_state_lists_title\">Positions in lists</string>\n    <string name=\"enable_playback_state_lists_summary\">Show playback position indicators in lists</string>\n    <string name=\"settings_category_clear_data_title\">Clear data</string>\n    <string name=\"enable_watch_history_summary\">Keep track of watched videos</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Resume playing</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Continue playing after interruptions (e.g. phonecalls)</string>\n    <string name=\"download_dialog_title\">Download</string>\n    <string name=\"start_main_player_fullscreen_title\">Start main player in fullscreen</string>\n    <string name=\"start_main_player_fullscreen_summary\">Do not start videos in the mini player, but turn to fullscreen mode directly, if auto rotation is locked. You can still access the mini player by exiting fullscreen</string>\n    <string name=\"autoplay_title\">Autoplay</string>\n    <string name=\"show_hold_to_append_title\">Show \\\"Hold to enqueue\\\" tip</string>\n    <string name=\"show_hold_to_append_summary\">Show tip when pressing the background or the popup button in video \\\"Details:\\\"</string>\n    <string name=\"unsupported_url\">Unsupported URL</string>\n    <string name=\"unsupported_url_dialog_message\">Could not recognize the URL. Open with another app?</string>\n    <string name=\"default_content_country_title\">Default content country</string>\n    <string name=\"content_language_title\">Default content language</string>\n    <string name=\"peertube_instance_url_title\">PeerTube instances</string>\n    <string name=\"peertube_instance_url_summary\">Select your favorite PeerTube instances</string>\n    <string name=\"peertube_instance_url_help\">Find the instances you like on %s</string>\n    <string name=\"peertube_instance_add_title\">Add instance</string>\n    <string name=\"peertube_instance_add_help\">Enter instance URL</string>\n    <string name=\"peertube_instance_add_fail\">Could not validate instance</string>\n    <string name=\"peertube_instance_add_https_only\">Only HTTPS URLs are supported</string>\n    <string name=\"peertube_instance_add_exists\">Instance already exists</string>\n    <string name=\"settings_category_player_title\">Player</string>\n    <string name=\"settings_category_player_behavior_title\">Behavior</string>\n    <string name=\"settings_category_video_audio_title\">Video and audio</string>\n    <string name=\"settings_category_history_title\">History and cache</string>\n    <string name=\"settings_category_appearance_title\">Appearance</string>\n    <string name=\"settings_category_debug_title\">Debug</string>\n    <string name=\"settings_category_updates_title\">Updates</string>\n    <string name=\"settings_category_player_notification_title\">Player notification</string>\n    <string name=\"settings_category_player_notification_summary\">Configure current playing stream notification</string>\n    <string name=\"settings_category_backup_restore_title\">Backup and restore</string>\n    <string name=\"background_player_playing_toast\">Playing in background</string>\n    <string name=\"popup_playing_toast\">Playing in popup mode</string>\n    <string name=\"content\">Content</string>\n    <string name=\"show_age_restricted_content_title\">Show age restricted content</string>\n    <string name=\"show_age_restricted_content_summary\">Show content possibly unsuitable for children because it has an age limit (like 18+)</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Turn on YouTube\\'s \\\"Restricted Mode\\\"</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube provides a \\\"Restricted Mode\\\" which hides potentially mature content</string>\n    <string name=\"restricted_video\">This video is age restricted.\\n\\nTurn on \\\"%1$s\\\" in the settings if you want to see it.</string>\n    <string name=\"restricted_video_no_stream\">This video is age-restricted.\n\\nDue to new YouTube policies with age-restricted videos, NewPipe cannot access any of its video streams and thus is unable to play it.</string>\n    <string name=\"duration_live\">Live</string>\n    <string name=\"downloads\">Downloads</string>\n    <string name=\"downloads_title\">Downloads</string>\n    <string name=\"loading_metadata_title\">Loading Metadata…</string>\n    <string name=\"error_report_title\">Error report</string>\n    <string name=\"all\">All</string>\n    <string name=\"channels\">Channels</string>\n    <string name=\"playlists\">Playlists</string>\n    <string name=\"videos_string\">Videos</string>\n    <string name=\"tracks\">Tracks</string>\n    <string name=\"users\">Users</string>\n    <string name=\"events\">Events</string>\n    <string name=\"songs\">Songs</string>\n    <string name=\"albums\">Albums</string>\n    <string name=\"artists\">Artists</string>\n    <string name=\"disabled\">Disabled</string>\n    <string name=\"clear\">Clear</string>\n    <string name=\"best_resolution\">Best resolution</string>\n    <string name=\"undo\">Undo</string>\n    <string name=\"file_deleted\">File deleted</string>\n    <string name=\"play_all\">Play All</string>\n    <string name=\"always\">Always</string>\n    <string name=\"just_once\">Just Once</string>\n    <string name=\"file\">File</string>\n    <string name=\"notifications\">Notifications</string>\n    <string name=\"notification_channel_name\">NewPipe notification</string>\n    <string name=\"notification_channel_description\">Notifications for NewPipe\\'s player</string>\n    <string name=\"app_update_notification_channel_name\">App update notification</string>\n    <string name=\"app_update_notification_channel_description\">Notifications for new NewPipe versions</string>\n    <string name=\"hash_channel_name\">Video hash notification</string>\n    <string name=\"hash_channel_description\">Notifications for video hashing progress</string>\n    <string name=\"streams_notification_channel_name\">New streams</string>\n    <string name=\"streams_notification_channel_description\">Notifications about new streams for subscriptions</string>\n    <string name=\"error_report_channel_name\">Error report notification</string>\n    <string name=\"error_report_channel_description\">Notifications to report errors</string>\n    <string name=\"unknown_content\">[Unknown]</string>\n    <string name=\"switch_to_background\">Switch to Background</string>\n    <string name=\"switch_to_popup\">Switch to Popup</string>\n    <string name=\"switch_to_main\">Switch to Main</string>\n    <string name=\"import_data_title\">Import database</string>\n    <string name=\"export_data_title\">Export database</string>\n    <string name=\"clear_cookie_title\">Clear reCAPTCHA cookies</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA cookies have been cleared</string>\n    <string name=\"import_data_summary\">Overrides your current history, subscriptions, playlists and (optionally) settings</string>\n    <string name=\"export_data_summary\">Export history, subscriptions, playlists and settings</string>\n    <string name=\"clear_cookie_summary\">Clear cookies that NewPipe stores when you solve a reCAPTCHA</string>\n    <string name=\"clear_views_history_title\">Clear watch history</string>\n    <string name=\"clear_views_history_summary\">Deletes the history of played streams and the playback positions</string>\n    <string name=\"delete_view_history_alert\">Delete entire watch history?</string>\n    <string name=\"watch_history_deleted\">Watch history deleted</string>\n    <string name=\"clear_playback_states_title\">Delete playback positions</string>\n    <string name=\"clear_playback_states_summary\">Deletes all playback positions</string>\n    <string name=\"delete_playback_states_alert\">Delete all playback positions?</string>\n    <string name=\"watch_history_states_deleted\">Playback positions deleted</string>\n    <string name=\"clear_search_history_title\">Clear search history</string>\n    <string name=\"clear_search_history_summary\">Deletes history of search keywords</string>\n    <string name=\"delete_search_history_alert\">Delete entire search history?</string>\n    <string name=\"search_history_deleted\">Search history deleted</string>\n    <string name=\"fast_mode\">Fast mode</string>\n    <string name=\"main_tabs_position_summary\">Move main tab selector to the bottom</string>\n    <string name=\"main_tabs_position_title\">Main tabs position</string>\n    <!-- error strings -->\n    <string name=\"general_error\">Error</string>\n    <string name=\"download_to_sdcard_error_title\">External storage unavailable</string>\n    <string name=\"download_to_sdcard_error_message\">Downloading to external SD card not possible. Reset download folder location?</string>\n    <string name=\"network_error\">Network error</string>\n    <string name=\"could_not_load_thumbnails\">Could not load all thumbnails</string>\n    <string name=\"parsing_error\">Could not parse website</string>\n    <string name=\"content_not_available\">Content unavailable</string>\n    <string name=\"could_not_setup_download_menu\">Could not set up download menu</string>\n    <string name=\"app_ui_crash\">App/UI crashed</string>\n    <string name=\"player_stream_failure\">Could not play this stream</string>\n    <string name=\"player_unrecoverable_failure\">Unrecoverable player error occurred</string>\n    <string name=\"player_recoverable_failure\">Recovering from player error</string>\n    <string name=\"external_player_unsupported_link_type\">External players don\\'t support these types of links</string>\n    <string name=\"video_streams_empty\">No video streams found</string>\n    <string name=\"audio_streams_empty\">No audio streams found</string>\n    <string name=\"missing_file\">File moved or deleted</string>\n    <string name=\"invalid_directory\">No such folder</string>\n    <string name=\"invalid_source\">No such file/content source</string>\n    <string name=\"invalid_file\">The file doesn\\'t exist or permission to read or write to it is lacking</string>\n    <string name=\"file_name_empty_error\">Filename cannot be empty</string>\n    <string name=\"error_occurred_detail\">An error occurred: %1$s</string>\n    <string name=\"no_streams_available_download\">No streams available to download</string>\n    <string name=\"saved_tabs_invalid_json\">Could not read saved tabs, so using default ones</string>\n    <string name=\"restore_defaults\">Restore defaults</string>\n    <string name=\"restore_defaults_confirmation\">Do you want to restore defaults?</string>\n    <string name=\"permission_display_over_apps\">Give permission to display over other apps</string>\n    <string name=\"permission_display_over_apps_message\">In order to use the Popup Player, please select %1$s in the following Android settings menu and enable %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">“Allow display over other apps”</string>\n    <!-- error activity -->\n    <string name=\"error_report_notification_title\">NewPipe encountered an error, tap to report</string>\n    <string name=\"error_report_notification_toast\">An error occurred, see the notification</string>\n    <string name=\"sorry_string\">Sorry, that should not have happened.</string>\n    <string name=\"error_report_button_text\">Report via e-mail</string>\n    <string name=\"copy_for_github\">Copy formatted report</string>\n    <string name=\"error_report_open_issue_button_text\">Report on GitHub</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_snackbar_message\">Sorry, something went wrong.</string>\n    <string name=\"error_snackbar_action\">Report</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"what_happened_headline\">What happened:</string>\n    <string name=\"info_labels\">What:\\nRequest:\\nContent Language:\\nContent Country:\\nApp Language:\\nService:\\nTimestamp:\\nPackage:\\nVersion:\\nOS version:</string>\n    <string name=\"your_comment\">Your comment (in English):</string>\n    <string name=\"error_details_headline\">Details:</string>\n    <!-- Content descriptions (for better accessibility) -->\n    <string name=\"detail_thumbnail_view_description\">Play video, duration:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Uploader\\'s avatar thumbnail</string>\n    <string name=\"detail_likes_img_view_description\">Likes</string>\n    <string name=\"detail_dislikes_img_view_description\">Dislikes</string>\n    <string name=\"comments_tab_description\">Comments</string>\n    <string name=\"related_items_tab_description\">Related items</string>\n    <string name=\"description_tab_description\">Description</string>\n    <string name=\"search_no_results\">No results</string>\n    <string name=\"empty_list_subtitle\">Nothing here but crickets</string>\n    <string name=\"import_subscriptions_hint\">Import or export subscriptions from the 3-dot menu</string>\n    <string name=\"detail_drag_description\">Drag to reorder</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Retry</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"drawer_header_description\">Toggle service, currently selected:</string>\n    <!--Zero don't get selected (in some languages) as it is not a \"special case\" for android-->\n    <string name=\"no_subscribers\">No subscribers</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s subscriber</item>\n        <item quantity=\"other\">%s subscribers</item>\n    </plurals>\n    <string name=\"subscribers_count_not_available\">Subscriber count unavailable</string>\n    <string name=\"no_views\">No views</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s view</item>\n        <item quantity=\"other\">%s views</item>\n    </plurals>\n    <string name=\"no_one_watching\">No one is watching</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s watching</item>\n        <item quantity=\"other\">%s watching</item>\n    </plurals>\n    <string name=\"no_one_listening\">No one is listening</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s listener</item>\n        <item quantity=\"other\">%s listeners</item>\n    </plurals>\n    <string name=\"no_videos\">No videos</string>\n    <string name=\"more_than_100_videos\">100+ videos</string>\n    <string name=\"infinite_videos\">∞ videos</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">%s videos</item>\n    </plurals>\n    <string name=\"no_comments\">No comments</string>\n    <string name=\"comments_are_disabled\">Comments are disabled</string>\n    <string name=\"no_streams\">No streams</string>\n    <string name=\"no_live_streams\">No live streams</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s new stream</item>\n        <item quantity=\"other\">%s new streams</item>\n    </plurals>\n    <!-- Missions -->\n    <string name=\"start\">Start</string>\n    <string name=\"pause\">Pause</string>\n    <string name=\"create\">Create</string>\n    <string name=\"delete\">Delete</string>\n    <string name=\"delete_file\">Delete file</string>\n    <string name=\"delete_entry\">Delete entry</string>\n    <string name=\"checksum\">Checksum</string>\n    <string name=\"dismiss\">Dismiss</string>\n    <string name=\"rename\">Rename</string>\n    <!-- Msg -->\n    <string name=\"msg_name\">Filename</string>\n    <string name=\"msg_threads\">Threads</string>\n    <string name=\"msg_error\">Error</string>\n    <string name=\"msg_running\">NewPipe Downloading</string>\n    <string name=\"msg_running_detail\">Tap for details</string>\n    <string name=\"msg_calculating_hash\">Calculating hash</string>\n    <string name=\"msg_wait\">Please wait…</string>\n    <string name=\"msg_copied\">Copied to clipboard</string>\n    <string name=\"msg_failed_to_copy\">Failed to copy to clipboard</string>\n    <string name=\"no_available_dir\">Please define a download folder later in settings</string>\n    <string name=\"no_dir_yet\">No download folder set yet, choose the default download folder now</string>\n    <string name=\"msg_popup_permission\">This permission is needed to\\nopen in popup mode</string>\n    <string name=\"one_item_deleted\">1 item deleted.</string>\n    <!-- reCAPTCHA -->\n    <string name=\"title_activity_recaptcha\">reCAPTCHA challenge</string>\n    <string name=\"subtitle_activity_recaptcha\">Press \\\"Done\\\" when solved</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA challenge requested</string>\n    <string name=\"recaptcha_solve\">Solve</string>\n    <string name=\"done\">Done</string>\n    <!-- Downloads -->\n    <string name=\"settings_category_downloads_title\">Download</string>\n    <string name=\"settings_file_charset_title\">Allowed characters in filenames</string>\n    <string name=\"settings_file_replacement_character_summary\">Invalid characters are replaced with this value</string>\n    <string name=\"settings_file_replacement_character_title\">Replacement character</string>\n    <string name=\"charset_letters_and_digits\">Letters and digits</string>\n    <string name=\"charset_most_special_characters\">Most special characters</string>\n    <!-- About -->\n    <string name=\"title_activity_about\">About NewPipe</string>\n    <string name=\"title_licenses\">Third-party Licenses</string>\n    <string name=\"copyright\">© %1$s by %2$s under %3$s</string>\n    <string name=\"tab_about\">About \\u0026 FAQ</string>\n    <string name=\"tab_licenses\">Licenses</string>\n    <string name=\"app_description\">Libre lightweight streaming on Android.</string>\n    <string name=\"contribution_title\">Contribute</string>\n    <string name=\"contribution_encouragement\">Whether you have ideas of; translation, design changes, code cleaning, or real heavy code changes—help is always welcome. The more is done the better it gets!</string>\n    <string name=\"view_on_github\">View on GitHub</string>\n    <string name=\"donation_title\">Donate</string>\n    <string name=\"donation_encouragement\">NewPipe is developed by volunteers spending their free time bringing you the best user experience. Give back to help developers make NewPipe even better while they enjoy a cup of coffee.</string>\n    <string name=\"give_back\">Give back</string>\n    <string name=\"website_title\">Website</string>\n    <string name=\"website_encouragement\">Visit the NewPipe Website for more info and news.</string>\n    <string name=\"privacy_policy_title\">NewPipe\\'s Privacy Policy</string>\n    <string name=\"privacy_policy_encouragement\">The NewPipe project takes your privacy very seriously. Therefore, the app does not collect any data without your consent.\\nNewPipe\\'s privacy policy explains in detail what data is sent and stored when you send a crash report.</string>\n    <string name=\"read_privacy_policy\">Read privacy policy</string>\n    <string name=\"app_license_title\">NewPipe\\'s License</string>\n    <string name=\"app_license\">NewPipe is copyleft libre software: You can use, study, share, and improve it at will. Specifically you can redistribute and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</string>\n    <string name=\"read_full_license\">Read license</string>\n    <string name=\"faq_title\">Frequently asked questions</string>\n    <string name=\"faq_description\">If you are having trouble using the app, be sure to check out these answers to common questions!</string>\n    <string name=\"faq\">View on website</string>\n    <!-- History -->\n    <string name=\"title_activity_history\">History</string>\n    <string name=\"action_history\">History</string>\n    <string name=\"delete_item_search_history\">Do you want to delete this item from search history?</string>\n    <string name=\"title_last_played\">Last Played</string>\n    <string name=\"title_most_played\">Most Played</string>\n    <!-- Content -->\n    <string name=\"main_page_content\">Content of main page</string>\n    <string name=\"main_page_content_summary\">What tabs are shown on the main page</string>\n    <string name=\"main_page_content_swipe_remove\">Swipe items to remove them</string>\n    <string name=\"blank_page_summary\">Blank page</string>\n    <string name=\"kiosk_page_summary\">Kiosk page</string>\n    <string name=\"default_kiosk_page_summary\">Default Kiosk</string>\n    <string name=\"channel_page_summary\">Channel page</string>\n    <string name=\"select_a_channel\">Select a channel</string>\n    <string name=\"no_channel_subscribed_yet\">No channel subscriptions yet</string>\n    <string name=\"select_a_playlist\">Select a playlist</string>\n    <string name=\"no_playlist_bookmarked_yet\">No playlist bookmarks yet</string>\n    <string name=\"select_a_kiosk\">Select a kiosk</string>\n    <string name=\"export_complete_toast\">Exported</string>\n    <string name=\"import_complete_toast\">Imported</string>\n    <string name=\"no_valid_zip_file\">No valid ZIP file</string>\n    <string name=\"could_not_import_all_files\">Warning: Could not import all files.</string>\n    <string name=\"override_current_data\">This will override your current setup.</string>\n    <string name=\"import_settings\">Do you want to also import settings?</string>\n    <string name=\"error_unable_to_load_comments\">Could not load comments</string>\n    <string name=\"select_a_feed_group\">Select a feed group</string>\n    <string name=\"no_feed_group_created_yet\">No feed group created yet</string>\n    <!-- Kiosk Names -->\n    <string name=\"trending\">Trending</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">New and hot</string>\n    <string name=\"local\">Local</string>\n    <string name=\"recently_added\">Recently added</string>\n    <string name=\"most_liked\">Most liked</string>\n    <string name=\"conferences\">Conferences</string>\n    <!-- Play Queue -->\n    <string name=\"title_activity_play_queue\">Play queue</string>\n    <string name=\"play_queue_remove\">Remove</string>\n    <string name=\"play_queue_stream_detail\">Details</string>\n    <string name=\"play_queue_audio_settings\">Audio Settings</string>\n    <string name=\"play_queue_audio_track\">Audio: %s</string>\n    <string name=\"audio_track\">Audio track</string>\n    <string name=\"hold_to_append\">Hold to enqueue</string>\n    <string name=\"show_channel_details\">Show channel details</string>\n    <string name=\"enqueue_stream\">Enqueue</string>\n    <string name=\"enqueued\">Enqueued</string>\n    <string name=\"enqueue_next_stream\">Enqueue next</string>\n    <string name=\"enqueued_next\">Enqueued next</string>\n    <string name=\"start_here_on_background\">Start playing in the background</string>\n    <string name=\"start_here_on_popup\">Start playing in a popup</string>\n    <string name=\"loading_stream_details\">Loading stream details…</string>\n    <!-- Drawer -->\n    <string name=\"drawer_open\">Open Drawer</string>\n    <string name=\"drawer_close\">Close Drawer</string>\n    <!-- Preferred player -->\n    <string name=\"preferred_open_action_settings_title\">Preferred \\'open\\' action</string>\n    <string name=\"preferred_open_action_settings_summary\">Default action when opening content — %s</string>\n    <string name=\"video_player\">Video player</string>\n    <string name=\"background_player\">Background player</string>\n    <string name=\"popup_player\">Popup player</string>\n    <string name=\"always_ask_open_action\">Always ask</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Getting info…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">\"Loading requested content\"</string>\n    <!-- Local Playlist -->\n    <string name=\"create_playlist\">New Playlist</string>\n    <string name=\"duplicate_in_playlist\">The playlists that are grayed out already contain this item.</string>\n    <string name=\"rename_playlist\">Rename</string>\n    <string name=\"name\">Name</string>\n    <string name=\"add_to_playlist\">Add to playlist</string>\n    <string name=\"processing_may_take_a_moment\">Processing… May take a moment</string>\n    <string name=\"mute\">Mute</string>\n    <string name=\"unmute\">Unmute</string>\n    <string name=\"set_as_playlist_thumbnail\">Set as playlist thumbnail</string>\n    <string name=\"unset_playlist_thumbnail\">Unset permanent thumbnail</string>\n    <string name=\"bookmark_playlist\">Bookmark Playlist</string>\n    <string name=\"unbookmark_playlist\">Remove Bookmark</string>\n    <string name=\"delete_playlist_prompt\">Delete this playlist\\?</string>\n    <string name=\"playlist_creation_success\">Playlist created</string>\n    <string name=\"playlist_add_stream_success\">Playlisted</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplicate added %d time(s)</string>\n    <string name=\"playlist_thumbnail_change_success\">Playlist thumbnail changed.</string>\n    <string name=\"playlist_no_uploader\">Auto-generated (no uploader found)</string>\n    <!-- Players -->\n    <string name=\"caption_none\">No Captions</string>\n    <string name=\"resize_fit\">Fit</string>\n    <string name=\"resize_fill\">Fill</string>\n    <string name=\"resize_zoom\">Zoom</string>\n    <string name=\"caption_auto_generated\">Auto-generated</string>\n    <!-- Caption Settings -->\n    <string name=\"caption_setting_title\">Captions</string>\n    <string name=\"caption_setting_description\">Modify player caption text scale and background styles. Requires app restart to take effect</string>\n    <!-- Debug Settings -->\n    <string name=\"leak_canary_not_available\">LeakCanary is not available</string>\n    <string name=\"enable_leak_canary_summary\">Memory leak monitoring may cause the app to become unresponsive when heap dumping</string>\n    <string name=\"show_memory_leaks\">Show memory leaks</string>\n    <string name=\"enable_disposed_exceptions_title\">Report out-of-lifecycle errors</string>\n    <string name=\"enable_disposed_exceptions_summary\">Force reporting of undeliverable Rx exceptions outside of fragment or activity lifecycle after disposal</string>\n    <string name=\"show_original_time_ago_title\">Show original time ago on items</string>\n    <string name=\"show_original_time_ago_summary\">Original texts from services will be visible in stream items</string>\n    <string name=\"disable_media_tunneling_title\">Disable media tunneling</string>\n    <string name=\"disable_media_tunneling_summary\">Disable media tunneling if you experience a black screen or stuttering on video playback.</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Media tunneling was disabled by default on your device because your device model is known to not support it.</string>\n    <string name=\"show_crash_the_player_title\">Show \\\"Crash the player\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Shows a crash option when using the player</string>\n    <string name=\"check_new_streams\">Run check for new streams</string>\n    <string name=\"crash_the_app\">Crash the app</string>\n    <string name=\"show_error_snackbar\">Show an error snackbar</string>\n    <string name=\"create_error_notification\">Create an error notification</string>\n    <!-- Subscriptions import/export -->\n    <plurals name=\"export_subscriptions\">\n        <item quantity=\"one\">Exporting %d subscription…</item>\n        <item quantity=\"other\">Exporting %d subscriptions…</item>\n    </plurals>\n    <plurals name=\"load_subscriptions\">\n        <item quantity=\"one\">Loading %d subscription…</item>\n        <item quantity=\"other\">Loading %d subscriptions…</item>\n    </plurals>\n    <plurals name=\"import_subscriptions\">\n        <item quantity=\"one\">Importing %d subscription…</item>\n        <item quantity=\"other\">Importing %d subscriptions…</item>\n    </plurals>\n    <string name=\"import_title\">Import</string>\n    <string name=\"import_from\">Import from</string>\n    <string name=\"export_to\">Export to</string>\n    <string name=\"import_ongoing\">Importing…</string>\n    <string name=\"export_ongoing\">Exporting…</string>\n    <string name=\"import_file_title\">Import file</string>\n    <string name=\"previous_export\">Previous export</string>\n    <string name=\"import_subscriptions_title\">Import subscriptions\"</string>\n    <string name=\"export_subscriptions_title\">Export subscriptions</string>\n    <string name=\"import_subscriptions_summary\">Import subscriptions from a previous .json export\"</string>\n    <string name=\"export_subscriptions_summary\">Export your subscriptions to a .json file</string>\n    <string name=\"import_from_previous_export\">Import from previous export</string>\n    <string name=\"subscriptions_import_unsuccessful\">Could not import subscriptions</string>\n    <string name=\"subscriptions_export_unsuccessful\">Could not export subscriptions</string>\n    <string name=\"import_youtube_instructions\">Import YouTube subscriptions from Google takeout:\n\\n\n\\n1. Go to this URL: %1$s\n\\n2. Log in when asked\n\\n3. Click on \\\"All data included\\\", then on \\\"Deselect all\\\", then select only \\\"subscriptions\\\" and click \\\"OK\\\"\n\\n4. Click on \\\"Next step\\\" and then on \\\"Create export\\\"\n\\n5. Click on the \\\"Download\\\" button after it appears\n\\n6. Click on IMPORT FILE below and select the downloaded .zip file\n\\n7. [If the .zip import fails] Extract the .csv file (usually under \\\"YouTube and YouTube Music/subscriptions/subscriptions.csv\\\"), click on IMPORT FILE below and select the extracted csv file</string>\n    <string name=\"import_soundcloud_instructions\">Import a SoundCloud profile by typing either the URL or your ID:\\n\\n1. Enable \\\"desktop mode\\\" in a web-browser (the site is not available for mobile devices)\\n2. Go to this URL: %1$s\\n3. Log in when asked\\n4. Copy the profile URL you were redirected to.</string>\n    <string name=\"import_soundcloud_instructions_hint\">yourID, soundcloud.com/yourid</string>\n    <string name=\"import_network_expensive_warning\">Keep in mind this operation can be network expensive.\\n\\nDo you want to continue?</string>\n    <!-- Playback Parameters -->\n    <string name=\"playback_speed_control\">Playback Speed Controls</string>\n    <string name=\"playback_tempo\">Tempo</string>\n    <string name=\"playback_pitch\">Pitch</string>\n    <string name=\"unhook_checkbox\">Unhook (may cause distortion)</string>\n    <string name=\"skip_silence_checkbox\">Fast-forward during silence</string>\n    <string name=\"playback_step\">Step</string>\n    <string name=\"playback_reset\">Reset</string>\n    <string name=\"percent\">Percent</string>\n    <string name=\"semitone\">Semitone</string>\n    <!-- GDPR dialog -->\n    <string name=\"start_accept_privacy_policy\">In order to comply with the European General Data Protection Regulation (GDPR), we hereby draw your attention to NewPipe\\'s privacy policy. Please read it carefully.\n\\nYou must accept it to send us the bug report.</string>\n    <string name=\"accept\">Accept</string>\n    <string name=\"decline\">Decline</string>\n    <!-- Limit mobile data usage  -->\n    <string name=\"limit_data_usage_none_description\">No limit</string>\n    <string name=\"limit_mobile_data_usage_title\">Limit resolution when using mobile data</string>\n    <string-array name=\"limit_data_usage_description_list\">\n        <item>@string/limit_data_usage_none_description</item>\n        <item>1080p60</item>\n        <item>1080p</item>\n        <item>720p60</item>\n        <item>720p</item>\n        <item>480p</item>\n        <item>360p</item>\n        <item>240p</item>\n        <item>144p</item>\n    </string-array>\n    <string-array name=\"high_resolution_limit_data_usage_description_list\">\n        <item>2160p</item>\n        <item>1440p</item>\n    </string-array>\n    <!-- Notifications settings -->\n    <string name=\"enable_streams_notifications_title\">New streams notifications</string>\n    <string name=\"enable_streams_notifications_summary\">Notify about new streams from subscriptions</string>\n    <string name=\"streams_notifications_interval_title\">Checking frequency</string>\n    <string name=\"streams_notifications_network_title\">Required network connection</string>\n    <string name=\"any_network\">Any network</string>\n    <!-- Updates Settings -->\n    <string name=\"updates_setting_title\">Updates</string>\n    <string name=\"updates_setting_description\">Show a notification to prompt app update when a new version is available</string>\n    <string name=\"check_for_updates\">Check for updates</string>\n    <string name=\"auto_update_check_description\">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>\n    <string name=\"manual_update_title\" translatable=\"false\">@string/check_for_updates</string>\n    <string name=\"manual_update_description\">Manually check for new versions</string>\n\n    <!-- Minimize to exit action -->\n    <string name=\"minimize_on_exit_title\">Minimize on app switch</string>\n    <string name=\"minimize_on_exit_summary\">Action when switching to other app from main video player — %s</string>\n    <string name=\"minimize_on_exit_none_description\">None</string>\n    <string name=\"minimize_on_exit_background_description\">Minimize to background player</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimize to popup player</string>\n    <!-- Autoplay behavior -->\n    <string name=\"autoplay_summary\">Start playback automatically — %s</string>\n    <string name=\"wifi_only\">Only on Wi-Fi</string>\n    <string name=\"never\">Never</string>\n    <string name=\"list_view_mode\">List view mode</string>\n    <string name=\"list\">List</string>\n    <string name=\"grid\">Grid</string>\n    <string name=\"card\">Card</string>\n    <string name=\"auto\">Auto</string>\n    <!-- Seekbar Preview Thumbnail-->\n    <string name=\"seekbar_preview_thumbnail_title\">Seekbar thumbnail preview</string>\n    <string name=\"high_quality_larger\">High quality (larger)</string>\n    <string name=\"low_quality_smaller\">Low quality (smaller)</string>\n    <string name=\"dont_show\">Don\\'t show</string>\n    <!-- App update notification -->\n    <string name=\"app_update_unavailable_toast\">You are running the latest version of NewPipe</string>\n    <string name=\"app_update_available_notification_title\">NewPipe update is available!</string>\n    <string name=\"app_update_available_notification_text\">Tap to download %s</string>\n    <string name=\"missions_header_finished\">Finished</string>\n    <string name=\"missions_header_pending\">Pending</string>\n    <string name=\"paused\">paused</string>\n    <string name=\"queued\">queued</string>\n    <string name=\"post_processing\">post-processing</string>\n    <string name=\"recovering\">recovering</string>\n    <string name=\"enqueue\">Enqueue</string>\n    <string name=\"permission_denied\">Action denied by the system</string>\n    <string name=\"checking_updates_toast\">Checking for updates…</string>\n    <!-- download notifications -->\n    <string name=\"download_failed\">Download failed</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Download finished</item>\n        <item quantity=\"other\">%s downloads finished</item>\n    </plurals>\n    <string name=\"reset_settings_title\">Reset settings</string>\n    <string name=\"reset_settings_summary\">Reset all settings to their default values</string>\n    <!-- dialog about resetting settings -->\n    <string name=\"reset_all_settings\">Resetting all settings will discard all of your preferred settings and restarts the app.\\n\\nAre you sure you want to proceed?</string>\n    <!-- dialog about existing downloads -->\n    <string name=\"generate_unique_name\">Generate unique name</string>\n    <string name=\"overwrite\">Overwrite</string>\n    <string name=\"overwrite_unrelated_warning\">A file with this name already exists</string>\n    <string name=\"overwrite_finished_warning\">A downloaded file with this name already exists</string>\n    <string name=\"overwrite_failed\">cannot overwrite the file</string>\n    <string name=\"download_already_running\">There is a download in progress with this name</string>\n    <string name=\"download_already_pending\">There is a pending download with this name</string>\n    <!-- message dialog about download error -->\n    <string name=\"show_error\">Show error</string>\n    <string name=\"error_file_creation\">The file cannot be created</string>\n    <string name=\"error_path_creation\">The destination folder cannot be created</string>\n    <string name=\"error_ssl_exception\">Could not establish a secure connection</string>\n    <string name=\"error_unknown_host\">Could not find the server</string>\n    <string name=\"error_connect_host\">Cannot connect to the server</string>\n    <string name=\"error_http_no_content\">The server does not send data</string>\n    <string name=\"error_http_unsupported_range\">The server does not accept multi-threaded downloads, retry with @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Not found</string>\n    <string name=\"error_postprocessing_failed\">Post-processing failed</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe was closed while working on the file</string>\n    <string name=\"error_insufficient_storage\">Not enough free space on device</string>\n    <string name=\"error_insufficient_storage_left\">No space left on device</string>\n    <string name=\"error_progress_lost\">Progress lost, because the file was deleted</string>\n    <string name=\"error_timeout\">Connection timeout</string>\n    <string name=\"error_download_resource_gone\">Cannot recover this download</string>\n    <string name=\"clear_download_history\">Clear download history</string>\n    <string name=\"confirm_prompt\">Do you want to clear your download history or delete all downloaded files?</string>\n    <string name=\"delete_downloaded_files\">Delete downloaded files</string>\n    <string name=\"delete_downloaded_files_confirm\">Erase all downloaded files from disk?</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Deleted %1$s download</item>\n        <item quantity=\"other\">Deleted %1$s downloads</item>\n    </plurals>\n    <string name=\"stop\">Stop</string>\n    <string name=\"max_retry_msg\">Maximum retries</string>\n    <string name=\"max_retry_desc\">Maximum number of attempts before canceling the download</string>\n    <string name=\"pause_downloads_on_mobile\">Interrupt on metered networks</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Useful when switching to mobile data, although some downloads cannot be suspended</string>\n    <string name=\"close\">Close</string>\n    <string name=\"enable_queue_limit\">Limit download queue</string>\n    <string name=\"enable_queue_limit_desc\">One download will run at the same time</string>\n    <string name=\"start_downloads\">Start downloads</string>\n    <string name=\"pause_downloads\">Pause downloads</string>\n    <string name=\"downloads_storage_ask_title\">Ask where to download</string>\n    <string name=\"downloads_storage_ask_summary\">You will be asked where to save each download.\\nEnable the system folder picker (SAF) if you want to download to an external SD card</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">You will be asked where to save each download</string>\n    <string name=\"downloads_storage_use_saf_title\">Use system folder picker (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">The \\'Storage Access Framework\\' allows downloads to an external SD card</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Starting from Android 10 only \\'Storage Access Framework\\' is supported</string>\n    <string name=\"choose_instance_prompt\">Choose an instance</string>\n    <string name=\"app_language_title\">App language</string>\n    <string name=\"systems_language\">System default</string>\n    <string name=\"remove_watched\">Remove watched</string>\n    <string name=\"remove_watched_popup_title\">Remove watched streams?</string>\n    <string name=\"remove_duplicates\">Remove duplicates</string>\n    <string name=\"remove_duplicates_title\">Remove duplicates?</string>\n    <string name=\"remove_duplicates_message\">Do you want to remove all duplicate streams in this playlist?</string>\n    <string name=\"remove_watched_popup_warning\">Streams that have been watched before and after being added to the playlist will be removed.\n\\nAre you sure\\?</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Remove partially watched streams</string>\n    <string name=\"new_seek_duration_toast\">Due to ExoPlayer constraints the seek duration was set to %d seconds</string>\n    <!-- Time duration plurals -->\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d second</item>\n        <item quantity=\"other\">%d seconds</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minute</item>\n        <item quantity=\"other\">%d minutes</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d hour</item>\n        <item quantity=\"other\">%d hours</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d day</item>\n        <item quantity=\"other\">%d days</item>\n    </plurals>\n    <!-- Feed -->\n    <string name=\"fragment_feed_title\">What\\'s New</string>\n    <string name=\"feed_group_page_summary\">Channel group page</string>\n    <string name=\"feed_groups_header_title\">Channel groups</string>\n    <string name=\"feed_oldest_subscription_update\">Feed last updated: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Not loaded: %d</string>\n    <string name=\"feed_notification_loading\">Loading feed…</string>\n    <string name=\"feed_processing_message\">Processing feed…</string>\n    <string name=\"feed_new_items\">New feed items</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Select subscriptions</string>\n    <string name=\"feed_group_dialog_empty_selection\">No subscription selected</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d selected</item>\n        <item quantity=\"other\">%d selected</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">Empty group name</string>\n    <string name=\"feed_group_dialog_delete_message\">Do you want to delete this group?</string>\n    <string name=\"feed_create_new_group_button_title\">New</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Show only ungrouped subscriptions</string>\n    <string name=\"settings_category_feed_title\">Feed</string>\n    <string name=\"feed_update_threshold_title\">Feed update threshold</string>\n    <string name=\"feed_update_threshold_summary\">Time after last update before a subscription is considered outdated — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Always update</string>\n    <string name=\"feed_load_error\">Error loading feed</string>\n    <string name=\"feed_load_error_account_info\">Could not load feed for \\'%s\\'.</string>\n    <string name=\"feed_load_error_terminated\">The author\\'s account has been terminated.\\nNewPipe will not be able to load this feed in the future.\\nDo you want to unsubscribe from this channel?</string>\n    <string name=\"feed_load_error_fast_unknown\">The fast feed mode does not provide more info on this.</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Fetch from dedicated feed when available</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Available in some services, it is usually much faster but may return a limited amount of items and often incomplete information (e.g. no duration, item type, no live status)</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Enable fast mode</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Disable fast mode</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Do you think feed loading is too slow\\? If so, try enabling fast loading (you can change it in settings or by pressing the button below).\n\\n\n\\nNewPipe offers two feed loading strategies:\n\\n• Fetching the whole subscription channel, which is slow but complete.\n\\n• Using a dedicated service endpoint, which is fast but usually not complete.\n\\n\n\\nThe difference between the two is that the fast one usually lacks some information, like the item\\'s duration or type (can\\'t distinguish between live videos and normal ones) and it may return less items.\n\\n\n\\nYouTube is an example of a service that offers this fast method with its RSS feed.\n\\n\n\\nSo the choice boils down to what you prefer: speed or precise information.</string>\n    <string name=\"feed_hide_streams_title\">Show the following streams</string>\n    <string name=\"feed_show_hide_streams\">Show/Hide streams</string>\n    <string name=\"feed_fetch_channel_tabs\">Fetch channel tabs</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Tabs to fetch when updating the feed. This option has no effect if a channel is updated using fast mode.</string>\n    <string name=\"content_not_supported\">This content is not yet supported by NewPipe.\\n\\nIt will hopefully be supported in a future version.</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Channel\\'s avatar thumbnail</string>\n    <string name=\"channel_created_by\">Created by %s</string>\n    <string name=\"video_detail_by\">By %s</string>\n    <string name=\"playlist_page_summary\">Playlist page</string>\n    <string name=\"show_thumbnail_title\">Show thumbnail</string>\n    <string name=\"show_thumbnail_summary\">Use thumbnail for both lock screen background and notifications</string>\n    <string name=\"recent\">Recent</string>\n    <string name=\"chapters\">Chapters</string>\n    <string name=\"no_app_to_open_intent\">No app on your device can open this</string>\n    <string name=\"no_appropriate_file_manager_message\">No appropriate file manager was found for this action.\n\\nPlease install a file manager or try to disable \\'%s\\' in the download settings</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">No appropriate file manager was found for this action.\n\\nPlease install a Storage Access Framework compatible file manager</string>\n    <string name=\"georestricted_content\">This content is not available in your country.</string>\n    <string name=\"soundcloud_go_plus_content\">This is a SoundCloud Go+ track, at least in your country, so it cannot be streamed or downloaded by NewPipe.</string>\n    <string name=\"private_content\">This content is private, so it cannot be streamed or downloaded by NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">This video is available only to YouTube Music Premium members, so it cannot be streamed or downloaded by NewPipe.</string>\n    <string name=\"account_terminated\">Account terminated</string>\n    <string name=\"account_terminated_service_provides_reason\">Account terminated\\n\\n%1$s provides this reason: %2$s</string>\n    <string name=\"paid_content\">This content is only available to users who have paid, so it cannot be streamed or downloaded by NewPipe.</string>\n    <string name=\"featured\">Featured</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"auto_device_theme_title\">Automatic (device theme)</string>\n    <string name=\"night_theme_summary\">Select your favorite night theme — %s</string>\n    <string name=\"select_night_theme_toast\">You can select your favorite night theme below</string>\n    <string name=\"night_theme_available\">This option is only available if %s is selected for Theme</string>\n    <string name=\"download_has_started\">Download has started</string>\n    <string name=\"description_select_note\">You can now select text inside the description. Note that the page may flicker and links may not be clickable while in selection mode.</string>\n    <string name=\"description_select_enable\">Enable selecting text in the description</string>\n    <string name=\"description_select_disable\">Disable selecting text in the description</string>\n    <string name=\"metadata_category\">Category</string>\n    <string name=\"metadata_tags\">Tags</string>\n    <string name=\"metadata_licence\">Licence</string>\n    <string name=\"metadata_privacy\">Privacy</string>\n    <string name=\"metadata_age_limit\">Age limit</string>\n    <string name=\"metadata_language\">Language</string>\n    <string name=\"metadata_support\">Support</string>\n    <string name=\"metadata_host\">Host</string>\n    <string name=\"metadata_thumbnails\">Thumbnails</string>\n    <string name=\"metadata_uploader_avatars\">Uploader avatars</string>\n    <string name=\"metadata_subchannel_avatars\">Sub-channel avatars</string>\n    <string name=\"metadata_avatars\">Avatars</string>\n    <string name=\"metadata_banners\">Banners</string>\n    <string name=\"metadata_privacy_public\">Public</string>\n    <string name=\"metadata_privacy_unlisted\">Unlisted</string>\n    <string name=\"metadata_privacy_private\">Private</string>\n    <string name=\"metadata_privacy_internal\">Internal</string>\n    <string name=\"metadata_subscribers\">Subscribers</string>\n    <string name=\"detail_pinned_comment_view_description\">Pinned comment</string>\n    <string name=\"detail_heart_img_view_description\">Hearted by creator</string>\n    <string name=\"open_website_license\">Open website</string>\n    <string name=\"tablet_mode_title\">Tablet mode</string>\n    <string name=\"on\">On</string>\n    <string name=\"off\">Off</string>\n    <!-- Progressive Load Interval -->\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer default</string>\n    <!-- New streams notifications -->\n    <string name=\"notifications_disabled\">Notifications are disabled</string>\n    <string name=\"get_notified\">Get notified</string>\n    <string name=\"you_successfully_subscribed\">You now subscribed to this channel</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Toggle all</string>\n    <string name=\"streams_not_yet_supported_removed\">Streams which are not yet supported by the downloader are not shown</string>\n    <string name=\"audio_track_present_in_video\">An audio track should be already present in this stream</string>\n    <string name=\"selected_stream_external_player_not_supported\">The selected stream is not supported by external players</string>\n    <string name=\"no_audio_streams_available_for_external_players\">No audio streams are available for external players</string>\n    <string name=\"no_video_streams_available_for_external_players\">No video streams are available for external players</string>\n    <string name=\"select_quality_external_players\">Select quality for external players</string>\n    <string name=\"select_audio_track_external_players\">Select audio track for external players</string>\n    <string name=\"unknown_format\">Unknown format</string>\n    <string name=\"unknown_quality\">Unknown quality</string>\n    <string name=\"unknown_audio_track\">Unknown</string>\n    <string name=\"feed_show_watched\">Fully watched</string>\n    <string name=\"feed_show_partially_watched\">Partially watched</string>\n    <string name=\"feed_show_upcoming\">Upcoming</string>\n    <string name=\"sort\">Sort</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer settings</string>\n    <string name=\"settings_category_exoplayer_summary\">Manage some ExoPlayer settings. These changes require a player restart to take effect</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Use ExoPlayer\\'s decoder fallback feature</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Always use ExoPlayer\\'s video output surface setting workaround</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"audio_track_type_dubbed\">dubbed</string>\n    <string name=\"audio_track_type_descriptive\">descriptive</string>\n    <string name=\"audio_track_type_secondary\">secondary</string>\n    <string name=\"channel_tab_videos\">Videos</string>\n    <string name=\"channel_tab_tracks\">Tracks</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"channel_tab_livestreams\">Live</string>\n    <string name=\"channel_tab_channels\">Channels</string>\n    <string name=\"channel_tab_playlists\">Playlists</string>\n    <string name=\"channel_tab_albums\">Albums</string>\n    <string name=\"channel_tab_likes\">Likes</string>\n    <string name=\"channel_tab_about\">About</string>\n    <string name=\"show_channel_tabs\">Channel tabs</string>\n    <string name=\"show_channel_tabs_summary\">What tabs are shown on the channel pages</string>\n    <string name=\"open_play_queue\">Open play queue</string>\n    <string name=\"toggle_fullscreen\">Toggle fullscreen</string>\n    <string name=\"toggle_screen_orientation\">Toggle screen orientation</string>\n    <string name=\"previous_stream\">Previous stream</string>\n    <string name=\"next_stream\">Next stream</string>\n    <string name=\"play\">Play</string>\n    <string name=\"replay\">Replay</string>\n    <string name=\"more_options\">More options</string>\n    <string name=\"duration\">Duration</string>\n    <string name=\"rewind\">Rewind</string>\n    <string name=\"forward\">Forward</string>\n    <string name=\"image_quality_title\">Image quality</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"image_quality_none\">Do not load images</string>\n    <string name=\"image_quality_low\">Low quality</string>\n    <string name=\"image_quality_medium\">Medium quality</string>\n    <string name=\"image_quality_high\">High quality</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist\">Share Playlist</string>\n    <string name=\"share_playlist_with_titles\">Share with Titles</string>\n    <string name=\"share_playlist_with_list\">Share URL list</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Share as YouTube temporary playlist</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"share_playlist_content_details\">%1$s\\n%2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s reply</item>\n        <item quantity=\"other\">%s replies</item>\n    </plurals>\n    <string name=\"show_more\">Show more</string>\n    <string name=\"show_less\">Show less</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud Top 50 page removed</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud has discontinued the original Top 50 charts. The corresponding tab has been removed from your main page.</string>\n    <string name=\"migration_info_7_8_title\">YouTube combined trending removed</string>\n    <string name=\"migration_info_7_8_message\">YouTube has discontinued the combined trending page as of 21st July 2025. NewPipe replaced the default trending page with the trending livestreams.\\n\\nYou can also select different trending pages in \\\"Settings > Content > Content of main page\\\".</string>\n    <string name=\"trending_gaming\">Gaming trends</string>\n    <string name=\"trending_podcasts\">Trending podcasts</string>\n    <string name=\"trending_movies\">Trending movies and shows</string>\n    <string name=\"trending_music\">Trending music</string>\n    <string name=\"entry_deleted\">Entry deleted</string>\n    <string name=\"player_http_403\">HTTP error 403 received from server while playing, likely caused by streaming URL expiration or an IP ban</string>\n    <string name=\"player_http_invalid_status\">HTTP error %1$s received from server while playing</string>\n    <string name=\"youtube_player_http_403\">HTTP error 403 received from server while playing, likely caused by an IP ban or streaming URL deobfuscation issues</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s refused to provide data, asking for a login to confirm the requester is not a bot.\\n\\nYour IP might have been temporarily banned by %1$s, you can wait some time or switch to a different IP (for example by turning on/off a VPN, or by switching from WiFi to mobile data).\\n\\nPlease see <a href=\"%2$s\">this FAQ entry</a> for more information.</string>\n    <string name=\"unsupported_content_in_country\">This content is not available for the currently selected content country.\\n\\nChange your selection from \\\"Settings > Content > Default content country\\\".</string>\n    <string name=\"kao_dialog_warning\">In August 2025, Google announced that as of September 2026, installing apps will require developer verification for all Android apps on certified devices, including those installed outside of the Play Store. Since the developers of NewPipe do not agree to this requirement, NewPipe will no longer work on certified Android devices after that time.</string>\n    <string name=\"kao_dialog_more_info\">Details</string>\n    <string name=\"kao_solution\">Solution</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Opening Theme -->\n    <style name=\"Base.V21.OpeningTheme\" parent=\"Theme.AppCompat.DayNight.NoActionBar\">\n        <item name=\"colorPrimary\">@android:color/transparent</item>\n        <item name=\"colorPrimaryDark\">@android:color/transparent</item>\n        <item name=\"colorAccent\">@android:color/transparent</item>\n\n        <item name=\"android:windowBackground\">@drawable/splash_background</item>\n    </style>\n    <style name=\"Base.OpeningTheme\" parent=\"Base.V21.OpeningTheme\">\n        <item name=\"android:navigationBarColor\">@color/light_youtube_primary_color</item>\n    </style>\n    <style name=\"OpeningTheme\" parent=\"Base.OpeningTheme\" />\n\n    <!-- Base Theme -->\n    <style name=\"Base.V21\" parent=\"Theme.AppCompat.DayNight.NoActionBar\">\n        <item name=\"actionColor\">@color/white</item>\n        <item name=\"floatingActionButtonStyle\">@style/FloatingActionButtonTheme</item>\n        <item name=\"toolbarSearchColor\">@color/white</item>\n        <item name=\"colorControlActivated\">?attr/colorPrimary</item>\n    </style>\n    <style name=\"Base\" parent=\"Base.V21\"/>\n\n    <!-- Light Theme -->\n    <style name=\"Base.V21.LightTheme\" parent=\"Base\">\n        <item name=\"colorPrimary\">@color/light_youtube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/light_youtube_primary_color</item>\n        <item name=\"colorAccent\">@color/light_youtube_accent_color</item>\n        <item name=\"android:windowBackground\">@color/light_background_color</item>\n        <item name=\"windowBackground\">@color/light_background_color</item>\n\n        <item name=\"separator_color\">@color/light_separator_color</item>\n        <item name=\"contrast_background_color\">@color/light_contrast_background_color</item>\n        <item name=\"checked_selector\">@drawable/selector_checked_light</item>\n        <item name=\"focused_selector\">@drawable/selector_focused_light</item>\n        <item name=\"toolbar_shadow\">@drawable/toolbar_shadow_light</item>\n        <item name=\"selector\">@drawable/selector_light</item>\n        <item name=\"colorControlHighlight\">@color/light_ripple_color</item>\n        <item name=\"progress_horizontal_drawable\">@drawable/progress_youtube_horizontal_light</item>\n        <item name=\"card_item_background_color\">@color/light_card_item_background_color</item>\n        <item name=\"card_item_contrast_color\">@color/light_card_item_contrast_color</item>\n        <item name=\"border_color\">@color/light_border_color</item>\n        <item name=\"dashed_border\">@drawable/dashed_border_light</item>\n    </style>\n    <style name=\"Base.LightTheme\" parent=\"Base.V21.LightTheme\" />\n    <style name=\"LightTheme\" parent=\"Base.LightTheme\"/>\n\n    <!-- Dark Theme -->\n    <style name=\"Base.V21.DarkTheme\" parent=\"Base\">\n        <item name=\"colorPrimary\">@color/dark_youtube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_youtube_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_youtube_accent_color</item>\n        <item name=\"android:windowBackground\">@color/dark_background_color</item>\n        <item name=\"windowBackground\">@color/dark_background_color</item>\n\n        <item name=\"separator_color\">@color/dark_separator_color</item>\n        <item name=\"contrast_background_color\">@color/dark_contrast_background_color</item>\n        <item name=\"checked_selector\">@drawable/selector_checked_dark</item>\n        <item name=\"focused_selector\">@drawable/selector_focused_dark</item>\n        <item name=\"toolbar_shadow\">@drawable/toolbar_shadow_dark</item>\n        <item name=\"selector\">@drawable/selector_dark</item>\n        <item name=\"colorControlHighlight\">@color/dark_ripple_color</item>\n        <item name=\"progress_horizontal_drawable\">@drawable/progress_youtube_horizontal_dark</item>\n        <item name=\"card_item_background_color\">@color/dark_card_item_background_color</item>\n        <item name=\"card_item_contrast_color\">@color/dark_card_item_contrast_color</item>\n        <item name=\"border_color\">@color/dark_border_color</item>\n        <item name=\"dashed_border\">@drawable/dashed_border_dark</item>\n    </style>\n    <style name=\"Base.DarkTheme\" parent=\"Base.V21.DarkTheme\" />\n    <style name=\"DarkTheme\" parent=\"Base.DarkTheme\"/>\n\n    <!-- Black Theme -->\n    <style name=\"Base.V21.BlackTheme\" parent=\"DarkTheme\">\n        <item name=\"android:windowBackground\">@color/black_background_color</item>\n        <item name=\"windowBackground\">@color/black_background_color</item>\n\n        <item name=\"separator_color\">@color/black_separator_color</item>\n        <item name=\"contrast_background_color\">@color/black_contrast_background_color</item>\n\n        <item name=\"card_item_background_color\">@color/black_card_item_background_color</item>\n        <item name=\"card_item_contrast_color\">@color/black_card_item_contrast_color</item>\n        <item name=\"border_color\">@color/black_border_color</item>\n        <item name=\"dashed_border\">@drawable/dashed_border_black</item>\n    </style>\n    <style name=\"Base.BlackTheme\" parent=\"Base.V21.BlackTheme\" />\n    <style name=\"BlackTheme\" parent=\"Base.BlackTheme\"/>\n\n    <!-- Dialogs -->\n    <style name=\"LightDialogTheme\" parent=\"Theme.AppCompat.DayNight.Dialog\">\n        <item name=\"colorPrimary\">@color/light_youtube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/light_youtube_primary_color</item>\n        <item name=\"colorAccent\">@color/light_youtube_accent_color</item>\n        <item name=\"android:windowBackground\">@color/light_dialog_background_color</item>\n        <item name=\"windowBackground\">@color/light_dialog_background_color</item>\n    </style>\n\n    <style name=\"DarkDialogTheme\" parent=\"Theme.AppCompat.DayNight.Dialog\">\n        <item name=\"colorPrimary\">@color/dark_youtube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_youtube_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_youtube_accent_color</item>\n        <item name=\"android:windowBackground\">@color/dark_dialog_background_color</item>\n        <item name=\"windowBackground\">@color/dark_dialog_background_color</item>\n    </style>\n\n    <style name=\"LightDialogMinWidthTheme\" parent=\"Theme.AppCompat.DayNight.Dialog.MinWidth\">\n        <item name=\"colorPrimary\">@color/light_youtube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/light_youtube_primary_color</item>\n        <item name=\"colorAccent\">@color/light_youtube_accent_color</item>\n        <item name=\"android:windowBackground\">@color/light_dialog_background_color</item>\n        <item name=\"windowBackground\">@color/light_dialog_background_color</item>\n    </style>\n\n    <style name=\"DarkDialogMinWidthTheme\" parent=\"Theme.AppCompat.DayNight.Dialog.MinWidth\">\n        <item name=\"colorPrimary\">@color/dark_youtube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_youtube_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_youtube_accent_color</item>\n        <item name=\"android:windowBackground\">@color/dark_dialog_background_color</item>\n        <item name=\"windowBackground\">@color/dark_dialog_background_color</item>\n    </style>\n\n    <!-- Settings -->\n    <style name=\"LightSettingsTheme\" parent=\"LightTheme\">\n        <item name=\"colorAccent\">@color/light_settings_accent_color</item>\n    </style>\n\n    <style name=\"DarkSettingsTheme\" parent=\"DarkTheme\">\n        <item name=\"colorAccent\">@color/dark_settings_accent_color</item>\n    </style>\n\n    <style name=\"BlackSettingsTheme\" parent=\"BlackTheme\">\n        <item name=\"colorAccent\">@color/black_settings_accent_color</item>\n    </style>\n\n    <!-- Router Activity -->\n    <style name=\"Base.RouterActivityThemeLight\" parent=\"LightTheme\">\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:colorBackgroundCacheHint\">@null</item>\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowAnimationStyle\">@null</item>\n        <item name=\"android:statusBarColor\">@android:color/transparent</item>\n    </style>\n\n    <style name=\"RouterActivityThemeLight\" parent=\"Base.RouterActivityThemeLight\" />\n\n    <style name=\"Base.RouterActivityThemeDark\" parent=\"DarkTheme\">\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:colorBackgroundCacheHint\">@null</item>\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowAnimationStyle\">@null</item>\n        <item name=\"android:statusBarColor\">@android:color/transparent</item>\n    </style>\n\n    <style name=\"RouterActivityThemeDark\" parent=\"Base.RouterActivityThemeDark\" />\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles_misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- Follows service's primary color -->\n    <style name=\"ServiceColoredButton\" parent=\"Widget.AppCompat.Button.Colored\">\n        <item name=\"colorButtonNormal\">?attr/colorPrimary</item>\n        <item name=\"android:textColor\">@color/subscribe_text_color</item>\n        <item name=\"colorControlHighlight\">@color/dark_ripple_color</item>\n    </style>\n\n\n    <!--File picker styles-->\n    <style name=\"FilePickerThemeLight\" parent=\"NNF_BaseTheme.Light\">\n        <item name=\"colorPrimary\">@color/light_youtube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/light_youtube_primary_color</item>\n        <item name=\"colorAccent\">@color/light_settings_accent_color</item>\n\n        <item name=\"actionColor\">@color/white</item>\n        <item name=\"nnf_toolbarTheme\">@style/ToolbarTheme</item>\n\n        <item name=\"android:windowBackground\">@color/light_background_color</item>\n        <item name=\"nnf_separator_color\">@color/light_separator_color</item>\n\n        <item name=\"alertDialogTheme\">@style/FilePickerAlertDialogThemeLight</item>\n    </style>\n\n    <style name=\"FilePickerThemeDark\" parent=\"NNF_BaseTheme\">\n        <item name=\"colorPrimary\">@color/dark_youtube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_youtube_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_settings_accent_color</item>\n\n        <item name=\"actionColor\">@color/white</item>\n        <item name=\"nnf_toolbarTheme\">@style/ToolbarTheme</item>\n\n        <item name=\"android:windowBackground\">@color/dark_background_color</item>\n        <item name=\"nnf_separator_color\">@color/black_separator_color</item>\n\n        <item name=\"alertDialogTheme\">@style/FilePickerAlertDialogThemeDark</item>\n    </style>\n\n    <style name=\"FilePickerAlertDialogThemeLight\" parent=\"Theme.AppCompat.DayNight.Dialog.Alert\">\n        <item name=\"colorPrimary\">@color/light_youtube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/light_youtube_primary_color</item>\n        <item name=\"colorAccent\">@color/light_settings_accent_color</item>\n    </style>\n\n    <style name=\"FilePickerAlertDialogThemeDark\" parent=\"Theme.AppCompat.DayNight.Dialog.Alert\">\n        <item name=\"colorPrimary\">@color/dark_youtube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_youtube_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_settings_accent_color</item>\n    </style>\n\n    <style name=\"PlayQueueItemTextTheme\">\n        <item name=\"android:textAppearanceLarge\">@style/PlayQueueItemTitle</item>\n        <item name=\"android:textAppearanceSmall\">@style/PlayQueueItemSubtitle</item>\n    </style>\n\n    <style name=\"PlayQueueItemTitle\" parent=\"TextAppearance.AppCompat.Large\">\n        <item name=\"android:textColor\">@color/white</item>\n    </style>\n    <style name=\"PlayQueueItemSubtitle\" parent=\"TextAppearance.AppCompat.Small\">\n        <item name=\"android:textColor\">@color/white_secondary</item>\n    </style>\n\n    <style name=\"FloatingActionButtonTheme\" parent=\"Widget.Design.FloatingActionButton\">\n        <item name=\"tint\">?attr/actionColor</item>\n    </style>\n\n    <style name=\"DarkPopupMenu\" parent=\"ThemeOverlay.AppCompat.Dark.ActionBar\" />\n\n    <style name=\"ToolbarTheme\" parent=\"ThemeOverlay.AppCompat.Dark.ActionBar\">\n        <item name=\"popupTheme\">@style/ToolbarPopupTheme</item>\n        <item name=\"android:textColorPrimary\">?attr/actionColor</item>\n        <item name=\"android:textColorSecondary\">?attr/actionColor</item>\n        <item name=\"tint\">?attr/actionColor</item>\n        <item name=\"iconTint\">?attr/actionColor</item>\n    </style>\n    <style name=\"ToolbarPopupTheme\" parent=\"ThemeOverlay.AppCompat.DayNight.ActionBar\">\n        <item name=\"tint\">@color/contrastColor</item>\n    </style>\n    <style name=\"ContrastToolbarTheme\" parent=\"ThemeOverlay.AppCompat.DayNight.ActionBar\">\n        <item name=\"popupTheme\">@style/ToolbarPopupTheme</item>\n        <item name=\"android:textColorPrimary\">@color/contrastColor</item>\n        <item name=\"android:textColorSecondary\">@color/contrastColor</item>\n        <item name=\"tint\">@color/contrastColor</item>\n        <item name=\"iconTint\">@color/contrastColor</item>\n        <item name=\"toolbarSearchColor\">@color/contrastColor</item>\n    </style>\n\n    <style name=\"WhiteTintTheme\">\n        <item name=\"tint\">@color/white</item>\n        <item name=\"iconTint\">@color/white</item>\n    </style>\n    <style name=\"ContrastTintTheme\">\n        <item name=\"tint\">@color/contrastColor</item>\n        <item name=\"iconTint\">@color/contrastColor</item>\n    </style>\n\n    <style name=\"ToolbarSearchInputTheme\">\n        <item name=\"colorPrimary\">?attr/toolbarSearchColor</item>\n        <item name=\"colorPrimaryDark\">?attr/toolbarSearchColor</item>\n        <item name=\"colorAccent\">?attr/toolbarSearchColor</item>\n    </style>\n\n    <style name=\"CircularImageView\">\n        <item name=\"cornerFamily\">rounded</item>\n        <item name=\"cornerSize\">50%</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles_services.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <!-- YouTube -->\n    <style name=\"LightTheme.YouTube\" parent=\"LightTheme\" tools:keep=\"@style/LightTheme_YouTube\">\n        <item name=\"colorPrimaryDark\">@color/light_youtube_primary_color</item>\n    </style>\n\n    <style name=\"DarkTheme.YouTube\" parent=\"DarkTheme\" tools:keep=\"@style/DarkTheme_YouTube\">\n        <item name=\"colorPrimaryDark\">@color/dark_youtube_primary_color</item>\n    </style>\n\n    <style name=\"BlackTheme.YouTube\" parent=\"BlackTheme\" tools:keep=\"@style/BlackTheme_YouTube\">\n        <item name=\"colorPrimaryDark\">@color/dark_youtube_primary_color</item>\n    </style>\n\n    <!-- SoundCloud -->\n    <style name=\"LightTheme.SoundCloud\" parent=\"LightTheme\" tools:keep=\"@style/LightTheme_SoundCloud\">\n        <item name=\"colorPrimary\">@color/light_soundcloud_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/light_soundcloud_primary_color</item>\n        <item name=\"colorAccent\">@color/light_soundcloud_accent_color</item>\n        <item name=\"progress_horizontal_drawable\">@drawable/progress_soundcloud_horizontal_light\n        </item>\n    </style>\n\n    <style name=\"DarkTheme.SoundCloud\" parent=\"DarkTheme\" tools:keep=\"@style/DarkTheme_SoundCloud\">\n        <item name=\"colorPrimary\">@color/dark_soundcloud_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_soundcloud_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_soundcloud_accent_color</item>\n        <item name=\"progress_horizontal_drawable\">@drawable/progress_soundcloud_horizontal_dark\n        </item>\n    </style>\n\n    <style name=\"BlackTheme.SoundCloud\" parent=\"BlackTheme\" tools:keep=\"@style/BlackTheme_SoundCloud\">\n        <item name=\"colorPrimary\">@color/dark_soundcloud_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_soundcloud_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_soundcloud_accent_color</item>\n        <item name=\"progress_horizontal_drawable\">@drawable/progress_soundcloud_horizontal_dark\n        </item>\n    </style>\n\n    <!-- PeerTube -->\n    <style name=\"LightTheme.PeerTube\" parent=\"LightTheme\" tools:keep=\"@style/LightTheme_PeerTube\">\n        <item name=\"colorPrimary\">@color/light_peertube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/light_peertube_primary_color</item>\n        <item name=\"colorAccent\">@color/light_peertube_accent_color</item>\n    </style>\n\n    <style name=\"DarkTheme.PeerTube\" parent=\"DarkTheme\" tools:keep=\"@style/DarkTheme_PeerTube\">\n        <item name=\"colorPrimary\">@color/dark_peertube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_peertube_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_peertube_accent_color</item>\n    </style>\n\n    <style name=\"BlackTheme.PeerTube\" parent=\"BlackTheme\" tools:keep=\"@style/BlackTheme_PeerTube\">\n        <item name=\"colorPrimary\">@color/dark_peertube_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_peertube_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_peertube_accent_color</item>\n    </style>\n\n    <!-- media.ccc.de -->\n    <style name=\"LightTheme.media.ccc.de\" parent=\"LightTheme\" tools:keep=\"@style/LightTheme_media_ccc_de\">\n        <item name=\"colorPrimary\">@color/light_media_ccc_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/light_media_ccc_primary_color</item>\n        <item name=\"colorAccent\">@color/light_media_ccc_accent_color</item>\n    </style>\n\n    <style name=\"DarkTheme.media.ccc.de\" parent=\"DarkTheme\" tools:keep=\"@style/DarkTheme_media_ccc_de\">\n        <item name=\"colorPrimary\">@color/dark_media_ccc_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_media_ccc_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_media_ccc_accent_color</item>\n    </style>\n\n    <style name=\"BlackTheme.media.ccc.de\" parent=\"BlackTheme\" tools:keep=\"@style/BlackTheme_media_ccc_de\">\n        <item name=\"colorPrimary\">@color/dark_media_ccc_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_media_ccc_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_media_ccc_accent_color</item>\n    </style>\n\n    <!-- Bandcamp -->\n    <style name=\"LightTheme.Bandcamp\" parent=\"LightTheme\" tools:keep=\"@style/LightTheme_Bandcamp\">\n        <item name=\"colorPrimary\">@color/light_bandcamp_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/light_bandcamp_primary_color</item>\n        <item name=\"colorAccent\">@color/light_bandcamp_accent_color</item>\n    </style>\n\n    <style name=\"DarkTheme.Bandcamp\" parent=\"DarkTheme\" tools:keep=\"@style/DarkTheme_Bandcamp\">\n        <item name=\"colorPrimary\">@color/dark_bandcamp_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_bandcamp_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_bandcamp_accent_color</item>\n    </style>\n\n    <style name=\"BlackTheme.Bandcamp\" parent=\"BlackTheme\" tools:keep=\"@style/BlackTheme_Bandcamp\">\n        <item name=\"colorPrimary\">@color/dark_bandcamp_primary_color</item>\n        <item name=\"colorPrimaryDark\">@color/dark_bandcamp_primary_color</item>\n        <item name=\"colorAccent\">@color/dark_bandcamp_accent_color</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ace/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"share_dialog_title\">Bagi ngen</string>\n    <string name=\"did_you_mean\">Nyoe meukeusud droe: %1$s\\?</string>\n    <string name=\"settings\">Peuato</string>\n    <string name=\"search\">Seutot</string>\n    <string name=\"controls_download_desc\">Peutren berkaih stream</string>\n    <string name=\"download\">Peutren</string>\n    <string name=\"share\">Bagi</string>\n    <string name=\"open_in_popup_mode\">Peuhah bak popup mode</string>\n    <string name=\"open_in_browser\">Peuhah bak peladen</string>\n    <string name=\"cancel\">Peubateu</string>\n    <string name=\"install\">Pasang</string>\n    <string name=\"no_player_found_toast\">Hana jiteumeung player (droe jeut pasang VLC keu puta nyan).</string>\n    <string name=\"no_player_found\">Hana jiteumeung stream player. Pasang VLC\\?</string>\n    <string name=\"upload_date_text\">Peuleumah bak %1$s</string>\n    <string name=\"main_bg_subtitle\">Theun \\\"Seutot\\\" keu peuphon</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-aeb/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "app/src/main/res/values-af/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"no_player_found\">Geen stream-speler gevind nie. Installeer VLC\\?</string>\n    <string name=\"main_bg_subtitle\">Tik op \\\"Soek\\\" om aan die gang te kom</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ang/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "app/src/main/res/values-ar/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"background_player_playing_toast\">يتم التشغيل في الخلفية</string>\n    <string name=\"cancel\">إلغاء</string>\n    <string name=\"dark_theme_title\">داكن</string>\n    <string name=\"default_audio_format_title\">صيغة الصوت الافتراضية</string>\n    <string name=\"default_resolution_title\">الدقة الافتراضية</string>\n    <string name=\"detail_dislikes_img_view_description\">عدم الإعجاب</string>\n    <string name=\"detail_likes_img_view_description\">الإعجابات</string>\n    <string name=\"detail_thumbnail_view_description\">مدة, تشغيل الفيديو:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">رافع الصورة الرمزية المصغرة</string>\n    <string name=\"did_you_mean\">هل تقصد \\\"%1$s\\\"؟</string>\n    <string name=\"download\">تنزيل</string>\n    <string name=\"download_dialog_title\">تنزيل</string>\n    <string name=\"download_path_audio_dialog_title\">اختر مجلد التنزيل للملفات الصوتية</string>\n    <string name=\"download_path_audio_summary\">يتم تخزين الملفات الصوتية التي تم تنزيلها هنا</string>\n    <string name=\"download_path_audio_title\">مجلد الصوتيات المحفوظة</string>\n    <string name=\"download_path_dialog_title\">اختر مجلد التنزيل لملفات الفيديو</string>\n    <string name=\"download_path_summary\">يتم تخزين ملفات الفيديو التي تم تنزيلها هنا</string>\n    <string name=\"download_path_title\">مجلد تحميل الفيديو</string>\n    <string name=\"install\">ثبيت</string>\n    <string name=\"kore_not_found\">تطبيق Kore غير موجود. هل تريد تثبيته؟</string>\n    <string name=\"light_theme_title\">فاتح</string>\n    <string name=\"network_error\">خطأ في الشبكة</string>\n    <string name=\"no_player_found\">لم يتم العثور على مشغل بث. تود تثبيت VLC؟</string>\n    <string name=\"open_in_browser\">فتح في متصفح الويب</string>\n    <string name=\"play_audio\">الصوت</string>\n    <string name=\"play_with_kodi_title\">تشغيل بواسطة كودي</string>\n    <string name=\"search\">البحث</string>\n    <string name=\"content_language_title\">اللغة الإفتراضية للمحتوى</string>\n    <string name=\"settings\">الإعدادات</string>\n    <string name=\"settings_category_appearance_title\">المظهر</string>\n    <string name=\"settings_category_video_audio_title\">الفيديو والصوت</string>\n    <string name=\"share\">مشاركة</string>\n    <string name=\"share_dialog_title\">مشاركة بواسطة</string>\n    <string name=\"show_next_and_similar_title\">عرض مقاطع الفيديو \\\"التالية\\\" و \\\"المشابهة\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">اعرض خيار لتشغيل الفيديو عبر مركز وسائط Kodi</string>\n    <string name=\"show_play_with_kodi_title\">عرض خيار التشغيل بواسطة كودي</string>\n    <string name=\"theme_title\">السمة</string>\n    <string name=\"upload_date_text\">منشورة على %1$s</string>\n    <string name=\"unsupported_url\">رابط غير مدعوم</string>\n    <string name=\"use_external_audio_player_title\">استخدام مشغل صوت خارجي</string>\n    <string name=\"use_external_video_player_title\">استخدام مشغل فيديو خارجي</string>\n    <string name=\"content_not_available\">المحتوى غير متوفر</string>\n    <string name=\"could_not_load_thumbnails\">تعذر تحميل كافة الصور المصغرة</string>\n    <string name=\"general_error\">خطأ</string>\n    <string name=\"parsing_error\">تعذر تحليل الموقع</string>\n    <string name=\"main_bg_subtitle\">اضغط على العدسة المكبرة للبدء.</string>\n    <string name=\"subscribe_button_title\">اشتراك</string>\n    <string name=\"subscribed_button_title\">مشترك</string>\n    <string name=\"tab_subscriptions\">الاشتراكات</string>\n    <string name=\"fragment_feed_title\">ما الجديد</string>\n    <string name=\"controls_background_title\">في الخلفية</string>\n    <string name=\"black_theme_title\">أسود</string>\n    <string name=\"enable_watch_history_title\">سجل المشاهدة</string>\n    <string name=\"settings_category_history_title\">سجل المشاهدة و ذاكرة التخزين المؤقت</string>\n    <string name=\"content\">المحتوى</string>\n    <string name=\"downloads\">التحميلات</string>\n    <string name=\"downloads_title\">الملفات المحملة</string>\n    <string name=\"all\">الجميع</string>\n    <string name=\"video\">الفيديو</string>\n    <string name=\"settings_category_downloads_title\">التنزيل</string>\n    <string name=\"tab_about\">حول التطبيق &amp; الأسئلة الشائعة</string>\n    <string name=\"title_activity_history\">التاريخ</string>\n    <string name=\"action_history\">التاريخ</string>\n    <string name=\"open_in_popup_mode\">فتح في الوضع المنبثق</string>\n    <string name=\"use_external_video_player_summary\">يزيل الصوت في بعض الجودات</string>\n    <string name=\"channel_unsubscribed\">تم إلغاء الاشتراك في القناة</string>\n    <string name=\"subscription_change_failed\">تعذر تغيير حالة الاشتراك</string>\n    <string name=\"subscription_update_failed\">تعذر تحديث الاشتراك</string>\n    <string name=\"controls_popup_title\">نافذة منبثقة</string>\n    <string name=\"default_popup_resolution_title\">الدقة الافتراضية للنوافذ المنبثقة</string>\n    <string name=\"show_higher_resolutions_title\">عرض دقّات أعلى</string>\n    <string name=\"show_higher_resolutions_summary\">فقط بعض الأجهزة تدعم تشغيل مقاطع فيديو 2K/4K</string>\n    <string name=\"default_video_format_title\">صيغة الفيديو الافتراضية</string>\n    <string name=\"popup_remember_size_pos_title\">تذكر خصائص النوافذ المنبثقة</string>\n    <string name=\"popup_remember_size_pos_summary\">تذكر آخر مكان وحجم للنافذة المنبثقة</string>\n    <string name=\"show_search_suggestions_title\">اقتراحات البحث</string>\n    <string name=\"show_search_suggestions_summary\">اختر الاقتراحات التي تريد إظهارها عند البحث</string>\n    <string name=\"enable_search_history_title\">سجل البحث</string>\n    <string name=\"enable_search_history_summary\">تخزين طلبات البحث محليًّا</string>\n    <string name=\"enable_watch_history_summary\">تتبّع مقاطع الفيديو التي تمّت مشاهدتها</string>\n    <string name=\"resume_on_audio_focus_gain_title\">استئناف التشغيل</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">متابعة التشغيل بعد المقاطعات (مثل المكالمات الهاتفية)</string>\n    <string name=\"show_hold_to_append_title\">إظهار تلميح \\\"اضغط للفتح\\\"</string>\n    <string name=\"show_hold_to_append_summary\">إظهار التلميح عند الضغط على الخلفية أو الزر المنبثق في الفيديو \\\"التفاصيل:\\\"</string>\n    <string name=\"settings_category_player_title\">المشغل</string>\n    <string name=\"settings_category_player_behavior_title\">السلوك</string>\n    <string name=\"popup_playing_toast\">تشغيل في وضع منبثق</string>\n    <string name=\"show_age_restricted_content_title\">محتوى مقيد للبالغين</string>\n    <string name=\"duration_live\">بث مباشر</string>\n    <string name=\"error_report_title\">تقرير عن المشكلة</string>\n    <string name=\"disabled\">معطل</string>\n    <string name=\"clear\">تنظيف</string>\n    <string name=\"best_resolution\">أفضل دقة</string>\n    <string name=\"undo\">تراجع</string>\n    <string name=\"play_all\">تشغيل الكل</string>\n    <string name=\"notification_channel_name\">تنبيهات NewPipe</string>\n    <string name=\"notification_channel_description\">تنبيهات مشغل NewPipe</string>\n    <string name=\"unknown_content\">[غير معروف]</string>\n    <string name=\"could_not_setup_download_menu\">تعذر إعداد قائمة التنزيل</string>\n    <string name=\"app_ui_crash\">تعطل التطبيق / واجهة المستخدم</string>\n    <string name=\"player_stream_failure\">لا يمكن تشغيل هذا البث</string>\n    <string name=\"player_unrecoverable_failure\">حدث خطأ للمشغل غير قابل للاسترداد</string>\n    <string name=\"player_recoverable_failure\">استرداد المشغل من الخطأ</string>\n    <string name=\"sorry_string\">عذرًا، لم ينبغِ أن يحدث ذلك.</string>\n    <string name=\"error_report_button_text\">الإبلاغ عن طريق البريد الإلكتروني</string>\n    <string name=\"error_snackbar_message\">عذرًا، حدث خطأ ما.</string>\n    <string name=\"error_snackbar_action\">أبلِغ</string>\n    <string name=\"what_device_headline\">معلومات:</string>\n    <string name=\"what_happened_headline\">ماذا حدث:</string>\n    <string name=\"info_labels\">ماذا:\\nطلب:\\nلغة المحتوى:\\nبلد المحتوى:\\nلغة التطبيق:\\nالخدمات:\\nتوقيت جرينتش:\\nالحزمة:\\nالإصدار:\\nOS نسخة:</string>\n    <string name=\"your_comment\">تعليقك (باللغة الإنجليزية):</string>\n    <string name=\"error_details_headline\">التفاصيل:</string>\n    <string name=\"search_no_results\">لم يتم العثور على نتائج</string>\n    <string name=\"empty_list_subtitle\">لا شيء هنا سوى الصراصير</string>\n    <string name=\"audio\">الصوت</string>\n    <string name=\"retry\">إعادة المحاولة</string>\n    <string name=\"no_subscribers\">ليس هناك مشترِكون</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"zero\">%s مشارك</item>\n        <item quantity=\"one\">%s مشارك</item>\n        <item quantity=\"two\">%s مشاركين</item>\n        <item quantity=\"few\">%s مشترك</item>\n        <item quantity=\"many\">%s مشترك</item>\n        <item quantity=\"other\">%s مشترك</item>\n    </plurals>\n    <string name=\"no_views\">دون مشاهدات</string>\n    <string name=\"no_videos\">لاتوجد فيديوهات</string>\n    <string name=\"start\">ابدأ</string>\n    <string name=\"pause\">إيقاف مؤقت</string>\n    <string name=\"delete\">احذف</string>\n    <string name=\"checksum\">التوقيع</string>\n    <string name=\"ok\">موافق</string>\n    <string name=\"msg_name\">اسم الملف</string>\n    <string name=\"msg_threads\">التقسيم</string>\n    <string name=\"msg_error\">الخطأ</string>\n    <string name=\"msg_running\">يقوم نيوبايب بالتنزيل</string>\n    <string name=\"msg_running_detail\">انقر للحصول على التفاصيل</string>\n    <string name=\"msg_wait\">يُرجى الإنتظار…</string>\n    <string name=\"msg_copied\">تم نسخه إلى الحافظة</string>\n    <string name=\"no_available_dir\">يرجى تحديد مجلد التنزيل لاحقا في الإعدادات</string>\n    <string name=\"msg_popup_permission\">هذا الإذن مطلوب\n\\nللفتح في وضع النافذة المنبثقة</string>\n    <string name=\"settings_file_charset_title\">السماح بالرموز في أسماء الملفات</string>\n    <string name=\"settings_file_replacement_character_summary\">يتم استبدال الرموز غير المسموح بها بهذه القيمة</string>\n    <string name=\"settings_file_replacement_character_title\">استبدال الحرف</string>\n    <string name=\"charset_letters_and_digits\">الحروف والأرقام</string>\n    <string name=\"charset_most_special_characters\">معظم الأحرف الخاصة</string>\n    <string name=\"title_activity_about\">عن تطبيق نيوپايپ</string>\n    <string name=\"title_licenses\">تراخيص الجهات الخارجية</string>\n    <string name=\"tab_licenses\">التراخيص</string>\n    <string name=\"app_description\">تطبيق مجاني خفيف البث على أندرويد.</string>\n    <string name=\"contribution_title\">ساهم</string>\n    <string name=\"contribution_encouragement\">إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل!</string>\n    <string name=\"view_on_github\">عرض على GitHub</string>\n    <string name=\"donation_title\">تبرَّع</string>\n    <string name=\"donation_encouragement\">يتم تطوير NewPipe من قبل متطوعين يقضون وقت فراغهم لتقديم أفضل تجربة لك. حان الوقت لرد المساعدة مع المطورين وجعل NewPipe أكثر و أفضل بينما يستمتعون بفنجان من القهوة.</string>\n    <string name=\"give_back\">رد الجميل</string>\n    <string name=\"website_title\">موقع الويب</string>\n    <string name=\"website_encouragement\">قم بزيارة موقع NewPipe لمزيد من المعلومات والمستجدات.</string>\n    <string name=\"app_license_title\">تراخيص NewPipe</string>\n    <string name=\"read_full_license\">قراءة الرخصة</string>\n    <string name=\"delete_item_search_history\">هل تريد حذف هذا العنصر من سجل البحث؟</string>\n    <string name=\"main_page_content\">محتوى الشاشة الرئيسية</string>\n    <string name=\"blank_page_summary\">صفحة فارغة</string>\n    <string name=\"channel_page_summary\">صفحة القناة</string>\n    <string name=\"select_a_channel\">اختر قناة</string>\n    <string name=\"no_channel_subscribed_yet\">لم يتم الاشتراك في أي قناة بعد</string>\n    <string name=\"trending\">الشائعة</string>\n    <string name=\"top_50\">أفضل ٥٠</string>\n    <string name=\"new_and_hot\">جديد وساخن</string>\n    <string name=\"play_queue_remove\">أحذف</string>\n    <string name=\"play_queue_stream_detail\">التفاصيل</string>\n    <string name=\"play_queue_audio_settings\">إعدادات الصوت</string>\n    <string name=\"start_here_on_popup\">بدأ التشغيل في نافذة منبثقة</string>\n    <string name=\"title_activity_recaptcha\">تحدي الكابتشا</string>\n    <string name=\"hold_to_append\">ضغط مطول للإدراج الى قائمة الانتظار</string>\n    <plurals name=\"views\">\n        <item quantity=\"zero\">%s مشاهد</item>\n        <item quantity=\"one\">%s مشاهد</item>\n        <item quantity=\"two\">%s مشاهدة</item>\n        <item quantity=\"few\">%s مشاهدة</item>\n        <item quantity=\"many\">%s مشاهدة</item>\n        <item quantity=\"other\">%s مشاهدة</item>\n    </plurals>\n    <plurals name=\"videos\">\n        <item quantity=\"zero\">%s فيديو</item>\n        <item quantity=\"one\">%s أشرطة فيديو</item>\n        <item quantity=\"two\">%s أشرطة فيديو</item>\n        <item quantity=\"few\">%s أشرطة فيديو</item>\n        <item quantity=\"many\">%s أشرطة فيديو</item>\n        <item quantity=\"other\">%s أشرطة فيديو</item>\n    </plurals>\n    <string name=\"recaptcha_request_toast\">طلب اختبار الكابتشا مطلوب</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$sبواسطة%2$sتحت%3$s</string>\n    <string name=\"kiosk_page_summary\">صفحة الكشك</string>\n    <string name=\"select_a_kiosk\">حدد كشك</string>\n    <string name=\"start_here_on_background\">بدأ التشغيل في الخلفية</string>\n    <string name=\"default_content_country_title\">المحتوى الإفتراضي حسب البلد</string>\n    <string name=\"switch_to_background\">الإنتقال إلى التشغيل في الخلفية</string>\n    <string name=\"switch_to_popup\">الإنتقال إلى التشغيل في النافذة المنبثقة</string>\n    <string name=\"switch_to_main\">الإنتقال إلى الرئيسية</string>\n    <string name=\"drawer_open\">فتح الدرج</string>\n    <string name=\"drawer_close\">إغلاق الدرج</string>\n    <string name=\"always\">دائماً</string>\n    <string name=\"just_once\">مرة واحدة فقط</string>\n    <string name=\"no_player_found_toast\">لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيله).</string>\n    <string name=\"import_data_title\">استيراد قاعدة البيانات</string>\n    <string name=\"export_data_title\">تصدير قاعدة البيانات</string>\n    <string name=\"import_data_summary\">يلغي السجل الحالي والاشتراكات وقوائم التشغيل والإعدادات (اختياريًا)</string>\n    <string name=\"export_data_summary\">تصدير السجل، وقوائم تشغيل، والإعدادات، والاشتراكات</string>\n    <string name=\"show_info\">عرض المعلومات</string>\n    <string name=\"controls_add_to_playlist_title\">إضافة إلى</string>\n    <string name=\"settings_category_debug_title\">تحليل</string>\n    <string name=\"video_streams_empty\">لم يتم العثور على أي بث مرئي</string>\n    <string name=\"audio_streams_empty\">لم يتم العثور على أي بث صوتي</string>\n    <string name=\"detail_drag_description\">اسحب لإعادة ترتيب</string>\n    <string name=\"create\">إنشاء</string>\n    <string name=\"dismiss\">إلغاء</string>\n    <string name=\"rename\">إعادة التسمية</string>\n    <string name=\"export_complete_toast\">تمت عملية التصدير</string>\n    <string name=\"import_complete_toast\">تمَّت عملية الإستيراد</string>\n    <string name=\"could_not_import_all_files\">تنبيه: تعذر استيراد كافة الملفات.</string>\n    <string name=\"video_player\">مشغل الفيديو</string>\n    <string name=\"always_ask_open_action\">السؤال دائماً</string>\n    <string name=\"preferred_player_fetcher_notification_title\">الحصول على المعلومات…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">تحميل المحتوى المطلوب</string>\n    <string name=\"create_playlist\">إنشاء قائمة تشغيل جديدة</string>\n    <string name=\"rename_playlist\">إعادة تسمية</string>\n    <string name=\"name\">التسمية</string>\n    <string name=\"add_to_playlist\">إضافة إلى قائمة التشغيل</string>\n    <string name=\"delete_playlist_prompt\">هل تريد حذف قائمة التشغيل هذه؟</string>\n    <string name=\"playlist_creation_success\">تم إنشاء قائمة التشغيل</string>\n    <string name=\"playlist_add_stream_success\">تمت إضافتها إلى قائمة التشغيل</string>\n    <string name=\"resize_fill\">ملء الشاشة</string>\n    <string name=\"resize_zoom\">تكبير</string>\n    <string name=\"controls_download_desc\">تنزيل ملف البث</string>\n    <string name=\"tab_bookmarks\">الإشارات المرجعية</string>\n    <string name=\"use_inexact_seek_title\">استعمال التقديم السريع الغير دقيق</string>\n    <string name=\"use_inexact_seek_summary\">خاصية التقديم الغير دقيق تسمح للمشغل بالقفز خلال الفديو بشكل أسرع مع دقة قفز أقل. خاصية القفز ل5، 15 او 25 لا تعمل مع القفز الغير دقيق</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور</string>\n    <string name=\"file\">الملف</string>\n    <string name=\"invalid_directory\">لا يوجد مثل هذا المجلد</string>\n    <string name=\"file_name_empty_error\">لا يمكن أن يكون اسم الملف فارغًا</string>\n    <string name=\"error_occurred_detail\">حدث خطأٌ ما: %1$s</string>\n    <string name=\"no_valid_zip_file\">ملف مضغوط ZIP غير صالح</string>\n    <string name=\"unbookmark_playlist\">إزالة الإشارة المرجعية</string>\n    <string name=\"resize_fit\">تناسب مع الشاشة</string>\n    <string name=\"caption_auto_generated\">توليد تلقائي</string>\n    <string name=\"import_title\">إستيراد</string>\n    <string name=\"import_from\">استعادة مِن</string>\n    <string name=\"export_to\">تصدير إلى</string>\n    <string name=\"import_ongoing\">عملية الاستعادة جارية …</string>\n    <string name=\"export_ongoing\">عملية التصدير جارية …</string>\n    <string name=\"import_file_title\">إستيراد ملف</string>\n    <string name=\"import_soundcloud_instructions_hint\">معرفك, soundcloud.com/هويتك</string>\n    <string name=\"metadata_cache_wipe_title\">امسح البيانات الوصفيّة المخزّنة مؤقّتًا</string>\n    <string name=\"metadata_cache_wipe_summary\">إزالة جميع بيانات صفحات الويب المخزنة مؤقّتًا</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">تم محو ذاكرة التخزين المؤقتّة للبيانات الوصفيّة</string>\n    <string name=\"auto_queue_title\">وضع البث القادم تلقائيا في قائمة الإنتظار</string>\n    <string name=\"auto_queue_summary\">استمر عند إنهاء قائمة التشغيل (الغير المتكررة) من خلال إلحاق التدفق المرتبط</string>\n    <string name=\"set_as_playlist_thumbnail\">تعيين كصورة مصغرة لقائمة التشغيل</string>\n    <string name=\"bookmark_playlist\">تفضيل قائمة التشغيل</string>\n    <string name=\"playlist_thumbnail_change_success\">تم تغيير الصورة المصغرة لقائمة التشغيل.</string>\n    <string name=\"caption_none\">بدون تسميات توضيحية</string>\n    <string name=\"caption_setting_title\">تسميات توضيحية</string>\n    <string name=\"caption_setting_description\">تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق لتصبح التغييرات سارية المفعول</string>\n    <string name=\"enable_leak_canary_summary\">قد تتسبب مراقبة تسرب الذاكرة في عدم استجابة التطبيق عند تفريغ السجلات</string>\n    <string name=\"enable_disposed_exceptions_title\">تقرير الأخطاء خارج دورة الحياة</string>\n    <string name=\"enable_disposed_exceptions_summary\">فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها</string>\n    <string name=\"clear_views_history_title\">محو سجل المشاهدة</string>\n    <string name=\"clear_views_history_summary\">حذف محفوظات البثوث التي تم تشغيلها ومواقف التشغيل</string>\n    <string name=\"delete_view_history_alert\">حذف سجل المشاهدة بالكامل؟</string>\n    <string name=\"watch_history_deleted\">تم حذف سجل المشاهدة</string>\n    <string name=\"clear_search_history_title\">محو سجل البحث</string>\n    <string name=\"clear_search_history_summary\">يحذف تاريخ البحث عن الكلمات الرئيسية</string>\n    <string name=\"delete_search_history_alert\">حذف سِجل البحث بالكامل؟</string>\n    <string name=\"search_history_deleted\">تم حذف سجل البحث</string>\n    <string name=\"external_player_unsupported_link_type\">المشغل الخارجي لا يدعم هذه الأنواع من الروابط</string>\n    <string name=\"invalid_source\">لا يوجد مثل هذا الملف/مصدر المحتوى</string>\n    <string name=\"invalid_file\">الملف غير موجود أو الإذن بالقراءة أو الكتابة إليه غير موجود</string>\n    <string name=\"no_streams_available_download\">لا يوجد بث متاح للتنزيل</string>\n    <string name=\"one_item_deleted\">تم حذف عنصر واحد.</string>\n    <string name=\"app_license\">NewPipe هو برنامج مفتوح المصدر وبحقوق متروكة: يمكنك استخدام الكود ودراسته وتحسينه كما شئت. وعلى وجه التحديد يمكنك إعادة توزيعه / أو تعديله تحت شروط رخصة GNU العمومية والتي نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (باختيارك) أي إصدار أحدث.</string>\n    <string name=\"title_last_played\">آخر ما تم تشغيله</string>\n    <string name=\"title_most_played\">الأكثر تشغيلا</string>\n    <string name=\"override_current_data\">هذا سوف يُزيل إعداداتك الحالية.</string>\n    <string name=\"preferred_open_action_settings_title\">طريقة \\'التشغيل\\' المفضلة</string>\n    <string name=\"preferred_open_action_settings_summary\">الإجراء الافتراضي عند فتح المحتوى — %s</string>\n    <string name=\"background_player\">مشغل الخلفية</string>\n    <string name=\"popup_player\">المشغل المنبثق</string>\n    <string name=\"previous_export\">نسخة احتياطية</string>\n    <string name=\"subscriptions_import_unsuccessful\">تعذر استيراد الاشتراكات</string>\n    <string name=\"subscriptions_export_unsuccessful\">لا يمكن تصدير الاشتراكات</string>\n    <string name=\"import_youtube_instructions\">استيراد اشتراكات YouTube من Google takeout:\n\\n\n\\n1. انتقل إلى عنوان URL هذا: %1$s\n\\n2. تسجيل الدخول عند سؤالك\n\\n3. انقر على \\\"جميع البيانات المدرجة\\\"، ثم على \\\"إلغاء تحديد جميع\\\"، ثم حدد فقط \\\"الاشتراكات\\\" وانقر على \\\"موافق\\\"\n\\n4. انقر على \\\"الخطوة التالية\\\" ثم على \\\"إنشاء التصدير\\\"\n\\n5. انقر على زر \\\"تحميل\\\" بعد ظهوره\n\\n6. انقر على IMPORT FILE أدناه وحدد الملف البريدي تحميلها\n\\n7. [إذا فشل استيراد الرمز البريدي] استخراج ملف .csv (عادة تحت عنوان \\\"يوتيوب ويوتيوب الموسيقى / الاشتراكات / الاشتراكات.csv\\\")، انقر على IMPORT FILE أدناه وحدد ملف csv المستخرج</string>\n    <string name=\"import_soundcloud_instructions\">قم باستيراد ملف تعريف SoundCloud عن طريق كتابة عنوان URL أو معرفك: \n\\n \n\\n1. تمكين \\\"وضع سطح المكتب\\\" في متصفح الويب (الموقع غير متاح للأجهزة المحمولة) \n\\n2. انتقل إلى عنوان URL هذا: %1$s \n\\n3. تسجيل الدخول عندما يطلب منك\n\\n4. انسخ عنوان URL للملف الشخصي الذي تمت إعادة توجيهك إليه.</string>\n    <string name=\"import_network_expensive_warning\">ضع في اعتبارك أن هذه العملية يمكن أن تكون مكلفة اذا كنت تستخدم بيانات اشتراك انترنت. \n\\n \n\\nهل تريد الاستمرار؟</string>\n    <string name=\"playback_speed_control\">ضوابط سرعة التشغيل</string>\n    <string name=\"playback_tempo\">سرعة الأداء</string>\n    <string name=\"playback_pitch\">تردد الصوت</string>\n    <string name=\"unhook_checkbox\">إلغاء الإرتباط (قد يسبب تشويه)</string>\n    <string name=\"import_settings\">هل تريد أيضا استيراد الإعدادات؟</string>\n    <string name=\"privacy_policy_title\">سياسة خصوصية NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك.\n\\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال.</string>\n    <string name=\"read_privacy_policy\">الإطلاع على سياسة الخصوصية</string>\n    <string name=\"start_accept_privacy_policy\">من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية.\n\\nويجب عليك قبولها لإرسال تقرير الأخطاء إلينا.</string>\n    <string name=\"accept\">قبول</string>\n    <string name=\"decline\">رفض</string>\n    <string name=\"limit_data_usage_none_description\">لا حدود</string>\n    <string name=\"limit_mobile_data_usage_title\">الحد من جودة الفيديو عند استخدام بيانات الهاتف المحمول</string>\n    <string name=\"skip_silence_checkbox\">تسريع إلى الأمام أثناء الصمت</string>\n    <string name=\"playback_step\">خطوة</string>\n    <string name=\"playback_reset\">إعادة تعيين</string>\n    <string name=\"minimize_on_exit_title\">تصغير عند تبديل التطبيق</string>\n    <string name=\"minimize_on_exit_summary\">الإجراء عند التبديل إلى تطبيق آخر من مشغل الفيديو الرئيسي — %s</string>\n    <string name=\"minimize_on_exit_none_description\">لاشيء</string>\n    <string name=\"minimize_on_exit_background_description\">تصغير إلى مشغل الخلفية</string>\n    <string name=\"minimize_on_exit_popup_description\">تصغير إلى مشغل منبثق</string>\n    <string name=\"channels\">القنوات</string>\n    <string name=\"playlists\">قوائم التشغيل</string>\n    <string name=\"tracks\">المسارات</string>\n    <string name=\"users\">المستخدمين</string>\n    <string name=\"unsubscribe\">إلغاء الاشتراك</string>\n    <string name=\"tab_choose\">اختر علامة التبويب</string>\n    <string name=\"settings_category_updates_title\">التحديثات</string>\n    <string name=\"file_deleted\">تم حذف الملف</string>\n    <string name=\"app_update_notification_channel_name\">تنبيه تحديث التطبيق</string>\n    <string name=\"events\">الأحداث</string>\n    <string name=\"app_update_notification_channel_description\">إشعارات لإصدار NewPipe الجديد</string>\n    <string name=\"download_to_sdcard_error_title\">وحدة التخزين الخارجية غير متوفرة</string>\n    <string name=\"download_to_sdcard_error_message\">لا يمكن التنزيل على بطاقة SD الخارجية. هل تريد إعادة تعيين موقع مجلد التنزيل؟</string>\n    <string name=\"saved_tabs_invalid_json\">يتم الان استخدام علامات التبويب الافتراضية بعد حدوث خطأ أثناء قراءة علامات التبويب المحفوظة</string>\n    <string name=\"restore_defaults\">استعادة الضبط الافتراضي</string>\n    <string name=\"restore_defaults_confirmation\">هل تريد استعادة الإعدادات الافتراضية؟</string>\n    <string name=\"subscribers_count_not_available\">عدد المشتركين غير متاح</string>\n    <string name=\"main_page_content_summary\">ما هي التبويبات التي تظهر على الصفحة الرئيسية</string>\n    <string name=\"conferences\">المؤتمرات</string>\n    <string name=\"updates_setting_title\">التحديثات</string>\n    <string name=\"updates_setting_description\">إظهار تنبيه للمطالبة بتحديث التطبيق عندما يتوفر إصدار جديد</string>\n    <string name=\"list_view_mode\">وضع عرض قائمة</string>\n    <string name=\"list\">القائمة</string>\n    <string name=\"grid\">الشبكة</string>\n    <string name=\"auto\">تلقائي</string>\n    <string name=\"app_update_available_notification_title\">تحديث NewPipe متاح!</string>\n    <string name=\"missions_header_finished\">انتهى</string>\n    <string name=\"missions_header_pending\">ريثما</string>\n    <string name=\"paused\">متوقف</string>\n    <string name=\"queued\">في قائمة الانتظار</string>\n    <string name=\"post_processing\">قيد المعالجة</string>\n    <string name=\"enqueue\">قائمة الانتظار</string>\n    <string name=\"permission_denied\">تم رفضها من قبل النظام</string>\n    <string name=\"download_failed\">فشل التنزيل</string>\n    <string name=\"generate_unique_name\">إنشاء اسم فريد</string>\n    <string name=\"overwrite\">الكتابة فوق</string>\n    <string name=\"overwrite_finished_warning\">يوجد ملف تحميل بهذا الاسم موجود مسبقاً</string>\n    <string name=\"download_already_running\">هنالك تحميل قيد التقدم بهذا الاسم</string>\n    <string name=\"show_error\">إظهار خطأ</string>\n    <string name=\"error_file_creation\">لا يمكن إنشاء الملف</string>\n    <string name=\"error_path_creation\">لا يمكن إنشاء المجلد الوجهة</string>\n    <string name=\"error_ssl_exception\">فشل الاتصال الآمن</string>\n    <string name=\"error_unknown_host\">تعذر العثور على الخادم</string>\n    <string name=\"error_connect_host\">لا يمكن الاتصال بالخادم</string>\n    <string name=\"error_http_no_content\">الخادم لا يقوم بإرسال البيانات</string>\n    <string name=\"error_http_unsupported_range\">الخادم لا يقبل التنزيل المتعدد، إعادة المحاولة مع @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">غير موجود</string>\n    <string name=\"error_postprocessing_failed\">فشلت المعالجة الاولية</string>\n    <string name=\"stop\">توقف</string>\n    <string name=\"max_retry_msg\">عدد المحاولات الأقصى</string>\n    <string name=\"max_retry_desc\">الحد الأقصى لعدد المحاولات قبل إلغاء التحميل</string>\n    <string name=\"pause_downloads_on_mobile\">المقاطعة على الشبكات المقيسة</string>\n    <string name=\"pause_downloads_on_mobile_desc\">مفيد عند التبديل إلى بيانات الجوال، ولكن لا يمكن تعليق بعض التنزيلات</string>\n    <string name=\"show_comments_title\">إظهار التعليقات</string>\n    <string name=\"show_comments_summary\">عطّله لإخفاء التعليقات</string>\n    <string name=\"autoplay_title\">تشغيل تلقائي</string>\n    <string name=\"no_comments\">لا توجد تعليقات</string>\n    <string name=\"error_unable_to_load_comments\">تعذر تحميل التعليقات</string>\n    <string name=\"close\">إغلاق</string>\n    <string name=\"enable_playback_resume_title\">استئناف التشغيل</string>\n    <string name=\"enable_playback_resume_summary\">استعادة آخر موقف تشغيل</string>\n    <string name=\"enable_playback_state_lists_title\">المواضع في القوائم</string>\n    <string name=\"enable_playback_state_lists_summary\">إظهار مؤشّرات وضع التشغيل في القوائم</string>\n    <string name=\"settings_category_clear_data_title\">امسح البيانات</string>\n    <string name=\"watch_history_states_deleted\">تم حذف كل مواقف التشغيل</string>\n    <string name=\"missing_file\">نقل الملف أو حذفه</string>\n    <string name=\"overwrite_unrelated_warning\">يوجد ملف بهذا الاسم مسبقاً</string>\n    <string name=\"overwrite_failed\">لا يمكن الكتابة فوق الملف</string>\n    <string name=\"download_already_pending\">هناك تنزيل معلق بهذا الاسم</string>\n    <string name=\"error_postprocessing_stopped\">تم إغلاق NewPipe أثناء العمل على الملف</string>\n    <string name=\"error_insufficient_storage_left\">لم يتبقى مساحة في الجهاز</string>\n    <string name=\"error_progress_lost\">تم فقد التقدم بسبب حذف الملف</string>\n    <string name=\"error_timeout\">انتهى وقت الاتصال</string>\n    <string name=\"confirm_prompt\">هل تريد محو سجل التنزيل، أم تريد حذف جميع الملفات التي تم تنزيلها؟</string>\n    <string name=\"enable_queue_limit\">حد قائمة انتظار التنزيل</string>\n    <string name=\"enable_queue_limit_desc\">سيتم تشغيل تنزيل واحد في نفس الوقت</string>\n    <string name=\"start_downloads\">بدء التنزيلات</string>\n    <string name=\"pause_downloads\">إيقاف التحميل مؤقتًا</string>\n    <string name=\"downloads_storage_ask_title\">اسأل عن مكان التنزيل</string>\n    <string name=\"downloads_storage_ask_summary\">سيتم سؤالك عن مكان حفظ كل تنزيل.\n\\nتمكين منتقي مجلد النظام (SAF) إذا كنت تريد التنزيل إلى بطاقة SD خارجية</string>\n    <string name=\"downloads_storage_use_saf_title\">استخدام منتقي مجلد النظام (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">يسمح \\\"Storage Access Framework\\\" بالتنزيل على بطاقة SD خارجية</string>\n    <string name=\"clear_playback_states_title\">حذف مواقف التشغيل</string>\n    <string name=\"clear_playback_states_summary\">حذف كل مواقف التشغيل</string>\n    <string name=\"delete_playback_states_alert\">حذف كل مواقف التشغيل؟</string>\n    <string name=\"drawer_header_description\">تبديل الخدمة، المحدد حاليًا:</string>\n    <string name=\"default_kiosk_page_summary\">الكشك الافتراضي</string>\n    <string name=\"no_one_watching\">لا توجد مشاهدة</string>\n    <string name=\"no_one_listening\">لا أحد يستمع</string>\n    <plurals name=\"watching\">\n        <item quantity=\"zero\">%s مشاهدة</item>\n        <item quantity=\"one\">%s مشاهدة</item>\n        <item quantity=\"two\">%s مشاهدة</item>\n        <item quantity=\"few\">%s مشاهدات</item>\n        <item quantity=\"many\">%s مشاهدات</item>\n        <item quantity=\"other\">%s مشاهدات</item>\n    </plurals>\n    <plurals name=\"listening\">\n        <item quantity=\"zero\">%s الاستماع</item>\n        <item quantity=\"one\">%s الاستماع</item>\n        <item quantity=\"two\">%s مستمعين</item>\n        <item quantity=\"few\">%s مستمعين</item>\n        <item quantity=\"many\">%s مستمعين</item>\n        <item quantity=\"other\">%s مستمعين</item>\n    </plurals>\n    <string name=\"seek_duration_title\">تسريع إلى الأمام/-ترجيع وقت البحث</string>\n    <string name=\"peertube_instance_url_title\">مثيلات خوادم پيرتيوب</string>\n    <string name=\"peertube_instance_url_summary\">حدد مثيلات PeerTube المفضلة لديك</string>\n    <string name=\"peertube_instance_add_title\">إضافة نموذج</string>\n    <string name=\"peertube_instance_add_help\">أدخل عنوان للمثيل</string>\n    <string name=\"peertube_instance_add_fail\">لا يمكن التحقق من صحة المثال</string>\n    <string name=\"peertube_instance_add_https_only\">يتم دعم عناوين URL HTTPS فقط</string>\n    <string name=\"peertube_instance_add_exists\">مثيل الخادم موجود بالفعل</string>\n    <string name=\"local\">محلي</string>\n    <string name=\"recently_added\">أُضيف مؤخرًا</string>\n    <string name=\"most_liked\">الأكثر إعجابًا</string>\n    <string name=\"playlist_no_uploader\">مُنشأة تلقائيًا (لم يتم العثور على رافع)</string>\n    <string name=\"recovering\">استرد</string>\n    <string name=\"error_download_resource_gone\">لا يمكن استرداد هذا التنزيل</string>\n    <string name=\"choose_instance_prompt\">اختيار مثيل</string>\n    <string name=\"peertube_instance_url_help\">ابحث عن مثيلات الخوادم التي تناسبك على %s</string>\n    <string name=\"clear_download_history\">تنظيف تاريخ التحميل</string>\n    <string name=\"delete_downloaded_files\">حذف الملفات المحملة</string>\n    <string name=\"permission_display_over_apps\">امنح الإذن بالعرض فوق التطبيقات الأخرى</string>\n    <string name=\"app_language_title\">لغة التطبيق</string>\n    <string name=\"systems_language\">النظام الافتراضي</string>\n    <string name=\"subtitle_activity_recaptcha\">اضغط على \\\"تم\\\" عند حلها</string>\n    <string name=\"done\">منجز</string>\n    <string name=\"videos_string\">الفيديوهات</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"zero\">%d ثانية</item>\n        <item quantity=\"one\">%d ثانية</item>\n        <item quantity=\"two\">%d ثانية</item>\n        <item quantity=\"few\">%d ثواني</item>\n        <item quantity=\"many\">%d ثانية</item>\n        <item quantity=\"other\">%d ثانية</item>\n    </plurals>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">هل تعتقد أن تحميل التغذية بطيءٌ جدًا؟ إذا كان الأمر كذلك، فحاول تمكين التحميل السريع (يمكنك تغييره في الإعدادات أو بالضغط على الزر أدناه).\n\\n\n\\nيقدم NewPipe استراتيجيتين لتحميل الخلاصة:\n\\n• جلب قناة الاشتراك بأكملها، وهي بطيئة ولكنها كاملة.\n\\n• استخدام نقطة نهاية خدمة مخصصة، وهي سريعة ولكنها عادةً لا تكتمل.\n\\n\n\\nالفرق بين الاثنين هو أن العنصر السريع عادة ما يفتقر إلى بعض المعلومات، مثل مدة العنصر أو نوعه (لا يمكن التمييز بين مقاطع الفيديو المباشرة والأخرى العادية) وقد يعيد عناصر أقل.\n\\n\n\\nيوتيوب هو مثال على الخدمة التي تقدمها هذه طريقة سريعة مع تغذية RSS الخاصة بها.\n\\n\n\\nلذا فإن الاختيار يتلخص في ما تفضله: السرعة أو المعلومات الدقيقة.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">تعطيل الوضع السريع</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">تمكين الوضع السريع</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">متوفر في بعض الخدمات، وعادةً ما يكون أسرع بكثير ولكن قد يُرجع كمية محدودة من العناصر وغالبًا ما تكون معلومات غير مكتملة (مثلًا بدون مدة أو نوع عنصر أو حالة مباشرة)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">جلب من تغذية مخصصة عندما تكون متاحة</string>\n    <string name=\"feed_update_threshold_option_always_update\">تحديث دائمًا</string>\n    <string name=\"feed_update_threshold_summary\">الوقت بعد التحديث الأخير قبل اعتبار الاشتراك قديمًا — %s</string>\n    <string name=\"feed_update_threshold_title\">عتبة تحديث التغذية</string>\n    <string name=\"settings_category_feed_title\">تغذية</string>\n    <string name=\"feed_create_new_group_button_title\">جديد</string>\n    <string name=\"feed_group_dialog_delete_message\">هل تريد حذف هذه المجموعة؟</string>\n    <string name=\"feed_group_dialog_empty_name\">اسم المجموعة فارغ</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"zero\">%d تحديد</item>\n        <item quantity=\"one\">%d المحدد</item>\n        <item quantity=\"two\">%d المحدد</item>\n        <item quantity=\"few\">%d المحدد</item>\n        <item quantity=\"many\">%d المحدد</item>\n        <item quantity=\"other\">%d المحدد</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">لم يتم تحديد اشتراك</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">حدد الاشتراكات</string>\n    <string name=\"feed_processing_message\">يتم معالجة التغذية…</string>\n    <string name=\"feed_notification_loading\">تحميل التغذية…</string>\n    <string name=\"feed_subscription_not_loaded_count\">غير محمل: %d</string>\n    <string name=\"feed_oldest_subscription_update\">آخر تحديث للتغذية: %s</string>\n    <string name=\"feed_groups_header_title\">مجموعات القنوات</string>\n    <plurals name=\"days\">\n        <item quantity=\"zero\">%d يوم</item>\n        <item quantity=\"one\">%d يوم</item>\n        <item quantity=\"two\">%d أيام</item>\n        <item quantity=\"few\">%d أيام</item>\n        <item quantity=\"many\">%d يومًا</item>\n        <item quantity=\"other\">%d يومًا</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"zero\">%d ساعة</item>\n        <item quantity=\"one\">%d ساعة</item>\n        <item quantity=\"two\">%d ساعة</item>\n        <item quantity=\"few\">%d ساعات</item>\n        <item quantity=\"many\">%d ساعة</item>\n        <item quantity=\"other\">%d ساعة</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"zero\">%d دقيقة</item>\n        <item quantity=\"one\">%d دقيقة</item>\n        <item quantity=\"two\">%d دقيقة</item>\n        <item quantity=\"few\">%d دقائق</item>\n        <item quantity=\"many\">%d دقيقة</item>\n        <item quantity=\"other\">%d دقيقة</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">نظرا لقيود مشغل ExoPlayer مدة التقديم تم ضبطها الى %d ثانية</string>\n    <string name=\"unmute\">إلغاء الكتم</string>\n    <string name=\"mute\">كتم الصوت</string>\n    <string name=\"content_not_supported\">هذا المحتوى ليس مدعومًا من قبل NewPipe.\n\\n\n\\nنأمل أن يكون مدعومًا في التحديثات القادمة.</string>\n    <string name=\"infinite_videos\">∞ فيديو</string>\n    <string name=\"more_than_100_videos\">+100 فيديو</string>\n    <string name=\"artists\">الفنانين</string>\n    <string name=\"albums\">الالبومات</string>\n    <string name=\"songs\">الأغاني</string>\n    <string name=\"restricted_video\">هذا الفيديو مقيد بالفئة العمرية.\n\\n\n\\nقم بتشغيل \\\"%1$s\\\" في الإعدادات إذا كنت تريد رؤيته.</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا</string>\n    <string name=\"remove_watched_popup_warning\">ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل. \\nهل أنت واثق؟ لا يمكن التراجع عن هذا!</string>\n    <string name=\"remove_watched_popup_title\">إزالة مقاطع الفيديو التي تمت مشاهدتها؟</string>\n    <string name=\"remove_watched\">إزالة ما تمت مشاهدته</string>\n    <string name=\"show_original_time_ago_summary\">ستكون النصوص الأصلية من الخدمات مرئية في عناصر البث</string>\n    <string name=\"show_original_time_ago_title\">عرض الوقت الأصلي على العناصر</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">قم بتشغيل \\\"وضع تقييد المحتوى\\\" في يوتيوب</string>\n    <string name=\"video_detail_by\">بواسطة %s</string>\n    <string name=\"channel_created_by\">أنشأها %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">الصورة الرمزية للقناة</string>\n    <string name=\"playlist_page_summary\">صفحة قائمة التشغيل</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">إظهار الاشتراكات غير المجمعة فقط</string>\n    <string name=\"no_playlist_bookmarked_yet\">لا توجد إشارات مرجعية لقائمة التشغيل حتى الآن</string>\n    <string name=\"select_a_playlist\">اختر قائمة تشغيل</string>\n    <string name=\"error_report_open_github_notice\">يرجى مراجعة ما إذا توجد بالفعل مشكلة تناقش التحطم الموجود بالفعل. عند إنشاء تذاكر مكررة، فإنك تستغرق منا وقتًا يمكن أن نقضيه في إصلاح الخطأ الفعلي.</string>\n    <string name=\"error_report_open_issue_button_text\">تقرير على GitHub</string>\n    <string name=\"copy_for_github\">نسخ التقرير مُنسق</string>\n    <string name=\"search_showing_result_for\">عرض نتائج ل: %s</string>\n    <string name=\"never\">أبدا</string>\n    <string name=\"wifi_only\">فقط على شبكة Wi-Fi</string>\n    <string name=\"autoplay_summary\">بدء التشغيل تلقائياً — %s</string>\n    <string name=\"title_activity_play_queue\">تشغيل قائمة الانتظار</string>\n    <string name=\"unsupported_url_dialog_message\">تعذر التعرف على الرابط. فتح باستخدام تطبيق آخر؟</string>\n    <string name=\"auto_queue_toggle\">قائمة انتظار تلقائيّة</string>\n    <string name=\"clear_queue_confirmation_description\">سيتم استبدال قائمة انتظار للمشغل النشط</string>\n    <string name=\"clear_queue_confirmation_summary\">قد يؤدي التبديل من مشغل إلى آخر إلى استبدال قائمة الانتظار الخاصة بك</string>\n    <string name=\"clear_queue_confirmation_title\">طلب تأكيد قبل مسح قائمة الانتظار</string>\n    <string name=\"notification_action_nothing\">لا شيء</string>\n    <string name=\"notification_action_buffering\">جارٍ التحميل</string>\n    <string name=\"notification_action_shuffle\">خلط</string>\n    <string name=\"notification_action_repeat\">تكرار</string>\n    <string name=\"notification_actions_at_most_three\">يمكنك تحديد ثلاثة إجراءات كحد أقصى لإظهارها في الإشعار المضغوط!</string>\n    <string name=\"notification_actions_summary\">قم بتحرير كل إجراء إعلام أدناه من خلال النقر عليه. حدد ما يصل إلى ثلاثة منها ليتم عرضها في الإشعار المضغوط باستخدام مربعات الاختيار الموجودة على اليمين.</string>\n    <string name=\"notification_action_4_title\">زر الإجراء الخامس</string>\n    <string name=\"notification_action_3_title\">زر الإجراء الرابع</string>\n    <string name=\"notification_action_2_title\">زر الإجراء الثالث</string>\n    <string name=\"notification_action_1_title\">زر الإجراء الثاني</string>\n    <string name=\"notification_action_0_title\">زر الإجراء الأول</string>\n    <string name=\"notification_scale_to_square_image_summary\">قم بقص الصورة المصغرة للفيديو الموضحة في الإشعار من نسبة العرض إلى الارتفاع 16: 9 إلى 1: 1</string>\n    <string name=\"notification_scale_to_square_image_title\">اقتصاص الصورة المصغرة إلى نسبة العرض إلى الارتفاع 1:1</string>\n    <string name=\"clear_cookie_summary\">امسح ملفات تعريف الارتباط التي يخزنها NewPipe عند حل reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">تم مسح ملفات تعريف الارتباط reCAPTCHA</string>\n    <string name=\"clear_cookie_title\">امسح ملفات تعريف الارتباط reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">يوفر YouTube \\\"وضع تقييد المحتوى\\\" الذي يخفي المحتوى المحتمل للكبار</string>\n    <string name=\"show_age_restricted_content_summary\">عرض المحتوى الذي يُحتمل أن يكون غير مناسب للأطفال لأن له حدًا عمريًا (مثل 18+)</string>\n    <string name=\"show_memory_leaks\">إظهار تسرب الذاكرة</string>\n    <string name=\"enqueued\">قائمة الانتظار</string>\n    <string name=\"enqueue_stream\">قائمة الانتظار</string>\n    <string name=\"notification_colorize_summary\">اجعل أندرويد يخصص لون الإشعار وفقا للّون الرئيسي في الصورة المصغرة (لاحظ أن هذا غير متوفر على جميع الأجهزة)</string>\n    <string name=\"notification_colorize_title\">تلوين الإشعارات</string>\n    <string name=\"show_thumbnail_summary\">استخدم الصورة المصغرة لكل من خلفية شاشة القفل والإشعارات</string>\n    <string name=\"show_thumbnail_title\">إظهار الصورة المصغرة</string>\n    <string name=\"show_meta_info_summary\">قم بإيقاف التشغيل لإخفاء مربعات المعلومات الوصفية بمعلومات إضافية حول منشئ البث أو محتوى البث أو طلب البحث</string>\n    <string name=\"show_meta_info_title\">إظهار معلومات التعريف</string>\n    <string name=\"recent\">حديثة</string>\n    <string name=\"msg_calculating_hash\">حساب التجزئة</string>\n    <string name=\"hash_channel_description\">إشعارات لتقدم تجزئة الفيديو</string>\n    <string name=\"hash_channel_name\">إشعار تجزئة الفيديو</string>\n    <string name=\"no_app_to_open_intent\">لا يوجد تطبيق على جهازك يمكنه فتح هذا</string>\n    <string name=\"chapters\">فصول</string>\n    <string name=\"description_tab_description\">وصف</string>\n    <string name=\"related_items_tab_description\">التيارات ذات الصلة</string>\n    <string name=\"comments_tab_description\">تعليقات</string>\n    <string name=\"show_description_summary\">قم بإيقاف التشغيل لإخفاء وصف الفيديو والمعلومات الإضافية</string>\n    <string name=\"show_description_title\">إظهار الوصف</string>\n    <string name=\"open_with\">افتح باستخدام</string>\n    <string name=\"paid_content\">يتوفر هذا المحتوى فقط للمستخدمين الذين قاموا بالدفع، لذلك لا يمكن بثه أو تنزيله عبر NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">يتوفر هذا الفيديو فقط لأعضاء YouTube Music Premium، لذلك لا يمكن بثه أو تنزيله من قبل NewPipe.</string>\n    <string name=\"private_content\">هذا المحتوى خاص، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">هذا مسار SoundCloud Go+، على الأقل في بلدك، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe.</string>\n    <string name=\"georestricted_content\">هذا المحتوى غير متوفر في بلدك.</string>\n    <string name=\"crash_the_app\">اغلق التطبيق قسريا</string>\n    <string name=\"restricted_video_no_stream\">هذا الفيديو مقيد بالفئة العمرية.\n\\nنظرًا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـ NewPipe الوصول إلى أي من تدفقات الفيديو الخاصة به، وبالتالي لا يتمكن من تشغيلها.</string>\n    <string name=\"radio\">إذاعة</string>\n    <string name=\"featured\">المميزة</string>\n    <string name=\"recaptcha_solve\">حل</string>\n    <string name=\"download_has_started\">بدأ التنزيل</string>\n    <string name=\"select_night_theme_toast\">يمكنك اختيار نسقك الليلي المفضل أدناه</string>\n    <string name=\"night_theme_summary\">حدد موضوعك الليلي المفضل — %s</string>\n    <string name=\"auto_device_theme_title\">تلقائي (سمة الجهاز)</string>\n    <string name=\"night_theme_title\">الثيم الليلي</string>\n    <string name=\"show_channel_details\">إظهار تفاصيل القناة</string>\n    <string name=\"disable_media_tunneling_summary\">قم بتعطيل نفق الوسائط إذا واجهت شاشة سوداء أو تقطيع اثناء تشغيل الفيديو.</string>\n    <string name=\"disable_media_tunneling_title\">تعطيل نفق الوسائط</string>\n    <string name=\"metadata_privacy_internal\">داخلي</string>\n    <string name=\"metadata_privacy_private\">خاص</string>\n    <string name=\"metadata_privacy_unlisted\">غير مدرج</string>\n    <string name=\"metadata_privacy_public\">عامة</string>\n    <string name=\"metadata_host\">المضيف</string>\n    <string name=\"metadata_support\">الدعم</string>\n    <string name=\"metadata_language\">اللغة</string>\n    <string name=\"metadata_age_limit\">الحد العمري</string>\n    <string name=\"metadata_privacy\">الخصوصيّة</string>\n    <string name=\"metadata_licence\">الرخصة</string>\n    <string name=\"metadata_tags\">الوسوم</string>\n    <string name=\"metadata_category\">الصنف</string>\n    <string name=\"description_select_disable\">تعطيل تحديد النص في الوصف</string>\n    <string name=\"description_select_enable\">تمكين تحديد نص في الوصف</string>\n    <string name=\"description_select_note\">يمكنك الآن تحديد نص داخل الوصف. لاحظ أن الصفحة قد تومض وقد لا تكون الروابط قابلة للنقر أثناء وضع التحديد.</string>\n    <string name=\"open_website_license\">فتح الموقع</string>\n    <string name=\"account_terminated\">تم إنهاء الحساب</string>\n    <string name=\"feed_load_error_fast_unknown\">لا يوفر وضع التغذية السريعة مزيدًا من المعلومات حول هذا الموضوع.</string>\n    <string name=\"feed_load_error_terminated\">حساب منشئ المحتوى قد تم إنهائه.\n\\nلن يتمكن NewPipe من تحميل هذه الخلاصة في المستقبل.\n\\nهل تريد إلغاء الاشتراك من هذه القناة؟</string>\n    <string name=\"feed_load_error_account_info\">تعذر تحميل تغذية لـ\\'%s\\'.</string>\n    <string name=\"feed_load_error\">خطأ في تحميل الخلاصة</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">بدءًا من Android 10، يتم دعم \\\"Storage Access Framework\\\" فقط</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">سيتم سؤالك عن مكان حفظ كل تنزيل</string>\n    <string name=\"no_dir_yet\">لم يتم تعيين مجلد التحميل، الرجاء اختيار مجلد التحميل الافتراضي الآن</string>\n    <string name=\"off\">إيقاف</string>\n    <string name=\"on\">تشغيل</string>\n    <string name=\"tablet_mode_title\">وضع الجهاز اللوحي</string>\n    <string name=\"comments_are_disabled\">تم تعطيل التعليقات</string>\n    <string name=\"dont_show\">لا تظهر</string>\n    <string name=\"low_quality_smaller\">جودة منخفضة (أصغر)</string>\n    <string name=\"high_quality_larger\">جودة عالية (أكبر)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">معاينة مصغرة على شريط التمرير</string>\n    <string name=\"mark_as_watched\">وضع علامة على تمت مشاهدته</string>\n    <string name=\"detail_heart_img_view_description\">أُعجب بها منشئ المحتوى</string>\n    <string name=\"remote_search_suggestions\">اقتراحات البحث عن بعد</string>\n    <string name=\"local_search_suggestions\">اقتراحات البحث المحلية</string>\n    <string name=\"main_page_content_swipe_remove\">اسحب العناصر لإزالتها</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"zero\">اكتمل %1$s تنزيل</item>\n        <item quantity=\"one\">اكتمل %1$s تنزيل</item>\n        <item quantity=\"two\">اكتمل %1$s تنزيل</item>\n        <item quantity=\"few\">اكتملت %1$s تنزيلات</item>\n        <item quantity=\"many\">اكتمل %1$s تنزيل</item>\n        <item quantity=\"other\">اكتمل %1$s تنزيل</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"zero\">اكتمل التنزيل</item>\n        <item quantity=\"one\">اكتمل التنزيل</item>\n        <item quantity=\"two\">اكتمل التنزيل</item>\n        <item quantity=\"few\">اكتمل تنزيل%s</item>\n        <item quantity=\"many\">اكتملت التنزيلات%s</item>\n        <item quantity=\"other\">اكتملت التنزيلات%s</item>\n    </plurals>\n    <string name=\"start_main_player_fullscreen_summary\">لا تبدأ تشغيل مقاطع الفيديو في المشغل المصغر، ولكن قم بتدوير وضع ملء الشاشة مباشرة، إذا تم تأمين التدوير التلقائي. لا يزال بإمكانك الوصول إلى المشغل المصغر عن طريق الخروج من ملء الشاشة</string>\n    <string name=\"start_main_player_fullscreen_title\">بدء تشغيل المشغل الرئيسي في وضع ملء الشاشة</string>\n    <string name=\"enqueue_next_stream\">وضع التالي على قائمة الانتظار</string>\n    <string name=\"enqueued_next\">تم وضع التالي على قائمة الانتظار</string>\n    <string name=\"processing_may_take_a_moment\">جاري المعالجة ... قد يستغرق لحظة</string>\n    <string name=\"check_for_updates\">التحقق من وجود تحديثات</string>\n    <string name=\"manual_update_description\">التحقق يدويا من وجود إصدارات جديدة</string>\n    <string name=\"checking_updates_toast\">جاري التحقق من وجود تحديثات…</string>\n    <string name=\"feed_new_items\">عناصر تغذية جديدة</string>\n    <string name=\"show_crash_the_player_summary\">إظهار خيار تعطل عند استخدام المشغل</string>\n    <string name=\"show_crash_the_player_title\">إظهار \\\"تعطل المشغل\\\"</string>\n    <string name=\"crash_the_player\">تحطيم المشغل</string>\n    <string name=\"error_report_channel_name\">إشعار الإبلاغ عن الأخطاء</string>\n    <string name=\"error_report_channel_description\">التنبيهات المتعلقة بالإبلاغ عن الأخطاء</string>\n    <string name=\"error_report_notification_title\">واجه NewPipe خطأ، اضغط للتقرير</string>\n    <string name=\"error_report_notification_toast\">حدث خطأ، انظر للإشعار</string>\n    <string name=\"create_error_notification\">قم بإنشاء تنبيه بالخطأ</string>\n    <string name=\"no_appropriate_file_manager_message\">لم يتم العثور على مدير ملفات مناسب لهذا الإجراء.\n\\nيرجى تثبيت مدير ملفات أو محاولة تعطيل \\\"%s\\\" في إعدادات التنزيل</string>\n    <string name=\"show_error_snackbar\">إظهار خطأ snackbar</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">لم يتم العثور على مدير ملفات مناسب لهذا الإجراء.\n\\nالرجاء تثبيت مدير ملفات متوافق مع إطار عمل الوصول إلى التخزين</string>\n    <string name=\"detail_pinned_comment_view_description\">تعليق مثبت</string>\n    <string name=\"leak_canary_not_available\">LeakCanary غير متوفر</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">الافتراضي ExoPlayer</string>\n    <string name=\"settings_category_player_notification_summary\">تكوين إشعار مشغل البث الحالي</string>\n    <string name=\"notifications\">الإشعارات</string>\n    <string name=\"loading_stream_details\">تحميل تفاصيل البث…</string>\n    <string name=\"notifications_disabled\">تم تعطيل الإشعارات</string>\n    <string name=\"streams_notification_channel_name\">بث جديد</string>\n    <string name=\"settings_category_player_notification_title\">إشعار المشغل</string>\n    <string name=\"you_successfully_subscribed\">لقد اشتركت الآن في هذه القناة</string>\n    <string name=\"streams_notification_channel_description\">الإخطارات حول التدفقات الجديدة للاشتراكات</string>\n    <string name=\"enable_streams_notifications_title\">إشعارات أحداث البث الجديدة</string>\n    <string name=\"enable_streams_notifications_summary\">الإخطار بأحداث البث الجديدة من الاشتراكات</string>\n    <string name=\"check_new_streams\">تشغيل التحقق من وجود تدفقات جديدة</string>\n    <string name=\"streams_notifications_interval_title\">معدل البحث</string>\n    <string name=\"streams_notifications_network_title\">مطلوب اتصال الشبكة</string>\n    <string name=\"any_network\">أي شبكة</string>\n    <string name=\"delete_downloaded_files_confirm\">محو جميع الملفات التي تم تنزيلها من القرص؟</string>\n    <string name=\"get_notified\">الحصول على إشعار</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">تبديل الكل</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"zero\">%s دفق جديد</item>\n        <item quantity=\"one\">%s دفق جديد</item>\n        <item quantity=\"two\">%s دفق جديد</item>\n        <item quantity=\"few\">%s دفوق جديدة</item>\n        <item quantity=\"many\">%s دفق جديد</item>\n        <item quantity=\"other\">%s دفق جديد</item>\n    </plurals>\n    <string name=\"percent\">النسبة المئوية</string>\n    <string name=\"semitone\">سيميتون</string>\n    <string name=\"streams_not_yet_supported_removed\">لا يتم عرض التدفقات التي لم يدعمها برنامج التنزيل بعد</string>\n    <string name=\"selected_stream_external_player_not_supported\">الدفق المحدد غير مدعوم من قبل المشغلون الخارجيون</string>\n    <string name=\"no_audio_streams_available_for_external_players\">لا توجد تدفقات صوتية متاحة للمشغلات الخارجية</string>\n    <string name=\"no_video_streams_available_for_external_players\">لا تتوفر تدفقات فيديو للاعبين الخارجيين</string>\n    <string name=\"select_quality_external_players\">حدد الجودة للمشغلين الخارجيين</string>\n    <string name=\"unknown_format\">تنسيق غير معروف</string>\n    <string name=\"unknown_quality\">جودة غير معروفة</string>\n    <string name=\"progressive_load_interval_title\">حجم الفاصل الزمني لتحميل التشغيل</string>\n    <string name=\"faq_title\">أسئلة مكررة</string>\n    <string name=\"faq_description\">إذا كنت تواجه مشكلة في استخدام التطبيق ، فتأكد من مراجعة هذه الإجابات للأسئلة الشائعة!</string>\n    <string name=\"faq\">مشاهدة على الموقع</string>\n    <string name=\"sort\">فرز</string>\n    <string name=\"app_update_unavailable_toast\">أنت تقوم بتشغيل أحدث إصدار من NewPipe</string>\n    <string name=\"app_update_available_notification_text\">انقر للتنزيل %s</string>\n    <string name=\"fast_mode\">الوضع السريع</string>\n    <string name=\"import_subscriptions_hint\">استيراد الاشتراكات أو تصديرها من القائمة المكونة من 3 نقاط</string>\n    <string name=\"night_theme_available\">هذا الخيار متاح فقط إذا تم تحديد %s للسمة</string>\n    <string name=\"unset_playlist_thumbnail\">إلغاء تعيين الصورة المصغرة الدائمة</string>\n    <string name=\"msg_failed_to_copy\">فشل النسخ إلى الحافظة</string>\n    <string name=\"card\">البطاقة</string>\n    <string name=\"playlist_add_stream_success_duplicate\">تمت إضافة وقت (أوقات) مكررة %d</string>\n    <string name=\"duplicate_in_playlist\">تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر.</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">مفيد ، على سبيل المثال ، إذا كنت تستخدم سماعة رأس بأزرار مادية مكسورة</string>\n    <string name=\"ignore_hardware_media_buttons_title\">تجاهل أحداث ازرار الوسائط الأجهزة</string>\n    <string name=\"remove_duplicates_message\">هل تريد إزالة جميع التدفقات المكررة في قائمة التشغيل هذه؟</string>\n    <string name=\"feed_show_hide_streams\">إظهار/إخفاء التدفقات</string>\n    <string name=\"feed_show_partially_watched\">تمت مشاهدته جزئيا</string>\n    <string name=\"feed_show_upcoming\">القادمة</string>\n    <string name=\"remove_duplicates\">إزالة التكرارات</string>\n    <string name=\"remove_duplicates_title\">إزالة التكرارات؟</string>\n    <string name=\"feed_hide_streams_title\">إظهار التدفقات التالية</string>\n    <string name=\"feed_show_watched\">شاهدت بالكامل</string>\n    <string name=\"left_gesture_control_title\">إجراء الإيماءة اليسرى</string>\n    <string name=\"right_gesture_control_title\">اجراء الإيماءة اليمنى</string>\n    <string name=\"brightness\">السطوع</string>\n    <string name=\"none\">بدون</string>\n    <string name=\"left_gesture_control_summary\">اختر إيماءة للنصف الأيسر من شاشة المشغل</string>\n    <string name=\"right_gesture_control_summary\">اختر إيماءة للنصف الأيمن من شاشة المشغل</string>\n    <string name=\"volume\">مستوى الصوت</string>\n    <string name=\"progressive_load_interval_summary\">قم بتغيير حجم الفاصل الزمني للتحميل على المحتويات التدريجية (حاليا %s). قد تؤدي القيمة المنخفضة إلى تسريع التحميل الأولي</string>\n    <string name=\"prefer_descriptive_audio_title\">تفضل الصوت الوصفي</string>\n    <string name=\"play_queue_audio_track\">الصوت : %s</string>\n    <string name=\"audio_track\">المسار الصوتي</string>\n    <string name=\"audio_track_present_in_video\">يجب أن يكون هناك مسار صوتي موجود بالفعل في هذا البث</string>\n    <string name=\"select_audio_track_external_players\">حدد مسار الصوت للمشغلات الخارجية</string>\n    <string name=\"unknown_audio_track\">غير معروف</string>\n    <string name=\"settings_category_exoplayer_title\">إعدادات ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">إدارة بعض إعدادات ExoPlayer. تتطلب هذه التغييرات إعادة تشغيل المشغل لتصبح سارية المفعول</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">استخدم دائمًا الحل البديل لإعداد سطح إخراج فيديو ExoPlayer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">الافتراضي</string>\n    <string name=\"audio_track_type_dubbed\">مدبلجة</string>\n    <string name=\"audio_track_type_descriptive\">وصفي</string>\n    <string name=\"prefer_original_audio_summary\">حدد المسار الصوتي الأصلي بغض النظر عن اللغة</string>\n    <string name=\"prefer_original_audio_title\">تفضيل الصوت الأصلي</string>\n    <string name=\"prefer_descriptive_audio_summary\">حدد مسارًا صوتيًا يحتوي على أوصاف للأشخاص ضعاف البصر إذا كان ذلك متاحًا</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">استخدم ميزة فك ترميز وحدة فك التشفير الاحتياطية في ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">قم بتمكين هذا الخيار إذا كانت لديك مشكلات في تهيئة وحدة فك التشفير ، والتي تعود إلى أجهزة فك التشفير ذات الأولوية الأقل إذا فشلت تهيئة وحدات فك التشفير الأولية. قد ينتج عن ذلك أداء تشغيل ضعيف مقارنة باستخدام وحدات فك التشفير الأساسية</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">يقوم هذا الحل البديل بتحرير وإعادة إنشاء نماذج برامج ترميز الفيديو عند حدوث تغيير في السطح، بدلا من تعيين السطح إلى برنامج الترميز مباشرة. تم استخدام هذا الإعداد بالفعل بواسطة ExoPlayer على بعض الأجهزة التي تعاني من هذه المشكلة ، وهذا الإعداد له تأثير فقط على Android 6 والإصدارات الأحدث\n\\n\n\\nقد يؤدي تمكين هذا الخيار إلى منع أخطاء التشغيل عند تبديل مشغل الفيديو الحالي أو التبديل إلى وضع ملء الشاشة</string>\n    <string name=\"main_tabs_position_summary\">انقل محدد علامة التبويب الرئيسي إلى الأسفل</string>\n    <string name=\"main_tabs_position_title\">موضع علامات التبويب الرئيسية</string>\n    <string name=\"disable_media_tunneling_automatic_info\">تم تعطيل نفق وسائل الإعلام عن طريق التقصير على جهازك لأن نموذج جهازك معروف بأنه لا يدعمه.</string>\n    <string name=\"no_streams\">لاتوجد بثوث</string>\n    <string name=\"no_live_streams\">لاتوجد بثوث مباشرة</string>\n    <string name=\"channel_tab_videos\">الفيديوات</string>\n    <string name=\"metadata_subscribers\">المشتركون</string>\n    <string name=\"show_channel_tabs_summary\">ما هي التبويبات المعروضة على صفحات القناة</string>\n    <string name=\"show_channel_tabs\">تبويبات القنوات</string>\n    <string name=\"channel_tab_shorts\">الفديوهات القصيرة</string>\n    <string name=\"loading_metadata_title\">جلب البيانات الوصفية…</string>\n    <string name=\"toggle_screen_orientation\">تبديل تدوير الشاشة</string>\n    <string name=\"toggle_fullscreen\">الانتقال إلى وضع ملئ الشاشة</string>\n    <string name=\"feed_fetch_channel_tabs\">اجلب تبويبات القنوات</string>\n    <string name=\"next_stream\">البث التالي</string>\n    <string name=\"open_play_queue\">فتح قائمة انتظار التسغيل</string>\n    <string name=\"channel_tab_about\">حول</string>\n    <string name=\"forward\">تقديم المحتوى</string>\n    <string name=\"channel_tab_albums\">الألبومات</string>\n    <string name=\"rewind\">إعادة المحتوى</string>\n    <string name=\"replay\">إعادة التشغيل</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">علامات التبويب لجلبها عند تحديث الخلاصة. ليس لهذا الخيار أي تأثير إذا تم تحديث القناة باستخدام الوضع السريع.</string>\n    <string name=\"channel_tab_playlists\">قوائم التشغيل</string>\n    <string name=\"play\">شغِّل</string>\n    <string name=\"more_options\">المزيد من الخيارات</string>\n    <string name=\"channel_tab_tracks\">المسارات</string>\n    <string name=\"duration\">المدة</string>\n    <string name=\"channel_tab_channels\">القنوات</string>\n    <string name=\"previous_stream\">البث السابق</string>\n    <string name=\"channel_tab_livestreams\">مباشر</string>\n    <string name=\"image_quality_title\">جودة الصورة</string>\n    <string name=\"question_mark\">؟</string>\n    <string name=\"image_quality_low\">جودة منخفضة</string>\n    <string name=\"metadata_avatars\">الصور الرمزية</string>\n    <string name=\"metadata_subchannel_avatars\">الصور الرمزية للقناة الفرعية</string>\n    <string name=\"image_quality_none\">لا تقم بتحميل الصور</string>\n    <string name=\"image_quality_high\">عالية الجودة</string>\n    <string name=\"image_quality_medium\">النوعية متوسطة</string>\n    <string name=\"metadata_uploader_avatars\">الصورة الرمزية للرفع</string>\n    <string name=\"metadata_banners\">اللافتات</string>\n    <string name=\"image_quality_summary\">اختر جودة الصور وما إذا كنت تريد تحميل الصور على الإطلاق، لتقليل استخدام البيانات والذاكرة. تؤدي التغييرات إلى مسح ذاكرة التخزين المؤقت للصور الموجودة في الذاكرة وعلى القرص — %s</string>\n    <string name=\"metadata_thumbnails\">الصور المصغرة</string>\n    <string name=\"share_playlist_with_list\">مشاركة عنوان القائمة</string>\n    <string name=\"share_playlist_with_titles\">مشاركة العناوين</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">مشاركة قائمة التشغيل</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"zero\">رد %s</item>\n        <item quantity=\"one\">رد %s</item>\n        <item quantity=\"two\">ردان%s</item>\n        <item quantity=\"few\">ردود%s</item>\n        <item quantity=\"many\">ردود %s</item>\n        <item quantity=\"other\">ردود %s</item>\n    </plurals>\n    <string name=\"show_more\">عرض المزيد</string>\n    <string name=\"show_less\">عرض أقل</string>\n    <string name=\"notification_actions_summary_android13\">قم بتحرير كل إجراء إعلام أدناه من خلال النقر عليه. يتم تعيين الإجراءات الثلاثة الأولى (تشغيل/إيقاف مؤقت، السابق والتالي) بواسطة النظام ولا يمكن تخصيصها.</string>\n    <string name=\"error_insufficient_storage\">لا توجد مساحة خالية كافية على الجهاز</string>\n    <string name=\"reset_settings_title\">اعادة ضبط الإعداداتِ</string>\n    <string name=\"settings_category_backup_restore_title\">النسخ الاحتياطيُّ والاستعادة</string>\n    <string name=\"reset_settings_summary\">أعيدوا جميع الإعدادات إلى قيمهم الافتراضية</string>\n    <string name=\"reset_all_settings\">ستؤدي إعادة ضبط جميع الإعدادات إلى تجاهل جميع إعداداتك المفضلة وإعادة تشغيل التطبيق.\n\\n\n\\nهل انت متأكد انك تريد المتابعة؟</string>\n    <string name=\"yes\">نعم</string>\n    <string name=\"auto_update_check_description\">يمكن لـ NewPipe البحث تلقائيًا عن الإصدارات الجديدة من وقت لآخر وإعلامك بمجرد توفرها.\n\\nهل تريد تمكين هذا؟</string>\n    <string name=\"no\">لا</string>\n    <string name=\"import_settings_vulnerable_format\">تستخدم الإعدادات الموجودة في عملية التصدير التي يتم استيرادها تنسيقًا عرضة للاختراق تم إهماله منذ NewPipe 0.27.0. تأكد من أن التصدير الذي يتم استيراده من مصدر موثوق به، ويفضل استخدام عمليات التصدير التي تم الحصول عليها من NewPipe 0.27.0 أو الأحدث في المستقبل فقط. سيتم قريبًا إزالة دعم استيراد الإعدادات بهذا التنسيق الضعيف تمامًا، وبعد ذلك لن تتمكن الإصدارات القديمة من NewPipe من استيراد إعدادات التصدير من الإصدارات الجديدة بعد الآن.</string>\n    <string name=\"audio_track_type_secondary\">الثانوي</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">المشاركة كقائمة تشغيل مؤقتة على YouTube</string>\n    <string name=\"tab_bookmarks_short\">قوائم التشغيل</string>\n    <string name=\"feed_group_page_summary\">صفحة مجموعة القناة</string>\n    <string name=\"select_a_feed_group\">حدد مجموعة المحتوى</string>\n    <string name=\"no_feed_group_created_yet\">لم تنشئ مجموعة محتوى</string>\n    <string name=\"channel_tab_likes\">الإعجابات</string>\n    <string name=\"search_with_service_name\">البحث %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">البحث %1$s (%2$s)</string>\n    <string name=\"migration_info_6_7_title\">تمت إزالة صفحة أفضل 50 من SoundCloud</string>\n    <string name=\"migration_info_6_7_message\">أوقفت SoundCloud صفحة أفضل 50 الأصلية. تمت إزالة علامة التبويب المقابلة من صفحتك الرئيسية.</string>\n    <string name=\"migration_info_7_8_title\">تمت إزالة تريندات YouTube المجمعة</string>\n    <string name=\"migration_info_7_8_message\">أوقف YouTube صفحة الترند المدمجة اعتبارًا من 21 يوليو 2025. استبدلت NewPipe صفحة الموضوعات المتداولة الافتراضية بصفحة الموضوعات المتداولة الشائعة مع البث المباشر المتداول.\\n\\nيمكنك أيضًا تحديد صفحات رائجة مختلفة في \\\"الإعدادات &gt; المحتوى &gt; محتوى الصفحة الرئيسية\\\".</string>\n    <string name=\"trending_gaming\">توجهات الألعاب</string>\n    <string name=\"trending_podcasts\">توجهات البث الصوتي</string>\n    <string name=\"trending_movies\">الأفلام والعروض الأكثر رواجاً</string>\n    <string name=\"trending_music\">الموسيقى الرائجة</string>\n    <string name=\"short_thousand\">%s الف</string>\n    <string name=\"short_million\">%s مليون</string>\n    <string name=\"short_billion\">%sمليار</string>\n    <string name=\"permission_display_over_apps_message\">لاستخدام المشغل المنبثق، يرجى تحديد %1$s في قائمة إعدادات اندرويد التالية وتمكين %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">“السماح بالعرض فوق التطبيقات الاخرى”</string>\n    <string name=\"delete_file\">حذف ملف</string>\n    <string name=\"delete_entry\">حذف المدخلات</string>\n    <string name=\"account_terminated_service_provides_reason\">تم إنهاء الحساب\\n\\n%1$s يقدم هذا السبب: %2$s</string>\n    <string name=\"entry_deleted\">تم حذف المدخلات</string>\n    <string name=\"player_http_403\">تم تلقي خطأ HTTP 403 من الخادم أثناء التشغيل، ويرجح أن يكون السبب هو انتهاء صلاحية عنوان URL للبث أو حظر عنوان IP</string>\n    <string name=\"player_http_invalid_status\">حدث خطأ HTTP %1$s من الخادم أثناء التشغيل</string>\n    <string name=\"youtube_player_http_403\">تم تلقي خطأ HTTP 403 من الخادم أثناء التشغيل، ويرجح أن يكون السبب هو حظر عنوان IP أو مشكلات في إزالة التعتيم عن عنوان URL للبث</string>\n    <string name=\"sign_in_confirm_not_bot_error\">رفض %1$s تقديم البيانات، وطلب تسجيل الدخول للتأكد من أن الطالب ليس روبوتًا.\\n\\nربما تم حظر عنوان IP الخاص بك مؤقتًا من قبل %1$s، يمكنك الانتظار بعض الوقت أو التبديل إلى عنوان IP مختلف (على سبيل المثال عن طريق تشغيل/إيقاف تشغيل VPN، أو التبديل من WiFi إلى بيانات الهاتف المحمول).</string>\n    <string name=\"unsupported_content_in_country\">هذا المحتوى غير متاح للبلد المحدد حاليًا.\\n\\nقم بتغيير اختيارك من ”الإعدادات &gt; المحتوى &gt; البلد الافتراضي للمحتوى“.</string>\n    <string name=\"kao_dialog_warning\">أعلنت Google أنه ابتداءً من عام 2026/2027، ستتطلب جميع التطبيقات على الأجهزة المعتمدة من Android من المطورين تقديم معلومات هويتهم الشخصية مباشرةً إلى Google. بما أن مطوري هذا التطبيق لا يوافقون على هذا الشرط، فلن يعمل هذا التطبيق على أجهزة Android المعتمدة بعد ذلك الوقت.</string>\n    <string name=\"kao_dialog_more_info\">تفاصيل</string>\n    <string name=\"kao_solution\">حل</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ar-rLY/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"use_external_video_player_title\">استخدم مشغل فيديو خارجي</string>\n    <string name=\"share_dialog_title\">مشاركة مع</string>\n    <string name=\"settings\">الإعدادات</string>\n    <string name=\"search\">بحث</string>\n    <string name=\"controls_download_desc\">تنزيل ملف البث</string>\n    <string name=\"download\">تنزيل</string>\n    <string name=\"share\">إعادة النشر</string>\n    <string name=\"open_in_popup_mode\">فتح في نافدة منبثقة</string>\n    <string name=\"open_in_browser\">افتح في المتصفح</string>\n    <string name=\"cancel\">إلغاء</string>\n    <string name=\"install\">تثبيت</string>\n    <string name=\"no_player_found_toast\">لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيلها).</string>\n    <string name=\"no_player_found\">لم يتم العثور على مشغل بث. يرجى تثبيت VLC؟</string>\n    <string name=\"upload_date_text\">تم النشر في %1$s</string>\n    <string name=\"main_bg_subtitle\">اضغط على عدسة المكبرة للبدء.</string>\n    <string name=\"image_quality_title\">جودة الصورة</string>\n    <string name=\"no_video_streams_available_for_external_players\">لا تتوفر تدفقات فيديو للاعبين الخارجيين</string>\n    <string name=\"description_select_disable\">تعطيل تحديد النص في الوصف</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"zero\">لم يتم حذف أي تنزيل</item>\n        <item quantity=\"one\">تم حذف تنزيل واحد</item>\n        <item quantity=\"two\">تم حذف تنزيلَيْن</item>\n        <item quantity=\"few\">تم حذف %1$s تنزيلات</item>\n        <item quantity=\"many\">تم حذف %1$s تنزيلاً</item>\n        <item quantity=\"other\">تم حذف %1$s تنزيل</item>\n    </plurals>\n    <string name=\"notification_action_1_title\">زر الإجراء الثاني</string>\n    <string name=\"audio_track_type_original\">الافتراضي</string>\n    <string name=\"channel_tab_videos\">الفيديوهات</string>\n    <string name=\"dismiss\">إلغاء</string>\n    <string name=\"app_description\">تطبيق مجاني خفيف البث على أندرويد.</string>\n    <string name=\"title_activity_history\">التاريخ</string>\n    <string name=\"pause_downloads\">إيقاف التحميل مؤقتًا</string>\n    <string name=\"notification_scale_to_square_image_summary\">قم بقص الصورة المصغرة للفيديو الموضحة في الإشعار من نسبة العرض إلى الارتفاع 16: 9 إلى 1: 1</string>\n    <string name=\"updates_setting_title\">التحديثات</string>\n    <string name=\"detail_pinned_comment_view_description\">تعليق مثبت</string>\n    <string name=\"remove_watched\">إزالة ما تمت مشاهدته</string>\n    <string name=\"recovering\">استرد</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">قم بتشغيل \\\"وضع تقييد المحتوى\\\" في يوتيوب</string>\n    <plurals name=\"hours\">\n        <item quantity=\"zero\">لا ساعة</item>\n        <item quantity=\"one\">ساعة واحدة</item>\n        <item quantity=\"two\">ساعتان</item>\n        <item quantity=\"few\">%d ساعات</item>\n        <item quantity=\"many\">%d ساعة</item>\n        <item quantity=\"other\">%d ساعة</item>\n    </plurals>\n    <string name=\"delete_view_history_alert\">حذف سجل المشاهدة بالكامل؟</string>\n    <string name=\"play_with_kodi_title\">تشغيل بواسطة كودي</string>\n    <string name=\"one_item_deleted\">تم حذف عنصر واحد.</string>\n    <string name=\"import_network_expensive_warning\">ضع في اعتبارك أن هذه العملية يمكن أن تكون مكلفة اذا كنت تستخدم بيانات اشتراك انترنت.\n\\n\n\\nهل تريد الاستمرار؟</string>\n    <string name=\"close\">إغلاق</string>\n    <string name=\"privacy_policy_encouragement\">يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك.\n\\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال.</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"zero\">لاشيء مُحدّد</item>\n        <item quantity=\"one\">واحدة محددة</item>\n        <item quantity=\"two\">إثنتان محدَّدتان</item>\n        <item quantity=\"few\">%d محددة</item>\n        <item quantity=\"many\">%d محددة</item>\n        <item quantity=\"other\">%d محددة</item>\n    </plurals>\n    <string name=\"no_streams_available_download\">لا يوجد بث متاح للتنزيل</string>\n    <string name=\"restore_defaults_confirmation\">هل تريد استعادة الإعدادات الافتراضية؟</string>\n    <string name=\"preferred_player_fetcher_notification_message\">تحميل المحتوى المطلوب</string>\n    <string name=\"peertube_instance_add_title\">إضافة نموذج</string>\n    <string name=\"title_licenses\">تراخيص الجهات الخارجية</string>\n    <string name=\"clear_playback_states_summary\">حذف كل مواقف التشغيل</string>\n    <string name=\"tab_about\">عن التطبيق والأسئلة الشائعة</string>\n    <string name=\"import_subscriptions_hint\">استيراد الاشتراكات أو تصديرها من القائمة المكونة من 3 نقاط</string>\n    <string name=\"downloads_title\">الملفات المحملة</string>\n    <string name=\"invalid_source\">لا يوجد مثل هذا الملف/مصدر المحتوى</string>\n    <string name=\"most_liked\">الأكثر إعجابًا</string>\n    <string name=\"feed_load_error_account_info\">تعذر تحميل موجز \\'%s\\'.</string>\n    <string name=\"question_mark\">؟</string>\n    <string name=\"check_for_updates\">التحقق من وجود تحديثات</string>\n    <string name=\"peertube_instance_url_title\">مثيلات خوادم پيرتيوب</string>\n    <string name=\"more_than_100_videos\">+100 فيديو</string>\n    <string name=\"peertube_instance_add_exists\">مثيل الخادم موجود بالفعل</string>\n    <string name=\"clear_queue_confirmation_title\">طلب تأكيد قبل مسح قائمة الانتظار</string>\n    <string name=\"metadata_subscribers\">المشتركون</string>\n    <string name=\"feed_show_partially_watched\">تمت مشاهدتها جزئيا</string>\n    <string name=\"controls_add_to_playlist_title\">إضافة إلى</string>\n    <string name=\"unsupported_url\">رابط غير مدعوم</string>\n    <string name=\"donation_title\">تبرَّع</string>\n    <string name=\"get_notified\">الحصول على إشعار</string>\n    <string name=\"radio\">إذاعة</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"zero\">لا تنزيل اكتَمَل</item>\n        <item quantity=\"one\">اكتَمَل تنزيل واحد</item>\n        <item quantity=\"two\">تنزيلان اكتَمَلَا</item>\n        <item quantity=\"few\">%s تنزيلات اكتَمَلت</item>\n        <item quantity=\"many\">%s تنزيلًا اكتَمَل</item>\n        <item quantity=\"other\">%s تنزيل اكتَمَل</item>\n    </plurals>\n    <string name=\"playback_tempo\">سرعة الأداء</string>\n    <string name=\"unbookmark_playlist\">إزالة الإشارة المرجعية</string>\n    <string name=\"playlist_creation_success\">تم إنشاء قائمة التشغيل</string>\n    <string name=\"download_to_sdcard_error_title\">وحدة التخزين الخارجية غير متوفرة</string>\n    <string name=\"show_info\">عرض المعلومات</string>\n    <string name=\"trending\">الشائعة</string>\n    <string name=\"channel_unsubscribed\">تم إلغاء الاشتراك في القناة</string>\n    <string name=\"enable_search_history_summary\">تخزين طلبات البحث محليًّا</string>\n    <string name=\"notification_colorize_title\">تلوين الإشعارات</string>\n    <string name=\"caption_auto_generated\">توليد تلقائي</string>\n    <string name=\"peertube_instance_add_fail\">لا يمكن التحقق من صحة المثال</string>\n    <string name=\"show_play_with_kodi_title\">عرض خيار التشغيل بواسطة كودي</string>\n    <string name=\"fast_mode\">الوضع السريع</string>\n    <string name=\"feed_hide_streams_title\">إظهار الموجزات التالية</string>\n    <string name=\"charset_most_special_characters\">معظم الأحرف الخاصة</string>\n    <string name=\"metadata_cache_wipe_summary\">إزالة جميع بيانات صفحات الويب المخزنة مؤقّتًا</string>\n    <string name=\"clear_search_history_title\">محو سجل البحث</string>\n    <string name=\"show_channel_details\">إظهار تفاصيل القناة</string>\n    <plurals name=\"watching\">\n        <item quantity=\"zero\">لا مُشاهِد</item>\n        <item quantity=\"one\">مُشاهِد واحد</item>\n        <item quantity=\"two\">مُشاهِدان</item>\n        <item quantity=\"few\">%s مُشاهِدين</item>\n        <item quantity=\"many\">%s مُشاهِدًا</item>\n        <item quantity=\"other\">%s مُشاهِد</item>\n    </plurals>\n    <string name=\"show_hold_to_append_summary\">عرض تلميح عند الضغط على زر استخدام المشغل الخلفي أو النافذة المنبثقة في صفحة تفاصيل الفديو</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا</string>\n    <string name=\"error_timeout\">انتهى وقت الاتصال</string>\n    <string name=\"unknown_audio_track\">غير معروف</string>\n    <string name=\"autoplay_title\">تشغيل تلقائي</string>\n    <string name=\"preferred_open_action_settings_summary\">الإجراء الافتراضي عند فتح المحتوى — %s</string>\n    <string name=\"play_queue_audio_settings\">إعدادات الصوت</string>\n    <string name=\"enable_streams_notifications_title\">إشعارات أحداث البث الجديدة</string>\n    <string name=\"max_retry_desc\">الحد الأقصى لعدد المحاولات قبل إلغاء التحميل</string>\n    <string name=\"bookmark_playlist\">تفضيل قائمة التشغيل</string>\n    <string name=\"show_channel_tabs_summary\">الألسنة التي سيتم عرضها على صفحات القناة</string>\n    <string name=\"remove_duplicates_title\">إزالة التكرارات؟</string>\n    <string name=\"your_comment\">تعليقك (باللغة الإنجليزية):</string>\n    <string name=\"export_to\">تصدير إلى</string>\n    <string name=\"msg_calculating_hash\">حساب التجزئة</string>\n    <string name=\"feed_show_hide_streams\">إظهار/إخفاء الموجزات</string>\n    <string name=\"preferred_open_action_settings_title\">مِن الأفضل فتحه بـ</string>\n    <string name=\"metadata_privacy\">الخصوصيّة</string>\n    <string name=\"overwrite_failed\">لا يمكن الكتابة فوق الملف</string>\n    <string name=\"videos_string\">الفيديوهات</string>\n    <string name=\"detail_drag_description\">اسحب لإعادة ترتيب</string>\n    <string name=\"show_crash_the_player_title\">إظهار \\\"تعطل المشغل\\\"</string>\n    <string name=\"description_select_note\">يمكنك الآن تحديد نص داخل الوصف. لاحظ أن الصفحة قد تومض وقد لا تكون الروابط قابلة للنقر أثناء وضع التحديد.</string>\n    <string name=\"enqueued_next\">تم وضع التالي على قائمة الانتظار</string>\n    <string name=\"main_page_content_swipe_remove\">اسحب العناصر لإزالتها</string>\n    <string name=\"what_device_headline\">معلومات:</string>\n    <string name=\"feed_load_error_terminated\">حساب منشئ المحتوى قد تم إنهائه.\n\\nلن يتمكن NewPipe من تحميل هذه الخلاصة في المستقبل.\n\\nهل تريد إلغاء الاشتراك من هذه القناة؟</string>\n    <string name=\"minimize_on_exit_popup_description\">تصغير إلى مشغل منبثق</string>\n    <string name=\"error_postprocessing_stopped\">تم إغلاق NewPipe أثناء العمل على الملف</string>\n    <string name=\"background_player\">مشغل الخلفية</string>\n    <string name=\"audio_track_type_descriptive\">وصفي</string>\n    <string name=\"popup_remember_size_pos_title\">تذكر خصائص النوافذ المنبثقة</string>\n    <string name=\"error_report_button_text\">الإبلاغ عن طريق البريد الإلكتروني</string>\n    <string name=\"sorry_string\">عذرًا، لم ينبغِ أن يحدث ذلك.</string>\n    <string name=\"create_playlist\">إنشاء قائمة تشغيل جديدة</string>\n    <string name=\"error_occurred_detail\">حدث خطأٌ ما: %1$s</string>\n    <string name=\"search_no_results\">لم يتم العثور على نتائج</string>\n    <string name=\"open_website_license\">فتح الموقع</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"zero\">لا موجَزات</item>\n        <item quantity=\"one\">موجَز واحد</item>\n        <item quantity=\"two\">موجَزان</item>\n        <item quantity=\"few\">%s موجَزات</item>\n        <item quantity=\"many\">%s موجَزًا</item>\n        <item quantity=\"other\">%s موجز</item>\n    </plurals>\n    <string name=\"tablet_mode_title\">وضع الجهاز اللوحي</string>\n    <string name=\"unsupported_url_dialog_message\">تعذر التعرف على الرابط. فتح باستخدام تطبيق آخر؟</string>\n    <string name=\"recaptcha_cookies_cleared\">تم مسح ملفات تعريف الارتباط reCAPTCHA</string>\n    <string name=\"play_queue_stream_detail\">التفاصيل</string>\n    <string name=\"title_activity_play_queue\">تشغيل قائمة الانتظار</string>\n    <string name=\"set_as_playlist_thumbnail\">تعيين كصورة مصغرة لقائمة التشغيل</string>\n    <string name=\"max_retry_msg\">العدد الأقصى للمحاولات</string>\n    <string name=\"error_snackbar_message\">عذرًا، حدث خطأ ما.</string>\n    <string name=\"view_on_github\">عرض على GitHub</string>\n    <string name=\"error_details_headline\">التفاصيل:</string>\n    <string name=\"playback_pitch\">تردد الصوت</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">هل تعتقد أن تحميل التغذية بطيءٌ جدًا؟ إذا كان الأمر كذلك، فحاول تمكين التحميل السريع (يمكنك تغييره في الإعدادات أو بالضغط على الزر أدناه).\n\\n\n\\nيقدم NewPipe استراتيجيتين لتحميل الخلاصة:\n\\n• جلب قناة الاشتراك بأكملها، وهي بطيئة ولكنها كاملة.\n\\n• استخدام نقطة نهاية خدمة مخصصة، وهي سريعة ولكنها عادةً لا تكتمل.\n\\n\n\\nالفرق بين الاثنين هو أن العنصر السريع عادة ما يفتقر إلى بعض المعلومات، مثل مدة العنصر أو نوعه (لا يمكن التمييز بين مقاطع الفيديو المباشرة والأخرى العادية) وقد يعيد عناصر أقل.\n\\n\n\\nيوتيوب هو مثال على الخدمة التي تقدمها هذه طريقة سريعة مع تغذية RSS الخاصة بها.\n\\n\n\\nلذا فإن الاختيار يتلخص في ما تفضله: السرعة أو المعلومات الدقيقة.</string>\n    <string name=\"file_deleted\">تم حذف الملف</string>\n    <string name=\"download_dialog_title\">تنزيل</string>\n    <string name=\"channel_page_summary\">صفحة القناة</string>\n    <string name=\"export_data_summary\">تصدير السجل، وقوائم تشغيل، والإعدادات، والاشتراكات</string>\n    <string name=\"delete_playlist_prompt\">هل تريد حذف قائمة التشغيل هذه؟</string>\n    <string name=\"content_language_title\">اللغة الإفتراضية للمحتوى</string>\n    <string name=\"processing_may_take_a_moment\">جاري المعالجة ... قد يستغرق لحظة</string>\n    <string name=\"read_full_license\">قراءة الرخصة</string>\n    <string name=\"show_channel_tabs\">ألسنة القنوات</string>\n    <string name=\"seekbar_preview_thumbnail_title\">معاينة مصغرة على شريط التمرير</string>\n    <string name=\"fragment_feed_title\">ما الجديد</string>\n    <string name=\"feed_oldest_subscription_update\">آخر تحديث للموجز: %s</string>\n    <string name=\"msg_error\">الخطأ</string>\n    <string name=\"notification_action_4_title\">زر الإجراء الخامس</string>\n    <string name=\"new_and_hot\">جديد وساخن</string>\n    <string name=\"use_inexact_seek_title\">استعمال التقديم السريع الغير دقيق</string>\n    <string name=\"settings_category_downloads_title\">التنزيل</string>\n    <string name=\"permission_display_over_apps\">امنح الإذن بالعرض فوق التطبيقات الأخرى</string>\n    <string name=\"metadata_privacy_internal\">داخلي</string>\n    <string name=\"volume\">مستوى الصوت</string>\n    <string name=\"remove_duplicates\">إزالة التكرارات</string>\n    <string name=\"toggle_all\">تبديل الكل</string>\n    <string name=\"error_postprocessing_failed\">فشلت المعالجة الاولية</string>\n    <string name=\"msg_running_detail\">انقر للحصول على التفاصيل</string>\n    <string name=\"show_search_suggestions_summary\">اختر الاقتراحات التي تريد إظهارها عند البحث</string>\n    <string name=\"create\">إنشاء</string>\n    <string name=\"charset_letters_and_digits\">الحروف والأرقام</string>\n    <string name=\"did_you_mean\">هل تقصد \\\"%1$s\\\"؟</string>\n    <string name=\"feed_new_items\">عناصر الموجز الجديدة</string>\n    <string name=\"featured\">المميزة</string>\n    <string name=\"show_age_restricted_content_summary\">عرض المحتوى الذي يُحتمل أن يكون غير مناسب للأطفال لأن له حدًا عمريًا (مثل 18+)</string>\n    <string name=\"start_here_on_background\">بدأ التشغيل في الخلفية</string>\n    <string name=\"channel_tab_shorts\">القصيرة</string>\n    <string name=\"playlists\">قوائم التشغيل</string>\n    <string name=\"clear\">تنظيف</string>\n    <string name=\"choose_instance_prompt\">اختيار مثيل</string>\n    <string name=\"all\">كلها</string>\n    <string name=\"feed_groups_header_title\">مجموعات القنوات</string>\n    <string name=\"feed_processing_message\">جارٍ معالجة الموجز…</string>\n    <plurals name=\"videos\">\n        <item quantity=\"zero\">لا فيديو</item>\n        <item quantity=\"one\">فيديو واحد</item>\n        <item quantity=\"two\">فيديوهاتان</item>\n        <item quantity=\"few\">%s فيديوهات</item>\n        <item quantity=\"many\">%s فيديوهات</item>\n        <item quantity=\"other\">%s فيديو</item>\n    </plurals>\n    <string name=\"low_quality_smaller\">جودة منخفضة (أصغر)</string>\n    <string name=\"show_error\">إظهار خطأ</string>\n    <string name=\"show_higher_resolutions_title\">عرض دقّات أعلى</string>\n    <string name=\"duplicate_in_playlist\">تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر.</string>\n    <string name=\"playlist_add_stream_success\">تمت إضافتها إلى قائمة التشغيل</string>\n    <plurals name=\"days\">\n        <item quantity=\"zero\">اليوم</item>\n        <item quantity=\"one\">منذ يوم واحد</item>\n        <item quantity=\"two\">منذ يومَين</item>\n        <item quantity=\"few\">منذ %d أيام</item>\n        <item quantity=\"many\">منذ %d يومًا</item>\n        <item quantity=\"other\">منذ %d يوم</item>\n    </plurals>\n    <string name=\"error_report_open_issue_button_text\">تقرير على GitHub</string>\n    <string name=\"black_theme_title\">أسود</string>\n    <string name=\"streams_notification_channel_name\">بث جديد</string>\n    <string name=\"import_soundcloud_instructions_hint\">معرفك, soundcloud.com/هويتك</string>\n    <string name=\"hold_to_append\">ضغط مطول للإدراج الى قائمة الانتظار</string>\n    <string name=\"metadata_privacy_private\">خاص</string>\n    <string name=\"crash_the_app\">اغلق التطبيق قسريا</string>\n    <string name=\"subscriptions_import_unsuccessful\">تعذر استيراد الاشتراكات</string>\n    <string name=\"pause\">إيقاف مؤقت</string>\n    <string name=\"error_unable_to_load_comments\">تعذر تحميل التعليقات</string>\n    <string name=\"remote_search_suggestions\">اقتراحات البحث عن بعد</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">استخدم ميزة فك ترميز وحدة فك التشفير الاحتياطية في ExoPlayer</string>\n    <string name=\"import_data_summary\">يلغي السجل الحالي والاشتراكات وقوائم التشغيل والإعدادات (اختياريًا)</string>\n    <string name=\"app_ui_crash\">تعطل التطبيق / واجهة المستخدم</string>\n    <string name=\"rename\">إعادة التسمية</string>\n    <string name=\"error_insufficient_storage_left\">لم يتبقى مساحة في الجهاز</string>\n    <string name=\"could_not_setup_download_menu\">تعذر إعداد قائمة التنزيل</string>\n    <string name=\"download_path_dialog_title\">اختر مجلد التنزيل لملفات الفيديو</string>\n    <string name=\"notifications_disabled\">تم تعطيل الإشعارات</string>\n    <string name=\"feed_group_dialog_delete_message\">هل تريد حذف هذه المجموعة؟</string>\n    <string name=\"settings_category_appearance_title\">المظهر</string>\n    <string name=\"on\">تشغيل</string>\n    <string name=\"clear_search_history_summary\">يحذف تاريخ البحث عن الكلمات الرئيسية</string>\n    <string name=\"error_report_channel_description\">التنبيهات المتعلقة بالإبلاغ عن الأخطاء</string>\n    <string name=\"previous_export\">نسخة احتياطية</string>\n    <string name=\"player_unrecoverable_failure\">حدث خطأ للمشغل غير قابل للاسترداد</string>\n    <string name=\"notification_action_3_title\">زر الإجراء الرابع</string>\n    <string name=\"feed_show_upcoming\">القادمة</string>\n    <string name=\"unknown_content\">[غير معروف]</string>\n    <string name=\"night_theme_title\">الحُلّة الليلية</string>\n    <string name=\"dark_theme_title\">داكن</string>\n    <string name=\"default_content_country_title\">المحتوى الإفتراضي حسب البلد</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">رافع الصورة الرمزية المصغرة</string>\n    <string name=\"none\">بدون</string>\n    <string name=\"auto_queue_summary\">استمر عند إنهاء قائمة التشغيل (الغير المتكررة) من خلال إلحاق التدفق المرتبط</string>\n    <string name=\"resize_fill\">ملء الشاشة</string>\n    <string name=\"feed_group_dialog_empty_selection\">لم يُختر أي اشتراك</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"zero\">لا مشارك</item>\n        <item quantity=\"one\">مٌشارِك واحد</item>\n        <item quantity=\"two\">مُشارِكان</item>\n        <item quantity=\"few\">%s مشارِكين</item>\n        <item quantity=\"many\">%s مشارِكون</item>\n        <item quantity=\"other\">%s مشارك</item>\n    </plurals>\n    <string name=\"loading_metadata_title\">جلب البيانات الوصفية…</string>\n    <string name=\"app_update_available_notification_text\">انقر للتنزيل %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">تعطيل الوضع السريع</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"playlist_page_summary\">صفحة قائمة التشغيل</string>\n    <string name=\"toggle_screen_orientation\">تبديل تدوير الشاشة</string>\n    <string name=\"app_update_available_notification_title\">تحديث NewPipe متاح!</string>\n    <string name=\"search_history_deleted\">تم حذف سجل البحث</string>\n    <string name=\"show_meta_info_summary\">قم بإيقاف التشغيل لإخفاء مربعات المعلومات الوصفية بمعلومات إضافية حول منشئ البث أو محتوى البث أو طلب البحث</string>\n    <string name=\"hash_channel_description\">إشعارات لتقدم تجزئة الفيديو</string>\n    <string name=\"crash_the_player\">تحطيم المشغل</string>\n    <string name=\"play_audio\">الصوت</string>\n    <string name=\"start_downloads\">بدء التنزيلات</string>\n    <string name=\"subscribed_button_title\">مشترك</string>\n    <string name=\"error_path_creation\">لا يمكن إنشاء المجلد الوجهة</string>\n    <string name=\"download_path_audio_summary\">يتم تخزين الملفات الصوتية التي تم تنزيلها هنا</string>\n    <string name=\"notification_action_nothing\">لا شيء</string>\n    <string name=\"read_privacy_policy\">الإطلاع على سياسة الخصوصية</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">يوفر YouTube \\\"وضع تقييد المحتوى\\\" الذي يخفي المحتوى المحتمل للكبار</string>\n    <string name=\"show_comments_summary\">عطّله لإخفاء التعليقات</string>\n    <string name=\"error_report_notification_title\">واجه NewPipe خطأ، اضغط للتقرير</string>\n    <string name=\"default_kiosk_page_summary\">الكشك الافتراضي</string>\n    <string name=\"show_search_suggestions_title\">اقتراحات البحث</string>\n    <string name=\"skip_silence_checkbox\">تسريع إلى الأمام أثناء الصمت</string>\n    <string name=\"settings_category_exoplayer_summary\">إدارة بعض إعدادات ExoPlayer. تتطلب هذه التغييرات إعادة تشغيل المشغل لتصبح سارية المفعول</string>\n    <string name=\"playlist_add_stream_success_duplicate\">تمت إضافة وقت (أوقات) مكررة %d</string>\n    <string name=\"show_higher_resolutions_summary\">فقط بعض الأجهزة تدعم تشغيل مقاطع فيديو 2K/4K</string>\n    <string name=\"import_data_title\">استيراد قاعدة البيانات</string>\n    <string name=\"image_quality_low\">جودة منخفضة</string>\n    <string name=\"main_tabs_position_title\">موضع الألسنة الرئيسية</string>\n    <string name=\"use_external_audio_player_title\">استخدم مشغل صوت خارجي</string>\n    <string name=\"subscription_change_failed\">تعذر تغيير حالة الاشتراك</string>\n    <string name=\"play_queue_remove\">أحذف</string>\n    <string name=\"chapters\">فصول</string>\n    <string name=\"downloads_storage_use_saf_title\">استخدام منتقي مجلد النظام (SAF)</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">متوفر في بعض الخدمات، وعادةً ما يكون أسرع بكثير ولكن قد يُرجع كمية محدودة من العناصر وغالبًا ما تكون معلومات غير مكتملة (مثلًا بدون مدة أو نوع عنصر أو حالة مباشرة)</string>\n    <string name=\"notification_colorize_summary\">اجعل أندرويد يخصص لون الإشعار وفقا للّون الرئيسي في الصورة المصغرة (لاحظ أن هذا غير متوفر على جميع الأجهزة)</string>\n    <string name=\"background_player_playing_toast\">يتم التشغيل في الخلفية</string>\n    <string name=\"error_http_no_content\">الخادم لا يقوم بإرسال البيانات</string>\n    <string name=\"privacy_policy_title\">سياسة خصوصية NewPipe</string>\n    <string name=\"recaptcha_request_toast\">طلب اختبار الكابتشا مطلوب</string>\n    <string name=\"faq_description\">إذا كنت تواجه مشكلة في استخدام التطبيق ، فتأكد من مراجعة هذه الإجابات للأسئلة الشائعة!</string>\n    <string name=\"downloads\">التحميلات</string>\n    <string name=\"remove_duplicates_message\">هل تريد إزالة جميع التدفقات المكررة في قائمة التشغيل هذه؟</string>\n    <string name=\"enable_leak_canary_summary\">قد تتسبب مراقبة تسرب الذاكرة في عدم استجابة التطبيق عند تفريغ السجلات</string>\n    <string name=\"error_progress_lost\">تم فقد التقدم بسبب حذف الملف</string>\n    <string name=\"name\">التسمية</string>\n    <string name=\"toggle_fullscreen\">الانتقال إلى وضع ملئ الشاشة</string>\n    <string name=\"error_connect_host\">لا يمكن الاتصال بالخادم</string>\n    <string name=\"show_memory_leaks\">إظهار تسرب الذاكرة</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"zero\">صفر ثانية</item>\n        <item quantity=\"one\">ثانية واحدة</item>\n        <item quantity=\"two\">ثانيتان</item>\n        <item quantity=\"few\">%d ثوانٍ</item>\n        <item quantity=\"many\">%d ثانية</item>\n        <item quantity=\"other\">%d ثانية</item>\n    </plurals>\n    <string name=\"downloads_storage_ask_summary\">سيتم سؤالك عن مكان حفظ كل تنزيل.\n\\nتمكين منتقي مجلد النظام (SAF) إذا كنت تريد التنزيل إلى بطاقة SD خارجية</string>\n    <string name=\"resume_on_audio_focus_gain_title\">استئناف التشغيل</string>\n    <string name=\"unknown_quality\">جودة غير معروفة</string>\n    <string name=\"georestricted_content\">هذا المحتوى غير متوفر في بلدك.</string>\n    <string name=\"network_error\">خطأ في الشبكة</string>\n    <string name=\"main_page_content\">محتوى الشاشة الرئيسية</string>\n    <string name=\"off\">إيقاف</string>\n    <string name=\"metadata_tags\">الوسوم</string>\n    <string name=\"metadata_host\">المضيف</string>\n    <string name=\"peertube_instance_url_help\">ابحث عن مثيلات الخوادم التي تناسبك على %s</string>\n    <string name=\"streams_notifications_network_title\">مطلوب اتصال الشبكة</string>\n    <string name=\"check_new_streams\">تشغيل التحقق من وجود تدفقات جديدة</string>\n    <string name=\"no_views\">دون مشاهدات</string>\n    <string name=\"start_here_on_popup\">بدأ التشغيل في نافذة منبثقة</string>\n    <string name=\"auto_queue_toggle\">قائمة انتظار تلقائيّة</string>\n    <string name=\"feed_subscription_not_loaded_count\">غير محمل: %d</string>\n    <string name=\"enqueue_stream\">قائمة الانتظار</string>\n    <string name=\"restricted_video_no_stream\">هذا الفيديو مقيد بالفئة العمرية.\n\\nنظرًا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـ NewPipe الوصول إلى أي من تدفقات الفيديو الخاصة به، وبالتالي لا يتمكن من تشغيلها.</string>\n    <string name=\"add_to_playlist\">إضافة إلى قائمة التشغيل</string>\n    <string name=\"channels\">القنوات</string>\n    <string name=\"dont_show\">لا تظهر</string>\n    <string name=\"peertube_instance_add_help\">أدخل عنوان للمثيل</string>\n    <string name=\"info_labels\">ماذا:\\nطلب:\\nلغة المحتوى:\\nبلد المحتوى:\\nلغة التطبيق:\\nالخدمات:\\nتوقيت جرينتش:\\nالحزمة:\\nالإصدار:\\nOS نسخة:</string>\n    <string name=\"use_external_video_player_summary\">يزيل الصوت في بعض الجودات</string>\n    <string name=\"feed_fetch_channel_tabs\">جلب ألسنة القنوات</string>\n    <string name=\"high_quality_larger\">جودة عالية (أكبر)</string>\n    <string name=\"faq_title\">أسئلة مكررة</string>\n    <string name=\"no_dir_yet\">لم يتم تعيين مجلد التحميل، الرجاء اختيار مجلد التحميل الافتراضي الآن</string>\n    <string name=\"feed_update_threshold_title\">عتبة تحديث الموجز</string>\n    <string name=\"select_night_theme_toast\">يمكنك اختيار نسقك الليلي المفضل أدناه</string>\n    <string name=\"app_update_unavailable_toast\">أنت تقوم بتشغيل أحدث إصدار من NewPipe</string>\n    <string name=\"delete\">احذف</string>\n    <string name=\"decline\">رفض</string>\n    <string name=\"start\">ابدأ</string>\n    <string name=\"settings_category_debug_title\">تحليل</string>\n    <string name=\"show_description_title\">إظهار الوصف</string>\n    <string name=\"just_once\">مرة واحدة فقط</string>\n    <string name=\"metadata_avatars\">الصور الرمزية</string>\n    <string name=\"streams_notifications_interval_title\">معدل البحث</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">قم بتمكين هذا الخيار إذا كانت لديك مشكلات في تهيئة وحدة فك التشفير ، والتي تعود إلى أجهزة فك التشفير ذات الأولوية الأقل إذا فشلت تهيئة وحدات فك التشفير الأولية. قد ينتج عن ذلك أداء تشغيل ضعيف مقارنة باستخدام وحدات فك التشفير الأساسية</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">تم محو ذاكرة التخزين المؤقتّة للبيانات الوصفيّة</string>\n    <string name=\"mark_as_watched\">وضع علامة تمت مشاهدته</string>\n    <string name=\"right_gesture_control_title\">اجراء الإيماءة اليمنى</string>\n    <string name=\"settings_file_charset_title\">الرموز المسموح بها في أسماء الملفات</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"title_last_played\">آخر ما تم تشغيله</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">استخدم دائمًا الحل البديل لإعداد سطح إخراج فيديو ExoPlayer</string>\n    <string name=\"next_stream\">البث التالي</string>\n    <string name=\"disable_media_tunneling_automatic_info\">تم تعطيل نفق وسائل الإعلام عن طريق التقصير على جهازك لأن نموذج جهازك معروف بأنه لا يدعمه.</string>\n    <string name=\"metadata_subchannel_avatars\">الصور الرمزية للقناة الفرعية</string>\n    <string name=\"duration_live\">بث مباشر</string>\n    <string name=\"import_settings\">هل تريد أيضا استيراد الإعدادات؟</string>\n    <string name=\"metadata_cache_wipe_title\">امسح البيانات الوصفيّة المخزّنة مؤقّتًا</string>\n    <string name=\"delete_downloaded_files\">حذف الملفات المحملة</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">يقوم هذا الحل البديل بتحرير وإعادة إنشاء نماذج برامج ترميز الفيديو عند حدوث تغيير في السطح، بدلا من تعيين السطح إلى برنامج الترميز مباشرة. تم استخدام هذا الإعداد بالفعل بواسطة ExoPlayer على بعض الأجهزة التي تعاني من هذه المشكلة ، وهذا الإعداد له تأثير فقط على Android 6 والإصدارات الأحدث\n\\n\n\\nقد يؤدي تمكين هذا الخيار إلى منع أخطاء التشغيل عند تبديل مشغل الفيديو الحالي أو التبديل إلى وضع ملء الشاشة</string>\n    <string name=\"ok\">موافق</string>\n    <string name=\"enable_watch_history_summary\">تتبّع مقاطع الفيديو التي تمّت مشاهدتها</string>\n    <string name=\"audio_streams_empty\">لم يتم العثور على أي بث صوتي</string>\n    <string name=\"playlist_thumbnail_change_success\">تم تغيير الصورة المصغرة لقائمة التشغيل.</string>\n    <string name=\"stop\">توقف</string>\n    <string name=\"light_theme_title\">فاتح</string>\n    <string name=\"action_history\">التاريخ</string>\n    <string name=\"popup_playing_toast\">تشغيل في وضع منبثق</string>\n    <string name=\"mute\">كتم الصوت</string>\n    <string name=\"msg_popup_permission\">هذا الإذن مطلوب\n\\nللفتح في وضع النافذة المنبثقة</string>\n    <string name=\"settings_category_feed_title\">الموجز</string>\n    <string name=\"remove_watched_popup_warning\">ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل. \\nهل أنت واثق؟ لا يمكن التراجع عن هذا!</string>\n    <string name=\"detail_dislikes_img_view_description\">عدم الإعجاب</string>\n    <string name=\"faq\">مشاهدة على الموقع</string>\n    <string name=\"night_theme_available\">هذا الخيار متاح فقط إذا تم تحديد %s للسمة</string>\n    <string name=\"retry\">إعادة المحاولة</string>\n    <string name=\"settings_category_player_title\">المشغل</string>\n    <string name=\"artists\">الفنانين</string>\n    <string name=\"download_has_started\">بدأ التنزيل</string>\n    <string name=\"audio_track_present_in_video\">يجب أن يكون هناك مسار صوتي موجود بالفعل في هذا البث</string>\n    <string name=\"private_content\">هذا المحتوى خاص، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe.</string>\n    <string name=\"default_popup_resolution_title\">الدقة الافتراضية للنوافذ المنبثقة</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور</string>\n    <string name=\"error_report_channel_name\">إشعار الإبلاغ عن الأخطاء</string>\n    <string name=\"app_language_title\">لغة التطبيق</string>\n    <string name=\"feed_notification_loading\">تحميل الموجز…</string>\n    <string name=\"manual_update_description\">التحقق يدويا من وجود إصدارات جديدة</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">لم يتم العثور على مدير ملفات مناسب لهذا الإجراء.\n\\nالرجاء تثبيت مدير ملفات متوافق مع إطار عمل الوصول إلى التخزين</string>\n    <string name=\"show_crash_the_player_summary\">إظهار خيار تعطل عند استخدام المشغل</string>\n    <string name=\"error_report_open_github_notice\">يرجى مراجعة ما إذا توجد بالفعل مشكلة تناقش التحطم الموجود بالفعل. عند إنشاء تذاكر مكررة، فإنك تستغرق منا وقتًا يمكن أن نقضيه في إصلاح الخطأ الفعلي.</string>\n    <string name=\"open_play_queue\">فتح قائمة انتظار التسغيل</string>\n    <string name=\"notification_actions_summary\">قم بتحرير كل إشعار أدناه من خلال النقر عليه. حدد ما يصل إلى ثلاثة منها لتظهر في الإشعار المضغوط باستخدام مربعات الاختيار الموجودة على اليمين</string>\n    <string name=\"what_happened_headline\">ماذا حدث:</string>\n    <string name=\"caption_setting_title\">ترجمات نصية توضيحية</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">الصورة الرمزية للقناة</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">جلب من موجز مخصص عندما يكون متاحًا</string>\n    <string name=\"file_name_empty_error\">لا يمكن أن يكون اسم الملف فارغًا</string>\n    <string name=\"prefer_original_audio_summary\">حدد المسار الصوتي الأصلي بغض النظر عن اللغة</string>\n    <string name=\"notifications\">الإشعارات</string>\n    <string name=\"settings_category_video_audio_title\">الفيديو والصوت</string>\n    <string name=\"feed_create_new_group_button_title\">جديد</string>\n    <string name=\"remove_watched_popup_title\">إزالة مقاطع الفيديو التي تمت مشاهدتها؟</string>\n    <string name=\"albums\">الالبومات</string>\n    <string name=\"tracks\">المسارات</string>\n    <string name=\"peertube_instance_url_summary\">حدد مثيلات PeerTube المفضلة لديك</string>\n    <string name=\"settings_category_player_notification_title\">إشعار المشغل</string>\n    <string name=\"use_inexact_seek_summary\">خاصية التقديم الغير دقيق تسمح للمشغل بالقفز خلال الفديو بشكل أسرع مع دقة قفز أقل. خاصية القفز ل5، 15 او 25 لا تعمل مع القفز الغير دقيق</string>\n    <string name=\"paused\">متوقف</string>\n    <string name=\"controls_popup_title\">نافذة منبثقة</string>\n    <string name=\"import_soundcloud_instructions\">قم باستيراد ملف تعريف SoundCloud عن طريق كتابة عنوان URL أو معرفك:\n\\n\n\\n1. تمكين \\\"وضع سطح المكتب\\\" في متصفح الويب (الموقع غير متاح للأجهزة المحمولة)\n\\n2. انتقل إلى عنوان URL هذا: %1$s\n\\n3. تسجيل الدخول عندما يطلب منك\n\\n4. انسخ عنوان URL للملف الشخصي الذي تمت إعادة توجيهك إليه.</string>\n    <string name=\"select_a_playlist\">اختر قائمة تشغيل</string>\n    <string name=\"metadata_age_limit\">الحد العمري</string>\n    <string name=\"no_app_to_open_intent\">لا يوجد تطبيق على جهازك يمكنه فتح هذا</string>\n    <string name=\"msg_wait\">يُرجى الإنتظار…</string>\n    <string name=\"drawer_header_description\">تبديل الخدمة، المحدد حاليًا:</string>\n    <string name=\"enable_watch_history_title\">سجل المشاهدة</string>\n    <string name=\"image_quality_none\">لا تقم بتحميل الصور</string>\n    <string name=\"enable_streams_notifications_summary\">الإخطار بأحداث البث الجديدة من الاشتراكات</string>\n    <string name=\"msg_name\">اسم الملف</string>\n    <string name=\"invalid_file\">الملف غير موجود أو الإذن بالقراءة أو الكتابة إليه غير موجود</string>\n    <string name=\"show_next_and_similar_title\">عرض مقاطع الفيديو \\\"التالية\\\" و \\\"المشابهة\\\"</string>\n    <string name=\"feed_update_threshold_summary\">الوقت بعد التحديث الأخير قبل اعتبار الاشتراك قديمًا — %s</string>\n    <string name=\"player_recoverable_failure\">استرداد المشغل من الخطأ</string>\n    <string name=\"image_quality_high\">عالية الجودة</string>\n    <string name=\"select_quality_external_players\">حدد الجودة للمشغلين الخارجيين</string>\n    <string name=\"detail_heart_img_view_description\">أُعجب بها منشئ المحتوى</string>\n    <string name=\"channel_tab_about\">عن</string>\n    <string name=\"search_showing_result_for\">عرض نتائج ل: %s</string>\n    <string name=\"open_with\">افتح باستخدام</string>\n    <string name=\"delete_item_search_history\">هل تريد حذف هذا العنصر من سجل البحث؟</string>\n    <string name=\"title_most_played\">الأكثر تشغيلا</string>\n    <string name=\"show_original_time_ago_title\">عرض الوقت الأصلي على العناصر</string>\n    <string name=\"import_from\">استعادة مِن</string>\n    <string name=\"default_resolution_title\">الدقة الافتراضية</string>\n    <string name=\"enable_playback_resume_title\">استئناف التشغيل</string>\n    <string name=\"forward\">تقديم المحتوى</string>\n    <string name=\"clear_queue_confirmation_summary\">قد يؤدي التبديل من مشغل إلى آخر إلى استبدال قائمة الانتظار الخاصة بك</string>\n    <string name=\"download_path_summary\">يتم تخزين ملفات الفيديو التي تم تنزيلها هنا</string>\n    <string name=\"hash_channel_name\">إشعار تجزئة الفيديو</string>\n    <string name=\"select_audio_track_external_players\">حدد مسار الصوت للمشغلات الخارجية</string>\n    <string name=\"show_thumbnail_summary\">استخدم الصورة المصغرة لكل من خلفية شاشة القفل والإشعارات</string>\n    <string name=\"undo\">تراجع</string>\n    <string name=\"unknown_format\">تنسيق غير معروف</string>\n    <string name=\"channel_tab_albums\">الألبومات</string>\n    <string name=\"no_audio_streams_available_for_external_players\">لا توجد تدفقات صوتية متاحة للمشغلات الخارجية</string>\n    <string name=\"local\">محلي</string>\n    <string name=\"rewind\">إعادة المحتوى</string>\n    <string name=\"semitone\">سيميتون</string>\n    <string name=\"replay\">إعادة التشغيل</string>\n    <string name=\"overwrite_unrelated_warning\">يوجد ملف بهذا الاسم مسبقاً</string>\n    <string name=\"show_description_summary\">قم بإيقاف التشغيل لإخفاء وصف الفيديو والمعلومات الإضافية</string>\n    <string name=\"default_video_format_title\">صيغة الفيديو الافتراضية</string>\n    <string name=\"notification_action_2_title\">زر الإجراء الثالث</string>\n    <string name=\"download_to_sdcard_error_message\">لا يمكن التنزيل على بطاقة SD الخارجية. هل تريد إعادة تعيين موقع مجلد التنزيل؟</string>\n    <string name=\"could_not_load_thumbnails\">تعذر تحميل كافة الصور المصغرة</string>\n    <string name=\"related_items_tab_description\">التيارات ذات الصلة</string>\n    <string name=\"error_download_resource_gone\">لا يمكن استرداد هذا التنزيل</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">إظهار الاشتراكات غير المجمعة فقط</string>\n    <string name=\"clear_views_history_summary\">حذف محفوظات البثوث التي تم تشغيلها ومواقف التشغيل</string>\n    <string name=\"queued\">في قائمة الانتظار</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">تمكين الوضع السريع</string>\n    <string name=\"audio_track_type_dubbed\">مدبلجة</string>\n    <string name=\"local_search_suggestions\">اقتراحات البحث المحلية</string>\n    <string name=\"notification_scale_to_square_image_title\">اقتصاص الصورة المصغرة إلى نسبة العرض إلى الارتفاع 1:1</string>\n    <string name=\"comments_are_disabled\">تم تعطيل التعليقات</string>\n    <string name=\"website_title\">موقع الويب</string>\n    <string name=\"enable_search_history_title\">سجل البحث</string>\n    <string name=\"drawer_open\">فتح الدرج</string>\n    <string name=\"infinite_videos\">∞ فيديو</string>\n    <string name=\"error_http_unsupported_range\">الخادم لا يقبل التنزيل المتعدد، إعادة المحاولة مع @string/msg_threads = 1</string>\n    <string name=\"playback_reset\">إعادة تعيين</string>\n    <string name=\"popup_remember_size_pos_summary\">تذكر آخر مكان وحجم للنافذة المنبثقة</string>\n    <string name=\"export_complete_toast\">تمت عملية التصدير</string>\n    <string name=\"parsing_error\">تعذر تحليل الموقع</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">الألسنة التي سيتم جلبها عند تحديث الموجز. ليس لهذا الخيار أي تأثير إذا تم تحديث القناة باستخدام الوضع السريع.</string>\n    <string name=\"create_error_notification\">قم بإنشاء تنبيه بالخطأ</string>\n    <string name=\"app_update_notification_channel_description\">إشعارات لإصدار NewPipe الجديد</string>\n    <string name=\"restore_defaults\">استعادة الضبط الافتراضي</string>\n    <string name=\"pause_downloads_on_mobile\">المقاطعة على الشبكات المقيسة</string>\n    <string name=\"override_current_data\">هذا سوف يُزيل إعداداتك الحالية.</string>\n    <plurals name=\"views\">\n        <item quantity=\"zero\">لا مشاهدة</item>\n        <item quantity=\"one\">مشاهدة واحدة</item>\n        <item quantity=\"two\">مُشاهَدتان</item>\n        <item quantity=\"few\">%s مُشاهَدات</item>\n        <item quantity=\"many\">%s مُشاهَدةً</item>\n        <item quantity=\"other\">%s مُشاهَدة</item>\n    </plurals>\n    <string name=\"import_title\">إستيراد</string>\n    <string name=\"events\">الأحداث</string>\n    <string name=\"clear_playback_states_title\">حذف مواقف التشغيل</string>\n    <string name=\"notification_action_0_title\">زر الإجراء الأول</string>\n    <string name=\"minimize_on_exit_none_description\">لاشيء</string>\n    <string name=\"auto_device_theme_title\">تلقائي (سمة الجهاز)</string>\n    <string name=\"saved_tabs_invalid_json\">يتم الآن استخدام الألسنة الافتراضية بعد حدوث خطأ أثناء قراءة الألسنة المحفوظة</string>\n    <string name=\"caption_setting_description\">تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق لتصبح التغييرات سارية المفعول</string>\n    <string name=\"content_not_available\">المحتوى غير متوفر</string>\n    <string name=\"always\">دائماً</string>\n    <string name=\"prefer_descriptive_audio_summary\">حدد مسارًا صوتيًا يحتوي على أوصاف للأشخاص ضعاف البصر إذا كان ذلك متاحًا</string>\n    <string name=\"limit_data_usage_none_description\">لا حدود</string>\n    <string name=\"detail_thumbnail_view_description\">مدة, تشغيل الفيديو:</string>\n    <string name=\"clear_views_history_title\">محو سجل المشاهدة</string>\n    <string name=\"left_gesture_control_title\">إجراء الإيماءة اليسرى</string>\n    <string name=\"no_videos\">لاتوجد فيديوهات</string>\n    <string name=\"notification_channel_name\">تنبيهات NewPipe</string>\n    <string name=\"delete_downloaded_files_confirm\">محو جميع الملفات التي تم تنزيلها من القرص؟</string>\n    <string name=\"subtitle_activity_recaptcha\">اضغط على \\\"تم\\\" عند حلها</string>\n    <string name=\"no_one_listening\">لا أحد يستمع</string>\n    <string name=\"notification_action_repeat\">تكرار</string>\n    <string name=\"enqueue\">إضافة إلى قائمة الانتظار</string>\n    <string name=\"msg_running\">يقوم نيوبايب بالتنزيل</string>\n    <string name=\"image_quality_medium\">النوعية متوسطة</string>\n    <string name=\"downloads_storage_use_saf_summary\">يسمح \\\"Storage Access Framework\\\" بالتنزيل على بطاقة SD خارجية</string>\n    <string name=\"could_not_import_all_files\">تنبيه: تعذر استيراد كافة الملفات.</string>\n    <string name=\"download_path_audio_title\">مجلد الصوتيات المحفوظة</string>\n    <string name=\"tab_bookmarks\">الإشارات المرجعية</string>\n    <string name=\"delete_playback_states_alert\">حذف كل مواقف التشغيل؟</string>\n    <string name=\"prefer_descriptive_audio_title\">تفضل الصوت الوصفي</string>\n    <string name=\"notification_action_shuffle\">خلط</string>\n    <string name=\"autoplay_summary\">بدء التشغيل تلقائياً — %s</string>\n    <string name=\"drawer_close\">إغلاق الدرج</string>\n    <string name=\"content_not_supported\">هذا المحتوى ليس مدعومًا من قبل NewPipe.\n\\n\n\\nنأمل أن يكون مدعومًا في التحديثات القادمة.</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"zero\">لا دقيقة</item>\n        <item quantity=\"one\">دقيقة واحدة</item>\n        <item quantity=\"two\">دقيقتان</item>\n        <item quantity=\"few\">%d دقائق</item>\n        <item quantity=\"many\">%d دقيقة</item>\n        <item quantity=\"other\">%d دقيقة</item>\n    </plurals>\n    <string name=\"popup_player\">المشغل المنبثق</string>\n    <string name=\"metadata_uploader_avatars\">الصورة الرمزية للرفع</string>\n    <string name=\"checksum\">التوقيع</string>\n    <string name=\"show_age_restricted_content_title\">محتوى مقيد للبالغين</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">متابعة التشغيل بعد المقاطعات (مثل المكالمات الهاتفية)</string>\n    <string name=\"import_ongoing\">عملية الاستعادة جارية …</string>\n    <string name=\"progressive_load_interval_summary\">قم بتغيير حجم الفاصل الزمني للتحميل على المحتويات التدريجية (حاليا %s). قد تؤدي القيمة المنخفضة إلى تسريع التحميل الأولي</string>\n    <string name=\"prefer_original_audio_title\">تفضيل الصوت الأصلي</string>\n    <string name=\"detail_likes_img_view_description\">الإعجابات</string>\n    <string name=\"general_error\">خطأ</string>\n    <string name=\"download_path_audio_dialog_title\">اختر مجلد التنزيل للملفات الصوتية</string>\n    <string name=\"import_youtube_instructions\">استيراد اشتراكات YouTube من Google takeout:\n\\n\n\\n1. انتقل إلى عنوان URL هذا: %1$s\n\\n2. تسجيل الدخول عند سؤالك\n\\n3. انقر على \\\"جميع البيانات المدرجة\\\"، ثم على \\\"إلغاء تحديد جميع\\\"، ثم حدد فقط \\\"الاشتراكات\\\" وانقر على \\\"موافق\\\"\n\\n4. انقر على \\\"الخطوة التالية\\\" ثم على \\\"إنشاء التصدير\\\"\n\\n5. انقر على زر \\\"تحميل\\\" بعد ظهوره\n\\n6. انقر على IMPORT FILE أدناه وحدد الملف البريدي تحميلها\n\\n7. [إذا فشل استيراد الرمز البريدي] استخراج ملف .csv (عادة تحت عنوان \\\"يوتيوب ويوتيوب الموسيقى / الاشتراكات / الاشتراكات.csv\\\")، انقر على IMPORT FILE أدناه وحدد ملف csv المستخرج</string>\n    <string name=\"notification_action_buffering\">جارٍ التحميل</string>\n    <string name=\"soundcloud_go_plus_content\">هذا مسار SoundCloud Go+، على الأقل في بلدك، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe.</string>\n    <string name=\"wifi_only\">فقط على شبكة Wi-Fi</string>\n    <string name=\"show_thumbnail_title\">إظهار الصورة المصغرة</string>\n    <string name=\"playback_speed_control\">ضوابط سرعة التشغيل</string>\n    <string name=\"give_back\">رد الجميل</string>\n    <string name=\"watch_history_deleted\">تم حذف سجل المشاهدة</string>\n    <string name=\"settings_category_history_title\">سجل المشاهَدة و ذاكرة التخزين المؤقتة</string>\n    <string name=\"percent\">النسبة المئوية</string>\n    <string name=\"title_activity_recaptcha\">تحدي الكابتشا</string>\n    <string name=\"no_subscribers\">ليس هناك مشترِكون</string>\n    <string name=\"paid_content\">يتوفر هذا المحتوى فقط للمستخدمين الذين قاموا بالدفع، لذلك لا يمكن بثه أو تنزيله عبر NewPipe.</string>\n    <string name=\"recent\">حديثة</string>\n    <string name=\"subscription_update_failed\">تعذر تحديث الاشتراك</string>\n    <string name=\"clear_queue_confirmation_description\">سيتم استبدال قائمة انتظار للمشغل النشط</string>\n    <string name=\"msg_threads\">التقسيم</string>\n    <string name=\"subscribe_button_title\">اشتراك</string>\n    <string name=\"channel_created_by\">أنشأها %s</string>\n    <string name=\"settings_file_replacement_character_title\">الحرف الإستبدالي</string>\n    <string name=\"list_view_mode\">وضع مظهر ”عرض القائمة“</string>\n    <string name=\"start_main_player_fullscreen_title\">بدء تشغيل المشغل الرئيسي في وضع ملء الشاشة</string>\n    <string name=\"minimize_on_exit_title\">تصغير عند تبديل التطبيق</string>\n    <string name=\"play_queue_audio_track\">الصوت : %s</string>\n    <string name=\"playback_step\">خطوة</string>\n    <string name=\"recaptcha_solve\">حل</string>\n    <string name=\"selected_stream_external_player_not_supported\">الدفق المحدد غير مدعوم من قبل المشغلون الخارجيون</string>\n    <string name=\"title_activity_about\">عن تطبيق نيوپايپ</string>\n    <string name=\"seek_duration_title\">تسريع إلى الأمام/-ترجيع وقت البحث</string>\n    <string name=\"permission_denied\">تم رفضها من قبل النظام</string>\n    <string name=\"no_comments\">ليس هناك تعليقات</string>\n    <string name=\"checking_updates_toast\">جاري التحقق من وجود تحديثات…</string>\n    <string name=\"content\">المحتوى</string>\n    <string name=\"downloads_storage_ask_title\">اسأل عن مكان التنزيل</string>\n    <string name=\"disabled\">معطل</string>\n    <string name=\"feed_load_error\">خطأ في تحميل الخلاصة</string>\n    <string name=\"streams_notification_channel_description\">الإخطارات حول التدفقات الجديدة للاشتراكات</string>\n    <string name=\"no_one_watching\">لا توجد مشاهدة</string>\n    <string name=\"switch_to_background\">الإنتقال إلى التشغيل في الخلفية</string>\n    <string name=\"users\">المستخدمين</string>\n    <string name=\"list\">القائمة</string>\n    <string name=\"player_stream_failure\">لا يمكن تشغيل هذا البث</string>\n    <string name=\"clear_cookie_title\">امسح ملفات تعريف الارتباط reCAPTCHA</string>\n    <string name=\"metadata_banners\">اللافتات</string>\n    <string name=\"contribution_title\">ساهم</string>\n    <string name=\"minimize_on_exit_summary\">الإجراء عند التبديل إلى تطبيق آخر من مشغل الفيديو الرئيسي — %s</string>\n    <string name=\"channel_tab_playlists\">قوائم التشغيل</string>\n    <string name=\"metadata_privacy_public\">عامة</string>\n    <string name=\"disable_media_tunneling_summary\">قم بتعطيل نفق الوسائط إذا واجهت شاشة سوداء أو تقطيع اثناء تشغيل الفيديو.</string>\n    <string name=\"overwrite_finished_warning\">يوجد ملف تحميل بهذا الاسم موجود مسبقاً</string>\n    <string name=\"auto\">تلقائي</string>\n    <string name=\"confirm_prompt\">هل تريد محو سجل التنزيل، أم تريد حذف جميع الملفات التي تم تنزيلها؟</string>\n    <string name=\"best_resolution\">أفضل دقة</string>\n    <string name=\"sort\">فرز</string>\n    <string name=\"grid\">الشبكة</string>\n    <string name=\"enable_playback_resume_summary\">استعادة آخر موقف تشغيل</string>\n    <string name=\"account_terminated\">تم إنهاء الحساب</string>\n    <string name=\"right_gesture_control_summary\">اختر إيماءة للنصف الأيمن من شاشة المشغل</string>\n    <string name=\"preferred_player_fetcher_notification_title\">الحصول على المعلومات…</string>\n    <string name=\"overwrite\">الكتابة فوق</string>\n    <string name=\"missing_file\">نقل الملف أو حذفه</string>\n    <string name=\"songs\">الأغاني</string>\n    <string name=\"kore_not_found\">تطبيق Kore غير موجود. هل تريد تثبيته؟</string>\n    <string name=\"download_already_running\">هنالك تحميل قيد التقدم بهذا الاسم</string>\n    <string name=\"switch_to_main\">الإنتقال إلى الرئيسية</string>\n    <string name=\"default_audio_format_title\">صيغة الصوت الافتراضية</string>\n    <string name=\"error_report_notification_toast\">حدث خطأ، انظر للإشعار</string>\n    <string name=\"video\">الفيديو</string>\n    <string name=\"pause_downloads_on_mobile_desc\">مفيد عند التبديل إلى بيانات الجوال، ولكن لا يمكن تعليق بعض التنزيلات</string>\n    <string name=\"main_tabs_position_summary\">انقل محدد اللسان الرئيسي إلى الأسفل</string>\n    <string name=\"leak_canary_not_available\">LeakCanary غير متوفر</string>\n    <string name=\"subscribers_count_not_available\">عدد المشتركين غير متاح</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">حدد الاشتراكات</string>\n    <string name=\"tab_subscriptions\">الاشتراكات</string>\n    <string name=\"app_license\">NewPipe هو برنامج مفتوح المصدر وبحقوق متروكة: يمكنك استخدام الكود ودراسته وتحسينه كما شئت. وعلى وجه التحديد يمكنك إعادة توزيعه / أو تعديله تحت شروط رخصة GNU العمومية والتي نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (باختيارك) أي إصدار أحدث.</string>\n    <string name=\"show_play_with_kodi_summary\">اعرض خيار لتشغيل الفيديو عبر مركز وسائط Kodi</string>\n    <string name=\"post_processing\">قيد المعالجة</string>\n    <string name=\"rename_playlist\">إعادة تسمية</string>\n    <string name=\"error_file_creation\">لا يمكن إنشاء الملف</string>\n    <string name=\"enable_queue_limit\">حد قائمة انتظار التنزيل</string>\n    <string name=\"any_network\">أي شبكة</string>\n    <string name=\"download_failed\">فشل التنزيل</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">الافتراضي ExoPlayer</string>\n    <string name=\"clear_download_history\">تنظيف تاريخ التحميل</string>\n    <string name=\"download_already_pending\">هناك تنزيل معلق بهذا الاسم</string>\n    <string name=\"missions_header_finished\">انتهى</string>\n    <string name=\"recently_added\">أُضيف مؤخرًا</string>\n    <string name=\"settings_file_replacement_character_summary\">يتم استبدال الرموز غير المسموح بها بهذه القيمة</string>\n    <string name=\"empty_list_subtitle\">لا شيء هنا سوى الصراصير</string>\n    <string name=\"playlist_no_uploader\">مُنشأة تلقائيًا (لم يتم العثور على رافع)</string>\n    <string name=\"audio_track\">المسار الصوتي</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">مفيد ، على سبيل المثال ، إذا كنت تستخدم سماعة رأس بأزرار مادية مكسورة</string>\n    <string name=\"external_player_unsupported_link_type\">المشغل الخارجي لا يدعم هذه الأنواع من الروابط</string>\n    <string name=\"show_original_time_ago_summary\">ستكون النصوص الأصلية من الخدمات مرئية في عناصر البث</string>\n    <string name=\"switch_to_popup\">الإنتقال إلى التشغيل في النافذة المنبثقة</string>\n    <string name=\"error_unknown_host\">تعذر العثور على الخادم</string>\n    <string name=\"enable_disposed_exceptions_title\">تقرير الأخطاء خارج دورة الحياة</string>\n    <string name=\"card\">البطاقة</string>\n    <string name=\"select_a_kiosk\">حدد كشك</string>\n    <string name=\"feed_load_error_fast_unknown\">لا يوفر وضع الموجز السريع مزيدًا من المعلومات حول هذا الموضوع.</string>\n    <string name=\"no_available_dir\">يرجى تحديد مجلد التنزيل لاحقا في الإعدادات</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">سيتم سؤالك عن مكان حفظ كل تنزيل</string>\n    <string name=\"no_live_streams\">لاتوجد بثوث مباشرة</string>\n    <string name=\"blank_page_summary\">صفحة فارغة</string>\n    <string name=\"never\">أبدا</string>\n    <string name=\"msg_failed_to_copy\">فشل النسخ إلى الحافظة</string>\n    <string name=\"start_accept_privacy_policy\">من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية.\n\\nويجب عليك قبولها لإرسال تقرير الأخطاء إلينا.</string>\n    <string name=\"enable_disposed_exceptions_summary\">فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها</string>\n    <string name=\"settings_category_player_notification_summary\">ضبط إشعار مشغل البث الحالي</string>\n    <string name=\"export_data_title\">تصدير قاعدة البيانات</string>\n    <string name=\"unset_playlist_thumbnail\">إلغاء تعيين الصورة المصغرة الدائمة</string>\n    <string name=\"comments_tab_description\">تعليقات</string>\n    <string name=\"resize_zoom\">تكبير</string>\n    <string name=\"metadata_category\">الصنف</string>\n    <string name=\"resize_fit\">تناسب مع الشاشة</string>\n    <string name=\"enable_playback_state_lists_summary\">إظهار مؤشّرات وضع التشغيل في القوائم</string>\n    <string name=\"image_quality_summary\">اختر جودة الصور وما إذا كنت تريد تحميل الصور على الإطلاق، لتقليل استخدام البيانات والذاكرة. تؤدي التغييرات إلى مسح ذاكرة التخزين المؤقت للصور الموجودة في الذاكرة وعلى القرص — %s</string>\n    <string name=\"progressive_load_interval_title\">حجم الفاصل الزمني لتحميل التشغيل</string>\n    <string name=\"delete_search_history_alert\">حذف سِجل البحث بالكامل؟</string>\n    <string name=\"metadata_language\">اللغة</string>\n    <string name=\"settings_category_player_behavior_title\">السلوك</string>\n    <string name=\"invalid_directory\">لا يوجد مثل هذا المجلد</string>\n    <string name=\"play\">شغِّل</string>\n    <string name=\"unhook_checkbox\">إلغاء الإرتباط (قد يسبب تشويه)</string>\n    <string name=\"settings_category_clear_data_title\">امسح البيانات</string>\n    <string name=\"no_playlist_bookmarked_yet\">لا توجد إشارات مرجعية لقائمة التشغيل بعدُ</string>\n    <string name=\"donation_encouragement\">يتم تطوير NewPipe من قبل متطوعين يقضون وقت فراغهم لتقديم أفضل تجربة لك. حان الوقت لرد المساعدة مع المطورين وجعل NewPipe أكثر و أفضل بينما يستمتعون بفنجان من القهوة.</string>\n    <string name=\"show_comments_title\">إظهار التعليقات</string>\n    <string name=\"msg_copied\">تم نسخه إلى الحافظة</string>\n    <string name=\"more_options\">المزيد من الخيارات</string>\n    <string name=\"auto_queue_title\">وضع البث القادم تلقائيا في قائمة الإنتظار</string>\n    <string name=\"metadata_support\">الدعم</string>\n    <string name=\"no_valid_zip_file\">ملف مضغوط ZIP غير صالح</string>\n    <string name=\"error_http_not_found\">غير موجود</string>\n    <string name=\"night_theme_summary\">حدد موضوعك الليلي المفضل — %s</string>\n    <string name=\"kiosk_page_summary\">صفحة الكشك</string>\n    <plurals name=\"listening\">\n        <item quantity=\"zero\">لا مُستمِع</item>\n        <item quantity=\"one\">مُستَمِع واحد</item>\n        <item quantity=\"two\">مُستمِعان</item>\n        <item quantity=\"few\">%s مُستَمِعين</item>\n        <item quantity=\"many\">%s مُستَمِعًا</item>\n        <item quantity=\"other\">%s مستمع</item>\n    </plurals>\n    <string name=\"metadata_privacy_unlisted\">غير مدرج</string>\n    <string name=\"conferences\">المؤتمرات</string>\n    <string name=\"import_file_title\">إستيراد ملف</string>\n    <string name=\"show_error_snackbar\">إظهار خطأ snackbar</string>\n    <string name=\"website_encouragement\">قم بزيارة موقع NewPipe لمزيد من المعلومات والمستجدات.</string>\n    <string name=\"no_channel_subscribed_yet\">لم يتم الاشتراك في أي قناة بعد</string>\n    <string name=\"start_main_player_fullscreen_summary\">لا تبدأ تشغيل مقاطع الفيديو في المشغل المصغر، ولكن قم بتدوير وضع ملء الشاشة مباشرة، إذا تم تأمين التدوير التلقائي. لا يزال بإمكانك الوصول إلى المشغل المصغر عن طريق الخروج من ملء الشاشة</string>\n    <string name=\"app_license_title\">تراخيص NewPipe</string>\n    <string name=\"feed_update_threshold_option_always_update\">تحديث دائمًا</string>\n    <string name=\"tab_licenses\">التراخيص</string>\n    <string name=\"export_ongoing\">عملية التصدير جارية …</string>\n    <string name=\"minimize_on_exit_background_description\">تصغير إلى مشغل الخلفية</string>\n    <string name=\"notification_channel_description\">تنبيهات مشغل NewPipe</string>\n    <string name=\"import_complete_toast\">تمَّت عملية الإستيراد</string>\n    <string name=\"metadata_thumbnails\">الصور المصغرة</string>\n    <string name=\"loading_stream_details\">تحميل تفاصيل البث…</string>\n    <string name=\"show_hold_to_append_title\">إظهار تلميح \\\"اضغط للفتح\\\"</string>\n    <string name=\"limit_mobile_data_usage_title\">الحد من جودة الفيديو عند استخدام بيانات الهاتف المحمول</string>\n    <string name=\"enable_queue_limit_desc\">سيتم تشغيل تنزيل واحد في نفس الوقت</string>\n    <string name=\"accept\">قبول</string>\n    <string name=\"settings_category_exoplayer_title\">إعدادات ExoPlayer</string>\n    <string name=\"app_update_notification_channel_name\">تنبيه تحديث التطبيق</string>\n    <string name=\"unmute\">غير صامت</string>\n    <string name=\"clear_cookie_summary\">امسح ملفات تعريف الارتباط التي يخزنها NewPipe عند حل reCAPTCHA</string>\n    <string name=\"new_seek_duration_toast\">نظرا لقيود مشغل ExoPlayer مدة التقديم تم ضبطها الى %d ثانية</string>\n    <string name=\"top_50\">أفضل ٥٠</string>\n    <string name=\"brightness\">السطوع</string>\n    <string name=\"description_select_enable\">تمكين تحديد نص في الوصف</string>\n    <string name=\"feed_show_watched\">شاهَدتَها بالكامل</string>\n    <string name=\"caption_none\">بدون ترجمات نصية توضيحية</string>\n    <string name=\"enable_playback_state_lists_title\">المواضع في القوائم</string>\n    <string name=\"file\">الملف</string>\n    <string name=\"settings_category_updates_title\">التحديثات</string>\n    <string name=\"systems_language\">النظام الافتراضي</string>\n    <string name=\"streams_not_yet_supported_removed\">لا يتم عرض التدفقات التي لم يدعمها برنامج التنزيل بعد</string>\n    <string name=\"video_streams_empty\">لم يتم العثور على أي بث مرئي</string>\n    <string name=\"enqueue_next_stream\">وضع التالي على قائمة الانتظار</string>\n    <string name=\"show_meta_info_title\">إظهار معلومات التعريف</string>\n    <string name=\"select_a_channel\">اختر قناة</string>\n    <string name=\"copyright\">© %1$sبواسطة%2$sتحت%3$s</string>\n    <string name=\"disable_media_tunneling_title\">تعطيل نفق الوسائط</string>\n    <string name=\"channel_tab_tracks\">المسارات</string>\n    <string name=\"feed_group_dialog_empty_name\">اسم المجموعة فارغ</string>\n    <string name=\"peertube_instance_add_https_only\">يتم دعم عناوين URL HTTPS فقط</string>\n    <string name=\"duration\">المدة</string>\n    <string name=\"subscriptions_export_unsuccessful\">لا يمكن تصدير الاشتراكات</string>\n    <string name=\"no_streams\">لاتوجد بثوث</string>\n    <string name=\"notification_actions_at_most_three\">يمكنك تحديد ثلاثة إجراءات كحد أقصى لإظهارها في الإشعار المضغوط!</string>\n    <string name=\"contribution_encouragement\">إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل!</string>\n    <string name=\"main_page_content_summary\">اختار الألسنة التي تودّ ظهورها على الصفحة الرئيسية</string>\n    <string name=\"download_path_title\">مجلد تحميل الفيديو</string>\n    <string name=\"restricted_video\">هذا الفيديو مقيد بالفئة العمرية.\n\\n\n\\nقم بتفيل \\\"%1$s\\\" في الإعدادات إذا كنت تريد رؤيته.</string>\n    <string name=\"ignore_hardware_media_buttons_title\">تجاهل أحداث ازرار الوسائط الأجهزة</string>\n    <string name=\"tab_choose\">اختر لسانًا</string>\n    <string name=\"audio\">الصوت</string>\n    <string name=\"watch_history_states_deleted\">تم حذف كل مواقف التشغيل</string>\n    <string name=\"controls_background_title\">في الخلفية</string>\n    <string name=\"channel_tab_channels\">القنوات</string>\n    <string name=\"metadata_licence\">الرخصة</string>\n    <string name=\"unsubscribe\">إلغاء الاشتراك</string>\n    <string name=\"you_successfully_subscribed\">لقد اشتركت الآن في هذه القناة</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">بدءًا من Android 10، يتم دعم \\\"Storage Access Framework\\\" فقط</string>\n    <string name=\"generate_unique_name\">إنشاء اسم فريد</string>\n    <string name=\"error_ssl_exception\">فشل الاتصال الآمن</string>\n    <string name=\"youtube_music_premium_content\">يتوفر هذا الفيديو فقط لأعضاء YouTube Music Premium، لذلك لا يمكن بثه أو تنزيله من قبل NewPipe.</string>\n    <string name=\"previous_stream\">البث السابق</string>\n    <string name=\"play_all\">تشغيل الكل</string>\n    <string name=\"theme_title\">السمة</string>\n    <string name=\"error_snackbar_action\">أبلِغ</string>\n    <string name=\"left_gesture_control_summary\">اختر إيماءة للنصف الأيسر من شاشة المشغل</string>\n    <string name=\"copy_for_github\">نسخ التقرير مُنسق</string>\n    <string name=\"channel_tab_livestreams\">مباشر</string>\n    <string name=\"updates_setting_description\">إظهار تنبيه للمطالبة بتحديث التطبيق عندما يتوفر إصدار جديد</string>\n    <string name=\"always_ask_open_action\">السؤال دائماً</string>\n    <string name=\"done\">منجز</string>\n    <string name=\"error_report_title\">تقرير عن المشكلة</string>\n    <string name=\"enqueued\">أُضيفَ إلى قائمة الانتظار</string>\n    <string name=\"no_appropriate_file_manager_message\">لم يتم العثور على مدير ملفات مناسب لهذا الإجراء.\n\\nيرجى تثبيت مدير ملفات أو محاولة تعطيل \\\"%s\\\" في إعدادات التنزيل</string>\n    <string name=\"video_player\">مشغل الفيديو</string>\n    <string name=\"video_detail_by\">بواسطة %s</string>\n    <string name=\"description_tab_description\">وصف</string>\n    <string name=\"missions_header_pending\">ريثما</string>\n    <string name=\"share_playlist_with_list\">شارك الرابط التشعبي للقائمة</string>\n    <string name=\"share_playlist_with_titles\">شارِكها بالترجمات النصية</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">شارِك قائمة التشغيل</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ars/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "app/src/main/res/values-as/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"no_player_found_toast\">কোনো ষ্ট্ৰিম প্লেয়াৰ পোৱা নগ\\'ল (আপুনি ইয়াক বজাবলৈ VLC ইনষ্টল কৰিব পাৰে)।</string>\n    <string name=\"install\">ইনষ্টল</string>\n    <string name=\"cancel\">বাতিল কৰক</string>\n    <string name=\"ok\">ঠিক আছে</string>\n    <string name=\"open_in_browser\">ব্ৰাউজাৰত খোলক</string>\n    <string name=\"open_in_popup_mode\">POPUP অৱস্থাত খোলক</string>\n    <string name=\"open_with\">...ৰ সৈতে খোলক</string>\n    <string name=\"share\">চেয়াৰ</string>\n    <string name=\"upload_date_text\">%1$s ত প্ৰকাশ কৰা হৈছে</string>\n    <string name=\"no_player_found\">কোনো ষ্ট্ৰিম প্লেয়াৰ পোৱা নগ\\'ল। VLC ইনষ্টল কৰক\\?</string>\n    <string name=\"download\">ডাউনল’ড</string>\n    <string name=\"controls_download_desc\">ষ্ট্ৰিম কৰা ফাইল ডাউনলোড কৰক</string>\n    <string name=\"search\">সন্ধান কৰক</string>\n    <string name=\"settings\">ছেটিংছ</string>\n    <string name=\"search_showing_result_for\">%s ৰ বাবে ফলাফল দেখুৱা হৈছে</string>\n    <string name=\"share_dialog_title\">চেয়াৰ কৰক</string>\n    <string name=\"use_external_video_player_summary\">কিছু ৰিজ’লিউচনত অডিঅ’ আঁতৰাওক</string>\n    <string name=\"subscribed_button_title\">চাবস্ক্ৰাইব কৰা হ\\'ল</string>\n    <string name=\"unsubscribe\">আনচাবস্ক্ৰাইব</string>\n    <string name=\"main_bg_subtitle\">আৰম্ভ কৰিবলৈ মেগনিফাইং গ্লাছৰ চিহ্নত টিপক।</string>\n    <string name=\"subscribe_button_title\">চাবস্ক্ৰাইব</string>\n    <string name=\"mark_as_watched\">চোৱা হ\\'ল (চিহ্নিত কৰক)</string>\n    <string name=\"did_you_mean\">আপুনি \\\"%1$s\\\" বুজাইছিল নেকি\\?</string>\n    <string name=\"use_external_video_player_title\">বাহ্যিক ভিডিঅ’ প্লেয়াৰ ব্যৱহাৰ কৰক</string>\n    <string name=\"use_external_audio_player_title\">বাহ্যিক অডিঅ’ প্লেয়াৰ ব্যৱহাৰ কৰক</string>\n    <string name=\"channel_unsubscribed\">Channel আনচাবস্ক্ৰাইব কৰা হ\\'ল</string>\n    <string name=\"subscription_change_failed\">subscription সলনি কৰিব পৰা নগ\\'ল</string>\n    <string name=\"subscription_update_failed\">subscription আপডেট কৰিব পৰা নগ\\'ল</string>\n    <string name=\"show_info\">তথ্য দেখুৱাওক</string>\n    <string name=\"tab_subscriptions\">চাবস্ক্ৰিপচন</string>\n    <string name=\"tab_bookmarks\">বুকমাৰ্ক কৰা প্লেলিষ্ট</string>\n    <string name=\"tab_choose\">টেব নিৰ্বাচন কৰক</string>\n    <string name=\"controls_background_title\">বেকগ্ৰাউণ্ড</string>\n    <string name=\"controls_popup_title\">পপ-আপ</string>\n    <string name=\"default_resolution_title\">স্থায়ী ৰিজ\\'লিউচন</string>\n    <string name=\"default_popup_resolution_title\">স্থায়ী পপআপ ৰিজোলিউচন</string>\n    <string name=\"show_higher_resolutions_title\">উচ্চ ৰিজ\\'লিউচন দেখুৱাওক</string>\n    <string name=\"show_higher_resolutions_summary\">কেৱল কিছুমান ডিভাইচেহে 2K/4K ভিডিঅ’ বজাব পাৰে</string>\n    <string name=\"play_with_kodi_title\">Kodi ৰ সৈতে বজাওক</string>\n    <string name=\"kore_not_found\">Kode এপ ইনষ্টল\\?</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi ৰ সৈতে খোলক\\\" বিকল্প দেখুৱাওক</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi মিডিয়া চেণ্টাৰৰ জৰিয়তে এটা ভিডিঅ\\' চলাবলৈ এটা বিকল্প প্ৰদৰ্শন কৰক</string>\n    <string name=\"crash_the_player\">প্লেয়াৰটো ক্ৰেচ কৰক</string>\n    <string name=\"notification_action_buffering\">বাফাৰিং</string>\n    <string name=\"notification_action_nothing\">নথিং</string>\n    <string name=\"notification_colorize_title\">জাননী ৰ‌ঙিণ কৰক</string>\n    <string name=\"play_audio\">অডিঅ\\'</string>\n    <string name=\"default_audio_format_title\">অডিঅ\\' ৰ প্ৰকাৰ</string>\n    <string name=\"default_video_format_title\">ভিডিঅ\\'ৰ প্ৰকাৰ</string>\n    <string name=\"theme_title\">থিম</string>\n    <string name=\"night_theme_title\">নিশাৰ থিম</string>\n    <string name=\"light_theme_title\">পোহৰ</string>\n    <string name=\"dark_theme_title\">অন্ধকাৰ</string>\n    <string name=\"black_theme_title\">ক\\'লা</string>\n    <string name=\"popup_remember_size_pos_title\">পপ-আপ বৈশিষ্ট্যসমূহ মনত ৰাখিব</string>\n    <string name=\"popup_remember_size_pos_summary\">পপ-আপৰ অন্তিম আকাৰ আৰু অৱস্থান মনত ৰাখিব</string>\n    <string name=\"use_inexact_seek_summary\">Inexact seek য়ে প্লেয়াৰটোক দ্ৰুত গতিত স্থান সলনি কৰিবলৈ অনুমতি দিয়ে। ৫, ১৫ বা ২৫ ছেকেণ্ড সলনি কৰিবলৈ বিচাৰিলে ইয়াৰ প্ৰয়োজন নহয়</string>\n    <string name=\"seek_duration_title\">ফাষ্ট-ফৰৱাৰ্ড/-ৰিৱাইণ্ড কৰিবলৈ বিচৰা সময়সীমা</string>\n    <string name=\"progressive_load_interval_title\">প্লেবেক লোড কৰাৰ ব্যৱধানৰ আকাৰ</string>\n    <string name=\"progressive_load_interval_summary\">লোড ব্যৱধানৰ আকাৰ সলনি কৰক (বৰ্তমানে %s) । এটা কম মানে প্ৰাৰম্ভিক ভিডিঅ\\' লোডিং দ্ৰুত কৰিব পাৰে। পৰিৱৰ্তনৰ বাবে এটা খেলুৱৈ পুনৰাৰম্ভৰ প্ৰয়োজন</string>\n    <string name=\"notification_colorize_summary\">থাম্বনেইলত থকা মূল ৰং অনুসৰি এণ্ড্ৰইডক জাননীৰ ৰং কাষ্টমাইজ কৰিবলৈ কওক (মন কৰিব যে এইটো সকলো ডিভাইচতে উপলব্ধ নহয়)</string>\n    <string name=\"clear_queue_confirmation_description\">সক্ৰিয় প্লেয়াৰৰ queue সলনি কৰা হ’ব</string>\n    <string name=\"show_comments_title\">মন্তব্য দেখুৱাওক</string>\n    <string name=\"show_description_title\">বিৱৰণ দেখুৱাওক</string>\n    <string name=\"show_meta_info_title\">মেটা তথ্য দেখুৱাওক</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">সংৰক্ষিত ছবি মচি পেলোৱা হ\\'ল</string>\n    <string name=\"metadata_cache_wipe_title\">সংৰক্ষিত কৰি থোৱা মেটাডাটা মচি পেলাওক</string>\n    <string name=\"metadata_cache_wipe_summary\">সকলো সংৰক্ষণ কৰি ৰখা ৱেবপেজৰ তথ্য আঁতৰাওক</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">সংৰক্ষণ কৰি থোৱা মেটাডাটা মচি পেলোৱা হ\\'ল</string>\n    <string name=\"auto_queue_title\">পৰৱৰ্তী ষ্ট্ৰিম স্বয়ংক্ৰিয়ভাৱে enque কৰক</string>\n    <string name=\"sort\">সজোৱা</string>\n    <string name=\"download_path_title\">ভিডিঅ\\' ডাউনলোড folder</string>\n    <string name=\"controls_add_to_playlist_title\">যোগ কৰক</string>\n    <string name=\"download_path_audio_summary\">ডাউনলোড কৰা অডিঅ\\' ফাইলসমূহ ইয়াত সংৰক্ষণ কৰা হয়</string>\n    <string name=\"notification_scale_to_square_image_title\">থাম্বনেইলক ১:১ অনুপাত লৈ ক্ৰপ কৰক</string>\n    <string name=\"download_path_summary\">ডাউনলোড কৰা ভিডিঅ’ ফাইলসমূহ ইয়াত সংৰক্ষণ কৰা হয়</string>\n    <string name=\"download_path_dialog_title\">ভিডিঅ\\' ফাইলসমূহৰ বাবে ডাউনলোড folder বাছক</string>\n    <string name=\"download_path_audio_title\">অডিঅ\\' ডাউনলোড folder</string>\n    <string name=\"download_path_audio_dialog_title\">অডিঅ\\' ফাইলসমূহৰ বাবে ডাউনলোড folder নিৰ্বাচন কৰক</string>\n    <string name=\"notification_scale_to_square_image_summary\">জাননীত দেখুওৱা ভিডিঅ’ থাম্বনেইলটো ১৬:৯ৰ পৰা ১:১ অনুপাতলৈ ক্ৰপ কৰক</string>\n    <string name=\"notification_action_0_title\">First action button</string>\n    <string name=\"notification_action_4_title\">Fifth action button</string>\n    <string name=\"notification_actions_summary\">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</string>\n    <string name=\"notification_action_1_title\">Second action button</string>\n    <string name=\"notification_actions_at_most_three\">You can select at most three actions to show in the compact notification!</string>\n    <string name=\"notification_action_repeat\">পুনৰাবৃত্তি</string>\n    <string name=\"notification_action_shuffle\">শ্বাফেল</string>\n    <string name=\"use_inexact_seek_title\">দ্ৰুত inexact seek ব্যৱহাৰ কৰক</string>\n    <string name=\"clear_queue_confirmation_title\">এটা queue বিলুপ্তি কৰাৰ আগতে নিশ্চিতকৰণৰ বাবে সুধিব</string>\n    <string name=\"clear_queue_confirmation_summary\">এটা প্লেয়াৰ পৰা আন এটালৈ সলনি কৰিলে আপোনাৰ queue সলনি হ\\'ব পাৰে</string>\n    <string name=\"notification_action_3_title\">Fourth action button</string>\n    <string name=\"notification_action_2_title\">Third action button</string>\n    <string name=\"show_description_summary\">ভিডিঅ\\'ৰ বিৱৰণ আৰু অতিৰিক্ত তথ্য লুকুৱাবলৈ বন্ধ কৰক</string>\n    <string name=\"show_comments_summary\">মন্তব্য লুকুৱাবলৈ বন্ধ কৰক</string>\n    <string name=\"show_next_and_similar_title\">\\'পৰৱৰ্তী\\' আৰু \\'সাদৃশ্য থকা\\' ভিডিঅ\\' দেখুৱাওক</string>\n    <string name=\"show_meta_info_summary\">ষ্ট্ৰিমৰ সৃষ্টিকৰ্তা, ষ্ট্ৰিমৰ বিষয়বস্তু বা এটা সন্ধান অনুৰোধৰ বিষয়ে অতিৰিক্ত তথ্যৰ সৈতে মেটা তথ্যৰ বাকচসমূহ লুকুৱাবলৈ বন্ধ কৰক</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ay/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "app/src/main/res/values-ayc/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Uka luparu ch’allt’aña qalltañataki.</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-az/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Başlamaq üçün böyüdücü lupaya toxun.</string>\n    <string name=\"upload_date_text\">%1$s tarixində yayımlanıb</string>\n    <string name=\"no_player_found\">Yayım oynadıcı tapılmadı. \\\"VLC\\\" quraşdırılsın\\?</string>\n    <string name=\"no_player_found_toast\">Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC quraşdıra bilərsiniz).</string>\n    <string name=\"install\">Quraşdır</string>\n    <string name=\"cancel\">Ləğv et</string>\n    <string name=\"open_in_browser\">Brauzerdə aç</string>\n    <string name=\"share\">Paylaş</string>\n    <string name=\"download\">Yüklə</string>\n    <string name=\"controls_download_desc\">Yayım faylın yüklə</string>\n    <string name=\"search\">Axtarış</string>\n    <string name=\"settings\">Tənzimləmələr</string>\n    <string name=\"did_you_mean\">\\\"%1$s\\\" nəzərdə tuturdunuz\\?</string>\n    <string name=\"share_dialog_title\">ilə paylaş</string>\n    <string name=\"use_external_video_player_title\">Xarici video oynadıcı istifadə et</string>\n    <string name=\"use_external_video_player_summary\">Bəzi formatlarda səsi silir</string>\n    <string name=\"use_external_audio_player_title\">Xarici səs oynadıcı istifadə et</string>\n    <string name=\"subscribe_button_title\">Abunə Ol</string>\n    <string name=\"subscribed_button_title\">Abunə olundu</string>\n    <string name=\"channel_unsubscribed\">Kanal abunəliyi ləğv edildi</string>\n    <string name=\"show_info\">Məlumat göstər</string>\n    <string name=\"tab_subscriptions\">Abunəliklər</string>\n    <string name=\"tab_bookmarks\">Əlfəcinlənmiş Pleylistlər</string>\n    <string name=\"fragment_feed_title\">Yeniliklər</string>\n    <string name=\"controls_background_title\">Fon</string>\n    <string name=\"download_path_title\">Video yükləmə qovluğu</string>\n    <string name=\"download_path_summary\">Yüklənilmiş video fayllar burada saxlanılır</string>\n    <string name=\"download_path_dialog_title\">Video fayllar üçün yükləmə qovluğu seç</string>\n    <string name=\"download_path_audio_title\">Səs yükləmə qovluğu</string>\n    <string name=\"download_path_audio_summary\">Yüklənilmiş səs faylları burada saxlanılır</string>\n    <string name=\"download_path_audio_dialog_title\">Səs faylları üçün yükləmə qovluğu seç</string>\n    <string name=\"default_resolution_title\">Standart format</string>\n    <string name=\"show_higher_resolutions_title\">Daha böyük formatlar göstər</string>\n    <string name=\"play_with_kodi_title\">\\\"Kodi\\\" ilə Oynat</string>\n    <string name=\"kore_not_found\">Çatışmayan \\\"Kore\\\" tətbiqi yüklənilsin\\?</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi ilə Oynat\\\" seçimini göstər</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi media mərkəzindən video oynatmaq üçün seçim göstər</string>\n    <string name=\"play_audio\">Səs</string>\n    <string name=\"default_audio_format_title\">Standart səs kodlayıcı</string>\n    <string name=\"default_video_format_title\">Standart video kodlayıcı</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"light_theme_title\">İşıqlı</string>\n    <string name=\"dark_theme_title\">Qaranlıq</string>\n    <string name=\"black_theme_title\">Qara</string>\n    <string name=\"unsubscribe\">Abunə olma</string>\n    <string name=\"open_in_popup_mode\">Ani görüntü rejimində aç</string>\n    <string name=\"autoplay_title\">Avtomatik oynat</string>\n    <string name=\"download_dialog_title\">Yüklə</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Fasilələr ardınca (məsələn, telefon zəngləri) oynatmağa davam etdir</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Oynatmanı davam etdir</string>\n    <string name=\"enable_watch_history_summary\">Baxılmış videoların saxlanılması</string>\n    <string name=\"settings_category_clear_data_title\">Məlumat təmizlə</string>\n    <string name=\"enable_playback_state_lists_summary\">Siyahılarda oynatma mövqe göstəricilərini göstər</string>\n    <string name=\"enable_playback_state_lists_title\">Siyahılardakı mövqelər</string>\n    <string name=\"enable_playback_resume_summary\">Son oynatma mövqeyini qaytar</string>\n    <string name=\"enable_playback_resume_title\">Oynatmanı davam etdir</string>\n    <string name=\"enable_watch_history_title\">Baxış tarixçəsi</string>\n    <string name=\"enable_search_history_summary\">Axtarış sorğularını yerli olaraq saxla</string>\n    <string name=\"enable_search_history_title\">Axtarış tarixçəsi</string>\n    <string name=\"show_search_suggestions_summary\">Axtarış zamanı göstərmək üçün təklifləri seç</string>\n    <string name=\"show_search_suggestions_title\">Axtarış təklifləri</string>\n    <string name=\"auto_queue_toggle\">Avto-növbələ</string>\n    <string name=\"auto_queue_title\">Növbəti Yayımı Avto-növbələ</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Üst məlumat qalığı silindi</string>\n    <string name=\"metadata_cache_wipe_summary\">Toplanmış bütün veb-səhifə məlumatlarını sil</string>\n    <string name=\"metadata_cache_wipe_title\">Toplanmış üst məlumatı təmizlə</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Şəkil qalığı silindi</string>\n    <string name=\"show_comments_summary\">Şərhləri gizlətmək üçün bağla</string>\n    <string name=\"show_comments_title\">Şərhləri göstər</string>\n    <string name=\"clear_queue_confirmation_description\">Aktiv oynadıcı növbəsi dəyişdiriləcək</string>\n    <string name=\"clear_queue_confirmation_summary\">Bir oynadıcıdan digərinə keçid növbənizi dəyişdirə bilər</string>\n    <string name=\"clear_queue_confirmation_title\">Növbəni təmizləməzdən əvvəl təsdiq üçün soruş</string>\n    <string name=\"use_inexact_seek_title\">Sürətli, qeyri-dəqiq axtarış istifadə et</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"seek_duration_title\">Sürətli irəli/geri çəkmə axtarış müddəti</string>\n    <string name=\"notification_action_nothing\">Heç nə</string>\n    <string name=\"notification_action_buffering\">Buferlənir</string>\n    <string name=\"notification_action_shuffle\">Qarışdır</string>\n    <string name=\"notification_action_repeat\">Təkrarla</string>\n    <string name=\"notification_action_4_title\">Beşinci fəaliyyət düyməsi</string>\n    <string name=\"notification_action_3_title\">Dördüncü fəaliyyət düyməsi</string>\n    <string name=\"notification_action_2_title\">Üçüncü fəaliyyət düyməsi</string>\n    <string name=\"notification_action_1_title\">İkinci fəaliyyət düyməsi</string>\n    <string name=\"notification_action_0_title\">Birinci fəaliyyət düyməsi</string>\n    <string name=\"show_higher_resolutions_summary\">Yalnız bəzi cihazlar 2K/4K videoları oynada bilir</string>\n    <string name=\"default_popup_resolution_title\">Standart ani görüntü formatı</string>\n    <string name=\"controls_add_to_playlist_title\">Əlavə Et</string>\n    <string name=\"controls_popup_title\">Ani Görüntü</string>\n    <string name=\"tab_choose\">Paneli Seç</string>\n    <string name=\"subscription_update_failed\">Abunəliyi yeniləmək alınmadı</string>\n    <string name=\"subscription_change_failed\">Abunəliyi dəyişmək alınmadı</string>\n    <string name=\"search_showing_result_for\">%s üçün nəticələr göstərilir</string>\n    <string name=\"channels\">Kanallar</string>\n    <string name=\"video_detail_by\">%s tərəfindən</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTube\\'un \\\"Məhdud Rejimi\\\"ni aç</string>\n    <string name=\"show_age_restricted_content_summary\">Yaş həddi səbəbiylə (18+ kimi) uşaqlar üçün uyğun olmayan məzmunu göstər</string>\n    <string name=\"show_age_restricted_content_title\">Yaş məhdudiyyətli məzmunu göstər</string>\n    <string name=\"content\">Məzmun</string>\n    <string name=\"popup_playing_toast\">Ani görüntü rejimində oynadılır</string>\n    <string name=\"background_player_playing_toast\">Fonda oynadılır</string>\n    <string name=\"settings_category_updates_title\">Yeniləmələr</string>\n    <string name=\"settings_category_debug_title\">Sazlama</string>\n    <string name=\"settings_category_appearance_title\">Görünüş</string>\n    <string name=\"settings_category_history_title\">Tarixçə və qalıq</string>\n    <string name=\"settings_category_video_audio_title\">Video və səs</string>\n    <string name=\"settings_category_player_behavior_title\">Davranış</string>\n    <string name=\"settings_category_player_title\">Oynadıcı</string>\n    <string name=\"content_language_title\">Cari məzmun dili</string>\n    <string name=\"default_content_country_title\">Cari məzmun ölkəsi</string>\n    <string name=\"unsupported_url_dialog_message\">URL\\'i tanımaq olmadı. Başqa tətbiqlə açılsın\\?</string>\n    <string name=\"unsupported_url\">Dəstəklənməyən URL\\'i</string>\n    <string name=\"show_hold_to_append_title\">\\\"Növbələmək üçün basılı saxla\\\" tövsiyəsin göstər</string>\n    <string name=\"show_next_and_similar_title\">\\\"Növbəti\\\" və \\\"Oxşar\\\" videoları göstər</string>\n    <string name=\"export_data_summary\">Tarixçəni, abunəlikləri, pleylistləri və tənzimləmələri ixrac et</string>\n    <string name=\"import_data_summary\">Cari tarixçənizi, abunəliklərinizi, pleylistlərinizi və (könüllü) tənzimləmələrinizi etibarsız edir</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA bazaları təmizləndi</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA bazalarını təmizlə</string>\n    <string name=\"export_data_title\">Məlumat bazasını ixrac et</string>\n    <string name=\"import_data_title\">Məlumat bazasını idxal et</string>\n    <string name=\"switch_to_main\">Əsas Görünüşə Keçid</string>\n    <string name=\"switch_to_popup\">Ani Görüntüyə Keçid</string>\n    <string name=\"switch_to_background\">Fona Keçid</string>\n    <string name=\"unknown_content\">[Naməlum]</string>\n    <string name=\"app_update_notification_channel_description\">Yeni \\\"NewPipe\\\" versiyaları üçün bildirişlər</string>\n    <string name=\"app_update_notification_channel_name\">Tətbiq yeniləmə bildirişi</string>\n    <string name=\"notification_channel_description\">NewPipe oynadıcısı üçün bildirişlər</string>\n    <string name=\"all\">Hamısı</string>\n    <string name=\"error_report_title\">Xəta hesabatı</string>\n    <string name=\"downloads_title\">Endirilənlər</string>\n    <string name=\"downloads\">Endirilənlər</string>\n    <string name=\"duration_live\">Canlı</string>\n    <string name=\"restricted_video\">Bu video yaş məhdudiyyətlidir.\n\\n\n\\nOnu görmək istəyirsinizsə, tənzimləmələrdə \\\"%1$s\\\" seçimini aktivləşdirin.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube potensial yetkin məzmunu gizlədən \\\"Məhdud Rejim\\\" təmin edir</string>\n    <string name=\"peertube_instance_url_title\">\\\"PeerTube\\\" serverləri</string>\n    <string name=\"notification_actions_at_most_three\">Yığcam bildirişdə göstərmək üçün ən çoxu üç fəaliyyət seçə bilərsiniz!</string>\n    <string name=\"feed_update_threshold_option_always_update\">Həmişə yenilə</string>\n    <string name=\"settings_category_feed_title\">Axın</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Yalnız qrupsuz abunəlikləri göstər</string>\n    <string name=\"feed_create_new_group_button_title\">Yeni</string>\n    <string name=\"feed_group_dialog_delete_message\">Bu qrupu silmək istəyirsiniz\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Boş qrup adı</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d seçildi</item>\n        <item quantity=\"other\">%d seçildi</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Abunəlik seçilməyib</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Abunəlikləri seç</string>\n    <string name=\"feed_processing_message\">Axın emal edilir…</string>\n    <string name=\"feed_notification_loading\">Axın yüklənir…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Yüklənmədi: %d</string>\n    <string name=\"playlist_page_summary\">Pleylist səhifəsi</string>\n    <string name=\"notification_channel_name\">\\\"Newpipe\\\" bildirişi</string>\n    <string name=\"file\">Fayl</string>\n    <string name=\"just_once\">Yalnız Bir Dəfə</string>\n    <string name=\"always\">Həmişə</string>\n    <string name=\"play_all\">Hamısını Oynat</string>\n    <string name=\"file_deleted\">Fayl silindi</string>\n    <string name=\"undo\">Geri qaytar</string>\n    <string name=\"best_resolution\">Ən yaxşı keyfiyyət</string>\n    <string name=\"clear\">Təmizlə</string>\n    <string name=\"disabled\">Qeyri-aktivdir</string>\n    <string name=\"artists\">Sənətkarlar</string>\n    <string name=\"albums\">Albomlar</string>\n    <string name=\"songs\">Mahnılar</string>\n    <string name=\"events\">Hadisələr</string>\n    <string name=\"users\">İstifadəçilər</string>\n    <string name=\"tracks\">Treklər</string>\n    <string name=\"videos_string\">Videolar</string>\n    <string name=\"playlists\">Pleylistlər</string>\n    <string name=\"general_error\">Xəta</string>\n    <string name=\"search_history_deleted\">Axtarış tarixçəsi silindi</string>\n    <string name=\"delete_search_history_alert\">Bütün axtarış tarixçəsi silinsin\\?</string>\n    <string name=\"clear_search_history_summary\">Açar sözlər axtarışı tarixçəsin silir</string>\n    <string name=\"clear_search_history_title\">Axtarış tarixçəsini sil</string>\n    <string name=\"watch_history_states_deleted\">Oynatma mövqeləri silindi</string>\n    <string name=\"delete_playback_states_alert\">Bütün oynatma mövqeləri silinsin\\?</string>\n    <string name=\"clear_playback_states_summary\">Bütün oynatma mövqelərini silir</string>\n    <string name=\"clear_playback_states_title\">Oynatma mövqelərini sil</string>\n    <string name=\"watch_history_deleted\">Baxış tarixçəsi silindi</string>\n    <string name=\"delete_view_history_alert\">Bütün baxış tarixçəsi silinsin\\?</string>\n    <string name=\"clear_views_history_title\">Baxış tarixçəsini təmizlə</string>\n    <string name=\"clear_cookie_summary\">reCAPTCHA həll edərkən NewPipe saxladığı bazaları sil</string>\n    <string name=\"channel_created_by\">%s tərəfindən yaradıldı</string>\n    <string name=\"resize_zoom\">Yaxınlaşdır</string>\n    <string name=\"resize_fill\">Doldur</string>\n    <string name=\"resize_fit\">Uyğunlaşdır</string>\n    <string name=\"caption_none\">Titrlər Yoxdur</string>\n    <string name=\"delete\">Sil</string>\n    <string name=\"no_channel_subscribed_yet\">Hələ ki, kanal abunəliyi yoxdur</string>\n    <string name=\"select_a_channel\">Kanal seç</string>\n    <string name=\"channel_page_summary\">Kanal səhifəsi</string>\n    <string name=\"default_kiosk_page_summary\">Standart Bölmə</string>\n    <string name=\"kiosk_page_summary\">Kənar səhifə</string>\n    <string name=\"blank_page_summary\">Boş səhifə</string>\n    <string name=\"main_page_content_summary\">Əsas səhifədə hansı tablar göstərilir</string>\n    <string name=\"main_page_content\">Əsas səhifə məzmunu</string>\n    <string name=\"updates_setting_description\">Yeni versiya mövcud olduqda tətbiq yeniləməsini xatırlatmaq üçün bildiriş göstər</string>\n    <string name=\"updates_setting_title\">Yeniləmələr</string>\n    <string name=\"limit_mobile_data_usage_title\">Mobil internet istifadə edərkən ayırdetməni məhdudlaşdır</string>\n    <string name=\"limit_data_usage_none_description\">Limitsiz</string>\n    <string name=\"one_item_deleted\">1 element silindi.</string>\n    <string name=\"peertube_instance_add_title\">Server əlavə et</string>\n    <string name=\"peertube_instance_url_summary\">Sevimli \\\"PeerTube\\\" serverlərinizi seçin</string>\n    <string name=\"delete_downloaded_files\">Endirilmiş faylları sil</string>\n    <string name=\"confirm_prompt\">Endirmə tarixçənizi təmizləmək və ya bütün endirilmiş faylları silmək istəyirsiniz\\?</string>\n    <string name=\"clear_download_history\">Endirmə tarixçəsini təmizlə</string>\n    <string name=\"start_downloads\">Endirmələri başlat</string>\n    <string name=\"pause_downloads\">Endirmələri dayandır</string>\n    <string name=\"downloads_storage_ask_title\">Haraya endiriləcəyini soruş</string>\n    <string name=\"downloads_storage_ask_summary\">Sizdən hər endirmənin harada saxlanılacağı soruşulacaq.\n\\nXarici SD karta endirmək istəyirsinizsə, sistem qovluğu seçicisini (SAF) aktiv edin</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Yaddaş Giriş Quruluşu\\' xarici SD karta endirməyə imkan verir</string>\n    <string name=\"systems_language\">Sistem standartı</string>\n    <string name=\"app_language_title\">Tətbiq dili</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d gün</item>\n        <item quantity=\"other\">%d gün</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d saat</item>\n        <item quantity=\"other\">%d saat</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d dəqiqə</item>\n        <item quantity=\"other\">%d dəqiqə</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d saniyə</item>\n        <item quantity=\"other\">%d saniyə</item>\n    </plurals>\n    <string name=\"feed_oldest_subscription_update\">Axın sonuncu dəfə yeniləndi: %s</string>\n    <string name=\"feed_update_threshold_title\">Axın yeniləmə aralığı</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Sürətli rejimi aktivləşdir</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Sürətli rejimi bağla</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">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.</string>\n    <string name=\"player_stream_failure\">Bu yayımı oynatmaq alınmadı</string>\n    <string name=\"app_ui_crash\">Tətbiq/UI çökdü</string>\n    <string name=\"could_not_setup_download_menu\">Endirmə menyusunu qurmaq mümkün olmadı</string>\n    <string name=\"content_not_available\">Məzmun əlçatmazdır</string>\n    <string name=\"could_not_load_thumbnails\">Bütün miniatürləri yükləmək alınmadı</string>\n    <string name=\"network_error\">Şəbəkə səhvi</string>\n    <string name=\"download_to_sdcard_error_message\">Xarici SD karta endirmək mümkün deyil. Endirmə qovluğunun yeri sıfırlansın\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Xarici yaddaş əlçatan deyil</string>\n    <string name=\"clear_views_history_summary\">Oynadılmış yayımlar tarixçəsini və oynatma mövqelərini silir</string>\n    <string name=\"show_meta_info_title\">Üst məlumatı göstər</string>\n    <string name=\"show_description_summary\">Video açıqlamanı və əlavə məlumatı gizlətmək üçün bağla</string>\n    <string name=\"show_description_title\">Açıqlamanı göstər</string>\n    <string name=\"notification_colorize_title\">Bildirişi rənglə</string>\n    <string name=\"invalid_directory\">Belə qovluq yoxdur</string>\n    <string name=\"start_main_player_fullscreen_title\">Əsas oynadıcını tam ekranda başlat</string>\n    <string name=\"external_player_unsupported_link_type\">Xarici oynadıcılar bu növ linkləri dəstəkləmir</string>\n    <string name=\"local_search_suggestions\">Yerli axtarış təklifləri</string>\n    <string name=\"video\">Video</string>\n    <string name=\"related_items_tab_description\">Əlaqəli elementlər</string>\n    <string name=\"mark_as_watched\">Baxılmış kimi işarələ</string>\n    <string name=\"open_with\">ilə aç</string>\n    <string name=\"night_theme_title\">Gecə teması</string>\n    <string name=\"popup_remember_size_pos_title\">Ani pəncərə xüsusiyyətlərini xatırla</string>\n    <string name=\"popup_remember_size_pos_summary\">Ani pəncərənin son ölçüsü və mövqeyini xatırla</string>\n    <string name=\"video_streams_empty\">Video yayımı tapılmadı</string>\n    <string name=\"comments_tab_description\">Şərhlər</string>\n    <string name=\"description_tab_description\">Açıqlama</string>\n    <string name=\"empty_list_subtitle\">Burada sisəylərdən başqa heç nə yoxdur</string>\n    <string name=\"search_no_results\">Nəticə yoxdur</string>\n    <string name=\"restore_defaults\">Standartları qaytar</string>\n    <string name=\"missing_file\">Fayl köçürüldü və ya silindi</string>\n    <string name=\"player_recoverable_failure\">Oynadıcı xətası bərpa edilir</string>\n    <string name=\"player_unrecoverable_failure\">Bərpa olunmayan oynatma xətası baş verdi</string>\n    <string name=\"ok\">Oldu</string>\n    <string name=\"restricted_video_no_stream\">Bu video yaş məhdudiyyətlidir.\n\\nYaş məhdudiyyəti olan videolarla bağlı yeni YouTube siyasətlərinə görə, NewPipe bu cür video yayımlara daxil ola və oynada bilməz.</string>\n    <string name=\"audio_streams_empty\">Səs yayımı tapılmadı</string>\n    <string name=\"permission_display_over_apps\">Digər tətbiqlərin üzərində göstərməyə icazə ver</string>\n    <string name=\"restore_defaults_confirmation\">İlkin tənzimləmələri qaytarmaq istəyirsiniz\\?</string>\n    <string name=\"enqueue_next_stream\">Növbəti sıraya sal</string>\n    <string name=\"retry\">Təkrar Cəhd Et</string>\n    <string name=\"settings_category_player_notification_summary\">Cari oynatma yayımı bildirişini konfiqurasiya et</string>\n    <string name=\"notifications\">Bildirişlər</string>\n    <string name=\"hash_channel_name\">Video fayl xülasəsi bildirişi</string>\n    <string name=\"streams_notification_channel_description\">Abunəliklər üçün yeni yayımlar haqqında bildirişlər</string>\n    <string name=\"error_report_channel_description\">Xəta hesabatları üçün bildirişlər</string>\n    <string name=\"file_name_empty_error\">Fayl adı boş ola bilməz</string>\n    <string name=\"saved_tabs_invalid_json\">Saxlanmış səhifələri oxumaq alınmadı, ona görə standart səhifələr istifadə et</string>\n    <string name=\"error_report_notification_title\">NewPipe xəta ilə qarşılaşdı, bildirmək üçün toxun</string>\n    <string name=\"sorry_string\">Bağışla, bu baş verməməli idi.</string>\n    <string name=\"error_report_button_text\">E-poçt- dan məlumat ver</string>\n    <string name=\"error_report_open_issue_button_text\">GitHub\\'da Məlumat Ver</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_snackbar_action\">Məlumat Ver</string>\n    <string name=\"what_device_headline\">Məlumat:</string>\n    <string name=\"what_happened_headline\">Nə baş verdi:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Yükləyənin avatar miniatürü</string>\n    <string name=\"detail_likes_img_view_description\">Bəyən</string>\n    <string name=\"detail_dislikes_img_view_description\">Bəyənməmə</string>\n    <string name=\"detail_drag_description\">Yenidən sıralamaq üçün sürüklə</string>\n    <string name=\"drawer_header_description\">Xidməti dəyiş, hazırda seçilmiş:</string>\n    <string name=\"no_subscribers\">Abunəçi yoxdur</string>\n    <string name=\"no_views\">Baxış yoxdur</string>\n    <string name=\"no_one_watching\">Heç kim izləmir</string>\n    <string name=\"no_one_listening\">Heç kim dinləmir</string>\n    <string name=\"no_videos\">Video yoxdur</string>\n    <string name=\"comments_are_disabled\">Şərhlər qeyri-aktivdir</string>\n    <string name=\"start\">Başlat</string>\n    <string name=\"pause\">Dayandır</string>\n    <string name=\"checksum\">Təsdiqləmə</string>\n    <string name=\"dismiss\">İmtina</string>\n    <string name=\"msg_error\">Xəta</string>\n    <string name=\"msg_running_detail\">Detallar üçün toxun</string>\n    <string name=\"msg_wait\">Zəhmət olmasa, gözləyin…</string>\n    <string name=\"no_dir_yet\">Hələ endirmə qovluğu təyin edilməyib, indi standart endirmə qovluğu seç</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA çağırışı</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA sorğusu göndərildi</string>\n    <string name=\"done\">Bitdi</string>\n    <string name=\"settings_file_replacement_character_summary\">Etibarsız simvollar bu dəyərlə əvəz olunur</string>\n    <string name=\"settings_file_replacement_character_title\">Əvəzedici simvol</string>\n    <string name=\"charset_most_special_characters\">Ən xüsusi simvollar</string>\n    <string name=\"title_licenses\">Üçüncü Tərəf Lisenziyaları</string>\n    <string name=\"tab_about\">Haqqında &amp; T-TSS</string>\n    <string name=\"contribution_title\">Töhfə Ver</string>\n    <string name=\"contribution_encouragement\">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!</string>\n    <string name=\"give_back\">İanə Et</string>\n    <string name=\"website_title\">Veb sayt</string>\n    <string name=\"website_encouragement\">Əlavə məlumat və xəbərlər üçün NewPipe Veb saytını ziyarət et.</string>\n    <string name=\"privacy_policy_title\">NewPipe Məxfilik Siyasəti</string>\n    <string name=\"privacy_policy_encouragement\">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.\n\\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.</string>\n    <string name=\"read_privacy_policy\">Məxfilik Siyasətini Oxu</string>\n    <string name=\"app_license_title\">NewPipe Lisenziyası</string>\n    <string name=\"action_history\">Tarixçə</string>\n    <string name=\"delete_item_search_history\">Bu elementi axtarış tarixçəsindən silmək istəyirsiniz\\?</string>\n    <string name=\"title_last_played\">Son Oynadılan</string>\n    <string name=\"title_most_played\">Ən Çox Oynadılan</string>\n    <string name=\"select_a_kiosk\">Bölmə seç</string>\n    <string name=\"import_complete_toast\">İdxal edildi</string>\n    <string name=\"no_valid_zip_file\">Etibarlı ZIP faylı yoxdur</string>\n    <string name=\"could_not_import_all_files\">Xəbərdarlıq: Bütün faylları idxal etmək mümkün olmadı.</string>\n    <string name=\"import_settings\">Tənzimləmələri də idxal etmək istəyirsiniz\\?</string>\n    <string name=\"top_50\">Ən yaxşı 50</string>\n    <string name=\"new_and_hot\">Yeni və populyar</string>\n    <string name=\"local\">Yerli</string>\n    <string name=\"recently_added\">Son əlavə edilən</string>\n    <string name=\"conferences\">Konfranslar</string>\n    <string name=\"title_activity_play_queue\">Oynatma növbəsi</string>\n    <string name=\"play_queue_stream_detail\">Detallar</string>\n    <string name=\"show_channel_details\">Kanal təfərrüatlarını göstər</string>\n    <string name=\"start_here_on_popup\">Ani görüntüdə oynatmağa başla</string>\n    <string name=\"preferred_open_action_settings_title\">\\\"Açıq\\\" fəaliyyətə üstünlük verilir</string>\n    <string name=\"background_player\">Fon oynadıcı</string>\n    <string name=\"always_ask_open_action\">Həmişə soruş</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Tələb olunan məzmun yüklənir</string>\n    <string name=\"create_playlist\">Yeni Pleylist</string>\n    <string name=\"rename_playlist\">Adını dəyişdir</string>\n    <string name=\"add_to_playlist\">Pleylistə əlavə et</string>\n    <string name=\"processing_may_take_a_moment\">Emal edilir... Bir az vaxt ala bilər</string>\n    <string name=\"unmute\">Səsi aç</string>\n    <string name=\"bookmark_playlist\">Pleylisti Əlfəcinlə</string>\n    <string name=\"unbookmark_playlist\">Əlfəcini Silin</string>\n    <string name=\"delete_playlist_prompt\">Bu pleylist silinsin\\?</string>\n    <string name=\"playlist_creation_success\">Pleylist yaradıldı</string>\n    <string name=\"playlist_thumbnail_change_success\">Pleylist miniatürü dəyişdirildi.</string>\n    <string name=\"playlist_no_uploader\">Avtomatik yaradıldı (heç bir yükləyici tapılmadı)</string>\n    <string name=\"caption_auto_generated\">Avtomatik yaradıldı</string>\n    <string name=\"caption_setting_title\">Titrlər</string>\n    <string name=\"leak_canary_not_available\">LeakCanary yoxdur</string>\n    <string name=\"enable_leak_canary_summary\">Yaddaş sızma monitorinqi yığın boşaltma zamanı tətbiqin cavab verməməsinə səbəb ola bilər</string>\n    <string name=\"show_memory_leaks\">Yaddaş sızmalarını göstər</string>\n    <string name=\"enable_disposed_exceptions_summary\">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</string>\n    <string name=\"show_original_time_ago_summary\">Xidmətlərdən alınmış orijinal mətnlər yayım elementlərində görünəcək</string>\n    <string name=\"check_new_streams\">Yeni yayımları yoxlamanı işə sal</string>\n    <string name=\"import_soundcloud_instructions\">URL və ya ID\\'nizi daxil etməklə SoundCloud profilini idxal edin:\n\\n\n\\n1. Veb-brauzerdə \\\"iş masası rejimini\\\" aktiv edin (sayt mobil cihazlar üçün mövcud deyil)\n\\n2. Bu URL\\'ə keçin: %1$s\n\\n3. Soruşulduqda daxil olun\n\\n4. Yönləndirildiyiniz profilin URL\\'sini kopyalayın.</string>\n    <string name=\"import_soundcloud_instructions_hint\">ID\\'niz, soundcloud.com/ID\\'niz</string>\n    <string name=\"import_network_expensive_warning\">Unutmayın ki, bu əməliyyat şəbəkəyə ağır yük ola bilər.\n\\n\n\\nDavam etmək istəyirsiniz\\?</string>\n    <string name=\"skip_silence_checkbox\">Səssizlik zamanı sürətlə irəli</string>\n    <string name=\"enable_streams_notifications_title\">Yeni yayım bildirişləri</string>\n    <string name=\"enable_streams_notifications_summary\">Abunəliklərdən yeni yayımlar haqqında bildir</string>\n    <string name=\"streams_notifications_interval_title\">Yoxlama tezliyi</string>\n    <string name=\"streams_notifications_network_title\">Tələb olunan şəbəkə bağlantısı</string>\n    <string name=\"any_network\">İstənilən şəbəkə</string>\n    <string name=\"minimize_on_exit_title\">Tətbiq keçidində kiçilt</string>\n    <string name=\"minimize_on_exit_background_description\">Fon oynadıcısına kiçilt</string>\n    <string name=\"minimize_on_exit_popup_description\">Ani-pəncərə oynadıcısına kiçilt</string>\n    <string name=\"autoplay_summary\">Oynatmanı avtomatik başlat — %s</string>\n    <string name=\"low_quality_smaller\">Aşağı keyfiyyət (daha kiçik)</string>\n    <string name=\"dont_show\">Göstərmə</string>\n    <string name=\"download_failed\">Endirmə uğursuz oldu</string>\n    <string name=\"error_http_unsupported_range\">Server çox iş parçalı endirmələri qəbul etmir, @string/msg_threads = 1 ilə yenidən cəhd edin</string>\n    <string name=\"delete_downloaded_files_confirm\">Bütün endirilmiş fayllar diskdən silinsin\\?</string>\n    <string name=\"max_retry_msg\">Maksimum təkrar cəhdlər</string>\n    <string name=\"remove_watched_popup_warning\">Pleylistə əlavə olunandan əvvəl və sonrakı baxılan yayımlar silinəcək. \\nSiz əminsiniz?</string>\n    <string name=\"feed_groups_header_title\">Kanal qrupları</string>\n    <string name=\"feed_new_items\">Yeni axın elementləri</string>\n    <string name=\"feed_update_threshold_summary\">Abunəlik köhnəlmiş hesab edilənə qədərki son yeniləmədən sonrakı vaxt — %s</string>\n    <string name=\"feed_load_error\">Axın yükləmə xətası</string>\n    <string name=\"content_not_supported\">Bu məzmun hələ NewPipe tərəfindən dəstəklənmir.\n\\n \n\\nÜmid edirik ki, gələcək versiyada dəstəklənəcək.</string>\n    <string name=\"show_thumbnail_summary\">Həm kilid ekranı fonu, həm də bildirişlər üçün miniatür istifadə et</string>\n    <string name=\"recent\">Ən Yeni</string>\n    <string name=\"georestricted_content\">Bu məzmun ölkənizdə mövcud deyil.</string>\n    <string name=\"paid_content\">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.</string>\n    <string name=\"auto_device_theme_title\">Avtomatik (cihaz teması)</string>\n    <string name=\"night_theme_summary\">Sevimli gecə temanızı seçin — %s</string>\n    <string name=\"detail_pinned_comment_view_description\">Sancaqlanmış şərh</string>\n    <string name=\"notifications_disabled\">Bildirişlər qeyri-aktivdir</string>\n    <string name=\"get_notified\">Bildiriş al</string>\n    <string name=\"you_successfully_subscribed\">Artıq bu kanala abunə oldunuz</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Hamısın dəyişdir</string>\n    <string name=\"msg_name\">Fayl adı</string>\n    <string name=\"recaptcha_solve\">Həll et</string>\n    <string name=\"subscriptions_export_unsuccessful\">Abunəlikləri ixrac etmək mümkün olmadı</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s baxıcı</item>\n        <item quantity=\"other\">%s baxıcı</item>\n    </plurals>\n    <string name=\"manual_update_description\">Yeni versiyaları əl ilə yoxla</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s dinləyici</item>\n        <item quantity=\"other\">%s dinləyici</item>\n    </plurals>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">%s video</item>\n    </plurals>\n    <string name=\"check_for_updates\">Yeniləmələri yoxla</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Axtarış çubuğunun miniatür önizləməsi</string>\n    <string name=\"permission_denied\">Əməliyyat sistem tərəfindən ləğv edildi</string>\n    <string name=\"auto\">Avto</string>\n    <string name=\"error_http_not_found\">Tapılmadı</string>\n    <string name=\"error_http_no_content\">Server məlumat göndərmir</string>\n    <string name=\"error_download_resource_gone\">Bu endirməni bərpa etmək mümkün deyil</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Sizdən hər endirmənin harada saxlanılacağı soruşulacaq</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">\\\"Yaddaş Giriş Quruluşu\\\"yalnız Android 10\\'dan başlayaraq dəstəklənir</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanalın avatar miniatürü</string>\n    <string name=\"select_night_theme_toast\">Sevdiyiniz gecə temasını aşağıda seçə bilərsiniz</string>\n    <string name=\"notification_colorize_summary\">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)</string>\n    <string name=\"view_on_github\">GitHub\\'da Bax</string>\n    <string name=\"donation_title\">İanə Et</string>\n    <string name=\"donation_encouragement\">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.</string>\n    <string name=\"most_liked\">Ən çox bəyənildi</string>\n    <string name=\"enqueued\">Növbəyə salındı</string>\n    <string name=\"preferred_open_action_settings_summary\">Məzmunu açarkən standart hərəkət — %s</string>\n    <string name=\"name\">Ad</string>\n    <string name=\"set_as_playlist_thumbnail\">Pleylist miniatürü kimi təyin et</string>\n    <string name=\"wifi_only\">Yalnız Wi-Fi\\'da</string>\n    <string name=\"never\">Heç vaxt</string>\n    <string name=\"list_view_mode\">Siyahı görünüş rejimi</string>\n    <string name=\"list\">Siyahı</string>\n    <string name=\"grid\">Şəbəkə</string>\n    <string name=\"high_quality_larger\">Yüksək keyfiyyət (daha böyük)</string>\n    <string name=\"missions_header_pending\">Gözlənilən</string>\n    <string name=\"queued\">növbədədir</string>\n    <string name=\"post_processing\">sonrakı emal olunur</string>\n    <string name=\"checking_updates_toast\">Yeniləmələr yoxlanılır…</string>\n    <string name=\"app_update_available_notification_title\">NewPipe yeniləməsi mövcuddur!</string>\n    <string name=\"metadata_licence\">Lisenziya</string>\n    <string name=\"feed_load_error_terminated\">Müəllifin hesabı bağlanıb.\n\\nNewPipe gələcəkdə bu axını yükləyə bilməyəcək.\n\\nBu kanaldan abunəliyi çıxarmaq istəyirsiniz\\?</string>\n    <string name=\"featured\">Seçilən</string>\n    <string name=\"drawer_close\">Çəkməcəni Bağla</string>\n    <string name=\"video_player\">Video oynadıcı</string>\n    <string name=\"hash_channel_description\">Video fayl xülasəsi prosesi üçün bildirişlər</string>\n    <string name=\"on\">Aç</string>\n    <string name=\"notification_scale_to_square_image_title\">Miniatürü 1:1 görünüş nisbətinə kəs</string>\n    <string name=\"show_meta_info_summary\">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</string>\n    <string name=\"auto_queue_summary\">Əlaqəli yayımı əlavə etməklə (təkrarlanmayan) sonlanacaq oynatma növbəsini davam etdir</string>\n    <string name=\"remote_search_suggestions\">Kənar axtarış təklifləri</string>\n    <string name=\"peertube_instance_add_exists\">Server artıq mövcuddur</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"more_than_100_videos\">100+ video</string>\n    <string name=\"infinite_videos\">∞ video</string>\n    <string name=\"no_comments\">Şərhlər yoxdur</string>\n    <string name=\"subtitle_activity_recaptcha\">Həll edildikdə \\\"Bitdi\\\" düyməsini bas</string>\n    <string name=\"select_a_playlist\">Pleylist seç</string>\n    <string name=\"error_unable_to_load_comments\">Şərhləri yükləmək mümkün olmadı</string>\n    <string name=\"trending\">Trenddə olan</string>\n    <string name=\"play_queue_audio_settings\">Səs Tənzimləmələri</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Məlumat əldə edilir…</string>\n    <string name=\"show_original_time_ago_title\">Elementlərdə orijinal, əvvəlki vaxtı göstər</string>\n    <string name=\"enable_disposed_exceptions_title\">Yaşam dövrəsi xaricindəki xətaları bildir</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Bəzi endirmələri dayandırmaq mümkün olmasa da, mobil dataya keçərkən faydalıdır</string>\n    <string name=\"close\">Bağla</string>\n    <string name=\"error_progress_lost\">Fayl silindiyi üçün irəliləyiş itirildi</string>\n    <string name=\"max_retry_desc\">Endirməni ləğv etməzdən əvvəl ümumi cəhdlərin sayı</string>\n    <string name=\"pause_downloads_on_mobile\">Ölçülmüş şəbəkələrdə dayandır</string>\n    <string name=\"enable_queue_limit\">Endirmə növbəsini məhdudlaşdır</string>\n    <string name=\"enable_queue_limit_desc\">Eyni vaxtda ancaq bir endirmə həyata keçiriləcək</string>\n    <string name=\"account_terminated\">Hesab ləğv edildi</string>\n    <string name=\"download_has_started\">Yükləmə başladı</string>\n    <string name=\"description_select_disable\">Açıqlamadakı mətni seçməyi qeyri-aktiv et</string>\n    <string name=\"metadata_category\">Kateqoriya</string>\n    <string name=\"metadata_privacy_internal\">Daxili</string>\n    <string name=\"description_select_enable\">Açıqlamadakı mətni seçməyi aktivləşdir</string>\n    <string name=\"metadata_tags\">Etiketlər</string>\n    <string name=\"tablet_mode_title\">Planşet rejimi</string>\n    <string name=\"off\">Bağla</string>\n    <string name=\"detail_heart_img_view_description\">Müəllifdən ürəkləndi</string>\n    <string name=\"open_website_license\">Veb saytı aç</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s baxış</item>\n        <item quantity=\"other\">%s baxış</item>\n    </plurals>\n    <string name=\"playback_step\">Addım</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s yeni yayım</item>\n        <item quantity=\"other\">%s yeni yayım</item>\n    </plurals>\n    <string name=\"playback_reset\">Sıfırla</string>\n    <string name=\"percent\">Faiz</string>\n    <string name=\"semitone\">Yarımton</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Endirmə tamamlandı</item>\n        <item quantity=\"other\">%s endirmə tamamlandı</item>\n    </plurals>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer standartı</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Mövcud olduqda xüsusi axından al</string>\n    <string name=\"remove_watched_popup_title\">Baxılan yayımlar silinsin?</string>\n    <string name=\"remove_watched\">İzləniləni sil</string>\n    <string name=\"downloads_storage_use_saf_title\">Sistem qovluğu seçicisini (SAF) istifadə et</string>\n    <string name=\"error_timeout\">Bağlantı fasiləsi</string>\n    <string name=\"error_insufficient_storage_left\">Cihazda yer yoxdur</string>\n    <string name=\"error_postprocessing_stopped\">Fayl üzərində işləyərkən NewPipe bağlandı</string>\n    <string name=\"error_postprocessing_failed\">Emaldan sonra uğursuz oldu</string>\n    <string name=\"error_connect_host\">Serverə qoşulmaq mümkün deyil</string>\n    <string name=\"error_unknown_host\">Serveri tapmaq olmadı</string>\n    <string name=\"error_ssl_exception\">Təhlükəsiz əlaqə qurmaq olmadı</string>\n    <string name=\"error_file_creation\">Fayl yaradıla bilməz</string>\n    <string name=\"download_already_running\">Bu adla bir endirmə davam edir</string>\n    <string name=\"overwrite_failed\">faylın üzərinə yazıla bilməz</string>\n    <string name=\"overwrite_finished_warning\">Bu adda endirilmiş fayl artıq mövcuddur</string>\n    <string name=\"overwrite\">Üzərinə yaz</string>\n    <string name=\"enqueue\">Növbəyə qoy</string>\n    <string name=\"recovering\">bərpa olunur</string>\n    <string name=\"paused\">dayandırıldı</string>\n    <string name=\"missions_header_finished\">Bitdi</string>\n    <string name=\"minimize_on_exit_none_description\">Heç biri</string>\n    <string name=\"minimize_on_exit_summary\">Əsas video oynadıcıdan digər tətbiqə keçid zamanı hərəkət — %s</string>\n    <string name=\"decline\">İmtina</string>\n    <string name=\"accept\">Razıyam</string>\n    <string name=\"playback_tempo\">Sürət</string>\n    <string name=\"import_title\">İdxal</string>\n    <string name=\"previous_export\">Əvvəlki ixrac</string>\n    <string name=\"export_ongoing\">İxrac edilir…</string>\n    <string name=\"import_ongoing\">İdxal edilir…</string>\n    <string name=\"playlist_add_stream_success\">Pleylistə salındı</string>\n    <string name=\"mute\">Səsi bağla</string>\n    <string name=\"popup_player\">Ani görüntü oynadıcı</string>\n    <string name=\"drawer_open\">Çəkməcəni Aç</string>\n    <string name=\"hold_to_append\">Növbələşdirmək üçün basılı tut</string>\n    <string name=\"play_queue_remove\">Sil</string>\n    <string name=\"app_description\">Android\\'də pulsuz, zərif yayımlayıcı.</string>\n    <string name=\"copyright\">© %1$s, %2$s tərəfindən %3$s altında</string>\n    <string name=\"settings_category_downloads_title\">Endirmə</string>\n    <string name=\"msg_popup_permission\">Bu icazə, ani görüntü rejimində\n\\naçmaq üçün lazımdır</string>\n    <string name=\"msg_copied\">Buferə köçürüldü</string>\n    <string name=\"msg_threads\">Kadrlar</string>\n    <string name=\"rename\">Adını dəyişdir</string>\n    <string name=\"create\">Yarat</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s abunəçi</item>\n        <item quantity=\"other\">%s abunəçi</item>\n    </plurals>\n    <string name=\"audio\">Səs</string>\n    <string name=\"error_details_headline\">Təfərrüatlar:</string>\n    <string name=\"info_labels\">Nə:\\nSorğu:\\nMəzmun Dili:\\nMəzmun Ölkəsi:\\nTətbiq Dili:\\nXidmət:\\nGMT Saatı:\\nPaket:\\nVersiya:\\nƏS versiyası:</string>\n    <string name=\"error_snackbar_message\">Bağışlayın, nəsə səhv oldu.</string>\n    <string name=\"copy_for_github\">Formatlanmış hesabatı köçür</string>\n    <string name=\"peertube_instance_add_help\">Server URL\\'sini daxil et</string>\n    <string name=\"peertube_instance_add_fail\">Serveri təsdiqləmək mümkün olmadı</string>\n    <string name=\"peertube_instance_url_help\">%s-də bəyəndiyiniz serverləri tapın</string>\n    <string name=\"show_hold_to_append_summary\">Video \\\"Təfsilatlar\\\" səhifəsində fon və ya ani görüntü düyməsin basarkən ipucu göstər</string>\n    <string name=\"caption_setting_description\">Oynadıcı titr mətn miqyasını və arxa plan üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur</string>\n    <string name=\"error_occurred_detail\">Xəta baş verdi: %1$s</string>\n    <string name=\"invalid_file\">Fayl mövcud deyil, yaxud oxumaq və ya yazmaq icazəsi yoxdur</string>\n    <string name=\"parsing_error\">Veb saytı təhlil etmək alınmadı</string>\n    <string name=\"playback_pitch\">Ucalıq</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"show_crash_the_player_title\">\\\"Oynadıcını çökdür\\\" Göstər</string>\n    <string name=\"show_crash_the_player_summary\">Oynadıcını istifadə edərkən çökdürmə seçimini göstər</string>\n    <string name=\"show_error_snackbar\">Xəta balonu göstər</string>\n    <string name=\"create_error_notification\">Xəta bildirişi yarat</string>\n    <string name=\"import_from\">Burdan idxal et</string>\n    <string name=\"export_to\">Bura ixrac et</string>\n    <string name=\"import_file_title\">Faylı idxal et</string>\n    <string name=\"subscriptions_import_unsuccessful\">Abunəlikləri idxal etmək mümkün olmadı</string>\n    <string name=\"start_accept_privacy_policy\">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.</string>\n    <string name=\"overwrite_unrelated_warning\">Bu adda fayl artıq mövcuddur</string>\n    <string name=\"download_already_pending\">Bu adla gözlənilən bir endirmə var</string>\n    <string name=\"error_path_creation\">Təyinat qovluğu yaradıla bilməz</string>\n    <string name=\"generate_unique_name\">Bənzərsiz ad yarat</string>\n    <string name=\"chapters\">Bölmələr</string>\n    <string name=\"no_app_to_open_intent\">Cihazınızdakı heç bir tətbiq bunu aça bilməz</string>\n    <string name=\"show_thumbnail_title\">Miniatürü göstər</string>\n    <string name=\"soundcloud_go_plus_content\">Bu, ən azı sizin ölkənizdə olan SoundCloud Go+ trekidir, ona görə də NewPipe tərəfindən yayımlamaq və ya endirmək mümkün deyil.</string>\n    <string name=\"private_content\">Bu məzmun şəxsidir, ona görə də NewPipe tərəfindən yayımlamaq və ya endirmək mümkün deyil.</string>\n    <string name=\"metadata_support\">Dəstək</string>\n    <string name=\"metadata_privacy\">Məxfilik</string>\n    <string name=\"metadata_host\">Sahib</string>\n    <string name=\"metadata_privacy_unlisted\">Siyahıdan kənar</string>\n    <string name=\"metadata_privacy_private\">Şəxsi</string>\n    <string name=\"metadata_age_limit\">Yaş həddi</string>\n    <string name=\"metadata_language\">Dil</string>\n    <string name=\"metadata_privacy_public\">İctimai</string>\n    <string name=\"subscribers_count_not_available\">Abunəçi sayı əlçatan deyil</string>\n    <string name=\"read_full_license\">Lisenziyanı Oxu</string>\n    <string name=\"title_activity_history\">Tarixçə</string>\n    <string name=\"charset_letters_and_digits\">Hərflər və rəqəmlər</string>\n    <string name=\"crash_the_player\">Oynadıcını çökdür</string>\n    <string name=\"peertube_instance_add_https_only\">Yalnız HTTPS URL\\'ləri dəstəklənir</string>\n    <string name=\"settings_category_player_notification_title\">Oynadıcı bildirişi</string>\n    <string name=\"streams_notification_channel_name\">Yeni yayımlar</string>\n    <string name=\"error_report_channel_name\">Xəta hesabatı bildirişi</string>\n    <string name=\"no_streams_available_download\">Endirmək üçün yayım mövcud deyil</string>\n    <string name=\"error_report_notification_toast\">Xəta baş verdi, bildirişi gör</string>\n    <string name=\"your_comment\">Şərhiniz (İngiliscə):</string>\n    <string name=\"detail_thumbnail_view_description\">Video oynat, müddət:</string>\n    <string name=\"no_available_dir\">Zəhmət olmasa, endirmə qovluğunu daha sonra tənzimləmələrdə təyin et</string>\n    <string name=\"msg_running\">NewPipe Endirilir</string>\n    <string name=\"msg_calculating_hash\">Hash hesablanır</string>\n    <string name=\"settings_file_charset_title\">Fayl adlarında icazə verilən simvollar</string>\n    <string name=\"title_activity_about\">NewPipe Haqqında</string>\n    <string name=\"tab_licenses\">Lisenziyalar</string>\n    <string name=\"app_license\">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.</string>\n    <string name=\"export_complete_toast\">İxrac edildi</string>\n    <string name=\"main_page_content_swipe_remove\">Elementləri silmək üçün sürüşdür</string>\n    <string name=\"no_playlist_bookmarked_yet\">Hələ,əlfəcinlənmiş pleylistlər yoxdur</string>\n    <string name=\"override_current_data\">Bu, cari quraşdırmanızı ləğv edəcək.</string>\n    <string name=\"enqueue_stream\">Növbəyə qoy</string>\n    <string name=\"disable_media_tunneling_summary\">Qara ekranla qarşılaşsanız və ya videonu oynatdıqda donarsa, media girişin qeyri-aktiv edin.</string>\n    <string name=\"enqueued_next\">Növbəti sıraya salındı</string>\n    <string name=\"start_here_on_background\">Fonda oynatmağa başla</string>\n    <string name=\"loading_stream_details\">Yayım təfərrüatları yüklənir…</string>\n    <string name=\"disable_media_tunneling_title\">Media girişin qeyri-aktiv et</string>\n    <string name=\"crash_the_app\">Tətbiq çökdü</string>\n    <string name=\"import_youtube_instructions\">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ç</string>\n    <string name=\"playback_speed_control\">Oynatma Sürəti Nizamlamaları</string>\n    <string name=\"unhook_checkbox\">Ayır (pozuntuya səbəb ola bilər)</string>\n    <string name=\"show_error\">Xətanı göstər</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Bəli və qismən baxılmış videolar</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s endirməsi silindi</item>\n        <item quantity=\"other\">%1$s endirmə silindi</item>\n    </plurals>\n    <string name=\"stop\">Dayandır</string>\n    <string name=\"choose_instance_prompt\">Server seç</string>\n    <string name=\"feed_load_error_fast_unknown\">Sürətli axın rejimi bu barədə əlavə məlumat vermir.</string>\n    <string name=\"new_seek_duration_toast\">ExoPlayer məhdudiyyətlərinə görə axtarış müddəti %d saniyəyə təyin edildi</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"no_appropriate_file_manager_message\">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ış</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' üçün axın yükləmək mümkün olmadı.</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">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</string>\n    <string name=\"youtube_music_premium_content\">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.</string>\n    <string name=\"description_select_note\">İ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.</string>\n    <string name=\"notification_scale_to_square_image_summary\">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</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"invalid_source\">Belə fayl/məzmun mənbəyi yoxdur</string>\n    <string name=\"selected_stream_external_player_not_supported\">Seçilən yayım xarici oynadıcılar tərəfindən dəstəklənmir</string>\n    <string name=\"streams_not_yet_supported_removed\">Yükləyici tərəfindən hələ dəstəklənməyən yayımlar göstərilmir</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Xarici oynadıcılar üçün mövcud səs yayımı yoxdur</string>\n    <string name=\"no_video_streams_available_for_external_players\">Xarici oynadıcılar üçün mövcud video yayımı yoxdur</string>\n    <string name=\"select_quality_external_players\">Xarici oynadıcılar üçün keyfiyyət seç</string>\n    <string name=\"unknown_format\">Naməlum format</string>\n    <string name=\"unknown_quality\">Naməlum keyfiyyət</string>\n    <string name=\"progressive_load_interval_title\">Oynatma yükləmə intervalı həcmi</string>\n    <string name=\"faq_description\">Tətbiqi istifadə etməkdə çətinlik çəkirsinizsə, ümumi suallara bu cavabları yoxladığınıza əmin olun!</string>\n    <string name=\"faq_title\">Tez-tez soruşulan suallar</string>\n    <string name=\"faq\">Veb Saytında bax</string>\n    <string name=\"sort\">Çeşidlə</string>\n    <string name=\"app_update_unavailable_toast\">NewPipe\\'ın ən son versiyasın işlədirsiniz</string>\n    <string name=\"fast_mode\">Sürətli rejim</string>\n    <string name=\"import_subscriptions_hint\">3 nöqtə menyudan abunəlikləri idxal və ya ixrac et</string>\n    <string name=\"app_update_available_notification_text\">%s endirmək üçün toxun</string>\n    <string name=\"night_theme_available\">Bu seçim yalnız tema üçün %s seçildikdə əlçatandır</string>\n    <string name=\"unset_playlist_thumbnail\">Daimi miniatürü ləğv et</string>\n    <string name=\"card\">Kart</string>\n    <string name=\"msg_failed_to_copy\">Buferə köçürmək alınmadı</string>\n    <string name=\"duplicate_in_playlist\">Boz rəngdəki pleylistlərdə artıq bu element var.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Dublikat %d dəfə əlavə edildi</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Cihaz daxili media düyməsi problemlərinə məhəl qoyma</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Məsələn, fiziki düymələri qırılan qulaqlıq işlədirsinizsə faydalıdır</string>\n    <string name=\"remove_duplicates\">Dublikatları sil</string>\n    <string name=\"remove_duplicates_title\">Dublikatlar silinsin\\?</string>\n    <string name=\"feed_hide_streams_title\">Aşağıdakı yayımları göstər</string>\n    <string name=\"feed_show_hide_streams\">Yayımları Göstər/Gizlə</string>\n    <string name=\"feed_show_watched\">Tam baxılıb</string>\n    <string name=\"feed_show_partially_watched\">Qismən baxılıb</string>\n    <string name=\"remove_duplicates_message\">Bu pleylistdəki bütün dublikat yayımları silmək istəyirsiniz\\?</string>\n    <string name=\"feed_show_upcoming\">Yaxınlaşan</string>\n    <string name=\"left_gesture_control_title\">Sol jest fəaliyyəti</string>\n    <string name=\"right_gesture_control_summary\">Oynadıcı ekranının sağ yarısı üçün jest seç</string>\n    <string name=\"right_gesture_control_title\">Sağ jest fəaliyyəti</string>\n    <string name=\"brightness\">Parlaqlıq</string>\n    <string name=\"volume\">Səs səviyyəsi</string>\n    <string name=\"none\">Heç biri</string>\n    <string name=\"left_gesture_control_summary\">Oynadıcı ekranının sol yarısı üçün jest seç</string>\n    <string name=\"prefer_original_audio_title\">Orijinal səsə üstünlük ver</string>\n    <string name=\"prefer_original_audio_summary\">Dildən asılı olmayaraq orijinal səs axını seç</string>\n    <string name=\"prefer_descriptive_audio_title\">Təsviri səsə üstünlük ver</string>\n    <string name=\"prefer_descriptive_audio_summary\">Varsa, görmə qabiliyyəti zəifləyən insanlar üçün təsviri olan səs axını seçin</string>\n    <string name=\"play_queue_audio_track\">Səs: %s</string>\n    <string name=\"audio_track\">Səs axını</string>\n    <string name=\"audio_track_present_in_video\">Səs axını artıq bu yayımda olmalıdır</string>\n    <string name=\"select_audio_track_external_players\">Xarici oynadıcılar üçün səs axını seç</string>\n    <string name=\"unknown_audio_track\">Naməlum</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer tənzimləmələri</string>\n    <string name=\"settings_category_exoplayer_summary\">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</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">ExoPlayer-in çözücü xüsusiyyətin istifadə et</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Ə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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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</string>\n    <string name=\"audio_track_type_original\">orijinal</string>\n    <string name=\"audio_track_type_dubbed\">dublyaj edilib</string>\n    <string name=\"audio_track_type_descriptive\">təsviri</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Həmişə ExoPlayer-in video çıxış səthi tənzimləməsin istifadə et</string>\n    <string name=\"progressive_load_interval_summary\">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</string>\n    <string name=\"no_streams\">Yayım yoxdur</string>\n    <string name=\"no_live_streams\">Canlı yayım yoxdur</string>\n    <string name=\"disable_media_tunneling_automatic_info\">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.</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"main_tabs_position_title\">Əsas səhifə mövqeyi</string>\n    <string name=\"main_tabs_position_summary\">Əsas səhifə seçicini aşağıya köçür</string>\n    <string name=\"loading_metadata_title\">Üst Məlumat Yüklənir…</string>\n    <string name=\"feed_fetch_channel_tabs\">Kanal səhifələrin əldə et</string>\n    <string name=\"metadata_avatars\">Avatarlar</string>\n    <string name=\"metadata_subchannel_avatars\">Alt kanal avatarları</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">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.</string>\n    <string name=\"metadata_uploader_avatars\">Yükləyici avatarları</string>\n    <string name=\"metadata_thumbnails\">Miniatürlər</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"no\">Xeyr</string>\n    <string name=\"settings_category_backup_restore_title\">Nüsxələ və bərpa et</string>\n    <string name=\"auto_update_check_description\">NewPipe arabir avtomatik şəkildə yeni versiyaları yoxlaya və onlar mövcud olduqda sizə bildirə bilər.\n\\nBunu aktivləşdirmək istəyirsiniz?</string>\n    <string name=\"yes\">Bəli</string>\n    <string name=\"reset_settings_title\">Tənzimləmələri sıfırla</string>\n    <string name=\"reset_settings_summary\">Bütün tənzimləmələri standart dəyərlərinə sıfırla</string>\n    <string name=\"error_insufficient_storage\">Cihazda yetərlik boş yer yoxdur</string>\n    <string name=\"metadata_subscribers\">Abunəliklər</string>\n    <string name=\"rewind\">Geri çevir</string>\n    <string name=\"toggle_screen_orientation\">Ekran səmtini dəyişin</string>\n    <string name=\"import_settings_vulnerable_format\">İ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.</string>\n    <string name=\"previous_stream\">Əvvəlki yayım</string>\n    <string name=\"next_stream\">Növbəti yayım</string>\n    <string name=\"image_quality_none\">Şəkilləri yükləmə</string>\n    <string name=\"metadata_banners\">Lövhələr</string>\n    <string name=\"channel_tab_videos\">Videolar</string>\n    <string name=\"channel_tab_tracks\">Axınlar</string>\n    <string name=\"channel_tab_channels\">Kanallar</string>\n    <string name=\"channel_tab_about\">Haqqında</string>\n    <string name=\"show_channel_tabs\">Kanal səhifələri</string>\n    <string name=\"channel_tab_playlists\">Pleylistlər</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s cavab</item>\n        <item quantity=\"other\">%s cavab</item>\n    </plurals>\n    <string name=\"show_channel_tabs_summary\">Kanal səhifələrində hansı səhifələr göstərilir</string>\n    <string name=\"open_play_queue\">Oynatma növbəsin aç</string>\n    <string name=\"toggle_fullscreen\">Tam ekrana keçid</string>\n    <string name=\"play\">Oynat</string>\n    <string name=\"replay\">Təkrar oynat</string>\n    <string name=\"more_options\">Daha çox seçim</string>\n    <string name=\"duration\">Müddət</string>\n    <string name=\"forward\">İrəli çevir</string>\n    <string name=\"image_quality_low\">Aşağı keyfiyyət</string>\n    <string name=\"image_quality_medium\">Orta keyfiyyət</string>\n    <string name=\"image_quality_high\">Yüksək keyfiyyət</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist\">Oynatma siyahısın paylaş</string>\n    <string name=\"share_playlist_with_titles\">Başlıqlarla paylaşın</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_more\">Daha çox göstər</string>\n    <string name=\"show_less\">Daha qısa göstər</string>\n    <string name=\"reset_all_settings\">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\n\\n\n\\nDavam etmək istədiyinizə əminsiniz?</string>\n    <string name=\"channel_tab_livestreams\">Canlı</string>\n    <string name=\"channel_tab_albums\">Albomlar</string>\n    <string name=\"image_quality_title\">Şəkil keyfiyyəti</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"share_playlist_with_list\">URL siyahısını paylaşın</string>\n    <string name=\"audio_track_type_secondary\">ikinci dərəcəli</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">YouTube müvəqqəti pleylisti kimi paylaş</string>\n    <string name=\"tab_bookmarks_short\">Pleylistlər</string>\n    <string name=\"select_a_feed_group\">Axın qrupu seçin</string>\n    <string name=\"no_feed_group_created_yet\">Hələ heç bir axın qrupu yaradılmayıb</string>\n    <string name=\"feed_group_page_summary\">Kanal qrupu səhifəsi</string>\n    <string name=\"search_with_service_name\">%1$s axtar</string>\n    <string name=\"search_with_service_name_and_filter\">%1$s (%2$s) axtar</string>\n    <string name=\"channel_tab_likes\">Bəyənmə</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud Top 50 səhifəsi silindi</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud ilk Ən yaxşı 50 siyahısın ləğv etdi. Uyğun səhifə əsas səhifənizdən silindi.</string>\n    <string name=\"short_thousand\">%sMin</string>\n    <string name=\"short_million\">%sMln</string>\n    <string name=\"short_billion\">%sMlrd</string>\n    <string name=\"migration_info_7_8_title\">YouTube birləşmiş trend silindi</string>\n    <string name=\"migration_info_7_8_message\">YouTube 21 iyul 2025-ci il tarixindən birləşmiş trend səhifəsini ləğv etdi. NewPipe ilkin trend səhifəsini trend olan canlı yayımlarla əvəz etdi. \\n\\nHəmçinin \\\"Tənzimləmələr &gt; Məzmun &gt; Əsas səhifə məzmunu\\\" bölməsində müxtəlif trendli səhifələri seçə bilərsiniz.</string>\n    <string name=\"trending_gaming\">Trenddə olan Oyun</string>\n    <string name=\"trending_podcasts\">Trenddə olan podkastlar</string>\n    <string name=\"trending_movies\">Trend film və tamaşalar</string>\n    <string name=\"trending_music\">Trenddə olan musiqilər</string>\n    <string name=\"permission_display_over_apps_message\">Ani oynadıcı istifadə etmək üçün lütfən, aşağıdakı Android tənzimləmələr menyusunda %1$s seçin və %2$s-ı aktivləşdirin.</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"Digər tətbiqlər üzərində göstərməyə icazə verin\\\"</string>\n    <string name=\"delete_file\">Faylı sil</string>\n    <string name=\"delete_entry\">Girişi silin</string>\n    <string name=\"entry_deleted\">Giriş silindi</string>\n    <string name=\"account_terminated_service_provides_reason\">Hesab ləğv edilib\\n\\n %1$s bu səbəbi təmin edir: %2$s</string>\n    <string name=\"player_http_403\">Oynadarkən serverdən alınan HTTP xətası 403, çox güman ki, yayım URL-si müddətinin bitməsi və ya IP qadağası ilə bağlıdır</string>\n    <string name=\"player_http_invalid_status\">HTTP xətası %1$s oynadarkən serverdən alındı</string>\n    <string name=\"youtube_player_http_403\">HTTP xətası 403 oynadarkən serverdən alındı, ehtimal ki, IP qadağası və ya yayım URL-nin deobfuscation problemləri ilə bağlıdır</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s sorğuçunun bot olmadığını təsdiqləmək üçün giriş tələb edərək data təmin etməkdən imtina etdi.\\n\\nIP-niz %1$s tərəfindən müvəqqəti şəkildə qadağan oluna bilər, bir müddət gözləyə və ya başqa IP-yə keçə bilərsiniz (məsələn, VPN-i açıb/qapatmaqla və ya WiFi-dan mobil dataya keçməklə).</string>\n    <string name=\"unsupported_content_in_country\">Bu məzmun hazırda seçilən məzmun ölkəsi üçün əlçatan deyil. \\n\\nSeçiminizi \\\"Tənzimləmələr &gt; Məzmun &gt; İlkin məzmun ölkəsi\\\"- dən dəyişin.</string>\n    <string name=\"kao_dialog_warning\">2025 avqustunda, Google 2026-cı ilin sentyabrından etibarən tətbiqlərin quraşdırılması Play Store xaricində quraşdırılanlar daxil olmaqla, sertifikatlaşdırılan cihazlardakı bütün Android tətbiqləri üçün tərtibatçı təsdiqlənməsini tələb edəcək deyə bəyan etdi. NewPipe tərtibatçıları bu tələblə razılaşmadığı üçün NewPipe bu vaxtdan sonra artıq sertifikatlaşdırılan Android cihazlarında işləməyəcək.</string>\n    <string name=\"kao_dialog_more_info\">Təfərrüatlar</string>\n    <string name=\"kao_solution\">Həll olunma</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-azb/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-b+ast/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Espublizóse\\'l %1$s</string>\n    <string name=\"cancel\">Encaboxar</string>\n    <string name=\"open_in_browser\">Abrir nun restolador</string>\n    <string name=\"share\">Compartir</string>\n    <string name=\"settings\">Axustes</string>\n    <string name=\"did_you_mean\">¿Quxesti dicir «%1$s»\\?</string>\n    <string name=\"use_external_video_player_title\">Usar un reproductor esternu de videu</string>\n    <string name=\"use_external_audio_player_title\">Usar un reproductor esternu d\\'audiu</string>\n    <string name=\"default_resolution_title\">Resolución predeterminada</string>\n    <string name=\"play_with_kodi_title\">Reproducir en Kodi</string>\n    <string name=\"show_play_with_kodi_title\">Amosar la opción «Reproducir en Kodi»</string>\n    <string name=\"show_play_with_kodi_summary\">Amuesa una opción pa reproducir vídeos pel centru multimedia Kodi</string>\n    <string name=\"play_audio\">Audiu</string>\n    <string name=\"default_audio_format_title\">Formatu d\\'audiu predetermináu</string>\n    <string name=\"theme_title\">Estilu</string>\n    <string name=\"dark_theme_title\">Escuridá</string>\n    <string name=\"light_theme_title\">Claridá</string>\n    <string name=\"content_language_title\">Llingua predeterminada del conteníu</string>\n    <string name=\"settings_category_video_audio_title\">Videu y audiu</string>\n    <string name=\"settings_category_appearance_title\">Aspeutu</string>\n    <string name=\"content\">Conteníu</string>\n    <string name=\"show_age_restricted_content_title\">Amosar el conteníu torgáu pola edá</string>\n    <string name=\"duration_live\">En direuto</string>\n    <string name=\"general_error\">Fallu</string>\n    <string name=\"could_not_load_thumbnails\">Nun pudieron cargase toles miniatures</string>\n    <string name=\"parsing_error\">Nun pudo analizase\\'l sitiu web</string>\n    <string name=\"sorry_string\">Buff… Esto nun debió asoceder.</string>\n    <string name=\"error_snackbar_message\">Perdona mas asocedió daqué malo.</string>\n    <string name=\"what_device_headline\">Información:</string>\n    <string name=\"error_details_headline\">Detalles:</string>\n    <string name=\"detail_likes_img_view_description\">Préstames</string>\n    <string name=\"video\">Videu</string>\n    <string name=\"audio\">Audiu</string>\n    <string name=\"delete\">Desaniciar</string>\n    <string name=\"checksum\">Suma de comprobación</string>\n    <string name=\"ok\">Aceutar</string>\n    <string name=\"msg_threads\">Filos</string>\n    <string name=\"msg_error\">Fallu</string>\n    <string name=\"msg_wait\">Espera…</string>\n    <string name=\"msg_copied\">Copióse al cartafueyu</string>\n    <string name=\"detail_dislikes_img_view_description\">Tarrezmes</string>\n    <string name=\"default_video_format_title\">Formatu de videu predetermináu</string>\n    <string name=\"black_theme_title\">Prietu</string>\n    <string name=\"msg_popup_permission\">Precísase esti permisu p\\'abrir\n\\nnel mou ventanu</string>\n    <string name=\"title_activity_recaptcha\">Retu de reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Solicitóse un retu de reCAPTCHA</string>\n    <string name=\"controls_background_title\">En segundu planu</string>\n    <string name=\"controls_popup_title\">Ventanu</string>\n    <string name=\"default_popup_resolution_title\">Resolución predeterminada del ventanu</string>\n    <string name=\"show_higher_resolutions_title\">Amosar resoluciones más altes</string>\n    <string name=\"show_higher_resolutions_summary\">Namás dalgunos preseos puen reproducir videos en 2K/4K</string>\n    <string name=\"clear\">Llimpiar</string>\n    <string name=\"use_external_video_player_summary\">Quita l\\'audiu en dalgunes resoluciones</string>\n    <string name=\"show_search_suggestions_title\">Suxerencies de busca</string>\n    <string name=\"show_search_suggestions_summary\">Amosar suxerencies al buscar</string>\n    <string name=\"subscribe_button_title\">Soscribise</string>\n    <string name=\"subscription_update_failed\">Nun pudo anovase la soscripción</string>\n    <string name=\"tab_subscriptions\">Soscripciones</string>\n    <string name=\"fragment_feed_title\">Novedaes</string>\n    <string name=\"enable_search_history_title\">Historial de busques</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Siguir cola reproducción</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Sigue cola reproducción dempués de les interrupciones (por exemplu, llamaes)</string>\n    <string name=\"settings_category_player_title\">Reproductor</string>\n    <string name=\"settings_category_player_behavior_title\">Comportamientu</string>\n    <string name=\"settings_category_history_title\">Historial y caché</string>\n    <string name=\"best_resolution\">La meyor resolución</string>\n    <string name=\"notification_channel_name\">Avisu permanente de NewPipe</string>\n    <string name=\"search_no_results\">Nun hai resultaos</string>\n    <string name=\"empty_list_subtitle\">Equí nun hai más que grillos</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s soscriptor</item>\n        <item quantity=\"other\">%s soscriptores</item>\n    </plurals>\n    <string name=\"no_views\">Nun hai vistes</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s vista</item>\n        <item quantity=\"other\">%s vistes</item>\n    </plurals>\n    <string name=\"settings_category_downloads_title\">Descarga</string>\n    <string name=\"settings_file_charset_title\">Caráuteres permitíos nos nomes de los ficheros</string>\n    <string name=\"charset_letters_and_digits\">Lletres y díxitos</string>\n    <string name=\"charset_most_special_characters\">La mayoría de caráuteres especiales</string>\n    <string name=\"title_activity_about\">Tocante a NewPipe</string>\n    <string name=\"title_licenses\">Llicencies de terceros</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s por %2$s baxo %3$s</string>\n    <string name=\"tab_about\">Tocante a</string>\n    <string name=\"tab_licenses\">Llicencies</string>\n    <string name=\"view_on_github\">Ver en GitHub</string>\n    <string name=\"app_license_title\">Llicencia de NewPipe</string>\n    <string name=\"contribution_encouragement\">Si tienes idees, quies traducir, facer dalgún cambéu nel diseñu, acuriosar poco o muncho\\'l códigu… Agradecemos l\\'ayuda. ¡Cuanto más se faiga, meyor!</string>\n    <string name=\"read_full_license\">Lleer</string>\n    <string name=\"contribution_title\">Collaboración</string>\n    <string name=\"title_activity_history\">Historial</string>\n    <string name=\"action_history\">Historial</string>\n    <string name=\"delete_item_search_history\">¿Quies desaniciar esti elementu del historial de busques\\?</string>\n    <string name=\"play_all\">Reproducir too</string>\n    <string name=\"player_stream_failure\">Nun pudo reproducise esti fluxu</string>\n    <string name=\"player_unrecoverable_failure\">Asocedió un fallu irrecuperable del reproductor</string>\n    <string name=\"main_page_content\">Conteníu de la páxina principal</string>\n    <string name=\"blank_page_summary\">Páxina balera</string>\n    <string name=\"select_a_kiosk\">Esbilla d\\'un quioscu</string>\n    <string name=\"trending\">Tendencies</string>\n    <string name=\"top_50\">Los 50 destacaos</string>\n    <string name=\"play_queue_stream_detail\">Detalles</string>\n    <string name=\"new_and_hot\">Novedaes destacaes</string>\n    <string name=\"unknown_content\">[Desconozse]</string>\n    <string name=\"start_here_on_background\">Reproducir en segundu planu</string>\n    <string name=\"start_here_on_popup\">Reproducir nun ventanu</string>\n    <string name=\"donation_title\">Donación</string>\n    <string name=\"donation_encouragement\">NewPipe ta desendolcáu por xente voluntario que pasa\\'l tiempu llibre ufriéndote la meyor esperiencia d\\'usuariu. Devolvi\\'l favor p\\'ayudar a los desendolcadores p\\'ameyorar NewPipe tovía más mentanto esfruten d\\'una taza de café.</string>\n    <string name=\"give_back\">Donar</string>\n    <string name=\"website_title\">Sitiu web</string>\n    <string name=\"website_encouragement\">Visita\\'l sitiu web de NewPipe pa más información y noticies.</string>\n    <string name=\"default_content_country_title\">País predetermináu del conteníu</string>\n    <string name=\"always\">Siempres</string>\n    <string name=\"import_data_title\">Importar una base de datos</string>\n    <string name=\"export_data_title\">Esportar la base de datos</string>\n    <string name=\"import_data_summary\">Anula l\\'historial, les soscripciones, les llistes de reproducción y (opcionalmente) los axustes actuales</string>\n    <string name=\"export_data_summary\">Esporta l\\'historial, les soscripciones, les llistes de reproducción y los axustes</string>\n    <string name=\"override_current_data\">Esto va anular la configuración actual.</string>\n    <string name=\"show_info\">Amosar la información</string>\n    <string name=\"tab_bookmarks\">Llistes en marcadores</string>\n    <string name=\"create\">Crear</string>\n    <string name=\"dismiss\">Escartar</string>\n    <string name=\"create_playlist\">Llista de reproducción nueva</string>\n    <string name=\"name\">Nome</string>\n    <string name=\"add_to_playlist\">Amestar a una llista de reproducción</string>\n    <string name=\"delete_playlist_prompt\">¿Desanicair esta llista de reproducción\\?</string>\n    <string name=\"caption_none\">Ensin sotítulos</string>\n    <string name=\"resize_fit\">Axustar</string>\n    <string name=\"resize_fill\">Rellenar</string>\n    <string name=\"resize_zoom\">Zoom</string>\n    <string name=\"file\">FIcheru</string>\n    <string name=\"invalid_file\">El ficheru nun esiste o a l\\'aplicación fálta-y el permisu de llectura/escritura</string>\n    <string name=\"error_occurred_detail\">Asocedió un fallu: %1$s</string>\n    <string name=\"import_ongoing\">Importando…</string>\n    <string name=\"export_ongoing\">Esportando…</string>\n    <string name=\"subscriptions_export_unsuccessful\">Nun pudieron esportase les soscripciones</string>\n    <string name=\"preferred_open_action_settings_title\">Aición d\\'apertura preferida</string>\n    <string name=\"import_settings\">¿Quies tamién importar los axustes\\?</string>\n    <string name=\"read_privacy_policy\">Lleer</string>\n    <string name=\"channels\">Canales</string>\n    <string name=\"playlists\">Llistes de reproducción</string>\n    <string name=\"tracks\">Pistes</string>\n    <string name=\"users\">Usuarios</string>\n    <string name=\"restore_defaults\">Reafitamientu de valores</string>\n    <string name=\"subscribers_count_not_available\">El númberu de soscriptores nun ta disponible</string>\n    <string name=\"updates_setting_title\">Anovamientos</string>\n    <string name=\"updates_setting_description\">Amuesa un avisu qu\\'apaez cuando hai disponible una versión nueva</string>\n    <string name=\"list\">Llista</string>\n    <string name=\"grid\">Rexáu</string>\n    <string name=\"missions_header_finished\">Finó</string>\n    <string name=\"download_failed\">Falló la descarga</string>\n    <string name=\"download_already_running\">Hai una descarga en cursu con esti nome</string>\n    <string name=\"error_path_creation\">La carpeta de destín nun pue crease</string>\n    <string name=\"error_ssl_exception\">Nun pudo afitase una conexón segura</string>\n    <string name=\"error_connect_host\">Nun pues coneutate al sirvidor</string>\n    <string name=\"max_retry_msg\">Intentos máximos</string>\n    <string name=\"events\">Eventos</string>\n    <string name=\"conferences\">Conferencies</string>\n    <string name=\"autoplay_title\">Reproducción automática</string>\n    <string name=\"error_unable_to_load_comments\">Nun pudieron cargase los comentarios</string>\n    <string name=\"missing_file\">El ficheru movióse o desanicióse</string>\n    <string name=\"overwrite_unrelated_warning\">Yá esiste un ficheru con esti nome</string>\n    <string name=\"overwrite_finished_warning\">Yá esiste un ficheru baxáu con esti nome</string>\n    <string name=\"overwrite_failed\">nun pue sobrecribise\\'l ficheru</string>\n    <string name=\"download_already_pending\">Hai una descarga pendiente con esti nome</string>\n    <string name=\"error_insufficient_storage_left\">Nun queda espaciu nel preséu</string>\n    <string name=\"error_timeout\">Escosó\\'l tiempu d\\'espera de la conexón</string>\n    <string name=\"subscriptions_import_unsuccessful\">Nun pudieron importase les soscripciones</string>\n    <string name=\"caption_setting_title\">Sotítulos</string>\n    <string name=\"accept\">Aceutar</string>\n    <string name=\"restore_defaults_confirmation\">¿Quies reafitar los valores\\?</string>\n    <string name=\"error_unknown_host\">Nun pudo atopase\\'l sirvidor</string>\n    <string name=\"error_http_unsupported_range\">El sirvidor nun aceuta descargues multifilu, volvi tentalo con @string/msg_threads = 1</string>\n    <string name=\"no_comments\">Nun hai comentarios</string>\n    <string name=\"settings_category_clear_data_title\">Llimpieza de datos</string>\n    <string name=\"show_comments_title\">Amosar los comentarios</string>\n    <string name=\"show_comments_summary\">Desactiva esta opción p\\'anubrir los comentarios</string>\n    <string name=\"start_accept_privacy_policy\">Pa cumplir cola Regulación Xeneral de Proteición de Datos (RGPD), pidímoste que mires la política de privacidá de NewPipe. Lleila con procuru.\n\\nHas aceutala pa unvianos informes de fallos.</string>\n    <string name=\"minimize_on_exit_summary\">L\\'aición al cambiar a otra aplicación dende\\'l reproductor de videu princpial — %s</string>\n    <string name=\"max_retry_desc\">El númberu máximu d\\'intentos pa encaboxar la descarga</string>\n    <string name=\"confirm_prompt\">¿Quies llimpiar l\\'historial de descargues o desaniciar tolos ficheros baxaos\\?</string>\n    <string name=\"previous_export\">Esportación anterior</string>\n    <string name=\"import_file_title\">Importación d\\'un ficheru</string>\n    <string name=\"import_youtube_instructions\">Importa les soscripciones de YouTube dende Google Takeout:\n\\n\n\\n1. Vete a esta URL: %1$s\n\\n2. Anicia sesión cuando se te pida\n\\n3. Calca en «Tolos datos incluyíos», darréu en «Deseleicionar too», dempués esbilla namás «soscripciones» y calca «Aceutar»\n\\n4. Calca en «Pasu siguiente» y darréu en «Crear una esportación»\n\\n5. Calca nel botón «Baxar» dempués de qu\\'apaeza y\n\\n6. A partir del ficheru baxáu, estrái\\'l ficheru .json (polo xeneral baxo «YouTube and YouTube Music/subscriptions/subscriptions.json») ya impórtalu equí.</string>\n    <string name=\"import_soundcloud_instructions\">Importa un perfil de SoundCloud teclexando la URL o la to ID:\n\\n\n\\n1. Activa\\'l «mou d\\'escritoriu» nun restolador web (el sitiu nun ta disponible pa móviles)\n\\n2. Vete a esta URL: %1$s\n\\n3. Anicia sesión cuando se te pida\n\\n4. Copia la URL del perfil al que te redirixeron.</string>\n    <string name=\"import_soundcloud_instructions_hint\">soundcloud.com/LaToID</string>\n    <string name=\"minimize_on_exit_title\">Minimizar al cambiar d\\'aplicación</string>\n    <string name=\"minimize_on_exit_background_description\">Minimizar al reproductor en segundu planu</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimizar al reproductor en ventanu</string>\n    <string name=\"unsubscribe\">Esborrase</string>\n    <string name=\"tab_choose\">Esbilla d\\'una llingüeta</string>\n    <string name=\"enable_playback_resume_title\">Siguir cola reproducción</string>\n    <string name=\"main_page_content_summary\">Les llingüetes que s\\'amuesen na páxina principal</string>\n    <string name=\"downloads_storage_ask_title\">Entrugar ónde baxar</string>\n    <string name=\"downloads\">Descargues</string>\n    <string name=\"downloads_title\">Descargues</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s videu</item>\n        <item quantity=\"other\">%s vídeos</item>\n    </plurals>\n    <string name=\"preferred_player_fetcher_notification_message\">Cargando\\'l conteníu solicitáu</string>\n    <string name=\"privacy_policy_title\">Política de privacidá de NewPipe</string>\n    <string name=\"error_file_creation\">El ficheru nun pue crease</string>\n    <string name=\"error_http_no_content\">El sirvidor nun unvia datos</string>\n    <string name=\"search\">Buscar</string>\n    <string name=\"share_dialog_title\">Compartir con</string>\n    <string name=\"subscribed_button_title\">Soscribiéstite</string>\n    <string name=\"no_videos\">Nun hai vídeos</string>\n    <string name=\"delete_search_history_alert\">¿Desaniciar tol historial de busques\\?</string>\n    <string name=\"app_update_available_notification_title\">¡Hai un anovamientu pa NewPipe!</string>\n    <string name=\"error_progress_lost\">Perdióse\\'l progresu porque se desanició\\'l ficheru</string>\n    <string name=\"peertube_instance_url_title\">Instancies de PeerTube</string>\n    <string name=\"peertube_instance_add_exists\">La instancia yá esiste</string>\n    <string name=\"app_language_title\">Llingua de l\\'aplicación</string>\n    <string name=\"systems_language\">Lo predeterminao del sistema</string>\n    <string name=\"videos_string\">Vídeos</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d segundu</item>\n        <item quantity=\"other\">%d segundos</item>\n    </plurals>\n    <string name=\"playback_tempo\">Tempu</string>\n    <string name=\"playback_pitch\">Tonu</string>\n    <string name=\"decline\">Refugar</string>\n    <string name=\"unsupported_url\">La URL nun ta sofitada</string>\n    <string name=\"background_player_playing_toast\">Reproduciendo en segundu planu</string>\n    <string name=\"popup_playing_toast\">Reproduciendo nel mou ventanu</string>\n    <string name=\"enable_search_history_summary\">Atroxa llocalmente les consultes de busca</string>\n    <string name=\"external_player_unsupported_link_type\">Los reproductores esternos nun sofiten esti tipu d\\'enllaces</string>\n    <string name=\"export_complete_toast\">Esportóse</string>\n    <string name=\"import_complete_toast\">Importóse</string>\n    <string name=\"could_not_import_all_files\">Alvertencia: nun pudieron importase tolos ficheros.</string>\n    <string name=\"settings_category_updates_title\">Anovamientos</string>\n    <string name=\"peertube_instance_add_fail\">Nun pudo validase la instancia</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minutu</item>\n        <item quantity=\"other\">%d minutos</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d hora</item>\n        <item quantity=\"other\">%d hores</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d día</item>\n        <item quantity=\"other\">%d díes</item>\n    </plurals>\n    <string name=\"feed_group_dialog_delete_message\">¿Quies desaniciar esti grupu\\?</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Llimpióse la caché de metadatos</string>\n    <string name=\"metadata_cache_wipe_summary\">Desanicia tolos datos na caché de les páxines web</string>\n    <string name=\"metadata_cache_wipe_title\">Llimpiar los metadatos de la caché</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Llimpióse la caché d\\'imáxenes</string>\n    <string name=\"kore_not_found\">¿Instalar Kode\\?</string>\n    <string name=\"info_labels\">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:</string>\n    <string name=\"no_player_found_toast\">Nun s\\'atopó nengún reproductor de fluxos (pues instalar VLC pa reproducilos).</string>\n    <string name=\"show_thumbnail_summary\">Amuesa una miniatura nel fondu de la pantalla de bloquéu y dientro de los avisos</string>\n    <string name=\"show_thumbnail_title\">Amosar una miniatura</string>\n    <string name=\"playlist_page_summary\">Páxina d\\'una llista de reproducción</string>\n    <string name=\"video_detail_by\">Por %s</string>\n    <string name=\"channel_created_by\">Canal creada por %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Avatar de la canal</string>\n    <string name=\"content_not_supported\">Esti conteníu entá nun ta sofitáu por NewPipe.\n\\n\n\\nQuiciabes nel futuru sí.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">¿Cuides que la carga del feed ye perlenta\\? Si ye asina, activa la carga rápida (pues camudalo nos axustes o primiendo\\'l botón d\\'embaxo).\n\\n\n\\nNewPipe ufre dos estratexes de descarga de feeds:\n\\n• Dir en cata de tola canal de soscripciones, lo cual ye lento pero completo.\n\\n• Usar un serviciu final dedicáu, lo cual ye rápido mas xeneralmente incompleto.\n\\n\n\\nLa diferencia ente los dos ye qu\\'al más rápidu, polo xeneral, fálta-y dalguna información como\\'l tipu (nun pue estremar ente vídeos en direuto o normales) o la duración de los elementos (que devuelve menos).\n\\n\n\\nYouTube ye l\\'exemplu d\\'un serviciu qu\\'ufre esti métodu rápidu col so feed RSS.\n\\n\n\\nPolo que tu escueyes según lo que prefieras, si velocidá o información precisa.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Desactivar el mou rápidu</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Activar el mou rápidu</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Disponible en dalgunos preseos, suel ser muncho más rápido mas podría devolver un númberu llendáu d\\'elementos y davezu información completa (por exemplu, falta de la duración, el tipu d\\'elementu o l\\'estáu de la tresmisión).</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Dir en cata de feeds dedicaos cuando seya posible</string>\n    <string name=\"feed_update_threshold_option_always_update\">Anovar siempres</string>\n    <string name=\"feed_update_threshold_summary\">Tiempu que tarda (dende l\\'últimu anovamientu) en considerase una soscripción ensin anovar — %s</string>\n    <string name=\"feed_update_threshold_title\">Llende del anovamientu del feed</string>\n    <string name=\"settings_category_feed_title\">Feed</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Amosar namás les soscripciones ensin agrupar</string>\n    <string name=\"feed_create_new_group_button_title\">Nuevu</string>\n    <string name=\"feed_group_dialog_empty_name\">El nome del grupu ta baleru</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d na esbilla</item>\n        <item quantity=\"other\">%d na esbilla</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Nun s\\'esbilló nenguna soscripción</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Esbillar soscripciones</string>\n    <string name=\"feed_processing_message\">Procesando\\'l feed…</string>\n    <string name=\"feed_notification_loading\">Cargando\\'l feed…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Númberu d\\'elementos que nun cargaron: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Últimu anovamientu del feed: %s</string>\n    <string name=\"feed_groups_header_title\">Grupos de canales</string>\n    <string name=\"new_seek_duration_toast\">Pola mor de les torgues d\\'ExoPlayer la duración afitóse en %d segundos</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Sí, y tamién los vistos parcialmente</string>\n    <string name=\"remove_watched_popup_warning\">Van desaniciase los vídeos que se vieren enantes y dempués d\\'amestase a la llista de reproducción. \\n¿De xuru? ¡Esto nun pue desfacese!</string>\n    <string name=\"remove_watched_popup_title\">¿Desaniciar los vídeos vistos?</string>\n    <string name=\"remove_watched\">Desaniciar lo visto</string>\n    <string name=\"choose_instance_prompt\">Escoyeta d\\'una instancia</string>\n    <string name=\"downloads_storage_use_saf_summary\">El «Storage Access Framework» permite les descargues nuna tarxeta SD esterna.\n\\nDalgunos preseos son incompatibles</string>\n    <string name=\"downloads_storage_use_saf_title\">Usar SAF</string>\n    <string name=\"downloads_storage_ask_summary\">Va pidísete l\\'allugamientu onde guardar les descargues con cauna</string>\n    <string name=\"pause_downloads\">Posar les descargues</string>\n    <string name=\"start_downloads\">Aniciar les descargues</string>\n    <string name=\"enable_queue_limit_desc\">Namás va executase una descarga al empar</string>\n    <string name=\"enable_queue_limit\">Llendar la cola de descarga</string>\n    <string name=\"close\">Zarrar</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Útil al cambiar a los datos móviles, magar que dalgunes descargues nun puedan suspendese</string>\n    <string name=\"pause_downloads_on_mobile\">Torgar nes redes midíes</string>\n    <string name=\"stop\">Parar</string>\n    <string name=\"delete_downloaded_files\">Desaniciar lo baxao</string>\n    <string name=\"clear_download_history\">Llimpiar l\\'historial de descargues</string>\n    <string name=\"error_download_resource_gone\">Esta descarga nun pue recuperase</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe zarróse mentanto trabayaba nel ficheru</string>\n    <string name=\"error_postprocessing_failed\">Falló\\'l posprocesamientu</string>\n    <string name=\"error_http_not_found\">Nun s\\'atopó</string>\n    <string name=\"show_error\">Amosar el fallu</string>\n    <string name=\"overwrite\">Sobrescribir</string>\n    <string name=\"generate_unique_name\">Xenerar un nome únicu</string>\n    <string name=\"permission_denied\">El sistema negó l\\'aición</string>\n    <string name=\"enqueue\">Amestar a la cola</string>\n    <string name=\"recovering\">recuperando</string>\n    <string name=\"post_processing\">posprocesando</string>\n    <string name=\"queued\">na cola</string>\n    <string name=\"paused\">posóse</string>\n    <string name=\"missions_header_pending\">Pendiente</string>\n    <string name=\"auto\">Auto</string>\n    <string name=\"list_view_mode\">Mou de la vista de les llistes</string>\n    <string name=\"never\">Enxamás</string>\n    <string name=\"wifi_only\">Namás na Wi-Fi</string>\n    <string name=\"autoplay_summary\">Anicia automáticamente la reproducción — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Nada</string>\n    <string name=\"limit_mobile_data_usage_title\">Llendar la resolución al usar los datos móviles</string>\n    <string name=\"limit_data_usage_none_description\">Ensin llende</string>\n    <string name=\"playback_reset\">Reafitar</string>\n    <string name=\"playback_step\">Pasu</string>\n    <string name=\"skip_silence_checkbox\">Avance rápidu nos silencios</string>\n    <string name=\"unhook_checkbox\">Separtar (pue causar distorsión)</string>\n    <string name=\"playback_speed_control\">Controles de la velocidá de reproducción</string>\n    <string name=\"import_network_expensive_warning\">Ten en cuenta qu\\'esta operación pue ser esixente cola rede.\n\\n\n\\n¿Quies siguir\\?</string>\n    <string name=\"export_to\">Esportar a</string>\n    <string name=\"import_from\">Importar dende</string>\n    <string name=\"import_title\">Importar</string>\n    <string name=\"show_original_time_ago_summary\">Los testos orxinales de los servicios van amosase nos elementos de les tresmisiones</string>\n    <string name=\"show_original_time_ago_title\">Amosar les marques de tiempu orixinales</string>\n    <string name=\"enable_disposed_exceptions_summary\">Forcia l\\'informe d\\'esceiciones Rx que nun se puen entregar fuera del ciclu de vida d\\'un fragmentu o actividá dempués de desanicialos</string>\n    <string name=\"enable_disposed_exceptions_title\">Informar de fallos fuera de ciclu</string>\n    <string name=\"show_memory_leaks\">Amosar los escapes de memoria</string>\n    <string name=\"enable_leak_canary_summary\">La supervisión de los escapes de memoria pue facer que l\\'aplicación nun respuenda al volquiar la pila</string>\n    <string name=\"caption_setting_description\">Modifica\\'l testu de los sotítulos y el so fondu. Rique\\'l reaniciu de l\\'aplicación pa que faiga efeutu.</string>\n    <string name=\"caption_auto_generated\">Xeneróse automáticamente</string>\n    <string name=\"playlist_no_uploader\">Xeneróse automáticamente (nun s\\'atopó\\'l xubidor)</string>\n    <string name=\"playlist_thumbnail_change_success\">Camudóse la miniatura de la llista de reproducción.</string>\n    <string name=\"playlist_add_stream_success\">Metióse nuna llista de reproducción</string>\n    <string name=\"playlist_creation_success\">Creóse la llista de reproducción</string>\n    <string name=\"unbookmark_playlist\">Desaniciar el marcador</string>\n    <string name=\"bookmark_playlist\">Amestar la llista a marcadores</string>\n    <string name=\"set_as_playlist_thumbnail\">Afitar como la miniatura de la llista</string>\n    <string name=\"unmute\">Desactivar el soníu</string>\n    <string name=\"mute\">Activar el soníu</string>\n    <string name=\"rename_playlist\">Renomar</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Consiguiendo la información…</string>\n    <string name=\"always_ask_open_action\">Entrugar siempres</string>\n    <string name=\"popup_player\">Reproductor en ventanu</string>\n    <string name=\"background_player\">Reproductor en segundu planu</string>\n    <string name=\"video_player\">Reproductor de videu</string>\n    <string name=\"preferred_open_action_settings_summary\">L\\'aición predeterminada al abrir conteníu — %s</string>\n    <string name=\"drawer_close\">Zarrar el caxón</string>\n    <string name=\"drawer_open\">Abrir el caxón</string>\n    <string name=\"enqueued\">Amestóse a la cola</string>\n    <string name=\"enqueue_stream\">Amestar a la cola</string>\n    <string name=\"hold_to_append\">Ten primío p\\'amestar a la cola</string>\n    <string name=\"play_queue_audio_settings\">Axustes del audiu</string>\n    <string name=\"play_queue_remove\">Desaniciar</string>\n    <string name=\"title_activity_play_queue\">Cola de reproducción</string>\n    <string name=\"most_liked\">Lo que más prestó</string>\n    <string name=\"recently_added\">Amestóse apocayá</string>\n    <string name=\"local\">Llocal</string>\n    <string name=\"no_valid_zip_file\">El ficheru ZIP nun ye válidu</string>\n    <string name=\"no_playlist_bookmarked_yet\">Entá nun hai llistes en marcadores</string>\n    <string name=\"select_a_playlist\">Esbilla d\\'una llista de reproducción</string>\n    <string name=\"no_channel_subscribed_yet\">Entá nun hai soscripciones a canales</string>\n    <string name=\"select_a_channel\">Esbilla d\\'una canal</string>\n    <string name=\"channel_page_summary\">Páxina d\\'una canal</string>\n    <string name=\"default_kiosk_page_summary\">Quioscu predetermináu</string>\n    <string name=\"kiosk_page_summary\">Páxina de quioscu</string>\n    <string name=\"title_most_played\">Lo más reproducío</string>\n    <string name=\"title_last_played\">Lo último reproducío</string>\n    <string name=\"app_license\">NewPipe ye software copyleft: pues usalu, estudialu, compartilu y ameyoralu como quieras. N\\'especial, pues redistribuyilu y/o modificalu baxo los términos de la GNU General Public License según espublizó la Free Software Foundation, quier la versión 3 de la llicencia quier (na to opinión) cualesquier versión posterior.</string>\n    <string name=\"privacy_policy_encouragement\">El proyeutu de NewPipe toma mui en serio la privacidá. Poro, l\\'aplicación nun recueye nengún datu ensin el to consentimientu.\n\\nLa política de privacidá de NewPipe desplica en detalle los datos que s\\'unvien y atroxen cuando unvies un informe de casque.</string>\n    <string name=\"app_description\">Un aplicación llibre pa ver/sentir plataformes de tresmisión n\\'Android.</string>\n    <string name=\"settings_file_replacement_character_title\">Caráuteres de troquéu</string>\n    <string name=\"settings_file_replacement_character_summary\">Los caráuteres que nun son válidos van trocase por esti valor</string>\n    <string name=\"done\">Fecho</string>\n    <string name=\"subtitle_activity_recaptcha\">Primi «Fecho» al resolvelu</string>\n    <string name=\"one_item_deleted\">Desanicióse 1 elementu.</string>\n    <string name=\"no_available_dir\">Defini una capeta de descargues dempués, nos axustes de l\\'aplicación</string>\n    <string name=\"msg_running_detail\">Toca pa los detalles</string>\n    <string name=\"msg_running\">Descarga de NewPipe</string>\n    <string name=\"msg_name\">Nome del ficheru</string>\n    <string name=\"rename\">Renomar</string>\n    <string name=\"pause\">Posar</string>\n    <string name=\"start\">Aniciar</string>\n    <string name=\"infinite_videos\">Vídeos ∞</string>\n    <string name=\"more_than_100_videos\">+100 vídeos</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s oyente</item>\n        <item quantity=\"other\">%s oyentes</item>\n    </plurals>\n    <string name=\"no_one_listening\">Naide nun ta sintiendo</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s espectador</item>\n        <item quantity=\"other\">%s espectadores</item>\n    </plurals>\n    <string name=\"no_one_watching\">Nun hai espectadores</string>\n    <string name=\"no_subscribers\">Nun hai soscriptores</string>\n    <string name=\"drawer_header_description\">Alternar el serviciu, esbillóse:</string>\n    <string name=\"retry\">Retentar</string>\n    <string name=\"detail_drag_description\">Arrastra pa reordenar</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Avatar del xubidor</string>\n    <string name=\"detail_thumbnail_view_description\">Reproducción d\\'un videu, duración:</string>\n    <string name=\"your_comment\">Un comentariu (n\\'inglés):</string>\n    <string name=\"what_happened_headline\">Qué pasó:</string>\n    <string name=\"error_snackbar_action\">Informar</string>\n    <string name=\"error_report_open_github_notice\">Comprueba si yá esiste un problema qu\\'alderique esti casque, por favor. Al crear informes duplicaos faes que perdamos el tiempu que podríemos dedicar a iguar el fallu.</string>\n    <string name=\"error_report_open_issue_button_text\">Informar en GitHub</string>\n    <string name=\"copy_for_github\">Copiar l\\'informe con formatu</string>\n    <string name=\"error_report_button_text\">Informar d\\'esti fallu per corréu</string>\n    <string name=\"permission_display_over_apps\">Da\\'l permisu p\\'amosar NewPipe penriba d\\'otres aplicaciones</string>\n    <string name=\"saved_tabs_invalid_json\">Nun pudieron lleese les llingüetes guardaes polo que van usase les predeterminaes</string>\n    <string name=\"no_streams_available_download\">Nun hai fluxos disponibles pa baxar</string>\n    <string name=\"file_name_empty_error\">El nome del ficheru nun pue tar baleru</string>\n    <string name=\"invalid_source\">El ficheru/orixe del conteníu nun esiste</string>\n    <string name=\"invalid_directory\">La carpeta nun esiste</string>\n    <string name=\"audio_streams_empty\">Nun s\\'atoparon fluxos d\\'audiu</string>\n    <string name=\"video_streams_empty\">Nun s\\'atoparon fluxos de videu</string>\n    <string name=\"player_recoverable_failure\">L\\'aplicación ta recuperándose d\\'un fallu del reproductor</string>\n    <string name=\"app_ui_crash\">L\\'aplicación/IU cascó</string>\n    <string name=\"could_not_setup_download_menu\">Nun pudo configurase\\'l menú de descarga</string>\n    <string name=\"content_not_available\">El conteníu nun ta disponible</string>\n    <string name=\"network_error\">Fallu de la rede</string>\n    <string name=\"download_to_sdcard_error_message\">La descarga a la tarxeta SD nun ye posible. ¿Reafitar l\\'allugamientu de la carpeta de descarga\\?</string>\n    <string name=\"download_to_sdcard_error_title\">L\\'almacenamientu esternu nun ta disponible</string>\n    <string name=\"search_history_deleted\">Desanicióse l\\'historial de busques.</string>\n    <string name=\"clear_search_history_summary\">Desanicia l\\'historial de les pallabres clave de busca</string>\n    <string name=\"clear_search_history_title\">Llimpiar l\\'historial de busca</string>\n    <string name=\"watch_history_states_deleted\">Desaniciáronse los puntos de reproducción.</string>\n    <string name=\"delete_playback_states_alert\">¿Desaniciar tolos puntos de reproducción\\?</string>\n    <string name=\"clear_playback_states_summary\">Desanicia tolos puntos de reproducción</string>\n    <string name=\"clear_playback_states_title\">Desaniciar los puntos de reproducción</string>\n    <string name=\"watch_history_deleted\">Desanicióse l\\'historial de vídeos vistos.</string>\n    <string name=\"delete_view_history_alert\">¿Desaniciar tol historial de vídeos vistos\\?</string>\n    <string name=\"clear_views_history_summary\">Desanicia l\\'historial de fluxos reproducíos y el de puntos de reproducción</string>\n    <string name=\"clear_views_history_title\">Llimpiar l\\'historial de los vídeos vistos</string>\n    <string name=\"clear_cookie_summary\">Llimpia les cookies que NewPipe atrroxa cuando soluciones un reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Llimpiáronse les cookies de reCAPTCHA</string>\n    <string name=\"clear_cookie_title\">Llimpiar les cookies de reCAPTCHA</string>\n    <string name=\"switch_to_main\">Cambiar al reproductor principal</string>\n    <string name=\"switch_to_popup\">Cambiar al reproductor en ventanu</string>\n    <string name=\"switch_to_background\">Cambiar al reproductor en segundu planu</string>\n    <string name=\"app_update_notification_channel_description\">Anovamientos pa NewPipe</string>\n    <string name=\"app_update_notification_channel_name\">Avisos d\\'anovamientos</string>\n    <string name=\"notification_channel_description\">Avisos de los reproductores en segundu planu y en ventanu de NewPipe</string>\n    <string name=\"just_once\">Namás una vegada</string>\n    <string name=\"file_deleted\">Desanicióse\\'l ficheru</string>\n    <string name=\"undo\">Desfacer</string>\n    <string name=\"disabled\">Desactivóse</string>\n    <string name=\"artists\">Artistes</string>\n    <string name=\"albums\">Álbumes</string>\n    <string name=\"songs\">Canciones</string>\n    <string name=\"all\">Too</string>\n    <string name=\"error_report_title\">Informe d\\'un fallu</string>\n    <string name=\"restricted_video\">Tien una torga por edá.\n\\n\n\\nActiva «%1$s» nos axustes de l\\'aplicación si quies velu.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube forne\\'l «Mou torgáu» qu\\'anubre conteníu\\'l que seya potencialmente p\\'adultos</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Activar el «Mou torgáu» de YouTube</string>\n    <string name=\"show_age_restricted_content_summary\">Amuesa\\'l conteníu que quiciabes nun seya afayadizu pa guaḥes porque tien una llende d\\'edá (como +18)</string>\n    <string name=\"settings_category_debug_title\">Depuración</string>\n    <string name=\"peertube_instance_add_https_only\">Namás se sofiten URLs HTTPS</string>\n    <string name=\"peertube_instance_add_help\">Introduz la URL d\\'una instancia</string>\n    <string name=\"peertube_instance_add_title\">Amiestu d\\'una instancia</string>\n    <string name=\"peertube_instance_url_help\">Atopa les instancies que te presten en %s</string>\n    <string name=\"peertube_instance_url_summary\">Esbilla les instancies de PeerTube que prefieras</string>\n    <string name=\"unsupported_url_dialog_message\">Nun pudo reconocese la URL. ¿Abrila con otra aplicación\\?</string>\n    <string name=\"show_hold_to_append_summary\">Amuesa\\'l mensaxe al primir el nel botón «En segundu planu» o «Ventanu» nel «Details:» de los vídeos</string>\n    <string name=\"show_hold_to_append_title\">Amosar el mensaxe «Ten primío p\\'amestar a la cola»</string>\n    <string name=\"show_next_and_similar_title\">Amosar los vídeos siguientes y asemeyaos</string>\n    <string name=\"download_dialog_title\">Descarga</string>\n    <string name=\"enable_watch_history_summary\">Rexistra los vídeos vistos</string>\n    <string name=\"enable_playback_state_lists_summary\">Amuesa los indicadores de los puntos de reprodución nes llistes</string>\n    <string name=\"enable_playback_state_lists_title\">Puntos de reproducción nes llistes</string>\n    <string name=\"enable_playback_resume_summary\">Restaura l\\'últimu puntu de reproducción</string>\n    <string name=\"enable_watch_history_title\">Historial de vídeos vistos</string>\n    <string name=\"auto_queue_toggle\">Cola automática</string>\n    <string name=\"auto_queue_summary\">Amiesta un videu rellacionáu a la cola cuando se repoduz l\\'últimu videu a una cola ensin repitición</string>\n    <string name=\"auto_queue_title\">Meter les tresmisiones siguientes a cola automática</string>\n    <string name=\"clear_queue_confirmation_description\">Va trocase la cola del reproductor activu</string>\n    <string name=\"clear_queue_confirmation_summary\">Cambiar d\\'un reproductor a otru pue trocar la cola</string>\n    <string name=\"clear_queue_confirmation_title\">Confirmar la llimpieza de les coles</string>\n    <string name=\"seek_duration_title\">Duración de la gueta del avance/rebobináu rápidu</string>\n    <string name=\"use_inexact_seek_summary\">La gueta imprecisa permite al reproductor que guete les posiciones más rápido con menos precisión. La gueta de 5, 15 ó 25 segundos nun funciona con esti axuste.</string>\n    <string name=\"use_inexact_seek_title\">Usar la gueta rápida imprecisa</string>\n    <string name=\"popup_remember_size_pos_summary\">Acuérdase del últimu tamañu y la última posición del ventanu</string>\n    <string name=\"popup_remember_size_pos_title\">Acordase de les propiedaes del ventanu</string>\n    <string name=\"notification_colorize_summary\">Fai qu\\'Android personalice\\'l color del avisu permanente según el color principal de les miniatures (decátate qu\\'esto nun ta disponible en tolos preseos)</string>\n    <string name=\"notification_colorize_title\">Avisu con color</string>\n    <string name=\"notification_action_nothing\">Nada</string>\n    <string name=\"notification_action_buffering\">Atroxar nel búfer</string>\n    <string name=\"notification_action_shuffle\">Al debalu</string>\n    <string name=\"notification_action_repeat\">Repitir</string>\n    <string name=\"notification_actions_at_most_three\">¡Pues esbillar tres aiciones como máximu p\\'amosar nel avisu permanente!</string>\n    <string name=\"notification_actions_summary\">Edita cada aición d\\'embaxo tocando nelles. Esbilla hasta tres p\\'amosales nel avisu compautu col usu de los caxellos de la derercha.</string>\n    <string name=\"notification_action_4_title\">Quintu botón d\\'aición</string>\n    <string name=\"notification_action_3_title\">Cuartu botón d\\'aición</string>\n    <string name=\"notification_action_2_title\">Tercer botón d\\'aición</string>\n    <string name=\"notification_action_1_title\">Segundu botón d\\'aición</string>\n    <string name=\"notification_action_0_title\">Primer botón d\\'aición</string>\n    <string name=\"notification_scale_to_square_image_summary\">Escala les miniatures de los vídeos que s\\'amuesen nel avisu permanente de los 16:9 al 1:1 (podría distorsionar les imáxenes)</string>\n    <string name=\"notification_scale_to_square_image_title\">Afitar la escala 1:1 a les miniatures</string>\n    <string name=\"download_path_audio_dialog_title\">Escueyi la carpeta de descarga pa los ficheros d\\'audiu</string>\n    <string name=\"download_path_audio_summary\">Los ficheros d\\'audiu baxaos atróxense equí</string>\n    <string name=\"download_path_audio_title\">Carpeta de la descarga d\\'audiu</string>\n    <string name=\"download_path_dialog_title\">Escueyi la carpeta de descarga pa los ficheros de videu</string>\n    <string name=\"download_path_summary\">Los ficheros de videu baxaos atróxense equí</string>\n    <string name=\"download_path_title\">Carpeta de la descarga de vídeos</string>\n    <string name=\"controls_add_to_playlist_title\">Meter nuna llista</string>\n    <string name=\"subscription_change_failed\">Nun pudo camudar la soscripción</string>\n    <string name=\"channel_unsubscribed\">Esborriéstite de la canal</string>\n    <string name=\"search_showing_result_for\">Amosando los resultaos de: %s</string>\n    <string name=\"controls_download_desc\">Baxar el ficheru de fluxos</string>\n    <string name=\"download\">Baxar</string>\n    <string name=\"open_in_popup_mode\">Abrir nel mou ventanu</string>\n    <string name=\"install\">Instalar</string>\n    <string name=\"no_player_found\">Nun s\\'atopó nengún reproductor de fluxos. ¿Instalar VLC\\?</string>\n    <string name=\"main_bg_subtitle\">Toca «Buscar» pa entamar</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-b+uz+Latn/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"use_external_video_player_title\">Tashqi video pleerdan foydalanish</string>\n    <string name=\"share_dialog_title\">Bilan baham ko\\'rish</string>\n    <string name=\"search_showing_result_for\">%s uchun natijalar ko\\'rsatilmoqda</string>\n    <string name=\"did_you_mean\">\\\"%1$s\\\" demoqchimisiz\\?</string>\n    <string name=\"settings\">Sozlashlar</string>\n    <string name=\"search\">Qidirish</string>\n    <string name=\"controls_download_desc\">stream faylni yuklab olish</string>\n    <string name=\"download\">Yuklab olish</string>\n    <string name=\"share\">Baham ko\\'rish</string>\n    <string name=\"install\">O\\'rnatish</string>\n    <string name=\"open_in_browser\">Brauzerda ochish</string>\n    <string name=\"open_in_popup_mode\">Pop-up rejimda ochish</string>\n    <string name=\"cancel\">Bekor qilish</string>\n    <string name=\"no_player_found_toast\">Stream pleer topilmadi (uni ijro etish uchun VLC o\\'rnatishingiz mumkin).</string>\n    <string name=\"no_player_found\">Hech qanday translatsiya pleyeri topilmadi. VLC o\\'rnatilsinmi\\?</string>\n    <string name=\"upload_date_text\">%1$s tomonidan e‘lon qilingan</string>\n    <string name=\"main_bg_subtitle\">Boshlash uchun \\\"Izlash\\\" tugmasini bosing</string>\n    <string name=\"auto_queue_toggle\">Avto-navbat</string>\n    <string name=\"auto_queue_summary\">Tegishli stream qo\\'shib, ijro etish navbatini tugatishni (takrorlanmaydigan) davom ettirish</string>\n    <string name=\"auto_queue_title\">avtomatik navbat next stream</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metadata keshi o\\'chirildi</string>\n    <string name=\"metadata_cache_wipe_summary\">Barcha keshlangan veb-sahifa ma\\'lumotlarini olib tashlash</string>\n    <string name=\"metadata_cache_wipe_title\">Keshlangan metadatalarni o\\'chirish</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Rasm keshi o\\'chirildi</string>\n    <string name=\"show_comments_summary\">sharhlarni yashirishni o\\'chirish</string>\n    <string name=\"show_comments_title\">Izohlarni ko\\'rsatish</string>\n    <string name=\"clear_queue_confirmation_description\">Aktiv ijro etish navbati almashtiriladi</string>\n    <string name=\"clear_queue_confirmation_summary\">Bir ijro etishdan boshqasiga o\\'tish sizning navbatingizni almashtirishi mumkin</string>\n    <string name=\"clear_queue_confirmation_title\">Navbatni tozalashdan oldin tasdiqlashni so\\'rash</string>\n    <string name=\"seek_duration_title\">Oldinga tez / oldinga siljish davomiyligini qidirish</string>\n    <string name=\"use_inexact_seek_summary\">Noto\\'g\\'ri izlash ijro etuvchiga aniqlikni pasayishi bilan tezroq pozitsiyalarni qidirishga imkon beradi. 5, 15 yoki 25 soniyani qidirish bu bilan ishlamaydi.</string>\n    <string name=\"use_inexact_seek_title\">Tez aniq bo\\'lmagan izlashdan foydalanish</string>\n    <string name=\"black_theme_title\">Qora</string>\n    <string name=\"dark_theme_title\">qorong\\'i</string>\n    <string name=\"light_theme_title\">Yorug\\'</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"default_video_format_title\">Standart video format</string>\n    <string name=\"default_audio_format_title\">Standart audio format</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"notification_action_nothing\">Hech narsa</string>\n    <string name=\"notification_action_buffering\">Buferlash</string>\n    <string name=\"notification_action_shuffle\">Aralash</string>\n    <string name=\"notification_action_repeat\">Takrorlash</string>\n    <string name=\"notification_actions_at_most_three\">Bildirishnomada ko\\'rsatish uchun eng ko\\'p uchta amalni tanlashingiz mumkin!</string>\n    <string name=\"notification_actions_summary\">Quyidagi har bir bildirishnomani ustiga bosib uni tahrir qiling. O\\'ng tomondagi katakchalar yordamida ixcham bildirishnomada ko\\'rsatilishi uchun ulardan uchtasini tanlang.</string>\n    <string name=\"notification_action_4_title\">Beshinchi harakat tugmasi</string>\n    <string name=\"notification_action_3_title\">To\\'rtinchi harakat tugmasi</string>\n    <string name=\"notification_action_2_title\">Uchinchi harakat tugmasi</string>\n    <string name=\"notification_action_1_title\">Ikkinchi harakat tugmasi</string>\n    <string name=\"notification_action_0_title\">Birinchi harakat tugmasi</string>\n    <string name=\"notification_scale_to_square_image_summary\">Bildirishnomada ko\\'rsatilgan video eskizini 16: 9dan 1: 1 gacha tomonlarning nisbatiga qarab o\\'lchamang (buzilishlarni keltirib chiqarishi mumkin)</string>\n    <string name=\"notification_scale_to_square_image_title\">Eskizini 1: 1 tomonlar nisbatiga o‘lchash</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi media-markazi orqali videoni ijro etish variantini ko\\'rsatish</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi bilan ijro etish\\\" parametrini ko\\'rsatish</string>\n    <string name=\"kore_not_found\">missing Kore dasturini o\\'rnatasizmi\\?</string>\n    <string name=\"play_with_kodi_title\">Kodi bilan ijro etish</string>\n    <string name=\"show_higher_resolutions_summary\">Faqat ba\\'zi qurilmalar 2K / 4K videolarni ijro etishi mumkin</string>\n    <string name=\"show_higher_resolutions_title\">Yuqori o\\'lchamlarni ko\\'rsatish</string>\n    <string name=\"default_popup_resolution_title\">Standart pop-up o\\'lchamlari</string>\n    <string name=\"default_resolution_title\">Standart o\\'lchamlari</string>\n    <string name=\"download_path_audio_dialog_title\">Audio fayllar uchun yuklab olish papkasini tanlash</string>\n    <string name=\"download_path_summary\">Yuklab olingan videofayllar shu yerda saqlanadi</string>\n    <string name=\"download_path_audio_summary\">Yuklab olingan audio fayllar shu yerda saqlanadi</string>\n    <string name=\"download_path_audio_title\">Ovozni yuklab olish papkasi</string>\n    <string name=\"download_path_dialog_title\">Video fayllar uchun yuklab olish papkasini tanlash</string>\n    <string name=\"download_path_title\">Videoni yuklab olish jildi</string>\n    <string name=\"controls_add_to_playlist_title\">Qo\\'shish</string>\n    <string name=\"controls_popup_title\">Qalqib ko\\'rinish</string>\n    <string name=\"controls_background_title\">Fon ko\\'rinishi</string>\n    <string name=\"tab_bookmarks\">Yorliqlangan pleylistlar</string>\n    <string name=\"tab_choose\">Yorliqni tanlash</string>\n    <string name=\"tab_subscriptions\">Obunalar</string>\n    <string name=\"show_info\">Ma\\'lumotni ko\\'rsatish</string>\n    <string name=\"subscription_update_failed\">Obunani yangilab bo\\'lmadi</string>\n    <string name=\"subscription_change_failed\">Obunani o\\'zgartirib bo\\'lmadi</string>\n    <string name=\"channel_unsubscribed\">Kanal obunasi bekor qilindi</string>\n    <string name=\"unsubscribe\">Obunani bekor qilish</string>\n    <string name=\"subscribed_button_title\">Obuna bo\\'lindi</string>\n    <string name=\"subscribe_button_title\">Obuna bo\\'lish</string>\n    <string name=\"use_external_audio_player_title\">Tashqi audio pleerdan foydalanish</string>\n    <string name=\"use_external_video_player_summary\">Ba\\'zi piksellarda ovozni o\\'chirish</string>\n    <string name=\"clear_views_history_title\">Tomosha tarixini tozalash</string>\n    <string name=\"clear_cookie_summary\">ReCAPTCHA-ni hal qilganingizda NewPipe-da saqlanadigan cookie-fayllarni o\\'chirib tashlang</string>\n    <string name=\"export_data_summary\">Eksport tarixi, obunalari va pleylistlari</string>\n    <string name=\"import_data_summary\">Joriy tarixingiz va obunalaringizni bekor qiladi</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA cookies fayllari o\\'chirildi</string>\n    <string name=\"clear_cookie_title\">ReCAPTCHA cookie-fayllarini o\\'chirish</string>\n    <string name=\"export_data_title\">Ma\\'lumotlar bazasini eksport qilish</string>\n    <string name=\"import_data_title\">Ma\\'lumotlar bazasini import qilish</string>\n    <string name=\"switch_to_main\">Asosiyga o\\'tish</string>\n    <string name=\"switch_to_popup\">Pop-upga o\\'tish</string>\n    <string name=\"switch_to_background\">Orqa fonga o\\'tish</string>\n    <string name=\"unknown_content\">[Noma\\'lum]</string>\n    <string name=\"app_update_notification_channel_description\">NewPipe yangi versiyasi haqida bildirishnomalar</string>\n    <string name=\"app_update_notification_channel_name\">Ilovani yangilash bildirishnomasi</string>\n    <string name=\"notification_channel_description\">NewPipe fon va popup pleyerlari uchun bildirishnomalar</string>\n    <string name=\"notification_channel_name\">NewPipe bildirishnomasi</string>\n    <string name=\"file\">Fayl</string>\n    <string name=\"just_once\">Faqat bittasi</string>\n    <string name=\"always\">Har doim</string>\n    <string name=\"play_all\">Barchasini ijro etish</string>\n    <string name=\"file_deleted\">Fayl o\\'chirildi</string>\n    <string name=\"undo\">Bekor qilish</string>\n    <string name=\"best_resolution\">Eng yaxshi qaror</string>\n    <string name=\"clear\">Tozalash</string>\n    <string name=\"disabled\">Ijrochilar o\\'chirib qo\\'yilgan</string>\n    <string name=\"artists\">Artistlar</string>\n    <string name=\"albums\">Albomlar</string>\n    <string name=\"songs\">Qo\\'shiqlar</string>\n    <string name=\"events\">Natijalar</string>\n    <string name=\"users\">Foydalanuvchilar</string>\n    <string name=\"tracks\">Treklar</string>\n    <string name=\"videos_string\">Videolar</string>\n    <string name=\"playlists\">Playlistlar</string>\n    <string name=\"channels\">Kanallar</string>\n    <string name=\"all\">Hammasi</string>\n    <string name=\"error_report_title\">Xato haqida xabar berish</string>\n    <string name=\"downloads_title\">Yuklanganlar</string>\n    <string name=\"downloads\">Yuklanganlar</string>\n    <string name=\"duration_live\">Jonli</string>\n    <string name=\"restricted_video\">Ushbu video yoshga cheklangan.\n\\n\n\\nAgar xohlasangiz, sozlamalarda \\\"%1$s\\\" ni yoqing.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube \\\"cheklangan rejim\\\" ni taqdim etadi, u katta yoshlilar uchun tarkibni yashiradi.</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTube-ning \\\"Cheklangan rejimi\\\" ni yoqish</string>\n    <string name=\"show_age_restricted_content_summary\">Tarkibni bolalar uchun yaroqsiz deb ko\\'rsating, chunki uning yosh chegarasi bor (18+ kabi).</string>\n    <string name=\"show_age_restricted_content_title\">Yoshi cheklangan tarkibni ko\\'rsatish</string>\n    <string name=\"content\">Tarkib</string>\n    <string name=\"popup_playing_toast\">Pop-up rejimda ijro etish</string>\n    <string name=\"background_player_playing_toast\">Ijro etish foni</string>\n    <string name=\"settings_category_updates_title\">Yangilanishlar</string>\n    <string name=\"settings_category_debug_title\">Nosozliklarni tuzatish</string>\n    <string name=\"settings_category_appearance_title\">Tashqi ko\\'rinish</string>\n    <string name=\"settings_category_history_title\">Tarix va kesh</string>\n    <string name=\"settings_category_video_audio_title\">Video va audio</string>\n    <string name=\"settings_category_player_behavior_title\">Xatti-harakat</string>\n    <string name=\"settings_category_player_title\">Ijro etish</string>\n    <string name=\"peertube_instance_add_exists\">Namuna allaqachon mavjud</string>\n    <string name=\"peertube_instance_add_https_only\">Faqat HTTPS URL-lari qo\\'llab-quvvatlanadi</string>\n    <string name=\"peertube_instance_add_fail\">Namunani tasdiqlab bo\\'lmadi</string>\n    <string name=\"peertube_instance_add_help\">Namuna URL manzilini kiriting</string>\n    <string name=\"peertube_instance_add_title\">Namuna qo\\'shish</string>\n    <string name=\"peertube_instance_url_help\">%s da sizga yoqadigan misollarni toping</string>\n    <string name=\"peertube_instance_url_summary\">Sevimli PeerTube nusxalarini tanlang</string>\n    <string name=\"peertube_instance_url_title\">PeerTube misollari</string>\n    <string name=\"content_language_title\">Standart kontent tili</string>\n    <string name=\"default_content_country_title\">Standart kontent mamlakati</string>\n    <string name=\"unsupported_url_dialog_message\">URL manzili aniqlanmadi. Boshqa ilova bilan ochilsinmi\\?</string>\n    <string name=\"unsupported_url\">Qo\\'llab-quvvatlanmaydigan URL manzili</string>\n    <string name=\"show_hold_to_append_summary\">\\\"Tafsilotlar:\\\" videodagi fon yoki po-pup tugmachasini bosganda ko\\'rsatma.</string>\n    <string name=\"show_hold_to_append_title\">\\\"Qo\\'shish uchun ushlab turish\\\" maslahatini ko\\'rsatish</string>\n    <string name=\"show_next_and_similar_title\">\\'Keyingi\\' va \\'O\\'xshash\\' videolarni namoyish etish</string>\n    <string name=\"autoplay_title\">Avtoplay</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Uzilishlardan keyin ijro etishni davom ettirish (masalan. phonecalls)</string>\n    <string name=\"download_dialog_title\">Yuklab olish</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Ijro etishni davom ettirish</string>\n    <string name=\"enable_watch_history_summary\">Ko\\'rilgan videolarni kuzatib borish</string>\n    <string name=\"settings_category_clear_data_title\">Ma\\'lumotlarni tozalash</string>\n    <string name=\"enable_playback_state_lists_summary\">Ro\\'yxatlarda ijro holati ko\\'rsatkichlarini ko\\'rsatish</string>\n    <string name=\"enable_playback_state_lists_title\">Ro\\'yxatlardagi pozitsiyalar</string>\n    <string name=\"enable_playback_resume_summary\">Oxirgi ijro holatini tiklash</string>\n    <string name=\"enable_playback_resume_title\">Ijro etishni davom ettirish</string>\n    <string name=\"show_search_suggestions_summary\">Qidirayotganda takliflarni ko\\'rsatish</string>\n    <string name=\"enable_watch_history_title\">Tarixni ko\\'rish</string>\n    <string name=\"enable_search_history_summary\">Qidiruv so\\'rovlarini mahalliy sifatida saqlash</string>\n    <string name=\"enable_search_history_title\">Qidiruv tarixi</string>\n    <string name=\"show_search_suggestions_title\">Takliflarni qidirish</string>\n    <string name=\"could_not_import_all_files\">Ogohlantirish: Barcha fayllarni import qilib bo\\'lmadi.</string>\n    <string name=\"no_valid_zip_file\">Haqiqiy ZIP fayli yo‘q</string>\n    <string name=\"import_complete_toast\">Import qilindi</string>\n    <string name=\"export_complete_toast\">Eksport qilindi</string>\n    <string name=\"select_a_kiosk\">kiosk tanlash</string>\n    <string name=\"no_playlist_bookmarked_yet\">Hali pleylist xatcho\\'plari yo\\'q</string>\n    <string name=\"select_a_playlist\">Pleylistni tanlang</string>\n    <string name=\"no_channel_subscribed_yet\">Hech qanday kanal obunasi yo\\'q</string>\n    <string name=\"select_a_channel\">Kanal tanlash</string>\n    <string name=\"channel_page_summary\">Kanal sahifasi</string>\n    <string name=\"default_kiosk_page_summary\">Standart kiosk</string>\n    <string name=\"kiosk_page_summary\">Kiosk sahifasi</string>\n    <string name=\"blank_page_summary\">Bo\\'sh sahifa</string>\n    <string name=\"main_page_content_summary\">Asosiy sahifada qanday yorliqlar ko\\'rsatilgan</string>\n    <string name=\"main_page_content\">Asosiy sahifaning tarkibi</string>\n    <string name=\"title_most_played\">Eng ko\\'p ijrolar etilganlar</string>\n    <string name=\"title_last_played\">Oxirgi ijro</string>\n    <string name=\"delete_item_search_history\">Ushbu narsani qidiruv tarixidan o\\'chirmoqchimisiz\\?</string>\n    <string name=\"action_history\">Tarix</string>\n    <string name=\"title_activity_history\">Tarix</string>\n    <string name=\"read_full_license\">Litsenziyani o\\'qish</string>\n    <string name=\"app_license\">NewPipe - bu nusxa ko\\'chirish dasturiy ta\\'minotidir: Siz foydalanishingiz, baham ko\\'rishingiz va o\\'zingizning xohishingiz bilan yaxshilashingiz mumkin. Xususan, siz uni bepul dasturiy ta\\'minot fondi tomonidan e\\'lon qilingan GNU umumiy jamoat litsenziyasi shartlari asosida qayta tarqatishingiz va / yoki o\\'zgartirishingiz mumkin, Litsenziyaning 3-versiyasi yoki (sizning xohishingizga ko\\'ra) har qanday keyingi versiyada.</string>\n    <string name=\"app_license_title\">NewPipe litsenziyasi</string>\n    <string name=\"read_privacy_policy\">Maxfiylik siyosatini o\\'qish</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe loyihasi sizning shaxsiy hayotingizga jiddiy e\\'tibor beradi. Shuning uchun ilova sizning roziligingizsiz biron bir ma\\'lumot to\\'plamaydi.\n\\nNewPipe-ning maxfiylik siyosati halokat to\\'g\\'risidagi hisobotni yuborganingizda qanday ma\\'lumotlar yuborilishi va saqlanishi haqida batafsil ma\\'lumot beradi.</string>\n    <string name=\"privacy_policy_title\">NewPipe-ning maxfiylik siyosati</string>\n    <string name=\"website_encouragement\">Qo\\'shimcha ma\\'lumot va yangiliklar uchun NewPipe veb-saytiga tashrif buyuring.</string>\n    <string name=\"website_title\">Websayt</string>\n    <string name=\"give_back\">Qaytarib berish</string>\n    <string name=\"donation_title\">Hadya etish</string>\n    <string name=\"donation_encouragement\">NewPipe ko\\'ngillilar tomonidan bo\\'sh vaqtlarini sarflash orqali sizga eng yaxshi foydalanuvchi tajribasini taqdim etadi. Ishlab chiquvchilarga bir chashka qahvadan zavqlanib, NewPipe-ni yanada yaxshiroq qilishlariga yordam berish.</string>\n    <string name=\"view_on_github\">GitHubda ko\\'rish</string>\n    <string name=\"contribution_encouragement\">Sizda g\\'oyalar bormi; tarjima, dizayndagi o\\'zgarishlar, kodni tozalash yoki haqiqiy og\\'ir kodni o\\'zgartirish - yordam har doim mamnuniyat bilan qabul qilinadi. Qancha ko\\'p ish qilinsa, shuncha yaxshi bo\\'ladi!</string>\n    <string name=\"contribution_title\">Hissa qo\\'shish</string>\n    <string name=\"app_description\">Androidda Libre yengil streaming.</string>\n    <string name=\"tab_licenses\">Litsenziyalar</string>\n    <string name=\"tab_about\">Haqida</string>\n    <string name=\"copyright\">© %1$s tomonidan %2$s gacha %3$s</string>\n    <string name=\"title_licenses\">Uchinchi tomon litsenziyalari</string>\n    <string name=\"title_activity_about\">NewPipe haqida</string>\n    <string name=\"charset_most_special_characters\">Ko\\'pchilik maxsus belgilar</string>\n    <string name=\"charset_letters_and_digits\">Yozuvlar va raqamlar</string>\n    <string name=\"settings_file_replacement_character_title\">O\\'zgartirish belgisi</string>\n    <string name=\"settings_file_replacement_character_summary\">Noto\\'g\\'ri belgilar ushbu qiymat bilan almashtiriladi</string>\n    <string name=\"settings_file_charset_title\">Fayl nomidagi ruxsat berilgan belgilar</string>\n    <string name=\"settings_category_downloads_title\">Yuklab olish</string>\n    <string name=\"done\">Bajarildi</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA muammosi so\\'raldi</string>\n    <string name=\"subtitle_activity_recaptcha\">Hal etilganda \\\"Bajarildi\\\" tugmasini bosing</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA muammosi</string>\n    <string name=\"one_item_deleted\">1 ta element o\\'chirildi.</string>\n    <string name=\"msg_popup_permission\">Ushbu ruxsat zarur\n\\npopup rejimida oching</string>\n    <string name=\"no_available_dir\">Yuklab olish papkasini keyinroq sozlamalarda belgilang</string>\n    <string name=\"msg_copied\">Buferga nusxa olindi</string>\n    <string name=\"msg_wait\">Iltimos kuting…</string>\n    <string name=\"msg_running_detail\">Tafsilotlar uchun bosing</string>\n    <string name=\"msg_running\">NePipe yuklab olinmoqda</string>\n    <string name=\"msg_error\">Xato</string>\n    <string name=\"msg_threads\">Iplar</string>\n    <string name=\"msg_name\">Faylnomi</string>\n    <string name=\"ok\">Ok</string>\n    <string name=\"rename\">Nomni o\\'zgartirish</string>\n    <string name=\"dismiss\">Tarqatish</string>\n    <string name=\"checksum\">Sumnazorat</string>\n    <string name=\"delete\">O\\'chirish</string>\n    <string name=\"create\">Yaratish</string>\n    <string name=\"pause\">Pauza</string>\n    <string name=\"start\">Boshlash</string>\n    <string name=\"no_comments\">Izohlar yo\\'q</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">%s videolar</item>\n    </plurals>\n    <string name=\"infinite_videos\">∞ videolar</string>\n    <string name=\"more_than_100_videos\">100+ videolar</string>\n    <string name=\"no_videos\">Videolar yo\\'q</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s tinglovchi</item>\n        <item quantity=\"other\">%s tinglovchilar</item>\n    </plurals>\n    <string name=\"no_one_listening\">Hech kim tinglamayapti</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s ko\\'ryapti</item>\n        <item quantity=\"other\">%s ko\\'ryaptilar</item>\n    </plurals>\n    <string name=\"no_one_watching\">Hech kim ko\\'rmayapti</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s ko\\'rish</item>\n        <item quantity=\"other\">%s ko\\'rishlar</item>\n    </plurals>\n    <string name=\"no_views\">Ko\\'rishlar yo\\'q</string>\n    <string name=\"subscribers_count_not_available\">Obunachilar soni mavjud emas</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s bunachisi</item>\n        <item quantity=\"other\">%s obunachilar</item>\n    </plurals>\n    <string name=\"no_subscribers\">Obunachilar yo\\'q</string>\n    <string name=\"drawer_header_description\">Hozirda tanlangan xizmatni yoqish:</string>\n    <string name=\"retry\">Qayta</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"video\">Video</string>\n    <string name=\"detail_drag_description\">Qayta tartiblash uchun tortish</string>\n    <string name=\"empty_list_subtitle\">Bu erda kriketlardan boshqa hech narsa yo\\'q</string>\n    <string name=\"search_no_results\">Natija yo\\'q</string>\n    <string name=\"detail_dislikes_img_view_description\">Dislayklar</string>\n    <string name=\"detail_likes_img_view_description\">Layklar</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Yuklovchining avatar eskizi</string>\n    <string name=\"detail_thumbnail_view_description\">Videoni ijro etish muddati, davomiyligi:</string>\n    <string name=\"error_details_headline\">Detallar:</string>\n    <string name=\"your_comment\">Sizning sharhingiz (ingliz tilida):</string>\n    <string name=\"info_labels\">Nima: \\n So\\'rov: \\nTarkib tili: \\nTarkib mamlakati: \\nIlova tili: \\\\ nXizmat: \\\\ nGMT vaqti: \\\\ nPaket: \\\\ nVersion: \\\\ nOS versiyasi:</string>\n    <string name=\"what_happened_headline\">Nima sodir bo\\'ldi:</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"error_snackbar_action\">Hisobot</string>\n    <string name=\"error_snackbar_message\">Kechirasiz, biron bir xato yuz berdi.</string>\n    <string name=\"error_report_open_github_notice\">Iltimos, sizning harakatingizni muhokama qiladigan muammo allaqachon mavjudligini tekshiring. Ikki nusxadagi ticketlarni yaratishda siz bizdan vaqt ajratib, biz haqiqiy xatolarni tuzatishga sarflashimiz mumkin edi.</string>\n    <string name=\"error_report_open_issue_button_text\">GitHub haqida hisobot</string>\n    <string name=\"copy_for_github\">Formatlangan hisobotni nusxalash</string>\n    <string name=\"error_report_button_text\">Ushbu xato haqida elektron pochta orqali xabar berish</string>\n    <string name=\"sorry_string\">Kechirasiz, bunday bo\\'lmasligi kerak edi.</string>\n    <string name=\"permission_display_over_apps\">Boshqa ilovalar orqali ko\\'rsatishga ruxsat berish</string>\n    <string name=\"restore_defaults_confirmation\">Birlamchi parametrlarni tiklashni xohlaysizmi\\?</string>\n    <string name=\"restore_defaults\">Birlamchi parametrlarni tiklash</string>\n    <string name=\"saved_tabs_invalid_json\">Saqlangan yorliqlarni o\\'qib bo\\'lmadi, shuning uchun standartlardan foydalaning</string>\n    <string name=\"no_streams_available_download\">Yuklash uchun stream mavjud emas</string>\n    <string name=\"error_occurred_detail\">Xato yuz berdi: %1$s</string>\n    <string name=\"file_name_empty_error\">Fayl nomi bo\\'sh bo\\'lishi mumkin emas</string>\n    <string name=\"invalid_file\">Fayl mavjud emas yoki uni o\\'qish yoki yozish uchun ruxsat yo\\'q</string>\n    <string name=\"invalid_source\">Bunday fayl / tarkib manbai yo\\'q</string>\n    <string name=\"invalid_directory\">Bunday papka yo\\'q</string>\n    <string name=\"missing_file\">Fayl ko\\'chirildi yoki o\\'chirildi</string>\n    <string name=\"audio_streams_empty\">Hech qanday audio stream topilmadi</string>\n    <string name=\"video_streams_empty\">Hech qanday video stream topilmadi</string>\n    <string name=\"external_player_unsupported_link_type\">Tashqi playerlar ushbu turdagi havolalarni qo\\'llab-quvvatlamaydilar</string>\n    <string name=\"player_recoverable_failure\">Player xatosidan qutulish</string>\n    <string name=\"player_unrecoverable_failure\">Qayta tiklanmaydigan pleyerda xatolik yuz berdi</string>\n    <string name=\"player_stream_failure\">Ushbu stream ijro etilmadi</string>\n    <string name=\"could_not_setup_download_menu\">Yuklab olish menyusi sozlanmadi</string>\n    <string name=\"content_not_available\">Tarkib mavjud emas</string>\n    <string name=\"parsing_error\">Veb-saytni tahlil qilib bo\\'lmadi</string>\n    <string name=\"could_not_load_thumbnails\">Barcha eskizlarni yuklab bo\\'lmadi</string>\n    <string name=\"network_error\">Tarmoqda xato</string>\n    <string name=\"download_to_sdcard_error_message\">Tashqi SD-kartaga yuklab olishning iloji yo\\'q. Yuklash papkasining joylashuvi tiklansinmi\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Tashqi xotira mavjud emas</string>\n    <string name=\"general_error\">Xato</string>\n    <string name=\"search_history_deleted\">Qidiruv tarixi o\\'chirildi.</string>\n    <string name=\"delete_search_history_alert\">Butun qidiruv tarixi o\\'chirilsinmi\\?</string>\n    <string name=\"clear_search_history_summary\">Qidiruv kalit so\\'zlar tarixini o\\'chiradi</string>\n    <string name=\"clear_search_history_title\">Qidiruv tarixini tozalash</string>\n    <string name=\"watch_history_states_deleted\">Ijro pozitsiyalari o\\'chirildi.</string>\n    <string name=\"delete_playback_states_alert\">Barcha ijro holatlari o\\'chirilsinmi\\?</string>\n    <string name=\"clear_playback_states_summary\">Barcha ijro holatlarini o\\'chiradi</string>\n    <string name=\"clear_playback_states_title\">Ijro pozitsiyalarini o\\'chirib tashlash</string>\n    <string name=\"watch_history_deleted\">Tomosha tarixi o\\'chirildi.</string>\n    <string name=\"delete_view_history_alert\">Tomosha tarixi butunlay o\\'chirib tashlansinmi\\?</string>\n    <string name=\"clear_views_history_summary\">Ijro etilgan streamlar tarixi va ijro holatlarini o\\'chiradi</string>\n    <string name=\"playlist_page_summary\">Pleylist sahifasi</string>\n    <string name=\"video_detail_by\">%s tomonidan</string>\n    <string name=\"channel_created_by\">%s tomonidan yaratilgan</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanal avatari eskizi</string>\n    <string name=\"content_not_supported\">Ushbu tarkib hali NewPipe tomonidan qo\\'llab-quvvatlanmaydi.\n\\n\n\\nUmid qilamanki, kelgusi versiyada qo\\'llab-quvvatlanadi.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Sizningcha, ta\\'minotni yuklash juda sekinmi\\? Agar shunday bo\\'lsa, tez yuklashni yoqib ko\\'ring (uni sozlamalardan yoki quyidagi tugmani bosib o\\'zgartirishingiz mumkin).\n\\n\n\\nNewPipe ikkita lentani yuklash strategiyasini taklif qiladi:\n\\n• Sekin, lekin to\\'liq bo\\'lgan obuna kanalini to\\'liq olish.\n\\n• Tez, lekin odatda to\\'liq bo\\'lmagan maxsus xizmatning so\\'nggi nuqtasidan foydalanish.\n\\n\n\\nIkkalasining farqi shundaki, tezkor narsaning davomiyligi yoki turi kabi ba\\'zi ma\\'lumotlarga ega emas (jonli videolar va oddiy videolarni ajrata olmaydi) va u kamroq narsalarni qaytarishi mumkin.\n\\n\n\\nYouTube ushbu tezkor usulni RSS tasmasi bilan taqdim etadigan xizmatning namunasidir.\n\\n\n\\nShunday qilib, tanlov siz afzal ko\\'rgan narsaga bog\\'liq: tezlik yoki aniq ma\\'lumot.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Tez rejimni o\\'chirish</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Tez rejimni yoqish</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Ba\\'zi xizmatlarda mavjud bo\\'lib, u tezroq bo\\'ladi, lekin cheklangan miqdordagi narsalar va ko\\'pincha to\\'liq bo\\'lmagan ma\\'lumotlarni qaytarishi mumkin (masalan, davomiyligi, element turi, jonli holatda bo\\'lmagan).</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Agar mavjud bo\\'lsa, maxsus lentadan oling</string>\n    <string name=\"feed_update_threshold_option_always_update\">Har doim yangilab turish</string>\n    <string name=\"feed_update_threshold_summary\">Obunadan oldingi, so\\'nggi yangilanishdan keyingi vaqt eskirgan hisoblanadi - %s</string>\n    <string name=\"feed_update_threshold_title\">Tasmani yangilash chegarasi</string>\n    <string name=\"settings_category_feed_title\">Ta\\'minlamoq</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Faqat guruhlanmagan obunalarni ko\\'rsatish</string>\n    <string name=\"feed_create_new_group_button_title\">Yangi</string>\n    <string name=\"feed_group_dialog_delete_message\">Ushbu guruhni o\\'chirmoqchimisiz\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Bo\\'sh guruh nomi</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d tanlangan</item>\n        <item quantity=\"other\">%d tanlanganlar</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Obuna tanlanmadi</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Obunalarni tanlang</string>\n    <string name=\"feed_processing_message\">Tasma qayta ishlanmoqda…</string>\n    <string name=\"feed_notification_loading\">Tasma yuklanmoqda…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Yuklanmadi: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Oxirgi yangilanish: %s</string>\n    <string name=\"feed_groups_header_title\">Kanal guruhlari</string>\n    <string name=\"fragment_feed_title\">Nima yangiliklar</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d kun</item>\n        <item quantity=\"other\">%d kunlar</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d soat</item>\n        <item quantity=\"other\">%d soatlar</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minut</item>\n        <item quantity=\"other\">%d minutlar</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekond</item>\n        <item quantity=\"other\">%d sekondlar</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">ExoPlayer cheklovlari tufayli qidiruv davomiyligi %d soniya qilib belgilandi</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Ha, va qisman videolarni tomosha qildim</string>\n    <string name=\"remove_watched_popup_warning\">Pleylistga qo\\'shilishdan oldin va keyin ko\\'rilgan videolar o\\'chiriladi. \\nIshonchingiz komilmi? Buni qaytarib bo\\'lmaydi!</string>\n    <string name=\"remove_watched_popup_title\">Ko\\'rilgan videolar olib tashlansinmi?</string>\n    <string name=\"remove_watched\">Ko\\'rilganlarni olib tashlash</string>\n    <string name=\"systems_language\">Tizimning standart qiymati</string>\n    <string name=\"app_language_title\">Ilova tili</string>\n    <string name=\"choose_instance_prompt\">Namunani tanlang</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\\"Saqlash uchun kirish doirasi\\\" tashqi SD-kartaga yuklab olishga imkon beradi.\n\\nBa\\'zi qurilmalar mos kelmaydi</string>\n    <string name=\"downloads_storage_use_saf_title\">SAFdan foydalalnish</string>\n    <string name=\"downloads_storage_ask_summary\">Sizdan har bir yuklab olishni qayerda saqlashingiz so\\'raladi</string>\n    <string name=\"downloads_storage_ask_title\">Qayerdan yuklab olishni so\\'rang</string>\n    <string name=\"pause_downloads\">Yuklashlarni to\\'xtatib turish</string>\n    <string name=\"start_downloads\">Yuklashni boshlash</string>\n    <string name=\"enable_queue_limit_desc\">Bitta yuklab olish bir vaqtning o\\'zida ishlaydi</string>\n    <string name=\"enable_queue_limit\">Yuklash navbatini cheklash</string>\n    <string name=\"close\">Yopish</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Mobil ma\\'lumotlarga o\\'tishda foydalidir, garchi ba\\'zi yuklab olishlarni to\\'xtatib bo\\'lmaydi</string>\n    <string name=\"pause_downloads_on_mobile\">Hisoblangan tarmoqlarda uzilish</string>\n    <string name=\"max_retry_desc\">Yuklashni bekor qilishdan oldin maksimal urinishlar soni</string>\n    <string name=\"max_retry_msg\">Maksimal qayta urinishlar</string>\n    <string name=\"stop\">To\\'xtatish</string>\n    <string name=\"delete_downloaded_files\">Yuklangan fayllarni o\\'chirib tashlash</string>\n    <string name=\"confirm_prompt\">Yuklab olish tarixini tozalashni yoki barcha yuklab olingan fayllarni o\\'chirishni xohlaysizmi\\?</string>\n    <string name=\"clear_download_history\">Yuklab olish tarixini tozalash</string>\n    <string name=\"error_download_resource_gone\">Ushbu yuklab olishni tiklab bo\\'lmaydi</string>\n    <string name=\"error_timeout\">Ulanish vaqti tugadi</string>\n    <string name=\"error_progress_lost\">Siljish yo\\'qoldi, chunki fayl o\\'chirildi</string>\n    <string name=\"error_insufficient_storage_left\">Qurilmada bo\\'sh joy qolmadi</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe fayl ustida ishlash paytida yopilgan</string>\n    <string name=\"error_postprocessing_failed\">Keyingi ishlov berilmadi</string>\n    <string name=\"error_http_not_found\">Topilmadi</string>\n    <string name=\"error_http_unsupported_range\">Server ko\\'p tarmoqli yuklamalarni qabul qilmaydi, @ string / msg_threads = 1 bilan qayta urinib ko\\'ring</string>\n    <string name=\"error_http_no_content\">Server ma\\'lumot yubormaydi</string>\n    <string name=\"error_connect_host\">Serverga ulanib bo\\'lmadi</string>\n    <string name=\"error_unknown_host\">Server topilmadi</string>\n    <string name=\"error_ssl_exception\">Xavfsiz ulanish o\\'rnatilmadi</string>\n    <string name=\"error_path_creation\">Belgilangan papkani yaratish mumkin emas</string>\n    <string name=\"error_file_creation\">Fayl yaratib bo\\'lmaydi</string>\n    <string name=\"show_error\">Xatolikni ko\\'rsatish</string>\n    <string name=\"download_already_pending\">Ushbu nom bilan yuklab olish kutilmoqda</string>\n    <string name=\"download_already_running\">Ushbu nom bilan yuklab olish davom etmoqda</string>\n    <string name=\"overwrite_failed\">faylni qayta yozib bo\\'lmaydi</string>\n    <string name=\"overwrite_finished_warning\">Ushbu nom bilan yuklab olingan fayl allaqachon mavjud</string>\n    <string name=\"overwrite_unrelated_warning\">Bunday nomdagi fayl allaqachon mavjud</string>\n    <string name=\"overwrite\">Qayta yozish</string>\n    <string name=\"generate_unique_name\">Noyob nom yaratish</string>\n    <string name=\"download_failed\">Yuklab bo‘lmadi</string>\n    <string name=\"permission_denied\">Tizim tomonidan rad etilgan harakat</string>\n    <string name=\"enqueue\">Navbat</string>\n    <string name=\"recovering\">tiklanish</string>\n    <string name=\"post_processing\">qayta-ishlash</string>\n    <string name=\"queued\">navbatda</string>\n    <string name=\"paused\">to\\'xtatildi</string>\n    <string name=\"missions_header_pending\">Kutilmoqda</string>\n    <string name=\"missions_header_finished\">Tugatildi</string>\n    <string name=\"app_update_available_notification_title\">NewPipe yangilanishi mavjud!</string>\n    <string name=\"auto\">Avto</string>\n    <string name=\"grid\">Tarmoq</string>\n    <string name=\"list\">Ro\\'yxat</string>\n    <string name=\"list_view_mode\">Ro\\'yxatni ko\\'rish rejimi</string>\n    <string name=\"never\">Xech qachon</string>\n    <string name=\"wifi_only\">Faqat Wi-Fi orqali</string>\n    <string name=\"autoplay_summary\">Avtomatik ijro etishni boshlash - %s</string>\n    <string name=\"minimize_on_exit_popup_description\">Pop-up pleyerga kichraytirish</string>\n    <string name=\"minimize_on_exit_background_description\">Fon pleyerini kichraytirish</string>\n    <string name=\"minimize_on_exit_none_description\">Yo\\'q</string>\n    <string name=\"minimize_on_exit_summary\">Asosiy video pleyerdan boshqa dasturga o\\'tishda harakat - %s</string>\n    <string name=\"minimize_on_exit_title\">Ilovani almashtirishni minimallashtirish</string>\n    <string name=\"updates_setting_description\">Yangi versiya mavjud bo\\'lganda dasturni yangilashni so\\'rash uchun bildirishnomani ko\\'rsating</string>\n    <string name=\"updates_setting_title\">Yangilanishlar</string>\n    <string name=\"limit_mobile_data_usage_title\">Mobil ma\\'lumotlardan foydalanishda cheklovlarni cheklash</string>\n    <string name=\"limit_data_usage_none_description\">Limitsiz</string>\n    <string name=\"decline\">Rad etish</string>\n    <string name=\"accept\">Qabul qilmoq</string>\n    <string name=\"start_accept_privacy_policy\">Ma\\'lumotlarni himoya qilish bo\\'yicha Evropa umumiy qoidalariga (GDPR) rioya qilish uchun biz sizning e\\'tiboringizni NewPipe-ning maxfiylik siyosatiga qaratamiz. Iltimos, uni diqqat bilan o\\'qing.\n\\nXatolar haqidagi hisobotni bizga yuborish uchun uni qabul qilishingiz kerak.</string>\n    <string name=\"playback_reset\">Qayta o\\'rnatish</string>\n    <string name=\"playback_step\">Qadam</string>\n    <string name=\"skip_silence_checkbox\">Sukunat paytida oldinga siljish</string>\n    <string name=\"unhook_checkbox\">Chiqarib olish (buzilishga olib kelishi mumkin)</string>\n    <string name=\"playback_pitch\">Ovoz pitchi</string>\n    <string name=\"playback_tempo\">Temp</string>\n    <string name=\"playback_speed_control\">Ijro tezligini boshqarish</string>\n    <string name=\"import_network_expensive_warning\">Ushbu operatsiyani bajarish tarmoq uchun qimmat bo\\'lishi mumkinligini yodda tuting.\n\\n\n\\nDavom etishni xohlaysizmi\\?</string>\n    <string name=\"import_soundcloud_instructions_hint\">sizningID, soundcloud.com/yourid</string>\n    <string name=\"import_soundcloud_instructions\">URL yoki ID-ni yozib SoundCloud profilini import qiling:\n\\n\n\\n1. Veb-brauzerda \\\"ish stoli rejimini\\\" yoqing (sayt mobil qurilmalar uchun mavjud emas)\n\\n2. Ushbu URL manziliga o\\'ting: %1$s\n\\n3. So\\'ralganda tizimga kiring\n\\n4. Siz yo\\'naltirilgan profil URL manzilidan nusxa oling.</string>\n    <string name=\"import_youtube_instructions\">YouTube-ga obunalarni Google takeout-dan import qilish:\n\\n\n\\n1. Ushbu URL manzilga o\\'ting: %1$s\n\\n2. So\\'ralganda tizimga kiring\n\\n3. \\\"Barcha ma\\'lumotlar kiritilgan\\\" tugmachasini bosing, so\\'ng \\\"Barchasini bekor qilish\\\" tugmachasini bosing, so\\'ngra faqat \\\"obunalarni\\\" tanlang va \\\"OK\\\" tugmasini bosing\n\\n4. \\\"Keyingi qadam\\\" ni, so\\'ngra \\\"Eksport yaratish\\\" tugmasini bosing.\n\\n5. U paydo bo\\'lgandan keyin va \\\"Yuklab olish\\\" tugmasini bosing\n\\n6. Yuklangan zip-dan .json faylini chiqarib oling (odatda \\\"YouTube va YouTube Music / subscriptions / subscriptions.json\\\" ostida) va uni shu yerga import qiling.</string>\n    <string name=\"subscriptions_export_unsuccessful\">Obunalarni eksport qilib bo‘lmadi</string>\n    <string name=\"subscriptions_import_unsuccessful\">Obunalarni import qilib bo‘lmadi</string>\n    <string name=\"previous_export\">Oldingi export</string>\n    <string name=\"import_file_title\">Import fayli</string>\n    <string name=\"export_ongoing\">Eksport qilinmoqda…</string>\n    <string name=\"import_ongoing\">Import qilinmoqda…</string>\n    <string name=\"import_from\">Dan Import qilish</string>\n    <string name=\"export_to\">Ga Export qilish</string>\n    <string name=\"import_title\">Import</string>\n    <string name=\"show_original_time_ago_summary\">Xizmatlardan olingan asl matnlar oqim elementlarida ko\\'rinadi</string>\n    <string name=\"show_original_time_ago_title\">Dastlabki real vaqtni narsalarda ko\\'rsatish</string>\n    <string name=\"enable_disposed_exceptions_summary\">Yo\\'qotilgandan so\\'ng, etkazib berilmaydigan Rx istisnolari haqida fragment yoki faoliyatning hayot tsikli tashqarisida majburiy ravishda hisobot berish</string>\n    <string name=\"enable_disposed_exceptions_title\">Hayotiy-tsikldan tashqari xatolar haqida xabar berish</string>\n    <string name=\"show_memory_leaks\">Xotiradagi bo\\'sh joylarni ko\\'rsating</string>\n    <string name=\"enable_leak_canary_summary\">Xotiraning oqishini nazorat qilish, yuklama tashlaganda dastur javob bermasligi mumkin</string>\n    <string name=\"caption_setting_description\">Ijro sarlavhasi matn o\\'lchovi va fon uslublarini o\\'zgartirish. Amalga oshirish uchun dasturni qayta ishga tushirishni talab qiladi.</string>\n    <string name=\"caption_setting_title\">Sarlavhalar</string>\n    <string name=\"caption_auto_generated\">Avtomatik-yaratilgan</string>\n    <string name=\"resize_fit\">Yaroqli (tayyor)</string>\n    <string name=\"resize_fill\">To\\'ldirish</string>\n    <string name=\"caption_none\">Taglavha yo‘q</string>\n    <string name=\"playlist_no_uploader\">Avtomatik yaratildi (yuklovchi topilmadi)</string>\n    <string name=\"playlist_thumbnail_change_success\">Pleylist eskizi o\\'zgartirildi.</string>\n    <string name=\"playlist_add_stream_success\">Pleylist</string>\n    <string name=\"playlist_creation_success\">Pleylist yaratildi</string>\n    <string name=\"delete_playlist_prompt\">Ushbu pleylist o\\'chirilsinmi\\?</string>\n    <string name=\"unbookmark_playlist\">Xatcho\\'pni olib tashlash</string>\n    <string name=\"bookmark_playlist\">Xatcho\\'p pleylisti</string>\n    <string name=\"set_as_playlist_thumbnail\">Pleylist eskizi sifatida o\\'rnating</string>\n    <string name=\"unmute\">Unmute rejimi</string>\n    <string name=\"mute\">Mute rejimi</string>\n    <string name=\"add_to_playlist\">Playlist qo\\'shish</string>\n    <string name=\"name\">Nomi</string>\n    <string name=\"rename_playlist\">Nomni o\\'zgartirish</string>\n    <string name=\"create_playlist\">Yangi Playlist</string>\n    <string name=\"preferred_player_fetcher_notification_message\">So\\'ralgan tarkib yuklanmoqda</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Ma\\'lumot olinmoqda…</string>\n    <string name=\"always_ask_open_action\">Har doim so\\'rash</string>\n    <string name=\"video_player\">Video pleyer</string>\n    <string name=\"popup_player\">Pop-up pleyer</string>\n    <string name=\"background_player\">Fon pleyeri</string>\n    <string name=\"preferred_open_action_settings_summary\">Tarkibni ochishda standart harakat - %s</string>\n    <string name=\"preferred_open_action_settings_title\">\\\"Ochiq\\\" harakat afzal</string>\n    <string name=\"drawer_close\">Yopiq Tortma</string>\n    <string name=\"drawer_open\">Ochiq Tortma</string>\n    <string name=\"start_here_on_background\">Orqa fonda ijroni boshlash</string>\n    <string name=\"start_here_on_popup\">Pop-up rejimida ijroni boshlash</string>\n    <string name=\"enqueued\">Qo\\'shildi</string>\n    <string name=\"enqueue_stream\">Qo\\'shish</string>\n    <string name=\"hold_to_append\">Qo\\'shish uchun ushlab turish</string>\n    <string name=\"play_queue_audio_settings\">Ovoz sozlamalari</string>\n    <string name=\"play_queue_stream_detail\">Detallar</string>\n    <string name=\"play_queue_remove\">Olib tashlash</string>\n    <string name=\"title_activity_play_queue\">Play navbat</string>\n    <string name=\"conferences\">Konferentsiyalar</string>\n    <string name=\"most_liked\">Eng yoqqanlari</string>\n    <string name=\"recently_added\">Yaqinda qo\\'shilgan</string>\n    <string name=\"local\">Mahalliy</string>\n    <string name=\"new_and_hot\">Yangi va qaynoqlari</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"trending\">Ommabop</string>\n    <string name=\"error_unable_to_load_comments\">Fikrlarni yuklab bo‘lmadi</string>\n    <string name=\"import_settings\">Sozlamalarni ham import qilmoqchimisiz\\?</string>\n    <string name=\"override_current_data\">Bu sizning joriy sozlamangizni bekor qiladi.</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-bar/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"no_player_found_toast\">Koan Stream-Playa gfundn (Wennsd\\'n VLC installiast, gähds).</string>\n    <string name=\"use_external_video_player_title\">An andan Wideo-Playa heanehma</string>\n    <string name=\"share_dialog_title\">Deiln mid</string>\n    <string name=\"search_showing_result_for\">Ergebnis füa: %s</string>\n    <string name=\"did_you_mean\">Hosd du \\\"%1$s\\\" gmoand\\?</string>\n    <string name=\"settings\">Rumdogdan</string>\n    <string name=\"search\">Suacha</string>\n    <string name=\"controls_download_desc\">Stream-Dotai obalon</string>\n    <string name=\"download\">Obalon</string>\n    <string name=\"share\">Deiln</string>\n    <string name=\"open_with\">Aufmacha mid</string>\n    <string name=\"open_in_browser\">Im Browser auf macha</string>\n    <string name=\"cancel\">Weg damid</string>\n    <string name=\"install\">Drauf doa</string>\n    <string name=\"no_player_found\">Koan Stream-Playa gfundn! Mogsd n VLC installiean\\?</string>\n    <string name=\"upload_date_text\">Aufe glon am %1$s</string>\n    <string name=\"download_path_audio_summary\">do wean obaglone Audios gspaichad</string>\n    <string name=\"download_path_audio_title\">Oadna für obaglone Audios</string>\n    <string name=\"download_path_summary\">do wean obaglone Videos gspaichad</string>\n    <string name=\"download_path_title\">Oadna für obaglone Videos</string>\n    <string name=\"controls_add_to_playlist_title\">Dazua doa</string>\n    <string name=\"show_info\">zoag d\\'Info</string>\n    <string name=\"use_external_audio_player_title\">Nim an andan Player her</string>\n    <string name=\"use_external_video_player_summary\">Duad bei manchen Auflösungen d\\'Tonspur weggad</string>\n    <string name=\"open_in_popup_mode\">Im Pop-up Modus aufmacha</string>\n    <string name=\"main_bg_subtitle\">Drug auf\\'d Lubn zum ofanga.</string>\n    <string name=\"ok\">Bassd scho</string>\n    <string name=\"no\">naa</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-be/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Націсніце на значок лупы, каб пачаць.</string>\n    <string name=\"upload_date_text\">Апублікавана %1$s</string>\n    <string name=\"no_player_found\">Патокавы прайгравальнік не знойдзены. Усталяваць VLC?</string>\n    <string name=\"no_player_found_toast\">Патокавы плэер не знойдзены (можна ўсталяваць VLC).</string>\n    <string name=\"install\">Усталяваць</string>\n    <string name=\"cancel\">Скасаваць</string>\n    <string name=\"open_in_browser\">Адкрыць у браўзеры</string>\n    <string name=\"open_in_popup_mode\">Адкрыць у асобным акне</string>\n    <string name=\"share\">Абагуліць</string>\n    <string name=\"download\">Спампаваць</string>\n    <string name=\"controls_download_desc\">Спампаваць файл трансляцыі</string>\n    <string name=\"search\">Пошук</string>\n    <string name=\"settings\">Налады</string>\n    <string name=\"did_you_mean\">Магчыма, вы мелі на ўвазе «%1$s»?</string>\n    <string name=\"share_dialog_title\">Абагуліць праз</string>\n    <string name=\"use_external_video_player_title\">Знешні відэаплэер</string>\n    <string name=\"use_external_video_player_summary\">Прыбірае гук пры пэўнай раздзяляльнасці</string>\n    <string name=\"use_external_audio_player_title\">Знешні аўдыяплэер</string>\n    <string name=\"subscribe_button_title\">Падпісацца</string>\n    <string name=\"subscribed_button_title\">Вы падпісаны</string>\n    <string name=\"channel_unsubscribed\">Падпіска адменена</string>\n    <string name=\"subscription_change_failed\">Не ўдалося змяніць падпіску</string>\n    <string name=\"subscription_update_failed\">Не ўдалося абнавіць падпіску</string>\n    <string name=\"show_info\">Паказаць звесткі</string>\n    <string name=\"tab_subscriptions\">Падпіскі</string>\n    <string name=\"tab_bookmarks\">Закладкі</string>\n    <string name=\"fragment_feed_title\">Што новага</string>\n    <string name=\"controls_background_title\">У фоне</string>\n    <string name=\"controls_popup_title\">У акне</string>\n    <string name=\"controls_add_to_playlist_title\">Дадаць да</string>\n    <string name=\"download_path_title\">Папка спампоўвання для відэа</string>\n    <string name=\"download_path_summary\">Спампаваныя відэафайлы захоўваюцца сюды</string>\n    <string name=\"download_path_dialog_title\">Выберыце папку спампоўвання для відэафайлаў</string>\n    <string name=\"download_path_audio_title\">Папка спампоўвання для аўдыя</string>\n    <string name=\"download_path_audio_summary\">Спампаваныя аўдыяфайлы захоўваюцца сюды</string>\n    <string name=\"download_path_audio_dialog_title\">Выберыце папку спампоўвання для аўдыяфайлаў</string>\n    <string name=\"default_resolution_title\">Прадвызначаная раздзяляльнасць</string>\n    <string name=\"default_popup_resolution_title\">Раздзяляльнасць у аконным рэжыме</string>\n    <string name=\"show_higher_resolutions_title\">Паказваць высокія раздзяляльнасці</string>\n    <string name=\"show_higher_resolutions_summary\">Толькі некаторыя прылады могуць прайграваць відэа ў 2K/4K</string>\n    <string name=\"play_with_kodi_title\">Прайграць у Kodi</string>\n    <string name=\"kore_not_found\">Усталяваць адсутную праграму Kore?</string>\n    <string name=\"show_play_with_kodi_title\">Паказваць пункт «Прайграць у Kodi»</string>\n    <string name=\"show_play_with_kodi_summary\">Паказваць варыянт прайгравання відэа праз медыяцэнтр Kodi</string>\n    <string name=\"play_audio\">Аўдыя</string>\n    <string name=\"default_audio_format_title\">Прадвызначаны фармат аўдыя</string>\n    <string name=\"default_video_format_title\">Прадвызначаны фармат відэа</string>\n    <string name=\"theme_title\">Тэма</string>\n    <string name=\"light_theme_title\">Светлая</string>\n    <string name=\"dark_theme_title\">Цёмная</string>\n    <string name=\"black_theme_title\">Чорная</string>\n    <string name=\"popup_remember_size_pos_title\">Запамінаць уласцівасці акна</string>\n    <string name=\"popup_remember_size_pos_summary\">Памятаць апошнія памер і пазіцыю ўсплывальнага акна</string>\n    <string name=\"use_inexact_seek_title\">Хуткі пошук пазіцыі</string>\n    <string name=\"use_inexact_seek_summary\">Недакладны пошук дазваляе плэеру знаходзіць пазіцыі хутчэй са зніжанай дакладнасцю. Пошук цягам 5, 15 ці 25 секунд пры гэтым немажлівы</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Кэш відарысаў ачышчаны</string>\n    <string name=\"metadata_cache_wipe_title\">Ачысціць кэш метаданых</string>\n    <string name=\"metadata_cache_wipe_summary\">Выдаліць усе даныя вэб-старонак у кэшы</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Кэш метаданых ачышчаны</string>\n    <string name=\"auto_queue_title\">Аўтададаванне ў чаргу наступнага патока</string>\n    <string name=\"auto_queue_summary\">Дадаваць падобныя патокі ў чаргу пры прайграванні апошняга, калі не ўключаны паўтор</string>\n    <string name=\"show_search_suggestions_title\">Прапановы ў пошуку</string>\n    <string name=\"show_search_suggestions_summary\">Выберыце якія прапановы паказваць падчас пошуку</string>\n    <string name=\"enable_search_history_title\">Гісторыя пошуку</string>\n    <string name=\"enable_search_history_summary\">Захоўваць запыты пошуку (лакальна)</string>\n    <string name=\"enable_watch_history_title\">Гісторыя праглядаў</string>\n    <string name=\"enable_watch_history_summary\">Запамінаць прагледжаныя відэа</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Узнаўляць прайграванне</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Працягваць прайграванне пасля перапынкаў (напрыклад, тэлефонных званкоў)</string>\n    <string name=\"download_dialog_title\">Спампаваць</string>\n    <string name=\"show_next_and_similar_title\">«Наступнае» і «Прапанаванае» відэа</string>\n    <string name=\"show_hold_to_append_title\">Паказваць падказку «Утрымлівайце, каб дадаць у чаргу»</string>\n    <string name=\"show_hold_to_append_summary\">Паказваць падказку пры націсканні кнопкі «У акне» або «У фоне» на старонцы відэа</string>\n    <string name=\"unsupported_url\">URL не падтрымліваецца</string>\n    <string name=\"default_content_country_title\">Прадвызначаная краіна кантэнту</string>\n    <string name=\"content_language_title\">Прадвызначаная мова кантэнту</string>\n    <string name=\"settings_category_player_title\">Плэер</string>\n    <string name=\"settings_category_player_behavior_title\">Паводзіны</string>\n    <string name=\"settings_category_video_audio_title\">Відэа і аўдыя</string>\n    <string name=\"settings_category_history_title\">Гісторыя і кэш</string>\n    <string name=\"settings_category_appearance_title\">Выгляд</string>\n    <string name=\"settings_category_debug_title\">Адладка</string>\n    <string name=\"background_player_playing_toast\">Прайграванне ў фонавым рэжыме</string>\n    <string name=\"popup_playing_toast\">Прайграванне ва ўсплывальным акне</string>\n    <string name=\"content\">Кантэнт</string>\n    <string name=\"show_age_restricted_content_title\">Кантэнт з ўзроставым абмежаваннем</string>\n    <string name=\"duration_live\">Ужывую</string>\n    <string name=\"downloads\">Спампоўкі</string>\n    <string name=\"downloads_title\">Спампоўкі</string>\n    <string name=\"error_report_title\">Справаздача пра памылку</string>\n    <string name=\"all\">Усе</string>\n    <string name=\"channels\">Каналы</string>\n    <string name=\"playlists\">Плэй-лісты</string>\n    <string name=\"tracks\">Трэкі</string>\n    <string name=\"users\">Карыстальнікі</string>\n    <string name=\"disabled\">Адключана</string>\n    <string name=\"clear\">Ачысціць</string>\n    <string name=\"best_resolution\">Найлепшая раздзяляльнасць</string>\n    <string name=\"undo\">Скасаваць</string>\n    <string name=\"play_all\">Прайграць усё</string>\n    <string name=\"always\">Заўсёды</string>\n    <string name=\"just_once\">Толькі цяпер</string>\n    <string name=\"file\">Файл</string>\n    <string name=\"notification_channel_name\">Апавяшчэнне NewPipe</string>\n    <string name=\"notification_channel_description\">Апавяшчэнні для прайгравальніка NewPipe</string>\n    <string name=\"unknown_content\">[Невядома]</string>\n    <string name=\"switch_to_background\">Перайсці ў фонавы рэжым</string>\n    <string name=\"switch_to_popup\">Перайсці ў аконны рэжым</string>\n    <string name=\"switch_to_main\">Перайсці ў галоўнае акно</string>\n    <string name=\"import_data_title\">Імпартаваць даныя</string>\n    <string name=\"export_data_title\">Экспартаваць даныя</string>\n    <string name=\"import_data_summary\">Перавызначае вашу бягучую гісторыю, падпіскі, плэй-лісты і (неабавязкова) налады</string>\n    <string name=\"export_data_summary\">Экспарт гісторыі, падпісак, плэй-лістоў і налад</string>\n    <string name=\"clear_views_history_title\">Ачысціць гісторыю праглядаў</string>\n    <string name=\"clear_views_history_summary\">Выдаліць гісторыю прайграных патокаў і пазіцыі прайгравання</string>\n    <string name=\"delete_view_history_alert\">Выдаліць усю гісторыю праглядаў\\?</string>\n    <string name=\"watch_history_deleted\">Гісторыя праглядаў выдалена</string>\n    <string name=\"clear_search_history_title\">Ачысціць гісторыю пошуку</string>\n    <string name=\"clear_search_history_summary\">Выдаліць гісторыю пошукавых запытаў</string>\n    <string name=\"delete_search_history_alert\">Выдаліць усю гісторыю пошуку\\?</string>\n    <string name=\"search_history_deleted\">Гісторыя пошуку выдалена</string>\n    <string name=\"general_error\">Памылка</string>\n    <string name=\"network_error\">Памылка сеткі</string>\n    <string name=\"could_not_load_thumbnails\">Не ўдалося загрузіць усе мініяцюры</string>\n    <string name=\"parsing_error\">Не ўдалося разабраць вэб-сайт</string>\n    <string name=\"content_not_available\">Кантэнт недаступны</string>\n    <string name=\"could_not_setup_download_menu\">Не ўдалося стварыць меню спампоўвання</string>\n    <string name=\"app_ui_crash\">Аварыйнае спыненне праграмы/UI</string>\n    <string name=\"player_stream_failure\">Не ўдалося прайграць гэты паток</string>\n    <string name=\"player_unrecoverable_failure\">Памылка плэера без магчымасці аднаўлення</string>\n    <string name=\"player_recoverable_failure\">Аднаўленне пасля памылкі плэера</string>\n    <string name=\"external_player_unsupported_link_type\">Знешнія плэеры не падтрымліваюць гэты тып спасылак</string>\n    <string name=\"video_streams_empty\">Відэапатокі не знойдзены</string>\n    <string name=\"audio_streams_empty\">Аўдыяпатокі не знойдзены</string>\n    <string name=\"invalid_directory\">Такой папкі не існуе</string>\n    <string name=\"invalid_source\">Такога файла або крыніцы кантэнту не існуе</string>\n    <string name=\"invalid_file\">Файл не існуе або няма дазволу на яго чытанне ці запіс</string>\n    <string name=\"file_name_empty_error\">Назва файла не можа быць пустой</string>\n    <string name=\"error_occurred_detail\">Адбылася памылка: %1$s</string>\n    <string name=\"no_streams_available_download\">Няма трансляцый, даступных для спампоўвання</string>\n    <string name=\"sorry_string\">Прабачце, гэта не павінна было адбыцца.</string>\n    <string name=\"error_report_button_text\">Паведаміць па электроннай пошце</string>\n    <string name=\"error_snackbar_message\">На жаль, нешта пайшло не так.</string>\n    <string name=\"error_snackbar_action\">Справаздача</string>\n    <string name=\"what_device_headline\">Інфармацыя:</string>\n    <string name=\"what_happened_headline\">Што адбылося:</string>\n    <string name=\"info_labels\">Што:\\nЗапыт:\\nМова кантэнту:\\nКраіна кантэнту:\\nМова праграмы:\\nСэрвіс:\\nЧас GMT:\\nПакет:\\nВерсія:\\nВерсія АС:</string>\n    <string name=\"your_comment\">Ваш каментарый (па-англійску):</string>\n    <string name=\"error_details_headline\">Падрабязнасці:</string>\n    <string name=\"detail_thumbnail_view_description\">Прайграць відэа, працягласць:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Мініяцюра аватара карыстальніка</string>\n    <string name=\"detail_likes_img_view_description\">Спадабалася</string>\n    <string name=\"detail_dislikes_img_view_description\">Не спадабалася</string>\n    <string name=\"search_no_results\">Няма вынікаў</string>\n    <string name=\"empty_list_subtitle\">Нічога няма, хоць сабак ганяй</string>\n    <string name=\"detail_drag_description\">Перацягніце, каб змяніць парадак</string>\n    <string name=\"video\">Відэа</string>\n    <string name=\"audio\">Аўдыя</string>\n    <string name=\"retry\">Паспрабаваць зноў</string>\n    <string name=\"no_subscribers\">Няма падпісчыкаў</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s падпісчык</item>\n        <item quantity=\"few\">%s падпісчыкі</item>\n        <item quantity=\"many\">%s падпісчыкаў</item>\n        <item quantity=\"other\">%s падпісчыкаў</item>\n    </plurals>\n    <string name=\"no_views\">Няма праглядаў</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s прагляд</item>\n        <item quantity=\"few\">%s прагляды</item>\n        <item quantity=\"many\">%s праглядаў</item>\n        <item quantity=\"other\">%s праглядаў</item>\n    </plurals>\n    <string name=\"no_videos\">Няма відэа</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s відэа</item>\n        <item quantity=\"few\">%s відэа</item>\n        <item quantity=\"many\">%s відэа</item>\n        <item quantity=\"other\">%s відэа</item>\n    </plurals>\n    <string name=\"start\">Пачаць</string>\n    <string name=\"pause\">Паўза</string>\n    <string name=\"create\">Стварыць</string>\n    <string name=\"delete\">Выдаліць</string>\n    <string name=\"checksum\">Кантрольная сума</string>\n    <string name=\"dismiss\">Адхіліць</string>\n    <string name=\"rename\">Перайменаваць</string>\n    <string name=\"ok\">ОК</string>\n    <string name=\"msg_name\">Назва файла</string>\n    <string name=\"msg_threads\">Патокі</string>\n    <string name=\"msg_error\">Памылка</string>\n    <string name=\"msg_running\">NewPipe спампоўвае</string>\n    <string name=\"msg_running_detail\">Падрабязнасці</string>\n    <string name=\"msg_wait\">Пачакайце…</string>\n    <string name=\"msg_copied\">Скапіявана ў буфер абмену</string>\n    <string name=\"no_available_dir\">Пазней выберыце ў наладах папку для спампоўвання</string>\n    <string name=\"msg_popup_permission\">Гэты дазвол патрабуецца для\\nпрайгравання ў акне</string>\n    <string name=\"one_item_deleted\">1 элемент выдалены.</string>\n    <string name=\"title_activity_recaptcha\">Запыт reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Запытаны ўвод reCAPTCHA</string>\n    <string name=\"settings_category_downloads_title\">Спампоўванне</string>\n    <string name=\"settings_file_charset_title\">Сімвалы, дапушчальныя ў назвах файлаў</string>\n    <string name=\"settings_file_replacement_character_summary\">Недапушчальныя сімвалы замяняюцца на гэты</string>\n    <string name=\"settings_file_replacement_character_title\">Сімвал для замены</string>\n    <string name=\"charset_letters_and_digits\">Літары і лічбы</string>\n    <string name=\"charset_most_special_characters\">Большасць спецсімвалаў</string>\n    <string name=\"title_activity_about\">Аб NewPipe</string>\n    <string name=\"title_licenses\">Іншыя ліцэнзіі</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s %2$s пад ліцэнзіяй %3$s</string>\n    <string name=\"tab_about\">Аб праграме</string>\n    <string name=\"tab_licenses\">Ліцэнзіі</string>\n    <string name=\"app_description\">Свабоднае легкавагавае патокавае прайграванне на Android.</string>\n    <string name=\"contribution_title\">Дапамога праекту</string>\n    <string name=\"contribution_encouragement\">Вітаецца ўсё - ідэі, пераклад, змены дызайну, чыстка кода або велізарныя змены ў кодзе. Чым больш зроблена, тым лепш!</string>\n    <string name=\"view_on_github\">Адкрыць на GitHub</string>\n    <string name=\"donation_title\">Ахвяраванне</string>\n    <string name=\"donation_encouragement\">NewPipe распрацаваны добраахвотнікамі, якія праводзяць свой вольны час, забяспечваючы лепшы карыстацкі досвед. Дапамажыце распрацоўшчыкам зрабіць NewPipe яшчэ лепшым, пакуль яны атрымліваюць асалоду ад кавы.</string>\n    <string name=\"give_back\">Ахвяраваць грошы</string>\n    <string name=\"website_title\">Вэб-сайт</string>\n    <string name=\"website_encouragement\">Наведайце вэб-сайт, каб атрымаць больш інфармацыі і паглядзець апошнія навіны NewPipe.</string>\n    <string name=\"privacy_policy_title\">Палітыка прыватнасці NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">Праект NewPipe вельмі адказна ставіцца да вашай прыватнасці. Таму праграма не збірае ніякіх даных без вашай згоды. \\nПалітыка прыватнасці NewPipe падрабязна тлумачыць, якія даныя адпраўляюцца і захоўваюцца пры адпраўцы справаздачы пра збой.</string>\n    <string name=\"read_privacy_policy\">Прачытаць палітыку прыватнасці</string>\n    <string name=\"app_license_title\">Ліцэнзія NewPipe</string>\n    <string name=\"app_license\">NewPipe - гэта свабоднае праграмнае забеспячэнне (копілефт). Вы можаце выкарыстоўваць, вывучаць, дзяліцца і паляпшаць яго па жаданні. У прыватнасці, можаце распаўсюджваць і/ці змяняць яго згодна з умовамі, апублікаванай Фондам свабоднага праграмнага забеспячэння, Агульнай грамадскай ліцэнзіі GNU версіі 3 або любой пазнейшай (на ваш выбар).</string>\n    <string name=\"read_full_license\">Прачытаць ліцэнзію</string>\n    <string name=\"title_activity_history\">Гісторыя</string>\n    <string name=\"action_history\">Гісторыя</string>\n    <string name=\"delete_item_search_history\">Выдаліць гэты элемент з гісторыі пошуку?</string>\n    <string name=\"title_last_played\">Прайгравалася нядаўна</string>\n    <string name=\"title_most_played\">Прайгравалася найбольш</string>\n    <string name=\"main_page_content\">Змесціва галоўнай старонкі</string>\n    <string name=\"blank_page_summary\">Пустая старонка</string>\n    <string name=\"kiosk_page_summary\">Старонка кіёска</string>\n    <string name=\"channel_page_summary\">Старонка канала</string>\n    <string name=\"select_a_channel\">Выберыце канал</string>\n    <string name=\"no_channel_subscribed_yet\">Пакуль няма падпісак на каналы</string>\n    <string name=\"select_a_kiosk\">Выберыце кіёск</string>\n    <string name=\"export_complete_toast\">Экспарт завершаны</string>\n    <string name=\"import_complete_toast\">Імпарт завершаны</string>\n    <string name=\"no_valid_zip_file\">Няма правільнага Zip-файла</string>\n    <string name=\"could_not_import_all_files\">Увага: не ўсе файлы былі імпартаваныя.</string>\n    <string name=\"override_current_data\">Бягучыя даныя будуць перазапісаны.</string>\n    <string name=\"import_settings\">Хочаце імпартаваць налады?</string>\n    <string name=\"trending\">Трэнды</string>\n    <string name=\"top_50\">Топ 50</string>\n    <string name=\"new_and_hot\">Новае і гарачае</string>\n    <string name=\"play_queue_remove\">Выдаліць</string>\n    <string name=\"play_queue_stream_detail\">Падрабязнасці</string>\n    <string name=\"play_queue_audio_settings\">Налады аўдыя</string>\n    <string name=\"hold_to_append\">Утрымлівайце, каб дадаць у чаргу</string>\n    <string name=\"start_here_on_background\">Пачаць прайграванне ў фоне</string>\n    <string name=\"start_here_on_popup\">Пачаць прайграванне ў акне</string>\n    <string name=\"drawer_open\">Адкрыць бакавую панэль</string>\n    <string name=\"drawer_close\">Закрыць бакавую панэль</string>\n    <string name=\"preferred_open_action_settings_title\">Пры адкрыцці кантэнту</string>\n    <string name=\"preferred_open_action_settings_summary\">Пры адкрыцці спасылкі на кантэнт — %s</string>\n    <string name=\"video_player\">Відэаплэер</string>\n    <string name=\"background_player\">Фонавы прайгравальнік</string>\n    <string name=\"popup_player\">Аконны прайгравальнік</string>\n    <string name=\"always_ask_open_action\">Заўсёды пытаць</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Атрыманне звестак…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Загрузка запытанага кантэнту</string>\n    <string name=\"create_playlist\">Стварыць плэй-ліст</string>\n    <string name=\"rename_playlist\">Перайменаваць</string>\n    <string name=\"name\">Назва</string>\n    <string name=\"add_to_playlist\">Дадаць у плэй-ліст</string>\n    <string name=\"set_as_playlist_thumbnail\">Зрабіць мініяцюрай плэй-ліста</string>\n    <string name=\"bookmark_playlist\">Дадаць плэй-ліст у закладкі</string>\n    <string name=\"unbookmark_playlist\">Выдаліць закладку</string>\n    <string name=\"delete_playlist_prompt\">Выдаліць плэй-ліст?</string>\n    <string name=\"playlist_creation_success\">Плэй-ліст створаны</string>\n    <string name=\"playlist_add_stream_success\">Дададзена ў плэй-ліст</string>\n    <string name=\"playlist_thumbnail_change_success\">Мініяцюра плэй-ліста зменена.</string>\n    <string name=\"caption_none\">Без субцітраў</string>\n    <string name=\"resize_fit\">Падагнаць</string>\n    <string name=\"resize_fill\">Запоўніць</string>\n    <string name=\"resize_zoom\">Наблізіць</string>\n    <string name=\"caption_auto_generated\">Створаны аўтаматычна</string>\n    <string name=\"caption_setting_title\">Субцітры</string>\n    <string name=\"caption_setting_description\">Змяніць памер тэксту і стыль фону субцітраў. Каб змены набылі сілу, патрабуецца перазапуск праграмы</string>\n    <string name=\"enable_leak_canary_summary\">Калі выконваецца маніторынг уцечак памяці, праграма можа не адказваць падчас запісу дампа</string>\n    <string name=\"enable_disposed_exceptions_title\">Паведамляць пра памылкі жыццёвага цыклу</string>\n    <string name=\"enable_disposed_exceptions_summary\">Прымусова паведамляць пра недастаўляемыя Rx-выключэнні па-за фрагментам або жыццёвым цыкле пасля выдалення</string>\n    <string name=\"import_title\">Імпарт</string>\n    <string name=\"import_from\">Імпартаваць з</string>\n    <string name=\"export_to\">Экспартаваць у</string>\n    <string name=\"import_ongoing\">Імпарт…</string>\n    <string name=\"export_ongoing\">Экспарт…</string>\n    <string name=\"import_file_title\">Імпарт файла</string>\n    <string name=\"previous_export\">Папярэдні экспарт</string>\n    <string name=\"subscriptions_import_unsuccessful\">Не ўдалося імпартаваць падпіскі</string>\n    <string name=\"subscriptions_export_unsuccessful\">Не ўдалося экспартаваць падпіскі</string>\n    <string name=\"import_youtube_instructions\">Імпарт падпісак YouTube з Google Takeout: \\n \\n1. Перайдзіце па гэтым URL: %1$s \\n2. Увайдзіце, калі вас папросяць \\n3. Націсніце на «Усе даныя ўключаны», затым на «Зняць выбар з усіх», затым выберыце толькі «падпіскі» і націсніце «ОК» \\n4. Націсніце «Наступны крок», а затым «Стварыць экспарт» \\n5. Націсніце на кнопку «Спампаваць» пасля таго, як яна з\\'явіцца \\n6. Ніжэй націсніце на ІМПАРТАВАЦЬ ФАЙЛ і выберыце спампаваны файл .zip \\n7. [Калі не ўдаецца імпартаваць .zip] Трэба выняць файл .csv (звычайна ў раздзеле «YouTube і YouTube Music/subscriptions/subscriptions.csv»), ніжэй націсніце ІМПАРТАВАЦЬ ФАЙЛ і выберыце выняты файл CSV</string>\n    <string name=\"import_soundcloud_instructions\">Каб імпартаваць профіль SoundCloud, увядзіце URL або свой ID:\\n\\n1. Уключыце «Версія для ПК» у браўзеры (сайт не падтрымліваецца мабільнымі прыладамі) \\n2. Перайдзіце на: %1$s \\n3. Увайдзіце, калі неабходна \\n4. Скапіруйце URL-адрас профілю, на які вас перанакіравала.</string>\n    <string name=\"import_soundcloud_instructions_hint\">вашID, soundcloud.com/вашID</string>\n    <string name=\"import_network_expensive_warning\">Гэтае дзеянне можа выклікаць вялікі расход трафіку. \n\\n \n\\nПрацягнуць?</string>\n    <string name=\"playback_speed_control\">Кіраванне хуткасцю прайгравання</string>\n    <string name=\"playback_tempo\">Тэмп</string>\n    <string name=\"playback_pitch\">Тон</string>\n    <string name=\"unhook_checkbox\">Адчапіць (можа выклікаць скажэнне)</string>\n    <string name=\"skip_silence_checkbox\">Прапускаць цішыню</string>\n    <string name=\"playback_step\">Крок</string>\n    <string name=\"playback_reset\">Скід</string>\n    <string name=\"start_accept_privacy_policy\">У адпаведнасці з Агульным рэгламентам па абароне даных ЕС (GDPR), звяртаем вашу ўвагу на палітыку прыватнасці NewPipe. Уважліва азнаёмцеся з ёй. \\nВы павінны прыняць умовы, каб адправіць нам справаздачу пра памылку.</string>\n    <string name=\"accept\">Прыняць</string>\n    <string name=\"decline\">Адмовіцца</string>\n    <string name=\"limit_data_usage_none_description\">Без абмежаванняў</string>\n    <string name=\"limit_mobile_data_usage_title\">Абмежаванне раздзяляльнасці ў мабільнай сетцы</string>\n    <string name=\"minimize_on_exit_title\">Згортванне пры пераключэнні праграмы</string>\n    <string name=\"minimize_on_exit_summary\">Дзеянне пры пераключэнні з асноўнага відэаплэера на іншую праграму — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Нічога не рабіць</string>\n    <string name=\"minimize_on_exit_background_description\">Згортванне ў фон</string>\n    <string name=\"minimize_on_exit_popup_description\">Згортванне ў акно</string>\n    <string name=\"unsubscribe\">Адпісацца</string>\n    <string name=\"tab_choose\">Выберыце ўкладку</string>\n    <string name=\"settings_category_updates_title\">Абнаўленні</string>\n    <string name=\"file_deleted\">Файл выдалены</string>\n    <string name=\"app_update_notification_channel_name\">Апавяшчэнне пра абнаўленне праграмы</string>\n    <string name=\"app_update_notification_channel_description\">Апавяшчэнні пра новыя версіі NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Знешняе сховішча недаступна</string>\n    <string name=\"download_to_sdcard_error_message\">Спампоўванне на знешнюю SD-карту немагчыма. Скінуць размяшчэнне папкі спампоўвання?</string>\n    <string name=\"saved_tabs_invalid_json\">Не ўдалося прачытаць захаваныя ўкладкі, таму выкарыстоўваюцца прадвызначаныя</string>\n    <string name=\"restore_defaults\">Аднавіць прадвызначаныя значэнні</string>\n    <string name=\"restore_defaults_confirmation\">Аднавіць прадвызначаныя значэнні?</string>\n    <string name=\"subscribers_count_not_available\">Колькасць падпісчыкаў недаступна</string>\n    <string name=\"main_page_content_summary\">Укладкі, бачныя на галоўнай старонцы</string>\n    <string name=\"updates_setting_title\">Абнаўленні</string>\n    <string name=\"updates_setting_description\">Паказваць апавяшчэнне пры наяўнасці новай версіі</string>\n    <string name=\"list_view_mode\">Выгляд спіса</string>\n    <string name=\"list\">Спіс</string>\n    <string name=\"grid\">Сетка</string>\n    <string name=\"auto\">Аўтаматычна</string>\n    <string name=\"app_update_available_notification_title\">Даступна абнаўленне NewPipe!</string>\n    <string name=\"missions_header_finished\">Завершана</string>\n    <string name=\"missions_header_pending\">У чарзе</string>\n    <string name=\"paused\">прыпынена</string>\n    <string name=\"queued\">дададзены ў чаргу</string>\n    <string name=\"post_processing\">постапрацоўка</string>\n    <string name=\"enqueue\">Дадаць у чаргу</string>\n    <string name=\"permission_denied\">Дзеянне забаронена сістэмай</string>\n    <string name=\"download_failed\">Памылка спампоўвання</string>\n    <string name=\"generate_unique_name\">Стварыць унікальную назву</string>\n    <string name=\"overwrite\">Перазапісаць</string>\n    <string name=\"download_already_running\">Файл з такой назвай ўжо спампоўваецца</string>\n    <string name=\"show_error\">Паказаць тэкст памылкі</string>\n    <string name=\"error_path_creation\">Немагчыма стварыць папку прызначэння</string>\n    <string name=\"error_file_creation\">Немагчыма стварыць файл</string>\n    <string name=\"error_ssl_exception\">Не ўдалося ўсталяваць бяспечнае злучэнне</string>\n    <string name=\"error_unknown_host\">Сервер не знойдзены</string>\n    <string name=\"error_connect_host\">Немагчыма падключыцца да сервера</string>\n    <string name=\"error_http_no_content\">Сервер не адпраўляе даныя</string>\n    <string name=\"error_http_unsupported_range\">Сервер не падтрымлівае шматпатокавае спампоўванне, паспрабуйце з @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Не знойдзена</string>\n    <string name=\"error_postprocessing_failed\">Не ўдалося выканаць пост-апрацоўку</string>\n    <string name=\"stop\">Спыніць</string>\n    <string name=\"max_retry_msg\">Максімум спроб</string>\n    <string name=\"max_retry_desc\">Колькасць спроб спампаваць да адмены</string>\n    <string name=\"pause_downloads_on_mobile\">Прыпыняць у сетках з тарыфікацыяй</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Карысна пры пераключэнні на мабільную сетку, хоць некаторыя спампоўванні немагчыма прыпыніць</string>\n    <string name=\"events\">Падзеі</string>\n    <string name=\"conferences\">Канферэнцыі</string>\n    <string name=\"show_comments_title\">Паказваць каментарыі</string>\n    <string name=\"show_comments_summary\">Выключыце, каб схаваць каментарыі</string>\n    <string name=\"autoplay_title\">Аўтазапуск</string>\n    <string name=\"no_comments\">Каментарыі адсутнічаюць</string>\n    <string name=\"error_unable_to_load_comments\">Не ўдалося загрузіць каментарыі</string>\n    <string name=\"close\">Закрыць</string>\n    <string name=\"enable_playback_resume_title\">Працягваць прайграванне</string>\n    <string name=\"enable_playback_resume_summary\">Аднаўляць апошнюю пазіцыю</string>\n    <string name=\"enable_playback_state_lists_title\">Пазіцыі ў спісах</string>\n    <string name=\"enable_playback_state_lists_summary\">Паказваць у спісах пазіцыю прайгравання</string>\n    <string name=\"settings_category_clear_data_title\">Ачыстка даных</string>\n    <string name=\"watch_history_states_deleted\">Пазіцыі прайгравання выдалены</string>\n    <string name=\"missing_file\">Файл перамешчаны або выдалены</string>\n    <string name=\"overwrite_unrelated_warning\">Файл з такой назвай ужо існуе</string>\n    <string name=\"overwrite_finished_warning\">Спампаваны файл з такой назвай ужо існуе</string>\n    <string name=\"overwrite_failed\">немагчыма перазапісаць файл</string>\n    <string name=\"download_already_pending\">Файл з такой назвай ужо ў чарзе спампоўвання</string>\n    <string name=\"error_postprocessing_stopped\">Праграма NewPipe была закрыта падчас працы з файлам</string>\n    <string name=\"error_insufficient_storage_left\">На прыладзе скончылася вольнае месца</string>\n    <string name=\"error_progress_lost\">Прагрэс страчаны, бо файл быў выдалены</string>\n    <string name=\"error_timeout\">Скончыўся час злучэння</string>\n    <string name=\"confirm_prompt\">Ачысціць гісторыю спампоўвання або выдаліць спампаваныя файлы?</string>\n    <string name=\"enable_queue_limit\">Абмежаваць чаргу спампоўвання</string>\n    <string name=\"enable_queue_limit_desc\">Толькі адно адначасовае спампоўванне</string>\n    <string name=\"start_downloads\">Пачаць спампоўванне</string>\n    <string name=\"pause_downloads\">Прыпыніць спампоўванне</string>\n    <string name=\"downloads_storage_ask_title\">Запытваць папку спампоўвання</string>\n    <string name=\"downloads_storage_ask_summary\">Пры кожным спампоўванні вам будзе прапанавана выбраць месца захавання. \\nУключыце сістэмны сродак выбару папак (SAF), калі хочаце спампоўваць файлы на знешнюю SD-карту</string>\n    <string name=\"downloads_storage_use_saf_title\">Выкарыстоўваць сістэмны сродак выбару папак (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">«Storage Access Framework» дазваляе выконваць спампоўванне на знешнюю SD-карту</string>\n    <string name=\"drawer_header_description\">Пераключэнне сэрвісу, зараз выбраны:</string>\n    <string name=\"clear_playback_states_summary\">Выдаліць усе пазіцыі прайгравання</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Уключыць «Абмежаваны рэжым» YouTube</string>\n    <string name=\"peertube_instance_add_https_only\">Падтрымліваюцца толькі URL-адрасы HTTPS</string>\n    <string name=\"peertube_instance_add_title\">Дадаць сервер</string>\n    <string name=\"peertube_instance_url_title\">Серверы PeerTube</string>\n    <string name=\"search_showing_result_for\">Вынікі для: %s</string>\n    <string name=\"notification_scale_to_square_image_title\">Абразаць мініяцюру да прапорцый 1:1</string>\n    <string name=\"notification_scale_to_square_image_summary\">Абразаць мініяцюру відэа ў апавяшчэнні з прапорцый 16:9 да 1:1</string>\n    <string name=\"notification_action_3_title\">Кнопка чацвёртага дзеяння</string>\n    <string name=\"notification_action_2_title\">Кнопка трэцяга дзеяння</string>\n    <string name=\"notification_action_1_title\">Кнопка другога дзеяння</string>\n    <string name=\"notification_action_0_title\">Кнопка першага дзеяння</string>\n    <string name=\"feed_groups_header_title\">Групы каналаў</string>\n    <string name=\"systems_language\">Як у сістэме</string>\n    <string name=\"app_language_title\">Мова прылады</string>\n    <string name=\"choose_instance_prompt\">Выберыце сервер</string>\n    <string name=\"delete_downloaded_files\">Выдаліць спампаваныя файлы</string>\n    <string name=\"show_original_time_ago_summary\">Зыходныя тэксты з сэрвісаў будуць бачны ў ленце элементаў</string>\n    <string name=\"clear_cookie_summary\">Ачысціць файлы cookie, якія NewPipe захоўвае пры рашэнні reCAPTCHA</string>\n    <string name=\"peertube_instance_add_exists\">Сервер (інстанс) ужо існуе</string>\n    <string name=\"peertube_instance_add_fail\">Не ўдалося праверыць сервер</string>\n    <string name=\"peertube_instance_add_help\">Увядзіце URL-адрас сервера</string>\n    <string name=\"peertube_instance_url_summary\">Выберыце ўлюбёныя серверы PeerTube</string>\n    <string name=\"clear_queue_confirmation_description\">Чарга актыўнага прайгравальніка будзе заменена</string>\n    <string name=\"clear_queue_confirmation_summary\">Пераключэнне з аднаго плэера на другі можа прывесці да замены вашай чаргі</string>\n    <string name=\"clear_queue_confirmation_title\">Запытваць пацвярджэнне перад ачысткай чаргі</string>\n    <string name=\"never\">Ніколі</string>\n    <string name=\"wifi_only\">Толькі праз Wi-Fi</string>\n    <string name=\"show_original_time_ago_title\">Паказваць зыходны час на элементах</string>\n    <string name=\"unmute\">Уключыць гук</string>\n    <string name=\"mute\">Адключыць гук</string>\n    <string name=\"enqueue_stream\">Дадаць у чаргу</string>\n    <string name=\"enqueued\">Дададзена у чаргу</string>\n    <string name=\"title_activity_play_queue\">Чарга прайгравання</string>\n    <string name=\"most_liked\">Найбольш папулярнае</string>\n    <string name=\"local\">Лакальнае</string>\n    <string name=\"recently_added\">Нядаўна дададзенае</string>\n    <string name=\"no_playlist_bookmarked_yet\">Плэй-лісты яшчэ не дададзены</string>\n    <string name=\"select_a_playlist\">Выберыце плэй-ліст</string>\n    <string name=\"default_kiosk_page_summary\">Прадвызначаны кіёск</string>\n    <string name=\"done\">Так</string>\n    <string name=\"subtitle_activity_recaptcha\">Па завяршэнні націсніце «Гатова»</string>\n    <string name=\"infinite_videos\">∞ відэа</string>\n    <string name=\"more_than_100_videos\">100+ відэа</string>\n    <string name=\"error_report_open_issue_button_text\">Паведаміць на GitHub</string>\n    <string name=\"copy_for_github\">Скапіяваць адфарматаваную справаздачу</string>\n    <string name=\"permission_display_over_apps\">Дайце дазвол на адлюстраванне паверх іншых праграм</string>\n    <string name=\"delete_playback_states_alert\">Выдаліць усе пазіцыі прайгравання\\?</string>\n    <string name=\"clear_playback_states_title\">Выдаліць пазіцыі прайгравання</string>\n    <string name=\"clear_cookie_title\">Ачысціць файлы cookie з reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Файлы cookie з reCAPTCHA ачышчаны</string>\n    <string name=\"artists\">Выканаўцы</string>\n    <string name=\"albums\">Альбомы</string>\n    <string name=\"songs\">Песні</string>\n    <string name=\"videos_string\">Відэа</string>\n    <string name=\"auto_queue_toggle\">Аўтапрайграванне</string>\n    <string name=\"seek_duration_title\">Крок перамотвання</string>\n    <string name=\"notification_colorize_title\">Каляровыя апавяшчэнні</string>\n    <string name=\"notification_action_nothing\">Нічога</string>\n    <string name=\"notification_action_buffering\">Буферызацыя</string>\n    <string name=\"notification_action_shuffle\">Ператасаваць</string>\n    <string name=\"notification_action_repeat\">Паўтор</string>\n    <string name=\"notification_action_4_title\">Кнопка пятага дзеяння</string>\n    <string name=\"notification_colorize_summary\">Афарбоўваць апавяшчэнне асноўным колерам мініяцюры. Падтрымліваецца не ўсімі прыладамі</string>\n    <string name=\"notification_actions_at_most_three\">У кампактным апавяшчэнні даступна не больш за тры дзеянні!</string>\n    <string name=\"notification_actions_summary\">Каб адрэдагаваць кожнае з дзеянняў у апавяшчэнні, націсніце на яго. З дапамогай сцяжкоў справа, выберыце да трох дзеянняў, якія будуць паказвацца ў кампактным апавяшчэнні.</string>\n    <string name=\"unsupported_url_dialog_message\">Не ўдалося распазнаць URL-адрас. Адкрыць у іншай праграме\\?</string>\n    <string name=\"settings_category_player_notification_title\">Апавяшчэнне плэера</string>\n    <string name=\"notifications\">Апавяшчэнні</string>\n    <string name=\"streams_notification_channel_name\">Новыя трансляцыі</string>\n    <string name=\"streams_notification_channel_description\">Апавяшчэнні пра новыя трансляцыі ў падпісках</string>\n    <string name=\"description_tab_description\">Апісанне</string>\n    <string name=\"related_items_tab_description\">Падобныя матэрыялы</string>\n    <string name=\"no_one_watching\">Ніхто не праглядае</string>\n    <string name=\"recovering\">аднаўленне</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s глядач</item>\n        <item quantity=\"few\">%s гледачы</item>\n        <item quantity=\"many\">%s гледачоў</item>\n        <item quantity=\"other\">%s гледачоў</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Падпіскі не выбраны</string>\n    <string name=\"feed_oldest_subscription_update\">Апошняе абнаўленне: %s</string>\n    <string name=\"auto_device_theme_title\">Аўтаматычна (тэма прылады)</string>\n    <string name=\"night_theme_summary\">Выберыце любімую начную тэму - %s</string>\n    <string name=\"description_select_enable\">Дазвол вылучэння тэксту ў апісанні</string>\n    <string name=\"select_night_theme_toast\">Вы можаце выбраць сваю любімую начную тэму ніжэй</string>\n    <string name=\"night_theme_available\">Параметр даступны, толькі калі выбрана тэма %s</string>\n    <string name=\"download_has_started\">Спампоўванне пачалося</string>\n    <string name=\"notifications_disabled\">Апавяшчэнні адключаны</string>\n    <string name=\"tablet_mode_title\">Рэжым планшэта</string>\n    <string name=\"off\">Адключыць</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Няма аўдыяпатокаў даступных для знешніх плэераў</string>\n    <string name=\"get_notified\">Апавяшчаць</string>\n    <string name=\"no_video_streams_available_for_external_players\">Няма відэапатокаў даступных для знешніх плэераў</string>\n    <string name=\"selected_stream_external_player_not_supported\">Выбраны паток не падтрымліваецца знешнімі плэерамі</string>\n    <string name=\"select_quality_external_players\">Выберыце якасць для знешніх плэераў</string>\n    <string name=\"unknown_quality\">Невядомая якасць</string>\n    <string name=\"unknown_format\">Невядомы фармат</string>\n    <string name=\"sort\">Сартаваць</string>\n    <string name=\"new_seek_duration_toast\">З-за абмежаванняў ExoPlayer дакладнасць перамотвання зададзена на %d секунд</string>\n    <string name=\"chapters\">Раздзелы</string>\n    <string name=\"mark_as_watched\">Пазначыць прагледжаным</string>\n    <string name=\"open_with\">Адкрыць праз</string>\n    <string name=\"night_theme_title\">Начная тэма</string>\n    <string name=\"open_website_license\">Адкрыць вэб-сайт</string>\n    <string name=\"description_select_note\">Цяпер можна вылучаць тэкст у апісанні. Звярніце ўвагу, што ў рэжыме вылучэння старонка можа мільгаць, а спасылкі не націскацца.</string>\n    <string name=\"start_main_player_fullscreen_title\">Запускаць асноўны прайгравальнік у поўнаэкранным рэжыме</string>\n    <string name=\"show_channel_details\">Паказаць дэталі канала</string>\n    <string name=\"low_quality_smaller\">Нізкая якасць (менш)</string>\n    <string name=\"hash_channel_name\">Апавяшчэнне пра відэахэшаванне</string>\n    <string name=\"progressive_load_interval_title\">Памер інтэрвалу загрузкі прайгравання</string>\n    <string name=\"show_description_title\">Паказваць апісанне</string>\n    <string name=\"comments_are_disabled\">Каментарыі адключаны</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s слухач</item>\n        <item quantity=\"few\">%s слухача</item>\n        <item quantity=\"many\">%s слухачоў</item>\n        <item quantity=\"other\">%s слухачоў</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d секунда</item>\n        <item quantity=\"few\">%d секунды</item>\n        <item quantity=\"many\">%d секунд</item>\n        <item quantity=\"other\">%d секунд</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d гадзіна</item>\n        <item quantity=\"few\">%d гадзіны</item>\n        <item quantity=\"many\">%d гадзін</item>\n        <item quantity=\"other\">%d гадзін</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d дзень</item>\n        <item quantity=\"few\">%d дні</item>\n        <item quantity=\"many\">%d дзён</item>\n        <item quantity=\"other\">%d дзён</item>\n    </plurals>\n    <string name=\"clear_download_history\">Ачысціць гісторыю спампоўвання</string>\n    <string name=\"no_one_listening\">Ніхто не слухае</string>\n    <string name=\"on\">Уключыць</string>\n    <string name=\"hash_channel_description\">Апавяшчэнні пра ход відэахэшавання</string>\n    <string name=\"create_error_notification\">Стварыць паведамленне пра памылку</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Выберыце падпіскі</string>\n    <string name=\"import_subscriptions_hint\">Імпартуйце або экспартуйце падпіскі праз меню з трыма кропкамі ⁝</string>\n    <string name=\"description_select_disable\">Забарона вылучэння тэксту ў апісанні</string>\n    <string name=\"fast_mode\">Хуткі рэжым</string>\n    <string name=\"faq_description\">Калі ў вас узніклі праблемы з выкарыстаннем праграмы, абавязкова азнаёмцеся з адказамі на частыя пытанні!</string>\n    <string name=\"disable_media_tunneling_title\">Адключыць тунэляванне мультымедыя</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Мініяцюра з перадпраглядам у паласе перамотвання</string>\n    <string name=\"high_quality_larger\">Высокая якасць (больш)</string>\n    <string name=\"dont_show\">Не паказваць</string>\n    <string name=\"app_update_unavailable_toast\">Вы выкарыстоўваеце апошнюю версію NewPipe</string>\n    <string name=\"error_download_resource_gone\">Немагчыма аднавіць спампоўванне</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Выдалены %1$s спампаваны файл</item>\n        <item quantity=\"few\">Выдалены %1$s спампаваныя файлы</item>\n        <item quantity=\"many\">Выдалена %1$s спампаваных файлаў</item>\n        <item quantity=\"other\">Выдалена %1$s спампаваных файлаў</item>\n    </plurals>\n    <string name=\"delete_downloaded_files_confirm\">Выдаліць з дыска ўсе спампаваныя файлы?</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d хвіліна</item>\n        <item quantity=\"few\">%d хвіліны</item>\n        <item quantity=\"many\">%d хвілін</item>\n        <item quantity=\"other\">%d хвілін</item>\n    </plurals>\n    <string name=\"progressive_load_interval_summary\">Змяніць памер інтэрвалу загрузкі прагрэсіўнага змесціва (у цяперашні час %s). Меншае значэнне можа паскорыць іх першапачатковую загрузку</string>\n    <string name=\"show_description_summary\">Выключыце, каб схаваць апісанне відэа і дадатковую інфармацыю</string>\n    <string name=\"local_search_suggestions\">Прапановы пры лакальным пошуку</string>\n    <string name=\"settings_category_player_notification_summary\">Наладзіць апавяшчэнне пра паток, які зараз прайграецца</string>\n    <string name=\"restricted_video\">Гэта відэа абмежавана па ўзросце.\n\\n\n\\nУключыце «%1$s» у наладах, калі хочаце бачыць гэта.</string>\n    <string name=\"error_report_channel_name\">Апавяшчэнне аб памылцы</string>\n    <string name=\"error_report_channel_description\">Апавяшчэнні для паведамлення аб памылках</string>\n    <string name=\"error_report_notification_title\">Адбылася памылка NewPipe, націсніце, каб адправіць справаздачу</string>\n    <string name=\"start_main_player_fullscreen_summary\">Калі аўтапаварот адключаны, відэа адразу запускаецца ў поўнаэкранным рэжыме. Міні-плэер застаецца даступным, трэба толькі выйсці з поўнаэкраннага рэжыму</string>\n    <string name=\"peertube_instance_url_help\">Шукайце серверы, якія вам даспадобы, на %s</string>\n    <string name=\"show_meta_info_title\">Паказваць метаданыя</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ігнараваць падзеі апаратных медыякнопак</string>\n    <string name=\"show_age_restricted_content_summary\">Паказваць змесціва, якое можа быць непрыдатным для дзяцей, бо мае ўзроставыя абмежаванні (напрыклад, 18+)</string>\n    <string name=\"error_report_open_github_notice\">Праверце, ці не існуе заяўкі з абмеркаваннем вашай праблемы. Дублікаты марнуюць наш час і праз гэта адцягваецца вырашэнне сапраўдных задач.</string>\n    <string name=\"error_report_notification_toast\">Адбылася памылка, глядзіце апавяшчэнне</string>\n    <string name=\"crash_the_player\">Збой плэера</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Карысна, напрыклад, калі вы карыстаецеся гарнітурай са зламанымі фізічнымі кнопкамі</string>\n    <string name=\"show_meta_info_summary\">Выключыце, каб схаваць палі метаданых з дадатковымі звесткамі пра стваральніка патоку, змесціва патоку або пошукавы запыт</string>\n    <string name=\"remote_search_suggestions\">Прапановы пры аддаленым пошуку</string>\n    <string name=\"restricted_video_no_stream\">Гэта відэа абмежавана па ўзросце.\n\\nУ сувязі з новай палітыкай YouTube у дачыненні да відэа з узроставымі абмежаваннямі, NewPipe не можа атрымаць доступ ні да аднаго са сваіх відэапатокаў і, такім чынам, не можа іх прайграваць.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube забяспечвае «Абмежаваны рэжым», які хавае патэнцыйна змесціва для дарослых</string>\n    <string name=\"msg_calculating_hash\">Разлік хэша</string>\n    <string name=\"recaptcha_solve\">Вырашана</string>\n    <string name=\"playlist_no_uploader\">Створана аўтаматычна (запампавальнік не знойдзены)</string>\n    <string name=\"duplicate_in_playlist\">Плэй-лісты, якія пазначаны шэрым, ужо ўтрымліваюць гэты элемент.</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s новая трансляцыя</item>\n        <item quantity=\"few\">%s новыя трансляцыі</item>\n        <item quantity=\"many\">%s новых трансляцый</item>\n        <item quantity=\"other\">%s новых трансляцый</item>\n    </plurals>\n    <string name=\"comments_tab_description\">Каментарыі</string>\n    <string name=\"enqueue_next_stream\">Дадаць у чаргу наступным</string>\n    <string name=\"enqueued_next\">Дададзена у чаргу (наступным)</string>\n    <string name=\"loading_stream_details\">Загрузка звестак аб стрыме…</string>\n    <string name=\"processing_may_take_a_moment\">Ідзе апрацоўка… Крыху пачакайце</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Дублікат дададзены %d раз(ы)</string>\n    <string name=\"leak_canary_not_available\">LeakCanary недаступны</string>\n    <string name=\"show_memory_leaks\">Паказаць уцечкі памяці</string>\n    <string name=\"disable_media_tunneling_summary\">Адключыце тунэляванне мультымедыя, калі відэа прайграецца перарывіста або паказваецца чорны экран.</string>\n    <string name=\"msg_failed_to_copy\">Не ўдалося скапіяваць у буфер абмену</string>\n    <string name=\"no_dir_yet\">Папка спампоўвання яшчэ не зададзена, выберыце папку спампоўвання цяпер</string>\n    <string name=\"faq_title\">Частыя пытанні</string>\n    <string name=\"faq\">Перайсці на вэб-сайт</string>\n    <string name=\"main_page_content_swipe_remove\">Каб выдаліць элемент, змахніце яго ўбок</string>\n    <string name=\"unset_playlist_thumbnail\">Прыбраць пастаянную мініяцюру</string>\n    <string name=\"feed_processing_message\">Апрацоўка стужкі…</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Пры кожным спампоўванні вам будзе прапанавана выбраць месца захавання</string>\n    <string name=\"feed_notification_loading\">Загрузка канала…</string>\n    <string name=\"remove_watched_popup_title\">Выдаліць прагледжаныя відэа?</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Так, часткова прагледжаныя відэа таксама</string>\n    <string name=\"percent\">Працэнт</string>\n    <string name=\"remove_watched_popup_warning\">Відэа, якія прагледжаны перад дадаваннем і пасля дадавання ў спіс прайгравання, будуць выдалены. \\nВы ўпэўнены? Гэта дзеянне немагчыма скасаваць!</string>\n    <string name=\"show_crash_the_player_summary\">Паказвае варыянт збою пры выкарыстанні плэера</string>\n    <string name=\"remove_watched\">Выдаліць прагледжаныя</string>\n    <string name=\"show_error_snackbar\">Паказаць панэль памылак</string>\n    <string name=\"semitone\">Паўтон</string>\n    <string name=\"any_network\">Любая сетка</string>\n    <string name=\"feed_subscription_not_loaded_count\">Не загружана: %d</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Пачынаючы з Android 10 падтрымліваецца толькі «Storage Access Framework»</string>\n    <string name=\"checking_updates_toast\">Праверка абнаўленняў…</string>\n    <string name=\"remove_duplicates_title\">Выдаліць дублікаты\\?</string>\n    <string name=\"remove_duplicates\">Выдаліць дублікаты</string>\n    <string name=\"remove_duplicates_message\">Выдаліць усе дубліраваныя патокі ў гэтым плэйлісце?</string>\n    <string name=\"feed_new_items\">Новыя элементы стужкі</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d выбраны</item>\n        <item quantity=\"few\">%d выбраныя</item>\n        <item quantity=\"many\">%d выбраных</item>\n        <item quantity=\"other\">%d выбраных</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">Назва групы пустая</string>\n    <string name=\"feed_group_dialog_delete_message\">Выдаліць групу?</string>\n    <string name=\"feed_create_new_group_button_title\">Новая</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Паказваць толькі не згрупаваныя падпіскі</string>\n    <string name=\"feed_show_upcoming\">Запланаваныя</string>\n    <string name=\"show_crash_the_player_title\">Паказваць «Збой плэера»</string>\n    <string name=\"check_new_streams\">Запусціце праверку новых патокаў</string>\n    <string name=\"crash_the_app\">Збой праграмы</string>\n    <string name=\"enable_streams_notifications_title\">Апавяшчэнні пра новыя відэа</string>\n    <string name=\"enable_streams_notifications_summary\">Апавяшчаць пра новыя відэа з падпісак</string>\n    <string name=\"streams_notifications_interval_title\">Частата праверкі</string>\n    <string name=\"streams_notifications_network_title\">Неабходны тып злучэння</string>\n    <string name=\"check_for_updates\">Праверыць наяўнасць абнаўленняў</string>\n    <string name=\"manual_update_description\">Праверыць наяўнасць новай версіі ўручную</string>\n    <string name=\"autoplay_summary\">Аўтаматычны запуск прайгравання — %s</string>\n    <string name=\"card\">Карткі</string>\n    <string name=\"app_update_available_notification_text\">Націсніце, каб спампаваць %s</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Спампоўванне %s файла завершана</item>\n        <item quantity=\"few\">Спампоўванне %s файлаў завершана</item>\n        <item quantity=\"many\">Спампоўванне %s файлаў завершана</item>\n        <item quantity=\"other\">Спампоўванне %s файлаў завершана</item>\n    </plurals>\n    <string name=\"feed_update_threshold_option_always_update\">Заўсёды абнаўляць</string>\n    <string name=\"feed_update_threshold_title\">Парог абнаўлення стужкі</string>\n    <string name=\"feed_load_error_account_info\">Не ўдалося загрузіць канал для «%s».</string>\n    <string name=\"settings_category_feed_title\">Стужка</string>\n    <string name=\"feed_update_threshold_summary\">Час пасля апошняга абнаўлення, перш чым падпіска лічыцца састарэлай — %s</string>\n    <string name=\"feed_load_error\">Памылка загрузкі канала</string>\n    <string name=\"feed_load_error_terminated\">Уліковы запіс аўтара быў спынены. \\nNewPipe не зможа загрузіць гэты канал у будучыні. \\nАдпісацца ад канала?</string>\n    <string name=\"feed_load_error_fast_unknown\">Рэжым хуткай загрузкі стужкі не дае дадатковай інфармацыі аб гэтым.</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Атрыманне даных са спецыяльнага канала, калі ён ёсць</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Уключыць хуткі рэжым</string>\n    <string name=\"metadata_category\">Катэгорыя</string>\n    <string name=\"metadata_tags\">Тэгі</string>\n    <string name=\"metadata_licence\">Ліцэнзія</string>\n    <string name=\"metadata_host\">Хост</string>\n    <string name=\"metadata_privacy_unlisted\">Не ў спісе</string>\n    <string name=\"metadata_privacy_private\">Прыватная</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Пераключыць усе</string>\n    <string name=\"streams_not_yet_supported_removed\">Трансляцыі, спампоўванне якіх яшчэ не падтрымліваецца, не паказваюцца</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Мініяцюра аватара канала</string>\n    <string name=\"video_detail_by\">Аўтар: %s</string>\n    <string name=\"detail_heart_img_view_description\">Спадабалася аўтару відэа</string>\n    <string name=\"channel_created_by\">Створана %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Адключыць хуткі рэжым</string>\n    <string name=\"metadata_privacy_public\">Публічная</string>\n    <string name=\"detail_pinned_comment_view_description\">Замацаваны каментарый</string>\n    <string name=\"you_successfully_subscribed\">Вы падпісаліся на канал</string>\n    <string name=\"recent\">Апошнія</string>\n    <string name=\"radio\">Радыё</string>\n    <string name=\"feed_hide_streams_title\">Паказваць наступныя патокі</string>\n    <string name=\"feed_show_hide_streams\">Паказаць/схаваць трансляцыі</string>\n    <string name=\"content_not_supported\">Гэты кантэнт яшчэ не падтрымліваецца NewPipe.\\n\\nСпадзяёмся, што падтрымка з\\'явіцца ў наступных версіях.</string>\n    <string name=\"playlist_page_summary\">Старонка плэй-ліста</string>\n    <string name=\"show_thumbnail_title\">Паказваць мініяцюру</string>\n    <string name=\"show_thumbnail_summary\">Выкарыстоўваць мініяцюру як фон для экрана блакіроўкі і апавяшчэнняў</string>\n    <string name=\"no_appropriate_file_manager_message\">Для гэтага дзеяння не знойдзены прыдатны файлавы менеджар. \\nУсталюйце файлавы менеджар або паспрабуйце адключыць «%s» у наладах спампоўвання</string>\n    <string name=\"georestricted_content\">Гэты кантэнт недаступны ў вашай краіне.</string>\n    <string name=\"soundcloud_go_plus_content\">Гэта трэк SoundCloud Go+ (прынамсі ў вашай краіне), таму NewPipe не можа яго прайграць або спампаваць.</string>\n    <string name=\"private_content\">Гэты кантэнт прыватны, таму NewPipe не можа яго прайграць або спампаваць.</string>\n    <string name=\"youtube_music_premium_content\">Гэта відэа даступна толькі для падпісчыкаў YouTube Music Premium, таму NewPipe не можа яго прайграць або спампаваць.</string>\n    <string name=\"account_terminated\">Уліковы запіс спынены</string>\n    <string name=\"featured\">Вартае ўвагі</string>\n    <string name=\"metadata_privacy_internal\">Унутраная</string>\n    <string name=\"feed_show_watched\">Прагледжаныя цалкам</string>\n    <string name=\"paid_content\">Гэты кантэнт даступны карыстальнікам толькі за плату, таму NewPipe не можа яго прайграць або спампаваць.</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Даступна для некаторых сэрвісаў, звычайна значна хутчэй, але можа перадаваць абмежаваную колькасць элементаў і не ўсю інфармацыю (можа адсутнічаць працягласць, тып элемента, паказчык трансляцыі)</string>\n    <string name=\"metadata_age_limit\">Узроставае абмежаванне</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Для гэтага дзеяння не знойдзены прыдатны файлавы менеджар. \\nУсталюйце файлавы менеджар, сумяшчальны з Storage Access Framework</string>\n    <string name=\"no_app_to_open_intent\">На прыладзе няма праграмы, каб адкрыць гэты файл</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Стандартнае значэнне ExoPlayer</string>\n    <string name=\"feed_show_partially_watched\">Прагледжаныя часткова</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Лічыце, што загрузка каналаў адбываецца занадта павольна? Калі так, паспрабуйце ўключыць хуткую загрузку (можна змяніць у наладах або націснуўшы кнопку ніжэй). \\n \\nNewPipe прапануе два спосабы загрузкі каналаў: \\n• Атрыманне ўсяго канала падпіскі. Павольны, але інфармацыя поўная). \\n• Выкарыстанне спецыяльнай канчатковай кропкі абслугоўвання. Хуткі, але звычайна інфармацыя няпоўная). \\n \\nРозніца паміж імі ў тым, што ў хуткім звычайна адсутнічае частка інфармацыі, напрыклад, працягласць або тып (немагчыма адрозніць трансляцыі ад звычайных відэа), і ён можа вяртаць менш элементаў. \\n \\nYouTube з\\'яўляецца прыкладам сэрвісу, які прапануе гэты хуткі метад праз RSS-канал. \\n \\nТакім чынам, выбар залежыць ад таго, чаму вы аддаяце перавагу: хуткасці або дакладнасці інфармацыя.</string>\n    <string name=\"metadata_privacy\">Прыватнасць</string>\n    <string name=\"metadata_language\">Мова</string>\n    <string name=\"metadata_support\">Падтрымка</string>\n    <string name=\"left_gesture_control_title\">Дзеянне жэсту злева</string>\n    <string name=\"right_gesture_control_title\">Дзеянне жэсту справа</string>\n    <string name=\"brightness\">Яркасць</string>\n    <string name=\"none\">Нічога</string>\n    <string name=\"left_gesture_control_summary\">Выбраць жэст для левай часткі экрана прайгравання</string>\n    <string name=\"volume\">Гук</string>\n    <string name=\"right_gesture_control_summary\">Выбраць жэст для правай часткі экрана прайгравання</string>\n    <string name=\"prefer_original_audio_summary\">Выбіраць зыходную гукавую дарожку незалежна ад мовы</string>\n    <string name=\"prefer_original_audio_title\">Аддаваць перавагу арыгінальнаму гуку</string>\n    <string name=\"prefer_descriptive_audio_title\">Аддаваць перавагу апісальнаму гуку</string>\n    <string name=\"prefer_descriptive_audio_summary\">Выбіраць гукавую дарожку з апісаннем для людзей са слабым зрокам, калі яна ёсць</string>\n    <string name=\"play_queue_audio_track\">Аўдыядарожка: %s</string>\n    <string name=\"audio_track\">Гукавая дарожка</string>\n    <string name=\"select_audio_track_external_players\">Выберыце гукавую дарожку для знешніх прайгравальнікаў</string>\n    <string name=\"unknown_audio_track\">Невядомая</string>\n    <string name=\"settings_category_exoplayer_title\">Налады ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Выкарыстоўваць функцыю рэзервовага дэкодэра ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Заўсёды выкарыстоўваць спосаб абыходу налад паверхні відэавываду ExoPlayer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">арыгінальны</string>\n    <string name=\"audio_track_type_dubbed\">дубляваны</string>\n    <string name=\"audio_track_type_descriptive\">апісальны</string>\n    <string name=\"audio_track_present_in_video\">У гэтым патоку ўжо павінна быць гукавая дарожка</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Уключыце гэту опцыю, калі ў вас ёсць праблемы з ініцыялізацыяй дэкодэра, якая вяртаецца да дэкодэраў з больш нізкім прыярытэтам, калі ініцыялізацыя асноўных дэкодэраў не ўдаецца. Гэта можа прывесці да нізкай прадукцыйнасці прайгравання, чым пры выкарыстанні асноўных дэкодэраў</string>\n    <string name=\"settings_category_exoplayer_summary\">Кіраванне некаторымі наладамі ExoPlayer. Каб гэтыя змены ўступілі ў сілу, патрабуецца перазапуск прайгравальніка</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Гэты абыходны шлях вызваляе і паўторна стварае відэакодэкі, калі адбываецца змяненне паверхні, замест таго, каб задаваць паверхню непасрэдна для кодэка. Ужо выкарыстоўваецца ExoPlayer на некаторых прыладах з такой праблемай, гэты параметр ужываецца толькі на прыладах з Android 6 і вышэй\\n\\nУключэнне параметра можа прадухіліць памылкі прайгравання пры пераключэнні бягучага відэаплэера або пераключэнні ў поўнаэкранны рэжым</string>\n    <string name=\"image_quality_title\">Якасць відарысаў</string>\n    <string name=\"channel_tab_videos\">Відэа</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Падпісчыкі</string>\n    <string name=\"show_channel_tabs_summary\">Якія ўкладкі паказваюцца на старонцы канала</string>\n    <string name=\"share_playlist_with_list\">Абагуліць спіс URL-адрасоў</string>\n    <string name=\"share_playlist_with_titles\">Абагуліць назвы</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_channel_tabs\">Укладкі канала</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"loading_metadata_title\">Загрузка метаданых…</string>\n    <string name=\"toggle_screen_orientation\">Змяніць арыентацыю экрана</string>\n    <string name=\"image_quality_low\">Нізкая якасць</string>\n    <string name=\"main_tabs_position_title\">Размяшчэнне асноўных укладак</string>\n    <string name=\"toggle_fullscreen\">Пераключыцца ў поўнаэкранны рэжым</string>\n    <string name=\"feed_fetch_channel_tabs\">Атрыманне ўкладак канала</string>\n    <string name=\"metadata_avatars\">Аватары</string>\n    <string name=\"next_stream\">Наступны паток</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Прадвызначана на вашай прыладзе адключана тунэляванне мультымедыя, бо вядома, што гэта мадэль яго не падтрымлівае.</string>\n    <string name=\"metadata_subchannel_avatars\">Аватары падканалаў</string>\n    <string name=\"open_play_queue\">Адкрыць чаргу прайгравання</string>\n    <string name=\"image_quality_none\">Не загружаць відарысы</string>\n    <string name=\"image_quality_high\">Высокая якасць</string>\n    <string name=\"channel_tab_about\">Пра канал</string>\n    <string name=\"share_playlist\">Абагуліць плэй-ліст</string>\n    <string name=\"forward\">Пераматаць наперад</string>\n    <string name=\"channel_tab_albums\">Альбомы</string>\n    <string name=\"rewind\">Пераматаць назад</string>\n    <string name=\"replay\">Паўтарыць</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Укладкі, для якіх атрымліваюцца даныя пры абнаўленні стужкі. Гэты параметр не дзейнічае, калі канал абнаўляецца з выкарыстаннем хуткага рэжыму.</string>\n    <string name=\"image_quality_medium\">Сярэдняя якасць</string>\n    <string name=\"metadata_uploader_avatars\">Загрузнік аватараў</string>\n    <string name=\"metadata_banners\">Банеры</string>\n    <string name=\"channel_tab_playlists\">Плэй-лісты</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"main_tabs_position_summary\">Перамясціць панэль укладак уніз</string>\n    <string name=\"no_live_streams\">Няма жывых трансляцый</string>\n    <string name=\"image_quality_summary\">Выберыце якасць відарысаў ці ўвогуле не загружаць відарысы, каб паменшыць выкарыстанне даных і памяці. Змены ачышчаюць кэш відарысаў у памяці і на дыску (%s)</string>\n    <string name=\"play\">Прайграць</string>\n    <string name=\"more_options\">Іншыя параметры</string>\n    <string name=\"metadata_thumbnails\">Мініяцюры</string>\n    <string name=\"channel_tab_tracks\">Трэкі</string>\n    <string name=\"duration\">Працягласць</string>\n    <string name=\"no_streams\">Няма трансляцый</string>\n    <string name=\"channel_tab_channels\">Каналы</string>\n    <string name=\"previous_stream\">Папярэдні паток</string>\n    <string name=\"channel_tab_livestreams\">Ужывую</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s адказ</item>\n        <item quantity=\"few\">%s адказы</item>\n        <item quantity=\"many\">%s адказаў</item>\n        <item quantity=\"other\">%s адказаў</item>\n    </plurals>\n    <string name=\"show_more\">Паказаць больш</string>\n    <string name=\"show_less\">Паказаць менш</string>\n    <string name=\"notification_actions_summary_android13\">Каб адрэдагаваць кожнае з дзеянняў у апавяшчэнні, націсніце на яго. Першыя тры дзеянні (прайграванне/паўза, папярэдні і наступны) зададзены сістэмай, іх змяніць немагчыма.</string>\n    <string name=\"error_insufficient_storage\">Недастаткова вольнага месца на прыладзе</string>\n    <string name=\"yes\">Так</string>\n    <string name=\"auto_update_check_description\">NewPipe можа час ад часу аўтаматычна правяраць наяўнасць новай версіі і апавяшчаць, калі яна будзе даступна. \\nУключыць гэту функцыю?</string>\n    <string name=\"import_settings_vulnerable_format\">Налады ў імпартаваным экспарце выкарыстоўваюць уразлівы фармат, які састарэў з версіі NewPipe 0.27.0. Пераканайцеся, што імпартаваны экспарт атрыманы з надзейнай крыніцы, і ў будучыні пераважней выкарыстоўваць толькі экспарт, атрыманы з NewPipe 0.27.0 ці навей. Падтрымка імпарту налад у гэтым уразлівым фармаце хутка будзе цалкам выдаленая, і тады старыя версіі NewPipe больш не змогуць імпартаваць наладкі з экспарту з новых версій.</string>\n    <string name=\"no\">Не</string>\n    <string name=\"settings_category_backup_restore_title\">Рэзервовае капіяванне і аднаўленне</string>\n    <string name=\"reset_settings_title\">Скінуць налады</string>\n    <string name=\"reset_settings_summary\">Скінуць усе налады на іх прадвызначаныя значэнні</string>\n    <string name=\"reset_all_settings\">Пры скіданні ўсіх налад будуць адхілены ўсе вашы змены налад і праграма перазапусціцца. \\n \\nСапраўды хочаце працягнуць?</string>\n    <string name=\"audio_track_type_secondary\">другасны</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Абагуліць як часовы плэйліст YouTube</string>\n    <string name=\"tab_bookmarks_short\">Плэй-лісты</string>\n    <string name=\"select_a_feed_group\">Выберыце групу каналаў</string>\n    <string name=\"no_feed_group_created_yet\">Група каналаў яшчэ не створана</string>\n    <string name=\"feed_group_page_summary\">Старонка групы каналаў</string>\n    <string name=\"search_with_service_name\">Пошук %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Пошук %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Спадабалася</string>\n    <string name=\"permission_display_over_apps_permission_name\">«Дазволіць паказ па-над астатнімі праграмамі»</string>\n    <string name=\"short_thousand\">%s тыс.</string>\n    <string name=\"short_million\">%s млн</string>\n    <string name=\"short_billion\">%s млрд</string>\n    <string name=\"delete_file\">Выдаліць файл</string>\n    <string name=\"delete_entry\">Выдаліць запіс</string>\n    <string name=\"migration_info_6_7_title\">Старонка SoundCloud Top 50 выдалена</string>\n    <string name=\"trending_music\">Трэнды – музыка</string>\n    <string name=\"entry_deleted\">Запіс выдалены</string>\n    <string name=\"trending_gaming\">Трэнды – гульні</string>\n    <string name=\"trending_podcasts\">Трэнды – падкасты</string>\n    <string name=\"trending_movies\">Трэнды – фільмы і перадачы</string>\n    <string name=\"unsupported_content_in_country\">Гэты кантэнт недаступны для цяперашняй краіны кантэнту.\\n\\nЯе можна змяніць праз «Налады &gt; Кантэнт &gt; Прадвызначаная краіна кантэнту».</string>\n    <string name=\"migration_info_7_8_message\">21 ліпеня 2025 года YouTube спыніў падтрымку аб\\'яднанай старонкі трэндаў. NewPipe замяніў старонку трэндаў на трэнды трансляцый.\\n\\nТаксама можна выбраць іншыя старонкі трэндаў праз «Налады &gt; Кантэнт &gt; Змесціва галоўнай старонкі».</string>\n    <string name=\"migration_info_7_8_title\">Аб\\'яднаныя трэнды YouTube выдалены</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ber/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"feed_create_new_group_button_title\">ⴰⵎⴰⵢⵏⵓ</string>\n    <string name=\"name\">ⵉⵙⵎ</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d ⵡⴰⵙⵙ</item>\n        <item quantity=\"other\">%d ⵓⵙⵙⴰⵏ</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d ⵜⵙⵔⵉⴳⵜ</item>\n        <item quantity=\"other\">%d ⵜⵙⵔⵉⴳⵉⵏ</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d ⵜⵙⴷⵉⴷⵉⵜ</item>\n        <item quantity=\"other\">%d ⵜⵙⴷⵉⴷⵉⵏ</item>\n    </plurals>\n    <string name=\"app_language_title\">ⵜⵓⵜⵍⴰⵢⵜ ⵏ ⵜⵙⵏⵙⵉ</string>\n    <string name=\"close\">ⵇⵇⵏ</string>\n    <string name=\"minimize_on_exit_none_description\">ⵡⴰⵍⵓ</string>\n    <string name=\"playback_step\">ⴰⵙⵓⵔⵉⴼ</string>\n    <string name=\"resize_zoom\">ⵙⵎⵖⵕ</string>\n    <string name=\"mute\">ⵙⵓⵙⵎ</string>\n    <string name=\"rename_playlist\">ⵙⵏⴼⵍ ⵉⵙⵎ</string>\n    <string name=\"play_queue_audio_settings\">ⵜⵉⵙⵖⴰⵍ ⵓⵎⵙⵍⴰⵢ</string>\n    <string name=\"play_queue_remove\">ⴽⴽⵙ</string>\n    <string name=\"action_history\">ⴰⵎⵣⵔⵓⵢ</string>\n    <string name=\"title_activity_history\">ⴰⵎⵣⵔⵓⵢ</string>\n    <string name=\"website_title\">ⴰⵙⵉⵜ</string>\n    <string name=\"view_on_github\">ⵥⵕ ⴳ GitHub</string>\n    <string name=\"tab_licenses\">ⵜⵓⵔⴰⴳⵜ</string>\n    <string name=\"tab_about\">ⵅⴼ</string>\n    <string name=\"copyright\">© %1$s ⵙⴳ %2$s ⴷⴷⴰⵡ %3$s</string>\n    <string name=\"title_activity_about\">ⵅⴼ NewPipe</string>\n    <string name=\"msg_wait\">ⵕⴰⵊⴰ…</string>\n    <string name=\"msg_error\">ⵜⴰⵣⴳⵍⵜ</string>\n    <string name=\"msg_name\">ⵉⵙⵎ ⵓⴼⴰⵢⵍⵓ</string>\n    <string name=\"ok\">ⵡⴰⵅⵅⴰ</string>\n    <string name=\"rename\">ⵙⵙⵏⴼⵍ ⵉⵙⵎ</string>\n    <string name=\"dismiss\">ⵙⵙⵔ</string>\n    <string name=\"delete\">ⴽⴽⵙ</string>\n    <string name=\"no_comments\">ⵓⵔ ⵍⵍⵉⵏ ⵉⵡⴼⴰⵡⴰⵍⵏ</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s ⵓⴼⵉⴷⵢⵓ</item>\n        <item quantity=\"other\">%s ⵉⴼⵉⴷⵢⵓⵜⵏ</item>\n    </plurals>\n    <string name=\"infinite_videos\">∞ ⵉⴼⵉⴷⵢⵓⵜⵏ</string>\n    <string name=\"more_than_100_videos\">100+ ⵉⴼⵉⴷⵢⵓⵜⵏ</string>\n    <string name=\"audio\">ⴰⵎⵙⵍⴰⵢ</string>\n    <string name=\"video\">ⴰⴼⵉⴷⵢⵓ</string>\n    <string name=\"detail_likes_img_view_description\">ⵉⵔⵉⵜⵏ</string>\n    <string name=\"general_error\">ⵜⴰⵣⴳⵍⵜ</string>\n    <string name=\"file\">ⴰⴼⴰⵢⵍⵓ</string>\n    <string name=\"play_all\">ⵖⵔ ⵎⴰⵕⵕⴰ</string>\n    <string name=\"file_deleted\">ⵉⵜⵜⵡⴰⴽⴽⵙ ⵓⴼⴰⵢⵍⵓ</string>\n    <string name=\"videos_string\">ⵉⴼⵉⴷⵢⵓⵜⵏ</string>\n    <string name=\"all\">ⵎⴰⵕⵕⴰ</string>\n    <string name=\"downloads_title\">ⵓⴳⴳⴰⵎⵏ</string>\n    <string name=\"downloads\">ⵓⴳⴳⴰⵎⵏ</string>\n    <string name=\"duration_live\">ⵓⵙⵔⵉⴷ</string>\n    <string name=\"settings_category_video_audio_title\">ⴰⴼⵉⴷⵢⵓ ⴷ ⵉⵎⵙⵍⵉ</string>\n    <string name=\"download_dialog_title\">ⴰⴳⵎ</string>\n    <string name=\"enable_watch_history_title\">ⵥⵕ ⴰⵎⵣⵔⵓⵢ</string>\n    <string name=\"enable_search_history_title\">ⴰⵎⵣⵔⵓⵢ ⵏ ⵓⵔⵣⵣⵓ</string>\n    <string name=\"black_theme_title\">ⴰⴱⵔⴽⴰⵏ</string>\n    <string name=\"play_audio\">ⴰⵎⵙⵍⴰⵢ</string>\n    <string name=\"play_with_kodi_title\">ⵖⵔ ⵙ ⴽⵓⴷⵉ</string>\n    <string name=\"controls_add_to_playlist_title\">ⵔⵏⵓ ⵖⵔ</string>\n    <string name=\"tab_choose\">ⵙⵜⵉ ⴰⵙⴽⵙⵍ</string>\n    <string name=\"share_dialog_title\">ⴱⴹⵓ ⵙ</string>\n    <string name=\"settings\">ⵜⵉⵙⵖⴰⵍ</string>\n    <string name=\"search\">ⵔⵣⵓ</string>\n    <string name=\"download\">ⴰⴳⵎ</string>\n    <string name=\"share\">ⴱⴹⵓ</string>\n    <string name=\"install\">ⵙⵔⵙ</string>\n    <string name=\"cancel\">ⵙⵔ</string>\n    <string name=\"video_detail_by\">ⵙ %s</string>\n    <string name=\"channel_created_by\">ⵔⵏⵏⵓ ⵜ %s</string>\n    <string name=\"feed_group_dialog_delete_message\">ⵉⵙ ⵜⵅⵙⴷ ⴰⴷ ⵜⴽⴽⵙⴷ ⵜⵔⴰⴱⴱⵓⵜ ⴰ\\?</string>\n    <string name=\"stop\">ⴱⴷⴷ</string>\n    <string name=\"grid\">ⴰⵥⵟⵟⴰ</string>\n    <string name=\"list\">ⵜⴰⵍⴳⴰⵎⵜ</string>\n    <string name=\"updates_setting_title\">ⵜⵓⵙⴷⵖⵉⵏ</string>\n    <string name=\"decline\">ⴰⴳⵉ</string>\n    <string name=\"accept\">ⵜⴰⵢⵢⵉⵀⵜ</string>\n    <string name=\"resize_fill\">ⴽⵜⵔ</string>\n    <string name=\"resize_fit\">ⵙⴰⵙⵜⵡⴰ</string>\n    <string name=\"unmute\">ⴽⴽⵙ ⴰⵙⵓⵔⵎ</string>\n    <string name=\"background_player\">ⴰⵎⵖⵔⵉ ⴷⴼⴼⵉⵔ</string>\n    <string name=\"video_player\">ⴰⵎⵖⵔⵉ ⵏ ⵓⴼⵉⴷⵢⵓ</string>\n    <string name=\"detail_thumbnail_view_description\">ⵖⵔ ⴰⴼⵉⴷⵢⵓ,ⴰⵣⵎⵣ:</string>\n    <string name=\"your_comment\">ⵉⵅⴼⴰⵡⴰⵍ ⵏⵏⴽ (ⵙ ⵜⵏⴳⵍⵉⵣⵜ):</string>\n    <string name=\"what_device_headline\">ⴰⵏⵖⵎⵉⵙ:</string>\n    <string name=\"error_snackbar_action\">ⵎⵍ</string>\n    <string name=\"download_path_title\">ⴰⵙⴷⴰⵡ ⵏ ⵓⴳⴰⵎ ⵓⴼⵉⴷⵢⵓ</string>\n    <string name=\"tab_subscriptions\">ⵜⵉⵙⵓⵔⴰ</string>\n    <string name=\"show_info\">ⵙⵎⴰⵍ ⴰⵏⵖⵎⵉⵙ</string>\n    <string name=\"channel_unsubscribed\">ⴽⴽⵙ ⵜⴰⵙⵓⵔⵉ ⵉ ⵓⵙⴰⵔⵓ</string>\n    <string name=\"unsubscribe\">ⴽⴽⵙ ⵜⴰⵙⵓⵔⵉ</string>\n    <string name=\"subscribed_button_title\">ⵉⵙⵙⵓⵔ</string>\n    <string name=\"subscribe_button_title\">ⵙⵙⵓⵔ</string>\n    <string name=\"use_external_audio_player_title\">ⵙⵎⵔⵙ ⵉⵎⵖⵔⵉ ⵏ ⵉⵎⵙⵍⵉ ⴰⴱⵕⵕⴰⵏⵉ</string>\n    <string name=\"use_external_video_player_title\">ⵙⵎⵔⵙ ⵉⵎⵖⵔⵉ ⵏ ⵓⴼⵉⴷⵢⵓ ⴰⴱⵕⵕⴰⵏⵉ</string>\n    <string name=\"search_showing_result_for\">ⴰⵙⵎⴰⵍ ⵏ ⵜⴰⵢⴰⴼⵓⵜ ⵉ: %s</string>\n    <string name=\"did_you_mean\">ⵎⵉⵏ ⵜⵅⵙⴷ ⴰⴷ ⵜⵉⵏⵉⴷ:\\\"%1$s\\\"\\?</string>\n    <string name=\"main_bg_subtitle\">ⴰⴷⵔ ⵅ \\\"ⵔⵣⵓ\\\"ⴰⴼⴰⴷ ⴰⴷ ⵜⵜⴰⵡⵍⴷ</string>\n    <string name=\"show_comments_title\">ⵙⴽⵏ ⵉⵅⴼⴰⵡⴰⵍⵏ</string>\n    <string name=\"theme_title\">ⴰⵙⴳⵓⵎ</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-bg/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Докоснете лупата, за да започнете.</string>\n    <string name=\"upload_date_text\">Публикувано на %1$s</string>\n    <string name=\"no_player_found\">Не е намерен стрийм плейър. Инсталиране на VLC\\?</string>\n    <string name=\"install\">Инсталиране</string>\n    <string name=\"cancel\">Отмяна</string>\n    <string name=\"open_in_browser\">Отваряне в браузър</string>\n    <string name=\"open_in_popup_mode\">Отваряне в прозорец</string>\n    <string name=\"share\">Споделяне</string>\n    <string name=\"download\">Изтегляне</string>\n    <string name=\"search\">Търсене</string>\n    <string name=\"settings\">Настройки</string>\n    <string name=\"did_you_mean\">Може би имахте предвид „%1$s“\\?</string>\n    <string name=\"share_dialog_title\">Споделяне с</string>\n    <string name=\"use_external_video_player_title\">Използване на външен видео плейър</string>\n    <string name=\"use_external_video_player_summary\">Премахва аудиото при някои резолюции</string>\n    <string name=\"use_external_audio_player_title\">Използване на външен аудио плейър</string>\n    <string name=\"subscribe_button_title\">Абониране</string>\n    <string name=\"subscribed_button_title\">Абониран</string>\n    <string name=\"channel_unsubscribed\">Премахнат абонамент за канала</string>\n    <string name=\"subscription_change_failed\">Неуспешна промяна на абонамента</string>\n    <string name=\"subscription_update_failed\">Неуспешно обновление на абонамента</string>\n    <string name=\"tab_subscriptions\">Абонаменти</string>\n    <string name=\"fragment_feed_title\">Обновления</string>\n    <string name=\"controls_background_title\">Фонов режим</string>\n    <string name=\"controls_popup_title\">В прозорец</string>\n    <string name=\"download_path_title\">Директория за изтегляне на видео</string>\n    <string name=\"download_path_summary\">Папка за съхранение на изтеглените клипове</string>\n    <string name=\"download_path_dialog_title\">Въведете път за съхранение на изтеглените клипове</string>\n    <string name=\"download_path_audio_title\">Директория за изтегляне на аудио</string>\n    <string name=\"download_path_audio_summary\">Папка за съхранение на изтеглено аудио</string>\n    <string name=\"download_path_audio_dialog_title\">Въведете папка за изтегляния на аудио файлове</string>\n    <string name=\"default_resolution_title\">Резолюция по подразбиране</string>\n    <string name=\"default_popup_resolution_title\">Резолюция по подразбиране на прозореца</string>\n    <string name=\"show_higher_resolutions_title\">Покажи по-високи резолюции</string>\n    <string name=\"show_higher_resolutions_summary\">Само някои устройства могат да възпроизвеждат 2K/4K видео</string>\n    <string name=\"play_with_kodi_title\">Въпроизвеждане с Kodi</string>\n    <string name=\"kore_not_found\">Инсталиране на липсващо приложение Kore?</string>\n    <string name=\"show_play_with_kodi_title\">Покажи „Възпроизвеждане с Kodi“</string>\n    <string name=\"show_play_with_kodi_summary\">Показване на опция за възпроизвеждане на видео чрез „Kodi media center“</string>\n    <string name=\"play_audio\">Аудио</string>\n    <string name=\"default_audio_format_title\">Аудио формат по подразбиране</string>\n    <string name=\"default_video_format_title\">Видео формат по подразбиране</string>\n    <string name=\"theme_title\">Тема на външния вид</string>\n    <string name=\"light_theme_title\">Светла</string>\n    <string name=\"dark_theme_title\">Тъмна</string>\n    <string name=\"black_theme_title\">Черна</string>\n    <string name=\"popup_remember_size_pos_title\">Помни размера и позицията на прозореца</string>\n    <string name=\"popup_remember_size_pos_summary\">Използвай размера и позицията на прозореца от предишния път</string>\n    <string name=\"show_search_suggestions_title\">Предложения за търсене</string>\n    <string name=\"show_search_suggestions_summary\">Изберете предложенията, които да се показват при търсене</string>\n    <string name=\"enable_search_history_title\">История на търсенията</string>\n    <string name=\"enable_search_history_summary\">Съхранявай заявките за търсене локално</string>\n    <string name=\"enable_watch_history_title\">История на гледане</string>\n    <string name=\"enable_watch_history_summary\">Запаметявай кои видеота са гледани</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Възобновяване</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Продължавай възпроизвеждането след прекъсване (например телефонно обаждане)</string>\n    <string name=\"download_dialog_title\">Изтегли</string>\n    <string name=\"show_next_and_similar_title\">Покажи „следващ“ и „подобни“</string>\n    <string name=\"show_hold_to_append_title\">Покажи съвет „Задръжте за поставяне в опашка“</string>\n    <string name=\"unsupported_url\">Непознат URL</string>\n    <string name=\"content_language_title\">Език на съдържание по подразбиране</string>\n    <string name=\"settings_category_player_title\">Плейър</string>\n    <string name=\"settings_category_player_behavior_title\">Поведение</string>\n    <string name=\"settings_category_video_audio_title\">Видео и аудио</string>\n    <string name=\"settings_category_history_title\">История и кеш</string>\n    <string name=\"settings_category_appearance_title\">Външност</string>\n    <string name=\"background_player_playing_toast\">Възпроизвеждане във фонов режим</string>\n    <string name=\"popup_playing_toast\">Възпроизвеждане в подпрозорец</string>\n    <string name=\"content\">Съдържание</string>\n    <string name=\"show_age_restricted_content_title\">Покажи съдържание с възрастови ограничения</string>\n    <string name=\"duration_live\">На живо</string>\n    <string name=\"downloads\">Изтегляния</string>\n    <string name=\"downloads_title\">Изтегляния</string>\n    <string name=\"error_report_title\">Съобщение за грешка</string>\n    <string name=\"all\">Всички</string>\n    <string name=\"disabled\">Забранено</string>\n    <string name=\"clear\">Изчисти</string>\n    <string name=\"best_resolution\">Най-добра резолюция</string>\n    <string name=\"undo\">Отмени</string>\n    <string name=\"play_all\">Възпроизведи всички</string>\n    <string name=\"notification_channel_name\">Известия от NewPipe</string>\n    <string name=\"notification_channel_description\">Известия за плейъра на NewPipe</string>\n    <string name=\"unknown_content\">[Неизвестен]</string>\n    <string name=\"general_error\">Грешка</string>\n    <string name=\"network_error\">Проблем с мрежата</string>\n    <string name=\"could_not_load_thumbnails\">Не мога да заредя всички миниатюри</string>\n    <string name=\"parsing_error\">Неуспешно пресъздаване на уебсайта</string>\n    <string name=\"content_not_available\">Съдържанието не е налично</string>\n    <string name=\"could_not_setup_download_menu\">Не мога да настроя меню за сваляне</string>\n    <string name=\"app_ui_crash\">Приложението или потребителският интерфейс се сринаха</string>\n    <string name=\"player_stream_failure\">Неуспех при възпроизвеждането на този поток</string>\n    <string name=\"player_unrecoverable_failure\">Критичен проблем с плейъра</string>\n    <string name=\"player_recoverable_failure\">Опит за възстановяване от възникналия проблем с плейъра</string>\n    <string name=\"sorry_string\">Съжаляваме, това не би трябвало да се случва.</string>\n    <string name=\"error_report_button_text\">Докладвай чрез имейл</string>\n    <string name=\"error_snackbar_message\">Съжалявам, нещо се обърка.</string>\n    <string name=\"error_snackbar_action\">Доклад</string>\n    <string name=\"what_device_headline\">Инфо:</string>\n    <string name=\"what_happened_headline\">Какво се случи:</string>\n    <string name=\"your_comment\">Вашият коментар (на английски):</string>\n    <string name=\"error_details_headline\">Подробности:</string>\n    <string name=\"detail_thumbnail_view_description\">Възпроизвеждане на видео, продължителност:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Миниатюра на аватара на качилия видео</string>\n    <string name=\"detail_likes_img_view_description\">Харесвания</string>\n    <string name=\"detail_dislikes_img_view_description\">Нехаресвания</string>\n    <string name=\"search_no_results\">Няма резултати</string>\n    <string name=\"empty_list_subtitle\">Тук няма нищо</string>\n    <string name=\"video\">Видео</string>\n    <string name=\"audio\">Аудио</string>\n    <string name=\"retry\">Опитай отново</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s абонат</item>\n        <item quantity=\"other\">%s абонати</item>\n    </plurals>\n    <string name=\"no_views\">Няма гледания</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s гледане</item>\n        <item quantity=\"other\">%s гледания</item>\n    </plurals>\n    <string name=\"no_videos\">Няма клипове</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s видеоклип</item>\n        <item quantity=\"other\">%s видеоклипове</item>\n    </plurals>\n    <string name=\"pause\">Пауза</string>\n    <string name=\"delete\">Изтрий</string>\n    <string name=\"checksum\">Контролна сума</string>\n    <string name=\"ok\">ОК</string>\n    <string name=\"msg_name\">Име на файла</string>\n    <string name=\"msg_threads\">Нишки</string>\n    <string name=\"msg_error\">Грешка</string>\n    <string name=\"msg_running\">NewPipe Изтегляне</string>\n    <string name=\"msg_running_detail\">Докосни за подробности</string>\n    <string name=\"msg_wait\">Моля, изчакайте…</string>\n    <string name=\"msg_copied\">Копирано в клипборда</string>\n    <string name=\"settings_file_charset_title\">Позволени символи в името на файловете</string>\n    <string name=\"settings_file_replacement_character_summary\">Невалидните символи се заменят с тази стойност</string>\n    <string name=\"settings_file_replacement_character_title\">Символ за замяна</string>\n    <string name=\"charset_letters_and_digits\">Букви и цифри</string>\n    <string name=\"title_activity_about\">За NewPipe</string>\n    <string name=\"title_licenses\">Лицензи от трети страни</string>\n    <string name=\"tab_about\">За приложението</string>\n    <string name=\"tab_licenses\">Лицензи</string>\n    <string name=\"app_description\">Безплатно и леко поточно предаване за Android.</string>\n    <string name=\"view_on_github\">Виж в GitHub</string>\n    <string name=\"controls_download_desc\">Изтегляне на стрийм файл</string>\n    <string name=\"show_info\">Покажи информация</string>\n    <string name=\"tab_bookmarks\">Отметнати плейлисти</string>\n    <string name=\"controls_add_to_playlist_title\">Добавяне към</string>\n    <string name=\"use_inexact_seek_title\">Използвай бързо, но неточно превъртане</string>\n    <string name=\"use_inexact_seek_summary\">По-бързо превъртане с по-ниска прецизност. Превъртане с по 5, 15 или 25 секунди няма да работи с тази опция</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Кеш-паметта с изображения е изтрита</string>\n    <string name=\"metadata_cache_wipe_title\">Изтрий кешираните мета данни</string>\n    <string name=\"metadata_cache_wipe_summary\">Премахни всички метаданни за уебстраници от кеш-паметта</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Кеш-паметта с метаданни бе изтрита</string>\n    <string name=\"auto_queue_title\">Автоматично поставяне на следващия поток в опашка</string>\n    <string name=\"auto_queue_summary\">Добавете подобни потоци към опашката при възпроизвеждане на последния поток, освен ако повторението не е активирано</string>\n    <string name=\"default_content_country_title\">Държава, за която да бъде показвано съдържание</string>\n    <string name=\"settings_category_debug_title\">Отстраняване на грешки</string>\n    <string name=\"always\">Винаги</string>\n    <string name=\"just_once\">Само веднъж</string>\n    <string name=\"file\">Файл</string>\n    <string name=\"switch_to_background\">Мини във фонов режим</string>\n    <string name=\"switch_to_popup\">Мини в нов прозорец</string>\n    <string name=\"switch_to_main\">Мини към основен режим</string>\n    <string name=\"import_data_title\">Внасяне на база данни</string>\n    <string name=\"export_data_title\">Изнасяне на база данни</string>\n    <string name=\"import_data_summary\">Замества текущата ви история, абонаменти, списъци за възпроизвеждане и (по избор) настройки</string>\n    <string name=\"export_data_summary\">Изнасяне на история, абонаменти, плейлисти и настройки</string>\n    <string name=\"clear_views_history_title\">Изтрий историята с изгледани</string>\n    <string name=\"delete_view_history_alert\">Изтрий цялата история с изгледани\\?</string>\n    <string name=\"watch_history_deleted\">Историята с изгледани е изтрита</string>\n    <string name=\"clear_search_history_title\">Изтрий историята на търсенията</string>\n    <string name=\"clear_search_history_summary\">Изтрива историята с въвежданите за търсене ключови думи</string>\n    <string name=\"delete_search_history_alert\">Изтрий цялата история на търсенията\\?</string>\n    <string name=\"search_history_deleted\">Историята на търсене е изтрита</string>\n    <string name=\"external_player_unsupported_link_type\">Външните плейъри не поддържат този вид линкове</string>\n    <string name=\"invalid_directory\">Невалидна директория</string>\n    <string name=\"invalid_source\">Невалиден файл или източник на съдържание</string>\n    <string name=\"invalid_file\">Файлът не съществува или липсва разрешение за четене и/или запис</string>\n    <string name=\"file_name_empty_error\">Името на файла не може да бъде празно</string>\n    <string name=\"error_occurred_detail\">Възникна грешка: %1$s</string>\n    <string name=\"no_streams_available_download\">Не са налични източници за изтегляне</string>\n    <string name=\"no_subscribers\">Няма абонати</string>\n    <string name=\"create\">Създай</string>\n    <string name=\"dismiss\">Откажи</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s от %2$s под лиценза %3$s</string>\n    <string name=\"contribution_title\">Съдействайте</string>\n    <string name=\"contribution_encouragement\">За всичко, което се сетите: превод, промени по дизайна, изчистване на кода или много сериозни промени по кода – помощта е винаги добре дошла. Колкото повече развитие, толкова по-добре!</string>\n    <string name=\"donation_title\">Дарение</string>\n    <string name=\"donation_encouragement\">NewPipe се разработва от доброволци, които отделят от своето време, за да предоставят най-доброто потребителско изживяване. Включете се в разработката като почерпите разработчиците с една чашка кафе, които да изпият, докато правят NewPipe още по-добро приложение.</string>\n    <string name=\"give_back\">Дари</string>\n    <string name=\"website_title\">Уебсайт</string>\n    <string name=\"website_encouragement\">Посетете сайта на NewPipe за повече информация и новини.</string>\n    <string name=\"privacy_policy_title\">Политиката на NewPipe за личните данни</string>\n    <string name=\"privacy_policy_encouragement\">Проектът NewPipe се отнася много сериозно към вашата поверителност. За това, приложението не събира никакви данни без вашето съгласие.\n\\nНашата политика за личните данни обяснява подробно какви данни изпращате и къде се съхраняват, когато изпращате съобщения за грешки.</string>\n    <string name=\"read_privacy_policy\">Прочетете нашата политика за поверителност</string>\n    <string name=\"app_license_title\">Лицензът на NewPipe</string>\n    <string name=\"no_player_found_toast\">Липсва стрийм плейър (можете да изтеглите VLC, за да пуснете стрийма).</string>\n    <string name=\"show_hold_to_append_summary\">Покажи съвет при натискане на фона или изскачащия бутон във видеоклипа \\\"Подробности:“</string>\n    <string name=\"clear_views_history_summary\">Изтрива историята на възпроизвежданите стриймове и позицията на възпроизвеждането</string>\n    <string name=\"video_streams_empty\">Не са намерени видео стриймове</string>\n    <string name=\"audio_streams_empty\">Не са намерени аудио стриймове</string>\n    <string name=\"info_labels\">Какво:\\nЗаявка:\\nЕзик на съдържанието:\\nДържава на съдържанието:\\nЕзик на приложението:\\nУслуга:\\nGMT Време:\\nПакет:\\nВерсия:\\nВерсия на ОС:</string>\n    <string name=\"detail_drag_description\">Пренареди чрез плъзгане</string>\n    <string name=\"start\">Начало</string>\n    <string name=\"rename\">Преименувай</string>\n    <string name=\"no_available_dir\">Моля, определете папка за изтегляне по-късно в настройките</string>\n    <string name=\"msg_popup_permission\">Това разрешение се изисква за\n\\nвъзпроизвеждане в отделен прозорец</string>\n    <string name=\"one_item_deleted\">1 елемент е изтрит.</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA заявка</string>\n    <string name=\"recaptcha_request_toast\">Изисква се въвеждане на reCAPTCHA</string>\n    <string name=\"settings_category_downloads_title\">Изтегляне</string>\n    <string name=\"charset_most_special_characters\">Повечето специални символи</string>\n    <string name=\"app_license\">NewPipe е свободен софтуер с авторски права: можете да го използвате, изучавате, споделяте и подобрявате по желание. По-конкретно можете да го разпространявате и/или променяте съгласно условията на Общия публичен лиценз на GNU, публикуван от Фондацията за свободен софтуер, версия 3 на лиценза или (по ваш избор) която и да е по-късна версия.</string>\n    <string name=\"read_full_license\">Прочетете лиценза</string>\n    <string name=\"title_activity_history\">История</string>\n    <string name=\"action_history\">История</string>\n    <string name=\"delete_item_search_history\">Искате ли да изтриете този елемент от историята на търсенията?</string>\n    <string name=\"title_last_played\">Последно възпроизвеждани</string>\n    <string name=\"title_most_played\">Най-възпроизвеждани</string>\n    <string name=\"main_page_content\">Съдържание на главната страница</string>\n    <string name=\"blank_page_summary\">Празна страница</string>\n    <string name=\"kiosk_page_summary\">Страница-павилион</string>\n    <string name=\"channel_page_summary\">Страница на канал</string>\n    <string name=\"select_a_channel\">Изберете канал</string>\n    <string name=\"no_channel_subscribed_yet\">За момента нямате абонаменти</string>\n    <string name=\"select_a_kiosk\">Изберете павилион</string>\n    <string name=\"export_complete_toast\">Изнасянето приключи</string>\n    <string name=\"import_complete_toast\">Внасянето приключи</string>\n    <string name=\"no_valid_zip_file\">Невалиден ZIP файл</string>\n    <string name=\"could_not_import_all_files\">Внимание: не всички файлове бяха внесени успешно.</string>\n    <string name=\"override_current_data\">Това ще замени текущата Ви инсталация.</string>\n    <string name=\"import_settings\">Искате ли да внесете и настройки?</string>\n    <string name=\"trending\">Набиращи популярност</string>\n    <string name=\"top_50\">Топ 50</string>\n    <string name=\"new_and_hot\">Ново и горещо</string>\n    <string name=\"play_queue_remove\">Премахни</string>\n    <string name=\"play_queue_stream_detail\">Детайли</string>\n    <string name=\"play_queue_audio_settings\">Аудио настройки</string>\n    <string name=\"hold_to_append\">Задръжте, за да поставите на опашката</string>\n    <string name=\"start_here_on_background\">Възпроизвеждане от тук при фонов режим</string>\n    <string name=\"start_here_on_popup\">Започнете да възпроизвеждате в изскачащ прозорец</string>\n    <string name=\"drawer_open\">Отвори навигационната лента</string>\n    <string name=\"drawer_close\">Затвори навигационната лента</string>\n    <string name=\"preferred_open_action_settings_title\">Действие при повикване от друго приложение</string>\n    <string name=\"preferred_open_action_settings_summary\">Действие по подразбиране при отваряне на съдържание — %s</string>\n    <string name=\"video_player\">Видео плейър</string>\n    <string name=\"background_player\">Във фонов режим</string>\n    <string name=\"popup_player\">Изскачащ плейър</string>\n    <string name=\"always_ask_open_action\">Винаги питай</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Получаване на инфо…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Зареждане на заявеното съдържание</string>\n    <string name=\"create_playlist\">Нов Плейлист</string>\n    <string name=\"rename_playlist\">Преименувай</string>\n    <string name=\"name\">Име</string>\n    <string name=\"add_to_playlist\">Добави към плейлист</string>\n    <string name=\"set_as_playlist_thumbnail\">Задай като миниатюра на плейлиста</string>\n    <string name=\"bookmark_playlist\">Миниатюрата на плейлиста е сменена</string>\n    <string name=\"unbookmark_playlist\">Премахни отметката</string>\n    <string name=\"delete_playlist_prompt\">Искате ли да изтриете този плейлист?</string>\n    <string name=\"playlist_creation_success\">Плейлистът е създаден</string>\n    <string name=\"playlist_add_stream_success\">Добавено към плейлист</string>\n    <string name=\"playlist_thumbnail_change_success\">Миниатюрата на плейлиста е сменена.</string>\n    <string name=\"caption_none\">Без надписи</string>\n    <string name=\"resize_fit\">Приспособи</string>\n    <string name=\"resize_fill\">Запълни</string>\n    <string name=\"resize_zoom\">Увеличи</string>\n    <string name=\"caption_auto_generated\">Авто-генерирани</string>\n    <string name=\"caption_setting_title\">Надписи</string>\n    <string name=\"caption_setting_description\">Модифицирай текстовия мащаб на надписите и стила на техния фон. За промените се изисква рестарт на приложението</string>\n    <string name=\"enable_leak_canary_summary\">Следенето за пропускане на памет може да направи приложението нестабилно</string>\n    <string name=\"enable_disposed_exceptions_title\">Докладвай за извънредни грешки</string>\n    <string name=\"import_title\">Внасяне</string>\n    <string name=\"import_from\">Внасяне от</string>\n    <string name=\"export_to\">Изнасяне във</string>\n    <string name=\"import_ongoing\">Внасяне…</string>\n    <string name=\"export_ongoing\">Изнасяне…</string>\n    <string name=\"import_file_title\">Файл с данни за внасяне</string>\n    <string name=\"previous_export\">Предишно изнасяне</string>\n    <string name=\"subscriptions_import_unsuccessful\">Неуспешно внасяне на абонатите</string>\n    <string name=\"subscriptions_export_unsuccessful\">Неуспешно изнасяне на абонатите</string>\n    <string name=\"import_youtube_instructions\">Внасяне на абонаменти в 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 файл</string>\n    <string name=\"import_soundcloud_instructions\">Внесете профил в SoundCloud, като въведете или URL адреса, или вашия ID: \\n \\n1. Включете „десктоп режим“ в браузър (сайтът е недостъпен за мобилни устройства) \\n2. Посетете връзката: %1$s \\n3. Влезте в профила си, ако се изисква \\n4. Копирайте хипервръзката на профилната страница, към която сте насочени.</string>\n    <string name=\"import_soundcloud_instructions_hint\">вашиятID, soundcloud.com/вашиятID</string>\n    <string name=\"import_network_expensive_warning\">Това действие може да изразходва голямо количество данни от вашия трафик.\n\\n\n\\nЖелаете ли да продължите?</string>\n    <string name=\"playback_speed_control\">Управление скоростта на възпроизвеждане</string>\n    <string name=\"playback_tempo\">Темпо</string>\n    <string name=\"playback_pitch\">Височина</string>\n    <string name=\"skip_silence_checkbox\">Бързо превъртане при тишина</string>\n    <string name=\"start_accept_privacy_policy\">За да се съобразим с Европейския общ регламент за защита на данните (GDPR), с настоящото обръщаме внимание на политиката за поверителност на NewPipe. Моля, прочетете го внимателно.\n\\nТрябва да го приемете, за да ни изпратите доклада за грешка.</string>\n    <string name=\"accept\">Приеми</string>\n    <string name=\"decline\">Откажи</string>\n    <string name=\"limit_data_usage_none_description\">Без ограничения</string>\n    <string name=\"limit_mobile_data_usage_title\">Ограничена резолюция при мобилни данни</string>\n    <string name=\"minimize_on_exit_title\">Минимизирай при преход към друго приложение</string>\n    <string name=\"minimize_on_exit_summary\">Действие при преминаване към друго приложение от видео плейъра — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Без минимизиране</string>\n    <string name=\"minimize_on_exit_background_description\">Минимизирай във фонов режим</string>\n    <string name=\"minimize_on_exit_popup_description\">Минимизирай в прозорец</string>\n    <string name=\"channels\">Канали</string>\n    <string name=\"playlists\">Плейлисти</string>\n    <string name=\"tracks\">Песни</string>\n    <string name=\"users\">Потребители</string>\n    <string name=\"playback_reset\">Възстанови</string>\n    <string name=\"playback_step\">Стъпка</string>\n    <string name=\"enable_disposed_exceptions_summary\">Насили докладването на неизпращаеми Rx изключения извън фрагмента или кръговрата на активност след приключване</string>\n    <string name=\"unhook_checkbox\">Откачи (може да предизвика промени)</string>\n    <string name=\"unsubscribe\">Отписване</string>\n    <string name=\"file_deleted\">Файлът е изтрит</string>\n    <string name=\"events\">Събития</string>\n    <string name=\"show_comments_title\">Покажи коментари</string>\n    <string name=\"show_comments_summary\">Изключете за скриване на коментарите</string>\n    <string name=\"autoplay_title\">Автоматично пускане</string>\n    <string name=\"tab_choose\">Избор на раздел</string>\n    <string name=\"settings_category_updates_title\">Промени</string>\n    <string name=\"enable_playback_resume_title\">Възобнови възпроизвеждането</string>\n    <string name=\"settings_category_clear_data_title\">Изтрии данни</string>\n    <string name=\"search_showing_result_for\">Показване на резултати за: %s</string>\n    <string name=\"no_comments\">Няма коментари</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s слушател</item>\n        <item quantity=\"other\">%s слушатели</item>\n    </plurals>\n    <string name=\"no_one_listening\">Няма слушатели</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s зрител</item>\n        <item quantity=\"other\">%s зрители</item>\n    </plurals>\n    <string name=\"no_one_watching\">Няма зрители</string>\n    <string name=\"clear_playback_states_summary\">Изтрива всички позиции на възпроизвеждане</string>\n    <string name=\"unsupported_url_dialog_message\">URL адресът не можа да бъде разпознат. Да се отвори ли с друго приложение?</string>\n    <string name=\"show_description_title\">Покажи описание</string>\n    <string name=\"night_theme_title\">Нощна тема</string>\n    <string name=\"notification_colorize_title\">Оцветяване на известие</string>\n    <string name=\"notification_action_nothing\">Нищо</string>\n    <string name=\"notification_action_shuffle\">Разбъркване</string>\n    <string name=\"notification_action_repeat\">Повторение</string>\n    <string name=\"open_with\">Отваряне с</string>\n    <string name=\"notification_scale_to_square_image_title\">Миниатюра 1:1</string>\n    <string name=\"high_quality_larger\">Висококачествени (големи)</string>\n    <string name=\"autoplay_summary\">Автоматично възпроизвеждане — %s</string>\n    <string name=\"never\">Никога</string>\n    <string name=\"missions_header_finished\">Завършено</string>\n    <string name=\"paused\">прекъснат</string>\n    <string name=\"restricted_video_no_stream\">Това видео е с възрастови ограничения.\n\\nПоради новите политики на YouTube за видеа с възрастови ограничения, NewPipe не може да достъпи нито един от видеопотоците на това видео и не може да го възпроизведе.</string>\n    <string name=\"dont_show\">Не показвай</string>\n    <string name=\"local_search_suggestions\">Местни предложения за търсене</string>\n    <string name=\"error_report_open_github_notice\">Моля проверете дали има създадена дискусия за срив като този. Постъпилите дубликати са в ущърб на така ценното време за разработка.</string>\n    <string name=\"show_meta_info_title\">Покажи мета данни</string>\n    <string name=\"grid\">Мрежа</string>\n    <string name=\"list\">Списък</string>\n    <string name=\"notification_action_3_title\">Четвърто действие</string>\n    <string name=\"seek_duration_title\">Стъпка на превъртане</string>\n    <string name=\"mark_as_watched\">Маркирай като гледан</string>\n    <string name=\"notification_action_1_title\">Второ действие</string>\n    <string name=\"notification_action_0_title\">Първо действие</string>\n    <string name=\"notification_action_2_title\">Трето действие</string>\n    <string name=\"notification_action_4_title\">Пето действие</string>\n    <string name=\"notification_actions_at_most_three\">Изберете до три действия за компактното известие!</string>\n    <string name=\"clear_queue_confirmation_title\">Потвърждение за изтриване на опашката</string>\n    <string name=\"auto\">Автоматично</string>\n    <string name=\"show_description_summary\">Изключете за скриване на описанията под видеата и допълнителната информация</string>\n    <string name=\"wifi_only\">Само при Wi-Fi</string>\n    <string name=\"list_view_mode\">Вид на списъка</string>\n    <string name=\"enable_playback_resume_summary\">Възстанови последната позиция</string>\n    <string name=\"app_update_available_notification_title\">Нова версия на NewPipe е налична!</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Миниатюри на лентата за превъртане</string>\n    <string name=\"low_quality_smaller\">Нискокачествени (малки)</string>\n    <string name=\"queued\">на опашка</string>\n    <string name=\"updates_setting_title\">Актуализации</string>\n    <string name=\"overwrite\">Презаписване</string>\n    <string name=\"overwrite_unrelated_warning\">Файл с това име вече съществува</string>\n    <string name=\"show_error\">Покажи грешка</string>\n    <string name=\"error_connect_host\">Неуспешна връзка със сървъра</string>\n    <string name=\"error_unknown_host\">Неуспешно намиране на сървър</string>\n    <string name=\"error_ssl_exception\">Неуспешно установяване на сигурна връзка</string>\n    <string name=\"overwrite_failed\">неуспешно презаписване на файла</string>\n    <string name=\"pause_downloads\">Прекъсни изтеглянията</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Изтрито %1$s изтегляне</item>\n        <item quantity=\"other\">Изтрити бяха %1$s изтегляния</item>\n    </plurals>\n    <string name=\"error_http_unsupported_range\">Сървърът не приема мулти-нишкови изтегляния, прави се нов опит с @string/msg_threads = 1</string>\n    <string name=\"error_download_resource_gone\">Неуспешно възстановяване на това изтегляне</string>\n    <string name=\"radio\">Радио</string>\n    <string name=\"feed_subscription_not_loaded_count\">Не са заредени: %d</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d избран</item>\n        <item quantity=\"other\">%d избрани</item>\n    </plurals>\n    <string name=\"feed_group_dialog_select_subscriptions\">Изберете абонаменти</string>\n    <string name=\"georestricted_content\">Съдържанието не е налично във Вашата държава.</string>\n    <string name=\"no_app_to_open_intent\">Няма подходящо инсталирано приложение за отваряне на файла</string>\n    <string name=\"metadata_support\">Поддръжка</string>\n    <string name=\"metadata_host\">Сървър</string>\n    <string name=\"metadata_privacy_public\">Публичен</string>\n    <string name=\"app_language_title\">Език на интерфейса</string>\n    <string name=\"mute\">Спри звука</string>\n    <string name=\"post_processing\">пост-обработката</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Изтеглянето завърши</item>\n        <item quantity=\"other\">%s изтегляния са готови</item>\n    </plurals>\n    <string name=\"generate_unique_name\">Създай уникално име</string>\n    <string name=\"delete_downloaded_files\">Изтрий изтеглените файлове</string>\n    <string name=\"feed_group_dialog_empty_selection\">Няма избрани абонаменти</string>\n    <string name=\"playlist_page_summary\">Страница на плейлиста</string>\n    <string name=\"chapters\">Глави</string>\n    <string name=\"metadata_licence\">Лиценз</string>\n    <string name=\"metadata_tags\">Маркери</string>\n    <string name=\"metadata_privacy\">Поверителност</string>\n    <string name=\"metadata_language\">Език</string>\n    <string name=\"metadata_privacy_internal\">Вътрешен</string>\n    <string name=\"on\">Включен</string>\n    <string name=\"off\">Изключен</string>\n    <string name=\"open_website_license\">Отвори уеб-страницата</string>\n    <string name=\"detail_heart_img_view_description\">Отбелязан със сърце от автора</string>\n    <string name=\"conferences\">Конференции</string>\n    <string name=\"most_liked\">Най-харесвани</string>\n    <string name=\"done\">Готово</string>\n    <string name=\"comments_tab_description\">Коментари</string>\n    <string name=\"metadata_privacy_unlisted\">Скрит</string>\n    <string name=\"metadata_privacy_private\">Частен</string>\n    <string name=\"remote_search_suggestions\">Предложения за отдалечено търсене</string>\n    <string name=\"peertube_instance_add_title\">Добави инстанция</string>\n    <string name=\"videos_string\">Видеа</string>\n    <string name=\"error_report_open_issue_button_text\">Доклад в GitHub</string>\n    <string name=\"copy_for_github\">Копиране във форматиран вид</string>\n    <string name=\"infinite_videos\">∞ клипове</string>\n    <string name=\"more_than_100_videos\">100+ видеа</string>\n    <string name=\"recovering\">възстановяване</string>\n    <string name=\"video_detail_by\">От %s</string>\n    <string name=\"app_update_notification_channel_name\">Известие за нова версия</string>\n    <string name=\"description_tab_description\">Описание</string>\n    <string name=\"drawer_header_description\">Превключване на услуги, текущо избран:</string>\n    <string name=\"msg_calculating_hash\">Калкулиране на хеш</string>\n    <string name=\"no_playlist_bookmarked_yet\">Няма отметнати плейлисти</string>\n    <string name=\"choose_instance_prompt\">Изберете инстанция</string>\n    <string name=\"comments_are_disabled\">Коментарите са изключени</string>\n    <string name=\"main_page_content_summary\">Кои раздели се показват на началната страница</string>\n    <string name=\"error_insufficient_storage_left\">Няма свободно място на устройството</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d секунда</item>\n        <item quantity=\"other\">%d секунди</item>\n    </plurals>\n    <string name=\"remove_watched\">Премахни изгледаните</string>\n    <string name=\"error_unable_to_load_comments\">Неуспешно зареждане на коментарите</string>\n    <string name=\"metadata_age_limit\">Възрастова граница</string>\n    <string name=\"stop\">Прекъсване</string>\n    <string name=\"max_retry_desc\">Максимален брой опити преди отменяне на изтеглянето</string>\n    <string name=\"feed_create_new_group_button_title\">Създай</string>\n    <string name=\"feed_group_dialog_delete_message\">Искате ли да изтриете тази група?</string>\n    <string name=\"content_not_supported\">Това съдържание не се поддържа от NewPipe.\n\\n\n\\nЕвентуално може да бъде поддържано в бъдещи версии.</string>\n    <string name=\"processing_may_take_a_moment\">Обработка… Ще отнеме момент</string>\n    <string name=\"new_seek_duration_toast\">Поради ограничения в ExoPlayer, стъпката за превъртане е зададена на %d секунди</string>\n    <string name=\"remove_watched_popup_warning\">Потоците, които са били гледани преди и след добавянето им към плейлиста, ще бъдат премахнати. \\nСигурни ли сте?</string>\n    <string name=\"downloads_storage_use_saf_summary\">„Storage Access Framework“ позволява изтегляния във външна SD-карта</string>\n    <string name=\"start_downloads\">Започни изтеглянията</string>\n    <string name=\"close\">Затвори</string>\n    <string name=\"clear_download_history\">Изтрий историята на изтеглянията</string>\n    <string name=\"error_file_creation\">Файлът не може да бъде създаден</string>\n    <string name=\"overwrite_finished_warning\">Изтеглен файл с това име вече съществува</string>\n    <string name=\"download_failed\">Изтеглянето се провали</string>\n    <string name=\"restore_defaults\">Възстанови първоначалните настройки</string>\n    <string name=\"enable_playback_state_lists_title\">Позиции в списъци</string>\n    <string name=\"download_to_sdcard_error_message\">Изтеглянето от външна SD карта не е възможно. Нулиране на местоположението на папката за изтегляне?</string>\n    <string name=\"unmute\">Пусни звука</string>\n    <string name=\"songs\">Песни</string>\n    <string name=\"artists\">Изпълнители</string>\n    <string name=\"albums\">Албуми</string>\n    <string name=\"recent\">Скорошни</string>\n    <string name=\"metadata_category\">Категория</string>\n    <string name=\"download_has_started\">Изтеглянето започна</string>\n    <string name=\"permission_denied\">Действието отказано от системата</string>\n    <string name=\"peertube_instance_url_summary\">Изберете любимите си PeerTube инстанции</string>\n    <string name=\"peertube_instance_add_https_only\">Поддържат се само HTTPS хипервръзки</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d минута</item>\n        <item quantity=\"other\">%d минути</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d час</item>\n        <item quantity=\"other\">%d часа</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d ден</item>\n        <item quantity=\"other\">%d дни</item>\n    </plurals>\n    <string name=\"channel_created_by\">Създаден от %s</string>\n    <string name=\"paid_content\">Съдържанието е достъпно само за хора, които са си платили, затова не може да бъде гледано или изтеглено с NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Това видео е достъпно за абонати на YouTube Music Premium, затова не може да бъде гледано или изтеглено с NewPipe.</string>\n    <string name=\"remove_watched_popup_title\">Премахни изгледаните потоци?</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Да, както и само частично изгледаните видеа</string>\n    <string name=\"subscribers_count_not_available\">Брой на абонати не е наличен</string>\n    <string name=\"peertube_instance_add_exists\">Инстанцията вече съществува</string>\n    <string name=\"missing_file\">Файлът е преместен или изтрит</string>\n    <string name=\"app_update_notification_channel_description\">Известие за нова версия на NewPipe</string>\n    <string name=\"peertube_instance_url_title\">PeerTube инстанции</string>\n    <string name=\"download_already_pending\">Има насрочено изтегляне с това име</string>\n    <string name=\"download_already_running\">Вече има активно изтегляне с това име</string>\n    <string name=\"confirm_prompt\">Искате да изтриете историята на изтеглянията или всички изтеглени файлове\\?</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Полезно при превключване към мобилни данни, въпреки че някои изтегляния не поддържат възобновяване и ще започнат отначало</string>\n    <string name=\"crash_the_app\">Срив на приложението</string>\n    <string name=\"notification_colorize_summary\">Цветът на известието да се избира според главния цвят в миниатюрата на видеото (може да не работи на всички устройства)</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Включване на \\\"Ограничен режим“ в YouTube</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube предлага „ограничен режим“, чрез който можете да филтрирате потенциално съдържание за възрастни</string>\n    <string name=\"restricted_video\">Това видео е с възрастова граница.\n\\n\n\\nВключете „%1$s“ в настройките ако искате да го пуснете.</string>\n    <string name=\"auto_device_theme_title\">Автоматична (тази на устройството)</string>\n    <string name=\"notification_scale_to_square_image_summary\">Мащабиране на миниатюрата в известието от 16:9 към 1:1 формат (възможни са изкривявания)</string>\n    <string name=\"select_a_playlist\">Избете плейлист</string>\n    <string name=\"notifications\">Известия</string>\n    <string name=\"clear_cookie_title\">Изчистване на бисквитките от reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Бисквитките от reCAPTCHA бяха почистени</string>\n    <string name=\"checking_updates_toast\">Провери за актуализации…</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"check_for_updates\">Провери за актуализации</string>\n    <string name=\"percent\">Процент</string>\n    <string name=\"unknown_quality\">Неизвестно качество</string>\n    <string name=\"unknown_format\">Неизвестен формат</string>\n    <string name=\"recently_added\">Наскоро добавено</string>\n    <string name=\"notification_action_buffering\">Буфериране</string>\n    <string name=\"crash_the_player\">Разбийте плейъра</string>\n    <string name=\"show_meta_info_summary\">Изключете, за да скриете полетата с мета информация с допълнителна информация за създателя на потока, съдържанието на потока или заявка за търсене</string>\n    <string name=\"auto_queue_toggle\">Автоматично поставяне в опашка</string>\n    <string name=\"notification_actions_summary\">Редактирайте всяко действие за известяване по-долу, като го докоснете. Изберете до три от тях, които да бъдат показани в компактното известие, като използвате квадратчетата за отметка вдясно.</string>\n    <string name=\"prefer_original_audio_summary\">Изберете оригиналния аудио запис независимо от езика</string>\n    <string name=\"clear_queue_confirmation_summary\">Превключването от един плейър на друг може да замени вашата опашка</string>\n    <string name=\"prefer_descriptive_audio_summary\">Изберете аудиозапис с описания за хора с увредено зрение, ако има такъв</string>\n    <string name=\"left_gesture_control_title\">Действие с жест наляво</string>\n    <string name=\"prefer_descriptive_audio_title\">Предпочитай описателно аудио</string>\n    <string name=\"progressive_load_interval_summary\">Променете размера на интервала на зареждане на прогресивно съдържание (в момента %s). По-ниска стойност може да ускори първоначалното им зареждане</string>\n    <string name=\"prefer_original_audio_title\">Предпочитай оригинално аудио</string>\n    <string name=\"clear_queue_confirmation_description\">Опашката на активния плейър ще бъде заменена</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Полезно, например, ако използвате слушалки със счупени физически бутони</string>\n    <string name=\"progressive_load_interval_title\">Размер на интервала на зареждане при възпроизвеждане</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Игнорирайте събитията с хардуерни медийни бутони</string>\n    <string name=\"left_gesture_control_summary\">Изберете жест за лявата половина на екрана на плейъра</string>\n    <string name=\"enable_playback_state_lists_summary\">Покажи индикатори за позиция на възпроизвеждане в списъци</string>\n    <string name=\"notification_actions_summary_android13\">Редактирайте всяко действие за известяване по-долу, като щракнете върху него. Първите три действия (възпроизвеждане/пауза, предишно и следващо) се задават от системата и не могат да бъдат конфигурирани.</string>\n    <string name=\"right_gesture_control_summary\">Изберете жест за дясната половина на екрана на плейъра</string>\n    <string name=\"right_gesture_control_title\">Действие с жест надясно</string>\n    <string name=\"start_main_player_fullscreen_title\">Стартирайте основния плейър на цял екран</string>\n    <string name=\"streams_notification_channel_description\">Известия за нови видеоклипове в абонаментите</string>\n    <string name=\"enable_streams_notifications_summary\">Известявайте за нови видеоклипове в абонаментите</string>\n    <string name=\"yes\">Да</string>\n    <string name=\"no\">Не</string>\n    <string name=\"brightness\">Яркост</string>\n    <string name=\"volume\">Сила на звука</string>\n    <string name=\"none\">Нищо</string>\n    <string name=\"channel_tab_about\">За канала</string>\n    <string name=\"show_less\">Покажи по-малко</string>\n    <string name=\"show_more\">Покажи повече</string>\n    <string name=\"manual_update_description\">Ръчно проверяване за нови версии</string>\n    <string name=\"enqueued\">Добавено в опашка</string>\n    <string name=\"feed_new_items\">Нови неща в емисията</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"feed_notification_loading\">Зареждане на емисия…</string>\n    <string name=\"semitone\">Полутон</string>\n    <string name=\"app_update_unavailable_toast\">Ползвате най-новата в ерсия на NewPipe</string>\n    <string name=\"app_update_available_notification_text\">Цъкнете да изтеглите %s</string>\n    <string name=\"enqueue\">Добавяне в опашка</string>\n    <string name=\"error_http_no_content\">Сървърът не предостави данни</string>\n    <string name=\"remove_duplicates_title\">Премахни повторения?</string>\n    <string name=\"feed_groups_header_title\">Група от канали</string>\n    <string name=\"feed_load_error_account_info\">Неуспешно зареждане на емисия за \\'%s\\'.</string>\n    <string name=\"feed_load_error_terminated\">Профилът на автора е бил отстранен. \\nNewPipe няма да може да зареди тази емисия вече. \\nИскате ли да махнете абонамента от този канал?</string>\n    <string name=\"feed_update_threshold_option_always_update\">Винаги опреснявай</string>\n    <string name=\"feed_load_error\">Грешка при зареждане на емисия</string>\n    <string name=\"feed_show_hide_streams\">Покажи/Скрий потоци</string>\n    <string name=\"private_content\">Съдържанието е лично, затова не може да бъде възпроизведено или изтеглено от NewPipe.</string>\n    <string name=\"select_night_theme_toast\">Можете да изберете любимата си тъмна тема по-долу</string>\n    <string name=\"tablet_mode_title\">Режим таблет</string>\n    <string name=\"metadata_subscribers\">Абонати</string>\n    <string name=\"selected_stream_external_player_not_supported\">Избраният поток не се поддъжа от външни плеъри</string>\n    <string name=\"settings_category_exoplayer_title\">Настройки на ExoPlayer</string>\n    <string name=\"sort\">Подредба</string>\n    <string name=\"feed_show_upcoming\">Предстоящи</string>\n    <string name=\"audio_track_type_original\">оригинално</string>\n    <string name=\"channel_tab_videos\">Видеа</string>\n    <string name=\"audio_track_type_dubbed\">дублирано</string>\n    <string name=\"open_play_queue\">Отваряне на опашка</string>\n    <string name=\"duration\">Времетраене</string>\n    <string name=\"more_options\">Повече настройки</string>\n    <string name=\"image_quality_title\">Качество на изображенията</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist\">Сподели плейлиста</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s отговор</item>\n        <item quantity=\"other\">%s отговора</item>\n    </plurals>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"peertube_instance_url_help\">Може да си харесате инстанции на %s</string>\n    <string name=\"peertube_instance_add_fail\">Инстанцията не можа да бъде потвърдена</string>\n    <string name=\"settings_category_player_notification_title\">Известие на плеъра</string>\n    <string name=\"msg_failed_to_copy\">Неуспешно копиране в клипборда</string>\n    <string name=\"faq_title\">Често задавани въпроси</string>\n    <string name=\"faq\">Отвори уеб страницата</string>\n    <string name=\"title_activity_play_queue\">Възпроизвеждане на опашка</string>\n    <string name=\"leak_canary_not_available\">LeakCanary не е открито</string>\n    <string name=\"show_memory_leaks\">Покажи къде изтича паметта</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Спиране на бърз режим</string>\n    <string name=\"feed_group_dialog_empty_name\">Име на празна група</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Използване на декодера на ExoPlayer като резервен</string>\n    <string name=\"audio_track_type_descriptive\">описателно</string>\n    <string name=\"feed_show_watched\">Напълно изгледани</string>\n    <string name=\"settings_category_player_notification_summary\">Конфигуриране на известивето за текущо възпроизвеждания поток</string>\n    <string name=\"select_audio_track_external_players\">Избор на аудио пътечка за външни плеъри</string>\n    <string name=\"no_video_streams_available_for_external_players\">Няма налични потоци за външни плеъри</string>\n    <string name=\"feed_load_error_fast_unknown\">Бързият режим на емисията не предостави повече информация за това.</string>\n    <string name=\"night_theme_available\">Тази настройка е налична само ако %s е избран за тема</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Няма налични аудио потоци за външни плеъри</string>\n    <string name=\"metadata_avatars\">Аватари</string>\n    <string name=\"fast_mode\">Бърз режим</string>\n    <string name=\"error_path_creation\">Избраната директорие не можа да бъде създадена</string>\n    <string name=\"streams_notifications_interval_title\">Честота на проверка</string>\n    <string name=\"next_stream\">Следващ поток</string>\n    <string name=\"settings_category_feed_title\">Емисия</string>\n    <string name=\"settings_category_backup_restore_title\">Резервно копие и възстановяване</string>\n    <string name=\"loading_metadata_title\">Зареждане на метаданни…</string>\n    <string name=\"restore_defaults_confirmation\">Искате ли да възстановите настройките по подразбиране?</string>\n    <string name=\"show_age_restricted_content_summary\">Покажи съдържание, което вероятно е неподходящо за деца, защото има възрастово ограничение (например 18+)</string>\n    <string name=\"error_report_notification_toast\">Възникна грешка, погледнете известието</string>\n    <string name=\"no_dir_yet\">Не е избрана директория за теглене. Изберете директорията за теглене по подразбиране сега</string>\n    <string name=\"audio_track\">Аудио поток</string>\n    <string name=\"enqueue_stream\">Добави в опашка</string>\n    <string name=\"settings_category_exoplayer_summary\">Управление на някои настройки за ExoPlayer. Тези промени изискват рестартиране на плеъра, за да се отразят</string>\n    <string name=\"select_quality_external_players\">Избор на качество за външни плеъри</string>\n    <string name=\"notifications_disabled\">Известията са спрени</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer по подразбиране</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Смятате ли, че емисията зарежда прекалено бавно? Ако смятате така, може да пробвате да включите режима за бързо зареждане (може да го промените от настройките или чрез бутона по-долу).\n\\n\n\\nNewPipe предлага два режима за зареждане:\n\\n• Зареждане на цялата страница на абонамента, което е бавно, но и пълно.\n\\n• Изпозване на специална страница, предоставена от услугата, което е бързо, но обичайно е и непълно.\n\\n\n\\nРазликата между двете е, че бързият режим няма пълна информация, например времетраенето и вида (не може да различава между видеа на живо и обикновени) и може да върне по-малко видеа.\n\\n\n\\nYoutube е примерна услуга, която предоставя този метод чрез RSS емисия.\n\\n\n\\nНакратко, изборът се свежда до предпочинанието ви: бързина или точна информация.</string>\n    <string name=\"feed_oldest_subscription_update\">Емисията е последно обновявана: %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Налично за някои услуги, обичайно е много по-бързо, но връща ограничено количество видеа и често пъти непълна информация (например няма времетраене, вид на видеото, дали е на живо)</string>\n    <string name=\"peertube_instance_add_help\">Въведете URL адреса на инстанцията</string>\n    <string name=\"play_queue_audio_track\">Аудио: %s</string>\n    <string name=\"show_channel_details\">Покажи информация за канала</string>\n    <string name=\"playlist_no_uploader\">Авто-генерирани (не е намерен ъплоудер)</string>\n    <string name=\"create_error_notification\">Създай известие за грешка</string>\n    <string name=\"auto_update_check_description\">NewPipe може автоматично да проверява за нови версии от време на време и да ви известява при наличие.\n\\nИскате ли да го включите?</string>\n    <string name=\"error_http_not_found\">Не е намерено</string>\n    <string name=\"error_insufficient_storage\">Няма достатъчно свободно пространство на устройвството</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe бе затворен, докато обработваше файла</string>\n    <string name=\"feed_show_partially_watched\">Частично гледани</string>\n    <string name=\"unknown_audio_track\">Неизвестен</string>\n    <string name=\"you_successfully_subscribed\">Абонирахте се за този канал</string>\n    <string name=\"get_notified\">Получавай известия</string>\n    <string name=\"feed_processing_message\">Обработване на емисия…</string>\n    <string name=\"feed_update_threshold_summary\">Време, след което се смята, че един абонамент е остарял — %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Пускане на бърз режим</string>\n    <string name=\"image_quality_high\">Високо качество</string>\n    <string name=\"image_quality_low\">Ниско качество</string>\n    <string name=\"image_quality_medium\">Средно качество</string>\n    <string name=\"image_quality_none\">Не зареждай изображения</string>\n    <string name=\"previous_stream\">Предишен поток</string>\n    <string name=\"channel_tab_albums\">Албуми</string>\n    <string name=\"channel_tab_playlists\">Плейлисти</string>\n    <string name=\"channel_tab_channels\">Канали</string>\n    <string name=\"channel_tab_livestreams\">На живо</string>\n    <string name=\"error_progress_lost\">Прогресът е загубен, защото файлът е изтрит</string>\n    <string name=\"card\">Карта</string>\n    <string name=\"delete_downloaded_files_confirm\">Изтрий всички изтеглени файлове от диска?</string>\n    <string name=\"enable_queue_limit_desc\">Едно изтегляне ще се изпълнява едновременно</string>\n    <string name=\"downloads_storage_ask_title\">Подкана за папка за изтегляне</string>\n    <string name=\"systems_language\">Система по подразбиране</string>\n    <string name=\"remove_duplicates\">Премахване на дубликати</string>\n    <string name=\"remove_duplicates_message\">Искате ли да премахнете всички дублиращи се потоци в този плейлист?</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Покажи само на негрупирани абонаменти</string>\n    <string name=\"feed_hide_streams_title\">Покажи следните потоци</string>\n    <string name=\"no_appropriate_file_manager_message\">Не е намерен подходящ файлов мениджър за това действие.\n\\nМоля, инсталирайте файлов мениджър или опитайте да деактивирате „%s“ в настройките за изтегляне</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Не е намерен подходящ файлов мениджър за това действие.\n\\nМоля, инсталирайте файлов мениджър, съвместим с Storage Access Framework</string>\n    <string name=\"description_select_enable\">Разрешете избирането на текст в описанието</string>\n    <string name=\"metadata_thumbnails\">Миниатюри</string>\n    <string name=\"metadata_uploader_avatars\">Аватари на качващите</string>\n    <string name=\"toggle_all\">Превключване на всички</string>\n    <string name=\"audio_track_present_in_video\">Аудиозапис трябва вече да присъства в този поток</string>\n    <string name=\"channel_tab_tracks\">Записи</string>\n    <string name=\"show_channel_tabs_summary\">Какви раздели се показват на страниците на канала</string>\n    <string name=\"toggle_fullscreen\">Превключване на цял екран</string>\n    <string name=\"play\">Възпроизвеждане</string>\n    <string name=\"replay\">Повторение</string>\n    <string name=\"rewind\">Превъртане назад</string>\n    <string name=\"forward\">Напред</string>\n    <string name=\"share_playlist_with_list\">Споделяне на списък с URL</string>\n    <string name=\"delete_playback_states_alert\">Изтрии всички позиции на възпроизвеждане?</string>\n    <string name=\"watch_history_states_deleted\">Позициите за възпроизвеждане са изтрити</string>\n    <string name=\"main_tabs_position_title\">Позиция на основните раздели</string>\n    <string name=\"download_to_sdcard_error_title\">Няма налично външно хранилище</string>\n    <string name=\"saved_tabs_invalid_json\">Не можах да прочета запазените раздели, така че използвах тези по подразбиране</string>\n    <string name=\"permission_display_over_apps\">Дайте разрешение за показване върху други приложения</string>\n    <string name=\"related_items_tab_description\">Подобни продукти</string>\n    <string name=\"import_subscriptions_hint\">Внасяне или изнасяне на абонаменти от менюто с 3 точки</string>\n    <string name=\"no_live_streams\">Няма потоци на живо</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s нов поток</item>\n        <item quantity=\"other\">%s нови потоци</item>\n    </plurals>\n    <string name=\"subtitle_activity_recaptcha\">Натиснете „Готово“, когато решите</string>\n    <string name=\"faq_description\">Ако имате проблеми с използването на приложението, не забравяйте да проверите тези отговори на често задавани въпроси!</string>\n    <string name=\"main_page_content_swipe_remove\">Плъзнете елементи, за да ги премахнете</string>\n    <string name=\"default_kiosk_page_summary\">Kiosk по подразбиране</string>\n    <string name=\"enqueue_next_stream\">Наредете следващия</string>\n    <string name=\"enqueued_next\">Следващ в опашка</string>\n    <string name=\"loading_stream_details\">Подробностите за потока се зареждат…</string>\n    <string name=\"duplicate_in_playlist\">Плейлистите, които са оцветени в сиво, вече съдържат този елемент.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Добавен дубликат %d път(а)</string>\n    <string name=\"show_original_time_ago_title\">Показване на оригиналното време преди на елементите</string>\n    <string name=\"show_crash_the_player_title\">Покажи \\\"Сриване на плейъра\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Показва опция за срив при използване на плейъра</string>\n    <string name=\"check_new_streams\">Стартирайте проверка за нови потоци</string>\n    <string name=\"show_error_snackbar\">Покажи бърза лента за грешка</string>\n    <string name=\"local\">Местен</string>\n    <string name=\"max_retry_msg\">Максимален брой повторни опити</string>\n    <string name=\"enable_queue_limit\">Ограничете опашката за изтегляне</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Извличане от специална емисия, когато е налична</string>\n    <string name=\"unset_playlist_thumbnail\">Премахване на постоянното миниизображение</string>\n    <string name=\"enable_streams_notifications_title\">Известия за нови потоци</string>\n    <string name=\"any_network\">Всяка мрежа</string>\n    <string name=\"updates_setting_description\">Покажи известие за актуализация на приложението, когато е налична нова версия</string>\n    <string name=\"account_terminated\">Профилът е прекратен</string>\n    <string name=\"detail_pinned_comment_view_description\">Фиксиран коментар</string>\n    <string name=\"streams_not_yet_supported_removed\">Потоци, които все още не се поддържат от програмата за изтегляне, не се показват</string>\n    <string name=\"soundcloud_go_plus_content\">Това е песен на SoundCloud Go+, поне във вашата страна, така че не може да бъде предавана поточно или изтеглена от NewPipe.</string>\n    <string name=\"description_select_note\">Вече можете да изберете текст в описанието. Имайте предвид, че страницата може да трепти и връзките може да не могат да се кликват, докато сте в режим на избор.</string>\n    <string name=\"start_main_player_fullscreen_summary\">Не стартирайте видеоклипове в миниплейъра, а директно превключете в режим на цял екран, ако автоматичното завъртане е заключено. Все още можете да получите достъп до миниплейъра, като излезете от цял екран</string>\n    <string name=\"error_report_channel_description\">Известия за докладване на грешки</string>\n    <string name=\"show_original_time_ago_summary\">Оригиналните текстове от услугите ще се виждат в елементите на потока</string>\n    <string name=\"disable_media_tunneling_summary\">Деактивирайте медийното тунелиране, ако имате черен екран или заекване при възпроизвеждане на видео.</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Мултимедийното тунелиране е деактивирано по подразбиране на вашето устройство, тъй като е известно, че моделът на вашето устройство не го поддържа.</string>\n    <string name=\"error_timeout\">Изчакване на връзката</string>\n    <string name=\"downloads_storage_ask_summary\">Ще бъдете попитани къде да запазите всяко изтегляне.\n\\nАктивирайте инструмента за избор на системна папка (SAF), ако искате да изтеглите на външна SD карта</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Започвайки от Android 10, се поддържа само „Storage Access Framework“</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Ще бъдете попитани къде да запазите всяко изтегляне</string>\n    <string name=\"feed_update_threshold_title\">Праг за актуализиране на емисия</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Раздели за извличане при актуализиране на емисията. Тази опция няма ефект, ако каналът се актуализира чрез бърз режим.</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Активирайте тази опция, ако имате проблеми с инициализацията на декодера, което се връща към декодери с по-нисък приоритет, ако инициализацията на първичните декодери е неуспешна. Това може да доведе до лоша производителност при възпроизвеждане, отколкото при използване на първични декодери</string>\n    <string name=\"channel_tab_shorts\">Кратки видеоклипове</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Това заобиколно решение освобождава и инстанцира отново видео кодеци, когато възникне промяна на повърхността, вместо директно да зададе повърхността на кодека. Вече се използва от ExoPlayer на някои устройства с този проблем, тази настройка има ефект само върху Android 6 и по-нова версия\n\\n\n\\nАктивирането на тази опция може да предотврати грешки при възпроизвеждане при превключване на текущия видеоплейър или превключване на цял екран</string>\n    <string name=\"show_channel_tabs\">Раздели на канали</string>\n    <string name=\"toggle_screen_orientation\">Превключване на ориентацията на екрана</string>\n    <string name=\"image_quality_summary\">Изберете качеството на изображенията и дали изобщо да се зареждат изображения, за да намалите използването на данни и памет. Промените изчистват както кеша на изображенията в паметта, така и на диска — %s</string>\n    <string name=\"share_playlist_with_titles\">Споделяне със заглавия</string>\n    <string name=\"feed_fetch_channel_tabs\">Извличане на раздели на канали</string>\n    <string name=\"import_settings_vulnerable_format\">Настройките в изнасяния файл, който се внася, използват уязвим формат, който е отпаднал от NewPipe 0.27.0. Уверете се, че внесеният износ е от надежден източник, и предпочитайте в бъдеще да използвате само изнасяния, получени от NewPipe 0.27.0 или по-нова версия. Поддръжката за внасяне на настройки в този уязвим формат скоро ще бъде напълно премахната и тогава старите версии на NewPipe вече няма да могат да внасят настройки на изнесени от нови версии.</string>\n    <string name=\"hash_channel_name\">Видео хеш известие</string>\n    <string name=\"clear_cookie_summary\">Изчистете бисквитките, които NewPipe съхранява, когато разрешите reCAPTCHA</string>\n    <string name=\"streams_notifications_network_title\">Необходима мрежова връзка</string>\n    <string name=\"reset_settings_title\">Нулирайте настройките</string>\n    <string name=\"reset_settings_summary\">Нулирайте всички настройки до техните стойности по подразбиране</string>\n    <string name=\"reset_all_settings\">Нулирането на всички настройки ще отхвърли всички ваши предпочитани настройки и ще рестартира приложението.\n\\n\n\\nСигурни ли сте, че искате да продължите?</string>\n    <string name=\"recaptcha_solve\">Решете</string>\n    <string name=\"hash_channel_description\">Известия за напредъка на хеширането на видео</string>\n    <string name=\"streams_notification_channel_name\">Нови потоци</string>\n    <string name=\"error_report_channel_name\">Известие за доклад за грешка</string>\n    <string name=\"main_tabs_position_summary\">Преместете основния селектор на раздели най-долу</string>\n    <string name=\"error_report_notification_title\">NewPipe откри грешка, докоснете, за да докладвате</string>\n    <string name=\"no_streams\">Няма потоци</string>\n    <string name=\"disable_media_tunneling_title\">Деактивиране на медийното тунелиране</string>\n    <string name=\"missions_header_pending\">В очакване</string>\n    <string name=\"error_postprocessing_failed\">Неуспешна последваща обработка</string>\n    <string name=\"pause_downloads_on_mobile\">Прекъсване на мрежи с измерване</string>\n    <string name=\"downloads_storage_use_saf_title\">Използване на системата за избор на папки (SAF)</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Миниатюра на аватара на канала</string>\n    <string name=\"show_thumbnail_title\">Покажи миниатюра</string>\n    <string name=\"show_thumbnail_summary\">Използване на миниатюри за фон на заключения екран и за известия</string>\n    <string name=\"featured\">Представено</string>\n    <string name=\"night_theme_summary\">Изберете любимата си нощна тема — %s</string>\n    <string name=\"description_select_disable\">Деактивирайте избора на текст в описанието</string>\n    <string name=\"metadata_subchannel_avatars\">Аватари за подканали</string>\n    <string name=\"metadata_banners\">Банери</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Винаги използвайте заобикаляне на настройката на повърхността на видеоизхода на ExoPlayer</string>\n    <string name=\"clear_playback_states_title\">Изтрий позиции за възпроизвеждане</string>\n    <string name=\"audio_track_type_secondary\">вторичен</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Споделяне като временен плейлист в YouTube</string>\n    <string name=\"tab_bookmarks_short\">Плейлисти</string>\n    <string name=\"no_feed_group_created_yet\">Все още няма създадена група за емисии</string>\n    <string name=\"feed_group_page_summary\">Страница на групата канали</string>\n    <string name=\"select_a_feed_group\">Изберете група емисии</string>\n    <string name=\"search_with_service_name\">Търсене %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Търсене %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Харесвания</string>\n    <string name=\"migration_info_6_7_title\">Страница SoundCloud Top 50 е премахната</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud преустанови оригиналните класации Топ 50. Съответният раздел е премахнат от главната ви страница.</string>\n    <string name=\"migration_info_7_8_message\">YouTube преустанови комбинираната страница с популярни от 21 юли 2025 г. NewPipe замени стандартната страница с популярни с популярни предавания на живо.\\n\\nМожете също да изберете различни популярни страници в „Настройки &gt; Съдържание &gt; Съдържание на главната страница“.</string>\n    <string name=\"migration_info_7_8_title\">YouTube комбинирани популярни са премахнати</string>\n    <string name=\"trending_gaming\">Популярни игри</string>\n    <string name=\"trending_podcasts\">Популярни подкасти</string>\n    <string name=\"trending_movies\">Популярни филми и сериали</string>\n    <string name=\"trending_music\">Популярна музика</string>\n    <string name=\"short_thousand\">%s хил.</string>\n    <string name=\"short_million\">%s млн.</string>\n    <string name=\"short_billion\">%s млрд.</string>\n    <string name=\"permission_display_over_apps_message\">За да използвате изскачащия плейър, моля, изберете %1$s в следното меню с настройки на Android и активирайте %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">“Разреши показване върху други приложения”</string>\n    <string name=\"delete_file\">Изтриване на файл</string>\n    <string name=\"delete_entry\">Изтриване на запис</string>\n    <string name=\"entry_deleted\">Записът е изтрит</string>\n    <string name=\"account_terminated_service_provides_reason\">Профилът е прекратен\\n\\n%1$s предоставя тази причина: %2$s</string>\n    <string name=\"player_http_403\">HTTP грешка 403, получена от сървъра по време на възпроизвеждане, вероятно причинена от изтичане на URL адреса за стрийминг или забрана на IP адреса</string>\n    <string name=\"player_http_invalid_status\">HTTP грешка %1$s получена от сървъра по време на възпроизвеждане</string>\n    <string name=\"youtube_player_http_403\">HTTP грешка 403, получена от сървъра по време на възпроизвеждане, вероятно причинена от забрана на IP адреса или проблеми с деобфускацията на URL адреси за стрийминг</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s отказа да предостави данни, като поиска вход, за да потвърди, че заявителят не е бот.\\n\\nВашият IP адрес може да е временно забранен от %1$s. Можете да изчакате известно време или да превключите към друг IP адрес (например като включите/изключите VPN или като превключите от WiFi към мобилни данни).</string>\n    <string name=\"unsupported_content_in_country\">Това съдържание не е налично за текущо избраната държава на съдържанието.\\n\\nПроменете избора си от \\\"Настройки &gt; Съдържание &gt; Държава на съдържанието по подразбиране\\\".</string>\n    <string name=\"kao_dialog_warning\">През август 2025 г. Google обяви, че от септември 2026 г. инсталирането на приложения ще изисква проверка от разработчика за всички приложения за Android на сертифицирани устройства, включително тези, инсталирани извън Play Store. Тъй като разработчиците на NewPipe не са съгласни с това изискване, NewPipe вече няма да работи на сертифицирани устройства с Android след този период.</string>\n    <string name=\"kao_dialog_more_info\">Детайли</string>\n    <string name=\"kao_solution\">Решение</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-bm/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">ߥߊߘߏ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬.</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-bn/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"feed_create_new_group_button_title\">নতুন</string>\n    <string name=\"feed_notification_loading\">ফিড লোড হচ্ছে…</string>\n    <string name=\"fragment_feed_title\">কি নতুন</string>\n    <string name=\"app_language_title\">অ্যাপ এর ভাষা</string>\n    <string name=\"pause_downloads\">ডাউনলোড পজ করুন</string>\n    <string name=\"start_downloads\">ডাউনলোড শুরু করুন</string>\n    <string name=\"close\">বন্ধ করুন</string>\n    <string name=\"stop\">বন্ধ করুন</string>\n    <string name=\"delete_downloaded_files\">ডাউনলোড করা ফাইলগুলো ডিলিট করুন</string>\n    <string name=\"clear_download_history\">ডাওন লোড ইতিহাস মুছুন</string>\n    <string name=\"error_insufficient_storage_left\">ডিভাইস এ স্পেস নেই</string>\n    <string name=\"error_http_not_found\">পাওয়া যায় নি</string>\n    <string name=\"error_unknown_host\">সার্ভার পাওয়া যায় নি</string>\n    <string name=\"show_error\">এরর দেখান</string>\n    <string name=\"download_failed\">ডাউন লোড হয় নি</string>\n    <string name=\"paused\">পজ হয়েছে</string>\n    <string name=\"missions_header_finished\">সম্পূর্ণ</string>\n    <string name=\"auto\">অটো</string>\n    <string name=\"grid\">ছক</string>\n    <string name=\"list\">তালিকা</string>\n    <string name=\"minimize_on_exit_none_description\">কোনটি না</string>\n    <string name=\"limit_data_usage_none_description\">কোন সীমা নেই</string>\n    <string name=\"decline\">অস্বীকার করো</string>\n    <string name=\"accept\">স্বীকার করো</string>\n    <string name=\"caption_setting_title\">ক্যাপশন</string>\n    <string name=\"caption_auto_generated\">স্বয়ংক্রিয়ভাবে-তৈরিকৃত</string>\n    <string name=\"resize_zoom\">জুম</string>\n    <string name=\"resize_fill\">পূরণ</string>\n    <string name=\"resize_fit\">আটানো</string>\n    <string name=\"caption_none\">কোন ক্যাপশন নেই</string>\n    <string name=\"playlist_add_stream_success\">প্লেলিস্টকৃত</string>\n    <string name=\"playlist_creation_success\">প্লে লিস্ট তৈরি হয়েছে</string>\n    <string name=\"delete_playlist_prompt\">প্লে লিস্ট ডিলিট করতে চান\\?</string>\n    <string name=\"unbookmark_playlist\">বুকমার্ক মুছুন</string>\n    <string name=\"unmute\">আন মিউট</string>\n    <string name=\"mute\">মিউট</string>\n    <string name=\"add_to_playlist\">প্লে লিস্ট এ যুক্ত করুন</string>\n    <string name=\"name\">নাম</string>\n    <string name=\"rename_playlist\">নাম পাল্টাও</string>\n    <string name=\"create_playlist\">নতুন প্লে লিস্ট</string>\n    <string name=\"always_ask_open_action\">সবসময় জিজ্ঞেস করুন</string>\n    <string name=\"video_player\">ভিডিও প্লেয়ার</string>\n    <string name=\"drawer_close\">ড্রয়ার বন্ধ করুন</string>\n    <string name=\"drawer_open\">ড্রয়ার খুলো</string>\n    <string name=\"play_queue_audio_settings\">অডিও সেটিং</string>\n    <string name=\"play_queue_stream_detail\">বিবরণ</string>\n    <string name=\"play_queue_remove\">সরাও</string>\n    <string name=\"recently_added\">সাম্প্রতিক যুক্ত</string>\n    <string name=\"local\">স্থানীয়</string>\n    <string name=\"new_and_hot\">নতুন এবং হট</string>\n    <string name=\"top_50\">প্রথম ৫০</string>\n    <string name=\"trending\">ট্রেন্ডিং</string>\n    <string name=\"error_unable_to_load_comments\">মন্তব্যগুলি লোড করা যায় নি</string>\n    <string name=\"import_complete_toast\">আনা হয়েছে</string>\n    <string name=\"export_complete_toast\">বের করা হয়েছে</string>\n    <string name=\"select_a_playlist\">একটি প্লে লিস্ট পছন্দ করুন</string>\n    <string name=\"select_a_channel\">একটি চ্যানেল পছন্দ করুন</string>\n    <string name=\"channel_page_summary\">চ্যানেল এর পাতা</string>\n    <string name=\"blank_page_summary\">খালি পাতা</string>\n    <string name=\"title_most_played\">সবথেকে বেশি চালানো</string>\n    <string name=\"title_last_played\">শেষ চালানো</string>\n    <string name=\"action_history\">ইতিহাস</string>\n    <string name=\"title_activity_history\">ইতিহাস</string>\n    <string name=\"read_full_license\">লাইসেন্স পড়ুন</string>\n    <string name=\"app_license_title\">নিউপাইপ এর লাইসেন্স</string>\n    <string name=\"read_privacy_policy\">প্রাইভেসি পলিসি পড়ুন</string>\n    <string name=\"privacy_policy_title\">নিউপাইপ এর গোপনীয়তা নীতি</string>\n    <string name=\"website_title\">ওয়েব সাইট</string>\n    <string name=\"give_back\">ফিরিয়ে দিন</string>\n    <string name=\"donation_title\">দান করো</string>\n    <string name=\"view_on_github\">গিটহাব এ দেখুন</string>\n    <string name=\"contribution_title\">স্বেচ্ছাস্বেবা</string>\n    <string name=\"tab_licenses\">অনুমতিপত্র</string>\n    <string name=\"tab_about\">সম্পর্কিত</string>\n    <string name=\"title_licenses\">থার্ড-পার্টি লাইসেন্স সমূহ</string>\n    <string name=\"title_activity_about\">নিউপাইপ এর সম্বন্ধে</string>\n    <string name=\"charset_letters_and_digits\">শব্দ ও নম্বর</string>\n    <string name=\"settings_category_downloads_title\">ডাউনলোড</string>\n    <string name=\"done\">হয়েছে</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA চ্যালেঞ্জ</string>\n    <string name=\"one_item_deleted\">একটি আইটেম ডিলিট হয়েছে।</string>\n    <string name=\"msg_popup_permission\">এই অনুমতিটি \n\\nপপআপ মোডে খুলতে প্রয়োজন</string>\n    <string name=\"no_available_dir\">অনুগ্রহ করে একটি উপলব্ধ ডাউনলোড ডিরেক্টরি নির্বাচন করো</string>\n    <string name=\"msg_copied\">ক্লিপবোর্ডে অনুলিপি করা হয়েছে</string>\n    <string name=\"msg_wait\">অনুগ্রহপূর্বক অপেক্ষা করো…</string>\n    <string name=\"msg_running_detail\">বিস্তারিত জানার জন্য আলতো চাপ</string>\n    <string name=\"msg_running\">NewPipe ডাউনলোড হচ্ছে</string>\n    <string name=\"msg_error\">ত্রুটি</string>\n    <string name=\"msg_threads\">থ্রেড</string>\n    <string name=\"msg_name\">ফাইলের নাম</string>\n    <string name=\"ok\">ঠিক আছে</string>\n    <string name=\"rename\">নাম পরিবর্তন করুন</string>\n    <string name=\"dismiss\">সরাও</string>\n    <string name=\"checksum\">চেকসাম</string>\n    <string name=\"delete\">ডিলেট</string>\n    <string name=\"create\">তৈরি করো</string>\n    <string name=\"pause\">বিরতি</string>\n    <string name=\"start\">শুরু</string>\n    <string name=\"no_comments\">কোন মন্তব্য নেই</string>\n    <string name=\"no_videos\">কোন ভিডিও নেই</string>\n    <string name=\"no_views\">কোন ভিউ নেই</string>\n    <string name=\"no_subscribers\">কোন সাবস্ক্রাইবার নেই</string>\n    <string name=\"retry\">পুনরায় চেষ্টা করো</string>\n    <string name=\"audio\">অডিও</string>\n    <string name=\"video\">ভিডিও</string>\n    <string name=\"search_no_results\">কোন রেজাল্ট নেই</string>\n    <string name=\"detail_dislikes_img_view_description\">অপছন্দ</string>\n    <string name=\"detail_likes_img_view_description\">পছন্দ</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">আপলোডারের অবয়বের প্রতিচ্ছবি</string>\n    <string name=\"detail_thumbnail_view_description\">ভিডিও চালাও, সময়ঃ</string>\n    <string name=\"error_details_headline\">বর্ণনা:</string>\n    <string name=\"your_comment\">তোমার মন্তব্য (ইংরেজিতে):</string>\n    <string name=\"info_labels\">কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ:\\nআইপি পরিসর:</string>\n    <string name=\"what_happened_headline\">কি হয়েছিল:</string>\n    <string name=\"what_device_headline\">তথ্য:</string>\n    <string name=\"error_snackbar_action\">প্রতিবেদন</string>\n    <string name=\"error_snackbar_message\">দুঃখিত, কিছু ত্রুটি ঘটেছে।</string>\n    <string name=\"error_report_open_issue_button_text\">গিটহাব এ এরর রিপোর্ট করুন</string>\n    <string name=\"error_report_button_text\">মেইলের মাধ্যমে ত্রুটি প্রতিবেদন করুন</string>\n    <string name=\"sorry_string\">দুঃখিত, এটা ঘটা উচিত ছিল না।</string>\n    <string name=\"restore_defaults_confirmation\">তুমি কি এই সহজাত পছন্দ ফিরত চাও\\?</string>\n    <string name=\"restore_defaults\">ডিফল্ট এ ফিরে যান</string>\n    <string name=\"no_streams_available_download\">ডাউন লোড এর জন্য কোন স্ট্রিম নেই</string>\n    <string name=\"error_occurred_detail\">একটা এরর হয়েছেঃ %1$s</string>\n    <string name=\"file_name_empty_error\">ফাইল এর নাম খালি থাকতে পারে না</string>\n    <string name=\"invalid_directory\">কোন ফোল্ডার নেই</string>\n    <string name=\"missing_file\">ফাইল সরে গেছে না হয় মুছে ফেলা হয়েছে</string>\n    <string name=\"audio_streams_empty\">কোন অডিও স্ট্রিম পাওয়া যায় নি</string>\n    <string name=\"video_streams_empty\">কোন ভিডিও</string>\n    <string name=\"player_recoverable_failure\">প্লেয়ার এর এরর থেকে বেরিয়ে আসুন</string>\n    <string name=\"player_stream_failure\">স্ট্রিম টি চালানো গেল না</string>\n    <string name=\"app_ui_crash\">অ্যাপ / UI ক্র্যাশ করেছে</string>\n    <string name=\"could_not_setup_download_menu\">ডাউনলোড মেনু সেটআপ করা যায়নি</string>\n    <string name=\"content_not_available\">কন্টেন্ট উপলব্ধ নয়</string>\n    <string name=\"parsing_error\">ওয়েবসাইট বিশ্লেষন করা যায়নি</string>\n    <string name=\"could_not_load_thumbnails\">সব থাম্বনেইল লোড করা যায়নি</string>\n    <string name=\"network_error\">নেটওয়ার্ক ত্রুটি</string>\n    <string name=\"download_to_sdcard_error_title\">বাহ্যিক স্টোরেজ নেই</string>\n    <string name=\"general_error\">ত্রুটি</string>\n    <string name=\"search_history_deleted\">সার্চ ইতিহাস ডিলিট হয়েছে</string>\n    <string name=\"delete_search_history_alert\">সমগ্র সার্চ ইতিহাস মুছবেন\\?</string>\n    <string name=\"clear_search_history_summary\">সার্চের ইতিহাস মোছা হয়</string>\n    <string name=\"clear_search_history_title\">সার্চ ইতিহাস মুছুন</string>\n    <string name=\"watch_history_states_deleted\">প্লে ব্যাক এর অবস্থান মোছা হয়েছে</string>\n    <string name=\"delete_playback_states_alert\">সমস্ত প্লে লিস্ট এর অবস্থান মুছবেন\\?</string>\n    <string name=\"clear_playback_states_summary\">সমস্ত প্লে লিস্ট এর অবস্থান মুছে ফেলুন</string>\n    <string name=\"clear_playback_states_title\">প্লে লিস্ট এর অবস্থান মুছে ফেলুন</string>\n    <string name=\"watch_history_deleted\">দেখার ইতিহাস মুছে গেছে</string>\n    <string name=\"delete_view_history_alert\">সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন\\?</string>\n    <string name=\"clear_views_history_title\">দেখার ইতিহাস মুছে ফেলুন</string>\n    <string name=\"export_data_title\">ডাটা বেস এক্সপোর্ট করুন</string>\n    <string name=\"import_data_title\">ডাটাবেস আনুন</string>\n    <string name=\"switch_to_main\">মেন এ ফিরে যান</string>\n    <string name=\"switch_to_popup\">পপ-আপ এ খুলুন</string>\n    <string name=\"switch_to_background\">পেছনে নিয়ে যান</string>\n    <string name=\"unknown_content\">[অজানা]</string>\n    <string name=\"app_update_notification_channel_description\">নতুন নিউপাইপ সংস্করণের বিজ্ঞপ্তি</string>\n    <string name=\"app_update_notification_channel_name\">অ্যাপ আপডেট এর সূচনা</string>\n    <string name=\"notification_channel_name\">নিউ পাইপ এর সূচনা</string>\n    <string name=\"file\">ফাইল</string>\n    <string name=\"just_once\">একবার মাত্র</string>\n    <string name=\"always\">সবসময়</string>\n    <string name=\"play_all\">সব চালু করুন</string>\n    <string name=\"file_deleted\">ফাইল ডিলিট হয়েছে</string>\n    <string name=\"undo\">ফিরে যাও</string>\n    <string name=\"best_resolution\">সেরা রেজুলিউসন</string>\n    <string name=\"clear\">পরিষ্কার</string>\n    <string name=\"disabled\">নিস্ক্রীয়</string>\n    <string name=\"artists\">শিল্পীরা</string>\n    <string name=\"albums\">অ্যালবাম গুলি</string>\n    <string name=\"songs\">গান গুলি</string>\n    <string name=\"events\">ইভেন্টগুলো</string>\n    <string name=\"tracks\">ট্র্যাক</string>\n    <string name=\"videos_string\">ভিডিও গুলি</string>\n    <string name=\"playlists\">চালু তালিকা</string>\n    <string name=\"channels\">চ্যানেলগুলো</string>\n    <string name=\"all\">সবগুলি</string>\n    <string name=\"error_report_title\">ত্রুটি প্রতিবেদন</string>\n    <string name=\"downloads_title\">ডাউনলোডগুলি</string>\n    <string name=\"downloads\">ডাউনলোডগুলি</string>\n    <string name=\"duration_live\">লাইভ</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">ইউটিউব ‘সীমিত মোড’ চালু করো</string>\n    <string name=\"show_age_restricted_content_title\">বয়স সীমাবদ্ধ কন্টেন্ট দেখাও</string>\n    <string name=\"content\">কন্টেন্ট</string>\n    <string name=\"popup_playing_toast\">পপআপ মোডে চলছে</string>\n    <string name=\"background_player_playing_toast\">ব্যাকগ্রাউন্ডে চলছে</string>\n    <string name=\"settings_category_updates_title\">আপডেট</string>\n    <string name=\"settings_category_debug_title\">ডিবাগ</string>\n    <string name=\"settings_category_appearance_title\">অ্যাপিয়ারেন্স</string>\n    <string name=\"settings_category_history_title\">ইতিহাস</string>\n    <string name=\"settings_category_video_audio_title\">ভিডিও এবং অডিও</string>\n    <string name=\"settings_category_player_behavior_title\">ব্যাবহার</string>\n    <string name=\"settings_category_player_title\">প্লেয়ার</string>\n    <string name=\"peertube_instance_add_https_only\">শুধুমাত্র HTTPS URL গুলি সাপোর্ট করে</string>\n    <string name=\"peertube_instance_add_help\">ইন্সটান্স এর ইউ আর এল</string>\n    <string name=\"peertube_instance_add_title\">ইন্সটান্স যোগ করুন</string>\n    <string name=\"peertube_instance_url_summary\">আপনার পছন্দের পিয়ার টিউব ইন্সটান্স</string>\n    <string name=\"peertube_instance_url_title\">পিয়ার টিউব এর ইন্সটান্স সমূহ</string>\n    <string name=\"content_language_title\">কন্টেন্ট এর জন্য পছন্দসই ভাষা</string>\n    <string name=\"unsupported_url\">URL সমর্থিত নয়</string>\n    <string name=\"show_next_and_similar_title\">পরবর্তী এবং অনুরূপ ভিডিওগুলি দেখাও</string>\n    <string name=\"autoplay_title\">স্বয়ংক্রিয়</string>\n    <string name=\"download_dialog_title\">ডাউনলোড</string>\n    <string name=\"resume_on_audio_focus_gain_title\">পুনরায় চালু করো</string>\n    <string name=\"enable_watch_history_summary\">দেখা ভিডিওগুলোর হিসেব</string>\n    <string name=\"settings_category_clear_data_title\">ডাটা মুছে ফেলুন</string>\n    <string name=\"enable_playback_state_lists_title\">তালিকাতে পজিশন</string>\n    <string name=\"enable_playback_resume_summary\">শেষ প্লেব্যাক পজিশন এ যাও</string>\n    <string name=\"enable_playback_resume_title\">পুনরায় প্লে ব্যাক চালু করো</string>\n    <string name=\"enable_watch_history_title\">ইতিহাস</string>\n    <string name=\"enable_search_history_summary\">সার্চগুলো স্থানীয়ভাবে জমা করো</string>\n    <string name=\"enable_search_history_title\">খোজ ইতিহাস</string>\n    <string name=\"show_search_suggestions_summary\">সার্চ করার সময় দেখানোর জন্য সাজেশন বেছে নিন</string>\n    <string name=\"show_search_suggestions_title\">সার্চ পরামর্শ</string>\n    <string name=\"auto_queue_title\">পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে</string>\n    <string name=\"metadata_cache_wipe_summary\">সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো</string>\n    <string name=\"metadata_cache_wipe_title\">ক্যাশ করা মেটাডেটা মুছো</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">ছবির ক্যাশ মুছে ফেলা হয়েছে</string>\n    <string name=\"show_comments_summary\">মতামত প্রদর্শন বন্ধ করতে অপশনটি বন্ধ করুন</string>\n    <string name=\"show_comments_title\">মতামত প্রদর্শন করুন</string>\n    <string name=\"seek_duration_title\">দ্রুত-ফরওয়ার্ড/-পুনরায় সন্ধান সময়কাল</string>\n    <string name=\"use_inexact_seek_summary\">অনির্দিষ্ট সন্ধান, চালককে আরো দ্রুত গতিতে সন্ধান করার সুবিধা দেয়, কিন্তু এটি সম্পূর্ণ নির্ভুল নাও হতে পারে ৷ ৫, ১৫ ও ২৫ সেকেন্ডের জন্য এটা কাজ করবে না।</string>\n    <string name=\"use_inexact_seek_title\">দ্রুত টানা ব্যাবহার করুন</string>\n    <string name=\"popup_remember_size_pos_summary\">শেষ আকার এবং পপআপ সেট অবস্থান মনে রাখো</string>\n    <string name=\"popup_remember_size_pos_title\">পপআপ আকার এবং অবস্থান মনে রাখো</string>\n    <string name=\"black_theme_title\">কালো</string>\n    <string name=\"dark_theme_title\">অন্ধকার</string>\n    <string name=\"light_theme_title\">উজ্জ্বল</string>\n    <string name=\"theme_title\">থিম</string>\n    <string name=\"default_video_format_title\">পছন্দসই ভিডিও ফরম্যাট</string>\n    <string name=\"default_audio_format_title\">ডিফল্ট অডিও ফরম্যাট</string>\n    <string name=\"play_audio\">অডিও</string>\n    <string name=\"notification_action_nothing\">কিছুই না</string>\n    <string name=\"notification_action_repeat\">পুনরায়</string>\n    <string name=\"notification_action_0_title\">প্রথম ক্রিয়া বোতাম</string>\n    <string name=\"notification_scale_to_square_image_title\">থাম্বনেলে ১:১ অনুপাতে করো</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প প্রদর্শন কর</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi-তে প্লে করুন\\\" দেখান</string>\n    <string name=\"kore_not_found\">Kodi ইনস্টল করবেন?</string>\n    <string name=\"play_with_kodi_title\">Kodi-তে প্লে করুন</string>\n    <string name=\"show_higher_resolutions_summary\">শুধুমাত্র কিছু ডিভাইস 2K/4K ভিডিও চালাতে পারে</string>\n    <string name=\"show_higher_resolutions_title\">উচ্চতর রেজুলেশন দেখান</string>\n    <string name=\"default_popup_resolution_title\">স্বাভাবিক পপ-আপ রেজুলেশন</string>\n    <string name=\"default_resolution_title\">স্বাভাবিক রেজুলেশন</string>\n    <string name=\"download_path_audio_dialog_title\">অডিও ডাউনলোডের জন্য ফোল্ডার নির্বাচন করুন</string>\n    <string name=\"download_path_audio_summary\">ডাউনলোড করা অডিও এখানে থাকবে</string>\n    <string name=\"download_path_audio_title\">অডিও ডাউনলোড ফোল্ডার</string>\n    <string name=\"download_path_dialog_title\">ভিডিও ডাউনলোডের জন্য ফোল্ডার নির্বাচন করুন</string>\n    <string name=\"download_path_summary\">ডাউনলোড করা ভিডিওগুলো এখানে থাকে</string>\n    <string name=\"download_path_title\">ভিডিও ডাউনলোড করার ফোল্ডার</string>\n    <string name=\"controls_add_to_playlist_title\">যুক্ত করুন</string>\n    <string name=\"controls_popup_title\">পপ-আপ</string>\n    <string name=\"controls_background_title\">ব্যাকগ্রাউন্ড</string>\n    <string name=\"tab_choose\">ট্যাব পছন্দ করুন</string>\n    <string name=\"tab_bookmarks\">বুকমার্ক করা প্লেলিস্টসমূহ</string>\n    <string name=\"tab_subscriptions\">সাবস্ক্রিবশন</string>\n    <string name=\"show_info\">তথ্য দেখুন</string>\n    <string name=\"subscription_update_failed\">সাবস্ক্রিবশন হালনাগাদ করা সম্ভব হয়নি</string>\n    <string name=\"subscription_change_failed\">সাবস্ক্রিবশন পরিবর্তন করা সম্ভব হয়নি</string>\n    <string name=\"channel_unsubscribed\">চ্যানেল আনসাবস্ক্রাইব করা হয়েছে</string>\n    <string name=\"unsubscribe\">আনসাবস্ক্রাইব</string>\n    <string name=\"subscribed_button_title\">পূর্ব-সাবস্ক্রাইবকৃত</string>\n    <string name=\"subscribe_button_title\">সাবস্ক্রাইব</string>\n    <string name=\"use_external_audio_player_title\">অন্যান্য অডিও প্লেয়ার ব্যবহার করুন</string>\n    <string name=\"use_external_video_player_summary\">কিছু কিছু রেজুলেশনে অডিও ঠিকঠাক থাকবে না</string>\n    <string name=\"use_external_video_player_title\">অন্যান্য ভিডিও প্লেয়ার ব্যবহার করুন</string>\n    <string name=\"share_dialog_title\">শেয়ার করুন</string>\n    <string name=\"search_showing_result_for\">ফলাফল দেখানো হচ্ছেঃ %s</string>\n    <string name=\"did_you_mean\">আপনি কি ‘%1$s’ বোঝাচ্ছেন?</string>\n    <string name=\"settings\">সেটিংস</string>\n    <string name=\"search\">খুঁজুন</string>\n    <string name=\"controls_download_desc\">ডাউনলোড করুন</string>\n    <string name=\"download\">ডাউনলোড</string>\n    <string name=\"share\">শেয়ার</string>\n    <string name=\"open_in_popup_mode\">পপআপ মুডে চালু করুন</string>\n    <string name=\"open_in_browser\">ব্রাউজারে চালু করুন</string>\n    <string name=\"cancel\">বাতিল</string>\n    <string name=\"install\">ইনস্টল</string>\n    <string name=\"no_player_found_toast\">কোনো মিডিয়া প্লেয়ার পাওয়া যায়নি (মিডিয়া প্লে করতে VLC ইন্সটল করতে পারেন)।</string>\n    <string name=\"no_player_found\">কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। VLC ইনস্টল করতে চান কি?</string>\n    <string name=\"upload_date_text\">প্রকাশকাল %1$s</string>\n    <string name=\"main_bg_subtitle\">আতশ কাঁচে চাপ দিয়ে শুরু করো।</string>\n    <string name=\"notification_action_buffering\">বাফারিং</string>\n    <string name=\"notification_action_shuffle\">সাফল</string>\n    <string name=\"notification_action_4_title\">পঞ্চম অ্যাকশন বাটন</string>\n    <string name=\"notification_action_3_title\">চতুর্থ অ্যাকশন বাটন</string>\n    <string name=\"notification_action_2_title\">তৃতীয় অ্যাকশন বাটন</string>\n    <string name=\"notification_action_1_title\">দ্বিতীয় অ্যাকশান বাটন</string>\n    <string name=\"auto_queue_summary\">একটি সংশ্লিষ্ট স্ট্রিম যোগ করে প্লেব্যাক সারি শেষ করা অব্যাহত রাখো (পুনরাবৃত্তি ছাড়া)</string>\n    <string name=\"clear_queue_confirmation_description\">সক্রিয় চালক সারি প্রতিস্থাপিত হবে</string>\n    <string name=\"clear_queue_confirmation_summary\">এক প্লেয়ার থেকে অন্য প্লেয়ারে পরিবর্তন করলে তোমার সারি প্রতিস্থাপিত হতে পারে</string>\n    <string name=\"clear_queue_confirmation_title\">কিউ মোছার আগে নিশ্চিত করো</string>\n    <string name=\"notification_actions_at_most_three\">কমপ্যাক্ট বিজ্ঞপ্তিতে প্রদর্শন করতে তুমি সর্বাধিক তিনটি ক্রিয়া নির্বাচন করতে পারো!</string>\n    <string name=\"notification_actions_summary\">নিচের প্রতিটি প্রজ্ঞাপন ক্রিয়া সম্পাদনা করুন । ডান দিকের চেকবাক্স ব্যবহার করে কম্প্যাক্ট নোটিফিকেশনে দেখানোর জন্য তিনটি পর্যন্ত নির্বাচন করুন ।</string>\n    <string name=\"notification_scale_to_square_image_summary\">প্রদর্শিত ভিডিও থাম্বনেইল ১৬:৯ থেকে ১:১অনুপাতে পরিবর্তন করো</string>\n    <string name=\"settings_category_feed_title\">ফিড</string>\n    <string name=\"overwrite\">ওভাররাইট</string>\n    <string name=\"enqueue\">সারিবদ্ধ</string>\n    <string name=\"recovering\">পুনরুদ্ধাররত</string>\n    <string name=\"post_processing\">পরে-প্রক্রিয়াকরণ</string>\n    <string name=\"queued\">সারিবদ্ধ</string>\n    <string name=\"missions_header_pending\">প্রক্রিয়ারত</string>\n    <string name=\"never\">কখনো না</string>\n    <string name=\"updates_setting_title\">হালনাগাদ</string>\n    <string name=\"playback_reset\">পুনশুরু</string>\n    <string name=\"playback_step\">স্টেপ</string>\n    <string name=\"playback_pitch\">পিচ</string>\n    <string name=\"playback_tempo\">টেম্পো</string>\n    <string name=\"export_ongoing\">রপ্তানি করা হচ্ছে…</string>\n    <string name=\"import_ongoing\">আমদানি করা হচ্ছে…</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s সদস্যতা</item>\n        <item quantity=\"other\">%s সদস্যতাগণ</item>\n    </plurals>\n    <string name=\"users\">ব্যবহারকারীরা</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">বাধার পর প্লে চালিয়ে যাও (উদাহরণস্বরূপ ফোনকল)</string>\n    <string name=\"subscriptions_export_unsuccessful\">সদস্যতা রপ্তানি করা যায়নি</string>\n    <string name=\"subscriptions_import_unsuccessful\">সদস্যতা আমদানি করা যায়নি</string>\n    <string name=\"playlist_no_uploader\">স্বয়ংক্রিয়ভাবে উৎপাদিত (কোনও আপলোডার পাওয়া যায়নি)</string>\n    <string name=\"set_as_playlist_thumbnail\">প্লে-তালিকা থাম্বনেইল হিসেবে সেট করো</string>\n    <string name=\"no_valid_zip_file\">কোনও বৈধ জিপ ফাইল নেই</string>\n    <string name=\"no_playlist_bookmarked_yet\">এখনো কোন প্লে-তালিকা বুকমার্ক নেই</string>\n    <string name=\"no_channel_subscribed_yet\">এখনও কোনও চ্যানেল সদস্যতা নেই</string>\n    <string name=\"main_page_content\">মূল পৃষ্ঠার বিষয়বস্তু</string>\n    <string name=\"settings_file_charset_title\">ফাইলের নামে অনুমোদিত অক্ষরসমূহ</string>\n    <string name=\"subtitle_activity_recaptcha\">সমাধান হয়ে গেলে \\\"সম্পন্ন\\\" টিপো</string>\n    <string name=\"no_one_listening\">কেউ শুনছে না</string>\n    <string name=\"no_one_watching\">কেউ দেখছে না</string>\n    <string name=\"drawer_header_description\">সেবাটি পরিবর্তন করো, বর্তমানে নির্বাচিত:</string>\n    <string name=\"empty_list_subtitle\">ঝিঝিপোকা ছাড়া কিছুই নেই এখানে</string>\n    <string name=\"invalid_source\">এই ধরনের কোন ফাইল/বিষয়বস্তুর উৎস নেই</string>\n    <string name=\"player_unrecoverable_failure\">অপুনরুদ্ধারযোগ্য প্লেয়ার ত্রুটি ঘটেছে</string>\n    <string name=\"peertube_instance_add_fail\">ইন্সট্যান্সটি যাচাই করা যায়নি</string>\n    <string name=\"recaptcha_cookies_cleared\">রিক্যাপচা কুকিগুলো পরিষ্কার করা হয়েছে</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">হ্যাঁ, এবং আংশিকভাবে দেখা ভিডিও</string>\n    <string name=\"permission_denied\">ব্যবস্থা দ্বারা ক্রিয়া অস্বীকার করা হয়েছে</string>\n    <string name=\"autoplay_summary\">স্বয়ংক্রিয়ভাবে প্লেব্যাক শুরু করো %s — তে</string>\n    <string name=\"start_here_on_popup\">একটি পপ-আপে প্লে শুরু করো</string>\n    <string name=\"start_here_on_background\">পটভূমিতে প্লে শুরু করো</string>\n    <string name=\"app_description\">অ্যান্ড্রয়েডে মুক্তভাবে ও সহজে প্রচার দেখার অ্যাপ।</string>\n    <string name=\"export_data_summary\">ইতিহাস, সদস্যতা, চালুতালিকা এবং পছন্দসমূহ রপ্তানি করুন</string>\n    <string name=\"show_hold_to_append_title\">\\\"সংযোজন করতে ধরে রাখো\\\" পরামর্শ দেখাও</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">উপলব্ধ হলে আলাদা ফিড থেকে এনো</string>\n    <string name=\"error_http_no_content\">সার্ভার ডেটা পাঠায় না</string>\n    <string name=\"error_connect_host\">সার্ভারে সংযোগ করা যাচ্ছে না</string>\n    <string name=\"import_title\">আমদানি</string>\n    <string name=\"conferences\">সম্মেলন</string>\n    <string name=\"enable_playback_state_lists_summary\">তালিকায় প্লেব্যাক অবস্থান সূচক দেখাও</string>\n    <string name=\"auto_queue_toggle\">স্বত-সারি</string>\n    <string name=\"error_timeout\">সংযোগের সময় শেষ</string>\n    <string name=\"error_postprocessing_failed\">পোস্ট-প্রক্রিয়াকরণ ব্যর্থ হয়েছে</string>\n    <string name=\"import_soundcloud_instructions_hint\">তোমার আইডি, soundcloud.com/আইডি</string>\n    <string name=\"previous_export\">আগের রপ্তানি</string>\n    <string name=\"import_file_title\">ফাইল আমদানি করো</string>\n    <string name=\"export_to\">রপ্তানি করো</string>\n    <string name=\"import_from\">আমদানি করো</string>\n    <string name=\"bookmark_playlist\">প্লেলিস্ট বুকমার্ক করো</string>\n    <string name=\"preferred_player_fetcher_notification_title\">তথ্য আনা হচ্ছে…</string>\n    <string name=\"popup_player\">পপআপ প্লেয়ার</string>\n    <string name=\"background_player\">পটভূমি প্লেয়ার</string>\n    <string name=\"title_activity_play_queue\">প্লে সারি</string>\n    <string name=\"most_liked\">সর্বোচ্চ পছন্দ</string>\n    <string name=\"default_kiosk_page_summary\">ডিফল্ট কিয়স্ক</string>\n    <string name=\"kiosk_page_summary\">কিয়স্ক পৃষ্ঠা</string>\n    <string name=\"settings_file_replacement_character_title\">প্রতিস্থাপক অক্ষর</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%sটি ভিডিও</item>\n        <item quantity=\"other\">%sটি ভিডিও</item>\n    </plurals>\n    <string name=\"infinite_videos\">∞ ভিডিও</string>\n    <string name=\"more_than_100_videos\">১০০+ ভিডিও</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s জন শ্রোতা</item>\n        <item quantity=\"other\">%s জন শ্রোতা</item>\n    </plurals>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s জন দেখছে</item>\n        <item quantity=\"other\">%s জন দেখছে</item>\n    </plurals>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s বার দেখা</item>\n        <item quantity=\"other\">%s বার দেখা</item>\n    </plurals>\n    <string name=\"enqueued\">সারিবদ্ধ করা হয়েছে</string>\n    <string name=\"enqueue_stream\">এনকুই</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d সেকেন্ড</item>\n        <item quantity=\"other\">%d সেকেন্ড</item>\n    </plurals>\n    <string name=\"remove_watched\">দেখা থেকে অপসারণ করো</string>\n    <string name=\"systems_language\">সিস্টেম ডিফল্ট</string>\n    <string name=\"downloads_storage_use_saf_title\">সাফ ব্যবহার করো</string>\n    <string name=\"notification_colorize_title\">বিজ্ঞপ্তি রঙিন করো</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d দিন</item>\n        <item quantity=\"other\">%d দিন</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d ঘন্টা</item>\n        <item quantity=\"other\">%d ঘন্টা</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d মিনিট</item>\n        <item quantity=\"other\">%d মিনিট</item>\n    </plurals>\n    <string name=\"max_retry_msg\">সর্বোচ্চ চেষ্টা</string>\n    <string name=\"recent\">সাম্প্রতিক</string>\n    <string name=\"peertube_instance_add_exists\">ইন্সট্যান্স ইতোমধ্যে বিদ্যমান</string>\n    <string name=\"default_content_country_title\">ডিফল্ট কন্টেন্টের দেশ</string>\n    <string name=\"related_items_tab_description\">সম্পর্কিত ভুক্তি</string>\n    <string name=\"show_description_title\">বর্ণনা দেখাও</string>\n    <string name=\"msg_calculating_hash\">হ্যাশ গণনা করা হচ্ছে</string>\n    <string name=\"show_thumbnail_title\">থাম্বনেইল দেখাও</string>\n    <string name=\"playlist_page_summary\">প্লেলিস্ট পৃষ্ঠা</string>\n    <string name=\"video_detail_by\">%s দ্বারা</string>\n    <string name=\"feed_update_threshold_option_always_update\">সবসময় হালনগাদ করো</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d নির্বাচিত</item>\n        <item quantity=\"other\">%d সমূহ নির্বাচিত</item>\n    </plurals>\n    <string name=\"feed_group_dialog_select_subscriptions\">সদস্যতা নির্বাচন করো</string>\n    <string name=\"feed_processing_message\">ফিড প্রক্রিয়া করা হচ্ছে…</string>\n    <string name=\"feed_groups_header_title\">চ্যানেল গ্রুপ</string>\n    <string name=\"chapters\">অধ্যায়</string>\n    <string name=\"comments_tab_description\">মতামত</string>\n    <string name=\"description_tab_description\">বর্ণনা</string>\n    <string name=\"open_with\">অন্য অ্যাপে ওপেন করুন</string>\n    <string name=\"feed_update_threshold_title\">ফিড হালনাগাদ সীমা</string>\n    <string name=\"feed_group_dialog_empty_name\">খালি গ্রুপ নাম</string>\n    <string name=\"feed_group_dialog_empty_selection\">কোনো সদস্যতা নির্বাচিত হয়নি</string>\n    <string name=\"feed_subscription_not_loaded_count\">%d: লোড হয়নি</string>\n    <string name=\"remove_watched_popup_title\">দেখা ভিডিওগুলো সরাও?</string>\n    <string name=\"choose_instance_prompt\">একটি ইন্সট্যান্স নাও</string>\n    <string name=\"enable_queue_limit\">ডাউনলোড সারি সীমিত করো</string>\n    <string name=\"generate_unique_name\">অনন্য নাম বানাও</string>\n    <string name=\"list_view_mode\">তালিকা দর্শন মোড</string>\n    <string name=\"wifi_only\">শুধুমাত্র ওয়াই-ফাই-তে</string>\n    <string name=\"skip_silence_checkbox\">নীরবতার সময় দ্রুত আগাও</string>\n    <string name=\"playback_speed_control\">প্লেব্যাক গতি নিয়ন্ত্রণ</string>\n    <string name=\"preferred_open_action_settings_title\">পছন্দসই \\'খোলার\\' ক্রিয়া</string>\n    <string name=\"enable_disposed_exceptions_title\">আউট-অফ-লাইফসাইকেল ত্রুটি প্রতিবেদন করো</string>\n    <string name=\"playlist_thumbnail_change_success\">প্লে-তালিকার থাম্বনেইল পরিবর্তিত হয়েছে।</string>\n    <string name=\"preferred_player_fetcher_notification_message\">অনুরোধকৃত তথ্য লোড হচ্ছে</string>\n    <string name=\"hold_to_append\">সারিতে ঢুকাতে ধরে রাখো</string>\n    <string name=\"select_a_kiosk\">কিয়স্ক নির্বাচন করো</string>\n    <string name=\"charset_most_special_characters\">সর্বাধিক বিশেষ অক্ষর</string>\n    <string name=\"subscribers_count_not_available\">সাবস্ক্রাইবার গণনা পাওয়া যায়নি</string>\n    <string name=\"detail_drag_description\">সাজাতে টানো</string>\n    <string name=\"copy_for_github\">প্রতিবেদন অনুলিপি করো</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">শুধুমাত্র অদলবদ্ধ সদস্যতা দেখাও</string>\n    <string name=\"feed_oldest_subscription_update\">ফিড শেষ হালনাগাদ করা হয়েছে: %s</string>\n    <string name=\"downloads_storage_ask_title\">কোথায় ডাইনলোড করবো জিজ্ঞেস করো</string>\n    <string name=\"pause_downloads_on_mobile\">পরিমাপকৃত নেটওয়ার্কে বাধা দাও</string>\n    <string name=\"error_download_resource_gone\">এই ডাউনলোড উদ্ধার করা যাচ্ছে না</string>\n    <string name=\"overwrite_failed\">এই ফাইলের উপর লেখা যাচ্ছে না</string>\n    <string name=\"app_update_available_notification_title\">নিউপাইপ হালনাগাদ আছে!</string>\n    <string name=\"minimize_on_exit_popup_description\">ভাসমান চালকের ক্ষুদ্রকরণ করো</string>\n    <string name=\"minimize_on_exit_background_description\">প্লেয়ার পটভূমিতে ক্ষুদ্রকরণ করো</string>\n    <string name=\"minimize_on_exit_title\">অ্যাপ পরিবর্তনে ক্ষুদ্রকরণ করো</string>\n    <string name=\"unhook_checkbox\">আনহুক (বিকৃতি হতে পারে)</string>\n    <string name=\"crash_the_app\">অ্যাপ বন্ধ করে দাও</string>\n    <string name=\"show_meta_info_title\">মেটা তথ্য দেখাও</string>\n    <string name=\"hash_channel_name\">ভিডিও হ্যাশের বিজ্ঞপ্তি</string>\n    <string name=\"show_memory_leaks\">মেমরি ক্ষয় দেখাও</string>\n    <string name=\"clear_cookie_title\">রিক্যাপচা কুকি পরিষ্কার করো</string>\n    <string name=\"channel_created_by\">%s দ্বারা তৈরি</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">চ্যানেলের অবতারের প্রতিচ্ছবি</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">দ্রুত মোড বন্ধ করো</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">দ্রুত মোড চালু করো</string>\n    <string name=\"error_file_creation\">ফাইল বানানো যায়নি</string>\n    <string name=\"limit_mobile_data_usage_title\">মোবাইল ডাটা ব্যবহারের সময় আকার সীমিত রাখো</string>\n    <string name=\"show_original_time_ago_title\">ভুক্তিতে আসল সময় দেখাও</string>\n    <string name=\"radio\">রেডিও</string>\n    <string name=\"featured\">বিশেষ</string>\n    <string name=\"recaptcha_solve\">সমাধান করো</string>\n    <string name=\"feed_update_threshold_summary\">শেষ হালনাগাদের পর একটি সাবস্ক্রিপশনের আগের সময় সেকেলে বিবেচিত — %s</string>\n    <string name=\"feed_group_dialog_delete_message\">তুমি কি এ গ্রুপটি মুছতে চাও\\?</string>\n    <string name=\"website_encouragement\">আরও তথ্য এবং খবরের জন্য নিউপাইপ ওয়েবসাইট দেখো।</string>\n    <string name=\"override_current_data\">এতে তোমার বর্তমান অবস্থা সরানো হবে।</string>\n    <string name=\"could_not_import_all_files\">সতর্কতা: সব তথ্য আনা যায়নি।</string>\n    <string name=\"copyright\">© %3$s এর মাধ্যমে %2$s দিয়ে %1$s</string>\n    <string name=\"hash_channel_description\">ভিডিও হ্যাশিংয়ের অগ্রগতির বিজ্ঞপ্তি</string>\n    <string name=\"download_has_started\">ডাউনলোড শুরু হয়েছে</string>\n    <string name=\"auto_device_theme_title\">স্বয়ংক্রিয় (ডিভাইস রঙ)</string>\n    <string name=\"show_description_summary\">ভিডিও বর্ণনা ও অন্যান্য তথ্য লুকাও</string>\n    <string name=\"night_theme_title\">অন্ধকার রঙ</string>\n    <string name=\"notification_channel_description\">নিউপাইপের জন্য পটভূমিতে ও পপ-আপ প্লেয়ারের বিজ্ঞপ্তি</string>\n    <string name=\"error_ssl_exception\">নিরাপদ সংযোগ স্থাপন করা যায় নি</string>\n    <string name=\"show_channel_details\">চ্যানেলের তথ্য দেখাও</string>\n    <string name=\"overwrite_finished_warning\">এই নামের ডাউনলোডকৃত ফাইল আগে থেকে আছে</string>\n    <string name=\"main_page_content_summary\">মূল পাতায় যেসব ট্যাব দেখানো হয়</string>\n    <string name=\"external_player_unsupported_link_type\">বহিঃচালক এইরকম সংযোগ সমর্থন করে না</string>\n    <string name=\"night_theme_summary\">তোমার পছন্দের অন্ধকার রঙ এখানে নাও – %s</string>\n    <string name=\"error_progress_lost\">অগ্রগতি হারিয়ে গেছে, কারণ এই ফাইল মুছে গেছে</string>\n    <string name=\"error_path_creation\">এই উদ্দিষ্ট ফোল্ডার বানানো যায় নি</string>\n    <string name=\"overwrite_unrelated_warning\">এই নামের একটি ফাইল আগে থেকে আছে</string>\n    <string name=\"preferred_open_action_settings_summary\">এইরকম তথ্য খোলার সহজাত ক্রিয়া – %s</string>\n    <string name=\"import_settings\">পছন্দসমূহ কি আমদানি করতে চাও\\?</string>\n    <string name=\"settings_file_replacement_character_summary\">অবৈধ অক্ষরগুলো এই মান দ্বারা প্রতিস্থাপিত</string>\n    <string name=\"permission_display_over_apps\">অন্য অ্যাপের উপরে দেখাতে অনুমতি দাও</string>\n    <string name=\"peertube_instance_url_help\">%s-এ তোমার পছন্দের ইন্সট্যান্স খুজো</string>\n    <string name=\"clear_views_history_summary\">প্লে করা স্ট্রিমের ইতিহাস এবং প্লেব্যাক অবস্থানগুলি মুছে দেয়</string>\n    <string name=\"restricted_video\">এই ভিডিওটি বয়সসীমাবদ্ধ ।\n\\n\n\\nতুমি এটি দেখতে চাইলে পছন্দসমূহে \\\"%1$s\\\" চালু করো।</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">Youtube একটি \\\"সীমাবদ্ধ মোড\\\" সরবরাহ করে যা সম্ভাব্য বয়সসীমাবদ্ধ বিষয়গুলি গুপ্ত রাখে</string>\n    <string name=\"show_age_restricted_content_summary\">শিশুদের জন্যে সম্ভবত অনুপযুক্ত বিষয়গুলোও দেখান যেগুলির একটি বয়সসীমা রয়েছে (যেমন ১৮+ বিষয়সমূহ)</string>\n    <string name=\"unsupported_url_dialog_message\">ইউআরএলটি চিহ্নিত করা যায়নি। অন্য অ্যাপ্লিকেশনে খুলতে চাও\\?</string>\n    <string name=\"error_postprocessing_stopped\">এই ফাইলে কাজ করার সময় নিউপাইপ বন্ধ করা হয়েছে</string>\n    <string name=\"download_already_pending\">এই নামের একটি ডাউনলোড প্রক্রিয়ারত</string>\n    <string name=\"saved_tabs_invalid_json\">সংরক্ষিত ট্যাব পড়া যায় নি, তাই সহজাতটি ব্যবহার করা হচ্ছে</string>\n    <string name=\"import_data_summary\">তোমার ইতিহাস, সদস্যতা, চালুতালিকা আর (ঐচ্ছিকভাবে) পছন্দসমূহ উপেক্ষা করো</string>\n    <string name=\"select_night_theme_toast\">তোমার পছন্দের অন্ধকার রঙ নির্বাচন করো</string>\n    <string name=\"georestricted_content\">তোমার দেশে এটি অনুপলুব্ধ।</string>\n    <string name=\"no_app_to_open_intent\">তোমার ডিভাইসের কোনো অ্যাপ এটি খুলতে পারে না</string>\n    <string name=\"enable_queue_limit_desc\">একটি ডাউনলোড একই সময়ে চলতে পারবে</string>\n    <string name=\"max_retry_desc\">ডাউনলোড বাতিল করার আগে সর্বোচ্চ চেষ্টা</string>\n    <string name=\"private_content\">এই তথ্যটি ব্যক্তিগত, তাই নিউপাইপ এটির ধারাপ্রচার বা ডাউনলোড করতে পারবে না।</string>\n    <string name=\"download_to_sdcard_error_message\">এসডি কার্ডে নামানো যাচ্ছে না। ডাউনলোড স্থান ফিরাবে বা পাল্টাবে\\?</string>\n    <string name=\"show_thumbnail_summary\">বন্ধ পর্দার পটভূমি ও বিজ্ঞপ্তির পটভূমি উভয় জায়গায় এই প্রতিচ্ছবি ব্যবহার করো</string>\n    <string name=\"privacy_policy_encouragement\">নিউপাইপ প্রকল্প তোমার গোপনীয়তা গুরুত্বের সাথে নেয়। তাই এই অ্যাপ তোমার অনুমতি ছাড়া কোনো তথ্য পাঠায় না।\n\\nনিউপাইপের গোপনীয়তা নীতিমালা কোন তথ্য পাঠানো হয় ও সংরক্ষণ হয় তা ব্যাখ্যা করে।</string>\n    <string name=\"clear_cookie_summary\">রিক্যাপচা পূরণ করলে নিউপাইপ যেসব কুকি রাখে তা মুছো</string>\n    <string name=\"show_original_time_ago_summary\">ধারা ভুক্তিতে সেবাগুলোর মূল লেখা দৃশ্যমান হবে</string>\n    <string name=\"delete_item_search_history\">অনুসন্ধান ইতিহাস থেকে এই ভুক্তিটি মুছবে\\?</string>\n    <string name=\"downloads_storage_ask_summary\">প্রত্যেক ডাউনলোড কোথায় রাখা হবে তা জিজ্ঞেস করা হবে।\n\\nমেমোরি কার্ডে ডাউনলোড করতে সিস্টেম ফোল্ডার পিকার (SAF) এনেবল করুন</string>\n    <string name=\"download_already_running\">এই নামের একটি ডাউনলোড চলমান</string>\n    <string name=\"disable_media_tunneling_title\">মিডিয়া সুরঙ্গকরণ অক্ষম</string>\n    <string name=\"feed_load_error_fast_unknown\">দ্রুত ফিড অবস্থা এ বিষয়ে এর বেশি তথ্য দেয় না।</string>\n    <string name=\"no_dir_yet\">কোনো ডাউনলোড ফোল্ডার নির্দিষ্ট করা হয়নি, এখনই একটা সহজাত ডাউনলোড ফোল্ডার নির্বাচন করো</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'স্টোরেজ অনুমোদন অবকাঠামো\\' বাইরের এসডি কার্ডে ডাউনলোডের অনুমোদন দেয়</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">অ্যান্ড্রয়েড ১০ থেকে শুরু করে শুধু \\'স্টোরেজ অনুমোদন অবকাঠামো\\' সমর্থিত</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">প্রত্যেকটা ডাউনলোড কোথায় রাখা হবে তা তোমাকে জিজ্ঞেস করা হবে</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' এর জন্য ফিড প্রক্রিয়া করা যাচ্ছে না।</string>\n    <string name=\"description_select_disable\">বর্ণনার লেখা নির্বাচন করা নিষ্ক্রিয় করো</string>\n    <string name=\"description_select_enable\">বর্ণনার লেখা নির্বাচন করা সক্ষম করো</string>\n    <string name=\"feed_load_error\">প্রক্রিয়াকরণ ফিডে ত্রুটি</string>\n    <string name=\"open_website_license\">ওয়েবসাইট খুলুন</string>\n    <string name=\"account_terminated\">অ্যাকাউন্ট ধ্বংসকৃত</string>\n    <string name=\"metadata_age_limit\">বয়সসীমা</string>\n    <string name=\"metadata_privacy_internal\">অভ্যন্তরীণ</string>\n    <string name=\"metadata_privacy_private\">ব্যক্তিগত</string>\n    <string name=\"metadata_privacy_unlisted\">অতালিকাভুক্ত</string>\n    <string name=\"metadata_privacy_public\">সর্বজনীন</string>\n    <string name=\"metadata_host\">উপস্থাপক</string>\n    <string name=\"metadata_support\">সহায়তা</string>\n    <string name=\"metadata_language\">ভাষা</string>\n    <string name=\"metadata_privacy\">গোপনীয়তা</string>\n    <string name=\"metadata_licence\">অনুমতিপত্র</string>\n    <string name=\"metadata_tags\">চিরকুট (ট্যাগ)</string>\n    <string name=\"metadata_category\">বিষয়শ্রেণি</string>\n    <string name=\"import_network_expensive_warning\">মনে রাখবে এই ক্রিয়ার নেটওয়ার্ক খরচ বেশি হতে পারে।\n\\n\n\\nচালিয়ে যাবে\\?</string>\n    <string name=\"tablet_mode_title\">ট্যাবলেট অবস্থা</string>\n    <string name=\"off\">বন্ধ</string>\n    <string name=\"on\">চালু</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">ডাউনলোড শেষ</item>\n        <item quantity=\"other\">%sটি ডাউনলোড শেষ</item>\n    </plurals>\n    <string name=\"mark_as_watched\">দেখা হয়েছে বলে চিহ্নিত করুন</string>\n    <string name=\"settings_category_player_notification_title\">চালক বিজ্ঞপ্তি</string>\n    <string name=\"low_quality_smaller\">নিম্ন মান(ছোট)</string>\n    <string name=\"detail_heart_img_view_description\">মূল তৈরিকারকের পছন্দ করা</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"get_notified\">বিজ্ঞপ্তি পাঠাও</string>\n    <string name=\"toggle_all\">সব পরিবর্তন করো</string>\n    <string name=\"high_quality_larger\">উচ্চতর মান (বৃহত্তর)</string>\n    <string name=\"comments_are_disabled\">মন্তব্য নিষ্ক্রিয়</string>\n    <string name=\"local_search_suggestions\">স্থানীয় অনুসন্ধানের পরামর্শ</string>\n    <string name=\"remote_search_suggestions\">দূর অনুসন্ধানে পরামর্শ</string>\n    <string name=\"percent\">শতাংশ</string>\n    <string name=\"semitone\">সেমিটোন</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">বাইরের চালক সহজাত</string>\n    <string name=\"enqueue_next_stream\">পরেরটা ক্রমে রাখো</string>\n    <string name=\"crash_the_player\">চালক থামাও</string>\n    <string name=\"streams_notification_channel_name\">নতুন ধারা</string>\n    <string name=\"streams_notifications_interval_title\">কম্পাঙ্ক দেখো</string>\n    <string name=\"seekbar_preview_thumbnail_title\">পূর্বদর্শন রেখার মাধ্যমে প্রাকদর্শন</string>\n    <string name=\"dont_show\">দেখিও না</string>\n    <string name=\"any_network\">যেকোনো নেটওয়ার্ক</string>\n    <string name=\"enqueued_next\">পরেরটা ক্রমে রাখা হয়েছে</string>\n    <string name=\"detail_pinned_comment_view_description\">পিনকৃত মন্তব্য</string>\n    <string name=\"notifications\">বিজ্ঞপ্তি</string>\n    <string name=\"checking_updates_toast\">হালনাগাদ দেখা হচ্ছে …</string>\n    <string name=\"check_for_updates\">হালনাগাদ আছে কিনা দেখো</string>\n    <string name=\"start_main_player_fullscreen_title\">মূল প্লেয়ার ফুল স্ক্রীন এ শুরু করুন</string>\n    <string name=\"feed_new_items\">ধারার নতুন ভুক্তি</string>\n    <string name=\"error_report_channel_name\">ত্রুটি প্রতিবেদন এর বিজ্ঞপ্তি</string>\n    <string name=\"show_hold_to_append_summary\">পটভূমি বা ভিডিওর ‘বিস্তারিত:’ এর ভাসমান বোতাম টিপলে একটা তথ্য দেখাও</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s টি নতুন ধারা</item>\n        <item quantity=\"other\">%s টি নতুন ধারা</item>\n    </plurals>\n    <string name=\"notification_colorize_summary\">প্রতিচ্ছবিত প্রধান রঙ অনুসারে অ্যান্ড্রয়েডকে বিজ্ঞপ্তির রঙ কাস্টমাইজ করতে দাও (দ্রষ্টব্য যে এটা সমস্ত ডিভাইসে উপলব্ধ নয়)</string>\n    <string name=\"unknown_format\">অজ্ঞাত ফরম্যাট</string>\n    <string name=\"select_quality_external_players\">বাহ্যিক প্লেয়ারের জন্য মান নির্বাচন করুন</string>\n    <string name=\"no_audio_streams_available_for_external_players\">বাহ্যিক প্লেয়ারের জন্য কোনো অডিও স্ট্রিম নেই</string>\n    <string name=\"no_video_streams_available_for_external_players\">বাহ্যিক প্লেয়ারের জন্য কোনো ভিডিও স্ট্রিম নেই</string>\n    <string name=\"unknown_quality\">অজ্ঞাত মান</string>\n    <string name=\"enable_streams_notifications_title\">নতুন ধারার বিজ্ঞপ্তি</string>\n    <string name=\"streams_notifications_network_title\">নেটওয়ার্ক সংযোগ দরকার</string>\n    <string name=\"streams_notification_channel_description\">সদস্যতার জন্য নতুন স্ট্রীম সম্পর্কে বিজ্ঞপ্তি</string>\n    <string name=\"error_report_channel_description\">ত্রুটি রিপোর্ট করার জন্য বিজ্ঞপ্তি</string>\n    <string name=\"error_report_notification_title\">NewPipe একটি ত্রুটির সম্মুখীন হয়েছে, রিপোর্ট করতে আলতো চাপুন</string>\n    <string name=\"error_report_notification_toast\">একটি ত্রুটি ঘটেছে, বিজ্ঞপ্তি দেখুন</string>\n    <string name=\"error_report_open_github_notice\">আপনার ক্র্যাশ নিয়ে আলোচনা করা একটি সমস্যা ইতিমধ্যেই বিদ্যমান কিনা অনুগ্রহ করে পরীক্ষা করুন৷ ডুপ্লিকেট টিকিট তৈরি করে আপনি আমাদের কাছ থেকে সময় নেন তা আমরা প্রকৃত বাগ ঠিক করার জন্য ব্যয় করতে পারি।</string>\n    <string name=\"invalid_file\">ফাইলটি বিদ্যমান নেই বা এটি পড়ার বা লেখার অনুমতির অভাব রয়েছে</string>\n    <string name=\"processing_may_take_a_moment\">প্রক্রিয়ারত…এক মুহূর্ত লাগতে পারে</string>\n    <string name=\"leak_canary_not_available\">লিকক্যানারি নেই</string>\n    <string name=\"show_error_snackbar\">ত্রুটি স্ন্যাকবার দেখাও</string>\n    <string name=\"manual_update_description\">নতুন সংস্করণের জন্য নিজে দেখো</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$sটি ডাউনলোড মোছা হয়েছে</item>\n        <item quantity=\"other\">%1$sটি ডাউনলোড মোছা হয়েছে</item>\n    </plurals>\n    <string name=\"show_crash_the_player_title\">\\\"চালক বন্ধ করো\\\" দেখাও</string>\n    <string name=\"notifications_disabled\">বিজ্ঞপ্তি নিষ্ক্রিয়</string>\n    <string name=\"create_error_notification\">ত্রুটি বিজ্ঞপ্তি বানাও</string>\n    <string name=\"main_page_content_swipe_remove\">ভুক্তি মুছতে ডানে-বামে সরাও</string>\n    <string name=\"loading_stream_details\">সম্প্রচার বিষয়ক তথ্য প্রক্রিয়ারত…</string>\n    <string name=\"progressive_load_interval_title\">প্লেব্যাক লোড বিরতির আকার</string>\n    <string name=\"yes\">হ্যা</string>\n    <string name=\"no\">না</string>\n    <string name=\"tab_bookmarks_short\">প্লেলিস্ট</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">উদাহরণস্বরূপ, যদি আপনি ভাঙা ফিজিক্যাল বোতাম সহ একটি হেডসেট ব্যবহার করেন তবে এটি কার্যকর</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-bn-rBD/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">শুরু করতে আতস কাঁচটিতে টিপ দাও।</string>\n    <string name=\"upload_date_text\">%1$s তারিখে প্রকাশিত</string>\n    <string name=\"no_player_found\">কোন স্ট্রিম প্লেয়ার নেই। VLC ইনস্টল করতে চান\\?</string>\n    <string name=\"install\">ইনস্টল</string>\n    <string name=\"cancel\">বাতিল</string>\n    <string name=\"open_in_browser\">ব্রাউজারে ওপেন করুন</string>\n    <string name=\"open_in_popup_mode\">পপ-আপ মোডে ওপেন করো</string>\n    <string name=\"share\">শেয়ার</string>\n    <string name=\"download\">ডাউনলোড</string>\n    <string name=\"search\">খুঁজুন</string>\n    <string name=\"settings\">সেটিংস</string>\n    <string name=\"did_you_mean\">আপনি কি %1$s বুঝিয়েছেন\\?</string>\n    <string name=\"share_dialog_title\">শেয়ার করুন</string>\n    <string name=\"use_external_video_player_title\">বাইরের ভিডিও প্লেয়ার ব্যবহার করুন</string>\n    <string name=\"use_external_audio_player_title\">অন্য অডিও প্লেয়ার ব্যবহার করুন</string>\n    <string name=\"controls_background_title\">ব্যাকগ্রাউন্ড</string>\n    <string name=\"controls_popup_title\">পপআপ</string>\n    <string name=\"download_path_title\">ভিডিও ডাউনলোড ফোল্ডার</string>\n    <string name=\"download_path_summary\">ডাউনলোড করা ভিডিওগুলো এখানে থাকে</string>\n    <string name=\"download_path_dialog_title\">ভিডিও ফাইলের জন্য ডাউনলোড ফোল্ডার বাছুন</string>\n    <string name=\"download_path_audio_title\">অডিও ডাউনলোড ফোল্ডার</string>\n    <string name=\"download_path_audio_summary\">ডাউনলোড করা অডিও ফাইল এখানে জমা হয়</string>\n    <string name=\"download_path_audio_dialog_title\">অডিও ফাইলের জন্য ডাউনলোড ফোল্ডার বাছুন</string>\n    <string name=\"default_resolution_title\">ডিফল্ট রেজ্যুলেশন</string>\n    <string name=\"default_popup_resolution_title\">ডিফল্ট পপআপ রেজ্যুলেশন</string>\n    <string name=\"show_higher_resolutions_title\">উচ্চ রেজ্যুলেশন দেখাও</string>\n    <string name=\"show_higher_resolutions_summary\">শুধু কিছু ডিভাইস 2K/4K ভিডিও চালাতে পারে</string>\n    <string name=\"play_with_kodi_title\">Kodi এর মাধ্যমে চালাও</string>\n    <string name=\"kore_not_found\">হারানো কোর ইনস্টল করবেন\\?</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi দিয়ে চালাও\\\" অপশন দেখাও</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প দেখাও</string>\n    <string name=\"play_audio\">অডিও</string>\n    <string name=\"default_audio_format_title\">ডিফল্ট অডিও ফরম্যাট</string>\n    <string name=\"default_video_format_title\">ডিফল্ট ভিডিও ফরম্যাট</string>\n    <string name=\"theme_title\">থিম</string>\n    <string name=\"light_theme_title\">উজ্জ্বল</string>\n    <string name=\"dark_theme_title\">অন্ধকার</string>\n    <string name=\"black_theme_title\">কালো</string>\n    <string name=\"popup_remember_size_pos_title\">পপআপ আকার এবং অবস্থান মনে রাখো</string>\n    <string name=\"popup_remember_size_pos_summary\">পপআপের শেষ আকার ও অবস্থান মনে রাখো</string>\n    <string name=\"download_dialog_title\">ডাউনলোড</string>\n    <string name=\"show_next_and_similar_title\">পরবর্তী এবং অনুরূপ ভিডিওগুলি দেখাও</string>\n    <string name=\"unsupported_url\">URL সমর্থিত নয়</string>\n    <string name=\"content_language_title\">কন্টেন্ট এর জন্য পছন্দসই ভাষা</string>\n    <string name=\"settings_category_video_audio_title\">ভিডিও এবং অডিও</string>\n    <string name=\"settings_category_appearance_title\">অ্যাপিয়ারেন্স</string>\n    <string name=\"background_player_playing_toast\">ব্যাকগ্রাউন্ডে চলছে</string>\n    <string name=\"popup_playing_toast\">পপআপ মোডে চলছে</string>\n    <string name=\"content\">কন্টেন্ট</string>\n    <string name=\"show_age_restricted_content_title\">বয়সের অনুপযোগী কন্টেন্ট দেখাও</string>\n    <string name=\"duration_live\">লাইভ</string>\n    <string name=\"downloads\">ডাউনলোডগুলি</string>\n    <string name=\"downloads_title\">ডাউনলোডগুলি</string>\n    <string name=\"error_report_title\">ত্রুটি প্রতিবেদন</string>\n    <string name=\"all\">সবগুলি</string>\n    <string name=\"disabled\">নিস্ক্রীয়</string>\n    <string name=\"clear\">পরিষ্কার</string>\n    <!-- error strings -->\n    <string name=\"general_error\">ত্রুটি</string>\n    <string name=\"network_error\">নেটওয়ার্ক ত্রুটি</string>\n    <string name=\"could_not_load_thumbnails\">সব থাম্বনেইল লোড করা যায়নি</string>\n    <string name=\"parsing_error\">ওয়েবসাইট বিশ্লেষন করা যায়নি</string>\n    <string name=\"content_not_available\">কন্টেন্ট উপলব্ধ নয়</string>\n    <string name=\"could_not_setup_download_menu\">ডাউনলোড মেনু সেটআপ করা যায়নি</string>\n    <string name=\"app_ui_crash\">অ্যাপ / UI ক্র্যাশ করেছে</string>\n    <!-- error activity -->\n    <string name=\"sorry_string\">দুঃখিত, এটা ঘটা উচিত ছিল না।</string>\n    <string name=\"error_report_button_text\">মেইলের মাধ্যমে ত্রুটি প্রতিবেদন করুন</string>\n    <string name=\"error_snackbar_message\">দুঃখিত, কিছু ত্রুটি ঘটেছে।</string>\n    <string name=\"error_snackbar_action\">প্রতিবেদন</string>\n    <string name=\"what_device_headline\">তথ্য:</string>\n    <string name=\"what_happened_headline\">কি হয়েছিল:</string>\n    <string name=\"your_comment\">তোমার মন্তব্য (ইংরেজিতে):</string>\n    <string name=\"error_details_headline\">বর্ণনা:</string>\n    <!-- Content descriptions (for better accessibility) -->\n    <string name=\"detail_thumbnail_view_description\">ভিডিও চালাও, সময়:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">আপলোডারের ইউজারপিক থাম্বনেইল</string>\n    <string name=\"detail_likes_img_view_description\">পছন্দ হয়েছে</string>\n    <string name=\"detail_dislikes_img_view_description\">অপছন্দ হয়েছে</string>\n    <string name=\"video\">ভিডিও</string>\n    <string name=\"audio\">অডিও</string>\n    <string name=\"retry\">পুনরায় চেষ্টা করো</string>\n    <!-- Missions -->\n    <string name=\"start\">শুরু</string>\n    <string name=\"pause\">বিরতি</string>\n    <string name=\"delete\">ডিলেট</string>\n    <string name=\"checksum\">চেকসাম</string>\n    <!-- Fragment -->\n    <string name=\"ok\">ঠিক আছে</string>\n    <!-- Msg -->\n    <string name=\"msg_name\">ফাইলের নাম</string>\n    <string name=\"msg_threads\">থ্রেড</string>\n    <string name=\"msg_error\">ত্রুটি</string>\n    <string name=\"msg_running\">NewPipe ডাউনলোড হচ্ছে</string>\n    <string name=\"msg_running_detail\">বিস্তারিত জানার জন্য আলতো চাপ</string>\n    <string name=\"msg_wait\">অনুগ্রহপূর্বক অপেক্ষা করো…</string>\n    <string name=\"msg_copied\">ক্লিপবোর্ডে অনুলিপি করা হয়েছে</string>\n    <string name=\"no_available_dir\">পরে সেটিংস থেকে একটি ডাউনলোড ফোল্ডার নির্ধারণ করে দিন</string>\n    <string name=\"msg_popup_permission\">পপআপ মোডে চালু হতে\n\\nএই অনুমতির প্রয়োজন আছে</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA চ্যালেঞ্জ</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে</string>\n    <!-- End of GigaGet's Strings -->\n    <string name=\"info_labels\">কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ:\\nআইপি পরিসর:</string>\n    <string name=\"controls_download_desc\">স্ট্রিম ফাইল ডাউনলোড করুন</string>\n    <string name=\"show_info\">তথ্য দেখাও</string>\n    <string name=\"fragment_feed_title\">নতুন যা কিছু</string>\n    <string name=\"controls_add_to_playlist_title\">যুক্ত করুন</string>\n    <string name=\"enable_search_history_title\">অনুসন্ধানের ইতিহাস</string>\n    <string name=\"enable_watch_history_title\">দেখার ইতিহাস</string>\n    <string name=\"settings_category_player_title\">প্লেয়ার</string>\n    <string name=\"settings_category_player_behavior_title\">ব্যাবহার</string>\n    <string name=\"settings_category_history_title\">ইতিহাস</string>\n    <string name=\"settings_category_debug_title\">ডিবাগ</string>\n    <string name=\"always\">সবসময়</string>\n    <string name=\"just_once\">একবার মাত্র</string>\n    <string name=\"unknown_content\">[অজানা]</string>\n    <string name=\"no_views\">কোন ভিউ নেই</string>\n    <string name=\"rename\">নাম পরিবর্তন করুন</string>\n    <string name=\"website_title\">ওয়েবসাইট</string>\n    <string name=\"no_player_found_toast\">কোন স্ট্রিম প্লেয়ার নেই (প্লে করতে VLC ইন্সটল করতে পারেন)।</string>\n    <string name=\"use_external_video_player_summary\">কিছু কিছু রেজ্যুলেশনে অডিও বন্ধ করে দেয়</string>\n    <string name=\"subscribe_button_title\">সাবস্ক্রাইব</string>\n    <string name=\"subscribed_button_title\">সাবস্ক্রাইবকৃত</string>\n    <string name=\"channel_unsubscribed\">চ্যানেল থেকে আনসাবস্ক্রাইব্ড</string>\n    <string name=\"subscription_change_failed\">সাবস্ক্রিপশন পরিবর্তন করা যায়নি</string>\n    <string name=\"subscription_update_failed\">সাবস্ক্রিপশন আপডেট করা যায়নি</string>\n    <string name=\"tab_subscriptions\">সাবস্ক্রিপশন</string>\n    <string name=\"tab_bookmarks\">বুকমার্ককৃত প্লেলিস্টসমূহ</string>\n    <string name=\"use_inexact_seek_title\">দ্রুত টানা ব্যাবহার করুন</string>\n    <string name=\"unsubscribe\">আনসাবস্ক্রাইব</string>\n    <string name=\"tab_choose\">ট্যাব পছন্দ করুন</string>\n    <string name=\"use_inexact_seek_summary\">অনির্দিষ্ট সন্ধান প্লেয়ারকে আরো দ্রুত গতিতে সন্ধান করার সুবিধা দেয়, কিন্তু এটি সম্পূর্ণ নির্ভুল নাও হতে পারে ৷ ৫, ১৫ ও ২৫ সেকেন্ডের জন্য এটা কাজ করবে না ৷</string>\n    <string name=\"seek_duration_title\">দ্রুত-ফরওয়ার্ড/-পুনরায় সন্ধান সময়কাল</string>\n    <string name=\"show_comments_summary\">মন্তব্যসমূহ লুকাতে বন্ধ করুন</string>\n    <string name=\"show_comments_title\">মন্তব্যসমূহ দেখাও</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">ছবির ক্যাশ মোছা হয়েছে</string>\n    <string name=\"metadata_cache_wipe_summary\">সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো</string>\n    <string name=\"metadata_cache_wipe_title\">ক্যাশ করা মেটাডেটা মোছ</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">মেটাডেটা ক্যাশ মোছা হয়েছে</string>\n    <string name=\"auto_queue_title\">পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করো</string>\n    <string name=\"missions_header_finished\">সম্পন্ন</string>\n    <string name=\"list\">তালিকা</string>\n    <string name=\"enable_playback_state_lists_title\">তালিকা আকারে সাজাও</string>\n    <string name=\"enable_playback_resume_summary\">শেষ প্লেব্যাক পজিশন এ যাও</string>\n    <string name=\"enable_playback_resume_title\">পুনরায় প্লে ব্যাক চালু করো</string>\n    <string name=\"enable_search_history_summary\">অনুসন্ধানের বিষয়বস্তু স্থানীয়ভাবে জমা করো</string>\n    <string name=\"show_search_suggestions_summary\">অনুসন্ধানকালীন কী পরামর্শ দেওয়া হবে তা বাছুন</string>\n    <string name=\"show_search_suggestions_title\">অনুসন্ধানের পরামর্শ</string>\n    <string name=\"search_showing_result_for\">ফলাফল দেখাচ্ছে: %s এর জন্যে</string>\n    <string name=\"tab_about\">সম্পর্কিত</string>\n    <string name=\"title_activity_about\">নিউপাইপ এর সম্বন্ধে</string>\n    <string name=\"trending\">ট্রেন্ডিং</string>\n    <string name=\"feed_create_new_group_button_title\">নতুন</string>\n    <string name=\"feed_notification_loading\">ফিড লোড হচ্ছে…</string>\n    <string name=\"app_language_title\">অ্যাপ এর ভাষা</string>\n    <string name=\"pause_downloads\">ডাউনলোড পজ করুন</string>\n    <string name=\"start_downloads\">ডাউনলোড শুরু করুন</string>\n    <string name=\"close\">বন্ধ করুন</string>\n    <string name=\"stop\">বন্ধ করুন</string>\n    <string name=\"delete_downloaded_files\">ডাউনলোড করা ফাইলগুলো ডিলিট করুন</string>\n    <string name=\"clear_download_history\">ডাওন লোড ইতিহাস মুছুন</string>\n    <string name=\"error_insufficient_storage_left\">ডিভাইস এ স্পেস নেই</string>\n    <string name=\"error_http_not_found\">পাওয়া যায় নি</string>\n    <string name=\"error_unknown_host\">সার্ভার পাওয়া যায় নি</string>\n    <string name=\"show_error\">এরর দেখান</string>\n    <string name=\"download_failed\">ডাউনলোড ব্যর্থ হয়েছে</string>\n    <string name=\"paused\">স্থগিত</string>\n    <string name=\"auto\">অটো</string>\n    <string name=\"limit_data_usage_none_description\">সীমাহীন</string>\n    <string name=\"caption_none\">কোন ক্যাপশন নেই</string>\n    <string name=\"playlist_creation_success\">প্লে লিস্ট তৈরি হয়েছে</string>\n    <string name=\"delete_playlist_prompt\">প্লে লিস্ট ডিলিট করতে চান\\?</string>\n    <string name=\"unbookmark_playlist\">বুকমার্ক মুছুন</string>\n    <string name=\"unmute\">আন মিউট</string>\n    <string name=\"mute\">মিউট</string>\n    <string name=\"add_to_playlist\">প্লে লিস্ট এ যুক্ত করুন</string>\n    <string name=\"name\">নাম</string>\n    <string name=\"create_playlist\">নতুন প্লে লিস্ট</string>\n    <string name=\"always_ask_open_action\">সবসময় জিজ্ঞেস করুন</string>\n    <string name=\"video_player\">ভিডিও প্লেয়ার</string>\n    <string name=\"drawer_close\">ড্রয়ার বন্ধ করুন</string>\n    <string name=\"drawer_open\">ড্রয়ার খুলন</string>\n    <string name=\"play_queue_audio_settings\">অডিও সেটিং</string>\n    <string name=\"recently_added\">সাম্প্রতিক যুক্ত</string>\n    <string name=\"new_and_hot\">নতুন এবং হট</string>\n    <string name=\"top_50\">প্রথম ৫০</string>\n    <string name=\"error_unable_to_load_comments\">মন্তব্যগুলি লোড করা যায় নি</string>\n    <string name=\"select_a_playlist\">একটি প্লে লিস্ট পছন্দ করুন</string>\n    <string name=\"select_a_channel\">একটি চ্যানেল পছন্দ করুন</string>\n    <string name=\"channel_page_summary\">চ্যানেল এর পাতা</string>\n    <string name=\"blank_page_summary\">খালি পাতা</string>\n    <string name=\"title_most_played\">সবথেকে বেশি চালানো</string>\n    <string name=\"title_last_played\">শেষ চালানো</string>\n    <string name=\"read_full_license\">লাইসেন্স পড়ুন</string>\n    <string name=\"app_license_title\">নিউপাইপ এর লাইসেন্স</string>\n    <string name=\"read_privacy_policy\">প্রাইভেসি পলিসি পড়ুন</string>\n    <string name=\"privacy_policy_title\">নিউপাইপ এর গোপনীয়তা নীতি</string>\n    <string name=\"give_back\">ফিরিয়ে দিন</string>\n    <string name=\"view_on_github\">গিটহাব এ দেখুন</string>\n    <string name=\"title_licenses\">থার্ড-পার্টি লাইসেন্স সমূহ</string>\n    <string name=\"charset_letters_and_digits\">শব্দ ও নম্বর</string>\n    <string name=\"one_item_deleted\">একটি আইটেম ডিলিট হয়েছে।</string>\n    <string name=\"no_comments\">কোন মন্তব্য নেই</string>\n    <string name=\"no_videos\">কোন ভিডিও নেই</string>\n    <string name=\"no_subscribers\">কোন সাবস্ক্রাইবার নেই</string>\n    <string name=\"search_no_results\">কোন রেজাল্ট নেই</string>\n    <string name=\"error_report_open_issue_button_text\">গিটহাব এ এরর রিপোর্ট করুন</string>\n    <string name=\"restore_defaults_confirmation\">আপনি কি ডিফল্ট এ ফিরতে চান\\?</string>\n    <string name=\"restore_defaults\">ডিফল্ট এ ফিরে যান</string>\n    <string name=\"no_streams_available_download\">ডাউন লোড এর জন্য কোন স্ট্রিম নেই</string>\n    <string name=\"error_occurred_detail\">একটা এরর হয়েছেঃ %1$s</string>\n    <string name=\"file_name_empty_error\">ফাইল এর নাম খালি থাকতে পারে না</string>\n    <string name=\"invalid_directory\">কোন ফোল্ডার নেই</string>\n    <string name=\"missing_file\">ফাইল সরে গেছে না হয় মুছে ফেলা হয়েছে</string>\n    <string name=\"audio_streams_empty\">কোন অডিও স্ট্রিম পাওয়া যায় নি</string>\n    <string name=\"video_streams_empty\">কোন ভিডিও</string>\n    <string name=\"player_recoverable_failure\">প্লেয়ার এর এরর থেকে বেরিয়ে আসুন</string>\n    <string name=\"player_stream_failure\">স্ট্রিম টি চালানো গেল না</string>\n    <string name=\"download_to_sdcard_error_title\">বাহ্যিক স্টোরেজ নেই</string>\n    <string name=\"search_history_deleted\">অনুসন্ধান ইতিহাস মোছা হয়েছে</string>\n    <string name=\"delete_search_history_alert\">সমগ্র সার্চ ইতিহাস মুছবেন\\?</string>\n    <string name=\"clear_search_history_summary\">সার্চের ইতিহাস মোছা হয়</string>\n    <string name=\"clear_search_history_title\">সার্চ ইতিহাস মুছুন</string>\n    <string name=\"watch_history_states_deleted\">প্লেব্যাক অবস্থানসমূহ মোছা হয়েছে</string>\n    <string name=\"delete_playback_states_alert\">সমস্ত প্লে লিস্ট এর অবস্থান মুছবেন\\?</string>\n    <string name=\"clear_playback_states_summary\">সমস্ত প্লে লিস্ট এর অবস্থান মুছে ফেলুন</string>\n    <string name=\"clear_playback_states_title\">প্লে লিস্ট এর অবস্থান মুছে ফেলুন</string>\n    <string name=\"watch_history_deleted\">দেখা ভিডিওর ইতিহাস মোছা হয়েছে</string>\n    <string name=\"delete_view_history_alert\">সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন\\?</string>\n    <string name=\"clear_views_history_title\">দেখার ইতিহাস মুছে ফেলুন</string>\n    <string name=\"export_data_title\">ডাটা বেস এক্সপোর্ট করুন</string>\n    <string name=\"import_data_title\">ডাটাবেস আনুন</string>\n    <string name=\"switch_to_main\">মেন এ ফিরে যান</string>\n    <string name=\"switch_to_popup\">পপ-আপ এ খুলুন</string>\n    <string name=\"switch_to_background\">পেছনে নিয়ে যান</string>\n    <string name=\"app_update_notification_channel_description\">নতুন নিউপাইপ ভার্সন এর নোটিফিকেশন</string>\n    <string name=\"app_update_notification_channel_name\">অ্যাপ আপডেট নোটিফিকেশন</string>\n    <string name=\"notification_channel_name\">নিউ পাইপ নোটিফিকেশন</string>\n    <string name=\"play_all\">সব চালু করুন</string>\n    <string name=\"file_deleted\">ফাইল ডিলিট হয়েছে</string>\n    <string name=\"best_resolution\">সেরা রেজুলিউসন</string>\n    <string name=\"artists\">শিল্পীরা</string>\n    <string name=\"albums\">অ্যালবাম গুলি</string>\n    <string name=\"songs\">গান গুলি</string>\n    <string name=\"videos_string\">ভিডিও গুলি</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTube-এর \\\"সীমিত মোড\\\" চালু করো</string>\n    <string name=\"peertube_instance_add_https_only\">শুধুমাত্র HTTPS URL গুলি সাপোর্ট করে</string>\n    <string name=\"peertube_instance_add_help\">ইন্সটান্স এর ইউ আর এল</string>\n    <string name=\"peertube_instance_add_title\">ইন্সটান্স যোগ করুন</string>\n    <string name=\"peertube_instance_url_summary\">আপনার পছন্দের পিয়ার টিউব ইন্সটান্স</string>\n    <string name=\"peertube_instance_url_title\">পিয়ার টিউব এর ইন্সটান্স সমূহ</string>\n    <string name=\"grid\">ছক</string>\n    <string name=\"local\">স্থানীয়</string>\n    <string name=\"done\">হয়েছে</string>\n    <string name=\"events\">ইভেন্টগুলো</string>\n    <string name=\"settings_category_updates_title\">আপডেট</string>\n    <string name=\"minimize_on_exit_none_description\">কোনোটি না</string>\n    <string name=\"accept\">স্বীকার করো</string>\n    <string name=\"decline\">অস্বীকার করো</string>\n    <string name=\"caption_setting_title\">ক্যাপশন</string>\n    <string name=\"caption_auto_generated\">স্বয়ংক্রিয়ভাবে-তৈরিকৃত</string>\n    <string name=\"resize_zoom\">জুম</string>\n    <string name=\"resize_fit\">আটানো</string>\n    <string name=\"resize_fill\">পূরণ</string>\n    <string name=\"file\">ফাইল</string>\n    <string name=\"tracks\">ট্র্যাক</string>\n    <string name=\"playlists\">প্লেলিস্ট</string>\n    <string name=\"playlist_add_stream_success\">প্লেলিস্টকৃত</string>\n    <string name=\"channels\">চ্যানেলগুলো</string>\n    <string name=\"rename_playlist\">নাম পাল্টাও</string>\n    <string name=\"play_queue_stream_detail\">বিবরণ</string>\n    <string name=\"play_queue_remove\">সরাও</string>\n    <string name=\"import_complete_toast\">আনা হয়েছে</string>\n    <string name=\"export_complete_toast\">বের করা হয়েছে</string>\n    <string name=\"action_history\">ইতিহাস</string>\n    <string name=\"title_activity_history\">ইতিহাস</string>\n    <string name=\"tab_licenses\">অনুমতিপত্র</string>\n    <string name=\"donation_title\">দান করো</string>\n    <string name=\"contribution_title\">স্বেচ্ছাস্বেবা</string>\n    <string name=\"settings_category_downloads_title\">ডাউনলোড</string>\n    <string name=\"dismiss\">সরাও</string>\n    <string name=\"create\">তৈরি করো</string>\n    <string name=\"undo\">ফিরে যাও</string>\n    <string name=\"autoplay_title\">স্বয়ংক্রিয় প্লে</string>\n    <string name=\"resume_on_audio_focus_gain_title\">পুনরায় চালু করো</string>\n    <string name=\"enable_watch_history_summary\">দেখা ভিডিওগুলোর হিসেব</string>\n    <string name=\"settings_category_clear_data_title\">ডাটা মুছে ফেল</string>\n    <string name=\"notification_action_nothing\">কিছুই না</string>\n    <string name=\"notification_action_repeat\">পুনরায়</string>\n    <string name=\"notification_action_0_title\">প্রথম ক্রিয়া বোতাম</string>\n    <string name=\"notification_scale_to_square_image_title\">থাম্বনেল ১:১ অনুপাতে সেট করো</string>\n    <string name=\"systems_language\">সিস্টেম ডিফল্ট</string>\n    <string name=\"bookmark_playlist\">প্লেলিস্ট বুকমার্ক করুন</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">যখন পর্যাপ্ত নিবেদিত ফিড থেকে ডাটা সংগ্রহ করুন</string>\n    <string name=\"feed_update_threshold_option_always_update\">সবসময় হালনগাদ করুন</string>\n    <string name=\"feed_update_threshold_summary\">শেষ হালনাগাদের পর একটি সাবস্ক্রিপশনের আগের সময় সেকেলে বিবেচিত — %s</string>\n    <string name=\"feed_update_threshold_title\">ফিড হালনাগাদ প্রবেশস্থল</string>\n    <string name=\"settings_category_feed_title\">ফিড</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">শুধুমাত্র অদলবদ্ধ সদস্যতা দেখাও</string>\n    <string name=\"feed_group_dialog_delete_message\">আপনি কি এ গ্রুপটি মুছতে চান\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">খালি গ্রুপ নেম</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d নির্বাচিত</item>\n        <item quantity=\"other\">%d সমূহ নির্বাচিত</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">কোন সাবস্ক্রিপশন নির্বাচন হয়নি</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">সাবস্ক্রিপশন নির্বাচন করুন</string>\n    <string name=\"feed_processing_message\">ফিড প্রসেস হচ্ছে…</string>\n    <string name=\"feed_subscription_not_loaded_count\">লোড হয়নি: %d</string>\n    <string name=\"feed_oldest_subscription_update\">ফিড শেষে হালনাগাদ করা হয়েছে: %s</string>\n    <string name=\"feed_groups_header_title\">চ্যানেল গ্রুপ</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d দিন</item>\n        <item quantity=\"other\">%d দিন</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d ঘন্টা</item>\n        <item quantity=\"other\">%d ঘন্টা</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d মিনিট</item>\n        <item quantity=\"other\">%d মিনিট</item>\n    </plurals>\n    <string name=\"website_encouragement\">আরও তথ্য এবং খবরের জন্য নিউপাইপ ওয়েবসাইট দেখো।</string>\n    <string name=\"open_with\">দিয়ে খুলো</string>\n    <string name=\"comments_tab_description\">মতামত</string>\n    <string name=\"off\">বন্ধ</string>\n    <string name=\"on\">চালু</string>\n    <string name=\"tablet_mode_title\">ট্যাবলেট মোড</string>\n    <string name=\"open_website_license\">সক্রিয় ওয়েবসাইট</string>\n    <string name=\"metadata_privacy_private\">গোপন</string>\n    <string name=\"metadata_privacy_unlisted\">নথিভুক্ত নয়</string>\n    <string name=\"metadata_support\">সহায়তা</string>\n    <string name=\"metadata_category\">প্রকারভেদ</string>\n    <string name=\"metadata_privacy_internal\">অভ্যন্তরীন</string>\n    <string name=\"metadata_language\">ভাষা</string>\n    <string name=\"metadata_age_limit\">বয়স সীমা</string>\n    <string name=\"main_page_content\">প্রধান পাতার উপাদান সমূহ</string>\n    <string name=\"no_one_listening\">কেউ শুনছে না</string>\n    <string name=\"start_main_player_fullscreen_title\">মূল প্লেয়ার পুরো পর্দাজুড়ে চালাও</string>\n    <string name=\"description_tab_description\">বর্ণনা</string>\n    <string name=\"settings_category_player_notification_title\">প্লেয়ার নোটিফিকেশন</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">ইউটিউব একটি \\\"সীমিত ধরন\\\" সরবরাহ করে যেটি সম্ভাব্য প্রাপ্তবয়স্ক কন্টেন্ট লুকিয়ে রাখে</string>\n    <string name=\"hash_channel_name\">ভিডিও হ্যাশ নোটিফিকেশন</string>\n    <string name=\"streams_notification_channel_name\">নতুন স্ট্রিমসমূহ</string>\n    <string name=\"recaptcha_cookies_cleared\">রিক্যাপচা কুকিজ মোছা হয়েছে</string>\n    <string name=\"permission_display_over_apps\">অন্যান্য অ্যাপের উপরে হাজির হতে অনুমতি দিন</string>\n    <string name=\"error_report_notification_toast\">সমস্যা হয়েছে, নোটিফিকেশন দেখুন</string>\n    <string name=\"copy_for_github\">তৈরিকৃত রিপোর্ট কপি করো</string>\n    <string name=\"related_items_tab_description\">সম্পর্কিত আইটেমসমূহ</string>\n    <string name=\"empty_list_subtitle\">ঝিঁঝিঁপোকা ছাড়া এখানে কিছু নেই</string>\n    <string name=\"detail_drag_description\">পুনর্বিন্যাস্ত করতে টান দিন</string>\n    <string name=\"subscribers_count_not_available\">গ্রাহকসংখ্যা সুলভ নয়</string>\n    <string name=\"no_one_watching\">কেউ দেখছে না</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s ভিডিও</item>\n        <item quantity=\"other\">%s ভিডিও</item>\n    </plurals>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s জন শ্রোতা</item>\n        <item quantity=\"other\">%s জন শ্রোতা</item>\n    </plurals>\n    <string name=\"infinite_videos\">∞ ভিডিও</string>\n    <string name=\"recaptcha_solve\">সমাধান করো</string>\n    <string name=\"enable_streams_notifications_title\">নতুন স্ট্রিমের নোটিফিকেশন</string>\n    <string name=\"any_network\">যেকোন নেটওয়ার্ক</string>\n    <string name=\"updates_setting_title\">আপডেটসমূহ</string>\n    <string name=\"wifi_only\">শুধু ওয়াই-ফাই তে</string>\n    <string name=\"never\">কখনো না</string>\n    <string name=\"missions_header_pending\">অপেক্ষমাণ</string>\n    <string name=\"checking_updates_toast\">আপডেট চেক করা হচ্ছে …</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"night_theme_title\">রাত্রিকালীন থিম</string>\n    <string name=\"show_description_title\">বর্ণনা দেখাও</string>\n    <string name=\"notification_action_1_title\">দ্বিতীয় পদক্ষেপ বোতাম</string>\n    <string name=\"notification_action_4_title\">পঞ্চম পদক্ষেপ বোতাম</string>\n    <string name=\"show_description_summary\">ভিডিও বর্ণনা ও বাড়তি তথ্য লুকাতে বন্ধ করুন</string>\n    <string name=\"dont_show\">দেখিও না</string>\n    <string name=\"app_update_available_notification_title\">নিউ পাইপ আপডেট এসেছে!</string>\n    <string name=\"comments_are_disabled\">মন্তব্যসমূহ নিষ্ক্রিয় আছে</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s বার দেখেছে</item>\n        <item quantity=\"other\">%s বার দেখেছে</item>\n    </plurals>\n    <string name=\"overwrite\">ওভাররাইট</string>\n    <string name=\"notification_action_2_title\">তৃতীয় পদক্ষেপ বোতাম</string>\n    <string name=\"local_search_suggestions\">স্থানীয় অনুসন্ধানের পরামর্শ</string>\n    <string name=\"limit_mobile_data_usage_title\">মোবাইল ডেটা ব্যবহারের সময় রেজুলেশন সীমিত করো</string>\n    <string name=\"queued\">অপেক্ষমাণ</string>\n    <string name=\"clear_queue_confirmation_summary\">এক প্লেয়ার বদলে অন্য প্লেয়ারে যাওয়া আপনার অপেক্ষমাণ সারিকে প্রতিস্থাপন করতে পারে</string>\n    <string name=\"clear_queue_confirmation_description\">সক্রিয় প্লেয়ারের অপেক্ষমাণ সারি প্রতিস্থাপিত হবে</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">বিঘ্ন ঘটার পরে চালানো অব্যাহত রাখো (যেমন. ফোনকল)</string>\n    <string name=\"enable_playback_state_lists_summary\">প্লেব্যাক অবস্থানের চিহ্নসমূহ তালিকায় দেখাও</string>\n    <string name=\"unsupported_url_dialog_message\">URL টি বোঝা যায়নি। অন্য অ্যাপ দিয়ে খুলবো\\?</string>\n    <string name=\"default_content_country_title\">কনটেন্টের জন্য পূর্বনির্ধারিত দেশ</string>\n    <string name=\"external_player_unsupported_link_type\">বাইরের প্লেয়ারসমূহ এ ধরনের লিঙ্কসমূহ সমর্থন করে না</string>\n    <string name=\"msg_calculating_hash\">হ্যাশ হিসাব করা হচ্ছে</string>\n    <string name=\"check_for_updates\">আপডেট চেক করো</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s জন দেখছে</item>\n        <item quantity=\"other\">%s জন দেখছে</item>\n    </plurals>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s টি নতুন স্ট্রিম</item>\n        <item quantity=\"other\">%s টি নতুন স্ট্রিম</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">ডাউনলোড সম্পন্ন</item>\n        <item quantity=\"other\">%s ডাউনলোড হয়েছে</item>\n    </plurals>\n    <string name=\"more_than_100_videos\">১০০+ ভিডিও</string>\n    <string name=\"users\">ব্যবহারকারীগণ</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s জন গ্রাহক</item>\n        <item quantity=\"other\">%s জন গ্রাহক</item>\n    </plurals>\n    <string name=\"show_meta_info_title\">আনুষঙ্গিক তথ্য দেখাও</string>\n    <string name=\"streams_notifications_network_title\">নেটওয়ার্ক সংযোগ দরকার</string>\n    <string name=\"high_quality_larger\">উচ্চ মান (বড় আকারের)</string>\n    <string name=\"low_quality_smaller\">নিম্ন মান (ছোট আকার)</string>\n    <string name=\"notification_action_3_title\">চতুর্থ পদক্ষেপ বোতাম</string>\n    <string name=\"notification_action_shuffle\">এলোমেলো</string>\n    <string name=\"notification_action_buffering\">বাফারিং</string>\n    <string name=\"notification_colorize_title\">নোটিফিকেশন বর্ণিল করো</string>\n    <string name=\"restricted_video\">এই ভিডিও বয়স দ্বারা সীমিত।\n\\n\n\\nএটি দেখতে চাইলে সেটিংস থেকে \\\"%1$s\\\" চালু করুন।</string>\n    <string name=\"toggle_all\">সব টগল করো</string>\n    <string name=\"you_successfully_subscribed\">আপনি এখন এই চ্যানেলের গ্রাহক</string>\n    <string name=\"clear_queue_confirmation_title\">অপেক্ষমাণ সারি বাদ দেওয়ার আগে নিশ্চিত হতে জিজ্ঞেস করো</string>\n    <string name=\"show_age_restricted_content_summary\">শিশুদের জন্য বয়সসীমার কারণে অনুপযোগী হতে পারে এমন কন্টেন্ট দেখাও (যেমন ১৮+)</string>\n    <string name=\"clear_views_history_summary\">প্লে করা স্ট্রিমসমূহের ইতিহাস এবং প্লেব্যাক অবস্থানসমূহ মুছে দেবে</string>\n    <string name=\"notifications\">নোটিফিকেশনসমূহ</string>\n    <string name=\"error_report_channel_name\">ত্রুটি প্রতিবেদন এর নোটিফিকেশন</string>\n    <string name=\"export_data_summary\">ইতিহাস, সাবস্ক্রিপশন্স, প্লেলিস্ট ও সেটিংস রপ্তানি করো</string>\n    <string name=\"no_dir_yet\">কোনো ডাউনলোড ফোল্ডার ঠিক করা নেই, এখন ডিফল্ট ডাউনলোড ফোল্ডার বাছুন</string>\n    <string name=\"auto_device_theme_title\">স্বয়ংক্রিয় (ডিভাইস থিম)</string>\n    <string name=\"night_theme_summary\">প্রিয় রাত্রিকালীন থিম বেছে নিন — %s</string>\n    <string name=\"metadata_licence\">লাইসেন্স</string>\n    <string name=\"metadata_privacy\">গোপনতা</string>\n    <string name=\"select_night_theme_toast\">নিচ থেকে আপনার পছন্দের রাত্রিকালীন থিম বেছে নিতে পারেন</string>\n    <string name=\"download_has_started\">ডাউনলোড শুরু হয়েছে</string>\n    <string name=\"mark_as_watched\">দেখা হিসেবে মার্ক করো</string>\n    <string name=\"metadata_tags\">ট্যাগসমূহ</string>\n    <string name=\"notification_colorize_summary\">অ্যান্ড্রয়েডকে থাম্বনেইলের প্রধান রং অনুযায়ী রঙিন করুন (উল্লেখ্য যে, এটি সব ডিভাইসে উপলব্ধ নয়)</string>\n    <string name=\"unknown_format\">অজানা ধরন</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-bn-rIN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"pause_downloads\">ডাউনলোড পজ করুন</string>\n    <string name=\"start_downloads\">ডাউনলোড শুরু করুন</string>\n    <string name=\"delete_downloaded_files\">ডাউনলোড করা ফাইলগুলো ডিলিট করুন</string>\n    <string name=\"missions_header_finished\">সম্পূর্ণ</string>\n    <string name=\"list\">তালিকা</string>\n    <string name=\"title_activity_history\">ইতিহাস</string>\n    <string name=\"website_title\">ওয়েব সাইট</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA চ্যালেঞ্জ</string>\n    <string name=\"msg_popup_permission\">এই অনুমতিটি\n\\nপপআপ মোডে খুলতে প্রয়োজন</string>\n    <string name=\"msg_copied\">ক্লিপবোর্ডে অনুলিপি করা হয়েছে</string>\n    <string name=\"msg_wait\">অনুগ্রহপূর্বক অপেক্ষা করুন…</string>\n    <string name=\"msg_running_detail\">বিস্তারিত জানার জন্য আলতো চাপ</string>\n    <string name=\"msg_running\">NewPipe ডাউনলোড হচ্ছে</string>\n    <string name=\"msg_error\">ত্রুটি</string>\n    <string name=\"msg_threads\">থ্রেড</string>\n    <string name=\"msg_name\">ফাইলের নাম</string>\n    <string name=\"ok\">ঠিক আছে</string>\n    <string name=\"rename\">নাম পরিবর্তন করুন</string>\n    <string name=\"checksum\">চেকসাম</string>\n    <string name=\"delete\">ডিলেট</string>\n    <string name=\"pause\">বিরতি</string>\n    <string name=\"start\">শুরু</string>\n    <string name=\"no_views\">স্টোরেজ অ্যাক্সেস করার অনুমতি অস্বীকার করা হয়েছে</string>\n    <string name=\"audio\">অডিও</string>\n    <string name=\"video\">ভিডিও</string>\n    <string name=\"detail_dislikes_img_view_description\">অপছন্দ হয়েছে</string>\n    <string name=\"detail_likes_img_view_description\">পছন্দ হয়েছে</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">আপলোডারের ইউজারপিক থাম্বনেইল</string>\n    <string name=\"detail_thumbnail_view_description\">ভিডিও প্রাকদর্শন, সময়ঃ</string>\n    <string name=\"error_details_headline\">বর্ণনা:</string>\n    <string name=\"your_comment\">আপনার মন্তব্য (ইংরেজিতে):</string>\n    <string name=\"info_labels\">কি:\\nঅনুরোধ:\\nকন্টেন্ট ভাষা:\\nকন্টেন্ট দেশ:\\nঅ্যাপ ভাষা:\\nসার্ভিস:\\nসময়(GMT এ):\\nপ্যাকেজ:\\nসংস্করণ:\\nওএস সংস্করণ:</string>\n    <string name=\"what_happened_headline\">কি হয়েছিল:</string>\n    <string name=\"what_device_headline\">তথ্য:</string>\n    <string name=\"error_snackbar_action\">প্রতিবেদন</string>\n    <string name=\"error_snackbar_message\">দুঃখিত, কিছু ত্রুটি ঘটেছে।</string>\n    <string name=\"error_report_button_text\">মেইলের মাধ্যমে ত্রুটি প্রতিবেদন করুন</string>\n    <string name=\"sorry_string\">দুঃখিত, এটা ঘটা উচিত ছিল না।</string>\n    <string name=\"app_ui_crash\">অ্যাপ / UI ক্র্যাশ করেছে</string>\n    <string name=\"could_not_setup_download_menu\">ডাউনলোড মেনু সেটআপ করা যায়নি</string>\n    <string name=\"content_not_available\">কন্টেন্ট উপলব্ধ নয়</string>\n    <string name=\"parsing_error\">ওয়েবসাইট বিশ্লেষন করা যায়নি</string>\n    <string name=\"could_not_load_thumbnails\">সব থাম্বনেইল লোড করা যায়নি</string>\n    <string name=\"network_error\">নেটওয়ার্ক ত্রুটি</string>\n    <string name=\"general_error\">ত্রুটি</string>\n    <string name=\"unknown_content\">[অজানা]</string>\n    <string name=\"just_once\">একবার মাত্র</string>\n    <string name=\"always\">সবসময়</string>\n    <string name=\"clear\">পরিষ্কার</string>\n    <string name=\"disabled\">নিস্ক্রীয়</string>\n    <string name=\"all\">সবগুলি</string>\n    <string name=\"error_report_title\">ত্রুটি প্রতিবেদন</string>\n    <string name=\"downloads_title\">ডাউনলোডগুলি</string>\n    <string name=\"downloads\">ডাউনলোডগুলি</string>\n    <string name=\"duration_live\">লাইভ</string>\n    <string name=\"show_age_restricted_content_title\">বয়স সীমাবদ্ধ কন্টেন্ট দেখাও</string>\n    <string name=\"content\">কন্টেন্ট</string>\n    <string name=\"popup_playing_toast\">পপআপ মোডে চলছে</string>\n    <string name=\"background_player_playing_toast\">ব্যাকগ্রাউন্ডে চলছে</string>\n    <string name=\"settings_category_debug_title\">ডিবাগ</string>\n    <string name=\"settings_category_appearance_title\">অ্যাপিয়ারেন্স</string>\n    <string name=\"settings_category_history_title\">ইতিহাস ও ক্যচ</string>\n    <string name=\"settings_category_video_audio_title\">ভিডিও এবং অডিও</string>\n    <string name=\"settings_category_player_behavior_title\">ব্যাবহার</string>\n    <string name=\"settings_category_player_title\">প্লেয়ার</string>\n    <string name=\"content_language_title\">কন্টেন্ট এর জন্য পছন্দসই ভাষা</string>\n    <string name=\"unsupported_url\">URL সমর্থিত নয়</string>\n    <string name=\"show_next_and_similar_title\">পরবর্তী এবং অনুরূপ ভিডিওগুলি দেখাও</string>\n    <string name=\"download_dialog_title\">ডাউনলোড</string>\n    <string name=\"enable_watch_history_title\">ইতিহাস</string>\n    <string name=\"enable_search_history_title\">খোজ ইতিহাস</string>\n    <string name=\"auto_queue_title\">পরবর্তী স্ট্রিম স্বয়ংক্রিয়ংভাবে সংযোজন করুন</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">মেটাডেটা ক্যাশ মুছে ফেলা হয়েছে</string>\n    <string name=\"metadata_cache_wipe_summary\">সব ক্যাশড ওয়েবপেজ ডেটা মুছে ফেলো</string>\n    <string name=\"metadata_cache_wipe_title\">ক্যাশ করা মেটাডেটা মুছো</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">ছবির ক্যাশ মুছে ফেলা হয়েছে</string>\n    <string name=\"show_comments_summary\">মতামত প্রদর্শন বন্ধ করতে অপশনটি বন্ধ করুন</string>\n    <string name=\"show_comments_title\">মতামত প্রদর্শন করুন</string>\n    <string name=\"seek_duration_title\">দ্রুত-ফরওয়ার্ড/-পুনরায় সন্ধান সময়কাল</string>\n    <string name=\"use_inexact_seek_summary\">অনির্দিষ্ট সন্ধান প্লেয়ারকে আরো দ্রুত গতিতে সন্ধান করার সুবিধা দেয়, কিন্তু এটি সম্পূর্ণ নির্ভুল নাও হতে পারে ৷ ৫, ১৫ ও ২৫ সেকেন্ডের জন্য এটা কাজ করবে না ৷</string>\n    <string name=\"use_inexact_seek_title\">দ্রুত টানা ব্যাবহার করুন</string>\n    <string name=\"popup_remember_size_pos_summary\">শেষ আকার এবং পপআপ সেট অবস্থান মনে রাখো</string>\n    <string name=\"popup_remember_size_pos_title\">পপআপ আকার এবং অবস্থান মনে রাখো</string>\n    <string name=\"black_theme_title\">কালো</string>\n    <string name=\"dark_theme_title\">অন্ধকার</string>\n    <string name=\"light_theme_title\">উজ্জ্বল</string>\n    <string name=\"theme_title\">থিম</string>\n    <string name=\"default_video_format_title\">পছন্দসই ভিডিও ফরম্যাট</string>\n    <string name=\"default_audio_format_title\">ডিফল্ট অডিও ফরম্যাট</string>\n    <string name=\"play_audio\">অডিও</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প প্রদর্শন কর</string>\n    <string name=\"show_play_with_kodi_title\">দেখাও \\\"Kodi এর মাধ্যমে চালাও \\\" বিকল্প</string>\n    <string name=\"kore_not_found\">অনুপস্থিত কোড অ্যাপ ইনস্টল করবেন\\?</string>\n    <string name=\"play_with_kodi_title\">Kodi এর মাধ্যমে চালান</string>\n    <string name=\"show_higher_resolutions_summary\">শুধুমাত্র কিছু ডিভাইস 2K/4K ভিডিও চালাতে পারে</string>\n    <string name=\"show_higher_resolutions_title\">উচ্চ রেজোল্যুশন দেখাও</string>\n    <string name=\"default_popup_resolution_title\">ডিফল্ট পপআপ রেজোল্যুশন</string>\n    <string name=\"default_resolution_title\">ডিফল্ট রেজোল্যুশন</string>\n    <string name=\"download_path_audio_dialog_title\">অডিও ফাইলগুলির জন্য ডাউনলোডের ফোল্ডার নির্বাচন করুন</string>\n    <string name=\"download_path_audio_summary\">ডাউনলোড করা অডিও এখানে রাখা হয়</string>\n    <string name=\"download_path_audio_title\">অডিও ডাউনলোড ফোল্ডার</string>\n    <string name=\"download_path_dialog_title\">ভিডিওগুলির জন্য ডাউনলোডের পাথ নির্বাচন কর</string>\n    <string name=\"download_path_summary\">ডাউনলোড করা ভিডিওগুলো এখানে থাকে</string>\n    <string name=\"download_path_title\">ভিডিও ডাউনলোড করার ফোল্ডার</string>\n    <string name=\"controls_add_to_playlist_title\">যুক্ত করুন</string>\n    <string name=\"controls_popup_title\">পপআপ</string>\n    <string name=\"controls_background_title\">ব্যাকগ্রাউন্ড</string>\n    <string name=\"tab_bookmarks\">বুকমার্ককৃত প্লেলিস্টসমূহ</string>\n    <string name=\"tab_subscriptions\">সাবস্ক্রিপশন</string>\n    <string name=\"show_info\">তথ্য দেখুন</string>\n    <string name=\"subscription_update_failed\">সাবস্ক্রিপশন আপডেটে ব্যার্থ</string>\n    <string name=\"subscription_change_failed\">সাবস্ক্রিপশন পরিবর্তন করা যায়নি</string>\n    <string name=\"channel_unsubscribed\">চ্যানেল থেকে আনসাবস্ক্রাইব্ড</string>\n    <string name=\"unsubscribe\">আনসাবস্ক্রাইব</string>\n    <string name=\"subscribed_button_title\">সাবস্ক্রাইব করা আছে</string>\n    <string name=\"subscribe_button_title\">সাবস্ক্রাইব</string>\n    <string name=\"use_external_audio_player_title\">বহির্গত অডিও প্লেয়ার ব্যবহার করুন</string>\n    <string name=\"use_external_video_player_summary\">কিছু কিছু রেজোলিউশনে অডিও বন্ধ করে দেয়</string>\n    <string name=\"use_external_video_player_title\">বাইরের ভিডিও প্লেয়ার ব্যবহার করুন</string>\n    <string name=\"share_dialog_title\">শেয়ার করুন</string>\n    <string name=\"did_you_mean\">আপনি কি বুঝিয়েছেন \\\"%1$s\\\"\\?</string>\n    <string name=\"settings\">সেটিংস</string>\n    <string name=\"search\">খুঁজুন</string>\n    <string name=\"controls_download_desc\">স্ট্রিম ফাইল ডাউনলোড করুন</string>\n    <string name=\"download\">ডাউনলোউড</string>\n    <string name=\"share\">শেয়ার</string>\n    <string name=\"open_in_popup_mode\">পপ-আপ মোডে ওপেন করুন</string>\n    <string name=\"open_in_browser\">ব্রাউজারে ওপেন করুন</string>\n    <string name=\"cancel\">বাদ দিন</string>\n    <string name=\"install\">ইনস্টল</string>\n    <string name=\"no_player_found_toast\">কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি (প্লে করতে VLC ইন্সটল করতে পারেন)।</string>\n    <string name=\"no_player_found\">কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। VLC ইনস্টল করতে চান\\?</string>\n    <string name=\"upload_date_text\">প্রকাশকাল %1$s</string>\n    <string name=\"main_bg_subtitle\">অনুসন্ধান শুরু করুন</string>\n    <string name=\"feed_create_new_group_button_title\">নতুন</string>\n    <string name=\"fragment_feed_title\">নতুন কি</string>\n    <string name=\"app_language_title\">অ্যাপ এর ভাষা</string>\n    <string name=\"stop\">বন্ধ করুন</string>\n    <string name=\"clear_download_history\">ডাওন লোড ইতিহাস মুছুন</string>\n    <string name=\"error_insufficient_storage_left\">ডিভাইস এ স্পেস নেই</string>\n    <string name=\"error_http_not_found\">পাওয়া যায় নি</string>\n    <string name=\"error_unknown_host\">সার্ভার পাওয়া যায় নি</string>\n    <string name=\"download_failed\">ডাউন লোড হয় নি</string>\n    <string name=\"paused\">পজ হয়েছে</string>\n    <string name=\"auto\">অটো</string>\n    <string name=\"grid\">গ্রিড</string>\n    <string name=\"caption_setting_title\">ক্যাপশন</string>\n    <string name=\"resize_zoom\">জুম</string>\n    <string name=\"resize_fill\">ফিল</string>\n    <string name=\"resize_fit\">ফিট</string>\n    <string name=\"caption_none\">কোন ক্যাপশন নেই</string>\n    <string name=\"playlist_creation_success\">প্লে লিস্ট তৈরি হয়েছে</string>\n    <string name=\"delete_playlist_prompt\">প্লে লিস্ট ডিলিট করতে চান\\?</string>\n    <string name=\"unmute\">আন মিউট</string>\n    <string name=\"mute\">মিউট</string>\n    <string name=\"add_to_playlist\">প্লে লিস্ট এ যুক্ত করুন</string>\n    <string name=\"always_ask_open_action\">সবসময় জিজ্ঞেস করুন</string>\n    <string name=\"video_player\">ভিডিও প্লেয়ার</string>\n    <string name=\"drawer_close\">ড্রয়ার বন্ধ করুন</string>\n    <string name=\"drawer_open\">ড্রয়ার খুলন</string>\n    <string name=\"recently_added\">সাম্প্রতিক যুক্ত</string>\n    <string name=\"new_and_hot\">নতুন এবং হট</string>\n    <string name=\"top_50\">প্রথম ৫০</string>\n    <string name=\"error_unable_to_load_comments\">মন্তব্যগুলি লোড করা যায় নি</string>\n    <string name=\"select_a_channel\">একটি চ্যানেল পছন্দ করুন</string>\n    <string name=\"channel_page_summary\">চ্যানেল এর পাতা</string>\n    <string name=\"blank_page_summary\">খালি পাতা</string>\n    <string name=\"app_license_title\">নিউপাইপ এর লাইসেন্স</string>\n    <string name=\"read_privacy_policy\">প্রাইভেসি পলিসি পড়ুন</string>\n    <string name=\"privacy_policy_title\">নিউপাইপ এর প্রাইভেসি পলিসি</string>\n    <string name=\"view_on_github\">গিটহাব এ দেখুন</string>\n    <string name=\"tab_licenses\">লাইসেন্স</string>\n    <string name=\"settings_category_downloads_title\">ডাউনলোড</string>\n    <string name=\"one_item_deleted\">একটি আইটেম ডিলিট হয়েছে।</string>\n    <string name=\"dismiss\">ডিসমিস</string>\n    <string name=\"no_videos\">কোন ভিডিও নেই</string>\n    <string name=\"search_no_results\">কোন রেজাল্ট নেই</string>\n    <string name=\"invalid_directory\">কোন ফোল্ডার নেই</string>\n    <string name=\"download_to_sdcard_error_title\">বাহ্যিক স্টোরেজ নেই</string>\n    <string name=\"search_history_deleted\">সার্চ ইতিহাস মোছা হয়েছে</string>\n    <string name=\"name\">নাম</string>\n    <string name=\"rename_playlist\">নাম পরিবর্তন</string>\n    <string name=\"action_history\">ইতিহাস</string>\n    <string name=\"read_full_license\">লাইসেন্স পড়ুন</string>\n    <string name=\"donation_title\">দান করুন</string>\n    <string name=\"create\">তৈরি করুন</string>\n    <string name=\"retry\">পুনরায় চেষ্টা করুন</string>\n    <string name=\"watch_history_deleted\">দেখার ইতিহাস মুছে গেছে</string>\n    <string name=\"delete_view_history_alert\">সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন\\?</string>\n    <string name=\"clear_views_history_title\">দেখার ইতিহাস মুছে ফেলুন</string>\n    <string name=\"export_data_title\">ডাটা বেস এক্সপোর্ট করুন</string>\n    <string name=\"app_update_notification_channel_name\">অ্যাপ আপডেট এর সূচনা</string>\n    <string name=\"notification_channel_name\">নিউ পাইপ এর সূচনা</string>\n    <string name=\"playlists\">প্লেলিস্ট গুলি</string>\n    <string name=\"peertube_instance_add_title\">ইন্সটান্স যোগ করুন</string>\n    <string name=\"file\">ফাইল</string>\n    <string name=\"play_all\">সব চালু করুন</string>\n    <string name=\"file_deleted\">ফাইল ডিলিট হয়েছে</string>\n    <string name=\"albums\">অ্যালবাম গুলি</string>\n    <string name=\"videos_string\">ভিডিও গুলি</string>\n    <string name=\"channels\">চ্যানেলগুলি</string>\n    <string name=\"settings_category_updates_title\">আপডেট</string>\n    <string name=\"resume_on_audio_focus_gain_title\">পুনরায় চালু করুন</string>\n    <string name=\"settings_category_clear_data_title\">ডাটা মুছে ফেলুন</string>\n    <string name=\"enable_playback_resume_title\">পুনরায় প্লে ব্যাক চালু করুন</string>\n    <string name=\"tab_choose\">ট্যাব পছন্দ করুন</string>\n    <string name=\"restore_defaults_confirmation\">আপনি কি ডিফল্ট এ ফিরতে চান\\?</string>\n    <string name=\"error_occurred_detail\">একটা এরর হয়েছেঃ %1$s</string>\n    <string name=\"missing_file\">ফাইল সরে গেছে না হয় মুছে ফেলা হয়েছে</string>\n    <string name=\"audio_streams_empty\">কোন অডিও স্ট্রিম পাওয়া যায় নি</string>\n    <string name=\"player_recoverable_failure\">প্লেয়ার এর এরর থেকে বেরিয়ে আসুন</string>\n    <string name=\"player_stream_failure\">স্ট্রিম টি চালানো গেল না</string>\n    <string name=\"clear_search_history_summary\">সার্চের ইতিহাস মোছা হয়</string>\n    <string name=\"watch_history_states_deleted\">প্লে ব্যাক এর অবস্থান মোছা হয়েছে</string>\n    <string name=\"delete_playback_states_alert\">সমস্ত প্লে লিস্ট এর অবস্থান মুছবেন\\?</string>\n    <string name=\"clear_playback_states_summary\">সমস্ত প্লে লিস্ট এর অবস্থান মুছে ফেলুন</string>\n    <string name=\"clear_playback_states_title\">প্লে লিস্ট এর অবস্থান মুছে ফেলুন</string>\n    <string name=\"switch_to_main\">মেন এ ফিরে যান</string>\n    <string name=\"app_update_notification_channel_description\">নিউ পাইপ এর নতুন ভার্সন এর সূচনা</string>\n    <string name=\"undo\">ফিরে যান</string>\n    <string name=\"artists\">শিল্পীরা</string>\n    <string name=\"events\">ইভেন্টগুলি</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTube নিষিদ্ধ মোড চালু করুন</string>\n    <string name=\"peertube_instance_add_https_only\">শুধুমাত্র HTTPS URL গুলি সাপোর্ট করে</string>\n    <string name=\"close\">বন্ধ করুন</string>\n    <string name=\"limit_data_usage_none_description\">কোন সীমা নেই</string>\n    <string name=\"unbookmark_playlist\">বুকমার্ক মুছুন</string>\n    <string name=\"create_playlist\">নতুন প্লে লিস্ট</string>\n    <string name=\"play_queue_audio_settings\">অডিও সেটিং</string>\n    <string name=\"play_queue_stream_detail\">বিবরণ</string>\n    <string name=\"local\">স্থানীয়</string>\n    <string name=\"title_most_played\">সবথেকে বেশি চালানো</string>\n    <string name=\"title_last_played\">শেষ চালানো</string>\n    <string name=\"give_back\">ফিরিয়ে দিন</string>\n    <string name=\"contribution_title\">যোগদান</string>\n    <string name=\"title_activity_about\">নিউ পাইপ এর সম্বন্ধে</string>\n    <string name=\"charset_letters_and_digits\">শব্দ ও নম্বর</string>\n    <string name=\"done\">হয়েছে</string>\n    <string name=\"no_comments\">কোন মন্তব্য নেই</string>\n    <string name=\"no_subscribers\">কোন সাবস্ক্রাইবার নেই</string>\n    <string name=\"no_streams_available_download\">ডাউন লোড এর জন্য কোন স্ট্রিম নেই</string>\n    <string name=\"file_name_empty_error\">ফাইল এর নাম খালি থাকতে পারে না</string>\n    <string name=\"video_streams_empty\">কোন ভিডিও</string>\n    <string name=\"delete_search_history_alert\">সমগ্র সার্চ ইতিহাস মুছবেন\\?</string>\n    <string name=\"clear_search_history_title\">সার্চ ইতিহাস মুছুন</string>\n    <string name=\"import_data_title\">ডাটাবেস আনুন</string>\n    <string name=\"switch_to_popup\">পপ-আপ এ খুলুন</string>\n    <string name=\"switch_to_background\">পেছনে নিয়ে যান</string>\n    <string name=\"best_resolution\">সেরা রেজুলিউসন</string>\n    <string name=\"songs\">গান গুলি</string>\n    <string name=\"peertube_instance_add_help\">ইন্সটান্স এর ইউ আর এল</string>\n    <string name=\"peertube_instance_url_summary\">আপনার পছন্দের পিয়ার টিউব ইন্সটান্স</string>\n    <string name=\"peertube_instance_url_title\">পিয়ার টিউব এর ইন্সটান্স সমূহ</string>\n    <string name=\"autoplay_title\">স্বয়ংক্রিয়</string>\n    <string name=\"enable_watch_history_summary\">দেখা ভিডিও গুলির হিসেব</string>\n    <string name=\"enable_playback_state_lists_title\">তালিকা তে পজিশন</string>\n    <string name=\"enable_playback_resume_summary\">শেষ প্লে ব্যাক পজিশন এ যান</string>\n    <string name=\"enable_search_history_summary\">সার্চ গুলি স্থানীয় ভাবে জমা করুন</string>\n    <string name=\"show_search_suggestions_summary\">সার্চ এর সময় সাজেশন পছন্দ করুন</string>\n    <string name=\"show_search_suggestions_title\">সার্চ সাজেশন</string>\n    <string name=\"feed_notification_loading\">ফিড লোড হচ্ছে…</string>\n    <string name=\"show_error\">এরর দেখান</string>\n    <string name=\"select_a_playlist\">একটি প্লে লিস্ট পছন্দ করুন</string>\n    <string name=\"tab_about\">সম্পর্কিত</string>\n    <string name=\"title_licenses\">থার্ড-পার্টি লাইসেন্স সমূহ</string>\n    <string name=\"error_report_open_issue_button_text\">গিটহাব এ রিপোর্ট করুন</string>\n    <string name=\"restore_defaults\">ডিফল্ট এ ফিরে যান</string>\n    <string name=\"search_showing_result_for\">রেজাল্ট দেখান হচ্ছেঃ %s</string>\n    <string name=\"clear_queue_confirmation_title\">কিউ মোছার আগে নিশ্চিত করুন</string>\n    <string name=\"notification_action_repeat\">পুনরায়</string>\n    <string name=\"website_encouragement\">নিউ পাইপ ওয়েব সাইট এ যান বিস্তারিত বিবরণ ও খবর এর জন্য</string>\n    <string name=\"more_than_100_videos\">১০০+ ভিডিও</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s শ্রোতা</item>\n        <item quantity=\"other\">%s শ্রোতা গন</item>\n    </plurals>\n    <string name=\"description_tab_description\">বিবরণ</string>\n    <string name=\"comments_tab_description\">মন্তব্য</string>\n    <string name=\"show_meta_info_title\">মেটা ইনফো দেখান</string>\n    <string name=\"show_description_title\">বিবরণ দেখান</string>\n    <string name=\"night_theme_title\">রাত্রি থিম</string>\n    <string name=\"notification_action_2_title\">তৃতীয় অ্যাকশান বোতাম</string>\n    <string name=\"notification_action_3_title\">চতুর্থ অ্যাকশান বোতাম</string>\n    <string name=\"clear_queue_confirmation_description\">সক্রিয় প্লেয়ার ক্রম পরিবর্তিত হয়ে যাবে</string>\n    <string name=\"local_search_suggestions\">স্থানীয় সার্চ সাজেশন</string>\n    <string name=\"notification_action_4_title\">পঞ্চম অ্যাকশান বোতাম</string>\n    <string name=\"notification_action_0_title\">প্রথম অ্যাকশান বোতাম</string>\n    <string name=\"notification_action_1_title\">দ্বিতীয় অ্যাকশান বোতাম</string>\n    <string name=\"streams_notification_channel_name\">নতুন স্ট্রিম</string>\n    <string name=\"wifi_only\">শুধুমাত্র ওয়াইফাইএ</string>\n    <string name=\"metadata_language\">ভাষা</string>\n    <string name=\"unsupported_url_dialog_message\">URL বোঝা যায় নি, অন্য অ্যাপ এ খুলুন\\?</string>\n    <string name=\"error_file_creation\">ফাইল তৈরি করা যাচ্ছে না</string>\n    <string name=\"show_description_summary\">ভিডিও বিবরণ ও বাড়তি তথ্য বন্ধ করুন</string>\n    <string name=\"start_main_player_fullscreen_title\">মূল প্লেয়ার ফুল স্ক্রীন এ শুরু করুন</string>\n    <string name=\"peertube_instance_add_fail\">\" \"</string>\n    <string name=\"error_connect_host\">সার্ভার এর সাথে যোগাযোগ করা যাচ্ছে না</string>\n    <string name=\"notification_action_buffering\">বাফার হচ্ছে</string>\n    <string name=\"download_has_started\">ডাউনলোড শুরু হয়েছে</string>\n    <string name=\"open_with\">এটি দিয়ে খুলুন</string>\n    <string name=\"mark_as_watched\">দেখা হিসাবে চিহ্নিত করুন</string>\n    <string name=\"notification_scale_to_square_image_title\">থাম্বনেল 1:1 আকৃতির অনুপাতের করুন</string>\n    <string name=\"notification_scale_to_square_image_summary\">বিজ্ঞপ্তিতে প্রদর্শিত ভিডিও থাম্বনেল 16:9 থেকে 1:1 অনুপাতের করুন (বিকৃতি দেখা যেতে পারে)</string>\n    <string name=\"notification_action_shuffle\">অদলবদল</string>\n    <string name=\"notification_action_nothing\">কিছু না</string>\n    <string name=\"yes\">হ্যাঁ</string>\n    <string name=\"no\">না</string>\n    <string name=\"search_with_service_name\">সার্চ %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">খুঁজুন %1$s (%2$s)</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-bqi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "app/src/main/res/values-br/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"cancel\">Nullañ</string>\n    <string name=\"ok\">Mat eo</string>\n    <string name=\"no\">Ket</string>\n    <string name=\"open_in_browser\">Digeriñ e-barzh ar merdeer</string>\n    <string name=\"open_with\">Digeriñ gant</string>\n    <string name=\"share\">Rannañ</string>\n    <string name=\"download\">Pellgargañ</string>\n    <string name=\"did_you_mean\">Klask a raec\\'h \\\"%1$s\\\"?</string>\n    <string name=\"share_dialog_title\">Rannañ gant</string>\n    <string name=\"use_external_audio_player_title\">Arverañ ul lenner aodio diavaez</string>\n    <string name=\"subscribe_button_title\">Koumanantiñ</string>\n    <string name=\"unsubscribe\">Digoumanantiñ</string>\n    <string name=\"subscription_change_failed\">N\\'haller ket kemmañ ar c\\'houmanant</string>\n    <string name=\"subscription_update_failed\">N\\'haller ket hizivaat ar c\\'houmanant</string>\n    <string name=\"show_info\">Diskouez an titouroù</string>\n    <string name=\"tab_bookmarks\">Rolloù-lenn enrollet</string>\n    <string name=\"tab_bookmarks_short\">Rolloù-lenn</string>\n    <string name=\"tab_choose\">Dibab un ivinell</string>\n    <string name=\"controls_background_title\">Drekleur</string>\n    <string name=\"controls_popup_title\">Diflugell</string>\n    <string name=\"controls_add_to_playlist_title\">Ouzhpennañ da</string>\n    <string name=\"download_path_title\">Teuliad pellgargañ ar videoioù</string>\n    <string name=\"download_path_audio_summary\">Amañ e vez kadavet ar restroù aodio pellgarget</string>\n    <string name=\"download_path_summary\">Amañ e vez kadavet ar restroù video pellgarget</string>\n    <string name=\"notification_action_buffering\">O kargañ</string>\n    <string name=\"notification_action_nothing\">Netra</string>\n    <string name=\"default_audio_format_title\">Mentrezh aodio dre ziouer</string>\n    <string name=\"theme_title\">Dodenn</string>\n    <string name=\"night_theme_title\">Dodenn noz</string>\n    <string name=\"light_theme_title\">Sklaer</string>\n    <string name=\"dark_theme_title\">Teñval</string>\n    <string name=\"volume\">Tregern</string>\n    <string name=\"enable_search_history_title\">Roll istor enklask</string>\n    <string name=\"download_dialog_title\">Pellgargañ</string>\n    <string name=\"start_main_player_fullscreen_title\">Lañsañ al lenner pennañ e mod skramm a-bezh</string>\n    <string name=\"autoplay_title\">Lenn emgefreek</string>\n    <string name=\"default_content_country_title\">Bro an endalc\\'had dre ziouer</string>\n    <string name=\"peertube_instance_url_title\">Erioloù PeerTube</string>\n    <string name=\"none\">Tra ebet</string>\n    <string name=\"default_video_format_title\">Mentrezh video dre ziouer</string>\n    <string name=\"notification_action_shuffle\">Lenn mell-divell</string>\n    <string name=\"play_audio\">Aodio</string>\n    <string name=\"play_with_kodi_title\">Lenn gant Kodi</string>\n    <string name=\"brightness\">Lintr</string>\n    <string name=\"settings_category_clear_data_title\">Skarzhañ ar roadennoù</string>\n    <string name=\"search\">Klask</string>\n    <string name=\"use_external_video_player_title\">Arverañ ul lenner video diavaez</string>\n    <string name=\"download_path_audio_title\">Teuliad pellgargañ ar restroù aodio</string>\n    <string name=\"black_theme_title\">Du</string>\n    <string name=\"show_search_suggestions_title\">Kinnigoù enklask</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Kenderc\\'hel al lenn</string>\n    <string name=\"unsupported_url\">URL anskor</string>\n    <string name=\"content_language_title\">Yezh an endalc\\'had dre ziouer</string>\n    <string name=\"controls_download_desc\">Pellgargañ restr al lanv</string>\n    <string name=\"install\">Staliañ</string>\n    <string name=\"yes\">Ya</string>\n    <string name=\"tab_subscriptions\">Koumanantoù</string>\n    <string name=\"settings\">Arventennoù</string>\n    <string name=\"search_showing_result_for\">Setu an disoc\\'hoù evit: %s</string>\n    <string name=\"use_external_video_player_summary\">Lamet e vez an aodio gant diarunustedoù \\'zo</string>\n    <string name=\"channel_unsubscribed\">Digoumanantet oc\\'h bet d\\'ar chadenn</string>\n    <string name=\"enable_watch_history_title\">Sellet ouzh ar roll istor</string>\n    <string name=\"subscribed_button_title\">Koumanantet</string>\n    <string name=\"default_resolution_title\">Diarunusted dre ziouer</string>\n    <string name=\"peertube_instance_url_summary\">Diuzit hoc\\'h erioloù PeerTube gwell ganeoc\\'h</string>\n    <string name=\"peertube_instance_url_help\">Kavit an erioloù a blij deoc\\'h war %s</string>\n    <string name=\"peertube_instance_add_title\">Ouzhpennañ un eriol</string>\n    <string name=\"settings_category_player_title\">Lenner</string>\n    <string name=\"settings_category_video_audio_title\">Video hag aodio</string>\n    <string name=\"settings_category_history_title\">Roll istor ha krubuilh</string>\n    <string name=\"settings_category_appearance_title\">Neuz</string>\n    <string name=\"settings_category_debug_title\">Diveugañ</string>\n    <string name=\"settings_category_updates_title\">Hizivadurioù</string>\n    <string name=\"settings_category_player_notification_title\">Rebuzadur al lenner</string>\n    <string name=\"settings_category_backup_restore_title\">Assav ha gwarediñ</string>\n    <string name=\"duration_live\">War-eeun</string>\n    <string name=\"downloads_title\">Pellgargadurioù</string>\n    <string name=\"all\">Pep tra</string>\n    <string name=\"channels\">Chadennoù</string>\n    <string name=\"videos_string\">Videoioù</string>\n    <string name=\"tracks\">Loabroù</string>\n    <string name=\"users\">Arveriaded</string>\n    <string name=\"events\">Degouezhioù</string>\n    <string name=\"songs\">Tonioù</string>\n    <string name=\"albums\">Albomoù</string>\n    <string name=\"artists\">Arzourien</string>\n    <string name=\"disabled\">Diweredekaet</string>\n    <string name=\"clear\">Skarzhañ</string>\n    <string name=\"undo\">Dizober</string>\n    <string name=\"file_deleted\">Dilamet eo bet ar restr</string>\n    <string name=\"play_all\">Lenn pep tra</string>\n    <string name=\"always\">Atav</string>\n    <string name=\"file\">Restr</string>\n    <string name=\"notifications\">Rebuzadurioù</string>\n    <string name=\"notification_channel_name\">Rebuzadur NewPipe</string>\n    <string name=\"notification_channel_description\">Rebuzadurioù evit al lenner NewPipe</string>\n    <string name=\"app_update_notification_channel_description\">Rebuzadurioù evit handelvoù nevez NewPipe</string>\n    <string name=\"streams_notification_channel_name\">Lanvioù nevez</string>\n    <string name=\"just_once\">Ur wech nemetken</string>\n    <string name=\"best_resolution\">Diarunusted wellañ</string>\n    <string name=\"general_error\">Fazi</string>\n    <string name=\"app_update_notification_channel_name\">Rebuzadur hizivadur an arload</string>\n    <string name=\"content\">Endalc\\'had</string>\n    <string name=\"settings_category_player_behavior_title\">Emzalc\\'h</string>\n    <string name=\"playlists\">Rolloù-lenn</string>\n    <string name=\"downloads\">Pellgargadurioù</string>\n    <string name=\"error_snackbar_action\">Sevel un danevell</string>\n    <string name=\"error_details_headline\">Munudoù:</string>\n    <string name=\"audio\">Aodio</string>\n    <string name=\"retry\">Klask en-dro</string>\n    <string name=\"description_tab_description\">Deskrivadur</string>\n    <string name=\"search_no_results\">Disoc\\'h ebet</string>\n    <string name=\"empty_list_subtitle\">Endalc’had ebet</string>\n    <string name=\"what_happened_headline\">Petra zo c\\'hoarvezet:</string>\n    <string name=\"detail_thumbnail_view_description\">Lenn ar video, pad:</string>\n    <string name=\"what_device_headline\">Titouroù:</string>\n    <string name=\"video\">Video</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-bs/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"tab_subscriptions\">Pratnje</string>\n    <string name=\"main_bg_subtitle\">Dodirnite lupu da bi ste započeli.</string>\n    <string name=\"install\">Instališi</string>\n    <string name=\"cancel\">Otkaži</string>\n    <string name=\"upload_date_text\">Objavljeno na %1$s</string>\n    <string name=\"open_in_popup_mode\">Otvorite u skočnom prozoru</string>\n    <string name=\"use_external_video_player_title\">Koristite vanjski video pokretač</string>\n    <string name=\"ok\">U redu</string>\n    <string name=\"open_in_browser\">Otvorite u pretraživaču</string>\n    <string name=\"mark_as_watched\">Označite kao pregledano</string>\n    <string name=\"open_with\">Otvorite sa</string>\n    <string name=\"share\">Podijeli</string>\n    <string name=\"download\">Preuzimanje</string>\n    <string name=\"controls_background_title\">Pozadina</string>\n    <string name=\"search\">Pretraži</string>\n    <string name=\"settings\">Podešavanja</string>\n    <string name=\"did_you_mean\">Jeste li mislili \\\"%1$s\\\"\\?</string>\n    <string name=\"show_info\">Prikažite informaciju</string>\n    <string name=\"share_dialog_title\">Podijelite pomoću</string>\n    <string name=\"search_showing_result_for\">Pokazuju se rezultati za: %s</string>\n    <string name=\"unsubscribe\">Otkažite pratnju</string>\n    <string name=\"use_external_video_player_summary\">Uklanja zvuk u nekim režimima</string>\n    <string name=\"use_external_audio_player_title\">Koristite eksterni audio pokretač</string>\n    <string name=\"subscribe_button_title\">Pratite</string>\n    <string name=\"subscribed_button_title\">U pratnji</string>\n    <string name=\"channel_unsubscribed\">Otkazana pratnja kanala</string>\n    <string name=\"subscription_change_failed\">Nije moguće promijeniti pratnju</string>\n    <string name=\"subscription_update_failed\">Nije moguće ažurirati pratnju</string>\n    <string name=\"kore_not_found\">Instalirati nedostajuću Kore aplikaciju?</string>\n    <string name=\"tab_bookmarks\">Obilježeni Popisi</string>\n    <string name=\"controls_popup_title\">Iskačni prozor</string>\n    <string name=\"tab_choose\">Izaberite Podprozor</string>\n    <string name=\"controls_add_to_playlist_title\">Dodajte u</string>\n    <string name=\"show_higher_resolutions_summary\">Samo neki uređaji mogu 2K/4K video zapise reproducirati</string>\n    <string name=\"show_higher_resolutions_title\">Prikaži veće režime</string>\n    <string name=\"show_play_with_kodi_title\">Prikažite postavku \\\"Pokreni sa KODI-jem\\\"</string>\n    <string name=\"download_path_audio_title\">Fascikla za preuzimanje audia</string>\n    <string name=\"download_path_audio_summary\">Skinuti audio zapisi su ovdje spremljeni</string>\n    <string name=\"download_path_audio_dialog_title\">Odaberite fasciklu gdje se audio datoteke skidaju</string>\n    <string name=\"default_resolution_title\">Zadani režim</string>\n    <string name=\"default_popup_resolution_title\">Zadani režim za iskačući prozor</string>\n    <string name=\"crash_the_player\">Prekinite pokretač</string>\n    <string name=\"show_play_with_kodi_summary\">Prikažite postavku da biste video preko KODI medijskog centra video pokrenuli</string>\n    <string name=\"notification_scale_to_square_image_title\">Izrežite sličicu na omjer slike 1:1</string>\n    <string name=\"notification_action_0_title\">Prvo radno dugme</string>\n    <string name=\"notification_scale_to_square_image_summary\">Izrežite sličicu videa prikazanu u obavještenju sa omjera stranica 16:9 na 1:1</string>\n    <string name=\"notification_action_1_title\">Drugo radno dugme</string>\n    <string name=\"notification_action_2_title\">Treće radno dugme</string>\n    <string name=\"notification_action_3_title\">Četvrto radno dugme</string>\n    <string name=\"notification_action_4_title\">Peto radno dugme</string>\n    <string name=\"notification_actions_at_most_three\">Možete najviše tri radnje odabrati za prikaz u kompaktnom obavještaju!</string>\n    <string name=\"notification_action_repeat\">Ponovi</string>\n    <string name=\"notification_action_shuffle\">Pomiješajte</string>\n    <string name=\"notification_actions_summary\">Uredite svaku radnju obavještenja ispod dodirom na nju. Odaberite do tri od njih koje će biti prikazane u kompaktnom obavještenju pomoću potvrdnih okvira s desne strane.</string>\n    <string name=\"notification_action_nothing\">Ništa</string>\n    <string name=\"notification_colorize_title\">Obojite obavještenje</string>\n    <string name=\"notification_action_buffering\">Učitavanje</string>\n    <string name=\"default_audio_format_title\">Zadani zvučni format</string>\n    <string name=\"notification_colorize_summary\">Dajte Android-u da prilagodi boju obavijesti prema glavnoj boji na sličici (čuvajte u umu da ovo nije dostupno na svim uređajima)</string>\n    <string name=\"play_audio\">Zvuk</string>\n    <string name=\"default_video_format_title\">Zadani video format</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"night_theme_title\">Noćna tema</string>\n    <string name=\"light_theme_title\">Svijetla</string>\n    <string name=\"dark_theme_title\">Tamna</string>\n    <string name=\"popup_remember_size_pos_title\">Zapamtite podešavanja za iskočne prozore</string>\n    <string name=\"black_theme_title\">Crna</string>\n    <string name=\"popup_remember_size_pos_summary\">Zapamtite posljednju veličinu i položaj iskočnog prozora</string>\n    <string name=\"use_inexact_seek_title\">Koristite brzo neprecizno premotavanje</string>\n    <string name=\"use_inexact_seek_summary\">Neprecizno premotavanje dozvoljava pokretaču brže premotavanje s gorom preciznošću. Premotavanje za 5, 15 ili 25 sekundi ne radi s ovim</string>\n    <string name=\"clear_queue_confirmation_summary\">Prebacivanje sa jednog pokretača na drugi bi van moglo zamijeniti pokretni red</string>\n    <string name=\"show_comments_summary\">Isključite da sakrijete komentare</string>\n    <string name=\"clear_queue_confirmation_title\">Pitajte za potvrdu prije isčišćavanja reda</string>\n    <string name=\"show_comments_title\">Prikažite komentare</string>\n    <string name=\"show_next_and_similar_title\">Pokažite \\'Sljedeće\\' i \\'Slične\\' video zapise</string>\n    <string name=\"show_description_title\">Prikažite opis</string>\n    <string name=\"show_meta_info_title\">Prikažite meta-informaciju</string>\n    <string name=\"show_description_summary\">Isključite da biste sakrili opis videa i dodatne informacije</string>\n    <string name=\"metadata_cache_wipe_title\">Obrišite keširane metapodatke</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Keširani metapodaci su obrisani</string>\n    <string name=\"show_meta_info_summary\">Isključite da bi ste sakrili meta-informacijske kutije sa dodatnim informacijama o praviocu prijenosa, sadržaju prijenosa ili zahtjevu za pretraživanje</string>\n    <string name=\"controls_download_desc\">Preuzmite datoteku za prijenos</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Keširane slike su izbrisane</string>\n    <string name=\"no_player_found\">Nije pronađen nijedan medijski prijenosnik. Hoćete VLC instalisati\\?</string>\n    <string name=\"no_player_found_toast\">Nijedan medijski prijenosnik nije nađen na vašem uređaju (možete VLC instalisati da bi ste ga pokrenili).</string>\n    <string name=\"metadata_cache_wipe_summary\">Uklonite sve keširane podatke web stranica</string>\n    <string name=\"auto_queue_title\">Automatski sljedeći prijenos u red stavite</string>\n    <string name=\"auto_queue_summary\">Nastavite završni (ne-ponavljajući) reprodukcijski red privlakom srodnog prijenosa</string>\n    <string name=\"auto_queue_toggle\">Automatsko redanje</string>\n    <string name=\"show_search_suggestions_title\">Prijedlozi za pretragu</string>\n    <string name=\"show_search_suggestions_summary\">Odaberite prijedloge koje želite prikazati prilikom pretrage</string>\n    <string name=\"local_search_suggestions\">Lokalni prijedlozi za pretraživanje</string>\n    <string name=\"remote_search_suggestions\">Razdaljeni prijedlozi za pretraživanje</string>\n    <string name=\"enable_search_history_title\">Povijest pretraga</string>\n    <string name=\"enable_watch_history_title\">Historija pregleda</string>\n    <string name=\"enable_search_history_summary\">Lokalno pohranite upite pretraživanja</string>\n    <string name=\"enable_playback_resume_title\">Nastavi reproduciranje</string>\n    <string name=\"enable_playback_state_lists_title\">Pozicije u listama</string>\n    <string name=\"enable_playback_state_lists_summary\">Prikažite indikatore pozicije reprodukcije u listama</string>\n    <string name=\"enable_playback_resume_summary\">Vratite posljednju poziciju reprodukcije</string>\n    <string name=\"settings_category_clear_data_title\">Raščistite podatke</string>\n    <string name=\"enable_watch_history_summary\">Vodite računa o pregledanim video zapisima</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Nastavite sa reprodukcijom</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Nastavite reprodukciju nakon prekida (npr. telefonskih poziva)</string>\n    <string name=\"download_dialog_title\">Preuzimanje</string>\n    <string name=\"autoplay_title\">Automatsko reproduciranje</string>\n    <string name=\"start_main_player_fullscreen_title\">Pokrenite glavni pokretač preko cijelog ekrana</string>\n    <string name=\"start_main_player_fullscreen_summary\">Nemojte pokretati video zapise u mini-pokretaču, već direktno pređite na režim cijelog ekrana, ako je automatska rotacija zaključana. I dalje možete pristupiti mini-pokretaču pri izlasku iz cijelog ekrana</string>\n    <string name=\"download_path_title\">Fascikla za preuzimanje videa</string>\n    <string name=\"download_path_summary\">Skinuti video zapisi su ovdje spremljeni</string>\n    <string name=\"download_path_dialog_title\">Odaberite fasciklu gdje se video datoteke skidaju</string>\n    <string name=\"play_with_kodi_title\">Pokrenite s KODI-jem</string>\n    <string name=\"seek_duration_title\">Vrijeme premotavanja naprijed/nazad</string>\n    <string name=\"clear_queue_confirmation_description\">Aktivni pokretni red će biti zamijenjen</string>\n    <string name=\"yes\">Da</string>\n    <string name=\"no\">Ne</string>\n    <string name=\"search_with_service_name\">Pretraži %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Pretraži %1$s (%2$s)</string>\n    <string name=\"tab_bookmarks_short\">Plejliste</string>\n    <string name=\"notification_actions_summary_android13\">Uredite svaku radnju obavještenja ispod dodirom na nju. Prve tri radnje (reprodukcija/pauza, prethodno i sljedeće) postavlja sistem i ne mogu se prilagođavati.</string>\n    <string name=\"progressive_load_interval_title\">Veličina intervala učitavanja reprodukcije</string>\n    <string name=\"progressive_load_interval_summary\">Promijenite veličinu intervala učitavanja progresivnog sadržaja (trenutno %s). Niža vrijednost može ubrzati njihovo početno učitavanje</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Zanemari događaje hardverskih medijskih tipki</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Korisno, na primjer, ako koristite slušalice s pokvarenim fizičkim tipkama</string>\n    <string name=\"prefer_original_audio_title\">Preferiraj originalni audio</string>\n    <string name=\"prefer_original_audio_summary\">Odaberite originalni audio zapis bez obzira na jezik</string>\n    <string name=\"prefer_descriptive_audio_title\">Preferiraj opisni audio</string>\n    <string name=\"prefer_descriptive_audio_summary\">Odaberite audio zapis s opisima za osobe s oštećenim vidom ako su dostupni</string>\n    <string name=\"left_gesture_control_summary\">Odaberite gestu za lijevu polovinu ekrana igrača</string>\n    <string name=\"left_gesture_control_title\">Radnja lijevog pokreta</string>\n    <string name=\"right_gesture_control_summary\">Odaberite gestu za desnu polovinu ekrana igrača</string>\n    <string name=\"right_gesture_control_title\">Radnja desnog gesta</string>\n    <string name=\"brightness\">Svjetlina</string>\n    <string name=\"volume\">Volumen</string>\n    <string name=\"none\">Nema</string>\n    <string name=\"show_hold_to_append_title\">Prikaži savjet \\\"Drži za dodavanje u red\\\"</string>\n    <string name=\"show_hold_to_append_summary\">Prikaži savjet prilikom pritiska na pozadinu ili iskačuće dugme u videu \\\"Detalji:\\\"</string>\n    <string name=\"unsupported_url\">Nepodržani URL</string>\n    <string name=\"unsupported_url_dialog_message\">URL nije prepoznat. Otvoriti s drugom aplikacijom?</string>\n    <string name=\"default_content_country_title\">Zadana zemlja sadržaja</string>\n    <string name=\"content_language_title\">Zadani jezik sadržaja</string>\n    <string name=\"peertube_instance_url_title\">PeerTube instance</string>\n    <string name=\"peertube_instance_url_summary\">Odaberite svoje omiljene PeerTube instance</string>\n    <string name=\"peertube_instance_url_help\">Pronađite instance koje vam se sviđaju na %s</string>\n    <string name=\"peertube_instance_add_title\">Dodaj instancu</string>\n    <string name=\"peertube_instance_add_help\">Unesite URL instance</string>\n    <string name=\"peertube_instance_add_fail\">Nije moguće validirati instancu</string>\n    <string name=\"peertube_instance_add_https_only\">Podržani su samo HTTPS URL-ovi</string>\n    <string name=\"peertube_instance_add_exists\">Instanca već postoji</string>\n    <string name=\"settings_category_player_title\">Pokretač</string>\n    <string name=\"settings_category_player_behavior_title\">Ponašanje</string>\n    <string name=\"settings_category_video_audio_title\">Video i audio</string>\n    <string name=\"settings_category_history_title\">Historija i keš memorija</string>\n    <string name=\"settings_category_appearance_title\">Izgled</string>\n    <string name=\"settings_category_debug_title\">Debug</string>\n    <string name=\"settings_category_updates_title\">Nadogradnje</string>\n    <string name=\"settings_category_player_notification_title\">Obavještenje za igrača</string>\n    <string name=\"settings_category_player_notification_summary\">Konfigurišite obavještenja o trenutno reprodukovanom toku</string>\n    <string name=\"settings_category_backup_restore_title\">Sigurnosna kopija i vraćanje</string>\n    <string name=\"background_player_playing_toast\">Reprodukcija u pozadini</string>\n    <string name=\"popup_playing_toast\">Reprodukcija u skočnom modu</string>\n    <string name=\"content\">Sadržaj</string>\n    <string name=\"show_age_restricted_content_title\">Prikaži sadržaj s ograničenjem za uzrast</string>\n    <string name=\"show_age_restricted_content_summary\">Prikaži sadržaj koji je možda neprikladan za djecu jer ima starosno ograničenje (npr. 18+)</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Uključite \\\"Ograničeni način rada\\\" na YouTubeu</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube nudi \\\"Ograničeni način rada\\\" koji skriva potencijalno sadržaj za odrasle</string>\n    <string name=\"restricted_video\">Ovaj video ima dobno ograničenje.\\n\\nUključite \\\"%1$s\\\" u postavkama ako ga želite pogledati.</string>\n    <string name=\"restricted_video_no_stream\">Ovaj video ima dobno ograničenje. \\nZbog novih YouTube pravila o videozapisima s dobnim ograničenjem, NewPipe ne može pristupiti nijednom od svojih video tokova i stoga ga ne može reproducirati.</string>\n    <string name=\"duration_live\">Uživo</string>\n    <string name=\"downloads\">Preuzimanja</string>\n    <string name=\"downloads_title\">Preuzimanja</string>\n    <string name=\"loading_metadata_title\">Učitavanje metapodataka…</string>\n    <string name=\"error_report_title\">Izvještaj o grešci</string>\n    <string name=\"all\">Sve</string>\n    <string name=\"channels\">Kanali</string>\n    <string name=\"playlists\">Plejliste</string>\n    <string name=\"videos_string\">Videozapisi</string>\n    <string name=\"tracks\">Snimke</string>\n    <string name=\"users\">Korisnici</string>\n    <string name=\"events\">Događanja</string>\n    <string name=\"songs\">Pjesme</string>\n    <string name=\"albums\">Albuma</string>\n    <string name=\"artists\">Umjetnici</string>\n    <string name=\"disabled\">Onemogućeno</string>\n    <string name=\"clear\">Rasčisti</string>\n    <string name=\"best_resolution\">Najbolja rezolucija</string>\n    <string name=\"undo\">Poništi</string>\n    <string name=\"file_deleted\">Datoteka je izbrisana</string>\n    <string name=\"play_all\">Reproduciraj sve</string>\n    <string name=\"always\">Uvijek</string>\n    <string name=\"just_once\">Samo jednom</string>\n    <string name=\"file\">Datoteka</string>\n    <string name=\"notifications\">Obavijesti</string>\n    <string name=\"notification_channel_name\">Obavještenje o novoj cijevi</string>\n    <string name=\"notification_channel_description\">Obavještenja za NewPipeovog igrača</string>\n    <string name=\"app_update_notification_channel_name\">Obavještenje o ažuriranju aplikacije</string>\n    <string name=\"app_update_notification_channel_description\">Obavještenja za nove verzije NewPipe-a</string>\n    <string name=\"hash_channel_name\">Obavještenje o hešu videa</string>\n    <string name=\"hash_channel_description\">Obavještenja o napretku heširanja videa</string>\n    <string name=\"streams_notification_channel_name\">Novi tokovi</string>\n    <string name=\"streams_notification_channel_description\">Obavještenja o novim tokovima za pretplatnike</string>\n    <string name=\"error_report_channel_name\">Obavještenje o grešci</string>\n    <string name=\"error_report_channel_description\">Obavještenja za prijavu grešaka</string>\n    <string name=\"unknown_content\">[Nepoznato]</string>\n    <string name=\"switch_to_background\">Prebaci na pozadinu</string>\n    <string name=\"switch_to_popup\">Prebaci na skočni prozor</string>\n    <string name=\"switch_to_main\">Prebaci na glavni</string>\n    <string name=\"import_data_title\">Uvoz baze podataka</string>\n    <string name=\"export_data_title\">Izvoz baze podataka</string>\n    <string name=\"clear_cookie_title\">Obriši reCAPTCHA kolačiće</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA kolačići su obrisani</string>\n    <string name=\"import_data_summary\">Zaobilazi vašu trenutnu historiju, pretplate, liste pjesama i (opcionalno) postavke</string>\n    <string name=\"export_data_summary\">Izvoz historije, pretplata, plejlista i postavki</string>\n    <string name=\"clear_cookie_summary\">Obrišite kolačiće koje NewPipe pohranjuje kada riješite reCAPTCHA</string>\n    <string name=\"clear_views_history_title\">Obriši historiju gledanja</string>\n    <string name=\"clear_views_history_summary\">Briše historiju reprodukovanih tokova i pozicije reprodukcije</string>\n    <string name=\"delete_view_history_alert\">Izbrisati cijelu historiju gledanja?</string>\n    <string name=\"watch_history_deleted\">Historija gledanja je izbrisana</string>\n    <string name=\"clear_playback_states_title\">Brisanje pozicija reprodukcije</string>\n    <string name=\"clear_playback_states_summary\">Briše sve pozicije reprodukcije</string>\n    <string name=\"delete_playback_states_alert\">Izbrisati sve pozicije reprodukcije?</string>\n    <string name=\"watch_history_states_deleted\">Pozicije reprodukcije su izbrisane</string>\n    <string name=\"clear_search_history_title\">Obriši historiju pretraživanja</string>\n    <string name=\"clear_search_history_summary\">Briše historiju ključnih riječi pretrage</string>\n    <string name=\"delete_search_history_alert\">Izbrisati cijelu historiju pretraživanja?</string>\n    <string name=\"search_history_deleted\">Historija pretrage je izbrisana</string>\n    <string name=\"fast_mode\">Brzi način rada</string>\n    <string name=\"main_tabs_position_summary\">Pomakni glavni birač kartica na dno</string>\n    <string name=\"main_tabs_position_title\">Položaj glavnih kartica</string>\n    <string name=\"general_error\">Greška</string>\n    <string name=\"download_to_sdcard_error_title\">Vanjska pohrana nije dostupna</string>\n    <string name=\"download_to_sdcard_error_message\">Preuzimanje na eksternu SD karticu nije moguće. Poništiti lokaciju mape za preuzimanje?</string>\n    <string name=\"network_error\">Greška mreže</string>\n    <string name=\"could_not_load_thumbnails\">Nije moguće učitati sve sličice</string>\n    <string name=\"parsing_error\">Nije moguće analizirati web stranicu</string>\n    <string name=\"content_not_available\">Sadržaj nije dostupan</string>\n    <string name=\"could_not_setup_download_menu\">Nije moguće postaviti meni za preuzimanje</string>\n    <string name=\"app_ui_crash\">Aplikacija/korisnički interfejs se srušio/la</string>\n    <string name=\"player_stream_failure\">Nije moguće reproducirati ovaj tok</string>\n    <string name=\"player_unrecoverable_failure\">Došlo je do nepopravljive greške igrača</string>\n    <string name=\"player_recoverable_failure\">Oporavak od greške igrača</string>\n    <string name=\"external_player_unsupported_link_type\">Vanjski playeri ne podržavaju ove vrste linkova</string>\n    <string name=\"video_streams_empty\">Nisu pronađeni video tokovi</string>\n    <string name=\"audio_streams_empty\">Nisu pronađeni audio tokovi</string>\n    <string name=\"missing_file\">Datoteka je premještena ili izbrisana</string>\n    <string name=\"invalid_directory\">Fascikla sa popisima</string>\n    <string name=\"invalid_source\">Nema takve datoteke/izvora sadržaja</string>\n    <string name=\"invalid_file\">Datoteka ne postoji ili nedostaje dozvola za čitanje ili pisanje u nju</string>\n    <string name=\"file_name_empty_error\">Naziv datoteke ne može biti prazan</string>\n    <string name=\"error_occurred_detail\">Došlo je do greške: %1$s</string>\n    <string name=\"no_streams_available_download\">Nema dostupnih tokova za preuzimanje</string>\n    <string name=\"saved_tabs_invalid_json\">Nije moguće pročitati sačuvane kartice, pa se koriste zadane</string>\n    <string name=\"restore_defaults\">Vrati zadane postavke</string>\n    <string name=\"restore_defaults_confirmation\">Želite li vratiti zadane postavke?</string>\n    <string name=\"permission_display_over_apps\">Dozvoli prikaz preko drugih aplikacija</string>\n    <string name=\"permission_display_over_apps_message\">Da biste koristili Popup Player, odaberite %1$s u sljedećem meniju postavki Androida i omogućite %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"Dozvoli prikaz preko drugih aplikacija\\\"</string>\n    <string name=\"error_report_notification_title\">NewPipe je naišao na grešku, dodirnite za prijavu</string>\n    <string name=\"error_report_notification_toast\">Došlo je do greške, pogledajte obavještenje</string>\n    <string name=\"sorry_string\">Žao mi je, to se nije trebalo desiti.</string>\n    <string name=\"error_report_button_text\">Prijavi putem e-pošte</string>\n    <string name=\"copy_for_github\">Kopiraj formatirani izvještaj</string>\n    <string name=\"error_report_open_issue_button_text\">Izvještaj na GitHubu</string>\n    <string name=\"error_report_open_github_notice\">Molimo Vas da provjerite da li već postoji problem koji se odnosi na Vaš pad sistema. Prilikom kreiranja duplikata tiketa, oduzimate nam vrijeme koje bismo mogli posvetiti ispravljanju samog problema.</string>\n    <string name=\"error_snackbar_message\">Izvinite, ali nešto je pošlo po zlu.</string>\n    <string name=\"error_snackbar_action\">Prijavi</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"what_happened_headline\">Šta se dogodilo:</string>\n    <string name=\"info_labels\">Šta:\\nZahtjev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik aplikacije:\\nUsluga:\\nVremenska oznaka:\\nPaket:\\nVerzija:\\nVerzija OS-a:</string>\n    <string name=\"your_comment\">Vaš komentar (na engleskom):</string>\n    <string name=\"error_details_headline\">Detalji:</string>\n    <string name=\"detail_thumbnail_view_description\">Reproduciraj video, trajanje:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Sličica avatara osobe koja je postavila sliku</string>\n    <string name=\"detail_likes_img_view_description\">Sviđanja</string>\n    <string name=\"detail_dislikes_img_view_description\">Nesviđa mi se</string>\n    <string name=\"comments_tab_description\">Komentari</string>\n    <string name=\"related_items_tab_description\">Povezane stavke</string>\n    <string name=\"description_tab_description\">Opis</string>\n    <string name=\"search_no_results\">Bez rezultata</string>\n    <string name=\"empty_list_subtitle\">Ovdje nema ničega osim cvrčaka</string>\n    <string name=\"import_subscriptions_hint\">Uvoz ili izvoz pretplata iz menija s tri tačke</string>\n    <string name=\"detail_drag_description\">Prevucite da promijenite redoslijed</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Pokušaj ponovo</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"drawer_header_description\">Uključi/isključi uslugu, trenutno odabrana:</string>\n    <string name=\"no_subscribers\">Nema pretplatnika</string>\n    <string name=\"subscribers_count_not_available\">Broj pretplatnika nije dostupan</string>\n    <string name=\"no_views\">Nema pregleda</string>\n    <string name=\"no_one_watching\">Niko ne gleda</string>\n    <string name=\"no_one_listening\">Niko ne sluša</string>\n    <string name=\"no_videos\">Nema videozapisa</string>\n    <string name=\"more_than_100_videos\">100+ videa</string>\n    <string name=\"infinite_videos\">∞ videozapisi</string>\n    <string name=\"no_comments\">Nema komentara</string>\n    <string name=\"comments_are_disabled\">Komentari su onemogućeni</string>\n    <string name=\"no_streams\">Nema tokova</string>\n    <string name=\"no_live_streams\">Nema prijenosa uživo</string>\n    <string name=\"start\">Početak</string>\n    <string name=\"pause\">Pauziraj</string>\n    <string name=\"create\">Napravi</string>\n    <string name=\"delete\">Izbriši</string>\n    <string name=\"delete_file\">Izbriši datoteku</string>\n    <string name=\"delete_entry\">Izbriši unos</string>\n    <string name=\"checksum\">Kontrolni zbir</string>\n    <string name=\"dismiss\">Raspusti</string>\n    <string name=\"rename\">Preimenuj</string>\n    <string name=\"msg_name\">Naziv datoteke</string>\n    <string name=\"msg_threads\">Teme</string>\n    <string name=\"msg_error\">Greška</string>\n    <string name=\"msg_running\">Preuzimanje NewPipe-a</string>\n    <string name=\"msg_running_detail\">Dodirnite za detalje</string>\n    <string name=\"msg_calculating_hash\">Izračunavanje heša</string>\n    <string name=\"msg_wait\">Molimo pričekajte…</string>\n    <string name=\"msg_copied\">Kopirano u međuspremnik</string>\n    <string name=\"msg_failed_to_copy\">Kopiranje u međuspremnik nije uspjelo</string>\n    <string name=\"no_available_dir\">Molimo vas da kasnije u postavkama definišete folder za preuzimanje</string>\n    <string name=\"no_dir_yet\">Još nije postavljen folder za preuzimanje, odaberite zadani folder za preuzimanje sada</string>\n    <string name=\"msg_popup_permission\">Ova dozvola je potrebna za \\notvaranje u skočnom prozoru</string>\n    <string name=\"one_item_deleted\">1 stavka je izbrisana.</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA izazov</string>\n    <string name=\"subtitle_activity_recaptcha\">Pritisnite \\\"Gotovo\\\" kada riješite problem</string>\n    <string name=\"recaptcha_request_toast\">Zatražen je reCAPTCHA izazov</string>\n    <string name=\"recaptcha_solve\">Riješi</string>\n    <string name=\"done\">Gotovo</string>\n    <string name=\"settings_category_downloads_title\">Preuzimanje</string>\n    <string name=\"settings_file_charset_title\">Dozvoljeni znakovi u nazivima datoteka</string>\n    <string name=\"settings_file_replacement_character_summary\">Nevažeći znakovi se zamjenjuju ovom vrijednošću</string>\n    <string name=\"settings_file_replacement_character_title\">Zamjenski lik</string>\n    <string name=\"charset_letters_and_digits\">Slova i brojevi</string>\n    <string name=\"charset_most_special_characters\">Većina specijalnih znakova</string>\n    <string name=\"title_activity_about\">O NewPipe-u</string>\n    <string name=\"title_licenses\">Licence trećih strana</string>\n    <string name=\"copyright\">© %1$s od %2$s pod %3$s</string>\n    <string name=\"tab_licenses\">Dozvole</string>\n    <string name=\"app_description\">Besplatno lagano tokanje na Androidu.</string>\n    <string name=\"contribution_title\">Doprinesite</string>\n    <string name=\"contribution_encouragement\">Bez obzira da li imate ideje za: prevod, promjene dizajna, čišćenje koda ili zaista velike promjene koda - pomoć je uvijek dobrodošla. Što se više uradi, to bolje postaje!</string>\n    <string name=\"view_on_github\">Pogledajte na GitHubu</string>\n    <string name=\"donation_title\">Donirajte</string>\n    <string name=\"donation_encouragement\">NewPipe je razvijen od strane volontera koji svoje slobodno vrijeme provode pružajući vam najbolje korisničko iskustvo. Doprinesite programerima kako biste ih učinili još boljim dok uživaju u šoljici kafe.</string>\n    <string name=\"give_back\">Vratite</string>\n    <string name=\"website_title\">Web stranica</string>\n    <string name=\"website_encouragement\">Posjetite web stranicu NewPipe za više informacija i novosti.</string>\n    <string name=\"privacy_policy_title\">Politika privatnosti kompanije NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">Projekat NewPipe veoma ozbiljno shvata vašu privatnost. Stoga aplikacija ne prikuplja nikakve podatke bez vašeg pristanka.\\nPolitika privatnosti NewPipe-a detaljno objašnjava koji se podaci šalju i pohranjuju kada pošaljete izvještaj o padu sistema.</string>\n    <string name=\"read_privacy_policy\">Pročitajte politiku privatnosti</string>\n    <string name=\"app_license_title\">NewPipe-ova licenca</string>\n    <string name=\"app_license\">NewPipe je copyleft libre softver: Možete ga koristiti, proučavati, dijeliti i poboljšavati po volji. Konkretno, možete ga redistribuirati i/ili mijenjati pod uvjetima GNU Opće javne licence koju je objavila Fondacija za slobodni softver, bilo verzije 3 Licence ili (po vašem izboru) bilo koje kasnije verzije.</string>\n    <string name=\"read_full_license\">Pročitaj licencu</string>\n    <string name=\"faq_title\">Često postavljana pitanja</string>\n    <string name=\"faq_description\">Ako imate problema s korištenjem aplikacije, obavezno pogledajte ove odgovore na česta pitanja!</string>\n    <string name=\"faq\">Pogledajte na web stranici</string>\n    <string name=\"title_activity_history\">Historija</string>\n    <string name=\"action_history\">Historija</string>\n    <string name=\"delete_item_search_history\">Želite li izbrisati ovu stavku iz historije pretrage?</string>\n    <string name=\"title_last_played\">Posljednje igrano</string>\n    <string name=\"title_most_played\">Najigranije</string>\n    <string name=\"main_page_content\">Sadržaj glavne stranice</string>\n    <string name=\"main_page_content_summary\">Koje kartice se prikazuju na glavnoj stranici</string>\n    <string name=\"main_page_content_swipe_remove\">Prevucite stavke da biste ih uklonili</string>\n    <string name=\"blank_page_summary\">Prazna stranica</string>\n    <string name=\"kiosk_page_summary\">Stranica kioska</string>\n    <string name=\"default_kiosk_page_summary\">Zadani kiosk</string>\n    <string name=\"channel_page_summary\">Stranica kanala</string>\n    <string name=\"select_a_channel\">Odaberite kanal</string>\n    <string name=\"no_channel_subscribed_yet\">Još nema pretplata na kanale</string>\n    <string name=\"select_a_playlist\">Odaberite listu za reprodukciju</string>\n    <string name=\"no_playlist_bookmarked_yet\">Još nema oznaka za plejlistu</string>\n    <string name=\"select_a_kiosk\">Odaberite kiosk</string>\n    <string name=\"export_complete_toast\">Izvezeno</string>\n    <string name=\"import_complete_toast\">Uvezeno</string>\n    <string name=\"no_valid_zip_file\">Nema važeće ZIP datoteke</string>\n    <string name=\"could_not_import_all_files\">Upozorenje: Nije moguće uvesti sve datoteke.</string>\n    <string name=\"override_current_data\">Ovo će poništiti vašu trenutnu postavku.</string>\n    <string name=\"import_settings\">Želite li uvesti i postavke?</string>\n    <string name=\"error_unable_to_load_comments\">Nije moguće učitati komentare</string>\n    <string name=\"select_a_feed_group\">Odaberite grupu feedova</string>\n    <string name=\"no_feed_group_created_yet\">Još nije kreirana nijedna grupa feedova</string>\n    <string name=\"trending\">U trendu</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Novo i popularno</string>\n    <string name=\"local\">Lokalno</string>\n    <string name=\"recently_added\">Nedavno dodano</string>\n    <string name=\"most_liked\">Najpopularnije</string>\n    <string name=\"conferences\">Konferencije</string>\n    <string name=\"title_activity_play_queue\">Red za reprodukciju</string>\n    <string name=\"play_queue_remove\">Ukloni</string>\n    <string name=\"play_queue_stream_detail\">Detalji</string>\n    <string name=\"play_queue_audio_settings\">Postavke zvuka</string>\n    <string name=\"play_queue_audio_track\">Audio: %s</string>\n    <string name=\"audio_track\">Zvučni zapis</string>\n    <string name=\"hold_to_append\">Držite za dodavanje u red</string>\n    <string name=\"show_channel_details\">Prikaži detalje kanala</string>\n    <string name=\"enqueue_stream\">Stavi u red</string>\n    <string name=\"enqueued\">Stavljeno u red čekanja</string>\n    <string name=\"enqueue_next_stream\">Stavi sljedeće u red</string>\n    <string name=\"enqueued_next\">Sljedeće u redu čekanja</string>\n    <string name=\"start_here_on_background\">Počni reprodukciju u pozadini</string>\n    <string name=\"start_here_on_popup\">Počnite igrati u iskačućem prozoru</string>\n    <string name=\"loading_stream_details\">Učitavanje detalja toka…</string>\n    <string name=\"drawer_open\">Otvori ladicu</string>\n    <string name=\"drawer_close\">Zatvori ladicu</string>\n    <string name=\"preferred_open_action_settings_title\">Preferirana akcija \\'otvaranja\\'</string>\n    <string name=\"preferred_open_action_settings_summary\">Zadana radnja pri otvaranju sadržaja — %s</string>\n    <string name=\"video_player\">Video plejer</string>\n    <string name=\"background_player\">Pozadinski plejer</string>\n    <string name=\"popup_player\">Iskačući plejer</string>\n    <string name=\"always_ask_open_action\">Uvijek pitajte</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Dobijanje informacija…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Učitavanje traženog sadržaja</string>\n    <string name=\"create_playlist\">Nova plejlista</string>\n    <string name=\"duplicate_in_playlist\">Liste za reprodukciju koje su sive već sadrže ovu stavku.</string>\n    <string name=\"rename_playlist\">Preimenuj</string>\n    <string name=\"name\">Ime</string>\n    <string name=\"add_to_playlist\">Dodaj na listu pjesama</string>\n    <string name=\"processing_may_take_a_moment\">Obrada… Može potrajati trenutak</string>\n    <string name=\"mute\">Isključi zvuk</string>\n    <string name=\"unmute\">Uključi zvuk</string>\n    <string name=\"set_as_playlist_thumbnail\">Postavi kao sličicu za reprodukciju</string>\n    <string name=\"unset_playlist_thumbnail\">Poništi trajnu sličicu</string>\n    <string name=\"bookmark_playlist\">Označi plejlistu</string>\n    <string name=\"unbookmark_playlist\">Ukloni oznaku</string>\n    <string name=\"delete_playlist_prompt\">Izbrisati ovaj popis?</string>\n    <string name=\"playlist_creation_success\">Plejlista je kreirana</string>\n    <string name=\"playlist_add_stream_success\">Plejlista</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplikat dodan %d puta</string>\n    <string name=\"playlist_thumbnail_change_success\">Sličica plejliste je promijenjena.</string>\n    <string name=\"playlist_no_uploader\">Automatski generirano (nije pronađen korisnik koji je otpremio)</string>\n    <string name=\"caption_none\">Nema titlova</string>\n    <string name=\"resize_fit\">Prilagođeno</string>\n    <string name=\"resize_fill\">Popuni</string>\n    <string name=\"resize_zoom\">Uvećanje</string>\n    <string name=\"caption_auto_generated\">Automatski generirano</string>\n    <string name=\"caption_setting_title\">Titlovi</string>\n    <string name=\"caption_setting_description\">Izmijenite veličinu teksta titlova i stilove pozadine za player. Za primjenu je potrebno ponovno pokretanje aplikacije</string>\n    <string name=\"leak_canary_not_available\">LeakCanary nije dostupan</string>\n    <string name=\"enable_leak_canary_summary\">Praćenje curenja memorije može uzrokovati da aplikacija prestane reagirati prilikom ispisa heap memorije</string>\n    <string name=\"show_memory_leaks\">Prikaži curenje memorije</string>\n    <string name=\"enable_disposed_exceptions_title\">Prijavi greške izvan životnog ciklusa</string>\n    <string name=\"enable_disposed_exceptions_summary\">Prisilno prijavljivanje izuzetaka neisporučenih Rx zahtjeva izvan životnog ciklusa fragmenta ili aktivnosti nakon odlaganja</string>\n    <string name=\"show_original_time_ago_title\">Prikaži originalno vrijeme prije stavki</string>\n    <string name=\"show_original_time_ago_summary\">Originalni tekstovi iz usluga bit će vidljivi u stavkama toka</string>\n    <string name=\"disable_media_tunneling_title\">Onemogući tuneliranje medija</string>\n    <string name=\"disable_media_tunneling_summary\">Onemogućite tuneliranje medija ako se pojavi crni ekran ili se prilikom reprodukcije videa pojavi prekid.</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Tuneliranje medija je onemogućeno prema zadanim postavkama na vašem uređaju jer je poznato da vaš model uređaja to ne podržava.</string>\n    <string name=\"show_crash_the_player_title\">Prikaži \\\"Sruši plejer\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Prikazuje opciju pada sistema prilikom korištenja plejera</string>\n    <string name=\"check_new_streams\">Pokreni provjeru za nove tokove</string>\n    <string name=\"crash_the_app\">Sruši aplikaciju</string>\n    <string name=\"show_error_snackbar\">Prikaži traku s upozorenjem o grešci</string>\n    <string name=\"create_error_notification\">Kreiraj obavještenje o grešci</string>\n    <string name=\"import_title\">Uvoz</string>\n    <string name=\"import_from\">Uvoz iz</string>\n    <string name=\"export_to\">Izvoz u</string>\n    <string name=\"import_ongoing\">Uvoz…</string>\n    <string name=\"export_ongoing\">Izvoz…</string>\n    <string name=\"import_file_title\">Uvoz datoteke</string>\n    <string name=\"previous_export\">Prethodni izvoz</string>\n    <string name=\"subscriptions_import_unsuccessful\">Nije moguće uvesti pretplate</string>\n    <string name=\"subscriptions_export_unsuccessful\">Nije moguće izvesti pretplate</string>\n    <string name=\"import_youtube_instructions\">Uvoz YouTube pretplata iz Google arhive:\\n\\n1. Idite na ovaj URL: %1$s\\n2. Prijavite se kada se to od vas zatraži\\n3. Kliknite na \\\"Svi podaci uključeni\\\", zatim na \\\"Poništi odabir svih\\\", a zatim odaberite samo \\\"pretplate\\\" i kliknite na \\\"U redu\\\"\\n4. Kliknite na \\\"Sljedeći korak\\\", a zatim na \\\"Kreiraj izvoz\\\"\\n5. Kliknite na dugme \\\"Preuzmi\\\" nakon što se pojavi\\n6. Kliknite na UVOZ DATOTEKE ispod i odaberite preuzetu .zip datoteku\\n7. [Ako uvoz .zip datoteke ne uspije] Izvucite .csv datoteku (obično pod \\\"YouTube i YouTube Music/pretplate/pretplate.csv\\\"), kliknite na UVOZ DATOTEKE ispod i odaberite izvučenu csv datoteku</string>\n    <string name=\"import_soundcloud_instructions\">Uvezite SoundCloud profil unosom URL-a ili vašeg ID-a:\\n\\n1. Omogućite \\\"desktop mode\\\" u web pregledniku (stranica nije dostupna za mobilne uređaje)\\n2. Idite na ovaj URL: %1$s\\n3. Prijavite se kada se to od vas zatraži\\n4. Kopirajte URL profila na koji ste preusmjereni.</string>\n    <string name=\"import_soundcloud_instructions_hint\">tvoj ID, soundcloud.com/tvojID</string>\n    <string name=\"import_network_expensive_warning\">Imajte na umu da ova operacija može biti skupa za mrežu.\\n\\nŽelite li nastaviti?</string>\n    <string name=\"playback_speed_control\">Kontrole brzine reprodukcije</string>\n    <string name=\"playback_tempo\">Brzina</string>\n    <string name=\"playback_pitch\">Točka glasa</string>\n    <string name=\"unhook_checkbox\">Otkačite (može uzrokovati distorziju)</string>\n    <string name=\"skip_silence_checkbox\">Premotavanje unaprijed tokom tišine</string>\n    <string name=\"playback_step\">Korak</string>\n    <string name=\"playback_reset\">Resetuj</string>\n    <string name=\"percent\">Postotak</string>\n    <string name=\"semitone\">Poluton</string>\n    <string name=\"start_accept_privacy_policy\">Kako bismo se pridržavali Opće uredbe o zaštiti podataka (GDPR), ovim putem skrećemo vašu pažnju na politiku privatnosti kompanije NewPipe. Molimo vas da je pažljivo pročitate.\\nMorate je prihvatiti da biste nam poslali izvještaj o grešci.</string>\n    <string name=\"accept\">Prihvati</string>\n    <string name=\"decline\">Odbij</string>\n    <string name=\"limit_data_usage_none_description\">Bez ograničenja</string>\n    <string name=\"limit_mobile_data_usage_title\">Ograničenje rezolucije prilikom korištenja mobilnih podataka</string>\n    <string name=\"enable_streams_notifications_title\">Obavještenja o novim tokovima</string>\n    <string name=\"enable_streams_notifications_summary\">Obavijesti me o novim tokovima s pretplata</string>\n    <string name=\"streams_notifications_interval_title\">Učestalost provjere</string>\n    <string name=\"streams_notifications_network_title\">Potrebna mrežna veza</string>\n    <string name=\"any_network\">Bilo koja mreža</string>\n    <string name=\"updates_setting_title\">Nadogradnje</string>\n    <string name=\"updates_setting_description\">Prikaži obavještenje za podsticanje ažuriranja aplikacije kada je dostupna nova verzija</string>\n    <string name=\"check_for_updates\">Provjeri ažuriranja</string>\n    <string name=\"auto_update_check_description\">NewPipe može automatski provjeravati nove verzije s vremena na vrijeme i obavijestiti vas kada budu dostupne.\\nŽelite li ovo omogućiti?</string>\n    <string name=\"manual_update_description\">Ručno provjerite nove verzije</string>\n    <string name=\"minimize_on_exit_title\">Minimiziraj pri prebacivanju aplikacija</string>\n    <string name=\"minimize_on_exit_summary\">Radnja prilikom prelaska na drugu aplikaciju iz glavnog video plejera — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Nema</string>\n    <string name=\"minimize_on_exit_background_description\">Minimiziraj na pozadinski plejer</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimiziraj da bi se player pojavio u skočnom prozoru</string>\n    <string name=\"autoplay_summary\">Automatski pokreni reprodukciju — %s</string>\n    <string name=\"wifi_only\">Samo na Wi-Fi mreži</string>\n    <string name=\"never\">Nikad</string>\n    <string name=\"list_view_mode\">Način prikaza liste</string>\n    <string name=\"list\">Spisak</string>\n    <string name=\"grid\">Rešetka</string>\n    <string name=\"card\">Kartica</string>\n    <string name=\"auto\">Automatski</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Pregled sličice trake za pretraživanje</string>\n    <string name=\"high_quality_larger\">Visok kvalitet (veći)</string>\n    <string name=\"low_quality_smaller\">Nizak kvalitet (manji)</string>\n    <string name=\"dont_show\">Ne prikazuj</string>\n    <string name=\"app_update_unavailable_toast\">Koristite najnoviju verziju NewPipe-a</string>\n    <string name=\"app_update_available_notification_title\">Ažuriranje NewPipe-a je dostupno!</string>\n    <string name=\"app_update_available_notification_text\">Dodirnite za preuzimanje %s</string>\n    <string name=\"missions_header_finished\">Završeno</string>\n    <string name=\"missions_header_pending\">Na čekanju</string>\n    <string name=\"paused\">pauzirano</string>\n    <string name=\"queued\">u redu čekanja</string>\n    <string name=\"post_processing\">naknadna obrada</string>\n    <string name=\"recovering\">oporavlja se</string>\n    <string name=\"enqueue\">Stavi u red</string>\n    <string name=\"permission_denied\">Sistem je odbio akciju</string>\n    <string name=\"checking_updates_toast\">Provjera ažuriranja…</string>\n    <string name=\"download_failed\">Preuzimanje nije uspjelo</string>\n    <string name=\"reset_settings_title\">Resetiraj postavke</string>\n    <string name=\"reset_settings_summary\">Resetujte sve postavke na njihove zadane vrijednosti</string>\n    <string name=\"reset_all_settings\">Resetovanjem svih postavki poništit ćete sve svoje željene postavke i ponovo pokrenuti aplikaciju.\\n\\nJeste li sigurni da želite nastaviti?</string>\n    <string name=\"generate_unique_name\">Generiraj jedinstveno ime</string>\n    <string name=\"overwrite\">Prebriši</string>\n    <string name=\"overwrite_unrelated_warning\">Datoteka s ovim imenom već postoji</string>\n    <string name=\"overwrite_finished_warning\">Preuzeta datoteka s ovim nazivom već postoji</string>\n    <string name=\"overwrite_failed\">ne može prepisati datoteku</string>\n    <string name=\"download_already_running\">U toku je preuzimanje s ovim imenom</string>\n    <string name=\"download_already_pending\">Postoji preuzimanje s ovim nazivom na čekanju</string>\n    <string name=\"show_error\">Prikaži grešku</string>\n    <string name=\"error_file_creation\">Datoteka ne može biti kreirana</string>\n    <string name=\"error_path_creation\">Nije moguće kreirati odredišnu mapu</string>\n    <string name=\"error_ssl_exception\">Nije moguće uspostaviti sigurnu vezu</string>\n    <string name=\"error_unknown_host\">Nije moguće pronaći server</string>\n    <string name=\"error_connect_host\">Ne mogu se povezati sa serverom</string>\n    <string name=\"error_http_no_content\">Server ne šalje podatke</string>\n    <string name=\"error_http_unsupported_range\">Server ne prihvata višenitna preuzimanja, pokušajte ponovo sa @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Nije pronađeno</string>\n    <string name=\"error_postprocessing_failed\">Naknadna obrada nije uspjela</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe je zatvoren tokom rada na datoteci</string>\n    <string name=\"error_insufficient_storage\">Nema dovoljno slobodnog prostora na uređaju</string>\n    <string name=\"error_insufficient_storage_left\">Nema više prostora na uređaju</string>\n    <string name=\"error_progress_lost\">Napredak je izgubljen jer je datoteka izbrisana</string>\n    <string name=\"error_timeout\">Vremensko ograničenje veze</string>\n    <string name=\"error_download_resource_gone\">Nije moguće oporaviti ovo preuzimanje</string>\n    <string name=\"clear_download_history\">Obriši historiju preuzimanja</string>\n    <string name=\"confirm_prompt\">Želite li obrisati historiju preuzimanja ili izbrisati sve preuzete datoteke?</string>\n    <string name=\"delete_downloaded_files\">Izbriši preuzete datoteke</string>\n    <string name=\"delete_downloaded_files_confirm\">Izbrisati sve preuzete datoteke s diska?</string>\n    <string name=\"stop\">Zaustavi</string>\n    <string name=\"max_retry_msg\">Maksimalan broj ponovnih pokušaja</string>\n    <string name=\"max_retry_desc\">Maksimalan broj pokušaja prije otkazivanja preuzimanja</string>\n    <string name=\"pause_downloads_on_mobile\">Prekid na mrežama s ograničenim pristupom</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Korisno prilikom prelaska na mobilne podatke, iako se neka preuzimanja ne mogu obustaviti</string>\n    <string name=\"close\">Zatvori</string>\n    <string name=\"enable_queue_limit\">Ograniči red čekanja za preuzimanje</string>\n    <string name=\"enable_queue_limit_desc\">Jedno preuzimanje će se pokrenuti istovremeno</string>\n    <string name=\"start_downloads\">Započni preuzimanja</string>\n    <string name=\"pause_downloads\">Pauziraj preuzimanja</string>\n    <string name=\"downloads_storage_ask_title\">Pitaj gdje preuzeti</string>\n    <string name=\"downloads_storage_ask_summary\">Bit ćete upitani gdje želite sačuvati svako preuzimanje.\\nOmogućite birač sistemskih foldera (SAF) ako želite preuzeti na eksternu SD karticu</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Bit ćete upitani gdje sačuvati svako preuzimanje</string>\n    <string name=\"downloads_storage_use_saf_title\">Koristi birač sistemskih foldera (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Okvir za pristup pohrani\\' omogućava preuzimanje na eksternu SD karticu</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Počevši od Androida 10, podržan je samo \\'Storage Access Framework\\'</string>\n    <string name=\"choose_instance_prompt\">Odaberite instancu</string>\n    <string name=\"app_language_title\">Jezik aplikacije</string>\n    <string name=\"systems_language\">Zadano sistemsko</string>\n    <string name=\"remove_watched\">Ukloni gledano</string>\n    <string name=\"remove_watched_popup_title\">Ukloniti gledane videozapise?</string>\n    <string name=\"remove_duplicates\">Ukloni duplikate</string>\n    <string name=\"remove_duplicates_title\">Ukloniti duplikate?</string>\n    <string name=\"remove_duplicates_message\">Želite li ukloniti sve duplikatne tokove na ovoj listi za reprodukciju?</string>\n    <string name=\"remove_watched_popup_warning\">Videozapisi koji su pregledani prije i poslije dodavanja na listu za reprodukciju bit će uklonjeni.\\nJeste li sigurni? Ovo se ne može poništiti!</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Da, i djelimično odgledani videozapisi</string>\n    <string name=\"new_seek_duration_toast\">Zbog ograničenja ExoPlayera, trajanje pretraživanja je postavljeno na %d sekundi</string>\n    <string name=\"fragment_feed_title\">Šta je novo</string>\n    <string name=\"feed_group_page_summary\">Stranica grupe kanala</string>\n    <string name=\"feed_groups_header_title\">Grupe kanala</string>\n    <string name=\"feed_oldest_subscription_update\">Sažetak zadnji put ažuriran: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Nije učitano: %d</string>\n    <string name=\"feed_notification_loading\">Učitavanje feeda…</string>\n    <string name=\"feed_processing_message\">Obrada feeda…</string>\n    <string name=\"feed_new_items\">Nove stavke feeda</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Odaberite pretplate</string>\n    <string name=\"feed_group_dialog_empty_selection\">Nije odabrana pretplata</string>\n    <string name=\"feed_group_dialog_empty_name\">Prazan naziv grupe</string>\n    <string name=\"feed_group_dialog_delete_message\">Želite li izbrisati ovu grupu?</string>\n    <string name=\"feed_create_new_group_button_title\">Novo</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Prikaži samo negrupirane pretplate</string>\n    <string name=\"settings_category_feed_title\">Sažetak</string>\n    <string name=\"feed_update_threshold_title\">Prag ažuriranja feeda</string>\n    <string name=\"feed_update_threshold_summary\">Vrijeme nakon posljednjeg ažuriranja prije nego što se pretplata smatra zastarjelom — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Uvijek ažuriraj</string>\n    <string name=\"feed_load_error\">Greška pri učitavanju feeda</string>\n    <string name=\"feed_load_error_account_info\">Nije moguće učitati feed za \\'%s\\'.</string>\n    <string name=\"feed_load_error_terminated\">Autorov račun je ukinut. \\nNewPipe ubuduće neće moći učitavati ovaj sažetak. \\nŽeliš li ukinuti pretplatu za ovaj kanal?</string>\n    <string name=\"feed_load_error_fast_unknown\">Režim brzog hranjenja ne pruža više informacija o ovome.</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Preuzmi iz namjenskog feeda kada je dostupan</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Dostupno u nekim servisima, obično je mnogo brže, ali može vratiti ograničen broj artikala i često nepotpune informacije (npr. bez trajanja, vrste artikla, bez aktivnog statusa)</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Omogući brzi način rada</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Onemogući brzi način rada</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Mislite li da je učitavanje feeda previše sporo? Ako je tako, pokušajte omogućiti brzo učitavanje (možete ga promijeniti u postavkama ili pritiskom na dugme ispod).\\n\\nNewPipe nudi dvije strategije učitavanja feeda:\\n• Preuzimanje cijelog pretplatničkog kanala, što je sporo, ali potpuno.\\n• Korištenje namjenske krajnje tačke usluge, što je brzo, ali obično nije potpuno.\\n\\nRazlika između ove dvije je u tome što brza obično nema neke informacije, poput trajanja ili vrste stavke (ne može razlikovati videozapise uživo od normalnih) i može vratiti manje stavki.\\n\\nYouTube je primjer usluge koja nudi ovu brzu metodu sa svojim RSS feedom.\\n\\nDakle, izbor se svodi na to šta preferirate: brzinu ili precizne informacije.</string>\n    <string name=\"feed_hide_streams_title\">Prikaži sljedeće tokove</string>\n    <string name=\"feed_show_hide_streams\">Prikaži/Sakrij tokove</string>\n    <string name=\"feed_fetch_channel_tabs\">Dohvati kartice kanala</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Kartice koje treba preuzeti prilikom ažuriranja feeda. Ova opcija nema efekta ako se kanal ažurira pomoću brzog načina rada.</string>\n    <string name=\"content_not_supported\">Ovaj sadržaj još uvijek nije podržan od strane NewPipe-a.\\n\\nNadamo se da će biti podržan u budućoj verziji.</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Sličica avatara kanala</string>\n    <string name=\"channel_created_by\">Kreirao/la %s</string>\n    <string name=\"video_detail_by\">Napisao %s</string>\n    <string name=\"playlist_page_summary\">Stranica s popisom za reprodukciju</string>\n    <string name=\"show_thumbnail_title\">Prikaži sličicu</string>\n    <string name=\"show_thumbnail_summary\">Koristite sličicu i za pozadinu zaključanog ekrana i za obavještenja</string>\n    <string name=\"recent\">Nedavno</string>\n    <string name=\"chapters\">Poglavlja</string>\n    <string name=\"no_app_to_open_intent\">Nijedna aplikacija na vašem uređaju ne može ovo otvoriti</string>\n    <string name=\"no_appropriate_file_manager_message\">Nije pronađen odgovarajući upravitelj datoteka za ovu radnju.\\nMolimo instalirajte upravitelj datoteka ili pokušajte onemogućiti \\'%s\\' u postavkama preuzimanja</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Nije pronađen odgovarajući upravitelj datoteka za ovu radnju.\\nMolimo instalirajte upravitelj datoteka kompatibilan sa Storage Access Frameworkom</string>\n    <string name=\"georestricted_content\">Ovaj sadržaj nije dostupan u vašoj zemlji.</string>\n    <string name=\"soundcloud_go_plus_content\">Ovo je pjesma na SoundCloud Go+ platformi, barem u vašoj zemlji, tako da je NewPipe ne može strimovati ili preuzeti.</string>\n    <string name=\"private_content\">Ovaj sadržaj je privatan, tako da ga NewPipe ne može strimovati ili preuzimati.</string>\n    <string name=\"youtube_music_premium_content\">Ovaj video je dostupan samo članovima YouTube Music Premium-a, tako da ga NewPipe ne može strimovati ili preuzeti.</string>\n    <string name=\"account_terminated\">Račun ukinut</string>\n    <string name=\"account_terminated_service_provides_reason\">Račun ukinut\\n\\n%1$s navodi ovaj razlog: %2$s</string>\n    <string name=\"paid_content\">Ovaj sadržaj je dostupan samo korisnicima koji su platili, tako da ga NewPipe ne može strimovati ili preuzimati.</string>\n    <string name=\"featured\">Istaknuto</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"auto_device_theme_title\">Automatski (tema uređaja)</string>\n    <string name=\"night_theme_summary\">Odaberite svoju omiljenu noćnu temu — %s</string>\n    <string name=\"select_night_theme_toast\">Možete odabrati svoju omiljenu noćnu temu ispod</string>\n    <string name=\"night_theme_available\">Ova opcija je dostupna samo ako je za temu odabrana %s</string>\n    <string name=\"download_has_started\">Preuzimanje je počelo</string>\n    <string name=\"description_select_note\">Sada možete odabrati tekst unutar opisa. Imajte na umu da stranica može treperiti i da linkovi možda neće biti dostupni za klikanje dok ste u načinu odabira.</string>\n    <string name=\"description_select_enable\">Omogući odabir teksta u opisu</string>\n    <string name=\"description_select_disable\">Onemogući odabir teksta u opisu</string>\n    <string name=\"metadata_category\">Kategorija</string>\n    <string name=\"metadata_tags\">Oznake</string>\n    <string name=\"metadata_licence\">Dozvola</string>\n    <string name=\"metadata_privacy\">Privatnost</string>\n    <string name=\"metadata_age_limit\">Starosna granica</string>\n    <string name=\"metadata_language\">Jezik</string>\n    <string name=\"metadata_support\">Podrška</string>\n    <string name=\"metadata_host\">Domaćin</string>\n    <string name=\"metadata_thumbnails\">Sličice</string>\n    <string name=\"metadata_uploader_avatars\">Avatari koji su postavili profil</string>\n    <string name=\"metadata_subchannel_avatars\">Avatari podkanala</string>\n    <string name=\"metadata_avatars\">Avatari</string>\n    <string name=\"metadata_banners\">Baneri</string>\n    <string name=\"metadata_privacy_public\">Javno</string>\n    <string name=\"metadata_privacy_unlisted\">Nije navedeno</string>\n    <string name=\"metadata_privacy_private\">Privatno</string>\n    <string name=\"metadata_privacy_internal\">Unutrašnje</string>\n    <string name=\"metadata_subscribers\">Pretplatnici</string>\n    <string name=\"detail_pinned_comment_view_description\">Zakačen komentar</string>\n    <string name=\"detail_heart_img_view_description\">Srce od strane kreatora</string>\n    <string name=\"open_website_license\">Otvori web stranicu</string>\n    <string name=\"tablet_mode_title\">Tabletni način rada</string>\n    <string name=\"on\">Upaljeno</string>\n    <string name=\"off\">Ugašeno</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Zadano za ExoPlayer</string>\n    <string name=\"notifications_disabled\">Obavještenja su onemogućena</string>\n    <string name=\"get_notified\">Primajte obavještenja</string>\n    <string name=\"you_successfully_subscribed\">Sada ste pretplaćeni na ovaj kanal</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Prikaži/Uključi sve</string>\n    <string name=\"streams_not_yet_supported_removed\">Strimovi koje program za preuzimanje još ne podržava nisu prikazani</string>\n    <string name=\"audio_track_present_in_video\">Zvučni zapis bi već trebao biti prisutan u ovom toku</string>\n    <string name=\"selected_stream_external_player_not_supported\">Odabrani tok nije podržan od strane eksternih plejera</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Nema dostupnih audio tokova za vanjske uređaje za reprodukciju</string>\n    <string name=\"no_video_streams_available_for_external_players\">Nema video tokova dostupnih za vanjske uređaje za reprodukciju</string>\n    <string name=\"select_quality_external_players\">Odaberite kvalitet za vanjske uređaje za reprodukciju</string>\n    <string name=\"select_audio_track_external_players\">Odaberite audio zapis za vanjske uređaje za reprodukciju</string>\n    <string name=\"unknown_format\">Nepoznati format</string>\n    <string name=\"unknown_quality\">Nepoznat kvalitet</string>\n    <string name=\"unknown_audio_track\">Nepoznato</string>\n    <string name=\"feed_show_watched\">Potpuno odgledano</string>\n    <string name=\"feed_show_partially_watched\">Djelomično gledano</string>\n    <string name=\"feed_show_upcoming\">Nadolazeći</string>\n    <string name=\"sort\">Sortiraj</string>\n    <string name=\"settings_category_exoplayer_title\">Postavke ExoPlayera</string>\n    <string name=\"settings_category_exoplayer_summary\">Upravljajte nekim postavkama ExoPlayera. Ove promjene zahtijevaju ponovno pokretanje plejera da bi stupile na snagu</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Koristite ExoPlayer-ovu rezervnu funkciju dekodera</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Omogućite ovu opciju ako imate problema s inicijalizacijom dekodera, koja se vraća na dekodere nižeg prioriteta ako inicijalizacija primarnih dekodera ne uspije. Ovo može rezultirati lošijim performansama reprodukcije nego kada se koriste primarni dekoderi</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Uvijek koristite ExoPlayer-ovo rješenje za podešavanje površine video izlaza</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Ovo zaobilazno rješenje oslobađa i ponovo instancira video kodeke kada dođe do promjene površine, umjesto direktnog postavljanja površine na kodek. Već korištena od strane ExoPlayera na nekim uređajima s ovim problemom, ova postavka ima učinak samo na Androidu 6 i novijim verzijama.\\n\\nOmogućavanje ove opcije može spriječiti greške u reprodukciji prilikom prebacivanja trenutnog video playera ili prelaska na cijeli ekran</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"audio_track_type_dubbed\">sinhronizovano</string>\n    <string name=\"audio_track_type_descriptive\">opisni</string>\n    <string name=\"audio_track_type_secondary\">sekundarni</string>\n    <string name=\"channel_tab_videos\">Videozapisi</string>\n    <string name=\"channel_tab_tracks\">Snimke</string>\n    <string name=\"channel_tab_shorts\">Kratke hlače</string>\n    <string name=\"channel_tab_livestreams\">Uživo</string>\n    <string name=\"channel_tab_channels\">Kanali</string>\n    <string name=\"channel_tab_playlists\">Plejliste</string>\n    <string name=\"channel_tab_albums\">Albuma</string>\n    <string name=\"channel_tab_likes\">Sviđanja</string>\n    <string name=\"channel_tab_about\">O tome</string>\n    <string name=\"show_channel_tabs\">Kartice kanala</string>\n    <string name=\"show_channel_tabs_summary\">Koje kartice se prikazuju na stranicama kanala</string>\n    <string name=\"open_play_queue\">Otvori red za reprodukciju</string>\n    <string name=\"toggle_fullscreen\">Prikaz preko cijelog ekrana</string>\n    <string name=\"toggle_screen_orientation\">Uključi/isključi orijentaciju ekrana</string>\n    <string name=\"previous_stream\">Prethodni tok</string>\n    <string name=\"next_stream\">Sljedeći tok</string>\n    <string name=\"play\">Pokrenuti</string>\n    <string name=\"replay\">Ponovna reprodukcija</string>\n    <string name=\"more_options\">Više opcija</string>\n    <string name=\"duration\">Trajanje</string>\n    <string name=\"rewind\">Premotavanje unazad</string>\n    <string name=\"forward\">Naprijed</string>\n    <string name=\"image_quality_title\">Kvalitet slike</string>\n    <string name=\"image_quality_summary\">Odaberite kvalitet slika i da li će se slike uopće učitavati kako biste smanjili potrošnju podataka i memorije. Promjene brišu keš memoriju slika i u memoriji i na disku — %s</string>\n    <string name=\"image_quality_none\">Ne učitavaj slike</string>\n    <string name=\"image_quality_low\">Niska kvaliteta</string>\n    <string name=\"image_quality_medium\">Srednji kvalitet</string>\n    <string name=\"image_quality_high\">Visoka kvaliteta</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist\">Dijeli plejlistu</string>\n    <string name=\"share_playlist_with_titles\">Podijeli s naslovima</string>\n    <string name=\"share_playlist_with_list\">Podijeli listu URL-ova</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Podijeli kao privremenu YouTube plejlistu</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"share_playlist_content_details\">%1$s\\n%2$s</string>\n    <string name=\"show_more\">Prikaži više</string>\n    <string name=\"show_less\">Prikaži manje</string>\n    <string name=\"import_settings_vulnerable_format\">Postavke u izvozu koji se uvozi koriste ranjivi format koji je zastario od verzije NewPipe 0.27.0. Provjerite da izvoz koji se uvozi dolazi iz pouzdanog izvora i u budućnosti preferirajte korištenje samo izvoza dobivenih iz NewPipe 0.27.0 ili novije verzije. Podrška za uvoz postavki u ovom ranjivom formatu uskoro će biti potpuno uklonjena, a zatim stare verzije NewPipe-a više neće moći uvoziti postavke izvoza iz novih verzija.</string>\n    <string name=\"migration_info_6_7_title\">Stranica SoundCloud Top 50 uklonjena</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud je ukinuo originalne Top 50 liste. Odgovarajuća kartica je uklonjena sa vaše glavne stranice.</string>\n    <string name=\"migration_info_7_8_title\">Uklonjen je kombinovani prikaz trendova na YouTubeu</string>\n    <string name=\"trending_gaming\">Trendovi u igrama</string>\n    <string name=\"trending_podcasts\">Trendovi podcasti</string>\n    <string name=\"trending_movies\">Popularni filmovi i serije</string>\n    <string name=\"trending_music\">Popularna muzika</string>\n    <string name=\"entry_deleted\">Unos izbrisan</string>\n    <string name=\"player_http_403\">HTTP greška 403 primljena od servera tokom reprodukcije, vjerovatno uzrokovana istekom URL-a za tokove ili zabranom IP adrese</string>\n    <string name=\"player_http_invalid_status\">HTTP greška %1$s primljena od servera tokom reprodukcije</string>\n    <string name=\"youtube_player_http_403\">HTTP greška 403 primljena od servera tokom reprodukcije, vjerovatno uzrokovana zabranom IP adrese ili problemima s deobfuskacijom URL-a za tokove</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s je odbio dati podatke, tražeći prijavu kako bi potvrdio da podnosilac zahtjeva nije bot.\\n\\nVašu IP adresu je možda privremeno zabranio %1$s, možete pričekati neko vrijeme ili preći na drugu IP adresu (na primjer uključivanjem/isključivanjem VPN-a ili prelaskom s WiFi-ja na mobilne podatke).</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s pretplatnik</item>\n        <item quantity=\"few\">%s pretplatnika</item>\n        <item quantity=\"other\">%s pretplatnika</item>\n    </plurals>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s pregled</item>\n        <item quantity=\"few\">%s pregleda</item>\n        <item quantity=\"other\">%s pregleda</item>\n    </plurals>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s gledatelj</item>\n        <item quantity=\"few\">%s gledatelja</item>\n        <item quantity=\"other\">%s gledatelja</item>\n    </plurals>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s slušatelj</item>\n        <item quantity=\"few\">%s slušatelja</item>\n        <item quantity=\"other\">%s slušatelja</item>\n    </plurals>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"few\">%s videozapisa</item>\n        <item quantity=\"other\">%s videozapisa</item>\n    </plurals>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s novi tok</item>\n        <item quantity=\"few\">%s nova toka</item>\n        <item quantity=\"other\">%s novih tokova</item>\n    </plurals>\n    <string name=\"tab_about\">O aplikaciji i pitanja</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">%s preuzimanje je gotovo</item>\n        <item quantity=\"few\">%s preuzimanja su gotova</item>\n        <item quantity=\"other\">%s preuzimanja je gotovo</item>\n    </plurals>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Izbrisano %1$s preuzimanje</item>\n        <item quantity=\"few\">Izbrisana %1$s preuzimanja</item>\n        <item quantity=\"other\">Izbrisano %1$s preuzimanja</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekunda</item>\n        <item quantity=\"few\">%d sekunde</item>\n        <item quantity=\"other\">%d sekundi</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minut</item>\n        <item quantity=\"few\">%d minute</item>\n        <item quantity=\"other\">%d minuta</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d sat</item>\n        <item quantity=\"few\">%d sata</item>\n        <item quantity=\"other\">%d sati</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dan</item>\n        <item quantity=\"few\">%d dana</item>\n        <item quantity=\"other\">%d dana</item>\n    </plurals>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d odabrana</item>\n        <item quantity=\"few\">%d odabrane</item>\n        <item quantity=\"other\">%d odabranih</item>\n    </plurals>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s odgovor</item>\n        <item quantity=\"few\">%s odgovora</item>\n        <item quantity=\"other\">%s odgovora</item>\n    </plurals>\n    <string name=\"migration_info_7_8_message\">YouTube je ukinuo kombinovanu stranicu s trendovima od 21. jula 2025. NewPipe je zamijenio zadanu stranicu s trendovima s trendovima uživo prijenosa.\\n\\nTakođer možete odabrati različite stranice s trendovima u \\\"Postavke &gt; Sadržaj &gt; Sadržaj glavne stranice\\\".</string>\n    <string name=\"unsupported_content_in_country\">Ovaj sadržaj nije dostupan za trenutno odabranu zemlju sadržaja.\\n\\nPromijenite svoj odabir u \\\"Postavke &gt; Sadržaj &gt; Zadana zemlja sadržaja\\\".</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ca/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"install\">Instal·la</string>\n    <string name=\"cancel\">Cancel·la</string>\n    <string name=\"open_in_browser\">Obre al navegador</string>\n    <string name=\"share\">Comparteix</string>\n    <string name=\"download\">Baixa</string>\n    <string name=\"search\">Cerca</string>\n    <string name=\"settings\">Paràmetres</string>\n    <string name=\"subscribe_button_title\">Subscripció</string>\n    <string name=\"subscribed_button_title\">Subscrit</string>\n    <string name=\"show_info\">Mostra la informació</string>\n    <string name=\"tab_subscriptions\">Subscripcions</string>\n    <string name=\"tab_bookmarks\">Llistes de reproducció desades</string>\n    <string name=\"fragment_feed_title\">Novetats</string>\n    <string name=\"download_path_title\">Carpeta de baixada dels vídeos</string>\n    <string name=\"download_path_audio_title\">Carpeta de baixada dels fitxers d\\'àudio</string>\n    <string name=\"default_resolution_title\">Resolució per defecte</string>\n    <string name=\"play_audio\">Àudio</string>\n    <string name=\"default_audio_format_title\">Format d\\'àudio per defecte</string>\n    <string name=\"default_video_format_title\">Format de vídeo per defecte</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"light_theme_title\">Clar</string>\n    <string name=\"dark_theme_title\">Fosc</string>\n    <string name=\"black_theme_title\">Negre</string>\n    <string name=\"enable_watch_history_title\">Historial de reproduccions</string>\n    <string name=\"download_dialog_title\">Baixa</string>\n    <string name=\"settings_category_player_title\">Reproductor</string>\n    <string name=\"settings_category_player_behavior_title\">Comportament</string>\n    <string name=\"settings_category_video_audio_title\">Vídeo i àudio</string>\n    <string name=\"settings_category_history_title\">Historial i memòria cau</string>\n    <string name=\"settings_category_appearance_title\">Aparença</string>\n    <string name=\"settings_category_debug_title\">Depuració</string>\n    <string name=\"content\">Contingut</string>\n    <string name=\"show_age_restricted_content_title\">Mostra el contingut restringit a menors</string>\n    <string name=\"duration_live\">En directe</string>\n    <string name=\"downloads\">Baixades</string>\n    <string name=\"downloads_title\">Baixades</string>\n    <string name=\"all\">Tot</string>\n    <string name=\"disabled\">Desactivat</string>\n    <string name=\"clear\">Neteja</string>\n    <string name=\"best_resolution\">Millor resolució</string>\n    <string name=\"undo\">Desfés</string>\n    <string name=\"always\">Sempre</string>\n    <string name=\"just_once\">Només una vegada</string>\n    <string name=\"file\">Fitxer</string>\n    <string name=\"unknown_content\">[Desconegut]</string>\n    <string name=\"import_data_title\">Importa una base de dades</string>\n    <string name=\"export_data_title\">Exporta una base de dades</string>\n    <string name=\"export_data_summary\">Exporta l\\'historial, les subscripcions, les llistes de reproducció i els paràmetres</string>\n    <string name=\"general_error\">Error</string>\n    <string name=\"network_error\">Error de xarxa</string>\n    <string name=\"video\">Vídeo</string>\n    <string name=\"audio\">Àudio</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s subscriptor</item>\n        <item quantity=\"many\">%s subscriptors</item>\n        <item quantity=\"other\">%s subscriptors</item>\n    </plurals>\n    <string name=\"ok\">D\\'acord</string>\n    <string name=\"msg_name\">Nom de fitxer</string>\n    <string name=\"msg_error\">Error</string>\n    <string name=\"settings_category_downloads_title\">Baixades</string>\n    <string name=\"title_licenses\">Llicències de tercers</string>\n    <string name=\"tab_about\">Quant a i PMF</string>\n    <string name=\"tab_licenses\">Llicències</string>\n    <string name=\"contribution_title\">Col·labora-hi</string>\n    <string name=\"website_title\">Lloc web</string>\n    <string name=\"app_license_title\">Llicència del NewPipe</string>\n    <string name=\"read_full_license\">Llegiu la llicència</string>\n    <string name=\"title_activity_history\">Historial</string>\n    <string name=\"action_history\">Historial</string>\n    <string name=\"delete_item_search_history\">Voleu eliminar aquest element de l\\'historial de cerca\\?</string>\n    <string name=\"main_page_content\">Contingut de la pàgina principal</string>\n    <string name=\"blank_page_summary\">Pàgina en blanc</string>\n    <string name=\"select_a_channel\">Trieu un canal</string>\n    <string name=\"export_complete_toast\">S\\'ha completat l\\'exportació</string>\n    <string name=\"import_complete_toast\">S\\'ha completat la importació</string>\n    <string name=\"play_queue_remove\">Elimina</string>\n    <string name=\"play_queue_stream_detail\">Detalls</string>\n    <string name=\"play_queue_audio_settings\">Paràmetres d\\'àudio</string>\n    <string name=\"video_player\">Reproductor de vídeo</string>\n    <string name=\"background_player\">Reproductor en rerefons</string>\n    <string name=\"popup_player\">Reproductor emergent</string>\n    <string name=\"always_ask_open_action\">Demana-ho sempre</string>\n    <string name=\"create_playlist\">Crea una llista de reproducció</string>\n    <string name=\"rename_playlist\">Canvia el nom</string>\n    <string name=\"name\">Nom</string>\n    <string name=\"add_to_playlist\">Afegeix a una llista de reproducció</string>\n    <string name=\"import_title\">Importa</string>\n    <string name=\"import_from\">Importa des de</string>\n    <string name=\"export_to\">Exporta a</string>\n    <string name=\"import_ongoing\">S\\'està important…</string>\n    <string name=\"export_ongoing\">S\\'està exportant…</string>\n    <string name=\"import_file_title\">Importa un fitxer</string>\n    <string name=\"upload_date_text\">Publicat el %1$s</string>\n    <string name=\"no_player_found\">No s\\'ha trobat cap reproductor en temps real. Voleu instal·lar el VLC\\?</string>\n    <string name=\"no_player_found_toast\">No s\\'ha trobat cap reproductor de fluxos (podeu instal·lar el VLC per reproduir-ho).</string>\n    <string name=\"open_in_popup_mode\">Obre en mode emergent</string>\n    <string name=\"controls_download_desc\">Baixa el fitxer de vídeo</string>\n    <string name=\"did_you_mean\">Volíeu dir: \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Comparteix-ho amb</string>\n    <string name=\"use_external_video_player_title\">Reproductor de vídeo extern</string>\n    <string name=\"channel_unsubscribed\">Heu eliminat la subscripció a aquest canal</string>\n    <string name=\"subscription_change_failed\">No s\\'ha pogut modificar la subscripció</string>\n    <string name=\"subscription_update_failed\">No s\\'ha pogut actualitzar la subscripció</string>\n    <string name=\"controls_background_title\">Rerefons</string>\n    <string name=\"controls_popup_title\">Emergent</string>\n    <string name=\"controls_add_to_playlist_title\">Afegeix a</string>\n    <string name=\"download_path_summary\">Els fitxers de vídeo baixats es desen aquí</string>\n    <string name=\"download_path_dialog_title\">Trieu la carpeta de baixades per als fitxers de vídeo</string>\n    <string name=\"download_path_audio_summary\">Els fitxers d\\'àudio baixats es desen aquí</string>\n    <string name=\"download_path_audio_dialog_title\">Trieu la carpeta de baixada per als fitxers d\\'àudio</string>\n    <string name=\"default_popup_resolution_title\">Resolució per defecte del mode emergent</string>\n    <string name=\"show_higher_resolutions_title\">Mostra resolucions superiors</string>\n    <string name=\"show_higher_resolutions_summary\">Només alguns dispositius poden reproduir vídeos en 2K/4K</string>\n    <string name=\"play_with_kodi_title\">Reprodueix amb el Kodi</string>\n    <string name=\"kore_not_found\">No s\\'ha trobat l\\'aplicació Kore. Voleu instal·lar-la\\?</string>\n    <string name=\"show_play_with_kodi_title\">Mostra «Reprodueix amb el Kodi»</string>\n    <string name=\"show_play_with_kodi_summary\">Mostra una opció per reproduir un vídeo amb el centre multimèdia Kodi</string>\n    <string name=\"popup_remember_size_pos_title\">Reproductor emergent intel·ligent</string>\n    <string name=\"popup_remember_size_pos_summary\">Recorda la darrera mida i posició del reproductor emergent</string>\n    <string name=\"use_inexact_seek_title\">Cerca ràpida poc precisa</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">S\\'ha eliminat la memòria cau d\\'imatges</string>\n    <string name=\"metadata_cache_wipe_title\">Elimina les metadades de la memòria cau</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">S\\'ha esborrat la memòria cau de metadades</string>\n    <string name=\"auto_queue_title\">Posa a la cua el següent flux</string>\n    <string name=\"show_search_suggestions_title\">Suggeriments de cerca</string>\n    <string name=\"show_search_suggestions_summary\">Mostra suggeriments durant la cerca</string>\n    <string name=\"enable_search_history_title\">Historial de cerca</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Reprèn la reproducció després d\\'una interrupció (exemple: una trucada)</string>\n    <string name=\"show_next_and_similar_title\">Mostra el vídeo següent i similars</string>\n    <string name=\"default_content_country_title\">País per defecte dels continguts</string>\n    <string name=\"content_language_title\">Llengua per defecte dels continguts</string>\n    <string name=\"background_player_playing_toast\">S\\'està reproduint en rerefons</string>\n    <string name=\"popup_playing_toast\">S\\'està reproduint en mode emergent</string>\n    <string name=\"notification_channel_name\">Notificació de NewPipe</string>\n    <string name=\"notification_channel_description\">Notificacions per al reproductor de NewPipe</string>\n    <string name=\"could_not_load_thumbnails\">No s\\'han pogut carregar totes les miniatures</string>\n    <string name=\"parsing_error\">No s\\'ha pogut processar el lloc web</string>\n    <string name=\"content_not_available\">Contingut no disponible</string>\n    <string name=\"could_not_setup_download_menu\">No s\\'ha pogut configurar el menú de baixades</string>\n    <string name=\"app_ui_crash\">Ha fallat l\\'aplicació o la interfície d\\'usuari</string>\n    <string name=\"player_stream_failure\">No s\\'ha pogut reproduir aquest vídeo</string>\n    <string name=\"player_unrecoverable_failure\">S\\'ha produït un error irrecuperable al reproductor</string>\n    <string name=\"external_player_unsupported_link_type\">Els reproductors externs no són compatibles amb aquesta mena d\\'enllaços</string>\n    <string name=\"video_streams_empty\">No s\\'ha trobat cap flux de vídeo</string>\n    <string name=\"audio_streams_empty\">No s\\'ha trobat cap flux d\\'àudio</string>\n    <string name=\"invalid_directory\">La carpeta no existeix</string>\n    <string name=\"invalid_source\">El fitxer o la font de contingut no existeix</string>\n    <string name=\"invalid_file\">El fitxer no existeix o bé no teniu permisos de lectura/escriptura</string>\n    <string name=\"file_name_empty_error\">El nom del fitxer no pot estar en blanc</string>\n    <string name=\"error_occurred_detail\">S\\'ha produït un error: %1$s</string>\n    <string name=\"error_report_button_text\">Informeu per correu electrònic</string>\n    <string name=\"error_snackbar_message\">S\\'han produït alguns errors.</string>\n    <string name=\"error_snackbar_action\">Informe</string>\n    <string name=\"what_device_headline\">Informació:</string>\n    <string name=\"what_happened_headline\">Què ha passat:</string>\n    <string name=\"your_comment\">Comentari (en anglès):</string>\n    <string name=\"error_details_headline\">Detalls:</string>\n    <string name=\"detail_thumbnail_view_description\">Reprodueix el vídeo, duració:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Miniatura de l\\'avatar del propietari</string>\n    <string name=\"detail_likes_img_view_description\">M\\'agrada</string>\n    <string name=\"detail_dislikes_img_view_description\">No m\\'agrada</string>\n    <string name=\"search_no_results\">Cap resultat</string>\n    <string name=\"empty_list_subtitle\">No hi ha res aquí</string>\n    <string name=\"retry\">Torna a provar</string>\n    <string name=\"no_subscribers\">Cap subscripció</string>\n    <string name=\"no_views\">Cap reproducció</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s reproducció</item>\n        <item quantity=\"many\">%s reproduccions</item>\n        <item quantity=\"other\">%s reproduccions</item>\n    </plurals>\n    <string name=\"no_videos\">Cap vídeo</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s vídeo</item>\n        <item quantity=\"many\">%s vídeos</item>\n        <item quantity=\"other\">%s vídeos</item>\n    </plurals>\n    <string name=\"pause\">Pausa</string>\n    <string name=\"create\">Crea</string>\n    <string name=\"delete\">Elimina</string>\n    <string name=\"checksum\">Suma de verificació</string>\n    <string name=\"dismiss\">Tanca</string>\n    <string name=\"rename\">Canvia el nom</string>\n    <string name=\"msg_threads\">Fils</string>\n    <string name=\"msg_running\">Baixada del NewPipe activa</string>\n    <string name=\"msg_wait\">Un moment…</string>\n    <string name=\"msg_copied\">S\\'ha copiat al porta-retalls</string>\n    <string name=\"settings_file_charset_title\">Caràcters permesos als noms de fitxer</string>\n    <string name=\"charset_letters_and_digits\">Lletres i dígits</string>\n    <string name=\"title_activity_about\">Quant al NewPipe</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s per %2$s sota %3$s</string>\n    <string name=\"app_description\">Reprodueix transmissions de manera lliure i lleugera a l\\'Android.</string>\n    <string name=\"view_on_github\">Visualitza a GitHub</string>\n    <string name=\"donation_title\">Feu una donació</string>\n    <string name=\"website_encouragement\">Per a més informació i notícies, visiteu el nostre web.</string>\n    <string name=\"title_last_played\">Últimes reproduccions</string>\n    <string name=\"title_most_played\">Més reproduïts</string>\n    <string name=\"kiosk_page_summary\">Tendències</string>\n    <string name=\"channel_page_summary\">Pàgina d\\'un canal</string>\n    <string name=\"select_a_kiosk\">Trieu un quiosc</string>\n    <string name=\"no_valid_zip_file\">El fitxer no té un format ZIP vàlid</string>\n    <string name=\"could_not_import_all_files\">Avís: No s\\'han pogut importar tots els fitxers.</string>\n    <string name=\"override_current_data\">Això sobreescriurà els paràmetres actuals.</string>\n    <string name=\"trending\">Tendències</string>\n    <string name=\"top_50\">Els millors 50</string>\n    <string name=\"drawer_open\">Obre el calaix</string>\n    <string name=\"drawer_close\">Tanca el calaix</string>\n    <string name=\"preferred_player_fetcher_notification_title\">S\\'està obtenint la informació…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">S\\'està carregant el contingut seleccionat</string>\n    <string name=\"delete_playlist_prompt\">Voleu eliminar aquesta llista de reproducció\\?</string>\n    <string name=\"playback_speed_control\">Controls de la velocitat de reproducció</string>\n    <string name=\"playback_tempo\">Tempo</string>\n    <string name=\"playback_pitch\">To</string>\n    <string name=\"main_bg_subtitle\">Toqueu la lupa per començar.</string>\n    <string name=\"use_external_video_player_summary\">Elimina l\\'àudio en algunes resolucions</string>\n    <string name=\"use_external_audio_player_title\">Reproductor d\\'àudio extern</string>\n    <string name=\"enable_search_history_summary\">Emmagatzema les cerques localment</string>\n    <string name=\"enable_watch_history_summary\">Crea un historial de vídeos visualitzats</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Reprèn la reproducció</string>\n    <string name=\"unsupported_url\">Aquest URL no és compatible</string>\n    <string name=\"error_report_title\">Informe d\\'error</string>\n    <string name=\"play_all\">Reprodueix-ho tot</string>\n    <string name=\"switch_to_background\">Canvia al mode en rerefons</string>\n    <string name=\"switch_to_popup\">Canvia al mode emergent</string>\n    <string name=\"switch_to_main\">Canvia al mode principal</string>\n    <string name=\"import_data_summary\">Sobreescriu l\\'historial, les subscripcions i, opcionalment, els paràmetres</string>\n    <string name=\"player_recoverable_failure\">S\\'està recuperant el reproductor després de l\\'error</string>\n    <string name=\"sorry_string\">Bé, és lamentable.</string>\n    <string name=\"detail_drag_description\">Arrossegueu per reordenar la llista</string>\n    <string name=\"start\">Inicia</string>\n    <string name=\"msg_running_detail\">Feu un toc aquí per a més detalls</string>\n    <string name=\"no_available_dir\">Defineix una carpeta de baixades més endavant als paràmetres</string>\n    <string name=\"msg_popup_permission\">Es necessita aquest permís\n\\nper a obrir el mode emergent</string>\n    <string name=\"title_activity_recaptcha\">Camp reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">S\\'ha sol·licitat l\\'emplenament d\\'un camp reCAPTCHA</string>\n    <string name=\"settings_file_replacement_character_summary\">Se substituiran els caràcters no vàlids amb aquest valor</string>\n    <string name=\"settings_file_replacement_character_title\">Caràcter de substitució</string>\n    <string name=\"charset_most_special_characters\">Principals caràcters especials</string>\n    <string name=\"contribution_encouragement\">Idees, traduccions, canvis en el disseny, neteja del codi, canvis importants de programació… La vostra ajuda sempre és benvinguda. Com més feina feta hi hagi, millor!</string>\n    <string name=\"donation_encouragement\">El NewPipe està desenvolupat per voluntaris que fan servir el seu temps lliure per oferir-vos la millor experiència possible. Feu una aportació per assegurar que els nostres desenvolupadors puguin millorar encara més el NewPipe mentre fan un cafè.</string>\n    <string name=\"give_back\">Feu la vostra aportació</string>\n    <string name=\"no_channel_subscribed_yet\">Encara no us heu subscrit a cap canal</string>\n    <string name=\"new_and_hot\">Novetats</string>\n    <string name=\"hold_to_append\">Manteniu premut per afegir a la cua</string>\n    <string name=\"start_here_on_background\">Comença a reproduir en rerefons</string>\n    <string name=\"start_here_on_popup\">Comença a reproduir en mode emergent</string>\n    <string name=\"set_as_playlist_thumbnail\">Estableix com a miniatura de la llista de reproducció</string>\n    <string name=\"bookmark_playlist\">Afegeix la llista de reproducció a les adreces d\\'interès</string>\n    <string name=\"unbookmark_playlist\">Elimina l\\'adreça d\\'interès</string>\n    <string name=\"playlist_creation_success\">S\\'ha creat la llista de reproducció</string>\n    <string name=\"playlist_add_stream_success\">S\\'ha afegit a la llista de reproducció</string>\n    <string name=\"playlist_thumbnail_change_success\">S\\'ha canviat la miniatura de la llista de reproducció.</string>\n    <string name=\"caption_none\">Sense subtítols</string>\n    <string name=\"resize_fit\">Ajusta</string>\n    <string name=\"resize_fill\">Omple</string>\n    <string name=\"resize_zoom\">Escala</string>\n    <string name=\"caption_auto_generated\">Generats automàticament</string>\n    <string name=\"previous_export\">Darrera exportació</string>\n    <string name=\"subscriptions_import_unsuccessful\">No s\\'han pogut importar les subscripcions</string>\n    <string name=\"subscriptions_export_unsuccessful\">No s\\'han pogut exportar les subscripcions</string>\n    <string name=\"unhook_checkbox\">Desvincula (pot causar deformació)</string>\n    <string name=\"metadata_cache_wipe_summary\">Elimina totes les dades de llocs web de la memòria cau</string>\n    <string name=\"auto_queue_summary\">Acaba de reproduir la cua (sense repetició) quan s\\'hi afegeixi un vídeo relacionat</string>\n    <string name=\"show_hold_to_append_title\">Mostra l\\'indicador «Mantenir per posar a la cua»</string>\n    <string name=\"show_hold_to_append_summary\">Mostra un missatge d\\'ajuda quan el botó de mode en segon pla o emergent estigui premut a la pàgina de detalls d\\'un vídeo</string>\n    <string name=\"info_labels\">Què ha passat:\\nPetició:\\nIdioma del contingut:\\nPaís del contingut:\\nLlengua de l\\'aplicació:\\nServei:\\nHora GMT:\\nPaquet:\\nVersió:\\nVersió del SO:</string>\n    <string name=\"preferred_open_action_settings_title\">Acció d\\'obertura preferida</string>\n    <string name=\"preferred_open_action_settings_summary\">Acció per defecte en obrir continguts — %s</string>\n    <string name=\"enable_leak_canary_summary\">La supervisió de fugues de memòria pot fer que l\\'aplicació deixi de respondre mentre es bolca la memòria</string>\n    <string name=\"enable_disposed_exceptions_title\">Informa d\\'errors fora del cicle de vida</string>\n    <string name=\"enable_disposed_exceptions_summary\">Força l\\'informe d\\'excepcions Rx que no es puguin transmetre que tinguin lloc fora del cicle de vida d\\'un fragment o activitat després de disposar-los</string>\n    <string name=\"import_youtube_instructions\">Importeu les vostres subscripcions de YouTube mitjançant la còpia de contingut de Google Takeout: \\n \\n1. Aneu a : %1$s \\n2. Inicieu la sessió si se us demana \\n3. Premeu \\\"Totes les dades incloses\\\", després \\\"Dessel·lecciona-ho tot\\\", llavors sel·leccioneu només \\\"Subscripcions\\\" i finalment premeu \\\"D\\'acord\\\". \\n4. Premeu \\\"Pas següent\\\" i llavors a \\\"Crea una exportació\\\" \\n5. Premeu el botó \\\"Baixa\\\" un cop hagi aparegut \\n6. Premeu a IMPORTA EL FITXER i sel·leccioneu el fitxer .zip descarregat \\n7. [En cas que la importació del fitxer .zip hagi fallat] extreieu-ne el fitxer subscripcions.csv (es troba generalment a \\\"Takeout/YouTube i YouTube Music/subscripcions/subscripcions.csv\\\"), premeu a IMPORTA EL FITXER i sel·leccioneu el fitxer .csv extret</string>\n    <string name=\"import_soundcloud_instructions\">Importeu un perfil del SoundCloud mitjançant l\\'URL o l\\'identificador del vostre perfil: \n\\n \n\\n1. Activeu el «Mode d\\'ordinador» en un navegador (el lloc web no està disponible per a dispositius mòbils) \n\\n2. Aneu a: %1$s \n\\n3. Inicieu la sessió al vostre compte quan si us demani \n\\n4. Copieu l\\'URL on si us ha redirigit.</string>\n    <string name=\"import_soundcloud_instructions_hint\">identificador, soundcloud.com/identificador</string>\n    <string name=\"import_network_expensive_warning\">Tingueu en compte que això pot comportar un ús intensiu de la xarxa. \n\\n \n\\nVoleu continuar\\?</string>\n    <string name=\"no_streams_available_download\">No hi ha vídeos que es puguin baixar</string>\n    <string name=\"caption_setting_title\">Subtítols</string>\n    <string name=\"caption_setting_description\">Modifica la mida i el fons dels subtítols. Cal reiniciar l\\'aplicació per aplicar els canvis</string>\n    <string name=\"clear_views_history_title\">Neteja l\\'historial de reproduccions</string>\n    <string name=\"clear_views_history_summary\">Neteja l\\'historial dels vídeos reproduïts i les posicions de reproducció</string>\n    <string name=\"delete_view_history_alert\">Voleu suprimir tot l\\'historial de reproduccions\\?</string>\n    <string name=\"watch_history_deleted\">S\\'ha esborrat l\\'historial de reproduccions</string>\n    <string name=\"clear_search_history_title\">Neteja l\\'historial de cerca</string>\n    <string name=\"clear_search_history_summary\">Neteja l\\'historial de paraules cercades</string>\n    <string name=\"delete_search_history_alert\">Voleu suprimir tot l\\'historial de cerca\\?</string>\n    <string name=\"search_history_deleted\">S\\'ha esborrat l\\'historial de cerca</string>\n    <string name=\"one_item_deleted\">S\\'ha esborrat 1 element.</string>\n    <string name=\"app_license\">El NewPipe és programari lliure sota llicència copyleft: el podeu fer servir, estudiar, compartir i millorar com vulgueu. Concretament, el podeu redistribuir i/o modificar d\\'acord amb els termes de la llicència GNU GPL publicada per la Free Software Foundation, versió 3 o qualsevol altra versió posterior.</string>\n    <string name=\"import_settings\">Voleu importar també els paràmetres\\?</string>\n    <string name=\"privacy_policy_title\">Política de privadesa del NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">El projecte NewPipe es pren molt seriosament la vostra privadesa. Per aquesta raó, l\\'aplicació no emmagatzema cap dada sense el vostre consentiment. \n\\nLa política de privadesa del NewPipe descriu detalladament quines dades s\\'envien i s\\'emmagatzemen quan envieu un informe d\\'error.</string>\n    <string name=\"read_privacy_policy\">Llegiu la política de privadesa</string>\n    <string name=\"start_accept_privacy_policy\">Per complir amb el Reglament General de Protecció de Dades Europeu (GDPR), us demanem que pareu atenció a la política de privadesa del NewPipe. Llegiu-la detingudament.\n\\nSi voleu informar d\\'un error, l\\'haureu d\\'acceptar.</string>\n    <string name=\"accept\">Accepta</string>\n    <string name=\"decline\">Rebutja</string>\n    <string name=\"limit_data_usage_none_description\">Sense restriccions</string>\n    <string name=\"limit_mobile_data_usage_title\">Restringeix la resolució quan es facin servir dades mòbils</string>\n    <string name=\"minimize_on_exit_title\">Minimitza en canviar d\\'aplicació</string>\n    <string name=\"minimize_on_exit_summary\">Acció en canviar a una altra aplicació des del reproductor de vídeo principal — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Cap</string>\n    <string name=\"minimize_on_exit_background_description\">Minimitza al reproductor en segon pla</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimitza al reproductor emergent</string>\n    <string name=\"skip_silence_checkbox\">Avança ràpid durant el silenci</string>\n    <string name=\"playback_step\">Pas</string>\n    <string name=\"playback_reset\">Reinicia</string>\n    <string name=\"channels\">Canals</string>\n    <string name=\"playlists\">Llistes de reproducció</string>\n    <string name=\"tracks\">Pistes</string>\n    <string name=\"users\">Usuaris</string>\n    <string name=\"tab_choose\">Trieu una pestanya</string>\n    <string name=\"settings_category_updates_title\">Actualitzacions</string>\n    <string name=\"file_deleted\">S\\'ha eliminat el fitxer</string>\n    <string name=\"download_to_sdcard_error_title\">L\\'emmagatzematge extern no està disponible</string>\n    <string name=\"restore_defaults\">Reinicia als valors per defecte</string>\n    <string name=\"restore_defaults_confirmation\">Voleu reiniciar als valors per defecte\\?</string>\n    <string name=\"updates_setting_title\">Actualitzacions</string>\n    <string name=\"list\">Llista</string>\n    <string name=\"grid\">Quadrícula</string>\n    <string name=\"auto\">Automàtic</string>\n    <string name=\"app_update_available_notification_title\">Una nova versió del NewPipe està disponible!</string>\n    <string name=\"missions_header_pending\">Pendent</string>\n    <string name=\"paused\">en pausa</string>\n    <string name=\"queued\">a la cua</string>\n    <string name=\"enqueue\">Afegeix a la cua</string>\n    <string name=\"generate_unique_name\">Genera un nom únic</string>\n    <string name=\"show_error\">Mostra l\\'error</string>\n    <string name=\"error_file_creation\">No es pot crear el fitxer</string>\n    <string name=\"error_path_creation\">No es pot crear la carpeta de destinació</string>\n    <string name=\"stop\">Atura</string>\n    <string name=\"events\">Esdeveniments</string>\n    <string name=\"app_update_notification_channel_description\">Notificacions de noves versions del NewPipe</string>\n    <string name=\"subscribers_count_not_available\">Nombre de subscriptors no disponible</string>\n    <string name=\"main_page_content_summary\">Quines pestanyes es mostren a la pàgina principal</string>\n    <string name=\"conferences\">Conferències</string>\n    <string name=\"list_view_mode\">Mode de vista de llista</string>\n    <string name=\"missions_header_finished\">Finalitzades</string>\n    <string name=\"post_processing\">post-processament</string>\n    <string name=\"download_failed\">Ha fallat la baixada</string>\n    <string name=\"overwrite_finished_warning\">Ja existeix un fitxer baixat amb aquest nom</string>\n    <string name=\"overwrite_unrelated_warning\">Ja existeix un fitxer amb aquest nom</string>\n    <string name=\"download_already_running\">Hi ha una baixada en curs amb aquest nom</string>\n    <string name=\"error_ssl_exception\">No s\\'ha pogut establir una connexió segura</string>\n    <string name=\"error_unknown_host\">No s\\'ha pogut trobar el servidor</string>\n    <string name=\"error_connect_host\">No s\\'ha pogut connectar amb el servidor</string>\n    <string name=\"error_postprocessing_failed\">Ha fallat el post-processament</string>\n    <string name=\"max_retry_msg\">Intents màxims</string>\n    <string name=\"max_retry_desc\">Nombre màxim d\\'intents abans de cancel·lar la baixada</string>\n    <string name=\"pause_downloads_on_mobile\">Interromp en connexions limitades</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Útil en canviar a les dades mòbils, tot i que algunes baixades no es poden aturar</string>\n    <string name=\"unsubscribe\">Elimina la subscripció</string>\n    <string name=\"overwrite\">Sobreescriu</string>\n    <string name=\"error_http_not_found\">No s\\'ha trobat</string>\n    <string name=\"show_comments_title\">Mostra els comentaris</string>\n    <string name=\"show_comments_summary\">Desactiveu-ho per no mostrar comentaris</string>\n    <string name=\"autoplay_title\">Reproducció automàtica</string>\n    <string name=\"no_comments\">Cap comentari</string>\n    <string name=\"error_unable_to_load_comments\">No s\\'han pogut carregar els comentaris</string>\n    <string name=\"close\">Tanca</string>\n    <string name=\"saved_tabs_invalid_json\">S\\'ha produït un error en llegir les pestanyes desades; s\\'estan utilitzant les pestanyes per defecte</string>\n    <string name=\"updates_setting_description\">Mostra una notificació per demanar l\\'actualització de l\\'aplicació si hi ha una versió nova disponible</string>\n    <string name=\"error_http_no_content\">El servidor no està enviant dades</string>\n    <string name=\"app_update_notification_channel_name\">Notificació d\\'actualització de l\\'aplicació</string>\n    <string name=\"enable_playback_resume_title\">Reprèn la reproducció</string>\n    <string name=\"overwrite_failed\">No es pot sobreescriure el fitxer</string>\n    <string name=\"download_already_pending\">Hi ha una baixada pendent amb aquest nom</string>\n    <string name=\"error_insufficient_storage_left\">No hi ha espai disponible al dispositiu</string>\n    <string name=\"error_progress_lost\">S\\'ha perdut el progrés perquè s\\'ha eliminat el fitxer</string>\n    <string name=\"error_timeout\">S\\'ha excedit el temps d\\'espera de la connexió</string>\n    <string name=\"confirm_prompt\">Esteu segurs que voleu esborrar el vostre historial de baixades o esborrar-ne tots els fitxers\\?</string>\n    <string name=\"enable_queue_limit\">Limita la cua de baixades</string>\n    <string name=\"start_downloads\">Inicia les baixades</string>\n    <string name=\"pause_downloads\">Pausa les baixades</string>\n    <string name=\"downloads_storage_ask_summary\">Se us demanarà la ubicació de cada baixada.\n\\nHeu d\\'activar el SAF si voleu descarregar-ho a una targeta SD externa</string>\n    <string name=\"enable_playback_state_lists_title\">Posicions a les llistes</string>\n    <string name=\"enable_playback_state_lists_summary\">Mostra els indicadors de posició de reproducció a les llistes</string>\n    <string name=\"settings_category_clear_data_title\">Neteja les dades</string>\n    <string name=\"permission_denied\">El sistema ha denegat l\\'acció</string>\n    <string name=\"error_postprocessing_stopped\">S\\'ha tancat el NewPipe mentre es treballava en el fitxer</string>\n    <string name=\"downloads_storage_ask_title\">Demana on baixar</string>\n    <string name=\"download_to_sdcard_error_message\">No es pot desar a la targeta externa. Voleu restablir la carpeta de baixades\\?</string>\n    <string name=\"error_http_unsupported_range\">El servidor no accepta baixades simultànies. Proveu amb @string/msg_threads = 1</string>\n    <string name=\"enable_playback_resume_summary\">Restaura la darrera posició de la reproducció</string>\n    <string name=\"watch_history_states_deleted\">S\\'ha esborrat les posicions de reproducció</string>\n    <string name=\"missing_file\">El fitxer s\\'ha mogut o suprimit</string>\n    <string name=\"enable_queue_limit_desc\">Només una baixada alhora</string>\n    <string name=\"downloads_storage_use_saf_title\">Fes servir el SAF</string>\n    <string name=\"downloads_storage_use_saf_summary\">El SAF (Storage Access Framework; estructura d\\'accés a l\\'emmagatzematge) us permet realitzar baixades a una memòria externa com una targeta SD</string>\n    <string name=\"clear_playback_states_title\">Esborra les posicions de reproducció</string>\n    <string name=\"clear_playback_states_summary\">Esborra totes les posicions de reproducció</string>\n    <string name=\"delete_playback_states_alert\">Voleu suprimir tots els punts de reproducció\\?</string>\n    <string name=\"drawer_header_description\">In/Habilita el servei; selecció actual:</string>\n    <string name=\"no_one_watching\">Cap visualització</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s visualització</item>\n        <item quantity=\"many\">%s visualitzacions</item>\n        <item quantity=\"other\">%s visualitzacions</item>\n    </plurals>\n    <string name=\"no_one_listening\">Cap reproducció</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s escoltant</item>\n        <item quantity=\"many\">%s escoltants</item>\n        <item quantity=\"other\">%s escoltants</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">Tendències</string>\n    <string name=\"show_original_time_ago_title\">Ensenya el temps passat original sobre els \\\"items\\\"</string>\n    <string name=\"playlist_no_uploader\">Auto-generat (no es troba cap uploader)</string>\n    <string name=\"unmute\">Desactivar Silenci</string>\n    <string name=\"mute\">Silenciar</string>\n    <string name=\"subtitle_activity_recaptcha\">Prem «Fet» quan estigui resolt</string>\n    <string name=\"infinite_videos\">Vídeos ∞</string>\n    <string name=\"more_than_100_videos\">100+ vídeos</string>\n    <string name=\"permission_display_over_apps\">Concedeix permisos per a poder reproduir els continguts a sobre d\\'altres aplicacions</string>\n    <string name=\"artists\">Artistes</string>\n    <string name=\"albums\">Àlbums</string>\n    <string name=\"songs\">Cançons</string>\n    <string name=\"videos_string\">Vídeos</string>\n    <string name=\"restricted_video\">Aquest vídeo té una restricció per edat.\n\\n\n\\nSi desitgeu visualitzar-lo, activeu \\\"%1$s\\\" a paràmetres.</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Activa el \\\"mode restringit\\\" de YouTube</string>\n    <string name=\"peertube_instance_add_exists\">La instància introduïda ja existeix</string>\n    <string name=\"peertube_instance_add_https_only\">Només estàn soportades URLs HTTPS</string>\n    <string name=\"peertube_instance_add_fail\">No ha estat possible validar la instància</string>\n    <string name=\"peertube_instance_add_help\">Introdueix l\\'enllaç d\\'una instància</string>\n    <string name=\"peertube_instance_add_title\">Afegeix-hi una instància</string>\n    <string name=\"peertube_instance_url_help\">Troba les instàncies que t\\'agraden en %s</string>\n    <string name=\"peertube_instance_url_summary\">Selecciona les teves instàncies preferides del PeerTube</string>\n    <string name=\"peertube_instance_url_title\">Instàncies del PeerTube</string>\n    <string name=\"seek_duration_title\">Avançar/-rebobinar duració cerca</string>\n    <string name=\"recent\">Recents</string>\n    <string name=\"show_thumbnail_summary\">Estableix la miniatura com a fons de la pantalla de bloqueig i també de les notificacions</string>\n    <string name=\"show_thumbnail_title\">Mostra\\'n la miniatura</string>\n    <string name=\"playlist_page_summary\">Pàgina de llistes de reproducció</string>\n    <string name=\"video_detail_by\">Per %s</string>\n    <string name=\"channel_created_by\">Creat per %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Miniatura de l\\'avatar del canal</string>\n    <string name=\"content_not_supported\">El NewPipe encara no suporta aquest contingut.\n\\n\n\\nEsperem que en el futur ho faci.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Creieu que la càrrega de contingut és massa lenta\\? Si és el cas, proveu d\\'activar la càrrega ràpida (podeu canviar-ho a paràmetres o al botó de sota).\n\\n\n\\nEl NewPipe ofereix dues formes de càrrega de contingut per als feeds:\n\\n• Descarregant-ne el canal sencer, que és lent però complet.\n\\n• Fent servir un servei dedicat, que és molt ràpid però sovint incomplet.\n\\n\n\\nLa diferència entre els dos és que el ràpid sovint retorna la informació incompleta. Per exemple, pot faltar la durada o el tipus (sense poder distingir entre una retransmissió en directe i un vídeo normal) i podria ser que faltessin alguns elements.\n\\n\n\\nYouTube és un exemple d\\'un servei que ofereix aquest sistema de càrrega ràpida pels seus feed RSS.\n\\n\n\\nEn definitiva, l\\'elecció depèn de si preferiu rapidesa a assegurar-vos que l\\'informació és precisa.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Desactiva el mode ràpid</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Activa el mode ràpid</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Disponible en alguns serveis, normalment és més ràpid, però podria només incloure un nombre limitat de contingut i sovint informació incomplerta (per exemple, sense durada, tipus…)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Recupera des d\\'un feed dedicat si és possible</string>\n    <string name=\"feed_update_threshold_option_always_update\">Actualitza sempre</string>\n    <string name=\"feed_update_threshold_summary\">Temps que ha de passar perquè una subscripció es consideri obsoleta — %s</string>\n    <string name=\"feed_update_threshold_title\">Llindar d\\'actualització del contingut</string>\n    <string name=\"settings_category_feed_title\">Flux</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Mostra només les subscripcions sense grup</string>\n    <string name=\"feed_create_new_group_button_title\">Nou</string>\n    <string name=\"feed_group_dialog_delete_message\">Esteu segurs de voler suprimir aquest grup\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Nom de grup buit</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d de seleccionat</item>\n        <item quantity=\"many\">%d de seleccionats</item>\n        <item quantity=\"other\">%d de seleccionats</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Cap subscripció seleccionada</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Selecciona subscripcions</string>\n    <string name=\"feed_processing_message\">Processant el contingut…</string>\n    <string name=\"feed_notification_loading\">Carregant el contingut…</string>\n    <string name=\"feed_subscription_not_loaded_count\">No carregat: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Contingut refrescat per últim cop: %s</string>\n    <string name=\"feed_groups_header_title\">Grups de canals</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dia</item>\n        <item quantity=\"many\">%d dies</item>\n        <item quantity=\"other\">%d dies</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d hora</item>\n        <item quantity=\"many\">%d hores</item>\n        <item quantity=\"other\">%d hores</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minut</item>\n        <item quantity=\"many\">%d minuts</item>\n        <item quantity=\"other\">%d minuts</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d segon</item>\n        <item quantity=\"many\">%d segons</item>\n        <item quantity=\"other\">%d segons</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">A causa de les limitacions d\\'ExoPlayer, la durada de cerca és de %d segons</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Sí, i també els vídeos vistos parcialment</string>\n    <string name=\"remove_watched_popup_warning\">Els vídeos que ja heu vist tant abans com després d\\'haver estat afegits a la llista de reproducció seran suprimits. \\nN\\'esteu segurs? Aquesta acció no pot desfer-se!</string>\n    <string name=\"remove_watched_popup_title\">Esborrar els vídeos ja vistos?</string>\n    <string name=\"remove_watched\">Esborra els ja vistos</string>\n    <string name=\"systems_language\">Valors per defecte</string>\n    <string name=\"app_language_title\">Llengua de l\\'aplicació</string>\n    <string name=\"choose_instance_prompt\">Escolliu una instància</string>\n    <string name=\"delete_downloaded_files\">Esborrar els fitxers de baixades anteriors</string>\n    <string name=\"clear_download_history\">Esborra l\\'historial de baixades</string>\n    <string name=\"error_download_resource_gone\">No s\\'ha pogut recuperar aquesta baixada</string>\n    <string name=\"recovering\">en recuperació</string>\n    <string name=\"never\">Mai</string>\n    <string name=\"wifi_only\">Només en Wi-Fi</string>\n    <string name=\"autoplay_summary\">Comença la reproducció automàticament — %s</string>\n    <string name=\"show_original_time_ago_summary\">Els textos originals dels serveis seran visibles en els directes</string>\n    <string name=\"show_memory_leaks\">Mostra les fuites de memòria</string>\n    <string name=\"enqueued\">Ja a la cua</string>\n    <string name=\"enqueue_stream\">Afegeix a la cua</string>\n    <string name=\"title_activity_play_queue\">Cua de reproducció</string>\n    <string name=\"most_liked\">Més m\\'agrada</string>\n    <string name=\"recently_added\">Afegits recentment</string>\n    <string name=\"local\">Local</string>\n    <string name=\"no_playlist_bookmarked_yet\">Encara no hi ha llistes de reproducció favorites</string>\n    <string name=\"select_a_playlist\">Sel·leccioneu una llista de reproducció</string>\n    <string name=\"done\">Fet</string>\n    <string name=\"msg_calculating_hash\">Calculant-ne la funció de verificació</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_report_open_issue_button_text\">Avisa del problema a GitHub</string>\n    <string name=\"copy_for_github\">Copia l\\'informe d\\'errors</string>\n    <string name=\"clear_cookie_summary\">Esborra les galetes que NewPipe desa quan resoleu un reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Les galetes del reCAPTCHA han estat esborrades</string>\n    <string name=\"clear_cookie_title\">Esborra les galetes del reCAPTCHA</string>\n    <string name=\"hash_channel_description\">Notificacions pel progrés de comprovació de vídeo</string>\n    <string name=\"hash_channel_name\">Notificació de comprovació del vídeo</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube proporciona un \\\"mode restringit\\\" que amaga contingut potencialment inadequat per a infants</string>\n    <string name=\"show_age_restricted_content_summary\">Mostra contingut que podria ser inadequat pels infants</string>\n    <string name=\"unsupported_url_dialog_message\">No s\\'ha pogut reconèixer l\\'adreça URL. Obrir-la amb una altra aplicació\\?</string>\n    <string name=\"auto_queue_toggle\">Posa a la cua automàticament</string>\n    <string name=\"show_meta_info_summary\">Desactiveu-ho per deixar de mostrar les metadades, que contenen informació addicional sobre el creador del directe, el contingut o una sol·licitud de cerca</string>\n    <string name=\"show_meta_info_title\">Mostra les metadades</string>\n    <string name=\"clear_queue_confirmation_description\">La cua de reproducció activa serà sobreescrita</string>\n    <string name=\"clear_queue_confirmation_summary\">Canviar de reproductor podria sobreescriure la vostra cua de reproducció</string>\n    <string name=\"clear_queue_confirmation_title\">Demana confirmació abans de buidar una cua de reproducció</string>\n    <string name=\"notification_colorize_summary\">Deixa que el sistema acoloreixi la notificació segons el color de la miniatura (això pot no estar disponible a tots els dispositius)</string>\n    <string name=\"notification_colorize_title\">Acoloreix la notificació</string>\n    <string name=\"notification_action_nothing\">Res</string>\n    <string name=\"notification_action_buffering\">Carregant</string>\n    <string name=\"notification_action_shuffle\">Mescla</string>\n    <string name=\"notification_action_repeat\">Repeteix</string>\n    <string name=\"notification_actions_at_most_three\">El màxim d\\'accions que poden aparèixer en una notificació compacta és de tres!</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_action_4_title\">Cinquè botó d\\'acció</string>\n    <string name=\"notification_action_3_title\">Quart botó d\\'acció</string>\n    <string name=\"notification_action_2_title\">Tercer botó d\\'acció</string>\n    <string name=\"notification_action_1_title\">Segon botó d\\'acció</string>\n    <string name=\"notification_action_0_title\">Primer botó d\\'acció</string>\n    <string name=\"notification_scale_to_square_image_summary\">Retalla la miniatura del vídeo mostrat a la notificació de 16:9 a 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Retalla la miniatura amb una relació d\\'aspecte 1:1</string>\n    <string name=\"search_showing_result_for\">Mostrant resultats per a: %s</string>\n    <string name=\"chapters\">Capítols</string>\n    <string name=\"description_tab_description\">Descripció</string>\n    <string name=\"comments_tab_description\">Comentaris</string>\n    <string name=\"show_description_title\">Mostra la descripció</string>\n    <string name=\"open_with\">Obre amb</string>\n    <string name=\"radio\">Ràdio</string>\n    <string name=\"featured\">Destacats</string>\n    <string name=\"paid_content\">Aquests contingut és només accessible per usuaris de pagament, així que no pot ésser ni reproduït ni baixat pel NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Aquest vídeo és només disponible pels usuaris subscriptors de YouTube Music Premium, així que no pot ésser ni reproduït ni baixat pel NewPipe.</string>\n    <string name=\"private_content\">Aquest contingut és privat, així que no pot ésser ni reproduït ni baixat amb el NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Aquesta és una pista de SoundCloud Go+ des del territori on us trobeu, així que no pot ésser reproduïda o baixada pel NewPipe.</string>\n    <string name=\"georestricted_content\">Aquest contingut no és disponible al vostre territori.</string>\n    <string name=\"no_app_to_open_intent\">El vostre dispositiu no té cap aplicació capaç d\\'obrir aquest tipus de contingut</string>\n    <string name=\"crash_the_app\">Força l\\'aturada de l\\'aplicació</string>\n    <string name=\"recaptcha_solve\">Resol</string>\n    <string name=\"related_items_tab_description\">Reproduccions en directe relacionades</string>\n    <string name=\"restricted_video_no_stream\">Aquest vídeo té restriccions d\\'edat.\n\\nDegut a la nova política d\\'edat de YouTube, el NewPipe no pot accedir a aquest contingut i per tant no pot reproduir-lo.</string>\n    <string name=\"show_description_summary\">Desactiveu per amagar la descripció i la informació addicional del vídeo</string>\n    <string name=\"disable_media_tunneling_title\">Desactiva l\\'entunelament del contingut</string>\n    <string name=\"off\">Desactiva</string>\n    <string name=\"on\">Activa</string>\n    <string name=\"tablet_mode_title\">Mode tablet</string>\n    <string name=\"open_website_license\">Obra pàgina web</string>\n    <string name=\"detail_heart_img_view_description\">Destacat pel creador</string>\n    <string name=\"metadata_privacy_internal\">Intern</string>\n    <string name=\"metadata_privacy_private\">Privat</string>\n    <string name=\"metadata_privacy_unlisted\">Descatalogat</string>\n    <string name=\"metadata_privacy_public\">Públic</string>\n    <string name=\"metadata_host\">Amfitrió</string>\n    <string name=\"metadata_support\">Suport</string>\n    <string name=\"metadata_language\">Idioma</string>\n    <string name=\"metadata_age_limit\">Límit d\\'edat</string>\n    <string name=\"metadata_privacy\">Privacitat</string>\n    <string name=\"metadata_licence\">Llicència</string>\n    <string name=\"metadata_tags\">Etiquetes</string>\n    <string name=\"metadata_category\">Categoria</string>\n    <string name=\"description_select_disable\">Desactiva la selecció de text en la descripció</string>\n    <string name=\"description_select_enable\">Activa la selecció del text a la descripció</string>\n    <string name=\"description_select_note\">Ara pots seleccionar el text dins de la descripció. Nota que la pagina pot fer pampallugues i els links poden no ser clicables mentre s\\'està seleccionant.</string>\n    <string name=\"download_has_started\">La descàrreca ha començat</string>\n    <string name=\"select_night_theme_toast\">Pot seleccionar el seu tema fosc favorit aqui sota</string>\n    <string name=\"night_theme_summary\">Selecciona el teu tema fosc favorit — %s</string>\n    <string name=\"auto_device_theme_title\">Automàtic (tema del dispositiu)</string>\n    <string name=\"account_terminated\">Usuari suspes</string>\n    <string name=\"feed_load_error_terminated\">El compte de l\\'autor ha estat esborrat.\n\\nNewPipe no serà capaç de carregar aquest fil en el futur.\n\\nUs voleu desubscriure d\\'aquest canal\\?</string>\n    <string name=\"feed_load_error_account_info\">No s\\'ha pogut carregar el contingut per \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Error carregant contingut</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Ara se\\'t pregunrarà on vols guardar cada descàrrega</string>\n    <string name=\"dont_show\">No mostris</string>\n    <string name=\"low_quality_smaller\">Baixa qualitat (més petit)</string>\n    <string name=\"high_quality_larger\">Alta qualitat (més gran)</string>\n    <string name=\"disable_media_tunneling_summary\">Desactiva l\\'entunelament del contingut si en reproduir el vídeos la pantalla se\\'n va a negre o s\\'entretallen.</string>\n    <string name=\"show_channel_details\">Mostra detalls del canal</string>\n    <string name=\"no_dir_yet\">No s\\'ha establert una carpeta de descàrregues, selecciona la carpeta per defecte ara</string>\n    <string name=\"comments_are_disabled\">Els comentaris estan desactivats</string>\n    <string name=\"remote_search_suggestions\">Suggerments de cerca remota</string>\n    <string name=\"local_search_suggestions\">Suggeriments de cerca local</string>\n    <string name=\"night_theme_title\">Tema fosc</string>\n    <string name=\"mark_as_watched\">Marca com a vist</string>\n    <string name=\"processing_may_take_a_moment\">Processant... Pot trigar un moment</string>\n    <string name=\"start_main_player_fullscreen_title\">Inicia el reproductor principal en pantalla completa</string>\n    <string name=\"main_page_content_swipe_remove\">Llisqueu els elements per eliminar-los</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"error_report_channel_name\">Notificació d\\'informe d\\'error</string>\n    <string name=\"crash_the_player\">Tancar abruptament el reproductor</string>\n    <string name=\"check_for_updates\">Comprovar si hi ha actualitzacions</string>\n    <string name=\"manual_update_description\">Comprovar manualment si hi ha noves versions</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Baixada finalitzada</item>\n        <item quantity=\"many\">%s baixades finalitzades</item>\n        <item quantity=\"other\">%s baixades finalitzades</item>\n    </plurals>\n    <string name=\"seekbar_preview_thumbnail_title\">Vista prèvia de les miniatures de la barra de cerca</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">No s\\'ha trobat cap gestor de fitxers adequat per a aquesta acció. \\nInstal·leu un gestor de fitxers compatible amb l\\'entorn d\\'accés d\\'emmagatzematge</string>\n    <string name=\"no_appropriate_file_manager_message\">No s\\'ha trobat cap gestor de fitxers adequat per a aquesta acció. \\nInstal·leu un gestor de fitxers o intenteu desactivar «%s» als paràmetres de baixada</string>\n    <string name=\"error_report_notification_toast\">S\\'ha produït un error, consulteu la notificació</string>\n    <string name=\"enqueued_next\">Afegit el següent vídeo a la cua</string>\n    <string name=\"error_report_notification_title\">NewPipe ha trobat un error, toca per informar</string>\n    <string name=\"enqueue_next_stream\">Posa a la cua el següent vídeo</string>\n    <string name=\"create_error_notification\">Crear una notificació d\\'error</string>\n    <string name=\"error_report_channel_description\">Notificacions per informar d\\'errors</string>\n    <string name=\"show_error_snackbar\">Mostra una barra d\\'errors</string>\n    <string name=\"checking_updates_toast\">S\\'estan comprovant les actualitzacions…</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">S\\'ha suprimit %1$s baixada</item>\n        <item quantity=\"many\">S\\'han suprimit %1$s baixades</item>\n        <item quantity=\"other\">S\\'han suprimit %1$s baixades</item>\n    </plurals>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">A partir de l\\'Android 10 només s\\'admet el \\\"Sistema d\\'Accés a l\\'Emmagatzematge\\\"</string>\n    <string name=\"feed_new_items\">Elements de feed nous</string>\n    <string name=\"feed_load_error_fast_unknown\">El mode d\\'alimentació ràpida no proporciona més informació sobre això.</string>\n    <string name=\"detail_pinned_comment_view_description\">Comentari fixat</string>\n    <string name=\"show_crash_the_player_title\">Mostra \\\"Força el tancament del reproductor\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Mostra una opció de fallada quan s\\'utilitza el reproductor</string>\n    <string name=\"leak_canary_not_available\">El LeakCanary no està disponible</string>\n    <string name=\"streams_notifications_interval_title\">Comprovant freqüència</string>\n    <string name=\"streams_notifications_network_title\">Es necesita una conexió a Internet</string>\n    <string name=\"any_network\">Qualsevol xarxa</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"settings_category_player_notification_title\">Notificació del reproductor</string>\n    <string name=\"notifications\">Notificacions</string>\n    <string name=\"faq_description\">Si tens problemes utilitzant la aplicació, comprova las preguntes freqüents!</string>\n    <string name=\"check_new_streams\">Ejecutar comprovació per nous streams</string>\n    <string name=\"loading_stream_details\">Cargant detalls del stream…</string>\n    <string name=\"notifications_disabled\">Notificacions estan desactivades</string>\n    <string name=\"percent\">Percent</string>\n    <string name=\"faq_title\">Preguntes freqüents</string>\n    <string name=\"faq\">Veure a la pàgina web</string>\n    <string name=\"delete_downloaded_files_confirm\">Borrar tots el fitxers descargats al disc\\?</string>\n    <string name=\"get_notified\">Ser notificat</string>\n    <string name=\"you_successfully_subscribed\">Ara estás subscrit a aquest canal</string>\n    <string name=\"select_quality_external_players\">Selecciona la qualitat per reproductors externs</string>\n    <string name=\"unknown_format\">Format desconegut</string>\n    <string name=\"unknown_quality\">Cualitat desconeguda</string>\n    <string name=\"sort\">Ordenar</string>\n    <string name=\"settings_category_player_notification_summary\">Configura la notificació de reproducció actual</string>\n    <string name=\"progressive_load_interval_summary\">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</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignora els esdeveniments dels botons de reproducció físics</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Útil, per exemple, si feu servir uns auriculars amb els botons físicament trencats</string>\n    <string name=\"left_gesture_control_summary\">Trieu un gest per la part esquerra de la pantalla</string>\n    <string name=\"progressive_load_interval_title\">Mida de l\\'interval de càrrega de reproducció</string>\n    <string name=\"left_gesture_control_title\">Acció de gest esquerra</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"right_gesture_control_summary\">Tria un gest per a la meitat dreta del reproductor</string>\n    <string name=\"right_gesture_control_title\">Acció del gest dret</string>\n    <string name=\"brightness\">Brillantor</string>\n    <string name=\"volume\">Volum</string>\n    <string name=\"none\">Cap</string>\n    <string name=\"main_tabs_position_summary\">Mou el selector de pestanya principal a la part inferior</string>\n    <string name=\"main_tabs_position_title\">Posició de les pestanyes principals</string>\n    <string name=\"prefer_descriptive_audio_title\">Prefereix àudio descriptiu</string>\n    <string name=\"prefer_original_audio_summary\">Seleccioneu la pista d\\'àudio original independentment de l\\'idioma</string>\n    <string name=\"prefer_original_audio_title\">Prefereix l\\'àudio original</string>\n    <string name=\"fast_mode\">Mode ràpid</string>\n    <string name=\"loading_metadata_title\">Carregant Metadades…</string>\n    <string name=\"prefer_descriptive_audio_summary\">Seleccioneu una pista d\\'àudio amb descripcions per a persones amb discapacitat visual si està disponible</string>\n    <string name=\"streams_notification_channel_name\">Nous streams</string>\n    <string name=\"streams_notification_channel_description\">Notificacions sobre nous streams per a subscripcions</string>\n    <string name=\"msg_failed_to_copy\">Ha fallat en copiar al porta-retalls</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"settings_category_backup_restore_title\">Còpia de seguretat i restauració</string>\n    <string name=\"no_live_streams\">Cap retransmissió en directe</string>\n    <string name=\"import_subscriptions_hint\">Importa o exporta les subscripcions des del menú de 3 punts</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s retransmissió nova</item>\n        <item quantity=\"many\">%s retransmissions noves</item>\n        <item quantity=\"other\">%s retransmissions noves</item>\n    </plurals>\n    <string name=\"play_queue_audio_track\">Àudio: %s</string>\n    <string name=\"audio_track\">Pista d\\'àudio</string>\n    <string name=\"no\">No</string>\n    <string name=\"no_streams\">Cap emissió</string>\n    <string name=\"enable_streams_notifications_summary\">Notifica sobre les noves retransmissions de les subscripcions</string>\n    <string name=\"enable_streams_notifications_title\">Noves notificacions de retransmissions</string>\n    <string name=\"duplicate_in_playlist\">Les llistes de reproducció que estan en gris ja contenen aquest element.</string>\n    <string name=\"unset_playlist_thumbnail\">Desestableix la miniatura permanent</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplicat afegit/s %d vegada/es</string>\n    <string name=\"disable_media_tunneling_automatic_info\">El túnel multimèdia s\\'ha desactivat de manera predeterminada al dispositiu perquè se sap que el vostre model de dispositiu no ho permet.</string>\n    <string name=\"semitone\">Semiton</string>\n    <string name=\"app_update_unavailable_toast\">Estàs fent servir la darrera versió de NewPipe</string>\n    <string name=\"error_insufficient_storage\">No hi ha prou espai lliure al dispositiu</string>\n    <string name=\"tab_bookmarks_short\">Llistes de reproducció</string>\n    <string name=\"card\">Targeta</string>\n    <string name=\"remove_duplicates_message\">Vols suprimir tots els elements duplicats d\\'aquesta llista de reproducció?</string>\n    <string name=\"channel_tab_playlists\">Llistes de reproducció</string>\n    <string name=\"remove_duplicates\">Suprimeix els duplicats</string>\n    <string name=\"reset_settings_title\">Restableix la configuració</string>\n    <string name=\"auto_update_check_description\">NewPipe pot cercar automàticament actualitzacions i fer-t\\'ho saber en estar disponibles.\\nVols habilitar-ho?</string>\n    <string name=\"remove_duplicates_title\">Suprimeixo els duplicats?</string>\n    <string name=\"reset_settings_summary\">Restableix tots els paràmetres als valors per defecte</string>\n    <string name=\"reset_all_settings\">Restablir tots els paràmetres descartarà els teus paràmetres preferits i reiniciarà l\\'aplicació.\\n\\nN\\'estàs segur?</string>\n    <string name=\"app_update_available_notification_text\">Clica per descarregar%s</string>\n    <string name=\"audio_track_type_dubbed\">doblat</string>\n    <string name=\"toggle_all\">Commuta-ho tot</string>\n    <string name=\"feed_show_upcoming\">Pròximament</string>\n    <string name=\"channel_tab_livestreams\">En directe</string>\n    <string name=\"play\">Reprodueix</string>\n    <string name=\"replay\">Torna a reproduir</string>\n    <string name=\"more_options\">Més opcions</string>\n    <string name=\"share_playlist_with_list\">Comparteix la llista dels URLs</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"metadata_uploader_avatars\">Avatars de l\\'autor</string>\n    <string name=\"metadata_subchannel_avatars\">Avatars del sots-canal</string>\n    <string name=\"metadata_subscribers\">Subscriptors</string>\n    <string name=\"audio_track_present_in_video\">Ja hi hauria d\\'haver una pista d\\'àudio en aquest flux</string>\n    <string name=\"selected_stream_external_player_not_supported\">El contingut escollit no és suportat per cap reproductor extern</string>\n    <string name=\"no_video_streams_available_for_external_players\">No hi ha cap flux de vídeo disponible per a reproductors externs</string>\n    <string name=\"select_audio_track_external_players\">Escull la pista d\\'àudio per a reproductors externs</string>\n    <string name=\"unknown_audio_track\">Desconegut</string>\n    <string name=\"audio_track_name\">%1$s%2$s</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"audio_track_type_descriptive\">descriptiu</string>\n    <string name=\"channel_tab_videos\">Vídeos</string>\n    <string name=\"show_channel_tabs_summary\">Quines pestanyes es mostren a les pàgines del canal</string>\n    <string name=\"open_play_queue\">Obre la cua de reproducció</string>\n    <string name=\"toggle_screen_orientation\">Canvia l\\'orientació de la pantalla</string>\n    <string name=\"previous_stream\">Vídeo anterior</string>\n    <string name=\"forward\">Avança</string>\n    <string name=\"image_quality_title\">Qualitat de la imatge</string>\n    <string name=\"image_quality_none\">No carregues les imatges</string>\n    <string name=\"image_quality_medium\">Qualitat mitjana</string>\n    <string name=\"image_quality_low\">Qualitat baixa</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Comparteix com a llista de reproducció temporal de Youtube</string>\n    <string name=\"share_playlist_content_details\">%1$s\\n%2$s</string>\n    <string name=\"show_more\">Mostra més</string>\n    <string name=\"metadata_avatars\">Avatars</string>\n    <string name=\"metadata_banners\">Bàners</string>\n    <string name=\"duration\">Durada</string>\n    <string name=\"rewind\">Rebobina</string>\n    <string name=\"share_playlist_with_titles\">Comparteix amb els títols</string>\n    <string name=\"streams_not_yet_supported_removed\">No es mostren els contiguts que no suporten descàrrega</string>\n    <string name=\"feed_hide_streams_title\">Mostra els vídeos següents</string>\n    <string name=\"no_audio_streams_available_for_external_players\">No hi ha cap flux d\\'àudio disponible per a reproductors externs</string>\n    <string name=\"feed_show_hide_streams\">Mostra/Amaga els vídeos</string>\n    <string name=\"night_theme_available\">Aquesta opció només està disponible si%ss\\'ha seleccionat per al tema</string>\n    <string name=\"next_stream\">Vídeo següent</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%sresposta</item>\n        <item quantity=\"many\">%srespostes</item>\n        <item quantity=\"other\">%srespostes</item>\n    </plurals>\n    <string name=\"feed_fetch_channel_tabs\">Recupera les pestanyes del canal</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Valor per defecte d\\'ExoPlayer</string>\n    <string name=\"metadata_thumbnails\">Miniatures</string>\n    <string name=\"channel_tab_about\">Quant a</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Usa sempre la sortida de vídeo d\\'ExoPlayer com a solució de contingència</string>\n    <string name=\"import_settings_vulnerable_format\">La configuració exportada que vols importar té un format vulnerable que és obsolet des de NewPipe 0.27.0. Assegura\\'t que l\\'exportació que vols importar prové d\\'una font de confiança i prefereix només les exportacions fetes amb NewPipe 0.27.0 o posterior d\\'ara endavant. El suport a la importació de configuracions en aquest format vulnerable aviat serà suprimit completament i aleshores les antigues versions de NewPipe ja no podran importar les exportacions de les configuracions des de les noves versions.</string>\n    <string name=\"channel_tab_albums\">Àlbums</string>\n    <string name=\"show_channel_tabs\">Pestanyes del canal</string>\n    <string name=\"image_quality_high\">Qualitat alta</string>\n    <string name=\"image_quality_summary\">Tria la qualitat de les imatges i si carregar-les totalment o no per reduir l\\'ús de les dades i la memòria. Els canvis suprimiran la memòria cau de les imatges a la memòria i al disc — %s</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Pestanyes que es recuperaran en actualitzar el contingut. Aquesta opció no s\\'aplica si el canal s\\'actualitza en mode ràpid.</string>\n    <string name=\"feed_show_partially_watched\">Vist parcialment</string>\n    <string name=\"feed_show_watched\">Vist completament</string>\n    <string name=\"settings_category_exoplayer_title\">Paràmetres d\\'ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">Gestiona alguns paràmetres d\\'ExoPlayer. Caldrà reinciciar el reproductor per activar-los</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Usa la funció de suport de decodificació d\\'ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Habilita aquesta opció si tens problemes en iniciar el decodificador. S\\'usaran decodificadors alternatius de baixa prioritat si falla el decodificador primari. Això pot provocar una disminució de la qualitat de la reproducció en relació a l\\'ús del decodificador primari</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Aquesta alternativa allibera i reinstancia els còdecs de vídeo si hi ha un canvi de màscara en lloc de configurar-la directament al còdec. ExoPlayer ja ho aplica en alguns dispositius amb aquest problema. Aquesta configuració només té efecte en Android 6 i posteriors\\n\\nHabilitar aquest opció pot prevenir errors de reproducció en canviar el reproductor actual o en passar a pantalla completa</string>\n    <string name=\"channel_tab_tracks\">Pistes</string>\n    <string name=\"channel_tab_shorts\">Curts</string>\n    <string name=\"toggle_fullscreen\">Canvia a pantalla completa</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist\">Comparteix la llista de reproducció</string>\n    <string name=\"show_less\">Mostra menys</string>\n    <string name=\"audio_track_type_secondary\">secundària</string>\n    <string name=\"channel_tab_channels\">Canals</string>\n    <string name=\"no_feed_group_created_yet\">Encara no s\\'ha creat cap grup de continguts</string>\n    <string name=\"select_a_feed_group\">Tria un grup de continguts</string>\n    <string name=\"feed_group_page_summary\">Pàgina del grup de canals</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ckb/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">ئایا توانای بارکردن لاوازە؟ گەر وایە ئەوا بارکردنی خێرا تاقی بکەرەوە (دەتوانی بیگۆڕیت لە بەشی ڕێکخستنەکان لەڕێگای گرتەکردن لەم دوگمەیەی خوارەوە).\n\\n\n\\nئەم داوانامەیە دوو شێوازی بارکردنت بۆ پێشنیاز دەکات:\n\\n- بارکردنی تەواوی کەناڵە بەشدارییەکانت، ئەمەیان خاوە بەڵام تەواوە.\n\\n- تەرخانکردنی خزمەتگوزارییەکان ئەمەیان خێرایە بەڵام زۆر تەواو نییە.\n\\n\n\\nجیاوازی نێوان ئەم دووانە ئەوەیە کە خێراکە چەند زانیارییەکی وونە، وەکوو ماوەی هەر بڕگەیەک یان جۆرەکەی (ناتوانێت جیاوازی بکات لە نێوان ڤیدیۆی ڕاستەوخۆ و ئاسایی) لەوانەشە بڕگەی کەمتر باربکات.\n\\n\n\\nیوتیوب نموونەیە لەم خزمەتگوزارییە کە ڕێگەی خێرا بەکاردەبات بەهۆی پیشاندەری RSS.\n\\n\n\\nبۆیە هەڵژرادن بۆ خۆت دەگەڕێتەوە: زانیاری تەواو یان خێرا.</string>\n    <string name=\"app_license\">نیوپایپ نه‌رمه‌والایه‌كی سەرچاوە کراوەیە : دەتوانیت بەکاریبهێنیت، بیخوێنیتەوە، هاوبەشی پێبکەیت ،بەرەوپێشی ببەیت. بەتایبەتی دەتوانی دابەشیبکەیتەوە یاخوود بگۆڕیت بەپێی مەرجەکانی GNU مۆڵەتنامەی گشتی وەک نه‌رمه‌واڵایه‌كی بڵاوی خۆڕایی, بەهۆی وەشانی ٣ ی مۆڵەتنامە، یان هەر وەشانێکی دوواتر.</string>\n    <string name=\"info_labels\">چی:\\nداواكاری:\\nزمانی بابەت:\\nوڵاتی بابەت:\\nزمانی به‌رنامه‌:\\nخزمه‌تگوزاری:\\nGMT كات:\\nپاكێج:\\nوه‌شان:\\nOS وه‌شان:</string>\n    <string name=\"privacy_policy_encouragement\">پڕۆژەی نیوپایپ زانیارییە تایبەتییەکانت بە وردی دەپارێزێت. هەروەها به‌رنامه‌كه‌ هیچ زانایارییەکت بەبێ ئاگاداری تۆ بەکارنابات.\n\\n‫سیاسەتی تایبەتی نیوپایپ بە وردی ڕوونکردنەوەت دەداتێ لەسەر ئەو زانیاریانەی وەریاندەگرێت و بەکاریاندەبات.</string>\n    <string name=\"download_to_sdcard_error_message\">ناتوانرێت لە بیرگەی دەرەکیدا داببەزێنرێت . شوێنی فۆڵده‌ری دابه‌زاندنەکان ڕێکبخرێتەوە؟</string>\n    <string name=\"did_you_mean\">مەبەستت لە ئەمەیە ٪1$s ؟</string>\n    <string name=\"feed_update_threshold_title\">ماوەی نوێكردنه‌وه‌ی فیید</string>\n    <string name=\"grid\">هێڵەکی</string>\n    <string name=\"auto_queue_summary\">به‌رده‌وامبوون له‌ (به‌بێ دووباره‌كردنه‌وه‌) نۆبه‌تی کارپێکەر به‌پێی په‌خشی هاوشێوه‌</string>\n    <string name=\"enable_queue_limit\">سنووردانانی نۆرەی دابەزاندن</string>\n    <string name=\"error_insufficient_storage_left\">بیرگەی ناوەکیت پڕ بووە</string>\n    <string name=\"subscribers_count_not_available\">ژمارەی بەژداری نادیارە</string>\n    <string name=\"overwrite_failed\">ناتوانرێت لەسەر ئەو فایله‌وه‌ جێگیر بکرێت</string>\n    <string name=\"tab_choose\">په‌ڕه‌ هەڵبژێرە</string>\n    <string name=\"more_than_100_videos\">+١٠٠ ڤیدیۆیان</string>\n    <string name=\"settings_category_player_title\">لێده‌ر</string>\n    <string name=\"import_title\">هاوردە</string>\n    <string name=\"error_report_button_text\">سکاڵا لەسەر کێشە لەڕێگای ئیمێڵ</string>\n    <string name=\"name\">ناو</string>\n    <string name=\"error_postprocessing_failed\">چارەسەرکردن هه‌ره‌سی هێنا</string>\n    <string name=\"minimize_on_exit_title\">بچوکبوونەوە لەکاتی گۆڕینی به‌رنامه‌</string>\n    <string name=\"download_path_summary\">فایلی ڤیدیۆ داگیراوەکان لێرەدا هەڵدەگیرێن</string>\n    <string name=\"export_data_summary\">هەناردە کردنی مێژوو ، بەژدارییه‌كان ، خشته‌لێدانه‌كان و ڕێكخستنه‌كان</string>\n    <string name=\"use_inexact_seek_summary\">بردنەپێشی ناتەواوی خێرا وا لە لێدەرەکە دەکات کە بەخێرایی شوێنەکە بگۆڕێت. بردنەپێشی ٥ یان ١٥ یان ٢٥ چرکەیی لەگەڵ ئەمەدا کارناکات</string>\n    <string name=\"enable_disposed_exceptions_summary\">سکاڵاکردن لەسەر نەگەیاندنی Rx ی پەسەندنەکرا لە دەرەوەی پارچە یان چالاکی لەدوای پوختەکردن</string>\n    <string name=\"show_next_and_similar_title\">پیشاندانی ’دواتر’ و ڤیدیۆ ’هاوشێوەکان’</string>\n    <string name=\"resize_zoom\">هێنانەپێش</string>\n    <string name=\"saved_tabs_invalid_json\">پەڕە بنەڕەتییەکان بەکاردەبردرێن, ناتوانرێت پەڕە پاشەکەوتکراوەکان بخوێنرێنەوە</string>\n    <string name=\"delete_view_history_alert\">تەواوی مێژووی سەیرکراو بسڕدرێته‌وه‌؟</string>\n    <string name=\"clear_search_history_title\">سڕینەوەی مێژووی گەڕان</string>\n    <string name=\"msg_error\">هەڵە</string>\n    <string name=\"override_current_data\">ئەمە لەسەر ڕێکخستنەکانی ئێستات جێگیر دەبێت.</string>\n    <string name=\"notification_channel_name\">پەیامەکانی نیوپایپ</string>\n    <string name=\"donation_encouragement\">نیوپایپ لەلایەن چەند خۆبەخشێکەوە دروستکراوە کە کاته‌كانی خۆیان پێ بەخشیووە تاکو باشترین خزمەتگوزاریت پێشکەش بکەن. هیچ نەبێت بە کڕینی کوپێک قاوە یارمەتی گەشەپێدەرەکانمان بدە بۆ ئەوەی کاتی زیاتر تەرخان بکەین بۆ بەرەوپێشبردنی نیوپایپ.</string>\n    <string name=\"show_search_suggestions_title\">گەڕانی پێشنیارکراوەکان</string>\n    <string name=\"playback_tempo\">خێرا</string>\n    <string name=\"file_deleted\">فایل سڕایەوە</string>\n    <string name=\"feed_groups_header_title\">کۆمەڵەی کەناڵەکان</string>\n    <string name=\"msg_popup_permission\">ئەم دەسەڵاتە پێویستە بۆ\n\\nکردنەوەی له‌ دۆخی پەنجەرە</string>\n    <string name=\"paused\">وه‌ستێنراوه‌</string>\n    <string name=\"missions_header_pending\">لە نۆره‌دایه‌</string>\n    <string name=\"export_complete_toast\">هەناردەکرا</string>\n    <string name=\"settings_category_debug_title\">هەڵەدۆزی</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">پاشماوەی مێتاداتا سڕانەوە</string>\n    <string name=\"default_kiosk_page_summary\">کیۆسکی بنەڕەتی</string>\n    <string name=\"best_resolution\">باشترین قه‌باره‌</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s بەژداری</item>\n        <item quantity=\"other\">%s بەژدارییان</item>\n    </plurals>\n    <string name=\"show_higher_resolutions_title\">پیشاندانی قه‌باره‌ی به‌رزتر</string>\n    <string name=\"queued\">نۆبه‌تكراو</string>\n    <string name=\"generate_unique_name\">دانانی ناوی نوێ</string>\n    <string name=\"import_data_summary\">ده‌چه‌سپێت لەسەر مێژووی ئێستات، بەژدارییه‌كانت، خشته‌لێدانه‌كانت و ڕێكخستنه‌كانت</string>\n    <string name=\"restricted_video\">تەمەنت بۆ بینینی ئەم ڤیدیۆیە قه‌ده‌غه‌كراوه‌.\n\\n\n\\n%1$s كارا بكه‌ له‌ ڕێكخستنه‌كانه‌وه‌ گه‌ر ده‌ته‌وێت بیبینیت.</string>\n    <string name=\"clear_download_history\">سڕانەوەی مێژووی دابه‌زاندن</string>\n    <string name=\"just_once\">تەنیا ئێستا</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">كاراكردنی ”دۆخی قەدەغەکراو”ی یوتیوب</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA داواکاری</string>\n    <string name=\"settings_category_updates_title\">نوێکارییەکان</string>\n    <string name=\"error_http_unsupported_range\">ئەم ڕاژەیە ناتوانێت چەندین بابەت لە یەک کاتدا داببەزێنێت</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">كاراکردنی دۆخی خێرا</string>\n    <string name=\"minimize_on_exit_background_description\">بچوککردنەوەی ڤیدیۆ بۆ لێده‌ری پاشبنەما</string>\n    <string name=\"channel_unsubscribed\">به‌ژداریت نەما له‌ كه‌ناڵ</string>\n    <string name=\"player_stream_failure\">ناتوانرێت ئەم پەخشە لێبدرێت</string>\n    <string name=\"popup_remember_size_pos_title\">بیرهاتنه‌وه‌ی زانیارییه‌كانی په‌نجه‌ره‌</string>\n    <string name=\"player_recoverable_failure\">كێشه‌ی گێڕانه‌وه‌ له‌ لێده‌ر</string>\n    <string name=\"minimize_on_exit_none_description\">هیچ</string>\n    <string name=\"pause_downloads_on_mobile_desc\">بەسوودە بۆ کاتی گۆڕینی هێڵ بۆ ڕایەڵەی مۆبایل, لەگەڵ ئەوەشدا زۆربەی دابەزاندنەکان دواناخات</string>\n    <string name=\"website_title\">ماڵپەڕ</string>\n    <string name=\"enqueue\">نۆبه‌ت</string>\n    <string name=\"play_with_kodi_title\">لێدان به‌ Kodi</string>\n    <string name=\"error_unable_to_load_comments\">ناتوانرێت لێدوانەکان باربکرێن</string>\n    <string name=\"peertube_instance_add_help\">بەستەری دۆخ دابنێ</string>\n    <string name=\"download_path_audio_summary\">فایلی دەنگە داگیراوەکان لێرەدا هەڵدەگیرێن</string>\n    <string name=\"error_snackbar_message\">ببورە، هەندێك کێشە ڕوویدا.</string>\n    <string name=\"export_to\">هەناردە کردن بۆ</string>\n    <string name=\"settings_category_player_behavior_title\">ڕەفتار</string>\n    <string name=\"select_a_channel\">کەناڵێک دیار بکە</string>\n    <string name=\"downloads_storage_ask_title\">پرس بکرێت لەکوێ داببەزێنرێت</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s لەلایەن %2$s لەژێر %3$s</string>\n    <string name=\"title_licenses\">مۆڵەتنامەی لایەنی-سێیەم</string>\n    <string name=\"app_license_title\">مۆڵەتنامەی نیوپایپ</string>\n    <string name=\"show_hold_to_append_title\">پیشاندانی ڕێنمایی ”داگرتن تا پاشکۆ”</string>\n    <string name=\"msg_threads\">دابەشکراوەکان</string>\n    <string name=\"title_most_played\">زۆرترین لێدراو</string>\n    <string name=\"unbookmark_playlist\">لادانی نیشانه‌كراو</string>\n    <string name=\"tab_licenses\">مۆڵەتەکان</string>\n    <string name=\"subscription_update_failed\">ناتوانرێت به‌ژداریكردنه‌كه‌ نوێبكرێته‌وه‌</string>\n    <string name=\"controls_background_title\">پشت شاشە</string>\n    <string name=\"search_no_results\">بێ ئەنجامه‌</string>\n    <string name=\"remove_watched\">لادانی سەیرکراو</string>\n    <string name=\"enable_playback_state_lists_summary\">پیشاندانی نیشانەکەری شوێنی کارپێکەر لە خشتەکاندا</string>\n    <string name=\"enable_playback_state_lists_title\">شوێنەکان لە خشتەکاندا</string>\n    <string name=\"subscribed_button_title\">به‌ژداریتکرد</string>\n    <string name=\"caption_setting_description\">بەهۆی گۆڕانکاری لە شێوەی ژێرنووسکردنەکە. پێویستە به‌رنامه‌كه‌ دابگیرسێنیته‌وه‌</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d دیار کراوه‌</item>\n        <item quantity=\"other\">%d دیار کراون</item>\n    </plurals>\n    <string name=\"error_unknown_host\">ناتوانرێت ڕاژەكه‌ بدۆزرێتەوە</string>\n    <string name=\"settings_category_history_title\">مێژوو و پاشماوه‌</string>\n    <string name=\"settings_category_feed_title\">فیید</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s گوێبیست</item>\n        <item quantity=\"other\">%s گوێبیستان</item>\n    </plurals>\n    <string name=\"msg_running\">نیوپایپ داده‌به‌زێنێت</string>\n    <string name=\"channels\">کەناڵەکان</string>\n    <string name=\"action_history\">مێژوو</string>\n    <string name=\"subscriptions_export_unsuccessful\">ناتوانرێت بەژدارییەکان هه‌نارده‌ بکرێن</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">‫%s بینراو</item>\n        <item quantity=\"other\">‫%s بینراوان</item>\n    </plurals>\n    <string name=\"pause\">وەستاندن</string>\n    <string name=\"download_path_audio_dialog_title\">فۆڵدەری داگرتنی فایله‌ دەنگییەکان هەڵبژێرە</string>\n    <string name=\"feed_create_new_group_button_title\">نوێ</string>\n    <string name=\"clear_views_history_title\">سڕینەوەی مێژووی سەیرکراو</string>\n    <string name=\"enable_playback_resume_title\">بەردەوام بوونی کارپێکەر</string>\n    <string name=\"preferred_player_fetcher_notification_title\">دەستکەوتنی زانیاری…</string>\n    <string name=\"clear_search_history_summary\">مێژووی گەڕانە نوسراوه‌کانت دەسڕێتەوە</string>\n    <string name=\"what_happened_headline\">چی ڕوویدا:</string>\n    <string name=\"background_player_playing_toast\">لێدان لە پاشبنەما</string>\n    <string name=\"limit_data_usage_none_description\">بێ سنوور</string>\n    <string name=\"decline\">ڕەتکردنەوە</string>\n    <string name=\"show_error\">پیشاندانی کێشە</string>\n    <string name=\"feed_update_threshold_option_always_update\">هەرده‌م نوێ بكرێته‌وه‌</string>\n    <string name=\"subscriptions_import_unsuccessful\">ناتوانرێت بەژدارییەکان هاورده‌ بكرێنه‌وه‌</string>\n    <string name=\"settings_category_appearance_title\">دیمه‌ن</string>\n    <string name=\"import_data_title\">هاوردە كردنی داتابه‌یس</string>\n    <string name=\"enable_search_history_title\">مێژووی گه‌ڕان</string>\n    <string name=\"overwrite_finished_warning\">فایلێكی دابه‌زێنراو بەم ناوەوە بوونی هەیە</string>\n    <string name=\"detail_drag_description\">ڕاکێشان بۆ ڕیزكردنه‌وه‌</string>\n    <string name=\"play_queue_remove\">لادان</string>\n    <string name=\"always\">هه‌رده‌م</string>\n    <string name=\"read_full_license\">خوێندنه‌وه‌ی مۆڵەتنامە</string>\n    <string name=\"app_ui_crash\">بەرنامە/ڕووکار ڕاوەستا</string>\n    <string name=\"play_all\">لێدانی گشتی</string>\n    <string name=\"invalid_source\">هەمان فایل/بابەت بوونی نییە</string>\n    <string name=\"start\">دەستپێکردن</string>\n    <string name=\"subscribe_button_title\">به‌ژداریکردن</string>\n    <string name=\"show_play_with_kodi_title\">بژاردەی ”لێدان بە Kodi“ پیشانبدرێت</string>\n    <string name=\"tab_subscriptions\">به‌ژدارییه‌كان</string>\n    <string name=\"blank_page_summary\">پەڕەی بەتاڵ</string>\n    <string name=\"default_audio_format_title\">جۆری بنەڕەتی ده‌نگ</string>\n    <string name=\"charset_most_special_characters\">ڕه‌نووسه‌ زۆر تایبەتییەکان</string>\n    <string name=\"theme_title\">ڕووكار</string>\n    <string name=\"switch_to_main\">گۆڕین بۆ سەرەکی</string>\n    <string name=\"show_original_time_ago_summary\">دەقە بنچینەییەکان لە خزمەتگوزارییەکانەوە لە بابەتی پەخشەکاندا دیار دەبن</string>\n    <string name=\"download_dialog_title\">دابه‌زاندن</string>\n    <string name=\"caption_setting_title\">ژێرنووسەکان</string>\n    <string name=\"auto_queue_title\">خستنه‌ نۆبه‌تی-خۆكاری په‌خشی دواتر</string>\n    <string name=\"external_player_unsupported_link_type\">لێده‌ره‌ دەرەکییەکان پشتگیری ئەم جۆرە بەستەرانە ناکەن</string>\n    <string name=\"permission_denied\">کردار ڕەتکرایەوە لەلایەن سیستەمەوە</string>\n    <string name=\"controls_popup_title\">په‌نجه‌ره‌</string>\n    <string name=\"black_theme_title\">ڕه‌ش</string>\n    <string name=\"default_popup_resolution_title\">قه‌باره‌ی بنەڕەتی په‌نجه‌ره‌</string>\n    <string name=\"could_not_import_all_files\">ئاگاداربە: ناتوانرێت هەموو فایله‌كان هاوردە بكرێن .</string>\n    <string name=\"peertube_instance_url_summary\">ئارەزوومەندییەکانی دۆخی پێرتووب دیار بکە</string>\n    <string name=\"feed_oldest_subscription_update\">دواین نوێکردنەوەی فیید: %s</string>\n    <string name=\"stop\">ڕاگرتن</string>\n    <string name=\"list\">خشته‌یی</string>\n    <string name=\"start_downloads\">دەستپێکردنەوەی دابەزاندنەکان</string>\n    <string name=\"caption_none\">ژێرنووس نییە</string>\n    <string name=\"popup_playing_toast\">لێدان لە پەنجەرە</string>\n    <string name=\"no_views\">بینراو نییە</string>\n    <string name=\"invalid_file\">ئەو فایله‌ بوونی نییە یان دەسەڵاتی خوێندنەوە و نوسینی لاوازە</string>\n    <string name=\"parsing_error\">ناتوانرێت ماڵپەڕ شیبکرێتەوە</string>\n    <string name=\"settings_file_charset_title\">ڕه‌نووسه‌ ڕێپێدراوه‌كان له‌ فایله‌ ناوییه‌كاندا</string>\n    <string name=\"import_soundcloud_instructions_hint\">ئایدییەکەت ، soundcloud.com/yourid</string>\n    <string name=\"fragment_feed_title\">چی نوێ هه‌یه‌</string>\n    <string name=\"msg_running_detail\">كرتە بکە بۆ وردەکاری</string>\n    <string name=\"delete_playback_states_alert\">شوێنی هەموو کارپێکراوەکان بسڕدرێنەوە؟</string>\n    <string name=\"top_50\">باشترین ٥٠</string>\n    <string name=\"peertube_instance_add_https_only\">تەنها بەستەرەکانی https پشتگیریکراون</string>\n    <string name=\"error_ssl_exception\">پەیوەستبوونی پارێزراو هه‌ره‌سی هێنا</string>\n    <string name=\"remove_watched_popup_warning\">ئەو ڤیدیۆیانەی پێشتر سەیرت کردوون و دواتر زیادت کردوون بۆ خشتەلێدان لادەدرێن. \\nئایا دڵنیایت؟ ئەمە ناگەڕێنرێتەوە!</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">وێنۆچکەی سه‌روێنه‌ی کەناڵ</string>\n    <string name=\"import_settings\">دەتەوێت ڕێکخستنەکانیش هاوردە بكرینه‌وه‌؟</string>\n    <string name=\"no_player_found\">هیچ لێدەرێکی ڤیدیۆیی نه‌دۆزرایه‌وه‌. ده‌ته‌وێت VLC دابمەزرێنیت؟</string>\n    <string name=\"download_path_title\">فۆڵده‌ری داگرتنی ڤیدیۆ</string>\n    <string name=\"drawer_open\">کردنەوەی پلیکانە</string>\n    <string name=\"light_theme_title\">ڕووناك</string>\n    <string name=\"show_search_suggestions_summary\">ئەو پێشنیازکراوانە هەڵبژێرە کە پیشان دەدرێن لەکاتی گەڕاندا</string>\n    <string name=\"error_progress_lost\">کردارەکە هه‌ره‌سی هێنا, چونکە ئەو فایله‌ سڕاوەتەوە</string>\n    <string name=\"controls_add_to_playlist_title\">زیادی بکە بۆ</string>\n    <string name=\"no_subscribers\">به‌ژداری نییه‌</string>\n    <string name=\"peertube_instance_url_title\">دۆخی پێرتووب</string>\n    <string name=\"playlist_creation_success\">خشتەلێدان سازکرا</string>\n    <string name=\"unhook_checkbox\">سڕینەوەی بەستەر (ڕەنگە ببێتە هۆی تێکدان)</string>\n    <string name=\"channel_page_summary\">پەڕەی کەناڵەکان</string>\n    <string name=\"switch_to_background\">گۆڕین بۆ پاشبنەما</string>\n    <string name=\"infinite_videos\">∞ ڤیدیۆ</string>\n    <string name=\"use_inexact_seek_title\">بەکارهێنانی بردنەپێشی ناتەواوی خێرا</string>\n    <string name=\"error_occurred_detail\">هەڵەیەک ڕوویدا : %1$s</string>\n    <string name=\"download_path_dialog_title\">فۆڵده‌ری داگرتن بۆ فایلی ڤیدیۆکان هەڵبژێرە</string>\n    <string name=\"channel_created_by\">ساز کراوه‌ لەلایەن %s</string>\n    <string name=\"users\">بەکارهێنەران</string>\n    <string name=\"content\">بابەت</string>\n    <string name=\"use_external_video_player_title\">به‌كارهێنانی لێدەری ڤیدیۆی ده‌ره‌كی</string>\n    <string name=\"play_audio\">ده‌نگ</string>\n    <string name=\"show_original_time_ago_title\">پیشاندانی کاتی بنچینەیی پێشوو لەسەر بابەتەکان</string>\n    <string name=\"play_queue_stream_detail\">وردەکارییەکان</string>\n    <string name=\"peertube_instance_add_exists\">هەمان دۆخ کاراکراوە</string>\n    <string name=\"content_language_title\">زمانی بنەڕەتی بابەت</string>\n    <string name=\"tab_bookmarks\">خشتەلێدانه‌ نیشانەکراوەکان</string>\n    <string name=\"privacy_policy_title\">سیاسەتی تایبەتی نیوپایپ</string>\n    <string name=\"settings_category_downloads_title\">دابه‌زاندن</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">ناكاراکردنی دۆخی خێرا</string>\n    <string name=\"open_in_browser\">ئەم بڕگەی پێڕستە ڤیدیۆیەک یان ستریمێکی دەنگی دەکاتەوە لە وێبگەڕێکدا</string>\n    <string name=\"error_http_no_content\">ڕاژەکە هیچ داتایەک نانێرێت</string>\n    <string name=\"watch_history_states_deleted\">شوێنی کارپێکراوەکان سڕانەوە</string>\n    <string name=\"app_update_notification_channel_description\">پەیامەکانی وەشانە نوێیەکانی نیوپایپ</string>\n    <string name=\"show_higher_resolutions_summary\">تەنها چەند مۆبایلێک پشتگیری لێدانی ڤیدیۆی 2K/4K دەکەن</string>\n    <string name=\"notification_channel_description\">پەیامەکانی لێدەری نیوپایپ</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">لەهەندێ خزمەتگوزاریدا بەردەستە، بەزۆری خێراترینە بەڵام ڕەنگە هەندێک لە بابەتەکان زانیارییەکانیان ناتەواو بێت (وەک نەبوونی ماوە، جۆری بابەت ، نەبوونی پەخش)</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d چرکە</item>\n        <item quantity=\"other\">%d چرکان</item>\n    </plurals>\n    <string name=\"recovering\">دەگەڕێنرێتەوە</string>\n    <string name=\"autoplay_title\">لێدانی خۆکاری</string>\n    <string name=\"max_retry_msg\">زیاترین هەوڵدانه‌وه‌</string>\n    <string name=\"new_and_hot\">نوێ و چالاک</string>\n    <string name=\"download_already_running\">دابه‌زاندنێكی دیكه‌ت هەیە بەهەمان ناو</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s ڤیدیۆ</item>\n        <item quantity=\"other\">%s ڤیدیۆیان</item>\n    </plurals>\n    <string name=\"retry\">هەوڵدانەوە</string>\n    <string name=\"remove_watched_popup_title\">ڤیدیۆ سەیر کراوەکان لابدرێن؟</string>\n    <string name=\"playlists\">خشته‌لێدانه‌كان</string>\n    <string name=\"choose_instance_prompt\">دۆخێک هەڵبژێرە</string>\n    <string name=\"skip_silence_checkbox\">بردنەپێشەوەی خێرا لەکاتی بێدەنگکردن</string>\n    <string name=\"your_comment\">لێدوانەکەت (بە ئینگلیزی):</string>\n    <string name=\"show_play_with_kodi_summary\">بژارده‌ی لێدانی ڤیدیۆ به‌ناوه‌ندی میدیایی Kodi پیشان ده‌درێت</string>\n    <string name=\"overwrite_unrelated_warning\">فایلێك بەهەمان ناو بوونی هەیە</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d ڕۆژ</item>\n        <item quantity=\"other\">%d ڕۆژان</item>\n    </plurals>\n    <string name=\"rename_playlist\">ناولێنانه‌وه‌</string>\n    <string name=\"download\">داگرتن</string>\n    <string name=\"ok\">باشە</string>\n    <string name=\"metadata_cache_wipe_title\">سڕینه‌وه‌ی پاشماوەی مێتاداتا</string>\n    <string name=\"error_download_resource_gone\">ناتوانرێت ئەمه‌ داببه‌زێنرێته‌وه‌</string>\n    <string name=\"unsubscribe\">بەژدارنەبوون</string>\n    <string name=\"video_streams_empty\">هیچ پەخشێکی ڤیدیۆیی نەدۆزرایەوە</string>\n    <string name=\"import_from\">هاوردە لە</string>\n    <string name=\"subtitle_activity_recaptcha\">كرتە بکە لەسەر ”كرا” کاتێك کە چارەسەرکرا</string>\n    <string name=\"app_update_notification_channel_name\">پەیامی نوێکردنەوەی بەرنامە</string>\n    <string name=\"could_not_load_thumbnails\">ناتوانرێت هەموو وێنۆچکەکان باربکرێن</string>\n    <string name=\"previous_export\">هەناردەی پێشووتر</string>\n    <string name=\"no_valid_zip_file\">فایلی ZIP دروست نییە</string>\n    <string name=\"disabled\">ناكارایه‌</string>\n    <string name=\"contribution_title\">بەشداریکردن</string>\n    <string name=\"dismiss\">پشتگوێخستن</string>\n    <string name=\"downloads_title\">دابه‌زاندنه‌كان</string>\n    <string name=\"contribution_encouragement\">هەرکاتێك بیرۆکەیەکت هەبوو وەک ; وەرگێڕان، گۆڕینی دیزاین ، سڕینەوەی کۆد ،یان هەر گۆڕانکارییەکی دیكه‌ ئەوا یارمەتییەکەت لەسەرچاوانمانە. ئێمە هەمیشە دەمانەوێ به‌رنامه‌كه‌ زیاتر بەرەوپێشه‌وه‌ ببەین!</string>\n    <string name=\"playlist_add_stream_success\">خشته‌لێدان كرا</string>\n    <string name=\"show_age_restricted_content_title\">پیشاندانی سنوری تەمەن بۆ بابەت</string>\n    <string name=\"no_comments\">لێدوان نییە</string>\n    <string name=\"seek_duration_title\">ماوەی خێرا بردنە پێشەوە\\\\ گێڕانەوە بۆ دواوە</string>\n    <string name=\"undo\">گەڕانەوە</string>\n    <string name=\"overwrite\">جێگیركردن</string>\n    <string name=\"error_path_creation\">فۆڵده‌ری مەبەست ناتوانرێت ساز بکرێت</string>\n    <string name=\"error_timeout\">هێڵی ئینتەرنێت نەما</string>\n    <string name=\"clear_playback_states_summary\">شوێنی هەموو کارپێکراوەکان دەسڕێتەوە</string>\n    <string name=\"delete_item_search_history\">دەتەوێت ئەم بابەتە لە مێژووی گەڕان بسڕدرێتەوە؟</string>\n    <string name=\"confirm_prompt\">ئایا دەتەوێ مێژووی دابەزاندنەکانت بسڕدرێنەوە یاخوود هەموو فایلە دابەزێنراوەکان بسڕدرێنەوە؟</string>\n    <string name=\"show_info\">پیشاندانی زانیاری</string>\n    <string name=\"download_already_pending\">دابه‌زاندنێكی دیكه‌ له‌ نۆره‌دایه‌ بەهەمان ناو</string>\n    <string name=\"feed_group_dialog_empty_selection\">هیچ بەژدارییەک دیار نەکراوە</string>\n    <string name=\"feed_group_dialog_empty_name\">ناوی کۆمەڵە بەتاڵە</string>\n    <string name=\"done\">كرا</string>\n    <string name=\"detail_likes_img_view_description\">بەدڵه‌كان</string>\n    <string name=\"popup_remember_size_pos_summary\">بیرهاتنه‌وه‌ی كۆتا قه‌باره‌ و شوێنی په‌نجه‌ره‌</string>\n    <string name=\"create\">سازکردن</string>\n    <string name=\"import_network_expensive_warning\">ئەوە بزانە ئەم کردارە پێویستی بە هێڵێکی گران هەیە. \n\\n \n\\nدەتەوێ بەردەوامبیت؟</string>\n    <string name=\"all\">گشتی</string>\n    <string name=\"close\">داخستن</string>\n    <string name=\"auto\">خۆکاری</string>\n    <string name=\"audio\">دەنگ</string>\n    <string name=\"export_ongoing\">هەناردە دەکرێت…</string>\n    <string name=\"error_details_headline\">وردەکارییەکان:</string>\n    <string name=\"no_streams_available_download\">هیچ پەخشێک نییە بۆ دابه‌زاندن</string>\n    <string name=\"feed_subscription_not_loaded_count\">بارنەکراو : %d</string>\n    <string name=\"preferred_player_fetcher_notification_message\">بابەتی داواکراو باردەکرێت</string>\n    <string name=\"clear_views_history_summary\">مێژوو دەسڕێتەوە لەگەڵ په‌خشه‌ لێدراوه‌كان و شوێنی کارپێکەر</string>\n    <string name=\"caption_auto_generated\">دانان-خۆکار</string>\n    <string name=\"one_item_deleted\">١ بابەت سڕایەوە.</string>\n    <string name=\"preferred_open_action_settings_summary\">کرداری بنەڕەتی لەکاتی کردنەوەی بابەتدا — %s</string>\n    <string name=\"select_a_kiosk\">هکیۆسکێک دیار بکە</string>\n    <string name=\"conferences\">کۆنفرانسەکان</string>\n    <string name=\"open_in_popup_mode\">كردنه‌وه‌ له‌ دۆخی په‌نجه‌ره‌</string>\n    <string name=\"limit_mobile_data_usage_title\">سنووری قەبارە لەکاتی بەکارهێنانی ڕایه‌ڵه‌ی مۆبایل</string>\n    <string name=\"drawer_close\">داخستنی پلیکانە</string>\n    <string name=\"settings_category_clear_data_title\">سڕینەوەی داتا</string>\n    <string name=\"duration_live\">زیندوو</string>\n    <string name=\"no_channel_subscribed_yet\">هیچ کەناڵێکی بەژداری نییە</string>\n    <string name=\"pause_downloads_on_mobile\">پچڕاندن له‌سه‌ر تۆڕی سنووردار</string>\n    <string name=\"subscription_change_failed\">ناتوانیت گۆڕانكاری له‌م به‌ژدارییه‌دا بكه‌یت</string>\n    <string name=\"default_resolution_title\">قه‌باره‌ی بنەڕەتی</string>\n    <string name=\"minimize_on_exit_popup_description\">بچووککردنەوە بۆ پەنجەرە</string>\n    <string name=\"songs\">گۆرانییەکان</string>\n    <string name=\"controls_download_desc\">داگرتنی فایلی پەخش</string>\n    <string name=\"list_view_mode\">شێوازی پیشاندانی خشتە</string>\n    <string name=\"peertube_instance_add_title\">زیادکردنی دۆخ</string>\n    <string name=\"accept\">پەسەند</string>\n    <string name=\"delete_playlist_prompt\">ئەم خشتەلێدانه‌ بسڕدرێتەوە؟</string>\n    <string name=\"mute\">بێدەنگکردن</string>\n    <string name=\"website_encouragement\">سەردانی ماڵپەڕی نیوپایپ بکە بۆ زانیاری و هەواڵی نوێ.</string>\n    <string name=\"app_description\">به‌رنامه‌یه‌كی خۆڕایی و کێشکەم بۆ پەخش لەسەر ئەندرۆید.</string>\n    <string name=\"content_not_available\">بابەت به‌رده‌ست نییە</string>\n    <string name=\"peertube_instance_url_help\">ئەو دۆخانە بدۆزەرەوە کە لەگەڵ خۆتدا دەگونجێن لە %s</string>\n    <string name=\"file\">فایل</string>\n    <string name=\"error_http_not_found\">نەدۆزرایەوە</string>\n    <string name=\"post_processing\">چارەسەردەکرێت</string>\n    <string name=\"main_page_content\">بابەتی پەڕەی سەرەکی</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">دیار کردنی بەژدارییەکان</string>\n    <string name=\"import_file_title\">هاورده‌كردنی فایل</string>\n    <string name=\"download_path_audio_title\">فۆڵده‌ری داگرتنی ده‌نگ</string>\n    <string name=\"use_external_video_player_summary\">هه‌ندێك له‌ قه‌باره‌كان ده‌نگیان تێدا نامێنێته‌وه‌</string>\n    <string name=\"events\">ڕووداوەکان</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">وێنۆچکەی کەسی بەرزکەرەوە</string>\n    <string name=\"import_complete_toast\">هاورده‌كرا</string>\n    <string name=\"downloads\">دابه‌زاندنه‌كان</string>\n    <string name=\"playback_speed_control\">کۆنترۆڵی خێرایی کارپێکەر</string>\n    <string name=\"feed_group_dialog_delete_message\">ئایا دەتەوێت ئەم کۆمەڵەیە بسڕیتەوە؟</string>\n    <string name=\"hold_to_append\">په‌نجه‌ڕاگرتن له‌سه‌ری بۆ نۆبه‌ت نه‌بوون</string>\n    <string name=\"max_retry_desc\">زۆرترین ژمارەی هەوڵدان پێش پاشگەزبوونەوە لە دابەزاندنەکە</string>\n    <string name=\"general_error\">هەڵه‌</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">بەڵێ، لەگەڵ ڤیدیۆ سەیر کراوەکانەوە</string>\n    <string name=\"start_here_on_popup\">دەستپێکردنی لێدان لە پەنجەرەوه‌</string>\n    <string name=\"detail_dislikes_img_view_description\">نابەدڵه‌كان</string>\n    <string name=\"title_activity_history\">مێژوو</string>\n    <string name=\"checksum\">تاقیکردنەوەی هێڵێک</string>\n    <string name=\"permission_display_over_apps\">دەسەڵاتی پێبدە بۆ پیشاندان لەسەرووی به‌رنامه‌كانی دیكه‌وه‌</string>\n    <string name=\"watch_history_deleted\">مێژووی سەیرکراو سڕایەوە</string>\n    <string name=\"playback_step\">هەنگاو</string>\n    <string name=\"msg_wait\">تکایە چاوەڕوان بە…</string>\n    <string name=\"read_privacy_policy\">خوێندنەوەی سیاسەتی تایبەتی</string>\n    <string name=\"delete_downloaded_files\">فایلە دابەزێنراوەکان بسڕدرێنەوە</string>\n    <string name=\"sorry_string\">ببوورە، ناتوانرێت ئەوە ڕووبدات.</string>\n    <string name=\"resize_fill\">پڕكردنه‌وه‌ بە ڕونما</string>\n    <string name=\"popup_player\">لێده‌ری پەنجەرە</string>\n    <string name=\"playback_reset\">ڕێکخستنەوە</string>\n    <string name=\"export_data_title\">هەناردە کردنی داتابه‌یس</string>\n    <string name=\"dark_theme_title\">تاریک</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">تێکەڵکردن لە فییدی تەرخانکراوەوە کاتێ بەردەست بوو</string>\n    <string name=\"download_failed\">ناتوانرێت داببه‌زێنرێت</string>\n    <string name=\"error_connect_host\">ناتوانرێت بە ڕاژەكه‌وە پەیوەست ببیت</string>\n    <string name=\"detail_thumbnail_view_description\">لێدانی ڤیدیۆ، مه‌ودا:</string>\n    <string name=\"most_liked\">زۆرترین بەدڵ</string>\n    <string name=\"delete\">سڕینەوە</string>\n    <string name=\"default_video_format_title\">جۆری بنەڕەتی ڤیدیۆ</string>\n    <string name=\"empty_list_subtitle\">هیچ شتێک لێرەدا نییە</string>\n    <string name=\"clear\">سڕینەوە</string>\n    <string name=\"invalid_directory\">هەمان فۆڵدەر بوونی نییە</string>\n    <string name=\"bookmark_playlist\">نیشانه‌كردنی خشته‌لێدان</string>\n    <string name=\"file_name_empty_error\">ناوی فایل ناکرێت بەتاڵ بێت</string>\n    <string name=\"updates_setting_description\">پیشاندانی پەیامێک بۆ ئامادەبوونی به‌رنامه‌ لەکاتی بەردەست بوونی وەشانی نوێ</string>\n    <string name=\"enable_watch_history_title\">مێژووی سەیرکردن</string>\n    <string name=\"enable_disposed_exceptions_title\">سکاڵا لەسەر کێشەکان</string>\n    <string name=\"playlist_no_uploader\">خۆکار-دانراو (هیچ بەرزکەرەوەیەک نەدۆزرایەوە)</string>\n    <string name=\"start_here_on_background\">دەستپێکردنی لێدان لە پاشبنەماوە</string>\n    <string name=\"msg_name\">ناوفایل</string>\n    <string name=\"set_as_playlist_thumbnail\">دانان لەسەر وێنۆچکەی خشتەلێدان</string>\n    <string name=\"title_activity_about\">دەربارەی NewPipe</string>\n    <string name=\"add_to_playlist\">زیادکردن بۆ خشتەلێدان</string>\n    <string name=\"unknown_content\">(نەزانراو)</string>\n    <string name=\"app_language_title\">زمانی به‌رنامه‌</string>\n    <string name=\"kiosk_page_summary\">پەڕەی کیۆسک</string>\n    <string name=\"resume_on_audio_focus_gain_title\">دەستپێکردنەوەی لێدان</string>\n    <string name=\"missing_file\">فایل نێردراوه‌ یان سڕاوەتەوە</string>\n    <string name=\"settings_file_replacement_character_summary\">ڕه‌نووسه‌ نادروستەکان بەم بەهایە جێگۆڕکێ دەکرێن</string>\n    <string name=\"search\">گه‌ڕان</string>\n    <string name=\"restore_defaults\">گێڕانەوە بۆ بنەڕەتی</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA داواکراوە</string>\n    <string name=\"switch_to_popup\">گۆڕین بۆ پەنجەرە</string>\n    <string name=\"preferred_open_action_settings_title\">کرداری ’کردنەوە’ی پێشنیارکراو</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d خولەک</item>\n        <item quantity=\"other\">%d خولەكان</item>\n    </plurals>\n    <string name=\"feed_processing_message\">فیید ئامادە ده‌كرێت…</string>\n    <string name=\"albums\">ئەلبوومەکان</string>\n    <string name=\"no_videos\">ڤیدیۆ نییە</string>\n    <string name=\"video_detail_by\">لەلایەن %s</string>\n    <string name=\"main_page_content_summary\">چ پەڕەیەک پیشان بدرێت لە پەڕەی سەرەکیدا</string>\n    <string name=\"error_snackbar_action\">سكاڵا</string>\n    <string name=\"always_ask_open_action\">هه‌رده‌م بپرسە</string>\n    <string name=\"enable_watch_history_summary\">هێشتنەوەی تراکی ڤیدیۆ سەیرکراوەکان</string>\n    <string name=\"use_external_audio_player_title\">به‌كارهێنانی لێدەری ده‌نگی ده‌ره‌كی</string>\n    <string name=\"view_on_github\">بینین لە GitHub</string>\n    <string name=\"what_device_headline\">زانیاری:</string>\n    <string name=\"no_player_found_toast\">هیچ لێدەرێکی ڤیدیۆیی نەدۆزرایەوە (دەتوانیت لێدەری VLC دامەزرێنیت) .</string>\n    <string name=\"player_unrecoverable_failure\">كێشه‌ی نەگێڕانەوەی لێده‌ر ڕوویدا</string>\n    <string name=\"import_ongoing\">هاورده‌ ده‌كرێت…</string>\n    <string name=\"share_dialog_title\">هاوبه‌شپێكردن له‌گه‌ڵ</string>\n    <string name=\"drawer_header_description\">چه‌سپانی خزمەتگوزاری، دیار کراوی ئێستا:</string>\n    <string name=\"delete_search_history_alert\">تەواوی مێژووی گەڕانەکانت بسڕدرێنەوە؟</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">بەردەوام بوون له‌ لێدان لەدوای هەبوونی هەر پچڕانێك(وەک پەیوەندی تەلەفۆنی)</string>\n    <string name=\"main_bg_subtitle\">کرته‌ بكه‌ بۆ ده‌ستپێكردن.</string>\n    <string name=\"enable_search_history_summary\">مێژووی گه‌ڕانه‌كان له‌ بیرگه‌دا كۆگا ده‌كرێن</string>\n    <string name=\"settings_category_video_audio_title\">ڤیدیۆ و دەنگ</string>\n    <string name=\"share\">هاوبه‌شپێكردن</string>\n    <string name=\"audio_streams_empty\">پەخشی هیچ دەنگێک نەدۆزرایەوە</string>\n    <string name=\"artists\">هونەرمەندەکان</string>\n    <string name=\"no_one_watching\">کەس سه‌یری ناکات</string>\n    <string name=\"no_available_dir\">تکایە دواتر فۆڵده‌رێك بۆ شوێنی دابه‌زاندن دیاری بکە لە ڕێکخستنەکاندا</string>\n    <string name=\"feed_notification_loading\">فیید بارده‌كرێت…</string>\n    <string name=\"new_seek_duration_toast\">بەهۆی ExoPlayer ەوە ماوەی بردنەپێش و بردنەپاش لە %d چرکەدا دیاریکرا</string>\n    <string name=\"clear_playback_states_title\">سڕینەوەی شوێنەکانی کارپێکەر</string>\n    <string name=\"recently_added\">لەم ماوەیەدا بڵاوکرابێتەوە</string>\n    <string name=\"rename\">ناولێنانه‌وه‌</string>\n    <string name=\"background_player\">لێده‌ری پاشبنەما</string>\n    <string name=\"error_file_creation\">ناتوانرێت ئه‌و فایله‌ ساز بکرێت</string>\n    <string name=\"give_back\">پێدانەوە</string>\n    <string name=\"create_playlist\">خشتەلێدانی نوێ</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d کاتژمێر</item>\n        <item quantity=\"other\">%d کاتژمێران</item>\n    </plurals>\n    <string name=\"upload_date_text\">بڵاوكراوه‌ته‌وه‌ له‌ %1$s</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">پاشماوه‌ی وێنە‌كان سڕایه‌وه‌</string>\n    <string name=\"settings_file_replacement_character_title\">ڕه‌نووسی جێگۆڕین</string>\n    <string name=\"settings\">ڕێكخستنه‌كان</string>\n    <string name=\"missions_header_finished\">دابه‌زێنراو</string>\n    <string name=\"import_youtube_instructions\">بۆ هاورده‌كردنی بەژداربوونەکانی یوتوب له‌ گووگڵه‌وه‌:\n\\n\n\\n1. ئەم بەستەرە بکەرەوە: %1$s\n\\n2. بچۆرەژوورەوە گەر داوای‌ کرد\n\\n3. كرته‌ بكه‌ له‌ \\\"All data included\\\"، پاشان كرته‌ بكه‌ له‌ \\\"Deselect all\\\" ، پاشان ته‌نیا \\\"subscriptions\\\" هه‌ڵبژێره‌ پاشان كرته‌ له‌ \\\"OK\\\" بكه‌\n\\n4. كرته‌ بكه‌ له‌ \\\"Next step\\\" و دواتر له‌ \\\"Create export\\\"\n\\n5. كرته‌ بكه‌ له‌ \\\"Download\\\" دوای دەرکەوتنی\n\\n6. له‌ فایلی دابه‌زێنراودا فایلی .json ئێكستراكت بكه‌ و لێره‌دا هاورده‌ی بكه‌.</string>\n    <string name=\"systems_language\">به‌پێی سیستەم</string>\n    <string name=\"network_error\">کێشە لە هێڵەکەتدا هەیە</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s سه‌یر دەکات</item>\n        <item quantity=\"other\">%s سه‌یر دەکەن</item>\n    </plurals>\n    <string name=\"error_report_title\">هەڵە لە سكاڵا</string>\n    <string name=\"metadata_cache_wipe_summary\">سڕینەوەی پاشماوەی هەموو ماڵپه‌ڕه‌كان</string>\n    <string name=\"kore_not_found\">بەرنامەکە نه‌دۆزرایه‌وه‌. دابمه‌زرێت؟</string>\n    <string name=\"peertube_instance_add_fail\">ناتوانرێ پشتگیری دۆخەکە بکرێ</string>\n    <string name=\"install\">دابەزاندن</string>\n    <string name=\"videos_string\">ڤیدیۆکان</string>\n    <string name=\"unsupported_url\">بەستەرەکە پشتگیری نەکراوە</string>\n    <string name=\"playback_pitch\">قیڕ</string>\n    <string name=\"minimize_on_exit_summary\">چی بكرێت دوای ئه‌وه‌ی له‌ به‌رنامه‌كه‌ ده‌رده‌چیت — %s</string>\n    <string name=\"msg_copied\">لەبەرگیرایەوە</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\\"Storage Access Framework\\\" ڕێدەدات بە دابەزاندنی بابەت لە بیرگەی دەرەکیدا</string>\n    <string name=\"resize_fit\">پڕ به‌ ڕوونما</string>\n    <string name=\"enable_leak_canary_summary\">چاودێری دزەکردنی بیرگە ڕەنگە ببێتە هۆی وەڵامنەدانەوەی لەکاتی گەرمبوون</string>\n    <string name=\"unmute\">بێدەنگ نەکردن</string>\n    <string name=\"local\">نێوخۆ</string>\n    <string name=\"trending\">پڕبینەرەکان</string>\n    <string name=\"enable_queue_limit_desc\">لەیەک کاتدا تەنیا یەک بابەت دادەبەزێنرێت</string>\n    <string name=\"restore_defaults_confirmation\">دەتەوێت بگەڕێنرێتەوە بۆ شێوازی بنەڕەتی؟</string>\n    <string name=\"pause_downloads\">وەستاندنی دابەزاندنەکان</string>\n    <string name=\"tab_about\">دەربارە و پرسیارەکان</string>\n    <string name=\"show_comments_title\">پیشاندانی لێدوانەکان</string>\n    <string name=\"start_accept_privacy_policy\">بۆ جێبەجێکردنی فرمانەکان لەگەڵ یاسای پاراستنی داتای گشتی ئەوروپیدا (GDPR) , ئێمە سەرنجت ڕادەکێشین بۆ سیاسەتە تایبەتییەکانی نیوپایپ. تکایە بەئاگادارییەوە بیخوێنەره‌وە.\n\\nپێویستە په‌سه‌ندی بکەیت بۆ ناردنی سکاڵاکانت.</string>\n    <string name=\"content_not_supported\">ئەم بابەتە هێشتا پشتگیری نەکراوە لەلایەن نیوپایپەوە.\n\\n\n\\nخوازیارین کە بتوانین لە وەشانەکانی داهاتوودا پشتگیری بکەین.</string>\n    <string name=\"donation_title\">بەخشین</string>\n    <string name=\"no_one_listening\">كه‌س گوێبیستی نییه‌</string>\n    <string name=\"search_history_deleted\">مێژووی گەڕانەکانت سڕانەوە</string>\n    <string name=\"video\">ڤیدیۆ</string>\n    <string name=\"error_postprocessing_stopped\">نیوپایپ داخرا لەکاتی کارکردن لەسەر ئەو فایله‌دا</string>\n    <string name=\"video_player\">لێده‌ری ڤیدیۆیی</string>\n    <string name=\"show_comments_summary\">ناكاراکردن بۆ پیشان نەدانی لێدوانەکان</string>\n    <string name=\"downloads_storage_use_saf_title\">بەکارهێنانی هەڵبژێرەری فۆڵدەری سیستەم (SAF)</string>\n    <string name=\"feed_update_threshold_summary\">کاتی دوای دواین نوێکردنەوە پێش بەژداربوون ڕەچاوکراوە — %s</string>\n    <string name=\"download_to_sdcard_error_title\">بیرگەی دەرەکی بەردەست نییە</string>\n    <string name=\"enable_playback_resume_summary\">گێڕانەوەی کارپێکەر بۆ شوێنی پێشووتر</string>\n    <string name=\"cancel\">هەڵوەشاندنەوه</string>\n    <string name=\"tracks\">تراکەکان</string>\n    <string name=\"play_queue_audio_settings\">ڕێکخستنەکانی دەنگ</string>\n    <string name=\"downloads_storage_ask_summary\">پرست پێ دەکرێت بۆ شوێنی دابەزاندنی هەر بابەتێک.\n\\nهەڵبژێرەری فۆڵدەری سیستەم کارابکە (SAF) گەر دەتەوێت بابەتەکانت لە بیرگەی دەرەکیدا داببەزێنرێن</string>\n    <string name=\"title_last_played\">دواین لێدراو</string>\n    <string name=\"could_not_setup_download_menu\">ناتوانرێ لیستی دابه‌زاندن دابنرێت</string>\n    <string name=\"app_update_available_notification_title\">وەشانی نوێی نیوپایپ بەردەستە!</string>\n    <string name=\"playlist_thumbnail_change_success\">وێنۆچکەی خشتەلێدان گۆڕدرا.</string>\n    <string name=\"import_soundcloud_instructions\">هێنانەوەی پەڕەی کەسی SoundCloud بەدانانی بەستەر یاخوود ئایدی: \n\\n \n\\n1. دۆخی ”Desktop mode” لە وێبگەرەکەتدا چالاک بکە (ئەم ماڵپەڕە بۆ وێبگەری مۆبایلەکان بەردەست نییە) \n\\n2. ئەم بەستەرە بکەرەوە : %1$s \n\\n3. بچۆرە ژوورەوە گەر داواکرا \n\\n4. بەستەری پەڕەی کەسییەکەت دابنێ.</string>\n    <string name=\"charset_letters_and_digits\">پیت و ژمارەکان</string>\n    <string name=\"default_content_country_title\">بابەتی وڵاتی بنەڕەتی</string>\n    <string name=\"updates_setting_title\">نوێکارییەکان</string>\n    <string name=\"playlist_page_summary\">پەڕەی خشته‌لێدان</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">تەنیا به‌ژداریییه‌ كۆمه‌ڵه‌ نەکراوەکان پیشان بدرێن</string>\n    <string name=\"never\">هەرگیز</string>\n    <string name=\"wifi_only\">تەنیا لەسەر وای-فای</string>\n    <string name=\"autoplay_summary\">ده‌ستپێكردنی كارپێكه‌ر به‌خۆكارانه‌ — %s</string>\n    <string name=\"title_activity_play_queue\">لێدانی نۆبه‌ت</string>\n    <string name=\"no_playlist_bookmarked_yet\">هیچ خشته‌لێدانێك نیشانه‌ نه‌كراوه‌</string>\n    <string name=\"select_a_playlist\">خشته‌لێدانێک دیار بکە</string>\n    <string name=\"error_report_open_github_notice\">تكایه‌ پشكنینێك بكه‌ كه‌ ئاخۆ كێشه‌یه‌ك هه‌یه‌ باسی كڕاشه‌كه‌ت بكات. له‌كاتی سازدانی پلیتی لێكچوو ، كات له‌ ئێمه‌ ده‌گریت كه‌ ئێمه‌ سه‌رقاڵی چاره‌سه‌ركردنی هه‌مان كێشه‌ ده‌كه‌یت.</string>\n    <string name=\"error_report_open_issue_button_text\">سكاڵا لەسەر GitHub</string>\n    <string name=\"copy_for_github\">له‌به‌رگرتنه‌وه‌ی سكاڵای جۆركراو</string>\n    <string name=\"unsupported_url_dialog_message\">ناتوانرێت به‌سته‌ره‌كه‌ بناسرێتەوە. بە بەرنامەیەکی دیكه‌ بکرێتەوە؟</string>\n    <string name=\"auto_queue_toggle\">خستنه‌ نۆبه‌تی-خۆكاری</string>\n    <string name=\"clear_queue_confirmation_description\">نۆبه‌ته‌كه‌ لە لێدەری چالاکەوە جێگۆڕکێی دەکرێت</string>\n    <string name=\"clear_queue_confirmation_summary\">دوای گۆڕین لە لێدەرێکەوە بۆ لێدەرێکی دیكه‌ لەوانەیە جێگۆڕکێی به‌ نۆبه‌ته‌كه‌ بكات</string>\n    <string name=\"clear_queue_confirmation_title\">داوای دڵنیابوون بکە پێش ئەوەی نۆبه‌تێك بسڕینەوە</string>\n    <string name=\"notification_action_nothing\">هیچیان</string>\n    <string name=\"notification_action_buffering\">نێوانگری</string>\n    <string name=\"notification_action_shuffle\">تێکەڵکردن</string>\n    <string name=\"notification_action_repeat\">دووبارە</string>\n    <string name=\"notification_actions_at_most_three\">دەتوانیت تا سێ كردار دیار بكه‌یت تا پیشان بدرێن له‌ پەیامەکەدا!</string>\n    <string name=\"notification_actions_summary\">دەستکاریکردنی هەر کردارێکی ئاگادارکەرەوە لە خوارەوە بە دەستلێدان. ۳- دانە هەڵبژێرە لە ڕێگەی بەکارهێنانی سندوقەبچوکەکە لای ڕاستەوە نیشان دەدرێت</string>\n    <string name=\"notification_action_4_title\">پێنجه‌م كرداری دوگمه‌</string>\n    <string name=\"notification_action_3_title\">چواره‌م كرداری دوگمه‌</string>\n    <string name=\"notification_action_2_title\">سێیه‌م كرداری دوگمه‌</string>\n    <string name=\"notification_action_1_title\">دووه‌م كرداری دوگمه‌</string>\n    <string name=\"notification_action_0_title\">یه‌كه‌م كرداری دوگمه‌</string>\n    <string name=\"notification_scale_to_square_image_summary\">وێنۆچكه‌ی ڤیدیۆ دەبڕدرێت له‌ پەیامەکاندا له‌ ڕه‌هه‌ندی 16:9 ه‌وه‌ بۆ ڕه‌هه‌ندی 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">بڕینی وێنۆچكه‌ بۆ ڕه‌هه‌ندی ڕێژەیی 1:1</string>\n    <string name=\"search_showing_result_for\">پیشاندانی ئەنجامەکانی: %s</string>\n    <string name=\"open_with\">كردنه‌وه‌ له‌</string>\n    <string name=\"show_meta_info_summary\">ناكارایبكه‌ بۆ شاردنه‌وه‌ی چوارگۆشه‌ی مێتا و زانیاری زیاده‌ له‌سه‌ر بابەتی په‌خش و داواكاری گه‌ڕان</string>\n    <string name=\"show_meta_info_title\">پیشاندانی زانیاری مێتا</string>\n    <string name=\"show_description_summary\">ناكارایبكه‌ بۆ شاردنه‌وه‌ی دیسکریپشن له‌سه‌ر ڤیدیۆ و زانیاری زیاتر</string>\n    <string name=\"show_description_title\">پیشاندانی دیسکریپشن</string>\n    <string name=\"night_theme_title\">ڕووكاری تاریک</string>\n    <string name=\"notification_colorize_summary\">ئه‌ندرۆید ڕه‌نگی پەیام دڵخواز ده‌كات به‌پێی ڕه‌نگی سه‌ره‌كی وێنۆچكه‌كه‌ ( ڕه‌چاوی ئه‌وه‌ بكه‌ كه‌ ئه‌م تایبه‌تمه‌ندییه‌ هه‌موو ئامێرێك ناگرێته‌وه‌ )</string>\n    <string name=\"notification_colorize_title\">ڕه‌نگكردنی پەیام</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">یوتوب ”دۆخی قه‌ده‌غه‌كراو” پێشكه‌ش ده‌كات كه‌ بابەتە نه‌شیاوه‌كان ده‌شارێته‌وه‌</string>\n    <string name=\"msg_calculating_hash\">ئه‌ژماركردنی هاش</string>\n    <string name=\"comments_are_disabled\">لێدوانه‌كان ناكاراكراون</string>\n    <string name=\"description_tab_description\">دیسکریپشن</string>\n    <string name=\"related_items_tab_description\">بابه‌ته‌ هاوشێوه‌كان</string>\n    <string name=\"comments_tab_description\">لێدوانه‌كان</string>\n    <string name=\"restricted_video_no_stream\">ته‌مه‌ن بۆ ئه‌م ڤیدیۆیه‌ سنورداره‌.\n\\nله‌سایه‌ی سیاسه‌ته‌ نوێیه‌كانی یوتوبه‌وه‌. نیوپایپ ناتوانێت ئه‌م ڤیدیۆیه‌ لێبدات.</string>\n    <string name=\"clear_cookie_summary\">خاوێنكردنه‌وی ئه‌و شه‌كرۆكانه‌ی كه‌ له‌ نیوپایپ كۆگاكراون ، ئه‌مه‌ش له‌دوای شیكار كردنی reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">شه‌كرۆكه‌كانی reCAPTCHA خاوێنكرانه‌وه‌</string>\n    <string name=\"clear_cookie_title\">سڕینه‌وه‌ی شه‌كرۆكه‌كانی reCAPTCHA</string>\n    <string name=\"hash_channel_description\">پەیامەکانی ئه‌نجامدانی هاش كردنی ڤیدیۆ</string>\n    <string name=\"hash_channel_name\">پەیامی هاش ڤیدیۆ</string>\n    <string name=\"description_select_disable\">ناکاراکردنی دیار کردنی نوسینی نێو دیسکریبشن</string>\n    <string name=\"description_select_enable\">کاراکردنی دیار کردنی نوسینی نێو دیسکریبشن</string>\n    <string name=\"description_select_note\">لە ئێستادا دەتوانیت نوسینی نێو دیسکریپشن دیار بکەیت. بەڵام ڕەچاوی ئەوە بکە کە ئەو پەڕەیە ڕەنگە تێکبچێت و لینکەکان کرتەیان لەسەر نەکرێت لە دۆخی دیار کردندا.</string>\n    <string name=\"select_night_theme_toast\">دەتوانیت لە خوارەوە ڕووکاری ڕەشی دڵخوازی خۆت دیار بکەیت</string>\n    <string name=\"night_theme_summary\">ڕووکاری ڕەشی دڵخوازی خۆت دیار بکە — %s</string>\n    <string name=\"feed_load_error_fast_unknown\">دۆخی فییدی خێرا ناتوانێت زانیاری پتر له‌باره‌ی ئه‌مه‌وه‌ بدات.</string>\n    <string name=\"feed_load_error_terminated\">هه‌ژماری ئه‌م كه‌سه‌ له‌ناوبراوه‌.\n\\nنیوپایپ ناتوانێت فییده‌كانی داهاتووی ئه‌م كه‌سه‌ پیشان بدات.\n\\nجا ده‌ته‌وێت به‌ژداری لابده‌یت له‌م كه‌ناڵه‌؟</string>\n    <string name=\"feed_load_error_account_info\">ناتوانرێت فیید باربکرێت تا ً`%s` .</string>\n    <string name=\"feed_load_error\">هه‌ڵه‌ له‌ باركردنی فیید</string>\n    <string name=\"disable_media_tunneling_summary\">ئەگەر تووشی شاشەی ڕەش یان لکەلکە بوویت لە کاتی پەخشکردنی ڤیدیۆدا، تونێلکردنی میدیا لەکاربخە.</string>\n    <string name=\"metadata_privacy_internal\">ناوەکی</string>\n    <string name=\"metadata_privacy_private\">تایبەتی</string>\n    <string name=\"metadata_privacy_unlisted\">خشتەنەکراو</string>\n    <string name=\"metadata_privacy_public\">گشتی</string>\n    <string name=\"metadata_host\">هۆست</string>\n    <string name=\"metadata_support\">پشتگیری</string>\n    <string name=\"metadata_language\">زمان</string>\n    <string name=\"metadata_age_limit\">سنووری تەمەن</string>\n    <string name=\"metadata_privacy\">تایبەتی</string>\n    <string name=\"metadata_licence\">مۆڵەت</string>\n    <string name=\"metadata_tags\">تاگەکان</string>\n    <string name=\"metadata_category\">هەمەجۆری</string>\n    <string name=\"download_has_started\">دابەزاندنەکە دەستی پێکرد</string>\n    <string name=\"auto_device_theme_title\">خۆکارانە (ڕووکاری ئامێر)</string>\n    <string name=\"radio\">ڕادیۆ</string>\n    <string name=\"featured\">تایبەتکراو</string>\n    <string name=\"paid_content\">ئه‌م بابه‌ته‌ ته‌نیا بۆ ئه‌و كه‌سانه‌ به‌رده‌سته‌ كه‌ پاره‌یان داوه‌ ، بۆیه‌ ناتوانرێت له‌ نیوپایپه‌وه‌ داببه‌زێنرێت.</string>\n    <string name=\"account_terminated\">هه‌ژمار له‌ناوبراوه‌</string>\n    <string name=\"youtube_music_premium_content\">ئه‌م ڤیدیۆیه‌ ته‌نیا له‌ وه‌شانی نایابی یوتوب میوزیك به‌رده‌سته‌ ، بۆیه‌ ناتوانرێت له‌ نیوپایپه‌وه‌ داببه‌زێنرێت.</string>\n    <string name=\"soundcloud_go_plus_content\">ئه‌مه‌ تراكی SoundCloud Go+ ه‌ ، لانی كه‌م له‌ وڵاته‌كه‌ی تۆدا، ناتوانرێت له‌لایه‌ن نیوپایپه‌وه‌ داببه‌زێنرێت.</string>\n    <string name=\"georestricted_content\">ئه‌م بابه‌ته‌ له‌ وڵاته‌كه‌ی تۆدا به‌رده‌ست نییه‌.</string>\n    <string name=\"no_app_to_open_intent\">هیچ به‌رنامه‌یه‌كی نێو مۆبایله‌كه‌ت ناتوانێت ئه‌مه‌ بكاته‌وه‌</string>\n    <string name=\"chapters\">به‌شه‌كان</string>\n    <string name=\"recent\">دواین</string>\n    <string name=\"show_thumbnail_summary\">وێنۆچكه‌كه‌ بۆ پاشبنه‌مای ڕوونماداخراو و پەیامەکان به‌كاردەهێنرێن</string>\n    <string name=\"show_thumbnail_title\">پیشاندانی وێنۆچكه‌</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">بۆ دابه‌زاندنی هه‌ر بابه‌تێك پرست پێ ده‌كرێت له‌باره‌ی شوێنی دابه‌زاندنیان</string>\n    <string name=\"disable_media_tunneling_title\">ناكاراكردنی تونێلكردنی میدیا</string>\n    <string name=\"show_age_restricted_content_summary\">ئه‌و بابه‌تانه‌ی نه‌گونجاون بۆ منداڵان پیشان بدرێن كه‌ سنووری ته‌مه‌ن ده‌یانگرێته‌وه‌ (وه‌ك +18)</string>\n    <string name=\"crash_the_app\">كڕاشی به‌رنامه‌كه‌</string>\n    <string name=\"show_memory_leaks\">پیشاندانی دزه‌كردنی بیرگه‌</string>\n    <string name=\"enqueued\">له‌نۆبه‌ت دانرا</string>\n    <string name=\"enqueue_stream\">له‌نۆبه‌ت دانان</string>\n    <string name=\"show_channel_details\">پیشاندانی ورده‌كارییه‌كانی كه‌ناڵ</string>\n    <string name=\"recaptcha_solve\">چاره‌سه‌ر كردن</string>\n    <string name=\"no_dir_yet\">هێشتا فۆڵده‌ری دابه‌زاندن دانه‌نراوه‌، ئێستا فۆڵده‌ری بنه‌ڕه‌تی دابه‌زاندن هه‌ڵبژێره‌</string>\n    <string name=\"private_content\">ئه‌م بابه‌ته‌ تایبه‌ته‌، بۆیه‌ ناتوانرێت له‌ نیوپایپه‌وه‌ داببه‌زێنرێت.</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">\\'Storage Access Framework\\' ته‌نیا له‌ وه‌شانی ئه‌ندرۆید 10 بەدواوه‌ پشتگیری لێ ده‌كرێت</string>\n    <string name=\"off\">ناکارا</string>\n    <string name=\"on\">کارا</string>\n    <string name=\"tablet_mode_title\">دۆخی تابلێت</string>\n    <string name=\"open_website_license\">کردنەوەی ماڵپەڕ</string>\n    <string name=\"seekbar_preview_thumbnail_title\">پێشبینینی سەروێنەی گەڕان</string>\n    <string name=\"detail_heart_img_view_description\">بەدڵکراوە لەلایەن بڵاوکەرەوە</string>\n    <string name=\"dont_show\">پیشان نەدرێت</string>\n    <string name=\"low_quality_smaller\">کواڵێتی نزم (بچووکتر)</string>\n    <string name=\"high_quality_larger\">کواڵێتی بەرز (گەورەتر)</string>\n    <string name=\"remote_search_suggestions\">پێشنیازکراوەکانی گەڕانی ڕیمۆت</string>\n    <string name=\"local_search_suggestions\">پێشنیازکراوەکانی گەڕانی نێوخۆیی</string>\n    <string name=\"mark_as_watched\">دیارکردن وەک بینراو</string>\n    <string name=\"show_hold_to_append_summary\">پیشاندانی ڕێنمایی لەکاتی کرتە کردن لە پاشبنەما یاخود دوگمەی پەنجەرە لە \\\"وردەکارییەکان\\\" ی ڤیدیۆکە.</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s دابەزێنراو سڕایەوە</item>\n        <item quantity=\"other\">%1$s دابەزێنراو سڕانەوە</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">دابەزاندن تەواوبوو</item>\n        <item quantity=\"other\">%s دابەزاندن تەواوبوون</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">لادانی بابەتەکان بە سواندنیان</string>\n    <string name=\"start_main_player_fullscreen_summary\">لە حاڵەتێکدا کە لاربوونەوە ناکارا کرابوو ، ئەوا لەجیاتی لێدانی ڤیدیۆکان لە لێدەرێکی بچووکدا ، ڕاستەوخۆ ڤیدیۆکان لە دۆخی پڕ بە ڕوونمادا لێبدرێن. دەتوانیت بە دەرچوونت لەسەر ڤیدیۆکە بەردەوام بیت لەسەر لێدەرێکی بچووک</string>\n    <string name=\"start_main_player_fullscreen_title\">دەستپێکردنی لێدەری سەرەکی لە ڕوونماپڕ</string>\n    <string name=\"enqueue_next_stream\">لە نۆبەت دانان بۆ دواتر</string>\n    <string name=\"enqueued_next\">لە نۆبەت دانرا بۆ دواتر</string>\n    <string name=\"processing_may_take_a_moment\">جێبەجێ دەکرێت... ڕەنگە ساتێک بخایەنێت</string>\n    <string name=\"checking_updates_toast\">دەپشکنرێت بۆ نوێکردنەوە…</string>\n    <string name=\"manual_update_description\">پشکنینی خۆیی بۆ وەشانی نوێ</string>\n    <string name=\"show_crash_the_player_summary\">بژاردەی کڕاش کردن پیشان دەدات لەکاتی بەکارهێنانی لێدەرەکە</string>\n    <string name=\"error_report_notification_toast\">کێشەیەک ڕوویدا ، پەیامەکە ببینە</string>\n    <string name=\"error_report_notification_title\">نیوپایپ تووشی کێشەیەک بوو ، کرتە بکە بۆ سکاڵاکردن</string>\n    <string name=\"show_crash_the_player_title\">پیشاندانی ”کڕاش کردنی لێدەرەکە“</string>\n    <string name=\"create_error_notification\">سازاندنی پەیامی کێشەیەک</string>\n    <string name=\"check_for_updates\">پشکنین بۆ نوێکردنەوە</string>\n    <string name=\"error_report_channel_name\">کێشە لە سکاڵا کردنی پەیام</string>\n    <string name=\"error_report_channel_description\">پەیامەکانی سکاڵاکردن لە کێشەکان</string>\n    <string name=\"feed_new_items\">بابەتە نوێیەکانی فیید</string>\n    <string name=\"detail_pinned_comment_view_description\">لێدوانی هەڵواسراو</string>\n    <string name=\"crash_the_player\">کڕاش کردنی لێدەر</string>\n    <string name=\"show_error_snackbar\">پیشاندانی هەڵەی سناکباڕ</string>\n    <string name=\"no_appropriate_file_manager_message\">هیچ FileManager پەڕگەی گونجاو بۆ ئەم کردارە نەدۆزراوەتەوە.\n\\nتکایە بەڕێوەبەری پەڕگەیەک دابمەزرێنە یان هەوڵبدە \\'%s\\' لە Settings بڕۆ Download لەکاربخە</string>\n    <string name=\"leak_canary_not_available\">LeakCanary بەردەست نییە</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">هیچ FileManager گونجاو نەدۆزرایەوە بۆ ئەم کردارە.\n\\nتکایە FileManager دابمەزرێنە کە گونجاوبێت لەگەڵ دەسەڵاتی گەیشتن بە بیرگە.</string>\n    <string name=\"check_new_streams\">پشکنین کردن بۆ پەخشی نوێ</string>\n    <string name=\"enable_streams_notifications_title\">پەیامەکانی پەخشە نوێیەکان</string>\n    <string name=\"enable_streams_notifications_summary\">پەیام بکرێم لەکاتی هەبوونی پەخشی نوێی بەژدارییەکان</string>\n    <string name=\"streams_notifications_interval_title\">فریکوێنسی دەپشکنرێت</string>\n    <string name=\"streams_notifications_network_title\">پەیوەندی تۆڕ داواکراوە</string>\n    <string name=\"any_network\">هەر تۆڕێک</string>\n    <string name=\"you_successfully_subscribed\">تۆ ئێستا ئەم چەناڵەت بەژداری کردووە</string>\n    <string name=\"enumeration_comma\">،</string>\n    <string name=\"streams_notification_channel_name\">پەخشە نوێیەکان</string>\n    <string name=\"settings_category_player_notification_title\">پەیامی لێدەر</string>\n    <string name=\"notifications\">پەیامەکان</string>\n    <string name=\"streams_notification_channel_description\">پەیامەکان بۆ پەخشە نوێیەکانی بەژدارییەکانت</string>\n    <string name=\"loading_stream_details\">وردەکاری پەخش باردەکرێت…</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s پەخشی نوێ</item>\n        <item quantity=\"other\">%s پەخشانی نوێ</item>\n    </plurals>\n    <string name=\"settings_category_player_notification_summary\">پەیامی ئێستای لێدانی پەخش ڕێکبخە</string>\n    <string name=\"delete_downloaded_files_confirm\">هەموو فایلە دابەزێنراوەکان لە دیسک بسڕدرێتەوە؟</string>\n    <string name=\"notifications_disabled\">پەیامەکان ناکاراکراون</string>\n    <string name=\"get_notified\">پەیامم بکە</string>\n    <string name=\"percent\">لەسەدا</string>\n    <string name=\"semitone\">نیمچەتەن</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">بنەڕەتی ExoPlayer</string>\n    <string name=\"prefer_original_audio_summary\">دیاریکردنی تراکی دەنگی ئەسڵی بێ گوێدانە زمانەکە</string>\n    <string name=\"notification_actions_summary_android13\">دەستکاریکردنی هەر کردارێکی ئاگادارکەرەوە لە خوارەوە بە دەستلێدان. یەکەم سێ کردار (لێدان/وەستان، پێشوو و دواتر) لەلایەن سیستەمەکەوە دانراوە و ناتوانرێت دەستکاری بکرێت.</string>\n    <string name=\"prefer_descriptive_audio_title\">پەسەند کردنی دەنگی وەسفکراو</string>\n    <string name=\"progressive_load_interval_summary\">گۆڕینی قەبارەی ماوەی لۆد لەسەر ناوەڕۆکی پێشکەوتوو (ئێستا ٪s). بەهایەکی کەمتر لەوانەیە بارکردنی سەرەتا خێراتر بکات</string>\n    <string name=\"prefer_original_audio_title\">پەسەندکردنی دەنگی ئەسڵی</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">بەسوودە، بۆ نموونە، ئەگەر هێدسێتێک بەکاربهێنیت لەگەڵ دوگمەی فیزیکی شکاو</string>\n    <string name=\"progressive_load_interval_title\">قەبارەی نێوان بارکردنی پەخشکردن</string>\n    <string name=\"ignore_hardware_media_buttons_title\">دوگمەی ڕووداوەکانی میدیای هاردوێر بەجێبهێڵە</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-cs/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Publikováno %1$s</string>\n    <string name=\"no_player_found\">Nenalezen žádný přehrávač. Nainstalovat VLC?</string>\n    <string name=\"install\">Instalovat</string>\n    <string name=\"cancel\">Zrušit</string>\n    <string name=\"open_in_browser\">Otevřít v prohlížeči</string>\n    <string name=\"share\">Sdílet</string>\n    <string name=\"download\">Stáhnout</string>\n    <string name=\"search\">Hledat</string>\n    <string name=\"settings\">Nastavení</string>\n    <string name=\"did_you_mean\">Mysleli jste „%1$s“\\?</string>\n    <string name=\"share_dialog_title\">Sdílet s</string>\n    <string name=\"use_external_video_player_title\">Použít externí přehrávač videí</string>\n    <string name=\"use_external_audio_player_title\">Použít externí audio přehrávač</string>\n    <string name=\"download_path_audio_summary\">Sem bude ukládáno stažené audio</string>\n    <string name=\"download_path_audio_dialog_title\">Zvolte adresář pro stažené audio soubory</string>\n    <string name=\"download_path_audio_title\">Adresář pro stažené audio</string>\n    <string name=\"default_resolution_title\">Výchozí rozlišení</string>\n    <string name=\"play_with_kodi_title\">Přehrát pomocí Kodi</string>\n    <string name=\"kore_not_found\">Nainstalovat chybějící aplikaci Kore\\?</string>\n    <string name=\"download_path_title\">Adresář pro stažená videa</string>\n    <string name=\"download_path_summary\">Sem budou ukládána stažená videa</string>\n    <string name=\"download_path_dialog_title\">Zvolte adresář pro stažená videa</string>\n    <string name=\"show_play_with_kodi_title\">Zobrazit možnost „Přehrát pomocí Kodi“</string>\n    <string name=\"show_play_with_kodi_summary\">Zobrazit možnost přehrání videa pomocí multimediálního centra Kodi</string>\n    <string name=\"play_audio\">Zvuk</string>\n    <string name=\"default_audio_format_title\">Výchozí formát zvuku</string>\n    <string name=\"theme_title\">Téma</string>\n    <string name=\"dark_theme_title\">Tmavé</string>\n    <string name=\"light_theme_title\">Světlé</string>\n    <string name=\"download_dialog_title\">Stáhnout</string>\n    <string name=\"show_next_and_similar_title\">Zobrazovat \\'další\\' a \\'podobná\\' videa</string>\n    <string name=\"unsupported_url\">URL není podporováno</string>\n    <string name=\"content_language_title\">Preferovaný jazyk obsahu</string>\n    <string name=\"settings_category_video_audio_title\">Video a zvuk</string>\n    <string name=\"settings_category_appearance_title\">Vzhled</string>\n    <string name=\"background_player_playing_toast\">Přehrávání na pozadí</string>\n    <string name=\"general_error\">Chyba</string>\n    <string name=\"network_error\">Chyba sítě</string>\n    <string name=\"could_not_load_thumbnails\">Nebylo možné nahrát všechny náhledy</string>\n    <string name=\"parsing_error\">Nebylo možné analyzovat stránku</string>\n    <string name=\"content_not_available\">Obsah není k dispozici</string>\n    <string name=\"detail_thumbnail_view_description\">Přehrát video, délka:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Náhled avataru uploadera</string>\n    <string name=\"detail_likes_img_view_description\">To se mi líbí</string>\n    <string name=\"detail_dislikes_img_view_description\">To se mi nelíbí</string>\n    <string name=\"content\">Obsah</string>\n    <string name=\"show_age_restricted_content_title\">Zobrazit věkově omezený obsah</string>\n    <string name=\"duration_live\">Živě</string>\n    <string name=\"main_bg_subtitle\">Začněte klepnutím na lupu.</string>\n    <string name=\"msg_copied\">Zkopírováno do schránky</string>\n    <string name=\"msg_wait\">Počkejte prosím…</string>\n    <string name=\"msg_running\">NewPipe stahuje</string>\n    <string name=\"msg_running_detail\">Klepněte pro podrobnosti</string>\n    <string name=\"msg_error\">Chyba</string>\n    <string name=\"msg_name\">Jméno souboru</string>\n    <string name=\"msg_threads\">Vlákna</string>\n    <string name=\"pause\">Zastavit</string>\n    <string name=\"delete\">Odstranit</string>\n    <string name=\"start\">Start</string>\n    <string name=\"retry\">Zkusit znovu</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Zvuk</string>\n    <string name=\"error_details_headline\">Podrobnosti:</string>\n    <string name=\"what_happened_headline\">Co se stalo:</string>\n    <string name=\"error_snackbar_action\">Nahlásit</string>\n    <string name=\"sorry_string\">Omlouváme se, tohle se nemělo stát.</string>\n    <string name=\"error_report_button_text\">Nahlásit přes e-mail</string>\n    <string name=\"error_snackbar_message\">Omlouváme se, něco se pokazilo.</string>\n    <string name=\"app_ui_crash\">Aplikace/UI spadlo</string>\n    <string name=\"could_not_setup_download_menu\">Nepodařilo se nastavit menu stahování</string>\n    <string name=\"error_report_title\">Nahlásit chybu</string>\n    <string name=\"downloads\">Stažené soubory</string>\n    <string name=\"downloads_title\">Stažené soubory</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"your_comment\">Vaše poznámky (anglicky):</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"title_activity_recaptcha\">Výzva reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Požadována výzva reCAPTCHA</string>\n    <string name=\"black_theme_title\">Černé</string>\n    <string name=\"checksum\">Kontrolní součet</string>\n    <string name=\"no_available_dir\">Určete prosím složku pro stahování později v nastavení</string>\n    <string name=\"info_labels\">Co:\\nŽádost:\\nJazyk obsahu:\\nZemě obsahu:\\nJazyk aplikace:\\nSlužba:\\nČas GMT:\\nBalíček:\\nVerze:\\nVerze OS:</string>\n    <string name=\"all\">Vše</string>\n    <string name=\"open_in_popup_mode\">Otevřít ve vyskakovacím okně</string>\n    <string name=\"msg_popup_permission\">Toto oprávnění je vyžadováno\n\\npro otevření ve vyskakovacím okně</string>\n    <string name=\"use_external_video_player_summary\">Odstraňuje zvuk v některých rozlišeních</string>\n    <string name=\"show_higher_resolutions_title\">Zobrazovat vyšší rozlišení</string>\n    <string name=\"show_higher_resolutions_summary\">Pouze některá zařízení dokáží přehrát 2K/4K videa</string>\n    <string name=\"default_video_format_title\">Výchozí formát videa</string>\n    <string name=\"popup_remember_size_pos_title\">Pamatovat si vlastnosti vyskakovacího okna</string>\n    <string name=\"popup_remember_size_pos_summary\">Pamatovat si poslední velikost a pozici vyskakovacího okna</string>\n    <string name=\"subscribe_button_title\">Odebírat</string>\n    <string name=\"subscribed_button_title\">Odebíráno</string>\n    <string name=\"channel_unsubscribed\">Odběr zrušen</string>\n    <string name=\"subscription_change_failed\">Nelze změnit odběr</string>\n    <string name=\"subscription_update_failed\">Nelze aktualizovat odběr</string>\n    <string name=\"tab_subscriptions\">Odběry</string>\n    <string name=\"fragment_feed_title\">Co je nového</string>\n    <string name=\"controls_background_title\">Na pozadí</string>\n    <string name=\"controls_popup_title\">V okně</string>\n    <string name=\"default_popup_resolution_title\">Výchozí rozlišení vyskakovacího okna</string>\n    <string name=\"show_search_suggestions_title\">Návrhy vyhledávání</string>\n    <string name=\"show_search_suggestions_summary\">Zvolit návrhy k zobrazení při vyhledávání</string>\n    <string name=\"enable_search_history_title\">Historie vyhledávání</string>\n    <string name=\"enable_search_history_summary\">Hledané výrazy lokálně uchovávat</string>\n    <string name=\"enable_watch_history_title\">Historie sledování</string>\n    <string name=\"enable_watch_history_summary\">Evidovat zhlédnutá videa</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Obnovit přehrávání</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Pokračovat v přehrávání po přerušení (např. hovor)</string>\n    <string name=\"settings_category_player_title\">Přehrávač</string>\n    <string name=\"settings_category_player_behavior_title\">Chování</string>\n    <string name=\"settings_category_history_title\">Historie a mezipaměť</string>\n    <string name=\"popup_playing_toast\">Přehrávání v okně</string>\n    <string name=\"disabled\">Zakázáno</string>\n    <string name=\"clear\">Vymazat</string>\n    <string name=\"best_resolution\">Nejlepší rozlišení</string>\n    <string name=\"undo\">Vrátit</string>\n    <string name=\"notification_channel_name\">Oznámení NewPipe</string>\n    <string name=\"notification_channel_description\">Oznámení pro NewPipe přehrávač</string>\n    <string name=\"search_no_results\">Žádné výsledky</string>\n    <string name=\"empty_list_subtitle\">Je tu sranda jak v márnici</string>\n    <string name=\"no_subscribers\">Žádní odběratelé</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s odběratel</item>\n        <item quantity=\"few\">%s odběratelé</item>\n        <item quantity=\"other\">%s odběratelů</item>\n    </plurals>\n    <string name=\"no_views\">Žádná zhlédnutí</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s zhlédnutí</item>\n        <item quantity=\"few\">%s zhlédnutí</item>\n        <item quantity=\"other\">%s zhlédnutí</item>\n    </plurals>\n    <string name=\"no_videos\">Žádná videa</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"few\">%s videa</item>\n        <item quantity=\"other\">%s videí</item>\n    </plurals>\n    <string name=\"settings_category_downloads_title\">Stahování</string>\n    <string name=\"settings_file_charset_title\">Povolené znaky v názvech souborů</string>\n    <string name=\"settings_file_replacement_character_summary\">Neplatné znaky budou nahrazeny těmito</string>\n    <string name=\"settings_file_replacement_character_title\">Náhradní znak</string>\n    <string name=\"charset_letters_and_digits\">Písmena a číslice</string>\n    <string name=\"charset_most_special_characters\">Většina speciálních znaků</string>\n    <string name=\"title_activity_about\">O NewPipe</string>\n    <string name=\"title_licenses\">Licence třetích stran</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s od %2$s pod %3$s</string>\n    <string name=\"tab_about\">O aplikaci a FAQ</string>\n    <string name=\"tab_licenses\">Licence</string>\n    <string name=\"app_description\">Svobodné a nenáročné streamování v Androidu.</string>\n    <string name=\"view_on_github\">Zobraz na GitHubu</string>\n    <string name=\"app_license_title\">Licence NewPipe</string>\n    <string name=\"contribution_encouragement\">Pokud máte nápady na zlepšení jako; překlad, změny designu, vylepšování kódu nebo opravdu velké změny kódu - pomoc je vždy vítána. Čím více se udělá, tím lepší to bude!</string>\n    <string name=\"read_full_license\">Přečíst licenci</string>\n    <string name=\"contribution_title\">Podílet se</string>\n    <string name=\"title_activity_history\">Historie</string>\n    <string name=\"action_history\">Historie</string>\n    <string name=\"show_hold_to_append_title\">Zobrazit tip „Podržte pro zařazení do fronty“</string>\n    <string name=\"show_hold_to_append_summary\">Zobrazit tip po klepnutí na pozadí nebo na vyskakovací tlačítko v „Podrobnostech“ videa</string>\n    <string name=\"play_all\">Přehrát vše</string>\n    <string name=\"player_stream_failure\">Tento stream nelze přehrát</string>\n    <string name=\"player_unrecoverable_failure\">Došlo k neobnovitelné chybě přehrávače</string>\n    <string name=\"player_recoverable_failure\">Obnovování z chyby přehrávače</string>\n    <string name=\"delete_item_search_history\">Odstranit tuto položku z historie vyhledávání?</string>\n    <string name=\"main_page_content\">Obsah úvodní obrazovky</string>\n    <string name=\"blank_page_summary\">Prázdná stránka</string>\n    <string name=\"kiosk_page_summary\">Kiosek</string>\n    <string name=\"channel_page_summary\">Kanál</string>\n    <string name=\"select_a_channel\">Zvolte kanál</string>\n    <string name=\"no_channel_subscribed_yet\">Žádný kanál dosud neodebírán</string>\n    <string name=\"select_a_kiosk\">Zvolte kiosek</string>\n    <string name=\"trending\">Trendy</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Nové a žhavé</string>\n    <string name=\"play_queue_remove\">Odebrat</string>\n    <string name=\"play_queue_stream_detail\">Podrobnosti</string>\n    <string name=\"play_queue_audio_settings\">Nastavení zvuku</string>\n    <string name=\"hold_to_append\">Podržte pro zařazení do fronty</string>\n    <string name=\"unknown_content\">[Neznámý]</string>\n    <string name=\"start_here_on_background\">Začít přehrávat na pozadí</string>\n    <string name=\"start_here_on_popup\">Začít přehrávat v pop-upu</string>\n    <string name=\"donation_title\">Přispět</string>\n    <string name=\"donation_encouragement\">NewPipe je vyvíjen dobrovolníky, kteří tráví svůj volný čas, aby vaše zkušenost s aplikací byla co nejlepší. Vraťte vývojářům něco zpět, aby mohli NewPipe dále zlepšovat a zároveň si vychutnat šálek kávy.</string>\n    <string name=\"give_back\">Daruj</string>\n    <string name=\"website_title\">Webová stránka</string>\n    <string name=\"website_encouragement\">Pro další informace a novinky navštivte webovou stránku NewPipe.</string>\n    <string name=\"default_content_country_title\">Země výchozího obsahu</string>\n    <string name=\"switch_to_background\">Přepnout na pozadí</string>\n    <string name=\"switch_to_popup\">Do okna</string>\n    <string name=\"switch_to_main\">Přepnout na hlavní</string>\n    <string name=\"drawer_open\">Otevřít Drawer</string>\n    <string name=\"drawer_close\">Zavřít Drawer</string>\n    <string name=\"no_player_found_toast\">Nenalezen přehrávač streamu (pro přehrání můžete nainstalovat např. VLC).</string>\n    <string name=\"always\">Vždy</string>\n    <string name=\"just_once\">Pouze jednou</string>\n    <string name=\"import_data_title\">Importovat databázi</string>\n    <string name=\"export_data_title\">Exportovat databázi</string>\n    <string name=\"import_data_summary\">Přepíše Vaši dosavadní historii, odběry, playlisty a (volitelně) nastavení</string>\n    <string name=\"export_data_summary\">Exportuje historii, odběry, playlisty a nastavení</string>\n    <string name=\"external_player_unsupported_link_type\">Externí přehrávače nepodporují tyto druhy odkazů</string>\n    <string name=\"video_streams_empty\">Nenalezeny žádné video streamy</string>\n    <string name=\"audio_streams_empty\">Nenalezeny žádné audio streamy</string>\n    <string name=\"export_complete_toast\">Exportováno</string>\n    <string name=\"import_complete_toast\">Importováno</string>\n    <string name=\"no_valid_zip_file\">Žádný platný soubor ZIP</string>\n    <string name=\"could_not_import_all_files\">Upozornění: Nelze importovat všechny soubory.</string>\n    <string name=\"override_current_data\">Tímto se anuluje vaše aktuální nastavení.</string>\n    <string name=\"video_player\">Přehrávač videa</string>\n    <string name=\"background_player\">Přehrávač na pozadí</string>\n    <string name=\"popup_player\">Přehrávač v okně</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Získávám informace…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Načítání požadovaného obsahu</string>\n    <string name=\"controls_download_desc\">Stáhnout soubor streamu</string>\n    <string name=\"show_info\">Zobrazit informace</string>\n    <string name=\"tab_bookmarks\">Uložené playlisty</string>\n    <string name=\"controls_add_to_playlist_title\">Přidat do</string>\n    <string name=\"detail_drag_description\">Táhnout pro přeskupení</string>\n    <string name=\"create\">Vytvořit</string>\n    <string name=\"dismiss\">Zahodit</string>\n    <string name=\"rename\">Přejmenovat</string>\n    <string name=\"title_last_played\">Poslední přehráno</string>\n    <string name=\"title_most_played\">Nejvíce přehráno</string>\n    <string name=\"always_ask_open_action\">Vždy se zeptat</string>\n    <string name=\"create_playlist\">Nový playlist</string>\n    <string name=\"rename_playlist\">Přejmenovat</string>\n    <string name=\"name\">Jméno</string>\n    <string name=\"add_to_playlist\">Přidat do playlistu</string>\n    <string name=\"set_as_playlist_thumbnail\">Nastavit jako náhled playlistu</string>\n    <string name=\"bookmark_playlist\">Přidat playlist do záložek</string>\n    <string name=\"unbookmark_playlist\">Odstranit záložku</string>\n    <string name=\"delete_playlist_prompt\">Odstranit tento playlist?</string>\n    <string name=\"playlist_creation_success\">Playlist vytvořen</string>\n    <string name=\"playlist_add_stream_success\">V playlistu</string>\n    <string name=\"playlist_thumbnail_change_success\">Náhled playlistu změněn.</string>\n    <string name=\"caption_none\">Bez titulků</string>\n    <string name=\"resize_fit\">Přizpůsobit</string>\n    <string name=\"resize_fill\">Vyplnit</string>\n    <string name=\"resize_zoom\">Zvětšit</string>\n    <string name=\"settings_category_debug_title\">Ladění</string>\n    <string name=\"caption_auto_generated\">Automaticky generováno</string>\n    <string name=\"enable_leak_canary_summary\">Monitoring úniku paměti může způsobit nereagování aplikace při heap dumpingu</string>\n    <string name=\"enable_disposed_exceptions_title\">Nahlásit mimo-cyklické chyby</string>\n    <string name=\"enable_disposed_exceptions_summary\">Vynutit hlášení nedoručitelných výjimek Rx mimo životnost fragmentu nebo aktivity po odstranění</string>\n    <string name=\"use_inexact_seek_title\">Použít rychlé nepřesné hledání</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Mezipaměť obrázků vymazána</string>\n    <string name=\"metadata_cache_wipe_title\">Vymazat metadata v mezipaměti</string>\n    <string name=\"metadata_cache_wipe_summary\">Odstranit všechna data webových stránek v mezipaměti</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Mezipaměť metadat vymazána</string>\n    <string name=\"auto_queue_title\">Další stream automaticky vložit do fronty</string>\n    <string name=\"auto_queue_summary\">Pokračovat konečnou (neopakující se) frontu playbacku připojením souvisejícího streamu</string>\n    <string name=\"file\">Soubor</string>\n    <string name=\"invalid_directory\">Neexistující složka</string>\n    <string name=\"invalid_source\">Neexistující zdroj souboru/obsahu</string>\n    <string name=\"invalid_file\">Soubor neexistuje nebo chybí oprávnění k jeho čtení či zápisu</string>\n    <string name=\"file_name_empty_error\">Název souboru nesmí být prázdný</string>\n    <string name=\"error_occurred_detail\">Došlo k chybě: %1$s</string>\n    <string name=\"import_title\">Importovat</string>\n    <string name=\"import_from\">Importovat z</string>\n    <string name=\"export_to\">Exportovat do</string>\n    <string name=\"import_ongoing\">Importuji…</string>\n    <string name=\"export_ongoing\">Exportuji…</string>\n    <string name=\"import_file_title\">Import souboru</string>\n    <string name=\"previous_export\">Předchozí export</string>\n    <string name=\"subscriptions_import_unsuccessful\">Odběry nelze importovat</string>\n    <string name=\"subscriptions_export_unsuccessful\">Odběry nelze exportovat</string>\n    <string name=\"import_youtube_instructions\">Importovat odběry YouTube z exportu dat Google:\n\\n\n\\n1. Přejděte na tuto adresu URL: %1$s\n\\n2. Při požádání se přihlaste\n\\n3. Klikněte na „Jsou zahrnuta všechna data“, poté na „Zrušit výběr všech“ a poté vyberte jen \\\"odběry\\\" a klikněte na OK\n\\n4. Klikněte na „Další krok“ a poté na „Vytvořit export“\n\\n5. Vyčkejte, než se objeví tlačítko „Stáhnout“ a klikněte na něj\n\\n6. Klepněte na IMPORTOVAT SOUBOR níže a vyberte stažený soubor .zip\n\\n7. [Pokud se import .zip souboru nezdaří] Rozbalte soubor .csv (měl by se nacházet v „YouTube and YouTube Music/subscriptions/subscriptions.csv“), klepněte na IMPORTOVAT SOUBOR níže a vyberte rozbalený soubor csv</string>\n    <string name=\"import_soundcloud_instructions\">Importovat profil SoundCloud zadáním adresy URL nebo vašeho ID:\n\\n\n\\n1. Ve svém prohlížeči povolte „režim pro PC“ (pro mobilní zařízení není stránka dostupná)\n\\n2. Přejděte na tuto adresu URL: %1$s\n\\n3. Při požádání se přihlaste\n\\n4. Zkopírujte URL adresu profilu, na kterou jste byli přesměrováni.</string>\n    <string name=\"import_soundcloud_instructions_hint\">vašeID, soundcloud.com/yourid</string>\n    <string name=\"import_network_expensive_warning\">Pamatujte, že tato operace může být náročná na data. \n\\n \n\\nChcete pokračovat?</string>\n    <string name=\"playback_speed_control\">Ovládání rychlosti přehrávání</string>\n    <string name=\"playback_tempo\">Tempo</string>\n    <string name=\"playback_pitch\">Výška tónu</string>\n    <string name=\"unhook_checkbox\">Odpojit (může způsobit zkreslení)</string>\n    <string name=\"no_streams_available_download\">Ke stažení nejsou dostupné žádné streamy</string>\n    <string name=\"preferred_open_action_settings_title\">Preferovaná akce „otevření“</string>\n    <string name=\"preferred_open_action_settings_summary\">Výchozí chování při otevírání obsahu — %s</string>\n    <string name=\"caption_setting_title\">Titulky</string>\n    <string name=\"caption_setting_description\">Upravuje velikost textu titulků a styly pozadí. Změny se projeví po restartu aplikace</string>\n    <string name=\"clear_views_history_title\">Vymazat historii sledování</string>\n    <string name=\"clear_views_history_summary\">Vymaže historii přehraných streamů pozic playbacku</string>\n    <string name=\"delete_view_history_alert\">Vymazat celkovou historii sledování\\?</string>\n    <string name=\"watch_history_deleted\">Historie sledování smazána</string>\n    <string name=\"clear_search_history_title\">Vymazat historii vyhledávání</string>\n    <string name=\"clear_search_history_summary\">Vymaže historii vyhledávaných klíčových slov</string>\n    <string name=\"delete_search_history_alert\">Vymazat celkovou historii vyhledávání\\?</string>\n    <string name=\"search_history_deleted\">Historie vyhledávání smazána</string>\n    <string name=\"one_item_deleted\">Jedna položka smazána.</string>\n    <string name=\"app_license\">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.</string>\n    <string name=\"channels\">Kanály</string>\n    <string name=\"playlists\">Playlisty</string>\n    <string name=\"tracks\">Stopy</string>\n    <string name=\"users\">Uživatelé</string>\n    <string name=\"privacy_policy_title\">Zásady ochrany soukromí v NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">Projekt NewPipe bere vaše soukromí velice vážně. Proto aplikace neshromažďuje žádné údaje bez vašeho souhlasu.\n\\nZásady ochrany soukromí NewPipe podrobně vysvětlují, jaké údaje jsou odesílány a ukládány, když odešlete zprávu o pádu aplikace.</string>\n    <string name=\"read_privacy_policy\">Přečíst zásady ochrany soukromí</string>\n    <string name=\"import_settings\">Chcete také přenést nastavení?</string>\n    <string name=\"skip_silence_checkbox\">Zrychleně vpřed během ticha</string>\n    <string name=\"playback_step\">Krok</string>\n    <string name=\"playback_reset\">Reset</string>\n    <string name=\"start_accept_privacy_policy\">Abychom vyhověli Obecnému nařízení o ochraně osobních údajů (GDPR), upozorňujeme vás na zásady ochrany soukromí v NewPipe. Přečtěte si je, prosím, pozorně.\n\\nJe potřeba je odsouhlasit, abyste nám mohli odeslat hlášení chyb.</string>\n    <string name=\"accept\">Přijmout</string>\n    <string name=\"decline\">Odmítnout</string>\n    <string name=\"limit_data_usage_none_description\">Bez omezení</string>\n    <string name=\"limit_mobile_data_usage_title\">Omezit rozlišení při použití mobilních dat</string>\n    <string name=\"minimize_on_exit_title\">Minimalizovat při přepínání aplikací</string>\n    <string name=\"minimize_on_exit_summary\">Akce při přepínání aplikací z hlavního přehrávače videa — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Žádná</string>\n    <string name=\"minimize_on_exit_background_description\">Minimalizovat přehrávač na pozadí</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimalizovat přehrávač do vyskakovacího okna</string>\n    <string name=\"unsubscribe\">Přestat odebírat</string>\n    <string name=\"tab_choose\">Zvolit panel</string>\n    <string name=\"settings_category_updates_title\">Aktualizace</string>\n    <string name=\"file_deleted\">Soubor smazán</string>\n    <string name=\"app_update_notification_channel_name\">Oznámení o aktualizaci aplikace</string>\n    <string name=\"app_update_notification_channel_description\">Oznámení o nových verzích NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Externí úložiště není k dispozici</string>\n    <string name=\"saved_tabs_invalid_json\">Nelze načíst uložené karty, takže se použijí výchozí karty</string>\n    <string name=\"restore_defaults\">Obnovit do výchozího nastavení</string>\n    <string name=\"restore_defaults_confirmation\">Chcete obnovit výchozí nastavení\\?</string>\n    <string name=\"subscribers_count_not_available\">Počet odběratelů není k dispozici</string>\n    <string name=\"main_page_content_summary\">Karty, které jsou zobrazeny na hlavní stránce</string>\n    <string name=\"updates_setting_title\">Aktualizace</string>\n    <string name=\"events\">Události</string>\n    <string name=\"conferences\">Konference</string>\n    <string name=\"updates_setting_description\">Zobrazit oznámení s výzvou k aktualizaci aplikace, je-li k dispozici nová verze</string>\n    <string name=\"list_view_mode\">Režim zobrazení seznamu</string>\n    <string name=\"list\">Seznam</string>\n    <string name=\"grid\">Mřížka</string>\n    <string name=\"auto\">Automaticky</string>\n    <string name=\"app_update_available_notification_title\">Aktualizace NewPipe je k dispozici!</string>\n    <string name=\"missions_header_finished\">Dokončeno</string>\n    <string name=\"missions_header_pending\">Čekání</string>\n    <string name=\"paused\">Pozastaveno</string>\n    <string name=\"queued\">ve frontě</string>\n    <string name=\"post_processing\">zpracování</string>\n    <string name=\"enqueue\">Zařadit do fronty</string>\n    <string name=\"permission_denied\">Akce odmítnuta systémem</string>\n    <string name=\"download_failed\">Stahování se nezdařilo</string>\n    <string name=\"generate_unique_name\">Vytvořit jedinečný název</string>\n    <string name=\"overwrite\">Přepsat</string>\n    <string name=\"overwrite_unrelated_warning\">Soubor s tímto názvem již existuje</string>\n    <string name=\"overwrite_finished_warning\">Stažený soubor s tímto názvem již existuje</string>\n    <string name=\"download_already_running\">Stahování s tímto názvem již probíhá</string>\n    <string name=\"show_error\">Zobrazit chybu</string>\n    <string name=\"error_path_creation\">Cílovou složku nelze vytvořit</string>\n    <string name=\"error_file_creation\">Soubor nelze vytvořit</string>\n    <string name=\"error_ssl_exception\">Nelze navázat zabezpečené připojení</string>\n    <string name=\"error_unknown_host\">Server se nepodařilo najít</string>\n    <string name=\"error_connect_host\">Nelze se připojit k serveru</string>\n    <string name=\"error_http_no_content\">Server neposílá data</string>\n    <string name=\"error_http_unsupported_range\">Server neakceptuje vícevláknové stahování, opakujte akci s @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Nenalezeno</string>\n    <string name=\"error_postprocessing_failed\">Zpracování selhalo</string>\n    <string name=\"stop\">Zastavit</string>\n    <string name=\"max_retry_msg\">Maximální počet pokusů o opakování</string>\n    <string name=\"max_retry_desc\">Maximální počet pokusů před zrušením stahování</string>\n    <string name=\"pause_downloads_on_mobile\">Přerušit na mobilních sítích</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Užitečné při přepnutí na mobilní data, některá stahování ale nelze přerušit</string>\n    <string name=\"show_comments_title\">Zobrazit komentáře</string>\n    <string name=\"show_comments_summary\">Deaktivovat zobrazování komentářů</string>\n    <string name=\"autoplay_title\">Automatické přehrávání</string>\n    <string name=\"no_comments\">Žádné komentáře</string>\n    <string name=\"error_unable_to_load_comments\">Nelze načíst komentáře</string>\n    <string name=\"close\">Zavřít</string>\n    <string name=\"download_to_sdcard_error_message\">Stahování na externí SD kartu není možné. Resetovat umístění složky pro stahování\\?</string>\n    <string name=\"enable_playback_resume_title\">Pokračovat v přehrávání</string>\n    <string name=\"enable_playback_resume_summary\">Obnovit poslední pozici přehrávání</string>\n    <string name=\"enable_playback_state_lists_title\">Pozice v seznamech</string>\n    <string name=\"settings_category_clear_data_title\">Vymazat data</string>\n    <string name=\"missing_file\">Soubor přemístěn nebo smazán</string>\n    <string name=\"overwrite_failed\">soubor nelze přepsat</string>\n    <string name=\"download_already_pending\">Soubor s tímto názvem již čeká na stažení</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe byl ukončen v průběhu zpracovávání souboru</string>\n    <string name=\"error_insufficient_storage_left\">V zařízení nezbývá žádné místo</string>\n    <string name=\"error_progress_lost\">Postup ztracen, protože soubor byl smazán</string>\n    <string name=\"confirm_prompt\">Jste si jisti smazáním své historie stahování nebo smazáním všech stažených souborů\\?</string>\n    <string name=\"enable_queue_limit\">Omezit frontu stahování</string>\n    <string name=\"enable_queue_limit_desc\">Najednou se bude stahovat pouze jeden soubor</string>\n    <string name=\"start_downloads\">Začít stahování</string>\n    <string name=\"pause_downloads\">Pozastavit stahování</string>\n    <string name=\"downloads_storage_ask_title\">Zeptat se na složku pro stahování</string>\n    <string name=\"downloads_storage_ask_summary\">Budete dotázáni, kam jednotlivé soubory uložit.\n\\nAktivujte výběr systémového adresáře (SAF), chcete-li stáhnout soubor na externí SD kartu</string>\n    <string name=\"downloads_storage_use_saf_title\">Použít výběr systémového adresáře (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">„Storage Access Framework“ umožňuje stahovat na externí SD kartu</string>\n    <string name=\"enable_playback_state_lists_summary\">Zobrazit pozici přehrávání v seznamech</string>\n    <string name=\"watch_history_states_deleted\">Pozice playbacku smazány</string>\n    <string name=\"error_timeout\">Timeout spojení</string>\n    <string name=\"clear_playback_states_title\">Vymazat pozice přehrávání</string>\n    <string name=\"clear_playback_states_summary\">Vymaže všechny pozice přehrávání</string>\n    <string name=\"delete_playback_states_alert\">Vymazat všechny pozice přehrávání?</string>\n    <string name=\"drawer_header_description\">Přepnout službu, právě vybráno:</string>\n    <string name=\"no_one_watching\">Nikdo nesleduje</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s sleduje</item>\n        <item quantity=\"few\">%s sledují</item>\n        <item quantity=\"other\">%s sleduje</item>\n    </plurals>\n    <string name=\"no_one_listening\">Nikdo neposlouchá</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s posluchač</item>\n        <item quantity=\"few\">%s posluchači</item>\n        <item quantity=\"other\">%s posluchačů</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">Výchozí kiosek</string>\n    <string name=\"seek_duration_title\">Délka přetočení vpřed/zpět</string>\n    <string name=\"peertube_instance_url_title\">Instance PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Vybrat oblíbené instance PeerTube</string>\n    <string name=\"peertube_instance_url_help\">Vyhledat instance, které se vám líbí, na %s</string>\n    <string name=\"peertube_instance_add_title\">Přidat instanci</string>\n    <string name=\"peertube_instance_add_help\">Zadat URL instance</string>\n    <string name=\"peertube_instance_add_fail\">Instanci nebylo možno potvrdit</string>\n    <string name=\"peertube_instance_add_https_only\">Podporujeme pouze URL s HTTPS</string>\n    <string name=\"peertube_instance_add_exists\">Instance již existuje</string>\n    <string name=\"local\">Místní</string>\n    <string name=\"recently_added\">Přidány nedávno</string>\n    <string name=\"most_liked\">Nejoblíbenější</string>\n    <string name=\"playlist_no_uploader\">Automaticky vygenerováno (autor nenalezen)</string>\n    <string name=\"recovering\">obnovuji</string>\n    <string name=\"error_download_resource_gone\">Toto stahování nelze obnovit</string>\n    <string name=\"choose_instance_prompt\">Vyberte instanci</string>\n    <string name=\"clear_download_history\">Vymazat historii stahování</string>\n    <string name=\"delete_downloaded_files\">Odstranit stažené soubory</string>\n    <string name=\"permission_display_over_apps\">Souhlasit se zobrazením přes jiné aplikace</string>\n    <string name=\"app_language_title\">Jazyk aplikace</string>\n    <string name=\"systems_language\">Jazyk systému</string>\n    <string name=\"subtitle_activity_recaptcha\">Po vyřešení klepněte na „Hotovo“</string>\n    <string name=\"done\">Hotovo</string>\n    <string name=\"videos_string\">Videa</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d vteřina</item>\n        <item quantity=\"few\">%d vteřiny</item>\n        <item quantity=\"other\">%d vteřin</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Kvůli omezením ExoPlayer bylo prohledávání nastaveno na %d vteřin</string>\n    <string name=\"mute\">Ztišit</string>\n    <string name=\"unmute\">Obnovit hlasitost</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuta</item>\n        <item quantity=\"few\">%d minuty</item>\n        <item quantity=\"other\">%d minut</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d hodina</item>\n        <item quantity=\"few\">%d hodiny</item>\n        <item quantity=\"other\">%d hodin</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d den</item>\n        <item quantity=\"few\">%d dny</item>\n        <item quantity=\"other\">%d dnů</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">Skupiny kanálů</string>\n    <string name=\"feed_oldest_subscription_update\">Novinky naposledy aktualizovány: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Nenačteno: %d</string>\n    <string name=\"feed_notification_loading\">Načítám novinky…</string>\n    <string name=\"feed_processing_message\">Zpracovávám novinky…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Vybrat odběry</string>\n    <string name=\"feed_group_dialog_empty_selection\">Nebyly vybrány žádné odběry</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d vybrána</item>\n        <item quantity=\"few\">%d vybrány</item>\n        <item quantity=\"other\">%d vybráno</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">Prázdné jméno skupiny</string>\n    <string name=\"feed_group_dialog_delete_message\">Přejete si odstranit tuto skupinu?</string>\n    <string name=\"feed_create_new_group_button_title\">Nový</string>\n    <string name=\"settings_category_feed_title\">Novinky</string>\n    <string name=\"feed_update_threshold_title\">Limit aktualizace novinek</string>\n    <string name=\"feed_update_threshold_summary\">Doba po poslední aktualizaci, po níž je odběr považován za zastaralý — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Vždy aktualizovat</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Dodat z vyhrazeného zdroje, je-li dostupný</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">K dispozici na některých zařízeních, je obvykle mnohem rychlejší, ale může vrátit omezený počet položek a často neúplné informace (např. bez trvání, typu položky, skutečného stavu)</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Zapnout rychlý režim</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Vypnout rychlý režim</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Zdá se vám načítání příliš pomalé\\? Pokud ano, zkuste zapnout rychlé načítání (lze změnit v nastavení nebo stiskem tlačítka níže). \n\\n \n\\nNewPipe nabízí dvě strategie načítání seznamu novinek\n\\n• Stažení celého kanálu vašich odběrů, což je pomalé, ale spolehlivé.\n\\n• Použití služby k tomu určené, což je rychlé, ale obvykle neobsahuje všechny potřebné informace. \n\\n \n\\nRozdíl mezi těmi dvěma je, že rychlému způsobu obvykle chybí nějaká informace, např. délka videa nebo typ (nemůže rozlišit mezi živým a normálním videem) a patrně vrátí méně položek. \n\\n \n\\nYouTube je příklad služby, která nabízí tuto rychlou metodu pomocí RSS přísunu. \n\\n \n\\nVýběr je vposledku určen tím, čemu dáte přednost: rychlosti nebo přesnosti informací.</string>\n    <string name=\"content_not_supported\">Tento obsah ještě není podporován NewPipe.\n\\n\n\\nSnad bude podporován v budoucnu.</string>\n    <string name=\"infinite_videos\">∞ videí</string>\n    <string name=\"more_than_100_videos\">100+ videí</string>\n    <string name=\"artists\">Umělci</string>\n    <string name=\"albums\">Alba</string>\n    <string name=\"songs\">Skladby</string>\n    <string name=\"restricted_video\">Toto video má věkové omezení.\n\\n\n\\nPokud jej chcete vidět, povolte „%1$s“ v nastavení.</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Ano, i zčásti zhlédnutá videa</string>\n    <string name=\"remove_watched_popup_title\">Odstranit zhlédnuté streamy?</string>\n    <string name=\"remove_watched\">Odstranit zhlédnuté</string>\n    <string name=\"remove_watched_popup_warning\">Streamy, které jste zhlédli před a po jejich přidání do playlistu, budou odstraněny. \\nJste se jisti?</string>\n    <string name=\"show_original_time_ago_summary\">Původní texty služeb budou viditelné u položek streamů</string>\n    <string name=\"show_original_time_ago_title\">U položek zobrazit původní čas</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Zapnout „Omezený režim“ YouTube</string>\n    <string name=\"video_detail_by\">Od %s</string>\n    <string name=\"channel_created_by\">Vytvořil %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Ikona kanálu</string>\n    <string name=\"playlist_page_summary\">Strana playlistů</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Zobrazit jen neseskupené odběry</string>\n    <string name=\"no_playlist_bookmarked_yet\">Zatím žádné záložky playlistů</string>\n    <string name=\"select_a_playlist\">Vybrat playlist</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_report_open_issue_button_text\">Nahlásit na GitHubu</string>\n    <string name=\"copy_for_github\">Zkopírovat formátované hlášení</string>\n    <string name=\"search_showing_result_for\">Ukazuji výsledky pro: %s</string>\n    <string name=\"never\">Nikdy</string>\n    <string name=\"wifi_only\">Pouze na Wi-Fi</string>\n    <string name=\"autoplay_summary\">Automaticky zahájit přehrávání — %s</string>\n    <string name=\"title_activity_play_queue\">Fronta přehravání</string>\n    <string name=\"unsupported_url_dialog_message\">Nelze rozpoznat zadanou adresu URL. Otevřít pomocí jiné aplikace\\?</string>\n    <string name=\"auto_queue_toggle\">Automatické přehravání</string>\n    <string name=\"clear_queue_confirmation_description\">Fronta aktivního přehrávače bude smazána</string>\n    <string name=\"clear_queue_confirmation_summary\">Při přechodu z jednoho přehrávače do druhého může dojít k smazání fronty</string>\n    <string name=\"clear_queue_confirmation_title\">Žádat potvrzení před vyklizením fronty</string>\n    <string name=\"notification_action_nothing\">Nic</string>\n    <string name=\"notification_action_buffering\">Bufferovat</string>\n    <string name=\"notification_action_shuffle\">Promíchat</string>\n    <string name=\"notification_action_repeat\">Opakovat</string>\n    <string name=\"notification_actions_at_most_three\">Do kompaktního oznámení lze vybrat nejvíce tři akce!</string>\n    <string name=\"notification_actions_summary\">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í.</string>\n    <string name=\"notification_action_4_title\">Páté akční tlačítko</string>\n    <string name=\"notification_action_3_title\">Čtvrté akční tlačítko</string>\n    <string name=\"notification_action_2_title\">Třetí akční tlačítko</string>\n    <string name=\"notification_action_1_title\">Druhé akční tlačítko</string>\n    <string name=\"notification_action_0_title\">První akční tlačítko</string>\n    <string name=\"notification_scale_to_square_image_summary\">Oříznout miniaturu videa zobrazenou v oznámení z poměru stran 16:9 na 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Oříznout poměr stran miniatury na 1:1</string>\n    <string name=\"show_memory_leaks\">Zobrazit úniky paměti</string>\n    <string name=\"enqueued\">Zařazeno do fronty</string>\n    <string name=\"enqueue_stream\">Zařadit do fronty</string>\n    <string name=\"clear_cookie_summary\">Vymazat cookies, které NewPipe uloží, po vyřešení reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Cookies reCAPTCHA byly vymazány</string>\n    <string name=\"clear_cookie_title\">Vymazat cookies reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube poskytuje „Omezený režim“, který skrývá potenciální obsah pro dospělé</string>\n    <string name=\"show_age_restricted_content_summary\">Zobrazit obsah, i když je patrně nevhodný pro děti, protože odkazuje na věkové omezení (např. 18+)</string>\n    <string name=\"notification_colorize_summary\">Nechte Android přizpůsobit barvu oznámení podle hlavní barvy v miniatuře (není k dispozici na všech zařízeních)</string>\n    <string name=\"notification_colorize_title\">Přibarvit oznámení</string>\n    <string name=\"show_thumbnail_summary\">Použít miniaturu pro pozadí zamknuté obrazovky a oznámení</string>\n    <string name=\"show_thumbnail_title\">Zobrazit miniaturu</string>\n    <string name=\"hash_channel_name\">Oznámení o hashování</string>\n    <string name=\"recent\">Nedávné</string>\n    <string name=\"msg_calculating_hash\">Počítám hash</string>\n    <string name=\"hash_channel_description\">Oznámení o postupu hashování videa</string>\n    <string name=\"show_meta_info_summary\">Vypnout, abyste skryli rámečky s meta informací s údaji o autorovi streamu, obsahu streamu nebo požadavků hledání</string>\n    <string name=\"show_meta_info_title\">Zobrazit meta informaci</string>\n    <string name=\"chapters\">Kapitoly</string>\n    <string name=\"description_tab_description\">Popis</string>\n    <string name=\"comments_tab_description\">Komentáře</string>\n    <string name=\"show_description_title\">Zobrazit popis</string>\n    <string name=\"open_with\">Otevřít s</string>\n    <string name=\"no_app_to_open_intent\">Na Vašem zařízení není aplikace, která to umí otevřít</string>\n    <string name=\"related_items_tab_description\">Podobné položky</string>\n    <string name=\"show_description_summary\">Vypnout pro skrytí popisu videa a doplňkové informace</string>\n    <string name=\"crash_the_app\">Zbořit aplikaci</string>\n    <string name=\"download_has_started\">Stahování bylo zahájeno</string>\n    <string name=\"select_night_theme_toast\">Níže si můžete zvolit svůj oblíbený motiv</string>\n    <string name=\"night_theme_summary\">Zvolte si svůj oblíbený noční motiv - %s</string>\n    <string name=\"auto_device_theme_title\">Automatický (motiv zařízení)</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"featured\">Představujeme</string>\n    <string name=\"paid_content\">Tento obsah je dostupný jen platícím uživatelům, a tak jej NewPipe nemůže stáhnout ani přehrát.</string>\n    <string name=\"youtube_music_premium_content\">Toto video je dostupné jen členům YouTube Music Premium, a tak je NewPipe nemůže stáhnout ani přehrát.</string>\n    <string name=\"private_content\">Tento obsah je soukromý, a tak jej NewPipe nemůže stáhnout ani přehrát.</string>\n    <string name=\"soundcloud_go_plus_content\">Toto je stopa SoundCloud Go+, přinejmenším ve Vaší zemi, a tak ji NewPipe nemůže stáhnout ani přehrát.</string>\n    <string name=\"georestricted_content\">Tento obsah není ve vaší zemi dostupný.</string>\n    <string name=\"show_channel_details\">Zobrazit podrobnosti kanálu</string>\n    <string name=\"recaptcha_solve\">Vyřešit</string>\n    <string name=\"restricted_video_no_stream\">Toto video je věkově omezeno.\n\\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.</string>\n    <string name=\"night_theme_title\">Noční motiv</string>\n    <string name=\"disable_media_tunneling_summary\">Vypněte media-tunelling, pokud během přehrávání zaznamenáte temnou obrazovku nebo zadrhávání.</string>\n    <string name=\"disable_media_tunneling_title\">Vypnout media-tunelling</string>\n    <string name=\"open_website_license\">Přejít na website</string>\n    <string name=\"metadata_privacy_internal\">Interní</string>\n    <string name=\"metadata_privacy_private\">Soukromé</string>\n    <string name=\"metadata_privacy_unlisted\">Neuvedeno v seznamu</string>\n    <string name=\"metadata_privacy_public\">Veřejné</string>\n    <string name=\"metadata_host\">Server</string>\n    <string name=\"metadata_support\">Podpora</string>\n    <string name=\"metadata_language\">Jazyk</string>\n    <string name=\"metadata_age_limit\">Věkové omezení</string>\n    <string name=\"metadata_privacy\">Soukromí</string>\n    <string name=\"metadata_licence\">Licence</string>\n    <string name=\"metadata_tags\">Štítky</string>\n    <string name=\"metadata_category\">Kategorie</string>\n    <string name=\"description_select_disable\">Vypnout výběr textu v popisu</string>\n    <string name=\"description_select_enable\">Zapnout výběr textu v popisu</string>\n    <string name=\"description_select_note\">Nyní můžete vybrat v popisu text. Pamatujte, že v režimu výběru může stránka blikat a odkazy nemusí reagovat na kliknutí.</string>\n    <string name=\"account_terminated\">Účet uzavřen</string>\n    <string name=\"feed_load_error_fast_unknown\">Režim rychlého feedu o tom neposkytuje více informací.</string>\n    <string name=\"feed_load_error_terminated\">Autorův účet byl uzavřen.\n\\nNewPipe nebude už moci načíst tento feed.\n\\nChcete zrušit objednávku tohoto kanálu\\?</string>\n    <string name=\"feed_load_error_account_info\">Feed pro \\'%s\\' nemohl být načten.</string>\n    <string name=\"feed_load_error\">Chyba při načítání feedu</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Počínaje systémem Android 10 je podporován pouze „Storage Access Framework“</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Budete dotázáni, kde uložit každý stažený soubor</string>\n    <string name=\"no_dir_yet\">Adresář pro stažené soubory dosud nenastaven, zvolte, prosím, výchozí adresář nyní</string>\n    <string name=\"off\">Vypnuto</string>\n    <string name=\"on\">Zapnuto</string>\n    <string name=\"tablet_mode_title\">Režim tabletu</string>\n    <string name=\"dont_show\">Nezobrazovat</string>\n    <string name=\"low_quality_smaller\">Nízká kvalita (menší)</string>\n    <string name=\"high_quality_larger\">Vysoká kvalita (větší)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Náhled miniatur na vyhledávací liště</string>\n    <string name=\"comments_are_disabled\">Komentáře jsou vypnuty</string>\n    <string name=\"detail_heart_img_view_description\">Srdíčko od tvůrce</string>\n    <string name=\"mark_as_watched\">Označit jako zhlédnuté</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s stažení smazáno</item>\n        <item quantity=\"few\">%1$s stažení smazána</item>\n        <item quantity=\"other\">%1$s staženích smazáno</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Stahování dokončeno</item>\n        <item quantity=\"few\">%s stahování dokončena</item>\n        <item quantity=\"other\">%s stahováních dokončeno</item>\n    </plurals>\n    <string name=\"remote_search_suggestions\">Vzdálené návrhy vyhledávání</string>\n    <string name=\"local_search_suggestions\">Lokální návrhy vyhledávání</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"enqueued_next\">Další ve frontě</string>\n    <string name=\"enqueue_next_stream\">Přidat do fronty (další)</string>\n    <string name=\"main_page_content_swipe_remove\">Tažením položky odstraníte</string>\n    <string name=\"start_main_player_fullscreen_title\">Spustit hlavní přehrávač na celé obrazovce</string>\n    <string name=\"processing_may_take_a_moment\">Zpracovávám... může trvat moment</string>\n    <string name=\"manual_update_description\">Ručně zkontrolovat zda je k dispozici nová verze</string>\n    <string name=\"check_for_updates\">Kontrola aktualizací</string>\n    <string name=\"error_report_notification_title\">NewPipe narazil na problém, klikněte pro nahlášení</string>\n    <string name=\"error_report_notification_toast\">Došlo k chybě, více v oznámení</string>\n    <string name=\"create_error_notification\">Vytvořit oznámení o chybě</string>\n    <string name=\"checking_updates_toast\">Kontrola aktualizací…</string>\n    <string name=\"show_crash_the_player_title\">Zobrazit „Shodit přehrávač“</string>\n    <string name=\"feed_new_items\">Nové položky</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Pro tuto akci nebyl nalezen žádný vhodný správce souborů.\n\\nNainstalujte správce souborů kompatibilní se Storage Access Framework</string>\n    <string name=\"error_report_channel_name\">Oznámení o hlášení chyb</string>\n    <string name=\"error_report_channel_description\">Oznámení za účelem hlášení chyb</string>\n    <string name=\"no_appropriate_file_manager_message\">Pro tuto akci nebyl nalezen žádný vhodný správce souborů.\n\\nNainstalujte správce souborů nebo zkuste vypnout \\'%s\\' v nastavení stahování</string>\n    <string name=\"show_crash_the_player_summary\">Ukáže volbu pro zřícení během používání přehrávače</string>\n    <string name=\"show_error_snackbar\">Zobrazit krátké oznámení o chybě</string>\n    <string name=\"detail_pinned_comment_view_description\">Připnutý komentář</string>\n    <string name=\"crash_the_player\">Shodit přehrávač</string>\n    <string name=\"leak_canary_not_available\">LeakCanary není dostupné</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Výchozí ExoPlayer</string>\n    <string name=\"settings_category_player_notification_summary\">Nastavit oznámení o právě přehrávaném streamu</string>\n    <string name=\"enable_streams_notifications_title\">Oznámení o nových streamech</string>\n    <string name=\"enable_streams_notifications_summary\">Oznámit o nových streamech od vašich odběrů</string>\n    <string name=\"streams_notifications_interval_title\">Frekvence kontroly</string>\n    <string name=\"any_network\">Jakákoli síť</string>\n    <string name=\"streams_notifications_network_title\">Požadované síťové připojení</string>\n    <string name=\"delete_downloaded_files_confirm\">Odstranit všechny stažené soubory z disku?</string>\n    <string name=\"you_successfully_subscribed\">Objednali jste si nyní tento kanál</string>\n    <string name=\"toggle_all\">Všechny přepnout</string>\n    <string name=\"streams_notification_channel_name\">Nové streamy</string>\n    <string name=\"streams_notification_channel_description\">Oznámení o nových streamech od odběrů</string>\n    <string name=\"check_new_streams\">Spustit kontrolu nových streamů</string>\n    <string name=\"settings_category_player_notification_title\">Upozornění přehrávače</string>\n    <string name=\"notifications\">Oznámení</string>\n    <string name=\"loading_stream_details\">Načítám podrobnosti o streamu…</string>\n    <string name=\"notifications_disabled\">Oznámení jsou vypnuta</string>\n    <string name=\"get_notified\">Přijímat oznámení</string>\n    <string name=\"enumeration_comma\">,</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nový stream</item>\n        <item quantity=\"few\">%s nové streamy</item>\n        <item quantity=\"other\">%s nových streamů</item>\n    </plurals>\n    <string name=\"percent\">Procento</string>\n    <string name=\"semitone\">Půltón</string>\n    <string name=\"progressive_load_interval_title\">Velikost intervalu načtení přehrávání</string>\n    <string name=\"selected_stream_external_player_not_supported\">Vybraný stream není podporován externími přehrávači</string>\n    <string name=\"no_audio_streams_available_for_external_players\">U externích přehrávačů nejsou dostupné žádné zvukové streamy</string>\n    <string name=\"unknown_format\">Neznámý formát</string>\n    <string name=\"unknown_quality\">Neznámá kvalita</string>\n    <string name=\"streams_not_yet_supported_removed\">Streamy, které zatím nejsou podporovány systémem stahování, nebudou zobrazeny</string>\n    <string name=\"select_quality_external_players\">Vyberte kvalitu pro externí přehrávače</string>\n    <string name=\"no_video_streams_available_for_external_players\">U externích přehrávačů nejsou k dispozici žádné videostreamy</string>\n    <string name=\"faq_title\">Často kladené dotazy</string>\n    <string name=\"faq_description\">Pokud máte potíže s používáním aplikace, přečtěte si tyto odpovědi na časté otázky!</string>\n    <string name=\"faq\">Zobrazit na webu</string>\n    <string name=\"sort\">Řazení</string>\n    <string name=\"app_update_available_notification_text\">Klepnutím stáhnete %s</string>\n    <string name=\"fast_mode\">Rychlý režim</string>\n    <string name=\"app_update_unavailable_toast\">Používáte nejnovější verzi NewPipe</string>\n    <string name=\"import_subscriptions_hint\">Importujte nebo exportujte odběry z 3tečkové nabídky</string>\n    <string name=\"night_theme_available\">Tato možnost je dostupná pouze při vybraném motivu %s</string>\n    <string name=\"unset_playlist_thumbnail\">Zrušení nastavení trvalého náhledu</string>\n    <string name=\"card\">Karta</string>\n    <string name=\"msg_failed_to_copy\">Kopírování do schránky se nezdařilo</string>\n    <string name=\"duplicate_in_playlist\">Zašedlé playlisty již obsahují tuto položku.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplikát přidán %dkrát</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorovat události hardwarových tlačítek médií</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Užitečné například v případě, že používáte sluchátka s rozbitými fyzickými tlačítky</string>\n    <string name=\"remove_duplicates_title\">Odstranit duplicity\\?</string>\n    <string name=\"feed_hide_streams_title\">Zobrazit následující streamy</string>\n    <string name=\"feed_show_hide_streams\">Zobrazit/skrýt streamy</string>\n    <string name=\"feed_show_watched\">Celé zhlédnuto</string>\n    <string name=\"feed_show_partially_watched\">Částečně zhlédnuto</string>\n    <string name=\"feed_show_upcoming\">Nadcházející</string>\n    <string name=\"remove_duplicates\">Odstranit duplicity</string>\n    <string name=\"remove_duplicates_message\">Chcete odstranit všechny duplicitní streamy v tomto playlistu\\?</string>\n    <string name=\"left_gesture_control_title\">Akce levého gesta</string>\n    <string name=\"right_gesture_control_title\">Akce pravého gesta</string>\n    <string name=\"volume\">Hlasitost</string>\n    <string name=\"none\">Žádné</string>\n    <string name=\"left_gesture_control_summary\">Vyberte gesto pro levou polovinu obrazovky přehrávače</string>\n    <string name=\"brightness\">Jas</string>\n    <string name=\"right_gesture_control_summary\">Vyberte gesto pro pravou polovinu obrazovky přehrávače</string>\n    <string name=\"progressive_load_interval_summary\">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í</string>\n    <string name=\"prefer_original_audio_title\">Upřednostňovat původní zvuk</string>\n    <string name=\"prefer_original_audio_summary\">Vybrat původní zvukovou stopu bez ohledu na jazyk</string>\n    <string name=\"prefer_descriptive_audio_title\">Upřednostňovat popisný zvuk</string>\n    <string name=\"prefer_descriptive_audio_summary\">Vybrat zvukovou stopu s popisem pro zrakově postižené, pokud je k dispozici</string>\n    <string name=\"unknown_audio_track\">Neznámá</string>\n    <string name=\"settings_category_exoplayer_title\">Nastavení přehrávače ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">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</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Použít funkci náhradního dekodéru přehrávače ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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ů</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Vždy použít nastavení povrchu výstupu videa v přehrávači ExoPlayer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">původní</string>\n    <string name=\"audio_track_type_dubbed\">dabovaná</string>\n    <string name=\"audio_track_type_descriptive\">popisná</string>\n    <string name=\"audio_track\">Zvuková stopa</string>\n    <string name=\"audio_track_present_in_video\">V tomto streamu by již měla být přítomna zvuková stopa</string>\n    <string name=\"select_audio_track_external_players\">Vyberte zvukovou stopu pro externí přehrávače</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\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</string>\n    <string name=\"play_queue_audio_track\">Zvuk: %s</string>\n    <string name=\"main_tabs_position_title\">Pozice hlavních karet</string>\n    <string name=\"main_tabs_position_summary\">Přesunout výběr hlavní karty dolů</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Na vašem zařízení byl zakázán media tunelling, protože model vašeho zařízení jej nepodporuje.</string>\n    <string name=\"no_streams\">Žádná videa</string>\n    <string name=\"no_live_streams\">Žádné živé přenosy</string>\n    <string name=\"loading_metadata_title\">Načítání metadat…</string>\n    <string name=\"feed_fetch_channel_tabs\">Karty kanálu k načtení</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">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.</string>\n    <string name=\"metadata_uploader_avatars\">Nahrané avatary</string>\n    <string name=\"metadata_thumbnails\">Náhledy</string>\n    <string name=\"image_quality_title\">Kvalita obrázků</string>\n    <string name=\"channel_tab_videos\">Videa</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Odběratelé</string>\n    <string name=\"show_channel_tabs_summary\">Které karty mají být zobrazeny na stránkách kanálů</string>\n    <string name=\"share_playlist_with_list\">Sdílet seznam adres</string>\n    <string name=\"share_playlist_with_titles\">Sdílet s názvy</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_channel_tabs\">Karty kanálu</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"toggle_screen_orientation\">Přepnout orientaci obrazovky</string>\n    <string name=\"image_quality_low\">Nízká kvalita</string>\n    <string name=\"toggle_fullscreen\">Přepnout celou obrazovku</string>\n    <string name=\"metadata_avatars\">Avatary</string>\n    <string name=\"next_stream\">Další stream</string>\n    <string name=\"metadata_subchannel_avatars\">Subkanálové avatary</string>\n    <string name=\"open_play_queue\">Otevřít frontu přehrávání</string>\n    <string name=\"image_quality_none\">Nenačítat obrázky</string>\n    <string name=\"image_quality_high\">Vysoká kvalita</string>\n    <string name=\"channel_tab_about\">Informace</string>\n    <string name=\"share_playlist\">Sdílet playlist</string>\n    <string name=\"forward\">Přetočení vpřed</string>\n    <string name=\"channel_tab_albums\">Alba</string>\n    <string name=\"rewind\">Přetočení zpět</string>\n    <string name=\"replay\">Znovu přehrát</string>\n    <string name=\"image_quality_medium\">Střední kvalita</string>\n    <string name=\"metadata_banners\">Bannery</string>\n    <string name=\"channel_tab_playlists\">Playlisty</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"play\">Přehrát</string>\n    <string name=\"more_options\">Další možnosti</string>\n    <string name=\"channel_tab_tracks\">Skladby</string>\n    <string name=\"duration\">Trvání</string>\n    <string name=\"channel_tab_channels\">Kanály</string>\n    <string name=\"previous_stream\">Předchozí stream</string>\n    <string name=\"channel_tab_livestreams\">Živě</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s odpověď</item>\n        <item quantity=\"few\">%s odpovědi</item>\n        <item quantity=\"other\">%s odpovědí</item>\n    </plurals>\n    <string name=\"show_more\">Zobrazit více</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"show_less\">Zobrazit méně</string>\n    <string name=\"error_insufficient_storage\">Nedostatek volného místa v zařízení</string>\n    <string name=\"settings_category_backup_restore_title\">Záloha a obnovení</string>\n    <string name=\"reset_settings_title\">Obnovit nastavení</string>\n    <string name=\"reset_settings_summary\">Obnovení všech nastavení na výchozí hodnoty</string>\n    <string name=\"reset_all_settings\">Obnovením nastavení se zruší všechna preferovaná nastavení a aplikace se restartuje.\n\\n\n\\nJste si jisti, že chcete pokračovat?</string>\n    <string name=\"yes\">Ano</string>\n    <string name=\"no\">Ne</string>\n    <string name=\"auto_update_check_description\">NewPipe může čas od času automaticky kontrolovat nové verze a upozornit vás na jejich dostupnost.\n\\nChcete tuto funkci povolit?</string>\n    <string name=\"import_settings_vulnerable_format\">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í.</string>\n    <string name=\"audio_track_type_secondary\">sekundární</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Sdílet jako dočasný playlist YouTube</string>\n    <string name=\"tab_bookmarks_short\">Playlisty</string>\n    <string name=\"select_a_feed_group\">Vybrat skupinu kanálů</string>\n    <string name=\"no_feed_group_created_yet\">Zatím nebyla vytvořena žádná skupina kanálů</string>\n    <string name=\"feed_group_page_summary\">Stránka skupiny kanálů</string>\n    <string name=\"search_with_service_name\">Hledat %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Hledat %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Líbí se</string>\n    <string name=\"migration_info_6_7_title\">Stránka SoundCloud Top 50 odstraněna</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud zrušil původní žebříčky Top 50. Příslušná karta byla odstraněna z vaší hlavní stránky.</string>\n    <string name=\"migration_info_7_8_title\">YouTube kombinované trendy odstraněny</string>\n    <string name=\"migration_info_7_8_message\">YouTube ukončil provoz kombinované stránky s trendy k 21. červenci 2025. NewPipe nahradil výchozí stránku s trendy stránkou s trendy živými přenosy.\\n\\nMůžete také vybrat různé stránky s trendy v části „Nastavení &gt; Obsah &gt; Obsah úvodní stránky“.</string>\n    <string name=\"trending_gaming\">Populární hry</string>\n    <string name=\"trending_podcasts\">Populární podcasty</string>\n    <string name=\"trending_movies\">Populární filmy a seriály</string>\n    <string name=\"trending_music\">Populární hudba</string>\n    <string name=\"short_thousand\">%s tis.</string>\n    <string name=\"short_million\">%s mil.</string>\n    <string name=\"short_billion\">%s mld.</string>\n    <string name=\"permission_display_over_apps_message\">Pro používání Popup Playeru vyberte v následující nabídce nastavení Androidu možnost %1$s a povolte %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"Povolit zobrazení přes jiné aplikace\\\"</string>\n    <string name=\"delete_file\">Vymazat soubor</string>\n    <string name=\"delete_entry\">Vymazat položku</string>\n    <string name=\"entry_deleted\">Položka vymazána</string>\n    <string name=\"account_terminated_service_provides_reason\">Ukončení účtu\\n\\n%1$s uvádí tento důvod: %2$s</string>\n    <string name=\"player_http_403\">Během přehrávání byla ze serveru přijata chyba HTTP 403, pravděpodobně způsobená vypršením platnosti streamingové adresy URL nebo zákazem IP adresy</string>\n    <string name=\"player_http_invalid_status\">Chyba HTTP %1$s obdržená ze serveru během přehrávání</string>\n    <string name=\"youtube_player_http_403\">Chyba HTTP 403 obdržená od serveru během přehrávání, pravděpodobně způsobená zákazem IP adresy nebo problémy s deobfuskací streamovací adresy URL</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s odmítl poskytnout data, žádá o přihlášení k potvrzení, že žadatel není bot.\\n\\nVaše IP adresa mohla být dočasně zakázána %1$s, můžete nějakou dobu počkat nebo přepnout na jinou IP adresu (například zapnutím/vypnutím VPN nebo přepnutím z WiFi na mobilní data).</string>\n    <string name=\"unsupported_content_in_country\">Tento obsah není pro aktuálně vybranou zemi obsahu dostupný.\\n\\nZměňte výběr v nabídce \\\"Nastavení &gt; Obsah &gt; Výchozí země obsahu\\\".</string>\n    <string name=\"kao_dialog_warning\">Společnost Google oznámila, že od roku 2026/2027 budou všechny aplikace na certifikovaných zařízeních Android vyžadovat, aby vývojář odeslal své osobní identifikační údaje přímo společnosti Google. Jelikož vývojáři této aplikace s tímto požadavkem nesouhlasí, aplikace po tomto datu přestane na certifikovaných zařízeních Android fungovat.</string>\n    <string name=\"kao_dialog_more_info\">Podrobnosti</string>\n    <string name=\"kao_solution\">Řešení</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-cy/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "app/src/main/res/values-da/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Tryk på forstørrelsesglasset for at komme i gang.</string>\n    <string name=\"upload_date_text\">Udgivet d. %1$s</string>\n    <string name=\"no_player_found\">Ingen streamafspiller blev fundet. Installer VLC?</string>\n    <string name=\"no_player_found_toast\">Ingen streamafspiller blev fundet (du kan installere VLC for at afspille den).</string>\n    <string name=\"install\">Installer</string>\n    <string name=\"cancel\">Annuller</string>\n    <string name=\"open_in_browser\">Åbn i browser</string>\n    <string name=\"open_in_popup_mode\">Åbn i popup-tilstand</string>\n    <string name=\"share\">Del</string>\n    <string name=\"download\">Hent</string>\n    <string name=\"controls_download_desc\">Hent stream-fil</string>\n    <string name=\"search\">Søg</string>\n    <string name=\"settings\">Indstillinger</string>\n    <string name=\"did_you_mean\">Mente du \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Del med</string>\n    <string name=\"use_external_video_player_title\">Brug ekstern videoafspiller</string>\n    <string name=\"use_external_video_player_summary\">Fjerner lyd ved nogle opløsninger</string>\n    <string name=\"use_external_audio_player_title\">Brug ekstern lydafspiller</string>\n    <string name=\"subscribe_button_title\">Abonner</string>\n    <string name=\"subscribed_button_title\">Abonnerer</string>\n    <string name=\"unsubscribe\">Afmeld</string>\n    <string name=\"channel_unsubscribed\">Kanal afmeldt</string>\n    <string name=\"subscription_change_failed\">Kunne ikke ændre abonnement</string>\n    <string name=\"subscription_update_failed\">Kunne ikke opdatere abonnement</string>\n    <string name=\"show_info\">Vis info</string>\n    <string name=\"tab_subscriptions\">Abonnementer</string>\n    <string name=\"tab_bookmarks\">Gemte Playlister</string>\n    <string name=\"tab_choose\">Vælg Fane</string>\n    <string name=\"fragment_feed_title\">Nyheder</string>\n    <string name=\"controls_background_title\">Baggrund</string>\n    <string name=\"controls_popup_title\">Popup</string>\n    <string name=\"controls_add_to_playlist_title\">Føj til</string>\n    <string name=\"download_path_title\">Lagringsmappe til videoer</string>\n    <string name=\"download_path_summary\">Hentede videoer gemmes her</string>\n    <string name=\"download_path_dialog_title\">Vælg lagringsmappe til videofiler</string>\n    <string name=\"download_path_audio_title\">Lagringsmappe til lydfiler</string>\n    <string name=\"download_path_audio_summary\">Hentede lydfiler gemmes her</string>\n    <string name=\"download_path_audio_dialog_title\">Vælg lagringsmappe til lydfiler</string>\n    <string name=\"default_resolution_title\">Standardopløsning</string>\n    <string name=\"default_popup_resolution_title\">Standardopløsning til popup</string>\n    <string name=\"show_higher_resolutions_title\">Vis højere opløsninger</string>\n    <string name=\"show_higher_resolutions_summary\">Kun nogle enheder kan afspille 2K-/4K-videoer</string>\n    <string name=\"play_with_kodi_title\">Afspil med Kodi</string>\n    <string name=\"kore_not_found\">Installer manglende Kore-app?</string>\n    <string name=\"show_play_with_kodi_title\">Vis valgmuligheden \\\"Afspil med Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Vis en mulighed for at afspille en video via Kodi-mediecenter</string>\n    <string name=\"play_audio\">Lyd</string>\n    <string name=\"default_audio_format_title\">Standard lydformat</string>\n    <string name=\"default_video_format_title\">Standard videoformat</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"light_theme_title\">Lys</string>\n    <string name=\"dark_theme_title\">Mørk</string>\n    <string name=\"black_theme_title\">Sort</string>\n    <string name=\"popup_remember_size_pos_title\">Husk popup-egenskaber</string>\n    <string name=\"popup_remember_size_pos_summary\">Husk sidste størrelse og placering af popup-afspiller</string>\n    <string name=\"use_inexact_seek_title\">Brug hurtig og upræcis søgning</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Billedcache ryddet</string>\n    <string name=\"metadata_cache_wipe_title\">Ryd metadata-cache</string>\n    <string name=\"metadata_cache_wipe_summary\">Fjern alle cached websidedata</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metadata-cache ryddet</string>\n    <string name=\"auto_queue_title\">Føj automatisk næste stream til kø</string>\n    <string name=\"auto_queue_summary\">Fortsæt en afspilningskø, der afsluttes (ikke-gentagende), ved at tilføje en lignende stream</string>\n    <string name=\"show_search_suggestions_title\">Søgeforslag</string>\n    <string name=\"show_search_suggestions_summary\">Vælg forslagene, der vises, når der søges</string>\n    <string name=\"enable_search_history_title\">Søgehistorik</string>\n    <string name=\"enable_search_history_summary\">Gem søgninger lokalt</string>\n    <string name=\"enable_watch_history_title\">Visningshistorik</string>\n    <string name=\"enable_watch_history_summary\">Husk sete videoer</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Fortsæt afspilning</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Fortsæt afspilning efter afbrydelser (fx telefonopkald)</string>\n    <string name=\"download_dialog_title\">Hent</string>\n    <string name=\"show_next_and_similar_title\">Vis \\'Næste\\' og \\'Lignende\\' videoer</string>\n    <string name=\"show_hold_to_append_title\">Vis \\\"Hold for at sætte i kø\\\"-tip</string>\n    <string name=\"show_hold_to_append_summary\">Vis tip, når du trykker på baggrunden eller popup-knappen i video \\\"Detaljer:\\\"</string>\n    <string name=\"unsupported_url\">Ikke-understøttet URL</string>\n    <string name=\"default_content_country_title\">Standardland for indhold</string>\n    <string name=\"content_language_title\">Standardsprog for indhold</string>\n    <string name=\"settings_category_player_title\">Afspiller</string>\n    <string name=\"settings_category_player_behavior_title\">Adfærd</string>\n    <string name=\"settings_category_video_audio_title\">Video og lyd</string>\n    <string name=\"settings_category_history_title\">Historik og cache</string>\n    <string name=\"settings_category_appearance_title\">Udseende</string>\n    <string name=\"settings_category_debug_title\">Fejlretning</string>\n    <string name=\"settings_category_updates_title\">Opdateringer</string>\n    <string name=\"background_player_playing_toast\">Afspiller i baggrunden</string>\n    <string name=\"popup_playing_toast\">Afspiller i popup-tilstand</string>\n    <string name=\"content\">Indhold</string>\n    <string name=\"show_age_restricted_content_title\">Vis aldersbegrænset indhold</string>\n    <string name=\"duration_live\">Live</string>\n    <string name=\"downloads\">Downloads</string>\n    <string name=\"downloads_title\">Downloads</string>\n    <string name=\"error_report_title\">Fejlrapport</string>\n    <string name=\"all\">Alle</string>\n    <string name=\"channels\">Kanaler</string>\n    <string name=\"playlists\">Playlister</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">Én video</item>\n        <item quantity=\"other\">%s videoer</item>\n    </plurals>\n    <string name=\"tracks\">Numre</string>\n    <string name=\"users\">Brugere</string>\n    <string name=\"disabled\">Deaktiveret</string>\n    <string name=\"clear\">Ryd</string>\n    <string name=\"best_resolution\">Bedste opløsning</string>\n    <string name=\"undo\">Fortryd</string>\n    <string name=\"file_deleted\">Fil slettet</string>\n    <string name=\"play_all\">Afspil Alle</string>\n    <string name=\"always\">Altid</string>\n    <string name=\"just_once\">Kun Én Gang</string>\n    <string name=\"file\">Fil</string>\n    <string name=\"notification_channel_name\">NewPipe-notifikation</string>\n    <string name=\"notification_channel_description\">Notifikationer for NewPipes afspiller</string>\n    <string name=\"app_update_notification_channel_name\">Notifikation om app-opdatering</string>\n    <string name=\"app_update_notification_channel_description\">Notifikationer for nye NewPipe-versioner</string>\n    <string name=\"unknown_content\">[Ukendt]</string>\n    <string name=\"switch_to_background\">Skift til baggrund</string>\n    <string name=\"switch_to_popup\">Skift til popup</string>\n    <string name=\"switch_to_main\">Skift til hovedafspiller</string>\n    <string name=\"import_data_title\">Importér database</string>\n    <string name=\"export_data_title\">Eksportér database</string>\n    <string name=\"import_data_summary\">Overskriver din nuværende historik, abonnementer, playlister og (hvis det ønskes) indstillinger</string>\n    <string name=\"export_data_summary\">Eksportér historik, abonnementer, playlister og indstillinger</string>\n    <string name=\"clear_views_history_title\">Ryd visningshistorik</string>\n    <string name=\"clear_views_history_summary\">Sletter historikken over afspillede streams og afspilningspositionerne</string>\n    <string name=\"delete_view_history_alert\">Slet hele visningshistorikken\\?</string>\n    <string name=\"watch_history_deleted\">Visningshistorik slettet</string>\n    <string name=\"clear_search_history_title\">Ryd søgehistorik</string>\n    <string name=\"clear_search_history_summary\">Sletter historik for søgeord</string>\n    <string name=\"delete_search_history_alert\">Slet hele søgehistorik?</string>\n    <string name=\"search_history_deleted\">Søgehistorik slettet</string>\n    <string name=\"general_error\">Fejl</string>\n    <string name=\"download_to_sdcard_error_title\">Eksternt lager utilgængeligt</string>\n    <string name=\"download_to_sdcard_error_message\">Det er endnu ikke muligt at hente til et eksternt SD-kort. Nulstil lagringsmappens placering?</string>\n    <string name=\"network_error\">Netværksfejl</string>\n    <string name=\"could_not_load_thumbnails\">Kunne ikke indlæse alle miniaturebilleder</string>\n    <string name=\"parsing_error\">Kunne ikke analysere webside</string>\n    <string name=\"content_not_available\">Indhold utilgængeligt</string>\n    <string name=\"could_not_setup_download_menu\">Kunne ikke opsætte download-menu</string>\n    <string name=\"app_ui_crash\">App/UI gik ned</string>\n    <string name=\"player_stream_failure\">Kunne ikke afspille denne stream</string>\n    <string name=\"player_unrecoverable_failure\">Uoprettelig afspillerfejl opstod</string>\n    <string name=\"player_recoverable_failure\">Genopretter efter afspillerfejl</string>\n    <string name=\"external_player_unsupported_link_type\">Eksterne afspillere understøtter ikke disse typer af links</string>\n    <string name=\"video_streams_empty\">Ingen videostreams fundet</string>\n    <string name=\"audio_streams_empty\">Ingen lydstreams fundet</string>\n    <string name=\"invalid_directory\">Mappen findes ikke</string>\n    <string name=\"invalid_source\">Fil eller indholdskilde findes ikke</string>\n    <string name=\"invalid_file\">Filen findes ikke, ellers mangler der tilladelse til at læse eller skrive til den</string>\n    <string name=\"file_name_empty_error\">Filnavn må ikke være tomt</string>\n    <string name=\"error_occurred_detail\">En fejl opstod: %1$s</string>\n    <string name=\"no_streams_available_download\">Ingen streams tilgængelige til hentning</string>\n    <string name=\"saved_tabs_invalid_json\">Kunne ikke læse gemte faner, så bruger standardfaner</string>\n    <string name=\"restore_defaults\">Gendan standardindstillinger</string>\n    <string name=\"restore_defaults_confirmation\">Vil du gendanne standardindstillinger?</string>\n    <string name=\"sorry_string\">Undskyld, dette skulle ikke være sket.</string>\n    <string name=\"error_report_button_text\">Rapportér via e-mail</string>\n    <string name=\"error_snackbar_message\">Beklager, noget gik galt.</string>\n    <string name=\"error_snackbar_action\">Rapportér</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"what_happened_headline\">Hvad skete der:</string>\n    <string name=\"your_comment\">Din kommentar (på engelsk):</string>\n    <string name=\"error_details_headline\">Detaljer:</string>\n    <string name=\"detail_thumbnail_view_description\">Afspil video, varighed:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Uploaders profilbillede</string>\n    <string name=\"detail_likes_img_view_description\">Synes godt om</string>\n    <string name=\"detail_dislikes_img_view_description\">Kan ikke lide</string>\n    <string name=\"search_no_results\">Ingen resultater</string>\n    <string name=\"detail_drag_description\">Træk for at omarrangere</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Lyd</string>\n    <string name=\"retry\">Prøv igen</string>\n    <string name=\"no_subscribers\">Ingen abonnenter</string>\n    <string name=\"subscribers_count_not_available\">Antal abonnenter utilgængeligt</string>\n    <string name=\"no_views\">Ingen visninger</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s visning</item>\n        <item quantity=\"other\">%s visninger</item>\n    </plurals>\n    <string name=\"no_videos\">Ingen videoer</string>\n    <string name=\"start\">Start</string>\n    <string name=\"create\">Opret</string>\n    <string name=\"delete\">Slet</string>\n    <string name=\"checksum\">Kontrolsum</string>\n    <string name=\"dismiss\">Afvis</string>\n    <string name=\"rename\">Omdøb</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Filnavn</string>\n    <string name=\"msg_threads\">Tråde</string>\n    <string name=\"msg_error\">Fejl</string>\n    <string name=\"msg_running\">NewPipe henter</string>\n    <string name=\"msg_running_detail\">Tryk for detaljer</string>\n    <string name=\"msg_wait\">Vent venligst…</string>\n    <string name=\"msg_copied\">Kopieret til udklipsholder</string>\n    <string name=\"no_available_dir\">Angiv venligst en lagringsmappe senere i indstillinger</string>\n    <string name=\"msg_popup_permission\">Denne tilladelse er nødvendig for\n\\nat åbne i popup-tilstand</string>\n    <string name=\"one_item_deleted\">1 element slettet.</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA-udfordring</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA-udfordring anmodet</string>\n    <string name=\"settings_category_downloads_title\">Hent</string>\n    <string name=\"settings_file_charset_title\">Tilladte tegn i filnavne</string>\n    <string name=\"settings_file_replacement_character_summary\">Ugyldige tegn erstattes med denne værdi</string>\n    <string name=\"settings_file_replacement_character_title\">Erstatningstegn</string>\n    <string name=\"charset_letters_and_digits\">Bogstaver og cifre</string>\n    <string name=\"charset_most_special_characters\">De fleste specialtegn</string>\n    <string name=\"title_activity_about\">Om NewPipe</string>\n    <string name=\"title_licenses\">Tredjepartslicenser</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s af %2$s under %3$s</string>\n    <string name=\"tab_about\">Om &amp; Ofte Stillede Spørgsmål</string>\n    <string name=\"tab_licenses\">Licenser</string>\n    <string name=\"app_description\">Fri letvægtsstreaming på Android.</string>\n    <string name=\"contribution_title\">Bidrag</string>\n    <string name=\"contribution_encouragement\">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!</string>\n    <string name=\"view_on_github\">Se på GitHub</string>\n    <string name=\"donation_title\">Donér</string>\n    <string name=\"donation_encouragement\">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.</string>\n    <string name=\"give_back\">Giv tilbage</string>\n    <string name=\"website_title\">Hjemmeside</string>\n    <string name=\"website_encouragement\">Besøg NewPipe\\'s hjemmeside for flere oplysninger og nyheder.</string>\n    <string name=\"privacy_policy_title\">NewPipe\\'s Privatlivspolitik</string>\n    <string name=\"read_privacy_policy\">Læs privatlivspolitik</string>\n    <string name=\"app_license_title\">NewPipe\\'s Licens</string>\n    <string name=\"app_license\">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.</string>\n    <string name=\"read_full_license\">Læs licens</string>\n    <string name=\"title_activity_history\">Historik</string>\n    <string name=\"action_history\">Historik</string>\n    <string name=\"delete_item_search_history\">Vil du slette dette element fra søgehistorikken\\?</string>\n    <string name=\"title_last_played\">Sidst Afspillet</string>\n    <string name=\"title_most_played\">Mest Afspillet</string>\n    <string name=\"main_page_content\">Indhold af hovedside</string>\n    <string name=\"main_page_content_summary\">Hvilke faner vises på hovedsiden</string>\n    <string name=\"blank_page_summary\">Tom side</string>\n    <string name=\"kiosk_page_summary\">Kioskside</string>\n    <string name=\"channel_page_summary\">Kanalside</string>\n    <string name=\"select_a_channel\">Vælg en kanal</string>\n    <string name=\"no_channel_subscribed_yet\">Ingen kanalabonnementer endnu</string>\n    <string name=\"select_a_kiosk\">Vælg en kiosk</string>\n    <string name=\"export_complete_toast\">Eksporteret</string>\n    <string name=\"import_complete_toast\">Importeret</string>\n    <string name=\"no_valid_zip_file\">Ingen gyldig ZIP-fil</string>\n    <string name=\"could_not_import_all_files\">Advarsel: Kunne ikke importere alle filer.</string>\n    <string name=\"override_current_data\">Dette vil overskrive dine nuværende indstillinger.</string>\n    <string name=\"import_settings\">Vil du også importere indstillinger\\?</string>\n    <string name=\"trending\">Populært lige nu</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Nyt og populært</string>\n    <string name=\"play_queue_remove\">Fjern</string>\n    <string name=\"play_queue_stream_detail\">Detaljer</string>\n    <string name=\"play_queue_audio_settings\">Lydindstillinger</string>\n    <string name=\"hold_to_append\">Hold for at sætte i kø</string>\n    <string name=\"preferred_open_action_settings_title\">Foretrukken \\'åbn\\'-handling</string>\n    <string name=\"video_player\">Videoafspiller</string>\n    <string name=\"background_player\">Baggrundsafspiller</string>\n    <string name=\"popup_player\">Popup-afspiller</string>\n    <string name=\"always_ask_open_action\">Spørg altid</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Henter info…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Indlæser det ønskede indhold</string>\n    <string name=\"create_playlist\">Ny Playliste</string>\n    <string name=\"rename_playlist\">Omdøb</string>\n    <string name=\"name\">Navn</string>\n    <string name=\"add_to_playlist\">Føj til playliste</string>\n    <string name=\"delete_playlist_prompt\">Slet denne playliste?</string>\n    <string name=\"playlist_creation_success\">Playliste oprettet</string>\n    <string name=\"caption_none\">Ingen Undertekster</string>\n    <string name=\"resize_fit\">Tilpas</string>\n    <string name=\"resize_fill\">Udfyld</string>\n    <string name=\"resize_zoom\">Zoom</string>\n    <string name=\"caption_auto_generated\">Autogenereret</string>\n    <string name=\"caption_setting_title\">Undertekster</string>\n    <string name=\"export_to\">Eksportér til</string>\n    <string name=\"playback_reset\">Nulstil</string>\n    <string name=\"accept\">Acceptér</string>\n    <string name=\"decline\">Afvis</string>\n    <string name=\"limit_data_usage_none_description\">Ingen begrænsning</string>\n    <string name=\"limit_mobile_data_usage_title\">Begræns opløsning, når mobildata bruges</string>\n    <string name=\"updates_setting_title\">Opdateringer</string>\n    <string name=\"list_view_mode\">Listevisning</string>\n    <string name=\"list\">Liste</string>\n    <string name=\"grid\">Gitter</string>\n    <string name=\"auto\">Automatisk</string>\n    <string name=\"missions_header_finished\">Færdig</string>\n    <string name=\"missions_header_pending\">Afventer</string>\n    <string name=\"post_processing\">efterbehandling</string>\n    <string name=\"enqueue\">Sæt i kø</string>\n    <string name=\"permission_denied\">Handling afvist af systemet</string>\n    <string name=\"download_failed\">Hentning mislykkedes</string>\n    <string name=\"generate_unique_name\">Generér unikt navn</string>\n    <string name=\"overwrite\">Overskriv</string>\n    <string name=\"overwrite_unrelated_warning\">En fil med dette navn eksisterer allerede</string>\n    <string name=\"overwrite_finished_warning\">En hentet fil med dette navn eksisterer allerede</string>\n    <string name=\"download_already_running\">En download med dette navn er i gang</string>\n    <string name=\"show_error\">Vis fejl</string>\n    <string name=\"error_file_creation\">Filen kan ikke oprettes</string>\n    <string name=\"error_path_creation\">Destinationsmappen kan ikke oprettes</string>\n    <string name=\"error_ssl_exception\">Kunne ikke etablere en sikker forbindelse</string>\n    <string name=\"error_unknown_host\">Kunne ikke finde serveren</string>\n    <string name=\"error_connect_host\">Kan ikke oprette forbindelse til serveren</string>\n    <string name=\"error_http_no_content\">Serveren sender ikke data</string>\n    <string name=\"error_http_unsupported_range\">Serveren accepterer ikke multitrådede downloads; prøv igen med @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Ikke fundet</string>\n    <string name=\"error_postprocessing_failed\">Efterbehandling mislykkedes</string>\n    <string name=\"stop\">Stop</string>\n    <string name=\"events\">Hændelser</string>\n    <string name=\"empty_list_subtitle\">Ikke andet end fårekyllinger her</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s abonnent</item>\n        <item quantity=\"other\">%s abonnenter</item>\n    </plurals>\n    <string name=\"pause\">Pause</string>\n    <string name=\"subscriptions_import_unsuccessful\">Kunne ikke importere abonnementer</string>\n    <string name=\"subscriptions_export_unsuccessful\">Kunne ikke eksportere abonnementer</string>\n    <string name=\"conferences\">Konferencer</string>\n    <string name=\"start_here_on_background\">Start afspilning i baggrunden</string>\n    <string name=\"start_here_on_popup\">Start afspilning i et popup</string>\n    <string name=\"drawer_open\">Åbn Skuffe</string>\n    <string name=\"drawer_close\">Luk Skuffe</string>\n    <string name=\"info_labels\">Hvad:\\nForespørgsel:\\nIndholdssprog:\\nIndholdsland:\\nApp-sprog:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersion:\\nOS-version:</string>\n    <string name=\"preferred_open_action_settings_summary\">Standardhandling ved åbning af indhold — %s</string>\n    <string name=\"set_as_playlist_thumbnail\">Anvend som playlistens miniaturebillede</string>\n    <string name=\"bookmark_playlist\">Bogmærk Playliste</string>\n    <string name=\"unbookmark_playlist\">Fjern Bogmærke</string>\n    <string name=\"playlist_add_stream_success\">Føjet til playliste</string>\n    <string name=\"playlist_thumbnail_change_success\">Ændret playlistens miniaturebillede.</string>\n    <string name=\"caption_setting_description\">Ændr undertekststørrelse og baggrundsstil. Kræver genstart af appen for at træde i kraft</string>\n    <string name=\"enable_leak_canary_summary\">Overvågning af hukommelseslækager kan medføre, at appen ikke reagerer, når heap-dumpning udføres</string>\n    <string name=\"enable_disposed_exceptions_title\">Rapportér out-of-lifecycle-fejl</string>\n    <string name=\"import_title\">Importér</string>\n    <string name=\"import_from\">Importér fra</string>\n    <string name=\"import_ongoing\">Importerer…</string>\n    <string name=\"export_ongoing\">Eksporterer…</string>\n    <string name=\"import_file_title\">Importér fil</string>\n    <string name=\"previous_export\">Forrige eksport</string>\n    <string name=\"import_youtube_instructions\">Importér YouTube-abonnementer ved at hente eksportfilen:\n\\n\n\\n1. Gå til denne webadresse: %1$s\n\\n2. Log ind, når du bliver bedt om det\n\\n3. Klik på \\\"Alle Youtube-data medtages\\\", og fravælg alt bortset fra \\\"abonnementer\\\".\n\\n4. Klik på \\\"Næste trin\\\", og derefter \\\"Opret eksport\\\".\n\\n5. Klik på \\\"Download\\\"-knappen efter den popper frem.\n\\n6. Klik på \\\"IMPORTÉR FIL\\\" nederst på denne side, og vælg den hentede .zip-fil.\n\\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</string>\n    <string name=\"import_soundcloud_instructions_hint\">ditID, soundcloud.com/ditID</string>\n    <string name=\"import_network_expensive_warning\">Bemærk, at denne operation kan kræve meget netværkstrafik.\n\\n\n\\nVil du fortsætte?</string>\n    <string name=\"playback_speed_control\">Knapper for Afspilningshastighed</string>\n    <string name=\"playback_tempo\">Tempo</string>\n    <string name=\"playback_pitch\">Tonehøjde</string>\n    <string name=\"skip_silence_checkbox\">Spol forbi stilhed</string>\n    <string name=\"playback_step\">Skridt</string>\n    <string name=\"updates_setting_description\">Vis en notifikation for at foreslå opdatering af appen, når en ny version er tilgængelig</string>\n    <string name=\"minimize_on_exit_title\">Minimer ved appskift</string>\n    <string name=\"minimize_on_exit_summary\">Handling ved skift til anden app fra hovedvideoafspiller — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Ingen</string>\n    <string name=\"minimize_on_exit_background_description\">Minimer til baggrundsafspiller</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimer til popup-afspiller</string>\n    <string name=\"app_update_available_notification_title\">En NewPipe-opdatering er tilgængelig!</string>\n    <string name=\"paused\">sat på pause</string>\n    <string name=\"queued\">sat i kø</string>\n    <string name=\"max_retry_msg\">Maks. antal genforsøg</string>\n    <string name=\"max_retry_desc\">Maks. antal forsøg, før downloaden annulleres</string>\n    <string name=\"pause_downloads_on_mobile\">Afbryd på forbrugsafregnede netværk</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Nyttigt ved skift til mobildata, selv om nogle downloads ikke kan sættes på pause</string>\n    <string name=\"peertube_instance_add_https_only\">Kun HTTPS-URL\\'er understøttes</string>\n    <string name=\"peertube_instance_add_exists\">Instansen findes allerede</string>\n    <string name=\"peertube_instance_add_fail\">Kunne ikke validere instansen</string>\n    <string name=\"peertube_instance_add_help\">Indtast instans-URL</string>\n    <string name=\"peertube_instance_add_title\">Tilføj instans</string>\n    <string name=\"peertube_instance_url_help\">Find de instanser, du kan lide på %s</string>\n    <string name=\"peertube_instance_url_summary\">Vælg dine yndlings PeerTube-instanser</string>\n    <string name=\"peertube_instance_url_title\">PeerTube-instanser</string>\n    <string name=\"autoplay_title\">Afspil automatisk</string>\n    <string name=\"settings_category_clear_data_title\">Ryd data</string>\n    <string name=\"enable_playback_state_lists_title\">Positioner i lister</string>\n    <string name=\"enable_playback_resume_summary\">Gendan sidste afspilningsposition</string>\n    <string name=\"enable_playback_resume_title\">Fortsæt afspilning</string>\n    <string name=\"show_comments_summary\">Slå fra for at skjule kommentarer</string>\n    <string name=\"show_comments_title\">Vis kommentarer</string>\n    <string name=\"notification_action_nothing\">Ingenting</string>\n    <string name=\"notification_action_repeat\">Gentag</string>\n    <string name=\"notification_action_4_title\">Femte handlingsknap</string>\n    <string name=\"notification_action_3_title\">Fjerde handlingsknap</string>\n    <string name=\"notification_action_0_title\">Første handlingsknap</string>\n    <string name=\"notification_action_1_title\">Anden handlingsknap</string>\n    <string name=\"notification_action_2_title\">Tredje handlingsknap</string>\n    <string name=\"search_showing_result_for\">Viser resultater for: %s</string>\n    <string name=\"open_with\">Åbn med</string>\n    <string name=\"leak_canary_not_available\">LeakCanary er ikke tilgængelig</string>\n    <string name=\"mark_as_watched\">Markér som set</string>\n    <string name=\"description_tab_description\">Beskrivelse</string>\n    <string name=\"chapters\">Kapitler</string>\n    <string name=\"notifications\">Notifikationer</string>\n    <string name=\"artists\">Kunstnere</string>\n    <string name=\"close\">Luk</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"metadata_category\">Kategori</string>\n    <string name=\"metadata_privacy\">Privatliv</string>\n    <string name=\"percent\">Procent</string>\n    <string name=\"feed_create_new_group_button_title\">Ny</string>\n    <string name=\"systems_language\">Systemstandard</string>\n    <string name=\"albums\">Album</string>\n    <string name=\"songs\">Sange</string>\n    <string name=\"videos_string\">Videoer</string>\n    <string name=\"dont_show\">Vis ikke</string>\n    <string name=\"notification_action_shuffle\">Bland</string>\n    <string name=\"show_description_title\">Vis beskrivelse</string>\n    <string name=\"open_website_license\">Åbn hjemmeside</string>\n    <string name=\"metadata_language\">Sprog</string>\n    <string name=\"low_quality_smaller\">Lav kvalitet (mindre)</string>\n    <string name=\"autoplay_summary\">Start afspilning automatisk — %s</string>\n    <string name=\"never\">Aldrig</string>\n    <string name=\"wifi_only\">Kun på Wi-Fi</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekund</item>\n        <item quantity=\"other\">%d sekunder</item>\n    </plurals>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s download slettet</item>\n        <item quantity=\"other\">%1$s downloads slettet</item>\n    </plurals>\n    <string name=\"delete_downloaded_files_confirm\">Slet alle hentede filer fra drevet?</string>\n    <string name=\"pause_downloads\">Sæt downloads på pause</string>\n    <string name=\"start_main_player_fullscreen_title\">Start hovedafspiller i fuld skærm</string>\n    <string name=\"no_dir_yet\">Lagringsmappe endnu ikke valgt; vælg standardmappen nu</string>\n    <string name=\"auto_queue_toggle\">Sæt automatisk i kø</string>\n    <string name=\"settings_category_player_notification_summary\">Konfigurer notifikation om igangværende stream</string>\n    <string name=\"show_age_restricted_content_summary\">Vis indhold, der muligvis er uegnet for børn, fordi det har en aldersgrænse (fx 18+)</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Slå YouTubes \\\"Begrænset Tilstand\\\" til</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube tilbyder en \\\"Begrænset Tilstand\\\", som skjuler potentielt voksenindhold</string>\n    <string name=\"restricted_video\">Denne video er aldersbegrænset.\n\\n\n\\nSlå \\\"%1$s\\\" til i indstillingerne, hvis du vil se den.</string>\n    <string name=\"streams_notification_channel_name\">Nye streams</string>\n    <string name=\"streams_notification_channel_description\">Notifikationer om nye streams fra abonnementer</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA-cookies blev ryddet</string>\n    <string name=\"delete_playback_states_alert\">Slet alle afspilningspositioner\\?</string>\n    <string name=\"missing_file\">Filen er flyttet eller slettet</string>\n    <string name=\"error_report_notification_title\">NewPipe stødte ind i en fejl; tryk for at rapportere</string>\n    <string name=\"error_report_open_issue_button_text\">Rapportér på GitHub</string>\n    <string name=\"high_quality_larger\">Høj kvalitet (større)</string>\n    <string name=\"enable_queue_limit\">Begræns downloadkøen</string>\n    <string name=\"clear_cookie_summary\">Ryd de cookies, som NewPipe opbevarer, når du løser en reCAPTCHA</string>\n    <string name=\"notification_colorize_title\">Farvelæg notifikation</string>\n    <string name=\"settings_category_player_notification_title\">Afspiller-notifikation</string>\n    <string name=\"error_report_notification_toast\">En fejl opstod; se notifikationen</string>\n    <string name=\"show_description_summary\">Slå fra for at skjule videobeskrivelse og yderligere information</string>\n    <string name=\"show_meta_info_summary\">Slå fra for at skjule metainfo-bokse med yderligere information om streamskaberen, streamindhold eller en søgeforespørgsel</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Download fuldført</item>\n        <item quantity=\"other\">%s downloads fuldført</item>\n    </plurals>\n    <string name=\"clear_queue_confirmation_description\">Den aktive afspillerkø bliver udskiftet</string>\n    <string name=\"clear_queue_confirmation_summary\">Ændring fra én afspiller til en anden kan erstatte din kø</string>\n    <string name=\"show_meta_info_title\">Vis metainfo</string>\n    <string name=\"local_search_suggestions\">Lokale søgeforslag</string>\n    <string name=\"remote_search_suggestions\">Forslag til fjernsøgning</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"unsupported_url_dialog_message\">Kunne ikke genkende URL. Åbn med en anden app?</string>\n    <string name=\"hash_channel_name\">Videohash-notifikation</string>\n    <string name=\"hash_channel_description\">Notifikationer om videohashing fremskridt</string>\n    <string name=\"error_report_channel_name\">Fejlrapport-notifikation</string>\n    <string name=\"error_report_channel_description\">Notifikationer for at rapportere fejl</string>\n    <string name=\"clear_playback_states_title\">Slet afspilningspositioner</string>\n    <string name=\"clear_playback_states_summary\">Sletter alle afspilningspositioner</string>\n    <string name=\"downloads_storage_ask_title\">Spørg, hvor filen skal hentes</string>\n    <string name=\"enable_queue_limit_desc\">Ét download ad gangen</string>\n    <string name=\"delete_downloaded_files\">Slet hentede filer</string>\n    <string name=\"confirm_prompt\">Vil du rydde din downloadhistorik eller slette alle hentede filer?</string>\n    <string name=\"error_download_resource_gone\">Kan ikke gendanne dette download</string>\n    <string name=\"clear_download_history\">Ryd downloadhistorik</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe-projektet tager dit privatliv meget alvorligt. Derfor indsamler appen ikke nogen data uden dit samtykke.\n\\nNewPipe\\'s privatlivspolitik forklarer i detaljer, hvilke data der sendes og gemmes, når du sender en nedbrudsrapport.</string>\n    <string name=\"copy_for_github\">Kopiér formateret rapport</string>\n    <string name=\"permission_display_over_apps\">Giv tilladelse til at vise over andre apps</string>\n    <string name=\"enable_playback_state_lists_summary\">Vis indikatorer for afspilningsposition i lister</string>\n    <string name=\"watch_history_states_deleted\">Afspilningspositioner slettet</string>\n    <string name=\"clear_cookie_title\">Ryd reCAPTCHA-cookies</string>\n    <string name=\"download_already_pending\">En download med dette navn afventer</string>\n    <string name=\"start_downloads\">Start downloads</string>\n    <string name=\"notification_scale_to_square_image_title\">Beskær miniaturebillede til 1:1 format</string>\n    <string name=\"notification_scale_to_square_image_summary\">Beskær video-miniaturebillede i notifikationen fra 16:9 til 1:1 format</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_actions_at_most_three\">Du kan kun vælge op til tre handlinger, der kan vises i den lille notifikation!</string>\n    <string name=\"notification_action_buffering\">Buffering</string>\n    <string name=\"notification_colorize_summary\">Få Android til at vælge notifikationens farve ud fra den primære farve i miniaturebilledet (virker ikke på alle enheder)</string>\n    <string name=\"night_theme_title\">Nat-tema</string>\n    <string name=\"seek_duration_title\">Søgningsvarighed for spole frem/tilbage</string>\n    <string name=\"restricted_video_no_stream\">Denne video er aldersbegrænset.\n\\nGrundet nye YouTube-politikker om aldersbegrænsede videoer har NewPipe ikke adgang til nogen af dens videostreams og kan derfor ikke afspille dem.</string>\n    <string name=\"crash_the_player\">Crash afspilleren</string>\n    <string name=\"clear_queue_confirmation_title\">Spørg om bekræftelse, før du rydder en kø</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Forhåndsvisning af miniaturebilleder på statuslinje</string>\n    <string name=\"enqueue_next_stream\">Sæt i kø som næste</string>\n    <string name=\"enqueued_next\">Sat i kø som næste</string>\n    <string name=\"download_has_started\">Download er begyndt</string>\n    <string name=\"show_thumbnail_summary\">Vis miniaturebilleder på både låseskærmen og notifikationer</string>\n    <string name=\"recent\">Nylige</string>\n    <string name=\"notifications_disabled\">Notifikationer er slået fra</string>\n    <string name=\"comments_tab_description\">Kommentarer</string>\n    <string name=\"related_items_tab_description\">Relaterede emner</string>\n    <string name=\"main_page_content_swipe_remove\">Stryg på elementer for at fjerne dem</string>\n    <string name=\"select_a_playlist\">Vælg en playliste</string>\n    <string name=\"no_playlist_bookmarked_yet\">Ingen playliste-bogmærker endnu</string>\n    <string name=\"title_activity_play_queue\">Afspillerkø</string>\n    <string name=\"show_channel_details\">Vis kanalens detaljer</string>\n    <string name=\"enqueue_stream\">Sæt i kø</string>\n    <string name=\"enqueued\">Sat i kø</string>\n    <string name=\"loading_stream_details\">Indlæser streamdetaljer…</string>\n    <string name=\"processing_may_take_a_moment\">Behandler… Det kan tage et øjeblik</string>\n    <string name=\"show_memory_leaks\">Vis hukommelseslækager</string>\n    <string name=\"disable_media_tunneling_title\">Deaktivér medietunneling</string>\n    <string name=\"streams_notifications_network_title\">Netværkskrav</string>\n    <string name=\"any_network\">Alle netværk</string>\n    <string name=\"streams_notifications_interval_title\">Kontrolfrekvens</string>\n    <string name=\"enable_streams_notifications_title\">Notifikationer ved nye streams</string>\n    <string name=\"enable_streams_notifications_summary\">Underret om nye streams fra abonnementer</string>\n    <string name=\"manual_update_description\">Tjek manuelt efter opdateringer</string>\n    <string name=\"checking_updates_toast\">Tjekker efter opdateringer…</string>\n    <string name=\"recovering\">gendanner</string>\n    <string name=\"feed_load_error_fast_unknown\">\\\"Hurtig feed\\\"-tilstand oplyser ikke mere info om dette.</string>\n    <string name=\"check_for_updates\">Tjek efter opdateringer</string>\n    <string name=\"remove_watched_popup_title\">Fjern sete videoer?</string>\n    <string name=\"disable_media_tunneling_summary\">Deaktivér medietunneling, hvis du oplever en sort skærm eller hakken ved videoafspilning.</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"check_new_streams\">Tjek efter nye streams</string>\n    <string name=\"create_error_notification\">Lav en fejlnotifikation</string>\n    <string name=\"local\">Lokale</string>\n    <string name=\"feed_load_error_terminated\">Udgiverens konto er blevet lukket.\n\\nNewPipe vil ikke være i stand til at indlæse dette feed i fremtiden.\n\\nØnsker du at afmelde denne kanal?</string>\n    <string name=\"feed_oldest_subscription_update\">Feed sidst opdateret: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Ikke indlæst: %d</string>\n    <string name=\"feed_notification_loading\">Indlæser feed…</string>\n    <string name=\"feed_new_items\">Nye feed-elementer</string>\n    <string name=\"feed_update_threshold_summary\">Tid efter sidste opdatering, før et abonnement betragtes som forældet — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Opdater altid</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Vælg abonnementer</string>\n    <string name=\"georestricted_content\">Dette indhold er ikke tilgængeligt i dit land.</string>\n    <string name=\"video_detail_by\">Af %s</string>\n    <string name=\"remove_watched_popup_warning\">Videoer, der er blevet set før og efter tilføjelse til playlisten, vil blive fjernet. \\nEr du sikker? Dette kan ikke fortrydes!</string>\n    <string name=\"show_thumbnail_title\">Vis miniaturebillede</string>\n    <string name=\"metadata_tags\">Tags</string>\n    <string name=\"metadata_age_limit\">Aldersbegrænsning</string>\n    <string name=\"content_not_supported\">Dette indhold understøttes endnu ikke af NewPipe.\n\\n\n\\nVi håber at kunne understøtte det i en fremtiden.</string>\n    <string name=\"paid_content\">Dette indhold er kun tilgængeligt for brugere, som har betalt for det, så det kan ikke streames eller hentes af NewPipe.</string>\n    <string name=\"account_terminated\">Konto lukket</string>\n    <string name=\"private_content\">Dette indhold er privat, så det kan ikke streames eller hentes af NewPipe.</string>\n    <string name=\"recently_added\">Nyligt tilføjede</string>\n    <string name=\"featured\">Fremhævede</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s lytter</item>\n        <item quantity=\"other\">%s lyttere</item>\n    </plurals>\n    <string name=\"more_than_100_videos\">100+ videoer</string>\n    <string name=\"msg_calculating_hash\">Udregner hash</string>\n    <string name=\"recaptcha_solve\">Løs</string>\n    <string name=\"feed_group_dialog_empty_selection\">Ingen abonnementer valgt</string>\n    <string name=\"feed_group_dialog_delete_message\">Vil du slette denne gruppe\\?</string>\n    <string name=\"metadata_licence\">Licens</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s ny stream</item>\n        <item quantity=\"other\">%s nye streams</item>\n    </plurals>\n    <string name=\"semitone\">Halvtone</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d time</item>\n        <item quantity=\"other\">%d timer</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dag</item>\n        <item quantity=\"other\">%d dage</item>\n    </plurals>\n    <string name=\"channel_created_by\">Lavet af %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Deaktivér hurtig-tilstand</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Aktivér hurtig-tilstand</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Hent fra dedikeret feed, når det er tilgængeligt</string>\n    <string name=\"feed_update_threshold_title\">Feed opdateringsgrænse</string>\n    <string name=\"settings_category_feed_title\">Feed</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d valgt</item>\n        <item quantity=\"other\">%d valgte</item>\n    </plurals>\n    <string name=\"feed_processing_message\">Behandler feed…</string>\n    <string name=\"feed_groups_header_title\">Kanalgrupper</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minut</item>\n        <item quantity=\"other\">%d minutter</item>\n    </plurals>\n    <string name=\"remove_watched\">Fjern sete</string>\n    <string name=\"choose_instance_prompt\">Vælg en instans</string>\n    <string name=\"error_timeout\">Forbindelse afbrudt</string>\n    <string name=\"error_progress_lost\">Fremskridt tabt, fordi filen blev slettet</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe blev lukket under arbejde på filen</string>\n    <string name=\"overwrite_failed\">kan ikke overskrive filen</string>\n    <string name=\"start_accept_privacy_policy\">For at overholde den europæiske databeskyttelsesforordning (GDPR) henviser vi hermed din opmærksomhed til NewPipes privatlivspolitik. Læs den venligst omhyggeligt.\n\\nDu skal acceptere den for at kunne sende os fejlrapporten.</string>\n    <string name=\"unhook_checkbox\">Aflænk (kan skabe forvrængning)</string>\n    <string name=\"import_soundcloud_instructions\">Importér en SoundCloud-profil ved at skrive enten dit URL eller ID:\n\\n\n\\n1. Slå \\\"desktop-tilstand\\\" til i mobilbrowsere.\n\\n2. Gå til denne adresse: %1$s\n\\n3. Log ind, når du bliver bedt om det\n\\n4. Kopiér adressen på den profil, du bliver omdirigeret til.</string>\n    <string name=\"show_original_time_ago_title\">Vis oprindelig tid siden på elementer</string>\n    <string name=\"playlist_no_uploader\">Autogenereret (ingen uploader fundet)</string>\n    <string name=\"unmute\">Slå lyd til</string>\n    <string name=\"mute\">Sæt på lydløs</string>\n    <string name=\"most_liked\">Mest likede</string>\n    <string name=\"error_unable_to_load_comments\">Kunne ikke indlæse kommentarer</string>\n    <string name=\"default_kiosk_page_summary\">Standard Kiosk</string>\n    <string name=\"done\">Færdig</string>\n    <string name=\"subtitle_activity_recaptcha\">Tryk på \\\"Færdig\\\", når den er løst</string>\n    <string name=\"no_comments\">Ingen kommentarer</string>\n    <string name=\"infinite_videos\">∞ videoer</string>\n    <string name=\"no_one_listening\">Ingen lyttere</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s seer</item>\n        <item quantity=\"other\">%s seere</item>\n    </plurals>\n    <string name=\"no_one_watching\">Ingen seere</string>\n    <string name=\"drawer_header_description\">Skift service. Nuværende valg:</string>\n    <string name=\"comments_are_disabled\">Kommentarer er slået fra</string>\n    <string name=\"no_app_to_open_intent\">Ingen app på din enhed kan åbne dette</string>\n    <string name=\"error_insufficient_storage_left\">Ingen ledig plads på enheden</string>\n    <string name=\"app_language_title\">App-sprog</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Ja, og delvist sete videoer</string>\n    <string name=\"feed_load_error\">Fejl ved indlæsning af feed</string>\n    <string name=\"feed_load_error_account_info\">Kunne ikke indlæse feed for \\'%s\\'.</string>\n    <string name=\"show_crash_the_player_title\">Vis \\\"Crash afspilleren\\\"</string>\n    <string name=\"crash_the_app\">Crash appen</string>\n    <string name=\"show_crash_the_player_summary\">Vis en crash mulighed, når afspilleren er i brug</string>\n    <string name=\"show_error_snackbar\">Vis en fejl snackbar</string>\n    <string name=\"downloads_storage_use_saf_title\">Brug systemets mappevælger (SAF)</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanalens avatar-miniaturebillede</string>\n    <string name=\"soundcloud_go_plus_content\">Dette er et SoundCloud Go+-nummer, i hvert fald i dit land, så det kan ikke streames eller hentes af NewPipe.</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Ingen passende filhåndtering blev fundet til denne handling.\n\\nInstaller venligst en Storage Access Framework-kompatibel filhåndtering.</string>\n    <string name=\"no_appropriate_file_manager_message\">Ingen passende filhåndtering blev fundet til denne handling.\n\\nInstaller venligst en filhåndtering, eller prøv at deaktivere \\'%s\\' i downloadindstillingerne.</string>\n    <string name=\"description_select_enable\">Aktivér valg af tekst i beskrivelsen</string>\n    <string name=\"auto_device_theme_title\">Automatisk (enhedstema)</string>\n    <string name=\"description_select_disable\">Deaktivér valg af tekst i beskrivelsen</string>\n    <string name=\"detail_pinned_comment_view_description\">Fastgjort kommentar</string>\n    <string name=\"you_successfully_subscribed\">Du abonnerer nu på denne kanal</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"get_notified\">Få besked</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Du vil blive spurgt, hvor du vil gemme hver enkelt download</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"unknown_format\">Ukendt format</string>\n    <string name=\"unknown_quality\">Ukendt kvalitet</string>\n    <string name=\"detail_heart_img_view_description\">Hjertemarkeret af skaber</string>\n    <string name=\"progressive_load_interval_title\">Størrelse på afspilningsinterval</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer-standard</string>\n    <string name=\"feed_group_dialog_empty_name\">Tomt gruppenavn</string>\n    <string name=\"downloads_storage_ask_summary\">Du vil blive spurgt, hvor du vil gemme hver enkelt download.\n\\nAktivér systemets mappevælger (SAF), hvis du vil hente til et eksternt SD-kort</string>\n    <string name=\"show_original_time_ago_summary\">Originaltekster fra tjenester vil være synlige i stream-elementer</string>\n    <string name=\"no_video_streams_available_for_external_players\">Ingen videostreams er tilgængelige for eksterne afspillere</string>\n    <string name=\"off\">Fra</string>\n    <string name=\"tablet_mode_title\">Tablet-tilstand</string>\n    <string name=\"youtube_music_premium_content\">Denne video er kun tilgængelig for YouTube Musik Premium-medlemmer, så den kan ikke streames eller hentes af NewPipe.</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\\"Storage Access Framework\\\" gør det muligt at hente til et eksternt SD-kort</string>\n    <string name=\"enable_disposed_exceptions_summary\">Tving rapportering af ikke-levérbare Rx-undtagelser uden for fragmentets eller aktivitetens livscyklus efter bortskaffelse</string>\n    <string name=\"app_update_available_notification_text\">Tryk for at hente %s</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Fra og med Android 10 understøttes kun \\\"Storage Access Framework\\\"</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">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\\n\n\\nNewPipe tilbyder to strategier til feed-indlæsning:\n\\n- Hentning af hele abonnementskanalen, hvilket er langsomt, men komplet.\n\\n- Brug af et dedikeret service endpoint, hvilket er hurtigt, men normalt ikke komplet.\n\\n\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\\n\n\\nYouTube er et eksempel på en tjeneste, der tilbyder denne hurtige metode med sit RSS-feed.\n\\n\n\\nValget er altså et spørgsmål om, hvad du foretrækker: hastighed eller præcise oplysninger.</string>\n    <string name=\"selected_stream_external_player_not_supported\">Den valgte stream understøttes ikke af eksterne afspillere</string>\n    <string name=\"night_theme_available\">Denne indstilling er kun tilgængelig, hvis %s er valgt som tema</string>\n    <string name=\"description_select_note\">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.</string>\n    <string name=\"streams_not_yet_supported_removed\">Streams, som endnu ikke understøttes af downloaderen, vises ikke</string>\n    <string name=\"fast_mode\">Hurtig tilstand</string>\n    <string name=\"import_subscriptions_hint\">Importér eller eksportér abonnementer fra 3-punktsmenuen</string>\n    <string name=\"faq_title\">Ofte stillede spørgsmål</string>\n    <string name=\"faq_description\">Hvis du har problemer med at bruge appen, bør du tjekke disse svar på almindelige spørgsmål!</string>\n    <string name=\"faq\">Se på hjemmesiden</string>\n    <string name=\"app_update_unavailable_toast\">Du kører den nyeste version af NewPipe</string>\n    <string name=\"new_seek_duration_toast\">Grundet ExoPlayer-begrænsninger blev søgevarigheden sat til %d sekunder</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Vis kun ugrupperede abonnementer</string>\n    <string name=\"playlist_page_summary\">Playlisteside</string>\n    <string name=\"select_night_theme_toast\">Du kan vælge dit foretrukne nattema nedenfor</string>\n    <string name=\"night_theme_summary\">Vælg dit foretrukne nattema — %s</string>\n    <string name=\"metadata_support\">Support</string>\n    <string name=\"metadata_host\">Vært</string>\n    <string name=\"metadata_privacy_public\">Offentlig</string>\n    <string name=\"metadata_privacy_unlisted\">Ikke oplyst</string>\n    <string name=\"metadata_privacy_private\">Privat</string>\n    <string name=\"metadata_privacy_internal\">Intern</string>\n    <string name=\"on\">Til</string>\n    <string name=\"toggle_all\">Skift alle</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Ingen lydstreams er tilgængelige for eksterne afspillere</string>\n    <string name=\"select_quality_external_players\">Vælg kvalitet til eksterne afspillere</string>\n    <string name=\"sort\">Sorter</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorer hændelser med hardware-medieknap</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Nyttigt, hvis du fx bruger et headset med ødelagte fysiske knapper</string>\n    <string name=\"duplicate_in_playlist\">Playlisterne, der er nedtonede, indeholder allerede dette element.</string>\n    <string name=\"unset_playlist_thumbnail\">Fjern permanent miniaturebillede</string>\n    <string name=\"msg_failed_to_copy\">Kunne ikke kopiere til udklipsholder</string>\n    <string name=\"prefer_original_audio_summary\">Brug det originale lydspor uanset sprog</string>\n    <string name=\"prefer_descriptive_audio_title\">Foretræk lydbeskrivelser</string>\n    <string name=\"prefer_original_audio_title\">Foretræk original lyd</string>\n    <string name=\"prefer_descriptive_audio_summary\">Hvis tilgængeligt, brug lydbeskrivelser for personer med nedsat syn</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"loading_metadata_title\">Indlæser Metadata…</string>\n    <string name=\"remove_duplicates_title\">Fjern duplikater?</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"image_quality_medium\">Middel kvalitet</string>\n    <string name=\"image_quality_high\">Høj kvalitet</string>\n    <string name=\"none\">Ingen</string>\n    <string name=\"feed_show_watched\">Set helt</string>\n    <string name=\"no_streams\">Ingen streams</string>\n    <string name=\"feed_show_hide_streams\">Vis/skjul streams</string>\n    <string name=\"brightness\">Lysstyrke</string>\n    <string name=\"volume\">Lydstyrke</string>\n    <string name=\"left_gesture_control_summary\">Vælg bevægelse til venstre halvdel af afspillerens skærm</string>\n    <string name=\"right_gesture_control_summary\">Vælg bevægelse til højre halvdel af afspillerens skærm</string>\n    <string name=\"right_gesture_control_title\">Højre bevægelseshandling</string>\n    <string name=\"no_live_streams\">Ingen livestreams</string>\n    <string name=\"play_queue_audio_track\">Lyd: %s</string>\n    <string name=\"audio_track\">Lydspor</string>\n    <string name=\"remove_duplicates\">Fjern duplikater</string>\n    <string name=\"feed_hide_streams_title\">Vis følgende streams</string>\n    <string name=\"feed_fetch_channel_tabs\">Hent kanal-faner</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Faner, der skal hentes, når feedet opdateres. Denne indstilling har ingen effekt, hvis en kanal opdateres i hurtig-tilstand.</string>\n    <string name=\"metadata_thumbnails\">Miniaturebilleder</string>\n    <string name=\"select_audio_track_external_players\">Vælg lydspor til eksterne afspillere</string>\n    <string name=\"unknown_audio_track\">Ukendt</string>\n    <string name=\"feed_show_partially_watched\">Delvist set</string>\n    <string name=\"feed_show_upcoming\">Kommende</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"channel_tab_videos\">Videoer</string>\n    <string name=\"channel_tab_tracks\">Numre</string>\n    <string name=\"channel_tab_livestreams\">Live</string>\n    <string name=\"channel_tab_channels\">Kanaler</string>\n    <string name=\"channel_tab_playlists\">Playlister</string>\n    <string name=\"channel_tab_albums\">Album</string>\n    <string name=\"channel_tab_about\">Om</string>\n    <string name=\"show_channel_tabs\">Kanal-faner</string>\n    <string name=\"show_channel_tabs_summary\">Hvilke faner vises på kanalsiderne</string>\n    <string name=\"open_play_queue\">Åbn afspilningskø</string>\n    <string name=\"toggle_fullscreen\">Skift til fuldskærm</string>\n    <string name=\"toggle_screen_orientation\">Skift skærmretning</string>\n    <string name=\"previous_stream\">Forrige stream</string>\n    <string name=\"next_stream\">Næste stream</string>\n    <string name=\"play\">Afspil</string>\n    <string name=\"replay\">Afspil igen</string>\n    <string name=\"duration\">Varighed</string>\n    <string name=\"rewind\">Spol tilbage</string>\n    <string name=\"image_quality_title\">Billedkvalitet</string>\n    <string name=\"image_quality_none\">Indlæs ikke billeder</string>\n    <string name=\"image_quality_low\">Lav kvalitet</string>\n    <string name=\"share_playlist\">Del Playliste</string>\n    <string name=\"share_playlist_with_titles\">Del med Titler</string>\n    <string name=\"share_playlist_with_list\">Del URL-liste</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s svar</item>\n        <item quantity=\"other\">%s svar</item>\n    </plurals>\n    <string name=\"show_more\">Vis mere</string>\n    <string name=\"show_less\">Vis mindre</string>\n    <string name=\"progressive_load_interval_summary\">Skift intervalstørrelsen for indlæsning af progressivt indhold (i øjeblikket %s). En lavere værdi kan fremskynde den første indlæsning</string>\n    <string name=\"remove_duplicates_message\">Ønsker du at fjerne alle duplikerede streams i denne playliste?</string>\n    <string name=\"forward\">Spol frem</string>\n    <string name=\"left_gesture_control_title\">Venstre bevægelseshandling</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer-indstillinger</string>\n    <string name=\"settings_category_exoplayer_summary\">Administrer nogle ExoPlayer-indstillinger. Disse ændringer kræver genstart af afspilleren for at træde i kraft</string>\n    <string name=\"main_tabs_position_title\">Position for hovedfaner</string>\n    <string name=\"main_tabs_position_summary\">Flyt hovedfanens vælger til bunden</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplikat tilføjet %d gang(e)</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Medietunneling var som standard deaktiveret på din enhed, fordi din enhedsmodel er kendt for ikke at understøtte det.</string>\n    <string name=\"metadata_uploader_avatars\">Uploader-avatars</string>\n    <string name=\"metadata_subchannel_avatars\">Underkanal-avatars</string>\n    <string name=\"metadata_avatars\">Avatars</string>\n    <string name=\"metadata_banners\">Bannere</string>\n    <string name=\"metadata_subscribers\">Abonnenter</string>\n    <string name=\"audio_track_present_in_video\">Et lydspor bør allerede være til stede i denne stream</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Brug ExoPlayers fallback-funktion til dekoderen</string>\n    <string name=\"audio_track_type_dubbed\">oversat</string>\n    <string name=\"audio_track_type_descriptive\">beskrivende</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"more_options\">Flere muligheder</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\n\\nAktivering af denne indstilling kan forhindre afspilningsfejl, når du skifter den aktuelle videoafspiller eller skifter til fuld skærm</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Brug altid ExoPlayers overfladeindstilling til video-output som løsning</string>\n    <string name=\"card\">Kort</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"error_insufficient_storage\">Ikke nok ledig plads på enheden</string>\n    <string name=\"yes\">Ja</string>\n    <string name=\"no\">Nej</string>\n    <string name=\"reset_settings_title\">Nulstil indstillinger</string>\n    <string name=\"reset_settings_summary\">Nulstil alle indstillinger til deres standardværdier</string>\n    <string name=\"auto_update_check_description\">NewPipe kan automatisk tjekke efter nye versioner indimellem og give dig besked, når de er tilgængelige.\n\\nØnsker du at aktivere dette?</string>\n    <string name=\"reset_all_settings\">Hvis du nulstiller alle indstillinger, kasseres alle dine foretrukne indstillinger, og appen genstartes.\n\\n\n\\nEr du sikker på, at du vil fortsætte?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"settings_category_backup_restore_title\">Sikkerhedskopiering og gendannelse</string>\n    <string name=\"audio_track_type_secondary\">sekundær</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Del som midlertidig YouTube-playliste</string>\n    <string name=\"tab_bookmarks_short\">Playlister</string>\n    <string name=\"feed_group_page_summary\">Kanalgruppeside</string>\n    <string name=\"select_a_feed_group\">Vælg en feed-gruppe</string>\n    <string name=\"no_feed_group_created_yet\">Ingen feed-gruppe oprettet endnu</string>\n    <string name=\"search_with_service_name\">Søg %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Søg %1$s (%2$s)</string>\n    <string name=\"permission_display_over_apps_message\">For at kunne bruge pop op-afspilleren skal du vælge %1$s i følgende Android-indstillingsmenu og aktivere %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">“Tillad visning over andre apps”</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"delete_file\">Slet fil</string>\n    <string name=\"account_terminated_service_provides_reason\">Kontoen er blevet lukket\\n\\n%1$s angiver følgende årsag: %2$s</string>\n    <string name=\"channel_tab_likes\">Likes</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud Top 50-siden fjernet</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud har udfaset de oprindelige Top 50-hitlister. Den tilhørende fane er blevet fjernet fra din hovedside.</string>\n    <string name=\"migration_info_7_8_title\">YouTube kombineret trending fjernet</string>\n    <string name=\"migration_info_7_8_message\">YouTube har udfaset den kombinerede trending-side pr. 21. juli 2025. NewPipe har erstattet standardsiden for trending med trending livestreams.\\n\\nDu kan også vælge andre trending-sider under \\\"Indstillinger &gt; Indhold &gt; Indhold på hovedsiden\\\".</string>\n    <string name=\"trending_gaming\">Gaming-trends</string>\n    <string name=\"trending_podcasts\">Trending podcasts</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Veröffentlicht am %1$s</string>\n    <string name=\"no_player_found\">Kein Stream-Player gefunden. Möchtest du VLC installieren\\?</string>\n    <string name=\"install\">Installieren</string>\n    <string name=\"cancel\">Abbrechen</string>\n    <string name=\"open_in_browser\">Im Browser öffnen</string>\n    <string name=\"share\">Teilen</string>\n    <string name=\"download\">Herunterladen</string>\n    <string name=\"search\">Suchen</string>\n    <string name=\"settings\">Einstellungen</string>\n    <string name=\"did_you_mean\">Meintest du „%1$s“\\?</string>\n    <string name=\"share_dialog_title\">Teilen mit</string>\n    <string name=\"download_path_title\">Downloadordner für Videos</string>\n    <string name=\"download_path_summary\">Heruntergeladene Videodateien werden hier gespeichert</string>\n    <string name=\"download_path_dialog_title\">Downloadordner für Videodateien wählen</string>\n    <string name=\"default_resolution_title\">Standardauflösung</string>\n    <string name=\"play_with_kodi_title\">Mit Kodi abspielen</string>\n    <string name=\"kore_not_found\">Fehlende Kore-App installieren\\?</string>\n    <string name=\"show_play_with_kodi_title\">Option „Mit Kodi abspielen“ anzeigen</string>\n    <string name=\"show_play_with_kodi_summary\">Option anzeigen, um Videos mit Kodi abzuspielen</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Bevorzugtes Audioformat</string>\n    <string name=\"download_dialog_title\">Download</string>\n    <string name=\"show_next_and_similar_title\">„Nächste“ und „Ähnliche“ Videos anzeigen</string>\n    <string name=\"unsupported_url\">Nicht unterstützte URL</string>\n    <string name=\"settings_category_video_audio_title\">Video und Audio</string>\n    <string name=\"content_language_title\">Bevorzugte Sprache des Inhalts</string>\n    <string name=\"detail_thumbnail_view_description\">Video abspielen, Dauer:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Profilbild des Benutzers</string>\n    <string name=\"detail_dislikes_img_view_description\">Gefällt mir nicht</string>\n    <string name=\"detail_likes_img_view_description\">Gefällt mir</string>\n    <string name=\"use_external_video_player_title\">Externen Video-Player verwenden</string>\n    <string name=\"use_external_audio_player_title\">Externen Audio-Player verwenden</string>\n    <string name=\"background_player_playing_toast\">Im Hintergrund abspielen</string>\n    <string name=\"network_error\">Netzwerkfehler</string>\n    <string name=\"download_path_audio_title\">Downloadordner für Audiodateien</string>\n    <string name=\"download_path_audio_summary\">Heruntergeladene Audiodateien werden hier gespeichert</string>\n    <string name=\"download_path_audio_dialog_title\">Downloadordner für Audiodateien wählen</string>\n    <string name=\"theme_title\">Design</string>\n    <string name=\"dark_theme_title\">Dunkel</string>\n    <string name=\"light_theme_title\">Hell</string>\n    <string name=\"settings_category_appearance_title\">Aussehen</string>\n    <string name=\"general_error\">Fehler</string>\n    <string name=\"could_not_load_thumbnails\">Konnte nicht alle Vorschaubilder laden</string>\n    <string name=\"parsing_error\">Konnte Webseite nicht analysieren</string>\n    <string name=\"content_not_available\">Inhalt nicht verfügbar</string>\n    <string name=\"content\">Inhalt</string>\n    <string name=\"show_age_restricted_content_title\">Altersbeschränkte Inhalte anzeigen</string>\n    <string name=\"could_not_setup_download_menu\">Konnte Downloadmenü nicht einrichten</string>\n    <string name=\"error_report_button_text\">Per E-Mail melden</string>\n    <string name=\"copy_for_github\">Formatierten Fehlerbericht kopieren</string>\n    <string name=\"error_report_open_issue_button_text\">Über GitHub melden</string>\n    <string name=\"error_snackbar_action\">Melden</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"what_happened_headline\">Dies ist passiert:</string>\n    <string name=\"info_labels\">Was:\\nAnfrage:\\nSprache des Inhalts:\\nLand des Inhalts:\\nSprache der App:\\nDienst:\\nZeit (GMT):\\nPaket:\\nVersion:\\nOS-Version:</string>\n    <string name=\"error_details_headline\">Details:</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Wiederholen</string>\n    <string name=\"sorry_string\">Entschuldigung. Dies hätte nicht passieren sollen.</string>\n    <string name=\"error_snackbar_message\">Entschuldigung, etwas ist schiefgelaufen.</string>\n    <string name=\"your_comment\">Dein Kommentar (auf englisch):</string>\n    <string name=\"duration_live\">Live</string>\n    <string name=\"main_bg_subtitle\">Tippe auf die Lupe, um zu suchen.</string>\n    <string name=\"downloads\">Downloads</string>\n    <string name=\"downloads_title\">Downloads</string>\n    <string name=\"error_report_title\">Fehlerbericht</string>\n    <string name=\"delete\">Löschen</string>\n    <string name=\"checksum\">Prüfsumme</string>\n    <string name=\"msg_name\">Dateiname</string>\n    <string name=\"msg_error\">Fehler</string>\n    <string name=\"msg_wait\">Bitte warten …</string>\n    <string name=\"msg_copied\">In Zwischenablage kopiert</string>\n    <string name=\"no_available_dir\">Bitte gib später in den Einstellungen einen Downloadordner an</string>\n    <string name=\"start\">Starten</string>\n    <string name=\"pause\">Pause</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"app_ui_crash\">App/UI abgestürzt</string>\n    <string name=\"msg_threads\">Threads</string>\n    <string name=\"msg_running\">NewPipe lädt herunter</string>\n    <string name=\"msg_running_detail\">Für Details antippen</string>\n    <string name=\"black_theme_title\">Schwarz</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA-Aufgabe</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA-Aufgabe angefordert</string>\n    <string name=\"all\">Alle</string>\n    <string name=\"disabled\">Deaktiviert</string>\n    <string name=\"open_in_popup_mode\">Im Pop-up-Modus öffnen</string>\n    <string name=\"default_video_format_title\">Bevorzugtes Videoformat</string>\n    <string name=\"popup_playing_toast\">Im Pop-up-Modus abspielen</string>\n    <string name=\"msg_popup_permission\">Diese Berechtigung ist für das\n\\nÖffnen im Pop-up-Modus erforderlich</string>\n    <string name=\"default_popup_resolution_title\">Standardauflösung des Pop-ups</string>\n    <string name=\"show_higher_resolutions_title\">Höhere Auflösungen anzeigen</string>\n    <string name=\"show_higher_resolutions_summary\">Nur manche Geräte können Videos in 2K/4K abspielen</string>\n    <string name=\"controls_background_title\">Hintergrund</string>\n    <string name=\"controls_popup_title\">Pop-up</string>\n    <string name=\"popup_remember_size_pos_title\">Eigenschaften des Pop-ups merken</string>\n    <string name=\"use_external_video_player_summary\">Entfernt Tonspur bei manchen Auflösungen</string>\n    <string name=\"popup_remember_size_pos_summary\">Letzte Größe und Position des Pop-ups merken</string>\n    <string name=\"show_search_suggestions_title\">Suchvorschläge</string>\n    <string name=\"show_search_suggestions_summary\">Vorschläge auswählen, die bei der Suche angezeigt werden sollen</string>\n    <string name=\"clear\">löschen</string>\n    <string name=\"best_resolution\">Beste Auflösung</string>\n    <string name=\"title_activity_about\">Über NewPipe</string>\n    <string name=\"tab_licenses\">Lizenzen</string>\n    <string name=\"read_full_license\">Lizenz lesen</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s von %2$s unter %3$s</string>\n    <string name=\"tab_about\">Über &amp; FAQ</string>\n    <string name=\"app_description\">Freies und schlankes Streaming für Android.</string>\n    <string name=\"app_license_title\">NewPipes Lizenz</string>\n    <string name=\"contribution_encouragement\">Ob Ideen, Übersetzungen, Design-Änderungen, Code-Aufräumung oder richtig große Code-Änderungen — Hilfe ist immer willkommen. Je mehr geholfen wird, desto besser wird NewPipe!</string>\n    <string name=\"title_licenses\">Drittanbieter-Lizenzen</string>\n    <string name=\"view_on_github\">Auf GitHub ansehen</string>\n    <string name=\"contribution_title\">Beitragen</string>\n    <string name=\"settings_category_downloads_title\">Download</string>\n    <string name=\"settings_file_charset_title\">Erlaubte Zeichen im Dateinamen</string>\n    <string name=\"settings_file_replacement_character_summary\">Ungültige Zeichen werden durch dieses Zeichen ersetzt</string>\n    <string name=\"settings_file_replacement_character_title\">Ersetzungszeichen</string>\n    <string name=\"charset_letters_and_digits\">Buchstaben und Zahlen</string>\n    <string name=\"subscribe_button_title\">Abonnieren</string>\n    <string name=\"subscribed_button_title\">Abonniert</string>\n    <string name=\"channel_unsubscribed\">Kanal deabonniert</string>\n    <string name=\"tab_subscriptions\">Abonnements</string>\n    <string name=\"fragment_feed_title\">Neuigkeiten</string>\n    <string name=\"enable_search_history_title\">Suchverlauf</string>\n    <string name=\"enable_search_history_summary\">Suchanfragen lokal speichern</string>\n    <string name=\"enable_watch_history_title\">Verlauf ansehen</string>\n    <string name=\"enable_watch_history_summary\">Wiedergabeverlauf speichern</string>\n    <string name=\"title_activity_history\">Verlauf</string>\n    <string name=\"action_history\">Verlauf</string>\n    <string name=\"subscription_change_failed\">Abonnement konnte nicht geändert werden</string>\n    <string name=\"subscription_update_failed\">Abonnement konnte nicht aktualisiert werden</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Nach Unterbrechungen (z. B. Telefonaten) Wiedergabe fortsetzen</string>\n    <string name=\"notification_channel_name\">NewPipe-Benachrichtigung</string>\n    <string name=\"notification_channel_description\">Benachrichtigungen für den NewPipe-Player</string>\n    <string name=\"settings_category_player_behavior_title\">Verhalten</string>\n    <string name=\"settings_category_history_title\">Verlauf und Cache</string>\n    <string name=\"undo\">Rückgängig machen</string>\n    <string name=\"search_no_results\">Keine Ergebnisse</string>\n    <string name=\"no_subscribers\">Keine Abonnenten</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s Abonnent</item>\n        <item quantity=\"other\">%s Abonnenten</item>\n    </plurals>\n    <string name=\"no_views\">Keine Aufrufe</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s Aufruf</item>\n        <item quantity=\"other\">%s Aufrufe</item>\n    </plurals>\n    <string name=\"no_videos\">Keine Videos</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s Video</item>\n        <item quantity=\"other\">%s Videos</item>\n    </plurals>\n    <string name=\"charset_most_special_characters\">Die meisten Sonderzeichen</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Wiedergabe fortsetzen</string>\n    <string name=\"settings_category_player_title\">Player</string>\n    <string name=\"empty_list_subtitle\">Nichts hier, außer dem Zirpen der Grillen</string>\n    <string name=\"delete_item_search_history\">Möchtest du dieses Element aus dem Suchverlauf löschen\\?</string>\n    <string name=\"blank_page_summary\">Leere Seite</string>\n    <string name=\"select_a_channel\">Einen Kanal auswählen</string>\n    <string name=\"no_channel_subscribed_yet\">Noch keine Kanalabonnements vorhanden</string>\n    <string name=\"trending\">Trends</string>\n    <string name=\"play_all\">Alles abspielen</string>\n    <string name=\"play_queue_remove\">Entfernen</string>\n    <string name=\"play_queue_audio_settings\">Audio-Einstellungen</string>\n    <string name=\"player_stream_failure\">Konnte diesen Stream nicht abspielen</string>\n    <string name=\"main_page_content\">Inhalt der Hauptseite</string>\n    <string name=\"channel_page_summary\">Kanalseite</string>\n    <string name=\"play_queue_stream_detail\">Details</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"player_unrecoverable_failure\">Nicht behebbarer Wiedergabefehler aufgetreten</string>\n    <string name=\"player_recoverable_failure\">Wiederherstellen nach einem Wiedergabefehler</string>\n    <string name=\"kiosk_page_summary\">Kiosk-Seite</string>\n    <string name=\"select_a_kiosk\">Kiosk auswählen</string>\n    <string name=\"show_hold_to_append_summary\">Tipp anzeigen, wenn die Hintergrundwiedergabe- oder Pop-up-Schaltfläche „Details:“ im Video gedrückt wird</string>\n    <string name=\"new_and_hot\">Neu und Heiß</string>\n    <string name=\"hold_to_append\">Halten, um zur Wiedergabeliste hinzuzufügen</string>\n    <string name=\"show_hold_to_append_title\">„Halten zum Einreihen“-Tipp anzeigen</string>\n    <string name=\"unknown_content\">[Unbekannt]</string>\n    <string name=\"start_here_on_background\">Wiedergabe im Hintergrund starten</string>\n    <string name=\"start_here_on_popup\">Wiedergabe in einem Pop-up starten</string>\n    <string name=\"donation_title\">Spenden</string>\n    <string name=\"give_back\">Zurückgeben</string>\n    <string name=\"website_title\">Website</string>\n    <string name=\"website_encouragement\">Besuche die NewPipe Website für weitere Informationen und Neuigkeiten.</string>\n    <string name=\"donation_encouragement\">NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür verwenden, dir die beste Nutzererfahrung zu bieten. Gib etwas zurück, indem du den Entwicklern hilfst, NewPipe noch weiter zu verbessern, während sie sich an einer Tasse Kaffee erfreuen.</string>\n    <string name=\"no_player_found_toast\">Kein Stream-Player gefunden (du kannst VLC installieren, um den Stream abzuspielen).</string>\n    <string name=\"default_content_country_title\">Bevorzugtes Land des Inhalts</string>\n    <string name=\"always\">Immer</string>\n    <string name=\"just_once\">Nur einmal</string>\n    <string name=\"switch_to_background\">In den Hintergrund wechseln</string>\n    <string name=\"switch_to_popup\">Zum Pop-up wechseln</string>\n    <string name=\"switch_to_main\">Zur normalen Wiedergabe wechseln</string>\n    <string name=\"external_player_unsupported_link_type\">Externe Player unterstützen diese Art von Links nicht</string>\n    <string name=\"video_streams_empty\">Keine Video-Streams gefunden</string>\n    <string name=\"audio_streams_empty\">Keine Audio-Streams gefunden</string>\n    <string name=\"drawer_open\">Navigationsleiste öffnen</string>\n    <string name=\"drawer_close\">Navigationsleiste schließen</string>\n    <string name=\"video_player\">Video-Player</string>\n    <string name=\"background_player\">Wiedergabe im Hintergrund</string>\n    <string name=\"popup_player\">Pop-up-Player</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Erhalte Informationen …</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Gewünschten Inhalt laden</string>\n    <string name=\"import_data_title\">Datenbank importieren</string>\n    <string name=\"export_data_title\">Datenbank exportieren</string>\n    <string name=\"import_data_summary\">Überschreibt deinen aktuellen Verlauf, Abonnements, Wiedergabelisten und (optionale) Einstellungen</string>\n    <string name=\"export_data_summary\">Export von Verlauf, Abonnements, Wiedergabelisten und Einstellungen</string>\n    <string name=\"no_valid_zip_file\">Keine gültige ZIP-Datei</string>\n    <string name=\"could_not_import_all_files\">Warnung: Nicht alle Dateien konnten importiert werden.</string>\n    <string name=\"override_current_data\">Dies wird deine aktuellen Einstellungen überschreiben.</string>\n    <string name=\"show_info\">Infos anzeigen</string>\n    <string name=\"tab_bookmarks\">Eigene Wiedergabelisten</string>\n    <string name=\"controls_add_to_playlist_title\">Hinzufügen</string>\n    <string name=\"detail_drag_description\">Zum Neuordnen ziehen</string>\n    <string name=\"create\">Erstellen</string>\n    <string name=\"rename\">Umbenennen</string>\n    <string name=\"title_last_played\">Zuletzt wiedergegeben</string>\n    <string name=\"title_most_played\">Am häufigsten wiedergegeben</string>\n    <string name=\"always_ask_open_action\">Immer fragen</string>\n    <string name=\"create_playlist\">Neue Wiedergabeliste</string>\n    <string name=\"rename_playlist\">Umbenennen</string>\n    <string name=\"add_to_playlist\">Zur Wiedergabeliste hinzufügen</string>\n    <string name=\"set_as_playlist_thumbnail\">Als Vorschaubild der Wiedergabeliste festlegen</string>\n    <string name=\"unbookmark_playlist\">Lesezeichen entfernen</string>\n    <string name=\"delete_playlist_prompt\">Diese Wiedergabeliste löschen?</string>\n    <string name=\"playlist_creation_success\">Wiedergabeliste erstellt</string>\n    <string name=\"playlist_add_stream_success\">Zur Wiedergabeliste hinzugefügt</string>\n    <string name=\"playlist_thumbnail_change_success\">Vorschaubild der Wiedergabeliste geändert.</string>\n    <string name=\"caption_none\">Keine Untertitel</string>\n    <string name=\"dismiss\">Abbrechen</string>\n    <string name=\"controls_download_desc\">Stream-Datei herunterladen</string>\n    <string name=\"use_inexact_seek_title\">Schnelle, ungenaue Suche verwenden</string>\n    <string name=\"use_inexact_seek_summary\">Mit ungenauem Suchen kann die ungefähre Abspielposition schneller erreicht werden. Das Spulen um 5, 15 oder 25 Sekunden funktioniert damit nicht</string>\n    <string name=\"file\">Datei</string>\n    <string name=\"invalid_directory\">Ordner existiert nicht</string>\n    <string name=\"invalid_file\">Die Datei existiert nicht oder die Rechte zum Lesen oder Schreiben fehlen</string>\n    <string name=\"file_name_empty_error\">Dateiname darf nicht leer sein</string>\n    <string name=\"error_occurred_detail\">Ein Fehler ist aufgetreten: %1$s</string>\n    <string name=\"caption_auto_generated\">Automatisch erzeugt</string>\n    <string name=\"import_from\">Import von</string>\n    <string name=\"export_to\">Export nach</string>\n    <string name=\"import_ongoing\">Importiere …</string>\n    <string name=\"export_ongoing\">Exportiere …</string>\n    <string name=\"import_file_title\">Datei importieren</string>\n    <string name=\"previous_export\">Vorheriger Export</string>\n    <string name=\"import_network_expensive_warning\">Beachte, dass diese Aktion das Netzwerk stark belasten kann. \n\\n \n\\nMöchtest du fortfahren\\?</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Bilder-Cache gelöscht</string>\n    <string name=\"metadata_cache_wipe_title\">Zwischengespeicherte (Metadaten) löschen</string>\n    <string name=\"metadata_cache_wipe_summary\">Alle zwischengespeicherten Website-Daten entfernen</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metadatencache gelöscht</string>\n    <string name=\"settings_category_debug_title\">Fehlersuche</string>\n    <string name=\"invalid_source\">Datei-/Inhaltsquelle existiert nicht</string>\n    <string name=\"export_complete_toast\">Exportiert</string>\n    <string name=\"import_complete_toast\">Importiert</string>\n    <string name=\"name\">Name</string>\n    <string name=\"import_title\">Import</string>\n    <string name=\"subscriptions_import_unsuccessful\">Abonnements konnten nicht importiert werden</string>\n    <string name=\"subscriptions_export_unsuccessful\">Abonnements konnten nicht exportiert werden</string>\n    <string name=\"playback_speed_control\">Wiedergabegeschwindigkeitsregler</string>\n    <string name=\"playback_tempo\">Geschwindigkeit</string>\n    <string name=\"playback_pitch\">Tonhöhe</string>\n    <string name=\"unhook_checkbox\">Entkoppeln (kann zu Verzerrungen führen)</string>\n    <string name=\"auto_queue_title\">Nächsten Stream automatisch einreihen</string>\n    <string name=\"auto_queue_summary\">Wiedergabe durch Anhängen eines verwandten Streams an die Warteschlange (ohne Wiederholungsschleife) fortsetzen</string>\n    <string name=\"bookmark_playlist\">Wiedergabeliste mit Lesezeichen versehen</string>\n    <string name=\"resize_fit\">Anpassen</string>\n    <string name=\"resize_fill\">Füllen</string>\n    <string name=\"resize_zoom\">Vergrößern</string>\n    <string name=\"enable_leak_canary_summary\">Die Überwachung von Speicherlecks kann dazu führen, dass die App beim Heap-Dumping nicht mehr reagiert</string>\n    <string name=\"enable_disposed_exceptions_title\">Fehler außerhalb des Lebenszyklus melden</string>\n    <string name=\"enable_disposed_exceptions_summary\">Erzwingen der Meldung unzustellbarer Rx-Ausnahmen außerhalb des Lebenszyklus von Fragmenten oder Aktivitäten nach der Entsorgung</string>\n    <string name=\"import_youtube_instructions\">Importiere YouTube-Abonnements aus dem Google Takeout:\n\\n\n\\n1. Gehe zu dieser URL: %1$s\n\\n2. Melde dich an, falls du dazu aufgefordert wirst\n\\n3. Klicke auf „Alle Daten enthalten“, dann auf „Alle abwählen“, wähle dann nur „Abonnements“ und klicke auf „OK“\n\\n4. Klicke auf „Nächster Schritt“ und dann auf „Export erstellen“\n\\n5. Klicke auf die Schaltfläche „Download“, nachdem sie erscheint\n\\n6. Klicke unten auf \\\"Datei importieren\\\" und wähle die heruntergeladene Zip-Datei aus\n\\n7. [Wenn der Zip-Import fehlschlägt] Entpacke die CSV-Datei (normalerweise unter „YouTube und YouTube Music/Abos/Abos.csv“), klicke auf \\\"Datei importieren\\\" und wähle die extrahierte CSV-Datei aus</string>\n    <string name=\"import_soundcloud_instructions\">Importiere ein SoundCloud-Profil, indem die URL oder deine ID eingegeben wird:\n\\n\n\\n1. Aktiviere den Desktop-Modus in einem Web-Browser (die Seite ist für mobile Geräte nicht verfügbar)\n\\n2. Gehe zu dieser URL: %1$s\n\\n3. Melde dich an, falls du dazu aufgefordert wirst\n\\n4. Kopiere die Profil-URL, zu der du weitergeleitet wurdest.</string>\n    <string name=\"import_soundcloud_instructions_hint\">deineID, soundcloud.com/deineid</string>\n    <string name=\"no_streams_available_download\">Keine Streams zum Download verfügbar</string>\n    <string name=\"preferred_open_action_settings_title\">Bevorzugte „Öffnen“-Aktion</string>\n    <string name=\"preferred_open_action_settings_summary\">Standardaktion beim Öffnen von Inhalten — %s</string>\n    <string name=\"caption_setting_title\">Untertitel</string>\n    <string name=\"caption_setting_description\">Textgröße und Hintergrund der Untertitel im Player anpassen. Erfordert Neustart der App</string>\n    <string name=\"clear_views_history_title\">Wiedergabeverlauf löschen</string>\n    <string name=\"clear_views_history_summary\">Den Verlauf der wiedergegebenen Streams und die Wiedergabepositionen löschen</string>\n    <string name=\"delete_view_history_alert\">Den ganzen Wiedergabeverlauf löschen\\?</string>\n    <string name=\"watch_history_deleted\">Wiedergabeverlauf gelöscht</string>\n    <string name=\"clear_search_history_title\">Suchverlauf löschen</string>\n    <string name=\"clear_search_history_summary\">Den Verlauf der Suchbegriffe löschen</string>\n    <string name=\"delete_search_history_alert\">Den gesamten Suchverlauf löschen\\?</string>\n    <string name=\"search_history_deleted\">Suchverlauf gelöscht</string>\n    <string name=\"one_item_deleted\">1 Element gelöscht.</string>\n    <string name=\"app_license\">NewPipe ist freie Copyleft-Software: Du kannst sie nach Belieben benutzen, untersuchen, mit anderen teilen und verbessern. Insbesondere kannst du sie unter den von der Free Software Foundation veröffentlichten Bedingungen der GNU General Public License, in der Version 3 der Lizenz oder (nach deiner Wahl) jeder späteren Version, weitergeben und/oder verändern.</string>\n    <string name=\"import_settings\">Möchtest du auch Einstellungen importieren\\?</string>\n    <string name=\"privacy_policy_title\">NewPipes Datenschutzbestimmung</string>\n    <string name=\"privacy_policy_encouragement\">Dem NewPipe-Projekt ist Datenschutz sehr wichtig. Deshalb sammelt diese App keine Daten ohne deine Zustimmung.\n\\nNewPipes Datenschutzbestimmungen erklären im Detail, welche Daten beim Absenden eines Absturzberichtes verschickt und gespeichert werden.</string>\n    <string name=\"read_privacy_policy\">Datenschutzbestimmungen lesen</string>\n    <string name=\"accept\">Akzeptieren</string>\n    <string name=\"decline\">Ablehnen</string>\n    <string name=\"start_accept_privacy_policy\">Um der europäischen Datenschutz-Grundverordnung (DSGVO) gerecht zu werden, weisen wir hiermit auf NewPipes Datenschutzerklärung hin. Bitte lies sie sorgfältig durch.\n\\nDu musst den Datenschutzrichtlinien zustimmen, um den Fehlerbericht an uns zu senden.</string>\n    <string name=\"limit_data_usage_none_description\">Unbegrenzt</string>\n    <string name=\"limit_mobile_data_usage_title\">Auflösung bei Verwendung mobiler Daten begrenzen</string>\n    <string name=\"minimize_on_exit_title\">Beim App-Wechsel minimieren</string>\n    <string name=\"minimize_on_exit_summary\">Aktion beim Umschalten auf eine andere App vom Haupt-Videoplayer — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Keine</string>\n    <string name=\"minimize_on_exit_background_description\">Für die Wiedergabe im Hintergrund minimieren</string>\n    <string name=\"minimize_on_exit_popup_description\">Für die Wiedergabe im Pop-up minimieren</string>\n    <string name=\"skip_silence_checkbox\">Vorspulen bei Stille</string>\n    <string name=\"playback_step\">Stufe</string>\n    <string name=\"playback_reset\">Zurücksetzen</string>\n    <string name=\"channels\">Kanäle</string>\n    <string name=\"playlists\">Wiedergabelisten</string>\n    <string name=\"tracks\">Titel</string>\n    <string name=\"users\">Benutzer</string>\n    <string name=\"unsubscribe\">Deabonnieren</string>\n    <string name=\"tab_choose\">Tab wählen</string>\n    <string name=\"settings_category_updates_title\">Aktualisierungen</string>\n    <string name=\"settings_category_player_notification_title\">Wiedergabebenachrichtigung</string>\n    <string name=\"settings_category_player_notification_summary\">Konfiguriert die Benachrichtigung zum aktuell abgespielten Stream</string>\n    <string name=\"file_deleted\">Datei gelöscht</string>\n    <string name=\"app_update_notification_channel_name\">Benachrichtigung über App-Update</string>\n    <string name=\"app_update_notification_channel_description\">Benachrichtigungen über neue NewPipe-Versionen</string>\n    <string name=\"download_to_sdcard_error_title\">Kein externer Speicher verfügbar</string>\n    <string name=\"download_to_sdcard_error_message\">Herunterladen auf externe SD-Karte ist nicht möglich. Downloadordner zurücksetzen\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Konnte gespeicherte Tabs nicht lesen, daher werden die Voreinstellungen genutzt</string>\n    <string name=\"restore_defaults\">Standardwerte wiederherstellen</string>\n    <string name=\"restore_defaults_confirmation\">Möchtest du die Standardwerte wiederherstellen\\?</string>\n    <string name=\"subscribers_count_not_available\">Abonnentenzahl nicht abrufbar</string>\n    <string name=\"main_page_content_summary\">Welche Tabs auf der Hauptseite angezeigt werden</string>\n    <string name=\"updates_setting_title\">Aktualisierungen</string>\n    <string name=\"updates_setting_description\">Per Benachrichtigung zur Aktualisierung der App auffordern, wenn eine neue Version verfügbar ist</string>\n    <string name=\"list_view_mode\">Art der Ansicht</string>\n    <string name=\"list\">Liste</string>\n    <string name=\"grid\">Raster</string>\n    <string name=\"auto\">Automatisch</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Vorschaubild der Suchleiste</string>\n    <string name=\"high_quality_larger\">Hohe Qualität (größer)</string>\n    <string name=\"low_quality_smaller\">Niedrige Qualität (kleiner)</string>\n    <string name=\"dont_show\">Nicht anzeigen</string>\n    <string name=\"app_update_available_notification_title\">Eine NewPipe-Aktualisierung ist verfügbar!</string>\n    <string name=\"missions_header_finished\">Fertig</string>\n    <string name=\"missions_header_pending\">Ausstehend</string>\n    <string name=\"paused\">pausiert</string>\n    <string name=\"queued\">eingereiht</string>\n    <string name=\"post_processing\">Nachbearbeitung</string>\n    <string name=\"enqueue\">In Wiedergabe einreihen</string>\n    <string name=\"permission_denied\">System verweigert den Zugriff</string>\n    <string name=\"download_failed\">Download fehlgeschlagen</string>\n    <string name=\"generate_unique_name\">Eindeutigen Namen erzeugen</string>\n    <string name=\"overwrite\">Überschreiben</string>\n    <string name=\"overwrite_unrelated_warning\">Eine Datei mit diesem Namen existiert bereits</string>\n    <string name=\"download_already_running\">Eine heruntergeladene Datei mit diesem Namen existiert bereits</string>\n    <string name=\"show_error\">Fehler anzeigen</string>\n    <string name=\"error_file_creation\">Die Datei kann nicht erstellt werden</string>\n    <string name=\"error_path_creation\">Der Zielordner kann nicht erstellt werden</string>\n    <string name=\"error_ssl_exception\">Aufbau einer sicheren Verbindung nicht möglich</string>\n    <string name=\"error_unknown_host\">Server konnte nicht gefunden werden</string>\n    <string name=\"error_connect_host\">Verbindung mit Server nicht möglich</string>\n    <string name=\"error_http_no_content\">Der Server sendet keine Daten</string>\n    <string name=\"error_http_unsupported_range\">Der Server akzeptiert keine Multithread-Downloads, versuche es erneut mit @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Nicht gefunden</string>\n    <string name=\"error_postprocessing_failed\">Nachbearbeitung fehlgeschlagen</string>\n    <string name=\"stop\">Anhalten</string>\n    <string name=\"max_retry_msg\">Maximale Wiederholungen</string>\n    <string name=\"max_retry_desc\">Maximalanzahl der Versuche, bevor der Download abgebrochen wird</string>\n    <string name=\"pause_downloads_on_mobile\">Unterbrechen bei kostenpflichtigen Netzwerken</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Nützlich beim Wechsel zu mobilen Daten, obwohl einige Downloads nicht unterbrochen werden können</string>\n    <string name=\"conferences\">Konferenzen</string>\n    <string name=\"events\">Ereignisse</string>\n    <string name=\"error_timeout\">Verbindungszeitüberschreitung</string>\n    <string name=\"show_comments_title\">Kommentare anzeigen</string>\n    <string name=\"show_comments_summary\">Ausschalten, um Kommentare auszublenden</string>\n    <string name=\"autoplay_title\">Automatische Wiedergabe</string>\n    <string name=\"no_comments\">Keine Kommentare</string>\n    <string name=\"comments_are_disabled\">Kommentare sind deaktiviert</string>\n    <string name=\"error_unable_to_load_comments\">Kommentare konnten nicht geladen werden</string>\n    <string name=\"close\">Schließen</string>\n    <string name=\"enable_playback_resume_title\">Wiedergabe fortsetzen</string>\n    <string name=\"enable_playback_resume_summary\">Letzte Wiedergabeposition wiederherstellen</string>\n    <string name=\"enable_playback_state_lists_title\">Positionen in Listen</string>\n    <string name=\"enable_playback_state_lists_summary\">Wiedergabepositionsanzeigen in Listen anzeigen</string>\n    <string name=\"settings_category_clear_data_title\">Daten löschen</string>\n    <string name=\"watch_history_states_deleted\">Wiedergabepositionen gelöscht</string>\n    <string name=\"missing_file\">Datei verschoben oder gelöscht</string>\n    <string name=\"overwrite_finished_warning\">Eine heruntergeladene Datei mit diesem Namen existiert bereits</string>\n    <string name=\"overwrite_failed\">Datei kann nicht überschrieben werden</string>\n    <string name=\"download_already_pending\">Es ist ein ausstehender Download mit diesem Namen vorhanden</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe wurde während der Verarbeitung der Datei geschlossen</string>\n    <string name=\"error_insufficient_storage_left\">Kein Speicherplatz mehr auf dem Gerät</string>\n    <string name=\"error_progress_lost\">Vorgang abgebrochen, da die Datei gelöscht wurde</string>\n    <string name=\"confirm_prompt\">Möchtest du deinen Downloadverlauf oder alle heruntergeladenen Dateien löschen\\?</string>\n    <string name=\"enable_queue_limit\">Downloadwarteschlange begrenzen</string>\n    <string name=\"enable_queue_limit_desc\">Ein Download wird gleichzeitig ausgeführt</string>\n    <string name=\"start_downloads\">Downloads starten</string>\n    <string name=\"pause_downloads\">Downloads anhalten</string>\n    <string name=\"downloads_storage_ask_title\">Downloadziel abfragen</string>\n    <string name=\"downloads_storage_ask_summary\">Du wirst gefragt, wo jede heruntergeladene Datei gespeichert werden soll.\n\\nAktiviere die Systemordnerauswahl (SAF), wenn du auf eine externe SD-Karte herunterladen möchtest</string>\n    <string name=\"downloads_storage_use_saf_title\">Systemordnerauswahl verwenden (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">Das „Storage Access Framework“ ermöglicht das Herunterladen auf eine externe SD-Karte</string>\n    <string name=\"clear_playback_states_title\">Wiedergabepositionen löschen</string>\n    <string name=\"clear_playback_states_summary\">Alle Wiedergabepositionen löschen</string>\n    <string name=\"delete_playback_states_alert\">Alle Wiedergabepositionen löschen\\?</string>\n    <string name=\"drawer_header_description\">Dienst umschalten, aktuell ausgewählt:</string>\n    <string name=\"default_kiosk_page_summary\">Standard-Kiosk</string>\n    <string name=\"no_one_watching\">Niemand schaut zu</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s Zuschauer</item>\n        <item quantity=\"other\">%s Zuschauer</item>\n    </plurals>\n    <string name=\"no_one_listening\">Niemand hört zu</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s Zuhörer</item>\n        <item quantity=\"other\">%s Zuhörer</item>\n    </plurals>\n    <string name=\"peertube_instance_url_title\">PeerTube-Instanzen</string>\n    <string name=\"peertube_instance_url_help\">Finde auf %s die Instanzen, die dir gefallen</string>\n    <string name=\"peertube_instance_add_title\">Instanz hinzufügen</string>\n    <string name=\"peertube_instance_add_help\">URL der Instanz eingeben</string>\n    <string name=\"peertube_instance_add_fail\">Validierung der Instanz fehlgeschlagen</string>\n    <string name=\"peertube_instance_add_exists\">Instanz existiert bereits</string>\n    <string name=\"local\">Lokal</string>\n    <string name=\"recently_added\">Kürzlich hinzugefügt</string>\n    <string name=\"playlist_no_uploader\">Auto-generiert (kein Autor gefunden)</string>\n    <string name=\"choose_instance_prompt\">Eine Instanz wählen</string>\n    <string name=\"peertube_instance_url_summary\">Bevorzugte Peertube-Instanzen auswählen</string>\n    <string name=\"peertube_instance_add_https_only\">Es werden nur HTTPS-Adressen unterstützt</string>\n    <string name=\"seek_duration_title\">Dauer der Suche bei schnellem Vor-/Zurückspulen</string>\n    <string name=\"most_liked\">Am beliebtesten</string>\n    <string name=\"recovering\">Wiederherstellen</string>\n    <string name=\"error_download_resource_gone\">Kann diesen Download nicht wiederherstellen</string>\n    <string name=\"clear_download_history\">Downloadverlauf löschen</string>\n    <string name=\"delete_downloaded_files\">Heruntergeladene Dateien löschen</string>\n    <string name=\"permission_display_over_apps\">Berechtigung zur Anzeige über andere Apps erteilen</string>\n    <string name=\"app_language_title\">Sprache der App</string>\n    <string name=\"systems_language\">Systemstandard</string>\n    <string name=\"subtitle_activity_recaptcha\">„Fertig“ drücken, wenn es gelöst wurde</string>\n    <string name=\"done\">Fertig</string>\n    <string name=\"videos_string\">Videos</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d Sekunde</item>\n        <item quantity=\"other\">%d Sekunden</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Aufgrund von ExoPlayer-Einschränkungen wurde die Suchdauer auf %d Sekunden gesetzt</string>\n    <string name=\"mute\">Stummschaltung</string>\n    <string name=\"unmute\">Stummschaltung aufheben</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d Minute</item>\n        <item quantity=\"other\">%d Minuten</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d Stunde</item>\n        <item quantity=\"other\">%d Stunden</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d Tag</item>\n        <item quantity=\"other\">%d Tage</item>\n    </plurals>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d ausgewählt</item>\n        <item quantity=\"other\">%d ausgewählte</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">Leerer Gruppenname</string>\n    <string name=\"feed_group_dialog_delete_message\">Möchtest du diese Gruppe löschen\\?</string>\n    <string name=\"feed_create_new_group_button_title\">Neu</string>\n    <string name=\"feed_update_threshold_option_always_update\">Immer aktualisieren</string>\n    <string name=\"feed_groups_header_title\">Kanalgruppen</string>\n    <string name=\"feed_subscription_not_loaded_count\">Nicht geladen: %d</string>\n    <string name=\"feed_notification_loading\">Lade Feed …</string>\n    <string name=\"feed_processing_message\">Verarbeite Feed …</string>\n    <string name=\"settings_category_feed_title\">Feed</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Abonnements auswählen</string>\n    <string name=\"feed_group_dialog_empty_selection\">Kein Abonnement ausgewählt</string>\n    <string name=\"feed_update_threshold_summary\">Zeit nach der letzten Aktualisierung, bevor ein Abonnement als veraltet angesehen wird — %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Schnellmodus aktivieren</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Schnellmodus deaktivieren</string>\n    <string name=\"feed_oldest_subscription_update\">Feed zuletzt aktualisiert: %s</string>\n    <string name=\"feed_update_threshold_title\">Grenzwert für Feed-Aktualisierung</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Aus fest zugeordnetem Feed abrufen wenn verfügbar</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">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\\n\n\\nNewPipe bietet zwei Feed-Ladestrategien:\n\\n• das Abrufen des gesamten abonnierten Kanals, was langsam aber vollständig geschieht.\n\\n• das Verwenden eines fest zugeordneten Serviceendpunkts, was schnell aber für gewöhnlich unvollständig ist.\n\\n\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\\n\n\\nYouTube ist ein Beispiel für einen Service, der mit seinem RSS-Feed diese schnelle Methode anbietet.\n\\n\n\\nDie Entscheidung läuft also darauf hinaus, was dir lieber ist: Tempo oder genaue Informationen.</string>\n    <string name=\"infinite_videos\">∞ Videos</string>\n    <string name=\"more_than_100_videos\">100+ Videos</string>\n    <string name=\"artists\">Künstler</string>\n    <string name=\"albums\">Alben</string>\n    <string name=\"songs\">Lieder</string>\n    <string name=\"content_not_supported\">Dieser Inhalt wird von NewPipe noch nicht unterstützt.\n\\n\n\\nEr wird hoffentlich in einer zukünftigen Version unterstützt.</string>\n    <string name=\"restricted_video\">Dieses Video ist altersbeschränkt.\n\\n\n\\nAktiviere in den Einstellungen „%1$s“, falls du diese sehen möchtest.</string>\n    <string name=\"remove_watched_popup_warning\">Streams, die vor und nach dem Hinzufügen zur Wiedergabeliste angeschaut wurden, werden entfernt. \\nBist du sicher?</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Teilweise angesehene Streams entfernen</string>\n    <string name=\"remove_watched\">Gesehene entfernen</string>\n    <string name=\"remove_watched_popup_title\">Gesehene Streams entfernen?</string>\n    <string name=\"show_original_time_ago_title\">Originalzeit vor Elementen anzeigen</string>\n    <string name=\"show_original_time_ago_summary\">Originaltexte von Diensten werden in Stream-Elementen sichtbar sein</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTubes „Eingeschränkten Modus“ aktivieren</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Profilbild des Kanals</string>\n    <string name=\"channel_created_by\">Erstellt von %s</string>\n    <string name=\"video_detail_by\">Von %s</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Nur nicht gruppierte Abonnements anzeigen</string>\n    <string name=\"playlist_page_summary\">Wiedergabelisten-Seite</string>\n    <string name=\"no_playlist_bookmarked_yet\">Bisher keine Lesezeichen für Wiedergabelisten</string>\n    <string name=\"select_a_playlist\">Wiedergabeliste auswählen</string>\n    <string name=\"error_report_open_github_notice\">Bitte prüfe, ob nicht bereits ein Thema existiert, das deinen Absturz behandelt. Doppelt erstellte Tickets kosten uns Zeit, die wir nutzen könnten, um diesen Fehler zu beheben.</string>\n    <string name=\"search_showing_result_for\">Zeige Ergebnisse für: %s</string>\n    <string name=\"autoplay_summary\">Wiedergabe automatisch starten — %s</string>\n    <string name=\"wifi_only\">Nur über WLAN</string>\n    <string name=\"never\">Nie</string>\n    <string name=\"notification_actions_at_most_three\">Du kannst maximal drei Aktionen auswählen, die in der Kompaktbenachrichtigung angezeigt werden sollen!</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"unsupported_url_dialog_message\">Konnte die angegebene URL nicht erkennen. Mit einer anderen Anwendung öffnen\\?</string>\n    <string name=\"notification_action_4_title\">Fünfte Aktionstaste</string>\n    <string name=\"notification_action_3_title\">Vierte Aktionstaste</string>\n    <string name=\"notification_action_2_title\">Dritte Aktionstaste</string>\n    <string name=\"notification_action_1_title\">Zweite Aktionstaste</string>\n    <string name=\"notification_action_0_title\">Erste Aktionstaste</string>\n    <string name=\"notification_scale_to_square_image_summary\">Beschneidet das in der Benachrichtigung angezeigte Video-Vorschaubild von 16:9 auf ein 1:1 Seitenverhältnis</string>\n    <string name=\"notification_scale_to_square_image_title\">Vorschaubild auf 1:1 Seitenverhältnis zuschneiden</string>\n    <string name=\"notification_action_shuffle\">Zufällig</string>\n    <string name=\"notification_action_buffering\">Puffern</string>\n    <string name=\"notification_action_repeat\">Wiederholen</string>\n    <string name=\"notification_action_nothing\">Nichts</string>\n    <string name=\"title_activity_play_queue\">Warteschlange abspielen</string>\n    <string name=\"auto_queue_toggle\">Auto-Einreihung</string>\n    <string name=\"clear_queue_confirmation_summary\">Der Wechsel von einem Player zu einem anderen kann deine Warteschlange überschreiben</string>\n    <string name=\"clear_queue_confirmation_title\">Überschreiben der Warteschlange bestätigen</string>\n    <string name=\"clear_queue_confirmation_description\">Die aktive Player-Warteschlange wird ersetzt</string>\n    <string name=\"enqueued\">Eingereiht</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube bietet einen „Eingeschränkten Modus“, der potenziell nicht jugendfreie Inhalte ausblendet</string>\n    <string name=\"show_memory_leaks\">Speicherlecks anzeigen</string>\n    <string name=\"clear_cookie_summary\">Lösche Cookies, die NewPipe speichert, wenn du ein reCAPTCHA löst</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA-Cookies wurden gelöscht</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA-Cookies löschen</string>\n    <string name=\"show_age_restricted_content_summary\">Für Kinder möglicherweise ungeeignete Inhalte anzeigen (bspw. ab 18)</string>\n    <string name=\"enqueue_stream\">In Wiedergabe einreihen</string>\n    <string name=\"notification_colorize_summary\">Android kann die Farbe der Benachrichtigung entsprechend der Hauptfarbe in der Miniaturansicht anpassen (beachte, dass dies nicht auf allen Geräten verfügbar ist)</string>\n    <string name=\"notification_colorize_title\">Benachrichtigung farblich anpassen</string>\n    <string name=\"show_thumbnail_summary\">Vorschaubild für Sperrbildschirmhintergrund und Benachrichtigungen verwenden</string>\n    <string name=\"show_thumbnail_title\">Vorschaubild anzeigen</string>\n    <string name=\"msg_calculating_hash\">Hash wird berechnet</string>\n    <string name=\"hash_channel_description\">Benachrichtigungen über den Hashing-Fortschritt von Videos</string>\n    <string name=\"hash_channel_name\">Video-Hash-Benachrichtigung</string>\n    <string name=\"recent\">Letzte</string>\n    <string name=\"show_meta_info_title\">Metadaten anzeigen</string>\n    <string name=\"show_meta_info_summary\">Ausschalten, um Metadaten-Felder mit zusätzlichen Informationen zu Stream-Ersteller, -Inhalten oder einer Suchanfrage auszublenden</string>\n    <string name=\"chapters\">Kapitel</string>\n    <string name=\"description_tab_description\">Beschreibung</string>\n    <string name=\"related_items_tab_description\">Verwandte Elemente</string>\n    <string name=\"comments_tab_description\">Kommentare</string>\n    <string name=\"show_description_summary\">Ausschalten, um Videobeschreibung und Zusatzinformationen auszublenden</string>\n    <string name=\"show_description_title\">Beschreibung anzeigen</string>\n    <string name=\"open_with\">Öffnen mit</string>\n    <string name=\"no_app_to_open_intent\">Keine App auf deinem Gerät kann dies öffnen</string>\n    <string name=\"private_content\">Dieser Inhalt ist privat, kann also nicht von NewPipe gestreamt oder heruntergeladen werden.</string>\n    <string name=\"paid_content\">Diese Inhalte sind nur für Benutzer verfügbar, die bezahlt haben, können also nicht von NewPipe gestreamt oder heruntergeladen werden.</string>\n    <string name=\"youtube_music_premium_content\">Dieses Video ist nur für YouTube-Music-Premium-Mitglieder verfügbar und kann daher nicht von NewPipe gestreamt oder heruntergeladen werden.</string>\n    <string name=\"soundcloud_go_plus_content\">Dies ist ein SoundCloud Go+ Track, zumindest in deinem Land, kann er von NewPipe nicht gestreamt oder heruntergeladen werden.</string>\n    <string name=\"georestricted_content\">Dieser Inhalt ist in deinem Land nicht verfügbar.</string>\n    <string name=\"crash_the_app\">App abstürzen lassen</string>\n    <string name=\"restricted_video_no_stream\">Dieses Video ist altersbeschränkt.\n\\nAufgrund neuer YouTube-Richtlinien mit altersbeschränkten Videos kann NewPipe auf keinen dieser Videostreams zugreifen und ist daher nicht in der Lage, es abzuspielen.</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"featured\">Vorgestellt</string>\n    <string name=\"recaptcha_solve\">Lösen</string>\n    <string name=\"download_has_started\">Download hat begonnen</string>\n    <string name=\"select_night_theme_toast\">Du kannst dein bevorzugtes Nachtdesign unten auswählen</string>\n    <string name=\"night_theme_summary\">Wähle dein bevorzugtes Nachtdesign — %s</string>\n    <string name=\"auto_device_theme_title\">Automatisch (Gerätedesign)</string>\n    <string name=\"night_theme_title\">Nachtdesign</string>\n    <string name=\"show_channel_details\">Kanaldetails anzeigen</string>\n    <string name=\"disable_media_tunneling_summary\">Deaktiviere das Media-Tunneling, wenn bei der Videowiedergabe ein schwarzer Bildschirm oder Stottern auftritt.</string>\n    <string name=\"disable_media_tunneling_title\">Media-Tunneling deaktivieren</string>\n    <string name=\"metadata_privacy_internal\">Intern</string>\n    <string name=\"metadata_privacy_private\">Privat</string>\n    <string name=\"metadata_privacy_public\">Öffentlich</string>\n    <string name=\"metadata_language\">Sprache</string>\n    <string name=\"metadata_age_limit\">Altersbeschränkung</string>\n    <string name=\"metadata_privacy\">Sichtbarkeit</string>\n    <string name=\"metadata_licence\">Lizenz</string>\n    <string name=\"metadata_tags\">Schlagwörter</string>\n    <string name=\"metadata_category\">Kategorie</string>\n    <string name=\"metadata_privacy_unlisted\">Nicht gelistet</string>\n    <string name=\"metadata_host\">Server</string>\n    <string name=\"metadata_support\">Unterstützung</string>\n    <string name=\"metadata_subscribers\">Abonnenten</string>\n    <string name=\"description_select_disable\">Auswählen von Text in der Beschreibung deaktivieren</string>\n    <string name=\"description_select_enable\">Auswählen von Text in der Beschreibung aktivieren</string>\n    <string name=\"description_select_note\">Du kannst nun Text innerhalb der Beschreibung auswählen. Beachte, dass die Seite flackern kann und Links im Auswahlmodus möglicherweise nicht anklickbar sind.</string>\n    <string name=\"feed_load_error_terminated\">Das Konto des Autors wurde geschlossen.\n\\nNewPipe wird diesen Feed in Zukunft nicht mehr laden können.\n\\nMöchtest du dich von diesem Kanal abmelden\\?</string>\n    <string name=\"account_terminated\">Konto geschlossen</string>\n    <string name=\"feed_load_error_fast_unknown\">Der Schnellmodus liefert hierzu keine weiteren Informationen.</string>\n    <string name=\"no_dir_yet\">Noch kein Downloadordner festgelegt, wähle jetzt den Standard-Downloadordner</string>\n    <string name=\"open_website_license\">Webseite öffnen</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Ab Android 10 wird nur noch „Storage Access Framework“ unterstützt</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Du wirst jedes Mal gefragt werden, wohin der Download gespeichert werden soll</string>\n    <string name=\"feed_load_error\">Fehler beim Laden des Feeds</string>\n    <string name=\"feed_load_error_account_info\">Konnte Feed für \\'%s\\' nicht laden.</string>\n    <string name=\"on\">An</string>\n    <string name=\"tablet_mode_title\">Tablet-Modus</string>\n    <string name=\"off\">Aus</string>\n    <string name=\"mark_as_watched\">Als gesehen markieren</string>\n    <string name=\"detail_heart_img_view_description\">Vom Ersteller mit Herz versehen</string>\n    <string name=\"remote_search_suggestions\">Entfernte Suchvorschläge</string>\n    <string name=\"local_search_suggestions\">Lokale Suchvorschläge</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s Download gelöscht</item>\n        <item quantity=\"other\">%1$s Downloads gelöscht</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Download abgeschlossen</item>\n        <item quantity=\"other\">%s Downloads abgeschlossen</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Wische über Elemente, um sie zu entfernen</string>\n    <string name=\"start_main_player_fullscreen_summary\">Videos nicht im Miniplayer starten, sondern direkt in den Vollbildmodus schalten, wenn die automatische Drehung gesperrt ist. Du kannst immer noch auf den Miniplayer zugreifen, wenn du den Vollbildmodus verlässt</string>\n    <string name=\"start_main_player_fullscreen_title\">Hauptplayer im Vollbildmodus starten</string>\n    <string name=\"enqueued_next\">Als Nächstes eingereiht</string>\n    <string name=\"enqueue_next_stream\">Als Nächstes in Wiedergabe einreihen</string>\n    <string name=\"processing_may_take_a_moment\">Verarbeite … Kann einen Moment dauern</string>\n    <string name=\"check_for_updates\">Nach Aktualisierungen suchen</string>\n    <string name=\"checking_updates_toast\">Suche nach Aktualisierungen …</string>\n    <string name=\"manual_update_description\">Manuelle Prüfung auf neue Versionen</string>\n    <string name=\"feed_new_items\">Neue Feed-Elemente</string>\n    <string name=\"show_crash_the_player_title\">„Player abstürzen lassen“ anzeigen</string>\n    <string name=\"crash_the_player\">Player abstürzen lassen</string>\n    <string name=\"show_crash_the_player_summary\">Zeigt eine Absturzoption an, wenn der Player verwendet wird</string>\n    <string name=\"error_report_channel_name\">Fehlerbericht-Benachrichtigung</string>\n    <string name=\"error_report_channel_description\">Benachrichtigungen zur Meldung von Fehlern</string>\n    <string name=\"error_report_notification_title\">Bei NewPipe ist ein Fehler aufgetreten. Zum Melden antippen</string>\n    <string name=\"error_report_notification_toast\">Ein Fehler ist aufgetreten, siehe die Benachrichtigung</string>\n    <string name=\"create_error_notification\">Eine Fehlermeldung erstellen</string>\n    <string name=\"show_error_snackbar\">Fehler-Kurzmeldung anzeigen</string>\n    <string name=\"no_appropriate_file_manager_message\">Es wurde kein geeigneter Dateimanager für diese Aktion gefunden.\n\\nBitte installiere einen Dateimanager oder versuche, \\'%s\\' in den Downloadeinstellungen zu deaktivieren</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Es wurde kein geeigneter Dateimanager für diese Aktion gefunden.\n\\nBitte installiere einen Storage Access Framework kompatiblen Dateimanager</string>\n    <string name=\"detail_pinned_comment_view_description\">Angehefteter Kommentar</string>\n    <string name=\"leak_canary_not_available\">LeakCanary ist nicht verfügbar</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer Standard</string>\n    <string name=\"notifications\">Benachrichtigungen</string>\n    <string name=\"streams_notification_channel_description\">Benachrichtigen über neue abonnierbare Streams</string>\n    <string name=\"streams_notification_channel_name\">Neue Streams</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s neuer Stream</item>\n        <item quantity=\"other\">%s neue Streams</item>\n    </plurals>\n    <string name=\"loading_stream_details\">Lade Stream-Details …</string>\n    <string name=\"enable_streams_notifications_summary\">Über neue Streams aus Abonnements benachrichtigen</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"any_network\">Jedes Netzwerk</string>\n    <string name=\"enable_streams_notifications_title\">Benachrichtigungen über neue Streams</string>\n    <string name=\"check_new_streams\">Suche nach neuen Streams ausführen</string>\n    <string name=\"streams_notifications_network_title\">Erforderliche Netzwerkverbindung</string>\n    <string name=\"notifications_disabled\">Benachrichtigungen sind deaktiviert</string>\n    <string name=\"get_notified\">Benachrichtigung erhalten</string>\n    <string name=\"delete_downloaded_files_confirm\">Alle heruntergeladenen Dateien von der Festplatte löschen\\?</string>\n    <string name=\"you_successfully_subscribed\">Du hast jetzt diesen Kanal abonniert</string>\n    <string name=\"toggle_all\">Alle umschalten</string>\n    <string name=\"streams_notifications_interval_title\">Prüfintervall</string>\n    <string name=\"percent\">Prozent</string>\n    <string name=\"semitone\">Halbton</string>\n    <string name=\"no_video_streams_available_for_external_players\">Keine Videostreams für externe Player verfügbar</string>\n    <string name=\"select_quality_external_players\">Qualität für externe Player auswählen</string>\n    <string name=\"unknown_format\">Unbekanntes Format</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Keine Audiostreams für externe Player verfügbar</string>\n    <string name=\"unknown_quality\">Unbekannte Qualität</string>\n    <string name=\"streams_not_yet_supported_removed\">Streams, die der Downloader noch nicht unterstützt, werden nicht angezeigt</string>\n    <string name=\"selected_stream_external_player_not_supported\">Der ausgewählte Stream wird von externen Playern nicht unterstützt</string>\n    <string name=\"progressive_load_interval_title\">Größe des Ladeintervalls für die Wiedergabe</string>\n    <string name=\"faq\">Auf der Webseite ansehen</string>\n    <string name=\"faq_title\">Häufig gestellte Fragen</string>\n    <string name=\"faq_description\">Wenn du Probleme bei der Verwendung der App hast, lies bitte die Antworten auf häufig gestellte Fragen!</string>\n    <string name=\"sort\">Sortieren</string>\n    <string name=\"fast_mode\">Schnellmodus</string>\n    <string name=\"app_update_unavailable_toast\">Du verwendest die neueste Version von NewPipe</string>\n    <string name=\"app_update_available_notification_text\">Antippen um %s herunterzuladen</string>\n    <string name=\"import_subscriptions_hint\">Importieren oder Exportieren von Abonnements über das 3-Punkte-Menü</string>\n    <string name=\"night_theme_available\">Diese Option ist nur verfügbar, wenn %s als Design ausgewählt wird</string>\n    <string name=\"unset_playlist_thumbnail\">Dauerhaftes Vorschaubild aufheben</string>\n    <string name=\"msg_failed_to_copy\">Kopieren in die Zwischenablage fehlgeschlagen</string>\n    <string name=\"card\">Karte</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplikat %d mal hinzugefügt</string>\n    <string name=\"duplicate_in_playlist\">Die ausgegrauten Wiedergabelisten enthalten dieses Element bereits.</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Nützlich, wenn z. B. ein Headset mit defekten physischen Tasten verwendet wird</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ereignisse der Hardware-Medientasten ignorieren</string>\n    <string name=\"remove_duplicates\">Duplikate entfernen</string>\n    <string name=\"remove_duplicates_title\">Duplikate entfernen\\?</string>\n    <string name=\"remove_duplicates_message\">Möchtest du alle doppelten Streams in dieser Wiedergabeliste entfernen\\?</string>\n    <string name=\"feed_show_hide_streams\">Streams anzeigen/ausblenden</string>\n    <string name=\"feed_hide_streams_title\">Folgende Streams anzeigen</string>\n    <string name=\"feed_show_upcoming\">Demnächst</string>\n    <string name=\"feed_show_watched\">Vollständig angeschaut</string>\n    <string name=\"feed_show_partially_watched\">Teilweise angeschaut</string>\n    <string name=\"left_gesture_control_summary\">Geste für die linke Hälfte des Player-Bildschirms auswählen</string>\n    <string name=\"right_gesture_control_summary\">Geste für die rechte Hälfte des Player-Bildschirms auswählen</string>\n    <string name=\"none\">Keine</string>\n    <string name=\"right_gesture_control_title\">Rechte Gestenaktion</string>\n    <string name=\"left_gesture_control_title\">Linke Gestenaktion</string>\n    <string name=\"brightness\">Helligkeit</string>\n    <string name=\"volume\">Lautstärke</string>\n    <string name=\"progressive_load_interval_summary\">Ändere die Größe des Ladeintervalls für progressive Inhalte (derzeit %s). Ein niedrigerer Wert kann das anfängliche Laden der Inhalte beschleunigen</string>\n    <string name=\"prefer_original_audio_title\">Originalton bevorzugen</string>\n    <string name=\"prefer_original_audio_summary\">Originaltonspur unabhängig von der Sprache wählen</string>\n    <string name=\"prefer_descriptive_audio_title\">Beschreibendes Audio bevorzugen</string>\n    <string name=\"prefer_descriptive_audio_summary\">Wenn möglich Audiospur mit Beschreibungen für sehbehinderte Menschen wählen</string>\n    <string name=\"play_queue_audio_track\">Audio: %s</string>\n    <string name=\"audio_track\">Audiospur</string>\n    <string name=\"settings_category_exoplayer_summary\">Einige ExoPlayer-Einstellungen steuern. Diese Änderungen erfordern einen Neustart des Players, um wirksam zu werden</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Die Decoder-Fallback-Funktion von ExoPlayer verwenden</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Immer die ExoPlayer-Einstellung für die Videoausgangsoberfläche als Umgehung verwenden</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\n\\nDas Aktivieren dieser Option kann Wiedergabefehler beim Wechsel des aktuellen Videoplayers oder beim Wechsel zum Vollbildmodus verhindern</string>\n    <string name=\"audio_track_type_original\">Original</string>\n    <string name=\"audio_track_type_dubbed\">Synchronisiert</string>\n    <string name=\"audio_track_type_descriptive\">Beschreibend</string>\n    <string name=\"select_audio_track_external_players\">Audiospur für externe Player auswählen</string>\n    <string name=\"audio_track_present_in_video\">In diesem Stream sollte bereits eine Audiospur vorhanden sein</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"unknown_audio_track\">Unbekannt</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer-Einstellungen</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"main_tabs_position_summary\">Hauptauswahltab nach unten verschieben</string>\n    <string name=\"main_tabs_position_title\">Position des Haupttabs</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Das Media-Tunneling wurde auf dem Gerät standardmäßig deaktiviert, da das Gerätemodell diese Funktion bekanntermaßen nicht unterstützt.</string>\n    <string name=\"no_live_streams\">Keine Live-Streams</string>\n    <string name=\"no_streams\">Keine Streams</string>\n    <string name=\"channel_tab_videos\">Videos</string>\n    <string name=\"channel_tab_livestreams\">Live</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"channel_tab_playlists\">Wiedergabelisten</string>\n    <string name=\"channel_tab_channels\">Kanäle</string>\n    <string name=\"channel_tab_albums\">Alben</string>\n    <string name=\"show_channel_tabs\">Tabs auf den Kanalseiten</string>\n    <string name=\"show_channel_tabs_summary\">Welche Tabs auf den Kanalseiten angezeigt werden</string>\n    <string name=\"loading_metadata_title\">Lade Metadaten …</string>\n    <string name=\"channel_tab_about\">Über</string>\n    <string name=\"feed_fetch_channel_tabs\">Tabs der Kanalseiten abrufen</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Tabs, die beim Aktualisieren des Feeds abgerufen werden. Diese Option hat keine Auswirkungen, wenn ein Kanal im Schnellmodus aktualisiert wird.</string>\n    <string name=\"channel_tab_tracks\">Titel</string>\n    <string name=\"toggle_screen_orientation\">Bildschirmausrichtung umschalten</string>\n    <string name=\"toggle_fullscreen\">Vollbildmodus umschalten</string>\n    <string name=\"open_play_queue\">Wiedergabewarteschlange öffnen</string>\n    <string name=\"forward\">Vorspulen</string>\n    <string name=\"rewind\">Zurückspulen</string>\n    <string name=\"replay\">Wiederholen</string>\n    <string name=\"play\">Abspielen</string>\n    <string name=\"next_stream\">Nächster Stream</string>\n    <string name=\"more_options\">Mehr Optionen</string>\n    <string name=\"duration\">Dauer</string>\n    <string name=\"previous_stream\">Vorheriger Stream</string>\n    <string name=\"image_quality_title\">Bildqualität</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"image_quality_low\">Geringe Qualität</string>\n    <string name=\"image_quality_none\">Bilder nicht laden</string>\n    <string name=\"image_quality_high\">Hohe Qualität</string>\n    <string name=\"image_quality_medium\">Mittlere Qualität</string>\n    <string name=\"metadata_banners\">Banner</string>\n    <string name=\"metadata_thumbnails\">Vorschaubilder</string>\n    <string name=\"metadata_avatars\">Profilbilder</string>\n    <string name=\"metadata_subchannel_avatars\">Profilbilder des Unterkanals</string>\n    <string name=\"metadata_uploader_avatars\">Profilbilder des Benutzers</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"share_playlist_with_list\">URL-Liste teilen</string>\n    <string name=\"share_playlist_with_titles\">Mit Titeln teilen</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">Wiedergabeliste teilen</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s Antwort</item>\n        <item quantity=\"other\">%s Antworten</item>\n    </plurals>\n    <string name=\"show_more\">Mehr zeigen</string>\n    <string name=\"show_less\">Weniger zeigen</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"error_insufficient_storage\">Nicht genug freier Speicher auf dem Gerät</string>\n    <string name=\"reset_settings_title\">Einstellungen zurücksetzen</string>\n    <string name=\"reset_settings_summary\">Setzt alle Einstellungen auf ihre Standardwerte zurück</string>\n    <string name=\"yes\">Ja</string>\n    <string name=\"no\">Nein</string>\n    <string name=\"settings_category_backup_restore_title\">Sichern und Wiederherstellen</string>\n    <string name=\"auto_update_check_description\">NewPipe kann von Zeit zu Zeit automatisch nach neuen Versionen suchen und dich benachrichtigen, sobald sie verfügbar sind.\n\\nMöchtest du dies aktivieren?</string>\n    <string name=\"reset_all_settings\">Wenn du alle Einstellungen zurücksetzt, werden alle deine bevorzugten Einstellungen verworfen und die App wird neu gestartet.\n\\n\n\\nMöchtest du wirklich fortfahren?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">Sekundär</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Als temporäre YouTube-Wiedergabeliste teilen</string>\n    <string name=\"tab_bookmarks_short\">Wiedergabelisten</string>\n    <string name=\"select_a_feed_group\">Eine Feed-Gruppe auswählen</string>\n    <string name=\"feed_group_page_summary\">Kanalgruppen-Seite</string>\n    <string name=\"no_feed_group_created_yet\">Es wurde noch keine Feed-Gruppe erstellt</string>\n    <string name=\"search_with_service_name\">Suche %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Suche %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Gefällt mir</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud-Top-50-Seite entfernt</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud hat die ursprünglichen Top-50-Charts abgeschafft. Der entsprechende Tab wurde von deiner Hauptseite entfernt.</string>\n    <string name=\"short_million\">%sMio.</string>\n    <string name=\"short_billion\">%sMrd.</string>\n    <string name=\"short_thousand\">%sTsd.</string>\n    <string name=\"trending_gaming\">Gaming-Trends</string>\n    <string name=\"trending_movies\">Beliebte Filme und Shows</string>\n    <string name=\"trending_music\">Beliebte Musik</string>\n    <string name=\"trending_podcasts\">Beliebte Podcasts</string>\n    <string name=\"migration_info_7_8_title\">YouTube hat die kombinierten „beliebten Seiten“ entfernt</string>\n    <string name=\"migration_info_7_8_message\">YouTube hat die kombinierte Trending-Seite ab dem 21. Juli 2025 eingestellt. NewPipe hat die Standard-Trending-Seite durch die Trending-Livestreams ersetzt.\\n\\nDu kannst auch verschiedene Trendseiten unter „Einstellungen &gt; Inhalt &gt; Inhalt der Hauptseite“ auswählen.</string>\n    <string name=\"permission_display_over_apps_message\">Um den Pop-up-Player zu verwenden, bitte in den folgenden Android-Einstellungen %1$s auswählen und %2$s aktivieren.</string>\n    <string name=\"permission_display_over_apps_permission_name\">„Über anderen Apps einblenden“</string>\n    <string name=\"delete_file\">Datei löschen</string>\n    <string name=\"delete_entry\">Eintrag löschen</string>\n    <string name=\"entry_deleted\">Eintrag gelöscht</string>\n    <string name=\"account_terminated_service_provides_reason\">Konto geschlossen\\n\\n%1$s gibt folgenden Grund an: %2$s</string>\n    <string name=\"player_http_403\">HTTP-Fehler 403 vom Server während der Wiedergabe erhalten, wahrscheinlich verursacht durch Ablauf der Streaming-URL oder eine IP-Sperre</string>\n    <string name=\"player_http_invalid_status\">HTTP-Fehler %1$s vom Server während der Wiedergabe erhalten</string>\n    <string name=\"youtube_player_http_403\">HTTP-Fehler 403 vom Server während der Wiedergabe erhalten, wahrscheinlich verursacht durch eine IP-Sperre oder Probleme beim Entschlüsseln der Streaming-URL</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s hat die Datenbereitstellung verweigert und verlangt eine Anmeldung, um zu bestätigen, dass es sich bei dem Anfragenden nicht um einen Bot handelt.\\n\\nDeine IP-Adresse wurde möglicherweise vorübergehend von %1$s gesperrt. Du kannst einige Zeit warten oder zu einer anderen IP-Adresse wechseln (z. B. durch Ein- und Ausschalten eines VPNs oder durch Wechseln von WLAN zu mobilen Daten).</string>\n    <string name=\"unsupported_content_in_country\">Dieser Inhalt ist für das aktuell ausgewählte Land des Inhalts nicht verfügbar.\\n\\nÄndere die Auswahl unter „Einstellungen &gt; Inhalt &gt; Bevorzugtes Land des Inhalts“.</string>\n    <string name=\"kao_dialog_warning\">Im August 2025 gab Google bekannt, dass ab September 2026 für die Installation von Apps eine Entwicklerüberprüfung für alle Android-Apps auf zertifizierten Geräten erforderlich sein wird, einschließlich derjenigen, die außerhalb des Play Store installiert wurden. Da die Entwickler von NewPipe dieser Forderung nicht nachkommen, wird NewPipe nach diesem Zeitpunkt auf zertifizierten Android-Geräten nicht mehr funktionieren.</string>\n    <string name=\"kao_dialog_more_info\">Details</string>\n    <string name=\"kao_solution\">Lösung</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-dum/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Gepubliceerd op %1$s</string>\n    <string name=\"no_player_found\">Geen stream player gevonden. Installeer VLC\\?</string>\n    <string name=\"no_player_found_toast\">Geen stream player gevonden (je kunt VLC installeren om het af te spelen).</string>\n    <string name=\"install\">Installeer</string>\n    <string name=\"cancel\">Annuleren</string>\n    <string name=\"open_in_browser\">Openen in browser</string>\n    <string name=\"download\">Download</string>\n    <string name=\"controls_download_desc\">Download stream bestand</string>\n    <string name=\"search\">Zoeken</string>\n    <string name=\"settings\">Instellingen</string>\n    <string name=\"use_external_video_player_summary\">Verwijderd audio bij sommige resoluties</string>\n    <string name=\"use_external_audio_player_title\">Gebruik externe audio player</string>\n    <string name=\"subscribe_button_title\">Abonneren</string>\n    <string name=\"subscribed_button_title\">Geabonneerd</string>\n    <string name=\"unsubscribe\">Deabonneren</string>\n    <string name=\"did_you_mean\">Bedoel je \\\"%1$s\\\"\\?</string>\n    <string name=\"subscription_update_failed\">Kon abonnement niet bijwerken</string>\n    <string name=\"show_info\">Toon informatie</string>\n    <string name=\"tab_subscriptions\">Abonnementen</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"mark_as_watched\">Markeer als bekeken</string>\n    <string name=\"open_in_popup_mode\">Openen in popup mode</string>\n    <string name=\"open_with\">Openen met</string>\n    <string name=\"share\">Delen</string>\n    <string name=\"search_showing_result_for\">Toont resultaten voor: %s</string>\n    <string name=\"share_dialog_title\">Delen met</string>\n    <string name=\"main_bg_subtitle\">Tap op de vergrootglas om te beginnen.</string>\n    <string name=\"use_external_video_player_title\">Gebruik een externe video player</string>\n    <string name=\"channel_unsubscribed\">Kanaal gedeabonneerd</string>\n    <string name=\"subscription_change_failed\">Kon abonnement niet aanpassen</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-el/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Δημοσιεύθηκε στις %1$s</string>\n    <string name=\"no_player_found\">Δε βρέθηκε αναπαραγωγός ροής δεδομένων. Εγκατάσταση του VLC;</string>\n    <string name=\"install\">Εγκατάσταση</string>\n    <string name=\"cancel\">Άκυρο</string>\n    <string name=\"open_in_browser\">Άνοιγμα σε πρόγραμμα περιήγησης</string>\n    <string name=\"share\">Κοινοποίηση</string>\n    <string name=\"download\">Λήψη</string>\n    <string name=\"search\">Αναζήτηση</string>\n    <string name=\"settings\">Ρυθμίσεις</string>\n    <string name=\"did_you_mean\">Μήπως εννοείτε \\\"%1$s\\\";</string>\n    <string name=\"share_dialog_title\">Κοινοποίηση με</string>\n    <string name=\"use_external_video_player_title\">Χρήση εξωτερικής εφαρμογής αναπαραγωγής βίντεο</string>\n    <string name=\"use_external_audio_player_title\">Χρήση εξωτερικής συσκευής αναπαραγωγής ήχου</string>\n    <string name=\"download_path_title\">Φάκελος λήψης βίντεο</string>\n    <string name=\"download_path_summary\">Τα ληφθέντα αρχεία βίντεο αποθηκεύονται εδώ</string>\n    <string name=\"download_path_dialog_title\">Επιλέξτε φάκελο λήψης για αρχεία βίντεο</string>\n    <string name=\"download_path_audio_title\">Φάκελος λήψης ήχου</string>\n    <string name=\"download_path_audio_summary\">Τα ληφθέντα αρχεία ήχου αποθηκεύονται εδώ</string>\n    <string name=\"download_path_audio_dialog_title\">Επιλέξτε φάκελο λήψης για αρχεία ήχου</string>\n    <string name=\"default_resolution_title\">Προεπιλεγμένη ανάλυση</string>\n    <string name=\"play_with_kodi_title\">Αναπαραγωγή με το Kodi</string>\n    <string name=\"kore_not_found\">Εγκατάσταση της εφαρμογής Kore;</string>\n    <string name=\"show_play_with_kodi_title\">Εμφάνιση της επιλογής «Αναπαραγωγή με το Kodi»</string>\n    <string name=\"show_play_with_kodi_summary\">Προβολή μιας επιλογής για αναπαραγωγή με το Kodi media center</string>\n    <string name=\"play_audio\">Ήχος</string>\n    <string name=\"default_audio_format_title\">Προεπιλεγμένη μορφή ήχου</string>\n    <string name=\"theme_title\">Θέμα</string>\n    <string name=\"dark_theme_title\">Σκοτεινό</string>\n    <string name=\"light_theme_title\">Φωτεινό</string>\n    <string name=\"download_dialog_title\">Λήψη</string>\n    <string name=\"show_next_and_similar_title\">Εμφάνιση «Επόμενου» και «Σχετικών» βίντεο</string>\n    <string name=\"unsupported_url\">Δεν υποστηρίζεται η διεύθυνση URL</string>\n    <string name=\"content_language_title\">Προεπιλεγμένη γλώσσα περιεχομένου</string>\n    <string name=\"settings_category_video_audio_title\">Βίντεο και ήχος</string>\n    <string name=\"settings_category_appearance_title\">Εμφάνιση</string>\n    <string name=\"background_player_playing_toast\">Αναπαραγωγή στο παρασκήνιο</string>\n    <string name=\"network_error\">Σφάλμα δικτύου</string>\n    <string name=\"detail_thumbnail_view_description\">Αναπαραγωγή βίντεο, διάρκεια:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Μικρογραφία εικόνας προφίλ του χρήστη</string>\n    <string name=\"detail_likes_img_view_description\">Like</string>\n    <string name=\"detail_dislikes_img_view_description\">Dislike</string>\n    <string name=\"open_in_popup_mode\">Άνοιγμα σε αναδυόμενο παράθυρο</string>\n    <string name=\"subscribe_button_title\">Εγγραφή</string>\n    <string name=\"subscribed_button_title\">Εγγεγραμμένος</string>\n    <string name=\"show_higher_resolutions_summary\">Μόνο μερικές συσκευές μπορούν να παίξουν 2K/4K βίντεο</string>\n    <string name=\"black_theme_title\">Μαύρο</string>\n    <string name=\"show_search_suggestions_title\">Προτάσεις αναζήτησης</string>\n    <string name=\"enable_search_history_title\">Ιστορικό αναζήτησης</string>\n    <string name=\"downloads\">Λήψεις</string>\n    <string name=\"downloads_title\">Λήψεις</string>\n    <string name=\"all\">Όλα</string>\n    <string name=\"general_error\">Σφάλμα</string>\n    <string name=\"error_snackbar_action\">Αναφορά</string>\n    <string name=\"what_device_headline\">Πληροφορίες:</string>\n    <string name=\"what_happened_headline\">Τι συνέβη:</string>\n    <string name=\"your_comment\">Το σχόλιό σας (στα Αγγλικά):</string>\n    <string name=\"error_details_headline\">Λεπτομέρειες:</string>\n    <string name=\"video\">Βίντεο</string>\n    <string name=\"audio\">Ήχος</string>\n    <string name=\"pause\">Παύση</string>\n    <string name=\"delete\">Διαγραφή</string>\n    <string name=\"msg_error\">Σφάλμα</string>\n    <string name=\"msg_running_detail\">Πατήστε για λεπτομέρειες</string>\n    <string name=\"settings_category_downloads_title\">Λήψη</string>\n    <string name=\"charset_letters_and_digits\">Γράμματα και ψηφία</string>\n    <string name=\"tab_licenses\">Άδειες</string>\n    <string name=\"title_activity_history\">Ιστορικό</string>\n    <string name=\"action_history\">Ιστορικό</string>\n    <string name=\"show_info\">Εμφάνιση πληροφοριών</string>\n    <string name=\"main_bg_subtitle\">Πατήστε το μεγεθυντικό φακό για να ξεκινήσετε.</string>\n    <string name=\"no_player_found_toast\">Δε βρέθηκε αναπαραγωγός ροής δεδομένων (μπορείτε να εγκαταστήσετε το VLC για να κάνετε αναπαραγωγή).</string>\n    <string name=\"controls_download_desc\">Λήψη του αρχείου ροής</string>\n    <string name=\"use_external_video_player_summary\">Αφαιρείται ο ήχος από κάποιες αναλύσεις</string>\n    <string name=\"channel_unsubscribed\">Το κανάλι διαγράφηκε</string>\n    <string name=\"subscription_change_failed\">Αδύνατη η αλλαγή της εγγραφής</string>\n    <string name=\"subscription_update_failed\">Αδύνατη η ενημέρωση της εγγραφής</string>\n    <string name=\"tab_subscriptions\">Συνδρομές</string>\n    <string name=\"tab_bookmarks\">Λίστες αναπαραγωγής με σελιδοδείκτες</string>\n    <string name=\"fragment_feed_title\">Τι νέο υπάρχει</string>\n    <string name=\"controls_background_title\">Στο παρασκήνιο</string>\n    <string name=\"controls_popup_title\">Αναδυόμενο παράθυρο</string>\n    <string name=\"controls_add_to_playlist_title\">Προσθήκη σε</string>\n    <string name=\"default_popup_resolution_title\">Προεπιλεγμένη ανάλυση αναδυόμενου παραθύρου</string>\n    <string name=\"show_higher_resolutions_title\">Εμφάνιση υψηλότερων αναλύσεων</string>\n    <string name=\"default_video_format_title\">Προεπιλεγμένη μορφή βίντεο</string>\n    <string name=\"popup_remember_size_pos_title\">Ενθύμηση ιδιοτήτων αναδυόμενου παραθύρου</string>\n    <string name=\"popup_remember_size_pos_summary\">Ενθύμηση του τελευταίου μεγέθους και θέσης του παραθύρου</string>\n    <string name=\"use_inexact_seek_title\">Χρήση γρήγορης ανακριβούς αναζήτησης</string>\n    <string name=\"use_inexact_seek_summary\">Η μην ακριβής αναζήτηση επιτρέπει στην εφαρμογή να αναζητεί θέσεις στο βίντεο γρηγορότερα με μειωμένη ακρίβεια. Δε λειτουργεί για διαστήματα των 5, 15 ή 25 δευτερολέπτων</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Εκκαθαρίστηκε η προσωρινή μνήμη εικόνων</string>\n    <string name=\"metadata_cache_wipe_title\">Εκκαθάριση προσωρινά αποθηκευμένων μεταδεδομένων</string>\n    <string name=\"metadata_cache_wipe_summary\">Αφαίρεση όλων των προσωρινά αποθηκευμένων δεδομένων ιστοσελίδων</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Η προσωρινή μνήμη μεταδεδομένων εκκαθαρίστηκε</string>\n    <string name=\"auto_queue_title\">Αυτόματη προσθήκη της επόμενης ροής στην ουρά</string>\n    <string name=\"auto_queue_summary\">Συνέχεια της τρέχουσας (μη επαναλαμβανόμενης) ουράς μετά τη λήξη της, με την προσθήκη μιας σχετικής ροής</string>\n    <string name=\"show_search_suggestions_summary\">Επιλογή των προτάσεων που εμφανίζονται κατά την αναζήτηση</string>\n    <string name=\"enable_search_history_summary\">Αποθήκευση αναζητήσεων στη συσκευή</string>\n    <string name=\"enable_watch_history_title\">Προβολή Ιστορικού</string>\n    <string name=\"enable_watch_history_summary\">Κρατήστε ιστορικό των αναπαραχθέντων βίντεο</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Ανάκτηση αναπαραγωγής</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Συνέχιση της αναπαραγωγής έπειτα από διακοπές (π.χ. κλήσεις)</string>\n    <string name=\"show_hold_to_append_title\">Εμφάνιση επεξήγησης του «Πιέστε παρατεταμένα για προσθήκη στην ουρά»</string>\n    <string name=\"show_hold_to_append_summary\">Εμφάνιση συμβουλής κατά το πάτημα του φόντου ή του αναδυόμενου κουμπιού στο βίντεο «Λεπτομέρειες:»</string>\n    <string name=\"default_content_country_title\">Προεπιλεγμένη χώρα περιεχομένου</string>\n    <string name=\"settings_category_player_title\">Αναπαραγωγός</string>\n    <string name=\"settings_category_player_behavior_title\">Συμπεριφορά</string>\n    <string name=\"settings_category_history_title\">Ιστορικό και προσωρινή μνήμη</string>\n    <string name=\"settings_category_debug_title\">Αποσφαλμάτωση</string>\n    <string name=\"popup_playing_toast\">Αναπαραγωγή σε αναδυόμενο παράθυρο</string>\n    <string name=\"content\">Περιεχόμενο</string>\n    <string name=\"show_age_restricted_content_title\">Εμφάνιση περιεχομένου περιορισμένης ηλικίας</string>\n    <string name=\"duration_live\">Ζωντανά</string>\n    <string name=\"error_report_title\">Αναφορά σφαλμάτων</string>\n    <string name=\"channels\">Κανάλια</string>\n    <string name=\"playlists\">Λίστες αναπαραγωγής</string>\n    <string name=\"tracks\">Κομμάτια</string>\n    <string name=\"users\">Χρήστες</string>\n    <string name=\"disabled\">Απενεργοποιημένο</string>\n    <string name=\"clear\">Εκκαθάριση</string>\n    <string name=\"best_resolution\">Βέλτιστη ανάλυση</string>\n    <string name=\"undo\">Αναίρεση</string>\n    <string name=\"play_all\">Αναπαραγωγή όλων</string>\n    <string name=\"always\">Πάντα</string>\n    <string name=\"just_once\">Μόνο μία φορά</string>\n    <string name=\"file\">Αρχείο</string>\n    <string name=\"notification_channel_name\">Ειδοποίηση NewPipe</string>\n    <string name=\"notification_channel_description\">Ειδοποιήσεις του αναπαραγωγέα του NewPipe</string>\n    <string name=\"unknown_content\">[Άγνωστο]</string>\n    <string name=\"switch_to_background\">Αλλαγή σε Παρασκήνιο</string>\n    <string name=\"switch_to_popup\">Αλλαγή σε Αναδυόμενο Παράθυρο</string>\n    <string name=\"switch_to_main\">Αλλαγή σε Κύριο</string>\n    <string name=\"import_data_title\">Εισαγωγή βάσης δεδομένων</string>\n    <string name=\"export_data_title\">Εξαγωγή βάσης δεδομένων</string>\n    <string name=\"import_data_summary\">Παρακάμπτει το τρέχον ιστορικό, εγγραφές, λίστες αναπαραγωγής και (προαιρετικά) τις ρυθμίσεις σας</string>\n    <string name=\"export_data_summary\">Εξαγωγή ιστορικού, εγγραφών, λιστών αναπαραγωγής και ρυθμίσεων</string>\n    <string name=\"clear_views_history_title\">Εκκαθάριση ιστορικού προβολής</string>\n    <string name=\"clear_views_history_summary\">Διαγράφει το ιστορικό των αναπαραχθέντων ροών και των θέσεων αναπαραγωγής</string>\n    <string name=\"delete_view_history_alert\">Διαγραφή ολόκληρου του ιστορικού προβολής;</string>\n    <string name=\"watch_history_deleted\">Το στορικό προβολής διαγράφηκε</string>\n    <string name=\"clear_search_history_title\">Διαγραφή ιστορικού αναζητήσεων</string>\n    <string name=\"clear_search_history_summary\">Διαγράφει το ιστορικό αναζητήσεών σας</string>\n    <string name=\"delete_search_history_alert\">Διαγραφή ολόκληρου του ιστορικού αναζητήσεων;</string>\n    <string name=\"search_history_deleted\">Το ιστορικό αναζητήσεων διαγράφηκε</string>\n    <string name=\"could_not_load_thumbnails\">Δεν ήταν δυνατή η φόρτωση όλων των εικονιδίων</string>\n    <string name=\"parsing_error\">Δεν ήταν δυνατή η ανάλυση του ιστοτόπου</string>\n    <string name=\"content_not_available\">Το περιεχόμενο δεν είναι διαθέσιμο</string>\n    <string name=\"could_not_setup_download_menu\">Δεν ήταν δυνατή η ρύθμιση του μενού λήψεων</string>\n    <string name=\"app_ui_crash\">Η εφαρμογή κατέρρευσε</string>\n    <string name=\"player_stream_failure\">Δεν ήταν δυνατή η αναπαραγωγή αυτής της ροής</string>\n    <string name=\"player_unrecoverable_failure\">Συνέβη ένα μη ανακτήσιμο σφάλμα στη συσκευή αναπαραγωγής</string>\n    <string name=\"player_recoverable_failure\">Ανάκτηση από σφάλμα της συσκευής αναπαραγωγής</string>\n    <string name=\"external_player_unsupported_link_type\">Οι εξωτερικές συσκευές αναπαραγωγής δεν υποστηρίζουν αυτού του είδους συνδέσμους</string>\n    <string name=\"video_streams_empty\">Δε βρέθηκαν ροές βίντεο</string>\n    <string name=\"audio_streams_empty\">Δε βρέθηκαν ροές ήχου</string>\n    <string name=\"invalid_directory\">Δεν υπάρχει αυτός ο φάκελος</string>\n    <string name=\"invalid_source\">Δεν υπάρχει το αρχείο/πηγή περιεχομένου</string>\n    <string name=\"invalid_file\">Το αρχείο δεν υπάρχει ή δεν υπάρχει επαρκής εξουσιοδότηση ανάγνωσης ή εγγραφής σε αυτό</string>\n    <string name=\"file_name_empty_error\">Το όνομα αρχείου δεν μπορεί να είναι κενό</string>\n    <string name=\"error_occurred_detail\">Προέκυψε ένα σφάλμα: %1$s</string>\n    <string name=\"no_streams_available_download\">Δεν υπάρχουν διαθέσιμες ροές για λήψη</string>\n    <string name=\"sorry_string\">Λυπούμαστε, αυτό δεν έπρεπε να έχει συμβεί.</string>\n    <string name=\"error_report_button_text\">Αναφορά μέσω ηλεκτρονικού ταχυδρομείου</string>\n    <string name=\"error_snackbar_message\">Συγγνώμη, κάτι πήγε στραβά.</string>\n    <string name=\"info_labels\">Τι:\\nΑίτημα:\\nΓλώσσα περιεχομένου:\\nΧώρα περιεχομένου:\\nΓλώσσα εφαρμογής:\\nΥπηρεσία:\\nΏρα GMT:\\nΠακέτο:\\nΈκδοση:\\nΈκδοση λειτουργικού συστήματος:</string>\n    <string name=\"search_no_results\">Κανένα αποτέλεσμα</string>\n    <string name=\"empty_list_subtitle\">Δεν υπάρχει τίποτα εδώ</string>\n    <string name=\"detail_drag_description\">Σύρετε για ταξινόμηση</string>\n    <string name=\"retry\">Προσπάθεια εκ νέου</string>\n    <string name=\"no_subscribers\">Κανένας συνδρομητής</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s συνδρομητής</item>\n        <item quantity=\"other\">%s συνδρομητές</item>\n    </plurals>\n    <string name=\"no_views\">Καμία προβολή</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s προβολή</item>\n        <item quantity=\"other\">%s προβολές</item>\n    </plurals>\n    <string name=\"no_videos\">Κανένα βίντεο</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s βίντεο</item>\n        <item quantity=\"other\">%s βίντεο(πολλά)</item>\n    </plurals>\n    <string name=\"start\">Εκκίνηση</string>\n    <string name=\"create\">Δημιουργία</string>\n    <string name=\"checksum\">Άθροισμα ελέγχου</string>\n    <string name=\"dismiss\">Αγνόηση</string>\n    <string name=\"rename\">Μετονομασία</string>\n    <string name=\"ok\">Εντάξει</string>\n    <string name=\"msg_name\">Όνομα αρχείου</string>\n    <string name=\"msg_threads\">Νήματα</string>\n    <string name=\"msg_running\">Λήψη NewPipe</string>\n    <string name=\"msg_wait\">Παρακαλώ περιμένετε…</string>\n    <string name=\"msg_copied\">Αντιγράφηκε στο πρόχειρο</string>\n    <string name=\"no_available_dir\">Παρακαλώ ορίστε έναν φάκελο λήψεων αργότερα στις ρυθμίσεις</string>\n    <string name=\"msg_popup_permission\">Αυτή η άδεια είναι απαραίτητη για\n\\nτο άνοιγμα αναδυόμενων παραθύρων</string>\n    <string name=\"one_item_deleted\">1 αντικείμενο διαγράφηκε.</string>\n    <string name=\"title_activity_recaptcha\">Δοκιμασία reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Ζητήθηκε δοκιμασία reCAPTCHA</string>\n    <string name=\"settings_file_charset_title\">Επιτρεπόμενοι χαρακτήρες σε ονόματα αρχείων</string>\n    <string name=\"settings_file_replacement_character_summary\">Οι μη έγκυροι χαρακτήρες αντικαθίστανται με αυτήν την τιμή</string>\n    <string name=\"settings_file_replacement_character_title\">Αντικαταστάτης χαρακτήρας</string>\n    <string name=\"charset_most_special_characters\">Οι περισσότεροι ειδικοί χαρακτήρες</string>\n    <string name=\"title_activity_about\">Σχετικά με το NewPipe</string>\n    <string name=\"title_licenses\">Άδειες Τρίτων</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s από %2$s υπό %3$s</string>\n    <string name=\"tab_about\">Πληροφορίες &amp; Συχνές Ερωτήσεις</string>\n    <string name=\"app_description\">Ανοιχτού κώδικα, ελαφριά εφαρμογή Android, για την αναπαραγωγή πολυμέσων από το διαδίκτυο.</string>\n    <string name=\"contribution_title\">Συνεισφέρετε</string>\n    <string name=\"contribution_encouragement\">Αν έχετε ιδέες για μετάφραση, αλλαγή σχεδιασμού, εκκαθάριση ή ριζικές αλλαγές κώδικα της εφαρμογής, η βοήθεια σας είναι πάντα ευπρόσδεκτη. Όσο περισσότερη έχουμε, τόσο καλύτεροι γινόμαστε!</string>\n    <string name=\"view_on_github\">Δείτε το στο GitHub</string>\n    <string name=\"donation_title\">Δωρεά</string>\n    <string name=\"donation_encouragement\">Το NewPipe αναπτύσσεται από εθελοντές που δαπανούν τον ελεύθερο χρόνο τους για να σας προσφέρουν τη βέλτιστη δυνατή εμπειρία χρήστη. Ανταποδώστε το, για να βοηθήσετε τους προγραμματιστές του NewPipe να το κάνουν ακόμα καλύτερο, όσο απολαμβάνουν ένα φλιτζάνι καφέ.</string>\n    <string name=\"give_back\">Προσφέρετε</string>\n    <string name=\"website_title\">Ιστότοπος</string>\n    <string name=\"website_encouragement\">Επισκευτείτε τον ιστότοπο του NewPipe για περισσότερες πληροφορίες και νέα.</string>\n    <string name=\"privacy_policy_title\">Πολιτική ιδιωτικού απόρρητου του NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">Το NewPipe παίρνει πολύ σοβαρά την ιδιωτικότητα σας. Έτσι, η εφαρμογή αυτή δεν συλλέγει δεδομένα από εσάς χωρίς τη συγκατάθεσή σας.\n\\nΗ πολιτική ιδιωτικού απόρρητου του NewPipe εξηγεί λεπτομερώς ποια δεδομένα αποστέλλονται και αποθηκεύονται όταν επιλέγετε να στείλετε μια αναφορά σφαλμάτων.</string>\n    <string name=\"read_privacy_policy\">Ανάγνωση της πολιτικής ιδιωτικού απόρρητου</string>\n    <string name=\"app_license_title\">Η άδεια του NewPipe</string>\n    <string name=\"app_license\">Το NewPipe είναι copylelft ελεύθερο λογισμικό: Μπορείτε να το χρησιμοποιήσετε, να το μελετήσετε, να το μοιραστείτε και να το βελτιώσετε κατά βούληση. Ειδικότερα, μπορείτε να το αναδιανείμετε ή/και να το τροποποιήσετε υπό την άδεια GNU General Public Licence όπως αυτή εκδόθηκε από το Free Software Foundation, είτε υπό την έκδοση 3 της άδειας, είτε (προαιρετικά) υπό οποιαδήποτε μεταγενέστερη άδεια.</string>\n    <string name=\"read_full_license\">Ανάγνωση της άδειας</string>\n    <string name=\"delete_item_search_history\">Θέλετε να σβήσετε αυτό το αντικείμενο από το ιστορικό αναζήτησης;</string>\n    <string name=\"title_last_played\">Τελευταία αναπαραγωγή</string>\n    <string name=\"title_most_played\">Αναπαράχθηκε περισσότερο</string>\n    <string name=\"main_page_content\">Περιεχόμενο της κεντρικής σελίδας</string>\n    <string name=\"blank_page_summary\">Κενή σελίδα</string>\n    <string name=\"kiosk_page_summary\">Σελίδα περιπτέρου</string>\n    <string name=\"channel_page_summary\">Σελίδα καναλιών</string>\n    <string name=\"select_a_channel\">Επιλέξτε ένα κανάλι</string>\n    <string name=\"no_channel_subscribed_yet\">Δεν έχει γίνει εγγραφή σε κάποιο κανάλι ακόμα</string>\n    <string name=\"select_a_kiosk\">Επιλέξτε ένα περίπτερο</string>\n    <string name=\"export_complete_toast\">Η εξαγωγή ολοκληρώθηκε</string>\n    <string name=\"import_complete_toast\">Η εισαγωγή ολοκληρώθηκε</string>\n    <string name=\"no_valid_zip_file\">Μη έγκυρο αρχείο ZIP</string>\n    <string name=\"could_not_import_all_files\">Προσοχή: Δεν ήταν δυνατή η εισαγωγή όλων των αρχείων.</string>\n    <string name=\"override_current_data\">Αυτό θα παρακάμψει τις τρέχουσες ρυθμίσεις σας.</string>\n    <string name=\"import_settings\">Θέλετε επίσης να εισάγετε ρυθμίσεις;</string>\n    <string name=\"play_queue_remove\">Αφαίρεση</string>\n    <string name=\"play_queue_stream_detail\">Λεπτομέρειες</string>\n    <string name=\"play_queue_audio_settings\">Ρυθμίσεις ήχου</string>\n    <string name=\"hold_to_append\">Πιέστε παρατεταμένα για προσθήκη στην ουρά</string>\n    <string name=\"start_here_on_background\">Εκκίνηση αναπαραγωγής στο παρασκήνιο</string>\n    <string name=\"start_here_on_popup\">Εκκίνηση αναπαραγωγής σε ένα αναδυόμενο παράθυρο</string>\n    <string name=\"drawer_open\">Άνοιγμα συρταριού</string>\n    <string name=\"drawer_close\">Κλείσιμο συρταριού</string>\n    <string name=\"top_50\">Τοπ 50</string>\n    <string name=\"new_and_hot\">Καινούρια και δημοφιλή</string>\n    <string name=\"preferred_open_action_settings_title\">Προτιμώμενη ενέργεια κοινοποίησης</string>\n    <string name=\"preferred_open_action_settings_summary\">Προεπιλεγμένη ενέργεια κοινοποίησης περιεχομένου — %s</string>\n    <string name=\"video_player\">Συσκευή αναπαραγωγής βίντεο</string>\n    <string name=\"background_player\">Αναπαραγωγή παρασκηνίου</string>\n    <string name=\"popup_player\">Αναπαραγωγή σε αναδυόμενο παράθυρο</string>\n    <string name=\"always_ask_open_action\">Πάντα ερώτηση</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Γίνεται λήψη πληροφοριών…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Γίνεται φόρτωση του ζητούμενου περιεχομένου</string>\n    <string name=\"create_playlist\">Νέα λίστα αναπαραγωγής</string>\n    <string name=\"rename_playlist\">Μετονομασία</string>\n    <string name=\"name\">Όνομα</string>\n    <string name=\"add_to_playlist\">Προσθήκη σε λίστα αναπαραγωγής</string>\n    <string name=\"set_as_playlist_thumbnail\">Ορισμός ως μικρογραφία λίστας αναπαραγωγής</string>\n    <string name=\"bookmark_playlist\">Προσθήκη σελιδοδείκτη στη λίστα</string>\n    <string name=\"unbookmark_playlist\">Διαγραφή σελιδοδείκτη</string>\n    <string name=\"delete_playlist_prompt\">Διαγραφή αυτής της λίστας αναπαραγωγής;</string>\n    <string name=\"playlist_creation_success\">Η λίστα αναπαραγωγής δημιουργήθηκε</string>\n    <string name=\"playlist_add_stream_success\">Προστέθηκε στη λίστα αναπαραγωγής</string>\n    <string name=\"playlist_thumbnail_change_success\">Η μικρογραφία της λίστας αναπαραγωγής άλλαξε.</string>\n    <string name=\"caption_none\">Χωρίς υπότιτλους</string>\n    <string name=\"resize_fit\">Προσαρμογή</string>\n    <string name=\"resize_fill\">Γέμισμα</string>\n    <string name=\"resize_zoom\">Μεγέθυνση</string>\n    <string name=\"caption_auto_generated\">Αυτόματοι</string>\n    <string name=\"caption_setting_title\">Υπότιτλοι</string>\n    <string name=\"caption_setting_description\">Τροποποίηση του μεγέθους και του φόντου των υπότιτλων. Απαιτεί επανεκκίνηση της εφαρμογής</string>\n    <string name=\"enable_leak_canary_summary\">Η παρακολούθηση των διαρροών μνήμης μπορεί να προκαλέσει την διακοπή της εφαρμογής</string>\n    <string name=\"enable_disposed_exceptions_summary\">Υποχρεωτική αναφορά μη παραδοτέων Rx εξαιρέσεων έξω από το κομμάτι ή τον κύκλο δραστηριότητας μετά από απόρριψη</string>\n    <string name=\"import_title\">Εισαγωγή</string>\n    <string name=\"import_from\">Εισαγωγή από</string>\n    <string name=\"export_to\">Εξαγωγή σε</string>\n    <string name=\"import_ongoing\">Γίνεται εισαγωγή…</string>\n    <string name=\"export_ongoing\">Γίνεται εξαγωγή…</string>\n    <string name=\"import_file_title\">Εισαγωγή αρχείου</string>\n    <string name=\"previous_export\">Προηγούμενη εξαγωγή</string>\n    <string name=\"subscriptions_import_unsuccessful\">Δεν ήταν δυνατή η εισαγωγή των εγγραφών</string>\n    <string name=\"subscriptions_export_unsuccessful\">Δεν ήταν δυνατή η εξαγωγή των εγγραφών</string>\n    <string name=\"import_youtube_instructions\">Κάντε εισαγωγή των εγγραφών σας στο YouTube από το Google takeout:\n\\n\n\\n1. Πλοηγηθείτε στο: %1$s\n\\n2. Εισέλθετε στο λογαριασμό σας, όταν σας ζητηθεί.\n\\n3. Πατήστε το «Περιλαμβάνονται όλα τα δεδομένα του YouTube», στη συνέχεια «Κατάργηση επιλογής όλων» και επιλέξτε μόνο το «συνδρομές» και «ΟΚ».\n\\n4. Πατήστε «Επόμενο βήμα» και μετά «Δημιουργία εξαγωγής».\n\\n5. Πατήστε «Λήψη» όταν εμφανιστεί.\n\\n6. Πατήστε το ΕΙΣΑΓΩΓΗ ΑΡΧΕΙΟΥ και επιλέξτε το ληφθέν αρχείο zip.\n\\n7. Αν η εισαγωγή από το zip αποτύχει, εξάγετε το αρχείο .csv (συνήθως βρίσκεται στο \\\"YouTube και YouTube Music/subscriptions/subscriptions.csv\\\"), πατήστε το ΕΙΣΑΓΩΓΗ ΑΡΧΕΙΟΥ και επιλέξτε το ληφθέν αρχείο csv</string>\n    <string name=\"import_soundcloud_instructions\">Για να εισάγετε τον λογαριασμό SoundCloud σας, πληκτρολογήστε τον σύνδεσμο ή το ID σας:\n\\n\n\\n1. Ενεργοποιήστε τη λειτουργία «Desktop mode» στον φυλλομετρητή σας (καθώς η ιστοσελίδα δεν είναι διαθέσιμη για κινητά)\n\\n2. Πλοηθηθείτε στο %1$s\n\\n3. Εισέλθετε στο λογαριασμό σας, όταν σας ζητηθεί\n\\n4. Αντιγράψτε τον σύνδεσμο του λογαριασμού στον οποίο ανακατευθυνθήκατε.</string>\n    <string name=\"import_network_expensive_warning\">Αυτή η διαδικασία μπορεί να χρησιμοποιήσει μεγάλο όγκο δεδομένων.\n\\n\n\\nΕπιθυμείτε να συνεχίσετε;</string>\n    <string name=\"playback_speed_control\">Έλεγχος ταχύτητας αναπαραγωγής</string>\n    <string name=\"playback_tempo\">Τέμπο</string>\n    <string name=\"playback_pitch\">Τόνος</string>\n    <string name=\"minimize_on_exit_summary\">Ενέργεια κατά τη μετάβαση σε άλλη εφαρμογή — %s</string>\n    <string name=\"trending\">Δημοφιλή</string>\n    <string name=\"enable_disposed_exceptions_title\">Αναφορά σφαλμάτων εκτός κύκλου ζωής</string>\n    <string name=\"import_soundcloud_instructions_hint\">Το όνομα χρήστη σας, soundcloud.com/όνομαχρήστη</string>\n    <string name=\"unhook_checkbox\">Απαγκίστρωση (μπορεί να προκαλέσει παραμόρφωση)</string>\n    <string name=\"skip_silence_checkbox\">Γρήγορη αναπαραγωγή κατά τη διάρκεια της σίγασης</string>\n    <string name=\"playback_step\">Βήμα</string>\n    <string name=\"playback_reset\">Επαναφορά</string>\n    <string name=\"start_accept_privacy_policy\">Προς συμμόρφωση με τον Ευρωπαϊκό Γενικό Κανονισμό για την Προστασία Δεδομένων (GDPR), σας εφιστούμε την προσοχή στην πολιτική προστασίας προσωπικών δεδομένων του NewPipe. Παραλούμε, διαβάστε την προσεκτικά.\n\\nΘα πρέπει να την αποδεχτείτε προκειμένου να μας αποστείλετε την αναφορά σφάλματος.</string>\n    <string name=\"accept\">Αποδοχή</string>\n    <string name=\"decline\">Απόρριψη</string>\n    <string name=\"limit_data_usage_none_description\">Χωρίς όριο</string>\n    <string name=\"limit_mobile_data_usage_title\">Περιορισμός της ανάλυσης όταν γίνεται χρήση δεδομένων</string>\n    <string name=\"minimize_on_exit_title\">Ελαχιστοποίηση κατά την εναλλαγή εφαρμογών</string>\n    <string name=\"minimize_on_exit_none_description\">Καμία</string>\n    <string name=\"minimize_on_exit_background_description\">Ελαχιστοποίηση στο παρασκήνιο</string>\n    <string name=\"minimize_on_exit_popup_description\">Ελαχιστοποίηση σε αναδυόμενο παράθυρο</string>\n    <string name=\"unsubscribe\">Απεγγραφή</string>\n    <string name=\"tab_choose\">Επιλογή Καρτέλας</string>\n    <string name=\"settings_category_updates_title\">Ενημερώσεις</string>\n    <string name=\"events\">Συμβάντα</string>\n    <string name=\"file_deleted\">Το αρχείο διαγράφηκε</string>\n    <string name=\"app_update_notification_channel_name\">Ειδοποίηση ενημέρωσης εφαρμογής</string>\n    <string name=\"app_update_notification_channel_description\">Ειδοποίηση για νεότερη έκδοση του NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Εξωτερική μνήμη αποθήκευσης μη διαθέσιμη</string>\n    <string name=\"download_to_sdcard_error_message\">Η αποθήκευση στην SD κάρτα δεν είναι δυνατή. Επαναφορά στην αρχική τοποθεσία λήψης;</string>\n    <string name=\"saved_tabs_invalid_json\">Δεν ήταν δυνατή η ανάγνωση των αποθηκευμένων καρτελών. Θα γίνει χρήση των προεπιλεγμένων</string>\n    <string name=\"restore_defaults\">Επαναφορά προεπιλεγμένων ρυθμίσεων</string>\n    <string name=\"restore_defaults_confirmation\">Θέλετε να επαναφέρετε τις προεπιλεγμένες ρυθμίσεις;</string>\n    <string name=\"subscribers_count_not_available\">Το πλήθος των συνδρομητών δεν είναι διαθέσιμο</string>\n    <string name=\"main_page_content_summary\">Ποιές καρτέλες θα εμφανίζονται στην αρχική σελίδα</string>\n    <string name=\"conferences\">Συνέδρια</string>\n    <string name=\"updates_setting_title\">Ενημερώσεις</string>\n    <string name=\"updates_setting_description\">Εμφάνιση ειδοποίησης όταν μια υπάρχει μια νεότερη έκδοση</string>\n    <string name=\"list_view_mode\">Προβολή λίστας</string>\n    <string name=\"list\">Λίστα</string>\n    <string name=\"grid\">Πλέγμα</string>\n    <string name=\"auto\">Αυτόματα</string>\n    <string name=\"app_update_available_notification_title\">Μια νέα έκδοση του NewPipe είναι διαθέσιμη!</string>\n    <string name=\"missions_header_finished\">Ολοκληρώθηκε</string>\n    <string name=\"missions_header_pending\">Εκκρεμεί</string>\n    <string name=\"paused\">σε παύση</string>\n    <string name=\"queued\">σε ουρά</string>\n    <string name=\"post_processing\">σε μετεπεξεργασία</string>\n    <string name=\"enqueue\">Προσθήκη σε ουρά</string>\n    <string name=\"permission_denied\">Η ενέργεια απορρίφθηκε από το σύστημα</string>\n    <string name=\"download_failed\">Η λήψη απέτυχε</string>\n    <string name=\"generate_unique_name\">Δημιουργία μοναδικού ονόματος</string>\n    <string name=\"overwrite\">Αντικατάσταση</string>\n    <string name=\"overwrite_unrelated_warning\">Ένα αρχείο με αυτό το όνομα υπάρχει ήδη</string>\n    <string name=\"overwrite_finished_warning\">Ένα ληφθέν αρχείο με αυτό το όνομα υπάρχει ήδη</string>\n    <string name=\"download_already_running\">Υπάρχει μια λήψη σε εξέλιξη με αυτό το όνομα</string>\n    <string name=\"show_error\">Εμφάνιση σφάλματος</string>\n    <string name=\"error_path_creation\">Δεν είναι δυνατή η δημιουργία του φακέλου προορισμού</string>\n    <string name=\"error_file_creation\">Δεν είναι δυνατή η δημιουργία του αρχείου</string>\n    <string name=\"error_ssl_exception\">Δεν ήταν δυνατή η δημιουργία ασφαλούς σύνδεσης</string>\n    <string name=\"error_unknown_host\">Αδυναμία εύρεσης του εξυπηρετητή</string>\n    <string name=\"error_connect_host\">Αδυναμία σύνδεσης με τον εξυπηρετητή</string>\n    <string name=\"error_http_no_content\">Ο εξυπηρετητής δεν στέλνει δεδομένα</string>\n    <string name=\"error_http_unsupported_range\">Ο εξυπηρετητής δεν υποστηρίζει πολυνηματικές λήψεις, ξαναπροσπαθήστε με @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Δε βρέθηκε</string>\n    <string name=\"error_postprocessing_failed\">Η μετεπεξεργασία απέτυχε</string>\n    <string name=\"stop\">Διακοπή</string>\n    <string name=\"max_retry_msg\">Μέγιστος αριθμός προσπαθειών</string>\n    <string name=\"max_retry_desc\">Μέγιστος αριθμός προσπαθειών προτού γίνει ακύρωση της λήψης</string>\n    <string name=\"pause_downloads_on_mobile\">Διακοπή σε δίκτυα με ογκοχρέωση</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Χρήσιμο κατά τη μετάβαση σε δεδομένα κινητής τηλεφωνίας, αν και ορισμένες λήψεις δεν μπορούν να ανασταλούν</string>\n    <string name=\"show_comments_title\">Προβολή σχολίων</string>\n    <string name=\"show_comments_summary\">Απενεργοποίηση για διακοπή της εμφάνιση σχολίων</string>\n    <string name=\"autoplay_title\">Αυτόματη αναπαραγωγή</string>\n    <string name=\"no_comments\">Χωρίς σχόλια</string>\n    <string name=\"error_unable_to_load_comments\">Δεν ήταν δυνατή η φόρτωση σχολίων</string>\n    <string name=\"close\">Κλείσιμο</string>\n    <string name=\"enable_playback_resume_title\">Ανάκτηση αναπαραγωγής</string>\n    <string name=\"enable_playback_resume_summary\">Επαναφορά της τελευταίας θέσης αναπαραγωγής</string>\n    <string name=\"enable_playback_state_lists_title\">Θέσεις στις λίστες</string>\n    <string name=\"enable_playback_state_lists_summary\">Εμφάνιση ενδείξεων θέσης αναπαραγωγής στις λίστες</string>\n    <string name=\"settings_category_clear_data_title\">Εκκαθάριση δεδομένων</string>\n    <string name=\"watch_history_states_deleted\">Οι θέσεις αναπαραγωγής διαγράφηκαν</string>\n    <string name=\"missing_file\">Το αρχείο μετακινήθηκε ή διαγράφηκε</string>\n    <string name=\"overwrite_failed\">δεν είναι δυνατή η αντικατάσταση του αρχείου</string>\n    <string name=\"download_already_pending\">Υπάρχει μια εκκρεμής λήψη με αυτό το όνομα</string>\n    <string name=\"error_postprocessing_stopped\">Το NewPipe τερματίστηκε ενώ επεξεργάζονταν το αρχείο</string>\n    <string name=\"error_insufficient_storage_left\">Δεν υπάρχει αρκετός χώρος στη συσκευή</string>\n    <string name=\"error_progress_lost\">Η πρόοδος χάθηκε, επειδή το αρχείο διαγράφηκε</string>\n    <string name=\"error_timeout\">Λήξη χρονικού ορίου σύνδεσης</string>\n    <string name=\"confirm_prompt\">Θέλετε να διαγράψετε το ιστορικό λήψεων σας ή να διαγράψετε όλα τα αρχεία που έχετε λάβει;</string>\n    <string name=\"enable_queue_limit\">Περιορισμός ουράς λήψης</string>\n    <string name=\"enable_queue_limit_desc\">Μόνο μια λήψη θα εκτελείται κάθε φορά</string>\n    <string name=\"start_downloads\">Έναρξη λήψεων</string>\n    <string name=\"pause_downloads\">Παύση λήψεων</string>\n    <string name=\"downloads_storage_ask_title\">Ερώτηση πού να γίνει η λήψη</string>\n    <string name=\"downloads_storage_ask_summary\">Θα ερωτηθείτε πού να αποθηκεύσετε κάθε λήψη.\n\\nΕνεργοποιήστε τον επιλογέα φακέλων συστήματος (SAF), αν θέλετε να κάνετε λήψεις σε εξωτερική κάρτα μνήμης</string>\n    <string name=\"downloads_storage_use_saf_title\">Χρήση επιλογέα φακέλων συστήματος (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">Το «Πλαίσιο Πρόσβασης Αποθήκευσης» (SAF) επιτρέπει λήψεις σε μια εξωτερική κάρτα SD</string>\n    <string name=\"clear_playback_states_title\">Διαγραφή θέσεων αναπαραγωγής</string>\n    <string name=\"clear_playback_states_summary\">Διαγράφει όλες τις θέσεις αναπαραγωγής</string>\n    <string name=\"delete_playback_states_alert\">Να διαγραφούν όλες οι θέσεις αναπαραγωγής;</string>\n    <string name=\"drawer_header_description\">Εναλλαγή υπηρεσιών, επιλεγμένη αυτή τη στιγμή:</string>\n    <string name=\"no_one_watching\">Κανείς δεν παρακολουθεί</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s παρακολουθεί</item>\n        <item quantity=\"other\">%s παρακολουθούν</item>\n    </plurals>\n    <string name=\"no_one_listening\">Κανείς δεν ακούει</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s ακροατής</item>\n        <item quantity=\"other\">%s ακροατές</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">Προεπιλεγμένο περίπτερο</string>\n    <string name=\"peertube_instance_add_https_only\">Μόνο HTTPS σύνδεσμοι υποστηρίζονται</string>\n    <string name=\"local\">Τοπικά</string>\n    <string name=\"recently_added\">Προστέθηκαν πρόσφατα</string>\n    <string name=\"playlist_no_uploader\">Δημιουργήθηκε αυτόματα (δεν βρέθηκε χρήστης μεταφόρτωσης)</string>\n    <string name=\"recovering\">σε ανάκτηση</string>\n    <string name=\"error_download_resource_gone\">Δεν είναι δυνατή η ανάκτηση αυτής της λήψης</string>\n    <string name=\"seek_duration_title\">Διάρκεια αναζήτησης fast-forward και rewind</string>\n    <string name=\"systems_language\">Προεπιλογή συστήματος</string>\n    <string name=\"videos_string\">Βίντεο</string>\n    <string name=\"search_showing_result_for\">Εμφάνιση αποτελεσμάτων για: %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Ενεργοποίηση γρήγορης λειτουργίας</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Απενεργοποίηση γρήγορης λειτουργίας</string>\n    <string name=\"content_not_supported\">Αυτό το περιεχόμενο δεν υποστηρίζεται ακόμη από το NewPipe.\n\\n\n\\nΕλπίζουμε ότι θα υποστηριχθεί σε μια μελλοντική έκδοση.</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Μικρογραφία avatar του καναλιού</string>\n    <string name=\"channel_created_by\">Δημιουργήθηκε από %s</string>\n    <string name=\"playlist_page_summary\">Σελίδα λίστας αναπαραγωγής</string>\n    <string name=\"video_detail_by\">Από %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Διαθέσιμο σε ορισμένες υπηρεσίες, είναι συνήθως πολύ πιο γρήγορο, αλλά μπορεί να επιστρέψει έναν περιορισμένο αριθμό αντικειμένων και συχνά ελλειπείς πληροφορίες (π.χ. χωρίς διάρκεια, τύπο αντικειμένου)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Λήψη από ειδική ροή όταν είναι διαθέσιμη</string>\n    <string name=\"feed_update_threshold_option_always_update\">Να γίνεται πάντα ενημέρωση</string>\n    <string name=\"feed_update_threshold_summary\">Χρόνος μετά την τελευταία ενημέρωση πριν μια συνδρομή θεωρηθεί ξεπερασμένη — %s</string>\n    <string name=\"feed_update_threshold_title\">Όριο ενημέρωσης ροής</string>\n    <string name=\"settings_category_feed_title\">Ροή</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Εμφάνιση μόνο μη ομαδοποιημένων συνδρομών</string>\n    <string name=\"feed_create_new_group_button_title\">Νέα</string>\n    <string name=\"feed_group_dialog_delete_message\">Θέλετε να διαγράψετε αυτή την ομάδα;</string>\n    <string name=\"feed_group_dialog_empty_name\">Κενό όνομα ομάδας</string>\n    <string name=\"feed_group_dialog_empty_selection\">Δεν έχει επιλεγεί συνδρομή</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Επιλέξτε συνδρομές</string>\n    <string name=\"mute\">Σίγαση</string>\n    <string name=\"title_activity_play_queue\">Αναπαραγωγή ουράς</string>\n    <string name=\"no_playlist_bookmarked_yet\">Δεν υπάρχουν σελιδοδείκτες λίστας αναπαραγωγής ακόμα</string>\n    <string name=\"select_a_playlist\">Επιλέξτε μια λίστα αναπαραγωγής</string>\n    <string name=\"done\">Τέλος</string>\n    <string name=\"subtitle_activity_recaptcha\">Πατήστε «Τέλος» όταν επιλυθεί</string>\n    <string name=\"infinite_videos\">∞ βίντεο</string>\n    <string name=\"more_than_100_videos\">100+ βίντεο</string>\n    <string name=\"error_report_open_issue_button_text\">Αναφορά στο GitHub</string>\n    <string name=\"copy_for_github\">Αντιγραφή μορφοποιημένης αναφοράς</string>\n    <string name=\"permission_display_over_apps\">Δώστε άδεια για προβολή πάνω από άλλες εφαρμογές</string>\n    <string name=\"artists\">Καλλιτέχνες</string>\n    <string name=\"albums\">Άλμπουμ</string>\n    <string name=\"songs\">Τραγούδια</string>\n    <string name=\"restricted_video\">Αυτό το βίντεο έχει περιορισμό ηλικίας.\n\\n\n\\nΕνεργοποιήστε το «%1$s» στις ρυθμίσεις εάν θέλετε να το δείτε.</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Ενεργοποίηση \\\"Περιορισμένη Λειτουργία\\\" του YouTube</string>\n    <string name=\"unsupported_url_dialog_message\">Δεν ήταν δυνατή η αναγνώριση της διεύθυνσης URL. Άνοιγμα με άλλη εφαρμογή;</string>\n    <string name=\"auto_queue_toggle\">Αυτόματη προσθήκη στην ουρά</string>\n    <string name=\"clear_queue_confirmation_description\">Η ουρά του ενεργού αναπαραγωγού θα αντικατασταθεί</string>\n    <string name=\"clear_queue_confirmation_summary\">Η εναλλαγή από έναν αναπαραγωγό σε άλλον, μπορεί να αντικαταστήσει την ουρά σας</string>\n    <string name=\"clear_queue_confirmation_title\">Ζητήστε επιβεβαίωση πριν από την εκκαθάριση μιας ουράς</string>\n    <string name=\"notification_action_nothing\">Τίποτα</string>\n    <string name=\"notification_action_shuffle\">Ανάμιξη</string>\n    <string name=\"notification_action_repeat\">Επανάληψη</string>\n    <string name=\"notification_actions_at_most_three\">Μπορείτε να επιλέξετε το πολύ τρεις ενέργειες για εμφάνιση στη σύντομη ειδοποίηση!</string>\n    <string name=\"notification_actions_summary\">Επεξεργαστείτε κάθε ενέργεια ειδοποίησης παρακάτω πατώντας πάνω της. Επιλέξτε έως και τρεις από αυτές για να εμφανίζονται στη σύντομη ειδοποίηση, χρησιμοποιώντας τα πλαίσια ελέγχου στα δεξιά.</string>\n    <string name=\"notification_action_4_title\">Κουμπί πέμπτης ενέργειας</string>\n    <string name=\"notification_action_3_title\">Κουμπί τέταρτης ενέργειας</string>\n    <string name=\"notification_action_2_title\">Κουμπί τρίτης ενέργειας</string>\n    <string name=\"notification_action_1_title\">Κουμπί δεύτερης ενέργειας</string>\n    <string name=\"notification_action_0_title\">Κουμπί πρώτης ενέργειας</string>\n    <string name=\"notification_scale_to_square_image_summary\">Περικοπή της μικρογραφίας βίντεο που εμφανίζεται στην ειδοποίηση από 16:9 σε αναλογία διαστάσεων 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Περικοπή μικρογραφίας σε αναλογία διαστάσεων 1:1</string>\n    <string name=\"notification_action_buffering\">Φόρτωση</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Πιστεύετε ότι η ροή φορτώνει πολύ αργά; Δοκιμάστε να ενεργοποιήσετε τη γρήγορη φόρτωση (από τις ρυθμίσεις ή πατώντας το παρακάτω κουμπί).\n\\n\n\\nΤο NewPipe προσφέρει δύο στρατηγικές φόρτωσης ροής:\n\\n- Λήψη ολόκληρου του καναλιού συνδρομής, το οποίο είναι αργό αλλά πλήρες.\n\\n- Χρήση ενός αποκλειστικού τελικού σημείου υπηρεσίας, το οποίο είναι γρήγορο αλλά συνήθως δεν είναι πλήρες.\n\\n\n\\nΗ διαφορά μεταξύ των δύο είναι ότι η γρήγορη συνήθως στερείται κάποιες πληροφορίες, όπως η διάρκεια ή ο τύπος του στοιχείου (δεν μπορεί να διακρίνει μεταξύ ζωντανών βίντεο και κανονικών) και μπορεί να επιστρέψει λιγότερα στοιχεία.\n\\n\n\\nΤο YouTube είναι ένα παράδειγμα υπηρεσίας της γρήγορης μεθόδου με τη ροή RSS.\n\\n\n\\nΣυνεπώς επιλέγετε ανάλογα: ταχύτητα ή ακριβείς πληροφορίες.</string>\n    <string name=\"feed_oldest_subscription_update\">Η ροή ανανεώθηκε: %s</string>\n    <string name=\"feed_notification_loading\">Φόρτωση ροής…</string>\n    <string name=\"feed_processing_message\">Επεξεργασία ροής…</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d επιλέχθηκε</item>\n        <item quantity=\"other\">%d επιλέχθηκαν</item>\n    </plurals>\n    <string name=\"feed_subscription_not_loaded_count\">Δεν φορτώθηκε: %d</string>\n    <string name=\"feed_groups_header_title\">Ομάδες καναλιών</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d ημέρα</item>\n        <item quantity=\"other\">%d ημέρες</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d ώρα</item>\n        <item quantity=\"other\">%d ώρες</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d λεπτό</item>\n        <item quantity=\"other\">%d λεπτά</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d δευτερόλεπτο</item>\n        <item quantity=\"other\">%d δευτερόλεπτα</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Λόγω περιορισμών του ExoPlayer, η διάρκεια αναζήτησης ορίστηκε στα %d δευτερόλεπτα</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Ναι. Και τα μερικώς θεαθέντα βίντεο</string>\n    <string name=\"remove_watched_popup_warning\">Οι ροές που εθεάθησαν πριν και αφού προστέθηκαν στη λίστα αναπαραγωγής θα απομακρυνθούν \\nΕίστε σίγουρος;</string>\n    <string name=\"remove_watched_popup_title\">Απομάκρυνση θεαθέντων ροών;</string>\n    <string name=\"remove_watched\">Απομάκρυνση όσων θεάθησαν</string>\n    <string name=\"app_language_title\">Γλώσσα εφαρμογής</string>\n    <string name=\"choose_instance_prompt\">Επιλογή μιας instance</string>\n    <string name=\"delete_downloaded_files\">Διαγραφή ληφθέντων αρχείων</string>\n    <string name=\"clear_download_history\">Εκκαθάριση ιστορικού λήψεων</string>\n    <string name=\"never\">Ποτέ</string>\n    <string name=\"wifi_only\">Μόνο με Wi-Fi</string>\n    <string name=\"autoplay_summary\">Αυτόματη έναρξη αναπαραγωγής — %s</string>\n    <string name=\"show_original_time_ago_summary\">Τα αυθεντικά κείμενα των υπηρεσιών θα εμφανίζονται στα αντικείμενα ροής</string>\n    <string name=\"show_memory_leaks\">Εμφάνιση διαρροών μνήμης</string>\n    <string name=\"unmute\">Κατάργηση σίγασης</string>\n    <string name=\"enqueued\">Προστέθηκε στην ουρά</string>\n    <string name=\"enqueue_stream\">Προσθήκη στην ουρά</string>\n    <string name=\"most_liked\">Πιο αγαπημένα</string>\n    <string name=\"error_report_open_github_notice\">Παρακαλούμε ελέγξτε αν το πρόβλημα σας έχει ήδη αναφερθεί. Οι διπλές αναφορές μας στερούν το χρόνο που θα μπορούσαμε να διαθέσουμε για την επίλυση του προβλήματος.</string>\n    <string name=\"clear_cookie_summary\">Εκκαθάριση των cookies που αποθηκεύει η εφαρμογή όταν επιλύετε ένα reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Τα reCAPTCHA cookies εκκαθαρίστηκαν</string>\n    <string name=\"clear_cookie_title\">Εκκαθάριση reCAPTCHA cookies</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">Το YouTube διαθέτει «Περιορισμένη Λειτουργία» η οποία κρύβει πιθανώς ακατάλληλο περιεχόμενο</string>\n    <string name=\"show_age_restricted_content_summary\">Εμφάνιση πιθανώς ακατάλληλου περιεχομένου (18+)</string>\n    <string name=\"peertube_instance_add_exists\">Το instance υπάρχει ήδη</string>\n    <string name=\"peertube_instance_add_fail\">Αδυναμία πιστοποίησης του instance</string>\n    <string name=\"peertube_instance_add_help\">Προσθέστε την URL του instance</string>\n    <string name=\"peertube_instance_add_title\">Προσθήκη instance</string>\n    <string name=\"peertube_instance_url_help\">Βρείτε τα instances που σας αρέσουν στο %s</string>\n    <string name=\"peertube_instance_url_summary\">Επιλογή των αγαπημένων σας PeerTube instances</string>\n    <string name=\"show_original_time_ago_title\">Εμφάνιση αυθεντικού παρελθόντος χρόνου στα αντικείμενα</string>\n    <string name=\"peertube_instance_url_title\">Στιγμιότυπα PeerTube</string>\n    <string name=\"notification_colorize_title\">Χρωματισμός ειδοποιήσεων</string>\n    <string name=\"notification_colorize_summary\">Επιτρέπει στο Android να τροποποιήσει το χρώμα της ειδοποίησης, σύμφωνα με το κύριο χρώμα του εικονιδίου (δεν διατίθεται σε όλες τις συσκευές)</string>\n    <string name=\"show_thumbnail_summary\">Χρήση των εικονιδίων ως φόντο στην οθόνη κλειδώματος και στις ειδοποιήσεις</string>\n    <string name=\"show_thumbnail_title\">Εμφάνιση</string>\n    <string name=\"msg_calculating_hash\">Υπολογισμός hash</string>\n    <string name=\"hash_channel_description\">Ειδοποιήσεις για πρόοδο βίντεο hashing</string>\n    <string name=\"hash_channel_name\">Ειδοποίηση βίντεο hash</string>\n    <string name=\"recent\">Πρόσφατα</string>\n    <string name=\"show_meta_info_summary\">Απενεργοποιήστε το για να μην εμφανίζονται μεταδεδομένα με επιπλέον πληροφορίες για το δημιουργό και το περιεχόμενο της ροής ή αίτημα αναζήτησης</string>\n    <string name=\"show_meta_info_title\">Εμφάνιση μεταδεδομένων</string>\n    <string name=\"chapters\">Κεφάλαια</string>\n    <string name=\"description_tab_description\">Περιγραφή</string>\n    <string name=\"related_items_tab_description\">Σχετιζόμενες ροές</string>\n    <string name=\"comments_tab_description\">Σχόλια</string>\n    <string name=\"show_description_summary\">Απενεργοποιήστε για απόκρυψη περιγραφής και πρόσθετων πληροφοριών</string>\n    <string name=\"show_description_title\">Εμφάνιση περιγραφής</string>\n    <string name=\"open_with\">Άνοιγμα με</string>\n    <string name=\"no_app_to_open_intent\">Καμία εφαρμογή στη συσκευή σας δεν μπορεί το ανοίξει</string>\n    <string name=\"crash_the_app\">Κατάρρευση εφαρμογής</string>\n    <string name=\"paid_content\">Αυτό το περιεχόμενο είναι διαθέσιμο μόνο σε χρήστες που έχουν πληρώσει και δεν μπορεί να αναπαραχθεί ή να το κατεβάσετε με το NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Αυτό το βίντεο είναι διαθέσιμο μόνο για τα μέλη του YouTube Music Premium και δεν μπορεί να αναπαραχθεί ή να το κατεβάσετε με το NewPipe.</string>\n    <string name=\"private_content\">Αυτό το περιεχόμενο είναι ιδιωτικό και δεν μπορεί να αναπαραχθεί ή να το κατεβάσετε με το NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Αυτό είναι ένα κομμάτι SoundCloud Go+, τουλάχιστον στη χώρα σας. Έτσι δεν μπορεί να αναπαραχθεί ή να το κατεβάσετε με το NewPipe.</string>\n    <string name=\"georestricted_content\">Αυτό το περιεχόμενο δεν είναι διαθέσιμο στη χώρα σας.</string>\n    <string name=\"restricted_video_no_stream\">Αυτό το βίντεο έχει περιορισμό ηλικίας.\n\\nΛόγω της νέας πολιτικής του YouTube για αυτά τα βίντεο, το NewPipe δεν μπορεί να το αναπαράγει.</string>\n    <string name=\"featured\">Επιλεγμένα</string>\n    <string name=\"radio\">Ράδιο</string>\n    <string name=\"recaptcha_solve\">Λύση</string>\n    <string name=\"download_has_started\">Η λήψη ξεκίνησε</string>\n    <string name=\"select_night_theme_toast\">Μπορείτε να επιλέξετε το αγαπημένο σας νυχτερινό θέμα παρακάτω</string>\n    <string name=\"night_theme_summary\">Επιλέξτε το αγαπημένο σας νυχτερινό θέμα — %s</string>\n    <string name=\"auto_device_theme_title\">Αυτόματο (θέμα συσκευής)</string>\n    <string name=\"night_theme_title\">Νυχτερινό θέμα</string>\n    <string name=\"show_channel_details\">Εμφάνιση λεπτομερειών καναλιού</string>\n    <string name=\"disable_media_tunneling_summary\">Απενεργοποιήστε το media tunneling, αν παρατηρείτε μαύρη οθόνη ή διακοπές κατά την αναπαραγωγή βίντεο.</string>\n    <string name=\"disable_media_tunneling_title\">Απενεργοποίηση media tunneling</string>\n    <string name=\"metadata_privacy_internal\">Εσωτερικό</string>\n    <string name=\"metadata_privacy_private\">Ιδιωτικό</string>\n    <string name=\"metadata_privacy_unlisted\">Εκτός λίστας</string>\n    <string name=\"metadata_privacy_public\">Δημόσιο</string>\n    <string name=\"metadata_support\">Υποστήριξη</string>\n    <string name=\"metadata_language\">Γλώσσα</string>\n    <string name=\"metadata_age_limit\">Όριο ηλικίας</string>\n    <string name=\"metadata_privacy\">Ιδιωτικότητα</string>\n    <string name=\"metadata_licence\">Άδεια</string>\n    <string name=\"metadata_tags\">Ετικέτες</string>\n    <string name=\"metadata_category\">Κατηγορία</string>\n    <string name=\"description_select_disable\">Απενεργοποίηση επιλογής κειμένου στην περιγραφή</string>\n    <string name=\"description_select_enable\">Ενεργοποίηση επιλογής κειμένου στην περιγραφή</string>\n    <string name=\"description_select_note\">Τώρα μπορείτε να επιλέξετε κείμενο εντός της περιγραφής. Σημειώστε ότι, η σελίδα μπορεί να παρουσιάζει αστάθεια κατά τη διάρκεια της κατάστασης επιλογής κειμένου.</string>\n    <string name=\"open_website_license\">Ανοικτή ιστοσελίδα</string>\n    <string name=\"account_terminated\">Ο λογαριασμός διαγράφηκε</string>\n    <string name=\"feed_load_error_fast_unknown\">Η κατάσταση γρήγορης τροφοδοσίας δεν παρέχει περισσότερες πληροφορίες.</string>\n    <string name=\"feed_load_error_terminated\">Ο λογαριασμός του δημιουργού έχει διαγραφεί.\n\\nΤο NewPipe δε θα μπορεί να φορτώσει αυτή την τροφοδοσία στο μέλλον.\n\\nΘέλετε να απεγγραφείτε από αυτό το κανάλι;</string>\n    <string name=\"feed_load_error_account_info\">Αδυναμία φόρτωσης τροφοδοσίας για \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Σφάλμα φόρτωσης τροφοδοσίας</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Από το Android 10 και μετά, μόνο το Πλαίσιο Πρόσβασης Αποθήκευσης υποστηρίζεται</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Θα ερωτηθείτε πού να αποθηκεύσετε κάθε λήψη</string>\n    <string name=\"no_dir_yet\">Δεν έχει ορισθεί φάκελος λήψεων ακόμα, eπιλέξτε τον προεπιλεγμένο φάκελο τώρα</string>\n    <string name=\"metadata_host\">Host</string>\n    <string name=\"off\">Ανενεργό</string>\n    <string name=\"on\">Ενεργό</string>\n    <string name=\"tablet_mode_title\">Κατάσταση tablet</string>\n    <string name=\"comments_are_disabled\">Τα σχόλια είναι απενεργοποιημένα</string>\n    <string name=\"dont_show\">Απόκρυψη</string>\n    <string name=\"low_quality_smaller\">Χαμηλή ποιότητα (μικρότερο)</string>\n    <string name=\"high_quality_larger\">Υψηλή ποιότητα (μεγαλύτερο)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Προεπισκόπηση στην μπάρα αναζήτησης</string>\n    <string name=\"mark_as_watched\">Σήμανση ως αναπαραχθέν</string>\n    <string name=\"detail_heart_img_view_description\">Επισημάνθηκε από τον δημιουργό</string>\n    <string name=\"remote_search_suggestions\">Προτάσεις απομακρυσμένης αναζήτησης</string>\n    <string name=\"local_search_suggestions\">Προτάσεις τοπικής αναζήτησης</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s λήψη διαγράφηκε</item>\n        <item quantity=\"other\">%1$s λήψεις διαγράφηκαν</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Η λήψη ολοκληρώθηκε</item>\n        <item quantity=\"other\">%s λήψεις ολοκληρώθηκαν</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Απομάκρυνση αντικειμένων με σύρσιμο</string>\n    <string name=\"start_main_player_fullscreen_summary\">Εκκίνηση των βίντεο σε πλήρη οθόνη και όχι σε αναδυόμενο παράθυρο, αν η αυτόματη περιστροφή της οθόνης είναι ανενεργή. Μπορείτε να ενεργοποιήσετε το αναδυόμενο παράθυρο βγαίνοντας από την πλήρη οθόνη</string>\n    <string name=\"start_main_player_fullscreen_title\">Εκκίνηση κύριου αναπαραγωγού σε πλήρη οθόνη</string>\n    <string name=\"enqueued_next\">Προστέθηκε το επόμενο στην ουρά</string>\n    <string name=\"enqueue_next_stream\">Προσθήκη επόμενου στην ουρά</string>\n    <string name=\"processing_may_take_a_moment\">Επεξεργασία... Μπορεί να πάρει λίγο χρόνο</string>\n    <string name=\"checking_updates_toast\">Έλεγχος αναβάθμισης…</string>\n    <string name=\"manual_update_description\">Χειροκίνητος έλεγχος για νέα έκδοση</string>\n    <string name=\"check_for_updates\">Έλεγχος αναβάθμισης</string>\n    <string name=\"feed_new_items\">Νέα αντικείμενα τροφοδοσίας</string>\n    <string name=\"show_crash_the_player_title\">Εμφάνιση \\\"Κατάρρευση αναπαραγωγέα\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Εμφανίζει μια επιλογή κατάρρευσης κατά τη χρήση του αναπαραγωγέα</string>\n    <string name=\"crash_the_player\">Κατάρρευση αναπαραγωγέα</string>\n    <string name=\"error_report_channel_name\">Ειδοποίηση αναφοράς σφάλματος</string>\n    <string name=\"error_report_channel_description\">Ειδοποιήσεις για την αναφορά σφαλμάτων</string>\n    <string name=\"error_report_notification_toast\">Συνέβη ένα σφάλμα. Δείτε την ειδοποίηση</string>\n    <string name=\"create_error_notification\">Δημιουργία ειδοποίησης σφάλματος</string>\n    <string name=\"no_appropriate_file_manager_message\">Δε βρέθηκε κατάλληλος διαχειριστής αρχείων για αυτή την ενέργεια.\n\\nΕγκαταστήστε έναν ή δοκιμάστε να απενεργοποιήσετε το \\'%s\\' στις ρυθμίσεις λήψεων</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Δε βρέθηκε κατάλληλος διαχειριστής αρχείων για αυτή την ενέργεια.\n\\nΕγκαταστήστε έναν συμβατό με το Πλαίσιο Πρόσβασης Αποθήκευσης</string>\n    <string name=\"error_report_notification_title\">Το NewPipe παρουσίασε ένα σφάλμα. Πατήστε για αναφορά</string>\n    <string name=\"show_error_snackbar\">Εμφάνιση μιας snackbar σφάλματος</string>\n    <string name=\"detail_pinned_comment_view_description\">Καρφιτσωμένο σχόλιο</string>\n    <string name=\"leak_canary_not_available\">Το LeakCanary δεν είναι διαθέσιμο</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Εξ\\' ορισμού ExoPlayer</string>\n    <string name=\"notifications\">Ειδοποιήσεις</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s νέα ροή</item>\n        <item quantity=\"other\">%s νέες ροές</item>\n    </plurals>\n    <string name=\"streams_notifications_network_title\">Απαιτούμενη σύνδεση δικτύου</string>\n    <string name=\"any_network\">Οποιοδήποτε δίκτυο</string>\n    <string name=\"settings_category_player_notification_title\">Ειδοποίηση αναπαραγωγής</string>\n    <string name=\"streams_notification_channel_name\">Νέες ροές</string>\n    <string name=\"settings_category_player_notification_summary\">Διαμόρφωση ειδοποίησης τρέχουσας αναπαραγωγής ροής</string>\n    <string name=\"streams_notifications_interval_title\">Συχνότητα ελέγχου</string>\n    <string name=\"streams_notification_channel_description\">Ειδοποιήσεις σχετικά με νέες ροές για συνδρομές</string>\n    <string name=\"loading_stream_details\">Φόρτωση λεπτομερειών ροής…</string>\n    <string name=\"check_new_streams\">Εκτελέστε έλεγχο για νέες ροές</string>\n    <string name=\"enable_streams_notifications_title\">Ειδοποιήσεις για νέες ροές</string>\n    <string name=\"enable_streams_notifications_summary\">Ειδοποίηση για νέες ροές από συνδρομές</string>\n    <string name=\"delete_downloaded_files_confirm\">Διαγραφή όλων των ληφθέντων αρχείων από το δίσκο;</string>\n    <string name=\"notifications_disabled\">Οι ειδοποιήσεις είναι απενεργοποιημένες</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"get_notified\">Λάβετε ειδοποίηση</string>\n    <string name=\"you_successfully_subscribed\">Έχετε εγγραφεί τώρα σε αυτό το κανάλι</string>\n    <string name=\"toggle_all\">Εναλλαγή όλων</string>\n    <string name=\"percent\">Τοις εκατό</string>\n    <string name=\"semitone\">Ημιτόνιο</string>\n    <string name=\"streams_not_yet_supported_removed\">Οι ροές που δεν υποστηρίζονται ακόμα από τον λήπτη δεν εμφανίζονται</string>\n    <string name=\"selected_stream_external_player_not_supported\">Η επιλεγμένη ροή δεν υποστηρίζεται από εξωτερικούς αναπαραγωγούς</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Δεν διατίθενται ροές ήχου για εξωτερικούς αναπαραγωγούς</string>\n    <string name=\"no_video_streams_available_for_external_players\">Δεν διατίθενται ροές βίντεο για εξωτερικούς αναπαραγωγούς</string>\n    <string name=\"select_quality_external_players\">Επιλογή ποιότητας εξωτερικών αναπαραγωγών</string>\n    <string name=\"unknown_format\">Άγνωστος τύπος αρχείου</string>\n    <string name=\"unknown_quality\">Άγνωστη ποιότητα</string>\n    <string name=\"progressive_load_interval_title\">Μέγεθος διαστήματος φόρτωσης αναπαραγωγής</string>\n    <string name=\"faq_title\">Συχνές ερωτήσεις</string>\n    <string name=\"faq\">Προβολή στην ιστοσελίδα</string>\n    <string name=\"faq_description\">Εάν αντιμετωπίζετε προβλήματα με τη χρήση της εφαρμογής, φροντίστε να ελέγξετε αυτές τις απαντήσεις σε συνήθεις ερωτήσεις!</string>\n    <string name=\"sort\">Ταξινόμηση</string>\n    <string name=\"fast_mode\">Γρήγορη λειτουργία</string>\n    <string name=\"import_subscriptions_hint\">Εισάγετε ή εξάγετε συνδρομές από το μενού 3 κουκκίδων</string>\n    <string name=\"app_update_available_notification_text\">Πατήστε για λήψη %s</string>\n    <string name=\"app_update_unavailable_toast\">Έχετε την πιο πρόσφατη έκδοση του NewPipe</string>\n    <string name=\"night_theme_available\">Αυτή η επιλογή είναι διαθέσιμη μόνο εάν έχει επιλεγεί %s για Θέμα</string>\n    <string name=\"unset_playlist_thumbnail\">Κατάργηση μόνιμης μικρογραφίας</string>\n    <string name=\"msg_failed_to_copy\">Αποτυχία αντιγραφής στο πρόχειρο</string>\n    <string name=\"card\">Κάρτα</string>\n    <string name=\"duplicate_in_playlist\">Οι λίστες αναπαραγωγής που είναι γκριζαρισμένες περιέχουν ήδη αυτό το στοιχείο.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Προστέθηκε διπλότυπο %d φορά(ες)</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Αγνοήστε τα συμβάντα κουμπιών πολυμέσων υλικού</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Χρήσιμο, για παράδειγμα, εάν χρησιμοποιείτε ακουστικά με χαλασμένα φυσικά κουμπιά</string>\n    <string name=\"feed_hide_streams_title\">Εμφάνιση των ακόλουθων ροών</string>\n    <string name=\"feed_show_watched\">Θεαθέντα πλήρως</string>\n    <string name=\"feed_show_upcoming\">Προσεχή</string>\n    <string name=\"feed_show_hide_streams\">Εμφάνιση/Απόκρυψη ροών</string>\n    <string name=\"remove_duplicates_title\">Αφαίρεση διπλοτύπων;</string>\n    <string name=\"remove_duplicates_message\">Θέλετε να καταργήσετε όλες τις διπλότυπες ροές σε αυτήν τη λίστα αναπαραγωγής;</string>\n    <string name=\"remove_duplicates\">Αφαίρεση διπλοτύπων</string>\n    <string name=\"feed_show_partially_watched\">Θεαθέντα μερικώς</string>\n    <string name=\"left_gesture_control_summary\">Επιλέξτε χειρονομία για το αριστερό μισό της οθόνης του προγράμματος αναπαραγωγής</string>\n    <string name=\"left_gesture_control_title\">Ενέργεια αριστερής χειρονομίας</string>\n    <string name=\"right_gesture_control_summary\">Επιλέξτε χειρονομία για το δεξί μισό της οθόνης του προγράμματος αναπαραγωγής</string>\n    <string name=\"right_gesture_control_title\">Ενέργεια δεξιάς χειρονομίας</string>\n    <string name=\"brightness\">Φωτεινότητα</string>\n    <string name=\"volume\">Ένταση</string>\n    <string name=\"none\">Καμία</string>\n    <string name=\"prefer_original_audio_title\">Προτίμηση πρωτότυπου ήχου</string>\n    <string name=\"prefer_original_audio_summary\">Επιλογή του πρωτότυπου κομματιού ήχου ανεξάρτητα από τη γλώσσα</string>\n    <string name=\"prefer_descriptive_audio_title\">Προτίμηση του περιγραφικού ήχου</string>\n    <string name=\"play_queue_audio_track\">Ήχος: %s</string>\n    <string name=\"audio_track\">Κομμάτι ήχου</string>\n    <string name=\"audio_track_present_in_video\">Ένα κομμάτι ήχου θα πρέπει να υπάρχει ήδη σε αυτήν τη ροή</string>\n    <string name=\"select_audio_track_external_players\">Επιλογή ήχου για εξωτερικές συσκευές αναπαραγωγής</string>\n    <string name=\"unknown_audio_track\">Άγνωστο</string>\n    <string name=\"settings_category_exoplayer_title\">Ρυθμίσεις ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">Διαχειριστείτε ορισμένες ρυθμίσεις του ExoPlayer. Αυτές οι αλλαγές απαιτούν επανεκκίνηση του προγράμματος αναπαραγωγής για να τεθεί σε ισχύ</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Χρησιμοποιήστε την δυνατότητα εναλλακτικού αποκωδικοποιητή του ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Ενεργοποιήστε αυτήν την επιλογή εάν αντιμετωπίζετε προβλήματα με την προετοιμασία του αποκωδικοποιητή, η οποία επιστρέφει σε αποκωδικοποιητές χαμηλότερης προτεραιότητας εάν αποτύχει η προετοιμασία του πρωτεύοντος αποκωδικοποιητή. Αυτό μπορεί να έχει ως αποτέλεσμα κακή απόδοση αναπαραγωγής από ότι όταν χρησιμοποιείτε κύριους αποκωδικοποιητές</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Χρησιμοποιείτε πάντα τον εναλλακτικό τρόπο ρύθμισης της επιφάνειας εξόδου βίντεο του ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Αυτή η λύση απελευθερώνει και επαναφέρει τους κωδικοποιητές βίντεο όταν συμβαίνει μια αλλαγή επιφάνειας, αντί να ρυθμίζει την επιφάνεια απευθείας στον κωδικοποιητή. Χρησιμοποιείται ήδη από το ExoPlayer σε ορισμένες συσκευές με αυτό το πρόβλημα, αυτή η ρύθμιση έχει επίδραση μόνο σε Android 6 και νεότερη έκδοση.\n\\n\n\\nΗ ενεργοποίηση αυτής της επιλογής μπορεί να αποτρέψει σφάλματα αναπαραγωγής κατά την εναλλαγή του τρέχοντος προγράμματος αναπαραγωγής βίντεο ή τη μετάβαση σε πλήρη οθόνη</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">αρχικό</string>\n    <string name=\"audio_track_type_dubbed\">μεταγλωττισμένο</string>\n    <string name=\"audio_track_type_descriptive\">περιγραφικό</string>\n    <string name=\"progressive_load_interval_summary\">Αλλάξτε το μέγεθος του διαστήματος φόρτωσης σε προοδευτικά περιεχόμενα (προς το παρόν %s). Μια χαμηλότερη τιμή μπορεί να επιταχύνει την αρχική τους φόρτωση</string>\n    <string name=\"prefer_descriptive_audio_summary\">Επιλογή ήχου με περιγραφές για άτομα με προβλήματα όρασης, εάν είναι διαθέσιμος</string>\n    <string name=\"main_tabs_position_summary\">Μετακινήστε τον επιλογέα κύριας καρτέλας στο κάτω μέρος</string>\n    <string name=\"main_tabs_position_title\">Θέση κύριων καρτελών</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Το media tunneling απενεργοποιήθηκε από προεπιλογή στη συσκευή σας, επειδή το μοντέλο της συσκευής σας είναι γνωστό ότι δεν το υποστηρίζει.</string>\n    <string name=\"no_live_streams\">Καμία ζωντανή ροή</string>\n    <string name=\"no_streams\">Καμία ροή</string>\n    <string name=\"loading_metadata_title\">Φόρτωση μεταδεδομένων…</string>\n    <string name=\"channel_tab_videos\">Βίντεο</string>\n    <string name=\"metadata_subscribers\">Συνδρομητές</string>\n    <string name=\"show_channel_tabs_summary\">Ποιες καρτέλες εμφανίζονται στις σελίδες των καναλιών</string>\n    <string name=\"show_channel_tabs\">Καρτέλες καναλιών</string>\n    <string name=\"channel_tab_shorts\">Σύντομα</string>\n    <string name=\"feed_fetch_channel_tabs\">Λήψη καρτελών καναλιών</string>\n    <string name=\"channel_tab_about\">Σχετικά</string>\n    <string name=\"channel_tab_albums\">Άλμπουμ</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Καρτέλες για ανάκτηση κατά την ενημέρωση της ροής. Αυτή η επιλογή δεν έχει καμία επίδραση εάν ένα κανάλι ενημερώνεται χρησιμοποιώντας τη γρήγορη λειτουργία.</string>\n    <string name=\"channel_tab_playlists\">Λίστες</string>\n    <string name=\"channel_tab_tracks\">Κομμάτια</string>\n    <string name=\"channel_tab_channels\">Κανάλια</string>\n    <string name=\"channel_tab_livestreams\">Ζωντανά</string>\n    <string name=\"toggle_screen_orientation\">Εναλλαγή προσανατολισμού οθόνης</string>\n    <string name=\"toggle_fullscreen\">Λειτουργία πλήρους οθόνης</string>\n    <string name=\"next_stream\">Επόμενη ροή</string>\n    <string name=\"open_play_queue\">Άνοιγμα ουράς αναπαραγωγής</string>\n    <string name=\"forward\">Εμπρός</string>\n    <string name=\"rewind\">Πίσω</string>\n    <string name=\"replay\">Επανάληψη</string>\n    <string name=\"play\">Αναπαραγωγή</string>\n    <string name=\"more_options\">Περισσότερες επιλογές</string>\n    <string name=\"duration\">Διάρκεια</string>\n    <string name=\"previous_stream\">Προηγούμενη ροή</string>\n    <string name=\"image_quality_title\">Ποιότητα εικόνας</string>\n    <string name=\"question_mark\">;</string>\n    <string name=\"image_quality_low\">Χαμηλή ποιότητα</string>\n    <string name=\"metadata_avatars\">Άβαταρ</string>\n    <string name=\"metadata_subchannel_avatars\">Άβαταρ υπο-καναλιών</string>\n    <string name=\"image_quality_none\">Μη φόρτωση εικόνων</string>\n    <string name=\"image_quality_high\">Υψηλή ποιότητα</string>\n    <string name=\"image_quality_medium\">Μέτρια ποιότητα</string>\n    <string name=\"metadata_uploader_avatars\">Άβαταρ δημιουργών</string>\n    <string name=\"image_quality_summary\">Επιλέξτε την ποιότητα των εικόνων και εάν δε θέλετε να φορτώσετε εικόνες, για να μειώσετε τη χρήση δεδομένων και μνήμης. Οι αλλαγές εκκαθαρίζουν την κρυφή μνήμη εικόνων, τόσο στη μνήμη όσο και στον δίσκο — %s</string>\n    <string name=\"metadata_thumbnails\">Μικρογραφίες</string>\n    <string name=\"metadata_banners\">Ταμπέλες</string>\n    <string name=\"share_playlist_with_list\">Κοινοποίηση λίστας URL</string>\n    <string name=\"share_playlist_with_titles\">Κοινοποίηση με τίτλους</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">Κοινοποίηση λίστας</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s απάντηση</item>\n        <item quantity=\"other\">%s απαντήσεις</item>\n    </plurals>\n    <string name=\"show_more\">Εμφάνιση περισσοτέρων</string>\n    <string name=\"show_less\">Εμφάνιση λιγότερων</string>\n    <string name=\"notification_actions_summary_android13\">Επεξεργαστείτε κάθε ενέργεια ειδοποίησης παρακάτω πατώντας σε αυτήν. Οι τρεις πρώτες ενέργειες (αναπαραγωγή/παύση, προηγούμενηο και επόμενο) ορίζονται από το σύστημα και δεν μπορούν να τροποποιηθούν.</string>\n    <string name=\"error_insufficient_storage\">Δεν υπάρχει αρκετός ελεύθερος χώρος στη συσκευή</string>\n    <string name=\"no\">Όχι</string>\n    <string name=\"yes\">Ναι</string>\n    <string name=\"settings_category_backup_restore_title\">Αντίγραφο ασφαλείας και επαναφορά</string>\n    <string name=\"auto_update_check_description\">Το NewPipe μπορεί να ελέγχει αυτόματα για νέες εκδόσεις και να σας ειδοποιεί μόλις είναι διαθέσιμες.\n\\nΘέλετε να το ενεργοποιήσετε;</string>\n    <string name=\"reset_settings_title\">Επαναφορά ρυθμίσεων</string>\n    <string name=\"reset_settings_summary\">Επαναφορά όλων των ρυθμίσεων στις αρχικές τιμές τους</string>\n    <string name=\"reset_all_settings\">Η επαναφορά όλων των ρυθμίσεων θα απορρίψει όλες τις τροποποιημένες ρυθμίσεις σας και θα επανεκκινήσει την εφαρμογή.\n\\n\n\\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;</string>\n    <string name=\"import_settings_vulnerable_format\">Οι ρυθμίσεις στην εξαγωγή που εισάγεται χρησιμοποιούν μια ευάλωτη μορφή που είχε καταργηθεί από το NewPipe 0.27.0. Βεβαιωθείτε ότι η εξαγωγή που εισάγεται προέρχεται από αξιόπιστη πηγή και προτιμήστε να χρησιμοποιείτε μόνο εξαγωγές που λαμβάνονται από το NewPipe 0.27.0 ή νεότερο στο μέλλον. Η υποστήριξη για εισαγωγή ρυθμίσεων σε αυτήν την ευάλωτη μορφή θα καταργηθεί σύντομα εντελώς και, στη συνέχεια, οι παλιές εκδόσεις του NewPipe δεν θα μπορούν πλέον να εισάγουν ρυθμίσεις εξαγωγών από νέες εκδόσεις.</string>\n    <string name=\"audio_track_type_secondary\">δευτερεύων</string>\n    <string name=\"tab_bookmarks_short\">Λίστες αναπαραγωγής</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Μοιραστείτε ως προσωρινή λίστα αναπαραγωγής στο YouTube</string>\n    <string name=\"select_a_feed_group\">Επιλογή ομάδας τροφοδοσίας</string>\n    <string name=\"no_feed_group_created_yet\">Δεν δημιουργήθηκε ομάδα τροφοδοσίας ακόμα</string>\n    <string name=\"feed_group_page_summary\">Σελίδα καναλιού ομάδας</string>\n    <string name=\"search_with_service_name\">Αναζήτηση %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Αναζήτηση %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Μου αρέσει</string>\n    <string name=\"migration_info_6_7_title\">Η σελίδα των SoundCloud Top 50 αφαιρέθηκε</string>\n    <string name=\"migration_info_6_7_message\">Το SoundCloud έχει καταργήσει τα αρχικά charts με τα Top 50. Η αντίστοιχη καρτέλα έχει αφαιρεθεί από την κύρια σελίδα σας.</string>\n    <string name=\"migration_info_7_8_title\">Οι συνδυασμένες τάσεις στο YouTube καταργήθηκαν</string>\n    <string name=\"migration_info_7_8_message\">Το YouTube έχει καταργήσει τη συνδυασμένη σελίδα με τάσεις από την 21 Ιουλίου 2025. Το NewPipe αντικατέστησε την προεπιλεγμένη σελίδα τάσεων με τις ζωντανές ροές τάσεων.\\n\\nΜπορείτε επίσης να επιλέξετε διαφορετικές σελίδες με τάσεις στις \\\"Ρυθμίσεις &gt; Περιεχόμενο &gt; Περιεχόμενο κύριας σελίδας\\\".</string>\n    <string name=\"trending_gaming\">Τάσεις παιχνιδιών</string>\n    <string name=\"trending_podcasts\">Τάσεις podcasts</string>\n    <string name=\"trending_movies\">Τάσεις ταινιών και εκπομπών</string>\n    <string name=\"trending_music\">Μουσικές τάσεις</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"permission_display_over_apps_message\">Για να χρησιμοποιήσετε το Αναδυόμενο Πρόγραμμα Αναπαραγωγής, επιλέξτε %1$s στο ακόλουθο μενού ρυθμίσεων Android και ενεργοποιήστε το %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">«Να επιτρέπεται η εμφάνιση πάνω από άλλες εφαρμογές»</string>\n    <string name=\"delete_file\">Διαγραφή αρχείου</string>\n    <string name=\"delete_entry\">Διαγραφή καταχώρησης</string>\n    <string name=\"entry_deleted\">Η καταχώρηση διαγράφηκε</string>\n    <string name=\"account_terminated_service_provides_reason\">Ο λογαριασμός έκλεισε\\n\\n%1$s παρέχει αυτήν την αιτία: %2$s</string>\n    <string name=\"player_http_403\">Σφάλμα HTTP 403 που ελήφθη από τον διακομιστή κατά την αναπαραγωγή, πιθανώς λόγω λήξης διεύθυνσης URL ροής ή αποκλεισμού IP</string>\n    <string name=\"player_http_invalid_status\">Σφάλμα HTTP %1$s ελήφθη από τον διακομιστή κατά την αναπαραγωγή</string>\n    <string name=\"youtube_player_http_403\">Σφάλμα HTTP 403 ελήφθη από τον διακομιστή κατά την αναπαραγωγή, πιθανώς λόγω αποκλεισμού IP ή προβλημάτων απεμπλοκής URL ροής</string>\n    <string name=\"sign_in_confirm_not_bot_error\">Ο %1$s αρνήθηκε να παράσχει δεδομένα, ζητώντας σύνδεση για να επιβεβαιώσει ότι ο αιτών δεν είναι bot.\\n\\nΗ IP σας ενδέχεται να έχει αποκλειστεί προσωρινά από τον %1$s. Μπορείτε να περιμένετε λίγο ή να αλλάξετε IP (για παράδειγμα, ενεργοποιώντας/απενεργοποιώντας ένα VPN ή αλλάζοντας από WiFi σε δεδομένα κινητής τηλεφωνίας).</string>\n    <string name=\"unsupported_content_in_country\">Αυτό το περιεχόμενο δεν είναι διαθέσιμο για την τρέχουσα επιλεγμένη χώρα περιεχομένου.\\n\\nΑλλάξτε την επιλογή σας από \\\"Ρυθμίσεις &gt; Περιεχόμενο &gt; Προεπιλεγμένη χώρα περιεχομένου\\\".</string>\n    <string name=\"kao_dialog_more_info\">Λεπτομέρειες</string>\n    <string name=\"kao_solution\">Λύση</string>\n    <string name=\"kao_dialog_warning\">Τον Αύγουστο του 2025, η Google ανακοίνωσε ότι από τον Σεπτέμβριο του 2026, η εγκατάσταση εφαρμογών θα απαιτεί επαλήθευση προγραμματιστή για όλες τις εφαρμογές Android σε πιστοποιημένες συσκευές, συμπεριλαμβανομένων εκείνων που είναι εγκατεστημένες εκτός του Play Store. Δεδομένου ότι οι προγραμματιστές του NewPipe δεν συμφωνούν με αυτήν την απαίτηση, το NewPipe δεν θα λειτουργεί πλέον σε πιστοποιημένες συσκευές Android μετά από αυτό το χρονικό διάστημα.</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-en-rGB/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"use_inexact_seek_summary\">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.</string>\n    <string name=\"show_play_with_kodi_summary\">Display an option to play a video via Kodi media centre</string>\n    <string name=\"notification_colorize_summary\">Have Android customise the notification’s colour according to the main colour in the thumbnail (note that this is not available on all devices)</string>\n    <string name=\"notification_colorize_title\">Colourise notification</string>\n    <string name=\"import_soundcloud_instructions\">Import a SoundCloud profile by typing either the URL or your ID:\n\\n\n\\n1. Enable ‘desktop mode’ in a web browser (the site is not available for mobile devices)\n\\n2. Go to this URL: %1$s\n\\n3. Log in when asked\n\\n4. Copy the profile URL you were redirected to.</string>\n    <string name=\"import_youtube_instructions\">Import YouTube subscriptions from Google takeout:\n\\n\n\\n1. Go to this URL: %1$s\n\\n2. Log in when asked\n\\n3. Click on ‘All data included’, then on ‘Deselect all’, then select only ‘subscriptions’ and click ‘OK’\n\\n4. Click on ‘Next step’ and then on ‘Create export’\n\\n5. Click on the ‘Download’ button after it appears\n\\n6. Click on IMPORT FILE below and select the downloaded .zip file\n\\n7. [If the .zip import fails] Extract the .csv file (usually under ‘YouTube and YouTube Music/subscriptions/subscriptions.csv’), click on IMPORT FILE below and select the extracted csv file</string>\n    <string name=\"subtitle_activity_recaptcha\">Press ‘Done’ when solved</string>\n    <string name=\"restricted_video\">This video is age restricted.\n\\n\n\\nTurn on ‘%1$s’ in the settings if you want to see it.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube provides a ‘Restricted Mode’ which hides potentially mature content</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Turn on YouTube’s ‘Restricted Mode’</string>\n    <string name=\"show_hold_to_append_summary\">Show tip when pressing the background or the pop-up button in video ‘Details:’</string>\n    <string name=\"show_hold_to_append_title\">Show ‘Hold to append’ tip</string>\n    <string name=\"show_play_with_kodi_title\">Show ‘Play with Kodi’ option</string>\n    <string name=\"did_you_mean\">Did you mean ‘%1$s’\\?</string>\n    <string name=\"main_bg_subtitle\">Tap the magnifying glass to get started.</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Channel’s avatar thumbnail</string>\n    <string name=\"feed_update_threshold_summary\">Time after last update before a subscription is considered outdated – %s</string>\n    <string name=\"autoplay_summary\">Start playback automatically – %s</string>\n    <string name=\"minimize_on_exit_summary\">Action when switching to other app from main video player – %s</string>\n    <string name=\"preferred_open_action_settings_summary\">Default action when opening content – %s</string>\n    <string name=\"contribution_encouragement\">Whether you have ideas of; translation, design changes, code cleaning, or real heavy code changes – help is always welcome. The more is done, the better it gets!</string>\n    <string name=\"switch_to_main\">Switch to Main</string>\n    <string name=\"switch_to_popup\">Switch to Pop-up</string>\n    <string name=\"switch_to_background\">Switch to Background</string>\n    <string name=\"hash_channel_name\">Video hash notification</string>\n    <string name=\"app_update_notification_channel_name\">App update notification</string>\n    <string name=\"just_once\">Just once</string>\n    <string name=\"show_age_restricted_content_summary\">Show content possibly unsuitable for children because it has an age limit (such as 18+)</string>\n    <string name=\"popup_playing_toast\">Playing in pop-up mode</string>\n    <string name=\"settings_category_updates_title\">Updates</string>\n    <string name=\"settings_category_debug_title\">Debug</string>\n    <string name=\"settings_category_appearance_title\">Appearance</string>\n    <string name=\"settings_category_history_title\">History and cache</string>\n    <string name=\"settings_category_video_audio_title\">Video and audio</string>\n    <string name=\"settings_category_player_title\">Player</string>\n    <string name=\"cancel\">Cancel</string>\n    <string name=\"content_not_supported\">This content is not yet supported by NewPipe.\n\\n\n\\nHopefully, it will be supported in a future version.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Do you think feed loading is too slow\\? If so, try enabling fast loading (you can change it in settings or by pressing the button below).\n\\n\n\\nNewPipe offers two feed loading methods:\n\\n• Fetching the whole subscription channel, which is slow but complete.\n\\n• Using a dedicated service endpoint, which is fast but usually not complete.\n\\n\n\\nThe difference between the two is that the fast one usually lacks some information, like the item\\'s duration or type (can\\'t distinguish between live videos and normal ones) and it may return fewer items.\n\\n\n\\nYouTube is an example of a service that offers this fast method with its RSS feed.\n\\n\n\\nSo the choice boils down to what you prefer: speed or complete information.</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Available in some services, it is usually much faster but may return a limited number of items and often incomplete information (e.g. no duration, item type, no live status).</string>\n    <string name=\"max_retry_desc\">Maximum number of attempts before cancelling the download</string>\n    <string name=\"read_full_license\">Read licence</string>\n    <string name=\"app_license\">NewPipe is copyleft libre software: You can use, study share and improve it at will. Specifically you can redistribute and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation, either version 3 of the Licence, or (at your option) any later version.</string>\n    <string name=\"app_license_title\">NewPipe’s licence</string>\n    <string name=\"tab_licenses\">Licences</string>\n    <string name=\"title_licenses\">Third-party licences</string>\n    <string name=\"download_to_sdcard_error_message\">Downloading to SD card not possible. Reset download folder location\\?</string>\n    <string name=\"settings_category_player_behavior_title\">Behaviour</string>\n    <string name=\"peertube_instance_url_summary\">Select your favourite PeerTube instances</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Continue playing after interruptions (e.g. phone calls)</string>\n    <string name=\"upload_date_text\">Published on %1$s</string>\n    <string name=\"error_report_button_text\">Report this error via e-mail</string>\n    <string name=\"night_theme_summary\">Select your favorite night theme – %s</string>\n    <string name=\"no_player_found\">No stream player found. Install VLC\\?</string>\n    <string name=\"install\">Install</string>\n    <string name=\"ok\">Okay</string>\n    <string name=\"open_in_browser\">Open in browser</string>\n    <string name=\"no_player_found_toast\">No stream player found (you can install VLC to play it).</string>\n    <string name=\"yes\">Yes</string>\n    <string name=\"no\">No</string>\n    <string name=\"mark_as_watched\">Mark as watched</string>\n    <string name=\"open_in_popup_mode\">Open in popup mode</string>\n    <string name=\"open_with\">Open with</string>\n    <string name=\"share\">Share</string>\n    <string name=\"download\">Download</string>\n    <string name=\"controls_download_desc\">Download stream file</string>\n    <string name=\"search\">Search</string>\n    <string name=\"settings\">Settings</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-enm/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "app/src/main/res/values-eo/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Eldonita je %1$s</string>\n    <string name=\"install\">Instali</string>\n    <string name=\"cancel\">Nuligi</string>\n    <string name=\"open_in_browser\">Malfermi en retumilo</string>\n    <string name=\"share\">Konigi</string>\n    <string name=\"download\">Elŝuti</string>\n    <string name=\"search\">Serĉi</string>\n    <string name=\"settings\">Agordoj</string>\n    <string name=\"did_you_mean\">Ĉu vi signifis \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Konigi kun</string>\n    <string name=\"use_external_video_player_title\">Uzi eksteran filmetoludilon</string>\n    <string name=\"use_external_audio_player_title\">Uzi eksteran sonludilon</string>\n    <string name=\"default_resolution_title\">Preferata distingumo</string>\n    <string name=\"play_with_kodi_title\">Ludi per Kodi</string>\n    <string name=\"show_play_with_kodi_title\">Montri \\\"Ludi per Kodi\\\"-opcion</string>\n    <string name=\"play_audio\">Sono</string>\n    <string name=\"default_audio_format_title\">Preferata sona dosierformo</string>\n    <string name=\"theme_title\">Etoso</string>\n    <string name=\"dark_theme_title\">Malhela</string>\n    <string name=\"light_theme_title\">Hela</string>\n    <string name=\"black_theme_title\">Nigra</string>\n    <string name=\"download_dialog_title\">Elŝuti</string>\n    <string name=\"unsupported_url\">Ligilo ne subtenita</string>\n    <string name=\"content_language_title\">Preferata enhavlingvo</string>\n    <string name=\"settings_category_video_audio_title\">Filmo kaj sono</string>\n    <string name=\"settings_category_appearance_title\">Apero</string>\n    <string name=\"background_player_playing_toast\">Ludanta fone</string>\n    <string name=\"general_error\">Eraro</string>\n    <string name=\"network_error\">Reteraro</string>\n    <string name=\"content_not_available\">Enhavo malhavebla</string>\n    <string name=\"detail_likes_img_view_description\">Ŝatoj</string>\n    <string name=\"detail_dislikes_img_view_description\">Malŝatoj</string>\n    <string name=\"no_player_found\">Neniu ludilo de elsendoj trovita. Ĉu instalu la programon VLC?</string>\n    <string name=\"kore_not_found\">Ĉu instalu la mankatan programon Kore?</string>\n    <string name=\"show_next_and_similar_title\">Montri ‹Sekvajn› kaj ‹Similajn› filmetojn</string>\n    <string name=\"could_not_load_thumbnails\">Ĉiuj bildetoj ne ŝargeblas</string>\n    <string name=\"parsing_error\">La retejo ne analizeblas</string>\n    <string name=\"detail_thumbnail_view_description\">Ludi filmeton, daŭro:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Bildeto de la alŝutinto</string>\n    <string name=\"download_path_title\">Elŝutujo por filmetoj</string>\n    <string name=\"download_path_audio_title\">Elŝutujo por aŭdio</string>\n    <string name=\"show_play_with_kodi_summary\">Montri opcion por ludi filmeton per la programo Kodi</string>\n    <string name=\"download_path_summary\">Elŝutitaj filmetoj konserviĝas ĉi tie</string>\n    <string name=\"download_path_audio_summary\">Dosierujo por konservi elŝutitajn muzikojn</string>\n    <string name=\"download_path_dialog_title\">Elektu lokon por konservi elŝutitajn filmetojn</string>\n    <string name=\"download_path_audio_dialog_title\">Elektu lokon por konservi elŝutitajn muzikojn</string>\n    <string name=\"content\">Enhavo</string>\n    <string name=\"error_report_button_text\">Signali tion eraron retpoŝte</string>\n    <string name=\"error_snackbar_action\">Signali</string>\n    <string name=\"what_device_headline\">Informoj:</string>\n    <string name=\"your_comment\">Vian komenton (angle):</string>\n    <string name=\"error_details_headline\">Detaloj:</string>\n    <string name=\"video\">Filmeto</string>\n    <string name=\"retry\">Reprovi</string>\n    <string name=\"main_bg_subtitle\">Premi \\\"Serĉi\\\" por komenci.</string>\n    <string name=\"no_player_found_toast\">Neniu elsendlflua ludilo trovita (instalu VLC por ludi ĝin).</string>\n    <string name=\"open_in_popup_mode\">Malfermi en ŝprucfenestran modon</string>\n    <string name=\"use_external_video_player_summary\">Forigas aŭdon ĉe kelkaj distingumoj</string>\n    <string name=\"subscribe_button_title\">Aboni</string>\n    <string name=\"subscribed_button_title\">Abonita</string>\n    <string name=\"channel_unsubscribed\">Kanalo malabonita</string>\n    <string name=\"subscription_change_failed\">Ne povis ŝanĝi abonon</string>\n    <string name=\"controls_download_desc\">Elŝutu dosieron</string>\n    <string name=\"subscription_update_failed\">Ne povis ĝisdatigi abonon</string>\n    <string name=\"show_info\">Montri informojn</string>\n    <string name=\"tab_subscriptions\">Abonoj</string>\n    <string name=\"tab_bookmarks\">Konservitaj ludlistoj</string>\n    <string name=\"fragment_feed_title\">Kio novas</string>\n    <string name=\"controls_background_title\">Fono</string>\n    <string name=\"controls_popup_title\">Ŝprucfenestro</string>\n    <string name=\"controls_add_to_playlist_title\">Aldonu al</string>\n    <string name=\"default_popup_resolution_title\">Komenca distingumo de la ŝprucfenestra ludilo</string>\n    <string name=\"show_higher_resolutions_title\">Montri pli altajn distingumojn</string>\n    <string name=\"show_higher_resolutions_summary\">Nur kelkaj aparatoj povas ludi filmetojn je distingumoj 2K / 4K</string>\n    <string name=\"default_video_format_title\">Preferata filma dosierformo</string>\n    <string name=\"popup_remember_size_pos_title\">Memori ecojn de ŝprucfenestro</string>\n    <string name=\"popup_remember_size_pos_summary\">Memori lastan grandon kaj pozicion de ŝprucfenestro</string>\n    <string name=\"use_inexact_seek_title\">Uzi rapidan malekzaktan serĉon</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"could_not_setup_download_menu\">Ne povis konstrui la dosierujon de elŝuto</string>\n    <string name=\"show_age_restricted_content_title\">Enhavo limigita al aĝo</string>\n    <string name=\"duration_live\">Nuna</string>\n    <string name=\"downloads\">Elŝutoj</string>\n    <string name=\"downloads_title\">Elŝutoj</string>\n    <string name=\"error_report_title\">Erarosignalo</string>\n    <string name=\"app_ui_crash\">Apo kraŝis</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA defio</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA defio petita</string>\n    <string name=\"all\">Ĉiuj</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s filmeto</item>\n        <item quantity=\"other\">%s filmetoj</item>\n    </plurals>\n    <string name=\"msg_popup_permission\">Tiu permeso estas necesa por\n\\nmalfermi en ŝprucfenestra modo</string>\n    <string name=\"popup_playing_toast\">Ludante en ŝprucfenestra modo</string>\n    <string name=\"disabled\">Malŝatitaj</string>\n    <string name=\"clear\">Forviŝi</string>\n    <string name=\"show_search_suggestions_title\">Serĉi sugestojn</string>\n    <string name=\"show_search_suggestions_summary\">Montri sugestojn kiam serĉanto</string>\n    <string name=\"best_resolution\">Plej bona distingumo</string>\n    <string name=\"app_description\">Libera malpeza torentado ĉe Android.</string>\n    <string name=\"settings_category_downloads_title\">Elŝuti</string>\n    <string name=\"charset_letters_and_digits\">Leteroj kaj ciferoj</string>\n    <string name=\"charset_most_special_characters\">Plej specialaj karakteroj</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Ludrekomenci</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Daŭrigi la ludon post la interrompaĵoj (ekzemple telefonadoj)</string>\n    <string name=\"enable_search_history_title\">Serĉa historio</string>\n    <string name=\"enable_search_history_summary\">Konservi la historio de serĉo lokale</string>\n    <string name=\"enable_watch_history_title\">Rigardu historion</string>\n    <string name=\"enable_watch_history_summary\">Protokoli spektitajn filmetojn</string>\n    <string name=\"notification_channel_name\">Sciigo de NewPipe</string>\n    <string name=\"notification_channel_description\">Sciigoj por ludilo de NewPipe</string>\n    <string name=\"settings_category_player_title\">Ludilo</string>\n    <string name=\"settings_category_player_behavior_title\">Konduto</string>\n    <string name=\"settings_category_history_title\">Historio kaj kaŝmemoro</string>\n    <string name=\"undo\">Malfari</string>\n    <string name=\"trending\">Tendencoj</string>\n    <string name=\"top_50\">Supro 50</string>\n    <string name=\"new_and_hot\">Nova kaj varma</string>\n    <string name=\"show_hold_to_append_title\">Montri la indiko « Tenu por aldoni »</string>\n    <string name=\"show_hold_to_append_summary\">Montri indikon premante la fonon aŭ la ŝprucfenestran butonon en filmeta «Detaloj:»</string>\n    <string name=\"play_all\">Ludi ĉiujn</string>\n    <string name=\"player_stream_failure\">Ne povis ludi tion torenton</string>\n    <string name=\"player_unrecoverable_failure\">Neatendebla eraro de ludilo okazis</string>\n    <string name=\"player_recoverable_failure\">Reakiri el eraro de la ludilo</string>\n    <string name=\"play_queue_remove\">Retiri</string>\n    <string name=\"play_queue_stream_detail\">Detalado</string>\n    <string name=\"play_queue_audio_settings\">Sonaj parametroj</string>\n    <string name=\"hold_to_append\">Teni por viciĝi</string>\n    <string name=\"unknown_content\">[Nekonata]</string>\n    <string name=\"start_here_on_popup\">Komenci ludi en nova ŝprucfenestro</string>\n    <string name=\"default_content_country_title\">Preferata enhavlando</string>\n    <string name=\"switch_to_background\">Ŝanĝi al Fono</string>\n    <string name=\"switch_to_popup\">Ŝanĝi al ŝprucfenestro</string>\n    <string name=\"switch_to_main\">Ŝangi al Ĉefa</string>\n    <string name=\"always\">Ĉiam</string>\n    <string name=\"just_once\">Nur unufoje</string>\n    <string name=\"video_streams_empty\">Neniu filmofluo trovita</string>\n    <string name=\"audio_streams_empty\">Neniuj sonaj torentoj trovis</string>\n    <string name=\"popup_player\">Ŝprucfenestra ludilo</string>\n    <string name=\"import_data_title\">Importi la datumbazon</string>\n    <string name=\"export_data_title\">Eksporti la datumbazon</string>\n    <string name=\"import_data_summary\">Anstataŭigas vian aktualan historion kaj abonojn</string>\n    <string name=\"export_data_summary\">Eksporti historion, abonojn kaj ludlistoj</string>\n    <string name=\"always_ask_open_action\">Ĉiam peti</string>\n    <string name=\"create_playlist\">Nova ludlisto</string>\n    <string name=\"rename_playlist\">Alinomi</string>\n    <string name=\"name\">Nomo</string>\n    <string name=\"add_to_playlist\">Aldoni al la ludlisto</string>\n    <string name=\"set_as_playlist_thumbnail\">Meti kiel bildeto de ludlisto</string>\n    <string name=\"bookmark_playlist\">Legosigno Ludlisto</string>\n    <string name=\"unbookmark_playlist\">Forviŝi Legosignon</string>\n    <string name=\"delete_playlist_prompt\">Ĉu forviŝi ĉi tiun ludliston \\?</string>\n    <string name=\"playlist_creation_success\">Ludlisto kreita</string>\n    <string name=\"playlist_add_stream_success\">Ludlistita</string>\n    <string name=\"playlist_thumbnail_change_success\">Bildeto de ludlisto ŝanĝiĝita.</string>\n    <string name=\"settings_category_debug_title\">Malcimigi</string>\n    <string name=\"auto_queue_title\">Memenvici sekvan fluon</string>\n    <string name=\"auto_queue_summary\">Daŭrigi finanta (malripetanta) atendovico aldonante rilata enhavo</string>\n    <string name=\"file\">Dosiero</string>\n    <string name=\"invalid_directory\">Tia dosierujo ne ekzistas</string>\n    <string name=\"invalid_source\">Tia dosiero/enhavo ne ekzistas</string>\n    <string name=\"file_name_empty_error\">Dosiernomo ne povas esti malplena</string>\n    <string name=\"error_occurred_detail\">Eraro okazis: %1$s</string>\n    <string name=\"import_youtube_instructions\">Importu Jutubajn abonaĵojn per elŝuti la dosieron de eksporto :\n\\n\n\\n1. Iru ĉe tiu retpaĝo: %1$s\n\\n2. Ensalutu kiam oni petas vin\n\\n3. Click on \\\"All data included\\\", then on \\\"Deselect all\\\", then select only \\\"subscriptions\\\" and click \\\"OK\\\"\n\\n4. Click on \\\"Next step\\\" and then on \\\"Create export\\\"\n\\n5. Click on the \\\"Download\\\" button after it appears and\n\\n6. From the downloaded takeout zip extract the .json file (usually under \\\"YouTube and YouTube Music/subscriptions/subscriptions.json\\\") and import it here.</string>\n    <string name=\"import_soundcloud_instructions\">Importu Soundcloud-n profilon tajpante ĉu la ligilon, ĉu vian ID :\n\\n \n\\n1. Ebligu komputilon modon en retumilon (la retejo malhaveblas por poŝtelefonoj)\n\\n2. Iru tien: %1$s\n\\n3. Ensalutu kiam oni petas vin \n\\n4. Kopiu la ligilon de profilo ke oni kondikis vin.</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Bildokaŝmemoro vakigis</string>\n    <string name=\"metadata_cache_wipe_title\">Vakigi kaŝmemorigitajn metadatumojn</string>\n    <string name=\"metadata_cache_wipe_summary\">Vakigi tutajn kaŝmemorigitajn retpaĝajn datumojn</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Kaŝmemorojn de metadatumojn vakigis</string>\n    <string name=\"no_streams_available_download\">Neniuj torentoj haveblaj por elŝuti</string>\n    <string name=\"clear_views_history_title\">Forviŝi vidohistorion</string>\n    <string name=\"clear_views_history_summary\">Forviŝi la historion de viditaj filmetojn kaj ludajn poziciojn</string>\n    <string name=\"delete_view_history_alert\">Ĉu vi volas forviŝi la tutan historion \\?</string>\n    <string name=\"clear_search_history_title\">Forviŝi la historion de serĉoj</string>\n    <string name=\"clear_search_history_summary\">Forviŝi la serĉajn ŝlosilvortojn</string>\n    <string name=\"delete_search_history_alert\">Ĉu vi volas forviŝi la totalon de la historio de serĉo \\?</string>\n    <string name=\"search_history_deleted\">Historio de serĉo forviŝita</string>\n    <string name=\"limit_mobile_data_usage_title\">Limigi distingumon uzante telefonan retkonekton</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimumigi al ŝprucfenestra ludilo</string>\n    <string name=\"channels\">Kanaloj</string>\n    <string name=\"playlists\">Ludlistoj</string>\n    <string name=\"tracks\">Spuroj</string>\n    <string name=\"users\">Uzantoj</string>\n    <string name=\"unsubscribe\">Malaboni</string>\n    <string name=\"tab_choose\">Elektu ongleton</string>\n    <string name=\"settings_category_updates_title\">Ĝisdatigoj</string>\n    <string name=\"file_deleted\">Dosiero forviŝita</string>\n    <string name=\"app_update_notification_channel_name\">Sciigo por ĝisdatigo de apo</string>\n    <string name=\"app_update_notification_channel_description\">Sciigo por novaj versioj de NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Ekstera konservejo malhavebla</string>\n    <string name=\"download_to_sdcard_error_message\">Elŝuti al ekstera SD-karto ne eblas. Ĉu vi volas restarigi la elŝutan dosierujon \\?</string>\n    <string name=\"queued\">viciĝita</string>\n    <string name=\"enqueue\">Envicigi</string>\n    <string name=\"stop\">Halti</string>\n    <string name=\"max_retry_msg\">Maksimuma nombro de provoj</string>\n    <string name=\"max_retry_desc\">Maksimuma nombro de provoj antaŭ fordecidi la elŝuton</string>\n    <string name=\"pause_downloads_on_mobile\">interrompi ĉe limigitaj komputilaj retoj</string>\n    <string name=\"events\">Eventoj</string>\n    <string name=\"conferences\">Konferencoj</string>\n    <string name=\"show_comments_title\">Montri komentojn</string>\n    <string name=\"show_comments_summary\">Malŝatu por kaŝi komentojn</string>\n    <string name=\"autoplay_title\">Aŭtoludo</string>\n    <string name=\"error_unable_to_load_comments\">Ne povis ŝarĝi komentojn</string>\n    <string name=\"close\">Fermi</string>\n    <string name=\"enable_playback_resume_title\">Repreni la ludon</string>\n    <string name=\"enable_playback_resume_summary\">Restaŭri la lastan ludan pozicion</string>\n    <string name=\"enable_playback_state_lists_title\">Pozicioj en listoj</string>\n    <string name=\"enable_playback_state_lists_summary\">Montri la indikilojn de pozicioj de ludoj en listoj</string>\n    <string name=\"settings_category_clear_data_title\">Forviŝi datumojn</string>\n    <string name=\"watch_history_deleted\">Historio forviŝita</string>\n    <string name=\"watch_history_states_deleted\">Ludaj pozicioj forviŝitaj</string>\n    <string name=\"missing_file\">Dosiero movita aŭ forviŝita</string>\n    <string name=\"overwrite_failed\">ne povas dispremi la dosieron</string>\n    <string name=\"confirm_prompt\">Ĉu vi volas forviŝi vian historion de elŝutoj aŭ forviŝi la tutajn elŝutitajn dosierojn\\?</string>\n    <string name=\"enable_queue_limit\">Limigi la elŝutan atendovicon</string>\n    <string name=\"enable_queue_limit_desc\">Unu elŝuto ruliĝos en la sama tempo</string>\n    <string name=\"start_downloads\">Komenci elŝutojn</string>\n    <string name=\"pause_downloads\">Paŭzigi elŝutojn</string>\n    <string name=\"downloads_storage_ask_title\">Peti kie elŝuti</string>\n    <string name=\"downloads_storage_ask_summary\">Oni petos vin kie konservi ĉion elŝuton</string>\n    <string name=\"downloads_storage_use_saf_title\">Uzu AFM</string>\n    <string name=\"downloads_storage_use_saf_summary\">La \\\"Atinga Framo al la Memoro\\\" ebligas elŝuti al ekstera SD-karto</string>\n    <string name=\"clear_playback_states_title\">Forviŝi ludajn poziciojn</string>\n    <string name=\"clear_playback_states_summary\">Forviŝi la totalon de ludaj pozicioj</string>\n    <string name=\"delete_playback_states_alert\">Ĉu vi volas forviŝi ĉiujn ludajn poziciojn \\?</string>\n    <string name=\"sorry_string\">Pardonu, eraro okazis.</string>\n    <string name=\"error_snackbar_message\">Pardonon, io mizokasis.</string>\n    <string name=\"what_happened_headline\">Kio okazis:</string>\n    <string name=\"info_labels\">Kio:\\nPeto:\\nEnhavlingvo:\\nEnhavlando:\\nAplingvo:\\nServo:\\nGMT Horo:\\nPako:\\nVersio:\\nOperaciumo versio:</string>\n    <string name=\"audio\">Aŭdio</string>\n    <string name=\"start\">Komenci</string>\n    <string name=\"pause\">Paŭzigi</string>\n    <string name=\"delete\">Forviŝi</string>\n    <string name=\"checksum\">Kontrolsumo</string>\n    <string name=\"ok\">Bone</string>\n    <string name=\"msg_name\">Dosiernomo</string>\n    <string name=\"msg_threads\">Fadenoj</string>\n    <string name=\"msg_error\">Eraro</string>\n    <string name=\"msg_running\">NewPipe estas elŝutanta</string>\n    <string name=\"msg_running_detail\">Premu por detaladoj</string>\n    <string name=\"msg_wait\">Bonvolu atendi…</string>\n    <string name=\"msg_copied\">Enpoŝigita</string>\n    <string name=\"no_available_dir\">Bonvolu difini elŝutan dosierujon poste en agordoj</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s spekto</item>\n        <item quantity=\"other\">%s spektoj</item>\n    </plurals>\n    <string name=\"title_activity_about\">Pri NewPipe</string>\n    <string name=\"title_licenses\">Eksteraj permesiloj</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s de %2$s sub %3$s</string>\n    <string name=\"tab_about\">Pri</string>\n    <string name=\"tab_licenses\">Permesiloj</string>\n    <string name=\"view_on_github\">Rigardu ĉe GitHub</string>\n    <string name=\"app_license_title\">Permesilo de NewPipe</string>\n    <string name=\"contribution_encouragement\">Ĉu vi havas ideojn pri; traduko, desegnaĵoj ŝanĝoj, purigado de kodo, aŭ realaj masivaj ŝanĝoj—helpo ĉiam estas bonvena. Ju pli oni faras, des pli bonas!</string>\n    <string name=\"read_full_license\">Legi permesilon</string>\n    <string name=\"contribution_title\">Kontribui</string>\n    <string name=\"settings_file_charset_title\">Permesitaj karakteroj en dosiernomoj</string>\n    <string name=\"settings_file_replacement_character_summary\">Nevalidaj karakteroj estas anstataŭigita kun ĉi tiu valoro</string>\n    <string name=\"settings_file_replacement_character_title\">Anstataŭa karaktero</string>\n    <string name=\"title_activity_history\">Historio</string>\n    <string name=\"action_history\">Historio</string>\n    <string name=\"search_no_results\">Neniuj rezultoj</string>\n    <string name=\"empty_list_subtitle\">Neniu enhavo</string>\n    <string name=\"no_subscribers\">Neniuj abonantoj</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s abonanto</item>\n        <item quantity=\"other\">%s abonantoj</item>\n    </plurals>\n    <string name=\"no_views\">Neniuj spektoj</string>\n    <string name=\"no_videos\">Neniu filmeto</string>\n    <string name=\"delete_item_search_history\">Ĉu vi volas forviŝi tion eron el la historio de serĉo \\?</string>\n    <string name=\"main_page_content\">Enhavo de la ĉefpaĝo</string>\n    <string name=\"blank_page_summary\">Malplena Paĝo</string>\n    <string name=\"kiosk_page_summary\">Kioska Paĝo</string>\n    <string name=\"channel_page_summary\">Kanala Paĝo</string>\n    <string name=\"select_a_channel\">Elekti kanalon</string>\n    <string name=\"no_channel_subscribed_yet\">Neniuj kanalaj abonoj ankoraŭ</string>\n    <string name=\"select_a_kiosk\">Elekti kioskon</string>\n    <string name=\"start_here_on_background\">Komenci ludi fone</string>\n    <string name=\"donation_title\">Donaci</string>\n    <string name=\"donation_encouragement\">NewPipe estas programadita par volontuoj, elspezante lia tempo por alporti vin la plej bona uzanta sperto. Redoni por helpi programistojn plibonigi NewPipe dum ili ĝuas tason da kafo.</string>\n    <string name=\"give_back\">Redoni</string>\n    <string name=\"website_title\">Retejo</string>\n    <string name=\"website_encouragement\">Viziti la retejon de NewPipe por pli da informoj kaj novaĵoj.</string>\n    <string name=\"drawer_open\">Malfermi la tirkeston</string>\n    <string name=\"drawer_close\">Fermi la tirtekston</string>\n    <string name=\"external_player_unsupported_link_type\">Ekstaraj ludantoj ne suportas tiajn ligilojn</string>\n    <string name=\"video_player\">Filmludilo</string>\n    <string name=\"background_player\">Fona ludilo</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Akiranta informoj…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Ŝarĝante petita enhavo</string>\n    <string name=\"export_complete_toast\">Eksportita</string>\n    <string name=\"import_complete_toast\">Importita</string>\n    <string name=\"no_valid_zip_file\">Neniu valida ZIP-dosiero</string>\n    <string name=\"could_not_import_all_files\">Averto: Ne povis importi ĉiujn dosierojn.</string>\n    <string name=\"override_current_data\">Ĉi tio nuligos vian nunan aranĝon.</string>\n    <string name=\"detail_drag_description\">Trenu por reorgidi</string>\n    <string name=\"create\">Krei</string>\n    <string name=\"dismiss\">Rezigni</string>\n    <string name=\"rename\">Alinomi</string>\n    <string name=\"title_last_played\">Lasta Ludado</string>\n    <string name=\"title_most_played\">Plej ludataj filmetoj</string>\n    <string name=\"caption_none\">Neniuj Subtitoloj</string>\n    <string name=\"resize_fit\">Alĝustigi</string>\n    <string name=\"resize_fill\">Plenigi</string>\n    <string name=\"resize_zoom\">Zomi</string>\n    <string name=\"caption_auto_generated\">Aŭtomate generita</string>\n    <string name=\"enable_leak_canary_summary\">La monitorado de la memorlikadoj povas frostigi la apon dum la hejta dumpingo</string>\n    <string name=\"enable_disposed_exceptions_title\">Signali ekster-vivciklajn erarojn</string>\n    <string name=\"enable_disposed_exceptions_summary\">Perforti signalante neenretigaj Rx esceptoj eksere la fragmento aŭ aktiveco vivciklo post dispono</string>\n    <string name=\"invalid_file\">La dosiero ne ekzistas aŭ la ludopermeso mankas</string>\n    <string name=\"import_title\">Importi</string>\n    <string name=\"import_from\">Importi el</string>\n    <string name=\"export_to\">Eksporti al</string>\n    <string name=\"import_ongoing\">Importante …</string>\n    <string name=\"export_ongoing\">Eksportante…</string>\n    <string name=\"import_file_title\">Importi la dosieron</string>\n    <string name=\"previous_export\">Antaŭa eksportaĵo</string>\n    <string name=\"subscriptions_import_unsuccessful\">Ne povis importi abonojn</string>\n    <string name=\"subscriptions_export_unsuccessful\">Ne povis eksporti abonojn</string>\n    <string name=\"import_soundcloud_instructions_hint\">via salutnomo, soundcloud.com/salutnomo</string>\n    <string name=\"import_network_expensive_warning\">Memoru, ke ĉi tiu operacio povas esti multekosta en la reto.\n\\n\n\\nĈu vi volas daŭrigi\\?</string>\n    <string name=\"playback_speed_control\">Kontroloj de rapideco de ludo</string>\n    <string name=\"playback_tempo\">Tempoindiko</string>\n    <string name=\"playback_pitch\">Ludkampo</string>\n    <string name=\"unhook_checkbox\">Malligi (povas kaŭzi distordon)</string>\n    <string name=\"preferred_open_action_settings_title\">Preferita \\'malfermi\\' ago</string>\n    <string name=\"preferred_open_action_settings_summary\">Implicita ago malfermante vidaŭdaĵon — %s</string>\n    <string name=\"caption_setting_title\">Subtitoloj</string>\n    <string name=\"caption_setting_description\">Modifi la dimension de la teksto kaj la fonajn stilojn de la subtitoloj de la ludilo. Ĝi bezonas restarto de la apo por efektiviĝi.</string>\n    <string name=\"one_item_deleted\">1 ero forviŝita.</string>\n    <string name=\"app_license\">NewPipe estas programaro sub rajtoceda permesilo: Vi povas uzi, studi, komuniki kaj plibonigi ĝin kiel vi volas. Precize, vi povas redistribui kaj/aŭ modifi ĝin sub la kondiĉoj de la Ĝenerala Publika Permesilo de GNU, kiel publikigita per la Free Software Foundation, ĉu en la versio 3, ĉu (se vi volas) ajna posta versio.</string>\n    <string name=\"import_settings\">Ĉu vi volas ankaŭ importi agordojn\\?</string>\n    <string name=\"privacy_policy_title\">Privateca politiko de NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">La NewPipe projekto serioze respektas vian privatecon. Konsekvence, la apo ne kolektas ajnan datumon sen via konsento.\n\\nLa privateco politiko de NewPipe detale eksplikas kion datumon estas sendita kaj stokita kiam vi sendas falegosignalon.</string>\n    <string name=\"read_privacy_policy\">Legi la privatecan politikon</string>\n    <string name=\"start_accept_privacy_policy\">Por konformiĝi al la Ĝenerala Datum-Protekta Regularon (GDPR), ni allogas vian atenton al la privateca politiko de NewPipe. Bonvolu atentive legi ĝin.\n\\nVi devas akcepti ĝin por sendi la cimsignalon al ni.</string>\n    <string name=\"accept\">Akcepti</string>\n    <string name=\"decline\">Rifuzi</string>\n    <string name=\"limit_data_usage_none_description\">Neniu limo</string>\n    <string name=\"minimize_on_exit_title\">Minimumigi dum la apo ŝanĝo</string>\n    <string name=\"minimize_on_exit_summary\">Ago dum ŝanĝante al alia apo el la ĉefa filmetludilo — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Neniu</string>\n    <string name=\"minimize_on_exit_background_description\">Minimumigi por ludi fone</string>\n    <string name=\"skip_silence_checkbox\">Plirapidigi dum silentoj</string>\n    <string name=\"playback_step\">Paŝo</string>\n    <string name=\"playback_reset\">Restarigi</string>\n    <string name=\"saved_tabs_invalid_json\">Ne povis legi agorditajn langetojn, do uzos la implicitajn</string>\n    <string name=\"restore_defaults\">Restarigi implicitajn valorojn</string>\n    <string name=\"restore_defaults_confirmation\">Ĉu vi volas restarigi la implicitajn valorojn?</string>\n    <string name=\"subscribers_count_not_available\">Abonantoj kalkulo malhaveblas</string>\n    <string name=\"main_page_content_summary\">Kioj ongletoj estas montritaj en la ĉefpaĝo</string>\n    <string name=\"updates_setting_title\">Ĝisdatigoj</string>\n    <string name=\"updates_setting_description\">Montri sciigon por proponi ĝisdatigon de la apo kiam nova versio estas havebla</string>\n    <string name=\"list_view_mode\">Lista vido maniero</string>\n    <string name=\"list\">Listo</string>\n    <string name=\"grid\">Krado</string>\n    <string name=\"auto\">Aŭto</string>\n    <string name=\"app_update_available_notification_title\">Ĝisdatigo de NewPipe havebla!</string>\n    <string name=\"missions_header_finished\">Finita</string>\n    <string name=\"missions_header_pending\">Pritraktata</string>\n    <string name=\"paused\">Paŭzigita</string>\n    <string name=\"post_processing\">postprocesado</string>\n    <string name=\"permission_denied\">Ago rifuzita kaŭze de la sistemon</string>\n    <string name=\"download_failed\">Elŝuto fiaskis!</string>\n    <string name=\"generate_unique_name\">Generu unikan nomon</string>\n    <string name=\"overwrite\">Anstataŭigi</string>\n    <string name=\"download_already_running\">Estas elŝuto en progreso kun ĉi tiu nomo</string>\n    <string name=\"show_error\">Montri la eraron</string>\n    <string name=\"error_path_creation\">La celloko-dosierujo ne povas esti kreita</string>\n    <string name=\"error_file_creation\">La dosiero ne povas esti kreita</string>\n    <string name=\"error_ssl_exception\">Ne povis establi sekuran konekton</string>\n    <string name=\"error_unknown_host\">Ne povis trovi la servilon</string>\n    <string name=\"error_connect_host\">Ne povas konektiĝi al la servilo</string>\n    <string name=\"error_http_no_content\">La servilo ne sendas datumojn</string>\n    <string name=\"error_http_unsupported_range\">La servilo ne akceptas plurfadenajn elŝutojn, reprovu kun @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Ne trovita</string>\n    <string name=\"error_postprocessing_failed\">Postprocesado malsukcesis</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Utila dum la ŝanĝo al poŝdatumoj, kvankam kelkaj elŝutoj ne povas esti interrompitaj</string>\n    <string name=\"no_comments\">Neniu komento</string>\n    <string name=\"overwrite_unrelated_warning\">Dosiero kun ĉi tiu nomo jam ekzistas</string>\n    <string name=\"overwrite_finished_warning\">Elŝutita dosieron kun ĉi tiu nomo jam ekzistas</string>\n    <string name=\"download_already_pending\">Estas pritraktata elŝuto kun ĉi tiu nomo</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe estis fermita dum laborante sur la dosiero</string>\n    <string name=\"error_insufficient_storage_left\">Neniu spaco havebla sur la aparato</string>\n    <string name=\"error_progress_lost\">Progreso perdita, ĉar la dosiero estis forviŝita</string>\n    <string name=\"error_timeout\">Eltempiĝo de Konekto</string>\n    <string name=\"drawer_header_description\">Ŝangi la servon, nuntempe elektita:</string>\n    <string name=\"default_kiosk_page_summary\">Implicita Kiosko</string>\n    <string name=\"no_one_watching\">Neniu spektas</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s spektanto</item>\n        <item quantity=\"other\">%s spektantoj</item>\n    </plurals>\n    <string name=\"no_one_listening\">Neniu aŭskultas</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s aŭskultanto</item>\n        <item quantity=\"other\">%s aŭskultantoj</item>\n    </plurals>\n    <string name=\"seek_duration_title\">Daŭro de rapidpluiga/revolva serĉo</string>\n    <string name=\"peertube_instance_url_title\">Instancoj de PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Elekti viajn preferitajn instancojn de PeerTube</string>\n    <string name=\"peertube_instance_url_help\">Trovu la instancojn ke vi ŝatas ĉe %s</string>\n    <string name=\"peertube_instance_add_title\">Aldoni instanco</string>\n    <string name=\"peertube_instance_add_help\">Eniri la ligilon de la instanco</string>\n    <string name=\"peertube_instance_add_fail\">Ne povis validigi instanco</string>\n    <string name=\"peertube_instance_add_https_only\">Nur HTTPS ligiloj estas subtenitaj</string>\n    <string name=\"peertube_instance_add_exists\">La instanco jam ekzistas</string>\n    <string name=\"local\">Lokaj</string>\n    <string name=\"recently_added\">Freŝe aldonitaj</string>\n    <string name=\"most_liked\">La plej ŝatitaj</string>\n    <string name=\"playlist_no_uploader\">Aŭtomate generita (neniu alŝutilo trovita)</string>\n    <string name=\"recovering\">Reakiranta</string>\n    <string name=\"error_download_resource_gone\">Ne povas reakiri tion elŝuton</string>\n    <string name=\"choose_instance_prompt\">Elektu instancon</string>\n    <string name=\"clear_download_history\">Forviŝi la historion de elŝutoj</string>\n    <string name=\"delete_downloaded_files\">Forviŝi elŝutitajn dosierojn</string>\n    <string name=\"videos_string\">Filmetoj</string>\n    <string name=\"permission_display_over_apps\">Doni la permeson por afiŝiĝi supre aliaj apoj</string>\n    <string name=\"app_language_title\">Preferata aplingvo</string>\n    <string name=\"systems_language\">Sistema</string>\n    <string name=\"subtitle_activity_recaptcha\">Premu “Finita” kiam solvita</string>\n    <string name=\"done\">Finita</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekundo</item>\n        <item quantity=\"other\">%d sekundoj</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuto</item>\n        <item quantity=\"other\">%d minutoj</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d horo</item>\n        <item quantity=\"other\">%d horoj</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d tago</item>\n        <item quantity=\"other\">%d tagoj</item>\n    </plurals>\n    <!-- Feed -->\n    <string name=\"feed_groups_header_title\">Abonfluoj grupoj</string>\n    <string name=\"feed_oldest_subscription_update\">Lasta ĝisdatigo: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Ne ŝarĝitaj: %d</string>\n    <string name=\"feed_notification_loading\">Ŝarĝante abonfluon…</string>\n    <string name=\"feed_processing_message\">Procesante abonfluon…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Seletkti abonojn</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d selektita</item>\n        <item quantity=\"other\">%d selektitaj</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">No subscription selected</string>\n    <string name=\"feed_group_dialog_empty_name\">Malplena grupa nomo</string>\n    <string name=\"feed_group_dialog_delete_message\">Ĉu vi volas forviŝi tion grupon?</string>\n    <string name=\"feed_create_new_group_button_title\">Nova</string>\n    <string name=\"settings_category_feed_title\">Abonfluo</string>\n    <string name=\"feed_update_threshold_title\">Abonflua ĝisdatiga sojlo</string>\n    <string name=\"feed_update_threshold_summary\">Tempo post lasta ĝisdatigo antaŭ abono estas konsiderita malĝisdatigita — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Ĉiam ĝisdatigi</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Ŝarĝi el dediĉita abonfluo kiam ĝi haveblas</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Havebla en kelkaj servoj, ĝi estas ĝenerale multe pli rapida, sed povas doni limigita kvanto da aĵoj kaj ofte malpreciza informoj (ekzemple: neniu duracio, ajâ tipo, neniu « nuna » statuso).</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Ŝalti rapidan modon</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Malŝati rapidan modon</string>\n    <string name=\"new_seek_duration_toast\">Pro ExoPlayer limoj, la serĉa daŭro estas metita %d sekundojn</string>\n    <string name=\"mute\">Mutigi</string>\n    <string name=\"unmute\">Malmutigi</string>\n    <string name=\"content_not_supported\">Tio enhavo ne estas ankoraŭ subtenata per NewPipe.\\n\\nĜi espereble estos en sekvanta versio.</string>\n    <string name=\"infinite_videos\">∞ filmetoj</string>\n    <string name=\"more_than_100_videos\">100+ filmetoj</string>\n    <string name=\"artists\">Artistoj</string>\n    <string name=\"albums\">Albumoj</string>\n    <string name=\"songs\">Kantoj</string>\n    <string name=\"notification_action_nothing\">Nenio</string>\n    <string name=\"notification_action_shuffle\">Miksi</string>\n    <string name=\"notification_action_repeat\">Ripeti</string>\n    <string name=\"search_showing_result_for\">Montrante rezultojn pri: %s</string>\n    <string name=\"open_with\">Malfermi per</string>\n    <string name=\"restricted_video\">Tiu ĉi filmeto havas aĝminimumon. \\n \\nŜaltu «%1$s» en la agordoj, se vi volus vidi ĝin.</string>\n    <string name=\"night_theme_title\">Malhela etoso</string>\n    <string name=\"notification_colorize_title\">farbi sciigon</string>\n    <string name=\"notification_action_buffering\">Alŝuto</string>\n    <string name=\"notification_scale_to_square_image_title\">Stuci bildeton ĝis 1:1 proportio</string>\n    <string name=\"off\">Malŝatita</string>\n    <string name=\"on\">Ŝaltita</string>\n    <string name=\"metadata_tags\">Etikedoj</string>\n    <string name=\"download_has_started\">Elŝutado komenciĝis</string>\n    <string name=\"georestricted_content\">Tiu enaĵo ne disponeblas en via lando.</string>\n    <string name=\"recent\">Freŝaj</string>\n    <string name=\"video_detail_by\">De %s</string>\n    <string name=\"channel_created_by\">Kreita de %s</string>\n    <string name=\"open_website_license\">Malfermi retejon</string>\n    <string name=\"metadata_privacy_internal\">Interna</string>\n    <string name=\"metadata_privacy_unlisted\">Nelistita</string>\n    <string name=\"metadata_privacy_private\">Privata</string>\n    <string name=\"metadata_privacy_public\">Publika</string>\n    <string name=\"metadata_language\">Lingvo</string>\n    <string name=\"metadata_age_limit\">Limo de aĝo</string>\n    <string name=\"metadata_category\">Kategorio</string>\n    <string name=\"dont_show\">Ne montri</string>\n    <string name=\"low_quality_smaller\">Malalta kvalito (malpli larĝa)</string>\n    <string name=\"high_quality_larger\">Alta kvalito (pli larĝa)</string>\n    <string name=\"never\">Neniam</string>\n    <string name=\"description_tab_description\">Priskribo</string>\n    <string name=\"comments_tab_description\">Komentoj</string>\n    <string name=\"show_description_title\">Montri priskribon</string>\n    <string name=\"notification_scale_to_square_image_summary\">Stuci la antaŭvidan bildeton de la filmo en la sciigo de proporcio 16:9 al 1:1</string>\n    <string name=\"show_meta_info_title\">Montri metadatumojn</string>\n    <string name=\"mark_as_watched\">Marki spektita</string>\n    <string name=\"show_meta_info_summary\">Malŝatu por kaŝi metadatumujojn kio havas aldonajn informojn pri la elsendfluisto, enhavo de la fluo, aŭ serĉpto</string>\n    <string name=\"show_description_summary\">Malŝaltu por kaŝi priskribojn kaj aldonajn informojn de filmetoj</string>\n    <string name=\"clear_queue_confirmation_title\">Peti por konfirmo antaŭ vakigado atendvico</string>\n    <string name=\"clear_queue_confirmation_summary\">Via atendvico povas anstataŭigi se vi ŝanĝi al malsama ludilo</string>\n    <string name=\"clear_queue_confirmation_description\">La aktiva ludila atendvico anstataŭigos</string>\n    <string name=\"notification_action_4_title\">Kvina agobutono</string>\n    <string name=\"notification_action_0_title\">Unua agobutono</string>\n    <string name=\"notification_action_1_title\">Dua agobutono</string>\n    <string name=\"notification_action_2_title\">Tria agobutono</string>\n    <string name=\"notification_action_3_title\">Kvara agobutono</string>\n    <string name=\"crash_the_player\">Kraŝi la ludilo</string>\n    <string name=\"enqueued\">Envicigita</string>\n    <string name=\"enqueue_stream\">Envicigi</string>\n    <string name=\"volume\">Laŭteco</string>\n    <string name=\"none\">Neniu</string>\n    <string name=\"notification_colorize_summary\">Permesi al Android agordi koloron de sciigo laŭ la precipa koloro de videaĵminiaturo (noti, ke ĉi tio ne disponeblas en ĉiuj iloj)</string>\n    <string name=\"auto_queue_toggle\">Memaga vicigado</string>\n    <string name=\"right_gesture_control_title\">Ago de dekstra gesto</string>\n    <string name=\"notification_actions_summary\">Redakti ĉiun agon de sciigo per tuŝi gin. Elekti maksimume tri agon por montri en la kompakta sciigo per markobutonoj dekstre.</string>\n    <string name=\"prefer_original_audio_summary\">Elekti la originalan aŭdiotrakon malgraŭ lingvo</string>\n    <string name=\"prefer_descriptive_audio_summary\">Elekti aŭdiotrakon kun priskriboj por vidmalkapabluloj kiam ebla</string>\n    <string name=\"left_gesture_control_title\">Ago de maldekstra gesto</string>\n    <string name=\"prefer_descriptive_audio_title\">Preferi priskribajn aŭdiotrakojn</string>\n    <string name=\"progressive_load_interval_summary\">Ŝangi la grandecon de elŝuta intervalo por progresiva enhavo (aktuale %s). Malplia valoro eble povas rapidigi ĝian komencan ŝargadon</string>\n    <string name=\"prefer_original_audio_title\">Preferi originalan aŭdaĵon</string>\n    <string name=\"right_gesture_control_summary\">Elekti geston por dekstra duono de ludil-ekrano</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Utila, ekzemple, se vi uzas kaptelefonon, kiu havas difektajn fizikajn butonojn</string>\n    <string name=\"progressive_load_interval_title\">Grandeco de intervalo de legada elŝuto</string>\n    <string name=\"brightness\">Heleco</string>\n    <string name=\"notification_actions_at_most_three\">Vi povas elekti maksimume tri agoj por montri en la kompakta sciigo!</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignori eventoj de aparataroj plurmediaj butonoj</string>\n    <string name=\"left_gesture_control_summary\">Elekti geston por maldekstra duono de ludil-ekrano</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Ŝalti \\\"Limigitan Reĝimon\\\" de YouTube</string>\n    <string name=\"fast_mode\">Rapida reĝimo</string>\n    <string name=\"unsupported_url_dialog_message\">Ne eblas rekoni la ligilon. Ĉu malfermi per alia apo\\?</string>\n    <string name=\"recaptcha_cookies_cleared\">Kuketojn de reCAPTCHA estis forigita</string>\n    <string name=\"show_age_restricted_content_summary\">Montri enhavon, kiu eble maltaŭgas por infanoj, ĉar ĝi havas aĝo-limon (kiel \\\"18+\\\")</string>\n    <string name=\"streams_notification_channel_name\">Novaj fluoj</string>\n    <string name=\"remote_search_suggestions\">Foraj serĉsugestoj</string>\n    <string name=\"error_report_channel_description\">Sciigoj por raporti erarojn</string>\n    <string name=\"loading_metadata_title\">Ŝargante metadatumoj…</string>\n    <string name=\"hash_channel_description\">Sciigo por kreado de haketaĵoj de filmetoj</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube provizas \\\"Limigitan Reĝimon\\\", kiu kaŝas enhavon, kiu potence maltaŭgas por infanoj</string>\n    <string name=\"restricted_video_no_stream\">Ĉi tiu filmeto havas aĝminimumon. \\nPro novaj reguloj de YouTube, kiuj rilatas filmojn kun minimuma aĝo, NewPipe ne povas atingi ajnan fluon de ĉi tiu filmo kaj tial ne povas ludi ĝin.</string>\n    <string name=\"error_report_channel_name\">Sciigo por erar-raportoj</string>\n    <string name=\"notifications\">Sciigoj</string>\n    <string name=\"settings_category_player_notification_title\">Ludila sciigo</string>\n    <string name=\"hash_channel_name\">Sciigo por haketado de filmetoj</string>\n    <string name=\"local_search_suggestions\">Lokaj serĉsugestoj</string>\n    <string name=\"start_main_player_fullscreen_title\">Ŝalti ĉefan ludilon plenekrane</string>\n    <string name=\"streams_notification_channel_description\">Sciigo por novaj fluoj de abonoj</string>\n    <string name=\"clear_cookie_title\">Forigi kuketojn de reCAPTCHA</string>\n    <string name=\"settings_category_player_notification_summary\">Agordi la sciigon por ĉi-momente ludantaj datumtorentoj</string>\n    <string name=\"start_main_player_fullscreen_summary\">Ne ekludu filmojn en la etludilo, sed ŝalti plenekranan reĝimon rekte, se memaga turniĝo estas ŝaltita. Vi ankoraŭ povus aliri la etludilon elirinte la plenekranan reĝimon.</string>\n    <string name=\"clear_cookie_summary\">Forigi kuketojn, kiujn NewPipe konservas, kiam vi solvas reCAPTCHA-taskojn</string>\n    <string name=\"error_report_notification_title\">NewPipe renkontis eraron, tuŝi por raporti</string>\n    <string name=\"main_tabs_position_title\">Pozicio de la ĉefaj langetoj</string>\n    <string name=\"main_tabs_position_summary\">Transloki la ĉefan langet-elektilon al la malsupro</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nova fluo</item>\n        <item quantity=\"other\">%s novaj fluoj</item>\n    </plurals>\n    <string name=\"error_report_open_issue_button_text\">Raporti per GitHub</string>\n    <string name=\"comments_are_disabled\">Komentoj malŝaltitas</string>\n    <string name=\"error_report_notification_toast\">Eraro okazis, vidu sciigon</string>\n    <string name=\"no_live_streams\">Neniuj tujelsendoj</string>\n    <string name=\"no_streams\">Neniuj fluoj</string>\n    <string name=\"copy_for_github\">Kopii formatitan raporton</string>\n    <string name=\"import_subscriptions_hint\">Importi aŭ eksporti abonojn per la tri-punkta menuo</string>\n    <string name=\"msg_calculating_hash\">Kalkulado de haketaĵo</string>\n    <string name=\"faq_title\">Oftaj demandoj</string>\n    <string name=\"no_dir_yet\">Neniu dosierujo por elŝutoj agordita, bonvolu elekti la preferatan elŝuto-dosierujon nun</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"related_items_tab_description\">Rilatajn erojn</string>\n    <string name=\"recaptcha_solve\">Solvi</string>\n    <string name=\"msg_failed_to_copy\">Malsukcesis kopii al la tondujo</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Oni petos al vi kien salvi ĉiujn elŝutojn</string>\n    <string name=\"yes\">Jes</string>\n    <string name=\"no\">Ne</string>\n    <string name=\"remove_watched_popup_title\">Ĉu forigu spektitajn filmetojn?</string>\n    <string name=\"youtube_music_premium_content\">Ĉu tiu filmeto sole haveblas al abonantoj de YouTube Music Premium, do ĝi ne spekteblas nek elŝuteblas de NewPipe.</string>\n    <string name=\"audio_track_present_in_video\">Sono devus jam esti en ĉi tiu fluo</string>\n    <string name=\"no_video_streams_available_for_external_players\">Neniu filmofluo ludeblas por ekstera ludilo</string>\n    <string name=\"channel_tab_videos\">Filmetoj</string>\n    <string name=\"remove_watched_popup_warning\">Filmetoj kiuj spektiĝis antaŭ aŭ post sia aldoniĝo al la ludlisto foriĝus.. \\nĈu vi certas? Ĉi tio nemalfareblus!</string>\n    <string name=\"reset_settings_summary\">Restarigi implicitajn agordojn</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Jes, kaj ankaŭ parte spektitajn filmetojn</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-es/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Publicado en %1$s</string>\n    <string name=\"no_player_found\">No se encontró ningún reproductor de retransmisiones. ¿Instalar VLC\\?</string>\n    <string name=\"install\">Instalar</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"open_in_browser\">Abrir en el navegador</string>\n    <string name=\"share\">Compartir</string>\n    <string name=\"download\">Descargar</string>\n    <string name=\"search\">Buscar</string>\n    <string name=\"settings\">Ajustes</string>\n    <string name=\"did_you_mean\">¿Quisiste decir «%1$s»\\?</string>\n    <string name=\"share_dialog_title\">Compartir con</string>\n    <string name=\"download_path_title\">Carpeta de descarga de vídeo</string>\n    <string name=\"download_path_summary\">Los archivos de vídeo descargados se almacenan aquí</string>\n    <string name=\"download_path_dialog_title\">Elija la carpeta de descarga para los archivos de vídeo</string>\n    <string name=\"default_resolution_title\">Resolución predefinida</string>\n    <string name=\"play_with_kodi_title\">Reproducir con Kodi</string>\n    <string name=\"kore_not_found\">¿Instalar la aplicación Kode que falta\\?</string>\n    <string name=\"show_play_with_kodi_title\">Mostrar opción «Reproducir con Kodi»</string>\n    <string name=\"show_play_with_kodi_summary\">Mostrar una opción para reproducir un vídeo a través de Kodi media center</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Formato de audio predefinido</string>\n    <string name=\"download_dialog_title\">Descargar</string>\n    <string name=\"unsupported_url\">No se admite el URL</string>\n    <string name=\"use_external_video_player_title\">Usar reproductor de vídeo externo</string>\n    <string name=\"use_external_audio_player_title\">Usar reproductor de audio externo</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"dark_theme_title\">Oscuro</string>\n    <string name=\"light_theme_title\">Claro</string>\n    <string name=\"settings_category_appearance_title\">Apariencia</string>\n    <string name=\"background_player_playing_toast\">Reproduciendo en segundo plano</string>\n    <string name=\"content_not_available\">Contenido no disponible</string>\n    <string name=\"download_path_audio_summary\">Los archivos de audio descargados se almacenan aquí</string>\n    <string name=\"download_path_audio_dialog_title\">Elija la carpeta de descarga para los archivos de audio</string>\n    <string name=\"download_path_audio_title\">Carpeta de descarga de audio</string>\n    <string name=\"settings_category_video_audio_title\">Vídeo y audio</string>\n    <string name=\"general_error\">Error</string>\n    <string name=\"network_error\">Error de conexión</string>\n    <string name=\"could_not_load_thumbnails\">No se pudo cargar las miniaturas</string>\n    <string name=\"parsing_error\">No se pudo analizar el sitio web</string>\n    <string name=\"show_next_and_similar_title\">Mostrar vídeos \\'Siguientes\\' y \\'Similares\\'</string>\n    <string name=\"content_language_title\">Idioma predefinido del contenido</string>\n    <string name=\"detail_thumbnail_view_description\">Reproducir vídeo; duración:</string>\n    <string name=\"detail_likes_img_view_description\">Me gusta</string>\n    <string name=\"detail_dislikes_img_view_description\">No me gusta</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Miniatura del avatar del usuario</string>\n    <string name=\"content\">Contenido</string>\n    <string name=\"show_age_restricted_content_title\">Mostrar contenido con restricción de edad</string>\n    <string name=\"main_bg_subtitle\">Toca la lupa para comenzar.</string>\n    <string name=\"duration_live\">En directo</string>\n    <string name=\"downloads\">Descargas</string>\n    <string name=\"downloads_title\">Descargas</string>\n    <string name=\"error_report_title\">Informe de error</string>\n    <string name=\"could_not_setup_download_menu\">No se pudo configurar el menú de descarga</string>\n    <string name=\"sorry_string\">Lo siento, esto no debería haber ocurrido.</string>\n    <string name=\"error_report_button_text\">Informar por correo electrónico</string>\n    <string name=\"error_snackbar_message\">Lo siento, algo salió mal.</string>\n    <string name=\"error_snackbar_action\">Informar</string>\n    <string name=\"what_device_headline\">Información:</string>\n    <string name=\"what_happened_headline\">Qué ha ocurrido:</string>\n    <string name=\"your_comment\">Tu comentario (en inglés):</string>\n    <string name=\"error_details_headline\">Detalles:</string>\n    <string name=\"video\">Vídeo</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Reintentar</string>\n    <string name=\"start\">Iniciar</string>\n    <string name=\"pause\">Pausar</string>\n    <string name=\"delete\">Borrar</string>\n    <string name=\"checksum\">Suma de comprobación</string>\n    <string name=\"ok\">Aceptar</string>\n    <string name=\"msg_name\">Nombre del archivo</string>\n    <string name=\"msg_threads\">Subprocesos</string>\n    <string name=\"msg_error\">Error</string>\n    <string name=\"msg_running\">NewPipe está descargando</string>\n    <string name=\"msg_running_detail\">Toca para ver detalles</string>\n    <string name=\"msg_wait\">Espere, por favor…</string>\n    <string name=\"msg_copied\">Copiado al portapapeles</string>\n    <string name=\"no_available_dir\">Defina una carpeta de descargas más tarde en los ajustes</string>\n    <string name=\"app_ui_crash\">La interfaz de la aplicación dejó de funcionar</string>\n    <string name=\"info_labels\">Qué:\\nSolicitud:\\nIdioma del contenido:\\nPaís del contenido:\\nIdioma de la aplicación:\\nServicio:\\nMarca de tiempo:\\nPaquete:\\nVersión:\\nVersión del SO:</string>\n    <string name=\"black_theme_title\">Negro</string>\n    <string name=\"all\">Todo</string>\n    <string name=\"open_in_popup_mode\">Abrir en modo emergente</string>\n    <string name=\"msg_popup_permission\">Se necesita este permiso\n\\npara abrir en modo emergente</string>\n    <string name=\"title_activity_recaptcha\">Reto reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Reto reCAPTCHA requerido</string>\n    <string name=\"popup_playing_toast\">Reproduciendo en modo emergente</string>\n    <string name=\"default_video_format_title\">Formato de vídeo predefinido</string>\n    <string name=\"disabled\">Deshabilitado</string>\n    <string name=\"show_higher_resolutions_title\">Mostrar resoluciones más altas</string>\n    <string name=\"show_higher_resolutions_summary\">Solo algunos dispositivos pueden reproducir vídeos en 2K / 4K</string>\n    <string name=\"default_popup_resolution_title\">Resolución predefinida de emergente</string>\n    <string name=\"controls_background_title\">Segundo plano</string>\n    <string name=\"controls_popup_title\">Emergente</string>\n    <string name=\"clear\">Limpiar</string>\n    <string name=\"popup_remember_size_pos_title\">Recordar propiedades del reproductor emergente</string>\n    <string name=\"popup_remember_size_pos_summary\">Recordar el último tamaño y posición del reproductor emergente</string>\n    <string name=\"use_external_video_player_summary\">Quita el audio en algunas resoluciones</string>\n    <string name=\"show_search_suggestions_title\">Sugerencias de búsqueda</string>\n    <string name=\"show_search_suggestions_summary\">Elegir las sugerencias a mostrar al buscar</string>\n    <string name=\"best_resolution\">Mejor resolución</string>\n    <string name=\"title_activity_about\">Acerca de NewPipe</string>\n    <string name=\"title_licenses\">Licencias de terceros</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s por %2$s, bajo %3$s</string>\n    <string name=\"tab_about\">FAQ y Acerca de</string>\n    <string name=\"tab_licenses\">Licencias</string>\n    <string name=\"app_description\">Reproducción de transmisiones ligera y libre para Android.</string>\n    <string name=\"view_on_github\">Ver en GitHub</string>\n    <string name=\"app_license_title\">Licencia de NewPipe</string>\n    <string name=\"contribution_encouragement\">Si puedes traducir, quieres cambiar el diseño, tienes ideas para mejorar el código o proponer mejoras grandes, siempre agradeceremos tu ayuda. ¡Mientras más manos participen, mejor!</string>\n    <string name=\"read_full_license\">Leer licencia</string>\n    <string name=\"contribution_title\">Contribuir</string>\n    <string name=\"subscribe_button_title\">Suscribirse</string>\n    <string name=\"subscribed_button_title\">Suscrito</string>\n    <string name=\"channel_unsubscribed\">Canal no suscrito</string>\n    <string name=\"subscription_change_failed\">No se puede cambiar la suscripción</string>\n    <string name=\"subscription_update_failed\">No se pudo actualizar la suscripción</string>\n    <string name=\"tab_subscriptions\">Suscripciones</string>\n    <string name=\"fragment_feed_title\">Novedades</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Reanudar reproducción</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Continuar reproduciendo después de las interrupciones (ej. llamadas telefónicas)</string>\n    <string name=\"settings_category_downloads_title\">Descargar</string>\n    <string name=\"settings_file_charset_title\">Caracteres permitidos en los nombres de archivo</string>\n    <string name=\"settings_file_replacement_character_summary\">Los caracteres no válidos se reemplazan por este valor</string>\n    <string name=\"settings_file_replacement_character_title\">Carácter de reemplazo</string>\n    <string name=\"charset_letters_and_digits\">Letras y dígitos</string>\n    <string name=\"charset_most_special_characters\">La mayoría de los caracteres especiales</string>\n    <string name=\"enable_search_history_title\">Historial de búsqueda</string>\n    <string name=\"enable_search_history_summary\">Almacenar búsquedas localmente</string>\n    <string name=\"enable_watch_history_title\">Historial de vistas</string>\n    <string name=\"enable_watch_history_summary\">Almacenar historial de vídeos vistos</string>\n    <string name=\"title_activity_history\">Historial</string>\n    <string name=\"action_history\">Historial</string>\n    <string name=\"notification_channel_name\">Notificación de NewPipe</string>\n    <string name=\"notification_channel_description\">Notificaciones para el reproductor de NewPipe</string>\n    <string name=\"settings_category_player_title\">Reproductor</string>\n    <string name=\"settings_category_player_behavior_title\">Funcionamiento</string>\n    <string name=\"settings_category_history_title\">Historial y caché</string>\n    <string name=\"undo\">Deshacer</string>\n    <string name=\"search_no_results\">No hay resultados</string>\n    <string name=\"empty_list_subtitle\">Nada aquí más que grillos</string>\n    <string name=\"no_subscribers\">Sin suscriptores</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s suscriptor</item>\n        <item quantity=\"many\">%s suscriptores</item>\n        <item quantity=\"other\">%s suscriptores</item>\n    </plurals>\n    <string name=\"no_views\">Sin reproducciones</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s vista</item>\n        <item quantity=\"many\">%s vistas</item>\n        <item quantity=\"other\">%s vistas</item>\n    </plurals>\n    <string name=\"no_videos\">Sin vídeos</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s vídeo</item>\n        <item quantity=\"many\">%s vídeos</item>\n        <item quantity=\"other\">%s vídeos</item>\n    </plurals>\n    <string name=\"delete_item_search_history\">¿Quieres borrar este elemento del historial de búsquedas\\?</string>\n    <string name=\"main_page_content\">Contenido de la página principal</string>\n    <string name=\"blank_page_summary\">Página en blanco</string>\n    <string name=\"kiosk_page_summary\">Página del quiosco</string>\n    <string name=\"channel_page_summary\">Página del canal</string>\n    <string name=\"select_a_channel\">Seleccione un canal</string>\n    <string name=\"no_channel_subscribed_yet\">No hay suscripciones a canales todavía</string>\n    <string name=\"select_a_kiosk\">Seleccione un quiosco</string>\n    <string name=\"trending\">Tendencias</string>\n    <string name=\"top_50\">50 mejores</string>\n    <string name=\"show_hold_to_append_summary\">Mostrar sugerencia al pulsar el botón de segundo plano o emergente en la página «Detalles:» del vídeo</string>\n    <string name=\"play_all\">Reproducir todo</string>\n    <string name=\"player_stream_failure\">No se pudo reproducir este stream</string>\n    <string name=\"player_unrecoverable_failure\">Se produjo un error irrecuperable del reproductor</string>\n    <string name=\"player_recoverable_failure\">Recuperándose del error del reproductor</string>\n    <string name=\"play_queue_remove\">Quitar</string>\n    <string name=\"play_queue_stream_detail\">Detalles</string>\n    <string name=\"play_queue_audio_settings\">Ajustes del audio</string>\n    <string name=\"unknown_content\">[Desconocido]</string>\n    <string name=\"start_here_on_background\">Comenzar a reproducir en segundo plano</string>\n    <string name=\"start_here_on_popup\">Reproducir en modo emergente</string>\n    <string name=\"show_hold_to_append_title\">Mostrar la sugerencia \\\"Mantener presionado para poner a la cola\\\"</string>\n    <string name=\"new_and_hot\">Lo nuevo y lo mejor</string>\n    <string name=\"hold_to_append\">Mantener pulsado para añadir a la cola</string>\n    <string name=\"donation_title\">Donar</string>\n    <string name=\"donation_encouragement\">NewPipe es desarrollado por voluntarios que emplean su tiempo libre para brindarle la mejor experiencia. Haz una aportación para ayudarlos a crear un NewPipe mejor mientras disfrutan de una taza de café.</string>\n    <string name=\"give_back\">Devolver</string>\n    <string name=\"website_title\">Sitio web</string>\n    <string name=\"website_encouragement\">Visita el sitio web de NewPipe para más información y noticias.</string>\n    <string name=\"default_content_country_title\">País predefinido del contenido</string>\n    <string name=\"switch_to_background\">Cambiar a segundo plano</string>\n    <string name=\"switch_to_popup\">Cambiar a emergente</string>\n    <string name=\"switch_to_main\">Cambiar a principal</string>\n    <string name=\"drawer_open\">Abrir cajón</string>\n    <string name=\"drawer_close\">Cerrar cajón</string>\n    <string name=\"no_player_found_toast\">No se encontró ningún reproductor de retransmisiones (puedes instalar VLC para reproducirlo).</string>\n    <string name=\"always\">Siempre</string>\n    <string name=\"just_once\">Solo una vez</string>\n    <string name=\"external_player_unsupported_link_type\">Los reproductores externos no soportan este tipo de enlaces</string>\n    <string name=\"video_streams_empty\">No se encontraron transmisiones de vídeo</string>\n    <string name=\"audio_streams_empty\">No se encontraron transmisiones de audio</string>\n    <string name=\"video_player\">Reproductor de vídeo</string>\n    <string name=\"background_player\">Reproductor en segundo plano</string>\n    <string name=\"popup_player\">Reproductor emergente</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Obteniendo información…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Cargando contenido solicitado</string>\n    <string name=\"import_data_title\">Importar base de datos</string>\n    <string name=\"export_data_title\">Exportar base de datos</string>\n    <string name=\"import_data_summary\">Anula tu historial actual, suscripciones, listas de reproducción y (opcionalmente) ajustes</string>\n    <string name=\"export_data_summary\">Exportar historial, suscripciones, listas de reproducción y ajustes</string>\n    <string name=\"export_complete_toast\">Exportado</string>\n    <string name=\"import_complete_toast\">Importado</string>\n    <string name=\"no_valid_zip_file\">Archivo ZIP no válido</string>\n    <string name=\"could_not_import_all_files\">Atención: no se pudieron importar todos los archivos.</string>\n    <string name=\"override_current_data\">Esto reemplazará tu configuración actual.</string>\n    <string name=\"controls_download_desc\">Descargar archivo de retransmisión</string>\n    <string name=\"show_info\">Mostrar información</string>\n    <string name=\"tab_bookmarks\">Listas de reproducción marcadas</string>\n    <string name=\"controls_add_to_playlist_title\">Añadir a</string>\n    <string name=\"detail_drag_description\">Arrastrar para reordenar</string>\n    <string name=\"create\">Crear</string>\n    <string name=\"dismiss\">Descartar</string>\n    <string name=\"rename\">Cambiar nombre</string>\n    <string name=\"title_last_played\">Última reproducción</string>\n    <string name=\"title_most_played\">Más reproducido</string>\n    <string name=\"always_ask_open_action\">Preguntar siempre</string>\n    <string name=\"create_playlist\">Lista de reproducción nueva</string>\n    <string name=\"rename_playlist\">Cambiar nombre</string>\n    <string name=\"name\">Nombre</string>\n    <string name=\"add_to_playlist\">Añadir a la lista de reproducción</string>\n    <string name=\"set_as_playlist_thumbnail\">Definir como miniatura de lista de reproducción</string>\n    <string name=\"bookmark_playlist\">Marcar lista de reproducción</string>\n    <string name=\"unbookmark_playlist\">Quitar marcador</string>\n    <string name=\"delete_playlist_prompt\">¿Quieres borrar esta lista\\?</string>\n    <string name=\"playlist_creation_success\">Lista de reproducción creada</string>\n    <string name=\"playlist_add_stream_success\">Añadido a la lista de reproducción</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniatura de lista de reproducción cambiada.</string>\n    <string name=\"caption_none\">Sin subtítulos</string>\n    <string name=\"resize_fit\">Ajustar</string>\n    <string name=\"resize_fill\">Rellenar</string>\n    <string name=\"resize_zoom\">Zoom</string>\n    <string name=\"settings_category_debug_title\">Depuración</string>\n    <string name=\"caption_auto_generated\">Auto generados</string>\n    <string name=\"enable_leak_canary_summary\">La monitorización de fugas de memoria puede causar que la aplicación no responda al realizar el volcado de memoria</string>\n    <string name=\"enable_disposed_exceptions_title\">Informar errores fuera del ciclo de vida</string>\n    <string name=\"enable_disposed_exceptions_summary\">Forzar informe de excepciones no entregables de RX fuera del fragmento o del ciclo de actividad después del descarte</string>\n    <string name=\"use_inexact_seek_title\">Usar búsqueda rápida e inexacta</string>\n    <string name=\"use_inexact_seek_summary\">La búsqueda inexacta permite al reproductor buscar posiciones más rápido con menor precisión. Buscar de a 5, 15 o 25 segundos no funciona</string>\n    <string name=\"auto_queue_title\">Poner en cola automáticamente la siguiente transmisión</string>\n    <string name=\"auto_queue_summary\">Continuar reproducción sin repetir al añadir de forma automática un vídeo relacionado con el último visto</string>\n    <string name=\"file\">Archivo</string>\n    <string name=\"missing_file\">Archivo movido o borrado</string>\n    <string name=\"invalid_directory\">La carpeta no existe</string>\n    <string name=\"invalid_source\">No el archivo/en el origen del contenido</string>\n    <string name=\"invalid_file\">El archivo no existe o falta permiso para poder leer o escribir en él</string>\n    <string name=\"file_name_empty_error\">El nombre del archivo no puede estar vacío</string>\n    <string name=\"error_occurred_detail\">Ocurrió un error: %1$s</string>\n    <string name=\"import_title\">Importar</string>\n    <string name=\"import_from\">Importar desde</string>\n    <string name=\"export_to\">Exportar a</string>\n    <string name=\"import_ongoing\">Importando…</string>\n    <string name=\"export_ongoing\">Exportando…</string>\n    <string name=\"import_file_title\">Importar archivo</string>\n    <string name=\"previous_export\">Exportación anterior</string>\n    <string name=\"subscriptions_import_unsuccessful\">No se pudo importar suscripciones</string>\n    <string name=\"subscriptions_export_unsuccessful\">No se pudo exportar suscripciones</string>\n    <string name=\"import_youtube_instructions\">Importe sus suscripciones de YouTube desde Google Takeout\n\\n\n\\n1. Vaya a esta URL: %1$s\n\\n2. Inicie sesión si es requerido\n\\n3. Haga clic en \\\"Se incluyeron todos los datos de Youtube\\\", después en \\\"Desmarcar todo\\\", luego seleccione solamente \\\"suscripciones\\\" y haga clic en \\\"Aceptar\\\"\n\\n4. Haga clic en \\\"Paso siguiente\\\" y luego en \\\"Crear exportación\\\"\n\\n5. Haga clic en el botón de \\\"Descargar\\\" una vez que aparezca\n\\n6. Haga clic en el botón IMPORTAR ARCHIVO que se muestra abajo y seleccione el archivo zip descargado\n\\n7. [En caso de que la importación falle] Extraiga el archivo .csv (generalmente dentro de \\\"Youtube y Youtube Music/suscripciones/suscripciones.csv\\\"), haga clic en IMPORTAR ARCHIVO y seleccione el archivo csv extraído anteriormente</string>\n    <string name=\"import_soundcloud_instructions\">Importa un perfil de SoundCloud escribiendo la URL o tu ID: \\n \\n1. Habilita el «modo escritorio» en un navegador web (el sitio no está disponible para dispositivos móviles) \\n2. Ve a esta URL: %1$s \\n3. Inicia sesión cuando se te pida \\n4. Copia la URL del perfil a la que fuiste redireccionado.</string>\n    <string name=\"import_soundcloud_instructions_hint\">tuID, soundcloud.com/tuID</string>\n    <string name=\"import_network_expensive_warning\">Esta operación puede causar un uso intensivo de la red.\n\\n\n\\n¿Quieres continuar\\?</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Se vació la caché de imágenes</string>\n    <string name=\"metadata_cache_wipe_title\">Vaciar metadatos en memoria caché</string>\n    <string name=\"metadata_cache_wipe_summary\">Quitar todos los datos guardados de páginas web</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Se vació la caché de metadatos</string>\n    <string name=\"playback_speed_control\">Controles de velocidad de reproducción</string>\n    <string name=\"playback_tempo\">Ritmo</string>\n    <string name=\"playback_pitch\">Tono</string>\n    <string name=\"unhook_checkbox\">Desvincular (puede causar distorsión)</string>\n    <string name=\"no_streams_available_download\">No hay streams disponibles para descargar</string>\n    <string name=\"preferred_open_action_settings_title\">Acción de apertura preferida</string>\n    <string name=\"preferred_open_action_settings_summary\">Acción predefinida al abrir contenido: %s</string>\n    <string name=\"caption_setting_title\">Subtítulos</string>\n    <string name=\"caption_setting_description\">Modificar la escala de texto de los subtítulos y los estilos de fondo. Requiere reiniciar la aplicación para que surta efecto</string>\n    <string name=\"clear_views_history_title\">Vaciar historial de reproducciones</string>\n    <string name=\"clear_views_history_summary\">Borra el historial de contenido visto y posiciones de reproducción</string>\n    <string name=\"delete_view_history_alert\">¿Eliminar todo el historial de reproducciones\\?</string>\n    <string name=\"watch_history_deleted\">Historial de reproducciones borrado</string>\n    <string name=\"clear_search_history_title\">Vaciar historial de búsquedas</string>\n    <string name=\"clear_search_history_summary\">Borra el historial de búsqueda de palabras clave</string>\n    <string name=\"delete_search_history_alert\">¿Borrar todo el historial de búsqueda\\?</string>\n    <string name=\"search_history_deleted\">Historial de búsquedas borrado</string>\n    <string name=\"one_item_deleted\">Se ha borrado 1 elemento.</string>\n    <string name=\"app_license\">NewPipe es un software copyleft libre: puedes usarlo, estudiarlo, compartirlo y mejorarlo a voluntad. Específicamente, puedes redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU publicada por la Free Software Foundation, ya sea la versión 3 de la licencia, o (a tu elección) cualquier versión posterior.</string>\n    <string name=\"import_settings\">¿Quieres importar también los ajustes\\?</string>\n    <string name=\"privacy_policy_title\">Política de privacidad de NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">El proyecto NewPipe toma tu privacidad muy en serio. Por ello, la aplicación no recopila ningún dato sin tu consentimiento.\n\\nLa política de privacidad de NewPipe explica en detalle qué datos se envían y almacenan al enviar un informe de fallo.</string>\n    <string name=\"read_privacy_policy\">Leer política de privacidad</string>\n    <string name=\"start_accept_privacy_policy\">Para cumplir con el «Reglamento general europeo de protección de datos (GDPR)», atraemos su atención sobre la política de privacidad de NewPipe. Por favor léase cuidadosamente.\n\\nDebe aceptarlo para enviarnos el informe de error.</string>\n    <string name=\"accept\">Aceptar</string>\n    <string name=\"decline\">Declinar</string>\n    <string name=\"limit_data_usage_none_description\">Sin límite</string>\n    <string name=\"limit_mobile_data_usage_title\">Limitar la resolución al usar datos móviles</string>\n    <string name=\"minimize_on_exit_title\">Minimizar al cambiar de aplicación</string>\n    <string name=\"minimize_on_exit_summary\">Acción de cambiar a otra aplicación desde el reproductor principal — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Ninguna</string>\n    <string name=\"minimize_on_exit_background_description\">Minimizar a reproductor en segundo plano</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimizar al reproductor emergente</string>\n    <string name=\"skip_silence_checkbox\">Avance rápido durante el silencio</string>\n    <string name=\"playback_step\">Paso</string>\n    <string name=\"playback_reset\">Restablecer</string>\n    <string name=\"channels\">Canales</string>\n    <string name=\"users\">Usuarios</string>\n    <string name=\"playlists\">Listas de reproducción</string>\n    <string name=\"tracks\">Pistas</string>\n    <string name=\"missions_header_finished\">Finalizadas</string>\n    <string name=\"missions_header_pending\">Pendientes</string>\n    <string name=\"paused\">pausado</string>\n    <string name=\"queued\">en cola</string>\n    <string name=\"post_processing\">posprocesamiento</string>\n    <string name=\"recovering\">recuperando</string>\n    <string name=\"enqueue\">Añadir a cola</string>\n    <string name=\"permission_denied\">Acción denegada por el sistema</string>\n    <string name=\"file_deleted\">Archivo borrado</string>\n    <!-- download notifications -->\n    <string name=\"download_failed\">Descarga fallida</string>\n    <!-- dialog about existing downloads -->\n    <string name=\"generate_unique_name\">Generar nombre único</string>\n    <string name=\"overwrite\">Sobrescribir</string>\n    <string name=\"overwrite_unrelated_warning\">Ya existe un archivo con este nombre</string>\n    <string name=\"overwrite_finished_warning\">Ya existe un archivo descargado con este nombre</string>\n    <string name=\"overwrite_failed\">No se puede sobrescribir el archivo</string>\n    <string name=\"download_already_running\">Hay una descarga en curso con este nombre</string>\n    <string name=\"download_already_pending\">Hay una descarga pendiente con este nombre</string>\n    <string name=\"grid\">Mostrar como grilla</string>\n    <string name=\"list\">Mostrar como lista</string>\n    <string name=\"confirm_prompt\">¿Quieres vaciar el historial de descargas o borrar todos los ficheros descargados\\?</string>\n    <string name=\"stop\">Detener</string>\n    <string name=\"max_retry_msg\">Intentos máximos</string>\n    <string name=\"max_retry_desc\">Cantidad máxima de intentos antes de cancelar la descarga</string>\n    <string name=\"pause_downloads_on_mobile\">Interrumpir en redes medidas</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Útil al cambiar a Datos Móviles, solo algunas descargas no se pueden suspender</string>\n    <string name=\"enable_queue_limit\">Limitar cola de descarga</string>\n    <string name=\"enable_queue_limit_desc\">Solo se permitirá una descarga a la vez</string>\n    <string name=\"start_downloads\">Iniciar descargas</string>\n    <string name=\"pause_downloads\">Pausar descargas</string>\n    <!-- message dialog about download error -->\n    <string name=\"show_error\">Mostrar error</string>\n    <string name=\"error_file_creation\">El archivo no puede ser creado</string>\n    <string name=\"error_path_creation\">No se puede crear la carpeta de destino</string>\n    <string name=\"error_ssl_exception\">No se pudo establecer una conexión segura</string>\n    <string name=\"error_unknown_host\">No se pudo encontrar el servidor</string>\n    <string name=\"error_connect_host\">No se puede conectar al servidor</string>\n    <string name=\"error_http_no_content\">El servidor no devolvio datos</string>\n    <string name=\"error_http_unsupported_range\">El servidor no acepta descargas multi-hilos, intente de nuevo con @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">No encontrado</string>\n    <string name=\"error_postprocessing_failed\">Falló el posprocesamiento</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe se cerró mientras se trabajaba en el archivo</string>\n    <string name=\"error_insufficient_storage_left\">No hay suficiente espacio disponible en el dispositivo</string>\n    <string name=\"error_progress_lost\">Progreso perdido, porque el archivo fue borrado</string>\n    <string name=\"error_timeout\">El tiempo de conexión expiro</string>\n    <string name=\"error_download_resource_gone\">No se puede recuperar esta descarga</string>\n    <string name=\"downloads_storage_ask_title\">Preguntar dónde descargar</string>\n    <string name=\"downloads_storage_ask_summary\">Se te preguntará dónde guardar cada descarga. \\nHabilita elegir carpetas del sistema (SAF) si quieres guardar las descargas en una tarjeta SD externa</string>\n    <string name=\"downloads_storage_use_saf_title\">Usar Elegir carpetas del sistema (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">El \\'Sistema de Acceso al Almacenamiento\\' permite descargar en una tarjeta SD externa</string>\n    <string name=\"unsubscribe\">Desuscribirse</string>\n    <string name=\"tab_choose\">Elija la pestaña</string>\n    <string name=\"settings_category_updates_title\">Actualizaciones</string>\n    <string name=\"events\">Eventos</string>\n    <string name=\"app_update_notification_channel_name\">Notificación de actualización de la aplicación</string>\n    <string name=\"app_update_notification_channel_description\">Notificaciones de nuevas versiones de NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Almacenamiento externo no disponible</string>\n    <string name=\"download_to_sdcard_error_message\">No es posible descargar a una tarjeta SD externa. ¿Restablecer la ubicación de la carpeta de descarga?</string>\n    <string name=\"saved_tabs_invalid_json\">No se pudo leer las pestañas guardadas, se usarán las pestañas predefinidas</string>\n    <string name=\"restore_defaults\">Restaurar valores predefinidos</string>\n    <string name=\"restore_defaults_confirmation\">¿Quieres restaurar los valores predefinidos\\?</string>\n    <string name=\"subscribers_count_not_available\">Número de suscriptores no disponible</string>\n    <string name=\"main_page_content_summary\">Qué pestañas aparecen en la página principal</string>\n    <string name=\"conferences\">Conferencias</string>\n    <string name=\"updates_setting_title\">Actualizaciones</string>\n    <string name=\"updates_setting_description\">Mostrar una notificación para solicitar actualizar la aplicación al haber una nueva versión disponible</string>\n    <string name=\"list_view_mode\">Modo de vista de lista</string>\n    <string name=\"auto\">Automático</string>\n    <string name=\"app_update_available_notification_title\">¡Actualización de NewPipe disponible!</string>\n    <string name=\"show_comments_title\">Mostrar comentarios</string>\n    <string name=\"show_comments_summary\">Deshabilitar para ocultar comentarios</string>\n    <string name=\"autoplay_title\">Reproducción automática</string>\n    <string name=\"no_comments\">Sin comentarios</string>\n    <string name=\"error_unable_to_load_comments\">No se pudieron cargar los comentarios</string>\n    <string name=\"close\">Cerrar</string>\n    <string name=\"enable_playback_resume_title\">Continuar reproducción</string>\n    <string name=\"enable_playback_resume_summary\">Restaurar última posición de la reproducción</string>\n    <string name=\"enable_playback_state_lists_title\">Posiciones en listas</string>\n    <string name=\"enable_playback_state_lists_summary\">Mostrar indicador de posición en listas de reproducción</string>\n    <string name=\"settings_category_clear_data_title\">Vaciar datos</string>\n    <string name=\"watch_history_states_deleted\">Posiciones de reproducción borradas</string>\n    <string name=\"clear_playback_states_title\">Borrar posiciones de reproducción</string>\n    <string name=\"clear_playback_states_summary\">Borra todas las posiciones de reproducción</string>\n    <string name=\"delete_playback_states_alert\">¿Quieres borrar todas las posiciones de reproducción\\?</string>\n    <string name=\"drawer_header_description\">Activar/desactivar servicio, seleccionados actualmente:</string>\n    <string name=\"default_kiosk_page_summary\">Quiosco predeterminado</string>\n    <string name=\"no_one_watching\">Nadie está viendo</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">Visualización %s</item>\n        <item quantity=\"many\">Visualizaciones %s</item>\n        <item quantity=\"other\">Visualizaciones %s</item>\n    </plurals>\n    <string name=\"no_one_listening\">Nadie está escuchando</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s oyente</item>\n        <item quantity=\"many\">%s oyentes</item>\n        <item quantity=\"other\">%s oyentes</item>\n    </plurals>\n    <string name=\"seek_duration_title\">Duración de búsqueda al avanzar y/o retroceder</string>\n    <string name=\"peertube_instance_url_title\">Instancias de PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Selecciona tus instancias favoritas de PeerTube</string>\n    <string name=\"peertube_instance_url_help\">Encuentra las instancias que te gusten en %s</string>\n    <string name=\"peertube_instance_add_title\">Añadir instancia</string>\n    <string name=\"peertube_instance_add_help\">Ingresar URL de la instancia</string>\n    <string name=\"peertube_instance_add_fail\">No se pudo validar la instancia</string>\n    <string name=\"peertube_instance_add_https_only\">Solo se admiten URL HTTPS</string>\n    <string name=\"peertube_instance_add_exists\">La instancia ya existe</string>\n    <string name=\"local\">Local</string>\n    <string name=\"recently_added\">Añadidos recientemente</string>\n    <string name=\"most_liked\">Más gustados</string>\n    <string name=\"playlist_no_uploader\">Generado automáticamente (no se encontró creador)</string>\n    <string name=\"choose_instance_prompt\">Elige una instancia</string>\n    <string name=\"clear_download_history\">Limpiar historial de descargas</string>\n    <string name=\"delete_downloaded_files\">Borrar archivos descargados</string>\n    <string name=\"permission_display_over_apps\">Dar permiso para mostrar sobre otras aplicaciones</string>\n    <string name=\"app_language_title\">Idioma de aplicación</string>\n    <string name=\"systems_language\">Predefinido del sistema</string>\n    <string name=\"subtitle_activity_recaptcha\">Pulsa en «Hecho» al resolverlo</string>\n    <string name=\"done\">Hecho</string>\n    <string name=\"videos_string\">Vídeos</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d segundo</item>\n        <item quantity=\"many\">%d segundos</item>\n        <item quantity=\"other\">%d segundos</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Debido a limitaciones de ExoPlayer, la duración de la búsqueda fue definida en %d segundos</string>\n    <string name=\"mute\">Silenciar</string>\n    <string name=\"unmute\">Desactivar silencio</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuto</item>\n        <item quantity=\"many\">%d minutos</item>\n        <item quantity=\"other\">%d minutos</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d hora</item>\n        <item quantity=\"many\">%d horas</item>\n        <item quantity=\"other\">%d horas</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d día</item>\n        <item quantity=\"many\">%d días</item>\n        <item quantity=\"other\">%d días</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">Grupos de canales</string>\n    <string name=\"feed_oldest_subscription_update\">Última actualización de canales: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">No cargado: %d</string>\n    <string name=\"feed_notification_loading\">Cargando contenidos…</string>\n    <string name=\"feed_processing_message\">Procesando contenidos…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Elegir suscripciones</string>\n    <string name=\"feed_group_dialog_empty_selection\">No hay suscripciones seleccionadas</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d seleccionado</item>\n        <item quantity=\"many\">%d seleccionados</item>\n        <item quantity=\"other\">%d seleccionados</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">Nombre de grupo vacío</string>\n    <string name=\"feed_group_dialog_delete_message\">¿Quieres borrar este grupo?</string>\n    <string name=\"feed_create_new_group_button_title\">Nuevo</string>\n    <string name=\"settings_category_feed_title\">Contenido</string>\n    <string name=\"feed_update_threshold_title\">Velocidad de actualización del contenido</string>\n    <string name=\"feed_update_threshold_summary\">Tiempo para que una suscripción se considere desactualizada — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Actualizar siempre</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Extraer desde feed dedicado cuando esté disponible</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Disponible para algunos servicios, suele ser más rápido pero puede mostrar una cantidad limitada de ítems y a menudo información incompleta (por ejemplo falta de duración, tipo de ítem o estado)</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Habilitar modo rápido</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Deshabilitar modo rápido</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">¿Piensas que la carga de contenidos es muy lenta\\? Entonces intenta habilitar la carga rápida (puedes cambiarlo en los ajustes o pulsando el botón debajo).\n\\n\n\\nNewpipe ofrece dos formas de cargar los contenidos:\n\\n• Obtener todos los canales con suscripciones, lento pero completo.\n\\n• Usar un punto dedicado de servicio, más rápido pero usualmente incompleto.\n\\n\n\\nLa diferencia es que en la forma rápida usualmente falta algo de información, como la duración o tipo de ítem (no se puede diferenciar entre videos normales y en vivo) y puede que aparezcan menos ítems.\n\\n\n\\nYouTube es un ejemplo de un servicio que ofrece este método rápido con su listado de contenidos por RSS.\n\\n\n\\nEntonces la elección se limita a qué prefieres: velocidad o información exacta.</string>\n    <string name=\"content_not_supported\">Este contenido aún no es soportado por NewPipe.\n\\n\n\\nEsperamos que sea soportado en una versión futura.</string>\n    <string name=\"infinite_videos\">∞ vídeos</string>\n    <string name=\"more_than_100_videos\">Más de 100 vídeos</string>\n    <string name=\"artists\">Artistas</string>\n    <string name=\"albums\">Álbumes</string>\n    <string name=\"songs\">Canciones</string>\n    <string name=\"restricted_video\">Este vídeo tiene restricción de edad. \\n \\nHabilitar \\\"%1$s\\\" en los ajustes si quieres verlo.</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Sí, y también vídeos vistos parcialmente</string>\n    <string name=\"remove_watched_popup_warning\">Los vídeos que ya se hayan visto antes y después de ser añadidos a la lista de reproducción serán quitados. \\n¿Estás seguro?</string>\n    <string name=\"remove_watched_popup_title\">¿Quitar streams ya vistos?</string>\n    <string name=\"remove_watched\">Quitar vídeos ya vistos</string>\n    <string name=\"video_detail_by\">Por %s</string>\n    <string name=\"channel_created_by\">Creado por %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Miniatura de avatar del canal</string>\n    <string name=\"show_original_time_ago_summary\">Los textos originales de los servicios serán visibles en los ítems de transmisiones</string>\n    <string name=\"show_original_time_ago_title\">Mostrar tiempo atrás original en ítems</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Habilitar el «Modo restringido» de YouTube</string>\n    <string name=\"playlist_page_summary\">Página de lista de reproducción</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Mostrar solo suscripciones desagrupadas</string>\n    <string name=\"no_playlist_bookmarked_yet\">Aún no hay marcadores para listas de reproducción</string>\n    <string name=\"select_a_playlist\">Selecciona una lista de reproducción</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_report_open_issue_button_text\">Informe en GitHub</string>\n    <string name=\"copy_for_github\">Copiar informe con formato</string>\n    <string name=\"search_showing_result_for\">Mostrando resultados para: %s</string>\n    <string name=\"notification_action_shuffle\">Orden aleatorio</string>\n    <string name=\"notification_scale_to_square_image_title\">Recortar miniatura a relación de aspecto 1:1</string>\n    <string name=\"never\">Nunca</string>\n    <string name=\"wifi_only\">Solo en Wi-Fi</string>\n    <string name=\"autoplay_summary\">Comenzar reproducción automáticamente — %s</string>\n    <string name=\"title_activity_play_queue\">Reproducir cola</string>\n    <string name=\"unsupported_url_dialog_message\">No se pudo reconocer la URL. ¿Abrir con otra aplicación\\?</string>\n    <string name=\"auto_queue_toggle\">Poner en cola automáticamente</string>\n    <string name=\"clear_queue_confirmation_summary\">Cambiar de un reproductor a otro puede reemplazar la cola de reproducción</string>\n    <string name=\"clear_queue_confirmation_description\">La cola de reproducción activa será reemplazada</string>\n    <string name=\"clear_queue_confirmation_title\">Pedir confirmación antes de vaciar una cola</string>\n    <string name=\"notification_action_nothing\">Nada</string>\n    <string name=\"notification_action_buffering\">Almacenar en memoria (búfer)</string>\n    <string name=\"notification_action_repeat\">Repetir</string>\n    <string name=\"notification_actions_at_most_three\">¡Puedes seleccionar como máximo tres acciones para mostrar en la notificación compacta!</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_action_4_title\">Botón de quinta acción</string>\n    <string name=\"notification_action_3_title\">Botón de cuarta acción</string>\n    <string name=\"notification_action_2_title\">Botón de tercera acción</string>\n    <string name=\"notification_action_1_title\">Botón de segunda acción</string>\n    <string name=\"notification_action_0_title\">Botón de primera acción</string>\n    <string name=\"notification_scale_to_square_image_summary\">Recortar la relación de aspecto de la miniatura del vídeo mostrada en la notificación de 16:9 a 1:1</string>\n    <string name=\"clear_cookie_summary\">Vaciar las cookies que NewPipe guarda al resolver un reCAPTCHA</string>\n    <string name=\"show_age_restricted_content_summary\">Mostrar contenido inapropiado para niños porque tiene un limite de edad (como 18+)</string>\n    <string name=\"show_memory_leaks\">Mostrar pérdidas de memoria</string>\n    <string name=\"enqueued\">Añadido a la cola</string>\n    <string name=\"enqueue_stream\">Añadir a la cola</string>\n    <string name=\"recaptcha_cookies_cleared\">Las cookies reCAPTCHA han sido limpiadas</string>\n    <string name=\"clear_cookie_title\">Limpiar las cookies reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube provee un «Modo restringido», el cual oculta contenido potencialmente solo apto para adultos</string>\n    <string name=\"notification_colorize_title\">Ajustar color de notificación</string>\n    <string name=\"notification_colorize_summary\">Hacer que Android personalice el color de la notificación de acuerdo con el color principal de la miniatura (tenga en cuenta que esto no está disponible en todos los dispositivos)</string>\n    <string name=\"show_thumbnail_summary\">Usar miniatura como fondo de pantalla de bloqueo y notificaciones</string>\n    <string name=\"show_thumbnail_title\">Mostrar vista previa</string>\n    <string name=\"show_meta_info_summary\">Deshabilitar para ocultar información adicional sobre el creador o contenido de la transmisión</string>\n    <string name=\"show_description_summary\">Deshabilitar para ocultar la descripción del vídeo y la información adicional</string>\n    <string name=\"no_app_to_open_intent\">Ninguna aplicación en su dispositivo puede abrir esto</string>\n    <string name=\"chapters\">Capítulos</string>\n    <string name=\"recent\">Reciente</string>\n    <string name=\"msg_calculating_hash\">Calculando el hash</string>\n    <string name=\"description_tab_description\">Descripción</string>\n    <string name=\"related_items_tab_description\">Transmisiones relacionadas</string>\n    <string name=\"comments_tab_description\">Comentarios</string>\n    <string name=\"hash_channel_description\">Notificaciones sobre el progreso del hashing del vídeo</string>\n    <string name=\"hash_channel_name\">Notificación de hash de video</string>\n    <string name=\"show_meta_info_title\">Mostrar meta información</string>\n    <string name=\"show_description_title\">Mostrar descripción</string>\n    <string name=\"open_with\">Abrir con</string>\n    <string name=\"soundcloud_go_plus_content\">Esta es una pista de SoundCloud Go+, al menos en tu país, por lo que no puede ser transmitido ni descargado por NewPipe.</string>\n    <string name=\"crash_the_app\">La aplicación dejó de funcionar</string>\n    <string name=\"paid_content\">Este contenido solo está disponible para los usuarios que hayan pagado, por lo que no puede ser transmitido o descargado por NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Este vídeo solo está disponible para los miembros de YouTube Music Premium, por lo que no puede ser transmitido ni descargado por NewPipe.</string>\n    <string name=\"private_content\">Este contenido es privado, por lo que no puede ser transmitido ni descargado por NewPipe.</string>\n    <string name=\"georestricted_content\">Este contenido no está disponible en tu país.</string>\n    <string name=\"restricted_video_no_stream\">Este vídeo tiene restricción de edad.\n\\nDebido a las nuevas políticas de YouTube con vídeos con restricción de edad, NewPipe no puede acceder a ninguna de sus transmisiones de vídeo, y por lo tanto, no puede reproducirlo.</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"download_has_started\">La descarga ha comenzado</string>\n    <string name=\"recaptcha_solve\">Solucionar</string>\n    <string name=\"select_night_theme_toast\">Puedes seleccionar tu tema nocturno favorito a continuación</string>\n    <string name=\"night_theme_title\">tema para la noche</string>\n    <string name=\"night_theme_summary\">Selecciona tu tema nocturno favorito — %s</string>\n    <string name=\"auto_device_theme_title\">Automático (tema del dispositivo)</string>\n    <string name=\"show_channel_details\">Mostrar detalles del canal</string>\n    <string name=\"featured\">Destacado</string>\n    <string name=\"open_website_license\">Abrir sitio web</string>\n    <string name=\"metadata_privacy_internal\">Interno</string>\n    <string name=\"metadata_privacy_private\">Privado</string>\n    <string name=\"metadata_privacy_unlisted\">No listado</string>\n    <string name=\"metadata_privacy_public\">Público</string>\n    <string name=\"metadata_support\">Soporte</string>\n    <string name=\"metadata_language\">Idioma</string>\n    <string name=\"metadata_age_limit\">Límite de edad</string>\n    <string name=\"metadata_privacy\">Privacidad</string>\n    <string name=\"metadata_licence\">Licencia</string>\n    <string name=\"metadata_tags\">Etiquetas</string>\n    <string name=\"metadata_category\">Categoría</string>\n    <string name=\"description_select_disable\">Deshabilitar la selección de texto de la descripción</string>\n    <string name=\"description_select_enable\">Habilitar la selección de texto de la descripción</string>\n    <string name=\"description_select_note\">Ahora puede seleccionar el texto dentro de la descripción. Note que la página puede parpadear y los links no serán cliqueables mientras está en el modo de selección.</string>\n    <string name=\"feed_load_error_account_info\">No fue posible cargar el feed por \\'%s\\'.</string>\n    <string name=\"account_terminated\">Cuenta cancelada</string>\n    <string name=\"feed_load_error_fast_unknown\">El modo de muro rápido no arroja más información sobre esto.</string>\n    <string name=\"feed_load_error_terminated\">La cuenta del autor ha sido cancelada.\\nNewPipe no podrá acceder a ella en el futuro.\\n¿Quieres desuscribirte de este canal?</string>\n    <string name=\"feed_load_error\">Error al cargar el muro</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Desde Android 10 solo el \\'Sistema de Acceso al Almacenamiento\\' es soportado</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Se le preguntará dónde guardar cada descarga</string>\n    <string name=\"disable_media_tunneling_summary\">Deshabilita la tunelización de medios si experimentas una pantalla negra durante la reproducción o si la visualización de la imagen es intermitente.</string>\n    <string name=\"disable_media_tunneling_title\">Deshabilitar el túnel de medios</string>\n    <string name=\"no_dir_yet\">Aún no se ha seleccionado ninguna carpeta de descargas, elija la carpeta de descargas por defecto ahora</string>\n    <string name=\"metadata_host\">Anfitrión</string>\n    <string name=\"off\">Apagado</string>\n    <string name=\"on\">Encendido</string>\n    <string name=\"tablet_mode_title\">Modo tableta</string>\n    <string name=\"dont_show\">No mostrar</string>\n    <string name=\"low_quality_smaller\">Baja calidad (más pequeño)</string>\n    <string name=\"high_quality_larger\">Alta calidad (más grande)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Miniatura en barra de desplazamiento</string>\n    <string name=\"comments_are_disabled\">Los comentarios están deshabilitados</string>\n    <string name=\"detail_heart_img_view_description\">De corazón por el creador</string>\n    <string name=\"mark_as_watched\">Marcar como visto</string>\n    <string name=\"remote_search_suggestions\">Sugerencias de búsqueda remota</string>\n    <string name=\"local_search_suggestions\">Sugerencias de búsqueda local</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Descarga %1$s eliminada</item>\n        <item quantity=\"many\">Descargas %1$s eliminadas</item>\n        <item quantity=\"other\">Descargas %1$s eliminadas</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Descarga finalizada</item>\n        <item quantity=\"many\">%s descargas finalizadas</item>\n        <item quantity=\"other\">%s descargas finalizadas</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Desliza los elementos para removerlos</string>\n    <string name=\"start_main_player_fullscreen_summary\">Si la rotación automática está bloqueada, no inicie los videos en el mini reproductor, sino pase directamente a modo de pantalla completa. Aún podrá acceder al mini reproductor al salir del modo pantalla completa</string>\n    <string name=\"start_main_player_fullscreen_title\">Iniciar reproductor principal en pantalla completa</string>\n    <string name=\"enqueued_next\">Añadido el siguiente vídeo a la cola</string>\n    <string name=\"enqueue_next_stream\">Añadir el siguiente vídeo a la cola</string>\n    <string name=\"processing_may_take_a_moment\">Procesando… Podría tomar un momento</string>\n    <string name=\"check_for_updates\">Buscar actualizaciones</string>\n    <string name=\"manual_update_description\">Buscar nuevas versiones manualmente</string>\n    <string name=\"checking_updates_toast\">Buscando actualizaciones…</string>\n    <string name=\"feed_new_items\">Nuevos elementos en el feed</string>\n    <string name=\"crash_the_player\">Cerrar abruptamente el reproductor</string>\n    <string name=\"show_crash_the_player_summary\">Muestra una opción de cierre abrupto al usar el reproductor</string>\n    <string name=\"show_crash_the_player_title\">Mostrar \\\"Cerrar abruptamente el reproductor\\\"</string>\n    <string name=\"error_report_channel_description\">Notificaciones para informar errores</string>\n    <string name=\"error_report_channel_name\">Notificación de informe de errores</string>\n    <string name=\"error_report_notification_title\">NewPipe ha detectado un error, pulse aquí para informar</string>\n    <string name=\"error_report_notification_toast\">Se produjo un error, vea la notificación</string>\n    <string name=\"create_error_notification\">Crear una notificación de error</string>\n    <string name=\"show_error_snackbar\">Mostrar una barra de error</string>\n    <string name=\"no_appropriate_file_manager_message\">No se ha encontrado un gestor de archivos apropiado para esta acción. \\nPor favor, instala un gestor de archivos o intenta deshabilitarlo \\'%s\\' en los ajustes de la descarga</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">No se encontró ningún administrador de archivos apropiado para esta acción. \n\\n Instale un administrador de archivos compatible con Storage Access Framework</string>\n    <string name=\"detail_pinned_comment_view_description\">Comentario fijado</string>\n    <string name=\"leak_canary_not_available\">LeakCanary no está disponible</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer valor por defecto</string>\n    <string name=\"notifications\">Notificaciones</string>\n    <string name=\"streams_notification_channel_name\">Nuevos streams</string>\n    <string name=\"settings_category_player_notification_title\">Notificación del reproductor</string>\n    <string name=\"settings_category_player_notification_summary\">Configurar notificación de la reproducción en curso</string>\n    <string name=\"you_successfully_subscribed\">Ahora te has suscrito a este canal</string>\n    <string name=\"any_network\">Cualquier red</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"check_new_streams\">Comprobar la existencia de nuevos directos</string>\n    <string name=\"enable_streams_notifications_title\">Notificaciones de nuevos directos</string>\n    <string name=\"enable_streams_notifications_summary\">Notificar de nuevos directos desde las suscripciones</string>\n    <string name=\"streams_notifications_interval_title\">Frecuencia de comprobación</string>\n    <string name=\"delete_downloaded_files_confirm\">¿Desea borrar del disco todos los archivos descargados\\?</string>\n    <string name=\"notifications_disabled\">Las notificaciones están deshabilitadas</string>\n    <string name=\"get_notified\">Recibir notificaciones</string>\n    <string name=\"toggle_all\">Conmutar todo</string>\n    <string name=\"loading_stream_details\">Cargando detalles del directo…</string>\n    <string name=\"streams_notification_channel_description\">Notificaciones sobre nuevos directos para suscriptores</string>\n    <string name=\"streams_notifications_network_title\">Se requiere conexión a red</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nuevo directo</item>\n        <item quantity=\"many\">%s nuevos directos</item>\n        <item quantity=\"other\">%s nuevos directos</item>\n    </plurals>\n    <string name=\"percent\">Porcentaje</string>\n    <string name=\"semitone\">Semitono</string>\n    <string name=\"streams_not_yet_supported_removed\">No se muestran flujos cuya descarga aún no está soportada</string>\n    <string name=\"selected_stream_external_player_not_supported\">El flujo seleccionado no es soportado por reproductores externos</string>\n    <string name=\"no_audio_streams_available_for_external_players\">No hay flujos de audio disponibles para reproductores externos</string>\n    <string name=\"no_video_streams_available_for_external_players\">No hay flujos de video disponibles para reproductores externos</string>\n    <string name=\"select_quality_external_players\">Elija la calidad para reproductores externos</string>\n    <string name=\"unknown_format\">Formato desconocido</string>\n    <string name=\"unknown_quality\">Calidad desconocida</string>\n    <string name=\"progressive_load_interval_title\">Tamaño del intervalo de carga de reproducción</string>\n    <string name=\"faq\">Ver en la página web</string>\n    <string name=\"faq_title\">Preguntas frecuentes</string>\n    <string name=\"faq_description\">Si tienes problemas al usar la aplicación, ¡Asegúrate de verificar estas respuestas a preguntas comunes!</string>\n    <string name=\"sort\">Ordenar</string>\n    <string name=\"fast_mode\">Modo rápido</string>\n    <string name=\"import_subscriptions_hint\">Importa o exporta las suscripciones desde el menú con los tres puntos</string>\n    <string name=\"app_update_unavailable_toast\">Está ejecutando la última versión de NewPipe</string>\n    <string name=\"app_update_available_notification_text\">Pulsa para descargar %s</string>\n    <string name=\"night_theme_available\">Esta opción sólo está disponible si %s está seleccionado para el tema</string>\n    <string name=\"unset_playlist_thumbnail\">Desactivar las miniaturas permanente</string>\n    <string name=\"msg_failed_to_copy\">Error al copiar al portapapeles</string>\n    <string name=\"card\">Tarjeta</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplicado añadido %d vez/veces</string>\n    <string name=\"duplicate_in_playlist\">Las listas de reproducción que están en gris ya contienen este elemento.</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Útil, por ejemplo, si está utilizando un auricular con botones físicos rotos</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorar eventos para botones multimedia de hardware</string>\n    <string name=\"remove_duplicates_title\">¿Eliminar los duplicados\\?</string>\n    <string name=\"remove_duplicates_message\">¿Quieres eliminar todas las secuencias duplicadas de esta lista de reproducción?</string>\n    <string name=\"feed_hide_streams_title\">Mostrar las siguientes secuencias</string>\n    <string name=\"feed_show_hide_streams\">Mostrar/ocultar secuencias</string>\n    <string name=\"feed_show_upcoming\">Próximamente</string>\n    <string name=\"remove_duplicates\">Eliminar los duplicados</string>\n    <string name=\"feed_show_watched\">Completamente visto</string>\n    <string name=\"feed_show_partially_watched\">Parcialmente visto</string>\n    <string name=\"left_gesture_control_title\">Acción del gesto en la izquierda</string>\n    <string name=\"right_gesture_control_title\">Acción del gesto a la derecha</string>\n    <string name=\"brightness\">Brillo</string>\n    <string name=\"volume\">Volumen</string>\n    <string name=\"none\">Ninguno</string>\n    <string name=\"left_gesture_control_summary\">Elige un gesto para la mitad izquierda de la pantalla del reproductor</string>\n    <string name=\"right_gesture_control_summary\">Elige un gesto para la mitad derecha de la pantalla del reproductor</string>\n    <string name=\"prefer_original_audio_title\">Prefiero el audio original</string>\n    <string name=\"prefer_original_audio_summary\">Selecciona la pista de audio original independientemente del idioma</string>\n    <string name=\"prefer_descriptive_audio_title\">Prefiero un audio descriptivo</string>\n    <string name=\"prefer_descriptive_audio_summary\">Selecciona una pista de audio con descripciones para personas con discapacidad visual, si está disponible</string>\n    <string name=\"play_queue_audio_track\">Audio: %s</string>\n    <string name=\"audio_track\">Pista de audio</string>\n    <string name=\"audio_track_present_in_video\">Ya debería existir una pista de audio en esta transmisión</string>\n    <string name=\"select_audio_track_external_players\">Selecciona una pista de audio para reproductores externos</string>\n    <string name=\"unknown_audio_track\">Desconocido</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Utilice la función de respaldo del decodificador de ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Utiliza siempre la configuración de ExoPlayer para la interfaz de salida del video como una solución alternativa</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"audio_track_type_dubbed\">doblado</string>\n    <string name=\"audio_track_type_descriptive\">descriptivo</string>\n    <string name=\"progressive_load_interval_summary\">Cambia el tamaño del intervalo de carga en contenidos progresivos (actualmente %s). Un valor más bajo puede acelerar la carga inicial</string>\n    <string name=\"settings_category_exoplayer_title\">Ajustes de ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">Gestiona algunos ajustes de ExoPlayer. Estos cambios requieren reiniciar el reproductor para que surtan efecto</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Habilita 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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\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</string>\n    <string name=\"main_tabs_position_title\">Posición de las pestañas principales</string>\n    <string name=\"main_tabs_position_summary\">Mover el selector de la pestaña principal a la parte inferior</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Como se sabe que este dispositivo no es compatible con la tunelización de medios, esta función está desactivada de forma predeterminada.</string>\n    <string name=\"no_streams\">Sin retransmisiones</string>\n    <string name=\"no_live_streams\">Sin transmisiones en directo</string>\n    <string name=\"channel_tab_videos\">Vídeos</string>\n    <string name=\"metadata_subscribers\">Suscriptores</string>\n    <string name=\"show_channel_tabs_summary\">Qué pestañas se muestran en las páginas del canal</string>\n    <string name=\"show_channel_tabs\">Pestañas del canal</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"loading_metadata_title\">Cargando metadatos…</string>\n    <string name=\"feed_fetch_channel_tabs\">Recuperar las fichas del canal</string>\n    <string name=\"channel_tab_about\">Acerca de</string>\n    <string name=\"channel_tab_albums\">Álbumes</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Pestañas para recuperar al actualizar el canal. Esta opción no tiene efecto si el canal se actualiza en modo rápido.</string>\n    <string name=\"channel_tab_playlists\">Listas de reproducción</string>\n    <string name=\"channel_tab_tracks\">Pistas</string>\n    <string name=\"channel_tab_channels\">Canales</string>\n    <string name=\"channel_tab_livestreams\">En directo</string>\n    <string name=\"toggle_screen_orientation\">Alternar la orientación de la pantalla</string>\n    <string name=\"toggle_fullscreen\">Alternar a pantalla completa</string>\n    <string name=\"next_stream\">Siguiente retransmisión</string>\n    <string name=\"open_play_queue\">Abrir la cola de reproducción</string>\n    <string name=\"forward\">Avanzar</string>\n    <string name=\"rewind\">Rebobinar</string>\n    <string name=\"replay\">Volver a reproducir</string>\n    <string name=\"play\">Reproducir</string>\n    <string name=\"more_options\">Más opciones</string>\n    <string name=\"duration\">Duración</string>\n    <string name=\"previous_stream\">Retransmisión anterior</string>\n    <string name=\"image_quality_title\">Calidad de la imagen</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"image_quality_low\">Baja calidad</string>\n    <string name=\"metadata_avatars\">Avatares</string>\n    <string name=\"metadata_subchannel_avatars\">Avatares de los subcanales</string>\n    <string name=\"image_quality_none\">No cargar las imágenes</string>\n    <string name=\"image_quality_high\">Calidad alta</string>\n    <string name=\"image_quality_medium\">Calidad media</string>\n    <string name=\"metadata_uploader_avatars\">avatares subidos</string>\n    <string name=\"metadata_banners\">Banners</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"metadata_thumbnails\">Miniaturas</string>\n    <string name=\"share_playlist_with_list\">Compartir la lista de la dirección URL</string>\n    <string name=\"share_playlist_with_titles\">Compartir con los títulos</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">Compartir la lista de reproducción</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s respuesta</item>\n        <item quantity=\"many\">%s respuestas</item>\n        <item quantity=\"other\">%s respuestas</item>\n    </plurals>\n    <string name=\"show_more\">Ver más</string>\n    <string name=\"show_less\">Mostrar menos</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"error_insufficient_storage\">No hay suficiente espacio libre en el dispositivo</string>\n    <string name=\"settings_category_backup_restore_title\">Respaldar y restaurar</string>\n    <string name=\"reset_settings_title\">Restablecer ajustes</string>\n    <string name=\"reset_settings_summary\">Restablecer todos los ajustes a sus valores predeterminados</string>\n    <string name=\"reset_all_settings\">Restablecer todos los ajustes descartará todos sus ajustes preferidos y reiniciará la aplicación. \\n \\n¿Estás seguro que quieres continuar?</string>\n    <string name=\"yes\">Sí</string>\n    <string name=\"no\">No</string>\n    <string name=\"auto_update_check_description\">NewPipe puede buscar automáticamente nuevas versiones de vez en cuando y notificarle cuando estén disponibles.\n\\n¿Quieres habilitar esto?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">secundaria</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Compartir como lista de reproducción temporal de YouTube</string>\n    <string name=\"tab_bookmarks_short\">Lista de reproducción</string>\n    <string name=\"select_a_feed_group\">Selecciona un grupo de feed</string>\n    <string name=\"no_feed_group_created_yet\">Aún no se ha creado ningún grupo de feed</string>\n    <string name=\"feed_group_page_summary\">Página de grupo de canales</string>\n    <string name=\"search_with_service_name\">Buscar %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Buscar %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Me gusta</string>\n    <string name=\"migration_info_6_7_title\">Página Top 50 de SoundCloud eliminada</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud ha descontinuado las listas originales del Top 50. La pestaña correspondiente se ha eliminado de la página principal.</string>\n    <string name=\"migration_info_7_8_title\">YouTube tendencias combinadas eliminado</string>\n    <string name=\"migration_info_7_8_message\">YouTube ha descontinuado la página de tendencias combinadas a partir del 21 de julio de 2025. NewPipe reemplazó la página de tendencias predeterminada con tendencias en directo.\\n\\nTambién puedes seleccionar diferentes páginas de tendencias en \\\"Ajustes &gt; Contenido &gt; Contenido de la página principal\\\".</string>\n    <string name=\"trending_gaming\">Tendencias videojuegos</string>\n    <string name=\"trending_podcasts\">Tendencias pódcasts</string>\n    <string name=\"trending_movies\">Tendencias películas y programas</string>\n    <string name=\"trending_music\">Tendencias música</string>\n    <string name=\"permission_display_over_apps_permission_name\">“Permitir mostrar sobre otras aplicaciones”</string>\n    <string name=\"delete_file\">Eliminar archivo</string>\n    <string name=\"short_thousand\">%sM</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"delete_entry\">Eliminar entrada</string>\n    <string name=\"account_terminated_service_provides_reason\">Cuenta cancelada\\n\\n%1$s proporciona esta razón: %2$s</string>\n    <string name=\"entry_deleted\">Entrada eliminada</string>\n    <string name=\"player_http_403\">Error HTTP 403 recibido del servidor durante la reproducción, probablemente causado por la expiración de la URL de transmisión o una prohibición de IP</string>\n    <string name=\"player_http_invalid_status\">Error HTTP %1$s recibido del servidor durante la reproducción</string>\n    <string name=\"youtube_player_http_403\">Error HTTP 403 recibido del servidor durante la reproducción, probablemente causado por una prohibición de IP o problemas de desofuscación de la URL de transmisión</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s se negó a proporcionar datos y solicitó un inicio de sesión para confirmar que el solicitante no es un bot.\\n\\nEs posible que tu IP haya sido bloqueada temporalmente por %1$s. Puedes esperar un tiempo o cambiar a una IP diferente (por ejemplo, habilitando o deshabilitando una VPN, o cambiando de WiFi a datos móviles).</string>\n    <string name=\"short_billion\">%sMM</string>\n    <string name=\"unsupported_content_in_country\">Este contenido no está disponible para el país seleccionado actualmente.\\n\\nCambia tu selección en «Ajustes &gt; Contenido &gt; País predefinido del contenido».</string>\n    <string name=\"permission_display_over_apps_message\">Para usar el reproductor emergente, seleccione %1$s en el siguiente menú de la configuración de Android y habilite %2$s.</string>\n    <string name=\"kao_dialog_warning\">En Agosto de 2025, Google ha anunciado que, a partir de 2026/2027, todas las aplicaciones en dispositivos Android certificados requerirán que los desarrolladores envíen sus datos personales de identidad directamente a Google. Como los desarrolladores de NewPipe no están de acuerdo con este requisito, la aplicación dejará de funcionar en dispositivos Android certificados después de esa fecha.</string>\n    <string name=\"kao_dialog_more_info\">Detalles</string>\n    <string name=\"kao_solution\">Solución</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-et/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Alustamiseks toksa suurendusklaasi ikooni.</string>\n    <string name=\"upload_date_text\">Avaldatud %1$s</string>\n    <string name=\"no_player_found\">Voogesituseks puudub pleier. Kas paigaldame VLC\\?</string>\n    <string name=\"no_player_found_toast\">Voogesituseks puudub pleier (selleks võid paigaldada VLC).</string>\n    <string name=\"install\">Paigalda</string>\n    <string name=\"cancel\">Tühista</string>\n    <string name=\"open_in_browser\">Ava veebilehitsejas</string>\n    <string name=\"open_in_popup_mode\">Ava hüpikaknas</string>\n    <string name=\"share\">Jaga</string>\n    <string name=\"download\">Allalaadimine</string>\n    <string name=\"controls_download_desc\">Laadi voog alla</string>\n    <string name=\"search\">Otsi</string>\n    <string name=\"settings\">Seaded</string>\n    <string name=\"did_you_mean\">Kas mõtlesid: \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Jaga</string>\n    <string name=\"use_external_video_player_title\">Kasuta välist videopleierit</string>\n    <string name=\"use_external_video_player_summary\">Eemaldab audio mõnedel lahutustel</string>\n    <string name=\"use_external_audio_player_title\">Kasuta välist audiopleierit</string>\n    <string name=\"subscribe_button_title\">Telli</string>\n    <string name=\"subscribed_button_title\">Tellitud</string>\n    <string name=\"channel_unsubscribed\">Kanali tellimus tühistatud</string>\n    <string name=\"subscription_change_failed\">Tellimust ei saanud muuta</string>\n    <string name=\"subscription_update_failed\">Tellimust ei õnnestunud uuendada</string>\n    <string name=\"show_info\">Kuva info</string>\n    <string name=\"tab_subscriptions\">Tellimused</string>\n    <string name=\"tab_bookmarks\">Esitusloendid järjehoidjates</string>\n    <string name=\"fragment_feed_title\">Mis on uut</string>\n    <string name=\"controls_background_title\">Taust</string>\n    <string name=\"controls_popup_title\">Hüpikaken</string>\n    <string name=\"controls_add_to_playlist_title\">Lisa esitusloendisse</string>\n    <string name=\"download_path_title\">Video allalaadimise kaust</string>\n    <string name=\"download_path_summary\">Alla laetud videos salvestatakse siia</string>\n    <string name=\"download_path_dialog_title\">Vali alla laaditud videofailide kaust</string>\n    <string name=\"download_path_audio_title\">Audio allalaadimise kaust</string>\n    <string name=\"download_path_audio_summary\">Siia salvestatakse alla laaditud audiofailid</string>\n    <string name=\"download_path_audio_dialog_title\">Vali alla laaditud audiofailide kaust</string>\n    <string name=\"default_resolution_title\">Vaikelahutus</string>\n    <string name=\"default_popup_resolution_title\">Hüpikakna vaikelahutus</string>\n    <string name=\"show_higher_resolutions_title\">Kuva kõrgemaid lahutusi</string>\n    <string name=\"show_higher_resolutions_summary\">Ainult mõned seadmed suudavad esitada 2K/4K videoid</string>\n    <string name=\"play_with_kodi_title\">Esita Kodi abil</string>\n    <string name=\"kore_not_found\">Kas paigaldame puuduva Kore rakenduse\\?</string>\n    <string name=\"show_play_with_kodi_title\">Kuva valik \\\"Esita Kodi abil\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Kuva valik video esitamiseks Kodi meediakeskuse kaudu</string>\n    <string name=\"play_audio\">Heli</string>\n    <string name=\"default_audio_format_title\">Heli vaikevorming</string>\n    <string name=\"default_video_format_title\">Video vaikevorming</string>\n    <string name=\"theme_title\">Teema</string>\n    <string name=\"light_theme_title\">Hele</string>\n    <string name=\"dark_theme_title\">Tume</string>\n    <string name=\"black_theme_title\">Must</string>\n    <string name=\"popup_remember_size_pos_title\">Pea hüpikakna suurus ja asukoht meeles</string>\n    <string name=\"popup_remember_size_pos_summary\">Pea hüpikakna viimane suurus ja asukoht meeles</string>\n    <string name=\"use_inexact_seek_title\">Kasuta ebatäpset kerimist</string>\n    <string name=\"use_inexact_seek_summary\">Ebatäpne kerimine lubab meediamängijal otsida asukohta kiiremini täpsuse arvel. Sellega ei tööta 5, 15 või 25 sekundi kaupa kerimine</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Pildid kustutati vahemälust</string>\n    <string name=\"metadata_cache_wipe_title\">Kustuta metaandmed vahemälust</string>\n    <string name=\"metadata_cache_wipe_summary\">Kustuta veebilehtede andmed vahemälust</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metaandmed kustutati vahemälust</string>\n    <string name=\"auto_queue_title\">Järgmine voog automaatselt järjekorda</string>\n    <string name=\"auto_queue_summary\">Jätka lõpetamise (mitte-kordavat) esitamist lisadest järjekorra lõppu seotud voo</string>\n    <string name=\"show_search_suggestions_title\">Kuva soovitused</string>\n    <string name=\"show_search_suggestions_summary\">Vali otsingu ajal kuvatavad soovitused</string>\n    <string name=\"enable_search_history_title\">Otsinguajalugu</string>\n    <string name=\"enable_search_history_summary\">Salvesta otsinguajalugu kohalikult</string>\n    <string name=\"enable_watch_history_title\">Vaatamiste ajalugu</string>\n    <string name=\"enable_watch_history_summary\">Jälgi videote vaatamist</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Jätka taasesitust</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Jätka taasesitust pärast katkestamist (nt. telefonikõne)</string>\n    <string name=\"download_dialog_title\">Laadi alla</string>\n    <string name=\"show_next_and_similar_title\">Kuva \\'järgmine\\' ja \\'sarnased\\' videod</string>\n    <string name=\"show_hold_to_append_title\">Kuva vihjet \\\"lisamiseks hoia\\\"</string>\n    <string name=\"show_hold_to_append_summary\">Kuva vihje, kui videoandmete lehel vajutatakse tausta või hüpikakna nupule \\\"Täpsemalt:\\\"</string>\n    <string name=\"unsupported_url\">Mitte toetatud URL</string>\n    <string name=\"default_content_country_title\">Sisu vaikimisi riik</string>\n    <string name=\"content_language_title\">Sisu vaikimisi keel</string>\n    <string name=\"settings_category_player_title\">Pleier</string>\n    <string name=\"settings_category_player_behavior_title\">Käitumine</string>\n    <string name=\"settings_category_video_audio_title\">Pilt ja heli</string>\n    <string name=\"settings_category_history_title\">Ajalugu ja vahemälu</string>\n    <string name=\"settings_category_appearance_title\">Välimus</string>\n    <string name=\"settings_category_debug_title\">Silumine</string>\n    <string name=\"background_player_playing_toast\">Taasesitus taustal</string>\n    <string name=\"popup_playing_toast\">Taasesitus hüpikaknas</string>\n    <string name=\"content\">Sisu</string>\n    <string name=\"show_age_restricted_content_title\">Kuva vanusepiiranguga sisu</string>\n    <string name=\"duration_live\">Otse</string>\n    <string name=\"downloads\">Allalaadimised</string>\n    <string name=\"downloads_title\">Allalaadimised</string>\n    <string name=\"error_report_title\">Veateade</string>\n    <string name=\"all\">Kõik</string>\n    <string name=\"disabled\">Keelatud</string>\n    <string name=\"clear\">Kustuta</string>\n    <string name=\"best_resolution\">Parim lahutus</string>\n    <string name=\"undo\">Võta tagasi</string>\n    <string name=\"play_all\">Esita kõik</string>\n    <string name=\"always\">Alati</string>\n    <string name=\"just_once\">Üks kord</string>\n    <string name=\"file\">Fail</string>\n    <string name=\"notification_channel_name\">NewPipe\\'i teavitus</string>\n    <string name=\"notification_channel_description\">NewPipe\\'i meediaesitaja teavitused</string>\n    <string name=\"unknown_content\">[Tundmatu]</string>\n    <string name=\"switch_to_background\">Lülita taustale</string>\n    <string name=\"switch_to_popup\">Lülita hüpikpleierile</string>\n    <string name=\"import_data_title\">Impordi andmebaas</string>\n    <string name=\"export_data_title\">Ekspordi andmebaas</string>\n    <string name=\"import_data_summary\">Alistab praeguse ajaloo, tellimused, esitusloendid ja (valikuliselt) sätted</string>\n    <string name=\"export_data_summary\">Ekspordi ajalugu, tellimused, esitusloendid ja sätted</string>\n    <string name=\"clear_views_history_title\">Puhasta vaatamiste ajalugu</string>\n    <string name=\"clear_views_history_summary\">Kustutab vaadatud voogude ajaloo ja taasesituse asukohad</string>\n    <string name=\"delete_view_history_alert\">Kas kustutada kogu vaatamiste ajalugu\\?</string>\n    <string name=\"watch_history_deleted\">Vaatamiste ajalugu kustutati</string>\n    <string name=\"clear_search_history_title\">Kustuta otsinguajalugu</string>\n    <string name=\"clear_search_history_summary\">Kustutab otsisõnade ajaloo</string>\n    <string name=\"delete_search_history_alert\">Kas kustutada kogu otsinguajalugu\\?</string>\n    <string name=\"search_history_deleted\">Otsinguajalugu kustutati</string>\n    <string name=\"general_error\">Viga</string>\n    <string name=\"network_error\">Võrgu viga</string>\n    <string name=\"could_not_load_thumbnails\">Kõiki pisipilte ei õnnestunud laadida</string>\n    <string name=\"parsing_error\">Veebilehe töötlemine nurjus</string>\n    <string name=\"content_not_available\">Sisu pole saadaval</string>\n    <string name=\"could_not_setup_download_menu\">Allalaadimismenüü seadistamine nurjus</string>\n    <string name=\"app_ui_crash\">Rakendus jooksis kokku</string>\n    <string name=\"player_stream_failure\">Selle voo esitus nurjus</string>\n    <string name=\"player_unrecoverable_failure\">Ilmnes taastamatu pleieri viga</string>\n    <string name=\"player_recoverable_failure\">Pleieri veast taastumine</string>\n    <string name=\"external_player_unsupported_link_type\">Välised pleierid ei toeta seda tüüpi linke</string>\n    <string name=\"video_streams_empty\">Videovooge ei leitud</string>\n    <string name=\"audio_streams_empty\">Helivooge ei leitud</string>\n    <string name=\"invalid_directory\">Kataloogi pole</string>\n    <string name=\"invalid_source\">Faili/sisu allikat pole</string>\n    <string name=\"invalid_file\">Puudub fail või puuduvad õigused seda faili lugeda või kirjutada</string>\n    <string name=\"file_name_empty_error\">Tühi failinimi pole lubatud</string>\n    <string name=\"error_occurred_detail\">Ilmnes viga: %1$s</string>\n    <string name=\"no_streams_available_download\">Allalaaditavaid videovooge pole</string>\n    <string name=\"sorry_string\">Vabandust, seda poleks pidanud juhtuma.</string>\n    <string name=\"error_report_button_text\">Teata e-posti teel</string>\n    <string name=\"error_snackbar_message\">Vabandust, midagi läks valesti.</string>\n    <string name=\"error_snackbar_action\">Teata</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"what_happened_headline\">Mis juhtus:</string>\n    <string name=\"info_labels\">Mis:\\nPäring:\\nSisu keel:\\nSisu maa:\\nRakenduse keel:\\nTeenus:\\nGMT aeg:\\nPakett:\\nVersioon:\\nOS versioon:</string>\n    <string name=\"your_comment\">Oma kommentaar (inglise keeles):</string>\n    <string name=\"error_details_headline\">Üksikasjad:</string>\n    <string name=\"detail_thumbnail_view_description\">Esita video, kestus:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Üleslaadiaja avatari pisipilt</string>\n    <string name=\"detail_likes_img_view_description\">Meeldimisi</string>\n    <string name=\"detail_dislikes_img_view_description\">Ei meeldi</string>\n    <string name=\"search_no_results\">Tulemusi pole</string>\n    <string name=\"empty_list_subtitle\">Siin pole veel midagi</string>\n    <string name=\"detail_drag_description\">Lohista järjestuse muutmiseks</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Proovi uuesti</string>\n    <string name=\"no_subscribers\">Tellijaid pole</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s tellija</item>\n        <item quantity=\"other\">%s tellijat</item>\n    </plurals>\n    <string name=\"no_views\">Pole vaadatud</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s vaatamine</item>\n        <item quantity=\"other\">%s vaatamist</item>\n    </plurals>\n    <string name=\"no_videos\">Videoid pole</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">%s videot</item>\n    </plurals>\n    <string name=\"start\">Start</string>\n    <string name=\"pause\">Paus</string>\n    <string name=\"create\">Loo</string>\n    <string name=\"delete\">Kustuta</string>\n    <string name=\"checksum\">Kontrollsumma</string>\n    <string name=\"dismiss\">Loobu</string>\n    <string name=\"rename\">Muuda nime</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Failinimi</string>\n    <string name=\"msg_threads\">Lõimed</string>\n    <string name=\"msg_error\">Viga</string>\n    <string name=\"msg_running\">NewPipe\\'i on allalaadimisel</string>\n    <string name=\"msg_running_detail\">Üksikasjade nägemiseks toksa</string>\n    <string name=\"msg_wait\">Palun oota…</string>\n    <string name=\"msg_copied\">Kopeeriti lõikepuhvrisse</string>\n    <string name=\"no_available_dir\">Vali määra allalaadimiste kataloog hiljem sätetes</string>\n    <string name=\"msg_popup_permission\">Need õigused on vajalikud\n\\nhüpikakna avamiseks</string>\n    <string name=\"one_item_deleted\">1 üksus kustutatud.</string>\n    <string name=\"settings_category_downloads_title\">Laadi alla</string>\n    <string name=\"settings_file_charset_title\">Lubatud tähemärgid failinimedes</string>\n    <string name=\"settings_file_replacement_character_summary\">Vigased tähemärgid asendatakse selle väärtusega</string>\n    <string name=\"settings_file_replacement_character_title\">Asendustähemärk</string>\n    <string name=\"charset_letters_and_digits\">Tähed ja numbrid</string>\n    <string name=\"charset_most_special_characters\">Erimärgid</string>\n    <string name=\"title_activity_about\">Rakenduse teave: NewPipe</string>\n    <string name=\"title_licenses\">Kolmanda osapoole litsentsid</string>\n    <string name=\"tab_about\">Rakenduse teave ja KKK</string>\n    <string name=\"tab_licenses\">Litsentsid</string>\n    <string name=\"contribution_title\">Panusta</string>\n    <string name=\"view_on_github\">Vaata GitHubis</string>\n    <string name=\"donation_title\">Anneta</string>\n    <string name=\"website_title\">Veebisait</string>\n    <string name=\"website_encouragement\">Täiendava info ja uudiste lugemiseks külasta NewPipe\\'i veebisaiti.</string>\n    <string name=\"privacy_policy_title\">NewPipe\\'i andmekaitsepõhimõtted</string>\n    <string name=\"read_privacy_policy\">Loe andmekaitsepõhimõtteid</string>\n    <string name=\"app_license_title\">NewPipe\\'i litsents</string>\n    <string name=\"read_full_license\">Loe litsentsi</string>\n    <string name=\"title_activity_history\">Ajalugu</string>\n    <string name=\"action_history\">Ajalugu</string>\n    <string name=\"delete_item_search_history\">Kas kustutame selle kirje otsinguajaloost\\?</string>\n    <string name=\"title_last_played\">Viimati esitatud</string>\n    <string name=\"title_most_played\">Enim esitatud</string>\n    <string name=\"main_page_content\">Avalehe sisu</string>\n    <string name=\"blank_page_summary\">Tühi leht</string>\n    <string name=\"kiosk_page_summary\">Kioskivaade</string>\n    <string name=\"channel_page_summary\">Kanali leht</string>\n    <string name=\"select_a_channel\">Vali kanal</string>\n    <string name=\"no_channel_subscribed_yet\">Kanaleid pole veel tellitud</string>\n    <string name=\"select_a_kiosk\">Vali kiosk</string>\n    <string name=\"export_complete_toast\">Eksporditud</string>\n    <string name=\"import_complete_toast\">Imporditud</string>\n    <string name=\"no_valid_zip_file\">Korralikku ZIP faili pole</string>\n    <string name=\"could_not_import_all_files\">Hoiatus: Kõiki faile ei õnnestunud importida.</string>\n    <string name=\"override_current_data\">See alistab praeguse seadistuse.</string>\n    <string name=\"import_settings\">Kas importida ka seadistused?</string>\n    <string name=\"trending\">Trendid</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Uus ja kuum</string>\n    <string name=\"play_queue_remove\">Eemalda</string>\n    <string name=\"play_queue_stream_detail\">Üksikasjad</string>\n    <string name=\"play_queue_audio_settings\">Heli seaded</string>\n    <string name=\"hold_to_append\">Järjekorda lisamiseks vajuta</string>\n    <string name=\"start_here_on_background\">Hakka taustal mängima</string>\n    <string name=\"start_here_on_popup\">Hakka mängima hüpikaknas</string>\n    <string name=\"drawer_open\">Ava sahtel</string>\n    <string name=\"drawer_close\">Sulge sahtel</string>\n    <string name=\"preferred_open_action_settings_title\">Lingi avamine</string>\n    <string name=\"preferred_open_action_settings_summary\">Vaikimisi tegevus sisu avamisel — %s</string>\n    <string name=\"video_player\">Videopleier</string>\n    <string name=\"background_player\">Taustapleier</string>\n    <string name=\"popup_player\">Hüpikpleier</string>\n    <string name=\"always_ask_open_action\">Küsi alati</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Info hankimine…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Soovitud sisu laadimine</string>\n    <string name=\"create_playlist\">Uus esitusloend</string>\n    <string name=\"rename_playlist\">Muuda nime</string>\n    <string name=\"name\">Nimi</string>\n    <string name=\"add_to_playlist\">Lisa esitusloendisse</string>\n    <string name=\"set_as_playlist_thumbnail\">Määra esitusloendi pisipildiks</string>\n    <string name=\"bookmark_playlist\">Lisa esitusloend järjehoidjaks</string>\n    <string name=\"unbookmark_playlist\">Eemalda järjehoidja</string>\n    <string name=\"delete_playlist_prompt\">Kas kustutame selle esitusloendi\\?</string>\n    <string name=\"playlist_creation_success\">Esitusloend loodud</string>\n    <string name=\"playlist_add_stream_success\">Lisasime esitusloendisse</string>\n    <string name=\"playlist_thumbnail_change_success\">Esitusloendi pisipilt on muudetud.</string>\n    <string name=\"caption_none\">Subtiitriteta</string>\n    <string name=\"resize_fit\">Mahuta</string>\n    <string name=\"resize_fill\">Täida</string>\n    <string name=\"resize_zoom\">Suumi</string>\n    <string name=\"caption_auto_generated\">Automaatselt loodud</string>\n    <string name=\"caption_setting_title\">Subtiitrid</string>\n    <string name=\"caption_setting_description\">Kohanda subtiitrite teksti suurust ja tausta meediamängijas. Jõustamiseks taaskäivita rakendus</string>\n    <string name=\"enable_leak_canary_summary\">Mälulekke seire võib põhjustada rakenduse hangumise</string>\n    <string name=\"import_title\">Import</string>\n    <string name=\"import_from\">Impordi asukohast</string>\n    <string name=\"export_to\">Ekspordi asukohta</string>\n    <string name=\"import_ongoing\">Import…</string>\n    <string name=\"export_ongoing\">Eksport…</string>\n    <string name=\"import_file_title\">Impordi fail</string>\n    <string name=\"previous_export\">Eelmine eksport</string>\n    <string name=\"subscriptions_import_unsuccessful\">Tellimuste import nurjus</string>\n    <string name=\"subscriptions_export_unsuccessful\">Tellimuste eksport nurjus</string>\n    <string name=\"import_youtube_instructions\">Impordi YouTube tellimused Google väljavõttest:\n\\n\n\\n1. Ava aadress: %1$s\n\\n2. Logi sisse, kui seda küsitakse.\n\\n3. Klõpsa \\\"Kõigi andmetega\\\", vali \\\"Tühista kõik\\\", vali ainult \\\"Tellimused\\\" ja klõpsa \\\"OK\\\".\n\\n4. Klõpsa \\\"Järgmine samm\\\" ja seejärel \\\"Loo eksport\\\".\n\\n5. Klõpsa nupul \\\"Laadi alla\\\" siis, kui ta ilmub.\n\\n6. Klõpsi siitsamast \\\"Impordi fail\\\" linki ning vali allalaaditud .zip fail.\n\\n7. Kui .zip faili importimine ei toimi, siis paki .csv fail lahti (tavaliselt on see fail \\\"YouTube ja YouTube Muusika/tellimused/tellimused\\\" või \\\"YouTube and YouTube Music/subscriptions/subscriptions\\\") ja klõpsi siitsamast \\\"Impordi fail\\\" linki ning vali lahtipakitud csv fail.</string>\n    <string name=\"import_network_expensive_warning\">See toiming võib põhjustada suurt võrguliiklust.\n\\n\n\\nKas jätkata?</string>\n    <string name=\"playback_speed_control\">Taasesituse kiiruse juhtimine</string>\n    <string name=\"playback_tempo\">Tempo</string>\n    <string name=\"accept\">Nõustu</string>\n    <string name=\"decline\">Keeldu</string>\n    <string name=\"limit_data_usage_none_description\">Piiranguta</string>\n    <string name=\"limit_mobile_data_usage_title\">Piira lahutust mobiilse andmeside kasutamisel</string>\n    <string name=\"channels\">Kanalid</string>\n    <string name=\"playlists\">Esitusloendid</string>\n    <string name=\"tracks\">Lood</string>\n    <string name=\"users\">Kasutajad</string>\n    <string name=\"switch_to_main\">Lülitu peamisele</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA nõue</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA nõude taotlus</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s %2$s %3$s alla</string>\n    <string name=\"app_description\">Vaba ja lihtne voogesitus Androidis.</string>\n    <string name=\"contribution_encouragement\">Kui sul on ideid kujunduse muutmisest, koodi puhastamisest või suurtest koodi muudatustest - abi on alati teretulnud. Mida rohkem tehtud, seda paremaks läheb!</string>\n    <string name=\"donation_encouragement\">NewPipe\\'i arendajad on vabatahtlikud, kes kulutavad oma vaba aega, toomaks sulle parimat kasutuskogemust. On aeg anda tagasi aidates arendajaid ja muuta NewPipe veel paremaks, nautides ise tassi kohvi.</string>\n    <string name=\"give_back\">Anneta</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe võtab privaatsust väga tõsiselt. Seetõttu ei kogu rakendus ilma nõusolekuta mingeid andmeid. \\nNewPipe\\'i andmekaitsepõhimõtted selgitavad üksikasjalikult, milliseid andmeid saadetakse ja kogutakse veateate saatmisel.</string>\n    <string name=\"app_license\">NewPipe on vaba ja avatud lähtekoodiga tarkvara. Seada võid kasutada, uurida, jagada ja parandada nii, nagu õigemaks pead. Täpsemalt - seda võid levitada ja/või muuta vastavalt Vaba Tarkvara Sihtasutuse avaldatud GNU Üldise Avaliku Litsentsi v.3 (või sinu valikul hilisema versiooni) tingimustele.</string>\n    <string name=\"enable_disposed_exceptions_title\">Teavita elutsüklist väljas vigadest</string>\n    <string name=\"import_soundcloud_instructions\">Impordi SoundCloudi profiil trükkides URL või oma ID:\n\\n\n\\n1. Luba \\\"töölaua režiim\\\" veebilehitsejas (mobiilsete seadmete jaoks leht pole kättesaadav)\n\\n2. Ava URL: %1$s\n\\n3. Logi sisse\n\\n4. Kopeeri suunatud profiili URL.</string>\n    <string name=\"import_soundcloud_instructions_hint\">sinu_ID, soundcloud.com/sinu_id</string>\n    <string name=\"playback_pitch\">Toon</string>\n    <string name=\"unhook_checkbox\">Lahuta ühendus (võib põhjustada moonutusi)</string>\n    <string name=\"skip_silence_checkbox\">Keri helitu koht edasi</string>\n    <string name=\"playback_step\">Samm</string>\n    <string name=\"playback_reset\">Lähtesta</string>\n    <string name=\"start_accept_privacy_policy\">Selleks, et täita Euroopa Üldist Andmekaitse Määrust (GDPR), juhime tähelepanu NewPipe\\'i andmekaitsepõhimõtetele. Palun loe seda hoolikalt. \\nMeile veateate saatmiseks pead sellega nõustuma.</string>\n    <string name=\"minimize_on_exit_title\">Minimeeri, kui kasutad teisi rakendusi</string>\n    <string name=\"minimize_on_exit_summary\">Tegevus lülitusel peamiselt videopleierilt teisele rakendusele — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Pole</string>\n    <string name=\"minimize_on_exit_background_description\">Esita taustal</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimeeri hüpikpleierisse</string>\n    <string name=\"enable_disposed_exceptions_summary\">Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt</string>\n    <string name=\"unsubscribe\">Lõpeta tellimine</string>\n    <string name=\"tab_choose\">Vali vahekaart</string>\n    <string name=\"settings_category_updates_title\">Uuendused</string>\n    <string name=\"events\">Sündmused</string>\n    <string name=\"file_deleted\">Fail kustutati</string>\n    <string name=\"app_update_notification_channel_name\">Rakenduse värskenduse teavitus</string>\n    <string name=\"app_update_notification_channel_description\">Teavitus NewPipe\\'i uuetest versioonidest</string>\n    <string name=\"download_to_sdcard_error_title\">Väline andmekandja pole saadaval</string>\n    <string name=\"download_to_sdcard_error_message\">Allalaadimine välisele SD-kaardile ei ole võimalik. Kas lähtestada allalaadimiste kataloogi asukoht\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Tõrge salvestatud vahekaaride lugemisel; kasutatakse vaikeväärtusi</string>\n    <string name=\"restore_defaults\">Taasta vaikeväärtused</string>\n    <string name=\"restore_defaults_confirmation\">Kas soovid taastada vaikeväärtused\\?</string>\n    <string name=\"subscribers_count_not_available\">Tellijate arv pole saadaval</string>\n    <string name=\"main_page_content_summary\">Esilehel kuvatavad vahekaardid</string>\n    <string name=\"conferences\">Konverentsid</string>\n    <string name=\"updates_setting_title\">Uuendused</string>\n    <string name=\"updates_setting_description\">Kuva teavitus, kui uus versioon on saadaval</string>\n    <string name=\"list_view_mode\">Nimekirjavaate režiim</string>\n    <string name=\"list\">Nimekiri</string>\n    <string name=\"grid\">Võrgustik</string>\n    <string name=\"auto\">Auto</string>\n    <string name=\"app_update_available_notification_title\">NewPipe\\'i värskendus on saadaval!</string>\n    <string name=\"missions_header_finished\">Lõpetatud</string>\n    <string name=\"missions_header_pending\">Ootel</string>\n    <string name=\"paused\">peatatud</string>\n    <string name=\"queued\">järjekorras</string>\n    <string name=\"post_processing\">järeltöötlus</string>\n    <string name=\"enqueue\">Lisa esitusjärjekorda</string>\n    <string name=\"permission_denied\">Tegevus keelati süsteemi poolt</string>\n    <string name=\"download_failed\">Allalaadimine nurjus</string>\n    <string name=\"generate_unique_name\">Loo kordumatu nimi</string>\n    <string name=\"overwrite\">Kirjuta üle</string>\n    <string name=\"overwrite_unrelated_warning\">Sellise nimega fail on juba olemas</string>\n    <string name=\"overwrite_finished_warning\">Selle nimega allalaaditud fail on juba olemas</string>\n    <string name=\"download_already_running\">Selle nimega allalaadimine on käimas</string>\n    <string name=\"show_error\">Näita viga</string>\n    <string name=\"error_path_creation\">Sihtkausta ei saa luua</string>\n    <string name=\"error_file_creation\">Faili ei saa luua</string>\n    <string name=\"error_ssl_exception\">Turvalist ühendust ei suudetud luua</string>\n    <string name=\"error_unknown_host\">Serverit ei leitud</string>\n    <string name=\"error_connect_host\">Serveriga ei saa ühendust</string>\n    <string name=\"error_http_no_content\">Server ei saada andmeid</string>\n    <string name=\"error_http_unsupported_range\">Server ei toeta mitmelõimelisi allalaadimisi. Proovi uuesti kasutades @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Ei leitud</string>\n    <string name=\"error_postprocessing_failed\">Järeltöötlemine nurjus</string>\n    <string name=\"stop\">Stopp</string>\n    <string name=\"max_retry_msg\">Korduskatseid</string>\n    <string name=\"max_retry_desc\">Suurim katsete arv enne allalaadimise tühistamist</string>\n    <string name=\"pause_downloads_on_mobile\">Katkesta mahupiiranguga võrkudes</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Kasulik mobiilsele andmesidele lülitumisel, kuigi mõningaid alla laadimisi ei saa peatada</string>\n    <string name=\"search_showing_result_for\">Kuvatakse otsingu tulemusi: %s</string>\n    <string name=\"open_with\">Ava rakendusega</string>\n    <string name=\"peertube_instance_add_help\">Sisesta isendi URL</string>\n    <string name=\"peertube_instance_add_title\">Lisa isend</string>\n    <string name=\"peertube_instance_url_help\">Otsi endale meeldivaid aadressilt %s</string>\n    <string name=\"peertube_instance_url_summary\">Vali PeerTube lemmikisendid</string>\n    <string name=\"peertube_instance_url_title\">PeerTube isendid</string>\n    <string name=\"unsupported_url_dialog_message\">URLi tuvastamine nurjus. Kas avada mõne teise rakendusega\\?</string>\n    <string name=\"autoplay_title\">Automaatesitus</string>\n    <string name=\"settings_category_clear_data_title\">Puhasta andmed</string>\n    <string name=\"enable_playback_state_lists_summary\">Kuva esituskohtade indikaatorid esitusloendites</string>\n    <string name=\"enable_playback_state_lists_title\">Kohad esitusloendites</string>\n    <string name=\"enable_playback_resume_summary\">Taasa viimane esituskoht</string>\n    <string name=\"enable_playback_resume_title\">Jätka mängimisega</string>\n    <string name=\"auto_queue_toggle\">Lisa automaatselt esitusloendisse</string>\n    <string name=\"show_meta_info_summary\">Lülita välja, et peita metateabe kastid lisateabega voo looja, sisu või otsingu päringuga</string>\n    <string name=\"show_meta_info_title\">Kuva metateave</string>\n    <string name=\"show_description_summary\">Lülita välja, et peita video kirjeldus ja lisateave</string>\n    <string name=\"show_description_title\">Kuva kirjeldus</string>\n    <string name=\"show_comments_summary\">Lülita välja, et peita kommentaarid</string>\n    <string name=\"show_comments_title\">Kuva kommentaarid</string>\n    <string name=\"clear_queue_confirmation_description\">Aktiivse mängija esitusloend asendatakse</string>\n    <string name=\"clear_queue_confirmation_title\">Küsi enne esitusloendi tühjendamist kinnitust</string>\n    <string name=\"clear_queue_confirmation_summary\">Lülitamine ühelt mängijalt teisele võib asendada su esitusloendi</string>\n    <string name=\"seek_duration_title\">Kiire edasi- ja tagasikerimise sammu pikkus</string>\n    <string name=\"notification_colorize_summary\">Lase Androidil kohandada teavituse värvi vastavalt pisipildi peamisele värvile (igal seademel ei pruugi see olla saadaval)</string>\n    <string name=\"notification_colorize_title\">Teavituse värvimine</string>\n    <string name=\"notification_action_nothing\">Mitte midagi</string>\n    <string name=\"notification_action_buffering\">Puhverdamine</string>\n    <string name=\"notification_action_shuffle\">Aja segi</string>\n    <string name=\"notification_action_repeat\">Korda</string>\n    <string name=\"notification_actions_at_most_three\">Sa saad valida kuni kolm tegevust, mida kuvatakse lühiteavituses!</string>\n    <string name=\"notification_actions_summary\">Muuda iga teavituse tegevusi sellel toksates. Vali märkekastides paremal kuni kolm teavitust, mida kuvada lühiteates.</string>\n    <string name=\"notification_action_4_title\">Viies tegevusnupp</string>\n    <string name=\"notification_action_3_title\">Neljas tegevusnupp</string>\n    <string name=\"notification_action_2_title\">Kolmas tegevusnupp</string>\n    <string name=\"notification_action_1_title\">Teine tegevusnupp</string>\n    <string name=\"notification_action_0_title\">Esimene tegevusnupp</string>\n    <string name=\"notification_scale_to_square_image_summary\">Kadreeri teavituses kuvatav video pisipilt 16:9 külgede suhtest 1:1 suhtesse</string>\n    <string name=\"notification_scale_to_square_image_title\">Kadreeri pisipilt 1:1 küljesuhtesse</string>\n    <string name=\"msg_calculating_hash\">Arvutan räsi</string>\n    <string name=\"recent\">Hiljutised</string>\n    <string name=\"description_tab_description\">Kirjeldus</string>\n    <string name=\"chapters\">Peatükid</string>\n    <string name=\"no_app_to_open_intent\">Ükski sinu seadme rakendus ei saa seda avada</string>\n    <string name=\"crash_the_app\">Jooksuta rakendus kokku</string>\n    <string name=\"georestricted_content\">See sisu ei ole sinu riigis saadaval.</string>\n    <string name=\"soundcloud_go_plus_content\">Vähemalt sinu riigis on see SoundCloud Go+ teenuse lugu, seega ei saa seda NewPipe\\'i kaudu voogedastada ega alla laadida.</string>\n    <string name=\"private_content\">See sisu on privaatne, seega ei saa seda NewPipe\\'i kaudu voogedastada ega alla laadida.</string>\n    <string name=\"youtube_music_premium_content\">See video on saadaval ainult YouTube Music Premium teenuse tellijatele, seega ei saa seda NewPipe\\'i kaudu voogedastada ega alla laadida.</string>\n    <string name=\"paid_content\">See sisu on kättesaadav ainult tasulise teenuse kasutajatele, seega ei saa seda NewPipe\\'i kaudu voogedastada ega alla laadida.</string>\n    <string name=\"recaptcha_solve\">Lahenda</string>\n    <string name=\"featured\">Esiletõstetud</string>\n    <string name=\"radio\">Raadio</string>\n    <string name=\"auto_device_theme_title\">Automaatne (seadme teema)</string>\n    <string name=\"night_theme_summary\">Vali eelistatud teema öiseks kasutuseks — %s</string>\n    <string name=\"select_night_theme_toast\">Järgnevalt saad sa valida sobiva teema öiseks kasutuseks</string>\n    <string name=\"download_has_started\">Allalaadimine algas</string>\n    <string name=\"related_items_tab_description\">Sarnane meedia</string>\n    <string name=\"show_channel_details\">Näita kanali lisateavet</string>\n    <string name=\"permission_display_over_apps\">Luba rakendust kuvada teiste rakenduste peal</string>\n    <string name=\"error_report_open_issue_button_text\">Teata sellest GitHub\\'is</string>\n    <string name=\"comments_tab_description\">Kommentaarid</string>\n    <string name=\"no_one_watching\">Mitte keegi hetkel seda videot ei vaata</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s vaataja</item>\n        <item quantity=\"other\">%s vaatajat</item>\n    </plurals>\n    <string name=\"no_one_listening\">Mitte keegi hetkel seda pala ei kuula</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s kuulaja</item>\n        <item quantity=\"other\">%s kuulajat</item>\n    </plurals>\n    <string name=\"hash_channel_description\">Teavitused video räsimise edenemise kohta</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Võta kasutusele YouTube\\'i „Piiratud režiim“</string>\n    <string name=\"missing_file\">Faili asukoht on muutunud või on ta kustutatud</string>\n    <string name=\"watch_history_states_deleted\">Taasesituste asukohad on kustutatud</string>\n    <string name=\"delete_playback_states_alert\">Kas kustutame kõik taasesituste asukohad\\?</string>\n    <string name=\"clear_playback_states_summary\">Kustutab kõik taasesituse käigus salvestatud asukohad</string>\n    <string name=\"clear_playback_states_title\">Kustuta taasesituste asukohad</string>\n    <string name=\"clear_cookie_summary\">Kustuta küpsised, mille NewPipe on reCAPTCHA vastamise ajal salvestanud</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA küpsised on kustutatud</string>\n    <string name=\"clear_cookie_title\">Kustuta reCAPTCHA küpsised</string>\n    <string name=\"hash_channel_name\">Teavitus video räsi kohta</string>\n    <string name=\"artists\">Esitajad</string>\n    <string name=\"albums\">Albumid</string>\n    <string name=\"songs\">Laulud</string>\n    <string name=\"videos_string\">Videod</string>\n    <string name=\"restricted_video_no_stream\">Sellel videol on vanusepiirang.\n\\nVastavalt YouTube uuetele reeglitele, mis käitlevad vanusepiirangutega materjali, NewPipe ei saa seda kätte ning vastavalt ei suuda seda ka esitada.</string>\n    <string name=\"restricted_video\">Sellel videol on vanusepiirang.\n\\n\n\\nKui sa soovid seda näha, siis lülita seadistustest „%1$s“ sisse.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube\\'is leiduv „Piiratud režiim“ peidab võimaliku täiskasvanutele mõeldud sisu</string>\n    <string name=\"show_age_restricted_content_summary\">Näita sisu, mis vanusepiirangu tõttu ilmselt ei sobi lastele (näiteks 18+)</string>\n    <string name=\"peertube_instance_add_https_only\">Sa saad kasutada vaid HTTPS-urle</string>\n    <string name=\"night_theme_title\">Öine teema</string>\n    <string name=\"never\">Ei iialgi</string>\n    <string name=\"wifi_only\">Vaid Wi-Fi võrgus</string>\n    <string name=\"autoplay_summary\">Alusta esitamist automaatselt — %s</string>\n    <string name=\"show_memory_leaks\">Näita mälulekkeid</string>\n    <string name=\"playlist_no_uploader\">Automaatselt loodud (üleslaadijat ei leidu)</string>\n    <string name=\"unmute\">Lõpeta summutamine</string>\n    <string name=\"mute\">Summuta</string>\n    <string name=\"enqueued\">Esitusjärjekorda lisatud</string>\n    <string name=\"most_liked\">Enim meeldimisi</string>\n    <string name=\"title_activity_play_queue\">Esitusjärjekord</string>\n    <string name=\"enqueue_stream\">Lisa esitusjärjekorda</string>\n    <string name=\"recently_added\">Hiljuti lisatud</string>\n    <string name=\"local\">Kohalikud</string>\n    <string name=\"error_unable_to_load_comments\">Kommentaaride laadimine ei õnnestunud</string>\n    <string name=\"no_playlist_bookmarked_yet\">Esitusloendi järjehoidjaid veel pole</string>\n    <string name=\"select_a_playlist\">Vali esitusloend</string>\n    <string name=\"default_kiosk_page_summary\">Vaikimisi seadistatud kiosk</string>\n    <string name=\"done\">Valmis</string>\n    <string name=\"subtitle_activity_recaptcha\">Kui oled lõpetanud, siis vajuta „Valmis“ nuppu</string>\n    <string name=\"no_comments\">Kommentaare pole</string>\n    <string name=\"infinite_videos\">∞ videot</string>\n    <string name=\"more_than_100_videos\">100+ videot</string>\n    <string name=\"close\">Sulge</string>\n    <string name=\"delete_downloaded_files\">Kustuta allalaaditud failid</string>\n    <string name=\"confirm_prompt\">Kas sa soovid kustutada allalaadimiste ajaloo või allalaaditud failid\\?</string>\n    <string name=\"clear_download_history\">Kustuta allalaadimiste ajalugu</string>\n    <string name=\"error_download_resource_gone\">Seda allalaadimist ei saa uuesti alustada</string>\n    <string name=\"error_timeout\">Ühendus aegus</string>\n    <string name=\"error_insufficient_storage_left\">Seadmes pole enam ruumi</string>\n    <string name=\"download_already_pending\">Sellise nimega allalaadimine on juba pooleli</string>\n    <string name=\"overwrite_failed\">faili asendamine ei õnnestu</string>\n    <string name=\"feed_create_new_group_button_title\">Uus</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d valitud</item>\n        <item quantity=\"other\">%d valitud</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Sa pole tellimusi valinud</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Vali tellimused</string>\n    <string name=\"feed_processing_message\">Töötlen andmevoogu…</string>\n    <string name=\"feed_notification_loading\">Laadin andmevoogu…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Pole laaditud: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Andmevoo viimane uuendus: %s</string>\n    <string name=\"feed_groups_header_title\">Kanalite rühmad</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d päev</item>\n        <item quantity=\"other\">%d päeva</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d tund</item>\n        <item quantity=\"other\">%d tundi</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minut</item>\n        <item quantity=\"other\">%d minutit</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekund</item>\n        <item quantity=\"other\">%d sekundit</item>\n    </plurals>\n    <string name=\"remove_watched_popup_warning\">Sellega eemaldame vaadatud meediavood ja esitusloendisse lisatud sisu. \\nKas sa oled kindel?</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Jah, sealhulgas videod, mille vaatmine jäi pooleli</string>\n    <string name=\"remove_watched_popup_title\">Kas eemaldame vaadatud meediavood?</string>\n    <string name=\"remove_watched\">Eemalda vaadatud videod</string>\n    <string name=\"systems_language\">Kasuta süsteemi keelt</string>\n    <string name=\"app_language_title\">Rakenduse keel</string>\n    <string name=\"downloads_storage_ask_summary\">Alati küsime kuhu kausta soovid faile alla laadida.\n\\nKui soovid salvestada välisele SD kaardile, siis võta kasutusele süsteemi kaustavalija (system folder picker ehk SAF)</string>\n    <string name=\"downloads_storage_ask_title\">Küsi allalaaditavate failide salvestamise kausta</string>\n    <string name=\"pause_downloads\">Peata allalaadimised</string>\n    <string name=\"start_downloads\">Alusta allalaadimistega</string>\n    <string name=\"copy_for_github\">Kopeeri vormindatud aruanne</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Näita vaid rühmitamata tellimus</string>\n    <string name=\"feed_group_dialog_delete_message\">Kas sa soovid selle kanalite rühma kustutada\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Rühmal puudub nimi</string>\n    <string name=\"new_seek_duration_toast\">ExoPlayer\\'i piirangute tõttu seadistasime otsingusammu %d sekundile</string>\n    <string name=\"enable_queue_limit_desc\">Luba korraga vaid üks allalaadimine</string>\n    <string name=\"enable_queue_limit\">Piira allalaadimiste järjekorda</string>\n    <string name=\"error_progress_lost\">Faili kustutamisega läks ka tööjärg kautsi</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe lõpetas faili töötlemisel töö</string>\n    <string name=\"disable_media_tunneling_summary\">Lülita meedia tunneldamine välja juhul, kui esitamisel tekib must ekraan või pildi kuvamine on katkendlik.</string>\n    <string name=\"disable_media_tunneling_title\">Lülita meedia tunneldamine välja</string>\n    <string name=\"drawer_header_description\">Vaheta teenust, hetkel on kasutusel:</string>\n    <string name=\"content_not_supported\">NewPipe hetkel sellist võimaluist ei toeta.\n\\n\n\\nAga loodetavasti jõuame sellise võimaluse tulevasse versiooni lisada.</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanali tunnuspilt</string>\n    <string name=\"channel_created_by\">Looja: %s</string>\n    <string name=\"show_thumbnail_title\">Näita pisipilte</string>\n    <string name=\"show_thumbnail_summary\">Kasuta pisipilti nii lukustusvaate kui teavituste taustana</string>\n    <string name=\"account_terminated\">Kasutajakonto on suletud</string>\n    <string name=\"description_select_enable\">Võimalda valida kirjelduse teksti</string>\n    <string name=\"description_select_disable\">Ära võimalda valida kirjelduse teksti</string>\n    <string name=\"metadata_category\">Kategooria</string>\n    <string name=\"metadata_tags\">Sildid</string>\n    <string name=\"metadata_licence\">Litsents</string>\n    <string name=\"metadata_host\">Host</string>\n    <string name=\"metadata_privacy_unlisted\">Määratlemata</string>\n    <string name=\"off\">Väljalülitatatud</string>\n    <string name=\"on\">Kasutusel</string>\n    <string name=\"tablet_mode_title\">Vaade tahvelarvuti jaoks</string>\n    <string name=\"open_website_license\">Vaata veebis</string>\n    <string name=\"metadata_privacy_internal\">Sisemine</string>\n    <string name=\"metadata_privacy_private\">Privaatne</string>\n    <string name=\"metadata_privacy_public\">Avalik</string>\n    <string name=\"metadata_support\">Kasutajatugi</string>\n    <string name=\"metadata_language\">Keel</string>\n    <string name=\"metadata_age_limit\">Vanusepiir</string>\n    <string name=\"metadata_privacy\">Privaatsus</string>\n    <string name=\"no_dir_yet\">Allalaadimiste kaust on veel valimata - palun vali see nüüd</string>\n    <string name=\"playlist_page_summary\">Esitusloendite vaade</string>\n    <string name=\"downloads_storage_use_saf_summary\">„Storage Access Framework“-i ehk süsteemse kaustavalija kasutamisel saad andmeid salvestada ka välisele SD-kaardile</string>\n    <string name=\"downloads_storage_use_saf_title\">Kasuta süsteemset kaustavalijat (SAF)</string>\n    <string name=\"recovering\">taastatakse</string>\n    <string name=\"dont_show\">Ära kuva</string>\n    <string name=\"low_quality_smaller\">Madalam kvaliteet (väiksem)</string>\n    <string name=\"high_quality_larger\">Parem kvaliteet (suurem)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Otsinguriba pisipildivaates</string>\n    <string name=\"show_original_time_ago_summary\">Teenuste algtekstid on nähtavad voo elementides</string>\n    <string name=\"show_original_time_ago_title\">Kuva üksuste algupärane aeg</string>\n    <string name=\"comments_are_disabled\">Kommentaarid on välja lülitatud</string>\n    <string name=\"error_report_open_github_notice\">Palun kontrolli kas sinu kogetud krahhi käsitlev vearaport on juba olemas. Luues korduvraporteid võtad meilt aega, mida saaksime kulutada tegelike vigade parandamiseks.</string>\n    <string name=\"peertube_instance_add_exists\">Instants on juba olemas</string>\n    <string name=\"peertube_instance_add_fail\">Instantsi valideerimine nurjus</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"description_select_note\">Sa saad nüüd valida kirjelduse tekstist. Pane tähele, et valikurežiimis võib leht vilkuda ja lingid ei pruugi olla klõpsatavd.</string>\n    <string name=\"video_detail_by\">Autor: %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Keela kiire režiim</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Luba kiire režiim</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Hangi võimalusel spetsiaalsest voost</string>\n    <string name=\"feed_load_error_fast_unknown\">Kiirvoo režiim ei paku selle kohta täiendavat teavet.</string>\n    <string name=\"feed_load_error_terminated\">Autori konto on suletud. \\nTulevikus ei saa NewPipe seda meediavoogu laadida. \\nKas soovid tühistada selle kanali tellimuse?</string>\n    <string name=\"feed_load_error_account_info\">Voo \\'%s\\' laadimine ei õnnestnud.</string>\n    <string name=\"feed_load_error\">Via voo laadimisel</string>\n    <string name=\"feed_update_threshold_option_always_update\">Värskenda alati</string>\n    <string name=\"feed_update_threshold_summary\">Aeg pärast viimast värskendust, mille möödudes loetakse tellimus aegunuks — %s</string>\n    <string name=\"feed_update_threshold_title\">Voo värskendamise künnis</string>\n    <string name=\"settings_category_feed_title\">Voog</string>\n    <string name=\"choose_instance_prompt\">Vali eksemplar</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Android 10st alates on toetatud ainult salvestusjuurdepääsu raamistik \\'Storage Access Framework\\'</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Sinult küsitakse iga kord, kuhu alla laadimine salvestada</string>\n    <string name=\"detail_heart_img_view_description\">Südamlik autor</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Kas sinu meelest on voo laadimine aeglane? Sel juhul proovi lubada kiire laadimine (seda saad muuta seadetes või vajutades allolevat nuppu). \\n \\nNewPipe pakub kahte voo laadimise strateegiat: \\n• Tellitud kanali täielik, kuid aeglane hankimine. \\n• Teenuse spetsiaalse otspunkti kasutamine, mis on kiire, kuid tavaliselt mittetäielik. \\n \\nErinevus nende kahe vahel seisneb selles, et kiirel puudub tavaliselt teave, näiteks üksuse pikkus või tüüp (ei saa eristada reaalajas videoid tavalistest) ja see võib tagastada vähem üksusi. \\n \\nYouTube on näide teenusest, mis pakub seda kiirmeetodit oma RSS-vooga. \\n \\nNii et valik taandub sellele, mida eelistad: kiirus või täpne teave.</string>\n    <string name=\"mark_as_watched\">Märgi vaadatuks</string>\n    <string name=\"remote_search_suggestions\">Kaugotsingu soovitused</string>\n    <string name=\"local_search_suggestions\">Kohaliku otsingu soovitused</string>\n    <string name=\"main_page_content_swipe_remove\">Üksuse eemaldamiseks viipa</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Kustutasin %1$s allalaadimise</item>\n        <item quantity=\"other\">Kustutasin %1$s allalaadimist</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Allalaadimine lõppes</item>\n        <item quantity=\"other\">%s allalaadimist lõppesid</item>\n    </plurals>\n    <string name=\"start_main_player_fullscreen_summary\">Kui ekraani pööramine on lukustatud, siis videote esitamisel ära käivita väikest vaadet, vaid käivita kohe täisekraanivaade. Viimasest väljumisel näed väikest esitusvaadet</string>\n    <string name=\"start_main_player_fullscreen_title\">Käivita meediamängija täisekraanivaates</string>\n    <string name=\"enqueued_next\">Lisasin esitamiseks järgmisena</string>\n    <string name=\"enqueue_next_stream\">Lisa esitamiseks järgmisena</string>\n    <string name=\"processing_may_take_a_moment\">Töötlen andmeid… Võib kuluda mõni hetk</string>\n    <string name=\"checking_updates_toast\">Kontrollin uuendusi…</string>\n    <string name=\"check_for_updates\">Kontrolli uuendusi</string>\n    <string name=\"manual_update_description\">Kontrolli uuendusi käsitsi</string>\n    <string name=\"feed_new_items\">Uued andmevoo kirjed</string>\n    <string name=\"show_crash_the_player_title\">Näita „Jooksuta meediamängija kokku“ nupukest</string>\n    <string name=\"show_crash_the_player_summary\">Näitab valikut meediamängija kokkujooksutamiseks</string>\n    <string name=\"error_report_notification_title\">NewPipe\\'i töös tekkis viga, sellest teavitamiseks toksa</string>\n    <string name=\"crash_the_player\">Jooksuta meediamängija kokku</string>\n    <string name=\"show_error_snackbar\">Näita veateate akent</string>\n    <string name=\"error_report_channel_name\">Teavitus vigadest</string>\n    <string name=\"error_report_channel_description\">Teavitused vigadest informeerimiseks</string>\n    <string name=\"error_report_notification_toast\">Tekkis viga, vaata vastavat teadet</string>\n    <string name=\"create_error_notification\">Koosta veateade</string>\n    <string name=\"no_appropriate_file_manager_message\">Selle tegevuse jaoks ei leidunud sobilikku failihaldurit.\n\\nPalun paigalda nutiseadmesse failihaldur või proovi allalaadimiste seadistustest „%s“ välja lülitada</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Selle tegevuse jaoks ei leidunud sobilikku failihaldurit.\n\\nPalun paigalda nutiseadmesse failihaldur, mis järgib Storage Access Framework reeglistikku</string>\n    <string name=\"detail_pinned_comment_view_description\">Esiletõstetud kommentaar</string>\n    <string name=\"leak_canary_not_available\">LeakCanary pole saadaval</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer\\'i vaikimisi väärtused</string>\n    <string name=\"settings_category_player_notification_title\">Meediamängija teavitused</string>\n    <string name=\"notifications_disabled\">Teavitused pole kasutusel</string>\n    <string name=\"streams_notifications_interval_title\">Kontrollimise sagedus</string>\n    <string name=\"streams_notification_channel_description\">Tellimuste-kohaste uute meedivoogude teavitused</string>\n    <string name=\"delete_downloaded_files_confirm\">Kas kustutame kõik allalaaditud failid andmekandjalt\\?</string>\n    <string name=\"notifications\">Teavitused</string>\n    <string name=\"settings_category_player_notification_summary\">Seadista hetkel esitatava meediavoo teavitusi</string>\n    <string name=\"streams_notification_channel_name\">Uued meediavood</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s uus meediavoog</item>\n        <item quantity=\"other\">%s uut meediavoogu</item>\n    </plurals>\n    <string name=\"loading_stream_details\">Laadin meediavoo teavet…</string>\n    <string name=\"check_new_streams\">Käivita uute meediavoogude kontroll</string>\n    <string name=\"enable_streams_notifications_title\">Uute meedivoogude teavitused</string>\n    <string name=\"enable_streams_notifications_summary\">Tellimustega seotud uute meedivoogude teavitused</string>\n    <string name=\"streams_notifications_network_title\">Võrguühendus on vajalik</string>\n    <string name=\"any_network\">Mis tahes võrk</string>\n    <string name=\"get_notified\">Saa teavitusi</string>\n    <string name=\"you_successfully_subscribed\">Sa oled nüüd selle kanali tellija</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Lülita kõik sisse</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Välise pleieri jaoks ei leidu sobilikke helivoogusid</string>\n    <string name=\"streams_not_yet_supported_removed\">Need meediavood, mida allalaadija ei oska kasutada, on peidetud</string>\n    <string name=\"no_video_streams_available_for_external_players\">Välise pleieri jaoks ei leidu sobilikke videovoogusid</string>\n    <string name=\"select_quality_external_players\">Vali välis pleieri jaoks sobilik kvaliteet</string>\n    <string name=\"unknown_format\">Tundmatu vorming</string>\n    <string name=\"unknown_quality\">Teadmata kvaliteet</string>\n    <string name=\"selected_stream_external_player_not_supported\">Valitud meediavood ei ole toetatud välises pleieris</string>\n    <string name=\"percent\">Protsent</string>\n    <string name=\"semitone\">Pooltoon</string>\n    <string name=\"progressive_load_interval_title\">Taasesituseks vajalike andmete laadimise samm</string>\n    <string name=\"faq_title\">Korduma kippuvad küsimused</string>\n    <string name=\"faq_description\">Kui sul tekib selle rakenduse kasutamisel probleeme, siis esmalt vaata, kas vastus leidub korduma kippuvate küsimuste hulgas!</string>\n    <string name=\"faq\">Edasi loe veebisaidist</string>\n    <string name=\"sort\">Sortimine</string>\n    <string name=\"app_update_available_notification_text\">%s allalaadimiseks toksa</string>\n    <string name=\"fast_mode\">Kiirrežiim</string>\n    <string name=\"import_subscriptions_hint\">Tellimusi saad importida või eksportida 3 punktiga menüüst</string>\n    <string name=\"app_update_unavailable_toast\">Sa kasutad NewPipe\\'i uusimat versiooni</string>\n    <string name=\"night_theme_available\">See valik on kasutusel vaid %s teema puhul</string>\n    <string name=\"msg_failed_to_copy\">Lõikelauale kopeerimine ei õnnestunud</string>\n    <string name=\"unset_playlist_thumbnail\">Eemalda püsiv pisipilt</string>\n    <string name=\"card\">Kaart</string>\n    <string name=\"duplicate_in_playlist\">Hallina kuvatud esitusloendid juba sisaldavad seda kirjet.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Topeltkirje lisatud %d kord(a)</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Kasulik näiteks kui olukorras kui kõrvaklappide nupud on katki</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Eira nutiseadmes asuvate või seotud seadmete meedianuppude vajutusi</string>\n    <string name=\"remove_duplicates\">Eemalda topeltkirjed</string>\n    <string name=\"remove_duplicates_title\">Kas eemaldame topeltkirjed\\?</string>\n    <string name=\"remove_duplicates_message\">Kas sa soovid eemaldada kõik topelt meediavood sellest esitusloendist\\?</string>\n    <string name=\"feed_hide_streams_title\">Näita järgmisi meediavooge</string>\n    <string name=\"feed_show_hide_streams\">Näita/peida meediavood</string>\n    <string name=\"feed_show_upcoming\">Tulemas</string>\n    <string name=\"feed_show_watched\">Lõpuni vaadatud</string>\n    <string name=\"feed_show_partially_watched\">Osaliselt vaadatud</string>\n    <string name=\"left_gesture_control_title\">Toiming viipel vasakul poolel</string>\n    <string name=\"volume\">Helitugevus</string>\n    <string name=\"none\">Määratlemata</string>\n    <string name=\"left_gesture_control_summary\">Vali viibe meediamängija ekraani vasaku poole jaoks</string>\n    <string name=\"brightness\">Eredus</string>\n    <string name=\"right_gesture_control_summary\">Vali viibe meediamängija ekraani parema poole jaoks</string>\n    <string name=\"right_gesture_control_title\">Toiming viipel paremal poolel</string>\n    <string name=\"progressive_load_interval_summary\">Muuda video laadimise välpa (hetkel %s). Väiksemast väärtusest võib abi olla, kui tahad et video esitamine algaks varem</string>\n    <string name=\"prefer_original_audio_title\">Eelista algset heliriba</string>\n    <string name=\"prefer_original_audio_summary\">Sõltumata keelevalikutest eelista esmaseks määratud heliriba</string>\n    <string name=\"prefer_descriptive_audio_title\">Eelista kirjeldavat heliriba</string>\n    <string name=\"prefer_descriptive_audio_summary\">Eelista nägemispuudega inimeste jaoks koostatud heliriba, kui selline on olemas</string>\n    <string name=\"play_queue_audio_track\">Heli: %s</string>\n    <string name=\"audio_track_present_in_video\">Selles meediavoos peaks heliriba juba olemas olema</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Kasuta ExoPlayer\\'i alternatiivset dekooderit</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Kasuta alati ExoPlayer\\'i video väljundpinna seadistamise lahendust</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">algne</string>\n    <string name=\"audio_track_type_dubbed\">dubleeritud</string>\n    <string name=\"audio_track_type_descriptive\">kirjeldav</string>\n    <string name=\"audio_track\">Heliriba</string>\n    <string name=\"select_audio_track_external_players\">Vali heliriba väliste meediamängijate jaoks</string>\n    <string name=\"unknown_audio_track\">Teadmata</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer\\'i seadistused</string>\n    <string name=\"settings_category_exoplayer_summary\">Järgnevas saad hallata mõningaid ExoPlayer\\'i seadistusi. Need muudatused vajavad jõustumiseks meediamängija uuesti käivitamist</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Kasuta seda võimalust, kui põhidekooder ei käivitu korralikult. Selle asemel laaditakse alternatiivne dekooder, kuid tulemuseks võib olla kehvem taasesituse kvaliteet</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\n\\nSelle valiku kasutamine hoiab ära mõned vea, mis tekivad ekraani pööramisel ja täisekraanivaate kasutamisel</string>\n    <string name=\"main_tabs_position_summary\">Tõsta põhiline vahekaartide valija alla äärde</string>\n    <string name=\"main_tabs_position_title\">Vahekaartide põhiline asukoht</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Kuna on teada, et see seade ei toeta meedia tunneldamist, siis on see funktsionaalsus vaikimisi välja lülitatud.</string>\n    <string name=\"no_streams\">Meediavoogusid ei leidu</string>\n    <string name=\"no_live_streams\">Otseeetris meediavoogusid ei leidu</string>\n    <string name=\"image_quality_title\">Pildikvaliteet</string>\n    <string name=\"channel_tab_videos\">Videod</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Tellijad</string>\n    <string name=\"show_channel_tabs_summary\">Kanali lehel kuvatavad kaardid</string>\n    <string name=\"show_channel_tabs\">Kanali kaardid</string>\n    <string name=\"channel_tab_shorts\">Lühivideod</string>\n    <string name=\"loading_metadata_title\">Laadime metateavet…</string>\n    <string name=\"toggle_screen_orientation\">Vaheta ekraani paigutust</string>\n    <string name=\"image_quality_low\">Madal kvaliteet</string>\n    <string name=\"toggle_fullscreen\">Lülita täisekraan sisse/välja</string>\n    <string name=\"feed_fetch_channel_tabs\">Laadi kanali kaardid</string>\n    <string name=\"metadata_avatars\">Tunnuspildid</string>\n    <string name=\"next_stream\">Järgmine meediavoog</string>\n    <string name=\"metadata_subchannel_avatars\">Alamkanali tunnuspilt</string>\n    <string name=\"open_play_queue\">Ava esitusjärjekord</string>\n    <string name=\"image_quality_none\">Ära laadi pilte</string>\n    <string name=\"image_quality_high\">Parim kvaliteet</string>\n    <string name=\"channel_tab_about\">Kanali teave</string>\n    <string name=\"forward\">Keri edasi</string>\n    <string name=\"channel_tab_albums\">Albumid</string>\n    <string name=\"rewind\">Keri tagasi</string>\n    <string name=\"replay\">Korda esitust</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Andmevoo uuendamisel laaditavad kanali kaardid. Kui kanalite uuendamine toimub kiirrežiimis, siis see eelistus ei ole kasutusel.</string>\n    <string name=\"image_quality_medium\">Keskmine kvaliteet</string>\n    <string name=\"metadata_uploader_avatars\">Üleslaadija tunnuspilt</string>\n    <string name=\"metadata_banners\">Reklaampildid</string>\n    <string name=\"channel_tab_playlists\">Esitusloendid</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"play\">Esita</string>\n    <string name=\"more_options\">Lisavalikud</string>\n    <string name=\"metadata_thumbnails\">Pisipildid</string>\n    <string name=\"channel_tab_tracks\">Palad</string>\n    <string name=\"duration\">Kestus</string>\n    <string name=\"channel_tab_channels\">Kanalid</string>\n    <string name=\"previous_stream\">Eelmine meediavoog</string>\n    <string name=\"channel_tab_livestreams\">Otseeeter</string>\n    <string name=\"share_playlist_with_list\">Jaga url\\'ide loendina</string>\n    <string name=\"share_playlist_with_titles\">Jagamisel lisa pealkirjad</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">Jaga esitusloendit</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"show_more\">Näita veel</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s vastus</item>\n        <item quantity=\"other\">%s vastust</item>\n    </plurals>\n    <string name=\"show_less\">Näita vähem</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"settings_category_backup_restore_title\">Varundus ja taastamine</string>\n    <string name=\"auto_update_check_description\">NewPipe võib aeg-ajalt automaatselt kontrollida uute versioonide olemasolu ning sind vastavalt teavitada. \\nKas sa soovid sellist võimalust kasutada?</string>\n    <string name=\"reset_settings_title\">Lähtesta seadistused</string>\n    <string name=\"reset_settings_summary\">Lähtesta kõik seadistused nende vaikimisi väärtusteks</string>\n    <string name=\"error_insufficient_storage\">Seadmes pole enam piisavalt vaba ruumi</string>\n    <string name=\"reset_all_settings\">Kui lähtestad kõik seadistused, siis kõik sinu muudetud seadistused asendatakse vaikimisi väärtustega ja rakendus käivitub uuesti.\n\\n\n\\nKas sa soovid jätkata?</string>\n    <string name=\"yes\">Jah</string>\n    <string name=\"no\">Ei</string>\n    <string name=\"import_settings_vulnerable_format\">Imporditavad andmed kasutavad turvaprobleemidega vormingut, mida alates versioonist 0.27.0 NewPipe enam kasutada ei suuda. Palun kontrolli, et impordifail on loodud usaldusväärse osapoole poolt ning eelista ekspordifaile, mis on loodud NewPipe\\'i versiooniga 0.27.0 või uuemaga. Tugi sellise vana vormingu kasutamisele kaob õige pea ja seejärel NewPipe\\'i uuemad ja vanemad versioonid ei saa omavahel andmeid enam vahetada.</string>\n    <string name=\"audio_track_type_secondary\">täiendav</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Jaga YouTube\\'i ajutise esitusloendina</string>\n    <string name=\"tab_bookmarks_short\">Esitusloendid</string>\n    <string name=\"select_a_feed_group\">Vali andmevoo grupp</string>\n    <string name=\"no_feed_group_created_yet\">Ühtegi andmevoo gruppi pole veel loodud</string>\n    <string name=\"feed_group_page_summary\">Kanalirühmade leht</string>\n    <string name=\"search_with_service_name\">Otsi: %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Otsi: %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Meeldimisi</string>\n    <string name=\"migration_info_6_7_title\">SoundCloudi „Top 50“ leht on eemaldatud</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud on lõpetanud oma algse „Top 50“ edetabeli pidamise. Seega on ka vastav vahekaart meie rakenduse põhivaatest eemaldatud.</string>\n    <string name=\"migration_info_7_8_title\">YouTube\\'i kombineeritud populaarsust koguvad videovoog on eemaldatud</string>\n    <string name=\"migration_info_7_8_message\">YouTube on alates 21.07.25 lõpetanud ühendatud populaarsust koguvate videote lehe kasutamise. Mistõttu ka NewPipe on asendanud vaikimisi populaarsust koguvate videote lehe sarnase otse-eetri lehega.\\n\\n„Seadistused -&gt; Sisu -&gt; Avalehe sisu“ alt saad ka muid sarnaseid lehti seadistada.</string>\n    <string name=\"trending_podcasts\">Populaarsust koguvad taskuhäälingud</string>\n    <string name=\"trending_movies\">Populaarsust koguvad filmid ja telesarjad</string>\n    <string name=\"trending_music\">Populaarsust koguv muusika</string>\n    <string name=\"trending_gaming\">Populaarsust koguvad mängud</string>\n    <string name=\"short_thousand\">%s tuh</string>\n    <string name=\"short_million\">%s mln</string>\n    <string name=\"short_billion\">%s mld</string>\n    <string name=\"permission_display_over_apps_message\">Kasutamaks meediaesitajat hüpikaknas palun vali järgnevast Androidi seadistuste valikust „%1$s“ ja lülita sisse „%2$s“.</string>\n    <string name=\"permission_display_over_apps_permission_name\">Luba kuvamine teiste rakenduste peal</string>\n    <string name=\"delete_file\">Kustuta fail</string>\n    <string name=\"delete_entry\">Kustuta kirje</string>\n    <string name=\"entry_deleted\">Kirje on kustutatud</string>\n    <string name=\"account_terminated_service_provides_reason\">Kasutajakonto on suletud\\n\\n%1$s on märkinud põhjuseks: %2$s</string>\n    <string name=\"player_http_403\">Esitamise ajal lisas server andmevoogu HTTP oleku 403 ning tavaliselt tähendab see, et voogedastuse võrguaadress on aegunud või sinu seadme IP-aadress on keelatud</string>\n    <string name=\"player_http_invalid_status\">Esitamise ajal lisas server andmevoogu HTTP oleku %1$s</string>\n    <string name=\"youtube_player_http_403\">Esitamise ajal lisas server andmevoogu HTTP oleku 403 ning tavaliselt tähendab see, et sinu seadme IP-aadress on keelatud või voogedastuse võrguaadressi hägustamisvastastes meetmetes on viga</string>\n    <string name=\"unsupported_content_in_country\">See sisu pole saadaval hetkel kehtvas riigis.\\n\\nRiiki saad muuta: Seadistused &gt; Sisu &gt; Sisu vaikimisi riik.</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s keeldus andmete edastamisest ning eeldab sisselogimist tuvastamaks, et tegemist pole robotiga.\\n\\nLisaks võib olla juhtunud, et %1$s on lisanud sinu seadme ip-aadressi ajutisse keelunimekirja. Sa võid oodata natuke aega või vahetada võrguühendus viisi (näiteks lülitades VPN sisse/välja või kasutades WiFi asemel mobiilset internetiühendust).</string>\n    <string name=\"kao_dialog_warning\">2025. aasta augustis teatas Google, et alates septembrist 2026 uute rakenduste paigaldamine kõikides uutes Androidi seadmetes eeldab arendajate verifitseerimist, sealhulgas juhtudel, kui selline rakendus on paigaldatud väljastpoolt Google Play rakendustepoodi. Kuna NewPipe\\'i arendajad pole sellise nõudmisega nõus, siis sellise aja saabumisel NewPipe enam ei toimi sertifitseeritud Androidi seadmetes.</string>\n    <string name=\"kao_dialog_more_info\">Üksikasjad</string>\n    <string name=\"kao_solution\">Lahendus</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-eu/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Argitaratze-data: %1$s</string>\n    <string name=\"install\">Instalatu</string>\n    <string name=\"cancel\">Utzi</string>\n    <string name=\"open_in_browser\">Nabigatzailean ireki</string>\n    <string name=\"share\">Partekatu</string>\n    <string name=\"download\">Deskargatu</string>\n    <string name=\"search\">Bilatu</string>\n    <string name=\"settings\">Ezarpenak</string>\n    <string name=\"share_dialog_title\">Partekatu honekin</string>\n    <string name=\"download_path_title\">Bideoak deskargatzeko karpeta</string>\n    <string name=\"download_path_summary\">Deskargatutako bideoak hemen gordetzen dira</string>\n    <string name=\"download_path_dialog_title\">Aukeratu bideo-fitxategien deskarga karpeta</string>\n    <string name=\"default_resolution_title\">Lehenetsitako bereizmena</string>\n    <string name=\"play_with_kodi_title\">Erreproduzitu Kodi-rekin</string>\n    <string name=\"kore_not_found\">Falta den Kore aplikazioa instalatu nahi duzu?</string>\n    <string name=\"show_play_with_kodi_title\">Erakutsi «Erreproduzitu Kodi-rekin» aukera</string>\n    <string name=\"show_play_with_kodi_summary\">Erakutsi bideoa Kodi multimedia zentroarekin erreproduzitzeko aukera bat</string>\n    <string name=\"play_audio\">Audioa</string>\n    <string name=\"default_audio_format_title\">Audio formatu lehenetsia</string>\n    <string name=\"download_dialog_title\">Deskargatu</string>\n    <string name=\"show_next_and_similar_title\">Erakutsi \\'hurrengo\\' eta \\'antzeko\\' bideoak</string>\n    <string name=\"unsupported_url\">Ez da URLa onartzen</string>\n    <string name=\"content_language_title\">Edukiaren hizkuntza lehenetsia</string>\n    <string name=\"settings_category_video_audio_title\">Bideoa eta audioa</string>\n    <string name=\"detail_thumbnail_view_description\">Erreproduzitu bideoa, iraupena:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Igotzailearen abatarraren miniatura</string>\n    <string name=\"detail_dislikes_img_view_description\">Desatseginak</string>\n    <string name=\"detail_likes_img_view_description\">Atseginak</string>\n    <string name=\"no_player_found\">Ez da igorpen-erreproduzigailurik aurkitu. VLC instalatu?</string>\n    <string name=\"did_you_mean\">\\\"%1$s\\\" esan nahi al zenuen\\?</string>\n    <string name=\"use_external_video_player_title\">Erabili kanpo bideo-erreproduzitzailea</string>\n    <string name=\"use_external_audio_player_title\">Erabili kanpo audio-erreproduzitzailea</string>\n    <string name=\"background_player_playing_toast\">Atzeko planoan erreproduzitzen</string>\n    <string name=\"main_bg_subtitle\">Sakatu lupan hasteko.</string>\n    <string name=\"download_path_audio_title\">Audioa deskargatzeko karpeta</string>\n    <string name=\"download_path_audio_dialog_title\">Aukeratu audio-fitxategien deskarga karpeta</string>\n    <string name=\"download_path_audio_summary\">Deskargatutako audio fitxategiak hemen gordetzen dira</string>\n    <string name=\"dark_theme_title\">Iluna</string>\n    <string name=\"light_theme_title\">Argia</string>\n    <string name=\"settings_category_appearance_title\">Itxura</string>\n    <string name=\"open_in_popup_mode\">Ireki laster-leiho moduan</string>\n    <string name=\"use_external_video_player_summary\">Audioa kentzen du bereizmen batzuetan</string>\n    <string name=\"controls_background_title\">Bigarren planoa</string>\n    <string name=\"controls_popup_title\">Laster-leihoa</string>\n    <string name=\"default_popup_resolution_title\">Laster-leihoaren lehenetsitako bereizmena</string>\n    <string name=\"show_higher_resolutions_title\">Erakutsi bereizmen handiagoak</string>\n    <string name=\"show_higher_resolutions_summary\">Gailu batzuek soilik erreproduzitu ditzakete 2K/4K bideoak</string>\n    <string name=\"default_video_format_title\">Lehenetsitako bideo-formatua</string>\n    <string name=\"theme_title\">Gaia</string>\n    <string name=\"black_theme_title\">Beltza</string>\n    <string name=\"popup_remember_size_pos_title\">Gogoratu laster-leihoaren propietateak</string>\n    <string name=\"popup_remember_size_pos_summary\">Gogoratu laster-leihoaren azken tamaina eta posizioa</string>\n    <string name=\"show_search_suggestions_title\">Bilaketa-iradokizunak</string>\n    <string name=\"show_search_suggestions_summary\">Aukeratu bilaketak egitean erakutsiko diren iradokizunak</string>\n    <string name=\"popup_playing_toast\">Laster-leiho moduan erreproduzitzen</string>\n    <string name=\"content\">Edukia</string>\n    <string name=\"show_age_restricted_content_title\">Adinez mugatutako edukia erakutsi</string>\n    <string name=\"duration_live\">Zuzenean</string>\n    <string name=\"downloads\">Deskargak</string>\n    <string name=\"downloads_title\">Deskargak</string>\n    <string name=\"error_report_title\">Errore-txostena</string>\n    <string name=\"all\">Dena</string>\n    <string name=\"disabled\">Desgaituta</string>\n    <string name=\"clear\">Garbitu</string>\n    <string name=\"best_resolution\">Bereizmen onena</string>\n    <string name=\"general_error\">Errorea</string>\n    <string name=\"network_error\">Sare-errorea</string>\n    <string name=\"could_not_load_thumbnails\">Ezin izan dira miniatura guztiak kargatu</string>\n    <string name=\"parsing_error\">Ezin izan da webgunea analizatu</string>\n    <string name=\"content_not_available\">Edukia ez dago eskuragarri</string>\n    <string name=\"could_not_setup_download_menu\">Ezin izan da deskargen menua ezarri</string>\n    <string name=\"app_ui_crash\">Aplikazioa/EIa kraskatu da</string>\n    <string name=\"sorry_string\">Hori ez litzateke gertatu behar.</string>\n    <string name=\"error_report_button_text\">Eman honen berri e-posta bidez</string>\n    <string name=\"error_snackbar_message\">Barkatu, zerbait gaizki atera da.</string>\n    <string name=\"error_snackbar_action\">Salatu</string>\n    <string name=\"what_device_headline\">Informazioa:</string>\n    <string name=\"what_happened_headline\">Zer gertatu da:</string>\n    <string name=\"info_labels\">Zer:\\nEskaria:\\nEdukiaren hizkuntza:\\nEdukiaren herrialdea:\\nAplikazioaren hizkuntza:\\nZerbitzua:\\nDenbora-zigilua:\\nPaketea:\\nBertsioa:\\nSE bertsioa:</string>\n    <string name=\"your_comment\">Zure iruzkina (Ingelesez):</string>\n    <string name=\"error_details_headline\">Xehetasunak:</string>\n    <string name=\"video\">Bideoa</string>\n    <string name=\"audio\">Audioa</string>\n    <string name=\"retry\">Saiatu berriro</string>\n    <string name=\"start\">Hasi</string>\n    <string name=\"pause\">Pausatu</string>\n    <string name=\"delete\">Ezabatu</string>\n    <string name=\"checksum\">Egiaztaketa-batura</string>\n    <string name=\"ok\">Ados</string>\n    <string name=\"msg_name\">Fitxategi-izena</string>\n    <string name=\"msg_threads\">Hariak</string>\n    <string name=\"msg_error\">Errorea</string>\n    <string name=\"msg_running\">NewPipe deskargatzen</string>\n    <string name=\"msg_running_detail\">Sakatu xehetasunetarako</string>\n    <string name=\"msg_wait\">Itxaron mesedez…</string>\n    <string name=\"msg_copied\">Arbelera kopiatuta</string>\n    <string name=\"no_available_dir\">Ezarri deskargetarako karpeta bat ezarpenetan geroago</string>\n    <string name=\"msg_popup_permission\">Baimen hau beharrezkoa da\n\\nlaster-leiho moduan irekitzeko</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA erronka</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA erronka eskatu da</string>\n    <string name=\"title_activity_about\">NewPipe-i buruz</string>\n    <string name=\"title_licenses\">Hirugarrenen lizentziak</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s %2$s-(r)engatik, %3$s lizentziapean</string>\n    <string name=\"tab_about\">Honi buruz eta ohiko galderak</string>\n    <string name=\"tab_licenses\">Lizentziak</string>\n    <string name=\"app_description\">Igorpen libre eta arinak Android-en.</string>\n    <string name=\"view_on_github\">Ikusi GitHub-en</string>\n    <string name=\"app_license_title\">NewPipe-en lizentzia</string>\n    <string name=\"contribution_encouragement\">Itzulpen, diseinu aldaketa, kode garbiketa edo kode aldaketa sakonak bezalako ideiak badituzu, laguntza beti da ongi etorria. Zenbat eta gehiago egin, orduan eta hobeto!</string>\n    <string name=\"read_full_license\">Irakurri lizentzia</string>\n    <string name=\"contribution_title\">Lagundu</string>\n    <string name=\"subscribe_button_title\">Harpidetu</string>\n    <string name=\"subscribed_button_title\">Harpidetuta</string>\n    <string name=\"channel_unsubscribed\">Kanaletik harpidetza kenduta</string>\n    <string name=\"subscription_change_failed\">Ezin izan da harpidetza aldatu</string>\n    <string name=\"subscription_update_failed\">Ezin izan da harpidetza eguneratu</string>\n    <string name=\"tab_subscriptions\">Harpidetzak</string>\n    <string name=\"fragment_feed_title\">Zer dago berri</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Berrekin erreprodukzioa</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Jarraitu erreproduzitzen etenaldien ostean (adib. telefono deiak)</string>\n    <string name=\"settings_category_downloads_title\">Deskargak</string>\n    <string name=\"settings_file_charset_title\">Fitxategi-izenetan baimendutako karaktereak</string>\n    <string name=\"settings_file_replacement_character_summary\">Karaktere baliogabeak balio honekin ordezkatzen dira</string>\n    <string name=\"settings_file_replacement_character_title\">Ordezko karakterea</string>\n    <string name=\"charset_letters_and_digits\">Hizkiak eta zenbakiak</string>\n    <string name=\"charset_most_special_characters\">Karaktere berezi gehienak</string>\n    <string name=\"enable_search_history_title\">Bilaketa historiala</string>\n    <string name=\"enable_search_history_summary\">Gorde bilaketa-kontsultak tokian</string>\n    <string name=\"enable_watch_history_title\">Ikustaldien historiala</string>\n    <string name=\"enable_watch_history_summary\">Gorde ikusitako bideoen historiala</string>\n    <string name=\"notification_channel_name\">NewPipe jakinarazpena</string>\n    <string name=\"settings_category_player_title\">Erreproduzitzailea</string>\n    <string name=\"settings_category_player_behavior_title\">Portaera</string>\n    <string name=\"settings_category_history_title\">Historia eta cache-a</string>\n    <string name=\"undo\">Desegin</string>\n    <string name=\"notification_channel_description\">NewPipe erreproduzitzailearen jakinarazpenak</string>\n    <string name=\"search_no_results\">Emaitzarik ez</string>\n    <string name=\"empty_list_subtitle\">Kilkerrak besterik ez daude hemen</string>\n    <string name=\"no_subscribers\">Harpidedunik ez</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">Harpidedun %s</item>\n        <item quantity=\"other\">%s harpidedun</item>\n    </plurals>\n    <string name=\"no_views\">Erreprodukziorik ez</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">Erreprodukzio %s</item>\n        <item quantity=\"other\">%s erreprodukzio</item>\n    </plurals>\n    <string name=\"no_videos\">Bideorik ez</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">Bideo %s</item>\n        <item quantity=\"other\">%s bideo</item>\n    </plurals>\n    <string name=\"title_activity_history\">Historiala</string>\n    <string name=\"action_history\">Historiala</string>\n    <string name=\"show_hold_to_append_title\">Erakutsi «Mantendu ilaran jartzeko » aholkua</string>\n    <string name=\"show_hold_to_append_summary\">Erakutsi aholkua bigarren planoko eta laster-leiho botoia sakatzean bideoaren «Xehetasunak: » atalean</string>\n    <string name=\"default_content_country_title\">Lehenetsitako edukiaren herrialdea</string>\n    <string name=\"play_all\">Erreproduzitu denak</string>\n    <string name=\"unknown_content\">[Ezezaguna]</string>\n    <string name=\"switch_to_background\">Aldatu bigarren planora</string>\n    <string name=\"switch_to_popup\">Aldatu laster-leihora</string>\n    <string name=\"switch_to_main\">Aldatu nagusira</string>\n    <string name=\"player_stream_failure\">Ezin izan da igorpen hau erreproduzitu</string>\n    <string name=\"player_unrecoverable_failure\">Erreproduzitzailearen errore berreskuraezina gertatu da</string>\n    <string name=\"player_recoverable_failure\">Erreproduzitzailearen erroretik berreskuratzen</string>\n    <string name=\"donation_title\">Egin dohaintza</string>\n    <string name=\"donation_encouragement\">NewPipe boluntarioek garatu dute, haien denbora librea erabiltzaile esperientzia onena eskaintzen emanez. Eman dohaintza garatzaileei NewPipe are hobea izan dadin kafe bat hartzen duten bitartean.</string>\n    <string name=\"give_back\">Egin dohaintza</string>\n    <string name=\"website_title\">Webgunea</string>\n    <string name=\"website_encouragement\">Bisitatu NewPipe webgunea informazio gehiagorako eta berriak irakurtzeko.</string>\n    <string name=\"delete_item_search_history\">Elementu hau bilaketa-historiatik ezabatu nahi duzu?</string>\n    <string name=\"main_page_content\">Orri nagusiko edukia</string>\n    <string name=\"blank_page_summary\">Orri hutsa</string>\n    <string name=\"kiosk_page_summary\">Kioskoaren orria</string>\n    <string name=\"channel_page_summary\">Kanalaren orria</string>\n    <string name=\"select_a_channel\">Hautatu kanal bat</string>\n    <string name=\"no_channel_subscribed_yet\">Ez dago kanal harpidetzarik oraindik</string>\n    <string name=\"select_a_kiosk\">Hautatu kiosko bat</string>\n    <string name=\"trending\">Joerak</string>\n    <string name=\"top_50\">50 onenak</string>\n    <string name=\"new_and_hot\">Berria eta arrakastatsua</string>\n    <string name=\"play_queue_remove\">Kendu</string>\n    <string name=\"play_queue_stream_detail\">Xehetasunak</string>\n    <string name=\"play_queue_audio_settings\">Audio ezarpenak</string>\n    <string name=\"hold_to_append\">Mantendu ilaran jartzeko</string>\n    <string name=\"start_here_on_background\">Hasi erreproduzitzen bigarren planoan</string>\n    <string name=\"start_here_on_popup\">Hasi erreproduzitzen laster-leihoan</string>\n    <string name=\"drawer_open\">Ireki tiradera</string>\n    <string name=\"drawer_close\">Itxi tiradera</string>\n    <string name=\"no_player_found_toast\">Ez da igorpen-erreproduzigailurik aurkitu (VLC instalatu dezakezu erreproduzitzeko).</string>\n    <string name=\"always\">Beti</string>\n    <string name=\"just_once\">Behin besterik ez</string>\n    <string name=\"external_player_unsupported_link_type\">Kanpo erreproduzitzaileek ez dituzte mota honetako estekak onartzen</string>\n    <string name=\"video_streams_empty\">Ez da bideo-igorpenik aurkitu</string>\n    <string name=\"audio_streams_empty\">Ez da audio-igorpenik aurkitu</string>\n    <string name=\"video_player\">Bideo erreproduzitzailea</string>\n    <string name=\"background_player\">Atzeko planoko erreproduzitzailea</string>\n    <string name=\"popup_player\">Laster-leiho erreproduzitzailea</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Informazioa eskuratzen…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Eskatutako edukia kargatzen</string>\n    <string name=\"controls_download_desc\">Deskargatu igorpen-fitxategia</string>\n    <string name=\"show_info\">Erakutsi informazioa</string>\n    <string name=\"tab_bookmarks\">Gogoko erreprodukzio-zerrendak</string>\n    <string name=\"controls_add_to_playlist_title\">Gehitu hona</string>\n    <string name=\"use_inexact_seek_title\">Erabili bilaketa azkar ez zehatza</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Irudien cachea ezabatuta</string>\n    <string name=\"metadata_cache_wipe_title\">Ezabatu cacheko metadatuak</string>\n    <string name=\"metadata_cache_wipe_summary\">Kendu cachetik webguneen datu guztiak</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metadatuen cachea ezabatuta</string>\n    <string name=\"auto_queue_title\">Jarri ilaran hurrengo igorpena automatikoki</string>\n    <string name=\"auto_queue_summary\">Jarraitu erreprodukzioa errepikatu gabe, erlazionatutako igorpen bat gehituz</string>\n    <string name=\"settings_category_debug_title\">Arazketa</string>\n    <string name=\"file\">Fitxategia</string>\n    <string name=\"import_data_title\">Inportatu datu-basea</string>\n    <string name=\"export_data_title\">Esportatu datu-basea</string>\n    <string name=\"import_data_summary\">Zure uneko historiala, harpidetzak eta (aukeran) ezarpenak gainidazten ditu</string>\n    <string name=\"export_data_summary\">Esportatu historiala, harpidetzak, erreprodukzio-zerrendak eta ezarpenak</string>\n    <string name=\"clear_views_history_title\">Garbitu erreprodukzio-historia</string>\n    <string name=\"clear_views_history_summary\">Erreproduzitutako igorpen-historia eta erreprodukzio-kokapenak ezabatzen ditu</string>\n    <string name=\"delete_view_history_alert\">Ezabatu erreprodukzio-historia osoa?</string>\n    <string name=\"watch_history_deleted\">Erreprodukzio-historia ezabatuta</string>\n    <string name=\"clear_search_history_title\">Garbitu bilaketa-historia</string>\n    <string name=\"clear_search_history_summary\">Bilaketa-gakoen historia ezabatzen du</string>\n    <string name=\"delete_search_history_alert\">Ezabatu bilaketa-historia osoa?</string>\n    <string name=\"search_history_deleted\">Bilaketa-historia ezabatuta</string>\n    <string name=\"invalid_directory\">Karpeta ez da existitzen</string>\n    <string name=\"invalid_source\">Fitxategi/edukiaren iturria ez da existitzen</string>\n    <string name=\"invalid_file\">Fitxategia ez dago edo ez dago baimenik irakurri edo idazteko</string>\n    <string name=\"file_name_empty_error\">Fitxategi-izena ezin da hutsik egon</string>\n    <string name=\"error_occurred_detail\">Errore bat gertatu da: %1$s</string>\n    <string name=\"no_streams_available_download\">Ez dago igorpenik eskuragarri deskargatzeko</string>\n    <string name=\"detail_drag_description\">Arrastatu ordena aldatzeko</string>\n    <string name=\"create\">Sortu</string>\n    <string name=\"dismiss\">Baztertu</string>\n    <string name=\"rename\">Berrizendatu</string>\n    <string name=\"one_item_deleted\">Elementu 1 ezabatuta.</string>\n    <string name=\"title_last_played\">Erreproduzitutako azkena</string>\n    <string name=\"title_most_played\">Gehien erreproduzitutakoa</string>\n    <string name=\"export_complete_toast\">Esportatuta</string>\n    <string name=\"import_complete_toast\">Inportatuta</string>\n    <string name=\"no_valid_zip_file\">Ez da baliozko ZIP fitxategia</string>\n    <string name=\"could_not_import_all_files\">Abisua: Ezin izan dira fitxategi guztiak inportatu.</string>\n    <string name=\"override_current_data\">Honek zure uneko konfigurazioa gainidatziko du.</string>\n    <string name=\"preferred_open_action_settings_title\">«Ireki» ekintza hobetsia</string>\n    <string name=\"preferred_open_action_settings_summary\">Lehenetsitako ekintza edukia irekitzean — %s</string>\n    <string name=\"always_ask_open_action\">Galdetu beti</string>\n    <string name=\"create_playlist\">Erreprodukzio-zerrenda berria</string>\n    <string name=\"rename_playlist\">Berrizendatu</string>\n    <string name=\"name\">Izena</string>\n    <string name=\"add_to_playlist\">Gehitu erreprodukzio-zerrendara</string>\n    <string name=\"set_as_playlist_thumbnail\">Ezarri erreprodukzio-zerrendaren miniatura gisa</string>\n    <string name=\"bookmark_playlist\">Laster-markatu erreprodukzio-zerrenda</string>\n    <string name=\"unbookmark_playlist\">Kendu laster-marka</string>\n    <string name=\"delete_playlist_prompt\">Erreprodukzio-zerrenda hau ezabatu?</string>\n    <string name=\"playlist_creation_success\">Erreprodukzio-zerrenda sortuta</string>\n    <string name=\"playlist_add_stream_success\">Zerrendara gehitua</string>\n    <string name=\"playlist_thumbnail_change_success\">Erreprodukzio zerrendaren miniatura aldatuta.</string>\n    <string name=\"caption_none\">Azpititulurik ez</string>\n    <string name=\"resize_fit\">Doitu</string>\n    <string name=\"resize_fill\">Bete</string>\n    <string name=\"resize_zoom\">Zoom</string>\n    <string name=\"caption_auto_generated\">Automatikoki sortuak</string>\n    <string name=\"caption_setting_title\">Azpitituluak</string>\n    <string name=\"caption_setting_description\">Aldatu azpitituluen testuaren eskala eta atzealdeko estiloa. Aplikazioa berrabiarazi behar da aldaketak aplikatzeko</string>\n    <string name=\"enable_leak_canary_summary\">Memoria galeren monitorizazioa. Aplikazioak agian ez du erantzungo memoriaren aitortza egin bitartean</string>\n    <string name=\"enable_disposed_exceptions_title\">Eman bizitza-ziklo kanpoko erroreen berri</string>\n    <string name=\"import_title\">Inportatu</string>\n    <string name=\"import_from\">Inportatu hemendik</string>\n    <string name=\"export_to\">Esportatu hona</string>\n    <string name=\"import_ongoing\">Inportatzen…</string>\n    <string name=\"export_ongoing\">Esportatzen…</string>\n    <string name=\"import_file_title\">Inportatu fitxategia</string>\n    <string name=\"previous_export\">Aurreko esportazioa</string>\n    <string name=\"subscriptions_import_unsuccessful\">Ezin izan dira harpidetzak inportatu</string>\n    <string name=\"subscriptions_export_unsuccessful\">Ezin izan dira harpidetzak esportatu</string>\n    <string name=\"import_youtube_instructions\">Inportatu YouTube harpidetzak Google takeout-etik: \\n \\n1. Joan URL honetara: %1$s \\n2. Hasi saioa eskatzen zaizunean \\n3. Hautatu «Datu guztiak barne», gero «Kendu hautapen guztiak», eta hautatu «harpidetzak» soilik eta egin klik «Ados» botoian \\n4. Egin klik «Hurrengo pausua» eta «Sortu esportazioa» botoietan \\n5. Egin klik «Deskargatu» botoian agertzen denean \\n6. Egin klik INPORTATU FITXATEGIA botoian eta hautatu deskargatutako .zip fitxategia \\n7. [.zip inportazioak huts egiten badu] Erauzi .csv fitxategia deskargatutako takeout zip-etik (normalean «Youtube eta Youtube Music/harpidetzak/harpidetzak.csv»), egin klik INPORTATU FITXATEGIA botoian eta hautatu erauzitako csv fitxategia</string>\n    <string name=\"import_soundcloud_instructions\">Inportatu SoundCloud profila URL-a edo zure ID-a idatziz: \\n \\n1. Gaitu «mahaigain modua» web nabigatzailean (gunea ez dabil mugikorretan) \\n2. Joan URL honetara: %1$s \\n3. Hasi saioa eskatzen zaizunean \\n4. Kopiatu profilaren URL-a eraman zaizun orritik.</string>\n    <string name=\"import_soundcloud_instructions_hint\">zureID,soundcloud.com/zureid</string>\n    <string name=\"import_network_expensive_warning\">Eragiketa honek sarearen erabilera handia egin lezake.\n\\n\n\\nJarraitu nahi duzu?</string>\n    <string name=\"playback_speed_control\">Erreprodukzio-abiaduraren kontrolak</string>\n    <string name=\"playback_tempo\">Tempoa</string>\n    <string name=\"playback_pitch\">Tonua</string>\n    <string name=\"unhook_checkbox\">Desgaitu (distortsioa sor lezake)</string>\n    <string name=\"import_settings\">Ezarpenak ere inportatu nahi dituzu?</string>\n    <string name=\"use_inexact_seek_summary\">Bilaketa ez zehatzak erreproduzitzaileari posizioak azkarrago baina zehaztasun txikiagoarekin bilatzea ahalbidetzen dio. 5, 15 edo 25 segundoz bilatzea ez du honekin funtzionatzen</string>\n    <string name=\"app_license\">NewPipe copyleft software librea da: nahi duzunean erabili, aztertu, partekatu eta hobetu dezakezu. Zehazki, GNU Lizentzia Publiko Orokorraren baldintzen arabera birbanatu eta/edo aldatu dezakezu, Free Software Foundation-ek argitaratutako moduan, Lizentziaren 3. bertsioan edo (zure aukeran) ondorengo edozein bertsiotan.</string>\n    <string name=\"enable_disposed_exceptions_summary\">Behartu aktibitatearen bizitza ziklotik kanpo baztertu eta gero entregatu ezin diren Rx salbuespenen inguruko txostena</string>\n    <string name=\"privacy_policy_title\">NewPipe-en pribatutasun politika</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe proiektuak aintzat hartzen du zure pribatutasuna. Aplikazioak ez du zure baimenik gabe daturik jasotzen. \\nNewPipe-en pribatutasun politikak zehazki azaltzen du zer datu bidali eta gordetzen den kraskatze txosten bat bidaltzen duzunean.</string>\n    <string name=\"read_privacy_policy\">Irakurri pribatutasun politika</string>\n    <string name=\"start_accept_privacy_policy\">Europako Datuak Babesteko Erregelamendu Orokorra (GDPR) betetzeko, NewPipe-ren pribatutasun-politikaren berri ematen dizugu. Mesedez, irakurri arretaz. \\nAkatsen txostena bidaltzeko onartu behar duzu.</string>\n    <string name=\"accept\">Onartu</string>\n    <string name=\"decline\">Ukatu</string>\n    <string name=\"limit_data_usage_none_description\">Mugagabea</string>\n    <string name=\"limit_mobile_data_usage_title\">Mugatu bereizmena datu mugikorrak erabiltzean</string>\n    <string name=\"skip_silence_checkbox\">Aurreratu azkar isilunea dagoenean</string>\n    <string name=\"playback_step\">Urratsa</string>\n    <string name=\"playback_reset\">Leheneratu</string>\n    <string name=\"minimize_on_exit_title\">Minimizatu app-a aldatzean</string>\n    <string name=\"minimize_on_exit_summary\">Ekintza bideo-erreproduzitzaile nagusitik beste aplikazio batera aldatzean — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Bat ere ez</string>\n    <string name=\"minimize_on_exit_background_description\">Minimizatu bigarren planoko erreproduzitzailera</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimizatu laster-leiho erreproduzitzailera</string>\n    <string name=\"channels\">Kanalak</string>\n    <string name=\"playlists\">Erreprodukzio-zerrendak</string>\n    <string name=\"tracks\">Pistak</string>\n    <string name=\"users\">Erabiltzaileak</string>\n    <string name=\"unsubscribe\">Kendu harpidetza</string>\n    <string name=\"tab_choose\">Aukeratu fitxa</string>\n    <string name=\"settings_category_updates_title\">Eguneraketak</string>\n    <string name=\"events\">Gertaerak</string>\n    <string name=\"file_deleted\">Fitxategia ezabatuta</string>\n    <string name=\"app_update_notification_channel_name\">Aplikazioaren eguneraketen jakinarazpena</string>\n    <string name=\"app_update_notification_channel_description\">NewPipe aplikazioaren bertsio berrien jakinarazpena</string>\n    <string name=\"download_to_sdcard_error_title\">Kanpoko biltegiratzea ez dago eskuragarri</string>\n    <string name=\"download_to_sdcard_error_message\">Ezin da SD txartel batera deskargatu. Deskargen karpeta berrezarri nahi duzu\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Ezin izan dira gordetako fitxak irakurri, lehenetsitakoak erabiltzen</string>\n    <string name=\"restore_defaults\">Berrezarri lehenetsitakoak</string>\n    <string name=\"restore_defaults_confirmation\">Lehenetsitako balioak berrezarri nahi dituzu?</string>\n    <string name=\"subscribers_count_not_available\">Harpidedun kopurua ez dago eskuragarri</string>\n    <string name=\"main_page_content_summary\">Orri nagusian ikusiko diren fitxak</string>\n    <string name=\"conferences\">Konferentziak</string>\n    <string name=\"updates_setting_title\">Eguneraketak</string>\n    <string name=\"updates_setting_description\">Erakutsi jakinarazpena bertsio berri bat eskuragarri dagoenean aplikazioaren eguneratzea eskatzeko</string>\n    <string name=\"list_view_mode\">Zerrenda ikuspegi modua</string>\n    <string name=\"list\">Zerrenda</string>\n    <string name=\"grid\">Sareta</string>\n    <string name=\"auto\">Automatikoa</string>\n    <string name=\"app_update_available_notification_title\">NewPipe-ren eguneraketa eskuragarri dago!</string>\n    <string name=\"missions_header_finished\">Amaituta</string>\n    <string name=\"missions_header_pending\">Zain</string>\n    <string name=\"paused\">pausatuta</string>\n    <string name=\"queued\">ilaran</string>\n    <string name=\"post_processing\">post-prozesamendua</string>\n    <string name=\"enqueue\">Ilaran jarri</string>\n    <string name=\"permission_denied\">Sistemak ekintza ukatu du</string>\n    <string name=\"download_failed\">Deskargak huts egin du</string>\n    <string name=\"generate_unique_name\">Sortu izen bakarra</string>\n    <string name=\"overwrite\">Gainidatzi</string>\n    <string name=\"overwrite_finished_warning\">Badago izen bera duen deskargatutako fitxategi bat</string>\n    <string name=\"download_already_running\">Badago izen bera duen deskarga bat abian</string>\n    <string name=\"show_error\">Erakutsi errorea</string>\n    <string name=\"error_file_creation\">Ezin da fitxategia sortu</string>\n    <string name=\"error_path_creation\">Ezin da helburu karpeta sortu</string>\n    <string name=\"error_ssl_exception\">Ezin izan da konexio seguru bat ezarri</string>\n    <string name=\"error_unknown_host\">Ezin izan da zerbitzaria aurkitu</string>\n    <string name=\"error_connect_host\">Ezin da zerbitzariara konektatu</string>\n    <string name=\"error_http_no_content\">Zerbitzariak ez du daturik bidaltzen</string>\n    <string name=\"error_http_unsupported_range\">Zerbitzariak ez ditu hainbat hariko deskargak onartzen, saiatu @string/msg_threads = 1 erabilita</string>\n    <string name=\"error_http_not_found\">Ez da aurkitu</string>\n    <string name=\"error_postprocessing_failed\">Post-prozesamenduak huts egin du</string>\n    <string name=\"stop\">Gelditu</string>\n    <string name=\"max_retry_msg\">Gehienezko saiakerak</string>\n    <string name=\"max_retry_desc\">Deskarga utzi aurretik saiatu beharreko aldi kopurua</string>\n    <string name=\"pause_downloads_on_mobile\">Eten sare neurtuetan</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Erabilgarria datu mugikorretara aldatzean, hala ere deskarga batzuk ezin dira pausatu</string>\n    <string name=\"error_timeout\">Konexioaren denbora-muga</string>\n    <string name=\"show_comments_title\">Erakutsi iruzkinak</string>\n    <string name=\"show_comments_summary\">Desgaitu iruzkinak ezkutatzeko</string>\n    <string name=\"autoplay_title\">Erreprodukzio automatikoa</string>\n    <string name=\"no_comments\">Iruzkinik ez</string>\n    <string name=\"error_unable_to_load_comments\">Ezin izan dira iruzkinak kargatu</string>\n    <string name=\"close\">Itxi</string>\n    <string name=\"enable_playback_resume_title\">Berrekin erreprodukzioa</string>\n    <string name=\"enable_playback_resume_summary\">Berrezarri azken erreprodukzio-posizioa</string>\n    <string name=\"enable_playback_state_lists_title\">Posizioak zerrendetan</string>\n    <string name=\"enable_playback_state_lists_summary\">Erakutsi erreprodukzio-posizioen adierazleak zerrendetan</string>\n    <string name=\"settings_category_clear_data_title\">Garbitu datuak</string>\n    <string name=\"watch_history_states_deleted\">Erreprodukzio-kokapenak ezabatuta</string>\n    <string name=\"missing_file\">Fitxategia lekuz aldatu edo ezabatu da</string>\n    <string name=\"overwrite_unrelated_warning\">Badago izen bereko fitxategi bat</string>\n    <string name=\"overwrite_failed\">ezin da fitxategia gainidatzi</string>\n    <string name=\"download_already_pending\">Badago izen bereko deskarga bat zain</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe itxi egin da fitxategian lanean zegoela</string>\n    <string name=\"error_insufficient_storage_left\">Ez dago lekurik gailuan</string>\n    <string name=\"error_progress_lost\">Aurrerapena galdu da, fitxategia ezabatu delako</string>\n    <string name=\"confirm_prompt\">Zure deskargen historia garbitu nahi duzu ala deskargatutako fitxategi guztiak ezabatu?</string>\n    <string name=\"enable_queue_limit\">Mugatu deskargen ilara</string>\n    <string name=\"enable_queue_limit_desc\">Deskarga bakarra soilik onartuko da aldi berean</string>\n    <string name=\"start_downloads\">Hasi deskargak</string>\n    <string name=\"pause_downloads\">Pausatu deskargak</string>\n    <string name=\"downloads_storage_ask_title\">Galdetu non deskargatu</string>\n    <string name=\"downloads_storage_ask_summary\">Non gorde galdetuko zaizu deskarga bakoitzean.\n\\nGaitu sistemaren karpeta hautatzailea (SAF) kanpoko SD txartel batera deskargatu nahi baduzu</string>\n    <string name=\"no_one_watching\">Ez dago inor ikusten</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">Ikusle %s</item>\n        <item quantity=\"other\">%s ikusle</item>\n    </plurals>\n    <string name=\"no_one_listening\">Ez dago inor entzuten</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">Entzule %s</item>\n        <item quantity=\"other\">%s entzule</item>\n    </plurals>\n    <string name=\"downloads_storage_use_saf_title\">Erabili sistemaren karpeta hautatzailea (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Biltegiaren Sarrera Framework\\'ak kanpoko SD txartel betera deskargatzea ahalbidetzen du</string>\n    <string name=\"clear_playback_states_title\">Ezabatu erreprodukzio-kokapenak</string>\n    <string name=\"clear_playback_states_summary\">Erreprodukzio-kokapen guztiak ezabatzen ditu</string>\n    <string name=\"delete_playback_states_alert\">Ezabatu erreprodukzio-kokapen guztiak?</string>\n    <string name=\"drawer_header_description\">Aktibatu zerbitzua, orain hautatua:</string>\n    <string name=\"default_kiosk_page_summary\">Kiosko lehenetsia</string>\n    <string name=\"seek_duration_title\">Aurreratze/atzeratze bilaketaren iraupena</string>\n    <string name=\"peertube_instance_url_title\">PeerTube instantziak</string>\n    <string name=\"peertube_instance_url_summary\">Hautatu zure gogoko PeerTube instantziak</string>\n    <string name=\"peertube_instance_url_help\">Aurkitu gustuko instantziak hemen: %s</string>\n    <string name=\"peertube_instance_add_title\">Gehitu instantzia</string>\n    <string name=\"peertube_instance_add_help\">Sartu instantziaren URLa</string>\n    <string name=\"peertube_instance_add_fail\">Ezin izan da instantzia balioztatu</string>\n    <string name=\"peertube_instance_add_https_only\">HTTPS URLak soilik onartzen dira</string>\n    <string name=\"peertube_instance_add_exists\">Instantzia badago aurretik</string>\n    <string name=\"local\">Tokikoa</string>\n    <string name=\"recently_added\">Berriki gehitua</string>\n    <string name=\"most_liked\">Gogokoenak</string>\n    <string name=\"playlist_no_uploader\">Automatikoki sortua (igotzailea ez da aurkitu)</string>\n    <string name=\"recovering\">berreskuratzen</string>\n    <string name=\"error_download_resource_gone\">Ezin da deskarga hau berreskuratu</string>\n    <string name=\"choose_instance_prompt\">Aukeratu instantzia bat</string>\n    <string name=\"clear_download_history\">Garbitu deskargen historia</string>\n    <string name=\"delete_downloaded_files\">Ezabatu deskargatutako fitxategiak</string>\n    <string name=\"permission_display_over_apps\">Baimena eman beste aplikazioen gainetik erakusteko</string>\n    <string name=\"app_language_title\">Aplikazioaren hizkuntza</string>\n    <string name=\"systems_language\">Sistemaren lehenetsia</string>\n    <string name=\"subtitle_activity_recaptcha\">Sakatu «Eginda» konponduta dagoenean</string>\n    <string name=\"done\">Eginda</string>\n    <string name=\"videos_string\">Bideoak</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">segundo %d</item>\n        <item quantity=\"other\">%d segundo</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">ExoPlayer-en mugak direla eta bilaketaren iraupena %d segundotan ezarri da</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Jarioaren karga motelegia dela uste duzu\\? Hala bada, saiatu karga azkarra gaitzen (ezarpenetan edo beheko botoia sakatzen aldatu dezakezu).\n\\n\n\\nNewPipe jarioak kargatzeko bi estrategia eskaintzen ditu:\n\\n• Harpidetza kanal osoa eskuratu, motela baina osoa.\n\\n• Amaiera-puntu dedikatua erabiliz, arina baina ez osatua.\n\\n\n\\nBien arteko diferentzia arinak normalean informazioa falta dela da, elementuaren iraupena edo mota adibidez (ezin du bideo normalen eta zuzenekoen artean bereizi) eta elementu gutxiago buelta ditzake.\n\\n\n\\nYouTube da bere RSS jarioaren bidez metodo azkarra eskaintzen duen zerbitzu bat adibidez.\n\\n\n\\nBeraz aukerak zure nahietara murrizten dira: abiadura edo informazio zehatza.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Desgaitu modu azkarra</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Gaitu modu azkarra</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Zerbitzu batzuetan eskuragarri, normalean askoz azkarragoa da, baina elementu kopuru mugatu eta osatu gabeko informazioa itzuli dezake (adib. iraupenik ez, elementu mota, zuzeneko egoerarik ez)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Eskuratu jario dedikatutik eskuragarri dagoenean</string>\n    <string name=\"feed_update_threshold_option_always_update\">Eguneratu beti</string>\n    <string name=\"feed_update_threshold_summary\">Pasatzen den denbora harpidetza bat zaharkituta dagoela kontuan hartzen den arte — %s</string>\n    <string name=\"feed_update_threshold_title\">Jarioaren eguneratze atalasea</string>\n    <string name=\"settings_category_feed_title\">Jarioa</string>\n    <string name=\"feed_create_new_group_button_title\">Berria</string>\n    <string name=\"feed_group_dialog_delete_message\">Talde hau ezabatu nahi duzu\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Talde izena hutsik</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d hautatuta</item>\n        <item quantity=\"other\">%d hautatuta</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Ez da harpidetzarik hautatu</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Hautatu harpidetzak</string>\n    <string name=\"feed_processing_message\">Jarioa prozesatzen…</string>\n    <string name=\"feed_notification_loading\">Jarioa kargatzen…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Kargatu gabe: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Jarioaren azken eguneraketa: %s</string>\n    <string name=\"feed_groups_header_title\">Kanal-taldeak</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">egun %d</item>\n        <item quantity=\"other\">%d egun</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">ordu %d</item>\n        <item quantity=\"other\">%d ordu</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">minutu %d</item>\n        <item quantity=\"other\">%d minutu</item>\n    </plurals>\n    <string name=\"unmute\">Gaitu audioa</string>\n    <string name=\"mute\">Isilarazi</string>\n    <string name=\"content_not_supported\">Eduki hau ez dago oraindik NewPiperengatik onartuta. \\n \\nEtorkizuneko bertsio batean onartua izatea espero da.</string>\n    <string name=\"infinite_videos\">∞ bideo</string>\n    <string name=\"more_than_100_videos\">100 bideo baino gehiago</string>\n    <string name=\"artists\">Artistak</string>\n    <string name=\"albums\">Albumak</string>\n    <string name=\"songs\">Abestiak</string>\n    <string name=\"restricted_video\">Bideo hau adinez mugatua dago. \\n \\nIkusi nahi baduzu, gaitu ezazu \\\"%1$s\\\" ezarpenetan.</string>\n    <string name=\"video_detail_by\">Egilea: %s</string>\n    <string name=\"playlist_page_summary\">Erreprodukzio-zerrendaren orria</string>\n    <string name=\"channel_created_by\">%s-(e)k sortuta</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanalaren avatarraren miniatura</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Erakutsi taldekatuta ez dauden harpidetzak soilik</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Bai, partzialki ikusitako bideoak ere bai</string>\n    <string name=\"remove_watched_popup_warning\">Dagoeneko ikusi eta gero erreprodukzio-zerrendara gehitu diren igorpenak kendu egingo dira. \\nJarraitu nahi duzu?</string>\n    <string name=\"remove_watched_popup_title\">Ikusitako igorpenak kendu?</string>\n    <string name=\"remove_watched\">Kendu ikusitako bideoak</string>\n    <string name=\"never\">Inoiz ez</string>\n    <string name=\"wifi_only\">WiFi-arekin soilik</string>\n    <string name=\"autoplay_summary\">Erreprodukzioa automatikoki hasi — %s</string>\n    <string name=\"show_memory_leaks\">Erakutsi memoria galerak</string>\n    <string name=\"title_activity_play_queue\">Erreproduzitu ilara</string>\n    <string name=\"no_playlist_bookmarked_yet\">Oraindik ez dago erreprodukzio-zerrenda laster-markarik</string>\n    <string name=\"select_a_playlist\">Hautatu erreprodukzio-zerrenda bat</string>\n    <string name=\"error_report_open_github_notice\">Mesedez, egiaztatu dagoeneko zure arazoarekin eztabaidarik sortuta badagoen. Sarrera duplikatuak daudenean, arazoa ebazteko erabili dezakegun denbora galtzen ari gara.</string>\n    <string name=\"copy_for_github\">Formatodun txostena kopiatu</string>\n    <string name=\"error_report_open_issue_button_text\">Eman berri GitHub-en</string>\n    <string name=\"clear_cookie_summary\">Garbitu NewPipe-k gordetzen dituen cookieak reCAPTCHA bat ebazten duzunean</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA kookiak garbitu dira</string>\n    <string name=\"clear_cookie_title\">Ezabatu reCAPTCHA-ren kookiak</string>\n    <string name=\"show_age_restricted_content_summary\">Adinez mugatuta dagoen eta haurrentzako desegokia izan daitezkeen edukia erakutsi (+18 adibidez)</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube-ren «Modu mugatua» helduentzako edukia izan daitekeen edukia ezkutatzen du</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Gaitu YouTube-ren «Modu mugatua»</string>\n    <string name=\"unsupported_url_dialog_message\">Ezin izan da URL-a ezagutu. Beste aplikazio batekin ireki\\?</string>\n    <string name=\"auto_queue_toggle\">Auto-ilaratzea</string>\n    <string name=\"clear_queue_confirmation_description\">Erreprodukzio-ilara aktiboa ordezkatuko da</string>\n    <string name=\"clear_queue_confirmation_summary\">Erreproduzitzaile batetik beste batera aldatzeak ilara ordezkatu dezake</string>\n    <string name=\"clear_queue_confirmation_title\">Eskatu berrespena ilara bat garbitu baino lehenago</string>\n    <string name=\"notification_action_nothing\">Ezer ez</string>\n    <string name=\"notification_action_buffering\">Buferreratzen</string>\n    <string name=\"notification_action_shuffle\">Nahastu</string>\n    <string name=\"notification_actions_at_most_three\">Gehienez hiru ekintza aukera ditzakezu jakinarazpen trinkoan erakusteko!</string>\n    <string name=\"notification_action_repeat\">Errepikatu</string>\n    <string name=\"notification_action_4_title\">Bostgarren ekintzaren botoia</string>\n    <string name=\"notification_action_3_title\">Laugarren ekintzaren botoia</string>\n    <string name=\"notification_action_2_title\">Hirugarren ekintzaren botoia</string>\n    <string name=\"notification_action_1_title\">Bigarren ekintzaren botoia</string>\n    <string name=\"notification_action_0_title\">Lehenego ekintzaren botoia</string>\n    <string name=\"notification_scale_to_square_image_summary\">Ebaki jakinarazpenetan erakusten den bideo miniaturaren itxura-erlazioa 16:9tik 1:1era</string>\n    <string name=\"notification_scale_to_square_image_title\">Miniatura 1:1 itxura-erlaziora ebaki</string>\n    <string name=\"search_showing_result_for\">%s bilaketaren erantzunak erakusten</string>\n    <string name=\"enqueued\">Ilaran jarri da</string>\n    <string name=\"enqueue_stream\">Jarri ilaran</string>\n    <string name=\"show_original_time_ago_summary\">Zerbitzuen jatorrizko testuak igorpenaren elementuetan ikusgai egongo dira</string>\n    <string name=\"show_original_time_ago_title\">Erakutsi «orain dela» jatorrizko denbora elementuetan</string>\n    <string name=\"notification_actions_summary\">Editatu beheko jakinarazpen-ekintza bakoitza sakatuz. Hautatu horietako hiru gehienez jakinarazpen trinkoan erakusteko, eskuineko kontrol-laukiak erabiliz.</string>\n    <string name=\"notification_colorize_summary\">Androidek miniaturako kolore nagusiaren arabera jakinarazpenaren kolorea pertsonalizatzea baimendu (kontuan izan ez dagoela gailu guztietan erabilgarri)</string>\n    <string name=\"notification_colorize_title\">Koloreztatu jakinarazpena</string>\n    <string name=\"show_thumbnail_summary\">Erabili miniatura blokeo pantaila eta jakinarazpenentzako</string>\n    <string name=\"show_thumbnail_title\">Erakutsi miniatura</string>\n    <string name=\"hash_channel_description\">Jakinarazpenak bideoen hashing egoerarako</string>\n    <string name=\"hash_channel_name\">Bideo hash jakinarazpena</string>\n    <string name=\"msg_calculating_hash\">Hash-a kalkulatzen</string>\n    <string name=\"recent\">Azkenak</string>\n    <string name=\"show_meta_info_summary\">Desgaitu igorpenaren sortzaileari, eduki edo bilaketa-eskaera bati buruzko meta informazio-koadroak ezkutatzeko</string>\n    <string name=\"show_meta_info_title\">Erakutsi meta informazioa</string>\n    <string name=\"no_app_to_open_intent\">Ez dago zure gailuan hau ireki dezakeen aplikaziorik</string>\n    <string name=\"chapters\">Kapituluak</string>\n    <string name=\"description_tab_description\">Deskribapena</string>\n    <string name=\"related_items_tab_description\">Erlazionatutako elementuak</string>\n    <string name=\"comments_tab_description\">Iruzkinak</string>\n    <string name=\"show_description_summary\">Desgaitu bideoaren deskribapen eta informazio gehigarria ezkutatzeko</string>\n    <string name=\"show_description_title\">Erakutsi deskribapena</string>\n    <string name=\"open_with\">Ireki honekin</string>\n    <string name=\"radio\">Irratia</string>\n    <string name=\"featured\">Nabarmenduak</string>\n    <string name=\"paid_content\">Eduki hau ordaindu duten erabiltzaileentzat soilik dago eskuragarri, eta NewPipe-k ezin du igorri edo deskargatu.</string>\n    <string name=\"youtube_music_premium_content\">Bideo hau YouTube Music Premium kideentzako soilik dago eskuragarri, eta NewPipe-k ezin du igorri edo deskargatu.</string>\n    <string name=\"private_content\">Eduki hau pribatua da, eta NewPipe-k ezin du igorri edo deskargatu.</string>\n    <string name=\"soundcloud_go_plus_content\">Hau SoundCloud Go+ zerbitzuko pista bat da, zure herrialdean behintzat, eta NewPipe-k ezin du igorri edo deskargatu.</string>\n    <string name=\"georestricted_content\">Eduki hau ez dago eskuragarri zure herrialdean.</string>\n    <string name=\"crash_the_app\">Aplikazioa kraskatu</string>\n    <string name=\"recaptcha_solve\">Ebatzi</string>\n    <string name=\"restricted_video_no_stream\">Bideo hau adinez mugatua dago.\n\\nAdinez mugatutako bideoekiko YouTube-ren politika berriengatik, NewPipe-k ezin ditu bideoen igorpen hauek atzitu eta erreproduzitu.</string>\n    <string name=\"download_has_started\">Deskarga hasi da</string>\n    <string name=\"select_night_theme_toast\">Behean gaueko gai gogokoena hautatu dezakezu</string>\n    <string name=\"night_theme_summary\">Hautatu zure gaueko gai gogokoena — %s</string>\n    <string name=\"auto_device_theme_title\">Automatikoa (gailuaren gaia)</string>\n    <string name=\"night_theme_title\">Gaueko gaia</string>\n    <string name=\"show_channel_details\">Erakutsi kanalaren xehetasunak</string>\n    <string name=\"disable_media_tunneling_summary\">Desgaitu multimedia-tunelatzea pantaila beltza edo bideoa erreproduzitzean eten egiten bada.</string>\n    <string name=\"disable_media_tunneling_title\">Multimedia-tunela desgaitu</string>\n    <string name=\"off\">Itzalita</string>\n    <string name=\"on\">Piztuta</string>\n    <string name=\"tablet_mode_title\">Tablet modua</string>\n    <string name=\"open_website_license\">Ireki webgunea</string>\n    <string name=\"metadata_privacy_private\">Pribatua</string>\n    <string name=\"metadata_privacy_public\">Publikoa</string>\n    <string name=\"metadata_language\">Hizkuntza</string>\n    <string name=\"metadata_licence\">Lizentzia</string>\n    <string name=\"metadata_tags\">Etiketak</string>\n    <string name=\"metadata_category\">Kategoria</string>\n    <string name=\"description_select_disable\">Desgaitu deskribapenaren testu-hautaketa</string>\n    <string name=\"description_select_enable\">Deskribapenaren testu-hautaketa gaitu</string>\n    <string name=\"description_select_note\">Orain deskribapenaren barruko testua hauta dezakezu. Kontuan izan orrialdea keinuka hasi dezakela eta estekak ezin direla klikatu hautaketa moduan zauden bitartean.</string>\n    <string name=\"feed_load_error_terminated\">Egilearen kontua itxi da.\n\\nNewPipe-k ezingo du etorkizunean jario hau kargatu.\n\\nKanal honetatik harpidetza kendu nahi duzu\\?</string>\n    <string name=\"feed_load_error_account_info\">Ezin izan da \\'%s\\' jarioa kargatu.</string>\n    <string name=\"feed_load_error\">Errorea jarioa kargatzean</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Android 10etik aurrera \\'Biltegiaren Sarrera Framework\\'a soilik onartzen da</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Non gorde galdetuko zaizu deskarga bakoitzean</string>\n    <string name=\"no_dir_yet\">Ez da deskargatzeko karpetarik ezarri oraindik, aukeratu lehenetsitako deskargatzeko karpeta orain</string>\n    <string name=\"metadata_privacy\">Pribatutasuna</string>\n    <string name=\"account_terminated\">Kontua itxi da</string>\n    <string name=\"feed_load_error_fast_unknown\">Jario azkarrak ez du honi buruz informazio gehiagorik ematen.</string>\n    <string name=\"metadata_age_limit\">Adin muga</string>\n    <string name=\"metadata_privacy_internal\">Barnekoa</string>\n    <string name=\"metadata_privacy_unlisted\">Zerrendatu gabea</string>\n    <string name=\"metadata_host\">Ostalaria</string>\n    <string name=\"metadata_support\">Laguntza</string>\n    <string name=\"dont_show\">Ez da agertzen</string>\n    <string name=\"low_quality_smaller\">Kalitate txikia (txikiagoa)</string>\n    <string name=\"high_quality_larger\">Kalitate handia (handiagoa)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Bilaketa-barraren miniaturen aurrebista</string>\n    <string name=\"comments_are_disabled\">Iruzkinak desgaituta daude</string>\n    <string name=\"detail_heart_img_view_description\">Sortzaileak baloratua</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Deskarga %1$s ezabatuta</item>\n        <item quantity=\"other\">%1$s deskarga ezabatuta</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Deskarga amaituta</item>\n        <item quantity=\"other\">%s deskarga amaituta</item>\n    </plurals>\n    <string name=\"remote_search_suggestions\">Urruneko bilaketa-iradokizunak</string>\n    <string name=\"local_search_suggestions\">Tokiko bilaketa-iradokizunak</string>\n    <string name=\"mark_as_watched\">Ikusitako gisa markatu</string>\n    <string name=\"main_page_content_swipe_remove\">Irristatu elementuak kentzeko</string>\n    <string name=\"start_main_player_fullscreen_summary\">Ez hasi bideoak mini erreproduzitzailean eta hasi bideoak pantaila osoan zuzenean, auto biraketa blokeatuta badago. Mini erreproduzitzailea erabili dezakezu pantaila osotik irtetzean</string>\n    <string name=\"start_main_player_fullscreen_title\">Hasi erreproduzitzaile nagusia pantaila osoan</string>\n    <string name=\"enqueued_next\">Jarraian jarrita</string>\n    <string name=\"enqueue_next_stream\">Gehitu jarraian</string>\n    <string name=\"show_crash_the_player_title\">Erakutsi «Erreproduzitzailea kraskatu»</string>\n    <string name=\"processing_may_take_a_moment\">Prozesatzen... Itxoin mesedez</string>\n    <string name=\"error_report_channel_name\">Errore-txostenen jakinarazpena</string>\n    <string name=\"error_report_channel_description\">Jakinarazpenak erroreen berri emateko</string>\n    <string name=\"error_report_notification_title\">NewPipe-k errore bat aurkitu du, sakatu berri emateko</string>\n    <string name=\"error_report_notification_toast\">Errore bat gertatu da, ikusi jakinarazpena</string>\n    <string name=\"check_for_updates\">Bilatu eguneraketak</string>\n    <string name=\"manual_update_description\">Bilatu bertsio berriak eskuz</string>\n    <string name=\"feed_new_items\">Elementu berriak jarioan</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako.\n\\nMesedez, instalatu Storage Access Framework-ekin bateragarria den fitxategi kudeatzaile bat</string>\n    <string name=\"detail_pinned_comment_view_description\">Ainguratutako iruzkina</string>\n    <string name=\"crash_the_player\">Erreproduzitzailea kraskatu</string>\n    <string name=\"checking_updates_toast\">Eguneraketak bilatzen…</string>\n    <string name=\"no_appropriate_file_manager_message\">Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako.\n\\nMesedez, instalatu fitxategi kudeatzaile bat edo saiatu \\'%s\\' desgaitzen deskarga ezarpenetan</string>\n    <string name=\"show_crash_the_player_summary\">Erreproduzitzailea erabiltzean kraskadura aukera erakusten du</string>\n    <string name=\"show_error_snackbar\">Erakutsi errore barra bat</string>\n    <string name=\"create_error_notification\">Sortu errore jakinarazpen bat</string>\n    <string name=\"settings_category_player_notification_summary\">Konfiguratu uneko erreprodukzio-igorpenaren jakinarazpena</string>\n    <string name=\"notifications\">Jakinarazpenak</string>\n    <string name=\"settings_category_player_notification_title\">Erreproduzitzailearen jakinarazpenak</string>\n    <string name=\"streams_notification_channel_name\">Igorpen berriak</string>\n    <string name=\"check_new_streams\">Bilatu igorpen berriak</string>\n    <string name=\"enable_streams_notifications_title\">Igorpen berrien jakinarazpenak</string>\n    <string name=\"any_network\">Edozein sare</string>\n    <string name=\"notifications_disabled\">Jakinarazpenak desgaituta daude</string>\n    <string name=\"you_successfully_subscribed\">Kanal honetara harpidetu zara</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Txandakatu denak</string>\n    <string name=\"enable_streams_notifications_summary\">Harpidetzen igorpen berriei buruz jakinarazi</string>\n    <string name=\"delete_downloaded_files_confirm\">Ezabatu deskargatutako fitxategi guztiak biltegitik\\?</string>\n    <string name=\"streams_notification_channel_description\">Harpidetzen igorpen berrien jakinarazpenak</string>\n    <string name=\"loading_stream_details\">Igorpenaren xehetasunak kargatzen…</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">Igorpen berri %s</item>\n        <item quantity=\"other\">%s igorpen berri</item>\n    </plurals>\n    <string name=\"leak_canary_not_available\">LeakCanary ez dago eskuragarri</string>\n    <string name=\"streams_notifications_interval_title\">Egiaztatze maiztasuna</string>\n    <string name=\"get_notified\">Jaso jakinarazpenak</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer lehenetsia</string>\n    <string name=\"streams_notifications_network_title\">Beharrezko sareko konexioa</string>\n    <string name=\"percent\">Portzentaia</string>\n    <string name=\"semitone\">Semitonoa</string>\n    <string name=\"progressive_load_interval_title\">Erreprodukzioaren kargatze-tartearen tamaina</string>\n    <string name=\"streams_not_yet_supported_removed\">Deskargatzaileak onartzen ez dituen igorpenak ez dira erakusten</string>\n    <string name=\"selected_stream_external_player_not_supported\">Kanpoko erreproduzitzaileek ez dute hautatutako igorpena onartzen</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Ez dago audio-igorpenik eskuragarri kanpoko erreproduzitzaileentzat</string>\n    <string name=\"no_video_streams_available_for_external_players\">Ez dago bideo-igorpenik eskuragarri kanpoko erreproduzitzaileentzat</string>\n    <string name=\"unknown_format\">Formatu ezezaguna</string>\n    <string name=\"unknown_quality\">Kalitate ezezaguna</string>\n    <string name=\"select_quality_external_players\">Hautatu kanpoko erreproduzitzaileen kalitatea</string>\n    <string name=\"duplicate_in_playlist\">Grisez idatzitako erreprodukzio-zerrendek jada badute elementu hau.</string>\n    <string name=\"faq\">Webgunean ikusi</string>\n    <string name=\"msg_failed_to_copy\">Akatsa arbelera kopiatzeak huts egin du</string>\n    <string name=\"faq_description\">Arazoren bat baduzu aplikazioa erabiltzerakoan, irakur itzazu ohiko galdera hauen erantzunak!</string>\n    <string name=\"unset_playlist_thumbnail\">Betiko miniatura kendu</string>\n    <string name=\"app_update_unavailable_toast\">NewPipe-en azken bertsioa erabiltzen ari zara</string>\n    <string name=\"app_update_available_notification_text\">Sakatu %s deskargatzeko</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Kopia %d aldiz gehitu da</string>\n    <string name=\"card\">Txartela</string>\n    <string name=\"night_theme_available\">Aukera hau Gaiarako %s aukeratua badago soilik dago erabilgarri</string>\n    <string name=\"sort\">Ordenatu</string>\n    <string name=\"fast_mode\">Modu azkarra</string>\n    <string name=\"import_subscriptions_hint\">Hiru-puntutako menutik harpidetzak inportatu edo esportatu</string>\n    <string name=\"faq_title\">Maiz egindako galderak</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ezikusi hardware multimedia-botoien gertaerak</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Erabilgarria, adibidez, botoi fisiko hautsiak dituen entzungailua erabiltzen ari bazara</string>\n    <string name=\"remove_duplicates\">Kendu bikoiztuak</string>\n    <string name=\"remove_duplicates_title\">Kendu bikoiztuak\\?</string>\n    <string name=\"remove_duplicates_message\">Igorpen bikoiztu guztiak kendu nahi dituzu zerrenda honetatik?</string>\n    <string name=\"feed_hide_streams_title\">Erakutsi hurrengo igorpenak</string>\n    <string name=\"feed_show_hide_streams\">Erakutsi/Ezkutatu igorpenak</string>\n    <string name=\"feed_show_partially_watched\">Partzialki ikusita</string>\n    <string name=\"feed_show_watched\">Guztiz ikusia</string>\n    <string name=\"feed_show_upcoming\">Laster agertzeko</string>\n    <string name=\"metadata_subscribers\">Harpidedunak</string>\n    <string name=\"unknown_audio_track\">Ezezaguna</string>\n    <string name=\"volume\">Bolumena</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Erabili ExoPlayer-en deskodetzailearen ordezko ezaugarria</string>\n    <string name=\"none\">Bat ere ez</string>\n    <string name=\"loading_metadata_title\">Metadatuak kargatzen…</string>\n    <string name=\"settings_category_exoplayer_summary\">Kudeatu ExoPlayer-en ezarpen batzuk. Aldaketa hauek eragina izan dezaten, erreproduzitzailea berrabiarazi behar da</string>\n    <string name=\"main_tabs_position_title\">Fitxa nagusien kokapena</string>\n    <string name=\"feed_fetch_channel_tabs\">Lortu kanalaren fitxak</string>\n    <string name=\"metadata_avatars\">Abatarrak</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"right_gesture_control_title\">Eskuineko keinuaren ekintza</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Erabili beti ExoPlayer-en bideo-irteeraren interfazeko ezarpenaren konponbidea</string>\n    <string name=\"next_stream\">Hurrengo igorpena</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Multimedia-tunela desgaitu da lehenespenez gailuan, gailuaren modeloak ez du onartzen eta.</string>\n    <string name=\"metadata_subchannel_avatars\">Azpikanalen abatarrak</string>\n    <string name=\"audio_track_present_in_video\">Audio-pista bat egon beharko litzateke igorpen honetan dagoeneko</string>\n    <string name=\"prefer_original_audio_summary\">Hautatu jatorrizko audioaren pista hizkuntza zein den kontuan hartu gabe</string>\n    <string name=\"select_audio_track_external_players\">Hautatu kanpoko erreproduzitzailearen audio-pista</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Lortuko diren fitxak jarioa eguneratzean. Aukera honek ez du eraginik kanal bat modu azkarra erabiliz eguneratzen bada.</string>\n    <string name=\"prefer_descriptive_audio_summary\">Hautatu ikusmen-urritasuna dutenentzako azalpenak dituzten audio-pista bat erabilgarri badago</string>\n    <string name=\"left_gesture_control_title\">Ezkerreko keinuaren ekintza</string>\n    <string name=\"prefer_descriptive_audio_title\">Hobetsi audio deskribatzailea</string>\n    <string name=\"metadata_uploader_avatars\">Igotako abatarrak</string>\n    <string name=\"progressive_load_interval_summary\">Aldatu eduki progresiboen kargatze-tartearen tamaina (oraingoa: %s). Balio baxu batek hasierako karga bizkortu dezake</string>\n    <string name=\"prefer_original_audio_title\">Hobetsi jatorrizko audioa</string>\n    <string name=\"play_queue_audio_track\">Audioa: %s</string>\n    <string name=\"metadata_banners\">Bannerrak</string>\n    <string name=\"right_gesture_control_summary\">Aukeratu erreproduzigailuaren pantailaren eskuin erdiaren keinua</string>\n    <string name=\"main_tabs_position_summary\">Mugitu fitxa-hautatzaile nagusia azpira</string>\n    <string name=\"audio_track\">Audio-pista</string>\n    <string name=\"no_live_streams\">Zuzeneko igorpenik ez</string>\n    <string name=\"metadata_thumbnails\">Miniaturak</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer-en ezarpenak</string>\n    <string name=\"brightness\">Distira</string>\n    <string name=\"no_streams\">Igorpenik ez</string>\n    <string name=\"previous_stream\">Aurreko igorpena</string>\n    <string name=\"left_gesture_control_summary\">Aukeratu erreproduzitzailearen pantailaren ezker erdiaren keinua</string>\n    <string name=\"channel_tab_livestreams\">Zuzenekoa</string>\n    <string name=\"audio_track_type_descriptive\">deskriptiboa</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"channel_tab_about\">Honi buruz</string>\n    <string name=\"no\">Ez</string>\n    <string name=\"notification_actions_summary_android13\">Editatu beheko jakinarazpen-ekintza bakoitza sakatuz. Lehen hiru ekintzak (erreproduzitu/pausatu, aurrekoa eta hurrengoa) sistemarengatik ezarrita daude eta ezin dira pertsonalizatu.</string>\n    <string name=\"rewind\">Atzera egin</string>\n    <string name=\"image_quality_title\">Irudiaren kalitatea</string>\n    <string name=\"more_options\">Aukera gehiago</string>\n    <string name=\"duration\">Iraupena</string>\n    <string name=\"forward\">Aurrera egin</string>\n    <string name=\"audio_track_type_original\">jatorrizkoa</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"yes\">Bai</string>\n    <string name=\"settings_category_backup_restore_title\">Babeskopia eta berrezarpena</string>\n    <string name=\"auto_update_check_description\">NewPipe-k bertsio berriak bilatu ditzake eta eskuragarri daudenean jakinarazi.\n\\nHau gaitu nahi duzu?</string>\n    <string name=\"reset_settings_title\">Berrezarri ezarpenak</string>\n    <string name=\"reset_settings_summary\">Berrezarri ezarpen guztiak lehenetsitako baliotara</string>\n    <string name=\"reset_all_settings\">Ezarpenak berrezartzeak zure ezarpen gogokoenak baztertzen ditu eta aplikazioa berrabiarazten du.\n\\n\n\\nAurrera egin nahi duzu?</string>\n    <string name=\"error_insufficient_storage\">Ez dago leku libre nahikorik gailuan</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\n\\nAukera hau gaitzeak erreprodukzio erroreak saihestu ditzake bideo-erreproduktorea aldatzean edo pantaila osoan jartzean</string>\n    <string name=\"audio_track_type_dubbed\">bikoiztua</string>\n    <string name=\"channel_tab_videos\">Bideoak</string>\n    <string name=\"channel_tab_tracks\">Pistak</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"channel_tab_channels\">Kanalak</string>\n    <string name=\"channel_tab_playlists\">Erreprodukzio-zerrendak</string>\n    <string name=\"channel_tab_albums\">Albumak</string>\n    <string name=\"show_channel_tabs\">Kanalaren fitxak</string>\n    <string name=\"show_channel_tabs_summary\">Ze fitxa erakusten diren kanal-orrietan</string>\n    <string name=\"open_play_queue\">Ireki erreprodukzio-ilara</string>\n    <string name=\"toggle_fullscreen\">Aldatu pantaila osora</string>\n    <string name=\"toggle_screen_orientation\">Aldatu pantailaren orientazioa</string>\n    <string name=\"play\">Erreproduzitu</string>\n    <string name=\"replay\">Berriro erreproduzitu</string>\n    <string name=\"image_quality_summary\">Aukeratu irudien kalitatea eta irudiak kargatu nahi dituzun ala ez, datuen eta memoriaren erabilera murrizteko. Aldaketek memoriako zein diskoko irudien cachea garbitzen dute — %s</string>\n    <string name=\"image_quality_none\">Ez kargatu irudiak</string>\n    <string name=\"image_quality_low\">Kalitate baxua</string>\n    <string name=\"image_quality_medium\">Kalitate ertaina</string>\n    <string name=\"image_quality_high\">Kalitate altua</string>\n    <string name=\"share_playlist\">Partekatu erreprodukzio-zerrenda</string>\n    <string name=\"show_more\">Erakutsi gehiago</string>\n    <string name=\"share_playlist_with_titles\">Partekatu tituluekin</string>\n    <string name=\"share_playlist_with_list\">Partekatu URL zerrenda</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">erantzun %s</item>\n        <item quantity=\"other\">%s erantzun</item>\n    </plurals>\n    <string name=\"show_less\">Erakutsi gutxiago</string>\n    <string name=\"audio_track_type_secondary\">bigarren mailako</string>\n    <string name=\"search_with_service_name\">Bilatu %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Bilatu %1$s (%2$s)</string>\n    <string name=\"tab_bookmarks_short\">Erreprodukzio-zerrendak</string>\n    <string name=\"permission_display_over_apps_message\">Laster-leiho erreproduzitzailea erabiltzeko, hautatu %1$s Android-en ezarpenen menu hauan, eta gaitu %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">«Baimendu beste aplikazio batzuen gainean bistaratzea»</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sMM</string>\n    <string name=\"delete_file\">Ezabatu fitxategia</string>\n    <string name=\"delete_entry\">Ezabatu sarrera</string>\n    <string name=\"select_a_feed_group\">Hatutatu jario talde bat</string>\n    <string name=\"no_feed_group_created_yet\">Ez da jario talderik sortu oraindik</string>\n    <string name=\"feed_group_page_summary\">Kanal-taldeen orria</string>\n    <string name=\"account_terminated_service_provides_reason\">Kontua itxi da\\n\\n%1$s-ek arrazoi hau ematen du: %2$s</string>\n    <string name=\"channel_tab_likes\">Gustoko</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Partekatu YouTubeko aldi baterako erreprodukzio-zerrenda gisa</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud-eko 50 onenen orrialdea kendu da</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud-ek jatorrizko Top 50 zerrendetan eten egin du. Dagokion fitxa kendu da zure orrialde nagusitik.</string>\n    <string name=\"migration_info_7_8_title\">YouTubeko joera konbinatuak kendu dira</string>\n    <string name=\"migration_info_7_8_message\">YouTube-k joera-orrialde konbinatua eten du 2025eko uztailaren 21etik aurrera. NewPipe-k joera-orrialde lehenetsia zuzeneko emankizunekin ordezkatu du.\\n\\nJoera desberdineko orrialdeak ere hauta ditzakezu \\\"Ezarpenak &gt; Edukia &gt; Orrialde nagusiaren edukia\\\" atalean.</string>\n    <string name=\"trending_gaming\">Bideojoko joerak</string>\n    <string name=\"trending_podcasts\">Podcast joerak</string>\n    <string name=\"trending_movies\">Film eta telesail joerak</string>\n    <string name=\"trending_music\">Musika joerak</string>\n    <string name=\"entry_deleted\">Sarrera ezabatua</string>\n    <string name=\"player_http_403\">403 HTTP errorea jaso da zerbitzaritik erreproduzitzen ari zenean, ziurrenik streaming URLaren iraungipenak edo IP debeku batek eraginda</string>\n    <string name=\"player_http_invalid_status\">%1$s HTTP errorea jaso da zerbitzaritik erreproduzitzen ari zela</string>\n    <string name=\"youtube_player_http_403\">403 HTTP errorea jaso da zerbitzaritik erreproduzitzen ari zenean, ziurrenik IP debeku batek edo streaming URLaren desofuskazio arazoek eraginda</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s-ek datuak emateari uko egin dio, eskatzailea bot bat ez dela baieztatzeko saioa hasteko eskatuz.\\n\\nBaliteke zure IP helbidea %1$s-ek aldi baterako debekatu izana, denbora pixka bat itxaron dezakezu edo beste IP batera aldatu (adibidez, VPN bat aktibatu/itzaliz, edo WiFitik datu mugikorretara aldatuz).</string>\n    <string name=\"unsupported_content_in_country\">Eduki hau ez dago eskuragarri hautatutako edukiaren herrialderako.\\n\\nAldatu zure hautaketa \\\"Ezarpenak &gt; Edukia &gt; Edukiaren herrialde lehenetsia\\\" ataletik.</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-fa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">برای شروع، ذره‌بین را بزنید.</string>\n    <string name=\"upload_date_text\">منتشر شده در %1$s</string>\n    <string name=\"no_player_found\">هیچ پخش‌کنندهٔ جریانی پیدا نشد. مایلید وی‌ال‌سی نصب شود؟</string>\n    <string name=\"install\">نصب</string>\n    <string name=\"cancel\">لغو</string>\n    <string name=\"open_in_browser\">گشودن در مرورگر</string>\n    <string name=\"share\">هم‌رسانی</string>\n    <string name=\"download\">بارگیری</string>\n    <string name=\"search\">جست‌وجو</string>\n    <string name=\"settings\">تنظیمات</string>\n    <string name=\"did_you_mean\">منظورتان «%1$s» بود؟</string>\n    <string name=\"share_dialog_title\">هم‌رسانی با</string>\n    <string name=\"use_external_video_player_title\">استفاده از پخش‌کنندهٔ ویدیوی خارجی</string>\n    <string name=\"use_external_audio_player_title\">استفاده از پخش‌کنندهٔ صدای خارجی</string>\n    <string name=\"download_path_title\">شاخهٔ بارگیری ویدیو</string>\n    <string name=\"download_path_summary\">پرونده‌های ویدیویی بارگرفته این‌جا ذخیره می‌شوند</string>\n    <string name=\"download_path_dialog_title\">گزینش شاخه برای بارگیری پرونده‌های ویدیویی</string>\n    <string name=\"download_path_audio_title\">شاخهٔ بارگیری صدا</string>\n    <string name=\"download_path_audio_summary\">پرونده‌های صوتی بارگرفته این‌جا ذخیره می‌شوند</string>\n    <string name=\"download_path_audio_dialog_title\">گزینش شاخهٔ بارگیری برای پرونده‌های صوتی</string>\n    <string name=\"default_resolution_title\">وضوح پیش‌گزیده</string>\n    <string name=\"play_with_kodi_title\">پخش با کودی</string>\n    <string name=\"kore_not_found\">کارهٔ کُره (Kore) پیدا نشد. نصب شود؟</string>\n    <string name=\"show_play_with_kodi_title\">نمایش گزینهٔ «پخش با کودی»</string>\n    <string name=\"show_play_with_kodi_summary\">نمایش گزینه‌ای برای پخش ویدیو با مرکز رسانهٔ کودی</string>\n    <string name=\"play_audio\">صدا</string>\n    <string name=\"default_audio_format_title\">قالب صدای پیش‌گزیده</string>\n    <string name=\"theme_title\">زمینه</string>\n    <string name=\"dark_theme_title\">تیره</string>\n    <string name=\"light_theme_title\">روشن</string>\n    <string name=\"download_dialog_title\">بارگیری</string>\n    <string name=\"show_next_and_similar_title\">نماش ویدیوهای «بعدی» و «مشابه»</string>\n    <string name=\"unsupported_url\">نشانی پشتیبانی نشده</string>\n    <string name=\"content_language_title\">زبان محتوای ترجیحی</string>\n    <string name=\"settings_category_video_audio_title\">ویدیو و صدا</string>\n    <string name=\"settings_category_appearance_title\">ظاهر</string>\n    <string name=\"background_player_playing_toast\">در حال پخش در پس‌زمینه</string>\n    <string name=\"content\">محتوا</string>\n    <string name=\"show_age_restricted_content_title\">نمایش محتوای محدود شده بر اساس سن</string>\n    <string name=\"duration_live\">زنده</string>\n    <string name=\"downloads\">بارگیری‌ها</string>\n    <string name=\"downloads_title\">بارگیری‌ها</string>\n    <string name=\"error_report_title\">گزارش خطا</string>\n    <string name=\"general_error\">خطا</string>\n    <string name=\"network_error\">خطای شبکه</string>\n    <string name=\"could_not_load_thumbnails\">نمی‌توان تمام بندانگشتی‌ها را بار کرد</string>\n    <string name=\"parsing_error\">نمی‌توان پایگاه وب را تجزیه کرد</string>\n    <string name=\"content_not_available\">محتوا در دسترس نیست</string>\n    <string name=\"could_not_setup_download_menu\">نمی‌توان فهرست بارگیری را برپا ساخت</string>\n    <string name=\"sorry_string\">ببخشید! نباید این اتّفاق زخ می‌داد.</string>\n    <string name=\"error_report_button_text\">گزارش با رایانامه</string>\n    <string name=\"error_snackbar_message\">ببخشید، چیزی به درستی پیش نرفت.</string>\n    <string name=\"error_snackbar_action\">گزارش</string>\n    <string name=\"what_device_headline\">اطّلاعات:</string>\n    <string name=\"what_happened_headline\">چه روی داد:</string>\n    <string name=\"your_comment\">توضیح شما (به انگلیسی):</string>\n    <string name=\"error_details_headline\">جزییات:</string>\n    <string name=\"detail_thumbnail_view_description\">پخش ویدیو، مدت زمان:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">بندانگشتی کاربر بارگذاری کننده</string>\n    <string name=\"detail_likes_img_view_description\">پسندها</string>\n    <string name=\"detail_dislikes_img_view_description\">نپسندیدن‌ها</string>\n    <string name=\"video\">ویدیو</string>\n    <string name=\"audio\">صدا</string>\n    <string name=\"retry\">تلاش دوباره</string>\n    <string name=\"start\">شروع</string>\n    <string name=\"pause\">مکث</string>\n    <string name=\"delete\">حذف</string>\n    <string name=\"checksum\">مجموع مقابله‌ای</string>\n    <string name=\"ok\">قبول</string>\n    <string name=\"msg_name\">نام پرونده</string>\n    <string name=\"msg_threads\">رشته‌ها</string>\n    <string name=\"msg_error\">خطا</string>\n    <string name=\"msg_running\">نیوپایپ در حال بارگیری است</string>\n    <string name=\"msg_running_detail\">برای جزییات، ضربه بزنید</string>\n    <string name=\"msg_wait\">لطفاً صبر کنید…</string>\n    <string name=\"msg_copied\">در حافظه رونوشت شد</string>\n    <string name=\"no_available_dir\">پوشه بارگیری را بعدا در تنظیمات مشخص کنید</string>\n    <string name=\"no_player_found_toast\">هیچ پخش کنندهٔ جریانی پیدا نشد (می‌توانید برای پخشش وی‌ال‌سی را نصب کنید).</string>\n    <string name=\"controls_download_desc\">بارگیری پروندهٔ جریان</string>\n    <string name=\"use_external_video_player_summary\">صدا را در برخی وضوح‌ها برمی‌دارد</string>\n    <string name=\"subscribe_button_title\">اشتراک</string>\n    <string name=\"subscribed_button_title\">مشترک شده</string>\n    <string name=\"channel_unsubscribed\">اشتراک کانال لغو شد</string>\n    <string name=\"subscription_change_failed\">ناتوانی در تغییر وضعیت اشتراک</string>\n    <string name=\"subscription_update_failed\">ناتوانی در به‌روزرسانی اشتراک</string>\n    <string name=\"show_info\">نمایش اطلاعات</string>\n    <string name=\"tab_subscriptions\">اشتراک‌ها</string>\n    <string name=\"tab_bookmarks\">سیاههٔ پخش‌های نشان شده</string>\n    <string name=\"fragment_feed_title\">موارد جدید</string>\n    <string name=\"controls_background_title\">پس‌زمینه</string>\n    <string name=\"controls_add_to_playlist_title\">افزودن به</string>\n    <string name=\"show_higher_resolutions_title\">نمایش وضوح‌های بالاتر</string>\n    <string name=\"show_higher_resolutions_summary\">تنها برخی دستگاه‌ها توانایی پخش ویدیوهای 2K و 4K را دارند</string>\n    <string name=\"default_video_format_title\">قالب ویدیویی پیش‌گزیده</string>\n    <string name=\"black_theme_title\">سیاه</string>\n    <string name=\"auto_queue_title\">قرار دادن خودکار جریان بعدی در صف</string>\n    <string name=\"show_search_suggestions_title\">پیشنهادهای جستجو</string>\n    <string name=\"show_search_suggestions_summary\">گزینش پیشنهادها برای نمایش هنگام جست‌وجو</string>\n    <string name=\"enable_search_history_title\">تاریخچه جستجو</string>\n    <string name=\"enable_watch_history_summary\">نگه‌داشتن رد ویدیوهای دیده</string>\n    <string name=\"default_content_country_title\">کشور محتوای پیش‌فرض</string>\n    <string name=\"settings_category_player_title\">پخش‌کننده</string>\n    <string name=\"settings_category_player_behavior_title\">رفتار</string>\n    <string name=\"all\">همه</string>\n    <string name=\"channels\">کانال‌ها</string>\n    <string name=\"playlists\">سیاهه‌های پخش</string>\n    <string name=\"users\">کاربران</string>\n    <string name=\"disabled\">غیرفعال</string>\n    <string name=\"clear\">پاک‌کردن</string>\n    <string name=\"play_all\">پخش همه</string>\n    <string name=\"always\">همیشه</string>\n    <string name=\"just_once\">فقط یک‌بار</string>\n    <string name=\"file\">پرونده</string>\n    <string name=\"notification_channel_name\">آگاهی نیوپایپ</string>\n    <string name=\"unknown_content\">[ناشناخته]</string>\n    <string name=\"import_data_title\">وارد کردن پایگاه‌داده</string>\n    <string name=\"export_data_title\">صادرکردن</string>\n    <string name=\"import_data_summary\">تاریخچه، اشتراک‌ها، سیاهه‌های پخش و (به صورت اختیاری) تنظیماتتان را بازنویسی خواهند کرد</string>\n    <string name=\"export_data_summary\">برون‌ریزی پیشینه، اشتراک‌ها، سیاهه‌های پخش و تنظیمات</string>\n    <string name=\"clear_views_history_title\">پاک‌سازی تاریخچهٔ دیدن</string>\n    <string name=\"import_title\">وارد کردن</string>\n    <string name=\"import_from\">وارد کردن از</string>\n    <string name=\"export_to\">صادر کردن به</string>\n    <string name=\"import_ongoing\">در حال وارد کردن…</string>\n    <string name=\"export_ongoing\">در حال صدور…</string>\n    <string name=\"subscriptions_import_unsuccessful\">ناتوانی در ورود اشتراک‌ها</string>\n    <string name=\"subscriptions_export_unsuccessful\">ناتوانی در صدور اشتراک‌ها</string>\n    <string name=\"playback_speed_control\">کنترل‌های سرعت پخش</string>\n    <string name=\"accept\">قبول</string>\n    <string name=\"decline\">رد</string>\n    <string name=\"limit_data_usage_none_description\">بدون محدودیت</string>\n    <string name=\"minimize_on_exit_none_description\">هیچ</string>\n    <string name=\"best_resolution\">بهترین وضوح</string>\n    <string name=\"delete_view_history_alert\">تمام تاریخچه نمایش پاک شود؟</string>\n    <string name=\"watch_history_deleted\">پیشینهٔ مشاهده حذف شد</string>\n    <string name=\"clear_search_history_title\">پاک‌کردن تاریخچه جستجو</string>\n    <string name=\"clear_search_history_summary\">تاریخچه کلیدواژه‌های جستجو را پاک می‌کند</string>\n    <string name=\"delete_search_history_alert\">تمام تاریخچه جستجو پاک شود؟</string>\n    <string name=\"search_history_deleted\">پیشینهٔ جست‌جو حذف شد</string>\n    <string name=\"player_stream_failure\">ناتوانی در پخش این جریان</string>\n    <string name=\"video_streams_empty\">هیچ جریان ویدیویی پیدا نشد</string>\n    <string name=\"audio_streams_empty\">هیچ جریان صدایی پیدا نشد</string>\n    <string name=\"invalid_directory\">چنین پوشه‌ای وجود ندارد</string>\n    <string name=\"invalid_source\">چنین منبع محتوا/پرونده‌ای وجود ندارد</string>\n    <string name=\"file_name_empty_error\">نام پرونده نمی‌تواند خالی باشد</string>\n    <string name=\"error_occurred_detail\">خطایی رخ داد: %1$s</string>\n    <string name=\"no_streams_available_download\">جریانی برای بارگیری در دسترس نیست</string>\n    <string name=\"search_no_results\">بدون نتیجه</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s مشترک</item>\n        <item quantity=\"other\">%s مشترک</item>\n    </plurals>\n    <string name=\"no_views\">بدون بازدید</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s بازدید</item>\n        <item quantity=\"other\">%s بازدید</item>\n    </plurals>\n    <string name=\"no_videos\">بدون ویدیو</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s ویدیو</item>\n        <item quantity=\"other\">%s ویدیو</item>\n    </plurals>\n    <string name=\"create\">ایجاد</string>\n    <string name=\"dismiss\">صرف نظر</string>\n    <string name=\"rename\">تغییر نام</string>\n    <string name=\"one_item_deleted\">یک مورد پاک شد.</string>\n    <string name=\"settings_file_charset_title\">نویسه‌های مجاز در نام پرونده‌ها</string>\n    <string name=\"settings_file_replacement_character_summary\">نویسه‌های نامعتبر با این مقدار جایگزین شدند</string>\n    <string name=\"settings_file_replacement_character_title\">نویسه جایگزین</string>\n    <string name=\"charset_letters_and_digits\">حروف و اعداد</string>\n    <string name=\"charset_most_special_characters\">مهم‌ترین نویسه‌های خاص</string>\n    <string name=\"title_activity_about\">درباره نیوپایپ</string>\n    <string name=\"tab_about\">درباره و سوالات‌متداول</string>\n    <string name=\"tab_licenses\">پروانه‌ها</string>\n    <string name=\"app_description\">پخش‌کننده آزاد سبُک برای اندروید.</string>\n    <string name=\"contribution_title\">مشارکت</string>\n    <string name=\"view_on_github\">دیدن روی گیت‌هاب</string>\n    <string name=\"donation_title\">اعانه</string>\n    <string name=\"website_title\">وب‌سایت</string>\n    <string name=\"privacy_policy_title\">سیاست حریم خصوصی نیوپایپ</string>\n    <string name=\"read_privacy_policy\">خواندن سیاست حریم خصوصی</string>\n    <string name=\"app_license_title\">پروانه نیوپایپ</string>\n    <string name=\"read_full_license\">خواندن پروانه</string>\n    <string name=\"title_activity_history\">تاریخچه</string>\n    <string name=\"action_history\">تاریخچه</string>\n    <string name=\"delete_item_search_history\">می‌خواهید این مورد را از تاریخچه جستجو پاک کنید؟</string>\n    <string name=\"title_last_played\">آخرین پخش‌شده</string>\n    <string name=\"title_most_played\">بیشترین پخش‌شده</string>\n    <string name=\"main_page_content\">محتوای صفحه اصلی</string>\n    <string name=\"blank_page_summary\">صفحه خالی</string>\n    <string name=\"kiosk_page_summary\">صفحه کیوسک</string>\n    <string name=\"channel_page_summary\">صفحه کانال</string>\n    <string name=\"select_a_channel\">کانالی را انتخاب کنید</string>\n    <string name=\"no_channel_subscribed_yet\">هنز کانال مشترک‌شده‌ای وجود ندارد</string>\n    <string name=\"select_a_kiosk\">یک کیوسک را انتخاب کنید</string>\n    <string name=\"trending\">محبوب</string>\n    <string name=\"top_50\">۵۰ برتر</string>\n    <string name=\"new_and_hot\">جدید و داغ</string>\n    <string name=\"play_queue_remove\">حذف</string>\n    <string name=\"play_queue_stream_detail\">جزئیات</string>\n    <string name=\"play_queue_audio_settings\">تنظیمات صدا</string>\n    <string name=\"video_player\">پخش‌کنندهٔ ویدیو</string>\n    <string name=\"background_player\">پخش‌کننده پس‌زمینه</string>\n    <string name=\"always_ask_open_action\">همیشه بپرس</string>\n    <string name=\"preferred_player_fetcher_notification_title\">در حال دریافت اطلاعات…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">بارگذری محتوای درخواستی</string>\n    <string name=\"create_playlist\">فهرست پخش جدید</string>\n    <string name=\"rename_playlist\">تغییر نام</string>\n    <string name=\"name\">نام</string>\n    <string name=\"add_to_playlist\">افزودن به سیاههٔ پخش</string>\n    <string name=\"set_as_playlist_thumbnail\">تنظیم برای تصویر سیاههٔ پخش</string>\n    <string name=\"delete_playlist_prompt\">این فهرست پخش پاک شود؟</string>\n    <string name=\"playlist_creation_success\">فهرست پخش ایجاد شد</string>\n    <string name=\"playlist_add_stream_success\">به فهرست پخش افزوده شد</string>\n    <string name=\"playlist_thumbnail_change_success\">تصویر فهرست پخش تغییر کرد.</string>\n    <string name=\"caption_none\">بدون توضیحات</string>\n    <string name=\"caption_setting_title\">توضحیات</string>\n    <string name=\"unsubscribe\">لغو اشتراک</string>\n    <string name=\"tab_choose\">گزینش زبانه</string>\n    <string name=\"enable_watch_history_title\">تاریخچه تماشا</string>\n    <string name=\"settings_category_history_title\">تاریخچه و حافظه نهان</string>\n    <string name=\"settings_category_debug_title\">اشکال‌زدایی</string>\n    <string name=\"settings_category_updates_title\">به‌روزرسانی‌ها</string>\n    <string name=\"open_in_popup_mode\">گشودن در حالت تصویردرتصویر</string>\n    <string name=\"default_popup_resolution_title\">وضوح پیش‌گزیدهٔ تصویردرتصویر</string>\n    <string name=\"controls_popup_title\">تصویردرتصویر</string>\n    <string name=\"popup_remember_size_pos_title\">به یاد داشتن ویژگی‌های تصویر در تصویر</string>\n    <string name=\"popup_remember_size_pos_summary\">به یاد داشتن آخرین اندازه و موقعیت تصویر در تصویر</string>\n    <string name=\"use_inexact_seek_title\">زمان فعلی پخش کننده را به صورت تقریبی و سریع جلو ببر</string>\n    <string name=\"use_inexact_seek_summary\">جویش نادقیق می‌گذارد پخش‌کننده سریع‌تر، ولی با دقّت کم‌تری به موقعیت‌ها برود. در این حالت، جویش‌های ۵، ۱۵ یا ۲۵ثانیه‌ای کار نمی‌کنند</string>\n    <string name=\"app_ui_crash\">کاره یا رابط کاربری با خطا مواجه شد</string>\n    <string name=\"settings_category_downloads_title\">بارگیری</string>\n    <string name=\"switch_to_background\">تغییر وضعیت به پس‌زمینه</string>\n    <string name=\"switch_to_main\">تغییر وضعیت به اصلی</string>\n    <string name=\"detail_drag_description\">برای تغییر ترتیب، بکشید</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">حافظه نهان تصویر پاک شد</string>\n    <string name=\"import_settings\">می‌خواهید تنظیمات را نیز وارد کنید؟</string>\n    <string name=\"playback_step\">گام</string>\n    <string name=\"file_deleted\">پرونده پاک شد</string>\n    <string name=\"app_update_notification_channel_name\">آگاهی به‌روزرسانی کاره</string>\n    <string name=\"app_update_notification_channel_description\">آگاهی‌ها برای نگارش‌های جدید نیوپایپ</string>\n    <string name=\"restore_defaults\">بازنشانی پیش‌فرض‌ها</string>\n    <string name=\"restore_defaults_confirmation\">می‌خواهید پیش‌فرض‌ها را بازنشانی کنید؟</string>\n    <string name=\"updates_setting_title\">به‌روزرسانی‌ها</string>\n    <string name=\"list_view_mode\">حالت نمایش سیاهه</string>\n    <string name=\"list\">سیاهه</string>\n    <string name=\"grid\">شبکه</string>\n    <string name=\"auto\">خودکار</string>\n    <string name=\"app_update_available_notification_title\">به‌روزرسانی برای نیوپایپ موجود است!</string>\n    <string name=\"missions_header_finished\">تمام</string>\n    <string name=\"missions_header_pending\">در انتظار</string>\n    <string name=\"enqueue\">صف‌گذاری</string>\n    <string name=\"download_failed\">بارگیری ناموفق بود</string>\n    <string name=\"error_http_not_found\">یافت نشد</string>\n    <string name=\"error_postprocessing_failed\">شکست در پساپردازش</string>\n    <string name=\"max_retry_desc\">بیشینه تعداد تلاش‌ها پیش از لغو بارگیری</string>\n    <string name=\"events\">رویدادها</string>\n    <string name=\"show_comments_title\">نمایش نظرات</string>\n    <string name=\"show_comments_summary\">خاموش کنید تا نظرات پنهان شوند</string>\n    <string name=\"autoplay_title\">پخش خودکار</string>\n    <string name=\"no_comments\">بدون نظر</string>\n    <string name=\"error_unable_to_load_comments\">ناتوانی در دریافت نظرات</string>\n    <string name=\"resume_on_audio_focus_gain_title\">پخش ادامه یابد</string>\n    <string name=\"enable_search_history_summary\">ذخیره محلی نتایج جستجو</string>\n    <string name=\"auto_queue_summary\">صف پخش در حال پایان (بدون تکرار) را با افزودن یک جریان مرتبط ادامه دهید</string>\n    <string name=\"enable_playback_resume_title\">ادامه پخش</string>\n    <string name=\"enable_playback_resume_summary\">بازگرداندن آخرین موقعیت پخش</string>\n    <string name=\"enable_playback_state_lists_title\">موقعیت در فهرست‌ها</string>\n    <string name=\"enable_playback_state_lists_summary\">نمایش شاخص موقعیت پخش در فهرست‌ها</string>\n    <string name=\"settings_category_clear_data_title\">پاک کردن داده‌ها</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">پخش بعد از قطع ناگهانی (مثل برقراری تماس) ادامه یابد</string>\n    <string name=\"show_hold_to_append_title\">نمایش نکته «برای صف‌گذاری، نگه‌دارید»</string>\n    <string name=\"show_hold_to_append_summary\">نمایش راهنما هنگام فشردن پس زمینه یا دکمهٔ تصویر در تصویر در «جزییات:» ویدیو</string>\n    <string name=\"hold_to_append\">برای در صف قرار دادن، نگه دارید</string>\n    <string name=\"undo\">بازگردانی</string>\n    <string name=\"info_labels\">چی:\\nدرخواست:\\nزبان محتوا:\\nکشور محتوا:\\nزبان اپ:\\nخدمت:\\nزمان GMT\\nپکیج:T:\\nنسخه:\\nنسخه‌اندروید:</string>\n    <string name=\"title_activity_recaptcha\">چالش ری‌کپچا</string>\n    <string name=\"recaptcha_request_toast\">نیاز به چالش ری‌کپچا است</string>\n    <string name=\"msg_popup_permission\">این اجازه برای گشودن در حالت\n\\nتصویر در تصویر لازم است</string>\n    <string name=\"popup_playing_toast\">نمایش در حالت تصویر در تصویر</string>\n    <string name=\"title_licenses\">پروانه‌های شخص سوم</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s توسط %2$s تحت %3$s</string>\n    <string name=\"contribution_encouragement\">اگر ایده‌ای برای ترجمه، تغییر طراحی، پاک‌سازی کد و یا تغییرات واقعا سنگین کدنویسی دارید، از کمک‌تان همواره استقبال می‌کنیم. هر چه بیشتر کار کنیم، نتایج بهتری می‌گیریم!</string>\n    <string name=\"notification_channel_description\">آگاهی‌ها برای پخش‌کنندهٔ نیوپایپ</string>\n    <string name=\"empty_list_subtitle\">چیزی جز کریکت اینجا نیست</string>\n    <string name=\"no_subscribers\">فاقد مشترک</string>\n    <string name=\"player_unrecoverable_failure\">خطای عدم احیای پخش‌کننده رخ داد</string>\n    <string name=\"player_recoverable_failure\">در حال احیا از خطای پخش‌کننده</string>\n    <string name=\"start_here_on_background\">شروع پخش در پس‌زمینه</string>\n    <string name=\"start_here_on_popup\">شروع پخش در تصویر در تصویر</string>\n    <string name=\"donation_encouragement\">نیوپایپ توسط داوطلبانی توسعه داده می‌شود که با صرف زمان آزاد‌شان، بهترین تجربه کاربری را برای شما به ارمغان می‌آورند. حمایت از توسعه‌دهندگان، به آنها کمک می‌کند تا حین لذت بردن از نوشیدن یک فنجان قهوه، نیوپایپ را به مراتب بهتر کنند.</string>\n    <string name=\"give_back\">حمایت</string>\n    <string name=\"website_encouragement\">برای اطلاعات و اخبار بیشتر، به وب‌سایت نیوپایپ سر بزنید.</string>\n    <string name=\"switch_to_popup\">تغییر وضعیت به تصویر در تصویر</string>\n    <string name=\"drawer_open\">باز کردن کشو</string>\n    <string name=\"drawer_close\">بستن کشو</string>\n    <string name=\"external_player_unsupported_link_type\">پخش‌کننده خارجی، این نوع پیونده‌ها را پشتیبانی نمی‌کند</string>\n    <string name=\"popup_player\">پخش‌کنندهٔ تصویر در تصویر</string>\n    <string name=\"export_complete_toast\">صادر شد</string>\n    <string name=\"import_complete_toast\">وارد شد</string>\n    <string name=\"no_valid_zip_file\">پرونده zip معتبر نیست</string>\n    <string name=\"could_not_import_all_files\">هشدار: ناتوانی در وارد کردن همه پرونده‌ها.</string>\n    <string name=\"override_current_data\">این اقدام، همه تنظمات شما را بازنویسی می‌کند.</string>\n    <string name=\"bookmark_playlist\">نشان‌گذاری سیاههٔ پخش</string>\n    <string name=\"unbookmark_playlist\">حذف نشان</string>\n    <string name=\"resize_fit\">اندازه‌کردن</string>\n    <string name=\"resize_fill\">پر کردن</string>\n    <string name=\"resize_zoom\">بزرگ‌نمایی</string>\n    <string name=\"caption_auto_generated\">تولیدشدهٔ خودکار</string>\n    <string name=\"invalid_file\">پرونده موجود نیست و یا مجوز خواندن یا نوشتن روی آن وجود ندارد</string>\n    <string name=\"import_file_title\">وارد کردن پرونده</string>\n    <string name=\"previous_export\">صادرکردن قبلی</string>\n    <string name=\"import_youtube_instructions\">درون‌ریزی اشتراک‌های یوتوب از بیرون‌بری گوگل:\n\\n\n\\n۱. به این نشانی بروید: %1$s\n\\n۲. در صورت نیاز، وارد شوید\n\\n۳. روی All data included و سپس Deselect all کیلک کنید. سپس تنها subscriptions را گزیده و OK را بزنید\n\\n۴. روی Next step و سپس Create export کلیک کنید\n\\n۵.پس از ظاهر شدن دکمهٔ Download رویش کلیک کنید\n\\n۶. درون‌ریزی پرونده را در زیر زده و پروندهٔ فشردهٔ بارگیری شده را برگزینید\n\\n۷. [اگر درون‌ریزی شکست خورد] پروندهٔ ‪.csv‬ را (معمولاً زیر YouTube and YouTube Music/subscriptions/subscriptions.csv) استخراج کنید، روی درون‌ریزی پرونده در زیر زده و پروندهٔ csv استخراج شده را برگزینید</string>\n    <string name=\"import_soundcloud_instructions\">وارد کردن نمایه ساندکلاد با وارد کردن نشانی یا ID شما:\n\\n\n\\n۱. حالت میزکار را در مرورگر وب فعال کنید (سایت برای دستگاه‌های همراه در دسترس نیست)\n\\n۲. به این نشانی بروید: %1$s\n\\n۳. در صورت لزوم، وارد شوید\n\\n۴. نشانی نمایه‌ای که به آن هدایت شده‌اید را کپی کنید.</string>\n    <string name=\"import_network_expensive_warning\">در نظر داشته باشید که این عملیات می‌تواند داده زیادی مصرف کند.\n\\n\n\\nادامه می‌دهید؟</string>\n    <string name=\"metadata_cache_wipe_title\">پاک کردن فرادادهٔ کش شده</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">فراداده‌های کش شده پاکش شدند</string>\n    <string name=\"playback_tempo\">تندا</string>\n    <string name=\"playback_pitch\">زیر و بمی</string>\n    <string name=\"unhook_checkbox\">قطع پیوند (ممکن است باعث انحراف شود)</string>\n    <string name=\"preferred_open_action_settings_title\">ترجیح کنش «باز کردن»</string>\n    <string name=\"preferred_open_action_settings_summary\">کنش پیش‌فرض در زمان باز کردن محتوا — %s</string>\n    <string name=\"caption_setting_description\">تغییر سبک پس‌زمینه و اندازه متن توضیحات پخش‌کننده. برای تأثیر، نیازمند آغاز دوبارهٔ کاره است</string>\n    <string name=\"clear_views_history_summary\">پاک کردن تاریخچه جریان‌های پخش شه و موقعیت‌های پخش</string>\n    <string name=\"app_license\">نیوپایپ یک نرم‌افزار آزاد کپی‌لفتی است: می‌توانید به دلخواه خود استفاده، بررسی، هم‌رسانی و بهترش کنید. به طور خاص می‌توانید ذیل نگارش ۳ یا هر نگارش بالاتری از پروانهٔ جامع همگانی گنو که به دست بنیاد نرم‌افزار آزاد منتشر شده، تغییر و بازنشرش دهید.</string>\n    <string name=\"privacy_policy_encouragement\">حریم شخصی شما برای پروژه نیویایپ بسیاری جدی است. در نتیجه، این برنامه هیچ اطلاعاتی را بدون رضایت شما گردآوری نمی‌کند.\n\\nسیاست‌های حریم شخصی نیوپایپ با جزئیات توضیح می‌دهد که وقتی گزارش یک خطا را می‌فرستید، چه داده‌هایی ذخیره و فرستاده می‌شود.</string>\n    <string name=\"start_accept_privacy_policy\">به منظور هماهنگی با مقرّرات حفاظت دادهٔ عمومی اروپا (GDPR) توجهتان را به سیاست محرمانگی نیوپایپ جلب می‌کنیم. لطفاً به دقّت مطالعه‌اش کنید.\n\\nبرای فرستادن گزارش مشکل باید بپذیریدش.</string>\n    <string name=\"limit_mobile_data_usage_title\">کیفیت را در زمان استفاده از داده همراه محدود کن</string>\n    <string name=\"skip_silence_checkbox\">پرش به جلو حین سکوت</string>\n    <string name=\"playback_reset\">بازنشانی</string>\n    <string name=\"download_to_sdcard_error_title\">فضای ذخیره‌سازی خارجی در دسترس نیست</string>\n    <string name=\"download_to_sdcard_error_message\">بارگیری روی کارت SD خارجی ممکن نیست. مایلید محل پوشه بارگیری را دوباره تعیین کنید؟</string>\n    <string name=\"saved_tabs_invalid_json\">به دلیل ناتوانی در خواندن برگه‌های ذخیره شده، برگه‌های پیش‌فرض استفاده می‌شوند</string>\n    <string name=\"subscribers_count_not_available\">تعداد مشترک‌شدگان دردسترس نیست</string>\n    <string name=\"main_page_content_summary\">چه برگه‌هایی در صفحه اصلی نمایش پیدا کنند</string>\n    <string name=\"updates_setting_description\">زمانی که نسخه جدید برنامه دردسرس است، اعلانی برای به‌روزرسانی نمایش بده</string>\n    <string name=\"paused\">متوقف</string>\n    <string name=\"queued\">در صف</string>\n    <string name=\"post_processing\">در حال پساپردازش</string>\n    <string name=\"permission_denied\">کنش به دست سامانه متوقف شد</string>\n    <string name=\"generate_unique_name\">تولید نام یگانه</string>\n    <string name=\"overwrite\">بازنویسی</string>\n    <string name=\"download_already_running\">یک بارگیری دیگر با همین نام در جریان است</string>\n    <string name=\"show_error\">نمایش خطا</string>\n    <string name=\"error_path_creation\">شاخهٔ مقصد نمی‌تواند ساخته شود</string>\n    <string name=\"error_file_creation\">پرونده نمی‌تواند ساخته شود</string>\n    <string name=\"error_ssl_exception\">شکست در برقرار ارتباط امن</string>\n    <string name=\"error_unknown_host\">ناتوانی در پیدا کردن کارساز</string>\n    <string name=\"error_connect_host\">نمی‌توان به کارساز وصل شد</string>\n    <string name=\"error_http_no_content\">کارساز داده‌ای نمی‌فرستد</string>\n    <string name=\"error_http_unsupported_range\">کارساز، بارگیری‌های چندرشته‌ای را قبول نمی‌کند، تلاش مجدد با ‎@string/msg_threads = 1</string>\n    <string name=\"stop\">توقف</string>\n    <string name=\"max_retry_msg\">بیشینه تلاش مجدد</string>\n    <string name=\"pause_downloads_on_mobile_desc\">این ویژگی زمانی که ارتباط را به داده همراه تغییر می‌دهید مفید است هرچند برخی بارگیری‌ها نمی‌توانند تعلیق شوند</string>\n    <string name=\"conferences\">کنفرانس‌ها</string>\n    <string name=\"close\">بستن</string>\n    <string name=\"watch_history_states_deleted\">موقعیت‌های پخش حذف شدند</string>\n    <string name=\"missing_file\">پزونده حذف یا جابجا شده است</string>\n    <string name=\"overwrite_unrelated_warning\">پرونده‌ای با همین نام وجود دارد</string>\n    <string name=\"overwrite_finished_warning\">یک پرونده بارگیری شده با همین نام وجود دارد</string>\n    <string name=\"overwrite_failed\">ناتوانی در بازنویسی پرونده</string>\n    <string name=\"download_already_pending\">یک بارگیری دیگر با همین نام در صف قرار دارد</string>\n    <string name=\"error_postprocessing_stopped\">نیوپایپ در خلال کار روی پرونده، بسته شد</string>\n    <string name=\"error_insufficient_storage_left\">فضایی روی دستگاه باقی نمانده است</string>\n    <string name=\"error_progress_lost\">پیشرفت کار متوفق شد زیرا پرونده پاک شده است</string>\n    <string name=\"error_timeout\">پایان زمان اتصال</string>\n    <string name=\"confirm_prompt\">می‌خواهید تاریخچه بارگیری را پاک کنید یا همه پرونده‌هایی که بارگیری شده‌اند؟</string>\n    <string name=\"enable_queue_limit\">محدود کردن صف بارگیری</string>\n    <string name=\"enable_queue_limit_desc\">یک بارگیری در هر زمان اجرا شود</string>\n    <string name=\"start_downloads\">شروع بارگیری‌ها</string>\n    <string name=\"pause_downloads\">مکث بارگیری‌ها</string>\n    <string name=\"downloads_storage_ask_title\">محل بارگیری را سوال کن</string>\n    <string name=\"downloads_storage_ask_summary\">برای ذخیرهٔ هر بارگیری از شما پرسیده خواهد شد.\n\\nاگر می‌خواهید رو ی کارت SD خارجی بارگیری کنید، شاخه‌گزین سامانه (SAF) را به کار بیندازید</string>\n    <string name=\"downloads_storage_use_saf_title\">استفاده از شاخه‌بردار سامانه (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">«چارچوب دسترسی ذخیره» اجازهٔ بارگیری روی کارت SD خارجی را می‌دهد</string>\n    <string name=\"clear_playback_states_title\">حذف موقعیت‌های پخش</string>\n    <string name=\"clear_playback_states_summary\">حذف تمام موقعیت‌های پخش</string>\n    <string name=\"delete_playback_states_alert\">همه موقعیت‌های پخش حذف شوند؟</string>\n    <string name=\"enable_leak_canary_summary\">نظارت بر نشت حافظه ممکن است باعث عدم پاسخگویی نرم افزار در زمان اندوختن پشته شود</string>\n    <string name=\"enable_disposed_exceptions_title\">گزارش کردن خطاهای \\\"خارج از چرخه حیات\\\"</string>\n    <string name=\"metadata_cache_wipe_summary\">حذف حافظه کش شده همه صفحات وب</string>\n    <string name=\"minimize_on_exit_background_description\">کوچک کردن پخش کننده به پس زمینه</string>\n    <string name=\"import_soundcloud_instructions_hint\">آی‌دی شما، soundcloud.com/yourid</string>\n    <string name=\"minimize_on_exit_summary\">عملکرد هنگام تغییر به برنامه دیگر از پخش‌کننده اصلی فیلم — %s</string>\n    <string name=\"tracks\">قطعه‌ها</string>\n    <string name=\"videos_string\">ویدیوها</string>\n    <string name=\"peertube_instance_add_exists\">این نمونه قبلا وجود دارد</string>\n    <string name=\"peertube_instance_add_https_only\">تنها نشانی‌های دارای http پشتیبانی می‌شوند</string>\n    <string name=\"peertube_instance_add_fail\">ناتوانی در اعتبارسنجی نشانی نمونه</string>\n    <string name=\"peertube_instance_add_help\">نشانی نمونه را وارد کنید</string>\n    <string name=\"peertube_instance_add_title\">افزودن نمونه</string>\n    <string name=\"peertube_instance_url_help\">نمونه‌های مورد علاقه خود را در %s پیدا کنید</string>\n    <string name=\"peertube_instance_url_summary\">نمونه پیرتیوب مورد علاقه خود در را انتخاب کنید</string>\n    <string name=\"peertube_instance_url_title\">نمونه‌های پیرتیوب</string>\n    <string name=\"seek_duration_title\">مدت زمان حرکت سریع به جلو یا عقب</string>\n    <string name=\"minimize_on_exit_title\">کمینه کردن به هنگام تغییر برنامه</string>\n    <string name=\"video_detail_by\">توسط %s</string>\n    <string name=\"channel_created_by\">ایجاد شده توسط %s</string>\n    <string name=\"content_not_supported\">این محتوا هنوز توسط نیوپایپ پشتیبانی می‌شود.\n\\n\n\\nامیدواریم در نسخه‌های آینده مورد پشتیبانی قرار گیرد.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">غیرفعال‌سازی حالت سریع</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">فعال‌سازی حالت سریع</string>\n    <string name=\"settings_category_feed_title\">خوراک</string>\n    <string name=\"feed_create_new_group_button_title\">جدید</string>\n    <string name=\"feed_group_dialog_delete_message\">می‌خواهید این گروه را پاک کنید؟</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d مورد گزیده</item>\n        <item quantity=\"other\">%d مورد گزیده</item>\n    </plurals>\n    <string name=\"feed_processing_message\">پردازش خوراک…</string>\n    <string name=\"feed_notification_loading\">بارگیری خوراک…</string>\n    <string name=\"feed_subscription_not_loaded_count\">بارگیری نشده: %d</string>\n    <string name=\"feed_oldest_subscription_update\">آخرین به‌روزرسانی خوراک: %s</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d روز</item>\n        <item quantity=\"other\">%d روز</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d ساعت</item>\n        <item quantity=\"other\">%d ساعت</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d دقیقه</item>\n        <item quantity=\"other\">%d دقیقه</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d ثانیه</item>\n        <item quantity=\"other\">%d ثانیه</item>\n    </plurals>\n    <string name=\"remove_watched_popup_partially_watched_streams\">بله، و ویدیوهای ناقص دیده شده</string>\n    <string name=\"remove_watched_popup_title\">برداشتن ویدیوهای دیده شده؟</string>\n    <string name=\"remove_watched\">پاک کردن دیده شده‌ها</string>\n    <string name=\"systems_language\">پیش‌فرض دستگاه</string>\n    <string name=\"app_language_title\">زبان برنامه</string>\n    <string name=\"choose_instance_prompt\">نمونه‌ای را انتخاب کنید</string>\n    <string name=\"delete_downloaded_files\">پاک کردن پرونده‌های بارگیری شده</string>\n    <string name=\"clear_download_history\">پاک کردن تاریخچه بارگیری</string>\n    <string name=\"error_download_resource_gone\">ناتوانی در بازیابی این بارگیری</string>\n    <string name=\"recovering\">در حال بازیابی</string>\n    <string name=\"minimize_on_exit_popup_description\">کمینه‌سازی به پخش‌کنندهٔ تصویر در تصویر</string>\n    <string name=\"show_original_time_ago_title\">نمایش زمان سپری‌شده اصلی هر مورد</string>\n    <string name=\"unmute\">صدادار</string>\n    <string name=\"mute\">بی‌صدا</string>\n    <string name=\"most_liked\">مورد پسندترین‌ها</string>\n    <string name=\"recently_added\">اخیرا اضافه شده</string>\n    <string name=\"local\">محلی</string>\n    <string name=\"default_kiosk_page_summary\">کیوسک پیش‌فرض</string>\n    <string name=\"done\">انجام شد</string>\n    <string name=\"subtitle_activity_recaptcha\">وقتی انجام شد، «Done» یا «انجام شد» را بفشارید</string>\n    <string name=\"infinite_videos\">∞ ویدیو</string>\n    <string name=\"more_than_100_videos\">بیش از ۱۰۰ ویدیو</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s شنونده</item>\n        <item quantity=\"other\">%s شنونده</item>\n    </plurals>\n    <string name=\"no_one_listening\">کسی در حال شنیدن نیست</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s بیننده</item>\n        <item quantity=\"other\">%s بیننده</item>\n    </plurals>\n    <string name=\"no_one_watching\">کسی در حال مشاهده نیست</string>\n    <string name=\"drawer_header_description\">تغییر خدمت، مورد انتخاب شده:</string>\n    <string name=\"permission_display_over_apps\">اجازه نمایش روی دیگر برنامه‌ها را بدهید</string>\n    <string name=\"artists\">هنرمندان</string>\n    <string name=\"albums\">آلبوم‌ها</string>\n    <string name=\"songs\">آوازها</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">روشن کردن «حالت محدود» یوتوب</string>\n    <string name=\"search_showing_result_for\">نمایش نتایج برای: %s</string>\n    <string name=\"error_report_open_issue_button_text\">گزارش روی گیت‌هاب</string>\n    <string name=\"error_report_open_github_notice\">لطفا بررسی کنید که آیا گفتگویی درباره مشکل‌تان از قبل وجود دارد یا خیر. ایجاد گزارش تکراری، وقتی را از ما می‌گیرد که ما می‌توانستیم صرف رفع مشکلات واقعی کنیم.</string>\n    <string name=\"select_a_playlist\">انتخاب یک فهرست پخش</string>\n    <string name=\"no_playlist_bookmarked_yet\">نشانک‌های فهرست پخش هنوز موجود نیستند</string>\n    <string name=\"copy_for_github\">از گزارش قالب‌بندی‌شده را رونوشت بگیرید</string>\n    <string name=\"playlist_no_uploader\">خودکار ایجاد شده (بارگذاری پیدا نشد)</string>\n    <string name=\"feed_groups_header_title\">گروه‌های کانال</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">انتخاب اشتراک‌ها</string>\n    <string name=\"feed_group_dialog_empty_selection\">اشتراکی انتخاب نشده است</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">نمایش اشتراک های دسته بندی نشده</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">آواتار بندانگشتی کانال</string>\n    <string name=\"playlist_page_summary\">صفحه فهرست پخش</string>\n    <string name=\"remove_watched_popup_warning\">ویدیوهایی که پیش و‌ پس از افزوده شدن به سیاههٔ پخش دیده شده‌اند حذف خواهند شد. \\nمطمئنید؟ این کار قابل بازگشت نیست!</string>\n    <string name=\"enable_disposed_exceptions_summary\">گزارش اجباری خطاهای Rx غیرقابل تحویل خارج از چرخه حیات فعالیت یا بخش پس از اتمام</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">فکر می‌کنید دریافت خوراک بیش از حد آهسته است؟ اگر چنین است، بارگیری سریع را فعالی کنید (می‌توانید آن را در تنظیمات یا با فشردن دکمه زیر تغییر دهید)\n\\n\n\\nنیوپایپ دو راهبرد برای بارگیری خوراک عرضه می‌کند:\n\\n• دریافت تمام کانال‌های مشترک شده، که آهسته اما کامل است.\n\\n• استفاده از خدمت اختصاصی، که سریع اما معمولا ناقص است.\n\\n\n\\nتفاوت بین این دو در این است که راهکار سریع، غالبا فاقد برخی اطلاعات مانند طول زمان یا نوع است و مثلا نمی‌تواد بین ویدئوهای زنده و عادی تمایز قائل شود و ممکن است تعداد کم‌تری ویدئو را دریافت کند.\n\\n\n\\nیوتیوب نمونه‌ای از یک خدمت است که چنین روش سریعی را از طریق خوراک RSS ارائه می‌دهد.\n\\n\n\\nدر نتیجه انتخاب به این بر می‌گردد که کدام یک برای‌تان ترجیح داشته باشد: سرعیت یا اطلاعات دقیق.</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">در برخی خدمات دردسترس است، معمولا خیلی سریع‌تر است، ولی ممکن است مواردی محدودتر و اغلب با اطلاعات ناقص (مثلا بدون طول زمان، نوع مورد و یا وضعیت زنده بود) ارائه دهد</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">دریافت از خوراک اختصاصی هر زمان که در دسترس باشد</string>\n    <string name=\"feed_update_threshold_option_always_update\">همواره به‌روز شود</string>\n    <string name=\"feed_update_threshold_summary\">مدت زمان سپری شده پس از آخرین به‌روزرسانی پیش از آن که یک اشتراک، قدیمی به حساب بیاید — %s</string>\n    <string name=\"feed_update_threshold_title\">آستانه به‌روزرسانی خوراک</string>\n    <string name=\"new_seek_duration_toast\">به دنبال محدودیت‌های ExoPlayer، مدت جابجایی زمان پخش روی %d ثانیه تنظیم شد</string>\n    <string name=\"show_original_time_ago_summary\">متن‌های اصلی از خدمات در جریان‌ها قابل دیدن خواهند بود</string>\n    <string name=\"notification_action_buffering\">میان گرفتن</string>\n    <string name=\"feed_group_dialog_empty_name\">خالی کردن نام گروه</string>\n    <string name=\"pause_downloads_on_mobile\">توقف روی شبکه‌های محدودشده</string>\n    <string name=\"never\">هرگز</string>\n    <string name=\"wifi_only\">فقط روی وای‌فای</string>\n    <string name=\"autoplay_summary\">شروع خودکار پخش — %s</string>\n    <string name=\"title_activity_play_queue\">پخش صف</string>\n    <string name=\"unsupported_url_dialog_message\">نشانی قابل تشخیص نبود. با برنامه دیگری باز شود؟</string>\n    <string name=\"auto_queue_toggle\">صف‌گذاری خودکار</string>\n    <string name=\"clear_queue_confirmation_description\">صف پخش‌کنندهٔ فعال جایگزین می‌شود</string>\n    <string name=\"clear_queue_confirmation_summary\">تغییر پخش کننده می‌تواند باعث جایگزین شدن صف شود</string>\n    <string name=\"clear_queue_confirmation_title\">پیش از پاک کردن صف، سوال شود</string>\n    <string name=\"notification_action_nothing\">هیچ</string>\n    <string name=\"notification_action_shuffle\">بُرزنی</string>\n    <string name=\"notification_action_repeat\">تکرار</string>\n    <string name=\"notification_actions_at_most_three\">می‌توانید تا سه کنش را برای نمایش در آگاهی فشرده برگزینید!</string>\n    <string name=\"notification_actions_summary\">هر کنش آگاهی را با لمس کردنش ویرایش کنید. با استفاده از جعبه‌های تیک، تا سه کنش را برای نمایش در آگاهی فشرده بگزینید.</string>\n    <string name=\"notification_action_4_title\">پنجمین دکمه کنشی</string>\n    <string name=\"notification_action_3_title\">چهارمین دکمه کنشی</string>\n    <string name=\"notification_action_2_title\">سومین دکمه کنشی</string>\n    <string name=\"notification_action_1_title\">دومین دکمه کنشی</string>\n    <string name=\"notification_action_0_title\">اولین دکمه کنشی</string>\n    <string name=\"notification_scale_to_square_image_summary\">تصویر بندانگشتی ویدیو که در اعلان نمایش می‌یابد، از نسبت ۱۶:۹ به ۱:۱ بریده می‌شود</string>\n    <string name=\"notification_scale_to_square_image_title\">برش تصویر بندانگشتی به نسبت ۱:۱</string>\n    <string name=\"low_quality_smaller\">کیفیت پایین (کوچک‌تر)</string>\n    <string name=\"high_quality_larger\">کیفیت بالا (بزرگ‌تر)</string>\n    <string name=\"comments_are_disabled\">نظرها از کار افتاده‌اند</string>\n    <string name=\"feed_load_error\">خطا در بار کردن خوراک</string>\n    <string name=\"disable_media_tunneling_title\">از کار انداختن تونل‌زنی رسانه</string>\n    <string name=\"show_channel_details\">نمایش جزییات کانال</string>\n    <string name=\"download_has_started\">بارگیری آغاز شد</string>\n    <string name=\"auto_device_theme_title\">خودکار (زمینهٔ افزاره)</string>\n    <string name=\"crash_the_app\">فروپاشی‌کاره</string>\n    <string name=\"show_meta_info_title\">نمایش فرااطلاعات</string>\n    <string name=\"hash_channel_name\">آگاهی درهم ریزی ویدیو</string>\n    <string name=\"show_memory_leaks\">نمایش نشت‌های حافظه</string>\n    <string name=\"clear_cookie_title\">پاک‌سازی کوکی‌های ری‌کپچا</string>\n    <string name=\"dont_show\">نشان ندادن</string>\n    <string name=\"tablet_mode_title\">حالت رایانک</string>\n    <string name=\"open_website_license\">گشودن پایگاه وب</string>\n    <string name=\"account_terminated\">حساب از بین رفت</string>\n    <string name=\"metadata_age_limit\">کرانهٔ عمر</string>\n    <string name=\"related_items_tab_description\">موارد مرتبط</string>\n    <string name=\"show_description_title\">نمایش شرح</string>\n    <string name=\"msg_calculating_hash\">محاسبهٔ درهم ریزی</string>\n    <string name=\"show_thumbnail_title\">نمایش بندانگشتی‌ها</string>\n    <string name=\"off\">خاموش</string>\n    <string name=\"on\">روشن</string>\n    <string name=\"metadata_privacy_internal\">درونی</string>\n    <string name=\"metadata_privacy_private\">خصوصی</string>\n    <string name=\"metadata_privacy_unlisted\">فهرست نشده</string>\n    <string name=\"metadata_privacy_public\">عمومی</string>\n    <string name=\"metadata_host\">میزبان</string>\n    <string name=\"metadata_support\">پشتیبانی</string>\n    <string name=\"metadata_language\">زبان</string>\n    <string name=\"metadata_privacy\">محرمانگی</string>\n    <string name=\"metadata_licence\">پروانه</string>\n    <string name=\"metadata_tags\">برچسب‌ها</string>\n    <string name=\"metadata_category\">دسته</string>\n    <string name=\"radio\">رادیو</string>\n    <string name=\"featured\">معرفی‌شده</string>\n    <string name=\"recaptcha_solve\">حل</string>\n    <string name=\"chapters\">بخش‌ها</string>\n    <string name=\"description_tab_description\">شرح</string>\n    <string name=\"comments_tab_description\">نظرها</string>\n    <string name=\"recent\">به تازگی</string>\n    <string name=\"enqueued\">در صف شد</string>\n    <string name=\"enqueue_stream\">صف کردن</string>\n    <string name=\"night_theme_title\">زمینهٔ شب</string>\n    <string name=\"notification_colorize_title\">رنگی کردن آگاهی</string>\n    <string name=\"open_with\">گشودن با</string>\n    <string name=\"mark_as_watched\">نشانه به عنوان دیده شده</string>\n    <string name=\"notification_colorize_summary\">درخواست از اندروید برای سفارشی‌سازی رنگ آگاهی براساس رنگ اصلی در بندانگشتی (توجّه داشته باشید که روی همهٔ افزاره‌ها در دسترس نیست)</string>\n    <string name=\"restricted_video\">این ویدیو محدود به سن است.\n\\n\n\\nاگر می‌خواهید ببینیدش، «%1$s» را در تنظیمات روشن کنید.</string>\n    <string name=\"show_age_restricted_content_summary\">نمایش محتوایی که احتمالاً به خاطر محدودیت سنیشان (مثل ۱۸+) برای کودکان مناسب نیستند</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">یوتوب یک «حالت محدود» دارد کهه محتوای احتمالاً بالغانه را پنهان می‌کند</string>\n    <string name=\"recaptcha_cookies_cleared\">کوکی‌های ری‌کپچا پاک‌سازی شدند</string>\n    <string name=\"clear_cookie_summary\">پاک‌سازی کوکی‌هایی که نبیوپایپ هنگام حل یک ری‌کپچا ذخیره می‌کند</string>\n    <string name=\"show_thumbnail_summary\">استفاده از بندانگشتی برای پس‌زمینهٔ صفحهٔ قفل و آگاهی‌ها</string>\n    <string name=\"hash_channel_description\">آگاهی‌ها برایپیشرفت درهم‌ریزی ویدیو</string>\n    <string name=\"show_meta_info_summary\">برای نهفتن جعبه‌های فرااطَلاعات با اطّلاعات اضافی دربارهٔ ایجادگر جریان، محتوای جریان یا درخواست جست‌وجو، خاموش کنید</string>\n    <string name=\"show_description_summary\">برای نهفتن شرح ویدیو و اطّلاعات اضافی، خاموش کنید</string>\n    <string name=\"no_app_to_open_intent\">هیچ کاره‌ای روی افزاره‌تان نمی‌تواند بگشایدش</string>\n    <string name=\"restricted_video_no_stream\">این ویدیو محدود به سن است.\n\\nبنا به سیاست‌های جدید یوتوب دربارهٔ ویدیوهای محدود به سن، نیوپایپ نمی‌تواند به هیچ یک از جریان‌های ویدیوییش دست پیدا کرده و بنابراین در پخش آن، ناتوان است.</string>\n    <string name=\"georestricted_content\">این محتوا در کشورتان قابل دسترسی نیست.</string>\n    <string name=\"soundcloud_go_plus_content\">این قطعه، لااقل در کشور شما، یک قطعهٔ گوپلاس سوندکلود است. پس نمی‌تواند به دست نیوپایپ جریان یافته یا بارگیری شود.</string>\n    <string name=\"private_content\">این محتوا خصوصی است. پس نمی‌تواند به دست نیوپایپ جریان یافته یا بارگیری شود.</string>\n    <string name=\"youtube_music_premium_content\">این ویدیو فقط برای اعضای ویژهٔ آهنگ‌های یوتوب در دسترس است. پس نمی‌تواند به دست نیوپایپ جریان یافته یا بارگیری شود.</string>\n    <string name=\"paid_content\">این محتوا فقط برای کاربرانی که پول داده‌اند در دسترس است. پس نمی‌تواند به دست نیوپایپ جریان یافته یا بارگیری شود.</string>\n    <string name=\"night_theme_summary\">زمینهٔ شب محبوبتان را برگزینید — %s</string>\n    <string name=\"select_night_theme_toast\">در زیر می‌توانید زمینهٔ شب محبوبتان را برگزینید</string>\n    <string name=\"disable_media_tunneling_summary\">اگر هنگام پخش ویدیو با صفحهٔ سیاه یا وقفه مواجه شدید، تونل‌زنی رسانه را از کار بیندازید.</string>\n    <string name=\"description_select_note\">اکنون می‌توانید متن درون شرخ را برگزینید. به یاد داشته باشید که در حالت گزینش، ممکن است صفحه چشمک زده و پیوندها قابل کلیک نباشند.</string>\n    <string name=\"no_dir_yet\">هنوز شاخهٔ بارگیری‌ای تنظیم نشده. اکنون شاخهٔ بارگیری پیش‌گزیده را برگزینید</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">برای ذخیرهٔ هر بارگیری از شما پرسیده خواهد شد</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">از اندروید ۱۰، تنها «چارچوب دسترسی ذخیره» پشتیبانی می‌شود</string>\n    <string name=\"feed_load_error_account_info\">نتوانست خوراک را برای «%s» بار کند.</string>\n    <string name=\"feed_load_error_terminated\">حساب این نگارنده نابود شده است.\n\\nنیوپایپ قادر به بار کردن این خوراک در آینده نیست.\n\\nمی‌خواهید اشتراک این کانال را لغو کنید؟</string>\n    <string name=\"feed_load_error_fast_unknown\">حالت خوراک سریع، اطَلاعات بیش‌تری در این باره نمی‌دهد.</string>\n    <string name=\"seekbar_preview_thumbnail_title\">پیش‌نمایش بندانگشتی نوار جویش</string>\n    <string name=\"detail_heart_img_view_description\">قلب‌شده به دست ایجادگر</string>\n    <string name=\"local_search_suggestions\">پیشنهادهای جست‌وجوی محلّی</string>\n    <string name=\"remote_search_suggestions\">پیشنهادهای جست‌وجوی دوردست</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">بارگیری پایان یافت</item>\n        <item quantity=\"other\">%s بارگیری پایان یافتند</item>\n    </plurals>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s بارگیری حذف شد</item>\n        <item quantity=\"other\">%1$s بارگیری حذف شدند</item>\n    </plurals>\n    <string name=\"description_select_enable\">به کار انداختن گزینش متن در شرح</string>\n    <string name=\"description_select_disable\">از کار انداختن گزینش متن در شرح</string>\n    <string name=\"main_page_content_swipe_remove\">برای برداشتن موارد، بکشیدشان</string>\n    <string name=\"start_main_player_fullscreen_summary\">اگر چرخش خودکار قفل باشد، ویدیوها را در پخش‌کنندهٔ کوچک آغاز نمی‌کند، بلکه مستقیماً به تمام‌صفحه می‌رود. همچنان می‌توانید با خروج از تمام‌صفحه به پخش‌کنندهٔ کوچک دسترسی داشته باشید</string>\n    <string name=\"start_main_player_fullscreen_title\">آغاز پخش‌کنندهٔ اصلی در تمام‌صفحه</string>\n    <string name=\"enqueued_next\">بعدی در صف گذاشته شد</string>\n    <string name=\"enqueue_next_stream\">در صف گذاشتن بعدی</string>\n    <string name=\"processing_may_take_a_moment\">در حال پردازش… ممکن است کمی طول بکشد</string>\n    <string name=\"check_for_updates\">بررسی به‌روز رسانی‌ها</string>\n    <string name=\"manual_update_description\">بررسی دستی برای نگارش‌های جدید</string>\n    <string name=\"checking_updates_toast\">بررسی کردن به‌روز رسانی‌ها…</string>\n    <string name=\"feed_new_items\">موارد خوراک جدید</string>\n    <string name=\"crash_the_player\">فروپاشی پخش‌کننده</string>\n    <string name=\"show_crash_the_player_summary\">نمایش یک گزینهٔ فروپاشی هنگام استفاده از پخش کننده</string>\n    <string name=\"show_crash_the_player_title\">نمایش «فروپاشی پخش کننده»</string>\n    <string name=\"no_appropriate_file_manager_message\">مدیر پروندهٔ مناسبی برای این کنش یافت نشد.\n\\nلطفاً مدیر پرونده‌ای نصب کرده یا در تنظیمات بارگیری، «%s» را خاموش کنید</string>\n    <string name=\"error_report_channel_name\">آگاهی گزارش خطا</string>\n    <string name=\"error_report_channel_description\">آگاهی برای گزارش‌خطاها</string>\n    <string name=\"show_error_snackbar\">نمایش یک نوار خطا</string>\n    <string name=\"create_error_notification\">ایجاد یک آگاهی خطا</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">مدیر پروندهٔ مناسبی برای این کنش یافت نشد.\n\\nلطفاً مدیر پرونده‌ای سازگار با چارچوب‌دسترسی ذخیره‌ساز نصب کنید</string>\n    <string name=\"error_report_notification_title\">نیوپایپ به خطایی برخورد. برای گزارش، بزنید</string>\n    <string name=\"error_report_notification_toast\">خطایی رخ داد. آگاهی را ببینید</string>\n    <string name=\"detail_pinned_comment_view_description\">نظر سنجاق شده</string>\n    <string name=\"leak_canary_not_available\">لیک‌کاناری موجود نیست</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">پیش‌گزیدهٔ اگزوپلیر</string>\n    <string name=\"notifications\">آگاهی‌ها</string>\n    <string name=\"loading_stream_details\">بار کردن جزییات جریان…</string>\n    <string name=\"check_new_streams\">اجرای بررسی برای جریان‌های جدید</string>\n    <string name=\"streams_notifications_network_title\">نیازمند اتّصال شبکه</string>\n    <string name=\"enumeration_comma\">،</string>\n    <string name=\"toggle_all\">تغییر وضعیت همه</string>\n    <string name=\"streams_notification_channel_name\">جریان‌های جدید</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s جریان جدید</item>\n        <item quantity=\"other\">%s جریان جدید</item>\n    </plurals>\n    <string name=\"settings_category_player_notification_summary\">پیکربندی آگاهی جریان در حال پخش کنونی</string>\n    <string name=\"enable_streams_notifications_title\">آگاهی‌های جریان‌های جدید</string>\n    <string name=\"settings_category_player_notification_title\">آگاهی پخش‌کننده</string>\n    <string name=\"streams_notification_channel_description\">آگاهی‌ها دربارهٔ جریان‌های جدید برای اشتراک‌ها</string>\n    <string name=\"notifications_disabled\">آگاهی‌ها از کار افتاده‌اند</string>\n    <string name=\"get_notified\">آگاه شوید</string>\n    <string name=\"streams_notifications_interval_title\">بسامد بررسی</string>\n    <string name=\"enable_streams_notifications_summary\">آگاه کردن دربارهٔ جریان‌های جدید از اشتراک‌ها</string>\n    <string name=\"delete_downloaded_files_confirm\">پاک کردن تمامی پرونده‌های بارگرفته از دیسک؟</string>\n    <string name=\"any_network\">هر شبکه‌ای</string>\n    <string name=\"you_successfully_subscribed\">اکنون مشترک این کانال شده‌اید</string>\n    <string name=\"semitone\">نیم‌پرده</string>\n    <string name=\"percent\">درصد</string>\n    <string name=\"no_video_streams_available_for_external_players\">هیچ جریان ویدیویی‌ای برای پخش‌کننده‌های خارجی موجود نیست</string>\n    <string name=\"streams_not_yet_supported_removed\">جریان‌هایی که هنوز به دست بارگیر پشتیبانی نمی‌شوند نشان داده نشده‌اند</string>\n    <string name=\"no_audio_streams_available_for_external_players\">هیچ جریان صوتی‌ای برای پخش‌کننده‌های خارجی موجود نیست</string>\n    <string name=\"selected_stream_external_player_not_supported\">جریان گزیده به دست پخش‌کننده‌های خارجی پشتیبانی نمی‌شود</string>\n    <string name=\"select_quality_external_players\">گزینش کیفیت برای پخش‌کننده‌های خارجی</string>\n    <string name=\"unknown_format\">قالب ناشناخته</string>\n    <string name=\"unknown_quality\">کیفیت ناشناخته</string>\n    <string name=\"progressive_load_interval_title\">اندازهٔ دورهٔ بار کردن پخش</string>\n    <string name=\"faq_title\">سوالات متداول</string>\n    <string name=\"faq_description\">اگر حین استفاده از اپ مشکلی دارید، حتما پاسخ‌ها به سوالات متداول را بررسی کنید!</string>\n    <string name=\"faq\">نمایش در وبسایت</string>\n    <string name=\"sort\">ترتیب</string>\n    <string name=\"import_subscriptions_hint\">درون یا برون ریزی اشتراک‌ها از فهرست سه‌نقطه‌ای</string>\n    <string name=\"fast_mode\">حالت سریع</string>\n    <string name=\"app_update_available_notification_text\">ضربه برای بارگیری %s</string>\n    <string name=\"app_update_unavailable_toast\">از جدیدترین نگارش نیوپایپ استفاده می‌کنید</string>\n    <string name=\"night_theme_available\">این گزینه تنها هنگامی موجود است که %s به عنوان زمینه گزیده باشد</string>\n    <string name=\"card\">کارت</string>\n    <string name=\"msg_failed_to_copy\">شکست در رونوشت به تخته‌گیره</string>\n    <string name=\"unset_playlist_thumbnail\">ناتنظیم بندانگشتی ثابت</string>\n    <string name=\"ignore_hardware_media_buttons_title\">چشم‌پوشی از رخدادهای دکمهٔ رسانهٔ سخت‌افزاری</string>\n    <string name=\"remove_duplicates\">برداشتن تکراری‌ها</string>\n    <string name=\"remove_duplicates_title\">برداشتن تکراری‌ها؟</string>\n    <string name=\"feed_show_hide_streams\">نمایش یا نهفتن جریان‌ها</string>\n    <string name=\"feed_hide_streams_title\">نمایش جریان‌های زیر</string>\n    <string name=\"feed_show_upcoming\">پیش رو</string>\n    <string name=\"feed_show_watched\">کامل دیده شده</string>\n    <string name=\"feed_show_partially_watched\">نیمه دیده شده</string>\n    <string name=\"no_streams\">بدون جریان</string>\n    <string name=\"play_queue_audio_track\">صدا: %s</string>\n    <string name=\"forward\">پیشروی</string>\n    <string name=\"settings_category_exoplayer_title\">تنظیمات اگزوپلیر</string>\n    <string name=\"next_stream\">جریان بعدی</string>\n    <string name=\"unknown_audio_track\">ناشناخته</string>\n    <string name=\"audio_track_type_original\">اصلی</string>\n    <string name=\"audio_track_type_dubbed\">دوبله</string>\n    <string name=\"channel_tab_shorts\">کوتاه‌ها</string>\n    <string name=\"channel_tab_livestreams\">زنده</string>\n    <string name=\"progressive_load_interval_summary\">تغییر اندازهٔ بازهٔ بار (هم‌اکنون %s). مقداری پایین‌تر، می‌تواند بار کردن نخستین ویدیو را سرعت بخشد</string>\n    <string name=\"loading_metadata_title\">بار کردن فراداده…</string>\n    <string name=\"audio_track\">قطعهٔ صوتی</string>\n    <string name=\"yes\">بله</string>\n    <string name=\"no\">نه</string>\n    <string name=\"brightness\">روشنایی</string>\n    <string name=\"volume\">حجم صدا</string>\n    <string name=\"none\">هیچ‌کدام</string>\n    <string name=\"error_insufficient_storage\">فضای آزاد ناکافی روی افزاره</string>\n    <string name=\"metadata_thumbnails\">بندانگشتی‌ها</string>\n    <string name=\"metadata_avatars\">چهرک‌ها</string>\n    <string name=\"metadata_banners\">بیرق‌ها</string>\n    <string name=\"metadata_subscribers\">مشترکان</string>\n    <string name=\"audio_track_type_descriptive\">مشروح</string>\n    <string name=\"channel_tab_videos\">ویدیوها</string>\n    <string name=\"channel_tab_tracks\">قطعه‌ها</string>\n    <string name=\"channel_tab_channels\">کانال‌ها</string>\n    <string name=\"channel_tab_playlists\">سیاهه‌های پخش</string>\n    <string name=\"channel_tab_albums\">آلبوم‌ها</string>\n    <string name=\"channel_tab_about\">درباره</string>\n    <string name=\"play\">پخش</string>\n    <string name=\"replay\">بازپخش</string>\n    <string name=\"audio_track_name\">%1$s%2$s</string>\n    <string name=\"show_channel_tabs\">زبانهٔ کانال‌ها</string>\n    <string name=\"toggle_fullscreen\">تغییر حالت تمام‌صفحه</string>\n    <string name=\"previous_stream\">جریان پیشین</string>\n    <string name=\"more_options\">گزینه‌های بیش‌تر</string>\n    <string name=\"duration\">مدّت</string>\n    <string name=\"rewind\">پسروی</string>\n    <string name=\"question_mark\">؟</string>\n    <string name=\"settings_category_backup_restore_title\">پشتیبان‌گیری و بازیابی</string>\n    <string name=\"no_live_streams\">بدون جریان زنده</string>\n    <string name=\"image_quality_title\">کیفیت تصویر</string>\n    <string name=\"image_quality_medium\">کیفیت متوسّط</string>\n    <string name=\"image_quality_high\">کیفیت زیاد</string>\n    <string name=\"prefer_original_audio_title\">ترجیح صدای اصلی</string>\n    <string name=\"share_playlist\">هم‌رسانی سیاههٔ پخش</string>\n    <string name=\"image_quality_low\">کیفیت کم</string>\n    <string name=\"tab_bookmarks_short\">سیاهه‌های پخش</string>\n    <string name=\"reset_settings_title\">بازنشانی تنظیمات</string>\n    <string name=\"audio_track_type_secondary\">ثانویه</string>\n    <string name=\"show_less\">نمایش کم‌تر</string>\n    <string name=\"main_tabs_position_summary\">جابه‌جایی گزینشگر زبانهٔ اصلی به پایین</string>\n    <string name=\"disable_media_tunneling_automatic_info\">تونل زدن رسانه به صورت پیش‌گزیده روی افزاره‌تان از کار افتاده چرا که از آن پشتیبانی نمی‌کند.</string>\n    <string name=\"right_gesture_control_title\">کنش ژست راست</string>\n    <string name=\"audio_track_present_in_video\">قطعه‌ای صوتی باید از پیش در این جریان موجود باشد</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">برای نمونه اگر از گوشی‌ای با دکمه‌های خراب استفاده می‌کنید مفید است</string>\n    <string name=\"reset_all_settings\">بازنشانی همهٔ تنظیمات همهٔ تنظیمات ترجیحیتان را دور اندعخته و کاره را دوباره آغاز می‌کند.\\n\\nمطمئنید که می‌خواهید ادامه دهید؟</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">استفاده از ویژگی پشتیبان کدگشای اگزوپلیر</string>\n    <string name=\"show_channel_tabs_summary\">زبانه‌های نشان داده شده روی صفحه‌های کانال</string>\n    <string name=\"toggle_screen_orientation\">تغییر جهت صفحه</string>\n    <string name=\"image_quality_none\">بار نکردن تصویرها</string>\n    <string name=\"share_playlist_with_list\">هم‌رسانی سیاههٔ نشانی</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">هم‌رسانی به شکل سیاههٔ پخش موقّتی یوتوب</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"share_playlist_content_details\">%1$s\\n%2$s</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">استفادهٔ همیشگی از دور زدن تنظیمات سطح خروجی ویدیوی اگزوپلیر</string>\n    <string name=\"main_tabs_position_title\">موقعیت زبانه‌های اصلی</string>\n    <string name=\"feed_fetch_channel_tabs\">واکشی زبانه‌های کانال</string>\n    <string name=\"select_audio_track_external_players\">گزینش قطعهٔ صوتی برای پخش کننده‌های خارجی</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s پاسخ</item>\n        <item quantity=\"other\">%s پاسخ</item>\n    </plurals>\n    <string name=\"share_playlist_with_titles\">هم‌رسانی با عنوان‌ها</string>\n    <string name=\"prefer_descriptive_audio_summary\">گزینش قطعهٔ صوتی با شرح برای افزار کم‌بینا در صورت وجود</string>\n    <string name=\"prefer_descriptive_audio_title\">ترجیح صدای شرح دهنده</string>\n    <string name=\"right_gesture_control_summary\">گزینش کنش ژست نیمهٔ راست صفحه</string>\n    <string name=\"playlist_add_stream_success_duplicate\">تعداد %d بار تکرار شده</string>\n    <string name=\"metadata_uploader_avatars\">چهرک‌های بارکننده</string>\n    <string name=\"metadata_subchannel_avatars\">چهرک‌های زیرکانال</string>\n    <string name=\"left_gesture_control_title\">کنش ژست چپ</string>\n    <string name=\"image_quality_summary\">گزینش کیفیت تصویرها و این که اصلاً بار شوند یا نه، برای کاهش استفادهٔ حافظه و داده. تغییرات انبارهٔ تصویر حافظه و دیسک را پاک می‌کند — %s</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">اگر مشکل شروع رمزگشایی دارید ، این گزینه را فعال کنید ، که اگر رمزگشایی اولیه شکست بخورد ، به رمزگشایی های با اولویت پایین تر باز می گردد. این ممکن است منجر به عملکرد پخش ضعیف نسبت به هنگام استفاده از رمزگشایان اولیه شود</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">این روش دور زدن مشکل به جای تنظیم مستقیم سطح روی رمزینه، آن‌ها را هنگام تغییر سطح آزاد کرده و دوباره راه‌اندازی می‌کند. این تنظیم که از پیش روی برخی افزاره‌ها به دست اگزوپلیر استفاده می‌شد فقط روی اندروید ۶ و بالاتر تأثیر دارد\\n\\nبه کار انداختن این گزینه می‌تواند از خطاهای پخش هنگام تغییر پخش‌کنندهٔ ویدیوی کنونی یا تغییر به حالت تمام‌صفحه جلوگیری کند</string>\n    <string name=\"settings_category_exoplayer_summary\">مدیریت برخی تنظیمات اگزوپلیر. اعمال این تغییرات نیازمند آغاز دوبارهٔ پخش‌کننده است</string>\n    <string name=\"duplicate_in_playlist\">سیاهه‌های پخشی که خاکستری شده‌اند این مورد را از پیش دارند.</string>\n    <string name=\"notification_actions_summary_android13\">ویرایش هر کنش آگاهی زیر با زدن رویش. سه کنش نخست (پخش/مکث، پیشین و بعدی) به دست سامانه تنظیم شده و قابل سفارشی سازی نیستند.</string>\n    <string name=\"left_gesture_control_summary\">گزینش کنش ژست نیمهٔ چپ صفحه</string>\n    <string name=\"prefer_original_audio_summary\">گزینش قطعهٔ صوتی اصلی فارغ از زبان</string>\n    <string name=\"auto_update_check_description\">نیوپایپ می‌تواند گه‌گاه به صورت خودکار نگارش‌های جدید را بررسی کرده و از وجودشان آگاهتان کند.\\nمی‌خواهید به کارش بیندازید؟</string>\n    <string name=\"reset_settings_summary\">بازنشانی همهٔ تنظیمات به مقدارهای پیش‌گزیده‌شان</string>\n    <string name=\"show_more\">نمایش بیش‌تر</string>\n    <string name=\"import_settings_vulnerable_format\">تنظیمات داخل برون‌ریزی‌ از قالبی آسیب‌پذیر استفاده می‌کند که از نگارش ۰٫۲۷٫۰ منسوخ شده. مطمئن شوید برون‌ریزی از منبعی مطمئن آمده و ترجیحاً فقط از برون‌ریزی‌های آمده از نگارش ۰٫۲۷٫۰ به بعد استفاده کنید. پشتیبانی از درون‌ریزی تنظیمات به این قالب آسیب‌پذیر به زودی کاملاً‌برداشته خواهد شد و دیگر نگارش‌خای قدیمی‌تر قادر به درون ریزی تنظیمات از نگارش‌های جدید نخواهند بود.</string>\n    <string name=\"open_play_queue\">گشودن صف پخش</string>\n    <string name=\"remove_duplicates_message\">می‌خواهید همهٔ جریان‌های تکراری را در این سیاههٔ پخش بردارید؟</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">زبانه‌هایی که هنگام به‌روز رسانی خوراک واکشی می‌شوند. این گزینه تأثیری روی کانال‌هایی که با ساتفاده از حالت سریع به‌روز می‌شوند ندارد.</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-fi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Aloita napauttamalla suurennuslasia.</string>\n    <string name=\"upload_date_text\">Julkaistu %1$s</string>\n    <string name=\"no_player_found\">Ei löytynyt suoratoistosoitinta. Asennetaanko VLC\\?</string>\n    <string name=\"install\">Asenna</string>\n    <string name=\"cancel\">Peruuta</string>\n    <string name=\"open_in_browser\">Avaa selaimessa</string>\n    <string name=\"open_in_popup_mode\">Avaa ponnahdusikkunatilassa</string>\n    <string name=\"share\">Jaa</string>\n    <string name=\"download\">Lataus</string>\n    <string name=\"search\">Haku</string>\n    <string name=\"settings\">Asetukset</string>\n    <string name=\"did_you_mean\">Tarkoititko ”%1$s”\\?</string>\n    <string name=\"share_dialog_title\">Jaa</string>\n    <string name=\"use_external_video_player_title\">Käytä ulkoista videosoitinta</string>\n    <string name=\"use_external_video_player_summary\">Ääni saattaa lakata toimimasta joillakin resoluutioilla</string>\n    <string name=\"use_external_audio_player_title\">Käytä ulkoista äänisoitinta</string>\n    <string name=\"subscribe_button_title\">Tilaa</string>\n    <string name=\"subscribed_button_title\">Tilattu</string>\n    <string name=\"channel_unsubscribed\">Kanavan tilaus peruttu</string>\n    <string name=\"subscription_change_failed\">Tilauksen vaihtaminen epäonnistui</string>\n    <string name=\"subscription_update_failed\">Tilausta ei voitu päivittää</string>\n    <string name=\"tab_subscriptions\">Tilaukset</string>\n    <string name=\"fragment_feed_title\">Uudet</string>\n    <string name=\"controls_background_title\">Taustatoisto</string>\n    <string name=\"controls_popup_title\">Ponnahdusikkuna</string>\n    <string name=\"download_path_title\">Videon latauskansio</string>\n    <string name=\"download_path_summary\">Ladatut videotiedostot tallennetaan tänne</string>\n    <string name=\"download_path_dialog_title\">Valitse videotiedostojen latauskansio</string>\n    <string name=\"download_path_audio_title\">Äänen latauskansio</string>\n    <string name=\"download_path_audio_summary\">Ladatut äänitiedostot tallennetaan tänne</string>\n    <string name=\"download_path_audio_dialog_title\">Valitse äänitiedostojen latauskansio</string>\n    <string name=\"default_resolution_title\">Oletusresoluutio</string>\n    <string name=\"default_popup_resolution_title\">Ponnahdusikkunan oletusresoluutio</string>\n    <string name=\"show_higher_resolutions_title\">Näytä korkeammat resoluutiot</string>\n    <string name=\"show_higher_resolutions_summary\">Vain jotkin laitteet voivat toistaa 2K/4K-videota</string>\n    <string name=\"play_with_kodi_title\">Toista Kodissa</string>\n    <string name=\"kore_not_found\">Asennetaanko puuttuva Kore-sovellus\\?</string>\n    <string name=\"show_play_with_kodi_title\">Näytä ”Toista Kodissa”-vaihtoehto</string>\n    <string name=\"show_play_with_kodi_summary\">Näyttää vaihtoehdon videon toistamiseen Kodi-mediasoittimessa</string>\n    <string name=\"play_audio\">Ääni</string>\n    <string name=\"default_audio_format_title\">Oletusääniformaatti</string>\n    <string name=\"default_video_format_title\">Oletusvideoformaatti</string>\n    <string name=\"theme_title\">Teema</string>\n    <string name=\"light_theme_title\">Kirkas</string>\n    <string name=\"dark_theme_title\">Tumma</string>\n    <string name=\"black_theme_title\">Musta</string>\n    <string name=\"popup_remember_size_pos_title\">Muista ponnahdusikkunan ominaisuudet</string>\n    <string name=\"popup_remember_size_pos_summary\">Muista ponnahdusikkunan viimeisin koko ja sijainti</string>\n    <string name=\"show_search_suggestions_title\">Hakuehdotukset</string>\n    <string name=\"show_search_suggestions_summary\">Valitse ehdotuksia, jotka näkyvät hakiessa</string>\n    <string name=\"enable_search_history_title\">Hakuhistoria</string>\n    <string name=\"enable_search_history_summary\">Tallentaa hakutietokannan paikallisesti</string>\n    <string name=\"enable_watch_history_title\">Katseluhistoria</string>\n    <string name=\"enable_watch_history_summary\">Pidä muistissa katsotut videot</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Jatka toistoa keskeytysten jälkeen (esim. puhelut)</string>\n    <string name=\"download_dialog_title\">Lataus</string>\n    <string name=\"show_next_and_similar_title\">Näytä seuraavia ja samankaltaisia videoita</string>\n    <string name=\"unsupported_url\">URL ei tuettu</string>\n    <string name=\"content_language_title\">Sisällon oletuskieli</string>\n    <string name=\"settings_category_player_title\">Soitin</string>\n    <string name=\"settings_category_player_behavior_title\">Käyttäytyminen</string>\n    <string name=\"settings_category_video_audio_title\">Video ja ääni</string>\n    <string name=\"settings_category_history_title\">Historia ja välimuisti</string>\n    <string name=\"settings_category_appearance_title\">Ulkoasu</string>\n    <string name=\"background_player_playing_toast\">Toistaa taustalla</string>\n    <string name=\"popup_playing_toast\">Toistetaan ponnahdusikkunatilassa</string>\n    <string name=\"content\">Sisältö</string>\n    <string name=\"show_age_restricted_content_title\">Näytä ikärajoitettu sisältö</string>\n    <string name=\"duration_live\">Suora</string>\n    <string name=\"downloads\">Lataukset</string>\n    <string name=\"downloads_title\">Lataukset</string>\n    <string name=\"error_report_title\">Virheraportti</string>\n    <string name=\"all\">Kaikki</string>\n    <string name=\"disabled\">Poistettu käytöstä</string>\n    <string name=\"clear\">Pyyhi</string>\n    <string name=\"best_resolution\">Paras resoluutio</string>\n    <string name=\"undo\">Peru</string>\n    <string name=\"notification_channel_name\">NewPipe ilmoitus</string>\n    <string name=\"notification_channel_description\">Ilmoitukset NewPipen soittimille</string>\n    <string name=\"general_error\">Virhe</string>\n    <string name=\"network_error\">Verkkovirhe</string>\n    <string name=\"could_not_load_thumbnails\">Kaikkia esikatselukuvia ei voitu ladata</string>\n    <string name=\"parsing_error\">Verkkosivua ei voitu jäsentää</string>\n    <string name=\"content_not_available\">Sisältö ei ole saatavilla</string>\n    <string name=\"could_not_setup_download_menu\">Latausvalikkoa ei voitu asettaa</string>\n    <string name=\"app_ui_crash\">Sovellus/UI kaatui</string>\n    <string name=\"sorry_string\">Pahoittelut, noin ei olisi pitänyt käydä.</string>\n    <string name=\"error_report_button_text\">Raportoi sähköpostin kautta</string>\n    <string name=\"error_snackbar_message\">Pahoittelut, jokin meni vikaan.</string>\n    <string name=\"error_snackbar_action\">Raportti</string>\n    <string name=\"what_happened_headline\">Mitä tapahtui:</string>\n    <string name=\"your_comment\">Sinun viesti (englanniksi):</string>\n    <string name=\"error_details_headline\">Yksityiskohdat:</string>\n    <string name=\"detail_thumbnail_view_description\">Toista video, kesto:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Lataajan hahmokuvake</string>\n    <string name=\"detail_likes_img_view_description\">Tykkäykset</string>\n    <string name=\"detail_dislikes_img_view_description\">Ei-tykkäykset</string>\n    <string name=\"search_no_results\">Ei tuloksia</string>\n    <string name=\"empty_list_subtitle\">Tyhjää täynnä</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Ääni</string>\n    <string name=\"retry\">Toista uudelleen</string>\n    <string name=\"no_subscribers\">Ei tilaajia</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s tilaaja</item>\n        <item quantity=\"other\">%s tilaajaa</item>\n    </plurals>\n    <string name=\"no_views\">Ei katselukertoja</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s katselukerta</item>\n        <item quantity=\"other\">%s katselukertaa</item>\n    </plurals>\n    <string name=\"no_videos\">Ei videoita</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">%s videoita</item>\n    </plurals>\n    <string name=\"start\">Aloita</string>\n    <string name=\"pause\">Tauota</string>\n    <string name=\"delete\">Poista</string>\n    <string name=\"checksum\">Tarkistussumma</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Tiedostonimi</string>\n    <string name=\"msg_threads\">Säikeet</string>\n    <string name=\"msg_error\">Virhe</string>\n    <string name=\"msg_running\">NewPipe Lataus käynnissä</string>\n    <string name=\"msg_running_detail\">Napauta nähdäksesi lisää</string>\n    <string name=\"msg_wait\">Odota…</string>\n    <string name=\"msg_copied\">Kopioitu leikepöydälle</string>\n    <string name=\"no_available_dir\">Määritä latauskansio myöhemmin asetuksissa</string>\n    <string name=\"msg_popup_permission\">Tämä käyttöoikeus tarvitaan\n\\nponnahdusikkunatilan käyttämiseksi</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA Haaste</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA-haaste pyydetty</string>\n    <string name=\"settings_category_downloads_title\">Lataus</string>\n    <string name=\"settings_file_charset_title\">Sallitut merkit tiedostonimissä</string>\n    <string name=\"settings_file_replacement_character_summary\">Kielletyt merkit korvataan tällä arvolla</string>\n    <string name=\"settings_file_replacement_character_title\">Korvaava merkki</string>\n    <string name=\"charset_letters_and_digits\">Kirjaimet ja numerot</string>\n    <string name=\"charset_most_special_characters\">Suurin osa erikoismerkeistä</string>\n    <string name=\"title_activity_about\">Tietoja NewPipe</string>\n    <string name=\"title_licenses\">Kolmannen osapuolen Lisenssit</string>\n    <string name=\"tab_about\">Tietoja &amp; UKK</string>\n    <string name=\"tab_licenses\">Lisenssit</string>\n    <string name=\"app_description\">Vapaata ja kevyttä suoratoistoa Androidilla.</string>\n    <string name=\"view_on_github\">Näytä GitHub:ssa</string>\n    <string name=\"app_license_title\">NewPipe:n Lisenssi</string>\n    <string name=\"contribution_encouragement\">Olkoon sinulla ideoita; käännöksistä, designmuutoksista, koodin siivoamisesta tai raskaista koodimuutoksista—apu on aina tervetullutta. Mitä enemmän saadaan tehtyä, sen paremmaksi sovellus tulee!</string>\n    <string name=\"read_full_license\">Lue lisenssi</string>\n    <string name=\"contribution_title\">Osallistu</string>\n    <string name=\"title_activity_history\">Historia</string>\n    <string name=\"action_history\">Historia</string>\n    <string name=\"delete_item_search_history\">Haluatko poistaa tämän hakuhistoriasta?</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Jatka toistoa</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"info_labels\">Mikä:\\nPyyntö:\\nSisällön kieli:\\nSisällön maa:\\n:Sovelluksen kieli:\\nPalvelu:\\nGMT Aika:\\nPaketti:\\nVersio:\\nOS versio:</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s %2$s %3$s alla</string>\n    <string name=\"main_page_content\">Pääsivun sisältö</string>\n    <string name=\"blank_page_summary\">Tyhjä sivu</string>\n    <string name=\"kiosk_page_summary\">Kioski</string>\n    <string name=\"channel_page_summary\">Kanavat</string>\n    <string name=\"select_a_channel\">Valitse kanava</string>\n    <string name=\"no_channel_subscribed_yet\">Yhtään kanavaa ei ole vielä tilattu</string>\n    <string name=\"select_a_kiosk\">Valitse kioski</string>\n    <string name=\"trending\">Nousussa</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Uudet ja kuumat</string>\n    <string name=\"show_hold_to_append_summary\">Näytä vihje, kun taustasoitto- tai ponnahdusikkunapainiketta painetaan videon yksityiskohtanäkymässä</string>\n    <string name=\"play_all\">Toista kaikki</string>\n    <string name=\"player_stream_failure\">Tätä suoratoistosisältöä ei voitu toistaa</string>\n    <string name=\"player_unrecoverable_failure\">Palautuskelvoton soittimen virhe</string>\n    <string name=\"player_recoverable_failure\">Palaudutaan soittimen virheestä</string>\n    <string name=\"play_queue_remove\">Poista</string>\n    <string name=\"play_queue_stream_detail\">Yksityiskohdat</string>\n    <string name=\"play_queue_audio_settings\">Ääniasetukset</string>\n    <string name=\"hold_to_append\">Pidä pohjassa lisätäksesi jonoon</string>\n    <string name=\"show_hold_to_append_title\">Näytä vihje soittolistaan lisäämiseksi</string>\n    <string name=\"unknown_content\">[Tuntematon]</string>\n    <string name=\"start_here_on_background\">Aloita toisto taustalla</string>\n    <string name=\"start_here_on_popup\">Aloita toisto ponnahdusikkunassa</string>\n    <string name=\"donation_title\">Lahjoita</string>\n    <string name=\"donation_encouragement\">NewPipe on vapaaehtoisten vapaa-ajallaan kehittämä tuoden sinulle parhaan mahdollisen käyttäjäkokemuksen. Nyt on aika auttaa kehittäjiä tekemään NewPipesta vielä parempi heidän nauttiessaan kupin kahvia.</string>\n    <string name=\"give_back\">Anna takaisin</string>\n    <string name=\"website_title\">Websivu</string>\n    <string name=\"website_encouragement\">Käy verkkosivuillamme saadaksesi lisää tietoa ja uusimmat uutiset NewPipe:stä.</string>\n    <string name=\"no_player_found_toast\">Suoratoistosoitinta ei löytynyt (voit asentaa VLC:n toistaaksesi).</string>\n    <string name=\"controls_download_desc\">Lataa suoratoistotiedosto</string>\n    <string name=\"show_info\">Näytä lisätietoja</string>\n    <string name=\"tab_bookmarks\">Kirjanmerkit</string>\n    <string name=\"controls_add_to_playlist_title\">Lisää soittolistaan</string>\n    <string name=\"use_inexact_seek_title\">Käytä nopeampaa epätarkkaa pikakelausta</string>\n    <string name=\"use_inexact_seek_summary\">Epätarkka kelaus mahdollistaa videon kelauksen nopeammin huonommalla tarkkuudella. Kelaaminen 5, 15 tai 25 sekunnin hyppäyksin ei toimi tämän kanssa</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Kuvavälimuisti tyhjennetty</string>\n    <string name=\"metadata_cache_wipe_title\">Poista tallennettu metatieto</string>\n    <string name=\"metadata_cache_wipe_summary\">Poista kaikki tallennettu sivutieto</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metatiedot poistettu</string>\n    <string name=\"auto_queue_summary\">Jatka päättyvää (ei uudelleentoistettavaa) toistojonoa lisäämällä siihen aiheeseen liittyvä suoratoistosisältö</string>\n    <string name=\"default_content_country_title\">Sisällön oletusmaa</string>\n    <string name=\"settings_category_debug_title\">Virheenkorjaus</string>\n    <string name=\"channels\">Kanavat</string>\n    <string name=\"playlists\">Soittolistat</string>\n    <string name=\"tracks\">Ääniraidat</string>\n    <string name=\"users\">Käyttäjät</string>\n    <string name=\"always\">Aina</string>\n    <string name=\"just_once\">Vain kerran</string>\n    <string name=\"file\">Tiedosto</string>\n    <string name=\"switch_to_background\">Vaihda taustalle</string>\n    <string name=\"switch_to_popup\">Vaihda ponnahdusikkunaan</string>\n    <string name=\"switch_to_main\">Vaihda normaalitoistoon</string>\n    <string name=\"import_data_title\">Tuo tietokanta</string>\n    <string name=\"export_data_title\">Vie tietokanta</string>\n    <string name=\"import_data_summary\">Ylikirjoittaa tämänhetkisen historian, tilaukset, soittolistat ja (vaihtoehtoisesti) asetukset</string>\n    <string name=\"export_data_summary\">Vie historia, tilaukset, soittolistat ja asetukset</string>\n    <string name=\"clear_views_history_title\">Poista katseluhistoria</string>\n    <string name=\"clear_views_history_summary\">Poistaa toistohistorian ja toistokohdat</string>\n    <string name=\"delete_view_history_alert\">Poista koko katseluhistoria\\?</string>\n    <string name=\"watch_history_deleted\">Katseluhistoria poistettu</string>\n    <string name=\"clear_search_history_title\">Poista hakuhistoria</string>\n    <string name=\"clear_search_history_summary\">Poistaa historian haetuista videoista</string>\n    <string name=\"delete_search_history_alert\">Poista koko hakuhistoria\\?</string>\n    <string name=\"search_history_deleted\">Hakuhistoria poistettu</string>\n    <string name=\"external_player_unsupported_link_type\">Ulkoiset soittimet eivät tue tämänkaltaisia linkkejä</string>\n    <string name=\"video_streams_empty\">Suoratoistovideoita ei löytynyt</string>\n    <string name=\"audio_streams_empty\">Suoratoistoääntä ei löytynyt</string>\n    <string name=\"invalid_directory\">Kansiota ei ole olemassa</string>\n    <string name=\"invalid_source\">Tiedoston/sisällön lähdettä ei ole</string>\n    <string name=\"invalid_file\">Tiedoa ei ole tai lupa sen kirjoittamiseen tai lukemiseen puuttuu</string>\n    <string name=\"file_name_empty_error\">Tiedostonimi ei voi olla tyhjä</string>\n    <string name=\"error_occurred_detail\">Hups! Tapahtui virhe: %1$s</string>\n    <string name=\"detail_drag_description\">Vedä järjestelläksesi</string>\n    <string name=\"create\">Luo</string>\n    <string name=\"dismiss\">Hylkää</string>\n    <string name=\"rename\">Nimeä uudelleen</string>\n    <string name=\"one_item_deleted\">1 poistettu.</string>\n    <string name=\"privacy_policy_title\">NewPipen tietosuojakäytäntö</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe ottaa yksityisyytesi tosissaan. Siksi se ei kerää sinulta mitään tietoja ilman lupaasi.\n\\nNewPipen tietosuojakäytännössä selitetään tarkasti mitä tietoja lähetetään tai tallennetaan virheraportin yhteydessä.</string>\n    <string name=\"read_privacy_policy\">Lue tietosuojakäytäntö</string>\n    <string name=\"auto_queue_title\">Lisää ehdotettu suoratoistosisältö automaattisesti soittolistaan</string>\n    <string name=\"no_streams_available_download\">Suoratoistosisältöä ei saatavilla ladattavaksi</string>\n    <string name=\"app_license\">NewPipe on vapaata ohjelmistoa. Voit käyttää, opiskella, jakaa ja parantaa sitä mielesi mukaan. Tarkemmin sanottuna voit jakaa sitä edelleen ja/tai muokata sitä Free Software Foundationin julkaiseman GNU General Public Licensen, version 3 tai uudemman, ehdoilla.</string>\n    <string name=\"title_last_played\">Viimeksi toistettu</string>\n    <string name=\"title_most_played\">Eniten toistetut</string>\n    <string name=\"export_complete_toast\">Vienti valmis</string>\n    <string name=\"import_complete_toast\">Tuonti valmis</string>\n    <string name=\"no_valid_zip_file\">Virheellinen ZIP-tiedosto</string>\n    <string name=\"could_not_import_all_files\">Varoitus: Ei voitu tuoda kaikkia tiedostoja.</string>\n    <string name=\"override_current_data\">Tämä nollaa nykyiset asetuksesi.</string>\n    <string name=\"import_settings\">Haluatko myös tuoda asetukset?</string>\n    <string name=\"drawer_open\">Avaa alasvetovalikko</string>\n    <string name=\"drawer_close\">Sulje alasvetovalikko</string>\n    <string name=\"preferred_open_action_settings_title\">Ensisijainen avaustapa</string>\n    <string name=\"preferred_open_action_settings_summary\">Oletustoiminto avatessa sisältöä — %s</string>\n    <string name=\"video_player\">Videosoitin</string>\n    <string name=\"background_player\">Taustasoitin</string>\n    <string name=\"popup_player\">Ponnahdusikkunasoitin</string>\n    <string name=\"always_ask_open_action\">Kysy aina</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Haetaan infoa…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Ladataan pyydettyä sisältöä</string>\n    <string name=\"create_playlist\">Uusi soittolista</string>\n    <string name=\"rename_playlist\">Uudelleennimeä</string>\n    <string name=\"name\">Nimi</string>\n    <string name=\"add_to_playlist\">Lisää soittolistaan</string>\n    <string name=\"set_as_playlist_thumbnail\">Aseta soittolistan kuvakkeeksi</string>\n    <string name=\"bookmark_playlist\">Tallenna soittolista kirjanmerkkeihin</string>\n    <string name=\"unbookmark_playlist\">Poista kirjanmerkki</string>\n    <string name=\"delete_playlist_prompt\">Poistetaanko tämä soittolista\\?</string>\n    <string name=\"playlist_creation_success\">Soittolista luotu</string>\n    <string name=\"playlist_add_stream_success\">Lisätty soittolistaan</string>\n    <string name=\"playlist_thumbnail_change_success\">Soittolistan kuvake muutettu.</string>\n    <string name=\"caption_none\">Ei tekstityksiä</string>\n    <string name=\"resize_fit\">Sovita</string>\n    <string name=\"resize_fill\">Täytä</string>\n    <string name=\"resize_zoom\">Suurenna</string>\n    <string name=\"caption_auto_generated\">Automaattisesti luotu</string>\n    <string name=\"caption_setting_title\">Tekstitykset</string>\n    <string name=\"caption_setting_description\">Muokkaa soittimen tekstitysten kokoa ja taustatyylejä. Asetusten käyttöönotto vaatii uudelleenkäynnistyksen</string>\n    <string name=\"enable_leak_canary_summary\">Muistivuotojen valvonta voi aiheuttaa ohjelman hidastumisen virhetilanteissa</string>\n    <string name=\"enable_disposed_exceptions_title\">Raportoi yhteensopivuusvirheitä, jotka aiheutuvat vanhoista ohjelmista</string>\n    <string name=\"enable_disposed_exceptions_summary\">Pakota raportointi toimituskelvottomille Rx-poikkeuksille, jotka ovat poiston jälkeen muistisirpaleiden tai aktiviteettielämänkaaren ulkopuolella</string>\n    <string name=\"import_title\">Tuo</string>\n    <string name=\"import_from\">Tuo kohteesta</string>\n    <string name=\"export_to\">Vie kohteeseen</string>\n    <string name=\"import_ongoing\">Tuodaan…</string>\n    <string name=\"export_ongoing\">Viedään…</string>\n    <string name=\"import_file_title\">Tuo tiedosto</string>\n    <string name=\"previous_export\">Edellinen vienti</string>\n    <string name=\"subscriptions_import_unsuccessful\">Tilauksia ei voitu tuoda</string>\n    <string name=\"subscriptions_export_unsuccessful\">Tilauksia ei voitu viedä</string>\n    <string name=\"import_youtube_instructions\">Tuo YouTube-tilaukset Google Takeoutista:\n\\n\n\\n1. Mene osoitteeseen: %1$s\n\\n2. Kirjaudu sisään pyydettäessä\n\\n3. Klikkaa \\\"Kaikki Youtube-data valittuna\\\", sitten \\\"Poista kaikki valinnat\\\", sitten ainoastaan \\\"tilaukset\\\" ja klikkaa \\\"OK\\\"\n\\n4. Klikkaa \\\"Seuraava vaihe\\\" ja \\\"Luo vienti\\\"\n\\n5. Klikkaa \\\"Lataa\\\"-painiketta tämän ilmestyessä\n\\n6. Klikkaa TUO TIEDOSTO alhaalta ja valitse ladattu .zip-tiedosto\n\\n7. [Jos zip-tiedoston tuonti epäonnistuu] Pura .csv-tiedosto (yleensä sijainnissa \\\"Youtube ja Youtube Musiikki/tilaukset/tilaukset.csv\\\") ja klikkaa TUO TIEDOSTO alhaalta ja valitse purettu csv-tiedosto</string>\n    <string name=\"import_soundcloud_instructions\">Tuo SoundCloud-profiili kirjoittamalla joko osoite tai ID:si:\n\\n\n\\n1. Laita päälle työpöytämoodi selaimessasi (tai käytä tietokonetta, tämä sivu ei toimi mobiilisivuna)\n\\n2. Mene tähän osoitteeseen: %1$s\n\\n3. Kirjaudu sisään kysyttäessä.\n\\n4. Kopioi se nettiosoite johon sinut ohjattiin.</string>\n    <string name=\"import_soundcloud_instructions_hint\">sinun käyttäjänimesi, soundcloud.com/&lt;sinun käyttäjänimesi&gt;</string>\n    <string name=\"import_network_expensive_warning\">Ota huomioon että tämä operaatio voi käyttää paljon dataa. \n\\n\n\\nHaluatko jatkaa\\?</string>\n    <string name=\"playback_speed_control\">Toistonopeuden säätimet</string>\n    <string name=\"playback_tempo\">Nopeus</string>\n    <string name=\"playback_pitch\">Sävelkorkeus</string>\n    <string name=\"unhook_checkbox\">Irrota toisistaan (saattaa aiheuttaa säröytymistä)</string>\n    <string name=\"skip_silence_checkbox\">Kelaa eteenpäin hiljaisissa kohdissa</string>\n    <string name=\"playback_step\">Askel</string>\n    <string name=\"playback_reset\">Nollaa</string>\n    <string name=\"start_accept_privacy_policy\">Noudattaaksemme EU:n yleistä tietosuoja-asetusta (GDPR), meidän pitää muistuttaa sinua lukemaan NewPipen tietosuojakäytäntö. Lue se tarkkaan.\n\\nSinun pitää myös hyväksyä se, jotta voit lähettää virheraportin.</string>\n    <string name=\"accept\">Hyväksy</string>\n    <string name=\"decline\">Hylkää</string>\n    <string name=\"limit_data_usage_none_description\">Ei rajaa</string>\n    <string name=\"limit_mobile_data_usage_title\">Rajoita resoluutiota mobiilidataa käytettäessä</string>\n    <string name=\"minimize_on_exit_title\">Pienennä vaihdettaessa ohjelmaa</string>\n    <string name=\"minimize_on_exit_summary\">Toiminto vaihdettaessa toiseen ohjelmaan päävideosoittimesta — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Ei koskaan</string>\n    <string name=\"minimize_on_exit_background_description\">Pienennä taustasoittimeksi</string>\n    <string name=\"minimize_on_exit_popup_description\">Pienennä ponnahdusikkunasoittimeksi</string>\n    <string name=\"unsubscribe\">Peru tilaus</string>\n    <string name=\"tab_choose\">Valitse välilehti</string>\n    <string name=\"missions_header_finished\">Valmis</string>\n    <string name=\"enqueue\">Lisää jonoon</string>\n    <string name=\"seek_duration_title\">Eteen-/taaksepäinkelauksen aika-askeleen pituus</string>\n    <string name=\"recently_added\">Hiljattain lisätyt</string>\n    <string name=\"local\">Paikalliset</string>\n    <string name=\"most_liked\">Pidetyimmät</string>\n    <string name=\"error_unable_to_load_comments\">Kommentteja ei voitu ladata</string>\n    <string name=\"main_page_content_summary\">Mitkä välilehdet näytetään pääsivulla</string>\n    <string name=\"done\">Valmis</string>\n    <string name=\"subtitle_activity_recaptcha\">Paina ”Valmis”, kun ratkaistu</string>\n    <string name=\"infinite_videos\">∞ videota</string>\n    <string name=\"more_than_100_videos\">100+ videota</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s katselija</item>\n        <item quantity=\"other\">%s katselijaa</item>\n    </plurals>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s kuuntelija</item>\n        <item quantity=\"other\">%s kuuntelijaa</item>\n    </plurals>\n    <string name=\"no_one_listening\">Ei kuuntelijoita</string>\n    <string name=\"no_one_watching\">Ei katselijoita</string>\n    <string name=\"subscribers_count_not_available\">Tilaajien lukumäärä ei saatavilla</string>\n    <string name=\"drawer_header_description\">Kytke palvelu, tällä hetkellä valittuna:</string>\n    <string name=\"permission_display_over_apps\">Myönnä käyttöoikeus näyttää muiden sovellusten päällä</string>\n    <string name=\"restore_defaults_confirmation\">Haluatko palauttaa oletusarvot\\?</string>\n    <string name=\"restore_defaults\">Palauta oletusarvot</string>\n    <string name=\"saved_tabs_invalid_json\">Ei voitu lukea talletettuja välilehtiä, joten käytetään oletusvälilehtiä</string>\n    <string name=\"missing_file\">Tiedosto siirretty tai poistettu</string>\n    <string name=\"download_to_sdcard_error_message\">Lataaminen ulkoiselle SD-kortille ei ole mahdollista. Nollataanko latauskansion sijainti\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Ulkoinen tallennustila ei käytettävissä</string>\n    <string name=\"app_update_notification_channel_description\">Ilmoitukset uusista NewPipe-versioista</string>\n    <string name=\"app_update_notification_channel_name\">Sovelluspäivitysilmoitus</string>\n    <string name=\"file_deleted\">Tiedosto poistettu</string>\n    <string name=\"artists\">Esittäjät</string>\n    <string name=\"albums\">Albumit</string>\n    <string name=\"songs\">Kappaleet</string>\n    <string name=\"events\">Tapahtumat</string>\n    <string name=\"videos_string\">Videot</string>\n    <string name=\"restricted_video\">Tämä video on ikärajoitettu.\n\\n\n\\nSalli ”%1$s” asetuksissa katsoaksesi.</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Ota käyttöön YouTuben ”Rajoitettu tila”</string>\n    <string name=\"settings_category_updates_title\">Päivitykset</string>\n    <string name=\"peertube_instance_add_exists\">Instanssi on jo olemassa</string>\n    <string name=\"peertube_instance_add_https_only\">Vain HTTPS-URL:t ovat tuettuja</string>\n    <string name=\"peertube_instance_add_fail\">Instanssia ei voitu vahvistaa</string>\n    <string name=\"peertube_instance_add_help\">Syötä instanssin URL</string>\n    <string name=\"peertube_instance_add_title\">Lisää instanssi</string>\n    <string name=\"peertube_instance_url_help\">Hae instansseja, joista pidät, osoitteesta %s</string>\n    <string name=\"peertube_instance_url_summary\">Valitse PeerTube-suosikki-instanssisi</string>\n    <string name=\"peertube_instance_url_title\">PeerTube-instanssit</string>\n    <string name=\"autoplay_title\">Automaattinen toisto</string>\n    <string name=\"settings_category_clear_data_title\">Tietojen tyhjennys</string>\n    <string name=\"enable_playback_resume_title\">Jatka toistoa</string>\n    <string name=\"show_original_time_ago_summary\">Palvelujen alkuperäiset tekstit näkyvät suoratoistettavassa sisällössä</string>\n    <string name=\"show_comments_summary\">Poista käytöstä piilottaaksesi kommentit</string>\n    <string name=\"watch_history_states_deleted\">Toistokohdat poistettu</string>\n    <string name=\"delete_playback_states_alert\">Poistetaanko kaikki toistokohdat\\?</string>\n    <string name=\"clear_playback_states_summary\">Poistaa kaikki toistokohdat</string>\n    <string name=\"clear_playback_states_title\">Poista toistokohdat</string>\n    <string name=\"enable_playback_state_lists_summary\">Näytä toistokohtien osoittimet listoissa</string>\n    <string name=\"enable_playback_state_lists_title\">Kohdat listoissa</string>\n    <string name=\"enable_playback_resume_summary\">Palauta edellinen toistokohta</string>\n    <string name=\"remove_watched_popup_warning\">Aiemmin katsotut ja soittolistaan lisätyt videot poistetaan. \\nOletko varma? Tätä ei voi peruuttaa!</string>\n    <string name=\"remove_watched_popup_title\">Poistetaanko katsotut videot?</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Kyllä ja osittain katsotut videot</string>\n    <string name=\"stop\">Pysäytä</string>\n    <string name=\"clear_download_history\">Tyhjennä lataushistoria</string>\n    <string name=\"close\">Sulje</string>\n    <string name=\"delete_downloaded_files\">Poista ladatut tiedostot</string>\n    <string name=\"confirm_prompt\">Haluatko tyhjentää lataushistoriasi vai poistaa kaikki ladatut tiedostot\\?</string>\n    <string name=\"no_comments\">Ei kommentteja</string>\n    <string name=\"show_comments_title\">Näytä kommentit</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanavan hahmokuvake</string>\n    <string name=\"video_detail_by\">Kenen toimesta: %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Onko syötteen lataaminen mielestäsi liian hidas\\? Voit koittaa ottaa käyttöön nopean lataamisen (voit vaihtaa sen asetuksista tai painamalla alla olevaa painiketta).\n\\n\n\\nNewPipe tarjoaa kaksi tapaa ladata syöte:\n\\n• Koko tilatun kanavan lataaminen, mikä on hidasta, mutta lataa syötteen kokonaisuudessaan.\n\\n• Erityisen palvelu-endpointin käyttö, mikä on nopeaa, mutta yleensä ei lataa syötettä kokonaisuudessaan.\n\\n\n\\nNäiden kahden välinen ero on, että nopean tavan lataamista tiedoista yleensä puuttuu esim. sisällön kesto tai tyyppi (ei voi erotella livevideoita ja tavallisia) tai se ei lataa kaikkea sisältöä.\n\\n\n\\nYouTube on esimerkki palvelusta, joka tarjoaa nopean tavan RSS-syötteen avulla.\n\\n\n\\nValinta riippuu siitä, mitä halutaan: nopeutta vai tarkkoja tietoja.</string>\n    <string name=\"default_kiosk_page_summary\">Oletuskioski</string>\n    <string name=\"channel_created_by\">%s:n luoma</string>\n    <string name=\"content_not_supported\">NewPipe ei vielä tue tätä sisältöä.\n\\n\n\\nToivottavasti sitä tuetaan myöhemmässä versiossa.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Poista nopea tila käytöstä</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Ota nopea tila käyttöön</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Saatavilla joissakin palveluissa, on yleensä paljon nopeampi, mutta voi palauttaa rajallisen määrän sisältöä ja usein epätäydelliset tiedot (esim. ei kestoa, ei sisällön tyyppiä, ei livestatusta)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Hae erityisestä syötteestä, kun sellainen on saatavilla</string>\n    <string name=\"feed_update_threshold_option_always_update\">Päivitä aina</string>\n    <string name=\"feed_update_threshold_summary\">Edellisestä päivityksestä kulunut aika, jonka jälkeen tilaus katsotaan vanhentuneeksi—%s</string>\n    <string name=\"feed_update_threshold_title\">Syötteen päivitysväli</string>\n    <string name=\"settings_category_feed_title\">Syöte</string>\n    <string name=\"feed_create_new_group_button_title\">Uusi</string>\n    <string name=\"feed_group_dialog_delete_message\">Haluatko poistaa tämän ryhmän\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Tyhjä ryhmän nimi</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d valittu</item>\n        <item quantity=\"other\">%d valittua</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Tilausta ei valittuna</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Valitse tilaukset</string>\n    <string name=\"feed_processing_message\">Käsitellään syötettä…</string>\n    <string name=\"feed_notification_loading\">Ladataan syötettä…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Ei ladattu: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Syöte viimeksi päivitetty: %s</string>\n    <string name=\"feed_groups_header_title\">Kanavaryhmät</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d päivä</item>\n        <item quantity=\"other\">%d päivää</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d tunti</item>\n        <item quantity=\"other\">%d tuntia</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuutti</item>\n        <item quantity=\"other\">%d minuuttia</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekunti</item>\n        <item quantity=\"other\">%d sekuntia</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">ExoPlayerin rajoitusten takia kelauksen aika-askel asetettiin %d sekuntiin</string>\n    <string name=\"remove_watched\">Poista katsotut</string>\n    <string name=\"systems_language\">Järjestelmän oletus</string>\n    <string name=\"app_language_title\">Sovelluksen kieli</string>\n    <string name=\"choose_instance_prompt\">Valitse instanssi</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Storage Access Framework\\' sallii lataukset ulkoiselle SD-kortille</string>\n    <string name=\"downloads_storage_use_saf_title\">Ota SAF käyttöön</string>\n    <string name=\"downloads_storage_ask_summary\">Jokaisen latauksen kohde kysytään.\n\\nSalli SAF, jos haluat tallentaa ulkoiselle SD-kortille</string>\n    <string name=\"downloads_storage_ask_title\">Kysy mihin ladataan</string>\n    <string name=\"start_downloads\">Aloita lataukset</string>\n    <string name=\"enable_queue_limit_desc\">Salli vain yksi lataus kerrallaan</string>\n    <string name=\"enable_queue_limit\">Rajoita latausjonon kokoa</string>\n    <string name=\"max_retry_desc\">Suurin määrä yrityksiä ennen kuin lataus perutaan</string>\n    <string name=\"max_retry_msg\">Uudelleenyritysten maksimimäärä</string>\n    <string name=\"error_download_resource_gone\">Tätä latausta ei voi palauttaa</string>\n    <string name=\"error_timeout\">Yhteys aikakatkaistiin</string>\n    <string name=\"error_progress_lost\">Eteneminen menetettiin, koska tiedosto poistettiin</string>\n    <string name=\"error_insufficient_storage_left\">Laitteella ei ole tilaa</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe suljettiin, kun se käsitteli tiedostoa</string>\n    <string name=\"error_postprocessing_failed\">Jälkikäsittely epäonnistui</string>\n    <string name=\"error_http_not_found\">Ei löytynyt</string>\n    <string name=\"error_http_unsupported_range\">Palvelin ei hyväksy monisäikeisiä latauksia, yritä uudelleen asetuksella @string/msg_threads = 1</string>\n    <string name=\"error_http_no_content\">Palvelin ei lähetä dataa</string>\n    <string name=\"error_connect_host\">Palvelimelle ei voi yhdistää</string>\n    <string name=\"error_unknown_host\">Palvelinta ei löytynyt</string>\n    <string name=\"error_ssl_exception\">Turvallista yhteyttä ei voitu muodostaa</string>\n    <string name=\"error_path_creation\">Kohdekansiota ei voi luoda</string>\n    <string name=\"error_file_creation\">Tiedostoa ei voi luoda</string>\n    <string name=\"show_error\">Näytä virhe</string>\n    <string name=\"download_already_pending\">Tällä nimellä on jo lataus odottamassa</string>\n    <string name=\"download_already_running\">Tällä nimellä on jo lataus käynnissä</string>\n    <string name=\"overwrite_failed\">tiedostoa ei voi ylikirjoittaa</string>\n    <string name=\"overwrite_finished_warning\">Ladattu tiedosto, jolla on tämä nimi, on jo olemassa</string>\n    <string name=\"overwrite_unrelated_warning\">Tämän niminen tiedosto on jo olemassa</string>\n    <string name=\"overwrite\">Ylikirjoita</string>\n    <string name=\"generate_unique_name\">Luo uniikki nimi</string>\n    <string name=\"download_failed\">Lataus epäonnistui</string>\n    <string name=\"permission_denied\">Järjestelmä kieltäytyi toiminnosta</string>\n    <string name=\"recovering\">palautetaan</string>\n    <string name=\"post_processing\">jälkikäsitellään</string>\n    <string name=\"queued\">lisätty jonoon</string>\n    <string name=\"missions_header_pending\">Odottaa</string>\n    <string name=\"show_original_time_ago_title\">Näytä alkuperäinen aika sisällölle</string>\n    <string name=\"pause_downloads\">Tauota lataukset</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Hyödyllinen vaihdettaessa mobiilidataan, vaikka joitakin latauksia ei voi pysäyttää</string>\n    <string name=\"pause_downloads_on_mobile\">Keskeytä, kun yhteys on käytön mukaan laskutettava</string>\n    <string name=\"paused\">tauotettu</string>\n    <string name=\"app_update_available_notification_title\">NewPipe-päivitys on saatavilla!</string>\n    <string name=\"list_view_mode\">Listanäkymän ulkoasu</string>\n    <string name=\"auto\">Automaattinen</string>\n    <string name=\"grid\">Ruudukko</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"updates_setting_description\">Näytä ilmoitus sovelluspäivityksestä, kun uusi versio on saatavilla</string>\n    <string name=\"updates_setting_title\">Päivitykset</string>\n    <string name=\"playlist_no_uploader\">Automaattisesti luotu (lataajaa ei löytynyt)</string>\n    <string name=\"unmute\">Poista mykistys</string>\n    <string name=\"mute\">Mykistä</string>\n    <string name=\"conferences\">Konferenssit</string>\n    <string name=\"playlist_page_summary\">Soittolistasivu</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Näytä vain ryhmittelemättömät tilaukset</string>\n    <string name=\"no_playlist_bookmarked_yet\">Ei soittolistakirjanmerkkejä vielä</string>\n    <string name=\"select_a_playlist\">Valitse soittolista</string>\n    <string name=\"error_report_open_github_notice\">Ole hyvä ja tarkasta onko kaatumiseen liittyvä ongelma jo raportoitu. Tikettien kaksoiskappaleiden selvittely vie aikaa varsinaisten ohjelmavirheiden korjaamiselta.</string>\n    <string name=\"error_report_open_issue_button_text\">Raportoi GitHubissa</string>\n    <string name=\"copy_for_github\">Kopioi muotoiltu raportti</string>\n    <string name=\"search_showing_result_for\">Näytetään tulokset haulle: %s</string>\n    <string name=\"never\">Ei koskaan</string>\n    <string name=\"wifi_only\">Vain Wi-Fi-verkossa</string>\n    <string name=\"autoplay_summary\">Aloita toisto automaattisesti — %s</string>\n    <string name=\"title_activity_play_queue\">Toistojono</string>\n    <string name=\"unsupported_url_dialog_message\">Ei tunnistettu URL:ää. Avataanko toisessa sovelluksessa\\?</string>\n    <string name=\"auto_queue_toggle\">Automaattinen jonoon lisääminen</string>\n    <string name=\"clear_queue_confirmation_description\">Aktiivisen soittimen jono korvataan</string>\n    <string name=\"clear_queue_confirmation_summary\">Soittimesta toiseen vaihtaminen saattaa korvata jonosi</string>\n    <string name=\"clear_queue_confirmation_title\">Kysy vahvistusta ennen jonon tyhjentämistä</string>\n    <string name=\"notification_action_nothing\">Ei mitään</string>\n    <string name=\"notification_action_buffering\">Puskurointi</string>\n    <string name=\"notification_action_shuffle\">Sekoita</string>\n    <string name=\"notification_action_repeat\">Toista uudelleen</string>\n    <string name=\"notification_actions_at_most_three\">Voit valita enintään kolme toimintoa ilmoituksessa näytettäväksi!</string>\n    <string name=\"notification_actions_summary\">Muokkaa ilmoitustoimintoja näpäyttämällä niitä. Valitse ilmoituksessa näytettäväksi enintään kolme käyttämällä oikealla olevia valintaruutuja.</string>\n    <string name=\"notification_action_4_title\">Viides toimintopainike</string>\n    <string name=\"notification_action_3_title\">Neljäs toimintopainike</string>\n    <string name=\"notification_action_2_title\">Kolmas toimintopainike</string>\n    <string name=\"notification_action_1_title\">Toinen toimintopainike</string>\n    <string name=\"notification_action_0_title\">Ensimmäinen toimintopainike</string>\n    <string name=\"notification_scale_to_square_image_summary\">Rajaa ilmoituksessa näytettävä videon esikatselukuva kuvasuhteesta 16:9 kuvasuhteeseen 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Rajaa esikatselukuva 1:1-kuvasuhteeseen</string>\n    <string name=\"show_memory_leaks\">Näytä muistivuodot</string>\n    <string name=\"enqueued\">Lisätty jonoon</string>\n    <string name=\"enqueue_stream\">Lisää jonoon</string>\n    <string name=\"clear_cookie_summary\">Poista evästeet, jotka NewPipe tallentaa, kun ratkaiset reCAPTCHA:n</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA-evästeet on poistettu</string>\n    <string name=\"clear_cookie_title\">Poista reCAPTCHA-evästeet</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube tarjoaa ”Rajoitetun tilan”, joka piilottaa aikuisviihdesisällön</string>\n    <string name=\"show_age_restricted_content_summary\">Näytä mahdollisesti lapsille sopimaton sisältö, jolla on ikäraja (esim. 18+)</string>\n    <string name=\"notification_colorize_summary\">Anna Androidin muokata ilmoituksen väriä esikatselukuvan päävärin mukaan (tämä ei ole mahdollista kaikilla laitteilla)</string>\n    <string name=\"notification_colorize_title\">Käytä värejä ilmoituksessa</string>\n    <string name=\"show_thumbnail_summary\">Käytä esikatselukuvaa lukitusruudun ja ilmoitusten taustakuvana</string>\n    <string name=\"show_thumbnail_title\">Näytä esikatselukuva</string>\n    <string name=\"msg_calculating_hash\">Lasketaan</string>\n    <string name=\"show_meta_info_summary\">Poista käytöstä piilottaaksesi metatiedot suoratoiston luojasta, sisällöstä tai hakupyynnöstä</string>\n    <string name=\"show_meta_info_title\">Näytä metatieto</string>\n    <string name=\"recent\">Viimeisimmät</string>\n    <string name=\"show_description_title\">Näytä kuvaus</string>\n    <string name=\"open_with\">Avaa sovelluksella</string>\n    <string name=\"show_description_summary\">Poista valinta piilottaaksesi videon kuvauksen ja lisätiedot</string>\n    <string name=\"no_app_to_open_intent\">Mikään sovellus laitteessasi ei voi avata tätä</string>\n    <string name=\"chapters\">Jaksot</string>\n    <string name=\"description_tab_description\">Kuvaus</string>\n    <string name=\"related_items_tab_description\">Samankaltaiset striimit</string>\n    <string name=\"comments_tab_description\">Kommentit</string>\n    <string name=\"download_has_started\">Lataus on alkanut</string>\n    <string name=\"select_night_theme_toast\">Voit valita suosikkiyöteemasi alta</string>\n    <string name=\"night_theme_summary\">Valitse suosikki yöteemasi — %s</string>\n    <string name=\"auto_device_theme_title\">Automaattinen (laitteen teema)</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"featured\">Esitellyt</string>\n    <string name=\"paid_content\">Tämä sisältö on saatavilla vain maksaneille käyttäjillä, joten NewPipe ei voi suoratoistaa tai ladata sitä.</string>\n    <string name=\"youtube_music_premium_content\">Tämä video on saatavilla vain YouTube Music Premium -jäsenille, joten NewPipe ei voi suoratoistaa tai ladata sitä.</string>\n    <string name=\"private_content\">Tämä sisältö on yksityinen, joten NewPipe ei voi suoratoistaa tai ladata sitä.</string>\n    <string name=\"soundcloud_go_plus_content\">Tämä on SoundCloud Go+ -raita maassasi, joten NewPipe ei voi suoratoistaa tai ladata sitä.</string>\n    <string name=\"georestricted_content\">Tämä sisältö ei ole saatavilla maassasi.</string>\n    <string name=\"crash_the_app\">Kaada sovellus</string>\n    <string name=\"recaptcha_solve\">Ratkaise</string>\n    <string name=\"hash_channel_description\">Ilmoitukset videon hajautuksen etenemisestä</string>\n    <string name=\"hash_channel_name\">Videon hajautusilmoitus</string>\n    <string name=\"restricted_video_no_stream\">Tämä video on ikärajoitettu.\n\\nYouTuben uusien ikärajoitusperiaatteiden mukaisesti NewPipella ei ole pääsyä videoon eikä sitä voida toistaa.</string>\n    <string name=\"night_theme_title\">Yöteema</string>\n    <string name=\"description_select_disable\">Poista käytöstä tekstinvalinta kuvauskentän sisältä</string>\n    <string name=\"description_select_note\">Voit nyt valita tekstin kuvauskentän sisältä. Huomioithan, että valintatilan aikana sivu voi vilkkua ja linkit eivät ehkä ole klikattavia.</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Säätövivun kuvakkeen esikatselu</string>\n    <string name=\"disable_media_tunneling_summary\">Poista median tunnelointi käytöstä, jos havaitset mustan näyttöruudun tai änkytystä videon toistossa.</string>\n    <string name=\"disable_media_tunneling_title\">Poista median tunnelointi käytöstä</string>\n    <string name=\"feed_load_error_fast_unknown\">Nopea syötetila ei tarjoa enempää tietoa tästä.</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">\\'Storage Access Framework\\' on tuettu vain Android 10:stä alkaen</string>\n    <string name=\"off\">Pois päältä</string>\n    <string name=\"on\">Päällä</string>\n    <string name=\"tablet_mode_title\">Tablettitila</string>\n    <string name=\"open_website_license\">Avaa verkkosivu</string>\n    <string name=\"detail_heart_img_view_description\">Tekijän tykkäämä</string>\n    <string name=\"metadata_privacy_internal\">Sisäinen</string>\n    <string name=\"metadata_privacy_private\">Yksityinen</string>\n    <string name=\"metadata_privacy_unlisted\">Listaamaton</string>\n    <string name=\"metadata_privacy_public\">Julkinen</string>\n    <string name=\"metadata_host\">Ylläpitäjä</string>\n    <string name=\"metadata_support\">Tuki</string>\n    <string name=\"metadata_language\">Kieli</string>\n    <string name=\"metadata_age_limit\">Ikäraja</string>\n    <string name=\"metadata_privacy\">Julkisuusaste</string>\n    <string name=\"metadata_licence\">Lisenssi</string>\n    <string name=\"metadata_tags\">Avainsanat</string>\n    <string name=\"metadata_category\">Kategoria</string>\n    <string name=\"description_select_enable\">Salli tekstin valinta kuvauksessa</string>\n    <string name=\"account_terminated\">Tili suljettu</string>\n    <string name=\"feed_load_error_terminated\">Tekijän käyttäjätili on suljettu.\n\\nNewPipe ei pysty lataamaan tätä syötettä tulevaisuudessa.\n\\nHaluatko poistaa kanavan tilauksesta\\?</string>\n    <string name=\"feed_load_error_account_info\">Ei voitu ladata syötettä hakusanalle \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Virhe syötteen lataamisessa</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Sinulta kysytään joka kerta, minne tiedosto ladataan</string>\n    <string name=\"dont_show\">Älä näytä</string>\n    <string name=\"low_quality_smaller\">Matala laatu (pienempi)</string>\n    <string name=\"high_quality_larger\">Korkea laatu (suurempi)</string>\n    <string name=\"show_channel_details\">Näytä kanavan lisätiedot</string>\n    <string name=\"no_dir_yet\">Latauskansiota ei vielä asetettu, valitse ensin oletuslatauskansio</string>\n    <string name=\"comments_are_disabled\">Kommentit poistettu käytöstä</string>\n    <string name=\"mark_as_watched\">Merkitse katsotuksi</string>\n    <string name=\"remote_search_suggestions\">Etähakuehdotukset</string>\n    <string name=\"local_search_suggestions\">Paikalliset hakuehdotukset</string>\n    <string name=\"enqueue_next_stream\">Lisää seuraavaksi</string>\n    <string name=\"enqueued_next\">Seuraavaksi jonossa</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Lataus valmis</item>\n        <item quantity=\"other\">%s latausta valmiina</item>\n    </plurals>\n    <string name=\"start_main_player_fullscreen_title\">Käynnistä pääsoitin koko näytössä</string>\n    <string name=\"main_page_content_swipe_remove\">Pyyhkäise kohteita poistaaksesi ne</string>\n    <string name=\"start_main_player_fullscreen_summary\">Älä käynnistä videoita minisoittimessa, vaan siirry suoraan koko näytön tilaan, jos automaattinen kierto on lukittu. Voit silti käyttää minisoitinta poistumalla koko näytön tilasta</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Poistettu %1$s lataus</item>\n        <item quantity=\"other\">Poistettu %1$s latausta</item>\n    </plurals>\n    <string name=\"processing_may_take_a_moment\">Käsitellään… Voi kestää hetken</string>\n    <string name=\"check_for_updates\">Tarkista päivitykset</string>\n    <string name=\"manual_update_description\">Tarkista manuaalisesti onko uusia versioita saatavilla</string>\n    <string name=\"checking_updates_toast\">Tarkistetaan päivityksiä…</string>\n    <string name=\"error_report_channel_description\">Ilmoitukset, joilla raportoidaan virheistä</string>\n    <string name=\"detail_pinned_comment_view_description\">Kiinnitetty kommentti</string>\n    <string name=\"error_report_channel_name\">Virheraportti-ilmoitus</string>\n    <string name=\"error_report_notification_title\">NewPipe kohtasi virheen, näpäytä raportoidaksesi</string>\n    <string name=\"error_report_notification_toast\">Tapahtui virhe, katso ilmoitus</string>\n    <string name=\"create_error_notification\">Luo virheilmoitus</string>\n    <string name=\"leak_canary_not_available\">LeakCanary ei ole saatavilla</string>\n    <string name=\"show_crash_the_player_title\">Näytä \\\"Kaada soitin\\\"</string>\n    <string name=\"crash_the_player\">Kaada soitin</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Toiminnolle ei löytynyt sopivaa tiedostonhallintaohjelmaa.\n\\nAsenna tiedostonhallintaohjelma, joka on yhteensopiva Storage Access Frameworkin kanssa.</string>\n    <string name=\"no_appropriate_file_manager_message\">Toiminnolle ei löytynyt sopivaa tiedostonhallintaohjelmaa.\n\\nAsenna tiedostonhallintaohjelma tai kokeile asettaa \\'%s\\' pois käytöstä latausasetuksista</string>\n    <string name=\"show_crash_the_player_summary\">Näytä soitinta käytettäessä soittimen kaatamisen vaihtoehto</string>\n    <string name=\"show_error_snackbar\">Näytä virheen ponnahdusilmoitus</string>\n    <string name=\"feed_new_items\">Uudet syötteet</string>\n    <string name=\"notifications\">Ilmoitukset</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Käytä aina ExoPlayerin videolähtöpinnan asetusta</string>\n    <string name=\"audio_track_type_descriptive\">kuvaileva</string>\n    <string name=\"audio_track_type_dubbed\">dubattu</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">alkuperäinen</string>\n    <string name=\"settings_category_player_notification_title\">Soittimen ilmoitus</string>\n    <string name=\"settings_category_player_notification_summary\">Määritä toistettavan lähetysvirran ilmoitus</string>\n    <string name=\"left_gesture_control_title\">Vasemman eleen toiminto</string>\n    <string name=\"right_gesture_control_summary\">Valitse soitinnäytön oikean puoliskon ele</string>\n    <string name=\"right_gesture_control_title\">Oikean eleen toiminto</string>\n    <string name=\"brightness\">Kirkkaus</string>\n    <string name=\"volume\">Äänenvoimakkuus</string>\n    <string name=\"none\">Ei mitään</string>\n    <string name=\"progressive_load_interval_title\">Toiston latausvälin koko</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ohita laitteiston mediapainikkeiden tapahtumat</string>\n    <string name=\"prefer_original_audio_title\">Suosi alkuperäistä ääntä</string>\n    <string name=\"prefer_original_audio_summary\">Valitse alkuperäinen ääniraita kielestä riippumatta</string>\n    <string name=\"prefer_descriptive_audio_title\">Suosi kuvailutulkkausta</string>\n    <string name=\"prefer_descriptive_audio_summary\">Valitse näkövammaisille tarkoitetun kuvailutulkkauksen sisältävä ääniraita, mikäli saatavilla</string>\n    <string name=\"left_gesture_control_summary\">Valitse soitinnäytön vasemman puoliskon ele</string>\n    <string name=\"streams_notification_channel_name\">Uusia lähetysvirtoja</string>\n    <string name=\"progressive_load_interval_summary\">Muuta progressiivisen sisällön latausvälin kokoa (tällä hetkellä %s). Pienempi arvo saattaa nopeuttaa ensimmäistä latausta.</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Tästä on hyötyä esim. silloin, jos käyttämiesi kuulokkeiden fyysiset painikkeet eivät toimi.</string>\n    <string name=\"image_quality_title\">Kuvanlaatu</string>\n    <string name=\"no_video_streams_available_for_external_players\">Ulkoisille soittimille ei ole saatavilla videostriimiä</string>\n    <string name=\"channel_tab_videos\">Videot</string>\n    <string name=\"import_subscriptions_hint\">Tuo tai vie tilauksia kolmen pisteen valikosta</string>\n    <string name=\"metadata_subscribers\">Tilaajat</string>\n    <string name=\"feed_show_partially_watched\">Osittain katsottu</string>\n    <string name=\"fast_mode\">Nopea tila</string>\n    <string name=\"feed_hide_streams_title\">Näytä seuraavat streamit</string>\n    <string name=\"unknown_audio_track\">Tuntematon</string>\n    <string name=\"enable_streams_notifications_title\">Ilmoitukset uusista streameista</string>\n    <string name=\"show_channel_tabs_summary\">Mitä välilehtiä kanavasivuilla näytetään</string>\n    <string name=\"remove_duplicates_title\">Poistetaanko kaksoiskappaleet\\?</string>\n    <string name=\"feed_show_hide_streams\">Näytä/piilota streamit</string>\n    <string name=\"share_playlist_with_list\">Jaa URL-luettelo</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s uusi streami</item>\n        <item quantity=\"other\">%s uudet streamit</item>\n    </plurals>\n    <string name=\"share_playlist_with_titles\">Jaa otsikoiden kanssa</string>\n    <string name=\"remove_duplicates\">Poista kaksoiskappaleet</string>\n    <string name=\"channel_tab_shorts\">Shortsit</string>\n    <string name=\"duplicate_in_playlist\">Harmaana näkyvät soittolistat sisältävät jo tämän kohteen.</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Käytä ExoPlayerin dekooderin varatoimintoa</string>\n    <string name=\"notifications_disabled\">Ilmoitukset on poistettu käytöstä</string>\n    <string name=\"feed_show_upcoming\">Tuleva</string>\n    <string name=\"loading_metadata_title\">Ladataan Metadata…</string>\n    <string name=\"app_update_available_notification_text\">Lataa %s napauttamalla</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_screen_orientation\">Vaihda näytön suuntaa</string>\n    <string name=\"settings_category_exoplayer_summary\">Hallitse joitain ExoPlayer-asetuksia. Nämä muutokset edellyttävät soittimen uudelleenkäynnistystä tullakseen voimaan</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Kopio lisätty %d kertaa</string>\n    <string name=\"image_quality_low\">Heikkolaatu</string>\n    <string name=\"main_tabs_position_title\">Päävälilehtien sijainti</string>\n    <string name=\"faq_description\">Jos sinulla on ongelmia sovelluksen käytössä, muista katsoa nämä vastaukset yleisiin kysymyksiin!</string>\n    <string name=\"toggle_fullscreen\">Koko näyttö päälle/pois</string>\n    <string name=\"unknown_quality\">Tuntematon laatu</string>\n    <string name=\"streams_notifications_network_title\">Vaadittu verkkoyhteys</string>\n    <string name=\"check_new_streams\">Suorita uusien streamien tarkistaminen</string>\n    <string name=\"feed_fetch_channel_tabs\">Hae kanavavälilehdet</string>\n    <string name=\"faq_title\">Usein Kysytyt Kysymykset</string>\n    <string name=\"app_update_unavailable_toast\">Käytät uusinta NewPipen versiota</string>\n    <string name=\"metadata_avatars\">Avatarit</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"next_stream\">Seuraava stream</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Mediatunnelointi oli oletuksena poistettu käytöstä laitteessasi, koska laitemallisi ei tue sitä.</string>\n    <string name=\"metadata_subchannel_avatars\">Alikanavan avatarit</string>\n    <string name=\"faq\">Katso verkkosivuilla</string>\n    <string name=\"night_theme_available\">Tämä vaihtoehto on käytettävissä vain, jos %s on valittu teemaksi</string>\n    <string name=\"audio_track_present_in_video\">Tässä streamissa pitäisi jo olla ääniraita</string>\n    <string name=\"open_play_queue\">Avaa soittojono</string>\n    <string name=\"image_quality_none\">Älä lataa kuvia</string>\n    <string name=\"enable_streams_notifications_summary\">Ilmoita tilausten uusista streameista</string>\n    <string name=\"image_quality_high\">Korkealaatu</string>\n    <string name=\"select_quality_external_players\">Valitse laatu ulkoisille soittimille</string>\n    <string name=\"channel_tab_about\">Tietoja</string>\n    <string name=\"share_playlist\">Jaa soittolista</string>\n    <string name=\"forward\">Eteenpäin</string>\n    <string name=\"select_audio_track_external_players\">Valitse ääniraita ulkoisille soittimille</string>\n    <string name=\"unknown_format\">Tuntematon muoto</string>\n    <string name=\"channel_tab_albums\">Albumit</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Ulkoisille soittimille ei ole saatavilla äänistreameja</string>\n    <string name=\"rewind\">Kelaa taaksepäin</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">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.</string>\n    <string name=\"delete_downloaded_files_confirm\">Poistetaanko kaikki ladatut tiedostot levyltä\\?</string>\n    <string name=\"image_quality_medium\">Keskilaatu</string>\n    <string name=\"metadata_uploader_avatars\">Lataajan avatarit</string>\n    <string name=\"percent\">Prosentti</string>\n    <string name=\"play_queue_audio_track\">Audio: %s</string>\n    <string name=\"selected_stream_external_player_not_supported\">Ulkoiset soittimet eivät tue valittua suoratoistoa</string>\n    <string name=\"streams_notification_channel_description\">Ilmoitukset uusista tilausten striimeistä</string>\n    <string name=\"metadata_banners\">Bannerit</string>\n    <string name=\"channel_tab_playlists\">Soittolistat</string>\n    <string name=\"sort\">Järjestä</string>\n    <string name=\"main_tabs_position_summary\">Siirrä päävälilehden valitsin alas</string>\n    <string name=\"any_network\">Mikä tahansa verkko</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer oletusarvo</string>\n    <string name=\"audio_track\">Ääniraita</string>\n    <string name=\"card\">Kortti</string>\n    <string name=\"no_live_streams\">Ei live streamejä</string>\n    <string name=\"msg_failed_to_copy\">Kopioiminen leikepöydälle epäonnistui</string>\n    <string name=\"unset_playlist_thumbnail\">Poista pysyvä pikkukuva</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"play\">Toista</string>\n    <string name=\"more_options\">Lisää vaihtoehtoja</string>\n    <string name=\"metadata_thumbnails\">Pikkukuvat</string>\n    <string name=\"loading_stream_details\">Ladataan streamin tietoja…</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayerin asetukset</string>\n    <string name=\"feed_show_watched\">Täysin katsottu</string>\n    <string name=\"duration\">Kesto</string>\n    <string name=\"no_streams\">Ei streamejä</string>\n    <string name=\"channel_tab_channels\">Kanavat</string>\n    <string name=\"you_successfully_subscribed\">Olet nyt tilannut tämän kanavan</string>\n    <string name=\"previous_stream\">Edellinen stream</string>\n    <string name=\"channel_tab_livestreams\">Live</string>\n    <string name=\"remove_duplicates_message\">Haluatko poistaa kaikki ylimääräiset identtiset suoratoistot tästä soittolistasta\\?</string>\n    <string name=\"streams_not_yet_supported_removed\">Suoratoistot, joita lataaja ei vielä tue, ei näytetä</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s vastaus</item>\n        <item quantity=\"other\">%s vastausta</item>\n    </plurals>\n    <string name=\"show_more\">Näytä lisää</string>\n    <string name=\"show_less\">Näytä vähemmän</string>\n    <string name=\"show_channel_tabs\">Kanavan välilehdet</string>\n    <string name=\"yes\">Kyllä</string>\n    <string name=\"no\">Ei</string>\n    <string name=\"reset_all_settings\">Kaikkien asetusten nollaaminen hävittää kaikki valitsemasi asetukset ja käynnistää sovelluksen uudelleen.\n\\n\n\\nOletko varma, että haluat jatkaa?</string>\n    <string name=\"settings_category_backup_restore_title\">Varmuuskopiointi ja palauttaminen</string>\n    <string name=\"reset_settings_title\">Nollaa asetukset</string>\n    <string name=\"reset_settings_summary\">Palauta kaikki asetukset oletusarvoihin</string>\n    <string name=\"auto_update_check_description\">NewPipe voi automaattisesti tarkistaa päivitysten saatavuuden silloin tällöin ja ilmoittaa kun niitä on saatavilla.\n\\nHaluatko ottaa tämän käyttöön?</string>\n    <string name=\"error_insufficient_storage\">Laitteella ei ole riittävästi vapaata tilaa</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Jaa tilapäisenä YouTube-soittolistana</string>\n    <string name=\"channel_tab_tracks\">Raidat</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"audio_track_type_secondary\">toissijainen</string>\n    <string name=\"tab_bookmarks_short\">Soittolistat</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-fil/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Pindutin ang magnifying glass para magsimula.</string>\n    <string name=\"upload_date_text\">Inilathala noong %1$s</string>\n    <string name=\"no_player_found\">Walang nakitang stream player. I-install ang VLC\\?</string>\n    <string name=\"no_player_found_toast\">Walang nakitang stream player (pwede mong i-install ang VLC para ma-play ito).</string>\n    <string name=\"install\">I-install</string>\n    <string name=\"cancel\">Kanselahin</string>\n    <string name=\"open_in_browser\">Buksan sa browser</string>\n    <string name=\"open_in_popup_mode\">Buksan sa popup mode</string>\n    <string name=\"share\">Ibahagi</string>\n    <string name=\"download\">I-download</string>\n    <string name=\"controls_download_desc\">I-download ang stream file</string>\n    <string name=\"search\">Maghanap</string>\n    <string name=\"settings\">Mga Setting</string>\n    <string name=\"did_you_mean\">\\\"%1$s\\\" ba ang tinutukoy mo\\?</string>\n    <string name=\"share_dialog_title\">Ibahagi sa</string>\n    <string name=\"use_external_video_player_title\">Gumamit ng ibang video player</string>\n    <string name=\"use_external_video_player_summary\">Nawawala ang tunog sa ilang resolusyon</string>\n    <string name=\"use_external_audio_player_title\">Gumamit ng ibang audio player</string>\n    <string name=\"subscribe_button_title\">Sumubaybay</string>\n    <string name=\"subscribed_button_title\">Sumusubaybay</string>\n    <string name=\"unsubscribe\">Tumigil sa pagsubaybay</string>\n    <string name=\"channel_unsubscribed\">Hininto ang pagsubaybay sa channel</string>\n    <string name=\"subscription_change_failed\">Hindi mabago ang pagsubaybay</string>\n    <string name=\"subscription_update_failed\">Hindi ma-update ang pagsubaybay</string>\n    <string name=\"show_info\">Ipakita ang impormasyon</string>\n    <string name=\"tab_subscriptions\">Mga Pagsubaybay</string>\n    <string name=\"tab_bookmarks\">Nakabookmark na Playlists</string>\n    <string name=\"tab_choose\">Pumili ng Tab</string>\n    <string name=\"fragment_feed_title\">Anong Bago</string>\n    <string name=\"controls_background_title\">Likuran</string>\n    <string name=\"controls_popup_title\">Palutangin</string>\n    <string name=\"controls_add_to_playlist_title\">Idagdag Sa</string>\n    <string name=\"download_path_title\">Folder ng mga na-download na video</string>\n    <string name=\"download_path_dialog_title\">Pumili ng download folder para sa mga video file</string>\n    <string name=\"download_path_audio_summary\">Ilalagay rito ang mga na-download na audio file</string>\n    <string name=\"download_path_audio_dialog_title\">Pumili ng download folder para sa mga audio file</string>\n    <string name=\"light_theme_title\">Maliwanag</string>\n    <string name=\"play_with_kodi_title\">I-play gamit Kodi</string>\n    <string name=\"dark_theme_title\">Madilim</string>\n    <string name=\"download_path_summary\">Dito inilalagay ang mga na-download na video file</string>\n    <string name=\"download_path_audio_title\">Download folder ng mga audio</string>\n    <string name=\"search_showing_result_for\">Ipinapakita ang mga resulta para sa: %s</string>\n    <string name=\"open_with\">Buksan gamit ang</string>\n    <string name=\"notification_action_3_title\">Pang-apat na action button</string>\n    <string name=\"show_play_with_kodi_title\">Ipakita ang \\\"I-play gamit Kodi\\\"</string>\n    <string name=\"notification_action_1_title\">Pangalawang action button</string>\n    <string name=\"notification_action_2_title\">Pangatlong action button</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"show_search_suggestions_summary\">Piliin ang mga mungkahing ipapakita habang naghahanap</string>\n    <string name=\"show_description_summary\">Patayin para itago ang paglalarawan ng video at karagdagang impormasyon</string>\n    <string name=\"notification_actions_summary\">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</string>\n    <string name=\"notification_action_buffering\">Pag-buffer</string>\n    <string name=\"notification_action_nothing\">Wala</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"local_search_suggestions\">Lokal na mungkahi</string>\n    <string name=\"remote_search_suggestions\">Remote na mungkahi</string>\n    <string name=\"mark_as_watched\">Markahan bilang napanood na</string>\n    <string name=\"auto_queue_toggle\">Kusang ipila</string>\n    <string name=\"notification_action_repeat\">Ulitin</string>\n    <string name=\"notification_action_shuffle\">Halo-halo</string>\n    <string name=\"notification_colorize_summary\">Hayaan ang Android na baguhin ang kulay ng abiso depende sa pangunahing kulay ng thumbnail (paalala, hindi ito available sa lahat ng mga device)</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"ok\">Sige</string>\n    <string name=\"default_resolution_title\">Panimulang linaw</string>\n    <string name=\"notification_action_4_title\">Panlimang action button</string>\n    <string name=\"notification_colorize_title\">Kulayan ang abiso</string>\n    <string name=\"clear_queue_confirmation_title\">Kumpirmahin muna bago linisin ang pila</string>\n    <string name=\"clear_queue_confirmation_summary\">Maaaring mapalitan ang pila mo kung magpapalit ka ng player</string>\n    <string name=\"clear_queue_confirmation_description\">Papalitan ang aktibong pila sa player</string>\n    <string name=\"show_description_title\">Ipakita ang paglalarawan</string>\n    <string name=\"show_meta_info_title\">Ipakita ang meta info</string>\n    <string name=\"show_meta_info_summary\">Patayin para itago ang mga meta infobox na may karagdagang impormasyon tungkol sa creator ng stream, laman nito o ng hinanap</string>\n    <string name=\"metadata_cache_wipe_summary\">Tanggalin ang lahat ng mga naka-cache na data ng webpage</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Nalinis na ang cache ng metadata</string>\n    <string name=\"auto_queue_title\">Kusang ipila ang susunod na stream</string>\n    <string name=\"auto_queue_summary\">Ipagpatuloy na tapusin (di umuulit) ang pila sa pamamagitan ng pagdagdag ng isang katulad na stream</string>\n    <string name=\"show_search_suggestions_title\">Mga mungkahi sa paghahanap</string>\n    <string name=\"enable_search_history_summary\">Itago ang mga hinanap nang lokal</string>\n    <string name=\"enable_watch_history_title\">Kasaysayan ng napanood</string>\n    <string name=\"enable_playback_resume_title\">Ipagpatuloy ang pag-play</string>\n    <string name=\"enable_playback_resume_summary\">Pumunta sa posisyon ng huling pag-play</string>\n    <string name=\"show_next_and_similar_title\">Ipakita ang mga \\'Susunod\\' at \\'Katulad\\' na video</string>\n    <string name=\"settings_category_clear_data_title\">Linisin ang data</string>\n    <string name=\"enable_playback_state_lists_summary\">Ipakita ang pananda ng posisyon ng pag-play sa mga listahan</string>\n    <string name=\"enable_playback_state_lists_title\">Mga posisyon sa listahan</string>\n    <string name=\"enable_search_history_title\">Kasaysayan ng mga hinanap</string>\n    <string name=\"metadata_cache_wipe_title\">Linisin ang naka-cache na metadata</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Nalinis na ang image cache</string>\n    <string name=\"show_comments_summary\">Patayin para itago ang mga komento</string>\n    <string name=\"show_comments_title\">Ipakita ang mga komento</string>\n    <string name=\"black_theme_title\">Maitim</string>\n    <string name=\"show_play_with_kodi_summary\">Magpapakita ng option na i-play ang video sa Kodi media center</string>\n    <string name=\"show_higher_resolutions_title\">Ipakita ang mga mas mataas na linaw</string>\n    <string name=\"crash_the_player\">I-crash ang player</string>\n    <string name=\"popup_remember_size_pos_title\">Tandaan ang mga property ng popup</string>\n    <string name=\"default_popup_resolution_title\">Panimulang linaw ng popup</string>\n    <string name=\"show_higher_resolutions_summary\">Mape-play lang ng ilang device ang mga video na 2K/4K</string>\n    <string name=\"kore_not_found\">I-install ang nawawalang Kode app\\?</string>\n    <string name=\"notification_scale_to_square_image_title\">I-scale ang thumbnail sa 1:1 aspect ratio</string>\n    <string name=\"notification_scale_to_square_image_summary\">I-scale ang thumbnail ng video sa abiso mula 16:9 papuntang 1:1 aspect ratio (pwedeng magkaroon ng distortion)</string>\n    <string name=\"notification_action_0_title\">Unang action button</string>\n    <string name=\"notification_actions_at_most_three\">Hanggang tatlo lang ang pwedeng maipakita sa siksik na abiso!</string>\n    <string name=\"default_audio_format_title\">Panimulang audio format</string>\n    <string name=\"default_video_format_title\">Panimulang video format</string>\n    <string name=\"night_theme_title\">Madilim na Tema</string>\n    <string name=\"popup_remember_size_pos_summary\">Tandaan ang huling laki at posisyon ng popup</string>\n    <string name=\"use_inexact_seek_title\">Gamitin ang mabilis ngunit di-saktong seek</string>\n    <string name=\"seek_duration_title\">Haba ng fast forward/-rewind seek</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Ituloy ang pagpapalabas</string>\n    <string name=\"trending\">Patok Ngayon</string>\n    <string name=\"enable_watch_history_summary\">Subaybayan ang mga napanood nang video</string>\n    <string name=\"recent\">Kumakailan</string>\n    <string name=\"metadata_category\">Kategorya</string>\n    <string name=\"metadata_tags\">Mga Tag</string>\n    <string name=\"metadata_privacy\">Praybasi</string>\n    <string name=\"notifications_disabled\">Nakapatay ang Mga Notipikasyon</string>\n    <string name=\"metadata_privacy_public\">Publiko</string>\n    <string name=\"comments_tab_description\">Mga Puna</string>\n    <string name=\"msg_running\">Nagda-dawnload ang NewPipe</string>\n    <string name=\"on\">Naka-bukas</string>\n    <string name=\"app_language_title\">Wika ng App</string>\n    <string name=\"tab_about\">Tungkol dito</string>\n    <string name=\"restricted_video_no_stream\">Ang video na ito ay may paghihigpit sa edad.\n\\nDahil sa mga bagong polisiya ng Youtube, hindi maaring ma-access ng NewPipe ang mga video streams nito, kaya hindi ito maipapalabas.</string>\n    <string name=\"notification_channel_name\">Notipikasyon sa NewPipe</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s nakikinig</item>\n        <item quantity=\"other\">Mga %s nakikinig</item>\n    </plurals>\n    <string name=\"more_than_100_videos\">100+ na mga video</string>\n    <string name=\"infinite_videos\">∞ na mga video</string>\n    <string name=\"no_comments\">Walang Komento</string>\n    <string name=\"play_all\">Ipalabas Lahat</string>\n    <string name=\"notifications\">Mga Notipikasyon</string>\n    <string name=\"comments_are_disabled\">Pinagbabawal ang pagkomento</string>\n    <string name=\"settings_file_charset_title\">Mga pinahihintulutang karakter sa pangalan ng file</string>\n    <string name=\"tab_licenses\">Mga Lisensya</string>\n    <string name=\"title_activity_history\">Kasaysayan</string>\n    <string name=\"main_page_content\">Laman ng pangunahing pahina</string>\n    <string name=\"duration_live\">Live</string>\n    <string name=\"always\">Palagi</string>\n    <string name=\"delete_item_search_history\">Gusto mo bang burahin ito sa kasaysayan ng paghanap\\?</string>\n    <string name=\"content\">Laman</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d oras</item>\n        <item quantity=\"other\">mga %d oras</item>\n    </plurals>\n    <string name=\"systems_language\">Karaniwan ng Sistema</string>\n    <string name=\"private_content\">Nakapribado ang content na ito, kaya hindi ito maipalabas o mai-download ng NewPipe.</string>\n    <string name=\"download_has_started\">Sinisimulan na ang Pagdownload</string>\n    <string name=\"detail_heart_img_view_description\">Pinusuan ng creator</string>\n    <string name=\"video_detail_by\">Ni %s</string>\n    <string name=\"detail_pinned_comment_view_description\">Naka-pin na komento</string>\n    <string name=\"open_website_license\">Buksan ang website</string>\n    <string name=\"metadata_licence\">Lisensya</string>\n    <string name=\"metadata_language\">Wika</string>\n    <string name=\"metadata_privacy_private\">Pribado</string>\n    <string name=\"metadata_privacy_unlisted\">Hindi nakalista</string>\n    <string name=\"off\">Nakapatay</string>\n    <string name=\"new_and_hot\">Bago at patok</string>\n    <string name=\"content_language_title\">Panimulang wika ng content</string>\n    <string name=\"settings_category_appearance_title\">Itsura ng App</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d segundo</item>\n        <item quantity=\"other\">Mga %d segundo</item>\n    </plurals>\n    <string name=\"channel_created_by\">Nilikha ni %s</string>\n    <string name=\"chapters\">Mga Kabanata</string>\n    <string name=\"no_app_to_open_intent\">Walang app sa device mo ang makakabukas nito</string>\n    <string name=\"featured\">Tampok</string>\n    <string name=\"title_last_played\">Huling Pinanood</string>\n    <string name=\"action_history\">Kasaysayan</string>\n    <string name=\"no_one_listening\">Walang nakikinig</string>\n    <string name=\"search_no_results\">Walang nahanap</string>\n    <string name=\"switch_to_background\">Pumalit sa Likuran</string>\n    <string name=\"clear_views_history_title\">Linisin ang kasaysayan ng panonood</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s nanonood</item>\n        <item quantity=\"other\">Mga %s nanonood</item>\n    </plurals>\n    <string name=\"no_videos\">Walang mga video</string>\n    <string name=\"title_most_played\">Madalas na Pinanood</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">Mga %s na video</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuto</item>\n        <item quantity=\"other\">Mga %d minuto</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d araw</item>\n        <item quantity=\"other\">mga %d araw</item>\n    </plurals>\n    <string name=\"start_main_player_fullscreen_title\">Buksan ang pangunahing player sa fullscreen</string>\n    <string name=\"settings_category_player_notification_summary\">Itakda ang kasalukuyang notipikasyon ng playing stream</string>\n    <string name=\"downloads\">Mga download</string>\n    <string name=\"error_report_title\">Ulat sa problema</string>\n    <string name=\"channels\">Mga channel</string>\n    <string name=\"playlists\">Mga listahan ng nilalaman</string>\n    <string name=\"videos_string\">Mga bidyo</string>\n    <string name=\"events\">Mga pangyayari</string>\n    <string name=\"albums\">Mga album</string>\n    <string name=\"disabled\">Naka-disable</string>\n    <string name=\"clear\">Alisin</string>\n    <string name=\"best_resolution\">Pinakamainam na resolusyon</string>\n    <string name=\"file_deleted\">Natanggal ang file</string>\n    <string name=\"just_once\">Isang Beses Lang</string>\n    <string name=\"peertube_instance_add_https_only\">Mga HTTPS URL lang ang suportado</string>\n    <string name=\"songs\">Mga kanta</string>\n    <string name=\"autoplay_title\">Awtopaandar</string>\n    <string name=\"peertube_instance_url_help\">Mahahanap mo sa %s ang hilig mong mga instansya</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Patuloy na mag-play pagkatapos ng istorbo (hal. tawag sa telepono)</string>\n    <string name=\"download_dialog_title\">I-download</string>\n    <string name=\"start_main_player_fullscreen_summary\">Huwag buksan ang mga video sa mini player at dumiretso na sa fullscreen mode kung naka-lock ang awto rotasyon. Magagamit mo pa rin ang mini player kung aalis ka sa fullscreen</string>\n    <string name=\"show_hold_to_append_title\">Ipakita ang tip ng \\\"I-hold para ipila\\\"</string>\n    <string name=\"show_hold_to_append_summary\">Ipakita ang tip tuwing pinpindot ang background o ang buttong pumapop-up sa video na \\\"Details:\\\"</string>\n    <string name=\"unsupported_url_dialog_message\">Hindi makilala ang URL. Buksan sa ibang app\\?</string>\n    <string name=\"peertube_instance_url_title\">Mga instansya ng PeerTube</string>\n    <string name=\"restricted_video\">Ang video na ito ay may paghihigpit sa edad.\n\\n\n\\nBuksan ang \\\"%1$s\\\" sa ayos ng app kung gusto mong makita ito.</string>\n    <string name=\"peertube_instance_add_title\">Magdagdag ng mga instansya</string>\n    <string name=\"peertube_instance_add_fail\">Hindi maberipika ang instansya</string>\n    <string name=\"peertube_instance_add_exists\">Naidagdag na ang instansyang iyan</string>\n    <string name=\"settings_category_player_behavior_title\">Ugali</string>\n    <string name=\"settings_category_video_audio_title\">Bidyo at tunog</string>\n    <string name=\"settings_category_history_title\">Kasaysayan at cache</string>\n    <string name=\"settings_category_updates_title\">Mga update</string>\n    <string name=\"show_age_restricted_content_title\">Ipakita ang nilalamang hindi pambata</string>\n    <string name=\"show_age_restricted_content_summary\">Ipakita ang nilalamang maaaring makahamak sa bata dahil limitado ito sa edad (hal. 18+)</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">May \\\"Restricted Mode\\\" ang YouTube kung saan nakatago ang nilalamang hindi pambata</string>\n    <string name=\"app_update_notification_channel_name\">Notipikasyon sa pag-update ng app</string>\n    <string name=\"notification_channel_description\">Mga notipikasyon para sa player ng NewPipe</string>\n    <string name=\"artists\">Mga artista</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Gamitin ang \\\"Restricted Mode\\\" ng YouTube</string>\n    <string name=\"popup_playing_toast\">Nagpe-play sa popup mode</string>\n    <string name=\"background_player_playing_toast\">Nagpe-play sa background</string>\n    <string name=\"settings_category_player_title\">Player</string>\n    <string name=\"peertube_instance_add_help\">Ilagay ang URL ng instansya</string>\n    <string name=\"peertube_instance_url_summary\">Piliin ang iyong mga paboritong instansya ng PeerTube</string>\n    <string name=\"downloads_title\">Mga download</string>\n    <string name=\"all\">Lahat</string>\n    <string name=\"default_content_country_title\">Default na bansa ng nilalaman</string>\n    <string name=\"unsupported_url\">Di-suportadong URL</string>\n    <string name=\"settings_category_player_notification_title\">Notipikasyon ng player</string>\n    <string name=\"tracks\">Mga track</string>\n    <string name=\"users\">Mga gumagamit</string>\n    <string name=\"metadata_age_limit\">Hangganan ng Edad</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Oo, pati na rin ang mga napanood nang video</string>\n    <string name=\"auto_device_theme_title\">Kusa (tema ng device)</string>\n    <string name=\"delete_view_history_alert\">Tanggalin ang kabuuan ng watch history?</string>\n    <string name=\"no_streams_available_download\">Walang mga stream na maaaring i-download</string>\n    <string name=\"import_subscriptions_hint\">I-import o i-export ang mga subskripsyon galing sa 3-dot menu</string>\n    <string name=\"what_device_headline\">Impormasyon:</string>\n    <string name=\"sorry_string\">Paumanhin, hindi dapat iyon nangyari.</string>\n    <string name=\"error_snackbar_message\">Paumanhin, mayroon nagkamali.</string>\n    <string name=\"could_not_setup_download_menu\">Hindi maisaayos ang download menu</string>\n    <string name=\"search_history_deleted\">Ang search history ay tinanggal</string>\n    <string name=\"no_one_watching\">Walang nanonood</string>\n    <string name=\"empty_list_subtitle\">Wala dito</string>\n    <string name=\"invalid_directory\">Walang folder na ganoon</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"cancel\">Annuler</string>\n    <string name=\"default_resolution_title\">Définition par défaut</string>\n    <string name=\"did_you_mean\">Vouliez-vous dire « %1$s » \\?</string>\n    <string name=\"download\">Télécharger</string>\n    <string name=\"download_path_title\">Dossier de téléchargement vidéo</string>\n    <string name=\"download_path_dialog_title\">Choisissez le dossier de téléchargement pour les fichiers vidéos</string>\n    <string name=\"download_path_summary\">Les vidéos téléchargées sont stockées ici</string>\n    <string name=\"install\">Installer</string>\n    <string name=\"kore_not_found\">Installer l’application Kore manquante \\?</string>\n    <string name=\"no_player_found\">Aucun lecteur de flux trouvé. Installer VLC \\?</string>\n    <string name=\"open_in_browser\">Ouvrir dans un navigateur</string>\n    <string name=\"play_with_kodi_title\">Lire avec Kodi</string>\n    <string name=\"search\">Rechercher</string>\n    <string name=\"settings\">Paramètres</string>\n    <string name=\"share\">Partager</string>\n    <string name=\"share_dialog_title\">Partager avec</string>\n    <string name=\"show_play_with_kodi_summary\">Afficher une option pour lire une vidéo via Kodi</string>\n    <string name=\"show_play_with_kodi_title\">Afficher l’option « Lire avec Kodi »</string>\n    <string name=\"upload_date_text\">Publiée le %1$s</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Format audio par défaut</string>\n    <string name=\"download_dialog_title\">Télécharger</string>\n    <string name=\"show_next_and_similar_title\">Afficher les vidéos « Suivantes » et « Similaires »</string>\n    <string name=\"unsupported_url\">URL non pris en charge</string>\n    <string name=\"settings_category_video_audio_title\">Vidéo et audio</string>\n    <string name=\"detail_thumbnail_view_description\">Lecture vidéo, durée :</string>\n    <string name=\"detail_dislikes_img_view_description\">Je n’aime pas</string>\n    <string name=\"detail_likes_img_view_description\">J’aime</string>\n    <string name=\"content_language_title\">Langue du contenu par défaut</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Miniature de l’avatar du téléverseur</string>\n    <string name=\"use_external_video_player_title\">Utiliser un lecteur vidéo externe</string>\n    <string name=\"use_external_audio_player_title\">Utiliser un lecteur audio externe</string>\n    <string name=\"background_player_playing_toast\">Lecture en arrière-plan</string>\n    <string name=\"theme_title\">Thème</string>\n    <string name=\"night_theme_title\">Thème de nuit</string>\n    <string name=\"dark_theme_title\">Sombre</string>\n    <string name=\"light_theme_title\">Clair</string>\n    <string name=\"black_theme_title\">Noir</string>\n    <string name=\"settings_category_appearance_title\">Apparence</string>\n    <string name=\"network_error\">Erreur réseau</string>\n    <string name=\"download_path_audio_title\">Dossier de téléchargement audio</string>\n    <string name=\"download_path_audio_summary\">Les fichiers audios téléchargés sont stockés ici</string>\n    <string name=\"download_path_audio_dialog_title\">Choisissez le dossier de téléchargement des fichiers audios</string>\n    <string name=\"general_error\">Erreur</string>\n    <string name=\"parsing_error\">Impossible d’analyser le site web</string>\n    <string name=\"content_not_available\">Contenu indisponible</string>\n    <string name=\"error_snackbar_message\">Désolé, quelque chose s’est mal passé.</string>\n    <string name=\"content\">Contenu</string>\n    <string name=\"show_age_restricted_content_title\">Afficher le contenu avec limite d’âge</string>\n    <string name=\"duration_live\">En direct</string>\n    <string name=\"could_not_load_thumbnails\">Impossible de charger toutes les miniatures</string>\n    <string name=\"sorry_string\">Désolé, cela n’aurait pas dû se produire.</string>\n    <string name=\"error_report_button_text\">Signaler par courriel</string>\n    <string name=\"what_device_headline\">Information :</string>\n    <string name=\"what_happened_headline\">Ce qui s’est passé :</string>\n    <string name=\"your_comment\">Votre commentaire (en anglais) :</string>\n    <string name=\"error_details_headline\">Détails :</string>\n    <string name=\"video\">Vidéo</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Réessayer</string>\n    <string name=\"main_bg_subtitle\">Appuyez sur la loupe pour commencer.</string>\n    <string name=\"error_snackbar_action\">Signaler</string>\n    <string name=\"could_not_setup_download_menu\">Impossible de configurer le menu de téléchargement</string>\n    <string name=\"downloads\">Téléchargements</string>\n    <string name=\"downloads_title\">Téléchargements</string>\n    <string name=\"error_report_title\">Rapport d’erreur</string>\n    <string name=\"start\">Démarrer</string>\n    <string name=\"pause\">Mettre en pause</string>\n    <string name=\"delete\">Supprimer</string>\n    <string name=\"checksum\">Somme de contrôle</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Nom du fichier</string>\n    <string name=\"msg_threads\">Connexions simultanées</string>\n    <string name=\"msg_error\">Erreur</string>\n    <string name=\"msg_running\">NewPipe télécharge</string>\n    <string name=\"msg_running_detail\">Appuyer pour plus de détails</string>\n    <string name=\"msg_wait\">Veuillez patienter…</string>\n    <string name=\"msg_copied\">Copié dans le presse-papiers</string>\n    <string name=\"no_available_dir\">Veuillez définir ultérieurement un dossier de téléchargement dans les paramètres</string>\n    <string name=\"app_ui_crash\">L’application a planté</string>\n    <string name=\"all\">Tout</string>\n    <string name=\"title_activity_recaptcha\">Défi reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Défi reCAPTCHA demandé</string>\n    <string name=\"open_in_popup_mode\">Ouvrir en mode flottant</string>\n    <string name=\"popup_playing_toast\">Lecture en mode flottant</string>\n    <string name=\"disabled\">Désactivés</string>\n    <string name=\"info_labels\">Quoi :\\nRequest :\\nContent Language :\\nContent Country :\\nApp Language :\\nService :\\nGMT Time :\\nPackage :\\nVersion :\\nOS version :</string>\n    <string name=\"msg_popup_permission\">Cette autorisation est nécessaire pour\n\\nutiliser le mode flottant</string>\n    <string name=\"controls_background_title\">Arrière-plan</string>\n    <string name=\"controls_popup_title\">Flottant</string>\n    <string name=\"default_popup_resolution_title\">Définition par défaut de la fenêtre flottante</string>\n    <string name=\"show_higher_resolutions_title\">Afficher des définitions plus élevées</string>\n    <string name=\"show_higher_resolutions_summary\">Seuls certains appareils peuvent lire des vidéos 2K/4K</string>\n    <string name=\"default_video_format_title\">Format vidéo par défaut</string>\n    <string name=\"popup_remember_size_pos_title\">Mémoriser les propriétés de la fenêtre flottante</string>\n    <string name=\"popup_remember_size_pos_summary\">Mémoriser les dernières taille et position de la fenêtre flottante</string>\n    <string name=\"clear\">Effacer</string>\n    <string name=\"use_external_video_player_summary\">Le son peut être absent à certaines définitions</string>\n    <string name=\"show_search_suggestions_title\">Suggestions de recherche</string>\n    <string name=\"show_search_suggestions_summary\">Sélectionner les suggestions à afficher lors d’une recherche</string>\n    <string name=\"best_resolution\">Meilleure définition</string>\n    <string name=\"subscribe_button_title\">S’abonner</string>\n    <string name=\"subscribed_button_title\">Abonné</string>\n    <string name=\"channel_unsubscribed\">Désabonné de la chaîne</string>\n    <string name=\"tab_subscriptions\">Abonnements</string>\n    <string name=\"settings_category_downloads_title\">Téléchargement</string>\n    <string name=\"title_licenses\">Licences tierce partie</string>\n    <string name=\"tab_about\">À propos &amp; FAQ</string>\n    <string name=\"tab_licenses\">Licences</string>\n    <string name=\"app_description\">Lecteur multimédia libre et léger pour Android.</string>\n    <string name=\"view_on_github\">Voir sur GitHub</string>\n    <string name=\"app_license_title\">Licence de NewPipe</string>\n    <string name=\"read_full_license\">Lire la licence</string>\n    <string name=\"contribution_title\">Contribuer</string>\n    <string name=\"charset_letters_and_digits\">Lettres et chiffres</string>\n    <string name=\"title_activity_about\">À propos de NewPipe</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s par %2$s sous %3$s</string>\n    <string name=\"contribution_encouragement\">Que ce soit pour des idées de traductions, de changements de design, de nettoyage de code ou de gros changements de code, une aide est toujours la bienvenue. Plus on en fera meilleur il sera !</string>\n    <string name=\"subscription_change_failed\">Impossible de modifier l’abonnement</string>\n    <string name=\"subscription_update_failed\">Impossible d’actualiser l’abonnement</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Continuer la lecture après les interruptions (ex. : appels téléphoniques)</string>\n    <string name=\"settings_file_charset_title\">Caractères autorisés dans les noms de fichier</string>\n    <string name=\"settings_file_replacement_character_summary\">Les caractères invalides seront remplacés par cette valeur</string>\n    <string name=\"settings_file_replacement_character_title\">Caractère de remplacement</string>\n    <string name=\"enable_search_history_title\">Historique de recherche</string>\n    <string name=\"enable_search_history_summary\">Stocke l’historique de recherche sur l’appareil</string>\n    <string name=\"enable_watch_history_title\">Voir l’historique</string>\n    <string name=\"title_activity_history\">Historique</string>\n    <string name=\"action_history\">Historique</string>\n    <string name=\"notification_channel_name\">Notification NewPipe</string>\n    <string name=\"undo\">Annuler</string>\n    <string name=\"enable_watch_history_summary\">Historiser les vidéos visionnées</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Reprendre la lecture</string>\n    <string name=\"settings_category_player_title\">Lecteur</string>\n    <string name=\"settings_category_player_behavior_title\">Comportement</string>\n    <string name=\"settings_category_history_title\">Historique et cache</string>\n    <string name=\"notification_channel_description\">Notifications pour le lecteur de NewPipe</string>\n    <string name=\"search_no_results\">Aucun résultat</string>\n    <string name=\"empty_list_subtitle\">Aucun contenu</string>\n    <string name=\"no_subscribers\">Aucun abonné</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s abonné</item>\n        <item quantity=\"many\">%s abonnés</item>\n        <item quantity=\"other\">%s abonnés</item>\n    </plurals>\n    <string name=\"no_views\">Aucune vue</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s vue</item>\n        <item quantity=\"many\">%s vues</item>\n        <item quantity=\"other\">%s vues</item>\n    </plurals>\n    <string name=\"no_videos\">Aucune vidéo</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s vidéo</item>\n        <item quantity=\"many\">%s vidéos</item>\n        <item quantity=\"other\">%s vidéos</item>\n    </plurals>\n    <string name=\"charset_most_special_characters\">Caractères spéciaux</string>\n    <string name=\"delete_item_search_history\">Voulez-vous supprimer cet élément de l’historique de recherche \\?</string>\n    <string name=\"main_page_content\">Contenu de la page principale</string>\n    <string name=\"blank_page_summary\">Page blanche</string>\n    <string name=\"channel_page_summary\">Chaîne</string>\n    <string name=\"select_a_channel\">Sélectionner une chaîne</string>\n    <string name=\"trending\">Tendances</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Nouveau et populaire</string>\n    <string name=\"play_all\">Tout lire</string>\n    <string name=\"player_stream_failure\">Impossible de lire ce flux</string>\n    <string name=\"player_unrecoverable_failure\">Une erreur irrécupérable du lecteur est survenue</string>\n    <string name=\"no_channel_subscribed_yet\">Pas encore d’abonnements de chaîne</string>\n    <string name=\"play_queue_remove\">Retirer</string>\n    <string name=\"play_queue_stream_detail\">Détails</string>\n    <string name=\"play_queue_audio_settings\">Paramètres audios</string>\n    <string name=\"show_hold_to_append_title\">Afficher l\\'astuce « Maintenir pour ajouter à la file »</string>\n    <string name=\"show_hold_to_append_summary\">Affiche l’astuce lors de l’appui des boutons « Arrière-plan » ou « Flottant » sur la page de détails d’une vidéo</string>\n    <string name=\"unknown_content\">[Inconnu]</string>\n    <string name=\"player_recoverable_failure\">Récupération depuis l’erreur du lecteur</string>\n    <string name=\"kiosk_page_summary\">Kiosque</string>\n    <string name=\"select_a_kiosk\">Sélectionner un kiosque</string>\n    <string name=\"hold_to_append\">Maintenir pour ajouter à la file</string>\n    <string name=\"start_here_on_background\">Démarrer la lecture en arrière-plan</string>\n    <string name=\"start_here_on_popup\">Démarrer la lecture dans une fenêtre flottante</string>\n    <string name=\"donation_title\">Donner</string>\n    <string name=\"donation_encouragement\">NewPipe est développé par des volontaires sur leur temps libre afin de vous proposer la meilleure expérience possible. Vous pouvez leur offrir un café pour les soutenir dans leurs efforts et rendre NewPipe encore meilleur.</string>\n    <string name=\"website_title\">Site Web</string>\n    <string name=\"website_encouragement\">Visitez le site Web de NewPipe pour plus d’informations et de nouvelles.</string>\n    <string name=\"give_back\">Donner en retour</string>\n    <string name=\"default_content_country_title\">Pays du contenu par défaut</string>\n    <string name=\"switch_to_background\">Basculer en arrière-plan</string>\n    <string name=\"switch_to_popup\">Basculer en mode flottant</string>\n    <string name=\"switch_to_main\">Basculer en principal</string>\n    <string name=\"drawer_open\">Ouvrir le menu</string>\n    <string name=\"drawer_close\">Fermer le menu</string>\n    <string name=\"no_player_found_toast\">Aucun lecteur de flux trouvé (vous pouvez installer VLC pour le lire).</string>\n    <string name=\"always\">Toujours</string>\n    <string name=\"just_once\">Une seule fois</string>\n    <string name=\"external_player_unsupported_link_type\">Les lecteurs externes ne prennent pas en charge ces types de liens</string>\n    <string name=\"video_streams_empty\">Aucun flux vidéo trouvé</string>\n    <string name=\"audio_streams_empty\">Aucun flux audio trouvé</string>\n    <string name=\"video_player\">Lecteur vidéo</string>\n    <string name=\"background_player\">Lecteur en arrière-plan</string>\n    <string name=\"popup_player\">Lecteur flottant</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Obtention des infos…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Chargement du contenu demandé</string>\n    <string name=\"import_data_title\">Importer la base de données</string>\n    <string name=\"export_data_title\">Exporter la base de données</string>\n    <string name=\"import_data_summary\">Remplace votre historique actuel, vos abonnements, vos playlists et (éventuellement) vos paramètres.</string>\n    <string name=\"export_data_summary\">Historique des exportations, abonnements, playlists et paramètres</string>\n    <string name=\"export_complete_toast\">Exporté</string>\n    <string name=\"import_complete_toast\">Importé</string>\n    <string name=\"no_valid_zip_file\">Fichier ZIP non valide</string>\n    <string name=\"could_not_import_all_files\">Avertissement : impossible d’importer tous les fichiers.</string>\n    <string name=\"override_current_data\">Cela effacera vos paramètres actuels.</string>\n    <string name=\"show_info\">Afficher les informations</string>\n    <string name=\"tab_bookmarks\">Playlists enregistrées</string>\n    <string name=\"controls_add_to_playlist_title\">Ajouter à</string>\n    <string name=\"detail_drag_description\">Glisser pour réordonner</string>\n    <string name=\"create\">Créer</string>\n    <string name=\"dismiss\">Rejeter</string>\n    <string name=\"rename\">Renommer</string>\n    <string name=\"title_last_played\">Dernière lecture</string>\n    <string name=\"title_most_played\">Vidéos les plus vues</string>\n    <string name=\"always_ask_open_action\">Toujours demander</string>\n    <string name=\"create_playlist\">Nouvelle liste de lecture</string>\n    <string name=\"rename_playlist\">Renommer</string>\n    <string name=\"name\">Nom</string>\n    <string name=\"add_to_playlist\">Ajouter à la liste de lecture</string>\n    <string name=\"set_as_playlist_thumbnail\">Définir comme miniature de la liste de lecture</string>\n    <string name=\"bookmark_playlist\">Enregistrer la liste de lecture</string>\n    <string name=\"unbookmark_playlist\">Supprimer le signet</string>\n    <string name=\"delete_playlist_prompt\">Voulez-vous supprimer cette liste de lecture ?</string>\n    <string name=\"playlist_creation_success\">Liste de lecture créée</string>\n    <string name=\"playlist_add_stream_success\">Ajouté à la liste de lecture</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniature de la liste de lecture changée.</string>\n    <string name=\"caption_none\">Aucun sous-titre</string>\n    <string name=\"resize_fit\">Ajuster</string>\n    <string name=\"resize_zoom\">Zoomer</string>\n    <string name=\"use_inexact_seek_title\">Utiliser la recherche rapide approximative</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Images en cache effacées</string>\n    <string name=\"metadata_cache_wipe_title\">Effacer les métadonnées en cache</string>\n    <string name=\"metadata_cache_wipe_summary\">Efface toutes les données des pages Web en cache</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Métadonnées en cache effacées</string>\n    <string name=\"file\">Fichier</string>\n    <string name=\"invalid_directory\">Aucun dossier de ce type</string>\n    <string name=\"invalid_source\">Aucun fichier ou contenu de ce type</string>\n    <string name=\"invalid_file\">Le fichier n’existe pas ou n’est pas accessible en lecture ou en écriture</string>\n    <string name=\"file_name_empty_error\">Le nom du fichier ne peut pas être vide</string>\n    <string name=\"error_occurred_detail\">Une erreur est survenue : %1$s</string>\n    <string name=\"controls_download_desc\">Télécharger le flux</string>\n    <string name=\"auto_queue_title\">Ajout automatique du flux suivant à la file de lecture</string>\n    <string name=\"auto_queue_summary\">Continue la file de lecture (non répétitive) en ajoutant un flux lié</string>\n    <string name=\"settings_category_debug_title\">Débogage</string>\n    <string name=\"resize_fill\">Remplir</string>\n    <string name=\"caption_auto_generated\">Générés automatiquement</string>\n    <string name=\"enable_leak_canary_summary\">La surveillance des fuites de mémoire peut geler l’application durant le vidage du tas</string>\n    <string name=\"enable_disposed_exceptions_title\">Rapporter les erreurs hors cycle de vie</string>\n    <string name=\"enable_disposed_exceptions_summary\">Forcer le rapport des exceptions Rx non livrables en dehors des fragments ou activités durant le cycle de vie après traitement</string>\n    <string name=\"import_title\">Importer</string>\n    <string name=\"import_from\">Importer de</string>\n    <string name=\"export_to\">Exporter vers</string>\n    <string name=\"import_ongoing\">Importation en cours…</string>\n    <string name=\"export_ongoing\">Exportation en cours…</string>\n    <string name=\"import_file_title\">Importer le fichier</string>\n    <string name=\"previous_export\">Exportation précédente</string>\n    <string name=\"subscriptions_import_unsuccessful\">Impossible d’importer les abonnements</string>\n    <string name=\"subscriptions_export_unsuccessful\">Impossible d’exporter les abonnements</string>\n    <string name=\"import_youtube_instructions\">Importez vos abonnements YouTube depuis Google Takeout :\n\\n\n\\n1. Suivez ce lien : %1$s\n\\n2. Connectez-vous à votre compte\n\\n3. Cliquez sur « Toutes les données YouTube sont incluses », puis sur « Tout désélectionner », puis sélectionnez uniquement « abonnements » et cliquez sur « OK »\n\\n4. Cliquez sur « Étape suivante » et ensuite sur « Créer une exportation »\n\\n5. Cliquez sur le bouton « Télécharger » après qu’il soit apparut\n\\n6.Cliquez sur IMPORTER LE FICHIER en dessous et sélectionnez le fichier zip téléchargé\n\\n7. [Si l\\'importation à échoué] Extrayez le fichier .csv (généralement sous « YouTube and YouTube Music/subscriptions/subscriptions.csv »), cliquez sur IMPORTER LE FICHIER en dessous et sélectionnez le ficher csv extrait</string>\n    <string name=\"import_soundcloud_instructions\">Veuillez importer un profil SoundCloud en saisissant l’URL de votre profil ou votre identifiant.\n\\n \n\\n1. Activez le « mode bureau » dans votre navigateur Web (le site n’est pas disponible pour les appareils mobiles).\n\\n2. Suivez ce lien : %1$s.\n\\n3. Connectez-vous à votre compte.\n\\n4. Copiez le lien du profil vers lequel vous venez d’être redirigé.</string>\n    <string name=\"import_soundcloud_instructions_hint\">votre identifiant, soundcloud.com/votreidentifiant</string>\n    <string name=\"import_network_expensive_warning\">Cette opération peut charger énormément la connexion réseau.\n\\n \n\\nVoulez-vous continuer \\?</string>\n    <string name=\"playback_speed_control\">Contrôles de vitesse de lecture</string>\n    <string name=\"playback_tempo\">Cadence</string>\n    <string name=\"unhook_checkbox\">Détacher (peut causer des déformations)</string>\n    <string name=\"preferred_open_action_settings_title\">Ouvrir de préférence avec</string>\n    <string name=\"preferred_open_action_settings_summary\">Action par défaut lors de l’ouverture de contenu — %s</string>\n    <string name=\"no_streams_available_download\">Aucun flux disponible au téléchargement</string>\n    <string name=\"caption_setting_title\">Sous-titres</string>\n    <string name=\"caption_setting_description\">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</string>\n    <string name=\"playback_pitch\">Ton</string>\n    <string name=\"clear_views_history_title\">Effacer l’historique des vues</string>\n    <string name=\"clear_views_history_summary\">Supprime l’historique des flux lus et des positions de reprise de lecture</string>\n    <string name=\"delete_view_history_alert\">Voulez-vous supprimer entièrement l’historique des vues \\?</string>\n    <string name=\"watch_history_deleted\">Historique des vues supprimé</string>\n    <string name=\"clear_search_history_title\">Supprimer l’historique de recherche</string>\n    <string name=\"clear_search_history_summary\">Supprime l’historique des mots-clés de recherche</string>\n    <string name=\"delete_search_history_alert\">Voulez-vous supprimer entièrement l’historique de recherche \\?</string>\n    <string name=\"search_history_deleted\">Historique de recherche supprimé</string>\n    <string name=\"one_item_deleted\">1 élément supprimé.</string>\n    <string name=\"app_license\">NewPipe est un logiciel sous licence libre copyleft : vous pouvez l’utiliser, l’étudier, le partager, et l’améliorer comme bon vous semble. Plus précisément, vous pouvez le redistribuer ou le modifier sous les termes de la licence générale publique GNU, comme publiée par la Free Software Foundation, dans sa version 3, ou, à votre convenance, dans une quelconque version ultérieure.</string>\n    <string name=\"privacy_policy_title\">Politique de confidentialité de NewPipe</string>\n    <string name=\"read_privacy_policy\">Lire la politique de confidentialité</string>\n    <string name=\"import_settings\">Voulez-vous également importer les paramètres \\?</string>\n    <string name=\"accept\">Accepter</string>\n    <string name=\"decline\">Refuser</string>\n    <string name=\"privacy_policy_encouragement\">Le projet NewPipe prend votre vie privée très à cœur. Par conséquent, l’application n’envoie aucune donnée sans votre consentement.\n\\nLa politique de confidentialité de NewPipe explique en détail quelles données sont envoyées et stockées lorsque vous envoyez un rapport de plantage.</string>\n    <string name=\"start_accept_privacy_policy\">Afin de se conformer au Règlement Général sur la Protection des Données (RGPD), nous attirons ici votre attention sur la politique de confidentialité de NewPipe. Veuillez la lire attentivement.\n\\nVous devez l’accepter pour nous envoyer le rapport de bogue.</string>\n    <string name=\"limit_data_usage_none_description\">Aucune limite</string>\n    <string name=\"limit_mobile_data_usage_title\">Limiter la définition lors de l’utilisation des données mobiles</string>\n    <string name=\"channels\">Chaînes</string>\n    <string name=\"playlists\">Playlists</string>\n    <string name=\"tracks\">Morceaux</string>\n    <string name=\"users\">Utilisateurs</string>\n    <string name=\"skip_silence_checkbox\">Accélérer pendant les silences</string>\n    <string name=\"playback_step\">Graduation</string>\n    <string name=\"playback_reset\">Réinitialiser</string>\n    <string name=\"minimize_on_exit_title\">Minimiser lors du changement d’application</string>\n    <string name=\"minimize_on_exit_summary\">Action lors du basculement à une autre application depuis le lecteur vidéo principal — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Aucune</string>\n    <string name=\"minimize_on_exit_background_description\">Minimiser vers le lecteur en arrière-plan</string>\n    <string name=\"minimize_on_exit_popup_description\">Réduire vers le lecteur flottant</string>\n    <string name=\"unsubscribe\">Se désabonner</string>\n    <string name=\"tab_choose\">Sélectionner un onglet</string>\n    <string name=\"settings_category_updates_title\">Mises à jour</string>\n    <string name=\"file_deleted\">Fichier supprimé</string>\n    <string name=\"app_update_notification_channel_name\">Notification de mise à jour de l’application</string>\n    <string name=\"app_update_notification_channel_description\">Notifications pour des nouvelles versions de NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Stockage externe indisponible</string>\n    <string name=\"restore_defaults\">Restaurer les valeurs par défaut</string>\n    <string name=\"restore_defaults_confirmation\">Voulez-vous restaurer les valeurs par défaut \\?</string>\n    <string name=\"subscribers_count_not_available\">Compteur du nombre d’abonnés indisponible</string>\n    <string name=\"stop\">Arrêter</string>\n    <string name=\"events\">Évènements</string>\n    <string name=\"download_to_sdcard_error_message\">Impossible de télécharger dans la carte mémoire externe. Voulez-vous réinitialiser l’emplacement du dossier de téléchargement \\?</string>\n    <string name=\"main_page_content_summary\">Choisir quels onglets seront visibles sur la page principale</string>\n    <string name=\"updates_setting_title\">Mises à jour</string>\n    <string name=\"updates_setting_description\">Afficher une notification pour proposer une mise à jour de l’application lorsqu’une nouvelle version est disponible</string>\n    <string name=\"list\">Liste</string>\n    <string name=\"grid\">Grille</string>\n    <string name=\"auto\">Auto</string>\n    <string name=\"app_update_available_notification_title\">Une mise à jour de NewPipe est disponible !</string>\n    <string name=\"missions_header_finished\">Terminé</string>\n    <string name=\"missions_header_pending\">En attente</string>\n    <string name=\"paused\">en pause</string>\n    <string name=\"download_failed\">Téléchargement échoué</string>\n    <string name=\"error_timeout\">Délai de connexion expiré</string>\n    <string name=\"conferences\">Conférences</string>\n    <string name=\"queued\">ajouté à la liste de lecture</string>\n    <string name=\"generate_unique_name\">Générer un nom unique</string>\n    <string name=\"overwrite\">Écraser</string>\n    <string name=\"overwrite_unrelated_warning\">Un fichier avec ce nom existe déjà</string>\n    <string name=\"overwrite_finished_warning\">Un fichier téléchargé avec ce nom existe déjà</string>\n    <string name=\"download_already_running\">Il y a un téléchargement en cours avec ce nom</string>\n    <string name=\"show_error\">Afficher l’erreur</string>\n    <string name=\"error_path_creation\">Le dossier de destination ne peut pas être créé</string>\n    <string name=\"error_file_creation\">Le fichier ne peut pas être créé</string>\n    <string name=\"error_ssl_exception\">Impossible d’établir une connexion sécurisée</string>\n    <string name=\"error_unknown_host\">Impossible de trouver le serveur</string>\n    <string name=\"error_connect_host\">Impossible de se connecter au serveur</string>\n    <string name=\"error_http_no_content\">Le serveur n’envoie pas de données</string>\n    <string name=\"error_http_not_found\">Introuvable</string>\n    <string name=\"pause_downloads_on_mobile\">Interrompre sur les connexions limitées</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Utile lors du basculement aux données mobiles, bien que certains téléchargements ne peuvent pas être suspendus</string>\n    <string name=\"list_view_mode\">Mode de vue en liste</string>\n    <string name=\"post_processing\">post-traitement</string>\n    <string name=\"enqueue\">Ajouter à la file</string>\n    <string name=\"permission_denied\">Action refusée par le système</string>\n    <string name=\"error_postprocessing_failed\">Le post-traitement a échoué</string>\n    <string name=\"max_retry_msg\">Nombre d’essais maximum</string>\n    <string name=\"max_retry_desc\">Nombre d’essais maximum avant annulation du téléchargement</string>\n    <string name=\"saved_tabs_invalid_json\">Impossible de lire les onglets enregistrés ; utilisation des onglets par défaut</string>\n    <string name=\"error_http_unsupported_range\">Le serveur n’accepte pas les téléchargements multifils, veuillez réessayer avec @string/msg_threads = 1</string>\n    <string name=\"show_comments_title\">Afficher les commentaires</string>\n    <string name=\"show_comments_summary\">Désactiver pour masquer les commentaires</string>\n    <string name=\"autoplay_title\">Lecture automatique</string>\n    <string name=\"no_comments\">Aucun commentaire</string>\n    <string name=\"error_unable_to_load_comments\">Impossible de charger les commentaires</string>\n    <string name=\"close\">Fermer</string>\n    <string name=\"enable_playback_resume_title\">Reprendre la lecture</string>\n    <string name=\"settings_category_clear_data_title\">Effacer les données</string>\n    <string name=\"missing_file\">Fichier déplacé ou supprimé</string>\n    <string name=\"overwrite_failed\">impossible d’écraser le fichier</string>\n    <string name=\"download_already_pending\">Il y a un téléchargement en attente avec ce nom</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe a été fermé alors qu’il travaillait sur le fichier</string>\n    <string name=\"error_insufficient_storage_left\">Aucun espace disponible sur l’appareil</string>\n    <string name=\"error_progress_lost\">Progression perdue car le fichier a été supprimé</string>\n    <string name=\"confirm_prompt\">Voulez-vous effacer l’historique de téléchargement ou supprimer tous les fichiers téléchargés \\?</string>\n    <string name=\"enable_queue_limit\">Limiter la file d’attente de téléchargement</string>\n    <string name=\"enable_queue_limit_desc\">Un seul téléchargement aura lieu en même temps</string>\n    <string name=\"start_downloads\">Démarrer les téléchargements</string>\n    <string name=\"pause_downloads\">Mettre les téléchargements en pause</string>\n    <string name=\"downloads_storage_ask_title\">Demander où télécharger</string>\n    <string name=\"downloads_storage_ask_summary\">Vous allez être interrogé·e sur l’emplacement d’enregistrement de chaque téléchargement.\n\\nAutorisez le sélecteur de dossier système si vous voulez télécharger vers une carte SD externe</string>\n    <string name=\"enable_playback_resume_summary\">Reprend la lecture à la dernière position</string>\n    <string name=\"enable_playback_state_lists_title\">Positions dans les listes</string>\n    <string name=\"enable_playback_state_lists_summary\">Afficher les indicateurs de position de lecture dans les listes</string>\n    <string name=\"watch_history_states_deleted\">Positions de reprise de lecture supprimées</string>\n    <string name=\"downloads_storage_use_saf_title\">Utiliser le sélecteur de dossier système</string>\n    <string name=\"downloads_storage_use_saf_summary\">L’« Infrastructure d’accès au stockage » permet le téléchargement sur une carte mémoire SD externe</string>\n    <string name=\"clear_playback_states_title\">Supprimer les positions de reprise de lecture</string>\n    <string name=\"clear_playback_states_summary\">Supprime toutes les positions de reprise de lecture</string>\n    <string name=\"delete_playback_states_alert\">Voulez-vous supprimer toutes les positions de reprise de lecture \\?</string>\n    <string name=\"drawer_header_description\">Basculer le service, actuellement sélectionné :</string>\n    <string name=\"default_kiosk_page_summary\">Kiosque par défaut</string>\n    <string name=\"no_one_watching\">Personne ne regarde</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s spectateur</item>\n        <item quantity=\"many\">%s spectateurs</item>\n        <item quantity=\"other\">%s spectateurs</item>\n    </plurals>\n    <string name=\"no_one_listening\">Personne n’écoute</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s auditeur</item>\n        <item quantity=\"many\">%s auditeurs</item>\n        <item quantity=\"other\">%s auditeurs</item>\n    </plurals>\n    <string name=\"seek_duration_title\">Durée de l’avance et retour rapide</string>\n    <string name=\"peertube_instance_url_title\">Instances PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Veuillez choisir vos instances PeerTube préférées</string>\n    <string name=\"peertube_instance_url_help\">Trouvez les instances que vous aimez sur %s</string>\n    <string name=\"peertube_instance_add_title\">Ajouter une instance</string>\n    <string name=\"peertube_instance_add_help\">Veuillez saisir l’URL de l’instance</string>\n    <string name=\"peertube_instance_add_fail\">Impossible de valider l’instance</string>\n    <string name=\"peertube_instance_add_https_only\">Seules les URL en HTTPS sont prises en charge</string>\n    <string name=\"peertube_instance_add_exists\">L’instance existe déjà</string>\n    <string name=\"local\">Local</string>\n    <string name=\"recently_added\">Ajoutées récemment</string>\n    <string name=\"most_liked\">Les plus aimées</string>\n    <string name=\"recovering\">récupération</string>\n    <string name=\"error_download_resource_gone\">Impossible de récupérer ce téléchargement</string>\n    <string name=\"choose_instance_prompt\">Veuillez choisir une instance</string>\n    <string name=\"playlist_no_uploader\">Généré automatiquement (pas de téléverseur trouvé)</string>\n    <string name=\"clear_download_history\">Effacer l’historique de téléchargement</string>\n    <string name=\"delete_downloaded_files\">Supprimer les fichiers téléchargés</string>\n    <string name=\"permission_display_over_apps\">Autoriser l’affichage au-dessus d’autres applications</string>\n    <string name=\"app_language_title\">Langue de l’application</string>\n    <string name=\"systems_language\">Prédéfini par le système</string>\n    <string name=\"subtitle_activity_recaptcha\">Appuyez sur « Terminé » une fois résolu</string>\n    <string name=\"done\">Terminé</string>\n    <string name=\"videos_string\">Vidéos</string>\n    <string name=\"new_seek_duration_toast\">En raison des contraintes d’ExoPlayer, le pas de déplacement a été réglée à %d secondes</string>\n    <string name=\"mute\">Couper le son</string>\n    <string name=\"unmute\">Remettre le son</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d seconde</item>\n        <item quantity=\"many\">%d secondes</item>\n        <item quantity=\"other\">%d secondes</item>\n    </plurals>\n    <!-- Time duration plurals -->\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minute</item>\n        <item quantity=\"many\">%d minutes</item>\n        <item quantity=\"other\">%d minutes</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d heure</item>\n        <item quantity=\"many\">%d heures</item>\n        <item quantity=\"other\">%d heures</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d jour</item>\n        <item quantity=\"many\">%d jours</item>\n        <item quantity=\"other\">%d jours</item>\n    </plurals>\n    <!-- feed -->\n    <string name=\"fragment_feed_title\">Nouveautés</string>\n    <string name=\"feed_groups_header_title\">Groupes de chaînes</string>\n    <string name=\"feed_oldest_subscription_update\">Dernière mise à jour du flux : %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Pas chargés : %d</string>\n    <string name=\"feed_notification_loading\">Chargement du flux…</string>\n    <string name=\"feed_processing_message\">Traitement du flux…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Choisir les abonnements</string>\n    <string name=\"feed_group_dialog_empty_selection\">Aucun abonnement sélectionné</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d sélectionné</item>\n        <item quantity=\"many\">%d sélectionnés</item>\n        <item quantity=\"other\">%d sélectionnés</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">Nom de groupe vide</string>\n    <string name=\"feed_group_dialog_delete_message\">Voulez-vous supprimer ce groupe \\?</string>\n    <string name=\"feed_create_new_group_button_title\">Nouveau</string>\n    <string name=\"settings_category_feed_title\">Flux</string>\n    <string name=\"feed_update_threshold_title\">Seuil de mise à jour du flux</string>\n    <string name=\"feed_update_threshold_summary\">Temps depuis la dernière mise à jour pour que le flux ne soit plus considéré comme à jour — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Toujours mettre à jour</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Récupérer depuis un flux dédié lorsque disponible</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Disponible dans certains services, c’est généralement beaucoup plus rapide mais cela peut renvoyer un nombre limité d’éléments et souvent avec des informations incomplètes (p. ex. aucune durée, de type d’élément ou de statut en direct)</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Activer le mode rapide</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Désactiver le mode rapide</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Pensez-vous que le chargement du flux est trop lent \\? Si c’est le cas, essayez le chargement rapide (vous pouvez le modifier dans les paramètres ou en pressant le bouton ci-dessous).\n\\n\n\\nNewPipe propose deux stratégies de chargement de flux :\n\\n• Récupérer la totalité de la chaîne d’abonnement, ce qui est lent mais complet.\n\\n• Utiliser un service dédié, ce qui est rapide mais souvent incomplet.\n\\n\n\\nLa différence entre les deux est que la méthode rapide manque souvent de quelques informations, comme la durée d’un élément ou le type (pas de distinction possible entre les vidéos en direct et les autres), et elle pourrait retourner moins d’éléments.\n\\n\n\\nYouTube est un exemple de service qui offre une méthode rapide avec son flux RSS.\n\\n\n\\nDonc le choix se résume à ce que vous préférez : la rapidité ou des informations précises.</string>\n    <string name=\"content_not_supported\">Ce contenu n’est pas encore pris en charge par NewPipe.\n\\n\n\\nNous espérons qu’il le sera dans une future version.</string>\n    <string name=\"albums\">Albums</string>\n    <string name=\"infinite_videos\">∞ vidéos</string>\n    <string name=\"more_than_100_videos\">100+ vidéos</string>\n    <string name=\"artists\">Artistes</string>\n    <string name=\"songs\">Chansons</string>\n    <string name=\"restricted_video\">Cette vidéo dispose d’une limite d’âge.\n\\n\n\\nActivez « %1$s » dans les paramètres si vous voulez la voir.</string>\n    <string name=\"remove_watched\">Supprimer les vidéos visionnées</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Oui ainsi que les vidéos partiellement visionnées</string>\n    <string name=\"remove_watched_popup_warning\">Les flux visionnés avant et après leur ajout à la playlist seront supprimés.\\nÊtes-vous sûr ?</string>\n    <string name=\"remove_watched_popup_title\">Supprimer les flux visionnés ?</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Miniature de l\\'avatar de la chaine</string>\n    <string name=\"video_detail_by\">De %s</string>\n    <string name=\"channel_created_by\">Créé par %s</string>\n    <string name=\"show_original_time_ago_summary\">Les textes originaux des services vont être visibles dans les items</string>\n    <string name=\"show_original_time_ago_title\">Afficher la date originelle sur les items</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Activer le « Mode restreint » de YouTube</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Afficher uniquement les abonnements non groupés</string>\n    <string name=\"playlist_page_summary\">Page des playlists</string>\n    <string name=\"no_playlist_bookmarked_yet\">Aucune liste de lecture encore enregistrée</string>\n    <string name=\"select_a_playlist\">Sélectionner une liste de lecture</string>\n    <string name=\"error_report_open_github_notice\">Veuillez vérifier si un ticket concernant votre problème existe déjà. Lorsque vous créez des tickets dupliqués, cela nous prend du temps que nous pourrions passer à résoudre effectivement le problème.</string>\n    <string name=\"error_report_open_issue_button_text\">Signaler sur GitHub</string>\n    <string name=\"copy_for_github\">Copier le rapport formaté</string>\n    <string name=\"search_showing_result_for\">Affichage des résultats pour : %s</string>\n    <string name=\"clear_queue_confirmation_summary\">Basculer d’un lecteur à un autre peut remplacer votre file de lecture</string>\n    <string name=\"never\">Jamais</string>\n    <string name=\"wifi_only\">Uniquement en Wi-Fi</string>\n    <string name=\"autoplay_summary\">Démarrer la lecture automatiquement — %s</string>\n    <string name=\"title_activity_play_queue\">File de lecture</string>\n    <string name=\"unsupported_url_dialog_message\">Impossible de reconnaitre l’URL fournie. Voulez-vous l’ouvrir avec une autre application \\?</string>\n    <string name=\"auto_queue_toggle\">Ajout auto. à la file</string>\n    <string name=\"clear_queue_confirmation_description\">La file de lecture du lecteur actif sera remplacée</string>\n    <string name=\"clear_queue_confirmation_title\">Confirmer avant de supprimer une file de lecture</string>\n    <string name=\"notification_action_nothing\">Rien</string>\n    <string name=\"notification_action_buffering\">Chargement</string>\n    <string name=\"notification_action_shuffle\">Lire aléatoirement</string>\n    <string name=\"notification_action_repeat\">Répéter</string>\n    <string name=\"notification_actions_at_most_three\">Vous pouvez sélectionner au maximum trois actions à faire figurer dans la notification compacte !</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_action_4_title\">Cinquième bouton d’action</string>\n    <string name=\"notification_action_3_title\">Quatrième bouton d’action</string>\n    <string name=\"notification_action_2_title\">Troisième bouton d’action</string>\n    <string name=\"notification_action_1_title\">Deuxième bouton d’action</string>\n    <string name=\"notification_action_0_title\">Premier bouton d’action</string>\n    <string name=\"notification_scale_to_square_image_summary\">Recadrer la miniature de la vidéo affichée dans la notification du format 16:9 au format 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Recadrer la miniature au format 1:1</string>\n    <string name=\"show_memory_leaks\">Afficher les fuites de mémoire</string>\n    <string name=\"enqueued\">Ajouté à la file</string>\n    <string name=\"enqueue_stream\">Ajouter à la file</string>\n    <string name=\"clear_cookie_summary\">Effacer les cookies que NewPipe garde lorsque vous résolvez un reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Les cookies reCAPTCHA ont été effacés</string>\n    <string name=\"clear_cookie_title\">Effacer les cookies reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube dispose d’un « Mode restreint » qui cache le contenu potentiellement inapproprié</string>\n    <string name=\"show_age_restricted_content_summary\">Affiche du contenu probablement inapproprié pour les enfants</string>\n    <string name=\"notification_colorize_title\">Coloriser la notification</string>\n    <string name=\"notification_colorize_summary\">Demander à Android de personnaliser la couleur de la notification en fonction de la couleur principale de la miniature (noter que cela n’est pas disponible sur tous les appareils)</string>\n    <string name=\"show_thumbnail_title\">Afficher la miniature</string>\n    <string name=\"show_thumbnail_summary\">Utiliser la miniature pour l\\'arrière-plan de l’écran de verrouillage et les notifications</string>\n    <string name=\"open_with\">Ouvrir avec</string>\n    <string name=\"recent\">Récent</string>\n    <string name=\"msg_calculating_hash\">Calcul du hachage</string>\n    <string name=\"hash_channel_description\">Notifications pour la progression du hachage vidéo</string>\n    <string name=\"hash_channel_name\">Notification de hachage vidéo</string>\n    <string name=\"show_meta_info_summary\">Désactivez cette option pour masquer les zones de méta-informations contenant des informations supplémentaires sur le créateur du flux, le contenu du flux ou une demande de recherche</string>\n    <string name=\"show_meta_info_title\">Afficher les méta-infos</string>\n    <string name=\"no_app_to_open_intent\">Aucune application sur votre appareil ne peut ouvrir ceci</string>\n    <string name=\"chapters\">Chapitres</string>\n    <string name=\"description_tab_description\">Description</string>\n    <string name=\"related_items_tab_description\">Flux associés</string>\n    <string name=\"comments_tab_description\">Commentaires</string>\n    <string name=\"show_description_summary\">Désactiver pour masquer la description de la vidéo et les informations supplémentaires</string>\n    <string name=\"show_description_title\">Afficher la description</string>\n    <string name=\"crash_the_app\">Planter l’application</string>\n    <string name=\"georestricted_content\">Ce contenu n’est pas disponible dans votre pays.</string>\n    <string name=\"paid_content\">Ce contenu est uniquement disponible pour les utilisateurs qui ont payé, il ne peut donc pas être diffusé en continu ni téléchargé par NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Cette vidéo n’est disponible que pour les membres de YouTube Music Premium, elle ne peut donc pas être diffusée en continu ni téléchargée par NewPipe.</string>\n    <string name=\"private_content\">Ce contenu est privé, il ne peut donc pas être diffusé en continu ni téléchargé par NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Ceci est une piste SoundCloud Go+, au moins dans votre pays, elle ne peut donc pas être diffusée ou téléchargée par NewPipe.</string>\n    <string name=\"restricted_video_no_stream\">Cette vidéo est soumise à une limite d’âge.\n\\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.</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"featured\">Présentés</string>\n    <string name=\"recaptcha_solve\">Résoudre</string>\n    <string name=\"auto_device_theme_title\">Automatique (thème de l’appareil)</string>\n    <string name=\"night_theme_summary\">Sélectionne votre thème de nuit favori — %s</string>\n    <string name=\"select_night_theme_toast\">Vous pouvez sélectionner votre thème de nuit favori ci-dessous</string>\n    <string name=\"download_has_started\">Le téléchargement a démarré</string>\n    <string name=\"show_channel_details\">Afficher les détails de la chaîne</string>\n    <string name=\"disable_media_tunneling_summary\">Désactivez la tunnelisation multimédia si vous constatez un écran noir ou un bégaiement lors de la lecture d’une vidéo.</string>\n    <string name=\"disable_media_tunneling_title\">Désactiver la tunnelisation média</string>\n    <string name=\"description_select_disable\">Désactiver la sélection de texte dans la description</string>\n    <string name=\"description_select_enable\">Permettre la sélection de texte dans la description</string>\n    <string name=\"metadata_privacy_internal\">Interne</string>\n    <string name=\"metadata_privacy_private\">Privé</string>\n    <string name=\"metadata_privacy_unlisted\">Non répertorié</string>\n    <string name=\"metadata_privacy_public\">Public</string>\n    <string name=\"metadata_host\">Hôte</string>\n    <string name=\"metadata_support\">Support</string>\n    <string name=\"metadata_language\">Langue</string>\n    <string name=\"metadata_age_limit\">Limite d’âge</string>\n    <string name=\"metadata_privacy\">Confidentialité</string>\n    <string name=\"metadata_licence\">Licence</string>\n    <string name=\"metadata_tags\">Étiquettes</string>\n    <string name=\"metadata_category\">Catégorie</string>\n    <string name=\"description_select_note\">Vous pouvez maintenant sélectionner du texte à l’intérieur de la description. Notez que la page peut scintiller et que les liens peuvent ne pas être cliquables en mode sélection.</string>\n    <string name=\"no_dir_yet\">Aucun dossier de téléchargement n’est défini pour le moment, sélectionnez le dossier de téléchargement par défaut</string>\n    <string name=\"open_website_license\">Ouvrir le site web</string>\n    <string name=\"account_terminated\">Compte résilié</string>\n    <string name=\"feed_load_error_account_info\">Impossible de charger le flux \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Erreur lors du chargement du flux</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Il vous sera demandé où enregistrer chaque téléchargement</string>\n    <string name=\"off\">Inactif</string>\n    <string name=\"on\">Actif</string>\n    <string name=\"tablet_mode_title\">Mode tablette</string>\n    <string name=\"feed_load_error_terminated\">Le compte de l’auteur a été résilié.\n\\nNewPipe ne sera plus en mesure de charger ce flux à l’avenir.\n\\nSouhaitez-vous vous désabonner de cette chaîne \\?</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">À partir d’Android 10, seule « l’Infrastructure d’accès au stockage  » est prise en charge</string>\n    <string name=\"feed_load_error_fast_unknown\">Le mode flux rapide ne fournit pas plus d’info à ce sujet.</string>\n    <string name=\"comments_are_disabled\">Les commentaires sont désactivés</string>\n    <string name=\"dont_show\">Ne pas afficher</string>\n    <string name=\"low_quality_smaller\">Faible qualité (plus petit)</string>\n    <string name=\"high_quality_larger\">Haute qualité (plus grand)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Prévisualisation de la barre de progression sur la miniature</string>\n    <string name=\"mark_as_watched\">Marquer comme visionné</string>\n    <string name=\"detail_heart_img_view_description\">Apprécié par le créateur</string>\n    <string name=\"remote_search_suggestions\">Suggestions de recherche distante</string>\n    <string name=\"local_search_suggestions\">Suggestions de recherche locale</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s téléchargement supprimé</item>\n        <item quantity=\"many\">%1$s téléchargements supprimés</item>\n        <item quantity=\"other\">%1$s téléchargements supprimés</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Téléchargement terminé</item>\n        <item quantity=\"many\">%s téléchargements terminés</item>\n        <item quantity=\"other\">%s téléchargements terminés</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Balayez un élément pour le supprimer</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"start_main_player_fullscreen_title\">Lancer le lecteur principal en plein écran</string>\n    <string name=\"enqueue_next_stream\">Placer en suivant dans la file</string>\n    <string name=\"enqueued_next\">Placé en suivant dans la file</string>\n    <string name=\"processing_may_take_a_moment\">Traitement en cours… Veuillez patienter</string>\n    <string name=\"manual_update_description\">Vérifier manuellement de nouvelles versions</string>\n    <string name=\"checking_updates_toast\">Vérification des mises à jour…</string>\n    <string name=\"check_for_updates\">Vérifier les mises à jour</string>\n    <string name=\"feed_new_items\">Nouveaux éléments du flux</string>\n    <string name=\"crash_the_player\">Faire planter le lecteur</string>\n    <string name=\"show_crash_the_player_title\">Afficher « Faire planter le lecteur »</string>\n    <string name=\"show_crash_the_player_summary\">Montrer une option de plantage lors de l\\'utilisation du lecteur</string>\n    <string name=\"error_report_channel_name\">Notification de rapport d\\'erreur</string>\n    <string name=\"error_report_channel_description\">Notifications pour signaler les erreurs</string>\n    <string name=\"error_report_notification_title\">NewPipe a rencontré une erreur, appuyez pour la signaler</string>\n    <string name=\"error_report_notification_toast\">Une erreur s\\'est produite, voir la notification</string>\n    <string name=\"create_error_notification\">Créer une notification d\\'erreur</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Aucun gestionnaire de fichiers approprié n\\'a été trouvé pour cette action.\n\\nVeuillez installer un gestionnaire de fichiers compatible avec l\\'Infrastructure d\\'accès au stockage</string>\n    <string name=\"show_error_snackbar\">Afficher une barre d’erreur</string>\n    <string name=\"no_appropriate_file_manager_message\">Aucun gestionnaire de fichiers approprié n\\'a été trouvé pour cette action.\n\\nVeuillez installer un gestionnaire de fichiers ou essayez de désactiver « %s » dans les paramètres de téléchargement</string>\n    <string name=\"detail_pinned_comment_view_description\">Commentaire épinglé</string>\n    <string name=\"leak_canary_not_available\">LeakCanary n\\'est pas disponible</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Valeur par défaut d’ExoPlayer</string>\n    <string name=\"streams_notification_channel_name\">Nouveaux flux</string>\n    <string name=\"settings_category_player_notification_summary\">Configurer la notification du flux en cours de lecture</string>\n    <string name=\"get_notified\">Recevoir des notifications</string>\n    <string name=\"loading_stream_details\">Chargement des détails du flux…</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nouveau flux</item>\n        <item quantity=\"many\">%s nouveaux flux</item>\n        <item quantity=\"other\">%s nouveaux flux</item>\n    </plurals>\n    <string name=\"streams_notifications_network_title\">Connexion réseau requise</string>\n    <string name=\"notifications\">Notifications</string>\n    <string name=\"notifications_disabled\">Notifications désactivées</string>\n    <string name=\"you_successfully_subscribed\">Vous vous êtes maintenant abonné à cette chaîne</string>\n    <string name=\"settings_category_player_notification_title\">Notification du Lecteur</string>\n    <string name=\"streams_notification_channel_description\">Notifications pour de nouveaux flux des abonnements</string>\n    <string name=\"delete_downloaded_files_confirm\">Supprimer tous les fichiers téléchargés du disque \\?</string>\n    <string name=\"check_new_streams\">Exécuter la vérification de nouveaux flux</string>\n    <string name=\"enable_streams_notifications_title\">Notifications pour de nouveaux flux</string>\n    <string name=\"any_network\">N\\'importe quel réseau</string>\n    <string name=\"streams_notifications_interval_title\">Fréquence de vérification</string>\n    <string name=\"enable_streams_notifications_summary\">Notifications pour de nouveaux flux des abonnements</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Tout basculer</string>\n    <string name=\"percent\">Pourcent</string>\n    <string name=\"semitone\">Demi-ton</string>\n    <string name=\"streams_not_yet_supported_removed\">Les flux qui ne sont pas encore pris en charge ne sont pas montrés</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Aucun flux audio n’est disponible pour les lecteurs externes</string>\n    <string name=\"select_quality_external_players\">Sélectionner la qualité pour les lecteurs externes</string>\n    <string name=\"unknown_format\">Format inconnu</string>\n    <string name=\"unknown_quality\">Qualité inconnue</string>\n    <string name=\"selected_stream_external_player_not_supported\">Le flux sélectionné n’est pas pris en charge par les lecteurs externes</string>\n    <string name=\"no_video_streams_available_for_external_players\">Aucun flux vidéo n’est disponible pour les lecteurs externes</string>\n    <string name=\"progressive_load_interval_title\">Taille de l\\'intervalle de chargement de la lecture</string>\n    <string name=\"faq_title\">Foire aux questions</string>\n    <string name=\"faq\">Voir sur le site web</string>\n    <string name=\"faq_description\">Si vous avez des difficultés à utiliser l\\'application, consultez les réponses aux questions les plus fréquentes !</string>\n    <string name=\"sort\">Trier</string>\n    <string name=\"fast_mode\">Mode rapide</string>\n    <string name=\"import_subscriptions_hint\">Importer ou exporter des abonnements à partir du menu</string>\n    <string name=\"app_update_unavailable_toast\">Vous utilisez la dernière version de NewPipe</string>\n    <string name=\"app_update_available_notification_text\">Appuyez pour télécharger %s</string>\n    <string name=\"msg_failed_to_copy\">Échec de la copie dans le presse-papiers</string>\n    <string name=\"night_theme_available\">Cette option est disponible seulement si %s est sélectionné pour le thème</string>\n    <string name=\"duplicate_in_playlist\">Les playlists grisées contiennent déjà cet élément.</string>\n    <string name=\"card\">Carte</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Utile si, par exemple, vous utilisez un casque avec des boutons dysfonctionnels</string>\n    <string name=\"remove_duplicates\">Effacer les doublons</string>\n    <string name=\"remove_duplicates_title\">Effacer les doublons \\?</string>\n    <string name=\"remove_duplicates_message\">Voulez-vous retirer tous les doublons de cette liste \\?</string>\n    <string name=\"feed_hide_streams_title\">Afficher les flux suivants</string>\n    <string name=\"feed_show_watched\">Entièrement vu</string>\n    <string name=\"feed_show_partially_watched\">Partiellement vu</string>\n    <string name=\"feed_show_upcoming\">À venir</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorer les évènements des boutons média physiques</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Doublon ajouté %d fois</string>\n    <string name=\"feed_show_hide_streams\">Afficher/Cacher les flux</string>\n    <string name=\"unset_playlist_thumbnail\">Enlever la miniature permanente</string>\n    <string name=\"left_gesture_control_summary\">Choisir le geste pour la moitié gauche de l’écran du lecteur</string>\n    <string name=\"left_gesture_control_title\">Action du geste vers la gauche</string>\n    <string name=\"right_gesture_control_summary\">Choisir le geste pour la moitié droite de l’écran du lecteur</string>\n    <string name=\"volume\">Volume</string>\n    <string name=\"none\">Aucune</string>\n    <string name=\"right_gesture_control_title\">Action du geste vers la droite</string>\n    <string name=\"brightness\">Luminosité</string>\n    <string name=\"progressive_load_interval_summary\">Modifie la taille de l\\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos</string>\n    <string name=\"prefer_original_audio_title\">Préférence pour l\\'audio original</string>\n    <string name=\"prefer_original_audio_summary\">Sélectionner la piste audio originale quelle que soit la langue</string>\n    <string name=\"prefer_descriptive_audio_title\">Préférer l\\'audio descriptif</string>\n    <string name=\"play_queue_audio_track\">Audio : %s</string>\n    <string name=\"audio_track\">Piste audio</string>\n    <string name=\"audio_track_present_in_video\">Une piste audio doit déjà être présente dans ce flux</string>\n    <string name=\"unknown_audio_track\">Inconnue</string>\n    <string name=\"settings_category_exoplayer_title\">Paramètres d’ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">Gérez certains paramètres d\\'ExoPlayer. Ces modifications nécessitent un redémarrage du lecteur pour être prises en compte</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Utiliser la fonctionnalité de repli du décodeur d\\'ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Toujours utiliser la solution de contournement de définition de surface de sortie vidéo d\\'ExoPlayer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"audio_track_type_dubbed\">doublée</string>\n    <string name=\"audio_track_type_descriptive\">descriptif</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\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</string>\n    <string name=\"prefer_descriptive_audio_summary\">Sélectionner une piste audio avec des descriptions pour les personnes malvoyantes si disponible</string>\n    <string name=\"select_audio_track_external_players\">Sélectionner la piste audio pour les lecteurs externes</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"main_tabs_position_summary\">Déplacer le sélecteur d\\'onglet principal en bas</string>\n    <string name=\"main_tabs_position_title\">Position des onglets principaux</string>\n    <string name=\"disable_media_tunneling_automatic_info\">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.</string>\n    <string name=\"no_streams\">Aucun flux</string>\n    <string name=\"no_live_streams\">Aucun direct</string>\n    <string name=\"image_quality_title\">Qualité de l’image</string>\n    <string name=\"channel_tab_videos\">Vidéos</string>\n    <string name=\"show_channel_tabs\">Onglets de chaîne</string>\n    <string name=\"loading_metadata_title\">Chargement des métadonnées …</string>\n    <string name=\"image_quality_low\">Basse qualité</string>\n    <string name=\"metadata_avatars\">Avatars</string>\n    <string name=\"next_stream\">Flux suivant</string>\n    <string name=\"image_quality_none\">Ne pas charger d’images</string>\n    <string name=\"image_quality_high\">Haute qualité</string>\n    <string name=\"channel_tab_about\">À propos</string>\n    <string name=\"channel_tab_albums\">Albums</string>\n    <string name=\"image_quality_medium\">Qualité moyenne</string>\n    <string name=\"metadata_banners\">Bannières</string>\n    <string name=\"channel_tab_playlists\">Playlists</string>\n    <string name=\"more_options\">Plus d’options</string>\n    <string name=\"metadata_thumbnails\">Miniatures</string>\n    <string name=\"channel_tab_tracks\">Pistes</string>\n    <string name=\"duration\">Durée</string>\n    <string name=\"channel_tab_channels\">Chaînes</string>\n    <string name=\"previous_stream\">Flux précédent</string>\n    <string name=\"channel_tab_livestreams\">Direct</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Abonnés</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"feed_fetch_channel_tabs\">Onglets de chaîne à récupérer</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">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.</string>\n    <string name=\"share_playlist_with_list\">Partager une liste d\\'URLs</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">Partager la liste de lecture</string>\n    <string name=\"video_details_list_item\">- %1$s : %2$s</string>\n    <string name=\"show_channel_tabs_summary\">Choisir quels onglets seront visibles sur les pages de chaîne</string>\n    <string name=\"toggle_screen_orientation\">Changer l’orientation de l’écran</string>\n    <string name=\"toggle_fullscreen\">Basculer en plein écran</string>\n    <string name=\"share_playlist_with_titles\">Partager avec les noms</string>\n    <string name=\"metadata_subchannel_avatars\">Avatars de sous-chaîne</string>\n    <string name=\"open_play_queue\">Ouvrir la file de lecture</string>\n    <string name=\"forward\">Avancer</string>\n    <string name=\"rewind\">Rembobiner</string>\n    <string name=\"replay\">Rejouer</string>\n    <string name=\"metadata_uploader_avatars\">Avatars du téléverseur</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"play\">Lire</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s réponse</item>\n        <item quantity=\"many\">%s réponses</item>\n        <item quantity=\"other\">%s réponses</item>\n    </plurals>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"show_more\">Voir plus</string>\n    <string name=\"show_less\">Afficher moins</string>\n    <string name=\"reset_settings_summary\">Réinitialiser tous les paramètres à leurs valeurs par défaut</string>\n    <string name=\"no\">Non</string>\n    <string name=\"reset_all_settings\">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\n\\nÊtes-vous sûr de vouloir poursuivre ?</string>\n    <string name=\"settings_category_backup_restore_title\">Sauvegarde et restauration</string>\n    <string name=\"yes\">Oui</string>\n    <string name=\"auto_update_check_description\">NewPipe peut automatiquement vérifier la disponibilité de nouvelles versions de temps en temps et vous notifier lorsqu\\'elles sont disponibles.\n\\nVoulez-vous activer cette vérification ?</string>\n    <string name=\"reset_settings_title\">Réinitialiser les paramètres</string>\n    <string name=\"error_insufficient_storage\">Pas assez d\\'espace disponible sur l\\'appareil</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">secondaire</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Partager comme liste de lecture YouTube temporaire</string>\n    <string name=\"tab_bookmarks_short\">Playlists</string>\n    <string name=\"select_a_feed_group\">Sélectionnez un groupe de flux</string>\n    <string name=\"no_feed_group_created_yet\">Encore aucun groupe de flux créé</string>\n    <string name=\"feed_group_page_summary\">Page du groupe de chaînes</string>\n    <string name=\"search_with_service_name\">Rechercher %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Rechercher %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">J’aime</string>\n    <string name=\"migration_info_6_7_title\">Page SoundCloud Top 50 supprimée</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud a abandonné le classement original du Top 50. L\\'onglet correspondant a été supprimé de votre page d\\'accueil.</string>\n    <string name=\"migration_info_7_8_title\">Suppression des tendances combinées sur YouTube</string>\n    <string name=\"migration_info_7_8_message\">YouTube a supprimé la page des tendances combinées depuis le 21 juillet 2025. NewPipe a remplacé la page des tendances par défaut par les diffusions en direct les plus populaires.\\n\\nVous pouvez également sélectionner différentes pages de tendances dans « Paramètres &gt; Contenu &gt; Contenu de la page principale ».</string>\n    <string name=\"trending_gaming\">Tendances jeu vidéo</string>\n    <string name=\"trending_podcasts\">Tendances podcasts</string>\n    <string name=\"trending_movies\">Tendances films et séries</string>\n    <string name=\"trending_music\">Tendances musique</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"permission_display_over_apps_message\">Pour utiliser le lecteur contextuel, veuillez sélectionner %1$s dans le menu des paramètres Android suivant et activer %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">« Autoriser l\\'affichage sur d\\'autres applications »</string>\n    <string name=\"delete_file\">Supprimer le fichier</string>\n    <string name=\"delete_entry\">Supprimer l\\'entrée</string>\n    <string name=\"entry_deleted\">Entrée supprimée</string>\n    <string name=\"account_terminated_service_provides_reason\">Compte fermé\\n\\n%1$s fournit la raison suivante : %2$s</string>\n    <string name=\"player_http_403\">Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par l\\'expiration de l\\'URL de streaming ou une interdiction d\\'IP</string>\n    <string name=\"player_http_invalid_status\">Erreur HTTP %1$s reçue du serveur pendant la lecture</string>\n    <string name=\"youtube_player_http_403\">Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par un bannissement d\\'IP ou des problèmes de désobfuscation de l\\'URL de streaming</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s a refusé de fournir des données et a demandé un identifiant pour confirmer que le demandeur n\\'est pas un robot.\\n\\nVotre adresse IP a peut-être été temporairement bannie par %1$s. Vous pouvez patienter un peu ou changer d\\'adresse IP (par exemple en activant/désactivant un VPN, ou en passant du Wi-Fi aux données mobiles).</string>\n    <string name=\"unsupported_content_in_country\">Ce contenu n\\'est pas disponible pour le pays actuellement sélectionné.\\n\\nModifiez votre sélection dans « Paramètres &gt; Contenu &gt; Pays par défaut ».</string>\n    <string name=\"kao_dialog_warning\">En août 2025, Google a annoncé qu\\'à compter de septembre 2026, l\\'installation d\\'applications nécessiterait une vérification par le développeur pour toutes les applications Android sur les appareils certifiés, y compris celles installées en dehors du Play Store. Les développeurs de NewPipe refusant cette exigence, NewPipe ne fonctionnera plus sur les appareils Android certifiés après cette date.</string>\n    <string name=\"kao_dialog_more_info\">Détails</string>\n    <string name=\"kao_solution\">Solution</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-frc/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"no_player_found\">aucun streamer trouvé . Installez VLC?</string>\n    <string name=\"no\">non</string>\n    <string name=\"open_in_browser\">ouvrir dans le browser</string>\n    <string name=\"open_in_popup_mode\">ouvrir dans le popup mode</string>\n    <string name=\"open_with\">ouvrir avec</string>\n    <string name=\"share\">partagez</string>\n    <string name=\"controls_download_desc\">installer le fichier stream</string>\n    <string name=\"search\">chercher</string>\n    <string name=\"settings\">parameters</string>\n    <string name=\"download\">installer</string>\n    <string name=\"install\">Installer</string>\n    <string name=\"mark_as_watched\">marquer comme vu</string>\n    <string name=\"upload_date_text\">\"publié le  %1$s\"</string>\n    <string name=\"no_player_found_toast\">aucun joueur de stream n\\'est trouvé ( vous pouvez installez VLC pour jouer)</string>\n    <string name=\"cancel\">Annuler</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"yes\">Oui</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-gd/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-gl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Prema na lupa para comezar.</string>\n    <string name=\"upload_date_text\">Publicado o día %1$s</string>\n    <string name=\"no_player_found\">Non foi encontrado ningún reprodutor. Quere instalar o VLC\\?</string>\n    <string name=\"no_player_found_toast\">Non se atopou ningún reprodutor de transmisión (podes instalar VLC para reproducilo).</string>\n    <string name=\"install\">Instalar</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"open_in_browser\">Abrir no navegador</string>\n    <string name=\"open_in_popup_mode\">Abrir no modo popup</string>\n    <string name=\"share\">Compartillar</string>\n    <string name=\"download\">Descarregar</string>\n    <string name=\"controls_download_desc\">Descargar o ficheiro de emisión</string>\n    <string name=\"search\">Procurar</string>\n    <string name=\"settings\">Opcións</string>\n    <string name=\"did_you_mean\">Non querería dicir \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Compartillar con</string>\n    <string name=\"use_external_video_player_title\">Usar un reprodutor de vídeo externo</string>\n    <string name=\"use_external_video_player_summary\">Elimina o audio con algunhas resolucións</string>\n    <string name=\"use_external_audio_player_title\">Usar un reprodutor externo de audio</string>\n    <string name=\"subscribe_button_title\">Subscribir</string>\n    <string name=\"subscribed_button_title\">Subscrito</string>\n    <string name=\"channel_unsubscribed\">Xa non está subscrito ao canal</string>\n    <string name=\"subscription_change_failed\">Non se pode modificar a subscrición</string>\n    <string name=\"subscription_update_failed\">Non se pode actualizar a subscrición</string>\n    <string name=\"show_info\">Mostrar información</string>\n    <string name=\"tab_subscriptions\">Subscricións</string>\n    <string name=\"tab_bookmarks\">Listas de reprodución marcadas</string>\n    <string name=\"fragment_feed_title\">Novidades</string>\n    <string name=\"controls_background_title\">Segundo plano</string>\n    <string name=\"controls_popup_title\">Modo popup</string>\n    <string name=\"controls_add_to_playlist_title\">Engadir a</string>\n    <string name=\"download_path_title\">Cartafol de descargas para os vídeos</string>\n    <string name=\"download_path_summary\">Os vídeos descargados están almacenados aquí</string>\n    <string name=\"download_path_dialog_title\">Elixa un cartafol de descargas para os vídeos</string>\n    <string name=\"download_path_audio_title\">Cartafol de descarga de audio</string>\n    <string name=\"download_path_audio_summary\">Os audios descargados están gardados aquí</string>\n    <string name=\"download_path_audio_dialog_title\">Elixa un cartafol para descargar os audios</string>\n    <string name=\"default_resolution_title\">Resolución predeterminada</string>\n    <string name=\"default_popup_resolution_title\">Resolución predeterminada do popup</string>\n    <string name=\"show_higher_resolutions_title\">Mostrar resolucións máis altas</string>\n    <string name=\"show_higher_resolutions_summary\">Só algúns dispositivos poden reproducir vídeos en 2K/4K</string>\n    <string name=\"play_with_kodi_title\">Reproducir co Kodi</string>\n    <string name=\"kore_not_found\">Quere instalar o aplicativo Kore que falta\\?</string>\n    <string name=\"show_play_with_kodi_title\">Mostrar a opción «Reproducir co Kodi»</string>\n    <string name=\"show_play_with_kodi_summary\">Mostrar unha opción para reproducir o vídeo co Kodi Media Center</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Formato de audio predeterminado</string>\n    <string name=\"default_video_format_title\">Formato de vídeo predeterminado</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"light_theme_title\">Claro</string>\n    <string name=\"dark_theme_title\">Escuro</string>\n    <string name=\"black_theme_title\">Negro</string>\n    <string name=\"popup_remember_size_pos_title\">Lembrar o tamaño e a posición do «popup»</string>\n    <string name=\"popup_remember_size_pos_summary\">Lembrar o tamaño e a posición anteriores do «popup»</string>\n    <string name=\"use_inexact_seek_title\">Usar un salto inexacto mais inexacto</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">A caché de imaxes foi limpada</string>\n    <string name=\"metadata_cache_wipe_title\">Limpar metadatos da cache</string>\n    <string name=\"metadata_cache_wipe_summary\">Eliminar todos os datos de páxinas en caché</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Os metadatos da caché foron eliminados</string>\n    <string name=\"auto_queue_title\">Colocar a seguinte emisión na fila automaticamente</string>\n    <string name=\"auto_queue_summary\">Continúa rematando (non se repite) a cola de reprodución engadindo unha transmisión relacionada</string>\n    <string name=\"show_search_suggestions_title\">Suxestións de procura</string>\n    <string name=\"show_search_suggestions_summary\">Escolla suxestións a mostrar ao procurar</string>\n    <string name=\"enable_search_history_title\">Historial de procura</string>\n    <string name=\"enable_search_history_summary\">Gardar os termos de pesquisa localmente</string>\n    <string name=\"enable_watch_history_title\">Ver o historial</string>\n    <string name=\"enable_watch_history_summary\">Gardar historial de vídeos vistos</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Retormar o vídeo reproducíndoo</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Continuar reproducindo o vídeo despois das interrupcións (como, por exemplo, as chamadas)</string>\n    <string name=\"download_dialog_title\">Descarregar</string>\n    <string name=\"show_next_and_similar_title\">Mostrar vídeos \\\"seguintes\\\" e \\\"semellantes\\\"</string>\n    <string name=\"show_hold_to_append_title\">Mostrar a suxestión \\\"Manteña presionado para engadir á fila\\\"</string>\n    <string name=\"show_hold_to_append_summary\">Amosar o consello ao premer o fondo ou o botón emerxente \\\"Detalles:\\\" no vídeo</string>\n    <string name=\"unsupported_url\">URL non soportado</string>\n    <string name=\"default_content_country_title\">País predeterminado para o contido</string>\n    <string name=\"settings_category_player_title\">Reprodutor</string>\n    <string name=\"settings_category_player_behavior_title\">Comportamento</string>\n    <string name=\"settings_category_video_audio_title\">Vídeo e audio</string>\n    <string name=\"settings_category_history_title\">Historial e caché</string>\n    <string name=\"settings_category_appearance_title\">Aparencia</string>\n    <string name=\"settings_category_debug_title\">Depuración</string>\n    <string name=\"background_player_playing_toast\">Reproducindo en segundo plano</string>\n    <string name=\"popup_playing_toast\">Reproducindo en modo «popup»</string>\n    <string name=\"content\">Contido</string>\n    <string name=\"show_age_restricted_content_title\">Mostrar contido con restrición de idade</string>\n    <string name=\"duration_live\">En directo</string>\n    <string name=\"downloads\">Descargas</string>\n    <string name=\"downloads_title\">Descargas</string>\n    <string name=\"error_report_title\">Relatorio de erro</string>\n    <string name=\"all\">Todo</string>\n    <string name=\"channels\">Canais</string>\n    <string name=\"playlists\">Listas de reprodución</string>\n    <string name=\"tracks\">Pistas</string>\n    <string name=\"users\">Usuarios</string>\n    <string name=\"disabled\">Desactivado</string>\n    <string name=\"clear\">Limpar</string>\n    <string name=\"best_resolution\">Mellor resolución</string>\n    <string name=\"undo\">Desfacer</string>\n    <string name=\"play_all\">Reproducilos todos</string>\n    <string name=\"always\">Sempre</string>\n    <string name=\"just_once\">Só unha vez</string>\n    <string name=\"file\">Ficheiro</string>\n    <string name=\"notification_channel_name\">Notificación do NewPipe</string>\n    <string name=\"notification_channel_description\">Notificacións para o reprodutor de NewPipe</string>\n    <string name=\"unknown_content\">[Descoñecido]</string>\n    <string name=\"switch_to_background\">Mudar para o segundo plano</string>\n    <string name=\"switch_to_popup\">Mudar para o «popup»</string>\n    <string name=\"switch_to_main\">Mudar para principal</string>\n    <string name=\"import_data_title\">Importar base de datos</string>\n    <string name=\"export_data_title\">Exportar base de datos</string>\n    <string name=\"import_data_summary\">Anula o seu historial, subscricións, listas de reprodución e (opcionalmente) configuracións</string>\n    <string name=\"export_data_summary\">Exportar historial, subscricións, listas de reprodución e configuración</string>\n    <string name=\"clear_views_history_title\">Limpar historial de reproducións</string>\n    <string name=\"clear_views_history_summary\">Elimina o historial de transmisións reproducidas e as posicións da reprodución</string>\n    <string name=\"delete_view_history_alert\">Eliminar todo o historial de reproducións\\?</string>\n    <string name=\"watch_history_deleted\">O historial de reproducións foi eliminado</string>\n    <string name=\"clear_search_history_title\">Limpar o historial de procura</string>\n    <string name=\"clear_search_history_summary\">Elimina o historial de termos procurados</string>\n    <string name=\"delete_search_history_alert\">Eliminar todo o historial de procura\\?</string>\n    <string name=\"search_history_deleted\">O historial de procuras foi eliminado</string>\n    <string name=\"general_error\">Erro</string>\n    <string name=\"network_error\">Erro de rede</string>\n    <string name=\"could_not_load_thumbnails\">Non foi posíbel carregar todas as miniaturas</string>\n    <string name=\"parsing_error\">Non foi posíbel procesar o sitio web</string>\n    <string name=\"content_not_available\">Contido non dispoñíbel</string>\n    <string name=\"could_not_setup_download_menu\">Non foi posíbel configurar o menú de descargas</string>\n    <string name=\"app_ui_crash\">O aplicativo pechouse</string>\n    <string name=\"player_stream_failure\">Non foi posíbel reproducir este vídeo</string>\n    <string name=\"player_unrecoverable_failure\">Ocorreu un erro irrecuperábel co reprodutor</string>\n    <string name=\"player_recoverable_failure\">Recuperándose dun erro do reprodutor</string>\n    <string name=\"external_player_unsupported_link_type\">Os reprodutores externos non soportan estes tipos de ligazóns</string>\n    <string name=\"video_streams_empty\">Non foi encontrada ningunha emisión de vídeo</string>\n    <string name=\"audio_streams_empty\">Non foi encontrada ningunha emisión de audio</string>\n    <string name=\"invalid_directory\">Non hai ningún cartafol</string>\n    <string name=\"invalid_source\">Non hai ningún ficheiro / fonte de contido</string>\n    <string name=\"invalid_file\">O ficheiro non existe ou falta permiso para lelo ou escribilo</string>\n    <string name=\"file_name_empty_error\">O nome do ficheiro non pode estar baleiro</string>\n    <string name=\"error_occurred_detail\">Ocorreu un erro: %1$s</string>\n    <string name=\"no_streams_available_download\">Non hai emisións para descargar</string>\n    <string name=\"sorry_string\">Deculpe, isto non debería ter acontecido.</string>\n    <string name=\"error_report_button_text\">Informar por correo electrónico</string>\n    <string name=\"error_snackbar_message\">Desculpe, algo foi mal.</string>\n    <string name=\"error_snackbar_action\">Informe</string>\n    <string name=\"what_device_headline\">Información:</string>\n    <string name=\"what_happened_headline\">Que ocorreu:</string>\n    <string name=\"info_labels\">Que: \\n Solicitar: \\n Idioma de contido: \\n País de contido: \\n Idioma do aplicativo: \\nServicio: \\n Tempo GMT: \\n Paquete: \\n Versión: \\n versión de nOS:</string>\n    <string name=\"your_comment\">O teu comentario (en inglés):</string>\n    <string name=\"error_details_headline\">Detalles:</string>\n    <string name=\"detail_thumbnail_view_description\">Reproducir o vídeo, duración:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Miniatura do avatar do autor</string>\n    <string name=\"detail_likes_img_view_description\">Gosto</string>\n    <string name=\"detail_dislikes_img_view_description\">Non gosto</string>\n    <string name=\"search_no_results\">Non hai resultados</string>\n    <string name=\"empty_list_subtitle\">Nada que ver aquí</string>\n    <string name=\"detail_drag_description\">Arrastre para reordenar</string>\n    <string name=\"video\">Vídeo</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Tentar de novo</string>\n    <string name=\"no_subscribers\">Ningún subscrito</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s subscrito</item>\n        <item quantity=\"other\">%s subscritos</item>\n    </plurals>\n    <string name=\"no_views\">Ningunha visualización</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s visualización</item>\n        <item quantity=\"other\">%s visualizacións</item>\n    </plurals>\n    <string name=\"no_videos\">Ningún vídeo</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s vídeo</item>\n        <item quantity=\"other\">%s vídeos</item>\n    </plurals>\n    <string name=\"start\">Comezar</string>\n    <string name=\"pause\">Pausar</string>\n    <string name=\"create\">Crear</string>\n    <string name=\"delete\">Eliminar</string>\n    <string name=\"checksum\">Suma de comprobación</string>\n    <string name=\"dismiss\">Descartar</string>\n    <string name=\"rename\">Renomear</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Nome do ficheiro</string>\n    <string name=\"msg_threads\">Fios</string>\n    <string name=\"msg_error\">Erro</string>\n    <string name=\"msg_running\">Descarga do NewPipe</string>\n    <string name=\"msg_running_detail\">Toque para ver detalles</string>\n    <string name=\"msg_wait\">Por favor, agarde…</string>\n    <string name=\"msg_copied\">Copiado para o portarretallos</string>\n    <string name=\"no_available_dir\">Selecciona un cartafol de descarga máis tarde na configuración</string>\n    <string name=\"msg_popup_permission\">Esta permisión é necesaria\n\\npara abrir o vídeo no modo «popup»</string>\n    <string name=\"one_item_deleted\">1 elemento foi eliminado.</string>\n    <string name=\"title_activity_recaptcha\">Desafío reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">ReCAPTCHA reto solicitado</string>\n    <string name=\"settings_category_downloads_title\">Descarregar</string>\n    <string name=\"settings_file_charset_title\">Caracteres permitidos nos nomes de ficheiros</string>\n    <string name=\"settings_file_replacement_character_summary\">Os caracteres inválidos serán substituídos por este valor</string>\n    <string name=\"settings_file_replacement_character_title\">Carácter de substitución</string>\n    <string name=\"charset_letters_and_digits\">Letras e díxitos</string>\n    <string name=\"charset_most_special_characters\">A maioría dos caracteres especiais</string>\n    <string name=\"title_activity_about\">Sobre o NewPipe</string>\n    <string name=\"title_licenses\">Licenzas de terceiros</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s de %2$s, so %3$s</string>\n    <string name=\"tab_about\">Sobre e preguntas frecuentes</string>\n    <string name=\"tab_licenses\">Licenzas</string>\n    <string name=\"app_description\">Reprodutor lixeiro e libre para Android.</string>\n    <string name=\"contribution_title\">Colaborar</string>\n    <string name=\"contribution_encouragement\">Se ten ideas de tradución, mudanzas ao deseño, limpeza de código ou mudanzas serias deste—a axuda sempre é benvida. Canto máis fixermos, tanto máis vai mellorar!</string>\n    <string name=\"view_on_github\">Ver no GitHub</string>\n    <string name=\"donation_title\">Doar</string>\n    <string name=\"donation_encouragement\">NewPipe é desenvolvido por voluntarios que pasan o seu tempo libre para brindarte a mellor experiencia de usuario. Regresa aos desenvolvedores para que NewPipe sexa aínda mellor mentres gozan dunha cunca de café.</string>\n    <string name=\"give_back\">Retribuír</string>\n    <string name=\"website_title\">Sitio web</string>\n    <string name=\"website_encouragement\">Visite o sitio web do NewPipe para saber máis e ver noticias sobre o proxecto.</string>\n    <string name=\"privacy_policy_title\">Política de privacidade do NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">O proxecto NewPipe dá moita importancia á súa privacidade. Por tanto, non recolle ningún dato sen o seu consentimento.\n\\nA política de privacidade do NewPipe explica con máis detalle que datos son enviados e gardados cando envía un relatorio de erros.</string>\n    <string name=\"read_privacy_policy\">Ler a política de privacidade</string>\n    <string name=\"app_license_title\">Licenza do NewPipe</string>\n    <string name=\"app_license\">NewPipe é un software libre copyleft: Pode usar, estudar compartillar e melloralo a vontade. En concreto, pode redistribuír e / ou modificala segundo os termos da Licenza Pública Xeral GNU publicada pola Free Software Foundation, xa sexa a versión 3 da licenza, ou (na súa opción) calquera outra versión posterior.</string>\n    <string name=\"read_full_license\">Ler a licenza</string>\n    <string name=\"title_activity_history\">Historial</string>\n    <string name=\"action_history\">Historial</string>\n    <string name=\"delete_item_search_history\">Desexa eliminar este elemento do historial de procura?</string>\n    <string name=\"title_last_played\">Última reprodución</string>\n    <string name=\"title_most_played\">Máis reproducido</string>\n    <string name=\"main_page_content\">Contido da páxina principal</string>\n    <string name=\"blank_page_summary\">Páxina en branco</string>\n    <string name=\"kiosk_page_summary\">Páxina do «kiosk»</string>\n    <string name=\"channel_page_summary\">Páxina do canal</string>\n    <string name=\"select_a_channel\">Seleccione un canal</string>\n    <string name=\"no_channel_subscribed_yet\">Non se subscribiu a ningunha canle aínda</string>\n    <string name=\"select_a_kiosk\">Seleccione un «kiosk»</string>\n    <string name=\"export_complete_toast\">Exportado</string>\n    <string name=\"import_complete_toast\">Importado</string>\n    <string name=\"no_valid_zip_file\">Ficheiro ZIP inválido</string>\n    <string name=\"could_not_import_all_files\">Aviso: non todos os ficheiros foron importados.</string>\n    <string name=\"override_current_data\">Isto vai reescribir a súa configuración actual.</string>\n    <string name=\"import_settings\">Desexa importar tamén as opcións?</string>\n    <string name=\"trending\">Tendencias</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Novo e popular</string>\n    <string name=\"play_queue_remove\">Eliminar</string>\n    <string name=\"play_queue_stream_detail\">Detalles</string>\n    <string name=\"play_queue_audio_settings\">Opcións de audio</string>\n    <string name=\"hold_to_append\">Manteña para colocalo na cola</string>\n    <string name=\"start_here_on_background\">Comezar a reproducir en segundo plano</string>\n    <string name=\"start_here_on_popup\">Comezar reproducindo nunha xanela emerxente</string>\n    <string name=\"drawer_open\">Abrir o menú</string>\n    <string name=\"drawer_close\">Fechar o menú</string>\n    <string name=\"preferred_open_action_settings_title\">Acción «abrir» preferida</string>\n    <string name=\"preferred_open_action_settings_summary\">Acción predeterminada ao abrir o contido — %s</string>\n    <string name=\"video_player\">Reprodutor de vídeo</string>\n    <string name=\"background_player\">Reprodutor en segundo plano</string>\n    <string name=\"popup_player\">Reprodutor en popup</string>\n    <string name=\"always_ask_open_action\">Preguntar sempre</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Obtendo información…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Carregando o contido solicitado</string>\n    <string name=\"create_playlist\">Nova lista de reprodución</string>\n    <string name=\"rename_playlist\">Renomear</string>\n    <string name=\"name\">Nome</string>\n    <string name=\"add_to_playlist\">Engadir á lista de reprodución</string>\n    <string name=\"set_as_playlist_thumbnail\">Estabelecer como miniatura da lista de reprodución</string>\n    <string name=\"bookmark_playlist\">Gardar a lista de reprodución nos marcadores</string>\n    <string name=\"unbookmark_playlist\">Eliminar o marcador</string>\n    <string name=\"delete_playlist_prompt\">Eliminar esta lista de reprodución\\?</string>\n    <string name=\"playlist_creation_success\">A lista de reprodución foi creada</string>\n    <string name=\"playlist_add_stream_success\">Lista de reprodución</string>\n    <string name=\"playlist_thumbnail_change_success\">A miniatura da lista de reprodución foi modificada.</string>\n    <string name=\"caption_none\">Sen lenda</string>\n    <string name=\"resize_fit\">Axustar</string>\n    <string name=\"resize_fill\">Encher</string>\n    <string name=\"resize_zoom\">Zoom</string>\n    <string name=\"caption_auto_generated\">Xerado automaticamente</string>\n    <string name=\"caption_setting_title\">Lenda</string>\n    <string name=\"caption_setting_description\">Modificar a escala de texto da lenda e os estilos de segundo plano do reprodutor. Para ter efecto, é preciso reiniciar o aplicativo</string>\n    <string name=\"enable_leak_canary_summary\">A monitorización de fugas de memoria pode facer que o aplicativo deixe de responder cando hai vertedura da pila</string>\n    <string name=\"enable_disposed_exceptions_title\">Informar de erros fóra do ciclo de vida</string>\n    <string name=\"enable_disposed_exceptions_summary\">Forzar a comunicación de excepcións Rx non entregábeis fóra do ciclo de vida do fragmento ou actividade após o descarte</string>\n    <string name=\"import_title\">Importar</string>\n    <string name=\"import_from\">Importar de</string>\n    <string name=\"export_to\">Exportar a</string>\n    <string name=\"import_ongoing\">Importando…</string>\n    <string name=\"export_ongoing\">Exportando…</string>\n    <string name=\"import_file_title\">Importar un ficheiro</string>\n    <string name=\"previous_export\">Exportación anterior</string>\n    <string name=\"subscriptions_import_unsuccessful\">Non foi posíbel importar as subscricións</string>\n    <string name=\"subscriptions_export_unsuccessful\">Non foi posíbel exportar as subscricións</string>\n    <string name=\"import_youtube_instructions\">Importe as súas subscricións de Google takeout:\n\\n\n\\n1. Acceda ao URL %1$s\n\\n2. Inicie a sesión cando lle for solicitado\n\\n3. Faga click en \\\"Todos os datos incluídos\\\", logo en \\\"Desmarcar todo\\\", escolla só \\\"subscricións\\\", e prema \\\"OK\\\"\n\\n4. Pulse en \\\"Próximo paso\\\" e escolla \\\"Crear exportación\\\"\n\\n5. Faga click no botón de \\\"Decarregar\\\" despois de que apareza\n\\n6. Faga click en IMPORTAR ARQUIVO abaixo e seleccione o ficheiro .zip descarregado\n\\n7. [Se a importación do .zip fallar] Extraia o ficheiro .csv (xeralmente en Youtube e Youtube Music/subscriptions/subscriptions.csv), e faga click en IMPORTAR FICHEIRO abaixo e seleccione o .csv extraído</string>\n    <string name=\"import_soundcloud_instructions\">Pode importar un perfil do SoundCloud escribindo o URL ou o seu ID:\n\\n\n\\n1. Active o «modo desktop» nun navegador da Internet (o sitio non está dispoñíbel para dispositivos móbiles)\n\\n2. Acceda ao URL %1$s\n\\n3. Inicie a sesión cando lle for solicitado\n\\n4. Copie o URL de perfil a que foi redirixido.</string>\n    <string name=\"import_soundcloud_instructions_hint\">oseuID, soundcloud.com/oseuid</string>\n    <string name=\"import_network_expensive_warning\">Teña en conta que esta operación pode consumir moitos recursos de rede.\n\\n\n\\nDesexa continuar?</string>\n    <string name=\"playback_speed_control\">Controis de velocidade da reprodución</string>\n    <string name=\"playback_tempo\">A tempo</string>\n    <string name=\"playback_pitch\">Ton</string>\n    <string name=\"unhook_checkbox\">Desactivar (pode causar distorsións)</string>\n    <string name=\"skip_silence_checkbox\">Avanzar rápido durante os momentos de silencio</string>\n    <string name=\"playback_step\">Paso</string>\n    <string name=\"playback_reset\">Reiniciar</string>\n    <string name=\"start_accept_privacy_policy\">Para cumprirmos co Regulamento Xeral Europeo de Protección de Datos (GDPR), chamamos a súa atención sobre a nova política de privacidade do NewPipe. Por favor, léaa con coidado.\n\\nDebe aceptala para nos enviar un relatorio de erro.</string>\n    <string name=\"accept\">Aceptar</string>\n    <string name=\"decline\">Recusar</string>\n    <string name=\"limit_data_usage_none_description\">Sen límite</string>\n    <string name=\"limit_mobile_data_usage_title\">Limitar a resolución ao usar datos móbiles</string>\n    <string name=\"minimize_on_exit_title\">Minimizar cando se mude de aplicativo</string>\n    <string name=\"minimize_on_exit_summary\">Acción ao cambiar a outro aplicativo do reprodutor de vídeo principal - %s</string>\n    <string name=\"minimize_on_exit_none_description\">Ningunha</string>\n    <string name=\"minimize_on_exit_background_description\">Minimizar ao reprodutor en segundo plano</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimizar o reprodutor popup</string>\n    <string name=\"local\">Limitado</string>\n    <string name=\"peertube_instance_add_https_only\">Só son compatibles os URLs HTTPS</string>\n    <string name=\"show_comments_summary\">Desactiva para agochalos comentarios</string>\n    <string name=\"enable_playback_resume_title\">Retomar a reprodución</string>\n    <string name=\"playlist_page_summary\">Páxina das listas de reprodución</string>\n    <string name=\"video_detail_by\">Por %s</string>\n    <string name=\"channel_created_by\">Creado por %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Miniatura do avatar da canle</string>\n    <string name=\"content_not_supported\">NewPipe aínda non é compatible con este contido.\n\\n\n\\nCon toda esperanza será compatible cunha futura versión.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">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\\n\n\\nNewPipe ofrece dúas estratexias de carga de fontes:\n\\n• Obtendo toda a canle de subscrición, que é lenta pero completa.\n\\n• Usar un punto final de servizo dedicado, rápido pero normalmente non completo.\n\\n\n\\nA diferenza entre ambos é que o rápido normalmente carece de información, como a duración ou o tipo do elemento (non pode distinguir entre os vídeos en directo e os normais) e pode devolver menos elementos.\n\\n\n\\nYouTube é un exemplo dun servizo que ofrece este método rápido coa súa fonte RSS.\n\\n\n\\nDe modo que a elección redúcese ao que prefires: velocidade ou información precisa.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Desactivar o modo rápido</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Activa o modo rápido</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Dispoñible nalgúns servizos, normalmente é moito máis rápido pero pode devolver unha cantidade limitada de elementos e moitas veces información incompleta (por exemplo, sen duración, tipo de elemento, sen estado en directo)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Obtén unha transmisión dedicada cando estea dispoñible</string>\n    <string name=\"feed_update_threshold_option_always_update\">Sempre actualizado</string>\n    <string name=\"feed_update_threshold_summary\">Tempo despois da última actualización antes de que se subscriba unha subscrición - %s</string>\n    <string name=\"feed_update_threshold_title\">Limiar da actualización das fontes</string>\n    <string name=\"settings_category_feed_title\">Transmisión</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Amosar só as subscricións non agrupadas</string>\n    <string name=\"feed_create_new_group_button_title\">Novo</string>\n    <string name=\"feed_group_dialog_delete_message\">Quere eliminar este grupo\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Nome do grupo vacío</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d seleccionado</item>\n        <item quantity=\"other\">%d seleccionados</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Non se seleccionou ningunha subscrición</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Seleccionar subscricións</string>\n    <string name=\"feed_processing_message\">Procesando a transmisión…</string>\n    <string name=\"feed_notification_loading\">Cargando transmisión…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Non se cargou: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Actualizada a última información: %s</string>\n    <string name=\"feed_groups_header_title\">Grupos da canle</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d día</item>\n        <item quantity=\"other\">%d días</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d hora</item>\n        <item quantity=\"other\">%d horas</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuto</item>\n        <item quantity=\"other\">%d minutos</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d segundo</item>\n        <item quantity=\"other\">%d segundos</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Debido ás restricións de ExoPlayer, a duración da busca estableceuse en %d segundos</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Si, e visualizou parcialmente estes vídeos</string>\n    <string name=\"remove_watched_popup_warning\">Eliminaranse os vídeos vistos antes e despois de seren engadidos á lista de reprodución. \\nEstás seguro? Isto non se pode desfacer.!</string>\n    <string name=\"remove_watched_popup_title\">Borrar todos os vídeos vistos?</string>\n    <string name=\"remove_watched\">Eliminar o visto</string>\n    <string name=\"systems_language\">Sistema predeterminado</string>\n    <string name=\"app_language_title\">Lingua do aplicativo</string>\n    <string name=\"choose_instance_prompt\">Elixir unha instancia</string>\n    <string name=\"downloads_storage_use_saf_summary\">O \\'Framework Access Framework\\' permite a descarga a unha tarxeta SD externa</string>\n    <string name=\"downloads_storage_use_saf_title\">Usar selector de cartafois do sistema (SAF)</string>\n    <string name=\"downloads_storage_ask_summary\">Preguntaralle onde gardar cada descarga.\n\\nPermita o Sistema de Escolla de Cartafois (SAF) se desexar descarregar para un SD externo</string>\n    <string name=\"downloads_storage_ask_title\">Pregunta onde se descarga</string>\n    <string name=\"pause_downloads\">Parar as descagas</string>\n    <string name=\"start_downloads\">Comezar as descargas</string>\n    <string name=\"enable_queue_limit_desc\">Executarase unha descarga ao mesmo tempo</string>\n    <string name=\"enable_queue_limit\">Limitar a cola de descarga</string>\n    <string name=\"close\">Pechar</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Útil para cambiar aos datos móbiles, aínda que non se poden suspender algunhas descargas</string>\n    <string name=\"pause_downloads_on_mobile\">Interrupción en redes contadas</string>\n    <string name=\"max_retry_desc\">Número máximo de intentos antes de cancelar a descarga</string>\n    <string name=\"max_retry_msg\">Reintento máximo</string>\n    <string name=\"stop\">Parar</string>\n    <string name=\"delete_downloaded_files\">Eliminar os ficheiros descargados</string>\n    <string name=\"confirm_prompt\">Quere limpar o seu historial de descargas ou eliminar todos os ficheiros descargados\\?</string>\n    <string name=\"clear_download_history\">Borrar o historial de descargas</string>\n    <string name=\"error_download_resource_gone\">Non se pode recuperar esta descarga</string>\n    <string name=\"error_timeout\">O tempo de espera da conexión</string>\n    <string name=\"error_progress_lost\">Perdeuse o progreso porque se eliminou o ficheiro</string>\n    <string name=\"error_insufficient_storage_left\">Non queda espazo no dispositivo</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe pechouse mentres se traballaba no ficheiro</string>\n    <string name=\"error_postprocessing_failed\">Fallou o post-procesamento</string>\n    <string name=\"error_http_not_found\">Non se atopou</string>\n    <string name=\"error_http_unsupported_range\">O servidor non acepta descargas múltiples con fíos e tente con @ string / msg_threads = 1</string>\n    <string name=\"error_http_no_content\">O servidor non envía datos</string>\n    <string name=\"error_connect_host\">Non se pode conectar ao servidor</string>\n    <string name=\"error_unknown_host\">Non se puido atopar o servidor</string>\n    <string name=\"error_ssl_exception\">Non se puido establecer unha conexión segura</string>\n    <string name=\"error_path_creation\">Non se pode crear o cartafol de destino</string>\n    <string name=\"error_file_creation\">Non se pode crear o ficheiro</string>\n    <string name=\"show_error\">Amosar o erro</string>\n    <string name=\"download_already_pending\">Hai unha descarga pendente con este nome</string>\n    <string name=\"download_already_running\">Hai unha descarga en curso con este nome</string>\n    <string name=\"overwrite_failed\">Non se pode sobreescribir este ficheiro</string>\n    <string name=\"overwrite_finished_warning\">Xa existe un ficheiro descargado con este nome</string>\n    <string name=\"overwrite_unrelated_warning\">Xa existe un ficheiro con este nome</string>\n    <string name=\"overwrite\">Sobreescribir</string>\n    <string name=\"generate_unique_name\">Xera un nome único</string>\n    <string name=\"download_failed\">Fallou a descarga</string>\n    <string name=\"permission_denied\">Acción denegada polo sistema</string>\n    <string name=\"enqueue\">Enfileirar</string>\n    <string name=\"recovering\">recuperando</string>\n    <string name=\"post_processing\">post-procesamento</string>\n    <string name=\"queued\">en cola</string>\n    <string name=\"paused\">pausado</string>\n    <string name=\"missions_header_pending\">Pendente</string>\n    <string name=\"missions_header_finished\">Rematado</string>\n    <string name=\"app_update_available_notification_title\">A actualización de NewPipe está dispoñible!</string>\n    <string name=\"auto\">Automático</string>\n    <string name=\"enable_playback_state_lists_summary\">Mostra os indicadores de posición de reprodución nas listas</string>\n    <string name=\"grid\">Rede</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"list_view_mode\">Modo de visualización da lista</string>\n    <string name=\"updates_setting_description\">Amosar unha notificación para solicitar a actualización do aplicativo cando unha nova versión estea dispoñible</string>\n    <string name=\"updates_setting_title\">Actualizacións</string>\n    <string name=\"show_original_time_ago_summary\">Os textos orixinais dos servizos serán visibles nos elementos do fluxo</string>\n    <string name=\"show_original_time_ago_title\">Amosar o tempo orixinal anterior nos elementos</string>\n    <string name=\"playlist_no_uploader\">Xerado automaticamente (non se atopou ningún cargador)</string>\n    <string name=\"unmute\">Non silenciar</string>\n    <string name=\"mute\">Silenciar</string>\n    <string name=\"conferences\">Conferencias</string>\n    <string name=\"most_liked\">O que ten mais gústames</string>\n    <string name=\"recently_added\">Engadiuse recentemente</string>\n    <string name=\"error_unable_to_load_comments\">Non se puideron cargar os comentarios</string>\n    <string name=\"no_playlist_bookmarked_yet\">Aínda non hai marcadores nesta lista de reprodución</string>\n    <string name=\"select_a_playlist\">Seleccionar unha lista de reprodución</string>\n    <string name=\"default_kiosk_page_summary\">Quiosco predeterminado</string>\n    <string name=\"main_page_content_summary\">Que lapelas se amosan na páxina principal</string>\n    <string name=\"done\">Feito</string>\n    <string name=\"subtitle_activity_recaptcha\">Prema \\\"Feito\\\" cando o resolva</string>\n    <string name=\"no_comments\">Ningún comentario</string>\n    <string name=\"infinite_videos\">∞ vídeos</string>\n    <string name=\"more_than_100_videos\">+100 vídeos</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s oínte</item>\n        <item quantity=\"other\">%s oíntes</item>\n    </plurals>\n    <string name=\"no_one_listening\">Ninguén está escoitando</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s vendo</item>\n        <item quantity=\"other\">%s véndoos</item>\n    </plurals>\n    <string name=\"no_one_watching\">Ninguén está vendo</string>\n    <string name=\"subscribers_count_not_available\">Non hai dispoñible conta de subscritores</string>\n    <string name=\"drawer_header_description\">Cambiar o servizo actualmente seleccionado:</string>\n    <string name=\"error_report_open_github_notice\">Verifique se xa existe un problema que fala do seu fallo. Ao crear billetes duplicados, gasta o tempo que nós poderiamos gastar en solucionar o erro real.</string>\n    <string name=\"error_report_open_issue_button_text\">Reportar en GitHub</string>\n    <string name=\"copy_for_github\">Copia o informe con formato</string>\n    <string name=\"permission_display_over_apps\">Dar permiso para mostrar noutros aplicativos</string>\n    <string name=\"restore_defaults_confirmation\">Quere restaurar os valores predeterminados\\?</string>\n    <string name=\"restore_defaults\">Restaurar os valores predeterminados</string>\n    <string name=\"saved_tabs_invalid_json\">Non se puideron ler as pestanas gardadas, polo que usar as predeterminadas</string>\n    <string name=\"missing_file\">Ficheiro movido ou eliminado</string>\n    <string name=\"download_to_sdcard_error_message\">Non é posible descargar na tarxeta SD externa. Restaurar a localización do cartafol de descarga\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Non hai dispoñible almacenamento externo</string>\n    <string name=\"watch_history_states_deleted\">Elimináronse as posicións de reprodución</string>\n    <string name=\"delete_playback_states_alert\">Eliminas todas as posicións de reprodución\\?</string>\n    <string name=\"clear_playback_states_summary\">Elimina todas as posicións de reprodución</string>\n    <string name=\"clear_playback_states_title\">Elimina as posicións de reprodución</string>\n    <string name=\"app_update_notification_channel_description\">Notificacións para as novas versións de NewPipe</string>\n    <string name=\"app_update_notification_channel_name\">Notificación da actualización do aplicativo</string>\n    <string name=\"file_deleted\">Ficheiro eliminado</string>\n    <string name=\"artists\">Artistas</string>\n    <string name=\"albums\">Álbumes</string>\n    <string name=\"songs\">Cancións</string>\n    <string name=\"events\">Eventos</string>\n    <string name=\"videos_string\">Vídeos</string>\n    <string name=\"restricted_video\">Este vídeo está restrinxido por idade.\n\\n\n\\nSe desexa visualizalo, habilite \\\"%1$s\\\" nas opcións.</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Activar modo restrinxido de YouTube</string>\n    <string name=\"settings_category_updates_title\">Actualizacións</string>\n    <string name=\"peertube_instance_add_exists\">A instancia xa existe</string>\n    <string name=\"peertube_instance_add_fail\">Non se puido validar a instancia</string>\n    <string name=\"peertube_instance_add_help\">Introduza o URL da instancia</string>\n    <string name=\"peertube_instance_add_title\">Engadir instancia</string>\n    <string name=\"peertube_instance_url_help\">Atopar as instancias que lle gustan en %s</string>\n    <string name=\"peertube_instance_url_summary\">Selecciona as instancias favoritas de PeerTube</string>\n    <string name=\"peertube_instance_url_title\">Instancias de PeerTube</string>\n    <string name=\"content_language_title\">Idioma do contido predeterminado</string>\n    <string name=\"autoplay_title\">Reprodución automática</string>\n    <string name=\"settings_category_clear_data_title\">Eliminar datos</string>\n    <string name=\"enable_playback_state_lists_title\">Posicións nas listas</string>\n    <string name=\"enable_playback_resume_summary\">Restaurar a última posición de reprodución</string>\n    <string name=\"show_comments_title\">Ensinalos comentarios</string>\n    <string name=\"seek_duration_title\">Duración da busca rápida cara a adiante / cara atrás</string>\n    <string name=\"tab_choose\">Elixir lapela</string>\n    <string name=\"unsubscribe\">Darse de baixa</string>\n    <string name=\"search_showing_result_for\">Amosando resultados para: %s</string>\n    <string name=\"notification_action_buffering\">Procesando</string>\n    <string name=\"notification_action_repeat\">Repetir</string>\n    <string name=\"notification_actions_at_most_three\">Pode seleccionar como máximo tres accións para amosar na notificación compacta!</string>\n    <string name=\"notification_action_0_title\">Primeiro botón de acción</string>\n    <string name=\"notification_action_1_title\">Segundo botón de acción</string>\n    <string name=\"notification_action_2_title\">Terceiro botón de acción</string>\n    <string name=\"notification_action_3_title\">Cuarto botón de acción</string>\n    <string name=\"notification_action_4_title\">Quinto botón de acción</string>\n    <string name=\"notification_scale_to_square_image_summary\">Cortar a miniatura do vídeo amosado na notificación da relación de aspecto 16:9 a 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Cortar miniatura á relación de aspecto 1:1</string>\n    <string name=\"off\">Apagado</string>\n    <string name=\"tablet_mode_title\">Modo tableta</string>\n    <string name=\"open_website_license\">Abrir sitio Web</string>\n    <string name=\"metadata_privacy_internal\">Interno</string>\n    <string name=\"metadata_privacy_private\">Privado</string>\n    <string name=\"metadata_privacy_public\">Público</string>\n    <string name=\"metadata_support\">Apoio</string>\n    <string name=\"metadata_language\">Idioma</string>\n    <string name=\"metadata_age_limit\">Límite de idade</string>\n    <string name=\"metadata_privacy\">Privacidade</string>\n    <string name=\"metadata_licence\">Licenza</string>\n    <string name=\"metadata_tags\">Etiquetas</string>\n    <string name=\"metadata_category\">Categoría</string>\n    <string name=\"description_select_disable\">Deshabilitar a selección do texto da descrición</string>\n    <string name=\"description_select_enable\">Habilitar a selección do texto na descrición</string>\n    <string name=\"description_select_note\">Agora pode seleccionar o texto na descrición. Teña en conta que a páxina pode cintilar e as ligazóns poden non ser clicábeis no modo selección.</string>\n    <string name=\"auto_device_theme_title\">Automático (Tema do dispositivo)</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"georestricted_content\">Este contido non está dispoñíbel no seu país.</string>\n    <string name=\"chapters\">Capítulos</string>\n    <string name=\"recent\">Recentes</string>\n    <string name=\"show_thumbnail_title\">Mostrar miniatura</string>\n    <string name=\"feed_load_error_terminated\">A conta do autor foi eliminada.\n\\nNewPipe non poderá acceder a ela no futuro.\n\\nQueres desubscribirte da canle\\?</string>\n    <string name=\"never\">Nunca</string>\n    <string name=\"wifi_only\">Só con Wi-Fi</string>\n    <string name=\"autoplay_summary\">Iniciar reprodución automaticamente — %s</string>\n    <string name=\"crash_the_app\">A aplicación deixou de funcionar</string>\n    <string name=\"enqueue_stream\">Pór na cola</string>\n    <string name=\"show_channel_details\">Mostrar detalles da canle</string>\n    <string name=\"title_activity_play_queue\">Reproducir cola</string>\n    <string name=\"recaptcha_solve\">Resolver</string>\n    <string name=\"description_tab_description\">Descrición</string>\n    <string name=\"comments_tab_description\">Comentarios</string>\n    <string name=\"clear_cookie_summary\">Borrar as cookies que NewPipe garda cando resolve un reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">As cookies reCAPTCHA foron borradas</string>\n    <string name=\"clear_cookie_title\">Limpar cookies reCAPTCHA</string>\n    <string name=\"hash_channel_name\">Notificación do \\\"hash\\\" do vídeo</string>\n    <string name=\"restricted_video_no_stream\">Este vídeo ten restrición de idade.\n\\nDebido ás novas políticas de Youtube cos vídeos con restrición de idade, NewPipe non pode acceder ás transmisións do vídeo, polo que non pode reproducilo.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">Youtube ten un \\\"Modo Restrinxido\\\" que oculta contido potencialmente só para adultos</string>\n    <string name=\"unsupported_url_dialog_message\">URL non recoñecido. Abrir con outra aplicación\\?</string>\n    <string name=\"show_meta_info_title\">Mostrar metainformación</string>\n    <string name=\"show_description_summary\">Desactíveo para ocultar a descrición do vídeo e a información adicional</string>\n    <string name=\"show_description_title\">Ver descrición</string>\n    <string name=\"clear_queue_confirmation_title\">Pedir confirmación antes de baleirar unha cola</string>\n    <string name=\"night_theme_title\">Tema escuro</string>\n    <string name=\"notification_action_nothing\">Nada</string>\n    <string name=\"open_with\">Abrir con</string>\n    <string name=\"metadata_privacy_unlisted\">Non listado</string>\n    <string name=\"select_night_theme_toast\">Pode seleccionar o seu tema escuro favorito abaixo</string>\n    <string name=\"night_theme_summary\">Seleccione o seu tema escuro favorito — %s</string>\n    <string name=\"youtube_music_premium_content\">Este vídeo só está disponíbel para membros de YouTube Music Premium, polo que non pode ser transmitido nin descarregado polo NewPipe.</string>\n    <string name=\"private_content\">Este contido é privado, polo que non pode ser transmitido nin descarregado polo NewPipe.</string>\n    <string name=\"no_app_to_open_intent\">Non posúe ningunha aplicación para abrir isto</string>\n    <string name=\"show_thumbnail_summary\">Usar miniaturas para a pantalla de bloqueo e para as notificacións</string>\n    <string name=\"comments_are_disabled\">Os comentarios están desactivados</string>\n    <string name=\"show_age_restricted_content_summary\">Mostrar contido potencialmente non apto para menores porque ten unha limitación de idade (como +18)</string>\n    <string name=\"notification_colorize_title\">Definir cor da notificación</string>\n    <string name=\"on\">Prendido</string>\n    <string name=\"metadata_host\">Provedor</string>\n    <string name=\"featured\">Destacado</string>\n    <string name=\"paid_content\">Este contido só está dispoñíbel para usuarios que pagaran por el, así que non pode ser transmitido ou descarregado por NewPipe.</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Será preguntado onde desexa gardar cada descarga</string>\n    <string name=\"dont_show\">Non mostrar</string>\n    <string name=\"low_quality_smaller\">Baixa calidade (máis pequeno)</string>\n    <string name=\"high_quality_larger\">Alta calidade (maior)</string>\n    <string name=\"show_memory_leaks\">Mostrar perdas de memoria</string>\n    <string name=\"show_meta_info_summary\">Desactivar para ocultar información adicional sobre o creador da emisión, do contido, ou da petición de procura</string>\n    <string name=\"notification_colorize_summary\">Permitir a Android personalizar a cor da notificación conforme a cor principal da miniatura (esta opción non está dispoñíbel en todos os dispositivos)</string>\n    <string name=\"mark_as_watched\">Marcar como visto</string>\n    <string name=\"download_has_started\">Descarga inciada</string>\n    <string name=\"account_terminated\">Conta cancelada</string>\n    <string name=\"feed_load_error_fast_unknown\">O modo feed rápido non prové máis información sobre isto.</string>\n    <string name=\"feed_load_error_account_info\">Non foi posíbel carregar o feed para \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Erro ao carregar o feed</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Descarga %1$s eliminada</item>\n        <item quantity=\"other\">Descargas %1$s eliminadas</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Descarga finalizada</item>\n        <item quantity=\"other\">%s descargas finalizadas</item>\n    </plurals>\n    <string name=\"seekbar_preview_thumbnail_title\">Miniatura na barra de busca</string>\n    <string name=\"disable_media_tunneling_summary\">Desactive o túnel multimedia se experimentar unha pantalla en negro ou interrupcións na reprodución.</string>\n    <string name=\"disable_media_tunneling_title\">Desactivar túnel multimedia</string>\n    <string name=\"enqueued\">Engadido á cola</string>\n    <string name=\"no_dir_yet\">Cartafol de descarga aínda non definido, escolla o cartafol agora</string>\n    <string name=\"msg_calculating_hash\">A calcular hash</string>\n    <string name=\"related_items_tab_description\">Emisións relacionadas</string>\n    <string name=\"hash_channel_description\">Notificacións sobre o progreso do hashing do vídeo</string>\n    <string name=\"local_search_suggestions\">Suxestións de procura locais</string>\n    <string name=\"remote_search_suggestions\">Suxestións de procura remotas</string>\n    <string name=\"clear_queue_confirmation_description\">A cola de reprodución activa será substituída</string>\n    <string name=\"clear_queue_confirmation_summary\">Cambiar dun reprodutor a outro pode substituír a súa cola</string>\n    <string name=\"notification_action_shuffle\">Barallar</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"enqueue_next_stream\">Enfileirar o seguinte vídeo</string>\n    <string name=\"start_main_player_fullscreen_title\">Inciar reprodutor principal en pantalla completa</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"main_page_content_swipe_remove\">Deslice os elementos para removelos</string>\n    <string name=\"no_appropriate_file_manager_message\">Non se atopou ningún xestor de ficheiros axeitado para esta acción. \n\\nPor favor instala un xestor de ficheiros ou intenta desactivar \\'%s\\' na configuración de descarga</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Non se atopou ningún xestor de ficheiros axeitado para esta acción. \n\\nPor favor instala un xestor de ficheiros compatible con Storage Access Framework</string>\n    <string name=\"detail_heart_img_view_description\">Valorado polo creador</string>\n    <string name=\"error_report_notification_toast\">Ocorreu un erro, vexa a notificación</string>\n    <string name=\"auto_queue_toggle\">Auto-enfileirar</string>\n    <string name=\"soundcloud_go_plus_content\">Esta é unha pista de SoundCloud Go+, polo menos no seu país, así que non pode ser transmitida ou descarregada por NewPipe.</string>\n    <string name=\"error_report_channel_name\">Notificación de relatorio de erros</string>\n    <string name=\"error_report_channel_description\">Notificacións para reportar erros</string>\n    <string name=\"error_report_notification_title\">NewPipe atopou un erro, presione para reportar</string>\n    <string name=\"detail_pinned_comment_view_description\">Comentario fixado</string>\n    <string name=\"enqueued_next\">Enfileirado</string>\n    <string name=\"check_for_updates\">Procurar actualizacións</string>\n    <string name=\"manual_update_description\">Procurar manualmente novas versións</string>\n    <string name=\"checking_updates_toast\">A procurar actualizacións…</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">A partir do Android 10, só o \\'Sistema de Acceso ao Almacenamento\\' está soportado</string>\n    <string name=\"processing_may_take_a_moment\">Procesando... Pode devagar un momento</string>\n    <string name=\"create_error_notification\">Crear unha notificación de erro</string>\n    <string name=\"feed_new_items\">Novos elementos</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Predefinido do ExoPlayer</string>\n    <string name=\"show_crash_the_player_title\">Amosar \\\"Travar o reprodutor\\\"</string>\n    <string name=\"show_error_snackbar\">Amosar un snackbar de erro</string>\n    <string name=\"show_crash_the_player_summary\">Amosa unha opción de travamento ao usar o reprodutor</string>\n    <string name=\"crash_the_player\">Travar o reprodutor</string>\n    <string name=\"leak_canary_not_available\">LeakCanary non está dispoñíbel</string>\n    <string name=\"streams_notification_channel_description\">Notificacións sobre novas emisións para subscricións</string>\n    <string name=\"streams_notifications_interval_title\">Frecuencia de verificación</string>\n    <string name=\"streams_notifications_network_title\">Conexión á rede necesaria</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Alternar todo</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nova emisión</item>\n        <item quantity=\"other\">%s novas emisións</item>\n    </plurals>\n    <string name=\"percent\">Por cento</string>\n    <string name=\"semitone\">Semitón</string>\n    <string name=\"enable_streams_notifications_summary\">Notificar sobre novas emisións de subscricións</string>\n    <string name=\"enable_streams_notifications_title\">Notificacións sobre novas emisións</string>\n    <string name=\"settings_category_player_notification_title\">Notificación do reprodutor</string>\n    <string name=\"streams_notification_channel_name\">Novas emisións</string>\n    <string name=\"loading_stream_details\">Carregando detalles da emisión…</string>\n    <string name=\"check_new_streams\">Verifique se hai novas emisións</string>\n    <string name=\"settings_category_player_notification_summary\">Configurar a notificación da emisión actual</string>\n    <string name=\"notifications\">Notificacións</string>\n    <string name=\"any_network\">Calquera rede</string>\n    <string name=\"delete_downloaded_files_confirm\">Desexa eliminar todos os ficheiros descarregados do disco\\?</string>\n    <string name=\"notifications_disabled\">As notificacións están desactivadas</string>\n    <string name=\"get_notified\">Recibir notificacións</string>\n    <string name=\"you_successfully_subscribed\">Agora está subscrito a esta canle</string>\n    <string name=\"streams_not_yet_supported_removed\">Emisións non soportadas polo descarregador non son mostradas</string>\n    <string name=\"select_quality_external_players\">Seleccione a calidade para reprodutores externos</string>\n    <string name=\"unknown_format\">Formato descoñecido</string>\n    <string name=\"unknown_quality\">Calidade descoñecida</string>\n    <string name=\"progressive_load_interval_title\">Tamaño do intervalo de carregamento da reprodución</string>\n    <string name=\"selected_stream_external_player_not_supported\">As emisións seleccionadas non son soportadas polos reprodutores externos</string>\n    <string name=\"no_video_streams_available_for_external_players\">Non hai emisións de vídeo dispoñíbeis para reprodutores externos</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Non hai emisións de audio dispoñíbeis para reprodutores externos</string>\n    <string name=\"faq\">Ver na páxina web</string>\n    <string name=\"faq_title\">Preguntas máis frecuentes</string>\n    <string name=\"faq_description\">Se tes problemas para usala aplicación, asegúrate de consultar estas respostas ás preguntas comúns!</string>\n    <string name=\"sort\">Ordenar</string>\n    <string name=\"fast_mode\">Modo rápido</string>\n    <string name=\"app_update_unavailable_toast\">Estás executando a última versión de NewPipe</string>\n    <string name=\"app_update_available_notification_text\">Toca para descargar %s</string>\n    <string name=\"import_subscriptions_hint\">Importa ou exporta subscricións dende o menú dos 3 puntos</string>\n    <string name=\"night_theme_available\">Esta opción só está dispoñible se %s está seleccionado para o tema</string>\n    <string name=\"msg_failed_to_copy\">Produciuse un erro ao copiar no portapapeis</string>\n    <string name=\"unset_playlist_thumbnail\">Desactivala miniatura permanente</string>\n    <string name=\"card\">Tarxeta</string>\n    <string name=\"duplicate_in_playlist\">As listas de reprodución que se atopan atenuadas xa conteñen este elemento.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplicado engadido %d vez/veces</string>\n    <string name=\"feed_show_hide_streams\">Mostrar/Ocultar emisións</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorar eventos con botóns multimedia físicos</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Útil, por exemplo, se estiver usando un auricular con botóns rotos</string>\n    <string name=\"remove_duplicates\">Eliminar duplicados</string>\n    <string name=\"remove_duplicates_title\">Eliminar duplicados\\?</string>\n    <string name=\"remove_duplicates_message\">Desexa eliminar todas as emisións duplicadas nesta lista de reprodución\\?</string>\n    <string name=\"feed_hide_streams_title\">Mostrar os seguintes vídeos</string>\n    <string name=\"feed_show_watched\">Completamente visto</string>\n    <string name=\"feed_show_partially_watched\">Parcialmente visto</string>\n    <string name=\"feed_show_upcoming\">Proximamente</string>\n    <string name=\"right_gesture_control_summary\">Escolla o xesto para a metade dereita da pantalla do reprodutor</string>\n    <string name=\"right_gesture_control_title\">Acción do xesto para a dereita</string>\n    <string name=\"left_gesture_control_title\">Acción do xesto na esquerda</string>\n    <string name=\"brightness\">Brillo</string>\n    <string name=\"volume\">Volume</string>\n    <string name=\"none\">Ningún</string>\n    <string name=\"play_queue_audio_track\">Audio: %s</string>\n    <string name=\"audio_track\">Faixa de audio</string>\n    <string name=\"audio_track_present_in_video\">Xa debe existir unha faixa de audio nesta emisión</string>\n    <string name=\"select_audio_track_external_players\">Selecione a faixa de áudio para reprodutores externos</string>\n    <string name=\"unknown_audio_track\">Descoñecida</string>\n    <string name=\"settings_category_exoplayer_title\">Configuracións ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">Xestione algunhas configuracións de ExoPlayer. É necesario reiniciar o reprodutor para aplicar os cambios</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Use a función fallback do decodificador do ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Usar sempre Explayer como alternativa de saída de vídeo</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">orixinal</string>\n    <string name=\"audio_track_type_dubbed\">dobrado</string>\n    <string name=\"audio_track_type_descriptive\">descritivo</string>\n    <string name=\"progressive_load_interval_summary\">Altera o tamaño do intervalo de carregamento progresivo (o actual é %s). Un valor menor pode acelerar o carregamento inicial do vídeo</string>\n    <string name=\"prefer_original_audio_title\">Preferir o audio orixinal</string>\n    <string name=\"prefer_original_audio_summary\">Seleccionar o audio orixinal independentemente do idioma</string>\n    <string name=\"prefer_descriptive_audio_summary\">Seleciona o audio con descrición para persoas con dificuldades de visión, se estar dispoñíbel</string>\n    <string name=\"prefer_descriptive_audio_title\">Prefirir o audio descritivo</string>\n    <string name=\"left_gesture_control_summary\">Escolla o xesto para a metade esquerda da pantalla do reprodutor</string>\n    <string name=\"main_tabs_position_summary\">Mova o selector da lapela principal para a parte inferior</string>\n    <string name=\"main_tabs_position_title\">Posición prinicipal das lapelas</string>\n    <string name=\"disable_media_tunneling_automatic_info\">A tunelización da multimedia foi deshabilitada por defecto, porque o seu modelo de dispositivo carece de soporte.</string>\n    <string name=\"no_streams\">Sen emisións</string>\n    <string name=\"no_live_streams\">Sen emisións en directo</string>\n    <string name=\"metadata_thumbnails\">Miniaturas</string>\n    <string name=\"metadata_uploader_avatars\">Avatares do publicador</string>\n    <string name=\"metadata_avatars\">Avatares</string>\n    <string name=\"channel_tab_videos\">Vídeos</string>\n    <string name=\"toggle_fullscreen\">Alternar a pantalla completa</string>\n    <string name=\"toggle_screen_orientation\">Alternar a orientación da pantalla</string>\n    <string name=\"previous_stream\">Emisión anterior</string>\n    <string name=\"next_stream\">Seguinte emisión</string>\n    <string name=\"image_quality_title\">Calidade da imaxe</string>\n    <string name=\"open_play_queue\">Abrir ringleira de reprodución</string>\n    <string name=\"image_quality_none\">Non carregar imaxes</string>\n    <string name=\"image_quality_low\">Baixa calidade</string>\n    <string name=\"image_quality_medium\">Calidade media</string>\n    <string name=\"share_playlist\">Compartillar lista de reprodución</string>\n    <string name=\"share_playlist_with_titles\">Compartillar os títulos</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_more\">Amosar máis</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s resposta</item>\n        <item quantity=\"other\">%s respostas</item>\n    </plurals>\n    <string name=\"show_less\">Amosar menos</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"metadata_subchannel_avatars\">Avatar da subcanle</string>\n    <string name=\"metadata_subscribers\">Subscritores</string>\n    <string name=\"loading_metadata_title\">A cargar metadatos…</string>\n    <string name=\"settings_category_backup_restore_title\">Copia de seguranza e restauración</string>\n    <string name=\"yes\">Si</string>\n    <string name=\"no\">Non</string>\n    <string name=\"auto_update_check_description\">NewPipe pode revisar automaticamente por actualizacións periodicamente e notificalo unha vez estean dispoñíbeis.\n\\nDesexa habilitar isto?</string>\n    <string name=\"reset_settings_title\">Restaurar configuracións</string>\n    <string name=\"reset_settings_summary\">Restabelecer todas as configuracións aos seus valores por defecto</string>\n    <string name=\"error_insufficient_storage\">Non hai espazo suficiente no dispositivo</string>\n    <string name=\"channel_tab_shorts\">Curtos</string>\n    <string name=\"channel_tab_livestreams\">En directo</string>\n    <string name=\"channel_tab_channels\">Canles</string>\n    <string name=\"channel_tab_playlists\">Listas de reprodución</string>\n    <string name=\"channel_tab_albums\">Álbums</string>\n    <string name=\"channel_tab_about\">Sobre</string>\n    <string name=\"show_channel_tabs\">Lapelas da canle</string>\n    <string name=\"play\">Reproducir</string>\n    <string name=\"replay\">Reproducir de novo</string>\n    <string name=\"more_options\">Máis opcións</string>\n    <string name=\"duration\">Duración</string>\n    <string name=\"rewind\">Recuar</string>\n    <string name=\"forward\">Avanzar</string>\n    <string name=\"image_quality_high\">Calidade alta</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"reset_all_settings\">Restablecer todos os axustes rexeitará todas as túas preferencias e reiniciará a aplicación.\\n\\nQueres continuar?</string>\n    <string name=\"feed_fetch_channel_tabs\">Recuperar as lapelas da canle</string>\n    <string name=\"metadata_banners\">Encabezados</string>\n    <string name=\"show_channel_tabs_summary\">Lapelas a mostrar nas páxinas das canles</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"share_playlist_with_list\">Compartir lista de URLs</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"channel_tab_tracks\">Pistas</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Lapelas a recuperar ao actualizar o feed. Esta opción non ten efecto se a canle se actualiza no modo rápido.</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-gu/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"black_theme_title\">કાળું</string>\n    <string name=\"dark_theme_title\">અંધારિયું</string>\n    <string name=\"light_theme_title\">પ્રકાશ</string>\n    <string name=\"night_theme_title\">રાત્રિ થીમ</string>\n    <string name=\"theme_title\">થીમ</string>\n    <string name=\"default_video_format_title\">ડિફોલ્ટ વિડિઓ ફોર્મેટ</string>\n    <string name=\"default_audio_format_title\">ડિફોલ્ટ ઓડિયો ફોર્મેટ</string>\n    <string name=\"play_audio\">ઓડિયો</string>\n    <string name=\"notification_colorize_summary\">થંબનેલના મુખ્ય રંગ અનુસાર, Android ને સૂચનાના રંગને કસ્ટમાઇઝ કરો (નોંધો કે આ બધા ઉપકરણો પર ઉપલબ્ધ નથી)</string>\n    <string name=\"notification_colorize_title\">સૂચનાને રંગીન બનાવો</string>\n    <string name=\"notification_action_nothing\">કાંઈ નહીં</string>\n    <string name=\"notification_action_buffering\">બફરિંગ</string>\n    <string name=\"notification_action_shuffle\">શફલ</string>\n    <string name=\"notification_action_repeat\">પુનરાવર્તન કરો</string>\n    <string name=\"notification_actions_at_most_three\">તમે કોમ્પેક્ટ સૂચનામાં બતાવવા માટે ઓછામાં ઓછી ત્રણ ક્રિયાઓ પસંદ કરી શકો છો!</string>\n    <string name=\"notification_actions_summary\">નીચેની દરેક સૂચના ક્રિયાને તેના પર ટેપ કરીને સંપાદિત કરો. જમણી બાજુના ચેકબોક્સેસનો ઉપયોગ કરીને કોમ્પેક્ટ સૂચનામાં બતાવવા માટે તેમાંથી ત્રણ સુધી પસંદ કરો.</string>\n    <string name=\"notification_action_4_title\">પાંચમો ક્રિયા બટન</string>\n    <string name=\"notification_action_3_title\">ચોથું ક્રિયા બટન</string>\n    <string name=\"notification_action_2_title\">ત્રીજી ક્રિયા બટન</string>\n    <string name=\"notification_action_1_title\">બીજું ક્રિયા બટન</string>\n    <string name=\"notification_action_0_title\">પ્રથમ ક્રિયા બટન</string>\n    <string name=\"notification_scale_to_square_image_summary\">સૂચનામાં બતાવેલ વિડિઓ થંબનેલને ૧૬:૯ થી ૧:૧ સાપેક્ષ ગુણોત્તરમાં કાપો</string>\n    <string name=\"notification_scale_to_square_image_title\">થંબનેલને ૧:૧ સાપેક્ષ ગુણોત્તરમાં કાપો</string>\n    <string name=\"show_play_with_kodi_summary\">કોડિ મીડિયા સેન્ટર દ્વારા વિડિઓ ચલાવવાનો વિકલ્પ દર્શાવો</string>\n    <string name=\"kore_not_found\">અનુપસ્થિત Kore અનુપ્રયોગ સ્થાપિત કરીએ?</string>\n    <string name=\"show_higher_resolutions_summary\">ફક્ત થોડા ઉપકરણો 2K / 4K વિડિઓઝ ચલાવી શકે છે</string>\n    <string name=\"show_higher_resolutions_title\">ઉચ્ચ રીઝોલ્યુશન બતાવો</string>\n    <string name=\"default_popup_resolution_title\">ડિફોલ્ટ પોપઅપ રીઝોલ્યુશન</string>\n    <string name=\"default_resolution_title\">ડિફોલ્ટ રીઝોલ્યુશન</string>\n    <string name=\"download_path_audio_dialog_title\">ઓડિયો ફાઇલો માટે ડાઉનલોડ ફોલ્ડર પસંદ કરો</string>\n    <string name=\"download_path_audio_summary\">ડાઉનલોડ કરેલી ઓડિયો ફાઇલો અહીં સંગ્રહિત છે</string>\n    <string name=\"download_path_audio_title\">ઓડિયો ડાઉનલોડ ફોલ્ડર</string>\n    <string name=\"download_path_dialog_title\">વિડિઓ ફાઇલો માટે ડાઉનલોડ ફોલ્ડર પસંદ કરો</string>\n    <string name=\"download_path_summary\">ડાઉનલોડ કરેલી વિડિઓ ફાઇલો અહીં સંગ્રહિત છે</string>\n    <string name=\"download_path_title\">વિડિઓ ડાઉનલોડ ફોલ્ડર</string>\n    <string name=\"controls_add_to_playlist_title\">માં ઉમેરો</string>\n    <string name=\"controls_popup_title\">પોપઅપ</string>\n    <string name=\"controls_background_title\">પૃષ્ઠભૂમિ</string>\n    <string name=\"tab_choose\">ટેબ પસંદ કરો</string>\n    <string name=\"tab_bookmarks\">બુકમાર્ક કરેલ પ્લેલિસ્ટ્સ</string>\n    <string name=\"tab_subscriptions\">લવાજમઓ</string>\n    <string name=\"show_info\">માહિતી બતાવો</string>\n    <string name=\"subscription_update_failed\">સબ્સ્ક્રિપ્શન અપડેટ કરી શકાયું નથી</string>\n    <string name=\"subscription_change_failed\">સબ્સ્ક્રિપ્શન બદલી શકાયું નહીં</string>\n    <string name=\"channel_unsubscribed\">ચેનલ અનસબ્સ્ક્રાઇબ કર્યું</string>\n    <string name=\"unsubscribe\">અનસબ્સ્ક્રાઇબ કરો</string>\n    <string name=\"subscribed_button_title\">સબ્સ્ક્રાઇબ કર્યું</string>\n    <string name=\"subscribe_button_title\">સબ્સ્ક્રાઇબ કરો</string>\n    <string name=\"use_external_audio_player_title\">બાહ્ય ઓડિયો પ્લેયરનો ઉપયોગ કરો</string>\n    <string name=\"use_external_video_player_summary\">કેટલાક ઠરાવો પર ઓડિયો દૂર કરે છે</string>\n    <string name=\"use_external_video_player_title\">બાહ્ય વિડિઓ પ્લેયરનો ઉપયોગ કરો</string>\n    <string name=\"share_dialog_title\">સાથે શેર કરો</string>\n    <string name=\"search_showing_result_for\">%s માટે પરિણામો બતાવી રહ્યું છે</string>\n    <string name=\"did_you_mean\">શું તમારો મતલબ %1$s છે\\?</string>\n    <string name=\"settings\">સેટિંગ્સ</string>\n    <string name=\"search\">શોધો</string>\n    <string name=\"controls_download_desc\">સ્ટ્રીમ ફાઇલ ડાઉનલોડ કરો</string>\n    <string name=\"download\">ડાઉનલોડ કરો</string>\n    <string name=\"share\">શેર કરો</string>\n    <string name=\"open_with\">સાથે ખોલો</string>\n    <string name=\"open_in_popup_mode\">પોપઅપ મોડમાં ખોલો</string>\n    <string name=\"open_in_browser\">બ્રાઉઝરમાં ખોલો</string>\n    <string name=\"cancel\">રદ કરો</string>\n    <string name=\"install\">સ્થાપિત કરો</string>\n    <string name=\"no_player_found_toast\">કોઈ સ્ટ્રીમ પ્લેયર મળ્યો નથી (તમે તેને ચલાવવા માટે VLC ઇન્સ્ટોલ કરી શકો છો).</string>\n    <string name=\"no_player_found\">કોઈ સ્ટ્રીમ પ્લેયર મળ્યો નથી. વીએલસી સ્થાપિત કરીએ\\?</string>\n    <string name=\"upload_date_text\">%1$s પર પ્રકાશિત</string>\n    <string name=\"main_bg_subtitle\">પ્રારંભ કરવા માટે વિપુલ - દર્શક કાચને ટેપ કરો.</string>\n    <string name=\"mark_as_watched\">જોયેલું તરીકે ચિહ્નિત કરો</string>\n    <string name=\"ok\">ઠીક છે</string>\n    <string name=\"yes\">હા</string>\n    <string name=\"no\">ના</string>\n    <string name=\"trending\">વલણમાંનાં</string>\n    <string name=\"auto_queue_toggle\">આપોઆપ કતારબદ્ધતા</string>\n    <string name=\"crash_the_player\">પ્લેયરને ક્રેશ કરો</string>\n    <string name=\"action_history\">ઇતિહાસ</string>\n    <string name=\"play_with_kodi_title\">કોટિથી ચલાવો</string>\n    <string name=\"show_play_with_kodi_title\">કોડિથી ચલાવવાનો વિકલ્પ દેખાડો</string>\n    <string name=\"download_dialog_title\">ડાઉનલોડ કરો</string>\n    <string name=\"autoplay_title\">આપમેળે ચલાવો</string>\n    <string name=\"fragment_feed_title\">નવું શું છે</string>\n    <string name=\"downloads\">ડાઉનલોડ્સ</string>\n    <string name=\"downloads_title\">ડાઉનલોડ્સ</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-he/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">יש לגעת בזכוכית המגדלת כדי להתחיל.</string>\n    <string name=\"upload_date_text\">פורסם ב־%1$s</string>\n    <string name=\"no_player_found\">לא נמצאו נגני הזרמה, להתקין VLC\\?</string>\n    <string name=\"install\">התקנה</string>\n    <string name=\"cancel\">ביטול</string>\n    <string name=\"open_in_browser\">פתיחה בדפדפן</string>\n    <string name=\"open_in_popup_mode\">פתיחה בחלון צף</string>\n    <string name=\"share\">שיתוף</string>\n    <string name=\"download\">הורדה</string>\n    <string name=\"search\">חיפוש</string>\n    <string name=\"settings\">הגדרות</string>\n    <string name=\"did_you_mean\">כוונתך הייתה „%1$s”\\?</string>\n    <string name=\"share_dialog_title\">שיתוף עם</string>\n    <string name=\"use_external_video_player_title\">שימוש בנגן סרטונים חיצוני</string>\n    <string name=\"use_external_video_player_summary\">בחלק מהרזולוציות השמע יוסר</string>\n    <string name=\"use_external_audio_player_title\">שימוש בנגן שמע חיצוני</string>\n    <string name=\"controls_background_title\">רקע</string>\n    <string name=\"controls_popup_title\">חלון צף</string>\n    <string name=\"download_path_title\">תיקייה להורדת סרטונים</string>\n    <string name=\"download_path_summary\">קובצי וידאו שהורדת מאוחסנים כאן</string>\n    <string name=\"download_path_dialog_title\">נא לבחור תיקייה לשמירת קובצי סרטונים</string>\n    <string name=\"download_path_audio_title\">תיקיית הורדות שמע</string>\n    <string name=\"download_path_audio_summary\">קובצי שמע שהורדת מאוחסנים כאן</string>\n    <string name=\"download_path_audio_dialog_title\">נא לבחור תיקייה לשמירת קובצי שמע</string>\n    <string name=\"default_resolution_title\">רזולוציית ברירת המחדל</string>\n    <string name=\"default_popup_resolution_title\">רזולוציית ברירת המחדל לחלון צף</string>\n    <string name=\"show_higher_resolutions_title\">הצגת רזולוציות גבוהות יותר</string>\n    <string name=\"show_higher_resolutions_summary\">רק חלק מהמכשירים יכולים לנגן סרטונים ב־2K/4K</string>\n    <string name=\"play_with_kodi_title\">נגינה ב־Kodi</string>\n    <string name=\"kore_not_found\">להתקין את יישומון Kode החסר\\?</string>\n    <string name=\"show_play_with_kodi_title\">הצגת האפשרות לניגון עם Kodi</string>\n    <string name=\"show_play_with_kodi_summary\">הצגת אפשרות לנגן סרטון דרך מרכז המדיה Kodi</string>\n    <string name=\"play_audio\">שמע</string>\n    <string name=\"default_audio_format_title\">תבנית שמע כברירת מחדל</string>\n    <string name=\"default_video_format_title\">תבנית סרטון כברירת מחדל</string>\n    <string name=\"theme_title\">ערכת נושא</string>\n    <string name=\"light_theme_title\">בהיר</string>\n    <string name=\"dark_theme_title\">כהה</string>\n    <string name=\"black_theme_title\">שחור</string>\n    <string name=\"popup_remember_size_pos_title\">שמירת מאפייני החלון הצף</string>\n    <string name=\"popup_remember_size_pos_summary\">שמירת המיקום והגודל האחרונים של החלון הצף</string>\n    <string name=\"show_search_suggestions_title\">הצעות חיפוש</string>\n    <string name=\"show_search_suggestions_summary\">נא לבחור את ההצעות להצגה בזמן החיפוש</string>\n    <string name=\"download_dialog_title\">הורדה</string>\n    <string name=\"show_next_and_similar_title\">להציג סרטונים דומים והבאים בתור</string>\n    <string name=\"unsupported_url\">כתובת לא נתמכת</string>\n    <string name=\"content_language_title\">שפת התוכן המועדפת</string>\n    <string name=\"settings_category_video_audio_title\">סרטונים ושמע</string>\n    <string name=\"settings_category_appearance_title\">תצוגה</string>\n    <string name=\"background_player_playing_toast\">מתנגן ברקע</string>\n    <string name=\"popup_playing_toast\">מתנגן בחלון צף</string>\n    <string name=\"content\">תוכן</string>\n    <string name=\"show_age_restricted_content_title\">הצגת תוכן עם הגבלת גיל</string>\n    <string name=\"duration_live\">חי</string>\n    <string name=\"downloads\">הורדות</string>\n    <string name=\"downloads_title\">הורדות</string>\n    <string name=\"error_report_title\">דוח שגיאה</string>\n    <string name=\"all\">הכול</string>\n    <string name=\"disabled\">מושבת</string>\n    <string name=\"clear\">ניקוי</string>\n    <string name=\"general_error\">שגיאה</string>\n    <string name=\"network_error\">שגיאת רשת</string>\n    <string name=\"could_not_load_thumbnails\">אין אפשרות לטעון את כל התמונות הממוזערות</string>\n    <string name=\"parsing_error\">ניתוח האתר לא התאפשר</string>\n    <string name=\"content_not_available\">תוכן אינו זמין</string>\n    <string name=\"could_not_setup_download_menu\">לא הייתה אפשרות להכין את תפריט ההורדה</string>\n    <string name=\"app_ui_crash\">היישומון או מנשק המשתמש קרסו</string>\n    <string name=\"sorry_string\">זה לא אמור היה לקרות, עמך הסליחה.</string>\n    <string name=\"error_report_button_text\">דיווח דרך דוא״ל</string>\n    <string name=\"error_snackbar_message\">משהו השתבש, עמך הסליחה.</string>\n    <string name=\"error_snackbar_action\">דיווח</string>\n    <string name=\"what_device_headline\">מידע:</string>\n    <string name=\"what_happened_headline\">מה קרה:</string>\n    <string name=\"info_labels\">מה:\\nבקשה:\\nשפת התוכן:\\nמדינת התוכן:\\nשפת היישומון:\\nשירות:\\nשעון גריניץ׳:\\nחבילה:\\nגרסה:\\nגרסת מערכת ההפעלה:</string>\n    <string name=\"subscribe_button_title\">רישום למינוי</string>\n    <string name=\"subscribed_button_title\">נרשמת</string>\n    <string name=\"channel_unsubscribed\">ביטול מינוי לערוץ</string>\n    <string name=\"subscription_change_failed\">לא הצלחתי לשנות מינוי</string>\n    <string name=\"subscription_update_failed\">לא ניתן לעדכן את המינוי</string>\n    <string name=\"tab_subscriptions\">מינויים</string>\n    <string name=\"fragment_feed_title\">מה חדש</string>\n    <string name=\"enable_search_history_title\">היסטוריית חיפוש</string>\n    <string name=\"enable_search_history_summary\">שמירת שאילתות החיפוש מקומית</string>\n    <string name=\"enable_watch_history_title\">היסטוריית צפייה</string>\n    <string name=\"enable_watch_history_summary\">תיעוד הסרטונים שנצפו</string>\n    <string name=\"resume_on_audio_focus_gain_title\">להמשיך את הניגון</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">להמשיך לנגן לאחר הפרעות (למשל: שיחות טלפון)</string>\n    <string name=\"show_hold_to_append_title\">להציג את העצה „להחזיק כדי להוסיף לרשימת נגינה”</string>\n    <string name=\"show_hold_to_append_summary\">להציג עצה בעת לחיצה על הרקע או על הכפתור של הנגן הצף ב„פרטים:” על הסרטון</string>\n    <string name=\"settings_category_player_title\">נגן</string>\n    <string name=\"settings_category_player_behavior_title\">התנהגות</string>\n    <string name=\"settings_category_history_title\">היסטוריה ומטמון</string>\n    <string name=\"best_resolution\">רזולוציה מיטבית</string>\n    <string name=\"undo\">ביטול</string>\n    <string name=\"play_all\">לנגן הכול</string>\n    <string name=\"notification_channel_name\">התראה מ־NewPipe</string>\n    <string name=\"notification_channel_description\">התראות עבור הנגן של NewPipe</string>\n    <string name=\"unknown_content\">[לא ידוע]</string>\n    <string name=\"player_stream_failure\">נגינת התזרים לא הצליחה</string>\n    <string name=\"player_unrecoverable_failure\">אירעה תקלה בנגן ממנה לא ניתן להשתקם</string>\n    <string name=\"player_recoverable_failure\">מתבצעת החלמה משגיאת נגן</string>\n    <string name=\"your_comment\">ההערה שלך (באנגלית):</string>\n    <string name=\"error_details_headline\">פרטים:</string>\n    <string name=\"detail_thumbnail_view_description\">נגינת סרטון, משך:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">תמונה ייצוגית של המפרסם</string>\n    <string name=\"detail_likes_img_view_description\">לייקים</string>\n    <string name=\"detail_dislikes_img_view_description\">לא אהבו</string>\n    <string name=\"search_no_results\">אין תוצאות</string>\n    <string name=\"empty_list_subtitle\">אין כאן כלום מלבד צרצרים</string>\n    <string name=\"video\">סרטון</string>\n    <string name=\"audio\">שמע</string>\n    <string name=\"retry\">ניסיון חוזר</string>\n    <string name=\"no_subscribers\">אין מנויים</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">מנוי אחד</item>\n        <item quantity=\"two\">שני מנויים</item>\n        <item quantity=\"many\">%s מנויים</item>\n        <item quantity=\"other\">%s מנויים</item>\n    </plurals>\n    <string name=\"no_views\">אין צפיות</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">צפייה אחת</item>\n        <item quantity=\"two\">שתי צפיות</item>\n        <item quantity=\"many\">%s צפיות</item>\n        <item quantity=\"other\">%s צפיות</item>\n    </plurals>\n    <string name=\"no_videos\">אין סרטונים</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">סרטון %s</item>\n        <item quantity=\"two\">%s סרטונים</item>\n        <item quantity=\"many\">%s סרטונים</item>\n        <item quantity=\"other\">%s סרטונים</item>\n    </plurals>\n    <string name=\"start\">התחלה</string>\n    <string name=\"pause\">השהיה</string>\n    <string name=\"delete\">מחיקה</string>\n    <string name=\"checksum\">גיבוב לאימות</string>\n    <string name=\"ok\">אישור</string>\n    <string name=\"msg_name\">שם קובץ</string>\n    <string name=\"msg_threads\">תהליכי משנה</string>\n    <string name=\"msg_error\">שגיאה</string>\n    <string name=\"msg_running\">NewPipe בהורדה</string>\n    <string name=\"msg_running_detail\">יש לגעת לפרטים נוספים</string>\n    <string name=\"msg_wait\">נא להמתין…</string>\n    <string name=\"msg_copied\">הועתק ללוח</string>\n    <string name=\"no_available_dir\">נא לציין תיקיית הורדה בהגדרות בהמשך</string>\n    <string name=\"msg_popup_permission\">הרשאה זו נדרשת לטובת \n\\nפתיחה בחלון צף</string>\n    <string name=\"title_activity_recaptcha\">אתגר reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">התקבלה בקשה לאתגר reCAPTCHA</string>\n    <string name=\"settings_category_downloads_title\">הורדה</string>\n    <string name=\"settings_file_charset_title\">רשימת תווים אפשרית בשמות קבצים</string>\n    <string name=\"settings_file_replacement_character_summary\">תווים לא נתמכים מוחלפים בערך הזה</string>\n    <string name=\"settings_file_replacement_character_title\">תו חלופי</string>\n    <string name=\"charset_letters_and_digits\">אותיות וספרות</string>\n    <string name=\"charset_most_special_characters\">רוב התווים המיוחדים</string>\n    <string name=\"title_activity_about\">על אודות NewPipe</string>\n    <string name=\"title_licenses\">רישיונות צד שלישי</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s ע״י %2$s תחת %3$s</string>\n    <string name=\"tab_about\">על אודות ושו״ת</string>\n    <string name=\"tab_licenses\">רישיונות</string>\n    <string name=\"app_description\">נגן קל וחופשי להזרמת מדיה עבור Android.</string>\n    <string name=\"contribution_title\">התנדבות</string>\n    <string name=\"contribution_encouragement\">אם יש לך רעיון כלשהו בנוגע לתרגום, שינויי עיצוב, ניקוי הקוד או שינויים מהותיים בקוד - אנו תמיד שמחים לקבל עזרה. ככל שיותר דברים מתבצעים כך היישומון משתפר!</string>\n    <string name=\"view_on_github\">הצגה ב־GitHub</string>\n    <string name=\"donation_title\">תרומה</string>\n    <string name=\"donation_encouragement\">הפיתוח של NewPipe נערך ע״י מתנדבים שמשקיעים את זמנם הפנוי כדי להגיש לך את חווית השימוש הטובה ביותר. באפשרותך להעניק בחזרה כדי לסייע למפתחים לשפר את NewPipe בעודם נהנים מכוס קפה.</string>\n    <string name=\"give_back\">לתרום בחזרה</string>\n    <string name=\"website_title\">אתר הבית</string>\n    <string name=\"website_encouragement\">מומלץ לבקר באתר של NewPipe לפרטים נוספים ולחדשות.</string>\n    <string name=\"app_license_title\">הרישיון של NewPipe</string>\n    <string name=\"read_full_license\">הצגת הרישיון</string>\n    <string name=\"title_activity_history\">היסטוריה</string>\n    <string name=\"action_history\">היסטוריה</string>\n    <string name=\"delete_item_search_history\">למחוק את הפריט הזה מהיסטוריית החיפושים\\?</string>\n    <string name=\"main_page_content\">תוכן הדף הראשי</string>\n    <string name=\"blank_page_summary\">עמוד ריק</string>\n    <string name=\"kiosk_page_summary\">עמוד גישה מזדמנת</string>\n    <string name=\"channel_page_summary\">עמוד הערוץ</string>\n    <string name=\"select_a_channel\">נא לבחור ערוץ</string>\n    <string name=\"no_channel_subscribed_yet\">אין עדיין מינויים לערוצים</string>\n    <string name=\"select_a_kiosk\">נא לבחור סוג גישה מזדמנת</string>\n    <string name=\"trending\">החמים</string>\n    <string name=\"top_50\">50 המובילים</string>\n    <string name=\"new_and_hot\">חדש וחם</string>\n    <string name=\"play_queue_remove\">הסרה</string>\n    <string name=\"play_queue_stream_detail\">פרטים</string>\n    <string name=\"play_queue_audio_settings\">אפשרויות שמע</string>\n    <string name=\"hold_to_append\">להחזיק כדי להוסיף לרשימת נגינה</string>\n    <string name=\"start_here_on_background\">להתחיל לנגן ברקע</string>\n    <string name=\"start_here_on_popup\">להתחיל לנגן בנגן צף</string>\n    <string name=\"controls_download_desc\">הורדת קובץ הזרמה</string>\n    <string name=\"show_info\">הצגת מידע</string>\n    <string name=\"tab_bookmarks\">רשימות השמעה מסומנות</string>\n    <string name=\"controls_add_to_playlist_title\">הוספה אל</string>\n    <string name=\"default_content_country_title\">מדינת תוכן כברירת מחדל</string>\n    <string name=\"settings_category_debug_title\">ניפוי שגיאות</string>\n    <string name=\"always\">תמיד</string>\n    <string name=\"just_once\">חד פעמי</string>\n    <string name=\"import_data_title\">ייבוא מסד נתונים</string>\n    <string name=\"export_data_title\">ייצוא מסד נתונים</string>\n    <string name=\"external_player_unsupported_link_type\">נגנים חיצוניים לא תומכים בסוגי קישורים כאלה</string>\n    <string name=\"file\">קובץ</string>\n    <string name=\"switch_to_background\">העברה לרקע</string>\n    <string name=\"switch_to_popup\">העברה לחלון צף</string>\n    <string name=\"no_player_found_toast\">לא נמצא נגן הזרמה (ניתן להתקין את VLC כדי לנגן זאת).</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">תמונות מטמון נמחקו</string>\n    <string name=\"metadata_cache_wipe_title\">ניקוי מטמון נתוני העל</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">מטמון נתוני העל התרוקן</string>\n    <string name=\"export_data_summary\">ייצוא היסטוריה, מינויים, רשימות נגינה והגדרות</string>\n    <string name=\"clear_views_history_title\">מחיקת היסטוריית הצפייה</string>\n    <string name=\"watch_history_deleted\">היסטוריית הצפייה נמחקה</string>\n    <string name=\"clear_search_history_title\">מחיקת היסטוריית החיפוש</string>\n    <string name=\"search_history_deleted\">היסטוריית החיפוש נמחקה</string>\n    <string name=\"invalid_file\">הקובץ אינו קיים או שחסרה הרשאה לקרוא אותו או לכתוב אליו</string>\n    <string name=\"file_name_empty_error\">שם הקובץ אינו יכול להיות ריק</string>\n    <string name=\"detail_drag_description\">ניתן לסדר מחדש בגרירה</string>\n    <string name=\"create\">יצירה</string>\n    <string name=\"dismiss\">התעלמות</string>\n    <string name=\"rename\">שינוי שם</string>\n    <string name=\"one_item_deleted\">פריט אחד נמחק.</string>\n    <string name=\"export_complete_toast\">הייצוא הסתיים</string>\n    <string name=\"import_complete_toast\">הייבוא הסתיים</string>\n    <string name=\"no_valid_zip_file\">אין קובץ ZIP תקין</string>\n    <string name=\"video_player\">נגן סרטונים</string>\n    <string name=\"background_player\">נגן רקע</string>\n    <string name=\"popup_player\">נגן צף</string>\n    <string name=\"always_ask_open_action\">לשאול תמיד</string>\n    <string name=\"preferred_player_fetcher_notification_title\">המידע מתקבל…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">התוכן המבוקש בטעינה</string>\n    <string name=\"create_playlist\">רשימת נגינה חדשה</string>\n    <string name=\"rename_playlist\">שינוי שם</string>\n    <string name=\"name\">שם</string>\n    <string name=\"add_to_playlist\">הוספה לרשימת נגינה</string>\n    <string name=\"bookmark_playlist\">הוספת רשימת נגינה לסימניות</string>\n    <string name=\"unbookmark_playlist\">הסרת סימנייה</string>\n    <string name=\"delete_playlist_prompt\">למחוק רשימת נגינה זו\\?</string>\n    <string name=\"playlist_creation_success\">רשימת הנגינה נוצרה</string>\n    <string name=\"playlist_add_stream_success\">נוסף לרשימת הנגינה</string>\n    <string name=\"playlist_thumbnail_change_success\">תמונת רשימת הנגינה הוחלפה.</string>\n    <string name=\"resize_fill\">מילוי</string>\n    <string name=\"resize_zoom\">תקריב</string>\n    <string name=\"caption_auto_generated\">נוצרו אוטומטית</string>\n    <string name=\"import_title\">ייבוא</string>\n    <string name=\"import_from\">ייבוא מ־</string>\n    <string name=\"export_to\">ייצוא אל</string>\n    <string name=\"import_ongoing\">מתבצע ייבוא…</string>\n    <string name=\"export_ongoing\">מתבצע ייצוא…</string>\n    <string name=\"import_file_title\">ייבוא קובץ</string>\n    <string name=\"previous_export\">ייצוא קודם</string>\n    <string name=\"subscriptions_import_unsuccessful\">לא ניתן לייבא את המינויים</string>\n    <string name=\"subscriptions_export_unsuccessful\">לא ניתן לייצא את המינויים</string>\n    <string name=\"import_youtube_instructions\">כדי לייבא את רשימת המינויים שלך מ־YouTube עליך להוריד את קובץ הייצוא:\n\\n\n\\n1. לעבור לכתובת הזו: %1$s\n\\n2. להיכנס אם נתבקשת\n\\n3. ללחוץ על „All data included”, ואז על „Deselect all”, לאחר מכן לבחור רק את „subscriptions” וללחוץ על „OK”\n\\n4. ללחוץ על „Next step” ואז על „Create export”\n\\n5. ללחוץ על כפתור ה־„Download” כשהוא מופיע\n\\n6. ללחוץ על „ייבוא קובץ” להלן ולבחור בקובץ ה־‎.zip שהורדת\n\\n7. (אם ייבוא ה־‎.zip נכשל) יש לחלץ את קובץ ה־‎.csv (בדרך כלל תחת „YouTube and YouTube Music/subscriptions/subscriptions.csv”), ללחוץ על „ייבוא קובץ” להלן וללחוץ על קובץ ה־csv שחולץ</string>\n    <string name=\"playback_tempo\">קצב</string>\n    <string name=\"use_inexact_seek_title\">שימוש בחיפוש מהיר ולא מדויק</string>\n    <string name=\"use_inexact_seek_summary\">חיפוש גס מאפשר לנגן לחפש נקודת זמן מהר יותר, ברמת דיוק נמוכה יותר. חיפוש של 5, 15 או 25 שניות לא עובד עם ההגדרה הזאת</string>\n    <string name=\"metadata_cache_wipe_summary\">הסרת כל נתוני העמודים שבמטמון</string>\n    <string name=\"auto_queue_title\">הוספת התזרים הבא לרשימת הנגינה אוטומטית</string>\n    <string name=\"auto_queue_summary\">להמשיך תור נגינה סופית (בלתי מחזורית) על ידי הוספת תזרים קשור</string>\n    <string name=\"switch_to_main\">העברה לראשי</string>\n    <string name=\"import_data_summary\">משכתב את ההיסטוריה, המינויים ו(אולי גם) את ההגדרות הנוכחיים שלך</string>\n    <string name=\"clear_views_history_summary\">מחיקת היסטוריית התזרימים שהתנגנו ומיקומי הנגינה</string>\n    <string name=\"channels\">ערוצים</string>\n    <string name=\"playlists\">רשימות נגינה</string>\n    <string name=\"tracks\">רצועות</string>\n    <string name=\"users\">משתמשים</string>\n    <string name=\"delete_view_history_alert\">למחוק את כל היסטוריית הצפייה\\?</string>\n    <string name=\"clear_search_history_summary\">מחיקת היסטוריית מילות החיפוש</string>\n    <string name=\"delete_search_history_alert\">למחוק את כל היסטוריית החיפוש\\?</string>\n    <string name=\"video_streams_empty\">לא נמצאו תזרימי וידאו</string>\n    <string name=\"audio_streams_empty\">לא נמצאו תזרימי שמע</string>\n    <string name=\"invalid_directory\">אין תיקייה כזו</string>\n    <string name=\"invalid_source\">אין מקור תיקייה/תוכן</string>\n    <string name=\"error_occurred_detail\">אירעה שגיאה: %1$s</string>\n    <string name=\"no_streams_available_download\">אין תזרימים זמינים להורדה</string>\n    <string name=\"privacy_policy_title\">מדיניות הפרטיות של NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">מיזם NewPipe שומר על הפרטיות שלך בצורה מאוד קפדנית. לפיכך, היישומון אינו אוסף נתונים ללא הסכמתך.\n\\nמדיניות הפרטיות של NewPipe מסבירה בפרטי פרטים אילו נתונים נשלחים ומאוחסנים בעת שליחת דיווח על תקלה.</string>\n    <string name=\"read_privacy_policy\">הצגת מדיניות הפרטיות</string>\n    <string name=\"app_license\">NewPipe הוא יישומון חופשי בהתאם לרישיון קופילפט: מותר לך להשתמש, לחקור, לשתף ולשפר בכל דרך שנראית לך. במיוחד מותר לך להפיץ מחדש ו/או לשנות תחת תנאי הרישיון הציבורי הכללי של GNU כפי שמופץ על ידי קרן התכנה החופשית, בין אם גרסה 3 של הרישיון או (לשיקולך) כל גרסה עדכנית יותר שלו.</string>\n    <string name=\"title_last_played\">התנגנו אחרונים</string>\n    <string name=\"title_most_played\">הכי נצפים</string>\n    <string name=\"could_not_import_all_files\">אזהרה: ייבוא חלק מהקבצים נכשל.</string>\n    <string name=\"override_current_data\">פעולה זו תדרוס את ההגדרות הקיימות.</string>\n    <string name=\"import_settings\">לייבא גם הגדרות\\?</string>\n    <string name=\"drawer_open\">פתיחת מגירה</string>\n    <string name=\"drawer_close\">סגירת מגירה</string>\n    <string name=\"preferred_open_action_settings_title\">פעולת ‚פתיחה’ מועדפת</string>\n    <string name=\"preferred_open_action_settings_summary\">פעולת ברירת מחדל בעת פתיחת תוכן - %s</string>\n    <string name=\"set_as_playlist_thumbnail\">הגדרה כתמונת רשימת הנגינה</string>\n    <string name=\"caption_none\">אין כתוביות</string>\n    <string name=\"resize_fit\">התאמה</string>\n    <string name=\"caption_setting_title\">כתוביות</string>\n    <string name=\"caption_setting_description\">שינוי גודל כותרת הנגן וסגנונות הרקע. נדרשת הפעלה מחדש כדי ששינויים אלה יכנסו לתוקף</string>\n    <string name=\"enable_leak_canary_summary\">מעקב אחר זליגת זיכרון עשויה לגרום ליישומון להיות בלתי זמין בזמן העתקת תוכן הזיכרון לקובץ</string>\n    <string name=\"import_soundcloud_instructions_hint\">המזהה שלך, soundcloud.com/המזהה שלך</string>\n    <string name=\"import_network_expensive_warning\">נא לשים לב כי פעולה זו עשויה להעמיס על תקשורת הנתונים. \n\\n \n\\nלהמשיך\\?</string>\n    <string name=\"unhook_checkbox\">ניתוק קשר (עלול ליצור עיוות)</string>\n    <string name=\"skip_silence_checkbox\">להאיץ קדימה כאשר שקט</string>\n    <string name=\"playback_step\">צעד</string>\n    <string name=\"playback_reset\">איפוס</string>\n    <string name=\"accept\">קבלה</string>\n    <string name=\"decline\">דחייה</string>\n    <string name=\"limit_data_usage_none_description\">ללא מגבלה</string>\n    <string name=\"minimize_on_exit_title\">מזעור בעת מעבר בין יישומונים</string>\n    <string name=\"minimize_on_exit_summary\">הפעולה לביצוע בעת מעבר ליישומון אחר מנגן הווידאו הראשי — %s</string>\n    <string name=\"minimize_on_exit_none_description\">כלום</string>\n    <string name=\"minimize_on_exit_background_description\">מזעור לנגן הרקע</string>\n    <string name=\"minimize_on_exit_popup_description\">הקטנה לנגן צף</string>\n    <string name=\"unsubscribe\">ביטול מינוי</string>\n    <string name=\"tab_choose\">בחירת לשונית</string>\n    <string name=\"settings_category_updates_title\">עדכונים</string>\n    <string name=\"file_deleted\">קובץ נמחק</string>\n    <string name=\"app_update_notification_channel_name\">התראת עדכון יישומון</string>\n    <string name=\"app_update_notification_channel_description\">התראות על גרסאות חדשות של NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">האחסון החיצוני אינו זמין</string>\n    <string name=\"download_to_sdcard_error_message\">אין אפשרות להוריד לכרטיס SD. לאפס את מיקום תיקיית ההורדה\\?</string>\n    <string name=\"saved_tabs_invalid_json\">לא ניתן לקרוא לשוניות שמורות, לכן נעשה שימוש באלו של ברירת המחדל</string>\n    <string name=\"restore_defaults\">שחזור ברירת מחדל</string>\n    <string name=\"restore_defaults_confirmation\">לשחזר ברירת מחדל\\?</string>\n    <string name=\"subscribers_count_not_available\">מספר המנויים אינו זמין</string>\n    <string name=\"main_page_content_summary\">אילו לשוניות תופענה בעמוד הראשי</string>\n    <string name=\"events\">אירועים</string>\n    <string name=\"conferences\">כנסים</string>\n    <string name=\"enable_disposed_exceptions_title\">דיווח על שגיאות שמחוץ למחזור החיים</string>\n    <string name=\"enable_disposed_exceptions_summary\">אילוץ דיווח על חריגות מחוץ למקטעים או למחזור חיי הפעילות לאחר ההשלכה בתשדורת יוצאת</string>\n    <string name=\"import_soundcloud_instructions\">ניתן לייבא פרופיל SoundCloud על ידי הקלדת הכתובת או המזהה שלך:\n\\n\n\\n1. עליך להפעיל „מצב שולחן עבודה” בדפדפן שלך (האתר לא זמין למכשירים ניידים)\n\\n2. לעבור לכתובת הזו: %1$s\n\\n3. להיכנס אם נתבקשת\n\\n4. להעתיק את כתובת הפרופיל אליו הועברת.</string>\n    <string name=\"playback_speed_control\">בקרי מהירות נגינה</string>\n    <string name=\"playback_pitch\">גובה צליל</string>\n    <string name=\"limit_mobile_data_usage_title\">הגבלת הרזולוציה בעת שימוש בנתונים סלולריים</string>\n    <string name=\"start_accept_privacy_policy\">כדי לעמוד בדרישות האסדרה הכללית להגנה על מידע (GDPR), אנו מפנים את תשומת לבך למדיניות הפרטיות של NewPipe. נא לקרוא אותה בעיון רב.\n\\nעליך לאשר את הסכמתך למדיניות כדי לשלוח לנו דיווחים על תקלות.</string>\n    <string name=\"updates_setting_title\">עדכונים</string>\n    <string name=\"updates_setting_description\">הצגת התראה כדי להודיע על עדכון ליישומון כשיוצאת גרסה חדשה לאור</string>\n    <string name=\"list_view_mode\">מצב תצוגת רשימה</string>\n    <string name=\"list\">רשימה</string>\n    <string name=\"grid\">טבלה</string>\n    <string name=\"auto\">אוטומטית</string>\n    <string name=\"app_update_available_notification_title\">יצא עדכון ל־NewPipe!</string>\n    <string name=\"missions_header_finished\">הסתיים</string>\n    <string name=\"paused\">מושהה</string>\n    <string name=\"queued\">בתור</string>\n    <string name=\"post_processing\">עיבוד מאוחר</string>\n    <string name=\"enqueue\">הוספה לתור</string>\n    <string name=\"permission_denied\">הפעולה נדחתה על ידי המערכת</string>\n    <string name=\"download_failed\">ההורדה נכשלה</string>\n    <string name=\"generate_unique_name\">יצירת שם ייחודי</string>\n    <string name=\"overwrite\">שכתוב</string>\n    <string name=\"overwrite_finished_warning\">כבר קיים קובץ בשם הזה</string>\n    <string name=\"download_already_running\">אחת ההורדות הפעילות כבר נושאת את השם הזה</string>\n    <string name=\"show_error\">הצגת שגיאה</string>\n    <string name=\"error_file_creation\">לא ניתן ליצור את הקובץ</string>\n    <string name=\"error_path_creation\">לא ניתן ליצור את תיקיית היעד</string>\n    <string name=\"error_ssl_exception\">לא ניתן להקים חיבור מאובטח</string>\n    <string name=\"error_unknown_host\">לא ניתן למצוא את השרת</string>\n    <string name=\"error_connect_host\">לא ניתן להתחבר לשרת</string>\n    <string name=\"error_http_no_content\">השרת לא שולח נתונים</string>\n    <string name=\"error_http_unsupported_range\">השרת לא מקבל הורדות רב ערוציות, מוטב לנסות שוב עם ‎@string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">לא נמצא</string>\n    <string name=\"error_postprocessing_failed\">העיבוד המאוחר נכשל</string>\n    <string name=\"stop\">עצירה</string>\n    <string name=\"max_retry_msg\">מספר הניסיונות החוזרים המרבי</string>\n    <string name=\"max_retry_desc\">מספר הניסיונות החוזרים המרבי בטרם ביטול ההורדה</string>\n    <string name=\"pause_downloads_on_mobile\">לייצר הפרעה ברשתות מדודות</string>\n    <string name=\"pause_downloads_on_mobile_desc\">שימושי בעת מעבר לחיבור רשת סלולרית, למרות שישנן הורדות שלא ניתן להשהות</string>\n    <string name=\"show_comments_title\">הצגת תגובות</string>\n    <string name=\"show_comments_summary\">יש להשבית כדי להסתיר תגובות</string>\n    <string name=\"autoplay_title\">ניגון אוטומטי</string>\n    <string name=\"no_comments\">אין תגובות</string>\n    <string name=\"error_unable_to_load_comments\">לא ניתן לטעון תגובות</string>\n    <string name=\"close\">סגירה</string>\n    <string name=\"missions_header_pending\">בהמתנה</string>\n    <string name=\"enable_playback_resume_title\">להמשיך בנגינה</string>\n    <string name=\"enable_playback_resume_summary\">לשחזר את מיקום הנגינה האחרון</string>\n    <string name=\"enable_playback_state_lists_title\">מיקומים ברשימות</string>\n    <string name=\"enable_playback_state_lists_summary\">להציג מחווני מיקומי נגינה ברשימות</string>\n    <string name=\"settings_category_clear_data_title\">לנקות את הנתונים</string>\n    <string name=\"watch_history_states_deleted\">מיקומי הנגינה נמחקו</string>\n    <string name=\"missing_file\">הקובץ הועבר או נמחק</string>\n    <string name=\"overwrite_unrelated_warning\">כבר קיים קובץ בשם הזה</string>\n    <string name=\"overwrite_failed\">לא ניתן לשכתב את הקובץ</string>\n    <string name=\"download_already_pending\">כבר יש הורדה ממתינה בשם הזה</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe נסגר בזמן העבודה על הקובץ</string>\n    <string name=\"error_insufficient_storage_left\">לא נשאר מקום במכשיר</string>\n    <string name=\"error_progress_lost\">התהליך אבד כיוון שהקובץ נמחק</string>\n    <string name=\"error_timeout\">החיבור המתין זמן רב מדי</string>\n    <string name=\"confirm_prompt\">למחוק את היסטוריית ההורדות שלך או למחוק את כל הקבצים שהורדת\\?</string>\n    <string name=\"enable_queue_limit\">הגבלת תור ההורדה</string>\n    <string name=\"enable_queue_limit_desc\">רק הורדה אחת תרוץ בו־זמנית</string>\n    <string name=\"start_downloads\">התחלת הורדות</string>\n    <string name=\"pause_downloads\">השהיית הורדות</string>\n    <string name=\"downloads_storage_ask_title\">לשאול לאן להוריד</string>\n    <string name=\"downloads_storage_ask_summary\">תופיע שאלה לאן לשמור כל הורדה.\n\\nיש להפעיל את בוחר התיקיות של המערכת (SAF) כדי להוריד לכרטיס SD חיצוני</string>\n    <string name=\"downloads_storage_use_saf_title\">שימוש בבוחר התיקיות של המערכת (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">‚תשתית גישה לאחסון’ מאפשרת הורדות לכרטיס SD חיצוני</string>\n    <string name=\"clear_playback_states_title\">מחיקת מיקומי נגינה</string>\n    <string name=\"clear_playback_states_summary\">מחיקת כל מיקומי הנגינה</string>\n    <string name=\"delete_playback_states_alert\">למחוק את מיקומי הנגינה\\?</string>\n    <string name=\"drawer_header_description\">הפעלה/כיבוי שירות, בחירה נוכחית:</string>\n    <string name=\"no_one_watching\">אין צופים</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">צופה %s</item>\n        <item quantity=\"two\">%s צופים</item>\n        <item quantity=\"many\">%s צופים</item>\n        <item quantity=\"other\">%s צופים</item>\n    </plurals>\n    <string name=\"no_one_listening\">אין מאזינים</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">מאזין %s</item>\n        <item quantity=\"two\">%s מאזינים</item>\n        <item quantity=\"many\">%s מאזינים</item>\n        <item quantity=\"other\">%s מאזינים</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">קיוסק ברירת מחדל</string>\n    <string name=\"seek_duration_title\">משך קפיצה מהירה קדימה/אחורה</string>\n    <string name=\"peertube_instance_url_title\">מופעים של PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">נא לבחור את מופעי ה־PeerTube המועדפים עליך</string>\n    <string name=\"peertube_instance_url_help\">איתור המופעים האהובים עליך תחת %s</string>\n    <string name=\"peertube_instance_add_title\">הוספת מופע</string>\n    <string name=\"peertube_instance_add_help\">נא להכניס כתובת מופע</string>\n    <string name=\"peertube_instance_add_fail\">לא ניתן לאמת את המופע</string>\n    <string name=\"peertube_instance_add_https_only\">יש תמיכה בכתובות HTTPS בלבד</string>\n    <string name=\"peertube_instance_add_exists\">המופע כבר קיים</string>\n    <string name=\"local\">מקומי</string>\n    <string name=\"recently_added\">נוספו לאחרונה</string>\n    <string name=\"most_liked\">האהובים ביותר</string>\n    <string name=\"playlist_no_uploader\">נוצרה אוטומטית (לא נמצא מעלה)</string>\n    <string name=\"recovering\">בשחזור</string>\n    <string name=\"error_download_resource_gone\">לא ניתן לשחזר את ההורדה הזאת</string>\n    <string name=\"choose_instance_prompt\">נא לבחור מופע</string>\n    <string name=\"clear_download_history\">מחיקת היסטוריית ההורדות</string>\n    <string name=\"delete_downloaded_files\">למחוק את הקבצים שהורדתי</string>\n    <string name=\"permission_display_over_apps\">יש להעניק הרשאה להציג על גבי יישומונים אחרים</string>\n    <string name=\"app_language_title\">שפת היישומון</string>\n    <string name=\"systems_language\">ברירת המחדל של המערכת</string>\n    <string name=\"subtitle_activity_recaptcha\">יש ללחוץ על „סיום” לאחר הפתירה</string>\n    <string name=\"done\">סיום</string>\n    <string name=\"videos_string\">סרטונים</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">שנייה אחת</item>\n        <item quantity=\"two\">שתי שניות</item>\n        <item quantity=\"many\">%d שניות</item>\n        <item quantity=\"other\">%d שניות</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">עקב מגבלות של ExoPlayer מגבלות טווחי החיפוש הוגדרו לכדי %d שניות</string>\n    <string name=\"mute\">השתקה</string>\n    <string name=\"unmute\">ביטול השתקה</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">דקה</item>\n        <item quantity=\"two\">שתי דקות</item>\n        <item quantity=\"many\">%d דקות</item>\n        <item quantity=\"other\">%d דקות</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">שעה</item>\n        <item quantity=\"two\">שעתיים</item>\n        <item quantity=\"many\">%d שעות</item>\n        <item quantity=\"other\">%d שעות</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">יום</item>\n        <item quantity=\"two\">יומיים</item>\n        <item quantity=\"many\">%d ימים</item>\n        <item quantity=\"other\">%d ימים</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">קבוצות ערוצים</string>\n    <string name=\"feed_oldest_subscription_update\">עדכון ההזנה האחרון: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">לא נטען: %d</string>\n    <string name=\"feed_notification_loading\">ההזנה נטענת…</string>\n    <string name=\"feed_processing_message\">ההזנה בהליכי עיבוד…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">בחירת מינויים</string>\n    <string name=\"feed_group_dialog_empty_selection\">לא נבחר מינוי</string>\n    <string name=\"feed_group_dialog_empty_name\">שם הקבוצה ריק</string>\n    <string name=\"feed_group_dialog_delete_message\">למחוק את הקבוצה הזאת\\?</string>\n    <string name=\"feed_create_new_group_button_title\">חדשה</string>\n    <string name=\"settings_category_feed_title\">הזנה</string>\n    <string name=\"feed_update_threshold_title\">סף עדכון ההזנה</string>\n    <string name=\"feed_update_threshold_option_always_update\">לעדכן תמיד</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">הפעלת מצב מהיר</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">השבתת מצב מהיר</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">נבחר אחד</item>\n        <item quantity=\"two\">%d נבחרו</item>\n        <item quantity=\"many\">%d נבחרו</item>\n        <item quantity=\"other\">%d נבחרו</item>\n    </plurals>\n    <string name=\"feed_update_threshold_summary\">הזמן לאחר העדכון האחרון בטרם מינוי נחשב לבלתי עדכני — %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">לקבל מהזנה ייעודית כשניתן</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">זמין בחלק מהשירותים, האפשרות הזאת בדרך כלל מהירה יותר אך עשויה להחזיר כמות מוגבלת של פריטים ולעתים פרטים חלקיים (למשל: חסר משך הפרק, סוג הפריט, אין מצב חי)</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">לדעתך הטעינה אטית מדי\\? אם זה המצב אצלך, כדאי לנסות להפעיל טעינה מהירה (ניתן לשנות בהגדרות או על ידי לחיצה על הכפתור שלהלן).\n\\n\n\\nהיישומון NewPipe מציע שתי אסטרטגיות לטעינת הזנה:\n\\n• הורדת כל ערוץ המינוי, אטי אבל שלם.\n\\n• באמצעות נקודת קצה ייעודית, מהיר אבל חלקי.\n\\n\n\\nההבדל בין השתיים הוא שבמהירה חסרים פרטים, כמו משך הפריט או סוגו (אין אפשרות להבדיל בין סרטונים חיים לרגילים) והיא עשויה להחזיר פחות פריטים.\n\\n\n\\nYouTube זאת דוגמה לשירות שמציע את השיטה המהירה הזאת עם הזנת ה־RSS שלו.\n\\n\n\\nלכן עומדת בפניך הבחירה: מהירות או דיוק בפרטים.</string>\n    <string name=\"content_not_supported\">תוכן זה לא נתמך עדיין על ידי NewPipe.\n\\n\n\\nאנו מקווים שתתווסף תמיכה בגרסאות עתידיות.</string>\n    <string name=\"infinite_videos\">∞ סרטונים</string>\n    <string name=\"more_than_100_videos\">למעלה מ־100 סרטונים</string>\n    <string name=\"artists\">אמנים</string>\n    <string name=\"albums\">אלבומים</string>\n    <string name=\"songs\">שירים</string>\n    <string name=\"restricted_video\">סרטון זה מוגבל לצפייה מגיל מסוים.\n\\n\n\\nיש להפעיל את „%1$s” בהגדרות כדי לצפות בו.</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">כן, לרבות סרטונים שהפסקתי באמצע</string>\n    <string name=\"remove_watched_popup_warning\">תזרימים שלאחר שצפית בהם לפני ואחרי שנוספו לרשימת הנגינה יוסרו. \\nלהמשיך?</string>\n    <string name=\"remove_watched\">הסרת נצפו</string>\n    <string name=\"remove_watched_popup_title\">להסיר תזרימים שנצפו?</string>\n    <string name=\"show_original_time_ago_summary\">הטקסט המקורי משירותים יופיע בפריטי התזרים</string>\n    <string name=\"show_original_time_ago_title\">הצגת לפני כמה זמן מקורי על פריטים</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">הפעלת „מצב מוגבל” של YouTube</string>\n    <string name=\"video_detail_by\">מאת %s</string>\n    <string name=\"channel_created_by\">נוצר ע״י %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">תמונה ממוזערת של הערוץ</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">להציג רק מינויים שאינם בקבוצות</string>\n    <string name=\"playlist_page_summary\">עמוד רשימות נגינה</string>\n    <string name=\"no_playlist_bookmarked_yet\">אין עדיין סימניות ברשימת הנגינה</string>\n    <string name=\"select_a_playlist\">בחירת רשימת נגינה</string>\n    <string name=\"error_report_open_github_notice\">נא לבדוק אם כבר קיים דיווח על הקריסה שלך. יצירת דיווחים כפולים גוזלת מאתנו זמן שיכולנו להשקיע בתיקון התקלה עצמה.</string>\n    <string name=\"error_report_open_issue_button_text\">דיווח ב־GitHub</string>\n    <string name=\"copy_for_github\">העתקת דוח מעוצב</string>\n    <string name=\"search_showing_result_for\">מוצגות תוצאות עבור: %s</string>\n    <string name=\"never\">אף פעם לא</string>\n    <string name=\"wifi_only\">רק עם רשת אלחוטית</string>\n    <string name=\"autoplay_summary\">להתחיל לנגן אוטומטית — %s</string>\n    <string name=\"title_activity_play_queue\">תור נגינה</string>\n    <string name=\"unsupported_url_dialog_message\">לא ניתן לזהות את הכתובת. לפתוח אותה ביישומון אחר\\?</string>\n    <string name=\"auto_queue_toggle\">סידור אוטומטי בתור</string>\n    <string name=\"clear_queue_confirmation_description\">התור מהנגן הפעיל יוחלף</string>\n    <string name=\"clear_queue_confirmation_summary\">מעבר מנגן אחד למשנהו עלול להחליף את התור שלך</string>\n    <string name=\"clear_queue_confirmation_title\">לבקש אישור לפני מחיקת התור</string>\n    <string name=\"notification_action_nothing\">כלום</string>\n    <string name=\"notification_action_buffering\">איסוף</string>\n    <string name=\"notification_action_shuffle\">ערבוב</string>\n    <string name=\"notification_action_repeat\">חזרה</string>\n    <string name=\"notification_actions_at_most_three\">ניתן לבחור עד שלוש פעולות בלבד שתופענה בהתראות המצומצמות!</string>\n    <string name=\"notification_actions_summary\">ניתן לערוך כל התראה להלן בלחיצה עליה. מותר לבחור עד שלוש מהן שתופענה בהתראה המצומצמת באמצעות תיבות הסימן שמשמאל.</string>\n    <string name=\"notification_action_4_title\">כפתור פעולה חמישי</string>\n    <string name=\"notification_action_3_title\">כפתור פעולה רביעי</string>\n    <string name=\"notification_action_2_title\">כפתור פעולה שלישי</string>\n    <string name=\"notification_action_0_title\">כפתור פעולה ראשון</string>\n    <string name=\"notification_action_1_title\">כפתור פעולה שני</string>\n    <string name=\"notification_scale_to_square_image_summary\">חיתוך התצוגה הממוזערת שמופיעה בהתראות מיחס תצוגה של 16:9 ל־1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">חיתוך התצוגה הממוזערת ליחס תצוגה 1:1</string>\n    <string name=\"show_memory_leaks\">הצגת דליפות זיכרון</string>\n    <string name=\"enqueued\">נוסף לתור</string>\n    <string name=\"enqueue_stream\">הוספה לתור</string>\n    <string name=\"clear_cookie_summary\">לנקות עוגיות שנשמרות על ידי NewPipe בעת פתרון reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">העוגיות של ה־reCAPTCHA נמחקו</string>\n    <string name=\"clear_cookie_title\">פינוי עוגיות reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">פלטפורמת YouTube מספקת „מצב מוגבל” שמסתיר תוכן שעשוי להתאים למבוגרים בלבד</string>\n    <string name=\"show_age_restricted_content_summary\">הצגת תוכן שעלול להיות בלתי הולם לילדים עקב מגבלת גיל (כגון 18+)</string>\n    <string name=\"notification_colorize_summary\">לאפשר ל־Android להתאים את צבע ההתראה בהתאם לצבע העיקרי של התמונה הממוזערת (לא זמין בכל המכשירים)</string>\n    <string name=\"notification_colorize_title\">צביעת ההתראה</string>\n    <string name=\"show_thumbnail_summary\">להשתמש בתמונה ממוזערת גם כרקע מסך הנעילה וגם בהתראות</string>\n    <string name=\"show_thumbnail_title\">הצגת תמונה ממוזערת</string>\n    <string name=\"msg_calculating_hash\">הגיבוב</string>\n    <string name=\"hash_channel_description\">התראות על תהליכי גיבוב</string>\n    <string name=\"hash_channel_name\">התראת גיבוב סרטון</string>\n    <string name=\"recent\">לאחרונה</string>\n    <string name=\"show_meta_info_summary\">לכבות את התיבות שמציגות את המידע על יוצרי התזרים, תוכן התזרים או בקשת חיפוש</string>\n    <string name=\"show_meta_info_title\">הצגת מידע על</string>\n    <string name=\"chapters\">פרקים</string>\n    <string name=\"description_tab_description\">תיאור</string>\n    <string name=\"related_items_tab_description\">תזרימים קשורים</string>\n    <string name=\"comments_tab_description\">הערות</string>\n    <string name=\"show_description_summary\">יש לכבות כדי להסתיר תיאורי סרטונים ומידע נוסף</string>\n    <string name=\"show_description_title\">הצגת תיאור</string>\n    <string name=\"open_with\">פתיחה באמצעות</string>\n    <string name=\"no_app_to_open_intent\">אין יישומון על המכשיר שלך שיכול לפתוח את זה</string>\n    <string name=\"crash_the_app\">להקריס את היישומון</string>\n    <string name=\"paid_content\">התוכן הזה זמין רק למשתמשים ששילמו, לכן לא ניתן להזרים או להוריד אותו עם NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">סרטון זה זמין רק למנויי YouTube Music Premium, לכן לא ניתן להזרים או להוריד אותו עם NewPipe.</string>\n    <string name=\"private_content\">זה תוכן פרטי, לכן לא ניתן להזרים או להוריד אותו עם NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">רצועה זו של SoundCloud Go+‎ מוגבלת, לפחות במדינה שלך, לכן לא ניתן להזרים או להוריד אותה עם NewPipe.</string>\n    <string name=\"georestricted_content\">תוכן זה אינו זמין במדינה שלך.</string>\n    <string name=\"restricted_video_no_stream\">הצפייה בסרטון הזה מוגבלת בגיל.\n\\nעקב מדיניות חדשה ב־YouTube בנוגע לסרטונים מוגבלי גיל, ל־NewPipe אין אפשרות לגשת לתזרימי הווידאו של השירות ולכן אין אפשרות לנגן אותם.</string>\n    <string name=\"download_has_started\">ההורדה החלה</string>\n    <string name=\"select_night_theme_toast\">באפשרותך לבחור את ערכת העיצוב הלילית המועדפת עליך להלן</string>\n    <string name=\"night_theme_summary\">נא לבחור את ערכת העיצוב הלילית המועדפת עליך — %s</string>\n    <string name=\"auto_device_theme_title\">אוטומטי (לפי ערכת העיצוב של המכשיר)</string>\n    <string name=\"radio\">ברירה</string>\n    <string name=\"featured\">מובילים</string>\n    <string name=\"recaptcha_solve\">לפתור</string>\n    <string name=\"night_theme_title\">ערכת עיצוב לילית</string>\n    <string name=\"show_channel_details\">להציג את פרטי הערוץ</string>\n    <string name=\"disable_media_tunneling_summary\">כדאי להשבית תיעול מדיה אם הופיעה תופעה של מסך שחור או גמגום בנגינת וידאו.</string>\n    <string name=\"disable_media_tunneling_title\">השבתת תיעול מדיה</string>\n    <string name=\"metadata_privacy_internal\">פנימי</string>\n    <string name=\"metadata_privacy_private\">פרטי</string>\n    <string name=\"metadata_privacy_unlisted\">לא מופיע ברשימות</string>\n    <string name=\"metadata_privacy_public\">ציבורי</string>\n    <string name=\"metadata_host\">אירוח</string>\n    <string name=\"metadata_support\">תמיכה</string>\n    <string name=\"metadata_language\">שפה</string>\n    <string name=\"metadata_age_limit\">הגבלת גיל</string>\n    <string name=\"metadata_privacy\">פרטיות</string>\n    <string name=\"metadata_licence\">רישיון</string>\n    <string name=\"metadata_tags\">תגיות</string>\n    <string name=\"metadata_category\">קטגוריה</string>\n    <string name=\"description_select_disable\">השבתת בחירת טקסט בתיאור</string>\n    <string name=\"description_select_enable\">הפעלת בחירת טקסט בתיאור</string>\n    <string name=\"description_select_note\">מעתה ניתן לבחור טקסט בתוך התיאור. נא לשים לב שהעמוד עשוי להבהב והקישורים לא יהיו לחיצים בזמן מצב הבחירה.</string>\n    <string name=\"feed_load_error_terminated\">חשבון היוצר הושמד.\n\\nל־NewPipe לא תהיה אפשרות להוריד את ההזנה הזאת בעתיד.\n\\nלהסיר את המינוי מהערוץ הזה\\?</string>\n    <string name=\"open_website_license\">פתיחת האתר</string>\n    <string name=\"account_terminated\">החשבון הושמד</string>\n    <string name=\"feed_load_error_fast_unknown\">מצב ההזנה המהירה לא מספק מידע נוסף על כך.</string>\n    <string name=\"feed_load_error_account_info\">לא ניתן לטעון את ההזנה עבור ‚%s’.</string>\n    <string name=\"feed_load_error\">שגיאה בהורדת ההזנה</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">התמיכה ב‚תשתית גישה לאחסון’ נתמכת מ־Android 10 בלבד</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">תופיע שאלה לאן לשמור כל הורדה</string>\n    <string name=\"no_dir_yet\">טרם הוגדרה תיקיית הורדה, נא לבחור את תיקיית ההורדה כעת</string>\n    <string name=\"off\">כבוי</string>\n    <string name=\"on\">פעיל</string>\n    <string name=\"tablet_mode_title\">מצב מחשב לוח</string>\n    <string name=\"comments_are_disabled\">תגובות מושבתות</string>\n    <string name=\"dont_show\">לא להציג</string>\n    <string name=\"low_quality_smaller\">איכות נמוכה (קטן יותר)</string>\n    <string name=\"high_quality_larger\">איכות גבוהה (גדול יותר)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">תמונה מוקטנת בסרגל הנגינה</string>\n    <string name=\"detail_heart_img_view_description\">סומן בלב על ידי היוצר</string>\n    <string name=\"mark_as_watched\">סימון כנצפה</string>\n    <string name=\"remote_search_suggestions\">הצעות חיפוש מרוחקות</string>\n    <string name=\"local_search_suggestions\">הצעות חיפוש מקומיות</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">הורדה אחת נמחקה</item>\n        <item quantity=\"two\">%1$s הורדות נמחקו</item>\n        <item quantity=\"many\">%1$s הורדות נמחקו</item>\n        <item quantity=\"other\">%1$s הורדות נמחקו</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">הורדה הסתיימה</item>\n        <item quantity=\"two\">%s הורדות הסתיימו</item>\n        <item quantity=\"many\">%s הורדות הסתיימו</item>\n        <item quantity=\"other\">%s הורדות הסתיימו</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">ניתן להחליק פריטים להסרתם</string>\n    <string name=\"start_main_player_fullscreen_summary\">לא להפעיל סרטונים בנגן המוקטן, לעבור למצב מסך מלא ישירות במקום זאת, אם הטיה אוטומטית מושבתת. עדיין ניתן לגשת לנגן המוקטן על ידי יציאה ממסך מלא</string>\n    <string name=\"start_main_player_fullscreen_title\">הפעלת הנגן הראשי במסך מלא</string>\n    <string name=\"enqueued_next\">נוסף כהבא בתור</string>\n    <string name=\"enqueue_next_stream\">הוספה כהבא בתור</string>\n    <string name=\"processing_may_take_a_moment\">מתבצע עיבוד… נא להמתין רגע קט</string>\n    <string name=\"check_for_updates\">איתור עדכונים</string>\n    <string name=\"checking_updates_toast\">מתבצע איתור עדכונים…</string>\n    <string name=\"manual_update_description\">לנסות לאתר גרסאות חדשות ידנית</string>\n    <string name=\"feed_new_items\">פריטים חדשים בהזנה</string>\n    <string name=\"crash_the_player\">להקריס את הנגן</string>\n    <string name=\"show_crash_the_player_title\">הצגת „להקריס את הנגן”</string>\n    <string name=\"show_crash_the_player_summary\">הצגת אפשרות קריסה בעת שימוש בנגן</string>\n    <string name=\"error_report_channel_description\">התראות לדיווח על שגיאות</string>\n    <string name=\"show_error_snackbar\">הצגת חלונית בזק עם שגיאה</string>\n    <string name=\"create_error_notification\">יצירת התראת שגיאה</string>\n    <string name=\"error_report_notification_title\">NewPipe נתקל בשגיאה, לחיצה תדווח על כך</string>\n    <string name=\"error_report_notification_toast\">אירעה שגיאה, נא לקרוא את ההתראה</string>\n    <string name=\"no_appropriate_file_manager_message\">לא נמצא מנהל קבצים מתאים לפעולה זו.\n\\nנא להתקין מנהל קבצים או לנסות להשבית את ‚%s’ בהגדרות ההורדה</string>\n    <string name=\"error_report_channel_name\">התראת דיווח שגיאה</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">לא נמצאו מנהלי קבצים שמתאימים לפעולה הזאת.\n\\nנא להתקין מנהל קבצים שתומך בתשתית גישה לאחסון</string>\n    <string name=\"detail_pinned_comment_view_description\">הערה ננעצה</string>\n    <string name=\"leak_canary_not_available\">LeakCanary אינה זמינה</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ברירת מחדל של ExoPlayer</string>\n    <string name=\"streams_notification_channel_description\">התראות על תזרימים חדשים להרשמה</string>\n    <string name=\"streams_notifications_interval_title\">תדירות בדיקה</string>\n    <string name=\"streams_notifications_network_title\">נדרש חיבור לרשת</string>\n    <string name=\"get_notified\">קבלת הודעה</string>\n    <string name=\"toggle_all\">להחליף את המצב של הכול</string>\n    <string name=\"settings_category_player_notification_summary\">הגדרת התראת התזרים שמתנגן כרגע</string>\n    <string name=\"notifications\">התראות</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">תזרים חדש</item>\n        <item quantity=\"two\">%s תזרימים חדשים</item>\n        <item quantity=\"many\">%s תזרימים חדשים</item>\n        <item quantity=\"other\">%s תזרימים חדשים</item>\n    </plurals>\n    <string name=\"loading_stream_details\">פרטי התזרים נטענים…</string>\n    <string name=\"check_new_streams\">הרצת בדיקה על תזרימים חדשים</string>\n    <string name=\"enable_streams_notifications_title\">התראות תזרימים חדשים</string>\n    <string name=\"enable_streams_notifications_summary\">הודעה על תזרימים חדשים מהמינויים</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"streams_notification_channel_name\">תזרימים חדשים</string>\n    <string name=\"settings_category_player_notification_title\">התראות נגן</string>\n    <string name=\"any_network\">רשת כלשהי</string>\n    <string name=\"delete_downloaded_files_confirm\">למחוק את כל הקבצים שהורדו מהכונן\\?</string>\n    <string name=\"notifications_disabled\">התראות מושבתות</string>\n    <string name=\"you_successfully_subscribed\">נרשמת לערוץ הזה</string>\n    <string name=\"percent\">אחוז</string>\n    <string name=\"semitone\">חצי טון</string>\n    <string name=\"streams_not_yet_supported_removed\">תזרימים שעדיין לא נתמכים על ידי המוריד לא מופיעים</string>\n    <string name=\"selected_stream_external_player_not_supported\">התזרים הנבחר לא נתמך על ידי נגנים חיצוניים</string>\n    <string name=\"no_audio_streams_available_for_external_players\">אין תזרימי שמע שזמינים לנגנים חיצוניים</string>\n    <string name=\"unknown_quality\">איכות לא מוכרת</string>\n    <string name=\"no_video_streams_available_for_external_players\">אין תזרימי וידאו שזמינים לנגנים חיצוניים</string>\n    <string name=\"select_quality_external_players\">בחירת איכות לנגנים חיצוניים</string>\n    <string name=\"unknown_format\">תצורה לא מוכרת</string>\n    <string name=\"progressive_load_interval_title\">גודל משך טעינת נגינה</string>\n    <string name=\"sort\">מיון</string>\n    <string name=\"faq\">הצגה באתר</string>\n    <string name=\"faq_title\">תשובות לשאלות נפוצות</string>\n    <string name=\"faq_description\">אם נתקלת בתקלות כשניסית להשתמש ביישומון, כדאי לעיין בתשובות לשאלות הנפוצות!</string>\n    <string name=\"import_subscriptions_hint\">ניתן לייבא או לייצא מינויים מתפריט 3 הנקודות</string>\n    <string name=\"app_update_available_notification_text\">נגיעה כאן תוריד את %s</string>\n    <string name=\"fast_mode\">מצב מהיר</string>\n    <string name=\"app_update_unavailable_toast\">זאת הגרסה העדכנית ביותר של NewPipe</string>\n    <string name=\"night_theme_available\">אפשרות זאת זמינה רק אם נבחרה ערכת נושא %s</string>\n    <string name=\"unset_playlist_thumbnail\">ביטול הגדרת תמונה ייצוגית קבועה</string>\n    <string name=\"card\">כרטיס</string>\n    <string name=\"msg_failed_to_copy\">ההעתקה ללוח הגזירים נכשלה</string>\n    <string name=\"duplicate_in_playlist\">רשימות הנגינה שבוטלו וסומנו באפור כבר מכילות את הפריט הזה.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">הכפיל נוסף %d פעמים</string>\n    <string name=\"ignore_hardware_media_buttons_title\">התעלמות מאירועי כפתורי מדיה חומרתיים</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">שימושי, למשל, אם יש לך אוזניות עם כפתורי חומרה מקולקלים</string>\n    <string name=\"left_gesture_control_title\">פעולת מחווה שמאלית</string>\n    <string name=\"right_gesture_control_title\">פעולת מחווה ימנית</string>\n    <string name=\"volume\">עוצמת שמע</string>\n    <string name=\"none\">בלי</string>\n    <string name=\"remove_duplicates_message\">להסיר את כל השידורים הכפולים ברשימת הנגינה\\?</string>\n    <string name=\"feed_show_partially_watched\">נצפו חלקית</string>\n    <string name=\"feed_show_upcoming\">בקרוב</string>\n    <string name=\"brightness\">בהירות</string>\n    <string name=\"left_gesture_control_summary\">נא לבחור מחווה לחצי השמאלי של מסך הנגן</string>\n    <string name=\"right_gesture_control_summary\">נא לבחור מחווה לחצי הימני של מסך הנגן</string>\n    <string name=\"remove_duplicates\">הסרת כפילויות</string>\n    <string name=\"remove_duplicates_title\">להסיר כפילויות\\?</string>\n    <string name=\"feed_show_watched\">נצפו במלואם</string>\n    <string name=\"feed_hide_streams_title\">להציג את השידורים הבאים</string>\n    <string name=\"feed_show_hide_streams\">להציג/להסתיר שידורים</string>\n    <string name=\"prefer_original_audio_title\">להעדיף שמע מקורי</string>\n    <string name=\"prefer_original_audio_summary\">לבחור את רצועת השמע המקורית ללא תלות בשפה</string>\n    <string name=\"prefer_descriptive_audio_title\">להעדיף שמע מפורט</string>\n    <string name=\"prefer_descriptive_audio_summary\">לבחור רצועת שמע עם תיאורים לכבדי ראייה אם ניתן</string>\n    <string name=\"play_queue_audio_track\">שמע: %s</string>\n    <string name=\"audio_track\">רצועת שמע</string>\n    <string name=\"audio_track_present_in_video\">רצועת שמע כבר אמורה להיות כחלק מהתזרים</string>\n    <string name=\"unknown_audio_track\">לא ידועה</string>\n    <string name=\"settings_category_exoplayer_title\">הגדרות ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">להשתמש ביכולת הגיבוי של המפענח של ExoPlayer</string>\n    <string name=\"audio_track_type_original\">מקורי</string>\n    <string name=\"audio_track_type_dubbed\">מדובב</string>\n    <string name=\"select_audio_track_external_players\">בחירת רצועת שמע לנגנים חיצוניים</string>\n    <string name=\"audio_track_type_descriptive\">מפורט</string>\n    <string name=\"settings_category_exoplayer_summary\">ניהול חלק מהגדרות של ה־ExoPlayer שלך. השינויים האלו דורשים את הפעלת הנגן מחדש כדי להיכנס לתוקף</string>\n    <string name=\"progressive_load_interval_summary\">שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">יש להפעיל את האפשרות הזאת אם נתקלת בבעיות עם אתחול מפענח, מה שגורם להנחתה למפענחים עם עדיפות נמוכה יותר אם אתחול המפענחים העיקריים נכשל. עלול לגרום לביצועי נגינה נחותים לעומת מפענחים ראשיים</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">תמיד להשתמש במעקף הגדרות משטח פלט הווידאו של ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">המעקף הזה משחרר ומקים מחדש את מפענחי הווידאו כשמשתנה שינוי במשטח, במקום להגדיר את המשטח למפענח ישירות. כבר נעשה בזה שימוש על ידי ExoPlayer בחלק מהמכשירים עם התקלה הזאת, הגדרה זו משפיעה על Android 6 ומעלה בלבד\n\\n\n\\nהפעלת האפשרות עשויה למנוע שגיאות נגינה בעת חזרה לנגן הווידאו הנוכחית או במעבר למסך מלא</string>\n    <string name=\"main_tabs_position_title\">מקום לשוניות ראשיות</string>\n    <string name=\"main_tabs_position_summary\">להעביר את בורר הלשוניות הראשי לתחתית</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"disable_media_tunneling_automatic_info\">תיעול מדיה הושבת כברירת מחדל במכשיר שלך כיוון שדגם המכשיר ידוע בכך שאינו תומך בזה.</string>\n    <string name=\"no_live_streams\">אין תזרימים חיים</string>\n    <string name=\"no_streams\">אין תזרימים</string>\n    <string name=\"channel_tab_videos\">סרטונים</string>\n    <string name=\"metadata_subscribers\">מנויים</string>\n    <string name=\"show_channel_tabs_summary\">אין לשוניות מופיעות בעמודי הערוץ</string>\n    <string name=\"show_channel_tabs\">לשוניות ערוץ</string>\n    <string name=\"channel_tab_shorts\">Shorts‎</string>\n    <string name=\"loading_metadata_title\">נתוני העל נטענים…</string>\n    <string name=\"feed_fetch_channel_tabs\">משיכת לשוניות הערוץ</string>\n    <string name=\"channel_tab_about\">על אודות</string>\n    <string name=\"channel_tab_albums\">אלבומים</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">לשוניות למשיכה בעת עדכון ערוץ העדכונים. לאפשרות זו אין השפעה אם הערוץ מתעדכן במצב מהיר.</string>\n    <string name=\"channel_tab_playlists\">רשימות נגינה</string>\n    <string name=\"channel_tab_tracks\">רצועות</string>\n    <string name=\"channel_tab_channels\">ערוצים</string>\n    <string name=\"channel_tab_livestreams\">שידור חי</string>\n    <string name=\"toggle_screen_orientation\">החלפת כיוון מסך</string>\n    <string name=\"toggle_fullscreen\">מילוי המסך/רגיל</string>\n    <string name=\"next_stream\">התזרים הבא</string>\n    <string name=\"open_play_queue\">פתיחת תור נגינה</string>\n    <string name=\"forward\">דילוג קדימה</string>\n    <string name=\"rewind\">החזרה אחורה</string>\n    <string name=\"replay\">נגינה חוזרת</string>\n    <string name=\"play\">נגינה</string>\n    <string name=\"more_options\">אפשרויות נוספות</string>\n    <string name=\"duration\">משך</string>\n    <string name=\"previous_stream\">התזרים הקודם</string>\n    <string name=\"image_quality_title\">איכות תמונה</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"image_quality_low\">איכות נמוכה</string>\n    <string name=\"metadata_avatars\">תמונות ייצוגיות</string>\n    <string name=\"metadata_subchannel_avatars\">תמונות ייצוגיות של תת־ערוצים</string>\n    <string name=\"image_quality_none\">לא לטעון תמונות</string>\n    <string name=\"image_quality_high\">איכות גבוהה</string>\n    <string name=\"image_quality_medium\">איכות בינונית</string>\n    <string name=\"metadata_uploader_avatars\">תמונות ייצוגיות של מעלים</string>\n    <string name=\"metadata_banners\">כרזות</string>\n    <string name=\"image_quality_summary\">נא לבחור את איכות התמונות והאם בכלל להוריד אותן כדי לחסוך בצריכת נתונים ושימוש בזיכרון. השינויים מפנים הן את מטמון השמירה בזיכרון והן בכונן — %s</string>\n    <string name=\"metadata_thumbnails\">תמונות ממוזערות</string>\n    <string name=\"share_playlist_with_list\">שיתוף רשימת כתובות</string>\n    <string name=\"share_playlist_with_titles\">שיתוף עם כותרות</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">שיתוף רשימת נגינה</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"show_more\">להציג עוד</string>\n    <string name=\"show_less\">להציג פחות</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">תשובה %s</item>\n        <item quantity=\"two\">%s תשובות</item>\n        <item quantity=\"other\">%s תשובות</item>\n    </plurals>\n    <string name=\"notification_actions_summary_android13\">אפשר לערוך כל פעולה בהתראה להלן על ידי נגיעה בה. שלוש הפעולות הראשונות (נגינה/השהיה, הקודם והבא) מוגדרות על ידי המערכת ונעולות לעריכה.</string>\n    <string name=\"auto_update_check_description\">NewPipe יכול לבדוק אוטומטית אם יש גרסאות חדשות מעת לעת ולהודיע כאשר הן זמינות.\n\\nלהפעיל את היכולת הזאת?</string>\n    <string name=\"reset_settings_title\">איפוס הגדרות</string>\n    <string name=\"reset_settings_summary\">איפוס כל ההגדרות לערכי ברירת המחדל שלהן</string>\n    <string name=\"yes\">כן</string>\n    <string name=\"no\">לא</string>\n    <string name=\"settings_category_backup_restore_title\">גיבוי ושחזור</string>\n    <string name=\"reset_all_settings\">איפוס כל ההגדרות ימחק את כל ההגדרות המועדפות שלך ויפעיל את היישומון מחדש.\n\\n\n\\nלהמשיך?</string>\n    <string name=\"error_insufficient_storage\">אין מספיק מקום פנוי במכשיר</string>\n    <string name=\"import_settings_vulnerable_format\">ההגדרות בייצוא המיובא משתמשות בתסדיר פגיע שהוצא משימוש מאז NewPipe 0.27.0. יש לוודא שהייצוא המיובא הוא ממקור מהימן, ועדיף להשתמש רק בייצוא שהושג מ־NewPipe 0.27.0 ומעלה בעתיד. תמיכה בייבוא הגדרות בתסדיר פגיע זה תוסר בקרוב לחלוטין, ואז גרסאות ישנות של NewPipe לא יוכלו לייבא עוד הגדרות של ייצוא מגרסאות חדשות.</string>\n    <string name=\"audio_track_type_secondary\">משני</string>\n    <string name=\"tab_bookmarks_short\">רשימות נגינה</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">שיתוף כרשימת נגינה זמנית של YouTube</string>\n    <string name=\"select_a_feed_group\">הגדרת קבוצת ערוצי עדכונים</string>\n    <string name=\"no_feed_group_created_yet\">לא נוצרו עדיין קבוצות ערוצי עדכונים</string>\n    <string name=\"feed_group_page_summary\">עמוד קבוצת ערוצים</string>\n    <string name=\"search_with_service_name\">חיפוש ב־%1$s</string>\n    <string name=\"search_with_service_name_and_filter\">חיפוש ב־%1$s‏ (%2$s)</string>\n    <string name=\"channel_tab_likes\">לייקים</string>\n    <string name=\"account_terminated_service_provides_reason\">חשבון הושמד\\n\\n%1$s מספק את הסיבה הבאה: %2$s</string>\n    <string name=\"permission_display_over_apps_message\">כדי להשתמש בנגן צף, נא לבחור ב־%1$s בתפריט ההגדרות הבא של Android ולהפעיל את %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">„תמיד להציג מעל יישומונים אחרים”</string>\n    <string name=\"short_thousand\">%s אלף</string>\n    <string name=\"short_million\">%s מיליון</string>\n    <string name=\"short_billion\">%s מיליארד</string>\n    <string name=\"migration_info_7_8_title\">המובילים המשולבים של YouTube הוסרו</string>\n    <string name=\"delete_file\">מחיקת קובץ</string>\n    <string name=\"delete_entry\">מחיקת רשומה</string>\n    <string name=\"migration_info_6_7_title\">עמוד 50 המובילים ב־SoundCloud הוסר</string>\n    <string name=\"trending_gaming\">מגמות במשחקים</string>\n    <string name=\"trending_podcasts\">פודקאסטים מובילים</string>\n    <string name=\"trending_movies\">סרטים וסדרות מובילים</string>\n    <string name=\"trending_music\">מוזיקה מובילה</string>\n    <string name=\"entry_deleted\">הרשומה נמחקה</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud הפסיקו את מצעדי 50 הלהיטים המקוריים. הלשונית התואמת הוסרה מהעמוד הראשי שלך.</string>\n    <string name=\"migration_info_7_8_message\">ב־YouTube הושבת עמוד המובילים המשולב החל מ־21 ביולי 2025. NewPipe החליפה את עמוד המובילים המוגדר כברירת מחדל בשידורים חיים מובילים.\\n\\nניתן גם לבחור עמודי מובילים שונים תחת „הגדרות &gt; תוכן &gt; תוכן הדף הראשי”.</string>\n    <string name=\"player_http_403\">שגיאת HTTP 403 שהתקבלה מהשרת בזמן השמעה, ככל הנראה נגרמת עקב פקיעת כתובת URL של סטרימינג או חסימת IP</string>\n    <string name=\"player_http_invalid_status\">שגיאת HTTP %1$s התקבלה מהשרת בזמן הניגון</string>\n    <string name=\"youtube_player_http_403\">שגיאת HTTP‏ 403 שהתקבלה מהשרת בזמן הניגון, ככל הנראה נגרמה עקב חסימת IP או בעיות בהסרת ערפול כתובת תזרים</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s סירב לספק נתונים, וביקש התחברות כדי לאשר שהמבקש אינו בוט.\\n\\nכנראה שה־IP שלך נחסם זמנית על ידי %1$s, ניתן להמתין זמן מה או לעבור ל־IP אחר (לדוגמה על ידי הפעלה/כיבוי של VPN, או על ידי מעבר מרשת אלחוטית לתקשורת נתונים סלולרית).</string>\n    <string name=\"unsupported_content_in_country\">תוכן זה אינו זמין עבור מדינת התוכן שנבחרה כעת.\\n\\nניתן לשנות את בחירתך דרך „הגדרות &gt; תוכן &gt; מדינת תוכן ברירת מחדל”.</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-hi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">%1$s पे प्रकाशित हुआ</string>\n    <string name=\"no_player_found\">स्ट्रीमिंग के लिए प्लेयर नहीं मिला। क्या आप VLC इंस्टॉल करना चाहेंगे?</string>\n    <string name=\"install\">इंस्टॉल करें</string>\n    <string name=\"open_in_browser\">ब्राउज़र में खोलें</string>\n    <string name=\"open_in_popup_mode\">पॉपअप मोड में खोलें</string>\n    <string name=\"share\">शेयर करें</string>\n    <string name=\"download\">डाउनलोड करें</string>\n    <string name=\"search\">खोजें</string>\n    <string name=\"settings\">सेटिंग्स</string>\n    <string name=\"subscribe_button_title\">सब्सक्राइब करें</string>\n    <string name=\"subscribed_button_title\">सब्सक्राइब है</string>\n    <string name=\"channel_unsubscribed\">चैनल अनसब्सक्राईब हुआ</string>\n    <string name=\"tab_subscriptions\">सब्सक्रिप्शनस</string>\n    <string name=\"controls_background_title\">बैकग्राउंड</string>\n    <string name=\"controls_popup_title\">पॉपअप</string>\n    <string name=\"play_audio\">ऑडियो</string>\n    <string name=\"light_theme_title\">रौशनी</string>\n    <string name=\"black_theme_title\">काला</string>\n    <string name=\"enable_watch_history_title\">देखे हुए वीडियोज़ का इतिहास</string>\n    <string name=\"download_dialog_title\">डाउनलोड करें</string>\n    <string name=\"settings_category_video_audio_title\">वीडियो और ऑडियो</string>\n    <string name=\"settings_category_history_title\">इतिहास और कैश</string>\n    <string name=\"background_player_playing_toast\">बैकग्राउंड में चल रहा है</string>\n    <string name=\"no_views\">कोई विऊ नहीं</string>\n    <string name=\"no_videos\">कोई वीडियो नहीं</string>\n    <string name=\"title_activity_about\">न्यूपाइप के बारे में जानें</string>\n    <string name=\"title_licenses\">तृतीय-पक्ष लाइसेंस</string>\n    <string name=\"tab_about\">ऐप के बारे में और सामान्य प्रश्न</string>\n    <string name=\"tab_licenses\">लाइसेंस</string>\n    <string name=\"view_on_github\">गिटहब पर देखें</string>\n    <string name=\"app_license_title\">न्यूपाइप का लाइसेंस</string>\n    <string name=\"read_full_license\">लाइसेंस पढ़ें</string>\n    <string name=\"contribution_title\">योगदान करें</string>\n    <string name=\"title_activity_history\">इतिहास</string>\n    <string name=\"action_history\">इतिहास</string>\n    <string name=\"trending\">फ़िलहाल चर्चा में है</string>\n    <string name=\"play_queue_audio_settings\">ऑडियो सेटिंग्स</string>\n    <string name=\"main_bg_subtitle\">आरंभ करने के लिए आवर्धक कांच को स्पर्श करें।</string>\n    <string name=\"cancel\">रद्द करें</string>\n    <string name=\"did_you_mean\">क्या आप का मतलब \\\"%1$s\\\" था\\?</string>\n    <string name=\"share_dialog_title\">के साथ शेयर करें</string>\n    <string name=\"use_external_video_player_title\">बाहरी वीडियो प्लेयर का उपयोग करें</string>\n    <string name=\"use_external_video_player_summary\">कुछ रिजॉल्युशनों पर ध्वनि हट सकती है</string>\n    <string name=\"use_external_audio_player_title\">बाहरी ऑडियो प्लेयर का उपयोग करें</string>\n    <string name=\"subscription_change_failed\">सब्सक्रिप्शन बदली नहीं जा सकी</string>\n    <string name=\"subscription_update_failed\">सब्सक्रिप्शन अपडेट नहीं किया जा सका</string>\n    <string name=\"fragment_feed_title\">क्या नया है</string>\n    <string name=\"download_path_title\">वीडियो के लिए डाउनलोड फ़ोल्डर</string>\n    <string name=\"download_path_summary\">डाउनलोड की गई वीडियो फ़ाइलें यहां संग्रहित होती हैं</string>\n    <string name=\"download_path_dialog_title\">वीडियो फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें</string>\n    <string name=\"download_path_audio_title\">ऑडियो के लिए डाउनलोड फ़ोल्डर</string>\n    <string name=\"download_path_audio_summary\">डाउनलोड की गई ऑडियो फ़ाइलें यहां संग्रहित होती हैं</string>\n    <string name=\"download_path_audio_dialog_title\">ऑडियो फ़ाइलों के लिए डाउनलोड फ़ोल्डर चुनें</string>\n    <string name=\"default_resolution_title\">डिफ़ॉल्ट रिजॉल्युशन</string>\n    <string name=\"default_popup_resolution_title\">पॉपअप का डिफ़ॉल्ट रिजॉल्युशन</string>\n    <string name=\"show_higher_resolutions_title\">उच्च रिजॉल्युशन दिखाएं</string>\n    <string name=\"show_higher_resolutions_summary\">केवल कुछ ही डिवाईस 2K/4K में वीडियो चला सकते हैं</string>\n    <string name=\"play_with_kodi_title\">Kodi में चलाएं</string>\n    <string name=\"kore_not_found\">गैर- मौजूदा Kore ऐप इंस्टॉल करें\\?</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi में चलाएं\\\" वाला विकल्प दिखाएँ</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi मीडिया सेंटर से वीडियो चलने के लिए विकल्प प्रदर्शित करें</string>\n    <string name=\"default_audio_format_title\">डिफ़ॉल्ट ऑडियो फॉर्मेट</string>\n    <string name=\"default_video_format_title\">डिफ़ॉल्ट वीडियो फॉर्मेट</string>\n    <string name=\"theme_title\">थीम</string>\n    <string name=\"dark_theme_title\">गहरा</string>\n    <string name=\"popup_remember_size_pos_title\">वीडियो पॉपअप के गुणस्वभाव को याद रखें</string>\n    <string name=\"popup_remember_size_pos_summary\">वीडियो पॉपअप की अंतिम स्थिति और आकार को याद रखें</string>\n    <string name=\"show_search_suggestions_title\">खोज में सुझाव</string>\n    <string name=\"show_search_suggestions_summary\">खोज के दौरान दिखाये जाने वाले सुझाव चुनें</string>\n    <string name=\"enable_search_history_title\">खोज का इतिहास</string>\n    <string name=\"enable_search_history_summary\">खोज क्वेरीज़ को स्थानीय रूप से संग्रहित करें</string>\n    <string name=\"enable_watch_history_summary\">देखे गए वीडियोज़ की सूची रखें</string>\n    <string name=\"resume_on_audio_focus_gain_title\">प्लेबैक फिर से शुरू करें</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">रुकावटें (जैसे कि फ़ोन कॉल) खत्म होने के बाद वीडियो प्ले जारी रखें</string>\n    <string name=\"show_next_and_similar_title\">\\'अगला\\' और \\'संबंधित\\' वीडियो दिखाएं</string>\n    <string name=\"show_hold_to_append_title\">\\\"कतार में जोड़ने के लिए स्पर्श बनाये रखें\\\" दिखाएं</string>\n    <string name=\"show_hold_to_append_summary\">जब बैकग्राउंड और पॉपअप बटन वीडियो के विवरण पन्ने में दबाई जाए तो सलाह दिखाएं</string>\n    <string name=\"unsupported_url\">असमर्थित URL</string>\n    <string name=\"content_language_title\">डिफ़ॉल्ट सामग्री की भाषा</string>\n    <string name=\"settings_category_player_title\">प्लेयर</string>\n    <string name=\"settings_category_player_behavior_title\">व्यवहार</string>\n    <string name=\"settings_category_appearance_title\">दिखावट</string>\n    <string name=\"popup_playing_toast\">वीडियो पॉपअप के अंदाज में चल रहा है</string>\n    <string name=\"content\">विषयवस्तु</string>\n    <string name=\"show_age_restricted_content_title\">आयु प्रतिबंधित सामग्री दिखाएं</string>\n    <string name=\"duration_live\">लाइव</string>\n    <string name=\"downloads\">डाउनलोडस</string>\n    <string name=\"downloads_title\">डाउनलोडस</string>\n    <string name=\"error_report_title\">त्रुटी की रिपोर्ट</string>\n    <string name=\"all\">सभी</string>\n    <string name=\"disabled\">बंद किया</string>\n    <string name=\"clear\">साफ करें</string>\n    <string name=\"best_resolution\">उत्तम रिजॉल्युशन</string>\n    <string name=\"undo\">अन-डू करें</string>\n    <string name=\"play_all\">सभी प्ले करें</string>\n    <string name=\"notification_channel_name\">न्यूपाइप की नोटीफिकेशन</string>\n    <string name=\"notification_channel_description\">न्यूपाइप के प्लेयर के लिए नोटीफिकेशन</string>\n    <string name=\"unknown_content\">[अज्ञात]</string>\n    <string name=\"general_error\">त्रुटी</string>\n    <string name=\"network_error\">नेटवर्क में त्रुटी</string>\n    <string name=\"could_not_load_thumbnails\">सभी थंमनेल लोड नहीं किए जा सके</string>\n    <string name=\"parsing_error\">वैबसाइट parse नहीं हो सकी</string>\n    <string name=\"content_not_available\">विषय वस्तु उपलब्ध नहीं है</string>\n    <string name=\"could_not_setup_download_menu\">डाउनलोड मेनू स्थापित नहीं किया जा सका</string>\n    <string name=\"app_ui_crash\">ऐप/UI करैश हो गई</string>\n    <string name=\"player_stream_failure\">इस वीडियो को चलाने में असफल हुए</string>\n    <string name=\"player_unrecoverable_failure\">अनचाही वीडियो प्लेयर त्रुटी आयी है</string>\n    <string name=\"player_recoverable_failure\">वीडियो प्लेयर त्रुटी से ठीक हो रहा है</string>\n    <string name=\"sorry_string\">खेद है, कि ऐसा होना नहीं चाहिए था।</string>\n    <string name=\"error_report_button_text\">रिपोर्ट को ईमेल से भेजें</string>\n    <string name=\"error_snackbar_message\">माफ़ करें, कुछ त्रुटि हो गई।</string>\n    <string name=\"error_snackbar_action\">रिपोर्ट करें</string>\n    <string name=\"what_device_headline\">जानकारी:</string>\n    <string name=\"what_happened_headline\">क्या हुआ:</string>\n    <string name=\"info_labels\">क्या:\\nअनुरोध:\\nसामग्री भाषा:\\nसामग्री देश:\\nऐप भाषा:\\nसेवा:\\nजीएमटी समय:\\nपैकेज:\\nसंस्करण:\\nOS संस्करण:</string>\n    <string name=\"your_comment\">आपकी टिप्पणी(अंग्रेजी में):</string>\n    <string name=\"error_details_headline\">विवरण:</string>\n    <string name=\"detail_thumbnail_view_description\">वीडियो चलाएं, अवधि :</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">अपलोडर का अवतार थंमनेल</string>\n    <string name=\"detail_likes_img_view_description\">पसंद</string>\n    <string name=\"detail_dislikes_img_view_description\">नापसंद</string>\n    <string name=\"search_no_results\">कोई परिणाम नहीं</string>\n    <string name=\"empty_list_subtitle\">यहां के खालीपन को दूर करने के लिए कुछ सर्च करें या किसी चैनल को सब्सक्राइब करें और प्लेलिसट बनाकर उसमें वीडियो जोड़ें</string>\n    <string name=\"video\">वीडियो</string>\n    <string name=\"audio\">ऑडियो</string>\n    <string name=\"retry\">फिर से कोशिश करें</string>\n    <string name=\"no_subscribers\">कोई सब्सक्राइबर नहीं</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s सब्सक्राइबर</item>\n        <item quantity=\"other\">%s सब्सक्राइबर्स</item>\n    </plurals>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s विऊ</item>\n        <item quantity=\"other\">%s विऊज़</item>\n    </plurals>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s वीडियो</item>\n        <item quantity=\"other\">%s वीडियोज़</item>\n    </plurals>\n    <string name=\"start\">शुरू</string>\n    <string name=\"pause\">रोकें</string>\n    <string name=\"delete\">मिटाएँ</string>\n    <string name=\"checksum\">चेकसम</string>\n    <string name=\"ok\">ठीक है</string>\n    <string name=\"msg_name\">फाइल का नाम</string>\n    <string name=\"msg_threads\">थ्रेड्स</string>\n    <string name=\"msg_error\">त्रुटी</string>\n    <string name=\"msg_running\">न्यूपाइप डाउनलोड कर रही है</string>\n    <string name=\"msg_running_detail\">विवरण के लिए टैप करें</string>\n    <string name=\"msg_wait\">कृपया प्रतीक्षा करें…</string>\n    <string name=\"msg_copied\">क्लिपबोर्ड पर कॉपी हो गया है</string>\n    <string name=\"no_available_dir\">कृपया बाद में सेटिंग्स में डाउनलोड स्थान चुनें</string>\n    <string name=\"msg_popup_permission\">पॉपअप मोड में खोलने के लिए\n\\nइस अनुमति की जरुरत है</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA चुनौती</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA चुनौती का अनुरोध किया</string>\n    <string name=\"settings_category_downloads_title\">डाउनलोड</string>\n    <string name=\"settings_file_charset_title\">फ़ाइल नाम में अनुमत कैरेक्टर</string>\n    <string name=\"settings_file_replacement_character_summary\">अमान्य कैरेक्टर्स इस संख्या से बदल दिए जायेंगे</string>\n    <string name=\"settings_file_replacement_character_title\">रिप्लेसमेंट करैक्टर</string>\n    <string name=\"charset_letters_and_digits\">वर्ण और अंक</string>\n    <string name=\"charset_most_special_characters\">सबसे विशेष कैरेक्टर्स</string>\n    <string name=\"copyright\" formatted=\"true\">%2$s के द्वारा © %1$s जो %3$s के अधीन आते हैं</string>\n    <string name=\"app_description\">एंड्राइड के लिए हल्का और मुफ्त स्ट्रीमिंग एप्लिकेशन।</string>\n    <string name=\"contribution_encouragement\">अगर आपके पास कोई सुझाव हो जैसे कि - अनुवाद करना, डिजाईन में बदलाव करना, कोड को साफ़ रखना, या फिर कोड में जायदा बदलाव लाना हो तो - सहायता के लिए आपका स्वागत है। जितना ज्यादा होगा उतना बेहतर होगा !</string>\n    <string name=\"delete_item_search_history\">क्या आप इसको खोज इतिहास से मिटाना चाहते हैं \\?</string>\n    <string name=\"main_page_content\">मुख्य पृष्ठ की विषयवस्तु</string>\n    <string name=\"blank_page_summary\">खाली पन्ना</string>\n    <string name=\"kiosk_page_summary\">कियोस्क पन्ना</string>\n    <string name=\"channel_page_summary\">चैनल पन्ना</string>\n    <string name=\"select_a_channel\">चैनल चुनें</string>\n    <string name=\"no_channel_subscribed_yet\">अभी तक किसी चैनल की सब्सक्रिप्शन नहीं है</string>\n    <string name=\"select_a_kiosk\">कियोस्क चुनें</string>\n    <string name=\"top_50\">शीर्ष 50</string>\n    <string name=\"new_and_hot\">नए और प्रचलित</string>\n    <string name=\"play_queue_remove\">निकालें</string>\n    <string name=\"play_queue_stream_detail\">विवरण</string>\n    <string name=\"hold_to_append\">कतार में जोड़ने के लिए दबाकर रखें</string>\n    <string name=\"start_here_on_background\">बैकग्राउंड में चलाना शुरू करें</string>\n    <string name=\"start_here_on_popup\">पॉपअप में चलाना शुरू करें</string>\n    <string name=\"no_player_found_toast\">स्ट्रीमिंग करने के लिए प्लेयर नहीं मिला (आप इसे चलाने के लिए VLC प्लेयर इंस्टॉल कर सकते हैं)।</string>\n    <string name=\"controls_download_desc\">स्ट्रीम फाइल डाउनलोड करें</string>\n    <string name=\"show_info\">जानकारी दिखाएं</string>\n    <string name=\"tab_bookmarks\">बुकमार्क की गई प्लेलिस्टें</string>\n    <string name=\"controls_add_to_playlist_title\">में शामिल करें</string>\n    <string name=\"default_content_country_title\">सामग्री का डिफ़ॉल्ट देश</string>\n    <string name=\"always\">हमेशा</string>\n    <string name=\"just_once\">सिर्फ एक बार</string>\n    <string name=\"switch_to_background\">बैकग्राउंड मोड में चलाएं</string>\n    <string name=\"switch_to_popup\">पॉपअप मोड में चलाएं</string>\n    <string name=\"switch_to_main\">मुख्य पर स्विच करें</string>\n    <string name=\"import_data_title\">डेटाबेस आयात करें</string>\n    <string name=\"export_data_title\">डेटाबेस निर्यात करें</string>\n    <string name=\"import_data_summary\">आपके वर्तमान इतिहास, सब्सक्रिप्शनस, प्लेलिस्ट और (वैकल्पिक रूप से) सेटिंग्स को ओवरराइड करता है</string>\n    <string name=\"export_data_summary\">इतिहास, सब्सक्रिप्शन, प्लेलिस्ट और सेटिंग निर्यात करें</string>\n    <string name=\"external_player_unsupported_link_type\">बाहरी प्लेयर्स इन प्रकार के लिंक सपोर्ट नहीं करते</string>\n    <string name=\"video_streams_empty\">कोई वीडियो स्ट्रीम नहीं मिला</string>\n    <string name=\"audio_streams_empty\">कोई ऑडियो स्ट्रीम नहीं मिला</string>\n    <string name=\"detail_drag_description\">फिर से क्रम देने के लिए खींचें</string>\n    <string name=\"create\">बनाइये</string>\n    <string name=\"dismiss\">ख़ारिज करें</string>\n    <string name=\"rename\">नाम बदलें</string>\n    <string name=\"donation_title\">दान करें</string>\n    <string name=\"donation_encouragement\">न्यूपाइप स्वयंसेवकों द्वारा विकसित किया जाता है जो आपको अच्छा अनुभव देने के लिए अपना खाली समय इस एप्लिकेशन को देते हैं। स्वयंसेवको को मदद भेजे, ताकि वह न्यूपाइप को और अच्छा बना सके।</string>\n    <string name=\"give_back\">वापस दें</string>\n    <string name=\"website_title\">वेबसाइट</string>\n    <string name=\"website_encouragement\">अधिक जानकारी और खबरों के लिए न्यूपाइप की वेबसाइट पर जाएं।</string>\n    <string name=\"title_last_played\">पिछला चलाया गया</string>\n    <string name=\"title_most_played\">अधिकतम चलाए गए</string>\n    <string name=\"export_complete_toast\">निर्यात संपन्न हुआ</string>\n    <string name=\"import_complete_toast\">आयात संपन्न हुआ</string>\n    <string name=\"no_valid_zip_file\">कोई वैध ज़िप फ़ाइल नहीं है</string>\n    <string name=\"could_not_import_all_files\">चेतावनी: सभी फ़ाइलों को आयात नहीं किया जा सका।</string>\n    <string name=\"override_current_data\">यह आपके वर्तमान सेटअप को ओवरराइड कर देगा।</string>\n    <string name=\"drawer_open\">ड्रावर खोलें</string>\n    <string name=\"drawer_close\">ड्रावर बंद करें</string>\n    <string name=\"video_player\">वीडियो प्लेयर</string>\n    <string name=\"background_player\">बैकग्राउंड प्लेयर</string>\n    <string name=\"popup_player\">पॉपअप प्लेयर</string>\n    <string name=\"always_ask_open_action\">हमेशा पूछें</string>\n    <string name=\"preferred_player_fetcher_notification_title\">जानकारी प्राप्त की जा रही है…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">अनुरोधित सामग्री लोड कर रहे है</string>\n    <string name=\"create_playlist\">नई प्लेलिस्ट</string>\n    <string name=\"rename_playlist\">नाम बदलें</string>\n    <string name=\"name\">नाम</string>\n    <string name=\"add_to_playlist\">प्लेलिस्ट में जोड़ें</string>\n    <string name=\"set_as_playlist_thumbnail\">प्लेलिस्ट थंमनेल के रूप में सैंट करें</string>\n    <string name=\"bookmark_playlist\">प्लेलिस्ट बुकमार्क करें</string>\n    <string name=\"unbookmark_playlist\">बुकमार्क हटायें</string>\n    <string name=\"delete_playlist_prompt\">प्लेलिस्ट को मिटाना चाहते हैं\\?</string>\n    <string name=\"playlist_creation_success\">प्लेलिस्ट बना दी गई</string>\n    <string name=\"playlist_add_stream_success\">प्लेलिस्ट में जोड़ा गया</string>\n    <string name=\"playlist_thumbnail_change_success\">प्लेलिस्ट का थंमनेल बदल दिया गया।</string>\n    <string name=\"caption_none\">कोई अनुशीर्षक नहीं</string>\n    <string name=\"resize_fit\">फिट</string>\n    <string name=\"resize_fill\">भरें</string>\n    <string name=\"resize_zoom\">ज़ूम</string>\n    <string name=\"settings_category_debug_title\">डीबग करें</string>\n    <string name=\"caption_auto_generated\">अपने-आप बनी</string>\n    <string name=\"enable_leak_canary_summary\">हीप डंप करने के दौरान मेमोरी लीक मॉनिटरिंग ऐप को अनुत्तरदायी बना सकता है</string>\n    <string name=\"enable_disposed_exceptions_title\">चक्र से बाहर त्रुटियों की रिपोर्ट करें</string>\n    <string name=\"use_inexact_seek_title\">तेज और अनिश्चित तलाश का प्रयोग करें</string>\n    <string name=\"use_inexact_seek_summary\">अनिश्चित खोज से प्लेयर कम सटीकता से लेकिन तेजी से वीडियो पोजीशन्स की तलाश कर सकता है। इससे 5, 15 या 25 सेकंड आगे पीछे लिजाना काम नहीं करता</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">चित्र कैश मिटाया गया</string>\n    <string name=\"metadata_cache_wipe_title\">कैश मेटाडेटा मिटाएं</string>\n    <string name=\"metadata_cache_wipe_summary\">वेबपेजों का कैश किया तमाम डेटा हटाएं</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">मेटाडाटा कैश मिटाया गया</string>\n    <string name=\"auto_queue_title\">अगली स्ट्रीम को ऑटो-कतारबद्ध करें</string>\n    <string name=\"auto_queue_summary\">खत्म होने वाली पर ना-दोहराने वाली प्लेबैक कतार को संबंधित स्ट्रीम जोड़ते हुए जारी रखें</string>\n    <string name=\"file\">फाइल</string>\n    <string name=\"channels\">चेनल्स</string>\n    <string name=\"playlists\">प्लेलिस्ट</string>\n    <string name=\"tracks\">ट्रैकस</string>\n    <string name=\"users\">उपभोगता</string>\n    <string name=\"clear_views_history_title\">देखे हुए वीडियो की सूची साफ करें</string>\n    <string name=\"clear_views_history_summary\">चलाई गए स्ट्रीमों के इतिहास और प्लेबैक स्थानों को मिटाता है</string>\n    <string name=\"delete_view_history_alert\">क्या देखा गया सब इतिहास मिटा दिया जाए\\?</string>\n    <string name=\"watch_history_deleted\">देखा हुआ इतिहास मिटा दिया गया</string>\n    <string name=\"clear_search_history_title\">खोज इतिहास को साफ करें</string>\n    <string name=\"clear_search_history_summary\">खोजे गए शब्दों का इतिहास साफ करता है</string>\n    <string name=\"delete_search_history_alert\">पूरे खोज इतिहास को मिटा दें\\?</string>\n    <string name=\"search_history_deleted\">खोज इतिहास मिटाया गया</string>\n    <string name=\"invalid_directory\">ऐसा कोई फ़ोल्डर मौजूद नहीं</string>\n    <string name=\"invalid_source\">अमान्य फाइल/विषय - वस्तु का स्रोत</string>\n    <string name=\"invalid_file\">फ़ाइल मौजूद नहीं है या उसे पढ़ने या लिखने की पर्याप्त अनुमति नहीं है</string>\n    <string name=\"file_name_empty_error\">फ़ाइल का नाम खाली नहीं हो सकता</string>\n    <string name=\"error_occurred_detail\">एक त्रुटी उत्पन्न हुई: %1$s</string>\n    <string name=\"no_streams_available_download\">डाउनलोड करने के लिए कोई स्ट्रीम उपलब्ध नहीं है</string>\n    <string name=\"one_item_deleted\">एक आइटम मिटा दी गई।</string>\n    <string name=\"privacy_policy_title\">न्यूपाइप की गोपनीयता नीति</string>\n    <string name=\"privacy_policy_encouragement\">न्यूपाइप परियोजना आपकी गोपनीयता को बहुत गंभीर रूप से लेता है। इसलिए, ऐप आपकी अनुमति के बिना कोई डेटा जमा नहीं करता।\n\\nन्यूपाइप की गोपनीयता नीति विस्तार से समझाती है कि कौनसा डेटा भेजा और संग्रह किया जाता है जब आप क्रेश विवरण भेजते हैं।</string>\n    <string name=\"read_privacy_policy\">गोपनीयता नीति पढें</string>\n    <string name=\"import_settings\">क्या आप सेटिंग्स भी आयात करना चाहते हैं\\?</string>\n    <string name=\"preferred_open_action_settings_title\">\\'खोलने\\' पर तरजीही एक्शन</string>\n    <string name=\"preferred_open_action_settings_summary\">सामग्री खोलते समय डिफ़ॉल्ट कारवाही — %s</string>\n    <string name=\"caption_setting_title\">अनुशीर्षक</string>\n    <string name=\"caption_setting_description\">प्लेयर कैप्शन टेक्स्ट स्केल और पृष्ठभूमि शैलियों को संशोधित करें। प्रभावी होने के लिए ऐप को पुनरारंभ करना आवश्यक है</string>\n    <string name=\"import_title\">आयात</string>\n    <string name=\"import_from\">से आयात करें</string>\n    <string name=\"export_to\">पर निर्यात करे</string>\n    <string name=\"import_ongoing\">आयात किया जा रहा है…</string>\n    <string name=\"export_ongoing\">निर्यात किया जा रहा है…</string>\n    <string name=\"import_file_title\">फाइल आयात करें</string>\n    <string name=\"previous_export\">पहले वाला निर्यात</string>\n    <string name=\"subscriptions_import_unsuccessful\">सब्सक्रिप्शन आयात नहीं कर सके</string>\n    <string name=\"subscriptions_export_unsuccessful\">सब्सक्रिप्शन निर्यात नहीं कर सके</string>\n    <string name=\"import_youtube_instructions\">गूगल टेकआउट से यूट्यूब सदस्यता आयात करें:\n\\n\n\\n1. इस यूआरएल पर जाएं: %1$s\n\\n2. पूछे जाने पर लॉग इन करें\n\\n3. \\\"सभी डाटा शामिल करें\\\" पर क्लिक करें, फिर \\\"सभी को अचयनित करें\\\" पर, फिर केवल \\\"सदस्यताएँ\\\" चुनें और \\\" ठीक है\\\" पर क्लिक करें\n\\n4. \\\"अगला चरण\\\" पर क्लिक करें और फिर \\\"निर्यात बनाएं\\\"\n\\n5. प्रकट होने के बाद \\\"डाउनलोड\\\" बटन पर क्लिक करें\n\\n6. नीचे आयात फ़ाइल पर क्लिक करें और डाउनलोड की गई .zip फ़ाइल चुनें\n\\n7. [यदि .zip आयात विफल हो जाता है] .csv फ़ाइल निकालें (आमतौर पर \\\"यूट्यूब और यूट्यूब म्युज़िक/सब्सक्रिपशन/subscriptions.csv\\\" के अंतर्गत), नीचे आयात फ़ाइल पर क्लिक करें और निकाली गई सीएसवी फ़ाइल चुनें</string>\n    <string name=\"import_soundcloud_instructions_hint\">आपका आईडी, soundcloud.com/(आपका आईडी)</string>\n    <string name=\"import_network_expensive_warning\">ध्यान रखें, यह तरीका नेटवर्क खर्चीला हो सकता है।\n\\n\n\\nक्या आप आगे बढ़ना चाहते हैं\\?</string>\n    <string name=\"playback_speed_control\">प्लेबैक स्पीड कंट्रोल</string>\n    <string name=\"playback_tempo\">ताल</string>\n    <string name=\"playback_pitch\">पिच</string>\n    <string name=\"unhook_checkbox\">अनहुक (आवाज़ में बिगाड़ पड़ सकता है)</string>\n    <string name=\"skip_silence_checkbox\">खामोशी के समय तेज़ी से आगे बढ़ें</string>\n    <string name=\"playback_step\">कदम</string>\n    <string name=\"playback_reset\">रीसेट करें</string>\n    <string name=\"accept\">स्वीकार करें</string>\n    <string name=\"decline\">अस्वीकार करें</string>\n    <string name=\"limit_data_usage_none_description\">असीमित</string>\n    <string name=\"limit_mobile_data_usage_title\">मोबाइल डेटा उपयोग करते समय रिजॉल्युशन को सीमित करें</string>\n    <string name=\"minimize_on_exit_title\">ऐप बदलते समय उसे मिनिमाइज करें</string>\n    <string name=\"minimize_on_exit_summary\">मुख्य वीडियो प्लेयर से दूसरी ऐप पर जाने पर कार्रवाई — %s</string>\n    <string name=\"minimize_on_exit_none_description\">कोई नहीं</string>\n    <string name=\"minimize_on_exit_background_description\">बैकग्राउंड प्लेयर में बदलें</string>\n    <string name=\"minimize_on_exit_popup_description\">पॉपअप प्लेयर में बदलें</string>\n    <string name=\"app_license\">न्यूपाइप एक काॅपीलेफ़्ट फ़्री साॅफ़्टवेर है: इसे आप अपनी इच्छा के अनुसार इस्तेमाल, जाँच, बाँट तथा और बेहतर बना सकते है। खास तौर पर आप इसे फ़्री साॅफ़्टवेर फ़ाउंडेशन के द्वारा जारी जीएनयू जनरल पब्लिक लाइसेंस के तीसरे या उसके बाद आने वाले कोई भी वर्णन के शर्तों के मुताबिक फिर से बाँट या बदल सकते हैं।</string>\n    <string name=\"unsubscribe\">अनसब्सक्राईब करें</string>\n    <string name=\"tab_choose\">टैब चुनें</string>\n    <string name=\"enqueue\">कतारबद्ध करें</string>\n    <string name=\"settings_category_updates_title\">अपडेटस</string>\n    <string name=\"file_deleted\">फाइल मिटा दी गयी</string>\n    <string name=\"app_update_notification_channel_name\">ऐप अपडेट नोटीफिकेशन</string>\n    <string name=\"app_update_notification_channel_description\">नए नयूपाईप अपडेट का नोटीफिकेशन</string>\n    <string name=\"download_to_sdcard_error_title\">एक्सटर्नल स्टोरेज अनुपलब्ध</string>\n    <string name=\"download_to_sdcard_error_message\">SD कार्ड पर डाउनलोड करना संभव नहीं। डाउनलोड स्थान पुनः चुनें\\?</string>\n    <string name=\"restore_defaults\">डिफ़ॉल्टस पुन: स्थापित करें</string>\n    <string name=\"restore_defaults_confirmation\">क्या आप डिफ़ॉल्टस पर लौटना चाहते है\\?</string>\n    <string name=\"subscribers_count_not_available\">सब्सक्राइबर संख्या अनुपलब्ध</string>\n    <string name=\"main_page_content_summary\">मुख्य पृष्ठ पर कौन से टैब दिखाए जाते हैं</string>\n    <string name=\"updates_setting_title\">अपडेटस</string>\n    <string name=\"list\">सूची</string>\n    <string name=\"app_update_available_notification_title\">न्यूपाइप अपडेट उपलब्ध!</string>\n    <string name=\"missions_header_finished\">समाप्त</string>\n    <string name=\"missions_header_pending\">अपूर्ण</string>\n    <string name=\"paused\">रोका हुआ</string>\n    <string name=\"queued\">कतार में</string>\n    <string name=\"post_processing\">पोस्ट-प्रोसेसिंग</string>\n    <string name=\"permission_denied\">कार्य सिस्टम द्वारा अस्वीकार</string>\n    <string name=\"download_failed\">डाउनलोड विफल रहा</string>\n    <string name=\"generate_unique_name\">अनोखा नाम बनायें</string>\n    <string name=\"overwrite\">ओवरराइट करें</string>\n    <string name=\"download_already_running\">इस नाम का एक डाउनलोड चालू है</string>\n    <string name=\"error_path_creation\">डेस्टीनेशन फ़ोल्डर नहीं बनाया जा सकता</string>\n    <string name=\"error_file_creation\">फ़ाइल नहीं बनाई जा सकती</string>\n    <string name=\"error_ssl_exception\">सुूरक्षित कनेक्शन विफल</string>\n    <string name=\"error_unknown_host\">सर्वर नहीं ढूँढ सका</string>\n    <string name=\"error_connect_host\">सर्वर से जुड़ नहीं सकता</string>\n    <string name=\"error_http_no_content\">सर्वर डेटा नहीं भेजता है</string>\n    <string name=\"error_http_not_found\">नहीं मिला</string>\n    <string name=\"error_postprocessing_failed\">पोसट प्रोसेसिंग विफल रही</string>\n    <string name=\"stop\">रोकें</string>\n    <string name=\"max_retry_msg\">अधिकतम पुनर्प्रयास</string>\n    <string name=\"max_retry_desc\">डाउनलोड रद्द करने से पहले प्रयासों की अधिकतम संख्या</string>\n    <string name=\"pause_downloads_on_mobile\">मीटर्ड नेटवर्क पर रोकें</string>\n    <string name=\"pause_downloads_on_mobile_desc\">मोबाइल डाटा का इस्तेमाल करते समय उपयोगी है, परंतु कुछ डाउन्लोड रोके नहीं जा सकते है</string>\n    <string name=\"events\">घटनायें</string>\n    <string name=\"conferences\">कॉन्फ्रेंस</string>\n    <string name=\"show_comments_title\">टिप्पणियां दिखाएं</string>\n    <string name=\"show_comments_summary\">टिप्पणियां छिपाने के लिए इसे बंद करे</string>\n    <string name=\"autoplay_title\">ऑटोप्ले</string>\n    <string name=\"no_comments\">कोई टिपण्णी नहीं</string>\n    <string name=\"error_unable_to_load_comments\">टिप्पणियाँ लोड नहीं हो पाई</string>\n    <string name=\"close\">बंद करें</string>\n    <string name=\"enable_playback_resume_title\">प्लेबैक वापस चालू करें</string>\n    <string name=\"enable_playback_resume_summary\">आखिरी प्लेबैक पोजिशन पर वापस लौटे</string>\n    <string name=\"enable_playback_state_lists_title\">सूचियों में स्थान</string>\n    <string name=\"enable_playback_state_lists_summary\">प्लेबैक पोजिशन के निशान सूचियों में दिखाएं</string>\n    <string name=\"settings_category_clear_data_title\">डाटा मिटायें</string>\n    <string name=\"watch_history_states_deleted\">प्लेबैक स्थान मिटा दिए गए</string>\n    <string name=\"missing_file\">फाइल की जगह बदली गयी या फिर फाइल मिटा दी गयी</string>\n    <string name=\"overwrite_unrelated_warning\">इस नाम की कोई फ़ाइल पहले से मौजूद है</string>\n    <string name=\"overwrite_finished_warning\">इस नाम की डाउनलोड फ़ाइल पहले से मौजूद है</string>\n    <string name=\"overwrite_failed\">फाइल को ओवरराइट नहीं कर सकते</string>\n    <string name=\"download_already_pending\">इस नाम का एक डाउनलोड बाकी है</string>\n    <string name=\"error_postprocessing_stopped\">फ़ाइल पर कार्य करते समय न्यूपाइप बंद किया गया</string>\n    <string name=\"error_insufficient_storage_left\">डिवाइस पर जगह समाप्त</string>\n    <string name=\"error_progress_lost\">प्रगति खो गई, क्योंकि फ़ाइल मिटा दी गई थी</string>\n    <string name=\"error_timeout\">कनेक्शन का समय समाप्त</string>\n    <string name=\"confirm_prompt\">क्या आप अपना डाउनलोड इतिहास मिटाना चाहते हैं या सभी डाउनलोड की गई फ़ाइलों को हटाना चाहते हैं\\?</string>\n    <string name=\"enable_queue_limit\">डाउनलोड कतार सीमित करें</string>\n    <string name=\"enable_queue_limit_desc\">एक ही समय में एक डाउनलोड चलेगा</string>\n    <string name=\"start_downloads\">डाउनलोड प्रारंभ करें</string>\n    <string name=\"pause_downloads\">डाउनलोड रोकें</string>\n    <string name=\"downloads_storage_ask_title\">डाउनलोड कहाँ करना है, के लिए पूछें</string>\n    <string name=\"downloads_storage_ask_summary\">आपको हर डाउनलोड का स्थान पूछा जाएगा\n\\nयदि आप बाहरी एसडी कार्ड में डाउनलोड करना चाहते हैं तो सिस्टम फोल्डर पिकर (SAF) को सक्षम करें</string>\n    <string name=\"downloads_storage_use_saf_title\">सिस्टम फोल्डर पिकर (SAF) का प्रयोग करें</string>\n    <string name=\"clear_playback_states_title\">प्लेबैक स्थानों को मिटाएं</string>\n    <string name=\"clear_playback_states_summary\">सारे प्लेबैक स्थानों को मिटाता है</string>\n    <string name=\"delete_playback_states_alert\">सारे प्लेबैक स्थानों को मिटाएं\\?</string>\n    <string name=\"enable_disposed_exceptions_summary\">हैंडलिंग के बाद फ्रैगमेंट या एक्टिविटी लूप के बाहर अनहैंडल्ड Rx एक्सेप्शन की रिपोर्टिंग को बलपूर्वक लागू करें</string>\n    <string name=\"import_soundcloud_instructions\">साउंडक्लाउड प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये:\n\\n\n\\n1. अपने वेब ब्राउज़र में \\\"डेस्कटॉप मोड\\\" चालू करें (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है)\n\\n2. इस युआरएल को खोलें: %1$s\n\\n3. लॉग इन करें\n\\n4. आप जिस प्रोफाइल युआरएल पे भेजे जाते हैं उसे कॉपी करें।</string>\n    <string name=\"start_accept_privacy_policy\">यूरोपीय जनरल डेटा प्रोटेक्शन रेगुलेशन (जीडीपीआर) का अनुपालन करने के लिए, हम आपका ध्यान न्यूपाइप की गोपनीयता नीति पे डालना चाहते हैं। इसे बारीकी से पढ़िए।\n\\nआपको अगर हमें कोई त्रुटि रिपोर्ट भेजना हो तो इसे स्वीकार करना होगा।</string>\n    <string name=\"saved_tabs_invalid_json\">सहेजे टैब्स को पढ़ने में रूकावट, इसलिए सामान्य टैब्स का इस्तेमाल हो रहा है</string>\n    <string name=\"updates_setting_description\">जब नई अपडेट उपलब्ध हो, तब एप अपडेट करने के लिए अधिसूचना दिखाई जाये</string>\n    <string name=\"list_view_mode\">सूचि देखने वाला ढंग</string>\n    <string name=\"grid\">ग्रिड</string>\n    <string name=\"auto\">ऑटो</string>\n    <string name=\"show_error\">त्रुटि दिखाएं</string>\n    <string name=\"error_http_unsupported_range\">सर्वर मल्टी थ्रेडेड डाउनलोड स्वीकार नहीं करता, @string/msg_threads = 1 के साथ पुनः कोशिश करें</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'स्टोरेज एक्सेस फ्रेमवर्क\\' आपको बाहरी एसडी कार्ड पर डाउनलोड करने देता है</string>\n    <string name=\"drawer_header_description\">सेवा चुनें, वर्तमान चुनाव :</string>\n    <string name=\"default_kiosk_page_summary\">डिफ़ॉल्ट कियोस्क</string>\n    <string name=\"no_one_watching\">कोई दर्शक नहीं देख रहा</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s दर्शक है</item>\n        <item quantity=\"other\">%s दर्शक हैं</item>\n    </plurals>\n    <string name=\"no_one_listening\">कोई श्रोता नहीं सुन रहा</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s श्रोता</item>\n        <item quantity=\"other\">%s श्रोता</item>\n    </plurals>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">तेज मोड सक्षम करें</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">तेज मोड अक्षम करें</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">क्या आपको लगता है कि फीड लोडिंग बहुत धीमी है\\? यदि ऐसा है, तो तेज़ लोडिंग को सक्षम करने का प्रयास करें (आप इसे सेटिंग्स में या नीचे दिए गए बटन को दबाकर बदल सकते हैं)।\n\\n\n\\nन्यूपाइप दो फीड लोडिंग रणनीति प्रदान करता है:\n\\n• संपूर्ण सदस्यता चैनल प्राप्त करना, जो धीमा है लेकिन पूरा होता है।\n\\n• एक समर्पित सेवा के समापन बिंदु का उपयोग करना, जो तेज़ है लेकिन आमतौर पर पूरा नहीं होता है।\n\\n\n\\nदोनों के बीच अंतर यह है कि तेज वाली रणनीति में आमतौर पर कुछ जानकारी का अभाव होता है, जैसे कि आइटम की अवधि या प्रकार (लाइव वीडियो और सामान्य वीडियो के बीच अंतर पता नहीं लगा सकते हैं) और ऐसा भी हो सकता है कि ये कम आइटम दिखाए।\n\\n\n\\nयूट्यूब ऐसी सेवा का एक उदाहरण है जो आरएसएस फ़ीड के साथ ये तेज़ विधि प्रदान करता है।\n\\n\n\\nतो आखिर में चुनाव आपकी पसंद पर है: गति या फिर सटीक जानकारी।</string>\n    <string name=\"content_not_supported\">यह सामग्री फिलहाल न्यूपाइप सपोर्ट नहीं करता है।\n\\n\n\\nआशा है कि भविष्य के संस्करणों में सपोर्ट किया जायेगा।</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">चैनल का अवतार थंमनेल</string>\n    <string name=\"video_detail_by\">%s के द्वारा</string>\n    <string name=\"channel_created_by\">%s के द्वारा बनाया गया</string>\n    <string name=\"playlist_page_summary\">प्लेलिस्ट पन्ना</string>\n    <string name=\"search_showing_result_for\">%s : के लिए परिणाम दिखाए जा रहे हैं</string>\n    <string name=\"done\">संपन्न</string>\n    <string name=\"artists\">कलाकार</string>\n    <string name=\"songs\">गीत</string>\n    <string name=\"never\">कभी नहीं</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA कुकीज़ साफ़ कर दिए गए</string>\n    <string name=\"clear_cookie_title\">ReCAPTCHA कुकीज़ साफ़ करें</string>\n    <string name=\"albums\">एल्बम</string>\n    <string name=\"videos_string\">वीडियो</string>\n    <string name=\"restricted_video\">यह वीडियो उम्र प्रतिबंधित है।\n\\n\n\\nयदि आप इसे देखना चाहते हैं तो सेटिंग में \\\"%1$s\\\" चालू करें।</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">यूट्यूब एक \\\"प्रतिबंधित मोड\\\" प्रदान करता है जो संभावित रूप से परिपक्व सामग्री को छुपाता है</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">यूट्यूब का \\\"प्रतिबंधित मोड\\\" चालू करें</string>\n    <string name=\"show_age_restricted_content_summary\">वह सामग्री भी दिखाएं जो आयु सीमा की वजह से शायद बच्चों के लिए अनुपयुक्त हो (जैसे 18+)</string>\n    <string name=\"peertube_instance_add_https_only\">केवल HTTPS यूआरएल ही समर्थित हैं</string>\n    <string name=\"unsupported_url_dialog_message\">URL की पहचान नहीं हो सकी। दूसरे ऐप से खोलें\\?</string>\n    <string name=\"auto_queue_toggle\">ऑटो-कतारबद्ध करें</string>\n    <string name=\"clear_queue_confirmation_title\">कतार को मिटाने से पहले सत्यापन के लिए पूछें</string>\n    <string name=\"seek_duration_title\">फास्ट-फॉरवर्ड/-रिवाइंड सीक अवधि</string>\n    <string name=\"notification_colorize_summary\">एंड्रॉइड को थंमनेल में मुख्य रंग के अनुसार नोटीफिकेशन रंग को अनुकूलित करने की अनुमति दें (ध्यान दें कि यह सभी उपकरणों पर उपलब्ध नहीं है)</string>\n    <string name=\"notification_colorize_title\">नोटीफिकेशन को रंगीन करें</string>\n    <string name=\"notification_action_nothing\">कुछ नहीं</string>\n    <string name=\"notification_action_buffering\">बफरिंग</string>\n    <string name=\"notification_action_shuffle\">शफल करें</string>\n    <string name=\"notification_action_repeat\">दोहराएं</string>\n    <string name=\"notification_actions_at_most_three\">आप कंपैकट नोटीफिकेशन में दिखाए जाने वाले विकल्प में से अधिकतम 3 को चुन सकते है !</string>\n    <string name=\"notification_actions_summary\">नीचे दी गई प्रत्येक नोटीफिकेशन क्रिया को उस पर टैप करके संपादित करें। दाईं ओर चेकबॉक्स का उपयोग करके उनमें से अधिकतम तीन का चयन करें जिन्हें कंपैकट नोटीफिकेशन में दिखाया जाना है।</string>\n    <string name=\"notification_action_4_title\">पांचवा एक्शन बटन</string>\n    <string name=\"notification_action_3_title\">चतुर्थी एक्शन बटन</string>\n    <string name=\"notification_action_2_title\">तृतीय एक्शन बटन</string>\n    <string name=\"notification_action_1_title\">द्वितीय एक्शन बटन</string>\n    <string name=\"notification_action_0_title\">प्रथम एक्शन बटन</string>\n    <string name=\"notification_scale_to_square_image_summary\">नोटीफिकेशन में दिखाए गए वीडियो थंमनेल को 16:9 के बजाय 1:1 के अनुपात में दिखाएँ</string>\n    <string name=\"notification_scale_to_square_image_title\">थंमनेल को 1:1 के अनुपात में करें</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d घंटा</item>\n        <item quantity=\"other\">%d घंटे</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d सेकेंड</item>\n        <item quantity=\"other\">%d सेकंड्स</item>\n    </plurals>\n    <string name=\"remove_watched_popup_title\">देखे गए वीडियो हटायें?</string>\n    <string name=\"remove_watched\">देखे गए को हटा दें</string>\n    <string name=\"systems_language\">सिस्टम डिफ़ॉल्ट</string>\n    <string name=\"app_language_title\">ऐप की भाषा</string>\n    <string name=\"delete_downloaded_files\">डाउनलोड की गई फ़ाइलें हटाएं</string>\n    <string name=\"clear_download_history\">डाउनलोड इतिहास हटायें</string>\n    <string name=\"wifi_only\">केवल वाईफाई पर</string>\n    <string name=\"autoplay_summary\">स्वचालित रूप से प्लेबैक शुरू करें —%s</string>\n    <string name=\"show_memory_leaks\">मेमरी लीक दर्शाएँ</string>\n    <string name=\"unmute\">अवाज चालू करें</string>\n    <string name=\"mute\">अवाज बंद करें</string>\n    <string name=\"most_liked\">सबसे पसंद किए गए</string>\n    <string name=\"recently_added\">हाल ही में जोड़ा</string>\n    <string name=\"local\">स्थानीय</string>\n    <string name=\"no_playlist_bookmarked_yet\">अभी कोई प्लेलिस्ट बुक्मार्क नहीं की हुई</string>\n    <string name=\"select_a_playlist\">प्लेलिस्ट चुनें</string>\n    <string name=\"infinite_videos\">अनगिनत विडीओज़</string>\n    <string name=\"more_than_100_videos\">100+ विडीओज़</string>\n    <string name=\"description_tab_description\">विवरण</string>\n    <string name=\"related_items_tab_description\">संबंधित आइटम्स</string>\n    <string name=\"comments_tab_description\">टिप्पणियाँ</string>\n    <string name=\"error_report_open_github_notice\">कृपया जांचें लें कि क्या आपके क्रैश पर चर्चा करने वाला मुद्दा पहले से मौजूद है। डुप्लिकेट टिकट बनाते समय, आप हमसे समय लेते हैं जो हम वास्तविक बग को ठीक करने के लिए खर्च कर सकते हैं।</string>\n    <string name=\"error_report_open_issue_button_text\">गिटहब पर रिपोर्ट करें</string>\n    <string name=\"permission_display_over_apps\">अन्य ऐप्स पर प्रदर्शित करने की अनुमति दें</string>\n    <string name=\"hash_channel_description\">विडीओ हैशिंग की प्रगति का नोटीफिकेशन</string>\n    <string name=\"hash_channel_name\">वीडियो हैश नोटीफिकेशन</string>\n    <string name=\"show_meta_info_summary\">स्ट्रीम निर्माता, स्ट्रीम सामग्री या खोज अनुरोध के बारे में अतिरिक्त जानकारी देते मेटा जानकारी बक्से को छिपाने के लिए बंद करें</string>\n    <string name=\"show_meta_info_title\">मेटा जानकारी दिखाएं</string>\n    <string name=\"show_description_summary\">वीडियो का विवरण और अतिरिक्त जानकारी छिपाने के लिए इसे बंद करें</string>\n    <string name=\"show_description_title\">विवरण दिखाएं</string>\n    <string name=\"clear_queue_confirmation_description\">सक्रिय प्लेयर की क़तार बदल दी जाएगी</string>\n    <string name=\"clear_queue_confirmation_summary\">एक प्लेयर से दूसरे प्लेयर में जाने से आपकी कतार बदल सकती है</string>\n    <string name=\"open_with\">इसमें खोलें</string>\n    <string name=\"show_thumbnail_title\">थंमनेल दिखाएं</string>\n    <string name=\"show_thumbnail_summary\">लॉक स्क्रीन और नोटिफिकेशन दोनों के लिए थंमनेल का इस्तेमाल करें</string>\n    <string name=\"chapters\">चैप्टर</string>\n    <string name=\"no_app_to_open_intent\">आपके डिवाइस का कोई भी ऐप इसे नहीं खोल सकता है</string>\n    <string name=\"georestricted_content\">यह सामग्री आपके देश में उपलब्ध नहीं है।</string>\n    <string name=\"soundcloud_go_plus_content\">यह एक साउंडक्लाउड गो+ ट्रैक है, कम से कम आपके देश में, इस कारण इसे न्यूपाइप द्वारा स्ट्रीम या डाउनलोड नहीं किया जा सकता है।</string>\n    <string name=\"paid_content\">यह सामग्री केवल उन उपयोगकर्ताओं के लिए उपलब्ध है, जिन्होंने भुगतान किया हो, इस कारण इसे न्यूपाइप द्वारा स्ट्रीम या डाउनलोड नहीं किया जा सकता है।</string>\n    <string name=\"youtube_music_premium_content\">यह वीडियो सिर्फ यूट्यूब म्यूजिक के प्रीमियम सदस्यों के लिए ही उपलब्ध है, इसलिए इसे न्यूपाइप द्वारा स्ट्रीम या डाउनलोड नहीं किया जा सकता है।</string>\n    <string name=\"private_content\">यह सामग्री प्राइवेट है, इसलिए इसे न्यूपाइप द्वारा स्ट्रीम या डाउनलोड नहीं किया जा सकता है।</string>\n    <string name=\"radio\">रेडियो</string>\n    <string name=\"auto_device_theme_title\">ऑटोमैटिक (डिवाइस थीम)</string>\n    <string name=\"night_theme_summary\">अपनी पसंदीदा नाइट थीम चुने — %s</string>\n    <string name=\"select_night_theme_toast\">आप अपनी पसंदीदा नाइट थीम नीचे चुन सकते हैं</string>\n    <string name=\"download_has_started\">डाउनलोड शुरू हो गया है</string>\n    <string name=\"restricted_video_no_stream\">यह वीडियो आयु-प्रतिबंधित है।\n\\nयूट्यूब की नई नीतियों के कारण न्यूपाइप किसी भी आयु प्रतिबंधित वीडियो स्ट्रीम का इस्तेमाल नहीं कर सकता है और इस कारण इसे वीडियो को प्ले करने में असमर्थ है।</string>\n    <string name=\"peertube_instance_url_title\">पियरट्यूब इंसटैंस</string>\n    <string name=\"featured\">फीचर्ड</string>\n    <string name=\"night_theme_title\">रात्रि थीम</string>\n    <string name=\"msg_calculating_hash\">हैश की गणना कर रहा है</string>\n    <string name=\"copy_for_github\">फार्मेट की हूई रिपोर्ट कॉपी करें</string>\n    <string name=\"clear_cookie_summary\">कुकी साफ़ करें जिसे न्यूपाइप आपके द्वारा रीकैप्चा हल करने पर संग्रहित करता है</string>\n    <string name=\"peertube_instance_add_exists\">इंसटैंस पहले से मौजूद है</string>\n    <string name=\"peertube_instance_add_fail\">इंसटैंस मान्य नहीं किया जा सका</string>\n    <string name=\"peertube_instance_add_help\">इंसटैंस यूआरएल दर्ज करें</string>\n    <string name=\"peertube_instance_add_title\">इंसटैंस जोड़ें</string>\n    <string name=\"peertube_instance_url_help\">%s पर अपनी पसंद के इंसटैंस ढूँढ़ें</string>\n    <string name=\"peertube_instance_url_summary\">अपने पसंदीदा पीयर ट्यूब इंसटैंस चुनें</string>\n    <string name=\"start_main_player_fullscreen_title\">मुख्य प्लेयर को पूर्ण स्क्रीन में शुरू करें</string>\n    <string name=\"start_main_player_fullscreen_summary\">मिनी प्लेयर में वीडियो शुरू न करें, बलकि अगर ऑटो रोटेशन लॉक है तो सीधे फुल स्क्रीन मोड पर चलाएं। आप अब भी फ़ुलस्क्रीन से बाहर निकलकर मिनी प्लेयर तक पहुंच सकते हैं</string>\n    <string name=\"comments_are_disabled\">टिप्पणियाँ करना बंद है</string>\n    <string name=\"mark_as_watched\">देखा हुआ चिह्नित करें</string>\n    <string name=\"settings_category_player_notification_title\">प्लेयर नोटीफिकेशन</string>\n    <string name=\"notifications\">नोटीफिकेशन</string>\n    <string name=\"crash_the_player\">प्लेयर क्रैश करें</string>\n    <string name=\"local_search_suggestions\">स्थानीय खोज सुझाव</string>\n    <string name=\"metadata_privacy_public\">सार्वजनिक</string>\n    <string name=\"settings_category_player_notification_summary\">चल रही स्ट्रीम की नोटीफिकेशन को कॉन्फ़िगर करें</string>\n    <string name=\"streams_notification_channel_name\">नई स्ट्रीमें</string>\n    <string name=\"streams_notification_channel_description\">सब्सक्रिप्शनस की नई स्ट्रीमों के नोटीफिकेशन</string>\n    <string name=\"error_report_channel_name\">त्रुटि रिपोर्ट नोटीफिकेशन</string>\n    <string name=\"error_report_channel_description\">त्रुटियों की रिपोर्ट करने के लिए नोटीफिकेशन</string>\n    <string name=\"error_report_notification_title\">न्यूपाइप को एक त्रुटि का सामना करना पड़ा, रिपोर्ट करने के लिए टैप करें</string>\n    <string name=\"recaptcha_solve\">हल करें</string>\n    <string name=\"enqueue_stream\">कतारबद्ध करें</string>\n    <string name=\"title_activity_play_queue\">प्ले कतार</string>\n    <string name=\"enqueued_next\">कतार में आगे जोड़ा गया</string>\n    <string name=\"enqueued\">कतारबद्ध हुआ</string>\n    <string name=\"loading_stream_details\">स्ट्रीम विवरण लोड हो रहे हैं…</string>\n    <string name=\"processing_may_take_a_moment\">प्रोसेस हो रहा है… कुछ समय लग सकता है</string>\n    <string name=\"show_crash_the_player_summary\">प्लेयर का उपयोग करते समय क्रैश विकल्प दिखाता है</string>\n    <string name=\"check_new_streams\">नई स्ट्रीमों के लिए जांच चलाएं</string>\n    <string name=\"show_error_snackbar\">एक त्रुटि स्नैकबार दिखाएं</string>\n    <string name=\"enable_streams_notifications_summary\">सब्सक्रिप्शनस से नई स्ट्रीमों के बारे में सूचित करें</string>\n    <string name=\"streams_notifications_interval_title\">जाँच करने की आवृत्ति</string>\n    <string name=\"streams_notifications_network_title\">नेटवर्क कनेक्शन आवश्यक</string>\n    <string name=\"enable_streams_notifications_title\">नई स्ट्रीम अधिसूचनाएं</string>\n    <string name=\"any_network\">कोई भी नेटवर्क</string>\n    <string name=\"check_for_updates\">अपडेट के लिए जाँच करें</string>\n    <string name=\"low_quality_smaller\">निम्न गुणवत्ता (छोटा)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">सीकबार थंमनेल पूर्वावलोकन</string>\n    <string name=\"high_quality_larger\">उच्च गुणवत्ता (बड़ा)</string>\n    <string name=\"checking_updates_toast\">अपडेटस के लिए जांच हो रही है…</string>\n    <string name=\"recovering\">पुन: प्राप्ति हो रही</string>\n    <string name=\"delete_downloaded_files_confirm\">डिस्क से सभी डाउनलोड की गई फ़ाइलें मिटाएं\\?</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">एंड्रॉइड 10 से शुरू होकर केवल \\'स्टोरेज एक्सेस फ्रेमवर्क\\' समर्थित है</string>\n    <string name=\"choose_instance_prompt\">एक इंस्टेंस चुनें</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">हां, और आंशिक रूप से देखे गए वीडियो भी</string>\n    <string name=\"feed_notification_loading\">फ़ीड लोड हो रही है…</string>\n    <string name=\"feed_update_threshold_title\">फ़ीड अपडेट चरणसीमा</string>\n    <string name=\"feed_load_error\">फ़ीड लोड करने में त्रुटि हूई</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' के लिए फ़ीड लोड नहीं हो सकी।</string>\n    <string name=\"recent\">हाल ही के</string>\n    <string name=\"description_select_enable\">विवरण में पाठ का चयन सक्षम करें</string>\n    <string name=\"metadata_privacy\">गोपनीयता</string>\n    <string name=\"description_select_note\">अब आप विवरण के अंदर पाठ का चयन कर सकते हैं। ध्यान दें कि पृष्ठ झिलमिला सकता है और चयन मोड में लिंक क्लिक करने योग्य नहीं हो सकते हैं।</string>\n    <string name=\"metadata_age_limit\">आयु सीमा</string>\n    <string name=\"metadata_support\">सहायता</string>\n    <string name=\"metadata_host\">होसट</string>\n    <string name=\"notifications_disabled\">नोटीफिकेशन अक्षम हैं</string>\n    <string name=\"metadata_privacy_unlisted\">गैर-सूचीबद्ध</string>\n    <string name=\"toggle_all\">सबको टॉगल करें</string>\n    <string name=\"get_notified\">अधिसूचना पायें</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"manual_update_description\">नई अपडेट के लिए मैन्युअल रूप से जांचें</string>\n    <string name=\"new_seek_duration_toast\">एक्सोप्लेयर की बंदिश के कारण सीक करने की अवधि %d सेकंड पर सेट की गई</string>\n    <string name=\"account_terminated\">खाता बंद किया गया</string>\n    <string name=\"streams_not_yet_supported_removed\">जो स्ट्रीम अभी तक डाउनलोडर द्वारा समर्थित नहीं हैं, वो नहीं दिखाई जाती</string>\n    <string name=\"select_quality_external_players\">बाहरी प्लेयरस के लिए क्वालिटी का चयन करें</string>\n    <string name=\"unknown_format\">अज्ञात फार्मेट</string>\n    <string name=\"unknown_quality\">अज्ञात क्वालिटी</string>\n    <string name=\"crash_the_app\">ऐप को क्रैश करें</string>\n    <string name=\"metadata_category\">श्रेणी</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">आपसे पूछा जाएगा कि प्रत्येक डाउनलोड को कहां सहेजना है</string>\n    <string name=\"off\">ऑफ़</string>\n    <string name=\"feed_update_threshold_option_always_update\">हमेशा अपडेट करें</string>\n    <string name=\"description_select_disable\">विवरण में पाठ का चयन अक्षम करें</string>\n    <string name=\"dont_show\">मत दिखाओ</string>\n    <string name=\"remote_search_suggestions\">रिमोट खोज सुझाव</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s नई स्ट्रीम</item>\n        <item quantity=\"other\">%s नई स्ट्रीमें</item>\n    </plurals>\n    <string name=\"percent\">प्रतिशत</string>\n    <string name=\"semitone\">सैमीटोन</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">डाउनलोड संपूर्ण</item>\n        <item quantity=\"other\">%s डाउनलोड संपूर्ण</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d दिन</item>\n        <item quantity=\"other\">%d दिन</item>\n    </plurals>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d चयनित</item>\n        <item quantity=\"other\">%d चयनित हुए</item>\n    </plurals>\n    <string name=\"progressive_load_interval_exoplayer_default\">एक्सोप्लेयर डिफ़ॉल्ट</string>\n    <string name=\"progressive_load_interval_title\">प्लेबैक लोड अंतराल आकार</string>\n    <string name=\"feed_group_dialog_empty_name\">समूह का नाम नहीं</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">सब्सक्रिप्शनस चुनें</string>\n    <string name=\"feed_group_dialog_delete_message\">क्या आप इस समूह को हटाना चाहते हैं\\?</string>\n    <string name=\"feed_create_new_group_button_title\">नया</string>\n    <string name=\"settings_category_feed_title\">फ़ीड</string>\n    <string name=\"feed_new_items\">नये फ़ीड आइटम</string>\n    <string name=\"feed_processing_message\">फ़ीड प्रोसेस हो रही है …</string>\n    <string name=\"open_website_license\">वेबसाइट खोलें</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">उपलब्ध होने पर समर्पित फ़ीड से प्राप्त करें</string>\n    <string name=\"metadata_language\">भाषा</string>\n    <string name=\"on\">ऑन</string>\n    <string name=\"playlist_no_uploader\">स्वतः बने (कोई अपलोडर नहीं मिला)</string>\n    <string name=\"feed_groups_header_title\">चैनल समूह</string>\n    <string name=\"faq_title\">अक्सर पूछे जाते प्रश्न</string>\n    <string name=\"faq\">वेबसाइट पर देखें</string>\n    <string name=\"main_page_content_swipe_remove\">आइटम हटाने के लिए स्वाइप करें</string>\n    <string name=\"disable_media_tunneling_title\">मीडिया टनलिंग अक्षम करें</string>\n    <string name=\"show_crash_the_player_title\">\\\"क्रैश द प्लेयर\\\" दिखाएं</string>\n    <string name=\"feed_subscription_not_loaded_count\">लोड नहीं हुआ: %d</string>\n    <string name=\"metadata_tags\">टैग</string>\n    <string name=\"metadata_licence\">लाइसेंस</string>\n    <string name=\"faq_description\">यदि आपको ऐप का उपयोग करने में परेशानी हो रही है, तो सामान्य प्रश्नों के इन उत्तरों को देखना सुनिश्चित करें!</string>\n    <string name=\"enqueue_next_stream\">कतार में आगे जोड़ें</string>\n    <string name=\"progressive_load_interval_summary\">प्रगतिशील सामग्री पर लोड अंतराल आकार बदलें (वर्तमान में %s)। एक कम मान उनकी आरंभिक लोडिंग को गति दे सकता है</string>\n    <string name=\"leak_canary_not_available\">लीक-कैनरी उपलब्ध नहीं है</string>\n    <string name=\"error_report_notification_toast\">एक त्रुटी हुई है, नोटीफिकेशन देखें</string>\n    <string name=\"disable_media_tunneling_summary\">यदि वीडियो प्लेबैक पर आप काली स्क्रीन या रुक-रुक कर वीडियो चलने का अनुभव करते हैं तो मीडिया टनलिंग को अक्षम करें।</string>\n    <string name=\"create_error_notification\">त्रुटी की नोटीफिकेशन बनाएं</string>\n    <string name=\"error_download_resource_gone\">इस डाउनलोड को पुनर्प्राप्त नहीं किया जा सकता</string>\n    <string name=\"no_dir_yet\">अभी तक कोई डाउनलोड फ़ोल्डर सेट नहीं किया गया है, अब डिफ़ॉल्ट डाउनलोड फ़ोल्डर चुनें</string>\n    <string name=\"subtitle_activity_recaptcha\">हल होने पर \\\"संपन्न\\\" दबाएं</string>\n    <string name=\"show_channel_details\">चैनल विवरण दिखाएं</string>\n    <string name=\"show_original_time_ago_title\">आइटम्स का असल अपलोड समय दिखाएं</string>\n    <string name=\"show_original_time_ago_summary\">सेवाओं से मूल पाठ स्ट्रीम आइटम में दिखाई देंगे</string>\n    <string name=\"remove_watched_popup_warning\">प्लेलिस्ट में शामिल, पहले और बाद में देखे जा चुके वीडियो हटा दिए जाएंगे। \\nक्या यक़ीनन आप ऐसा चाह्ते हैं? इसे असंपादित नहीं किया जा सकेगा!</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d मिनट</item>\n        <item quantity=\"other\">%d मिनट्स</item>\n    </plurals>\n    <string name=\"feed_oldest_subscription_update\">फ़ीड आख़िरी दफा %s को अपडेट हुई</string>\n    <string name=\"feed_group_dialog_empty_selection\">कोई सब्सक्रिप्शन नहीं चुनी हूई</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">केवल असमूहीकृत सब्सक्रिप्शनस दिखाएं</string>\n    <string name=\"feed_load_error_fast_unknown\">फ़ास्ट फ़ीड मोड इस पर अधिक जानकारी प्रदान नहीं करता है।</string>\n    <string name=\"feed_update_threshold_summary\">अपडेट अंतराल जब सब्सक्रिप्शन फ़ीड दोबारा अपडेट किये जा सकें — %s</string>\n    <string name=\"feed_load_error_terminated\">लेखक का खाता समाप्त कर दिया गया है।\n\\nन्यूपाइप भविष्य में इस फीड को लोड नहीं कर पाएगा।\n\\nक्या आप इस चैनल की सदस्यता समाप्त करना चाहते हैं\\?</string>\n    <string name=\"selected_stream_external_player_not_supported\">चयनित स्ट्रीम बाहरी प्लेयरस द्वारा समर्थित नहीं है</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">इस क्रिया के लिए कोई उपयुक्त फ़ाइल प्रबंधक नहीं मिला।\n\\nकृपया स्टोरेज एक्सेस फ्रेमवर्क संगत फ़ाइल प्रबंधक इंस्टॉल करें</string>\n    <string name=\"metadata_privacy_private\">निजी</string>\n    <string name=\"metadata_privacy_internal\">आंतरिक</string>\n    <string name=\"detail_pinned_comment_view_description\">पिन की हुई टिप्पणी</string>\n    <string name=\"detail_heart_img_view_description\">निर्माता द्वारा दिया दिल</string>\n    <string name=\"tablet_mode_title\">टैबलेट मोड</string>\n    <string name=\"you_successfully_subscribed\">आपने इस चैनल को अभी सब्सक्राइब किया है</string>\n    <string name=\"no_video_streams_available_for_external_players\">बाहरी प्लेयरस के लिए कोई वीडियो स्ट्रीम उपलब्ध नहीं है</string>\n    <string name=\"no_audio_streams_available_for_external_players\">बाहरी प्लेयरस के लिए कोई ऑडियो स्ट्रीम उपलब्ध नहीं है</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">कुछ सेवाओं में उपलब्ध, यह आमतौर पर बहुत तेज होता है लेकिन सीमित मात्रा में जानकारी प्रदान कर पाता है और वह भी अक्सर अधूरी जानकारी (जैसे कि अवधि, आइटम की किसम, स्ट्रीम लाइव है, नहीं बता पाता)</string>\n    <string name=\"no_appropriate_file_manager_message\">इस क्रिया के लिए कोई उपयुक्त फ़ाइल प्रबंधक नहीं मिला।\n\\nकृपया फ़ाइल प्रबंधक इंस्टॉल करें या डाउनलोड सेटिंग में \\'%s\\' को अक्षम करने का प्रयास करें</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s डाउनलोड हटाए गए</item>\n        <item quantity=\"other\">%1$s डाउनलोड्स हटाए गए</item>\n    </plurals>\n    <string name=\"sort\">क्रमबद्ध करें</string>\n    <string name=\"fast_mode\">तेज मोड</string>\n    <string name=\"import_subscriptions_hint\">3-बिंदु वाले मेन्यू से सब्सक्रिप्शनस आयात या निर्यात करें</string>\n    <string name=\"app_update_unavailable_toast\">आप न्यूपाइप का नवीनतम संस्करण चला रहे हैं</string>\n    <string name=\"app_update_available_notification_text\">%s डाउनलोड करने के लिए टैप करें</string>\n    <string name=\"night_theme_available\">यह विकल्प केवल तभी उपलब्ध होता है जब थीम के लिए %s का चयन किया जाता है</string>\n    <string name=\"unset_playlist_thumbnail\">स्थायी थंमनेल अनसैंट करें</string>\n    <string name=\"card\">कार्ड</string>\n    <string name=\"msg_failed_to_copy\">क्लिपबोर्ड पर कॉपी करने में विफल</string>\n    <string name=\"duplicate_in_playlist\">धुंधली की गई प्‍लेलिस्‍ट में पहले से ही यह आइटम है।</string>\n    <string name=\"playlist_add_stream_success_duplicate\">डुप्लीकेट जोड़ा गया %d बार</string>\n    <string name=\"remove_duplicates\">डुप्लीकेट हटाएं</string>\n    <string name=\"remove_duplicates_title\">डुप्लीकेट हटाए जाएं\\?</string>\n    <string name=\"remove_duplicates_message\">क्या आप इस प्लेलिस्ट में मौजूद सभी डुप्लीकेट स्ट्रीम हटाना चाहते हैं\\?</string>\n    <string name=\"feed_hide_streams_title\">निम्नलिखित स्ट्रीम दिखाएँ</string>\n    <string name=\"feed_show_upcoming\">आगामी</string>\n    <string name=\"ignore_hardware_media_buttons_title\">हार्डवेयर मीडिया बटन घटनाओं की अनदेखी करें</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">उपयोगी है, उदाहरण के लिए, यदि आप टूटे हुए भौतिक बटन वाले हेडसेट का उपयोग कर रहे हैं</string>\n    <string name=\"feed_show_hide_streams\">स्ट्रीम दिखाएँ / छिपाएँ</string>\n    <string name=\"feed_show_watched\">पूरा देखा</string>\n    <string name=\"feed_show_partially_watched\">आंशिक रूप से देखा गया</string>\n    <string name=\"left_gesture_control_title\">बाएँ इशारा क्रिया</string>\n    <string name=\"brightness\">चमक</string>\n    <string name=\"volume\">आवाज़</string>\n    <string name=\"none\">कोई नहीं</string>\n    <string name=\"left_gesture_control_summary\">प्लेयर स्क्रीन के बाएँ आधे हिस्से के लिए जेस्चर चुनें</string>\n    <string name=\"right_gesture_control_summary\">प्लेयर स्क्रीन के दाहिने आधे हिस्से के लिए जेस्चर चुनें</string>\n    <string name=\"right_gesture_control_title\">दाएँ इशारा क्रिया</string>\n    <string name=\"prefer_original_audio_title\">मूल ऑडियो को प्राथमिकता दें</string>\n    <string name=\"prefer_descriptive_audio_summary\">यदि उपलब्ध हो तो दृष्टिबाधित लोगों के लिए विवरण के साथ एक ऑडियो ट्रैक का चयन करें</string>\n    <string name=\"prefer_descriptive_audio_title\">वर्णनात्मक ऑडियो को प्राथमिकता दें</string>\n    <string name=\"prefer_original_audio_summary\">भाषा की परवाह किए बिना मूल ऑडियो ट्रैक का चयन करें</string>\n    <string name=\"play_queue_audio_track\">ऑडियो: %s</string>\n    <string name=\"audio_track\">ऑडियो ट्रैक</string>\n    <string name=\"select_audio_track_external_players\">बाहरी प्लेयर्स के लिए ऑडियो ट्रैक का चयन करें</string>\n    <string name=\"unknown_audio_track\">अज्ञात</string>\n    <string name=\"settings_category_exoplayer_title\">एक्सोप्लेयर सेटिंग्स</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">एक्सोप्लेयर के डिकोडर फॉलबैक फीचर का उपयोग करें</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">हमेशा एक्सोप्लेयर के वीडियो आउटपुट सतह सेटिंग वर्कअराउंड का उपयोग करें</string>\n    <string name=\"audio_track_type_original\">मूल</string>\n    <string name=\"audio_track_type_dubbed\">डब की हूई</string>\n    <string name=\"audio_track_type_descriptive\">वर्णनात्मक</string>\n    <string name=\"audio_track_present_in_video\">एक ऑडियो ट्रैक पहले से ही इस स्ट्रीम में मौजूद होना चाहिए</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">इस विकल्प को सक्षम करें यदि आपके पास डिकोडर आरंभीकरण समस्याएं हैं, जो प्राथमिक डिकोडर आरंभ करने में विफल होने पर कम प्राथमिकता वाले डिकोडर पर वापस आ जाती है। इससे प्राथमिक डिकोडर का उपयोग करने की तुलना में खराब प्लेबैक प्रदर्शन हो सकता है</string>\n    <string name=\"settings_category_exoplayer_summary\">कुछ एक्सोप्लेयर सेटिंग्स प्रबंधित करें। इन परिवर्तनों को प्रभावी बनाने के लिए प्लेयर को पुनरारंभ करने की आवश्यकता होती है</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">सतह को सीधे कोडेक पर सेट करने के बजाय, सतह परिवर्तन होने पर यह वर्कअराउंड वीडियो कोडेक्स को जारी और पुन: चालू करता है। इस समस्या के साथ कुछ उपकरणों पर ExoPlayer द्वारा पहले से ही उपयोग किया जाता है, इस सेटिंग का केवल Android 6 और उच्चतर पर प्रभाव पड़ता है\n\\n\n\\nइस विकल्प को सक्षम करने से वर्तमान वीडियो प्लेयर स्विच करते समय या फुलस्क्रीन पर स्विच करते समय प्लेबैक त्रुटियों को रोका जा सकता है</string>\n    <string name=\"main_tabs_position_title\">मुख्य टैब की स्थिति</string>\n    <string name=\"main_tabs_position_summary\">मुख्य टैब सिलेक्टर को नीचे ले जाएँ</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"disable_media_tunneling_automatic_info\">आपके डिवाइस पर मीडिया टनलिंग डिफ़ॉल्ट रूप से अक्षम कर दी गई थी क्योंकि यह ज्ञात है कि आपका डिवाइस मॉडल इसका समर्थन नहीं करता।</string>\n    <string name=\"no_streams\">कोई स्ट्रीम नहीं</string>\n    <string name=\"no_live_streams\">कोई लाइव स्ट्रीम नहीं</string>\n    <string name=\"channel_tab_videos\">वीडियोज़</string>\n    <string name=\"metadata_subscribers\">सब्सक्राइबर्स</string>\n    <string name=\"show_channel_tabs_summary\">चैनल पेजों पर कौन से टैब दिखाए जाते हैं</string>\n    <string name=\"show_channel_tabs\">चैनल टैब्स</string>\n    <string name=\"channel_tab_shorts\">शॉर्ट्स</string>\n    <string name=\"loading_metadata_title\">मेटाडेटा लोड हो रहा है…</string>\n    <string name=\"feed_fetch_channel_tabs\">चैनल टैब प्राप्त करें</string>\n    <string name=\"channel_tab_about\">बारे में</string>\n    <string name=\"channel_tab_albums\">एल्बम्स</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">फ़ीड अपडेट करते समय प्राप्त करने वाले टैब। यदि किसी चैनल को तेज़ मोड का उपयोग करके अपडेट किया जाता है तो इस विकल्प का कोई प्रभाव नहीं पड़ता है।</string>\n    <string name=\"channel_tab_playlists\">प्लेलिस्ट्स</string>\n    <string name=\"channel_tab_tracks\">ट्रैक्स</string>\n    <string name=\"channel_tab_channels\">चैनल्स</string>\n    <string name=\"channel_tab_livestreams\">लाइव</string>\n    <string name=\"toggle_screen_orientation\">स्क्रीन ओरिएंटेशन टॉगल करें</string>\n    <string name=\"toggle_fullscreen\">फ़ुलस्क्रीन टॉगल करें</string>\n    <string name=\"next_stream\">अगली स्ट्रीम</string>\n    <string name=\"open_play_queue\">प्ले कतार खोलें</string>\n    <string name=\"forward\">फॉरवर्ड करें</string>\n    <string name=\"rewind\">रिवाइंड करें</string>\n    <string name=\"replay\">पुनः चलाएं</string>\n    <string name=\"play\">चलाएं</string>\n    <string name=\"more_options\">अधिक विकल्प</string>\n    <string name=\"duration\">अवधि</string>\n    <string name=\"previous_stream\">पिछली स्ट्रीम</string>\n    <string name=\"image_quality_title\">छवि की गुणवत्ता</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"image_quality_low\">कम गुणवत्ता</string>\n    <string name=\"metadata_avatars\">अवतार</string>\n    <string name=\"metadata_subchannel_avatars\">उप-चैनल अवतार</string>\n    <string name=\"image_quality_none\">छवियाँ लोड न करें</string>\n    <string name=\"image_quality_high\">उच्च गुणवत्ता</string>\n    <string name=\"image_quality_medium\">मध्यम गुणवत्ता</string>\n    <string name=\"metadata_uploader_avatars\">अपलोडर अवतार</string>\n    <string name=\"metadata_banners\">बैनर</string>\n    <string name=\"image_quality_summary\">डेटा और मेमोरी उपयोग को कम करने के लिए छवियों की गुणवत्ता और छवियों को लोड करना है या नहीं, चुनें। परिवर्तन इन-मेमोरी और ऑन-डिस्क छवि कैश दोनों को साफ़ करते हैं - %s</string>\n    <string name=\"metadata_thumbnails\">थंमनेल</string>\n    <string name=\"share_playlist_with_list\">URL सूची साझा करें</string>\n    <string name=\"share_playlist_with_titles\">शीर्षकों के साथ साझा करें</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">प्लेलिस्ट साझा करें</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s जवाब</item>\n        <item quantity=\"other\">%s जवाब</item>\n    </plurals>\n    <string name=\"show_more\">और दिखाओ</string>\n    <string name=\"notification_actions_summary_android13\">नीचे दी गई प्रत्येक अधिसूचना कार्रवाई पर टैप करके उसे संपादित करें। पहली तीन क्रियाएँ (चलाएँ/रोकें, पिछली और अगली) सिस्टम द्वारा निर्धारित की जाती हैं और इन्हें अनुकूलित नहीं किया जा सकता है।</string>\n    <string name=\"show_less\">कम दिखाएं</string>\n    <string name=\"auto_update_check_description\">न्यूपाइप समय-समय पर स्वचालित रूप से नए संस्करणों की जांच कर सकती है और उपलब्ध होने पर आपको सूचित कर सकती है।\n\\nक्या आप इसे सक्षम करना चाहते हैं?</string>\n    <string name=\"reset_settings_title\">सेटिंग्स रीसेट करें</string>\n    <string name=\"reset_settings_summary\">सभी सेटिंग्स को उनके डिफ़ॉल्ट मानों पर रीसेट करें</string>\n    <string name=\"reset_all_settings\">सभी सेटिंग्स को रीसेट करने से आपकी सभी पसंदीदा सेटिंग्स खारिज हो जाएंगी और ऐप पुनः प्रारंभ हो जाएगा।\n\\n\n\\nक्या आप सुनिश्चित रूप से आगे बढ़ना चाहते हैं?</string>\n    <string name=\"yes\">हाँ</string>\n    <string name=\"no\">नहीं</string>\n    <string name=\"error_insufficient_storage\">डिवाइस पर पर्याप्त खाली स्थान नहीं है</string>\n    <string name=\"settings_category_backup_restore_title\">बैकअप और रिस्टोर</string>\n    <string name=\"import_settings_vulnerable_format\">आयात किए जा रहे निर्यात में सेटिंग्स एक कमजोर प्रारूप का उपयोग करती हैं जिसे न्यूपाइप 0.27.0 के बाद से हटा दिया गया था। सुनिश्चित करें कि आयात किया जा रहा निर्यात किसी विश्वसनीय स्रोत से है, और भविष्य में केवल न्यूपाइप 0.27.0 या नए से प्राप्त निर्यात का उपयोग करना पसंद करें। इस असुरक्षित प्रारूप में सेटिंग्स आयात करने के लिए समर्थन जल्द ही पूरी तरह से हटा दिया जाएगा, और फिर न्यूपाइप के पुराने संस्करण अब नए संस्करणों से निर्यात की सेटिंग्स आयात नहीं कर पाएंगे।</string>\n    <string name=\"audio_track_type_secondary\">सेकेंडरी</string>\n    <string name=\"search_with_service_name\">%1$s खोजें</string>\n    <string name=\"search_with_service_name_and_filter\">%1$s (%2$s) खोजें</string>\n    <string name=\"tab_bookmarks_short\">प्लेलिस्ट</string>\n    <string name=\"select_a_feed_group\">कृपया एक फ़ीड समूह चुनें</string>\n    <string name=\"no_feed_group_created_yet\">अभी तक कोई फ़ीड समूह नहीं बनाया गया है</string>\n    <string name=\"feed_group_page_summary\">चैनल समूह पेज</string>\n    <string name=\"channel_tab_likes\">पसंद</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">यूट्यूब अस्थायी प्लेलिस्ट के रूप में साझा करें</string>\n    <string name=\"entry_deleted\">एंटरी मिटा दी गई</string>\n    <string name=\"delete_file\">फाईल डिलीट करें</string>\n    <string name=\"delete_entry\">एंटरी मिटाऐं</string>\n    <string name=\"short_thousand\">%sहज़ार</string>\n    <string name=\"permission_display_over_apps_message\">पॉपअप प्लेयर इस्तेमाल करने के लिए, कृपया नीचे दिए गए Android सेटिंग्स मेनू में %1$s चुनें और %2$s चालू करें।</string>\n    <string name=\"permission_display_over_apps_permission_name\">“अन्य ऐप्स पर डिस्प्ले की अनुमति दें”</string>\n    <string name=\"short_million\">%sमिलीअन</string>\n    <string name=\"short_billion\">%sअरब</string>\n    <string name=\"account_terminated_service_provides_reason\">अकाउंट बंद कर दिया गया\\n\\n%1$s यह कारण बताता है: %2$s</string>\n    <string name=\"migration_info_6_7_title\">साउंडक्लाउड टॉप 50 पेज हटा दिया गया</string>\n    <string name=\"migration_info_6_7_message\">साउंडक्लाउड ने ओरिजिनल टॉप 50 चार्ट बंद कर दिए हैं। इससे जुड़ा टैब आपके मेन पेज से हटा दिया गया है।</string>\n    <string name=\"migration_info_7_8_title\">YouTube कंबाइंड ट्रेंडिंग हटा दी गई</string>\n    <string name=\"migration_info_7_8_message\">YouTube ने 21 जुलाई 2025 से कंबाइंड ट्रेंडिंग पेज बंद कर दिया है। NewPipe ने डिफ़ॉल्ट ट्रेंडिंग पेज को ट्रेंडिंग लाइवस्ट्रीम से बदल दिया है।\\n\\nआप \\\"सेटिंग्स &gt; कंटेंट &gt; मेन पेज कंटेंट\\\" में अलग-अलग ट्रेंडिंग पेज भी चुन सकते हैं।</string>\n    <string name=\"trending_gaming\">गेमिंग ट्रेंडस</string>\n    <string name=\"trending_podcasts\">ट्रेंडिंग पॉडकास्ट</string>\n    <string name=\"trending_movies\">ट्रेंडिंग फिल्में और शो</string>\n    <string name=\"trending_music\">ट्रेंडिंग संगीत</string>\n    <string name=\"player_http_403\">पले करते समय सर्वर से HTTP error 403 मिला, शायद स्ट्रीमिंग URL एक्सपायर होने या IP बैन की वजह से हुआ</string>\n    <string name=\"player_http_invalid_status\">पले करते समय सर्वर से HTTP error %1$s मिला</string>\n    <string name=\"youtube_player_http_403\">पले करते समय सर्वर से HTTP error 403 मिला, जो शायद IP बैन या स्ट्रीमिंग URL डीओबफस्केशन की दिक्कतों की वजह से हुआ है</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s ने डेटा देने से मना कर दिया, और यह कन्फर्म करने के लिए लॉगिन मांगा कि रिक्वेस्ट करने वाला बोट नहीं है।\\n\\nहो सकता है कि %1$s ने आपके IP को कुछ समय के लिए बैन कर दिया हो, आप कुछ समय इंतज़ार कर सकते हैं या किसी दूसरे IP पर स्विच कर सकते हैं (जैसे VPN ऑन/ऑफ करके, या WiFi से मोबाइल डेटा पर स्विच करके)।</string>\n    <string name=\"unsupported_content_in_country\">यह कंटेंट अभी चुने गए देश के कंटेंट के लिए उपलब्ध नहीं है।\\n\\n\\\"सेटिंग्स &gt; कंटेंट &gt; डिफ़ॉल्ट कंटेंट देश\\\" से अपना चुनाव बदलें।</string>\n    <string name=\"kao_dialog_warning\">Google ने घोषणा की है कि 2026/2027 से, प्रमाणित Android डिवाइसों पर सभी ऐप्स के लिए डेवलपर्स को अपनी व्यक्तिगत पहचान संबंधी जानकारी सीधे Google को जमा करनी होगी। चूँकि इस ऐप के डेवलपर्स इस आवश्यकता से सहमत नहीं हैं, यह ऐप उस समय के बाद प्रमाणित Android डिवाइसों पर काम नहीं करेगा।</string>\n    <string name=\"kao_dialog_more_info\">विवरण</string>\n    <string name=\"kao_solution\">समाधान</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-hr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Počni dodirom na povećalo.</string>\n    <string name=\"upload_date_text\">Objavljeno %1$s</string>\n    <string name=\"no_player_found\">Nije pronađen nijedan player tokova. Želiš li instalirati VLC?</string>\n    <string name=\"install\">Instaliraj</string>\n    <string name=\"cancel\">Odustani</string>\n    <string name=\"open_in_browser\">Otvori u pregledniku</string>\n    <string name=\"open_in_popup_mode\">Otvori skočni prozor</string>\n    <string name=\"share\">Dijeli</string>\n    <string name=\"download\">Preuzimanje</string>\n    <string name=\"search\">Pretraga</string>\n    <string name=\"settings\">Postavke</string>\n    <string name=\"did_you_mean\">Misliš li „%1$s”\\?</string>\n    <string name=\"share_dialog_title\">Dijeli s</string>\n    <string name=\"use_external_video_player_title\">Koristi vanjski video player</string>\n    <string name=\"use_external_video_player_summary\">Uklanja audiosnimku pri nekim rezolucijama</string>\n    <string name=\"use_external_audio_player_title\">Koristi eksterni audio player</string>\n    <string name=\"subscribe_button_title\">Pretplati se</string>\n    <string name=\"subscribed_button_title\">Pretplaćeno</string>\n    <string name=\"channel_unsubscribed\">Pretplata na kanal otkazana</string>\n    <string name=\"subscription_change_failed\">Nije bilo moguće promijeniti pretplatu</string>\n    <string name=\"subscription_update_failed\">Nije bilo moguće aktualizirati pretplatu</string>\n    <string name=\"tab_subscriptions\">Pretplate</string>\n    <string name=\"fragment_feed_title\">Što je novo</string>\n    <string name=\"controls_background_title\">Pozadina</string>\n    <string name=\"controls_popup_title\">Skočni prozor</string>\n    <string name=\"download_path_title\">Mapa za preuzimanje videozapisa</string>\n    <string name=\"download_path_summary\">Preuzete video datoteke se spremaju ovdje</string>\n    <string name=\"download_path_dialog_title\">Odaberi mapu za preuzimanje video datoteka</string>\n    <string name=\"download_path_audio_title\">Mapa za preuzimanje audiosnimaka</string>\n    <string name=\"download_path_audio_summary\">Preuzete datoteke audiosnimaka se spremaju ovdje</string>\n    <string name=\"download_path_audio_dialog_title\">Odaberi mapu za preuzimanje datoteka audiosnimaka</string>\n    <string name=\"default_resolution_title\">Zadana rezolucija</string>\n    <string name=\"default_popup_resolution_title\">Zadana rezolucija skočnog prozora</string>\n    <string name=\"show_higher_resolutions_title\">Prikaži veće rezolucije</string>\n    <string name=\"show_higher_resolutions_summary\">Samo neki uređaji podržavaju reprodukciju 2K/4K videa</string>\n    <string name=\"play_with_kodi_title\">Reproduciraj s Kodijem</string>\n    <string name=\"kore_not_found\">Instalirati nedostajuću Kore aplikaciju?</string>\n    <string name=\"show_play_with_kodi_title\">Prikaži opciju „Reproduciraj pomoću Kodija”</string>\n    <string name=\"show_play_with_kodi_summary\">Prikaži opciju za reproduciranje videozapisa putem Kodija</string>\n    <string name=\"play_audio\">Audiosnimka</string>\n    <string name=\"default_audio_format_title\">Zadani audio format</string>\n    <string name=\"default_video_format_title\">Zadani video format</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"light_theme_title\">Svijetla</string>\n    <string name=\"dark_theme_title\">Tamna</string>\n    <string name=\"black_theme_title\">Crna</string>\n    <string name=\"popup_remember_size_pos_title\">Zapamti veličinu i poziciju skočnog prozora</string>\n    <string name=\"popup_remember_size_pos_summary\">Zapamti posljednju veličinu i poziciju skočnog prozora</string>\n    <string name=\"show_search_suggestions_title\">Prijedlozi pretrage</string>\n    <string name=\"show_search_suggestions_summary\">Odaberi prijedloge koji se prikazuju pri traženju</string>\n    <string name=\"enable_search_history_title\">Povijest pretraživanja</string>\n    <string name=\"enable_search_history_summary\">Spremi pretrage lokalno</string>\n    <string name=\"enable_watch_history_title\">Povijest gledanja</string>\n    <string name=\"enable_watch_history_summary\">Prati gledana videa</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Nastavi reprodukciju</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Nastavi reproducirati nakon prekidanja (npr. telefonski pozivi)</string>\n    <string name=\"download_dialog_title\">Preuzimanje</string>\n    <string name=\"show_next_and_similar_title\">Prikaži videa „Sljedeći” i „Slični”</string>\n    <string name=\"unsupported_url\">URL nije podržan</string>\n    <string name=\"content_language_title\">Zadani jezik sadržaja</string>\n    <string name=\"settings_category_video_audio_title\">Video i audio</string>\n    <string name=\"settings_category_appearance_title\">Izgled</string>\n    <string name=\"background_player_playing_toast\">Reprodukcija u pozadini</string>\n    <string name=\"popup_playing_toast\">Reprodukcija u skočnom prozoru</string>\n    <string name=\"content\">Sadržaj</string>\n    <string name=\"show_age_restricted_content_title\">Prikaži dobno ograničeni sadržaj</string>\n    <string name=\"duration_live\">Uživo</string>\n    <string name=\"downloads\">Preuzimanja</string>\n    <string name=\"downloads_title\">Preuzimanja</string>\n    <string name=\"error_report_title\">Izvještaj o grešci</string>\n    <string name=\"all\">Sve</string>\n    <string name=\"disabled\">Isključeno</string>\n    <string name=\"clear\">Očisti</string>\n    <string name=\"best_resolution\">Najbolja rezolucija</string>\n    <string name=\"general_error\">Greška</string>\n    <string name=\"network_error\">Greška u mreži</string>\n    <string name=\"could_not_load_thumbnails\">Nije bilo moguće učitati sve sličice</string>\n    <string name=\"parsing_error\">Nije bilo moguće obraditi stranicu</string>\n    <string name=\"content_not_available\">Sadržaj nije dostupan</string>\n    <string name=\"could_not_setup_download_menu\">Nije bilo moguće postaviti izbornik za preuzimanje</string>\n    <string name=\"app_ui_crash\">Aplikacija/korisničko sučelje su preknuli raditi</string>\n    <string name=\"sorry_string\">Oprosti, ovo se nije trebalo dogoditi.</string>\n    <string name=\"error_report_button_text\">Prijavi putem e-maila</string>\n    <string name=\"error_snackbar_message\">Žao nam je, došlo je do neke greške.</string>\n    <string name=\"error_snackbar_action\">Prijavi</string>\n    <string name=\"what_device_headline\">Informacije:</string>\n    <string name=\"what_happened_headline\">Što se dogodilo:</string>\n    <string name=\"info_labels\">Što:\\nZahtjev:\\nJezik sadržaja:\\nZemlja sadržaja:\\nJezik aplikacije:\\nUsluga:\\nGMT vrijeme:\\nPaket:\\nVerzija:\\nVerzija OS-a:</string>\n    <string name=\"your_comment\">Tvoj komentar (na engleskom):</string>\n    <string name=\"error_details_headline\">Detalji:</string>\n    <string name=\"detail_thumbnail_view_description\">Pokreni video, trajanje:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Sličica avatara prenositelja</string>\n    <string name=\"detail_likes_img_view_description\">Sviđanja</string>\n    <string name=\"detail_dislikes_img_view_description\">Nesviđanja</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Pokušaj ponovo</string>\n    <string name=\"start\">Počni</string>\n    <string name=\"pause\">Pauziraj</string>\n    <string name=\"delete\">Izbriši</string>\n    <string name=\"checksum\">Kontrolni zbroj</string>\n    <string name=\"ok\">U redu</string>\n    <string name=\"msg_name\">Naziv datoteke</string>\n    <string name=\"msg_threads\">Komponente procesa</string>\n    <string name=\"msg_error\">Greška</string>\n    <string name=\"msg_running\">NewPipe preuzimanje</string>\n    <string name=\"msg_running_detail\">Dodirni za prikaz detalja</string>\n    <string name=\"msg_wait\">Pričekaj …</string>\n    <string name=\"msg_copied\">Kopirano u međuspremnik</string>\n    <string name=\"no_available_dir\">Odaberi mapu za preuzimanje kasnije u postavkama</string>\n    <string name=\"msg_popup_permission\">Ova dozvola je potrebna za\n\\notvaranje skočnog prozora</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA zadatak</string>\n    <string name=\"recaptcha_request_toast\">Zatražen je reCAPTCHA zadatak</string>\n    <string name=\"settings_category_downloads_title\">Preuzimanja</string>\n    <string name=\"settings_file_charset_title\">Dozvoljeni znakovi u nazivima datoteka</string>\n    <string name=\"settings_file_replacement_character_summary\">Nedozvoljeni znakovi su zamjenjeni ovima</string>\n    <string name=\"settings_file_replacement_character_title\">Znak za zamjenu</string>\n    <string name=\"charset_letters_and_digits\">Slova i brojevi</string>\n    <string name=\"charset_most_special_characters\">Najviše posebnih znakova</string>\n    <string name=\"title_activity_about\">O NewPipeu</string>\n    <string name=\"title_licenses\">Licence treće strane</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s od %2$s pod %3$s</string>\n    <string name=\"tab_about\">O aplikaciji i ČPP</string>\n    <string name=\"tab_licenses\">Licence</string>\n    <string name=\"app_description\">Slobodan i mali tok na Android uređaju.</string>\n    <string name=\"view_on_github\">Pogledaj na GitHubu</string>\n    <string name=\"app_license_title\">NewPipe licenca</string>\n    <string name=\"contribution_encouragement\">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!</string>\n    <string name=\"read_full_license\">Pročitaj licencu</string>\n    <string name=\"contribution_title\">Doprinos</string>\n    <string name=\"title_activity_history\">Povijest</string>\n    <string name=\"action_history\">Povijest</string>\n    <string name=\"notification_channel_name\">NewPipe obavijest</string>\n    <string name=\"notification_channel_description\">Obavijesti za NewPipe playera</string>\n    <string name=\"settings_category_player_title\">Player</string>\n    <string name=\"settings_category_player_behavior_title\">Ponašanje</string>\n    <string name=\"settings_category_history_title\">Povijest i predmemorija</string>\n    <string name=\"undo\">Poništi</string>\n    <string name=\"search_no_results\">Nema rezultata</string>\n    <string name=\"empty_list_subtitle\">Ovdje nema ništa osim cvrčaka</string>\n    <string name=\"no_subscribers\">Nema pretplatnika</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s pretplatnik</item>\n        <item quantity=\"few\">%s pretplatnika</item>\n        <item quantity=\"other\">%s pretplatnika</item>\n    </plurals>\n    <string name=\"no_views\">Nema pregleda</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s pregled</item>\n        <item quantity=\"few\">%s pregleda</item>\n        <item quantity=\"other\">%s pregleda</item>\n    </plurals>\n    <string name=\"no_videos\">Nema videa</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"few\">%s videa</item>\n        <item quantity=\"other\">%s videa</item>\n    </plurals>\n    <string name=\"play_all\">Reproduciraj sve</string>\n    <string name=\"player_stream_failure\">Nije bilo moguće reproducirati ovaj tok</string>\n    <string name=\"player_unrecoverable_failure\">Dogodila se neoporavljiva greška playera</string>\n    <string name=\"player_recoverable_failure\">Oporavljanje od greške playera</string>\n    <string name=\"show_hold_to_append_title\">Prikaži savjet za držanje</string>\n    <string name=\"show_hold_to_append_summary\">Prikaži savjet kad se pritisne gumb za pozadinu ili skočni gumb u videu „Detalji:”</string>\n    <string name=\"delete_item_search_history\">Želiš li izbrisati ovu stavku iz povijesti pretrage\\?</string>\n    <string name=\"main_page_content\">Sadržaj</string>\n    <string name=\"blank_page_summary\">Prazna stranica</string>\n    <string name=\"kiosk_page_summary\">Stranica kioska</string>\n    <string name=\"channel_page_summary\">Stranica kanala</string>\n    <string name=\"select_a_channel\">Odaberi kanal</string>\n    <string name=\"no_channel_subscribed_yet\">Još nema pretplata na nijedan kanal</string>\n    <string name=\"select_a_kiosk\">Odaberi jedan kiosk</string>\n    <string name=\"trending\">U trendu</string>\n    <string name=\"top_50\">50 najboljih</string>\n    <string name=\"new_and_hot\">Novi i popularni</string>\n    <string name=\"play_queue_remove\">Ukloni</string>\n    <string name=\"play_queue_stream_detail\">Detalji</string>\n    <string name=\"play_queue_audio_settings\">Postavke za audio snimke</string>\n    <string name=\"hold_to_append\">Drži pritisnuto za dodavanje u popis</string>\n    <string name=\"unknown_content\">[Nepoznato]</string>\n    <string name=\"donation_title\">Doniraj</string>\n    <string name=\"website_title\">Web-stranica</string>\n    <string name=\"start_here_on_background\">Započni reprodukciju u pozadini</string>\n    <string name=\"start_here_on_popup\">Reproduciraj u skočnom prozoru</string>\n    <string name=\"drawer_open\">Otvori ladicu</string>\n    <string name=\"drawer_close\">Zatvori ladicu</string>\n    <string name=\"video_player\">Video player</string>\n    <string name=\"background_player\">Pozadinski player</string>\n    <string name=\"popup_player\">Skočni player</string>\n    <string name=\"always_ask_open_action\">Uvjek pitaj</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Dohvaćanje podataka …</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Učitavanje traženog sadržaja</string>\n    <string name=\"create_playlist\">Nova playlista</string>\n    <string name=\"rename_playlist\">Preimenuj</string>\n    <string name=\"name\">Ime</string>\n    <string name=\"add_to_playlist\">Dodaj u playlistu</string>\n    <string name=\"set_as_playlist_thumbnail\">Postavi kao sličicu playliste</string>\n    <string name=\"bookmark_playlist\">Zabilježi playlistu</string>\n    <string name=\"unbookmark_playlist\">Ukloni zabilješku</string>\n    <string name=\"delete_playlist_prompt\">Izbrisati ovu playlistu\\?</string>\n    <string name=\"playlist_creation_success\">Playlista je stvorena</string>\n    <string name=\"playlist_add_stream_success\">Dodano u playlistu</string>\n    <string name=\"playlist_thumbnail_change_success\">Sličica playliste je promijenjena.</string>\n    <string name=\"caption_none\">Bez titlova</string>\n    <string name=\"resize_fit\">Prilagodi</string>\n    <string name=\"resize_fill\">Ispuni</string>\n    <string name=\"resize_zoom\">Zumiraj</string>\n    <string name=\"caption_auto_generated\">Automatski generirani</string>\n    <string name=\"enable_leak_canary_summary\">Praćenje curenja memorije može uzrokovati greške u radu aplikacije prilikom odlaganje gomile</string>\n    <string name=\"enable_disposed_exceptions_title\">Izvijesti o krajevima životnog ciklusa</string>\n    <string name=\"show_info\">Prikaži informacije</string>\n    <string name=\"tab_bookmarks\">Zabilježene playliste</string>\n    <string name=\"controls_add_to_playlist_title\">Dodaj u</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Slikovna predmemorija obrisana</string>\n    <string name=\"metadata_cache_wipe_title\">Izbriši metapodatke iz predmemorije</string>\n    <string name=\"channels\">Kanali</string>\n    <string name=\"playlists\">Playliste</string>\n    <string name=\"tracks\">Snimke</string>\n    <string name=\"users\">Korisnici</string>\n    <string name=\"always\">Uvijek</string>\n    <string name=\"just_once\">Samo jednom</string>\n    <string name=\"file\">Datoteka</string>\n    <string name=\"switch_to_background\">Prijeđi na pozadinu</string>\n    <string name=\"switch_to_popup\">Prijeđi na skočni prozor</string>\n    <string name=\"switch_to_main\">Prijeđi na glavni</string>\n    <string name=\"import_data_title\">Uvezi bazu podataka</string>\n    <string name=\"export_data_title\">Izvezi bazu podataka</string>\n    <string name=\"import_data_summary\">Poništava tvoju trenutačnu povijest, pretplate, playliste i (opcionalno) postavke</string>\n    <string name=\"export_data_summary\">Izvezi povijest, pretplate, playliste i postavke</string>\n    <string name=\"clear_views_history_title\">Izbriši povijest gledanja</string>\n    <string name=\"clear_views_history_summary\">Briše povijest reproduciranih tokova i pozicije reprodukcije</string>\n    <string name=\"delete_view_history_alert\">Izbrisati cijelu povijest gledanja\\?</string>\n    <string name=\"watch_history_deleted\">Povijest gledanja je izbrisana</string>\n    <string name=\"clear_search_history_title\">Izbriši povijest pretraživanja</string>\n    <string name=\"delete_search_history_alert\">Izbrisati cijelu povijest pretraživanja\\?</string>\n    <string name=\"search_history_deleted\">Povijest pretraživanja je izbrisana</string>\n    <string name=\"invalid_directory\">Nema takve mape</string>\n    <string name=\"file_name_empty_error\">Naziv datoteke ne može biti prazan</string>\n    <string name=\"error_occurred_detail\">Dogodila se greška: %1$s</string>\n    <string name=\"detail_drag_description\">Povuci za promjenu redoslijeda</string>\n    <string name=\"create\">Stvori</string>\n    <string name=\"dismiss\">Odbaci</string>\n    <string name=\"rename\">Preimenuj</string>\n    <string name=\"one_item_deleted\">1 stavka izbrisana.</string>\n    <string name=\"give_back\">Vrati</string>\n    <string name=\"website_encouragement\">Posjeti NewPipe web-stranicu za više informacija i vijesti.</string>\n    <string name=\"privacy_policy_title\">NewPipe pravila o privatnosti</string>\n    <string name=\"read_privacy_policy\">Pročitaj pravila o privatnosti</string>\n    <string name=\"title_last_played\">Zadnje svirano</string>\n    <string name=\"title_most_played\">Najviše reproducirano</string>\n    <string name=\"export_complete_toast\">Izvezeno</string>\n    <string name=\"import_complete_toast\">Uvezeno</string>\n    <string name=\"no_valid_zip_file\">Nema važeće ZIP datoteke</string>\n    <string name=\"could_not_import_all_files\">Upozorenje: Nije moguće uvesti sve datoteke.</string>\n    <string name=\"override_current_data\">Ovo će prepisati tvoje trenutačne postavke.</string>\n    <string name=\"import_settings\">Želiš li također uvesti postavke\\?</string>\n    <string name=\"import_title\">Uvoz</string>\n    <string name=\"import_from\">Uvoz iz</string>\n    <string name=\"export_to\">Izvoz u</string>\n    <string name=\"import_ongoing\">Uvoz …</string>\n    <string name=\"export_ongoing\">Izvoz …</string>\n    <string name=\"import_file_title\">Uvoz datoteke</string>\n    <string name=\"previous_export\">Prethodni izvoz</string>\n    <string name=\"subscriptions_import_unsuccessful\">Nije bilo moguće uvesti pretplate</string>\n    <string name=\"subscriptions_export_unsuccessful\">Nije bilo moguće izvesti pretplate</string>\n    <string name=\"import_youtube_instructions\">Uvezi pretplate na YouTubu pomoću Google Takeouta:\n\\n\n\\n1. Idi na ovaj URL: %1$s\n\\n2. Prijavi se\n\\n3. Pritisni „Uključeni svi podaci”, zatim „Poništi odabir svih”, a zatim odaberi samo „pretplate” i pritisni „U redu”\n\\n4. Pritisni „Sljedeći korak”, a zatim „Stvori izvoz”\n\\n5. Pritisni gumb „Preuzmi” nakon što se pojavi\n\\n6. Dolje pritisni UVEZI DATOEKU i odaberi preuzetu .zip datoteku\n\\n7. [Ako uvoz .zip datoteke ne uspije] izdvoji .csv datoteku (pod „YouTube and YouTube Music/subscriptions/subscriptions.json”), dolje pritisni UVEZI DATOTEKU i odaberi izdvojenu csv datoteku</string>\n    <string name=\"import_soundcloud_instructions_hint\">tvojID, soundcloud.com/tvojid</string>\n    <string name=\"import_network_expensive_warning\">Ova operacija može prouzročiti veliku potrošnju mrežnog prometa.\n\\n\n\\nŽeliš li nastaviti\\?</string>\n    <string name=\"playback_speed_control\">Kontrole brzine reprodukcije</string>\n    <string name=\"skip_silence_checkbox\">Premotaj naprijed tijekom šutnje</string>\n    <string name=\"playback_step\">Korak</string>\n    <string name=\"playback_reset\">Resetiraj</string>\n    <string name=\"accept\">Prihvati</string>\n    <string name=\"decline\">Odbij</string>\n    <string name=\"limit_data_usage_none_description\">Bez ograničenja</string>\n    <string name=\"limit_mobile_data_usage_title\">Ograniči rezoluciju tijekom korištenja mobilnih podataka</string>\n    <string name=\"minimize_on_exit_none_description\">Nijedan</string>\n    <string name=\"no_player_found_toast\">Nije pronađen nijedan player tokova (možeš instalirati VLC za reprodukciju).</string>\n    <string name=\"controls_download_desc\">Preuzmi datoteku toka</string>\n    <string name=\"use_inexact_seek_title\">Koristi brzo netočno premotavanje</string>\n    <string name=\"use_inexact_seek_summary\">Netočno premotavanje omogućuje playeru brže premotavanje uz manju točnost. Premotavanje od 5, 15 ili 25 sekundi s ovime ne radi</string>\n    <string name=\"unsubscribe\">Otkaži pretplatu</string>\n    <string name=\"tab_choose\">Odaberi karticu</string>\n    <string name=\"settings_category_updates_title\">Aktualiziranja</string>\n    <string name=\"events\">Događaji</string>\n    <string name=\"file_deleted\">Datoteka obrisana</string>\n    <string name=\"app_update_notification_channel_description\">Obavijest za nove NewPipe verzije</string>\n    <string name=\"clear_search_history_summary\">Briše povijest ključnih riječi pretraživanja</string>\n    <string name=\"download_to_sdcard_error_title\">Eksterna memorija nije dostupna</string>\n    <string name=\"updates_setting_title\">Aktualiziranja</string>\n    <string name=\"updates_setting_description\">Prikaži obavijest za aktualiziranje aplikacije kad je dostupna nova verzija</string>\n    <string name=\"list\">Popis</string>\n    <string name=\"grid\">Mreža</string>\n    <string name=\"app_update_available_notification_title\">Dostupna je nova NewPipe verzija!</string>\n    <string name=\"download_failed\">Preuzimanje nije uspjelo</string>\n    <string name=\"show_error\">Prikaži pogrešku</string>\n    <string name=\"metadata_cache_wipe_summary\">Izbriši sve podatke web-stranica iz predmemorije</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metapodaci su izbrisani</string>\n    <string name=\"auto_queue_title\">Automatski dodaj sljedeći tok u popisa izvođenja</string>\n    <string name=\"auto_queue_summary\">Nastavi završavati (ne ponavljajući) popis reprodukcija dodavanjem povezanog toka</string>\n    <string name=\"default_content_country_title\">Zadana zemlja sadržaja</string>\n    <string name=\"settings_category_debug_title\">Otkrivanje grešaka</string>\n    <string name=\"app_update_notification_channel_name\">Obavijest o novoj verziji aplikacije</string>\n    <string name=\"download_to_sdcard_error_message\">Preuzimanje na eksternu SD karticu nije moguće. Ponovo postaviti lokaciju mape za preuzimanje?</string>\n    <string name=\"external_player_unsupported_link_type\">Eksterni playeri ne podržavaju ove vrste poveznica</string>\n    <string name=\"video_streams_empty\">Nije pronađen nijedan videozapis</string>\n    <string name=\"audio_streams_empty\">Nije pronađena nijedna audiosnimka</string>\n    <string name=\"invalid_source\">Nema takve datoteke/izvora sadržaja</string>\n    <string name=\"invalid_file\">Datoteka ne postoji ili joj nedostaje dopuštenje za čitanje ili pisanje</string>\n    <string name=\"no_streams_available_download\">Nema dostupnih zapisa za preuzimanje</string>\n    <string name=\"saved_tabs_invalid_json\">Nije bilo moguće čitati spremljene kartice, stoga se koriste zadane</string>\n    <string name=\"restore_defaults\">Obnovi standardne vrijednosti</string>\n    <string name=\"restore_defaults_confirmation\">Želiš li obnoviti standardne vrijednosti\\?</string>\n    <string name=\"subscribers_count_not_available\">Broj pretplatnika nije dostupan</string>\n    <string name=\"donation_encouragement\">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.</string>\n    <string name=\"main_page_content_summary\">Koje su kartice prikazane na glavnoj stranici</string>\n    <string name=\"conferences\">Konferencije</string>\n    <string name=\"preferred_open_action_settings_title\">Željena radnja za otvaranje</string>\n    <string name=\"preferred_open_action_settings_summary\">Zadana radnja pri otvaranju sadržaja — %s</string>\n    <string name=\"caption_setting_title\">Titlovi</string>\n    <string name=\"caption_setting_description\">Promijeni veličinu titlova i stilove pozadine playera. Zahtijeva ponovno pokretanje aplikacije</string>\n    <string name=\"enable_disposed_exceptions_summary\">Prisilno izvijesti o neisporučivim Rx iznimaka izvan fragmenta ili životnog ciklusa aktivnosti nakon odlaganja</string>\n    <string name=\"import_soundcloud_instructions\">Uvezi SoundCloud profil upisom URL-a ili svog ID-a:\n\\n\n\\n1. Omogući „način rada na radnoj površini” u web-pregledniku (stranica nije dostupna na mobilnim uređajima)\n\\n2. Idi na ovaj URL: %1$s\n\\n3. Prijavi se\n\\n4. Kopiraj URL profila na koji te se preusmjerava.</string>\n    <string name=\"playback_tempo\">Brzina</string>\n    <string name=\"playback_pitch\">Visina tona</string>\n    <string name=\"unhook_checkbox\">Odspoji (može prouzročiti izobličenje)</string>\n    <string name=\"minimize_on_exit_title\">Smanji prilikom mijenjanje aplikacije</string>\n    <string name=\"minimize_on_exit_summary\">Radnja prilikom prebacivanja na drugu aplikaciju iz glavnog video playera – %s</string>\n    <string name=\"minimize_on_exit_background_description\">Smanji na pozadinski player</string>\n    <string name=\"minimize_on_exit_popup_description\">Smanji na skočni player</string>\n    <string name=\"list_view_mode\">Način prikaza kao popis</string>\n    <string name=\"auto\">Automatski</string>\n    <string name=\"missions_header_finished\">Gotovo</string>\n    <string name=\"missions_header_pending\">Na čekanju</string>\n    <string name=\"paused\">pauzirano</string>\n    <string name=\"queued\">stavljeno u popis izvođenja</string>\n    <string name=\"post_processing\">naknadna obrada</string>\n    <string name=\"enqueue\">Dodaj u popis</string>\n    <string name=\"permission_denied\">Sustav je odbio radnju</string>\n    <string name=\"generate_unique_name\">Generiraj jedinstveni naziv</string>\n    <string name=\"overwrite\">Prepiši</string>\n    <string name=\"overwrite_unrelated_warning\">Datoteka s tim nazivom već postoji</string>\n    <string name=\"overwrite_finished_warning\">Preuzeta datoteka s tim nazivom već postoji</string>\n    <string name=\"download_already_running\">Datoteka s ovim nazivom se već preuzima</string>\n    <string name=\"error_path_creation\">Odredišna mapa ne može biti stvorena</string>\n    <string name=\"error_file_creation\">Datoteka se ne može stvoriti</string>\n    <string name=\"error_ssl_exception\">Nije bilo moguće uspostaviti sigurnu vezu</string>\n    <string name=\"error_unknown_host\">Nije bilo moguće pronaći server</string>\n    <string name=\"error_connect_host\">Nije moguće povezati se s serverom</string>\n    <string name=\"error_http_no_content\">Server ne šalje podatke</string>\n    <string name=\"error_http_unsupported_range\">Poslužitelj ne prihvaća preuzimanja višestrukih procesa, pokušaj ponovo s @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Nije pronađeno</string>\n    <string name=\"error_postprocessing_failed\">Naknadna obrada nije uspjela</string>\n    <string name=\"stop\">Stop</string>\n    <string name=\"max_retry_msg\">Maksimalnih ponovnih pokušaja</string>\n    <string name=\"max_retry_desc\">Maksimalni broj pokušaja prije poništavanja preuzimanja</string>\n    <string name=\"pause_downloads_on_mobile\">Prekini na mrežama s ograničenim prometom</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Korisno pri prelasku na mobilne podatke, iako se neka preuzimanja ne mogu obustaviti</string>\n    <string name=\"show_comments_title\">Prikaži komentare</string>\n    <string name=\"show_comments_summary\">Isključi, kako bi se komentari sakrili</string>\n    <string name=\"autoplay_title\">Automatska reprodukcija</string>\n    <string name=\"no_comments\">Nema komentara</string>\n    <string name=\"error_unable_to_load_comments\">Nije bilo moguće učitati komentare</string>\n    <string name=\"close\">Zatvori</string>\n    <string name=\"app_license\">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.</string>\n    <string name=\"privacy_policy_encouragement\">Projekt NewPipe ozbiljno shvaća temu o privatnosti. Stoga aplikacija ne prikuplja podatke bez tvog pristanka.\n\\nNewPipe pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i spremaju kad šalješ izvještaje o prekidu rada aplikacije.</string>\n    <string name=\"start_accept_privacy_policy\">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.\n\\nZa slanje izvješća o pogreškama moraš prihvatiti politiku privatnosti.</string>\n    <string name=\"enable_playback_resume_title\">Nastavi reprodukciju</string>\n    <string name=\"enable_playback_resume_summary\">Obnovi zadnji položaj reprodukcije</string>\n    <string name=\"enable_playback_state_lists_title\">Pozicije na popisima</string>\n    <string name=\"enable_playback_state_lists_summary\">Prikaži poziciju reprodukcije u popisima</string>\n    <string name=\"settings_category_clear_data_title\">Obriši podatke</string>\n    <string name=\"watch_history_states_deleted\">Pozicije reprodukcije su izbrisane</string>\n    <string name=\"missing_file\">Datoteka je premještena ili izbrisana</string>\n    <string name=\"download_already_pending\">Datoteka s ovim nazivom već čeka na preuzimanje</string>\n    <string name=\"error_timeout\">Vrijeme povezanosti je isteklo</string>\n    <string name=\"confirm_prompt\">Želiš li izbrisati povijest preuzimanja ili izbrisati sve preuzete datoteke\\?</string>\n    <string name=\"start_downloads\">Započni preuzimanja</string>\n    <string name=\"pause_downloads\">Zaustavi preuzimanja</string>\n    <string name=\"downloads_storage_ask_title\">Pitaj gdje preuzeti</string>\n    <string name=\"clear_playback_states_title\">Izbriši poziciju reprodukcije</string>\n    <string name=\"clear_playback_states_summary\">Izbriši sve pozicije reprodukcije</string>\n    <string name=\"delete_playback_states_alert\">Izbrisati sve pozicije reprodukcije\\?</string>\n    <string name=\"no_one_watching\">Nitko ne gleda</string>\n    <string name=\"no_one_listening\">Nitko ne sluša</string>\n    <string name=\"default_kiosk_page_summary\">Standardni kiosk</string>\n    <string name=\"peertube_instance_add_https_only\">Podržani su samo HTTP URL-ovi</string>\n    <string name=\"local\">Lokalni</string>\n    <string name=\"recently_added\">Nedavno dodani</string>\n    <string name=\"playlist_no_uploader\">Automatski generirano (prenositelj nedefiniran)</string>\n    <string name=\"clear_download_history\">Očisti povijest preuzimanja</string>\n    <string name=\"delete_downloaded_files\">Izbriši preuzete datoteke</string>\n    <string name=\"permission_display_over_apps\">Dopusti prikaz preko drugih aplikacija</string>\n    <string name=\"app_language_title\">Jezik aplikacije</string>\n    <string name=\"systems_language\">Zadani sustav</string>\n    <string name=\"videos_string\">Videa</string>\n    <string name=\"mute\">Isključi zvuk</string>\n    <string name=\"unmute\">Uključi</string>\n    <string name=\"feed_notification_loading\">Učitavanje feeda …</string>\n    <string name=\"feed_group_dialog_delete_message\">Želiš li izbrisati ovu grupu\\?</string>\n    <string name=\"feed_create_new_group_button_title\">Nova</string>\n    <string name=\"feed_update_threshold_option_always_update\">Uvijek aktualiziraj</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Uključi brzi modus</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Isključi brzi modus</string>\n    <string name=\"error_insufficient_storage_left\">Memorija uređaja je popunjena</string>\n    <string name=\"most_liked\">Najomiljeniji</string>\n    <string name=\"subtitle_activity_recaptcha\">Pritisni „Gotovo” kad je riješeno</string>\n    <string name=\"done\">Gotovo</string>\n    <string name=\"infinite_videos\">∞ videa</string>\n    <string name=\"more_than_100_videos\">Više od 100 videa</string>\n    <string name=\"error_report_open_issue_button_text\">Prijavi grešku na GitHub-u</string>\n    <string name=\"artists\">Izvođači</string>\n    <string name=\"albums\">Albumi</string>\n    <string name=\"songs\">Pjesme</string>\n    <string name=\"channel_created_by\">Stvoren od %s</string>\n    <string name=\"never\">Nikada</string>\n    <string name=\"enable_queue_limit\">Ograniči popis preuzimanja</string>\n    <string name=\"downloads_storage_use_saf_title\">Koristi sustavksi birač mapa (SAF)</string>\n    <string name=\"remove_watched\">Ukloni pregledano</string>\n    <string name=\"remove_watched_popup_title\">Ukloniti pogledana emitiranja?</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekunda</item>\n        <item quantity=\"few\">%d sekunde</item>\n        <item quantity=\"other\">%d sekundi</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuta</item>\n        <item quantity=\"few\">%d minute</item>\n        <item quantity=\"other\">%d minuta</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dan</item>\n        <item quantity=\"few\">%d dana</item>\n        <item quantity=\"other\">%d dana</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d sat</item>\n        <item quantity=\"few\">%d sata</item>\n        <item quantity=\"other\">%d sati</item>\n    </plurals>\n    <string name=\"feed_subscription_not_loaded_count\">Nije učitano: %d</string>\n    <string name=\"feed_group_dialog_empty_selection\">Nije odabrana nijedna pretplata</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Odaberi pretplate</string>\n    <string name=\"notification_action_4_title\">Gumb pete radnje</string>\n    <string name=\"notification_action_3_title\">Gumb četvrte radnje</string>\n    <string name=\"notification_action_2_title\">Gumb treće radnje</string>\n    <string name=\"notification_action_1_title\">Gumb druge radnje</string>\n    <string name=\"notification_action_0_title\">Gumb prve radnje</string>\n    <string name=\"search_showing_result_for\">Prikazuju se rezultati za: %s</string>\n    <string name=\"unsupported_url_dialog_message\">Nije bilo moguće prepoznati URL. Otvoriti s jednom drugom aplikacijom?</string>\n    <string name=\"notification_scale_to_square_image_title\">Odreži sličicu na omjer 1:1</string>\n    <string name=\"notification_action_buffering\">Učitavanje u predmemoriju</string>\n    <string name=\"enable_queue_limit_desc\">Istovremeno se pokreće jedno preuzimanje</string>\n    <string name=\"enqueued\">Dodano u popis izvođenja</string>\n    <string name=\"enqueue_stream\">Dodaj u popis</string>\n    <string name=\"title_activity_play_queue\">Reproduciraj popis izvođenja</string>\n    <string name=\"auto_queue_toggle\">Automatski popis izvođenja</string>\n    <string name=\"clear_queue_confirmation_description\">Popis izvođenja aktivnog playera će se zamijeniti</string>\n    <string name=\"clear_queue_confirmation_summary\">Prebacivanje s jednog playera na drugi može zamijeniti tvoj popis izvođenja</string>\n    <string name=\"clear_queue_confirmation_title\">Pitaj prije pražnjenja popisa izvođenja</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s slušatelj</item>\n        <item quantity=\"few\">%s slušatelja</item>\n        <item quantity=\"other\">%s slušatelja</item>\n    </plurals>\n    <string name=\"overwrite_failed\">datoteka se ne može prepisato</string>\n    <string name=\"notification_scale_to_square_image_summary\">Odreži prikazane sličice videa u obavijesti iz omjera 16:9 na 1:1</string>\n    <string name=\"notification_actions_at_most_three\">U kompaktnom prikazu obavijesti mogu se odabrati najviše 3 radnje!</string>\n    <string name=\"video_detail_by\">Od %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Sličica avatara kanala</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Dohvati iz određenog feeda kad je dostupno</string>\n    <string name=\"feed_update_threshold_summary\">Vrijeme nakon zadnjeg aktualiziranja prije nego što se pretplata smatra zastarjelom – %s</string>\n    <string name=\"feed_update_threshold_title\">Prag za aktualiziranje feedova</string>\n    <string name=\"settings_category_feed_title\">Feed</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Prikaži samo negrupirane pretplate</string>\n    <string name=\"feed_group_dialog_empty_name\">Prazno ime grupe</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d odabrana</item>\n        <item quantity=\"few\">%d odabrane</item>\n        <item quantity=\"other\">%d odabranih</item>\n    </plurals>\n    <string name=\"feed_processing_message\">Obrada feeda u tijeku …</string>\n    <string name=\"feed_oldest_subscription_update\">Zadnje aktualiziranje feeda: %s</string>\n    <string name=\"feed_groups_header_title\">Grupe kanala</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Da, i djelomično pogledana videa</string>\n    <string name=\"choose_instance_prompt\">Odaberi jednu instancu</string>\n    <string name=\"downloads_storage_ask_summary\">Aplikacija će te pitati kamo spremati preuzimanja.\n\\nUključi sustavksi birač mapa (SAF) ako želiš preuzeti na eksternu SD karticu</string>\n    <string name=\"error_download_resource_gone\">Nije moguće obnoviti ovo preuzimanje</string>\n    <string name=\"error_progress_lost\">Napredak je izgubljen, jer je datoteka izbrisana</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe se zatvorio tijekom rada s datotekom</string>\n    <string name=\"playlist_page_summary\">Stranica playliste</string>\n    <string name=\"remove_watched_popup_warning\">Emitiranja koji su gledani prije i nakon dodavanja u playlistu će se ukloniti. \\nStvarno ih želiš ukloniti?</string>\n    <string name=\"no_playlist_bookmarked_yet\">Još nema zabilježenih playlista</string>\n    <string name=\"select_a_playlist\">Odaberi playlistu</string>\n    <string name=\"recovering\">obnavljanje</string>\n    <string name=\"wifi_only\">Samo na Wi-Fi mreži</string>\n    <string name=\"autoplay_summary\">Pokreni reprodukciju automatski – %s</string>\n    <string name=\"show_memory_leaks\">Prikaži curenje memorije</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s gledatelj</item>\n        <item quantity=\"few\">%s gledatelja</item>\n        <item quantity=\"other\">%s gledatelja</item>\n    </plurals>\n    <string name=\"drawer_header_description\">Uključi/isključi uslugu, trenutačno odabrana:</string>\n    <string name=\"copy_for_github\">Kopiraj formatirani izveštaj</string>\n    <string name=\"clear_cookie_summary\">Izbriši kolačiće koje NewPipe sprema nakon rješavanja reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA kolačići su izbrisani</string>\n    <string name=\"clear_cookie_title\">Izbriši reCAPTCHA kolačiće</string>\n    <string name=\"restricted_video\">Ovaj video je dobno ograničen.\n\\n\n\\nZa prikaz sadržaja uključi „%1$s” u postavkama.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube nudi postavku „Ograničeni način rada”, čime se skriva sadržaj za odrasle</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Uključi YouTube postavku „Ograničeni način rada”</string>\n    <string name=\"show_age_restricted_content_summary\">Prikaži sadržaj koji vjerojatno nije prikladan za djecu, jer je dobno ograničen (kategorija 18)</string>\n    <string name=\"peertube_instance_add_exists\">Instanca već postoji</string>\n    <string name=\"peertube_instance_add_fail\">Nije bilo moguće provjeriti instancu</string>\n    <string name=\"peertube_instance_add_help\">Upiši URL instance</string>\n    <string name=\"peertube_instance_add_title\">Dodaj instancu</string>\n    <string name=\"peertube_instance_url_help\">Pronađi instance koje voliš na %s</string>\n    <string name=\"peertube_instance_url_summary\">Odaberi svoje omiljene PeerTube instance</string>\n    <string name=\"peertube_instance_url_title\">PeerTube instance</string>\n    <string name=\"seek_duration_title\">Vrijeme premotavanja prema naprijed ili natrag</string>\n    <string name=\"notification_action_nothing\">Ništa</string>\n    <string name=\"notification_action_shuffle\">Promiješaj</string>\n    <string name=\"notification_action_repeat\">Ponovi</string>\n    <string name=\"error_report_open_github_notice\">Provjeri je li problem već postoji. Prijavljivanje istog već prijavljenog problema krade nam vrijeme koje bismo mogli utrošiti na ispravljanje greške.</string>\n    <string name=\"notification_actions_summary\">Uredi radnje obavijesti dodirom. Označi do tri radnje za prikaz u kompaktnoj obavijesti koristeći potvrdna polja na desnoj strani.</string>\n    <string name=\"new_seek_duration_toast\">Zbog ograničenja ExoPlayera, trajanje premotavanja postavljeno je na %d s</string>\n    <string name=\"notification_colorize_summary\">Neka Android prilagodi boju obavijesti prema glavnoj boji sličice (ovo nije dostupno na svim uređajima)</string>\n    <string name=\"notification_colorize_title\">Oboji obavijest</string>\n    <string name=\"content_not_supported\">NewPipe još ne podržava ovaj sadržaj.\n\\n\n\\nNadamo se da će biti podržan u budućoj verziji.</string>\n    <string name=\"show_thumbnail_summary\">Koristi sličicu za pozadinu zaključanog ekrana i za obavijesti</string>\n    <string name=\"show_thumbnail_title\">Prikaži sličicu</string>\n    <string name=\"show_original_time_ago_title\">Prikaži izvorno vrijeme stavki</string>\n    <string name=\"downloads_storage_use_saf_summary\">„Storage Access Framework” dozvoljava preuzimanje na eksternu SD karticu</string>\n    <string name=\"show_original_time_ago_summary\">Izvorni tekstovi usluga bit će vidljivi u stavkama prijenosa</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Misliš da je učitavanje feeda presporo\\? Ako da, pokušaj omogućiti brzo učitavanje (možeš ga promijeniti u postavkama ili pritiskom na donji gumb).\n\\n\n\\nNewPipe nudi dvije strategije učitavanja feeda:\n\\n• Dohvaćanje cijelog pretplatničkog kanala, što je sporo, ali cjelovito.\n\\n• Korištenje namjenske krajnje točke usluge, što je brzo, ali obično nepotpuno.\n\\n\n\\nRazlika je u tome što pri brzom načinu obično nedostaju neke informacije, poput trajanja ili vrste stavki (ne može razlikovati videa uživo od običnih videa), a možda će vratiti i manje stavki.\n\\n\n\\nYouTube je primjer usluge koja nudi ovaj brzi način sa svojim RSS feedom.\n\\n\n\\nDakle, izbor se svodi na ono što više voliš: brzinu ili precizne informacije.</string>\n    <string name=\"msg_calculating_hash\">Izračunavanje šifre</string>\n    <string name=\"hash_channel_name\">Obavijest šifriranja videa</string>\n    <string name=\"hash_channel_description\">Obavijesti o napretku šifriranja videa</string>\n    <string name=\"recent\">Nedavni</string>\n    <string name=\"show_meta_info_summary\">Isključi za skrivanje polja metapodataka s dodatnim podacima o autoru toka, sadržaju toka ili zahtjevu za pretraživanje</string>\n    <string name=\"show_meta_info_title\">Prikaži metapodatke</string>\n    <string name=\"related_items_tab_description\">Povezane stavke</string>\n    <string name=\"no_app_to_open_intent\">Nijedna aplikacija na tvom uređaju ovo ne može otvoriti</string>\n    <string name=\"chapters\">Poglavlja</string>\n    <string name=\"description_tab_description\">Opis</string>\n    <string name=\"comments_tab_description\">Komentari</string>\n    <string name=\"show_description_summary\">Isključi za skrivanje opisa videozapisa i dodatnih informacija</string>\n    <string name=\"show_description_title\">Prikaži opis</string>\n    <string name=\"open_with\">Otvori pomoću</string>\n    <string name=\"soundcloud_go_plus_content\">Ovo je SoundCloud Go+ snimka (barem u tvojoj zemlji), stoga ga NewPipe ne može emitirati ili preuzeti.</string>\n    <string name=\"restricted_video_no_stream\">Ovaj je video dobno ograničen.\n\\nZbog novih YouTube pravila za videa s dobnim ograničenjem, NewPipe ne može pristupiti nijednoj vlastitoj video emisiji i stoga je ne može reproducirati.</string>\n    <string name=\"download_has_started\">Preuzimanje je započeto</string>\n    <string name=\"select_night_theme_toast\">Dolje možete odabrati željenu noćnu temu</string>\n    <string name=\"night_theme_summary\">Odaberi željenu noćnu temu – %s</string>\n    <string name=\"auto_device_theme_title\">Automatski (tema uređaja)</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"featured\">Istaknuto</string>\n    <string name=\"paid_content\">Ovaj je sadržaj dostupan samo korisnicima koji su platili, stoga ga NewPipe ne može emitirati ili preuzeti.</string>\n    <string name=\"youtube_music_premium_content\">Ovaj je video dostupan samo za „YouTube Music Premium” članove, stoga ga NewPipe ne može emitirati ili preuzeti.</string>\n    <string name=\"private_content\">Ovaj sadržaj je privatan, stoga ga NewPipe ne može emitirati ili preuzeti.</string>\n    <string name=\"georestricted_content\">Ovaj sadržaj nije dostupan u tvojoj zemlji.</string>\n    <string name=\"crash_the_app\">Prekini aplikaciju</string>\n    <string name=\"recaptcha_solve\">Riješi</string>\n    <string name=\"night_theme_title\">Tamna tema</string>\n    <string name=\"show_channel_details\">Prikaži detalje kanala</string>\n    <string name=\"disable_media_tunneling_summary\">Isključi tuneliranje medija ako doživiš crni ekran ili isprekidanu reprodukciju videa.</string>\n    <string name=\"disable_media_tunneling_title\">Isključi tuneliranje medija</string>\n    <string name=\"off\">Isklj.</string>\n    <string name=\"on\">Uklj.</string>\n    <string name=\"tablet_mode_title\">Način rada na tabletu</string>\n    <string name=\"open_website_license\">Otvori web-stranicu</string>\n    <string name=\"detail_heart_img_view_description\">Od autora obilježeno srcem</string>\n    <string name=\"metadata_privacy_private\">Privatno</string>\n    <string name=\"metadata_privacy_unlisted\">Nenavedeno</string>\n    <string name=\"metadata_privacy_public\">Javno</string>\n    <string name=\"metadata_host\">Računalo</string>\n    <string name=\"metadata_support\">Podrška</string>\n    <string name=\"metadata_language\">Jezik</string>\n    <string name=\"metadata_age_limit\">Dobna granica</string>\n    <string name=\"metadata_licence\">Licenca</string>\n    <string name=\"metadata_tags\">Oznake</string>\n    <string name=\"metadata_category\">Kategorija</string>\n    <string name=\"description_select_disable\">Isključi biranje teksta u opisu</string>\n    <string name=\"description_select_enable\">Omogući biranje teksta u opisu</string>\n    <string name=\"account_terminated\">Račun ukinut</string>\n    <string name=\"feed_load_error_terminated\">Autorov račun je ukinut.\n\\nNewPipe ubuduće neće moći učitavati ovaj feed.\n\\nŽeliš li otkazati pretplatu na ovaj kanal\\?</string>\n    <string name=\"feed_load_error_account_info\">Nije bilo moguće učitati feed za „%s”.</string>\n    <string name=\"feed_load_error\">Pogreška pri učitavanju feeda</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Počevši od Androida 10, podržano je samo radno okruženje „Storage Access Framework”</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Od vas će se tražiti gdje spremiti svako preuzimanje</string>\n    <string name=\"dont_show\">Ne prikazuj</string>\n    <string name=\"low_quality_smaller\">Niska kvaliteta (manja)</string>\n    <string name=\"high_quality_larger\">Visoka kvaliteta (veća)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Pregled sličica premotavanja</string>\n    <string name=\"no_dir_yet\">Mapa za preuzimanje još nije postavljena, odaberi standardnu mapu za preuzimanje</string>\n    <string name=\"comments_are_disabled\">Komentari su isključeni</string>\n    <string name=\"mark_as_watched\">Označi kao pogledano</string>\n    <string name=\"feed_load_error_fast_unknown\">Brzi modus feeda ne pruža više informacija o ovome.</string>\n    <string name=\"metadata_privacy_internal\">Interno</string>\n    <string name=\"metadata_privacy\">Privatnost</string>\n    <string name=\"description_select_note\">Sada možeš odabrati tekst u opisu. Napomena: stranica će možda treperiti i možda nećeš moći kliknuti poveznice u načinu rada za odabir teksta.</string>\n    <string name=\"processing_may_take_a_moment\">Obrada u tijeku … Može malo potrajati</string>\n    <string name=\"main_page_content_swipe_remove\">Za ukljanjanje stavki povuci ih</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">%s preuzimanje je gotovo</item>\n        <item quantity=\"few\">%s preuzimanja su gotova</item>\n        <item quantity=\"other\">%s preuzimanja je gotovo</item>\n    </plurals>\n    <string name=\"start_main_player_fullscreen_title\">Pokreni glavni player u cjeloekranskom prikazu</string>\n    <string name=\"enqueue_next_stream\">Dodaj u popis kao sljedeći</string>\n    <string name=\"enqueued_next\">Dodano u popis kao sljedeći</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Izbrisano %1$s preuzimanje</item>\n        <item quantity=\"few\">Izbrisana %1$s preuzimanja</item>\n        <item quantity=\"other\">Izbrisano %1$s preuzimanja</item>\n    </plurals>\n    <string name=\"remote_search_suggestions\">Prijedlozi daljinjske pretrage</string>\n    <string name=\"manual_update_description\">Ručno traži nove verzije</string>\n    <string name=\"checking_updates_toast\">Traženje novih verzija …</string>\n    <string name=\"local_search_suggestions\">Prijedlozi lokalne pretrage</string>\n    <string name=\"check_for_updates\">Traži nove verzije</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"feed_new_items\">Nove stavke feeda</string>\n    <string name=\"error_report_channel_name\">Obavijest o prijavi greške</string>\n    <string name=\"error_report_channel_description\">Obavijesti za prijavu grešaka</string>\n    <string name=\"create_error_notification\">Stvori obavijest o grešci</string>\n    <string name=\"error_report_notification_title\">NewPipe je naišao na grešku, dodirni za prijavu</string>\n    <string name=\"error_report_notification_toast\">Došlo je do greške, pogledaj obavijest</string>\n    <string name=\"crash_the_player\">Prekini rad playera</string>\n    <string name=\"settings_category_player_notification_title\">Obavijest playera</string>\n    <string name=\"settings_category_player_notification_summary\">Konfiguriraj obavijest trenutačno reproduciranog toka</string>\n    <string name=\"notifications\">Obavijesti</string>\n    <string name=\"streams_notification_channel_name\">Novi videozapisi</string>\n    <string name=\"enable_streams_notifications_summary\">Obavijesti novih tokova od pretplaćenih kanala</string>\n    <string name=\"delete_downloaded_files_confirm\">Želiš li izbrisati sve preuzete datoteke\\?</string>\n    <string name=\"notifications_disabled\">Obavijesti su isljučene</string>\n    <string name=\"you_successfully_subscribed\">Pretplatio/la si se na ovaj kanal</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Uključi/isključi sve</string>\n    <string name=\"any_network\">Bilo kakva mreža</string>\n    <string name=\"streams_notification_channel_description\">Obavijesti novih tokova pretplaćenih kanala</string>\n    <string name=\"show_error_snackbar\">Prikaži kratku poruku greške</string>\n    <string name=\"loading_stream_details\">Učitavanje pojedinosti toka …</string>\n    <string name=\"check_new_streams\">Pokreni traženje novih tokova</string>\n    <string name=\"streams_notifications_interval_title\">Prvjeravanje učestalosti</string>\n    <string name=\"leak_canary_not_available\">Biblioteka „LeakCanary” nije dostupna</string>\n    <string name=\"enable_streams_notifications_title\">Obavijesti o novim tokovima</string>\n    <string name=\"streams_notifications_network_title\">Potrebna mrežna veza</string>\n    <string name=\"get_notified\">Primaj obavijesti</string>\n    <string name=\"no_appropriate_file_manager_message\">Za ovu radnju nije pronađen odgovarajući upravljač datoteka.\n\\nInstaliraj upravljač datoteka ili pokušaj isključiti „%s” u postavkama preuzimanja</string>\n    <string name=\"detail_pinned_comment_view_description\">Prikvačeni komentar</string>\n    <string name=\"show_crash_the_player_summary\">Prikazuje opciju prekida rada kad se player koristi</string>\n    <string name=\"show_crash_the_player_title\">Prikaži „Prekini rad playera”</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer standard</string>\n    <string name=\"percent\">Posto</string>\n    <string name=\"semitone\">Poluton</string>\n    <string name=\"streams_not_yet_supported_removed\">Streamovi koje aplikacija za preuzimanje još ne podržava se ne prikazuju</string>\n    <string name=\"selected_stream_external_player_not_supported\">Eksterni playeri ne podržavaju odabrani tok</string>\n    <string name=\"progressive_load_interval_summary\">Promijenite veličinu intervala učitavanja progresivnog sadržaja (trenutno %s). Niža vrijednost može ubrzati učitavanje</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s novi tok</item>\n        <item quantity=\"few\">%s nova toka</item>\n        <item quantity=\"other\">%s novih tokova</item>\n    </plurals>\n    <string name=\"progressive_load_interval_title\">Veličina intervala učitavanja reprodukcije</string>\n    <string name=\"unknown_format\">Nepoznat format</string>\n    <string name=\"unknown_quality\">Nepoznata kvaliteta</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Nema audio prijenosa za eksterne playere</string>\n    <string name=\"no_video_streams_available_for_external_players\">Nema video prijenosa za eksterne playere</string>\n    <string name=\"select_quality_external_players\">Odaberi kvalitetu za eksterne playere</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Za ovu radnju nije pronađen odgovrajući upravljač datoteka.\n\\nInstaliraj „Storage Access Framework” kompatibilni upravljač datoteka</string>\n    <string name=\"settings_category_exoplayer_summary\">Uredite neke ExoPlayer postavke. Ove promjene zahtjevaju ponovo pokretanje aplikacije</string>\n    <string name=\"right_gesture_control_title\">Desna gesta</string>\n    <string name=\"left_gesture_control_summary\">Odaberite gestu za lijevu polovicu zaslona</string>\n    <string name=\"left_gesture_control_title\">Lijeva gesta</string>\n    <string name=\"brightness\">Svjetlina</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer postavke</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"right_gesture_control_summary\">Odaberite gestu za desnu polovicu zaslona</string>\n    <string name=\"volume\">Glasnoća</string>\n    <string name=\"none\">Ništa</string>\n    <string name=\"feed_show_watched\">Pregledano</string>\n    <string name=\"feed_show_partially_watched\">Djelomično pregledano</string>\n    <string name=\"feed_show_upcoming\">Najava</string>\n    <string name=\"sort\">Razvrstaj</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Koristi razervnu funkciju ExoPlayer dekodera</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignoriraj događaje hardverskih medijskih gumba</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Korisno, na primjer, ako koristite slušalice s pokvarenim fizičkim gumbima</string>\n    <string name=\"prefer_descriptive_audio_summary\">Odaberite zvučni zapis s opisima za slabovidne osobe ako je dostupan</string>\n    <string name=\"prefer_original_audio_title\">Preferiraj originalni zvuk</string>\n    <string name=\"prefer_original_audio_summary\">Odaberite izvorni audio zapis bez obzira na jezik</string>\n    <string name=\"prefer_descriptive_audio_title\">Preferirajte opisni zvuk</string>\n    <string name=\"select_audio_track_external_players\">Odaberi audio snimku za eksterne playere</string>\n    <string name=\"unknown_audio_track\">Nepoznato</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"no_streams\">Nema prijenosa</string>\n    <string name=\"main_tabs_position_title\">Položaj glavnih kartica</string>\n    <string name=\"main_tabs_position_summary\">Premjesti glavni birač kartica dolje</string>\n    <string name=\"no_live_streams\">Nema prijenosa uživo</string>\n    <string name=\"msg_failed_to_copy\">Neuspjelo kopiranje u međuspremnik</string>\n    <string name=\"faq_title\">Često postavljena pitanja</string>\n    <string name=\"faq_description\">Ako imaš problema s korištenjem aplikacije, pogledaj odgovore na česta pitanja!</string>\n    <string name=\"faq\">Pogledaj na web stranici</string>\n    <string name=\"play_queue_audio_track\">Audio snimka: %s</string>\n    <string name=\"audio_track\">Traka audio snimke</string>\n    <string name=\"duplicate_in_playlist\">Zasivljene playliste već sadrže ovu stavku.</string>\n    <string name=\"unset_playlist_thumbnail\">Poništi stalni prikaz sličica</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplikat je dodan %d put(a)</string>\n    <string name=\"card\">Kartica</string>\n    <string name=\"app_update_unavailable_toast\">Koristiš najnoviju NewPipe verziju</string>\n    <string name=\"app_update_available_notification_text\">Dodirani za preuzimanje %s</string>\n    <string name=\"remove_duplicates\">Ukloni duplikate</string>\n    <string name=\"remove_duplicates_title\">Ukloniti duplikate?</string>\n    <string name=\"remove_duplicates_message\">Želiš li ukloniti sve duple prijenose iz ove playliste?</string>\n    <string name=\"feed_hide_streams_title\">Pokaži sljedeće prijenose</string>\n    <string name=\"feed_show_hide_streams\">Pokaži/Sakrij prijenose</string>\n    <string name=\"feed_fetch_channel_tabs\">Kartice za dohvaćanja kanala</string>\n    <string name=\"night_theme_available\">Ova je opcija dostupna samo ako je %s odabrano za temu</string>\n    <string name=\"metadata_thumbnails\">Minijature</string>\n    <string name=\"metadata_avatars\">Avatari</string>\n    <string name=\"metadata_uploader_avatars\">Avatari prenositelja</string>\n    <string name=\"metadata_subchannel_avatars\">Avatari podkanala</string>\n    <string name=\"metadata_subscribers\">Pretplatnici</string>\n    <string name=\"metadata_banners\">Natpisi</string>\n    <string name=\"audio_track_present_in_video\">Audio zapis bi već trebao biti prisutan u ovom prijenosu</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"channel_tab_livestreams\">Uživo</string>\n    <string name=\"channel_tab_videos\">Videa</string>\n    <string name=\"channel_tab_tracks\">Snimke</string>\n    <string name=\"channel_tab_shorts\">Kratka videa</string>\n    <string name=\"audio_track_type_dubbed\">sinkronizirano</string>\n    <string name=\"audio_track_type_descriptive\">opisno</string>\n    <string name=\"channel_tab_albums\">Albumi</string>\n    <string name=\"channel_tab_channels\">Kanali</string>\n    <string name=\"channel_tab_playlists\">Playliste</string>\n    <string name=\"show_channel_tabs_summary\">Kartice koje se prikazuju na stranici kanala</string>\n    <string name=\"toggle_screen_orientation\">Uključi/Isključi položaj ekrana</string>\n    <string name=\"channel_tab_about\">Informacije</string>\n    <string name=\"show_channel_tabs\">Kartice kanala</string>\n    <string name=\"toggle_fullscreen\">Uključi cjeloekranski prikaz</string>\n    <string name=\"previous_stream\">Prethodni prijenos</string>\n    <string name=\"next_stream\">Sljedeći prijenos</string>\n    <string name=\"replay\">Reproduciraj ponovo</string>\n    <string name=\"rewind\">Natrag</string>\n    <string name=\"forward\">Naprijed</string>\n    <string name=\"image_quality_title\">Kvaliteta slike</string>\n    <string name=\"more_options\">Više opcija</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"image_quality_none\">Ne učitavaj slike</string>\n    <string name=\"image_quality_low\">Niska kvaliteta</string>\n    <string name=\"image_quality_medium\">Srednja kvaliteta</string>\n    <string name=\"image_quality_high\">Visoka kvaliteta</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist_with_titles\">Dijeli s naslovima</string>\n    <string name=\"share_playlist_with_list\">Dijeli popis URL-ova</string>\n    <string name=\"video_details_list_item\">– %1$s: %2$s</string>\n    <string name=\"show_more\">Pokaži više</string>\n    <string name=\"show_less\">Pokaži manje</string>\n    <string name=\"fast_mode\">Brzi modus</string>\n    <string name=\"loading_metadata_title\">Učitavanje metapodataka …</string>\n    <string name=\"duration\">Trajanje</string>\n    <string name=\"import_subscriptions_hint\">Uvezi ili izvezi pretplate iz izbornika s 3 točke</string>\n    <string name=\"open_play_queue\">Otvori popis reprodukcije</string>\n    <string name=\"play\">Reproduciraj</string>\n    <string name=\"share_playlist\">Dijeli playlistu</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s odgovor</item>\n        <item quantity=\"few\">%s odgovora</item>\n        <item quantity=\"other\">%s odgovora</item>\n    </plurals>\n    <string name=\"disable_media_tunneling_automatic_info\">Tuneliranje medija je standardno deaktivirano na tvom uređaju jer je poznato da model tvog uređaja to ne podržava.</string>\n    <string name=\"yes\">Da</string>\n    <string name=\"no\">Ne</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"error_insufficient_storage\">Nedovoljno memorije na uređaju</string>\n    <string name=\"settings_category_backup_restore_title\">Spremanje sigurnosne kopije i obnavljanje</string>\n    <string name=\"auto_update_check_description\">NewPipe može automatski tražiti nove verzije i obavijestiti te.\n\\nŽeliš li aktivirati tu mogućnost?</string>\n    <string name=\"reset_settings_title\">Obnovi postavke</string>\n    <string name=\"reset_settings_summary\">Obnovi sve postavke na zadane vrijednosti</string>\n    <string name=\"reset_all_settings\">Obnavljanje svih postavki odbacit će sve tvoje postavljene postavke i aplikacija će se ponovo pokrenuti.\n\\n\n\\nStvarno želiš nastaviti?</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Uvijek koristi ExoPlayer postavku zaobilaženja videa za izlaznu površinu</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Kartice za dohvaćanje prilikom aktualiziranja feeda. Ova opcija nema učinka ako se kanal aktualizira pomoću brzog modusa.</string>\n    <string name=\"audio_track_type_secondary\">sekundarno</string>\n    <string name=\"search_with_service_name\">Pretraži %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Pretraži %1$s (%2$s)</string>\n    <string name=\"tab_bookmarks_short\">Popisi izvođenja</string>\n    <string name=\"permission_display_over_apps_message\">Da biste koristili Popup Player, odaberite %1$s u sljedećem izborniku postavki Androida i omogućite %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"Dopusti prikaz preko drugih aplikacija\\\"</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"delete_file\">Izbriši datoteku</string>\n    <string name=\"delete_entry\">Obriši unos</string>\n    <string name=\"select_a_feed_group\">Odaberite grupu feedova</string>\n    <string name=\"no_feed_group_created_yet\">Još nije stvorena nijedna grupa feedova</string>\n    <string name=\"feed_group_page_summary\">Stranica grupe kanala</string>\n    <string name=\"account_terminated_service_provides_reason\">Račun ukinut\\n\\n%1$s navodi ovaj razlog: %2$s</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Ovo zaobilazno rješenje oslobađa i ponovno instancira video kodeke kada dođe do promjene površine, umjesto da se površina izravno postavlja na kodek. Već se koristi od strane ExoPlayera na nekim uređajima s ovim problemom, ova postavka ima učinak samo na Androidu 6 i novijim verzijama.\\n\\nOmogućavanje ove opcije može spriječiti pogreške reprodukcije prilikom prebacivanja trenutnog video playera ili prebacivanja na cijeli zaslon</string>\n    <string name=\"channel_tab_likes\">Lajkovi</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Podijeli kao privremenu playlistu na YouTubeu</string>\n    <string name=\"import_settings_vulnerable_format\">Postavke u izvozu koji se uvozi koriste ranjivi format koji je zastario od verzije NewPipe 0.27.0. Provjerite je li izvoz koji se uvozi iz pouzdanog izvora i u budućnosti radije koristite samo izvoze dobivene iz NewPipe 0.27.0 ili novije verzije. Podrška za uvoz postavki u ovom ranjivom formatu uskoro će biti potpuno uklonjena, a zatim stare verzije NewPipea više neće moći uvoziti postavke izvoza iz novih verzija.</string>\n    <string name=\"migration_info_6_7_title\">Stranica SoundCloud Top 50 uklonjena</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud je ukinuo originalne Top 50 ljestvice. Odgovarajuća kartica je uklonjena s vaše glavne stranice.</string>\n    <string name=\"migration_info_7_8_title\">Uklonjeni kombinirani trendovi na YouTubeu</string>\n    <string name=\"migration_info_7_8_message\">YouTube je ukinuo kombiniranu stranicu s trendovima od 21. srpnja 2025. NewPipe je zamijenio zadanu stranicu s trendovima s trendovima prijenosa uživo.\\n\\nTakođer možete odabrati različite stranice s trendovima u \\\"Postavke &gt; Sadržaj &gt; Sadržaj glavne stranice\\\".</string>\n    <string name=\"trending_gaming\">Trendovi u igrama</string>\n    <string name=\"trending_podcasts\">Trendovi podcasti</string>\n    <string name=\"trending_movies\">Trendovi u filmovima i serijama</string>\n    <string name=\"trending_music\">Glazba u trendu</string>\n    <string name=\"entry_deleted\">Unos izbrisan</string>\n    <string name=\"player_http_403\">HTTP greška 403 primljena od poslužitelja tijekom reprodukcije, vjerojatno uzrokovana istekom URL-a za streaming ili zabranom IP adrese</string>\n    <string name=\"player_http_invalid_status\">HTTP greška %1$s primljena od poslužitelja tijekom reprodukcije</string>\n    <string name=\"youtube_player_http_403\">HTTP greška 403 primljena od poslužitelja tijekom reprodukcije, vjerojatno uzrokovana zabranom IP adrese ili problemima s deobfuskacijom URL-a za streaming</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s je odbio dati podatke, tražeći prijavu kako bi potvrdio da podnositelj zahtjeva nije bot.\\n\\nVašu IP adresu je možda privremeno zabranio %1$s, možete pričekati neko vrijeme ili se prebaciti na drugu IP adresu (na primjer uključivanjem/isključivanjem VPN-a ili prebacivanjem s WiFi-ja na mobilne podatke).</string>\n    <string name=\"unsupported_content_in_country\">Ovaj sadržaj nije dostupan za trenutno odabranu zemlju sadržaja.\\n\\nPromijenite odabir u \\\"Postavke &gt; Sadržaj &gt; Zadana zemlja sadržaja\\\".</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-hu/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Közzétéve: %1$s</string>\n    <string name=\"no_player_found\">Nem található megfelelő médialejátszó. Telepíti a VLC-t\\?</string>\n    <string name=\"install\">Telepítés</string>\n    <string name=\"cancel\">Mégse</string>\n    <string name=\"open_in_browser\">Megnyitás böngészőben</string>\n    <string name=\"share\">Megosztás</string>\n    <string name=\"download\">Letöltés</string>\n    <string name=\"search\">Keresés</string>\n    <string name=\"settings\">Beállítások</string>\n    <string name=\"did_you_mean\">Erre gondolt: „%1$s”\\?</string>\n    <string name=\"share_dialog_title\">Megosztás ezzel</string>\n    <string name=\"download_path_title\">Videófájlok letöltési mappája</string>\n    <string name=\"download_path_summary\">A letöltött videófájlok itt lesznek tárolva</string>\n    <string name=\"download_path_dialog_title\">Válasszon letöltési mappát a videófájloknak</string>\n    <string name=\"default_resolution_title\">Alapértelmezett felbontás</string>\n    <string name=\"play_with_kodi_title\">Lejátszás Kodival</string>\n    <string name=\"kore_not_found\">Telepíti a hiányzó Kore alkalmazást?</string>\n    <string name=\"show_play_with_kodi_title\">A „Lejátszás Kodival” lehetőség megjelenítése</string>\n    <string name=\"show_play_with_kodi_summary\">A videók Kodi médiaközponttal történő lejátszásának megjelenítése</string>\n    <string name=\"play_audio\">Hang</string>\n    <string name=\"default_audio_format_title\">Alapértelmezett hangformátum</string>\n    <string name=\"download_dialog_title\">Letöltés</string>\n    <string name=\"unsupported_url\">Nem támogatott webcím</string>\n    <string name=\"use_external_video_player_title\">Külső videólejátszó használata</string>\n    <string name=\"use_external_audio_player_title\">Külső hanglejátszó használata</string>\n    <string name=\"download_path_audio_dialog_title\">Válassza ki a hangfájlok letöltési helyét</string>\n    <string name=\"network_error\">Hálózati hiba</string>\n    <string name=\"background_player_playing_toast\">Lejátszás a háttérben</string>\n    <string name=\"settings_category_video_audio_title\">Videó és hang</string>\n    <string name=\"settings_category_appearance_title\">Megjelenés</string>\n    <string name=\"content_language_title\">Tartalom alapértelmezett nyelve</string>\n    <string name=\"show_next_and_similar_title\">„Következő” és „Hasonló” videók megjelenítése</string>\n    <string name=\"dark_theme_title\">Sötét</string>\n    <string name=\"light_theme_title\">Világos</string>\n    <string name=\"theme_title\">Téma</string>\n    <string name=\"download_path_audio_title\">Hangfájlok letöltési mappája</string>\n    <string name=\"download_path_audio_summary\">A letöltött hangfájlok itt lesznek tárolva</string>\n    <string name=\"detail_likes_img_view_description\">Tetszik</string>\n    <string name=\"detail_dislikes_img_view_description\">Nem tetszik</string>\n    <string name=\"detail_thumbnail_view_description\">Videó lejátszása, hossz:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Fetöltő profilképének bélyegképe</string>\n    <string name=\"content\">Tartalom</string>\n    <string name=\"show_age_restricted_content_title\">Korhatáros tartalom megjelenítése</string>\n    <string name=\"general_error\">Hiba</string>\n    <string name=\"content_not_available\">A tartalom nem érhető el</string>\n    <string name=\"duration_live\">Élő</string>\n    <string name=\"error_snackbar_action\">Jelentés</string>\n    <string name=\"what_device_headline\">Információ:</string>\n    <string name=\"what_happened_headline\">Ez történt:</string>\n    <string name=\"your_comment\">Saját megjegyzés (angolul):</string>\n    <string name=\"error_details_headline\">Részletek:</string>\n    <string name=\"error_snackbar_message\">Elnézést, valami balul sült el.</string>\n    <string name=\"sorry_string\">Elnézést, ennek nem kellett volna megtörténnie.</string>\n    <string name=\"error_report_button_text\">Jelentés e-mailben</string>\n    <string name=\"could_not_setup_download_menu\">Nem sikerült a letöltési menü beállítása</string>\n    <string name=\"retry\">Újra</string>\n    <string name=\"video\">Videó</string>\n    <string name=\"audio\">Hang</string>\n    <string name=\"main_bg_subtitle\">A kezdéshez koppintson a nagyítóra.</string>\n    <string name=\"could_not_load_thumbnails\">Nem sikerült az összes bélyegkép betöltése</string>\n    <string name=\"parsing_error\">Nem sikerült a weblap feldolgozása</string>\n    <string name=\"downloads\">Letöltések</string>\n    <string name=\"downloads_title\">Letöltések</string>\n    <string name=\"error_report_title\">Hibajelentés</string>\n    <string name=\"start\">Indítás</string>\n    <string name=\"pause\">Szüneteltetés</string>\n    <string name=\"delete\">Törlés</string>\n    <string name=\"checksum\">Ellenőrzőösszeg</string>\n    <string name=\"ok\">Rendben</string>\n    <string name=\"msg_name\">Fájlnév</string>\n    <string name=\"msg_threads\">Szálak</string>\n    <string name=\"msg_error\">Hiba</string>\n    <string name=\"msg_running\">A NewPipe letölt</string>\n    <string name=\"msg_running_detail\">Koppintson a részletekért</string>\n    <string name=\"msg_wait\">Kis türelmet…</string>\n    <string name=\"msg_copied\">Vágólapra másolva</string>\n    <string name=\"no_available_dir\">Adjon meg később egy letöltési mappát a beállításokban</string>\n    <string name=\"channel_unsubscribed\">Csatornáról leiratkozva</string>\n    <string name=\"subscription_change_failed\">Nem sikerült megváltoztatni a feliratkozást</string>\n    <string name=\"subscription_update_failed\">Nem sikerült frissíteni a feliratkozást</string>\n    <string name=\"tab_subscriptions\">Feliratkozások</string>\n    <string name=\"tab_bookmarks\">Könyvjelzőzött lejátszási listák</string>\n    <string name=\"fragment_feed_title\">Újdonságok</string>\n    <string name=\"controls_background_title\">Háttér</string>\n    <string name=\"controls_popup_title\">Felugró ablak</string>\n    <string name=\"no_player_found_toast\">Nem található lejátszó a közvetítéshez (a lejátszásához telepítheti a VLC-t).</string>\n    <string name=\"open_in_popup_mode\">Megnyitás felugró módban</string>\n    <string name=\"use_external_video_player_summary\">Néhány felbontásnál eltávolítja a hangot</string>\n    <string name=\"subscribe_button_title\">Feliratkozás</string>\n    <string name=\"subscribed_button_title\">Feliratkozva</string>\n    <string name=\"show_info\">További információ</string>\n    <string name=\"default_popup_resolution_title\">Felugró ablak alapértelmezett felbontása</string>\n    <string name=\"show_higher_resolutions_title\">Magasabb felbontások megjelenítése</string>\n    <string name=\"show_higher_resolutions_summary\">Csak bizonyos eszközök tudnak 2K/4K-s videókat lejátszani</string>\n    <string name=\"default_video_format_title\">Alapértelmezett videóformátum</string>\n    <string name=\"black_theme_title\">Fekete</string>\n    <string name=\"popup_remember_size_pos_title\">Felugró ablak tulajdonságainak megjegyzése</string>\n    <string name=\"popup_remember_size_pos_summary\">A felugró ablak előző helyének és méretének megjegyzése</string>\n    <string name=\"show_search_suggestions_title\">Keresési javaslatok</string>\n    <string name=\"show_search_suggestions_summary\">Válassza ki a keresési javaslatokat keresés közben</string>\n    <string name=\"enable_search_history_title\">Keresési előzmények</string>\n    <string name=\"enable_watch_history_title\">Megtekintési előzmények</string>\n    <string name=\"enable_watch_history_summary\">Megtekintett videók nyomon követése</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Lejátszás folytatása félbeszakítások után (például telefonhívás)</string>\n    <string name=\"settings_category_player_title\">Lejátszó</string>\n    <string name=\"settings_category_player_behavior_title\">Működés</string>\n    <string name=\"settings_category_history_title\">Előzmények és gyorsítótár</string>\n    <string name=\"settings_category_debug_title\">Hibaelhárítás</string>\n    <string name=\"popup_playing_toast\">Lejátszás felugró módban</string>\n    <string name=\"all\">Összes</string>\n    <string name=\"disabled\">Letiltva</string>\n    <string name=\"clear\">Törlés</string>\n    <string name=\"best_resolution\">Legjobb felbontás</string>\n    <string name=\"undo\">Visszavonás</string>\n    <string name=\"play_all\">Összes lejátszása</string>\n    <string name=\"always\">Mindig</string>\n    <string name=\"just_once\">Csak egyszer</string>\n    <string name=\"notification_channel_name\">NewPipe értesítés</string>\n    <string name=\"notification_channel_description\">Értesítések a NewPipe lejátszójához</string>\n    <string name=\"unknown_content\">[Ismeretlen]</string>\n    <string name=\"import_data_title\">Adatbázis importálása</string>\n    <string name=\"export_data_title\">Adatbázis exportálása</string>\n    <string name=\"import_data_summary\">Felülírja a jelenlegi előzményeket, feliratkozásokat, lejátszási listákat és (választhatóan) a beállításokat</string>\n    <string name=\"export_data_summary\">Előzmények, feliratkozások, lejátszási listák és beállítások exportálása</string>\n    <string name=\"app_ui_crash\">Az alkalmazás/kezelőfelület összeomlott</string>\n    <string name=\"player_stream_failure\">Nem sikerült a videó lejátszása</string>\n    <string name=\"external_player_unsupported_link_type\">A külső lejátszó nem támogatja az ilyen típusú hivatkozásokat</string>\n    <string name=\"video_streams_empty\">Nem található videófolyam</string>\n    <string name=\"audio_streams_empty\">Nem található hangfolyam</string>\n    <string name=\"info_labels\">Mi:\\nKérés:\\nTartalom nyelve:\\nTartalom származási országa:\\nAlkalmazás nyelve:\\nSzolgáltatás:\\nGMT idő:\\nCsomag:\\nVerzió:\\nOperációs rendszer verzió:</string>\n    <string name=\"search_no_results\">Nincs találat</string>\n    <string name=\"controls_download_desc\">Közvetítési fájl letöltése</string>\n    <string name=\"controls_add_to_playlist_title\">Hozzáadás ehhez</string>\n    <string name=\"use_inexact_seek_title\">Gyorsabb, de pontatlan tekerés használata</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Bélyegkép gyorsítótára törölve</string>\n    <string name=\"metadata_cache_wipe_title\">Gyorsítótárazott metaadatok törlése</string>\n    <string name=\"metadata_cache_wipe_summary\">Minden gyorsítótárazott weboldaladat törölve</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metaadatok gyorsítótára törölve</string>\n    <string name=\"auto_queue_title\">Következő videó automatikus sorba állítása</string>\n    <string name=\"enable_search_history_summary\">Keresési előzmények helyi tárolása</string>\n    <string name=\"channels\">Csatornák</string>\n    <string name=\"playlists\">Lejátszási listák</string>\n    <string name=\"tracks\">Zeneszámok</string>\n    <string name=\"users\">Felhasználók</string>\n    <string name=\"file\">Fájl</string>\n    <string name=\"switch_to_background\">Folytatás a háttérben</string>\n    <string name=\"switch_to_popup\">Folytatás felugró ablakban</string>\n    <string name=\"clear_views_history_title\">Megtekintési előzmények törlése</string>\n    <string name=\"clear_views_history_summary\">Törli a megtekintési előzményeket és a lejátszási pozíciókat</string>\n    <string name=\"delete_view_history_alert\">Törli az összes megtekintési előzményt\\?</string>\n    <string name=\"watch_history_deleted\">Megtekintési előzmények törölve</string>\n    <string name=\"clear_search_history_title\">Keresési előzmények törlése</string>\n    <string name=\"clear_search_history_summary\">Eltávolítja a keresési kulcsszavakat az előzményekből</string>\n    <string name=\"delete_search_history_alert\">Törli az összes keresési előzményt\\?</string>\n    <string name=\"search_history_deleted\">Keresési előzmények törölve</string>\n    <string name=\"player_unrecoverable_failure\">Helyreállíthatatlan lejátszóhiba történt</string>\n    <string name=\"player_recoverable_failure\">Lejátszóhiba helyreállítása</string>\n    <string name=\"invalid_directory\">Nincs ilyen mappa</string>\n    <string name=\"invalid_source\">Nincs ilyen fájl- vagy tartalomforrás</string>\n    <string name=\"invalid_file\">A fájl nem létezik, vagy hiányzik az olvasási vagy írási jogosultság</string>\n    <string name=\"file_name_empty_error\">A fájlnév nem lehet üres</string>\n    <string name=\"error_occurred_detail\">Hiba történt: %1$s</string>\n    <string name=\"no_streams_available_download\">Nincs letölthető adatfolyam</string>\n    <string name=\"empty_list_subtitle\">Nincs itt semmi pár tücskön kívül</string>\n    <string name=\"detail_drag_description\">Húzza az átrendezéshez</string>\n    <string name=\"no_subscribers\">Nincs feliratkozó</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s feliratkozó</item>\n        <item quantity=\"other\">%s feliratkozó</item>\n    </plurals>\n    <string name=\"no_views\">Nincs megtekintés</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s megtekintés</item>\n        <item quantity=\"other\">%s megtekintés</item>\n    </plurals>\n    <string name=\"no_videos\">Nincs videó</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s videó</item>\n        <item quantity=\"other\">%s videó</item>\n    </plurals>\n    <string name=\"create\">Létrehozás</string>\n    <string name=\"rename\">Átnevezés</string>\n    <string name=\"msg_popup_permission\">Ez az engedély szükséges\n\\na felugró ablakban történő megnyitáshoz</string>\n    <string name=\"one_item_deleted\">1 elem törölve.</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA rejtvény</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA rejtvény kérve</string>\n    <string name=\"settings_category_downloads_title\">Letöltés</string>\n    <string name=\"settings_file_charset_title\">Fájlnevekben engedélyezett karakterek</string>\n    <string name=\"settings_file_replacement_character_summary\">Az érvénytelen karakterek erre az értékre lesznek lecserélve</string>\n    <string name=\"settings_file_replacement_character_title\">Cserekarakter</string>\n    <string name=\"charset_letters_and_digits\">Betűk és számok</string>\n    <string name=\"charset_most_special_characters\">Legtöbb speciális karakter</string>\n    <string name=\"title_activity_about\">A NewPipe névjegye</string>\n    <string name=\"tab_about\">Névjegy és GYIK</string>\n    <string name=\"tab_licenses\">Licencek</string>\n    <string name=\"app_description\">Szabad, egyszerű közvetítésnézés Androidon.</string>\n    <string name=\"contribution_title\">Közreműködés</string>\n    <string name=\"contribution_encouragement\">Akár fordítással, tervezési változtatásokkal, kódtisztítással, vagy valódi nehéz kódváltoztatással kapcsolatos ötletei vannak, bármilyen segítséget szívesen fogadunk. Minél több minden készül el, annál jobb lesz!</string>\n    <string name=\"view_on_github\">Megtekintés a GitHubon</string>\n    <string name=\"donation_title\">Adományozás</string>\n    <string name=\"donation_encouragement\">A NewPipe alkalmazást önkéntesek fejlesztik a szabadidejükben, hogy a lehető legjobb felhasználói élményt nyújtsák. Járuljon hozzá, hogy a fejlesztők még jobbá tegyék alkalmazást, miközben egy csésze kávét szürcsölnek.</string>\n    <string name=\"give_back\">Hozzájárulás</string>\n    <string name=\"website_title\">Weboldal</string>\n    <string name=\"website_encouragement\">Látogasson el a NewPipe weboldalára további információkért és hírekért.</string>\n    <string name=\"privacy_policy_title\">A NewPipe adatvédelmi irányelvei</string>\n    <string name=\"privacy_policy_encouragement\">A NewPipe projekt komolyan veszi az adatvédelmét. Az alkalmazás nem gyűjt semmilyen adatot a beleegyezése nélkül.\n\\nA NewPipe adatvédelmi irányelve részletesen elmagyarázza, mely adatok kerülnek elküldésre és tárolásra az alkalmazás összeomlásának jelentésekor.</string>\n    <string name=\"read_privacy_policy\">Adatvédelmi irányelvek elolvasása</string>\n    <string name=\"app_license_title\">A NewPipe licence</string>\n    <string name=\"read_full_license\">Licenc elolvasása</string>\n    <string name=\"title_activity_history\">Előzmények</string>\n    <string name=\"action_history\">Előzmények</string>\n    <string name=\"delete_item_search_history\">Törli ezt az elemet a keresési előzmények közül\\?</string>\n    <string name=\"title_last_played\">Utoljára lejátszott</string>\n    <string name=\"title_most_played\">Legtöbbet lejátszott</string>\n    <string name=\"main_page_content\">Főoldal tartalma</string>\n    <string name=\"blank_page_summary\">Üres oldal</string>\n    <string name=\"kiosk_page_summary\">Témagyűjtemények</string>\n    <string name=\"channel_page_summary\">Csatornaoldal</string>\n    <string name=\"select_a_channel\">Válasszon egy csatornát</string>\n    <string name=\"no_channel_subscribed_yet\">Még nincs csatornafeliratkozás</string>\n    <string name=\"select_a_kiosk\">Válasszon egy témagyűjteményt</string>\n    <string name=\"export_complete_toast\">Exportálva</string>\n    <string name=\"import_complete_toast\">Importálva</string>\n    <string name=\"no_valid_zip_file\">Nem érvényes ZIP-fájl</string>\n    <string name=\"could_not_import_all_files\">Figyelmeztetés: nem sikerült az összes fájl importálása.</string>\n    <string name=\"override_current_data\">Ez felül fogja írni a jelenlegi beállításokat.</string>\n    <string name=\"import_settings\">A beállításokat is importálja\\?</string>\n    <string name=\"trending\">Felkapott</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Új és népszerű</string>\n    <string name=\"play_queue_remove\">Eltávolítás</string>\n    <string name=\"play_queue_stream_detail\">Részletek</string>\n    <string name=\"play_queue_audio_settings\">Hangbeállítások</string>\n    <string name=\"preferred_open_action_settings_summary\">Alapértelmezett tevékenység „%s” típusú tartalom megnyitásakor</string>\n    <string name=\"video_player\">Videólejátszó</string>\n    <string name=\"background_player\">Háttérbeli lejátszó</string>\n    <string name=\"popup_player\">Felugró ablakos lejátszás</string>\n    <string name=\"always_ask_open_action\">Mindig kérdezzen</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Információk gyűjtése…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Kért tartalom betöltése</string>\n    <string name=\"create_playlist\">Új lejátszási lista</string>\n    <string name=\"rename_playlist\">Átnevezés</string>\n    <string name=\"name\">Név</string>\n    <string name=\"add_to_playlist\">Lejátszási listához adás</string>\n    <string name=\"set_as_playlist_thumbnail\">Beállítás a lejátszási lista bélyegképeként</string>\n    <string name=\"unbookmark_playlist\">Könyvjelző eltávolítása</string>\n    <string name=\"delete_playlist_prompt\">Törli ezt a lejátszási listát\\?</string>\n    <string name=\"playlist_creation_success\">Lejátszási lista létrehozva</string>\n    <string name=\"playlist_add_stream_success\">Lejátszási listához adva</string>\n    <string name=\"playlist_thumbnail_change_success\">A lejátszási lista bélyegképe megváltozott.</string>\n    <string name=\"caption_none\">Nincs felirat</string>\n    <string name=\"resize_fit\">Igazítás</string>\n    <string name=\"resize_fill\">Kitöltés</string>\n    <string name=\"resize_zoom\">Nagyítás</string>\n    <string name=\"caption_auto_generated\">Automatikusan létrehozott</string>\n    <string name=\"caption_setting_title\">Feliratok</string>\n    <string name=\"caption_setting_description\">Feliratok méretének és hátterének stílusbeli módosítása. A módosítások életbe lépésehez az alkalmazás újraindítása szükséges</string>\n    <string name=\"import_title\">Importálás</string>\n    <string name=\"import_from\">Importálás a következőből</string>\n    <string name=\"export_to\">Exportálás a következőbe</string>\n    <string name=\"import_ongoing\">Importálás…</string>\n    <string name=\"export_ongoing\">Exportálás…</string>\n    <string name=\"import_file_title\">Fájl importálása</string>\n    <string name=\"previous_export\">Előző exportálás</string>\n    <string name=\"subscriptions_import_unsuccessful\">A feliratkozások importálása sikertelen</string>\n    <string name=\"subscriptions_export_unsuccessful\">A feliratkozások exportálása sikertelen</string>\n    <string name=\"import_youtube_instructions\">YouTube feliratkozások importálása a Google Takeoutból: \\n \\n1. Navigáljon erre az oldalra: %1$s \\n2. Jelentkezzen be, ha kérik \\n3. Kattintson „Az összes adatot tartalmazza” gombra, majd a „Kijelölések megszüntetése” gombra, majd válassza ki a „feliratkozások” lehetőséget és kattintson az „OK” gombra \\n4. Kattintson a „Következő lépés”, majd az \\\"Exportálás indítása” gombra \\n5. Kattintson a „Letöltés” gombra, amikor megjelenik, \\n6. Kattintson a lenti FÁJL IMPORTÁLÁSA gombra, és válassza ki a letöltött ZIP-fájlt \\n7. [Ha a ZIP-fájl importálása nem sikerül] Bontsa ki a .csv fájlt (általában: „YouTube és YouTube Music/feliratkozások/feliratkozások.csv”), majd kattintson lent a FÁJL IMPORTÁLÁSA gombra, és válassza az exportált CSV-fájlt</string>\n    <string name=\"import_soundcloud_instructions\">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 a következő webcímre: %1$s \\n3. Jelentkezzen be, ha kéri \\n4. Másolja ki a profil webcímét, ahova át lett irányítva.</string>\n    <string name=\"import_soundcloud_instructions_hint\">saját azonosítója, soundcloud.com/azonosító</string>\n    <string name=\"import_network_expensive_warning\">Ez a művelet adatforgalom-igényes lehet.\n\\n\n\\nBiztos, hogy folytatja\\?</string>\n    <string name=\"playback_tempo\">Ütem</string>\n    <string name=\"playback_pitch\">Hangmagasság</string>\n    <string name=\"skip_silence_checkbox\">Előretekerés csend alatt</string>\n    <string name=\"playback_step\">Lépés</string>\n    <string name=\"playback_reset\">Visszaállítás</string>\n    <string name=\"accept\">Elfogadás</string>\n    <string name=\"decline\">Elutasítás</string>\n    <string name=\"limit_data_usage_none_description\">Nincs korlát</string>\n    <string name=\"limit_mobile_data_usage_title\">Felbontás korlátozása mobil adatkapcsolat használata esetén</string>\n    <string name=\"minimize_on_exit_summary\">A fő videólejátszóról más alkalmazásra történő váltáskor teendő művelet — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Ne tegyen semmit</string>\n    <string name=\"minimize_on_exit_background_description\">Lejátszás folytatása a háttérben</string>\n    <string name=\"minimize_on_exit_popup_description\">Lejátszás folytatása felugró ablakban</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Lejátszás folytatása</string>\n    <string name=\"show_hold_to_append_title\">A „Tartsa lenyomva a sorba állításhoz” tipp megjelenítése</string>\n    <string name=\"unsubscribe\">Leiratkozás</string>\n    <string name=\"tab_choose\">Válasszon lapot</string>\n    <string name=\"show_comments_title\">Hozzászólások megjelenítése</string>\n    <string name=\"show_comments_summary\">Kapcsolja ki a hozzászólások elrejtéséhez</string>\n    <string name=\"default_content_country_title\">Tartalom alapértelmezett országa</string>\n    <string name=\"switch_to_main\">Folytatás főnézetben</string>\n    <string name=\"dismiss\">Eltüntetés</string>\n    <string name=\"bookmark_playlist\">Lejátszási lista könyvjelzőzése</string>\n    <string name=\"auto_queue_summary\">Egy hasonló videó hozzáadása a befejeződő (nem ismétlődő) lejátszási sorhoz</string>\n    <string name=\"enqueue\">Sorba állítás</string>\n    <string name=\"overwrite_failed\">a fájl nem írható felül</string>\n    <string name=\"seek_duration_title\">Az előre- és visszatekerés időtartama</string>\n    <string name=\"enable_playback_resume_summary\">Utolsó lejátszási pozíció visszaállítása</string>\n    <string name=\"enable_playback_resume_title\">Lejátszás folytatása</string>\n    <string name=\"app_update_notification_channel_description\">Értesítések az új NewPipe verziókról</string>\n    <string name=\"app_update_notification_channel_name\">Alkalmazásfrissítés értesítése</string>\n    <string name=\"file_deleted\">Fájl törölve</string>\n    <string name=\"settings_category_updates_title\">Frissítések</string>\n    <string name=\"show_hold_to_append_summary\">Tipp megjelenítése a háttér vagy a felugró gomb megnyomásakor a videó „Részletek:” lehetőségnél</string>\n    <string name=\"autoplay_title\">Automatikus lejátszás</string>\n    <string name=\"settings_category_clear_data_title\">Adatok törlése</string>\n    <string name=\"enable_playback_state_lists_summary\">Lejátszási pozíciók megjelenítése a listákban</string>\n    <string name=\"enable_playback_state_lists_title\">Pozíciók a listákban</string>\n    <string name=\"downloads_storage_ask_summary\">Meg fogja kérdezni, hogy hova mentse el az egyes letöltéseket.\n\\nEngedélyezze a rendszermappa-választót (SAF), ha külső SD-kártyára akar letölteni</string>\n    <string name=\"downloads_storage_ask_title\">Kérdezze meg, hova töltse le</string>\n    <string name=\"pause_downloads\">Letöltések szüneteltetése</string>\n    <string name=\"start_downloads\">Letöltések indítása</string>\n    <string name=\"enable_queue_limit_desc\">Egyszerre csak egy letöltés fog futni</string>\n    <string name=\"enable_queue_limit\">Letöltési sor korlátozása</string>\n    <string name=\"close\">Bezárás</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Hasznos, ha mobil adatkapcsolatra vált, bár néhány letöltést nem lehet felfüggeszteni</string>\n    <string name=\"pause_downloads_on_mobile\">Félbehagyás a forgalomkorlátos hálózatokon</string>\n    <string name=\"max_retry_desc\">A letöltés megszakítása előtti kísérletek legnagyobb száma</string>\n    <string name=\"max_retry_msg\">Próbálkozások legnagyobb száma</string>\n    <string name=\"stop\">Leállítás</string>\n    <string name=\"delete_downloaded_files\">Letöltött fájlok törlése</string>\n    <string name=\"confirm_prompt\">Törli a letöltési előzményeket, vagy törli az összes letöltött fájlt\\?</string>\n    <string name=\"clear_download_history\">Letöltési előzmények törlése</string>\n    <string name=\"error_download_resource_gone\">A letöltést nem lehet helyrehozni</string>\n    <string name=\"error_timeout\">Kapcsolati időtúllépés</string>\n    <string name=\"error_progress_lost\">Az előrehaladás elveszett, mert a fájlt törölték</string>\n    <string name=\"error_insufficient_storage_left\">Nincs hely az eszközön</string>\n    <string name=\"error_postprocessing_stopped\">A NewPipe leállt a fájl feldolgozása közben</string>\n    <string name=\"error_postprocessing_failed\">Az utófeldolgozás sikertelen</string>\n    <string name=\"error_http_not_found\">Nincs talalat</string>\n    <string name=\"error_http_unsupported_range\">A kiszolgáló nem fogad többszálú letöltést, próbálkozzon újra ezzel: @string/msg_threads = 1</string>\n    <string name=\"error_http_no_content\">A kiszolgáló nem küld adatokat</string>\n    <string name=\"error_connect_host\">A kiszolgáló szerver nem elérhető</string>\n    <string name=\"error_unknown_host\">A kiszolgáló nem található</string>\n    <string name=\"error_ssl_exception\">Nem sikerült biztonságos kapcsolatot létesíteni</string>\n    <string name=\"error_path_creation\">A célmappa nem hozható létre</string>\n    <string name=\"error_file_creation\">A fájlt nem sikerült létrehozni</string>\n    <string name=\"show_error\">Hiba megjelenítése</string>\n    <string name=\"download_already_pending\">Ezzel a névvel egy letöltés már várakozik</string>\n    <string name=\"download_already_running\">Ezzel a névvel egy letöltés már folyamatban van</string>\n    <string name=\"overwrite_finished_warning\">Ilyen névű letöltött fájl már létezik</string>\n    <string name=\"overwrite_unrelated_warning\">Ilyen névű fájl már létezik</string>\n    <string name=\"overwrite\">Felülírás</string>\n    <string name=\"generate_unique_name\">Egyedi név előállítása</string>\n    <string name=\"download_failed\">A letöltés sikertelen</string>\n    <string name=\"recovering\">helyrehozás</string>\n    <string name=\"post_processing\">utófeldolgozás</string>\n    <string name=\"queued\">sorba állítva</string>\n    <string name=\"paused\">szüneteltetve</string>\n    <string name=\"missions_header_pending\">Függőben lévő</string>\n    <string name=\"missions_header_finished\">Befejezett</string>\n    <string name=\"app_update_available_notification_title\">NewPipe frissítés érhető el!</string>\n    <string name=\"auto\">Automatikus</string>\n    <string name=\"grid\">Rács</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"list_view_mode\">Lista nézet</string>\n    <string name=\"missing_file\">A fájl áthelyezve vagy törölve</string>\n    <string name=\"download_to_sdcard_error_message\">A külső SD-kártyára történő mentés nem lehetséges. Visszaállítja a letöltési mappa helyét\\?</string>\n    <string name=\"download_to_sdcard_error_title\">A külső tárhely nem érhető el</string>\n    <string name=\"watch_history_states_deleted\">Lejátszási pozíciók törölve</string>\n    <string name=\"delete_playback_states_alert\">Törli az összes lejátszási pozíciót\\?</string>\n    <string name=\"clear_playback_states_summary\">Összes lejátszási pozíció törlése</string>\n    <string name=\"clear_playback_states_title\">Lejátszási pozíciók törlése</string>\n    <string name=\"search_showing_result_for\">Találatok a következőre: %s</string>\n    <string name=\"notification_scale_to_square_image_title\">Bélyegkép 1:1-es képarányra vágása</string>\n    <string name=\"notification_colorize_title\">Értesítés színezése</string>\n    <string name=\"notification_action_nothing\">Semmi</string>\n    <string name=\"notification_action_shuffle\">Keverés</string>\n    <string name=\"notification_action_repeat\">Ismétlés</string>\n    <string name=\"show_description_title\">Leírás megjelenítése</string>\n    <string name=\"notification_action_buffering\">Pufferelés</string>\n    <string name=\"open_with\">Megnyitás ezzel</string>\n    <string name=\"unsupported_url_dialog_message\">A webcím nem felismerhető. Megnyitja másik alkalmazással?</string>\n    <string name=\"auto_queue_toggle\">Automatikus sorba állítás</string>\n    <string name=\"show_description_summary\">Kapcsolja ki, hogy elrejtse a videó leírását és a további információkat</string>\n    <string name=\"restore_defaults_confirmation\">Visszaállítja az alapértelmezéseket\\?</string>\n    <string name=\"restricted_video_no_stream\">Ez a videó korhatáros. \\nAz új, korhatáros videókkal kapcsolatos YouTube irányelvek miatt a NewPipe nem férhet hozzá a videófolyamokhoz, így nem tudja lejátszani.</string>\n    <string name=\"description_tab_description\">Leírás</string>\n    <string name=\"comments_tab_description\">Hozzászólások</string>\n    <string name=\"copy_for_github\">Formázott jelentés másolása</string>\n    <string name=\"permission_display_over_apps\">Adjon engedélyt a más alkalmazások feletti megjelenéshez</string>\n    <string name=\"no_playlist_bookmarked_yet\">Még nincs könyvjelző lejátszási listához</string>\n    <string name=\"unmute\">Némítás megszüntetése</string>\n    <string name=\"mute\">Némítás</string>\n    <string name=\"feed_subscription_not_loaded_count\">Nincs betöltve: %d</string>\n    <string name=\"feed_group_dialog_empty_name\">Üres csoportnév</string>\n    <string name=\"feed_group_dialog_delete_message\">Törli ezt a csoportot\\?</string>\n    <string name=\"feed_update_threshold_option_always_update\">Mindig frissítsen</string>\n    <string name=\"channel_created_by\">Készítette: %s</string>\n    <string name=\"playlist_page_summary\">Lejátszási lista oldal</string>\n    <string name=\"show_thumbnail_summary\">Bélyegkép használata a zárképernyőn és az értesítéseken is</string>\n    <string name=\"radio\">Rádió</string>\n    <string name=\"night_theme_summary\">Válassza ki a kedvenc éjszakai témáját — %s</string>\n    <string name=\"select_night_theme_toast\">Lent kiválaszthatja a kedvenc éjszakai témáját</string>\n    <string name=\"recently_added\">Nemrég hozzáadott</string>\n    <string name=\"new_seek_duration_toast\">Az ExoPlayer korlátai miatt az előre- és visszatekerés időtartama %d másodpercre lett állítva</string>\n    <string name=\"feed_groups_header_title\">Csatornacsoportok</string>\n    <string name=\"systems_language\">Rendszer alapértelmezése</string>\n    <string name=\"start_accept_privacy_policy\">Az Általános adatvédelmi rendeletnek (GDPR) való megfelelés érdekében felhívjuk figyelmét a NewPipe adatvédelmi irányelveire. Olvassa el figyelmesen. \\nEl kell fogadnia, ha hibajelentést szeretne küldeni.</string>\n    <string name=\"crash_the_app\">Alkalmazás összeomlasztása</string>\n    <string name=\"show_memory_leaks\">Memóriaszivárgások megjelenítése</string>\n    <string name=\"enable_leak_canary_summary\">A memóriaszivárgás-monitorozás az alkalmazás megállását okozhatja, amíg a dinamikus memória mentése folyik</string>\n    <string name=\"playlist_no_uploader\">Automatikusan létrehozott (feltöltő nem található)</string>\n    <string name=\"title_activity_play_queue\">Lejátszási sor</string>\n    <string name=\"conferences\">Konferenciák</string>\n    <string name=\"most_liked\">Legkedveltebb</string>\n    <string name=\"main_page_content_summary\">Mely oldalak jelennek meg a főoldalon</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s hallgató</item>\n        <item quantity=\"other\">%s hallgató</item>\n    </plurals>\n    <string name=\"no_one_listening\">Senki sem hallgatja</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s néző</item>\n        <item quantity=\"other\">%s néző</item>\n    </plurals>\n    <string name=\"no_one_watching\">Senki sem nézi</string>\n    <string name=\"subscribers_count_not_available\">A feliratkozók száma nem érhető el</string>\n    <string name=\"local\">Helyi</string>\n    <string name=\"error_unable_to_load_comments\">A megjegyzések betöltése sikertelen</string>\n    <string name=\"select_a_playlist\">Válasszon egy lejátszási listát</string>\n    <string name=\"autoplay_summary\">Lejátszás automatikus indítása — %s</string>\n    <string name=\"playback_speed_control\">Lejátszás sebességének beállítása</string>\n    <string name=\"clear_queue_confirmation_summary\">Az egyik lejátszóról a másikra váltás törölheti a lejátszási sort</string>\n    <string name=\"wifi_only\">Csak Wi-Fi-hálózaton</string>\n    <string name=\"downloads_storage_use_saf_title\">Rendszermappa-választó (SAF) használata</string>\n    <string name=\"downloads_storage_use_saf_summary\">A „Storage Access Framework” lehetővé teszi a letöltések külső SD-kártyára történő mentését</string>\n    <string name=\"permission_denied\">A rendszer megtagadta a műveletet</string>\n    <string name=\"never\">Soha</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Feliratkozások kiválasztása</string>\n    <string name=\"copyright\">© %1$s %2$s, %3$s licenc alatt</string>\n    <string name=\"title_licenses\">Harmadik féltől származó licencek</string>\n    <string name=\"done\">Kész</string>\n    <string name=\"no_comments\">Nincsenek hozzászólások</string>\n    <string name=\"infinite_videos\">∞ videó</string>\n    <string name=\"more_than_100_videos\">100+ videó</string>\n    <string name=\"error_report_open_issue_button_text\">Jelentés a GitHubon</string>\n    <string name=\"restore_defaults\">Alapértelmezések visszaállítása</string>\n    <string name=\"clear_cookie_summary\">Sütik törlése, amelyeket a NewPipe akkor ment, amikor megold egy reCAPTCHA-t</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA sütik törölve</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA sütik törlése</string>\n    <string name=\"artists\">Előadók</string>\n    <string name=\"albums\">Albumok</string>\n    <string name=\"songs\">Dalok</string>\n    <string name=\"events\">Események</string>\n    <string name=\"videos_string\">Videók</string>\n    <string name=\"restricted_video\">Ez a videó korhatáros.\n\\n\n\\nEngedélyezze a(z) „%1$s” beállítást, ha meg szeretné tekinteni.</string>\n    <string name=\"show_age_restricted_content_summary\">Gyermekek számára esetlegesen nem megfelelő, korhatáros tartalom megjelenítése (például 18+)</string>\n    <string name=\"peertube_instance_add_https_only\">Csak a HTTPS webcímek támogatottak</string>\n    <string name=\"show_meta_info_title\">Metainformációk megjelenítése</string>\n    <string name=\"clear_queue_confirmation_description\">A jelenleg aktív lejátszási sor le lesz cserélve</string>\n    <string name=\"clear_queue_confirmation_title\">Megerősítés kérése a lejátszási sor törlése előtt</string>\n    <string name=\"night_theme_title\">Éjszakai téma</string>\n    <string name=\"updates_setting_description\">Frissítési értesítés megjelenítése, amikor egy új verzió érhető el</string>\n    <string name=\"updates_setting_title\">Frissítések</string>\n    <string name=\"notification_colorize_summary\">Az Android igazítsa az értesítés színét a bélyegkép meghatározó színéhez (nem minden eszközön érhető el)</string>\n    <string name=\"notification_actions_at_most_three\">Legfeljebb három művelet jeleníthető meg a kompakt értesítésben!</string>\n    <string name=\"notification_actions_summary\">Koppintással szerkesztheti az egyes értesítéseken megjelenő műveleteket. Válasszon ki legfeljebb hármat a jobb oldali jelölőnégyzetekkel, amelyek a kompakt értesítéseken is megjelennek.</string>\n    <string name=\"notification_action_4_title\">Ötödik műveletgomb</string>\n    <string name=\"notification_action_3_title\">Negyedik műveletgomb</string>\n    <string name=\"notification_action_2_title\">Harmadik műveletgomb</string>\n    <string name=\"notification_action_1_title\">Második műveletgomb</string>\n    <string name=\"notification_action_0_title\">Első műveletgomb</string>\n    <string name=\"app_language_title\">Alkalmazás nyelve</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d másodperc</item>\n        <item quantity=\"other\">%d másodperc</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d perc</item>\n        <item quantity=\"other\">%d perc</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d óra</item>\n        <item quantity=\"other\">%d óra</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d nap</item>\n        <item quantity=\"other\">%d nap</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Nem lett feliratkozás kiválasztva</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d kiválasztva</item>\n        <item quantity=\"other\">%d kiválasztva</item>\n    </plurals>\n    <string name=\"feed_create_new_group_button_title\">Új</string>\n    <string name=\"content_not_supported\">Ezt a tartalmat még nem támogatja a NewPipe.\n\\n\n\\nRemélhetőleg egy következő verzióban már támogatott lesz.</string>\n    <string name=\"no_app_to_open_intent\">Az eszközön nincs olyan alkalmazás, amely meg tudja ezt nyitni</string>\n    <string name=\"youtube_music_premium_content\">Ez a videó csak YouTube Music Prémium előfizetők számára érhető el, így nem tekinthető meg és nem tölthető le a NewPipe-pal.</string>\n    <string name=\"auto_device_theme_title\">Automatikus (rendszertéma)</string>\n    <string name=\"paid_content\">Ez a tartalom csak előfizetőknek érhető el, nem tekinthető meg és nem tölthető le a NewPipe-pal.</string>\n    <string name=\"georestricted_content\">Ez a tartalom nem érhető el az országában.</string>\n    <string name=\"private_content\">Ez a tartalom privát, így nem tekinthető meg és nem tölthető le a NewPipe-pal.</string>\n    <string name=\"download_has_started\">A letöltés elkezdődött</string>\n    <string name=\"notification_scale_to_square_image_summary\">Az értesítésben megjelenő bélyegkép levágása 16:9-es helyett 1:1-es képarányra</string>\n    <string name=\"chapters\">Fejezetek</string>\n    <string name=\"show_thumbnail_title\">Bélyegkép megjelenítése</string>\n    <string name=\"start_here_on_popup\">Lejátszás indítása felugró ablakban</string>\n    <string name=\"start_here_on_background\">Lejátszás indítása a háttérben</string>\n    <string name=\"enqueued\">Sorba állítva</string>\n    <string name=\"enqueue_stream\">Sorba állítás</string>\n    <string name=\"saved_tabs_invalid_json\">Nem sikerült a mentett lapok olvasása, alapértelmezettek használata</string>\n    <string name=\"hash_channel_description\">Értesítések a videók ujjlenyomatkészítési folyamatához</string>\n    <string name=\"hash_channel_name\">Videó ujjlenyomat-készítési értesítése</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">A YouTube biztosít egy „Korlátozott módot”, amely elrejti a lehetséges felnőtteknek szóló tartalmat</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">A YouTube „Korlátozott mód” bekapcsolása</string>\n    <string name=\"peertube_instance_add_exists\">A példány már létezik</string>\n    <string name=\"peertube_instance_add_fail\">A példány érvényesítése sikertelen</string>\n    <string name=\"peertube_instance_add_help\">Adja meg a példány webcímét</string>\n    <string name=\"peertube_instance_add_title\">Példány hozzáadása</string>\n    <string name=\"peertube_instance_url_help\">Találjon Önnek tetsző példányokat itt: %s</string>\n    <string name=\"peertube_instance_url_summary\">Válassza ki a kedvenc PeerTube példányait</string>\n    <string name=\"peertube_instance_url_title\">PeerTube példányok</string>\n    <string name=\"enable_disposed_exceptions_title\">Életciklusából kifutott hibák jelentése</string>\n    <string name=\"preferred_open_action_settings_title\">Előnyben részesített „megnyitási” művelet</string>\n    <string name=\"drawer_close\">Fiók bezárása</string>\n    <string name=\"drawer_open\">Fiók megnyitása</string>\n    <string name=\"show_channel_details\">Csatorna részleteinek megjelenítése</string>\n    <string name=\"hold_to_append\">Tartsa a sorba állításhoz</string>\n    <string name=\"default_kiosk_page_summary\">Alapértelmezett témagyűjtemény</string>\n    <string name=\"app_license\">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.</string>\n    <string name=\"recaptcha_solve\">Megoldás</string>\n    <string name=\"subtitle_activity_recaptcha\">Nyomja meg a „Kész” gombot, ha megoldotta</string>\n    <string name=\"msg_calculating_hash\">Ujjlenyomat számítása</string>\n    <string name=\"related_items_tab_description\">Kapcsolódó elemek</string>\n    <string name=\"error_report_open_github_notice\">Ellenőrizze, hogy létezik-e már hibajegy a leírt összeomlással kapcsolatban. Az ismétlődő hibajegyek létrehozása feleslegesen elvonja az erőforrásokat a hiba tényleges javításától.</string>\n    <string name=\"minimize_on_exit_title\">Minimalizálás alkalmazásváltáskor</string>\n    <string name=\"local_search_suggestions\">Helyi keresési javaslatok</string>\n    <string name=\"remote_search_suggestions\">Távoli keresési javaslatok</string>\n    <string name=\"start_main_player_fullscreen_title\">A fő lejátszó teljes képernyős indítása</string>\n    <string name=\"start_main_player_fullscreen_summary\">A videókat ne a kis lejátszóban indítsa el, hanem kapcsolja be a teljes képernyős módot, ha az automatikus forgatás zárolva van. Továbbra is elérheti a kis lejátszót, ha kilép a teljes képernyőből</string>\n    <string name=\"drawer_header_description\">Szolgáltatás be/ki, jelenleg kiválasztott:</string>\n    <string name=\"comments_are_disabled\">A hozzászólások ki vannak kapcsolva</string>\n    <string name=\"main_page_content_swipe_remove\">Húzza oldalra az elemeket az eltávolításukhoz</string>\n    <string name=\"enqueue_next_stream\">A következő sorba állítása</string>\n    <string name=\"enqueued_next\">A következő sorba állítva</string>\n    <string name=\"processing_may_take_a_moment\">Feldolgozás… Ez eltarthat egy ideig</string>\n    <string name=\"enable_disposed_exceptions_summary\">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</string>\n    <string name=\"show_original_time_ago_title\">Eredeti „ennyi ideje” megjelenítése az elemeken</string>\n    <string name=\"disable_media_tunneling_summary\">Tiltsa le a médiacsatornázást, ha fekete képernyőt vagy akadozást tapasztal videólejátszáskor.</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Minden letöltésnél meg fogja kérdezni, hogy hova mentse el</string>\n    <string name=\"choose_instance_prompt\">Válasszon egy példányt</string>\n    <string name=\"feed_oldest_subscription_update\">Hírfolyam utoljára frissítve: %s</string>\n    <string name=\"feed_notification_loading\">Hírfolyam betöltése…</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Csak a nem csoportosított feliratkozások megjelenítése</string>\n    <string name=\"settings_category_feed_title\">Hírfolyam</string>\n    <string name=\"feed_update_threshold_title\">Hírfolyam frissítési küszöb</string>\n    <string name=\"feed_update_threshold_summary\">A legutóbbi frissítés óta eltelt idő, ami után a feliratkozás elavultnak számít – %s</string>\n    <string name=\"feed_load_error_terminated\">A szerző fiókját eltávolították. \\nA NewPipe nem fogja tudni betölteni ezt a hírfolyamot a jövőben. \\nLeiratkozik erről a csatornáról?</string>\n    <string name=\"feed_load_error_fast_unknown\">A gyors hírfolyammód nem szolgáltat több információt.</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Lekérés egy dedikált hírfolyamból, ha lehetséges</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Gyors mód engedélyezése</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Úgy gondolja, hogy a hírfolyam betöltése lassú? Ha így van, akkor próbálja engedélyezni a gyors betöltést (ezt a beállításokban változtathatja meg, vagy a lenti gomb megnyomásával). \\n \\nA NewPipe két hírfolyam betöltési stratégiát kínál: \\n• A teljes feliratkozott csatorna lekérése, amely lassú, de teljes. \\n• Egy dedikált szolgáltatási végpont, amely gyors, de általában nem teljes. \\n \\nA különbség a kettő között az, hogy a gyorsból általában hiányoznak egyes információk, mint az elem hossza vagy a típusa (nem lehet megkülönböztetni az élő videókat a normálaktól), valamint kevesebb elemet adhat vissza. \\n \\nA YouTube például egy olyan szolgáltatás, amely ezt a gyors módot RSS hírcsatornával kínálja. \\n \\nÍgy a választása azon múlik, hogy melyiket tartja fontosabbnak: a sebességet vagy a pontos információkat.</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Csatorna profilképének bélyegképe</string>\n    <string name=\"recent\">Legutóbbi</string>\n    <string name=\"featured\">Kiemelt</string>\n    <string name=\"description_select_note\">Most már kijelölheti a leírásban lévő szöveg. Vegye figyelembe, hogy kijelölési módban az oldal villoghat, és a hivatkozások nem biztos, hogy kattinthatók lesznek.</string>\n    <string name=\"description_select_disable\">Szöveg kijelölésének letiltása a leírásban</string>\n    <string name=\"metadata_licence\">Licenc</string>\n    <string name=\"metadata_age_limit\">Korhatár</string>\n    <string name=\"metadata_host\">Kiszolgáló</string>\n    <string name=\"metadata_privacy_public\">Nyilvános</string>\n    <string name=\"metadata_privacy_unlisted\">Nem listázott</string>\n    <string name=\"off\">Ki</string>\n    <string name=\"no_appropriate_file_manager_message\">Nem található megfelelő fájlkezelő ehhez a művelethez.\n\\nTelepítsen egy fájlkezelőt, vagy próbálja meg letiltani a következőt a letöltési beállításokban: „%s”</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Letöltés befejezve</item>\n        <item quantity=\"other\">%s letöltés befejezve</item>\n    </plurals>\n    <string name=\"feed_processing_message\">Hírfolyam feldolgozása…</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"account_terminated\">Fiók eltávolítva</string>\n    <string name=\"mark_as_watched\">Megjelölés megtekintettként</string>\n    <string name=\"no_dir_yet\">Még nincs letöltési mappa beállítva, válassza ki az alapértelmezett letöltési mappát most</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Tekerősáv bélyegkép-előnézete</string>\n    <string name=\"high_quality_larger\">Magas minőségű (nagyobb)</string>\n    <string name=\"feed_load_error\">Hiba a hírfolyam betöltésekor</string>\n    <string name=\"metadata_language\">Nyelv</string>\n    <string name=\"metadata_support\">Támogatás</string>\n    <string name=\"open_website_license\">Weboldal megnyitása</string>\n    <string name=\"tablet_mode_title\">Táblagép mód</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Az Android 10-től kezdve, csak a „Storage Access Framework” támogatott</string>\n    <string name=\"feed_new_items\">Új hírfolyamelemek</string>\n    <string name=\"metadata_privacy_private\">Privát</string>\n    <string name=\"metadata_privacy_internal\">Belső</string>\n    <string name=\"detail_heart_img_view_description\">Készítő által szívecskézve</string>\n    <string name=\"on\">Be</string>\n    <string name=\"feed_load_error_account_info\">A(z) „%s” hírfolyam nem tölthető be.</string>\n    <string name=\"soundcloud_go_plus_content\">Ez egy SoundCloud Go+ szám, legalábbis az Ön országában, így nem játszható le vagy tölthető le a NewPipe-pal.</string>\n    <string name=\"show_meta_info_summary\">Kapcsolja ki, hogy elrejtse a metainformációs dobozokat, melyek további információkat tartalmaznak a közvetítés létrehozójáról, annak tartalmáról vagy egy keresési kérésről</string>\n    <string name=\"error_report_channel_name\">Hibajelentési értesítés</string>\n    <string name=\"error_report_channel_description\">Értesítések a hibák jelentéséhez</string>\n    <string name=\"error_report_notification_title\">A NewPipe hibát észlelt, koppintson a jelentéséhez</string>\n    <string name=\"error_report_notification_toast\">Hiba történt, lásd az értesítést</string>\n    <string name=\"disable_media_tunneling_title\">Médiacsatornázás letiltása</string>\n    <string name=\"show_error_snackbar\">Hiba üzenetsávjának megjelenítése</string>\n    <string name=\"create_error_notification\">Hibaértesítés létrehozása</string>\n    <string name=\"manual_update_description\">Új verziók kézi keresése</string>\n    <string name=\"low_quality_smaller\">Alacsony minőségű (kisebb)</string>\n    <string name=\"checking_updates_toast\">Frissítések keresése…</string>\n    <string name=\"video_detail_by\">Készítette: %s</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Nem található megfelelő fájlkezelő ehhez a művelethez.\n\\nTelepítsen egy olyan fájlkezelőt, amely kompatibilis a Storage Access Frameworkkel</string>\n    <string name=\"description_select_enable\">Szöveg kijelölésének engedélyezése a leírásban</string>\n    <string name=\"metadata_category\">Kategória</string>\n    <string name=\"metadata_tags\">Címkék</string>\n    <string name=\"metadata_privacy\">Adatvédelem</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Gyors mód letiltása</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Távolítsa el a részben megtekintett közvetítéseket</string>\n    <string name=\"remove_watched_popup_warning\">A lejátszási listához való hozzáadás előtt és után megtekintett közvetítések el lesznek távolítva.\\nBiztos benne?</string>\n    <string name=\"show_original_time_ago_summary\">A szolgáltatásokból származó eredeti szövegek láthatók lesznek a közvetítési elemeken</string>\n    <string name=\"crash_the_player\">Lejátszó összeomlasztása</string>\n    <string name=\"show_crash_the_player_title\">A „Lejátszó összeomlasztása” lehetőség megjelenítése</string>\n    <string name=\"show_crash_the_player_summary\">Megjeleníti az összeomlasztási lehetőséget a lejátszó használatakor</string>\n    <string name=\"unhook_checkbox\">Hangmagasság megtartása (torzítást okozhat)</string>\n    <string name=\"check_for_updates\">Frissítések keresése</string>\n    <string name=\"dont_show\">Ne jelenítse meg</string>\n    <string name=\"remove_watched\">Megtekintettek eltávolítása</string>\n    <string name=\"remove_watched_popup_title\">Eltávolítja a megtekintett közvetítéseket?</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s letöltés törölve</item>\n        <item quantity=\"other\">%1$s letöltés törölve</item>\n    </plurals>\n    <string name=\"detail_pinned_comment_view_description\">Kitűzött hozzászólás</string>\n    <string name=\"leak_canary_not_available\">LeakCanary nem elérhető</string>\n    <string name=\"settings_category_player_notification_title\">Lejátszási értesítés</string>\n    <string name=\"progressive_load_interval_summary\">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.</string>\n    <string name=\"settings_category_player_notification_summary\">Jelenleg játszott közvetítés értesítésének testreszabása</string>\n    <string name=\"notifications\">Értesítések</string>\n    <string name=\"streams_notification_channel_name\">Új élő közvetítések</string>\n    <string name=\"streams_notification_channel_description\">Értesítések új élő közvetítésekről a feliratkozott csatornák esetén</string>\n    <string name=\"loading_stream_details\">Közvetítés részleteinek betöltése.…</string>\n    <string name=\"check_new_streams\">Keressen új élő közvetítést</string>\n    <string name=\"enable_streams_notifications_title\">Új közvetítések értesítései</string>\n    <string name=\"enable_streams_notifications_summary\">Értesítésen új élő közvetítés esetén a feliratkozott csatornákhoz</string>\n    <string name=\"streams_notifications_interval_title\">Ellenőrzési gyakoriság</string>\n    <string name=\"streams_notifications_network_title\">Szükséges hálózati kapcsolat</string>\n    <string name=\"any_network\">Bármilyen hálózat</string>\n    <string name=\"delete_downloaded_files_confirm\">Törli az összes letöltött fájlt a lemezről\\?</string>\n    <string name=\"get_notified\">Értesítsen</string>\n    <string name=\"notifications_disabled\">Az értesítések le vannak tiltva</string>\n    <string name=\"progressive_load_interval_title\">Lejátszás betöltési intervallumának mérete</string>\n    <string name=\"percent\">Százaléka</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s új elő közvetítés</item>\n        <item quantity=\"other\">%s új elő közvetítés</item>\n    </plurals>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer alapértelmezett</string>\n    <string name=\"you_successfully_subscribed\">Feliratkozott erre a csatornára</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"streams_not_yet_supported_removed\">Azok az élő adások melyek nem támogatottak a letöltő által, rejtve vannak</string>\n    <string name=\"selected_stream_external_player_not_supported\">A választott élő adást nem lehet külső lejátszóval lejátszani</string>\n    <string name=\"toggle_all\">Összes be/ki</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Külső lejátszók számára nem érhető el hangfolyam</string>\n    <string name=\"no_video_streams_available_for_external_players\">Külső lejátszók számára nem érhető el videófolyamok</string>\n    <string name=\"select_quality_external_players\">Válasszon minőséget a külső lejátszókhoz</string>\n    <string name=\"unknown_format\">Ismeretlen formátum</string>\n    <string name=\"unknown_quality\">Ismeretlen minőség</string>\n    <string name=\"semitone\">Félhang</string>\n    <string name=\"faq_title\">Gyakran ismételt kérdések</string>\n    <string name=\"faq\">Megtekintés a weboldalon</string>\n    <string name=\"sort\">Rendezés</string>\n    <string name=\"faq_description\">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!</string>\n    <string name=\"fast_mode\">Gyors mód</string>\n    <string name=\"import_subscriptions_hint\">Feliratkozások importálása vagy exportálása a 3 pontos menüből</string>\n    <string name=\"app_update_unavailable_toast\">Ön a Newpipe legfrissebb verzióját futtatja</string>\n    <string name=\"app_update_available_notification_text\">Nyomjon a %s letöltéséhez</string>\n    <string name=\"left_gesture_control_title\">Bal gesztus művelete</string>\n    <string name=\"right_gesture_control_title\">Jobb gesztus művelete</string>\n    <string name=\"brightness\">Fényerő</string>\n    <string name=\"volume\">Hangerő</string>\n    <string name=\"none\">Egyik sem</string>\n    <string name=\"duplicate_in_playlist\">A kiszürkített lejátszólisták már tartalmazzák ezt az elemet.</string>\n    <string name=\"unset_playlist_thumbnail\">Állandó bélyegkép feloldása</string>\n    <string name=\"remove_duplicates\">Ismétlődések eltávolítása</string>\n    <string name=\"feed_show_watched\">Teljesen megtekintett</string>\n    <string name=\"feed_show_partially_watched\">Részben megtekintett</string>\n    <string name=\"card\">Kártya</string>\n    <string name=\"night_theme_available\">Ez a beállítás csak a(z) %s téma esetén érhető el</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Hardveres médialejátszó gombok eseményeinek figyelmen kívül hagyása</string>\n    <string name=\"feed_hide_streams_title\">A következő közvetítések megjelenítése</string>\n    <string name=\"prefer_original_audio_summary\">Az eredeti hangsáv választása, a nyelvtől függetlenül</string>\n    <string name=\"prefer_descriptive_audio_summary\">A látássérülteknek szóló leírást tartalmazó hangsáv választása, ha van ilyen</string>\n    <string name=\"left_gesture_control_summary\">Válasszon gesztust a lejátszóképernyő bal feléhez</string>\n    <string name=\"msg_failed_to_copy\">Nem sikerült a vágólapra másolás</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Ismételt elem %d alkalommal hozzáadva</string>\n    <string name=\"feed_show_hide_streams\">Közvetítések be/ki</string>\n    <string name=\"audio_track_present_in_video\">Egy hangsáv már jelen van ebben a közvetítésben</string>\n    <string name=\"select_audio_track_external_players\">Hangsáv kiválasztása a külső lejátszók számára</string>\n    <string name=\"unknown_audio_track\">Ismeretlen</string>\n    <string name=\"feed_show_upcoming\">Közelgő</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer beállítások</string>\n    <string name=\"settings_category_exoplayer_summary\">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.</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Az ExoPlayer dekódoló tartalék funkciójának használata</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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.</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Kerülőmegoldás: mindig az ExoPlayer videokimeneti felületének használata</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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 abban az esetben, ha átváltja a jelenlegi videolejátszót, vagy teljes képernyőre vált</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_dubbed\">szinkronizált</string>\n    <string name=\"audio_track_type_descriptive\">leíró</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Hasznos, ha olyan fülhallgatót használ, melyen meghibásodtak a fizikai gombok</string>\n    <string name=\"prefer_original_audio_title\">Eredeti hang előnyben részesítése</string>\n    <string name=\"prefer_descriptive_audio_title\">Leíró hanganyag előnyben részesítése</string>\n    <string name=\"right_gesture_control_summary\">Válasszon gesztust a lejátszóképernyő jobb feléhez</string>\n    <string name=\"play_queue_audio_track\">Hang: %s</string>\n    <string name=\"audio_track\">Hangsáv</string>\n    <string name=\"remove_duplicates_title\">Eltávolítja az ismétlődéseket\\?</string>\n    <string name=\"remove_duplicates_message\">Eltávolítja az összes ismétlődő közvetítést ebből a lejátszólistáról\\?</string>\n    <string name=\"audio_track_type_original\">eredeti</string>\n    <string name=\"main_tabs_position_title\">Kezdőlap pozíciója</string>\n    <string name=\"disable_media_tunneling_automatic_info\">A médiacsatornázás alapértelmezetten le van tiltva az eszközén, mivel a saját eszközmodellje nem támogatja azt.</string>\n    <string name=\"main_tabs_position_summary\">Kezdőlapválasztó alulra helyezése</string>\n    <string name=\"no_live_streams\">Nincs élő közvetítés</string>\n    <string name=\"no_streams\">Nincs adatfolyam</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"feed_fetch_channel_tabs\">Csatornalapok lekérése</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">A hírfolyam frissítésekor lekérendő lapok. Ennek a beállításnak nincs hatása, ha egy csatorna frissítése gyors módban történik.</string>\n    <string name=\"metadata_thumbnails\">Miniatűrök</string>\n    <string name=\"metadata_uploader_avatars\">Feltöltő profilképei</string>\n    <string name=\"metadata_subchannel_avatars\">Alcsatorna profilképei</string>\n    <string name=\"metadata_avatars\">Profilképek</string>\n    <string name=\"metadata_banners\">Borítóképek</string>\n    <string name=\"metadata_subscribers\">Feliratkozók</string>\n    <string name=\"channel_tab_channels\">Csatornák</string>\n    <string name=\"channel_tab_playlists\">Lejátszási listák</string>\n    <string name=\"channel_tab_albums\">Albumok</string>\n    <string name=\"channel_tab_about\">Névjegy</string>\n    <string name=\"show_channel_tabs\">Csatorna fülek</string>\n    <string name=\"show_channel_tabs_summary\">Milyen lapok jelennek meg a csatornaoldalakon</string>\n    <string name=\"open_play_queue\">Lejátszási sor megnyitása</string>\n    <string name=\"toggle_screen_orientation\">Képernyő tájolás be/ki</string>\n    <string name=\"toggle_fullscreen\">Teljes képernyő be/ki</string>\n    <string name=\"next_stream\">Következő közvetítés</string>\n    <string name=\"previous_stream\">Előző közvetítés</string>\n    <string name=\"play\">Lejátszás</string>\n    <string name=\"replay\">Visszajátszás</string>\n    <string name=\"more_options\">További lehetőségek</string>\n    <string name=\"duration\">Időtartam</string>\n    <string name=\"rewind\">Visszatekerés</string>\n    <string name=\"forward\">Előre</string>\n    <string name=\"image_quality_title\">Képminőség</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"image_quality_none\">Ne töltsön be képeket</string>\n    <string name=\"image_quality_low\">Alacsony minőség</string>\n    <string name=\"image_quality_medium\">Közepes minőség</string>\n    <string name=\"image_quality_high\">Magas minőségű</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist\">Lejátszási lista megosztása</string>\n    <string name=\"share_playlist_with_titles\">Megosztás címekkel</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s válasz</item>\n        <item quantity=\"other\">%s válasz</item>\n    </plurals>\n    <string name=\"show_more\">Továbbiak</string>\n    <string name=\"show_less\">Mutass kevesebbet</string>\n    <string name=\"loading_metadata_title\">Metaadatok betöltése…</string>\n    <string name=\"share_playlist_with_list\">Webcímlista megosztása</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"channel_tab_videos\">Videók</string>\n    <string name=\"channel_tab_tracks\">Zeneszámok</string>\n    <string name=\"channel_tab_shorts\">Rövidek</string>\n    <string name=\"channel_tab_livestreams\">Élő</string>\n    <string name=\"error_insufficient_storage\">Nincs elég szabad hely az eszközön</string>\n    <string name=\"yes\">Igen</string>\n    <string name=\"no\">Nem</string>\n    <string name=\"settings_category_backup_restore_title\">Biztonsági mentés és helyreállítás</string>\n    <string name=\"auto_update_check_description\">A NewPipe időről időre automatikusan ellenőrzi az új verziókat, és értesít, amint azok elérhetővé válnak.\n\\nSzeretné engedélyezni ezt?</string>\n    <string name=\"reset_settings_title\">Beállítások alaphelyzetbe állítása</string>\n    <string name=\"reset_settings_summary\">Minden beállítás visszaállítása alapértelmezett értékre</string>\n    <string name=\"reset_all_settings\">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\\n\n\\nBiztosan folytatja?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">másodlagos</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Megosztás YouTube ideiglenes lejátszási listaként</string>\n    <string name=\"tab_bookmarks_short\">Lejátszási listák</string>\n    <string name=\"select_a_feed_group\">Válasszon ki egy hírfolyamcsoportot</string>\n    <string name=\"no_feed_group_created_yet\">Még nincs létrehozott hírfolyamcsoport</string>\n    <string name=\"feed_group_page_summary\">Csatornacsoport-oldal</string>\n    <string name=\"search_with_service_name\">Keresés %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Keresés %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Kedvelések</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud Top 50 oldal eltávolítva</string>\n    <string name=\"migration_info_6_7_message\">A SoundCloud megszüntette az eredeti Top 50-es listákat. A megfelelő lap el lett távolítva a főoldalról.</string>\n    <string name=\"migration_info_7_8_title\">YouTube „felkapott lapok” eltávolítva</string>\n    <string name=\"migration_info_7_8_message\">A YouTube 2025. július 21-től megszüntette a „felkapott” oldalt. A NewPipe a korábbi alapértelmezett „felkapott” oldalt felkapott élő közvetítésekkel helyettesítette.\\n\\nA „Beállítások &gt; Tartalom &gt; Főoldal tartalma” menüpontban különböző felkapott lapokat is kiválaszthat.</string>\n    <string name=\"trending_gaming\">Felkapott játékok</string>\n    <string name=\"trending_podcasts\">Felkapott podcastok</string>\n    <string name=\"trending_movies\">Felkapott filmek és sorozatok</string>\n    <string name=\"trending_music\">Felkapott zenék</string>\n    <string name=\"short_thousand\">%se</string>\n    <string name=\"short_million\">%sm</string>\n    <string name=\"short_billion\">%sM</string>\n    <string name=\"permission_display_over_apps_message\">A felugró ablakos lejátszó használatához válassza ki a(z) %1$s elemet a következő Android beállítások menüben, és engedélyezze a(z) %2$s elemet.</string>\n    <string name=\"permission_display_over_apps_permission_name\">„Megjelenítés a többi alkalmazás fölött” engedélyezése</string>\n    <string name=\"delete_file\">Fájl törlése</string>\n    <string name=\"delete_entry\">Bejegyzés törlése</string>\n    <string name=\"entry_deleted\">Bejegyzés törölve</string>\n    <string name=\"account_terminated_service_provides_reason\">Fiók megszüntetve\\n\\n%1$s az alábbi ok miatt: %2$s</string>\n    <string name=\"player_http_403\">A lejátszás közben a kiszolgáló 403-as HTTP-hibát adott vissza, valószínűleg a közvetítési hivatkozás érvényessége lejárt vagy a IP-tiltás miatt</string>\n    <string name=\"player_http_invalid_status\">HTTP-hiba (%1$s) érkezett a kiszolgálótól a lejátszás során</string>\n    <string name=\"youtube_player_http_403\">HTTP 403-as hiba érkezett a kiszolgálótól a lejátszás közben, valószínűleg IP-tiltás vagy a közvetítési hivatkozás feloldási problémák miatt</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s visszautasította az adatok szolgáltatását, és bejelentkezést kér annak megerősítésére, hogy a kérés nem robot által érkezik.\\n\\nElőfordulhat, hogy az IP-címét ideiglenesen letiltotta %1$s, várhat egy keveset, vagy váltson egy másik IP-címre (például VPN be-/kikapcsolásával, vagy Wi-Fi-ről mobiladat-forgalomra váltva).</string>\n    <string name=\"unsupported_content_in_country\">Ez a tartalom a jelenleg kiválasztott tartalom országában nem elérhető.\\n\\nVáltoztassa meg a „Beállítások &gt; Tartalom &gt;Tartalom alapértelmezett országa” menüpontban.</string>\n    <string name=\"kao_dialog_warning\">2025 augusztusában a Google bejelentette, hogy 2026 szeptemberétől az alkalmazások telepítéséhez fejlesztői ellenőrzésre lesz szükség a tanúsított eszközökön található összes Android-alkalmazáshoz, beleértve a Play Áruházon kívül telepített alkalmazásokat is. Mivel a NewPipe fejlesztői nem értenek egyet ezzel a követelménnyel, a NewPipe ezután nem fog működni a tanúsított Android-eszközökön.</string>\n    <string name=\"kao_dialog_more_info\">Részletek</string>\n    <string name=\"kao_solution\">Megoldás</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-hy/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Սեղմեք խոշորացույցը որ սկսեք</string>\n    <string name=\"search\">Որոնել</string>\n    <string name=\"downloads\">Բեռնված</string>\n    <string name=\"downloads_title\">Բեռնված</string>\n    <string name=\"settings\">Պարամետրեր</string>\n    <string name=\"share\">Կիսվել</string>\n    <string name=\"black_theme_title\">Սև</string>\n    <string name=\"theme_title\">Ոճ</string>\n    <string name=\"light_theme_title\">Բաց</string>\n    <string name=\"dark_theme_title\">Մուգ</string>\n    <string name=\"msg_wait\">Սպասեք…</string>\n    <string name=\"msg_error\">Սխալ</string>\n    <string name=\"msg_name\">ֆայլի անուն</string>\n    <string name=\"ok\">Լավ</string>\n    <string name=\"delete\">Ջնջել</string>\n    <string name=\"start\">Սկսել</string>\n    <string name=\"detail_likes_img_view_description\">Հավանումներ</string>\n    <string name=\"detail_dislikes_img_view_description\">Չեմ հավանում</string>\n    <string name=\"clear\">Մաքրել</string>\n    <string name=\"upload_date_text\">Հրապարակվել է %1$s</string>\n    <string name=\"install\">Տեղադրել</string>\n    <string name=\"cancel\">Չեղարկել</string>\n    <string name=\"open_in_browser\">Բացել բրաուզերում</string>\n    <string name=\"download_path_audio_title\">Ձայնային բեռնման պանակ</string>\n    <string name=\"download_path_dialog_title\">Ընտրեք ներբեռնման թղթապանակը տեսաֆայլերի համար</string>\n    <string name=\"download_path_summary\">Ներբեռնված տեսաֆայլերը պահվում են այստեղ</string>\n    <string name=\"download_path_title\">Տեսանյութի ներբեռնման պանակ</string>\n    <string name=\"controls_add_to_playlist_title\">Ավելացնել</string>\n    <string name=\"controls_popup_title\">Թռուցիկ</string>\n    <string name=\"controls_background_title\">Ետին պլան</string>\n    <string name=\"tab_choose\">Ընտրեք ներդիր</string>\n    <string name=\"tab_bookmarks\">Էջանշված երգացանկեր</string>\n    <string name=\"tab_subscriptions\">Բաժանորդագրումներ</string>\n    <string name=\"show_info\">Ցուցադրել ինֆոն</string>\n    <string name=\"subscription_update_failed\">Հնարավոր չէ թարմացնել բաժանորդագրումը</string>\n    <string name=\"subscription_change_failed\">Հնարավոր չէ փոխել Բաժանորդագրումը</string>\n    <string name=\"channel_unsubscribed\">Չեղարկել բաժանորդագրման հեռացումը</string>\n    <string name=\"unsubscribe\">Ապաբաժանորդագրվել</string>\n    <string name=\"subscribe_button_title\">Բաժանորդագրվել</string>\n    <string name=\"use_external_video_player_summary\">Հառացնում է ձայնը որոշ լուծաչափերոկմ</string>\n    <string name=\"share_dialog_title\">Կիսվել</string>\n    <string name=\"controls_download_desc\">Բեռնել հոսքի նշքը</string>\n    <string name=\"open_in_popup_mode\">Բացել լողացող պատուհանում</string>\n    <string name=\"no_player_found_toast\">Նվագարկիչ չի գտնվել (դուք կարող եք լբեռնել VLC և դիտել)։</string>\n    <string name=\"no_player_found\">Նվագարկիչ չի գտնվել, ցանկանո՞ւմ եք բեռնել VLC։</string>\n    <string name=\"use_external_audio_player_title\">Օգտագործել արտաքին աուդիո նվագարկիչ</string>\n    <string name=\"use_external_video_player_title\">Օգտագործել արտաքին դերակատար</string>\n    <string name=\"updates_setting_title\">Թարմացումներ</string>\n    <string name=\"feed_update_threshold_option_always_update\">Միշտ թարմացնել</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d նշված</item>\n        <item quantity=\"other\">%d նշված</item>\n    </plurals>\n    <string name=\"feed_create_new_group_button_title\">Նոր</string>\n    <string name=\"website_title\">Կայք</string>\n    <string name=\"tab_about\">Մասին</string>\n    <string name=\"channels\">Ալիքներ</string>\n    <string name=\"all\">Ամենը</string>\n    <string name=\"settings_category_appearance_title\">Տեսք</string>\n    <string name=\"settings_category_updates_title\">Թարմացումներ</string>\n    <string name=\"enable_watch_history_title\">Դիտման պատմություն</string>\n    <string name=\"file_deleted\">Ֆայլը ջնջվեց</string>\n    <string name=\"file\">Ֆայլ</string>\n    <string name=\"songs\">Երգեր</string>\n    <string name=\"enable_search_history_title\">Որոնման պատմություն</string>\n    <string name=\"close\">Փակել</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d օր</item>\n        <item quantity=\"other\">%d օր</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d ժամ</item>\n        <item quantity=\"other\">%d ժամ</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d վրկ</item>\n        <item quantity=\"other\">%d վրկ</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d րոպե</item>\n        <item quantity=\"other\">%d րոպե</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">Ալիքների խմբեր</string>\n    <string name=\"app_update_available_notification_title\">NewPipe֊ի նոր թարմացում է հասանելի</string>\n    <string name=\"list\">Ցանկ</string>\n    <string name=\"never\">Երբեք</string>\n    <string name=\"minimize_on_exit_none_description\">Ոչինչ</string>\n    <string name=\"accept\">Համաձայնել</string>\n    <string name=\"decline\">Մերժել</string>\n    <string name=\"playback_step\">Քայլ</string>\n    <string name=\"playback_tempo\">Տեմպ</string>\n    <string name=\"download\">Բեռնել</string>\n    <string name=\"no_comments\">Կարծիքներ չկան</string>\n    <string name=\"name\">Վերնագիր</string>\n    <string name=\"rename_playlist\">Վերանվանել</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s տեսանյութ</item>\n        <item quantity=\"other\">%s տեսանյութ</item>\n    </plurals>\n    <string name=\"infinite_videos\">∞ տեսանյութեր</string>\n    <string name=\"more_than_100_videos\">100+ տեսանյութեր</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s դիտում է</item>\n        <item quantity=\"other\">%s դիտում են</item>\n    </plurals>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s դիտում</item>\n        <item quantity=\"other\">%s դիտում</item>\n    </plurals>\n    <string name=\"subscribed_button_title\">Բաժանորդագրված</string>\n    <string name=\"rename\">Վերանվանել</string>\n    <string name=\"create\">Ստեղծել</string>\n    <string name=\"download_failed\">Ներբեռնումը խափանվեց</string>\n    <string name=\"enqueue\">Հերթ</string>\n    <string name=\"missions_header_finished\">Ավարտված</string>\n    <string name=\"settings_category_feed_title\">Հոսք</string>\n    <string name=\"feed_group_dialog_empty_name\">Դատարկ խմբի անուն</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Նշիր բաժանորդագրումներ</string>\n    <string name=\"feed_notification_loading\">Բեռնում եմ հոսքը…</string>\n    <string name=\"fragment_feed_title\">Ինչ կա֊չկա</string>\n    <string name=\"remove_watched\">Հեռացնել դիտվածները</string>\n    <string name=\"settings_category_player_behavior_title\">Վարքագիծ</string>\n    <string name=\"video\">Տեսանյութ</string>\n    <string name=\"show_comments_title\">Տեսնել մեկնաբանությունները</string>\n    <string name=\"notification_channel_name\">NewPipe ծանուցում</string>\n    <string name=\"just_once\">Մեկ անգամ</string>\n    <string name=\"always\">Միշտ</string>\n    <string name=\"download_dialog_title\">Բեռնել</string>\n    <string name=\"enable_playback_state_lists_title\">Ցանկերում դիրքերը</string>\n    <string name=\"auto_queue_toggle\">Ինքնանվագարկում</string>\n    <string name=\"clear_views_history_title\">Մաքրել դիտման պատմությունը</string>\n    <string name=\"clear_download_history\">Մաքրել ներբեռնման պատմությունը</string>\n    <string name=\"play_audio\">Աուդիո</string>\n    <string name=\"mark_as_watched\">Նշել որպես դիտված</string>\n    <string name=\"notification_action_repeat\">Կրկնել</string>\n    <string name=\"settings_category_player_title\">Նվագարկիչ</string>\n    <string name=\"settings_category_history_title\">Պատմություն և քեշ</string>\n    <string name=\"night_theme_title\">Գիշերային ոճ</string>\n    <string name=\"stop\">Կանգ</string>\n    <string name=\"title_activity_history\">Պատմություն</string>\n    <string name=\"action_history\">Պատմություն</string>\n    <string name=\"trending\">Թրենդային</string>\n    <string name=\"playlists\">Նվագացանկեր</string>\n    <string name=\"unknown_content\">[Անհայտ]</string>\n    <string name=\"clear_search_history_title\">Մաքրել որոնման պատմությունը</string>\n    <string name=\"comments_are_disabled\">Մեկնաբանությունները անջատված են</string>\n    <string name=\"always_ask_open_action\">Միշտ հարցնել</string>\n    <string name=\"resize_fill\">Լցնել</string>\n    <string name=\"resize_zoom\">Մեծացնել</string>\n    <string name=\"caption_auto_generated\">Գեներացված</string>\n    <string name=\"import_file_title\">Ներմուծել ֆայլ</string>\n    <string name=\"check_for_updates\">Ստուգել թարմացումները</string>\n    <string name=\"auto\">Ինքնին</string>\n    <string name=\"high_quality_larger\">Բարձր որակ (մեծ)</string>\n    <string name=\"low_quality_smaller\">Ցածր որակ (փոքր)</string>\n    <string name=\"queued\">հերթագրված</string>\n    <string name=\"delete_downloaded_files\">Ջնջել ներբեռնված ֆայլերը</string>\n    <string name=\"start_downloads\">Սկսել ներբեռնումները</string>\n    <string name=\"users\">Օգտատերեր</string>\n    <string name=\"play_queue_remove\">Հեռացնել</string>\n    <string name=\"import_ongoing\">Ներմուծում եմ…</string>\n    <string name=\"metadata_age_limit\">Տարիքային սահմանափակում</string>\n    <string name=\"unknown_quality\">Անհայտ որակ</string>\n    <string name=\"play_with_kodi_title\">Նվագել Kodi֊ով</string>\n    <string name=\"mute\">Լռեցնել</string>\n    <string name=\"limit_data_usage_none_description\">Անսահման</string>\n    <string name=\"feed_subscription_not_loaded_count\">Չի բեռնվել՝ %d</string>\n    <string name=\"feed_oldest_subscription_update\">Թարմացվել է՝ %s</string>\n    <string name=\"download_has_started\">Ներբեռնումը սկսվեց</string>\n    <string name=\"radio\">Ռադիո</string>\n    <string name=\"notification_colorize_title\">Ներկել ծանուցումները</string>\n    <string name=\"comments_tab_description\">Մեկնաբանություններ</string>\n    <string name=\"top_50\">Թեժ 50</string>\n    <string name=\"show_description_title\">Տեսնել նկարագիրը</string>\n    <string name=\"show_search_suggestions_title\">Որոնման հուշումներ</string>\n    <string name=\"settings_category_clear_data_title\">Մաքրել տվյալները</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s լսող</item>\n        <item quantity=\"other\">%s լսող</item>\n    </plurals>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s հետևորդ</item>\n        <item quantity=\"other\">%s հետևորդ</item>\n    </plurals>\n    <string name=\"percent\">Տոկոս</string>\n    <string name=\"grid\">Աղյուսակ</string>\n    <string name=\"import_title\">Ներմուծել</string>\n    <string name=\"unmute\">Նվագել</string>\n    <string name=\"play_queue_stream_detail\">Մանրամասներ</string>\n    <string name=\"select_a_playlist\">Նշել նվագացանկ</string>\n    <string name=\"charset_letters_and_digits\">Տառեր և թվեր</string>\n    <string name=\"settings_category_downloads_title\">Բեռնումներ</string>\n    <string name=\"done\">Եղավ</string>\n    <string name=\"play_all\">Նվագել ամենը</string>\n    <string name=\"duration_live\">Ուղիղ</string>\n    <string name=\"enable_playback_resume_title\">Շարունակել նվագարկումը</string>\n    <string name=\"recaptcha_solve\">Լուծել</string>\n    <string name=\"select_a_channel\">Նշել ալիք</string>\n    <string name=\"dont_show\">Ցույց չտալ</string>\n    <string name=\"notification_action_shuffle\">Խառը</string>\n    <string name=\"resize_fit\">Հարմարվել</string>\n    <string name=\"app_language_title\">Ափփի լեզու</string>\n    <string name=\"notification_action_nothing\">Ոչինչ</string>\n    <string name=\"no_subscribers\">Առանց հետևորդ</string>\n    <string name=\"msg_threads\">Հոսքեր</string>\n    <string name=\"add_to_playlist\">Ավելացնել նվագացանկին</string>\n    <string name=\"caption_none\">Անենթագիր</string>\n    <string name=\"caption_setting_title\">Ենթագրեր</string>\n    <string name=\"disabled\">Անջատված</string>\n    <string name=\"description_tab_description\">Նկարագիր</string>\n    <string name=\"notifications\">Ծանուցումներ</string>\n    <string name=\"open_website_license\">Բացել կայքը</string>\n    <string name=\"chapters\">Գլուխներ</string>\n    <string name=\"metadata_privacy_public\">Հանրային</string>\n    <string name=\"metadata_tags\">Պիտակներ</string>\n    <string name=\"notifications_disabled\">Ծանուցումները անջատված են</string>\n    <string name=\"empty_list_subtitle\">Ոչինչ բացի դատարկությունից</string>\n    <string name=\"retry\">Կրկին փորձել</string>\n    <string name=\"feed_new_items\">Հոսքի նորերը</string>\n    <string name=\"metadata_language\">Լեզու</string>\n    <string name=\"open_with\">Բացել…</string>\n    <string name=\"metadata_licence\">Արտոնագիր</string>\n    <string name=\"unknown_format\">Անհյատ ֆորմատ</string>\n    <string name=\"channel_tab_playlists\">Նվագացանկեր</string>\n    <string name=\"image_quality_medium\">Միջին որակ</string>\n    <string name=\"sort\">Դասավորել</string>\n    <string name=\"detail_pinned_comment_view_description\">Գամված մեկնաբանություն</string>\n    <string name=\"account_terminated\">Հաշիվը կասեցված է</string>\n    <string name=\"channel_tab_about\">Մասին</string>\n    <string name=\"channel_tab_albums\">Ալբոմներ</string>\n    <string name=\"yes\">Այո</string>\n    <string name=\"no\">Ոչ</string>\n    <string name=\"show_less\">Պակաս</string>\n    <string name=\"show_more\">Ավելին</string>\n    <string name=\"image_quality_high\">Բարձր որակ</string>\n    <string name=\"image_quality_low\">Ցածր որակ</string>\n    <string name=\"image_quality_none\">Նկարները չներբեռնել</string>\n    <string name=\"image_quality_title\">Պատկերի որակ</string>\n    <string name=\"channel_tab_channels\">Ալիքներ</string>\n    <string name=\"channel_tab_livestreams\">Ուղիղ</string>\n    <string name=\"unknown_audio_track\">Անհայտ</string>\n    <string name=\"did_you_mean\">Նկատի ունե՞ս «%1$s»</string>\n    <string name=\"volume\">Բարձրություն</string>\n    <string name=\"kao_solution\">Լուծում</string>\n    <string name=\"kao_dialog_more_info\">Մանրամասներ</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s պատասխան</item>\n        <item quantity=\"other\">%s պատասխաններ</item>\n    </plurals>\n    <string name=\"share_playlist\">Կիսվել նվագացանկով</string>\n    <string name=\"forward\">Առաջ տանել</string>\n    <string name=\"play\">Նվագել</string>\n    <string name=\"duration\">Տևողություն</string>\n    <string name=\"rewind\">Հետ տանել</string>\n    <string name=\"open_play_queue\">Բացել նվագացանկը</string>\n    <string name=\"channel_tab_likes\">Հավանումներ</string>\n    <string name=\"channel_tab_shorts\">Կարճեր</string>\n    <string name=\"feed_show_partially_watched\">Մասնակի դիտված</string>\n    <string name=\"feed_show_watched\">Ամբողչովին դիտված</string>\n    <string name=\"on\">Միացված</string>\n    <string name=\"off\">Անջատված</string>\n    <string name=\"metadata_subscribers\">Բաժանորդագրվածներ</string>\n    <string name=\"metadata_privacy_internal\">Ներքին</string>\n    <string name=\"metadata_privacy_private\">Անձնական</string>\n    <string name=\"downloads_storage_ask_title\">Հարցնել որտեղ ներբեռնել</string>\n    <string name=\"any_network\">Կամայական ցանցով</string>\n    <string name=\"playlist_creation_success\">Նվագացանկը ստեղծվեց</string>\n    <string name=\"create_playlist\">Նոր նվագացանկ</string>\n    <string name=\"albums\">Ալբոմներ</string>\n    <string name=\"artists\">Արվեստագետներ</string>\n    <string name=\"donation_title\">Նվիրել</string>\n    <string name=\"dismiss\">Անտեսել</string>\n    <string name=\"short_thousand\">%sՀզր</string>\n    <string name=\"short_million\">%sՄլն</string>\n    <string name=\"short_billion\">%sԲլն</string>\n    <string name=\"error_snackbar_action\">Ազդարարել</string>\n    <string name=\"invalid_directory\">Այդպիսի պանակ չկա</string>\n    <string name=\"tab_bookmarks_short\">Նվագացանկեր</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ia/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"install\">Installar</string>\n    <string name=\"open_in_browser\">Aperir in le navigator</string>\n    <string name=\"share\">Compartir</string>\n    <string name=\"download\">Discargar</string>\n    <string name=\"search\">Cerca</string>\n    <string name=\"settings\">Configurationes</string>\n    <string name=\"share_dialog_title\">Compartir con</string>\n    <string name=\"subscribed_button_title\">Subscribite</string>\n    <string name=\"unsubscribe\">Cancellar le subscription</string>\n    <string name=\"subscription_change_failed\">Non poteva cambiar le subscription</string>\n    <string name=\"subscription_update_failed\">Non poteva actualisar le subscription</string>\n    <string name=\"show_info\">Monstrar information</string>\n    <string name=\"tab_subscriptions\">Subscriptiones</string>\n    <string name=\"tab_choose\">Seliger le scheda</string>\n    <string name=\"fragment_feed_title\">Novitates</string>\n    <string name=\"controls_background_title\">Fundo</string>\n    <string name=\"controls_popup_title\">Emergente</string>\n    <string name=\"controls_add_to_playlist_title\">Adder a</string>\n    <string name=\"download_path_title\">Dossier de discarga de video</string>\n    <string name=\"download_path_dialog_title\">Selige dossier de discarga pro files de video</string>\n    <string name=\"download_path_audio_title\">Dossier de discarga de audio</string>\n    <string name=\"cancel\">Cancellar</string>\n    <string name=\"subscribe_button_title\">Subscriber</string>\n    <string name=\"download_path_audio_dialog_title\">Selige dossier de discarga pro files de audio</string>\n    <string name=\"theme_title\">Thema</string>\n    <string name=\"show_comments_title\">Monstrar le commentos</string>\n    <string name=\"start_downloads\">Initiar discargas</string>\n    <string name=\"pause_downloads\">Pausar le discargas</string>\n    <string name=\"choose_instance_prompt\">Seliger un instantia</string>\n    <string name=\"error_connect_host\">Non pote connecter con le servitor</string>\n    <string name=\"upload_date_text\">Publicate le %1$s</string>\n    <string name=\"controls_download_desc\">Discargar le file de fluxo</string>\n    <string name=\"default_resolution_title\">Resolution predefinite</string>\n    <string name=\"default_popup_resolution_title\">Resolution predefinite del fenestra emergente</string>\n    <string name=\"show_higher_resolutions_title\">Monstrar resolutiones alte</string>\n    <string name=\"play_with_kodi_title\">Reproducer con Kodi</string>\n    <string name=\"show_play_with_kodi_title\">Monstrar option \\\"Reproducer con Kodi\\\"</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Formato de audio predefinite</string>\n    <string name=\"default_video_format_title\">Formato de video predefinite</string>\n    <string name=\"light_theme_title\">Clar</string>\n    <string name=\"dark_theme_title\">Obscur</string>\n    <string name=\"black_theme_title\">Nigro</string>\n    <string name=\"show_search_suggestions_title\">Suggestiones de cerca</string>\n    <string name=\"enable_search_history_title\">Chronologia de cerca</string>\n    <string name=\"enable_search_history_summary\">Immagazinar le cercas localmente</string>\n    <string name=\"enable_watch_history_title\">Chronologia de reproductiones</string>\n    <string name=\"enable_playback_resume_title\">Resumer le reproduction</string>\n    <string name=\"enable_playback_resume_summary\">Restaurar le ultime position del reproduction</string>\n    <string name=\"enable_playback_state_lists_title\">Positiones in le listas</string>\n    <string name=\"enable_playback_state_lists_summary\">Monstrar le indicatores de position in listas</string>\n    <string name=\"settings_category_clear_data_title\">Vacuar le datos</string>\n    <string name=\"enable_watch_history_summary\">Immagazinar un chronologia de videos observate</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Reprender le reproduction</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Continuar le reproduction post interruptiones</string>\n    <string name=\"download_dialog_title\">Discargar</string>\n    <string name=\"autoplay_title\">Reproduction automatic</string>\n    <string name=\"show_next_and_similar_title\">Monstrar le videos sequente e simile</string>\n    <string name=\"unsupported_url\">URL non supportate</string>\n    <string name=\"default_content_country_title\">Pais predefinite del contentos</string>\n    <string name=\"content_language_title\">Lingua predefinite del contento</string>\n    <string name=\"peertube_instance_url_title\">Instantias de PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Selige tu instantias favorite de PeerTube</string>\n    <string name=\"peertube_instance_add_title\">Adder instantia</string>\n    <string name=\"peertube_instance_add_help\">Insere URL de instantia</string>\n    <string name=\"peertube_instance_add_exists\">Le instantia jam existe</string>\n    <string name=\"settings_category_player_title\">Reproductor</string>\n    <string name=\"settings_category_player_behavior_title\">Comportamento</string>\n    <string name=\"settings_category_video_audio_title\">Video e audio</string>\n    <string name=\"settings_category_history_title\">Chronologia e cache</string>\n    <string name=\"settings_category_appearance_title\">Apparentia</string>\n    <string name=\"settings_category_debug_title\">Depuration</string>\n    <string name=\"settings_category_updates_title\">Actualisationes</string>\n    <string name=\"background_player_playing_toast\">Es reproduce in fundo</string>\n    <string name=\"popup_playing_toast\">Es reproduce in modo emergente</string>\n    <string name=\"content\">Contento</string>\n    <string name=\"show_age_restricted_content_title\">Monstrar contento restricte per etate</string>\n    <string name=\"duration_live\">In directe</string>\n    <string name=\"downloads\">Discargamentos</string>\n    <string name=\"downloads_title\">Discargamentos</string>\n    <string name=\"all\">Omne</string>\n    <string name=\"channels\">Canales</string>\n    <string name=\"tracks\">Pistas</string>\n    <string name=\"users\">Usatores</string>\n    <string name=\"events\">Eventos</string>\n    <string name=\"disabled\">Disactivate</string>\n    <string name=\"clear\">Vacuar</string>\n    <string name=\"best_resolution\">Melior resolution</string>\n    <string name=\"undo\">Disfacer</string>\n    <string name=\"file_deleted\">File delite</string>\n    <string name=\"play_all\">Reproducer omne</string>\n    <string name=\"always\">Sempre</string>\n    <string name=\"just_once\">Solo un vice</string>\n    <string name=\"file\">File</string>\n    <string name=\"notification_channel_name\">Notification de NewPipe</string>\n    <string name=\"app_update_notification_channel_name\">Notification de actualisation del application</string>\n    <string name=\"app_update_notification_channel_description\">Notificationes de nove versiones de NewPipe</string>\n    <string name=\"unknown_content\">[Incognite]</string>\n    <string name=\"switch_to_background\">Cambiar a modo fundo</string>\n    <string name=\"switch_to_popup\">Cambiar a modo emergente</string>\n    <string name=\"switch_to_main\">Cambia a Principal</string>\n    <string name=\"clear_views_history_title\">Vacuar le chronologia de reproductiones</string>\n    <string name=\"videos_string\">Videos</string>\n    <string name=\"clear_views_history_summary\">Dele le chronologia del contenido observate e positiones de reproduction</string>\n    <string name=\"watch_history_states_deleted\">Positiones de reproduction delite</string>\n    <string name=\"clear_search_history_title\">Vacuar le chronologia de cerca</string>\n    <string name=\"network_error\">Error de rete</string>\n    <string name=\"content_not_available\">Contento non disponibile</string>\n    <string name=\"player_stream_failure\">Non poteva reproducer iste video</string>\n    <string name=\"video_streams_empty\">Necun fluxo de video trovate</string>\n    <string name=\"audio_streams_empty\">Necun fluxo de audio trovate</string>\n    <string name=\"invalid_directory\">Le dossier non existe</string>\n    <string name=\"file_name_empty_error\">Le nomine del file non pote esser vacue</string>\n    <string name=\"what_device_headline\">Information:</string>\n    <string name=\"your_comment\">Tu commento (in anglese):</string>\n    <string name=\"error_details_headline\">Detalios:</string>\n    <string name=\"retry\">Retentar</string>\n    <string name=\"no_views\">Nulle reproductiones</string>\n    <string name=\"no_videos\">Nulle videos</string>\n    <string name=\"no_comments\">Nulle commentos</string>\n    <string name=\"start\">Initiar</string>\n    <string name=\"delete\">Deler</string>\n    <string name=\"rename\">Renominar</string>\n    <string name=\"msg_name\">Nomine de file</string>\n    <string name=\"msg_running\">NewPipe discargante</string>\n    <string name=\"title_activity_about\">A proposito de NewPipe</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s per %2$s sub %3$s</string>\n    <string name=\"tab_about\">FAQ e A proposito de</string>\n    <string name=\"tab_licenses\">Licentias</string>\n    <string name=\"contribution_title\">Contribuer</string>\n    <string name=\"view_on_github\">Vider in GitHub</string>\n    <string name=\"website_title\">Sito web</string>\n    <string name=\"website_encouragement\">Visita le sito web de NewPipe pro plus de informationes e novitates.</string>\n    <string name=\"app_license_title\">Licentia de NewPipe</string>\n    <string name=\"read_full_license\">Leger le licentia</string>\n    <string name=\"action_history\">Chronologia</string>\n    <string name=\"title_last_played\">Ultime reproductiones</string>\n    <string name=\"title_most_played\">Le plus reproducite</string>\n    <string name=\"main_page_content\">Contento del pagina principal</string>\n    <string name=\"select_a_channel\">Selige un canal</string>\n    <string name=\"done\">Preste</string>\n    <string name=\"popup_remember_size_pos_summary\">Rememorar ultime grandor e position del reproductor emergente</string>\n    <string name=\"popup_remember_size_pos_title\">Rememorar grandor e position del fenestra emergente</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">%s videos</item>\n    </plurals>\n    <string name=\"systems_language\">Predefinite del systema</string>\n    <string name=\"app_language_title\">Lingua del application</string>\n    <string name=\"feed_update_threshold_option_always_update\">Actualisar sempre</string>\n    <string name=\"app_update_available_notification_title\">Il ha un actualisation de NewPipe disponibile!</string>\n    <string name=\"updates_setting_description\">Monstrar un notification pro requestar le actualisation del application quando un nove version es disponibile</string>\n    <string name=\"updates_setting_title\">Actualisationes</string>\n    <string name=\"open_in_popup_mode\">Aperir in modo emergente</string>\n    <string name=\"confirm_prompt\">Esque tu vole vacuar le chronologia de discargamentos o deler omne files discargate\\?</string>\n    <string name=\"clear_download_history\">Vacuar le chronologia de discargamentos</string>\n    <string name=\"delete_item_search_history\">Esque tu vole deler iste articulo del chronologia de cerca\\?</string>\n    <string name=\"title_activity_history\">Chronologia</string>\n    <string name=\"clear_search_history_summary\">Dele le chronologia de parolas clave de cerca</string>\n    <string name=\"delete_search_history_alert\">Deler omne chronologia de cerca\\?</string>\n    <string name=\"search_history_deleted\">Chronologia de recerca delite</string>\n    <string name=\"export_data_summary\">Exportar le chronologia, subscriptiones, listas de reproduction e configurationes</string>\n    <string name=\"import_data_summary\">Reimplaciar tu chronologia, subscriptiones e (optionalmente) configurationes currente</string>\n    <string name=\"remove_watched_popup_warning\">Le videos jam observate ante e post de esser addite al lista de reproduction essera removite. \\nSecur que tu vole? Isto non pote disfacer se!</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Si, e le videos partialmente observate</string>\n    <string name=\"remove_watched_popup_title\">Deler le videos observate?</string>\n    <string name=\"remove_watched\">Deler le videos observate</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s visualisation</item>\n        <item quantity=\"other\">%s visualisationes</item>\n    </plurals>\n    <string name=\"no_one_watching\">Nemo is observante</string>\n    <string name=\"watch_history_deleted\">Chronologia de reproductiones vacuate</string>\n    <string name=\"delete_view_history_alert\">Deler omne chronologia de reproductiones\\?</string>\n    <string name=\"error_snackbar_message\">Pardono, qualcosa vadeva incorrecte.</string>\n    <string name=\"sorry_string\">Pardono, illo non deberea haber ocurrite.</string>\n    <string name=\"clear_playback_states_title\">Deler le positiones de reproduction</string>\n    <string name=\"songs\">Cantos</string>\n    <string name=\"playlists\">Listas de reproduction</string>\n    <string name=\"error_report_title\">Reporto de error</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Activar el \\\"Modo restricte\\\" de YouTube</string>\n    <string name=\"more_than_100_videos\">Plus de 100 videos</string>\n    <string name=\"no_one_listening\">Nemo es ascoltante</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s reproduction</item>\n        <item quantity=\"other\">%s reproductiones</item>\n    </plurals>\n    <string name=\"subscribers_count_not_available\">Le numero de subscriptores non es disponibile</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s subscriptor</item>\n        <item quantity=\"other\">%s subscriptores</item>\n    </plurals>\n    <string name=\"no_subscribers\">Nulle subscriptores</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"video\">Video</string>\n    <string name=\"empty_list_subtitle\">Nihil contentos ci</string>\n    <string name=\"search_no_results\">Nulle resultatos</string>\n    <string name=\"description_tab_description\">Description</string>\n    <string name=\"related_items_tab_description\">Fluxos associate</string>\n    <string name=\"detail_dislikes_img_view_description\">Non me place</string>\n    <string name=\"comments_tab_description\">Commentos</string>\n    <string name=\"detail_likes_img_view_description\">Me place</string>\n    <string name=\"error_snackbar_action\">Reportar</string>\n    <string name=\"error_report_open_issue_button_text\">Reportar in GitHub</string>\n    <string name=\"permission_display_over_apps\">Permitter monstrar supra altere applicationes</string>\n    <string name=\"restore_defaults_confirmation\">Esque tu vole reinitialisar le valores predefinite\\?</string>\n    <string name=\"restore_defaults\">Reinitialisar le valores predefinite</string>\n    <string name=\"no_streams_available_download\">Nulle fluxos disponibile pro discargar</string>\n    <string name=\"error_occurred_detail\">Ocurreva un error: %1$s</string>\n    <string name=\"missing_file\">File displaciate o delite</string>\n    <string name=\"app_ui_crash\">Falleva le interfacie del application</string>\n    <string name=\"download_to_sdcard_error_message\">Le discarga al carta SD non es possibile. Reinitialisar le location del dossier de discargas\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Immagazinage externe non disponibile</string>\n    <string name=\"general_error\">Error</string>\n    <string name=\"delete_playback_states_alert\">Esque tu vole deler tote le positiones de reproduction\\?</string>\n    <string name=\"clear_playback_states_summary\">Dele tote le positiones de reproduction</string>\n    <string name=\"use_inexact_seek_title\">Usar le recerca rapide e inexacte</string>\n    <string name=\"night_theme_title\">Thema nocturne</string>\n    <string name=\"notification_action_nothing\">Nihil</string>\n    <string name=\"show_description_title\">Monstrar le description</string>\n    <string name=\"metadata_language\">Lingua</string>\n    <string name=\"metadata_support\">Supporto</string>\n    <string name=\"recent\">Recente</string>\n    <string name=\"metadata_privacy_internal\">Interne</string>\n    <string name=\"open_with\">Aperir con</string>\n    <string name=\"remote_search_suggestions\">Suggestiones de recerca remote</string>\n    <string name=\"search_showing_result_for\">Monstrante resultatos pro: %s</string>\n    <string name=\"show_higher_resolutions_summary\">Solmente alicun apparatos pote reproducer videos 2K/4K</string>\n    <string name=\"start_main_player_fullscreen_title\">Initiar le reproductor principal in schermo plen</string>\n    <string name=\"peertube_instance_add_https_only\">Solmente le URLs HTTPS es supportate</string>\n    <string name=\"notification_action_repeat\">Repeter</string>\n    <string name=\"notification_action_shuffle\">Aleatori</string>\n    <string name=\"notification_action_buffering\">Cargante fe</string>\n    <string name=\"metadata_privacy\">Privacitate</string>\n    <string name=\"metadata_licence\">Licentia</string>\n    <string name=\"download_has_started\">Comenciava le discarga</string>\n    <string name=\"metadata_privacy_private\">Private</string>\n    <string name=\"open_website_license\">Aperir le sito web</string>\n    <string name=\"video_detail_by\">Per %s</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"channel_created_by\">Create per %s</string>\n    <string name=\"mark_as_watched\">Marcar como reguardate</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"use_external_video_player_title\">Usar reproductor de video externe</string>\n    <string name=\"show_more\">Monstrar plus</string>\n    <string name=\"yes\">Si</string>\n    <string name=\"no\">Non</string>\n    <string name=\"show_less\">Monstrar minus</string>\n    <string name=\"settings_category_player_notification_summary\">Configurar le notification del fluxo in reproduction</string>\n    <string name=\"settings_category_player_notification_title\">Notification de reproductor</string>\n    <string name=\"settings_category_backup_restore_title\">Facer un copia de securitate e restaurar</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-in/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Ketuk kaca pembesar untuk memulai.</string>\n    <string name=\"upload_date_text\">Diterbitkan pada %1$s</string>\n    <string name=\"install\">Instal</string>\n    <string name=\"cancel\">Batal</string>\n    <string name=\"open_in_browser\">Buka di peramban</string>\n    <string name=\"share\">Bagikan</string>\n    <string name=\"download\">Unduh</string>\n    <string name=\"search\">Telusur</string>\n    <string name=\"settings\">Pengaturan</string>\n    <string name=\"share_dialog_title\">Bagikan dengan</string>\n    <string name=\"use_external_video_player_title\">Gunakan pemutar video eksternal</string>\n    <string name=\"use_external_audio_player_title\">Gunakan pemutar audio eksternal</string>\n    <string name=\"download_path_title\">Folder unduhan video</string>\n    <string name=\"download_path_summary\">Berkas video yang diunduh akan disimpan di sini</string>\n    <string name=\"download_path_dialog_title\">Pilih folder unduhan untuk berkas video</string>\n    <string name=\"download_path_audio_title\">Folder unduhan audio</string>\n    <string name=\"download_path_audio_summary\">Berkas audio yang diunduh akan disimpan di sini</string>\n    <string name=\"download_path_audio_dialog_title\">Pilih folder unduhan untuk berkas audio</string>\n    <string name=\"default_resolution_title\">Pilih kualitas</string>\n    <string name=\"play_with_kodi_title\">Putar dengan Kodi</string>\n    <string name=\"kore_not_found\">Pasang aplikasi Kore yang hilang?</string>\n    <string name=\"show_play_with_kodi_title\">Tampilkan opsi \\\"Putar dengan Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Tampilkan opsi untuk memutar video via Kodi</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Format audio</string>\n    <string name=\"dark_theme_title\">Gelap</string>\n    <string name=\"light_theme_title\">Terang</string>\n    <string name=\"download_dialog_title\">Unduh</string>\n    <string name=\"show_next_and_similar_title\">Video \\'Berikutnya\\' dan \\'Serupa\\'</string>\n    <string name=\"unsupported_url\">URL tidak didukung</string>\n    <string name=\"content_language_title\">Bahasa konten</string>\n    <string name=\"settings_category_video_audio_title\">Video dan audio</string>\n    <string name=\"settings_category_appearance_title\">Tampilan</string>\n    <string name=\"background_player_playing_toast\">Memutar di latar belakang</string>\n    <string name=\"content\">Konten</string>\n    <string name=\"show_age_restricted_content_title\">Tampilkan konten yang dibatasi usia</string>\n    <string name=\"network_error\">Galat jaringan</string>\n    <string name=\"could_not_load_thumbnails\">Tidak bisa memuat semua thumbnail</string>\n    <string name=\"did_you_mean\">Mungkin yang kamu maksud \\\"%1$s\\\"?</string>\n    <string name=\"duration_live\">Langsung</string>\n    <string name=\"downloads\">Unduhan</string>\n    <string name=\"downloads_title\">Unduhan</string>\n    <string name=\"error_report_title\">Laporan galat</string>\n    <string name=\"general_error\">Galat</string>\n    <string name=\"parsing_error\">Tidak bisa mengurai situs web</string>\n    <string name=\"content_not_available\">Konten tidak tersedia</string>\n    <string name=\"could_not_setup_download_menu\">Tidak bisa menyiapkan menu unduh</string>\n    <string name=\"sorry_string\">Maaf, hal tersebut seharusnya tidak terjadi.</string>\n    <string name=\"error_report_button_text\">Laporkan via surel</string>\n    <string name=\"error_snackbar_message\">Maaf, telah terjadi kesalahan.</string>\n    <string name=\"error_snackbar_action\">Lapor</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"what_happened_headline\">Yang terjadi:</string>\n    <string name=\"your_comment\">Komentar Anda (dalam bahasa Inggris):</string>\n    <string name=\"error_details_headline\">Detail:</string>\n    <string name=\"detail_thumbnail_view_description\">Putar video, durasi:</string>\n    <string name=\"detail_likes_img_view_description\">Suka</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Thumbnail avatar pengunggah</string>\n    <string name=\"detail_dislikes_img_view_description\">Tidak suka</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Ulangi</string>\n    <string name=\"delete\">Hapus</string>\n    <string name=\"start\">Mulai</string>\n    <string name=\"pause\">Jeda</string>\n    <string name=\"checksum\">Ceksum</string>\n    <string name=\"ok\">Oke</string>\n    <string name=\"msg_name\">Nama berkas</string>\n    <string name=\"msg_error\">Galat</string>\n    <string name=\"msg_running\">NewPipe Sedang Mengunduh</string>\n    <string name=\"msg_running_detail\">Sentuh untuk melihat detail</string>\n    <string name=\"msg_wait\">Mohon tunggu…</string>\n    <string name=\"msg_copied\">Disalin ke papan klip</string>\n    <string name=\"no_available_dir\">Silakan pilih folder unduhan di pengaturan</string>\n    <string name=\"no_player_found\">Pemutar penjaliran tidak ditemukan. Pasang VLC?</string>\n    <string name=\"app_ui_crash\">App/UI rusak</string>\n    <string name=\"info_labels\">Apa:\\nPermintaan:\\nBahasa Konten:\\nNegara Konten:\\nBahasa Apl:\\nLayanan:\\nWaktu GMT:\\nPaket:\\nVersi:\\nVersi OS:</string>\n    <string name=\"msg_threads\">Thread</string>\n    <string name=\"title_activity_recaptcha\">Tantangan reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Meminta kode reCAPTCHA</string>\n    <string name=\"black_theme_title\">Hitam</string>\n    <string name=\"all\">Semua</string>\n    <string name=\"open_in_popup_mode\">Buka pada mode sembulan</string>\n    <string name=\"msg_popup_permission\">Izin ini dibutuhkan untuk\n\\nmembuka di mode sembul</string>\n    <string name=\"popup_playing_toast\">Memutar dalam mode sembul</string>\n    <string name=\"disabled\">Dinonaktifkan</string>\n    <string name=\"default_video_format_title\">Format video</string>\n    <string name=\"default_popup_resolution_title\">Kualitas mode sembulan bawaan</string>\n    <string name=\"show_higher_resolutions_title\">Tampilkan kualitas yang lebih tinggi</string>\n    <string name=\"show_higher_resolutions_summary\">Hanya perangkat tertentu saja yang bisa memutar video 2K/4K</string>\n    <string name=\"controls_background_title\">Latar Belakang</string>\n    <string name=\"controls_popup_title\">Sembulan</string>\n    <string name=\"clear\">Bersihkan</string>\n    <string name=\"use_external_video_player_summary\">Menghapus audio pada beberapa resolusi</string>\n    <string name=\"popup_remember_size_pos_title\">Ingat ciri-ciri sembulan</string>\n    <string name=\"popup_remember_size_pos_summary\">Ingat ukuran dan posisi terakhir sembulan</string>\n    <string name=\"show_search_suggestions_title\">Saran pencarian</string>\n    <string name=\"show_search_suggestions_summary\">Menampilkan saran pencarian saat mencari</string>\n    <string name=\"best_resolution\">Resolusi terbaik</string>\n    <string name=\"settings_category_downloads_title\">Unduhan</string>\n    <string name=\"settings_file_charset_title\">Karakter yang diizinkan sebagai nama berkas</string>\n    <string name=\"settings_file_replacement_character_summary\">Karakter yang tidak valid akan diganti dengan karakter ini</string>\n    <string name=\"settings_file_replacement_character_title\">Karakter pengganti</string>\n    <string name=\"charset_letters_and_digits\">Huruf dan angka</string>\n    <string name=\"charset_most_special_characters\">Karakter spesial umum</string>\n    <string name=\"title_activity_about\">Tentang NewPipe</string>\n    <string name=\"title_licenses\">Lisensi pihak ketiga</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s oleh %2$s di bawah %3$s</string>\n    <string name=\"tab_about\">Tentang &amp; SSD</string>\n    <string name=\"tab_licenses\">Lisensi</string>\n    <string name=\"app_description\">Aplikasi video penjaliran daring yang bebas dan ringan untuk Android.</string>\n    <string name=\"view_on_github\">Lihat di GitHub</string>\n    <string name=\"app_license_title\">Lisensi NewPipe</string>\n    <string name=\"contribution_encouragement\">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!</string>\n    <string name=\"read_full_license\">Baca lisensi</string>\n    <string name=\"contribution_title\">Kontribusi</string>\n    <string name=\"subscribe_button_title\">Berlangganan</string>\n    <string name=\"subscribed_button_title\">Dilanggani</string>\n    <string name=\"fragment_feed_title\">Apa Yang Baru</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Lanjutkan pemutaran</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Melanjutkan pemutaran setelah interupsi (mis. panggilan telepon)</string>\n    <string name=\"enable_search_history_title\">Riwayat pencarian</string>\n    <string name=\"enable_search_history_summary\">Simpan pencarian secara lokal</string>\n    <string name=\"enable_watch_history_title\">Riwayat tontonan</string>\n    <string name=\"notification_channel_name\">Notifikasi NewPipe</string>\n    <string name=\"title_activity_history\">Riwayat</string>\n    <string name=\"action_history\">Riwayat</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Tembolok gambar dihapus</string>\n    <string name=\"metadata_cache_wipe_title\">Hapus metadata tembolok</string>\n    <string name=\"metadata_cache_wipe_summary\">Hapus semua data laman web tembolok</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Tembolok metadata dihapus</string>\n    <string name=\"auto_queue_summary\">Melanjutkan akhir dari antrean pemutaran (tak berulang) dengan menambahkan video terkait</string>\n    <string name=\"enable_watch_history_summary\">Simpan daftar video yang telah ditonton</string>\n    <string name=\"show_hold_to_append_title\">Tip \\\"Tahan untuk menambahkan\\\"</string>\n    <string name=\"show_hold_to_append_summary\">Tampilkan tip ketika menekan tombol latar belakang atau popup di dalam video \\\"Detail:\\\"</string>\n    <string name=\"default_content_country_title\">Lokasi Konten</string>\n    <string name=\"settings_category_player_title\">Pemutar</string>\n    <string name=\"settings_category_player_behavior_title\">Perilaku</string>\n    <string name=\"settings_category_history_title\">Riwayat dan cache</string>\n    <string name=\"settings_category_debug_title\">Debug</string>\n    <string name=\"undo\">Urungkan</string>\n    <string name=\"play_all\">Putar Semua</string>\n    <string name=\"always\">Selalu</string>\n    <string name=\"just_once\">Hanya Sekali</string>\n    <string name=\"file\">Berkas</string>\n    <string name=\"notification_channel_description\">Notifikasi untuk pemutar NewPipe</string>\n    <string name=\"unknown_content\">[Tidak diketahui]</string>\n    <string name=\"switch_to_background\">Alihkan ke Latar Belakang</string>\n    <string name=\"switch_to_popup\">Alihkan ke Popup</string>\n    <string name=\"switch_to_main\">Alihkan ke Utama</string>\n    <string name=\"import_data_title\">Impor basis data</string>\n    <string name=\"export_data_title\">Ekspor basis data</string>\n    <string name=\"import_data_summary\">Timpa riwayat, langganan, daftar putar dan (opsional) pengaturan Anda saat ini</string>\n    <string name=\"export_data_summary\">Ekspor riwayat, langganan, daftar putar dan pengaturan</string>\n    <string name=\"player_stream_failure\">Tidak bisa memutar video ini</string>\n    <string name=\"player_unrecoverable_failure\">Telah terjadi galat pemutar yang tidak bisa dipulihkan</string>\n    <string name=\"player_recoverable_failure\">Memulihkan dari galat pemutar</string>\n    <string name=\"external_player_unsupported_link_type\">Pemutar eksternal tidak mendukung tipe tautan ini</string>\n    <string name=\"video_streams_empty\">Video tidak ditemukan</string>\n    <string name=\"audio_streams_empty\">Audio tidak ditemukan</string>\n    <string name=\"invalid_directory\">Folder tidak ada</string>\n    <string name=\"invalid_source\">Tidak ada sumber berkas/konten</string>\n    <string name=\"invalid_file\">Berkas tidak tersedia atau tidak memiliki izin baca atau tulis</string>\n    <string name=\"file_name_empty_error\">Nama berkas tidak boleh kosong</string>\n    <string name=\"error_occurred_detail\">Telah terjadi galat: %1$s</string>\n    <string name=\"search_no_results\">Tidak ada hasil</string>\n    <string name=\"empty_list_subtitle\">Tidak ada apa pun di sini selain jangkrik</string>\n    <string name=\"detail_drag_description\">Geser untuk ubah urutan</string>\n    <string name=\"no_subscribers\">Tidak ada pelanggan</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"other\">%s pelanggan</item>\n    </plurals>\n    <string name=\"no_views\">Belum ditonton</string>\n    <plurals name=\"views\">\n        <item quantity=\"other\">%s ditonton</item>\n    </plurals>\n    <string name=\"no_videos\">Tidak ada video</string>\n    <string name=\"create\">Buat</string>\n    <string name=\"dismiss\">Abaikan</string>\n    <string name=\"rename\">Ubah nama</string>\n    <string name=\"donation_title\">Donasi</string>\n    <string name=\"donation_encouragement\">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.</string>\n    <string name=\"give_back\">Beri dukungan</string>\n    <string name=\"website_title\">Situs Web</string>\n    <string name=\"website_encouragement\">Kunjungi situs web NewPipe untuk melihat info dan berita lebih lanjut.</string>\n    <string name=\"delete_item_search_history\">Apakah Anda ingin menghapus item ini dari riwayat pencarian\\?</string>\n    <string name=\"title_last_played\">Terakhir Diputar</string>\n    <string name=\"title_most_played\">Sering Diputar</string>\n    <string name=\"main_page_content\">Konten halaman utama</string>\n    <string name=\"blank_page_summary\">Halaman kosong</string>\n    <string name=\"kiosk_page_summary\">Halaman kiosk</string>\n    <string name=\"channel_page_summary\">Halaman saluran</string>\n    <string name=\"select_a_channel\">Pilih saluran</string>\n    <string name=\"no_channel_subscribed_yet\">Belum ada saluran langganan</string>\n    <string name=\"select_a_kiosk\">Pilih kiosk</string>\n    <string name=\"export_complete_toast\">Diekspor</string>\n    <string name=\"import_complete_toast\">Diimpor</string>\n    <string name=\"no_valid_zip_file\">Berkas ZIP tidak valid</string>\n    <string name=\"could_not_import_all_files\">Perhatian: Tidak bisa mengimpor semua berkas.</string>\n    <string name=\"override_current_data\">Ini akan menimpa pengaturan Anda saat ini.</string>\n    <string name=\"trending\">Sedang Tren</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Baru dan aktual</string>\n    <string name=\"play_queue_remove\">Hapus</string>\n    <string name=\"play_queue_stream_detail\">Detail</string>\n    <string name=\"play_queue_audio_settings\">Pengaturan Audio</string>\n    <string name=\"hold_to_append\">Tahan untuk mengantre</string>\n    <string name=\"start_here_on_background\">Mulai putar di latar belakang</string>\n    <string name=\"start_here_on_popup\">Mulai putar di popup</string>\n    <string name=\"drawer_open\">Buka Laci</string>\n    <string name=\"drawer_close\">Tutup Laci</string>\n    <string name=\"video_player\">Pemutar video</string>\n    <string name=\"background_player\">Pemutar latar belakang</string>\n    <string name=\"popup_player\">Pemutar sembulan</string>\n    <string name=\"always_ask_open_action\">Selalu bertanya</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Mendapatkan info…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Memuat konten yang diminta</string>\n    <string name=\"create_playlist\">Daftar Putar Baru</string>\n    <string name=\"rename_playlist\">Ubah Nama</string>\n    <string name=\"name\">Nama</string>\n    <string name=\"add_to_playlist\">Tambah ke daftar putar</string>\n    <string name=\"set_as_playlist_thumbnail\">Atur sebagai thumbnail daftar putar</string>\n    <string name=\"bookmark_playlist\">Markah Daftar Putar</string>\n    <string name=\"unbookmark_playlist\">Hapus Markah</string>\n    <string name=\"delete_playlist_prompt\">Hapus daftar putar ini\\?</string>\n    <string name=\"playlist_creation_success\">Daftar putar dibuat</string>\n    <string name=\"playlist_add_stream_success\">Terdaftar putar</string>\n    <string name=\"playlist_thumbnail_change_success\">Keluku daftar putar diubah.</string>\n    <string name=\"caption_none\">Tanpa Teks</string>\n    <string name=\"resize_fit\">Pas</string>\n    <string name=\"resize_fill\">Isi</string>\n    <string name=\"resize_zoom\">Perbesar</string>\n    <string name=\"caption_auto_generated\">Otomatis dibuat</string>\n    <string name=\"no_player_found_toast\">Pemutar penjaliran tidak ditemukan (kamu dapat menginstal VLC agar penjaliran dapat diputar).</string>\n    <string name=\"controls_download_desc\">Unduh berkas penjaliran</string>\n    <string name=\"subscription_change_failed\">Tidak dapat mengubah langganan</string>\n    <string name=\"show_info\">Tampilkan info</string>\n    <string name=\"controls_add_to_playlist_title\">Tambah Ke</string>\n    <string name=\"clear_views_history_title\">Hapus riwayat tontonan</string>\n    <string name=\"clear_views_history_summary\">Hapus riwayat video yang diputar dan posisi pemutaran</string>\n    <string name=\"delete_view_history_alert\">Hapus seluruh riwayat tontonan\\?</string>\n    <string name=\"watch_history_deleted\">Riwayat tontonan dihapus</string>\n    <string name=\"clear_search_history_title\">Hapus riwayat pencarian</string>\n    <string name=\"clear_search_history_summary\">Hapus riwayat lema pencarian</string>\n    <string name=\"delete_search_history_alert\">Hapus seluruh riwayat pencarian\\?</string>\n    <string name=\"search_history_deleted\">Riwayat pencarian dihapus</string>\n    <string name=\"no_streams_available_download\">Tidak ada video yang tersedia untuk diunduh</string>\n    <string name=\"one_item_deleted\">1 item dihapus.</string>\n    <string name=\"tab_bookmarks\">Daftar Putar</string>\n    <string name=\"auto_queue_title\">Putar otomatis video berikutnya</string>\n    <string name=\"channel_unsubscribed\">Berhenti berlangganan saluran</string>\n    <string name=\"subscription_update_failed\">Tidak dapat memperbarui langganan</string>\n    <string name=\"tab_subscriptions\">Langganan</string>\n    <string name=\"use_inexact_seek_title\">Gunakan tinjau cepat tak pasti</string>\n    <string name=\"use_inexact_seek_summary\">Memungkinkan pengguna memilih posisi waktu video dengan cepat tetapi dengan tingkat presisi yang rendah. Mencari 5, 15 atau 25 detik tidak berhasil dengan ini</string>\n    <string name=\"app_license\">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.</string>\n    <string name=\"import_settings\">Apakah Anda juga ingin mengimpor pengaturan\\?</string>\n    <string name=\"preferred_open_action_settings_title\">Tindakan \\'buka\\' yang diinginkan</string>\n    <string name=\"preferred_open_action_settings_summary\">Tindakan bawaan ketika membuka konten — %s</string>\n    <string name=\"caption_setting_title\">Teks</string>\n    <string name=\"caption_setting_description\">Ubah skala teks takarir pemutar dan gaya latar belakang. Perlu memulai ulang apl</string>\n    <string name=\"enable_leak_canary_summary\">Pemantauan kebocoran memori dapat menyebabkan apl menjadi tidak responsif saat heap dumping</string>\n    <string name=\"enable_disposed_exceptions_title\">Laporkan galat out-of-lifecycle</string>\n    <string name=\"enable_disposed_exceptions_summary\">Paksa pelaporan eksepsi Rx yang tak terkirim di luar fragmen atau siklus hidup aktivitas setelah dibuang</string>\n    <string name=\"import_title\">Impor</string>\n    <string name=\"import_from\">Impor dari</string>\n    <string name=\"export_to\">Ekspor ke</string>\n    <string name=\"import_ongoing\">Mengimpor…</string>\n    <string name=\"export_ongoing\">Mengekspor…</string>\n    <string name=\"import_file_title\">Impor berkas</string>\n    <string name=\"previous_export\">Ekspor sebelumnya</string>\n    <string name=\"subscriptions_import_unsuccessful\">Tidak bisa mengimpor langganan</string>\n    <string name=\"subscriptions_export_unsuccessful\">Tidak bisa mengekspor langganan</string>\n    <string name=\"import_youtube_instructions\">Impor langganan YouTube dari Google takeout:\n\\n\n\\n1. Kunjungi URL ini: %1$s\n\\n2. Masuk ketika ditanyakan\n\\n3. Klik \\\"Semua data disertakan\\\", lalu \\\"Batalkan semua pilihan\\\", lalu hanya pilih \\\"langganan\\\" dan klik \\\"OKE\\\"\n\\n4. Klik \\\"Langkah berikutnya\\\" dan kemudian \\\"Buat ekspor\\\"\n\\n5. Klik tombol \\\"Unduh\\\"\n\\n6. Klik IMPOR FILE di bawah dan pilih file .zip yang terunduh\n\\n7. [Jika impor .zip gagal] Ekstrak file .csv (biasanya di \\\"YouTube dan YouTube Music/langganan/langganan.csv\\\"), klik IMPOR FILE di bawah dan pilih file csv yang diekstrak</string>\n    <string name=\"import_soundcloud_instructions\">Impor profil SoundCloud dengan mengetik URL atau ID Anda:\n\\n\n\\n1. Aktifkan \\\"mode desktop\\\" di peramban web (situs tidak tersedia untuk perangkat seluler)\n\\n2. Kunjungi URL ini: %1$s\n\\n3. Masuk ketika ditanya\n\\n4. Salin URL profil Anda ketika dialihkan.</string>\n    <string name=\"import_soundcloud_instructions_hint\">idAnda, soundcloud.com/idAnda</string>\n    <string name=\"import_network_expensive_warning\">Perlu diingat operasi ini membutuhkan bandwidth yang besar.\n\\n\n\\nApakah Anda ingin melanjutkan\\?</string>\n    <string name=\"playback_speed_control\">Kontrol Kecepatan Pemutaran</string>\n    <string name=\"playback_tempo\">Tempo</string>\n    <string name=\"playback_pitch\">Nada</string>\n    <string name=\"unhook_checkbox\">Batalkan tautan (dapat menyebabkan distorsi)</string>\n    <string name=\"channels\">Channel</string>\n    <string name=\"playlists\">Daftar Putar</string>\n    <string name=\"tracks\">Trek</string>\n    <string name=\"users\">Pengguna</string>\n    <string name=\"privacy_policy_title\">Kebijakan Privasi NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">Proyek NewPipe sangat memperhatikan privasi kamu. Oleh karena itu, aplikasi ini tidak mengumpulkan data apa pun tanpa persetujuan Anda.\n\\nKebijakan privasi NewPipe menjelaskan secara detail data apa saja yang dikirim dan disimpan ketika kamu mengirimkan laporan kerusakan aplikasi.</string>\n    <string name=\"read_privacy_policy\">Baca kebijakan privasi</string>\n    <string name=\"skip_silence_checkbox\">Percepat saat diam</string>\n    <string name=\"playback_step\">Langkah</string>\n    <string name=\"playback_reset\">Atur ulang</string>\n    <string name=\"start_accept_privacy_policy\">Agar sesuai dengan Regulasi Perlindungan Data Umum Eropa (GDPR), dengan ini kami tarik perhatian Anda ke kebijakan privasi NewPipe. Silakan baca dengan seksama.\n\\nAnda harus menerimanya untuk mengirimkan laporan bug kepada kami.</string>\n    <string name=\"accept\">Setuju</string>\n    <string name=\"decline\">Tolak</string>\n    <string name=\"limit_data_usage_none_description\">Tanpa batas</string>\n    <string name=\"limit_mobile_data_usage_title\">Batasi resolusi ketika menggunakan data seluler</string>\n    <string name=\"minimize_on_exit_title\">Minimalkan saat beralih apl</string>\n    <string name=\"minimize_on_exit_summary\">Tindakan ketika beralih ke apl lain dari pemutar video utama — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Nihil</string>\n    <string name=\"minimize_on_exit_background_description\">Minimalkan ke pemutar latar belakang</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimalkan ke pemutar popup</string>\n    <string name=\"unsubscribe\">Berhenti Berlangganan</string>\n    <string name=\"tab_choose\">Pilih Tab</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"settings_category_updates_title\">Pembaruan</string>\n    <string name=\"events\">Acara</string>\n    <string name=\"file_deleted\">Berkas dihapus</string>\n    <string name=\"app_update_notification_channel_name\">Notifikasi pembaruan apl</string>\n    <string name=\"app_update_notification_channel_description\">Notifikasi untuk versi-versi NewPipe baru</string>\n    <string name=\"download_to_sdcard_error_title\">Penyimpanan eksternal tidak tersedia</string>\n    <string name=\"download_to_sdcard_error_message\">Tidak bisa mengunduh ke kartu SD eksternal. Atur ulang lokasi folder unduhan\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Tidak bisa membaca tab yang disimpan, beralih menggunakan tab bawaan</string>\n    <string name=\"restore_defaults\">Kembali ke awal</string>\n    <string name=\"restore_defaults_confirmation\">Apakah Anda ingin mengembalikan ke bawaan\\?</string>\n    <string name=\"subscribers_count_not_available\">Jumlah pelanggan tidak tersedia</string>\n    <string name=\"main_page_content_summary\">Tab apa yang ditampilkan di halaman utama</string>\n    <string name=\"conferences\">Konferensi</string>\n    <string name=\"updates_setting_title\">Pembaruan</string>\n    <string name=\"updates_setting_description\">Tampilkan pemberitahuan untuk meminta pembaruan aplikasi saat versi baru tersedia</string>\n    <string name=\"list_view_mode\">Mode tampilan berdaftar</string>\n    <string name=\"list\">Daftar</string>\n    <string name=\"grid\">Kisi</string>\n    <string name=\"auto\">Otomatis</string>\n    <string name=\"app_update_available_notification_title\">Pembaruan NewPipe telah tersedia!</string>\n    <string name=\"missions_header_finished\">Selesai</string>\n    <string name=\"missions_header_pending\">Tertunda</string>\n    <string name=\"paused\">dijeda</string>\n    <string name=\"queued\">antri</string>\n    <string name=\"post_processing\">pasca-pengolahan</string>\n    <string name=\"enqueue\">Antre</string>\n    <string name=\"permission_denied\">Tindakan ditolak oleh sistem</string>\n    <string name=\"download_failed\">Pengunduhan gagal</string>\n    <string name=\"generate_unique_name\">Hasilkan nama unik</string>\n    <string name=\"overwrite\">Timpa</string>\n    <string name=\"overwrite_finished_warning\">File yang diunduh dengan nama ini sudah ada</string>\n    <string name=\"download_already_running\">Ada unduhan yang sedang berlangsung dengan nama ini</string>\n    <string name=\"show_error\">Tunjukkan kesalahan</string>\n    <string name=\"error_file_creation\">File tidak dapat dibuat</string>\n    <string name=\"error_path_creation\">Folder tujuan tidak dapat dibuat</string>\n    <string name=\"error_ssl_exception\">Tidak bisa membuat koneksi yang aman</string>\n    <string name=\"error_unknown_host\">Tidak dapat menemukan server</string>\n    <string name=\"error_connect_host\">Tidak dapat terhubung ke server</string>\n    <string name=\"error_http_no_content\">Server tidak mengirim data</string>\n    <string name=\"error_http_unsupported_range\">Server tidak menerima unduhan multi-utas, coba lagi dengan @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Tidak ditemukan</string>\n    <string name=\"error_postprocessing_failed\">Pengolahan-pasca gagal</string>\n    <string name=\"stop\">Berhenti</string>\n    <string name=\"max_retry_msg\">Percobaan maksimum</string>\n    <string name=\"max_retry_desc\">Jumlah upaya maksimum sebelum unduhan dibatalkan</string>\n    <string name=\"pause_downloads_on_mobile\">Berhenti pada jaringan terbatas</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Berguna saat beralih ke data seluler, walaupun beberapa unduhan tidak bisa ditangguhkan</string>\n    <string name=\"show_comments_title\">Tampilkan komentar</string>\n    <string name=\"show_comments_summary\">Nonaktifkan untuk menyembunyikan komentar</string>\n    <string name=\"autoplay_title\">Putar otomatis</string>\n    <string name=\"no_comments\">Tidak ada komentar</string>\n    <string name=\"error_unable_to_load_comments\">Tidak bisa memuat komentar</string>\n    <string name=\"close\">Tutup</string>\n    <string name=\"enable_playback_resume_title\">Lanjutkan pemutaran</string>\n    <string name=\"enable_playback_resume_summary\">Pulihkan posisi pemutaran terakhir</string>\n    <string name=\"enable_playback_state_lists_title\">Posisi dalam daftar</string>\n    <string name=\"enable_playback_state_lists_summary\">Tampilkan indikator posisi pemutaran di dalam daftar</string>\n    <string name=\"settings_category_clear_data_title\">Hapus data</string>\n    <string name=\"watch_history_states_deleted\">Posisi pemutaran dihapus</string>\n    <string name=\"missing_file\">Berkas dipindah atau dihapus</string>\n    <string name=\"overwrite_unrelated_warning\">Berkas dengan nama yang sama sudah ada</string>\n    <string name=\"overwrite_failed\">tidak bisa menimpa ulang berkas</string>\n    <string name=\"download_already_pending\">Ada unduhan yang dijeda dengan nama ini</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe telah ditutup saat sedang memproses berkas</string>\n    <string name=\"error_insufficient_storage_left\">Tidak ada ruang kosong tersisa pada perangkat</string>\n    <string name=\"error_progress_lost\">Kehilangan laju, karena berkas telah dihapus</string>\n    <string name=\"confirm_prompt\">Apakah Anda yakin ingin menghapus semua riwayat unduhan dan berkas yang telah diunduh\\?</string>\n    <string name=\"enable_queue_limit\">Batasi antrean unduhan</string>\n    <string name=\"enable_queue_limit_desc\">Satu unduhan akan berjalan pada waktu yang bersamaan</string>\n    <string name=\"start_downloads\">Mulai unduh</string>\n    <string name=\"pause_downloads\">Jeda unduh</string>\n    <string name=\"downloads_storage_ask_title\">Tanyakan lokasi unduhan</string>\n    <string name=\"downloads_storage_ask_summary\">Anda akan ditanya lokasi penyimpanan berkas unduhan.\n\\nAktifkan pencomot folder sistem (SAF) jika Anda ingin mengunduh ke kartu SD eksternal</string>\n    <string name=\"error_timeout\">Batas waktu koneksi</string>\n    <string name=\"downloads_storage_use_saf_title\">Gunakan pencomot folder sistem (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Storage Access Framework\\' memungkinkan unduhan ke kartu SD eksternal</string>\n    <string name=\"clear_playback_states_title\">Hapus posisi pemutaran</string>\n    <string name=\"clear_playback_states_summary\">Hapus semua posisi pemutaran</string>\n    <string name=\"delete_playback_states_alert\">Hapus semua posisi pemutaran\\?</string>\n    <plurals name=\"videos\">\n        <item quantity=\"other\">%s video</item>\n    </plurals>\n    <string name=\"drawer_header_description\">Aktif/Nonaktifkan layanan, saat ini aktif:</string>\n    <string name=\"no_one_watching\">Tidak ada yang menonton</string>\n    <plurals name=\"watching\">\n        <item quantity=\"other\">%s menonton</item>\n    </plurals>\n    <string name=\"no_one_listening\">Tidak ada yang mendengarkan</string>\n    <plurals name=\"listening\">\n        <item quantity=\"other\">%s pendengar</item>\n    </plurals>\n    <string name=\"peertube_instance_url_title\">Situs PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Pilih situs PeerTube favorit Anda</string>\n    <string name=\"peertube_instance_url_help\">Temukan situs yang Anda suka di %s</string>\n    <string name=\"peertube_instance_add_title\">Tambah situs</string>\n    <string name=\"peertube_instance_add_help\">Masukkan URL situs</string>\n    <string name=\"peertube_instance_add_fail\">Tidak bisa memvalidasi situs</string>\n    <string name=\"peertube_instance_add_https_only\">Hanya mendukung URL HTTPS</string>\n    <string name=\"peertube_instance_add_exists\">Situs sudah ada</string>\n    <string name=\"local\">Lokal</string>\n    <string name=\"recently_added\">Baru ditambahkan</string>\n    <string name=\"most_liked\">Disukai terbanyak</string>\n    <string name=\"playlist_no_uploader\">Dibuat otomatis (pengunggah tidak ditemukan)</string>\n    <string name=\"recovering\">memulihkan</string>\n    <string name=\"error_download_resource_gone\">Tidak bisa memulihkan unduhan ini</string>\n    <string name=\"choose_instance_prompt\">Pilih situs</string>\n    <string name=\"default_kiosk_page_summary\">Kedai Bawaan</string>\n    <string name=\"clear_download_history\">Hapus riwayat unduhan</string>\n    <string name=\"delete_downloaded_files\">Hapus berkas yang diunduh</string>\n    <string name=\"permission_display_over_apps\">Izinkan untuk ditampilkan di atas aplikasi lain</string>\n    <string name=\"app_language_title\">Bahasa apl</string>\n    <string name=\"systems_language\">Default sistem</string>\n    <string name=\"done\">Selesai</string>\n    <string name=\"seek_duration_title\">Durasi maju/mundur cepat</string>\n    <string name=\"subtitle_activity_recaptcha\">Tekan \\\"Selesai\\\" saat selesai</string>\n    <string name=\"videos_string\">Video</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"other\">%d detik</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Karena kendala ExoPlayer, durasi pencarian ditetapkan ke %d detik</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"other\">%d menit</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"other\">%d jam</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"other\">%d hari</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">Grup channel</string>\n    <string name=\"feed_oldest_subscription_update\">Terakhir diperbarui: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Tidak dimuat: %d</string>\n    <string name=\"feed_notification_loading\">Memuat langganan…</string>\n    <string name=\"feed_processing_message\">Memproses langganan…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Pilih langganan</string>\n    <string name=\"feed_group_dialog_empty_selection\">Tidak ada langganan yang dipilih</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"other\">%d dipilih</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">Nama grup kosong</string>\n    <string name=\"feed_group_dialog_delete_message\">Apakah Anda ingin menghapus grup ini\\?</string>\n    <string name=\"feed_create_new_group_button_title\">Baru</string>\n    <string name=\"settings_category_feed_title\">Langganan</string>\n    <string name=\"feed_update_threshold_title\">Rentang pembaruan langganan</string>\n    <string name=\"feed_update_threshold_summary\">Waktu setelah pembaruan terakhir sebelum langganan dianggap kedaluwarsa — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Selalu perbarui</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Tersedia pada beberapa layanan, biasanya lebih cepat tetapi memperbarui lebih sedikit item dan sering kali dengan informasi yang tidak lengkap (mis. tanpa durasi, tanpa tipe item, tanpa status live)</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Aktifkan mode cepat</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Nonaktifkan mode cepat</string>\n    <string name=\"infinite_videos\">∞ video</string>\n    <string name=\"more_than_100_videos\">100+ video</string>\n    <string name=\"artists\">Artis</string>\n    <string name=\"albums\">Album</string>\n    <string name=\"songs\">Lagu</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Ambil dari langganan aslinya jika tersedia</string>\n    <string name=\"remove_watched_popup_title\">Buang video yang sudah ditonton?</string>\n    <string name=\"remove_watched\">Buang ditonton</string>\n    <string name=\"restricted_video\">Video ini dibatasi usia.\n\\n\n\\nAktifkan \\\"%1$s\\\" di dalam pengaturan jika Anda ingin melihatnya.</string>\n    <string name=\"content_not_supported\">Konten ini belum didukung oleh NewPipe.\n\\n\n\\nSemoga akan didukung pada versi berikutnya.</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Iya, dan video yang ditonton sebagian</string>\n    <string name=\"remove_watched_popup_warning\">Video yang sudah ditonton sebelum dan sesudah ditambahkan ke daftar putar akan dibuang. \\nApakah Anda yakin? Ini tidak bisa diurungkan!</string>\n    <string name=\"unmute\">Batal bisukan</string>\n    <string name=\"mute\">Bisukan</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Apakah Anda merasa pemuatan langganan sangat lambat\\? Jika iya, coba nyalakan pemuatan cepat (Anda bisa mengubahnya di dalam pengaturan atau dengan menekan tombol di bawah)\n\\n\n\\nNewPipe menyediakan dua strategi pemuatan langganan:\n\\n• Mengambil semua kanal langganan, yang lebih lambat tapi lengkap.\n\\n• Menggunakan layanan endpoint khusus, yang lebih cepat namun terkadang tidak lengkap.\n\\n\n\\nPerbedaan di antara keduanya adalah yang lebih cepat biasanya kekurangan beberapa informasi, seperti durasi atau tipe item (tidak bisa membedakan antara video siaran langsung atau yang biasa) dan mungkin menampilkan lebih sedikit item.\n\\n\n\\nYouTube adalah contoh layanan yang menyediakan metode pengambilan cepat dengan layanan RSS mereka.\n\\n\n\\nJadi pilihlah yang sesuai yang Anda inginkan: kecepatan atau kelengkapan informasi.</string>\n    <string name=\"show_original_time_ago_summary\">Teks asli dari layanan akan ditampilkan di dalam video</string>\n    <string name=\"show_original_time_ago_title\">Tampilkan waktu yang lalu sebenarnya pada item</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Aktifkan \\\"Mode Terbatas\\\"</string>\n    <string name=\"video_detail_by\">Oleh %s</string>\n    <string name=\"channel_created_by\">Dibuat oleh %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Thumbnail avatar channel</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_report_open_issue_button_text\">Laporkan di GitHub</string>\n    <string name=\"copy_for_github\">Salin laporan dengan format</string>\n    <string name=\"search_showing_result_for\">Menampilkan hasil: %s</string>\n    <string name=\"playlist_page_summary\">Halaman daftar putar</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Hanya tampilkan langganan tanpa grup</string>\n    <string name=\"no_playlist_bookmarked_yet\">Belum ada markah daftar putar</string>\n    <string name=\"select_a_playlist\">Pilih daftar putar</string>\n    <string name=\"never\">Tidak pernah</string>\n    <string name=\"wifi_only\">Hanya pada Wi-Fi</string>\n    <string name=\"autoplay_summary\">Otomatis mulai pemutaran — %s</string>\n    <string name=\"title_activity_play_queue\">Putar antrean</string>\n    <string name=\"unsupported_url_dialog_message\">URL tidak dikenali. Buka dengan aplikasi lain\\?</string>\n    <string name=\"auto_queue_toggle\">Otomatis antre</string>\n    <string name=\"clear_queue_confirmation_description\">Antrean dari pemutar yang aktif akan digantikan</string>\n    <string name=\"clear_queue_confirmation_summary\">Beralih ke pemutar yang lain mungkin akan mengganti antrean Anda</string>\n    <string name=\"clear_queue_confirmation_title\">Konfirmasikan sebelum mengosongkan antrean</string>\n    <string name=\"notification_action_nothing\">Tidak ada</string>\n    <string name=\"notification_action_buffering\">Bufer</string>\n    <string name=\"notification_action_shuffle\">Aduk</string>\n    <string name=\"notification_action_repeat\">Ulangi</string>\n    <string name=\"notification_actions_at_most_three\">Anda bisa memilih hingga tiga tindakan untuk ditampilkan dalam notifikasi ringkas!</string>\n    <string name=\"notification_actions_summary\">Sentuh untuk menyunting tindakan notifikasi di bawah. Pilih hingga tiga di antaranya untuk ditampilkan dalam notifikasi ringkas dengan menggunakan kotak centang di sebelah kanan.</string>\n    <string name=\"notification_action_4_title\">Tombol tindakan kelima</string>\n    <string name=\"notification_action_3_title\">Tombol tindakan keempat</string>\n    <string name=\"notification_action_2_title\">Tombol tindakan ketiga</string>\n    <string name=\"notification_action_1_title\">Tombol tindakan kedua</string>\n    <string name=\"notification_action_0_title\">Tombol tindakan pertama</string>\n    <string name=\"notification_scale_to_square_image_summary\">Ubah ukuran keluku yang ditampilkan pada notifikasi dari rasio aspek 16:9 ke 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Ubah ukuran thumbnail ke rasio aspek 1:1</string>\n    <string name=\"show_memory_leaks\">Tampilkan kebocoran memori</string>\n    <string name=\"enqueued\">Ditambahkan</string>\n    <string name=\"enqueue_stream\">Tambahkan</string>\n    <string name=\"clear_cookie_summary\">Hapus kuki yang disimpan oleh NewPipe saat Anda memecahkan reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Kuki reCAPTCHA telah dihapus</string>\n    <string name=\"clear_cookie_title\">Hapus kuki reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube menyediakan \\\"Mode Terbatas\\\" yang menyembunyikan konten dewasa</string>\n    <string name=\"show_age_restricted_content_summary\">Menampilkan konten yang mungkin tidak cocok untuk anak-anak karena memiliki batasan umur (seperti 18+)</string>\n    <string name=\"notification_colorize_summary\">Minta Android menyesuaikan warna notifikasi sesuai dengan warna utama di thumbnail (perhatikan bahwa ini tidak tersedia di semua perangkat)</string>\n    <string name=\"notification_colorize_title\">Warnai notifikasi</string>\n    <string name=\"show_thumbnail_summary\">Gunakan thumbnail untuk latar layar penguncian dan notifikasi</string>\n    <string name=\"show_thumbnail_title\">Tampilkan thumbnail</string>\n    <string name=\"msg_calculating_hash\">Menghitung pilah</string>\n    <string name=\"recent\">Baru-baru ini</string>\n    <string name=\"show_meta_info_summary\">Nonaktifkan untuk menyembunyikan kotak info dengan informasi tambahan tentang kreator, konten stream atau pencarian</string>\n    <string name=\"show_meta_info_title\">Tampilkan info meta</string>\n    <string name=\"hash_channel_description\">Notifikasi untuk laju pemrosesan hash video</string>\n    <string name=\"hash_channel_name\">Notifikasi hash video</string>\n    <string name=\"no_app_to_open_intent\">Tidak ada apl di perangkat Anda yang bisa membuka ini</string>\n    <string name=\"chapters\">Chapter</string>\n    <string name=\"description_tab_description\">Deskripsi</string>\n    <string name=\"related_items_tab_description\">Item terkait</string>\n    <string name=\"comments_tab_description\">Komentar</string>\n    <string name=\"show_description_summary\">Nonaktifkan untuk menyembunyikan deskripsi dan informasi tambahan</string>\n    <string name=\"show_description_title\">Tampilkan deskripsi</string>\n    <string name=\"open_with\">Buka dengan</string>\n    <string name=\"paid_content\">Konten ini hanya tersedia untuk pengguna yang telah membayar, sehingga tidak bisa diputar atau diunduh oleh NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Video ini hanya tersedia untuk anggota YouTube Music Premium, sehingga tidak bisa diputar atau diunduh oleh NewPipe.</string>\n    <string name=\"private_content\">Konten ini bersifat privat, sehingga tidak dapat diputar atau diunduh oleh NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Ini adalah sebuah trek SoundCloud Go +, setidaknya di negara Anda, sehingga tidak bisa diputar atau diunduh oleh NewPipe.</string>\n    <string name=\"georestricted_content\">Konten ini tidak tersedia di negara Anda.</string>\n    <string name=\"crash_the_app\">Hentikan aplikasi</string>\n    <string name=\"restricted_video_no_stream\">Video ini dibatasi usia.\n\\nKarena kebijakan YouTube yang baru dengan video yang dibatasi usia, NewPipe tidak bisa mengakses video dan tidak bisa memutarnya.</string>\n    <string name=\"select_night_theme_toast\">Kamu bisa pilih tema malam favoritmu dibawah</string>\n    <string name=\"night_theme_summary\">Pilih tema malam favoritmu — %s</string>\n    <string name=\"auto_device_theme_title\">Otomatis (tema perangkat)</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"featured\">Unggulan</string>\n    <string name=\"recaptcha_solve\">Selesaikan</string>\n    <string name=\"night_theme_title\">Tema malam</string>\n    <string name=\"download_has_started\">Pengunduhan dimulai</string>\n    <string name=\"show_channel_details\">Tampilkan detail channel</string>\n    <string name=\"disable_media_tunneling_summary\">Nonaktifkan terowongan media (tunnel) jika anda mengalami sebuah layar hitam atau kerusakan dalam memutar video.</string>\n    <string name=\"disable_media_tunneling_title\">Nonaktifkan terowongan media (tunnel)</string>\n    <string name=\"metadata_privacy_internal\">Internal</string>\n    <string name=\"metadata_privacy_private\">Privasi</string>\n    <string name=\"metadata_privacy_unlisted\">Tidak didaftar</string>\n    <string name=\"metadata_privacy_public\">Publik</string>\n    <string name=\"metadata_host\">Host</string>\n    <string name=\"metadata_support\">Dukungan</string>\n    <string name=\"metadata_language\">Bahasa</string>\n    <string name=\"metadata_age_limit\">Batas umur</string>\n    <string name=\"metadata_privacy\">Privasi</string>\n    <string name=\"metadata_licence\">Lisensi</string>\n    <string name=\"metadata_tags\">Tag</string>\n    <string name=\"metadata_category\">Kategori</string>\n    <string name=\"description_select_disable\">Nonaktifkan dapat memilih teks pada deskripsi</string>\n    <string name=\"description_select_enable\">Aktifkan dapat memilih teks pada deskripsi</string>\n    <string name=\"description_select_note\">Anda sekarang dapat memilih teks di dalam deskripsi. Perhatikan bahwa halaman mungkin berkedip dan tautan tidak dapat diklik saat dalam mode pemilihan.</string>\n    <string name=\"open_website_license\">Buka situs web</string>\n    <string name=\"account_terminated\">Akun dinonaktifkan</string>\n    <string name=\"feed_load_error_fast_unknown\">Mode langganan cepat tidak menyediakan lebih banyak info tentang ini.</string>\n    <string name=\"feed_load_error_terminated\">Akun kreator telah dinonaktifkan.\n\\nNewPipe tidak akan bisa memuat langganan ini lagi.\n\\nApakah Anda ingin berhenti berlangganan channel ini\\?</string>\n    <string name=\"feed_load_error_account_info\">Tidak bisa memuat langganan untuk \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Galat memuat langganan</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Mulai Android 10, hanya \\'Storage Access Framework\\' yang didukung</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Anda akan ditanya lokasi penyimpanan berkas unduhan</string>\n    <string name=\"no_dir_yet\">Belum ada folder unduhan terpasang, pilih folder unduhan sekarang</string>\n    <string name=\"off\">Nonaktif</string>\n    <string name=\"on\">Aktif</string>\n    <string name=\"tablet_mode_title\">Mode tablet</string>\n    <string name=\"dont_show\">Jangan tampilkan</string>\n    <string name=\"low_quality_smaller\">Kualitas rendah (lebih kecil)</string>\n    <string name=\"high_quality_larger\">Kualitas tinggi (lebih besar)</string>\n    <string name=\"comments_are_disabled\">Komentar dinonaktifkan</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Pratinjau thumbnail bilah laju</string>\n    <string name=\"mark_as_watched\">Tandai sebagai \\'sudah ditonton\\'</string>\n    <string name=\"start_main_player_fullscreen_title\">Buka pemutar utama dalam layar penuh</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"other\">%s unduhan selesai</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Geser agar item terbuang</string>\n    <string name=\"detail_heart_img_view_description\">Disukai oleh kreator</string>\n    <string name=\"local_search_suggestions\">Saran pencarian lokal</string>\n    <string name=\"remote_search_suggestions\">Saran pencarian remote</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"other\">Menghapus %1$s unduhan</item>\n    </plurals>\n    <string name=\"enqueue_next_stream\">tambahkan ke selanjutnya</string>\n    <string name=\"enqueued_next\">telah ditambahkan ke selanjutnya</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"processing_may_take_a_moment\">Memproses… Mungkin butuh waktu sebentar</string>\n    <string name=\"check_for_updates\">Periksa Pembaruan</string>\n    <string name=\"manual_update_description\">Periksa secara manual untuk melihat aplikasi versi baru</string>\n    <string name=\"checking_updates_toast\">Memeriksa pembaruan…</string>\n    <string name=\"feed_new_items\">Item feed baru</string>\n    <string name=\"show_crash_the_player_title\">Tampilkan \\\"Mogokkan pemutar\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Menampilkan opsi penghentian ketika menggunakan pemain video</string>\n    <string name=\"crash_the_player\">Hentikan pemutar video</string>\n    <string name=\"error_report_channel_description\">Notifikasi untuk melaporkan kegalatan</string>\n    <string name=\"error_report_channel_name\">Notifikasi laporan kegalatan</string>\n    <string name=\"error_report_notification_toast\">Sebuah kegalatan terjadi, lihat notifikasinya</string>\n    <string name=\"show_error_snackbar\">Menampilkan sebuah snackbar kegalatan</string>\n    <string name=\"create_error_notification\">Buat sebuah notifikasi kegalatan</string>\n    <string name=\"no_appropriate_file_manager_message\">Tidak ada pengelola berkas yang ditemukan untuk tindakan ini.\n\\nSilakan pasang pengelola berkas atau coba nonaktifkan \\'%s\\' di pengaturan unduhan</string>\n    <string name=\"error_report_notification_title\">NewPipe mengalami sebuah kegalatan, ketuk untuk melaporkan</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Tidak ada pengelola berkas yang ditemukan untuk tindakan ini.\n\\nSilakan pasang pengelola berkas yang kompatibel dengan Storage Access Framework</string>\n    <string name=\"detail_pinned_comment_view_description\">Komentar dipin</string>\n    <string name=\"leak_canary_not_available\">LeakCanary tidak tersedia</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer bawaan</string>\n    <string name=\"loading_stream_details\">Memuat detail penjaliran …</string>\n    <string name=\"streams_notifications_interval_title\">Frekuensi pemeriksaan</string>\n    <string name=\"streams_notifications_network_title\">Dibutuhkan koneksi jaringan</string>\n    <string name=\"any_network\">Jaringan apa saja</string>\n    <string name=\"get_notified\">Beri tahu saya</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Alih semua</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"other\">%s stream baru</item>\n    </plurals>\n    <string name=\"check_new_streams\">Jalankan periksa untuk stream baru</string>\n    <string name=\"delete_downloaded_files_confirm\">Hapus semua file yang terunduh dari disk\\?</string>\n    <string name=\"notifications_disabled\">Notifikasi dinonaktifkan</string>\n    <string name=\"settings_category_player_notification_title\">Notifikasi pemain</string>\n    <string name=\"notifications\">Notifikasi</string>\n    <string name=\"settings_category_player_notification_summary\">Konfigurasi notifikasi permainan stream saat ini</string>\n    <string name=\"streams_notification_channel_name\">Stream baru</string>\n    <string name=\"streams_notification_channel_description\">Notifikasi tentang stream baru untuk langganan</string>\n    <string name=\"enable_streams_notifications_title\">Notifikasi stream baru</string>\n    <string name=\"enable_streams_notifications_summary\">Beri tahu tentang stream baru dari notifikasi</string>\n    <string name=\"you_successfully_subscribed\">Anda sekarang berlangganan ke channel ini</string>\n    <string name=\"semitone\">Semiton</string>\n    <string name=\"percent\">Persen</string>\n    <string name=\"selected_stream_external_player_not_supported\">Stream yang dipilih tidak didukung oleh pemain eksternal</string>\n    <string name=\"no_video_streams_available_for_external_players\">Tidak ada stream video yang tersedia untuk pemain eksternal</string>\n    <string name=\"unknown_quality\">Kualitas tidak diketahui</string>\n    <string name=\"streams_not_yet_supported_removed\">Stream yang belum didukung oleh pengunduh tidak ditampilkan</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Tidak ada stream audio yang tersedia untuk pemain eksternal</string>\n    <string name=\"select_quality_external_players\">Pilih kualitas untuk pemain eksternal</string>\n    <string name=\"unknown_format\">Format tidak diketahui</string>\n    <string name=\"progressive_load_interval_title\">Ukuran selang pemuatan putar balik</string>\n    <string name=\"faq_title\">Pertanyaan yang sering diajukan</string>\n    <string name=\"faq_description\">Jika kamu mengalami masalah dalam penggunaan aplikasi, pastikan untuk melihat jawaban soal sering ditanya (SSD)!</string>\n    <string name=\"faq\">Tampilkan di situs web</string>\n    <string name=\"sort\">Urutan</string>\n    <string name=\"fast_mode\">Mode cepat</string>\n    <string name=\"import_subscriptions_hint\">Impor atau ekspor langganan dari menu 3 titik</string>\n    <string name=\"app_update_unavailable_toast\">Anda menjalankan NewPipe versi terkini</string>\n    <string name=\"app_update_available_notification_text\">Ketuk untuk mengunduh %s</string>\n    <string name=\"night_theme_available\">Opsi ini hanya tersedia jika %s dipilih untuk Tema</string>\n    <string name=\"unset_playlist_thumbnail\">Batalkan penetapan gambar kecil permanen</string>\n    <string name=\"msg_failed_to_copy\">Gagal menyalin ke papan klip</string>\n    <string name=\"card\">Kartu</string>\n    <string name=\"duplicate_in_playlist\">Daftar putar yang bewarna abu-abu sudah berisi item ini.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplikat ditambahkan %d kali</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Berguna, misalnya, jika kamu menggunakan sebuah set kepala dengan tombol fisik yang rusak</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Abaikan peristiwa tombol media perangkat keras</string>\n    <string name=\"remove_duplicates\">Hapus duplikat</string>\n    <string name=\"feed_show_watched\">Ditonton secara lengkap</string>\n    <string name=\"feed_show_partially_watched\">Ditonton sebagian</string>\n    <string name=\"feed_show_upcoming\">Mendatang</string>\n    <string name=\"feed_show_hide_streams\">Tampilkan/Sembunyikan saluran</string>\n    <string name=\"remove_duplicates_title\">Hapus duplikat\\?</string>\n    <string name=\"remove_duplicates_message\">Apakah Anda ingin menghapus semua saluran duplikat di daftar putar ini\\?</string>\n    <string name=\"feed_hide_streams_title\">Tampilkan saluran berikut</string>\n    <string name=\"left_gesture_control_summary\">Pilih gestur untuk bagian kiri layar pemutar</string>\n    <string name=\"left_gesture_control_title\">Tindakan gestur kiri</string>\n    <string name=\"none\">Tidak ada</string>\n    <string name=\"right_gesture_control_summary\">Pilih gestur untuk bagian kanan dari layar pemutar</string>\n    <string name=\"right_gesture_control_title\">Tindakan gestur kanan</string>\n    <string name=\"brightness\">Kecerahan</string>\n    <string name=\"volume\">Volume</string>\n    <string name=\"settings_category_exoplayer_summary\">Kelola beberapa pengaturan ExoPlayer. Perubahan ini mengharuskan pemain memulai ulang agar diterapkan</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\n\\nMengaktifkan opsi ini dapat mencegah kesalahan pemutaran saat mengganti pemutar video saat ini atau beralih ke layar penuh</string>\n    <string name=\"progressive_load_interval_summary\">Ubah ukuran selang pemuatan pada konten progresif (saat ini %s). Nilai yang lebih rendah dapat mempercepat pemuatan awal konten</string>\n    <string name=\"prefer_original_audio_title\">Pilih audio asli</string>\n    <string name=\"prefer_original_audio_summary\">Pilih trek audio asli apa pun bahasanya</string>\n    <string name=\"prefer_descriptive_audio_title\">PIlih audio deskriptif</string>\n    <string name=\"prefer_descriptive_audio_summary\">Pilih trek audio dengan deskripsi untuk orang tunanetra jika tersedia</string>\n    <string name=\"play_queue_audio_track\">Suara: %s</string>\n    <string name=\"audio_track\">Trek audio</string>\n    <string name=\"audio_track_present_in_video\">Trek audio harus sudah ada dalam aliran ini</string>\n    <string name=\"select_audio_track_external_players\">Pilih trek audio untuk pemutar eksternal</string>\n    <string name=\"unknown_audio_track\">Tidak diketahui</string>\n    <string name=\"settings_category_exoplayer_title\">Pengaturan ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Gunakan fitur fallback dekoder ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Selalu gunakan solusi pengaturan permukaan keluaran video ExoPlayer</string>\n    <string name=\"audio_track_type_original\">asli</string>\n    <string name=\"audio_track_type_dubbed\">disulih suara</string>\n    <string name=\"audio_track_type_descriptive\">deskriptif</string>\n    <string name=\"main_tabs_position_summary\">Pindahkan pemilih tab utama ke bawah</string>\n    <string name=\"main_tabs_position_title\">Posisi tab utama</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Terowongan media dinonaktifkan secara bawaan di perangkat Anda karena model perangkat Anda tidak mendukungnya.</string>\n    <string name=\"no_live_streams\">Tidak ada siaran langsung</string>\n    <string name=\"channel_tab_videos\">Video</string>\n    <string name=\"metadata_subscribers\">Pelanggan</string>\n    <string name=\"show_channel_tabs_summary\">Tab apa saja yang ditampilkan di halaman saluran</string>\n    <string name=\"show_channel_tabs\">Tab saluran</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"loading_metadata_title\">Memuat Metadata…</string>\n    <string name=\"feed_fetch_channel_tabs\">Dapatjan tab saluran</string>\n    <string name=\"channel_tab_about\">Tentang</string>\n    <string name=\"channel_tab_albums\">Album</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Tab untuk didapatkan ketika memperarui umpan. Opsi ini tidak memiliki efek jika saluran diperbarui menggunakan mode cepat.</string>\n    <string name=\"channel_tab_playlists\">Daftar putar</string>\n    <string name=\"channel_tab_tracks\">Trek</string>\n    <string name=\"no_streams\">Tidak ada saluran</string>\n    <string name=\"channel_tab_channels\">Saluran</string>\n    <string name=\"channel_tab_livestreams\">Langsung</string>\n    <string name=\"toggle_screen_orientation\">Saklar orientasi layar</string>\n    <string name=\"toggle_fullscreen\">Saklar layar penuh</string>\n    <string name=\"next_stream\">Saluran berikutnya</string>\n    <string name=\"open_play_queue\">Buka antrean pemain</string>\n    <string name=\"forward\">Maju</string>\n    <string name=\"rewind\">Mundur</string>\n    <string name=\"replay\">Putar ulang</string>\n    <string name=\"play\">Putar</string>\n    <string name=\"more_options\">Pilihan tambahan</string>\n    <string name=\"duration\">Durasi</string>\n    <string name=\"previous_stream\">Penjaliran sebelumnya</string>\n    <string name=\"image_quality_title\">Kualitas gambar</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"image_quality_low\">Kualitas rendah</string>\n    <string name=\"metadata_avatars\">Avatar</string>\n    <string name=\"metadata_subchannel_avatars\">Avatar sub-channel</string>\n    <string name=\"image_quality_none\">Jangan tampilkan gambar</string>\n    <string name=\"image_quality_high\">Kualitas tinggi</string>\n    <string name=\"image_quality_medium\">Kualitas sedang</string>\n    <string name=\"metadata_uploader_avatars\">Avatar pengunggah</string>\n    <string name=\"image_quality_summary\">Pilih kualitas dan visibilitas gambar, untuk mengurangi penggunaan data dan memori. Perubahan menghapus cache dalam diska dan memori - %s</string>\n    <string name=\"metadata_thumbnails\">Keluku</string>\n    <string name=\"share_playlist_with_list\">Bagikan daftar URL</string>\n    <string name=\"share_playlist_with_titles\">Bagikan dengan Judul</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">Bagikan Daftar Putar</string>\n    <string name=\"metadata_banners\">Panji</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"notification_actions_summary_android13\">Sentuh untuk menyunting tindakan notifikasi di bawah. Tiga tindakan pertama (mainkan/jeda, sebelumnya dan selanjutnya) disetel oleh sistem dan tidak bisa dikustomisasi.</string>\n    <string name=\"show_less\">Tampilkan lebih sedikit</string>\n    <string name=\"show_more\">Tampilkan lebih banyak</string>\n    <plurals name=\"replies\">\n        <item quantity=\"other\">%s balasan</item>\n    </plurals>\n    <string name=\"error_insufficient_storage\">Tidak ada ruang yang cukup pada perangkat</string>\n    <string name=\"yes\">Ya</string>\n    <string name=\"no\">Tidak</string>\n    <string name=\"reset_settings_title\">Atur ulang pengaturan</string>\n    <string name=\"reset_settings_summary\">Atur ulang pengaturan ke nilai bawaan</string>\n    <string name=\"reset_all_settings\">Mengatur ulang semua pengaturan akan mengabaikan pengaturan Anda yang disukai dan memulai ulang aplikasi.\n\\n\n\\nApakah Anda yakin ingin melanjutkan?</string>\n    <string name=\"auto_update_check_description\">NewPipe dapat memeriksa versi baru secara berkala dan memberi tahu Anda ketika ada yang baru.\n\\nApakah Anda ingin mengaktifkan ini?</string>\n    <string name=\"settings_category_backup_restore_title\">Cadangkan dan pulihkan</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">sekunder</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Daftar putar</string>\n    <string name=\"tab_bookmarks_short\">Daftar putar</string>\n    <string name=\"feed_group_page_summary\">Halaman grup saluran</string>\n    <string name=\"no_feed_group_created_yet\">Belum ada grup umpan yang dibuat</string>\n    <string name=\"select_a_feed_group\">Pilih grup umpan</string>\n    <string name=\"search_with_service_name\">Cari %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Cari %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Suka</string>\n    <string name=\"migration_info_6_7_title\">Halaman Top 50 SoundCloud dihapus</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud telah menghentikan dukungan tangga lagu Top 50. Tab terkait telah dihapus dari halaman utama Anda.</string>\n    <string name=\"permission_display_over_apps_message\">Untuk menggunakan Pemutar Sembul, silakan pilih %1$s dalam menu pengaturan Android berikut dan aktifkan %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"Izinkan menampilkan di atas aplikasi\\\"</string>\n    <string name=\"delete_file\">Hapus berkas</string>\n    <string name=\"delete_entry\">Hapus entri</string>\n    <string name=\"account_terminated_service_provides_reason\">Akun dihapus\\n\\n%1$s menyediakan alasan ini: %2$s</string>\n    <string name=\"migration_info_7_8_title\">Tren terpadu YouTube dihilangkan</string>\n    <string name=\"migration_info_7_8_message\">YouTube telah mengakhiri halaman tren terpadu pada 21 Juli 2025. NewPipe mengganti halaman tren bawaan dengan tren siaran langsung.\\n\\nAnda juga dapat memilih halaman tren berbeda dalam \\\"Pengaturan &gt; Konten &gt; Konten di halaman utama\\\".</string>\n    <string name=\"trending_gaming\">Tren permainan</string>\n    <string name=\"trending_podcasts\">Tren siniar</string>\n    <string name=\"trending_movies\">Tren film dan acara</string>\n    <string name=\"trending_music\">Tren musik</string>\n    <string name=\"entry_deleted\">Entri dihapus</string>\n    <string name=\"player_http_403\">Kesalahan HTTP 403 diterima dari server saat memutar, dapat disebabkan oleh URL streaming kedaluwarsa atau pemblokiran IP</string>\n    <string name=\"player_http_invalid_status\">Kesalahan HTTP %1$s diterima dari server saat memutar</string>\n    <string name=\"youtube_player_http_403\">Kesalahan HTTP 403 diterima dari server saat memutar, dapat disebabkan oleh pemblokiran IP atau masalah deobfuskasi URL streaming</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s menolak memberikan data, meminta login untuk memastikan peminta bukan bot.\\n\\nAlamat IP Anda mungkin telah diblokir sementara oleh %1$s, Anda dapat menunggu beberapa saat atau beralih ke alamat IP yang berbeda (misalnya dengan mengaktifkan/menonaktifkan VPN, atau beralih dari WiFi ke data seluler).</string>\n    <string name=\"unsupported_content_in_country\">Konten ini tidak tersedia untuk negara konten yang saat ini dipilih.\\n\\nUbah pilihan Anda dari “Pengaturan &gt; Konten &gt; Negara konten bawaan”.</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-is/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Ýttu á stækkunarglerið til að byrja.</string>\n    <string name=\"cancel\">Hætta við</string>\n    <string name=\"search\">Leita</string>\n    <string name=\"use_external_video_player_title\">Nota utanaðkomandi myndspilara</string>\n    <string name=\"ok\">Í lagi</string>\n    <string name=\"open_in_browser\">Opna í vafra</string>\n    <string name=\"open_with\">Opna með</string>\n    <string name=\"controls_download_desc\">Sækja streymisskrá</string>\n    <string name=\"settings\">Stillingar</string>\n    <string name=\"upload_date_text\">Birt %1$s</string>\n    <string name=\"no_player_found\">Enginn streymisspilari fannst. Setja upp VLC?</string>\n    <string name=\"open_in_popup_mode\">Opna í sprettglugga</string>\n    <string name=\"download\">Sækja</string>\n    <string name=\"no_player_found_toast\">Enginn streymisspilari fannst (þú getur sett upp VLC til að spila það).</string>\n    <string name=\"install\">Setja upp</string>\n    <string name=\"import_data_summary\">Núverandi áskriftum, spilunarlistum, feril og (valfrjálst) stillingum verður skipt út</string>\n    <string name=\"export_data_summary\">Flytja út feril, áskriftir, spilunarlista og stillingar</string>\n    <string name=\"trending\">Vinsælt</string>\n    <string name=\"import_file_title\">Flytja inn skrá</string>\n    <string name=\"share_dialog_title\">Deila með</string>\n    <string name=\"mark_as_watched\">Merkja sem séð</string>\n    <string name=\"share\">Deila</string>\n    <string name=\"unknown_quality\">Óþekkt gæði</string>\n    <string name=\"did_you_mean\">Áttirðu við „%1$s\\?“</string>\n    <string name=\"search_showing_result_for\">Niðurstöður fyrir: %s</string>\n    <string name=\"tab_subscriptions\">Áskriftir</string>\n    <string name=\"streams_notification_channel_description\">Tilkynningar um ný streymi fyrir áskriftir</string>\n    <string name=\"subscriptions_export_unsuccessful\">Ekki tókst að flytja út áskriftir</string>\n    <string name=\"no_channel_subscribed_yet\">Engar áskriftir ennþá</string>\n    <string name=\"subscriptions_import_unsuccessful\">Ekki tókst að flytja inn áskriftir</string>\n    <string name=\"import_youtube_instructions\">Flytja inn YouTube áskriftir frá Google takeout:\n\\n\n\\n1) Farðu á: %1$s\n\\n2) Skráðu þig inn þegar spurt er.\n\\n3) Smelltu á „Öll gögn innifalin,“ síðan á „Afvelja allt,“ veldu síðan aðeins „áskriftir“ og smelltu á „Í lagi.“\n\\n4) Smelltu á „Næsta skref“ og síðan á „Búa til útflutning.“\n\\n5) Smelltu á \\\"Sækja\\\" hnappinn eftir að hann birtist.\n\\n6) Smelltu á FLYTJA INN SKRÁ fyrir neðan og veldu .zip skrána.\n\\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á.</string>\n    <string name=\"use_external_audio_player_title\">Nota utanaðkomandi hljóðspilara</string>\n    <string name=\"app_description\">Frjáls og léttur streymisspilari fyrir Android.</string>\n    <string name=\"title_activity_about\">Um NewPipe</string>\n    <string name=\"channel_unsubscribed\">Áskrift hætt</string>\n    <string name=\"unsubscribe\">Hætta áskrift</string>\n    <string name=\"empty_list_subtitle\">Allt er tómt</string>\n    <string name=\"app_license\">NewPipe er „copyleft“ frjáls hugbúnaður: Þú getur notað, rannsakað, deilt og bætt honum að vild. Þú getur endurdreift og breytt því samkvæmt skilmálum GNU GPL notendaleyfi eins og það er gefið út af Frjálsa Hugbúnaðarstofnuninni, annað hvort útgáfu 3 af leyfinu, eða (að eigin vali) hvaða síðari útgáfu sem er.</string>\n    <string name=\"subscribed_button_title\">Í áskrift</string>\n    <string name=\"tab_bookmarks\">Bókamerktir spilunarlistar</string>\n    <string name=\"notification_channel_name\">NewPipe tilkynning</string>\n    <string name=\"notification_channel_description\">Tilkynningar fyrir spilara NewPipe</string>\n    <string name=\"app_update_notification_channel_description\">Tilkynningar fyrir nýjar útgáfur NewPipe</string>\n    <string name=\"clear_cookie_summary\">Hreinsa vefkökur sem NewPipe geymir þegar þú leysir reCAPTCHA</string>\n    <string name=\"error_report_notification_title\">NewPipe rakst á villu, ýttu til að tilkynna hana</string>\n    <string name=\"tab_about\">Um okkur og algengar spurningar</string>\n    <string name=\"subscribe_button_title\">Gerast áskrifandi</string>\n    <string name=\"show_higher_resolutions_summary\">Aðeins sum tæki geta spilað 2K/4K myndskeið</string>\n    <string name=\"play_with_kodi_title\">Spila með Kodi</string>\n    <string name=\"show_play_with_kodi_summary\">Birta hnapp til að spila myndskeið í gegnum Kodi margmiðlunarmiðstöð</string>\n    <string name=\"crash_the_player\">Láta spilarann hrynja</string>\n    <string name=\"default_audio_format_title\">Sjálfgefið hljóðsnið</string>\n    <string name=\"clear_queue_confirmation_summary\">Að skipta úr einum spilara í annan getur ruglað röðina þína</string>\n    <string name=\"show_comments_summary\">Slökktu á til að fela ummæli</string>\n    <string name=\"show_next_and_similar_title\">Sýna „Næstu“ og „Svipuð“ myndskeið</string>\n    <string name=\"notification_scale_to_square_image_title\">1:1 smámyndir</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"invalid_directory\">Engin slík mappa</string>\n    <string name=\"permission_display_over_apps\">Gefðu leyfi til að birta yfir önnur forrit</string>\n    <string name=\"error_report_notification_toast\">Villa kom upp, sjáðu tilkynninguna</string>\n    <string name=\"default_video_format_title\">Sjálfgefið skráasnið myndskeiða</string>\n    <string name=\"night_theme_title\">Næturþema</string>\n    <string name=\"popup_remember_size_pos_summary\">Muna síðustu stærð og stöðu sprettiglugga</string>\n    <string name=\"show_description_title\">Sýna lýsingu</string>\n    <string name=\"subtitle_activity_recaptcha\">Pikkaðu á \\\"Lokið\\\" þegar það er leyst</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s að horfa</item>\n        <item quantity=\"other\">%s að horfa</item>\n    </plurals>\n    <string name=\"no_one_watching\">Еnginn еr að horfa</string>\n    <string name=\"infinite_videos\">∞ myndskeið</string>\n    <string name=\"settings_file_charset_title\">Leyfðir stafir í skráarnöfnum</string>\n    <string name=\"charset_letters_and_digits\">Bókstafir og tölustafir</string>\n    <string name=\"main_page_content_summary\">Hvaða flipar eru sýndir á aðalsíðunni</string>\n    <string name=\"blank_page_summary\">Auð síða</string>\n    <string name=\"new_and_hot\">Nýtt og heitt</string>\n    <string name=\"recently_added\">Nýlega bætt við</string>\n    <string name=\"start_here_on_popup\">Spila í sprettiglugga</string>\n    <string name=\"always_ask_open_action\">Alltaf spyrja</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Sækir upplýsingar…</string>\n    <string name=\"select_a_playlist\">Veldu spilunarlista</string>\n    <string name=\"channel_page_summary\">Rásarsíða</string>\n    <string name=\"select_a_channel\">Veldu rás</string>\n    <string name=\"error_details_headline\">Nánar:</string>\n    <string name=\"comments_tab_description\">Ummæli</string>\n    <string name=\"most_liked\">Vinsælt</string>\n    <string name=\"play_queue_audio_settings\">Hljóðstillingar</string>\n    <string name=\"start_here_on_background\">Spila í bakgrunni</string>\n    <string name=\"preferred_open_action_settings_summary\">Þegar hlekkur er opnaður — %s</string>\n    <string name=\"detail_dislikes_img_view_description\">Líkar ekki við</string>\n    <string name=\"retry\">Reyna aftur</string>\n    <string name=\"description_tab_description\">Lýsing</string>\n    <string name=\"audio\">Hljóð</string>\n    <string name=\"start\">Byrja</string>\n    <string name=\"dismiss\">Hunsa</string>\n    <string name=\"download_path_dialog_title\">Veldu möppu fyrir sótt myndskeið</string>\n    <string name=\"download_path_audio_dialog_title\">Veldu möppu fyrir sóttar hljóðskrár</string>\n    <string name=\"download_path_audio_summary\">Sóttar hljóðskrár fara hingað</string>\n    <string name=\"default_popup_resolution_title\">Sjálfgefin upplausn sprettiglugga</string>\n    <string name=\"show_higher_resolutions_title\">Sýna hærri upplausnir</string>\n    <string name=\"pause\">Gera hlé</string>\n    <string name=\"create\">Skapa</string>\n    <string name=\"delete\">Eyða</string>\n    <string name=\"rename\">Endurnefna</string>\n    <string name=\"msg_name\">Skráarnafn</string>\n    <string name=\"private_content\">Þetta efni er ekki opinbert — það er ekki hægt að streyma því eða sækja með NewPipe.</string>\n    <string name=\"open_website_license\">Opna vefsíðu</string>\n    <string name=\"settings_category_downloads_title\">Niðurhal</string>\n    <string name=\"settings_category_player_behavior_title\">Hegðun</string>\n    <string name=\"settings_category_updates_title\">Uppfærslur</string>\n    <string name=\"downloads\">Sótt gögn</string>\n    <string name=\"settings_category_video_audio_title\">Mynd og hljóð</string>\n    <string name=\"app_language_title\">Tungumál forrits</string>\n    <string name=\"play_audio\">Hljóð</string>\n    <string name=\"autoplay_title\">Sjálfvirk spilun</string>\n    <string name=\"dark_theme_title\">Dökk</string>\n    <string name=\"app_license_title\">Hugbúnaðarleyfi NewPipe</string>\n    <string name=\"settings_category_appearance_title\">Útlit</string>\n    <string name=\"settings_category_history_title\">Ferill og skyndiminni</string>\n    <string name=\"msg_running\">NewPipe er að sækja</string>\n    <string name=\"website_encouragement\">Fyrir frekari upplýsingar og nýjustu fréttir um NewPipe geturðu skoðað heimasíðu okkar.</string>\n    <string name=\"privacy_policy_title\">Persónuverndarstefna NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe verkefnið tekur friðhelgi þína mjög alvarlega. Þess vegna safnar forritið ekkert án samþykkis þíns.\n\\nPersónuverndarstefna NewPipe útskýrir í smáatriðum hvaða gögn eru send og geymd þegar þú sendir hrunskýrslu.</string>\n    <string name=\"settings_category_player_title\">Spilari</string>\n    <string name=\"settings_category_debug_title\">Aflúsa</string>\n    <string name=\"content_language_title\">Sjálfgefið tungumál efnis</string>\n    <string name=\"metadata_language\">Tungumál</string>\n    <string name=\"controls_add_to_playlist_title\">Bæta við</string>\n    <string name=\"controls_popup_title\">Sprettiglugga</string>\n    <string name=\"notification_action_repeat\">Endurtaka</string>\n    <string name=\"black_theme_title\">Svört</string>\n    <string name=\"auto_queue_title\">Setja næsta streymi sjálfkrafa í biðröð</string>\n    <string name=\"notification_action_shuffle\">Stokka</string>\n    <string name=\"content\">Innihald</string>\n    <string name=\"notification_action_nothing\">Ekkert</string>\n    <string name=\"clear\">Hreinsa</string>\n    <string name=\"theme_title\">Þema</string>\n    <string name=\"light_theme_title\">Ljós</string>\n    <string name=\"undo\">Afturkalla</string>\n    <string name=\"always\">Alltaf</string>\n    <string name=\"general_error\">Villa</string>\n    <string name=\"use_external_video_player_summary\">Fjarlægir hljóð í sumum upplausnum</string>\n    <string name=\"subscription_change_failed\">Gat ekki breytt áskrift</string>\n    <string name=\"subscription_update_failed\">Gat ekki uppfært áskrift</string>\n    <string name=\"show_info\">Sýna upplýsingar</string>\n    <string name=\"controls_background_title\">Í bakgrunni</string>\n    <string name=\"tab_choose\">Veldu flipa</string>\n    <string name=\"download_path_title\">Mappa fyrir sótt myndskeið</string>\n    <string name=\"download_path_summary\">Sótt myndskeið fara hingað</string>\n    <string name=\"download_path_audio_title\">Mappa fyrir sóttar hljóðskrár</string>\n    <string name=\"default_resolution_title\">Sjálfgefin upplausn</string>\n    <string name=\"kore_not_found\">Kore forritið fannst ekki, setja það upp\\?</string>\n    <string name=\"show_play_with_kodi_title\">Sýna \\\"Spila með Kodi\\\" hnapp</string>\n    <string name=\"notification_scale_to_square_image_summary\">Skera smámynd myndskeiðs sem sýnd er í tilkynningum úr 16:9 niður í 1:1 stærðarhlutföll</string>\n    <string name=\"notification_action_2_title\">Þriðji aðgerðahnappur</string>\n    <string name=\"notification_action_1_title\">Annar aðgerðahnappur</string>\n    <string name=\"notification_action_0_title\">Fyrsti aðgerðahnappur</string>\n    <string name=\"notification_action_3_title\">Fjórði aðgerðahnappur</string>\n    <string name=\"notification_action_4_title\">Fimmti aðgerðahnappur</string>\n    <string name=\"notification_actions_at_most_three\">Þú getur valið mest þrjár aðgerðir til að birta í samþjöppuðum tilkynningum.!</string>\n    <string name=\"notification_action_buffering\">Í vinnslu</string>\n    <string name=\"notification_colorize_title\">Litaðar tilkynningar</string>\n    <string name=\"notification_colorize_summary\">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)</string>\n    <string name=\"popup_remember_size_pos_title\">Muna eiginleika sprettiglugga</string>\n    <string name=\"use_inexact_seek_title\">Nota hröð en ónákvæm hopp</string>\n    <string name=\"seek_duration_title\">Lengd hopps</string>\n    <string name=\"clear_queue_confirmation_title\">Biðja um staðfestingu áður en röð er hreinsuð</string>\n    <string name=\"show_comments_title\">Sýna ummæli</string>\n    <string name=\"auto_queue_toggle\">Sjálfvirk biðröð</string>\n    <string name=\"settings_category_clear_data_title\">Hreinsa gögn</string>\n    <string name=\"download_dialog_title\">Sækja</string>\n    <string name=\"duration_live\">Í beinni</string>\n    <string name=\"downloads_title\">Sótt gögn</string>\n    <string name=\"all\">Allt</string>\n    <string name=\"channels\">Rásir</string>\n    <string name=\"playlists\">Spilunarlistar</string>\n    <string name=\"videos_string\">Myndskeið</string>\n    <string name=\"tracks\">Spor</string>\n    <string name=\"users\">Notendur</string>\n    <string name=\"events\">Viðburðir</string>\n    <string name=\"songs\">Lög</string>\n    <string name=\"albums\">Plötur</string>\n    <string name=\"artists\">Flytjendur</string>\n    <string name=\"disabled\">Óvirkt</string>\n    <string name=\"file\">Skrá</string>\n    <string name=\"notifications\">Tilkynningar</string>\n    <string name=\"unknown_content\">[Óþekkt]</string>\n    <string name=\"clear_views_history_title\">Hreinsa áhorfsferil</string>\n    <string name=\"missing_file\">Skrá færð eða eytt</string>\n    <string name=\"invalid_file\">Skráin er ekki til eða aðgangi var hafnað</string>\n    <string name=\"file_name_empty_error\">Skráarnafn má ekki vera autt</string>\n    <string name=\"copy_for_github\">Afrita sniðna skýrslu</string>\n    <string name=\"error_report_open_issue_button_text\">Tilkynna á GitHub</string>\n    <string name=\"restore_defaults\">Endurheimta sjálfgefnar stillingar</string>\n    <string name=\"restore_defaults_confirmation\">Viltu endurheimta sjálfgefnar stillingar\\?</string>\n    <string name=\"sorry_string\">Æi, þetta ætti ekki að gerast.</string>\n    <string name=\"error_report_button_text\">Tilkynna með tölvupósti</string>\n    <string name=\"error_snackbar_action\">Tilkynna</string>\n    <string name=\"what_device_headline\">Upplýsingar:</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_snackbar_message\">Því miður fór eitthvað úrskeiðis.</string>\n    <string name=\"detail_likes_img_view_description\">Líkar við</string>\n    <string name=\"what_happened_headline\">Það sem gerðist:</string>\n    <string name=\"info_labels\">Hvað:\\nBeiðni:\\nTungumál efnis:\\nLandsvæði efnis:\\nTungumál forrits:\\nÞjónusta:\\nTímastimpill:\\nPakki:\\nÚtgáfa:\\nÚtgáfa stýrikerfis:</string>\n    <string name=\"your_comment\">Athugasemd þín (á ensku):</string>\n    <string name=\"search_no_results\">Engar niðurstöður</string>\n    <string name=\"video\">Myndskeið</string>\n    <string name=\"no_views\">Engin áhorf</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s áhorf</item>\n        <item quantity=\"other\">%s áhorf</item>\n    </plurals>\n    <string name=\"detail_drag_description\">Dragðu til að endurraða</string>\n    <string name=\"no_subscribers\">Engir áskrifendur</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s áskrifandi</item>\n        <item quantity=\"other\">%s áskrifendur</item>\n    </plurals>\n    <string name=\"no_one_listening\">Engin er að hlusta</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s að hlusta</item>\n        <item quantity=\"other\">%s að hlusta</item>\n    </plurals>\n    <string name=\"no_videos\">Engin myndskeið</string>\n    <string name=\"more_than_100_videos\">100+ myndskeið</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s myndskeið</item>\n        <item quantity=\"other\">%s myndskeið</item>\n    </plurals>\n    <string name=\"no_comments\">Engin ummæli</string>\n    <string name=\"comments_are_disabled\">Ummæli eru óvirk</string>\n    <string name=\"checksum\">Gátsumma</string>\n    <string name=\"msg_threads\">Þræðir</string>\n    <string name=\"msg_error\">Villa</string>\n    <string name=\"msg_running_detail\">Ýttu til að fá nánari upplýsingar</string>\n    <string name=\"msg_wait\">Bíddu aðeins…</string>\n    <string name=\"msg_copied\">Afritað á klemmuspjald</string>\n    <string name=\"one_item_deleted\">1 atriði eytt.</string>\n    <string name=\"recaptcha_solve\">Leysa</string>\n    <string name=\"done\">Lokið</string>\n    <string name=\"recaptcha_request_toast\">Beðið eftir þraut reCAPTCHA</string>\n    <string name=\"title_licenses\">Leyfi þriðja aðila</string>\n    <string name=\"tab_licenses\">Hugbúnaðarleyfi</string>\n    <string name=\"copyright\">© %1$s • %2$s • %3$s</string>\n    <string name=\"contribution_title\">Taka þátt</string>\n    <string name=\"contribution_encouragement\">Allt er velkomið — hugmyndir, þýðingar, endurhönnun, kóðahreinsun eða miklar kóðabreytingar. Því fleiri, því betra!</string>\n    <string name=\"view_on_github\">Skoða á GitHub</string>\n    <string name=\"donation_title\">Gefa pening</string>\n    <string name=\"give_back\">Gefa</string>\n    <string name=\"website_title\">Vefsíða</string>\n    <string name=\"read_privacy_policy\">Lesa persónuverndarstefnu</string>\n    <string name=\"title_activity_history\">Áhorf</string>\n    <string name=\"action_history\">Áhorf</string>\n    <string name=\"read_full_license\">Lesa leyfi</string>\n    <string name=\"title_last_played\">Nýlega spilað</string>\n    <string name=\"title_most_played\">Mest spilað</string>\n    <string name=\"main_page_content\">Aðalsíða</string>\n    <string name=\"export_complete_toast\">Flutt út</string>\n    <string name=\"import_complete_toast\">Flutt inn</string>\n    <string name=\"local\">Staðbundið</string>\n    <string name=\"play_queue_remove\">Fjarlægja</string>\n    <string name=\"play_queue_stream_detail\">Nánar</string>\n    <string name=\"could_not_import_all_files\">Ath: gat ekki flutt inn allar skrár.</string>\n    <string name=\"import_settings\">Viltu einnig flytja inn stillingar\\?</string>\n    <string name=\"error_unable_to_load_comments\">Gat ekki hlaðið ummælum</string>\n    <string name=\"top_50\">Topp 50</string>\n    <string name=\"enqueue_stream\">Setja í röð</string>\n    <string name=\"enqueued\">Í röð</string>\n    <string name=\"show_channel_details\">Sýna upplýsingar um rás</string>\n    <string name=\"loading_stream_details\">Hleður inn upplýsingum um streymi…</string>\n    <string name=\"preferred_open_action_settings_title\">Þegar hlekkur er opnaður</string>\n    <string name=\"video_player\">Myndspilari</string>\n    <string name=\"background_player\">Bakgrunnsspilari</string>\n    <string name=\"popup_player\">Sprettigluggaspilari</string>\n    <string name=\"create_playlist\">Nýr spilunarlisti</string>\n    <string name=\"rename_playlist\">Endurnefna</string>\n    <string name=\"name\">Nafn</string>\n    <string name=\"add_to_playlist\">Bæta við á spilunarlista</string>\n    <string name=\"processing_may_take_a_moment\">Í gangi… Bíddu aðeins</string>\n    <string name=\"set_as_playlist_thumbnail\">Setja sem smámynd spilunarlista</string>\n    <string name=\"resize_fit\">Passa</string>\n    <string name=\"resize_fill\">Fylla</string>\n    <string name=\"resize_zoom\">Þysja</string>\n    <string name=\"caption_auto_generated\">Sjálfvirkur</string>\n    <string name=\"caption_setting_title\">Skýringartexti</string>\n    <string name=\"import_title\">Flytja inn</string>\n    <string name=\"import_ongoing\">Flytur inn…</string>\n    <string name=\"start_accept_privacy_policy\">Í samræmi við almenna persónuverndarreglugerðin ESB vekjum við athygli þína á persónuverndarstefnu NewPipe. Lestu hana vandlega. \\nÞú verður að samþykkja hana til að senda okkur villuskýrsluna.</string>\n    <string name=\"playback_tempo\">Hraði</string>\n    <string name=\"playback_pitch\">Tónhæð</string>\n    <string name=\"playback_step\">Skref</string>\n    <string name=\"playback_reset\">Endurstilla</string>\n    <string name=\"percent\">Hlutfall</string>\n    <string name=\"semitone\">Hálftónn</string>\n    <string name=\"accept\">Samþykkja</string>\n    <string name=\"decline\">Afneita</string>\n    <string name=\"updates_setting_title\">Uppfærslur</string>\n    <string name=\"auto\">Sjálfvirkt</string>\n    <string name=\"missions_header_finished\">Lokið</string>\n    <string name=\"missions_header_pending\">Í bið</string>\n    <string name=\"paused\">Í hléi</string>\n    <string name=\"queued\">í röð</string>\n    <string name=\"post_processing\">eftirvinnsla</string>\n    <string name=\"enqueue\">Setja í röð</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Skrá sótt</item>\n        <item quantity=\"other\">%s skrár sóttar</item>\n    </plurals>\n    <string name=\"overwrite\">Yfirskrifa</string>\n    <string name=\"stop\">Hætta</string>\n    <string name=\"close\">Loka</string>\n    <string name=\"systems_language\">Sjálfgefið í kerfinu</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d klst</item>\n        <item quantity=\"other\">%d klst</item>\n    </plurals>\n    <string name=\"feed_create_new_group_button_title\">Búa til</string>\n    <string name=\"metadata_licence\">Leyfi</string>\n    <string name=\"metadata_privacy\">Sýnileiki</string>\n    <string name=\"metadata_support\">Stuðningur</string>\n    <string name=\"metadata_privacy_public\">Opinber</string>\n    <string name=\"metadata_privacy_private\">Einka</string>\n    <string name=\"metadata_privacy_internal\">Innri</string>\n    <string name=\"mute\">Slökkva á hljóði</string>\n    <string name=\"unmute\">Kveikja á hljóði</string>\n    <string name=\"playlist_add_stream_success\">Bætt á spilunarlista</string>\n    <string name=\"export_ongoing\">Flytur út…</string>\n    <string name=\"minimize_on_exit_none_description\">Ekki gera neitt</string>\n    <string name=\"never\">Aldrei</string>\n    <string name=\"list\">Listi</string>\n    <string name=\"grid\">Hnitanet</string>\n    <string name=\"metadata_host\">Netþjónn</string>\n    <string name=\"metadata_privacy_unlisted\">Óskráður</string>\n    <string name=\"recent\">Nýleg</string>\n    <string name=\"chapters\">Kaflar</string>\n    <string name=\"featured\">Úrvals</string>\n    <string name=\"radio\">Útvarp</string>\n    <string name=\"metadata_category\">Flokkur</string>\n    <string name=\"metadata_tags\">Merki</string>\n    <string name=\"donation_encouragement\">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.</string>\n    <string name=\"show_description_summary\">Slökktu á til að fela lýsingu og viðbótarupplýsingar myndskeiðs</string>\n    <string name=\"error_occurred_detail\">Villa kom upp: %1$s</string>\n    <string name=\"title_activity_recaptcha\">Þraut reCAPTCHA</string>\n    <string name=\"subscribers_count_not_available\">Fjöldi áskrifenda ekki tiltækur</string>\n    <string name=\"playlist_page_summary\">Spilunarlistasíða</string>\n    <string name=\"show_thumbnail_title\">Sýna smámynd</string>\n    <string name=\"feed_processing_message\">Í vinnslu…</string>\n    <string name=\"feed_update_threshold_option_always_update\">Alltaf uppfæra</string>\n    <string name=\"metadata_cache_wipe_title\">Tæma skyndiminni lýsigagna</string>\n    <string name=\"show_meta_info_title\">Sýna lýsigögn</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Skyndiminni mynda tæmt</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Skyndiminni lýsigagna tæmt</string>\n    <string name=\"show_search_suggestions_title\">Leitartillögur</string>\n    <string name=\"local_search_suggestions\">Staðbundnar leitartillögur</string>\n    <string name=\"enable_search_history_title\">Leitarferill</string>\n    <string name=\"enable_watch_history_title\">Áhorfsferill</string>\n    <string name=\"enable_playback_resume_title\">Halda áfram</string>\n    <string name=\"remote_search_suggestions\">Fjarleitar leitartillögur</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Halda áfram</string>\n    <string name=\"unsupported_url\">Óstudd vefslóð</string>\n    <string name=\"default_content_country_title\">Sjálfgefið landsvæði efnis</string>\n    <string name=\"peertube_instance_url_title\">PeerTube þjónar</string>\n    <string name=\"peertube_instance_add_title\">Bæta við</string>\n    <string name=\"peertube_instance_add_help\">Sláðu inn slóð tilviks</string>\n    <string name=\"peertube_instance_add_exists\">Tilvik er þegar til</string>\n    <string name=\"settings_category_player_notification_title\">Tilkynning spilara</string>\n    <string name=\"background_player_playing_toast\">Bakgrunnsspilun</string>\n    <string name=\"error_report_title\">Villuskýrsla</string>\n    <string name=\"best_resolution\">Besta upplausn</string>\n    <string name=\"file_deleted\">Skrá eytt</string>\n    <string name=\"play_all\">Spila allt</string>\n    <string name=\"just_once\">Bara einu sinni</string>\n    <string name=\"streams_notification_channel_name\">Nýtt efni</string>\n    <string name=\"app_update_notification_channel_name\">Tilkynning um uppfærslu</string>\n    <string name=\"import_data_title\">Flytja inn gagnagrunn</string>\n    <string name=\"export_data_title\">Flytja út gagnagrunn</string>\n    <string name=\"network_error\">Netvilla</string>\n    <string name=\"content_not_available\">Efni ekki tiltækt</string>\n    <string name=\"app_ui_crash\">Forrit/viðmót hrundi</string>\n    <string name=\"related_items_tab_description\">Tengd efni</string>\n    <string name=\"msg_calculating_hash\">Að reikna gátsummu</string>\n    <string name=\"settings_file_replacement_character_title\">Stafur sem kemur í staðinn</string>\n    <string name=\"kiosk_page_summary\">Sölusíða</string>\n    <string name=\"default_kiosk_page_summary\">Sjálfgefin sölusíða</string>\n    <string name=\"conferences\">Fjarfundar</string>\n    <string name=\"title_activity_play_queue\">Spilunarröð</string>\n    <string name=\"enqueue_next_stream\">Bæta við</string>\n    <string name=\"enqueued_next\">Í röð næst</string>\n    <string name=\"drawer_open\">Opna skúffu</string>\n    <string name=\"drawer_close\">Loka skúffu</string>\n    <string name=\"playlist_creation_success\">Spilunarlisti búinn til</string>\n    <string name=\"bookmark_playlist\">Bókamerkja spilunarlista</string>\n    <string name=\"unbookmark_playlist\">Fjarlægja bókamerki</string>\n    <string name=\"delete_playlist_prompt\">Eyða þessum spilunarlista\\?</string>\n    <string name=\"playlist_thumbnail_change_success\">Smámynd spilunarlista breytt.</string>\n    <string name=\"playlist_no_uploader\">Búið til sjálfkrafa (höfundur fannst ekki)</string>\n    <string name=\"caption_none\">Engin skýringartexti</string>\n    <string name=\"caption_setting_description\">Breyta leturstærð og útlit skýringartexta spilara. Þarf að endurræsa eftir breytingu</string>\n    <string name=\"leak_canary_not_available\">LeakCanary er ekki í boði</string>\n    <string name=\"enable_leak_canary_summary\">Vöktun minnisleka getur valdið því að forritið bregst ekki við</string>\n    <string name=\"show_memory_leaks\">Sýna minnisleka</string>\n    <string name=\"enable_disposed_exceptions_title\">Tilkynna utan-lífsferils villur</string>\n    <string name=\"import_from\">Flytja inn frá</string>\n    <string name=\"export_to\">Flytja út til</string>\n    <string name=\"previous_export\">Fyrri útflutningur</string>\n    <string name=\"import_soundcloud_instructions\">Flyttu inn SoundCloud reikningi með því að slá inn slóð þess eða auðkenni:\n\\n\n\\n1) Virkjaðu skrifborðsstillingu í vafra. Síðan er ekki fáanleg fyrir farsíma.\n\\n2) Farðu hingað: %1$s\n\\n3) Skráðu þig inn þegar spurt er.\n\\n4. Afritaðu slóðina sem þér var vísað á.</string>\n    <string name=\"import_network_expensive_warning\">Þessi aðgerð getur valdið mikla netnotkun.\n\\n\n\\nHalda áfram\\?</string>\n    <string name=\"playback_speed_control\">Spilunarhraði</string>\n    <string name=\"skip_silence_checkbox\">Spóla áfram í þögn</string>\n    <string name=\"limit_data_usage_none_description\">Engin takmörk</string>\n    <string name=\"limit_mobile_data_usage_title\">Takmarka upplausn þegar farsímagögn eru notuð</string>\n    <string name=\"enable_streams_notifications_title\">Tilkynningar um nýtt efni streyma</string>\n    <string name=\"enable_streams_notifications_summary\">Senda tilkynningar um nýtt efni áskrifta</string>\n    <string name=\"streams_notifications_interval_title\">Hversu oft á að athuga</string>\n    <string name=\"streams_notifications_network_title\">Tegund tengingar</string>\n    <string name=\"any_network\">Allar</string>\n    <string name=\"updates_setting_description\">Sýna tilkynningu þegar ný útgáfa er fáanleg</string>\n    <string name=\"check_for_updates\">Leita að uppfærslum</string>\n    <string name=\"manual_update_description\">Leita handvirkt fyrir uppfærslum</string>\n    <string name=\"minimize_on_exit_title\">Fela þegar skipt er um forrit</string>\n    <string name=\"minimize_on_exit_background_description\">Nota bakgrunnsspilara</string>\n    <string name=\"minimize_on_exit_popup_description\">Nota sprettigluggaspilara</string>\n    <string name=\"autoplay_summary\">Sjálfvirk spilun — %s</string>\n    <string name=\"minimize_on_exit_summary\">Aðgerð þegar skipt er yfir í annað forrit frá aðalmyndspilara — %s</string>\n    <string name=\"wifi_only\">Aðeins Wi-Fi</string>\n    <string name=\"list_view_mode\">Listasýn</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Forskoðun á smámynd hoppstiku</string>\n    <string name=\"high_quality_larger\">Hágæða (stærra)</string>\n    <string name=\"low_quality_smaller\">Lágæða (minna)</string>\n    <string name=\"dont_show\">Ekki sýna</string>\n    <string name=\"recovering\">að jafna sig</string>\n    <string name=\"download_failed\">Niðurhal mistókst</string>\n    <string name=\"show_error\">Sýna villu</string>\n    <string name=\"error_http_not_found\">Fannst ekki</string>\n    <string name=\"error_postprocessing_failed\">Eftirvinnsla mistókst</string>\n    <string name=\"error_timeout\">Tímamörk tengingar</string>\n    <string name=\"max_retry_msg\">Hámarks tilraunir</string>\n    <string name=\"start_downloads\">Byrja niðurhöl</string>\n    <string name=\"pause_downloads\">Gera hlé á niðurhali</string>\n    <string name=\"remove_watched\">Fjarlægja áhorf</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekúnda</item>\n        <item quantity=\"other\">%d sekúndur</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d mínúta</item>\n        <item quantity=\"other\">%d mínútur</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dagur</item>\n        <item quantity=\"other\">%d dagar</item>\n    </plurals>\n    <string name=\"fragment_feed_title\">Hvað er nýtt</string>\n    <string name=\"feed_groups_header_title\">Rásarhópar</string>\n    <string name=\"feed_notification_loading\">Hleður…</string>\n    <string name=\"settings_category_feed_title\">Streymi</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Veldu áskriftir</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d valin</item>\n        <item quantity=\"other\">%d valdar</item>\n    </plurals>\n    <string name=\"video_detail_by\">Frá %s</string>\n    <string name=\"account_terminated\">Reikningi lokað</string>\n    <string name=\"metadata_age_limit\">Aldurstakmark</string>\n    <string name=\"detail_pinned_comment_view_description\">Fest ummæli</string>\n    <string name=\"tablet_mode_title\">Spjaldtölvuhamur</string>\n    <string name=\"on\">Virkt</string>\n    <string name=\"off\">Óvirkt</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Sjálfgefinn ExoPlayer</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"get_notified\">Fá tilkynningu</string>\n    <string name=\"toggle_all\">Víxla öllu</string>\n    <string name=\"unknown_format\">Óþekkt snið</string>\n    <string name=\"clear_search_history_summary\">Eyðir ferli leitarorða</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Frá Android 10 er aðeins „Geymsluaðgangsrammi“ stutt</string>\n    <string name=\"downloads_storage_use_saf_summary\">„Geymsluaðgangsrammi“ (SAF) gerir þér kleift að vista skrár á ytra SD-kort</string>\n    <string name=\"choose_instance_prompt\">Veldu netþjón</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Sýna aðeins óflokkaðar áskriftir</string>\n    <string name=\"feed_load_error\">Villa við að hlaða streymi</string>\n    <string name=\"feed_load_error_account_info\">Gat ekki hlaðið streymi fyrir ‚%s.‘</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">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.</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Smámynd rásar</string>\n    <string name=\"soundcloud_go_plus_content\">Þetta er SoundCloud Go+ lag að minnsta kosti í þínu landi — það er ekki hægt að streyma því eða sækja með NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Þ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.</string>\n    <string name=\"description_select_note\">Þú 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.</string>\n    <string name=\"enable_search_history_summary\">Geyma leitarfyrirspurnir í tæki</string>\n    <string name=\"start_main_player_fullscreen_title\">Ræsa aðalspilara í fullskjásstillingu</string>\n    <string name=\"popup_playing_toast\">Sprettigluggaspilun</string>\n    <string name=\"restricted_video_no_stream\">Þetta myndskeið er með aldurstakmörk.\n\\nVegna nýrra reglna YouTube er ekki hægt að streyma því eða sækja með NewPipe.</string>\n    <string name=\"delete_playback_states_alert\">Eyða öllum spilunarstaðsetningum\\?</string>\n    <string name=\"watch_history_states_deleted\">Spilunarstaðsetningum eytt</string>\n    <string name=\"clear_search_history_title\">Hreinsa leitarferil</string>\n    <string name=\"delete_search_history_alert\">Hreinsa allan leitarferil\\?</string>\n    <string name=\"search_history_deleted\">Leitarferli eytt</string>\n    <string name=\"download_to_sdcard_error_title\">Ytri geymsla ekki tiltæk</string>\n    <string name=\"could_not_load_thumbnails\">Gat ekki hlaðið inn öllum smámyndum</string>\n    <string name=\"parsing_error\">Gat ekki túlkað vefsíðu</string>\n    <string name=\"could_not_setup_download_menu\">Gat ekki sett upp niðurhalsvalmynd</string>\n    <string name=\"player_stream_failure\">Ekki tókst að spila þetta streymi</string>\n    <string name=\"player_unrecoverable_failure\">Banvæn villa í spilaranum</string>\n    <string name=\"player_recoverable_failure\">Að jafna sig eftir villu í spilara</string>\n    <string name=\"external_player_unsupported_link_type\">Utanaðkomandi spilarar styðja ekki þessar tegundir tengla</string>\n    <string name=\"video_streams_empty\">Engin myndstreymi fundust</string>\n    <string name=\"audio_streams_empty\">Engin hljóðstreymi fundust</string>\n    <string name=\"invalid_source\">Ekkert slíkt efni fanst</string>\n    <string name=\"no_streams_available_download\">Engin streymi til að sækja</string>\n    <string name=\"saved_tabs_invalid_json\">Gat ekki lesið vistaða flipa þannig að mun nota sjálfgefna</string>\n    <string name=\"detail_thumbnail_view_description\">Spila myndskeið, lengd:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Smámynd höfundar</string>\n    <string name=\"drawer_header_description\">Víxla þjónustu. Nú valin:</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nýtt streymi</item>\n        <item quantity=\"other\">%s ný streymi</item>\n    </plurals>\n    <string name=\"no_available_dir\">Skilgreindu niðurhalsmöppu síðar í stillingunum</string>\n    <string name=\"no_dir_yet\">Engin niðurhalsmappa er stillt ennþá. Veldu sjálfgefna niðurhalsmöppu núna</string>\n    <string name=\"msg_popup_permission\">Þessa heimildar þarfnast til að\n\\nopna í sprettiglugga</string>\n    <string name=\"settings_file_replacement_character_summary\">Ógildum stöfum er skipt út með þessum</string>\n    <string name=\"charset_most_special_characters\">Flestir sérstafir</string>\n    <string name=\"delete_item_search_history\">Viltu eyða þessu atriði úr leitarferlinum\\?</string>\n    <string name=\"pause_downloads_on_mobile\">Gera hlé þegar skipt er yfir í farsímanet</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Sumir netþjónar styðja ekki hlé á niðurölum</string>\n    <string name=\"enable_queue_limit\">Takmarka niðurhalsröð</string>\n    <string name=\"enable_queue_limit_desc\">Eitt niðurhal í einu</string>\n    <string name=\"downloads_storage_ask_title\">Spyrja hvert ætti að sækja skrár</string>\n    <string name=\"downloads_storage_ask_summary\">Þú verður spurð(ur) hvert ætti að sækja skrár í hvert skipti.\n\\nVirkjaðu kerfismöppuval (SAF) ef þú vilt nota ytra SD-kort</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Þú verður spurð(ur) hvert ætti að sækja skrár í hvert skipti</string>\n    <string name=\"downloads_storage_use_saf_title\">Virkja kerfismöppuval (SAF)</string>\n    <string name=\"remove_watched_popup_title\">Fjarlægja streymi sem búið er að horfa á?</string>\n    <string name=\"feed_oldest_subscription_update\">Streymi síðast uppfært %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Ekki hlaðið: %d</string>\n    <string name=\"feed_new_items\">Ný atriði í streymi</string>\n    <string name=\"feed_group_dialog_empty_selection\">Engar áskriftir valdar</string>\n    <string name=\"feed_group_dialog_empty_name\">Tómt hópsnafn</string>\n    <string name=\"feed_group_dialog_delete_message\">Viltu eyða þessum hóp\\?</string>\n    <string name=\"feed_update_threshold_summary\">Hversu oft á að uppfæra streymi áður en áskrift er talin útrunnin — %s</string>\n    <string name=\"feed_update_threshold_title\">Takmörk á uppfærslu streymis</string>\n    <string name=\"feed_load_error_terminated\">Reikningur höfundar er lokaður.\\nNewPipe getur ekki sótt þetta streymi lengur.\\nViltu segja upp áskrift?</string>\n    <string name=\"feed_load_error_fast_unknown\">Hraðstreymishamurinn veitir ekki frekari upplýsingar um þetta.</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Virkja hraðstreymisham</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Afvirkja hraðstreymisham</string>\n    <string name=\"content_not_supported\">NewPipe styður ekki þetta efni.\n\\n\n\\nÞað verður vonandi stutt í framtíðarútgáfu.</string>\n    <string name=\"channel_created_by\">Skapað af %s</string>\n    <string name=\"show_thumbnail_summary\">Nota smámynd fyrir tilkynningar og bakgrunn lásskjás</string>\n    <string name=\"no_app_to_open_intent\">Ekkert forrit í tækinu þínu getur opnað þetta</string>\n    <string name=\"no_appropriate_file_manager_message\">Enginn viðeigandi skráastjóri fannst fyrir þessa aðgerð. \\nEndilega settu upp skráastjóra eða reyndu að slökkva á \\'%s\\' í niðurhalsstillingunum</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Enginn viðeigandi skráastjóri fannst fyrir þessa aðgerð. \\nSettu upp skráastjóra sem styður Storage Access Framework</string>\n    <string name=\"georestricted_content\">Þetta efni er ekki fáanlegt í þínu landi.</string>\n    <string name=\"paid_content\">Þ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.</string>\n    <string name=\"auto_device_theme_title\">Sjálfvirk (þema tækis)</string>\n    <string name=\"night_theme_summary\">Veldu uppáhalds næturþemu þína — %s</string>\n    <string name=\"select_night_theme_toast\">Þú getur valið uppáhalds næturþemu þína hér að neðan</string>\n    <string name=\"download_has_started\">Niðurhal hafið</string>\n    <string name=\"description_select_enable\">Virkja valham fyrir lýsinguna</string>\n    <string name=\"description_select_disable\">Afvirkja valham fyrir lýsinguna</string>\n    <string name=\"use_inexact_seek_summary\">Ó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</string>\n    <string name=\"enable_watch_history_summary\">Geyma áhorfsferil</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Halda áfram að spila eftir hlé (t.d. símtöl)</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"check_new_streams\">Byrja leit að nýjum streymum</string>\n    <string name=\"overwrite_failed\">get ekki skrifað yfir skrána</string>\n    <string name=\"delete_downloaded_files\">Eyða sóttum skrám</string>\n    <string name=\"confirm_prompt\">Viltu hreinsa niðurhalsferilinn eða eyða öllum sóttum skrám\\?</string>\n    <string name=\"no_video_streams_available_for_external_players\">Engin myndstreymi eru í boði fyrir utanaðkomandi spilara</string>\n    <string name=\"clear_cookie_title\">Eyða vefkökum reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Vefkökum reCAPTCHA eytt</string>\n    <string name=\"progressive_load_interval_title\">Stærð forhleðslu</string>\n    <string name=\"progressive_load_interval_summary\">Breyta stærð millibils forhleðslu (núna %s). Lægra gildi gæti flýtt fyrir hleðslu myndskeiðs í upphafi</string>\n    <string name=\"clear_queue_confirmation_description\">Biðröð spilarans verður skipt út</string>\n    <string name=\"show_meta_info_summary\">Slökktu á til að fela lýsigagnareiti með viðbótarupplýsingum um höfund streymis, efni streymis eða leitarbeiðni</string>\n    <string name=\"metadata_cache_wipe_summary\">Fjarlæga öll síðugögn úr skyndiminni</string>\n    <string name=\"auto_queue_summary\">Bæta svipuðum streymum við biðröðina þegar síðasta er spilað og endurspilun er ekki virkjuð</string>\n    <string name=\"show_search_suggestions_summary\">Veldu tillögur til að sýna þegar leitað er</string>\n    <string name=\"enable_playback_resume_summary\">Endurheimta síðustu spilunarstöðu</string>\n    <string name=\"enable_playback_state_lists_title\">Spilunarstöður í listum</string>\n    <string name=\"enable_playback_state_lists_summary\">Sýna spilunarstöður í listum</string>\n    <string name=\"show_hold_to_append_title\">Sýna ábendinguna „Haltu niðri til að bæta við spilunarröð“</string>\n    <string name=\"show_hold_to_append_summary\">Sýna ábendingu þegar ýtt er á bakgrunninn eða sprettihnappinn á myndskeiðinu í „Nánar:\\\"</string>\n    <string name=\"unsupported_url_dialog_message\">Óþekkt slóð. Opna með öðru forriti\\?</string>\n    <string name=\"peertube_instance_url_summary\">Veldu uppáhalds PeerTube tilvik þín</string>\n    <string name=\"peertube_instance_url_help\">Þú mátt finna tilviki á %s</string>\n    <string name=\"peertube_instance_add_fail\">Gat ekki staðfest tilvik</string>\n    <string name=\"peertube_instance_add_https_only\">Aðeins HTTPS vefslóðir eru studdar</string>\n    <string name=\"settings_category_player_notification_summary\">Stilla tilkynningu fyrir spilandi streymi</string>\n    <string name=\"show_age_restricted_content_title\">Sýna aldurstakmarkað efni</string>\n    <string name=\"show_age_restricted_content_summary\">Sýna efni sem hugsanlega hentar ekki börnum vegna þess að það hefur aldurstakmark (t.d. 18+)</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Kveikja á öryggisham YouTube</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube býður upp á öryggisham sem felur efni sem gæti hugsanlega verið óviðeigandi fyrir börn</string>\n    <string name=\"restricted_video\">Þetta myndskeið er með aldurstakmörk.\n\\n\n\\nKveiktu á „%1$s“ í stillingunum ef þú vilt sjá það.</string>\n    <string name=\"hash_channel_name\">Tilkynning um gátsummu myndskeiðs</string>\n    <string name=\"hash_channel_description\">Tilkynning um framvindu gátsummu myndskeiðs</string>\n    <string name=\"error_report_channel_name\">Villuskýrslutilkynning</string>\n    <string name=\"error_report_channel_description\">Tilkynningar um villur</string>\n    <string name=\"switch_to_background\">Skipta yfir í bakgrunn</string>\n    <string name=\"switch_to_popup\">Skipta yfir í sprettiglugga</string>\n    <string name=\"switch_to_main\">Skipta yfir í aðalspilara</string>\n    <string name=\"clear_views_history_summary\">Eyðir ferli spilaðra streyma og stöðum í spilun</string>\n    <string name=\"delete_view_history_alert\">Eyða áhorfsferil\\?</string>\n    <string name=\"watch_history_deleted\">Áhorfsferli eytt</string>\n    <string name=\"clear_playback_states_title\">Eyða spilunarstöðum</string>\n    <string name=\"clear_playback_states_summary\">Eyðir öllum spilunarstöðum</string>\n    <string name=\"download_to_sdcard_error_message\">Niðurhal á SD kort er ekki mögulegt. Endurstilla niðurhalsmöppu\\?</string>\n    <string name=\"main_page_content_swipe_remove\">Strjúktu til að fjarlægja</string>\n    <string name=\"no_playlist_bookmarked_yet\">Engir spilunarlistar bókamerktir ennþá</string>\n    <string name=\"select_a_kiosk\">Veldu sölusíðu</string>\n    <string name=\"no_valid_zip_file\">Engin gild ZIP safnskrá</string>\n    <string name=\"override_current_data\">Núverandi gögnum verður skipt út.</string>\n    <string name=\"hold_to_append\">Haltu niðri til að bæta við spilunarröð</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Hleður umbeðið efni</string>\n    <string name=\"show_original_time_ago_title\">Sýna upprunatíma á atriðum</string>\n    <string name=\"show_original_time_ago_summary\">Upprunalegir textar frá þjónustu verða sýnilegir í streymisatriðum</string>\n    <string name=\"disable_media_tunneling_title\">Slökkva á margmiðlagöngum</string>\n    <string name=\"disable_media_tunneling_summary\">Slökktu á margmiðlunargöngum (media tunneling) ef vart verður við svartan skjá eða hökt við spilun myndskeiða.</string>\n    <string name=\"show_crash_the_player_title\">Sýna „Láta spilara hrynja\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Sýna valkost til að hrynja spilara</string>\n    <string name=\"crash_the_app\">Hrynja forrit</string>\n    <string name=\"create_error_notification\">Búа til villutilkynningu</string>\n    <string name=\"import_soundcloud_instructions_hint\">auðkenniÞitt, soundcloud.com/auðkenniÞitt</string>\n    <string name=\"unhook_checkbox\">Aftengja (getur valdið truflun)</string>\n    <string name=\"permission_denied\">Aðgerð hafnað af kerfi</string>\n    <string name=\"checking_updates_toast\">Leit að uppfærslum…</string>\n    <string name=\"generate_unique_name\">Búa til einstakt nafn</string>\n    <string name=\"overwrite_unrelated_warning\">Skrá með þessu heiti er þegar til staðar</string>\n    <string name=\"overwrite_finished_warning\">Sótt skrá með þessu heiti er þegar til staðar</string>\n    <string name=\"download_already_running\">Það er niðurhal í gangi með þessu nafni</string>\n    <string name=\"download_already_pending\">Það er niðurhal í bið með þessu nafni</string>\n    <string name=\"error_file_creation\">Ekki er hægt að búa til skrána</string>\n    <string name=\"error_path_creation\">Ekki er hægt að búa til áfangamöppuna</string>\n    <string name=\"error_ssl_exception\">Mistókst að skapa örugga tengingu</string>\n    <string name=\"error_unknown_host\">Þjónninn fannst ekki</string>\n    <string name=\"error_connect_host\">Get ekki tengst netþjóninum</string>\n    <string name=\"error_http_no_content\">Netþjónninn sendir ekki gögn</string>\n    <string name=\"error_http_unsupported_range\">Netþjónninn styður ekki fjölþráðuð niðurhöl, reyndu aftur með @string/msg_threads = 1</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe var lokað á meðan unnið var að skrá</string>\n    <string name=\"error_insufficient_storage_left\">Ekkert pláss eftir á tæki</string>\n    <string name=\"error_progress_lost\">Framvinda tapaðist vegna þess að skránni var eytt</string>\n    <string name=\"error_download_resource_gone\">Get ekki endurheimt þetta niðurhal</string>\n    <string name=\"clear_download_history\">Hreinsa niðurhalsferil</string>\n    <string name=\"delete_downloaded_files_confirm\">Eyða öllum sóttum skrám\\?</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s sótt skrá eytt</item>\n        <item quantity=\"other\">%1$s sóttum skrám eytt</item>\n    </plurals>\n    <string name=\"max_retry_desc\">Fjöldi tilrauna áður en hætt er við niðurhal</string>\n    <string name=\"remove_watched_popup_warning\">Myndskeiðum sem skoðuð voru áður eða eftir að þeim var bætt við spilunarlistann verður eytt. \\nErtu viss?</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Já og skoðuð að hluta</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Sækja úr tileinkuðu streymi þegar það er tiltækt</string>\n    <string name=\"detail_heart_img_view_description\">Hjartað af höfunda</string>\n    <string name=\"notifications_disabled\">Slökkt er á tilkynningum</string>\n    <string name=\"you_successfully_subscribed\">Þú ert nú áskrifandi</string>\n    <string name=\"streams_not_yet_supported_removed\">Streymi sem ekki eru enn studd af niðurhalaranum eru ekki sýnd</string>\n    <string name=\"selected_stream_external_player_not_supported\">Valið streymi er ekki stutt af utanaðkomandi spilurum</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Engin hljóðstreymi eru í boði fyrir utanaðkomandi spilara</string>\n    <string name=\"select_quality_external_players\">Veldu gæði fyrir utanaðkomandi spilara</string>\n    <string name=\"faq_description\">Ef þú átt í vandræðum með að nota forritið vertu viss um að skoða þessi svör við algengum spurningum!</string>\n    <string name=\"faq_title\">Algengar spurningar</string>\n    <string name=\"faq\">Skoða á vefsíðu</string>\n    <string name=\"sort\">Raða</string>\n    <string name=\"brightness\">Birtustig</string>\n    <string name=\"no_streams\">Engin streymi</string>\n    <string name=\"no_live_streams\">Engin streymi í beinni</string>\n    <string name=\"unknown_audio_track\">Óþekkt</string>\n    <string name=\"select_audio_track_external_players\">Veldu hljóðspor fyrir utanaðkomandi spilara</string>\n    <string name=\"app_update_unavailable_toast\">Þú ert að keyra nýjustu útgáfuna af NewPipe</string>\n    <string name=\"remove_duplicates_message\">Ertu viss um að þú viljir fjarlægja öll tvítekin streymi í þessum spilunarlista?</string>\n    <string name=\"feed_fetch_channel_tabs\">Sækja flipa rásar</string>\n    <string name=\"feed_hide_streams_title\">Birta eftirfarandi streymi</string>\n    <string name=\"metadata_avatars\">Auðkennismyndir</string>\n    <string name=\"metadata_banners\">Borðar</string>\n    <string name=\"metadata_subchannel_avatars\">Auðkennismyndir undirrása</string>\n    <string name=\"settings_category_exoplayer_summary\">Sýslaðu með sumar stillingar ExoPlayer. Breytingar á þessu krefjast endurræsingar spilarans til að taka gildi</string>\n    <string name=\"settings_category_exoplayer_title\">Stillingar ExoPlayer</string>\n    <string name=\"previous_stream\">Fyrra streymi</string>\n    <string name=\"audio_track_type_dubbed\">yfirtalað</string>\n    <string name=\"audio_track_type_descriptive\">lýsandi</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s svar</item>\n        <item quantity=\"other\">%s svör</item>\n    </plurals>\n    <string name=\"msg_failed_to_copy\">Mistókst að afrita á klippispjald</string>\n    <string name=\"no\">Nei</string>\n    <string name=\"prefer_original_audio_title\">Velja frekar upprunalegt hljóð</string>\n    <string name=\"volume\">Hljóðstyrkur</string>\n    <string name=\"none\">Ekkert</string>\n    <string name=\"play_queue_audio_track\">Hljóð: %s</string>\n    <string name=\"app_update_available_notification_title\">Uppfærsla á NewPipe er tiltæk!</string>\n    <string name=\"app_update_available_notification_text\">Ýttu til að sækja %s</string>\n    <string name=\"reset_settings_title\">Frumstilla stillingar</string>\n    <string name=\"remove_duplicates_title\">Fjarlægja tvítök?</string>\n    <string name=\"metadata_thumbnails\">Smámyndir</string>\n    <string name=\"metadata_subscribers\">Áskrifendur</string>\n    <string name=\"feed_show_watched\">Búið að horfa</string>\n    <string name=\"feed_show_upcoming\">Á næstunni</string>\n    <string name=\"channel_tab_videos\">Myndskeið</string>\n    <string name=\"channel_tab_tracks\">Spor</string>\n    <string name=\"channel_tab_shorts\">Símamyndir</string>\n    <string name=\"channel_tab_playlists\">Spilunarlistar</string>\n    <string name=\"channel_tab_albums\">Albúm</string>\n    <string name=\"channel_tab_about\">Um hugbúnaðinn</string>\n    <string name=\"show_channel_tabs\">Rásaflipar</string>\n    <string name=\"open_play_queue\">Opna spilunarröð</string>\n    <string name=\"toggle_screen_orientation\">Víxla stefnu skjás</string>\n    <string name=\"play\">Spila</string>\n    <string name=\"replay\">Endurspila</string>\n    <string name=\"more_options\">Fleiri valkostir</string>\n    <string name=\"duration\">Tímalengd</string>\n    <string name=\"rewind\">Spóla til baka</string>\n    <string name=\"forward\">Áfram</string>\n    <string name=\"image_quality_title\">Myndgæði</string>\n    <string name=\"image_quality_none\">Ekki hlaða inn myndum</string>\n    <string name=\"image_quality_low\">Lággæða</string>\n    <string name=\"image_quality_medium\">Meðalgæði</string>\n    <string name=\"image_quality_high\">Hágæða</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist\">Deila spilunarlista</string>\n    <string name=\"share_playlist_with_titles\">Deila með titlum</string>\n    <string name=\"share_playlist_with_list\">Deila lista yfir slóðir</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_more\">Sýna meira</string>\n    <string name=\"show_less\">Sýna minna</string>\n    <string name=\"night_theme_available\">Þessi valkostur er aðeins tiltækur ef %s er valið sem þema</string>\n    <string name=\"audio_track_present_in_video\">Hljóðspor ætti þegar að vera til staðar í þessu streymi</string>\n    <string name=\"feed_show_partially_watched\">Skoðað að hluta</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">upprunalegt</string>\n    <string name=\"feed_show_hide_streams\">Birta/Fela streymi</string>\n    <string name=\"loading_metadata_title\">Hleð inn lýsigögnum…</string>\n    <string name=\"card\">Spjald</string>\n    <string name=\"channel_tab_livestreams\">Í beinni</string>\n    <string name=\"channel_tab_channels\">Rásir</string>\n    <string name=\"audio_track\">Hljóðspor</string>\n    <string name=\"yes\">Já</string>\n    <string name=\"settings_category_backup_restore_title\">Öryggisafrita og endurheimta</string>\n    <string name=\"main_tabs_position_title\">Staðsetning aðalflipa</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Tvítaki bætt við %d sinnum</string>\n    <string name=\"error_insufficient_storage\">Ekkert pláss eftir á tæki</string>\n    <string name=\"reset_settings_summary\">Frumstilla allar stillingar á sjálfgefin gildi</string>\n    <string name=\"remove_duplicates\">Fjarlægja tvítök</string>\n    <string name=\"metadata_uploader_avatars\">Auðkennismyndir innsendenda</string>\n    <string name=\"show_channel_tabs_summary\">Hvaða flipar eru sýndir á rásasíðunum</string>\n    <string name=\"toggle_fullscreen\">Víxla skjáfylli af/á</string>\n    <string name=\"next_stream\">Næsta streymi</string>\n    <string name=\"fast_mode\">Hraðstreymishamur</string>\n    <string name=\"import_subscriptions_hint\">Flytja áskriftir inn eða út með 3-punkta valmyndinni</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Hunsa atvik frá margmiðlunarhnöppum vélbúnaðar</string>\n    <string name=\"prefer_original_audio_summary\">Velja upprunalegt hljóðspor án tillits til tungumáls</string>\n    <string name=\"prefer_descriptive_audio_title\">Velja frekar lýsandi hljóð</string>\n    <string name=\"right_gesture_control_title\">Hægri bendingaraðgerð</string>\n    <string name=\"left_gesture_control_summary\">Veldu bendingu fyrir vinstri helming spilaraskjás</string>\n    <string name=\"left_gesture_control_title\">Vinstri bendingaraðgerð</string>\n    <string name=\"right_gesture_control_summary\">Veldu bendingu fyrir hægri helming spilaraskjás</string>\n    <string name=\"duplicate_in_playlist\">Spilunarlistarnir sem eru gráir innihalda þegar þetta atriði.</string>\n    <string name=\"unset_playlist_thumbnail\">Losa varanlega smámynd</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Flipar sem á að sækja við uppfærslu þessa streymis. Þetta hefur engin áhrif ef rás er uppfærð með hraðstreymisham.</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Nota varaeiginleika ExoPlayer-afkóðarans</string>\n    <string name=\"new_seek_duration_toast\">Vegna takmarkana í ExoPlayer-spilaranum var tímalengd hoppa sett á %d sekúndur</string>\n    <string name=\"disable_media_tunneling_automatic_info\">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.</string>\n    <string name=\"auto_update_check_description\">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?</string>\n    <string name=\"reset_all_settings\">Frumstilling allra stillinga mun henda öllum áður skilgreindum stillingum og endurræsa forritið.\\n\\nErtu viss um að þú viljir halda áfram?</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Nytsamlegt ef þú til dæmis þarft að nota heyrnartól með biluðum tökkum</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Alltaf nota framhjáhlaupsstillingar ExoPlayer-spilarans fyrir frálagsflöt myndmerkis</string>\n    <string name=\"prefer_descriptive_audio_summary\">Veldu hljóðspor með lýsingum fyrir sjónskerta, ef slíkt er tiltækt</string>\n    <string name=\"main_tabs_position_summary\">Færa veljara aðalflipa neðst</string>\n    <string name=\"show_error_snackbar\">Sýna villustiku</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"audio_track_type_secondary\">auka</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Deila sem YouTube-bráðabirgðaspilunarlista</string>\n    <string name=\"tab_bookmarks_short\">Spilunarlistar</string>\n    <string name=\"search_with_service_name\">Leita í %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Leita í %1$s (%2$s)</string>\n    <string name=\"select_a_feed_group\">Veldu hóp streyma</string>\n    <string name=\"no_feed_group_created_yet\">Enginn hópur streyma útbúinn ennþá</string>\n    <string name=\"feed_group_page_summary\">Síða rásahóps</string>\n    <string name=\"channel_tab_likes\">Líkar við</string>\n    <string name=\"migration_info_6_7_title\">Topp 50 síða SoundCloud fjarlægð</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud er hætt með Topp 50 vinsældalistann. Viðkomandi flipi hefur verið fjarlægður af aðalsíðunni þinni.</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"trending_gaming\">Vinsælir leikir</string>\n    <string name=\"trending_podcasts\">Vinsæl hlaðvörp</string>\n    <string name=\"trending_movies\">Vinsælar kvikmyndir og þættir</string>\n    <string name=\"trending_music\">Vinsæl tónlist</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"Leyfa birtingu ofan á öðrum forritum\\\"</string>\n    <string name=\"delete_file\">Eyða skrá</string>\n    <string name=\"delete_entry\">Eyða færslu</string>\n    <string name=\"account_terminated_service_provides_reason\">Aðgangi lokað\\n\\n%1$s gefur þessa ástæðu: %2$s</string>\n    <string name=\"entry_deleted\">Færslu eytt</string>\n    <string name=\"migration_info_7_8_title\">Samsettur vinsældalisti YouTube fjarlægður</string>\n    <string name=\"migration_info_7_8_message\">YouTube hætti með samsetta vinsældalistann sinn frá og með 21. júlí 2025. NewPipe skipti út sjálfgefna vinsældalistanum fyrir vinsæl streymi í beinni útsendingu.\\n\\nÞú getur líka valið annað vinsælt efni með því að fara í \\\"Stillingar &gt; Efni &gt; Efni aðalsíðu\\\".</string>\n    <string name=\"player_http_403\">Tók við HTTP-villu 403 frá þjóni á meðan afspilun stóð, líklega vegna útrunninar URL-slóðar streymis eða banns á IP-vistfang</string>\n    <string name=\"player_http_invalid_status\">Tók við HTTP-villu %1$s frá þjóni á meðan afspilun stóð</string>\n    <string name=\"youtube_player_http_403\">Tók við HTTP-villu 403 frá þjóni á meðan afspilun stóð, líklega vegna banns á IP-vistfang eða vandamála með afkóðun URL-slóðar streymis</string>\n    <string name=\"unsupported_content_in_country\">Þetta efni er ekki í boði fyrir valið landsvæði efnis.\\n\\nBreyttu valinu með því að fara í \\\"Stillingar &gt; Efni &gt; Sjálfgefið landsvæði efnis\\\".</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-it/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Pubblicato il %1$s</string>\n    <string name=\"no_player_found\">Nessun lettore multimediale trovato. Installare VLC\\?</string>\n    <string name=\"install\">Installa</string>\n    <string name=\"cancel\">Annulla</string>\n    <string name=\"open_in_browser\">Apri nel browser</string>\n    <string name=\"share\">Condividi</string>\n    <string name=\"download\">Scarica</string>\n    <string name=\"search\">Cerca</string>\n    <string name=\"settings\">Impostazioni</string>\n    <string name=\"did_you_mean\">Forse cercavi \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Condividi con</string>\n    <string name=\"download_path_title\">Cartella video scaricati</string>\n    <string name=\"download_path_summary\">I video scaricati saranno salvati qui</string>\n    <string name=\"download_path_dialog_title\">Scegli la cartella per i video scaricati</string>\n    <string name=\"default_resolution_title\">Risoluzione predefinita</string>\n    <string name=\"play_with_kodi_title\">Riproduci con Kodi</string>\n    <string name=\"kore_not_found\">Installare l\\'app Kore\\?</string>\n    <string name=\"show_play_with_kodi_title\">Mostra \\\"Riproduci con Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Mostra l\\'opzione per riprodurre video tramite Kodi</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Formato audio predefinito</string>\n    <string name=\"download_dialog_title\">Scarica</string>\n    <string name=\"show_next_and_similar_title\">Mostra video \\\"Prossimo\\\" e \\\"Simili\\\"</string>\n    <string name=\"unsupported_url\">URL non supportato</string>\n    <string name=\"content_language_title\">Lingua predefinita per i contenuti</string>\n    <string name=\"settings_category_video_audio_title\">Video e audio</string>\n    <string name=\"detail_thumbnail_view_description\">Riproduci video, durata:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Immagine dell\\'utente</string>\n    <string name=\"detail_dislikes_img_view_description\">Non mi piace</string>\n    <string name=\"detail_likes_img_view_description\">Mi piace</string>\n    <string name=\"use_external_video_player_title\">Usa lettore video esterno</string>\n    <string name=\"use_external_audio_player_title\">Usa lettore audio esterno</string>\n    <string name=\"download_path_audio_title\">Cartella audio scaricati</string>\n    <string name=\"download_path_audio_summary\">Gli audio scaricati saranno salvati qui</string>\n    <string name=\"download_path_audio_dialog_title\">Scegli la cartella per gli audio scaricati</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"dark_theme_title\">Scuro</string>\n    <string name=\"light_theme_title\">Chiaro</string>\n    <string name=\"settings_category_appearance_title\">Aspetto</string>\n    <string name=\"background_player_playing_toast\">Riproduzione in sottofondo</string>\n    <string name=\"general_error\">Errore</string>\n    <string name=\"network_error\">Errore di connessione</string>\n    <string name=\"could_not_load_thumbnails\">Impossibile caricare tutte le copertine</string>\n    <string name=\"content_not_available\">Contenuto non disponibile</string>\n    <string name=\"parsing_error\">Impossibile analizzare il sito web</string>\n    <string name=\"could_not_setup_download_menu\">Impossibile impostare il menu di download</string>\n    <string name=\"content\">Contenuti</string>\n    <string name=\"show_age_restricted_content_title\">Mostra contenuti con restrizioni di età</string>\n    <string name=\"main_bg_subtitle\">Tocca la lente d\\'ingrandimento per iniziare.</string>\n    <string name=\"duration_live\">In diretta</string>\n    <string name=\"sorry_string\">Spiacenti, non sarebbe dovuto succedere.</string>\n    <string name=\"error_report_button_text\">Segnala via e-mail</string>\n    <string name=\"error_snackbar_message\">Spiacente, qualcosa è andato storto.</string>\n    <string name=\"error_snackbar_action\">Segnala</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"what_happened_headline\">Cosa è successo:</string>\n    <string name=\"your_comment\">Il tuo commento (in inglese):</string>\n    <string name=\"error_details_headline\">Dettagli:</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Riprova</string>\n    <string name=\"downloads\">Download</string>\n    <string name=\"downloads_title\">Download</string>\n    <string name=\"error_report_title\">Segnalazione di errore</string>\n    <string name=\"start\">Inizia</string>\n    <string name=\"pause\">Pausa</string>\n    <string name=\"delete\">Elimina</string>\n    <string name=\"checksum\">Checksum</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Nome del file</string>\n    <string name=\"msg_threads\">Thread</string>\n    <string name=\"msg_error\">Errore</string>\n    <string name=\"msg_running\">NewPipe sta scaricando</string>\n    <string name=\"msg_running_detail\">Tocca per maggiori dettagli</string>\n    <string name=\"msg_wait\">Attendi…</string>\n    <string name=\"msg_copied\">Copiato negli appunti</string>\n    <string name=\"no_available_dir\">Seleziona una cartella per i file scaricati</string>\n    <string name=\"app_ui_crash\">L\\'app/UI si è interrotta</string>\n    <string name=\"info_labels\">Cosa:\\nRichiesta:\\nLingua contenuti:\\nPaese contenuti\\nLingua app:\\nServizio:\\nOrario GMT:\\nPacchetto:\\nVersione:\\nVersione SO:</string>\n    <string name=\"title_activity_recaptcha\">Risoluzione reCAPTCHA</string>\n    <string name=\"black_theme_title\">Nero</string>\n    <string name=\"all\">Tutto</string>\n    <string name=\"recaptcha_request_toast\">È richiesta la risoluzione del reCAPTCHA</string>\n    <string name=\"open_in_popup_mode\">Apri in modalità popup</string>\n    <string name=\"popup_playing_toast\">Riproduzione in modalità popup</string>\n    <string name=\"disabled\">Disattivato</string>\n    <string name=\"use_external_video_player_summary\">Audio non disponibile per alcune risoluzioni</string>\n    <string name=\"controls_background_title\">In sottofondo</string>\n    <string name=\"controls_popup_title\">Popup</string>\n    <string name=\"default_popup_resolution_title\">Risoluzione predefinita lettore popup</string>\n    <string name=\"show_higher_resolutions_title\">Mostra risoluzioni più elevate</string>\n    <string name=\"show_higher_resolutions_summary\">Solo alcuni dispositivi possono riprodurre video 2K/4K</string>\n    <string name=\"default_video_format_title\">Formato video predefinito</string>\n    <string name=\"popup_remember_size_pos_title\">Ricorda proprietà del popup</string>\n    <string name=\"popup_remember_size_pos_summary\">Ricorda ultima dimensione e posizione del popup</string>\n    <string name=\"show_search_suggestions_title\">Suggerimenti di ricerca</string>\n    <string name=\"show_search_suggestions_summary\">Scegli suggerimenti di ricerca</string>\n    <string name=\"clear\">Cancella</string>\n    <string name=\"best_resolution\">Risoluzione migliore</string>\n    <string name=\"msg_popup_permission\">Questo permesso è necessario\n\\nper utilizzare il lettore popup</string>\n    <string name=\"title_licenses\">Licenze di terze parti</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s di %2$s protetto da licenza %3$s</string>\n    <string name=\"tab_about\">Info e domande frequenti</string>\n    <string name=\"tab_licenses\">Licenze</string>\n    <string name=\"app_description\">Streaming libero e leggero su Android.</string>\n    <string name=\"view_on_github\">Mostra su GitHub</string>\n    <string name=\"app_license_title\">Licenza di NewPipe</string>\n    <string name=\"contribution_encouragement\">Un aiuto è sempre gradito: traduzioni, modifiche al design, pulizia del codice, cambiamenti radicali. Più si fa, meglio è!</string>\n    <string name=\"read_full_license\">Leggi la Licenza</string>\n    <string name=\"contribution_title\">Contribuisci</string>\n    <string name=\"title_activity_about\">Informazioni su NewPipe</string>\n    <string name=\"subscribe_button_title\">Iscriviti</string>\n    <string name=\"subscribed_button_title\">Iscritto</string>\n    <string name=\"channel_unsubscribed\">Disiscritto dal canale</string>\n    <string name=\"subscription_change_failed\">Impossibile cambiare l\\'iscrizione</string>\n    <string name=\"subscription_update_failed\">Impossibile aggiornare l\\'iscrizione</string>\n    <string name=\"tab_subscriptions\">Iscrizioni</string>\n    <string name=\"fragment_feed_title\">Novità</string>\n    <string name=\"enable_search_history_title\">Cronologia delle ricerche</string>\n    <string name=\"enable_search_history_summary\">Salva le ricerche localmente</string>\n    <string name=\"enable_watch_history_title\">Cronologia delle visualizzazioni</string>\n    <string name=\"enable_watch_history_summary\">Salva la cronologia degli elementi visualizzati</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Riprendi la riproduzione</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Continua a riprodurre dopo le interruzioni (es. telefonate)</string>\n    <string name=\"settings_category_downloads_title\">Download</string>\n    <string name=\"settings_file_charset_title\">Caratteri ammessi per i nomi dei file</string>\n    <string name=\"settings_file_replacement_character_summary\">I caratteri non validi vengono sostituiti con il valore specificato</string>\n    <string name=\"settings_file_replacement_character_title\">Carattere sostitutivo</string>\n    <string name=\"charset_letters_and_digits\">Lettere e cifre</string>\n    <string name=\"charset_most_special_characters\">La maggior parte dei caratteri speciali</string>\n    <string name=\"title_activity_history\">Cronologia</string>\n    <string name=\"action_history\">Cronologia</string>\n    <string name=\"settings_category_player_title\">Lettore multimediale</string>\n    <string name=\"settings_category_player_behavior_title\">Comportamento</string>\n    <string name=\"settings_category_history_title\">Cronologia e cache</string>\n    <string name=\"undo\">Rifai</string>\n    <string name=\"notification_channel_name\">Notifica NewPipe</string>\n    <string name=\"notification_channel_description\">Notifiche per il lettore multimediale di NewPipe</string>\n    <string name=\"search_no_results\">Nessun risultato</string>\n    <string name=\"no_subscribers\">Nessun iscritto</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s iscritto</item>\n        <item quantity=\"many\">%s iscritti</item>\n        <item quantity=\"other\">%s iscritti</item>\n    </plurals>\n    <string name=\"no_views\">Nessuna visualizzazione</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s visualizzazione</item>\n        <item quantity=\"many\">%s visualizzazioni</item>\n        <item quantity=\"other\">%s visualizzazioni</item>\n    </plurals>\n    <string name=\"no_videos\">Nessun video</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"many\">%s video</item>\n        <item quantity=\"other\">%s video</item>\n    </plurals>\n    <string name=\"empty_list_subtitle\">Nulla da mostrare</string>\n    <string name=\"delete_item_search_history\">Eliminare questo elemento dalla cronologia delle ricerche\\?</string>\n    <string name=\"main_page_content\">Contenuto della pagina principale</string>\n    <string name=\"blank_page_summary\">Pagina vuota</string>\n    <string name=\"kiosk_page_summary\">Contenuti in evidenza personalizzati</string>\n    <string name=\"channel_page_summary\">Canale personalizzato</string>\n    <string name=\"select_a_channel\">Seleziona un canale</string>\n    <string name=\"no_channel_subscribed_yet\">Nessuna iscrizione</string>\n    <string name=\"select_a_kiosk\">Seleziona Contenuto</string>\n    <string name=\"trending\">Tendenze</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Nuovi e popolari</string>\n    <string name=\"show_hold_to_append_title\">Mostra suggerimento \\\"Tieni premuto per accodare\\\"</string>\n    <string name=\"show_hold_to_append_summary\">Nei dettagli dei video, mostra un suggerimento alla pressione dei pulsanti per la riproduzione popup o in sottofondo</string>\n    <string name=\"play_all\">Riproduci tutto</string>\n    <string name=\"player_stream_failure\">Impossibile riprodurre questo flusso</string>\n    <string name=\"player_unrecoverable_failure\">Si è verificato un errore irreversibile del lettore multimediale</string>\n    <string name=\"player_recoverable_failure\">Ripristino dell\\'errore del lettore multimediale</string>\n    <string name=\"play_queue_remove\">Rimuovi</string>\n    <string name=\"play_queue_stream_detail\">Dettagli</string>\n    <string name=\"play_queue_audio_settings\">Impostazioni audio</string>\n    <string name=\"hold_to_append\">Tieni premuto per accodare</string>\n    <string name=\"unknown_content\">[Sconosciuto]</string>\n    <string name=\"start_here_on_background\">Riproduci in sottofondo</string>\n    <string name=\"start_here_on_popup\">Riproduci nel lettore popup</string>\n    <string name=\"donation_title\">Dona</string>\n    <string name=\"website_title\">Sito</string>\n    <string name=\"website_encouragement\">Visita il sito di NewPipe per informazioni e novità.</string>\n    <string name=\"donation_encouragement\">NewPipe è sviluppato da volontari che impiegano il loro tempo libero per offrire agli utenti un\\'esperienza migliore. Restituisci il favore, aiutandoli a rendere NewPipe ancora più piacevole, mentre si gustano una tazza di caffè.</string>\n    <string name=\"give_back\">Restituisci</string>\n    <string name=\"default_content_country_title\">Paese predefinito per i contenuti</string>\n    <string name=\"switch_to_background\">Passa in sottofondo</string>\n    <string name=\"switch_to_popup\">Passa alla modalità popup</string>\n    <string name=\"switch_to_main\">Passa al lettore principale</string>\n    <string name=\"drawer_open\">Apri il menu</string>\n    <string name=\"drawer_close\">Chiudi il menu</string>\n    <string name=\"no_player_found_toast\">Nessun lettore multimediale trovato (puoi installare VLC per riprodurlo).</string>\n    <string name=\"always\">Sempre</string>\n    <string name=\"just_once\">Solo una volta</string>\n    <string name=\"external_player_unsupported_link_type\">I lettori multimediali esterni non supportano questa tipologia di collegamenti</string>\n    <string name=\"video_streams_empty\">Nessun flusso video trovato</string>\n    <string name=\"audio_streams_empty\">Nessun flusso audio trovato</string>\n    <string name=\"video_player\">Lettore video</string>\n    <string name=\"background_player\">Riproduzione in sottofondo</string>\n    <string name=\"popup_player\">Lettore popup</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Raccolta informazioni in corso…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Caricamento del contenuto richiesto</string>\n    <string name=\"import_data_title\">Importa database</string>\n    <string name=\"export_data_title\">Esporta database</string>\n    <string name=\"import_data_summary\">Sovrascrive la cronologia, le iscrizioni, le playlist e (facoltativamente) le impostazioni correnti</string>\n    <string name=\"export_data_summary\">Esporta cronologia, iscrizioni, playlist e impostazioni</string>\n    <string name=\"export_complete_toast\">Esportazione completa</string>\n    <string name=\"import_complete_toast\">Importazione completa</string>\n    <string name=\"no_valid_zip_file\">Nessun file ZIP valido</string>\n    <string name=\"could_not_import_all_files\">Attenzione: Impossibile importare tutti i file.</string>\n    <string name=\"override_current_data\">Questa operazione sostituirà le tue impostazioni attuali.</string>\n    <string name=\"controls_download_desc\">Scarica il video</string>\n    <string name=\"show_info\">Mostra informazioni</string>\n    <string name=\"tab_bookmarks\">Playlist salvate</string>\n    <string name=\"controls_add_to_playlist_title\">Aggiungi a</string>\n    <string name=\"detail_drag_description\">Trascina per riordinare</string>\n    <string name=\"create\">Crea</string>\n    <string name=\"dismiss\">Ignora</string>\n    <string name=\"rename\">Rinomina</string>\n    <string name=\"title_last_played\">Ultima riproduzione</string>\n    <string name=\"title_most_played\">I più riprodotti</string>\n    <string name=\"always_ask_open_action\">Chiedi ogni volta</string>\n    <string name=\"create_playlist\">Nuova playlist</string>\n    <string name=\"rename_playlist\">Rinomina</string>\n    <string name=\"name\">Nome</string>\n    <string name=\"add_to_playlist\">Aggiungi alla playlist</string>\n    <string name=\"set_as_playlist_thumbnail\">Imposta come copertina della playlist</string>\n    <string name=\"bookmark_playlist\">Salva playlist</string>\n    <string name=\"unbookmark_playlist\">Rimuovi playlist</string>\n    <string name=\"delete_playlist_prompt\">Eliminare la playlist\\?</string>\n    <string name=\"playlist_creation_success\">Playlist creata</string>\n    <string name=\"playlist_add_stream_success\">Aggiunto alla playlist</string>\n    <string name=\"playlist_thumbnail_change_success\">Copertina della playlist cambiata.</string>\n    <string name=\"caption_none\">Nessun sottotitolo</string>\n    <string name=\"resize_fit\">Rientrato</string>\n    <string name=\"resize_fill\">Pieno</string>\n    <string name=\"resize_zoom\">Ingrandito</string>\n    <string name=\"settings_category_debug_title\">Debug</string>\n    <string name=\"caption_auto_generated\">Generato automaticamente</string>\n    <string name=\"enable_leak_canary_summary\">Il monitoraggio di memory leak potrebbe causare la mancata risposta dell\\'applicazione durante il dumping dell\\'heap</string>\n    <string name=\"enable_disposed_exceptions_title\">Segnala errori «fuori del ciclo di vita»</string>\n    <string name=\"enable_disposed_exceptions_summary\">Forza la segnalazione di eccezioni Rx non consegnabili al di fuori del ciclo di vita dell\\'attività dopo la chiusura</string>\n    <string name=\"use_inexact_seek_title\">Usa ricerca rapida (imprecisa)</string>\n    <string name=\"use_inexact_seek_summary\">Consente al lettore multimediale di spostarsi più velocemente, ma con precisione ridotta. Spostamenti di 5, 15 o 25 secondi non funzionano con questo</string>\n    <string name=\"auto_queue_title\">Accoda automaticamente l\\'elemento successivo</string>\n    <string name=\"auto_queue_summary\">Accoda un contenuto consigliato al termine della riproduzione, in una coda non ripetitiva</string>\n    <string name=\"file\">File</string>\n    <string name=\"invalid_directory\">Nessuna cartella</string>\n    <string name=\"invalid_source\">Nessun file/contenuto sorgente</string>\n    <string name=\"invalid_file\">Il file non esiste o non si hanno i permessi di scrittura o lettura</string>\n    <string name=\"file_name_empty_error\">Il nome del file non può essere vuoto</string>\n    <string name=\"error_occurred_detail\">Si è verificato un errore: %1$s</string>\n    <string name=\"import_title\">Importa</string>\n    <string name=\"import_from\">Importa da</string>\n    <string name=\"export_to\">Esporta in</string>\n    <string name=\"import_ongoing\">Importazione in corso…</string>\n    <string name=\"export_ongoing\">Esportazione in corso…</string>\n    <string name=\"import_file_title\">Importa file</string>\n    <string name=\"previous_export\">Esportazione precedente</string>\n    <string name=\"subscriptions_import_unsuccessful\">Impossibile importare le iscrizioni</string>\n    <string name=\"subscriptions_export_unsuccessful\">Impossibile esportare le iscrizioni</string>\n    <string name=\"import_youtube_instructions\">Importa le iscrizioni di YouTube scaricando il file d\\'esportazione:\n\\n\n\\n1. Vai a questo URL: %1$s\n\\n2. Accedi quando richiesto\n\\n3. Premi \\\"Tutti i dati inclusi\\\", \\\"Deseleziona tutto\\\", seleziona solo \\\"iscrizioni\\\" e premi \\\"OK\\\"\n\\n4. Premi \\\"Passaggio successivo\\\" e poi \\\"Crea esportazione\\\"\n\\n5. Premi il pulsante \\\"Scarica\\\" quando compare\n\\n6. Premi IMPORTA FILE qui sotto e seleziona il file ZIP scaricato\n\\n7. [Se l\\'importazione fallisce] Estrai il file CSV (solitamente in \\\"YouTube and YouTube Music/subscriptions/subscriptions.csv\\\"), premi IMPORTA FILE qui sotto e seleziona il file CSV estratto</string>\n    <string name=\"import_soundcloud_instructions\">Importa un profilo SoundCloud inserendo l\\'URL o il tuo ID:\n\\n\n\\n1. Abilitare la «modalità desktop» del browser (il sito non è disponibile per i dispositivi mobili)\n\\n2. Aprire questo URL: %1$s\n\\n3. Accedere quando richiesto\n\\n4. Copiare l\\'URL del profilo a cui si viene indirizzati.</string>\n    <string name=\"import_soundcloud_instructions_hint\">iltuoID, soundcloud.com/iltuoid</string>\n    <string name=\"import_network_expensive_warning\">Tieni presente che questa operazione può consumare una grande quantità di traffico dati.\n\\n \n\\nVuoi continuare?</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Cache immagini svuotata</string>\n    <string name=\"metadata_cache_wipe_title\">Svuota la cache dei metadati</string>\n    <string name=\"metadata_cache_wipe_summary\">Elimina i dati delle pagine web memorizzati nella cache</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Cache metadati svuotata</string>\n    <string name=\"playback_speed_control\">Controlli della velocità di riproduzione</string>\n    <string name=\"playback_tempo\">Velocità</string>\n    <string name=\"playback_pitch\">Tono</string>\n    <string name=\"unhook_checkbox\">Scollega (può causare distorsione)</string>\n    <string name=\"no_streams_available_download\">Nessun flusso disponibile per il download</string>\n    <string name=\"preferred_open_action_settings_title\">Azione di apertura preferita</string>\n    <string name=\"preferred_open_action_settings_summary\">Azione predefinita all\\'apertura del contenuto — %s</string>\n    <string name=\"caption_setting_title\">Sottotitoli</string>\n    <string name=\"caption_setting_description\">Modifica dimensione e stile dei sottotitoli. Riavviare per applicare le modifiche</string>\n    <string name=\"clear_views_history_title\">Elimina la cronologia delle visualizzazioni</string>\n    <string name=\"clear_views_history_summary\">Elimina la cronologia degli elementi riprodotti e le posizioni di riproduzione</string>\n    <string name=\"delete_view_history_alert\">Eliminare la cronologia delle visualizzazioni\\?</string>\n    <string name=\"watch_history_deleted\">Cronologia delle visualizzazioni eliminata</string>\n    <string name=\"clear_search_history_title\">Elimina la cronologia delle ricerche</string>\n    <string name=\"clear_search_history_summary\">Elimina la cronologia dei termini di ricerca</string>\n    <string name=\"delete_search_history_alert\">Eliminare la cronologia delle ricerche\\?</string>\n    <string name=\"search_history_deleted\">Cronologia delle ricerche eliminata</string>\n    <string name=\"one_item_deleted\">1 elemento eliminato.</string>\n    <string name=\"app_license\">NewPipe è un software libero con licenza copyleft: si può utilizzare, studiare, condividere e migliorare a proprio piacimento. In particolare, è possibile ridistribuirlo e/o modificarlo secondo i termini della GNU General Public License (Free Software Foundation), nella versione 3 o successiva, a propria discrezione.</string>\n    <string name=\"import_settings\">Vuoi anche importare le impostazioni?</string>\n    <string name=\"privacy_policy_title\">Informativa sulla privacy</string>\n    <string name=\"privacy_policy_encouragement\">Il progetto NewPipe tiene molto alla tua privacy. Perciò, l\\'app non raccoglie alcun dato senza il tuo consenso.\n\\nL\\'informativa sulla privacy spiega nel dettaglio quali dati vengono trattati e memorizzati durante l\\'invio di segnalazioni per arresti anomali.</string>\n    <string name=\"read_privacy_policy\">Leggi l\\'informativa sulla privacy</string>\n    <string name=\"start_accept_privacy_policy\">Per rispettare il regolamento europeo sulla protezione dei dati (GDPR), richiamiamo la vostra attenzione sull\\'informativa sulla privacy di NewPipe. Si prega di leggerla attentamente.\n\\nDeve essere accettata per poter inviare la segnalazione.</string>\n    <string name=\"accept\">Accetto</string>\n    <string name=\"decline\">Rifiuto</string>\n    <string name=\"limit_data_usage_none_description\">Nessun limite</string>\n    <string name=\"limit_mobile_data_usage_title\">Limita risoluzione su reti mobili</string>\n    <string name=\"skip_silence_checkbox\">Avanzamento veloce durante il silenzio</string>\n    <string name=\"playback_step\">Passo</string>\n    <string name=\"playback_reset\">Reset</string>\n    <string name=\"minimize_on_exit_title\">Comportamento al cambio di app</string>\n    <string name=\"minimize_on_exit_summary\">Azione da eseguire cambiando app dal lettore video principale — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Nessuna</string>\n    <string name=\"minimize_on_exit_background_description\">Riproduci in sottofondo</string>\n    <string name=\"minimize_on_exit_popup_description\">Passa in modalità popup</string>\n    <string name=\"channels\">Canali</string>\n    <string name=\"playlists\">Playlist</string>\n    <string name=\"tracks\">Tracce</string>\n    <string name=\"users\">Utenti</string>\n    <string name=\"unsubscribe\">Disiscriviti</string>\n    <string name=\"tab_choose\">Scegli scheda</string>\n    <string name=\"settings_category_updates_title\">Aggiornamenti</string>\n    <string name=\"file_deleted\">File eliminato</string>\n    <string name=\"app_update_notification_channel_name\">Notifiche per aggiornamenti dell\\'app</string>\n    <string name=\"app_update_notification_channel_description\">Notifiche per le nuove versioni di NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Archiviazione esterna non disponibile</string>\n    <string name=\"download_to_sdcard_error_message\">Impossibile scaricare sulla scheda SD esterna. Ripristinare la posizione della cartella dei download\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Impossibile leggere le schede salvate, verranno usate quelle predefinite</string>\n    <string name=\"restore_defaults\">Ripristina predefiniti</string>\n    <string name=\"restore_defaults_confirmation\">Ripristinare valori predefiniti\\?</string>\n    <string name=\"subscribers_count_not_available\">Contatore degli iscritti non disponibile</string>\n    <string name=\"main_page_content_summary\">Schede mostrate nella pagina principale</string>\n    <string name=\"updates_setting_title\">Aggiornamenti</string>\n    <string name=\"updates_setting_description\">Mostra una notifica per suggerire l\\'aggiornamento dell\\'app se una nuova versione è disponibile</string>\n    <string name=\"list_view_mode\">Modalità visualizzazione lista</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"grid\">Griglia</string>\n    <string name=\"auto\">Automatica</string>\n    <string name=\"app_update_available_notification_title\">Aggiornamento di NewPipe disponibile!</string>\n    <string name=\"missions_header_finished\">Completati</string>\n    <string name=\"missions_header_pending\">In corso</string>\n    <string name=\"paused\">in pausa</string>\n    <string name=\"queued\">accodato</string>\n    <string name=\"post_processing\">post-elaborazione</string>\n    <string name=\"enqueue\">Accoda</string>\n    <string name=\"permission_denied\">Azione negata dal sistema</string>\n    <string name=\"download_failed\">Download fallito</string>\n    <string name=\"generate_unique_name\">Genera nome univoco</string>\n    <string name=\"overwrite\">Sovrascrivi</string>\n    <string name=\"overwrite_finished_warning\">Esiste già un file scaricato con lo stesso nome</string>\n    <string name=\"download_already_running\">C\\'è un download in corso con questo nome</string>\n    <string name=\"show_error\">Mostra errore</string>\n    <string name=\"error_file_creation\">Impossibile creare il file</string>\n    <string name=\"error_path_creation\">Impossibile creare la cartella di destinazione</string>\n    <string name=\"error_ssl_exception\">Impossibile stabilire una connessione sicura</string>\n    <string name=\"error_unknown_host\">Impossibile trovare il server</string>\n    <string name=\"error_connect_host\">Impossibile connettersi al server</string>\n    <string name=\"error_http_no_content\">Il server non invia dati</string>\n    <string name=\"error_http_unsupported_range\">Il server non accetta download multipli, riprovare con @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Non trovato</string>\n    <string name=\"error_postprocessing_failed\">Post-elaborazione fallita</string>\n    <string name=\"stop\">Ferma</string>\n    <string name=\"max_retry_msg\">Numero massimo di tentativi</string>\n    <string name=\"max_retry_desc\">Quante volte provare prima di annullare il download</string>\n    <string name=\"pause_downloads_on_mobile\">Interrompi con connessioni a consumo</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Utile quando si passa alla connessione dati mobile, tuttavia alcuni download non possono essere sospesi</string>\n    <string name=\"events\">Eventi</string>\n    <string name=\"conferences\">Conferenze</string>\n    <string name=\"error_timeout\">Tempo per la connessione esaurito</string>\n    <string name=\"show_comments_title\">Mostra commenti</string>\n    <string name=\"show_comments_summary\">Disattiva per nascondere i commenti</string>\n    <string name=\"autoplay_title\">Riproduzione automatica</string>\n    <string name=\"no_comments\">Nessun commento</string>\n    <string name=\"error_unable_to_load_comments\">Impossibile caricare i commenti</string>\n    <string name=\"close\">Chiudi</string>\n    <string name=\"enable_playback_resume_title\">Riprendi la riproduzione</string>\n    <string name=\"enable_playback_resume_summary\">Recupera l\\'ultima posizione di riproduzione</string>\n    <string name=\"enable_playback_state_lists_title\">Posizioni nelle liste</string>\n    <string name=\"enable_playback_state_lists_summary\">Mostra gli indicatori della posizione di riproduzione nelle liste</string>\n    <string name=\"settings_category_clear_data_title\">Elimina dati</string>\n    <string name=\"watch_history_states_deleted\">Posizione di riproduzione eliminata</string>\n    <string name=\"missing_file\">File spostato o cancellato</string>\n    <string name=\"overwrite_unrelated_warning\">Esiste già un file con questo nome</string>\n    <string name=\"overwrite_failed\">impossibile sovrascrivere il file</string>\n    <string name=\"download_already_pending\">C\\'è un download in corso con questo nome</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe è stato chiuso mentre lavorava sul file</string>\n    <string name=\"error_insufficient_storage_left\">Spazio insufficiente sul dispositivo</string>\n    <string name=\"error_progress_lost\">Progresso perso poiché il file è stato eliminato</string>\n    <string name=\"confirm_prompt\">Vuoi cancellare la cronologia dei download o eliminare tutti i file scaricati\\?</string>\n    <string name=\"enable_queue_limit_desc\">Sarà avviato un solo download per volta</string>\n    <string name=\"start_downloads\">Avvia i download</string>\n    <string name=\"pause_downloads\">Sospendi i download</string>\n    <string name=\"downloads_storage_ask_title\">Chiedi dove scaricare</string>\n    <string name=\"downloads_storage_ask_summary\">È necessario specificare la destinazione di ogni dowload.\n\\nPer salvare i file su una scheda esterna è necessario attivare il selettore di cartelle di sistema (SAF)</string>\n    <string name=\"downloads_storage_use_saf_title\">Usa il selettore di cartelle di sistema (SAF)</string>\n    <string name=\"enable_queue_limit\">Limita coda dei download</string>\n    <string name=\"downloads_storage_use_saf_summary\">Il Framework di accesso all\\'archiviazione consente di salvare i file su una memoria esterna</string>\n    <string name=\"clear_playback_states_title\">Elimina le posizioni di riproduzione</string>\n    <string name=\"clear_playback_states_summary\">Elimina tutte le posizioni di riproduzione</string>\n    <string name=\"delete_playback_states_alert\">Eliminare tutte le posizioni di riproduzione\\?</string>\n    <string name=\"drawer_header_description\">Attiva/disattiva il servizio, attualmente selezionato:</string>\n    <string name=\"no_one_watching\">Nessuno sta guardando</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s sta guardando</item>\n        <item quantity=\"many\">%s stanno guardando</item>\n        <item quantity=\"other\">%s stanno guardando</item>\n    </plurals>\n    <string name=\"no_one_listening\">Nessuno sta ascoltando</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s ascoltatore</item>\n        <item quantity=\"many\">%s ascoltatori</item>\n        <item quantity=\"other\">%s ascoltatori</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">Contenuti in evidenza predefiniti</string>\n    <string name=\"seek_duration_title\">Durata avanzamento e riavvolgimento rapidi</string>\n    <string name=\"peertube_instance_url_title\">Istanze PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Seleziona le istanze PeerTube preferite</string>\n    <string name=\"peertube_instance_url_help\">Trova altre istanze su %s</string>\n    <string name=\"peertube_instance_add_title\">Aggiungi istanza</string>\n    <string name=\"peertube_instance_add_help\">Inserisci l\\'URL dell\\'istanza</string>\n    <string name=\"peertube_instance_add_fail\">Impossibile convalidare l\\'istanza</string>\n    <string name=\"peertube_instance_add_https_only\">Sono supportati solo gli URL HTTPS</string>\n    <string name=\"peertube_instance_add_exists\">L\\'istanza esiste già</string>\n    <string name=\"local\">Locale</string>\n    <string name=\"recently_added\">Aggiunti di recente</string>\n    <string name=\"most_liked\">Più piaciuti</string>\n    <string name=\"playlist_no_uploader\">Generata automaticamente (nessun autore trovato)</string>\n    <string name=\"recovering\">recupero</string>\n    <string name=\"error_download_resource_gone\">Impossibile recuperare questo download</string>\n    <string name=\"choose_instance_prompt\">Scegli un\\'istanza</string>\n    <string name=\"clear_download_history\">Elimina la cronologia dei download</string>\n    <string name=\"delete_downloaded_files\">Elimina file scaricati</string>\n    <string name=\"permission_display_over_apps\">Consentire la visualizzazione sopra altre applicazioni</string>\n    <string name=\"app_language_title\">Lingua dell\\'applicazione</string>\n    <string name=\"systems_language\">Predefinita di sistema</string>\n    <string name=\"subtitle_activity_recaptcha\">Premere \\\"Fatto\\\" quando risolto</string>\n    <string name=\"done\">Fatto</string>\n    <string name=\"videos_string\">Video</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d secondo</item>\n        <item quantity=\"many\">%d secondi</item>\n        <item quantity=\"other\">%d secondi</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">A causa delle limitazioni di ExoPlayer la durata dello spostamento rapido è stata impostata a %d secondi</string>\n    <string name=\"mute\">Silenzia</string>\n    <string name=\"unmute\">Riattiva audio</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuto</item>\n        <item quantity=\"many\">%d minuti</item>\n        <item quantity=\"other\">%d minuti</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d ora</item>\n        <item quantity=\"many\">%d ore</item>\n        <item quantity=\"other\">%d ore</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d giorno</item>\n        <item quantity=\"many\">%d giorni</item>\n        <item quantity=\"other\">%d giorni</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">Gruppi di canali</string>\n    <string name=\"feed_oldest_subscription_update\">Ultimo aggiornamento iscrizioni: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Non caricate: %d</string>\n    <string name=\"feed_notification_loading\">Caricamento feed…</string>\n    <string name=\"feed_processing_message\">Elaborazione feed…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Seleziona iscrizioni</string>\n    <string name=\"feed_group_dialog_empty_selection\">Nessuna iscrizione selezionata</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d selezionato</item>\n        <item quantity=\"many\">%d selezionati</item>\n        <item quantity=\"other\">%d selezionati</item>\n    </plurals>\n    <string name=\"feed_group_dialog_delete_message\">Eliminare questo gruppo\\?</string>\n    <string name=\"feed_create_new_group_button_title\">Nuovo</string>\n    <string name=\"settings_category_feed_title\">Feed</string>\n    <string name=\"feed_update_threshold_title\">Limite aggiornamento feed</string>\n    <string name=\"feed_update_threshold_summary\">Tempo che deve trascorrere dopo l\\'ultimo aggiornamento, prima che un\\'iscrizione venga considerata obsoleta — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Aggiorna sempre</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Recupero da feed dedicato quando disponibile</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Disponibile per alcuni servizi. Solitamente è molto più veloce, ma può restituire una quantità limitata di elementi e informazioni spesso incomplete (es. durata, tipo di elemento, indicatore per video in diretta)</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Attiva recupero veloce</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Disattiva recupero veloce</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Il recupero dei feed è troppo lento\\? Prova ad abilitare il recupero veloce (nelle impostazioni o premendo il pulsante qui sotto).\n\\n\n\\nNewPipe può caricare i feed in due modi:\n\\n• Recuperando l\\'intero canale, lento ma completo.\n\\n• Utilizzando un endpoint dedicato, veloce ma solitamente incompleto.\n\\n\n\\nSolitamente il metodo più rapido offre meno informazioni, come la durata o il tipo di elemento (non distingue i video normali da quelli in diretta), e può restituire meno elementi.\n\\n\n\\nPer YouTube è possibile usare il recupero veloce sfruttando i suoi feed RSS.\n\\n\n\\nLa scelta va fatta in base alle proprie preferenze: velocità o informazioni precise.</string>\n    <string name=\"feed_group_dialog_empty_name\">Gruppo senza nome</string>\n    <string name=\"content_not_supported\">Questo contenuto non è supportato da NewPipe. \n\\n \n\\nSi spera che possa essere supportato in una versione futura.</string>\n    <string name=\"infinite_videos\">∞ video</string>\n    <string name=\"more_than_100_videos\">100+ video</string>\n    <string name=\"artists\">Artisti</string>\n    <string name=\"albums\">Album</string>\n    <string name=\"songs\">Canzoni</string>\n    <string name=\"restricted_video\">Questo video ha restrizioni di età.\n\\n\n\\nAttivare «%1$s» nelle Impostazioni per poterlo vedere.</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Sì, anche quelli visualizzati parzialmente</string>\n    <string name=\"remove_watched_popup_warning\">I video che sono stati visti prima e dopo essere stati aggiunti alla playlist verranno rimossi. \\nProcedere?</string>\n    <string name=\"remove_watched_popup_title\">Rimuovere i video già visti?</string>\n    <string name=\"remove_watched\">Rimuovi elementi visti</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Attiva la \\\"Modalità con restrizioni\\\" di YouTube</string>\n    <string name=\"show_original_time_ago_summary\">I testi originali dei servizi saranno visibili negli elementi video</string>\n    <string name=\"show_original_time_ago_title\">Mostra i tempi originali degli elementi</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Immagine del canale</string>\n    <string name=\"video_detail_by\">Da %s</string>\n    <string name=\"channel_created_by\">Creato da %s</string>\n    <string name=\"no_playlist_bookmarked_yet\">Non è ancora stata salvata alcuna playlist</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Mostra solo iscrizioni non raggruppate</string>\n    <string name=\"select_a_playlist\">Seleziona una playlist</string>\n    <string name=\"search_showing_result_for\">Risultati per: %s</string>\n    <string name=\"playlist_page_summary\">Pagina delle playlist</string>\n    <string name=\"error_report_open_github_notice\">Prima di segnalare un problema, verificare che non sia già stato riportato da qualcun altro. Il tempo che gli sviluppatori utilizzerebbero per creare un ulteriore ticket, potrebbe invece essere impiegato per correggere il problema stesso.</string>\n    <string name=\"error_report_open_issue_button_text\">Segnala su GitHub</string>\n    <string name=\"copy_for_github\">Copia segnalazione formattata</string>\n    <string name=\"never\">Mai</string>\n    <string name=\"title_activity_play_queue\">Coda riproduzione</string>\n    <string name=\"wifi_only\">Solo Wi-Fi</string>\n    <string name=\"autoplay_summary\">Avvia la riproduzione automaticamente — %s</string>\n    <string name=\"unsupported_url_dialog_message\">URL non riconosciuto. Vuoi aprirlo con un\\'altra app\\?</string>\n    <string name=\"auto_queue_toggle\">Accoda automaticamente</string>\n    <string name=\"clear_queue_confirmation_description\">La coda del lettore attivo sarà sostituita</string>\n    <string name=\"clear_queue_confirmation_title\">Chiedi prima di svuotare la coda</string>\n    <string name=\"clear_queue_confirmation_summary\">Cambiare tipo di riproduzione potrebbe sostituire gli elementi in coda</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_action_4_title\">Azione pulsante 5</string>\n    <string name=\"notification_action_3_title\">Azione pulsante 4</string>\n    <string name=\"notification_action_2_title\">Azione pulsante 3</string>\n    <string name=\"notification_action_1_title\">Azione pulsante 2</string>\n    <string name=\"notification_action_0_title\">Azione pulsante 1</string>\n    <string name=\"notification_action_buffering\">Buffer in corso</string>\n    <string name=\"notification_actions_at_most_three\">Nella notifica compatta è possibile visualizzare al massimo 3 azioni!</string>\n    <string name=\"notification_action_shuffle\">Casuale</string>\n    <string name=\"notification_action_nothing\">Niente</string>\n    <string name=\"notification_action_repeat\">Ripeti</string>\n    <string name=\"notification_scale_to_square_image_title\">Ritaglia copertina con proporzione 1:1</string>\n    <string name=\"notification_scale_to_square_image_summary\">Ritaglia la copertina del video mostrata nella notifica, cambiando la proporzione da 16:9 a 1:1</string>\n    <string name=\"show_memory_leaks\">Mostra memory leak</string>\n    <string name=\"enqueued\">Aggiunto alla coda</string>\n    <string name=\"enqueue_stream\">Accoda</string>\n    <string name=\"clear_cookie_summary\">Cancella i cookie che NewPipe memorizza quando si risolve un reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Cookie reCAPTCHA eliminati</string>\n    <string name=\"clear_cookie_title\">Elimina cookie reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">Consente di usufruire della \\\"Modalità con restrizioni\\\" di YouTube, che esclude contenuti potenzialmente inappropriati per i minori</string>\n    <string name=\"show_age_restricted_content_summary\">Mostra contenuti che hanno un limite di età (es. 18+). Potrebbero essere inadatti ai bambini</string>\n    <string name=\"notification_colorize_summary\">Lascia che Android modifichi il colore della notifica, secondo il colore principale della copertina (funzione non disponibile per tutti i dispositivi)</string>\n    <string name=\"notification_colorize_title\">Colora notifica</string>\n    <string name=\"show_thumbnail_summary\">Utilizza le copertine come sfondo della schermata di blocco e per le notifiche</string>\n    <string name=\"show_thumbnail_title\">Mostra copertina</string>\n    <string name=\"msg_calculating_hash\">Calcolo dell\\'hash</string>\n    <string name=\"hash_channel_name\">Notifica hash video</string>\n    <string name=\"hash_channel_description\">Notifiche per lo stato di avanzamento dell\\'hashing video</string>\n    <string name=\"recent\">Recente</string>\n    <string name=\"show_meta_info_summary\">Disattiva per nascondere i riquadri con informazioni aggiuntive sul contenuto, sul suo autore o su una richiesta di ricerca</string>\n    <string name=\"show_meta_info_title\">Mostra meta-informazioni</string>\n    <string name=\"related_items_tab_description\">Contenuti correlati</string>\n    <string name=\"chapters\">Capitoli</string>\n    <string name=\"description_tab_description\">Descrizione</string>\n    <string name=\"comments_tab_description\">Commenti</string>\n    <string name=\"show_description_summary\">Disattiva per nascondere la descrizione del video e informazioni aggiuntive</string>\n    <string name=\"show_description_title\">Mostra descrizione</string>\n    <string name=\"open_with\">Apri con</string>\n    <string name=\"no_app_to_open_intent\">Sul tuo dispositivo non c\\'è alcuna app che può aprirlo</string>\n    <string name=\"crash_the_app\">Fai crashare l\\'app</string>\n    <string name=\"paid_content\">Questo contenuto è disponibile solo per gli utenti paganti, quindi non può essere riprodotto o scaricato da NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Nel tuo Paese questa è una traccia SoundCloud Go+, quindi non può essere riprodotta o scaricata da NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Questo video è disponibile solo per i membri di YouTube Music Premium, quindi non può essere riprodotto o scaricato da NewPipe.</string>\n    <string name=\"private_content\">Questo contenuto è privato, quindi non può essere riprodotto o scaricato da NewPipe.</string>\n    <string name=\"georestricted_content\">Questo contenuto non è disponibile nel tuo Paese.</string>\n    <string name=\"restricted_video_no_stream\">Questo video è soggetto a restrizioni di età.\n\\nA causa delle nuove politiche di YouTube, NewPipe non può accedere a questo tipo di video.</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"featured\">In evidenza</string>\n    <string name=\"recaptcha_solve\">Risolvi</string>\n    <string name=\"download_has_started\">Download avviato</string>\n    <string name=\"select_night_theme_toast\">Qua sotto è possibile selezionare il tema notturno preferito</string>\n    <string name=\"night_theme_summary\">Seleziona il tema notturno preferito — %s</string>\n    <string name=\"auto_device_theme_title\">Automatico (tema del dispositivo)</string>\n    <string name=\"night_theme_title\">Tema notturno</string>\n    <string name=\"show_channel_details\">Mostra dettagli canale</string>\n    <string name=\"disable_media_tunneling_summary\">Disattiva il tunneling multimediale se durante la riproduzione dei video si verificano schermate nere o irregolarità nell\\'audio.</string>\n    <string name=\"disable_media_tunneling_title\">Disattiva tunneling multimediale</string>\n    <string name=\"metadata_privacy_internal\">Interno</string>\n    <string name=\"metadata_privacy_private\">Privato</string>\n    <string name=\"metadata_privacy_unlisted\">Non in elenco</string>\n    <string name=\"metadata_privacy_public\">Pubblico</string>\n    <string name=\"metadata_host\">Host</string>\n    <string name=\"metadata_support\">Supporto</string>\n    <string name=\"metadata_language\">Lingua</string>\n    <string name=\"metadata_age_limit\">Limite di età</string>\n    <string name=\"metadata_privacy\">Visibilità</string>\n    <string name=\"metadata_licence\">Licenza</string>\n    <string name=\"metadata_tags\">Etichette</string>\n    <string name=\"metadata_category\">Categoria</string>\n    <string name=\"description_select_disable\">Disattiva la selezione del testo nella descrizione</string>\n    <string name=\"description_select_enable\">Attiva la selezione del testo nella descrizione</string>\n    <string name=\"description_select_note\">È possibile selezionare il testo all\\'interno della descrizione. In modalità selezione la pagina potrebbe sfarfallare e i collegamenti potrebbero non essere cliccabili.</string>\n    <string name=\"open_website_license\">Visita il sito</string>\n    <string name=\"account_terminated\">Account chiuso</string>\n    <string name=\"feed_load_error_fast_unknown\">Il recupero veloce dei feed non fornisce ulteriori informazioni al riguardo.</string>\n    <string name=\"feed_load_error_terminated\">L\\'account dell\\'autore è stato chiuso.\n\\nNewPipe non sarà più in grado di caricare questo feed.\n\\nDisiscriversi dal canale\\?</string>\n    <string name=\"feed_load_error_account_info\">Impossibile caricare feed per \\\"%s\\\".</string>\n    <string name=\"feed_load_error\">Errore caricamento feed</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">A partire da Android 10 è supportato solo il Framework di accesso all\\'archiviazione</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">È necessario specificare la destinazione di ogni dowload</string>\n    <string name=\"no_dir_yet\">Non è impostata alcuna cartella per i file scaricati, scegliere quella predefinita</string>\n    <string name=\"off\">Disattivata</string>\n    <string name=\"on\">Attiva</string>\n    <string name=\"tablet_mode_title\">Modalità tablet</string>\n    <string name=\"dont_show\">Non mostrare</string>\n    <string name=\"low_quality_smaller\">Qualità bassa (più piccola)</string>\n    <string name=\"high_quality_larger\">Qualità alta (più grande)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Anteprima sulla barra di avanzamento</string>\n    <string name=\"comments_are_disabled\">Commenti disattivati</string>\n    <string name=\"detail_heart_img_view_description\">Apprezzato dall\\'autore</string>\n    <string name=\"mark_as_watched\">Segna come visto</string>\n    <string name=\"remote_search_suggestions\">Suggerimenti di ricerca remoti</string>\n    <string name=\"local_search_suggestions\">Suggerimenti di ricerca locali</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s download eliminato</item>\n        <item quantity=\"many\">%1$s download eliminati</item>\n        <item quantity=\"other\">%1$s download eliminati</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Download completato</item>\n        <item quantity=\"many\">%s download completati</item>\n        <item quantity=\"other\">%s download completati</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Scorri gli elementi per rimuoverli</string>\n    <string name=\"start_main_player_fullscreen_summary\">Se la rotazione automatica è bloccata, i video non saranno avviati nel mini player, ma direttamente a schermo intero. È comunque possibile accedere al mini player uscendo dalla modalità a schermo intero</string>\n    <string name=\"start_main_player_fullscreen_title\">Avvia il lettore principale a schermo intero</string>\n    <string name=\"enqueued_next\">Aggiunto alla coda come prossimo</string>\n    <string name=\"enqueue_next_stream\">Accoda come prossimo</string>\n    <string name=\"processing_may_take_a_moment\">Elaborazione… Potrebbe volerci un attimo</string>\n    <string name=\"check_for_updates\">Controlla aggiornamenti</string>\n    <string name=\"manual_update_description\">Verifica manualmente la presenza di nuove versioni</string>\n    <string name=\"checking_updates_toast\">Controllo aggiornamenti…</string>\n    <string name=\"feed_new_items\">Nuovi elementi feed</string>\n    <string name=\"show_crash_the_player_summary\">Quando il lettore multimediale è in uso, mostra un\\'opzione per farlo crashare</string>\n    <string name=\"show_crash_the_player_title\">Mostra \\\"Fai crashare il lettore\\\"</string>\n    <string name=\"crash_the_player\">Fai crashare il lettore</string>\n    <string name=\"error_report_notification_title\">NewPipe ha riscontrato un errore, tocca per segnalarlo</string>\n    <string name=\"show_error_snackbar\">Mostra un messaggio di errore</string>\n    <string name=\"no_appropriate_file_manager_message\">Non è stato trovato alcun gestore di file appropriato per questa azione.\n\\nInstallane uno prova a disattivare \\\"%s\\\" nelle impostazioni di download</string>\n    <string name=\"error_report_channel_name\">Notifica per segnalazione errori</string>\n    <string name=\"error_report_channel_description\">Notifiche per segnalare errori</string>\n    <string name=\"error_report_notification_toast\">Si è verificato un errore, vedi la notifica</string>\n    <string name=\"create_error_notification\">Crea una notifica di errore</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Non è stato trovato alcun gestore di file appropriato per questa azione.\n\\nInstallane uno compatibile con Storage Access Framework</string>\n    <string name=\"detail_pinned_comment_view_description\">Commento in primo piano</string>\n    <string name=\"leak_canary_not_available\">LeakCanary non è disponibile</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Predefinito ExoPlayer</string>\n    <string name=\"streams_notification_channel_description\">Notifiche di nuovi contenuti dalle iscrizioni</string>\n    <string name=\"streams_notifications_interval_title\">Frequenza controllo</string>\n    <string name=\"streams_notifications_network_title\">Connessione di rete richiesta</string>\n    <string name=\"get_notified\">Ricevi le notifiche</string>\n    <string name=\"you_successfully_subscribed\">Ti sei iscritto a questo canale</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Attiva/disattiva tutti</string>\n    <string name=\"enable_streams_notifications_title\">Notifiche per nuovi contenuti</string>\n    <string name=\"settings_category_player_notification_title\">Notifica del lettore multimediale</string>\n    <string name=\"settings_category_player_notification_summary\">Configura la notifica dell\\'elemento attualmente in riproduzione</string>\n    <string name=\"notifications\">Notifiche</string>\n    <string name=\"streams_notification_channel_name\">Nuovi contenuti</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nuovo contenuto</item>\n        <item quantity=\"many\">%s nuovi contenuti</item>\n        <item quantity=\"other\">%s nuovi contenuti</item>\n    </plurals>\n    <string name=\"loading_stream_details\">Caricamento dei dettagli dei contenuti…</string>\n    <string name=\"delete_downloaded_files_confirm\">Cancellare dal dispositivo i file scaricati\\?</string>\n    <string name=\"check_new_streams\">Controlla la presenza di nuovi contenuti</string>\n    <string name=\"any_network\">Qualsiasi rete</string>\n    <string name=\"notifications_disabled\">Le notifiche sono disabilitate</string>\n    <string name=\"enable_streams_notifications_summary\">Notifica la presenza di nuovi contenuti dalle iscrizioni</string>\n    <string name=\"semitone\">Semitono</string>\n    <string name=\"percent\">Percentuale</string>\n    <string name=\"selected_stream_external_player_not_supported\">Il flusso selezionato non è supportato dai lettori esterni</string>\n    <string name=\"no_video_streams_available_for_external_players\">Non sono disponibili flussi video per i lettori esterni</string>\n    <string name=\"streams_not_yet_supported_removed\">I flussi che non sono ancora supportati dal downloader non vengono visualizzati</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Non sono disponibili flussi audio per i lettori esterni</string>\n    <string name=\"select_quality_external_players\">Seleziona qualità per lettori esterni</string>\n    <string name=\"unknown_quality\">Qualità sconosciuta</string>\n    <string name=\"unknown_format\">Formato sconosciuto</string>\n    <string name=\"progressive_load_interval_title\">Dimensione intervallo di caricamento della riproduzione</string>\n    <string name=\"faq_title\">Domande frequenti</string>\n    <string name=\"faq_description\">Se riscontri problemi nell\\'utilizzo dell\\'app, dai un\\'occhiata alle risposte delle domande più comuni!</string>\n    <string name=\"sort\">Ordina</string>\n    <string name=\"faq\">Visualizza sul sito</string>\n    <string name=\"fast_mode\">Recupero veloce</string>\n    <string name=\"app_update_available_notification_text\">Premi per scaricare %s</string>\n    <string name=\"app_update_unavailable_toast\">Stai già usando l\\'ultima versione di NewPipe</string>\n    <string name=\"import_subscriptions_hint\">Importa o esporta iscrizioni dal menu a 3 punti</string>\n    <string name=\"night_theme_available\">Questa opzione è disponibile solo se %s è selezionato come Tema</string>\n    <string name=\"msg_failed_to_copy\">Copia negli appunti non riuscita</string>\n    <string name=\"card\">Schede</string>\n    <string name=\"unset_playlist_thumbnail\">Disattiva copertina permanente</string>\n    <string name=\"duplicate_in_playlist\">Le playlist in grigio contengono già questo elemento.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Doppione aggiunto %d volta/e</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignora eventi dei pulsanti multimediali hardware</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Utile usando cuffie con tasti fisici rotti</string>\n    <string name=\"remove_duplicates\">Rimuovi elementi doppi</string>\n    <string name=\"remove_duplicates_title\">Rimuovere gli elementi doppi\\?</string>\n    <string name=\"remove_duplicates_message\">Rimuovere tutti gli elementi doppi di questa playlist\\?</string>\n    <string name=\"feed_hide_streams_title\">Mostra gli elementi seguenti</string>\n    <string name=\"feed_show_hide_streams\">Mostra/Nascondi elementi</string>\n    <string name=\"feed_show_partially_watched\">Visti parzialmente</string>\n    <string name=\"feed_show_watched\">Visti completamente</string>\n    <string name=\"feed_show_upcoming\">Elementi futuri</string>\n    <string name=\"left_gesture_control_title\">Azione gesto sinistro</string>\n    <string name=\"right_gesture_control_title\">Azione gesto destro</string>\n    <string name=\"brightness\">Luminosità</string>\n    <string name=\"volume\">Volume</string>\n    <string name=\"left_gesture_control_summary\">Scegli il gesto per la metà sinistra del riproduttore</string>\n    <string name=\"none\">Nessuno</string>\n    <string name=\"right_gesture_control_summary\">Scegli il gesto per la metà destra del riproduttore</string>\n    <string name=\"progressive_load_interval_summary\">Modifica la dimensione dell\\'intervallo da caricare (attualmente %s). Un valore basso può velocizzare il caricamento iniziale del video</string>\n    <string name=\"prefer_original_audio_title\">Preferisci audio originale</string>\n    <string name=\"prefer_original_audio_summary\">Seleziona la traccia audio originale indipendentemente dalla lingua</string>\n    <string name=\"prefer_descriptive_audio_title\">Preferisci audio descrittivo</string>\n    <string name=\"prefer_descriptive_audio_summary\">Se disponibile, seleziona una traccia audio con descrizioni per ipovedenti</string>\n    <string name=\"play_queue_audio_track\">Audio: %s</string>\n    <string name=\"audio_track\">Traccia audio</string>\n    <string name=\"select_audio_track_external_players\">Seleziona traccia audio per lettori esterni</string>\n    <string name=\"settings_category_exoplayer_summary\">Gestisci alcune impostazioni di ExoPlayer. È necessario riavviare il riproduttore per applicarle</string>\n    <string name=\"unknown_audio_track\">Sconosciuta</string>\n    <string name=\"settings_category_exoplayer_title\">Impostazioni ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Usa la funzione di fallback del decoder di ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Usa sempre la soluzione alternativa per impostare la superficie di uscita video di ExoPlayer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">originale</string>\n    <string name=\"audio_track_type_dubbed\">doppiato</string>\n    <string name=\"audio_track_type_descriptive\">descrittivo</string>\n    <string name=\"audio_track_present_in_video\">Per questo elemento dovrebbe già essere presente una traccia audio</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\n\\nL\\'attivazione di questa opzione potrebbe impedire errori di riproduzione passando al lettore video attuale o passando a schermo intero</string>\n    <string name=\"main_tabs_position_title\">Posizione delle schede principali</string>\n    <string name=\"main_tabs_position_summary\">Sposta in fondo il selettore della scheda principale</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Il tunneling multimediale è stato disabilitato per impostazione predefinita sul dispositivo in uso, poiché è noto che il modello del dispositivo non lo supporta.</string>\n    <string name=\"no_streams\">Nessuna trasmissione</string>\n    <string name=\"no_live_streams\">Nessuna trasmissione in diretta</string>\n    <string name=\"channel_tab_videos\">Video</string>\n    <string name=\"metadata_subscribers\">Iscritti</string>\n    <string name=\"show_channel_tabs_summary\">Quali schede mostrare nelle pagine del canale</string>\n    <string name=\"show_channel_tabs\">Schede canale</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"loading_metadata_title\">Caricamento metadati…</string>\n    <string name=\"feed_fetch_channel_tabs\">Recupera schede del canale</string>\n    <string name=\"channel_tab_about\">Informazioni</string>\n    <string name=\"channel_tab_albums\">Album</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Schede da recuperare quando si aggiorna il feed. Questa opzione non ha effetto se un canale viene aggiornato usando la modalità veloce.</string>\n    <string name=\"channel_tab_playlists\">Playlist</string>\n    <string name=\"channel_tab_tracks\">Tracce</string>\n    <string name=\"channel_tab_channels\">Canali</string>\n    <string name=\"channel_tab_livestreams\">Dirette</string>\n    <string name=\"image_quality_title\">Qualità immagine</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"toggle_screen_orientation\">Cambia orientamento schermo</string>\n    <string name=\"image_quality_low\">Qualità bassa</string>\n    <string name=\"toggle_fullscreen\">Attiva/disattiva schermo intero</string>\n    <string name=\"metadata_avatars\">Avatar</string>\n    <string name=\"next_stream\">Video successivo</string>\n    <string name=\"metadata_subchannel_avatars\">Avatar del sotto-canale</string>\n    <string name=\"open_play_queue\">Apri coda di riproduzione</string>\n    <string name=\"image_quality_none\">Non caricare immagini</string>\n    <string name=\"image_quality_high\">Qualità alta</string>\n    <string name=\"forward\">Avanti</string>\n    <string name=\"rewind\">Riavvolgi</string>\n    <string name=\"replay\">Ricomincia</string>\n    <string name=\"image_quality_medium\">Qualità media</string>\n    <string name=\"metadata_uploader_avatars\">Avatar dell\\'autore</string>\n    <string name=\"metadata_banners\">Banner</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"play\">Riproduci</string>\n    <string name=\"more_options\">Altre opzioni</string>\n    <string name=\"metadata_thumbnails\">Miniature</string>\n    <string name=\"duration\">Durata</string>\n    <string name=\"previous_stream\">Video precedente</string>\n    <string name=\"share_playlist_with_list\">Condividi elenco URL</string>\n    <string name=\"share_playlist_with_titles\">Condividi con i titoli</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">Condividi playlist</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s risposta</item>\n        <item quantity=\"many\">%s risposte</item>\n        <item quantity=\"other\">%s risposte</item>\n    </plurals>\n    <string name=\"show_more\">Mostra altro</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"show_less\">Mostra meno</string>\n    <string name=\"error_insufficient_storage\">Non abbastanza spazio libero sul dispositivo</string>\n    <string name=\"settings_category_backup_restore_title\">Backup e ripristino</string>\n    <string name=\"reset_settings_title\">Azzera le impostazioni</string>\n    <string name=\"reset_all_settings\">L\\'azzeramento di tutte le impostazioni eliminerà tutte le proprie impostazioni e riavvierà l\\'app.\n\\n\n\\nSei sicuro di voler procedere?</string>\n    <string name=\"reset_settings_summary\">Azzera tutte le impostazioni ai loro valori predefiniti</string>\n    <string name=\"yes\">Sì</string>\n    <string name=\"no\">No</string>\n    <string name=\"auto_update_check_description\">NewPipe può cercare automaticamente nuove versioni di tanto in tanto e avvisarti quando sono disponibili.\n\\nVuoi attivarlo?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">secondaria</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Condividi come playlist YouTube temporanea</string>\n    <string name=\"tab_bookmarks_short\">Playlist</string>\n    <string name=\"select_a_feed_group\">Seleziona un gruppo di feed</string>\n    <string name=\"no_feed_group_created_yet\">Ancora nessun gruppo di feed creato</string>\n    <string name=\"feed_group_page_summary\">Pagina gruppo canali</string>\n    <string name=\"search_with_service_name_and_filter\">Cerca %1$s (%2$s)</string>\n    <string name=\"search_with_service_name\">Cerca su %1$s</string>\n    <string name=\"channel_tab_likes\">Mi piace</string>\n    <string name=\"migration_info_6_7_title\">Pagina Top 50 di SoundCloud rimossa</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud ha dismesso i grafici Top 50 originali. La scheda relativa è stata rimossa dalla pagina principale.</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sMilio.</string>\n    <string name=\"short_billion\">%sMilia.</string>\n    <string name=\"migration_info_7_8_title\">Rimosse tendenze combinate YouTube</string>\n    <string name=\"migration_info_7_8_message\">YouTube ha interrotto la pagina di tendenza combinata il 21 luglio 2025. NewPipe ha sostituito la pagina di tendenza predefinita con le dirette in tendenza.\\n\\nPuoi anche selezionare diverse pagine di tendenza in \\\"Impostazioni &gt; Contenuto &gt; Contenuto della pagina principale\\\".</string>\n    <string name=\"trending_gaming\">Giochi in tendenza</string>\n    <string name=\"trending_podcasts\">Podcast in tendenza</string>\n    <string name=\"trending_movies\">Film e spettacoli in tendenza</string>\n    <string name=\"trending_music\">Musica in tendenza</string>\n    <string name=\"permission_display_over_apps_message\">Per usare il riproduttore popup, seleziona %1$s nel seguente menu delle impostazioni Android e attiva %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">“Consenti la visualizzazione sopra altre app”</string>\n    <string name=\"delete_file\">Elimina file</string>\n    <string name=\"delete_entry\">Elimina voce</string>\n    <string name=\"account_terminated_service_provides_reason\">Account eliminato\\n\\n%1$s fornisce questa motivazione: %2$s</string>\n    <string name=\"entry_deleted\">Voce eliminata</string>\n    <string name=\"player_http_403\">Errore HTTP 403 ricevuto dal server durante la riproduzione, probabilmente causato dalla scadenza dell\\'URL in streaming o da un divieto dell\\'IP</string>\n    <string name=\"player_http_invalid_status\">Errore HTTP %1$s ricevuto dal server durante la riproduzione</string>\n    <string name=\"youtube_player_http_403\">Errore HTTP 403 ricevuto dal server durante la riproduzione, probabilmente causato da un divieto dell\\'IP o problemi di de-offuscamento dell\\'URL in streaming</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s ha rifiutato di fornire i dati, chiedendo un accesso per confermare che il richiedente non sia un bot.\\n\\nIl tuo IP potrebbe essere stato temporaneamente vietato da %1$s, puoi aspettare un po\\' di tempo o passare ad un IP diverso (ad esempio accendendo/spegnendo una VPN, o passando dal WiFi ai dati mobili).</string>\n    <string name=\"unsupported_content_in_country\">Questo contenuto non è disponibile per il Paese dei contenuti attualmente selezionato.\\n\\nModifica la selezione da \\\"Impostazioni &gt; Contenuti &gt; Paese dei contenuti predefinito\\\".</string>\n    <string name=\"kao_dialog_warning\">Ad agosto 2025, Google ha annunciato che a partire da settembre 2026, l\\'installazione di app richiederà la verifica dello sviluppatore per tutte le app Android su dispositivi certificati, compresi quelli installati al di fuori del Play Store. Poiché gli sviluppatori di NewPipe non sono d\\'accordo con questo requisito, NewPipe non funzionerà più su dispositivi Android certificati dopo quel mese.</string>\n    <string name=\"kao_dialog_more_info\">Dettagli</string>\n    <string name=\"kao_solution\">Soluzione</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">%1$s に公開</string>\n    <string name=\"no_player_found\">動画プレイヤーが見つかりません｡VLC をインストールしますか？</string>\n    <string name=\"install\">インストール</string>\n    <string name=\"cancel\">キャンセル</string>\n    <string name=\"open_in_browser\">ブラウザで開く</string>\n    <string name=\"share\">共有</string>\n    <string name=\"download\">ダウンロード</string>\n    <string name=\"search\">検索</string>\n    <string name=\"settings\">設定</string>\n    <string name=\"did_you_mean\">もしかして: 「%1$s」\\?</string>\n    <string name=\"share_dialog_title\">共有</string>\n    <string name=\"download_path_title\">動画を保存するフォルダー</string>\n    <string name=\"download_path_summary\">ダウンロードした動画をここに保存します</string>\n    <string name=\"download_path_dialog_title\">動画ファイルをダウンロードするフォルダーを選択して下さい</string>\n    <string name=\"default_resolution_title\">デフォルトの画質</string>\n    <string name=\"play_with_kodi_title\">Kodi で再生</string>\n    <string name=\"kore_not_found\">インストールされてない Kore アプリをインストールしますか？</string>\n    <string name=\"show_play_with_kodi_title\">「Kodi で再生」オプションを表示</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi メディアセンター経由で動画を再生するための設定を表示します</string>\n    <string name=\"play_audio\">音声</string>\n    <string name=\"default_audio_format_title\">デフォルトの音声形式</string>\n    <string name=\"download_dialog_title\">ダウンロード</string>\n    <string name=\"show_next_and_similar_title\">「次の動画」と「関連動画」を表示</string>\n    <string name=\"unsupported_url\">対応していないURLです</string>\n    <string name=\"content_language_title\">デフォルトの言語設定</string>\n    <string name=\"settings_category_video_audio_title\">動画と音声</string>\n    <string name=\"detail_thumbnail_view_description\">ビデオ再生、時間:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">投稿者アイコンのサムネイル</string>\n    <string name=\"detail_dislikes_img_view_description\">低評価</string>\n    <string name=\"detail_likes_img_view_description\">高評価</string>\n    <string name=\"use_external_video_player_title\">外部動画プレイヤーを使用する</string>\n    <string name=\"use_external_audio_player_title\">外部音声プレイヤーを使用する</string>\n    <string name=\"background_player_playing_toast\">バックグラウンドで再生中</string>\n    <string name=\"theme_title\">テーマ</string>\n    <string name=\"dark_theme_title\">ダーク</string>\n    <string name=\"light_theme_title\">ホワイト</string>\n    <string name=\"settings_category_appearance_title\">外観</string>\n    <string name=\"network_error\">ネットワークエラー</string>\n    <string name=\"download_path_audio_title\">音声を保存するフォルダー</string>\n    <string name=\"download_path_audio_summary\">ダウンロードした音楽ファイルをここに保存します</string>\n    <string name=\"download_path_audio_dialog_title\">音楽ファイルをダウンロードするフォルダーを選択して下さい</string>\n    <string name=\"general_error\">エラー</string>\n    <string name=\"could_not_load_thumbnails\">全てのサムネイルを読み込めませんでした</string>\n    <string name=\"parsing_error\">ウェブサイトを解析できませんでした</string>\n    <string name=\"content_not_available\">コンテンツが利用できません</string>\n    <string name=\"could_not_setup_download_menu\">保存メニューを設定できませんでした</string>\n    <string name=\"content\">コンテンツ</string>\n    <string name=\"show_age_restricted_content_title\">年齢制限のあるコンテンツを表示</string>\n    <string name=\"sorry_string\">申し訳ありません。想定外のエラーが発生しました。</string>\n    <string name=\"error_report_button_text\">メールで送る</string>\n    <string name=\"error_snackbar_message\">申し訳ありません、不具合が発生しました。</string>\n    <string name=\"error_snackbar_action\">報告</string>\n    <string name=\"what_device_headline\">情報:</string>\n    <string name=\"what_happened_headline\">発生した内容:</string>\n    <string name=\"your_comment\">あなたのコメント(英語で):</string>\n    <string name=\"error_details_headline\">詳細:</string>\n    <string name=\"video\">動画</string>\n    <string name=\"audio\">音声</string>\n    <string name=\"retry\">再試行</string>\n    <string name=\"duration_live\">生放送</string>\n    <string name=\"main_bg_subtitle\">虫眼鏡をタップして開始します。</string>\n    <string name=\"start\">開始</string>\n    <string name=\"pause\">一時停止</string>\n    <string name=\"delete\">削除</string>\n    <string name=\"checksum\">チェックサム</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">ファイル名</string>\n    <string name=\"msg_threads\">同時接続数</string>\n    <string name=\"msg_error\">エラー</string>\n    <string name=\"msg_running\">ダウンロード中 (NewPipe)</string>\n    <string name=\"msg_running_detail\">タップして詳細を表示</string>\n    <string name=\"msg_wait\">お待ちください…</string>\n    <string name=\"msg_copied\">クリップボードにコピーしました</string>\n    <string name=\"no_available_dir\">後ほど、ダウンロードフォルダーを設定してください</string>\n    <string name=\"downloads\">ダウンロード</string>\n    <string name=\"downloads_title\">ダウンロード</string>\n    <string name=\"error_report_title\">不具合報告</string>\n    <string name=\"app_ui_crash\">アプリ(UI)がクラッシュしました</string>\n    <string name=\"info_labels\">どんな問題:\\nリクエスト:\\nコンテンツ言語:\\nコンテンツ国:\\nアプリ言語:\\nサービス:\\nGMT 時間:\\nパッケージ:\\nバージョン:\\nOSバージョン:</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA の要求</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA を要求しました</string>\n    <string name=\"black_theme_title\">ブラック</string>\n    <string name=\"all\">すべて</string>\n    <string name=\"open_in_popup_mode\">ポップアップモードで開く</string>\n    <string name=\"msg_popup_permission\">ポップアップモードで開くには\n\\n権限の許可が必要です</string>\n    <string name=\"popup_playing_toast\">ポップアップモードで再生中</string>\n    <string name=\"disabled\">無効</string>\n    <string name=\"default_video_format_title\">デフォルトの動画形式</string>\n    <string name=\"default_popup_resolution_title\">デフォルトの画質 (ポップアップ表示)</string>\n    <string name=\"show_higher_resolutions_title\">より高い画質を表示</string>\n    <string name=\"show_higher_resolutions_summary\">2K/4K動画は一部のデバイスでのみ再生できます</string>\n    <string name=\"controls_background_title\">バックグラウンド</string>\n    <string name=\"controls_popup_title\">ポップアップ</string>\n    <string name=\"clear\">消去</string>\n    <string name=\"popup_remember_size_pos_title\">ポップアップの属性を記憶する</string>\n    <string name=\"popup_remember_size_pos_summary\">ポップアップのサイズと位置を記憶する</string>\n    <string name=\"use_external_video_player_summary\">一部の解像度では音声がありません</string>\n    <string name=\"show_search_suggestions_title\">検索候補の表示</string>\n    <string name=\"show_search_suggestions_summary\">検索時に表示する候補を選択します</string>\n    <string name=\"best_resolution\">最高</string>\n    <string name=\"title_activity_about\">NewPipe について</string>\n    <string name=\"title_licenses\">サードパーティー ライセンス</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s 作者 %2$s ライセンス %3$s</string>\n    <string name=\"tab_about\">バージョン情報とよくある質問</string>\n    <string name=\"tab_licenses\">ライセンス</string>\n    <string name=\"app_description\">Android 向けのフリーで軽量なストリーミング。</string>\n    <string name=\"view_on_github\">GitHub で表示</string>\n    <string name=\"app_license_title\">NewPipe のライセンス</string>\n    <string name=\"contribution_encouragement\">翻訳、デザインの変更、コードの整理、動作の重いコードの変更など、アイデアをお持ちではありませんか？ヘルプはいつでも歓迎します。より良いものを一緒に作り上げましょう！</string>\n    <string name=\"read_full_license\">ライセンスを読む</string>\n    <string name=\"contribution_title\">貢献する</string>\n    <string name=\"subscribe_button_title\">チャンネル登録</string>\n    <string name=\"subscribed_button_title\">登録済み</string>\n    <string name=\"channel_unsubscribed\">チャンネル登録を解除しました</string>\n    <string name=\"subscription_change_failed\">チャンネル登録を変更できません</string>\n    <string name=\"subscription_update_failed\">チャンネル登録を更新できません</string>\n    <string name=\"tab_subscriptions\">登録チャンネル</string>\n    <string name=\"fragment_feed_title\">新着</string>\n    <string name=\"enable_search_history_title\">検索履歴</string>\n    <string name=\"enable_search_history_summary\">検索履歴を記憶します</string>\n    <string name=\"enable_watch_history_title\">再生履歴</string>\n    <string name=\"enable_watch_history_summary\">再生履歴を記憶します</string>\n    <string name=\"resume_on_audio_focus_gain_title\">再生の再開</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">電話などによる中断の後、再生を再開します</string>\n    <string name=\"settings_category_player_title\">プレイヤー</string>\n    <string name=\"show_hold_to_append_summary\">動画の詳細ページで、「バックグラウンド」または「ポップアップ」ボタンが押されたときにヒントを表示する</string>\n    <string name=\"settings_category_player_behavior_title\">動作</string>\n    <string name=\"settings_category_history_title\">履歴とキャッシュ</string>\n    <string name=\"undo\">元に戻す</string>\n    <string name=\"play_all\">すべて再生</string>\n    <string name=\"notification_channel_name\">NewPipe の通知</string>\n    <string name=\"unknown_content\">[不明]</string>\n    <string name=\"player_stream_failure\">動画の再生ができませんでした</string>\n    <string name=\"player_unrecoverable_failure\">回復不能なエラーが発生しました</string>\n    <string name=\"search_no_results\">一致する結果はありませんでした</string>\n    <string name=\"no_subscribers\">チャンネル登録者なし</string>\n    <string name=\"no_videos\">動画がありません</string>\n    <string name=\"settings_category_downloads_title\">保存</string>\n    <string name=\"settings_file_charset_title\">ファイル名に使用可能な文字</string>\n    <string name=\"settings_file_replacement_character_summary\">無効な文字はここで指定した文字に置き換えられます</string>\n    <string name=\"settings_file_replacement_character_title\">ファイル名の自動修正</string>\n    <string name=\"charset_letters_and_digits\">文字と数字</string>\n    <string name=\"charset_most_special_characters\">文字と数字と、多くの特殊文字</string>\n    <string name=\"donation_title\">寄付</string>\n    <string name=\"donation_encouragement\">NewPipe は、あなたに最高の体験を提供するために、ボランティアが自分たちの時間を使って開発しています。開発者たちがコーヒーを飲みながら NewPipe を継続的に改良できるよう、ご支援をお願いします。</string>\n    <string name=\"website_title\">Webサイト</string>\n    <string name=\"website_encouragement\">NewPipe の詳しい情報や最新情報については、ウェブサイトをご覧ください。</string>\n    <string name=\"title_activity_history\">履歴</string>\n    <string name=\"action_history\">履歴</string>\n    <string name=\"delete_item_search_history\">このアイテムを検索履歴から削除しますか？</string>\n    <string name=\"main_page_content\">メインページのコンテンツ</string>\n    <string name=\"blank_page_summary\">空白ページ</string>\n    <string name=\"kiosk_page_summary\">Kioskページ</string>\n    <string name=\"channel_page_summary\">チャンネルページ</string>\n    <string name=\"select_a_channel\">チャンネルを選択</string>\n    <string name=\"no_channel_subscribed_yet\">登録しているチャンネルはありません</string>\n    <string name=\"select_a_kiosk\">Kioskを選択</string>\n    <string name=\"trending\">人気</string>\n    <string name=\"top_50\">トップ50</string>\n    <string name=\"play_queue_remove\">削除</string>\n    <string name=\"play_queue_stream_detail\">詳細</string>\n    <string name=\"play_queue_audio_settings\">音声の設定</string>\n    <string name=\"switch_to_background\">バックグラウンド再生を開始</string>\n    <string name=\"switch_to_popup\">ポップアップ再生を開始</string>\n    <string name=\"switch_to_main\">メイン再生に切り替え</string>\n    <string name=\"no_player_found_toast\">動画プレイヤーが見つかりませんでした（VLCをインストールすることで再生できます）。</string>\n    <string name=\"default_content_country_title\">デフォルトの地域設定</string>\n    <string name=\"always\">常に</string>\n    <string name=\"just_once\">一度だけ</string>\n    <string name=\"import_data_title\">データベースをインポート</string>\n    <string name=\"export_data_title\">データベースをエクスポート</string>\n    <string name=\"import_data_summary\">既存の履歴、登録チャンネル一覧、プレイリストおよび (任意) 設定は上書きされます</string>\n    <string name=\"export_data_summary\">再生履歴、登録チャンネル一覧、プレイリストおよび設定をエクスポートします</string>\n    <string name=\"player_recoverable_failure\">エラーから回復中です</string>\n    <string name=\"external_player_unsupported_link_type\">外部プレイヤーは、これらのタイプのリンクをサポートしていません</string>\n    <string name=\"export_complete_toast\">エクスポートしました</string>\n    <string name=\"import_complete_toast\">インポートしました</string>\n    <string name=\"no_valid_zip_file\">有効な ZIP ファイルではありません</string>\n    <string name=\"could_not_import_all_files\">警告: すべてのファイルをインポートできませんでした。</string>\n    <string name=\"override_current_data\">これにより、現在の設定が上書きされます。</string>\n    <string name=\"start_here_on_background\">バックグラウンドで連続再生を開始</string>\n    <string name=\"drawer_open\">ドロワーを開く</string>\n    <string name=\"drawer_close\">ドロワーを閉じる</string>\n    <string name=\"video_player\">動画プレイヤー</string>\n    <string name=\"background_player\">バックグラウンドプレイヤー</string>\n    <string name=\"popup_player\">ポップアッププレイヤー</string>\n    <string name=\"preferred_player_fetcher_notification_title\">情報を取得しています…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">コンテンツを読み込んでいます</string>\n    <string name=\"controls_download_desc\">動画をダウンロード</string>\n    <string name=\"show_info\">情報を表示</string>\n    <string name=\"tab_bookmarks\">ブックマークしたプレイリスト</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">画像キャッシュを消去しました</string>\n    <string name=\"metadata_cache_wipe_title\">キャッシュを消去</string>\n    <string name=\"metadata_cache_wipe_summary\">アプリ内のキャッシュデータをすべて削除します</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">キャッシュが消去されました</string>\n    <string name=\"auto_queue_title\">次の動画を自動でキューに追加する</string>\n    <string name=\"settings_category_debug_title\">デバッグ</string>\n    <string name=\"file\">ファイル</string>\n    <string name=\"video_streams_empty\">動画が見つかりません</string>\n    <string name=\"audio_streams_empty\">音声が見つかりません</string>\n    <string name=\"invalid_directory\">フォルダーが見つかりません</string>\n    <string name=\"invalid_file\">ファイルが存在しないか、読み書きする権限がありません</string>\n    <string name=\"file_name_empty_error\">ファイル名は空白にできません</string>\n    <string name=\"error_occurred_detail\">エラーが発生しました: %1$s</string>\n    <string name=\"no_streams_available_download\">ダウンロードできる動画はありません</string>\n    <string name=\"detail_drag_description\">ドラッグして並べ替え</string>\n    <string name=\"create\">作成</string>\n    <string name=\"dismiss\">破棄</string>\n    <string name=\"rename\">名前を変更</string>\n    <string name=\"always_ask_open_action\">常に確認</string>\n    <string name=\"create_playlist\">新規プレイリスト</string>\n    <string name=\"rename_playlist\">変更</string>\n    <string name=\"name\">プレイリスト名</string>\n    <string name=\"add_to_playlist\">プレイリストに追加</string>\n    <string name=\"set_as_playlist_thumbnail\">プレイリストのサムネイルに設定</string>\n    <string name=\"bookmark_playlist\">プレイリストをブックマーク</string>\n    <string name=\"unbookmark_playlist\">ブックマークを削除</string>\n    <string name=\"delete_playlist_prompt\">このプレイリストを削除しますか？</string>\n    <string name=\"playlist_creation_success\">プレイリストが作成されました</string>\n    <string name=\"playlist_add_stream_success\">プレイリストに追加しました</string>\n    <string name=\"playlist_thumbnail_change_success\">プレイリストのサムネイルを変更しました。</string>\n    <string name=\"caption_none\">字幕表示なし</string>\n    <string name=\"import_title\">インポート</string>\n    <string name=\"import_from\">インポート元</string>\n    <string name=\"export_to\">エクスポート先</string>\n    <string name=\"import_ongoing\">インポートしています…</string>\n    <string name=\"export_ongoing\">エクスポートしています…</string>\n    <string name=\"import_file_title\">ファイルからインポート</string>\n    <string name=\"previous_export\">前回のエクスポート先</string>\n    <string name=\"subscriptions_import_unsuccessful\">登録リストがインポートできませんでした</string>\n    <string name=\"subscriptions_export_unsuccessful\">登録リストがエクスポートできませんでした</string>\n    <string name=\"playback_tempo\">速度</string>\n    <string name=\"playback_pitch\">音程</string>\n    <string name=\"clear_views_history_title\">再生履歴を消去</string>\n    <string name=\"clear_views_history_summary\">再生した動画の履歴と再生位置を削除します</string>\n    <string name=\"watch_history_deleted\">再生履歴を削除しました</string>\n    <string name=\"clear_search_history_title\">検索履歴を消去</string>\n    <string name=\"clear_search_history_summary\">検索キーワードの履歴を削除します</string>\n    <string name=\"search_history_deleted\">検索履歴を削除しました</string>\n    <string name=\"import_settings\">設定もインポートしますか？</string>\n    <string name=\"caption_setting_title\">字幕</string>\n    <string name=\"channels\">チャンネル</string>\n    <string name=\"playlists\">プレイリスト</string>\n    <string name=\"users\">ユーザー</string>\n    <string name=\"privacy_policy_title\">NewPipe プライバシーポリシー</string>\n    <string name=\"read_privacy_policy\">プライバシーポリシーを確認</string>\n    <string name=\"use_inexact_seek_title\">おおまかなシーク</string>\n    <string name=\"use_inexact_seek_summary\">おおまかなシークを使用することで精度が下がる代わりに高速にシークができます。5 秒、15 秒または 25 秒間隔のシークはできません</string>\n    <string name=\"auto_queue_summary\">キューに関連動画を追加して再生を続ける (繰り返ししない場合)</string>\n    <string name=\"delete_view_history_alert\">すべての再生履歴を削除しますか？</string>\n    <string name=\"delete_search_history_alert\">すべての検索履歴を削除しますか？</string>\n    <string name=\"invalid_source\">このファイル/コンテンツはありません</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"other\">チャンネル登録者数 %s人</item>\n    </plurals>\n    <string name=\"no_views\">再生なし</string>\n    <plurals name=\"views\">\n        <item quantity=\"other\">再生回数 %s回</item>\n    </plurals>\n    <string name=\"one_item_deleted\">1 つのアイテムが削除されました。</string>\n    <string name=\"give_back\">支援する</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe プロジェクトはあなたのプライバシーを非常に大切にしています。あなたの同意がない限り、アプリはいかなるデータも収集しません。\n\\nNewPipe のプライバシー・ポリシーでは、クラッシュリポート送信時にどのような種類のデータが送信・記録されるかを詳細に説明しています。</string>\n    <string name=\"app_license\">NewPipe はコピーレフトなソフトウェアです。あなたは自由にそれを使用し、研究し、共有し、そして改善することができます。あなたは、GNU フリーソフトウェア財団が公開する GNU General Public ライセンス バージョン3以降の下に、自由に再配布・修正を行うことができます。</string>\n    <string name=\"title_last_played\">最終再生日時</string>\n    <string name=\"title_most_played\">最も再生された動画</string>\n    <string name=\"resize_zoom\">拡大</string>\n    <string name=\"controls_add_to_playlist_title\">プレイリスト</string>\n    <string name=\"show_hold_to_append_title\">「長押しでキューに追加」のヒントを表示</string>\n    <string name=\"tracks\">トラック</string>\n    <string name=\"notification_channel_description\">NewPipe のプレイヤーの通知</string>\n    <string name=\"new_and_hot\">新着と人気</string>\n    <string name=\"hold_to_append\">長押しでキューに追加</string>\n    <string name=\"start_here_on_popup\">ポップアップで連続再生を開始</string>\n    <string name=\"preferred_open_action_settings_title\">お好みの「開く」アクション</string>\n    <string name=\"preferred_open_action_settings_summary\">コンテンツを開くときのデフォルト動作 — %s</string>\n    <string name=\"resize_fit\">フィット</string>\n    <string name=\"resize_fill\">全画面</string>\n    <string name=\"caption_auto_generated\">自動生成</string>\n    <string name=\"caption_setting_description\">プレーヤーのキャプションテキストの縮尺と背景スタイルを変更します。有効にするには、アプリの再起動が必要です</string>\n    <string name=\"empty_list_subtitle\">何もありません</string>\n    <string name=\"import_youtube_instructions\">Google takeout から YouTube の登録リストをインポート:\n\\n\n\\n1. この URL を開きます: %1$s\n\\n2. ログインしていなければログインします\n\\n3. \\\"すべて選択\\\" をクリックし、そして \\\"選択をすべて解除\\\" をクリック、そして \\\"登録チャンネル\\\" のみを選択し、\\\"OK\\\" をクリック\n\\n4. \\\"次のステップ\\\" をクリックし、そして \\\"エクスポートを作成\\\" をクリック\n\\n5. 表示されたら \\\"ダウンロード\\\" ボタンをクリック\n\\n6. ファイルからインポートをクリックしてダウンロードした zip ファイルを選択\n\\n7. (インポートが失敗したら) csv ファイル (たいてい、\\\"YouTube と YouTube Music/登録チャンネル/登録チャンネル.csv\\\" にある) を抽出し、ファイルからインポートをクリックして抽出した csv ファイルを選択</string>\n    <string name=\"playback_reset\">リセット</string>\n    <string name=\"accept\">同意する</string>\n    <string name=\"decline\">拒否する</string>\n    <string name=\"limit_data_usage_none_description\">制限なし</string>\n    <string name=\"limit_mobile_data_usage_title\">モバイルネットワーク使用時の画質</string>\n    <string name=\"minimize_on_exit_title\">アプリ切り替え時の最小化</string>\n    <string name=\"minimize_on_exit_summary\">プレイヤーから他のアプリに切り替え時の動作 — %s</string>\n    <string name=\"minimize_on_exit_none_description\">何もしない</string>\n    <string name=\"minimize_on_exit_background_description\">バックグラウンドに変更</string>\n    <string name=\"minimize_on_exit_popup_description\">ポップアップに変更</string>\n    <string name=\"enable_leak_canary_summary\">メモリリークの監視は、ヒープダンピング時にアプリが無反応になる原因となります</string>\n    <string name=\"enable_disposed_exceptions_title\">ライフサイクルエラーの報告</string>\n    <string name=\"enable_disposed_exceptions_summary\">破棄されたフラグメントまたはアクティビティの、ライフサイクル範囲外での配信不能なRx例外を強制的に報告します</string>\n    <string name=\"import_soundcloud_instructions\">URL または ID を入力して SoundCloud プロファイルをインポートします:\n\\n\n\\n1. Web ブラウザーで \\\"デスクトップモード\\\" を有効にします (サイトは携帯デバイスで利用できません)\n\\n2. この URL に移動します: %1$s\n\\n3. 必要に応じてログインします\n\\n4. リダイレクトされたプロファイル URL をコピーします。</string>\n    <string name=\"import_soundcloud_instructions_hint\">あなたのID, soundcloud.com/あなたのid</string>\n    <string name=\"import_network_expensive_warning\">この操作により通信料金が増えることがあります。ご注意ください。\n\\n\n\\n続行しますか\\?</string>\n    <string name=\"playback_speed_control\">再生速度を変更</string>\n    <string name=\"unhook_checkbox\">速度と音程を連動せずに変更 (歪むかもしれません)</string>\n    <string name=\"skip_silence_checkbox\">無音の間に早送り</string>\n    <string name=\"playback_step\">音階</string>\n    <string name=\"unsubscribe\">登録解除</string>\n    <string name=\"tab_choose\">タブを選択</string>\n    <string name=\"settings_category_updates_title\">アプリの更新</string>\n    <string name=\"events\">イベント</string>\n    <string name=\"app_update_notification_channel_description\">新しい NewPipe バージョンの通知</string>\n    <string name=\"download_to_sdcard_error_title\">外部記憶装置は利用できません</string>\n    <string name=\"restore_defaults\">既定値に戻す</string>\n    <string name=\"restore_defaults_confirmation\">既定の設定を復元しますか\\?</string>\n    <string name=\"subscribers_count_not_available\">登録者数は利用できません</string>\n    <string name=\"conferences\">会議</string>\n    <string name=\"start_accept_privacy_policy\">ヨーロッパの一般データ保護規制（GDPR）に準拠するために、NewPipeの個人情報保護方針にご注意ください。よく読んでください。\n\\n私たちに不具合報告を送るためには、これを受け入れなければなりません。</string>\n    <string name=\"updates_setting_title\">アプリの更新</string>\n    <string name=\"list_view_mode\">リストビュー モード</string>\n    <string name=\"list\">リスト</string>\n    <string name=\"grid\">グリッド</string>\n    <string name=\"auto\">自動</string>\n    <string name=\"app_update_available_notification_title\">NewPipe のアップデートがあります！</string>\n    <string name=\"missions_header_finished\">完了</string>\n    <string name=\"missions_header_pending\">順番に処理中</string>\n    <string name=\"paused\">一時停止</string>\n    <string name=\"queued\">順番待ちに追加しました</string>\n    <string name=\"post_processing\">保存処理をしています</string>\n    <string name=\"enqueue\">順番に処理する</string>\n    <string name=\"permission_denied\">操作がシステムによって拒否されました</string>\n    <string name=\"download_failed\">ダウンロードに失敗しました</string>\n    <string name=\"generate_unique_name\">一意の名前を生成します</string>\n    <string name=\"overwrite\">上書き</string>\n    <string name=\"overwrite_unrelated_warning\">この名前のファイルは既に存在します</string>\n    <string name=\"overwrite_finished_warning\">この名前のダウンロードファイルは既に存在します</string>\n    <string name=\"download_already_running\">同じ名前を持つダウンロードが既に進行中です</string>\n    <string name=\"show_error\">エラーを表示する</string>\n    <string name=\"error_path_creation\">宛先のフォルダーを作成できません</string>\n    <string name=\"error_file_creation\">ファイルを作成できません</string>\n    <string name=\"error_ssl_exception\">安全な接続に失敗しました</string>\n    <string name=\"error_unknown_host\">サーバが見つかりませんでした</string>\n    <string name=\"error_connect_host\">サーバに接続できません</string>\n    <string name=\"error_http_no_content\">サーバがデータを送信していません</string>\n    <string name=\"error_http_unsupported_range\">サーバが同時接続ダウンロードを受け付けません。再試行してください @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">見つかりません</string>\n    <string name=\"error_postprocessing_failed\">保存処理に失敗しました</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"max_retry_msg\">最大再試行回数</string>\n    <string name=\"max_retry_desc\">ダウンロードを中止するまでの最大再試行回数</string>\n    <string name=\"file_deleted\">ファイルを削除しました</string>\n    <string name=\"app_update_notification_channel_name\">アプリの更新通知</string>\n    <string name=\"download_to_sdcard_error_message\">外部 SD カードにダウンロードできません。ダウンロードフォルダーの場所をリセットしますか\\?</string>\n    <string name=\"saved_tabs_invalid_json\">保存されたタブを読み込めないため、デフォルトのタブを使用します</string>\n    <string name=\"main_page_content_summary\">メインページに表示されるタブ</string>\n    <string name=\"updates_setting_description\">新しいバージョンが利用可能なときにアプリの更新を確認する通知を表示します</string>\n    <string name=\"pause_downloads_on_mobile\">従量制課金ネットワークの割り込み</string>\n    <string name=\"pause_downloads_on_mobile_desc\">モバイルデータ通信に切り替える場合に便利ですが、一部のダウンロードは一時停止できません</string>\n    <string name=\"show_comments_title\">コメントを表示</string>\n    <string name=\"show_comments_summary\">無効にするとコメントを非表示にします</string>\n    <string name=\"autoplay_title\">自動再生</string>\n    <string name=\"no_comments\">コメントなし</string>\n    <string name=\"error_unable_to_load_comments\">コメントを読み込めませんでした</string>\n    <string name=\"close\">閉じる</string>\n    <string name=\"error_timeout\">接続タイムアウト</string>\n    <string name=\"enable_playback_resume_title\">再生を再開</string>\n    <string name=\"enable_playback_resume_summary\">最後に再生した位置を復元します</string>\n    <string name=\"enable_playback_state_lists_title\">リスト内の位置</string>\n    <string name=\"enable_playback_state_lists_summary\">リストに再生位置インジケーターを表示します</string>\n    <string name=\"settings_category_clear_data_title\">データを削除</string>\n    <string name=\"watch_history_states_deleted\">再生位置を削除しました</string>\n    <string name=\"missing_file\">ファイルが移動または削除されました</string>\n    <string name=\"overwrite_failed\">ファイルを上書きできません</string>\n    <string name=\"download_already_pending\">同じファイル名のダウンロードが既に進行中です</string>\n    <string name=\"error_postprocessing_stopped\">ファイルの作業中に NewPipe が閉じられました</string>\n    <string name=\"error_insufficient_storage_left\">デバイスに空き容量がありません</string>\n    <string name=\"error_progress_lost\">ファイルが削除されたため、進行状況が失われました</string>\n    <string name=\"confirm_prompt\">ダウンロード履歴、またはダウンロードしたファイルを消去しますか\\?</string>\n    <string name=\"enable_queue_limit\">ダウンロード キューの制限</string>\n    <string name=\"enable_queue_limit_desc\">同時に１つのダウンロードが実行されます</string>\n    <string name=\"start_downloads\">ダウンロードの開始</string>\n    <string name=\"pause_downloads\">ダウンロードの一時停止</string>\n    <string name=\"downloads_storage_ask_title\">ダウンロード先を尋ねる</string>\n    <string name=\"downloads_storage_ask_summary\">ダウンロードのたびに保存する場所を尋ねます。\n\\nSD カードにダウンロードしたい場合はシステム フォルダ ピッカー (SAF) を有効化します</string>\n    <string name=\"downloads_storage_use_saf_title\">システム フォルダ ピッカー (SAF) を使用する</string>\n    <string name=\"downloads_storage_use_saf_summary\">ストレージアクセスフレームワークは、外部 SD カードへのダウンロードが可能です</string>\n    <string name=\"clear_playback_states_title\">再生位置の削除</string>\n    <string name=\"clear_playback_states_summary\">すべての再生位置を削除します</string>\n    <string name=\"delete_playback_states_alert\">すべての再生位置を削除しますか\\?</string>\n    <string name=\"drawer_header_description\">サービスの切り替え、現在の選択:</string>\n    <plurals name=\"videos\">\n        <item quantity=\"other\">%s本の動画</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">デフォルトのKiosk</string>\n    <string name=\"no_one_watching\">誰も見ていません</string>\n    <plurals name=\"watching\">\n        <item quantity=\"other\">%s人が視聴中</item>\n    </plurals>\n    <string name=\"no_one_listening\">誰も聴いていません</string>\n    <plurals name=\"listening\">\n        <item quantity=\"other\">%s 人が聴取中</item>\n    </plurals>\n    <string name=\"seek_duration_title\">高速早送り/巻き戻し間隔</string>\n    <string name=\"peertube_instance_url_title\">PeerTube インスタンス</string>\n    <string name=\"peertube_instance_url_summary\">PeerTube インスタンスを選択する</string>\n    <string name=\"peertube_instance_url_help\">あなたに最適なインスタンスを探す: %s</string>\n    <string name=\"peertube_instance_add_title\">インスタンスを追加</string>\n    <string name=\"peertube_instance_add_help\">インスタンスの URL を入力</string>\n    <string name=\"peertube_instance_add_fail\">インスタンスを検証することができませんでした</string>\n    <string name=\"peertube_instance_add_https_only\">HTTPS の URL のみに対応しています</string>\n    <string name=\"peertube_instance_add_exists\">インスタンスはすでに存在しています</string>\n    <string name=\"local\">ローカル</string>\n    <string name=\"recently_added\">最近追加された</string>\n    <string name=\"most_liked\">最も評価された</string>\n    <string name=\"recovering\">修復中</string>\n    <string name=\"error_download_resource_gone\">ダウンロードが修復できません</string>\n    <string name=\"choose_instance_prompt\">インスタンスを選択</string>\n    <string name=\"clear_download_history\">ダウンロード履歴を消去</string>\n    <string name=\"delete_downloaded_files\">ダウンロードしたファイルを消去</string>\n    <string name=\"playlist_no_uploader\">自動生成 (アップローダーが見つかりません)</string>\n    <string name=\"permission_display_over_apps\">他のアプリの上に表示する権限を与えてください</string>\n    <string name=\"app_language_title\">アプリの言語</string>\n    <string name=\"systems_language\">システムの既定</string>\n    <string name=\"subtitle_activity_recaptcha\">解けたら「完了」を押してください</string>\n    <string name=\"done\">完了</string>\n    <string name=\"videos_string\">動画</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"other\">%d 秒</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">ExoPlayer の制約のためシーク間隔は %d 秒に設定されました</string>\n    <string name=\"mute\">ミュート</string>\n    <string name=\"unmute\">ミュート解除</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"other\">%d 分</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"other\">%d 時間</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"other\">%d 日</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">チャンネル グループ</string>\n    <string name=\"feed_oldest_subscription_update\">フィードの最終更新: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">読み込み失敗: %d</string>\n    <string name=\"feed_notification_loading\">フィードを読み込み中…</string>\n    <string name=\"feed_processing_message\">フィードを処理中…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">チャンネルを選択</string>\n    <string name=\"feed_group_dialog_empty_selection\">チャンネルが選択されていません</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"other\">%d 選択中</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">グループ名が空です</string>\n    <string name=\"feed_group_dialog_delete_message\">このグループを削除しますか？</string>\n    <string name=\"feed_create_new_group_button_title\">新規</string>\n    <string name=\"settings_category_feed_title\">フィード</string>\n    <string name=\"feed_update_threshold_title\">フィードの更新間隔</string>\n    <string name=\"feed_update_threshold_summary\">最後の更新後、登録チャンネルを更新すべきとするまでの時間 ― %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">常に更新する</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">可能ならば専用フィードから取得</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">いくつかのサービスで利用可能。通常よりも高速ですが制限された情報が取得され、たいていの場合不完全です (例: 再生時間、種類、ライブ ステータスなどがない)</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">高速モードを有効化</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">高速モードを無効化</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">フィードの読み込みが遅すぎると思いますか？ その場合、高速読み込みを有効化してみてください (設定、もしくは下のボタンを押して変更することができます)。\n\\n\n\\nNewPipe は2つの読み込み方法を提供します:\n\\n・登録チャンネル全体を取得します。これは低速ですが完全です。\n\\n・専用のサービス エンドポイントを使用します。これは高速ですが、たいていの場合不完全です。\n\\n\n\\n2つの違いとして、高速なものは通常、再生時間や種類 (ライブと通常の動画を区別できない) などの情報が不足して、正しい量の情報より少なく取得することがあります。\n\\n\n\\nYouTubeは、この高速な読み込み方法をRSSフィードで提供するサービスのひとつです。\n\\n\n\\nつまり、読み込み方法の選択は速度または正確さのどちらを優先するか、あなたの好みによります。</string>\n    <string name=\"infinite_videos\">∞ の動画</string>\n    <string name=\"more_than_100_videos\">100 以上の動画</string>\n    <string name=\"content_not_supported\">このコンテンツはまだ NewPipe でサポートされていません。\n\\n\n\\n今後のバージョンでサポートされるかもしれません。</string>\n    <string name=\"songs\">曲</string>\n    <string name=\"artists\">アーティスト</string>\n    <string name=\"albums\">アルバム</string>\n    <string name=\"restricted_video\">この動画には年齢制限があります。\n\\n\n\\n閲覧したい場合、設定から \\\"%1$s\\\" を有効化してください。</string>\n    <string name=\"remove_watched_popup_warning\">プレイリストに追加される前も追加された後も視聴した動画はプレイリストから削除されます。 \\nよろしいですか？この操作は元に戻せません！</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">はい、部分的に視聴した動画も削除します</string>\n    <string name=\"remove_watched_popup_title\">視聴済みの動画を削除しますか？</string>\n    <string name=\"remove_watched\">視聴済みを削除</string>\n    <string name=\"show_original_time_ago_summary\">サービスのオリジナルのテキストが生放送に表示されます</string>\n    <string name=\"show_original_time_ago_title\">アイテムに元の時間を表示</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTube 制限付きモードを有効化</string>\n    <string name=\"video_detail_by\">%s による</string>\n    <string name=\"channel_created_by\">%s により作成</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">チャンネルのサムネイル</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">グループ化されていない登録チャンネルのみ表示</string>\n    <string name=\"no_playlist_bookmarked_yet\">まだプレイリスト ブックマークはありません</string>\n    <string name=\"error_report_open_github_notice\">クラッシュを説明する問題がすでに存在しているかどうかを確認してください。重複したチケットを作成する場合、あなたは私たちから実際のバグを修正する時間を奪うことになります。</string>\n    <string name=\"search_showing_result_for\">次の検索結果を表示しています: %s</string>\n    <string name=\"error_report_open_issue_button_text\">GitHub で報告する</string>\n    <string name=\"copy_for_github\">整形済みリポートをコピー</string>\n    <string name=\"playlist_page_summary\">プレイリスト ページ</string>\n    <string name=\"select_a_playlist\">プレイリストを選択してください</string>\n    <string name=\"autoplay_summary\">自動的に再生を開始します — %s</string>\n    <string name=\"auto_queue_toggle\">自動でキューに追加</string>\n    <string name=\"clear_queue_confirmation_description\">アクティブなプレイヤーのキューが入れ替わります</string>\n    <string name=\"clear_queue_confirmation_summary\">プレイヤーを別のプレイヤーに切り替えるとキューが置き換わる可能性があります</string>\n    <string name=\"never\">しない</string>\n    <string name=\"wifi_only\">Wi-Fi のみ</string>\n    <string name=\"title_activity_play_queue\">キューを再生</string>\n    <string name=\"clear_queue_confirmation_title\">キューを消去する前に確認する</string>\n    <string name=\"unsupported_url_dialog_message\">URL を認識できませんでした。他のアプリで開きますか？</string>\n    <string name=\"notification_scale_to_square_image_summary\">通知に表示されるサムネイルを 16:9 から正方形にします</string>\n    <string name=\"notification_scale_to_square_image_title\">サムネイルを正方形にする</string>\n    <string name=\"notification_actions_summary\">以下をタップして通知のアクションを編集します。右側にあるチェックボックスを使用してコンパクトな通知に表示するものを３つまで選択します。</string>\n    <string name=\"notification_actions_at_most_three\">コンパクトな通知に表示されるアクションは 3 つまで選ぶことができます！</string>\n    <string name=\"notification_action_4_title\">5 番目のアクションボタン</string>\n    <string name=\"notification_action_3_title\">4 番目のアクションボタン</string>\n    <string name=\"notification_action_2_title\">3 番目のアクションボタン</string>\n    <string name=\"notification_action_1_title\">2 番目のアクションボタン</string>\n    <string name=\"notification_action_0_title\">1 番目のアクションボタン</string>\n    <string name=\"notification_action_nothing\">なし</string>\n    <string name=\"notification_action_repeat\">繰り返し</string>\n    <string name=\"notification_action_shuffle\">シャッフル</string>\n    <string name=\"notification_action_buffering\">バッファリング</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube は、成人向けの可能性があるコンテンツを除外する「制限付きモード」を提供しています</string>\n    <string name=\"show_age_restricted_content_summary\">年齢制限 (18+ など) の理由で、子供には不適切な可能性のあるコンテンツを表示する</string>\n    <string name=\"enqueue_stream\">キューに追加</string>\n    <string name=\"enqueued\">キューに追加しました</string>\n    <string name=\"clear_cookie_summary\">reCAPTCHA を解いたときに NewPipe が保存した Cookie を消去します</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA の Cookie を消去</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA の Cookie が消去されました</string>\n    <string name=\"show_memory_leaks\">メモリリークを表示</string>\n    <string name=\"show_thumbnail_summary\">ロック画面の背景と通知の両方にサムネイルを使用する</string>\n    <string name=\"show_thumbnail_title\">サムネイルを表示する</string>\n    <string name=\"notification_colorize_title\">色つきの通知</string>\n    <string name=\"notification_colorize_summary\">サムネイルのメインカラーを元に、通知をカラーにします(全てのデバイスで動作するとは限りません)</string>\n    <string name=\"show_meta_info_title\">メタ情報を表示</string>\n    <string name=\"msg_calculating_hash\">ハッシュを計算中</string>\n    <string name=\"hash_channel_name\">動画のハッシュ化通知</string>\n    <string name=\"hash_channel_description\">動画のハッシュ化進行状況の通知</string>\n    <string name=\"comments_tab_description\">コメント</string>\n    <string name=\"show_description_summary\">無効にすると動画の概要欄と追加情報を非表示にします</string>\n    <string name=\"show_description_title\">概要欄を表示</string>\n    <string name=\"recent\">最近</string>\n    <string name=\"open_with\">開く</string>\n    <string name=\"description_tab_description\">説明</string>\n    <string name=\"related_items_tab_description\">関連動画</string>\n    <string name=\"show_meta_info_summary\">動画作成者、動画コンテンツ、検索リクエストに関する追加情報を含むメタ情報ボックスを非表示にするにはオフにします</string>\n    <string name=\"no_app_to_open_intent\">お使いのデバイス上のアプリでは、これを開くことはできません</string>\n    <string name=\"chapters\">チャプター</string>\n    <string name=\"paid_content\">このコンテンツは有料のユーザーのみが利用できるため、NewPipeでのストリーミングやダウンロードはできません。</string>\n    <string name=\"youtube_music_premium_content\">この動画は YouTube ミュージック プレミアム会員のみが利用できるようになっているので、NewPipe でストリーミングやダウンロードを行うことはできません。</string>\n    <string name=\"private_content\">このコンテンツは非公開のため、NewPipeでストリーミングやダウンロードすることはできません。</string>\n    <string name=\"soundcloud_go_plus_content\">これは SoundCloud Go+ トラックなので、少なくともあなたの国では、NewPipeではストリーミングやダウンロードができません。</string>\n    <string name=\"georestricted_content\">このコンテンツは、お住まいの国ではご利用いただけません。</string>\n    <string name=\"crash_the_app\">アプリのクラッシュ</string>\n    <string name=\"restricted_video_no_stream\">この動画は年齢制限があります。\n\\n年齢制限付き動画を含む新しい YouTube ポリシーにより、NewPipe は動画ストリームにアクセスできないため再生できません。</string>\n    <string name=\"select_night_theme_toast\">以下からお好みの夜間テーマを選択できます</string>\n    <string name=\"auto_device_theme_title\">自動 (デバイスのテーマ)</string>\n    <string name=\"night_theme_summary\">お好みの夜間テーマを選択 — %s</string>\n    <string name=\"recaptcha_solve\">解決</string>\n    <string name=\"night_theme_title\">夜間テーマ</string>\n    <string name=\"download_has_started\">ダウンロードを開始しました</string>\n    <string name=\"show_channel_details\">チャンネルの詳細を表示</string>\n    <string name=\"radio\">ラジオ</string>\n    <string name=\"featured\">おすすめ</string>\n    <string name=\"disable_media_tunneling_summary\">動画の再生が止まったり動画が出ない場合はメディアトンネリングを無効にしてください。</string>\n    <string name=\"disable_media_tunneling_title\">マルチメディアトンネリングを無効にする</string>\n    <string name=\"metadata_privacy_public\">公開</string>\n    <string name=\"metadata_privacy_unlisted\">限定公開</string>\n    <string name=\"metadata_privacy_private\">非公開</string>\n    <string name=\"metadata_privacy_internal\">内部</string>\n    <string name=\"metadata_category\">カテゴリ</string>\n    <string name=\"metadata_tags\">タグ</string>\n    <string name=\"metadata_licence\">ライセンス</string>\n    <string name=\"metadata_privacy\">プライバシー</string>\n    <string name=\"metadata_age_limit\">年齢制限</string>\n    <string name=\"metadata_language\">言語</string>\n    <string name=\"metadata_support\">サポート</string>\n    <string name=\"metadata_host\">ホスト</string>\n    <string name=\"open_website_license\">ウェブサイトを開く</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">ダウンロードのたびに保存する場所を尋ねます</string>\n    <string name=\"no_dir_yet\">ダウンロードフォルダーがまだ設定されていません。今すぐデフォルトのフォルダーを選択してください</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Android 10 以降は \\'Storage Access Framework\\' のみがサポートされます</string>\n    <string name=\"feed_load_error_fast_unknown\">高速モードでこの情報の詳細は提供されません。</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' のフィードを読み込めませんでした。</string>\n    <string name=\"feed_load_error\">フィードの読み込みエラー</string>\n    <string name=\"description_select_disable\">説明文のテキストの選択を無効にする</string>\n    <string name=\"description_select_enable\">説明文のテキストの選択を有効にする</string>\n    <string name=\"description_select_note\">今説明文のテキストを選択できます。選択モード中はページがちらついたりリンクがクリックできなくなったりすることに注意してください。</string>\n    <string name=\"account_terminated\">停止されたアカウント</string>\n    <string name=\"feed_load_error_terminated\">この投稿者のアカウントは停止されています。\n\\nNewPipe は将来的にこのフィードを読み込めなくなります。\n\\nこのチャンネルの登録を解除しますか？</string>\n    <string name=\"off\">オフ</string>\n    <string name=\"on\">オン</string>\n    <string name=\"tablet_mode_title\">タブレットモード</string>\n    <string name=\"dont_show\">表示しない</string>\n    <string name=\"low_quality_smaller\">低品質 (小)</string>\n    <string name=\"high_quality_larger\">高品質 (大)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">シークバーのサムネイルプレビュー</string>\n    <string name=\"comments_are_disabled\">コメントは無効になっています</string>\n    <string name=\"mark_as_watched\">視聴済みとしてマーク</string>\n    <string name=\"remote_search_suggestions\">リモート検索候補</string>\n    <string name=\"local_search_suggestions\">ローカル検索候補</string>\n    <string name=\"main_page_content_swipe_remove\">アイテムをスワイプして削除</string>\n    <string name=\"start_main_player_fullscreen_summary\">直接フルスクリーンモードに切り替えて、ミニプレイヤーで動画を開始しません。自動回転がロックされている場合でも、フルスクリーンを終了することでミニプレイヤーにアクセスできます</string>\n    <string name=\"start_main_player_fullscreen_title\">プレイヤーをフルスクリーンで開始</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"other\">%1$s つのダウンロードを削除しました</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"other\">%s 個のダウンロードが完了しました</item>\n    </plurals>\n    <string name=\"processing_may_take_a_moment\">処理中… 少し時間がかかるかもしれません</string>\n    <string name=\"manual_update_description\">新しいバージョンを手動で確認します</string>\n    <string name=\"checking_updates_toast\">アップデートを確認中…</string>\n    <string name=\"check_for_updates\">アップデートを確認</string>\n    <string name=\"enqueue_next_stream\">次をキューに追加</string>\n    <string name=\"enqueued_next\">次をキューに追加しました</string>\n    <string name=\"detail_heart_img_view_description\">クリエイターの心をこめて</string>\n    <string name=\"show_crash_the_player_title\">\\\"プレイヤーがクラッシュ\\\"を表示</string>\n    <string name=\"crash_the_player\">プレイヤーがクラッシュ</string>\n    <string name=\"feed_new_items\">新しいフィードアイテム</string>\n    <string name=\"error_report_channel_name\">エラー報告通知</string>\n    <string name=\"error_report_notification_toast\">エラーが発生しました。通知をご覧ください</string>\n    <string name=\"error_report_notification_title\">エラーが発生しました (タップすると報告できます)</string>\n    <string name=\"show_error_snackbar\">スナックバーにエラーを表示</string>\n    <string name=\"detail_pinned_comment_view_description\">固定されたコメント</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">この動作に適切なファイルマネージャが見つかりませんでした。\n\\nStorage Access Framework と互換性のあるファイルマネージャをインストールしてください</string>\n    <string name=\"no_appropriate_file_manager_message\">この動作に適切なファイルマネージャが見つかりませんでした。\n\\nファイルマネージャをインストールするか、ダウンロード設定で \\'%s\\' を無効にすることをお試しください</string>\n    <string name=\"show_crash_the_player_summary\">プレイヤー使用時にクラッシュオプションを表示</string>\n    <string name=\"create_error_notification\">エラー通知を作成</string>\n    <string name=\"error_report_channel_description\">エラーを報告する通知</string>\n    <string name=\"leak_canary_not_available\">LeakCanaryが利用不可能です</string>\n    <string name=\"settings_category_player_notification_title\">プレイヤー通知</string>\n    <string name=\"loading_stream_details\">ストリームの詳細を読み込んでいます…</string>\n    <string name=\"enable_streams_notifications_summary\">登録チャンネルの新しいストリームについて通知する</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"notifications_disabled\">通知は無効化されています</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer のデフォルト</string>\n    <string name=\"get_notified\">通知を受け取る</string>\n    <string name=\"you_successfully_subscribed\">このチャンネルを購読しました</string>\n    <string name=\"delete_downloaded_files_confirm\">ディスクからダウンロードしたすべてのファイルを削除しますか？</string>\n    <string name=\"toggle_all\">すべて切り替え</string>\n    <string name=\"streams_notifications_interval_title\">確認する頻度</string>\n    <string name=\"check_new_streams\">新しいストリームのチェックを実行</string>\n    <string name=\"streams_notification_channel_description\">購読チャンネルの新しいストリームに関する通知</string>\n    <string name=\"enable_streams_notifications_title\">新しいストリームの通知</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"other\">%s 件の新しいストリーム</item>\n    </plurals>\n    <string name=\"streams_notification_channel_name\">新しいストリーム</string>\n    <string name=\"notifications\">通知</string>\n    <string name=\"settings_category_player_notification_summary\">現在再生しているストリームの通知を構成</string>\n    <string name=\"streams_notifications_network_title\">必要なネットワークの種類</string>\n    <string name=\"percent\">パーセント</string>\n    <string name=\"semitone\">半音</string>\n    <string name=\"any_network\">すべてのネットワーク</string>\n    <string name=\"progressive_load_interval_title\">データの読み込み間隔</string>\n    <string name=\"unknown_format\">未知の形式</string>\n    <string name=\"unknown_quality\">未知の品質</string>\n    <string name=\"streams_not_yet_supported_removed\">ダウンローダーによってサポートされてない動画は表示されません</string>\n    <string name=\"selected_stream_external_player_not_supported\">選択された動画は外部プレイヤーによってサポートされていません</string>\n    <string name=\"no_audio_streams_available_for_external_players\">外部プレイヤーで利用可能な音声ストリームがありません</string>\n    <string name=\"no_video_streams_available_for_external_players\">外部プレイヤーで利用可能な動画ストリームがありません</string>\n    <string name=\"select_quality_external_players\">外部プレイヤーでの品質を選択</string>\n    <string name=\"sort\">並び替え</string>\n    <string name=\"faq\">ウェブサイトを表示</string>\n    <string name=\"app_update_available_notification_text\">タップして%sをダウンロード</string>\n    <string name=\"app_update_unavailable_toast\">あなたはNewPipeの最新版を起動しています</string>\n    <string name=\"faq_title\">よくある質問</string>\n    <string name=\"faq_description\">アプリの使い方に困ったときは、よくある質問に答えていますので、ぜひご覧ください!</string>\n    <string name=\"night_theme_available\">%sがテーマに選択された場合のみ、この選択肢が利用可能です</string>\n    <string name=\"fast_mode\">高速モード</string>\n    <string name=\"import_subscriptions_hint\">3点メニューから登録チャンネルの読み込みまたは書き出しが可能</string>\n    <string name=\"card\">カード</string>\n    <string name=\"msg_failed_to_copy\">クリップボードへのコピーに失敗しました</string>\n    <string name=\"duplicate_in_playlist\">灰色で表示されているプレイリストには、すでにこのアイテムが含まれています。</string>\n    <string name=\"playlist_add_stream_success_duplicate\">%d 回重複追加されました</string>\n    <string name=\"unset_playlist_thumbnail\">固定サムネイルの設定を解除</string>\n    <string name=\"remove_duplicates_title\">重複を削除しますか\\?</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">たとえば、物理ボタンが壊れたヘッドセットを使用している場合に便利です</string>\n    <string name=\"remove_duplicates_message\">この再生リスト内の重複したストリームをすべて削除しますか\\?</string>\n    <string name=\"ignore_hardware_media_buttons_title\">ハードウェア メディア ボタン イベントを無視する</string>\n    <string name=\"remove_duplicates\">重複を削除</string>\n    <string name=\"feed_hide_streams_title\">次のストリームを表示</string>\n    <string name=\"feed_show_hide_streams\">ストリームの表示/非表示</string>\n    <string name=\"feed_show_watched\">完全に視聴済み</string>\n    <string name=\"feed_show_partially_watched\">一部視聴済み</string>\n    <string name=\"feed_show_upcoming\">今後</string>\n    <string name=\"left_gesture_control_summary\">再生画面の左半分用にジェスチャーを選択</string>\n    <string name=\"left_gesture_control_title\">左のジェスチャー動作</string>\n    <string name=\"right_gesture_control_summary\">再生画面の右半分用のジェスチャーを選択</string>\n    <string name=\"right_gesture_control_title\">右のジェスチャー動作</string>\n    <string name=\"brightness\">明るさ</string>\n    <string name=\"volume\">音量</string>\n    <string name=\"none\">無</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer 設定</string>\n    <string name=\"settings_category_exoplayer_summary\">ExoPlayer の設定を管理します。これらの変更を反映するにはプレイヤーの再起動が必要です</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">ExoPlayer のデコーダ フォールバック機能を使用する</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">常に ExoPlayer の映像出力 サーフェス設定の解決策を使用する</string>\n    <string name=\"audio_track_type_dubbed\">吹き替え</string>\n    <string name=\"audio_track_type_descriptive\">音声解説</string>\n    <string name=\"prefer_descriptive_audio_title\">音声解説を優先する</string>\n    <string name=\"prefer_descriptive_audio_summary\">利用可能な場合に視覚障害者向けの音声解説トラックを選択する</string>\n    <string name=\"play_queue_audio_track\">オーディオ: %s</string>\n    <string name=\"unknown_audio_track\">不明</string>\n    <string name=\"select_audio_track_external_players\">外部プレイヤー用のオーディオトラックを選択</string>\n    <string name=\"audio_track_type_original\">オリジナル</string>\n    <string name=\"prefer_original_audio_title\">オリジナル音声を優先する</string>\n    <string name=\"prefer_original_audio_summary\">言語に関係なくオリジナルのオーディオトラックを選択する</string>\n    <string name=\"audio_track\">オーディオトラック</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">デコーダの初期化に問題がある場合は、このオプションを有効化してプライマリ デコーダ初期化失敗時に低い優先度のデコーダにフォールバックします。プライマリ デコーダ使用時よりパフォーマンスが悪化する可能性があります</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">この解決策は直接コーデックをサーフェスに設定する代わりに、サーフェスが変更された際に映像コーデックを開放し再インスタンス化します。すでにいくつかのデバイスでこの解決策が使用されていますが、Android 6 以降でのみ機能します\n\\n\n\\nこのオプションを有効化することでプレイヤーを切り替えたり、フルスクリーンに切り替えたりする際の再生エラーを防ぎます</string>\n    <string name=\"progressive_load_interval_summary\">読み込み間隔を変更します。（現在 %s）この値を小さくすると再生開始までの時間が短くなります。変更を適用するには再起動が必要です</string>\n    <string name=\"audio_track_present_in_video\">オーディオトラックは既にこのせせらぎに存在している必要があります</string>\n    <string name=\"main_tabs_position_title\">メインタブの場所</string>\n    <string name=\"main_tabs_position_summary\">メインタブセレクタを下に移動</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"disable_media_tunneling_automatic_info\">お使いのデバイスのモデルではメディアトンネリングがサポートされていないため、このデバイスではメディアトンネリングがデフォルトで無効になっています。</string>\n    <string name=\"no_streams\">ストリームはありません</string>\n    <string name=\"no_live_streams\">ライブ配信はありません</string>\n    <string name=\"metadata_subscribers\">登録者</string>\n    <string name=\"loading_metadata_title\">メタ情報を読み込んでいます…</string>\n    <string name=\"channel_tab_videos\">動画</string>\n    <string name=\"show_channel_tabs_summary\">チャンネルページに表示されるタブ</string>\n    <string name=\"show_channel_tabs\">チャンネルタブ</string>\n    <string name=\"channel_tab_shorts\">ショート</string>\n    <string name=\"feed_fetch_channel_tabs\">チャンネルタブを取得する</string>\n    <string name=\"channel_tab_about\">詳細</string>\n    <string name=\"channel_tab_albums\">アルバム</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">フィードを更新するときに取得するタブ。 高速モードを使用してチャンネルを更新する場合は、効果がありません。</string>\n    <string name=\"channel_tab_playlists\">プレイリスト</string>\n    <string name=\"channel_tab_tracks\">トラック</string>\n    <string name=\"channel_tab_channels\">チャンネル</string>\n    <string name=\"channel_tab_livestreams\">ライブ</string>\n    <string name=\"toggle_screen_orientation\">画面の向きを切り替える</string>\n    <string name=\"toggle_fullscreen\">フルスクリーンに切り替える</string>\n    <string name=\"next_stream\">次のストリーム</string>\n    <string name=\"open_play_queue\">再生キューを開く</string>\n    <string name=\"forward\">フォワード</string>\n    <string name=\"rewind\">巻き戻し</string>\n    <string name=\"replay\">リプレイ</string>\n    <string name=\"play\">再生</string>\n    <string name=\"more_options\">その他のオプション</string>\n    <string name=\"duration\">期間</string>\n    <string name=\"previous_stream\">前のストリーム</string>\n    <string name=\"image_quality_title\">品質</string>\n    <string name=\"question_mark\">？</string>\n    <string name=\"image_quality_low\">低品質</string>\n    <string name=\"metadata_avatars\">アバター</string>\n    <string name=\"metadata_subchannel_avatars\">サブチャンネルのアバター</string>\n    <string name=\"image_quality_none\">画像を読み込まない</string>\n    <string name=\"image_quality_high\">高品質</string>\n    <string name=\"image_quality_medium\">中品質</string>\n    <string name=\"metadata_uploader_avatars\">アップローダーのアバター</string>\n    <string name=\"metadata_banners\">バナー</string>\n    <string name=\"image_quality_summary\">画像の品質と画像を読み込むかどうかを選択して、データとメモリの使用量を削減します。 変更により、メモリ内とディスク上の画像キャッシュの両方がクリアされます — %s</string>\n    <string name=\"metadata_thumbnails\">サムネイル</string>\n    <string name=\"share_playlist_with_list\">URLリストで共有</string>\n    <string name=\"share_playlist_with_titles\">タイトル付きで共有</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">プレイリストを共有</string>\n    <string name=\"video_details_list_item\">- %1$s： %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"other\">%sの返信</item>\n    </plurals>\n    <string name=\"show_more\">もっと見る</string>\n    <string name=\"show_less\">表示を少なくする</string>\n    <string name=\"notification_actions_summary_android13\">以下の通知アクションをタップして編集します。 最初の３つのアクション （再生/一時停止、前へ、次へ）はシステムによって設定されており、カスタマイズすることはできません。</string>\n    <string name=\"error_insufficient_storage\">デバイスの空き容量が不足しています</string>\n    <string name=\"settings_category_backup_restore_title\">バックアップと復元</string>\n    <string name=\"yes\">はい</string>\n    <string name=\"no\">いいえ</string>\n    <string name=\"auto_update_check_description\">NewPipe は定期的に新しいバージョンを自動的にチェックし、更新可能になると通知します。\n\\n有効にしますか？</string>\n    <string name=\"reset_settings_title\">設定をリセット</string>\n    <string name=\"reset_settings_summary\">全ての設定をデフォルト状態にリセットします</string>\n    <string name=\"reset_all_settings\">全ての設定をリセットすると、優先設定が全て破棄され、アプリが再起動します。\n\\n\n\\n続行しますか？</string>\n    <string name=\"import_settings_vulnerable_format\">インポートされているエクスポートの設定は、NewPipe 0.27.0以降は非推奨であった脆弱な形式を使用します。 インポートされているエクスポートは信頼できる情報源からであり、将来的にはNewPipe 0.27.0かこれより新しいバージョンから得られるエクスポートのみを優先して使用します。 この脆弱な形式で設定をインポートするための対応はすぐに完全に削除され、新しいバージョンからエクスポートの設定をインポートすることは出来ません。</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">YouTubeの一時的なプレイリストとして共有</string>\n    <string name=\"audio_track_type_secondary\">二次的</string>\n    <string name=\"kao_dialog_warning\">Google は、2026/2027 年から、認定 Android デバイス上のすべてのアプリについて、開発者が個人の身元情報を直接 Google に提出することを必須にすると発表しました。本アプリの開発者はこの要件に同意していないため、このアプリはその時点以降、認定 Android デバイス上で動作しなくなります。</string>\n    <string name=\"kao_dialog_more_info\">詳細</string>\n    <string name=\"kao_solution\">解決</string>\n    <string name=\"short_billion\">%sB</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ji/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-jv/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"enable_playback_state_lists_title\">Posisi nang daftar</string>\n    <string name=\"enable_playback_resume_title\">Teruske, loske wae lur</string>\n    <string name=\"enable_watch_history_title\">Delok sejarah mantan</string>\n    <string name=\"enable_search_history_title\">Riwayatmu biyen cuk</string>\n    <string name=\"show_search_suggestions_summary\">Duduhke saran nalika nggoleki</string>\n    <string name=\"show_search_suggestions_title\">Goleki saran</string>\n    <string name=\"auto_queue_summary\">Pokoke teruske muter suara/video</string>\n    <string name=\"auto_queue_title\">Antri otomatis stream bare</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Sampah metadata wes dibusak</string>\n    <string name=\"metadata_cache_wipe_summary\">Busak kabeh sampah ora kanggo</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Sampah gambar wes resik</string>\n    <string name=\"show_comments_summary\">Pateni gawe ngumpetke komentar</string>\n    <string name=\"show_comments_title\">Duduhke komentar</string>\n    <string name=\"seek_duration_title\">Durasi cepet maju/mundure</string>\n    <string name=\"popup_remember_size_pos_summary\">Eling-eling ukuran lan posisi ngambang terakhir</string>\n    <string name=\"popup_remember_size_pos_title\">Eling-eling ukuran lan posisi ngambang</string>\n    <string name=\"black_theme_title\">Ireng</string>\n    <string name=\"dark_theme_title\">Peteng</string>\n    <string name=\"light_theme_title\">Padhang</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"default_video_format_title\">Format video standar</string>\n    <string name=\"default_audio_format_title\">Format audio standar</string>\n    <string name=\"play_audio\">Suara ati</string>\n    <string name=\"show_play_with_kodi_summary\">Duduhke pilihan muter video nganggo Kodi</string>\n    <string name=\"show_play_with_kodi_title\">Duduhke pilihan \\\"Puter nganggo Kodi\\\"</string>\n    <string name=\"kore_not_found\">Aplikasi Kore rung ono, pasang\\?</string>\n    <string name=\"play_with_kodi_title\">Puter nganggo Kodi</string>\n    <string name=\"show_higher_resolutions_summary\">Mung piranti tertentu sing iso muter video 2K/4K</string>\n    <string name=\"show_higher_resolutions_title\">Duduhke resolusi luwih gedhe</string>\n    <string name=\"default_popup_resolution_title\">Resolusi ngambang standar</string>\n    <string name=\"default_resolution_title\">Resolusi standar</string>\n    <string name=\"download_path_audio_dialog_title\">Pilih tempat kanggo nyimpen suara</string>\n    <string name=\"download_path_audio_summary\">Suara sing diunduh disimpen nang kene</string>\n    <string name=\"download_path_audio_title\">Tempat nyimpen suara</string>\n    <string name=\"download_path_dialog_title\">Pilih tempat nyimpen video</string>\n    <string name=\"download_path_summary\">Video unduhan disimpen nang kene</string>\n    <string name=\"download_path_title\">Folder video unduhan</string>\n    <string name=\"controls_add_to_playlist_title\">Tambah nang</string>\n    <string name=\"controls_popup_title\">Ngambang</string>\n    <string name=\"controls_background_title\">Latar mburi</string>\n    <string name=\"tab_choose\">Pilih Tab</string>\n    <string name=\"tab_bookmarks\">Daftar sing ditandai</string>\n    <string name=\"tab_subscriptions\">Langganan</string>\n    <string name=\"show_info\">Ndeloke info</string>\n    <string name=\"subscription_update_failed\">Ora iso nganyari langganan</string>\n    <string name=\"subscription_change_failed\">Ora iso ngubah langganan</string>\n    <string name=\"channel_unsubscribed\">Wes ora langganan saluran</string>\n    <string name=\"unsubscribe\">Rasido langganan</string>\n    <string name=\"subscribed_button_title\">Pelanggan</string>\n    <string name=\"subscribe_button_title\">Langganan</string>\n    <string name=\"use_external_audio_player_title\">Gunake pemuter suara liyane</string>\n    <string name=\"use_external_video_player_summary\">Busak suara ing resolusi cuk</string>\n    <string name=\"use_external_video_player_title\">Gunake pemuter video liyane</string>\n    <string name=\"share_dialog_title\">Bagi nganggo</string>\n    <string name=\"did_you_mean\">Maksude: %1$s\\?</string>\n    <string name=\"settings\">Setelan</string>\n    <string name=\"search\">Goleki</string>\n    <string name=\"controls_download_desc\">Unduh file</string>\n    <string name=\"download\">Unduh</string>\n    <string name=\"share\">Bagi</string>\n    <string name=\"open_in_popup_mode\">Buka nang mode nyembul</string>\n    <string name=\"open_in_browser\">Buka nang Browser</string>\n    <string name=\"cancel\">Orasido</string>\n    <string name=\"install\">Pasang</string>\n    <string name=\"no_player_found_toast\">Ra ono pamuter (Sampeyan iso masang VLC kanggo muter iku).</string>\n    <string name=\"no_player_found\">Pamuter ora ditemokke. Pasang VLC\\?</string>\n    <string name=\"upload_date_text\">Diterbitake ing %1$s</string>\n    <string name=\"main_bg_subtitle\">Pencet lup kanggo nglekasi</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ka/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"no_player_found_toast\">ნაკადის პლეერი ვერ მოიძებნა (მის დასაკრავად შეგიძლიათ დააინსტალიროთ VLC).</string>\n    <string name=\"no_player_found\">ნაკადის მოთამაშე ვერ მოიძებნა. დააყენეთ VLC\\?</string>\n    <string name=\"cancel\">გაუქმება</string>\n    <string name=\"share_dialog_title\">გააზიარეთ როგორც</string>\n    <string name=\"use_external_video_player_title\">გამოიყენეთ გარე ვიდეო დამკვრელი</string>\n    <string name=\"tab_bookmarks\">მონიშნული დასაკრავი სიები</string>\n    <string name=\"show_info\">ინფორმაციის ჩვენება</string>\n    <string name=\"tab_choose\">აირჩიეთ ჩანართი</string>\n    <string name=\"download_path_dialog_title\">აირჩიეთ ჩამოტვირთვის საქაღალდე ვიდეო ფაილებისთვის</string>\n    <string name=\"download_path_audio_summary\">გადმოწერილი აუდიო ფაილები ინახება აქ</string>\n    <string name=\"play_with_kodi_title\">დაკვრა Kodi-სთან</string>\n    <string name=\"download_path_audio_dialog_title\">აირჩიეთ ჩამოტვირთვის საქაღალდე აუდიო ფაილებისთვის</string>\n    <string name=\"default_resolution_title\">ნაგულისხმევი რეზოლუცია</string>\n    <string name=\"default_popup_resolution_title\">ამომხტარი ფანჯრის ნაგულისხმევი რეზოლუცია</string>\n    <string name=\"show_higher_resolutions_summary\">მხოლოდ ზოგიერთ მოწყობილობას შეუძლია 2K/4K ვიდეოების დაკვრა</string>\n    <string name=\"crash_the_player\">დაარტყა დამკვრელი</string>\n    <string name=\"notification_scale_to_square_image_title\">ესკიზის ჩამოჭრა ასპექტის თანაფარდობაზე 1:1</string>\n    <string name=\"notification_actions_at_most_three\">თქვენ შეგიძლიათ აირჩიოთ მაქსიმუმ სამი მოქმედება კომპაქტურ შეტყობინებაში საჩვენებლად!</string>\n    <string name=\"notification_actions_summary\">შეცვალეთ თითოეული შეტყობინებების მოქმედება ქვემოთ მასზე შეხებით. აირჩიეთ მაქსიმუმ სამი მათგანი, რომლებიც ნაჩვენები იქნება კომპაქტურ შეტყობინებაში მარჯვნივ მდებარე ველების გამოყენებით</string>\n    <string name=\"remote_search_suggestions\">დისტანციური ძიების შეთავაზებები</string>\n    <string name=\"show_description_summary\">გამორთეთ ვიდეოს აღწერილობისა და დამატებითი ინფორმაციის დასამალად</string>\n    <string name=\"theme_title\">თემა</string>\n    <string name=\"use_inexact_seek_title\">გამოიყენეთ სწრაფი არაზუსტი ძებნა</string>\n    <string name=\"show_meta_info_summary\">გამორთეთ მეტა-ინფორმაციის ყუთების დასამალად ნაკადის შემქმნელის, სტრიმინგის კონტენტის ან ძიების მოთხოვნის შესახებ დამატებითი ინფორმაციით</string>\n    <string name=\"default_video_format_title\">ვიდეოს ნაგულისხმევი ფორმატი</string>\n    <string name=\"notification_action_nothing\">არაფერი</string>\n    <string name=\"notification_colorize_title\">შეფერილობის შეტყობინება</string>\n    <string name=\"popup_remember_size_pos_summary\">გახსოვდეთ ამომხტარი ფანჯრის ბოლო ზომა და პოზიცია</string>\n    <string name=\"notification_colorize_summary\">მიეცით Android-ს შეტყობინებების ფერის მორგება მინიატურაში მთავარი ფერის მიხედვით (გაითვალისწინეთ, რომ ეს არ არის ხელმისაწვდომი ყველა მოწყობილობაზე)</string>\n    <string name=\"enable_playback_state_lists_title\">პოზიციები სიებში</string>\n    <string name=\"resume_on_audio_focus_gain_title\">გააგრძელეთ დაკვრა</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">გააგრძელეთ დაკვრა შეფერხებების შემდეგ (მაგ. სატელეფონო ზარები</string>\n    <string name=\"start_main_player_fullscreen_title\">დაიწყეთ მთავარი მოთამაშე სრულ ეკრანზე</string>\n    <string name=\"unsupported_url_dialog_message\">URL-ის ამოცნობა ვერ მოხერხდა. გავხსნა სხვა აპით\\?</string>\n    <string name=\"default_audio_format_title\">ნაგულისხმევი აუდიო ფორმატი</string>\n    <string name=\"peertube_instance_url_summary\">აირჩიეთ თქვენი საყვარელი PeerTube ეგზემპლარები</string>\n    <string name=\"progressive_load_interval_title\">დაკვრის დატვირთვის ინტერვალის ზომა</string>\n    <string name=\"progressive_load_interval_summary\">შეცვალეთ დატვირთვის ინტერვალის ზომა (ამჟამად %s). დაბალმა მნიშვნელობამ შეიძლება დააჩქაროს საწყისი ვიდეოს ჩატვირთვა.</string>\n    <string name=\"clear_queue_confirmation_title\">მოითხოვეთ დადასტურება რიგის გასუფთავებამდე</string>\n    <string name=\"use_inexact_seek_summary\">არაზუსტი ძიება საშუალებას აძლევს მოთამაშეს უფრო სწრაფად მოიძიოს პოზიციები შემცირებული სიზუსტით. 5, 15 ან 25 წამის ძიება ამით არ მუშაობს</string>\n    <string name=\"seek_duration_title\">სწრაფი წინსვლა/-გადახვევა ძიების ხანგრძლივობა</string>\n    <string name=\"clear_queue_confirmation_summary\">ერთი მოთამაშიდან მეორეზე გადართვამ შესაძლოა შეცვალოს თქვენი რიგი</string>\n    <string name=\"show_search_suggestions_title\">ძიების შეთავაზებები</string>\n    <string name=\"metadata_cache_wipe_summary\">წაშალეთ ყველა ქეშირებული ვებგვერდის მონაცემები</string>\n    <string name=\"auto_queue_title\">შემდეგი ნაკადის ავტომატური შეყვანა</string>\n    <string name=\"auto_queue_summary\">გააგრძელეთ დაკვრის რიგის (არაგანმეორებადი) დასრულება შესაბამისი ნაკადის დამატებით</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">მეტამონაცემების ქეში წაშლილია</string>\n    <string name=\"auto_queue_toggle\">ავტომატური რიგი</string>\n    <string name=\"enable_search_history_title\">ძიების ისტორია</string>\n    <string name=\"settings_category_clear_data_title\">მონაცემების გასუფთავება</string>\n    <string name=\"show_search_suggestions_summary\">აირჩიეთ შემოთავაზებების ჩვენება ძიებისას</string>\n    <string name=\"local_search_suggestions\">ადგილობრივი ძიების წინადადებები</string>\n    <string name=\"enable_playback_state_lists_summary\">დაკვრის პოზიციის ინდიკატორების ჩვენება სიებში</string>\n    <string name=\"download_dialog_title\">ჩამოტვირთვა</string>\n    <string name=\"enable_watch_history_summary\">თვალყური ადევნეთ ნანახ ვიდეოებს</string>\n    <string name=\"start_main_player_fullscreen_summary\">არ დაიწყოთ ვიდეოები მინი პლეერში, არამედ პირდაპირ გადადით სრულეკრანიან რეჟიმში, თუ ავტომატური როტაცია დაბლოკილია. თქვენ კვლავ შეგიძლიათ მინი პლეერზე წვდომა სრულეკრანიდან გასვლით</string>\n    <string name=\"main_bg_subtitle\">დასაწყებად შეეხეთ გამადიდებელს.</string>\n    <string name=\"upload_date_text\">გამოქვეყნების თარიღი: %1$s</string>\n    <string name=\"install\">დაყენება</string>\n    <string name=\"ok\">კარგი</string>\n    <string name=\"open_in_browser\">გახსენი ვებგვერდად</string>\n    <string name=\"mark_as_watched\">მონიშნეთ ნანახად</string>\n    <string name=\"open_in_popup_mode\">გახსენი ამომხტარ მდგომარეობაში</string>\n    <string name=\"open_with\">გახსენი რაღაცით</string>\n    <string name=\"share\">გაზიარება</string>\n    <string name=\"download\">გადმოწერა</string>\n    <string name=\"controls_download_desc\">ნაკადის ფაილი ჩამოტვირთვა</string>\n    <string name=\"search\">ძიება</string>\n    <string name=\"settings\">პარამეტრები</string>\n    <string name=\"did_you_mean\">„%1$s“-ს გულისხმობდი\\?</string>\n    <string name=\"search_showing_result_for\">შედეგების ჩვენება: %s</string>\n    <string name=\"use_external_video_player_summary\">შლის აუდიოს ზოგიერთი რეზოლუციით</string>\n    <string name=\"use_external_audio_player_title\">გამოიყენეთ გარე აუდიო დამკვრელი</string>\n    <string name=\"subscribe_button_title\">გამოწერა</string>\n    <string name=\"subscribed_button_title\">გამოწერილი</string>\n    <string name=\"unsubscribe\">გამოწერის გაუქმება</string>\n    <string name=\"channel_unsubscribed\">არხის გამოწერის გაუქმება</string>\n    <string name=\"subscription_change_failed\">გამოწერის შეცვლა ვერ მოხერხდა</string>\n    <string name=\"subscription_update_failed\">გამოწერის განახლება ვერ მოხერხდა</string>\n    <string name=\"tab_subscriptions\">გამოწერები</string>\n    <string name=\"controls_background_title\">ფონი</string>\n    <string name=\"controls_popup_title\">ამომხტარი ფანჯარა</string>\n    <string name=\"controls_add_to_playlist_title\">დამატება</string>\n    <string name=\"download_path_title\">ვიდეოს ჩამოტვირთვის საქაღალდე</string>\n    <string name=\"download_path_summary\">გადმოწერილი ვიდეო ფაილები ინახება აქ</string>\n    <string name=\"download_path_audio_title\">აუდიოს ჩამოტვირთვის საქაღალდე</string>\n    <string name=\"show_higher_resolutions_title\">უფრო მაღალი რეზოლუციის ჩვენება</string>\n    <string name=\"kore_not_found\">დავაყენო აუცილებელი Kore აპი\\?</string>\n    <string name=\"show_play_with_kodi_title\">აჩვენეთ \\\"დაუკარი კოდით\\\" ვარიანტი</string>\n    <string name=\"show_play_with_kodi_summary\">აჩვენეთ ვიდეოს დაკვრის ვარიანტი Kodi მედია ცენტრის საშუალებით</string>\n    <string name=\"notification_scale_to_square_image_summary\">შეტყობინებაში ნაჩვენები ვიდეოს ესკიზის ამოჭრა 16:9-დან 1:1-მდე ასპექტის თანაფარდობით</string>\n    <string name=\"notification_action_0_title\">პირველი მოქმედების ღილაკი</string>\n    <string name=\"notification_action_1_title\">მეორე მოქმედების ღილაკი</string>\n    <string name=\"notification_action_2_title\">მოქმედების მესამე ღილაკი</string>\n    <string name=\"notification_action_3_title\">მოქმედების მეოთხე ღილაკი</string>\n    <string name=\"notification_action_4_title\">მეხუთე მოქმედების ღილაკი</string>\n    <string name=\"notification_action_repeat\">გაიმეორეთ</string>\n    <string name=\"notification_action_shuffle\">არევა</string>\n    <string name=\"notification_action_buffering\">Ბუფერიზაცია</string>\n    <string name=\"play_audio\">აუდიო</string>\n    <string name=\"night_theme_title\">მუქი თემა</string>\n    <string name=\"light_theme_title\">ღია</string>\n    <string name=\"dark_theme_title\">მუქი</string>\n    <string name=\"black_theme_title\">შავი</string>\n    <string name=\"popup_remember_size_pos_title\">დამახსოვრება ამომხტარი ფანჯრის თვისებები</string>\n    <string name=\"clear_queue_confirmation_description\">აქტიური მოთამაშის რიგი შეიცვლება</string>\n    <string name=\"show_comments_title\">კომენტარების ჩვენება</string>\n    <string name=\"show_comments_summary\">გამორთეთ კომენტარების დასამალად</string>\n    <string name=\"show_next_and_similar_title\">\\\"შემდეგი\\\" და \\\"მსგავსი\\\" ვიდეოების ჩვენება</string>\n    <string name=\"show_description_title\">აღწერილობის ჩვენება</string>\n    <string name=\"show_meta_info_title\">მეტა ინფორმაციის ჩვენება</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">სურათის ქეში წაშლილია</string>\n    <string name=\"metadata_cache_wipe_title\">წაშალეთ ქეშირებული მეტამონაცემები</string>\n    <string name=\"enable_search_history_summary\">შეინახეთ საძიებო მოთხოვნები ადგილობრივად</string>\n    <string name=\"enable_watch_history_title\">ნახვის ისტორია</string>\n    <string name=\"enable_playback_resume_title\">განაახლეთ დაკვრა</string>\n    <string name=\"enable_playback_resume_summary\">აღადგინეთ დაკვრის ბოლო პოზიცია</string>\n    <string name=\"autoplay_title\">Ავტომატური ჩართვა</string>\n    <string name=\"show_hold_to_append_title\">აჩვენეთ წვერი \\\"შეაჩერე რიგში\\\"</string>\n    <string name=\"show_hold_to_append_summary\">რჩევის ჩვენება ფონზე ან ამომხტარ ღილაკზე დაჭერისას ვიდეოში \\\"დეტალები:\\\"</string>\n    <string name=\"unsupported_url\">URL მხარდაუჭერელია</string>\n    <string name=\"default_content_country_title\">ჩანაწერის სასურველი ქვეყანა</string>\n    <string name=\"content_language_title\">ნაგულისხმევი შინაარსის ენა</string>\n    <string name=\"peertube_instance_url_title\">PeerTube-ის შემთხვევები</string>\n    <string name=\"peertube_instance_url_help\">იპოვეთ თქვენთვის სასურველი შემთხვევები %s-ზე</string>\n    <string name=\"peertube_instance_add_title\">მაგალითის დამატება</string>\n    <string name=\"peertube_instance_add_help\">შეიყვანეთ მაგალითის URL</string>\n    <string name=\"peertube_instance_add_https_only\">მხარდაჭერილია მხოლოდ HTTPS URL-ები</string>\n    <string name=\"settings_category_player_title\">დამკვრელი</string>\n    <string name=\"settings_category_player_behavior_title\">Მოქმედება</string>\n    <string name=\"settings_category_video_audio_title\">ვიდეო და აუდიო</string>\n    <string name=\"settings_category_history_title\">ისტორია და ქეში</string>\n    <string name=\"settings_category_appearance_title\">გარეგნობა</string>\n    <string name=\"settings_category_debug_title\">გამართვა</string>\n    <string name=\"settings_category_updates_title\">განახლებები</string>\n    <string name=\"settings_category_player_notification_title\">დამკვრელის შეტყობინება</string>\n    <string name=\"settings_category_player_notification_summary\">მიმდინარე დამკვრელი ნაკადის შეტყობინების კონფიგურაცია</string>\n    <string name=\"background_player_playing_toast\">ვუკრავ ფონზე</string>\n    <string name=\"popup_playing_toast\">ვუკრავ ამომხტარი ფანჯარაში</string>\n    <string name=\"content\">მასალა</string>\n    <string name=\"show_age_restricted_content_title\">მაჩვენე ასაკით შეზღუდული მასალა</string>\n    <string name=\"show_age_restricted_content_summary\">მაჩვენე ბავშვებისთვის შეუფერებელი მასალა (თუნდაც 18 წლის ქვევით შეზღუდული)</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube გთავაზობთ „შეზღუდულ რეჟიმს“, რომელიც მალავს პოტენციურად ზრდასრულთა კონტენტს</string>\n    <string name=\"downloads\">ჩამოტვირთვები</string>\n    <string name=\"downloads_title\">ჩამოტვირთვები</string>\n    <string name=\"error_report_title\">შეცდომის საჩივარი</string>\n    <string name=\"all\">ყველა</string>\n    <string name=\"channels\">არხები</string>\n    <string name=\"playlists\">დასაკრავი სიები</string>\n    <string name=\"videos_string\">ვიდეოები</string>\n    <string name=\"tracks\">ტრეკები</string>\n    <string name=\"users\">მომხმარებლები</string>\n    <string name=\"events\">დღესასწაულები</string>\n    <string name=\"songs\">სიმღერები</string>\n    <string name=\"albums\">ალბუმები</string>\n    <string name=\"artists\">მოღერლები</string>\n    <string name=\"disabled\">გათიშულია</string>\n    <string name=\"clear\">გაწმენდა</string>\n    <string name=\"best_resolution\">საუკეთესო რეზოლუცია</string>\n    <string name=\"undo\">გაუქმება</string>\n    <string name=\"play_all\">ყველას დაკვრა</string>\n    <string name=\"always\">ყოველთვის</string>\n    <string name=\"just_once\">მხოლოდ ერთხელ</string>\n    <string name=\"file\">ფაილი</string>\n    <string name=\"notifications\">შეტყობინებები</string>\n    <string name=\"notification_channel_name\">NewPipe შეტყობინება</string>\n    <string name=\"notification_channel_description\">შეტყობინებები NewPipe-ის დამკვრელისთვის</string>\n    <string name=\"app_update_notification_channel_name\">აპლიკაციის განახლების შეტყობინება</string>\n    <string name=\"app_update_notification_channel_description\">შეტყობინებები NewPipe-ის ახალი ვერსიებისთვის</string>\n    <string name=\"hash_channel_name\">ვიდეო ჰეშის შეტყობინება</string>\n    <string name=\"hash_channel_description\">შეტყობინებები ვიდეოების ჰეშირების პროგრესის შესახებ</string>\n    <string name=\"streams_notification_channel_name\">ახალი ნაკადები</string>\n    <string name=\"error_report_channel_name\">შეცდომის შესახებ შეტყობინება</string>\n    <string name=\"error_report_channel_description\">შეტყობინებები შეცდომების გასასაჩივრებლად</string>\n    <string name=\"unknown_content\">[უცნობი]</string>\n    <string name=\"switch_to_background\">ფონზე გადართვა</string>\n    <string name=\"switch_to_popup\">გადართვა ამომხტარ ფანჯარაზე</string>\n    <string name=\"switch_to_main\">მთავარზე გადართვა</string>\n    <string name=\"import_data_title\">მონაცემთა ბაზის იმპორტი</string>\n    <string name=\"export_data_title\">მონაცემთა ბაზის ექსპორტი</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA ქუქიების გასუფთავება</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA ქუქი-ფაილები გასუფთავდა</string>\n    <string name=\"export_data_summary\">ექსპორტის ისტორია, გამოწერები, დასაკრავი სიები და პარამეტრები</string>\n    <string name=\"clear_views_history_title\">ნახვის ისტორიის გასუფთავება</string>\n    <string name=\"delete_view_history_alert\">წაშალოთ ნახვის მთელი ისტორია\\?</string>\n    <string name=\"watch_history_deleted\">ნახვის ისტორია წაშლილია</string>\n    <string name=\"clear_playback_states_title\">წაშალეთ დაკვრის პოზიციები</string>\n    <string name=\"clear_playback_states_summary\">წაშლის დაკვრის ყველა პოზიციას</string>\n    <string name=\"delete_playback_states_alert\">წაშალოთ დაკვრის ყველა პოზიცია\\?</string>\n    <string name=\"watch_history_states_deleted\">დაკვრის პოზიციები წაშლილია</string>\n    <string name=\"clear_search_history_summary\">წაშლის საძიებო საკვანძო სიტყვების ისტორიას</string>\n    <string name=\"delete_search_history_alert\">წაშალოთ მთელი ძიების ისტორია\\?</string>\n    <string name=\"download_to_sdcard_error_title\">გარე მეხსიერება მიუწვდომელია</string>\n    <string name=\"network_error\">Ქსელის შეცდომა</string>\n    <string name=\"could_not_load_thumbnails\">ყველა ესკიზის ჩატვირთვა ვერ მოხერხდა</string>\n    <string name=\"parsing_error\">ვებსაიტის გარჩევა ვერ მოხერხდა</string>\n    <string name=\"content_not_available\">მასალა ხელმიუწვდომელია</string>\n    <string name=\"could_not_setup_download_menu\">ჩამოტვირთვის მენიუს დაყენება ვერ მოხერხდა</string>\n    <string name=\"app_ui_crash\">აპი/UI გათიშულია</string>\n    <string name=\"player_stream_failure\">ამ ნაკადის დაკვრა ვერ მოხერხდა</string>\n    <string name=\"player_unrecoverable_failure\">მოხდა დამკვრელის გამოუსწორებელი შეცდომა</string>\n    <string name=\"player_recoverable_failure\">დამკვრელის შეცდომის აღდგენა</string>\n    <string name=\"video_streams_empty\">ვიდეო ნაკადები ვერ მოიძებნა</string>\n    <string name=\"audio_streams_empty\">აუდიო ნაკადები ვერ მოიძებნა</string>\n    <string name=\"missing_file\">ფაილი გადატანილია ან წაშლილია</string>\n    <string name=\"invalid_directory\">ასეთი საქაღალდე არ არის</string>\n    <string name=\"invalid_source\">ასეთი ფაილის/შიგთავსის წყარო არ არის</string>\n    <string name=\"file_name_empty_error\">ფაილის სახელი არ შეიძლება იყოს ცარიელი</string>\n    <string name=\"error_occurred_detail\">მოხდა შეცდომა: %1$s</string>\n    <string name=\"no_streams_available_download\">ჩამოსატვირთად ხელმისაწვდომი ნაკადები არ არის</string>\n    <string name=\"restore_defaults\">ნაგულისხმევი პარამეტრების აღდგენა</string>\n    <string name=\"restore_defaults_confirmation\">გსურთ ნაგულისხმევი პარამეტრების აღდგენა\\?</string>\n    <string name=\"permission_display_over_apps\">მიეცით სხვა აპებზე ჩვენების ნებართვა</string>\n    <string name=\"error_report_notification_title\">NewPipe-ს შეექმნა შეცდომა, შეეხეთ შეტყობინებისთვის</string>\n    <string name=\"error_report_notification_toast\">მოხდა შეცდომა, იხილეთ შეტყობინება</string>\n    <string name=\"sorry_string\">უკაცრავად, ეს არ უნდა მომხდარიყო.</string>\n    <string name=\"error_report_button_text\">ელფოსტით შეტყობინება</string>\n    <string name=\"copy_for_github\">დააკოპირეთ ფორმატირებული ანგარიში</string>\n    <string name=\"error_report_open_issue_button_text\">მოხსენება GitHub-ზე</string>\n    <string name=\"error_snackbar_message\">Ბოდიში, რაღაც არ არის რიგზე.</string>\n    <string name=\"error_snackbar_action\">მოხსენება</string>\n    <string name=\"what_device_headline\">ინფორმაცია:</string>\n    <string name=\"what_happened_headline\">Რა მოხდა:</string>\n    <string name=\"your_comment\">თქვენი კომენტარი (ინგლისურად):</string>\n    <string name=\"error_details_headline\">დეტალები:</string>\n    <string name=\"detail_thumbnail_view_description\">ვიდეოს დაკვრა, ხანგრძლივობა:</string>\n    <string name=\"detail_likes_img_view_description\">მოსწონს</string>\n    <string name=\"detail_dislikes_img_view_description\">დაწუნებები</string>\n    <string name=\"comments_tab_description\">კომენტარები</string>\n    <string name=\"related_items_tab_description\">დაკავშირებული ნივთები</string>\n    <string name=\"description_tab_description\">აღწერა</string>\n    <string name=\"search_no_results\">არანაირი შედეგი</string>\n    <string name=\"empty_list_subtitle\">აქ არაფერია კრიკეტების გარდა</string>\n    <string name=\"detail_drag_description\">გადაიტანეთ ხელახლა შეკვეთისთვის</string>\n    <string name=\"video\">ვიდეო</string>\n    <string name=\"audio\">აუდიო</string>\n    <string name=\"retry\">ხელახლა სცადეთ</string>\n    <string name=\"drawer_header_description\">სერვისის გადართვა, ამჟამად არჩეულია:</string>\n    <string name=\"no_subscribers\">გამოწერები არ არის</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s გამომწერი</item>\n        <item quantity=\"other\">%s გამომწერები</item>\n    </plurals>\n    <string name=\"subscribers_count_not_available\">გამომწერების რაოდენობა მიუწვდომელია</string>\n    <string name=\"no_views\">ნახვები არ არის</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s ნახვა</item>\n        <item quantity=\"other\">%s ნახვები</item>\n    </plurals>\n    <string name=\"no_one_watching\">არავინ უყურებს</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s უყურებს</item>\n        <item quantity=\"other\">%s უყურებენ</item>\n    </plurals>\n    <string name=\"no_one_listening\">არავინ უსმენს</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s მსმენელი</item>\n        <item quantity=\"other\">%s მსმენელები</item>\n    </plurals>\n    <string name=\"no_videos\">ვიდეოები არ არის</string>\n    <string name=\"more_than_100_videos\">100+ ვიდეოები</string>\n    <string name=\"infinite_videos\">∞ ვიდეოები</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s ვიდეო</item>\n        <item quantity=\"other\">%s ვიდეოები</item>\n    </plurals>\n    <string name=\"no_comments\">კომენტარი არ არის</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s ახალი ნაკადი</item>\n        <item quantity=\"other\">%s ახალი ნაკადები</item>\n    </plurals>\n    <string name=\"start\">დაწყება</string>\n    <string name=\"pause\">პაუზა</string>\n    <string name=\"rename\">გადარქმევა</string>\n    <string name=\"msg_name\">ფაილის სახელი</string>\n    <string name=\"msg_threads\">ძაფები</string>\n    <string name=\"msg_error\">შეცდომა</string>\n    <string name=\"msg_running\">NewPipe-ის ჩამოტვირთვა</string>\n    <string name=\"msg_running_detail\">შეეხეთ დეტალებისთვის</string>\n    <string name=\"msg_calculating_hash\">ჰეშის გაანგარიშება</string>\n    <string name=\"msg_wait\">გთხოვთ მოიცადოთ…</string>\n    <string name=\"msg_copied\">კოპირებულია ბუფერში</string>\n    <string name=\"msg_popup_permission\">ეს უფლება აუცილებელია\n\\nმხტუნარა რეჟიმში გასახსნელად</string>\n    <string name=\"one_item_deleted\">1 ელემენტი წაიშალა.</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA გამოწვევა</string>\n    <string name=\"subtitle_activity_recaptcha\">როდესაც მოგვარდება, დააჭირეთ შესრულებულია</string>\n    <string name=\"recaptcha_request_toast\">მოთხოვნილია reCAPTCHA გამოწვევა</string>\n    <string name=\"recaptcha_solve\">ამოხსნა</string>\n    <string name=\"done\">შესრულებულია</string>\n    <string name=\"settings_file_replacement_character_title\">შემცვლელი პერსონაჟი</string>\n    <string name=\"charset_letters_and_digits\">ასოები და ციფრები</string>\n    <string name=\"title_activity_about\">NewPipe-ის შესახებ</string>\n    <string name=\"tab_licenses\">ლიცენზიები</string>\n    <string name=\"app_description\">უფასო მსუბუქი ნაკადი Android-ზე.</string>\n    <string name=\"contribution_title\">წვლილი შეიტანეთ</string>\n    <string name=\"contribution_encouragement\">გაქვთ თუ არა იდეები; თარგმანი, დიზაინის ცვლილებები, კოდის გაწმენდა ან კოდის რეალური მძიმე ცვლილებები — დახმარება ყოველთვის მისასალმებელია. რაც მეტი კეთდება მით უკეთესი!</string>\n    <string name=\"view_on_github\">ნახვა GitHub-ზე</string>\n    <string name=\"donation_title\">შემოწირულობა</string>\n    <string name=\"give_back\">დაბრუნება</string>\n    <string name=\"website_title\">საიტი</string>\n    <string name=\"website_encouragement\">ეწვიეთ NewPipe ვებსაიტს დამატებითი ინფორმაციისა და სიახლეებისთვის.</string>\n    <string name=\"privacy_policy_title\">NewPipe-ის კონფიდენციალურობის პოლიტიკა</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe პროექტი თქვენს კონფიდენციალურობას ძალიან სერიოზულად ეკიდება. ამიტომ, აპლიკაცია არ აგროვებს მონაცემებს თქვენი თანხმობის გარეშე.\n\\nNewPipe-ის კონფიდენციალურობის პოლიტიკა დეტალურად განმარტავს, თუ რა მონაცემები იგზავნება და ინახება ავარიის ანგარიშის გაგზავნისას.</string>\n    <string name=\"read_privacy_policy\">წაიკითხეთ კონფიდენციალურობის პოლიტიკა</string>\n    <string name=\"app_license_title\">NewPipe-ის ლიცენზია</string>\n    <string name=\"read_full_license\">წაიკითხეთ ლიცენზია</string>\n    <string name=\"faq_title\">Ხშირად დასმული შეკითხვები</string>\n    <string name=\"faq_description\">თუ აპლიკაციის გამოყენება გიჭირთ, დარწმუნდით, რომ შეამოწმეთ ეს პასუხები საერთო კითხვებზე!</string>\n    <string name=\"faq\">ნახვა საიტზე</string>\n    <string name=\"title_activity_history\">ისტორია</string>\n    <string name=\"action_history\">ისტორია</string>\n    <string name=\"delete_item_search_history\">გსურთ წაშალოთ ეს ელემენტი ძიების ისტორიიდან\\?</string>\n    <string name=\"title_last_played\">ბოლოს დაუკრა</string>\n    <string name=\"title_most_played\">ხშირად დაკრული</string>\n    <string name=\"main_page_content\">მთავარი გვერდის შინაარსი</string>\n    <string name=\"main_page_content_summary\">რა ჩანართებია ნაჩვენები მთავარ გვერდზე</string>\n    <string name=\"main_page_content_swipe_remove\">გადაფურცლეთ ელემენტები მათი ამოსაშლელად</string>\n    <string name=\"channel_page_summary\">არხის გვერდი</string>\n    <string name=\"no_channel_subscribed_yet\">არხის გამოწერები ჯერ არ არის</string>\n    <string name=\"select_a_playlist\">აირჩიეთ დასაკრავი სია</string>\n    <string name=\"no_playlist_bookmarked_yet\">დასაკრავი სიის სანიშნეები ჯერ არ არის</string>\n    <string name=\"select_a_kiosk\">აირჩიეთ კიოსკი</string>\n    <string name=\"export_complete_toast\">ექსპორტირებულია</string>\n    <string name=\"import_complete_toast\">იმპორტირებულია</string>\n    <string name=\"no_valid_zip_file\">არ არის სწორი ZIP ფაილი</string>\n    <string name=\"could_not_import_all_files\">გაფრთხილება: ყველა ფაილის იმპორტი ვერ მოხერხდა.</string>\n    <string name=\"override_current_data\">ეს უგულებელყოფს თქვენს მიმდინარე პარამეტრს.</string>\n    <string name=\"error_unable_to_load_comments\">კომენტარების ჩატვირთვა ვერ მოხერხდა</string>\n    <string name=\"trending\">ტრენდული</string>\n    <string name=\"top_50\">ტოპ 50</string>\n    <string name=\"new_and_hot\">ახალი და ცხელი</string>\n    <string name=\"most_liked\">ყველაზე მეტად მოწონებული</string>\n    <string name=\"conferences\">კონფერენციები</string>\n    <string name=\"title_activity_play_queue\">რიგის დაკვრა</string>\n    <string name=\"play_queue_remove\">ამოღება</string>\n    <string name=\"play_queue_stream_detail\">დეტალები</string>\n    <string name=\"play_queue_audio_settings\">აუდიო პარამეტრები</string>\n    <string name=\"hold_to_append\">გააჩერეთ რიგში</string>\n    <string name=\"show_channel_details\">არხის დეტალების ჩვენება</string>\n    <string name=\"enqueue_stream\">რიგი</string>\n    <string name=\"enqueued\">რიგში ჩადებული</string>\n    <string name=\"enqueue_next_stream\">რიგი შემდეგი</string>\n    <string name=\"start_here_on_background\">დაიწყეთ დაკვრა ფონზე</string>\n    <string name=\"loading_stream_details\">ნაკადის დეტალების ჩატვირთვა…</string>\n    <string name=\"drawer_open\">გახსენით უჯრა</string>\n    <string name=\"drawer_close\">დახურეთ უჯრა</string>\n    <string name=\"preferred_open_action_settings_title\">სასურველი \\\"ღია\\\" მოქმედება</string>\n    <string name=\"preferred_open_action_settings_summary\">ნაგულისხმევი მოქმედება შინაარსის გახსნისას — %s</string>\n    <string name=\"video_player\">ვიდეო დამკვრელი</string>\n    <string name=\"background_player\">ფონური დამკვრელი</string>\n    <string name=\"popup_player\">ამომხტარი დამკვრელი</string>\n    <string name=\"always_ask_open_action\">ყოველთვის იკითხე</string>\n    <string name=\"preferred_player_fetcher_notification_message\">მოთხოვნილი მასალა მზადდება</string>\n    <string name=\"rename_playlist\">გადარქმევა</string>\n    <string name=\"name\">სახელი</string>\n    <string name=\"add_to_playlist\">დასაკრავ სიაში დამატება</string>\n    <string name=\"mute\">დადუმება</string>\n    <string name=\"unmute\">დადუმების მოხსნა</string>\n    <string name=\"set_as_playlist_thumbnail\">დასაკრავი სიის მინიატურად დაყენება</string>\n    <string name=\"bookmark_playlist\">სანიშნე დასაკრავი სია</string>\n    <string name=\"unbookmark_playlist\">ამოიღეთ სანიშნე</string>\n    <string name=\"playlist_creation_success\">დასაკრავი სია შეიქმნა</string>\n    <string name=\"playlist_add_stream_success\">დასაკრავი სიაში</string>\n    <string name=\"playlist_thumbnail_change_success\">დასაკრავი სიის ესკიზი შეიცვალა.</string>\n    <string name=\"playlist_no_uploader\">ავტომატურად გენერირებული (ამტვირთავი ვერ მოიძებნა)</string>\n    <string name=\"caption_none\">სუბიტრები არ არის</string>\n    <string name=\"resize_fit\">Ჯდება</string>\n    <string name=\"resize_fill\">შეავსეთ</string>\n    <string name=\"resize_zoom\">მასშტაბირება</string>\n    <string name=\"caption_auto_generated\">ავტომატურად გენერირებული</string>\n    <string name=\"caption_setting_title\">სუბტიტრები</string>\n    <string name=\"caption_setting_description\">შეცვალეთ დამკვრელის სუბტიტრების ტექსტის მასშტაბი და ფონის სტილი. ძალაში შესვლისთვის საჭიროა აპის გადატვირთვა</string>\n    <string name=\"leak_canary_not_available\">LeakCanary არ არის ხელმისაწვდომი</string>\n    <string name=\"enable_leak_canary_summary\">მეხსიერების გაჟონვის მონიტორინგმა შესაძლოა გამოიწვიოს აპი უპასუხოდ გროვის გადაყრის დროს</string>\n    <string name=\"show_original_time_ago_title\">ორიგინალური დროის ჩვენება ერთეულებზე</string>\n    <string name=\"show_original_time_ago_summary\">ორიგინალური ტექსტები სერვისებიდან ხილული იქნება ნაკადის ერთეულებში</string>\n    <string name=\"disable_media_tunneling_title\">მედია გვირაბის გათიშვა</string>\n    <string name=\"disable_media_tunneling_summary\">გამორთეთ მედია გვირაბი, თუ ვიდეოს დაკვრისას შავი ეკრანი ან ჭუჭყი გაქვთ</string>\n    <string name=\"show_crash_the_player_title\">აჩვენე \\\"დამკვრელის დამსხვრევა\\\"</string>\n    <string name=\"show_crash_the_player_summary\">აჩვენებს ავარიის ვარიანტს დამკვრელის გამოყენებისას</string>\n    <string name=\"check_new_streams\">გაუშვით შემოწმება ახალი ნაკადებისთვის</string>\n    <string name=\"crash_the_app\">აპლიკაციის დაშლა</string>\n    <string name=\"show_error_snackbar\">შეცდომის ზოლის ჩვენება</string>\n    <string name=\"create_error_notification\">შექმენით შეცდომის შეტყობინება</string>\n    <string name=\"import_title\">იმპორტი</string>\n    <string name=\"import_from\">იმპორტი დან</string>\n    <string name=\"export_to\">ექსპორტი</string>\n    <string name=\"import_ongoing\">მიმდინარეობს იმპორტი…</string>\n    <string name=\"export_ongoing\">მიმდინარეობს ექსპორტი…</string>\n    <string name=\"import_file_title\">ფაილის იმპორტი</string>\n    <string name=\"previous_export\">წინა ექსპორტი</string>\n    <string name=\"subscriptions_export_unsuccessful\">გამოწერების ექსპორტი ვერ მოხერხდა</string>\n    <string name=\"import_soundcloud_instructions\">SoundCloud პროფილის იმპორტი URL-ის ან თქვენი ID-ის აკრეფით:\n\\n\n\\n 1. ჩართეთ \\\"დესკტოპის რეჟიმი\\\" ვებ-ბრაუზერში (საიტი მიუწვდომელია მობილური მოწყობილობებისთვის)\n\\n 2. გადადით ამ URL-ზე: %1$s\n\\n 3. შედით სისტემაში მოთხოვნისას\n\\n 4. დააკოპირეთ პროფილის URL, რომელზეც გადამისამართდით.</string>\n    <string name=\"import_soundcloud_instructions_hint\">თქვენი ID, soundcloud.com/yourid</string>\n    <string name=\"import_network_expensive_warning\">გაითვალისწინეთ, რომ ეს ოპერაცია შეიძლება იყოს ქსელის ძვირი.\n\\n\n\\n Გინდა გააგრძელო\\?</string>\n    <string name=\"playback_speed_control\">დაკვრის სიჩქარის კონტროლი</string>\n    <string name=\"playback_tempo\">ტემპი</string>\n    <string name=\"unhook_checkbox\">ამოღება (შეიძლება გამოიწვიოს დამახინჯება)</string>\n    <string name=\"skip_silence_checkbox\">დუმილის დროს სწრაფი წინსვლა</string>\n    <string name=\"playback_step\">ნაბიჯი</string>\n    <string name=\"playback_reset\">გადატვირთვა</string>\n    <string name=\"percent\">პროცენტი</string>\n    <string name=\"semitone\">ნახევარტონი</string>\n    <string name=\"accept\">მიღება</string>\n    <string name=\"decline\">უარყოფა</string>\n    <string name=\"limit_data_usage_none_description\">არანაირი ლიმიტი</string>\n    <string name=\"limit_mobile_data_usage_title\">შეზღუდეთ გარჩევადობა მობილური ინტერნეტის გამოყენებისას</string>\n    <string name=\"enable_streams_notifications_summary\">შემატყობინეთ ახალი ნაკადების შესახებ გამოწერებიდან</string>\n    <string name=\"streams_notifications_interval_title\">სიხშირის შემოწმება</string>\n    <string name=\"any_network\">ნებისმიერი ქსელი</string>\n    <string name=\"updates_setting_title\">განახლებები</string>\n    <string name=\"updates_setting_description\">მაჩვენე შეტყობინება აპის განახლების მოთხოვნით, როდესაც ხელმისაწვდომი იქნება ახალი ვერსია</string>\n    <string name=\"check_for_updates\">Შეამოწმოთ განახლებები</string>\n    <string name=\"manual_update_description\">ხელით შეამოწმეთ ახალი ვერსიები</string>\n    <string name=\"minimize_on_exit_title\">მინიმიზაცია აპის გადამრთველზე</string>\n    <string name=\"minimize_on_exit_summary\">მოქმედება სხვა აპზე გადასვლისას მთავარი ვიდეო დამკვრელიდან — %s</string>\n    <string name=\"minimize_on_exit_none_description\">არცერთი</string>\n    <string name=\"minimize_on_exit_background_description\">მინიმიზაცია ფონურ დამკვრელამდე</string>\n    <string name=\"minimize_on_exit_popup_description\">მინიმიზაცია ამომხტარ დამკვრელიდან</string>\n    <string name=\"autoplay_summary\">დაკვრის ავტომატურად დაწყება — %s</string>\n    <string name=\"never\">არასოდეს</string>\n    <string name=\"list_view_mode\">სიის ნახვის რეჟიმი</string>\n    <string name=\"list\">სია</string>\n    <string name=\"high_quality_larger\">მაღალი ხარისხის (უფრო დიდი)</string>\n    <string name=\"dont_show\">არ მაჩვენო</string>\n    <string name=\"missions_header_finished\">დასრულდა</string>\n    <string name=\"missions_header_pending\">მომლოდინე</string>\n    <string name=\"paused\">დაპაუზდა</string>\n    <string name=\"queued\">რიგში დადგა</string>\n    <string name=\"post_processing\">შემდგომი დამუშავება</string>\n    <string name=\"download_failed\">ჩამოტვირთვა ვერ მოხერხდა</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">ჩამოტვირთვა დასრულდა%s</item>\n        <item quantity=\"other\">%s ჩამოტვირთვები დასრულდა</item>\n    </plurals>\n    <string name=\"overwrite_failed\">ფაილის გადაწერა შეუძლებელია</string>\n    <string name=\"download_already_running\">მიმდინარეობს ჩამოტვირთვა ამ სახელით</string>\n    <string name=\"download_already_pending\">ამ სახელით მომლოდინე ჩამოტვირთვაა</string>\n    <string name=\"show_error\">შეცდომის ჩვენება</string>\n    <string name=\"error_file_creation\">ფაილის შექმნა შეუძლებელია</string>\n    <string name=\"error_path_creation\">დანიშნულების საქაღალდის შექმნა შეუძლებელია</string>\n    <string name=\"error_unknown_host\">სერვერი ვერ ვიპოვე</string>\n    <string name=\"error_connect_host\">სერვერთან დაკავშირება შეუძლებელია</string>\n    <string name=\"error_http_no_content\">სერვერი არ აგზავნის მონაცემებს</string>\n    <string name=\"error_http_unsupported_range\">სერვერი არ იღებს მრავალ ნაკადის ჩამოტვირთვებს, ხელახლა სცადეთ @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">არ მოიძებნა</string>\n    <string name=\"error_postprocessing_failed\">შემდგომი დამუშავება ვერ მოხერხდა</string>\n    <string name=\"error_insufficient_storage_left\">მოწყობილობაზე არ არის დარჩენილი თავისუფალი ადგილი</string>\n    <string name=\"error_timeout\">Კავშირის დრო ამოიწურა</string>\n    <string name=\"error_download_resource_gone\">ამ ჩამოტვირთვის აღდგენა შეუძლებელია</string>\n    <string name=\"delete_downloaded_files\">გადმოწერილი ფაილების წაშლა</string>\n    <string name=\"delete_downloaded_files_confirm\">წაშალოთ ყველა გადმოწერილი ფაილი დისკიდან\\?</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">წაიშალა %1$s ჩამოტვირთვა</item>\n        <item quantity=\"other\">წაიშალა %1$s ჩამოტვირთვები</item>\n    </plurals>\n    <string name=\"stop\">გაჩერდი</string>\n    <string name=\"max_retry_msg\">მაქსიმალური განმეორებითი ცდები</string>\n    <string name=\"max_retry_desc\">მცდელობების მაქსიმალური რაოდენობა ჩამოტვირთვის გაუქმებამდე</string>\n    <string name=\"pause_downloads_on_mobile\">შეფერხება მრიცხველ ქსელებში</string>\n    <string name=\"close\">დახურვა</string>\n    <string name=\"enable_queue_limit\">ჩამოტვირთვის რიგის შეზღუდვა</string>\n    <string name=\"enable_queue_limit_desc\">ერთი ჩამოტვირთვა ერთდროულად იმუშავებს</string>\n    <string name=\"start_downloads\">ჩამოტვირთვების დაწყება</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">თქვენ მოგეთხოვებათ სად შეინახოთ თითოეული ჩამოტვირთვა</string>\n    <string name=\"downloads_storage_use_saf_title\">გამოიყენეთ სისტემის საქაღალდის ამომრჩევი (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\\"Storage Access Framework\\\" საშუალებას გაძლევთ ჩამოტვირთოთ გარე SD ბარათზე</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Android 10-დან მხოლოდ „Storage Access Framework“ არის მხარდაჭერილი</string>\n    <string name=\"choose_instance_prompt\">აირჩიეთ მაგალითი</string>\n    <string name=\"app_language_title\">აპლიკაციის ენა</string>\n    <string name=\"systems_language\">სისტემის ნაგულისხმევი</string>\n    <string name=\"remove_watched\">ნანახის ამოღება</string>\n    <string name=\"remove_watched_popup_title\">წაშალოთ ნანახი ვიდეოები?</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">დიახ, და ნაწილობრივ ნანახი ვიდეოები</string>\n    <string name=\"new_seek_duration_toast\">ExoPlayer-ის შეზღუდვების გამო ძიების ხანგრძლივობა დაყენდა %d წამზე</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d წამი</item>\n        <item quantity=\"other\">%d წამები</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d წუთი</item>\n        <item quantity=\"other\">%d წუთები</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d საათი</item>\n        <item quantity=\"other\">%d საათები</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d დღე</item>\n        <item quantity=\"other\">%d დღეების</item>\n    </plurals>\n    <string name=\"fragment_feed_title\">Რა არის ახალი</string>\n    <string name=\"feed_groups_header_title\">არხების ჯგუფები</string>\n    <string name=\"feed_oldest_subscription_update\">არხი ბოლოს განახლდა: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">არ არის ჩატვირთული: %d</string>\n    <string name=\"feed_notification_loading\">არხის ჩატვირთვა…</string>\n    <string name=\"feed_processing_message\">არხის დამუშავება…</string>\n    <string name=\"feed_new_items\">ახალი არხის ელემენტები</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">აირჩიეთ გამომწერები</string>\n    <string name=\"feed_group_dialog_empty_selection\">გამოწერები არ არის არჩეული</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">არჩეული %d</item>\n        <item quantity=\"other\">არჩეულია %d</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">ცარიელი ჯგუფის სახელი</string>\n    <string name=\"feed_group_dialog_delete_message\">გსურთ ამ ჯგუფის წაშლა\\?</string>\n    <string name=\"feed_create_new_group_button_title\">ახალი</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">მხოლოდ დაუჯგუფებელი გამოწერების ჩვენება</string>\n    <string name=\"settings_category_feed_title\">არხი</string>\n    <string name=\"feed_update_threshold_title\">არხის განახლების ბარიერი</string>\n    <string name=\"feed_update_threshold_summary\">დრო ბოლო განახლებიდან გამოწერამდე ითვლება მოძველებულად — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">ყოველთვის განახლება</string>\n    <string name=\"feed_load_error\">შეცდომა არხის ჩატვირთვისას</string>\n    <string name=\"feed_load_error_terminated\">ავტორის ანგარიში შეჩერებულია.\n\\n NewPipe ვერ შეძლებს ამ არხის ჩატვირთვას მომავალში.\n\\n გსურთ ამ არხის გამოწერის გაუქმება\\?</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">მიიღეთ გამოყოფილი არხიდან, როცა ხელმისაწვდომია</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">ჩართეთ სწრაფი რეჟიმი</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">სწრაფი რეჟიმის გამორთვა</string>\n    <string name=\"content_not_supported\">ეს შინაარსი ჯერ არ არის მხარდაჭერილი NewPipe-ის მიერ.\n\\n\n\\n იმედია, ის იქნება მხარდაჭერილი მომავალ ვერსიაში.</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">არხის ავატარის ესკიზი</string>\n    <string name=\"channel_created_by\">შექმნილია %s-ის მიერ</string>\n    <string name=\"video_detail_by\">%s-ის მიხედვით</string>\n    <string name=\"playlist_page_summary\">დასაკრავი სიის გვერდი</string>\n    <string name=\"show_thumbnail_title\">ესკიზის ჩვენება</string>\n    <string name=\"recent\">Ბოლო</string>\n    <string name=\"chapters\">თავები</string>\n    <string name=\"no_app_to_open_intent\">თქვენს მოწყობილობაზე არცერთ აპლიკაციას არ შეუძლია ამის გახსნა</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა.\n\\n გთხოვთ, დააინსტალიროთ Storage Access Framework თავსებადი ფაილ მენეჯერი</string>\n    <string name=\"georestricted_content\">ეს ხელმიუწვდომელია თქვენი ქვეყნიდან.</string>\n    <string name=\"private_content\">ეს მასალა პირადულია, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია.</string>\n    <string name=\"account_terminated\">ანგარიში შეწყვეტილია</string>\n    <string name=\"paid_content\">ეს მასალა ხელმისაწვდომია მხოლოდ გადამხდელებისთვის, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია.</string>\n    <string name=\"featured\">გამორჩეული</string>\n    <string name=\"radio\">რადიო</string>\n    <string name=\"night_theme_summary\">აირჩიეთ თქვენი საყვარელი ღამის თემა — %s</string>\n    <string name=\"download_has_started\">ჩამოტვირთვა დაიწყო</string>\n    <string name=\"description_select_enable\">ჩართეთ აღწერილობაში ტექსტის არჩევა</string>\n    <string name=\"description_select_disable\">გამორთეთ აღწერილობაში ტექსტის არჩევა</string>\n    <string name=\"metadata_category\">კატეგორია</string>\n    <string name=\"metadata_tags\">ტეგები</string>\n    <string name=\"metadata_licence\">ლიცენზია</string>\n    <string name=\"metadata_privacy\">კონფიდენციალურობა</string>\n    <string name=\"metadata_age_limit\">Ასაკობრივი შეზღუდვა</string>\n    <string name=\"metadata_language\">Ენა</string>\n    <string name=\"metadata_host\">მასპინძელი</string>\n    <string name=\"metadata_privacy_public\">საჯარო</string>\n    <string name=\"metadata_privacy_unlisted\">დამალული</string>\n    <string name=\"metadata_privacy_private\">პირადი</string>\n    <string name=\"metadata_privacy_internal\">შიდა</string>\n    <string name=\"detail_pinned_comment_view_description\">ჩამაგრებული კომენტარი</string>\n    <string name=\"detail_heart_img_view_description\">დაგულებულია შემქმნელის მიერ</string>\n    <string name=\"open_website_license\">საიტის გახსნა</string>\n    <string name=\"tablet_mode_title\">პლანშეტის რეჟიმი</string>\n    <string name=\"on\">ჩართულია</string>\n    <string name=\"off\">გამორთულია</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer ნაგულისხმევი</string>\n    <string name=\"notifications_disabled\">შეტყობინებები გამორთულია</string>\n    <string name=\"get_notified\">მიიღეთ შეტყობინება</string>\n    <string name=\"you_successfully_subscribed\">თქვენ ახლა გამოიწერეთ ეს არხი</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">ყველას გადართვა</string>\n    <string name=\"streams_not_yet_supported_removed\">ნაკადები, რომლებიც ჯერ არ არის მხარდაჭერილი დამტვირთველის მიერ, არ არის ნაჩვენები</string>\n    <string name=\"selected_stream_external_player_not_supported\">არჩეული ნაკადი არ არის მხარდაჭერილი გარე დამკვრელის მიერ</string>\n    <string name=\"no_video_streams_available_for_external_players\">ვიდეო ნაკადები არ არის ხელმისაწვდომი გარე დამკვრელებისთვის</string>\n    <string name=\"select_quality_external_players\">აირჩიეთ ხარისხი გარე დამკვრელებისთვის</string>\n    <string name=\"unknown_format\">უცნობი ფორმატი</string>\n    <string name=\"unknown_quality\">უცნობი ხარისხი</string>\n    <string name=\"sort\">დალაგება</string>\n    <string name=\"peertube_instance_add_exists\">ეგეთი უკვე არსებობს</string>\n    <string name=\"peertube_instance_add_fail\">ინსტანციის დადასტურება ვერ მოხერხდა</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">ჩართეთ YouTube-ის „შეზღუდული რეჟიმი“</string>\n    <string name=\"restricted_video\">ეს ვიდეო ასაკობრივი შეზღუდულია.\n\\n\n\\nთუ გსურთ მისი ნახვა, ჩართეთ „%1$s“ პარამეტრებში.</string>\n    <string name=\"duration_live\">ლაივი</string>\n    <string name=\"restricted_video_no_stream\">ეს ვიდეო ასაკობრივად შეზღუდულია.\n\\n YouTube-ის ახალი წესების გამო ასაკობრივად შეზღუდული ვიდეოებით, NewPipe-ს არ შეუძლია წვდომა მის რომელიმე ვიდეო ნაკადზე და, შესაბამისად, ვერ ახერხებს მის დაკვრას.</string>\n    <string name=\"search_history_deleted\">ძიების ისტორია წაიშალა</string>\n    <string name=\"clear_cookie_summary\">წაშალეთ ქუქი-ფაილები, რომლებსაც NewPipe ინახავს, როდესაც თქვენ გადაჭრით reCAPTCHA</string>\n    <string name=\"clear_views_history_summary\">წაშლის ნათამაშები დაკვრილ ისტორიას და დაკვრის პოზიციებს</string>\n    <string name=\"file_deleted\">ფაილი წაიშალა</string>\n    <string name=\"streams_notification_channel_description\">შეტყობინებები ახალი ნაკადების შესახებ გამოწერებისთვის</string>\n    <string name=\"import_data_summary\">უგულებელყოფს თქვენს ამჟამინდელ ისტორიას, გამოწერებს, დასაკრავ სიებს და (სურვილისამებრ) პარამეტრებს</string>\n    <string name=\"clear_search_history_title\">ძიების ისტორიის გასუფთავება</string>\n    <string name=\"general_error\">შეცდომა</string>\n    <string name=\"error_report_open_github_notice\">გთხოვთ, შეამოწმოთ, არის თუ არა პრობლემა თქვენი ავარიის განხილვის შესახებ. დუბლიკატი ბილეთების შექმნისას ჩვენგან იღებთ დროს, რომელიც ჩვენ შეგვიძლია დავხარჯოთ ფაქტობრივი ხარვეზის გამოსწორებაში.</string>\n    <string name=\"download_to_sdcard_error_message\">გარე SD ბარათზე ჩამოტვირთვა შეუძლებელია. გსურთ ჩამოტვირთვის საქაღალდის მდებარეობის გადაყენება\\?</string>\n    <string name=\"external_player_unsupported_link_type\">გარე დამკვრელს არ აქვთ ამ ტიპის ბმულების მხარდაჭერა</string>\n    <string name=\"invalid_file\">ფაილი არ არსებობს ან მასზე წაკითხვის ან ჩაწერის ნებართვა აკლია</string>\n    <string name=\"saved_tabs_invalid_json\">შენახული ჩანართების წაკითხვა ვერ მოხერხდა, ამიტომ გამოიყენეთ ნაგულისხმევი ჩანართები</string>\n    <string name=\"info_labels\">რა:\\nმოითხოვეთ:\\nშემცველობის ენა:\\nშემცველობის ქვეყანა:\\nაპლიკაციის ენა:\\nსერვისი:\\nGMT დრო:\\nპაკეტი:\\nვერსია:\\nOS ვერსია:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">ამტვირთველის ავატარის ესკიზი</string>\n    <string name=\"comments_are_disabled\">კომენტარები გამორთულია</string>\n    <string name=\"create\">Შექმნა</string>\n    <string name=\"delete\">წაშლა</string>\n    <string name=\"dismiss\">გაუქმება</string>\n    <string name=\"checksum\">საკონტროლო ჯამი</string>\n    <string name=\"no_available_dir\">გთხოვთ, განსაზღვროთ ჩამოტვირთვის საქაღალდე მოგვიანებით პარამეტრებში</string>\n    <string name=\"no_dir_yet\">ჩამოტვირთვის საქაღალდე ჯერ არ არის დაყენებული, ახლავე აირჩიეთ ჩამოტვირთვის ნაგულისხმევი საქაღალდე</string>\n    <string name=\"settings_category_downloads_title\">ჩამოტვირთვები</string>\n    <string name=\"charset_most_special_characters\">ყველაზე განსაკუთრებული პერსონაჟები</string>\n    <string name=\"settings_file_charset_title\">დაშვებული სიმბოლოები ფაილის სახელებში</string>\n    <string name=\"settings_file_replacement_character_summary\">არასწორი სიმბოლოები ჩანაცვლებულია ამ მნიშვნელობით</string>\n    <string name=\"tab_about\">შესახებ &amp; ხშირად დასმული კითხვები</string>\n    <string name=\"title_licenses\">მესამე მხარის ლიცენზიები</string>\n    <string name=\"copyright\">© %1$s მიერ %2$s %3$s-ის ქვეშ</string>\n    <string name=\"donation_encouragement\">NewPipe შემუშავებულია მოხალისეების მიერ, რომლებიც ატარებენ თავისუფალ დროს და მოგაქვთ საუკეთესო მომხმარებლის გამოცდილება. დაეხმარეთ დეველოპერებს, გააუმჯობესონ NewPipe, სანამ ფინჯანი ყავით ტკბებიან.</string>\n    <string name=\"import_youtube_instructions\">YouTube გამოწერების იმპორტი Google takeout-დან:\n\\n\n\\n 1. გადადით ამ URL-ზე: %1$s\n\\n 2. შედით სისტემაში მოთხოვნისას\n\\n 3. დააწკაპუნეთ ღილაკზე \\\"ყველა მონაცემი შედის\\\", შემდეგ \\\"გააუქმეთ ყველა\\\", შემდეგ აირჩიეთ მხოლოდ \\\"გამოწერა\\\" და დააწკაპუნეთ \\\"OK\\\"\n\\n 4. დააწკაპუნეთ „შემდეგი ნაბიჯი“ და შემდეგ „ექსპორტის შექმნა“\n\\n 5. დააწკაპუნეთ ღილაკზე „ჩამოტვირთვა“ მისი გამოჩენის შემდეგ\n\\n 6. დააწკაპუნეთ IMPORT FILE ქვემოთ და აირჩიეთ გადმოწერილი .zip ფაილი\n\\n 7. [თუ .zip-ის შემოტანავერ მოხერხდა] ამოიღეთ</string>\n    <string name=\"playback_pitch\">მოედანი</string>\n    <string name=\"enable_streams_notifications_title\">ახალი ნაკადების შეტყობინებები</string>\n    <string name=\"start_accept_privacy_policy\">მონაცემთა დაცვის ევროპული ზოგადი რეგულაციის (GDPR) შესაბამისობის მიზნით, ჩვენ ვაქცევთ თქვენს ყურადღებას NewPipe-ის კონფიდენციალურობის პოლიტიკაზე. გთხოვთ ყურადღებით წაიკითხოთ.\n\\nთქვენ უნდა დაეთანხმოთ მას, რომ გამოგვიგზავნოთ ხარვეზის ანგარიში.</string>\n    <string name=\"streams_notifications_network_title\">საჭიროა ქსელის კავშირი</string>\n    <string name=\"grid\">ბადე</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Seekbar-ის ესკიზის გადახედვა</string>\n    <string name=\"wifi_only\">მხოლოდ Wi-Fi-ზე</string>\n    <string name=\"low_quality_smaller\">დაბალი ხარისხი(პატარა)</string>\n    <string name=\"permission_denied\">მოქმედება უარყოფილია სისტემის მიერ</string>\n    <string name=\"checking_updates_toast\">მიმდინარეობს განახლებების შემოწმება…</string>\n    <string name=\"generate_unique_name\">შექმენით უნიკალური სახელი</string>\n    <string name=\"overwrite\">გადაწერა</string>\n    <string name=\"overwrite_unrelated_warning\">ფაილი ამ სახელით უკვე არსებობს</string>\n    <string name=\"overwrite_finished_warning\">ჩამოტვირთული ფაილი ამ სახელით უკვე არსებობს</string>\n    <string name=\"error_ssl_exception\">უსაფრთხო კავშირის დამყარება ვერ მოხერხდა</string>\n    <string name=\"confirm_prompt\">გსურთ თქვენი ჩამოტვირთვის ისტორიის გასუფთავება ან ყველა გადმოწერილი ფაილის წაშლა\\?</string>\n    <string name=\"error_postprocessing_stopped\">ფაილზე მუშაობისას NewPipe დაიხურა</string>\n    <string name=\"error_progress_lost\">პროგრესი დაიკარგა, რადგან ფაილი წაიშალა</string>\n    <string name=\"clear_download_history\">ჩამოტვირთვის ისტორიის გასუფთავება</string>\n    <string name=\"pause_downloads_on_mobile_desc\">სასარგებლოა მობილური ინტერნეტზე გადასვლისას, თუმცა ზოგიერთი ჩამოტვირთვის შეჩერება შეუძლებელია</string>\n    <string name=\"pause_downloads\">ჩამოტვირთვების პაუზა</string>\n    <string name=\"downloads_storage_ask_title\">იკითხეთ, სად უნდა ჩამოტვირთოთ</string>\n    <string name=\"downloads_storage_ask_summary\">თქვენ მოგეთხოვებათ სად შეინახოთ თითოეული ჩამოტვირთვა.\n\\n ჩართეთ სისტემის საქაღალდის ამომრჩევი (SAF), თუ გსურთ ჩამოტვირთოთ გარე SD ბარათზე</string>\n    <string name=\"remove_watched_popup_warning\">ვიდეოები, რომლებიც უყურეთ დასაკრავ სიაში დამატებამდე და მის შემდეგ, წაიშლება. \\n დარწმუნებული ხართ?</string>\n    <string name=\"app_license\">NewPipe არის copyleft უფასო პროგრამული უზრუნველყოფა: თქვენ შეგიძლიათ გამოიყენოთ, შეისწავლოთ, გააზიაროთ და გააუმჯობესოთ იგი სურვილისამებრ. კონკრეტულად თქვენ შეგიძლიათ გადაანაწილოთ და/ან შეცვალოთ იგი GNU-ს ზოგადი საჯარო ლიცენზიის პირობებით, როგორც ეს გამოქვეყნებულია თავისუფალი პროგრამული უზრუნველყოფის ფონდის მიერ, ლიცენზიის მე-3 ვერსიით, ან (თქვენი სურვილისამებრ) ნებისმიერი შემდგომი ვერსიით.</string>\n    <string name=\"auto\">ავტო</string>\n    <string name=\"blank_page_summary\">ცარიელი გვერდი</string>\n    <string name=\"select_a_channel\">აირჩიეთ არხი</string>\n    <string name=\"kiosk_page_summary\">კიოსკის გვერდი</string>\n    <string name=\"default_kiosk_page_summary\">ნაგულისხმევი კიოსკი</string>\n    <string name=\"import_settings\">გსურთ პარამეტრების იმპორტიც\\?</string>\n    <string name=\"enqueued_next\">რიგში დადგა შემდეგი</string>\n    <string name=\"start_here_on_popup\">დაიწყეთ დაკვრა ამომხტარ ფანჯარაში</string>\n    <string name=\"local\">ადგილობრივი</string>\n    <string name=\"recently_added\">ახლახან დამატებულია</string>\n    <string name=\"preferred_player_fetcher_notification_title\">ინფორმაციის მიღება…</string>\n    <string name=\"create_playlist\">ახალი დასაკრავი სია</string>\n    <string name=\"processing_may_take_a_moment\">დამუშავება… შეიძლება რამდენიმე წუთი დასჭირდეს</string>\n    <string name=\"delete_playlist_prompt\">წაშალოთ ეს დასაკრავი სია\\?</string>\n    <string name=\"show_memory_leaks\">მეხსიერების გაჟონვის ჩვენება</string>\n    <string name=\"recovering\">აღდგენა</string>\n    <string name=\"enqueue\">რიგი</string>\n    <string name=\"subscriptions_import_unsuccessful\">გამოწერების იმპორტი ვერ მოხერხდა</string>\n    <string name=\"enable_disposed_exceptions_title\">შეატყობინეთ სასიცოცხლო ციკლის შეცდომებს</string>\n    <string name=\"enable_disposed_exceptions_summary\">იძულებითი მოხსენება შეუსაბამო Rx გამონაკლისების შესახებ ფრაგმენტის ან აქტივობის სასიცოცხლო ციკლის გარეთ განკარგვის შემდეგ</string>\n    <string name=\"feed_load_error_fast_unknown\">სწრაფი კვების რეჟიმი ამაზე მეტ ინფორმაციას არ იძლევა.</string>\n    <string name=\"feed_load_error_account_info\">„%s“-ის არხის ჩატვირთვა ვერ მოხერხდა.</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">ხელმისაწვდომია ზოგიერთ სერვისში, როგორც წესი, ბევრად უფრო სწრაფია, მაგრამ შეიძლება დააბრუნოს შეზღუდული რაოდენობის ელემენტი და ხშირად არასრული ინფორმაცია (მაგ. ხანგრძლივობის გარეშე, ელემენტის ტიპი, არ არის ლაივის სტატუსი)</string>\n    <string name=\"show_thumbnail_summary\">გამოიყენეთ ესკიზი როგორც ჩაკეტილი ეკრანის ფონისთვის, ასევე შეტყობინებებისთვის</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">როგორ ფიქრობთ, არხის ჩატვირთვა ძალიან ნელია\\? თუ ასეა, სცადეთ ჩართოთ სწრაფი ჩატვირთვა (შეგიძლიათ შეცვალოთ ის პარამეტრებში ან ქვემოთ მოცემულ ღილაკზე დაჭერით).\n\\n\n\\n NewPipe გთავაზობთ არხის ჩატვირთვის ორ სტრატეგიას:\n\\n • მთელი სააბონენტო არხის მიღება, რომელიც ნელია, მაგრამ დასრულებულია.\n\\n • გამოყოფილი სერვისის საბოლოო წერტილის გამოყენება, რომელიც არის სწრაფი, მაგრამ ჩვეულებრივ არასრული.\n\\n\n\\n ამ ორს შორის განსხვავება ისაა, რომ სწრაფს, როგორც წესი, აკლია გარკვეული ინფორმაცია, მაგალითად, ნივთის ხანგრძლივობა ან ტიპი (არ განასხვავებს პირდაპირ ვიდეოებს ჩვეულებრივ ვიდეოებს შორის) და შეიძლება დაბრუნდეს ნაკლები ელემენტი.\n\\n\n\\n YouTube არის სერვისის მაგალითი, რომელიც გთავაზობთ ამ სწრაფ მეთოდს თავისი RSS არხით.\n\\n\n\\n ასე რომ, არჩევანი დამოკიდებულია იმაზე, თუ რა გირჩევნიათ: სიჩქარე ან ზუსტი ინფორმაცია.</string>\n    <string name=\"soundcloud_go_plus_content\">ეს არის SoundCloud Go+ სიმღერა, ყოველ შემთხვევაში თქვენს ქვეყანაში, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ.</string>\n    <string name=\"no_appropriate_file_manager_message\">ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა.\n\\n გთხოვთ, დააინსტალიროთ ფაილის მენეჯერი ან სცადოთ გამორთოთ \\'%s\\' ჩამოტვირთვის პარამეტრებში</string>\n    <string name=\"youtube_music_premium_content\">ეს ვიდეო ხელმისაწვდომია მხოლოდ YouTube Music Premium-ის წევრებისთვის, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ.</string>\n    <string name=\"auto_device_theme_title\">ავტომატური (მოწყობილობის თემა)</string>\n    <string name=\"select_night_theme_toast\">თქვენ შეგიძლიათ აირჩიოთ თქვენი საყვარელი ღამის თემა ქვემოთ</string>\n    <string name=\"description_select_note\">ახლა შეგიძლიათ აირჩიოთ ტექსტი აღწერილობაში. გაითვალისწინეთ, რომ გვერდი შეიძლება ციმციმდეს და ბმულები არ იყოს დაწკაპუნებული შერჩევის რეჟიმში.</string>\n    <string name=\"metadata_support\">მხარდაჭერა</string>\n    <string name=\"no_audio_streams_available_for_external_players\">აუდიო ნაკადები არ არის ხელმისაწვდომი გარე დამკვრელებისთვის</string>\n    <string name=\"left_gesture_control_title\">მარცხენა ჟესტის ქმედება</string>\n    <string name=\"right_gesture_control_title\">მარჯვენა ჟესტის ქმედება</string>\n    <string name=\"brightness\">სიკაშკაშე</string>\n    <string name=\"msg_failed_to_copy\">ბუფერში კოპირების შეცდომა</string>\n    <string name=\"card\">ბარათი</string>\n    <string name=\"remove_duplicates_message\">გნებავთ წავშალო ყველა დუბლირებული ნაკადი ამ დასაკრავი სიიდან\\?</string>\n    <string name=\"playlist_add_stream_success_duplicate\">ასლი დამატებულია %d-ჯერ</string>\n    <string name=\"app_update_available_notification_text\">%s-ის გადმოსაწერად დაატყაპუნეთ</string>\n    <string name=\"ignore_hardware_media_buttons_title\">აპარატურული მედია ღილაკების მოვლენების გამოტოვება</string>\n    <string name=\"feed_show_hide_streams\">ნაკადების ჩვენება/დამალვა</string>\n    <string name=\"feed_hide_streams_title\">შემდეგი ნაკადების ჩვენება</string>\n    <string name=\"feed_show_watched\">სრულად ნანახი</string>\n    <string name=\"night_theme_available\">ეს პარამეტრი ხელმისაწვდომია მხოლოდ როცა თემისთვის %s-ა მონიშნული</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">სასარგებლოა, მაგალითად, თუ იყენებთ ყურსაცვამდებს, რომლის ფიზიკური ღილაკებიც დაზიანებულია</string>\n    <string name=\"left_gesture_control_summary\">აირჩიეთ ჟესტი მოთამაშის ეკრანის მარცხენა ნახევრისთვის</string>\n    <string name=\"right_gesture_control_summary\">აირჩიეთ ჟესტი მოთამაშის ეკრანის მარჯვენა ნახევრისთვის</string>\n    <string name=\"none\">არაფერი</string>\n    <string name=\"fast_mode\">სწრაფი რეჟიმი</string>\n    <string name=\"feed_show_upcoming\">მომავალი</string>\n    <string name=\"volume\">ხმა</string>\n    <string name=\"app_update_available_notification_title\">ხელმისაწვდომია NewPipe-ის განახლება!</string>\n    <string name=\"import_subscriptions_hint\">გამოწერების შეტანა/გამოტანა სამწერტილიანი მენიუდან</string>\n    <string name=\"duplicate_in_playlist\">განაცრისფერებული დასაკრავი სიები ამ ელემენტს უკვე შეიცავენ.</string>\n    <string name=\"app_update_unavailable_toast\">თქვენი NewPipe-ის ვერსია უახლესია</string>\n    <string name=\"remove_duplicates\">დუბლიკატების წაშლა</string>\n    <string name=\"unset_playlist_thumbnail\">მუდმივი მინიატურის მოხსნა</string>\n    <string name=\"remove_duplicates_title\">წავშალო დუბლიკატები\\?</string>\n    <string name=\"feed_show_partially_watched\">ნაწილობრივ ნანახი</string>\n    <string name=\"loading_metadata_title\">მზადდება ზედაპირული მახასიათებლები…</string>\n    <string name=\"prefer_original_audio_summary\">თავდაპირველი ხმის ჩანაწერი აირჩიე ენის მიუხედავად</string>\n    <string name=\"prefer_descriptive_audio_summary\">აირჩიე მხედველობადაქვეითებულებისათვის დახასიათებული ხმის ჩანაწერი, თუ არის</string>\n    <string name=\"prefer_original_audio_title\">არჩიე თავდაპირველი ხმის ჩანაწერი</string>\n    <string name=\"play_queue_audio_track\">ხმა: %s</string>\n    <string name=\"audio_track\">ხმის ჩანაწერი</string>\n    <string name=\"yes\">დიახ</string>\n    <string name=\"no\">არა</string>\n    <string name=\"search_with_service_name\">%1$s-ის ძიება</string>\n    <string name=\"search_with_service_name_and_filter\">მოძებნეთ %1$s %2$s</string>\n    <string name=\"tab_bookmarks_short\">დასაკრავი სიები</string>\n    <string name=\"notification_actions_summary_android13\">ქვემოთ მოცემული თითოეული შეტყობინების მოქმედების რედაქტირებისთვის მასზე შეხებით აირჩიეთ. პირველი სამი მოქმედება (დაკვრა/პაუზა, წინა და შემდეგი) სისტემის მიერ არის დაყენებული და მათი მორგება შეუძლებელია.</string>\n    <string name=\"prefer_descriptive_audio_title\">აღწერილობითი აუდიოს უპირატესობა</string>\n    <string name=\"settings_category_backup_restore_title\">სარეზერვო ასლის შექმნა და აღდგენა</string>\n    <string name=\"main_tabs_position_summary\">მთავარი ჩანართის ამომრჩევის ქვემოთ გადატანა</string>\n    <string name=\"main_tabs_position_title\">მთავარი ჩანართების პოზიცია</string>\n    <string name=\"permission_display_over_apps_message\">ამომხტარი ფანჯრის გამოსაყენებლად, გთხოვთ, აირჩიოთ %1$s შემდეგ Android პარამეტრების მენიუში და ჩართოთ %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">“სხვა აპლიკაციებზე ჩვენების დაშვება“</string>\n    <string name=\"short_thousand\">%sათასი</string>\n    <string name=\"short_million\">%sმლნ</string>\n    <string name=\"short_billion\">%sმლრდ</string>\n    <string name=\"no_streams\">ნაკადები არ არის</string>\n    <string name=\"no_live_streams\">პირდაპირი ტრანსლაციები არ არის</string>\n    <string name=\"delete_file\">ფაილის წაშლა</string>\n    <string name=\"delete_entry\">ჩანაწერის წაშლა</string>\n    <string name=\"select_a_feed_group\">აირჩიეთ არხის ჯგუფი</string>\n    <string name=\"no_feed_group_created_yet\">არხის ჯგუფი ჯერ არ შექმნილა</string>\n    <string name=\"disable_media_tunneling_automatic_info\">მედიის გვირაბირება თქვენს მოწყობილობაზე ნაგულისხმევად გამორთულია, რადგან თქვენი მოწყობილობის მოდელი, როგორც ცნობილია, მას არ უჭერს მხარს.</string>\n    <string name=\"auto_update_check_description\">NewPipe-ს შეუძლია დროდადრო ავტომატურად შეამოწმოს ახალი ვერსიები და შეგატყობინოთ, როგორც კი ისინი ხელმისაწვდომი გახდება.\\nგსურთ ამის ჩართვა?</string>\n    <string name=\"reset_settings_title\">პარამეტრების გადაყენება</string>\n    <string name=\"reset_settings_summary\">ყველა პარამეტრის ნაგულისხმევ მნიშვნელობებზე დაბრუნება</string>\n    <string name=\"reset_all_settings\">ყველა პარამეტრის გადატვირთვა გააუქმებს თქვენს მიერ არჩეულ ყველა პარამეტრს და გადატვირთავს აპლიკაციას.\\n\\nდარწმუნებული ხართ, რომ გსურთ გაგრძელება?</string>\n    <string name=\"error_insufficient_storage\">მოწყობილობაზე საკმარისი თავისუფალი ადგილი არ არის</string>\n    <string name=\"feed_group_page_summary\">არხის ჯგუფის გვერდი</string>\n    <string name=\"feed_fetch_channel_tabs\">არხის ჩანართების მოძიება</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">არხის განახლებისას გამოსატანი ჩანართები. ამ პარამეტრს არანაირი ეფექტი არ აქვს, თუ არხი სწრაფი რეჟიმის გამოყენებით განახლდება.</string>\n    <string name=\"account_terminated_service_provides_reason\">ანგარიში შეწყვეტილია\\n\\n%1$s ამ მიზეზს იძლევა: %2$s</string>\n    <string name=\"metadata_thumbnails\">მინიატურები</string>\n    <string name=\"metadata_uploader_avatars\">ამტვირთავის ავატარები</string>\n    <string name=\"metadata_subchannel_avatars\">ქვეარხის ავატარები</string>\n    <string name=\"metadata_avatars\">ავატარები</string>\n    <string name=\"metadata_banners\">ბანერები</string>\n    <string name=\"metadata_subscribers\">გამომწერები</string>\n    <string name=\"audio_track_present_in_video\">ამ ნაკადში აუდიო ჩანაწერი უკვე უნდა იყოს წარმოდგენილი</string>\n    <string name=\"select_audio_track_external_players\">გარე პლეერებისთვის აუდიო ჩანაწერის არჩევა</string>\n    <string name=\"unknown_audio_track\">უცნობი</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer-ის პარამეტრები</string>\n    <string name=\"settings_category_exoplayer_summary\">ExoPlayer-ის ზოგიერთი პარამეტრის მართვა. ამ ცვლილებების ძალაში შესასვლელად მოთამაშის გადატვირთვაა საჭირო.</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">გამოიყენეთ ExoPlayer-ის დეკოდერის სარეზერვო ფუნქცია</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">ჩართეთ ეს პარამეტრი, თუ დეკოდერის ინიციალიზაციის პრობლემები გაქვთ, რაც, თუ პირველადი დეკოდერების ინიციალიზაცია ვერ მოხერხდა, დაბალი პრიორიტეტის მქონე დეკოდერებს ეხება. ამან შეიძლება გამოიწვიოს დაკვრის დაბალი შესრულება, ვიდრე პირველადი დეკოდერების გამოყენებისას.</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">ყოველთვის გამოიყენეთ ExoPlayer-ის ვიდეო გამომავალი ზედაპირის პარამეტრების ალტერნატიული გადაწყვეტა</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">ეს გამოსავალი ათავისუფლებს და ხელახლა ააქტიურებს ვიდეო კოდეკებს ზედაპირის ცვლილებისას, ზედაპირის პირდაპირ კოდეკზე დაყენების ნაცვლად. ეს პარამეტრი უკვე გამოიყენება ExoPlayer-ის მიერ ზოგიერთ მოწყობილობაზე, რომელსაც ეს პრობლემა აქვს, და მოქმედებს მხოლოდ Android 6-ზე და უფრო მაღალ ვერსიებზე.\\n\\nამ პარამეტრის ჩართვამ შეიძლება თავიდან აიცილოს დაკვრის შეცდომები მიმდინარე ვიდეო პლეერის გადართვისას ან სრულ ეკრანზე გადართვისას.</string>\n    <string name=\"trending_gaming\">თამაშების ტრენდები</string>\n    <string name=\"trending_podcasts\">ტრენდული პოდკასტები</string>\n    <string name=\"trending_movies\">ტრენდული ფილმები და შოუები</string>\n    <string name=\"trending_music\">ტრენდული მუსიკა</string>\n    <string name=\"entry_deleted\">ჩანაწერი წაშლილია</string>\n    <string name=\"player_http_403\">დაკვრის დროს სერვერიდან მიღებული HTTP შეცდომა 403, სავარაუდოდ, გამოწვეული სტრიმინგის URL-ის ვადის გასვლით ან IP აკრძალვით.</string>\n    <string name=\"player_http_invalid_status\">დაკვრის დროს სერვერიდან მიღებული HTTP შეცდომა %1$s</string>\n    <string name=\"youtube_player_http_403\">დაკვრის დროს სერვერიდან მიღებული HTTP შეცდომა 403, სავარაუდოდ, გამოწვეულია IP აკრძალვით ან სტრიმინგის URL-ის დებფუსკაციის პრობლემებით.</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s-მა უარი თქვა მონაცემების მიწოდებაზე და ითხოვა შესვლა იმის დასადასტურებლად, რომ მომთხოვნი რობოტი არ არის.\\n\\nშესაძლოა, თქვენი IP მისამართი დროებით აიკრძალა %1$s-ის მიერ, შეგიძლიათ დაელოდოთ ცოტა ხანს ან გადახვიდეთ სხვა IP მისამართზე (მაგალითად, VPN-ის ჩართვით/გამორთვით, ან WiFi-დან მობილურ მონაცემებზე გადართვით).</string>\n    <string name=\"unsupported_content_in_country\">ეს კონტენტი ამჟამად არჩეული კონტენტის ქვეყნისთვის მიუწვდომელია.\\n\\nშეცვალეთ თქვენი არჩევანი „პარამეტრები &gt; კონტენტი &gt; ნაგულისხმევი კონტენტის ქვეყანა“-დან.</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">ორიგინალი</string>\n    <string name=\"audio_track_type_dubbed\">გახმოვანებული</string>\n    <string name=\"audio_track_type_descriptive\">აღწერითი</string>\n    <string name=\"audio_track_type_secondary\">მეორადი</string>\n    <string name=\"channel_tab_videos\">ვიდეოები</string>\n    <string name=\"channel_tab_tracks\">ტრეკები</string>\n    <string name=\"channel_tab_shorts\">მოკლე ვიდეოები</string>\n    <string name=\"channel_tab_livestreams\">ლაივი</string>\n    <string name=\"channel_tab_channels\">არხები</string>\n    <string name=\"channel_tab_playlists\">დასაკრავი სიები</string>\n    <string name=\"channel_tab_albums\">ალბომები</string>\n    <string name=\"channel_tab_likes\">მოწონებები</string>\n    <string name=\"channel_tab_about\">შესახებ</string>\n    <string name=\"show_channel_tabs\">არხის ჩანართები</string>\n    <string name=\"show_channel_tabs_summary\">რომელი ჩანართებია ნაჩვენები არხის გვერდებზე</string>\n    <string name=\"open_play_queue\">დაკვრის რიგის გახსნა</string>\n    <string name=\"toggle_fullscreen\">სრულეკრანიან რეჟიმზე გადართვა</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s პასუხი</item>\n        <item quantity=\"other\">%s პასუხები</item>\n    </plurals>\n    <string name=\"show_more\">მეტის ჩვენება</string>\n    <string name=\"show_less\">ნაკლების ჩვენება</string>\n    <string name=\"import_settings_vulnerable_format\">იმპორტირებული ექსპორტის პარამეტრები იყენებს დაუცველ ფორმატს, რომელიც მოძველებულია NewPipe 0.27.0 ვერსიიდან. დარწმუნდით, რომ იმპორტირებული ექსპორტი სანდო წყაროდან არის და მომავალში უპირატესობა მიანიჭეთ მხოლოდ NewPipe 0.27.0 ან უფრო ახალი ვერსიიდან მიღებული ექსპორტირებული პარამეტრების გამოყენებას. ამ დაუცველ ფორმატში პარამეტრების იმპორტის მხარდაჭერა მალე მთლიანად გაუქმდება და შემდეგ NewPipe-ის ძველი ვერსიები ვეღარ შეძლებენ ექსპორტირებული პარამეტრების იმპორტირებას ახალი ვერსიებიდან.</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud-ის ტოპ 50 გვერდი წაიშალა</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud-მა შეწყვიტა ორიგინალი ტოპ 50 ჩარტების გამოშვება. შესაბამისი ჩანართი წაიშალა თქვენი მთავარი გვერდიდან.</string>\n    <string name=\"migration_info_7_8_title\">YouTube-ის კომბინირებული ტრენდული გვერდი წაშლილია</string>\n    <string name=\"migration_info_7_8_message\">YouTube-მა 2025 წლის 21 ივლისიდან შეწყვიტა კომბინირებული ტრენდული გვერდის არსებობა. NewPipe-მა ნაგულისხმევი ტრენდული გვერდი ტრენდული პირდაპირი ტრანსლაციებით ჩაანაცვლა.\\n\\nასევე შეგიძლიათ აირჩიოთ სხვადასხვა ტრენდული გვერდები „პარამეტრები &gt; მასალა &gt; მთავარი გვერდის შინაარსი“-ში.</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-kab/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"settings_category_video_audio_title\">Avidyu akked d imesli</string>\n    <string name=\"tab_about\">Ɣef &amp; ISTEQSIYEN</string>\n    <string name=\"feed_create_new_group_button_title\">Amaynut</string>\n    <string name=\"all\">Akk</string>\n    <string name=\"kore_not_found\">Sbedd asnas n Kore yexxuṣen\\?</string>\n    <string name=\"install\">Sbedd</string>\n    <string name=\"settings_category_downloads_title\">Sader</string>\n    <string name=\"downloads_title\">Isadaren</string>\n    <string name=\"downloads\">Isadaren</string>\n    <string name=\"settings\">Iɣewwaren</string>\n    <string name=\"import_ongoing\">Akter…</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Tulya n telɣut…</string>\n    <string name=\"auto\">Awurman</string>\n    <string name=\"file\">Afaylu</string>\n    <string name=\"resize_zoom\">Semɣeṛ</string>\n    <string name=\"tracks\">Iberdan</string>\n    <string name=\"mute\">Susem</string>\n    <string name=\"always\">Yal tikelt</string>\n    <string name=\"settings_category_appearance_title\">Timeẓri</string>\n    <string name=\"stop\">Seḥbes</string>\n    <string name=\"msg_name\">Isem n ufaylu</string>\n    <string name=\"search\">Nadi</string>\n    <string name=\"start\">Bdu</string>\n    <string name=\"pause\">Seṛǧu</string>\n    <string name=\"more_than_100_videos\">100+Tividyutin</string>\n    <string name=\"subscribe_button_title\">Jerred</string>\n    <string name=\"export_to\">Sifeḍ ɣer</string>\n    <string name=\"controls_add_to_playlist_title\">Rnu ɣer</string>\n    <string name=\"playback_step\">Amecwaṛ</string>\n    <string name=\"msg_running\">Azdam n NewPipe</string>\n    <string name=\"restore_defaults\">Err-d imezwar</string>\n    <string name=\"channel_created_by\">Yerna-t %s</string>\n    <string name=\"delete_playlist_prompt\">Kkes tabdart-a n tɣuri\\?</string>\n    <string name=\"clear\">Sfeḍ</string>\n    <string name=\"recently_added\">Ittwarna taggara-agi</string>\n    <string name=\"default_audio_format_title\">Amasal n imesli amezwer</string>\n    <string name=\"main_page_content\">Agbur n usebter agejdan</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d n tesdat</item>\n        <item quantity=\"other\">%d n tesdatin</item>\n    </plurals>\n    <string name=\"unsubscribe\">Ffeɣ seg ujerred</string>\n    <string name=\"create_playlist\">Tabdert n tɣuri tamaynut</string>\n    <string name=\"settings_category_player_behavior_title\">Tiddin</string>\n    <string name=\"select_a_playlist\">Fren tabdert n tɣuri</string>\n    <string name=\"show_error\">Sken-d tuccḍa</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d i yettwafren</item>\n        <item quantity=\"other\">%d i yettwafernen</item>\n    </plurals>\n    <string name=\"channels\">Ibuda</string>\n    <string name=\"duration_live\">Srid</string>\n    <string name=\"resize_fill\">Aččar</string>\n    <string name=\"enable_search_history_title\">Nadi amazray</string>\n    <string name=\"play_audio\">Imesli</string>\n    <string name=\"undo\">Sefsex</string>\n    <string name=\"play_queue_remove\">Kkes</string>\n    <string name=\"close\">Mdel</string>\n    <string name=\"events\">Tidyanin</string>\n    <string name=\"no_comments\">Ulac iwenniten</string>\n    <string name=\"name\">Isem</string>\n    <string name=\"settings_category_updates_title\">Ileqman</string>\n    <string name=\"missions_header_pending\">Yettraǧu</string>\n    <string name=\"play_queue_audio_settings\">Iɣewwaren n umeslaw</string>\n    <string name=\"unmute\">Sermed imesli</string>\n    <string name=\"general_error\">Tuccḍa</string>\n    <string name=\"grid\">Iẓiki</string>\n    <string name=\"missions_header_finished\">Immed</string>\n    <string name=\"local\">Adigan</string>\n    <string name=\"done\">Immed</string>\n    <string name=\"playback_reset\">Wennez</string>\n    <string name=\"create\">Snulfu-d</string>\n    <string name=\"accept\">Qbel</string>\n    <string name=\"fragment_feed_title\">D acu-t umaynut</string>\n    <string name=\"show_info\">Sken talɣut</string>\n    <string name=\"disabled\">Ittwarermed</string>\n    <string name=\"audio\">Imesli</string>\n    <string name=\"tab_licenses\">Iselkinen</string>\n    <string name=\"light_theme_title\">Afaw</string>\n    <string name=\"download_dialog_title\">Sader</string>\n    <string name=\"controls_popup_title\">Asfaylu udhim</string>\n    <string name=\"dismiss\">Ttu</string>\n    <string name=\"import_title\">Kter</string>\n    <string name=\"ok\">Ih</string>\n    <string name=\"action_history\">Amazray</string>\n    <string name=\"list\">Liste</string>\n    <string name=\"users\">Iseqdacen</string>\n    <string name=\"settings_category_clear_data_title\">Sfeḍ isefka</string>\n    <string name=\"minimize_on_exit_none_description\">Ulac</string>\n    <string name=\"msg_copied\">Yettwanɣel ɣef afus</string>\n    <string name=\"playlists\">Tibdarin n tɣuri</string>\n    <string name=\"title_last_played\">Aneggaru yettwaslekmen</string>\n    <string name=\"autoplay_title\">Taɣuri tawurmant</string>\n    <string name=\"error_snackbar_action\">Aneqqis</string>\n    <string name=\"download\">Sader</string>\n    <string name=\"msg_error\">Tuccḍa</string>\n    <string name=\"detail_likes_img_view_description\">Iɛǧeb-iyi</string>\n    <string name=\"trending\">Tiddin</string>\n    <string name=\"retry\">Eɛreḍ tikkelt-nniḍen</string>\n    <string name=\"play_queue_stream_detail\">Talqayt</string>\n    <string name=\"content\">Agbur</string>\n    <string name=\"black_theme_title\">Ubrik</string>\n    <string name=\"video_detail_by\">S %s</string>\n    <string name=\"delete\">Kkes</string>\n    <string name=\"limit_data_usage_none_description\">Ulac talast</string>\n    <string name=\"overwrite\">Écraser</string>\n    <string name=\"search_no_results\">Ulac igmad</string>\n    <string name=\"cancel\">Sefex</string>\n    <string name=\"contribution_title\">Ttekki</string>\n    <string name=\"tab_subscriptions\">Ijerriden</string>\n    <string name=\"website_title\">Asmel web</string>\n    <string name=\"decline\">Agwi</string>\n    <string name=\"show_comments_title\">Beqqeḍ iwenniten</string>\n    <string name=\"settings_category_player_title\">Ameɣri</string>\n    <string name=\"conferences\">Isaragen</string>\n    <string name=\"updates_setting_title\">Ileqman</string>\n    <string name=\"theme_title\">Asentel</string>\n    <string name=\"dark_theme_title\">Ubrik</string>\n    <string name=\"share\">Bḍu</string>\n    <string name=\"donation_title\">Tawsa</string>\n    <string name=\"settings_category_debug_title\">Débugger</string>\n    <string name=\"msg_threads\">Threads</string>\n    <string name=\"playback_pitch\">Pas</string>\n    <string name=\"systems_language\">Amezwer n unagraw</string>\n    <string name=\"rename\">Snifel isem</string>\n    <string name=\"download_failed\">Asader ur yeddi ara</string>\n    <string name=\"video\">Tamwalit</string>\n    <string name=\"controls_background_title\">Aɣawas n deffir</string>\n    <string name=\"title_activity_history\">Amazray</string>\n    <string name=\"paused\">yesteɛfay</string>\n    <string name=\"rename_playlist\">Snifel isem</string>\n    <string name=\"videos_string\">Tividyutin</string>\n    <string name=\"open_in_browser\">Ldi deg uminig</string>\n    <string name=\"upload_date_text\">Teffeɣ-d deg %1$s</string>\n    <string name=\"main_bg_subtitle\">Senned ɣef «Nadi» akken ad tebduḍ</string>\n    <string name=\"no_views\">Ula d yiwet n tmeẓriwt</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s n tmeẓriwt</item>\n        <item quantity=\"other\">%s n tmeẓriyin</item>\n    </plurals>\n    <string name=\"metadata_category\">Taggayt</string>\n    <string name=\"metadata_privacy\">Tabaḍnit</string>\n    <string name=\"metadata_licence\">Turagt</string>\n    <string name=\"no_videos\">Ula d yiwet n tvidyutt</string>\n    <string name=\"volume\">Ableɣ</string>\n    <string name=\"peertube_instance_add_title\">Rnu tummant</string>\n    <string name=\"albums\">Ilbumen</string>\n    <string name=\"recent\">Melmi kan</string>\n    <string name=\"drawer_close\">Mdel umuɣ</string>\n    <string name=\"open_with\">Ldi s</string>\n    <string name=\"show_description_title\">Sken-d aglam</string>\n    <string name=\"content_language_title\">Tutlayt n ugbur amezwaru</string>\n    <string name=\"network_error\">Tuccḍa deg uẓeṭṭa</string>\n    <string name=\"infinite_videos\">∞ tividyutin</string>\n    <string name=\"msg_wait\">Ttxil arǧu…</string>\n    <string name=\"title_activity_about\">Ɣef NewPipe</string>\n    <string name=\"video_player\">Imeɣri n uvidyu</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"channel_tab_livestreams\">Srid</string>\n    <string name=\"channel_tab_channels\">Ibuda</string>\n    <string name=\"duration\">Tanzagt</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"image_quality_medium\">Taɣara talemmast</string>\n    <string name=\"image_quality_high\">Taɣara tafellayt</string>\n    <string name=\"show_more\">Sken-d ugar</string>\n    <string name=\"show_less\">Sken-d drus</string>\n    <string name=\"songs\">Tizlatin</string>\n    <string name=\"channel_tab_videos\">Tividyutin</string>\n    <string name=\"channel_tab_playlists\">Tibdarin n tɣuri</string>\n    <string name=\"channel_tab_albums\">Ilbumen</string>\n    <string name=\"channel_tab_about\">Ɣef</string>\n    <string name=\"rewind\">Tuɣalin ɣer deffir</string>\n    <string name=\"image_quality_title\">Taɣara n tugna</string>\n    <string name=\"sort\">Smizzwer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"import_file_title\">Kter afaylu</string>\n    <string name=\"feed_show_upcoming\">Itteddu-d</string>\n    <string name=\"drawer_open\">Ldi umuɣ</string>\n    <string name=\"none\">Ula d yiwen</string>\n    <string name=\"share_playlist_content_details\">%1$s\\n%2$s</string>\n    <string name=\"yes\">Ih</string>\n    <string name=\"no\">Uhu</string>\n    <string name=\"play_with_kodi_title\">Ɣeṛ-it-id s Kodi</string>\n    <string name=\"brightness\">Tafat</string>\n    <string name=\"default_content_country_title\">Tamurt n ugbur amezwaru</string>\n    <string name=\"artists\">Inaẓuren</string>\n    <string name=\"notifications\">Ilɣa</string>\n    <string name=\"play_all\">Ɣeṛ-itent-id akk</string>\n    <string name=\"notification_channel_name\">Ilɣa n NewPipe</string>\n    <string name=\"comments_tab_description\">Iwenniten</string>\n    <string name=\"description_tab_description\">Asnummel</string>\n    <string name=\"recaptcha_solve\">Fru</string>\n    <string name=\"card\">Takarḍa</string>\n    <string name=\"chapters\">Ixfawen</string>\n    <string name=\"app_language_title\">Tutlayt n wesnas</string>\n    <string name=\"metadata_host\">Asenneftaɣ</string>\n    <string name=\"metadata_privacy_public\">Azayez</string>\n    <string name=\"metadata_privacy_internal\">Tadigant</string>\n    <string name=\"on\">Irmed</string>\n    <string name=\"off\">Yensa</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"open_website_license\">Ldi asmel Web</string>\n    <string name=\"unknown_audio_track\">Arussin</string>\n    <string name=\"audio_track_type_original\">aneṣli</string>\n    <string name=\"unbookmark_playlist\">Kkes ticreḍt</string>\n    <string name=\"import_from\">Kter seg</string>\n    <string name=\"app_license_title\">Turagt n NewPipe</string>\n    <string name=\"read_full_license\">Ɣeṛ turagt</string>\n    <string name=\"error_http_not_found\">Ur yettwaf ara</string>\n    <string name=\"more_options\">Ugar n tnefrunin</string>\n    <string name=\"share_dialog_title\">Bḍu d</string>\n    <string name=\"error_details_headline\">Talqayt :</string>\n    <string name=\"title_most_played\">Tid yettwaɣran s waṭas</string>\n    <string name=\"tab_choose\">Fren iccer</string>\n    <string name=\"metadata_language\">Tutlayt</string>\n    <string name=\"unknown_content\">[Arussin]</string>\n    <string name=\"play\">Ɣeṛ</string>\n    <string name=\"what_device_headline\">Talɣut:</string>\n    <string name=\"metadata_support\">Tadhalt</string>\n    <string name=\"radio\">Amaṭṭaf</string>\n    <string name=\"metadata_tags\">Tibzimin</string>\n    <string name=\"blank_page_summary\">Asebter d ilem</string>\n    <string name=\"settings_category_exoplayer_title\">Iɣewwaṛen n ExoPlayer</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-kk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Бастау үшін үлкейткіш әйнекті басыңыз.</string>\n    <string name=\"upload_date_text\">%1$s жарияланды</string>\n    <string name=\"no_player_found_toast\">Ағындық ойнатқыш табылмады (оны ойнату үшін VLC орнатуға болады).</string>\n    <string name=\"no_player_found\">Ағындық ойнатқыш табылмады. VLC орнату керек пе\\?</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-kmr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA dijwarî</string>\n    <string name=\"one_item_deleted\">1 babet hate jêbirin.</string>\n    <string name=\"no_available_dir\">Ji kerema xwe peldanka dakêşanê paşê di mîhengan de diyar bikin</string>\n    <string name=\"msg_copied\">Li clipboard-ê hate kopî kirin</string>\n    <string name=\"msg_wait\">Ji kerema xwe bisekinin…</string>\n    <string name=\"msg_calculating_hash\">Hesab hesibandin</string>\n    <string name=\"msg_running_detail\">Ji bo hûrguliyan tap bikin</string>\n    <string name=\"msg_running\">Daxistina NewPipe</string>\n    <string name=\"msg_error\">Şaşî</string>\n    <string name=\"msg_threads\">Mijar</string>\n    <string name=\"msg_name\">Navê pelê</string>\n    <string name=\"ok\">Baş e</string>\n    <string name=\"rename\">Navlêkirin</string>\n    <string name=\"dismiss\">Berdan</string>\n    <string name=\"checksum\">Peyda kirin</string>\n    <string name=\"delete\">Jêbirin</string>\n    <string name=\"create\">Xûliqandin</string>\n    <string name=\"pause\">Sekinandin</string>\n    <string name=\"start\">Destpêkirin</string>\n    <string name=\"no_comments\">Şîrove tune</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s vîdyoya</item>\n        <item quantity=\"other\">%s vîdyoyên</item>\n    </plurals>\n    <string name=\"infinite_videos\">∞ vîdyoyan</string>\n    <string name=\"more_than_100_videos\">100+ vîdyo</string>\n    <string name=\"no_videos\">Vîdyo tune</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s guhdar</item>\n        <item quantity=\"other\">%s guhdarvanan</item>\n    </plurals>\n    <string name=\"no_one_listening\">Kes guh nade</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s temaşe dike</item>\n        <item quantity=\"other\">%s temaşe dikin</item>\n    </plurals>\n    <string name=\"no_one_watching\">Kes temaşe nake</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">dîtina % s</item>\n        <item quantity=\"other\">%s dîtin</item>\n    </plurals>\n    <string name=\"no_views\">Nerîn tune</string>\n    <string name=\"subscribers_count_not_available\">Hejmara aboneyan tune</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s abone</item>\n        <item quantity=\"other\">%s abonekirin</item>\n    </plurals>\n    <string name=\"no_subscribers\">Ne abone</string>\n    <string name=\"drawer_header_description\">Karûbarê veguheztinê, niha hatî hilbijartin:</string>\n    <string name=\"retry\">Dîsa biceribîne</string>\n    <string name=\"audio\">Deng</string>\n    <string name=\"video\">Vîdyo</string>\n    <string name=\"detail_drag_description\">Drag bikin da ku ji nû ve sererast bikin</string>\n    <string name=\"empty_list_subtitle\">Li vir ji xeynî krikan pê ve tiştek tune</string>\n    <string name=\"search_no_results\">Encam tune</string>\n    <string name=\"description_tab_description\">Terîf</string>\n    <string name=\"related_items_tab_description\">Çemên pêwendîdar</string>\n    <string name=\"comments_tab_description\">Îrove</string>\n    <string name=\"detail_dislikes_img_view_description\">Hejmara nefretan</string>\n    <string name=\"detail_likes_img_view_description\">Evîn</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Nîgariya avatar ya barkêşker</string>\n    <string name=\"detail_thumbnail_view_description\">Vîdeo, demdirêj bilîze:</string>\n    <string name=\"error_details_headline\">Hûrî:</string>\n    <string name=\"your_comment\">Şîroveya we (bi Îngilîzî):</string>\n    <string name=\"info_labels\">Çi:\\nRequest:\\nContent Language:\\nContent Welat:\\nApp Language:\\nService:\\nGMT Dem:\\nPackage:\\nVersion:\\nOS version:</string>\n    <string name=\"what_happened_headline\">Çi qewimî:</string>\n    <string name=\"what_device_headline\">Agahdarî:</string>\n    <string name=\"error_snackbar_action\">Nûçe</string>\n    <string name=\"error_snackbar_message\">Bibore, tiştek xelet çû.</string>\n    <string name=\"error_report_open_github_notice\">Ji kerema xwe venêrin ka pirsgirêkek li ser qeza we nîqaş dike jixwe heye. Dema ku bilêtên ducar diafirînin, hûn ji me wext digirin ku em dikarin bi rastkirina çewtiya rastîn re derbas bikin.</string>\n    <string name=\"error_report_open_issue_button_text\">Rapor li ser GitHub</string>\n    <string name=\"copy_for_github\">Rapora formatkirî kopî bikin</string>\n    <string name=\"error_report_button_text\">Vê xeletiyê bi e-nameyê ragihînin</string>\n    <string name=\"sorry_string\">Bibore, divê wiya çênebûya.</string>\n    <string name=\"permission_display_over_apps\">Destûrê bidin ku hûn li ser sepanên din nîşan bidin</string>\n    <string name=\"restore_defaults_confirmation\">Ma hûn dixwazin defaultan vegerînin\\?</string>\n    <string name=\"restore_defaults\">Veguhêrin Pêngavên</string>\n    <string name=\"saved_tabs_invalid_json\">Nekarin tabên tomarkirî bixwînin, ji ber vê yekê yên default bikar bînin</string>\n    <string name=\"no_streams_available_download\">Ji bo dakêşanê çem tune</string>\n    <string name=\"error_occurred_detail\">Çewtiyek rû da: %1$s</string>\n    <string name=\"file_name_empty_error\">Navê pelê vala nabe</string>\n    <string name=\"invalid_file\">Pel tune an destûra xwendin an nivîsandinê jê tune</string>\n    <string name=\"invalid_source\">Çavkaniyek pelê/naverokê wusa tune</string>\n    <string name=\"invalid_directory\">Peldankek wusa tune</string>\n    <string name=\"missing_file\">Pel veguhezt an jêbir</string>\n    <string name=\"audio_streams_empty\">Çemên bihîstbar nehatin dîtin</string>\n    <string name=\"video_streams_empty\">Çemên vîdyoyê nehatin dîtin</string>\n    <string name=\"external_player_unsupported_link_type\">Lîstikvanên derveyî van celeb girêdan piştgirî nakin</string>\n    <string name=\"player_recoverable_failure\">Ji xeletiya lîstikvan vedigerin</string>\n    <string name=\"player_unrecoverable_failure\">Çewtiya lîstikvanê neveger çêbû</string>\n    <string name=\"player_stream_failure\">Nekarî vê streamê bilîze</string>\n    <string name=\"app_ui_crash\">Sepan/UI têk çû</string>\n    <string name=\"could_not_setup_download_menu\">Menuya dakêşanê nehat saz kirin</string>\n    <string name=\"content_not_available\">Naverok tune</string>\n    <string name=\"parsing_error\">Malperê nekare parsek bike</string>\n    <string name=\"could_not_load_thumbnails\">Nekarî hemî wêneyan barkir</string>\n    <string name=\"network_error\">Çewtiya torê</string>\n    <string name=\"download_to_sdcard_error_message\">Dakêşandin ji karta SD ya derveyî re ne gengaz e. Cihê peldanka dakêşanê ji nû ve were çêkirin\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Depoya derveyî tune</string>\n    <string name=\"general_error\">Şaşî</string>\n    <string name=\"search_history_deleted\">Dîroka lêgerînê hate jêbirin.</string>\n    <string name=\"delete_search_history_alert\">Dîroka tevahî lêgerînê jê bibe\\?</string>\n    <string name=\"clear_search_history_summary\">Dîroka peyvên sereke yên lêgerînê jê dike</string>\n    <string name=\"clear_search_history_title\">Dîroka lêgerînê paqij bike</string>\n    <string name=\"watch_history_states_deleted\">Helwestên lîstinê hatine jêbirin.</string>\n    <string name=\"delete_playback_states_alert\">Hemî pozîsyonên lîstinê werin jêbirin\\?</string>\n    <string name=\"clear_playback_states_summary\">Hemî çeperên lîstinê ji holê radike</string>\n    <string name=\"clear_playback_states_title\">Helwestên lîstokê jêbirin</string>\n    <string name=\"watch_history_deleted\">Dîroka temaşekirinê hate jêbirin.</string>\n    <string name=\"delete_view_history_alert\">Tevahiya dîroka temaşekirinê tê jêbirin\\?</string>\n    <string name=\"clear_views_history_summary\">Dîroka herikên lîstî û helwestên lîstinê jêbirin</string>\n    <string name=\"clear_views_history_title\">Dîroka temaşekirinê paqij bikin</string>\n    <string name=\"clear_cookie_summary\">Dema ku hûn reCAPTCHA-yê çareser bikin cookie-yên ku NewPipe tomar dike paqij bikin</string>\n    <string name=\"export_data_summary\">Dîrok, abone, lîsteyên lîstin û mîhengan hinarde bikin</string>\n    <string name=\"import_data_summary\">Dîroka, abonî, lîsteyên lîstinê û mîhengên (vebijarkî) we yên heyî ji holê radike</string>\n    <string name=\"recaptcha_cookies_cleared\">çerezên reCAPTCHA hatine paqij kirin</string>\n    <string name=\"clear_cookie_title\">Kûçikên reCAPTCHA paqij bikin</string>\n    <string name=\"export_data_title\">Databasê derxînin</string>\n    <string name=\"import_data_title\">Database import bikin</string>\n    <string name=\"switch_to_main\">Bi Dîmendera Malê veguherînin</string>\n    <string name=\"switch_to_popup\">Bi Popup-ê veguherînin</string>\n    <string name=\"switch_to_background\">Vegere Paşê</string>\n    <string name=\"unknown_content\">[Nenas]</string>\n    <string name=\"hash_channel_description\">Agahdarî ji bo pêşveçûna heşandina vîdyoyê</string>\n    <string name=\"hash_channel_name\">Dîtina Agahdariya Vîdyoyê</string>\n    <string name=\"app_update_notification_channel_description\">Notifications ji bo guhertoya nû ya NewPipe</string>\n    <string name=\"app_update_notification_channel_name\">Nûvekirina Agahdariyê Appê</string>\n    <string name=\"notification_channel_description\">Agahdarî ji bo lîstikvanên paşnav û popup ên NewPipe</string>\n    <string name=\"notification_channel_name\">Agahdariya NewPipe</string>\n    <string name=\"file\">Dosî</string>\n    <string name=\"just_once\">Tenê Carek</string>\n    <string name=\"always\">Herdem</string>\n    <string name=\"play_all\">Hemûyan Bilîze</string>\n    <string name=\"file_deleted\">Pel hate jêbirin</string>\n    <string name=\"undo\">Betal bike</string>\n    <string name=\"best_resolution\">Çareseriya çêtirîn</string>\n    <string name=\"error_unable_to_load_comments\">Ouldîrove nehat barkirin</string>\n    <string name=\"import_settings\">Ma hûn dixwazin mîhengan jî îthal bikin\\?</string>\n    <string name=\"override_current_data\">Ev ê sazkirina xweya heyî ji holê rabike.</string>\n    <string name=\"could_not_import_all_files\">Hişyarî: Nikare hemû pelan bîne hundur.</string>\n    <string name=\"no_valid_zip_file\">Pelê ZIP-yê derbasdar tune</string>\n    <string name=\"import_complete_toast\">Îthal kirin</string>\n    <string name=\"export_complete_toast\">Exxrac kirin</string>\n    <string name=\"select_a_kiosk\">Kiosk hilbijêrin</string>\n    <string name=\"no_playlist_bookmarked_yet\">Hîn qeşmerên lîsteya lîsteyê tune</string>\n    <string name=\"select_a_playlist\">Lîsteyek lîstinê hilbijêrin</string>\n    <string name=\"no_channel_subscribed_yet\">Tevî aboneyên kanalê tune</string>\n    <string name=\"select_a_channel\">Kanalek hilbijêrin</string>\n    <string name=\"channel_page_summary\">Rûpela Qenalê</string>\n    <string name=\"default_kiosk_page_summary\">Jixweber Kiosk</string>\n    <string name=\"kiosk_page_summary\">Rûpela Kiosk</string>\n    <string name=\"blank_page_summary\">Rûpelê Vala</string>\n    <string name=\"main_page_content_summary\">Kîjan tabî di rûpelê sereke de têne nîşandin</string>\n    <string name=\"main_page_content\">Naveroka rûpelê sereke</string>\n    <string name=\"title_most_played\">Pir lîstin</string>\n    <string name=\"title_last_played\">Lîstika dawîn</string>\n    <string name=\"delete_item_search_history\">Ma hûn dixwazin vî tiştî ji dîroka lêgerînê paqij bikin\\?</string>\n    <string name=\"action_history\">Dîrok</string>\n    <string name=\"title_activity_history\">Dîrok</string>\n    <string name=\"read_full_license\">Destûrê bixwînin</string>\n    <string name=\"app_license\">NewPipe nermalava kopîleft libre ye: Hûn dikarin li gorî kêfa xwe bikar bînin, parve bikin û baştir bikin. Bi taybetî hûn dikarin wê di bin mercên Lîsansa Giştî ya GNU ya Giştî ya ku ji hêla Weqfa Nermalava Azad ve hatî weşandin de, an guhertoya 3 ya Lîsansê, an jî (li gorî vebijarka we) guhertoyek paşîn ji nû ve belav bikin û / an biguherînin.</string>\n    <string name=\"clear\">Zelal</string>\n    <string name=\"disabled\">Bêmecel</string>\n    <string name=\"artists\">Hunermend</string>\n    <string name=\"albums\">Album</string>\n    <string name=\"songs\">Stran</string>\n    <string name=\"events\">Bûyerên</string>\n    <string name=\"users\">Bikarhêner</string>\n    <string name=\"tracks\">Parçe</string>\n    <string name=\"videos_string\">Vîdyoyên</string>\n    <string name=\"playlists\">Lîsteya lîstinê</string>\n    <string name=\"channels\">Kanalên</string>\n    <string name=\"all\">Gişt</string>\n    <string name=\"error_report_title\">Rapora xeletiyê</string>\n    <string name=\"downloads_title\">Dakêşandin</string>\n    <string name=\"downloads\">Dakêşandin</string>\n    <string name=\"duration_live\">Jîyan</string>\n    <string name=\"restricted_video\">Ev vîdyo temen tê sînorkirin.\n\\n\n\\nHeke hûn dixwazin bibînin \\\"%1$s\\\" di mîhengan de veke.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube \\\"Modeya Bicîhkirî\\\" peyda dike ku naveroka potansiyel gihîştî vedişêre</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">\\\"Modeya Bicîh\\\" a YouTube-ê veke</string>\n    <string name=\"show_age_restricted_content_summary\">Naverok ji bo zarokan dibe ku ne guncan be nîşan bikin ji ber ku sînorek temenê wê heye (mîna 18+)</string>\n    <string name=\"show_age_restricted_content_title\">Naveroka sînorkirî ya temenê nîşan bikin</string>\n    <string name=\"content\">Dilşad</string>\n    <string name=\"popup_playing_toast\">Di moda popupê de dilîzin</string>\n    <string name=\"background_player_playing_toast\">Di paşayê de dilîzin</string>\n    <string name=\"settings_category_updates_title\">Nûvekirin</string>\n    <string name=\"settings_category_debug_title\">Xeletkirin</string>\n    <string name=\"settings_category_appearance_title\">Xuyabûnî</string>\n    <string name=\"settings_category_history_title\">Dîrok û kaş</string>\n    <string name=\"settings_category_video_audio_title\">Video û deng</string>\n    <string name=\"settings_category_player_behavior_title\">Xwenîşandinî</string>\n    <string name=\"settings_category_player_title\">Lîstikvan</string>\n    <string name=\"peertube_instance_add_exists\">Mînak jixwe heye</string>\n    <string name=\"peertube_instance_add_https_only\">Tenê URL-yên HTTPS têne piştgirî kirin</string>\n    <string name=\"peertube_instance_add_fail\">Mînak nehate pejirandin</string>\n    <string name=\"peertube_instance_add_help\">URL-ya mînakê binivîse</string>\n    <string name=\"peertube_instance_add_title\">Mînak zêde bikin</string>\n    <string name=\"peertube_instance_url_help\">Mînakên ku hûn dixwazin li %s bibînin</string>\n    <string name=\"peertube_instance_url_summary\">Mînakên xweyên bijare yên PeerTube hilbijêrin</string>\n    <string name=\"peertube_instance_url_title\">Mînakên PeerTube</string>\n    <string name=\"content_language_title\">Zimanê naveroka bixweber</string>\n    <string name=\"default_content_country_title\">Welatê naverokê standard</string>\n    <string name=\"unsupported_url_dialog_message\">URL-yê nasnakin. Bi sepek din vedibe\\?</string>\n    <string name=\"unsupported_url\">URL-ya ku nayê piştgirî kirin</string>\n    <string name=\"show_hold_to_append_summary\">Dema ku hûn paşnav an bişkoja popupê ya di vîdyoyê de \\\"Hûrgulî:\\\" bişkînin tip nîşan bidin</string>\n    <string name=\"show_hold_to_append_title\">Serişteya \\\"Ji bo pêvekirinê bigire\\\" nîşan bide</string>\n    <string name=\"autoplay_title\">Lîstik bixweber</string>\n    <string name=\"download_dialog_title\">Dakêşînin</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Piştî qutbûnan lîstikê bidomînin (mînak telefonên telefonê)</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Ji nû ve lîstin</string>\n    <string name=\"enable_watch_history_summary\">Vîdyoyên temaşekirî bişopînin</string>\n    <string name=\"settings_category_clear_data_title\">Daneyên paqij bikin</string>\n    <string name=\"enable_playback_state_lists_summary\">Di navnîşan de nîşanên pozîsyona playback nîşan bikin</string>\n    <string name=\"enable_playback_state_lists_title\">Di nav lîsteyan de helwest</string>\n    <string name=\"enable_playback_resume_summary\">Cihê lîstika paşîn vegerînin</string>\n    <string name=\"enable_playback_resume_title\">Vejînê ji nû ve bidin dest pê kirin</string>\n    <string name=\"enable_watch_history_title\">Li dîrokê temaşe bikin</string>\n    <string name=\"enable_search_history_summary\">Pirsên lêgerînê bi cîh bikin</string>\n    <string name=\"enable_search_history_title\">Dîroka lêgerînê</string>\n    <string name=\"show_search_suggestions_summary\">Dema ku lêgerînê pêşniyaran nîşan bidin</string>\n    <string name=\"show_search_suggestions_title\">Pêşniyarên lêgerînê</string>\n    <string name=\"auto_queue_toggle\">Rêzeya-otomatîkî</string>\n    <string name=\"auto_queue_summary\">Bi pêvekirina kanalek pêwendîdar rêza lîstikê ya bidawîkirina (ne-dubare) bidomînin</string>\n    <string name=\"auto_queue_title\">Çemê din ê dixwe-dorê bike</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">bellek ya metadata paqij kir</string>\n    <string name=\"metadata_cache_wipe_summary\">Hemî daneyên rûpelê malperê yên kaşkirî rakin</string>\n    <string name=\"metadata_cache_wipe_title\">Metadata veşartî paqij bike</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">belleka wêneyê paqij kir</string>\n    <string name=\"show_meta_info_summary\">Vedixwin da ku qutiyên agahdariya meta yên bi agahdariya din ên di derheqê afirînerê rûberê, naveroka herikê an daxwazek lêgerînê de veşêrin.</string>\n    <string name=\"show_meta_info_title\">Agahdariya meta nîşan bide</string>\n    <string name=\"show_description_summary\">Vedixwin da ku danasîna vîdyoyê û agahdariya zêde veşêrin</string>\n    <string name=\"show_description_title\">Danasînê nîşan bide</string>\n    <string name=\"show_next_and_similar_title\">Vîdyoyên \\'Pêş\\' û \\'Bi vî rengî\\' nîşan bidin</string>\n    <string name=\"show_comments_summary\">Zivirandin da ku şîroveyan veşêrin</string>\n    <string name=\"show_comments_title\">Şîroveyan nîşan bide</string>\n    <string name=\"clear_queue_confirmation_description\">Dê rêza lîstikvanê çalak were guhertin</string>\n    <string name=\"clear_queue_confirmation_summary\">Guhertina ji lîstikvanek bi yeke din dibe ku dewsa dorê we bigire</string>\n    <string name=\"clear_queue_confirmation_title\">Berî paqijkirina dorê ji pejirandinê bipirsin</string>\n    <string name=\"seek_duration_title\">Zû-zû/-vejîn li dûvçûnê digerin</string>\n    <string name=\"use_inexact_seek_summary\">Lêgerîna nerast destûrê dide lîstikvan ku bi rastbûna kêmkirî zûtir li helwestan bigere. 5, 15 an 25 saniyeyan lêgerîn bi vê yekê re kar nake.</string>\n    <string name=\"use_inexact_seek_title\">Lêgerîna nerast ya zû bikar bînin</string>\n    <string name=\"popup_remember_size_pos_summary\">Mezinahî û pozîsyona paşîn a paşîn bîr bînin</string>\n    <string name=\"popup_remember_size_pos_title\">Taybetmendiyên popupê bi bîr bînin</string>\n    <string name=\"black_theme_title\">Reş</string>\n    <string name=\"dark_theme_title\">Tarî</string>\n    <string name=\"light_theme_title\">Ronî</string>\n    <string name=\"theme_title\">Mijad</string>\n    <string name=\"default_video_format_title\">Formata vîdyoyê ya jixweber</string>\n    <string name=\"default_audio_format_title\">Formata bihîstwerê ya neraza</string>\n    <string name=\"play_audio\">Deng</string>\n    <string name=\"notification_colorize_summary\">Android-ê rengê notification-ê li gorî rengê sereke-yê di thumbnail-ê de xwerû bikî (not bikin ku ev li ser hemî amûran tune)</string>\n    <string name=\"notification_colorize_title\">Ragihandinê rengîn bikin</string>\n    <string name=\"notification_action_nothing\">Netişt</string>\n    <string name=\"notification_action_buffering\">Tampon kirin</string>\n    <string name=\"notification_action_shuffle\">Lihevxitin</string>\n    <string name=\"notification_action_repeat\">Dûbare</string>\n    <string name=\"notification_actions_at_most_three\">Hûn dikarin herî zêde sê çalakiyan hilbijêrin da ku di ragihana kompakt de nîşan bidin!</string>\n    <string name=\"notification_actions_summary\">Her çalakiyek agahdariyê li jêr bi lêdana li ser wê biguhezînin. Sê heb ji wan hilbijêrin ku bi karanîna qutîkên li milê rastê di notification kompakt de werin nîşan kirin.</string>\n    <string name=\"notification_action_4_title\">Bişkoja çalakiya pêncan</string>\n    <string name=\"notification_action_3_title\">Bişkoja çalakiya çaremîn</string>\n    <string name=\"notification_action_2_title\">Bişkoja çalakiya sêyemîn</string>\n    <string name=\"notification_action_1_title\">Bişkoja çalakiya duyemîn</string>\n    <string name=\"notification_action_0_title\">Bişkoja çalakiya yekem</string>\n    <string name=\"notification_scale_to_square_image_summary\">Mîqneya vîdyoyê ya ku di agahdariyê de ji 16:9 ber 1:1 rêjeya aliyî ve hatî nîşankirin bipîve (dibe ku berevajîkirinan destnîşan bike)</string>\n    <string name=\"notification_scale_to_square_image_title\">Mîqneya pîvanê bi rêjeya aliyî ya 1:1 ve</string>\n    <string name=\"show_play_with_kodi_summary\">Vebijarkek ji bo lîstina vîdyoyek bi navgîniya navenda medya Kodi nîşan bidin</string>\n    <string name=\"show_play_with_kodi_title\">Vebijarka \\\"Bi Kodi re lîstin\\\" nîşan bidin</string>\n    <string name=\"kore_not_found\">Sepana Kore ya wenda saz dike\\?</string>\n    <string name=\"play_with_kodi_title\">Bi Kodî re bilîzin</string>\n    <string name=\"msg_popup_permission\">Vê destûr hewce ye ku\n\\ndi moda popupê de vekin</string>\n    <string name=\"show_higher_resolutions_summary\">Tenê hin cîhaz dikarin vîdyoyên 2K/4K bilîzin</string>\n    <string name=\"show_higher_resolutions_title\">Pêşniyarên mezintir nîşan bidin</string>\n    <string name=\"default_popup_resolution_title\">Çareseriya popupê ya jixweber</string>\n    <string name=\"default_resolution_title\">Vebijêrk jixweber</string>\n    <string name=\"download_path_audio_dialog_title\">Ji bo pelên deng peldanka dakêşanê hilbijêrin</string>\n    <string name=\"download_path_audio_summary\">Pelên bihîstwerê yên dakêşandî li vir têne hilanîn</string>\n    <string name=\"download_path_audio_title\">Peldanka dakêşana bihîstbar</string>\n    <string name=\"download_path_dialog_title\">Ji bo pelên vîdyoyê peldanka dakêşanê hilbijêrin</string>\n    <string name=\"download_path_summary\">Pelên vîdyoyê yên dakêşandî li vir têne tomar kirin</string>\n    <string name=\"download_path_title\">Peldanka dakêşana vîdyoyê</string>\n    <string name=\"controls_add_to_playlist_title\">Lê zêde bike</string>\n    <string name=\"controls_popup_title\">Daxwazker</string>\n    <string name=\"controls_background_title\">Paşî</string>\n    <string name=\"tab_choose\">Tab hilbijêrin</string>\n    <string name=\"tab_bookmarks\">Lîsteyên Playlistê yên nîşankirî</string>\n    <string name=\"tab_subscriptions\">Abonekirin</string>\n    <string name=\"show_info\">Agahdariyê nîşan bide</string>\n    <string name=\"subscription_update_failed\">Nikarin abonetiyê nû bikin</string>\n    <string name=\"subscription_change_failed\">Nabe abonetiyê biguheze</string>\n    <string name=\"channel_unsubscribed\">Kanal nehatî abonekirin</string>\n    <string name=\"unsubscribe\">Betal kirin</string>\n    <string name=\"subscribed_button_title\">Abonekirin</string>\n    <string name=\"subscribe_button_title\">Bibin abone</string>\n    <string name=\"use_external_audio_player_title\">Lîsteya bihîstwerê derveyî bikar bînin</string>\n    <string name=\"use_external_video_player_summary\">Dengê li hin biryaran radike</string>\n    <string name=\"use_external_video_player_title\">Vîdyoyek derveyî bikar bînin</string>\n    <string name=\"share_dialog_title\">Parve dikin li gel</string>\n    <string name=\"search_showing_result_for\">Encaman ji bo: %s nîşan dide</string>\n    <string name=\"did_you_mean\">Mebesta we \\\"%1$s\\\" bû\\?</string>\n    <string name=\"settings\">Mîhengên</string>\n    <string name=\"search\">Gerr</string>\n    <string name=\"controls_download_desc\">Pelê çemê dakêşin</string>\n    <string name=\"download\">Dakêşînin</string>\n    <string name=\"share\">Par</string>\n    <string name=\"open_with\">Bi vekin</string>\n    <string name=\"open_in_popup_mode\">Di moda popupê de vekin</string>\n    <string name=\"open_in_browser\">Di gerokê de veke</string>\n    <string name=\"cancel\">Bişûndekirin</string>\n    <string name=\"install\">Lêkirin</string>\n    <string name=\"no_player_found_toast\">Vebijarkek streaming nehat dîtin (hûn dikarin VLC-yê saz bikin da ku lê bilîze).</string>\n    <string name=\"no_player_found\">Lîstikvanek herikê nehat dîtin. VLC saz bikin\\?</string>\n    <string name=\"upload_date_text\">Li ser hate weşandin %1$s</string>\n    <string name=\"main_bg_subtitle\">Ji bo destpêkirinê \\\"Lêgerîn\\\" bitikînin</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Di hin karûbaran de heye, ew bi gelemperî pir zûtir e lê dibe ku hejmarek bi sînor a tiştan vegerîne û bi gelemperî agahdariya bêkêmasî vebigere (mînakî bê domdanî, celebek tişt, bê statûya zindî).</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Dema ku hebe ji xwarina fedakar bistînin</string>\n    <string name=\"feed_update_threshold_option_always_update\">Her dem nûve bikin</string>\n    <string name=\"feed_update_threshold_summary\">Demjimêr piştî nûvekirina paşîn berî ku abonetiyê kevn tête hesibandin — %s</string>\n    <string name=\"feed_update_threshold_title\">Benda nûvekirina xwedî kirin</string>\n    <string name=\"settings_category_feed_title\">Xwedî kirin</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Tenê aboneyên ne kombûyî nîşan bidin</string>\n    <string name=\"feed_create_new_group_button_title\">Nû</string>\n    <string name=\"feed_group_dialog_delete_message\">Ma hûn dixwazin vê komê jê bibin\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Navê koma vala</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d hilbijart</item>\n        <item quantity=\"other\">%d hilbijartî</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Tevlêbûn tune</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Abonetiyê hilbijêrin</string>\n    <string name=\"feed_processing_message\">Pêvajoya pêvajoyê…</string>\n    <string name=\"feed_notification_loading\">Xwedîkirin tête barkirin…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Ne barkirî: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Xxweyîkirin herî dawî hate nûve kirin: %s</string>\n    <string name=\"feed_groups_header_title\">Komên kenalê</string>\n    <string name=\"fragment_feed_title\">Çi Nû ye</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d rojê</item>\n        <item quantity=\"other\">%d roj</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d saet</item>\n        <item quantity=\"other\">%d demjimêran</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d hûrdem</item>\n        <item quantity=\"other\">%d deqîqe</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d çirk</item>\n        <item quantity=\"other\">%d çirkeyan</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Ji ber astengiyên ExoPlayer dema lêgerînê li %d çirkeyan hate saz kirin</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Erê, û bi qismî vîdyoyan temaşe kir</string>\n    <string name=\"remove_watched_popup_warning\">Vîdyoyên ku berî û piştî ku li lîsteya lîsteyê hatine zêdekirin hatine temaşekirin, dê werin rakirin. \\nPiştrastin? Ev nayê betal kirin!</string>\n    <string name=\"remove_watched_popup_title\">Vîdyoyên temaşekirî rakin?</string>\n    <string name=\"remove_watched\">Jê temaşe rakin</string>\n    <string name=\"systems_language\">Pergala wekî ku heyî</string>\n    <string name=\"app_language_title\">Zimanê appê</string>\n    <string name=\"choose_instance_prompt\">Mînakek hilbijêrin</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Çarçoveya Gihîştina Storage\\' daxistinan li qertek SD ya derveyî dihêle.\n\\nHin cîhaz lihevnehatî ne</string>\n    <string name=\"downloads_storage_use_saf_title\">SAF bikar bînin</string>\n    <string name=\"downloads_storage_ask_summary\">Dê ji we were pirsîn ka hûn ê her dakêşanê li ku derê hilanînê</string>\n    <string name=\"downloads_storage_ask_title\">Li ku derê dakêşin bipirsin</string>\n    <string name=\"pause_downloads\">Dakêşan rawestînin</string>\n    <string name=\"start_downloads\">Dakêşan dest pê bikin</string>\n    <string name=\"enable_queue_limit_desc\">Yek dakêşîn dê di heman demê de bimeşe</string>\n    <string name=\"enable_queue_limit\">Rêzeya dakêşanê sînor bikin</string>\n    <string name=\"close\">Asê kirin</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Kêrhatî ye dema ku veguherîna daneyên mobîl, her çend hin dakêşan nayê rawestandin</string>\n    <string name=\"pause_downloads_on_mobile\">Li ser torên pîvandî qut bibin</string>\n    <string name=\"max_retry_desc\">Berî betalkirina dakêşanê jimara herî zêde hewldan</string>\n    <string name=\"max_retry_msg\">Zêdetir dubarekirin çêbû</string>\n    <string name=\"stop\">Rawestan</string>\n    <string name=\"delete_downloaded_files\">Pelên dakêşandî hilweşînin</string>\n    <string name=\"confirm_prompt\">Ma hûn dixwazin dîroka dakêşanê xwe paqij bikin an hemî pelên dakêşandî jê bibin\\?</string>\n    <string name=\"clear_download_history\">Dîroka dakêşanê paqij bikin</string>\n    <string name=\"error_download_resource_gone\">Vê dakêşanê nikare paşde bibe</string>\n    <string name=\"error_timeout\">Dema girêdanê</string>\n    <string name=\"error_progress_lost\">Pêşkeftin winda bû, ji ber ku pel hate jêbirin</string>\n    <string name=\"error_insufficient_storage_left\">Cih li cîhazê namîne</string>\n    <string name=\"error_postprocessing_stopped\">Dema ku pel dixebitî NewPipe hate girtin</string>\n    <string name=\"error_postprocessing_failed\">Pêvajoya şûnda têk çû</string>\n    <string name=\"error_http_not_found\">Peyda nebû</string>\n    <string name=\"error_http_unsupported_range\">Pêşkêşker dakêşanên pir-têl qebûl nake, bi @string/msg_threads = 1 re dîsa biceribîne</string>\n    <string name=\"error_http_no_content\">Pêşkêşker daneyê naşîne</string>\n    <string name=\"error_connect_host\">Nikare bi serverê re girêbide</string>\n    <string name=\"error_unknown_host\">Pêşkêşker nehat dîtin</string>\n    <string name=\"error_ssl_exception\">Pêwendiyek ewledar çênabe</string>\n    <string name=\"error_path_creation\">Peldanka armancê nayê afirandin</string>\n    <string name=\"error_file_creation\">Pel nayê afirandin</string>\n    <string name=\"show_error\">Xeletiyê nîşan bide</string>\n    <string name=\"download_already_pending\">Bi vî navî ve dakêşînek heye</string>\n    <string name=\"download_already_running\">Bi vî navî dakêşînek heye</string>\n    <string name=\"overwrite_failed\">nikare pelê ji nû ve binivîse</string>\n    <string name=\"overwrite_finished_warning\">Pelek bi vî navî ve hatî dakêşandin jixwe heye</string>\n    <string name=\"overwrite_unrelated_warning\">Pelek bi vî navî jixwe heye</string>\n    <string name=\"overwrite\">Li ser binîvîsînê</string>\n    <string name=\"generate_unique_name\">Navê yekta çêbikin</string>\n    <string name=\"download_failed\">Dakêşandin têk çû</string>\n    <string name=\"permission_denied\">Çalakiya ku ji hêla pergalê ve hatî înkar kirin</string>\n    <string name=\"enqueue\">Sira</string>\n    <string name=\"recovering\">başbûn</string>\n    <string name=\"post_processing\">post-pêvajoyê</string>\n    <string name=\"queued\">rêz kirin</string>\n    <string name=\"paused\">sekinî</string>\n    <string name=\"missions_header_pending\">Nexelas</string>\n    <string name=\"missions_header_finished\">Qediya</string>\n    <string name=\"app_update_available_notification_title\">Nûvekirina NewPipe heye!</string>\n    <string name=\"auto\">Jixweber</string>\n    <string name=\"grid\">Qefes</string>\n    <string name=\"list\">Rêzok</string>\n    <string name=\"list_view_mode\">Modeya dîtina navnîşê</string>\n    <string name=\"never\">Qet</string>\n    <string name=\"wifi_only\">Tenê li ser Wi-Fi</string>\n    <string name=\"autoplay_summary\">Jixweber bixweber dest pê bike — %s</string>\n    <string name=\"minimize_on_exit_popup_description\">Bi player popup-ê re kêm bikin</string>\n    <string name=\"minimize_on_exit_background_description\">Li player paşnavê kêm bikin</string>\n    <string name=\"minimize_on_exit_none_description\">Netû</string>\n    <string name=\"minimize_on_exit_summary\">Çalakiya dema ku ji bernameya sereke ya vîdyoyê veguherîne ser sepana din — %s</string>\n    <string name=\"minimize_on_exit_title\">Li ser veguherîna sepanê kêm bikin</string>\n    <string name=\"updates_setting_description\">Dema ku guhertoyek nû heye, agahdariyek nîşanî nûvekirina bernameyê bide</string>\n    <string name=\"updates_setting_title\">Nûvekirin</string>\n    <string name=\"limit_mobile_data_usage_title\">Dema ku daneyên mobîl bikar tînin çareseriyê sînor bikin</string>\n    <string name=\"limit_data_usage_none_description\">Sînor tune</string>\n    <string name=\"decline\">Paşvegerrî</string>\n    <string name=\"accept\">Baweranîn</string>\n    <string name=\"start_accept_privacy_policy\">Ji bo ku em rêzê li Rêziknameya Parastina Daneya Giştî ya Ewropî (GDPR) bigirin, em herby bala we dikişînin ser siyaseta nepeniya NewPipe. Ji kerema xwe bi baldarî bixwînin.\n\\nDivê hûn wê qebûl bikin da ku em rapora çewtiyê ji me re bişînin.</string>\n    <string name=\"playback_reset\">Reset bikin</string>\n    <string name=\"playback_step\">Gav</string>\n    <string name=\"skip_silence_checkbox\">Di dema bêdengiyê de zû-zû</string>\n    <string name=\"unhook_checkbox\">Unhook (dibe sedema xerakirinê)</string>\n    <string name=\"playback_pitch\">Avêtin</string>\n    <string name=\"playback_tempo\">Lez</string>\n    <string name=\"playback_speed_control\">Kontrolên Leza Piştê tomarkirinê</string>\n    <string name=\"import_network_expensive_warning\">Di hişê xwe de bimînin ev operasyon dikare bihayê torê be.\n\\n\n\\nMa hûn dixwazin berdewam bikin\\?</string>\n    <string name=\"import_soundcloud_instructions_hint\">Dixwaze, soundcloud.com/yourid</string>\n    <string name=\"import_soundcloud_instructions\">Bi navnîşana URL an Nasnameya xwe profîlek SoundCloud bikirin:\n\\n\n\\n1. Di rû-gerokê de \\\"moda sermaseyê\\\" çalak bike (malper ji bo cîhazên mobîl peyda nabe)\n\\n2. Herin vê URL-ê: %1$s\n\\n3. Dema ku ji we were pirsîn bikevin hundur\n\\n4. URL-ya profîlê ku hûn lê hatine rêve kirin kopî bikin.</string>\n    <string name=\"subscriptions_export_unsuccessful\">Nikare abonetiyê bişîne</string>\n    <string name=\"subscriptions_import_unsuccessful\">Nekarîn abone nekarin</string>\n    <string name=\"previous_export\">Hinardeya berê</string>\n    <string name=\"import_file_title\">Pelê îthal bikin</string>\n    <string name=\"export_ongoing\">Hinardekirin…</string>\n    <string name=\"import_ongoing\">Tedixî ye…</string>\n    <string name=\"import_from\">Têxe ji</string>\n    <string name=\"import_title\">Têxe</string>\n    <string name=\"export_to\">Têxe kirin</string>\n    <string name=\"show_original_time_ago_summary\">Nivîsarên orjînal ên ji karûbaran dê di hêmanên rûkê de werin xuyang kirin</string>\n    <string name=\"show_original_time_ago_title\">Demên berê yên orîjînal li ser tiştan nîşan bidin</string>\n    <string name=\"enable_disposed_exceptions_summary\">Rakirina ragihandina îstîsnayên Rx ên nediyar li derveyî çerxa jiyanê ya perçeyek an çalakiyê piştî avêtinê</string>\n    <string name=\"enable_disposed_exceptions_title\">Xeletên çerxa jîngehê ragihînin</string>\n    <string name=\"show_memory_leaks\">Nîşanên bîranînê nîşan bidin</string>\n    <string name=\"enable_leak_canary_summary\">Çavdêriya lerizîna bîranînê dibe ku bibe sedem ku sepan dema hilweşînê bêbersiv bibe</string>\n    <string name=\"caption_setting_description\">Pîvana nivîsara sernavê û şêwazên paşnavê biguherîne. Pêdivî ye ku sepandin ji nû ve dest pê bike ku bandor bike.</string>\n    <string name=\"caption_setting_title\">Sernavkirin</string>\n    <string name=\"caption_auto_generated\">Jixweber çêkirî ye</string>\n    <string name=\"resize_zoom\">Mezin bike</string>\n    <string name=\"resize_fill\">Tijîkirin</string>\n    <string name=\"resize_fit\">Bihorîn</string>\n    <string name=\"caption_none\">Sernavan tune</string>\n    <string name=\"playlist_no_uploader\">Jixweber çêkirî (barkêşek nehat dîtin)</string>\n    <string name=\"playlist_thumbnail_change_success\">Mîcnama lîsteya lîstikê guherî.</string>\n    <string name=\"playlist_add_stream_success\">Lîsteya lîstinê</string>\n    <string name=\"playlist_creation_success\">Lîsteya lîstinê hate afirandin</string>\n    <string name=\"delete_playlist_prompt\">Vê lîsteya lîstinê were jêbirin\\?</string>\n    <string name=\"unbookmark_playlist\">Lîsteya lîsteyê nîşan hilînin</string>\n    <string name=\"bookmark_playlist\">Lîsteya lîsteyê nîşan bikin</string>\n    <string name=\"set_as_playlist_thumbnail\">Wekî Thumbnailê Lîsteya Lîsteyê saz bikin</string>\n    <string name=\"unmute\">Bê deng kirin</string>\n    <string name=\"mute\">Bêdeng</string>\n    <string name=\"add_to_playlist\">Li lîsteyê zêde bike</string>\n    <string name=\"name\">Nav</string>\n    <string name=\"rename_playlist\">Navlêkirin</string>\n    <string name=\"create_playlist\">Lîstinê ya nû</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Naveroka daxwazkirî bar dike</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Agahdariyê digire…</string>\n    <string name=\"always_ask_open_action\">Her gav bipirsin</string>\n    <string name=\"popup_player\">Lîstikvanê popupê</string>\n    <string name=\"background_player\">Lîstikvanê paşnavê</string>\n    <string name=\"video_player\">Vîdyo listikvanêr</string>\n    <string name=\"preferred_open_action_settings_summary\">Dema vekirina naverokê çalakiya neraza — %s</string>\n    <string name=\"preferred_open_action_settings_title\">Çalakiya \\'vekirî\\' ya bijarte</string>\n    <string name=\"drawer_close\">Drawerê bigire</string>\n    <string name=\"drawer_open\">Dirûvê Vekirî</string>\n    <string name=\"start_here_on_popup\">Di popupek de dest bi lîstinê bikin</string>\n    <string name=\"start_here_on_background\">Destpêk lîstina li paş</string>\n    <string name=\"enqueued\">Rêzkirî</string>\n    <string name=\"enqueue_stream\">Di rêzê de</string>\n    <string name=\"hold_to_append\">Ji bo rêzkirinê ragirin</string>\n    <string name=\"play_queue_audio_settings\">Mîhengên Deng</string>\n    <string name=\"play_queue_stream_detail\">Hûrgulî</string>\n    <string name=\"play_queue_remove\">Rakirin</string>\n    <string name=\"title_activity_play_queue\">Dûvê lîstin</string>\n    <string name=\"conferences\">Konferans</string>\n    <string name=\"most_liked\">Pir hez kirin</string>\n    <string name=\"recently_added\">Demên dawî zêde kirin</string>\n    <string name=\"local\">Herêmî</string>\n    <string name=\"new_and_hot\">Nû û germ</string>\n    <string name=\"top_50\">Yekem 50</string>\n    <string name=\"trending\">Tiştên Trend</string>\n    <string name=\"app_license_title\">Lîsansa NewPipe</string>\n    <string name=\"read_privacy_policy\">Polîtîkaya nepeniyê bixwînin</string>\n    <string name=\"privacy_policy_encouragement\">Projeya NewPipe nepenîtiya we pir cidî digire. Ji ber vê yekê, sepanê bêyî razîbûna we tu daneyan kom nake.\n\\nSiyaseta taybetîtiyê ya NewPipe dema ku hûn rapora qeza dişînin çi daneyên têne şandin û hilanîn bi berfirehî vedibêje.</string>\n    <string name=\"privacy_policy_title\">Siyaseta taybetîtiyê ya NewPipe</string>\n    <string name=\"website_encouragement\">Ji bo bêtir agahdarî û nûçeyan biçin Malpera NewPipe.</string>\n    <string name=\"website_title\">Malper</string>\n    <string name=\"give_back\">Vegerînin</string>\n    <string name=\"donation_encouragement\">NewPipe ji hêla dilxwazan ve dema xweya vala derbas dikin ji we re ezmûna bikarhênerê çêtirîn anîne pêşve xistin. Vegerînin da ku ji pêşdebiran re bibin alîkar ku NewPipe hê çêtir bikin dema ku ew ji fîncanek qehweyê kêfê bigirin.</string>\n    <string name=\"donation_title\">Bêşdan</string>\n    <string name=\"view_on_github\">GitHub-ê bibînin</string>\n    <string name=\"contribution_encouragement\">Ka ramanên we hene; werger, guherandinên sêwiranê, paqijkirina kodê, an guherînên koda giran ên rastîn-alîkarî her gav bi xêr hatî. Ya ku çêdibe çêtir dibe!</string>\n    <string name=\"contribution_title\">Paraxwe dayin</string>\n    <string name=\"app_description\">Li Android-ê veguhastina ronahiya sivik.</string>\n    <string name=\"title_activity_about\">Derbarê NewPipe</string>\n    <string name=\"charset_most_special_characters\">Pir karakterên taybetî</string>\n    <string name=\"charset_letters_and_digits\">Name û reqem</string>\n    <string name=\"settings_file_replacement_character_title\">Karaktera guheztinê</string>\n    <string name=\"settings_file_replacement_character_summary\">Karakteyên nederbasdar bi vê nirxê têne veguheztin</string>\n    <string name=\"settings_file_charset_title\">Di navên pelan de tîpan destûr dan</string>\n    <string name=\"settings_category_downloads_title\">Dakêşînin</string>\n    <string name=\"done\">Kirî</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA dijwarî xwestin</string>\n    <string name=\"subtitle_activity_recaptcha\">Dema ku çareser bibe \\\"Kirî\\\" çap bikin</string>\n    <string name=\"import_youtube_instructions\">Tevlêbûnên YouTube-ê ji barkirina Google-ê bikişînin:\n\\n\n\\n1. Herin vê URL-ê: %1$s\n\\n2. Dema ku ji we tê xwestin bikevin hundur\n\\n3. Li ser \\\"Hemî daneyên tê de\\\" bikirtînin, dûre \\\"Hemî hilbijêrin\\\" hilbijêrinîn, paşê tenê \\\"abonetiyê\\\" hilbijêrin û \\\"OK\\\" bikirtînin\n\\n4. Li ser \\\"Pênga Next\\\" û paşê jî li ser \\\"Afirandina hinardeyê\\\" bitikînin\n\\n5. Bişkojka \\\"Dakêşanê\\\" bitikîne piştî ku xuya dibe û\n\\n6. Ji zip zipê dakêşandî pelê .json derxînin (bi gelemperî di bin \\\"YouTube û YouTube de Music/subscriptions/subscriptions.json\\\") û wê li vir îthal bikin.</string>\n    <string name=\"show_thumbnail_summary\">Hem ji bo paşnavê dîmendera kilît û hem jî ji bo agahdarkirinê wêneyên nîgarê bikar bînin</string>\n    <string name=\"no_app_to_open_intent\">Tu cîhaz li ser amûrê we nikare vê vebike</string>\n    <string name=\"chapters\">Beş</string>\n    <string name=\"recent\">Demek berê</string>\n    <string name=\"show_thumbnail_title\">Nîşandana kurte</string>\n    <string name=\"playlist_page_summary\">Rûpela lîsteyê</string>\n    <string name=\"video_detail_by\">Bi %s</string>\n    <string name=\"channel_created_by\">Ji hêla %s ve hatî afirandin</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Avrêl avatar a Qenal</string>\n    <string name=\"content_not_supported\">Vê naverok hîn ji hêla NewPipe ve nayê piştgirî kirin.\n\\n\n\\nEw ê hêvî dikim ku di guhertoyek pêşerojê de piştgirî bibe.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Li gorî we barkirina xwarinê pir hêdî ye\\? Ger wusa ye, barkirina zû biceribîne (hûn dikarin wê di mîhengan de an bi tikandina bişkoja jêrîn biguherînin).\n\\n\n\\nNewPipe du stratejiyên barkirina xwarinê pêşkêşî dike:\n\\n• Dîtina tevahî kanala abonetiyê, ku hêdî ye lê temam e.\n\\n• Bikaranîna xala dawîn a karûbarê taybetî, ku bilez e lê bi gelemperî ne temam e.\n\\n\n\\nCûdaiya di navbera her duyan de ev e ku ya bilez bi gelemperî hin agahdarî, mîna dirêjahî an celebê (nekare vîdyoyên zindî û yên normal cuda bike) tune û dibe ku ew kêmtir tiştan jî vegerîne.\n\\n\n\\nYouTube nimûneyek xizmetê ye ku bi xwarina RSS-ê vê rêbaza bilez pêşkêşî dike.\n\\n\n\\nJi ber vê yekê bijarde bi tiştê ku hûn tercîh dikin ve girêdayî ye: leza an agahdariya rastîn.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Modeya lezgîn neçalak bikin</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Modeya lezgîn çalak bikin</string>\n    <string name=\"tab_licenses\">Destûrên</string>\n    <string name=\"tab_about\">Derbar</string>\n    <string name=\"copyright\">© %1$s bi %2$s di bin %3$s de</string>\n    <string name=\"title_licenses\">Lîsansên partiya sêyemîn</string>\n    <string name=\"crash_the_app\">Serlêdanê kilît bikin</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-kn/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"controls_add_to_playlist_title\">ಗೆ ಸೇರಿಸಿ</string>\n    <string name=\"show_info\">ಮಾಹಿತಿಯನ್ನು ತೋರಿಸಿ</string>\n    <string name=\"channel_unsubscribed\">ಚಾನಲ್ ಅನ್‌ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಲಾಗಿದೆ</string>\n    <string name=\"open_in_popup_mode\">ಪಾಪ್‌ಅಪ್ ಮೋಡ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ</string>\n    <string name=\"did_you_mean\">ನೀವು \\\"%1$s\\\" ಎಂದು ಅರ್ಥೈಸಿದ್ದೀರಾ?</string>\n    <string name=\"share_dialog_title\">ಬಳಸಿ ಹಂಚಿಕೊಳ್ಳಿ</string>\n    <string name=\"download_path_dialog_title\">ವೀಡಿಯೊ ಫೈಲ್‌ಗಳಿಗಾಗಿ ಡೌನ್‌ಲೋಡ್ ಫೋಲ್ಡರ್ ಆಯ್ಕೆಮಾಡಿ</string>\n    <string name=\"subscribed_button_title\">ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಲಾಗಿದೆ</string>\n    <string name=\"download_path_audio_summary\">ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ಆಡಿಯೊ ಫೈಲ್‌ಗಳನ್ನು ಇಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ</string>\n    <string name=\"use_external_audio_player_title\">ಬಾಹ್ಯ ಆಡಿಯೊ ಪ್ಲೇಯರ್ ಬಳಸಿ</string>\n    <string name=\"subscription_change_failed\">ಚಂದಾದಾರಿಕೆಯನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</string>\n    <string name=\"main_bg_subtitle\">ಪ್ರಾರಂಭಿಸಲು ಭೂತಗನ್ನಡಿಯನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ.</string>\n    <string name=\"use_external_video_player_summary\">ಕೆಲವು ರೆಸಲ್ಯೂಶನ್‌ಗಳಲ್ಲಿ ಆಡಿಯೊವನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ</string>\n    <string name=\"upload_date_text\">%1$s ರಂದು ಪ್ರಕಟಿಸಲಾಗಿದೆ</string>\n    <string name=\"mark_as_watched\">ವೀಕ್ಷಿಸಲಾಗಿದೆ ಎಂದು ಗುರುತಿಸಿ</string>\n    <string name=\"no_player_found_toast\">ಯಾವುದೇ ಸ್ಟ್ರೀಮ್ ಪ್ಲೇಯರ್ ಕಂಡುಬಂದಿಲ್ಲ (ಅದನ್ನು ಪ್ಲೇ ಮಾಡಲು ನೀವು VLC ಅನ್ನು ಸ್ಥಾಪಿಸಬಹುದು).</string>\n    <string name=\"ok\">ಸರಿ</string>\n    <string name=\"open_in_browser\">ಬ್ರೌಸರ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿ</string>\n    <string name=\"controls_popup_title\">ಪಾಪ್ಅಪ್</string>\n    <string name=\"download\">ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ</string>\n    <string name=\"search_showing_result_for\">ಇದಕ್ಕೆ ಫಲಿತಾಂಶಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ: %s</string>\n    <string name=\"open_with\">ಇದರೊಂದಿಗೆ ತೆರೆಯಿರಿ</string>\n    <string name=\"download_path_summary\">ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ವೀಡಿಯೊ ಫೈಲ್‌ಗಳನ್ನು ಇಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗುತ್ತದೆ</string>\n    <string name=\"controls_download_desc\">ಸ್ಟ್ರೀಮ್ ಫೈಲ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ</string>\n    <string name=\"cancel\">ರದ್ದುಗೊಳಿಸಿ</string>\n    <string name=\"download_path_audio_title\">ಆಡಿಯೋ ಡೌನ್‌ಲೋಡ್ ಫೋಲ್ಡರ್</string>\n    <string name=\"tab_bookmarks\">ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಲಾದ ಪ್ಲೇಪಟ್ಟಿಗಳು</string>\n    <string name=\"subscription_update_failed\">ಚಂದಾದಾರಿಕೆಯನ್ನು ನವೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</string>\n    <string name=\"subscribe_button_title\">ಸಬ್‌ಸ್ಕ್ರೈಬ್</string>\n    <string name=\"search\">ಹುಡುಕಿ</string>\n    <string name=\"tab_subscriptions\">ಚಂದಾದಾರಿಕೆಗಳು</string>\n    <string name=\"settings\">ಸೆಟ್ಟಿಂಗ್‌ಗಳು</string>\n    <string name=\"use_external_video_player_title\">ಬಾಹ್ಯ ವೀಡಿಯೊ ಪ್ಲೇಯರ್ ಬಳಸಿ</string>\n    <string name=\"install\">ಸ್ಥಾಪಿಸಿ</string>\n    <string name=\"no_player_found\">ಯಾವುದೇ ಸ್ಟ್ರೀಮ್ ಪ್ಲೇಯರ್ ಕಂಡುಬಂದಿಲ್ಲ. VLC ಸ್ಥಾಪಿಸುವುದೇ?</string>\n    <string name=\"share\">ಶೇರ್ ಮಾಡಿ</string>\n    <string name=\"download_path_title\">ವೀಡಿಯೊ ಡೌನ್‌ಲೋಡ್ ಫೋಲ್ಡರ್</string>\n    <string name=\"tab_choose\">ಟ್ಯಾಬ್ ಆಯ್ಕೆಮಾಡಿ</string>\n    <string name=\"controls_background_title\">ಹಿನ್ನೆಲೆ</string>\n    <string name=\"unsubscribe\">ಅನ್‌ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಿ</string>\n    <string name=\"yes\">ಹೌದು</string>\n    <string name=\"no\">ಇಲ್ಲ</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ko/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">%1$s에 업로드됨</string>\n    <string name=\"no_player_found\">스트림 플레이어가 발견되지 않았습니다. VLC를 설치할까요\\?</string>\n    <string name=\"install\">설치</string>\n    <string name=\"cancel\">취소</string>\n    <string name=\"open_in_browser\">브라우저로 열기</string>\n    <string name=\"share\">공유</string>\n    <string name=\"download\">다운로드</string>\n    <string name=\"search\">검색</string>\n    <string name=\"settings\">설정</string>\n    <string name=\"did_you_mean\">\\\"%1$s\\\"를 찾으셨나요\\?</string>\n    <string name=\"share_dialog_title\">다음으로 공유</string>\n    <string name=\"download_path_title\">비디오 다운로드 폴더</string>\n    <string name=\"download_path_summary\">다운로드된 비디오 파일이 이 곳에 저장됩니다</string>\n    <string name=\"download_path_dialog_title\">비디오 파일이 다운로드 될 폴더를 선택하세요</string>\n    <string name=\"default_resolution_title\">기본 해상도</string>\n    <string name=\"play_with_kodi_title\">Kodi로 재생</string>\n    <string name=\"kore_not_found\">누락된 Kore 앱을 설치하겠습니까\\?</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi로 재생\\\" 옵션 표시</string>\n    <string name=\"show_play_with_kodi_summary\">비디오를 Kodi 미디어 센터를 사용해 재생하는 옵션을 표시합니다</string>\n    <string name=\"play_audio\">오디오</string>\n    <string name=\"default_audio_format_title\">기본 오디오 형식</string>\n    <string name=\"download_dialog_title\">다운로드</string>\n    <string name=\"show_next_and_similar_title\">다음/유사한 비디오 표시</string>\n    <string name=\"unsupported_url\">지원하지 않는 URL입니다</string>\n    <string name=\"content_language_title\">기본 콘텐츠 언어</string>\n    <string name=\"settings_category_video_audio_title\">비디오 및 오디오</string>\n    <string name=\"detail_thumbnail_view_description\">비디오 재생, 구간:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">업로더 썸네일</string>\n    <string name=\"detail_dislikes_img_view_description\">싫어요</string>\n    <string name=\"detail_likes_img_view_description\">좋아요</string>\n    <string name=\"use_external_video_player_title\">외부 비디오 플레이어 사용</string>\n    <string name=\"use_external_audio_player_title\">외부 오디오 플레이어 사용</string>\n    <string name=\"download_path_audio_title\">오디오 다운로드 폴더</string>\n    <string name=\"download_path_audio_summary\">다운로드된 오디오 파일이 이 곳에 저장됩니다</string>\n    <string name=\"download_path_audio_dialog_title\">오디오 파일이 다운로드 될 폴더를 선택하세요</string>\n    <string name=\"theme_title\">테마</string>\n    <string name=\"dark_theme_title\">다크 테마</string>\n    <string name=\"light_theme_title\">라이트 테마</string>\n    <string name=\"settings_category_appearance_title\">외관</string>\n    <string name=\"background_player_playing_toast\">백그라운드에서 재생 중</string>\n    <string name=\"network_error\">네트워크 오류</string>\n    <string name=\"main_bg_subtitle\">돋보기를 탭하여 시작합니다.</string>\n    <string name=\"content\">콘텐츠</string>\n    <string name=\"show_age_restricted_content_title\">연령 제한 콘텐츠 보여주기</string>\n    <string name=\"duration_live\">라이브</string>\n    <string name=\"general_error\">오류</string>\n    <string name=\"could_not_load_thumbnails\">모든 썸네일을 불러올 수 없습니다</string>\n    <string name=\"parsing_error\">웹사이트를 가져올 수 없습니다</string>\n    <string name=\"content_not_available\">콘텐츠를 사용할 수 없습니다</string>\n    <string name=\"could_not_setup_download_menu\">다운로드 메뉴를 설정할 수 없습니다</string>\n    <string name=\"sorry_string\">죄송합니다. 오류가 발생했습니다.</string>\n    <string name=\"error_report_button_text\">이메일을 통해 보고</string>\n    <string name=\"error_snackbar_message\">죄송합니다. 문제가 발생했습니다.</string>\n    <string name=\"error_snackbar_action\">보고</string>\n    <string name=\"what_device_headline\">정보:</string>\n    <string name=\"what_happened_headline\">다음이 발생함:</string>\n    <string name=\"your_comment\">내용 (영어로 작성):</string>\n    <string name=\"error_details_headline\">자세한 사항:</string>\n    <string name=\"video\">비디오</string>\n    <string name=\"audio\">오디오</string>\n    <string name=\"retry\">재시도</string>\n    <string name=\"downloads\">다운로드</string>\n    <string name=\"downloads_title\">다운로드</string>\n    <string name=\"start\">시작</string>\n    <string name=\"pause\">일시정지</string>\n    <string name=\"delete\">삭제</string>\n    <string name=\"checksum\">체크섬</string>\n    <string name=\"open_in_popup_mode\">팝업 모드로 열기</string>\n    <string name=\"use_external_video_player_summary\">일부 해상도에서 소리가 나지 않을 수 있습니다</string>\n    <string name=\"subscribe_button_title\">구독</string>\n    <string name=\"subscribed_button_title\">구독중</string>\n    <string name=\"channel_unsubscribed\">구독 취소됨</string>\n    <string name=\"subscription_change_failed\">구독을 변경할 수 없음</string>\n    <string name=\"subscription_update_failed\">구독을 업데이트할 수 없음</string>\n    <string name=\"tab_subscriptions\">구독목록</string>\n    <string name=\"fragment_feed_title\">새로운 영상</string>\n    <string name=\"controls_background_title\">백그라운드</string>\n    <string name=\"controls_popup_title\">팝업</string>\n    <string name=\"default_popup_resolution_title\">기본 팝업 해상도</string>\n    <string name=\"show_higher_resolutions_title\">높은 해상도 표시</string>\n    <string name=\"show_higher_resolutions_summary\">일부 기기에서만 2K/4K 해상도 재생이 지원됩니다</string>\n    <string name=\"default_video_format_title\">기본 비디오 형식</string>\n    <string name=\"black_theme_title\">블랙 테마</string>\n    <string name=\"popup_remember_size_pos_title\">팝업 크기 및 위치 기억</string>\n    <string name=\"popup_remember_size_pos_summary\">마지막으로 사용한 팝업 위치 및 크기를 기억합니다</string>\n    <string name=\"show_search_suggestions_title\">검색 제안</string>\n    <string name=\"show_search_suggestions_summary\">검색할 때 표시할 제안 선택</string>\n    <string name=\"enable_search_history_title\">검색 기록</string>\n    <string name=\"enable_search_history_summary\">검색 기록을 기기에 저장합니다</string>\n    <string name=\"enable_watch_history_title\">기록 보기</string>\n    <string name=\"enable_watch_history_summary\">시청했던 비디오 기록을 저장합니다</string>\n    <string name=\"resume_on_audio_focus_gain_title\">이어서 재생</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">중단 후 계속 재생(예: 전화 통화)</string>\n    <string name=\"show_hold_to_append_title\">\\\"길게 눌러 대기열에 추가하기\\\" 팁 표시</string>\n    <string name=\"show_hold_to_append_summary\">비디오 \\\"세부사항:\\\"에서 배경 또는 팝업 버튼을 누를 때 팁 표시</string>\n    <string name=\"settings_category_player_title\">플레이어</string>\n    <string name=\"settings_category_player_behavior_title\">동작</string>\n    <string name=\"settings_category_history_title\">기록 및 캐시</string>\n    <string name=\"popup_playing_toast\">팝업 모드에서 재생 중</string>\n    <string name=\"error_report_title\">오류 보고</string>\n    <string name=\"all\">전부</string>\n    <string name=\"disabled\">해제됨</string>\n    <string name=\"clear\">지우기</string>\n    <string name=\"best_resolution\">최대 해상도</string>\n    <string name=\"undo\">되돌리기</string>\n    <string name=\"play_all\">전부 재생</string>\n    <string name=\"notification_channel_name\">NewPipe 알림</string>\n    <string name=\"notification_channel_description\">NewPipe 플레이어 알림</string>\n    <string name=\"unknown_content\">[알 수 없음]</string>\n    <string name=\"app_ui_crash\">앱/UI 충돌</string>\n    <string name=\"player_stream_failure\">이 스트림을 재생할 수 없습니다</string>\n    <string name=\"player_unrecoverable_failure\">복구할 수 없는 플레이어 오류가 발생했습니다</string>\n    <string name=\"player_recoverable_failure\">플레이어 오류로부터 복구 중</string>\n    <string name=\"info_labels\">무엇:\\n요청:\\n콘텐츠 언어:\\n콘텐츠 국가:\\n앱 언어:\\n서비스:\\nGMT 시간:\\n패키지:\\n버전:\\nOS 버전:</string>\n    <string name=\"search_no_results\">결과 없음</string>\n    <string name=\"empty_list_subtitle\">구독할 항목을 추가하세요</string>\n    <string name=\"no_subscribers\">구독자 없음</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"other\">구독자 %s명</item>\n    </plurals>\n    <string name=\"no_views\">조회수 없음</string>\n    <plurals name=\"views\">\n        <item quantity=\"other\">조회수 %s회</item>\n    </plurals>\n    <string name=\"no_videos\">비디오 없음</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">파일명</string>\n    <string name=\"msg_threads\">스레드</string>\n    <string name=\"msg_error\">오류</string>\n    <string name=\"msg_running\">NewPipe 다운로드 중</string>\n    <string name=\"msg_running_detail\">터치해서 상세 정보 확인</string>\n    <string name=\"msg_wait\">잠시만 기다리세요…</string>\n    <string name=\"msg_copied\">클립보드에 복사됨</string>\n    <string name=\"no_available_dir\">다운로드 할 폴더를 설정에서 지정하세요</string>\n    <string name=\"msg_popup_permission\">이 권한은 팝업 모드에서\n\\n열기 위해 필요합니다</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA 확인 요청됨</string>\n    <string name=\"settings_category_downloads_title\">다운로드</string>\n    <string name=\"settings_file_charset_title\">파일명에 허용되는 문자</string>\n    <string name=\"settings_file_replacement_character_summary\">올바르지 않은 문자는 다음 문자로 대체됩니다</string>\n    <string name=\"settings_file_replacement_character_title\">대체 문자</string>\n    <string name=\"charset_letters_and_digits\">문자 및 숫자</string>\n    <string name=\"charset_most_special_characters\">가장 특수한 문자</string>\n    <string name=\"title_activity_about\">NewPipe에 대해서</string>\n    <string name=\"title_licenses\">제3자 라이센스</string>\n    <string name=\"copyright\" formatted=\"true\">© %3$s 하에서 %2$s 에 의한 %1$s</string>\n    <string name=\"tab_about\">정보 및 자주 묻는 질문</string>\n    <string name=\"tab_licenses\">라이센스</string>\n    <string name=\"app_description\">가볍고 빠른 자유 안드로이드 스트리밍 앱입니다.</string>\n    <string name=\"contribution_title\">기여</string>\n    <string name=\"contribution_encouragement\">번역, 디자인, 코딩 등 다양한 기여를 언제나 환영합니다. 더 나아지도록 도와주세요!</string>\n    <string name=\"view_on_github\">GitHub에서 보기</string>\n    <string name=\"donation_title\">기부</string>\n    <string name=\"donation_encouragement\">여러분들의 더 나은 경험을 위해 많은 사람들이 NewPipe를 개발하는데 노력을 기울이고 있습니다. NewPipe에 참여하는 개발자들이 커피 한 잔을 즐길 수 있도록 기부해주세요.</string>\n    <string name=\"give_back\">보답하기</string>\n    <string name=\"website_title\">웹사이트</string>\n    <string name=\"website_encouragement\">NewPipe에 관한 더 많은 정보를 얻으려면 웹사이트를 방문하세요.</string>\n    <string name=\"app_license_title\">NewPipe가 채택한 라이센스</string>\n    <string name=\"read_full_license\">라이센스 읽기</string>\n    <string name=\"title_activity_history\">기록</string>\n    <string name=\"action_history\">기록</string>\n    <string name=\"delete_item_search_history\">이 항목을 검색 기록에서 삭제할까요?</string>\n    <string name=\"main_page_content\">메인 화면의 내용</string>\n    <string name=\"blank_page_summary\">빈 페이지</string>\n    <string name=\"kiosk_page_summary\">키오스크 페이지</string>\n    <string name=\"channel_page_summary\">채널 페이지</string>\n    <string name=\"select_a_channel\">채널 선택</string>\n    <string name=\"no_channel_subscribed_yet\">구독중인 채널이 없습니다</string>\n    <string name=\"select_a_kiosk\">키오스크 선택</string>\n    <string name=\"trending\">인기 급상승</string>\n    <string name=\"top_50\">탑 50</string>\n    <string name=\"new_and_hot\">신작 및 인기 동영상</string>\n    <string name=\"play_queue_remove\">제거</string>\n    <string name=\"play_queue_stream_detail\">상세 정보</string>\n    <string name=\"play_queue_audio_settings\">오디오 설정</string>\n    <string name=\"hold_to_append\">눌러서 대기열에 추가</string>\n    <string name=\"start_here_on_background\">백그라운드에서 재생</string>\n    <string name=\"start_here_on_popup\">팝업으로 재생</string>\n    <string name=\"no_player_found_toast\">스트림 플레이어를 찾을 수 없습니다 (VLC를 설치하여 동영상을 재생할 수 있습니다).</string>\n    <string name=\"controls_download_desc\">스트림 파일 다운로드하기</string>\n    <string name=\"show_info\">정보 보기</string>\n    <string name=\"tab_bookmarks\">재생목록 북마크</string>\n    <string name=\"controls_add_to_playlist_title\">이곳에 추가</string>\n    <string name=\"use_inexact_seek_title\">정확하지 않은 빠른 탐색 사용</string>\n    <string name=\"use_inexact_seek_summary\">정확하지 않은 탐색을 사용하면 정확도가 떨어지는 대신 더 빠르게 위치를 탐색할 수 있습니다. 5초, 15초 또는 25초 탐색 기능은 이 기능과 같이 동작하지 않습니다</string>\n    <string name=\"auto_queue_title\">다음 스트림을 자동으로 대기열에 추가</string>\n    <string name=\"auto_queue_summary\">관련 스트림을 추가하여 (반복되지 않는) 재생 대기열을 계속 종료</string>\n    <string name=\"default_content_country_title\">기본 콘텐츠 국가</string>\n    <string name=\"settings_category_debug_title\">디버그</string>\n    <string name=\"always\">항상</string>\n    <string name=\"just_once\">한번만</string>\n    <string name=\"switch_to_background\">백그라운드로 전환</string>\n    <string name=\"switch_to_popup\">팝업으로 전환</string>\n    <string name=\"switch_to_main\">기본으로 전환</string>\n    <string name=\"import_data_title\">데이터베이스 가져오기</string>\n    <string name=\"export_data_title\">데이터베이스 내보내기</string>\n    <string name=\"import_data_summary\">현재 시청 기록, 구독, 재생 목록, (선택 사항) 설정 재정의</string>\n    <string name=\"export_data_summary\">시청 기록과 구독 목록, 재생 목록, 설정을 내보냅니다</string>\n    <string name=\"external_player_unsupported_link_type\">외부 플레이어는 이러한 종류의 링크를 지원하지 않습니다</string>\n    <string name=\"video_streams_empty\">발견된 비디오 스트림 없음</string>\n    <string name=\"audio_streams_empty\">발견된 오디오 스트림 없음</string>\n    <string name=\"detail_drag_description\">드래그하여 재배열</string>\n    <string name=\"create\">만들기</string>\n    <string name=\"dismiss\">취소</string>\n    <string name=\"rename\">이름 바꾸기</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA 확인</string>\n    <string name=\"title_last_played\">마지막으로 재생</string>\n    <string name=\"title_most_played\">가장 많이 재생</string>\n    <string name=\"export_complete_toast\">내보내기 완료</string>\n    <string name=\"import_complete_toast\">가져오기 완료</string>\n    <string name=\"no_valid_zip_file\">유효한 ZIP 파일 없음</string>\n    <string name=\"could_not_import_all_files\">경고: 파일을 전부 가져오지 못했습니다.</string>\n    <string name=\"override_current_data\">이것은 현재 설정을 덮어쓸 것입니다.</string>\n    <string name=\"drawer_open\">드로어 열기</string>\n    <string name=\"drawer_close\">드로어 닫기</string>\n    <string name=\"video_player\">비디오 플레이어</string>\n    <string name=\"background_player\">백그라운드 플레이어</string>\n    <string name=\"popup_player\">팝업 플레이어</string>\n    <string name=\"always_ask_open_action\">항상 묻기</string>\n    <string name=\"preferred_player_fetcher_notification_title\">정보 가져오는 중…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">요청한 콘텐츠를 로드 중입니다</string>\n    <string name=\"create_playlist\">새로운 재생목록</string>\n    <string name=\"rename_playlist\">이름 바꾸기</string>\n    <string name=\"name\">이름</string>\n    <string name=\"add_to_playlist\">재생목록에 추가</string>\n    <string name=\"set_as_playlist_thumbnail\">재생목록 썸네일로 설정</string>\n    <string name=\"bookmark_playlist\">재생목록 북마크하기</string>\n    <string name=\"unbookmark_playlist\">북마크 제거하기</string>\n    <string name=\"delete_playlist_prompt\">이 재생목록을 삭제하시겠습니까?</string>\n    <string name=\"playlist_creation_success\">재생목록 생성 완료</string>\n    <string name=\"playlist_add_stream_success\">재생목록에 추가됨</string>\n    <string name=\"playlist_thumbnail_change_success\">재생목록 썸네일 변경 완료.</string>\n    <string name=\"caption_none\">자막 없음</string>\n    <string name=\"resize_fit\">꼭 맞게 하기</string>\n    <string name=\"resize_fill\">채우기</string>\n    <string name=\"resize_zoom\">확대</string>\n    <string name=\"caption_auto_generated\">자동 생성됨</string>\n    <string name=\"enable_leak_canary_summary\">메모리 누수 감시를 사용할 시 힙 덤프로 인해 앱이 반응하지 않을 수 있습니다</string>\n    <string name=\"enable_disposed_exceptions_title\">out-of-lifecycle 오류 보고</string>\n    <string name=\"enable_disposed_exceptions_summary\">프래그먼트 또는 버려진 액티비티 주기 밖에서 일어나는 전달할 수 없는 Rx 예외를 강제적으로 보고하기</string>\n    <string name=\"file\">파일</string>\n    <string name=\"invalid_directory\">폴더가 존재하지 않습니다</string>\n    <string name=\"invalid_source\">잘못된 파일/콘텐츠 소스</string>\n    <string name=\"invalid_file\">파일이 존재하지 않거나 읽기/쓰기 권한이 없습니다</string>\n    <string name=\"file_name_empty_error\">파일명이 비어 있으면 안됩니다</string>\n    <string name=\"error_occurred_detail\">오류 발생: %1$s</string>\n    <string name=\"import_title\">가져오기</string>\n    <string name=\"import_from\">이곳으로부터 가져오기</string>\n    <string name=\"export_to\">이곳으로 내보내기</string>\n    <string name=\"import_ongoing\">가져오는 중.…</string>\n    <string name=\"export_ongoing\">내보내는 중…</string>\n    <string name=\"import_file_title\">파일 가져오기</string>\n    <string name=\"previous_export\">이전 내보내기</string>\n    <string name=\"subscriptions_import_unsuccessful\">구독 목록 가져오기 실패</string>\n    <string name=\"subscriptions_export_unsuccessful\">구독 목록 내보내기 실패</string>\n    <string name=\"import_youtube_instructions\">Google 테이크아웃에서 YouTube 구독목록 가져오기:\n\\n\n\\n1. 이 URL로 이동합니다: %1$s\n\\n2. 요청에 따라 로그인 합니다\n\\n3. \\\"모든 데이터 포함됨\\\"을 클릭한 뒤, \\\"모두 선택 해제\\\"를 클릭한 후 \\\"구독정보\\\"만 선택하고 \\\"확인\\\"을 클릭합니다\n\\n4. \\\"다음 단계\\\"를 클릭한 다음 \\\"내보내기 생성\\\"을 클릭합니다\n\\n5. \\\"다운로드\\\" 버튼이 나타나면 클릭합니다\n\\n6. 아래의 \\\"파일 가져오기\\\"를 클릭하고 다운로드한 .zip 파일을 선택합니다\n\\n7. [.zip 파일 가져오기를 실패한 경우] .csv 파일(일반적으로 \\\"YouTube 및 YouTube Music/구독정보/구독정보.csv\\\")을 압축해제한 다음, 아래의 \\\"파일 가져오기\\\"를 클릭한 후 압축해제한 csv 파일을 선택합니다</string>\n    <string name=\"import_soundcloud_instructions\">URL 또는 ID를 입력하여 SoundCloud 프로필을 가져옵니다:\n\\n \n\\n1. 웹 브라우저에서 \\\"데스크톱 모드\\\"를 활성화합니다(모바일 장치에서는 사이트를 사용할 수 없습니다)\n\\n2. 다음 URL로 이동: %1$s\n\\n3. 요청 시 로그인\n\\n4. 리디렉션된 프로필 URL을 복사합니다.</string>\n    <string name=\"import_soundcloud_instructions_hint\">프로필ID, soundcloud.com/프로필ID</string>\n    <string name=\"import_network_expensive_warning\">경고: 데이터가 많이 소모될 수 있습니다. \n\\n \n\\n계속하시겠습니까\\?</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">이미지 캐시 지워짐</string>\n    <string name=\"metadata_cache_wipe_title\">캐시된 메타데이터 지우기</string>\n    <string name=\"metadata_cache_wipe_summary\">캐시된 모든 웹페이지 데이터 지우기</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">메타데이터 캐시 지워짐</string>\n    <string name=\"playback_speed_control\">재생 속도 조절</string>\n    <string name=\"playback_tempo\">템포</string>\n    <string name=\"playback_pitch\">피치</string>\n    <string name=\"unhook_checkbox\">영상과 소리 분리 (왜곡이 발생할 수 있음)</string>\n    <string name=\"no_streams_available_download\">다운로드 가능한 스트림이 없습니다</string>\n    <string name=\"preferred_open_action_settings_title\">선호하는 열기 동작</string>\n    <string name=\"preferred_open_action_settings_summary\">콘텐츠를 열 때 사용할 기본 동작 — %s</string>\n    <string name=\"caption_setting_title\">자막</string>\n    <string name=\"caption_setting_description\">플레이어 자막 글자 크기와 배경 스타일을 수정합니다. 적용하려면 앱을 다시 시작해야 합니다</string>\n    <string name=\"channels\">채널</string>\n    <string name=\"playlists\">재생목록</string>\n    <string name=\"clear_views_history_title\">시청 기록 삭제하기</string>\n    <string name=\"clear_views_history_summary\">동영상 시청 기록과 저장된 재생 위치를 삭제합니다</string>\n    <string name=\"delete_view_history_alert\">모든 시청 기록을 삭제하시겠습니까\\?</string>\n    <string name=\"watch_history_deleted\">동영상 시청 기록이 삭제되었습니다</string>\n    <string name=\"clear_search_history_title\">검색 기록 삭제</string>\n    <string name=\"clear_search_history_summary\">검색 기록을 모두 삭제합니다</string>\n    <string name=\"delete_search_history_alert\">모든 검색 기록을 삭제하시겠습니까\\?</string>\n    <string name=\"search_history_deleted\">검색 기록이 삭제되었습니다</string>\n    <string name=\"privacy_policy_title\">NewPipe 개인정보 보호 정책</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe 프로젝트는 사용자의 개인 정보 보호를 최우선으로 생각하며, 동의 없이 어떠한 정보도 수집하지 않습니다. \n\\nNewPipe 개인정보 보호 정책에서는 오류 보고 시 어떠한 정보가 수집되고 저장되는지 자세히 명시되어 있습니다.</string>\n    <string name=\"read_privacy_policy\">개인정보 보호 정책 읽기</string>\n    <string name=\"app_license\">NewPipe는 카피레프트 자유 소프트웨어입니다: 마음대로 사용하고, 연구하고, 공유하고, 개선할 수 있습니다. 특히 자유 소프트웨어 재단에서 발행한 GNU 일반 공중 사용 라이센스의 조건에 따라 라이센스 버전 3 또는 (귀하의 선택에 따라) 이후 버전을 재배포 및/또는 수정할 수 있습니다.</string>\n    <string name=\"import_settings\">설정도 가져오시겠습니까\\?</string>\n    <string name=\"skip_silence_checkbox\">무음 구간 빨리 감기</string>\n    <string name=\"start_accept_privacy_policy\">유럽 연합 일반 데이터 보호 규정(GDPR)을 준수하기 위해 NewPipe의 개인 정보 보호 정책에 주의를 기울입니다. 주의 깊게 읽으십시오.\n\\n버그 보고서를 보내려면 수락해야 합니다.</string>\n    <string name=\"accept\">동의</string>\n    <string name=\"decline\">동의하지 않음</string>\n    <string name=\"limit_data_usage_none_description\">데이터 제한 없음</string>\n    <string name=\"limit_mobile_data_usage_title\">모바일 데이터 사용 시 화질 제한</string>\n    <string name=\"unsubscribe\">구독 취소</string>\n    <string name=\"tab_choose\">탭 선택</string>\n    <string name=\"settings_category_updates_title\">업데이트</string>\n    <string name=\"tracks\">트랙</string>\n    <string name=\"users\">사용자</string>\n    <string name=\"events\">이벤트</string>\n    <string name=\"file_deleted\">파일 삭제됨</string>\n    <string name=\"app_update_notification_channel_name\">앱 업데이트 알림</string>\n    <string name=\"app_update_notification_channel_description\">새 NewPipe 버전 알림</string>\n    <string name=\"download_to_sdcard_error_title\">외부 저장소 없음</string>\n    <string name=\"download_to_sdcard_error_message\">SD 카드로 다운로드 할 수 없습니다. 다운로드 폴더 경로를 초기화 하시겠습니까\\?</string>\n    <string name=\"one_item_deleted\">1개의 항목이 삭제되었습니다.</string>\n    <string name=\"minimize_on_exit_title\">앱 전환시 최소화</string>\n    <string name=\"minimize_on_exit_summary\">비디오 플레이어에서 다른 앱으로 전환 시 다음과 같은 동작 실행 — %s</string>\n    <string name=\"minimize_on_exit_none_description\">없음</string>\n    <string name=\"minimize_on_exit_background_description\">백그라운드 플레이어로 최소화</string>\n    <string name=\"minimize_on_exit_popup_description\">팝업 플레이어로 최소화</string>\n    <string name=\"playback_step\">단계</string>\n    <string name=\"playback_reset\">초기화</string>\n    <string name=\"saved_tabs_invalid_json\">저장된 탭을 불러올 수 없었으므로, 기본 탭을 사용합니다</string>\n    <string name=\"restore_defaults\">기본설정으로 되돌리기</string>\n    <string name=\"restore_defaults_confirmation\">초기 설정으로 복원하시겠습니까\\?</string>\n    <string name=\"subscribers_count_not_available\">구독자 수를 가져올 수 없습니다</string>\n    <string name=\"main_page_content_summary\">메인 화면에 표시할 탭을 설정합니다</string>\n    <string name=\"updates_setting_title\">업데이트</string>\n    <string name=\"updates_setting_description\">새 버전이 있을 경우 앱을 업데이트하도록 알림 표시</string>\n    <string name=\"list_view_mode\">\\'목록으로 보기\\' 모드</string>\n    <string name=\"list\">목록</string>\n    <string name=\"grid\">격자</string>\n    <string name=\"auto\">자동</string>\n    <string name=\"app_update_available_notification_title\">NewPipe 업데이트를 사용할 수 있습니다!</string>\n    <string name=\"missions_header_finished\">완료됨</string>\n    <string name=\"missions_header_pending\">대기열에 있음</string>\n    <string name=\"paused\">일시중지됨</string>\n    <string name=\"queued\">대기열에 추가됨</string>\n    <string name=\"post_processing\">후처리 실행 중</string>\n    <string name=\"enqueue\">대기열</string>\n    <string name=\"permission_denied\">시스템에 의해 실행이 거부되었습니다</string>\n    <string name=\"download_failed\">다운로드 실패</string>\n    <string name=\"generate_unique_name\">별개의 이름 생성</string>\n    <string name=\"overwrite\">덮어쓰기</string>\n    <string name=\"overwrite_unrelated_warning\">이 이름을 가진 파일이 이미 있습니다</string>\n    <string name=\"overwrite_finished_warning\">이 이름을 가진 다운로드 된 파일이 이미 있습니다</string>\n    <string name=\"download_already_running\">해당 이름을 가진 다운로드가 이미 진행중입니다</string>\n    <string name=\"show_error\">오류 표시</string>\n    <string name=\"error_path_creation\">대상 폴더를 만들 수 없습니다</string>\n    <string name=\"error_file_creation\">파일을 생성할 수 없습니다</string>\n    <string name=\"error_ssl_exception\">보안 연결을 설정할 수 없음</string>\n    <string name=\"error_unknown_host\">서버를 찾을 수 없습니다</string>\n    <string name=\"error_connect_host\">서버에 연결할 수 없습니다</string>\n    <string name=\"error_http_no_content\">서버가 데이터를 전송하지 않고 있습니다</string>\n    <string name=\"error_http_unsupported_range\">서버가 다중 스레드 다운로드를 받아들이지 않습니다, @string/msg_threads = 1 를 사용해 다시 시도해보세요</string>\n    <string name=\"error_http_not_found\">찾을 수 없음</string>\n    <string name=\"error_postprocessing_failed\">후처리 작업이 실패하였습니다</string>\n    <string name=\"stop\">멈추기</string>\n    <string name=\"max_retry_msg\">최대 재시도 횟수</string>\n    <string name=\"max_retry_desc\">다운로드를 취소하기 전까지 다시 시도할 최대 횟수</string>\n    <string name=\"pause_downloads_on_mobile\">종량제 네트워크에서 일시정지</string>\n    <string name=\"pause_downloads_on_mobile_desc\">모바일 데이터로 전환될 때, 일부 다운로드는 정지되지 않습니다</string>\n    <string name=\"conferences\">컨퍼런스</string>\n    <string name=\"show_comments_title\">댓글 보기</string>\n    <string name=\"show_comments_summary\">댓글 숨기기</string>\n    <string name=\"autoplay_title\">자동 재생</string>\n    <string name=\"no_comments\">댓글 없음</string>\n    <string name=\"error_unable_to_load_comments\">댓글을 불러올 수 없음</string>\n    <string name=\"close\">닫기</string>\n    <string name=\"enable_playback_resume_title\">재생 위치 기억</string>\n    <string name=\"enable_playback_resume_summary\">마지막 재생 위치부터 재생</string>\n    <string name=\"enable_playback_state_lists_title\">리스트 내 위치 표시</string>\n    <string name=\"enable_playback_state_lists_summary\">리스트에서 재생 위치를 표시합니다</string>\n    <string name=\"settings_category_clear_data_title\">데이터 삭제</string>\n    <string name=\"watch_history_states_deleted\">재생위치 삭제완료</string>\n    <string name=\"missing_file\">파일이 이동되거나 삭제되었습니다</string>\n    <string name=\"overwrite_failed\">파일을 덮어쓰기할 수 없습니다</string>\n    <string name=\"download_already_pending\">해당 이름으로 대기된 다운로드가 있습니다</string>\n    <string name=\"error_postprocessing_stopped\">파일 작업 중에 Newpipe가 종료되었습니다</string>\n    <string name=\"error_insufficient_storage_left\">남은 저장공간이 없습니다</string>\n    <string name=\"error_progress_lost\">파일이 삭제되어 진행이 중지되었습니다</string>\n    <string name=\"error_timeout\">연결시간 초과</string>\n    <string name=\"confirm_prompt\">모든 다운로드 기록과 파일을 삭제합니다.확실합니까\\?</string>\n    <string name=\"enable_queue_limit\">다운로드 대기 제한</string>\n    <string name=\"start_downloads\">다운로드 시작</string>\n    <string name=\"pause_downloads\">다운로드 일시정지</string>\n    <string name=\"downloads_storage_ask_title\">다운로드 위치를 묻기</string>\n    <string name=\"downloads_storage_ask_summary\">각 다운로드를 저장할 위치를 묻는 메시지가 표시됩니다.\n\\n외부 SD 카드에 다운로드하려면 시스템 폴더 선택기(SAF) 활성화</string>\n    <string name=\"downloads_storage_use_saf_title\">시스템 폴더 선택기(SAF) 사용</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'저장영역 접속 프레임워크\\'를 통해 외부 SD 카드로 다운로드 가능</string>\n    <string name=\"clear_playback_states_title\">재생 위치 삭제</string>\n    <string name=\"clear_playback_states_summary\">모든 재생 위치를 삭제</string>\n    <string name=\"delete_playback_states_alert\">모든 재생 위치를 삭제하시겠습니까\\?</string>\n    <plurals name=\"videos\">\n        <item quantity=\"other\">%s 동영상</item>\n    </plurals>\n    <string name=\"enable_queue_limit_desc\">한 번에 하나씩 다운로드 합니다</string>\n    <string name=\"drawer_header_description\">서비스 토글, 현재 선택된 서비스:</string>\n    <string name=\"default_kiosk_page_summary\">기본 키오스크</string>\n    <string name=\"no_one_watching\">시청자 없음</string>\n    <plurals name=\"watching\">\n        <item quantity=\"other\">%s명 시청중</item>\n    </plurals>\n    <string name=\"no_one_listening\">청취자 없음</string>\n    <plurals name=\"listening\">\n        <item quantity=\"other\">%s명 청취중</item>\n    </plurals>\n    <string name=\"seek_duration_title\">빠른-감기/되감기 찾는 시간</string>\n    <string name=\"peertube_instance_url_title\">피어튜브 인스턴스</string>\n    <string name=\"peertube_instance_url_summary\">선호하는 PeerTube 인스턴스 선택</string>\n    <string name=\"peertube_instance_url_help\">%s에서 원하는 인스턴스 찾기</string>\n    <string name=\"peertube_instance_add_title\">인스턴스 추가하기</string>\n    <string name=\"peertube_instance_add_help\">인스턴스 URL 입력</string>\n    <string name=\"peertube_instance_add_fail\">인스턴스를 확인할 수 없음</string>\n    <string name=\"peertube_instance_add_https_only\">HTTPS URL만 지원</string>\n    <string name=\"peertube_instance_add_exists\">인스턴스가 이미 존재</string>\n    <string name=\"local\">로컬</string>\n    <string name=\"recently_added\">최근에 추가됨</string>\n    <string name=\"most_liked\">가장 선호하는</string>\n    <string name=\"playlist_no_uploader\">자동생성된(업로더를 찾지못함)</string>\n    <string name=\"recovering\">복구하기</string>\n    <string name=\"error_download_resource_gone\">이 다운로드를 복구할 수 없습니다</string>\n    <string name=\"choose_instance_prompt\">인스턴스를 선택하세요</string>\n    <string name=\"clear_download_history\">다운로드 기록 삭제</string>\n    <string name=\"delete_downloaded_files\">다운로드된 파일 삭제</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"other\">%d 선택</item>\n    </plurals>\n    <string name=\"feed_group_dialog_delete_message\">이 그룹을 삭제하시겠어요\\?</string>\n    <string name=\"feed_create_new_group_button_title\">새로운</string>\n    <string name=\"settings_category_feed_title\">피드</string>\n    <string name=\"feed_processing_message\">피드를 프로세싱합니다…</string>\n    <string name=\"feed_notification_loading\">피드를 로딩하고 있습니다…</string>\n    <string name=\"feed_subscription_not_loaded_count\">로드 실패: %d</string>\n    <string name=\"feed_oldest_subscription_update\">마지막으로 업데이트 된 피드; %s</string>\n    <string name=\"feed_groups_header_title\">채널 그룹</string>\n    <string name=\"unmute\">무음해제</string>\n    <string name=\"mute\">무음</string>\n    <string name=\"no_playlist_bookmarked_yet\">아직 재생목록 책갈피가 없습니다</string>\n    <string name=\"select_a_playlist\">재생목록 선택</string>\n    <string name=\"subtitle_activity_recaptcha\">해결 되었다면 “완료”를 누르세요</string>\n    <string name=\"infinite_videos\">∞ 비디오</string>\n    <string name=\"more_than_100_videos\">100+ 비디오</string>\n    <string name=\"songs\">노래</string>\n    <string name=\"restricted_video\">이 비디오는 연령제한이 있습니다.\n\\n\n\\n만약, 시청을 원한다면 설정에 \\\"%1$s\\\"를 활성화 하세요.</string>\n    <string name=\"done\">완료</string>\n    <string name=\"artists\">아티스트</string>\n    <string name=\"albums\">앨범</string>\n    <string name=\"videos_string\">비디오</string>\n    <string name=\"notification_action_0_title\">첫번째 버튼</string>\n    <string name=\"notification_scale_to_square_image_summary\">알림에 표시된 비디오 썸네일을 16:9에서 1:1 화면비로 자릅니다</string>\n    <string name=\"notification_scale_to_square_image_title\">1:1 화면비로 썸네일 자르기</string>\n    <string name=\"search_showing_result_for\">검색된 개수: %s</string>\n    <string name=\"notification_action_shuffle\">셔플</string>\n    <string name=\"notification_action_repeat\">연속 재생</string>\n    <string name=\"playlist_page_summary\">재생목록 페이지</string>\n    <string name=\"show_thumbnail_title\">썸네일 보기</string>\n    <string name=\"feed_group_dialog_empty_name\">그룹 이름이 없음</string>\n    <plurals name=\"days\">\n        <item quantity=\"other\">%d일</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"other\">%d시간</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"other\">%d분</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"other\">%d초</item>\n    </plurals>\n    <string name=\"remove_watched_popup_title\">시청 기록을 지우겠습니까?</string>\n    <string name=\"remove_watched\">시청 기록 지우기</string>\n    <string name=\"title_activity_play_queue\">재생목록 실행</string>\n    <string name=\"unsupported_url_dialog_message\">URL을 인식할 수 없습니다. 다른 앱으로 여시겠습니까\\?</string>\n    <string name=\"clear_queue_confirmation_title\">대기열을 지우기 전에 확인 요청</string>\n    <string name=\"notification_colorize_summary\">안드로이드에서 썸네일 이미지의 기본 색상에 따라 알림 색상을 사용자 지정 (일부 기기에서는 사용할 수 없음)</string>\n    <string name=\"notification_action_buffering\">버퍼링</string>\n    <string name=\"notification_action_4_title\">다섯번째 버튼</string>\n    <string name=\"notification_action_3_title\">네번째 버튼</string>\n    <string name=\"notification_action_2_title\">세번째 버튼</string>\n    <string name=\"notification_action_1_title\">두번째 버튼</string>\n    <string name=\"permission_display_over_apps\">다른 앱 위에 표시할 수 있는 권한 부여</string>\n    <string name=\"show_meta_info_title\">메타 정보 표시</string>\n    <string name=\"notification_colorize_title\">색상화된 알림</string>\n    <string name=\"clear_queue_confirmation_description\">활성 플레이어 대기열 교체</string>\n    <string name=\"open_with\">다음으로 열기</string>\n    <string name=\"mark_as_watched\">시청한 것으로 처리</string>\n    <string name=\"show_description_summary\">비활성화하면 비디오 설명과 추가 정보를 표시하지 않습니다</string>\n    <string name=\"show_description_title\">설명 표시하기</string>\n    <string name=\"clear_queue_confirmation_summary\">한 플레이어에서 다른 플레이어로 전환하면 대기열이 대체될 수 있습니다</string>\n    <string name=\"night_theme_title\">어두운 테마</string>\n    <string name=\"notification_actions_at_most_three\">축소된 알림에서 최대 3개까지 표시될 항목을 고를 수 있습니다!</string>\n    <string name=\"notification_actions_summary\">아래의 각 알림 동작을 탭하여 편집합니다. 오른쪽의 체크박스를 사용하여 최대 3개까지 선택하여 압축 알림에 표시합니다.</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTube의 \\'제한 모드\\' 켜기</string>\n    <string name=\"hash_channel_description\">비디오 해싱 진행 알림</string>\n    <string name=\"streams_notification_channel_name\">새로운 스트림</string>\n    <string name=\"streams_notification_channel_description\">구독에서 새 스트림이 있을 때 알림</string>\n    <string name=\"error_report_channel_name\">오류 보고 알림</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA 쿠키를 비웠습니다</string>\n    <string name=\"settings_category_player_notification_title\">플레이어 알림</string>\n    <string name=\"notifications\">알림</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube는 잠재적으로 성인용 콘텐츠를 숨기는 \\'제한 모드\\'를 제공합니다</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA 쿠키 비우기</string>\n    <string name=\"crash_the_player\">플레이어 크래시 발생</string>\n    <string name=\"notification_action_nothing\">존재하지 않음</string>\n    <string name=\"start_main_player_fullscreen_title\">전체화면으로 주 플레이어 시작</string>\n    <string name=\"hash_channel_name\">비디오 해시 알림</string>\n    <string name=\"error_report_open_issue_button_text\">GitHub에 보고</string>\n    <string name=\"enqueued_next\">다음에 대기열에 추가됨</string>\n    <string name=\"enqueue_next_stream\">다음 대기열에 넣기</string>\n    <string name=\"settings_category_player_notification_summary\">현재 재생 중인 스트림 알림 구성</string>\n    <string name=\"show_age_restricted_content_summary\">연령 제한(예: 18세 이상)이 있어 어린이에게 적합하지 않을 수 있는 콘텐츠 표시</string>\n    <string name=\"error_report_channel_description\">오류 보고 알림</string>\n    <string name=\"error_report_notification_title\">NewPipe에 오류가 발생했습니다. 보고하려면 탭하세요</string>\n    <string name=\"error_report_notification_toast\">오류가 발생했습니다. 알림을 참조하세요</string>\n    <string name=\"copy_for_github\">서식이 지정된 보고서 복사</string>\n    <string name=\"related_items_tab_description\">관련 항목</string>\n    <string name=\"comments_are_disabled\">댓글이 비활성화되었습니다</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"other\">%s개의 새로운 스트림</item>\n    </plurals>\n    <string name=\"msg_calculating_hash\">해시 계산</string>\n    <string name=\"no_dir_yet\">다운로드 폴더가 아직 설정되지 않았습니다. 지금 기본 다운로드 폴더를 선택하세요</string>\n    <string name=\"main_page_content_swipe_remove\">항목을 스와이프하여 제거</string>\n    <string name=\"show_channel_details\">채널 세부정보 표시</string>\n    <string name=\"enqueue_stream\">대기열에 넣기</string>\n    <string name=\"enqueued\">대기열에 추가됨</string>\n    <string name=\"loading_stream_details\">스트림 세부정보 불러오는 중…</string>\n    <string name=\"disable_media_tunneling_title\">미디어 터널링 비활성화</string>\n    <string name=\"show_original_time_ago_summary\">서비스의 원본 텍스트가 스트림 항목에 표시됩니다</string>\n    <string name=\"disable_media_tunneling_summary\">동영상 재생 시 검은 화면이 나타나거나 끊김 현상이 발생하면 미디어 터널링을 비활성화하세요.</string>\n    <string name=\"show_crash_the_player_title\">\\\"플레이어 충돌\\\" 표시</string>\n    <string name=\"show_crash_the_player_summary\">플레이어를 사용할 때 충돌 옵션을 표시합니다</string>\n    <string name=\"check_new_streams\">새로운 스트림 확인 실행</string>\n    <string name=\"crash_the_app\">앱 충돌</string>\n    <string name=\"show_error_snackbar\">오류 스낵바 표시</string>\n    <string name=\"enable_streams_notifications_title\">새로운 스트림 알림</string>\n    <string name=\"enable_streams_notifications_summary\">구독에서 새로운 스트림에 대해 알림</string>\n    <string name=\"streams_notifications_interval_title\">확인 빈도</string>\n    <string name=\"streams_notifications_network_title\">필요한 네트워크 연결</string>\n    <string name=\"any_network\">모든 네트워크</string>\n    <string name=\"check_for_updates\">업데이트 확인</string>\n    <string name=\"manual_update_description\">새로운 버전을 수동으로 확인</string>\n    <string name=\"autoplay_summary\">자동으로 재생 시작 — %s</string>\n    <string name=\"wifi_only\">Wi-Fi에서만</string>\n    <string name=\"never\">사용하지 않음</string>\n    <string name=\"seekbar_preview_thumbnail_title\">탐색막대 썸네일 미리보기</string>\n    <string name=\"high_quality_larger\">고품질 (크게)</string>\n    <string name=\"low_quality_smaller\">저품질 (작게)</string>\n    <string name=\"dont_show\">표시하지 않음</string>\n    <string name=\"checking_updates_toast\">업데이트 확인 중…</string>\n    <string name=\"delete_downloaded_files_confirm\">디스크에서 다운로드한 모든 파일을 지우겠습니까\\?</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"other\">%1$s 다운로드 삭제됨</item>\n    </plurals>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">각 다운로드를 저장할 위치를 묻는 메시지가 표시됩니다</string>\n    <string name=\"no_app_to_open_intent\">장치에서 열 수 있는 앱이 없습니다</string>\n    <string name=\"description_select_disable\">설명에서 텍스트 선택 비활성화</string>\n    <string name=\"metadata_tags\">태그</string>\n    <string name=\"off\">끔</string>\n    <string name=\"on\">켬</string>\n    <string name=\"tablet_mode_title\">태블릿 모드</string>\n    <string name=\"local_search_suggestions\">지역 검색 제안</string>\n    <string name=\"remote_search_suggestions\">원격 검색 제안</string>\n    <string name=\"restricted_video_no_stream\">이 동영상은 연령 제한이 있습니다.\n\\n연령 제한 동영상에 대한 새로운 YouTube 정책으로 인해 NewPipe는 동영상 스트림에 접속할 수 없으므로 재생할 수 없습니다.</string>\n    <string name=\"clear_cookie_summary\">reCAPTCHA를 해결할 때 NewPipe가 저장하는 쿠키 지우기</string>\n    <string name=\"description_tab_description\">설명</string>\n    <string name=\"comments_tab_description\">댓글</string>\n    <string name=\"recaptcha_solve\">해결</string>\n    <string name=\"show_thumbnail_summary\">잠금 화면 배경과 알림 모두에 썸네일 사용</string>\n    <string name=\"feed_group_dialog_empty_selection\">선택한 구독이 없습니다</string>\n    <string name=\"auto_queue_toggle\">자동 대기열에 추가</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"other\">%s 다운로드 완료</item>\n    </plurals>\n    <string name=\"app_language_title\">앱 언어</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">예, 부분적으로 본 비디오</string>\n    <string name=\"metadata_category\">카테고리</string>\n    <string name=\"video_detail_by\">%s에 의해</string>\n    <string name=\"select_night_theme_toast\">아래에서 선호하는 어두운 테마를 선택할 수 있습니다</string>\n    <string name=\"youtube_music_premium_content\">이 영상은 YouTube Music Premium 회원만 볼 수 있기 때문에 NewPipe에서 스트리밍이나 다운로드가 불가능합니다.</string>\n    <string name=\"private_content\">이 콘텐츠는 비공개이므로 NewPipe에서 스트리밍하거나 다운로드할 수 없습니다.</string>\n    <string name=\"metadata_privacy_internal\">내부</string>\n    <string name=\"processing_may_take_a_moment\">처리 중... 시간이 걸릴 수 있습니다</string>\n    <string name=\"progressive_load_interval_title\">재생 로드 간격 크기</string>\n    <string name=\"new_seek_duration_toast\">ExoPlayer 제약으로 인해 탐색 시간이 %d초로 설정되었습니다</string>\n    <string name=\"percent\">퍼센트</string>\n    <string name=\"semitone\">반음</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer 기본</string>\n    <string name=\"systems_language\">시스템 기본값</string>\n    <string name=\"feed_new_items\">새로운 피드 항목</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">그룹화되지 않은 구독만 표시</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\'에 대한 피드를 불러올 수 없습니다.</string>\n    <string name=\"feed_load_error_terminated\">제작자의 계정이 해지되었습니다.\n\\nNewPipe는 앞으로 이 피드를 불러올 수 없습니다.\n\\n이 채널의 구독을 취소하겠습니까\\?</string>\n    <string name=\"feed_load_error_fast_unknown\">빠른 공급 모드는 이에 대한 자세한 정보를 제공하지 않습니다.</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">사용 가능한 경우 전용 피드에서 가져오기</string>\n    <string name=\"paid_content\">이 콘텐츠는 유료 사용자만 사용할 수 있으므로 NewPipe에서 스트리밍 또는 다운로드할 수 없습니다.</string>\n    <string name=\"metadata_support\">지원</string>\n    <string name=\"metadata_language\">언어</string>\n    <string name=\"metadata_age_limit\">연령 제한</string>\n    <string name=\"metadata_privacy\">공개상태</string>\n    <string name=\"metadata_licence\">라이센스</string>\n    <string name=\"detail_heart_img_view_description\">창작자의 마음</string>\n    <string name=\"metadata_privacy_private\">비공개</string>\n    <string name=\"metadata_privacy_unlisted\">비공개</string>\n    <string name=\"metadata_host\">호스트</string>\n    <string name=\"you_successfully_subscribed\">이제 이 채널을 구독했습니다</string>\n    <string name=\"get_notified\">알림 받기</string>\n    <string name=\"notifications_disabled\">알림이 비활성화되었습니다</string>\n    <string name=\"open_website_license\">웹사이트 열기</string>\n    <string name=\"no_audio_streams_available_for_external_players\">외부 플레이어에서 사용할 수 있는 오디오 스트림이 없음</string>\n    <string name=\"selected_stream_external_player_not_supported\">선택한 스트림은 외부 플레이어가 지원하지 않습니다</string>\n    <string name=\"streams_not_yet_supported_removed\">다운로더에서 아직 지원하지 않는 스트림은 표시되지 않습니다</string>\n    <string name=\"toggle_all\">모두 토글</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"unknown_quality\">알 수 없는 품질</string>\n    <string name=\"show_original_time_ago_title\">항목에 원래 시간 전 표시</string>\n    <string name=\"feed_load_error\">피드를 불러오는 중 오류</string>\n    <string name=\"leak_canary_not_available\">LeakCanary를 사용할 수 없습니다</string>\n    <string name=\"show_memory_leaks\">메모리 누수 표시</string>\n    <string name=\"feed_update_threshold_title\">피드 업데이트 임계값</string>\n    <string name=\"feed_update_threshold_summary\">마지막 업데이트 후 구독이 오래된 것으로 간주되기 전의 시간 — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">항상 업데이트</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">빠른 모드 비활성화</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">빠른 모드 활성화</string>\n    <string name=\"channel_created_by\">%s에 의해 제작</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">채널의 아바타 썸네일</string>\n    <string name=\"chapters\">챕터</string>\n    <string name=\"recent\">최근</string>\n    <string name=\"account_terminated\">계정이 해지됨</string>\n    <string name=\"soundcloud_go_plus_content\">이것은 적어도 귀하의 국가에서 SoundCloud Go+ 트랙이므로 NewPipe에서 스트리밍하거나 다운로드할 수 없습니다.</string>\n    <string name=\"auto_device_theme_title\">자동 (장치 테마)</string>\n    <string name=\"detail_pinned_comment_view_description\">고정된 댓글</string>\n    <string name=\"featured\">추천</string>\n    <string name=\"unknown_format\">알 수 없는 형식</string>\n    <string name=\"select_quality_external_players\">외부 플레이어의 품질 선택</string>\n    <string name=\"no_video_streams_available_for_external_players\">외부 플레이어에 사용할 수 있는 비디오 스트림이 없음</string>\n    <string name=\"show_meta_info_summary\">스트림 작성자, 스트림 콘텐츠 또는 검색 요청에 대한 추가 정보가 있는 메타 정보 상자를 숨기려면 끄세요</string>\n    <string name=\"progressive_load_interval_summary\">프로그레시브 콘텐츠의 불러오기 간격 크기를 변경합니다 (현재 %s). 값이 낮을수록 초기 로딩 속도가 빨라질 수 있음</string>\n    <string name=\"error_report_open_github_notice\">충돌에 대해 논의하는 문제가 이미 존재하는지 확인하세요. 중복 티켓을 생성할 때 실제 버그를 수정하는 데 시간을 할애할 수 있습니다.</string>\n    <string name=\"create_error_notification\">오류 알림 생성</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">구독 선택</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">일부 서비스에서 사용할 수 있으며 일반적으로 훨씬 빠르지만 제한된 양의 항목과 종종 불완전한 정보를 반환할 수 있습니다 (예: 기간 없음, 항목 유형, 라이브 상태 없음)</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">안드로이드 10부터 \\'저장영역 접속 프레임워크\\'만 지원됩니다</string>\n    <string name=\"remove_watched_popup_warning\">재생목록에 추가하기 전후로 시청한 스트림이 제거됩니다. \\n정말 계속합니까?</string>\n    <string name=\"start_main_player_fullscreen_summary\">화면 자동 회전이 잠겨 있는 경우 미니 플레이어에서 동영상을 시작하지 말고 바로 전체 화면 모드로 재생하세요. 전체 화면을 종료해서 미니 플레이어를 이용할 수도 있습니다</string>\n    <string name=\"metadata_privacy_public\">공식</string>\n    <string name=\"radio\">라디오</string>\n    <string name=\"description_select_enable\">설명에서 텍스트 선택 활성화</string>\n    <string name=\"georestricted_content\">이 콘텐츠는 귀하의 국가에서 사용할 수 없습니다.</string>\n    <string name=\"night_theme_summary\">선호하는 어두운 테마 선택 — %s</string>\n    <string name=\"download_has_started\">다운로드가 시작되었습니다</string>\n    <string name=\"description_select_note\">이제 설명 내에서 텍스트를 선택할 수 있습니다. 선택 모드에서는 페이지가 깜박이고 링크를 클릭할 수 없는 경우가 있습니다.</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">이 작업에 적합한 파일 관리자를 찾을 수 없습니다.\n\\n저장영역 접속 프레임워크 호환 파일 관리자를 설치하십시오</string>\n    <string name=\"no_appropriate_file_manager_message\">이 작업에 적합한 파일 관리자를 찾을 수 없습니다.\n\\n파일 관리자를 설치하거나 다운로드 설정에서 \\'%s\\'을(를) 비활성화하십시오</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">피드 로딩이 너무 느리다고 생각하시나요\\? 그렇다면 빠른 로딩을 활성화해 보세요. (설정에서 변경하거나 아래 버튼을 눌러 변경할 수 있습니다)\n\\n\n\\nNewPipe는 두 가지 피드 로딩 전략을 제공합니다:\n\\n• 전체 구독 채널 가져오기: 느리지만 완전합니다.\n\\n• 전용 서비스 엔드포인트 사용: 빠르지만 일반적으로 완전하지 않습니다.\n\\n\n\\n이 두 가지의 차이점은 빠른 방식이 일반적으로 항목의 길이나 유형(실시간 동영상과 일반 동영상을 구분할 수 없음)과 같은 일부 정보가 부족하고 더 적은 항목을 반환할 수 있다는 점입니다.\n\\n\n\\nYouTube는 RSS 피드를 통해 이 빠른 방법을 제공하는 서비스의 예입니다.\n\\n\n\\n따라서 선택은 속도와 정확한 정보 중 무엇을 선호하느냐에 달려 있습니다.</string>\n    <string name=\"content_not_supported\">이 기능은 아직 NewPipe에서 지원하지 않습니다.\n\\n\n\\n이후 버전에서 지원될 예정입니다.</string>\n    <string name=\"faq_description\">앱 사용에 문제가 있는 경우, 일반적인 질문에 대한 다음 답변을 확인하세요!</string>\n    <string name=\"faq_title\">자주 묻는 질문</string>\n    <string name=\"faq\">웹사이트에서 보기</string>\n    <string name=\"sort\">정렬</string>\n    <string name=\"fast_mode\">빠른 모드</string>\n    <string name=\"import_subscriptions_hint\">점 3개 메뉴에서 구독 가져오기 또는 내보내기</string>\n    <string name=\"app_update_unavailable_toast\">최신 버전의 NewPipe를 실행 중입니다</string>\n    <string name=\"app_update_available_notification_text\">%s를 다운로드하려면 탭하세요</string>\n    <string name=\"unset_playlist_thumbnail\">영구 썸네일 설정 해제</string>\n    <string name=\"night_theme_available\">이 옵션은 %s가 테마로 선택되었을 경우에만 사용할 수 있습니다</string>\n    <string name=\"playlist_add_stream_success_duplicate\">중복 추가 %d 번</string>\n    <string name=\"duplicate_in_playlist\">회색으로 표시된 재생 목록에 이미 이 항목이 포함되어 있습니다.</string>\n    <string name=\"card\">카드</string>\n    <string name=\"msg_failed_to_copy\">클립보드 복사 실패</string>\n    <string name=\"remove_duplicates\">복제 삭제</string>\n    <string name=\"remove_duplicates_title\">복제를 삭제하시겠습니까\\?</string>\n    <string name=\"remove_duplicates_message\">이 재생목록의 모든 스트림 복사본을 삭제하겠습니까\\?</string>\n    <string name=\"feed_hide_streams_title\">다음 스트림 표시</string>\n    <string name=\"feed_show_partially_watched\">부분적 시청</string>\n    <string name=\"feed_show_watched\">완전 시청</string>\n    <string name=\"feed_show_upcoming\">예정</string>\n    <string name=\"ignore_hardware_media_buttons_title\">하드웨어 미디어 버튼 이벤트 무시</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">예를 들어, 물리적 버튼이 망가진 헤드셋을 사용하는 경우 유용합니다</string>\n    <string name=\"feed_show_hide_streams\">스트림 보이기/숨기기</string>\n    <string name=\"left_gesture_control_summary\">플레이어 화면 왼쪽 절반에 대한 제스처 선택</string>\n    <string name=\"prefer_original_audio_title\">원본 오디오 선호</string>\n    <string name=\"prefer_original_audio_summary\">언어에 관계없이 원본 오디오 트랙 선택</string>\n    <string name=\"prefer_descriptive_audio_summary\">가능한 경우 시각 장애인을 위한 설명이 포함된 오디오 트랙 선택</string>\n    <string name=\"prefer_descriptive_audio_title\">설명이 포함된 오디오 선호</string>\n    <string name=\"right_gesture_control_summary\">플레이어 화면 오른쪽 절반에 대한 제스처 선택</string>\n    <string name=\"right_gesture_control_title\">오른쪽 제스처 동작</string>\n    <string name=\"brightness\">밝기</string>\n    <string name=\"left_gesture_control_title\">왼쪽 제스처 동작</string>\n    <string name=\"volume\">볼륨</string>\n    <string name=\"none\">없음</string>\n    <string name=\"play_queue_audio_track\">오디오: %s</string>\n    <string name=\"audio_track\">오디오 트랙</string>\n    <string name=\"audio_track_present_in_video\">이 스트림에 오디오 트랙이 이미 존재해야 함</string>\n    <string name=\"select_audio_track_external_players\">외부 플레이어용 오디오 트랙 선택</string>\n    <string name=\"unknown_audio_track\">알 수 없음</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer 설정</string>\n    <string name=\"settings_category_exoplayer_summary\">ExoPlayer 설정을 관리합니다. 이러한 변경 사항을 적용하려면 플레이어를 다시 시작해야 함</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">ExoPlayer의 디코더 폴백 기능 사용</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">항상 ExoPlayer의 비디오 출력 표면 설정 해결 방법 사용</string>\n    <string name=\"audio_track_type_original\">원본</string>\n    <string name=\"audio_track_type_dubbed\">더빙됨</string>\n    <string name=\"audio_track_type_descriptive\">설명</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">디코더 초기화 문제가 있는 경우 이 옵션을 활성화하면 기본 디코더 초기화에 실패할 경우 우선순위가 낮은 디코더로 되돌아갑니다. 이 경우 기본 디코더를 사용할 때보다 재생 성능이 저하될 수 있음</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">이 해결 방법은 인터페이스가 변경될 때 인터페이스를 코덱으로 직접 설정하는 대신 비디오 코덱을 해제하고 다시 인스턴스화합니다. 이 문제가 있는 일부 기기에서 ExoPlayer가 이미 사용 중인 이 설정은 안드로이드 6 이상에서만 적용\n\\n\n\\n이 옵션을 활성화하면 현재 동영상 플레이어를 전환하거나 전체 화면으로 전환할 때 재생 오류를 방지할 수 있음</string>\n    <string name=\"main_tabs_position_summary\">메인 탭 선택기를 하단으로 이동</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"main_tabs_position_title\">메인 탭 위치</string>\n    <string name=\"disable_media_tunneling_automatic_info\">장치 모델에서 미디어 터널링을 지원하지 않는 것으로 알려져 있기 때문에 장치에서 기본적으로 미디어 터널링이 비활성화되었습니다.</string>\n    <string name=\"image_quality_title\">이미지 품질</string>\n    <string name=\"channel_tab_videos\">동영상</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">구독자</string>\n    <string name=\"show_channel_tabs_summary\">채널 페이지에 표시되는 탭</string>\n    <string name=\"share_playlist_with_list\">URL 목록 공유</string>\n    <string name=\"share_playlist_with_titles\">타이틀로 공유</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_channel_tabs\">채널 탭</string>\n    <string name=\"channel_tab_shorts\">쇼츠</string>\n    <string name=\"loading_metadata_title\">메타데이터 불러오기 중…</string>\n    <string name=\"toggle_screen_orientation\">화면 방향 전환</string>\n    <string name=\"image_quality_low\">낮은 품질</string>\n    <string name=\"toggle_fullscreen\">전체화면 전환</string>\n    <string name=\"feed_fetch_channel_tabs\">채널 탭 가져오기</string>\n    <string name=\"metadata_avatars\">아바타</string>\n    <string name=\"next_stream\">다음 스트림</string>\n    <string name=\"metadata_subchannel_avatars\">하위 채널 아바타</string>\n    <string name=\"open_play_queue\">재생 대기열 열기</string>\n    <string name=\"image_quality_none\">이미지를 불러오지 마세요</string>\n    <string name=\"image_quality_high\">높은 품질</string>\n    <string name=\"channel_tab_about\">정보</string>\n    <string name=\"share_playlist\">재생목록 공유</string>\n    <string name=\"forward\">앞으로</string>\n    <string name=\"channel_tab_albums\">앨범</string>\n    <string name=\"rewind\">되감기</string>\n    <string name=\"replay\">다시 재생</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">피드를 업데이트할 때 가져올 탭입니다. 빠른 모드를 사용하여 채널을 업데이트하는 경우 이 옵션은 효과가 없습니다.</string>\n    <string name=\"image_quality_medium\">중간 품질</string>\n    <string name=\"metadata_uploader_avatars\">업로더 아바타</string>\n    <string name=\"metadata_banners\">배너</string>\n    <string name=\"channel_tab_playlists\">재생목록</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"no_live_streams\">실시간 스트림 없음</string>\n    <string name=\"image_quality_summary\">데이터 및 메모리 사용량을 줄이기 위해 이미지 품질과 이미지 불러오기 여부를 선택하세요. 변경 사항이 메모리 내 및 디스크 내 이미지 캐시를 모두 지움 — %s</string>\n    <string name=\"play\">재생</string>\n    <string name=\"more_options\">추가 옵션</string>\n    <string name=\"metadata_thumbnails\">썸네일</string>\n    <string name=\"channel_tab_tracks\">트랙</string>\n    <string name=\"duration\">지속</string>\n    <string name=\"no_streams\">스트림 없음</string>\n    <string name=\"channel_tab_channels\">채널</string>\n    <string name=\"previous_stream\">이전 스트림</string>\n    <string name=\"channel_tab_livestreams\">실시간</string>\n    <string name=\"notification_actions_summary_android13\">아래의 각 알림 작업을 탭하여 편집하세요. 처음 세 가지 작업(재생/일시 중지, 이전 및 다음)은 시스템에 의해 설정되며 사용자 정의할 수 없습니다.</string>\n    <string name=\"show_more\">더보기</string>\n    <string name=\"no\">아니오</string>\n    <string name=\"error_insufficient_storage\">기기에 저장공간이 충분하지 않습니다</string>\n    <string name=\"show_less\">덜보기</string>\n    <string name=\"settings_category_backup_restore_title\">백업 및 복원</string>\n    <string name=\"auto_update_check_description\">NewPipe에서 자동으로 새 버전을 확인하고 업데이트가 있으면 알려줍니다.\n\\n이 기능을 켜시겠습니까?</string>\n    <string name=\"reset_all_settings\">모든 설정을 초기화하면 설정해둔 사항이 모두 삭제되며 앱을 다시 시작합니다.\n\\n\n\\n정말 계속하시겠습니까?</string>\n    <string name=\"import_settings_vulnerable_format\">가져오려는 설정 파일이 NewPipe 0.27.0 이상에서는 권장하지 않는 취약한 형식으로 작성되어 있습니다. 설정 파일의 출처를 신뢰할 수 있는지 꼭 확인하시기 바라며, 다음부터는 가급적 NewPipe 0.27.0 이후의 설정 파일만 이용하시기 바랍니다. 이 취약한 형식의 설정 파일은 곧 더 이상 지원되지 않으며, 오래된 버전의 NewPipe에서 새 버전의 설정 파일을 가져오는 것도 불가능해질 예정입니다.</string>\n    <plurals name=\"replies\">\n        <item quantity=\"other\">답글 %s개</item>\n    </plurals>\n    <string name=\"yes\">네</string>\n    <string name=\"reset_settings_title\">설정 초기화</string>\n    <string name=\"reset_settings_summary\">모든 설정을 기본값으로 초기화</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">YouTube 임시 재생목록으로 공유</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud Top 50 페이지가 삭제되었습니다</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud에서 더 이상 기존 Top 50 차트를 제공하지 않습니다. 해당하는 탭이 메인 페이지에서 제거되었습니다.</string>\n    <string name=\"short_thousand\">%s천</string>\n    <string name=\"short_million\">%s백만</string>\n    <string name=\"short_billion\">%s십억</string>\n    <string name=\"delete_file\">파일 삭제</string>\n    <string name=\"select_a_feed_group\">피드 그룹 선택</string>\n    <string name=\"no_feed_group_created_yet\">피드 그룹을 생성하지 않았습니다</string>\n    <string name=\"feed_group_page_summary\">채널 그룹 페이지</string>\n    <string name=\"account_terminated_service_provides_reason\">계정 정지됨\\n\\n%1$s에서 제공한 이유: %2$s</string>\n    <string name=\"tab_bookmarks_short\">재생목록</string>\n    <string name=\"search_with_service_name\">%1$s 검색</string>\n    <string name=\"search_with_service_name_and_filter\">%1$s 검색 (%2$s)</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"다른 앱 위에 표시 허용\\\"</string>\n    <string name=\"migration_info_7_8_title\">YouTube 통합 인기 급상승 동영상이 삭제되었습니다</string>\n    <string name=\"migration_info_7_8_message\">YouTube에서 2025년 7월 21일부로 더 이상 통합 인기 급상승 동영상을 제공하지 않습니다. NewPipe에서는 기본 인기 급상승 페이지를 인기 급상승 실시간 페이지로 교체했습니다.\\n\\n\\\"설정 &gt; 콘텐츠 &gt; 메인 화면의 내용\\\"에서 다른 인기 급상승 페이지를 선택할 수 있습니다.</string>\n    <string name=\"trending_gaming\">인기 급상승 게임</string>\n    <string name=\"trending_podcasts\">인기 급상승 팟캐스트</string>\n    <string name=\"trending_movies\">인기 급상승 영화 및 쇼</string>\n    <string name=\"trending_music\">인기 급상승 음악</string>\n    <string name=\"permission_display_over_apps_message\">팝업 플레이어를 사용하려면, 이후 Android 설정에서 %1$s 선택 후 %2$s 설정을 켜 주십시오.</string>\n    <string name=\"delete_entry\">항목 삭제</string>\n    <string name=\"audio_track_type_secondary\">보조</string>\n    <string name=\"channel_tab_likes\">좋아요</string>\n    <string name=\"entry_deleted\">항목 삭제됨</string>\n    <string name=\"player_http_403\">재생 중 서버에서 HTTP 403 오류를 수신했으며, 스트리밍 URL이 만료되었거나 IP 차단으로 인해 발생했을 수 있습니다</string>\n    <string name=\"player_http_invalid_status\">재생 중 서버에서 HTTP %1$s 오류를 수신했습니다</string>\n    <string name=\"youtube_player_http_403\">재생 중 서버에서 HTTP 403 오류를 수신했으며, 스트리밍 URL 역난독화 문제나 IP 차단 때문일 수 있습니다</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s에서 데이터 제공을 거부하고, 요청자가 봇이 아닌지 확인하기 위해 로그인을 요청하고 있습니다.\\n\\n아마 IP가 %1$s에서 임시 차단되었을 것이며, 잠시 기다리거나 다른 IP로 전환할 수 있습니다 (예를 들자면 VPN을 켜/끄거나, WiFi를 모바일 데이터로 바꾸세요).</string>\n    <string name=\"unsupported_content_in_country\">이 콘텐츠는 현재 선택한 콘텐츠 지역에서 이용할 수 없습니다.\\n\\n\\\"설정 &gt; 콘텐츠 &gt; 기본 콘텐츠 국가\\\"에서 지역을 바꾸세요.</string>\n    <string name=\"kao_dialog_warning\">2025년 8월, Google은 2026년 9월부터 인증된 기기에 앱을 설치하려면 Play 스토어 외 앱을 포함한 모든 Android 앱에 대해 개발자 인증을 받아야 한다고 발표했습니다. NewPipe 개발자는 이 요구 사항에 동의하지 않으므로, 이 이후 NewPipe는 더 이상 인증된 Android 기기에서 동작하지 않을 것입니다.</string>\n    <string name=\"kao_dialog_more_info\">자세히</string>\n    <string name=\"kao_solution\">해결책</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ks/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "app/src/main/res/values-ku/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">کرتە له‌ ”گه‌ڕان” بكه‌ بۆ ده‌ستپێكردن</string>\n    <string name=\"upload_date_text\">بڵاوكراوه‌ته‌وه‌ له‌ %1$s</string>\n    <string name=\"no_player_found\">هیچ لێدەرێکی ڤیدیۆیی نه‌دۆزرایه‌وه‌. ده‌ته‌وێت VLC دابمەزرێنیت؟</string>\n    <string name=\"no_player_found_toast\">هیچ کارپێکەرێکی ڤیدیۆیی نەدۆزرایەوە (دەتوانی کارپێکەری VLC دامەزرێنی) .</string>\n    <string name=\"install\">دامەزراندن</string>\n    <string name=\"cancel\">پاشگه‌زبوونەوە</string>\n    <string name=\"open_in_browser\">كردنه‌وه‌ له‌ وێبگه‌ر</string>\n    <string name=\"open_in_popup_mode\">كردنه‌وه‌ له‌ دۆخی په‌نجه‌ره‌</string>\n    <string name=\"share\">هاوبه‌شی</string>\n    <string name=\"download\">دابەزاندن</string>\n    <string name=\"controls_download_desc\">دابەزاندنی فایلی پەخش</string>\n    <string name=\"search\">گه‌ڕان</string>\n    <string name=\"settings\">ڕێكخستنه‌كان</string>\n    <string name=\"did_you_mean\">مەبەستت %1$s ە؟</string>\n    <string name=\"share_dialog_title\">هاوبه‌شی لە</string>\n    <string name=\"use_external_video_player_title\">به‌كارهێنانی لێدەری ڤیدیۆی ده‌ره‌كی</string>\n    <string name=\"use_external_video_player_summary\">دەنگ لادەدات لەهەنێ قەبارەدا</string>\n    <string name=\"use_external_audio_player_title\">به‌كارهێنانی لێدەری ده‌نگی ده‌ره‌كی</string>\n    <string name=\"subscribe_button_title\">به‌ژداری</string>\n    <string name=\"subscribed_button_title\">به‌شداربوویت</string>\n    <string name=\"channel_unsubscribed\">به‌شداریت نەما له‌ كه‌ناڵ</string>\n    <string name=\"subscription_change_failed\">ناتوانیت گۆڕانكاری له‌م به‌شدارییه‌دا بكه‌یت</string>\n    <string name=\"subscription_update_failed\">ناتوانرێت به‌شداریكردنه‌كه‌ نوێبكرێته‌وه‌</string>\n    <string name=\"show_info\">پیشاندانی زانیاری</string>\n    <string name=\"tab_subscriptions\">به‌شدارییه‌كان</string>\n    <string name=\"tab_bookmarks\">لیستەلێدانە نیشانەکراوەکان</string>\n    <string name=\"fragment_feed_title\">چی نوێ هه‌یه‌</string>\n    <string name=\"controls_background_title\">پاشبنەما</string>\n    <string name=\"controls_popup_title\">په‌نجه‌ره‌</string>\n    <string name=\"controls_add_to_playlist_title\">زیادکردن بۆ</string>\n    <string name=\"download_path_title\">فۆڵدەری دابەزاندنی ڤیدیۆ</string>\n    <string name=\"download_path_summary\">پەڕگەی ڤیدیۆ دابەزێنراوەکان لێرەدا کۆگا دەکرێن</string>\n    <string name=\"download_path_dialog_title\">فۆڵدەری دابەزاندن بۆ فایلە ڤیدیۆکان هەڵبژێرە</string>\n    <string name=\"download_path_audio_title\">فۆڵدەری دابەزاندنی ده‌نگ</string>\n    <string name=\"download_path_audio_summary\">فایلی دەنگە دابەزێنراوەکان لێرەدا کۆگا دەکرێن</string>\n    <string name=\"download_path_audio_dialog_title\">فۆڵدەری دابەزاندنی فایلە دەنگییەکان هەڵبژێرە</string>\n    <string name=\"default_resolution_title\">قەبارەی بنەڕەت</string>\n    <string name=\"default_popup_resolution_title\">قەبارەی بنەڕەتی په‌نجه‌ره‌</string>\n    <string name=\"show_higher_resolutions_title\">پیشاندانی قەبارەی به‌رزتر</string>\n    <string name=\"show_higher_resolutions_summary\">تەنها چەند مۆبایلێک پشتگیری لێدانی ڤیدیۆی 2K/4K دەکەن</string>\n    <string name=\"play_with_kodi_title\">لێدان لە Kodi</string>\n    <string name=\"kore_not_found\">ئەپەکە نه‌دۆزرایه‌وه‌. دابمه‌زرێت؟</string>\n    <string name=\"show_play_with_kodi_title\">بژاردەی ”لێدان بە Kodi“ پیشانبدرێت</string>\n    <string name=\"show_play_with_kodi_summary\">پیشاندانی بژارده‌ی لێدانی ڤیدیۆ به‌ Kodi</string>\n    <string name=\"play_audio\">ده‌نگ</string>\n    <string name=\"default_audio_format_title\">جۆری بنەڕەتی ده‌نگ</string>\n    <string name=\"default_video_format_title\">جۆری بنەڕەتی ڤیدیۆ</string>\n    <string name=\"theme_title\">ڕووكار</string>\n    <string name=\"light_theme_title\">ڕۆشن</string>\n    <string name=\"dark_theme_title\">تاریک</string>\n    <string name=\"black_theme_title\">ڕه‌ش</string>\n    <string name=\"popup_remember_size_pos_title\">بیرهاتنه‌وه‌ی شوێن و قه‌باره‌ی په‌نجه‌ره‌</string>\n    <string name=\"popup_remember_size_pos_summary\">بیرهاتنه‌وه‌ی كۆتا قه‌باره‌ و شوێنی په‌نجه‌ره‌ی بچووك</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">پاشماوه‌ی وێنۆچكه‌كان سڕایه‌وه‌</string>\n    <string name=\"use_inexact_seek_title\">بەکارهێنانی گەڕانی ناوردی خێرا</string>\n    <string name=\"metadata_cache_wipe_title\">خاوێنکردنەوەی پاشماوەی داتا</string>\n    <string name=\"metadata_cache_wipe_summary\">سڕینەوەی پاشماوەی هەموو داتاکان</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">پاشماوەی داتاکان سڕانەوە</string>\n    <string name=\"auto_queue_title\">ڕیزکردنی خۆکاری کارپێکردنی دواتر</string>\n    <string name=\"show_search_suggestions_title\">گەڕانی پێشنیارکراوەکان</string>\n    <string name=\"show_search_suggestions_summary\">پیشاندانی پێشنیارەکان لەکاتی گەڕان</string>\n    <string name=\"enable_search_history_title\">مێژووی گەڕان</string>\n    <string name=\"enable_watch_history_title\">مێژووی تەماشاکردن</string>\n    <string name=\"enable_watch_history_summary\">هێشتنەوەی تراکی ڤیدیۆ کارپێکراوەکان</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">بەردەوام بوونی ڤیدیۆ لەدوای هەبوونی هەر بڕینێک (وەک پەیوەندی تەلەفۆنی)</string>\n    <string name=\"download_dialog_title\">دابەزاندن</string>\n    <string name=\"show_next_and_similar_title\">پیشاندانی ’دواتر’ و ڤیدیۆ ’هاوشێوەکان’</string>\n    <string name=\"unsupported_url\">بەستەرەکە پشتگیری نەکراوە</string>\n    <string name=\"default_content_country_title\">ناوەڕۆکی وڵاتی بنەڕەتی</string>\n    <string name=\"settings_category_player_title\">کارپێکەر</string>\n    <string name=\"settings_category_video_audio_title\">ڤیدیۆ و دەنگ</string>\n    <string name=\"settings_category_history_title\">مێژوو و پاشماوە</string>\n    <string name=\"settings_category_appearance_title\">دیمەن</string>\n    <string name=\"settings_category_debug_title\">ڕاستکردنەوە</string>\n    <string name=\"background_player_playing_toast\">کارپێکردن لە پاشبنەما</string>\n    <string name=\"popup_playing_toast\">کارپێکردن لە پەنجەرە</string>\n    <string name=\"content\">ناوەڕۆک</string>\n    <string name=\"show_age_restricted_content_title\">پیشاندانی سنوری تەمەن</string>\n    <string name=\"duration_live\">ڕاستەوخۆ</string>\n    <string name=\"downloads\">دابەزاندنەکان</string>\n    <string name=\"downloads_title\">دابەزاندنەکان</string>\n    <string name=\"error_report_title\">ناتوانرێ سکاڵابکرێ</string>\n    <string name=\"all\">گشتی</string>\n    <string name=\"disabled\">ناکارایە</string>\n    <string name=\"clear\">پاککردنەوە</string>\n    <string name=\"best_resolution\">باشترین قەبارە</string>\n    <string name=\"undo\">گەڕانەوە</string>\n    <string name=\"play_all\">لێدانی گشتی</string>\n    <string name=\"always\">هەمیشە</string>\n    <string name=\"just_once\">تەنها ئێستا</string>\n    <string name=\"file\">فایل</string>\n    <string name=\"notification_channel_name\">پەیامی NewPipe</string>\n    <string name=\"notification_channel_description\">پەیامەکانی NewPipe بۆ پاشبنەما و لێدانەکانی پەنجەرە</string>\n    <string name=\"unknown_content\">(نەزانراو)</string>\n    <string name=\"switch_to_background\">گۆڕین بۆ پاشبنەما</string>\n    <string name=\"switch_to_popup\">گۆڕین بۆ پەنجەرە</string>\n    <string name=\"switch_to_main\">گۆڕین بۆ سەرەکی</string>\n    <string name=\"import_data_title\">هەناردەی بنکەزانیاری</string>\n    <string name=\"export_data_title\">هاوردەی بنکەزانیاری</string>\n    <string name=\"import_data_summary\">جێگیر ئەبێت لەسەر مێژوو ، بەشدارییەکان ، لیستەلێدان و (هەندێک) ڕێکخستنەکان</string>\n    <string name=\"export_data_summary\">هاوردە کردنی مێژوو ، بەشدارییەکان، لیستەلێدان و ڕێکخستنەکان</string>\n    <string name=\"general_error\">هەڵە</string>\n    <string name=\"network_error\">کێشە لە هێڵەکەتدا هەیە</string>\n    <string name=\"could_not_load_thumbnails\">ناتوانرێ هەموو وێنۆچکەکان باربکرێن</string>\n    <string name=\"parsing_error\">ناتوانرێ ماڵپەڕ شیبکرێتەوە</string>\n    <string name=\"content_not_available\">ناوەڕۆک بەردەست نییە</string>\n    <string name=\"could_not_setup_download_menu\">ناتوانرێ لیستی دابەزاندن دابنرێ</string>\n    <string name=\"app_ui_crash\">ئەپ/ڕووکار ڕاوەستا</string>\n    <string name=\"player_stream_failure\">ناتوانرێ ئەم پەخشە کارپێبکرێ</string>\n    <string name=\"external_player_unsupported_link_type\">کارپێکەرە ڤیدیۆییە دەرەکییەکان پشتگیری ئەم جۆرە بەستەرانە ناکەن</string>\n    <string name=\"video_streams_empty\">هیچ پەخشێکی ڤیدیۆیی نەدۆزرایەوە</string>\n    <string name=\"audio_streams_empty\">پەخشی هیچ دەنگێک نەدۆزرایەوە</string>\n    <string name=\"invalid_file\">ئەو فایلە بوونی نییە یان دەسەڵاتی خوێندنەوە و نوسینی لاوازە</string>\n    <string name=\"file_name_empty_error\">ناوی فایل ناکرێ بەتاڵ بێت</string>\n    <string name=\"error_occurred_detail\">هەڵەیەک ڕوویدا : %1$s</string>\n    <string name=\"sorry_string\">ببوورە، ناتوانرێ ئەوە ڕووبدات.</string>\n    <string name=\"error_report_button_text\">سکاڵا لەسەر کێشە لەڕێگای ئیمێڵ</string>\n    <string name=\"error_snackbar_message\">ببورە، کێشەیەک ڕوویدا.</string>\n    <string name=\"error_snackbar_action\">سکاڵا</string>\n    <string name=\"what_device_headline\">زانیاری:</string>\n    <string name=\"what_happened_headline\">چی ڕوویدا:</string>\n    <string name=\"your_comment\">لێدوانەکەت (بە ئینگلیزی):</string>\n    <string name=\"error_details_headline\">وردەکارییەکان:</string>\n    <string name=\"detail_thumbnail_view_description\">کارپێکردنی ڤیدیۆ، ماوەی:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">وێنۆچکەی کەسی بەرزکەرەوە</string>\n    <string name=\"detail_likes_img_view_description\">بەدڵبوون</string>\n    <string name=\"detail_dislikes_img_view_description\">بەدڵنەبوون</string>\n    <string name=\"search_no_results\">هیچ ئەنجامێک نییە</string>\n    <string name=\"empty_list_subtitle\">هیچ شتێک لێرەدا نییە</string>\n    <string name=\"detail_drag_description\">ڕاکێشان بۆ دووبارە داواکردنەوە</string>\n    <string name=\"video\">ڤیدیۆ</string>\n    <string name=\"audio\">دەنگ</string>\n    <string name=\"retry\">هەوڵدانەوە</string>\n    <string name=\"no_subscribers\">هیچ بەشداربوویەک نییە</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s بەشداربوو</item>\n        <item quantity=\"other\">%s بەشداربوون</item>\n    </plurals>\n    <string name=\"no_views\">هیچ بینراوێک نییە</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s بینرااو</item>\n        <item quantity=\"other\">%s بینراو</item>\n    </plurals>\n    <string name=\"no_videos\">هیچ ڤیدیۆیەک نییە</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s ڤیدیۆ</item>\n        <item quantity=\"other\">%s ڤیدیۆکان</item>\n    </plurals>\n    <string name=\"start\">دەستپێکردن</string>\n    <string name=\"pause\">وەستان</string>\n    <string name=\"create\">دروستکردن</string>\n    <string name=\"delete\">سڕینەوە</string>\n    <string name=\"checksum\">تاقیکردنەوەی هێڵێک</string>\n    <string name=\"dismiss\">فەرامۆشی</string>\n    <string name=\"rename\">ناو لێنانەوە</string>\n    <string name=\"ok\">باشە</string>\n    <string name=\"msg_name\">ناوی فایل</string>\n    <string name=\"msg_threads\">دابەشکراوەکان</string>\n    <string name=\"msg_error\">کێشە ڕوویدا</string>\n    <string name=\"msg_running\">دابەزاندنەکانی ئەپ</string>\n    <string name=\"msg_running_detail\">کرتە بکە بۆ وردەکاری</string>\n    <string name=\"msg_wait\">تکایە چاوەڕێبکە…</string>\n    <string name=\"msg_copied\">لەبەرگیرایەوە</string>\n    <string name=\"no_available_dir\">تکایە فۆڵدەرێک بۆ شوێنی دابەزاندن دیاریبکە لە ڕێکخستنەکان</string>\n    <string name=\"msg_popup_permission\">ئەم دەسەڵاتە پێویستە بۆ\n\\nکردنەوەی دۆخی پەنجەرە</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA داواکاری</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA داواکراوە</string>\n    <string name=\"settings_category_downloads_title\">دابەزاندن</string>\n    <string name=\"charset_letters_and_digits\">پیت و ژمارەکان</string>\n    <string name=\"charset_most_special_characters\">هێما تایبەتییەکان</string>\n    <string name=\"title_activity_about\">لەبارەی ئەپ</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s لەلایەن %2$s لەژێر %3$s</string>\n    <string name=\"tab_about\">سەبارەت</string>\n    <string name=\"tab_licenses\">مۆڵەتەکان</string>\n    <string name=\"contribution_title\">هاوبەشبوون</string>\n    <string name=\"contribution_encouragement\">هەرکاتێ بیرۆکەیەکت هەبوو وەک ; وەرگێڕان، گۆڕینی دیزاین ، سڕینەوەی کۆد ،یان هەر گۆڕانکارییەکیتر ئەوا یارمەتییەکەت لەسەرچاوانمانە. ئێمە هەمیشە دەمانەوێ ئەپەکە زیاتر بەرەوپێش ببەین!</string>\n    <string name=\"view_on_github\">بینین لە GitHub</string>\n    <string name=\"donation_title\">بەخشین</string>\n    <string name=\"donation_encouragement\">ئەم ئەپە لەلایەن چەند خۆبەخشێکەوە دروستکراوە کەکاتی خۆیان پێ بەخشیووە تاکو باشترین خزمەتگوزاریت پێشکەش بکەن. هیچ نەبێت بە کڕینی کوپێک قاوە یارمەتی گەشەپێدەرەکانمان بدە بۆ ئەوەی کاتی زیاتر تەرخان بکەین بۆ بەرەوپێشبردنی NewPipe.</string>\n    <string name=\"give_back\">پێدانەوە</string>\n    <string name=\"website_title\">ماڵپەڕ</string>\n    <string name=\"website_encouragement\">سەردانی ماڵپەڕی ئەپەکەمان بکە بۆ زانیاری و هەواڵی نوێ.</string>\n    <string name=\"read_full_license\">خوێندنەوەی مۆڵەتنامە</string>\n    <string name=\"title_activity_history\">مێژوو</string>\n    <string name=\"action_history\">مێژوو</string>\n    <string name=\"delete_item_search_history\">ئایا دەتەوێ ئەم بابەتە لە مێژووی گەڕان بسڕدرێتەوە؟</string>\n    <string name=\"title_last_played\">دواین کارپێکراو</string>\n    <string name=\"title_most_played\">زۆرترین کارپێکراو</string>\n    <string name=\"main_page_content\">ناوەڕۆکی پەڕەی سەرەکی</string>\n    <string name=\"play_queue_remove\">لادان</string>\n    <string name=\"play_queue_stream_detail\">وردەکارییەکان</string>\n    <string name=\"play_queue_audio_settings\">ڕێکخستنەکانی دەنگ</string>\n    <string name=\"start_here_on_background\">دەستپێکردنی لێدان لە پاشبنەماوە</string>\n    <string name=\"start_here_on_popup\">دەستپێکردنی لێدان لە پەنجەرەوە</string>\n    <string name=\"video_player\">کارپێکەری ڤیدیۆیی</string>\n    <string name=\"background_player\">کارپێکەری پاشبنەما</string>\n    <string name=\"popup_player\">کارپێکەری پەنجەرە</string>\n    <string name=\"always_ask_open_action\">هەمیشە بپرسە</string>\n    <string name=\"preferred_player_fetcher_notification_title\">دەستکەوتنی زانیاری…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">بارکردنی ناوەڕۆکی داواکراو</string>\n    <string name=\"create_playlist\">لیستەلێدانی نوێ</string>\n    <string name=\"rename_playlist\">ناولێنانەوە</string>\n    <string name=\"name\">ناو</string>\n    <string name=\"add_to_playlist\">زیادکردن بۆ لیستەلێدان</string>\n    <string name=\"set_as_playlist_thumbnail\">دانان لەسەر وێنۆچکەی لیستەلێدان</string>\n    <string name=\"bookmark_playlist\">لیستەلێدانی نیشانەکراو</string>\n    <string name=\"unbookmark_playlist\">لادانی نیشانەکراو</string>\n    <string name=\"delete_playlist_prompt\">سڕینەوەی ئەم لیستەلێدانە؟</string>\n    <string name=\"playlist_creation_success\">لیستەلێدان دانرا</string>\n    <string name=\"playlist_add_stream_success\">لیستەلێدان کرا</string>\n    <string name=\"playlist_thumbnail_change_success\">وێنۆچکەی لیستەلێدان گۆڕدرا.</string>\n    <string name=\"caption_none\">هیچ ژێرنووسێک نییە</string>\n    <string name=\"resize_fit\">فیت</string>\n    <string name=\"resize_fill\">پڕ</string>\n    <string name=\"resize_zoom\">هێنانەپێش</string>\n    <string name=\"caption_auto_generated\">دانانی خۆکاری</string>\n    <string name=\"enable_disposed_exceptions_title\">سکاڵا لەسەر کێشەکان</string>\n    <string name=\"enable_disposed_exceptions_summary\">سکاڵاکردن لەسەر نەگەیاندنی Rx ی پەسەندنەکرا لە دەرەوەی پارچە یان چالاکی لەدوای پوختەکردن</string>\n    <string name=\"import_title\">هەناردە</string>\n    <string name=\"import_from\">هەناردە لە</string>\n    <string name=\"export_to\">هاوردە بۆ</string>\n    <string name=\"import_ongoing\">هەناردەئەکرێ…</string>\n    <string name=\"export_ongoing\">هاوردە دەکرێ…</string>\n    <string name=\"import_file_title\">هەناردەی فایل</string>\n    <string name=\"previous_export\">هاوردەی پێشووتر</string>\n    <string name=\"subscriptions_import_unsuccessful\">ناتوانرێ بەشدارییەکان هەناردەبکرێنەوە</string>\n    <string name=\"subscriptions_export_unsuccessful\">ناتوانرێ بەشدارییەکان هاوردە بکرێن</string>\n    <string name=\"import_youtube_instructions\">بۆ هێنانەوەی بەشداربوونەکانی یوتوب پێویستە پەڕگەی خەزن بوو بگەڕێنیتەوە:\n\\n\n\\n1. ئەم بەستەرە بکەوە: s%1$s\n\\n2. بچۆرەژوورەوە گەر داوای‌ کرد\n\\n3. داگرتنێک دەست پێدەکات (ئەمە پەڕگەی خەزنکراوە)</string>\n    <string name=\"import_soundcloud_instructions\">هەناردەکردنەوەی پەڕەی کەسی SoundCloud بەدانانی بەستەر یاخوود ئایدی:\n\\n\n\\n1. دۆخی ”Desktop mode” لە وێبگەرەکەتدا چالاک بکە (ئەم ماڵپەڕە بۆ وێبگەری مۆبایلەکان بەردەست نییە)\n\\n2. ئەم بەستەرە بکەرەوە : %1$s\n\\n3. بچۆرە ژوورەوە گەر داواکرا\n\\n4. بەستەری پەڕەی کەسییەکەت دابنێ.</string>\n    <string name=\"import_soundcloud_instructions_hint\">ئایدییەکەت , soundcloud.com/yourid</string>\n    <string name=\"import_network_expensive_warning\">ئەوە بزانە ئەم کردارە پێویستی بە هێڵێکی گران هەیە.\n\\n\n\\nدەتەوێ بەردەوامبیت؟</string>\n    <string name=\"playback_speed_control\">کۆنترۆڵی خێرایی کارپێکەر</string>\n    <string name=\"playback_tempo\">خێراییەکان</string>\n    <string name=\"playback_pitch\">شەپۆلی دەنگ</string>\n    <string name=\"unhook_checkbox\">سڕینەوەی بەستەر (ڕەنگە ببێتە هۆی تێکدان)</string>\n    <string name=\"no_streams_available_download\">هیچ پەخشێک نییە بۆ دابەزاندن</string>\n    <string name=\"caption_setting_title\">ژێرنووسەکان</string>\n    <string name=\"caption_setting_description\">بەهۆی گۆڕانکاری لە شێوەی ژێرنووسکردنەکە. پێویستە ئەپەکە دابخەیت و دیسانەوە بیکەیتەوە.</string>\n    <string name=\"clear_views_history_title\">سڕینەوەی مێژووی تەماشاکردن</string>\n    <string name=\"clear_views_history_summary\">مێژوو دەسڕێتەوە لەگەڵ ڤیدیۆ کارپێکراوەکان و شوێنی لیستە ڤیدیۆییەکان</string>\n    <string name=\"delete_view_history_alert\">تەواوی مێژووی تەماشاکردن بسڕدرێتەوە؟</string>\n    <string name=\"clear_search_history_title\">سڕینەوەی مێژووی گەڕان</string>\n    <string name=\"clear_search_history_summary\">مێژووی گەڕانەکانت دەسڕێتەوە</string>\n    <string name=\"delete_search_history_alert\">تەواوی گەڕانەکانت بسڕدرێنەوە؟</string>\n    <string name=\"search_history_deleted\">مێژووی گەڕانەکانت سڕانەوە.</string>\n    <string name=\"one_item_deleted\">1 بابەت سڕایەوە.</string>\n    <string name=\"app_license\">ئەم ئەپە سەرچاوە کراوەیە : دەتوانی بەکاریبهێنی، بیخوێنیتەوە و هاوبەشی پێبکەیت و بەرەوپێشی ببەیت.\n\\nبەتایبەتی دەتوانی دابەشیبکەیتەوە یاخوود بگۆڕیت بەپێی مەرجەکانی GNU مۆڵەتنامەی گشتی وەک ئەپێکی بڵاوی خۆڕایی!</string>\n    <string name=\"privacy_policy_title\">سیاسەتی تایبەتی ئەپ</string>\n    <string name=\"privacy_policy_encouragement\">پڕۆژەی ئەپەکە زانیارییە تایبەتییەکانت بەوردی دەپارێزێ. هەروەها ئەپەکە هیچ داتایەک بەبێ ئاگاداری تۆ بەکارنابات. \n\\nسیاسەتی تایبەتی ئەپ بەوردەکاری ڕوونکردنەوەت دەداتێ لەسەر ئەو داتایانەی وەریاندەگرێ و بەکاریاندەبات.</string>\n    <string name=\"read_privacy_policy\">خوێندنەوەی سیاسەتی تایبەتی</string>\n    <string name=\"channels\">کەناڵەکان</string>\n    <string name=\"playlists\">لیستەلێدانەکان</string>\n    <string name=\"tracks\">تراکەکان</string>\n    <string name=\"users\">بەکاربەرەکان</string>\n    <string name=\"unsubscribe\">بەشدارنەبوون</string>\n    <string name=\"tab_choose\">هەڵبژاردنی پەڕە</string>\n    <string name=\"content_language_title\">زمانی بنەڕەتی ئەپ</string>\n    <string name=\"settings_category_updates_title\">نوێکارییەکان</string>\n    <string name=\"file_deleted\">فایل سڕایەوە</string>\n    <string name=\"app_update_notification_channel_name\">پەیامی نوێکاری ئەپ</string>\n    <string name=\"app_update_notification_channel_description\">پەیامەکانی وەشانی نوێی ئەپ</string>\n    <string name=\"download_to_sdcard_error_title\">بیرگەی دەرەکی بەردەست نییە</string>\n    <string name=\"download_to_sdcard_error_message\">دابەزاندن لە بیرگەی دەرەکی ناکرێت.\n\\nشوێنی فۆڵدەری دابەزاندنەکان دابنرێتەوە؟</string>\n    <string name=\"restore_defaults\">گێڕانەوە بۆ بنەڕەت</string>\n    <string name=\"restore_defaults_confirmation\">ئایا دەتەوێ بگەڕێنرێتەوە بۆ شێوازی بنەڕەتی؟</string>\n    <string name=\"subscribers_count_not_available\">ژمارەی بەشداربووان نادیارە</string>\n    <string name=\"download_already_running\">دابەزاندنێکی تر هەیە بەهەمان ناو</string>\n    <string name=\"show_error\">پیشاندانی کێشە</string>\n    <string name=\"error_path_creation\">فۆڵدەری مەبەست ناتوانرێ دروست بکرێ</string>\n    <string name=\"error_file_creation\">فایل ناتوانرێ دروستبکرێ</string>\n    <string name=\"error_ssl_exception\">پەیوەستبوونی پارێزراو شکستی هێنا</string>\n    <string name=\"error_unknown_host\">ناتوانرێ ڕاژە بدۆزرێتەوە</string>\n    <string name=\"error_connect_host\">ناتوانرێ بە ڕاژەوە پەیوەست بیت</string>\n    <string name=\"error_http_no_content\">ڕاژەکە هیچ داتایەک نانێرێت</string>\n    <string name=\"error_http_unsupported_range\">ئەم ڕاژەیە ناتوانێ چەندین دابەزاندن لەیەک کاتدا بکات</string>\n    <string name=\"events\">ڕووداوەکان</string>\n    <string name=\"show_comments_title\">پیشاندانی لێدوانەکان</string>\n    <string name=\"show_comments_summary\">ناکارایکە بۆ پیشان نەدانی لێدوانەکان</string>\n    <string name=\"autoplay_title\">لێدانی خۆکار</string>\n    <string name=\"no_comments\">هیچ لێدوانێک نییە</string>\n    <string name=\"enable_playback_resume_title\">دەسپێکردنەوەی لێدانەوە</string>\n    <string name=\"enable_playback_resume_summary\">گێڕانەوەی کارپێکەر بۆ کۆتا شوێن</string>\n    <string name=\"enable_playback_state_lists_title\">شوێنەکان لە لیستدا</string>\n    <string name=\"settings_category_clear_data_title\">سڕینەوەی داتا</string>\n    <string name=\"watch_history_deleted\">مێژووی تەماشاکردن سڕایەوە.</string>\n    <string name=\"watch_history_states_deleted\">شوێنی کارپێکراوەکان سڕانەوە.</string>\n    <string name=\"missing_file\">شوێنی فایلەکە گۆڕدراوە یان سڕاوەتەوە</string>\n    <string name=\"download_already_pending\">دابەزاندنێکی تر لە نۆرە هەیە بەهەمان ناو</string>\n    <string name=\"clear_playback_states_title\">سڕینەوەی شوێنی کارپێکراوەکان</string>\n    <string name=\"clear_playback_states_summary\">شوێنی هەموو کارپێکراوەکان دەسڕێتەوە</string>\n    <string name=\"delete_playback_states_alert\">شوێنی هەموو کارپێکراوەکان بسڕدرێتەوە؟</string>\n    <string name=\"drawer_header_description\">خزمەتگوزاری چەسپاو، ئێستا هەڵبژێردراو:</string>\n    <string name=\"no_one_watching\">هیچ کەسێک تەماشای ناکات</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s تەماشا دەکات</item>\n        <item quantity=\"other\">%s تەماشا دەکەن</item>\n    </plurals>\n    <string name=\"no_one_listening\">هیچ کەسێ گوێی لێ ناگرێ</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s گوێی لێدەگرێ</item>\n        <item quantity=\"other\">%s گوێی لێدەگرن</item>\n    </plurals>\n    <string name=\"use_inexact_seek_summary\">بردنەپێشی ناتەواوی خێرا وا لە لێدەرەکە دەکات کە بەخێرایی شوێنەکە بگۆڕێت. بردنەپێشی ٥ یان ١٥ یان ٢٥ چرکەیی لەگەڵ ئەمەدا کارناکات.</string>\n    <string name=\"auto_queue_summary\">پاشکۆی خۆکاری پەخشێکی بەستراوە لەکاتی لێدانەوەی کۆتا پەخشدا</string>\n    <string name=\"enable_search_history_summary\">کۆگای گەڕانی نێوخۆیی</string>\n    <string name=\"resume_on_audio_focus_gain_title\">دەسپێکردنەوەی کارپێکراو</string>\n    <string name=\"show_hold_to_append_title\">پیشاندانی ڕێنمایی ”داگرتن تا پاشکۆ”</string>\n    <string name=\"show_hold_to_append_summary\">پیشاندانی ڕێنمایی کاتێ لە پاشبنەما یاخوود پەنجەرەدا گرتە دەکرێ لەسەر وردەکاری ڤیدیۆیەک</string>\n    <string name=\"settings_category_player_behavior_title\">پەرەسەندوو</string>\n    <string name=\"player_unrecoverable_failure\">نەگێڕانەوەی کارپێکەر بۆ پێش کێشە ڕوویدا</string>\n    <string name=\"player_recoverable_failure\">گێڕانەوەی کارپێکەر بۆکاتی پێش کێشە</string>\n    <string name=\"invalid_directory\">هەمان فۆڵدەر بوونی نییە</string>\n    <string name=\"invalid_source\">هەمان فایل/بابەت بوونی نییە</string>\n    <string name=\"info_labels\">چی:\\nداواکراو:\\nناوەڕۆک:\\nلانگ:\\nخزمەتگوزاری:\\nGMT:\\nکات:\\nپاکێج:\\nوەشان:\\nوەشانی سیستەم:</string>\n    <string name=\"settings_file_charset_title\">هێما ڕێگەپێدراوەکان لە فایلێکی ناویدا</string>\n    <string name=\"settings_file_replacement_character_summary\">هێما نادروستەکان بەم بەهایە جێگۆڕکێ دەکرێن</string>\n    <string name=\"settings_file_replacement_character_title\">هێمای جێگۆڕین</string>\n    <string name=\"title_licenses\">مۆڵەتنامەی ئەپ</string>\n    <string name=\"app_description\">ئەپێکی خۆڕایی و کێشی کەم تایبەت بە یوتوب لەسەر ئەندرۆید.</string>\n    <string name=\"app_license_title\">مۆڵەتنامەی ئەپ</string>\n    <string name=\"blank_page_summary\">پەڕەی بەتاڵ</string>\n    <string name=\"kiosk_page_summary\">پەڕەی کیۆسک</string>\n    <string name=\"channel_page_summary\">پەڕەی کەناڵەکان</string>\n    <string name=\"select_a_channel\">هەڵبژاردنی کەناڵ</string>\n    <string name=\"no_channel_subscribed_yet\">هیچ کەناڵێکی بەشداری نییە</string>\n    <string name=\"select_a_kiosk\">هەڵبژاردنی کیۆسک</string>\n    <string name=\"export_complete_toast\">هاوردەکرا</string>\n    <string name=\"import_complete_toast\">هەناردەکرا</string>\n    <string name=\"no_valid_zip_file\">فایلی ZIP دروست نییە</string>\n    <string name=\"could_not_import_all_files\">ئاگاداربە: ناتوانرێ هەموو فایلەکان هەناردەبکرێن.</string>\n    <string name=\"override_current_data\">ئەمە لەسەر ڕێکخستنەکانی ئێستات جێگیردەبێت.</string>\n    <string name=\"trending\">پڕبینەرەکان</string>\n    <string name=\"top_50\">باشترین 50</string>\n    <string name=\"new_and_hot\">نوێ و چالاک</string>\n    <string name=\"hold_to_append\">پەنجەت داگرە بۆ ڕیزنەبوون</string>\n    <string name=\"drawer_open\">کردنەوەی پلیکانە</string>\n    <string name=\"drawer_close\">داخستنی پلیکانە</string>\n    <string name=\"enable_leak_canary_summary\">چاودێری دزەکردنی بیرگە ڕەنگە ببێتە هۆی وەڵامنەدانەوەی لەکاتی گەرمبوون</string>\n    <string name=\"preferred_open_action_settings_title\">کرداری ’کردنەوە’ی پێشنیارکراو</string>\n    <string name=\"preferred_open_action_settings_summary\">کرداری بنەڕەتی لەکاتی کردنەوەی بابەت — %s</string>\n    <string name=\"import_settings\">ئایا دەتەوێت ڕێکخستنەکانیش هەناردەبکرێن؟</string>\n    <string name=\"start_accept_privacy_policy\">بۆ جێبەجێکردنی فرمانەکان لەگەڵ یاسای پاراستنی داتای گشتی ئەوروپیدا (GDPR) , ئێمە سەرنجت ڕادەکێشین بۆ سیاسەتە تایبەتییەکانی ئەپەکەمان. تکایە بەئاگادارییەوە بیخوێنەوە.\n\\nپێویستە قبوڵی بکەیت بۆ ناردنی سکاڵاکانت.</string>\n    <string name=\"accept\">پەسەند</string>\n    <string name=\"decline\">ڕەتکردنەوە</string>\n    <string name=\"limit_data_usage_none_description\">بێ سنوور</string>\n    <string name=\"limit_mobile_data_usage_title\">سنووری قەبارە لەکاتی بەکارهێنانی داتای مۆبایل</string>\n    <string name=\"minimize_on_exit_title\">بچوکبوونەوە لەکاتی گۆڕینی ئەپ</string>\n    <string name=\"minimize_on_exit_summary\">کرداری کاتی گۆڕین بۆ ئەپێکیتر لە کارپێکەری ڤیدیۆییەوە — %s</string>\n    <string name=\"minimize_on_exit_none_description\">هیچیان</string>\n    <string name=\"minimize_on_exit_background_description\">بچوککردنەوە بۆ کارپێکەری پاشبنەما</string>\n    <string name=\"minimize_on_exit_popup_description\">بچووککردنەوە بۆ پەنجەرە</string>\n    <string name=\"skip_silence_checkbox\">بردنەپێشەوەی خێرا لەکاتی بێدەنگکردن</string>\n    <string name=\"playback_step\">هەنگاو</string>\n    <string name=\"playback_reset\">ڕێکخستنەوە</string>\n    <string name=\"saved_tabs_invalid_json\">پەڕە بنەڕەتییەکان بەکاردەبردرێن, ناتوانرێ پەڕە پاشەکەوتکراوەکان بخوێنرێنەوە</string>\n    <string name=\"main_page_content_summary\">چ پەڕەیەک نیشانبدرێ لە پەڕەی سەرەکی</string>\n    <string name=\"updates_setting_title\">نوێکارییەکان</string>\n    <string name=\"updates_setting_description\">پیشاندانی پەیامێک بۆ ئامادەبوونی ئەپ لەکاتی بەردەست بوونی وەشانی نوێ</string>\n    <string name=\"list_view_mode\">شێوازی پیشاندانی خشتە</string>\n    <string name=\"list\">خشتە</string>\n    <string name=\"grid\">چوارخانە</string>\n    <string name=\"auto\">خۆکاری</string>\n    <string name=\"app_update_available_notification_title\">وەشانی نوێی ئەپ بەردەستە!</string>\n    <string name=\"missions_header_finished\">تەواوبوو</string>\n    <string name=\"missions_header_pending\">لە نۆرەیە</string>\n    <string name=\"paused\">وەستاوە</string>\n    <string name=\"queued\">لەڕیزدایە</string>\n    <string name=\"post_processing\">چارەسەردەکرێت</string>\n    <string name=\"enqueue\">لە ڕیز</string>\n    <string name=\"permission_denied\">کردار ڕەتکرایەوە لەلایەن سیستەمەوە</string>\n    <string name=\"download_failed\">دابەزاندن کەوت</string>\n    <string name=\"generate_unique_name\">دانانی ناوی نوێ</string>\n    <string name=\"overwrite\">جێگیرکردن</string>\n    <string name=\"conferences\">کۆنفرانسەکان</string>\n    <string name=\"error_unable_to_load_comments\">ناتوانرێ لێدوانەکان باربکرێ</string>\n    <string name=\"enable_playback_state_lists_summary\">پیشاندانی نیشانەکەری شوێنی کارپێکراو لە لیستەکان</string>\n    <string name=\"overwrite_unrelated_warning\">فایلێک بەهەمان ناو هەیە</string>\n    <string name=\"overwrite_finished_warning\">فایلێکی دابەزێنراو بەم ناوەوە هەیە</string>\n    <string name=\"overwrite_failed\">ناتوانرێ لەسەر ئەو فایلە جێگیربکرێ</string>\n    <string name=\"default_kiosk_page_summary\">پەڕەی بنەڕەتی</string>\n    <string name=\"seek_duration_title\">ماوەی خێرا بردنە پێشەوە\\\\ گێڕانەوە بۆ دواوە</string>\n    <string name=\"peertube_instance_url_title\">دۆخی پێرتووبی</string>\n    <string name=\"peertube_instance_url_summary\">دۆخە دڵخوازەکانی پێرتووبی دیاریبکە</string>\n    <string name=\"peertube_instance_url_help\">ئەو دۆخانە بدۆزەرەوە کە لەگەڵ خۆتدا دەگونجێن لە %s</string>\n    <string name=\"peertube_instance_add_title\">زیادکردنی دۆخ</string>\n    <string name=\"peertube_instance_add_help\">بەستەری دۆخ دابنێ</string>\n    <string name=\"peertube_instance_add_fail\">ناتوانرێ پشتگیری دۆخەکە بکرێ</string>\n    <string name=\"peertube_instance_add_https_only\">تەنها بەستەرەکانی https پشتگیریکراون</string>\n    <string name=\"peertube_instance_add_exists\">هەمان دۆخ کاراکراوە</string>\n    <string name=\"error_http_not_found\">نەدۆزرایەوە</string>\n    <string name=\"error_postprocessing_failed\">چارەسەرکردن شکستی هێنا</string>\n    <string name=\"stop\">ڕاگرتن</string>\n    <string name=\"max_retry_msg\">زیاترین هەوڵدانەکان</string>\n    <string name=\"max_retry_desc\">زۆرترین ژمارەی هەوڵدان پێش پاشگەزبوونەوە لە دابەزاندنەکە</string>\n    <string name=\"pause_downloads_on_mobile\">ڕاوەستا لەسەر کێشەی هێڵ</string>\n    <string name=\"pause_downloads_on_mobile_desc\">بەسوودە بۆ کاتی گۆڕینی هێڵ بۆ داتای مۆبایل, لەگەڵ ئەوەشدا زۆربەی دابەزاندنەکان ڕاناگرێت</string>\n    <string name=\"close\">داخستن</string>\n    <string name=\"error_postprocessing_stopped\">ئەپ داخرا لەکاتی کارکردن لەسەر ئەو پەڕگەیە</string>\n    <string name=\"error_insufficient_storage_left\">بیرگەی ناوەکیت پڕبووە</string>\n    <string name=\"error_progress_lost\">کردارەکە شکستی هێنا, چونکە ئەو پەڕگەیە سڕاوەتەوە</string>\n    <string name=\"error_timeout\">هێڵی ئینتەرنێت نەما</string>\n    <string name=\"confirm_prompt\">ئایا دەتەوێ مێژووی دابەزاندنەکانت بسڕدرێنەوە یان هەموو فایلە دابەزێنراوەکانت بسڕدرێنەوە؟</string>\n    <string name=\"enable_queue_limit\">سنوری ڕیزبوونی دابەزاندن</string>\n    <string name=\"enable_queue_limit_desc\">تەنها یەک دابەزاندن کاردەکات لەیەک کاتدا</string>\n    <string name=\"start_downloads\">دەستپێکردنەوەی دابەزاندنەکان</string>\n    <string name=\"pause_downloads\">ڕاگرتنی دابەزاندنەکان</string>\n    <string name=\"downloads_storage_ask_title\">پرسیاربکرێ لەکوێ دابەزێنرێت</string>\n    <string name=\"downloads_storage_ask_summary\">پرسیارت لێ دەکرێت بۆ شوێنی دابەزاندنی هەر پەڕگەیەک</string>\n    <string name=\"downloads_storage_use_saf_title\">بەکارهێنانی SAF</string>\n    <string name=\"downloads_storage_use_saf_summary\">چوارچێوەی گەیشتن بە بیرگە ڕێگەدەدات بە دابەزاندنی پەڕگەکان لە بیرگەی دەرەکیدا.\n\\nتێبینی: هەندێ لە مۆبایلەکان پشتگیری ناکرێن</string>\n    <string name=\"local\">ناوخۆ</string>\n    <string name=\"recently_added\">لەم ماوەیەدا بڵاوکرابێتەوە</string>\n    <string name=\"most_liked\">زۆرترین بەدڵبوون</string>\n    <string name=\"playlist_no_uploader\">خۆکاری دانرا (هیچ بەرزکەرەوەیەک نەدۆزرایەوە)</string>\n    <string name=\"recovering\">دەگەڕێنرێتەوە</string>\n    <string name=\"error_download_resource_gone\">ناتوانرێ ئەم دابەزاندنە بهێنرێتەوە</string>\n    <string name=\"choose_instance_prompt\">دۆخێک هەڵبژێرە</string>\n    <string name=\"clear_download_history\">سڕینەوەی مێژووی دابەزاندن</string>\n    <string name=\"delete_downloaded_files\">سڕینەوەی فایلە دابەزێنراوەکان</string>\n    <string name=\"permission_display_over_apps\">دەسەڵاتی پێبدە بۆ پیشاندان لەسەرووی ئەپەکانیترەوە</string>\n    <string name=\"app_language_title\">زمانی ئەپ</string>\n    <string name=\"systems_language\">بنەڕەتی سیستەم</string>\n    <string name=\"subtitle_activity_recaptcha\">گرتە بکە لەسەر ”تەواو” کاتێ کە چارەسەرکرا</string>\n    <string name=\"done\">تەواو</string>\n    <string name=\"videos_string\">ڤیدیۆکان</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d چرکە</item>\n        <item quantity=\"other\">%d چرکە</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">بەهۆی ExoPlayer ەوە ماوەی بردنەپێش و بردنەپاش لە %d چرکەدا دیاریکرا</string>\n    <string name=\"mute\">کپ</string>\n    <string name=\"unmute\">کپ نەکردن</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d خولەک</item>\n        <item quantity=\"other\">%d خولەك</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d کاتژمێر</item>\n        <item quantity=\"other\">%d کات ژمێر</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d ڕۆژ</item>\n        <item quantity=\"other\">%d ڕۆژەکان</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">کۆمەڵەی کەناڵەکان</string>\n    <string name=\"feed_oldest_subscription_update\">دواین نوێکردنەوە: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">بارنەکراو : %d</string>\n    <string name=\"feed_notification_loading\">بارکردن…</string>\n    <string name=\"feed_processing_message\">ئامادەکردن…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">دیاریکردنی بەشدارییەکان</string>\n    <string name=\"feed_group_dialog_empty_selection\">هیچ بەشدارییەک دیاری نەکراوە</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d دیاریکراو</item>\n        <item quantity=\"other\">%d هەڵبژێردراو</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">ناوی کۆمەڵە بەتاڵە</string>\n    <string name=\"feed_group_dialog_delete_message\">ئایا دەتەوێ ئەم کۆمەڵەیە بسڕیتەوە؟</string>\n    <string name=\"feed_create_new_group_button_title\">نوێ</string>\n    <string name=\"settings_category_feed_title\">دیار</string>\n    <string name=\"feed_update_threshold_title\">نوێکاری دیار</string>\n    <string name=\"feed_update_threshold_summary\">کاتی پاش دواین نوێکردنەوە دوای بەشداربوون ڕەچاوکراوە — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">هەمیشە نوێکردنەوە</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">تێکەڵکردن لە دیاری تەرخانکراوەوە کاتێ بەردەست بوو</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">لەهەندێ خزمەتگوزاریدا بەردەستە، هەمیشە خێرایە بەڵام ڕەنگە هەندێ لە بابەتەکان زانیارییەکانیان ناتەواو بێت (وەک نەبوونی ماوە، جۆری بابەت ، نەبوونی پەخش).</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">چالاککردنی دۆخی خێرا</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">چالاک نەکردنی دۆخی خێرا</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">ئایا توانای بارکردن لاوازە؟ گەر وایە ئەوا بارکردنی خێرا تاقی بکەرەوە (دەتوانی بیگۆڕیت لە بەشی ڕێکخستنەکان لەڕێگای گرتەکردن لەم دوگمەیەی خوارەوە).\n\\n\n\\nئەم ئەپە دوو شێوازی بارکردنت بۆ پێشنیاز دەکات:\n\\n- بارکردنی تەواوی کەناڵە بەشدارییەکانت، ئەمەیان خاوە بەڵام تەواوە.\n\\n- تەرخانکردنی خزمەتگوزارییەکان ئەمەیان خێرایە بەڵام زۆر تەواو نییە.</string>\n    <string name=\"content_not_supported\">ئەم ناوەڕۆکە پشتگیری نەکراوە لەلایەن ئەپەکەمانەوە.\n\\n\n\\nهیوادارین بتوانین لە وەشانەکانی داهاتوودا پشتگیری بکەین.</string>\n    <string name=\"restricted_video\">ئەم ڤیدیۆیە بۆ تەمەن سنوردارە.\n\\n\n\\n%1$s کارا بکە لە ڕێکخستنەکان گەر دەتەوێت بیبینیت.</string>\n    <string name=\"infinite_videos\">∞ ڤیدیۆ</string>\n    <string name=\"more_than_100_videos\">+١٠٠ ڤیدیۆ</string>\n    <string name=\"artists\">هونەرمەندەکان</string>\n    <string name=\"albums\">ئەلبوومەکان</string>\n    <string name=\"songs\">گۆرانییەکان</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">بەڵێ، لەگەڵ ڤیدیۆ تەماشاکراوەکانەوە</string>\n    <string name=\"remove_watched_popup_warning\">ئەو ڤیدیۆیانەی پێشتر سەیرت کردوون و دواتر زیادت کردوون بۆ لیستەلێدان دەسڕێنەوە. \\nئایا دڵنیایت؟ ئەمە ناگەڕێنرێتەوە!</string>\n    <string name=\"remove_watched_popup_title\">ڤیدیۆ تەماشاکراوەکان بسڕێنەوە؟</string>\n    <string name=\"remove_watched\">سڕینەوەی تەماشاکراوەکان</string>\n    <string name=\"show_original_time_ago_summary\">دەقە بنچینەییەکان لە خزمەتگوزارییەکانەوە لە بابەتی پەخشەکاندا دیار دەبن</string>\n    <string name=\"show_original_time_ago_title\">پیشاندانی کاتی بنچینەیی پێشوو لەسەر بابەتەکان</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">کاراکردنی (دۆخی قەدەغەکراو)ی یوتوب</string>\n    <string name=\"video_detail_by\">لەلایەن %s</string>\n    <string name=\"channel_created_by\">دروستکراو لەلایەن %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">وێنۆچکەی کەناڵ</string>\n    <string name=\"select_a_playlist\">لیستەلێدان دیاربکە</string>\n    <string name=\"error_report_open_issue_button_text\">سکاڵا لەسەر GitHub</string>\n    <string name=\"copy_for_github\">لەبەرگرتنەوەی سکاڵا</string>\n    <string name=\"search_showing_result_for\">پیشاندانی ئەنجامەکان بۆ: %s</string>\n    <string name=\"clear_queue_confirmation_summary\">گۆڕینی لێدەری یەکەم بۆ دانەیەکیتر ڕەنگە ڕیزەکانت تێکەڵ بن</string>\n    <string name=\"clear_queue_confirmation_title\">پرس بکرێ بۆ دڵنیابوونەوە پێش سڕینەوەی ڕیزێک</string>\n    <string name=\"playlist_page_summary\">پەڕەی لیستەلێدان</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">تەنها بەشدارییە کۆمەڵە نەکراوەکان پیشاندرێ</string>\n    <string name=\"never\">هەرگیز</string>\n    <string name=\"wifi_only\">تەنها لەسەر وایفای</string>\n    <string name=\"autoplay_summary\">دەسپێکردنی کارپێکەر بەخۆکاری — %s</string>\n    <string name=\"title_activity_play_queue\">لێدانی ڕیز</string>\n    <string name=\"no_playlist_bookmarked_yet\">هیچ لیستەلێدانێک نیشانە نەکراوە</string>\n    <string name=\"unsupported_url_dialog_message\">بەستەرەکە نەناسرایەوە. لە ئەپێکیتردا بکرێتەوە؟</string>\n    <string name=\"auto_queue_toggle\">ڕیزبوونی خۆکار</string>\n    <string name=\"clear_queue_confirmation_description\">ڕیزی لێدەری چالاک جێیدەگیرێتەوە</string>\n    <string name=\"notification_action_nothing\">هیچێک</string>\n    <string name=\"notification_action_shuffle\">تێکەڵاو</string>\n    <string name=\"notification_action_repeat\">لێدانەوە</string>\n    <string name=\"notification_action_4_title\">پێنجەم کردەی دوگمە</string>\n    <string name=\"notification_action_3_title\">چوارەم کردەی دوگمە</string>\n    <string name=\"notification_action_2_title\">سێیەم کردەی دوگمە</string>\n    <string name=\"notification_action_1_title\">دووەم کردەی دوگمە</string>\n    <string name=\"notification_action_0_title\">یەکەم کردەی دوگمە</string>\n    <string name=\"notification_scale_to_square_image_summary\">وێنۆچکەی ئەو ڤیدیۆیەی کە لە پەیامەوە دەردەکەوێ ، دەیگۆڕی لەڕەهەندی 16:9 ەوە بۆ 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">گونجاندنی وێنۆچکە بۆ ڕەهەندی 1:1</string>\n    <string name=\"no_app_to_open_intent\">هیچ ئەپێکی مۆبایلەکەت توانای کردنەوەی نییە</string>\n    <string name=\"recent\">دوایین</string>\n    <string name=\"show_thumbnail_title\">پیشاندانی وێنۆچکە</string>\n    <string name=\"description_tab_description\">وەسف</string>\n    <string name=\"related_items_tab_description\">پەخشی لێکچوو</string>\n    <string name=\"comments_tab_description\">لێدوانەکان</string>\n    <string name=\"recaptcha_cookies_cleared\">شەکرۆکەکانی reCAPTCHA سڕانەوە</string>\n    <string name=\"clear_cookie_title\">سڕینەوەی شەکرۆکەکانی RECAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">یوتوب ”دۆخی قەدەغەکراو” دابین ئەکات بۆ شاردنەوەی ناوەڕۆکە سنوردارکراوەکان</string>\n    <string name=\"show_age_restricted_content_summary\">پیشاندانی ناوەڕۆکی نەگونجاوی بینینی ڤیدیۆ بەهۆی هەبوونی سنووری تەمەنەوە (وەک +18)</string>\n    <string name=\"show_meta_info_summary\">ناکارای بکە بۆ شاردنەوەی پاکەتی زانیاری ناساندن لەگەڵ زانیارییە پاشکۆکان لەبارەی دانەری پەخش ، ناوەڕۆکی پەخش یاخوود داواکاری گەڕان.</string>\n    <string name=\"show_meta_info_title\">پیشاندانی زانیاری ناسین</string>\n    <string name=\"notification_colorize_summary\">شازدانی ڕەنگی پەیامەکانی ئەندرۆید بەپێی ڕەنگی سەرەکی وێنۆچکە (تێبینی ئەمە لەسەرجەم ئامێرەکان بەردەست نییە)</string>\n    <string name=\"notification_colorize_title\">ڕەنگینی پەیام</string>\n    <string name=\"show_description_summary\">ناکارای بکە بۆ شاردنەوەی وەسف و زانیارییەکانی ڤیدیۆ</string>\n    <string name=\"show_description_title\">پیشاندانی وەسف</string>\n    <string name=\"open_with\">کردنەوە بە</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-la/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"unmute\">Immuta</string>\n    <string name=\"mute\">Muta</string>\n    <string name=\"updates_setting_title\">Renovationes</string>\n    <string name=\"error_snackbar_action\">Reporta</string>\n    <string name=\"error_http_not_found\">Non invenit</string>\n    <string name=\"error_file_creation\">Creavit file non potui</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dies</item>\n        <item quantity=\"other\">%d dies</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d hora</item>\n        <item quantity=\"other\">%d horae</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minutum</item>\n        <item quantity=\"other\">%d minuta</item>\n    </plurals>\n    <string name=\"minimize_on_exit_none_description\">Nullus</string>\n    <string name=\"msg_error\">Error</string>\n    <string name=\"msg_wait\">Mane…</string>\n    <string name=\"controls_add_to_playlist_title\">Adde ad</string>\n    <string name=\"tab_choose\">Elige tab</string>\n    <string name=\"tab_subscriptions\">Iscriptiones</string>\n    <string name=\"show_info\">Informationes ostende</string>\n    <string name=\"subscription_update_failed\">Non potui inscription renovare</string>\n    <string name=\"subscription_change_failed\">Non potui inscription mutare</string>\n    <string name=\"channel_unsubscribed\">Canalem inscripsit</string>\n    <string name=\"unsubscribe\">Inscribe</string>\n    <string name=\"subscribed_button_title\">Scriptum</string>\n    <string name=\"subscribe_button_title\">Scribe</string>\n    <string name=\"no_player_found_toast\">Nullus amnem amnibus invenit (potes instalar VLC quia id ludere).</string>\n    <string name=\"no_player_found\">Nullus amnem amnibus invenit. Instalar VLC\\?</string>\n    <string name=\"controls_download_desc\">Scarica amnem file</string>\n    <string name=\"use_external_audio_player_title\">Utere ludionem externum</string>\n    <string name=\"use_external_video_player_summary\">Removes sentum aliquas resolutionibus</string>\n    <string name=\"use_external_video_player_title\">Utere lectorem externum</string>\n    <string name=\"share_dialog_title\">Condividi apud</string>\n    <string name=\"search_showing_result_for\">Praecessi propter: %s</string>\n    <string name=\"did_you_mean\">Intendi \\\"%1$s\\\"\\?</string>\n    <string name=\"settings\">Optiones</string>\n    <string name=\"main_bg_subtitle\">Tange \\\"Quaere\\\" ad initium</string>\n    <string name=\"search\">Quaerere</string>\n    <string name=\"download\">Scarica</string>\n    <string name=\"share\">Condividi</string>\n    <string name=\"open_with\">Aperi apud</string>\n    <string name=\"open_in_popup_mode\">Aperi in popup mode</string>\n    <string name=\"open_in_browser\">Aperi in browser</string>\n    <string name=\"cancel\">Inrita</string>\n    <string name=\"install\">instalar</string>\n    <string name=\"upload_date_text\">Edita %1$s</string>\n    <string name=\"start\">Initio</string>\n    <string name=\"pause\">Pausa</string>\n    <string name=\"playback_reset\">Repone</string>\n    <string name=\"channels\">Canales</string>\n    <string name=\"all\">Omnis</string>\n    <string name=\"albums\">Collectio</string>\n    <string name=\"songs\">Cantica</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s signator</item>\n        <item quantity=\"other\">%s signatores</item>\n    </plurals>\n    <string name=\"no_subscribers\">Nulli signatores</string>\n    <string name=\"search_no_results\">Nullae resultationes</string>\n    <string name=\"settings_category_appearance_title\">Apparentia</string>\n    <string name=\"settings_category_player_behavior_title\">Mos</string>\n    <string name=\"notification_channel_name\">NewPipe notitia</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s audiens</item>\n        <item quantity=\"other\">%s audientes</item>\n    </plurals>\n    <string name=\"decline\">Declina</string>\n    <string name=\"delete\">Dele</string>\n    <string name=\"create\">Crea</string>\n    <string name=\"accept\">Accipe</string>\n    <string name=\"name\">Nomin</string>\n    <string name=\"max_retry_msg\">Retentati maximi</string>\n    <string name=\"retry\">Retentare</string>\n    <string name=\"local\">Localis</string>\n    <string name=\"new_and_hot\">Novi popularesque</string>\n    <string name=\"rename_playlist\">Renomina</string>\n    <string name=\"donation_title\">Dona</string>\n    <string name=\"dismiss\">Dimitte</string>\n    <string name=\"never\">Namquam</string>\n    <string name=\"chapters\">Capitulum</string>\n    <string name=\"recent\">Recensi</string>\n    <string name=\"paused\">Pausa</string>\n    <string name=\"missions_header_pending\">Pendens</string>\n    <string name=\"missions_header_finished\">Finii</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d secundus</item>\n        <item quantity=\"other\">%d secundi</item>\n    </plurals>\n    <string name=\"done\">Factum</string>\n    <string name=\"always_ask_open_action\">Quaere semper</string>\n    <string name=\"list\">Index</string>\n    <string name=\"limit_data_usage_none_description\">Nullus limus</string>\n    <string name=\"night_theme_title\">Thema noctis</string>\n    <string name=\"caption_none\">Nullae captiones</string>\n    <string name=\"no_comments\">Nullae commentaria</string>\n    <string name=\"comments_tab_description\">Commentaria</string>\n    <string name=\"your_comment\">Commentarium tuum (In Anglico):</string>\n    <string name=\"show_comments_title\">Ostende commentarium</string>\n    <string name=\"notification_action_shuffle\">Misce</string>\n    <string name=\"notification_action_repeat\">Repete</string>\n    <string name=\"notification_action_nothing\">Nihil</string>\n    <string name=\"just_once\">Semel</string>\n    <string name=\"always\">Semper</string>\n    <string name=\"play_all\">Lude omnes</string>\n    <string name=\"player_stream_failure\">Non possum ludere hic amnis</string>\n    <string name=\"playback_step\">Passus</string>\n    <string name=\"playback_tempo\">Tempus</string>\n    <string name=\"play_queue_remove\">Remove</string>\n    <string name=\"black_theme_title\">Niger</string>\n    <string name=\"dark_theme_title\">Obscurum</string>\n    <string name=\"light_theme_title\">Lux</string>\n    <string name=\"caption_setting_title\">Captiones</string>\n    <string name=\"caption_auto_generated\">Auto-generare</string>\n    <string name=\"resize_zoom\">Retrahe</string>\n    <string name=\"resize_fill\">Satiatus</string>\n    <string name=\"resize_fit\">Aptus</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-land/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- Video Item Search View Dimensions-->\n    <!-- Text Size -->\n    <dimen name=\"channel_item_detail_title_text_size\">18sp</dimen>\n    <dimen name=\"video_item_search_title_text_size\">16sp</dimen>\n    <dimen name=\"video_item_search_duration_text_size\">12sp</dimen>\n    <dimen name=\"video_item_search_uploader_text_size\">14sp</dimen>\n    <dimen name=\"video_item_search_upload_date_text_size\">14sp</dimen>\n    <!-- Elements Size -->\n    <!-- 16 / 9 ratio-->\n    <dimen name=\"video_item_search_thumbnail_image_width\">142dp</dimen>\n    <dimen name=\"video_item_search_thumbnail_image_height\">80dp</dimen>\n    <dimen name=\"video_item_search_avatar_image_width\">80dp</dimen>\n    <dimen name=\"video_item_search_avatar_image_height\">80dp</dimen>\n    <dimen name=\"video_item_search_avatar_left_margin\">31dp</dimen>\n    <dimen name=\"video_item_search_avatar_right_margin\">41dp</dimen>\n    <!-- Calculated: 2*video_item_search_padding + video_item_search_thumbnail_image_height -->\n    <dimen name=\"video_item_search_height\">106dp</dimen>\n    <!-- Paddings & Margins -->\n    <dimen name=\"video_item_search_image_right_margin\">10dp</dimen>\n    <dimen name=\"video_item_search_duration_vertical_padding\">1sp</dimen>\n    <dimen name=\"video_item_search_duration_horizontal_padding\">7sp</dimen>\n\n    <!-- Video Item Detail View Dimensions-->\n    <!-- Text Size -->\n    <dimen name=\"video_item_detail_title_text_size\">16sp</dimen>\n    <dimen name=\"video_item_detail_views_text_size\">14sp</dimen>\n    <dimen name=\"video_item_detail_likes_text_size\">13sp</dimen>\n    <dimen name=\"video_item_detail_uploader_text_size\">12sp</dimen>\n    <dimen name=\"video_item_detail_sub_channel_text_size\">16sp</dimen>\n    <dimen name=\"video_item_detail_upload_date_text_size\">14sp</dimen>\n    <dimen name=\"video_item_detail_description_text_size\">14sp</dimen>\n    <dimen name=\"channel_rss_title_size\">14sp</dimen>\n    <!-- Elements Size -->\n    <dimen name=\"video_item_detail_uploader_image_size\">42dp</dimen>\n    <dimen name=\"video_item_detail_sub_channel_image_size\">21dp</dimen>\n    <dimen name=\"video_item_detail_like_image_height\">20sp</dimen>\n    <dimen name=\"video_item_detail_like_image_width\">20sp</dimen>\n    <dimen name=\"channel_avatar_size\">90dp</dimen>\n    <dimen name=\"sub_channel_avatar_size\">45dp</dimen>\n    <!-- Paddings & Margins -->\n    <dimen name=\"video_item_detail_pinned_right_margin\">8dp</dimen>\n    <dimen name=\"video_item_detail_like_margin\">8dp</dimen>\n    <dimen name=\"video_item_detail_error_panel_margin\">4dp</dimen>\n\n    <!-- Playlist View Dimensions-->\n    <!-- Elements Size -->\n    <dimen name=\"playlist_item_thumbnail_stream_count_width\">70dp</dimen>\n\n    <!-- File picker dimensions -->\n    <dimen name=\"file_picker_items_text_size\">16sp</dimen>\n\n    <dimen name=\"search_suggestion_text_size\">14sp</dimen>\n\n    <dimen name=\"comment_item_avatar_right_margin\">13dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-lmo/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Pigia la lente per inziaa.</string>\n    <string name=\"channels\">Canai</string>\n    <string name=\"upload_date_text\">Mandad fœra el %1$s</string>\n    <string name=\"install\">Installa</string>\n    <string name=\"cancel\">Scassa</string>\n    <string name=\"ok\">Va ben</string>\n    <string name=\"yes\">Sì</string>\n    <string name=\"no\">No</string>\n    <string name=\"open_in_browser\">Derva ind el browser</string>\n    <string name=\"mark_as_watched\">Marca tant\\'mè vardad</string>\n    <string name=\"open_in_popup_mode\">Derva a fenestra</string>\n    <string name=\"open_with\">Derva con</string>\n    <string name=\"share\">Spantega</string>\n    <string name=\"download\">Descarga</string>\n    <string name=\"search\">Cerca</string>\n    <string name=\"search_with_service_name\">Cerca %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Cerca %1$s (%2$s)</string>\n    <string name=\"settings\">Impostazione</string>\n    <string name=\"did_you_mean\">Vœlevet dir \\\"%1$s\\\"?</string>\n    <string name=\"search_showing_result_for\">Adree a far vider i resultads per: %s</string>\n    <string name=\"share_dialog_title\">Spantega con</string>\n    <string name=\"use_external_video_player_summary\">Al tira via el son ind una quai resoluzion</string>\n    <string name=\"subscribe_button_title\">Inscrivess</string>\n    <string name=\"subscribed_button_title\">Inscrivud</string>\n    <string name=\"unsubscribe\">Tira via inscrizion</string>\n    <string name=\"channel_unsubscribed\">Tœvuda via l\\'inscrizion</string>\n    <string name=\"subscription_change_failed\">L\\'è stait minga possibil de mudar l\\'inscrizion</string>\n    <string name=\"subscription_update_failed\">L\\'è stait minga possibil d\\'atualizar l\\'inscrizion</string>\n    <string name=\"show_info\">Fà vider informazione</string>\n    <string name=\"tab_subscriptions\">Inscrizione</string>\n    <string name=\"tab_choose\">Cerniss sqeda</string>\n    <string name=\"controls_background_title\">Fond</string>\n    <string name=\"controls_popup_title\">Fenestra</string>\n    <string name=\"controls_add_to_playlist_title\">Jonta a</string>\n    <string name=\"download_path_title\">Cartella dei video descargads</string>\n    <string name=\"download_path_summary\">I video descargads inn rejistrads qì</string>\n    <string name=\"download_path_dialog_title\">Cerniss una cartella per i fail video</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-lt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Norėdami pradėti paspauskite padidinimo stiklą.</string>\n    <string name=\"upload_date_text\">Publikuota %1$s</string>\n    <string name=\"no_player_found\">Nerastas srauto grotuvas. Įdiegti VLC\\?</string>\n    <string name=\"install\">Įdiegti</string>\n    <string name=\"cancel\">Atšaukti</string>\n    <string name=\"open_in_browser\">Atverti naršyklėje</string>\n    <string name=\"open_in_popup_mode\">Atverti iššokančio lango režime</string>\n    <string name=\"share\">Dalintis</string>\n    <string name=\"download\">Atsisiųsti</string>\n    <string name=\"search\">Paieška</string>\n    <string name=\"settings\">Nustatymai</string>\n    <string name=\"did_you_mean\">Ar turėjote omenyje %1$s ?</string>\n    <string name=\"share_dialog_title\">Dalintis su</string>\n    <string name=\"use_external_video_player_title\">Naudoti išorinį vaizdo grotuvą</string>\n    <string name=\"use_external_video_player_summary\">Kai kurios raiškos nepalaiko garso, kai ši parinktis įgalinta</string>\n    <string name=\"use_external_audio_player_title\">Naudoti išorinį audio grotuvą</string>\n    <string name=\"controls_background_title\">Groti fone</string>\n    <string name=\"controls_popup_title\">Groti iššokančiame lange</string>\n    <string name=\"download_path_title\">Vaizdo įrašų parsisiuntimo aplankas</string>\n    <string name=\"download_path_summary\">Vieta parsisiųstų vaizdo įrašų laikymui</string>\n    <string name=\"download_path_dialog_title\">Pasirinkite parsiuntimo aplankalą vaizdo įrašams</string>\n    <string name=\"download_path_audio_title\">Garso įrašų parsiuntimo aplankalas</string>\n    <string name=\"download_path_audio_summary\">Vieta laikyti parsisiųstus garso įrašus</string>\n    <string name=\"download_path_audio_dialog_title\">Pasirinkite atsisiuntimų aplankalą garso įrašams</string>\n    <string name=\"default_resolution_title\">Numatytoji raiška</string>\n    <string name=\"default_popup_resolution_title\">Numatytoji išokančiojo lango raiška</string>\n    <string name=\"show_higher_resolutions_title\">Rodyti didesnes raiškas</string>\n    <string name=\"show_higher_resolutions_summary\">Tik kai kurie įrenginiai palaiko 2K/4K vaizdo įrašų peržiūrą</string>\n    <string name=\"play_with_kodi_title\">Groti su Kodi</string>\n    <string name=\"kore_not_found\">Įdiegti nereastą Kode programėlę\\?</string>\n    <string name=\"show_play_with_kodi_title\">Rodyti „Peržiūra su Kodi“ pasirinkimą</string>\n    <string name=\"show_play_with_kodi_summary\">Rodyti pasirinkimą peržiūrėti vaizdo įrašus per Kodi mediacentrą</string>\n    <string name=\"play_audio\">Garso įrašas</string>\n    <string name=\"default_audio_format_title\">Numatytasis garso formatas</string>\n    <string name=\"default_video_format_title\">Numatytasis vaizdo formatas</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"light_theme_title\">Šviesi</string>\n    <string name=\"dark_theme_title\">Tamsi</string>\n    <string name=\"black_theme_title\">Juoda</string>\n    <string name=\"popup_remember_size_pos_title\">Prisiminti iššokančio lango dydį ir vietą</string>\n    <string name=\"popup_remember_size_pos_summary\">Prisiminti paskutinį iššokančio lango dydį ir vietą</string>\n    <string name=\"show_search_suggestions_title\">Paieškos nuspėjimai</string>\n    <string name=\"show_search_suggestions_summary\">Pasirinkite pasiūlymus, kurie bus rodomi ieškant</string>\n    <string name=\"download_dialog_title\">Atsisiųsti</string>\n    <string name=\"show_next_and_similar_title\">Rodyti „Kitas” ir „Panašūs” vaizdo įrašus</string>\n    <string name=\"unsupported_url\">URL nepalaikoma</string>\n    <string name=\"content_language_title\">Numatytoji turinio kalba</string>\n    <string name=\"settings_category_video_audio_title\">Vaizdas ir garsas</string>\n    <string name=\"settings_category_appearance_title\">Išvaizda</string>\n    <string name=\"background_player_playing_toast\">Groja fone</string>\n    <string name=\"popup_playing_toast\">Grojama iššokančiojo lango rėžime</string>\n    <string name=\"content\">Turinys</string>\n    <string name=\"show_age_restricted_content_title\">Rodyti amžiumi apribotą turinį</string>\n    <string name=\"duration_live\">Gyvai</string>\n    <string name=\"downloads\">Atsisiuntimai</string>\n    <string name=\"downloads_title\">Atsisiuntimai</string>\n    <string name=\"error_report_title\">Klaidų ataskaita</string>\n    <string name=\"all\">Visi</string>\n    <string name=\"disabled\">Išjungta</string>\n    <string name=\"clear\">Išvalyti</string>\n    <string name=\"best_resolution\">Geriausia raiška</string>\n    <string name=\"general_error\">Klaida</string>\n    <string name=\"network_error\">Tinklo klaida</string>\n    <string name=\"could_not_load_thumbnails\">Negalima įkelti visų miniatiūrų</string>\n    <string name=\"parsing_error\">Negalima apdoroti tinklapio</string>\n    <string name=\"content_not_available\">Turinys neprieinamas</string>\n    <string name=\"could_not_setup_download_menu\">Negalima sutvarkyti atsisiuntimų meniu</string>\n    <string name=\"app_ui_crash\">Programėlė/ vartotojo sąsaja nulūžo</string>\n    <string name=\"sorry_string\">Atsiprašome, taip neturėjo įvykti.</string>\n    <string name=\"error_report_button_text\">Pranešti el. paštu</string>\n    <string name=\"error_snackbar_message\">Atsiprašome, kažkas ne taip.</string>\n    <string name=\"error_snackbar_action\">Ataskaita</string>\n    <string name=\"what_device_headline\">Informacija:</string>\n    <string name=\"what_happened_headline\">Kas nutiko:</string>\n    <string name=\"info_labels\">Kas:\\nUžklausa:\\nTurinio Kalba:\\nTurinio Šalis:\\nProgramėlės Kalba:\\nPaslauga:\\nGMT Laikas:\\nPaketas:\\nVersija:\\nOS versija:</string>\n    <string name=\"your_comment\">Jūsų komentaras (anglų kalba):</string>\n    <string name=\"error_details_headline\">Išsami informacija:</string>\n    <string name=\"detail_thumbnail_view_description\">Paleisti vaizdo įrašą, trukmė:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Įkėlėjo naudotojo paveikslėlio miniatiūra</string>\n    <string name=\"detail_likes_img_view_description\">Pamėgimai</string>\n    <string name=\"detail_dislikes_img_view_description\">Nemėgimai</string>\n    <string name=\"video\">Vaizdas</string>\n    <string name=\"audio\">Muzika</string>\n    <string name=\"retry\">Bandyti iš naujo</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s prenumeratorius</item>\n        <item quantity=\"few\">%s prenumeratoriai</item>\n        <item quantity=\"other\">%s prenumeratorių</item>\n    </plurals>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s vaizdo įrašas</item>\n        <item quantity=\"few\">%s vaizdo įrašai</item>\n        <item quantity=\"other\">%s vaizdo įrašų</item>\n    </plurals>\n    <string name=\"start\">Pradėti</string>\n    <string name=\"pause\">Pauzė</string>\n    <string name=\"delete\">Naikinti</string>\n    <string name=\"checksum\">Kontrolinė suma</string>\n    <string name=\"ok\">Gerai</string>\n    <string name=\"msg_name\">Failo pavadinimas</string>\n    <string name=\"msg_threads\">Gijos</string>\n    <string name=\"msg_error\">Klaida</string>\n    <string name=\"msg_running\">NewPipe atsisiunčiama</string>\n    <string name=\"msg_running_detail\">Bakstelėkite, kad peržiūrėtumėte išsamią informaciją</string>\n    <string name=\"msg_wait\">Prašome palaukti…</string>\n    <string name=\"msg_copied\">Nukopijuota į iškarpinę</string>\n    <string name=\"no_available_dir\">Prašome pasirinkti galimą atsisiuntimų aplankalą</string>\n    <string name=\"msg_popup_permission\">Šis leidimas reikalingas\n\\natidarymui iššokančio lango rėžime</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA iššūkis</string>\n    <string name=\"recaptcha_request_toast\">prašomas reCAPTCHA iššūkis</string>\n    <string name=\"subscribe_button_title\">Prenumeruoti</string>\n    <string name=\"subscribed_button_title\">Užprenumeruota</string>\n    <string name=\"channel_unsubscribed\">Kanalas Nebeprenumeruojamas</string>\n    <string name=\"subscription_change_failed\">Negalima keisti prenumeratos</string>\n    <string name=\"subscription_update_failed\">Negalima atnaujinti prenumeratos</string>\n    <string name=\"tab_subscriptions\">Prenumeratos</string>\n    <string name=\"fragment_feed_title\">Kas naujo</string>\n    <string name=\"enable_search_history_title\">Ieškoti istorijoje</string>\n    <string name=\"enable_search_history_summary\">Saugoti paieškos užklausas vietinėje atmintyje</string>\n    <string name=\"enable_watch_history_title\">Žiūrėjimo istorija</string>\n    <string name=\"enable_watch_history_summary\">Sekite peržiūrėtus vaizdo įrašus</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Paleisti</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Tęsti grojimą po pertraukimo (pvz. po skambučių)</string>\n    <string name=\"show_hold_to_append_title\">Rodyti „Laikykite, kad pridėtumėte“ patarimą</string>\n    <string name=\"show_hold_to_append_summary\">Rodyti patarimą, kai vaizdo įraše „Išsami informacija“ paspausite foną arba iššokantįjį mygtuką</string>\n    <string name=\"settings_category_player_title\">Grotuvas</string>\n    <string name=\"settings_category_player_behavior_title\">Elgsena</string>\n    <string name=\"settings_category_history_title\">Istorija ir podėlis</string>\n    <string name=\"undo\">Atgal</string>\n    <string name=\"play_all\">Groti viską</string>\n    <string name=\"notification_channel_name\">NewPipe pranešimai</string>\n    <string name=\"notification_channel_description\">NewPipe grotuvo pranešimai</string>\n    <string name=\"unknown_content\">[Nežinoma]</string>\n    <string name=\"player_stream_failure\">Srauto atkurti nepavyko</string>\n    <string name=\"player_unrecoverable_failure\">Įvyko nepataisoma grotuvo klaida</string>\n    <string name=\"player_recoverable_failure\">Atstatoma po grotuvo klaidos</string>\n    <string name=\"search_no_results\">Nėra rezultatų</string>\n    <string name=\"empty_list_subtitle\">Čia nieko nėra išskyrus svirplius</string>\n    <string name=\"no_subscribers\">Nėra prenumeratorių</string>\n    <string name=\"no_views\">Nėra peržiūrų</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s peržiūra</item>\n        <item quantity=\"few\">%s peržiūros</item>\n        <item quantity=\"other\">%s peržiūrų</item>\n    </plurals>\n    <string name=\"no_videos\">Nėra vaizdo įrašų</string>\n    <string name=\"settings_category_downloads_title\">Parsisiuntimai</string>\n    <string name=\"settings_file_charset_title\">Leidžiami simboliai failų varduose</string>\n    <string name=\"settings_file_replacement_character_summary\">Neleistini simboliai yra pakeičiami šia reikšme</string>\n    <string name=\"settings_file_replacement_character_title\">Pakaitinis simbolis</string>\n    <string name=\"charset_letters_and_digits\">Raidės ir skaičiai</string>\n    <string name=\"charset_most_special_characters\">Ypatingieji simboliai</string>\n    <string name=\"title_activity_about\">Apie NewPipe</string>\n    <string name=\"title_licenses\">Trečiųjų šalių licencijos</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s %2$s pagal %3$s</string>\n    <string name=\"tab_about\">Apie ir DUK</string>\n    <string name=\"tab_licenses\">Licencijos</string>\n    <string name=\"app_description\">Nemokama, atviro kodo transliacijų peržiūros programėlė Android sistemai.</string>\n    <string name=\"contribution_title\">Prisidėti</string>\n    <string name=\"contribution_encouragement\">Jei turite idėjų dėl: vertimų, išvaizdos pakeitimų, kodo supaprastinimo, arba rimtų kodo pakeitimų - pagalba visada laukiama!</string>\n    <string name=\"view_on_github\">Peržiūrėti per GitHub</string>\n    <string name=\"donation_title\">Paremti</string>\n    <string name=\"donation_encouragement\">NewPipe yra vystoma savanorių, kurie skiria savo laisvą laiką, kad sukurtų geriausią patirtį Jums. Dabar yra laikas paremti juos, kad kūrėjai galėtų NewPipe paversti dar geresne programėle.</string>\n    <string name=\"give_back\">Duokite grąžos</string>\n    <string name=\"website_title\">Interneto puslapis</string>\n    <string name=\"website_encouragement\">Kad sužinotumėte daugiau apie NewPipe apsilankykite mūsų interneto puslapyje.</string>\n    <string name=\"app_license_title\">NewPipe licencija</string>\n    <string name=\"read_full_license\">Skaityti licenciją</string>\n    <string name=\"title_activity_history\">Istorija</string>\n    <string name=\"action_history\">Istorija</string>\n    <string name=\"delete_item_search_history\">Ar norite ištrinti šį elementą iš paieškos istorijos?</string>\n    <string name=\"main_page_content\">Pagrindinio puslapio turinys</string>\n    <string name=\"blank_page_summary\">Tuščias puslapis</string>\n    <string name=\"kiosk_page_summary\">Kiosko puslapis</string>\n    <string name=\"channel_page_summary\">Kanalo puslapis</string>\n    <string name=\"select_a_channel\">Pasirinkite kanalą</string>\n    <string name=\"no_channel_subscribed_yet\">Nė vienas kanalas dar neužprenumeruotas</string>\n    <string name=\"select_a_kiosk\">Pasirinkite kioską</string>\n    <string name=\"trending\">Tendencijos</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Nauja ir karšta</string>\n    <string name=\"play_queue_remove\">Pašalinti</string>\n    <string name=\"play_queue_stream_detail\">Išsami informacija</string>\n    <string name=\"play_queue_audio_settings\">Garso nustatymai</string>\n    <string name=\"hold_to_append\">Laikykite, kad įtrauktumėte į eilę</string>\n    <string name=\"start_here_on_background\">Pradėti groti foniniame režime</string>\n    <string name=\"start_here_on_popup\">Pradėti groti langelio grotuve</string>\n    <string name=\"no_player_found_toast\">Nerastas srauto grotuvas (galite įdiegti VLC kad grotumėte).</string>\n    <string name=\"controls_download_desc\">Parsisiųsti srauto failą</string>\n    <string name=\"show_info\">Rodyti informaciją</string>\n    <string name=\"tab_bookmarks\">Pažymėti grojaraščiai</string>\n    <string name=\"controls_add_to_playlist_title\">Pridėti į</string>\n    <string name=\"default_content_country_title\">Numatyta turinio šalis</string>\n    <string name=\"settings_category_debug_title\">Šalinti riktus</string>\n    <string name=\"always\">Visada</string>\n    <string name=\"just_once\">Tik kartą</string>\n    <string name=\"switch_to_background\">Perjungti į foną</string>\n    <string name=\"switch_to_popup\">Perjungti į iššokantį langą</string>\n    <string name=\"switch_to_main\">Perjungti į pagrindinį</string>\n    <string name=\"import_data_title\">Importuoti duomenų bazę</string>\n    <string name=\"export_data_title\">Eksportuoti duomenų bazę</string>\n    <string name=\"import_data_summary\">Bus perrašyta jūsų dabartinė istorija, prenumeratos, grojaraščiai ir (pasirinktinai) nustatymai</string>\n    <string name=\"export_data_summary\">Eksportuoti istoriją, prenumeratas, grojaraščius ir nustatymus</string>\n    <string name=\"external_player_unsupported_link_type\">Išorinis grotuvas nepalaiko tokių nuorodų</string>\n    <string name=\"video_streams_empty\">Nerasta video srautų</string>\n    <string name=\"audio_streams_empty\">Nerasta audio srautų</string>\n    <string name=\"detail_drag_description\">Tempti kad perrūšiuoti</string>\n    <string name=\"create\">Kurti</string>\n    <string name=\"dismiss\">Nutraukti</string>\n    <string name=\"rename\">Pervardyti</string>\n    <string name=\"title_last_played\">Vėliausiai žiūrėta</string>\n    <string name=\"title_most_played\">Dažniausiai žiūrėta</string>\n    <string name=\"export_complete_toast\">Eksportavimas baigtas</string>\n    <string name=\"import_complete_toast\">Importavimas baigtas</string>\n    <string name=\"no_valid_zip_file\">Netinkamas ZIP failas</string>\n    <string name=\"could_not_import_all_files\">Perspėjimas: Nepavyko importuoti visų failų.</string>\n    <string name=\"override_current_data\">Tai perrašys dabartinius nustatymus.</string>\n    <string name=\"drawer_open\">Stalčius</string>\n    <string name=\"drawer_close\">Uždaryti stalčių</string>\n    <string name=\"video_player\">Video grotuvas</string>\n    <string name=\"background_player\">Foninis grotuvas</string>\n    <string name=\"popup_player\">Iššokantis grotuvas</string>\n    <string name=\"always_ask_open_action\">Visada klausti</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Gauname informaciją…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Įkeliamas pasirinktas turinys</string>\n    <string name=\"create_playlist\">Naujas grojaraštis</string>\n    <string name=\"rename_playlist\">Pervadinti</string>\n    <string name=\"name\">Pavadinimas</string>\n    <string name=\"add_to_playlist\">Pridėti į grojaraštį</string>\n    <string name=\"set_as_playlist_thumbnail\">Nustatyti kaip grojaraščio miniatiūrą</string>\n    <string name=\"bookmark_playlist\">Pridėti grojaraštį į žymes</string>\n    <string name=\"unbookmark_playlist\">Pašalinti žymes</string>\n    <string name=\"delete_playlist_prompt\">Ištrinti šį grojaraštį\\?</string>\n    <string name=\"playlist_creation_success\">Grojaraštis sukurtas</string>\n    <string name=\"playlist_add_stream_success\">Pridėta į grojaraštį</string>\n    <string name=\"playlist_thumbnail_change_success\">Grojaraščio paveikslėlis pakeistas.</string>\n    <string name=\"caption_none\">Jokių subtitrų</string>\n    <string name=\"resize_fit\">Pritaikyti</string>\n    <string name=\"resize_fill\">Užpildyti</string>\n    <string name=\"resize_zoom\">Priartinti</string>\n    <string name=\"caption_auto_generated\">Automatiškai sugeneruoti</string>\n    <string name=\"enable_leak_canary_summary\">Atminties nutekėjimo stebėjimas gali padaryti programėlę nestabilią</string>\n    <string name=\"enable_disposed_exceptions_title\">Pranešti apie Out-of-Lifecycle klaidas</string>\n    <string name=\"enable_disposed_exceptions_summary\">Priverstinai pranešti apie \\\"undeliverable Rx exceptions outside of fragment or activity lifecycle after disposal\\\"</string>\n    <string name=\"show_comments_summary\">Išjungti, kad būtų paslėpti komentarai</string>\n    <string name=\"show_comments_title\">Rodyti komentarus</string>\n    <string name=\"tab_choose\">Pasirinkti skirtuką</string>\n    <string name=\"unsubscribe\">Atsisakyti prenumeratos</string>\n    <string name=\"search_showing_result_for\">Rodomi rezultatai užklausai: %s</string>\n    <string name=\"open_with\">Atverti su</string>\n    <string name=\"notification_action_repeat\">Pakartoti</string>\n    <string name=\"one_item_deleted\">1 elementas pašalintas.</string>\n    <string name=\"msg_calculating_hash\">Skaičiuojama maišos suma</string>\n    <string name=\"no_comments\">Komentarų nėra</string>\n    <string name=\"infinite_videos\">∞ vaizdo įrašų</string>\n    <string name=\"more_than_100_videos\">100+ vaizdo įrašų</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s klausytojas</item>\n        <item quantity=\"few\">%s klausytojai</item>\n        <item quantity=\"other\">%s klausytojų</item>\n    </plurals>\n    <string name=\"no_one_listening\">Niekas neklauso</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s žiūri</item>\n        <item quantity=\"few\">%s žiūri</item>\n        <item quantity=\"other\">%s žiūri</item>\n    </plurals>\n    <string name=\"no_one_watching\">Niekas nežiūri</string>\n    <string name=\"subscribers_count_not_available\">Sekėjų skaičius neprieinamas</string>\n    <string name=\"drawer_header_description\">Perjungti paslaugą, dabar pasirinkta:</string>\n    <string name=\"description_tab_description\">Aprašymas</string>\n    <string name=\"related_items_tab_description\">Susiję įrašai</string>\n    <string name=\"comments_tab_description\">Komentarai</string>\n    <string name=\"error_report_open_issue_button_text\">Pranešti per GitHub</string>\n    <string name=\"copy_for_github\">Kopijuoti formatuotą pranešimą</string>\n    <string name=\"permission_display_over_apps\">Suteikti leidimą rodyti virš kitų programų</string>\n    <string name=\"restore_defaults_confirmation\">Ar norite atstatyti numatytuosius\\?</string>\n    <string name=\"restore_defaults\">Atstatyti numatytuosius</string>\n    <string name=\"saved_tabs_invalid_json\">Įkelti išsaugotų kortelių nepavyko, naudojamos numatytosios</string>\n    <string name=\"no_streams_available_download\">Nėra srautų parsiuntimui</string>\n    <string name=\"error_occurred_detail\">Įvyko klaida: %1$s</string>\n    <string name=\"file_name_empty_error\">Failo vardas negali būti tuščias</string>\n    <string name=\"invalid_file\">Tokio failo nėra arba nesuteiktas leidimas jį pasiekti</string>\n    <string name=\"invalid_source\">Tokio failo/turinio šaltinio nėra</string>\n    <string name=\"invalid_directory\">Tokio aplanko nėra</string>\n    <string name=\"missing_file\">Failas perkeltas ar ištrintas</string>\n    <string name=\"download_to_sdcard_error_message\">Įrašyti į išorinę SD kortelę nepavyko. Atstatyti atsisiuntimo aplanką\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Išorinė saugykla neprieinama</string>\n    <string name=\"search_history_deleted\">Paieškos istorija pašalinta</string>\n    <string name=\"delete_search_history_alert\">Išvalyti visą paieškos istoriją\\?</string>\n    <string name=\"clear_search_history_summary\">Išvalo paieškos istoriją</string>\n    <string name=\"clear_search_history_title\">Išvalyti paieško istoriją</string>\n    <string name=\"clear_playback_states_summary\">Pašalina visas atkūrimo vietas</string>\n    <string name=\"clear_playback_states_title\">Pašalinti atkūrimo vietas</string>\n    <string name=\"watch_history_deleted\">Žiūrėjimo istorija pašalinta</string>\n    <string name=\"delete_view_history_alert\">Išvalyti visą žiūrėjimo istoriją\\?</string>\n    <string name=\"clear_views_history_summary\">Išvalo atkurtų srautų ir atkūrimo vietos istoriją</string>\n    <string name=\"clear_views_history_title\">Išvalyti žiūrėjimo istoriją</string>\n    <string name=\"clear_cookie_summary\">Išvalyti slapukus kuriuos NewPipe išsaugojo kai vedėte reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA slapukai išvalyti</string>\n    <string name=\"clear_cookie_title\">Išvalyti reCAPTCHA slapukus</string>\n    <string name=\"hash_channel_description\">Pranešimas apie video maišos progresą</string>\n    <string name=\"hash_channel_name\">Video maišos pranešimas</string>\n    <string name=\"app_update_notification_channel_description\">Pranešimas apie naują NewPipe versiją</string>\n    <string name=\"app_update_notification_channel_name\">Programos atnaujinimo pranešimas</string>\n    <string name=\"file\">Failą</string>\n    <string name=\"file_deleted\">Failas panaikintas</string>\n    <string name=\"artists\">Atlikėjai</string>\n    <string name=\"albums\">Albumai</string>\n    <string name=\"songs\">Dainos</string>\n    <string name=\"events\">Įvykiai</string>\n    <string name=\"users\">Naudotojai</string>\n    <string name=\"tracks\">Takeliai</string>\n    <string name=\"videos_string\">Vaizdo įrašai</string>\n    <string name=\"playlists\">Grojaraščiai</string>\n    <string name=\"channels\">Kanalai</string>\n    <string name=\"restricted_video_no_stream\">Šiam video taikomas amžiaus apribojimas.\n\\nDėl naujų YouTube amžiaus ribojimų NewPipe negali pasiekti ir atkurti šių video srautų.</string>\n    <string name=\"restricted_video\">Šiam video taikomas amžiaus apribojimas\n\\n\n\\nĮjunkite \\\"%1$s\\\" norėdami peržiūrėti.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">Youtube turi „apribotą režimą“ kuriame slepiamas galimai suaugusiems skirtas turinys</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Įjungti YouTube „apribotą režimą“</string>\n    <string name=\"show_age_restricted_content_summary\">Rodyti turinį kuris gali būti netinkamas vaikams (18+)</string>\n    <string name=\"settings_category_updates_title\">Atnaujinimai</string>\n    <string name=\"peertube_instance_add_exists\">Kopija jau yra</string>\n    <string name=\"peertube_instance_add_https_only\">Palaikomi tik HTTPS adresai</string>\n    <string name=\"peertube_instance_add_title\">Pridėti kopiją</string>\n    <string name=\"peertube_instance_url_help\">Pasirinkite patikusias kopijas %s</string>\n    <string name=\"peertube_instance_url_summary\">Pasirinkite mėgiamiausias PeerTube kopijas</string>\n    <string name=\"peertube_instance_url_title\">PeerTube kopijos</string>\n    <string name=\"unsupported_url_dialog_message\">URL neatpažintas. Atverti kita programa\\?</string>\n    <string name=\"autoplay_title\">Automatinis atkūrimas</string>\n    <string name=\"settings_category_clear_data_title\">Išvalyti duomenis</string>\n    <string name=\"enable_playback_state_lists_summary\">Sąraše rodyti atkūrimo vietos indikatorių</string>\n    <string name=\"enable_playback_state_lists_title\">Vietos sąraše</string>\n    <string name=\"auto_queue_toggle\">Auto eilė</string>\n    <string name=\"auto_queue_summary\">Tęsti atkūrimą į eilę pridedant susijusius srautus</string>\n    <string name=\"auto_queue_title\">Automatiškai pridėti sekantį į eilę</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metaduomenų saugykla išvalyta</string>\n    <string name=\"metadata_cache_wipe_summary\">Pašalina visus išsaugotus puslapio duomenis</string>\n    <string name=\"metadata_cache_wipe_title\">Išvalyti išsaugotus metaduomenis</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Paveikslėlių saugykla išvalyta</string>\n    <string name=\"show_meta_info_summary\">Išjunkite, kad paslėptumėte meta duomenis langeliuose su papildoma informacija apie srauto autorius ir turinį</string>\n    <string name=\"show_meta_info_title\">Rodyti meta duomenis</string>\n    <string name=\"show_description_summary\">Išjunkite norėdami paslėpti video aprašymą ir papildomą informaciją</string>\n    <string name=\"use_inexact_seek_title\">Naudoti greitą netikslų prasukimą</string>\n    <string name=\"night_theme_title\">Naktinė tema</string>\n    <string name=\"notification_colorize_summary\">Leisti Android priderinti pranešimo spalvą prie pagrindinės miniatiūros spalvos (prieinama ne visuose įrenginiuose)</string>\n    <string name=\"notification_colorize_title\">Spalvoti pranešimą</string>\n    <string name=\"notification_action_nothing\">Nieko</string>\n    <string name=\"notification_action_buffering\">Kraunama</string>\n    <string name=\"notification_action_shuffle\">Maišyti</string>\n    <string name=\"notification_actions_at_most_three\">Galite pasirinkit iki trijų veiksmų kompaktiškame pranešime!</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_action_4_title\">Penktas veiksmo mygtukas</string>\n    <string name=\"notification_action_3_title\">Ketvirtas veiksmo mygtukas</string>\n    <string name=\"notification_action_2_title\">Trečias veiksmo mygtukas</string>\n    <string name=\"notification_action_1_title\">Antras veiksmo mygtukas</string>\n    <string name=\"notification_action_0_title\">Pirmas veiksmo mygtukas</string>\n    <string name=\"notification_scale_to_square_image_summary\">Apkirpti video miniatiūrų rodomų pranešime kraštinių santykį iš 16:9 į 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Apkirpti miniatiūrų dydi 1:1 santykiu</string>\n    <string name=\"watch_history_states_deleted\">Atkūrimo vietos pašalintos</string>\n    <string name=\"delete_playback_states_alert\">Pašalinti visas atkūrimo vietas\\?</string>\n    <string name=\"peertube_instance_add_fail\">Netinkama kopija</string>\n    <string name=\"peertube_instance_add_help\">Įveskite kopijos URL</string>\n    <string name=\"enable_playback_resume_summary\">Atstatyti paskutinį atkūrimo laiką</string>\n    <string name=\"enable_playback_resume_title\">Tęsti atkūrimą</string>\n    <string name=\"show_description_title\">Rodyti aprašymą</string>\n    <string name=\"clear_queue_confirmation_description\">Aktyvaus grotuvo eilė bus pakeista</string>\n    <string name=\"clear_queue_confirmation_summary\">Perjungimas iš vieno grotuvo į kitą gali pakeisti jūsų eilę</string>\n    <string name=\"clear_queue_confirmation_title\">Prieš išvalant eilę prašyti patvirtinimo</string>\n    <string name=\"seek_duration_title\">Greito prasukimo trukmė</string>\n    <string name=\"use_inexact_seek_summary\">Netikslus prasukimas leidžia grotuvui greitai peršokti į kitą vietą su sumažintu tikslumu. 5, 15 ar 25 sekundės to nenaudoja</string>\n    <string name=\"import_youtube_instructions\">Importuokite „YouTube“ prenumeratas iš „Google Takeout“:\n\\n\n\\n1. Eikite į šį URL adresą: %1$s\n\\n2. Prisijunkite, kai būsite paprašyti\n\\n3. Spustelėkite „All data included“ (įtraukti visus duomenis), tada „Deselect all“ (panaikinti visų duomenų pasirinkimą), tada pasirinkite tik „Subscriptions“ (prenumeratos) ir spustelėkite „OK“ (gerai).\n\\n4. Spustelėkite „Next step“ (kitas žingsnis), tada „Create export“ (sukurti eksportą).\n\\n5. Pasirodžius mygtukui „Download“ (Atsisiųsti), spustelėkite jį ir\n\\n6. Spustelėkite toliau Importuoti failą ir pasirinkite atsisiųstą ZIP failą\n\\n7. [Jei nepavyksta importuoti ZIP failo] Ištraukite .csv failą (paprastai po „YouTube and YouTube Music/subscriptions/subscriptions.json“), spustelėkite toliau esantį Importuoti failą ir pasirinkite išgautą CSV failą</string>\n    <string name=\"app_license\">NewPipe yra „copyleft libre“ programinė įranga: galite ją naudoti, studijuoti ir patobulinti. Konkrečiau, galite ją platinti ir (arba) modifikuoti pagal „Free Software Foundation“ paskelbtą GNU bendrosios viešosios licencijos sąlygas, pasirinktinai pagal 3 licencijos versiją arba (jūsų pasirinkimu) bet kurią vėlesnę versiją.</string>\n    <string name=\"import_soundcloud_instructions\">Importuokite \\\"SoundCloud\\\" profilį įvesdami URL arba savo ID:\n\\n\n\\n1. Interneto naršyklėje įjunkite darbalaukio režimą (svetainė neprieinama mobiliesiems įrenginiams).\n\\n2. Eikite šiuo adresu: %1$s\n\\n3. Prisijunkite, kai būsite paprašyti\n\\n4. Nukopijuokite profilio URL, į kurį buvote nukreipti.</string>\n    <string name=\"paid_content\">Šis turinys prieinamas tik sumokėjusiems naudotojams, todėl \\\"NewPipe\\\" negali jo transliuoti ar atsisiųsti.</string>\n    <string name=\"youtube_music_premium_content\">Šis vaizdo įrašas prieinamas tik \\\"YouTube Music Premium\\\" nariams, todėl \\\"NewPipe\\\" negali jo transliuoti ar atsisiųsti.</string>\n    <string name=\"disable_media_tunneling_summary\">Išjunkite medijos tuneliavimą, jei vaizdo įrašo atkūrimo metu atsiranda juodas ekranas arba užstrigimas.</string>\n    <string name=\"caption_setting_description\">Pakeiskite grotuvo subtitrų teksto mastelį ir fono stilių. Pakeitimai įsigalios iš naujo paleidus programą</string>\n    <string name=\"private_content\">Šis turinys yra privatus, todėl \\\"NewPipe\\\" jo negali transliuoti ar atsisiųsti.</string>\n    <string name=\"confirm_prompt\">Ar norite išvalyti atsisiuntimų istoriją ar ištrinti visus atsisiųstus failus\\?</string>\n    <string name=\"feed_update_threshold_summary\">Laikas po paskutinio atnaujinimo, po kurio prenumerata laikoma pasenusia — %s</string>\n    <string name=\"error_http_unsupported_range\">Serveris nepriima daugiasrautinių atsisiuntimų, pakartokite bandymą su @string/msg_threads = 1</string>\n    <string name=\"show_thumbnail_summary\">Naudoti miniatiūrą užrakinimo ekrano fonui ir pranešimams</string>\n    <string name=\"download_already_running\">Šiuo metu vyksta atsisiuntimas su šiuo pavadinimu</string>\n    <string name=\"georestricted_content\">Šis turinys nėra prieinamas jūsų šalyje.</string>\n    <string name=\"no_app_to_open_intent\">Jokia programa jūsų įrenginyje negali atidaryti šio</string>\n    <string name=\"enable_queue_limit_desc\">Vienu metu bus vykdomas tik vienas atsisiuntimas</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe buvo uždaryta kol dirbo su failu</string>\n    <string name=\"error_http_no_content\">Serveris nesiunčia duomenų</string>\n    <string name=\"error_ssl_exception\">Užmegzti saugaus ryšio nepavyko</string>\n    <string name=\"limit_mobile_data_usage_title\">Riboti raišką naudojant mobilius duomenis</string>\n    <string name=\"autoplay_summary\">Automatiškai atkurti — %s</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Taip ir iš dalies žiūrėtus vaizdo įrašus</string>\n    <string name=\"error_download_resource_gone\">Atstatyti parsiuntimo nepavyko</string>\n    <string name=\"pause_downloads_on_mobile\">Pertraukti matuojamuose tinkluose</string>\n    <string name=\"minimize_on_exit_popup_description\">Sumažinti iki iššokančio lango grotuvo</string>\n    <string name=\"minimize_on_exit_background_description\">Sumažinti į fono grotuvą</string>\n    <string name=\"subscriptions_import_unsuccessful\">Prenumeratų importuoti nepavyko</string>\n    <string name=\"disable_media_tunneling_title\">Išjungti media tuneliavimą</string>\n    <string name=\"show_memory_leaks\">Rodyti per didelį atminties naudojimą</string>\n    <string name=\"wifi_only\">Tik per Wi-Fi</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanalo avataro miniatiūra</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Išjungti greitą režimą</string>\n    <string name=\"feed_subscription_not_loaded_count\">Neįkelta: %d</string>\n    <string name=\"clear_download_history\">Išvalyti parsiuntimų istoriją</string>\n    <string name=\"generate_unique_name\">Generuoti unikalų vardą</string>\n    <string name=\"playback_speed_control\">Atkūrimo greičio valdymas</string>\n    <string name=\"show_thumbnail_title\">Rodyti miniatiūrą</string>\n    <string name=\"feed_groups_header_title\">Kanalų grupės</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d diena</item>\n        <item quantity=\"few\">%d dienos</item>\n        <item quantity=\"other\">%d dienų</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minutes</item>\n        <item quantity=\"few\">%d minutės</item>\n        <item quantity=\"other\">%d minučių</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekundė</item>\n        <item quantity=\"few\">%d sekundės</item>\n        <item quantity=\"other\">%d sekundžių</item>\n    </plurals>\n    <string name=\"systems_language\">Sistemos numatytoji</string>\n    <string name=\"app_language_title\">Programos kalba</string>\n    <string name=\"downloads_storage_use_saf_title\">Naudoti sistemos aplanko parinktuką (SAP)</string>\n    <string name=\"pause_downloads\">Sustabdyti siuntimus</string>\n    <string name=\"error_http_not_found\">Nerasta</string>\n    <string name=\"radio\">Radijo</string>\n    <string name=\"featured\">Siūloma</string>\n    <string name=\"chapters\">Skyriai</string>\n    <string name=\"recent\">Paskutiniai</string>\n    <string name=\"never\">Niekada</string>\n    <string name=\"settings_category_feed_title\">Kanalas</string>\n    <string name=\"feed_create_new_group_button_title\">Nauja</string>\n    <string name=\"recovering\">atstatoma</string>\n    <string name=\"close\">Užverti</string>\n    <string name=\"stop\">Sustabdyti</string>\n    <string name=\"overwrite\">Perrašyti</string>\n    <string name=\"enqueue\">Į eilę</string>\n    <string name=\"post_processing\">apdorojama</string>\n    <string name=\"queued\">eilėje</string>\n    <string name=\"paused\">sustabdyta</string>\n    <string name=\"missions_header_pending\">Laukiama</string>\n    <string name=\"missions_header_finished\">Baigta</string>\n    <string name=\"auto\">Auto</string>\n    <string name=\"grid\">Tinklelis</string>\n    <string name=\"list\">Sąrašas</string>\n    <string name=\"updates_setting_title\">Atnaujinimai</string>\n    <string name=\"playback_reset\">Atstatyti</string>\n    <string name=\"playback_step\">Žingsnis</string>\n    <string name=\"minimize_on_exit_none_description\">Nieko</string>\n    <string name=\"decline\">Atmesti</string>\n    <string name=\"accept\">Priimti</string>\n    <string name=\"playback_pitch\">Pikas</string>\n    <string name=\"playback_tempo\">Tempas</string>\n    <string name=\"export_ongoing\">Eksportuojama…</string>\n    <string name=\"import_ongoing\">Importuojama…</string>\n    <string name=\"import_title\">Importuoti</string>\n    <string name=\"caption_setting_title\">Subtitrai</string>\n    <string name=\"playlist_no_uploader\">Automatiškai sugeneruota (įkėlėjas nerastas)</string>\n    <string name=\"unmute\">Įjungti garsą</string>\n    <string name=\"mute\">Nutildyti</string>\n    <string name=\"preferred_open_action_settings_summary\">Numatytasis veiksmas atveriant turinį — %s</string>\n    <string name=\"preferred_open_action_settings_title\">Numatytasis „atverti“ veiksmas</string>\n    <string name=\"enqueued\">Pridėta į eilę</string>\n    <string name=\"enqueue_stream\">Pridėti į eilę</string>\n    <string name=\"show_channel_details\">Rodyti kanalo išsamią informaciją</string>\n    <string name=\"title_activity_play_queue\">Groti eilę</string>\n    <string name=\"conferences\">Konferencijos</string>\n    <string name=\"most_liked\">Labiausiai patikę</string>\n    <string name=\"recently_added\">Nesenai pridėta</string>\n    <string name=\"local\">Vietinė</string>\n    <string name=\"error_unable_to_load_comments\">Komentarų įkelti nepavyko</string>\n    <string name=\"import_settings\">Ar norite importuoti nustatymus\\?</string>\n    <string name=\"no_playlist_bookmarked_yet\">Kol kas nėra grojaraščio žymų</string>\n    <string name=\"select_a_playlist\">Pasirinkite grojaraštį</string>\n    <string name=\"default_kiosk_page_summary\">Numatytasis režimas</string>\n    <string name=\"main_page_content_summary\">Kokios kortelės rodomos pagrindiniame puslapyje</string>\n    <string name=\"read_privacy_policy\">Skaityti privatumo politiką</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe į jūsų privatumą žiūri labai rimtai. Programa be jūsų sutikimo nerenka jokių duomenų.\n\\nNewPipe privatumo politika išsamiai parodo kokie duomenys siunčiami ir saugomi pranešant apie problemą.</string>\n    <string name=\"privacy_policy_title\">NewPipe privatumo politika</string>\n    <string name=\"done\">Atlikta</string>\n    <string name=\"recaptcha_solve\">Išspręsta</string>\n    <string name=\"subtitle_activity_recaptcha\">Paspauskite \\\"atlikta\\\" kai išspręsta</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Ar manote, kad kanalas kraunamas per lėtai\\? Jei taip, pabandykite įjungti greitąjį įkrovimą (tai galite pakeisti nustatymuose arba paspaudę toliau esantį mygtuką).\n\\n\n\\n\\\"NewPipe\\\" siūlo dvi kanalo įkėlimo strategijas:\n\\n- Visos prenumeratos kanalo atsisiuntimas, kuris yra lėtas, bet išsamus.\n\\n- Naudojant specialų paslaugos galinį tašką, kuris yra greitas, bet paprastai neišsamus.\n\\n\n\\nSkirtumas tarp šių dviejų būdų yra tas, kad greitasis būdas paprastai neturi tam tikros informacijos, pavyzdžiui, elemento trukmės ar tipo (negalima atskirti tiesioginių ir įprastų vaizdo įrašų), ir gali grąžinti mažiau elementų.\n\\n\n\\n\\\"YouTube\\\" yra pavyzdys paslaugos, kuris siūlo šį greitąjį metodą su savo RSS kanalu.\n\\n\n\\nTaigi pasirinkimas priklauso nuo to, ko labiau norite: greičio ar tikslios informacijos.</string>\n    <string name=\"start_accept_privacy_policy\">Siekdami laikytis Europos bendrojo duomenų apsaugos reglamento (GDPR), atkreipiame jūsų dėmesį į NewPipe privatumo politiką. Prašome atidžiai ją perskaityti.\n\\nNorėdami išsiųsti mums pranešimą apie klaidą, turite su ja sutikti.</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Prieinama kai kuriose tarnybose, paprastai yra daug greitesnė, tačiau gali grąžinti ribotą kiekį elementų ir dažnai neišsamią informaciją (pvz., nėra trukmės, elemento tipo, nėra tiesioginės būsenos)</string>\n    <string name=\"remove_watched_popup_warning\">Vaizdo įrašai, kurie buvo peržiūrėti prieš juos įtraukiant į grojaraštį ir po to, kai jie buvo įtraukti į grojaraštį, bus pašalinti. \\nAr tikrai? To negalima atšaukti!</string>\n    <string name=\"soundcloud_go_plus_content\">Tai \\\"SoundCloud Go+\\\" kūrinys, bent jau jūsų šalyje, todėl jo negalima transliuoti ar atsisiųsti per \\\"NewPipe\\\".</string>\n    <string name=\"content_not_supported\">Šio turinio \\\"NewPipe\\\" dar nepalaiko.\n\\n\n\\nTikimės, kad jis bus palaikomas būsimoje versijoje.</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\\"Storage Access Framework\\\" leidžia atsisiųsti duomenis į išorinę SD kortelę</string>\n    <string name=\"import_network_expensive_warning\">Atminkite, kad ši operacija gali brangiai kainuoti tinkle.\n\\n\n\\nAr norite tęsti\\?</string>\n    <string name=\"updates_setting_description\">Rodyti pranešimą, kuriame raginama atnaujinti programą, kai yra nauja versija</string>\n    <string name=\"new_seek_duration_toast\">Dėl ExoPlayer apribojimų prasukimo trukmė buvo nustatyta %d sekundės</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Naudinga pereinant prie mobiliųjų duomenų, nors kai kurių atsisiuntimų sustabdyti negalima</string>\n    <string name=\"minimize_on_exit_summary\">Veiksmas, kai iš pagrindinio vaizdo įrašų grotuvo pereinama į kitą programą — %s</string>\n    <string name=\"show_original_time_ago_summary\">Srauto elementuose bus matomi orginalūs tekstai iš paslaugų</string>\n    <string name=\"downloads_storage_ask_summary\">Jūsų bus paklausta, kur išsaugoti kiekvieną atsisiuntimą.\n\\nĮgalinkite sisteminį aplanko parinktuką (SAP) jeigu norite, kad būtų atsiųsta į išorinę SD kortelę</string>\n    <string name=\"select_night_theme_toast\">Žemiau galite pasirinkti mėgstamą nakties temą</string>\n    <string name=\"download_already_pending\">Šiuo pavadinimu yra laukiama atsisiuntimo</string>\n    <string name=\"overwrite_finished_warning\">Atsisiųstas failas su šiuo pavadinimu jau egzistuoja</string>\n    <string name=\"max_retry_desc\">Didžiausias bandymų skaičius prieš atšaukiant atsisiuntimą</string>\n    <string name=\"night_theme_summary\">Pasirinkite mėgstamiausią nakties temą — %s</string>\n    <string name=\"feed_group_dialog_delete_message\">Ar norite panaikinti šią grupę\\?</string>\n    <string name=\"error_progress_lost\">Eiga prarasta, nes failas buvo panaikintas</string>\n    <string name=\"overwrite_unrelated_warning\">Failas šiuo pavadinimu jau egzistuoja</string>\n    <string name=\"error_path_creation\">Nepavyko sukurti paskirties aplanko</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Kai įmanoma, gauti iš dedikuoto kanalo</string>\n    <string name=\"show_original_time_ago_title\">Elementams rodyti orginalų \\\"prieš\\\" laiką</string>\n    <string name=\"error_connect_host\">Nepavyksta prisijungti prie serverio</string>\n    <string name=\"error_file_creation\">Failo sukurti nepavyko</string>\n    <string name=\"error_insufficient_storage_left\">Įrenginyje nebėra vietos</string>\n    <string name=\"error_unknown_host\">Nepavyko rasti serverio</string>\n    <string name=\"permission_denied\">Sistema uždraudė veiksmą</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Rodyti tik negrupuotas prenumeratas</string>\n    <string name=\"feed_oldest_subscription_update\">Paskutinis atnaujinimas: %s</string>\n    <string name=\"downloads_storage_ask_title\">Klausti kur parsiųsti</string>\n    <string name=\"overwrite_failed\">failo perrašyti nepavyko</string>\n    <string name=\"app_update_available_notification_title\">Prieinamas NewPipe atnaujinimas!</string>\n    <string name=\"minimize_on_exit_title\">Perjungiant programą sumažinti</string>\n    <string name=\"unhook_checkbox\">Atkabinti (gali iškraipyti)</string>\n    <string name=\"subscriptions_export_unsuccessful\">Nepavyko eksportuoti prenumeratų</string>\n    <string name=\"download_has_started\">Parsiunčiama</string>\n    <string name=\"auto_device_theme_title\">Automatinis (įrenginio tema)</string>\n    <string name=\"crash_the_app\">Programa nulūžo</string>\n    <string name=\"channel_created_by\">Sukūrė %s</string>\n    <string name=\"remove_watched_popup_title\">Pašalinti žiūrėtus video?</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Įjungti greitą režimą</string>\n    <string name=\"feed_update_threshold_title\">Kanalo atnaujinimo slenkstis</string>\n    <string name=\"feed_group_dialog_empty_name\">Tuščias grupės pavadinimas</string>\n    <string name=\"feed_group_dialog_empty_selection\">Nepasirinkta jokia prenumerata</string>\n    <string name=\"delete_downloaded_files\">Pašalinti parsiųstus failus</string>\n    <string name=\"choose_instance_prompt\">Pasirinkite kopiją</string>\n    <string name=\"enable_queue_limit\">Riboti parsiuntimų eilę</string>\n    <string name=\"list_view_mode\">Sąrašo rodinio režimas</string>\n    <string name=\"skip_silence_checkbox\">Prasukti kai nieko negroja</string>\n    <string name=\"playlist_page_summary\">Grojaraščio puslapis</string>\n    <string name=\"video_detail_by\">%s</string>\n    <string name=\"remove_watched\">Pašalinti žiūrėtus</string>\n    <string name=\"feed_update_threshold_option_always_update\">Visada atnaujinti</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d pasirinktas</item>\n        <item quantity=\"few\">%d pasirinkti</item>\n        <item quantity=\"other\">%d pasirinkta</item>\n    </plurals>\n    <string name=\"feed_group_dialog_select_subscriptions\">Pasirinkite prenumeratas</string>\n    <string name=\"feed_processing_message\">Apdorojamas srautas…</string>\n    <string name=\"feed_notification_loading\">Įkeliamas srautas…</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d valanda</item>\n        <item quantity=\"few\">%d valandos</item>\n        <item quantity=\"other\">%d valandų</item>\n    </plurals>\n    <string name=\"start_downloads\">Pradėti siuntimus</string>\n    <string name=\"error_timeout\">Prisijungimo laikas baigėsi</string>\n    <string name=\"max_retry_msg\">Daugiausiai bandymų</string>\n    <string name=\"error_postprocessing_failed\">Apdorojimas nepavyko</string>\n    <string name=\"show_error\">Rodyti klaidą</string>\n    <string name=\"download_failed\">Parsiųsti nepavyko</string>\n    <string name=\"limit_data_usage_none_description\">Be limito</string>\n    <string name=\"import_soundcloud_instructions_hint\">jūsųID, soundcloud.com/jūsųid</string>\n    <string name=\"previous_export\">Ankstesnio eksportavimo</string>\n    <string name=\"import_file_title\">Importuoti failą</string>\n    <string name=\"export_to\">Eksportuoti į</string>\n    <string name=\"import_from\">Importuoti iš</string>\n    <string name=\"feed_load_error_account_info\">Nepavyko įkelti duomenų \\'%s\\'.</string>\n    <string name=\"on\">Įjungta</string>\n    <string name=\"off\">Išjungta</string>\n    <string name=\"tablet_mode_title\">Planšetės režimas</string>\n    <string name=\"open_website_license\">Atidaryti puslapį</string>\n    <string name=\"metadata_privacy_internal\">Vidinis</string>\n    <string name=\"metadata_privacy_public\">Viešas</string>\n    <string name=\"metadata_privacy_private\">Privatus</string>\n    <string name=\"metadata_privacy_unlisted\">Neįtrauktas į sąrašą</string>\n    <string name=\"metadata_host\">Serveris</string>\n    <string name=\"metadata_support\">Pagalba</string>\n    <string name=\"metadata_language\">Kalba</string>\n    <string name=\"metadata_age_limit\">Amžiaus limitas</string>\n    <string name=\"metadata_privacy\">Privatumas</string>\n    <string name=\"metadata_licence\">Licencija</string>\n    <string name=\"metadata_tags\">Žymos</string>\n    <string name=\"metadata_category\">Kategorija</string>\n    <string name=\"description_select_enable\">Įgalinti teksto pasirinkimą apraše</string>\n    <string name=\"description_select_disable\">Neleisti pasirinkti teksto apraše</string>\n    <string name=\"description_select_note\">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.</string>\n    <string name=\"account_terminated\">Paskyra anuliuota</string>\n    <string name=\"feed_load_error_fast_unknown\">Greito srauto režimas nesuteikia daugiau informacijos apie tai.</string>\n    <string name=\"feed_load_error_terminated\">Autoriaus paskyra anuliuota.\n\\n„NewPipe“ negalės įkelti šio kanalo ateityje.\n\\nAr norite atsisakyti šio kanalo prenumeratos\\?</string>\n    <string name=\"feed_load_error\">Klaida įkeliant srautą</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Pradedant Android 10 palaikoma tik \\'Storage Access Framework\\'</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Jūsų bus paklausta, kur išsaugoti kiekvieną atsiuntimą</string>\n    <string name=\"no_dir_yet\">Atsiuntimo aplankas dar nenustatytas, pasirinkite numatytąjį atsiuntimų aplanką dabar</string>\n    <string name=\"comments_are_disabled\">Komentarai yra išjungti</string>\n    <string name=\"low_quality_smaller\">Žema kokybė (mažesnės)</string>\n    <string name=\"high_quality_larger\">Aukšta kokybė (didesnės)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Miniatiūrų peržiūra naudojant slinkties juostą</string>\n    <string name=\"dont_show\">Nerodyti</string>\n    <string name=\"detail_heart_img_view_description\">Širdelė nuo kurėjo</string>\n    <string name=\"mark_as_watched\">Pažymėti kaip peržiūrėtą</string>\n    <string name=\"remote_search_suggestions\">Nuotolinės paieškos pasiūlymai</string>\n    <string name=\"local_search_suggestions\">Vietinės paieškos pasiūlymai</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Ištrintas %1$s atsiuntimas</item>\n        <item quantity=\"few\">Ištrinti %1$s atsiuntimai</item>\n        <item quantity=\"other\">Ištrinta %1$s atsiuntimų</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Atsiuntimas baigtas</item>\n        <item quantity=\"few\">%s atsiuntimai baigti</item>\n        <item quantity=\"other\">%s atsiuntimų baigta</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Perbraukite elementus, kad juos pašalintumėte</string>\n    <string name=\"start_main_player_fullscreen_summary\">Nepradėti vaizdo įrašų naudojant mini grotuvą, o iškart įjungti viso ekrano režimą, jei automatinis pasukimas yra užrakintas. Vis tiek galėsite pasiekti mini grotuvą išėję iš viso ekrano rėžimo</string>\n    <string name=\"start_main_player_fullscreen_title\">Paleisti pagrindinį grotuvą viso ekrano režimu</string>\n    <string name=\"enqueued_next\">Sekantis pridėtas į eilę</string>\n    <string name=\"enqueue_next_stream\">Įtraukti į eilę sekantį</string>\n    <string name=\"processing_may_take_a_moment\">Apdorojama… tai gali užtrukti</string>\n    <string name=\"check_for_updates\">Tikrinti ar yra atnaujinimų</string>\n    <string name=\"manual_update_description\">Tikrinti ar yra atnaujinimų rankiniu būdu</string>\n    <string name=\"checking_updates_toast\">Tikrinti ar yra atnaujinimų…</string>\n    <string name=\"feed_new_items\">Nauji sklaidos kanalo elementai</string>\n    <string name=\"leak_canary_not_available\">LeakCanary neprieinama</string>\n    <string name=\"show_crash_the_player_summary\">Naudojant grotuvą rodo lūžio parinkty</string>\n    <string name=\"show_error_snackbar\">Rodyti klaidos juostą</string>\n    <string name=\"detail_pinned_comment_view_description\">Prisegtas komentaras</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Nerasta tinkama failų tvarkyklė. \n\\nĮdiekite „Storage Access Framework“ suderinamą su šia failų tvarkykle</string>\n    <string name=\"error_report_channel_description\">Pranešimai pranešimui apie klaidas</string>\n    <string name=\"show_crash_the_player_title\">Rodyti „Grotuvas užlūžo“</string>\n    <string name=\"create_error_notification\">Kurti klaidos pranešimą</string>\n    <string name=\"error_report_notification_title\">NewPipe susidūrė su klaida, paspauskite norėdami pranešti</string>\n    <string name=\"no_appropriate_file_manager_message\">Šiam veiksmui nebuvo rasta tinkama failų tvarkyklė.\n\\nĮdiekite failų tvarkyklę arba pabandykite išjungti \\\"%s\\\" atsisiuntimo nustatymuose</string>\n    <string name=\"crash_the_player\">Užlūžo</string>\n    <string name=\"error_report_channel_name\">Klaidos pranešimo pranešimas</string>\n    <string name=\"error_report_notification_toast\">Įvyko klaida, peržiūrėti pranešimą</string>\n    <string name=\"settings_category_player_notification_summary\">Konfigūruoti pranešimą apie dabartinę rodomą transliaciją</string>\n    <string name=\"notifications\">Pranešimai</string>\n    <string name=\"check_new_streams\">Paleiskite naujų transliacijų tikrinimą</string>\n    <string name=\"enable_streams_notifications_summary\">Pranešti apie naujas transliacijas iš prenumeratų</string>\n    <string name=\"streams_notifications_interval_title\">Tikrinimo dažnumas</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Perjungti viską</string>\n    <string name=\"enable_streams_notifications_title\">Pranešimai apie naujas transliacijas</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nauja transliacija</item>\n        <item quantity=\"few\">%s naujos transliacijos</item>\n        <item quantity=\"other\">%s naujų transliacijų</item>\n    </plurals>\n    <string name=\"get_notified\">Gaukite pranešimą</string>\n    <string name=\"you_successfully_subscribed\">Dabar užsiprenumeravote šį kanalą</string>\n    <string name=\"streams_notifications_network_title\">Reikalingas tinklo ryšys</string>\n    <string name=\"streams_not_yet_supported_removed\">Transliacijos, kurių dar nepalaiko atsisiuntimo programa, nerodomos</string>\n    <string name=\"unknown_format\">Nežinomas formatas</string>\n    <string name=\"any_network\">Bet koks tinklas</string>\n    <string name=\"delete_downloaded_files_confirm\">Ištrinti visus atsisiųstus failus iš disko\\?</string>\n    <string name=\"settings_category_player_notification_title\">Grotuvo pranešimas</string>\n    <string name=\"streams_notification_channel_description\">Pranešimai apie naujas transliacijas prenumeratoms</string>\n    <string name=\"streams_notification_channel_name\">Naujos transliacijos</string>\n    <string name=\"loading_stream_details\">Įkeliama išsami transliacijos informacija…</string>\n    <string name=\"progressive_load_interval_summary\">Pakeiskite pakrovimo intervalo dydį progresiniam turiniui (šiuo metu %s). Mažesnė vertė gali pagreitinti pradinį įkėlimą</string>\n    <string name=\"percent\">Procentai</string>\n    <string name=\"semitone\">Pustonis</string>\n    <string name=\"progressive_load_interval_title\">Atkūrimo pakrovimo intervalo dydis</string>\n    <string name=\"no_video_streams_available_for_external_players\">Išoriniams grotuvams vaizdo transliacijos nepasiekiamos</string>\n    <string name=\"selected_stream_external_player_not_supported\">Pasirinktos transliacijos išoriniai grotuvai nepalaiko</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Išoriniams grotuvams garso transliacijos nepasiekiamos</string>\n    <string name=\"select_quality_external_players\">Pasirinkite kokybę skirtą išoriniams grotuvams</string>\n    <string name=\"notifications_disabled\">Pranešimai yra išjungti</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">„ExoPlayer“ numatytasis</string>\n    <string name=\"unknown_quality\">Nežinoma kokybė</string>\n    <string name=\"faq_title\">Dažniausiai užduodami klausimai</string>\n    <string name=\"faq\">Žiūrėti svetainėje</string>\n    <string name=\"faq_description\">Jei kyla sunkumų naudojantis programėle, būtinai peržiūrėkite šiuos atsakymus į dažniausiai užduodamus klausimus!</string>\n    <string name=\"sort\">Rikiuoti</string>\n    <string name=\"import_subscriptions_hint\">Importuokite arba eksportuokite prenumeratas iš 3 taškelių meniu</string>\n    <string name=\"fast_mode\">Greitasis režimas</string>\n    <string name=\"app_update_unavailable_toast\">Naudojate naujausią „NewPipe“ versiją</string>\n    <string name=\"app_update_available_notification_text\">Bakstelėkite, kad atsisiųstumėte %s</string>\n    <string name=\"remove_duplicates_message\">Ar norite pašalinti visus pasikartojančius srautus iš šio grojaraščio\\?</string>\n    <string name=\"feed_show_upcoming\">Būsimas</string>\n    <string name=\"duplicate_in_playlist\">Grojaraščiai jau turintys šį elementą išaktyvuoti.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Kartojasi pridėta %d kartus</string>\n    <string name=\"unset_playlist_thumbnail\">Atjungti nuolatinę peržiūrą</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Nepaisyti aparatinės įrangos media mygtukų įvykių</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Naudinga naudojant ausines su sugedusiais fiziniais mygtukais</string>\n    <string name=\"feed_show_watched\">Pilnai peržiūrėta</string>\n    <string name=\"prefer_original_audio_title\">Pageidaujama originalus garso takelis</string>\n    <string name=\"prefer_original_audio_summary\">Pasirinkti originalų audio takelį nepaisant kalbos nustatymo</string>\n    <string name=\"prefer_descriptive_audio_title\">Pageidaujama pasirinktinis garso takelis</string>\n    <string name=\"prefer_descriptive_audio_summary\">Jei įmanoma, pasirinkti garso takelį su aprašymu žmonėms su klausos negalia</string>\n    <string name=\"left_gesture_control_summary\">Pasirinkti gęstą kairei grotuvo ekrano pusei</string>\n    <string name=\"left_gesture_control_title\">Kairio gesto veiksmas</string>\n    <string name=\"right_gesture_control_summary\">Pasirinkite gestą dešiniai grotuvo ekrano pusej</string>\n    <string name=\"play_queue_audio_track\">Garsas: %s</string>\n    <string name=\"audio_track\">Audio takelis</string>\n    <string name=\"card\">Kortelė</string>\n    <string name=\"remove_duplicates\">Pašalinti besikartojančius</string>\n    <string name=\"remove_duplicates_title\">Pašalinti besikartojančius\\?</string>\n    <string name=\"feed_hide_streams_title\">Rodyti šiuos srautus</string>\n    <string name=\"feed_show_partially_watched\">Iš dalies peržiūrėta</string>\n    <string name=\"settings_category_exoplayer_title\">\\\"ExoPlayer\\\" nustatymai</string>\n    <string name=\"settings_category_exoplayer_summary\">Tvarkykite kai kuriuos \\\"ExoPlayer\\\" nustatymus. Kad šie pakeitimai įsigaliotų, grotuvą reikia paleisti iš naujo</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Naudokite „ExoPlayer“ dekoderio atsarginę funkciją</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Visada naudokite \\\"ExoPlayer\\\" vaizdo išvesties paviršiaus nustatymų apėjimą</string>\n    <string name=\"msg_failed_to_copy\">Nepavyko nukopijuoti į iškarpinę</string>\n    <string name=\"audio_track_type_original\">originalus</string>\n    <string name=\"right_gesture_control_title\">Dešinio gesto veiksmas</string>\n    <string name=\"brightness\">Ryškumas</string>\n    <string name=\"volume\">Garsas</string>\n    <string name=\"none\">Nieko</string>\n    <string name=\"feed_show_hide_streams\">Rodyti / slėpti srautus</string>\n    <string name=\"night_theme_available\">Ši parinktis galima tik tada, kai %s pasirinkta kaip tema</string>\n    <string name=\"audio_track_present_in_video\">Šiame sraute jau turėtų būti garso takelis</string>\n    <string name=\"select_audio_track_external_players\">Pasirinkite garso takelį išoriniams grotuvams</string>\n    <string name=\"unknown_audio_track\">Nežinomas</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Š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\n\\nĮjungus šią parinktį gali būti išvengta atkūrimo klaidų, kai perjungiamas dabartinis vaizdo grotuvas arba pereinama į visą ekraną</string>\n    <string name=\"audio_track_type_dubbed\">dubliuotas</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Į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</string>\n    <string name=\"audio_track_type_descriptive\">aprašomasis</string>\n    <string name=\"no_live_streams\">Jokių gyvų transliacijų</string>\n    <string name=\"no_streams\">Jokių transliacijų</string>\n    <string name=\"feed_fetch_channel_tabs\">Parsiųsti kanalo skirtukus</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Kokius skirtukus parsiųsti atnaujinant srauta. Ši parinktis neturi efekto jei kanalas yra atnaujintas greituoju rėžimu.</string>\n    <string name=\"channel_tab_livestreams\">Gyva transliacija</string>\n    <string name=\"channel_tab_shorts\">Trumpi</string>\n    <string name=\"show_more\">Rodyti daugiau</string>\n    <string name=\"reset_all_settings\">Visų nustatymų atstatymas į numatytasias reikšmes panaikins visus jūsų pasirinkimus ir iš naujo paleis programą.\n\\n\n\\nAr norite tęsti?</string>\n    <string name=\"loading_metadata_title\">Metaduomenų įkėlimas…</string>\n    <string name=\"metadata_banners\">Baneriai</string>\n    <string name=\"metadata_subscribers\">Prenumeratoriai</string>\n    <string name=\"play\">Paleisti</string>\n    <string name=\"metadata_uploader_avatars\">Įkėlėjo avataras</string>\n    <string name=\"import_settings_vulnerable_format\">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ų.</string>\n    <string name=\"yes\">Taip</string>\n    <string name=\"no\">Ne</string>\n    <string name=\"main_tabs_position_summary\">Pagrindinio skirtuko parinkiklio perkėlimas į apačią</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Medijos tuneliavimas buvo išjungtas pagal numatytuosius nustatymus jūsų prietaise, nes žinoma, kad jūsų prietaiso modelis jo nepalaiko.</string>\n    <string name=\"auto_update_check_description\">\\\"NewPipe\\\" gali automatiškai patikrinti, ar yra naujų versijų, ir pranešti jums, kai jos pasirodys.\n\\nAr norite tai įjungti?</string>\n    <string name=\"image_quality_none\">Neįkelti paveikslėlių</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"settings_category_backup_restore_title\">Atsarginės kopijos</string>\n    <string name=\"main_tabs_position_title\">Pagrindinio skirtuko pozicija</string>\n    <string name=\"reset_settings_title\">Nustatymų atstatymas</string>\n    <string name=\"reset_settings_summary\">Atstatyti visus nustatymus į numatytasias reikšmes</string>\n    <string name=\"error_insufficient_storage\">Nepakanka laisvos vietos įrenginyje</string>\n    <string name=\"metadata_thumbnails\">Miniatiūra</string>\n    <string name=\"metadata_subchannel_avatars\">Sub-Kanalo avatarai</string>\n    <string name=\"metadata_avatars\">Avatarai</string>\n    <string name=\"image_quality_title\">Vaizdo kokybė</string>\n    <string name=\"forward\">Pirmyn</string>\n    <string name=\"duration\">Trukmė</string>\n    <string name=\"toggle_screen_orientation\">Pakeisti ekrano orientaciją</string>\n    <string name=\"toggle_fullscreen\">Perjungti į pilną ekraną</string>\n    <string name=\"show_channel_tabs\">Kanalų skirtukai</string>\n    <string name=\"show_channel_tabs_summary\">Kokie skirtukai rodomi kanalų puslapiuose</string>\n    <string name=\"replay\">Pakartoti</string>\n    <string name=\"more_options\">Daugiau parinkčių</string>\n    <string name=\"channel_tab_channels\">Kanalai</string>\n    <string name=\"channel_tab_playlists\">Grojaraščiai</string>\n    <string name=\"channel_tab_albums\">Albumai</string>\n    <string name=\"channel_tab_about\">Apie</string>\n    <string name=\"open_play_queue\">Paleisti eilę</string>\n    <string name=\"previous_stream\">Ankstesnė transliacija</string>\n    <string name=\"next_stream\">Sekanti transliacija</string>\n    <string name=\"rewind\">Prasukti</string>\n    <string name=\"image_quality_low\">Žema kokybė</string>\n    <string name=\"image_quality_medium\">Vidutinė kokybė</string>\n    <string name=\"image_quality_high\">Aukšta kokybė</string>\n    <string name=\"channel_tab_videos\">Vaizdo įrašai</string>\n    <string name=\"channel_tab_tracks\">Takeliai</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"share_playlist_with_titles\">Dalintis su pavadinimais</string>\n    <string name=\"share_playlist\">Dalintis grojaraščiu</string>\n    <string name=\"share_playlist_with_list\">Dalintis nuorodų sąrašu</string>\n    <string name=\"show_less\">Rodyti mažiau</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s atsakymas</item>\n        <item quantity=\"few\">%s atsakymai</item>\n        <item quantity=\"other\">%s atsakymų</item>\n    </plurals>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"tab_bookmarks_short\">Grojaraščiai</string>\n    <string name=\"audio_track_type_secondary\">Antrinis</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Dalintis kaip laikinuoju youtube grojaraščiu</string>\n    <string name=\"search_with_service_name\">Ieškoti %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Ieškoti %1$s (%2$s)</string>\n    <string name=\"permission_display_over_apps_message\">Norėdami įjungti \\\"Popup Grotuvą\\\" pasirinkite Android nustatymų meniu pasirinkite %1$s ir įjunkite %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"Leisti piešti virš kitų langų\\\"</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"delete_file\">Pašalinti failą</string>\n    <string name=\"delete_entry\">Ištrinti įrašą</string>\n    <string name=\"select_a_feed_group\">Pasirinkite kanalo grupę</string>\n    <string name=\"no_feed_group_created_yet\">Dar nėra kanalo grupės</string>\n    <string name=\"feed_group_page_summary\">Kanalo grupės puslapis</string>\n    <string name=\"account_terminated_service_provides_reason\">Paskyra pašalinta\\n\\n%1$s dėl šios priežasties: %2$s</string>\n    <string name=\"channel_tab_likes\">Mėgsta</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud Top 50 puslapis pašalintas</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud nebeteikia Top 50. Šis puslapis pašalintas iš jūsų pagrindinio puslapio.</string>\n    <string name=\"migration_info_7_8_title\">YouTube sujungti rekomenduojami pašalinti</string>\n    <string name=\"trending_gaming\">Žaidimų pasiūlymai</string>\n    <string name=\"trending_podcasts\">Mėgstami podcasts</string>\n    <string name=\"trending_movies\">Mėgstami filmai ir laidos</string>\n    <string name=\"trending_music\">Mėgstama muzika</string>\n    <string name=\"entry_deleted\">Įrašas pašalintas</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-lv/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"caption_none\">Nav Subtitri</string>\n    <string name=\"playlist_thumbnail_change_success\">Atskaņošanas saraksta attēls nomainīts.</string>\n    <string name=\"playlist_creation_success\">Atskaņošanas saraksts radīts</string>\n    <string name=\"delete_playlist_prompt\">Dzēst atskaņošanas sarakstu\\?</string>\n    <string name=\"set_as_playlist_thumbnail\">Iestatīt, kā atskaņošanas saraksta attēlu</string>\n    <string name=\"add_to_playlist\">Pievienot atskaņošanas sarakstam</string>\n    <string name=\"name\">Nosaukums</string>\n    <string name=\"rename_playlist\">Pārsaukt</string>\n    <string name=\"create_playlist\">Jauns Atskaņošanas Saraksts</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Ielādē prasīto saturu</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Vāc informāciju…</string>\n    <string name=\"always_ask_open_action\">Vienmēr prasīt</string>\n    <string name=\"popup_player\">Popup atskaņotājs</string>\n    <string name=\"background_player\">Fona atskaņotājs</string>\n    <string name=\"start_here_on_popup\">Sākt atskaņot ar popup</string>\n    <string name=\"start_here_on_background\">Klausīties fonā šo</string>\n    <string name=\"enqueued\">Ielikts rindā</string>\n    <string name=\"enqueue_stream\">Ielikt rindā</string>\n    <string name=\"hold_to_append\">Turiet, lai ieliktu atskaņošanas rindā</string>\n    <string name=\"play_queue_audio_settings\">Audio iestatījumi</string>\n    <string name=\"play_queue_stream_detail\">Detaļas</string>\n    <string name=\"play_queue_remove\">Noņemt</string>\n    <string name=\"title_activity_play_queue\">Atskaņošanas saraksts</string>\n    <string name=\"conferences\">Konferences</string>\n    <string name=\"recently_added\">Nesen pievienots</string>\n    <string name=\"local\">Lokāls</string>\n    <string name=\"new_and_hot\">Jauns un populārs</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"error_unable_to_load_comments\">Nevarēja ielādēt komentārus</string>\n    <string name=\"import_settings\">Vai jūs vēlaties ievietot arī iestatījumus?</string>\n    <string name=\"override_current_data\">Pašreizējie dati tiks aizstāti.</string>\n    <string name=\"could_not_import_all_files\">Uzmanību: Ne visas datnes varēja ievietot.</string>\n    <string name=\"no_valid_zip_file\">Nav derīgs ZIP fails</string>\n    <string name=\"import_complete_toast\">Ievietošana pabeigta</string>\n    <string name=\"export_complete_toast\">Eksportēts</string>\n    <string name=\"select_a_kiosk\">Atlasiet kiosku</string>\n    <string name=\"no_playlist_bookmarked_yet\">Nav atskaņošanas sarakstu pagaidām</string>\n    <string name=\"select_a_playlist\">Atlasiet atskaņošanas sarakstu</string>\n    <string name=\"no_channel_subscribed_yet\">Nav kanālu abonamentu pagaidām</string>\n    <string name=\"select_a_channel\">Atlasiet kanālu</string>\n    <string name=\"channel_page_summary\">Kanāls</string>\n    <string name=\"default_kiosk_page_summary\">Noklusējuma Kiosks</string>\n    <string name=\"kiosk_page_summary\">Kioska lapa</string>\n    <string name=\"blank_page_summary\">Tukša lapa</string>\n    <string name=\"main_page_content_summary\">Kādas cilnes rādīt galvenajā lapā</string>\n    <string name=\"main_page_content\">Galvenā lapa</string>\n    <string name=\"title_most_played\">Visvairāk Atskaņotais</string>\n    <string name=\"title_last_played\">Pēdējais atskaņotais</string>\n    <string name=\"delete_item_search_history\">Vai jūs tiešām vēlaties izdzēst šo vaicājumu no meklēšanas vēstures?</string>\n    <string name=\"action_history\">Vēsture</string>\n    <string name=\"title_activity_history\">Vēsture</string>\n    <string name=\"read_full_license\">Izlasīt licenci</string>\n    <string name=\"app_license\">Newpipe ir bezmaksas programmatūra: jūs varat izmantot, izpētīt, dalīties un uzlabot to jebkurā brīdī. Tieši jūs varat kopīgot un/ vai modificēt to saskaņā ar GNU Vispārējās Publiskās Licences noteikumiem, ko publicējusi Brīvās Programmatūras Fonds, vai nu 3. licences versija, vai (pēc jūsu izvēles) jebkura vēlāka versija.</string>\n    <string name=\"app_license_title\">NewPipe Licence</string>\n    <string name=\"read_privacy_policy\">Izslasīt privātuma politiku</string>\n    <string name=\"privacy_policy_encouragement\">Datu aizsardzība ir ļoti svarīga NewPipe projektam. Tāpēc lietotne neapkopo datus bez jūsu piekrišanas.\\nNewPipe konfidencialitātes politika sīki izskaidro, kādi dati tiek nosūtīti un uzglabāti, kad nosūtiet avārijas ziņojumu.</string>\n    <string name=\"privacy_policy_title\">NewPipe Privātuna Politika</string>\n    <string name=\"website_encouragement\">Apmeklēt NewPipe mājaslapu, lai iegūtu vairāk informācijas un ziņu.</string>\n    <string name=\"website_title\">Mājaslapa</string>\n    <string name=\"give_back\">Dot atpakaļ</string>\n    <string name=\"donation_encouragement\">Newpipe izstrādā brīvprātīgie, kas pavada savu brīvo laiku, sniedzot vislabāko lietotāju pieredzi. Dodiet palīdzību izstrādātājiem, kuri padara NewPipe vēl lābāku.</string>\n    <string name=\"donation_title\">Ziedot</string>\n    <string name=\"view_on_github\">Apskatīt GitHub</string>\n    <string name=\"contribution_encouragement\">Vienalga, kādas idejas Jums ir; Tulkojuma, dizaina izmaiņu, koda tīrīšanas vai reāli smagas kodu izmaiņas - palīdzība vienmēr ir laipni gaidīta. Jo vairāk tiek darīts, jo labāks tas kļūst!</string>\n    <string name=\"contribution_title\">Atbalstiet</string>\n    <string name=\"app_description\">Libre, viegla atskaņošana uz Android.</string>\n    <string name=\"tab_licenses\">Licences</string>\n    <string name=\"tab_about\">Par un BUJ</string>\n    <string name=\"title_licenses\">Trešo pušu licences</string>\n    <string name=\"title_activity_about\">Par NewPipe</string>\n    <string name=\"charset_most_special_characters\">Lielākā daļa īpašo rakstzīmju</string>\n    <string name=\"charset_letters_and_digits\">Burti un cipari</string>\n    <string name=\"settings_file_replacement_character_title\">Aizvietošanas rakstzīme</string>\n    <string name=\"settings_file_replacement_character_summary\">Nederīgas rakstzīmes tiks aizvietotas ar šo</string>\n    <string name=\"settings_file_charset_title\">Atļautās rakstzīmes failu nosaukumos</string>\n    <string name=\"settings_category_downloads_title\">Lejupielādēt</string>\n    <string name=\"done\">Pabeigts</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA izaicinājums dots</string>\n    <string name=\"subtitle_activity_recaptcha\">Nospiediet \\\"Pabeigts\\\", kad to atrisinat</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA izaicinājums</string>\n    <string name=\"one_item_deleted\">1 lieta izdzēsta.</string>\n    <string name=\"msg_popup_permission\">Šī atļauja ir nepieciešama, lai\n\\natvērtu popup režīmā</string>\n    <string name=\"no_available_dir\">Lūdzu nosakiet lejupielādes mapi iestatījumos vēlāk</string>\n    <string name=\"msg_copied\">Nokopēts uz starpliktuvi</string>\n    <string name=\"msg_wait\">Lūdzu uzgaidiet…</string>\n    <string name=\"msg_calculating_hash\">Aprēķina</string>\n    <string name=\"msg_running_detail\">Nospiediet priekš detaļām</string>\n    <string name=\"msg_running\">NewPipe lejupielādē</string>\n    <string name=\"msg_error\">Kļūda</string>\n    <string name=\"msg_threads\">Procesi</string>\n    <string name=\"msg_name\">Faila nosaukums</string>\n    <string name=\"ok\">Labi</string>\n    <string name=\"rename\">Pārsaukt</string>\n    <string name=\"dismiss\">Noraidīt</string>\n    <string name=\"checksum\">Kontrolsumma</string>\n    <string name=\"delete\">Izdzēst</string>\n    <string name=\"create\">Radīt</string>\n    <string name=\"pause\">Pauzēt</string>\n    <string name=\"start\">Sākt</string>\n    <string name=\"no_comments\">Nav komentāru</string>\n    <plurals name=\"videos\">\n        <item quantity=\"zero\">%s videoklipi</item>\n        <item quantity=\"one\">%s videoklips</item>\n        <item quantity=\"other\">%s videoklipi</item>\n    </plurals>\n    <string name=\"infinite_videos\">∞ videoklipi</string>\n    <string name=\"more_than_100_videos\">100+ videoklipi</string>\n    <string name=\"no_videos\">Nav videoklipi</string>\n    <plurals name=\"listening\">\n        <item quantity=\"zero\">%s klausītāju</item>\n        <item quantity=\"one\">%s klausītājs</item>\n        <item quantity=\"other\">%s klausītāji</item>\n    </plurals>\n    <string name=\"no_one_listening\">Neviens neklausās</string>\n    <plurals name=\"watching\">\n        <item quantity=\"zero\">%s skatītāju</item>\n        <item quantity=\"one\">%s skatītājs</item>\n        <item quantity=\"other\">%s skatītāji</item>\n    </plurals>\n    <string name=\"no_one_watching\">Neviens neskatās</string>\n    <plurals name=\"views\">\n        <item quantity=\"zero\">%s skatījumi</item>\n        <item quantity=\"one\">%s skatījums</item>\n        <item quantity=\"other\">%s skatījumi</item>\n    </plurals>\n    <string name=\"no_views\">Nav skatījumu</string>\n    <string name=\"subscribers_count_not_available\">Abonentu skaits nav pieejams</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"zero\">%s abonenti</item>\n        <item quantity=\"one\">%s abonents</item>\n        <item quantity=\"other\">%s abonenti</item>\n    </plurals>\n    <string name=\"no_subscribers\">Nav abonentu</string>\n    <string name=\"drawer_header_description\">Izvēlaties pakalpojumu, šobrīd izvēlēts:</string>\n    <string name=\"retry\">Atkārtot</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"video\">Video</string>\n    <string name=\"detail_drag_description\">Velciet, lai mainītu secību</string>\n    <string name=\"empty_list_subtitle\">Šeit nekā nav, tikai sienāži</string>\n    <string name=\"search_no_results\">Nav resultātu</string>\n    <string name=\"description_tab_description\">Apraksts</string>\n    <string name=\"related_items_tab_description\">Līdzīgi video</string>\n    <string name=\"comments_tab_description\">Komentāri</string>\n    <string name=\"detail_dislikes_img_view_description\">Nepatīk</string>\n    <string name=\"detail_likes_img_view_description\">Patīk</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Autora avatāra attēls</string>\n    <string name=\"detail_thumbnail_view_description\">Atskaņot video, ilgums:</string>\n    <string name=\"error_details_headline\">Detaļas:</string>\n    <string name=\"your_comment\">Jūsu komentārs (Angliski):</string>\n    <string name=\"info_labels\">Kas:\\nRequest:\\nContent Valoda:\\nContent Valsts:\\nApp Valoda:\\nService:\\nGMT Laiks:\\nPackage:\\nVersion:\\nOS versija:</string>\n    <string name=\"hash_channel_description\">Paziņojumi video apstrādes progresam</string>\n    <string name=\"hash_channel_name\">Video haša paziņojums</string>\n    <string name=\"popup_remember_size_pos_summary\">Atceras pēdējo uznirstošā loga izmēru un pozīciju</string>\n    <string name=\"popup_remember_size_pos_title\">Atcerēties uznirstošā loga īpašības</string>\n    <string name=\"default_popup_resolution_title\">Noklusējuma uznirstošā loga izšķirtspēja</string>\n    <string name=\"controls_popup_title\">Skatīt uznirstošā logā</string>\n    <string name=\"open_in_popup_mode\">Atvērt uznirstošā logā</string>\n    <string name=\"what_happened_headline\">Kas notika:</string>\n    <string name=\"what_device_headline\">Informācija:</string>\n    <string name=\"error_snackbar_action\">Ziņot</string>\n    <string name=\"error_snackbar_message\">Piedodiet, kaut kas nogāja greizi.</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_report_open_issue_button_text\">Ziņot izmantojot GitHub</string>\n    <string name=\"copy_for_github\">Kopēt formatētu ziņojumu</string>\n    <string name=\"error_report_button_text\">Ziņojiet pa e-pastu</string>\n    <string name=\"sorry_string\">Piedotiet, tam nevajadzēja notikt.</string>\n    <string name=\"permission_display_over_apps\">Dot atļauju rādīt pāri citām aplikācijām</string>\n    <string name=\"restore_defaults_confirmation\">Vai jūs tiešām vēlaties atjaunot noklusējuma vērtības?</string>\n    <string name=\"restore_defaults\">Atjaunot noklusējuma vērtības</string>\n    <string name=\"saved_tabs_invalid_json\">Nevarēja nolasīt saglabātās cilnes, tādēļ izmanto noklusējuma</string>\n    <string name=\"no_streams_available_download\">Neviens video nav pieejams lejupielādei</string>\n    <string name=\"error_occurred_detail\">Notika kļūda: %1$s</string>\n    <string name=\"file_name_empty_error\">Faila nosaukums nevar būt tukšs</string>\n    <string name=\"invalid_file\">Datne neeksistē vai nav dota atļauja to lasīt vai rakstīt</string>\n    <string name=\"invalid_source\">Tāds fails/saturs neeksistē</string>\n    <string name=\"invalid_directory\">Tāda mape neeksistē</string>\n    <string name=\"missing_file\">Fails pārvietots vai izdzēsts</string>\n    <string name=\"audio_streams_empty\">Netika atrasts audio</string>\n    <string name=\"video_streams_empty\">Netika atrasti video</string>\n    <string name=\"external_player_unsupported_link_type\">Ārējie atskaņotāj neatbalsta šāda tipa saites</string>\n    <string name=\"player_recoverable_failure\">Atgūstas no atskaņotāja kļūdas</string>\n    <string name=\"player_unrecoverable_failure\">Notika kļūda atskaņotājā</string>\n    <string name=\"player_stream_failure\">Nevarēja atskaņot šo video</string>\n    <string name=\"app_ui_crash\">Aplikācijas/UI avārija</string>\n    <string name=\"could_not_setup_download_menu\">Nevarēja iestatīt lejupielādes izvēlni</string>\n    <string name=\"content_not_available\">Saturs nav pieejams</string>\n    <string name=\"parsing_error\">Nevarēja apstrādāt mājaslapu</string>\n    <string name=\"could_not_load_thumbnails\">Nevarēja ielādēt visus video attēlus</string>\n    <string name=\"network_error\">Tīkla kļūda</string>\n    <string name=\"download_to_sdcard_error_message\">Lejupielādēt uz SD karti nav iespējams. Atiestatīt lejupielāžu mapes lokāciju\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Ārējā krātuve nepieejama</string>\n    <string name=\"general_error\">Kļūda</string>\n    <string name=\"search_history_deleted\">Meklēšanas vēsture izdzēsta</string>\n    <string name=\"delete_search_history_alert\">Vai tiešām izdzēst visu meklēšanas vēsturi?</string>\n    <string name=\"clear_search_history_summary\">Izdzēš meklēto vārdu vēsturi</string>\n    <string name=\"clear_search_history_title\">Notīrīt meklēšanas vēsturi</string>\n    <string name=\"watch_history_states_deleted\">Atskaņošanas pozīcikas izdzēstas</string>\n    <string name=\"delete_playback_states_alert\">Izdzēst visas atskaņošanas pozīcijas\\?</string>\n    <string name=\"clear_playback_states_summary\">Izdzēš visas atskaņošanas pozīcijas</string>\n    <string name=\"clear_playback_states_title\">Izdzēst atskaņošanas pozīcijas</string>\n    <string name=\"watch_history_deleted\">Skatīšanās vēsture izdzēsta</string>\n    <string name=\"delete_view_history_alert\">Izdzēst visu skatīšanās vēsturi\\?</string>\n    <string name=\"clear_views_history_summary\">Izdzēš atskaņoto videoklipu un atskaņošanas pozīciju vēsturi</string>\n    <string name=\"clear_views_history_title\">Notīrīt skatīšanās vēsturi</string>\n    <string name=\"clear_cookie_summary\">Notīrīt sīkfailus , kurus NewPipe saglabā, kad jūs atrisinat reCAPTCHA</string>\n    <string name=\"export_data_summary\">Eksportēt vēsturi, abonementus, atskaņošanas sarakstus un iestatījumus</string>\n    <string name=\"import_data_summary\">Aizstās jūsu pašreizējo vēsturi, abonementus, atskaņošanas sarakstus un (pēc izvēles) iestatījumus</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA sīkfaili tika izdzēsti</string>\n    <string name=\"clear_cookie_title\">Izdzēst reCAPTCHA sīkfailus</string>\n    <string name=\"export_data_title\">Eksportēt datubāzi</string>\n    <string name=\"import_data_title\">Ievietot datubāzi</string>\n    <string name=\"switch_to_main\">Pārslēgt uz Galveno</string>\n    <string name=\"switch_to_popup\">Pārslēgt uz Popup</string>\n    <string name=\"switch_to_background\">Pārslēgt uz Fonu</string>\n    <string name=\"unknown_content\">[Nezināms]</string>\n    <string name=\"app_update_notification_channel_description\">Paziņojumi par jaunām NewPipe versijām</string>\n    <string name=\"app_update_notification_channel_name\">Aplikācijas atjauninājuma paziņojums</string>\n    <string name=\"notification_channel_description\">Paziņojumi priekš NewPipe atskaņotāja</string>\n    <string name=\"notification_channel_name\">NewPipe paziņojums</string>\n    <string name=\"file\">Fails</string>\n    <string name=\"just_once\">Tikai Vienreiz</string>\n    <string name=\"always\">Vienmēr</string>\n    <string name=\"play_all\">Atskaņot Visu</string>\n    <string name=\"file_deleted\">Fails izdzēsts</string>\n    <string name=\"undo\">Atsaukt</string>\n    <string name=\"best_resolution\">Labākā izšķirtspēja</string>\n    <string name=\"clear\">Notīrīt</string>\n    <string name=\"disabled\">Atspējots</string>\n    <string name=\"artists\">Mākslinieki</string>\n    <string name=\"albums\">Albūmi</string>\n    <string name=\"songs\">Dziesmas</string>\n    <string name=\"events\">Notikumi</string>\n    <string name=\"users\">Lietotāji</string>\n    <string name=\"tracks\">Dziesmas</string>\n    <string name=\"videos_string\">Videoklipi</string>\n    <string name=\"playlists\">Atskaņošanas saraksts</string>\n    <string name=\"channels\">Kanāli</string>\n    <string name=\"all\">Visi</string>\n    <string name=\"error_report_title\">Kļūdas ziņojums</string>\n    <string name=\"downloads_title\">Lejupielādes</string>\n    <string name=\"downloads\">Lejupielādes</string>\n    <string name=\"duration_live\">Tiešraide</string>\n    <string name=\"restricted_video\">Šis video ir vecuma ierobežots.\n\\n\n\\nIeslēdziet \\\"%1$s\\\" iestatījumos, ja vēlaties to redzēt.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube piedāvā \\\"ierobežotu režīmu\\\", kas slēpj potenciāli pieaugušo saturu</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Ieslēgt YouTube \\\"Ierobežoto režīmu\\\"</string>\n    <string name=\"show_age_restricted_content_summary\">Rādīt saturu, iespējams nepiemērotu bērniem, jo tam ir vecuma ierobežojums</string>\n    <string name=\"show_age_restricted_content_title\">Rādīt vecuma ierobežotu saturu</string>\n    <string name=\"content\">Saturs</string>\n    <string name=\"popup_playing_toast\">Atskaņo popup režīmā</string>\n    <string name=\"background_player_playing_toast\">Atskaņo fonā</string>\n    <string name=\"settings_category_updates_title\">Atjauninājumi</string>\n    <string name=\"settings_category_debug_title\">Atkļūdošana</string>\n    <string name=\"settings_category_appearance_title\">Izskats</string>\n    <string name=\"settings_category_history_title\">Vēsture un kešatmiņa</string>\n    <string name=\"settings_category_video_audio_title\">Video un audio</string>\n    <string name=\"settings_category_player_behavior_title\">Uzvedība</string>\n    <string name=\"settings_category_player_title\">Atskaņotājs</string>\n    <string name=\"peertube_instance_add_exists\">Instance jau eksistē</string>\n    <string name=\"peertube_instance_add_https_only\">Tikai HTTPS saišu URL ir atbalstīti</string>\n    <string name=\"peertube_instance_add_fail\">Nevarēja apstiprināt instanci</string>\n    <string name=\"peertube_instance_add_help\">Ievadīt instances saites URL</string>\n    <string name=\"peertube_instance_add_title\">Pievienot instanci</string>\n    <string name=\"peertube_instance_url_help\">Atrodiet instances, kas jums patīk ar %s</string>\n    <string name=\"peertube_instance_url_summary\">Atlasiet savas iecienītākās PeerTube instances</string>\n    <string name=\"peertube_instance_url_title\">PeerTube serveri (instances)</string>\n    <string name=\"no_app_to_open_intent\">Neviena lietotne jūsu ierīcē nevar šo atvērt</string>\n    <string name=\"chapters\">Nodaļas</string>\n    <string name=\"recent\">Jaunākie</string>\n    <string name=\"show_thumbnail_summary\">Izmantot video attēlu gan bloķēšanas ekrāna fonam, gan paziņojumiem</string>\n    <string name=\"show_thumbnail_title\">Rādīt video attēlus</string>\n    <string name=\"playlist_page_summary\">Atskaņošanas sarakstu lapa</string>\n    <string name=\"video_detail_by\">No %s</string>\n    <string name=\"channel_created_by\">Izveidoja %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanāla avatāra attēls</string>\n    <string name=\"content_not_supported\">NewPipe šo saturu vēl neatbalsta.\n\\n\n\\nCerams, ka to atbalstīs nākamajā versijā.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Vai jūs domājat, ka plūsmas atjaunināšana ir pārāk lēna? Ja tā, mēģiniet iespējot ātro atjaunināšanu (to var mainīt iestatījumos vai nospiežot pogu zemāk). \\n \\nNewPipe piedāvā divas plūsmas atjaunināšanas stratēģijas: \\n• Notiek visa abonēšanas kanāla iegūšana, kas ir lēna, bet pabeigta. \\n• izmantojot īpašu servisu, kas ir ātrs, bet parasti nav pilnīgs. \\n \\nAtšķirība starp abiem ir tā, ka ātrajā parasti trūkst informācijas, piemēram, video ilgums vai veids (nevar atšķirt tiešraides video no parastajiem), un tas var atgriezt mazāk vienumu. \\n \\nYouTube ir pakalpojuma piemērs, kas piedāvā šo ātro metodi ar savu RSS plūsmu. \\n \\nTātad izvēle sakrīt ar vēlamo: ātrums vai precīza informācija.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Izslēgt ātro režīmu</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Ieslēgt ātro režīmu</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Pieejams dažos pakalpojumos, tas parasti ir daudz ātrāk, taču var atgriezt ierobežotu daudzumu informācijas un bieži arī nepilnīgu informāciju (piemēram, nav video ilguma, vienuma veida, nav tiešraides statusa)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Iegūt no īpašās plūsmas, kad tas ir pieejams</string>\n    <string name=\"feed_update_threshold_option_always_update\">Vienmēr atjauniniet</string>\n    <string name=\"feed_update_threshold_summary\">Laiks pēc pēdējās atjaunināšanas, pirms abonements tiek uzskatīts par novecojušu — %s</string>\n    <string name=\"feed_update_threshold_title\">Plūsmas atjaunināšanas biežuma slieksnis</string>\n    <string name=\"settings_category_feed_title\">Straume</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Rādīt tikai nepievienotus grupai abonementus</string>\n    <string name=\"feed_create_new_group_button_title\">Izveidot jaunu grupu</string>\n    <string name=\"feed_group_dialog_delete_message\">Vai tiešām vēlaties izdzēst šo grupu?</string>\n    <string name=\"feed_group_dialog_empty_name\">Tukšs grupas nosaukums</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"zero\">%d atlasīti</item>\n        <item quantity=\"one\">%d atlasīts</item>\n        <item quantity=\"other\">%d atlasīti</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Nav atlasīts neviens abonements</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Atlasīt abonementus</string>\n    <string name=\"feed_processing_message\">Notiek plūsmas apstrāde …</string>\n    <string name=\"feed_notification_loading\">Notiek plūsmas ielāde…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Nav ielādēts: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Atjaunināta: %s</string>\n    <string name=\"feed_groups_header_title\">Abonementu grupas</string>\n    <string name=\"fragment_feed_title\">Kas jauns</string>\n    <plurals name=\"days\">\n        <item quantity=\"zero\">%d dienas</item>\n        <item quantity=\"one\">%d dienu</item>\n        <item quantity=\"other\">%d dienas</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"zero\">%d stundas</item>\n        <item quantity=\"one\">%d stundu</item>\n        <item quantity=\"other\">%d stundas</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"zero\">%d minūtes</item>\n        <item quantity=\"one\">%d minūti</item>\n        <item quantity=\"other\">%d minūtes</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"zero\">%d sekundes</item>\n        <item quantity=\"one\">%d sekundi</item>\n        <item quantity=\"other\">%d sekundes</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">ExoPlayer ierobežojumu dēļ tīšanas solis tika iestatīts uz %d sekundēm</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Jā, un daļēji skatītos</string>\n    <string name=\"remove_watched_popup_warning\">Tiešraides, kas iepriekš noskatītas un pēc tam pievienotas atskaņošanas sarakstam, tiks noņemtas. \\nVai tiešām turpināt?</string>\n    <string name=\"remove_watched_popup_title\">Vai tiešām noņemt skatītās tiešraides?</string>\n    <string name=\"remove_watched\">Noņemt skatīto</string>\n    <string name=\"systems_language\">System default</string>\n    <string name=\"app_language_title\">Lietotnes valoda</string>\n    <string name=\"choose_instance_prompt\">Izvēlieties instanci</string>\n    <string name=\"downloads_storage_use_saf_title\">Izmantot sistēmas mapes izvēlni</string>\n    <string name=\"downloads_storage_use_saf_summary\">“Krātuves Piekļuves Sistēma” ļauj lejupielādēt ārējā SD kartē</string>\n    <string name=\"downloads_storage_ask_summary\">Jums tiks jautāts, kur saglabāt katru lejupielādi.\n\\nIeslēdziet sistēmas mapes izvēlni, ja vēlaties lejupielādēt uz ārējo SD karti</string>\n    <string name=\"downloads_storage_ask_title\">Jautājiet, kur lejupielādēt</string>\n    <string name=\"pause_downloads\">Pauzēt lejupielādes</string>\n    <string name=\"start_downloads\">Sākt lejupielādes</string>\n    <string name=\"enable_queue_limit_desc\">Viena lejupielāde notiks vienlaikus</string>\n    <string name=\"enable_queue_limit\">Ierobežot lejupielāžu rindu</string>\n    <string name=\"close\">Aizvērt</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Noderīgi, pārejot uz mobilajiem datiem, lai gan dažas lejupielādes nevar apturēt</string>\n    <string name=\"pause_downloads_on_mobile\">Pārtraukt ierobežotajos tīklos</string>\n    <string name=\"max_retry_desc\">Maksimālais mēģinājumu skaits pirms lejupielādes atcelšanas</string>\n    <string name=\"max_retry_msg\">Maksimālais atkārtoto mēģinājumu skaits</string>\n    <string name=\"stop\">Stop</string>\n    <string name=\"delete_downloaded_files\">Dzēst lejupielādētos failus</string>\n    <string name=\"confirm_prompt\">Vai vēlaties notīrīt lejupielāžu vēsturi vai izdzēst visus lejupielādētos failus\\?</string>\n    <string name=\"clear_download_history\">Notīrīt lejupielāžu vēsturi</string>\n    <string name=\"error_download_resource_gone\">Nevar atgūt šo lejupielādi</string>\n    <string name=\"error_timeout\">Savienojums pārtraukts</string>\n    <string name=\"error_progress_lost\">Progress zaudēts, jo fails tika izdzēsts</string>\n    <string name=\"error_insufficient_storage_left\">Ierīcē nav vietas</string>\n    <string name=\"error_postprocessing_stopped\">Strādājot ar failu, NewPipe tika aizvērts</string>\n    <string name=\"error_postprocessing_failed\">Pēcapstrāde neizdevās</string>\n    <string name=\"error_http_not_found\">Nav atrasts</string>\n    <string name=\"error_http_unsupported_range\">Serveris nepieņem vairāku procesu lejupielādes, mēģiniet vēlreiz ar @ string / msg_threads = 1</string>\n    <string name=\"error_http_no_content\">Serveris nesūta datus</string>\n    <string name=\"error_connect_host\">Nevar izveidot savienojumu ar serveri</string>\n    <string name=\"error_unknown_host\">Nevarēja atrast serveri</string>\n    <string name=\"error_ssl_exception\">Nevarēja izveidot drošu savienojumu</string>\n    <string name=\"error_path_creation\">Nevar izveidot mērķa mapi</string>\n    <string name=\"error_file_creation\">Failu nevar izveidot</string>\n    <string name=\"show_error\">Rādīt kļūdu</string>\n    <string name=\"download_already_pending\">Ir gaidāma lejupielāde ar šo nosaukumu</string>\n    <string name=\"download_already_running\">Notiek lejupielāde ar šo nosaukumu</string>\n    <string name=\"overwrite_failed\">nevar pārrakstīt datni</string>\n    <string name=\"overwrite_finished_warning\">Lejupielādēts fails ar šo nosaukumu jau pastāv</string>\n    <string name=\"overwrite_unrelated_warning\">Fails ar šo nosaukumu jau pastāv</string>\n    <string name=\"overwrite\">Pārrakstīt</string>\n    <string name=\"generate_unique_name\">Ģenerēt unikālu nosaukumu</string>\n    <string name=\"permission_denied\">Darbību noraidīja sistēma</string>\n    <string name=\"recovering\">atkopjas</string>\n    <string name=\"post_processing\">pēcapstrāde</string>\n    <string name=\"queued\">ielikts rindā</string>\n    <string name=\"list_view_mode\">Saraksta skata režīms</string>\n    <string name=\"autoplay_summary\">Sākt atskaņošanu automātiski — %s</string>\n    <string name=\"minimize_on_exit_summary\">Darbība, pārslēdzoties uz citu lietotni no galvenā video atskaņotāja — %s</string>\n    <string name=\"minimize_on_exit_title\">Minimizēt, pārslēdzot aplikāciju</string>\n    <string name=\"playback_step\">Solis</string>\n    <string name=\"skip_silence_checkbox\">Klusuma brīžos patīt uz priekšu</string>\n    <string name=\"unhook_checkbox\">Atvienot (var izraisīt traucējumus)</string>\n    <string name=\"import_network_expensive_warning\">Paturiet prātā, ka šī darbība var pieprasīt lielu datu daudzumu\n\\n\n\\nVai vēlaties turpināt\\?</string>\n    <string name=\"drawer_close\">Aizvērt Atvilkni</string>\n    <string name=\"drawer_open\">Atvērt Atvilkni</string>\n    <string name=\"most_liked\">Vispopulārākais</string>\n    <string name=\"import_soundcloud_instructions_hint\">jūsuID , soundcloud.com/jūsuID</string>\n    <string name=\"import_soundcloud_instructions\">Importējiet SoundCloud profilu, ierakstot URL vai ID:\n\\n\n\\n1. Tīmekļa pārlūkprogrammā ieslēdziet \\\"datoru vietni\\\" (vietne nav pieejama mobilajām ierīcēm)\n\\n2. Dodieties uz šo URL:%1$s\n\\n3. Ierakstaties, kad tiek prasīts\n\\n4. Nokopējiet profila URL, uz kuru tikāt novirzīts.</string>\n    <string name=\"import_youtube_instructions\">Ievietot YouTube abonementus 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 IEVIETOT DATNI zemāk un izvēlaties lejupielādēto .zip failu\\n7. [Ja .zip failu neizdodas ievietot] Izvelciet .csv failu (parasti zem \\\"YouTube un YouTube Music/subscriptions/subscriptions.csv\\\") no arhīva, tad noklikšķiniet uz IEVIETOT DATNI zemāk un atlasiet tikko izvilkto csv failu</string>\n    <string name=\"preferred_open_action_settings_summary\">Noklusējuma darbība, kad atver saturu — %s</string>\n    <string name=\"show_original_time_ago_summary\">Pakalpojumu oriģinālteksti būs redzami video vienumos</string>\n    <string name=\"enable_disposed_exceptions_summary\">Pēc izdzēšanas, piespiedu kārtā ziņot par nepiegādātiem Rx izņēmumiem, ārpus fragmenta vai darbības dzīves cikla</string>\n    <string name=\"enable_disposed_exceptions_title\">Ziņot par ārpus-dzīves-cikla kļūdu</string>\n    <string name=\"enable_leak_canary_summary\">Atmiņas noplūdes uzraudzība var izraisīt lietotnes nereaģēšanu, kad tiek nottīrītas vairs nevajadzīgas lietas no atmiņas</string>\n    <string name=\"caption_setting_description\">Mainīt atskaņotāja subtitru teksta mērogu un fona stilus. Nepieciešama lietotnes restartēšana, lai tā stātos spēkā</string>\n    <string name=\"playlist_no_uploader\">Automātiski ģenerēts (neviens augšupielādētājs nav atrasts)</string>\n    <string name=\"playlist_add_stream_success\">Ielikts atskaņošanas sarakstā</string>\n    <string name=\"unbookmark_playlist\">Noņemt Grāmatzīmi</string>\n    <string name=\"bookmark_playlist\">Piespraust atskaņošanas sarakstu</string>\n    <string name=\"unmute\">Izslēgt audio</string>\n    <string name=\"mute\">Ieslēgt audio</string>\n    <string name=\"video_player\">Video atskaņotājs</string>\n    <string name=\"preferred_open_action_settings_title\">Vēlamā \\'atvēršanas\\' darbība</string>\n    <string name=\"trending\">Tendences</string>\n    <string name=\"copyright\">© %1$s no %2$s zem %3$s</string>\n    <string name=\"download_failed\">Lejupielāde neizdevās</string>\n    <string name=\"enqueue\">Pievienot rindai</string>\n    <string name=\"paused\">Pausēts</string>\n    <string name=\"missions_header_pending\">Gaida</string>\n    <string name=\"missions_header_finished\">Pabeigts</string>\n    <string name=\"app_update_available_notification_title\">Ir pieejams Newpipe atjauninājums!</string>\n    <string name=\"auto\">Automātiski</string>\n    <string name=\"grid\">Tīkls</string>\n    <string name=\"list\">Saraksts</string>\n    <string name=\"never\">Nekad</string>\n    <string name=\"wifi_only\">Tikai ar Wi-Fi</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimizēt uz popup atskaņotāju</string>\n    <string name=\"minimize_on_exit_background_description\">Minimizēt uz fona atskaņotāju</string>\n    <string name=\"minimize_on_exit_none_description\">Nav</string>\n    <string name=\"updates_setting_description\">Rādīt paziņojumu, ja pieejama jauna lietotnes versija</string>\n    <string name=\"updates_setting_title\">Atjauninājumi</string>\n    <string name=\"limit_mobile_data_usage_title\">Ierobežots izšķirtspēju, izmantojot mobilos datus</string>\n    <string name=\"limit_data_usage_none_description\">Nav ierobežojuma</string>\n    <string name=\"decline\">Nepiekrist</string>\n    <string name=\"accept\">Piekrist</string>\n    <string name=\"start_accept_privacy_policy\">Lai ievērotu Eiropas Vispārīgo datu aizsardzības regulu (GDPR), mēs vēršam jūsu uzmanību NewPipe konfidencialitātes politikai. Lūdzu, rūpīgi izlasiet to.\\nJums tā ir jāpieņem, lai nosūtītu mums kļūdas ziņojumu.</string>\n    <string name=\"playback_reset\">Atiestatīt</string>\n    <string name=\"playback_pitch\">Tonis</string>\n    <string name=\"playback_tempo\">Temps</string>\n    <string name=\"playback_speed_control\">Atskaņošanas Ātruma Kontrole</string>\n    <string name=\"subscriptions_export_unsuccessful\">Nevarēja eksportēt abonementus</string>\n    <string name=\"subscriptions_import_unsuccessful\">Nevarēja importēt abonementus</string>\n    <string name=\"previous_export\">Pagājušais eksports</string>\n    <string name=\"import_file_title\">Importēt failu</string>\n    <string name=\"export_ongoing\">Eksportē…</string>\n    <string name=\"import_ongoing\">Ievieto…</string>\n    <string name=\"export_to\">Eksportēt uz</string>\n    <string name=\"import_from\">Ievietot no</string>\n    <string name=\"import_title\">Ievietot</string>\n    <string name=\"show_original_time_ago_title\">Rādīt oriģinālo laiku uz lietām</string>\n    <string name=\"show_memory_leaks\">Rādīt atmiņas noplūdes</string>\n    <string name=\"caption_setting_title\">Subtitri</string>\n    <string name=\"caption_auto_generated\">Automātiski radīti</string>\n    <string name=\"resize_zoom\">Pietuvināt</string>\n    <string name=\"resize_fill\">Piepildīt</string>\n    <string name=\"resize_fit\">Pielāgot</string>\n    <string name=\"content_language_title\">Noklusējuma satura valoda</string>\n    <string name=\"default_content_country_title\">Noklusējuma satura valsts</string>\n    <string name=\"unsupported_url_dialog_message\">Nevarēja atpazīt saites URL. Vai atvērt citā lietotnē?</string>\n    <string name=\"unsupported_url\">Neatbalstīts saites URL</string>\n    <string name=\"show_hold_to_append_summary\">Rādīt padomu, kad nospiežat fona vai popup pogu pie video \\\"Informācija:\\\"</string>\n    <string name=\"show_hold_to_append_title\">Rādīt \\\"Nospiediet, lai pievienotu\\\" padomu</string>\n    <string name=\"autoplay_title\">Automātiski atskaņot</string>\n    <string name=\"download_dialog_title\">Lejupielādēt</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Turpina atskaņot video pēc pārtraukumiem (piemēram, telefona zvana)</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Turpināt atskaņošanu</string>\n    <string name=\"enable_watch_history_summary\">Uzglabā skatīto video vēsturi</string>\n    <string name=\"settings_category_clear_data_title\">Notīrīt datus</string>\n    <string name=\"enable_playback_state_lists_summary\">Rāda atskaņošanas pozīcijas indikatoru sarakstos</string>\n    <string name=\"enable_playback_state_lists_title\">Atskaņošanas pozīcija sarakstos</string>\n    <string name=\"enable_playback_resume_summary\">Saglabāt pēdējo atskaņošanas pozīciju</string>\n    <string name=\"enable_playback_resume_title\">Atsākt atskaņošanu</string>\n    <string name=\"enable_watch_history_title\">Skatīšanās vēsture</string>\n    <string name=\"enable_search_history_summary\">Glabāt meklēšanas vēsturi lokāli (ierīces krātuvē)</string>\n    <string name=\"enable_search_history_title\">Meklēšanas vēsture</string>\n    <string name=\"show_search_suggestions_summary\">Atlasīt, kādus ieteikumus rādīt, ievadot vaicājumu meklēšanas joslā</string>\n    <string name=\"show_search_suggestions_title\">Meklēšanas ieteikumi</string>\n    <string name=\"auto_queue_toggle\">Automātiski pievienot</string>\n    <string name=\"auto_queue_summary\">Pievieno līdzīgus video atskaņošanas rindai, kad atskaņo pēdējo video, ja vien nav iespējota atkārtotā, malt uz riņķi, atskaņošana</string>\n    <string name=\"auto_queue_title\">Automātiski pievienot nākamo video</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metadatu kešatmiņa notīrīta</string>\n    <string name=\"metadata_cache_wipe_summary\">Izdzēš visus kešatmiņā glabātos vietnes datus</string>\n    <string name=\"metadata_cache_wipe_title\">Notīrīt kešatmiņā saglabātos metadatus</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Attēlu kešatmiņa notīrīta</string>\n    <string name=\"show_meta_info_summary\">Izslēdziet, ja nevēlaties redzēt papildus informācijas laukus - video autoru, video saturu vai meklēšanas vaicājuma rezultātu</string>\n    <string name=\"show_meta_info_title\">Rādīt papildus informāciju</string>\n    <string name=\"show_description_summary\">Izslēdziet, ja nevēlaties redzēt video aprakstu un papildus informāciju</string>\n    <string name=\"show_description_title\">Rādīt video aprakstu</string>\n    <string name=\"show_next_and_similar_title\">Rādīt \\'Nākamos\\' un \\'Līdzīgos\\' video</string>\n    <string name=\"show_comments_summary\">Izslēdziet, ja vēlaties paslēpt komentārus</string>\n    <string name=\"show_comments_title\">Rādīt komentārus</string>\n    <string name=\"clear_queue_confirmation_description\">Pašreizējā atskaņošanas rinda tiks aizstāta/pārrakstīta</string>\n    <string name=\"clear_queue_confirmation_summary\">Mainot vienu atskaņotāju uz citu, jūsu atskaņošanas rinda var tikt aizstāta/pārrakstīta</string>\n    <string name=\"clear_queue_confirmation_title\">Prasīt apstiprinājumu, pirms notīrīt atskaņošanas rindu</string>\n    <string name=\"seek_duration_title\">Ātrās uz priekšu/atpakaļ tīšanas solis</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"use_inexact_seek_title\">Izmantot ātro, neprecīzo tīšanu</string>\n    <string name=\"black_theme_title\">Melns</string>\n    <string name=\"dark_theme_title\">Tumšs</string>\n    <string name=\"light_theme_title\">Gaišs</string>\n    <string name=\"theme_title\">Motīvs</string>\n    <string name=\"default_video_format_title\">Noklusējuma video formāts</string>\n    <string name=\"default_audio_format_title\">Noklusējuma audio formāts</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"notification_colorize_summary\">Ļauj 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)</string>\n    <string name=\"share\">Kopīgot</string>\n    <string name=\"open_with\">Atvērt ar</string>\n    <string name=\"open_in_browser\">Atvērt pārlūkā</string>\n    <string name=\"cancel\">Atcelt</string>\n    <string name=\"install\">Uzstādīt</string>\n    <string name=\"no_player_found_toast\">Netika atrasts video atskaņotājs (jūs variet uzstādīt VLC, lai to atskaņotu).</string>\n    <string name=\"no_player_found\">Netika atrasts video atskaņotājs. Vai uzstādīt VLC?</string>\n    <string name=\"upload_date_text\">Publicēts %1$s</string>\n    <string name=\"main_bg_subtitle\">Nospiediet uz meklēšanas ikonas, lai atrastu vēlamo saturu.</string>\n    <string name=\"notification_colorize_title\">Pielāgot paziņojumu krāsu</string>\n    <string name=\"notification_action_nothing\">Neko</string>\n    <string name=\"notification_action_buffering\">Ielādējas</string>\n    <string name=\"notification_action_shuffle\">Sajaukt</string>\n    <string name=\"notification_action_repeat\">Atkārtot</string>\n    <string name=\"notification_actions_at_most_three\">Jūs variet atlasīt ne vairāk kā 3 darbības, ko rādīt kompaktajā paziņojumā!</string>\n    <string name=\"notification_actions_summary\">Rediģējiet katru zemāk redzamo paziņojuma darbību, pieskaroties tai. Atķeksējiet izvēles rūtiņas labajā pusē, lai atlasītu līdz pat trīm darbībām, kuras rādīt kompaktajā paziņojumā.</string>\n    <string name=\"notification_action_4_title\">Piektā darbības poga</string>\n    <string name=\"notification_action_3_title\">Ceturtā darbības poga</string>\n    <string name=\"notification_action_2_title\">Trešā darbības poga</string>\n    <string name=\"notification_action_1_title\">Otrā darbības poga</string>\n    <string name=\"notification_action_0_title\">Pirmā darbības poga</string>\n    <string name=\"notification_scale_to_square_image_summary\">Apgriež paziņojumā redzamo video sīkattēlu no 16:9 uz 1:1 malu attiecību (iespējams, attēls būs izstiepts)</string>\n    <string name=\"notification_scale_to_square_image_title\">Apgriezt video sīkattēlu uz 1:1 malu attiecību</string>\n    <string name=\"show_play_with_kodi_summary\">Rādīt opciju atskaņot video Kodi mediju centrā</string>\n    <string name=\"show_play_with_kodi_title\">Rādīt \\\"Atskaņot Kodi\\\" opciju</string>\n    <string name=\"kore_not_found\">Uzstādīt trūkstošo Kore, tālvadības pults, lietotni?</string>\n    <string name=\"play_with_kodi_title\">Atskaņot Kodi</string>\n    <string name=\"show_higher_resolutions_summary\">Ne visas ierīcas var atskaņot 2K/4K izšķirtspējas video</string>\n    <string name=\"show_higher_resolutions_title\">Rādīt augstākas izšķirtspējas</string>\n    <string name=\"default_resolution_title\">Noklusējuma izšķirtspēja</string>\n    <string name=\"download_path_audio_dialog_title\">Atlasīt lejupielādes mapi, kur glabāt audio datnes</string>\n    <string name=\"download_path_audio_summary\">Lejupielādētās audio datnes tiek glabātas šeit</string>\n    <string name=\"download_path_audio_title\">Audio lejupielādes mape</string>\n    <string name=\"download_path_dialog_title\">Atlasīt lejupielādes mapi, kur glabāt video datnes</string>\n    <string name=\"download_path_summary\">Lejupielādētās video datnes tiek glabātas šeit</string>\n    <string name=\"download_path_title\">Video lejupielādes mape</string>\n    <string name=\"controls_add_to_playlist_title\">Pievienot</string>\n    <string name=\"controls_background_title\">Klausīt fonā</string>\n    <string name=\"tab_choose\">Atlasiet cilni</string>\n    <string name=\"tab_bookmarks\">Saglabātie saraksti</string>\n    <string name=\"tab_subscriptions\">Abonementi</string>\n    <string name=\"show_info\">Rādīt informāciju</string>\n    <string name=\"subscription_update_failed\">Abonementu nevarēja atjaunināt</string>\n    <string name=\"subscription_change_failed\">Abonementu nevarēja mainīt</string>\n    <string name=\"channel_unsubscribed\">Atcelts kanāla abonements</string>\n    <string name=\"unsubscribe\">Atcelt abonementu</string>\n    <string name=\"subscribed_button_title\">Abonēts</string>\n    <string name=\"subscribe_button_title\">Abonēt</string>\n    <string name=\"use_external_audio_player_title\">Izmantot ārējo audio atskaņotāju</string>\n    <string name=\"use_external_video_player_summary\">Dažās izšķirtspējās nav pieejami skaņas celiņi</string>\n    <string name=\"use_external_video_player_title\">Izmantot ārējo video atskaņotāju</string>\n    <string name=\"share_dialog_title\">Kopīgot ar</string>\n    <string name=\"search_showing_result_for\">Tiek rādīti %s rezultāti</string>\n    <string name=\"did_you_mean\">Varbūt jūs gribējāt meklēt \\\"%1$s\\\"?</string>\n    <string name=\"settings\">Iestatījumi</string>\n    <string name=\"search\">Meklēt</string>\n    <string name=\"controls_download_desc\">Lejupielādēt video datni</string>\n    <string name=\"download\">Lejupielādēt</string>\n    <string name=\"featured\">Populāri</string>\n    <string name=\"download_has_started\">Lejupielāde ir sākusies</string>\n    <string name=\"select_night_theme_toast\">Jūs varat izvēlēties savu iecienītāko nakts motīvu zemāk</string>\n    <string name=\"night_theme_summary\">Izvēlieties savu iecienītāko nakts motīvu - %s</string>\n    <string name=\"auto_device_theme_title\">Automātiski (ierīces motīvs)</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"paid_content\">Šis saturs ir pieejams tikai lietotājiem, kuri ir samaksājuši, tāpēc to nevar straumēt vai lejupielādēt ar Newpipe.</string>\n    <string name=\"youtube_music_premium_content\">Šis videoklips ir pieejams tikai YouTube Mūzikas Prēmijas dalībniekiem, tāpēc to nevar straumēt vai lejupielādēt ar Newpipe.</string>\n    <string name=\"private_content\">Šis saturs ir privāts, tāpēc Newpipe to nevar straumēt vai lejupielādēt.</string>\n    <string name=\"soundcloud_go_plus_content\">Šis ir SoundCloud Go+ audio, vismaz jūsu valstī, tāpēc to nevar straumēt vai lejupielādēt ar Newpipe.</string>\n    <string name=\"georestricted_content\">Šis saturs nav pieejams jūsu valstī.</string>\n    <string name=\"crash_the_app\">Avarēt aplikāciju</string>\n    <string name=\"show_channel_details\">Rādīt kanāla informāciju</string>\n    <string name=\"recaptcha_solve\">Atrisināt</string>\n    <string name=\"restricted_video_no_stream\">Šis video ir ierobežots ar vecumu.\n\\nŅemot vērā jauno YouTube politiku ar vecuma ierobežotiem videoklipiem, Newpipe nevar piekļūt šim videoklipam.</string>\n    <string name=\"night_theme_title\">Nakts režīma motīvs</string>\n    <string name=\"off\">Izslēgts</string>\n    <string name=\"on\">Ieslēgts</string>\n    <string name=\"metadata_privacy_private\">Privāts</string>\n    <string name=\"metadata_privacy_public\">Publisks</string>\n    <string name=\"metadata_support\">Atbalsts</string>\n    <string name=\"metadata_language\">Valoda</string>\n    <string name=\"metadata_age_limit\">Vecuma ierobežojums</string>\n    <string name=\"metadata_licence\">License</string>\n    <string name=\"metadata_tags\">Tagi</string>\n    <string name=\"metadata_category\">Kategorija</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Jums tiks jautāts, kur saglabāt katru lejupielādi</string>\n    <string name=\"dont_show\">Nerādīt</string>\n    <string name=\"account_terminated\">Konts ir pārtraukts</string>\n    <string name=\"comments_are_disabled\">Komentāri ir atspējoti</string>\n    <string name=\"enqueue_next_stream\">Ielikt rindā nākošo</string>\n    <string name=\"enqueued_next\">Ielikts rindā nākošais</string>\n    <string name=\"start_main_player_fullscreen_title\">Sākt video atskaņotāju pilnekrāna režīmā</string>\n    <string name=\"start_main_player_fullscreen_summary\">Nesākt video atskaņošanu samazinātā režīmā, bet pilnekrāna režīmā, ja automātiskā rotācija ir izslēgta</string>\n    <string name=\"disable_media_tunneling_title\">Izslēgt multivides tuneļošanu</string>\n    <string name=\"disable_media_tunneling_summary\">Izslēdziet multivides tuneļošanu, ja jums video atskaņošanas laikā parādās melns ekrāns vai aizķeršanās.</string>\n    <string name=\"description_select_enable\">Ieslēgt teksta atlasīšanu video aprakstā</string>\n    <string name=\"no_dir_yet\">Lejupielādes mape vēl nav iestatīta, atlasiet noklusējuma lejupielādes mapi tagad</string>\n    <string name=\"main_page_content_swipe_remove\">Pavelciet atlasīto elementu pa kreisi vai labi, lai to aizvāktu</string>\n    <string name=\"local_search_suggestions\">Lokālos meklēšanas ieteikumus</string>\n    <string name=\"high_quality_larger\">Augstas kvalitātes (lielāks)</string>\n    <string name=\"check_for_updates\">Pārbaudīt atjauninājumus</string>\n    <string name=\"manual_update_description\">Pašrocīgi pārbaudīt jaunas versijas pieejamību</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Video atskaņošanas joslas sīktēla priekšskatījums</string>\n    <string name=\"checking_updates_toast\">Pārbauda, vai ir atjauninājumi…</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Sākot ar Android 10, tikai“Krātuves Piekļuves Sistēma” ir atbalstīta</string>\n    <string name=\"feed_load_error_account_info\">Nevarēja ielādēt straumi priekš \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Kļūda lādējot plūsmu</string>\n    <string name=\"feed_load_error_terminated\">Autora konts tika slēgts.\\nNewPipe turpmāk vairs nevarēs ielādēt šī kanāla plūsmas saturu.\\nVai tiešām atteikties no šī kanāla abonēšanas?</string>\n    <string name=\"feed_load_error_fast_unknown\">Ātrās straumes režīms nesniedz vairāk informācijas par šo.</string>\n    <string name=\"description_select_disable\">Izslēgt teksta atlasīšanu video aprakstā</string>\n    <string name=\"metadata_privacy_internal\">Iekšeji</string>\n    <string name=\"detail_heart_img_view_description\">Autors piekrīt</string>\n    <string name=\"open_website_license\">Atvērt mājaslapu</string>\n    <string name=\"tablet_mode_title\">Planšetes režīms</string>\n    <string name=\"low_quality_smaller\">Zemas kvalitātes (mazāks)</string>\n    <string name=\"metadata_privacy\">Privātums</string>\n    <string name=\"metadata_privacy_unlisted\">Sarakstā neiekļauts</string>\n    <string name=\"metadata_host\">Uzņēmums</string>\n    <string name=\"remote_search_suggestions\">Servera meklēšanas ieteikumus</string>\n    <string name=\"mark_as_watched\">Atzīmēt kā noskatītu</string>\n    <string name=\"processing_may_take_a_moment\">Apstrādā... Var aizņemt kādu laiku</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"zero\">Izdzēsa %1$s lejupielāžu</item>\n        <item quantity=\"one\">Izdzēsa %1$s lejupielādi</item>\n        <item quantity=\"other\">Izdzēsa %1$s lejupielādes</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"zero\">%s lejupielādes pabeigtas</item>\n        <item quantity=\"one\">%s lejupielāde pabeigta</item>\n        <item quantity=\"other\">%s lejupielādes pabeigtas</item>\n    </plurals>\n    <string name=\"description_select_note\">Tagad varat atlasīt tekstu video aprakstā.</string>\n    <string name=\"notifications\">Paziņojumi</string>\n    <string name=\"crash_the_player\">Avarēt atskaņotāju</string>\n    <string name=\"settings_category_player_notification_summary\">Pielāgojiet pašlaik atskaņotās plūsmas paziņojumu</string>\n    <string name=\"settings_category_player_notification_title\">Atskaņotāja paziņojums</string>\n    <string name=\"streams_notification_channel_name\">Jaunās tiešraides</string>\n    <string name=\"error_report_notification_toast\">Radās kļūda, detalizētāku informāciju skatiet paziņojumā</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"zero\">%s jaunas tiešraides</item>\n        <item quantity=\"one\">%s jauna tiešraide</item>\n        <item quantity=\"other\">%s jaunas tiešraides</item>\n    </plurals>\n    <string name=\"streams_notification_channel_description\">Paziņojumi par jaunām tiešraidēm abonementos</string>\n    <string name=\"faq_title\">Bieži uzdotie jautājumi</string>\n    <string name=\"error_report_channel_description\">Paziņojumi, lai ziņotu par kļūdām</string>\n    <string name=\"error_report_channel_name\">Kļūdas ziņojuma paziņojums</string>\n    <string name=\"progressive_load_interval_title\">Atskaņošanas ielādes intervāla lielums</string>\n    <string name=\"error_report_notification_title\">NewPipe radās kļūdu, pieskarieties, lai ziņotu</string>\n    <string name=\"left_gesture_control_title\">Kreisās puses žesta darbība</string>\n    <string name=\"msg_failed_to_copy\">Neizdevās kopēt starpliktuvē</string>\n    <string name=\"unset_playlist_thumbnail\">Noņemt pastāvīgo sīktēlu</string>\n    <string name=\"check_new_streams\">Pārbaudīt, vai nav jaunas tiešraides</string>\n    <string name=\"show_crash_the_player_summary\">Rāda avarēšanas iespēju, kad lietojat atskaņotāju</string>\n    <string name=\"remove_duplicates\">Dzēst dublikātus</string>\n    <string name=\"feed_hide_streams_title\">Rādīt sekojošās tiešraides</string>\n    <string name=\"duplicate_in_playlist\">Saraksti, kas atzīmēti pelēkā, jau satur šo objektu.</string>\n    <string name=\"leak_canary_not_available\">LeakCanary nav pieejams</string>\n    <string name=\"create_error_notification\">Izveidot kļūdas paziņojumu</string>\n    <string name=\"any_network\">Jebkurš tīkls</string>\n    <string name=\"app_update_unavailable_toast\">Jums ir jaunākā NewPipe versija</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Noder, piemēram, kad lietojiet austiņas ar bojātām pogām</string>\n    <string name=\"prefer_descriptive_audio_summary\">Atskaņos skaņas celiņu ar audio aprakstiem vājredzīgajiem, ja tāds ir pieejams</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorēt pieslēgtās ierīces multimēdiju pogas</string>\n    <string name=\"delete_downloaded_files_confirm\">Izdzēst visus lejupielādētos failus\\?</string>\n    <string name=\"feed_new_items\">Jaunumi kanālā</string>\n    <string name=\"prefer_original_audio_title\">Dot priekšroku oriģinālajai skaņai</string>\n    <string name=\"prefer_original_audio_summary\">Atskaņos oriģinālo skaņas celiņu neatkarīgi no iestatītās valodas</string>\n    <string name=\"prefer_descriptive_audio_title\">Dot priekšroku skaņu celiņam ar audio aprakstu</string>\n    <string name=\"left_gesture_control_summary\">Atlasiet žestu atskaņotāja ekrāna kreisajai pusei</string>\n    <string name=\"right_gesture_control_summary\">Atlasiet žestu atskaņotāja ekrāna labajai pusei</string>\n    <string name=\"right_gesture_control_title\">Labās puses žesta darbība</string>\n    <string name=\"brightness\">Regulēt spilgtumu</string>\n    <string name=\"volume\">Regulēt skaļumu</string>\n    <string name=\"none\">Darīt neko</string>\n    <string name=\"import_subscriptions_hint\">Abonementus var ievietot vai izgūt, izmantojot 3-punktoto izvēlni augšējā labajā ekrāna stūrī</string>\n    <string name=\"faq_description\">Ja Jums rodas problēmas ar lietotni, noteikti apskatiet šīs atbildes bieži uzdotiem jautājumiem!</string>\n    <string name=\"faq\">Skatīt tīkla vietnē</string>\n    <string name=\"play_queue_audio_track\">Skaņa: %s</string>\n    <string name=\"audio_track\">Skaņu celiņš</string>\n    <string name=\"loading_stream_details\">Ielādē straumes informāciju…</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Dublikāts pievienots %d reizi(-es)</string>\n    <string name=\"show_crash_the_player_title\">Rādīt \\\"avarēt atskaņotāju\\\"</string>\n    <string name=\"card\">Karte</string>\n    <string name=\"app_update_available_notification_text\">Spiediet, lai lejupielādētu %s</string>\n    <string name=\"remove_duplicates_title\">Dzēst dublikātus\\?</string>\n    <string name=\"remove_duplicates_message\">Vai vēlaties dzēst visus tiešraižu dublikātus šajā sarakstā\\?</string>\n    <string name=\"feed_show_hide_streams\">Rādīt/slēpt tiešraides</string>\n    <string name=\"fast_mode\">Ātrais režīms</string>\n    <string name=\"enable_streams_notifications_summary\">Informē par jaunām abonementu tiešraidēm</string>\n    <string name=\"percent\">Procenti</string>\n    <string name=\"semitone\">Pustonis</string>\n    <string name=\"enable_streams_notifications_title\">Paziņojumi par jaunām tiešraidēm</string>\n    <string name=\"streams_notifications_interval_title\">Pārbaužu biežums</string>\n    <string name=\"main_tabs_position_summary\">Galvenās cilnes atlasītāja pārvietošana uz apakšu</string>\n    <string name=\"notification_actions_summary_android13\">Rediģējiet katru zemāk redzamo paziņojuma darbību, pieskaroties tai. Pirmās trīs darbības (atskaņot/pauze, iepriekšējais un nākamais) ir sistēmas iestatītas, un tās nevar pielāgot.</string>\n    <string name=\"progressive_load_interval_summary\">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</string>\n    <string name=\"yes\">Jā</string>\n    <string name=\"no\">Nē</string>\n    <string name=\"settings_category_backup_restore_title\">Rezerves kopēšana un atjaunošana</string>\n    <string name=\"loading_metadata_title\">Metadatu ielādēšana…</string>\n    <string name=\"main_tabs_position_title\">Galvenās cilnes pozīcija</string>\n    <string name=\"unknown_format\">Nepazīstams formāts</string>\n    <string name=\"feed_show_partially_watched\">Daļēji skatīti</string>\n    <string name=\"no_streams\">Nav tiešraides</string>\n    <string name=\"error_insufficient_storage\">Nav pietiekami daudz brīvās vietas uz ierīces</string>\n    <string name=\"channel_tab_about\">Par</string>\n    <string name=\"metadata_thumbnails\">Sīkattēli</string>\n    <string name=\"sort\">Kārtot</string>\n    <string name=\"auto_update_check_description\">NewPipe pati var automātiski pārbaudīt jaunas versijas pieejamību laiku pa laikam un informēt jūs, kad tā ir pieejama.\\nVai jūs tiešām gribiet ieslēgt šo funkciju?</string>\n    <string name=\"no_appropriate_file_manager_message\">Netika atrasts atbilstošs failu pārvaldnieks šai darbībai.\n\\nLūdzu instalējiet failu pārvaldnieku vai pamēģiniet atspējot \\'%s\\' lejuplādēšanas iestatījumos</string>\n    <string name=\"audio_track_type_original\">oriģinālais</string>\n    <string name=\"streams_notifications_network_title\">Nepieciešams tīkla savienojums</string>\n    <string name=\"reset_settings_summary\">Atiestata visus iestatījumus uz to sākotnējām vērtībām</string>\n    <string name=\"reset_settings_title\">Atiestatīt iestatījumus</string>\n    <string name=\"reset_all_settings\">Visu iestatījumu atiestatošana atmetīs visus jūsu izvēlētos iestatījumus un restartēs aplikāciju.\n\\n\n\\nVai jūs esat droši, ka vēlaties turpināt?</string>\n    <string name=\"night_theme_available\">Šī opcija ir pieejama tikai, ja %s ir izvēlēts kā motīvs</string>\n    <string name=\"detail_pinned_comment_view_description\">Piespraustais komentārs</string>\n    <string name=\"notifications_disabled\">Paziņojumi ir atspējoti</string>\n    <string name=\"you_successfully_subscribed\">Jūs abonējāt šim kanālam</string>\n    <string name=\"metadata_banners\">Banneri</string>\n    <string name=\"metadata_subscribers\">Abonenti</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Pārslēgt visus</string>\n    <string name=\"unknown_quality\">Nepazīstama kvalitāte</string>\n    <string name=\"feed_show_watched\">Noskatīti</string>\n    <string name=\"feed_show_upcoming\">Gaidāmie</string>\n    <string name=\"audio_track_type_dubbed\">dublēts</string>\n    <string name=\"audio_track_type_descriptive\">aprakstošs</string>\n    <string name=\"channel_tab_videos\">Video</string>\n    <string name=\"channel_tab_livestreams\">Tiešraides</string>\n    <string name=\"channel_tab_channels\">Kanāli</string>\n    <string name=\"channel_tab_playlists\">Atskaņošanas saraksti</string>\n    <string name=\"channel_tab_albums\">Albumi</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Netika atrasts atbilstošs failu pārvaldnieks šai darbībai.\n\\nLūdzu lejuplādējiet ar krātuves pieejas struktūras saderīgu failu pārvaldnieku</string>\n    <string name=\"no_live_streams\">Nav tiešraides</string>\n    <string name=\"show_error_snackbar\">Rādīt kļūdas paziņojumu</string>\n    <string name=\"feed_fetch_channel_tabs\">Piegādāt kanālu cilnes</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Cilnes, kuras piegādāt, atjaunojot jauninājumus. Šai opcijai nav nekādas iedarbības, ja kanāls tiek atjaunots ātrajā režīmā.</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Multivides tunelēšana tika atspējota pēc noklusējuma tādēļ, ka ir zināms, ka jūsu ierīces modelis to neatbalsta.</string>\n    <string name=\"select_quality_external_players\">Izvēlēties kvalitāti ārējiem atskaņotājiem</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer iestatījumi</string>\n    <string name=\"show_channel_tabs\">Kanālu cilnes</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"get_notified\">Tiec paziņots</string>\n    <string name=\"metadata_subchannel_avatars\">Apakškanālu avatāri</string>\n    <string name=\"metadata_uploader_avatars\">Augšuplādētāju avatāri</string>\n    <string name=\"duration\">Ilgums</string>\n    <string name=\"rewind\">Attīt - tīt atpakaļ</string>\n    <string name=\"forward\">Tīt uz priekšu</string>\n    <string name=\"image_quality_summary\">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</string>\n    <plurals name=\"replies\">\n        <item quantity=\"zero\">%s atbildes</item>\n        <item quantity=\"one\">%s atbilde</item>\n        <item quantity=\"other\">%s atbildes</item>\n    </plurals>\n    <string name=\"play\">Atskaņot</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"show_more\">Rādīt vairāk</string>\n    <string name=\"show_less\">Rādīt mazāk</string>\n    <string name=\"metadata_avatars\">Avatāri</string>\n    <string name=\"streams_not_yet_supported_removed\">Tiešraides, kuras vēl neatbalsta lejuplādētājs, netiek rādītas</string>\n    <string name=\"selected_stream_external_player_not_supported\">Izvēlēto tiešraidi neatbalsta ārējie atskaņotāji</string>\n    <string name=\"open_play_queue\">Atvērt atskaņošanas rindu</string>\n    <string name=\"toggle_fullscreen\">Pārslēgt pilnekrāna režīmu</string>\n    <string name=\"toggle_screen_orientation\">Pārslēgt ekrāna orientāciju</string>\n    <string name=\"previous_stream\">Iepriekšējā tiešraide</string>\n    <string name=\"next_stream\">Nākamā tiešraide</string>\n    <string name=\"image_quality_none\">Neielādēt attēlus</string>\n    <string name=\"image_quality_high\">Augsta kvalitāte</string>\n    <string name=\"more_options\">Vairāk opciju</string>\n    <string name=\"replay\">Atkārtoti atskaņot</string>\n    <string name=\"image_quality_title\">Attēlu kvalitāte</string>\n    <string name=\"image_quality_low\">Zema kvalitāte</string>\n    <string name=\"image_quality_medium\">Vidēja kvalitāte</string>\n    <string name=\"audio_track_present_in_video\">Audio celiņam jau ir jābūt šajā straumē</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer noklusējuma vērtība</string>\n    <string name=\"no_video_streams_available_for_external_players\">Ārējiem atskaņotājiem nav pieejama neviena video straume</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Izmantot ExoPlayer dekodētāja atkāpšanās funkciju</string>\n    <string name=\"settings_category_exoplayer_summary\">Pārvaldīt dažus ExoPlayer iestatījumus. Lai šīs izmaiņas stātos spēkā, ir jārestartē atskaņotājs</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Ārējiem atskaņotājiem nav pieejama neviena audio straume</string>\n    <string name=\"unknown_audio_track\">Nezināms</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Vienmēr izmantot ExoPlayer video izvades virsmas iestatījumu risinājumu</string>\n    <string name=\"select_audio_track_external_players\">Atlasiet audio celiņu ārējiem atskaņotājiem</string>\n    <string name=\"show_channel_tabs_summary\">Kādas cilnes tiek rādītas kanāla lapās</string>\n    <string name=\"share_playlist_with_list\">Kopīgot video URL sarakstu</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"channel_tab_tracks\">Skaņdarbi</string>\n    <string name=\"channel_tab_shorts\">Īsie video</string>\n    <string name=\"share_playlist\">Kopīgot atskaņošanas sarakstu</string>\n    <string name=\"share_playlist_with_titles\">Kopīgot nosaukumus</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Š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</string>\n    <string name=\"tab_bookmarks_short\">Atskaņošanas saraksti</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Kopīgot kā pagaidu YouTube atskaņošanas sarakstu</string>\n    <string name=\"audio_track_type_secondary\">sekundārais</string>\n    <string name=\"short_thousand\">%s tūkst.</string>\n    <string name=\"short_million\">%s milj.</string>\n    <string name=\"short_billion\">%s mljrd.</string>\n    <string name=\"channel_tab_likes\">Patīk</string>\n    <string name=\"trending_music\">Pašlaik populāra mūzika</string>\n    <string name=\"trending_movies\">Pašlaik populāras filmas un TV raidījumi</string>\n    <string name=\"trending_podcasts\">Pašlaik populāri raidieraksti</string>\n    <string name=\"trending_gaming\">Pašlaik populārs spēļu nozarē</string>\n    <string name=\"migration_info_7_8_message\">YouTube pārtrauca piedāvāt apvienoto pašlaik populārs lapu kopš 2025. gada 21. jūlija. NewPipe aizstāja noklusējuma pašlaik populārs lapu ar pašlaik populāras tiešraides.\\n\\nJūs variet atlasīt arī citas pašlaik populārs lapas zem \\\"Iestatījumi &gt; Saturs &gt; Galvenā lapa\\\".</string>\n    <string name=\"delete_file\">Dzēst datni</string>\n    <string name=\"delete_entry\">Dzēst ierakstu</string>\n    <string name=\"entry_deleted\">Ieraksts dzēsts</string>\n    <string name=\"feed_group_page_summary\">Abonementu grupu</string>\n    <string name=\"select_a_feed_group\">Atlasiet abonementu grupu</string>\n    <string name=\"migration_info_7_8_title\">YouTube likvidēja apvienoto pašlaik populārs</string>\n    <string name=\"permission_display_over_apps_permission_name\">“Ļaut rādīt virs citām lietotnēm”</string>\n    <string name=\"search_with_service_name\">Meklēt %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Meklēt %1$s (%2$s)</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud Top 50 lapa likvidēta</string>\n    <string name=\"no_feed_group_created_yet\">Vēl nav izveidota neviena abonementu grupa</string>\n    <string name=\"account_terminated_service_provides_reason\">Konts slēgts\\n\\n%1$s norāda, ka iemesls kādēļ: %2$s</string>\n    <string name=\"player_http_403\">Atskaņošanas laikā no servera saņemta HTTP 403 kļūda, ko, iespējams, izraisīja straumēšanas URL derīguma beigu termiņš vai IP aizliegums</string>\n    <string name=\"player_http_invalid_status\">Atskaņošanas laikā no servera saņemta HTTP %1$s kļūda</string>\n    <string name=\"youtube_player_http_403\">Atskaņošanas laikā no servera saņemta HTTP 403 kļūda, ko, iespējams, izraisīja IP aizliegums vai straumēšanas URL atšifrēšanas (deobfuskācijas) problēmas</string>\n    <string name=\"kao_dialog_warning\">2025. gada augustā Google paziņoja, ka, sākot ar 2026. gada septembri, lai uzstādītu lietotnes, būs nepieciešama izstrādātāja verifikācija visām Android lietotnēm sertificētajās ierīcēs, tostarp arī tām, kuras uzstādītas ārpus Play veikala. Tā kā NewPipe izstrādātāji nepiekrīt un negrib pieņemt šo prasību, pēc šī datuma NewPipe vairs nedarbosies sertificētajās Android ierīcēs.</string>\n    <string name=\"kao_dialog_more_info\">Detalizētāka informācija</string>\n    <string name=\"kao_solution\">Risinājums</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud likvidēja oriģinālos Top 50 topus. Atbilstošā cilne noņemta no jūsu galvenās lapas.</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-mk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Притиснете на лупата за да започнете.</string>\n    <string name=\"upload_date_text\">Објавено на %1$s</string>\n    <string name=\"no_player_found\">Не е пронајден плеер за стримови. Сакате да инсталирате VLC\\?</string>\n    <string name=\"no_player_found_toast\">Не е пронајден плеер за стримови (можеш да инсталираш VLC)</string>\n    <string name=\"install\">Инсталирај</string>\n    <string name=\"cancel\">Откажи</string>\n    <string name=\"open_in_browser\">Отвори во пребарувач</string>\n    <string name=\"open_in_popup_mode\">Отвори во прозорче</string>\n    <string name=\"share\">Сподели</string>\n    <string name=\"download\">Превземи</string>\n    <string name=\"controls_download_desc\">Превземи датотека за стрим</string>\n    <string name=\"search\">Пребарај</string>\n    <string name=\"settings\">Поставки</string>\n    <string name=\"did_you_mean\">Можеби мислевте на „%1$s“?</string>\n    <string name=\"share_dialog_title\">Сподели со</string>\n    <string name=\"use_external_video_player_title\">Користи надворешен видео плеер</string>\n    <string name=\"use_external_video_player_summary\">Се губи звукот на НЕКОИ резолуции</string>\n    <string name=\"use_external_audio_player_title\">Користи надворешен аудио плеер</string>\n    <string name=\"subscribe_button_title\">Зачлени се</string>\n    <string name=\"subscribed_button_title\">Зачленет</string>\n    <string name=\"channel_unsubscribed\">Откажано е членството на каналот</string>\n    <string name=\"subscription_change_failed\">Не може да се промени претплатата</string>\n    <string name=\"subscription_update_failed\">Не може да се ажурира претплатата</string>\n    <string name=\"show_info\">Покажи информации</string>\n    <string name=\"tab_subscriptions\">Членства</string>\n    <string name=\"tab_bookmarks\">Обележани плејлисти</string>\n    <string name=\"fragment_feed_title\">Новости</string>\n    <string name=\"controls_background_title\">Позадина</string>\n    <string name=\"controls_popup_title\">Подпрозорче</string>\n    <string name=\"controls_add_to_playlist_title\">Додај на</string>\n    <string name=\"download_path_title\">Папка за зачувување на видеата</string>\n    <string name=\"download_path_summary\">Преземените видеа се сместени овде</string>\n    <string name=\"download_path_dialog_title\">Одберете каде да ги зачувате видеата</string>\n    <string name=\"download_path_audio_title\">Фолдер за преземање на аудио</string>\n    <string name=\"download_path_audio_summary\">Преземените аудио фајлови се сместени овде</string>\n    <string name=\"download_path_audio_dialog_title\">Одберете фолдер за зачувување на аудио</string>\n    <string name=\"default_resolution_title\">Стандардна резолуција</string>\n    <string name=\"default_popup_resolution_title\">Стандардна резолуција на малиот прозор</string>\n    <string name=\"show_higher_resolutions_title\">Прикажи повисоки резолуции</string>\n    <string name=\"show_higher_resolutions_summary\">Само одредени уреди поддржуваат 2К/4К видеа</string>\n    <string name=\"play_with_kodi_title\">Пушти на Kodi</string>\n    <string name=\"kore_not_found\">Апликацијата Kore не е најдена. Сакате да ја инсталирате\\?</string>\n    <string name=\"show_play_with_kodi_title\">Прикажи ја „Пушти со Kodi“ опцијата</string>\n    <string name=\"show_play_with_kodi_summary\">Прикажи опција да се пушти видео со Kodi media center</string>\n    <string name=\"play_audio\">Звук</string>\n    <string name=\"default_audio_format_title\">Стандарден аудио формат</string>\n    <string name=\"default_video_format_title\">Стандарден видео формат</string>\n    <string name=\"theme_title\">Тема</string>\n    <string name=\"light_theme_title\">Светла</string>\n    <string name=\"dark_theme_title\">Темна</string>\n    <string name=\"black_theme_title\">Црна</string>\n    <string name=\"popup_remember_size_pos_title\">Запамти го местото и големината на малиот прозорец</string>\n    <string name=\"popup_remember_size_pos_summary\">Запамти ја последната големина и место на прозорчето</string>\n    <string name=\"use_inexact_seek_title\">Брзо, непрецизно премотување</string>\n    <string name=\"use_inexact_seek_summary\">Со непрецизното премотување се премотува побрзо, но со намалена презицност. Премотувањето со по 5, 15 или 25 секунди нема да работи со оваа опција.</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Кешираните слики се избришани</string>\n    <string name=\"metadata_cache_wipe_title\">Избришете ги кешираните мета-податоци</string>\n    <string name=\"metadata_cache_wipe_summary\">Избришете ги сите кеш-податоци од веб-страни</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Мета-податоците се избришани</string>\n    <string name=\"auto_queue_title\">Автоматски додај го во редослед следниот стрим</string>\n    <string name=\"auto_queue_summary\">Продолжи го завршеното (неповторливо) емитување додавајќи поврзан стрим</string>\n    <string name=\"show_search_suggestions_title\">Пребарајте предлози</string>\n    <string name=\"show_search_suggestions_summary\">Предлозите ќе се прикажуваат додека пребарувате</string>\n    <string name=\"enable_search_history_title\">Претходни пребарувања</string>\n    <string name=\"enable_search_history_summary\">Зачувајте ги пребарувањата локално</string>\n    <string name=\"enable_watch_history_title\">Историја на гледање</string>\n    <string name=\"enable_watch_history_summary\">Зачувајте ја листата на гледани видеа</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Продолжете со репродукција</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Продолжете со репродукција на видеото по прекини (пр. телефонски повик)</string>\n    <string name=\"download_dialog_title\">Преземи</string>\n    <string name=\"show_next_and_similar_title\">Прикажи „следни“ и „слични“ видеа</string>\n    <string name=\"show_hold_to_append_title\">Прикажи го советот: „Задржи за додавање во редослед“</string>\n    <string name=\"show_hold_to_append_summary\">Покажи совет при притискање на позадината или кога скок копчето е притиснато на видео \\\"Детали:\\\"</string>\n    <string name=\"unsupported_url\">Неподдржана URL врска</string>\n    <string name=\"default_content_country_title\">Земја на прикажани видеа</string>\n    <string name=\"content_language_title\">Стандарден јазик на содржина</string>\n    <string name=\"settings_category_player_title\">Плеер</string>\n    <string name=\"settings_category_player_behavior_title\">Однесување</string>\n    <string name=\"settings_category_video_audio_title\">Видео и аудио</string>\n    <string name=\"settings_category_history_title\">Историја и кеш</string>\n    <string name=\"settings_category_appearance_title\">Изглед</string>\n    <string name=\"settings_category_debug_title\">Дебагирање</string>\n    <string name=\"background_player_playing_toast\">Пуштено во позадина</string>\n    <string name=\"popup_playing_toast\">Пуштено во прозорче</string>\n    <string name=\"content\">Содржина</string>\n    <string name=\"show_age_restricted_content_title\">Покажи видеа со граница на возрастта</string>\n    <string name=\"duration_live\">во живо</string>\n    <string name=\"downloads\">Превземања</string>\n    <string name=\"downloads_title\">Превземања</string>\n    <string name=\"error_report_title\">Извештај за грешки</string>\n    <string name=\"all\">Сите</string>\n    <string name=\"disabled\">Оневозможено</string>\n    <string name=\"clear\">Избриши</string>\n    <string name=\"best_resolution\">Најдобра резолуција</string>\n    <string name=\"undo\">Врати</string>\n    <string name=\"play_all\">Пушти ги сите</string>\n    <string name=\"always\">Секогаш</string>\n    <string name=\"just_once\">Само еднаш</string>\n    <string name=\"file\">Датотека</string>\n    <string name=\"notification_channel_name\">Известување од NewPipe</string>\n    <string name=\"notification_channel_description\">NewPipe Известувања за подпрозорчето и заднинското пуштање</string>\n    <string name=\"unknown_content\">[Непознато]</string>\n    <string name=\"switch_to_background\">Пушти во позадина</string>\n    <string name=\"switch_to_popup\">Пушти во подпрозорче</string>\n    <string name=\"switch_to_main\">Пушти во главната апликација</string>\n    <string name=\"import_data_title\">Внеси датабаза</string>\n    <string name=\"export_data_title\">Изнеси база на податоци</string>\n    <string name=\"import_data_summary\">Ќе ги избрише моменталните членства и историја</string>\n    <string name=\"export_data_summary\">Изнеси историја, членства и плејлисти</string>\n    <string name=\"general_error\">Грешка</string>\n    <string name=\"network_error\">Мрежна грешка</string>\n    <string name=\"could_not_load_thumbnails\">Не можеа да се прочитаат сите сликички</string>\n    <string name=\"parsing_error\">Не може да се прочита страната</string>\n    <string name=\"content_not_available\">Содржината не е достапна</string>\n    <string name=\"could_not_setup_download_menu\">Неуспешно поставување на менито за превземања</string>\n    <string name=\"app_ui_crash\">Се сруши Апп./Интерфејс</string>\n    <string name=\"player_stream_failure\">Неуспех при пуштање на видеото</string>\n    <string name=\"player_unrecoverable_failure\">Се случи критичен проблем</string>\n    <string name=\"player_recoverable_failure\">Опоравување од проблемот</string>\n    <string name=\"external_player_unsupported_link_type\">Надворешните плеери не поддржуваат вакви врски</string>\n    <string name=\"video_streams_empty\">Нема видео стримови</string>\n    <string name=\"audio_streams_empty\">Нема аудио стримови</string>\n    <string name=\"invalid_directory\">Таква папка не постои</string>\n    <string name=\"invalid_source\">Таков фајл / содржина не постои</string>\n    <string name=\"invalid_file\">Фајлот не постои или недостасува дозвола за негово читање или допишување</string>\n    <string name=\"file_name_empty_error\">Името на фајлот не може да биде празно</string>\n    <string name=\"error_occurred_detail\">Настана проблем: %1$s</string>\n    <string name=\"sorry_string\">Извинете, не требаше да се случи тоа.</string>\n    <string name=\"error_report_button_text\">Пријави ја грешката по мејл</string>\n    <string name=\"error_snackbar_message\">Извинете, нешто тргна наопаку.</string>\n    <string name=\"error_snackbar_action\">Извештај</string>\n    <string name=\"what_device_headline\">Инфо:</string>\n    <string name=\"what_happened_headline\">Што се случи:</string>\n    <string name=\"info_labels\">What:\\nRequest:\\nContent Language:\\nContent Country:\\nApp Language:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version:</string>\n    <string name=\"your_comment\">Ваш коментар (на Англиски):</string>\n    <string name=\"error_details_headline\">Детали:</string>\n    <string name=\"detail_thumbnail_view_description\">Емитување на видео, времетраење</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Икона од аватарот на објавителот</string>\n    <string name=\"detail_likes_img_view_description\">Допаѓања</string>\n    <string name=\"detail_dislikes_img_view_description\">Недопаѓања</string>\n    <string name=\"search_no_results\">Нема резултати</string>\n    <string name=\"empty_list_subtitle\">Тука Е Празно :(</string>\n    <string name=\"detail_drag_description\">Влечи за да разместиш</string>\n    <string name=\"video\">Видео</string>\n    <string name=\"audio\">Звук</string>\n    <string name=\"retry\">Пробај повторно</string>\n    <string name=\"no_subscribers\">Нема зачленети</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s зачленет</item>\n        <item quantity=\"other\">%s зачленети</item>\n    </plurals>\n    <string name=\"no_views\">Нула прегледи</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s преглед</item>\n        <item quantity=\"other\">%s прегледи</item>\n    </plurals>\n    <string name=\"no_videos\">Нема видеа</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s видео</item>\n        <item quantity=\"other\">%s видеа</item>\n    </plurals>\n    <string name=\"start\">Започни</string>\n    <string name=\"pause\">Пауза</string>\n    <string name=\"create\">Создади</string>\n    <string name=\"delete\">Избриши</string>\n    <string name=\"checksum\">Чексума</string>\n    <string name=\"dismiss\">Отфрли</string>\n    <string name=\"rename\">Прекрсти</string>\n    <string name=\"ok\">Готово</string>\n    <string name=\"msg_name\">Име на датотека</string>\n    <string name=\"msg_threads\">Нишки</string>\n    <string name=\"msg_error\">Грешка</string>\n    <string name=\"msg_running\">NewPipe Превземање</string>\n    <string name=\"msg_running_detail\">Притисни за детали</string>\n    <string name=\"msg_wait\">Почекајте…</string>\n    <string name=\"msg_copied\">Копирано во привремена меморија</string>\n    <string name=\"no_available_dir\">Ве молиме, определете папка за преземања подоцна во поставките</string>\n    <string name=\"msg_popup_permission\">Оваа привилегија е потребна за\n\\nотворање во подпрозорче</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA Предизвик</string>\n    <string name=\"recaptcha_request_toast\">Потребен е reCAPTCHA предизвик</string>\n    <string name=\"settings_category_downloads_title\">Превземања</string>\n    <string name=\"settings_file_charset_title\">Дозволени знаци во имињата на датотеките</string>\n    <string name=\"settings_file_replacement_character_summary\">Невалидните знаци се менуваат со оваа вредност</string>\n    <string name=\"settings_file_replacement_character_title\">Знак за замена</string>\n    <string name=\"charset_letters_and_digits\">Букви и броеви</string>\n    <string name=\"charset_most_special_characters\">Повеќето посебни знаци</string>\n    <string name=\"title_activity_about\">За NewPipe</string>\n    <string name=\"title_licenses\">Лиценци од трети страни</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s од %2$s под %3$s</string>\n    <string name=\"tab_about\">За апликацијата и често поставувани прашања</string>\n    <string name=\"tab_licenses\">Лиценци</string>\n    <string name=\"app_description\">Слободна, лесна YouTube апликација за Андроид.</string>\n    <string name=\"contribution_title\">Допринеси</string>\n    <string name=\"contribution_encouragement\">Ако имаш идеи за; превод, дизајн, чистење или големи промени во кодот - помошта е секогаш добредојдена. Што повеќе се работи, подобра е апликацијата!</string>\n    <string name=\"view_on_github\">Види на GitHub</string>\n    <string name=\"donation_title\">Донирај</string>\n    <string name=\"donation_encouragement\">NewPipe е разработуван од доброволци, кои го вложуваат нивното слободно време за да ви го овозможат најдоброто корисничко искуство. Возвратете им на програмерите со една чаша кафе, за да можат да го направат NewPipe уште подобар.</string>\n    <string name=\"give_back\">Возврати</string>\n    <string name=\"website_title\">Вебсајт</string>\n    <string name=\"website_encouragement\">За повеќе информации и новости за NewPipe посети ја вебстраната.</string>\n    <string name=\"app_license_title\">Лиценцата на NewPipe</string>\n    <string name=\"read_full_license\">Прочитај лиценца</string>\n    <string name=\"title_activity_history\">Историја</string>\n    <string name=\"action_history\">Историја</string>\n    <string name=\"delete_item_search_history\">Сакаш да го избришеш предметот од историјата?</string>\n    <string name=\"title_last_played\">Последно пуштено</string>\n    <string name=\"title_most_played\">Најгледани</string>\n    <string name=\"main_page_content\">Содржина</string>\n    <string name=\"blank_page_summary\">Празна страна</string>\n    <string name=\"kiosk_page_summary\">Киоск</string>\n    <string name=\"channel_page_summary\">Канали</string>\n    <string name=\"select_a_channel\">Одбери канал</string>\n    <string name=\"no_channel_subscribed_yet\">Во моментов немате претплати</string>\n    <string name=\"select_a_kiosk\">Одбери киоск</string>\n    <string name=\"export_complete_toast\">Извезувањето беше успешно</string>\n    <string name=\"import_complete_toast\">Увезувањето беше успешно</string>\n    <string name=\"no_valid_zip_file\">Нема валиден ZIP фајл</string>\n    <string name=\"could_not_import_all_files\">Предупредување: Не се внесени сите датотеки.</string>\n    <string name=\"override_current_data\">Ова ќе ги избрише моменталните поставки.</string>\n    <string name=\"trending\">Популарни</string>\n    <string name=\"top_50\">Топ 50</string>\n    <string name=\"new_and_hot\">Ново и популарно</string>\n    <string name=\"play_queue_remove\">Одстрани</string>\n    <string name=\"play_queue_stream_detail\">Детали</string>\n    <string name=\"play_queue_audio_settings\">Звучни поставки</string>\n    <string name=\"hold_to_append\">Задржете за да поставите во редослед</string>\n    <string name=\"start_here_on_background\">Емитувај го видеото во позадина</string>\n    <string name=\"start_here_on_popup\">Пушти тука во прозорче</string>\n    <string name=\"drawer_open\">Отвори картон</string>\n    <string name=\"drawer_close\">Затвори картон</string>\n    <string name=\"video_player\">Видео плеер</string>\n    <string name=\"background_player\">Позадински плеер</string>\n    <string name=\"popup_player\">Пушти во прозорче</string>\n    <string name=\"always_ask_open_action\">Секогаш прашај</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Чекање информации…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Одбраната содржина се чита</string>\n    <string name=\"create_playlist\">Создај нова плејлиста</string>\n    <string name=\"rename_playlist\">Прекрсти плејлиста</string>\n    <string name=\"name\">Име</string>\n    <string name=\"add_to_playlist\">Додај во плејлиста</string>\n    <string name=\"set_as_playlist_thumbnail\">Постави како икона на плејлистата</string>\n    <string name=\"bookmark_playlist\">Обележи ја плејлистата</string>\n    <string name=\"unbookmark_playlist\">Избриши ја белешката</string>\n    <string name=\"delete_playlist_prompt\">Сакаш да ја избришеш плејлистата?</string>\n    <string name=\"playlist_creation_success\">Листата е создадена</string>\n    <string name=\"playlist_add_stream_success\">Додадено во плејлиста</string>\n    <string name=\"playlist_thumbnail_change_success\">Се смени иконата на плејлистата</string>\n    <string name=\"caption_none\">Без превод</string>\n    <string name=\"resize_fit\">Вклопи</string>\n    <string name=\"resize_fill\">Исполни</string>\n    <string name=\"resize_zoom\">Зумирај</string>\n    <string name=\"caption_auto_generated\">Автоматски создадено</string>\n    <string name=\"enable_leak_canary_summary\">Следењето на мемориските грешки може да ја прикочува апликацијата</string>\n    <string name=\"enable_disposed_exceptions_title\">Пријави Out-of-lifecycle грешки</string>\n    <string name=\"enable_disposed_exceptions_summary\">Секогаш пријавувај неуспешни Rx исклучоци кои настануваат надвор од fragment или activity циклусот по отстранување</string>\n    <string name=\"import_title\">Внеси</string>\n    <string name=\"import_from\">Внеси од</string>\n    <string name=\"export_to\">Изнеси до</string>\n    <string name=\"import_ongoing\">Внесување…</string>\n    <string name=\"export_ongoing\">Изнесување…</string>\n    <string name=\"import_file_title\">Внеси датотека</string>\n    <string name=\"previous_export\">Претходно изнесување</string>\n    <string name=\"subscriptions_import_unsuccessful\">Неуспешно внесување членства</string>\n    <string name=\"subscriptions_export_unsuccessful\">Неуспешно изнесување членства</string>\n    <string name=\"import_youtube_instructions\">Внеси YouTube членства, преку симнување на извозен фајл: \n\\n \n\\n1. Оди на оваа врска: %1$s \n\\n2. Пријави се на твојот профил \n\\n3. Ќе започне превземање (тој фајл ти треба)</string>\n    <string name=\"import_soundcloud_instructions\">Внеси SoundCloud членства, преку внесување URL или ID на профилот: \n\\n \n\\n1. Вклучете „десктоп режим“ во вашиот пребарувач (страната не е достапна за мобилни уреди) \n\\n2. Одете на оваа врска: %1$s \n\\n3. Пријавете се на вашиот профил \n\\n4. Копирајте го URL-то на кое бевте пренасочени (тоа е URL-то на вашиот профил).</string>\n    <string name=\"import_soundcloud_instructions_hint\">korisnickoime, soundcloud.com/korisnickoime</string>\n    <string name=\"import_network_expensive_warning\">Треба да знаеш дека оваа операција троши многу интернет.\n\\n\n\\nСакаш да продолжиш?</string>\n    <string name=\"playback_speed_control\">Контрола на брзината на траката</string>\n    <string name=\"playback_tempo\">Темпо</string>\n    <string name=\"playback_pitch\">Тон</string>\n    <string name=\"unhook_checkbox\">Откачи (може да создаде мутации)</string>\n    <string name=\"clear_views_history_title\">Избриши историја на гледаност</string>\n    <string name=\"clear_views_history_summary\">Ја брише историјата на пуштени видеа</string>\n    <string name=\"delete_view_history_alert\">Избриши ја целата историја на гледаност.</string>\n    <string name=\"watch_history_deleted\">Избришана е историјата на гледаност.</string>\n    <string name=\"clear_search_history_title\">Избриши историја на пребарувања</string>\n    <string name=\"clear_search_history_summary\">Ја брише историјата на пребарувања</string>\n    <string name=\"delete_search_history_alert\">Да се избрише сета историја на пребарувања?</string>\n    <string name=\"search_history_deleted\">Историјата на пребарувања е избришана.</string>\n    <string name=\"no_streams_available_download\">Нема стримови за симнување</string>\n    <string name=\"one_item_deleted\">1 ставка избришана.</string>\n    <string name=\"app_license\">NewPipe е „copyleft“ слободен софтвер: Можеш да го користиш, истражуваш и подобруваш по твоја желба. Можеш да го редистрибуираш и/или да го промениш под условите на GNU GPL лиценцата, објавена од фондацијата FSF - или верзија 3 од лиценцата, или (по можност) понова верзија.</string>\n    <string name=\"import_settings\">Дали сакаш да се внесат и подесувањата?</string>\n    <string name=\"preferred_open_action_settings_title\">Претпочитана акција за „отворање“</string>\n    <string name=\"preferred_open_action_settings_summary\">Стандардна акција при отворање видеа — %s</string>\n    <string name=\"caption_setting_title\">Преводи</string>\n    <string name=\"caption_setting_description\">Смени ја големината и стилот на преводот. Потребен е рестарт за промена</string>\n    <string name=\"privacy_policy_title\">NewPipe - политика за приватност</string>\n    <string name=\"privacy_policy_encouragement\">Проектот NewPipe сериозно ја сфаќа вашата приватност. Затоа апликацијата не собира ваши податоци без ваша дозвола.\n\\nПолитиката за приватност на NewPipe детално објаснува кои податоци се зачувани и пратени кога праќате извештај за грешка во апликацијата.</string>\n    <string name=\"read_privacy_policy\">Прочитај ја политиката за приватност</string>\n    <string name=\"start_accept_privacy_policy\">За да постапуваме соодветно со регулацијата за заштита на податоци (GDPR) на ЕУ, вараме да обрнете внимание на политиката за приватност на NewPipe.\n\\nВе молиме прочитајте ја внимателно. Мора да ја прифатите за да ни го испратите извештајот за грешка во апликацијата.</string>\n    <string name=\"accept\">Прифати</string>\n    <string name=\"decline\">Отфрли</string>\n    <string name=\"limit_data_usage_none_description\">Неограничено</string>\n    <string name=\"limit_mobile_data_usage_title\">Ограничи резолуција при користење мобилен интернет</string>\n    <string name=\"channels\">Канали</string>\n    <string name=\"playlists\">Плејлисти</string>\n    <string name=\"tracks\">Нумери</string>\n    <string name=\"users\">Корисници</string>\n    <string name=\"skip_silence_checkbox\">Прескокни ја тишината</string>\n    <string name=\"playback_step\">Скокни</string>\n    <string name=\"playback_reset\">Почни одново</string>\n    <string name=\"minimize_on_exit_title\">Скриј при промена на апликацијата</string>\n    <string name=\"minimize_on_exit_summary\">Пушти во заднина при промена на апликацијата од видео плеерот — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Никое</string>\n    <string name=\"minimize_on_exit_background_description\">Смали го во позадина</string>\n    <string name=\"minimize_on_exit_popup_description\">Смали го во прозорче</string>\n    <string name=\"unsubscribe\">Откажете претплата</string>\n    <string name=\"tab_choose\">Одбери јазиче</string>\n    <string name=\"settings_category_updates_title\">Ажурирања</string>\n    <string name=\"file_deleted\">Дадотеката е избришана</string>\n    <string name=\"app_update_notification_channel_name\">Известување за ажурирање на апликација</string>\n    <string name=\"app_update_notification_channel_description\">Известување за нова NewPipe верзија</string>\n    <string name=\"download_to_sdcard_error_title\">Надворешната меморија е недостапна</string>\n    <string name=\"download_to_sdcard_error_message\">Преземањето на SD картичка не е возможно. Да се ресетира локацијата на папката за преземања ?</string>\n    <string name=\"subscribers_count_not_available\">Бројот на претплатници не е достапен</string>\n    <string name=\"main_page_content_summary\">Кои јазичиња се прикажани на главната страница</string>\n    <string name=\"updates_setting_title\">Ажурирања</string>\n    <string name=\"updates_setting_description\">Покажи известување за навремено ажурирање на апликацијата кога е достапна нова верзија</string>\n    <string name=\"list_view_mode\">Режим на прегледување список</string>\n    <string name=\"list\">Список</string>\n    <string name=\"grid\">Решетка</string>\n    <string name=\"auto\">Автоматски</string>\n    <string name=\"app_update_available_notification_title\">NewPipe ажурирање е достапно!</string>\n    <string name=\"missions_header_finished\">Завршено</string>\n    <string name=\"missions_header_pending\">Во очекување</string>\n    <string name=\"paused\">Паузирано</string>\n    <string name=\"queued\">Во ред за чекање</string>\n    <string name=\"enqueue\">Редица</string>\n    <string name=\"permission_denied\">Дејствието беше одбиено од системот</string>\n    <string name=\"download_failed\">преземањето не успеа</string>\n    <string name=\"generate_unique_name\">Создај уникатно име</string>\n    <string name=\"overwrite\">Презапиши</string>\n    <string name=\"download_already_running\">Во тек е преземање со ова име</string>\n    <string name=\"show_error\">Покажи грешка</string>\n    <string name=\"error_path_creation\">Избраната папка не може да се создаде</string>\n    <string name=\"error_file_creation\">Фајлот не може да се создаде</string>\n    <string name=\"error_ssl_exception\">Неуспешно воспоставување на сигурна врска</string>\n    <string name=\"error_unknown_host\">Серверот не може да се пронајде</string>\n    <string name=\"error_connect_host\">Неуспешно поврзување со серверот</string>\n    <string name=\"error_http_no_content\">Серверот не испраќа податоци</string>\n    <string name=\"error_http_unsupported_range\">Серверот не прифаќа преземања со повеќе нишки, обидете се со @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Не е најдено</string>\n    <string name=\"stop\">Престани</string>\n    <string name=\"max_retry_msg\">Максимални обиди</string>\n    <string name=\"max_retry_desc\">Максимален број обиди пред откажување на преземањето</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Корисно при префрлување на мобилни податоци, иако некои преземања не можат да бидат прекинати</string>\n    <string name=\"events\">Настани</string>\n    <string name=\"conferences\">Конференции</string>\n    <string name=\"show_comments_title\">Прикажи коментари</string>\n    <string name=\"autoplay_title\">Автоматско пуштање</string>\n    <string name=\"no_comments\">Нема коментари</string>\n    <string name=\"error_unable_to_load_comments\">Грешка при вчитувањето на коментарите</string>\n    <string name=\"close\">Затвори</string>\n    <string name=\"enable_playback_resume_title\">Продолжи со репродукција</string>\n    <string name=\"enable_playback_resume_summary\">Враќање на последната позиција на репродукција</string>\n    <string name=\"settings_category_clear_data_title\">Избриши податоци</string>\n    <string name=\"missing_file\">Дадотеката е преместена или избришана</string>\n    <string name=\"overwrite_unrelated_warning\">Ддотека со ова име веќе постои</string>\n    <string name=\"overwrite_finished_warning\">Преземената дадотека со ова име веќе постои</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe беше затворен додека го обработуваше фајлот</string>\n    <string name=\"error_insufficient_storage_left\">Не останува простор на уредот</string>\n    <string name=\"error_timeout\">Истечено време за поврзување</string>\n    <string name=\"confirm_prompt\">Сакате да ја исчистите историјата на преземања или да ги избришете сите преземени фајлови?</string>\n    <string name=\"enable_queue_limit\">Ограничи ја редицата за преземања</string>\n    <string name=\"enable_queue_limit_desc\">Едно преземање ќе работи истовремено</string>\n    <string name=\"start_downloads\">Започни преземања</string>\n    <string name=\"pause_downloads\">Паузирај преземања</string>\n    <string name=\"downloads_storage_ask_summary\">Ќе бидете прашани каде да го зачувате секое преземање.\\nАктивирајте го инструментот за избор на системска папка (SAF), ако сакате да преземате на SD картичка</string>\n    <string name=\"downloads_storage_use_saf_title\">Користи го инструментот за избор на системска папка (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">Рамката за пристап до складирање овозможува преземања во надворешна SD-картичка.\n\\nЗабелешка: некои уреди не се поддржани.</string>\n    <string name=\"show_comments_summary\">Исклучете за да ги скриете коментарите</string>\n    <string name=\"enable_playback_state_lists_title\">Позиции во листите</string>\n    <string name=\"enable_playback_state_lists_summary\">Покажете ги индикаторите за позиција за репродукција во листите</string>\n    <string name=\"seek_duration_title\">Брзо премотување напред</string>\n    <string name=\"peertube_instance_url_title\">Примери на PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Одберете ги вашите омилени PeerTube пример</string>\n    <string name=\"peertube_instance_url_help\">Пронајдете ги примерите кои ви се допаѓаат на %s</string>\n    <string name=\"peertube_instance_add_title\">Додадете пример</string>\n    <string name=\"recent\">Скорешни</string>\n    <string name=\"enqueue_stream\">Додај во редослед</string>\n    <string name=\"feed_show_partially_watched\">Делумно изгледани</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s гледач</item>\n        <item quantity=\"other\">%s гледачи</item>\n    </plurals>\n    <string name=\"show_less\">Прикажи помалку</string>\n    <string name=\"main_tabs_position_summary\">Премести ги основниот селектор на јазичиња најдолу</string>\n    <string name=\"main_tabs_position_title\">Позиција на основните јазичиња</string>\n    <string name=\"show_channel_details\">Прикажи информации за каналот</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Да, како и делумно изгледаните видеа</string>\n    <string name=\"audio_track_present_in_video\">Аудио снимка треба да е веќе присутна во овој стрим</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s слушател</item>\n        <item quantity=\"other\">%s слушатели</item>\n    </plurals>\n    <string name=\"local\">Местно</string>\n    <string name=\"recently_added\">Скоро додадено</string>\n    <string name=\"error_insufficient_storage\">Нема доволно слободна меморија на уредот</string>\n    <string name=\"feed_notification_loading\">Вчитување на фидот…</string>\n    <string name=\"metadata_category\">Категорија</string>\n    <string name=\"no_video_streams_available_for_external_players\">Нема достапни стримови за надворешни плеери</string>\n    <string name=\"open_with\">Отвори со</string>\n    <string name=\"mark_as_watched\">Обележи како гледано</string>\n    <string name=\"night_theme_title\">Ноќен режим</string>\n    <string name=\"clear_queue_confirmation_description\">Активниот редослед на емитувања ќе биде заменет</string>\n    <string name=\"clear_download_history\">Исчисти ја историјата на преземања</string>\n    <string name=\"local_search_suggestions\">Местни предлози за пребарување</string>\n    <string name=\"peertube_instance_add_help\">Внесете URL адреса на инстанцата</string>\n    <string name=\"error_postprocessing_failed\">Неуспешна постобработка</string>\n    <string name=\"remove_duplicates_message\">Да се отстранат сите стримови дупликати од оваа плејлиста?</string>\n    <string name=\"feed_create_new_group_button_title\">Нова група</string>\n    <string name=\"feed_load_error_account_info\">Неуспешно вчитување на новинска лента за „%s“.</string>\n    <string name=\"feed_show_hide_streams\">Прикажи / скриј стримови</string>\n    <string name=\"private_content\">Оваа содржина е приватна, така што не може да биде емитувана или преземена од страна на NewPipe.</string>\n    <string name=\"featured\">Истакнато</string>\n    <string name=\"radio\">Радио</string>\n    <string name=\"auto_device_theme_title\">Автоматски (режим на уредот)</string>\n    <string name=\"download_has_started\">Преземањето започна</string>\n    <string name=\"metadata_privacy\">Приватност</string>\n    <string name=\"metadata_age_limit\">Возрасна граница</string>\n    <string name=\"metadata_privacy_unlisted\">Скриено</string>\n    <string name=\"metadata_privacy_private\">Приватно</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer стандардно</string>\n    <string name=\"channel_tab_tracks\">Снимки</string>\n    <string name=\"channel_tab_videos\">Видеа</string>\n    <string name=\"channel_tab_shorts\">Кратки видеа</string>\n    <string name=\"channel_tab_livestreams\">Во живо</string>\n    <string name=\"image_quality_high\">Висок квалитет</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist\">Сподели ја плејлистата</string>\n    <string name=\"share_playlist_with_titles\">Сподели со наслови</string>\n    <string name=\"show_more\">Прикажи повеќе</string>\n    <string name=\"comments_are_disabled\">Коментарите се исклучени</string>\n    <string name=\"tablet_mode_title\">Таблет-режим</string>\n    <string name=\"on\">Вклучено</string>\n    <string name=\"overwrite_failed\">неуспешно презапишување на фајлот</string>\n    <string name=\"most_liked\">Најпопуларни</string>\n    <string name=\"no_streams\">Нема стримови</string>\n    <string name=\"main_page_content_swipe_remove\">Лизнете елементи за да ги избришете</string>\n    <string name=\"notification_scale_to_square_image_title\">Исечи ја сликичката на сооднос 1:1</string>\n    <string name=\"saved_tabs_invalid_json\">Грешка при читањето на зачуваните јазичиња, ќе бидат користени стандардните јазичиња</string>\n    <string name=\"permission_display_over_apps\">Дај дозвола за прикажување врз други апликации</string>\n    <string name=\"error_report_notification_title\">NewPipe откри грешка, допрете за да ја пријавите</string>\n    <string name=\"drawer_header_description\">Вклучување на услуги, тековно избрани:</string>\n    <string name=\"recaptcha_solve\">Решете</string>\n    <string name=\"select_a_playlist\">Изберете плејлиста</string>\n    <string name=\"title_activity_play_queue\">Емитувај го редоследот</string>\n    <string name=\"remove_watched_popup_warning\">Видеата кои биле гледани пред и откако биле додадени во плејлистата ќе бидат отстранети.\\nСигурни ли сте? Оваа промена е трајна!</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d минута</item>\n        <item quantity=\"other\">%d минути</item>\n    </plurals>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d избран</item>\n        <item quantity=\"other\">%d избрани</item>\n    </plurals>\n    <string name=\"no_appropriate_file_manager_message\">Не е пронајден соодветен менаџер за фајлови за ова дејствие.\\nВе молиме инсталирајте менаџер за фајлови (анг. file manager) или обидете се да деактивирате „%s“ во поставките за преземања</string>\n    <string name=\"audio_track_type_secondary\">секундарна</string>\n    <string name=\"channel_tab_channels\">Канали</string>\n    <string name=\"channel_tab_playlists\">Плејлисти</string>\n    <string name=\"channel_tab_albums\">Албуми</string>\n    <string name=\"channel_tab_about\">За каналот</string>\n    <string name=\"show_channel_tabs\">Картички на канали</string>\n    <string name=\"toggle_screen_orientation\">Смени ја ориентацијата на екранот</string>\n    <string name=\"next_stream\">Следен стрим</string>\n    <string name=\"replay\">Пушти повторно</string>\n    <string name=\"more_options\">Повеќе опции</string>\n    <string name=\"duration\">Времетраење</string>\n    <string name=\"rewind\">Премотување наназад</string>\n    <string name=\"forward\">Премотување нанапред</string>\n    <string name=\"image_quality_title\">Квалитет на слика</string>\n    <string name=\"image_quality_none\">Не вчитувај слики</string>\n    <string name=\"share_playlist_with_list\">Сподели список со линкови</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s одговор</item>\n        <item quantity=\"other\">%s одговори</item>\n    </plurals>\n    <string name=\"ignore_hardware_media_buttons_title\">Игнорирај хардверски копчиња за медиуми</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Корисно, на пример, ако користите слушалки со скршени физички копчиња</string>\n    <string name=\"start_main_player_fullscreen_title\">Стартирајте го основниот плеер на цел екран</string>\n    <string name=\"infinite_videos\">∞ видеа</string>\n    <string name=\"notification_action_buffering\">Буферирање</string>\n    <string name=\"notification_action_nothing\">Ништо</string>\n    <string name=\"notification_colorize_title\">Обој го известувањето</string>\n    <string name=\"notification_action_repeat\">Повтори</string>\n    <string name=\"notification_action_shuffle\">Измешај</string>\n    <string name=\"paid_content\">Оваа содржина е достапна само за оние корисници кои платиле, така што не може да биде емитувана или преземена од страна на NewPipe.</string>\n    <string name=\"georestricted_content\">Оваа содржина не е достапна во Вашата држава.</string>\n    <string name=\"youtube_music_premium_content\">Ова видео е достапно само за претплатници на YouTube Music Premium, така што не може да биде емитувано или преземено од страна на NewPipe.</string>\n    <string name=\"metadata_thumbnails\">Сликички</string>\n    <string name=\"description_select_enable\">Овозможи го селектирањето на текст во описот</string>\n    <string name=\"account_terminated\">Акаунтот е укинат</string>\n    <string name=\"metadata_uploader_avatars\">Аватари на објавувачот</string>\n    <string name=\"metadata_privacy_public\">Јавно</string>\n    <string name=\"metadata_subscribers\">Претплатници</string>\n    <string name=\"detail_pinned_comment_view_description\">Закачен коментар</string>\n    <string name=\"detail_heart_img_view_description\">Обележан со срце од авторот</string>\n    <string name=\"open_website_license\">Отвори ја веб-страницата</string>\n    <string name=\"off\">Исклучено</string>\n    <string name=\"notifications_disabled\">Известувањата се оневозможени</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"unknown_quality\">Непознат квалитет</string>\n    <string name=\"download_already_pending\">Веќе има преземање со тоа име кое претстои</string>\n    <string name=\"error_download_resource_gone\">Неуспешно враќање на преземањето</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d час</item>\n        <item quantity=\"other\">%d часа</item>\n    </plurals>\n    <string name=\"delete_downloaded_files\">Избриши ги преземените фајлови</string>\n    <string name=\"feed_show_upcoming\">Претстојни</string>\n    <string name=\"settings_category_exoplayer_title\">Поставки за ExoPlayer</string>\n    <string name=\"share_playlist_content_details\">%1$s \\n%2$s</string>\n    <string name=\"delete_downloaded_files_confirm\">Избриши ги сите преземени фајлови од дискот?</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Достапно за некои услуги, обично е многу побрзо но можно е да врати ограничено количество видеа и честопати нецелосни информации (пр. нема времетраење, вид на видеото, дали е во живо)</string>\n    <string name=\"notification_action_2_title\">Копче за трето дејствие</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d ден</item>\n        <item quantity=\"other\">%d дена</item>\n    </plurals>\n    <string name=\"feed_show_watched\">Целосно изгледани</string>\n    <string name=\"audio_track_name\">%1$s%2$s</string>\n    <string name=\"audio_track_type_original\">оригинална</string>\n    <string name=\"audio_track_type_dubbed\">натсинхронизирана</string>\n    <string name=\"audio_track_type_descriptive\">описна</string>\n    <string name=\"prefer_original_audio_title\">Претпочитај ја оригиналната аудио снимка</string>\n    <string name=\"volume\">Сила на звукот</string>\n    <string name=\"checking_updates_toast\">Проверка за ажурирања…</string>\n    <string name=\"app_language_title\">Јазик на интерфејсот</string>\n    <string name=\"enqueued_next\">Следното беше додадено во редослед</string>\n    <string name=\"faq_title\">Често поставувани прашања</string>\n    <string name=\"faq\">Отвори ја веб-страницата</string>\n    <string name=\"content_not_supported\">Оваа содржина сѐ не е поддржана од NewPipe.\\n\\nСе надеваме дека ќе биде поддржана во некоја идна верзија.</string>\n    <string name=\"right_gesture_control_title\">Дејствие со гестикулација оддесно</string>\n    <string name=\"settings_category_player_notification_title\">Известување на плеерот</string>\n    <string name=\"downloads_storage_ask_title\">Прашај ме за папка за преземање</string>\n    <string name=\"image_quality_low\">Низок квалитет</string>\n    <string name=\"metadata_language\">Јазик</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Секогаш користете го заобиколувањето на опцијата на површината на видео-излезот на ExoPlayer\\n(Англиски: Always use ExoPlayer\\'s video output surface setting workaround)</string>\n    <string name=\"peertube_instance_add_https_only\">Поддржани се само HTTPS линкови</string>\n    <string name=\"peertube_instance_add_exists\">Инстанцата веќе постои</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Избришано е %1$s преземање</item>\n        <item quantity=\"other\">Избришани се %1$s преземања</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Преземањето заврши</item>\n        <item quantity=\"other\">%s преземања се готови</item>\n    </plurals>\n    <string name=\"watch_history_states_deleted\">Позициите за репродукција се избришани</string>\n    <string name=\"fast_mode\">Брз режим</string>\n    <string name=\"copy_for_github\">Ископирај го форматираниот извештај</string>\n    <string name=\"reset_settings_summary\">Ресетирај ги сите поставки до стандардните вредности</string>\n    <string name=\"error_progress_lost\">Прогресот е загубен, затоа што фајлот е избришан</string>\n    <string name=\"pause_downloads_on_mobile\">Прекини преземања на измерени мрежи</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Почнувајќи од Android 10, се поддржува само „Storage Access Framework“</string>\n    <string name=\"choose_instance_prompt\">Одберете инстанца</string>\n    <string name=\"systems_language\">Стандарден јазик на уредот</string>\n    <string name=\"remove_watched\">Отстрани ги гледаните</string>\n    <string name=\"remove_watched_popup_title\">Да се отстранат гледаните видеа?</string>\n    <string name=\"remove_duplicates\">Отстрани ги дупликатите</string>\n    <string name=\"remove_duplicates_title\">Да се отстранат дупликатите?</string>\n    <string name=\"feed_group_dialog_empty_name\">Името на групата е празно</string>\n    <string name=\"feed_new_items\">Нови видеа во лентата со новости</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Изберете претплати</string>\n    <string name=\"feed_group_dialog_empty_selection\">Нема избрани претплати</string>\n    <string name=\"feed_fetch_channel_tabs\">Извлечи јазичиња (анг. tabs) на канали</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Овозможи брз режим</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Оневозможи брз режим</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Јазичиња за извлекување кога новинската лента се ажурира. Оваа опција нема ефект доколку каналот се ажурира со брз режим.</string>\n    <string name=\"playlist_page_summary\">Страница на плејлистата</string>\n    <string name=\"channel_created_by\">Создаден од %s</string>\n    <string name=\"video_detail_by\">Од %s</string>\n    <string name=\"soundcloud_go_plus_content\">Ова е песна на SoundCloud Go+ (барем во Вашата држава), така што не може да биде емитувана или преземена од страна на NewPipe.</string>\n    <string name=\"night_theme_summary\">Изберете го Вашиот омилен ноќен режим — %s</string>\n    <string name=\"select_night_theme_toast\">Можете да го изберете Вашиот омилен ноќен режим подолу</string>\n    <string name=\"metadata_tags\">Ознаки</string>\n    <string name=\"metadata_licence\">Лиценца</string>\n    <string name=\"metadata_support\">Поддршка</string>\n    <string name=\"metadata_host\">Домаќин</string>\n    <string name=\"metadata_subchannel_avatars\">Аватари на подканали</string>\n    <string name=\"metadata_avatars\">Аватари</string>\n    <string name=\"metadata_banners\">Банери</string>\n    <string name=\"select_quality_external_players\">Избери квалитет за надворешни плеери</string>\n    <string name=\"select_audio_track_external_players\">Избери аудио снимка за надворешни плеери</string>\n    <string name=\"get_notified\">Добивај известувања</string>\n    <string name=\"sort\">Подреди</string>\n    <string name=\"you_successfully_subscribed\">Се претплативте на овој канал</string>\n    <string name=\"toggle_all\">Вклучи ги сите</string>\n    <string name=\"show_channel_tabs_summary\">Кои картички се прикажани на страниците на каналите</string>\n    <string name=\"open_play_queue\">Отвори редослед на емитувања</string>\n    <string name=\"toggle_fullscreen\">Пушти на цел екран</string>\n    <string name=\"previous_stream\">Претходен стрим</string>\n    <string name=\"image_quality_medium\">Среден квалитет</string>\n    <string name=\"msg_failed_to_copy\">Неуспешно копирање во клипборд</string>\n    <string name=\"yes\">Да</string>\n    <string name=\"no\">Не</string>\n    <string name=\"search_showing_result_for\">Прикажани резулати за: %s</string>\n    <string name=\"notification_scale_to_square_image_summary\">Исечи ја сликичката на видеото прикажана во известувањето од 16:9 до 1:1 сооднос</string>\n    <string name=\"notification_action_0_title\">Копче за прво дејствие</string>\n    <string name=\"notification_action_1_title\">Копче за второ дејствие</string>\n    <string name=\"notification_action_3_title\">Копче за четврто дејствие</string>\n    <string name=\"notification_action_4_title\">Копче за петто дејствие</string>\n    <string name=\"notification_actions_summary_android13\">Уредете го секое дејствие за известување подолу, допирајќи на него. Првите три дејствија (пушти/паузирај, претходно и следно) се поставени од системот и не можат да се приспособат.</string>\n    <string name=\"notification_colorize_summary\">Дозволете Android да ја приспособи бојата на известувањата според главната боја во сликичката (имајте предвид дека ова не е достапно на сите уреди)</string>\n    <string name=\"crash_the_player\">Сруши го плеерот</string>\n    <string name=\"progressive_load_interval_title\">Големина на интервалот на вчитување при емитување</string>\n    <string name=\"progressive_load_interval_summary\">Променето ја големината на интервалот на вчитување при емитување на прогресивни содржини (во моментов %s). Пониска вредност ,пже да го забрза нивното почетно вчитување</string>\n    <string name=\"clear_queue_confirmation_summary\">Префрлањето од еден плеер на друг може да го замени Вашиот редослед</string>\n    <string name=\"show_description_title\">Прикажи опис</string>\n    <string name=\"show_description_summary\">Исклучете за да го скриете описот на видеото и дополнителните информации</string>\n    <string name=\"show_meta_info_title\">Прикажи метаподатоци</string>\n    <string name=\"prefer_descriptive_audio_title\">Претпочитај описни аудио снимки</string>\n    <string name=\"prefer_original_audio_summary\">Ја избира оригиналната аудио снимка независно од јазикот</string>\n    <string name=\"auto_queue_toggle\">Автоматско емитување на следното видео</string>\n    <string name=\"left_gesture_control_summary\">Изберете гестикулација за левата половина од екранот на плеерот</string>\n    <string name=\"brightness\">Светлина</string>\n    <string name=\"remote_search_suggestions\">Предлози за оддалечено пребарување</string>\n    <string name=\"restore_defaults\">Врати ги стандардните</string>\n    <string name=\"restore_defaults_confirmation\">Дали сакате да ги вратите стандардните поставки?</string>\n    <string name=\"comments_tab_description\">Коментари</string>\n    <string name=\"related_items_tab_description\">Поврзани работи</string>\n    <string name=\"description_tab_description\">Опис</string>\n    <string name=\"import_subscriptions_hint\">Увези или извези претплати од менито со три точки</string>\n    <string name=\"subtitle_activity_recaptcha\">Стиснете на „Готово“ кога ќе решите</string>\n    <string name=\"reset_settings_title\">Ресетирај ги поставките</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Ќе бидете прашани каде да го зачувате секое преземање</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d секунда</item>\n        <item quantity=\"other\">%d секунди</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">Група од канали</string>\n    <string name=\"feed_oldest_subscription_update\">Последно ажурирање на фидот: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Не се вчитани: %d</string>\n    <string name=\"feed_processing_message\">Обработка на фидот…</string>\n    <string name=\"feed_group_dialog_delete_message\">Да се избрише оваа група?</string>\n    <string name=\"settings_category_feed_title\">Лента со новости</string>\n    <string name=\"feed_update_threshold_title\">Праг за ажурирање на лентата со новости</string>\n    <string name=\"feed_update_threshold_option_always_update\">Секогаш ажурирај</string>\n    <string name=\"feed_load_error\">Грешка при вчитувањето на лентата со новости</string>\n    <string name=\"feed_load_error_fast_unknown\">Брзиот режим на новинската лента не доставува повеќе информации за ова.</string>\n    <string name=\"show_thumbnail_title\">Прикажи ја сликичката</string>\n    <string name=\"show_thumbnail_summary\">Искористи ја сликичката и за позадината на заклучениот екран и за известувањата</string>\n    <string name=\"chapters\">Поглавја</string>\n    <string name=\"no_app_to_open_intent\">Нема апликација на уредот што може да го отвори овој фајл</string>\n    <string name=\"night_theme_available\">Оваа опција е достапна само ако %s е избрано за режим</string>\n    <string name=\"description_select_disable\">Оневозможи го селектирањето на текст во описот</string>\n    <string name=\"unknown_format\">Непознат формат</string>\n    <string name=\"unknown_audio_track\">Непозната</string>\n    <string name=\"play\">Пушти</string>\n    <string name=\"notification_actions_summary\">Уредете го секое дејствие за известување подолу допирајќи на него. Изберете до три од нив за да се прикажат во компактното известување со користење на полињата за избор од десната страна.</string>\n    <string name=\"notification_actions_at_most_three\">Можете да изберете најмногу три дејствија за да се прикажат во компактното известување!</string>\n    <string name=\"no_live_streams\">Нема стримови во живо</string>\n    <string name=\"play_queue_audio_track\">Аудио: %s</string>\n    <string name=\"more_than_100_videos\">100+ видеа</string>\n    <string name=\"audio_track\">Аудио трака</string>\n    <string name=\"enqueued\">Додадено во редослед</string>\n    <string name=\"no_one_listening\">Нема слушатели</string>\n    <string name=\"error_report_notification_toast\">Возникна грешка, погледнете го известувањето</string>\n    <string name=\"error_report_open_issue_button_text\">Пријави на GitHub</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s нов стрим</item>\n        <item quantity=\"other\">%s нови стримови</item>\n    </plurals>\n    <string name=\"error_report_open_github_notice\">Ве молиме, проверете дали веќе има дискусија за проблем како овој. Создадените дупликати ни одземаат од времето, коешто можеме да го посветиме на поправање на проблемот.</string>\n    <string name=\"enqueue_next_stream\">Додај го во редослед следното</string>\n    <string name=\"no_one_watching\">Нема гледачи</string>\n    <string name=\"done\">Готово</string>\n    <string name=\"no_dir_yet\">Сѐ уште не е избрана папка за преземања, одберете ја стандардната папка за преземања сега</string>\n    <string name=\"no_playlist_bookmarked_yet\">Во моментов нема обележани плејлисти</string>\n    <string name=\"default_kiosk_page_summary\">Стандарден киоск</string>\n    <string name=\"faq_description\">Ако имате проблеми со користењето на апликацијата, не заборавајте да ги проверите одговориве на често поставувани прашања!</string>\n    <string name=\"reset_all_settings\">Ресетирањето на сите поставки ќе ги отфрли сите Ваши претпочитани поставки и ќе ја рестартира апликацијата.\\n\\nСигурни ли сте дека сакате да продолжите?</string>\n    <string name=\"new_seek_duration_toast\">Поради ограничувања на ExoPlayer, стапката на премотување е поставена на %d секунди</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Прикажи ги само негрупираните претплати</string>\n    <string name=\"feed_load_error_terminated\">Акаунтот на авторот е укинат.\\nNewPipe нема да може да ги вчитува овие видеа во иднина.\\nСакате ли да ја откажете претплатата на овој канал?</string>\n    <string name=\"feed_update_threshold_summary\">Време по последното ажурирање пред една претплата да се смета за застарена — %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Извлекување од специјална новинска лента, кога е возможно</string>\n    <string name=\"feed_hide_streams_title\">Прикажи ги следните стримови</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Сликичка на аватарот на каналот</string>\n    <string name=\"metadata_privacy_internal\">Внатрешно</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Сметате дека лентата со новости (новинската лента, анг. News Feed) се вчитува премногу бавно? Ако сметате така, можете да пробате да го вклучите режимот за брзо вчитување (може да го промените во поставките или со притискање на копчето подолу).\\n \\nNewPipe нуди два режима за вчитување на новинската лента:\\n• Извлекување на целата страница на претплати, што е бавно но и целосно.\\n• Користење на специјален клиент (анг. endpoint), овозможен од услугата, што е брзо, но обично е нецелосно.\\n\\nРазликата помеѓу двете е во тоа што брзиот режим најчесто дава нецелесни информации, како времетраењето и видот на видеото (не прави разлика помеѓу нормални видеа и преноси во живо) и можно е да врати помалку видеа.\\n\\nYouTube е пример за услуга која го овозможува овој брз режим со RSS новинската лента.\\n\\nНакратко, изборот се сведува на тоа што Вие претпочитате: брзина или точни информации.</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Не е пронајден соодветен менаџер за фајлови за ова дејствие.\\nВе молиме инталирајте менаџер за фајлови компатибилен со Storage Access Framework</string>\n    <string name=\"description_select_note\">Режимот на селектирање е вклучен. Сега можете да селектирате текст во описот на видеото. Имајте предвид дека страницата може да трепка и линковите може да не можат да се кликнат, додека сте во режим на селектирање.</string>\n    <string name=\"streams_not_yet_supported_removed\">Стримовите кои сѐ уште не се поддржани од програмата за преземање не се прикажани</string>\n    <string name=\"selected_stream_external_player_not_supported\">Озбраниот стрим не е поддржан од надворешни плеери</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Нема достапни аудио стримови за надворешни плеери</string>\n    <string name=\"settings_category_exoplayer_summary\">Управувајте со некои поставки за ExoPlayer. За овие промени да стапат на сила, потребно е апликацијата да се рестартира</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Ово заобиколување ги ослободува и повторно ги инстанцира видео кодеците кога ќе дојде до промена на површината, наместо директно да ја постави површината на кодекот. Веќе се користи од ExoPlayer на некои уреди со овој проблем. Оваа поставка има ефект само на Android 6 и понови верзии\\n\\nОвозможувањето на оваа поставка може да спречи грешки при емитување при префрлување на тековниот видео плеер или пуштање на цел екран</string>\n    <string name=\"peertube_instance_add_fail\">Инстанцата не може да биде потврдена</string>\n    <string name=\"image_quality_summary\">Изберете го квалитетот на сликите и дали воопшто да се вчитуваат слики, за да го намалите користењето на интернет и меморија. Промените го чистат кешот на сликите (анг. image cache), како и во меморијата, така и на дискот — %s</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"none\">Ништо</string>\n    <string name=\"import_settings_vulnerable_format\">Поставките во извезениот фајл кој се увезува користат ранлив формат кој повеќе не е поддржан од NewPipe 0.27.0. Уверете се дека извезениот фајл кој се увезува е од доверлив извор и претпочитајте во иднина да користите само износи добиени од NewPipe 0.27.0 или понова верзија. Поддршката за увезување поставки од овој ранлив формат наскоро ќе биде целосно укината и тогаш старите верзии на NewPipe повеќе нема да можат да увезуваат поставки од износи од новите верзии.</string>\n    <string name=\"clear_queue_confirmation_title\">Побарај потврда пред чистење на редоследот</string>\n    <string name=\"left_gesture_control_title\">Дејствие со гестикулација одлево</string>\n    <string name=\"show_meta_info_summary\">Исклучете за да ги скриете кутиите со метаподатоци со дополнителни информации за авторот на стримот, содржината на стримот или пребарување</string>\n    <string name=\"prefer_descriptive_audio_summary\">Ја избира аудио снимката со описи за луѓето го видна попреченост, доколку има таква</string>\n    <string name=\"right_gesture_control_summary\">Изберете гестикулација за десната половина од екранот на плеерот</string>\n    <string name=\"start_main_player_fullscreen_summary\">Видеата нема да започнат со емитување во миниплеерот, туку директно ќе се вклучат на цел екран, доколку автоматското ротирање е заклучено. Сѐ уште можете да добиете пристап до миниплеерот, кога ќе излезете од целиот екран</string>\n    <string name=\"unsupported_url_dialog_message\">URL адресата не може да биде распознаена. Да се отвори со друга апликација?</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ml/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"playback_reset\">റീസെറ്റ്</string>\n    <string name=\"playback_step\">സ്റ്റെപ്</string>\n    <string name=\"skip_silence_checkbox\">നിശബ്ദതയിൽ ഫാസ്റ്റ്ഫോർവേർഡ്</string>\n    <string name=\"unhook_checkbox\">അൺഹൂക്ക് (വികലമാക്കാം)</string>\n    <string name=\"playback_pitch\">പിച്ച്</string>\n    <string name=\"playback_tempo\">ടെംപോ</string>\n    <string name=\"playback_speed_control\">പ്ലേബാക്ക് വേഗത നിയന്ത്രണങ്ങൾ</string>\n    <string name=\"import_network_expensive_warning\">ഈ പ്രവർത്തനം നെറ്റ്‌വർക്ക് ചെലവേറിയതായിരിക്കുമെന്ന് ഓർമ്മിക്കുക.\n\\n\n\\nനിങ്ങൾ തുടരാൻ ആഗ്രഹിക്കുന്നുവോ\\?</string>\n    <string name=\"import_soundcloud_instructions_hint\">താങ്കളുടെ ID: yourID, soundcloud.com/yourid</string>\n    <string name=\"import_soundcloud_instructions\">URL അല്ലെങ്കിൽ നിങ്ങളുടെ ഐഡി ടൈപ്പുചെയ്തുകൊണ്ട് ഒരു സൗണ്ട്ക്ലൗഡ് പ്രൊഫൈൽ ഇമ്പോർട്ടുചെയ്യുക:\n\\n\n\\n1. ഒരു വെബ് ബ്രൗസറിൽ \\\"ഡെസ്ക്ടോപ്പ് മോഡ്\\\" പ്രാപ്തമാക്കുക (മൊബൈൽ ഉപകരണങ്ങൾക്കായി സൈറ്റ് ലഭ്യമല്ല)\n\\n2. ഈ URL- ലേക്ക് പോകുക: %1$s\n\\n3. ആവശ്യപ്പെടുമ്പോൾ ലോഗിൻ ചെയ്യുക\n\\n4. നിങ്ങളെ റീഡയറക്‌ടുചെയ്‌ത പ്രൊഫൈൽ URL പകർത്തുക.</string>\n    <string name=\"import_youtube_instructions\">ഗൂഗിൾ ടേക്ക് ഔട്ടിൽ നിന്ന് യൂട്യൂബ് സബ്‌സ്‌ക്രിപ്‌ഷനുകൾ ഇമ്പോർട്ടുചെയ്യുക:\n\\n\n\\n1. ഈ URL ലേക്ക് പോകുക: %1$s\n\\n2. ആവശ്യപ്പെടുമ്പോൾ ലോഗിൻ ചെയ്യുക\n\\n3. \\\"All data included\\\" ക്ലിക്കുചെയ്യുക, തുടർന്ന് \\\"Deselect all\\\" എന്നതിൽ ക്ലിക്കുചെയ്യുക, തുടർന്ന് \\\"subscriptions\\\" മാത്രം തിരഞ്ഞെടുത്ത് \\\"OK\\\" ക്ലിക്കുചെയ്യുക.\n\\n4. \\\"Next Export\\\" ക്ലിക്കുചെയ്യുക, തുടർന്ന് \\\"Create Export\\\" ക്ലിക്കുചെയ്യുക\n\\n5. \\\"Download\\\" ബട്ടൺ പ്രത്യക്ഷപ്പെട്ടതിനുശേഷം അതിൽ ക്ലിക്കുചെയ്യുക\n\\n6. ഡൗൺ‌ലോഡുചെയ്‌ത ടേക്ക്ഔട്ട് സിപ്പിൽ നിന്ന് .json ഫയൽ എക്‌സ്‌ട്രാക്റ്റുചെയ്യുക (സാധാരണയായി \\\"YouTube, YouTube Music / subscription / subscription.json\\\" ന് കീഴിൽ) അത് ഇവിടെ ഇറക്കുമതി ചെയ്യുക.</string>\n    <string name=\"subscriptions_export_unsuccessful\">സബ്‌സ്‌ക്രിപ്‌ഷനുകൾ എക്‌സ്‌പോർട്ടുചെയ്യാനായില്ല</string>\n    <string name=\"subscriptions_import_unsuccessful\">സബ്‌സ്‌ക്രിപ്‌ഷനുകൾ ഇറക്കുമതി ചെയ്യാൻ കഴിഞ്ഞില്ല</string>\n    <string name=\"previous_export\">മുമ്പത്തെ എക്സ്പോർട്ട്</string>\n    <string name=\"import_file_title\">ഫയൽ ഇമ്പോർട്ടുചെയ്യുക</string>\n    <string name=\"export_ongoing\">എക്സ്പോർട്ട് ചെയ്യുന്നു…</string>\n    <string name=\"import_ongoing\">ഇമ്പോർട്ട് ചെയ്യുന്നു…</string>\n    <string name=\"export_to\">ലേക്ക് എക്സ്പോർട്ട്</string>\n    <string name=\"import_from\">ഇമ്പോർട്ട് ന്ന്</string>\n    <string name=\"import_title\">ഇമ്പോർട്ട്</string>\n    <string name=\"enable_disposed_exceptions_summary\">നീക്കംചെയ്യലിനുശേഷം ശകലം അല്ലെങ്കിൽ ആക്റ്റിവിറ്റി ജീവിതചക്രത്തിന് പുറത്തുള്ള വിതരണം ചെയ്യാനാവാത്ത Rx ഒഴിവാക്കലുകളുടെ നിർബന്ധിത റിപ്പോർട്ടിംഗ്</string>\n    <string name=\"enable_disposed_exceptions_title\">Out-of-lifecycle പിശകുകൾ റിപ്പോർട്ടുചെയ്യുക</string>\n    <string name=\"enable_leak_canary_summary\">മെമ്മറി ലീക്ക് മോണിറ്ററിംഗ്, ഹീപ്പ് ഡമ്പിംഗ് ചെയ്യുമ്പോൾ അപ്ലിക്കേഷൻ പ്രതികരിക്കാതിരിക്കാൻ കാരണമായേക്കാം</string>\n    <string name=\"caption_setting_description\">പ്ലെയർ അടിക്കുറിപ്പ് ടെക്സ്റ്റ് സ്‌കെയിലും പശ്ചാത്തല ശൈലികളും പരിഷ്‌ക്കരിക്കുക. പ്രാബല്യത്തിൽ വരാൻ അപ്ലിക്കേഷൻ പുനരാരംഭിക്കൽ ആവശ്യമാണ്</string>\n    <string name=\"caption_setting_title\">അടിക്കുറിപ്പുകൾ</string>\n    <string name=\"caption_auto_generated\">യാന്ത്രികമായി സൃഷ്‌ടിച്ചവ</string>\n    <string name=\"resize_zoom\">സൂം</string>\n    <string name=\"resize_fill\">ഫിൽ</string>\n    <string name=\"resize_fit\">ഫിറ്റ്</string>\n    <string name=\"caption_none\">അടിക്കുറിപ്പുകളൊന്നുമില്ല</string>\n    <string name=\"playlist_no_uploader\">യാന്ത്രികമായി ജനറേറ്റുചെയ്‌തത് (അപ്‌ലോഡറൊന്നും കണ്ടെത്തിയില്ല)</string>\n    <string name=\"playlist_thumbnail_change_success\">പ്ലേലിസ്റ്റ് ലഘുചിത്രം മാറ്റി.</string>\n    <string name=\"playlist_add_stream_success\">പ്ലേലിസ്റ്റ് ചെയ്തു</string>\n    <string name=\"playlist_creation_success\">പ്ലേലിസ്റ്റ് സൃഷ്‌ടിച്ചു</string>\n    <string name=\"delete_playlist_prompt\">ഈ പ്ലേലിസ്റ്റ് ഇല്ലാതാക്കണോ\\?</string>\n    <string name=\"unbookmark_playlist\">ബുക്ക്മാർക്ക് നീക്കംചെയ്യുക</string>\n    <string name=\"bookmark_playlist\">പ്ലേലിസ്റ്റ് ബുക്ക്മാർക്ക് ചെയ്യുക</string>\n    <string name=\"set_as_playlist_thumbnail\">പ്ലേലിസ്റ്റ് ലഘുചിത്രമായി സജ്ജമാക്കുക</string>\n    <string name=\"unmute\">അൺമ്യൂട്ട്</string>\n    <string name=\"mute\">മ്യൂട്ട്</string>\n    <string name=\"add_to_playlist\">പ്ലേലിസ്റ്റിലേക്ക് ചേർക്കുക</string>\n    <string name=\"name\">പേര്</string>\n    <string name=\"rename_playlist\">പേര് മാറ്റുക</string>\n    <string name=\"create_playlist\">പുതിയ പ്ലേലിസ്റ്റ്</string>\n    <string name=\"preferred_player_fetcher_notification_message\">അഭ്യർത്ഥിച്ച കന്റെന്റ് ലോഡുചെയ്യുന്നു</string>\n    <string name=\"preferred_player_fetcher_notification_title\">വിവരം നേടുന്നു…</string>\n    <string name=\"always_ask_open_action\">എപ്പോഴും ചോദിക്കുക</string>\n    <string name=\"popup_player\">പോപ്പ്അപ്പ് പ്ലെയർ</string>\n    <string name=\"background_player\">പശ്ചാത്തല പ്ലേയർ</string>\n    <string name=\"video_player\">വീഡിയോ പ്ലെയർ</string>\n    <string name=\"preferred_open_action_settings_summary\">ഉള്ളടക്കം തുറക്കുമ്പോൾ സ്ഥിരസ്ഥിതി പ്രവർത്തനം — %s</string>\n    <string name=\"preferred_open_action_settings_title\">തിരഞ്ഞെടുത്ത \\'ഓപ്പൺ\\' പ്രവർത്തനം</string>\n    <string name=\"drawer_close\">ഡ്രോയർ അടക്കുക</string>\n    <string name=\"drawer_open\">ഡ്രോയർ തുറക്കുക</string>\n    <string name=\"start_here_on_popup\">ഒരു പുതിയ പോപ്പ്അപ്പിൽ പ്ലേ ചെയ്യാൻ ആരംഭിക്കുക</string>\n    <string name=\"start_here_on_background\">പശ്ചാത്തലത്തിൽ പ്ലേ ആരംഭിക്കുക</string>\n    <string name=\"hold_to_append\">എൻക്യൂ ചെയ്യാൻ പിടിക്കുക</string>\n    <string name=\"play_queue_audio_settings\">ഓഡിയോ ക്രമീകരണങ്ങൾ</string>\n    <string name=\"play_queue_stream_detail\">വിശദാംശങ്ങൾ</string>\n    <string name=\"play_queue_remove\">നീക്കം ചെയ്യുക</string>\n    <string name=\"conferences\">സമ്മേളനങ്ങൾ</string>\n    <string name=\"most_liked\">ഏറ്റവും ഇഷ്ടപ്പെട്ടത്</string>\n    <string name=\"recently_added\">സമീപകാലത്ത് ചേർത്തത്</string>\n    <string name=\"local\">പ്രാദേശികം</string>\n    <string name=\"new_and_hot\">പുതിയതും ചൂടേറിയതും</string>\n    <string name=\"top_50\">മികച്ച 50</string>\n    <string name=\"trending\">ട്രെൻഡിങ്ങ്</string>\n    <string name=\"error_unable_to_load_comments\">കമെന്റുകൾ ലോഡുചെയ്യാനായില്ല</string>\n    <string name=\"import_settings\">ക്രമീകരണങ്ങളും ഇമ്പോർട്ടുചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ\\?</string>\n    <string name=\"override_current_data\">ഇത് നിങ്ങളുടെ നിലവിലെ സജ്ജീകരണത്തെ അസാധുവാക്കും.</string>\n    <string name=\"could_not_import_all_files\">മുന്നറിയിപ്പ്: എല്ലാ ഫയലുകളും ഇറക്കുമതി ചെയ്യാൻ കഴിഞ്ഞില്ല.</string>\n    <string name=\"no_valid_zip_file\">സാധുവായ ZIP ഫയലില്ല</string>\n    <string name=\"import_complete_toast\">ഇറക്കുമതി ചെയ്തവ</string>\n    <string name=\"export_complete_toast\">കയറ്റുമതി ചെയ്തവ</string>\n    <string name=\"select_a_kiosk\">ഒരു കിയോസ്ക് തിരഞ്ഞെടുക്കുക</string>\n    <string name=\"no_channel_subscribed_yet\">ചാനൽ സബ്സ്ക്രിപ്ഷനുകൾ ഇല്ല</string>\n    <string name=\"select_a_channel\">ഒരു ചാനൽ തിരഞ്ഞെടുക്കുക</string>\n    <string name=\"channel_page_summary\">ചാനൽ പേജ്</string>\n    <string name=\"default_kiosk_page_summary\">സ്ഥിര കിയോസ്ക്</string>\n    <string name=\"kiosk_page_summary\">കിയോസ്ക്‌ പേജ്</string>\n    <string name=\"blank_page_summary\">ശൂന്യമായ പേജ്</string>\n    <string name=\"main_page_content_summary\">പ്രധാന പേജിൽ കാണിക്കേണ്ട ടാബുകൾ</string>\n    <string name=\"main_page_content\">പ്രധാന പേജ് ഉള്ളടക്കം</string>\n    <string name=\"title_most_played\">ഏറ്റവും കൂടുതൽ തവണ പ്ലേ ചെയ്തത്</string>\n    <string name=\"title_last_played\">അവസാനം പ്ലേ ചെയ്തത്</string>\n    <string name=\"delete_item_search_history\">സെർച്ച് ചരിത്രത്തിൽനിന്ന് ഈ item നീക്കം ചെയ്യട്ടെയോ\\?</string>\n    <string name=\"action_history\">ചരിത്രം</string>\n    <string name=\"title_activity_history\">ചരിത്രം</string>\n    <string name=\"read_full_license\">ലൈസൻസ് വായിക്കൂ</string>\n    <string name=\"app_license\">കോപ്പി‌ലെഫ്റ്റ് ലിബ്രെ സോഫ്റ്റ്വെയറാണ് ന്യൂ‌പൈപ്പ്: നിങ്ങൾക്ക് അത് ഉപയോഗിക്കാനും പഠിക്കാനും പങ്കിടാനും ഇഷ്ടാനുസരണം മെച്ചപ്പെടുത്താനും കഴിയും. സ്വതന്ത്ര സോഫ്റ്റ്‌വെയർ ഫൗണ്ടേഷൻ പ്രസിദ്ധീകരിച്ച ഗ്നു ജനറൽ പബ്ലിക് ലൈസൻസിന്റെ നിബന്ധനകൾ പ്രകാരം, ലൈസൻസിന്റെ മൂന്നാം പതിപ്പ് അല്ലെങ്കിൽ (നിങ്ങളുടെ ഓപ്ഷനിൽ) പിന്നീടുള്ള ഏതെങ്കിലും പതിപ്പ് പ്രകാരം നിങ്ങൾക്ക് ഇത് പുനർവിതരണം ചെയ്യാനും / അല്ലെങ്കിൽ പരിഷ്ക്കരിക്കാനും കഴിയും.</string>\n    <string name=\"app_license_title\">ന്യൂപൈപ്പിന്റെ ലൈസൻസ്</string>\n    <string name=\"read_privacy_policy\">സ്വകാര്യതാനയം വായിക്കൂ</string>\n    <string name=\"privacy_policy_encouragement\">ദ ന്യൂപൈപ്പ് പ്രോജക്ട് നിങ്ങളുടെ സ്വകാര്യതയെ മാനിക്കുന്നു. അതുകൊണ്ടുതന്നെ, നിങ്ങളുടെ ഒരു ഡേറ്റയും ഞങ്ങൾ ശേഖരിക്കുന്നില്ല. \n\\nനിങ്ങൾ ഒരു ക്രാഷ് റിപ്പോർട്ട് അയക്കുമ്പോൾ അതിൻപ്രകാരം എന്ത് ഡാറ്റ ആണ് ശേഖരിക്കുന്നെന്നും സൂക്ഷിക്കുന്നതെന്നുമൊക്കെ ന്യൂപൈപ്പിന്റെ സ്വകാര്യതാനയം വ്യകതമാക്കുന്നതാണ്.</string>\n    <string name=\"privacy_policy_title\">ന്യൂപൈപ്പിന്റെ സ്വകാര്യതാനയം</string>\n    <string name=\"website_encouragement\">കൂടുതൽ വിവരങ്ങൾക്കും വാർത്തകൾക്കും ന്യൂപൈപ്പിന്റെ വെബ്സൈറ്റ് സന്ദർശിക്കുക.</string>\n    <string name=\"website_title\">വെബ്സൈറ്റ്</string>\n    <string name=\"give_back\">തിരികെ നൽകുക</string>\n    <string name=\"info_labels\">എന്താണ്:\\nഅപേക്ഷ:\\nഉള്ളടക്കത്തിന്റെ ഭാഷ:\\nഉള്ളടക്കത്തിന്റെ രാജ്യം:\\n അപ്ലിക്കേഷന്റെ ഭാഷ:\\nസേവനം:\\nGMT സമയം:\\nപാക്കേജ്:\\nപതിപ്പ്:\\nOS ന്റെ പതിപ്പ്:</string>\n    <string name=\"donation_encouragement\">നിങ്ങൾക്ക് മികച്ച ഉപഭോക്തൃ അനുഭവം നൽകാനായി പ്രയത്‌നിക്കുന്ന ലോകമെമ്പാടുമുള്ള വൊളന്റിയർമാരാണ് ന്യൂപൈപ്പിന്റെ ശക്തി. ന്യൂപൈപ്പിനെ ഇനിയും മികവുറ്റതാക്കാൻ നിങ്ങൾക്ക് കഴിയും, നിങ്ങളുടെ സംഭാവനയിലൂടെ.</string>\n    <string name=\"donation_title\">സംഭാവന ചെയ്യുക</string>\n    <string name=\"view_on_github\">ജിറ്റ്ഹബിൽ കാണുക</string>\n    <string name=\"contribution_encouragement\">തർജ്ജമയോ, ഡിസൈൻ മാറ്റങ്ങളോ, കോഡിങ് പരിപാടിയോ, എന്തുമാവട്ടെ, സഹായം എന്നും സ്വാഗതാർഹമാണ്. ഒത്തു പിടിച്ചാൽ മലയും പോരുംന്നല്ലേ!</string>\n    <string name=\"contribution_title\">സംഭാവന</string>\n    <string name=\"app_description\">സൗജന്യമായ, ലഘുവായ സ്ട്രീമിംഗ്, ആൻഡ്രോയിഡിൽ.</string>\n    <string name=\"tab_licenses\">ലൈസൻസുകൾ</string>\n    <string name=\"tab_about\">കുറിച്ച്</string>\n    <string name=\"copyright\" formatted=\"true\">%3$s ന്റെ കീഴിൽ %2$s ന്റെ ©%1$s</string>\n    <string name=\"title_licenses\">തേർഡ്-പാർട്ടി ലൈസൻസുകൾ</string>\n    <string name=\"title_activity_about\">ന്യൂപൈപ്പിനെക്കുറിച്ച്</string>\n    <string name=\"charset_most_special_characters\">പ്രത്യേക അടയാളങ്ങൾ</string>\n    <string name=\"charset_letters_and_digits\">അക്ഷരങ്ങളും അക്കങ്ങളും</string>\n    <string name=\"settings_file_replacement_character_title\">പകരം ഉപയോഗിക്കാവുന്ന അടയാളം</string>\n    <string name=\"settings_file_replacement_character_summary\">സ്വീകാര്യമല്ലാത്ത അടയാളങ്ങൾ ഈ അടയാളം കൊണ്ട് മാറ്റുന്നതാണ്</string>\n    <string name=\"settings_file_charset_title\">ഫയൽനാമങ്ങളിൽ അനുവദിച്ചിട്ടുള്ള അടയാളങ്ങൾ</string>\n    <string name=\"settings_category_downloads_title\">ഡൗൺലോഡ്</string>\n    <string name=\"done\">ഓകെ</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA ചാലഞ്ചിനായി അഭ്യർത്ഥിച്ചു</string>\n    <string name=\"subtitle_activity_recaptcha\">തീർന്നാൽ \\\"Done\\\" അമർത്തുക</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA ചാലഞ്ച്</string>\n    <string name=\"one_item_deleted\">ഒരെണ്ണം നീക്കംചെയ്തു.</string>\n    <string name=\"msg_popup_permission\">പോപപ് മോഡിന്ഈ\n\\nഅനുമതി ആവിശ്യമാണ്</string>\n    <string name=\"no_available_dir\">പിന്നീട് ക്രമീകരണങ്ങളിൽ ഒരു ഡൗൺലോഡ് ഫോൾഡർ തിരഞ്ഞെടുക്കണം</string>\n    <string name=\"msg_copied\">ക്ലിപ്ബോർഡിലേക്ക് പകർത്തി</string>\n    <string name=\"msg_wait\">കാത്തിരിക്കു…</string>\n    <string name=\"msg_running_detail\">വിശദാംശങ്ങൾക്കായി തൊടൂ</string>\n    <string name=\"msg_running\">ന്യൂപൈപ്പ് ഡൗൺലോഡിങ്ങ്</string>\n    <string name=\"msg_error\">പിശക്</string>\n    <string name=\"msg_threads\">ത്രെഡുകൾ</string>\n    <string name=\"msg_name\">ഫയൽനാമം</string>\n    <string name=\"ok\">ഓകെ</string>\n    <string name=\"rename\">പേരുമാറ്റുക</string>\n    <string name=\"dismiss\">പുറത്തള്ളുക</string>\n    <string name=\"checksum\">ചെക്ക്സം</string>\n    <string name=\"delete\">ഡിലീറ്റ്</string>\n    <string name=\"create\">നിർമിക്കുക</string>\n    <string name=\"pause\">വിരാമം</string>\n    <string name=\"start\">തുടങ്ങൂ</string>\n    <string name=\"no_comments\">നോ കമെന്റ്സ്</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s വീഡിയോ</item>\n        <item quantity=\"other\">%s വീഡിയോകൾ</item>\n    </plurals>\n    <string name=\"infinite_videos\">∞ വീഡിയോകൾ</string>\n    <string name=\"more_than_100_videos\">100+ വീഡിയോകൾ</string>\n    <string name=\"no_videos\">ഒരു വിഡിയോയും ഇല്ല</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s കേൾവിക്കാരൻ</item>\n        <item quantity=\"other\">%s കേൾവിക്കാർ</item>\n    </plurals>\n    <string name=\"no_one_listening\">ആരും കേൾക്കുന്നില്ല</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s കാണുന്നു</item>\n        <item quantity=\"other\">%s പേർ കാണുന്നു</item>\n    </plurals>\n    <string name=\"no_one_watching\">ആരും കാണുന്നില്ല</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s കാഴ്ച</item>\n        <item quantity=\"other\">%s കാഴ്ചകൾ</item>\n    </plurals>\n    <string name=\"no_views\">വ്യൂസ് ഇല്ല</string>\n    <string name=\"subscribers_count_not_available\">സബ്സ്ക്രൈബർ എണ്ണം ലഭ്യമല്ല</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s സബ്ക്രൈബർ</item>\n        <item quantity=\"other\">%s സബ്ക്രൈബറുകൾ</item>\n    </plurals>\n    <string name=\"no_subscribers\">സബ്ക്രൈബേഴ്സ് ഇല്ല</string>\n    <string name=\"drawer_header_description\">സേവനം മാറ്റുക, ഇപ്പോൾ തിരഞ്ഞെടുത്തത്:</string>\n    <string name=\"retry\">വീണ്ടും ശ്രമിക്കുക</string>\n    <string name=\"audio\">ഓഡിയോ</string>\n    <string name=\"video\">വീഡിയോ</string>\n    <string name=\"detail_drag_description\">പുനക്രമീകരിക്കാൻ വലിച്ചിടുക</string>\n    <string name=\"empty_list_subtitle\">നോക്കേണ്ടടാ ഉണ്ണി ഇവിടെ ഒന്നും ഇല്ല</string>\n    <string name=\"search_no_results\">ഫലങ്ങൾ ലഭ്യമല്ല</string>\n    <string name=\"detail_dislikes_img_view_description\">ഡിസ്ലൈക്കുകൾ</string>\n    <string name=\"detail_likes_img_view_description\">ലൈക്കുകൾ</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">അപ്‌ലോഡറുടെ ലഘുചിത്രം</string>\n    <string name=\"detail_thumbnail_view_description\">പ്ലേ വീഡിയോ, ദൈർഘ്യം:</string>\n    <string name=\"error_details_headline\">വിശദാംശങ്ങൾ:</string>\n    <string name=\"your_comment\">നിങ്ങളുടെ അഭിപ്രായം (ഇംഗ്ലീഷിൽ):</string>\n    <string name=\"what_happened_headline\">എന്ത് സംഭവിച്ചു:</string>\n    <string name=\"what_device_headline\">വിവരം:</string>\n    <string name=\"error_snackbar_action\">റിപ്പോർട്ട്</string>\n    <string name=\"error_snackbar_message\">ക്ഷമിക്കണം, ചില തകരാറുകൾ സംഭവിച്ചു.</string>\n    <string name=\"error_report_button_text\">ഇമെയിൽ വഴി ഈ പിശക് റിപ്പോർട്ട് ചെയ്യുക</string>\n    <string name=\"sorry_string\">ക്ഷമിക്കണം, അത് സംഭവിക്കാൻ പാടില്ലായിരുന്നു.</string>\n    <string name=\"permission_display_over_apps\">മറ്റ് ആപ്പുകളുടെ മുകളിൽ വരാനുളള അനുമതി നൽകുക</string>\n    <string name=\"restore_defaults_confirmation\">എല്ലാം പഴയപടി ആക്കട്ടെയോ\\?</string>\n    <string name=\"restore_defaults\">പഴയപടി എല്ലാം പുനസ്ഥാപിക്കുക</string>\n    <string name=\"saved_tabs_invalid_json\">സേവ് ആയ ടാബുകൾ വായിക്കാൻ സാധിക്കുന്നില്ല, സ്ഥിര ടാബുകൾ ഉപയോഗെടുത്തുക</string>\n    <string name=\"no_streams_available_download\">ഡൗൺലോഡ് ചെയ്യാൻ സ്‌ട്രീമുകൾ ലഭ്യമല്ല</string>\n    <string name=\"error_occurred_detail\">ഒരു പിശക് സംഭവിച്ചു: %1$s</string>\n    <string name=\"file_name_empty_error\">ഫയലിന്റെ പേര് ശൂന്യമാകാൻ പാടില്ല</string>\n    <string name=\"invalid_file\">ഒന്നിൽ അങ്ങനൊരു ഫയൽ ഇല്ല, അല്ലെങ്കിൽ അത് തുറക്കാനുള്ള അനുമതിയില്ല</string>\n    <string name=\"invalid_source\">അങ്ങനെയൊരു ഫയൽ/കന്റെന്റ് ഉറവിടം ഇല്ല</string>\n    <string name=\"invalid_directory\">അങ്ങനെയൊരു ഫോൾഡർ ഇല്ല</string>\n    <string name=\"missing_file\">ഫയൽ മാറ്റപ്പെടുകയോ ഡിലീറ്റ് ആവുകയോ ചെയ്തിട്ടുണ്ട്</string>\n    <string name=\"audio_streams_empty\">ഓഡിയോ സ്ട്രീമുകൾ കണ്ടെത്താനായില്ല</string>\n    <string name=\"video_streams_empty\">വീഡിയോ സ്ട്രീമുകൾ കണ്ടെത്താനായില്ല</string>\n    <string name=\"external_player_unsupported_link_type\">പുറമെയുള്ള പ്ലയേറുകൾ ഈ ലിങ്കുകൾ സപ്പോർട്ട് ചെയ്യുന്നില്ല</string>\n    <string name=\"player_recoverable_failure\">പിശകിൽ നിന്ന് വീണ്ടെടുക്കുന്നു</string>\n    <string name=\"player_unrecoverable_failure\">പ്ലെയറിൽ പിശക് സംഭവിച്ചു</string>\n    <string name=\"player_stream_failure\">ഈ സ്ട്രീം പ്ലേ ചെയ്യാൻ സാധിച്ചില്ല</string>\n    <string name=\"app_ui_crash\">ആപ് ക്രാഷായി</string>\n    <string name=\"could_not_setup_download_menu\">ഡൗൺലോഡ് മെനു തുറക്കാനായില്ല</string>\n    <string name=\"content_not_available\">കന്റെന്റ് ലഭ്യമല്ല</string>\n    <string name=\"parsing_error\">വെബ്സൈറ്റ് വ്യാപരിക്കാനായില്ല</string>\n    <string name=\"could_not_load_thumbnails\">ലഘുചിത്രങ്ങൾ ലോഡ് ചെയ്യാനായില്ല</string>\n    <string name=\"network_error\">നെറ്റ്‌വർക്ക് പിശക്</string>\n    <string name=\"download_to_sdcard_error_message\">എസ്ഡി കാർഡിലേക്ക്‌ ഡൗൺലോഡ് അസാധ്യം. ഡൗൺലോഡ് ഫോൾഡർ മാറ്റട്ടെ\\?</string>\n    <string name=\"download_to_sdcard_error_title\">എസ്ഡി സൗകര്യം ലഭ്യമല്ല</string>\n    <string name=\"general_error\">പിശക്</string>\n    <string name=\"search_history_deleted\">സെർച്ച് ചരിത്രം നീക്കം ചെയ്തു</string>\n    <string name=\"delete_search_history_alert\">സെർച്ച് ചരിത്രം നീക്കം ചെയ്യട്ടെയോ\\?</string>\n    <string name=\"clear_search_history_summary\">സെർച്ച് കീവേർഡുകളെ നീക്കം ചെയ്യും</string>\n    <string name=\"clear_search_history_title\">സെർച്ച് ചരിത്രം നീക്കം ചെയ്യുക</string>\n    <string name=\"watch_history_states_deleted\">പ്ലേബാക്ക് സ്ഥാനങ്ങൾ നീക്കംചെയ്തു</string>\n    <string name=\"delete_playback_states_alert\">പ്ലേബാക്ക് സ്ഥാനങ്ങളെ നീക്കം ചെയ്യട്ടെയോ\\?</string>\n    <string name=\"clear_playback_states_summary\">എല്ലാ പ്ലേബാക്ക് സ്ഥാനങ്ങളെയും നീക്കംചെയ്യും</string>\n    <string name=\"clear_playback_states_title\">പ്ലേബാക്ക് സ്ഥാനങ്ങൾ നീക്കംചെയ്യുക</string>\n    <string name=\"watch_history_deleted\">കാഴ്ച ചരിത്രം നീക്കംചെയ്തു</string>\n    <string name=\"delete_view_history_alert\">മൊത്തം കാഴ്ച ചരിത്രം നീക്കട്ടെയോ\\?</string>\n    <string name=\"clear_views_history_summary\">കണ്ട സ്ട്രീമുകളുടെയും പ്ലേബാക്ക് സ്ഥാനങ്ങളുടെയും ചരിത്രം നീക്കം ചെയ്യും</string>\n    <string name=\"clear_views_history_title\">കാഴ്ച ചരിത്രം നീക്കുക</string>\n    <string name=\"export_data_summary\">ചരിത്രം, സബ്സ്ക്രിബ്ഷനുകൾ, പ്ലേലിസ്റ്റുകൾ, സജ്ജീകരണങ്ങൾ എന്നിവ ഇറക്കുമതി ചെയ്യുക</string>\n    <string name=\"import_data_summary\">നിങ്ങളുടെ നിലവിലെ ചരിത്രം, സബ്‌സ്‌ക്രിപ്‌ഷനുകൾ, പ്ലേലിസ്റ്റുകൾ (ഓപ്‌ഷണലായി) ക്രമീകരണങ്ങൾ അസാധുവാക്കുന്നു</string>\n    <string name=\"export_data_title\">ഡാറ്റാബേസ് കയറ്റുമതി ചെയ്യുക</string>\n    <string name=\"import_data_title\">ഡാറ്റാബേസ് അവതരിപ്പിക്കുക</string>\n    <string name=\"accept\">അംഗീകരിക്കുക</string>\n    <string name=\"start_accept_privacy_policy\">യൂറോപ്യൻ ജനറൽ ഡാറ്റാ പ്രൊട്ടക്ഷൻ റെഗുലേഷൻ (ജിഡിപിആർ) അനുസരിക്കുന്നതിന്, ന്യൂപൈപ്പിന്റെ സ്വകാര്യതാ നയത്തിലേക്ക് ഞങ്ങൾ നിങ്ങളുടെ ശ്രദ്ധ ആകർഷിക്കുന്നു. ദയവായി ഇത് ശ്രദ്ധാപൂർവ്വം വായിക്കുക.\n\\nബഗ് റിപ്പോർട്ട് ഞങ്ങൾക്ക് അയയ്ക്കാൻ നിങ്ങൾ അത് അംഗീകരിക്കണം.</string>\n    <string name=\"switch_to_main\">പ്രധാനപ്പെട്ടതിലേക്ക് മാറുക</string>\n    <string name=\"switch_to_popup\">പോപ്പപ്പിലേക്ക് മാറുക</string>\n    <string name=\"switch_to_background\">ബാക്ക്ഗ്രൗണ്ടിലേക്ക്‌ മാറുക</string>\n    <string name=\"unknown_content\">[അജ്ഞാതം]</string>\n    <string name=\"app_update_notification_channel_description\">പുതിയ ന്യൂപൈപ്പ് പതിപ്പിന് വേണ്ടിയുള്ള അറിയിപ്പ്</string>\n    <string name=\"app_update_notification_channel_name\">ആപ്പ് അപ്ഡേറ്റ് ചെയ്യാനുള്ള അറിയിപ്പ്</string>\n    <string name=\"notification_channel_description\">ന്യൂപൈപ്പ് പ്ലേയറിന് വേണ്ടിയുള്ള അറിയിപ്പുകൾ</string>\n    <string name=\"notification_channel_name\">ന്യൂപൈപ്പ് അറിയിപ്പ്</string>\n    <string name=\"file\">ഫയൽ</string>\n    <string name=\"just_once\">ഒരിക്കൽ മാത്രം</string>\n    <string name=\"always\">എപ്പോഴും</string>\n    <string name=\"play_all\">എല്ലാം പ്ലേ ചെയ്യുക</string>\n    <string name=\"file_deleted\">ഫയൽ നശിപ്പിച്ചു</string>\n    <string name=\"undo\">പഴയപടി ആക്കുക</string>\n    <string name=\"best_resolution\">മികച്ച റിസല്യൂഷൻ</string>\n    <string name=\"clear\">തെളിക്കുക</string>\n    <string name=\"disabled\">അസാധുവാക്കപ്പെട്ടു</string>\n    <string name=\"artists\">കലാകാരന്മാർ</string>\n    <string name=\"albums\">ആൽബങ്ങൾ</string>\n    <string name=\"songs\">പാട്ടുകൾ</string>\n    <string name=\"events\">സംഭവങ്ങൾ</string>\n    <string name=\"users\">ഉപയോക്താക്കൾ</string>\n    <string name=\"tracks\">ട്രാക്കുകൾ</string>\n    <string name=\"videos_string\">വീഡിയോകൾ</string>\n    <string name=\"playlists\">പ്ലേലിസ്റ്റുകൾ</string>\n    <string name=\"channels\">ചാനലുകൾ</string>\n    <string name=\"all\">എല്ലാം</string>\n    <string name=\"error_report_title\">പിശക് റിപ്പോർട്ട്</string>\n    <string name=\"downloads_title\">ഡൗൺലോഡുകൾ</string>\n    <string name=\"downloads\">ഡൗൺലോഡുകൾ</string>\n    <string name=\"duration_live\">ലൈവ്</string>\n    <string name=\"restricted_video\">ഈ വീഡിയോ പ്രായപരിമിതി ഉള്ളതാണ്.\n\\n\n\\nനിങ്ങൾക്ക് ഇത് കാണണമെങ്കിൽ ക്രമീകരണങ്ങളിൽ \\\"%1$s\\\" ഓണാക്കുക.</string>\n    <string name=\"show_age_restricted_content_title\">പ്രായ നിയന്ത്രിത ഉള്ളടക്കം കാണിക്കുക</string>\n    <string name=\"content\">കന്റെന്റ്</string>\n    <string name=\"popup_playing_toast\">പോപ്പപ്പ് മോഡിൽ പ്ലേ ചെയ്യുന്നു</string>\n    <string name=\"background_player_playing_toast\">പശ്ചാത്തലത്തിൽ പ്ലേ ചെയ്യുന്നു</string>\n    <string name=\"settings_category_updates_title\">അപ്ഡേറ്റുകൾ</string>\n    <string name=\"settings_category_debug_title\">ഡീബഗ്</string>\n    <string name=\"settings_category_appearance_title\">രൂപഭംഗി</string>\n    <string name=\"settings_category_history_title\">ചരിത്രവും കാഷെയും</string>\n    <string name=\"settings_category_video_audio_title\">വീഡിയോയും ഓഡിയോയും</string>\n    <string name=\"settings_category_player_behavior_title\">സ്വഭാവം</string>\n    <string name=\"settings_category_player_title\">പ്ലെയർ</string>\n    <string name=\"peertube_instance_add_exists\">സന്ദർഭം നേരത്തെ നിലവിലുണ്ട്</string>\n    <string name=\"peertube_instance_add_https_only\">HTTPS URL കൾ മാത്രമേ പിന്തുണക്കുകയുള്ളൂ</string>\n    <string name=\"peertube_instance_add_fail\">സന്ദർഭം സാധൂകരിക്കാൻ സാധിച്ചില്ല</string>\n    <string name=\"peertube_instance_add_help\">സന്ദർഭത്തിന്റെ URL കൂട്ടിച്ചേർക്കുക</string>\n    <string name=\"peertube_instance_add_title\">സന്ദർഭം ചേർക്കുക</string>\n    <string name=\"peertube_instance_url_help\">%s-ൽ നിങ്ങൾ ഇഷ്ടപ്പെടുന്ന സന്ദർഭങ്ങളെ കണ്ടെത്തുക</string>\n    <string name=\"peertube_instance_url_summary\">നിങ്ങളുടെ പ്രിയപ്പെട്ട പിയർട്യൂബ് സന്ദർഭങ്ങളെ തിരഞ്ഞെടുക്കുക</string>\n    <string name=\"peertube_instance_url_title\">പിയർട്യൂബ് സന്ദർഭങ്ങൾ</string>\n    <string name=\"content_language_title\">സ്ഥിര കന്റെന്റ്‌ ഭാഷ</string>\n    <string name=\"default_content_country_title\">സ്ഥിര കന്റെന്റ് രാജ്യം</string>\n    <string name=\"unsupported_url\">അനുയോജ്യമല്ലാത്ത URL</string>\n    <string name=\"show_hold_to_append_summary\">പോപ്പപ്പ്/ബാക്ക്ഗ്രൗണ്ട് ബട്ടൺ അമർത്തുമ്പോൾ \\\"വിശദാംശങ്ങൾ\\\" എന്ന ടിപ് കാണിക്കും</string>\n    <string name=\"show_hold_to_append_title\">\\\"ക്യൂവിൽ കയറ്റാൻ പിടിക്കുക\\\" എന്ന ടിപ് കാണിക്കുക</string>\n    <string name=\"show_next_and_similar_title\">\\'അടുത്ത\\' , \\'സമാനമായ\\' വീഡിയോകൾ കാണിക്കുക</string>\n    <string name=\"autoplay_title\">ഓട്ടോപ്ലേ</string>\n    <string name=\"download_dialog_title\">ഡൗൺലോഡ്</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">തടസങ്ങൾക്ക് ശേഷം പ്ലേ ചെയ്യുന്നത് തുടരുക (eg. ഫോൺകോളുകൾക്ക് ശേഷം)</string>\n    <string name=\"resume_on_audio_focus_gain_title\">പ്ലേ ചെയ്യുന്നത് തുടരുക</string>\n    <string name=\"enable_watch_history_summary\">കണ്ട വീഡിയോകളുടെ വിവരം സൂക്ഷിക്കുക</string>\n    <string name=\"settings_category_clear_data_title\">ഡേറ്റ നീക്കം ചെയ്യുക</string>\n    <string name=\"enable_playback_state_lists_summary\">പ്ലേബാക്ക് സ്ഥാനങ്ങൾ ലിസ്റ്റിൽ കാണിക്കുക</string>\n    <string name=\"enable_playback_state_lists_title\">സ്ഥാനങ്ങൾ ലിസ്റ്റിൽ</string>\n    <string name=\"enable_playback_resume_summary\">അവസാനത്തെ പ്ലേബാക്ക് സ്ഥാനം പുനസ്ഥാപിക്കുക</string>\n    <string name=\"enable_playback_resume_title\">പ്ലേബാക്ക് തുടരുക</string>\n    <string name=\"enable_watch_history_title\">കാഴ്ച ചരിത്രം</string>\n    <string name=\"enable_search_history_summary\">സെർച്ചുകൾ ഫോണിൽ സൂക്ഷിക്കുക</string>\n    <string name=\"enable_search_history_title\">അന്വേഷണ ചരിത്രം</string>\n    <string name=\"show_search_suggestions_summary\">സെർച്ച് ചെയ്യുമ്പോൾ നിർദ്ദേശങ്ങൾ തിരഞ്ഞെടുക്കുക</string>\n    <string name=\"show_search_suggestions_title\">സെർച്ച് നിർദ്ദേശങ്ങൾ</string>\n    <string name=\"auto_queue_summary\">തീരാറായ പ്ലേബാക്ക് ക്യൂവിനെ മറ്റൊരു അനുബന്ധ സ്‌ട്രീമുമായി കൂട്ടിച്ചേർത്ത് തുടരുക</string>\n    <string name=\"auto_queue_title\">അടുത്ത സ്ട്രീം ഓട്ടോക്യൂ ചെയ്യുക</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി</string>\n    <string name=\"metadata_cache_wipe_summary\">കാഷെ ആയ ഡേറ്റ നീക്കംചെയ്യുക</string>\n    <string name=\"metadata_cache_wipe_title\">കാഷെ ആയ മെറ്റാഡേറ്റ തുടച്ചുനീക്കി</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">ഇമേജ് കാചെ തുടച്ചുമാറ്റി</string>\n    <string name=\"show_comments_summary\">കമന്റുകൾ മറയ്ക്കാനായി ഓഫ് ചെയ്യുക</string>\n    <string name=\"show_comments_title\">കമന്റുകൾ കാണിക്കുക</string>\n    <string name=\"seek_duration_title\">ഫാസ്റ്റ്-ഫോർവേർഡ്/റീവൈൻഡ് സമയദൈർഘ്യം</string>\n    <string name=\"use_inexact_seek_title\">Inexact seek ഉപയോഗിക്കുക</string>\n    <string name=\"use_inexact_seek_summary\">കുറഞ്ഞ കൃത്യതയോടെ സീക് ചെയ്യാൻ ഇൻ എക്സക്ട് സഹായിക്കുന്നു. 5,15,25 സെക്കൻഡ് സീക്‌ ഈ മോഡിൽ പ്രവർത്തിക്കുകയില്ല</string>\n    <string name=\"popup_remember_size_pos_summary\">പോപ്പപ്പിന്റെ അവസാന വലുപ്പവും സ്ഥാനവും ഓർത്തിരിക്കുക</string>\n    <string name=\"popup_remember_size_pos_title\">പോപ്പപ്പ് വലുപ്പവും സ്ഥാനവും ഓർത്തിരിക്കുക</string>\n    <string name=\"black_theme_title\">കറുപ്പ് തീം</string>\n    <string name=\"dark_theme_title\">ഡാർക്ക് തീം</string>\n    <string name=\"light_theme_title\">ലൈറ്റ് തീം</string>\n    <string name=\"theme_title\">തീം</string>\n    <string name=\"default_video_format_title\">സ്ഥിര വീഡിയോ ഫോർമാറ്റ്</string>\n    <string name=\"default_audio_format_title\">സ്ഥിര ഓഡിയോ ഫോർമാറ്റ്</string>\n    <string name=\"play_audio\">ഓഡിയോ</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi media center വഴി വീഡിയോ പ്ലേ ചെയ്യാനുള്ള ഓപ്ഷൻ കാണിക്കുക</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi ഉപയോഗിച്ച് പ്ലേ ചെയ്യുക\\\" ഓപ്ഷൻ കാണിക്കുക</string>\n    <string name=\"kore_not_found\">Kore ഇൻസ്റ്റാൾ ചെയ്യട്ടെയോ\\?</string>\n    <string name=\"play_with_kodi_title\">Kodi ഉപയോഗിച്ച് പ്ലേ ചെയ്യുക</string>\n    <string name=\"show_higher_resolutions_summary\">ചില ഉപകരണങ്ങളിൽ മാത്രമേ 2K/4K വീഡിയോകൾ കാണാൻ സാധിക്കുകയുള്ളൂ</string>\n    <string name=\"show_higher_resolutions_title\">ഉയർന്ന റിസല്യൂഷനുകൾ കാണിക്കുക</string>\n    <string name=\"default_popup_resolution_title\">സ്ഥിര പോപ്പപ്പ് റിസല്യൂഷൻ</string>\n    <string name=\"default_resolution_title\">സ്ഥിര റിസല്യൂഷൻ</string>\n    <string name=\"download_path_audio_dialog_title\">ഓഡിയോ ഫയലുകളുടെ ഡൗൺലോഡ് സ്ഥാനം</string>\n    <string name=\"download_path_audio_summary\">ഡൗൺലോഡ് ചെയ്ത പാട്ടുകൾ ഇവിടെ കാണാം</string>\n    <string name=\"download_path_audio_title\">പാട്ട് ഡൗൺലോഡ് ഫോൾഡർ</string>\n    <string name=\"download_path_dialog_title\">വീഡിയോയ്ക്കായി ഡൗൺലോഡ് ഫോൾഡർ തിരഞ്ഞെടുക്കുക</string>\n    <string name=\"download_path_summary\">ഡൗൺലോഡ് ചെയ്യപ്പെട്ട ഫയലുകൾ ഇവിടെ കാണും</string>\n    <string name=\"download_path_title\">വീഡിയോ ഡൗൺലോഡ് ആവുന്ന ഫോൾഡർ</string>\n    <string name=\"controls_add_to_playlist_title\">ചേർക്കുക</string>\n    <string name=\"controls_popup_title\">പോപ്പപ്പ്</string>\n    <string name=\"controls_background_title\">പശ്ചാത്തലത്തിൽ</string>\n    <string name=\"tab_choose\">ടാബ് തിരഞ്ഞെടുക്കുക</string>\n    <string name=\"tab_bookmarks\">പ്രധാനപ്പെട്ട പ്ലേലിസ്റ്റുകൾ</string>\n    <string name=\"tab_subscriptions\">സബ്ക്രിപ്ഷനുകൾ</string>\n    <string name=\"show_info\">വിവരം കാണിക്കുക</string>\n    <string name=\"subscription_update_failed\">സബ്സ്ക്രിബ്ഷൻ അപ്ഡേറ്റ് ചെയ്യാനായില്ല</string>\n    <string name=\"subscription_change_failed\">സബ്സ്ക്രിബ്ഷൻ മാറ്റാനായില്ല</string>\n    <string name=\"channel_unsubscribed\">ചാനൽ അൺസബ്സ്ക്രൈബ് ചെയ്യപ്പെട്ടു</string>\n    <string name=\"unsubscribe\">അൺസബ്സ്ക്രൈബ്</string>\n    <string name=\"subscribed_button_title\">സബ്സ്ക്രൈബായി</string>\n    <string name=\"subscribe_button_title\">സബ്സ്ക്രൈബ്</string>\n    <string name=\"use_external_audio_player_title\">പുറമെയുള്ള ഓഡിയോ പ്ലേയർ ഉപയോഗിക്കുക</string>\n    <string name=\"use_external_video_player_summary\">ചില റിസല്യൂഷനുകളിൽ ശബ്ദം കേൾക്കില്ല</string>\n    <string name=\"use_external_video_player_title\">പുറമെയുള്ള വീഡിയോ പ്ലേയർ ഉപയോഗിക്കുക</string>\n    <string name=\"share_dialog_title\">പങ്കുവയ്ക്കൂ</string>\n    <string name=\"did_you_mean\">തങ്കൾ ഉദ്ദേശിച്ചത് : \\\"%1$s\\\" ആണോ\\?</string>\n    <string name=\"settings\">ക്രമീകരണങ്ങൾ</string>\n    <string name=\"search\">തിരയുക</string>\n    <string name=\"controls_download_desc\">സ്ട്രീം ഫൈൽ ഡൗൺലോഡ് ചെയ്യുക</string>\n    <string name=\"download\">ഡൗൺലോഡ്</string>\n    <string name=\"share\">പങ്കുവെയ്ക്കുക</string>\n    <string name=\"open_in_popup_mode\">പൊന്തി വരുന്ന മോഡിൽ തുറക്കുക</string>\n    <string name=\"open_in_browser\">ബ്രൗസറിൽ തുറക്കുക</string>\n    <string name=\"cancel\">റദ്ദാക്കുക</string>\n    <string name=\"install\">ഇൻസ്റ്റാൾ</string>\n    <string name=\"no_player_found_toast\">സ്ട്രീം പ്ലയർ കണ്ടെത്താനായില്ല (VLC ഇൻസ്റ്റാൾ ചെയ്താൽ പ്ലേ ചെയ്യാനാകും).</string>\n    <string name=\"no_player_found\">സ്ട്രീം പ്ലയർ കണ്ടെത്താനായില്ല. VLC ഇൻസ്റ്റാൾ ചെയ്യട്ടെ\\?</string>\n    <string name=\"upload_date_text\">%1$s - ന് പ്രസിദ്ധീകരിച്ചു</string>\n    <string name=\"main_bg_subtitle\">തുടങ്ങാൻ \\\"തിരയൽ\\\" അമർത്തുക.</string>\n    <string name=\"content_not_supported\">ഈ ഉള്ളടക്കത്തെ ഇതുവരെ ന്യൂ‌പൈപ്പ് പിന്തുണയ്‌ക്കുന്നില്ല.\n\\n\n\\nഭാവിയിലെ ഒരു പതിപ്പിൽ ഇത് പിന്തുണയ്‌ക്കുമെന്ന് പ്രതീക്ഷിക്കുന്നു.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">ഫീഡ് ലോഡിംഗ് വളരെ മന്ദഗതിയിലാണെന്ന് നിങ്ങൾ കരുതുന്നുണ്ടോ\\? അങ്ങനെയാണെങ്കിൽ, വേഗത്തിലുള്ള ലോഡിംഗ് പ്രവർത്തനക്ഷമമാക്കാൻ ശ്രമിക്കുക (നിങ്ങൾക്ക് ഇത് ക്രമീകരണങ്ങളിലോ ചുവടെയുള്ള ബട്ടൺ അമർത്തിയോ മാറ്റാം).\n\\n\n\\nന്യൂപൈപ്പ് രണ്ട് ഫീഡ് ലോഡിംഗ് തന്ത്രങ്ങൾ വാഗ്ദാനം ചെയ്യുന്നു:\n\\nSlow സബ്‌സ്‌ക്രിപ്‌ഷൻ ചാനൽ മുഴുവനും ലഭ്യമാക്കുന്നു, അത് മന്ദഗതിയിലുള്ളതും എന്നാൽ പൂർണ്ണവുമാണ്.\n\\nA ഒരു സമർപ്പിത സേവന എൻ‌ഡ്‌പോയിൻറ് ഉപയോഗിക്കുന്നു, അത് വേഗതയേറിയതും എന്നാൽ സാധാരണയായി പൂർത്തിയാകാത്തതുമാണ്.\n\\n\n\\nരണ്ടും തമ്മിലുള്ള വ്യത്യാസം, വേഗതയേറിയവയ്ക്ക് സാധാരണയായി ഇനത്തിന്റെ ദൈർഘ്യം അല്ലെങ്കിൽ തരം (തത്സമയ വീഡിയോകളും സാധാരണ വീഡിയോകളും തമ്മിൽ വേർതിരിച്ചറിയാൻ കഴിയില്ല) പോലുള്ള ചില വിവരങ്ങൾ ഇല്ല എന്നതാണ്, മാത്രമല്ല ഇത് കുറച്ച് ഇനങ്ങൾ തിരികെ നൽകിയേക്കാം.\n\\n\n\\nRSS ഫീഡിനൊപ്പം ഈ വേഗത്തിലുള്ള രീതി വാഗ്ദാനം ചെയ്യുന്ന ഒരു സേവനത്തിന്റെ ഉദാഹരണമാണ് YouTube.\n\\n\n\\nഅതിനാൽ ചോയ്‌സ് നിങ്ങൾ ഇഷ്ടപ്പെടുന്നതിലേക്ക് തിളച്ചുമറിയുന്നു: വേഗത അല്ലെങ്കിൽ കൃത്യമായ വിവരങ്ങൾ.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">ഫാസ്റ്റ് മോഡ് അപ്രാപ്തമാക്കുക</string>\n    <string name=\"enqueue\">ക്യൂ</string>\n    <string name=\"recovering\">വീണ്ടെടുക്കുന്നു</string>\n    <string name=\"post_processing\">പോസ്റ്റ്-പ്രോസസ്സിംഗ്</string>\n    <string name=\"queued\">ക്യൂവിൽ</string>\n    <string name=\"paused\">താൽക്കാലികമായി നിർത്തി</string>\n    <string name=\"missions_header_pending\">ശേഷിക്കുന്നു</string>\n    <string name=\"missions_header_finished\">പൂർത്തിയായി</string>\n    <string name=\"app_update_available_notification_title\">ന്യൂപൈപ്പ് അപ്‌ഡേറ്റ് ലഭ്യമാണ്!</string>\n    <string name=\"auto\">ഓട്ടോ</string>\n    <string name=\"grid\">ഗ്രിഡ്</string>\n    <string name=\"list\">ലിസ്റ്റ്</string>\n    <string name=\"list_view_mode\">പട്ടിക കാഴ്ച മോഡ്</string>\n    <string name=\"minimize_on_exit_popup_description\">പോപ്പ്അപ്പ് പ്ലെയറിലേക്ക് ചെറുതാക്കുക</string>\n    <string name=\"minimize_on_exit_background_description\">പശ്ചാത്തല പ്ലെയറിലേക്ക് ചെറുതാക്കുക</string>\n    <string name=\"minimize_on_exit_none_description\">ഒന്നുമില്ല</string>\n    <string name=\"minimize_on_exit_summary\">പ്രധാന വീഡിയോ പ്ലെയറിൽ നിന്ന് മറ്റ് അപ്ലിക്കേഷനിലേക്ക് മാറുമ്പോഴുള്ള പ്രവർത്തനം — %s</string>\n    <string name=\"minimize_on_exit_title\">ആപ് മാറ്റുമ്പോൾ മിനിമൈസ് ചെയ്യുക</string>\n    <string name=\"updates_setting_description\">ഒരു പുതിയ പതിപ്പ് ലഭ്യമാകുമ്പോൾ അപ്ലിക്കേഷൻ അപ്‌ഡേറ്റ് ആവശ്യപ്പെടുന്നതിന് ഒരു അറിയിപ്പ് കാണിക്കുക</string>\n    <string name=\"updates_setting_title\">അപ്ഡേറ്റുകൾ</string>\n    <string name=\"limit_mobile_data_usage_title\">മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കുമ്പോൾ മിഴിവ് പരിമിതപ്പെടുത്തുക</string>\n    <string name=\"limit_data_usage_none_description\">പരിധിയില്ല</string>\n    <string name=\"decline\">നിരസിക്കുക</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">വേഗത്തിലുള്ള മോഡ് പ്രവർത്തനക്ഷമമാക്കുക</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">ചില സേവനങ്ങളിൽ ലഭ്യമാണ്, ഇത് സാധാരണയായി വളരെ വേഗതയുള്ളതാണ്, പക്ഷേ പരിമിതമായ അളവിലുള്ള ഇനങ്ങളും പലപ്പോഴും അപൂർണ്ണമായ വിവരങ്ങളും നൽകാം (ഉദാ. ദൈർഘ്യം, ഇന തരം, തത്സമയ നിലയില്ല)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">ലഭ്യമാകുമ്പോൾ സമർപ്പിത ഫീഡിൽ നിന്ന് നേടുക</string>\n    <string name=\"feed_update_threshold_option_always_update\">എപ്പോഴും അപ്‌ഡേറ്റുചെയ്യുക</string>\n    <string name=\"feed_update_threshold_summary\">ഒരു സബ്സ്ക്രിപ്ഷൻ കാലഹരണപ്പെട്ടതായി കണക്കാക്കുന്നതിന് മുമ്പുള്ള അവസാന അപ്‌ഡേറ്റിന് ശേഷമുള്ള സമയം — %s</string>\n    <string name=\"feed_update_threshold_title\">ഫീഡ് അപ്‌ഡേറ്റ് പരിധി</string>\n    <string name=\"settings_category_feed_title\">ഫീഡ്</string>\n    <string name=\"feed_create_new_group_button_title\">പുതിയത്</string>\n    <string name=\"feed_group_dialog_delete_message\">ഈ ഗ്രൂപ്പ് ഇല്ലാതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">ശൂന്യമായ ഗ്രൂപ്പ് പേര്</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d തിരഞ്ഞെടുത്തു</item>\n        <item quantity=\"other\">%d തെരഞ്ഞെടുത്തു</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">സബ്‌സ്‌ക്രിപ്‌ഷനുകളൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">സബ്‌സ്‌ക്രിപ്‌ഷനുകൾ തിരഞ്ഞെടുക്കുക</string>\n    <string name=\"feed_processing_message\">ഫീഡ് പ്രോസസ്സ് ചെയ്യുന്നു…</string>\n    <string name=\"feed_notification_loading\">ഫീഡ് ലോഡുചെയ്യുന്നു…</string>\n    <string name=\"feed_subscription_not_loaded_count\">ലോഡ് ആവാത്തത്: %d</string>\n    <string name=\"feed_oldest_subscription_update\">അവസാനം അപ്‌ഡേറ്റുചെയ്‌ത ഫീഡ്: %s</string>\n    <string name=\"feed_groups_header_title\">ചാനൽ ഗ്രൂപ്പുകൾ</string>\n    <string name=\"fragment_feed_title\">പുതിയതെന്താണ്</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d ദിവസം</item>\n        <item quantity=\"other\">%d ദിവസങ്ങൾ</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d മണിക്കൂർ</item>\n        <item quantity=\"other\">%d മണിക്കൂറുകൾ</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d മിനിറ്റ്</item>\n        <item quantity=\"other\">%d മിനിറ്റുകൾ</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d സെക്കൻഡ്</item>\n        <item quantity=\"other\">%d സെക്കൻഡുകൾ</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">എക്സോപ്ലെയർ പരിമിതികൾ കാരണം തിരയൽ ദൈർഘ്യം %d സെക്കൻഡിലേക്ക് സജ്ജമാക്കി</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">അതെ, അതിന്റെകൂടെ ഭാഗികമായി കണ്ട വീഡിയോകളും</string>\n    <string name=\"remove_watched_popup_warning\">പ്ലേലിസ്റ്റിലേക്ക് ചേർക്കുന്നതിന് മുമ്പും ശേഷവും കണ്ട വീഡിയോകൾ നീക്കംചെയ്യും. \\nനിങ്ങൾക്ക് ഉറപ്പാണോ? ഇത് പഴയപടിയാക്കാൻ കഴിയില്ല!</string>\n    <string name=\"remove_watched_popup_title\">കണ്ട വീഡിയോകൾ നീക്കംചെയ്യണോ?</string>\n    <string name=\"remove_watched\">കണ്ടത് നീക്കംചെയ്യുക</string>\n    <string name=\"systems_language\">സിസ്റ്റം ഡിഫോൾട്ട്</string>\n    <string name=\"app_language_title\">അപ്ലിക്കേഷൻ ഭാഷ</string>\n    <string name=\"choose_instance_prompt\">ഒരു സ്ഥിതി തിരഞ്ഞെടുക്കുക</string>\n    <string name=\"downloads_storage_use_saf_summary\">സ്റ്റോറേജ് ആക്സസ് ഫ്രെയിംവർക്ക്\\' ഒരു ബാഹ്യ SD കാർഡിലേക്ക് ഡൗൺലോഡുകൾ അനുവദിക്കുന്നു</string>\n    <string name=\"downloads_storage_use_saf_title\">സിസ്റ്റം ഫോൾഡർ പിക്കർ (SAF) ഉപയോഗിക്കുക</string>\n    <string name=\"downloads_storage_ask_summary\">ഓരോ ഡൗൺ‌ലോഡും എവിടെ സംരക്ഷിക്കണമെന്ന് നിങ്ങളോട് ചോദിക്കും.\n\\nതാങ്കൾക്ക് എക്സ്റ്റർനെൽ SD കാർഡിലേക് ഡൌൺലോഡ് ചെയ്യണം എന്ന് ഉണ്ടെങ്കിൽ സിസ്റ്റം ഫോൾഡർ പിക്കർ (SAF) സജ്ജമാക്കുക</string>\n    <string name=\"downloads_storage_ask_title\">എവിടെ നിന്ന് ഡൗൺലോഡ് ചെയ്യണമെന്ന് ചോദിക്കുക</string>\n    <string name=\"pause_downloads\">ഡൗൺലോഡുകൾ താൽക്കാലികമായി നിർത്തുക</string>\n    <string name=\"start_downloads\">ഡൗൺലോഡുകൾ ആരംഭിക്കുക</string>\n    <string name=\"enable_queue_limit_desc\">ഒരു ഡൗൺ‌ലോഡ് ഒരേ സമയം പ്രവർത്തിക്കും</string>\n    <string name=\"enable_queue_limit\">ഡൗൺലോഡ് ക്യൂ പരിമിതപ്പെടുത്തുക</string>\n    <string name=\"close\">അടയ്‌ക്കുക</string>\n    <string name=\"pause_downloads_on_mobile_desc\">ചില ഡൗൺ‌ലോഡുകൾ‌ താൽ‌ക്കാലികമായി നിർ‌ത്താൻ‌ കഴിയില്ലെങ്കിലും മൊബൈൽ‌ ഡാറ്റയിലേക്ക് മാറുമ്പോൾ‌ ഉപയോഗപ്രദമാണ്</string>\n    <string name=\"pause_downloads_on_mobile\">മീറ്റർ ചെയ്ത നെറ്റ്‌വർക്കുകളിൽ തടസ്സപ്പെടുത്തുക</string>\n    <string name=\"max_retry_desc\">ഡൗൺലോഡ് റദ്ദാക്കുന്നതിനുമുമ്പ് പരമാവധി ശ്രമങ്ങൾ</string>\n    <string name=\"max_retry_msg\">പരമാവധി വീണ്ടും ശ്രമിക്കുന്നു</string>\n    <string name=\"stop\">നിർത്തുക</string>\n    <string name=\"delete_downloaded_files\">ഡൗൺലോഡ് ചെയ്ത ഫയലുകൾ ഇല്ലാതാക്കുക</string>\n    <string name=\"confirm_prompt\">നിങ്ങളുടെ ഡൗൺലോഡ് ചരിത്രം മായ്‌ക്കണോ ഡൗൺലോഡ് ചെയ്ത എല്ലാ ഫയലുകളും ഇല്ലാതാക്കണോ\\?</string>\n    <string name=\"clear_download_history\">ഡൗൺലോഡ് ചരിത്രം മായ്‌ക്കുക</string>\n    <string name=\"error_download_resource_gone\">ഈ ഡൗൺലോഡ് വീണ്ടെടുക്കാനാവില്ല</string>\n    <string name=\"error_timeout\">കണക്ഷൻ കാലഹരണപ്പെട്ടു</string>\n    <string name=\"error_progress_lost\">ഫയൽ ഇല്ലാതാക്കിയതിനാൽ പുരോഗതി നഷ്‌ടപ്പെട്ടു</string>\n    <string name=\"error_insufficient_storage_left\">ഉപകരണത്തിൽ ഇനിയൊരു സ്ഥലവും ബാക്കിയില്ല</string>\n    <string name=\"error_postprocessing_stopped\">ഫയലിൽ പ്രവർത്തിക്കുമ്പോൾ ന്യൂപൈപ്പ് അടച്ചു</string>\n    <string name=\"error_postprocessing_failed\">പോസ്റ്റ്-പ്രോസസ്സിംഗ് പരാജയപ്പെട്ടു</string>\n    <string name=\"error_http_not_found\">കണ്ടെത്താനായില്ല</string>\n    <string name=\"error_http_unsupported_range\">മൾട്ടി-ത്രെഡഡ് ഡൗൺലോഡുകൾ‌ സെർ‌വർ‌ സ്വീകരിക്കുന്നില്ല, വീണ്ടും ശ്രമിക്കുക @string/msg_threads = 1</string>\n    <string name=\"error_http_no_content\">സെർവർ ഡാറ്റ അയയ്‌ക്കുന്നില്ല</string>\n    <string name=\"error_connect_host\">സെർവറിലേക്ക് ബന്ധിപ്പിക്കാൻ കഴിയില്ല</string>\n    <string name=\"error_unknown_host\">സെർവർ കണ്ടെത്താനായില്ല</string>\n    <string name=\"error_ssl_exception\">ഒരു സുരക്ഷിത കണക്ഷൻ സ്ഥാപിക്കാനായില്ല</string>\n    <string name=\"error_path_creation\">ഉദ്ദിഷ്ടസ്ഥാന ഫോൾഡർ സൃഷ്ടിക്കാൻ കഴിയില്ല</string>\n    <string name=\"error_file_creation\">ഫയൽ സൃഷ്ടിക്കാൻ കഴിയില്ല</string>\n    <string name=\"show_error\">പിശക് കാണിക്കൂ</string>\n    <string name=\"download_already_pending\">ഈ പേരിൽ ഡൗൺ‌ലോഡ് തീരാത്ത ഒരു ഫയൽ ഉണ്ട്</string>\n    <string name=\"download_already_running\">ഈ പേരിൽ ഒരു ഡൗൺ‌ലോഡ് പുരോഗതിയിലാണ്</string>\n    <string name=\"overwrite_failed\">ഫയൽ പുനരാലേഖനം ചെയ്യാൻ കഴിയില്ല</string>\n    <string name=\"overwrite_finished_warning\">ഈ പേരിൽ ഒരു ഡൗൺ‌ലോഡുചെയ്‌ത ഫയൽ ഇതിനകം നിലവിലുണ്ട്</string>\n    <string name=\"overwrite_unrelated_warning\">ഈ പേരിലുള്ള ഒരു ഫയൽ ഇതിനകം നിലവിലുണ്ട്</string>\n    <string name=\"overwrite\">തിരുത്തിയെഴുതുക</string>\n    <string name=\"generate_unique_name\">അദ്വിതീയ നാമം സൃഷ്ടിക്കുക</string>\n    <string name=\"download_failed\">ഡൗൺലോഡ് പരാജയപ്പെട്ടു</string>\n    <string name=\"permission_denied\">സിസ്റ്റം പ്രവർത്തനം തടഞ്ഞു</string>\n    <string name=\"video_detail_by\">%s മുഖാന്തരം</string>\n    <string name=\"channel_created_by\">%s സൃഷ്ടിച്ചത്</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">ചാനൽ ലഘുചിത്രം</string>\n    <string name=\"show_original_time_ago_summary\">സേവനങ്ങളിൽ നിന്നുള്ള യഥാർത്ഥ വാചകങ്ങൾ സ്ട്രീം ഇനങ്ങളിൽ ദൃശ്യമാകും</string>\n    <string name=\"show_original_time_ago_title\">ഇനങ്ങളിൽ യഥാർത്ഥ സമയം മുമ്പ് കാണിക്കുക</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTube- ന്റെ \\\"നിയന്ത്രിത മോഡ്\\\" ഓണാക്കുക</string>\n    <string name=\"search_showing_result_for\">ഇതിനായുള്ള ഫലങ്ങൾ കാണിക്കുന്നു: %s</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">ഗ്രൂപ്പുചെയ്യാത്ത സബ്‌സ്‌ക്രിപ്‌ഷനുകൾ മാത്രം കാണിക്കുക</string>\n    <string name=\"no_playlist_bookmarked_yet\">ഇതുവരെ ഒരു പ്ലേലിസ്റ്റ് ബുക്ക്മാർക്കുകളും ഇല്ല</string>\n    <string name=\"select_a_playlist\">ഒരു പ്ലേലിസ്റ്റ് തിരഞ്ഞെടുക്കുക</string>\n    <string name=\"error_report_open_github_notice\">നിങ്ങളുടെ ക്രാഷ് ചർച്ച ചെയ്യുന്ന ഒരു പ്രശ്നം ഇതിനകം നിലവിലുണ്ടോയെന്ന് ദയവായി പരിശോധിക്കുക. തനിപ്പകർപ്പ് ആയ ടിക്കറ്റുകള്‍ സൃഷ്ടിക്കുമ്പോൾ, യഥാർത്ഥ ബഗ് പരിഹരിക്കുവാന്‍ വേണ്ടി ഞങ്ങ‍ള്‍ക്ക് ചെലവഴിക്കാൻ കഴിയുമായിരുന്ന സമയം നിങ്ങൾ ഞങ്ങളിൽ നിന്ന് എടുക്കുകയാണ് ചെയ്യുന്നത്.</string>\n    <string name=\"copy_for_github\">ഫോർമാറ്റുചെയ്‌ത റിപ്പോർട്ട് പകർത്തുക</string>\n    <string name=\"playlist_page_summary\">പ്ലേലിസ്റ്റ് പേജ്</string>\n    <string name=\"error_report_open_issue_button_text\">GitHub- ൽ റിപ്പോർട്ട് ചെയ്യുക</string>\n    <string name=\"notification_scale_to_square_image_title\">ലഘുചിത്രം 1: 1 വീക്ഷണാനുപാതത്തിലേക്ക് ക്രോപ് ചെയ്യുക</string>\n    <string name=\"notification_colorize_summary\">വീഡിയോ കവർ ചിത്രത്തിന്റെ പ്രധാന നിറത്തിന് അനുസരിച്ചു നോട്ടിഫിക്കേഷന്റെ കളർ മാറ്റാൻ ആൻഡ്രോയ്ഡിനെ അനുവദിക്കുക (ഇത് എല്ലാം ഉപകരണങ്ങളിലും ലഭ്യമല്ല )</string>\n    <string name=\"notification_colorize_title\">നോട്ടിഫിക്കേഷൻ വർണ്ണാഭമാകുക</string>\n    <string name=\"notification_action_nothing\">ഒന്നുമില്ല</string>\n    <string name=\"notification_action_shuffle\">ക്രമരഹിതം</string>\n    <string name=\"notification_action_repeat\">ആവർത്തിക്കുക</string>\n    <string name=\"notification_actions_at_most_three\">കോം‌പാക്റ്റ് അറിയിപ്പിൽ‌ കാണിക്കുന്നതിന് നിങ്ങൾക്ക് പരമാവധി മൂന്ന് പ്രവർ‌ത്തനങ്ങൾ‌ തിരഞ്ഞെടുക്കാനാകും!</string>\n    <string name=\"open_with\">ഇതിനോടൊപ്പം തുറക്കുക</string>\n    <string name=\"notification_scale_to_square_image_summary\">നോട്ടിഫിക്കേഷനിൽ കാണിക്കുന്ന വീഡിയോ കവർ ചിത്രം 16:9 എന്ന അനുപാതത്തിൽ നിന്നും 1:1 ലേക്ക് ക്രോപ് ചെയ്യുക</string>\n    <string name=\"download_has_started\">ഡൗൺലോഡ് ആരംഭിച്ചു</string>\n    <string name=\"select_night_theme_toast\">ചുവടെ നിങ്ങളുടെ പ്രിയപ്പെട്ട രാത്രി തീം തിരഞ്ഞെടുക്കാം</string>\n    <string name=\"night_theme_summary\">നിങ്ങളുടെ പ്രിയപ്പെട്ട രാത്രി തീം തിരഞ്ഞെടുക്കുക — %s</string>\n    <string name=\"auto_device_theme_title\">യാന്ത്രികം (ഉപകരണ തീം)</string>\n    <string name=\"radio\">റേഡിയോ</string>\n    <string name=\"featured\">തിരഞ്ഞെടുത്തത്</string>\n    <string name=\"paid_content\">പണമടച്ച ഉപയോക്താക്കൾക്ക് മാത്രമേ ഈ ഉള്ളടക്കം ലഭ്യമാകൂ, അതിനാൽ ഇത് ന്യൂപൈപ്പ് സ്ട്രീം ചെയ്യാനോ ഡൗൺലോഡ് ചെയ്യാനോ കഴിയില്ല.</string>\n    <string name=\"youtube_music_premium_content\">ഈ വീഡിയോ യൂട്യൂബ് മ്യൂസിക് പ്രീമിയം അംഗങ്ങൾക്ക് മാത്രമേ ലഭ്യമാകൂ, അതിനാൽ ഇത് ന്യൂപൈപ്പ് സ്ട്രീം ചെയ്യാനോ ഡൗൺലോഡ് ചെയ്യാനോ കഴിയില്ല.</string>\n    <string name=\"private_content\">ഈ ഉള്ളടക്കം സ്വകാര്യമാണ്, അതിനാൽ ഇത് ന്യൂപൈപ്പ് സ്ട്രീം ചെയ്യാനോ ഡൗൺലോഡ് ചെയ്യാനോ കഴിയില്ല.</string>\n    <string name=\"soundcloud_go_plus_content\">ഇത് നിങ്ങളുടെ രാജ്യത്തെങ്കിലും ഒരു സൗണ്ട്ക്ലൗഡ് ഗോ + ട്രാക്കാണ്, അതിനാൽ ഇത് ന്യൂപൈപ്പ് സ്ട്രീം ചെയ്യാനോ ഡൗൺലോഡ് ചെയ്യാനോ കഴിയില്ല.</string>\n    <string name=\"georestricted_content\">ഈ ഉള്ളടക്കം നിങ്ങളുടെ രാജ്യത്ത് ലഭ്യമല്ല.</string>\n    <string name=\"no_app_to_open_intent\">നിങ്ങളുടെ ഉപകരണത്തിലെ ഒരു അപ്ലിക്കേഷനും ഇത് തുറക്കാൻ കഴിയില്ല</string>\n    <string name=\"chapters\">അധ്യായങ്ങൾ</string>\n    <string name=\"recent\">സമീപകാലം</string>\n    <string name=\"show_thumbnail_summary\">ലോക്ക് സ്ക്രീൻ പശ്ചാത്തലത്തിനും അറിയിപ്പുകൾക്കും ലഘുചിത്രം ഉപയോഗിക്കുക</string>\n    <string name=\"show_thumbnail_title\">ലഘുചിത്രം കാണിക്കുക</string>\n    <string name=\"never\">ഒരിക്കലും</string>\n    <string name=\"wifi_only\">വൈഫൈയിൽ മാത്രം</string>\n    <string name=\"autoplay_summary\">പ്ലേബാക്ക് സ്വപ്രേരിതമായി ആരംഭിക്കുക — %s</string>\n    <string name=\"crash_the_app\">അപ്ലിക്കേഷൻ ക്രാഷ് ചെയ്യുക</string>\n    <string name=\"show_memory_leaks\">മെമ്മറി ലീക്കുകൾ കാണിക്കുക</string>\n    <string name=\"enqueued\">എൻക്യൂ ചെയ്തു</string>\n    <string name=\"enqueue_stream\">എൻക്യൂ</string>\n    <string name=\"show_channel_details\">ചാനൽ വിശദാംശങ്ങൾ കാണിക്കുക</string>\n    <string name=\"title_activity_play_queue\">ക്യൂ പ്ലേ ചെയ്യുക</string>\n    <string name=\"recaptcha_solve\">പരിഹരിക്കുക</string>\n    <string name=\"msg_calculating_hash\">ഹാഷ് കണക്കാക്കുന്നു</string>\n    <string name=\"description_tab_description\">വിവരണം</string>\n    <string name=\"related_items_tab_description\">അനുബന്ധ ഇനങ്ങൾ</string>\n    <string name=\"comments_tab_description\">അഭിപ്രായങ്ങൾ</string>\n    <string name=\"clear_cookie_summary\">നിങ്ങൾ ഒരു reCAPTCHA പരിഹരിക്കുമ്പോൾ ന്യൂപൈപ്പ് സംഭരിക്കുന്ന കുക്കികൾ മായ്‌ക്കുക</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA കുക്കികൾ‌ മായ്‌ച്ചു</string>\n    <string name=\"clear_cookie_title\">ReCAPTCHA കുക്കികൾ മായ്‌ക്കുക</string>\n    <string name=\"hash_channel_description\">വീഡിയോ ഹാഷിംഗ് പുരോഗതിക്കായുള്ള അറിയിപ്പുകൾ</string>\n    <string name=\"hash_channel_name\">വീഡിയോ ഹാഷ് അറിയിപ്പ്</string>\n    <string name=\"restricted_video_no_stream\">ഈ വീഡിയോ പ്രായപരിധി നിർണ്ണയിച്ചിരിക്കുന്നു.\n\\nപ്രായ-നിയന്ത്രിത വീഡിയോകളുള്ള പുതിയ യൂട്യൂബ് നയങ്ങൾ കാരണം, ന്യൂപൈപ്പിന് അതിന്റെ വീഡിയോ സ്ട്രീമുകളിലൊന്നും ആക്സസ് ചെയ്യാൻ കഴിയില്ല, അതിനാൽ ഇത് പ്ലേ ചെയ്യാൻ കഴിയില്ല.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">പക്വതയുള്ള ഉള്ളടക്കം മറയ്ക്കുന്ന \\\"നിയന്ത്രിത മോഡ്\\\" യൂട്യൂബ് നൽകുന്നു</string>\n    <string name=\"show_age_restricted_content_summary\">കുട്ടികൾക്ക് അനുയോജ്യമല്ലാത്ത ഉള്ളടക്കം കാണിക്കുക കാരണം അതിന് പ്രായപരിധി ഉണ്ട് (18+ പോലെ)</string>\n    <string name=\"unsupported_url_dialog_message\">URL തിരിച്ചറിയാൻ കഴിഞ്ഞില്ല. മറ്റൊരു അപ്ലിക്കേഷൻ ഉപയോഗിച്ച് തുറക്കണോ\\?</string>\n    <string name=\"auto_queue_toggle\">തനിയെ ക്യൂവിൽ കയറ്റുക</string>\n    <string name=\"show_meta_info_summary\">സ്ട്രീം സ്രഷ്ടാവ്, സ്ട്രീം ഉള്ളടക്കം അല്ലെങ്കിൽ ഒരു തിരയൽ അഭ്യർത്ഥന എന്നിവയെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾ ഉൾക്കൊള്ളുന്ന മെറ്റാ വിവര ബോക്സുകൾ മറയ്ക്കുന്നതിന് ഓഫാക്കുക</string>\n    <string name=\"show_meta_info_title\">മെറ്റാഇൻഫോ കാണിക്കുക</string>\n    <string name=\"show_description_summary\">വീഡിയോ വിവരണവും അധിക വിവരങ്ങളും മറയ്ക്കുന്നതിന് ഓഫാക്കുക</string>\n    <string name=\"show_description_title\">വിവരണം കാണിക്കുക</string>\n    <string name=\"clear_queue_confirmation_description\">സജീവ പ്ലെയർ ക്യൂ മാറ്റിസ്ഥാപിക്കും</string>\n    <string name=\"clear_queue_confirmation_summary\">ഒരു പ്ലെയറിൽ നിന്ന് മറ്റൊന്നിലേക്ക് മാറുന്നത് നിങ്ങളുടെ ക്യൂവിനെ പുനഃസ്ഥാപിച്ചേക്കാം</string>\n    <string name=\"clear_queue_confirmation_title\">ഒരു ക്യൂ മായ്‌ക്കുന്നതിന് മുമ്പ് സ്ഥിരീകരണത്തിനായി ആവശ്യപ്പെടുക</string>\n    <string name=\"night_theme_title\">രാത്രി തീം</string>\n    <string name=\"notification_action_buffering\">ബഫറിംഗ്</string>\n    <string name=\"notification_actions_summary\">ചുവടെയുള്ള ഓരോ അറിയിപ്പ് പ്രവർത്തനവും ടാപ്പുചെയ്ത് എഡിറ്റുചെയ്യുക. വലതുവശത്തുള്ള ചെക്ക്ബോക്സുകൾ ഉപയോഗിച്ച് കോംപാക്റ്റ് അറിയിപ്പിൽ കാണിക്കുന്നതിന് അവയിൽ മൂന്നെണ്ണം വരെ തിരഞ്ഞെടുക്കുക</string>\n    <string name=\"notification_action_4_title\">അഞ്ചാം പ്രവർത്തന ബട്ടൺ</string>\n    <string name=\"notification_action_3_title\">നാലാം പ്രവർത്തന ബട്ടൺ</string>\n    <string name=\"notification_action_2_title\">മൂന്നാം പ്രവർത്തന ബട്ടൺ</string>\n    <string name=\"notification_action_1_title\">രണ്ടാം പ്രവർത്തന ബട്ടൺ</string>\n    <string name=\"notification_action_0_title\">ആദ്യ പ്രവർത്തന ബട്ടൺ</string>\n    <string name=\"disable_media_tunneling_summary\">വീഡിയോ കാണുമ്പോൾ കറുത്ത സ്ക്രീൻ, അവ്യക്തത അനുഭവിക്കുന്നു എങ്കിൽ മീഡിയ ട്യൂൺലിങ് പ്രവർത്തനരഹിതമാക്കുക</string>\n    <string name=\"seekbar_preview_thumbnail_title\">സീക്ബാർ ചെറുചിത്രം പ്രദർശനം</string>\n    <string name=\"detail_heart_img_view_description\">സ്നേഹത്തോടെ സൃഷ്ടാവ്</string>\n    <string name=\"description_select_disable\">ഡിസ്ക്രിപ്ഷനിലെ ടെക്സ്റ്റ്‌ സെലക്ട്‌ ചെയ്യുവാൻ അനുവദിക്കാതെ ഇരിക്കുക</string>\n    <string name=\"description_select_enable\">ഡിസ്ക്രിപ്ഷനിലെ ടെക്സ്റ്റ്‌ സെലക്ട്‌ ചെയ്യാൻ അനുവദിക്കുക</string>\n    <string name=\"off\">ഓഫ്‌</string>\n    <string name=\"on\">ഓൺ</string>\n    <string name=\"open_website_license\">വെബ്സൈറ്റ് തുറക്കുക</string>\n    <string name=\"tablet_mode_title\">ടാബ്ലറ്റ് മോഡ്</string>\n    <string name=\"metadata_privacy_internal\">ഇന്റെർണൽ</string>\n    <string name=\"metadata_privacy_private\">സ്വകാര്യം</string>\n    <string name=\"metadata_privacy_unlisted\">ലിസ്റ്റ് ചെയ്യപ്പെടാത്തത്</string>\n    <string name=\"metadata_privacy_public\">പൊതുവായത്</string>\n    <string name=\"metadata_host\">ഹോസ്റ്റ്</string>\n    <string name=\"metadata_support\">പിന്തുണ</string>\n    <string name=\"metadata_language\">ഭാഷ</string>\n    <string name=\"metadata_age_limit\">പ്രായ പരിധി</string>\n    <string name=\"metadata_privacy\">സ്വകാര്യത</string>\n    <string name=\"metadata_licence\">ലൈസൻസ്</string>\n    <string name=\"metadata_tags\">ടാഗുക്കൾ</string>\n    <string name=\"metadata_category\">വിഭാഗം</string>\n    <string name=\"description_select_note\">താക്കൾക് ഇപ്പോൾ ഡിസ്ക്രിപ്ഷൻ ബോക്സിലെ ടെക്സ്റ്റ്‌ തിരഞ്ഞെടുക്കാൻ സാധിക്കും. ശ്രെദ്ധിക്കുക സെലെക്ഷൻ മോഡിൽ പേജ് ചിലപ്പോൾ മിന്നുകയും ലിങ്കുകൾ ക്ലിക്ക് ചെയ്യാനാകാതെയും വന്നേക്കാം.</string>\n    <string name=\"account_terminated\">അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു</string>\n    <string name=\"feed_load_error_fast_unknown\">ഫാസ്റ്റ് ഫീഡ് മോഡ് കൂടുതൽ വിവരങ്ങൾ നൽകില്ല.</string>\n    <string name=\"feed_load_error_terminated\">സൃഷ്ടാവിന്റെ അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു.\n\\nഭാവിയിൽ ഫീഡ് ലോഡ് ചെയ്യാൻ ന്യൂ പൈപ്പിന് സാധിക്കില്ല.\n\\nതാക്കൾക്ക് ഈ ചാനൽ അൺ സബ്സ്ക്രൈബ് ചെയ്യണോ\\?</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' ലെ ഫീഡ് ലോഡ് ചെയ്യാൻ സാധികില്ല.</string>\n    <string name=\"feed_load_error\">ഫീഡ് ലോഡ് ചെയ്യുന്നതിൽ പിശക് സംഭവിച്ചിരിക്കുന്നു</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">ആൻഡ്രോയ്ഡ് 10 മുതൽ മാത്രമേ \\\"സ്റ്റോറേജ് അക്സസ് ഫ്രെയിംവർക്ക്\\\" പിന്തുണക്കു</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">എവിടെ ആണ് ഡൌൺലോഡ് ചെയ്യ്യപെടുന്ന ഓരോ ഫയൽലും സംരക്ഷിക്കപ്പെടേണ്ടത് എന്ന് തങ്കളോട് ചോദിക്കും</string>\n    <string name=\"dont_show\">കാണിക്കരുത്</string>\n    <string name=\"low_quality_smaller\">കുറഞ്ഞ നിലവാരം (ചെറുത് )</string>\n    <string name=\"high_quality_larger\">ഉയർന്ന നിലവാരം (വലിയത് )</string>\n    <string name=\"disable_media_tunneling_title\">മീഡിയ ട്യൂൺലിങ് പ്രവർത്തനരഹിതമാക്കുക</string>\n    <string name=\"no_dir_yet\">ഡൌൺലോഡ് ഫോൾഡർ ഇത് വരെയും സെറ്റ് ചെയ്തിട്ടില്ല, സ്ഥിര ഡൌൺലോഡ് ഫോൾഡർ ഇപ്പോൾ തിരഞ്ഞെക്കുക</string>\n    <string name=\"comments_are_disabled\">അഭിപ്രായങ്ങൾ പ്രവർത്തനരഹിതമായിരിക്കുന്നു</string>\n    <string name=\"remote_search_suggestions\">റിമോട്ട് സെർച്ച്‌ നിർദ്ദേശങ്ങൾ</string>\n    <string name=\"local_search_suggestions\">ലോക്കൽ സെർച്ച്‌ നിർദേശങ്ങൾ</string>\n    <string name=\"mark_as_watched\">കണ്ടതാണെന്ന് അടയാളപ്പെടുത്തുക</string>\n    <string name=\"start_main_player_fullscreen_title\">തുടങ്ങുന്ന പ്രേധാന പേജ് മുഴുവന്‍ സ്ക്രീനില്‍ കാണിക്കുക</string>\n    <string name=\"main_page_content_swipe_remove\">ഐറ്റം കളയണം എന്നുണ്ടെല്‍ സ്വൈപ്പ് ചൈയ്യുക</string>\n    <string name=\"start_main_player_fullscreen_summary\">മിനി പ്ലേയര്‍ -ല്‍ വീഡിയോ -ക്കള്‍ ഒരിക്കലും സ്റ്റാര്‍ട്ട് ചൈയ്യരുത് , പക്ഷേ നേരെ ഫുള്‍ സ്ക്രീന്‍ മോഡിലെക് മാറും .ഓട്ടോ റൊട്ടേഷന്‍ ലോക്ക് ചെയിത്തിട്ടുണ്ടെങ്കില്‍ നിലവിലെ ഫുള്‍ സ്ക്രീന്‍ നില്‍ നിന്നും മിനി പ്ലായേറിലെക് മാറാന്‍ ആകും</string>\n    <string name=\"settings_category_player_notification_summary\">നിലവിൽ കാണുന്ന സ്ട്രീം അറിയിപ്പ് ക്രമീകരിക്കുക</string>\n    <string name=\"notifications\">അറിയിപ്പുകൾ</string>\n    <string name=\"settings_category_player_notification_title\">പ്ലേയർ അറിയിപ്പ്</string>\n    <string name=\"streams_notification_channel_name\">പുതിയ സ്ട്രീമുകൾ</string>\n    <string name=\"crash_the_player\">പ്ലേയർ തകർക്കുക</string>\n    <string name=\"prefer_original_audio_title\">യഥാർത്ഥ ശബ്ദത്തിന് പരിഗണന കൊടുക്കുക</string>\n    <string name=\"prefer_original_audio_summary\">ഭാഷ ഏതായാലും യഥാർത്ഥ ശബ്ദം തിരഞ്ഞെടുക്കുക</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-mn/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Томруулдаг шил дээр даран эхлэнэ үү.</string>\n    <string name=\"upload_date_text\">%1$s-д нийтлэсэн</string>\n    <string name=\"no_player_found\">Тоглуулагч олдсонгүй. VLC суулгах уу?</string>\n    <string name=\"no_player_found_toast\">Тоглуулагч олдсонгүй (VLC суулган тоглуулж болно).</string>\n    <string name=\"install\">Суулгах</string>\n    <string name=\"cancel\">Цуцлах</string>\n    <string name=\"yes\">Тийм</string>\n    <string name=\"no\">Үгүй</string>\n    <string name=\"open_in_browser\">Вэб хөтөч дээр нээх</string>\n    <string name=\"mark_as_watched\">Үзсэнээр тэмдэглэх</string>\n    <string name=\"open_in_popup_mode\">Popup горим дээр нээх</string>\n    <string name=\"share\">Хуваалцах</string>\n    <string name=\"search\">Хайх</string>\n    <string name=\"settings\">Тохиргоо</string>\n    <string name=\"did_you_mean\">Та \\\"%1$s\\\" гэх гэж байсан уу?</string>\n    <string name=\"use_external_video_player_title\">Гадны тоглууглагч ашиглах</string>\n    <string name=\"use_external_video_player_summary\">Зарим дүрслэл дээр дуугүй болгоно</string>\n    <string name=\"unsubscribe\">Бүртгэлээ цуцлах</string>\n    <string name=\"channel_unsubscribed\">Сувгийн бүртгэл цуцлагдсан</string>\n    <string name=\"subscription_change_failed\">Бүртгэлт цуцалж чадсангүй</string>\n    <string name=\"tab_subscriptions\">Бүртгэлүүд</string>\n    <string name=\"tab_bookmarks\">Тэмдэглэсэн жагсаалт</string>\n    <string name=\"tab_choose\">Таб сонгох</string>\n    <string name=\"controls_popup_title\">Popup</string>\n    <string name=\"download_path_audio_title\">Дуу татах хавтас</string>\n    <string name=\"download_path_audio_summary\">Татагдсан дуунууд энд хадгалагдана</string>\n    <string name=\"download_path_audio_dialog_title\">Дуун файлуудыг татах хавтас сонгоно уу</string>\n    <string name=\"default_resolution_title\">Үндсэн хэмжээс</string>\n    <string name=\"use_external_audio_player_title\">Гадны дуу тоглуулагч ашиглах</string>\n    <string name=\"download\">Татах</string>\n    <string name=\"subscription_update_failed\">Бүртгэл шинэчлэж чадсангүй</string>\n    <string name=\"show_info\">Мэдээлэл харах</string>\n    <string name=\"download_path_title\">Бичлэг татах хавтас</string>\n    <string name=\"download_path_summary\">Татагдсан бичлэгүүд энд хадгалагдана</string>\n    <string name=\"download_path_dialog_title\">Бичлэгэн файлуудыг хадгалах хавтас сонгоно уу</string>\n    <string name=\"default_popup_resolution_title\">Үндсэн popup-ийн хэмжээс</string>\n    <string name=\"show_higher_resolutions_summary\">2K/4K бичлэгүүдийг зарим төхөөрөмжүүд л тоглуулж чадна</string>\n    <string name=\"play_with_kodi_title\">Kodi-р тоглуулах</string>\n    <string name=\"kore_not_found\">Байхгүй Kore апп-ийг суулгах уу?</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi-р тоглуулах\\\" цэсийг харуулах</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-mr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"download_path_audio_dialog_title\">ऑडिओ फाईल साठी डाउनलोड फोल्डर निवडा</string>\n    <string name=\"download_path_audio_summary\">डाउनलोड केलेल्या ऑडियो फाईल येथे साठवल्या जातात</string>\n    <string name=\"download_path_audio_title\">ऑडिओ डाउनलोड फोल्डर</string>\n    <string name=\"download_path_dialog_title\">व्हिडिओ फाईल डाऊनलोड करण्याचे फोल्डर निवडा</string>\n    <string name=\"download_path_summary\">डाउनलोड केलेल्या फाईल येथे साठवल्या जातात</string>\n    <string name=\"download_path_title\">व्हिडिओ डाउनलोड फोल्डर</string>\n    <string name=\"controls_popup_title\">पॉप अप</string>\n    <string name=\"controls_background_title\">पार्श्वभाग</string>\n    <string name=\"tab_choose\">टॅब निवडा</string>\n    <string name=\"tab_bookmarks\">बुकमार्क केलेली प्लेलिस्ट</string>\n    <string name=\"tab_subscriptions\">सबस्क्रिप्शन</string>\n    <string name=\"show_info\">माहिती दाखवा</string>\n    <string name=\"subscription_update_failed\">सबस्क्रिप्शन अद्यतनित करू शकले नाही</string>\n    <string name=\"subscription_change_failed\">सबस्क्रिप्शन मध्ये बदल करू शकलो नाही</string>\n    <string name=\"channel_unsubscribed\">चॅनलचे सबस्क्राईब काढले</string>\n    <string name=\"unsubscribe\">सबस्क्राईब काढा</string>\n    <string name=\"subscribed_button_title\">सबस्क्राईब केले</string>\n    <string name=\"subscribe_button_title\">सबस्क्राईब</string>\n    <string name=\"use_external_audio_player_title\">बाहेरील ऑडियो प्लेअर वापरा</string>\n    <string name=\"use_external_video_player_title\">बाहेरील व्हिडिओ प्लेअर वापरा</string>\n    <string name=\"share_dialog_title\">शेअर करा</string>\n    <string name=\"search_showing_result_for\">%sसाठी निकाल दाखवत आहे</string>\n    <string name=\"settings\">सेटिंग</string>\n    <string name=\"search\">शोधा</string>\n    <string name=\"controls_download_desc\">फाईल डाउनलोड</string>\n    <string name=\"download\">डाउनलोड</string>\n    <string name=\"share\">शेअर</string>\n    <string name=\"open_with\">याचा वापर करून उघडा</string>\n    <string name=\"open_in_popup_mode\">पॉप अप मोड मध्ये उघडा</string>\n    <string name=\"open_in_browser\">हा मेन्यू नमुना व्हिडिओ किंवा ऑडियो वेब ब्राउजर मध्ये चालवू शकतो</string>\n    <string name=\"cancel\">रद्द करा</string>\n    <string name=\"install\">स्थापित करा</string>\n    <string name=\"no_player_found_toast\">प्लेअर सापडले नाही (तुम्ही VLC player वापरून फाईल चालवू शकता).</string>\n    <string name=\"no_player_found\">प्लेअर सापडले नाही. VLC प्लेअर इंस्टॉल करू इच्छिता का\\?</string>\n    <string name=\"main_bg_subtitle\">प्रारंभ करण्यासाठी मॅग्निफाइंग ग्लासवर टॅप करा.</string>\n    <string name=\"play_with_kodi_title\">कोडी वापरून चालवा</string>\n    <string name=\"show_higher_resolutions_summary\">फक्त काही उपकरणे 2k/4k व्हिडिओ चालवू शकतात</string>\n    <string name=\"show_higher_resolutions_title\">वरचे रेसॉल्युशन दाखवा</string>\n    <string name=\"default_popup_resolution_title\">डिफॉल्ट पॉप अप रेसिल्युशन</string>\n    <string name=\"default_resolution_title\">डीफॉल्ट रेसोल्युशन निवडा</string>\n    <string name=\"controls_add_to_playlist_title\">मध्ये टाका</string>\n    <string name=\"upload_date_text\">%1$s रोजी प्रकाशित केला</string>\n    <string name=\"show_play_with_kodi_title\">\\\"कोडीबरोबर प्ले करा\\\" हा पर्याय दाखवा</string>\n    <string name=\"show_play_with_kodi_summary\">कोडी मीडिया सेंटरद्वारे व्हिडिओ प्ले करण्याचा पर्याय प्रदर्शित करा</string>\n    <string name=\"mark_as_watched\">पाहिले म्हणून चिन्हांकित करा</string>\n    <string name=\"ok\">ठीक आहे</string>\n    <string name=\"crash_the_player\">प्लेअर क्रॅश करा</string>\n    <string name=\"notification_action_1_title\">दुसरे क्रिया बटण</string>\n    <string name=\"notification_action_2_title\">तिसरे क्रिया बटण</string>\n    <string name=\"notification_action_3_title\">चौथे क्रिया बटण</string>\n    <string name=\"notification_action_4_title\">पाचवे क्रिया बटण</string>\n    <string name=\"did_you_mean\">तुम्हाला \\\"%1$s\\\" म्हणायचे आहे का\\?</string>\n    <string name=\"use_external_video_player_summary\">काही रेसॉल्युशनवर ऑडिओ काढून टाकते</string>\n    <string name=\"kore_not_found\">गहाळ Kode ॲप इंस्टॉल करायचे\\?</string>\n    <string name=\"notification_scale_to_square_image_summary\">16:9 ते 1:1 आस्पेक्ट रेशो पर्यंत नोटिफिकेशनमध्ये दाखवलेली व्हिडिओ थंबनेल क्रॉप करा</string>\n    <string name=\"notification_action_0_title\">प्रथम क्रिया बटण</string>\n    <string name=\"notification_scale_to_square_image_title\">1:1 आस्पेक्ट रेशोवर थंबनेल क्रॉप करा</string>\n    <string name=\"users\">वापरकर्ते</string>\n    <string name=\"network_error\">नेटवर्क बंद आहे</string>\n    <string name=\"local\">स्थानिक</string>\n    <string name=\"error_snackbar_action\">अहवाल करा</string>\n    <string name=\"what_device_headline\">माहिती:</string>\n    <string name=\"enable_watch_history_title\">इतिहास पाहा</string>\n    <string name=\"dismiss\">रद्द करा</string>\n    <string name=\"rename\">नाव बदला</string>\n    <string name=\"msg_threads\">धागे</string>\n    <string name=\"msg_name\">फाईल चे नाव</string>\n    <string name=\"rename_playlist\">नाव बदला</string>\n    <string name=\"playlist_add_stream_success\">सूचीबद्ध करा</string>\n    <string name=\"playback_tempo\">टेम्पो</string>\n    <string name=\"stop\">थांबवा</string>\n    <string name=\"featured\">सर्वात भारी</string>\n    <string name=\"metadata_privacy_public\">सार्वजनिक</string>\n    <string name=\"never\">कधीही नाही</string>\n    <string name=\"metadata_tags\">टॅग्ज</string>\n    <string name=\"name\">नाव</string>\n    <string name=\"recent\">ताजा</string>\n    <string name=\"metadata_privacy_unlisted\">असूचीबद्ध केलेले</string>\n    <string name=\"theme_title\">थीम</string>\n    <string name=\"auto_queue_toggle\">स्वयं सूचीबद्ध करा</string>\n    <string name=\"brightness\">उजेट</string>\n    <string name=\"autoplay_title\">स्वयं सुरु करा</string>\n    <string name=\"settings_category_player_behavior_title\">वागणूक</string>\n    <string name=\"content\">सामग्री</string>\n    <string name=\"all\">सर्व</string>\n    <string name=\"channels\">चॅनेल</string>\n    <string name=\"events\">कार्यक्रम</string>\n    <string name=\"videos_string\">व्हिडिओज</string>\n    <string name=\"general_error\">त्रुटी</string>\n    <string name=\"content_not_available\">सामग्री उपलब्ध नाही</string>\n    <string name=\"detail_likes_img_view_description\">आवडले</string>\n    <string name=\"comments_tab_description\">टिप्पण्या</string>\n    <string name=\"description_tab_description\">वर्णन</string>\n    <string name=\"create\">बनवा</string>\n    <string name=\"delete\">हटवा</string>\n    <string name=\"msg_error\">चुक झाली</string>\n    <string name=\"contribution_title\">योगदान करा</string>\n    <string name=\"resize_fill\">भरुन</string>\n    <string name=\"resize_zoom\">झूम</string>\n    <string name=\"import_ongoing\">आत टाकत आहोत…</string>\n    <string name=\"export_ongoing\">बाहेर काढत आहोत…</string>\n    <string name=\"playback_step\">पाऊल</string>\n    <string name=\"playback_reset\">रीसेट करा</string>\n    <string name=\"percent\">टक्केवारी</string>\n    <string name=\"paused\">थांबलेला आहे</string>\n    <string name=\"queued\">रांगेत आहे</string>\n    <string name=\"metadata_support\">पाठींबा</string>\n    <string name=\"off\">बंद</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"unknown_audio_track\">अज्ञात</string>\n    <string name=\"channel_tab_videos\">व्हिडिओज</string>\n    <string name=\"play\">सुरू</string>\n    <string name=\"black_theme_title\">काळा</string>\n    <string name=\"notification_action_repeat\">पुन्हा पहा</string>\n    <string name=\"notification_action_shuffle\">शफल</string>\n    <string name=\"notification_action_nothing\">काही नाहीं</string>\n    <string name=\"dark_theme_title\">गडद</string>\n    <string name=\"undo\">परत करा</string>\n    <string name=\"artists\">कलाकार</string>\n    <string name=\"always\">दरवेळी</string>\n    <string name=\"unknown_content\">[अनोळखी]</string>\n    <string name=\"error_details_headline\">तपशील:</string>\n    <string name=\"pause\">थांबवा</string>\n    <string name=\"recaptcha_solve\">सोडवा</string>\n    <string name=\"no_one_watching\">कोणीही पाहत नाही आहे</string>\n    <string name=\"tracks\">गाणी</string>\n    <string name=\"downloads\">डाऊनलोडस्</string>\n    <string name=\"notification_colorize_title\">नोटिफिकेशनला रंगीत करा</string>\n    <string name=\"play_audio\">ऑडिओ</string>\n    <string name=\"night_theme_title\">रात्रीची थीम</string>\n    <string name=\"light_theme_title\">पांढरा</string>\n    <string name=\"notification_action_buffering\">अडकत आहे</string>\n    <string name=\"download_dialog_title\">डाऊनलोड</string>\n    <string name=\"settings_category_player_title\">प्लेअर</string>\n    <string name=\"settings_category_appearance_title\">दिखावा</string>\n    <string name=\"settings_category_debug_title\">डेबग</string>\n    <string name=\"settings_category_updates_title\">अपडेट</string>\n    <string name=\"duration_live\">थेट</string>\n    <string name=\"playlists\">प्लेलिस्ट</string>\n    <string name=\"file\">फाईल</string>\n    <string name=\"tab_licenses\">परवाना</string>\n    <string name=\"checksum\">चेकसम</string>\n    <string name=\"action_history\">इतिहास</string>\n    <string name=\"export_complete_toast\">बाहेर काढा</string>\n    <string name=\"conferences\">परिषद</string>\n    <string name=\"mute\">गप्प करा</string>\n    <string name=\"unmute\">बोलके करा</string>\n    <string name=\"caption_auto_generated\">स्वयंउत्तपण झालेले</string>\n    <string name=\"resize_fit\">फिट</string>\n    <string name=\"caption_setting_title\">कॅपशन</string>\n    <string name=\"decline\">नकार करा</string>\n    <string name=\"minimize_on_exit_none_description\">काहीही नाही</string>\n    <string name=\"updates_setting_title\">अपडेट करा</string>\n    <string name=\"auto\">स्वयं</string>\n    <string name=\"grid\">ग्रिड</string>\n    <string name=\"missions_header_finished\">समाप्त झाले</string>\n    <string name=\"missions_header_pending\">प्रलंबित</string>\n    <string name=\"recovering\">रिकवर होत आहे</string>\n    <string name=\"enqueue\">रांग</string>\n    <string name=\"feed_create_new_group_button_title\">नवीन</string>\n    <string name=\"chapters\">धडे</string>\n    <string name=\"radio\">रेडिओ</string>\n    <string name=\"metadata_licence\">परवाना</string>\n    <string name=\"metadata_language\">भाषा</string>\n    <string name=\"metadata_category\">श्रेणी</string>\n    <string name=\"metadata_host\">यजमान</string>\n    <string name=\"metadata_privacy_private\">खासगी</string>\n    <string name=\"on\">सुरू</string>\n    <string name=\"semitone\">अर्धस्वर</string>\n    <string name=\"notifications\">सूचना</string>\n    <string name=\"channel_tab_shorts\">शॉर्ट्स</string>\n    <string name=\"volume\">आवाज</string>\n    <string name=\"card\">कार्ड</string>\n    <string name=\"feed_show_upcoming\">पुढील</string>\n    <string name=\"none\">काही नाही</string>\n    <string name=\"done\">झाल</string>\n    <string name=\"metadata_avatars\">अवतार</string>\n    <string name=\"metadata_thumbnails\">थंबनेल</string>\n    <string name=\"forward\">पुढेजा</string>\n    <string name=\"metadata_banners\">बॅनर</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"show_comments_title\">प्रतिक्रिया दाखवा</string>\n    <string name=\"play_all\">सर्व सुरु करा</string>\n    <string name=\"enable_search_history_title\">शोधण्याचा इतिहास</string>\n    <string name=\"settings_category_clear_data_title\">डेटा साफ करा</string>\n    <string name=\"unsupported_url\">असमर्थित लिंक</string>\n    <string name=\"best_resolution\">सर्वोत्तम क्वालिटी</string>\n    <string name=\"file_deleted\">File हटवली आहे</string>\n    <string name=\"just_once\">फक्त एकदा</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s पाहत आहे</item>\n        <item quantity=\"other\">%s पाहत आहेत</item>\n    </plurals>\n    <string name=\"start\">सुरुवात करा</string>\n    <string name=\"list\">यादी</string>\n    <string name=\"albums\">अल्बम</string>\n    <string name=\"show_description_title\">वर्णन दाखवा</string>\n    <string name=\"accept\">स्वीकार करा</string>\n    <string name=\"metadata_privacy\">गोपनीयता</string>\n    <string name=\"audio_track_type_original\">मूळ</string>\n    <string name=\"audio_track_type_dubbed\">डब केलेला</string>\n    <string name=\"audio\">ऑडिओ</string>\n    <string name=\"retry\">पुन्हा प्रयत्न करा</string>\n    <string name=\"website_title\">वेबसाईट</string>\n    <string name=\"title_activity_history\">इतिहास</string>\n    <string name=\"settings_category_downloads_title\">डाउनलोड करा</string>\n    <string name=\"sort\">क्रम</string>\n    <string name=\"duration\">वेळ</string>\n    <string name=\"error_report_title\">चुकांचा अहवाल द्या</string>\n    <string name=\"disabled\">बंद झालेले</string>\n    <string name=\"clear\">साफ करा</string>\n    <string name=\"donation_title\">दान करा</string>\n    <string name=\"import_title\">आत टाका</string>\n    <string name=\"overwrite\">आधी वर दबाव टाका</string>\n    <string name=\"metadata_privacy_internal\">आंतरिक</string>\n    <string name=\"metadata_subscribers\">सदस्य</string>\n    <string name=\"channel_tab_livestreams\">थेट</string>\n    <string name=\"channel_tab_channels\">चॅनेलस्</string>\n    <string name=\"channel_tab_playlists\">प्लेलिस्ट</string>\n    <string name=\"channel_tab_albums\">अल्बमस्</string>\n    <string name=\"channel_tab_about\">बद्दल</string>\n    <string name=\"replay\">पुन: पहा</string>\n    <string name=\"rewind\">माघे घ्या</string>\n    <string name=\"enqueue_stream\">रांग</string>\n    <string name=\"post_processing\">पोस्ट प्रोसेसींग करत आहे</string>\n    <string name=\"yes\">होय</string>\n    <string name=\"no\">नाही</string>\n    <string name=\"songs\">गाणी</string>\n    <string name=\"detail_dislikes_img_view_description\">आवडले नाही</string>\n    <string name=\"video\">व्हिडिओ</string>\n    <string name=\"import_complete_toast\">आत टाका</string>\n    <string name=\"trending\">चर्चेचा विषय</string>\n    <string name=\"play_queue_remove\">काढून टाका</string>\n    <string name=\"play_queue_stream_detail\">माहिती</string>\n    <string name=\"enqueued\">रांगेत आहे</string>\n    <string name=\"close\">बंद करा</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ms/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Tekan kanta kaca \\\"Cari\\\" untuk bermula</string>\n    <string name=\"upload_date_text\">Diterbitkan pada %1$s</string>\n    <string name=\"no_player_found\">Tiada pemain strim ditemui. Muat turun VLC\\?</string>\n    <string name=\"no_player_found_toast\">Tiada pemain strim yang ditemui (anda boleh memasang VLC untuk memainkan).</string>\n    <string name=\"install\">Pasang</string>\n    <string name=\"cancel\">Batal</string>\n    <string name=\"open_in_browser\">Buka dalam pelayar web</string>\n    <string name=\"open_in_popup_mode\">Buka dalam mod timbul</string>\n    <string name=\"share\">Kongsi</string>\n    <string name=\"download\">Muat turun</string>\n    <string name=\"controls_download_desc\">Muat turun fail strim</string>\n    <string name=\"search\">Carian</string>\n    <string name=\"settings\">Tetapan</string>\n    <string name=\"did_you_mean\">Adakah anda maksudkan \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Berkongsi dengan</string>\n    <string name=\"use_external_video_player_title\">Guna pemain video luaran</string>\n    <string name=\"use_external_video_player_summary\">Mengalih keluar audio pada sesetengah resolusi</string>\n    <string name=\"use_external_audio_player_title\">Gunakan pemain audio luaran</string>\n    <string name=\"subscribe_button_title\">Langgan</string>\n    <string name=\"subscribed_button_title\">Dilanggan</string>\n    <string name=\"channel_unsubscribed\">Saluran dinyahlanggan</string>\n    <string name=\"subscription_change_failed\">Tidak dapat menukar langganan</string>\n    <string name=\"subscription_update_failed\">Tidak dapat mengemaskini langganan</string>\n    <string name=\"show_info\">Papar maklumat</string>\n    <string name=\"tab_subscriptions\">Langganan</string>\n    <string name=\"tab_bookmarks\">Senarai Main Yang Disimpan</string>\n    <string name=\"unsubscribe\">Henti langganan</string>\n    <string name=\"tab_choose\">Pilih Tab</string>\n    <string name=\"fragment_feed_title\">Apa yang Baru</string>\n    <string name=\"controls_background_title\">Latar Belakang</string>\n    <string name=\"controls_popup_title\">Tetingkap Timbul</string>\n    <string name=\"controls_add_to_playlist_title\">Tambahkan Ke</string>\n    <string name=\"download_path_title\">Folder muat turun video</string>\n    <string name=\"download_path_summary\">Fail video yang telah dimuat turun disimpan di sini</string>\n    <string name=\"download_path_dialog_title\">Pilih folder muat turun untuk fail video</string>\n    <string name=\"download_path_audio_title\">Folder muat turun audio</string>\n    <string name=\"download_path_audio_summary\">Fail audio yang dimuat turun disimpan di sini</string>\n    <string name=\"download_path_audio_dialog_title\">Pilih folder muat turun untuk fail audio</string>\n    <string name=\"default_resolution_title\">Resolusi asal</string>\n    <string name=\"default_popup_resolution_title\">Resolusi asal tetingkap timbul</string>\n    <string name=\"show_higher_resolutions_title\">Papar resolusi yang lebih tinggi</string>\n    <string name=\"show_higher_resolutions_summary\">Hanya peranti tertentu sahaja yang boleh memainkan video 2K/4K</string>\n    <string name=\"play_with_kodi_title\">Main menggunakan Kodi</string>\n    <string name=\"kore_not_found\">Pasang aplikasi Kore yang tidak ditemui?</string>\n    <string name=\"show_play_with_kodi_title\">Paparkan pilihan \\\"Main menggunakan Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Paparkan pilihan untuk memainkan video melalui Kodi</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Format audio asal</string>\n    <string name=\"default_video_format_title\">Format video asal</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"light_theme_title\">Cerah</string>\n    <string name=\"dark_theme_title\">Gelap</string>\n    <string name=\"black_theme_title\">Hitam</string>\n    <string name=\"popup_remember_size_pos_title\">Ingat tetapan tetingkap timbul</string>\n    <string name=\"popup_remember_size_pos_summary\">Ingat saiz dan kedudukan terakhir tetingkap timbul</string>\n    <string name=\"use_inexact_seek_title\">Guna langkauan masa pantas (kurang jitu)</string>\n    <string name=\"use_inexact_seek_summary\">Carian kurang jitu membolehkan pemain layar untuk melangkau masa lebih pantas dengan ketepatan rendah. Langkauan masa 5, 15 atau 25 saat tidak akan berfungsi dengan pilihan ini</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Cache imej dihapuskan</string>\n    <string name=\"metadata_cache_wipe_title\">Hapuskan cache metadata</string>\n    <string name=\"metadata_cache_wipe_summary\">Hapuskan semua cache data halaman web</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Cache metadata dihapuskan</string>\n    <string name=\"auto_queue_title\">Tambah siaran seterusnya ke giliran secara automatik</string>\n    <string name=\"auto_queue_summary\"></string>\n    <string name=\"show_search_suggestions_title\">Cadangan carian</string>\n    <string name=\"show_search_suggestions_summary\">Tunjukkan cadangan semasa mencari</string>\n    <string name=\"enable_search_history_title\">Sejarah carian</string>\n    <string name=\"enable_search_history_summary\">Simpan pertanyaan carian secara lokal</string>\n    <string name=\"enable_watch_history_title\">Sejarah tontonan</string>\n    <string name=\"enable_watch_history_summary\">Simpan senarai video yang telah ditonton</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Teruskan apabila fokus</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Teruskan bermain selepas gangguan (contohnya panggilan telefon)</string>\n    <string name=\"download_dialog_title\">Muat turun</string>\n    <string name=\"show_next_and_similar_title\">Paparkan video \\'Seterusnya\\' dan \\'Berkaitan\\'</string>\n    <string name=\"show_hold_to_append_title\">Tunjukkan tip \\\"Pegang untuk menambahkan\\\"</string>\n    <string name=\"show_hold_to_append_summary\">Tunjukkan tip apabila butang latar belakang atau popup ditekan pada halaman butiran video</string>\n    <string name=\"unsupported_url\">URL tidak disokong</string>\n    <string name=\"default_content_country_title\">Negara kandungan utama</string>\n    <string name=\"content_language_title\">Bahasa kandungan utama</string>\n    <string name=\"settings_category_player_title\">Pemain</string>\n    <string name=\"settings_category_player_behavior_title\">Tingkah laku</string>\n    <string name=\"settings_category_video_audio_title\">Video dan audio</string>\n    <string name=\"settings_category_history_title\">Sejarah dan cache</string>\n    <string name=\"settings_category_appearance_title\">Penampilan</string>\n    <string name=\"settings_category_debug_title\">Nyahpepijat</string>\n    <string name=\"settings_category_updates_title\">Kemas kini</string>\n    <string name=\"background_player_playing_toast\">Bermain di latar belakang</string>\n    <string name=\"popup_playing_toast\">Bermain dalam mod popup</string>\n    <string name=\"content\">Kandungan</string>\n    <string name=\"show_age_restricted_content_title\">Kandungan terhad umur</string>\n    <string name=\"duration_live\">Langsung</string>\n    <string name=\"downloads\">Muat turun</string>\n    <string name=\"downloads_title\">Muat turun</string>\n    <string name=\"error_report_title\">Laporan ralat</string>\n    <string name=\"all\">Semua</string>\n    <string name=\"channels\">Saluran</string>\n    <string name=\"playlists\">Senarai main</string>\n    <string name=\"tracks\">Trek</string>\n    <string name=\"users\">Pengguna</string>\n    <string name=\"events\">Peristiwa</string>\n    <string name=\"disabled\">Dinyahdayakan</string>\n    <string name=\"clear\">Bersihkan</string>\n    <string name=\"best_resolution\">Resolusi terbaik</string>\n    <string name=\"undo\">Undo</string>\n    <string name=\"file_deleted\">Fail dipadam</string>\n    <string name=\"play_all\">Mainkan Semua</string>\n    <string name=\"always\">Sentiasa</string>\n    <string name=\"just_once\">Hanya sekali</string>\n    <string name=\"file\">Fail</string>\n    <string name=\"notification_channel_name\">Pemberitahuan NewPipe</string>\n    <string name=\"notification_channel_description\">Pemberitahuan untuk pemain latar belakang dan pemain popup NewPipe</string>\n    <string name=\"app_update_notification_channel_name\">Pemberitahuan Kemas Kini App</string>\n    <string name=\"app_update_notification_channel_description\">Pemberitahuan untuk versi NewPipe baru</string>\n    <string name=\"unknown_content\">[Tidak diketahui]</string>\n    <string name=\"switch_to_background\">Beralih ke Latar Belakang</string>\n    <string name=\"switch_to_popup\">Beralih ke Popup</string>\n    <string name=\"switch_to_main\">Beralih ke Latar Utama</string>\n    <string name=\"import_data_title\">Import pangkalan data</string>\n    <string name=\"export_data_title\">Export pangkalan data</string>\n    <string name=\"import_data_summary\">Timpa sejarah dan langganan semasa anda</string>\n    <string name=\"export_data_summary\">Mengeksport sejarah, langganan dan senarai main</string>\n    <string name=\"clear_views_history_title\">Hapuskan sejarah tontonan</string>\n    <string name=\"clear_views_history_summary\">Hapuskan sejarah strim yang telah dimain</string>\n    <string name=\"delete_view_history_alert\">Padamkan seluruh sejarah tontonan\\?</string>\n    <string name=\"watch_history_deleted\">Sejarah tontonan dipadamkan.</string>\n    <string name=\"clear_search_history_title\">Hapuskan sejarah carian</string>\n    <string name=\"clear_search_history_summary\">Padamkan sejarah kata kunci carian</string>\n    <string name=\"delete_search_history_alert\">Padamkan seluruh sejarah carian\\?</string>\n    <string name=\"search_history_deleted\">Sejarah carian dipadamkan.</string>\n    <string name=\"general_error\">Ralat</string>\n    <string name=\"download_to_sdcard_error_title\">Penyimpanan luaran tidak tersedia</string>\n    <string name=\"download_to_sdcard_error_message\">Tidak mampu Memuat turun ke kad SD luar. Tetapkan semula lokasi folder muat turun\\?</string>\n    <string name=\"network_error\">Ralat rangkaian</string>\n    <string name=\"could_not_load_thumbnails\">Tidak dapat memuat semua thumbnail</string>\n    <string name=\"parsing_error\">Tidak dapat menghuraikan laman web</string>\n    <string name=\"content_not_available\">Kandungan tidak tersedia</string>\n    <string name=\"could_not_setup_download_menu\">Tidak dapat menyediakan menu muat turun</string>\n    <string name=\"app_ui_crash\">App/UI terhempas</string>\n    <string name=\"player_stream_failure\">Tidak dapat memain strim ini</string>\n    <string name=\"player_unrecoverable_failure\">Ralat pemain yang tidak dapat dipulihkan telah berlaku</string>\n    <string name=\"player_recoverable_failure\">Memulihkan dari ralat pemain</string>\n    <string name=\"external_player_unsupported_link_type\">Pemain luar tidak menyokong jenis pautan ini</string>\n    <string name=\"video_streams_empty\">Tiada strim video yang dijumpai</string>\n    <string name=\"audio_streams_empty\">Tiada strim audio yang dijumpai</string>\n    <string name=\"invalid_directory\">Tiada folder itu</string>\n    <string name=\"invalid_source\">Tiada fail/sumber kandungan itu</string>\n    <string name=\"invalid_file\">Fail tidak wujud atau tiada kebenaran untuk membaca atau menulis kepadanya</string>\n    <string name=\"file_name_empty_error\">Nama fail tidak boleh kosong</string>\n    <string name=\"error_occurred_detail\">Ralat berlaku: %1$s</string>\n    <string name=\"no_streams_available_download\">Tiada strim yang tersedia untuk dimuat turun</string>\n    <string name=\"saved_tabs_invalid_json\">Menggunakan tab utama, ralat semasa membaca tab tersimpan</string>\n    <string name=\"restore_defaults\">Kembali kepada asal</string>\n    <string name=\"restore_defaults_confirmation\">Adakah anda mahu kembali kepada asal\\?</string>\n    <string name=\"sorry_string\">Maaf, itu tidak sepatutnya berlaku.</string>\n    <string name=\"error_report_button_text\">Laporkan ralat melalui e-mel</string>\n    <string name=\"error_snackbar_message\">Maaf, ada ralat yang berlaku.</string>\n    <string name=\"error_snackbar_action\">Lapor</string>\n    <string name=\"what_device_headline\">Maklumat:</string>\n    <string name=\"what_happened_headline\">Apa yang berlaku:</string>\n    <string name=\"info_labels\">Apa:\\nPermintaan:\\nBahasa Kandungan:\\nNegara Kandungan:\\nBahasa Aplikasi:\\nPerkhidmatan:\\nWaktu GMT:\\nPakej:\\nVersi:\\nVersi OS:</string>\n    <string name=\"your_comment\">Ulasan anda (dalam bahasa Inggeris):</string>\n    <string name=\"error_details_headline\">Butiran:</string>\n    <string name=\"detail_thumbnail_view_description\">Main video, tempoh masa:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Thumbnail avatar pemuatnaik</string>\n    <string name=\"detail_likes_img_view_description\">Suka</string>\n    <string name=\"detail_dislikes_img_view_description\">Tidak suka</string>\n    <string name=\"search_no_results\">Tiada keputusan</string>\n    <string name=\"empty_list_subtitle\">Tiada apa-apa di sini tetapi jangkrik</string>\n    <string name=\"detail_drag_description\">Seret untuk menyusun semula</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Cuba semula</string>\n    <string name=\"no_subscribers\">Tiada pelanggan</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"other\">%s pelanggan</item>\n    </plurals>\n    <string name=\"subscribers_count_not_available\">Kira pelanggan tidak tersedia</string>\n    <string name=\"no_views\">Tiada tontonan</string>\n    <plurals name=\"views\">\n        <item quantity=\"other\">%s tontonan</item>\n    </plurals>\n    <string name=\"no_videos\">Tiada video</string>\n    <string name=\"start\">Mula</string>\n    <string name=\"pause\">Jeda</string>\n    <string name=\"create\">Buat</string>\n    <string name=\"delete\">Padam</string>\n    <string name=\"checksum\">Ceksum</string>\n    <string name=\"dismiss\">Buangkan</string>\n    <string name=\"rename\">Namakan semula</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Nama fail</string>\n    <string name=\"msg_threads\">Thread</string>\n    <string name=\"msg_error\">Ralat</string>\n    <string name=\"msg_running\">NewPipe sedang memuat turun</string>\n    <string name=\"msg_running_detail\">Ketuk untuk butiran</string>\n    <string name=\"msg_wait\">Sila tunggu…</string>\n    <string name=\"msg_copied\">Disalin ke papan klip</string>\n    <string name=\"no_available_dir\">Sila pilih folder muat turun nanti dalam tetapan</string>\n    <string name=\"msg_popup_permission\">Kebenaran ini diperlukan untuk\n\\nbuka dalam mod popup</string>\n    <string name=\"one_item_deleted\">1 item dipadamkan.</string>\n    <string name=\"title_activity_recaptcha\">Cabaran reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Meminta kod reCAPTCHA</string>\n    <string name=\"settings_category_downloads_title\">Muat turun</string>\n    <string name=\"settings_file_charset_title\">Karakter yang dibenarkan dalam nama fail</string>\n    <string name=\"settings_file_replacement_character_summary\">Karakter tidak sah digantikan dengan nilai ini</string>\n    <string name=\"settings_file_replacement_character_title\">Karakter pengganti</string>\n    <string name=\"charset_letters_and_digits\">Huruf dan angka</string>\n    <string name=\"charset_most_special_characters\">Karakter yang paling istimewa</string>\n    <string name=\"title_activity_about\">Tentang NewPipe</string>\n    <string name=\"title_licenses\">Lesen Pihak Ketiga</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s oleh %2$s di bawah %3$s</string>\n    <string name=\"tab_about\">Tentang</string>\n    <string name=\"tab_licenses\">Lesen</string>\n    <string name=\"app_description\">Aplikasi strim yang percuma dan ringan untuk Android.</string>\n    <string name=\"contribution_title\">Sumbang</string>\n    <string name=\"contribution_encouragement\">Sama ada anda mempunyai idea; terjemahan, perubahan reka bentuk, pembersihan kod, atau perubahan kod sebenar yang berat-bantuan sentiasa dialu-alukan. Semakin banyak yang dilakukan semakin baik!</string>\n    <string name=\"view_on_github\">Lihat di GitHub</string>\n    <string name=\"donation_title\">Derma</string>\n    <string name=\"donation_encouragement\">NewPipe dibangunkan oleh sukarelawan menghabiskan masa membawa pengalaman terbaik. Beri balik untuk membantu pemaju membuat NewPipe lebih baik sambil menikmati secawan kopi.</string>\n    <string name=\"give_back\">Bagi balik</string>\n    <string name=\"website_title\">Laman Web</string>\n    <string name=\"website_encouragement\">Lawati Laman Web NewPipe untuk maklumat lanjut dan berita.</string>\n    <string name=\"privacy_policy_title\">Dasar Privasi NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">Projek NewPipe mengambil perhatian privasi anda dengan sangat serius. Oleh itu, aplikasi tidak mengumpulkan sebarang data tanpa persetujuan anda.\n\\nDasar privasi NewPipe menerangkan secara terperinci apa data dihantar dan disimpan apabila anda menghantar laporan ranap.</string>\n    <string name=\"read_privacy_policy\">Baca dasar privasi</string>\n    <string name=\"app_license_title\">Lesen NewPipe</string>\n    <string name=\"app_license\">NewPipe adalah perisian copyleft percuma: Anda boleh menggunakan, berkongsi kajian dan memperbaikinya mengikut kehendak. Khususnya anda boleh mengagihkan semula dan / atau mengubahnya di bawah syarat GNU General Public License seperti yang diterbitkan oleh Free Software Foundation, sama ada versi 3 dari Lesen, atau (pada pilihan anda) versi yang lebih baru.</string>\n    <string name=\"read_full_license\">Baca lesen</string>\n    <string name=\"title_activity_history\">Sejarah</string>\n    <string name=\"action_history\">Sejarah</string>\n    <string name=\"delete_item_search_history\">Adakah anda mahu memadamkan item ini dari sejarah carian\\?</string>\n    <string name=\"title_last_played\">Terakhir dimainkan</string>\n    <string name=\"title_most_played\">Kebanyakan dimainkan</string>\n    <string name=\"main_page_content\">Kandungan halaman utama</string>\n    <string name=\"main_page_content_summary\">Tab apa yang ditunjukkan pada halaman utama</string>\n    <string name=\"blank_page_summary\">Halaman Kosong</string>\n    <string name=\"kiosk_page_summary\">Halaman Kiosk</string>\n    <string name=\"channel_page_summary\">Halaman Saluran</string>\n    <string name=\"select_a_channel\">Pilih saluran</string>\n    <string name=\"no_channel_subscribed_yet\">Belum ada langganan saluran</string>\n    <string name=\"select_a_kiosk\">Pilih kiosk</string>\n    <string name=\"export_complete_toast\">Dieksport</string>\n    <string name=\"import_complete_toast\">Diimport</string>\n    <string name=\"no_valid_zip_file\">Tiada fail ZIP yang sah</string>\n    <string name=\"could_not_import_all_files\">Amaran: Tidak dapat mengimport semua fail.</string>\n    <string name=\"override_current_data\">Ini akan menimpa tetapan semasa anda.</string>\n    <string name=\"import_settings\">Adakah anda juga mahu mengimport tetapan\\?</string>\n    <string name=\"trending\">Sohor Kini</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Baru &amp; panas</string>\n    <string name=\"conferences\">Persidangan</string>\n    <string name=\"play_queue_remove\">Hapuskan</string>\n    <string name=\"play_queue_stream_detail\">Butiran</string>\n    <string name=\"play_queue_audio_settings\">Tetapan Audio</string>\n    <string name=\"hold_to_append\">Pegang untuk beratur</string>\n    <string name=\"start_here_on_background\">Mula di sini apabila di latar belakang</string>\n    <string name=\"start_here_on_popup\">Mula di sini pada popup baru</string>\n    <string name=\"drawer_open\">Buka Laci</string>\n    <string name=\"drawer_close\">Tutup Laci</string>\n    <string name=\"preferred_open_action_settings_title\">Tindakan \\'buka\\' yang diinginkan</string>\n    <string name=\"preferred_open_action_settings_summary\">Tindakan utama apabila membuka kandungan — %s</string>\n    <string name=\"video_player\">Pemain video</string>\n    <string name=\"background_player\">Pemain latar belakang</string>\n    <string name=\"popup_player\">Pemain popup</string>\n    <string name=\"always_ask_open_action\">Selalu bertanya</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Mendapatkan maklumat…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Memuatkan kandungan yang diminta</string>\n    <string name=\"create_playlist\">Senarai Main Baru</string>\n    <string name=\"rename_playlist\">Namakan semula</string>\n    <string name=\"name\">Nama</string>\n    <string name=\"add_to_playlist\">Tambah ke Senarai Main</string>\n    <string name=\"set_as_playlist_thumbnail\">Tetapkan sebagai Thumbnail Senarai Main</string>\n    <string name=\"bookmark_playlist\">Menanda senarai main</string>\n    <string name=\"unbookmark_playlist\">Hapuskan Penanda Halaman</string>\n    <string name=\"delete_playlist_prompt\">Padamkan senarai main ini\\?</string>\n    <string name=\"playlist_creation_success\">Senarai main dibuat</string>\n    <string name=\"playlist_add_stream_success\">Ditambah ke senarai main</string>\n    <string name=\"playlist_thumbnail_change_success\">Thumbnail senarai main berubah.</string>\n    <string name=\"caption_none\">Tiada Kapsyen</string>\n    <string name=\"resize_fit\">Fit</string>\n    <string name=\"resize_fill\">Isi</string>\n    <string name=\"resize_zoom\">Zum</string>\n    <string name=\"caption_auto_generated\">Dibina secara automatik</string>\n    <string name=\"caption_setting_title\">Kapsyen</string>\n    <string name=\"caption_setting_description\">Ubah suai skala teks kapsyen pemain dan gaya latar belakang. Memerlukan aplikasi dimulakan semula untuk mula berkuatkuasa.</string>\n    <string name=\"enable_leak_canary_summary\">Pemantauan kebocoran memori boleh menyebabkan aplikasinya menjadi tidak bertindak balas semasa heap dumping</string>\n    <string name=\"enable_disposed_exceptions_title\">Laporkan kesilapan out-of-lifecycle</string>\n    <string name=\"enable_disposed_exceptions_summary\">Memaksa pelaporan Rx yang tidak dapat dihantar di luar fragmen atau kitaran hayat aktiviti selepas pelupusan</string>\n    <string name=\"import_title\">Import</string>\n    <string name=\"import_from\">Import dari</string>\n    <string name=\"export_to\">Eksport ke</string>\n    <string name=\"import_ongoing\">Mengimport…</string>\n    <string name=\"export_ongoing\">Mengeksport…</string>\n    <string name=\"import_file_title\">Import fail</string>\n    <string name=\"previous_export\">Eksport terdahulu</string>\n    <string name=\"subscriptions_import_unsuccessful\">Tidak dapat mengimport langganan</string>\n    <string name=\"subscriptions_export_unsuccessful\">Tidak dapat mengeksport langganan</string>\n    <string name=\"import_youtube_instructions\">Import langganan YouTube dengan memuat turun fail eksport:\n\\n\n\\n1. Pergi ke URL ini: %1$s\n\\n2. Log masuk apabila ditanya\n\\n3. Muat turun harus bermula (itulah file eksport)</string>\n    <string name=\"import_soundcloud_instructions\">Import profil SoundCloud dengan menaip sama ada URL atau ID anda:\n\\n\n\\n1. Dayakan \\\"mod desktop\\\" dalam pelayar web (laman web tidak tersedia untuk peranti mudah alih)\n\\n2. Pergi ke URL ini: %1$s\n\\n3. Log masuk apabila ditanya\n\\n4. Salin URL profil yang diarahkan ke.</string>\n    <string name=\"import_soundcloud_instructions_hint\">idAnda, soundcloud.com/idanda</string>\n    <string name=\"import_network_expensive_warning\">Ingatkan bahawa operasi ini boleh menggunakan banyak data.\n\\n\n\\nAdakah anda mahu meneruskan\\?</string>\n    <string name=\"playback_speed_control\">Kawalan Kelajuan Pemain</string>\n    <string name=\"playback_tempo\">Tempo</string>\n    <string name=\"playback_pitch\">Nada</string>\n    <string name=\"unhook_checkbox\">Nyahpaut (mungkin menyebabkan herotan)</string>\n    <string name=\"skip_silence_checkbox\">Cepat ke hadapan semasa berdiam diri</string>\n    <string name=\"playback_step\">Langkah</string>\n    <string name=\"playback_reset\">Tetapkan semula</string>\n    <string name=\"start_accept_privacy_policy\">Untuk mematuhi Peraturan Perlindungan Data Umum Eropah (GDPR), kami dengan ini menarik perhatian anda kepada dasar privasi NewPipe. Sila baca dengan teliti.\n\\nAnda mesti menerimanya untuk menghantar laporan bug kepada kami.</string>\n    <string name=\"accept\">Terima</string>\n    <string name=\"decline\">Tolak</string>\n    <string name=\"limit_data_usage_none_description\">Tiada had</string>\n    <string name=\"limit_mobile_data_usage_title\">Had resolusi apabila menggunakan data mudah alih</string>\n    <string name=\"updates_setting_title\">Kemas kini</string>\n    <string name=\"updates_setting_description\">Tunjukkan pemberitahuan untuk mengemaskini aplikasi apabila versi baru tersedia</string>\n    <string name=\"minimize_on_exit_title\">Kurangkan apabila beralih app</string>\n    <string name=\"minimize_on_exit_summary\">Tindakan apabila beralih ke app lain dari pemain video utama — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Tiada</string>\n    <string name=\"minimize_on_exit_background_description\">Kurangkan ke pemain latar belakang</string>\n    <string name=\"minimize_on_exit_popup_description\">Kurangkan ke pemain popup</string>\n    <string name=\"list_view_mode\">Mod pandangan senarai</string>\n    <string name=\"list\">Senarai</string>\n    <string name=\"grid\">Grid</string>\n    <string name=\"auto\">Auto</string>\n    <string name=\"app_update_available_notification_title\">Kemas kini NewPipe Tersedia!</string>\n    <string name=\"missions_header_finished\">Selesai</string>\n    <string name=\"paused\">dijeda</string>\n    <string name=\"queued\">telah beratur</string>\n    <string name=\"post_processing\">pemprosesan-pasca</string>\n    <string name=\"enqueue\">Beratur</string>\n    <string name=\"permission_denied\">Tindakan ditolak oleh sistem</string>\n    <string name=\"download_failed\">Muat turun gagal</string>\n    <string name=\"generate_unique_name\">Menjana nama yang unik</string>\n    <string name=\"overwrite\">Timpa</string>\n    <string name=\"overwrite_finished_warning\">Fail yang dimuat turun dengan nama ini sudah wujud</string>\n    <string name=\"download_already_running\">Terdapat muat turun yang sedang berjalan dengan nama ini</string>\n    <string name=\"show_error\">Tunjukkan kesilapan</string>\n    <string name=\"error_file_creation\">Fail tidak boleh dibuat</string>\n    <string name=\"error_path_creation\">Folder destinasi tidak boleh dibuat</string>\n    <string name=\"error_ssl_exception\">Sambungan selamat gagal</string>\n    <string name=\"error_unknown_host\">Tidak dapat mencari server</string>\n    <string name=\"error_connect_host\">Tidak dapat menyambung ke server</string>\n    <string name=\"error_http_no_content\">Server tidak menghantar data</string>\n    <string name=\"error_http_unsupported_range\">Server tidak menerima muat turun berbilang thread, cuba lagi dengan @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Tidak ditemui</string>\n    <string name=\"error_postprocessing_failed\">Pemprosesan-pasca gagal</string>\n    <string name=\"stop\">Berhenti</string>\n    <string name=\"max_retry_msg\">Percubaan maksimum</string>\n    <string name=\"max_retry_desc\">Jumlah percubaan maksimum sebelum membatalkan muat turun</string>\n    <string name=\"pause_downloads_on_mobile\">Jeda semasa beralih ke data mudah alih</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Muat turun yang tidak dapat dihentikan akan dimulakan semula</string>\n    <string name=\"missions_header_pending\">Menunggu</string>\n    <string name=\"search_showing_result_for\">Menunjuk carian untuk: %s</string>\n    <plurals name=\"days\">\n        <item quantity=\"other\">%d hari</item>\n    </plurals>\n    <string name=\"open_with\">Buka dengan</string>\n    <plurals name=\"listening\">\n        <item quantity=\"other\">%s pendengar</item>\n    </plurals>\n    <string name=\"subtitle_activity_recaptcha\">Tekan \\\"Selesai\\\" saat selesai</string>\n    <string name=\"done\">Selesai</string>\n    <string name=\"recaptcha_solve\">Selesaikan</string>\n    <string name=\"no_comments\">Tidak ada ulasan</string>\n    <plurals name=\"videos\">\n        <item quantity=\"other\">%s video</item>\n    </plurals>\n    <string name=\"infinite_videos\">∞ video</string>\n    <string name=\"more_than_100_videos\">100+ video</string>\n    <string name=\"no_one_listening\">Tidak ada yang mendengarkan</string>\n    <plurals name=\"watching\">\n        <item quantity=\"other\">%s menonton</item>\n    </plurals>\n    <string name=\"no_one_watching\">Tidak ada yang menonton</string>\n    <string name=\"description_tab_description\">Deskripsi</string>\n    <string name=\"comments_tab_description\">Ulasan</string>\n    <string name=\"error_report_open_github_notice\">Sila periksa jika isu yang sama sudah dilaporkan. Jika laporan anda ternyata sudah ada, anda membuat kami membuang masa yang seharusnya boleh digunakan untuk memperbaiki pepijat yang sebenar.</string>\n    <string name=\"error_report_open_issue_button_text\">Laporkan di GitHub</string>\n    <string name=\"artists\">Artis</string>\n    <string name=\"albums\">Album</string>\n    <string name=\"songs\">Lagu</string>\n    <string name=\"videos_string\">Video</string>\n    <string name=\"restricted_video\">Video ini ada had umur.\n\\n\n\\nAktifkan \\\"%1$s\\\" dalam tetapan jika anda ingin melihatnya.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube menyediakan \\\"Mode Terhad\\\" yang menyembunyikan kandungan dewasa</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Aktifkan \\\"Mod Terhad\\\" YouTube</string>\n    <string name=\"show_age_restricted_content_summary\">Tunjuk kandungan yang mungkin tidak wajar untuk kanak-kanak kerana mempunyai had umur (seperti 18+)</string>\n    <string name=\"unsupported_url_dialog_message\">URL tidak dikenali. Buka dengan aplikasi lain\\?</string>\n    <string name=\"settings_category_clear_data_title\">Kosongkan data</string>\n    <string name=\"show_meta_info_summary\">Matikan untuk menyembunyikan kotak maklumat meta yang mengandungi maklumat tambahan mengenai pencipta, kandungan siaran atau permintaan carian</string>\n    <string name=\"show_description_summary\">Matikan untuk menyembunyikan deskripsi video dan maklumat lanjut</string>\n    <string name=\"show_description_title\">Tunjukkan deskripsi</string>\n    <string name=\"show_comments_summary\">Matikan untuk menyembunyikan ulasan</string>\n    <string name=\"show_comments_title\">Tunjukkan ulasan</string>\n    <string name=\"seek_duration_title\">Tempoh langkauan laju ke hadapan/ke belakang</string>\n    <string name=\"night_theme_title\">Tema malam</string>\n    <string name=\"notification_actions_at_most_three\">Anda hanya boleh memilih sehingga tiga tindakan sahaja untuk dipaparkan dalam pemberitahuan kompak!</string>\n    <string name=\"notification_actions_summary\">Edit setiap tindakan pemberitahuan di bawah dengan mengetiknya. Pilih sehingga tiga tindakan untuk dipaparkan pada pemberitahuan kompak dengan menggunakan kotak semak di sebelah kanan.</string>\n    <string name=\"clear_queue_confirmation_description\">Senarai gilir daripada pemain yang aktif akan digantikan</string>\n    <string name=\"clear_queue_confirmation_summary\">Menukar kepada pemain layar yang lain mungkin akan menggantikan senarai gilir anda</string>\n    <string name=\"clear_queue_confirmation_title\">Minta untuk pengesahan sebelum mengosongkan senarai gilir</string>\n    <string name=\"notification_colorize_title\">Warnakan pemberitahuan</string>\n    <string name=\"notification_action_nothing\">Tiada</string>\n    <string name=\"notification_action_shuffle\">Rombak</string>\n    <string name=\"notification_action_repeat\">Ulang</string>\n    <string name=\"notification_action_4_title\">Butang tindakan kelima</string>\n    <string name=\"notification_action_3_title\">Butang tindakan keempat</string>\n    <string name=\"notification_action_2_title\">Butang tindakan ketiga</string>\n    <string name=\"notification_action_1_title\">Butang tindakan kedua</string>\n    <string name=\"notification_action_0_title\">Butang tindakan pertama</string>\n    <string name=\"overwrite_failed\">tidak boleh tulis ganti fail</string>\n    <string name=\"overwrite_unrelated_warning\">Fail dengan nama yang sama sudah ada</string>\n    <string name=\"dont_show\">Jangan tunjuk</string>\n    <string name=\"unmute\">Nyahbisu</string>\n    <string name=\"notification_colorize_summary\">Biar Android menyesuaikan warna pemberitahuan mengikut warna utama pada lakaran kecil (ambil perhatian bahawa ini tidak tersedia pada semua peranti)</string>\n    <string name=\"autoplay_title\">Auto-main</string>\n    <string name=\"enable_playback_resume_title\">Sambung main</string>\n    <string name=\"error_unable_to_load_comments\">Tidak boleh memuat komentar</string>\n    <string name=\"close\">Tutup</string>\n    <string name=\"metadata_host\">Hos</string>\n    <string name=\"selected_stream_external_player_not_supported\">Strim yang dipilih tidak disokong oleh pemain luaran</string>\n    <string name=\"select_quality_external_players\">Pilih mutu untuk pemain luaran</string>\n    <string name=\"toggle_all\">Togol semua</string>\n    <string name=\"audio_track_present_in_video\">Runut audio seharusnya sudah ada di dalam strim ini</string>\n    <string name=\"select_audio_track_external_players\">Pilih runut audio untuk pemain luaran</string>\n    <string name=\"unknown_format\">Format tidak diketahui</string>\n    <string name=\"unknown_quality\">Mutu tidak diketahui</string>\n    <string name=\"feed_show_watched\">Ditonton sepenuhnya</string>\n    <string name=\"on\">Hidupkan</string>\n    <string name=\"feed_show_partially_watched\">Ditonton secara separa</string>\n    <string name=\"feed_show_upcoming\">Akan datang</string>\n    <string name=\"play\">Main</string>\n    <string name=\"audio_track_type_dubbed\">dialih suara</string>\n    <string name=\"open_play_queue\">Buka baris gilir main</string>\n    <string name=\"share_playlist\">Kongsikan senarai main</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"audio_track_type_secondary\">sekunder</string>\n    <string name=\"show_channel_tabs\">Tab saluran</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Tiada strim audio tersedia untuk pemain luaran</string>\n    <string name=\"streams_not_yet_supported_removed\">Strim yang belum disokong oleh pemuat turun tidak akan ditunjukkan</string>\n    <string name=\"metadata_avatars\">Avatar</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist_content_details\">%1$s\\n%2$s</string>\n    <string name=\"get_notified\">Dapatkan pemberitahuan</string>\n    <string name=\"settings_category_exoplayer_title\">Tetapan ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">Uruskan beberapa tetapan ExoPlayer. Perubahan ini memerlukan pemain dimulakan semula untuk berfungsi</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Gunakan ciri undur penyahkod ExoPlayer</string>\n    <string name=\"unknown_audio_track\">Tidak diketahui</string>\n    <string name=\"duration\">Tempoh</string>\n    <string name=\"metadata_banners\">Sepanduk</string>\n    <string name=\"metadata_privacy_public\">Awam</string>\n    <string name=\"metadata_privacy_unlisted\">Tidak disenaraikan</string>\n    <string name=\"metadata_privacy_private\">Peribadi</string>\n    <string name=\"metadata_privacy_internal\">Dalaman</string>\n    <string name=\"metadata_subscribers\">Pelanggan</string>\n    <string name=\"detail_pinned_comment_view_description\">Ulasan yang dipinkan</string>\n    <string name=\"detail_heart_img_view_description\">Disukai oleh pencipta</string>\n    <string name=\"tablet_mode_title\">Mod tablet</string>\n    <string name=\"off\">Matikan</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">lalai ExoPlayer</string>\n    <string name=\"notifications_disabled\">Pemberitahuan dilumpuhkan</string>\n    <string name=\"you_successfully_subscribed\">Anda kini melanggan saluran ini</string>\n    <string name=\"no_video_streams_available_for_external_players\">Tiada strim video tersedia untuk pemain luaran</string>\n    <string name=\"sort\">Isih</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Sentiasa gunakan penyelesaian tetapan permukaan keluaran video ExoPlayer</string>\n    <string name=\"audio_track_type_original\">asli</string>\n    <string name=\"audio_track_type_descriptive\">perihalan</string>\n    <string name=\"channel_tab_videos\">Video</string>\n    <string name=\"channel_tab_tracks\">Runut</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"channel_tab_livestreams\">Langsung</string>\n    <string name=\"channel_tab_channels\">Saluran</string>\n    <string name=\"channel_tab_playlists\">Senarai main</string>\n    <string name=\"channel_tab_albums\">Album</string>\n    <string name=\"channel_tab_about\">Perihal</string>\n    <string name=\"show_channel_tabs_summary\">Tab apakah yang ditunjukkan pada laman saluran</string>\n    <string name=\"previous_stream\">Strim terdahulu</string>\n    <string name=\"next_stream\">Strim berikutnya</string>\n    <string name=\"replay\">Main semula</string>\n    <string name=\"more_options\">Lebih banyak pilihan</string>\n    <string name=\"image_quality_title\">Mutu imej</string>\n    <string name=\"image_quality_none\">Jangan muatkan imej</string>\n    <string name=\"image_quality_low\">Mutu rendah</string>\n    <string name=\"image_quality_medium\">Mutu sederhana</string>\n    <string name=\"image_quality_high\">Mutu tinggi</string>\n    <string name=\"share_playlist_with_titles\">Kongsi dengan Tajuk</string>\n    <string name=\"share_playlist_with_list\">Kongsi senarai URL</string>\n    <string name=\"show_more\">Tunjukkan lagi</string>\n    <string name=\"show_less\">Tunjukkan kurang</string>\n    <plurals name=\"replies\">\n        <item quantity=\"other\">%s balasan</item>\n    </plurals>\n    <string name=\"metadata_thumbnails\">Lakaran kecil</string>\n    <string name=\"metadata_uploader_avatars\">Avatar pemuat naik</string>\n    <string name=\"metadata_subchannel_avatars\">Avatar saluran kecil</string>\n    <string name=\"yes\">Ya</string>\n    <string name=\"mark_as_watched\">Tandakan sebagai telah ditonton</string>\n    <string name=\"search_with_service_name\">Cari %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Cari %1$s (%2$s)</string>\n    <string name=\"tab_bookmarks_short\">Senarai Main</string>\n    <string name=\"crash_the_player\">Gagalkan pemain</string>\n    <string name=\"notification_scale_to_square_image_title\">Pangkas lakaran kecil kepada nisbah aspek 1:1</string>\n    <string name=\"notification_scale_to_square_image_summary\">Pangkas lakaran kecil video dalam pemberitahuan daripada nisbah 16:9 kepada 1:1</string>\n    <string name=\"notification_actions_summary_android13\">Edit setiap tindakan pemberitahuan di bawah dengan mengetiknya. Tiga tindakan pertama (main/jeda, sebelumnya dan seterusnya) telah ditetapkan oleh sistem dan tidak boleh diubah suai.</string>\n    <string name=\"notification_action_buffering\">Memuatkan</string>\n    <string name=\"progressive_load_interval_title\">Saiz selang muatan main balik</string>\n    <string name=\"progressive_load_interval_summary\">Mengubah saiz selang muatan pada kandungan progresif (kini %s). Nilai yang lebih rendah mungkin dapat mempercepatkan pemuatan awal</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Abaikan isyarat butang media</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Berguna, sebagai contoh, jika anda menggunakan fon kepala dengan butang fizikal yang rosak</string>\n    <string name=\"show_meta_info_title\">Tunjukkan info meta</string>\n    <string name=\"prefer_original_audio_title\">Pilih audio asal</string>\n    <string name=\"prefer_original_audio_summary\">Pilih trek audio asal tanpa mengira bahasa</string>\n    <string name=\"prefer_descriptive_audio_title\">Pilih audio deskriptif</string>\n    <string name=\"prefer_descriptive_audio_summary\">Pilih audio dengan deskripsi untuk golongan kurang upaya penglihatan jika ada</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-my/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"no_player_found_toast\">တိုက်ရိုက်ကြည့်ရန် ပလေယာမရှိပါ(သင်VLCကိုသွင်းနိုင်ပါသည်။)</string>\n    <string name=\"install\">ထည့်သွင်းမည်</string>\n    <string name=\"cancel\">ပယ်ဖျက်ပါ</string>\n    <string name=\"ok\">အဆင်ပြေသည်</string>\n    <string name=\"mark_as_watched\">ကြည့်ပြီးပြီ</string>\n    <string name=\"open_in_popup_mode\">popupပုံစံမှာဖွင့်ပါ</string>\n    <string name=\"download\">ဒေါင်းလုဒ်</string>\n    <string name=\"controls_download_desc\">တိုက်ရိုက်ဖိုင်ကို ဒေါင်းလုဒ်လုပ်မည်</string>\n    <string name=\"upload_date_text\">တင်ခဲ့သည် %1$s</string>\n    <string name=\"no_player_found\">တိုက်ရိုက်ကြည့်ရန် ပလေယာမရှိပါ။VLCသွင်းမလား။</string>\n    <string name=\"yes\">ဟုတ်တယ်</string>\n    <string name=\"no\">မဟုတ်ပါ</string>\n    <string name=\"open_in_browser\">ဒီမီနူးအိုင်တမ်ကဝဘ်ဘရောက်ဇာထဲမှာဗီဒီယိုသို့မဟုတ်အသံဖိုင်ကိုဖွင့်မည်ဖြစ်သည်</string>\n    <string name=\"open_with\">မည်သို့ ဖွင့်မည်ရွေးချယ်ပါ</string>\n    <string name=\"share\">မျှဝေမည်</string>\n    <string name=\"search\">ရှာဖွေရန်</string>\n    <string name=\"settings\">ဆက်တင်များ</string>\n    <string name=\"did_you_mean\">\\\"%1$s\\\" ကိုဆိုလိုသလား။</string>\n    <string name=\"main_bg_subtitle\">စတင်ရန် ဖောက်ထွင်းမှန်ကိုထိပါ။</string>\n    <string name=\"share_dialog_title\">ဖြင့် မျှဝေမည်</string>\n    <string name=\"use_external_video_player_title\">အခြားဗီဒီယိုပလေယာ အားသုံးမည်</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-nap/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"search\">Truova</string>\n    <string name=\"open_in_popup_mode\">Arape comme fenesta popup</string>\n    <string name=\"open_in_browser\">Arape ncopp\\'\\'o browser</string>\n    <string name=\"cancel\">Chiure</string>\n    <string name=\"install\">Installa</string>\n    <string name=\"upload_date_text\">Pubblicato \\'o %1$s</string>\n    <string name=\"download_path_audio_title\">Cartella addo\\' scarrecà \\'e suone</string>\n    <string name=\"download_path_dialog_title\">Sciglie \\'a cartella p\\' \\'e file video</string>\n    <string name=\"download_path_summary\">\\'E video scarrecate so\\' cunservate ccà</string>\n    <string name=\"download_path_title\">Cartella addo\\' scarrecà \\'e video</string>\n    <string name=\"controls_add_to_playlist_title\">Mitte dinto</string>\n    <string name=\"controls_popup_title\">Popup</string>\n    <string name=\"controls_background_title\">Sfundo</string>\n    <string name=\"tab_choose\">Sciglie \\'a scheda</string>\n    <string name=\"tab_bookmarks\">Raccolte salvate</string>\n    <string name=\"tab_subscriptions\">Iscrizzione</string>\n    <string name=\"show_info\">Vire informazione</string>\n    <string name=\"channel_unsubscribed\">Desecritte d\\' \\'o canale</string>\n    <string name=\"use_external_video_player_title\">Utilizze \\'nu lettore video esterno</string>\n    <string name=\"use_external_audio_player_title\">Utilizze \\'nu lettore video esterno</string>\n    <string name=\"subscribed_button_title\">Iscritte</string>\n    <string name=\"unsubscribe\">Desecrivete</string>\n    <string name=\"subscribe_button_title\">Iscrivete</string>\n    <string name=\"use_external_video_player_summary\">Leve l\\'audio cu alcune risuluzioni</string>\n    <string name=\"share_dialog_title\">Condividi cu</string>\n    <string name=\"search_showing_result_for\">Resultati pe\\': %s</string>\n    <string name=\"did_you_mean\">Vulive ricere \\\"%1$s\\\"\\?</string>\n    <string name=\"settings\">Impostazioni</string>\n    <string name=\"controls_download_desc\">Scarica \\'o flusso d\\' \\'o file</string>\n    <string name=\"download\">Scarica</string>\n    <string name=\"share\">Condividi</string>\n    <string name=\"no_player_found_toast\">Nisciuno lettore truvato (può installà VLC p\\' \\'o reprodurre).</string>\n    <string name=\"no_player_found\">Nisciuno lettore truvato. Vuo\\' installà VLC\\?</string>\n    <string name=\"main_bg_subtitle\">Priemme \\\"Truova\\\" p\\'accummencià</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-nb-rNO/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Publisert den %1$s</string>\n    <string name=\"no_player_found\">Fant ingen videostrøm. Installer VLC?</string>\n    <string name=\"install\">Installer</string>\n    <string name=\"cancel\">Avbryt</string>\n    <string name=\"open_in_browser\">Åpne i nettleser</string>\n    <string name=\"share\">Del</string>\n    <string name=\"download\">Last ned</string>\n    <string name=\"search\">Søk</string>\n    <string name=\"settings\">Innstillinger</string>\n    <string name=\"did_you_mean\">Mente du «%1$s»\\?</string>\n    <string name=\"share_dialog_title\">Del med</string>\n    <string name=\"use_external_video_player_title\">Bruk ekstern videoavspiller</string>\n    <string name=\"use_external_audio_player_title\">Bruk ekstern lydavspiller</string>\n    <string name=\"download_path_title\">Video nedlasting mappe</string>\n    <string name=\"download_path_summary\">Nedlastede videofiler lagres her</string>\n    <string name=\"download_path_dialog_title\">Velg nedlastingsmappe for videofiler</string>\n    <string name=\"download_path_audio_title\">Nedlastingsmappe for lyd</string>\n    <string name=\"download_path_audio_summary\">Nedlastede lydfiler lagres her</string>\n    <string name=\"download_path_audio_dialog_title\">Velg nedlastingsmappe for lydfiler</string>\n    <string name=\"default_resolution_title\">Forvalgt oppløsning</string>\n    <string name=\"play_with_kodi_title\">Spill av med Kodi</string>\n    <string name=\"kore_not_found\">Installer manglende Kode-app\\?</string>\n    <string name=\"show_play_with_kodi_title\">Vis \\\"Spill av med Kodi\\\"-valg</string>\n    <string name=\"show_play_with_kodi_summary\">Vis valg for avspilling via Kodi mediasenter</string>\n    <string name=\"play_audio\">Lyd</string>\n    <string name=\"default_audio_format_title\">Forvalgt lydformat</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"dark_theme_title\">Mørk</string>\n    <string name=\"light_theme_title\">Lys</string>\n    <string name=\"download_dialog_title\">Last ned</string>\n    <string name=\"show_next_and_similar_title\">Vis «Neste» og «Lignende» -videoer</string>\n    <string name=\"unsupported_url\">Nettadressen støttes ikke</string>\n    <string name=\"content_language_title\">Forvalgt innholdsspråk</string>\n    <string name=\"settings_category_video_audio_title\">Video og lyd</string>\n    <string name=\"settings_category_appearance_title\">Utseende</string>\n    <string name=\"background_player_playing_toast\">Spiller i bakgrunnen</string>\n    <string name=\"network_error\">Nettverksfeil</string>\n    <string name=\"detail_thumbnail_view_description\">Spill av video, varighet:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Opplasterens avatar</string>\n    <string name=\"detail_likes_img_view_description\">Nikk</string>\n    <string name=\"detail_dislikes_img_view_description\">Nesetrekk</string>\n    <string name=\"main_bg_subtitle\">Trykk på forstørrelsesglasset for å komme i gang.</string>\n    <string name=\"content\">Innhold</string>\n    <string name=\"show_age_restricted_content_title\">Vis aldersbegrenset innhold</string>\n    <string name=\"general_error\">Feil</string>\n    <string name=\"could_not_load_thumbnails\">Kunne ikke laste inn alle miniatyrbilder</string>\n    <string name=\"parsing_error\">Kunne ikke tolke nettside</string>\n    <string name=\"content_not_available\">Innholdet er utilgjengelig</string>\n    <string name=\"could_not_setup_download_menu\">Kunne ikke sette opp nedlastingsmeny</string>\n    <string name=\"sorry_string\">Beklager, dette skal ikke skje.</string>\n    <string name=\"error_report_button_text\">Rapporter via e-post</string>\n    <string name=\"error_snackbar_message\">Beklager, noe gikk galt.</string>\n    <string name=\"error_snackbar_action\">Rapporter</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"what_happened_headline\">Hva skjedde:</string>\n    <string name=\"your_comment\">Din kommentar (på Engelsk):</string>\n    <string name=\"error_details_headline\">Detaljer:</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Prøv igjen</string>\n    <string name=\"duration_live\">Direkte</string>\n    <string name=\"downloads\">Nedlastinger</string>\n    <string name=\"downloads_title\">Nedlastinger</string>\n    <string name=\"error_report_title\">Feilrapport</string>\n    <string name=\"app_ui_crash\">App/brukergrensesnitt krasjet</string>\n    <string name=\"pause\">Pause</string>\n    <string name=\"delete\">Slett</string>\n    <string name=\"checksum\">Sjekksum</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Filnavn</string>\n    <string name=\"msg_threads\">Tråder</string>\n    <string name=\"msg_error\">Feil</string>\n    <string name=\"msg_running\">NewPipe laster ned</string>\n    <string name=\"msg_running_detail\">Trykk for detaljer</string>\n    <string name=\"msg_wait\">Vent…</string>\n    <string name=\"msg_copied\">Kopiert til utklippstavle</string>\n    <string name=\"info_labels\">Hva:\\nForespørsel:\\nInnholdsspråk:\\nInnholdsland:\\nAppspråk:\\nTjeneste:\\nGMT-tid:\\nPakke:\\nVersjon:\\nOS-versjon:</string>\n    <string name=\"start\">Start</string>\n    <string name=\"no_available_dir\">Definer en nedlastingsmappe senere i innstillingene</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA-oppgave</string>\n    <string name=\"open_in_popup_mode\">Åpne i oppsprettsmodus</string>\n    <string name=\"default_popup_resolution_title\">Forvalgt oppsprettsoppløsning</string>\n    <string name=\"show_higher_resolutions_title\">Vis høyere oppløsninger</string>\n    <string name=\"show_higher_resolutions_summary\">Det er bare noen enheter som kan spille 2K-/4K-videoer</string>\n    <string name=\"default_video_format_title\">Forvalgt videoformat</string>\n    <string name=\"black_theme_title\">Svart</string>\n    <string name=\"popup_playing_toast\">Spiller av i oppsprettsmodus</string>\n    <string name=\"all\">Alle</string>\n    <string name=\"disabled\">Avskrudd</string>\n    <string name=\"msg_popup_permission\">Denne tilgangen trengs for\n\\nåpning i oppsprettsmodus</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA-oppgave forespurt</string>\n    <string name=\"use_external_video_player_summary\">Fjerner lyd ved noen oppløsninger</string>\n    <string name=\"subscribe_button_title\">Abonner</string>\n    <string name=\"subscribed_button_title\">Abonnert</string>\n    <string name=\"channel_unsubscribed\">Kanalabonnent oppsagt</string>\n    <string name=\"subscription_change_failed\">Klarte ikke å endre abonnement</string>\n    <string name=\"subscription_update_failed\">Klarte ikke å oppdatere abonnement</string>\n    <string name=\"tab_subscriptions\">Abonnementer</string>\n    <string name=\"fragment_feed_title\">Hva er nytt</string>\n    <string name=\"controls_background_title\">Bakgrunn</string>\n    <string name=\"controls_popup_title\">Oppsprett</string>\n    <string name=\"popup_remember_size_pos_title\">Husk oppsprettsegenskaper</string>\n    <string name=\"popup_remember_size_pos_summary\">Husk siste størrelse og posisjon for oppsprettsvinduet</string>\n    <string name=\"show_search_suggestions_title\">Søkeforslag</string>\n    <string name=\"show_search_suggestions_summary\">Vis søkeforslag ved søk</string>\n    <string name=\"enable_search_history_title\">Søkehistorikk</string>\n    <string name=\"enable_search_history_summary\">Lagre søkemønster lokalt</string>\n    <string name=\"enable_watch_history_title\">Visningshistorikk</string>\n    <string name=\"enable_watch_history_summary\">Lagre visningshistorikk</string>\n    <string name=\"clear\">Tøm</string>\n    <string name=\"best_resolution\">Beste oppløsning</string>\n    <string name=\"notification_channel_name\">NewPipe-merknad</string>\n    <string name=\"notification_channel_description\">Merknad for NewPipe sin avspiller</string>\n    <string name=\"settings_category_downloads_title\">Last ned</string>\n    <string name=\"settings_file_charset_title\">Tillate tegn i filnavn</string>\n    <string name=\"settings_file_replacement_character_summary\">Ugyldige tegn erstattes av denne verdien</string>\n    <string name=\"settings_file_replacement_character_title\">Erstatningstegn</string>\n    <string name=\"charset_letters_and_digits\">Bokstaver og tall</string>\n    <string name=\"charset_most_special_characters\">De fleste spesialtegn</string>\n    <string name=\"title_activity_about\">Om NewPipe</string>\n    <string name=\"title_licenses\">Tredjepartslisenser</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s av %2$s lisensiert %3$s</string>\n    <string name=\"tab_about\">Om og Ofte stilte spørsmål</string>\n    <string name=\"tab_licenses\">Lisenser</string>\n    <string name=\"app_description\">Fri lett strømming på Android.</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Fortsett avspilling</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Fortsett å spille etter avbrytelser (f.eks. telefonsamtaler)</string>\n    <string name=\"settings_category_player_title\">Avspiller</string>\n    <string name=\"settings_category_player_behavior_title\">Oppførsel</string>\n    <string name=\"settings_category_history_title\">Historikk og mellomlagring</string>\n    <string name=\"undo\">Angre</string>\n    <string name=\"search_no_results\">Ingen resultater</string>\n    <string name=\"empty_list_subtitle\">Bare ufisk her</string>\n    <string name=\"no_subscribers\">Ingen abonnenter</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s abonnent</item>\n        <item quantity=\"other\">%s abonnenter</item>\n    </plurals>\n    <string name=\"no_views\">Ingen visninger</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s visning</item>\n        <item quantity=\"other\">%s visninger</item>\n    </plurals>\n    <string name=\"no_videos\">Ingen videoer</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">Én video</item>\n        <item quantity=\"other\">%s videoer</item>\n    </plurals>\n    <string name=\"view_on_github\">Vis på GitHub</string>\n    <string name=\"app_license_title\">NewPipe sin lisens</string>\n    <string name=\"contribution_encouragement\">Hvorvidt du har idéer vedrørende oversettelser, designendringer, koderenskning, eller tunge kodeendringer—hjelp er alltids kjærkommen. Desto mer som gjøres, desto bedre blir det!</string>\n    <string name=\"read_full_license\">Les lisensen</string>\n    <string name=\"contribution_title\">Bidra</string>\n    <string name=\"title_activity_history\">Historikk</string>\n    <string name=\"action_history\">Historikk</string>\n    <string name=\"delete_item_search_history\">Ønsker du å slette dette elementet fra søkehistorikken?</string>\n    <string name=\"play_all\">Spill av alle</string>\n    <string name=\"player_stream_failure\">Kunne ikke spille av denne strømmen</string>\n    <string name=\"player_unrecoverable_failure\">Uopprettelig avspillerfeil oppstod</string>\n    <string name=\"blank_page_summary\">Blank side</string>\n    <string name=\"kiosk_page_summary\">Kiosk-side</string>\n    <string name=\"channel_page_summary\">Kanalside</string>\n    <string name=\"select_a_channel\">Velg en kanal</string>\n    <string name=\"select_a_kiosk\">Velg en kiosk</string>\n    <string name=\"top_50\">Topp 50</string>\n    <string name=\"new_and_hot\">Nytt og hett</string>\n    <string name=\"play_queue_remove\">Fjern</string>\n    <string name=\"play_queue_stream_detail\">Detaljer</string>\n    <string name=\"play_queue_audio_settings\">Lydinnstillinger</string>\n    <string name=\"hold_to_append\">Hold for å legge i kø</string>\n    <string name=\"show_hold_to_append_title\">Vis \\\"Hold for å legge til\\\" -tips</string>\n    <string name=\"show_hold_to_append_summary\">Vis tips når det trykkes på bakgrunnen eller oppsprettsknappen i videoens «Detaljer:»</string>\n    <string name=\"unknown_content\">[Ukjent]</string>\n    <string name=\"player_recoverable_failure\">Gjenoppretter fra spillerfeil</string>\n    <string name=\"main_page_content\">Hovedsidens innhold</string>\n    <string name=\"no_channel_subscribed_yet\">Abonnerer ikke på noen kanaler enda</string>\n    <string name=\"trending\">På vei opp</string>\n    <string name=\"start_here_on_background\">Start avspilling i bakgrunnen</string>\n    <string name=\"start_here_on_popup\">Start avspilling i et oppsprett</string>\n    <string name=\"donation_title\">Doner</string>\n    <string name=\"donation_encouragement\">NewPipe utvikles av frivillige som bruker sin fritid til å gi deg den beste brukeropplevelsen. Gi tilbake for å hjelpe utviklere å gjøre NewPipe enda bedre, mens de nyter en varm kopp kaffe.</string>\n    <string name=\"give_back\">Bidra</string>\n    <string name=\"website_title\">Nettside</string>\n    <string name=\"website_encouragement\">Besøk NewPipe-nettsiden for mer info og nyheter.</string>\n    <string name=\"default_content_country_title\">Forvalgt innholdsland</string>\n    <string name=\"switch_to_background\">Bytt til bakgrunnsmodus</string>\n    <string name=\"switch_to_popup\">Bytt til oppsprettsmodus</string>\n    <string name=\"switch_to_main\">Bytt til hovedmodus</string>\n    <string name=\"drawer_open\">Åpne skuff</string>\n    <string name=\"drawer_close\">Lukk skuff</string>\n    <string name=\"no_player_found_toast\">Ingen strømmespiller installert (du kan installere VLC for å spille den).</string>\n    <string name=\"always\">Alltid</string>\n    <string name=\"just_once\">Kun én gang</string>\n    <string name=\"external_player_unsupported_link_type\">Eksterne avspillere kan ikke spille lenker av disse typene</string>\n    <string name=\"video_streams_empty\">Fant ingen videostrømmer</string>\n    <string name=\"audio_streams_empty\">Fant ingen lydstrømmer</string>\n    <string name=\"video_player\">Videoavspiller</string>\n    <string name=\"background_player\">Bakgrunnsavspiller</string>\n    <string name=\"popup_player\">Oppsprettsavspiller</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Henter informasjon…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Laster forespurt innhold</string>\n    <string name=\"import_data_title\">Importer database</string>\n    <string name=\"export_data_title\">Eksporter database</string>\n    <string name=\"import_data_summary\">Overstyrer din nåværende historikk, abonnementsliste, spillelister og (alternativt) innstillinger</string>\n    <string name=\"export_data_summary\">Eksporter historikk, abonnementer, spillelister og innstillinger</string>\n    <string name=\"export_complete_toast\">Eksportert</string>\n    <string name=\"import_complete_toast\">Importert</string>\n    <string name=\"no_valid_zip_file\">Ingen gyldig ZIP-fil</string>\n    <string name=\"could_not_import_all_files\">ADVARSEL: Kunne ikke importere alle filer.</string>\n    <string name=\"override_current_data\">Dette vil overskrive ditt nåværende oppsett.</string>\n    <string name=\"controls_download_desc\">Last ned strøm-fil</string>\n    <string name=\"show_info\">Vis info</string>\n    <string name=\"tab_bookmarks\">Bokmerkede spillelister</string>\n    <string name=\"controls_add_to_playlist_title\">Legg til i</string>\n    <string name=\"detail_drag_description\">Dra for å omorganisere</string>\n    <string name=\"create\">Opprett</string>\n    <string name=\"dismiss\">Forkast</string>\n    <string name=\"rename\">Gi nytt navn</string>\n    <string name=\"title_last_played\">Sist spilt</string>\n    <string name=\"title_most_played\">Mest spilt</string>\n    <string name=\"always_ask_open_action\">Alltid spør</string>\n    <string name=\"create_playlist\">Ny spilleliste</string>\n    <string name=\"rename_playlist\">Gi nytt navn</string>\n    <string name=\"name\">Navn</string>\n    <string name=\"add_to_playlist\">Legg til i spilleliste</string>\n    <string name=\"set_as_playlist_thumbnail\">Sett som miniatyrbilde for spilleliste</string>\n    <string name=\"bookmark_playlist\">Bokmerk spilleliste</string>\n    <string name=\"unbookmark_playlist\">Fjern bokmerke</string>\n    <string name=\"delete_playlist_prompt\">Slett denne spillelisten\\?</string>\n    <string name=\"playlist_creation_success\">Spilleliste opprettet</string>\n    <string name=\"playlist_add_stream_success\">Lagt til i spilleliste</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniatyrbilde for spilleliste endret.</string>\n    <string name=\"caption_none\">Ingen bildetekster</string>\n    <string name=\"resize_fit\">Tilpass</string>\n    <string name=\"resize_fill\">Fyll</string>\n    <string name=\"resize_zoom\">Forstørr</string>\n    <string name=\"use_inexact_seek_title\">Bruk rask unøyaktig spoling</string>\n    <string name=\"settings_category_debug_title\">Feilsøking</string>\n    <string name=\"file\">Fil</string>\n    <string name=\"invalid_directory\">Ingen slik mappe</string>\n    <string name=\"invalid_source\">Ingen slik fil/innholdskilde</string>\n    <string name=\"invalid_file\">Filen finnes ikke eller så har du ikke tilgang til å lese eller skrive til den</string>\n    <string name=\"file_name_empty_error\">Filnavn kan ikke være tomt</string>\n    <string name=\"error_occurred_detail\">En feil inntraff: %1$s</string>\n    <string name=\"caption_auto_generated\">Autogenerert</string>\n    <string name=\"import_title\">Importer</string>\n    <string name=\"import_from\">Importer fra</string>\n    <string name=\"export_to\">Eksporter til</string>\n    <string name=\"import_ongoing\">Importerer…</string>\n    <string name=\"export_ongoing\">Eksporterer…</string>\n    <string name=\"import_file_title\">Importer fil</string>\n    <string name=\"previous_export\">Forrige eksport</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Bildehurtiglager tømt</string>\n    <string name=\"metadata_cache_wipe_title\">Tøm hurtiglagret metadata</string>\n    <string name=\"metadata_cache_wipe_summary\">Fjern all hurtiglagret nettsidedata</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metadatahurtiglager tømt</string>\n    <string name=\"auto_queue_title\">Sett neste strøm i kø automatisk</string>\n    <string name=\"no_streams_available_download\">Ingen strømmer tilgjengelige for nedlasting</string>\n    <string name=\"preferred_open_action_settings_title\">Foretrukket åpningshandling</string>\n    <string name=\"preferred_open_action_settings_summary\">Forvalgt handling ved åpning av innhold — %s</string>\n    <string name=\"import_soundcloud_instructions_hint\">din-ID, soundcloud.com/dinid</string>\n    <string name=\"import_network_expensive_warning\">Husk at denne handlingen kan belaste nettverket tungt.\n\\n\n\\nØnsker du å fortsette?</string>\n    <string name=\"playback_speed_control\">Fartskontroller for avspilling</string>\n    <string name=\"playback_tempo\">Hastighet</string>\n    <string name=\"playback_pitch\">Tonehøyde</string>\n    <string name=\"clear_views_history_title\">Tøm avspillingshistorikk</string>\n    <string name=\"clear_views_history_summary\">Slett historikken og posisjon for avspilte strømmer</string>\n    <string name=\"delete_view_history_alert\">Slett hele visningshistorikken\\?</string>\n    <string name=\"watch_history_deleted\">Visningshistorikken er slettet</string>\n    <string name=\"clear_search_history_title\">Tøm søkehistorikk</string>\n    <string name=\"clear_search_history_summary\">Sletter historikken for søkte nøkkelord</string>\n    <string name=\"delete_search_history_alert\">Slett hele søkehistorikken\\?</string>\n    <string name=\"search_history_deleted\">Søkehistorikken er slettet</string>\n    <string name=\"one_item_deleted\">Ett element slettet.</string>\n    <string name=\"caption_setting_title\">Undertekster</string>\n    <string name=\"caption_setting_description\">Endre spillerens undertekststørrelse og bakgrunnsstiler. Krever omstart av appen for å tre i kraft</string>\n    <string name=\"app_license\">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.</string>\n    <string name=\"import_settings\">Ønsker du også å importere innstillinger?</string>\n    <string name=\"subscriptions_import_unsuccessful\">Kunne ikke importere abonnementer</string>\n    <string name=\"subscriptions_export_unsuccessful\">Kunne ikke eksportere abonnementer</string>\n    <string name=\"import_youtube_instructions\">Importer YoutTube-abonnementer fra Google takeout:\n\\n\n\\n1. Gå til denne nettadressen: %1$s\n\\n2. Logg inn når forespurt\n\\n3. Klikk på \\\"All data inkludert\\\", så på \\\"Fjern merket for alle\\\", så på kun \\\"Abonnementer\\\", og klikk så \\\"OK\\\"\n\\n4. Klikk på \\\"Neste steg\\\" og så på \\\"Opprett eksport\\\"\n\\n5. Klikk på \\\"Last ned\\\"-knappen etter den vises\n\\n6. Klikk på IMPORTER FIL under og velg den nedlastede .zip filen\n\\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</string>\n    <string name=\"import_soundcloud_instructions\">Importer en SoundCloud-profil ved å skrive enten nettadressen eller din ID:\n\\n\n\\n1. Skru på \\\"skrivebordsmodus\\\" i en nettleser ( siden er ikke tilgjengelig for mobile enheter)\n\\n2. Gå til denne nettadressen: %1$s\n\\n3. Logg inn når forespurt\n\\n4. Kopier profil-nettadressen du ble videresendt til.</string>\n    <string name=\"use_inexact_seek_summary\">Unøyaktig spoling lar spilleren søke posisjoner raskere med redusert presisjon. Å søke i 5, 15 eller 25 sekunder fungerer ikke med dette</string>\n    <string name=\"auto_queue_summary\">Fortsett fullendt (ikke-repeterende) avspillingskø ved å legge til en relatert strøm</string>\n    <string name=\"enable_leak_canary_summary\">Overvåkning av minnelekkasjer kan forårsake at appen ikke svarer under heap dumping</string>\n    <string name=\"enable_disposed_exceptions_title\">Rapporter feil utenfor livssyklusen</string>\n    <string name=\"enable_disposed_exceptions_summary\">Tving rapportering av uleverbare Rx-unntak utenom fragment eller aktivitetslevetid etter forkastelse</string>\n    <string name=\"unhook_checkbox\">Avhekt (kan forårsake forvrenging)</string>\n    <string name=\"privacy_policy_title\">NewPipes personvernspraksis</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke appen inn data uten ditt samtykke.\n\\nNewPipes personvernspraksis forklarer i detalj hvilken data som sendes og lagres når du sender en krasjrapport.</string>\n    <string name=\"read_privacy_policy\">Les personvernspraksis</string>\n    <string name=\"start_accept_privacy_policy\">For å overholde EUs personvernforordning (GDPR), vil vi rette oppmerksomheten din mot NewPipe sin personvernerklæring. Vennligst les den nøye.\n\\nDu må godta den, for å sende oss feilrapporten.</string>\n    <string name=\"accept\">Godta</string>\n    <string name=\"decline\">Avslå</string>\n    <string name=\"limit_data_usage_none_description\">Ubegrenset</string>\n    <string name=\"limit_mobile_data_usage_title\">Begrens oppløsning når mobildata brukes</string>\n    <string name=\"minimize_on_exit_title\">Minimer ved appbytte</string>\n    <string name=\"minimize_on_exit_summary\">Handling ved bytting til annen app fra hovedspiller — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Ingen</string>\n    <string name=\"minimize_on_exit_background_description\">Minimer til bakgrunnsspiller</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimer til oppsprettsspiller</string>\n    <string name=\"channels\">Kanaler</string>\n    <string name=\"playlists\">Spillelister</string>\n    <string name=\"tracks\">Spor</string>\n    <string name=\"users\">Brukere</string>\n    <string name=\"skip_silence_checkbox\">Hurtig foroverspoling ved stillhet</string>\n    <string name=\"playback_step\">Steg</string>\n    <string name=\"playback_reset\">Tilbakestill</string>\n    <string name=\"unsubscribe\">Opphev abonnement</string>\n    <string name=\"tab_choose\">Velg fane</string>\n    <string name=\"settings_category_updates_title\">Oppdateringer</string>\n    <string name=\"events\">Hendelser</string>\n    <string name=\"file_deleted\">Fil slettet</string>\n    <string name=\"app_update_notification_channel_name\">Varsel om appoppdatering</string>\n    <string name=\"app_update_notification_channel_description\">Merknader for nye NewPipe-versjoner</string>\n    <string name=\"download_to_sdcard_error_title\">Ekstern lagring utilgjengelig</string>\n    <string name=\"download_to_sdcard_error_message\">Nedlasting til eksternt SD-kort er ikke mulig. Tilbakestill plassering av nedlastingsmappe\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Kunne ikke leste lagrede faner, så bruker forvalgte</string>\n    <string name=\"restore_defaults\">Gjenopprett forvalg</string>\n    <string name=\"restore_defaults_confirmation\">Ønsker du å gjenopprette forvalg\\?</string>\n    <string name=\"subscribers_count_not_available\">Abonnementsantall utilgjengelig</string>\n    <string name=\"main_page_content_summary\">Hvilke faner vises på hovedsiden</string>\n    <string name=\"conferences\">Konferanser</string>\n    <string name=\"updates_setting_title\">Oppdatering</string>\n    <string name=\"updates_setting_description\">Vis varsel om appoppdatering når en ny versjon er tilgjengelig</string>\n    <string name=\"list_view_mode\">Listevisningsmodus</string>\n    <string name=\"list\">Liste</string>\n    <string name=\"grid\">Rutenett</string>\n    <string name=\"auto\">Automatisk</string>\n    <string name=\"app_update_available_notification_title\">Ny NewPipe-versjon er tilgjengelig!</string>\n    <string name=\"missions_header_finished\">Fullført</string>\n    <string name=\"paused\">pauset</string>\n    <string name=\"queued\">I kø</string>\n    <string name=\"post_processing\">etterbehandling</string>\n    <string name=\"enqueue\">Legg i kø</string>\n    <string name=\"permission_denied\">Handling avvist av systemet</string>\n    <string name=\"download_failed\">Nedlasting mislyktes</string>\n    <string name=\"generate_unique_name\">Generer unikt navn</string>\n    <string name=\"overwrite\">Overskriv</string>\n    <string name=\"overwrite_finished_warning\">Nedlastet fil ved dette navnet finnes allerede</string>\n    <string name=\"download_already_running\">Nedlasting med dette navnet underveis allerede</string>\n    <string name=\"show_error\">Vis feil</string>\n    <string name=\"error_file_creation\">Filen kan ikke opprettes</string>\n    <string name=\"error_path_creation\">Målmappen kan ikke opprettes</string>\n    <string name=\"error_ssl_exception\">Kunne ikke etablere sikker tilkobling</string>\n    <string name=\"error_unknown_host\">Fant ikke tjeneren</string>\n    <string name=\"error_connect_host\">Kan ikke koble til tjeneren</string>\n    <string name=\"error_http_no_content\">Tjeneren sender ikke data</string>\n    <string name=\"error_http_unsupported_range\">Tjeneren godtar ikke flertrådede nedlastinger, prøv igjen med @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Ikke funnet</string>\n    <string name=\"error_postprocessing_failed\">Etterbehandling mislyktes</string>\n    <string name=\"stop\">Stopp</string>\n    <string name=\"max_retry_msg\">Maksimalt antall forsøk</string>\n    <string name=\"max_retry_desc\">Maksimalt antall tilkoblingsforsøk før nedlastingen avblåses</string>\n    <string name=\"pause_downloads_on_mobile\">Pause ved veksling til kvotebasert nett</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Nyttig ved veksling til mobildata, selv om noen nedlastinger ikke kan settes på pause</string>\n    <string name=\"show_comments_title\">Vis kommentarer</string>\n    <string name=\"show_comments_summary\">Skru av for å skjule kommentarer</string>\n    <string name=\"autoplay_title\">Spill av automatisk</string>\n    <string name=\"no_comments\">Ingen kommentarer</string>\n    <string name=\"error_unable_to_load_comments\">Kunne ikke laste inn kommentarer</string>\n    <string name=\"close\">Lukk</string>\n    <string name=\"missions_header_pending\">Venter</string>\n    <string name=\"enable_playback_resume_title\">Gjenoppta avspilling</string>\n    <string name=\"enable_playback_resume_summary\">Fortsett der du slapp</string>\n    <string name=\"enable_playback_state_lists_title\">Posisjon i lister</string>\n    <string name=\"enable_playback_state_lists_summary\">Vis avspillingsposisjonsindikator i lister</string>\n    <string name=\"settings_category_clear_data_title\">Tøm data</string>\n    <string name=\"watch_history_states_deleted\">Avspillingsposisjoner er slettet</string>\n    <string name=\"missing_file\">Fil flyttet eller slettet</string>\n    <string name=\"overwrite_unrelated_warning\">En fil ved dette navnet finnes allerede</string>\n    <string name=\"overwrite_failed\">Kan ikke overskrive filen</string>\n    <string name=\"download_already_pending\">Det finnes en ventende nedlasting ved dette navnet</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe ble lukket under arbeid med filen</string>\n    <string name=\"error_insufficient_storage_left\">Ingen ledig plass på enheten</string>\n    <string name=\"error_progress_lost\">Framdrift gikk tapt, fordi filen ble slettet</string>\n    <string name=\"error_timeout\">Tilkoblingsavbrudd</string>\n    <string name=\"confirm_prompt\">Ønsker du å slette din nedlastingshistorikk eller slette alle nedlastede filer\\?</string>\n    <string name=\"enable_queue_limit\">Begrens nedlastingskø</string>\n    <string name=\"enable_queue_limit_desc\">Én nedlasting av gangen</string>\n    <string name=\"start_downloads\">Start nedlastinger</string>\n    <string name=\"pause_downloads\">Sett nedlastinger på pause</string>\n    <string name=\"downloads_storage_ask_title\">Spør om hvor ting skal lastes ned til</string>\n    <string name=\"downloads_storage_ask_summary\">Du vil bli spurt om hvor hver nedlasting skal plasseres\n\\nAktiver system mappe velgeren (SAF) dersom du vil laste ned til et eksternt SD kort</string>\n    <string name=\"downloads_storage_use_saf_title\">Bruk systemmappevelger (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Lagringstilgangsrammeverk\\' (SAF) tillater nedlasting til et eksternt SD-kort</string>\n    <string name=\"clear_playback_states_title\">Slett avspillingsposisjoner</string>\n    <string name=\"clear_playback_states_summary\">Sletter alle avspillingsposisjoner</string>\n    <string name=\"delete_playback_states_alert\">Slett alle avspillingsposisjoner\\?</string>\n    <string name=\"drawer_header_description\">Skru tjeneste av/på, for tiden er dette status:</string>\n    <string name=\"no_one_watching\">Ingen ser på</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s seer</item>\n        <item quantity=\"other\">%s seere</item>\n    </plurals>\n    <string name=\"no_one_listening\">Ingen lytter</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s lytter</item>\n        <item quantity=\"other\">%s lyttere</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">Standard kiosk</string>\n    <string name=\"peertube_instance_url_title\">PeerTube-instanser</string>\n    <string name=\"local\">Lokal</string>\n    <string name=\"recently_added\">Nylig lagt til</string>\n    <string name=\"most_liked\">Mest likt</string>\n    <string name=\"choose_instance_prompt\">Velg en instans</string>\n    <string name=\"clear_download_history\">Tøm nedlastingshistorikk</string>\n    <string name=\"delete_downloaded_files\">Slett nedlastede filer</string>\n    <string name=\"peertube_instance_url_summary\">Velg dine favoritter blant PeerTube-instansene</string>\n    <string name=\"peertube_instance_url_help\">Finn instansene du liker på %s</string>\n    <string name=\"peertube_instance_add_title\">Legg til instans</string>\n    <string name=\"peertube_instance_add_help\">Skriv inn nettadresse til instans</string>\n    <string name=\"peertube_instance_add_fail\">Kunne ikke bekrefte instans</string>\n    <string name=\"peertube_instance_add_https_only\">Kun HTTPS-nettadresser støttes</string>\n    <string name=\"peertube_instance_add_exists\">Instansen finnes allerede</string>\n    <string name=\"playlist_no_uploader\">Autogenerert (fant ingen opplaster)</string>\n    <string name=\"recovering\">gjenoppretter</string>\n    <string name=\"error_download_resource_gone\">Kan ikke gjenopprette denne nedlastingen</string>\n    <string name=\"seek_duration_title\">Hurtigframoverspoling/-tilbakespolingsvarighet</string>\n    <string name=\"permission_display_over_apps\">Gi tillatelse til å vise over andre apper</string>\n    <string name=\"app_language_title\">Programspråk</string>\n    <string name=\"systems_language\">Systemforvalg</string>\n    <string name=\"subtitle_activity_recaptcha\">Trykk \\\"Ferdig\\\" når den er løst</string>\n    <string name=\"done\">Ferdig</string>\n    <string name=\"videos_string\">Videoer</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekund</item>\n        <item quantity=\"other\">%d sekunder</item>\n    </plurals>\n    <string name=\"mute\">Forstum</string>\n    <string name=\"unmute\">Opphev forstumming</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minutt</item>\n        <item quantity=\"other\">%d minutter</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d time</item>\n        <item quantity=\"other\">%d timer</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dag</item>\n        <item quantity=\"other\">%d dager</item>\n    </plurals>\n    <string name=\"feed_subscription_not_loaded_count\">Ikke innlastet: %d</string>\n    <string name=\"feed_group_dialog_empty_name\">Tomt gruppenavn</string>\n    <string name=\"feed_group_dialog_delete_message\">Ønsker du å slette denne gruppen\\?</string>\n    <string name=\"feed_create_new_group_button_title\">Ny</string>\n    <string name=\"feed_update_threshold_option_always_update\">Alltid oppdater</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d valgt</item>\n        <item quantity=\"other\">%d valgte</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Ingen abonnement valgt</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Velg abonnementer</string>\n    <string name=\"feed_groups_header_title\">Kanalgrupper</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Skru av hurtigmodus</string>\n    <string name=\"feed_update_threshold_title\">Strømoppdateringsterskel</string>\n    <string name=\"settings_category_feed_title\">Strøm</string>\n    <string name=\"feed_processing_message\">Behandler strøm…</string>\n    <string name=\"feed_notification_loading\">Laster inn strøm…</string>\n    <string name=\"feed_oldest_subscription_update\">Strøm sist oppdatert: %s</string>\n    <string name=\"restricted_video\">Denne videoen er aldersbegrenset.\n\\n\n\\nSkru på «%1$s» i innstillingene hvis du vil se den.</string>\n    <string name=\"infinite_videos\">∞ videoer</string>\n    <string name=\"more_than_100_videos\">100+ videoer</string>\n    <string name=\"artists\">Artister</string>\n    <string name=\"albums\">Album</string>\n    <string name=\"songs\">Sanger</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Ja, og delvist sette videoer</string>\n    <string name=\"remove_watched_popup_title\">Fjern sette videoer?</string>\n    <string name=\"remove_watched\">Fjern sette</string>\n    <string name=\"channel_created_by\">Opprettet av %s</string>\n    <string name=\"video_detail_by\">Av %s</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Slå på YouTubes \\\"Begrenset modus\\\"</string>\n    <string name=\"never\">Aldri</string>\n    <string name=\"wifi_only\">Kun på Wi-Fi</string>\n    <string name=\"select_a_playlist\">Velg en spilleliste</string>\n    <string name=\"error_report_open_issue_button_text\">Innrapporter på GitHub</string>\n    <string name=\"auto_queue_toggle\">Automatisk køstilling</string>\n    <string name=\"clear_queue_confirmation_description\">Den aktive spillerkøen blir erstattet</string>\n    <string name=\"clear_queue_confirmation_summary\">Bytte fra en spiller til en annen kan erstatte køen din</string>\n    <string name=\"clear_queue_confirmation_title\">Be om bekreftelse før du tømmer køen</string>\n    <string name=\"search_showing_result_for\">Viser resultater for: %s</string>\n    <string name=\"show_original_time_ago_title\">Vis opprinnelig tidsforskjell for elementer</string>\n    <string name=\"notification_action_buffering\">Bygger mellomlager</string>\n    <string name=\"notification_action_shuffle\">Tilfeldig rekkefølge</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Synes du at strøminnlastingen er for treg\\? Prøv å skru på rask innlasting (du kan endre det i innstillingene, eller ved å trykke på knappen nedenfor).\n\\n\n\\nNewPipe tilbyr to strøminnlastingsstrategier:\n\\n• Hent hele abonnementskanalen, noe som er tregt, men fullstendig.\n\\n• Bruk av et dedikert tjenesteendepunkt, noe som er raskt men vanligvis ikke fullstendig.\n\\n\n\\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\\n\n\\nYouTube er et eksempel på en tjeneste som tilbyr denne raske metoden med sin RSS-informasjonskanal.\n\\n\n\\nValget koker ned til det du foretrekker: hastighet eller presis info.</string>\n    <string name=\"show_original_time_ago_summary\">Originaltekster fra tjenester vil vises for elementer i strømmen</string>\n    <string name=\"error_report_open_github_notice\">Sjekk om det allerede eksisterer et problem som diskuterer ditt krasj. Når du oppretter duplikatbilletter, tar du tid fra oss som vi kan bruke på å fikse den faktiske feilen.</string>\n    <string name=\"notification_actions_at_most_three\">Du kan maksimalt velge tre handlinger som skal vises i kompaktvarselet!</string>\n    <string name=\"notification_actions_summary\">Rediger hver varslingshandling nedenfor ved å trykke på den. Velg opptil tre av dem som skal vises i det kompakte varselet ved å bruke avmerkingsboksene til høyre</string>\n    <string name=\"notification_scale_to_square_image_summary\">Beskjær videominiatyrbildet som vises i varselet fra 16:9 til 1:1 sideforhold (kan føre til forvrengninger)</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Hent fra dedikert strøm når tilgjengelig</string>\n    <string name=\"feed_update_threshold_summary\">Tid siden siste oppdatering før et abonnement vurderes utdatert — %s</string>\n    <string name=\"new_seek_duration_toast\">Som følge av begrensninger i ExoPlayer er blafringsdistansen kun %d sekunder</string>\n    <string name=\"remove_watched_popup_warning\">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!</string>\n    <string name=\"autoplay_summary\">Start avspilling automatisk — %s</string>\n    <string name=\"unsupported_url_dialog_message\">Kunne ikke gjenkjenne angitt nettadresse. Åpne den med et annet program\\?</string>\n    <string name=\"content_not_supported\">Innholdet støttes ikke enda av NewPipe.\n\\n\n\\nStøtte vil forhåpentligvis komme til i en senere versjon.</string>\n    <string name=\"playlist_page_summary\">Spillelisteside</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanalens avatar-miniatyrbilde</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Skru på hurtigmodus</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Vis kun ugrupperte abonnementer</string>\n    <string name=\"title_activity_play_queue\">Spill kø</string>\n    <string name=\"no_playlist_bookmarked_yet\">Ingen spillelistebokmerker enda</string>\n    <string name=\"copy_for_github\">Kopier formatert rapport</string>\n    <string name=\"notification_action_repeat\">Gjenta</string>\n    <string name=\"notification_action_4_title\">Femte handlingstast</string>\n    <string name=\"notification_action_3_title\">Fjerde handlingstast</string>\n    <string name=\"notification_action_2_title\">Tredje handlingstast</string>\n    <string name=\"notification_action_1_title\">Andre handlingstast</string>\n    <string name=\"notification_action_0_title\">Første handlingstast</string>\n    <string name=\"notification_scale_to_square_image_title\">Beskjær miniatyrbildet til sideforholdet 1:1</string>\n    <string name=\"notification_action_nothing\">Ingenting</string>\n    <string name=\"show_memory_leaks\">Vis minnelekkasjer</string>\n    <string name=\"enqueued\">Satt i kø</string>\n    <string name=\"enqueue_stream\">Sett i kø</string>\n    <string name=\"clear_cookie_title\">Tøm reCAPTCHA-kaker</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA-kaker har blitt slettet</string>\n    <string name=\"clear_cookie_summary\">Tøm kaker som NewPipe lagrer når du løser en reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube tilbyr «Begrenset modus» som skjuler innhold antatt å være for voksne</string>\n    <string name=\"show_age_restricted_content_summary\">Vis innhold som muligens er uegnet for barn fordi det har en aldersgrense (som 18+)</string>\n    <string name=\"notification_colorize_summary\">La Android tilpasse varselets farge i henhold til hovedfargen i miniatyrbildet (merk at dette ikke er tilgjengelig på alle enheter)</string>\n    <string name=\"notification_colorize_title\">Fargelegg merknad</string>\n    <string name=\"show_thumbnail_summary\">Bruk miniatyrbilde som bakgrunn for både låseskjerm og merknader</string>\n    <string name=\"show_thumbnail_title\">Vis miniatyrbilde</string>\n    <string name=\"msg_calculating_hash\">Regner ut sjekksum</string>\n    <string name=\"hash_channel_description\">Merknad for videosjekksummeringsframdrift</string>\n    <string name=\"hash_channel_name\">Videosjekksumsmerknad</string>\n    <string name=\"show_meta_info_summary\">Slå av for å skjule metainformasjonsbokser med tilleggsinformasjon om strømskaperen, strøminnhold eller en søkeforespørsel</string>\n    <string name=\"show_meta_info_title\">Vis metainfo</string>\n    <string name=\"recent\">Nylige</string>\n    <string name=\"no_app_to_open_intent\">Ingen programmer på enheten din kan åpne dette</string>\n    <string name=\"chapters\">Kapitler</string>\n    <string name=\"description_tab_description\">Beskrivelse</string>\n    <string name=\"related_items_tab_description\">Relaterte strømmer</string>\n    <string name=\"comments_tab_description\">Kommentarer</string>\n    <string name=\"show_description_summary\">Skru av for å skjule videobeskrivelse og ytterligere info</string>\n    <string name=\"show_description_title\">Vis beskrivelse</string>\n    <string name=\"open_with\">Åpne med</string>\n    <string name=\"crash_the_app\">Krasj programmet</string>\n    <string name=\"restricted_video_no_stream\">Denne videoen er aldersbegrenset.\n\\nSom følge av YouTube sin praksis med slike har ikke NewPipe tilgang til videostrømmene, og kan derfor ikke spille den.</string>\n    <string name=\"paid_content\">Innholdet er kun tilgjengelig for brukere som har betalt, så det kan ikke strømmes eller lastes ned av NewPipe.</string>\n    <string name=\"private_content\">Innholdet er privat, så det kan ikke strømmes eller lastes ned av NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Videoen er kun tilgjengelig for YouTube Music Premium-medlemmer, så den kan ikke strømmes eller lastes ned av NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Dette er et spor fra SoundCloud Go+, ihvertfall i ditt land, så det kan ikke strømmes eller lastes ned av NewPipe.</string>\n    <string name=\"georestricted_content\">Innholdet er ikke tilgjengelig i din region.</string>\n    <string name=\"download_has_started\">Nedlastingen har startet</string>\n    <string name=\"select_night_theme_toast\">Du kan velge ditt favorittnattema nedenfor</string>\n    <string name=\"night_theme_summary\">Velg ditt favorittnattema — %s</string>\n    <string name=\"auto_device_theme_title\">Automatisk (enhetstema)</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"featured\">Framhevet</string>\n    <string name=\"recaptcha_solve\">Løs</string>\n    <string name=\"night_theme_title\">Nattdrakt</string>\n    <string name=\"show_channel_details\">Vis kanaldetaljer</string>\n    <string name=\"disable_media_tunneling_summary\">Skru av media-tunnelering hvis du opplever svart skjerm eller videohakking</string>\n    <string name=\"disable_media_tunneling_title\">Skru av media-tunnelering</string>\n    <string name=\"description_select_note\">Du kan nå velge tekst inne i beskrivelsen. Merk at siden kan flimre og lenker er kanskje ikke klikkbare i utvalgsmodus.</string>\n    <string name=\"feed_load_error_fast_unknown\">Hurtigmodus for informasjonskanal tilbyr ikke mer info om dette.</string>\n    <string name=\"feed_load_error_terminated\">Skaperens konto har blitt terminert.\n\\nNewPipe vil ikke kunne laste inn denne informasjonskanalen i fremtiden.\n\\nØnsker du å oppheve ditt abonnement på denne kanalen\\?</string>\n    <string name=\"description_select_disable\">Skru av merking av tekst i beskrivelsen</string>\n    <string name=\"description_select_enable\">Skru på merking av tekst i beskrivelsen</string>\n    <string name=\"account_terminated\">Konto terminert</string>\n    <string name=\"feed_load_error_account_info\">Kunne ikke laste inn informasjonskanal for «%s».</string>\n    <string name=\"feed_load_error\">Kunne ikke laste inn informasjonskanal</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Fra Android 10 er kun «lagringstilgangsrammeverk» støttet</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Du vil bli spurt om hvor du vil lagre hver nedlastning</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Forhåndsvisning av miniatyrbilde på spolelinjen</string>\n    <string name=\"no_dir_yet\">Ingen nedlastingsmappe er satt ennå, velg en standard nedlastingsmappe nå</string>\n    <string name=\"off\">Av</string>\n    <string name=\"on\">På</string>\n    <string name=\"tablet_mode_title\">Nettbrett-modus</string>\n    <string name=\"open_website_license\">Åpne nettside</string>\n    <string name=\"metadata_privacy_internal\">Intern</string>\n    <string name=\"metadata_privacy_private\">Privat</string>\n    <string name=\"metadata_privacy_unlisted\">Ulistet</string>\n    <string name=\"metadata_privacy_public\">Offentlig</string>\n    <string name=\"metadata_host\">Tjener</string>\n    <string name=\"metadata_support\">Støtte</string>\n    <string name=\"metadata_language\">Språk</string>\n    <string name=\"metadata_age_limit\">Aldersgrense</string>\n    <string name=\"metadata_privacy\">Personvern</string>\n    <string name=\"metadata_licence\">Lisens</string>\n    <string name=\"metadata_tags\">Etiketter</string>\n    <string name=\"metadata_category\">Kategori</string>\n    <string name=\"dont_show\">Ikke vis</string>\n    <string name=\"low_quality_smaller\">Lav kvalitet (mindre)</string>\n    <string name=\"high_quality_larger\">Høy kvalitet (større)</string>\n    <string name=\"comments_are_disabled\">Kommentarer er avskrudd</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Nedlasting fullført</item>\n        <item quantity=\"other\">%s nedlastinger fullført</item>\n    </plurals>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Slettet én nedlastning</item>\n        <item quantity=\"other\">Slettet %1$s nedlastninger</item>\n    </plurals>\n    <string name=\"remote_search_suggestions\">Søkeforslag annensteds fra</string>\n    <string name=\"local_search_suggestions\">Lokale søkeforslag</string>\n    <string name=\"mark_as_watched\">Marker som sett</string>\n    <string name=\"start_main_player_fullscreen_summary\">Ikke start videoer i minispilleren, men bytt til fullskjermsmodus direkte dersom auto-rotering er låst. Du har fremdeles tilgang til minispilleren ved å avslutte fullskjermsvisningen</string>\n    <string name=\"detail_heart_img_view_description\">Hjertemerket av skaperen</string>\n    <string name=\"main_page_content_swipe_remove\">Dra elementer for å fjerne dem</string>\n    <string name=\"start_main_player_fullscreen_title\">Start hovedspiller i fullskjerm</string>\n    <string name=\"enqueue_next_stream\">Still i kø neste</string>\n    <string name=\"enqueued_next\">I kø neste</string>\n    <string name=\"check_for_updates\">Se etter oppdateringer</string>\n    <string name=\"processing_may_take_a_moment\">Behandler … Kan ta sin tid</string>\n    <string name=\"crash_the_player\">Krasj avspilleren</string>\n    <string name=\"show_crash_the_player_title\">Vis \\\"Krasj spilleren\\\"</string>\n    <string name=\"manual_update_description\">Se etter nye versjoner manuelt</string>\n    <string name=\"feed_new_items\">Nye informasjonskanalelementer</string>\n    <string name=\"checking_updates_toast\">Ser etter oppdateringer…</string>\n    <string name=\"show_crash_the_player_summary\">Viser et krasjalternativ ved bruk av avspilleren</string>\n    <string name=\"error_report_notification_toast\">Det oppsto en feil, se varselet</string>\n    <string name=\"detail_pinned_comment_view_description\">Festet kommentar</string>\n    <string name=\"error_report_channel_name\">Feilrapport-merknad</string>\n    <string name=\"error_report_channel_description\">Merknader for innrapportering av feil</string>\n    <string name=\"error_report_notification_title\">NewPipe oppdaget en feil, trykk for å rapportere</string>\n    <string name=\"create_error_notification\">Opprett en feilmerknad</string>\n    <string name=\"show_error_snackbar\">Vis en feil hurtigbar</string>\n    <string name=\"no_appropriate_file_manager_message\">Ingen passende filbehandler ble funnet for denne handlingen.\n\\nVennligst installer en filbehandler, eller prøv å skru av \\'%s\\' i nedlastingsinnstillingene</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Ingen passende filbehandler ble funnet for denne handlingen.\n\\nVennligst installer en Storage Access Framework kompatibel filbehandler</string>\n    <string name=\"leak_canary_not_available\">LeakCanary er ikke tilgjengelig</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer-forvalg</string>\n    <string name=\"progressive_load_interval_title\">Intervallstørrelse for avspillingsinnlasting</string>\n    <string name=\"progressive_load_interval_summary\">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</string>\n    <string name=\"settings_category_player_notification_title\">Spillervarsel</string>\n    <string name=\"notifications\">Varsler</string>\n    <string name=\"streams_notification_channel_name\">Nye strømmer</string>\n    <string name=\"streams_notification_channel_description\">Varsler om nye strømmer for abonnementer</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s ny strøm</item>\n        <item quantity=\"other\">%s nye strømmer</item>\n    </plurals>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"settings_category_player_notification_summary\">Konfigurer varsling for gjeldende avspillingsstrøm</string>\n    <string name=\"percent\">Prosent</string>\n    <string name=\"semitone\">Halvtone</string>\n    <string name=\"selected_stream_external_player_not_supported\">Den valgte strømmen støttes ikke av eksterne spillere</string>\n    <string name=\"loading_stream_details\">Laster inn strømdetaljer…</string>\n    <string name=\"delete_downloaded_files_confirm\">Slett alle nedlastede filer fra harddisken\\?</string>\n    <string name=\"notifications_disabled\">Varsler er deaktivert</string>\n    <string name=\"you_successfully_subscribed\">Du abonnerer nå på denne kanalen</string>\n    <string name=\"streams_not_yet_supported_removed\">Strømmer som ennå ikke er støttet av nedlasteren, vises ikke</string>\n    <string name=\"select_quality_external_players\">Velg kvalitet for eksterne spillere</string>\n    <string name=\"no_video_streams_available_for_external_players\">Ingen videostrømmer er tilgjengelige for eksterne spillere</string>\n    <string name=\"unknown_format\">Ukjent format</string>\n    <string name=\"unknown_quality\">Ukjent kvalitet</string>\n    <string name=\"faq_title\">Ofte stilte spørsmål</string>\n    <string name=\"faq\">Vis på nettsiden</string>\n    <string name=\"check_new_streams\">Start sjekk etter nye strømmer</string>\n    <string name=\"enable_streams_notifications_title\">Varsel om nye strømmer</string>\n    <string name=\"streams_notifications_interval_title\">Hyppighet for sjekk</string>\n    <string name=\"enable_streams_notifications_summary\">Varsle om nye strømmer fra abonnementer</string>\n    <string name=\"streams_notifications_network_title\">Nødvendig nettverkstilkobling</string>\n    <string name=\"any_network\">Et hvilket som helst nettverk</string>\n    <string name=\"get_notified\">Bli varslet</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Ingen lydstrømmer er tilgjengelige for eksterne spillere</string>\n    <string name=\"sort\">Sorter</string>\n    <string name=\"toggle_all\">Velg alle</string>\n    <string name=\"faq_description\">Hvis du har problemer med å bruke appen, så bør du sjekke ut disse svarene fra generelle spørsmål!</string>\n    <string name=\"unset_playlist_thumbnail\">Skru av vedvarende miniatyrbilde</string>\n    <string name=\"night_theme_available\">Dette valget er kun tilgjengelig dersom %s er valgt som tema</string>\n    <string name=\"msg_failed_to_copy\">Klarte ikke å kopiere til utklippstavlen</string>\n    <string name=\"app_update_available_notification_text\">Trykk for å laste ned %s</string>\n    <string name=\"app_update_unavailable_toast\">Du bruker den nyeste versjonen av NewPipe</string>\n    <string name=\"card\">Kort</string>\n    <string name=\"import_subscriptions_hint\">Importer eller eksporter fra trepunktsmenyen</string>\n    <string name=\"fast_mode\">Hurtigmodus</string>\n    <string name=\"duplicate_in_playlist\">Spillelistene som er utgrået inneholder allerede dette elementet.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplikat lagt til %d gang(er)</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorer enhetens fysiske knapper</string>\n    <string name=\"brightness\">Lysstyrke</string>\n    <string name=\"left_gesture_control_summary\">Velg håndvending for venstre halvdel av avspillerskjermen</string>\n    <string name=\"feed_show_watched\">Fullført</string>\n    <string name=\"right_gesture_control_summary\">Velg håndvending for høyre halvdel av avspillerskjermen</string>\n    <string name=\"none\">Ingen</string>\n    <string name=\"remove_duplicates\">Fjern duplikater</string>\n    <string name=\"remove_duplicates_message\">Fjern alle duplikatstrømmer i denne spillelisten\\?</string>\n    <string name=\"feed_show_upcoming\">Kommende</string>\n    <string name=\"left_gesture_control_title\">Venstre håndvendingshandling</string>\n    <string name=\"right_gesture_control_title\">Høyre håndvendingshandling</string>\n    <string name=\"volume\">Lydstyrke</string>\n    <string name=\"remove_duplicates_title\">Fjern duplikater\\?</string>\n    <string name=\"feed_show_hide_streams\">Vis/skjul strømmer</string>\n    <string name=\"feed_show_partially_watched\">Delvis sett</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Nyttig hvis hodsettet ditt har knapper som fungerer dårlig</string>\n    <string name=\"feed_hide_streams_title\">Vis følgende strømmer</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Abonnenter</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_channel_tabs\">Kanalfaner</string>\n    <string name=\"loading_metadata_title\">Laster inn metadata …</string>\n    <string name=\"image_quality_low\">Lav kvalitet</string>\n    <string name=\"feed_fetch_channel_tabs\">Hent kanalfaner</string>\n    <string name=\"metadata_avatars\">Avatarer</string>\n    <string name=\"next_stream\">Neste strøm</string>\n    <string name=\"metadata_subchannel_avatars\">Underkanalavatarer</string>\n    <string name=\"open_play_queue\">Åpne avspillingskø</string>\n    <string name=\"prefer_original_audio_summary\">Velg opprinnelig lydspor uavhengig av språk</string>\n    <string name=\"image_quality_none\">Ikke last inn bilder</string>\n    <string name=\"image_quality_high\">Høy kvalitet</string>\n    <string name=\"channel_tab_about\">Om</string>\n    <string name=\"share_playlist\">Del spilleliste</string>\n    <string name=\"channel_tab_albums\">Album</string>\n    <string name=\"replay\">Gjenta</string>\n    <string name=\"prefer_descriptive_audio_summary\">Velg et lydspor med beskrivelser for synshemmede hvis tilgjengelig</string>\n    <string name=\"image_quality_medium\">Middels kvalitet</string>\n    <string name=\"prefer_descriptive_audio_title\">Foretrekk beskrivende lyd</string>\n    <string name=\"metadata_uploader_avatars\">Opplasteravatarer</string>\n    <string name=\"prefer_original_audio_title\">Foretrekk opprinnelig lyd</string>\n    <string name=\"play_queue_audio_track\">Lyd: %s</string>\n    <string name=\"channel_tab_playlists\">Spillelister</string>\n    <string name=\"audio_track\">Lydspor</string>\n    <string name=\"no_live_streams\">Ingen direktestrømmer</string>\n    <string name=\"play\">Spill av</string>\n    <string name=\"more_options\">Flere alternativer</string>\n    <string name=\"metadata_thumbnails\">Miniatyrbilder</string>\n    <string name=\"channel_tab_tracks\">Spor</string>\n    <string name=\"duration\">Varighet</string>\n    <string name=\"no_streams\">Ingen strømmer</string>\n    <string name=\"channel_tab_channels\">Kanaler</string>\n    <string name=\"previous_stream\">Forrige strøm</string>\n    <string name=\"show_more\">Vis mer</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s svar</item>\n        <item quantity=\"other\">%s svar</item>\n    </plurals>\n    <string name=\"main_tabs_position_summary\">Flytt hovedfanevelgeren til bunnen</string>\n    <string name=\"main_tabs_position_title\">Hovedfaneposisjon</string>\n    <string name=\"channel_tab_videos\">Videoer</string>\n    <string name=\"unknown_audio_track\">Ukjent</string>\n    <string name=\"channel_tab_livestreams\">Direkte</string>\n    <string name=\"rewind\">Spol tilbake</string>\n    <string name=\"forward\">Spol forover</string>\n    <string name=\"image_quality_title\">Bildekvalitet</string>\n    <string name=\"show_less\">Vis mindre</string>\n    <string name=\"share_playlist_with_titles\">Del med titler</string>\n    <string name=\"share_playlist_with_list\">Del nettadresse først</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer-innstillinger</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_descriptive\">beskrivende</string>\n    <string name=\"toggle_fullscreen\">Veksle fullskjermsvising</string>\n    <string name=\"toggle_screen_orientation\">Bytt skjermretning</string>\n    <string name=\"notification_actions_summary_android13\">Rediger hver merknadshandling nedenfor ved å trykke på den. De første tre (spill av/pause, forrige, og neste) kan ikke tilpasses.</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Bruk ExoPlayers dekodings-tilbakefall</string>\n    <string name=\"settings_category_exoplayer_summary\">Håndter noen ExoPlayer-innstillinger. Disse endringeren krever omstart av avspilleren.</string>\n    <string name=\"show_channel_tabs_summary\">Hvilke faner som vises på kanalsidene</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-nds/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "app/src/main/res/values-ne/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">सुरू गर्न \\\"खोज\\\" चिन्ह दबाउनुहोस्</string>\n    <string name=\"upload_date_text\">%1$s मा प्रकाशित</string>\n    <string name=\"no_player_found\">कुनै स्ट्रिम प्लेयर फेला परेन। के तपाईं VLC इन्स्टल गर्न चाहनुहुन्छ\\?</string>\n    <string name=\"no_player_found_toast\">कुनै स्ट्रिम प्लेयर फेला परेन (तपाईँ यसलाई प्ले गर्न VLC इन्स्टल गर्न सक्नुहुन्छ)।</string>\n    <string name=\"install\">इन्स्टल गर्नुहोस्</string>\n    <string name=\"cancel\">रद्द गर्नुहोस्</string>\n    <string name=\"open_in_browser\">ब्राउजरमा खाेल्नुहाेस्</string>\n    <string name=\"open_in_popup_mode\">पपअप मोडमा खोल्नुहोस्</string>\n    <string name=\"share\">साझा गर्नुहोस्</string>\n    <string name=\"download\">डाउनलोड</string>\n    <string name=\"controls_download_desc\">स्ट्रिम् डाउनलोड गर्नुहोस्</string>\n    <string name=\"search\">खोज्नुहोस्</string>\n    <string name=\"settings\">सेटिङ्गहरु</string>\n    <string name=\"did_you_mean\">के तपाईंको मतलब \\\"%1$s\\\" हो\\?</string>\n    <string name=\"share_dialog_title\">साझा गर्नुहोस्</string>\n    <string name=\"use_external_video_player_title\">अन्य भिडियो प्लेयर प्रयोग गर्नुहोस्</string>\n    <string name=\"use_external_video_player_summary\">कुनै भिडियो रेजोलुसनहरुमा अडियो हट्न सक्छ</string>\n    <string name=\"use_external_audio_player_title\">अन्य अडियो प्लेयर प्रयोग गर्नुहोस्</string>\n    <string name=\"subscribe_button_title\">सदस्यता लिनुहोस्</string>\n    <string name=\"subscribed_button_title\">सदस्यता लिईएको</string>\n    <string name=\"unsubscribe\">सदस्यता रद्द गर्नुहोस्</string>\n    <string name=\"channel_unsubscribed\">च्यानल सदस्यता रद्द गरियो</string>\n    <string name=\"subscription_change_failed\">सदस्यता परिवर्तन गर्न सकिएन</string>\n    <string name=\"subscription_update_failed\">सदस्यता अपडेट गर्न सकिएन</string>\n    <string name=\"show_info\">जानकारी देखाउनुहोस्</string>\n    <string name=\"tab_subscriptions\">सदस्यताहरु</string>\n    <string name=\"tab_bookmarks\">बुकमार्क गरिएका प्लेलिस्टहरू</string>\n    <string name=\"tab_choose\">ट्याब छनोट गर्नुहोस्</string>\n    <string name=\"controls_background_title\">पृष्ठभूमि</string>\n    <string name=\"controls_popup_title\">पपअप</string>\n    <string name=\"controls_add_to_playlist_title\">मा थप्नुहोस्</string>\n    <string name=\"download_path_title\">भिडियो डाउनलोड फोल्डर</string>\n    <string name=\"download_path_summary\">डाउनलोड गरिएका भिडियो फाइलहरू यहाँ भण्डारण छन्</string>\n    <string name=\"download_path_dialog_title\">भिडियो फाइलहरूका लागि डाउनलोड फोल्डर चयन गर्नुहोस्</string>\n    <string name=\"download_path_audio_title\">अडियो डाउनलोड फोल्डर</string>\n    <string name=\"download_path_audio_summary\">डाउनलोड गरिएका अडियो फाइलहरू यहाँ भण्डारण छन्</string>\n    <string name=\"download_path_audio_dialog_title\">अडियो फाइलहरूका लागि डाउनलोड फोल्डर चयन गर्नुहोस्</string>\n    <string name=\"default_resolution_title\">पूर्वनिर्धारित रेजोलुसन</string>\n    <string name=\"default_popup_resolution_title\">पूर्वनिर्धारित पपअप रेजोलुसन</string>\n    <string name=\"show_higher_resolutions_title\">उच्च रेजोलुसन देखाउनु</string>\n    <string name=\"show_higher_resolutions_summary\">केवल केही डिभाइसहरू मात्र 2k/4K भिडियो चलाउन सक्छन्</string>\n    <string name=\"play_with_kodi_title\">Kodi सँग चलाउनुहोस्</string>\n    <string name=\"kore_not_found\">\\'Kore\\' एप छैन, इन्स्टल गर्न चाहनुहुन्छ\\?</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi सँग प्ले\\\" विकल्प देखाउनु</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi मिडिया सेन्टर मार्फत भिडियो प्ले गर्न एक विकल्प देखाउनु</string>\n    <string name=\"play_audio\">अडियो</string>\n    <string name=\"default_audio_format_title\">पूर्वनिर्धारित अडियो ढाँचा</string>\n    <string name=\"default_video_format_title\">पूर्वनिर्धारित भिडियो प्रारूप</string>\n    <string name=\"theme_title\">विषय</string>\n    <string name=\"light_theme_title\">प्रकाश</string>\n    <string name=\"dark_theme_title\">गाढा</string>\n    <string name=\"black_theme_title\">कालो</string>\n    <string name=\"popup_remember_size_pos_title\">पपअप आकार र स्थिति सम्झना</string>\n    <string name=\"popup_remember_size_pos_summary\">पछिल्लो आकार र पपअप को स्थिति सम्झना</string>\n    <string name=\"use_inexact_seek_title\">तेज \\'inexact\\' खोज्न प्रयोग गर्नुहोस</string>\n    <string name=\"use_inexact_seek_summary\">\\'Inexact\\' प्लेयर कम सटीक छिटो स्थितिहरू गर्न खोज्न अनुमति दिन्छ खोज्छन्। 5, 15 वा 25 सेकेन्ड को लागि खोजी यो काम गर्दैन।</string>\n    <string name=\"show_comments_title\">टिप्पणीहरू देखाऊ</string>\n    <string name=\"show_comments_summary\">टिप्पणीहरू लुकाउन, बन्द गर्नुहोस</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">छवि क्यास सखाप</string>\n    <string name=\"metadata_cache_wipe_title\">क्यास मेटाडाटा हटाउ</string>\n    <string name=\"metadata_cache_wipe_summary\">सबै क्यास वेबपेज डाटा हटाउ</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">मेटाडाटा क्यास सखाप</string>\n    <string name=\"auto_queue_title\">स्वतः लाम अर्को स्ट्रिम</string>\n    <string name=\"auto_queue_summary\">अन्त्य (गैर-दोहरो) प्लेब्याक लाम सम्बन्धित धारा स्थिति थप्दै जारी राख्न</string>\n    <string name=\"show_search_suggestions_title\">खोज सुझावहरू</string>\n    <string name=\"show_search_suggestions_summary\">खोजी गर्दा सुझावहरू देखाउन</string>\n    <string name=\"enable_search_history_title\">खोज इतिहास</string>\n    <string name=\"enable_search_history_summary\">खोज प्रश्नहरु स्थानीय भण्डारण</string>\n    <string name=\"enable_watch_history_title\">हेरेको इतिहास</string>\n    <string name=\"enable_watch_history_summary\">हेरिएको भिडियो ट्रयाक राख्न</string>\n    <string name=\"resume_on_audio_focus_gain_title\">प्लेयर पुनर्स्थापना गर्नुहोस्</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">रुकावट (जस्तै फोन कल) पछि प्लेयर जारी</string>\n    <string name=\"download_dialog_title\">डाउनलोड</string>\n    <string name=\"autoplay_title\">अटोप्ले</string>\n    <string name=\"show_next_and_similar_title\">\\'अर्को\\' र \\'समान\\' भिडियो देखाउन</string>\n    <string name=\"show_hold_to_append_title\">\\\"होल्ड संलग्न गर्न\\\" टिप देखाउन</string>\n    <string name=\"show_hold_to_append_summary\">पृष्ठभूमि वा भिडियो मा पपअप बटन थिच्दा टिप देखाउन \\\"विवरण:\\\"</string>\n    <string name=\"unsupported_url\">असमर्थित URL</string>\n    <string name=\"default_content_country_title\">पूर्वनिर्धारित सामग्री देश</string>\n    <string name=\"content_language_title\">पूर्वनिर्धारित सामग्री भाषा</string>\n    <string name=\"settings_category_player_title\">प्लेयर</string>\n    <string name=\"settings_category_player_behavior_title\">व्यवहार</string>\n    <string name=\"settings_category_video_audio_title\">भिडियो र अडियो</string>\n    <string name=\"settings_category_history_title\">इतिहास र क्यास</string>\n    <string name=\"settings_category_appearance_title\">रूप</string>\n    <string name=\"settings_category_debug_title\">डिबग</string>\n    <string name=\"settings_category_updates_title\">अपडेट</string>\n    <string name=\"background_player_playing_toast\">पृष्ठभूमिमा प्ले</string>\n    <string name=\"popup_playing_toast\">पपअप मोडमा बजाईदै छ</string>\n    <string name=\"content\">सामग्री</string>\n    <string name=\"show_age_restricted_content_title\">उमेर प्रतिबन्धित सामग्री</string>\n    <string name=\"duration_live\">प्रत्यक्ष</string>\n    <string name=\"downloads\">डाउनलोडहरु</string>\n    <string name=\"downloads_title\">डाउनलोडहरु</string>\n    <string name=\"error_report_title\">त्रुटि रिपोर्ट</string>\n    <string name=\"all\">सबै</string>\n    <string name=\"channels\">च्यानलहरू</string>\n    <string name=\"playlists\">प्लेसूचीहरू</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s भिडियो</item>\n        <item quantity=\"other\">%s भिडियोहरू</item>\n    </plurals>\n    <string name=\"tracks\">ट्रयाकहरु</string>\n    <string name=\"users\">प्रयोगकर्ताहरु</string>\n    <string name=\"events\">घटनाहरू</string>\n    <string name=\"disabled\">अक्षम</string>\n    <string name=\"clear\">स्पष्ट</string>\n    <string name=\"best_resolution\">सर्वश्रेष्ठ रेसोलुशन</string>\n    <string name=\"undo\">पूर्ववत</string>\n    <string name=\"file_deleted\">फाइल मेटिएको</string>\n    <string name=\"play_all\">सबै प्ले</string>\n    <string name=\"always\">सधैं</string>\n    <string name=\"just_once\">केवल एकपटक</string>\n    <string name=\"file\">फाइल</string>\n    <string name=\"notification_channel_name\">NewPipe सूचना</string>\n    <string name=\"notification_channel_description\">NewPipe पृष्ठभूमि र पपअप प्लेयरहरू लागि सूचनाहरू</string>\n    <string name=\"app_update_notification_channel_name\">एप अपडेट सूचना</string>\n    <string name=\"app_update_notification_channel_description\">नयाँ NewPipe संस्करण लागि सूचनाहरू</string>\n    <string name=\"unknown_content\">[अज्ञात]</string>\n    <string name=\"switch_to_background\">पृष्ठभूमि स्विच गर्नुहोस्</string>\n    <string name=\"switch_to_popup\">पपअप स्विच गर्नुहोस्</string>\n    <string name=\"switch_to_main\">मुख्य स्विच गर्नुहोस्</string>\n    <string name=\"import_data_title\">डेटाबेस आयात</string>\n    <string name=\"export_data_title\">डेटाबेस निर्यात</string>\n    <string name=\"import_data_summary\">आफ्नो वर्तमान इतिहास र सदस्यताहरु ओवरराइड गर्छ</string>\n    <string name=\"export_data_summary\">इतिहास निर्यात, सदस्यताहरु र प्लेसूचीहरू</string>\n    <string name=\"clear_views_history_title\">हेरेको इतिहास सखाप</string>\n    <string name=\"clear_views_history_summary\">प्ले प्रवाहको इतिहास र प्लेब्याक स्थान मेटाउँछ</string>\n    <string name=\"delete_view_history_alert\">सम्पूर्ण हेरेको इतिहास मेटाउने\\?</string>\n    <string name=\"clear_search_history_title\">खोज इतिहास हटाऊ</string>\n    <string name=\"clear_search_history_summary\">किवर्ड खोजको इतिहास मेटाउँछ</string>\n    <string name=\"delete_search_history_alert\">सम्पूर्ण खोज इतिहास मेटाउने\\?</string>\n    <string name=\"search_history_deleted\">खोज इतिहास मेटियो।</string>\n    <string name=\"general_error\">त्रुटि</string>\n    <string name=\"download_to_sdcard_error_title\">बाह्य भण्डारण अनउपलब्ध</string>\n    <string name=\"download_to_sdcard_error_message\">बाह्य एस डी कार्ड (SD card) छैन। डाउनलोड फोल्डर स्थान रिसेट गर्ने\\?</string>\n    <string name=\"network_error\">नेटवर्क त्रुटि</string>\n    <string name=\"could_not_load_thumbnails\">सबै थम्बनेल लोड गर्न सकेन</string>\n    <string name=\"parsing_error\">वेबसाइट पार्स गर्न सकिँएन</string>\n    <string name=\"content_not_available\">सामग्री अनउपलब्ध</string>\n    <string name=\"could_not_setup_download_menu\">डाउनलोड मेनु स्थापित गर्न सकिएन</string>\n    <string name=\"app_ui_crash\">अनुप्रयोग / यूआई दुर्घटनाग्रस्त</string>\n    <string name=\"player_stream_failure\">यो धारा बजाउन सकिएन</string>\n    <string name=\"player_unrecoverable_failure\">अपरिवर्तनीय प्लेयर त्रुटि देखा पर्‍यो</string>\n    <string name=\"player_recoverable_failure\">खेलाडी त्रुटि रिकभर गर्दै</string>\n    <string name=\"external_player_unsupported_link_type\">बाह्य प्लायेरहरू यी प्रकारका लिंक समर्थन गर्दैनन</string>\n    <string name=\"video_streams_empty\">कुनै भिडियो प्रवाह फेला परेन</string>\n    <string name=\"audio_streams_empty\">कुनै अडियो स्ट्रिम फेला परेन</string>\n    <string name=\"invalid_directory\">यस्तो कुनै फोल्डर भेटिएन</string>\n    <string name=\"invalid_source\">यस्तो कुनै फाइल / सामग्री स्रोत भेटिएन</string>\n    <string name=\"invalid_file\">फाइल अवस्थित छैन वा पढ्न वा यो लेख्न अनुमति अभाव छ</string>\n    <string name=\"file_name_empty_error\">फाइलको नाम खाली हुन सक्दैन</string>\n    <string name=\"error_occurred_detail\">एउटा त्रुटि देखापर्यो: %1$s</string>\n    <string name=\"no_streams_available_download\">कुनै धाराहरु डाउनलोड गर्न उपलब्ध छैनन्</string>\n    <string name=\"saved_tabs_invalid_json\">बचत गरिएका ट्याबहरू पढ्न सकिएन, पूर्वनिर्धारित प्रयोग गरिदै</string>\n    <string name=\"restore_defaults\">फेरी पहिलाकै अवस्थामा लैजाऊ</string>\n    <string name=\"restore_defaults_confirmation\">तपाईं पूर्वनिर्धारित पुनर्स्थापना गर्न चाहनुहुन्छ\\?</string>\n    <string name=\"sorry_string\">माफ गर्नुहोस्, त्यस्तो हुनु हुँदैनथियो।</string>\n    <string name=\"error_report_button_text\">ई-मेल मार्फत यो त्रुटि रिपोर्ट</string>\n    <string name=\"error_snackbar_message\">माफ गर्नुहोस्, केही त्रुटिहरू भयो।</string>\n    <string name=\"error_snackbar_action\">रिपोर्ट</string>\n    <string name=\"what_device_headline\">जानकारी:</string>\n    <string name=\"what_happened_headline\">के भयो:</string>\n    <string name=\"info_labels\">के:\\nअनुरोध:\\nसामग्री भाषा: \\nसेवा:\\nGMT समय:\\nप्याकेज:\\nसंस्करण: \\nOS संस्करण:</string>\n    <string name=\"your_comment\">तपाईंको टिप्पणी (अंग्रेजी मा):</string>\n    <string name=\"error_details_headline\">विवरण:</string>\n    <string name=\"detail_thumbnail_view_description\">प्ले भिडियो, अवधि:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">अपलोडरको अवतार थम्बनेल</string>\n    <string name=\"detail_likes_img_view_description\">मनपर्दो</string>\n    <string name=\"detail_dislikes_img_view_description\">मन नपर्ने</string>\n    <string name=\"search_no_results\">कुनै परिणामहरु छैनन्</string>\n    <string name=\"empty_list_subtitle\">यहाँ झ्याउँकिरी बाहेक केहि पनि छैन</string>\n    <string name=\"detail_drag_description\">पुन: क्रमबद्ध गर्न तान्नुहोस्</string>\n    <string name=\"video\">भिडियो</string>\n    <string name=\"audio\">अडियो</string>\n    <string name=\"retry\">पुन: प्रयास</string>\n    <string name=\"no_subscribers\">कुनै सदस्यहरू छैनन्</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s सदस्य</item>\n        <item quantity=\"other\">%s सदस्यहरू</item>\n    </plurals>\n    <string name=\"subscribers_count_not_available\">सदस्य संख्या उपलब्ध छैन</string>\n    <string name=\"no_views\">कसैले हेर्नुभएको छैन</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s पटक हेरिएको</item>\n        <item quantity=\"other\">%s पटक हेरिएको</item>\n    </plurals>\n    <string name=\"no_videos\">कुनै भिडियो छैन</string>\n    <string name=\"no_comments\">प्रत्रिक्रिया छैन</string>\n    <string name=\"start\">मिशन</string>\n    <string name=\"pause\">पज</string>\n    <string name=\"create\">सिर्जना</string>\n    <string name=\"delete\">मेटाउन</string>\n    <string name=\"checksum\">चेकसम</string>\n    <string name=\"dismiss\">खारेज</string>\n    <string name=\"rename\">पुनः नामकरण</string>\n    <string name=\"ok\">ठिक छ</string>\n    <string name=\"msg_name\">msg</string>\n    <string name=\"msg_threads\">सूत्रहरू</string>\n    <string name=\"msg_error\">त्रुटि</string>\n    <string name=\"msg_running\">NewPipe डाउनलोड गर्दै</string>\n    <string name=\"msg_running_detail\">विवरण लागि ट्याप गर्नुहोस्</string>\n    <string name=\"msg_wait\">कृपया पर्खनुहोस्…</string>\n    <string name=\"msg_copied\">क्लिपबोर्डमा प्रतिलिपि</string>\n    <string name=\"no_available_dir\">कृपया पछि डाउनलोड फोल्डर सेटिङहरू मा परिभाषित गर्नुहोस</string>\n    <string name=\"msg_popup_permission\">पपअप मोडमा खोल्न\n\\nयो अनुमति आवश्यक छ</string>\n    <string name=\"one_item_deleted\">1 वस्तु हटाइयो।</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA चुनौती अनुरोध</string>\n    <string name=\"settings_category_downloads_title\">डाउनलोड</string>\n    <string name=\"settings_file_charset_title\">फाइलहरुका नाममा वर्ण प्रयोग अनुमति</string>\n    <string name=\"settings_file_replacement_character_summary\">अवैध वर्णलाई यो कुराले प्रतिस्थापन गर्दछ</string>\n    <string name=\"settings_file_replacement_character_title\">प्रतिस्थापन वर्ण</string>\n    <string name=\"charset_letters_and_digits\">अक्षर र अंक</string>\n    <string name=\"charset_most_special_characters\">सबै विशेष वर्णहरु</string>\n    <string name=\"title_activity_about\">न्यू पाइपको बारेमा</string>\n    <string name=\"title_licenses\">तेस्रो-पक्ष इजाजत पत्र</string>\n    <string name=\"copyright\" formatted=\"true\">©%1$s को %2$s द्वारा %3$s अन्तर्गत</string>\n    <string name=\"tab_about\">बारेमा</string>\n    <string name=\"tab_licenses\">लाइसेन्सहरु</string>\n    <string name=\"app_description\">(Android) एन्ड्रोइडमा निःशुल्क लाइटवेट स्ट्रिमिंग।</string>\n    <string name=\"contribution_title\">योगदान</string>\n    <string name=\"contribution_encouragement\">तपाईं को विचार छ कि छैन; अनुवाद, डिजाइन परिवर्तन, कोड सफाई, वा वास्तविक भारी कोड परिवर्तन-मद्दत सधैं छ स्वागत गर्दछौं। अधिक राम्रो यो हुन्छ गरिन्छ!</string>\n    <string name=\"view_on_github\">(GitHub)गिटहबमा हेर्नुहोस्</string>\n    <string name=\"donation_title\">दान</string>\n    <string name=\"donation_encouragement\">(NewPipe)न्यु पाइप तपाईं ल्याउन सबै भन्दा राम्रो प्रयोगकर्ता अनुभव आफ्नो स्वतन्त्र समय खर्च स्वयंसेवकहरु विकास गरिएको छ। NewPipe अझ राम्रो तिनीहरू एक कप कफी आनन्द गर्दा बनाउन मद्दत विकासकर्ताहरूले फिर्ता दिनुहोस्।</string>\n    <string name=\"give_back\">फिर्ता दिनुहोस</string>\n    <string name=\"website_title\">वेबसाइट</string>\n    <string name=\"website_encouragement\">थप जानकारी र समाचार लागि NewPipe वेबसाइट मा जानुहोस्।</string>\n    <string name=\"privacy_policy_title\">NewPipe गोपनीयता नीति</string>\n    <string name=\"privacy_policy_encouragement\">न्यू पाइप परियोजना आफ्नो गोपनीयता धेरै गम्भीरतापूर्वक लिन्छ। तसर्थ, तपाईँको सहमति बिना कुनै पनि डाटा संकलन गर्दैन।\n\\nन्यू पाइपको गोपनीयता नीतिले क्र्यास रिपोर्ट पठाउने बित्तिकै कुन डाटा पठाइएको र भण्डारण गरिएको छ भनेर विस्तृत वर्णन गर्दछ।</string>\n    <string name=\"read_privacy_policy\">गोपनीयता नीति पढ्नुहोस्</string>\n    <string name=\"app_license_title\">NewPipe इजाजत पत्र</string>\n    <string name=\"app_license\">NewPipe copyleft छ मुफ्त सफ्टवेयर: तपाईं प्रयोग गर्न सक्नुहुन्छ, अध्ययन शेयर र इच्छामा सुधार। विशेष तपाईं redistribute गर्न सक्नुहुन्छ र / वा रूपमा फ्री सफ्टवेयर फाउंडेशन द्वारा प्रकाशित GNU जनरल सार्वजनिक लाइसेन्स सर्तहरू अन्तर्गत यो परिमार्जन, कि त लाइसेन्स को संस्करण 3, वा (तपाईँको विकल्प मा) कुनै पनि पछि संस्करण।</string>\n    <string name=\"read_full_license\">लाइसेन्स पढ्नुहोस्</string>\n    <string name=\"title_activity_history\">इतिहास</string>\n    <string name=\"action_history\">इतिहास</string>\n    <string name=\"delete_item_search_history\">तपाईं खोज इतिहासबाट यो वस्तु मेटाउन चाहनुहुन्छ\\?</string>\n    <string name=\"title_last_played\">पछिल्लो पालि खोलिएको</string>\n    <string name=\"title_most_played\">धेरै हेरिएको</string>\n    <string name=\"main_page_content\">मुख्य पृष्ठको सामग्री</string>\n    <string name=\"main_page_content_summary\">मुख्य पृष्ठ मा कुनकुन ट्याबहरू देखाइन्छ</string>\n    <string name=\"blank_page_summary\">खाली पृष्ठ</string>\n    <string name=\"kiosk_page_summary\">(kiosk ) किओस्क पृष्ठ</string>\n    <string name=\"channel_page_summary\">च्यानल पृष्ठ</string>\n    <string name=\"select_a_channel\">एक च्यानल चयन गर्नुहोस्</string>\n    <string name=\"no_channel_subscribed_yet\">अहिलेसम्म कुनै च्यानलको सदस्यता छैन</string>\n    <string name=\"select_a_kiosk\">एक किओस्क चयन</string>\n    <string name=\"export_complete_toast\">निर्यातित</string>\n    <string name=\"import_complete_toast\">आयातित</string>\n    <string name=\"no_valid_zip_file\">कुनै मान्य जिप फाइल भेटिएन</string>\n    <string name=\"could_not_import_all_files\">चेतावनी: सबै फाइलहरू आयात गर्न सकिएन।</string>\n    <string name=\"override_current_data\">तपाइको हालको सेटअप अधिलेखन हुनेछ।</string>\n    <string name=\"import_settings\">तपाईं सेटिङहरू पनि आयात गर्न चाहनुहुन्छ\\?</string>\n    <string name=\"error_unable_to_load_comments\">टिप्पणीहरू लोड गर्न सकिएन</string>\n    <string name=\"trending\">लोकप्रिय</string>\n    <string name=\"top_50\">शीर्ष 50</string>\n    <string name=\"new_and_hot\">नयाँ र तात्तातो</string>\n    <string name=\"conferences\">सम्मेलनहरु</string>\n    <string name=\"play_queue_remove\">हटाउ</string>\n    <string name=\"play_queue_stream_detail\">विवरण</string>\n    <string name=\"play_queue_audio_settings\">अडियो सेटिङहरू</string>\n    <string name=\"hold_to_append\">लामबद्ध गर्न पकड</string>\n    <string name=\"start_here_on_background\">पृष्ठभूमिमा बजाउन सुरु गर्नुहोस</string>\n    <string name=\"start_here_on_popup\">पपअपमा बजाउन सुरु गर्नुहोस</string>\n    <string name=\"drawer_open\">ड्रअर खोल्नुहोस</string>\n    <string name=\"drawer_close\">ड्रअर बन्द</string>\n    <string name=\"preferred_open_action_settings_title\">प्राथमिक \\'खुला\\' कार्य</string>\n    <string name=\"preferred_open_action_settings_summary\">सामग्री खोल्दै गर्दा गरिने पूर्वनिर्धारित कार्य - %s</string>\n    <string name=\"video_player\">भिडियो प्लेयर</string>\n    <string name=\"background_player\">पृष्ठभूमि प्लयेर</string>\n    <string name=\"popup_player\">पपअप प्लयेर</string>\n    <string name=\"always_ask_open_action\">सधैं सोध्न</string>\n    <string name=\"preferred_player_fetcher_notification_title\">जानकारी प्राप्त गर्दै …</string>\n    <string name=\"preferred_player_fetcher_notification_message\">अनुरोध गरिएको सामग्री लोड गर्दै</string>\n    <string name=\"create_playlist\">नया प्लेलिस्ट</string>\n    <string name=\"rename_playlist\">पुनः नामकरण</string>\n    <string name=\"name\">नाम</string>\n    <string name=\"add_to_playlist\">प्लेसूचीमा थप्नुहोस</string>\n    <string name=\"set_as_playlist_thumbnail\">प्लेलिस्ट थम्बनेल रूपमा सेट</string>\n    <string name=\"bookmark_playlist\">बुकमार्क प्लेलिस्ट</string>\n    <string name=\"unbookmark_playlist\">बुकमार्क हटाउ</string>\n    <string name=\"delete_playlist_prompt\">यो प्लेसूची मेटाउने\\?</string>\n    <string name=\"playlist_creation_success\">प्लेलिस्ट सिर्जना गरियो</string>\n    <string name=\"playlist_add_stream_success\">प्लेसुचीमा राखियो</string>\n    <string name=\"playlist_thumbnail_change_success\">प्लेसूची थम्बनेल परिवर्तन भयो।</string>\n    <string name=\"caption_none\">कुनै क्याप्शन छैन</string>\n    <string name=\"resize_fit\">फिट</string>\n    <string name=\"resize_fill\">भर्न</string>\n    <string name=\"resize_zoom\">जुम</string>\n    <string name=\"caption_auto_generated\">स्वतः उत्पन्न</string>\n    <string name=\"caption_setting_title\">क्याप्सनहरु</string>\n    <string name=\"caption_setting_description\">प्लायेरको क्याप्सन आकार मात्रा र पृष्ठभूमि शैलीहरू परिवर्तन। प्रभाव लागु हुन एप पुन: सुरु गर्न आवश्यक छ।</string>\n    <string name=\"enable_leak_canary_summary\">मेमोरी लिक अनुगमनका कारण हिप डम्पिङ्ग (heap dumping) गर्दा एप अडकिन सक्छ</string>\n    <string name=\"enable_disposed_exceptions_title\">बाहिर-को-जीवनचक्र त्रुटिहरू रिपोर्ट गर</string>\n    <string name=\"enable_disposed_exceptions_summary\">शक्ति निपटान पछि खण्ड वा गतिविधि जीवनचक्र को undeliverable Rx अपवाद बाहिर को रिपोर्ट</string>\n    <string name=\"import_title\">आयात</string>\n    <string name=\"import_from\">आयात</string>\n    <string name=\"export_to\">निर्यात</string>\n    <string name=\"import_ongoing\">आयात गर्दै …</string>\n    <string name=\"export_ongoing\">निर्यात गर्दै …</string>\n    <string name=\"import_file_title\">फाइल आयात</string>\n    <string name=\"previous_export\">अघिल्लो निर्यात</string>\n    <string name=\"subscriptions_import_unsuccessful\">सदस्यताहरु आयात गर्न सकिएन</string>\n    <string name=\"subscriptions_export_unsuccessful\">सदस्यताहरु निर्यात गर्न सकेन</string>\n    <string name=\"import_youtube_instructions\">निर्यात फाइल डाउनलोड गरेर यूट्यूब सदस्यताहरू आयात गर्नुहोस्: \n\\n \n\\n1. जानुहोस् यो URL:%1$s \n\\n2. सोधिएको बेलामा लग इन गर्नुहोस् \n\\n3. एउटा डाउनलोड सुरु हुनुपर्दछ (त्यो निर्यात फाईल हो)</string>\n    <string name=\"import_soundcloud_instructions\">या त URL वा तपाईंको ID टाइप गरेर साउन्डक्लाउड(SoundCloud) प्रोफाइल आयात गर्नुहोस्:\n\\n\n\\n1. वेब ब्राउजरमा \\\"डेस्कटप मोड\\\" सक्षम गर्नुहोस् (साइट मोबाइल उपकरणहरूको लागि उपलब्ध छैन)\n\\n2. यस URL:%1$s मा जानुहोस्\n\\n3. सोधिएको बेलामा लग इन गर्नुहोस्\n\\n4. तपाईंलाई URL मा निर्देशित गरिएको प्रोफाइल URL प्रतिलिपि गर्नुहोस्।</string>\n    <string name=\"import_soundcloud_instructions_hint\">yourID, soundcloud.com/youridyourID, soundcloud.com/yourid</string>\n    <string name=\"import_network_expensive_warning\">दिमागमा राख्नुहोस् यो अपरेशन नेटवर्क महँगो हुन सक्छ।\n\\n\n\\nतपाईँ जारी राख्न चाहनुहुन्छ\\?</string>\n    <string name=\"playback_speed_control\">प्लेब्याक परिमिति</string>\n    <string name=\"playback_tempo\">टेम्पो</string>\n    <string name=\"playback_pitch\">पिच</string>\n    <string name=\"unhook_checkbox\">Unhook (विकृति उत्पन्न हुन सक्छ)</string>\n    <string name=\"skip_silence_checkbox\">मौन समयमा छिटो-फर्वार्ड</string>\n    <string name=\"playback_step\">चरण</string>\n    <string name=\"playback_reset\">रिसेट</string>\n    <string name=\"start_accept_privacy_policy\">यूरोपीय सामान्य डाटा संरक्षण नियमन (GDPR) अनुपालन गर्न, हामी हर्बी न्यूपिपको गोपनीयता नीतिमा तपाईंको ध्यान आकर्षित गर्दछौं। कृपया यसलाई ध्यानपूर्वक पढ्नुहोस्।\n\\nतपाईंले हामीलाई बग रिपोर्ट पठाउन यसलाई स्वीकार्नुपर्दछ।</string>\n    <string name=\"accept\">स्वीकार</string>\n    <string name=\"decline\">अस्वीकार</string>\n    <string name=\"limit_data_usage_none_description\">असीमित</string>\n    <string name=\"limit_mobile_data_usage_title\">मोबाइल डाटा प्रयोग गर्दा रिजोलुशन सिमित गर</string>\n    <string name=\"updates_setting_title\">अपडेटहरु</string>\n    <string name=\"updates_setting_description\">नयाँ संस्करण उपलब्ध हुने बित्तिकै शीघ्र एप अपडेट गर्न एक सूचना देखाउ</string>\n    <string name=\"minimize_on_exit_title\">अन्य एपमा जादा सानो बनाउ</string>\n    <string name=\"minimize_on_exit_summary\">मुख्य भिडियो प्लेयरबाट अन्य ऐपहरुमा जादा गरिने कार्य -%s</string>\n    <string name=\"minimize_on_exit_none_description\">केहि पनि नगर</string>\n    <string name=\"minimize_on_exit_background_description\">पृष्ठभूमि प्लयेरमा मिनिमाइज गर</string>\n    <string name=\"minimize_on_exit_popup_description\">पपअप प्लयेरमा मिनिमाइज गर</string>\n    <string name=\"list_view_mode\">सूची दृश्य मोड</string>\n    <string name=\"list\">सूची</string>\n    <string name=\"grid\">ग्रिड</string>\n    <string name=\"auto\">स्वतः</string>\n    <string name=\"app_update_available_notification_title\">NewPipe अपडेट उपलब्ध छ!</string>\n    <string name=\"missions_header_finished\">समाप्त</string>\n    <string name=\"missions_header_pending\">रोकिएको</string>\n    <string name=\"paused\">पज</string>\n    <string name=\"queued\">लामबद्ध</string>\n    <string name=\"post_processing\">पोस्ट-प्रक्रिया</string>\n    <string name=\"enqueue\">लाम</string>\n    <string name=\"permission_denied\">कार्य प्रणाली द्वारा अस्वीकार</string>\n    <string name=\"download_failed\">डाउनलोड असफल भयो</string>\n    <string name=\"generate_unique_name\">एउटा छुट्टै अलग नाम पैदा गर</string>\n    <string name=\"overwrite\">अधिलेखन</string>\n    <string name=\"download_already_running\">यसै नाम सितको एक डाउनलोड प्रगतिमा छ</string>\n    <string name=\"show_error\">डाउनलोड त्रुटि बारेमा सन्देश संवाद</string>\n    <string name=\"error_path_creation\">गन्तव्य फोल्डर सिर्जना गर्न सकिँदैन</string>\n    <string name=\"error_file_creation\">फाइल सिर्जना गर्न सकिँदैन</string>\n    <string name=\"error_ssl_exception\">सुरक्षित जडान स्थापना गर्न सकिएन</string>\n    <string name=\"error_unknown_host\">सर्भर फेला पार्न सकिएन</string>\n    <string name=\"error_connect_host\">सर्भर जडान गर्न सक्दैन</string>\n    <string name=\"error_http_no_content\">सर्भर डाटा पठाउदैन</string>\n    <string name=\"error_http_unsupported_range\">सर्भर बहु-थ्रेड डाउनलोड स्वीकार गर्दैन @string/msg_threads = 1 प्रयोग गरि पुन प्रयास गर्नुहोस</string>\n    <string name=\"error_http_not_found\">फेला परेन</string>\n    <string name=\"error_postprocessing_failed\">पोस्ट-प्रक्रिया असफल भयो</string>\n    <string name=\"stop\">रोक</string>\n    <string name=\"max_retry_msg\">अधिकतम पुनःप्रयासकोसङ्ख्या</string>\n    <string name=\"max_retry_desc\">डाउनलोड रद्द अघि प्रयासहरूको अधिकतम संख्या</string>\n    <string name=\"pause_downloads_on_mobile\">मीटर गरिएको नेटमा रोक</string>\n    <string name=\"pause_downloads_on_mobile_desc\">मोबाइल डेटामा स्विच गर्दा उपयोगी, हालाकी केही डाउनलोडहरु निलम्बित हुन सक्दैनन</string>\n    <string name=\"close\">बन्द</string>\n    <string name=\"enable_playback_resume_title\">प्लेब्याक पुनःसुरु गर्नुहोस्</string>\n    <string name=\"enable_playback_resume_summary\">पछिल्लो प्लेब्याक स्थिति पुनर्स्थापना गर्नुहोस्</string>\n    <string name=\"enable_playback_state_lists_title\">सूचीमा स्थान</string>\n    <string name=\"enable_playback_state_lists_summary\">सूची मा प्लेब्याक स्थिति संकेतक देखाउन</string>\n    <string name=\"settings_category_clear_data_title\">डाटा सखाप पार्नुहोस</string>\n    <string name=\"watch_history_deleted\">हेरिएको इतिहास हटाइयो।</string>\n    <string name=\"watch_history_states_deleted\">प्लेब्याक स्थानहरु हटाइयो।</string>\n    <string name=\"missing_file\">फाइल सारियो वा मेटिएको</string>\n    <string name=\"overwrite_unrelated_warning\">यो नामको फाइल पहिल्यै अवस्थित छ</string>\n    <string name=\"overwrite_finished_warning\">यो नाम सितको डाउनलोड गरिएको फाइल पहिले नै अवस्थित छ</string>\n    <string name=\"overwrite_failed\">फाइल अधिलेखन गर्न सकिएन</string>\n    <string name=\"download_already_pending\">यसै नाम सितको एक फाइल डाउनलोड हुने प्रक्रियामा छ</string>\n    <string name=\"error_postprocessing_stopped\">फाइल मा काम गर्दा NewPipe बन्द भएको थियो</string>\n    <string name=\"error_insufficient_storage_left\">उपकरणमा कुनै ठाउँ बाकी छैन</string>\n    <string name=\"error_progress_lost\">प्रगति हरायो, किनभने फाइल मेटिएको थियो</string>\n    <string name=\"error_timeout\">जडान समय सकियो</string>\n    <string name=\"confirm_prompt\">तपाईं आफ्नो डाउनलोड इतिहास वा डाउनलोड फाइल मेटाउन चाहनुहुन्छ\\?</string>\n    <string name=\"enable_queue_limit\">डाउनलोड लामको सीमा</string>\n    <string name=\"enable_queue_limit_desc\">एक डाउनलोड एकै समयमा चालू हुनेछ</string>\n    <string name=\"start_downloads\">डाउनलोडहरु सुरु</string>\n    <string name=\"pause_downloads\">डाउनलोडहरु पज</string>\n    <string name=\"downloads_storage_ask_title\">डाउनलोड कहाँ गर्ने सोध</string>\n    <string name=\"downloads_storage_ask_summary\">प्रत्येक डाउनलोड कहाँ सेव गर्ने भनि आग्रह गरिनेछ</string>\n    <string name=\"downloads_storage_use_saf_title\">साफ (SAF) प्रयोग</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'भण्डारण पहुँच फ्रेमवर्क\\' बाह्य एसडी कार्डमा डाउनलोड गर्न अनुमति दिन्छ।\n\\nकेहि उपकरणहरू असंगत छन्</string>\n    <string name=\"clear_playback_states_title\">प्लेब्याक स्थान मेटाउ</string>\n    <string name=\"clear_playback_states_summary\">सबै प्लेब्याक स्थानहरु मेटाउँछ</string>\n    <string name=\"delete_playback_states_alert\">सबै प्लेब्याक स्थान मेटाउने\\?</string>\n    <string name=\"drawer_header_description\">सेवा टगल गर्नुहोस्, हाल चयन गरिएको:</string>\n    <string name=\"no_one_watching\">कसैले हेर्दै हुनुहुँदैन</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s जना हेर्दै हुनुहुन्छ</item>\n        <item quantity=\"other\">%s जना हेर्दै हुनुहुन्छ</item>\n    </plurals>\n    <string name=\"no_one_listening\">कसैले सुन्दै हुनुहुन्न</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s श्रोता</item>\n        <item quantity=\"other\">%s श्रोताहरु</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">पूर्वनिर्धारित किओस्क (Kiosk)</string>\n    <string name=\"seek_duration_title\">छिटो-अगाडि /-पछाडी खोज्न अवधि</string>\n    <string name=\"peertube_instance_url_title\">PeerTube उदाहरणहरू</string>\n    <string name=\"peertube_instance_url_summary\">आफ्नो मनपर्ने PeerTube उदाहरणहरू चयन</string>\n    <string name=\"peertube_instance_url_help\">%s मा तपाईंलाई मनपर्ने ईन्स्टान्सहरू फेला पार्नुहोस्</string>\n    <string name=\"peertube_instance_add_title\">उदाहरण थप्नुहोस्</string>\n    <string name=\"peertube_instance_add_help\">उदाहरणका URL प्रविष्ट गर्नुहोस्</string>\n    <string name=\"peertube_instance_add_fail\">उदाहरणका मान्य सकेन</string>\n    <string name=\"peertube_instance_add_https_only\">HTTPS URL हरू मात्र समर्थित</string>\n    <string name=\"peertube_instance_add_exists\">उदाहरणका पहिले नै अवस्थित</string>\n    <string name=\"local\">स्थानिय</string>\n    <string name=\"recently_added\">हालसालै थपिएको</string>\n    <string name=\"most_liked\">सबैभन्दा धेरै मनपराइएको</string>\n    <string name=\"playlist_no_uploader\">स्वतः उत्पन्न (कुनै अपलोडर भेटिएन)</string>\n    <string name=\"recovering\">पुन (recovering)</string>\n    <string name=\"error_download_resource_gone\">यो डाउनलोड पुन:प्राप्त गर्न सकिँदैन</string>\n    <string name=\"choose_instance_prompt\">एउटा उदाहरण छनौट गर्नुहोस्</string>\n    <string name=\"clear_download_history\">डाउनलोड इतिहास मेटाउ</string>\n    <string name=\"delete_downloaded_files\">डाउनलोड गरिएका फाइलहरु मेटाउ</string>\n    <string name=\"permission_display_over_apps\">अन्य अनुप्रयोगहरूमा प्रदर्शन गर्न अनुमति दिने</string>\n    <string name=\"app_language_title\">एप्सको भाषा</string>\n    <string name=\"systems_language\">सिस्टम पूर्वनिर्धारित</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA चुनौती</string>\n    <string name=\"subtitle_activity_recaptcha\">प्रेस हल गर्दा \\\"डन\\\"</string>\n    <string name=\"done\">सकियो</string>\n    <string name=\"videos_string\">भिडियोहरु</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d सेकेन्ड</item>\n        <item quantity=\"other\">%d सेकेन्ड</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">ExoPlayer अवरोधका कारण खोजी अवधि %d सेकेन्डमा सेट गरियो</string>\n    <string name=\"mute\">म्युट</string>\n    <string name=\"unmute\">ध्वनि सुचारु</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">के तपाईलाई लाग्छ फिड लोडि एकदम ढिलो छ\\? यदि हो भने, छिटो लोडिङ् सक्षम गर्न प्रयास गर्नुहोस् (तपाईं यसलाई सेटिंङ्हरूमा वा तलको बटन थिचेर बदल्न सक्नुहुन्छ)।\n\\n\n\\nनयाँ पाइपले दुई फिड लोड गर्ने रणनीति प्रदान गर्दछ:\n\\nसम्पूर्ण सदस्यता च्यानल ल्याउँदै, जुन ढिलो तर पूरा छ।\n\\nएक समर्पित सेवा अन्तिम पोइन्ट प्रयोग गर्दै, जुन छिटो छ तर सामान्यतया पूरा हुँदैन।\n\\n\n\\nदुई बीचको भिन्नता यो छ कि द्रुत गतिमा सामान्यतया केही जानकारीको अभाव हुन्छ, जस्तै वस्तुको अवधि वा प्रकार (प्रत्यक्ष भिडियोहरू र सामान्य बिचमा भिन्नता लिन सक्दैन) र यसले कम वस्तुहरू फिर्ता गर्न सक्छ।\n\\n\n\\n(YouTube) युटुब एक सेवाको उदाहरण हो जुन यस आरएसएस फिडको साथ यो द्रुत विधि प्रदान गर्दछ।\n\\n\n\\nत्यसो भए छनौटमा तपाईको प्राथमिकतामा निर्भर छ: गति वा सटीक जानकारी।</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">द्रुत मोड असक्षम गर्नुहोस्</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">फास्ट मोड सक्षम पार्नुहोस्</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">केहि सेवाहरूमा उपलब्ध छ, यो प्राय: धेरै छिटो हुन्छ तर सीमित वस्तुहरू र अक्सर अपूर्ण जानकारी फिर्ता गर्न सक्दछ (उदाहरणका लागि कुनै अवधि, वस्तुको प्रकार, कुनै लाइभ स्थिति)।</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">जब उपलब्ध हुन्छ समर्पित फिडबाट अपडेट गर्नुहोस</string>\n    <string name=\"feed_update_threshold_option_always_update\">सँधै अपडेट गर्नुहोस्</string>\n    <string name=\"feed_update_threshold_summary\">पछिल्लो अपडेट पछिको समय अबधी जस पछि फिड पुरानो भएको मानिन्छ — %s</string>\n    <string name=\"feed_update_threshold_title\">फिड अपडेट अबधि</string>\n    <string name=\"settings_category_feed_title\">फिड</string>\n    <string name=\"feed_create_new_group_button_title\">नयाँ</string>\n    <string name=\"feed_group_dialog_delete_message\">के तपाइँ यो समूह हटाउन चाहानुहुन्छ\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">समूहको नाम खाली गर</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d चयन</item>\n        <item quantity=\"other\">%d चयन</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">कुनै सदस्यता चयन गरिएको छैन</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">सदस्यताहरू चयन गर्नुहोस्</string>\n    <string name=\"feed_processing_message\">फिड प्रशोधन गर्दै …</string>\n    <string name=\"feed_notification_loading\">फिड लोड गर्दै …</string>\n    <string name=\"feed_subscription_not_loaded_count\">लोड गरिएको छैन:%d</string>\n    <string name=\"feed_oldest_subscription_update\">फिड पछिल्लोपटक अपडेट गरिएको:%s</string>\n    <string name=\"feed_groups_header_title\">च्यानल समूहहरू</string>\n    <string name=\"fragment_feed_title\">नयाँ के छ</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d घण्टा</item>\n        <item quantity=\"other\">%d घण्टा</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d दिन</item>\n        <item quantity=\"other\">%d दिनहरु</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d मिनेट</item>\n        <item quantity=\"other\">%d मिनेट</item>\n    </plurals>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">च्यानल अवतार थम्बनेल</string>\n    <string name=\"remove_watched_popup_warning\">भिडियोहरू जुन प्लेलिस्टमा थपिनु अघि र पछि हेरिएको थियो हटाइनेछ। \\n… \\n के तपाईँ निश्चित हुनुहुन्छ? यो उल्ट्याउन सकिदैन!</string>\n    <string name=\"remove_watched_popup_title\">हेरिएका भिडियोहरू हटाउने हो?</string>\n    <string name=\"remove_watched\">हेरिसकेको हटाउनुहोस</string>\n    <string name=\"show_original_time_ago_summary\">सेवाहरूबाट मूल पाठहरू स्ट्रिम वस्तुहरूमा देखिने छन्</string>\n    <string name=\"show_original_time_ago_title\">आईटमहरूमा मूल समय पहिले देखाउनुहोस्</string>\n    <string name=\"infinite_videos\">अनगिन्ति भिडियोहरू</string>\n    <string name=\"more_than_100_videos\">१००+ भिडियोहरू</string>\n    <string name=\"artists\">कलाकारहरू</string>\n    <string name=\"albums\">एल्बमहरू</string>\n    <string name=\"songs\">गित</string>\n    <string name=\"restricted_video\">यो भिडियो उमेर प्रतिबन्धित छ।…\n\\n…\n\\nएदी तपैंलाई हेर्न परेमा, सेटिंगमा गई “%1$s” सक्षम गर्नुहोस्।</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">यूट्यूब प्रतिबन्धित मोड</string>\n    <string name=\"video_detail_by\">%s द्वारा</string>\n    <string name=\"channel_created_by\">%s द्वारा सिर्जना गरिएको</string>\n    <string name=\"content_not_supported\">यो सामग्री अझै NewPipeमा समर्थित छैन। \n\\n… \n\\nआशा छ कि भविष्यको संस्करणमा समर्थित हुनेछ।</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">हो र आंशिक रूपमा हेरिएको भिडियोहरू</string>\n    <string name=\"notification_colorize_title\">सूचना पाटी रंगिन बनाउनु</string>\n    <string name=\"notification_action_nothing\">केहि छैन</string>\n    <string name=\"notification_action_buffering\">Buffering हुँदै</string>\n    <string name=\"notification_action_shuffle\">Shuffle गर्नु</string>\n    <string name=\"notification_action_repeat\">दोहोर्‍याउनु</string>\n    <string name=\"notification_actions_summary\">हरेक सूचना कार्यमा थिचेर परिवर्तन गर्नुहोस्। तपाईंले तीमध्धे तीनवटासम्म सूचना पाटीमा राख्न सक्नुहुन्छ, त्यसको लागि दाँयाँ बक्समा ठिक लगाउनुहोस्।</string>\n    <string name=\"notification_action_4_title\">पाँचौ कार्य बटन</string>\n    <string name=\"notification_action_3_title\">चौथो कार्य बटन</string>\n    <string name=\"notification_action_0_title\">पहिलो कार्य बटन</string>\n    <string name=\"notification_action_1_title\">दोस्रो कार्य बटन</string>\n    <string name=\"notification_action_2_title\">तेस्रो कार्य बटन</string>\n    <string name=\"notification_scale_to_square_image_title\">थम्बनेल १:१ अनुपातमा परिवर्तन गर्नु</string>\n    <string name=\"notification_scale_to_square_image_summary\">भिडियोको सूचना केन्द्रमा रहेको थम्बनेललाई १६:९ बाट १:१ अनुपातमा परिवर्तन गर्नु (यसको कारणले गर्दा बाङ्गोटेढो हुन सक्छ)</string>\n    <string name=\"search_showing_result_for\">%s : का लागि परिणामहरु देखाइँदैछ</string>\n    <string name=\"open_with\">सँँग खोल्नुहोस्</string>\n    <string name=\"mark_as_watched\">हेरेको भनि चिन्ह लगाउनुहोस्</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-night/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"contrastColor\">@color/white</color>\n    <color name=\"defaultIconTint\">@color/white</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-night/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- Opening Theme -->\n    <style name=\"Base.OpeningTheme\" parent=\"Base.V21.OpeningTheme\">\n        <item name=\"android:navigationBarColor\">@color/dark_youtube_primary_color</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-nl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Gepubliceerd op %1$s</string>\n    <string name=\"no_player_found\">Geen videospeler met streamondersteuning gevonden. VLC installeren\\?</string>\n    <string name=\"install\">Installeren</string>\n    <string name=\"cancel\">Annuleren</string>\n    <string name=\"open_in_browser\">Openen in browser</string>\n    <string name=\"share\">Delen</string>\n    <string name=\"download\">Downloaden</string>\n    <string name=\"search\">Zoeken</string>\n    <string name=\"settings\">Instellingen</string>\n    <string name=\"did_you_mean\">Bedoelde je \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Delen met</string>\n    <string name=\"download_path_title\">Downloadlocatie voor video\\'s</string>\n    <string name=\"download_path_summary\">Locatie om gedownloade video\\'s in op te slaan</string>\n    <string name=\"download_path_dialog_title\">Voer de downloadlocatie in voor video\\'s</string>\n    <string name=\"default_resolution_title\">Standaardresolutie</string>\n    <string name=\"play_with_kodi_title\">Afspelen met Kodi</string>\n    <string name=\"kore_not_found\">Ontbrekende Kore-app installeren\\?</string>\n    <string name=\"show_play_with_kodi_title\">Optie ‘Afspelen met Kodi’ tonen</string>\n    <string name=\"show_play_with_kodi_summary\">Toont een optie om een video af te spelen via Kodi media center</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Standaardaudioformaat</string>\n    <string name=\"download_dialog_title\">Downloaden</string>\n    <string name=\"unsupported_url\">URL wordt niet ondersteund</string>\n    <string name=\"show_next_and_similar_title\">‘Volgende’ en ‘Vergelijkbare’ video\\'s tonen</string>\n    <string name=\"content_language_title\">Standaardtaal voor inhoud</string>\n    <string name=\"use_external_video_player_title\">Externe videospeler gebruiken</string>\n    <string name=\"use_external_audio_player_title\">Externe audiospeler gebruiken</string>\n    <string name=\"settings_category_video_audio_title\">Video en audio</string>\n    <string name=\"detail_thumbnail_view_description\">Speel video, tijd:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Gebruikersafbeelding van uploader</string>\n    <string name=\"detail_dislikes_img_view_description\">Vind-ik-niet-leuks</string>\n    <string name=\"download_path_audio_title\">Download­map voor audio</string>\n    <string name=\"download_path_audio_summary\">Gedownloade muziek wordt hier opgeslagen</string>\n    <string name=\"download_path_audio_dialog_title\">Voer de downloadlocatie in voor audiobestanden</string>\n    <string name=\"theme_title\">Thema</string>\n    <string name=\"dark_theme_title\">Donker</string>\n    <string name=\"light_theme_title\">Licht</string>\n    <string name=\"settings_category_appearance_title\">Uiterlijk</string>\n    <string name=\"background_player_playing_toast\">Speelt af op achtergrond</string>\n    <string name=\"content\">Inhoud</string>\n    <string name=\"show_age_restricted_content_title\">Inhoud met leeftijdsbeperking tonen</string>\n    <string name=\"general_error\">Fout</string>\n    <string name=\"network_error\">Netwerkfout</string>\n    <string name=\"could_not_load_thumbnails\">Kan niet alle miniatuurvoorbeelden laden</string>\n    <string name=\"parsing_error\">Kan website niet verwerken</string>\n    <string name=\"content_not_available\">Inhoud niet beschikbaar</string>\n    <string name=\"could_not_setup_download_menu\">Kan downloadmenu niet instellen</string>\n    <string name=\"detail_likes_img_view_description\">Vind-ik-leuks</string>\n    <string name=\"sorry_string\">Sorry, dit had niet mogen gebeuren.</string>\n    <string name=\"error_report_button_text\">Melden via e-mail</string>\n    <string name=\"error_snackbar_message\">Sorry, er is iets fout gegaan.</string>\n    <string name=\"error_snackbar_action\">Melden</string>\n    <string name=\"what_device_headline\">Informatie:</string>\n    <string name=\"what_happened_headline\">Wat er is gebeurd:</string>\n    <string name=\"your_comment\">Je opmerking (in het Engels):</string>\n    <string name=\"error_details_headline\">Details:</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Geluid</string>\n    <string name=\"retry\">Opnieuw proberen</string>\n    <string name=\"main_bg_subtitle\">Tik op het vergrootglas om te beginnen.</string>\n    <string name=\"duration_live\">Live</string>\n    <string name=\"downloads\">Downloads</string>\n    <string name=\"downloads_title\">Downloads</string>\n    <string name=\"error_report_title\">Foutrapport</string>\n    <string name=\"app_ui_crash\">App/UI gecrasht</string>\n    <string name=\"info_labels\">Wat:\\nVerzoek:\\nInhoudstaal:\\nInhoudsland:\\nApp-taal:\\nDienst:\\nGMT-tijd:\\nPakket:\\nVersie:\\nVersie van besturingssysteem:</string>\n    <string name=\"start\">Starten</string>\n    <string name=\"pause\">Pauzeren</string>\n    <string name=\"delete\">Verwĳderen</string>\n    <string name=\"checksum\">Controlesom</string>\n    <string name=\"ok\">Oké</string>\n    <string name=\"msg_name\">Bestandsnaam</string>\n    <string name=\"msg_threads\">Threads</string>\n    <string name=\"msg_error\">Fout</string>\n    <string name=\"msg_running\">NewPipe is aan het downloaden</string>\n    <string name=\"msg_running_detail\">Druk voor meer informatie</string>\n    <string name=\"msg_wait\">Even geduld…</string>\n    <string name=\"msg_copied\">Gekopieerd naar klembord</string>\n    <string name=\"no_available_dir\">Selecteer een download map in de Instellingen</string>\n    <string name=\"black_theme_title\">Zwart</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA-uitdaging</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA-uitdaging gevraagd</string>\n    <string name=\"open_in_popup_mode\">Openen in pop-upmodus</string>\n    <string name=\"all\">Alles</string>\n    <string name=\"msg_popup_permission\">Deze machtiging is vereist om te\n\\nopenen in pop-upmodus</string>\n    <string name=\"popup_playing_toast\">Speelt af in pop-upmodus</string>\n    <string name=\"default_video_format_title\">Standaard­videoformaat</string>\n    <string name=\"disabled\">Uitgeschakeld</string>\n    <string name=\"default_popup_resolution_title\">Standaardresolutie van pop-up</string>\n    <string name=\"show_higher_resolutions_title\">Hogere resoluties tonen</string>\n    <string name=\"show_higher_resolutions_summary\">Slechts enkele toestellen kunnen 2K-/4K-video\\'s afspelen</string>\n    <string name=\"controls_background_title\">Achtergrond</string>\n    <string name=\"controls_popup_title\">Pop-up</string>\n    <string name=\"clear\">Wissen</string>\n    <string name=\"popup_remember_size_pos_title\">Onthoud de eigenschappen van de pop-up</string>\n    <string name=\"popup_remember_size_pos_summary\">Onthoud laatste grootte en positie van pop-up</string>\n    <string name=\"use_external_video_player_summary\">Verwijdert geluid bij sommige resoluties</string>\n    <string name=\"show_search_suggestions_title\">Zoeksuggesties</string>\n    <string name=\"show_search_suggestions_summary\">Kies de suggesties om te tonen tijdens het zoeken</string>\n    <string name=\"best_resolution\">Beste resolutie</string>\n    <string name=\"title_activity_about\">Over NewPipe</string>\n    <string name=\"title_licenses\">Licenties van derde partijen</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s door %2$s, uitgebracht onder de %3$s</string>\n    <string name=\"tab_about\">Over</string>\n    <string name=\"tab_licenses\">Licenties</string>\n    <string name=\"app_description\">Open source en lichtgewicht streaming voor Android.</string>\n    <string name=\"view_on_github\">Bekijken op GitHub</string>\n    <string name=\"app_license_title\">Licentie van NewPipe</string>\n    <string name=\"contribution_encouragement\">Hulp is altijd welkom. Of je nu nieuwe ideeën hebt, vertalingen kan aanleveren, wijzigingen in het ontwerp kan verrichten, code kan opschonen of van grote wijzigingen voorzien. Hoe meer hulp, hoe beter het wordt!</string>\n    <string name=\"read_full_license\">Licentie lezen</string>\n    <string name=\"contribution_title\">Bijdragen</string>\n    <string name=\"settings_category_downloads_title\">Download</string>\n    <string name=\"settings_file_charset_title\">Toegestane tekens in bestandsnamen</string>\n    <string name=\"settings_file_replacement_character_summary\">Ongeldige tekens worden vervangen door deze waarde</string>\n    <string name=\"settings_file_replacement_character_title\">Vervangend teken</string>\n    <string name=\"charset_letters_and_digits\">Letters en cijfers</string>\n    <string name=\"charset_most_special_characters\">Speciale tekens</string>\n    <string name=\"subscribe_button_title\">Abonneren</string>\n    <string name=\"subscribed_button_title\">Geabonneerd</string>\n    <string name=\"channel_unsubscribed\">Abonnement opgezegd</string>\n    <string name=\"subscription_change_failed\">Kan abonnement niet wijzigen</string>\n    <string name=\"subscription_update_failed\">Kan abonnement niet bijwerken</string>\n    <string name=\"tab_subscriptions\">Abonnementen</string>\n    <string name=\"fragment_feed_title\">Nieuw</string>\n    <string name=\"enable_search_history_title\">Zoekgeschiedenis</string>\n    <string name=\"enable_search_history_summary\">Sla zoekopdrachten lokaal op</string>\n    <string name=\"enable_watch_history_title\">Geschiedenis bekijken</string>\n    <string name=\"enable_watch_history_summary\">Kijkgeschiedenis bijhouden</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Hervat afspelen</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Ga verder met afspelen na onderbrekingen (b.v. telefoongesprekken)</string>\n    <string name=\"notification_channel_name\">NewPipe</string>\n    <string name=\"notification_channel_description\">Meldingen voor de speler van NewPipe</string>\n    <string name=\"title_activity_history\">Geschiedenis</string>\n    <string name=\"action_history\">Geschiedenis</string>\n    <string name=\"settings_category_player_title\">Speler</string>\n    <string name=\"settings_category_player_behavior_title\">Gedrag</string>\n    <string name=\"settings_category_history_title\">Geschiedenis en cache</string>\n    <string name=\"undo\">Ongedaan maken</string>\n    <string name=\"search_no_results\">Geen resultaten</string>\n    <string name=\"empty_list_subtitle\">Enkel krekels hier</string>\n    <string name=\"no_subscribers\">Geen abonnees</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s abonnee</item>\n        <item quantity=\"other\">%s abonnees</item>\n    </plurals>\n    <string name=\"no_views\">Geen weergaven</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s weergave</item>\n        <item quantity=\"other\">%s weergaven</item>\n    </plurals>\n    <string name=\"no_videos\">Geen video\\'s</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">%s video’s</item>\n    </plurals>\n    <string name=\"delete_item_search_history\">Wil je dit item verwijderen uit je zoekgeschiedenis?</string>\n    <string name=\"show_hold_to_append_title\">Tip ‘Ingedrukt houden om toe te voegen’ tonen</string>\n    <string name=\"show_hold_to_append_summary\">Toon tip als de achtergrond- of pop-upknop wordt ingedrukt op de videogegevenspagina</string>\n    <string name=\"play_all\">Alles afspelen</string>\n    <string name=\"player_stream_failure\">Deze stream kan niet worden afgespeeld</string>\n    <string name=\"player_unrecoverable_failure\">Onherstelbare spelerfout opgetreden</string>\n    <string name=\"player_recoverable_failure\">Bezig met herstellen na spelerfout</string>\n    <string name=\"main_page_content\">Inhoud van hoofdpagina</string>\n    <string name=\"blank_page_summary\">Blanco pagina</string>\n    <string name=\"kiosk_page_summary\">Kioskpagina</string>\n    <string name=\"channel_page_summary\">Kanaalpagina</string>\n    <string name=\"select_a_channel\">Kies een kanaal</string>\n    <string name=\"no_channel_subscribed_yet\">Nog niet geabonneerd op een kanaal</string>\n    <string name=\"select_a_kiosk\">Kies een kiosk</string>\n    <string name=\"trending\">Populair</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Nieuw en populair</string>\n    <string name=\"play_queue_remove\">Verwijderen</string>\n    <string name=\"play_queue_stream_detail\">Details</string>\n    <string name=\"play_queue_audio_settings\">Audio-instellingen</string>\n    <string name=\"hold_to_append\">Houd ingedrukt om toe te voegen aan de wachtrij</string>\n    <string name=\"unknown_content\">[onbekend]</string>\n    <string name=\"start_here_on_background\">Op de achter­grond afspelen</string>\n    <string name=\"start_here_on_popup\">In een pop-up afspelen</string>\n    <string name=\"donation_title\">Doneren</string>\n    <string name=\"donation_encouragement\">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.</string>\n    <string name=\"give_back\">Teruggeven</string>\n    <string name=\"website_title\">Website</string>\n    <string name=\"website_encouragement\">Bezoek de website van NewPipe voor meer informatie en het laatste nieuws.</string>\n    <string name=\"default_content_country_title\">Standaard­land voor inhoud</string>\n    <string name=\"switch_to_background\">Verplaatsen naar achtergrond</string>\n    <string name=\"switch_to_popup\">Verplaatsen naar pop-up</string>\n    <string name=\"switch_to_main\">Verplaatsen naar hoofdvenster</string>\n    <string name=\"drawer_open\">Menu openen</string>\n    <string name=\"drawer_close\">Menu sluiten</string>\n    <string name=\"no_player_found_toast\">Geen speler met streamondersteuning gevonden (je kan VLC installeren om af te spelen).</string>\n    <string name=\"always\">Altijd</string>\n    <string name=\"just_once\">Eénmalig</string>\n    <string name=\"external_player_unsupported_link_type\">Externe spelers ondersteunen dit soort links niet</string>\n    <string name=\"video_streams_empty\">Geen videostreams gevonden</string>\n    <string name=\"audio_streams_empty\">Geen audiostreams gevonden</string>\n    <string name=\"video_player\">Videospeler</string>\n    <string name=\"background_player\">Achtergrondspeler</string>\n    <string name=\"popup_player\">Pop-upspeler</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Bezig met ophalen van informatie…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Bezig met laden van gevraagde inhoud</string>\n    <string name=\"import_data_title\">Data­base importeren</string>\n    <string name=\"export_data_title\">Data­base exporteren</string>\n    <string name=\"import_data_summary\">Dit overschrijft je huidige geschiedenis, abonnementen, afspeellijsten en instellingen</string>\n    <string name=\"export_data_summary\">Exporteer geschiedenis, abonnementen, afspeellijsten en instellingen</string>\n    <string name=\"export_complete_toast\">Geëxporteerd</string>\n    <string name=\"import_complete_toast\">Geïmporteerd</string>\n    <string name=\"no_valid_zip_file\">Geen geldig ZIP-bestand</string>\n    <string name=\"could_not_import_all_files\">Let op: niet alle bestanden konden worden geïmporteerd.</string>\n    <string name=\"override_current_data\">Dit overschrijft je huidige configuratie.</string>\n    <string name=\"controls_download_desc\">Streambestand downloaden</string>\n    <string name=\"show_info\">Informatie tonen</string>\n    <string name=\"tab_bookmarks\">Afspeellĳsten</string>\n    <string name=\"controls_add_to_playlist_title\">Toevoegen aan</string>\n    <string name=\"detail_drag_description\">Versleep om de volgorde te wijzigen</string>\n    <string name=\"create\">Aanmaken</string>\n    <string name=\"dismiss\">Sluiten</string>\n    <string name=\"rename\">Naam wijzigen</string>\n    <string name=\"title_last_played\">Laatst afgespeeld</string>\n    <string name=\"title_most_played\">Meest afgespeeld</string>\n    <string name=\"always_ask_open_action\">Altijd vragen</string>\n    <string name=\"create_playlist\">Nieuwe afspeellijst</string>\n    <string name=\"rename_playlist\">Naam wijzigen</string>\n    <string name=\"name\">Naam</string>\n    <string name=\"add_to_playlist\">Toevoegen aan afspeellijst</string>\n    <string name=\"set_as_playlist_thumbnail\">Instellen als miniatuur voor afspeellijst</string>\n    <string name=\"bookmark_playlist\">Afspeellijst toevoegen aan bladwijzers</string>\n    <string name=\"unbookmark_playlist\">Bladwijzer verwijderen</string>\n    <string name=\"delete_playlist_prompt\">Deze afspeellijst verwijderen\\?</string>\n    <string name=\"playlist_creation_success\">Afspeellijst gecreëerd</string>\n    <string name=\"playlist_add_stream_success\">Toegevoegd aan afspeellijst</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniatuur voor afspeellijst gewijzigd.</string>\n    <string name=\"caption_none\">Geen ondertitels</string>\n    <string name=\"resize_fit\">Inpassen</string>\n    <string name=\"resize_fill\">Opvullen</string>\n    <string name=\"resize_zoom\">Inzoomen</string>\n    <string name=\"settings_category_debug_title\">Foutopsporing</string>\n    <string name=\"caption_auto_generated\">Automatisch gegenereerd</string>\n    <string name=\"enable_leak_canary_summary\">Het monitoren van geheugenlekken kan ervoor zorgen dat de app niet goed meer reageert</string>\n    <string name=\"enable_disposed_exceptions_title\">Out-of-lifecycle-fouten melden</string>\n    <string name=\"enable_disposed_exceptions_summary\">Forceer het melden van niet-bezorgbare Rx-uitzonderingen buiten fragment of activiteitscyclus</string>\n    <string name=\"use_inexact_seek_title\">Snelle, minder exact spoelen gebruiken</string>\n    <string name=\"use_inexact_seek_summary\">Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie. 5, 15 en 25 seconden werken niet</string>\n    <string name=\"auto_queue_title\">Volgende stream automatisch in wachtrij plaatsen</string>\n    <string name=\"auto_queue_summary\">Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst</string>\n    <string name=\"file\">Bestand</string>\n    <string name=\"invalid_directory\">Deze map bestaat niet</string>\n    <string name=\"invalid_source\">Bestand/Inhoudsbron bestaat niet</string>\n    <string name=\"invalid_file\">Het bestand bestaat niet of je bent onvoldoende gemachtigd om het te lezen/er naar te schrijven</string>\n    <string name=\"file_name_empty_error\">De bestandsnaam mag niet blanco zijn</string>\n    <string name=\"error_occurred_detail\">Er is een fout opgetreden: %1$s</string>\n    <string name=\"import_title\">Importeren</string>\n    <string name=\"import_from\">Importeren uit</string>\n    <string name=\"export_to\">Exporteren naar</string>\n    <string name=\"import_ongoing\">Bezig met importeren…</string>\n    <string name=\"export_ongoing\">Bezig met exporteren…</string>\n    <string name=\"import_file_title\">Bestand importeren</string>\n    <string name=\"previous_export\">Vorige exportering</string>\n    <string name=\"subscriptions_import_unsuccessful\">De abonnementen kunnen niet worden geïmporteerd</string>\n    <string name=\"subscriptions_export_unsuccessful\">De abonnementen kunnen niet worden geëxporteerd</string>\n    <string name=\"import_youtube_instructions\">Importeer je YouTube-abonnementen vanaf Google Takeout:\n\\n\n\\n1. Ga naar dit adres: %1$s\n\\n2. Log in op je account\n\\n3. Druk op ‘Alle YouTube-gegevens inbegrepen’, dan op ‘Selectie van alle items ongedaan maken’, dan selecteer alleen ‘abonnementen’ en druk op ‘OK’\n\\n4. Druk op ‘Volgende stap’, dan op ‘Export maken’\n\\n5. Druk op de knop ‘Downloaden’ nadat deze verschijnt\n\\n6. Druk onder op ‘Bestand importeren’ en selecteer de gedownloade zip file\n\\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</string>\n    <string name=\"import_soundcloud_instructions\">Importeer een SoundCloud-profiel door de URL of het ID ervan in te voeren:\n\\n\n\\n1. Kies een webbrowser en schakel bureaubladmodus in (de website is niet beschikbaar voor mobiele apparaten)\n\\n2. Ga naar dit adres: %1$s\n\\n3. Log in op je account\n\\n4. Kopieer de koppeling van de pagina waar je op terechtkomt (dat is je profiel-URL).</string>\n    <string name=\"import_soundcloud_instructions_hint\">jouwID, soundcloud.com/jouwid</string>\n    <string name=\"import_network_expensive_warning\">Let op: deze actie kan veel MB’s van je mobiele netwerk gebruiken. \n\\n \n\\nWil je doorgaan?</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Afbeeldingscache gewist</string>\n    <string name=\"metadata_cache_wipe_title\">Gecachete metagegevens wissen</string>\n    <string name=\"metadata_cache_wipe_summary\">Alle gecachete webpagina-gegevens wissen</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metagegevens-cache gewist</string>\n    <string name=\"playback_speed_control\">Afspeelsnelheidbesturing</string>\n    <string name=\"playback_tempo\">Snelheid</string>\n    <string name=\"playback_pitch\">Toon</string>\n    <string name=\"unhook_checkbox\">Ontlinken (kan ruis veroorzaken)</string>\n    <string name=\"preferred_open_action_settings_title\">Voorkeursactie voor openen</string>\n    <string name=\"preferred_open_action_settings_summary\">Standaardactie bij openen van inhoud — %s</string>\n    <string name=\"no_streams_available_download\">Geen streams beschikbaar voor downloaden</string>\n    <string name=\"caption_setting_title\">Ondertitels</string>\n    <string name=\"caption_setting_description\">Ondertitelgrootte en -achtergrondstijlen wijzigen. Vereist een herstart van de app</string>\n    <string name=\"clear_views_history_title\">Kijkgeschiedenis wissen</string>\n    <string name=\"clear_views_history_summary\">Verwijdert de geschiedenis van bekeken video\\'s en afspeelposities</string>\n    <string name=\"delete_view_history_alert\">De gehele kijkgeschiedenis wissen\\?</string>\n    <string name=\"watch_history_deleted\">Kijkgeschiedenis gewist</string>\n    <string name=\"clear_search_history_title\">Zoekgeschiedenis wissen</string>\n    <string name=\"clear_search_history_summary\">Verwijdert de gebruikte zoektermen</string>\n    <string name=\"delete_search_history_alert\">De gehele zoekgeschiedenis wissen\\?</string>\n    <string name=\"search_history_deleted\">Zoekgeschiedenis gewist</string>\n    <string name=\"one_item_deleted\">1 item verwijderd.</string>\n    <string name=\"app_license\">NewPipe is vrije software: je kan het gebruiken, bestuderen, delen en verbeteren zoveel je maar wilt. Je kan het opnieuw uitgeven en/of aanpassen volgens de voorwaarden van de GNU General Public License, gepubliceerd door de Free Software Foundation, versie 3 van de licentie, of (indien gewenst) om het even welke latere versie.</string>\n    <string name=\"import_settings\">Wil je ook de instellingen importeren?</string>\n    <string name=\"privacy_policy_title\">NewPipe\\'s privacybeleid</string>\n    <string name=\"privacy_policy_encouragement\">Het NewPipe-project neemt privacy serieus. Daarom verzamelt de app geen gegevens zonder jouw toestemming. \n\\nNewPipe\\'s privacybeleid legt gedetailleerd uit welke gegevens verstuurd en opgeslagen worden als je een crashrapport verstuurt.</string>\n    <string name=\"read_privacy_policy\">Privacybeleid lezen</string>\n    <string name=\"start_accept_privacy_policy\">Om de Europese Algemene Verordening Gegevensbescherming (ook wel: AVG of GDPR) na te leven, wijzen we je op het nieuwe privacybeleid van NewPipe. Lees dit zorgvuldig. \n\\nJe moet het beleid accepteren om ons het foutrapport te kunnen sturen.</string>\n    <string name=\"accept\">Accepteren</string>\n    <string name=\"decline\">Weigeren</string>\n    <string name=\"limit_data_usage_none_description\">Ongelimiteerd</string>\n    <string name=\"limit_mobile_data_usage_title\">Resolutie beperken bij gebruik van mobiele gegevens</string>\n    <string name=\"minimize_on_exit_title\">Minimaliseer bij overschakelen naar andere app</string>\n    <string name=\"minimize_on_exit_summary\">Actie bij overschakelen van videospeler naar andere app — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Geen</string>\n    <string name=\"minimize_on_exit_background_description\">Afspelen op achtergrond</string>\n    <string name=\"minimize_on_exit_popup_description\">Afspelen in pop-upvenster</string>\n    <string name=\"skip_silence_checkbox\">Vooruitspoelen tijdens stilte</string>\n    <string name=\"playback_step\">Stap</string>\n    <string name=\"playback_reset\">Standaardwaarden</string>\n    <string name=\"channels\">Kanalen</string>\n    <string name=\"playlists\">Afspeellijsten</string>\n    <string name=\"tracks\">Nummers</string>\n    <string name=\"users\">Gebruikers</string>\n    <string name=\"unsubscribe\">Afmelden</string>\n    <string name=\"tab_choose\">Kies tabblad</string>\n    <string name=\"settings_category_updates_title\">Bijwerken</string>\n    <string name=\"file_deleted\">Bestand verwijderd</string>\n    <string name=\"app_update_notification_channel_name\">App-updates</string>\n    <string name=\"app_update_notification_channel_description\">Meldingen voor nieuwe New Pipe versies</string>\n    <string name=\"download_to_sdcard_error_title\">Externe opslag niet beschikbaar</string>\n    <string name=\"download_to_sdcard_error_message\">Downloaden naar externe SD-kaart is niet mogelijk. Download map opnieuw instellen\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Fout bij lezen van opgeslagen tabbladen, standaard­tabbladen worden gebruikt</string>\n    <string name=\"restore_defaults\">Standaardinstellingen herstellen</string>\n    <string name=\"restore_defaults_confirmation\">Wil je de standaardinstellingen herstellen\\?</string>\n    <string name=\"subscribers_count_not_available\">Aantal abonnees niet beschikbaar</string>\n    <string name=\"main_page_content_summary\">Welke tabbladen worden weergegeven op de hoofdpagina</string>\n    <string name=\"updates_setting_title\">Bijwerken</string>\n    <string name=\"updates_setting_description\">Toon een melding om de app bij te werken wanneer een nieuwe versie beschikbaar is</string>\n    <string name=\"list_view_mode\">Lijstweergavemodus</string>\n    <string name=\"list\">Lijst</string>\n    <string name=\"grid\">Raster</string>\n    <string name=\"auto\">Auto</string>\n    <string name=\"app_update_available_notification_title\">NewPipe-update is beschikbaar!</string>\n    <string name=\"missions_header_finished\">Voltooid</string>\n    <string name=\"missions_header_pending\">In afwachting van</string>\n    <string name=\"paused\">gepauzeerd</string>\n    <string name=\"queued\">aan de wachtrij toegevoegd</string>\n    <string name=\"post_processing\">nabewerking</string>\n    <string name=\"enqueue\">In wachtrij plaatsen</string>\n    <string name=\"permission_denied\">Actie door het systeem geweigerd</string>\n    <string name=\"download_failed\">Downloaden mislukt</string>\n    <string name=\"generate_unique_name\">Genereer een unieke naam</string>\n    <string name=\"overwrite\">Overschrijven</string>\n    <string name=\"overwrite_finished_warning\">Er bestaat al een gedownload bestand met deze naam</string>\n    <string name=\"download_already_running\">Er is een download aan de gang met deze naam</string>\n    <string name=\"show_error\">Foutmelding tonen</string>\n    <string name=\"error_file_creation\">Het bestand kan niet worden gemaakt</string>\n    <string name=\"error_path_creation\">De doelmap kan niet worden gemaakt</string>\n    <string name=\"error_ssl_exception\">Kon geen beveiligde verbinding opzetten</string>\n    <string name=\"error_unknown_host\">Kon de server niet vinden</string>\n    <string name=\"error_connect_host\">Kan niet met de server verbinden</string>\n    <string name=\"error_http_no_content\">De server verzendt geen gegevens</string>\n    <string name=\"error_http_unsupported_range\">De server accepteert geen multi-threaded downloads, probeer het opnieuw met @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Niet gevonden</string>\n    <string name=\"error_postprocessing_failed\">Nabewerking mislukt</string>\n    <string name=\"stop\">Stop</string>\n    <string name=\"max_retry_msg\">Maximum aantal keer proberen</string>\n    <string name=\"max_retry_desc\">Maximum aantal pogingen voordat de download wordt geannuleerd</string>\n    <string name=\"pause_downloads_on_mobile\">Pauzeren bij mobiele gegevens­verbinding</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Handig voor wanneer u naar mobiel internet overschakelt, hoewel sommige downloads niet gepauzeerd kunnen worden</string>\n    <string name=\"events\">Gebeurtenissen</string>\n    <string name=\"conferences\">Conferenties</string>\n    <string name=\"error_timeout\">Time-out van verbinding</string>\n    <string name=\"show_comments_title\">Reacties tonen</string>\n    <string name=\"show_comments_summary\">Schakel dit uit om reacties te verbergen</string>\n    <string name=\"autoplay_title\">Automatisch afspelen</string>\n    <string name=\"no_comments\">Geen reacties</string>\n    <string name=\"error_unable_to_load_comments\">Kan reacties niet laden</string>\n    <string name=\"close\">Sluiten</string>\n    <string name=\"downloads_storage_use_saf_summary\">Het \\'Storage Access Framework\\' staat downloads naar een externe SD kaart toe</string>\n    <string name=\"settings_category_clear_data_title\">Gegevens wissen</string>\n    <string name=\"enable_playback_resume_title\">Afspelen hervatten</string>\n    <string name=\"enable_playback_resume_summary\">Verder afspelen vanaf laatste positie</string>\n    <string name=\"enable_playback_state_lists_title\">Posities in lijst</string>\n    <string name=\"enable_playback_state_lists_summary\">Laat afspeeltijd in afspeellijst zien</string>\n    <string name=\"watch_history_states_deleted\">Afspeelposities verwijderd</string>\n    <string name=\"missing_file\">Bestand verplaatst of verwijderd</string>\n    <string name=\"overwrite_unrelated_warning\">Een bestand met dezelfde naam bestaat al</string>\n    <string name=\"overwrite_failed\">Kan bestand niet overschrijven</string>\n    <string name=\"download_already_pending\">Er is al een download met deze naam bezig</string>\n    <string name=\"error_insufficient_storage_left\">Geen vrije ruimte meer op het apparaat</string>\n    <string name=\"error_progress_lost\">Voortgang verloren, omdat bestand was verwijderd</string>\n    <string name=\"confirm_prompt\">Wilt u de downloadgeschiedenis of alle gedownloade bestanden verwijderen\\?</string>\n    <string name=\"enable_queue_limit\">Download­wachtrij limiteren</string>\n    <string name=\"enable_queue_limit_desc\">Er zal maximaal 1 bestand tegelijk worden gedownload</string>\n    <string name=\"start_downloads\">Downloads starten</string>\n    <string name=\"pause_downloads\">Downloads pauzeren</string>\n    <string name=\"downloads_storage_ask_title\">Vragen waar bestanden gedownload moeten worden</string>\n    <string name=\"downloads_storage_ask_summary\">U wordt gevraagd waar elk bestand wordt opgeslagen.\n\\nSchakel de systeem map kiezer (SAF) in als u naar een externe SD-kaart wilt downloaden</string>\n    <string name=\"downloads_storage_use_saf_title\">Mapkiezer van systeem gebruiken (SAF)</string>\n    <string name=\"clear_playback_states_title\">Afspeelposities verwijderen</string>\n    <string name=\"clear_playback_states_summary\">Verwijdert alle afspeelposities</string>\n    <string name=\"delete_playback_states_alert\">Alle afspeelposities verwijderen\\?</string>\n    <string name=\"no_one_watching\">Niemand is aan het kijken</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s kijker</item>\n        <item quantity=\"other\">%s kijkers</item>\n    </plurals>\n    <string name=\"no_one_listening\">Niemand is aan het luisteren</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s luisteraar</item>\n        <item quantity=\"other\">%s luisteraars</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">Standaard kiosk</string>\n    <string name=\"seek_duration_title\">Duur voor-/achteruit spoelen</string>\n    <string name=\"peertube_instance_url_title\">PeerTube-instanties</string>\n    <string name=\"peertube_instance_url_summary\">Selecteer je favorite PeerTube-instanties</string>\n    <string name=\"peertube_instance_url_help\">Vind de instanties die je leuk vindt op %s</string>\n    <string name=\"peertube_instance_add_title\">Instantie toevoegen</string>\n    <string name=\"peertube_instance_add_help\">Instantie-URL invoeren</string>\n    <string name=\"peertube_instance_add_fail\">Kon instantie niet valideren</string>\n    <string name=\"peertube_instance_add_https_only\">Alleen HTTPS-URL\\'s worden ondersteund</string>\n    <string name=\"peertube_instance_add_exists\">Instantie bestaat al</string>\n    <string name=\"local\">Lokaal</string>\n    <string name=\"recently_added\">Recentelijk toegevoegd</string>\n    <string name=\"playlist_no_uploader\">Automatisch gegenereerd (geen uploader gevonden)</string>\n    <string name=\"recovering\">herstellen</string>\n    <string name=\"error_download_resource_gone\">Kan deze download niet herstellen</string>\n    <string name=\"choose_instance_prompt\">Kies een instantie</string>\n    <string name=\"clear_download_history\">Download geschiedenis verwijderen</string>\n    <string name=\"delete_downloaded_files\">Verwijder gedownloade bestanden</string>\n    <string name=\"permission_display_over_apps\">Geef toestemming voor weergave over andere apps</string>\n    <string name=\"app_language_title\">App-taal</string>\n    <string name=\"systems_language\">Systeemtaal gebruiken</string>\n    <string name=\"subtitle_activity_recaptcha\">Druk op ‘Klaar’ als u dit heeft opgelost</string>\n    <string name=\"done\">Klaar</string>\n    <string name=\"videos_string\">Video\\'s</string>\n    <string name=\"new_seek_duration_toast\">Door beperkingen van ExoPlayer is de zoekduur ingesteld op %d seconden</string>\n    <string name=\"mute\">Geluid dempen</string>\n    <string name=\"unmute\">Geluid aanzetten</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d seconde</item>\n        <item quantity=\"other\">%d seconden</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuut</item>\n        <item quantity=\"other\">%d minuten</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d uur</item>\n        <item quantity=\"other\">%d uur</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dag</item>\n        <item quantity=\"other\">%d dagen</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">Kanaalgroepen</string>\n    <string name=\"feed_oldest_subscription_update\">Laatste update nieuws­feed: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Niet geladen: %d</string>\n    <string name=\"feed_notification_loading\">Feed aan het laden…</string>\n    <string name=\"feed_processing_message\">Feed aan het verwerken…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Selecteer abonnementen</string>\n    <string name=\"feed_group_dialog_empty_selection\">Geen abonnement geselecteerd</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d geselecteerd</item>\n        <item quantity=\"other\">%d geselecteerde</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">Lege groepsnaam</string>\n    <string name=\"feed_group_dialog_delete_message\">Wilt u deze groep verwijderen\\?</string>\n    <string name=\"feed_create_new_group_button_title\">Nieuw</string>\n    <string name=\"settings_category_feed_title\">Feed</string>\n    <string name=\"feed_update_threshold_title\">Drempel voor feedupdate</string>\n    <string name=\"feed_update_threshold_summary\">Tijd na de laatste update voordat een abonnement als verouderd wordt beschouwd — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Altijd updaten</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Uit speciale feed ophalen indien beschikbaar</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Beschikbaar in sommige services, het is meestal veel sneller, maar kan een beperkte hoeveelheid items en vaak onvolledige informatie (bijv. geen duur, itemtype, of livestatus) bevatten</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Snelle modus inschakelen</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Snelle modus uitschakelen</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Denk je dat het laden van de feed te sloom is\\? Zo ja, probeer snel laden in te schakelen (in de instellingen of door op onderstaande knop te drukken).\n\\n\n\\nNewPipe biedt twee strategieën aan voor het laden van de feed:\n\\n• Het hele abonnementskanaal ophalen, wat sloom maar compleet is.\n\\n• Een speciale feed ophalen, wat snel maar meestal incompleet is.\n\\n\n\\nHet verschil tussen de twee is dat de snelle meestal wat informatie mist, zoals de duur of type (live of een normale video) van het item en dat er mogelijk minder items zijn.\n\\n\n\\nYouTube is een voorbeeld van een service die deze snelle methode aanbiedt door zijn RSS-feed.\n\\n\n\\nDe keuze komt dus neer op wat je liever hebt: snelheid of precieze informatie.</string>\n    <string name=\"drawer_header_description\">Service wisselen, momenteel geselecteerd:</string>\n    <string name=\"most_liked\">Meest geliked</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe werd gesloten terwijl het bezig was met het bestand</string>\n    <string name=\"songs\">Nummers</string>\n    <string name=\"albums\">Albums</string>\n    <string name=\"artists\">Artiesten</string>\n    <string name=\"content_not_supported\">Deze inhoud wordt nog niet ondersteund door NewPipe.\n\\n\n\\nHopelijk zal dit bij een toekomstige versie ondersteund worden.</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Ja, en deels bekeken video\\'s</string>\n    <string name=\"remove_watched_popup_warning\">Streams die zijn bekeken voor, en na ze werden toegevoegd aan de afspeellijst worden verwijderd. \\nWeet u dit zeker?</string>\n    <string name=\"remove_watched_popup_title\">Bekeken streams verwĳderen?</string>\n    <string name=\"infinite_videos\">∞ video\\'s</string>\n    <string name=\"more_than_100_videos\">100+ video\\'s</string>\n    <string name=\"restricted_video\">Deze video heeft een leeftijdsbeperking.\n\\n\n\\nSchakel ‘%1$s’ in onder instellingen als u het wilt zien.</string>\n    <string name=\"remove_watched\">Bekeken verwijderen</string>\n    <string name=\"show_original_time_ago_summary\">Originele teksten van services zijn zichtbaar in stream-items</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTube\\'s ‘Beperkte modus’ inschakelen</string>\n    <string name=\"show_original_time_ago_title\">Laat originele tijd geleden zien</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Avatarminiatuur van kanaal</string>\n    <string name=\"video_detail_by\">Door %s</string>\n    <string name=\"channel_created_by\">Gemaakt door %s</string>\n    <string name=\"playlist_page_summary\">Afspeellijst­pagina</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Enkel ongegroepeerde abonnementen tonen</string>\n    <string name=\"no_playlist_bookmarked_yet\">Nog geen afspeellijst­bladwijzers</string>\n    <string name=\"select_a_playlist\">Selecteer een afspeellijst</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_report_open_issue_button_text\">In GitHub rapporteren</string>\n    <string name=\"copy_for_github\">Kopieer opgemaakt rapport</string>\n    <string name=\"search_showing_result_for\">Gevonden resultaten voor: %s</string>\n    <string name=\"never\">Nooit</string>\n    <string name=\"wifi_only\">Enkel via Wi-Fi</string>\n    <string name=\"autoplay_summary\">Start automatisch met afspelen — %s</string>\n    <string name=\"title_activity_play_queue\">Wachtrij afspelen</string>\n    <string name=\"unsupported_url_dialog_message\">Kon de URL niet herkennen. In een andere app openen\\?</string>\n    <string name=\"clear_queue_confirmation_description\">De actieve speler­wachtrij zal worden vervangen</string>\n    <string name=\"clear_queue_confirmation_summary\">Veranderen van één speler naar een andere kan jouw wachtrij vervangen</string>\n    <string name=\"clear_queue_confirmation_title\">Vraag bevestiging alvorens de wachtrij te wissen</string>\n    <string name=\"notification_action_nothing\">Niets</string>\n    <string name=\"notification_action_buffering\">Aan het bufferen</string>\n    <string name=\"notification_action_shuffle\">Willekeurig afspelen</string>\n    <string name=\"notification_action_repeat\">Herhaal</string>\n    <string name=\"notification_actions_at_most_three\">Je kan maximaal drie acties selecteren om te tonen in de compacte notificatie!</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_action_4_title\">Vijfde actieknop</string>\n    <string name=\"notification_action_3_title\">Vierde actieknop</string>\n    <string name=\"notification_action_2_title\">Derde actieknop</string>\n    <string name=\"notification_action_1_title\">Tweede actieknop</string>\n    <string name=\"notification_action_0_title\">Eerste actieknop</string>\n    <string name=\"notification_scale_to_square_image_summary\">Schaalt de miniatuurafbeelding van de video die getoond wordt in de melding van verhouding 16:9 naar 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Schaal de miniatuurafbeelding tot verhouding 1:1</string>\n    <string name=\"auto_queue_toggle\">Automatisch in wachtrij plaatsen</string>\n    <string name=\"show_memory_leaks\">Geheugen­lekken tonen</string>\n    <string name=\"enqueued\">In de wachtrij geplaatst</string>\n    <string name=\"enqueue_stream\">In de wachtrij plaatsen</string>\n    <string name=\"clear_cookie_summary\">Verwijder cookies die NewPipe opslaat wanneer u een reCAPTCHA oplost</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA-cookies zijn gewist</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA-cookies wissen</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube biedt een ‘Beperkte modus’ aan, dit verbergt materiaal voor volwassenen</string>\n    <string name=\"show_age_restricted_content_summary\">Toon inhoud die mogelijk niet geschikt is voor kinderen omwille van een leeftijdslimiet (zoals 18+)</string>\n    <string name=\"notification_colorize_summary\">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)</string>\n    <string name=\"notification_colorize_title\">Meldingkleur aanpassen</string>\n    <string name=\"show_thumbnail_summary\">Toon miniatuurafbeelding op het vergrendelscherm als achtergrond en in de meldingen</string>\n    <string name=\"show_thumbnail_title\">Miniatuur tonen</string>\n    <string name=\"recent\">Recente</string>\n    <string name=\"msg_calculating_hash\">Hash berekenen</string>\n    <string name=\"hash_channel_description\">Meldingen over de voortgang van video-hashing</string>\n    <string name=\"hash_channel_name\">Video-hashing</string>\n    <string name=\"show_meta_info_summary\">Schakel dit uit om meta-informatie vakken te verbergen met aanvullende informatie over de maker van de stream, streaminhoud of een zoekopdracht</string>\n    <string name=\"show_meta_info_title\">Laat meta informatie zien</string>\n    <string name=\"description_tab_description\">Beschrijving</string>\n    <string name=\"show_description_title\">Beschrijving laten zien</string>\n    <string name=\"no_app_to_open_intent\">Geen app op je apparaat kan dit openen</string>\n    <string name=\"chapters\">Hoofdstukken</string>\n    <string name=\"related_items_tab_description\">Gerelateerde streams</string>\n    <string name=\"comments_tab_description\">Reacties</string>\n    <string name=\"show_description_summary\">Zet uit om video omschrijving en andere informatie te verbergen</string>\n    <string name=\"open_with\">Open met</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"featured\">Uitgelicht</string>\n    <string name=\"paid_content\">Deze inhoud is alleen beschikbaar voor gebruikers die hebben betaald, dus het kan niet worden gestreamd of gedownload door NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Deze video is alleen beschikbaar voor YouTube Music Premium-leden en kan dus niet worden gestreamd of gedownload door NewPipe.</string>\n    <string name=\"private_content\">Deze inhoud is privé en kan dus niet worden gestreamd of gedownload door NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Dit is een SoundCloud Go + -track, althans in jouw land, dus het kan niet worden gestreamd of gedownload door NewPipe.</string>\n    <string name=\"georestricted_content\">Deze inhoud is niet beschikbaar in uw land.</string>\n    <string name=\"crash_the_app\">App laten crashen</string>\n    <string name=\"recaptcha_solve\">Oplossen</string>\n    <string name=\"restricted_video_no_stream\">Deze video heeft een leeftijdsbeperking.\n\\nVanwege nieuw YouTube-beleid over video\\'s met leeftijdsbeperking, heeft NewPipe geen toegang tot zijn videostreams en kan deze dus niet afspelen.</string>\n    <string name=\"download_has_started\">Downloaden is gestart</string>\n    <string name=\"select_night_theme_toast\">U kunt uw favoriete nachtthema hieronder selecteren</string>\n    <string name=\"night_theme_summary\">Selecteer uw favoriete nachtthema — %s</string>\n    <string name=\"auto_device_theme_title\">Automatisch (systeemthema)</string>\n    <string name=\"show_channel_details\">Kanaal­details tonen</string>\n    <string name=\"night_theme_title\">Nachtthema</string>\n    <string name=\"metadata_privacy_internal\">Intern</string>\n    <string name=\"metadata_privacy_private\">Privé</string>\n    <string name=\"metadata_privacy_unlisted\">Niet vermeld</string>\n    <string name=\"metadata_privacy_public\">Openbaar</string>\n    <string name=\"metadata_host\">Host</string>\n    <string name=\"metadata_support\">Ondersteuning</string>\n    <string name=\"metadata_language\">Taal</string>\n    <string name=\"metadata_age_limit\">Leeftijdslimiet</string>\n    <string name=\"metadata_privacy\">Privacy</string>\n    <string name=\"metadata_licence\">Licentie</string>\n    <string name=\"metadata_tags\">Tags</string>\n    <string name=\"metadata_category\">Categorie</string>\n    <string name=\"description_select_disable\">Tekst selecteren in de beschrijving uitschakelen</string>\n    <string name=\"description_select_enable\">Tekst selecteren in de beschrijving inschakelen</string>\n    <string name=\"description_select_note\">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.</string>\n    <string name=\"disable_media_tunneling_summary\">Schakel media-tunneling uit als u een zwart scherm ervaart of de video hapert bij het afspelen.</string>\n    <string name=\"disable_media_tunneling_title\">Media tunneling uitschakelen</string>\n    <string name=\"off\">Uit</string>\n    <string name=\"on\">Aan</string>\n    <string name=\"tablet_mode_title\">Tablet-modus</string>\n    <string name=\"open_website_license\">Website openen</string>\n    <string name=\"account_terminated\">Account getermineerd</string>\n    <string name=\"feed_load_error_fast_unknown\">De snelle feed mode levert hierover niet meer informatie.</string>\n    <string name=\"feed_load_error_terminated\">De account van de auteur is getermineerd.\n\\nNewPipe zal niet in staat zijn deze feed in de toekomst te laden.\n\\nWeet u zeker dat u wilt unsubscriben van dit kanaal\\?</string>\n    <string name=\"feed_load_error_account_info\">Kan geen feed laden voor \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Error bij het inladen van de feed</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Vanaf Android 10 is enkel \\'Storage Access Framework\\' ondersteund</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">U wordt gevraagd waar elk bestand wordt opgeslagen</string>\n    <string name=\"no_dir_yet\">Nog geen download­map gekozen, kies nu de standaard­download­map</string>\n    <string name=\"detail_heart_img_view_description\">Geliefd door de maker</string>\n    <string name=\"dont_show\">Niet laten zien</string>\n    <string name=\"low_quality_smaller\">Lage kwaliteit (kleiner)</string>\n    <string name=\"high_quality_larger\">Hoge kwaliteit (groter)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Zoekbalk miniatuurafbeelding voorbeeld</string>\n    <string name=\"comments_are_disabled\">Reacties zijn uitgeschakeld</string>\n    <string name=\"remote_search_suggestions\">Zoeksuggesties op afstand</string>\n    <string name=\"local_search_suggestions\">Lokale zoeksuggesties</string>\n    <string name=\"mark_as_watched\">Markeren als bekeken</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s download verwijderd</item>\n        <item quantity=\"other\">%1$s downloads verwijderd</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Download voltooid</item>\n        <item quantity=\"other\">%s downloads voltooid</item>\n    </plurals>\n    <string name=\"enqueued_next\">Volgende item in de wachtrij geplaatst</string>\n    <string name=\"enqueue_next_stream\">Volgende item in de wachtrij plaatsen</string>\n    <string name=\"main_page_content_swipe_remove\">Veeg items om ze te verwijderen</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"start_main_player_fullscreen_title\">Start hoofdspeler als volledig scherm</string>\n    <string name=\"processing_may_take_a_moment\">Verwerken... Dit kan even duren</string>\n    <string name=\"crash_the_player\">Speler crashen</string>\n    <string name=\"show_crash_the_player_title\">‘Speler crashen’ tonen</string>\n    <string name=\"show_crash_the_player_summary\">Toont een crash-optie bij gebruik van de speler</string>\n    <string name=\"manual_update_description\">Controleer handmatig op nieuwe versies</string>\n    <string name=\"check_for_updates\">Controleren op updates</string>\n    <string name=\"checking_updates_toast\">Bezig met controleren op updates…</string>\n    <string name=\"feed_new_items\">Nieuwe feeditems</string>\n    <string name=\"error_report_channel_name\">Foutrapporten</string>\n    <string name=\"error_report_channel_description\">Beschrijving van foutmeldingen</string>\n    <string name=\"error_report_notification_title\">NewPipe meldt fout, tik voor bericht</string>\n    <string name=\"error_report_notification_toast\">Er is een fout opgetreden, zie de melding</string>\n    <string name=\"create_error_notification\">Maak een foutmelding</string>\n    <string name=\"show_error_snackbar\">Korte foutmelding weergeven</string>\n    <string name=\"no_appropriate_file_manager_message\">Er is geen geschikte bestandsbeheerder gevonden voor deze actie.\n\\nInstalleer een bestandsbeheerder of probeer \\'%s\\' uit te schakelen in de download instellingen</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Er is geen geschikte bestandsbeheerder gevonden voor deze actie.\n\\nInstalleer een bestandsbeheerder die compatibel is met het Storage Access Framework</string>\n    <string name=\"detail_pinned_comment_view_description\">Vastgemaakt commentaar</string>\n    <string name=\"leak_canary_not_available\">LeakCanary is niet beschikbaar</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer standaard</string>\n    <string name=\"settings_category_player_notification_title\">Spelermelding</string>\n    <string name=\"settings_category_player_notification_summary\">Configureer meldingen van de huidige spelende stream</string>\n    <string name=\"notifications\">Meldingen</string>\n    <string name=\"streams_notification_channel_name\">Nieuwe streams</string>\n    <string name=\"streams_notification_channel_description\">Meldingen over nieuwe streams van abonnementen</string>\n    <string name=\"loading_stream_details\">Bezig met laden van stream details…</string>\n    <string name=\"check_new_streams\">Controleren op nieuwe streams</string>\n    <string name=\"enable_streams_notifications_title\">Meldingen over nieuwe streams</string>\n    <string name=\"enable_streams_notifications_summary\">Melding over nieuwe streams van abonnementen</string>\n    <string name=\"streams_notifications_interval_title\">Frequentie van controleren</string>\n    <string name=\"streams_notifications_network_title\">Vereiste netwerk­verbinding</string>\n    <string name=\"any_network\">Elk netwerk</string>\n    <string name=\"notifications_disabled\">Meldingen zijn uitgeschakeld</string>\n    <string name=\"get_notified\">Meldingen</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Alles in-/uitschakelen</string>\n    <string name=\"percent\">Percentage</string>\n    <string name=\"semitone\">Halve toon</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nieuwe stream</item>\n        <item quantity=\"other\">%s nieuwe streams</item>\n    </plurals>\n    <string name=\"you_successfully_subscribed\">Je bent nu geabonneerd op dit kanaal</string>\n    <string name=\"delete_downloaded_files_confirm\">Alle gedownloade bestanden van schijf wissen\\?</string>\n    <string name=\"selected_stream_external_player_not_supported\">De geselecteerde stream wordt niet ondersteund door externe spelers</string>\n    <string name=\"no_video_streams_available_for_external_players\">Er zijn geen videostreams beschikbaar voor externe spelers</string>\n    <string name=\"unknown_quality\">Onbekende kwaliteit</string>\n    <string name=\"streams_not_yet_supported_removed\">Streams die niet ondersteund worden door de downloader, worden niet getoond</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Er zijn geen geluidsstreams beschikbaar voor externe spelers</string>\n    <string name=\"select_quality_external_players\">Selecteer kwaliteit voor externe spelers</string>\n    <string name=\"unknown_format\">Onbekend formaat</string>\n    <string name=\"progressive_load_interval_title\">Intervalgrootte tijdens afspelen</string>\n    <string name=\"faq_title\">Veelgestelde vragen</string>\n    <string name=\"faq_description\">Als u problemen ondervindt bij het gebruik van de app, bekijk dan deze antwoorden op veelgestelde vragen!</string>\n    <string name=\"faq\">Bekijken op website</string>\n    <string name=\"sort\">Sorteer</string>\n    <string name=\"fast_mode\">Snelle modus</string>\n    <string name=\"import_subscriptions_hint\">Importeer of exporteer abonnementen vanuit het 3-punten menu</string>\n    <string name=\"app_update_unavailable_toast\">U heeft de nieuwste versie van NewPipe</string>\n    <string name=\"app_update_available_notification_text\">Druk om %s te downloaden</string>\n    <string name=\"msg_failed_to_copy\">Kon niet naar klembord kopiëren</string>\n    <string name=\"night_theme_available\">Deze instelling is alleen beschikbaar als %s als thema ingesteld is</string>\n    <string name=\"card\">Kaart</string>\n    <string name=\"unset_playlist_thumbnail\">Miniatuur niet ingesteld</string>\n    <string name=\"duplicate_in_playlist\">De afspeellijsten die grijs zijn, bevatten dit item al.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplicaat is %d tijd(en) toegevoegd</string>\n    <string name=\"left_gesture_control_title\">Linker gebaaractie</string>\n    <string name=\"right_gesture_control_title\">Rechter gebaaractie</string>\n    <string name=\"none\">Geen</string>\n    <string name=\"remove_duplicates\">Duplicaten verwijderen</string>\n    <string name=\"remove_duplicates_title\">Duplicaten verwijderen\\?</string>\n    <string name=\"remove_duplicates_message\">Wil je alle dubbele streams in deze afspeellijst verwijderen\\?</string>\n    <string name=\"feed_show_hide_streams\">Streams weergeven/verbergen</string>\n    <string name=\"feed_show_watched\">Volledig bekeken</string>\n    <string name=\"feed_show_partially_watched\">Gedeeltelijk bekeken</string>\n    <string name=\"feed_show_upcoming\">Aanstaande</string>\n    <string name=\"right_gesture_control_summary\">Kies een gebaar voor de rechterhelft van het spelersscherm</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Fysieke knoppen voor mediabediening negeren</string>\n    <string name=\"brightness\">Helderheid</string>\n    <string name=\"volume\">Volume</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Handig, als je bijvoorbeeld een headset gebruikt met fysieke knoppen die stuk zijn</string>\n    <string name=\"left_gesture_control_summary\">Kies een gebaar voor de linkerhelft van het spelersscherm</string>\n    <string name=\"feed_hide_streams_title\">Laat de volgende streams zien</string>\n    <string name=\"prefer_descriptive_audio_summary\">Selecteer een audiotrack met beschrijvingen voor slechtzienden, indien beschikbaar</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\n\\nAls je deze optie inschakelt, voorkom je mogelijk afspeelfouten bij het wisselen van de huidige videospeler of het overschakelen naar volledig scherm</string>\n    <string name=\"progressive_load_interval_summary\">Wijzig de grootte van het laadinterval voor progressieve inhoud (momenteel %s). Een lagere waarde kan het initiële laden versnellen</string>\n    <string name=\"prefer_original_audio_title\">Geef de voorkeur aan originele audio</string>\n    <string name=\"prefer_original_audio_summary\">Selecteer de originele audiotrack, ongeacht de taal</string>\n    <string name=\"prefer_descriptive_audio_title\">Geef de voorkeur aan beschrijvende audio</string>\n    <string name=\"play_queue_audio_track\">Audio: %s</string>\n    <string name=\"audio_track\">Audiotrack</string>\n    <string name=\"audio_track_present_in_video\">Er zou al een audiotrack in deze stream aanwezig moeten zijn</string>\n    <string name=\"select_audio_track_external_players\">Selecteer audiotrack voor externe spelers</string>\n    <string name=\"unknown_audio_track\">Onbekend</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer-instellingen</string>\n    <string name=\"settings_category_exoplayer_summary\">Beheer enkele ExoPlayer-instellingen. Deze wijzigingen vereisen een herstart van de speler om van kracht te worden</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Gebruik de terugvalfunctie van de ExoPlayer-decoder</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Gebruik altijd de tijdelijke oplossing voor het instellen van het video-uitvoeroppervlak van ExoPlayer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">origineel</string>\n    <string name=\"audio_track_type_dubbed\">nagesynchroniseerd</string>\n    <string name=\"audio_track_type_descriptive\">beschrijvend</string>\n    <string name=\"main_tabs_position_summary\">Verplaats de tabselector naar beneden</string>\n    <string name=\"main_tabs_position_title\">Positie van sectie-tabbladen</string>\n    <string name=\"no_streams\">Geen streams</string>\n    <string name=\"no_live_streams\">Geen live-streams</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Media-tunneling is standaard uitgeschakeld op uw apparaat omdat uw apparaatmodel dit niet ondersteunt.</string>\n    <string name=\"image_quality_title\">Afbeeldings­kwaliteit</string>\n    <string name=\"channel_tab_videos\">Video\\'s</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Abonnees</string>\n    <string name=\"show_channel_tabs_summary\">Welke tabbladen worden getoond op kanaal­pagina\\'s</string>\n    <string name=\"show_channel_tabs\">Kanaal­tabbladen</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"loading_metadata_title\">Metagegevens laden…</string>\n    <string name=\"toggle_screen_orientation\">Scherm­oriëntatie omschakelen</string>\n    <string name=\"image_quality_low\">Lage kwaliteit</string>\n    <string name=\"toggle_fullscreen\">Volledig scherm omschakelen</string>\n    <string name=\"feed_fetch_channel_tabs\">Kanaal­tabbladen ophalen</string>\n    <string name=\"metadata_avatars\">Profielfoto\\'s</string>\n    <string name=\"next_stream\">Volgende stream</string>\n    <string name=\"metadata_subchannel_avatars\">Subkanaal-profielfoto\\'s</string>\n    <string name=\"open_play_queue\">Wachtrij openen</string>\n    <string name=\"image_quality_none\">Afbeeldingen niet laden</string>\n    <string name=\"image_quality_high\">Hoge kwaliteit</string>\n    <string name=\"channel_tab_about\">Over</string>\n    <string name=\"forward\">Vooruitspoelen</string>\n    <string name=\"channel_tab_albums\">Albums</string>\n    <string name=\"rewind\">Terugspoelen</string>\n    <string name=\"replay\">Opnieuw afspelen</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">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.</string>\n    <string name=\"image_quality_medium\">Gemiddelde kwaliteit</string>\n    <string name=\"metadata_uploader_avatars\">Uploader-profielfoto\\'s</string>\n    <string name=\"metadata_banners\">Banieren</string>\n    <string name=\"channel_tab_playlists\">Afspeellijsten</string>\n    <string name=\"image_quality_summary\">Kies de kwaliteit van afbeeldingen en of deze überhaupt geladen moeten worden, om gegevens- en geheugengebruik te verminderen. Wijzigingen wissen de afbeeldings­cache — %s</string>\n    <string name=\"play\">Afspelen</string>\n    <string name=\"more_options\">Meer opties</string>\n    <string name=\"metadata_thumbnails\">Miniaturen</string>\n    <string name=\"channel_tab_tracks\">Nummers</string>\n    <string name=\"duration\">Duur</string>\n    <string name=\"channel_tab_channels\">Kanalen</string>\n    <string name=\"previous_stream\">Vorige stream</string>\n    <string name=\"channel_tab_livestreams\">Live</string>\n    <string name=\"share_playlist_with_list\">URL-lijst delen</string>\n    <string name=\"share_playlist_with_titles\">Delen met titels</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">Afspeellijst delen</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s reactie</item>\n        <item quantity=\"other\">%s reacties</item>\n    </plurals>\n    <string name=\"show_more\">Meer tonen</string>\n    <string name=\"show_less\">Minder tonen</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"error_insufficient_storage\">Onvoldoende vrĳe ruimte op het apparaat</string>\n    <string name=\"yes\">Ja</string>\n    <string name=\"reset_settings_summary\">Herstelt alle instellingen naar hun standaard­waarde</string>\n    <string name=\"reset_all_settings\">Als u alle instellingen reset worden al uw voorkeurs­instellingen verwijderd en wordt de app opnieuw gestart.\n\\n\n\\nWeet u zeker dat u verder wilt gaan?</string>\n    <string name=\"no\">Nee</string>\n    <string name=\"settings_category_backup_restore_title\">Back-up en herstel</string>\n    <string name=\"auto_update_check_description\">NewPipe kan van tĳd tot tĳd auto­matisch controleren op nieuwe versies en u op de hoogte stellen zodra deze beschik­baar zijn.\n\\nWilt u dit inschakelen?</string>\n    <string name=\"reset_settings_title\">Instellingen resetten</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">secundair</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Delen als tĳdelijke YouTube-afspeel­lĳst</string>\n    <string name=\"tab_bookmarks_short\">Afspeel­lĳsten</string>\n    <string name=\"select_a_feed_group\">Selecteer een feedgroep</string>\n    <string name=\"feed_group_page_summary\">Kanaalgroep­pagina</string>\n    <string name=\"no_feed_group_created_yet\">Nog geen feedgroep geselecteerd</string>\n    <string name=\"search_with_service_name\">Zoeken met %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Zoeken met %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Vind-ik-leuks</string>\n    <string name=\"trending_podcasts\">Trending podcasts</string>\n    <string name=\"trending_gaming\">Trending games</string>\n    <string name=\"trending_movies\">Trending films en series</string>\n    <string name=\"trending_music\">Trending muziek</string>\n    <string name=\"migration_info_6_7_title\">‘SoundCloud Top 50’-pagina verwĳderd</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud heeft de originele Top 50-hitlĳsten stopgezet. Het bĳbehorende tabblad is van uw hoofdpagina verwĳderd.</string>\n    <string name=\"migration_info_7_8_title\">YouTube gecombineerde trending verwĳderd</string>\n    <string name=\"migration_info_7_8_message\">YouTube heeft de gecombineerde trending­pagina per 21 juli 2025 stopgezet. NewPipe heeft de standaard­trendingpagina vervangen door de trending livestreams.\\n\\nU kunt ook andere trending­pagina\\'s selecteren via \\'Instellingen &gt; Inhoud &gt; Inhoud van de hoofdpagina\\'.</string>\n    <string name=\"short_thousand\">%s dznd.</string>\n    <string name=\"short_million\">%s mln.</string>\n    <string name=\"short_billion\">%s mld.</string>\n    <string name=\"delete_file\">Bestand verwĳderen</string>\n    <string name=\"delete_entry\">Item verwĳderen</string>\n    <string name=\"entry_deleted\">Item verwĳderd</string>\n    <string name=\"permission_display_over_apps_message\">Om de Pop-up-speler te gebruiken, selecteert u %1$s in het volgende Android-instellingenmenu en schakelt u %2$s in.</string>\n    <string name=\"permission_display_over_apps_permission_name\">‘Weergeven vóór andere apps toestaan’</string>\n    <string name=\"account_terminated_service_provides_reason\">Account beëindigd\\n\\n%1$s geeft de volgende reden: %2$s</string>\n    <string name=\"player_http_403\">HTTP-fout 403 ontvangen van de server tĳdens het afspelen, waarschĳnlĳk veroorzaakt door het verlopen van de streaming-url of een ip-blokkade</string>\n    <string name=\"player_http_invalid_status\">HTTP-fout %1$s ontvangen van de server tĳdens het afspelen</string>\n    <string name=\"youtube_player_http_403\">HTTP-fout 403 ontvangen van de server tĳdens het afspelen, waarschĳnlĳk veroorzaakt door een ip-blokkade of problemen met de deobfuscatie van de streaming-url</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s weigerde gegevens te verstrekken en vroeg om een login om te bevestigen dat de aanvrager geen bot is.\\n\\nUw ip-adres is mogelĳk tĳdelĳk geblokkeerd door %1$s. U kunt even wachten of overschakelen naar een ander ip-adres (bĳvoorbeeld door een vpn in of uit te schakelen, of door over te schakelen van wifi naar mobiele data).</string>\n    <string name=\"unsupported_content_in_country\">Deze inhoud is niet beschikbaar voor het momenteel geselecteerde inhouds­land.\\n\\nWijzig uw selectie via ‘Instellingen &gt; Inhoud &gt; Standaard­land voor inhoud’.</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-nl-rBE/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Tik op het loepje om te beginnen.</string>\n    <string name=\"upload_date_text\">Gepubliceerd op %1$s</string>\n    <string name=\"no_player_found\">Er is geen stream videospeler gevonden. Wilt u VLC installeren\\?</string>\n    <string name=\"no_player_found_toast\">Geen speler met stream ondersteuning gevonden (je kan VLC installeren om af te spelen).</string>\n    <string name=\"install\">Installeren</string>\n    <string name=\"cancel\">Annuleren</string>\n    <string name=\"open_in_browser\">In browser openen</string>\n    <string name=\"open_in_popup_mode\">Openen in pop-up modus</string>\n    <string name=\"share\">Delen</string>\n    <string name=\"download\">Downloaden</string>\n    <string name=\"controls_download_desc\">Stream bestand downloaden</string>\n    <string name=\"search\">Zoeken</string>\n    <string name=\"settings\">Instellingen</string>\n    <string name=\"did_you_mean\">Bedoelde je \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Delen met</string>\n    <string name=\"use_external_video_player_title\">Externe videospeler gebruiken</string>\n    <string name=\"use_external_video_player_summary\">Verwijdert het geluid bij sommige resoluties</string>\n    <string name=\"use_external_audio_player_title\">Externe audiospeler gebruiken</string>\n    <string name=\"subscribe_button_title\">Abonneer</string>\n    <string name=\"subscribed_button_title\">Geabonneerd</string>\n    <string name=\"channel_unsubscribed\">Abonnement opgezegd</string>\n    <string name=\"subscription_change_failed\">Kan abonnement niet wijzigen</string>\n    <string name=\"subscription_update_failed\">Kan abonnement niet bijwerken</string>\n    <string name=\"show_info\">Info tonen</string>\n    <string name=\"tab_subscriptions\">Abonnementen</string>\n    <string name=\"tab_bookmarks\">Bijgehouden afspeellijsten</string>\n    <string name=\"fragment_feed_title\">Nieuw</string>\n    <string name=\"controls_background_title\">Achtergrond</string>\n    <string name=\"controls_popup_title\">Pop-up</string>\n    <string name=\"controls_add_to_playlist_title\">Toevoegen aan</string>\n    <string name=\"download_path_title\">Download locatie voor video’s</string>\n    <string name=\"download_path_summary\">Gedownloade videobestanden worden hier opgeslagen</string>\n    <string name=\"download_path_dialog_title\">Kies de downloadlocatie voor videobestanden</string>\n    <string name=\"download_path_audio_title\">Audio download map</string>\n    <string name=\"download_path_audio_summary\">Gedownloade audiobestanden worden hier opgeslagen</string>\n    <string name=\"download_path_audio_dialog_title\">Kies de downloadlocatie voor audiobestanden</string>\n    <string name=\"default_resolution_title\">Standaard resolutie</string>\n    <string name=\"default_popup_resolution_title\">Standaard resolutie voor pop-up</string>\n    <string name=\"show_higher_resolutions_title\">Hogere resoluties weergeven</string>\n    <string name=\"show_higher_resolutions_summary\">Slechts enkele toestellen kunnen 2K- en 4K-video\\'s afspelen</string>\n    <string name=\"play_with_kodi_title\">Afspelen met Kodi</string>\n    <string name=\"kore_not_found\">Wilt u de missende Kore-app installeren\\?</string>\n    <string name=\"show_play_with_kodi_title\">Toon “Afspelen met Kodi”-optie</string>\n    <string name=\"show_play_with_kodi_summary\">Toont een optie om video af te spelen op een Kodi media center</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Standaard audio formaat</string>\n    <string name=\"default_video_format_title\">Standaard video formaat</string>\n    <string name=\"theme_title\">Thema</string>\n    <string name=\"light_theme_title\">Licht</string>\n    <string name=\"dark_theme_title\">Donker</string>\n    <string name=\"black_theme_title\">Zwart</string>\n    <string name=\"popup_remember_size_pos_title\">Onthoud grootte en positie van pop-up</string>\n    <string name=\"popup_remember_size_pos_summary\">Onthoud laatste grootte en positie van pop-up</string>\n    <string name=\"use_inexact_seek_title\">Snel, minder exact spoelen gebruiken</string>\n    <string name=\"use_inexact_seek_summary\">Minder exact spoelen laat de speler sneller posities zoeken met verminderde precisie. 5, 15 en 25 seconden werken niet</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Afbeeldingscache gewist</string>\n    <string name=\"metadata_cache_wipe_title\">Gecachete metagegevens wissen</string>\n    <string name=\"metadata_cache_wipe_summary\">Alle gecachete webpagina-gegevens wissen</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metagegevens-cache gewist</string>\n    <string name=\"auto_queue_title\">Volgende stream automatisch in wachtrij plaatsen</string>\n    <string name=\"auto_queue_summary\">Automatisch een gerelateerde stream toekennen bij het afspelen van de laatste stream in een niet-herhalende afspeelwachtlijst</string>\n    <string name=\"show_search_suggestions_title\">Zoeksuggesties</string>\n    <string name=\"show_search_suggestions_summary\">Kies de suggesties die getoond worden bij het zoeken</string>\n    <string name=\"enable_search_history_title\">Zoekgeschiedenis</string>\n    <string name=\"enable_search_history_summary\">Sla zoekopdrachten lokaal op</string>\n    <string name=\"enable_watch_history_title\">Geschiedenis bekijken</string>\n    <string name=\"enable_watch_history_summary\">Geschiedenis bekeken video\\'s bijhouden</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Hervat afspelen</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Ga verder met afspelen na onderbrekingen (b.v. telefoongesprekken)</string>\n    <string name=\"download_dialog_title\">Downloaden</string>\n    <string name=\"show_next_and_similar_title\">Toont ‘Volgende’ en ‘Vergelijkbare’ video’s</string>\n    <string name=\"show_hold_to_append_title\">Toon tip ‘Ingedrukt houden om toe te voegen’</string>\n    <string name=\"show_hold_to_append_summary\">Toon tip als de achtergrond- of pop-up knop wordt ingedrukt in de video \\\"Details:\\\"</string>\n    <string name=\"unsupported_url\">URL wordt niet ondersteund</string>\n    <string name=\"default_content_country_title\">Standaard land</string>\n    <string name=\"content_language_title\">Standaard taal voor inhoud</string>\n    <string name=\"settings_category_player_title\">Speler</string>\n    <string name=\"settings_category_player_behavior_title\">Gedrag</string>\n    <string name=\"settings_category_video_audio_title\">Video en audio</string>\n    <string name=\"settings_category_history_title\">Geschiedenis en cache</string>\n    <string name=\"settings_category_appearance_title\">Uiterlijk</string>\n    <string name=\"settings_category_debug_title\">Foutopsporing</string>\n    <string name=\"background_player_playing_toast\">Speelt af in achtergrond</string>\n    <string name=\"popup_playing_toast\">Speelt af in pop-upmodus</string>\n    <string name=\"content\">Inhoud</string>\n    <string name=\"show_age_restricted_content_title\">Toon inhoud met leeftijdsbeperking</string>\n    <string name=\"duration_live\">Live</string>\n    <string name=\"downloads\">Downloads</string>\n    <string name=\"downloads_title\">Downloads</string>\n    <string name=\"error_report_title\">Foutrapport</string>\n    <string name=\"all\">Alles</string>\n    <string name=\"disabled\">Uitgeschakeld</string>\n    <string name=\"clear\">Wissen</string>\n    <string name=\"best_resolution\">Beste resolutie</string>\n    <string name=\"undo\">Ongedaan maken</string>\n    <string name=\"play_all\">Alles afspelen</string>\n    <string name=\"always\">Altijd</string>\n    <string name=\"just_once\">Eenmalig</string>\n    <string name=\"file\">Bestand</string>\n    <string name=\"notification_channel_name\">NewPipe-melding</string>\n    <string name=\"notification_channel_description\">Meldingen voor NewPipe-achtergrond- en pop-upspelers</string>\n    <string name=\"unknown_content\">[Onbekend]</string>\n    <string name=\"switch_to_background\">Verplaatsen naar achtergrond</string>\n    <string name=\"switch_to_popup\">Verplaatsen naar pop-up</string>\n    <string name=\"switch_to_main\">Verplaatsen naar normaal</string>\n    <string name=\"import_data_title\">Databank importeren</string>\n    <string name=\"export_data_title\">Databank exporteren</string>\n    <string name=\"import_data_summary\">Dit overschrijft uw huidige geschiedenis, abonnementen, speellijsten en optioneel uw instellingen</string>\n    <string name=\"export_data_summary\">Exporteert geschiedenis, abonnementen, speellijsten en instellingen</string>\n    <string name=\"general_error\">Fout</string>\n    <string name=\"network_error\">Netwerkfout</string>\n    <string name=\"could_not_load_thumbnails\">Kon niet alle miniaturen laden</string>\n    <string name=\"parsing_error\">Kon website niet verwerken</string>\n    <string name=\"content_not_available\">Inhoud niet beschikbaar</string>\n    <string name=\"could_not_setup_download_menu\">Kon downloadmenu niet instellen</string>\n    <string name=\"app_ui_crash\">App/UI gecrasht</string>\n    <string name=\"player_stream_failure\">Kon deze stream niet afspelen</string>\n    <string name=\"player_unrecoverable_failure\">Onherstelbare spelerfout opgetreden</string>\n    <string name=\"player_recoverable_failure\">Bezig met herstellen van spelerfout</string>\n    <string name=\"external_player_unsupported_link_type\">Externe spelers ondersteunen deze soorten koppelingen niet</string>\n    <string name=\"video_streams_empty\">Geen videostreams gevonden</string>\n    <string name=\"audio_streams_empty\">Geen audiostreams gevonden</string>\n    <string name=\"invalid_directory\">Deze map bestaat niet</string>\n    <string name=\"invalid_source\">Bestand/inhoudsbron bestaat niet</string>\n    <string name=\"invalid_file\">Het bestand bestaat niet of u bent onvoldoende gemachtigd om het te lezen of ernaar te schrijven</string>\n    <string name=\"file_name_empty_error\">De bestandsnaam mag niet blanco zijn</string>\n    <string name=\"error_occurred_detail\">Er is een fout opgetreden: %1$s</string>\n    <string name=\"no_streams_available_download\">Geen streams beschikbaar voor downloaden</string>\n    <string name=\"sorry_string\">Sorry, dit zou niet mogen gebeuren.</string>\n    <string name=\"error_report_button_text\">Meld deze fout via e-mail</string>\n    <string name=\"error_snackbar_message\">Sorry, er is iets fout gegaan.</string>\n    <string name=\"error_snackbar_action\">Melden</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"what_happened_headline\">Wat er is gebeurd:</string>\n    <string name=\"info_labels\">Wat:\\nVerzoek:\\nTaal van inhoud:\\nLand:\\nTaal van applicatie:\\nDienst:\\nGMT tijd:\\nPakket:\\nVersie:\\nVersie van besturingssysteem:</string>\n    <string name=\"your_comment\">Uw opmerking (in het Engels):</string>\n    <string name=\"error_details_headline\">Details:</string>\n    <string name=\"detail_thumbnail_view_description\">Speel video, tijd:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Avatarminiatuur van uploader</string>\n    <string name=\"detail_likes_img_view_description\">Duimen</string>\n    <string name=\"detail_dislikes_img_view_description\">Duimen omlaag</string>\n    <string name=\"search_no_results\">Geen resultaten</string>\n    <string name=\"empty_list_subtitle\">Helemaal niets hier te zien</string>\n    <string name=\"detail_drag_description\">Versleep om de volgorde te wijzigen</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Geluid</string>\n    <string name=\"retry\">Opnieuw proberen</string>\n    <string name=\"no_subscribers\">Geen abonnees</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s abonnee</item>\n        <item quantity=\"other\">%s abonnees</item>\n    </plurals>\n    <string name=\"no_views\">Geen weergaven</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s weergave</item>\n        <item quantity=\"other\">%s weergaven</item>\n    </plurals>\n    <string name=\"no_videos\">Geen video’s</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">%s video’s</item>\n    </plurals>\n    <string name=\"start\">Begin</string>\n    <string name=\"pause\">Pauzeren</string>\n    <string name=\"create\">Aanmaken</string>\n    <string name=\"delete\">Verwijderen</string>\n    <string name=\"checksum\">Controlesom</string>\n    <string name=\"dismiss\">Sluiten</string>\n    <string name=\"rename\">Hernoemen</string>\n    <string name=\"ok\">Oké</string>\n    <string name=\"msg_name\">Bestandsnaam</string>\n    <string name=\"msg_threads\">Threads</string>\n    <string name=\"msg_error\">Fout</string>\n    <string name=\"msg_running\">NewPipe is aan het downloaden</string>\n    <string name=\"msg_running_detail\">Tik voor meer informatie</string>\n    <string name=\"msg_wait\">Even geduld…</string>\n    <string name=\"msg_copied\">Gekopieerd naar klembord</string>\n    <string name=\"no_available_dir\">Kies een beschikbare download map</string>\n    <string name=\"msg_popup_permission\">Deze toestemming is vereist om\n\\nte openen in pop-up modus</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA-uitdaging</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA-uitdaging gevraagd</string>\n    <string name=\"settings_category_downloads_title\">Download</string>\n    <string name=\"settings_file_charset_title\">Toegelaten tekens in bestandsnamen</string>\n    <string name=\"settings_file_replacement_character_summary\">Ongeldige tekens worden vervangen door deze waarde</string>\n    <string name=\"settings_file_replacement_character_title\">Vervangend teken</string>\n    <string name=\"charset_letters_and_digits\">Letters en cijfers</string>\n    <string name=\"charset_most_special_characters\">Meeste speciale tekens</string>\n    <string name=\"title_activity_about\">Over NewPipe</string>\n    <string name=\"title_licenses\">Derdepartijlicenties</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s door %2$s, uitgebracht onder de %3$s</string>\n    <string name=\"tab_about\">Over</string>\n    <string name=\"tab_licenses\">Licenties</string>\n    <string name=\"app_description\">Vrij en licht streamen voor Android.</string>\n    <string name=\"contribution_title\">Bijdragen</string>\n    <string name=\"contribution_encouragement\">Hulp is altijd welkom, of u nu nieuwe ideeën hebt, vertalingen kunt bijdragen, wijzigingen hebt voor het ontwerp, de code kunt opkuisen of er zelfs grote wijzigingen in wilt maken. Hoe meer hulp, hoe beter dat het wordt!</string>\n    <string name=\"view_on_github\">Bekijken op GitHub</string>\n    <string name=\"donation_title\">Doneren</string>\n    <string name=\"donation_encouragement\">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.</string>\n    <string name=\"give_back\">Teruggeven</string>\n    <string name=\"website_title\">Website</string>\n    <string name=\"website_encouragement\">Bezoek de website van NewPipe voor meer informatie en het laatste nieuws.</string>\n    <string name=\"app_license_title\">Licentie van NewPipe</string>\n    <string name=\"read_full_license\">Licentie lezen</string>\n    <string name=\"title_activity_history\">Geschiedenis</string>\n    <string name=\"action_history\">Geschiedenis</string>\n    <string name=\"delete_item_search_history\">Wilt u dit item verwijderen uit uw zoekgeschiedenis\\?</string>\n    <string name=\"title_last_played\">Laatst afgespeeld</string>\n    <string name=\"title_most_played\">Meest afgespeeld</string>\n    <string name=\"main_page_content\">Inhoud van hoofdpagina</string>\n    <string name=\"blank_page_summary\">Blanco pagina</string>\n    <string name=\"kiosk_page_summary\">Kioskpagina</string>\n    <string name=\"channel_page_summary\">Kanaalpagina</string>\n    <string name=\"select_a_channel\">Selecteer een kanaal</string>\n    <string name=\"no_channel_subscribed_yet\">Nog niet geabonneerd op een kanaal</string>\n    <string name=\"select_a_kiosk\">Selecteer een kiosk</string>\n    <string name=\"export_complete_toast\">Geëxporteerd</string>\n    <string name=\"import_complete_toast\">Geïmporteerd</string>\n    <string name=\"no_valid_zip_file\">Geen geldig ZIP-bestand</string>\n    <string name=\"could_not_import_all_files\">Opgelet: kon niet alle bestanden importeren.</string>\n    <string name=\"override_current_data\">Dit zal uw huidige configuratie overschrijven.</string>\n    <string name=\"trending\">Populair</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Nieuw en populair</string>\n    <string name=\"play_queue_remove\">Verwijderen</string>\n    <string name=\"play_queue_stream_detail\">Details</string>\n    <string name=\"play_queue_audio_settings\">Audio-instellingen</string>\n    <string name=\"hold_to_append\">Houd ingedrukt om toe te voegen aan wachtrij</string>\n    <string name=\"start_here_on_background\">Begint met afspelen in de achtergrond</string>\n    <string name=\"start_here_on_popup\">Afspelen in pop-up</string>\n    <string name=\"drawer_open\">Menu openen</string>\n    <string name=\"drawer_close\">Menu sluiten</string>\n    <string name=\"preferred_open_action_settings_title\">Voorkeursactie voor openen</string>\n    <string name=\"preferred_open_action_settings_summary\">Standaard actie bij openen van inhoud — %s</string>\n    <string name=\"video_player\">Videospeler</string>\n    <string name=\"background_player\">Achtergrondspeler</string>\n    <string name=\"popup_player\">Pop-upspeler</string>\n    <string name=\"always_ask_open_action\">Altijd vragen</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Info ophalen…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Bezig met laden van gevraagde inhoud</string>\n    <string name=\"create_playlist\">Nieuwe afspeellijst</string>\n    <string name=\"rename_playlist\">Hernoemen</string>\n    <string name=\"name\">Naam</string>\n    <string name=\"add_to_playlist\">Toevoegen aan afspeellijst</string>\n    <string name=\"set_as_playlist_thumbnail\">Instellen als miniatuur voor afspeellijst</string>\n    <string name=\"bookmark_playlist\">Afspeellijst toevoegen aan bladwijzers</string>\n    <string name=\"unbookmark_playlist\">Bladwijzer verwijderen</string>\n    <string name=\"delete_playlist_prompt\">Deze afspeellijst verwijderen\\?</string>\n    <string name=\"playlist_creation_success\">Afspeellijst aangemaakt</string>\n    <string name=\"playlist_add_stream_success\">Toegevoegd aan afspeellijst</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniatuur voor afspeellijst gewijzigd.</string>\n    <string name=\"caption_none\">Geen bijschriften</string>\n    <string name=\"resize_fit\">Passend</string>\n    <string name=\"resize_fill\">Opvullen</string>\n    <string name=\"resize_zoom\">Inzoomen</string>\n    <string name=\"caption_auto_generated\">Automatisch gegenereerd</string>\n    <string name=\"caption_setting_title\">Bijschriften</string>\n    <string name=\"caption_setting_description\">Bijschrift grootte en achtergrond stijlen wijzigen. Vereist herstart van de app</string>\n    <string name=\"enable_leak_canary_summary\">Het monitoren van geheugenlekken kan ervoor zorgen dat de app niet goed meer reageert</string>\n    <string name=\"enable_disposed_exceptions_title\">Out-of-lifecycle-fouten melden</string>\n    <string name=\"enable_disposed_exceptions_summary\">Forceer het melden van niet-bezorgbare Rx-uitzonderingen buiten fragment of activiteitscyclus</string>\n    <string name=\"import_title\">Importeren</string>\n    <string name=\"import_from\">Importeren uit</string>\n    <string name=\"export_to\">Exporteren naar</string>\n    <string name=\"import_ongoing\">Bezig met importeren…</string>\n    <string name=\"export_ongoing\">Bezig met exporteren…</string>\n    <string name=\"import_file_title\">Bestand importeren</string>\n    <string name=\"previous_export\">Vorige exportering</string>\n    <string name=\"subscriptions_import_unsuccessful\">Kon abonnementen niet importeren</string>\n    <string name=\"subscriptions_export_unsuccessful\">Kon abonnementen niet exporteren</string>\n    <string name=\"import_youtube_instructions\">Importeer je YouTube-abonnementen vanaf Google Takeout:\n\\n\n\\n1. Ga naar dit adres: %1$s\n\\n2. Log in op je account\n\\n3. Klik op \\\"Alle YouTube-gegevens inbegrepen\\\", dan op \\\"Selectie van alle items ongedaan maken\\\", dan selecteer alleen \\\"abonnementen\\\" en klik op \\\"OK\\\"\n\\n4. Klik op \\\"Volgende stap\\\", dan op \\\"Export maken\\\"\n\\n5. Klik op de knop \\\"Downloaden\\\" nadat deze verschijnt\n\\n6. Klik op IMPORTEER BESTAND hieronder en selecteer het gedownloade zip-bestand\n\\n7. [Als de zip import faalt] Pak het .csv bestand uit (gebruikelijk in de folder \\\"YouTube en YouTube Music/abonnementen/abonnementen.csv), klik op IMPORTEER BESTAND hieronder en selecteer het uitgepakt csv bestand</string>\n    <string name=\"import_soundcloud_instructions\">Importeer een SoundCloud-profiel door de URL of het ID ervan in te voeren:\n\\n\n\\n1. Kies een webbrowser en schakel bureaubladmodus in (de website is niet beschikbaar voor mobiele apparaten)\n\\n2. Ga naar dit adres: %1$s\n\\n3. Log in op uw account\n\\n4. Kopieer de koppeling van de pagina waar u op terechtkomt (dat is uw profiel-URL).</string>\n    <string name=\"import_soundcloud_instructions_hint\">uwID, soundbutt.com/uwid</string>\n    <string name=\"import_network_expensive_warning\">Let op: deze actie kan veel MB’s van uw netwerk gebruiken.\n\\n\n\\nWilt u doorgaan\\?</string>\n    <string name=\"playback_speed_control\">Afspeelsnelheidsbesturing</string>\n    <string name=\"playback_tempo\">Tempo</string>\n    <string name=\"playback_pitch\">Toon</string>\n    <string name=\"unhook_checkbox\">Ontkoppelen (kan ruis veroorzaken)</string>\n    <string name=\"clear_views_history_title\">Wissen afspeel geschiedenis</string>\n    <string name=\"clear_views_history_summary\">Verwijdert de geschiedenis van bekeken video\\'s en afspeelposities</string>\n    <string name=\"delete_view_history_alert\">Alle afspeel geschiedenis verwijderen\\?</string>\n    <string name=\"watch_history_deleted\">Afspeel geschiedenis verwijderd</string>\n    <string name=\"clear_search_history_title\">Zoekgeschiedenis wissen</string>\n    <string name=\"clear_search_history_summary\">Verwijdert de gebruikte zoektermen</string>\n    <string name=\"delete_search_history_alert\">De hele zoekgeschiedenis verwijderen\\?</string>\n    <string name=\"search_history_deleted\">Zoekgeschiedenis verwijderd</string>\n    <string name=\"one_item_deleted\">1 item verwijderd.</string>\n    <string name=\"app_license\">NewPipe is vrije software: u kan het gebruiken, bestuderen, delen en verbeteren zoveel u maar wil. U kan het opnieuw uitgeven en/of aanpassen volgens de voorwaarden van de GNU General Public License, gepubliceerd door de Free Software Foundation, versie 3 van de licentie, of (indien gewenst) om het even welke latere versie.</string>\n    <string name=\"import_settings\">Wilt u ook de instellingen importeren\\?</string>\n    <string name=\"privacy_policy_title\">Privacybeleid van NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">Het NewPipe-project neemt privacy serieus. Daarom verzamelt de app geen gegevens zonder uw toestemming.\n\\nNewPipe\\'s privacybeleid legt gedetailleerd uit welke gegevens verstuurd en opgeslagen worden als u een crashrapport verstuurt.</string>\n    <string name=\"read_privacy_policy\">Privacybeleid lezen</string>\n    <string name=\"start_accept_privacy_policy\">Om de Europese Algemene Verordening Gegevensbescherming (ook wel: AVG of GDPR) na te leven, wijzen we u op het nieuwe privacybeleid van NewPipe. Lees dit zorgvuldig.\n\\nU moet het beleid aanvaarden om ons het foutrapport te kunnen opsturen.</string>\n    <string name=\"accept\">Aanvaarden</string>\n    <string name=\"decline\">Weigeren</string>\n    <string name=\"limit_data_usage_none_description\">Onbeperkt</string>\n    <string name=\"limit_mobile_data_usage_title\">Resolutie beperken bij gebruik van mobiele gegevens</string>\n    <string name=\"minimize_on_exit_title\">Minimaliseren bij overschakelen naar andere app</string>\n    <string name=\"minimize_on_exit_summary\">Actie bij overschakelen van videospeler naar andere app — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Geen</string>\n    <string name=\"minimize_on_exit_background_description\">Afspelen in achtergrond</string>\n    <string name=\"minimize_on_exit_popup_description\">Afspelen in pop-up</string>\n    <string name=\"skip_silence_checkbox\">Doorspoelen tijdens stilte</string>\n    <string name=\"playback_step\">Stap</string>\n    <string name=\"playback_reset\">Resetten</string>\n    <string name=\"channels\">Kanalen</string>\n    <string name=\"playlists\">Afspeellijsten</string>\n    <string name=\"tracks\">Nummers</string>\n    <string name=\"users\">Gebruikers</string>\n    <string name=\"unsubscribe\">Abonnement opzeggen</string>\n    <string name=\"tab_choose\">Kiest een tabblad</string>\n    <string name=\"settings_category_updates_title\">Updates</string>\n    <string name=\"events\">Gebeurtenissen</string>\n    <string name=\"file_deleted\">Bestand verwijderd</string>\n    <string name=\"app_update_notification_channel_name\">Appupdatemelding</string>\n    <string name=\"app_update_notification_channel_description\">Meldingen voor nieuwe versies van NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Externe opslag niet beschikbaar</string>\n    <string name=\"download_to_sdcard_error_message\">Downloaden naar externe SD-kaart is niet mogelijk. Download map opnieuw instellen\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Fout bij het lezen van de opgeslagen tabbladen, waardoor standaard tabbladen worden gebruikt</string>\n    <string name=\"restore_defaults\">Standaard instellingen herstellen</string>\n    <string name=\"restore_defaults_confirmation\">Wil je de standaard instellingen herstellen\\?</string>\n    <string name=\"subscribers_count_not_available\">Aantal abonnees niet beschikbaar</string>\n    <string name=\"main_page_content_summary\">Welke tabbladen er worden weergegeven op de hoofdpagina</string>\n    <string name=\"conferences\">Conferenties</string>\n    <string name=\"updates_setting_title\">Updates</string>\n    <string name=\"updates_setting_description\">Toon een melding om de app bij te werken indien er een nieuwe versie beschikbaar is</string>\n    <string name=\"list_view_mode\">Lijstweergave modus</string>\n    <string name=\"list\">Lijst</string>\n    <string name=\"grid\">Raster</string>\n    <string name=\"auto\">Auto</string>\n    <string name=\"app_update_available_notification_title\">NewPipe update is beschikbaar!</string>\n    <string name=\"missions_header_finished\">Voltooid</string>\n    <string name=\"paused\">gepauzeerd</string>\n    <string name=\"queued\">toegevoegd aan wachtrij</string>\n    <string name=\"post_processing\">nabewerking</string>\n    <string name=\"enqueue\">Wachtrij</string>\n    <string name=\"permission_denied\">Actie geweigerd door het systeem</string>\n    <string name=\"download_failed\">Download mislukt</string>\n    <string name=\"generate_unique_name\">Unieke naam genereren</string>\n    <string name=\"overwrite\">Overschrijven</string>\n    <string name=\"overwrite_finished_warning\">Er bestaat al een gedownload bestand met deze naam</string>\n    <string name=\"download_already_running\">Er is al een download met deze naam bezig</string>\n    <string name=\"show_error\">Foutmelding weergeven</string>\n    <string name=\"error_file_creation\">Het bestand kan niet aangemaakt worden</string>\n    <string name=\"error_path_creation\">De doelmap kan niet aangemaakt worden</string>\n    <string name=\"error_ssl_exception\">Kon geen beveiligde verbinding opzetten</string>\n    <string name=\"error_unknown_host\">Kon de server niet vinden</string>\n    <string name=\"error_connect_host\">Kan geen verbinding maken met de server</string>\n    <string name=\"error_http_no_content\">De server verzendt geen gegevens</string>\n    <string name=\"error_http_unsupported_range\">De server aanvaardt geen multi-threaded downloads, probeer het opnieuw met @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Niet gevonden</string>\n    <string name=\"error_postprocessing_failed\">Nabewerking mislukt</string>\n    <string name=\"stop\">Stoppen</string>\n    <string name=\"max_retry_msg\">Maximaal aantal pogingen</string>\n    <string name=\"max_retry_desc\">Maximaal aantal pogingen vooraleer dat de download wordt geannuleerd</string>\n    <string name=\"pause_downloads_on_mobile\">Pauzeren bij mobiele data verbinding</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Nuttig bij het gebruik van mobiele data, hoewel sommige downloads niet uitgesteld kunnen worden</string>\n    <string name=\"show_comments_title\">Commentaren weergeven</string>\n    <string name=\"show_comments_summary\">Schakel dit uit om reacties te verbergen</string>\n    <string name=\"autoplay_title\">Automatisch afspelen</string>\n    <string name=\"no_comments\">Geen commentaren</string>\n    <string name=\"error_unable_to_load_comments\">Kan commentaren niet laden</string>\n    <string name=\"close\">Sluiten</string>\n    <string name=\"error_progress_lost\">Vooruitgang verloren, omdat het bestand gedeletet werd</string>\n    <string name=\"search_showing_result_for\">Resultaten aan het tonen voor: %s</string>\n    <string name=\"playlist_page_summary\">Afspeellijst pagina</string>\n    <string name=\"video_detail_by\">Door %s</string>\n    <string name=\"channel_created_by\">Gemaakt door %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanaal avatar afbeelding</string>\n    <string name=\"content_not_supported\">Deze inhoud wordt nog niet ondersteund door NewPipe.\n\\n\n\\nHopelijk zal dit bij een toekomstige versie ondersteund worden.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Denk je dat het laden van de feed te sloom is\\? Zo ja, probeer snel laden in te schakelen (in de instellingen of door op onderstaande knop te drukken).\n\\n\n\\nNewPipe biedt twee strategieën aan voor het laden van de feed:\n\\n• Het hele abonnementskanaal ophalen, wat sloom maar compleet is.\n\\n• Een speciale feed ophalen, wat snel maar meestal incompleet is.\n\\n\n\\nHet verschil tussen de twee is dat de snelle meestal wat informatie mist, zoals de duur of type (live of een normale video) van het item en dat er mogelijk minder items zijn.\n\\n\n\\nYouTube is een voorbeeld van een service die deze snelle methode aanbiedt door zijn RSS-feed.\n\\n\n\\nDe keuze komt dus neer op wat je liever hebt: snelheid of precieze informatie.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Snelle modus uitschakelen</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Snelle modus inschakelen</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Beschikbaar in sommige services, het is meestal veel sneller, maar kan een beperkte hoeveelheid items en vaak onvolledige informatie (bijv. geen duur, item type, of live status) bevatten.</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Uit speciale feed ophalen indien beschikbaar</string>\n    <string name=\"feed_update_threshold_option_always_update\">Altijd updaten</string>\n    <string name=\"feed_update_threshold_summary\">Tijd na de laatste update voordat een abonnement als verouderd wordt beschouwd — %s</string>\n    <string name=\"feed_update_threshold_title\">Drempel voor feed update</string>\n    <string name=\"settings_category_feed_title\">Feed</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Toon enkel niet gegroepeerde abonnementen</string>\n    <string name=\"feed_create_new_group_button_title\">Nieuw</string>\n    <string name=\"feed_group_dialog_delete_message\">Wilt u deze groep verwijderen\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Lege groepsnaam</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d geselecteerd</item>\n        <item quantity=\"other\">%d geselecteerd</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Geen abonnement geselecteerd</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Selecteer abonnementen</string>\n    <string name=\"feed_processing_message\">Feed aan het verwerken…</string>\n    <string name=\"feed_notification_loading\">Feed aan het laden…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Niet geladen: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Laatste update nieuws­feed: %s</string>\n    <string name=\"feed_groups_header_title\">Kanaalgroepen</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dag</item>\n        <item quantity=\"other\">%d dagen</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d uur</item>\n        <item quantity=\"other\">%d uren</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuut</item>\n        <item quantity=\"other\">%d minuten</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d seconde</item>\n        <item quantity=\"other\">%d seconden</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Door beperkingen van ExoPlayer is de zoekduur ingesteld op %d seconden</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Ja, en deels bekeken video\\'s</string>\n    <string name=\"remove_watched_popup_warning\">Video\\'s die zijn bekeken voor, en na, ze werden toegevoegd aan de afspeellijst worden verwijderd. \\nBent u zeker? Dit kan niet ongedaan gemaakt worden!</string>\n    <string name=\"remove_watched_popup_title\">Verwijder bekeken video\\'s?</string>\n    <string name=\"remove_watched\">Verwijder bekeken</string>\n    <string name=\"systems_language\">Systeem standaard</string>\n    <string name=\"app_language_title\">App taal</string>\n    <string name=\"choose_instance_prompt\">Kies een instantie</string>\n    <string name=\"downloads_storage_use_saf_summary\">Het \\'Storage Access Framework\\' laat downloads naar een externe SD kaart toe.\n\\nNiet alle toestellen zijn compatibel</string>\n    <string name=\"downloads_storage_use_saf_title\">Gebruik SAF</string>\n    <string name=\"downloads_storage_ask_title\">Vraag waar te downloaden</string>\n    <string name=\"downloads_storage_ask_summary\">U wordt gevraagd waar elk bestand wordt opgeslagen</string>\n    <string name=\"pause_downloads\">Pauzeer downloads</string>\n    <string name=\"start_downloads\">Downloads starten</string>\n    <string name=\"enable_queue_limit_desc\">Maximaal 1 bestand tegelijk zal worden gedownload</string>\n    <string name=\"enable_queue_limit\">Limiteer de download wachtrij</string>\n    <string name=\"delete_downloaded_files\">Verwijder gedownloade bestanden</string>\n    <string name=\"confirm_prompt\">Wilt u de downloadgeschiedenis of alle gedownloade bestanden verwijderen\\?</string>\n    <string name=\"clear_download_history\">Download geschiedenis verwijderen</string>\n    <string name=\"error_download_resource_gone\">Kan deze download niet herstellen</string>\n    <string name=\"error_timeout\">Verbinding time-out</string>\n    <string name=\"error_insufficient_storage_left\">Geen vrije ruimte meer op het apparaat</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe werd gesloten terwijl het bezig was met het bestand</string>\n    <string name=\"download_already_pending\">Er staat al een download met deze naam in wacht</string>\n    <string name=\"overwrite_failed\">Kan bestand niet overschrijven</string>\n    <string name=\"overwrite_unrelated_warning\">Er bestaat al een bestand met deze naam</string>\n    <string name=\"recovering\">aan het herstellen</string>\n    <string name=\"missions_header_pending\">In afwachting</string>\n    <string name=\"never\">Nooit</string>\n    <string name=\"wifi_only\">Enkel via Wi-Fi</string>\n    <string name=\"autoplay_summary\">Automatisch afspelen — %s</string>\n    <string name=\"show_original_time_ago_summary\">Originele teksten van services zijn zichtbaar in stream items</string>\n    <string name=\"show_memory_leaks\">Toon memory leaks</string>\n    <string name=\"playlist_no_uploader\">Automatisch gegenereerd (geen uploader gevonden)</string>\n    <string name=\"unmute\">Geluid aanzetten</string>\n    <string name=\"mute\">Dempen</string>\n    <string name=\"enqueued\">In wachtrij geplaatst</string>\n    <string name=\"enqueue_stream\">In wachtrij plaatsen</string>\n    <string name=\"title_activity_play_queue\">Speel wachtrij af</string>\n    <string name=\"most_liked\">Meest leuk gevonden</string>\n    <string name=\"recently_added\">Recent toegevoegd</string>\n    <string name=\"local\">Lokaal</string>\n    <string name=\"no_playlist_bookmarked_yet\">Geen afspeellijst bladwijzers</string>\n    <string name=\"select_a_playlist\">Selecteer een afspeellijst</string>\n    <string name=\"default_kiosk_page_summary\">Standaard kiosk</string>\n    <string name=\"done\">Klaar</string>\n    <string name=\"subtitle_activity_recaptcha\">Tik op ‘Klaar’ zodra opgelost</string>\n    <string name=\"infinite_videos\">∞ video\\'s</string>\n    <string name=\"more_than_100_videos\">100+ video\\'s</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s luisteraar</item>\n        <item quantity=\"other\">%s luisteraars</item>\n    </plurals>\n    <string name=\"no_one_listening\">Niemand is aan het luisteren</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s kijker</item>\n        <item quantity=\"other\">%s kijkers</item>\n    </plurals>\n    <string name=\"no_one_watching\">Niemand is aan het kijken</string>\n    <string name=\"drawer_header_description\">Toggle service, momenteel geselecteerd:</string>\n    <string name=\"error_report_open_github_notice\">Controleer aub 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.</string>\n    <string name=\"error_report_open_issue_button_text\">In GitHub rapporteren</string>\n    <string name=\"copy_for_github\">Kopieer opgemaakt rapport</string>\n    <string name=\"permission_display_over_apps\">Geef toestemming voor weergave over andere apps</string>\n    <string name=\"missing_file\">Stream bestand downloaden</string>\n    <string name=\"watch_history_states_deleted\">Afspeelposities verwijderd</string>\n    <string name=\"delete_playback_states_alert\">Alle afspeelposities verwijderen\\?</string>\n    <string name=\"clear_playback_states_summary\">Verwijdert alle geschiedenis van afspeelposities</string>\n    <string name=\"clear_playback_states_title\">Verwijder geschiedenis afspeelposities</string>\n    <string name=\"clear_cookie_summary\">Verwijder cookies die NewPipe opslaat wanneer u een reCAPTCHA oplost</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA cookies zijn verwijderd</string>\n    <string name=\"clear_cookie_title\">Verwijder reCAPTCHA cookies</string>\n    <string name=\"artists\">Artiesten</string>\n    <string name=\"albums\">Albums</string>\n    <string name=\"songs\">Nummers</string>\n    <string name=\"videos_string\">Video\\'s</string>\n    <string name=\"restricted_video\">Deze video heeft een leeftijdsbeperking.\n\\n\n\\nSchakel \\\"%1$s\\\" in bij de instellingen als u die wilt zien.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube biedt een \\\"beperkte modes\\\" aan, dit verbergt mogelijk materiaal voor volwassenen</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTube \\\"beperkte modus\\\" aanzetten</string>\n    <string name=\"show_age_restricted_content_summary\">Toon inhoud die mogelijk niet geschikt is voor kinderen omwille van een leeftijdslimiet (zoals 18+)</string>\n    <string name=\"peertube_instance_add_exists\">Kanaal bestaat al</string>\n    <string name=\"peertube_instance_add_https_only\">Alleen HTTPS URL\\'s worden ondersteund</string>\n    <string name=\"peertube_instance_add_fail\">Kon kanaal niet valideren</string>\n    <string name=\"peertube_instance_add_help\">Kanaal URL invoeren</string>\n    <string name=\"peertube_instance_add_title\">Kanaal toevoegen</string>\n    <string name=\"peertube_instance_url_help\">Vind het kanaal dat u leuk vindt op %s</string>\n    <string name=\"peertube_instance_url_summary\">Selecteer je favoriete PeerTube kanaal</string>\n    <string name=\"peertube_instance_url_title\">PeerTube kanaal</string>\n    <string name=\"unsupported_url_dialog_message\">Kon de URL niet herkennen. In een andere app openen\\?</string>\n    <string name=\"settings_category_clear_data_title\">Wis data</string>\n    <string name=\"enable_playback_state_lists_summary\">Laat afspeeltijd in afspeellijst zien</string>\n    <string name=\"enable_playback_state_lists_title\">Posities in lijst</string>\n    <string name=\"enable_playback_resume_summary\">Verder afspelen vanaf laatste positie</string>\n    <string name=\"enable_playback_resume_title\">Afspelen hervatten</string>\n    <string name=\"auto_queue_toggle\">Volgende stream automatisch in wachtrij plaatsen</string>\n    <string name=\"clear_queue_confirmation_description\">De actieve wachtrij wordt vervangen</string>\n    <string name=\"clear_queue_confirmation_summary\">Veranderen van één speler naar een andere kan jouw wachtrij vervangen</string>\n    <string name=\"clear_queue_confirmation_title\">Vraag bevestiging om wachtrij te wissen</string>\n    <string name=\"seek_duration_title\">Duur voor-/achteruit spoelen</string>\n    <string name=\"notification_action_nothing\">Niets</string>\n    <string name=\"notification_action_buffering\">Aan het bufferen</string>\n    <string name=\"notification_action_shuffle\">Shuffle</string>\n    <string name=\"notification_action_repeat\">Herhaal</string>\n    <string name=\"notification_actions_at_most_three\">Je kan maximaal drie acties selecteren om te tonen in de compacte notificatie!</string>\n    <string name=\"notification_actions_summary\">Pas elke notificatie actie hieronder aan door er op te tikken. Selecteer tot drie acties die getoond worden in de compacte notificatie door gebruik te maken van de selectie vakjes aan de rechterkant.</string>\n    <string name=\"notification_action_4_title\">Vijfde actie knop</string>\n    <string name=\"notification_action_3_title\">Vierde actie knop</string>\n    <string name=\"notification_action_2_title\">Derde actie knop</string>\n    <string name=\"notification_action_1_title\">Tweede actie knop</string>\n    <string name=\"notification_action_0_title\">Eerste actie knop</string>\n    <string name=\"notification_scale_to_square_image_summary\">Snij de miniatuurafbeelding van de video die getoond wordt in de notificatie bij van 16:9 naar een 1:1 verhouding</string>\n    <string name=\"notification_scale_to_square_image_title\">Miniatuurafbeelding naar verhouding 1:1 bijknippen</string>\n    <string name=\"show_original_time_ago_title\">Toon oorspronkelijke tijd geleden op items</string>\n    <string name=\"notification_colorize_summary\">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)</string>\n    <string name=\"notification_colorize_title\">Notificatie kleur aanpassen</string>\n    <string name=\"recent\">Recent</string>\n    <string name=\"show_thumbnail_summary\">Gebruik miniatuur voor de achtergrond en meldingen op vergrendeld scherm</string>\n    <string name=\"show_thumbnail_title\">Toon miniatuur</string>\n    <string name=\"msg_calculating_hash\">Hash aan het berekenen</string>\n    <string name=\"hash_channel_description\">Meldingen van vooruitgang video hashing</string>\n    <string name=\"hash_channel_name\">Video Hash Melding</string>\n    <string name=\"show_meta_info_summary\">Zet uit om metadata pop-ups te verbergen met extra informatie over de stream auteur, stream inhoud of een zoekaanvraag</string>\n    <string name=\"show_meta_info_title\">Toon metadata</string>\n    <string name=\"disable_media_tunneling_title\">Media vertunneling uitschakelen</string>\n    <string name=\"show_channel_details\">Toon kanaal details</string>\n    <string name=\"recaptcha_solve\">Los op</string>\n    <string name=\"description_tab_description\">Beschrijving</string>\n    <string name=\"related_items_tab_description\">Gerelateerde items</string>\n    <string name=\"comments_tab_description\">Reacties</string>\n    <string name=\"restricted_video_no_stream\">Deze video heeft een leeftijdsbeperking.\n\\nAls gevolg van het nieuwe YouTube-beleid met video\\'s met leeftijdsbeperkingen heeft NewPipe geen toegang tot deze videostreams en kan deze dus niet afspelen.</string>\n    <string name=\"show_description_summary\">Zet uit om videobeschrijving en extra informatie te verbergen</string>\n    <string name=\"show_description_title\">Toon beschrijving</string>\n    <string name=\"night_theme_title\">Nacht thema</string>\n    <string name=\"open_with\">Open met</string>\n    <string name=\"featured\">Featured</string>\n    <string name=\"private_content\">Deze inhoud is privé, waardoor het niet kan worden gestreamd of gedownload door NewPipe.</string>\n    <string name=\"crash_the_app\">Laat de app crashen</string>\n    <string name=\"disable_media_tunneling_summary\">Schakel media tunneling uit indien u een zwart scherm of haperingen vaststelt bij het afspelen van video\\'s</string>\n    <string name=\"download_has_started\">De download is begonnen</string>\n    <string name=\"select_night_theme_toast\">U kunt uw favoriete nachtthema hieronder kiezen</string>\n    <string name=\"night_theme_summary\">Kies uw favoriete nachtthema - %s</string>\n    <string name=\"auto_device_theme_title\">Automatisch (thema van de telefoon)</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"paid_content\">Deze inhoud is enkel toegankelijk voor betalende gebruikers, waardoor het niet kan worden gestreamd of gedownload door NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Deze video is enkel toegankelijk voor YouTube Music Premium leden, waardoor het niet kan worden gestreamd of gedownload door NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Dit is (tenminste in uw land) een SoundCloud Go+ titel, waardoor het niet kan worden gestreamd of gedownload door NewPipe.</string>\n    <string name=\"georestricted_content\">Deze inhoud is niet toegankelijk in uw land.</string>\n    <string name=\"no_app_to_open_intent\">Geen app beschikbaar om dit te openen</string>\n    <string name=\"chapters\">Hoofdstukken</string>\n    <string name=\"enqueue_next_stream\">Volgende in de wachtrij</string>\n    <string name=\"enqueued_next\">Volgende in de wachtrij</string>\n    <string name=\"high_quality_larger\">Hoge kwaliteit (groter)</string>\n    <string name=\"low_quality_smaller\">Lage kwaliteit (kleiner)</string>\n    <string name=\"start_main_player_fullscreen_title\">Start hoofdspeler in volledig scherm</string>\n    <string name=\"main_page_content_swipe_remove\">Veeg items om ze te verwijderen</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Zoekbalk miniatuurvoorbeeld</string>\n    <string name=\"mark_as_watched\">Markeer als bekeken</string>\n    <string name=\"local_search_suggestions\">Lokale zoeksuggesties</string>\n    <string name=\"remote_search_suggestions\">Suggesties voor zoeken op afstand</string>\n    <string name=\"start_main_player_fullscreen_summary\">Start geen video\\'s in de minispeler, maar schakel direct over naar volledig scherm-modus, als de auto rotatie is vergrendeld. U kunt de minispeler nog steeds openen door het volledige scherm te verlaten</string>\n    <string name=\"no_dir_yet\">Geen download map ingesteld, kies nu de standaard download map</string>\n    <string name=\"dont_show\">Niet tonen</string>\n    <string name=\"comments_are_disabled\">Reacties zijn uitgeschakeld</string>\n    <string name=\"settings_category_player_notification_title\">Speler melding</string>\n    <string name=\"settings_category_player_notification_summary\">Configureer actieve stream melding</string>\n    <string name=\"notifications\">Meldingen</string>\n    <string name=\"streams_notification_channel_name\">Nieuwe streams</string>\n    <string name=\"streams_notification_channel_description\">Meldingen over nieuwe streams voor abonnementen</string>\n    <string name=\"error_report_notification_title\">NewPipe meldt een fout, tik om te rapporteren</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nieuwe stream</item>\n        <item quantity=\"other\">%s nieuwe streams</item>\n    </plurals>\n    <string name=\"error_report_channel_name\">Foutrapport melding</string>\n    <string name=\"loading_stream_details\">Stream details aan het laden…</string>\n    <string name=\"error_report_notification_toast\">Een fout is opgetreden, zie melding</string>\n    <string name=\"crash_the_player\">Crash de speler</string>\n    <string name=\"error_report_channel_description\">Meldingen om fouten te rapporteren</string>\n    <string name=\"processing_may_take_a_moment\">Verwerken... Dit kan even duren</string>\n    <string name=\"leak_canary_not_available\">LeakCanary is niet beschikbaar</string>\n    <string name=\"progressive_load_interval_summary\">Verander de intervalgrootte voor het laden van progressieve inhoud (momenteel %s). Een lagere waarde kan het initiële laden versnellen</string>\n    <string name=\"tab_bookmarks_short\">Afspeellijsten</string>\n    <string name=\"notification_actions_summary_android13\">Bewerk elke meldingsactie hieronder door erop te tikken. De eerste drie acties (afspelen/pauzeren, vorige en volgende) zijn ingesteld door het systeem en kunnen niet worden aangepast.</string>\n    <string name=\"progressive_load_interval_title\">Intervalgrootte voor afspelen laden</string>\n    <string name=\"yes\">Ja</string>\n    <string name=\"no\">Nee</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Handig, bijvoorbeeld, als je een hoofdtelefoon gebruikte met kapotte fysieke knoppen</string>\n    <string name=\"prefer_descriptive_audio_title\">Verkies beschrijvende audio</string>\n    <string name=\"prefer_original_audio_title\">Verkies originele audio</string>\n    <string name=\"prefer_original_audio_summary\">Selecteer het oorspronkelijke audiospoor, ongeacht de taal</string>\n    <string name=\"search_with_service_name\">Zoeken%1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Zoeken%1$s(%2$s)</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-nn/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Trykk på aukeglaset for å byrja.</string>\n    <string name=\"upload_date_text\">Gjeve ut den %1$s</string>\n    <string name=\"no_player_found\">Fann ingen straumavspelarar. Legg inn VLC\\?</string>\n    <string name=\"no_player_found_toast\">Fann ingen straumavspelarar (du kan leggja inn VLC for å spela av straumen).</string>\n    <string name=\"install\">Legg inn</string>\n    <string name=\"cancel\">Avbryt</string>\n    <string name=\"ok\">Greitt</string>\n    <string name=\"open_in_browser\">Opn i ein nettlesar</string>\n    <string name=\"mark_as_watched\">Merk som sett</string>\n    <string name=\"open_in_popup_mode\">Sprett opp i eit vindauga</string>\n    <string name=\"open_with\">Opn med</string>\n    <string name=\"share\">Del</string>\n    <string name=\"search\">Søk</string>\n    <string name=\"settings\">Innstillingar</string>\n    <string name=\"did_you_mean\">Meinte du «%1$s»\\?</string>\n    <string name=\"share_dialog_title\">Del med</string>\n    <string name=\"use_external_video_player_title\">Nytt ytre videospelar</string>\n    <string name=\"use_external_video_player_summary\">Tek bort ljod ved somme oppløysingar</string>\n    <string name=\"use_external_audio_player_title\">Nytt ein ytre ljodavspelar</string>\n    <string name=\"subscribe_button_title\">Fylg</string>\n    <string name=\"subscribed_button_title\">Fylgjer</string>\n    <string name=\"unsubscribe\">Stogg å fylgja</string>\n    <string name=\"channel_unsubscribed\">Stogga å fylgja kanalen</string>\n    <string name=\"show_info\">Vis opplysingar</string>\n    <string name=\"tab_subscriptions\">Fylgde</string>\n    <string name=\"tab_bookmarks\">Gøymde spelelister</string>\n    <string name=\"tab_choose\">Vel fane</string>\n    <string name=\"controls_popup_title\">Sprett opp</string>\n    <string name=\"controls_add_to_playlist_title\">Legg til i</string>\n    <string name=\"download_path_dialog_title\">Vel hentemappe for videofiler</string>\n    <string name=\"download_path_audio_title\">Hentemappe for ljod</string>\n    <string name=\"show_higher_resolutions_title\">Vis høgare oppløysingar</string>\n    <string name=\"show_higher_resolutions_summary\">Berre somme einingar kan spela av 2K-/4K-videoar</string>\n    <string name=\"play_with_kodi_title\">Spel av med Kodi</string>\n    <string name=\"show_play_with_kodi_title\">Vis \\\"Spela av med Kodi\\\"-val</string>\n    <string name=\"download\">Hent</string>\n    <string name=\"controls_download_desc\">Hent straumfil</string>\n    <string name=\"download_path_summary\">Gøymer henta videofiler her</string>\n    <string name=\"controls_background_title\">Bakgrunn</string>\n    <string name=\"download_path_title\">Videohentingsmappe</string>\n    <string name=\"download_path_audio_summary\">Henta ljodfiler vert gøymde her</string>\n    <string name=\"download_path_audio_dialog_title\">Vel hentemappe for ljodfiler</string>\n    <string name=\"kore_not_found\">Legg inn saknande Kore-app\\?</string>\n    <string name=\"search_showing_result_for\">Viser svar for: %s</string>\n    <string name=\"subscription_change_failed\">Greidde ikkje å brigde fylginga</string>\n    <string name=\"tablet_mode_title\">Nettbrettvising</string>\n    <string name=\"on\">På</string>\n    <string name=\"off\">Av</string>\n    <string name=\"notifications_disabled\">Merknader er slått av</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Slå av/på alle</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Ingen ljodstraumar er tilgjengelege for ytre avspelarar</string>\n    <string name=\"no_video_streams_available_for_external_players\">Ingen videostraumar er tilgjengelege for ytre avspelarar</string>\n    <string name=\"select_quality_external_players\">Vel kvalitet for ytre avspelarar</string>\n    <string name=\"sort\">Skil ut</string>\n    <string name=\"open_website_license\">Opn nettstaden</string>\n    <string name=\"you_successfully_subscribed\">Du fylgjer no denne kanalen</string>\n    <string name=\"selected_stream_external_player_not_supported\">Vald straum er ikkje stødd av ytre avspelarar</string>\n    <string name=\"streams_not_yet_supported_removed\">Straumar som ikkje enno er stødde av hentaren, er ikkje synlege</string>\n    <string name=\"unknown_quality\">Ukjend kvalitet</string>\n    <string name=\"unknown_format\">Ukjend format</string>\n    <string name=\"default_resolution_title\">Forvald oppløysing</string>\n    <string name=\"default_popup_resolution_title\">Forvald oppsprettsoppløysing</string>\n    <string name=\"show_play_with_kodi_summary\">Vis eit val om å spela av ein video med mediasamlestaden Kodi</string>\n    <string name=\"notification_scale_to_square_image_title\">Skjer småbiletet til storleikshøvet 1:1</string>\n    <string name=\"notification_scale_to_square_image_summary\">Skjer videosmåbiletet som vert vist i varselet, ifrå storleikshøvet 16:9 til 1:1</string>\n    <string name=\"notification_action_0_title\">Fyrste gjerdknapp</string>\n    <string name=\"notification_action_1_title\">Andre gjerdknapp</string>\n    <string name=\"notification_action_nothing\">Ingenting</string>\n    <string name=\"play_audio\">Ljod</string>\n    <string name=\"notification_action_2_title\">Tredje gjerdknapp</string>\n    <string name=\"notification_action_3_title\">Fjerde gjerdknapp</string>\n    <string name=\"notification_action_4_title\">Femte gjerdknapp</string>\n    <string name=\"notification_actions_at_most_three\">Du kan berre velja opp til tre gjerder til å verta viste i det tette varselet.</string>\n    <string name=\"notification_action_repeat\">Gjenta</string>\n    <string name=\"notification_action_shuffle\">Bland</string>\n    <string name=\"notification_colorize_title\">Lét varsla</string>\n    <string name=\"notification_colorize_summary\">La Android velja léten til varsla ut ifrå hovudléten i småbiletet (merk at dette ikkje er tilgjengeleg på alle einingar)</string>\n    <string name=\"default_audio_format_title\">Forvalt ljodformat</string>\n    <string name=\"default_video_format_title\">Forvalt videoformat</string>\n    <string name=\"theme_title\">Ham</string>\n    <string name=\"night_theme_title\">Nattham</string>\n    <string name=\"light_theme_title\">Ljos</string>\n    <string name=\"dark_theme_title\">Mørk</string>\n    <string name=\"black_theme_title\">Svart</string>\n    <string name=\"popup_remember_size_pos_title\">Hugs oppsprettseigenskapar</string>\n    <string name=\"popup_remember_size_pos_summary\">Hugs den siste storleiken og staden til oppsprettsvindauga</string>\n    <string name=\"clear_queue_confirmation_title\">Stadfest radtømming</string>\n    <string name=\"clear_queue_confirmation_summary\">Byte ifrå ein avspelar til ein annan kan skifta ut rada di</string>\n    <string name=\"clear_queue_confirmation_description\">Den noverande avspelingsrada vil verta skift ut</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Sjå bort ifrå mediaknappetrykk</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Nyttig om du til dømes nyttar høyretelefonar med skadde knappar</string>\n    <string name=\"none\">Ingen</string>\n    <string name=\"show_search_suggestions_title\">Søkjeframlegg</string>\n    <string name=\"local_search_suggestions\">Søkjeframlegg på eininga</string>\n    <string name=\"remote_search_suggestions\">Søkjeframlegg på nettet</string>\n    <string name=\"show_search_suggestions_summary\">Vis søkjeframlegg ved søk</string>\n    <string name=\"enable_watch_history_title\">Visingshistorikk</string>\n    <string name=\"enable_playback_resume_title\">Spel av der du slapp</string>\n    <string name=\"unsupported_url_dialog_message\">Kjente ikkje att nettadressa. Opn med ein annan app\\?</string>\n    <string name=\"default_content_country_title\">Forvalt innhaldsland</string>\n    <string name=\"settings_category_player_title\">Avspelar</string>\n    <string name=\"crash_the_player\">Krasj avspelaren</string>\n    <string name=\"notification_actions_summary\">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</string>\n    <string name=\"use_inexact_seek_title\">Nytt kvikk slurvne spoling</string>\n    <string name=\"seek_duration_title\">Hopplengd (framover/bakover)</string>\n    <string name=\"use_inexact_seek_summary\">Slurvne spoling lar avspelaren spole kvikkare, men slurvnare. 5, 15 og 25-sekundshopping verkar ikkje med dette</string>\n    <string name=\"settings_category_clear_data_title\">Tøm data</string>\n    <string name=\"unsupported_url\">Ustødd nettadresse</string>\n    <string name=\"show_hold_to_append_title\">Vis «Hald for å rade»-råd</string>\n    <string name=\"show_next_and_similar_title\">Vis «Neste» og «Liknande» videoar</string>\n    <string name=\"show_comments_title\">Vis utsegner</string>\n    <string name=\"show_comments_summary\">Slå av for å skjula utsegner</string>\n    <string name=\"show_description_title\">Vis utgreiingar</string>\n    <string name=\"show_description_summary\">Slå av for å skjula videoutgreiingar og ytterlegare opplysingar</string>\n    <string name=\"show_meta_info_title\">Vis metadata</string>\n    <string name=\"show_meta_info_summary\">Slå av for å skjula medadataområde med tilleggsopplysingar om straumskaparen, strauminnhaldet eller eit søk</string>\n    <string name=\"prefer_original_audio_summary\">Vel det opphavlege ljodsporet utan omsyn til tungemålet</string>\n    <string name=\"prefer_descriptive_audio_title\">Helst utgreiande ljod</string>\n    <string name=\"auto_queue_title\">Sjølvverkande rad neste straum</string>\n    <string name=\"auto_queue_summary\">Hald fram ei ugjentakande avspelingsrad ved å leggja til ein liknande straum</string>\n    <string name=\"auto_queue_toggle\">Rad sjølvverkande</string>\n    <string name=\"left_gesture_control_title\">Venstre handvendingsgjerd</string>\n    <string name=\"right_gesture_control_summary\">Vel ei handvending for den høgre sida av avspelingsskjermen</string>\n    <string name=\"enable_search_history_title\">Søkjehistorikk</string>\n    <string name=\"enable_search_history_summary\">Spar søk på eininga</string>\n    <string name=\"enable_playback_resume_summary\">Hald fram straumar der du sist slapp</string>\n    <string name=\"enable_playback_state_lists_title\">Vis listeframgang</string>\n    <string name=\"enable_playback_state_lists_summary\">Vis avspelingsstadteikn i lister</string>\n    <string name=\"enable_watch_history_summary\">Lag ei liste over avspelte straumar</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Hald fram avspeling</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Hald fram med å spela av etter avbrot (t.d. telefonsamtaler)</string>\n    <string name=\"download_dialog_title\">Hent</string>\n    <string name=\"start_main_player_fullscreen_title\">Byrj hovudavspelaren i fullskjerm</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"autoplay_title\">Spel av sjølvverkande</string>\n    <string name=\"show_hold_to_append_summary\">Vis eit råd ved trykk på «Bakgrunn» eller «Sprett opp»-knappane i videodetaljane</string>\n    <string name=\"content_language_title\">Forvalt tungemål for innhald</string>\n    <string name=\"peertube_instance_add_https_only\">Stør berre HTTPS-nettadresser</string>\n    <string name=\"settings_category_player_behavior_title\">Åtferd</string>\n    <string name=\"settings_category_video_audio_title\">Video og ljod</string>\n    <string name=\"settings_category_appearance_title\">Utsjånaden</string>\n    <string name=\"settings_category_player_notification_title\">Avspelingsvarsel</string>\n    <string name=\"background_player_playing_toast\">Spelar av i bakgrunnen</string>\n    <string name=\"skip_silence_checkbox\">Hopp over togner</string>\n    <string name=\"prefer_original_audio_title\">Helst opphavleg ljod</string>\n    <string name=\"prefer_descriptive_audio_summary\">Om tilgjengeleg, vel eit ljodspor med utgreiingar for blinde</string>\n    <string name=\"left_gesture_control_summary\">Vel ei handvending for den venstre sida av avspelingsskjermen</string>\n    <string name=\"right_gesture_control_title\">Høgre handvendingsgjerd</string>\n    <string name=\"brightness\">Ljosstyrke</string>\n    <string name=\"volume\">Ljodstyrke</string>\n    <string name=\"settings_category_updates_title\">Oppdateringar</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-nqo/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"show_play_with_kodi_summary\">ߞߊ߬ ߢߣߊߕߊߟߌ ߘߏ߫ ߦߌ߬ߘߊ߬ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߕߏߟߏ߲߫ Kodi ߞߟߋߞߟߋ߫ ߕߊ߲ߓߊ߲ ߘߐ߫</string>\n    <string name=\"kore_not_found\">Kore ߟߥߊߟߌߟߊ߲ ߡߊ߫ ߛߐ߬ߘߐ߲߬߸ ߞߵߊ߬ ߡߊߗߍ߫؟</string>\n    <string name=\"notification_scale_to_square_image_summary\">ߦߋߡߍ߲ߕߊ ߞߏ߬ߋߞߏ߬ߋ߫ ߡߍ߲ ߦߌ߬ߘߊ߬ߕߐ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߘߐ߫߸ ߞߵߏ߬ ߟߊߕߍ߰ ߞߊ߬ ߓߐ߫ ߁߆:߉ ߞߊ߬ ߞߍ߫ ߁:߁ ߓߍ߲߬ߡߊ ߘߌ߫</string>\n    <string name=\"notification_action_1_title\">ߞߍߟߌ߫ ߝߌߟߊߣߊ߲ ߞߎ߬ߘߎ</string>\n    <string name=\"notification_actions_summary\">ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߞߍߟߌ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ ߡߊߝߊ߬ߟߋ߲߬ ߘߎ߰ߟߊ߫ ߛߐ߲߬ߞߌ߲߬ߠߌ߲ ߘߐ߫ ߊ߬ߟߎ߫ ߞߊ߲߬. ߘߏ߫ ߟߎ߫ ߓߊߕߐߡߐ߲߫ (ߞߣߊ߫ ߕߊ߬ߡߌ߲߬ ߃ ߟߊ߫) ߞߵߊ߬ߟߎ߫ ߝߍ߲߬ߛߍ߲߫ ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߜߘߋ ߘߐ߫߸ ߞߌߣߌ߲߫ ߛߐ߲߬ߞߌ߲ ߛߌߟߊ ߝߍ߬ ߘߋ߲߬ߞߊ߬ߣߍ߲߬ ߘߐߞߍߕߊ ߞߊ߲߬</string>\n    <string name=\"show_play_with_kodi_title\">ߞߊ߬ \\\"ߊ߬ ߕߏߟߏ߲߫ Kodi ߞߣߐ߫\\\" ߢߣߊߕߊߟߌ ߦߌ߬ߘߊ߬</string>\n    <string name=\"crash_the_player\">ߞߊ߬ ߕߏߟߏ߲ߟߊ߲ ߠߜߊߘߊ߲߫</string>\n    <string name=\"notification_scale_to_square_image_title\">ߞߏ߬ߋߞߏ߬ߋ ߟߊ߬ߕߍ߰ ߁:߁ ߡߊ߬</string>\n    <string name=\"notification_action_0_title\">ߞߍߟߌ߫ ߝߟߐ ߞߎ߬ߘߎ</string>\n    <string name=\"notification_action_2_title\">ߞߍߟߌ߫ ߛߓߊߣߊ߲ ߞߎ߬ߘߎ</string>\n    <string name=\"notification_action_3_title\">ߞߍߟߌ߫ ߣߊ߯ߣߌ߲ߣߊ߲ ߞߎ߬ߘߎ</string>\n    <string name=\"notification_action_4_title\">ߞߍߟߌ߫ ߟߏ߯ߟߎߣߊ߲ ߞߎ߬ߘߎ</string>\n    <string name=\"notification_actions_at_most_three\">ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߬ ߜߘߋ ߘߐ߫ ߌ ߘߌ߫ ߛߋ߫ ߞߍߟߌ߫ ߛߓߊ߬ ߔߋ߫ ߟߋ߬ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߵߊ߬ ߝߍ߲߬ߛߍ߲߫߹</string>\n    <string name=\"did_you_mean\">ߕߎ߬ߡߊ߬ ߘߐ߫߸ ߌ ߞߊ߲߫ ߦߋ߫ \\\"%1$s\\\" ߟߋ߫ ߡߊ߬؟</string>\n    <string name=\"upload_date_text\">ߊ߬ ߟߊߖߍ߲ߛߍ߲߫ ߘߊ߫ %1$s</string>\n    <string name=\"no_player_found\">ߥߦߏ߬ ߕߏߟߏ߲ߟߊ߲߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬. ߞߊ߬ VLC ߡߊߗߍ߫؟</string>\n    <string name=\"no_player_found_toast\">ߥߦߏ߬ ߕߏߟߏ߲ߟߊ߲߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ (ߌ ߘߌ߫ ߛߋ߫ VLC ߡߊߗߍ߫ ߞߵߊ߬ ߕߏߟߏ߲߫).</string>\n    <string name=\"open_in_browser\">ߞߵߊ߬ ߟߊߞߊ߬ ߛߏ߲߯ߓߊߟߊ߲ ߞߣߐ߫</string>\n    <string name=\"mark_as_watched\">ߞߵߊ߬ ߢߊߣߐ߯ߦߊ߫ ߦߏ߫ ߡߊߝߟߍߣߍ߲</string>\n    <string name=\"install\">ߞߵߊ߬ ߡߊߗߍ߫</string>\n    <string name=\"cancel\">ߞߵߊ߬ ߘߐߛߊ߬</string>\n    <string name=\"ok\">ߏ߬ߞߍ߫</string>\n    <string name=\"share\">ߞߵߊ߬ ߘߐߕߟߊ߫</string>\n    <string name=\"open_in_popup_mode\">ߞߴߊ߬ ߘߊߦߟߍ߬ ߝߢߐߘߊ߫ ߝߎ߲ߞߊ߲ߡߊ ߞߣߐ߫</string>\n    <string name=\"open_with\">ߞߵߊ߬ ߘߊߦߍ߬ߟߍ߫ ߦߊ߲߬</string>\n    <string name=\"download\">ߞߵߊ߬ ߟߊߖߌ߰</string>\n    <string name=\"controls_download_desc\">ߞߊ߬ ߥߏ߬ߦߏ ߞߐߘߐ߮ ߟߊߖߌ߰</string>\n    <string name=\"settings\">ߢߊߓߐߟߌ ߟߎ߬</string>\n    <string name=\"search\">ߢߌߣߌ߲ߠߌ߲</string>\n    <string name=\"subscription_change_failed\">ߡߊ߬ߝߘߎ߬ߟߌ ߡߊߝߊ߬ߟߋ߲߬ߞߏ ߡߊ߫ ߛߐ߲߬</string>\n    <string name=\"search_showing_result_for\">ߢߌߣߌ߲ߝߋ߲߫ ߞߐߝߟߌ ߟߎ߬: %s</string>\n    <string name=\"share_dialog_title\">ߞߵߊ߬ ߘߐߝߘߊ߫</string>\n    <string name=\"use_external_video_player_title\">ߞߐߞߊ߫ ߕߏߟߏ߲ߟߊ߲ ߠߊߓߊ߯ߙߊ߫</string>\n    <string name=\"use_external_video_player_summary\">ߊ߬ ߦߋ߫ ߡߍ߲ߕߊ ߟߋ߫ ߖߐ߬ߛߌ߫ ߟߊ߫ ߓߍ߲߬ߡߊ ߘߏ߫ ߟߎ ߞߘߐ߫</string>\n    <string name=\"use_external_audio_player_title\">ߞߊ߬ ߞߐߞߊ߲߫ ߡߍ߲ߕߊ߫ ߕߏߟߏ߲ߟߊ߲ ߠߊߓߊ߯ߙߊ߫</string>\n    <string name=\"unsubscribe\">ߞߵߊ߬ ߟߊߓߌ߬ߟߊ߬</string>\n    <string name=\"subscribe_button_title\">ߊ߬ ߡߊߝߘߎ߫</string>\n    <string name=\"subscribed_button_title\">ߊ߬ ߡߊߝߘߎߣߍ߲߫ ߌ ߓߟߏ߫</string>\n    <string name=\"channel_unsubscribed\">ߥߙߏߝߋ ߓߘߊ߫ ߟߊߓߌ߬ߟߊ߬</string>\n    <string name=\"subscription_update_failed\">ߡߊ߬ߝߘߎ߬ߟߌ߫ ߟߏ߲ߘߐߦߊߞߏ ߡߊ߫ ߛߐ߲߬</string>\n    <string name=\"tab_subscriptions\">ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬</string>\n    <string name=\"show_info\">ߞߊ߬ ߟߌ߬ߤߟߊ ߦߌ߬ߘߊ߬</string>\n    <string name=\"download_path_audio_summary\">ߡߍ߲ߕߊ߫ ߟߊߌ߰ߣߍ߲ ߠߎ߬ ߞߐߕߐ߮ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߬ߣߍ߲߫ ߦߊ߲߬ ߠߋ߬</string>\n    <string name=\"tab_bookmarks\">ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬</string>\n    <string name=\"controls_background_title\">ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ</string>\n    <string name=\"controls_add_to_playlist_title\">ߞߵߊ߬ ߝߙߊ߬</string>\n    <string name=\"download_path_summary\">ߦߋߡߍ߲ߕߊ߫ ߟߊߌ߰ߣߍ߲ ߠߎ߬ ߞߐߕߐ߮ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߬ߣߍ߲߫ ߦߊ߲߬ ߠߋ߬</string>\n    <string name=\"controls_popup_title\">ߝߎ߲ߞߊ߲ߡߊ</string>\n    <string name=\"tab_choose\">ߛߏ߬ߙߌ߲߬ߘߐ ߛߎߥߊ߲ߘߌ߫</string>\n    <string name=\"download_path_title\">ߦߋߡߍ߲ߕߊ߫ ߟߊߖߌ߰ߣߍ߲ ߞߎ߲ߓߍ߲</string>\n    <string name=\"download_path_dialog_title\">ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߦߋߡߍ߲ߕߊ߫ ߞߐߕߐ߮ ߟߎ߬ ߢߍ߫</string>\n    <string name=\"download_path_audio_dialog_title\">ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߡߍ߲ߕߊ߫ ߞߐߕߐ߮ ߟߎ߬ ߢߍ߫</string>\n    <string name=\"default_resolution_title\">ߓߍ߲߬ߡߊ߬ ߖߏߣߡߊ</string>\n    <string name=\"show_higher_resolutions_title\">ߓߍ߲߬ߡߊ߬ ߛߊ߲ߘߐߕߊ ߟߎ߬</string>\n    <string name=\"download_path_audio_title\">ߡߍ߲ߕߊ߫ ߟߊߖߌ߰ߣߍ߲ ߞߎ߲ߓߍ߲</string>\n    <string name=\"default_popup_resolution_title\">ߝߎ߲ߞߊ߲߫ ߝߢߐߘߊ߫ ߓߍ߲߬ߡߊ߬ ߖߏߣߡߊ</string>\n    <string name=\"play_with_kodi_title\">ߊ߬ ߕߏߟߏ߲߫ Kodi ߞߣߐ߫</string>\n    <string name=\"show_higher_resolutions_summary\">ߕߙߏߞߏ߫ ߘߊ߲ߘߐ߫ߣߍ߲߫ ߠߋ߬ ߦߋ߫ ߛߋ߫ ߟߊ߫ 2K/4K ߦߋߡߍ߲ߕߊ ߟߎ߬ ߕߏߟߏ߲߫ ߠߊ߫</string>\n    <string name=\"main_bg_subtitle\">ߊ߬ ߛߐ߲߬ߞߌ߫ ߥߊߘߏ ߞߊ߲߬ ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬.</string>\n    <string name=\"notification_colorize_title\">ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲߫ ߞߟߐ߬ߡߊ</string>\n    <string name=\"notification_colorize_summary\">ߞߊ߬ ߊ߲ߘߙߏߌߘ ߟߐ߬ ߛߐ߬ߓߌ߲߬ߘߐ߬ߓߏ߲ ߞ߬ߟߐ ߟߊߖߘߍ߬ߕߦߊ߬ ߟߊ߫ ߞߵߊ߬ ߓߍ߲߬ ߞߏ߬ߋߞߏ߬ߋ߫ ߞߐ߬ߟߐ ߓߊߖߎ ߡߊ߬ (ߦߴߊ߬ ߟߐ߲߫ ߞߴߏ߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߕߙߏߞߏ ߓߍ߯ ߟߊ߫)</string>\n    <string name=\"use_inexact_seek_summary\">ߔߙߏ߬ߔߙߏ߬ ߢߌߣߌ߲ߠߌ߲߫ ߠߵߊ߬ ߞߍ߫ ߟߊ߫ ߕߏߟߏ߲ߟߊ߲ ߘߌ߫ ߘߌ߲߬ߞߌߙߊ ߟߎ߬ ߢߌߣߌ߲߫ ߞߊߟߌߦߊߓߟߏ ߡߊ߬ ߞߏ߬ߣߵߊ߬ ߕߋߟߋ߲ߣߍ߲߫ ߕߍ߫ ߖߋߞߎ߫. ߞߊ߬ ߢߌߣߌ߲ߠߌ߲ ߞߍ߫ ߝߌ߬ߟߊ߲߬ ߅، ߁߅، ߥߟߊ߫ ߂߅ ߞߘߐ߫߸ ߊ߬ ߣߴߏ߬ ߕߍ߫ ߛߋ߫ ߓߍ߲߬ ߠߊ߫</string>\n    <string name=\"progressive_load_interval_summary\">ߞߊ߬ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߣߐߘߐ߫ ߢߍߕߊ߯ߡߊ ߞߊ߲߬ (ߕߋ߲߭ߕߋ߲߬ %s). ߡߐ߬ߟߐ߲߬ ߘߋ߲߬ߣߍ߲ ߘߌ߫ ߛߋ߫ ߊ߬ ߖߛߐߟߌ߫ ߝߟߐ ߟߞߊߟߌߦߊ߫ ߟߊ߫</string>\n    <string name=\"clear_queue_confirmation_title\">ߞߊ߬ ߟߊ߬ߛߙߋ߬ߦߊ߬ߟߌ ߡߊ߬ߣߌ߲߬ߞߊ߬ ߕߎ߲߰ߠߌ߲ ߘߏ߫ ߝߌߘߊ߲߫ ߕߐ߫</string>\n    <string name=\"clear_queue_confirmation_summary\">ߞߊ߬ ߓߐ߫ ߕߏߟߏ߲ߟߊ߲ ߘߏ߫ ߟߊ ߞߊ߬ ߥߊ߫ ߘߏ߫ ߜߘߍ߫ ߟߊ߫߸ ߏ߬ ߘߌ߫ ߛߋߴߌ ߟߊ߫ ߕߎ߲߰ߠߌ߲ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ ߟߊ߫</string>\n    <string name=\"notification_action_repeat\">ߡߊ߬ߛߊߦߌ</string>\n    <string name=\"notification_action_shuffle\">ߢߓߊߛߊ߲</string>\n    <string name=\"notification_action_buffering\">ߦߟߌߘߐߗߍ</string>\n    <string name=\"notification_action_nothing\">ߝߏߛߌ߬</string>\n    <string name=\"play_audio\">ߡߍ߲ߕߊ</string>\n    <string name=\"default_audio_format_title\">ߡߍ߲ߕߊ߫ ߢߊ߲ߞߊ߫ ߖߏߣߡߊ</string>\n    <string name=\"default_video_format_title\">ߦߋߡߍ߲ߕߊ ߢߊ߲ߞߊ߫ ߖߏߣߡߊ</string>\n    <string name=\"theme_title\">ߛߊߛߊ</string>\n    <string name=\"night_theme_title\">ߛߎߘߐ߫ ߛߊߛߊ</string>\n    <string name=\"light_theme_title\">ߞߣߍߦߊߣߍ߲</string>\n    <string name=\"dark_theme_title\">ߘߓߌ߬ߣߍ߲</string>\n    <string name=\"black_theme_title\">ߝߌ߲߬ߡߊ߲</string>\n    <string name=\"popup_remember_size_pos_title\">ߞߊ߬ ߖߊ߬ߕߏ߫ ߝߎ߲ߞߊ߲߫ ߝߢߐߘߊ ߟߊ߫ ߕߦߊ ߟߎ߬ ߞߐ߫</string>\n    <string name=\"popup_remember_size_pos_summary\">ߞߊ߬ ߖߊ߲߬ߕߏ߫ ߝߎ߲ߞߊ߫ ߝߢߐߘߊ ߘߍ߲߬ߘߍ߲ ߣߴߊ߬ ߘߌ߲߬ߞߌߙߊ ߞߐ߫</string>\n    <string name=\"use_inexact_seek_title\">ߞߊ߬ ߔߙߏ߬ߔߙߏ߬ ߢߌߣߌ߲ߠߌ߲߫ ߞߊߟߌ߲ ߠߊߓߊ߯ߙߊ߫</string>\n    <string name=\"seek_duration_title\">ߢߍߝߍ߫/ߞߐߝߍ߫ ߢߌߣߌ߲ߠߌ߲߫ ߥߛߎ߬ ߞߊߟߌ߲</string>\n    <string name=\"progressive_load_interval_title\">ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߖߛߐߟߌ ߕߍߟߊ߫ ߘߍ߲߬ߘߍ߲</string>\n    <string name=\"clear_queue_confirmation_description\">ߛߋ߲߬ߠߊ߬ ߕߏߟߏ߲ߟߊ߲ ߠߊ߫ ߕߎ߲߰ߠߌ߲ ߘߌߣߊ߬ ߣߐ߬ߘߐߓߌ߬ߟߊ߬</string>\n    <string name=\"ignore_hardware_media_buttons_title\">ߞߊ߬ ߕߙߏߞߏ ߞߟߋߞߟߋ߫ ߞߘߎ ߟߊ߫ ߖߊ߲߬ߖߊ߲߬ ߠߎ߬ ߡߊߓߌ߬ߟߊ߬</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">ߏ߬ ߢߊߕߣߐ ߞߊߓߏ߬߸ ߣߴߌ ߦߋ߫ ߕߟߏߡߊߘߏ߲ ߠߊߓߊ߯ߙߊ ߟߊ߫ ߡߍ߲ ߞߘߎ߬ ߜߎ ߟߎ߬ ߕߍ߫ ߛߐ߲߬</string>\n    <string name=\"left_gesture_control_title\">ߣߎߡߊ߲߫ ߖߍ߰ߙߍ ߞߍߟߌ</string>\n    <string name=\"right_gesture_control_summary\">ߕߏߟߏ߲ߟߊ߲߫ ߥߊ߲߬ߥߊ߲ ߞߌߣߌ߲߫ ߕߟߊ ߖߍ߰ߙߍ ߛߎߥߊ߲ߘߌ߫</string>\n    <string name=\"right_gesture_control_title\">ߞߌߣߌ߲߫ ߖߍ߰ߙߍ ߞߍߟߌ</string>\n    <string name=\"brightness\">ߞߣߍߦߊ</string>\n    <string name=\"volume\">ߡߊ߲߬ߞߊ߲</string>\n    <string name=\"none\">ߝߏߛߌ߬</string>\n    <string name=\"show_search_suggestions_title\">ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬</string>\n    <string name=\"show_search_suggestions_summary\">ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬ ߓߊߕߐߡߐ߲߫ ߞߵߊ߬ߟߎ߫ ߝߍ߲߬ߛߍ߲߫ ߢߌߣߌ߲ߠߌ߲߫ ߕߎߡߊ</string>\n    <string name=\"local_search_suggestions\">ߘߌ߲߬ߞߌ߬ߙߊ߬ߘߐ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬</string>\n    <string name=\"remote_search_suggestions\">ߥߎߟߊߟߊ߫ ߢߌߣߌ߲ߠߌ߲߫ ߘߐ߬ߛߎ߰ߟߌ ߟߎ߬</string>\n    <string name=\"enable_search_history_title\">ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ</string>\n    <string name=\"enable_playback_resume_title\">ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰</string>\n    <string name=\"enable_playback_resume_summary\">ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ ߊ߬ ߘߊ߲߬ߘߌ߬ߦߊ߬ ߟߊߓߊ߲ ߠߊ߫</string>\n    <string name=\"enable_playback_state_lists_summary\">ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌ߬ߦߊ߬ ߡߊ߬ߛߙߋ ߟߎ߫ ߦߌ߬ߘߊ߬ ߛߙߍߘߍ ߟߎ߬ ߘߐ߫</string>\n    <string name=\"enable_watch_history_summary\">ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߡߊߝߍߣߍ߲ߣߍ߲ ߠߎ߫ ߘߝߐ߬ߦߊ߫</string>\n    <string name=\"download_dialog_title\">ߞߵߊ߬ ߟߊߖߌ߰</string>\n    <string name=\"start_main_player_fullscreen_title\">ߞߊ߬ ߕߏߟߏ߲ߟߊ߲߫ ߓߊߖߎ ߘߊߦߟߍ߬ ߥߊ߲߬ߥߊ߬ ߝߊ ߘߐ߫</string>\n    <string name=\"show_hold_to_append_title\">ߞߊ߬ ߞߍߞߌߦߊ \\\"ߊ߬ ߛߐ߲߬ߞߌ߲߬ߣߍ߲ ߕߏ߫ ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫\\\" ߦߌ߬ߘߊ߬</string>\n    <string name=\"unsupported_url_dialog_message\">ߛߘߌ߬ߜߋ߲߬ ߘߌߣߍ߲ ߡߊ߫ ߛߋ߫ ߡߊߟߐ߲߫ ߠߊ߫. ߞߵߊ߬ ߘߊߦߟߍ߬ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߞߣߐ߫؟</string>\n    <string name=\"default_content_country_title\">ߞߣߐߘߐ߫ ߖߡߊ߬ߣߊ߬ ߖߏߣߡߊ</string>\n    <string name=\"peertube_instance_url_help\">ߌ ߘߌߦߊߣߍ߲߫ ߛߐߘߊ ߟߎ߫ ߛߐ߬ߘߐ߲߫ ߦߊ߲߬: %s</string>\n    <string name=\"peertube_instance_add_title\">ߛߐߘߊ ߘߏ߫ ߝߙߊ߬</string>\n    <string name=\"peertube_instance_add_help\">ߛߐߘߊ߫ ߛߘߌ߬ߜߋ߲</string>\n    <string name=\"peertube_instance_add_fail\">ߛߐߘߊ ߡߊ߫ ߛߋ߫ ߕߎ߬ߢߊ߬ߟߐ߲߬ ߠߊ߫</string>\n    <string name=\"peertube_instance_add_https_only\">HTTPS ߛߘߌߜߋ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߦߋ߫ ߕߊ߬ ߟߊ߫</string>\n    <string name=\"settings_category_player_behavior_title\">ߞߏߟߊߕߊ߯ߡߢߊ</string>\n    <string name=\"settings_category_video_audio_title\">ߦߋߡߍ߲ߕߊ ߣߌ߫ ߡߍ߲ߕߊ</string>\n    <string name=\"settings_category_history_title\">ߘߝߐ߬ߦߊ ߣߌ߫ ߦߟߌߡߊߛߌ߮</string>\n    <string name=\"settings_category_appearance_title\">ߦߋߢߊ</string>\n    <string name=\"settings_category_debug_title\">ߞߊߘߊ߲ߓߐ</string>\n    <string name=\"settings_category_updates_title\">ߟߏ߲ߘߐߦߊߟߌ</string>\n    <string name=\"settings_category_player_notification_summary\">ߥߦߏ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߕߐ ߛߏ߬ߓߌ߬ߘߐߓߏ߲ ߢߊߓߐ߫</string>\n    <string name=\"background_player_playing_toast\">ߝߊ߲߬ߝߘߊ߬ߞߘߐ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲</string>\n    <string name=\"popup_playing_toast\">ߝߎ߲ߞߊ߲ߡߊ ߞߙߊ߬ߞߏ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲</string>\n    <string name=\"content\">ߞߣߐߘߐ</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">ߦߕߎߓߎ߫ \\\"ߜߍ߲߬ߘߍ߬ߣߍ߲߫ ߗߏ߯ߦߊ\\\" ߟߊߡߍߣߍ߲߫</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">\\\"ߜߍ߲߬ߘߍ߬ߣߍ߲ ߗߏ߯ߦߊ\\\" ߘߏ߫ ߦߋ߫ ߦߕߎߓߎ ߓߟߏ߫߸ ߡߍ߲ ߦߋ߫ ߞߣߐߘߐ߫ ߘߋߣߍ߲ߞߏߓߊߦߋ ߟߎ߬ ߢߡߊߘߏ߲߰ ߠߊ߫</string>\n    <string name=\"duration_live\">ߝߊ߲ߞߢߊ</string>\n    <string name=\"downloads\">ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬</string>\n    <string name=\"downloads_title\">ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬</string>\n    <string name=\"events\">ߖߊ߲߬ߖߏ߲ ߠߎ߬</string>\n    <string name=\"songs\">ߘߐ߲߬ߞߟߌ ߟߎ߬</string>\n    <string name=\"artists\">ߢߊ߰ߙߊ ߟߎ߬</string>\n    <string name=\"disabled\">ߟߊߛߊ߬ߣߍ߲</string>\n    <string name=\"clear\">ߞߵߊ߬ ߝߌߘߊ߲߫</string>\n    <string name=\"best_resolution\">ߓߍ߲߬ߡߊ ߓߘߍ߬ߡߊ</string>\n    <string name=\"undo\">ߞߵߊ߬ ߘߐߛߊ߬</string>\n    <string name=\"play_all\">ߞߵߊ߬ ߓߍ߯ ߕߏߟߏ߲߫</string>\n    <string name=\"always\">ߞߘߊߎ߫</string>\n    <string name=\"app_update_notification_channel_name\">ߟߥߊߟߌߟߊ߲߫ ߟߏ߲ߘߐߦߊߟߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲</string>\n    <string name=\"app_update_notification_channel_description\">ߣߌߎߔߌߔ ߓߐߞߏ߫ ߞߎߘߊ ߟߎ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬</string>\n    <string name=\"switch_to_popup\">ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫</string>\n    <string name=\"switch_to_main\">ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߓߊߖߎ ߘߐ߫</string>\n    <string name=\"export_data_title\">ߞߊ߬ ߟߐ߲ߕߊߓߘߐ ߟߊߝߏ߬ߦߌ߬</string>\n    <string name=\"recaptcha_cookies_cleared\">ߡߐ߰ߦߊ߬ߟߐ߲߫ ߦߟߌߘߏ߲ ߠߎ߬ ߓߘߊ߫ ߝߌߘߊ߲߫</string>\n    <string name=\"export_data_summary\">ߘߝߐ߬ߦߊ ߣߌ߫ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߣߌ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߎ߬ ߣߌ߫ ߢߊߓߐߟߌ ߟߎ߬ ߟߊߝߏ߬ߦߌ߬</string>\n    <string name=\"clear_cookie_summary\">ߦߟߌߘߏ߲ ߠߎ߬ ߖߏ߬ߛߌ߬߸ ߣߌߎߔߌߔ ߦߋ߫ ߡߍ߲ ߠߎ߬ ߟߊߡߊ߲߬ߘߌ߬ ߟߊ߫ ߡߐ߰ߦߊ߬ߟߐ߲ ߘߏ߫ ߝߎߟߋ߲߫ ߕߎߡߊ ߌ ߓߟߏ߫</string>\n    <string name=\"clear_views_history_title\">ߦߋߞߏ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫</string>\n    <string name=\"delete_playback_states_alert\">ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߖߐ߬ߛߌ߫؟</string>\n    <string name=\"watch_history_states_deleted\">ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߓߘߊ߫ ߖߐ߬ߛߌ߫</string>\n    <string name=\"clear_search_history_summary\">ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߞߎߡߊߘߋ߲ ߠߎ߫ ߘߝߐ߬ߦߊ ߖߐ߬ߛߌ߫</string>\n    <string name=\"fast_mode\">ߗߏ߯ߦߊ߫ ߞߊߟߌ߲</string>\n    <string name=\"general_error\">ߝߎ߬ߕߎ߲߬ߕߌ</string>\n    <string name=\"download_to_sdcard_error_title\">ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲߫ ߕߍ߫ ߦߋ߲߬</string>\n    <string name=\"network_error\">ߞߙߏ߬ߝߏ߫ ߝߎ߬ߕߎ߲߬ߕߌ</string>\n    <string name=\"parsing_error\">ߗߍߦߙߐ ߡߊ߫ ߛߋ߫ ߘߐߛߏ߯ߙߋ߫ ߟߊ߫</string>\n    <string name=\"content_not_available\">ߞߣߐߘߐ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬</string>\n    <string name=\"app_ui_crash\">ߟߥߊ߬ߟߌ߬ߟߊ߲ ߓߘߊ߫ ߜߊߘߊ߲߫</string>\n    <string name=\"missing_file\">ߞߐߕߐ߮ ߓߘߊ߫ ߡߊߘߏ߬ߣߌ߲߬ ߥߟߴߊ߬ ߓߘߊ߫ ߖߐ߬ߛߌ߫</string>\n    <string name=\"invalid_directory\">ߞߎ߲ߓߍ߲ ߛߎߝߊ߫ ߏ߬ ߕߍ߫ ߦߋ߲߬</string>\n    <string name=\"invalid_source\">ߞߎ߲ߓߍ߲ ߥߟߊ߫ ߞߣߐߘߐ߫ ߛߎߝߊ ߏ߬ ߕߍ߫ ߦߋ߲߬</string>\n    <string name=\"invalid_file\">ߞߐߕߐ߮ ߕߍ߲߬ ߦߋ߲߬ ߥߟߴߊ߬ ߕߍ߫ ߟߊߛߐ߬ߘߐ߲߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߥߟߊ߫ ߛߓߍߟߌ߫ ߓߟߏ ߡߊ߬</string>\n    <string name=\"file_name_empty_error\">ߞߐߕߐ߯ ߕߐ߮ ߘߐߞߏߟߏ߲ ߕߍ߫ ߛߋ߫ ߕߏ߫ ߟߊ߫</string>\n    <string name=\"error_occurred_detail\">ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߊ߫ ߞߍ߫: %1$s</string>\n    <string name=\"no_streams_available_download\">ߥߦߏ߬ ߟߊߖߌ߰ߕߊ߬ ߕߍ߫߫ ߦߋ߲߬</string>\n    <string name=\"saved_tabs_invalid_json\">ߛߏ߬ߙߌ߲߬ߘߐ߬ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲ ߠߎ߬ ߕߍ߫ ߞߊ߬ߙߊ߲߬ ߠߊ߫߸ ߛߏ߬ߙߏ߲߬ߘߐ߬ ߖߏߣߡߊ ߟߎ߬ ߟߋ߬ ߟߊߓߊ߯ߙߊ ߌߘߐ߫</string>\n    <string name=\"error_report_notification_toast\">ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߓߘߊ߫ ߞߍ߫߸ ߛߐ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊߝߍߣߍ߲߫</string>\n    <string name=\"sorry_string\">ߘߌ߬ߢߍ߬߸ ߊ߬ ߡߊ߫ ߟߊߥߌ߬ߟߴߊ߬ ߡߊ߬.</string>\n    <string name=\"error_snackbar_message\">ߘߌ߬ߢߍ߬߸ ߞߏ߫ ߘߏ߫ ߡߊ߫ ߕߊ߬ߡߌ߲߬ ߞߏߢߊ߬.</string>\n    <string name=\"what_device_headline\">ߟߌ߬ߤߟߊ:</string>\n    <string name=\"what_happened_headline\">ߡߎ߲߬ ߞߍߣߍ߲߫:</string>\n    <string name=\"info_labels\">ߡߎ߲߬:\\nRequest:\\nContent Language:\\nContent Country:\\nApp Language:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version:</string>\n    <string name=\"your_comment\">ߌ ߟߊ߫ ߞߊ߲߬ߞߎߡߊ (ߊ߲߬ߞߌ߬ߟߍ߬ ߞߊ߲ ߘߐ߫):</string>\n    <string name=\"error_details_headline\">ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬:</string>\n    <string name=\"detail_thumbnail_view_description\">ߦߋߡߍ߲ߕߊ ߘߐߞߊ߬ߙߊ߲߸ ߥߎ߬ߛߎ:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">ߟߊ߬ߦߟߍ߬ߓߊ߮ ߞߐߦߌߘߊ߫ ߖߌߦߊ ߞߏ߬ߋߞߏ߬ߋ</string>\n    <string name=\"detail_likes_img_view_description\">ߊ߬ ߘߎߡߊ߲߫ ߒߧߍ߫</string>\n    <string name=\"detail_dislikes_img_view_description\">ߊ߬ ߡߊ߲ߘߌ߫ ߒߧߍ߫</string>\n    <string name=\"comments_tab_description\">ߞߊ߲߬ߞߎߡߊ ߟߎ߬</string>\n    <string name=\"related_items_tab_description\">ߢߐ߲߰ߘߐ߬ ߥߦߏ ߟߎ߬</string>\n    <string name=\"search_no_results\">ߞߐߝߟߌ߫ ߕߍ߫ ߦߋ߲߬</string>\n    <string name=\"audio\">ߡߍ߲ߕߊ</string>\n    <string name=\"retry\">ߞߵߊ߬ ߡߊߛߊ߬ߦߌ߬</string>\n    <string name=\"auto_queue_title\">ߞߊ߬ ߥߏ߬ߦߏ߫ ߣߊ߬ߕߊ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫ ߞߍ߲ߖߘߍߡߊߓߟߏ ߡߊ߬</string>\n    <string name=\"auto_queue_summary\">ߞߊ߬ ߕߎ߲߰ߠߌ߲ ߘߐߞߊ߬ߙߊ߲ ߓߟߏߕߎ߰ (ߞߊߣߊ߬ ߡߊߛߊ߬ߦߌ߬) ߥߏ߬ߦߏ߫ ߢߐ߲߰ߘߐ ߟߎ߫ ߟߊ߫</string>\n    <string name=\"left_gesture_control_summary\">ߕߏߟߏ߲ߟߊ߲߫ ߥߊ߲߬ߥߊ߲ ߣߎߡߊ߲߫ ߕߟߊ ߖߍ߰ߙߍ ߛߎߥߊ߲ߘߌ߫</string>\n    <string name=\"enable_playback_state_lists_title\">ߘߊ߲߬ߘߌߦߊ ߢߌߣߌ߲ߠߌ߲ ߘߐ߫</string>\n    <string name=\"resume_on_audio_focus_gain_title\">ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">ߞߊ߬ ߘߐ߲߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߟߏߕߎ߲߰ ߓߟߏߕߍ߯ߟߌ ߞߐߝߍ߬ (ߟߊߒߡߊ߫ ߘߐ߫، ߜߋߟߋ߲ߜߋߟߋ߲ ߠߊ߫ ߞߟߌߟߌ ߟߎ߬)</string>\n    <string name=\"show_hold_to_append_summary\">ߞߊ߬ ߞߍߞߌߦߊ ߦߌ߬ߘߊ߬ ߦߋߡߍ߲ߕߊ߫ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߞߐߜߍ ߞߊ߲߬ \\\"ߝߎ߲ߞߊ߲ߡߊ\\\" ߥߟߊ߫ \\\"ߞߘߐߝߊ߲ߝߘߊ\\\" ߞߎ߬ߘߎ ߛߐ߲߬ߞߌ߲߬ ߕߎߡߊ</string>\n    <string name=\"settings_category_player_notification_title\">ߕߏߟߏ߲ߟߊ߲߫ ߠߊ߫ ߛߐߓߌ߬ߘߐ߬ߓߏ߲</string>\n    <string name=\"show_age_restricted_content_title\">ߞߊ߬ ߞߣߐߘߐ߫ ߛߐ߬ߘߐ߲߬ߛߌ߯ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߦߌ߬ߘߊ߬</string>\n    <string name=\"show_age_restricted_content_summary\">ߞߊ߬ ߞߣߐߘߐ ߟߎ߬ ߦߌ߬ߘߊ߬ ߤߊߟߌ߬ ߘߋ߲ߣߍ߲ ߠߎ߬ ߡߊ߲ߞߊ߲߫ ߞߊ߬ ߡߍ߲ ߡߊߝߍߣߍ߲߫ (ߦߏ߫ +߁߈)</string>\n    <string name=\"restricted_video\">ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߮ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫.\n\\n\n\\n\\\"%1$s\\\" ߟߊߢߊ߯ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߝߟߍ߫.</string>\n    <string name=\"restricted_video_no_stream\">ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߯ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫.\n\\nߦߕߎߓߎ߫ ߟߊ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߏߛߐ߲߬ ߞߊ߬ ߓߍ߲߬ ߖߌ߬ߦߊ߬ߖߟߎ߫ ߛߐ߬ߘߐ߲߬ߛߌ߯ ߘߊ߲ߠߊߕߍ߰ߣߍ߲ ߠߎ߬ ߠߊ߫ ߞߏ ߡߊ߬، ߣߌߎߔߌߔ ߕߍ߫ ߛߋ߫ ߦߋߡߍ߲ߕߊ߫ ߥߦߏ ߣߌ߲߬ ߛߌ߫ ߟߊߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߏ߬ ߞߏߟߐ߲߬ ߊ߬ ߕߍ߫ ߛߴߊ߬ߟߎ߬ ߕߏߟߏ߲߫ ߠߊ߫.</string>\n    <string name=\"import_data_title\">ߞߊ߬ ߟߐ߲ߕߊߓߘߐ ߟߊߛߣߍ߫</string>\n    <string name=\"file_deleted\">ߞߐߕߐ߮ ߓߘߊ߫ ߖߏ߬ߛߌ߫</string>\n    <string name=\"notification_channel_description\">ߣߌߎߔߌߔ ߕߏߟߏ߲ߟߊ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬</string>\n    <string name=\"import_data_summary\">ߌ ߟߊ߫ ߘߝߐ߬ߦߊ߸ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬߸ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߎ߬ ߊ߬ߣߌ߫ (ߢߣߊߕߊߟߌ ߘߐ߫) ߢߊߓߐߟߌ ߟߎ߬ ߘߌ߫ ߣߐ߬ߘߐߓߌ߬ߟߊ߬</string>\n    <string name=\"clear_playback_states_title\">ߞߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߫ ߖߐ߬ߛߌ߫</string>\n    <string name=\"clear_search_history_title\">ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߝߌߘߊ߲߫</string>\n    <string name=\"clear_playback_states_summary\">ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߘߊ߲߬ߘߌߦߊ ߟߎ߬ ߓߍ߯ ߖߐ߬ߛߌ߫</string>\n    <string name=\"download_to_sdcard_error_message\">ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲߫ ߞߊ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߕߍ߫ ߓߍ߲߬. ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߘߌ߲߬ߞߌߙߊ ߢߡߊߛߊ߬ߦߌ߬ ؟</string>\n    <string name=\"could_not_setup_download_menu\">ߟߊ߬ߖߌ߰ߟߌ ߢߣߊߥߟߊ߫ ߕߍ߫ ߛߋ߫ ߘߐߛߌ߰ ߟߊ߫</string>\n    <string name=\"show_comments_title\">ߞߊ߬ ߞߊ߲߬ߞߎߡߊ ߟߎ߫ ߦߌ߬ߘߊ߬</string>\n    <string name=\"show_comments_summary\">ߊ߬ ߟߊߛߊ߬ ߞߊ߬ ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߢߡߊߘߏ߲߰</string>\n    <string name=\"show_next_and_similar_title\">ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߣߊ߬ߕߊ ߟߎ߬ ߣߌ߫ ߢߐ߲߰ߘߐ ߟߎ߫ ߦߌ߬ߘߊ߬</string>\n    <string name=\"show_description_title\">ߞߊ߬ ߞߊ߲߬ߛߓߍ ߦߌ߬ߘߊ߬</string>\n    <string name=\"show_description_summary\">ߊ߬ ߟߊߛߊ߬ ߞߊ߬ ߦߋߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ ߣߴߊ߬ ߟߌ߬ߤߟߊ߬ ߜߘߍ߫ ߟߎ߬ ߢߡߊߘߏ߲߰</string>\n    <string name=\"show_meta_info_title\">ߞߊ߬ ߟߌ߬ߤߟߊ߬ ߞߎ߲ߓߊ ߟߎ߫ ߦߌ߬ߘߊ߬</string>\n    <string name=\"show_meta_info_summary\">ߊ߬߬ ߟߊߛߊ߬ ߞߊ߬ ߟߌ߬ߤߟߊ߬ ߞߎ߲ߓߊ ߟߎ߫ ߝߏ߬ߘߏ ߢߡߊߘߏ߲߰߸ ߣߴߊ߬ ߦߋ߫ ߥߏ߬ߦߏ ߛߌ߲ߘߌߓߊ߮ ߣߌ߫ ߥߏ߬ߦߏ ߞߣߐߘߐ ߟߥߊ߫ ߢߌߣߌ߲ߠߌ߲߫ ߡߊߢߌߣߌ߲߫ ߘߌ߫</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">ߦߟߌߡߊߛߌ߯ ߖߌ߬ߦߊ߬ߓߍ ߟߎ߬ ߓߘߊ߫ ߝߌߘߊ߲߫</string>\n    <string name=\"metadata_cache_wipe_title\">ߞߊ߬ ߦߟߌߡߊߛߌ߯ ߟߐ߲ߕߊ߫ ߞߎ߲ߓߊ ߟߎ߬ ߝߌߘߊ߲߫</string>\n    <string name=\"metadata_cache_wipe_summary\">ߞߊ߬ ߓߟߐߟߐ߫ ߞߐߜߍ ߟߎ߬ ߟߐ߲ߕߊ ߟߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߫ ߦߟߌߡߊߛߌ߯ ߘߐ߫</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">ߟߐ߲ߕߊ߫ ߞߎ߲ߓߊ ߟߎ߬ ߓߘߊ߫ ߖߏ߬ߛߌ߫ ߦߟߌߡߊߛߌ߮ ߞߣߐ߫</string>\n    <string name=\"auto_queue_toggle\">ߞߴߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߴߊ߬ ߖߍ߬ߘߍߡߊ߬</string>\n    <string name=\"enable_watch_history_title\">ߦߋߣߍ߲ ߠߎ߫ ߘߝߐ߬ߦߊ</string>\n    <string name=\"enable_search_history_summary\">ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߟߊߡߊ߲߬ߘߌ߫ ߕߙߏߞߏ ߞߊ߲߬</string>\n    <string name=\"settings_category_clear_data_title\">ߞߊ߬ ߟߐ߲ߕߊ ߟߎ߬ ߝߌߘߊ߲߫</string>\n    <string name=\"autoplay_title\">ߕߏߟߏ߲ߖߘߍ߬ߡߊ</string>\n    <string name=\"unsupported_url\">ߛߘߌ߬ߜߋ߲߫ ߕߊ߬ߓߊߟߌ</string>\n    <string name=\"start_main_player_fullscreen_summary\">ߦߋߡߍ߲ߕߊ ߟߎ߬ ߞߊߣߊ߬ ߘߊߦߟߍ߬ ߕߏߟߏ߲ߟߊ߲ ߞߏߘߋߞߏߘߋ ߞߣߐ߫߸ ߞߏ߬ߣߌ߲߬ ߞߵߊ߬ ߟߊߞߊ߬ ߥߊ߲߬ߥߊ߲߬ ߝߊ ߘߐ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߥߟߏߒߖߘߍ߬ߡߊ ߜߊߛߏ߲ߣߍ߲߫. ߌ ߘߌ߫ ߛߋ߫ ߕߏߟߏ߲ߟߊ߲ ߞߏߘߋߞߏߘߋ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߣߴߌ ߓߐ߫ ߘߊ߫ ߥߊ߲߬ߥߊ߲߬ ߝߊ ߗߏ߯ߦߊ ߘߐ߫</string>\n    <string name=\"content_language_title\">ߞߣߐߘߐ߫ ߞߊ߲߫ ߖߏߣߡߊ</string>\n    <string name=\"peertube_instance_url_title\">PeerTube ߛߐߘߊ ߟߎ߬</string>\n    <string name=\"peertube_instance_url_summary\">ߌ ߟߊ߫ PeerTube ߛߐߘߊ߫ ߤߍߣߍ߲ߣߊ߲ߕߊ ߟߎ߬ ߛߎߥߊ߲ߘߌ߫</string>\n    <string name=\"peertube_instance_add_exists\">ߛߐߘߊ ߏ߬ ߦߋ߲߬ ߞߘߐ߬ߡߊ߲߫</string>\n    <string name=\"settings_category_player_title\">ߕߏߟߏ߲ߟߊ߲</string>\n    <string name=\"all\">ߊ߬ߓߍ߯</string>\n    <string name=\"error_report_title\">ߝߎ߬ߕߎ߲߬ߕߌ߫ ߘߊ߲߬ߕߍ߰ߟߌ</string>\n    <string name=\"playlists\">ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬</string>\n    <string name=\"channels\">ߥߙߏߝߋ ߟߎ߬</string>\n    <string name=\"videos_string\">ߖߌ߬ߦߊ߬ߖߟߎ ߟߎ߬</string>\n    <string name=\"tracks\">ߓߟߏ</string>\n    <string name=\"users\">ߕߣߐ߬ߓߐ߬ߟߊ ߟߎ߬</string>\n    <string name=\"albums\">ߕߌߛߐ߲ ߠߎ߬</string>\n    <string name=\"notifications\">ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬</string>\n    <string name=\"notification_channel_name\">ߣߌߎߔߌߔ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲</string>\n    <string name=\"just_once\">ߛߎ߬ߢߊ߬ ߞߋߟߋ߲߫ ߔߋ߫</string>\n    <string name=\"file\">ߞߐߕߐ߮</string>\n    <string name=\"error_report_channel_description\">ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ ߟߎ߬ ߞߐߡߌ߲ߦߊ߫</string>\n    <string name=\"unknown_content\">[ߟߐ߲ߓߊߟߌ]</string>\n    <string name=\"switch_to_background\">ߞߊ߬ ߦߟߍ߬ߡߊ߲߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫</string>\n    <string name=\"hash_channel_name\">ߖߌ߬ߦߊ߬ߖߟߎ߬ ߘߐ߬ߢߋߙߋ߲ߞߎ߲ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲</string>\n    <string name=\"hash_channel_description\">ߖߌ߬ߦߊ߬ߖߟߎ߬ ߘߐ߬ߢߋߙߋ߲ߞߎ߲ ߛߋ߲߬ߕߊ߯ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬</string>\n    <string name=\"streams_notification_channel_name\">ߥߦߏ߬ ߞߎߘߊ ߟߎ߬</string>\n    <string name=\"streams_notification_channel_description\">ߡߊ߬ߝߘߎ߬ߟߌ߫ ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬</string>\n    <string name=\"error_report_channel_name\">ߝߎ߬ߕߎ߲߬ߕߌ߫ ߘߊ߲߬ߕߍ߰ߟߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲</string>\n    <string name=\"clear_cookie_title\">ߞߊ߬ ߡߐ߰ߦߊ߬ߟߐ߲߫ ߦߟߌߘߏ߲ ߠߎ߬ ߝߌߘߊ߲߫</string>\n    <string name=\"clear_views_history_summary\">ߥߦߏ߬ ߕߏߟߏ߲ߣߍ߲ ߠߎ߬ ߘߝߐ߬ߦߊ ߖߐ߬ߛߌ߫ ߊ߬ߣߌ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߘߊ߲߬ߘߌߦߊ ߟߎ߬</string>\n    <string name=\"delete_view_history_alert\">ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߡߊ߬ߝߍ߬ߣߍ߲߬ߣߍ߲߫ ߘߝߐ߬ߦߊ ߡߎ߬ߡߍ ߖߐ߬ߛߌ߫ ؟</string>\n    <string name=\"watch_history_deleted\">ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߘߝߐ߬ߦߊ ߓߘߊ߫ ߖߐ߬ߛߌ߫</string>\n    <string name=\"delete_search_history_alert\">ߞߊ߬ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߡߎ߬ߡߍ ߖߐ߬ߛߌ߫ ؟</string>\n    <string name=\"search_history_deleted\">ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߓߘߊ߫ ߖߐ߬ߛߌ߫</string>\n    <string name=\"could_not_load_thumbnails\">ߛߋ߫ ߡߊ߫ ߞߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߟߎ߬ ߓߍ߯ ߖߛߐ߫ ߟߋ߫</string>\n    <string name=\"player_unrecoverable_failure\">ߝߎ߬ߕߎ߲߬ߕߌ߬ ߘߊߓߍ߲߬ߓߊߟߌ ߘߏ߫ ߓߘߊ߫ ߓߌ߬ߟߵߊ߬ ߘߐ߫</string>\n    <string name=\"player_recoverable_failure\">ߟߛߊ߬ߦߌ߬ߟߌ ߞߊ߬ ߝߘߊ߫ ߕߏߟߏ߲ߠߊ ߝߎ߬ߕߎ߲߬ߕߌ ߟߊ߫</string>\n    <string name=\"external_player_unsupported_link_type\">ߞߐߞߊ߲߫ ߕߏߟߏ߲ߟߊ߲ ߠߎ߬ ߕߍ߫ ߛߘߌ߬ߜߋ߲߬ ߛߎ߯ߦߊ ߣߌ߲߬ ߕߊ߬ ߟߊ߫</string>\n    <string name=\"video_streams_empty\">ߦߋߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬</string>\n    <string name=\"audio_streams_empty\">ߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬</string>\n    <string name=\"player_stream_failure\">ߥߏ߬ߦߏ ߣߌ߲߬ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߕߏߟߏ߲߫ ߠߊ߫</string>\n    <string name=\"permission_display_over_apps\">ߞߵߊ߬ ߝߍ߲߬ߛߍ߲߬ߠߌ߲ ߠߊߘߌ߬ߢߍ߬ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߟߎ߫ ߞߐߞߊ߲߬</string>\n    <string name=\"error_report_notification_title\">ߣߌߎߔߌߔ ߓߘߊ߫ ߝߎ߬ߕߎ߲߬ߕߌ ߘߏ߫ ߛߐ߬ߘߐ߲߬߸ ߊ߬ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߘߊ߲߭ߕߍ߰</string>\n    <string name=\"restore_defaults\">ߞߊ߬ ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ ߟߎ߬ ߟߊߛߊ߬ߦߌ߬</string>\n    <string name=\"restore_defaults_confirmation\">ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ ߟߎ߬ ߟߊߛߊ߬ߦߌ߬ ؟</string>\n    <string name=\"error_report_button_text\">ߞߵߊ߬ ߞߏߝߐ߫ ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߟߊ߫</string>\n    <string name=\"copy_for_github\">ߘߊ߲߬ߕߍ߰ߟߌ߬ ߢߊ߲ߞߊ߲ߦߊߣߍ߲ ߓߊߓߌߟߊ߫</string>\n    <string name=\"error_report_open_issue_button_text\">ߊ߬ ߞߏߝߐ߫ GitHub ߞߊ߲߬</string>\n    <string name=\"error_snackbar_action\">ߊ߬ ߞߏߝߐ߫</string>\n    <string name=\"import_subscriptions_hint\">ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊߛߣߍ߫ ߥߟߊ߬ ߞߵߊ߬ߟߎ߬ ߟߊߝߏ߬ߦߌ߬ ߢߣߊߥߟߊ ߘߐ߫ ߕߏ߲ߘߋߣߍ߲߫ ߃ߝߍ߬</string>\n    <string name=\"empty_list_subtitle\">ߝߏߛߌ߬ ߕߍ߫ ߦߋ߲߬</string>\n    <string name=\"detail_drag_description\">ߊ߬ ߕߣߍߣߍ߫ ߞߵߊ߬ ߘߊߕߏߡߦߊ߫</string>\n    <string name=\"video\">ߦߋߡߍ߲ߕߊ</string>\n    <string name=\"error_report_open_github_notice\">ߊ߬ ߡߊߝߍߣߍ߲߫ ߣߴߌ ߟߊ߫ ߝߙߋߞߋ߫ ߛߎ߮ ߣߌ߲߬ ߘߊ߲߭ߕߍ߰ߣߍ߲߫ ߞߘߐ߬ߡߊ߲߫. ߝߙߋߞߋ߫ ߞߋߟߋ߲ ߓߊ߫ ߞߏߝߐ߫ ߞߏ߫ ߝߌ߲߬߸ ߏ߬ ߦߋ߫ ߊ߲ ߠߊ߫ ߕߎ߬ߡߊ ߟߋ߬ ߘߐߕߌߢߍ߫ ߟߊ߫߸ ߞߊ߬ ߞߏ߫ ߜߘߍ߫ ߟߎ߫ ߞߍ ߘߐߛߊ߬ ߊ߲ ߡߊ߬.</string>\n    <string name=\"description_tab_description\">ߞߊ߲߬ߛߓߍ</string>\n    <string name=\"subscribers_count_not_available\">ߝߊ߬ߝߘߎ߬ߓߊ߯ ߖߊ߬ߕߋ ߡߊ߬ߛߐ߬ߘߐ߲߬ߣߍ߲߬ ߕߍ߫</string>\n    <string name=\"drawer_header_description\">ߞߊ߬ ߗߋߢߊ߫ ߟߎ߬ ߟߊߦߟߍ߬ߡߊ߲߬߸ ߡߍ߲ ߠߎ߬ ߓߊߕߐߡߐ߲ߣߍ߲߫ ߕߋ߲߬:</string>\n    <string name=\"no_subscribers\">ߡߊ߬ߝߘߎ߬ߓߊ߰ ߝߏߛߌ߬</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"other\">ߡߊ߬ߝߘߎ߬ߓߊ߰ %s</item>\n    </plurals>\n    <string name=\"no_views\">ߦߋߟߌ߫ ߕߍ߫ ߦߋ߲߬</string>\n    <plurals name=\"views\">\n        <item quantity=\"other\">ߦߋߞߏ߫ %s</item>\n    </plurals>\n    <string name=\"no_one_watching\">ߡߐ߰ ߛߌ߫ ߕߴߊ߬ ߘߐߜߍ߫ ߠߊ߫</string>\n    <plurals name=\"watching\">\n        <item quantity=\"other\">ߘߐߜߍߓߊ߯ %s</item>\n    </plurals>\n    <string name=\"no_one_listening\">ߡߐ߰ ߛߌ߫ ߕߴߊ߬ ߟߊߡߍ߲߫ ߠߊ߫</string>\n    <plurals name=\"listening\">\n        <item quantity=\"other\">ߟߊ߬ߡߍ߲߬ߓߊ߰ %s</item>\n    </plurals>\n    <string name=\"no_videos\">ߦߋߡߍ߲ߕߊ߫ ߕߍ߫ ߦߋ߲߬</string>\n    <string name=\"more_than_100_videos\">ߦߋߡߍ߲ߕߊ߫ ߁߀߀+</string>\n    <string name=\"no_comments\">ߞߊ߲߬ߞߎ߬ߡߊ߬ ߕߍ߫ ߦߋ߲߬</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"other\">ߥߦߏ߬ ߞߎߘߊ߫ %s</item>\n    </plurals>\n    <string name=\"pause\">ߞߵߊ߬ ߟߊߟߐ߬</string>\n    <string name=\"create\">ߞߵߊ߬ ߛߌ߲ߘߌ߫</string>\n    <string name=\"checksum\">ߜߋ߲߬ߟߎ߲߬ߠߌ߲߫ ߘߊ߬ߡߊ</string>\n    <string name=\"dismiss\">ߞߵߊ߬ ߟߊߓߌ߬ߟߊ߬</string>\n    <string name=\"rename\">ߞߵߊ߬ ߕߐ߯ߟߊ߫</string>\n    <string name=\"msg_name\">ߞߐߕߐ߯ ߕߐ߮</string>\n    <string name=\"msg_threads\">ߜߊ߲߬ߞߎ߲߬ߠߌ߲߫ ߢߐ߲߰ߝߍ</string>\n    <string name=\"msg_error\">ߝߎ߬ߕߎ߲߬ߕߌ</string>\n    <string name=\"msg_running\">ߣߌߎߔߌߔ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ ߟߊ߫</string>\n    <string name=\"msg_running_detail\">ߊ߬ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߕߐ߬ߝߍ߬ߦߊ߫</string>\n    <string name=\"no_dir_yet\">ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲߫ ߛߌ߫ ߡߊ߫ ߘߊ߬ߠߊߕߍ߰ ߡߎߣߎ߲߬߸ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲߬ ߖߏߣߡߊ ߛߎߥߊ߲ߘߌ߫ ߛߌߛߍ߲߬</string>\n    <string name=\"recaptcha_solve\">ߞߵߊ߬ ߝߎߟߋ߲߫</string>\n    <string name=\"charset_most_special_characters\">ߞߟߏߘߋ߲߫ ߞߙߍߞߙߍߣߍ߲ ߝߊ߲߬ߓߊ</string>\n    <string name=\"title_activity_about\">ߣߌߎߔߌߔ ߞߊ߲߬</string>\n    <string name=\"copyright\">© %1$s߸ %2$s ߓߟߏ߫ %3$s ߞߘߐ߫</string>\n    <string name=\"tab_about\">ߊ߬ ߞߊ߲߬ &amp; ߢߞߛ</string>\n    <string name=\"contribution_title\">ߡߊ߬ߜߍ߲߬ߠߌ߲ ߞߍ߫</string>\n    <string name=\"app_license_title\">ߣߌߎߔߌߔ ߟߊ߬ߘߌߜߍ</string>\n    <string name=\"faq_title\">ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ߬ ߞߍߣߍ߲߫ ߛߌߦߊߡߊ߲ ߠߎ߬</string>\n    <string name=\"faq_description\">ߣߴߌ ߞߊ߬ ߜߟߍ߬ߦߊ߬ ߡߊߛߐ߬ߘߐ߲߬ ߟߥߊߟߌߟߊ߲ ߠߊߓߊ߯ߙߊ ߘߐ߫߸ ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ߬ ߞߍߣߍ߲߫ ߛߌߦߊߡߊ߲ ߠߎ߬ ߡߊߝߍߣߍ߲߫ ߹</string>\n    <string name=\"action_history\">ߘߝߐ߬ߦߊ</string>\n    <string name=\"delete_item_search_history\">ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߝߌ߬ߛߌ ߣߌ߲߬ ߖߐ߬ߛߌ߫ ߢߌߣߌ߲ߠߌ߲߫ ߘߝߐ߬ߦߊ ߟߎ߬ ߘߐ߫؟</string>\n    <string name=\"title_most_played\">ߦߋߡߍ߲ߕߊ߫ ߦߋߣߍ߲ߓߊ ߟߎ߬</string>\n    <string name=\"main_page_content\">ߓߏ߬ߟߏ߲߬ ߞߐߜߍ ߞߣߐߘߐ</string>\n    <string name=\"override_current_data\">ߏ߬ ߘߴߌ ߟߊ߫ ߛߋ߲߬ߠߊ߬ ߢߊߓߐߟߌ ߟߎ߬ ߓߍ߯ ߝߌߘߊ߲߫.</string>\n    <string name=\"main_page_content_summary\">ߛߎߥߊ߲ߘߟߌ ߞߍ߫ ߛߏ߬ߙߌ߲߬ߘߐ ߟߎ߬ ߟߊ߫߸ ߡߍ߲ ߠߎ߫ ߦߌ߬ߘߊ߬ߕߐ߫ ߓߏ߬ߟߏ߲߬ ߞߐߜߍ ߞߊ߲߬</string>\n    <string name=\"main_page_content_swipe_remove\">ߝߌ߬ߛߌ ߘߏ߫ ߕߣߍ߬ߣߍ߫ ߞߵߊ߬ ߖߏ߬ߛߌ߫</string>\n    <string name=\"blank_page_summary\">ߞߐߜߍ߫ ߘߐߞߏߟߏ߲</string>\n    <string name=\"no_channel_subscribed_yet\">ߡߊ߬ߝߘߎ߬ߓߊ߰ ߕߍ߫ ߥߙߏߝߋ ߟߊ߫ ߝߟߐ߫</string>\n    <string name=\"show_channel_details\">ߥߙߏߝߋ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߝߍ߲߬ߛߍ߲߫</string>\n    <string name=\"enqueue_stream\">ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫</string>\n    <string name=\"top_50\">ߛߏ߬ߘߊ߲߬ߛߏ߬ ߅߀</string>\n    <string name=\"preferred_open_action_settings_summary\">ߞߍߟߌ߫ ߖߏߣߡߊ ߞߣߐߘߐ߫ ߘߊߦߟߍ ߘߐ߫ — %s</string>\n    <string name=\"background_player\">ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲</string>\n    <string name=\"popup_player\">ߝߎ߲ߞߊ߲ߡߊ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲</string>\n    <string name=\"always_ask_open_action\">ߞߊ߬ ߢߌ߬ߣߌ߲߬ߞߊ߬ߟߌ ߞߍ߫ ߞߎߘߍߦߌ߫</string>\n    <string name=\"mute\">ߡߊ߲߬ߞߊ߲ ߕߍ߰</string>\n    <string name=\"unmute\">ߡߊ߲߬ߞߊ߲ ߓߌ߬ߟߊ߬</string>\n    <string name=\"set_as_playlist_thumbnail\">ߊ߬ ߞߍ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߘߌ߫</string>\n    <string name=\"unset_playlist_thumbnail\">ߞߏ߬ߋ߬ߞߏ߬ߋ߬ ߘߎ߲ߡߕߊ ߓߐ߫ ߦߋ߲߬</string>\n    <string name=\"bookmark_playlist\">ߞߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊߞߎ߲߬ߘߎ߬</string>\n    <string name=\"preferred_player_fetcher_notification_title\">ߟߌ߬ߥߟߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">ߞߣߐߘߐ߫ ߡߊߢߌߣߌ߲ߣߍ߲ ߖߛߐߟߌ</string>\n    <string name=\"create_playlist\">ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎߘߊ</string>\n    <string name=\"rename_playlist\">ߞߵߊ߬ ߘߐߕߐ߯ߟߊ߫</string>\n    <string name=\"unbookmark_playlist\">ߞߊ߬ ߜߡߊ ߖߐ߬ߛߌ߫</string>\n    <string name=\"delete_playlist_prompt\">ߞߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߣߌ߲߬ ߖߐ߬ߛߌ߫ ؟</string>\n    <string name=\"playlist_creation_success\">ߕߏߟߏ߲߫ ߛߙߍߘߍ ߓߘߊ߫ ߛߌ߲ߘߌ߫</string>\n    <string name=\"playlist_add_stream_success\">ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫</string>\n    <string name=\"playlist_add_stream_success_duplicate\">ߓߊߟߌߣߍ߲ ߓߘߊ߫ ߝߙߊ߬ ߛߎ߬ߢߊ߬ %d</string>\n    <string name=\"playlist_no_uploader\">ߛߌ߲ߘߌߣߍ߲߫ ߖߘߍ߬ߡߊ (ߟߊ߬ߦߟߍ߬ߓߊ߮ ߡߊ߫ ߛߐ߬ߘߐ߲߬)</string>\n    <string name=\"caption_none\">ߞߘߐ߫ ߛߓߍ߫ ߛߌ߫ ߕߍ߫ ߦߋ߲߬</string>\n    <string name=\"resize_fit\">ߞߵߊ߬ ߟߊߓߍ߲߬</string>\n    <string name=\"resize_fill\">ߞߵߊ߬ ߟߝߊ߫</string>\n    <string name=\"caption_auto_generated\">ߛߌ߲ߘߌߣߍ߲߫ ߖߘߍ߬ߡߊ</string>\n    <string name=\"caption_setting_title\">ߞߘߐߛߓߍ ߟߎ߬</string>\n    <string name=\"enable_leak_canary_summary\">ߦߟߌߕߏߟߊ߲ ߠߊ߫ ߝߎ߲ߘߌ ߟߎ߫ ߜߋ߬ߟߎ߲ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߊ߫ ߛߊߓߎ߫ ߘߌ߫ ߞߊ߬ ߟߥߊߟߌߟߊ߲ ߜߊߘߊ߲߫</string>\n    <string name=\"show_error_snackbar\">ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߝߙߊߕߌ ߦߌ߬ߘߊ߬</string>\n    <string name=\"create_error_notification\">ߝߎ߬ߕߎ߲߬ߕߌ߬ ߛߐߓߌߘߐߓߏ߲߫ ߘߏ߫ ߛߌ߲ߘߌ߫</string>\n    <string name=\"import_title\">ߞߵߊ߬ ߟߊߛߣߍ߫</string>\n    <string name=\"import_from\">ߊ߬ ߟߊߛߣߍ߫ ߞߊ߬ߓߌ߯</string>\n    <string name=\"export_to\">ߞߵߊ߬ ߟߊߓߐ߫ ߞߊߕߘߍ߬</string>\n    <string name=\"import_ongoing\">ߟߊ߬ߛߣߍ߬ߟߌ ߦߴߌߘߐ߫…</string>\n    <string name=\"import_file_title\">ߞߊ߬ ߞߐߕߐ߮ ߟߊߛߣߍ߫</string>\n    <string name=\"previous_export\">ߟߊ߬ߓߐ߬ߟߌ߫ ߕߊ߬ߡߌ߲߬ߣߍ߲</string>\n    <string name=\"enable_streams_notifications_title\">ߦߋߡߍ߲ߕߊ߫ ߞߎߘߊ</string>\n    <string name=\"infinite_videos\">ߦߋߡߍ߲ߕߊ߫ ∞</string>\n    <plurals name=\"videos\">\n        <item quantity=\"other\">ߦߋߡߍ߲ߕߊ߫ %s</item>\n    </plurals>\n    <string name=\"msg_wait\">ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߡߊߞߐ߬ߣߐ߲߬…</string>\n    <string name=\"msg_copied\">ߊ߬ ߓߘߊ߫ ߓߊߓߌߟߊ߫ ߞߓߊ߬ߞߘߐ߬ߘߏ߲ ߘߐ߫</string>\n    <string name=\"msg_failed_to_copy\">ߊ߬ ߡߊ߫ ߛߋ߫ ߓߊߓߌߟߊ߫ ߟߊ߫ ߞߓߊ߬ߞߘߐ߬ߘߏ߲ ߘߐ߫</string>\n    <string name=\"msg_calculating_hash\">ߢߋߙߋ߲ߞߎ߲߫ ߖߊ߬ߕߋ߬ߓߐ</string>\n    <string name=\"msg_popup_permission\">ߡߊ߬ߞߏ ߦߋ߫ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߣߌ߲߬ ߠߊ߫ ߞߊ߬\n\\nߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߊߦߟߍ߬</string>\n    <string name=\"one_item_deleted\">ߝߛߌ߬ ߞߋߟߋ߲߫ ߓߘߊ߫ ߖߏ߬ߛߌ߬.</string>\n    <string name=\"title_activity_recaptcha\">ߡߐ߰ߦߊ߬ߟߐ߲߫ ߓߋ߭</string>\n    <string name=\"recaptcha_request_toast\">ߡߐ߰ߦߊ߬ߟߐ߲߫ ߓߋ߭ ߡߊߢߌߣߌ߲ߣߍ߲߫</string>\n    <string name=\"subtitle_activity_recaptcha\">ߌ ߓߴߊ߬ ߝߎߟߋ߲߫ ߦߋ߫ \\\"ߊ߬ ߓߘߊ߫ ߓߊ߲߫\\\" ߛߐ߲߬ߞߌ߲߫</string>\n    <string name=\"settings_file_charset_title\">ߞߟߏߘߋ߲߫ ߠߊߘߌ߬ߢߍ߬ߣߍ߲ ߠߎ߬ ߞߐߕߐ߯ ߕߐ߮ ߘߐ߫</string>\n    <string name=\"settings_file_replacement_character_summary\">ߞߟߏߘߋ߲߫ ߠߊߘߌ߬ߢߍ߬ߓߊߟߌ ߟߎ߫ ߣߐ߬ߘߐߓߌ߬ߟߊ߬ߕߐ߫ ߡߐ߬ߟߐ߲ ߣߌ߬ ߠߋ߬ ߟߊ߫</string>\n    <string name=\"settings_file_replacement_character_title\">ߣߘߐ߬ߓߌ߬ߟߊ߬ߟߌ߬ ߞߟߏߘߋ߲</string>\n    <string name=\"done\">ߊ߬ ߓߘߊ߫ ߓߊ߲߫</string>\n    <string name=\"settings_category_downloads_title\">ߟߊ߬ߖߌ߰ߟߌ</string>\n    <string name=\"tab_licenses\">ߟߊ߬ߘߌߢߍ ߟߎ߬</string>\n    <string name=\"view_on_github\">ߊ߬ ߡߊߝߍߣߍ߲߫ GitHub ߞߊ߲߬</string>\n    <string name=\"donation_title\">ߊ߲ ߞߣߐߘߐߘߌߦߊ߫</string>\n    <string name=\"give_back\">ߞߊ߬ ߓߟߏߢߐ߲߯ߠߊߛߊ߬ߦߌ߬</string>\n    <string name=\"contribution_encouragement\">ߊ߬ ߞߍ߫ ߘߊ߫ ߘߟߊߡߌߣߊߟߌ߫ ߡߙߌߦߊ߫ ߘߌ߫ ߓߊ߬߸ ߥߟߊ߫ ߡߊ߬ߞߙߍ߬ߟߌ߫߸ ߥߟߊ߫ ߘߏߝߙߍߕߍ߫ ߟߛߊߣߌ߲ߧߊ߫߸ ߤߊߡߊ߲ߕߍ߫ ߘߏߝߙߍߕߍ߫ ߡߝߊߟߋ߲. ߘߍ߬ߡߍ߲ ߞߍ߫ ߘߊ߫ ߢߊ߫ ߛߌ߫ ߡߊ߬߸ ߊ߬ ߞߊߢߌ߲߬. ߏ߬ ߟߋ ߦߴߊ߬ ߟߊߢߊ߬ ߟߊ߫ ߓߘߍߞߍ߹</string>\n    <string name=\"website_title\">ߗߍߦߙߐ</string>\n    <string name=\"website_encouragement\">ߣߌߎߔߌߔ ߟߊ߫ ߗߍߦߙߐ ߡߊߝߍߣߍ߲߫ ߞߊ߬ ߟߌ߬ߤߟߊ ߟߎ߬ ߣߌ߫ ߗߍߞߎߘߊ ߟߎ߫ ߛߐ߬ߘߐ߲߬.</string>\n    <string name=\"privacy_policy_title\">ߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ</string>\n    <string name=\"read_privacy_policy\">ߞߊ߬ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߊ߬ߙߊ߲߬</string>\n    <string name=\"read_full_license\">ߞߊ߬ ߟߊ߬ߘߌߢߍ ߞߊ߬ߙߊ߲߬</string>\n    <string name=\"faq\">ߊ߬ ߡߊߝߍߣߍ߲߫ ߗߍߦߙߐ ߟߊ߫</string>\n    <string name=\"title_activity_history\">ߘߝߐ߬ߦߊ</string>\n    <string name=\"title_last_played\">ߞߐߟߕߊ߫ ߕߏߟߏ߲ߣߍ߲ ߠߎ߬</string>\n    <string name=\"channel_page_summary\">ߥߙߏߝߋ߫ ߞߐߜߍ</string>\n    <string name=\"kiosk_page_summary\">ߝߎ߲ߞߎ߲ߟߋ߲</string>\n    <string name=\"select_a_channel\">ߥߙߏߝߋ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫</string>\n    <string name=\"default_kiosk_page_summary\">ߝߎ߲ߞߎ߲ߟߋ߲߫ ߖߏߣߡߊ</string>\n    <string name=\"select_a_kiosk\">ߝߎ߲ߞߎ߲ߟߋ߲ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫</string>\n    <string name=\"import_complete_toast\">ߊ߬ ߓߘߊ߫ ߟߊߛߣߍ߫</string>\n    <string name=\"no_valid_zip_file\">ZIP ߞߐߕߐ߮ ߕߍ߫ ߛߐ߲߬</string>\n    <string name=\"export_complete_toast\">ߊ߬ ߓߘߊ߫ ߟߊߓߐ߫</string>\n    <string name=\"could_not_import_all_files\">ߖߊ߲߬ߕߏ߬ߒߘߐ: ߞߐߕߐ߮ ߟߎ߬ ߓߍ߯ ߕߍ߫ ߛߋ߫ ߟߊߛߣߍ߫ ߟߊ߫.</string>\n    <string name=\"select_a_playlist\">ߕߏߟߏ߲߫ ߛߙߍߘߍ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫</string>\n    <string name=\"no_playlist_bookmarked_yet\">ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߬ ߕߍ߫ ߝߟߐ߫</string>\n    <string name=\"trending\">ߛߊ߲ߞߊߥߟߌ ߟߎ߬</string>\n    <string name=\"error_unable_to_load_comments\">ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߖߛߐ߫ ߟߊ߫</string>\n    <string name=\"local\">ߘߌ߲߬ߞߌ߬ߙߊ߬ߡߊ</string>\n    <string name=\"most_liked\">ߘߌߦߊߢߍߣߍ߲ߓߊ ߟߎ߬</string>\n    <string name=\"conferences\">ߜߊ߬ߙߊ ߟߎ߬</string>\n    <string name=\"title_activity_play_queue\">ߕߏߟߏ߲߫ ߛߙߍߘߍ</string>\n    <string name=\"play_queue_remove\">ߞߵߊ߬ ߖߏ߬ߛߌ߫</string>\n    <string name=\"play_queue_stream_detail\">ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬</string>\n    <string name=\"play_queue_audio_settings\">ߡߍ߲ߕߊ߫ ߢߊߓߐߟߌ ߟߎ߬</string>\n    <string name=\"hold_to_append\">ߊ߬ ߘߌ߯ߣߍ߲ ߕߏ߫ ߞߵߊ߬ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫</string>\n    <string name=\"new_and_hot\">ߞߎߘߊ ߣߌ߫ ߞߟߊߡߊ߲</string>\n    <string name=\"recently_added\">ߞߎߘߊ߫ ߝߙߊ߬ߣߍ߲ ߠߎ߬</string>\n    <string name=\"enqueue_next_stream\">ߞߵߊ߬ ߞߍ߫ ߣߊ߬ߕߐ ߘߌ߫ ߕߎ߲߰ߠߌ߲ ߘߐ߫</string>\n    <string name=\"enqueued\">ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫</string>\n    <string name=\"enqueued_next\">ߊ߬ ߓߘߊ߫ ߞߍ߫ ߣߊ߬ߕߐ ߘߌ߫ ߕߎ߲߰ߠߌ߲ ߘߐ߫</string>\n    <string name=\"start_here_on_popup\">ߞߊ߬ ߕߏߟߏ߲ ߘߊߡߌ߬ߣߊ߬ ߝߢߐߘߊ߫ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫</string>\n    <string name=\"loading_stream_details\">ߥߏ߬ߦߏ߫ ߕߐ߬ߝߍ߬ߦߊ ߟߎ߬ ߖߛߐ ߦߴߌߘߐ߫…</string>\n    <string name=\"drawer_open\">ߢߣߊߥߟߊ ߘߊߦߟߍ߬</string>\n    <string name=\"drawer_close\">ߢߣߊߥߟߊ ߘߊߕߎ߲߯</string>\n    <string name=\"preferred_open_action_settings_title\">ߟߞߊ߬ߟߌ߫ ߞߍߟߊ߲߫ ߛߊ߬ߥߏ߬ߣߍ߲ߕߊ</string>\n    <string name=\"name\">ߕߐ߮</string>\n    <string name=\"add_to_playlist\">ߞߵߊ߬ ߝߙߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊ߫</string>\n    <string name=\"leak_canary_not_available\">LeakCanary ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬</string>\n    <string name=\"show_memory_leaks\">ߞߊ߬ ߦߟߌߕߏߟߊ߲ ߠߊ߫ ߝߎ߲ߘߌ ߟߎ߬ ߦߌ߬ߘߊ߬</string>\n    <string name=\"show_crash_the_player_title\">ߞߊ߬ \\\"ߘߐߛߊߙߌߟߊ߲ ߠߜߊߛߊ߲߫\\\" ߦߌ߬ߘߊ߬</string>\n    <string name=\"show_crash_the_player_summary\">ߞߊ߬ \\\"ߘߐߛߊߙߌߟߊ߲ ߠߜߊߛߊ߲߫\\\" ߦߌ߬ߘߊ߬</string>\n    <string name=\"check_new_streams\">ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߕߎ߬ߢߊ߬ߟߐ߲ ߠߊߥߟߌ߬</string>\n    <string name=\"crash_the_app\">ߞߊ߬ ߟߥߊߟߌߟߊ߲ ߠߊߜߊߛߊ߲߫</string>\n    <string name=\"show_original_time_ago_summary\">ߗߋߢߊߟߌ ߟߎ߬ ߞߟߏߜߍ߫ ߓߐߛߎ߲ߡߊ ߟߎ߬ ߦߌ߬ߘߊ߬ߕߐ߫ ߟߋ߬ ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲ ߘߐ߫</string>\n    <string name=\"disable_media_tunneling_title\">ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬</string>\n    <string name=\"disable_media_tunneling_summary\">ߞߋߟߋߞߋߟߋ ߟߊ߫ ߝߊߟߊ߲ߓߍߦߊ ߟߊߛߊ߬ ߣߴߌ ߞߊ߬ ߥߊ߲߬ߊߥߊ߲߬ ߝߌ߲ ߦߋ߫ ߥߟߊ߫ ߜߊߘߊ߲ߜߊߘߊ߲ߠߌ߲ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߐߛߊߙߌ߫ ߕߎߡߊ</string>\n    <string name=\"export_ongoing\">ߟߊ߬ߓߐ߬ߟߌ ߦߴߌߘߐ߫…</string>\n    <string name=\"start\">ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬</string>\n    <string name=\"comments_are_disabled\">ߞߊ߲߬ߞߎߡߊ ߟߎ߬ ߟߊߛߊ߬ߣߍ߲ ߠߋ߬</string>\n    <string name=\"delete\">ߞߵߊ߬ ߖߏ߬ߛߌ߫</string>\n    <string name=\"no_available_dir\">ߘߌ߬ߢߍ߬ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߎ߲ߓߍ߲ ߛߎߥߊ߲ߘߌ߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߞߐߟߊ߫</string>\n    <string name=\"charset_letters_and_digits\">ߛߓߍߘߋ߲ ߣߋ߫ ߖߊ߬ߕߋ߬ߘߋ߲ ߠߎ߬</string>\n    <string name=\"app_description\">ߥߦߏ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߊ ߞߊߟߌ߲ ߣߌ߫ ߝߍ߯ߡߊ߲ ߊ߲ߘߙߏߦߌߘ ߞߊ߲߬.</string>\n    <string name=\"donation_encouragement\">ߣߌߎߔߌߔ ߟߊߥߙߌߞߌߣߍ߲߫ ߓߐߒߖߘߍߘߐߓߊ߮ ߟߎ߫ ߟߋ߬ ߓߟߏ߫ ߊ߬ߟߎ߬ ߟߊ߫ ߕߎ߬ߡߊ߬ ߘߐ߬ߞߏߟߏ߲ ߠߎ߬ ߘߐ߫߸ ߞߴߊ߬ ߟߊߢߊ߬ ߊ߬ߟߎ߬ ߛߋߞߏ߫ ߘߊ߬ߡߊ߬ߦߌߙߊ ߟߊ߫. ߌ ߘߌ߫ ߛߋ߫ ߝߌ߬ߙߋ߲߬ߕߎ߬ ߛߐ߲ߞߐ ߘߌ߫ ߟߴߊ߬ߟߎ߫ ߡߊ߬߸ ߞߴߊ߬ߟߎ߬ ߞߣߐߘߐߘߌߦߊ߫ ߟߢߊ߬ߟߌ ߟߊ߫ ߓߘߍߞߍ.</string>\n    <string name=\"privacy_policy_encouragement\">ߣߌߎߔߌߔ ߘߊߞߎ߲ ߦߴߊߟߎ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߕߊ߬ ߟߊ߫ ߛߍ߬ߓߍ ߖߍ߬ߘߍߖߍ߬ߘߍ ߟߋ߬ ߟߊ߫. ߏ߬ ߘߐ߫߸ ߟߥߊߟߌߟߊ߲ ߕߍ߫ ߟߐ߲ߕߊ߫ ߛߌ߫ ߟߥߊ߫ ߟߊ߫ ߣߴߊ߬ ߡߴߌ ߟߊ߫ ߘߌ߬ߢߍ ߢߌߣߌ߲߫.\n\\nߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ ߦߴߊ߬ ߝߊߙߊ߲ߝߊ߯ߛߌ߫ ߟߴߌ ߢߍ߫ ߟߋ߬ ߥߘߋ߬ߥߘߋ߬ߟߌ ߘߝߊߣߍ߲ ߘߐ߫߸ ߟߐ߲ߕߊ߫ ߢߌ߬ߡߊ߲߬ ߠߥߊߕߐ߫ ߊ߬ ߣߌ߫ ߢߌ߬ߡߊ߲߬ ߠߊߞߎ߲߬ߘߎ߲߬ߕߐ߫ ߌ ߓߊ߫ ߞߍ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߟߊ߫.</string>\n    <string name=\"app_license\">ߣߌߎߔߌߔ (NewPipe) ߦߋ߫ ߡߊ߬ߞߏ߬ߟߊ߬ߓߐ߬ ߛߎ߲ߝߘߍ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߠߋ߬ ߘߌ߫: ߌ ߘߌ߫ ߛߴߊ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߞߵߊ߬ ߞߊ߬ߙߊ߲߬߸ ߞߵߊ߬ ߘߐߕߟߊ߫߸ ߊ߬ߣߌ߫ ߞߵߊ߬ ߟߊߢߊ߬ ߦߏ߫ ߊ߬ ߘߎߡߊ߲߫ ߌ ߢߍ߫ ߢߊ ߡߍ߲. ߊ߬ ߕߌ߯ߕߌ߮ ߘߐ߫߸ ߌ ߘߌ߫ ߛߴߊ߬ ߟߊߖߍ߲ߛߍ߲߫ ߠߊ߫ ߥߟߊ߫ ߞߊ߬ ߘߐ߬ߝߊ߬ߟߋ߲߬ߠߌ߲ ߞߍ߫ ߊ߬ ߘߐ߫ ߝߘߏ߬ߓߊ߬ ߟߊߘߌߢߍ߫ ߛߙߊߕߌ ߟߎ߬ ߞߘߐ߫ (GNU General Public License) ߦߏ߫ ߊ߬ ߟߊߖߍ߲ߛߍ߲ߣߍ߲߫ ߛߎ߲ߝߘߍ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߠߎ߬ ߛߌ߲ߘߌߘߊ ߓߟߏ߫ ߢߊ ߡߍ߲ (Free Software Foundation) ߊ߬ ߓߐߞߏ߫ ߃߲ ߘߐ߫߸ ߥߟߊ߫߸ ߌ ߛߊ߬ߥߏ߬ߣߍ߲߬ߕߊ ߟߊ߫ ߞߊ߬ ߓߍ߲߬ ߊ߬ ߓߐߞߏ߫ ߞߘߐ߫ ߛߌ߫ ߡߊ߬.</string>\n    <string name=\"import_settings\">ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߢߊߓߐߟߌ ߟߎ߬ ߝߊߣߊ߲߫ ߟߊߛߣߍ߫؟</string>\n    <string name=\"start_here_on_background\">ߞߊ߬ ߕߏߟߏ߲ ߘߊߡߌ߬ߣߊ߬ ߝߊ߲߬ߝߘߊ ߞߘߐ߫</string>\n    <string name=\"processing_may_take_a_moment\">ߦߙߍߞߍߟߌ ߦߴߌߘߐ߫... ߊ߬ ߘߌ߫ ߛߋ߫ ߥߛߎ߬ ߞߎߘߎ߲߬ߣߍ߲߫ ߕߊ߬ ߟߊ߫</string>\n    <string name=\"playlist_thumbnail_change_success\">ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߞߏ߬ߋߞߏ߬ߋ ߓߘߊ߫ ߡߊߝߊ߬ߟߋ߲߬.</string>\n    <string name=\"resize_zoom\">ߞߵߊ߬ ߥߊߘߏ߫</string>\n    <string name=\"enable_disposed_exceptions_summary\">ߞߊ߬ Rx ߢߌ߬ߣߊ߬ߓߐ߬ߕߊ߫ ߟߊߘߌߓߊߟߌ ߟߎ߫ ߘߊ߲߬ߕߍ߰ߟߌ߫ ߞߘߊߡߊ߫ ߞߎߘߎ߲ ߠߎ߬ ߞߐߞߊ߲߬ ߥߟߊ߫ ߥߊߟߌߦߊ ߛߌ߬ߡߊ߬ߦߊ ߞߎ߲߬ߕߊ߮ ߞߘߐ߫ ߦߙߍߞߍߟߌ߫ ߞߐߝߍ߬</string>\n    <string name=\"show_original_time_ago_title\">ߞߊ߬ ߕߎ߬ߡߘߊ߬ ߓߐߛߎ߲ߡߊ ߦߌ߬ߘߊ߬ ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲ ߠߎ߫ ߞߊ߬</string>\n    <string name=\"title_licenses\">ߜߘߍ ߟߊ߫ ߟߊ߬ߘߌߢߍ</string>\n    <string name=\"video_player\">ߦߋߡߍ߲ߕߊ߫ ߘߐߛߊߙߌߟߊ߲</string>\n    <string name=\"duplicate_in_playlist\">ߝߌ߬ߛߌ ߣߌ߲߬ ߦߋ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ߫ ߝߎߛߋߡߦߊߣߍ߲ ߠߎ߬ ߞߣߐ߫ ߞߘߐ߬ߡߊ߲߫.</string>\n    <string name=\"caption_setting_description\">ߞߊ߬ ߞߟߏߜߍ߫ ߘߍ߲߬ߘߍ߲ ߣߌ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߫ ߞߘߐߛߓߍ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߫ ߝߙߋߞߟߊ ߟߎ߬ ߡߊߝߊ߬ߟߋ߲߬. ߡߊ߬ߞߏ ߦߋ߫ ߟߥߊߟߌߟߊ߲߫ ߘߐ߬ߥߌ߬ߟߌ ߟߊ߫ ߞߵߊ߬ ߓߟߏߦߊ߫</string>\n    <string name=\"enable_disposed_exceptions_title\">ߝߎ߬ߕߎ߲߬ߕߌ߫ ߛߌ߬ ߓߊ߲ߣߍ߲ ߠߎ߬ ߞߏߐߝߐ߫</string>\n    <string name=\"subscriptions_import_unsuccessful\">ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߣߍ߫ ߟߊߛߣߍ߫ ߟߊ߫</string>\n    <string name=\"subscriptions_export_unsuccessful\">ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߕߍ߫ ߛߋ߫ ߟߊߓߐ߫ ߟߊ߫</string>\n    <string name=\"import_soundcloud_instructions_hint\">ߌߟߊ߫ߜߊ߲߬ߞߎ߲߬ߕߐ߮߸ soundcloud.com/ߌߟߊ߫ߜߊ߲߬ߞߎ߲߬ߕߐ߮</string>\n    <string name=\"import_network_expensive_warning\">ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߗߋߥߊߟߌ ߣߌ߲߬ ߘߌߣߊ߬ ߞߙߏ߬ߝߏ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߖߛߐ߫ ߞߏߛߓߍ߫.\n\\n\n\\nߞߵߊ߬ ߓߟߏߕߎ߲߰؟</string>\n    <string name=\"playback_reset\">ߞߵߊ߬ ߢߡߊߛߊ߬ߦߌ߬</string>\n    <string name=\"semitone\">ߞߊ߲ߡߊߛߙߋ߫-ߕߟߊ</string>\n    <string name=\"start_accept_privacy_policy\">ߞߊ߬ ߓߍ߲߬ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߞߊ߲ߘߊ߫ ߝߘߏ߬ߓߊ߬ ߞߎߙߎ߲ߘߎ (GDPR) ߡߊߓߏ߲߬ߧߊ ߡߊ߬߸ ߊ߲ ߧߴߌ ߖߊ߲߭ߓߌ߬ߟߊ߬ ߟߊ߫ ߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߐ߫. ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߘߐߞߊ߬ߙߊ߲߬ ߞߏߢߌ߲߬ߡߊ߬.\n\\nߌ ߞߊߞߊ߲߫ ߠߋ߬ ߞߵߌ ߛߐ߲߬ ߊ߬ ߡߊ߬ ߞߏ߫ ߛߴߌ ߘߌ߫ ߛߋ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߊ߲ ߡߊ߬.</string>\n    <string name=\"accept\">ߌ ߛߐ߲߬</string>\n    <string name=\"decline\">ߌ ߓߊ߲߬</string>\n    <string name=\"limit_data_usage_none_description\">ߘߊ߲߬ ߕߴߊ߬ ߟߊ߫</string>\n    <string name=\"limit_mobile_data_usage_title\">ߞߊ߬ ߓߍ߲߬ߡߊ ߘߊ߲߬ߠߊߕߍ߬ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߓߊ߯ߙߊ߫ ߕߎߡߊ</string>\n    <string name=\"enable_streams_notifications_summary\">ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊ߫ ߥߦߏ߬ ߞߎߘߊ ߟߎ߫ ߛߏߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊߣߊ߬</string>\n    <string name=\"any_network\">ߞߙߏ߬ߝߏ߫ ߛߎ߮ ߓߍ߯</string>\n    <string name=\"updates_setting_title\">ߟߏ߲ߘߐߦߊߟߌ ߟߎ߬</string>\n    <string name=\"check_for_updates\">ߟߏ߲ߘߐߦߊߟߌ ߟߎ߬ ߡߊߝߍߣߍ߲߫</string>\n    <string name=\"manual_update_description\">ߞߊ߬ ߓߐߞߏ߫ ߞߎߘߊ ߟߎ߫ ߕߎ߬ߢߊ߬ߟߐ߲߫ ߓߟߏ ߟߊ߫</string>\n    <string name=\"minimize_on_exit_title\">ߞߵߊ߬ ߡߊߖߌ߰ ߟߥߊߟߌߟߊ߲ ߘߐߦߟߍߡߊ߲߫ ߕߎߡߊ</string>\n    <string name=\"minimize_on_exit_none_description\">ߝߏߛߌ߬</string>\n    <string name=\"minimize_on_exit_popup_description\">ߞߵߊ߬ ߡߊߖߌ߰ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߝߎ߲ߞߊ߲ߡߊ ߘߐ߫</string>\n    <string name=\"autoplay_summary\">ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߘߊߦߟߍ߬ ߊ߬ ߖߍ߬ߘߍߡߊ߬ — %s</string>\n    <string name=\"wifi_only\">ߥߝߌ߫ ߘߐߙߐ߲߫ ߞߊ߲߬</string>\n    <string name=\"list_view_mode\">ߦߋߟߌ߫ ߗߏ߯ߦߊ߫ ߛߙߍߘߍ</string>\n    <string name=\"grid\">ߢߊ߲ߛߊ߲</string>\n    <string name=\"card\">ߔߊ߬ߔߘߊ</string>\n    <string name=\"auto\">ߖߘߍ߬ߢߍ߫</string>\n    <string name=\"seekbar_preview_thumbnail_title\">ߞߊ߬ ߢߍߕߊ߮ ߜߊߟߊ߲ߞߊ ߟߊߕߌ߲ ߦߌ߬ߘߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߞߊ߲߬</string>\n    <string name=\"low_quality_smaller\">ߓߘߍ߬ߦߊ߫ ߘߎ߰ߟߊ߬ߕߊ (ߘߐ߰ߡߊ߬ߣߍ߲)</string>\n    <string name=\"dont_show\">ߊ߬ ߞߣߊ߫ ߦߌ߬ߘߊ߬</string>\n    <string name=\"app_update_unavailable_toast\">ߌ ߦߋ߫ ߣߌߎߔߌߔ ߓߐߞߏ߫ ߟߊߓߊ߲ ߠߋ߬ ߟߊߓߊ߯ߙߊ ߟߊ߫</string>\n    <string name=\"app_update_available_notification_text\">ߊ߬ ߕߐߘߐ߲߫ ߞߵߊ߬ ߟߊߖߌ߰ %s</string>\n    <string name=\"missions_header_finished\">ߊ߬ ߓߘߊ߫ ߓߊ߲߫</string>\n    <string name=\"missions_header_pending\">ߘߞߐ߬ߣߐ߲߬ߠߌ߲</string>\n    <string name=\"paused\">ߊ߬ ߟߊߟߐ߬ߣߍ߲߫</string>\n    <string name=\"post_processing\">ߞߐߝߍ߫-ߦߙߍߞߍߟߌ</string>\n    <string name=\"recovering\">ߟߛߊ߬ߦߌ߬ߟߌ</string>\n    <string name=\"enqueue\">ߞߵߊ߬ ߟߊߕߎ߲߰</string>\n    <string name=\"permission_denied\">ߓߊ߲߬ ߓߘߊ߫ ߞߍ߫ ߗߋߥߊߟߌ ߘߐ߫ ߞߊ߲ߞߋ ߓߟߏ߫</string>\n    <string name=\"checking_updates_toast\">ߟߏ߲ߘߐߦߊߟߌ߫ ߕߎ߬ߢߊ߬ߟߐ߲ ߦߴߌߘߐ߫…</string>\n    <string name=\"download_failed\">ߟߊ߬ߖߌ߰ߟߌ ߓߘߊ߫ ߗߌߙߏ߲߫</string>\n    <string name=\"overwrite_finished_warning\">ߞߐߕߐ߯ ߘߏ߫ ߓߘߊ߫ ߟߊߖߌ߰ ߕߐ߯ ߛߎ߯ ߞߋߟߋ߲ ߣߌ߲߬ ߘߌ߫ ߞߘߐ߬ߡߊ߲߫</string>\n    <string name=\"download_already_running\">ߟߊ߬ߖߌ߰ߟߌ ߘߏ߫ ߦߴߌߘߐ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߘߌ߫</string>\n    <string name=\"show_error\">ߞߊ߬ ߝߎ߬ߕߎ߲߬ߕߌ ߦߌ߬ߘߊ߬</string>\n    <string name=\"error_file_creation\">ߞߐߕߐ߮ ߕߍ߫ ߛߋ߫ ߛߌ߲ߘߌ߫ ߟߊ߫</string>\n    <string name=\"error_ssl_exception\">ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߠߊߞߊ߲ߘߊߣߍ߲ ߕߍ߫ ߛߋ߫ ߓߌ߬ߟߊ߬ ߟߊ߫ ߛߋ߲߬ߠߊ߫</string>\n    <string name=\"error_unknown_host\">ߛߐߘߊ ߕߍ߫ ߛߋ߫ ߟߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫</string>\n    <string name=\"error_http_no_content\">ߛߐߘߊ ߕߍ߫ ߟߐ߲ߕߊ߫ ߟߊߣߊ߬ ߟߊ߫</string>\n    <string name=\"error_http_not_found\">ߊ߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬</string>\n    <string name=\"error_postprocessing_failed\">ߞߐߝߍ߫-ߦߙߍߞߍߟߌ ߓߘߊ߫ ߗߌߙߏ߲߫</string>\n    <string name=\"error_postprocessing_stopped\">ߣߌߎߔߌߔ ߘߊߕߎ߲߯ ߘߊ߫ ߟߋ߬ ߞߵߊ߬ ߕߘߍ߬ ߊ߬ ߦߋ߫ ߓߊ߯ߙߊ߫ ߟߊ߫ ߞߐߕߐ߮ ߞߊ߲߬</string>\n    <string name=\"error_insufficient_storage_left\">ߜߍߞߣߍ߫ ߛߌ߫ ߕߍ߫ ߕߙߏߞߏ ߞߊ߲߬</string>\n    <string name=\"error_progress_lost\">ߢߍߕߊ߮ ߓߘߊ߫ ߝߏ߫߸ ߓߊߏ߬ ߞߐߕߐ߮ ߓߘߊ߫ ߖߏ߬ߛߌ߫</string>\n    <string name=\"error_download_resource_gone\">ߟߊ߬ߖߌ߰ߟߌ ߣߌ߲߬ ߕߍ߫ ߛߋ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫</string>\n    <string name=\"delete_downloaded_files\">ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߖߏ߬ߛߌ߫</string>\n    <string name=\"delete_downloaded_files_confirm\">ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߫ ߝߍ߬ߘߍ ߞߊ߲߬ ؟</string>\n    <string name=\"app_language_title\">ߟߥߊߟߌߟߊ߲߫ ߞߊ߲</string>\n    <string name=\"skip_silence_checkbox\">ߞߵߊ߬ ߟߞߊߟߌߦߊ߫ ߡߊ߬ߞߎ߲ ߕߎ߬ߡߊ ߟߎ߬ ߘߐ߫</string>\n    <string name=\"playback_step\">ߛߋ߲߬ߘߊ</string>\n    <string name=\"percent\">ߗߡߍ߬ߘߐ߬ߦߊ</string>\n    <string name=\"streams_notifications_interval_title\">ߕߎ߬ߢߊ߬ߟߐ߲ ߡߊߛߊ߬ߦߌ</string>\n    <string name=\"streams_notifications_network_title\">ߞߙߏ߬ߝߏ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲߫ ߛߎ߯ߦߊ</string>\n    <string name=\"updates_setting_description\">ߞߊ߬ ߟߥߊߟߌߟߊ߲߫ ߟߏ߲ߘߐߦߊߟߌ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߦߌ߬ߘߊ߬ ߣߌ߫ ߓߐߞߏ߫ ߞߎߘߊ߫ ߛߐ߬ߘߐ߲߬ ߘߊ߫</string>\n    <string name=\"minimize_on_exit_background_description\">ߞߵߊ߬ ߡߊߖߌ߰ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߘߐ߫</string>\n    <string name=\"never\">ߤߓߊߘߊ߲߫</string>\n    <string name=\"queued\">ߊ߬ ߓߘߊ߫ ߝߙߊ߬ ߕߎ߲߰ߠߌ߲ ߠߊ߫</string>\n    <string name=\"generate_unique_name\">ߞߊ߬ ߕߐ߯ ߞߎ߲߬ߞߋߟߋ߲߫ ߘߏ߫ ߛߌ߲ߘߌ߫</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"other\">ߟߊ߬ߖߌ߰ߟߌ߬ %s ߓߘߊ߫ ߓߊ߲߫</item>\n    </plurals>\n    <string name=\"overwrite\">ߞߵߊ߬ ߞߊ߲߬ߟߊ߫</string>\n    <string name=\"overwrite_unrelated_warning\">ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߦߋ߫ ߞߐߕߐ߮ ߘߏ߫ ߟߊ߫ ߦߊ߲߬ ߞߘߐ߬ߡߊ߲߫</string>\n    <string name=\"download_already_pending\">ߟߊ߬ߖߌ߰ߟߌ ߘߏ߫ ߦߋ߫ ߘߞߐ߬ߣߐ߲߬ߠߌ߲ ߠߊ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߘߌ߫</string>\n    <string name=\"max_retry_msg\">ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߖߊ߬ߕߋ ߘߊ߲߭</string>\n    <string name=\"max_retry_desc\">ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲߫ ߖߊ߬ߕߋ ߘߊ߲߭ ߖߊ߬ߣߌ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߘߐߛߊ߬ ߕߍ߫</string>\n    <string name=\"pause_downloads_on_mobile\">ߞߵߊ߬ ߓߟߏߕߍ߰ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߠߊ߫ ߜߊ߲ߞߎ߲ߠߌ߲ ߠߎ߬ ߟߊ߫</string>\n    <string name=\"pause_downloads_on_mobile_desc\">ߊ߬ ߕߐ߬ߣߐ ߦߴߊ߬ ߟߊ߫ ߦߟߍ߬ߡߊ߲߬ ߕߎߡߊ ߜߋߟߋ߲ߜߋߟߋ߲ߠߊ߫ ߟߐ߲ߕߊ ߟߎ߫ ߞߊ߲߬߸ ߞߏ߬ߣߌ߲߬ ߟߊ߬ߖߌ߰ߟߌ ߓߍ߯ ߕߍ߫ ߛߐ߲߬ ߠߊ߫ ߟߊ߬ߘߎ߲߬ߠߌ߲ ߡߊ߬</string>\n    <string name=\"close\">ߞߵߊ߬ ߘߊߕߎ߲߯</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"other\">ߟߊ߬ߖߌ߰ߟߌ߬ %1$s ߓߘߊ߫ ߖߏ߬ߛߌ߬</item>\n    </plurals>\n    <string name=\"stop\">ߞߵߊ߬ ߟߊߟߐ߬</string>\n    <string name=\"start_downloads\">ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߘߊߡߌ߬ߣߊ߬</string>\n    <string name=\"pause_downloads\">ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߟߊߘߎ߲߫</string>\n    <string name=\"downloads_storage_ask_title\">ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߥߊ߫ ߦߙߐ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߫</string>\n    <string name=\"downloads_storage_ask_summary\">ߌ ߣߊ߬ߕߐ߫ ߟߋ߬ ߡߊ߬ߢߌ߬ߣߌ߲߬ߞߊ߬ ߟߊ߫ ߟߊ߬ߖߌ߰ߟߌ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ߫ ߟߊߞߎ߲߬ߘߎ߲߬ ߦߙߐ ߡߊ߬.\n\\nߟߊ߬ߘߌߢߍ ߘߌ߫ ߞߊ߲ߞߋ߫ ߞߎ߲ߓߍ߲߫ ߛߎߥߊ߲ߘߌߟߊ߲ (SAF) ߡߊ߬ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߟߊߖߌ߰ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲ ߠߋ߫ ߞߊ߲߬</string>\n    <string name=\"enable_queue_limit\">ߞߊ߬ ߘߊ߲߭ߛߌ߰ ߟߊ߬ߖߌ߰ߟߌ߫ ߕߎ߲߰ߠߌ߲ ߠߊ߫</string>\n    <string name=\"enable_queue_limit_desc\">ߟߊ߬ߖߌ߰ߟߌ߬ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߫ ߣߊ߬ߕߐ߬ ߞߍ߫ ߟߊ߫ ߕߎ߬ߡߊ߬ߣߍ߲߬ ߞߋߟߋ߲ ߠߊ߫</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">ߟߊ߬ߖߌ߰ߟߌ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ߫ ߓߍ߯ ߟߊߞߎ߲߬ߘߎ߬ ߦߙߐ ߘߌߣߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߵߌ ߟߊ߫</string>\n    <string name=\"downloads_storage_use_saf_title\">ߞߊ߲ߞߋ߫ ߞߎ߲ߓߍ߲߫ ߛߎߥߊ߲ߘߌߟߊ߲ (SAF) ߟߊߓߊ߯ߙߊ߫</string>\n    <string name=\"choose_instance_prompt\">ߛߐߘߊ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫</string>\n    <string name=\"remove_duplicates\">ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫</string>\n    <string name=\"remove_duplicates_title\">ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ؟</string>\n    <string name=\"remove_duplicates_message\">ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߬ ߛߙߍߘߍ ߣߌ߲߬ ߘߐ߫ ؟</string>\n    <string name=\"import_youtube_instructions\">ߌ ߟߊ߫ ߦߕߎߓߎ߫ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ߓߌ߫ Google Takeout:\n\\n\n\\n߁. ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߐߡߌ߬ߘߊ߬: %1$s\n\\n߂. ߌ ߜߊ߲߬ߞߎ߲߬ ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߟߊ߫ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫\n\\n߃. ߌ ߦߋ߫ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫ \\\"ߟߐ߲ߕߊ ߟߎ߬ ߓߍ߯ ߦߴߊ߬ ߘߐ߫\\\"߸ ߏ߬ ߞߐ߫ ߦߋ߫ \\\"ߞߊ߬ ߓߍ߯ ߓߊߕߐߡߐ߲ߣߍ߲߫ ߓߐ߫\\\"߸ ߏ߬ ߞߐ߫߸ ߌ ߦߋ߫ \\\"ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬\\\" ߘߐߙߐ߲߫ ߓߊߕߐߡߐ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \\\"ߏ߬ߞߍ߫\\\" ߛߐ߲߬ߞߌ߲߫\n\\n߄. ߌ ߦߋ߫ \\\"ߢߍߕߊ\\\" ߛߐ߲߬ߞߌ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \\\"ߟߊ߬ߓߐߟߌ ߘߏ߫ ߛߌ߲ߘߌ߫\\\" ߛߐ߲߬ߞߌ߲߫\n\\n߅. ߌ ߦߋ߫ \\\"ߞߊ߬ ߟߊߖߌ߰\\\" ߞߎ߬ߘߎ ߛߐ߲߬ߞߌ߲߫ ߊ߬ ߟߊ߲ߞߣߍߡߊߣߍ߲ ߞߐ߫\n\\n߆. ߊ߬ ߛߐ߲߬ߞߌ߲߫ \\\"ߞߊ߬ ߞߐߕߐ߮ ߟߊߛߣߍ߫\\\" ߞߊ߲߬ ߘߎ߰ߟߊ߫ ߦߊ߬߸ ߦߋ߫ .zip ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߛߎߥߊ߲ߘߌ߫\n\\n߇. [ߣߌ߫ ߝߝߝ ߟߊߛߣߍ ߗߌߙߏ߲߫ ߘߊ߲߫] ߦߋ߫ ߝߝߝ ߞߐߕߐ߮ ߓߐ߬ߛߌ߬ ߊ߬ ߘߐ߫ (ߊ߬ ߛߌߦߊߡߊ߲ ߘߐ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߠߋ߬ \\\"YouTube and YouTube Music/subscriptions/subscriptions.csv\\\")߸ߊ߬ ߛߐ߲߬ߞߌ߲߫ \\\"ߞߐߕߐ߮ ߟߊߛߣߍ߲߫\\\" ߞߊ߲߬ ߘߎ߰ߟߊ߫߸ ߞߊ߬ csv ߞߐߕߐ߯ ߓߐ߬ߛߌ߬ߣߍ߲ ߛߎ߲ߥߊ߲ߘߌ߫</string>\n    <string name=\"import_soundcloud_instructions\">ߌ ߟߊ߫ SoundCloud ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߠߊߘߏ߬ ߥߊߟߴߌߟߊ߫ ߜߊ߬ߞߎ߲߬ߕߐ߮ ߞߊ߬ SoundCloud ߢߊߞߙߍ߫ ߘߏ߫ ߟߊߛߣߍ߫:\n\\n\n\\n߁. \\\"ߛߓߍߘߊ߫ ߗߏ߯ߦߊ\\\" ߟߊߢߊ߯ ߌߟߊ߫ ߓߟߐߟߐ߫ ߛߏ߲߯ߓߊߟߊ߲ ߞߣߐ߫ (ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߏ߬ ߕߴߌߟߊ߫ ߕߙߏߞߏ߫ ߕߊ߬ߕߊ ߟߊ߫)\n\\n߂. ߥߊ߫ ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߊ߲߬: %1$s\n\\n߃. ߌ ߜߊ߲߬ߞߎ߲߬ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫\n\\n߄. ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߓߊߓߌߟߊ߫߸ ߌ ߟߊߛߌ߲߫ ߛߊ߲ ߦߋ߫ ߡߍ߲ ߡߊ߬ ߏ߬ ߘߌ߬.</string>\n    <string name=\"playback_speed_control\">ߘߐ߬ߛߊ߬ߙߌ߬ߟߌ߫ ߓߏ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬</string>\n    <string name=\"playback_tempo\">ߞߍߛߋ߲</string>\n    <string name=\"playback_pitch\">ߞߊ߲ߡߊߛߙߋ</string>\n    <string name=\"unhook_checkbox\">ߓߐߢߐ߲߯ߓߟߏ (ߊ߬ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߊ߫ ߘߐ߬ߝߊ߰ߟߌ ߛߊߓߎ߫ ߘߌ߫)</string>\n    <string name=\"minimize_on_exit_summary\">ߞߍߥߟߌ߫ ߞߍߕߊ߸ ߌ ߓߊ߫ ߞߍ߫ ߦߟߍ߬ߡߊ߲߬ ߠߊ߫ ߟߥߊߟߌߟߊ߲߫ ߜߘߍ߫ ߞߣߐ߫ ߞߵߌ ߕߏ߫ ߦߋߡߍ߲ߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߞߊ߲߬ — %s</string>\n    <string name=\"list\">ߛߙߍߘߍ</string>\n    <string name=\"high_quality_larger\">ߓߘߍ߬ߦߊ߫ ߛߊ߲ߘߐߕߊ (ߓߟߋ߬ߓߟߋ߬ߓߊ)</string>\n    <string name=\"app_update_available_notification_title\">ߣߌߎߔߌߔ ߟߏ߲ߘߐߦߊߟߌ ߘߏ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ ߦߋ߫߹</string>\n    <string name=\"overwrite_failed\">ߞߐߕߐ߮ ߕߍ߫ ߛߋ߫ ߞߊ߲߬ߟߊ߫ ߟߊ߫</string>\n    <string name=\"error_path_creation\">ߞߎ߲߬ߕߋߟߋ߲߫ ߞߎ߲ߓߍ߲ ߕߍ߫ ߛߋ߫ ߛߌ߲ߘߌ߫ ߟߊ߫</string>\n    <string name=\"error_http_unsupported_range\">ߛߐߘߊ ߕߍ߫ ߛߐ߲߬ ߠߊ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߥߙߍ ߟߎ߫ ߡߊ߬߸ ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߡߊߛߊ߬ߦߌ߬ @string/msg_threads = 1 ߟߊ߫</string>\n    <string name=\"error_connect_host\">ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߕߍ߫ ߛߋ߬ ߟߊ߫ ߞߍ߫ ߟߊ߫ ߛߐߘߊ ߟߊ߫</string>\n    <string name=\"error_timeout\">ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߛߕߊ ߓߘߊ߫ ߓߊ߲߫</string>\n    <string name=\"clear_download_history\">ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫</string>\n    <string name=\"confirm_prompt\">ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߘߝߐ߬ߦߊ ߝߌߘߊ߲߫ ߥߟߊ߫ ߞߊ߬ ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߬ ؟</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\\"ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ\\\" ߟߋ߬ ߞߍ߫ ߟߊ߫ ߛߊߓߎ߫ ߘߌ߫ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߞߍ߫ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲ ߞߊ߲߬</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">ߞߵߊ߬ ߘߊߡߌ߲߬ߣߊ߬ ߊ߲ߘߙߏߌߘ 10 ߡߊ߬߸ \\\"ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ\\\" ߟߋ߬ ߘߐ߲߬ߙߐ߲߫ ߕߊ߬ ߟߊ߫</string>\n    <string name=\"systems_language\">ߞߊ߲ߞߋ ߟߊ߫ ߖߏߣߡߊ</string>\n    <string name=\"remove_watched_popup_title\">ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ؟</string>\n    <string name=\"remove_watched\">ߞߊ߬ ߖߌ߬ߦߊ߬ߖߟߎ߬ ߦߋߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫</string>\n    <string name=\"remove_watched_popup_warning\">ߦߋߡߍ߲ߕߊ ߟߎ߫ ߖߏ߬ߛߌ߬ߕߐ߫ ߟߋ߬߸ ߡߍ߲ ߠߎ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߢߍ߫ ߥߊߟߴߊ߬ߟߎ߫ ߝߊ߬ߙߊ ߞߐ߫ ߕߏߟߏ߲߫ ߛߙߍߘߍ ߟߊ߫. \\nߌ ߟߊߣߍ߲߫ ߊ߬ ߟߊ߫ ؟ ߊ߬ ߕߍߣߊ߬ ߛߋ߫ ߟߊ߫ ߟߊߛߊ߬ߦߌ߬ ߟߊ߫߹</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">ߐ߬ߤߐ߲߫߸ ߊ߬ߣߌ߫ ߘߏ߫ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߖߌ߬ߦߊ߬ߖߟߎ ߡߍ߲ ߠߎ߬ ߘߐ߫</string>\n    <string name=\"new_seek_duration_toast\">ߞߵߊ߬ ߓߍ߲߬ ExoPlayer ߟߊ߫ ߛߙߊߕߌ߫ ߛߌ߰ߣߍ߲ ߠߎ߫ ߡߊ߬߸ ߓߐߒߣߐ߬ߘߐ ߛߋ߲߬ߕߊ ߓߘߊ߬ ߞߍ߫ ߝߌ߬ߟߊ߲߬ %d ߘߌ߫</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"other\">ߡߌ߬ߛߍ߲߬ %d</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"other\">ߕߎ߬ߡߊ߬ߙߋ߲߬ %d</item>\n    </plurals>\n    <string name=\"feed_subscription_not_loaded_count\">ߖߛߐߓߊߟߌ ߟߎ߬: %d</string>\n    <string name=\"feed_notification_loading\">ߥߏ߬ߦߏ ߖߛߐ…</string>\n    <string name=\"feed_processing_message\">ߥߏ߬ߦߏ ߦߙߍߞߍ…</string>\n    <string name=\"feed_new_items\">ߥߏ߬ߦߏ߫ ߝߋ߲߫ ߞߎߘߊ ߟߎ߬</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߛߎߥߊ߲ߘߌ߫</string>\n    <string name=\"feed_group_dialog_empty_selection\">ߡߊ߬ߝߘߎ߬ߟߌ߬ ߛߌ߫ ߛߎߥߊ߲ߘߌߣߍ߲߫ ߕߍ߫</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"other\">%d ߛߎߥߊ߲ߘߌߣߍ߲߫</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">ߞߙߎ ߕߐ߮ ߘߐߞߏߟߏ߲ ߠߋ߬</string>\n    <string name=\"feed_group_dialog_delete_message\">ߌ ߦߴߊ߬ ߝߍ߬ ߞߊ߬ ߞߙߎ ߣߌ߲߬ ߖߏ߬ߛߌ߫ ؟</string>\n    <string name=\"feed_create_new_group_button_title\">ߞߎߘߊ</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">ߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ߬ ߞߙߎߝߓߊߟߌ ߟߎ߬ ߘߐߙߐ߲߫ ߦߌ߬ߘߊ߬</string>\n    <string name=\"settings_category_feed_title\">ߥߏ߬ߦߏ</string>\n    <string name=\"feed_update_threshold_title\">ߥߏ߬ߦߏ߫ ߟߊߞߎߘߦߊ ߟߎ߬ ߕߍߟߊ</string>\n    <string name=\"feed_update_threshold_summary\">ߕߎ߬ߡߊ ߡߍ߲ ߕߊ߬ߡߌ߲ ߞߐ ߘߐ߫߸ ߥߏ߬ߦߏ ߟߎ߬ ߞߊߞߊ߲߫ ߞߊ߬ ߖߊ߬ߕߋ߬ ߞߘߐ߬ߡߊ߲ ߘߌ߫ — %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">ߞߊ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߟߊߢߊ߯</string>\n    <string name=\"feed_show_hide_streams\">ߞߊ߬ ߥߏ߬ߦߏ ߟߎ߫ ߦߌ߬ߘߊ߬/ߢߡߊߘߏ߲߰</string>\n    <string name=\"content_not_supported\">ߣߌߎߔߌߔ ߕߍ߫ ߞߣߐߘߐ ߣߌ߲߬ ߕߊ߬ ߟߊ߫ ߡߎߣߎ߲߬.\n\\n\n\\nߕߎ߬ߡߊ߬ ߘߐ߫߸ ߊ߬ ߘߌ߫ ߛߴߊ߬ ߕߊ߬ ߟߊ߫ ߓߐߞߏ߫ ߣߊ߬ߕߐ ߟߎ߬ ߘߐ߫.</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">ߥߙߏߝߋ߫ ߞߐߖߌߦߊ߫ ߞߏ߬ߋߞߏ߬ߋ</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬.\n\\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߡߍ߲ ߣߌ߫ ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ ߘߌ߫ ߓߍ߲߬</string>\n    <string name=\"youtube_music_premium_content\">ߦߋߡߍ߲ߕߊ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ YouTube Music Premium ߛߌ߲߬ߝߏ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ.</string>\n    <string name=\"featured\">ߛߊ߲ߞߊߥߟߌ</string>\n    <string name=\"radio\">ߥߎߢߊ߲ߓߍ߲</string>\n    <string name=\"auto_device_theme_title\">ߖߘߍ߬ߢߍ߫ (ߕߙߏߞߏ߫ ߛߊߛߊ)</string>\n    <string name=\"night_theme_summary\">ߌ ߘߌߦߊߣߍ߲߫ ߛߎߘߐ߫ ߛߊߛߊ ߛߎߥߊ߲ߘߌ߫ — %s</string>\n    <string name=\"select_night_theme_toast\">ߌ ߘߌ߫ ߛߴߌ ߘߌߦߊߣߍ߲߫ ߛߎߘߐ߫ ߛߊߛߊ ߛߎߥߊ߲ߘߌ߫ ߟߊ߫ ߘߎ߰ߟߊ߫ ߦߊ߲߬</string>\n    <string name=\"download_has_started\">ߟߊ߬ߖߌ߰ߟߌ ߓߘߊ߫ ߘߊߡߌ߲߬ߣߊ߬</string>\n    <string name=\"description_select_disable\">ߞߊ߬ ߞߟߏߜߍ߫ ߓߊߕߐߡߐ߲ ߠߊߛߊ߬ ߞߊ߲߬ߛߓߍ ߘߐ߫</string>\n    <string name=\"metadata_category\">ߝߊ߬ߓߏ߲</string>\n    <string name=\"metadata_language\">ߞߊ߲</string>\n    <string name=\"metadata_support\">ߞߐߞߘߐߓߌ߲ߓߌ߲</string>\n    <string name=\"metadata_host\">ߖߊ߬ߕߌ߮</string>\n    <string name=\"metadata_privacy_public\">ߝߘߏ߬ߓߊ</string>\n    <string name=\"metadata_privacy_unlisted\">ߊ߬ ߛߙߍߘߍߦߊߣߍ߲߫ ߕߍ߫</string>\n    <string name=\"metadata_privacy_private\">ߘߎ߲߬ߘߎ߬ߡߊ</string>\n    <string name=\"metadata_privacy_internal\">ߞߣߐߕߊ</string>\n    <string name=\"detail_pinned_comment_view_description\">ߞߊ߲߬ߞߎ߬ߡߊ߬ ߜߊߘߊ߲ߣߍ߲</string>\n    <string name=\"detail_heart_img_view_description\">ߡߍ߲ ߕߊ߲߬ߘߏ߬ߣߍ߲߫ ߛߌ߲ߘߌߓߊ߮ ߓߟߏ߫</string>\n    <string name=\"tablet_mode_title\">ߥߟߊ߬ߙߋ߲ ߗߏ߯ߦߊ</string>\n    <string name=\"on\">ߟߊߢߊ߯ߣߍ߲</string>\n    <string name=\"off\">ߟߊߛߊ߬ߣߍ߲</string>\n    <string name=\"notifications_disabled\">ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊߛߊ߬ߣߍ߲߫</string>\n    <string name=\"get_notified\">ߞߊ߬ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߡߊߛߐ߬ߘߐ߲߬</string>\n    <string name=\"enumeration_comma\">߸</string>\n    <string name=\"no_video_streams_available_for_external_players\">ߦߋߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ߬ ߕߍ߫ ߦߋ߲߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫</string>\n    <string name=\"select_quality_external_players\">ߓߘߍ߬ߦߊ ߛߎߥߊ߲ߘߌ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫</string>\n    <string name=\"unknown_quality\">ߓߘߍ߬ߦߊ߬ ߟߐ߲ߓߊߟߌ</string>\n    <string name=\"feed_show_watched\">ߡߎ߰ߡߍ߬ ߡߊߝߍߣߍ߲ߣߍ߲</string>\n    <string name=\"feed_show_partially_watched\">ߝߊ߲߬ߞߋ߬ߟߋ߲߬ ߡߊߝߍߣߍ߲ߣߍ߲</string>\n    <string name=\"feed_show_upcoming\">ߣߊ߬ߕߐ</string>\n    <string name=\"sort\">ߞߵߊ߬ ߘߐߕߐ߬ߡߐ߲߬</string>\n    <string name=\"metadata_tags\">ߞߊ߲ߠߊߛߓߍ ߟߎ߬</string>\n    <string name=\"metadata_licence\">ߟߊ߬ߘߌߢߍ</string>\n    <string name=\"metadata_privacy\">ߜߎ߲߬ߘߎ߬ߞߏ</string>\n    <string name=\"metadata_age_limit\">ߛߌ߬ߞߛߊߓߌ߫ ߘߊ߲߭</string>\n    <string name=\"selected_stream_external_player_not_supported\">ߥߦߏ߬ ߛߎߥߊ߲ߘߌߣߍ߲ ߕߍ߫ ߕߊ߬ ߟߊ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߓߟߏ߫</string>\n    <string name=\"toggle_all\">ߞߵߊ߬ ߓߍ߯ ߟߊߢߊ߯</string>\n    <string name=\"streams_not_yet_supported_removed\">ߥߦߏ߬ ߟߎ߬ ߕߍߣߊ߫ ߦߌ߬ߘߊ߬ ߟߊ߫߸ ߡߍ߲ ߠߎ߬ ߕߊ߬ߣߍ߲߬ ߕߍ߫ ߡߎߣߎ߲</string>\n    <string name=\"no_audio_streams_available_for_external_players\">ߡߍ߲ߕߊ߫ ߥߦߏ߫ ߛߌ߫ ߡߊߛߐ߬ߘߐ߲߬ߕߊ߬ ߕߍ߫ ߦߋ߲߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫</string>\n    <string name=\"unknown_format\">ߢߊ߲ߞߊ߲߫ ߟߐ߲ߓߊߟߌ</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"other\">ߝߌ߬ߟߊ߲߬ %d</item>\n    </plurals>\n    <string name=\"fragment_feed_title\">ߞߎߘߊ ߟߎ߬</string>\n    <string name=\"feed_groups_header_title\">ߥߙߏߝߋ߫ ߘߙߎ ߟߎ߬</string>\n    <string name=\"feed_oldest_subscription_update\">ߟߊ߬ߞߎ߬ߘߦߊ߬ߟߌ ߞߍ߫ ߘߊ߫: %s</string>\n    <plurals name=\"days\">\n        <item quantity=\"other\">ߕߟߋ߬ %d</item>\n    </plurals>\n    <string name=\"feed_load_error\">ߝߎ߬ߕߎ߲߬ߕߌ ߥߏ߬ߦߏ ߖߛߐ߫ ߕߎߡߊ</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' ߥߏ߬ߦߏ ߕߍ߫ ߛߋ߫ ߖߛߐ߫ ߟߊ߫.</string>\n    <string name=\"feed_load_error_terminated\">ߛߌ߲ߘߌߓߊ߮ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߕߍ߰.\n\\nߣߌߎߔߌߔ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߥߏ߬ߦߏ ߣߌ߲߬ ߖߛߐ߫ ߟߊ߫ ߡߎ߬ߕߎ߲߬.\n\\nߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߛߊ߬ ߥߙߏߝߋ ߣߌ߲߬ ߡߊ߬ ؟</string>\n    <string name=\"feed_load_error_fast_unknown\">ߥߦߏ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߕߍ߫ ߟߌ߬ߤߟߊ߬ ߘߌߦߊߡߊ߲߫ ߘߌ߫ ߟߊ߫ ߝߐߡߊ ߣߌ߲߬ ߞߊ߲߬.</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">ߞߵߊ߬ ߟߊߛߐ߬ߘߐ߲߬ ߥߦߏ߬ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߘߏ߫ ߝߍ߬ ߣߴߏ ߘߌ߫ ߓߍ߲߬</string>\n    <string name=\"feed_update_threshold_option_always_update\">ߞߵߊ߬ ߟߊߞߎߘߦߊ߫ ߞߘߊߎ߫</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">ߞߊ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߟߊߟߊ߬</string>\n    <string name=\"feed_hide_streams_title\">ߞߊ߬ ߥߦߏ߬ ߢߍߕߊ ߟߎ߫ ߦߌ߬ߘߊ߬</string>\n    <string name=\"channel_created_by\">ߊ߬ ߛߌ߲ߘߌߣߍ߲߫ %s ߟߋ߬ ߓߟߏ߫</string>\n    <string name=\"playlist_page_summary\">ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߞߐߜߍ</string>\n    <string name=\"video_detail_by\">%s ߓߟߏ߫</string>\n    <string name=\"recent\">ߞߐߟߕߊ</string>\n    <string name=\"show_thumbnail_summary\">ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߟߊߓߊ߯ߙߊ߫ ߣߍ߰ߟߌ߬ ߢߊߝߘߍ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߣߌ߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ ߟߊ߫</string>\n    <string name=\"chapters\">ߛߌ߰ߘߊ ߟߎ߬</string>\n    <string name=\"show_thumbnail_title\">ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߦߌ߬ߘߊ߬</string>\n    <string name=\"no_app_to_open_intent\">ߟߥߊߟߌߟߊ߲߫ ߛߌ߫ ߕߴߌ ߟߊ߫ ߕߙߏߞߏ ߞߊ߲߬ ߡߍ߲ ߘߌ߫ ߛߋ߫ ߣߌ߲߬ ߠߊߞߊ߬ ߟߊ߫</string>\n    <string name=\"no_appropriate_file_manager_message\">ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬.\n\\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߥߟߊ߫ ߦߴߊ߬ ߡߊߝߍߣߍ߲߫ ߞߊ߬ \\'%s\\' ߟߊߛߊ߬ ߟߊ߬ߖߌ߰ߟߌ߲߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫</string>\n    <string name=\"private_content\">ߞߣߐߘߐ ߣߌ߲߬ ߦߋ߫ ߘߎ߲߬ߘߎ߬ߡߊ ߟߋ߬ ߘߌ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ߫.</string>\n    <string name=\"account_terminated\">ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߓߍ߰</string>\n    <string name=\"description_select_enable\">ߞߊ߬ ߞߟߏߜߍ߫ ߓߊߕߐߡߐ߲ ߠߊߢߊ߯ ߞߊ߲߬ߛߓߍ ߘߐ߫</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer ߡߐ߬ߟߐ߲߬ ߖߏߣߡߊ</string>\n    <string name=\"you_successfully_subscribed\">ߝߙߏߝߋ ߣߌ߲߬ ߡߊߝߘߎߣߌ߲߫ ߌ ߓߟߏ߫ ߡߎ߬ߕߎ߲߬</string>\n    <string name=\"open_website_license\">ߞߊ߬ ߞߍߦߙߐ ߘߊߦߟߍ߬</string>\n    <string name=\"soundcloud_go_plus_content\">ߣߌ߲߬ ߦߋ߫ SoundCloud Go+ ߜߋ߬ߙߋ ߘߏ߫ ߟߋ߬ ߘߌ߫߸ ߡߍ߲ ߕߴߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ߫.</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">ߊ߬ ߦߋ߫ ߗߋߢߊ ߘߏ߫ ߟߎ߫ ߘߐ߫߸ ߊ߬ߟߋ߬ ߞߊߟߌߡߊ߲ߓߊ ߟߋ߬ ߝߊߣߊ߲߫ ߦߋ߫߸ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߌ߫ ߛߋ߫ ߝߌ߬ߛߌ߫ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߠߥߊ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߟߌ߬ߤߟߊ߬ ߘߝߊߓߊߟߌ ߟߎ߬ (ߟߊߒߡߊ߫ ߘߐ߫߸ ߥߎ߬ߛߎ߸ ߝߌ߬ߛߌ ߛߎ߯ߦߊ ߥߟߊ߫ ߝߊ߲ߞߢߊ߫ ߟߌ߬ߤߟߊ)</string>\n    <string name=\"paid_content\">ߞߣߐߘߐ ߣߌ߲߬ ߦߋ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߕߣߐ߬ߓߐ߬ߟߊ߫ ߛߙߊ߬ߓߐ߬ߟߊ ߟߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">ߊ߬ ߦߴߌ ߢߣߊ߫ ߟߋ߬ ߞߏ߫ ߥߏ߬ߦߏ ߟߎ߬ ߖߛߐ ߟߊߛߎߡߊߡߊ߲߫ ߠߋ߬ ߞߏߖߎ߯ߦߊ߫؟ ߣߴߏ߬ ߟߋ߸ ߖߛߐߟߌ߫ ߞߊߟߌ߲ ߡߊߝߍߣߍ߲߫ (ߌ ߘߌ߫ ߛߴߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߥߟߊ߫ ߘߎ߰ߟߊ߬ߘߐ߬ ߞߘߎ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫).\n\\n\n\\nߣߌߎߔߌߔ ߘߌ߫ ߛߋ߫ ߥߏ߬ߦߏ ߟߎ߬ ߟߊߞߎߘߦߊ߫ ߟߊ߫ ߢߊ߫ ߝߌ߬ߟߊ߫ ߟߋ߫ ߡߊ߬:\n\\n• ߞߊ߬ ߝߙߏߝߋ߫ ߡߊߝߘߎߣߍ߲ ߠߎ߬ ߡߎ߰ߡߍ ߡߊߛߐ߲߬ߘߐ߲߬߸ ߏ߬ ߛߎߡߊߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫.\n\\n• ߞߊ߬ ߗߋߢߊ߫ ߓߟߏߡߞߊ߬ߣߍ߲ ߘߏ߫ ߟߊߓߊ߯ߙߊ߫߸ ߏ߬ ߟߞߊߟߌߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫ ߕߍ߫.\n\\n\n\\nߞߍߢߊ߫ ߝߌ߬ߟߊ ߏ߬ ߘߊ߲߬ߝߘߊ߬ߓߐ ߦߋ߫ ߟߋ߬߸ ߡߍ߲ ߞߊߟߌߡߊ߲߫ ߏ߬ ߕߍ߫ ߟߌ߬ߤߟߊ߫ ߓߍ߯ ߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߦߏ߫ ߝߌ߬ߛߌ ߥߎ߬ߛߎ ߣߴߊ߬ ߛߎ߯ߦߊ (ߢߟߊ߫ ߦߋߟߌ ߘߐ߫ ߘߊ߲߬ߝߘߊ߬ߓߐ߬ ߕߴߊ߬ ߝߊ߲ߞߢߊ߫ ߦߋߡߍ߲ߕߊ ߟߎ߬ ߣߌ߫ ߘߏ߫ ߜߘߍ߫ ߟߎ߫ ߕߍ߫)߸ ߊ߬ ߘߏ߲߬ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߴߊ߬ ߡߊ߫ ߥߙߏߝߋ߫ ߝߌ߬ߛߌ ߟߎ߬ ߓߍ߯ ߡߊߛߐ߬ߘߐ߲߬.\n\\n\n\\nߟߊߒߡߊ߫ ߘߐ߫߸ ߦߕߎߓߎ ߦߋ߫ ߟߊ߬ߞߎ߬ߘߦߊ߬ߟߌ߬ ߞߊߟߌ߲ (RSS ߥߏ߬ߦߏ) ߕߊ߬ ߟߊ߫.\n\\n\n\\nߏ߬ ߘߐ߫߸ ߌߟߋ ߟߵߊ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߠߊ߫: ߣߴߌ ߦߋ߫ ߞߊߟߌߦߊ ߟߋ߫ ߝߍ߬ ߥߟߊ߫ ߟߌ߬ߤߟߊ߬ ߖߐ߲ߖߐ߲.</string>\n    <string name=\"georestricted_content\">ߞߣߐߘߐ ߣߌ߲߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫.</string>\n    <string name=\"night_theme_available\">ߢߣߊߕߊ ߣߌ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߫ ߠߋ߬ ߘߐߙߐ߲߫ ߣߌ߫ %s ߛߎߥߊ߲ߘߌߣߍ߲߫ ߛߊߛߊ ߢߍ߫</string>\n    <string name=\"description_select_note\">ߌ ߘߌ߫ ߛߋ߫ ߞߟߏߜߍ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ ߡߎ߬ߕߎ߲߬. ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߞߐߜߍ߫ ߘߌ߫ ߛߋ߫ ߡߣߍߡߣߍ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߝߊߣߊ߲߫ ߘߌ߫ ߛߋ߫ ߟߊߝߏߦߊ߫ ߟߴߊ߬ ߘߐ߫.</string>\n    <string name=\"prefer_descriptive_audio_summary\">ߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ߬ߡߊ ߘߏ߫ ߛߎߥߊ߲ߘߌ߫ ߢߟߊߝߌ߲ߓߊ߯ߕߐ ߟߎ߬ ߢߌ߫߸ ߣߴߏ߬ ߘߐ߫ ߞߍ߫ ߘߊ߫ ߦߋ߲߬</string>\n    <string name=\"play_queue_audio_track\">ߡߍ߲ߘߊ: %s</string>\n    <string name=\"audio_track\">ߡߍ߲ߕߊ߫ ߜߙߋ</string>\n    <string name=\"audio_track_present_in_video\">ߡߍ߲ߕߊ߫ ߜߙߋ ߘߏ߫ ߞߊߞߊ߲߫ ߞߊ߬ ߞߍ߫ ߥߏ߬ߦߏ ߣߌ߲߬ ߞߣߐ߫ ߞߘߐ߬ߡߊ߲߫</string>\n    <string name=\"select_audio_track_external_players\">ߡߍ߲ߕߊ߫ ߜߙߋ ߛߎߥߊ߲ߘߌ߫ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߠߎ߬ ߢߍ߫</string>\n    <string name=\"settings_category_exoplayer_title\">Exoplayer ߢߊߓߐߟߌ ߟߎ߬</string>\n    <string name=\"prefer_original_audio_summary\">ߡߍ߲ߕߊ߫ ߜߙߋ ߛߎ߲ߞߎ߲ߡߊ ߛߎ߲ߥߊ߲ߘߌ߫߸ ߊ߬ ߞߍߘߊ߫ ߞߊ߲ ߛߎ߯-ߛߎ߯ ߘߌ߫</string>\n    <string name=\"prefer_descriptive_audio_title\">ߡߍ߲ߕߊ߫ ߞߊ߲߬ߛߓߍ߬ߡߊ ߟߊߝߌ߬ߛߊ߬ߦߊ߫</string>\n    <string name=\"unknown_audio_track\">ߡߊߟߐ߲ߓߊߟߌ</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-oc/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Publicat lo %1$s</string>\n    <string name=\"no_player_found\">Cap de legidor de flus trobat. Volètz installar VLC\\?</string>\n    <string name=\"no_player_found_toast\">Cap de legidor de flus trobat (podètz installar VLC per lo legir).</string>\n    <string name=\"install\">Installar</string>\n    <string name=\"cancel\">Anullar</string>\n    <string name=\"open_in_browser\">Dobrir dins lo navegador</string>\n    <string name=\"open_in_popup_mode\">Dobrir en mòde fenestron</string>\n    <string name=\"share\">Partejar</string>\n    <string name=\"download\">Telecargar</string>\n    <string name=\"controls_download_desc\">Telecargar lo fichièr de flus</string>\n    <string name=\"search\">Recercar</string>\n    <string name=\"settings\">Paramètres</string>\n    <string name=\"did_you_mean\">Voliatz dire: %1$s\\?</string>\n    <string name=\"share_dialog_title\">Partejar amb</string>\n    <string name=\"use_external_video_player_title\">Utilizar un legidor de vidèo extèrne</string>\n    <string name=\"subscribe_button_title\">S\\'abonar</string>\n    <string name=\"subscribed_button_title\">Abonat</string>\n    <string name=\"unsubscribe\">Anullar abonament</string>\n    <string name=\"subscription_change_failed\">Impossible de cambiar l\\'abonament</string>\n    <string name=\"subscription_update_failed\">Impossible d\\'actualizar l\\'abonament</string>\n    <string name=\"show_info\">Afichar las informacions</string>\n    <string name=\"tab_subscriptions\">Abonaments</string>\n    <string name=\"main_bg_subtitle\">Clicatz sul boton de recèrca per començar</string>\n    <string name=\"use_external_video_player_summary\">Lèva l\\'àudio per CÈRTAS resolucions</string>\n    <string name=\"use_external_audio_player_title\">Utilizar lo legidor àudio extèrne</string>\n    <string name=\"channel_unsubscribed\">Abonament a la cadena anullat</string>\n    <string name=\"tab_bookmarks\">Listas de lectura enregistradas</string>\n    <string name=\"tab_choose\">Causir un onglet</string>\n    <string name=\"fragment_feed_title\">Çò novèl</string>\n    <string name=\"controls_background_title\">Rèireplan</string>\n    <string name=\"controls_popup_title\">Fenestron</string>\n    <string name=\"controls_add_to_playlist_title\">Apondre a</string>\n    <string name=\"download_path_title\">Dorsièr de telecargament de vidèos</string>\n    <string name=\"download_path_summary\">Los fichièrs vidèo telecargats son aquí</string>\n    <string name=\"download_path_dialog_title\">Causissètz lo dorsièr de telecargament de las vidèos</string>\n    <string name=\"download_path_audio_title\">Dorsièr de telecargament dels àudios</string>\n    <string name=\"download_path_audio_summary\">Los fichièrs àudio telecargats son estremats aicí</string>\n    <string name=\"download_path_audio_dialog_title\">Causissètz lo dorsièr de telecargament pels àudios</string>\n    <string name=\"default_resolution_title\">Resolucion per defaut</string>\n    <string name=\"default_popup_resolution_title\">Resolucion per defaut dels fenestrons</string>\n    <string name=\"show_higher_resolutions_title\">Afichar de resolucions mai nautas</string>\n    <string name=\"show_higher_resolutions_summary\">Totes los dispositius pòdon pas legir de vidèos 2K/4K</string>\n    <string name=\"play_with_kodi_title\">Jogar amb Kodi</string>\n    <string name=\"kore_not_found\">Trobam pas l\\'aplicacion Kore. La volètz installar\\?</string>\n    <string name=\"show_play_with_kodi_title\">Afichar l\\'opcion \\\"Legir amb Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Afichar una opcion per legir una vidèo dempuèi Kodi</string>\n    <string name=\"play_audio\">Àudio</string>\n    <string name=\"default_audio_format_title\">Format àudio per defaut</string>\n    <string name=\"default_video_format_title\">Format vidèo per defaut</string>\n    <string name=\"theme_title\">Tèma</string>\n    <string name=\"light_theme_title\">Clar</string>\n    <string name=\"dark_theme_title\">Escur</string>\n    <string name=\"black_theme_title\">Negre</string>\n    <string name=\"popup_remember_size_pos_title\">Se remembrar la talha e la posicion del fenestron</string>\n    <string name=\"popup_remember_size_pos_summary\">Se remembrar las darrièras talha e posicion del fenestron</string>\n    <string name=\"use_inexact_seek_title\">Utilzar la recèrca rapida inexacta</string>\n    <string name=\"use_inexact_seek_summary\">La recèrca inexacta permet a l\\'utilizaire de recercar mai rapidament una posicion amb mens de precision</string>\n    <string name=\"seek_duration_title\">Durada d\\'avançada/reculada rapida</string>\n    <string name=\"show_comments_title\">Afichar los comentaris</string>\n    <string name=\"show_comments_summary\">Desactivar per afichar pas mai los comentaris</string>\n    <string name=\"auto_queue_title\">Apondre la vidèo seguenta dins la coa de lectura</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-or/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">ଆରମ୍ଭ କରିବା ପାଇଁ \\\"ସର୍ଚ୍ଚ\\\" ବଟନ କୁ ଦବାନ୍ତୁ ।</string>\n    <string name=\"systems_language\">ସିଷ୍ଟମ୍ ଡିଫଲ୍ଟ</string>\n    <string name=\"rename_playlist\">ନାମ ବଦଳାନ୍ତୁ</string>\n    <string name=\"off\">ବନ୍ଦ</string>\n    <string name=\"metadata_language\">ଭାଷା</string>\n    <string name=\"metadata_support\">ସମର୍ଥନ</string>\n    <string name=\"night_theme_title\">ରାତ୍ରି ଥିମ୍</string>\n    <string name=\"light_theme_title\">ହାଲୁକା</string>\n    <string name=\"black_theme_title\">କଳା</string>\n    <string name=\"title_activity_history\">ଇତିବୃତ୍ତି</string>\n    <string name=\"action_history\">ଇତିବୃତ୍ତି</string>\n    <string name=\"theme_title\">ଥିମ୍</string>\n    <string name=\"dark_theme_title\">ଗାଢ଼</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d ମିନିଟ୍</item>\n        <item quantity=\"other\">ମୋଟ %d ମିନିଟ୍</item>\n    </plurals>\n    <string name=\"app_language_title\">ଆପ୍ ଭାଷା</string>\n    <string name=\"auto_device_theme_title\">ସ୍ୱଚାଳିତ (ଡିଵାଇସ୍ ଥିମ୍)</string>\n    <string name=\"metadata_privacy\">ଗୋପନୀୟତା</string>\n    <string name=\"name\">ନାମ</string>\n    <string name=\"play_queue_stream_detail\">ବିବରଣୀ</string>\n    <string name=\"on\">ଚାଲୁ</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d ଘଣ୍ଟା</item>\n        <item quantity=\"other\">ମୋଟ %d ଘଣ୍ଟା</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d ସେକେଣ୍ଡ</item>\n        <item quantity=\"other\">ମୋଟ %d ସେକେଣ୍ଡ</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d ଦିନ</item>\n        <item quantity=\"other\">ମୋଟ %d ଦିନ</item>\n    </plurals>\n    <string name=\"feed_create_new_group_button_title\">ନୂଆ</string>\n    <string name=\"upload_date_text\">%1$s ରେ ପ୍ରକାଶିତ</string>\n    <string name=\"no_player_found\">କୌଣସି ଷ୍ଟ୍ରିମ୍ ପ୍ଲେୟାର୍ ମିଳିଲା ନାହିଁ । VLC ସଂସ୍ଥାପନ କରନ୍ତୁ \\?</string>\n    <string name=\"no_player_found_toast\">କୌଣସି ଷ୍ଟ୍ରୀମ ପ୍ଲେୟାର ନାହିଁ ।</string>\n    <string name=\"install\">ସଂସ୍ଥାପନ କରନ୍ତୁ</string>\n    <string name=\"open_in_popup_mode\">ପପ୍ଅପ୍ ମୋଡ୍ ରେ ଖୋଲନ୍ତୁ</string>\n    <string name=\"open_with\">ଏଥିରେ ଖୋଲନ୍ତୁ</string>\n    <string name=\"cancel\">ବାତିଲ୍ କରନ୍ତୁ</string>\n    <string name=\"mark_as_watched\">ଦେଖାଯାଇଥିବା ପରି ଚିହ୍ନିତ କର</string>\n    <string name=\"download\">ଡାଉନଲୋଡ୍ କରନ୍ତୁ</string>\n    <string name=\"settings\">ସେଟିଂ</string>\n    <string name=\"did_you_mean\">ତୁମେ ଏହା ଚାଂହ କି \\\"%1$s\\\"\\?</string>\n    <string name=\"controls_download_desc\">ଫାଇଲ୍ ଡାଉନଲୋଡ କରନ୍ତୁ</string>\n    <string name=\"share\">ପଠାନ୍ତୁ</string>\n    <string name=\"search\">ସନ୍ଧାନ</string>\n    <string name=\"ok\">ଠିକ୍ ଅଛି</string>\n    <string name=\"open_in_browser\">ବ୍ରାଉଜରରେ ଖୋଲନ୍ତୁ</string>\n    <string name=\"tab_bookmarks\">ବୁକମାର୍କ ହୋଇଥିବା ପ୍ଲେଲିଷ୍ଟଗୁଡିକ</string>\n    <string name=\"controls_background_title\">ପୃଷ୍ଠଭୂମି</string>\n    <string name=\"controls_popup_title\">ପପ୍ଅପ୍</string>\n    <string name=\"download_path_title\">ଭିଡିଓ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍</string>\n    <string name=\"download_path_summary\">ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଭିଡିଓ ଫାଇଲଗୁଡ଼ିକ ଏଠାରେ ଗଚ୍ଛିତ ଅଛି</string>\n    <string name=\"download_path_audio_dialog_title\">ଅଡିଓ ଫାଇଲ୍ ପାଇଁ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ବାଛନ୍ତୁ</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">ୟୁଟ୍ୟୁବ୍ ଏକ \\\"ପ୍ରତିବନ୍ଧିତ ମୋଡ୍\\\" ପ୍ରଦାନ କରେ ଯାହା ସମ୍ଭାବ୍ୟ ପରିପକ୍ୱ ବିଷୟବସ୍ତୁକୁ ଲୁଚାଇଥାଏ</string>\n    <string name=\"watch_history_deleted\">ଇତିହାସ ବିଲୋପ ଦେଖନ୍ତୁ</string>\n    <string name=\"watch_history_states_deleted\">ପ୍ଲେକ୍ ପୋଜିସନ୍ ଡିଲିଟ୍ ହୋଇଛି</string>\n    <string name=\"search_history_deleted\">ସନ୍ଧାନ ଇତିହାସ ବିଲୋପ ହେଲା</string>\n    <string name=\"set_as_playlist_thumbnail\">ପ୍ଲେଲିଷ୍ଟ ଥମ୍ବନେଲ ଭାବରେ ସେଟ୍ କରନ୍ତୁ</string>\n    <string name=\"overwrite_failed\">ଫାଇଲ୍ କୁ ନବଲିଖନ କରିପାରିବ ନାହିଁ</string>\n    <string name=\"error_file_creation\">ଫାଇଲ୍ ସୃଷ୍ଟି ହୋଇପାରିବ ନାହିଁ</string>\n    <string name=\"error_connect_host\">ସର୍ଭର ସହିତ ସଂଯୋଗ ହୋଇପାରିବ ନାହିଁ</string>\n    <string name=\"error_path_creation\">ଗନ୍ତବ୍ୟସ୍ଥଳ ଫୋଲ୍ଡର ସୃଷ୍ଟି ହୋଇପାରିବ ନାହିଁ</string>\n    <string name=\"peertube_instance_url_help\">%s ରେ ଆପଣ ପସନ୍ଦ କରୁଥିବା ଉଦାହରଣଗୁଡିକ ଖୋଜ</string>\n    <string name=\"peertube_instance_add_title\">ଉଦାହରଣ ଯୋଡନ୍ତୁ</string>\n    <string name=\"peertube_instance_add_fail\">ଉଦାହରଣ ବୈଧ କରିପାରିଲା ନାହିଁ</string>\n    <string name=\"show_description_summary\">ଭିଡିଓ ବର୍ଣ୍ଣନା ଏବଂ ଅତିରିକ୍ତ ସୂଚନା ଲୁଚାଇବାକୁ ବନ୍ଦ କରନ୍ତୁ</string>\n    <string name=\"play_audio\">ଅଡିଓ</string>\n    <string name=\"use_external_audio_player_title\">ବହିଃ-ଅଡ଼ିଓଚାଳକ ଵ୍ୟଵହାର କରିବା</string>\n    <string name=\"subscribe_button_title\">ସଦସ୍ୟତା ଯୋଡ଼ନ୍ତୁ</string>\n    <string name=\"subscription_update_failed\">ସଦସ୍ୟତା ଅଦ୍ୟତନ କରିପାରିଲା ନାହିଁ</string>\n    <string name=\"tab_choose\">ଟ୍ୟାବ୍ ବାଛନ୍ତୁ</string>\n    <string name=\"download_path_audio_title\">ଅଡିଓ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍</string>\n    <string name=\"download_path_audio_summary\">ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଅଡିଓ ଫାଇଲଗୁଡ଼ିକ ଏଠାରେ ଗଚ୍ଛିତ ଅଛି</string>\n    <string name=\"download_path_dialog_title\">ଭିଡିଓ ଫାଇଲ୍ ପାଇଁ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ବାଛନ୍ତୁ</string>\n    <string name=\"default_resolution_title\">ଡିଫଲ୍ଟ ରେଜୋଲୁସନ</string>\n    <string name=\"play_with_kodi_title\">କୋଡି ସହିତ ଖୋଲନ୍ତୁ</string>\n    <string name=\"notification_action_1_title\">ଦ୍ୱିତୀୟ କୃତ୍ୟ ବଟନ୍</string>\n    <string name=\"notification_action_repeat\">ପୁନର୍ବାର କରନ୍ତୁ</string>\n    <string name=\"notification_colorize_title\">ବିଜ୍ଞପ୍ତିକୁ ରଙ୍ଗ କରନ୍ତୁ</string>\n    <string name=\"popup_remember_size_pos_summary\">ପପ୍ଅପ୍ ର ଶେଷ ଆକାର ଏବଂ ସ୍ଥିତି ମନେରଖ</string>\n    <string name=\"use_inexact_seek_title\">ଦ୍ରୁତ ନିଷ୍କ୍ରିୟ ସନ୍ଧାନ ବ୍ୟବହାର କରନ୍ତୁ</string>\n    <string name=\"show_comments_summary\">ମନ୍ତବ୍ୟ ଲୁଚାଇବାକୁ ବନ୍ଦ କରନ୍ତୁ</string>\n    <string name=\"enable_search_history_title\">ଇତିହାସ ଖୋଜ</string>\n    <string name=\"enable_search_history_summary\">ସ୍ଥାନୀୟ ଭାବରେ ସନ୍ଧାନ ଜିଜ୍ଞାସା ଗଚ୍ଛିତ କରନ୍ତୁ</string>\n    <string name=\"show_hold_to_append_title\">\\\"ଧାଡ଼ିରେ ମିଶାଇବାକୁ ଧରି ରଖନ୍ତୁ\\\" ଟିପ୍ ଦେଖାନ୍ତୁ</string>\n    <string name=\"unsupported_url\">ଅସମର୍ଥିତ URL</string>\n    <string name=\"seek_duration_title\">ଦ୍ରୁତ-ଅଗ୍ରଗାମୀ / ପାଶ୍ଚାତ ଗାମୀ ସମୟ ଖୋଜ</string>\n    <string name=\"show_comments_title\">ମନ୍ତବ୍ୟଗୁଡିକ ଦେଖାନ୍ତୁ</string>\n    <string name=\"download_dialog_title\">ଡାଉନଲୋଡ୍ କରନ୍ତୁ</string>\n    <string name=\"share_dialog_title\">ସହିତ ଅଂଶୀଦାର କରନ୍ତୁ</string>\n    <string name=\"auto_queue_title\">ପରବର୍ତ୍ତୀ ଷ୍ଟ୍ରିମ୍କୁ ଅଟୋ-ଏନକ୍ୟୁ କରନ୍ତୁ</string>\n    <string name=\"auto_queue_toggle\">ଅଟୋ-ଏନକ୍ୟୁଇଙ୍ଗ୍</string>\n    <string name=\"clear_queue_confirmation_title\">ଏକ ଧାଡି ସଫା କରିବା ପୂର୍ବରୁ ନିଶ୍ଚିତକରଣ ମାଗନ୍ତୁ</string>\n    <string name=\"clear_queue_confirmation_summary\">ଗୋଟିଏ ଖେଳାଳୀରୁ ଅନ୍ୟ ଖେଳାଳୀକୁ ପରିବର୍ତ୍ତନ କରିବା ଆପଣଙ୍କ ଧାଡି ବଦଳାଇପାରେ</string>\n    <string name=\"clear_queue_confirmation_description\">ସକ୍ରିୟ ପ୍ଲେୟାର କ୍ୟୁ ବଦଳାଯିବ</string>\n    <string name=\"show_next_and_similar_title\">\\'ପରବର୍ତ୍ତୀ\\' ଏବଂ \\'ସମାନ\\' ଭିଡିଓଗୁଡିକ ଦେଖାନ୍ତୁ</string>\n    <string name=\"show_description_title\">ବର୍ଣ୍ଣନା ଦେଖାନ୍ତୁ</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">ପ୍ରତିଛବି କ୍ୟାଚ୍ ପୋଛି ଦିଆଗଲା</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">ମେଟାଡାଟା କ୍ୟାଚ୍ ପୋଛି ହୋଇଗଲା</string>\n    <string name=\"show_search_suggestions_title\">ପରାମର୍ଶ ଖୋଜ</string>\n    <string name=\"local_search_suggestions\">ସ୍ଥାନୀୟ ସନ୍ଧାନ ପରାମର୍ଶ</string>\n    <string name=\"remote_search_suggestions\">ସୁଦୂର ସନ୍ଧାନ ପରାମର୍ଶ</string>\n    <string name=\"enable_watch_history_title\">ଦେଖାଯାଇଥିବା ଭିଡିଓ ଗୁଡ଼ିକର ଇତିହାସ</string>\n    <string name=\"enable_playback_resume_title\">ପୁନଃ ଚଲାନ୍ତୁ</string>\n    <string name=\"enable_playback_state_lists_title\">ତାଲିକାରେ ଅବସ୍ଥାନ</string>\n    <string name=\"settings_category_clear_data_title\">ତଥ୍ୟ ସଫା କରନ୍ତୁ</string>\n    <string name=\"enable_watch_history_summary\">ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକର ଟ୍ରାକ୍ ରଖନ୍ତୁ</string>\n    <string name=\"resume_on_audio_focus_gain_title\">ଖେଳିବା ଆରମ୍ଭ କରନ୍ତୁ</string>\n    <string name=\"start_main_player_fullscreen_title\">ଫୁଲ ସ୍କ୍ରିନରେ ମୁଖ୍ୟ ପ୍ଲେୟାର ଆରମ୍ଭ କରନ୍ତୁ</string>\n    <string name=\"autoplay_title\">ସ୍ୱତଃଚାଳନ</string>\n    <string name=\"unsupported_url_dialog_message\">URL ଚିହ୍ନି ପାରିଲା ନାହିଁ । ଅନ୍ୟ ଏକ ଆପ୍ ସହିତ ଖୋଲନ୍ତୁ\\?</string>\n    <string name=\"default_content_country_title\">ଡିଫଲ୍ଟ ବିଷୟବସ୍ତୁ ଦେଶ</string>\n    <string name=\"content_language_title\">ଡିଫଲ୍ଟ ବିଷୟବସ୍ତୁ ଭାଷା</string>\n    <string name=\"peertube_instance_url_title\">PeerTube ଉଦାହରଣ</string>\n    <string name=\"peertube_instance_add_help\">ଉଦାହରଣ URL ପ୍ରବେଶ କରନ୍ତୁ</string>\n    <string name=\"peertube_instance_add_https_only\">କେବଳ HTTPS URL ଗୁଡିକ ସମର୍ଥିତ</string>\n    <string name=\"peertube_instance_add_exists\">ଇନଷ୍ଟାଣ୍ଟ ପୂର୍ବରୁ ବିଦ୍ୟମାନ ଅଛି</string>\n    <string name=\"settings_category_player_title\">ପ୍ଲେୟାର</string>\n    <string name=\"settings_category_history_title\">ଇତିହାସ ଏବଂ କ୍ୟାଚ୍</string>\n    <string name=\"settings_category_appearance_title\">ରୂପ</string>\n    <string name=\"settings_category_debug_title\">ତ୍ରୁଟି ନିବାରଣ କରନ୍ତୁ</string>\n    <string name=\"settings_category_updates_title\">ଅଦ୍ୟତନଗୁଡିକ</string>\n    <string name=\"progressive_load_interval_title\">ପ୍ଲେବେକ୍ ଲୋଡ୍ ବ୍ୟବଧାନ ଆକାର</string>\n    <string name=\"file_name_empty_error\">ଫାଇଲନାମ ଖାଲି ହୋଇପାରିବ ନାହିଁ</string>\n    <string name=\"show_play_with_kodi_summary\">କୋଡି ମିଡିଆ ସେଣ୍ଟର ମାଧ୍ୟମରେ ଏକ ଭିଡିଓ ଚଲାଇବା ପାଇଁ ଏକ ବିକଳ୍ପ ପ୍ରଦର୍ଶନ କରନ୍ତୁ</string>\n    <string name=\"notification_scale_to_square_image_summary\">16: 9 ରୁ 1: 1 ଆସପେକ୍ଟ ଅନୁପାତରେ ବିଜ୍ଞପ୍ତିରେ ଦେଖାଯାଇଥିବା ଭିଡିଓ ଥମ୍ବନେଲକୁ କ୍ରପ୍ କରନ୍ତୁ</string>\n    <string name=\"auto_queue_summary\">ଏକ ସଂପୃକ୍ତ ଷ୍ଟ୍ରିମ୍ ଯୋଡି ପ୍ଲେବ୍ୟାକ୍ କ୍ୟୁ ଶେଷ କରିବା (ପୁନରାବୃତ୍ତି ନକରିବା) ଜାରି ରଖ</string>\n    <string name=\"notification_actions_at_most_three\">କମ୍ପାକ୍ଟ ନୋଟିଫିକେସନ୍ ରେ ଦେଖାଇବାକୁ ଆପଣ ପ୍ରାୟ ତିନୋଟି କ୍ରିୟା ଚୟନ କରିପାରିବେ!</string>\n    <string name=\"notification_colorize_summary\">ଥମ୍ବନେଲରେ ଥିବା ମୁଖ୍ୟ ରଙ୍ଗ ଅନୁଯାୟୀ ଆଣ୍ଡ୍ରଏଡ୍ ବିଜ୍ଞପ୍ତିର ରଙ୍ଗ କଷ୍ଟୋମାଇଜ୍ କରନ୍ତୁ (ଧ୍ୟାନ ଦିଅନ୍ତୁ ଯେ ଏହା ସମସ୍ତ ଡିଭାଇସରେ ଉପଲବ୍ଧ ନୁହେଁ)</string>\n    <string name=\"metadata_cache_wipe_title\">କ୍ୟାଚ୍ ହୋଇଥିବା ମେଟାଡାଟା ପୋଛି ଦିଅ</string>\n    <string name=\"show_meta_info_title\">ମେଟା ସୂଚନା ଦେଖାନ୍ତୁ</string>\n    <string name=\"enable_playback_resume_summary\">ଶେଷ ପ୍ଲେବେକ୍ ସ୍ଥିତିକୁ ପୁନଃ ସ୍ଥାପନ କରନ୍ତୁ</string>\n    <string name=\"enable_playback_state_lists_summary\">ତାଲିକାରେ ପ୍ଲେବେକ୍ ପୋଜିସନ୍ ସୂଚକ ଦେଖାନ୍ତୁ</string>\n    <string name=\"metadata_cache_wipe_summary\">ସମସ୍ତ କ୍ୟାଚ୍ ହୋଇଥିବା ୱେବପୃଷ୍ଠା ତଥ୍ୟ ଅପସାରଣ କରନ୍ତୁ</string>\n    <string name=\"show_search_suggestions_summary\">ସନ୍ଧାନ କରିବା ସମୟରେ ଦେଖାଇବାକୁ ପରାମର୍ଶଗୁଡିକ ବାଛନ୍ତୁ</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">ବାଧା ପରେ ଖେଳିବା ଜାରି ରଖନ୍ତୁ (ଯଥା ଫୋନକଲ୍)</string>\n    <string name=\"show_hold_to_append_summary\">ଭିଡିଓ \\\"ବିବରଣୀ:\\\" ରେ ପୃଷ୍ଠଭୂମି କିମ୍ବା ପପ୍ଅପ୍ ବଟନ୍ ଦବାଇବା ସମୟରେ ଟିପ୍ ଦେଖାନ୍ତୁ</string>\n    <string name=\"peertube_instance_url_summary\">ଆପଣଙ୍କର ପ୍ରିୟ PeerTube ଉଦାହରଣଗୁଡିକ ବାଛନ୍ତୁ</string>\n    <string name=\"settings_category_player_behavior_title\">ବ୍ୟବହାର</string>\n    <string name=\"settings_category_video_audio_title\">ଵିଡ଼ିଓ ଓ ଅଡ଼ିଓ</string>\n    <string name=\"start_main_player_fullscreen_summary\">ମିନି ପ୍ଲେୟାରରେ ଭିଡିଓ ଆରମ୍ଭ କରନ୍ତୁ ନାହିଁ, କିନ୍ତୁ ଅଟୋ ଘୂର୍ଣ୍ଣନ ବନ୍ଦ ହୋଇଗଲେ ସିଧାସଳଖ ଫୁଲ୍ ସ୍କ୍ରିନ୍ ମୋଡ୍ କୁ ଯାଆନ୍ତୁ। ଫୁଲ୍ ସ୍କ୍ରିନ୍ ଛାଡି ଆପଣ ଏପର୍ଯ୍ୟନ୍ତ ମିନି ପ୍ଲେୟାରକୁ ପ୍ରବେଶ କରିପାରିବେ</string>\n    <string name=\"notification_actions_summary\">ଏହା ଉପରେ ଟ୍ୟାପ କରି ନିମ୍ନରେ ଦିଆଯାଇଥିବା ପ୍ରତ୍ୟେକ ବିଜ୍ଞପ୍ତି କାର୍ଯ୍ୟକୁ ସମ୍ପାଦନ କରନ୍ତୁ । ଡାହାଣ ପଟେ ଥିବା ଚେକବକ୍ସଗୁଡ଼ିକୁ ବ୍ୟବହାର କରି କମ୍ପାକ୍ଟ ବିଜ୍ଞପ୍ତିରେ ଦର୍ଶାଇବା ପାଇଁ ସେଗୁଡ଼ିକ ମଧ୍ୟରୁ ତିନିଟି ଚୟନ କରନ୍ତୁ ।</string>\n    <string name=\"show_meta_info_summary\">ଷ୍ଟ୍ରିମ୍ ସୃଷ୍ଟିକର୍ତ୍ତା, ଷ୍ଟ୍ରିମ୍ ବିଷୟବସ୍ତୁ କିମ୍ବା ଏକ ସନ୍ଧାନ ଅନୁରୋଧ ବିଷୟରେ ଅତିରିକ୍ତ ସୂଚନା ସହିତ ମେଟା ସୂଚନା ବାକ୍ସଗୁଡ଼ିକୁ ଲୁଚାଇବାକୁ ବନ୍ଦ କରନ୍ତୁ</string>\n    <string name=\"show_age_restricted_content_summary\">ପିଲାମାନଙ୍କ ପାଇଁ ସମ୍ଭବତ content ଅନୁପଯୁକ୍ତ ବିଷୟବସ୍ତୁ ଦେଖାନ୍ତୁ କାରଣ ଏହାର ବୟସ ସୀମା ଅଛି (ଯେପରିକି 18+)</string>\n    <string name=\"restricted_video_no_stream\">ଏହି ଭିଡିଓ ବୟସ-ସୀମିତ ଅଟେ ।\n\\nବୟସ-ସୀମିତ ଭିଡିଓ ସହିତ ନୂତନ ୟୁଟ୍ୟୁବ୍ ନୀତି ହେତୁ, NewPipe ଏହାର କୌଣସି ଭିଡିଓ ଷ୍ଟ୍ରିମ୍ ପ୍ରବେଶ କରିପାରିବ ନାହିଁ ଏବଂ ଏହିପରି ଏହାକୁ ଚଲାଇବାରେ ଅସମର୍ଥ ।</string>\n    <string name=\"app_license\">NewPipe ହେଉଛି copyleft libre ସଫ୍ଟୱେର୍: ଆପଣ ନିଜ ଇଚ୍ଛାରେ ଏହାକୁ ବ୍ୟବହାର, ଅଧ୍ୟୟନ, ଅଂଶୀଦାର ଏବଂ ଉନ୍ନତି କରିପାରିବେ । ନିର୍ଦ୍ଦିଷ୍ଟ ଭାବରେ ଆପଣ ମାଗଣା ସଫ୍ଟୱେର୍ ଫାଉଣ୍ଡେସନ୍ ଦ୍ଵାରା ପ୍ରକାଶିତ GNU ଜେନେରାଲ୍ ପବ୍ଲିକ୍ ଲାଇସେନ୍ସର ସର୍ତ୍ତାବଳୀ ଅନୁଯାୟୀ ଏହାକୁ ପୁନ istr ବଣ୍ଟନ ଏବଂ / କିମ୍ବା ରୂପାନ୍ତର କରିପାରିବେ, ଲାଇସେନ୍ସର ସଂସ୍କରଣ 3 କିମ୍ବା ପରବର୍ତ୍ତୀ ସଂସ୍କରଣରେ (ଆପଣଙ୍କ ବିକଳ୍ପରେ) ।</string>\n    <string name=\"show_crash_the_player_title\">\\\"ପ୍ଲେୟାର୍ କ୍ରାସ୍\\\" ଦେଖାନ୍ତୁ</string>\n    <string name=\"import_youtube_instructions\">ଗୁଗୁଲ୍ ନିଆଯିବା ଠାରୁ ୟୁଟ୍ୟୁବ୍ ସଦସ୍ୟତା ଆମଦାନୀ କରନ୍ତୁ:\n\\n\n\\n1. ଏହି URL କୁ ଯାଆନ୍ତୁ: %1$s ।\n\\n2. ପଚରାଗଲେ ଲଗ୍ ଇନ୍ କରନ୍ତୁ ।\n\\n3. \\\"ସମସ୍ତ ତଥ୍ୟ ଅନ୍ତର୍ଭୂକ୍ତ\\\" ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ, ତାପରେ \\\"ସମସ୍ତ ଚୟନ କରନ୍ତୁ\\\" ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ, ତାପରେ କେବଳ \\\"ସଦସ୍ୟତା\\\" ଚୟନ କରନ୍ତୁ ଏବଂ \\\"ଓକେ\\\" କ୍ଲିକ୍ କରନ୍ତୁ ।\n\\n4. \\\"ପରବର୍ତ୍ତୀ ପଦକ୍ଷେପ\\\" ଏବଂ ତାପରେ \\\"ରପ୍ତାନି ସୃଷ୍ଟି\\\" ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ ।\n\\n5. ଏହା ଦେଖାଯିବା ପରେ \\\"ଡାଉନଲୋଡ୍\\\" ବଟନ୍ ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ ।\n\\n6. ନିମ୍ନରେ IMPORT FILE ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ ଏବଂ ଡାଉନଲୋଡ୍ ହୋଇଥିବା .zip ଫାଇଲ୍ ଚୟନ କରନ୍ତୁ ।\n\\n7. [ଯଦି .zip ଆମଦାନି ବିଫଳ]</string>\n    <string name=\"pause_downloads_on_mobile_desc\">ମୋବାଇଲ୍ ଡାଟା ସୁଇଚ୍ କରିବା ସମୟରେ ଉପଯୋଗୀ, ଯଦିଓ କିଛି ଡାଉନଲୋଡ୍ ସ୍ଥଗିତ ହୋଇପାରିବ ନାହିଁ</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">କେତେକ ସେବାରେ ଉପଲବ୍ଧ, ଏହା ସାଧାରଣତଃ ଅଧିକ ତୀବ୍ର ଅଟେ କିନ୍ତୁ ଏକ ସୀମିତ ପରିମାଣର ଆଇଟମ୍ ଏବଂ ପ୍ରାୟତଃ ଅସମ୍ପୂର୍ଣ୍ଣ ସୂଚନା ଫେରସ୍ତ କରିପାରେ (ଯଥା କୌଣସି ଅବଧି, ଆଇଟମ୍ ପ୍ରକାର, ଜୀବନ୍ତ ସ୍ଥିତି ନାହିଁ)</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">ଆପଣ ଭାବୁଛନ୍ତି କି ଫିଡ୍ ଲୋଡିଂ ବହୁତ ଧୀର ଅଟେ\\? ଯଦି ଏହା ହୁଏ, ଦ୍ରୁତ ଲୋଡିଂ ସକ୍ଷମ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ (ଆପଣ ଏହାକୁ ସେଟିଂସମୂହରେ କିମ୍ବା ତଳେ ଥିବା ବଟନ୍ ଦବାଇ ଏହାକୁ ପରିବର୍ତ୍ତନ କରିପାରିବେ) ।\n\\n\n\\nNewPipe ଦୁଇଟି ଫିଡ୍ ଲୋଡିଂ କ strateg ଶଳ ପ୍ରଦାନ କରେ:\n\\n• ସମଗ୍ର ସବସ୍କ୍ରିପସନ୍ ଚ୍ୟାନେଲ୍ ଆଣିବା, ଯାହା ଧୀର କିନ୍ତୁ ସଂପୂର୍ଣ୍ଣ ।\n\\nଏକ ଉତ୍ସର୍ଗୀକୃତ ସେବା ଶେଷ ପଏଣ୍ଟ ବ୍ୟବହାର କରିବା, ଯାହା ଦ୍ରୁତ କିନ୍ତୁ ସାଧାରଣତଃ ସଂପୂର୍ଣ୍ଣ ନୁହେଁ ।\n\\n\n\\nଉଭୟଙ୍କ ମଧ୍ୟରେ ପାର୍ଥକ୍ୟ ହେଉଛି ଦ୍ରୁତତମରେ ସାଧାରଣତ some କିଛି ସୂଚନା ଅଭାବ ଥାଏ, ଯେପରିକି ଆଇଟମ୍ ର ଅବଧି କିମ୍ବା ପ୍ରକାର (ଲାଇଭ୍ ଭିଡିଓ ଏବଂ ସାଧାରଣ ଭିଡିଓ ମଧ୍ୟରେ ପାର୍ଥକ୍ୟ କରିପାରିବ ନାହିଁ) ଏବଂ ଏହା କମ୍ ଆଇଟମ୍ ଫେରସ୍ତ କରିପାରେ ।\n\\n\n\\nୟୁଟ୍ୟୁବ୍ ହେଉଛି ଏକ ସେବାର ଏକ ଉଦାହରଣ ଯାହା ଏହାର RSS ଫିଡ୍ ସହିତ ଏହି ଦ୍ରୁତ ପଦ୍ଧତି ପ୍ରଦାନ କରେ ।\n\\n\n\\nତେଣୁ ଆପଣ ଯାହା ପସନ୍ଦ କରନ୍ତି ତାହା ପସନ୍ଦ ଫୁଟିବ: ଗତି କିମ୍ବା ସଠିକ୍ ସୂଚନା ।</string>\n    <string name=\"no_appropriate_file_manager_message\">ଏହି କାର୍ଯ୍ୟ ପାଇଁ କୌଣସି ଉପଯୁକ୍ତ ଫାଇଲ ପରିଚାଳକ ମିଳିଲା ନାହିଁ ।\n\\nଦୟାକରି ଏକ ଫାଇଲ୍ ମ୍ୟାନେଜର୍ ସଂସ୍ଥାପନ କରନ୍ତୁ କିମ୍ବା ଡାଉନଲୋଡ୍ ସେଟିଂସମୂହରେ \\'%s\\' ଅକ୍ଷମ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ</string>\n    <string name=\"youtube_music_premium_content\">ଏହି ଭିଡିଓ କେବଳ ୟୁଟ୍ୟୁବ୍ ମ୍ୟୁଜିକ୍ ପ୍ରିମିୟମ୍ ସଦସ୍ୟଙ୍କ ପାଇଁ ଉପଲବ୍ଧ, ତେଣୁ ଏହାକୁ ନ୍ୟୁପାଇପ୍ ଦ୍ୱାରା ଷ୍ଟ୍ରିମ୍ କିମ୍ବା ଡାଉନଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ ।</string>\n    <string name=\"progressive_load_interval_summary\">ଧାରଣ ଅନ୍ତରାଳର ଆକାରକୁ ପ୍ରଗତିଶୀଳ ବିଷୟବସ୍ତୁ (ବର୍ତ୍ତମାନ %s) ରେ ପରିବର୍ତ୍ତନ କରନ୍ତୁ । ଗୋଟିଏ ନିମ୍ନମାନ ସେମାନଙ୍କର ପ୍ରାରମ୍ଭିକ ଧାରଣକୁ ତ୍ୱରାନ୍ୱିତ କରିପାରେ</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">ଏହି କାର୍ଯ୍ୟ ପାଇଁ କୌଣସି ଉପଯୁକ୍ତ ଫାଇଲ ପରିଚାଳକ ମିଳିଲା ନାହିଁ ।\n\\nଦୟାକରି ଏକ ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ ସୁସଙ୍ଗତ ଫାଇଲ୍ ମ୍ୟାନେଜର୍ ସଂସ୍ଥାପନ କରନ୍ତୁ</string>\n    <string name=\"soundcloud_go_plus_content\">ଅନ୍ତତଃ ପକ୍ଷେ ଆପଣଙ୍କ ଦେଶରେ ଏହା ଏକ ସାଉଣ୍ଡକ୍ଲାଉଡ୍ ଗୋ + ଟ୍ରାକ୍, ତେଣୁ ଏହାକୁ ନ୍ୟୁପାଇପ୍ ଦ୍ୱାରା ଷ୍ଟ୍ରିମ୍ କିମ୍ବା ଡାଉନଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ ।</string>\n    <string name=\"description_select_note\">ଆପଣ ବର୍ତ୍ତମାନ ବର୍ଣ୍ଣନା ଭିତରେ ଟେକ୍ସଟ୍ ଚୟନ କରିପାରିବେ । ଧ୍ୟାନ ଦିଅନ୍ତୁ ଯେ ପୃଷ୍ଠାଟି ଫ୍ଲିକର ହୋଇପାରେ ଏବଂ ଚୟନ ମୋଡରେ ଥିବାବେଳେ ଲିଙ୍କଗୁଡିକ କ୍ଲିକ୍ ହୋଇନପାରେ ।</string>\n    <string name=\"paid_content\">ଏହି ବିଷୟବସ୍ତୁ କେବଳ ଉପଭୋକ୍ତାମାନଙ୍କ ପାଇଁ ଉପଲବ୍ଧ, ଯେଉଁମାନେ ଦେୟ ଦେଇଛନ୍ତି, ତେଣୁ ଏହାକୁ NewPipe ଦ୍ୱାରା ଷ୍ଟ୍ରିମିଟ୍ କିମ୍ବା ଡାଉନଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ ।</string>\n    <string name=\"start_accept_privacy_policy\">ୟୁରୋପୀୟ ଜେନେରାଲ୍ ଡାଟା ପ୍ରୋଟେକସନ୍ ରେଗୁଲେସନ୍ (GDPR) କୁ ପାଳନ କରିବାକୁ, ଆମେ ଏଠାରେ NewPipe ର ଗୋପନୀୟତା ନୀତି ପ୍ରତି ଆପଣଙ୍କ ଦୃଷ୍ଟି ଆକର୍ଷଣ କରୁ । ଦୟାକରି ଏହାକୁ ଭଲ ଭାବରେ ପଢ଼ନ୍ତୁ ।\n\\nଆମକୁ ବଗ୍ ରିପୋର୍ଟ ପଠାଇବାକୁ ତୁମେ ଏହାକୁ ଗ୍ରହଣ କରିବା ଜରୁରୀ ।</string>\n    <string name=\"tab_subscriptions\">ସଦସ୍ୟତା ଗୁଡ଼ିକ</string>\n    <string name=\"use_external_video_player_summary\">କିଛି ରେଜୋଲୁସନରେ ଅଡିଓ ଅପସାରଣ କରେ</string>\n    <string name=\"show_higher_resolutions_title\">ଉଚ୍ଚ ରେଜୋଲୁସନ ଦେଖାନ୍ତୁ</string>\n    <string name=\"show_play_with_kodi_title\">\\\"କୋଡି ସହିତ ଖୋଲନ୍ତୁ\\\" ବିକଳ୍ପ ଦେଖାନ୍ତୁ</string>\n    <string name=\"remove_watched_popup_warning\">ପ୍ଲେ ଲିଷ୍ଟରେ ଯୋଡାଯିବା ପୂର୍ବରୁ ଏବଂ ପରେ ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ ଅପସାରିତ ହେବ । \\nତମେ ନିଶ୍ଚିତ କି? ଏହାକୁ ପୂର୍ବବତ୍ କରାଯାଇପାରିବ ନାହିଁ!</string>\n    <string name=\"crash_the_player\">ପ୍ଲେୟାରକୁ କ୍ରାସ୍ କରନ୍ତୁ</string>\n    <string name=\"default_audio_format_title\">ଡିଫଲ୍ଟ ଅଡିଓ ଫର୍ମାଟ୍</string>\n    <string name=\"use_inexact_seek_summary\">ଅକ୍ଷୟ ସନ୍ଧାନ ପ୍ଲେୟାରକୁ ହ୍ରାସ ହୋଇଥିବା ସଠିକତା ସହିତ ଶୀଘ୍ର ପଦବୀ ଖୋଜିବାକୁ ଅନୁମତି ଦିଏ । 5, 15 କିମ୍ବା 25 ସେକେଣ୍ଡ ଖୋଜିବା ଏହା ସହିତ କାମ କରେ ନାହିଁ</string>\n    <string name=\"search_showing_result_for\">%s ପାଇଁ ଫଳାଫଳ ଦେଖାଉଛି</string>\n    <string name=\"use_external_video_player_title\">ବହିଃ-ଵିଡ଼ିଓଚାଳକ ଵ୍ୟଵହାର କରିବା</string>\n    <string name=\"subscribed_button_title\">ସଦସ୍ୟତା</string>\n    <string name=\"unsubscribe\">ସଦସ୍ୟତା ରଦ୍ଦ କରନ୍ତୁ</string>\n    <string name=\"channel_unsubscribed\">ଚ୍ୟାନେଲ ସଦସ୍ୟତା ରଦ୍ଦ ହେଲା</string>\n    <string name=\"subscription_change_failed\">ସଦସ୍ୟତା ପରିବର୍ତ୍ତନ କରିପାରିଲା ନାହିଁ</string>\n    <string name=\"show_info\">ସୂଚନା ଦେଖାଅ</string>\n    <string name=\"controls_add_to_playlist_title\">ଏଥିରେ ଯୋଡ଼ିବା</string>\n    <string name=\"default_popup_resolution_title\">ଡିଫଲ୍ଟ ପପ୍ଅପ୍ ରେଜୋଲୁସନ</string>\n    <string name=\"show_higher_resolutions_summary\">କେବଳ କିଛି ଡିଭାଇସ୍ 2K / 4K ଭିଡିଓ ଚଲାଇ ପାରିବେ</string>\n    <string name=\"kore_not_found\">ନିଖୋଜ କୋର ଆପ୍ ସଂସ୍ଥାପନ କରିବେ\\?</string>\n    <string name=\"notification_scale_to_square_image_title\">ଥମ୍ୱନେଲ କୁ 1:1 ଅନୁପାତରେ କ୍ରୋପ୍ କରନ୍ତୁ</string>\n    <string name=\"notification_action_0_title\">ପ୍ରଥମ କୃତ୍ୟ ବଟନ୍</string>\n    <string name=\"notification_action_2_title\">ତୃତୀୟ କୃତ୍ୟ ବଟନ୍</string>\n    <string name=\"notification_action_3_title\">ଚତୁର୍ଥ କୃତ୍ୟ ବଟନ୍</string>\n    <string name=\"notification_action_4_title\">ପଞ୍ଚମ କୃତ୍ୟ ବଟନ୍</string>\n    <string name=\"notification_action_shuffle\">ଶଫଲ୍</string>\n    <string name=\"notification_action_buffering\">ବଫରିଂ</string>\n    <string name=\"notification_action_nothing\">କିଛି ନାହିଁ</string>\n    <string name=\"default_video_format_title\">ଡିଫଲ୍ଟ ଭିଡିଓ ଫର୍ମାଟ୍</string>\n    <string name=\"popup_remember_size_pos_title\">ପପ୍ଅପ୍ ଗୁଣଗୁଡିକ ମନେରଖ</string>\n    <string name=\"processing_may_take_a_moment\">ପ୍ରକ୍ରିୟାକରଣ… କିଛି ସମୟ ନେଇପାରେ</string>\n    <string name=\"caption_setting_description\">ପ୍ଲେୟାର କ୍ୟାପସନ୍ ଟେକ୍ସଟ୍ ସ୍କେଲ୍ ଏବଂ ପୃଷ୍ଠଭୂମି ଶୈଳୀକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ । କାର୍ଯ୍ୟକାରୀ ହେବାକୁ ଆପ୍ ପୁନଃଆରମ୍ଭ ଆବଶ୍ୟକ କରେ</string>\n    <string name=\"leak_canary_not_available\">LeakCanary ଉପଲବ୍ଧ ନାହିଁ</string>\n    <string name=\"enqueue\">ଏନକ୍ୟୁ</string>\n    <string name=\"error_download_resource_gone\">ଏହି ଡାଉନଲୋଡ୍ ପୁନରୁଦ୍ଧାର କରିପାରିବ ନାହିଁ</string>\n    <string name=\"show_thumbnail_summary\">ଉଭୟ ଲକ୍ ସ୍କ୍ରିନ୍ ପୃଷ୍ଠଭୂମି ଏବଂ ବିଜ୍ଞପ୍ତି ପାଇଁ ଥମ୍ବନେଲ୍ ବ୍ୟବହାର କରନ୍ତୁ</string>\n    <string name=\"private_content\">ଏହି ବିଷୟବସ୍ତୁ ବ୍ୟକ୍ତିଗତ ଅଟେ, ତେଣୁ ଏହାକୁ NewPipe ଦ୍ୱାରା ଷ୍ଟ୍ରିମିଟ୍ କିମ୍ବା ଡାଉନଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ ।</string>\n    <string name=\"enqueue_next_stream\">ପରବର୍ତ୍ତୀ ରେ ଏନକ୍ୟୁ</string>\n    <string name=\"enqueued_next\">ପରବର୍ତ୍ତି ରେ ପ୍ଲେ ହେବ</string>\n    <string name=\"bookmark_playlist\">ବୁକମାର୍କ ପ୍ଲେଲିଷ୍ଟ</string>\n    <string name=\"start_downloads\">ଡାଉନଲୋଡ୍ ଆରମ୍ଭ କରନ୍ତୁ</string>\n    <string name=\"mute\">ମ୍ୟୁଟ କରନ୍ତୁ</string>\n    <string name=\"settings_category_player_notification_title\">ପ୍ଲେୟାର ବିଜ୍ଞପ୍ତି</string>\n    <string name=\"settings_category_player_notification_summary\">ସାମ୍ପ୍ରତିକ ଖେଳୁଥିବା ଷ୍ଟ୍ରିମ୍ ବିଜ୍ଞପ୍ତିକୁ ବିନ୍ୟାସ କରନ୍ତୁ</string>\n    <string name=\"popup_playing_toast\">ପପ୍ଅପ୍ ମୋଡ୍ ରେ ଖେଳିବା</string>\n    <string name=\"show_age_restricted_content_title\">ବୟସ ସୀମିତ ବିଷୟବସ୍ତୁ ଦେଖାନ୍ତୁ</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">ୟୁଟ୍ୟୁବ୍ ର \\\"ପ୍ରତିବନ୍ଧିତ ମୋଡ୍\\\" ଟର୍ନ୍ ଅନ୍ କରନ୍ତୁ</string>\n    <string name=\"downloads\">ଡାଉନଲୋଡ୍</string>\n    <string name=\"downloads_title\">ଡାଉନଲୋଡ୍</string>\n    <string name=\"channels\">ଚ୍ୟାନେଲଗୁଡିକ</string>\n    <string name=\"playlists\">ପ୍ଲେଲିଷ୍ଟ ଗୁଡିକ</string>\n    <string name=\"videos_string\">ଭିଡିଓ ଗୁଡିକ</string>\n    <string name=\"tracks\">ଟ୍ରାକ ଗୁଡିକ</string>\n    <string name=\"users\">ଉପଯୋଗକର୍ତ୍ତାଗଣ</string>\n    <string name=\"clear\">ସଫା</string>\n    <string name=\"best_resolution\">ସର୍ବୋତ୍ତମ ରେଜୋଲୁସନ</string>\n    <string name=\"undo\">ପୂର୍ବବତ୍ କରନ୍ତୁ</string>\n    <string name=\"play_all\">ସମସ୍ତ ପ୍ଲେ କରନ୍ତୁ</string>\n    <string name=\"always\">ସର୍ବଦା</string>\n    <string name=\"file\">ଫାଇଲ୍</string>\n    <string name=\"notifications\">ଵିଜ୍ଞପ୍ତି</string>\n    <string name=\"app_update_notification_channel_name\">ଆପ୍ ଅଦ୍ୟତନ ବିଜ୍ଞପ୍ତି</string>\n    <string name=\"app_update_notification_channel_description\">ନୂତନ NewPipe ସଂସ୍କରଣ ପାଇଁ ବିଜ୍ଞପ୍ତି</string>\n    <string name=\"hash_channel_name\">ଭିଡିଓ ହ୍ୟାସ୍ ବିଜ୍ଞପ୍ତି</string>\n    <string name=\"hash_channel_description\">ଭିଡିଓ ହ୍ୟାସିଂ ପ୍ରଗତି ପାଇଁ ବିଜ୍ଞପ୍ତି</string>\n    <string name=\"streams_notification_channel_name\">ନୂତନ ଷ୍ଟ୍ରିମ୍ ଗୁଡ଼ିକ</string>\n    <string name=\"streams_notification_channel_description\">ସଦସ୍ୟତା ପାଇଁ ନୂତନ ଷ୍ଟ୍ରିମ୍ ବିଷୟରେ ବିଜ୍ଞପ୍ତି</string>\n    <string name=\"error_report_channel_name\">ତ୍ରୁଟି ରିପୋର୍ଟ ବିଜ୍ଞପ୍ତି</string>\n    <string name=\"error_report_channel_description\">ତ୍ରୁଟି ରିପୋର୍ଟ କରିବାକୁ ବିଜ୍ଞପ୍ତି</string>\n    <string name=\"unknown_content\">[ଅଜ୍ଞାତ]</string>\n    <string name=\"switch_to_background\">ପୃଷ୍ଠଭୂମିକୁ ସୁଇଚ୍ କରନ୍ତୁ</string>\n    <string name=\"switch_to_popup\">ପପ୍ଅପ୍ କୁ ସୁଇଚ୍ କରନ୍ତୁ</string>\n    <string name=\"switch_to_main\">ମେନ୍ କୁ ସୁଇଚ୍ କର</string>\n    <string name=\"export_data_title\">ଡାଟାବେସ୍ ରପ୍ତାନି କରନ୍ତୁ</string>\n    <string name=\"export_data_summary\">ରପ୍ତାନି ଇତିହାସ, ସଦସ୍ୟତା, ପ୍ଲେଲିଷ୍ଟ ଏବଂ ସେଟିଂସମୂହ</string>\n    <string name=\"delete_view_history_alert\">ସମ୍ପୂର୍ଣ୍ଣ ଘଣ୍ଟା ଇତିହାସ ବିଲୋପ କରିବେ କି\\?</string>\n    <string name=\"clear_playback_states_title\">ପ୍ଲେବେକ୍ ପୋଜିସନ୍ ଡିଲିଟ୍ କରନ୍ତୁ</string>\n    <string name=\"clear_playback_states_summary\">ସମସ୍ତ ପ୍ଲେକ୍ ପୋଜିସନ୍ ଡିଲିଟ୍ କରେ</string>\n    <string name=\"clear_search_history_title\">ସନ୍ଧାନ ଇତିହାସ ସଫା କରନ୍ତୁ</string>\n    <string name=\"delete_search_history_alert\">ସମଗ୍ର ସନ୍ଧାନ ଇତିହାସ ବିଲୋପ କରିବେ କି\\?</string>\n    <string name=\"download_to_sdcard_error_title\">ବହିଃ-ଷ୍ଟୋରେଜ୍ ଅନୁପଲବ୍ଧ</string>\n    <string name=\"network_error\">ନେଟୱର୍କ ତ୍ରୁଟି</string>\n    <string name=\"could_not_load_thumbnails\">ସମସ୍ତ ଥମ୍ୱନେଲ୍ ଲୋଡ୍ କରିପାରିଲା ନାହିଁ</string>\n    <string name=\"parsing_error\">ୱେବସାଇଟ୍ ପାର୍ସ କରିପାରିଲା ନାହିଁ</string>\n    <string name=\"content_not_available\">ବିଷୟବସ୍ତୁ ଉପଲବ୍ଧ ନାହିଁ</string>\n    <string name=\"app_ui_crash\">ଆପ୍ / UI କ୍ରାସ୍ ହୋଇଛି</string>\n    <string name=\"player_recoverable_failure\">ପ୍ଲେୟାର ତ୍ରୁଟିରୁ ପୁନରୁଦ୍ଧାର</string>\n    <string name=\"video_streams_empty\">କୌଣସି ଭିଡିଓ ଷ୍ଟ୍ରିମ୍ ମିଳିଲା ନାହିଁ</string>\n    <string name=\"audio_streams_empty\">କୌଣସି ଅଡିଓ ଷ୍ଟ୍ରିମ୍ ମିଳିଲା ନାହିଁ</string>\n    <string name=\"error_occurred_detail\">ଏକ ତ୍ରୁଟି ଘଟିଲା:%1$s</string>\n    <string name=\"no_streams_available_download\">ଡାଉନଲୋଡ୍ କରିବାକୁ କୌଣସି ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ</string>\n    <string name=\"restore_defaults_confirmation\">ଆପଣ ଡିଫଲ୍ଟ ପୁନଃସ୍ଥାପନ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\\?</string>\n    <string name=\"error_report_notification_title\">NewPipe ଏକ ତ୍ରୁଟିର ସମ୍ମୁଖୀନ ହେଲା, ରିପୋର୍ଟ କରିବାକୁ ଟ୍ୟାପ୍ କରନ୍ତୁ</string>\n    <string name=\"sorry_string\">ଦୁଃଖିତ, ତାହା ହୋଇ ନଥାନ୍ତା ।</string>\n    <string name=\"error_report_button_text\">ଇ-ମେଲ ମାଧ୍ୟମରେ ରିପୋର୍ଟ କରନ୍ତୁ</string>\n    <string name=\"error_report_open_issue_button_text\">GitHub ରେ ରିପୋର୍ଟ କରନ୍ତୁ</string>\n    <string name=\"video\">ଭିଡିଓ</string>\n    <string name=\"audio\">ଅଡିଓ</string>\n    <string name=\"subscribers_count_not_available\">ଗ୍ରାହକ ଗଣନା ଉପଲବ୍ଧ ନାହିଁ</string>\n    <string name=\"no_views\">କୌଣସି ଦର୍ଶନ ନାହିଁ</string>\n    <string name=\"no_one_watching\">କେହି ଦେଖୁ ନାହାଁନ୍ତି</string>\n    <string name=\"no_one_listening\">କେହି ଶୁଣୁ ନାହାଁନ୍ତି</string>\n    <string name=\"no_videos\">କୌଣସି ଭିଡିଓ ନାହିଁ</string>\n    <string name=\"more_than_100_videos\">100+ ଭିଡିଓ</string>\n    <string name=\"infinite_videos\">∞ ଭିଡିଓ ଗୁଡିକ</string>\n    <string name=\"start\">ଆରମ୍ଭ</string>\n    <string name=\"delete\">ବିଲୋପ କରନ୍ତୁ</string>\n    <string name=\"checksum\">ଚେକ୍ସମ୍</string>\n    <string name=\"dismiss\">ବରଖାସ୍ତ</string>\n    <string name=\"msg_name\">ଦସ୍ତାବିଜ୍ ର ନାମ</string>\n    <string name=\"msg_threads\">ଥ୍ରେଡ୍</string>\n    <string name=\"msg_error\">ତ୍ରୁଟି</string>\n    <string name=\"msg_running\">ନୂତନ ପାଇପ୍ ଡାଉନଲୋଡ୍ କରୁଛି</string>\n    <string name=\"msg_calculating_hash\">ହ୍ୟାସ୍ ଗଣନା</string>\n    <string name=\"msg_copied\">କ୍ଲିପବୋର୍ଡରେ କପି କରାଯାଇଛି</string>\n    <string name=\"one_item_deleted\">1 ଆଇଟମ୍ ଡିଲିଟ୍ ହୋଇଛି ।</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA ଆହ୍ୱାନ</string>\n    <string name=\"done\">ସମାପ୍ତ</string>\n    <string name=\"settings_category_downloads_title\">ଡାଉନଲୋଡ୍ କରନ୍ତୁ</string>\n    <string name=\"settings_file_replacement_character_summary\">ଅବୈଧ ବର୍ଣ୍ଣଗୁଡିକ ଏହି ମୂଲ୍ୟ ସହିତ ବଦଳାଯାଏ</string>\n    <string name=\"settings_file_replacement_character_title\">ପ୍ରତିସ୍ଥାପନ ବର୍ଣ୍ଣ</string>\n    <string name=\"charset_most_special_characters\">ଅଧିକାଂଶ ବିଶେଷ ବର୍ଣ୍ଣ</string>\n    <string name=\"title_activity_about\">NewPipe ବିଷୟରେ</string>\n    <string name=\"title_licenses\">ତୃତୀୟ-ପକ୍ଷ ଲାଇସେନ୍ସ</string>\n    <string name=\"tab_licenses\">ଲାଇସେନ୍ସ ଗୁଡ଼ିକ</string>\n    <string name=\"contribution_title\">ଯୋଗଦାନ କରନ୍ତୁ</string>\n    <string name=\"view_on_github\">GitHub ରେ ଦେଖନ୍ତୁ</string>\n    <string name=\"donation_title\">ଦାନ କରନ୍ତୁ</string>\n    <string name=\"donation_encouragement\">ସ୍ଵେଚ୍ଛାସେବୀ ସେମାନଙ୍କର ସର୍ବୋତ୍ତମ ସମୟ ଆପଣଙ୍କୁ ସର୍ବୋତ୍ତମ ଉପଭୋକ୍ତା ଅଭିଜ୍ଞତା ଆଣିବା ଦ୍ୱାରା ନୂତନ ପାଇପ୍ ବିକଶିତ କରନ୍ତି । ଡେଭଲପର୍ମାନଙ୍କୁ ଏକ କପ୍ କଫି ଉପଭୋଗ କରୁଥିବାବେଳେ NewPipe କୁ ଆହୁରି ଉନ୍ନତ କରିବାରେ ସାହାଯ୍ୟ କରିବାକୁ ଫେରନ୍ତୁ ।</string>\n    <string name=\"privacy_policy_title\">NewPipe ର ଗୋପନୀୟତା ନୀତି</string>\n    <string name=\"read_privacy_policy\">ଗୋପନୀୟତା ନୀତି ପଢ଼ନ୍ତୁ</string>\n    <string name=\"app_license_title\">NewPipe ର ଲାଇସେନ୍ସ</string>\n    <string name=\"read_full_license\">ଲାଇସେନ୍ସ ପଢ଼ନ୍ତୁ</string>\n    <string name=\"title_last_played\">ଶେଷ ଥର ପ୍ଲେ ହୋଇଛି</string>\n    <string name=\"blank_page_summary\">ଖାଲି ପୃଷ୍ଠା</string>\n    <string name=\"channel_page_summary\">ଚ୍ୟାନେଲ୍ ପୃଷ୍ଠା</string>\n    <string name=\"kiosk_page_summary\">କିଓସ୍କ ପୃଷ୍ଠା</string>\n    <string name=\"default_kiosk_page_summary\">ଡିଫଲ୍ଟ କିଓସ୍କ</string>\n    <string name=\"top_50\">ଶ୍ରେଷ୍ଠ 50</string>\n    <string name=\"new_and_hot\">ନୂତନ ଏବଂ ଗରମ</string>\n    <string name=\"local\">ସ୍ଥାନୀୟ</string>\n    <string name=\"recently_added\">ସମ୍ପ୍ରତି ଯୋଡା ଯାଇଛି</string>\n    <string name=\"always_ask_open_action\">ସର୍ବଦା ପଚାର</string>\n    <string name=\"preferred_player_fetcher_notification_message\">ଅନୁରୋଧ କରାଯାଇଥିବା ବିଷୟବସ୍ତୁକୁ ଧାରଣ କରୁଛି</string>\n    <string name=\"background_player\">ପୃଷ୍ଠଭୂମି ପ୍ଲେୟାର</string>\n    <string name=\"popup_player\">ପପ୍ଅପ୍ ପ୍ଲେୟାର୍</string>\n    <string name=\"create_playlist\">ନୂତନ ପ୍ଲେଲିଷ୍ଟ</string>\n    <string name=\"unmute\">ଅନ୍ମୁଟ୍ କରନ୍ତୁ</string>\n    <string name=\"delete_playlist_prompt\">ଏହି ପ୍ଲେଲିଷ୍ଟ ବିଲୋପ କରିବେ କି\\?</string>\n    <string name=\"caption_none\">କୌଣସି କ୍ୟାପସନ୍ ନାହିଁ</string>\n    <string name=\"resize_fit\">ଫିଟ୍</string>\n    <string name=\"enable_leak_canary_summary\">ମେମୋରୀ ଲିକ୍ ମନିଟରିଂ ହିପ୍ ଡମ୍ପିଂ କରିବା ସମୟରେ ଆପ୍ ପ୍ରତିକ୍ରିୟାଶୀଳ ହୋଇପାରେ</string>\n    <string name=\"show_original_time_ago_summary\">ସେବାଗୁଡିକରୁ ମୂଳ ଲେଖା ଷ୍ଟ୍ରିମ୍ ଆଇଟମ୍ ଗୁଡିକରେ ଦୃଶ୍ୟମାନ ହେବ</string>\n    <string name=\"disable_media_tunneling_title\">ମିଡିଆ ଟନେଲିଂକୁ ଅକ୍ଷମ କରନ୍ତୁ</string>\n    <string name=\"disable_media_tunneling_summary\">ଯଦି ଆପଣ ଏକ କଳା ପରଦା ଅନୁଭବ କରନ୍ତି କିମ୍ବା ଭିଡିଓ ପ୍ଲେବେକ୍ ଉପରେ ଝୁଣ୍ଟି ପଡ଼ନ୍ତି ତେବେ ମିଡିଆ ଟନେଲିଂକୁ ଅକ୍ଷମ କରନ୍ତୁ ।</string>\n    <string name=\"import_title\">ଆମଦାନି କରନ୍ତୁ</string>\n    <string name=\"import_from\">ଠାରୁ ଆମଦାନୀ କରନ୍ତୁ</string>\n    <string name=\"import_ongoing\">ଆମଦାନି…</string>\n    <string name=\"export_ongoing\">ରପ୍ତାନି…</string>\n    <string name=\"import_file_title\">ଫାଇଲ୍ ଆମଦାନୀ କରନ୍ତୁ</string>\n    <string name=\"previous_export\">ପୂର୍ବ ରପ୍ତାନି</string>\n    <string name=\"import_network_expensive_warning\">ମନେରଖନ୍ତୁ ଏହି ଅପରେସନ୍ ନେଟୱାର୍କ ମହଙ୍ଗା ହୋଇପାରେ ।\n\\n\n\\nଆପଣ ଜାରି ରଖିବାକୁ ଚାହୁଁଛନ୍ତି କି\\?</string>\n    <string name=\"streams_notifications_interval_title\">ବାରମ୍ବାର ଯାଞ୍ଚ କରୁଛି</string>\n    <string name=\"enable_streams_notifications_title\">ନୂତନ ଷ୍ଟ୍ରିମ୍ ବିଜ୍ଞପ୍ତିଗୁଡିକ</string>\n    <string name=\"streams_notifications_network_title\">ଆବଶ୍ୟକ ନେଟୱର୍କ ସଂଯୋଗ</string>\n    <string name=\"enable_streams_notifications_summary\">ସଦସ୍ୟତା ଠାରୁ ନୂତନ ଷ୍ଟ୍ରିମ୍ ବିଷୟରେ ସୂଚିତ କର</string>\n    <string name=\"any_network\">ଯେକୌଣସି ନେଟୱାର୍କ</string>\n    <string name=\"updates_setting_title\">ଅଦ୍ୟତନ ଗୁଡିକ</string>\n    <string name=\"updates_setting_description\">ଏକ ନୂତନ ସଂସ୍କରଣ ଉପଲବ୍ଧ ହେଲେ ଆପ୍ ଅପଡେଟ୍ କୁ ତୁରନ୍ତ ଏକ ବିଜ୍ଞପ୍ତି ଦେଖାନ୍ତୁ</string>\n    <string name=\"never\">କଦାପି ନୁହେଁ</string>\n    <string name=\"list_view_mode\">ଭ୍ୟୁ ମୋଡ୍ ତାଲିକା କର</string>\n    <string name=\"grid\">ଗ୍ରୀଡ୍</string>\n    <string name=\"auto\">ସ୍ଵତଃ</string>\n    <string name=\"paused\">ବିରାମ ଅଛି</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">ଡାଉନଲୋଡ୍ ସମାପ୍ତ ହୋଇଛି</item>\n        <item quantity=\"other\">%s ଟି ଡାଉନଲୋଡ୍ ସମାପ୍ତ ହୋଇଛି</item>\n    </plurals>\n    <string name=\"generate_unique_name\">ଅନନ୍ୟ ନାମ ସୃଷ୍ଟି କରନ୍ତୁ</string>\n    <string name=\"download_already_running\">ଏହି ନାମ ସହିତ ଏକ ଡାଉନଲୋଡ୍ ଚାଲିଛି</string>\n    <string name=\"download_already_pending\">ଏହି ନାମ ସହିତ ଏକ ବିଚାରାଧୀନ ଡାଉନଲୋଡ୍ ଅଛି</string>\n    <string name=\"show_error\">ତ୍ରୁଟି ଦେଖାନ୍ତୁ</string>\n    <string name=\"error_http_no_content\">ସର୍ଭର ଡାଟା ପଠାଏ ନାହିଁ</string>\n    <string name=\"error_http_unsupported_range\">ସର୍ଭର ମଲ୍ଟି-ଥ୍ରେଡେଡ୍ ଡାଉନଲୋଡ୍ ଗ୍ରହଣ କରେ ନାହିଁ, @string/msg_threads = 1 ସହିତ ପୁନଃଚେଷ୍ଟା କର</string>\n    <string name=\"error_http_not_found\">ମିଳିଲା ନାହିଁ</string>\n    <string name=\"error_progress_lost\">ପ୍ରଗତି ହଜିଗଲା, କାରଣ ଫାଇଲ୍ ଡିଲିଟ୍ ହେଲା</string>\n    <string name=\"error_postprocessing_failed\">ପରବର୍ତ୍ତୀ ପ୍ରକ୍ରିୟାକରଣ ବିଫଳ ହେଲା</string>\n    <string name=\"error_postprocessing_stopped\">ଫାଇଲରେ କାମ କରିବାବେଳେ ନ୍ୟୁ ପାଇପ୍ ବନ୍ଦ ହୋଇଯାଇଥିଲା</string>\n    <string name=\"error_insufficient_storage_left\">ଡିଭାଇସରେ କୌଣସି ସ୍ଥାନ ବାକି ନାହିଁ</string>\n    <string name=\"delete_downloaded_files_confirm\">ଡିସ୍କରୁ ସମସ୍ତ ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଫାଇଲଗୁଡ଼ିକୁ ଲିଭାନ୍ତୁ\\?</string>\n    <string name=\"stop\">ବନ୍ଦ କର</string>\n    <string name=\"max_retry_msg\">ସର୍ବାଧିକ ପୁନଃଚେଷ୍ଟା</string>\n    <string name=\"pause_downloads_on_mobile\">ମିଟର ନେଟୱାର୍କରେ ବାଧା</string>\n    <string name=\"close\">ବନ୍ଦ କର</string>\n    <string name=\"pause_downloads\">ଡାଉନଲୋଡ୍ ବିରତି କରନ୍ତୁ</string>\n    <string name=\"downloads_storage_ask_title\">କେଉଁଠାରେ ଡାଉନଲୋଡ୍ କରିବେ ପଚାରନ୍ତୁ</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\\' ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଅନୁମତି ଦିଏ</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">ଆଣ୍ଡ୍ରଏଡ୍ 10 ରୁ କେବଳ \\'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\\' ସମର୍ଥିତ</string>\n    <string name=\"choose_instance_prompt\">ଏକ ଉଦାହରଣ ବାଛନ୍ତୁ</string>\n    <string name=\"new_seek_duration_toast\">ExoPlayer ପ୍ରତିବନ୍ଧକ ହେତୁ ସନ୍ଧାନ ସମୟସୀମା %d ସେକେଣ୍ଡରେ ସେଟ୍ ହୋଇଥିଲା</string>\n    <string name=\"feed_group_dialog_delete_message\">ଆପଣ ଏହି ଗୋଷ୍ଠୀ ବିଲୋପ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\\?</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">କେବଳ ଅଣସଂଗଠିତ ସଦସ୍ୟତା ଦେଖାନ୍ତୁ</string>\n    <string name=\"settings_category_feed_title\">ଫିଡ୍</string>\n    <string name=\"feed_update_threshold_title\">ଫିଡ୍ ଅପଡେଟ୍ ସୀମା</string>\n    <string name=\"feed_update_threshold_option_always_update\">ସର୍ବଦା ଅଦ୍ୟତନ କରନ୍ତୁ</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">ଦ୍ରୁତ ମୋଡ୍ ଅକ୍ଷମ କରନ୍ତୁ</string>\n    <string name=\"playlist_page_summary\">ପ୍ଲେଲିଷ୍ଟ ପୃଷ୍ଠା</string>\n    <string name=\"show_thumbnail_title\">ଥମ୍ୱନେଲ୍ ଦେଖାନ୍ତୁ</string>\n    <string name=\"no_app_to_open_intent\">ଆପଣଙ୍କ ଡିଭାଇସରେ କୌଣସି ଆପ୍ ଏହାକୁ ଖୋଲିପାରିବ ନାହିଁ</string>\n    <string name=\"georestricted_content\">ଏହି ବିଷୟବସ୍ତୁ ଆପଣଙ୍କ ଦେଶରେ ଉପଲବ୍ଧ ନୁହେଁ ।</string>\n    <string name=\"description_select_enable\">ବର୍ଣ୍ଣନାରେ ପାଠ ବାଛିବା ସକ୍ଷମ କରନ୍ତୁ</string>\n    <string name=\"metadata_category\">ବର୍ଗ</string>\n    <string name=\"notifications_disabled\">ବିଜ୍ଞପ୍ତି ଗୁଡିକ ଅକ୍ଷମ ହୋଇଛି</string>\n    <string name=\"toggle_all\">ସମସ୍ତ ଟୋଗଲ୍ କରନ୍ତୁ</string>\n    <string name=\"disabled\">ଅକ୍ଷମ</string>\n    <string name=\"could_not_setup_download_menu\">ଡାଉନଲୋଡ୍ ମେନୁ ସେଟ୍ ଅପ୍ କରିପାରିଲା ନାହିଁ</string>\n    <string name=\"trending\">ଟ୍ରେଣ୍ଡିଂ</string>\n    <string name=\"caption_auto_generated\">ସ୍ଵତଃସୃଷ୍ଟ</string>\n    <string name=\"content\">ବିଷୟବସ୍ତୁ</string>\n    <string name=\"enable_queue_limit\">ଡାଉନଲୋଡ୍ ଧାଡି ସୀମିତ କରନ୍ତୁ</string>\n    <string name=\"check_for_updates\">ଅଦ୍ୟତନ ପାଇଁ ଯାଞ୍ଚ କରନ୍ତୁ</string>\n    <string name=\"manual_update_description\">ନୂତନ ସଂସ୍କରଣଗୁଡ଼ିକ ପାଇଁ ମାନୁଆଲ ଯାଞ୍ଚ କରନ୍ତୁ</string>\n    <string name=\"missions_header_pending\">ବିଚାରାଧୀନ ଅଛି</string>\n    <string name=\"remove_watched_popup_title\">ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ ଅପସାରଣ କରିବେ କି?</string>\n    <string name=\"description_select_disable\">ବର୍ଣ୍ଣନାରେ ପାଠ ବାଛିବା ଅକ୍ଷମ କରନ୍ତୁ</string>\n    <string name=\"error_ssl_exception\">ଏକ ସୁରକ୍ଷିତ ସଂଯୋଗ ସ୍ଥାପନ କରିପାରିଲା ନାହିଁ</string>\n    <string name=\"drawer_header_description\">ଟୋଗଲ୍ ସେବା, ବର୍ତ୍ତମାନ ମନୋନୀତ:</string>\n    <string name=\"give_back\">ଫେରସ୍ତ କର</string>\n    <string name=\"overwrite\">ଓଭର୍ ରାଇଟ୍ କରନ୍ତୁ</string>\n    <string name=\"metadata_host\">ହୋଷ୍ଟ</string>\n    <string name=\"metadata_privacy_public\">ସାର୍ଵଜନୀନ</string>\n    <string name=\"metadata_privacy_unlisted\">ତାଲିକାଭୁକ୍ତ ନୁହେଁ</string>\n    <string name=\"metadata_privacy_private\">ବ୍ୟକ୍ତିଗତ</string>\n    <string name=\"comments_are_disabled\">ମନ୍ତବ୍ୟଗୁଡିକ ଅକ୍ଷମ ହୋଇଛି</string>\n    <string name=\"no_available_dir\">ଦୟାକରି ସେଟିଂସମୂହରେ ଏକ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ବ୍ୟାଖ୍ୟା କରନ୍ତୁ</string>\n    <string name=\"chapters\">ଅଧ୍ୟାୟ ଗୁଡ଼ିକ</string>\n    <string name=\"duration_live\">ସିଧାପ୍ରସରଣ</string>\n    <string name=\"background_player_playing_toast\">ପୃଷ୍ଠଭୂମିରେ ଖେଳିବା</string>\n    <string name=\"error_snackbar_message\">ଦୁଃଖିତ, କିଛି ଭୁଲ ହୋଇଗଲା ।</string>\n    <string name=\"error_snackbar_action\">ରିପୋର୍ଟ କରନ୍ତୁ</string>\n    <string name=\"what_device_headline\">ସୂଚନା:</string>\n    <string name=\"what_happened_headline\">କଣ ହେଲା:</string>\n    <string name=\"error_details_headline\">ବିବରଣୀ:</string>\n    <string name=\"detail_thumbnail_view_description\">ଭିଡିଓ ଚଲାନ୍ତୁ, ଅବଧି:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">ଅପଲୋଡରର ଅବତାର ଥମ୍ୱବେଲ୍</string>\n    <string name=\"detail_likes_img_view_description\">ପସନ୍ଦ</string>\n    <string name=\"detail_dislikes_img_view_description\">ନାପସନ୍ଦ</string>\n    <string name=\"comments_tab_description\">ମନ୍ତବ୍ୟ ଗୁଡିକ</string>\n    <string name=\"description_tab_description\">ବର୍ଣ୍ଣନା</string>\n    <string name=\"recaptcha_solve\">ସମାଧାନ</string>\n    <string name=\"playback_speed_control\">ପ୍ଲେବେକ୍ ସ୍ପିଡ୍ ନିୟନ୍ତ୍ରଣ</string>\n    <string name=\"playback_tempo\">ଟେମ୍ପୋ</string>\n    <string name=\"unhook_checkbox\">ଅନ୍ହକ୍ (ବିକୃତିର କାରଣ ହୋଇପାରେ)</string>\n    <string name=\"skip_silence_checkbox\">ନୀରବତା ସମୟରେ ଦ୍ରୁତ ଅଗ୍ରଗାମୀ</string>\n    <string name=\"playback_step\">ପଦାଙ୍କ</string>\n    <string name=\"playback_reset\">ପୁନଃସେଟ୍ କରନ୍ତୁ</string>\n    <string name=\"accept\">ଗ୍ରହଣ କରନ୍ତୁ</string>\n    <string name=\"decline\">ଅଗ୍ରାହ୍ୟ କରନ୍ତୁ</string>\n    <string name=\"limit_data_usage_none_description\">କୌଣସି ସୀମା ନାହିଁ</string>\n    <string name=\"low_quality_smaller\">ନିମ୍ନ ଗୁଣ (ଛୋଟ)</string>\n    <string name=\"dont_show\">ଦେଖାନ୍ତୁ ନାହିଁ</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍ କୁ କେଉଁଠାରେ ସେଭ୍ କରାଯିବ ତାହା ଆପଣଙ୍କୁ ପଚରାଯିବ</string>\n    <string name=\"account_terminated\">ଖାତା ବନ୍ଦ ହୋଇଗଲା</string>\n    <string name=\"night_theme_summary\">ଆପଣଙ୍କର ପ୍ରିୟ ରାତିର ଥିମ୍ -%s ଚୟନ କରନ୍ତୁ</string>\n    <string name=\"metadata_licence\">ଲାଇସେନ୍ସ</string>\n    <string name=\"all\">ସମସ୍ତ</string>\n    <string name=\"songs\">ଗୀତ</string>\n    <string name=\"events\">ଘଟଣା</string>\n    <string name=\"artists\">କଳାକାର ମାନେ</string>\n    <string name=\"player_stream_failure\">ଏହି ଷ୍ଟ୍ରିମ୍ ଚଲାଇ ପାରିଲା ନାହିଁ</string>\n    <string name=\"invalid_file\">ଫାଇଲ୍ ବିଦ୍ୟମାନ ନାହିଁ କିମ୍ବା ଏହାକୁ ପଢ଼ିବା କିମ୍ବା ଲେଖିବା ପାଇଁ ଅନୁମତି ଅଭାବ</string>\n    <string name=\"invalid_directory\">ଏପରି ଫୋଲ୍ଡର ନାହିଁ</string>\n    <string name=\"saved_tabs_invalid_json\">ସଞ୍ଚିତ ଟ୍ୟାବଗୁଡିକ ପଢ଼ି ପାରିଲା ନାହିଁ, ତେଣୁ ଡିଫଲ୍ଟଗୁଡିକ ବ୍ୟବହାର କରି</string>\n    <string name=\"info_labels\">କଣ:\\nRequest:\\nContent Language:\\nContent Country:\\nApp Language:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS ସଂସ୍କରଣ:</string>\n    <string name=\"search_no_results\">କୌଣସି ଫଳାଫଳ ନାହିଁ</string>\n    <string name=\"empty_list_subtitle\">ଏଠାରେ କ୍ରିକେଟ୍ ବ୍ୟତୀତ ଆଉ କିଛି ନାହିଁ</string>\n    <string name=\"retry\">ପୁନଃଚେଷ୍ଟା କରନ୍ତୁ</string>\n    <string name=\"no_comments\">କିଛି କହିବାର ନାହିଁ</string>\n    <string name=\"website_title\">ୱେବସାଇଟ୍</string>\n    <string name=\"website_encouragement\">ଅଧିକ ସୂଚନା ଏବଂ ସମ୍ବାଦ ପାଇଁ NewPipe ୱେବସାଇଟ୍ ପରିଦର୍ଶନ କରନ୍ତୁ ।</string>\n    <string name=\"export_complete_toast\">ରପ୍ତାନି ହୋଇଛି</string>\n    <string name=\"no_valid_zip_file\">କୌଣସି ବୈଧ ZIP ଫାଇଲ୍ ନାହିଁ</string>\n    <string name=\"conferences\">ଆଲୋଚନା</string>\n    <string name=\"play_queue_remove\">ଅପସାରଣ କରନ୍ତୁ</string>\n    <string name=\"play_queue_audio_settings\">ଅଡିଓ ସେଟିଂସମୂହ</string>\n    <string name=\"hold_to_append\">ଏନକ୍ୟୁ କରିବାକୁ ଧର</string>\n    <string name=\"unbookmark_playlist\">ବୁକମାର୍କ ଅପସାରଣ କରନ୍ତୁ</string>\n    <string name=\"playlist_creation_success\">ପ୍ଲେଲିଷ୍ଟ ସୃଷ୍ଟି ହୋଇଛି</string>\n    <string name=\"channel_created_by\">%s ଦ୍ୱାରା ସୃଷ୍ଟି</string>\n    <string name=\"video_detail_by\">%s ଦ୍ଵାରା</string>\n    <string name=\"fragment_feed_title\">ନୁଆ କଣ</string>\n    <string name=\"feed_oldest_subscription_update\">ଶେଷ ଅଦ୍ୟତନ କରନ୍ତୁ: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">ଲୋଡ୍ ହୋଇନାହିଁ: %d</string>\n    <string name=\"feed_notification_loading\">ଫିଡ୍ ଲୋଡିଂ…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">ସଦସ୍ୟତା ଚୟନ କରନ୍ତୁ</string>\n    <string name=\"feed_group_dialog_empty_selection\">କୌଣସି ସଦସ୍ୟତା ଚୟନ ହୋଇନାହିଁ</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">ଦ୍ରୁତ ମୋଡ୍ ସକ୍ଷମ କରନ୍ତୁ</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">ଚ୍ୟାନେଲର ଅବତାର ଥମ୍ୱନେଲ୍</string>\n    <string name=\"featured\">ବୈଶିଷ୍ଟ୍ୟ</string>\n    <string name=\"radio\">ରେଡିଓ</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer ଡିଫଲ୍ଟ</string>\n    <string name=\"metadata_age_limit\">ବୟସ ସୀମା</string>\n    <string name=\"unknown_quality\">ଅଜ୍ଞାତ ଗୁଣବତ୍ତା</string>\n    <string name=\"restricted_video\">ଏହି ଭିଡିଓ ବୟସ ସୀମିତ ଅଟେ ।\n\\n\n\\nଯଦି ଆପଣ ଏହାକୁ ଦେଖିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସେଟିଂସମୂହରେ \\\"%1$s\\\" ଟର୍ନ୍ ଅନ୍ କରନ୍ତୁ ।</string>\n    <string name=\"error_report_title\">ତ୍ରୁଟି ରିପୋର୍ଟ</string>\n    <string name=\"albums\">ଆଲବମ୍ ଗୁଡ଼ିକ</string>\n    <string name=\"download_to_sdcard_error_message\">ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବା ସମ୍ଭଵ ନୁହେଁ। ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ଅବସ୍ଥାନ ପୁନଃସେଟ୍ କରିବେ କି\\?</string>\n    <string name=\"file_deleted\">ଫାଇଲ୍ ଡିଲିଟ୍ ହୋଇଛି</string>\n    <string name=\"just_once\">କେବଳ ଥରେ</string>\n    <string name=\"notification_channel_name\">ନୂତନ ପାଇପ୍ ବିଜ୍ଞପ୍ତି</string>\n    <string name=\"import_data_title\">ଡାଟାବେସ୍ ଆମଦାନୀ କରନ୍ତୁ</string>\n    <string name=\"notification_channel_description\">NewPipe ର ପ୍ଲେୟାର ପାଇଁ ବିଜ୍ଞପ୍ତି</string>\n    <string name=\"clear_cookie_title\">ReCAPTCHA କୁକିଜ୍ ସଫା କରନ୍ତୁ</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA କୁକିଜ୍ ସଫା ହୋଇଛି</string>\n    <string name=\"clear_cookie_summary\">ଯେତେବେଳେ ଆପଣ ଏକ reCAPTCHA ସମାଧାନ କରନ୍ତି, କୁକିଜ୍ ସଫା କରନ୍ତୁ</string>\n    <string name=\"import_data_summary\">ଆପଣଙ୍କର ସାମ୍ପ୍ରତିକ ଇତିହାସ, ସଦସ୍ୟତା, ପ୍ଲେଲିଷ୍ଟ ଏବଂ (ଇଚ୍ଛାଧୀନ) ସେଟିଂସମୂହକୁ ନବଲିଖନ କରେ</string>\n    <string name=\"clear_views_history_title\">ଘଣ୍ଟା ଇତିହାସ ସଫା କରନ୍ତୁ</string>\n    <string name=\"clear_views_history_summary\">ଖେଳାଯାଇଥିବା ଷ୍ଟ୍ରିମ୍ ଏବଂ ପ୍ଲେକ୍ ସ୍ଥିତିକୁ ବିଲୋପ କରେ</string>\n    <string name=\"delete_playback_states_alert\">ସମସ୍ତ ପ୍ଲେକ୍ ପୋଜିସନ୍ ବିଲୋପ କରିବେ କି\\?</string>\n    <string name=\"clear_search_history_summary\">ସନ୍ଧାନ କୀ ଶବ୍ଦର ଇତିହାସ ବିଲୋପ କରେ</string>\n    <string name=\"general_error\">ତ୍ରୁଟି</string>\n    <string name=\"player_unrecoverable_failure\">ପୁନରୁଦ୍ଧାର ନ ହୋଇପାରିଲା ପରି ପ୍ଲେୟାର ତ୍ରୁଟି ଘଟିଲା</string>\n    <string name=\"external_player_unsupported_link_type\">ବହିଃ-ଚାଳକ ଏଭଳି ଲିଙ୍କ୍ ସମର୍ଥନ କରେନି</string>\n    <string name=\"missing_file\">ଫାଇଲ୍ ଘୁଞ୍ଚିଗଲା କିମ୍ବା ଡିଲିଟ୍ ହେଲା</string>\n    <string name=\"no_playlist_bookmarked_yet\">ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ପ୍ଲେଲିଷ୍ଟ ବୁକମାର୍କ ନାହିଁ</string>\n    <string name=\"invalid_source\">ସେପରି କୌଣସି ଫାଇଲ / ବିଷୟବସ୍ତୁ ଉତ୍ସ ନାହିଁ</string>\n    <string name=\"restore_defaults\">ଡିଫଲ୍ଟଗୁଡିକ ପୁନରୁଦ୍ଧାର କରନ୍ତୁ</string>\n    <string name=\"error_report_notification_toast\">ଏକ ତ୍ରୁଟି ଘଟିଛି, ବିଜ୍ଞପ୍ତିକୁ ଦେଖନ୍ତୁ</string>\n    <string name=\"copy_for_github\">ଫର୍ମାଟ୍ ହୋଇଥିବା ରିପୋର୍ଟ କପି କରନ୍ତୁ</string>\n    <string name=\"permission_display_over_apps\">ଅନ୍ୟ ଆପ୍ସ ଉପରେ ପ୍ରଦର୍ଶନ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ</string>\n    <string name=\"error_report_open_github_notice\">ଦୟାକରି ଯାଞ୍ଚ କରନ୍ତୁ ଯେ ଆପଣଙ୍କର କ୍ରାସ୍ ବିଷୟରେ ଆଲୋଚନା କରୁଥିବା ଏକ ସମସ୍ୟା ପୂର୍ବରୁ ଅଛି କି\\? ନକଲ ଟିକେଟ୍ ତିଆରି କରିବାବେଳେ, ଆପଣ ଆମଠାରୁ ସମୟ ନିଅନ୍ତି ଯାହାକୁ ଆମେ ପ୍ରକୃତ ତ୍ରୁଟି ସୁଧାରିବା ସହିତ ଖର୍ଚ୍ଚ କରିପାରିବା ।</string>\n    <string name=\"your_comment\">ଆପଣଙ୍କର ମନ୍ତବ୍ୟ (ଇଂରାଜୀରେ):</string>\n    <string name=\"related_items_tab_description\">ସମ୍ବନ୍ଧୀୟ ଆଇଟମ୍ ଗୁଡ଼ିକ</string>\n    <string name=\"detail_drag_description\">ପୁନଃ ସଯାଇବାକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ</string>\n    <string name=\"pause\">ବିରାମ</string>\n    <string name=\"no_subscribers\">କୌଣସି ଗ୍ରାହକ ନାହାଁନ୍ତି</string>\n    <string name=\"create\">ସୃଷ୍ଟି କରନ୍ତୁ</string>\n    <string name=\"msg_running_detail\">ବିବରଣୀ ପାଇଁ ଟ୍ୟାପ୍ କରନ୍ତୁ</string>\n    <string name=\"rename\">ନାମ ପରିବର୍ତ୍ତନ କରନ୍ତୁ</string>\n    <string name=\"msg_wait\">ଦୟାକରି ଅପେକ୍ଷା କର…</string>\n    <string name=\"no_dir_yet\">ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର ସେଟ୍ ହୋଇନାହିଁ, ବର୍ତ୍ତମାନ ଡିଫଲ୍ଟ ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର ବାଛନ୍ତୁ</string>\n    <string name=\"subtitle_activity_recaptcha\">ସମାଧାନ ହେବାପରେ \\\"ସମାପ୍ତ\\\" ଦବାନ୍ତୁ</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA ଚ୍ୟାଲେଞ୍ଜ ଅନୁରୋଧ</string>\n    <string name=\"settings_file_charset_title\">ଫାଇଲ ନାମରେ ଅନୁମତିପ୍ରାପ୍ତ ବର୍ଣ୍ଣଗୁଡିକ</string>\n    <string name=\"charset_letters_and_digits\">ଅକ୍ଷର ଏବଂ ସଂଖ୍ୟା</string>\n    <string name=\"copyright\">© %1$s ଦ୍ଵାରା %2$s ରେ %3$s</string>\n    <string name=\"contribution_encouragement\">ଆପଣଙ୍କର ଧାରଣା ଅଛି କି ନାହିଁ; ଅନୁବାଦ, ଡିଜାଇନ୍ ପରିବର୍ତ୍ତନ, କୋଡ୍ ସଫା କରିବା, କିମ୍ବା ପ୍ରକୃତ ଭାରୀ କୋଡ୍ ପରିବର୍ତ୍ତନ - ସାହାଯ୍ୟ ସର୍ବଦା ସ୍ୱାଗତଯୋଗ୍ୟ ।ଯେତେ ଭଲ ହୁଏ ସେତେ ଭଲ ହୁଏ!</string>\n    <string name=\"app_description\">ଆଣ୍ଡ୍ରଏଡରେ ସ୍ଵାଧୀନ ହାଲୁକା ଷ୍ଟ୍ରିମିଂ ।</string>\n    <string name=\"privacy_policy_encouragement\">ନ୍ୟୁ ପାଇପ୍ ପ୍ରୋଜେକ୍ଟ ଆପଣଙ୍କ ଗୋପନୀୟତାକୁ ଅତି ଗମ୍ଭୀରତାର ସହିତ ନେଇଥାଏ । ତେଣୁ, ଆପଣଙ୍କ ସମ୍ମତି ବିନା ଆପ୍ କୌଣସି ତଥ୍ୟ ସଂଗ୍ରହ କରେ ନାହିଁ ।\n\\nNewPipe ର ଗୋପନୀୟତା ନୀତି ବିସ୍ତୃତ ଭାବରେ ବ୍ୟାଖ୍ୟା କରେ ଯେତେବେଳେ ଆପଣ କ୍ରାସ୍ ରିପୋର୍ଟ ପଠାନ୍ତି କେଉଁ ତଥ୍ୟ ପଠାଯାଏ ଏବଂ ଗଚ୍ଛିତ ହୁଏ ।</string>\n    <string name=\"main_page_content\">ମୁଖ୍ୟ ପୃଷ୍ଠାର ବିଷୟବସ୍ତୁ</string>\n    <string name=\"select_a_playlist\">ଏକ ପ୍ଲେଲିଷ୍ଟ ଚୟନ କରନ୍ତୁ</string>\n    <string name=\"import_complete_toast\">ଆମଦାନୀ ହୋଇଛି</string>\n    <string name=\"override_current_data\">ଏହା ତୁମର ସାମ୍ପ୍ରତିକ ସେଟଅପ୍ କୁ ନବଲିଖନ କରିବ ।</string>\n    <string name=\"title_activity_play_queue\">ଧାଡି ଚଲାନ୍ତୁ</string>\n    <string name=\"msg_popup_permission\">ଏହି ଅନୁମତି ଆବଶ୍ୟକ\n\\nପପ୍ଅପ୍ ମୋଡ୍ ରେ ଖୋଲ</string>\n    <string name=\"create_error_notification\">ଏକ ତ୍ରୁଟି ବିଜ୍ଞପ୍ତି ସୃଷ୍ଟି କରନ୍ତୁ</string>\n    <string name=\"export_to\">କୁ ରପ୍ତାନି କରନ୍ତୁ</string>\n    <string name=\"import_soundcloud_instructions\">URL କିମ୍ବା ଆପଣଙ୍କର ID ଟାଇପ୍ କରି ଏକ ସାଉଣ୍ଡ କ୍ଲାଉଡ୍ ପ୍ରୋଫାଇଲ୍ ଆମଦାନୀ କରନ୍ତୁ:\n\\n\n\\nଏକ ୱେବ୍ ବ୍ରାଉଜରରେ “ଡେସ୍କଟପ୍ ମୋଡ୍” ସକ୍ଷମ କର (ମୋବାଇଲ୍ ଡିଭାଇସ୍ ପାଇଁ ସାଇଟ୍ ଉପଲବ୍ଧ ନୁହେଁ)\n\\n2. ଏହି URL କୁ ଯାଆନ୍ତୁ:%1$s ।\n\\n3. ପଚରାଗଲେ ଲଗ୍ ଇନ୍ କରନ୍ତୁ ।\n\\n4. ଆପଣ ପୁନଃ ନିର୍ଦ୍ଦେଶିତ ହୋଇଥିବା ପ୍ରୋଫାଇଲ୍ URL କପି କରନ୍ତୁ ।</string>\n    <string name=\"playback_pitch\">ପିଚ୍</string>\n    <string name=\"limit_mobile_data_usage_title\">ମୋବାଇଲ୍ ଡାଟା ବ୍ୟବହାର କରିବା ସମୟରେ ରେଜୋଲୁସନ ସୀମିତ କରନ୍ତୁ</string>\n    <string name=\"checking_updates_toast\">ଅଦ୍ୟତନ ପାଇଁ ଯାଞ୍ଚ କରୁଛି…</string>\n    <string name=\"seekbar_preview_thumbnail_title\">ସେକ୍ବାର୍ ଥମ୍ୱନେଲ୍ ପୂର୍ବାବଲୋକନ</string>\n    <string name=\"high_quality_larger\">ଉଚ୍ଚ ଗୁଣବତ୍ତା (ବଡ଼)</string>\n    <string name=\"confirm_prompt\">ଆପଣ ଆପଣଙ୍କର ଡାଉନଲୋଡ୍ ଇତିହାସ ସଫା କରିବାକୁ କିମ୍ବା ସମସ୍ତ ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଫାଇଲଗୁଡିକ ବିଲୋପ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\\?</string>\n    <string name=\"error_unknown_host\">ସର୍ଭର ଖୋଜି ପାଇଲା ନାହିଁ</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s ଡାଉନଲୋଡ୍ ଡିଲିଟ୍ ହୋଇଛି</item>\n        <item quantity=\"other\">%1$s ଡାଉନଲୋଡ୍ ଗୁଡ଼ିକ ଡିଲିଟ୍ ହୋଇଛି</item>\n    </plurals>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d ଚୟନ ହୋଇଛି</item>\n        <item quantity=\"other\">ମୋଟ %d ଟି ଚୟନ ହୋଇଛି</item>\n    </plurals>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' ପାଇଁ ଫିଡ୍ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ ।</string>\n    <string name=\"feed_new_items\">ନୂତନ ଫିଡ୍ ଆଇଟମ୍</string>\n    <string name=\"feed_load_error_terminated\">ଲେଖକଙ୍କ ଆକାଉଣ୍ଟକୁ ବନ୍ଦ କରିଦିଆଯାଇଛି ।\n\\nଭବିଷ୍ୟତରେ NewPipe ଏହି ଫିଡ୍ ଲୋଡ୍ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ ।\n\\nଆପଣ ଏହି ଚ୍ୟାନେଲରୁ ସଦସ୍ୟତା ରଦ୍ଦ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\\?</string>\n    <string name=\"metadata_privacy_internal\">ଅନ୍ତଃସ୍ଥ</string>\n    <string name=\"you_successfully_subscribed\">ଆପଣ ବର୍ତ୍ତମାନ ଏହି ଚ୍ୟାନେଲକୁ ସବସ୍କ୍ରାଇବ କରିଛନ୍ତି</string>\n    <string name=\"no_video_streams_available_for_external_players\">ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଵିଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ</string>\n    <string name=\"detail_heart_img_view_description\">ସୃଷ୍ଟିକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ହୃଦୟ</string>\n    <string name=\"streams_not_yet_supported_removed\">ଷ୍ଟ୍ରିମ୍ ଯାହା ଏପର୍ଯ୍ୟନ୍ତ ଡାଉନଲୋଡର୍ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ</string>\n    <string name=\"unknown_format\">ଅଜ୍ଞାତ ଫର୍ମାଟ୍</string>\n    <string name=\"downloads_storage_ask_summary\">ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍‍କୁ କେଉଁଠାରେ ସଞ୍ଚୟ କରାଯିବ ତା\\' ଆପଣଙ୍କୁ ପଚରାଯିବ।\n\\nଯଦି ଆପଣ ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ଚୟକ (SAF)କୁ ସକ୍ଷମ କରନ୍ତୁ</string>\n    <string name=\"show_memory_leaks\">ମେମୋରୀ ଲିକ୍ ଦେଖାନ୍ତୁ</string>\n    <string name=\"show_original_time_ago_title\">ଆଇଟମଗୁଡିକରେ ମୂଳ ସମୟ ପୂର୍ବରୁ ଦେଖାନ୍ତୁ</string>\n    <string name=\"enable_disposed_exceptions_summary\">ବିସର୍ଜନ ପରେ ଖଣ୍ଡ କିମ୍ବା କାର୍ଯ୍ୟକଳାପ ଜୀବନଚକ୍ର ବାହାରେ ଅଣସଂରକ୍ଷିତ Rx ବ୍ୟତିକ୍ରମଗୁଡିକର ଫୋର୍ସ ରିପୋର୍ଟିଂ</string>\n    <string name=\"enable_disposed_exceptions_title\">ଲାଇଫ୍ ସାଇକେଲ୍ ତ୍ରୁଟିଗୁଡିକ ରିପୋର୍ଟ କରନ୍ତୁ</string>\n    <string name=\"missions_header_finished\">ସମାପ୍ତ</string>\n    <string name=\"recovering\">ପୁନରୁଦ୍ଧାର ହେଉଛି</string>\n    <string name=\"queued\">ଧାଡିରେ ଯୋଗ ହେଲା</string>\n    <string name=\"post_processing\">ପରବର୍ତ୍ତୀ ପ୍ରକ୍ରିୟାକରଣ</string>\n    <string name=\"overwrite_finished_warning\">ଏହି ନାମ ସହିତ ଏକ ଡାଉନଲୋଡ୍ ଫାଇଲ୍ ପୂର୍ବରୁ ବିଦ୍ୟମାନ ଅଛି</string>\n    <string name=\"delete_downloaded_files\">ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଫାଇଲଗୁଡିକ ଡିଲିଟ୍ କରନ୍ତୁ</string>\n    <string name=\"downloads_storage_use_saf_title\">ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ପିକର୍ (SAF) ବ୍ୟବହାର କରନ୍ତୁ</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">ହଁ, ଏବଂ ଆଂଶିକ ଦେଖାଯାଇଥିବା ଭିଡିଓଗୁଡିକ</string>\n    <string name=\"feed_group_dialog_empty_name\">ଗୋଷ୍ଠୀ ନାମ ଖାଲି ଅଛି</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">ଉପଲବ୍ଧ ଥିବାବେଳେ ଉତ୍ସର୍ଗୀକୃତ ଫିଡରୁ ଆଣ</string>\n    <string name=\"list\">ତାଲିକା</string>\n    <string name=\"enable_queue_limit_desc\">ଗୋଟିଏ ଡାଉନଲୋଡ୍ ଏକ ସମୟରେ ଚାଲିବ</string>\n    <string name=\"recent\">ସମ୍ପ୍ରତି</string>\n    <string name=\"tablet_mode_title\">ଟାବଲେଟ୍ ମୋଡ୍</string>\n    <string name=\"no_audio_streams_available_for_external_players\">ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଅଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ</string>\n    <string name=\"select_quality_external_players\">ବହିଃ-ଚାଳକ ପାଇଁ ଗୁଣବତ୍ତା ଚୟନ କରନ୍ତୁ</string>\n    <string name=\"detail_pinned_comment_view_description\">ପିନ୍ ହୋଇଥିବା ମନ୍ତବ୍ୟ</string>\n    <string name=\"open_website_license\">ୱେବସାଇଟ୍ ଖୋଲନ୍ତୁ</string>\n    <string name=\"preferred_player_fetcher_notification_title\">ସୂଚନା ପାଇବା…</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s ଗ୍ରାହକ</item>\n        <item quantity=\"other\">ମୋଟ %s ଗ୍ରାହକ</item>\n    </plurals>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s ଦର୍ଶନ</item>\n        <item quantity=\"other\">ମୋଟ %s ଦର୍ଶନ</item>\n    </plurals>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s ଜଣ ଦେଖୁଛନ୍ତି</item>\n        <item quantity=\"other\">ମୋଟ %s ଜଣ ଦେଖୁଛନ୍ତି</item>\n    </plurals>\n    <string name=\"tab_about\">ବିଷୟରେ &amp; FAQ</string>\n    <string name=\"faq_title\">ପ୍ରାୟତଃ ପଚରାଯାଇଥିବା ପ୍ରଶ୍ନ</string>\n    <string name=\"faq_description\">ଯଦି ଆପଣ ଆପ୍ ବ୍ୟବହାର କରିବାରେ ଅସୁବିଧାର ସମ୍ମୁଖୀନ ହେଉଛନ୍ତି, ସାଧାରଣ ପ୍ରଶ୍ନର ଏହି ଉତ୍ତରଗୁଡିକ ଯାଞ୍ଚ କରିବାକୁ ନିଶ୍ଚିତ ହୁଅନ୍ତୁ!</string>\n    <string name=\"faq\">ୱେବସାଇଟ୍ ରେ ଦେଖନ୍ତୁ</string>\n    <string name=\"delete_item_search_history\">ଆପଣ ସନ୍ଧାନ ଇତିହାସରୁ ଏହି ଆଇଟମ୍ ବିଲୋପ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\\?</string>\n    <string name=\"title_most_played\">ଅଧିକାଂଶ ପ୍ଲେ ହୋଇଛି</string>\n    <string name=\"main_page_content_summary\">ମୁଖ୍ୟ ପୃଷ୍ଠାରେ କେଉଁ ଟ୍ୟାବଗୁଡ଼ିକ ଦେଖାଯାଏ</string>\n    <string name=\"select_a_channel\">ଏକ ଚ୍ୟାନେଲ୍ ଚୟନ କରନ୍ତୁ</string>\n    <string name=\"main_page_content_swipe_remove\">ସେଗୁଡିକ ଅପସାରଣ କରିବା ପାଇଁ ଆଇଟମଗୁଡିକ ସ୍ୱାଇପ୍ କରନ୍ତୁ</string>\n    <string name=\"no_channel_subscribed_yet\">ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ଚ୍ୟାନେଲ ରେ ସଦସ୍ୟତା ନାହିଁ</string>\n    <string name=\"select_a_kiosk\">ଏକ କିଓସ୍କ ଚୟନ କରନ୍ତୁ</string>\n    <string name=\"could_not_import_all_files\">ଚେତାବନୀ: ସମସ୍ତ ଫାଇଲ୍ ଆମଦାନି କରିପାରିଲା ନାହିଁ ।</string>\n    <string name=\"import_settings\">ଆପଣ ସେଟିଂସମୂହ ମଧ୍ୟ ଆମଦାନୀ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\\?</string>\n    <string name=\"error_unable_to_load_comments\">ମନ୍ତବ୍ୟ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ</string>\n    <string name=\"most_liked\">ଅଧିକାଂଶ ପସନ୍ଦ କରନ୍ତି</string>\n    <string name=\"show_channel_details\">ଚ୍ୟାନେଲର ବିବରଣୀ ଦେଖାନ୍ତୁ</string>\n    <string name=\"enqueue_stream\">ଏନକ୍ୟୁ</string>\n    <string name=\"enqueued\">ଅନୁକରଣ</string>\n    <string name=\"start_here_on_background\">ପୃଷ୍ଠଭୂମିରେ ଖେଳିବା ଆରମ୍ଭ କରନ୍ତୁ</string>\n    <string name=\"start_here_on_popup\">ଏକ ପପ୍ଅପ୍ ରେ ଖେଳିବା ଆରମ୍ଭ କରନ୍ତୁ</string>\n    <string name=\"loading_stream_details\">ଷ୍ଟ୍ରିମ୍ ବିବରଣୀ ଲୋଡ୍ କରୁଛି…</string>\n    <string name=\"drawer_open\">ଡ୍ରୟର ଖୋଲନ୍ତୁ</string>\n    <string name=\"drawer_close\">ଡ୍ରୟର ବନ୍ଦ କରନ୍ତୁ</string>\n    <string name=\"preferred_open_action_settings_title\">ପସନ୍ଦିତ \\'ଖୋଲା\\' କ୍ରିୟା</string>\n    <string name=\"preferred_open_action_settings_summary\">ବିଷୟବସ୍ତୁ ଖୋଲିବା ସମୟରେ ଡିଫଲ୍ଟ କାର୍ଯ୍ୟ -%s</string>\n    <string name=\"video_player\">ଭିଡିଓ ପ୍ଲେୟାର</string>\n    <string name=\"add_to_playlist\">ପ୍ଲେ ଲିଷ୍ଟରେ ଯୋଡନ୍ତୁ</string>\n    <string name=\"playlist_add_stream_success\">ତାଲିକାଭୁକ୍ତ</string>\n    <string name=\"resize_zoom\">ଜୁମ୍ କରନ୍ତୁ</string>\n    <string name=\"playlist_thumbnail_change_success\">ପ୍ଲେଲିଷ୍ଟ ଥମ୍ବନେଲ ବଦଳିଗଲା ।</string>\n    <string name=\"playlist_no_uploader\">ଅଟୋ-ଜେନେରେଟ୍ (କୌଣସି ଅପଲୋଡର୍ ମିଳିଲା ନାହିଁ)</string>\n    <string name=\"resize_fill\">ପୁରଣ କରନ୍ତୁ</string>\n    <string name=\"caption_setting_title\">କ୍ୟାପସନ୍</string>\n    <string name=\"show_crash_the_player_summary\">ପ୍ଲେୟାର ବ୍ୟବହାର କରିବା ସମୟରେ ଏକ କ୍ରାସ୍ ବିକଳ୍ପ ଦେଖାଏ</string>\n    <string name=\"check_new_streams\">ନୂତନ ଷ୍ଟ୍ରିମ୍ ପାଇଁ ଯାଞ୍ଚ ଚଲାନ୍ତୁ</string>\n    <string name=\"crash_the_app\">ଆପ୍ କ୍ରାସ୍ କରନ୍ତୁ</string>\n    <string name=\"show_error_snackbar\">ଏକ ତ୍ରୁଟି ସ୍ନାକବାର୍ ଦେଖାନ୍ତୁ</string>\n    <string name=\"subscriptions_import_unsuccessful\">ସଦସ୍ୟତା ଆମଦାନି କରିପାରିଲା ନାହିଁ</string>\n    <string name=\"subscriptions_export_unsuccessful\">ସଦସ୍ୟତା ରପ୍ତାନି କରିପାରିଲା ନାହିଁ</string>\n    <string name=\"import_soundcloud_instructions_hint\">ତୁମର ID, soundcloud.com/yourid</string>\n    <string name=\"percent\">ଶତକଡା</string>\n    <string name=\"semitone\">ସେମିଟୋନ୍</string>\n    <string name=\"minimize_on_exit_title\">ଆପ୍ ସୁଇଚ୍ ରେ କମ୍ କରନ୍ତୁ</string>\n    <string name=\"minimize_on_exit_summary\">ମୁଖ୍ୟ ଭିଡିଓ ପ୍ଲେୟାରରୁ ଅନ୍ୟ ଆପକୁ ସୁଇଚ୍ କରିବା ସମୟରେ କାର୍ଯ୍ୟ -%s</string>\n    <string name=\"minimize_on_exit_none_description\">କିଛି ନୁହେଁ</string>\n    <string name=\"minimize_on_exit_background_description\">ପୃଷ୍ଠଭୂମି ପ୍ଲେୟାରକୁ କମ୍ କରନ୍ତୁ</string>\n    <string name=\"minimize_on_exit_popup_description\">ପପ୍ଅପ୍ ପ୍ଲେୟାରକୁ ସର୍ବନିମ୍ନ କରନ୍ତୁ</string>\n    <string name=\"autoplay_summary\">ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଚଲାଇବା ଆରମ୍ଭ କରନ୍ତୁ -%s</string>\n    <string name=\"wifi_only\">କେବଳ ୱାଇ-ଫାଇରେ</string>\n    <string name=\"permission_denied\">କାର୍ଯ୍ୟ ସିଷ୍ଟମ ଦ୍ୱାରା ପ୍ରତ୍ୟାଖ୍ୟାନ</string>\n    <string name=\"download_failed\">ଡାଉନଲୋଡ୍ ବିଫଳ ହେଲା</string>\n    <string name=\"overwrite_unrelated_warning\">ଏହି ନାମ ସହିତ ଏକ ଫାଇଲ୍ ପୂର୍ବରୁ ବିଦ୍ୟମାନ ଅଛି</string>\n    <string name=\"error_timeout\">ସଂଯୋଗ ସମୟ ସମାପ୍ତ</string>\n    <string name=\"clear_download_history\">ଡାଉନଲୋଡ୍ ଇତିହାସ ସଫା କରନ୍ତୁ</string>\n    <string name=\"max_retry_desc\">ଡାଉନଲୋଡ୍ ବାତିଲ୍ କରିବା ପୂର୍ବରୁ ସର୍ବାଧିକ ସଂଖ୍ୟକ ଚେଷ୍ଟା</string>\n    <string name=\"remove_watched\">ଦେଖାଯାଇଥିବା ଅପସାରଣ କରନ୍ତୁ</string>\n    <string name=\"feed_groups_header_title\">ଚ୍ୟାନେଲ୍ ଗୋଷ୍ଠୀଗୁଡିକ</string>\n    <string name=\"feed_processing_message\">ଫିଡ୍ ପ୍ରକ୍ରିୟାକରଣ…</string>\n    <string name=\"feed_update_threshold_summary\">ଏକ ସଦସ୍ୟତା ପୂର୍ବରୁ ଶେଷ ଅଦ୍ୟତନ ପରେ ସମୟ ପୁରୁଣା ବୋଲି ବିବେଚନା କରାଯାଏ -%s</string>\n    <string name=\"feed_load_error\">ଫିଡ୍ ଲୋଡ୍ କରିବାରେ ତ୍ରୁଟି</string>\n    <string name=\"feed_load_error_fast_unknown\">ଫାଷ୍ଟ ଫିଡ୍ ମୋଡ୍ ଏହା ଉପରେ ଅଧିକ ସୂଚନା ପ୍ରଦାନ କରେ ନାହିଁ ।</string>\n    <string name=\"content_not_supported\">ଏହି ବିଷୟବସ୍ତୁ ଏପର୍ଯ୍ୟନ୍ତ NewPipe ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ ।\n\\n\n\\nଭବିଷ୍ୟତ ସଂସ୍କରଣରେ ଏହା ସମର୍ଥିତ ହେବ ବୋଲି ଆଶା କରୁଛି ।</string>\n    <string name=\"select_night_theme_toast\">ଆପଣ ନିମ୍ନରେ ଆପଣଙ୍କର ପ୍ରିୟ ରାତିର ଥିମ୍ ଚୟନ କରିପାରିବେ</string>\n    <string name=\"download_has_started\">ଡାଉନଲୋଡ୍ ଆରମ୍ଭ ହୋଇଛି</string>\n    <string name=\"metadata_tags\">ଟ୍ୟାଗ୍ସ</string>\n    <string name=\"get_notified\">ସୂଚିତ କର</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"selected_stream_external_player_not_supported\">ମନୋନୀତ ଷ୍ଟ୍ରିମ୍ ବହିଃ-ଚାଳକ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s ଜଣ ଶ୍ରୋତା</item>\n        <item quantity=\"other\">ମୋଟ %s ଜଣ ଶ୍ରୋତା</item>\n    </plurals>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s ଭିଡିଓ</item>\n        <item quantity=\"other\">ମୋଟ %s ଭିଡିଓ</item>\n    </plurals>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s ନୂଆ ଷ୍ଟ୍ରୀମ</item>\n        <item quantity=\"other\">ମୋଟ %s ନୂଆ ଷ୍ଟ୍ରୀମ</item>\n    </plurals>\n    <string name=\"sort\">ସଜାନ୍ତୁ</string>\n    <string name=\"app_update_available_notification_title\">NewPipe ଅଦ୍ୟତନ ଉପଲବ୍ଧ!</string>\n    <string name=\"fast_mode\">ଦ୍ରୁତ ମୋଡ୍</string>\n    <string name=\"import_subscriptions_hint\">3-ଡଟ୍ ମେନୁରୁ ସଦସ୍ୟତା ଆମଦାନୀ କିମ୍ବା ରପ୍ତାନି କରନ୍ତୁ</string>\n    <string name=\"app_update_unavailable_toast\">ଆପଣ NewPipe ର ସର୍ବଶେଷ ସଂସ୍କରଣ ଚଳାଉଛନ୍ତି</string>\n    <string name=\"app_update_available_notification_text\">%s ଡାଉନଲୋଡ୍ କରିବାକୁ ଟ୍ୟାପ୍ କରନ୍ତୁ</string>\n    <string name=\"night_theme_available\">ଥିମ୍ ପାଇଁ %s ଚୟନ ହେଲେ ହିଁ ଏହି ବିକଳ୍ପ ଉପଲବ୍ଧ</string>\n    <string name=\"card\">କାର୍ଡ</string>\n    <string name=\"msg_failed_to_copy\">କ୍ଲିପବୋର୍ଡରେ କପି କରିବାରେ ବିଫଳ</string>\n    <string name=\"unset_playlist_thumbnail\">ସ୍ଥାୟୀ ଥମ୍ୱନେଲ୍ ସେଟ୍ କରନ୍ତୁ</string>\n    <string name=\"duplicate_in_playlist\">ଧୂସର ହୋଇଯାଇଥିବା ପ୍ଲେଲିଷ୍ଟଗୁଡିକ ପୂର୍ବରୁ ଏହି ଆଇଟମ୍ ଧାରଣ କରିଥାଏ ।</string>\n    <string name=\"playlist_add_stream_success_duplicate\">ନକଲ %d ସମୟ (ମୋଟ) ଯୋଡି ହୋଇଛି</string>\n    <string name=\"ignore_hardware_media_buttons_title\">ହାର୍ଡୱେର୍ ମିଡିଆ ବଟନ୍ ଇଭେଣ୍ଟଗୁଡ଼ିକୁ ଉପେକ୍ଷା କରନ୍ତୁ</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">ଉପଯୋଗୀ, ଉଦାହରଣ ସ୍ୱରୂପ, ଯଦି ଆପଣ ଭଙ୍ଗା ଶାରୀରିକ ବଟନ୍ ସହିତ ହେଡସେଟ୍ ବ୍ୟବହାର କରୁଛନ୍ତି</string>\n    <string name=\"remove_duplicates\">ନକଲଗୁଡିକ ଅପସାରଣ କରନ୍ତୁ</string>\n    <string name=\"remove_duplicates_title\">ନକଲ ଗୁଡିକ ହଟାନ୍ତୁ\\?</string>\n    <string name=\"remove_duplicates_message\">ଆପଣ ଏହି ପ୍ଲେଲିଷ୍ଟରେ ଥିବା ସମସ୍ତ ନକଲ ଷ୍ଟ୍ରିମ୍ ଅପସାରଣ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\\?</string>\n    <string name=\"feed_hide_streams_title\">ନିମ୍ନଲିଖିତ ଷ୍ଟ୍ରିମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ</string>\n    <string name=\"feed_show_hide_streams\">ଷ୍ଟ୍ରିମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ/ଲୁଚାନ୍ତୁ</string>\n    <string name=\"feed_show_watched\">ପୁରା ଦେଖାଯାଇଛି</string>\n    <string name=\"feed_show_partially_watched\">ଆଂଶିକ ଦେଖାଯାଇଛି</string>\n    <string name=\"feed_show_upcoming\">ଆଗାମୀ</string>\n    <string name=\"left_gesture_control_summary\">ପ୍ଲେୟାର ସ୍କ୍ରିନର ବାମ ଅଧା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବାଛନ୍ତୁ</string>\n    <string name=\"left_gesture_control_title\">ବାମ ଅଙ୍ଗଭଙ୍ଗୀ କାର୍ଯ୍ୟ</string>\n    <string name=\"right_gesture_control_summary\">ପ୍ଲେୟାର ସ୍କ୍ରିନର ଡାହାଣ ଅଧା ପାଇଁ ଅଙ୍ଗଭଙ୍ଗୀ ବାଛନ୍ତୁ</string>\n    <string name=\"right_gesture_control_title\">ଡାହାଣ ଅଙ୍ଗଭଙ୍ଗୀ କାର୍ଯ୍ୟ</string>\n    <string name=\"brightness\">ଉଜ୍ଜ୍ୱଳତା</string>\n    <string name=\"volume\">ଭଲ୍ୟୁମ୍</string>\n    <string name=\"none\">କିଛି ନୁହେଁ</string>\n    <string name=\"main_tabs_position_summary\">ମୂଖ୍ୟ ଟ୍ୟାବ ଚୟନକର୍ତ୍ତାଙ୍କୁ ତଳ ଭାଗକୁ ଘୁଞ୍ଚାନ୍ତୁ</string>\n    <string name=\"main_tabs_position_title\">ମୂଖ୍ଯ ଟ୍ୟାବ ଅବସ୍ଥାନ</string>\n    <string name=\"settings_category_exoplayer_summary\">କିଛି ExoPlayer ବିନ୍ୟାସକୁ ପରିଚାଳନା କରନ୍ତୁ । ଏହି ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ପ୍ରଭାବୀ ହେବା ପାଇଁ ଗୋଟିଏ ଚାଳକକୁ ପୁନଃଚାଳନ କରିବା ଆବଶ୍ୟକ</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">ExoPlayer ର ଡିକୋଡର୍ ଫଲବ୍ୟାକ୍ ବୈଶିଷ୍ଟ୍ୟକୁ ବ୍ୟବହାର କରନ୍ତୁ</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">ଯଦି ଆପଣଙ୍କର ଡିକୋଡର ପ୍ରାରମ୍ଭିକ ସମସ୍ୟା ଅଛି ତେବେ ଏହି ବିକଳ୍ପକୁ ସକ୍ରିୟ କରନ୍ତୁ, ଯାହା ପ୍ରାଥମିକ ଡିକୋଡର ପ୍ରାରମ୍ଭିକତା ବିଫଳ ହେଲେ ନିମ୍ନ ପ୍ରାଥମିକତା ଡିକୋଡରକୁ ଫେରିଥାଏ । ପ୍ରାଥମିକ ଡିକୋଡର ବ୍ୟବହାର କରିବା ସମୟରେ ଏହା ଖରାପ ପ୍ଲେବ୍ୟାକ ପ୍ରଦର୍ଶନର କାରଣ ହୋଇପାରେ</string>\n    <string name=\"audio_track_name\">%1$s ଓ %2$s</string>\n    <string name=\"audio_track_type_descriptive\">ବର୍ଣ୍ଣନାତ୍ମକ</string>\n    <string name=\"audio_track_type_original\">ମୂଳ</string>\n    <string name=\"audio_track_type_dubbed\">ଡବିଙ୍ଗ୍ ହୋଇଛି</string>\n    <string name=\"prefer_original_audio_title\">ମୂଳ ଧ୍ୱନିକୁ ପସନ୍ଦ କରନ୍ତୁ</string>\n    <string name=\"prefer_original_audio_summary\">ଭାଷା ନିର୍ବିଶେଷରେ ମୂଳ ଧ୍ୱନି ଟ୍ରାକକୁ ବାଛନ୍ତୁ</string>\n    <string name=\"prefer_descriptive_audio_title\">ବର୍ଣ୍ଣନାମୂଳକ ଧ୍ୱନିକୁ ପସନ୍ଦ କରନ୍ତୁ</string>\n    <string name=\"play_queue_audio_track\">ଧ୍ୱନି: %s</string>\n    <string name=\"audio_track\">ଧ୍ୱନି ଟ୍ରାକ୍</string>\n    <string name=\"audio_track_present_in_video\">ଏହି ଧାରାରେ ଗୋଟିଏ ଧ୍ୱନୀ ଟ୍ରାକ ପୂର୍ବରୁ ଉପସ୍ଥିତ ହେବା ଉଚିତ</string>\n    <string name=\"select_audio_track_external_players\">ବାହ୍ୟ ଚାଳକମାନଙ୍କ ପାଇଁ ଧ୍ୱନୀ ଟ୍ରାକ ବାଛନ୍ତୁ</string>\n    <string name=\"unknown_audio_track\">ଅଜଣା</string>\n    <string name=\"prefer_descriptive_audio_summary\">ଉପଲବ୍ଧ ହେଲେ ଦୃଷ୍ଟିହୀନ ବ୍ୟକ୍ତିଙ୍କ ପାଇଁ ବର୍ଣ୍ଣନା ସହିତ ଗୋଟିଏ ଧ୍ୱନି ଟ୍ରାକ ଚୟନ କରନ୍ତୁ</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">ସର୍ବଦା ExoPlayer ର ଭିଡ଼ିଓ ଆଉଟପୁଟ୍ ପୃଷ୍ଠ ବିନ୍ୟାସ କାର୍ଯ୍ଯକ୍ଷେତ୍ରକୁ ବ୍ୟବହାର କରନ୍ତୁ</string>\n    <string name=\"disable_media_tunneling_automatic_info\">ଆପଣଙ୍କର ଡିଭାଇସରେ ଡିଫଲ୍ଟ ଭାବରେ ମିଡିଆ ସୁଡଙ୍ଗକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି କାରଣ ଆପଣଙ୍କର ଡିଭାଇସ ମଡେଲ ଏହାକୁ ସମର୍ଥନ କରୁନାହିଁ ବୋଲି ଜଣାଅଛି ।</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer ବିନ୍ୟାସଗୁଡ଼ିକ</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">ଏହି ୱାର୍କଆରାଉଣ୍ଡ ଭିଡିଓ କୋଡେକଗୁଡ଼ିକୁ ରିଲିଜ କରିଥାଏ ଏବଂ ପୁନଃସ୍ଥାପନ କରିଥାଏ ଯେତେବେଳେ ଗୋଟିଏ ପୃଷ୍ଠ ପରିବର୍ତ୍ତନ ହୋଇଥାଏ, ଭୂପୃଷ୍ଠକୁ ସିଧାସଳଖ କୋଡେକରେ ସେଟ କରିବା ପରିବର୍ତ୍ତେ । ଏହି ସମସ୍ୟା ସହିତ କିଛି ଉପକରଣରେ ExoPlayer ଦ୍ୱାରା ପୂର୍ବରୁ ବ୍ୟବହୃତ, ଏହି ସଂରଚନା କେବଳ ଆଣ୍ଡ୍ରଏଡ 6 ଏବଂ ଉଚ୍ଚତର ଉପରେ ପ୍ରଭାବ ପକାଇଥାଏ\n\\n\n\\nଏହି ବିକଳ୍ପକୁ ସକ୍ରିୟ କରିବା ସାମ୍ପ୍ରତିକ ଭିଡିଓ ପ୍ଲେୟାରକୁ ବଦଳାଇବା କିମ୍ବା ସମ୍ପୂର୍ଣ୍ଣ ପରଦାକୁ ପରିବର୍ତ୍ତନ କରିବା ସମୟରେ ପ୍ଲେବ୍ୟାକ ତ୍ରୁଟିକୁ ପ୍ରତିରୋଧ କରିପାରେ</string>\n    <string name=\"no_streams\">କୌଣସି ସ୍ରୋତ ନାହିଁ</string>\n    <string name=\"no_live_streams\">କୌଣସି ଲାଇଭ ଷ୍ଟ୍ରିମ୍ ନାହିଁ</string>\n    <string name=\"image_quality_title\">ପ୍ରତିଛବି ଗୁଣବତ୍ତା</string>\n    <string name=\"channel_tab_videos\">ଭିଡିଓଗୁଡିକ</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">ଗ୍ରାହକଗଣ</string>\n    <string name=\"show_channel_tabs_summary\">ଚ୍ୟାନେଲ ପୃଷ୍ଠାଗୁଡ଼ିକରେ କେଉଁ ଟ୍ୟାବଗୁଡ଼ିକ ଦେଖାଯାଏ</string>\n    <string name=\"show_channel_tabs\">ଚ୍ୟାନେଲ ଟ୍ୟାବଗୁଡ଼ିକ</string>\n    <string name=\"channel_tab_shorts\">ସର୍ଟସ୍</string>\n    <string name=\"loading_metadata_title\">ମେଟାଡାଟା ଧାରଣ କରୁଅଛି…</string>\n    <string name=\"toggle_screen_orientation\">ସ୍କ୍ରିନ୍ ଆରିଏଣ୍ଟେସନ୍ ଟୋଗଲ୍ କରନ୍ତୁ</string>\n    <string name=\"image_quality_low\">ନିମ୍ନମାନର</string>\n    <string name=\"toggle_fullscreen\">ଫୁଲ୍ ସ୍କ୍ରିନ୍ ଟୋଗଲ୍ କରନ୍ତୁ</string>\n    <string name=\"feed_fetch_channel_tabs\">ଚ୍ୟାନେଲ ଟ୍ୟାବଗୁଡ଼ିକୁ ଆଣନ୍ତୁ</string>\n    <string name=\"metadata_avatars\">ଅବତାର</string>\n    <string name=\"next_stream\">ପରବର୍ତ୍ତୀ ଷ୍ଟ୍ରିମ୍</string>\n    <string name=\"metadata_subchannel_avatars\">ଉପ-ଚାନେଲ ଅବତାରଗୁଡ଼ିକ</string>\n    <string name=\"open_play_queue\">ଖେଳ ଧାଡ଼ି ଖୋଲନ୍ତୁ</string>\n    <string name=\"image_quality_none\">ପ୍ରତିଛବିଗୁଡ଼ିକୁ ଧାରଣ କରନ୍ତୁ ନାହିଁ</string>\n    <string name=\"image_quality_high\">ଉଚ୍ଚ ଗୁଣବତ୍ତା</string>\n    <string name=\"channel_tab_about\">ବିଷୟରେ</string>\n    <string name=\"forward\">ଆଗକୁ</string>\n    <string name=\"channel_tab_albums\">ଆଲବମ୍</string>\n    <string name=\"rewind\">ପୁନରାବୃତ୍ତି କରନ୍ତୁ</string>\n    <string name=\"replay\">ପୁନର୍ବାର ଚଲାନ୍ତୁ</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">ଫିଡକୁ ଅଦ୍ୟତନ କରିବା ସମୟରେ ଆଣିବା ପାଇଁ ଟ୍ୟାବଗୁଡ଼ିକ । ଫାଷ୍ଟ ମୋଡ ବ୍ୟବହାର କରି ଚ୍ୟାନେଲକୁ ଅଦ୍ୟତନ କରାଗଲେ ଏହି ବିକଳ୍ପର କୌଣସି ପ୍ରଭାବ ପଡ଼ିବ ନାହିଁ ।</string>\n    <string name=\"image_quality_medium\">ମଧ୍ୟମ ଗୁଣବତ୍ତା</string>\n    <string name=\"metadata_uploader_avatars\">ଅପଲୋଡର ଅବତାରଗୁଡ଼ିକ</string>\n    <string name=\"metadata_banners\">ବ୍ୟାନରଗୁଡିକ</string>\n    <string name=\"channel_tab_playlists\">ପ୍ଲେଲିଷ୍ଟଗୁଡିକ</string>\n    <string name=\"image_quality_summary\">ତଥ୍ୟ ଏବଂ ସ୍ମୃତିଶକ୍ତି ବ୍ୟବହାରକୁ ହ୍ରାସ କରିବା ପାଇଁ ପ୍ରତିଛବିଗୁଡ଼ିକର ଗୁଣବତ୍ତା ଏବଂ ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ପ୍ରତିଛବିଗୁଡ଼ିକୁ ଧାରଣ କରିବା ଉଚିତ କି ନୁହଁ ବାଛନ୍ତୁ । ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ସ୍ମରଣୀୟ ଏବଂ ଡିସ୍କ ପ୍ରତିଛବି କ୍ୟାଶେ ଉଭୟକୁ ସଫା କରିଥାଏ — %s</string>\n    <string name=\"play\">ଚଲାନ୍ତୁ</string>\n    <string name=\"more_options\">ଅଧିକ ବିକଳ୍ପ</string>\n    <string name=\"metadata_thumbnails\">ଥମ୍ବନେଲଗୁଡିକ</string>\n    <string name=\"channel_tab_tracks\">ଟ୍ରାକଗୁଡିକ</string>\n    <string name=\"duration\">ଅବଧି</string>\n    <string name=\"channel_tab_channels\">ଚ୍ୟାନେଲଗୁଡିକ</string>\n    <string name=\"previous_stream\">ପୂର୍ବ ଷ୍ଟ୍ରିମ୍</string>\n    <string name=\"channel_tab_livestreams\">ଲାଇଭ୍</string>\n    <string name=\"share_playlist_with_list\">URL ତାଲିକା ସହଭାଗ କରନ୍ତୁ</string>\n    <string name=\"share_playlist_with_titles\">ଶୀର୍ଷକଗୁଡ଼ିକ ସହିତ ଅଂଶୀଦାର କରନ୍ତୁ</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">ଖେଳ ତାଲିକା ସହଭାଗ କରନ୍ତୁ</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"show_more\">ଅଧିକ ଦର୍ଶାନ୍ତୁ</string>\n    <string name=\"notification_actions_summary_android13\">ଏହା ଉପରେ ଟ୍ୟାପ କରି ନିମ୍ନରେ ଦିଆଯାଇଥିବା ପ୍ରତ୍ୟେକ ବିଜ୍ଞପ୍ତି କାର୍ଯ୍ୟକୁ ସମ୍ପାଦନ କରନ୍ତୁ । ପ୍ରଥମ ତିନୋଟି କାର୍ଯ୍ୟ (ଖେଳ/ବିରତି, ପୂର୍ବବର୍ତ୍ତୀ ଏବଂ ପରବର୍ତ୍ତୀ) ତନ୍ତ୍ର ଦ୍ୱାରା ସେଟ କରାଯାଇଥାଏ ଏବଂ ଏହାକୁ ଇଚ୍ଛାରୂପଣ କରାଯାଇପାରିବ ନାହିଁ ।</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s ଉତ୍ତର</item>\n        <item quantity=\"other\">%s ଉତ୍ତରଗୁଡ଼ିକ</item>\n    </plurals>\n    <string name=\"show_less\">କମ୍ ଦର୍ଶାନ୍ତୁ</string>\n    <string name=\"error_insufficient_storage\">ଉପକରଣରେ ପର୍ଯ୍ୟାପ୍ତ ଖାଲି ସ୍ଥାନ ନାହିଁ</string>\n    <string name=\"settings_category_backup_restore_title\">ବ୍ୟାକଅପ୍ ଏବଂ ପୁନରୁଦ୍ଧାର କରନ୍ତୁ</string>\n    <string name=\"yes\">ହଁ</string>\n    <string name=\"no\">ନା</string>\n    <string name=\"auto_update_check_description\">NewPipe ସ୍ୱୟଂଚାଳିତ ଭାବରେ ସମୟ ସମୟରେ ନୂତନ ସଂସ୍କରଣଗୁଡିକ ଯାଞ୍ଚ କରିପାରିବ ଏବଂ ଥରେ ଉପଲବ୍ଧ ହେବା ପରେ ଆପଣଙ୍କୁ ସୂଚିତ କରିପାରିବ ।\n\\nଆପଣ ଏହାକୁ ସକ୍ଷମ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି?</string>\n    <string name=\"reset_settings_title\">ସେଟିଂସମୂହ ପୁନଃସେଟ୍ କରନ୍ତୁ</string>\n    <string name=\"reset_settings_summary\">ସମସ୍ତ ସେଟିଂସମୂହକୁ ସେମାନଙ୍କର ଡିଫଲ୍ଟ ମୂଲ୍ୟରେ ପୁନଃସେଟ୍ କରନ୍ତୁ</string>\n    <string name=\"reset_all_settings\">ସମସ୍ତ ସେଟିଂସମୂହକୁ ପୁନଃ ସେଟ୍ କରିବା ଦ୍ବାରା ଆପଣଙ୍କର ସମସ୍ତ ପସନ୍ଦିତ ସେଟିଂସମୂହ ପରିତ୍ୟାଗ ହେବ ଏବଂ ଆପ୍ ପୁନଃ ସେଟ୍ଆରମ୍ଭ ହେବ ।\n\\n\n\\nଆପଣ ଆଗକୁ ବଢିବାକୁ ଚାହୁଁଛନ୍ତି କି?</string>\n    <string name=\"import_settings_vulnerable_format\">ଆମଦାନୀ ହେଉଥିବା ରପ୍ତାନିରେ ଥିବା ସେଟିଂସମୂହ ଏକ ଅସୁରକ୍ଷିତ ଫର୍ମାଟ୍ ବ୍ୟବହାର କରେ ଯାହା NewPipe 0.27.0 ପରଠାରୁ ପୁରୁଣା ହୋଇଯାଇଥିଲା । ନିଶ୍ଚିତ କରନ୍ତୁ ଯେ ଆମଦାନୀ ହେଉଥିବା ରପ୍ତାନି ଏକ ବିଶ୍ୱସ୍ତ ଉତ୍ସରୁ ଆସିଛି ଏବଂ ଭବିଷ୍ୟତରେ କେବଳ NewPipe 0.27.0 କିମ୍ବା ନୂତନରୁ ପ୍ରାପ୍ତ ରପ୍ତାନି ବ୍ୟବହାର କରିବାକୁ ପସନ୍ଦ କରନ୍ତୁ । ଏହି ଅସୁରକ୍ଷିତ ଫର୍ମାଟରେ ସେଟିଂସମୂହ ଆମଦାନି ପାଇଁ ସମର୍ଥନ ଶୀଘ୍ର ସମ୍ପୂର୍ଣ୍ଣ ରୂପେ ଅପସାରିତ ହେବ, ଏବଂ ତା’ପରେ ନୂତନ ପାଇପ୍ ର ପୁରୁଣା ସଂସ୍କରଣଗୁଡ଼ିକ ନୂତନ ସଂସ୍କରଣରୁ ରପ୍ତାନୀର ସେଟିଂସମୂହ ଆମଦାନୀ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ ।</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-pa/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਵੱਡਦਰਸ਼ੀ ਸ਼ੀਸ਼ੇ \\'ਤੇ ਟੈਪ ਕਰੋ।</string>\n    <string name=\"upload_date_text\">%1$s ਨੂੰ ਪ੍ਰਕਾਸ਼ਿਤ ਹੋਇਆ</string>\n    <string name=\"no_player_found\">ਸਟ੍ਰੀਮਿੰਗ ਲਈ ਪਲੇਅਰ ਨਹੀਂ ਮਿਲਿਆ। ਕੀ ਤੁਸੀਂ VLC ਸਥਾਪਤ ਕਰਨਾ ਚਾਹੋਗੇ?</string>\n    <string name=\"no_player_found_toast\">ਸਟ੍ਰੀਮਿੰਗ ਲਈ ਪਲੇਅਰ ਨਹੀਂ ਮਿਲਿਆ (ਤੁਸੀਂ ਇਸਨੂੰ ਚਲਾਉਣ ਲਈ VLC ਪਲੇਅਰ ਇੰਸਟਾਲ ਕਰ ਸਕਦੇ ਹੋ)।</string>\n    <string name=\"install\">ਇੰਸਟਾਲ ਕਰੋ</string>\n    <string name=\"cancel\">ਰੱਦ ਕਰੋ</string>\n    <string name=\"open_in_browser\">ਬ੍ਰਾਊਜ਼ਰ \\'ਚ ਖੋਲ੍ਹੋ</string>\n    <string name=\"open_in_popup_mode\">ਪੌਪ-ਅਪ ਮੋਡ \\'ਚ ਖੋਲ੍ਹੋ</string>\n    <string name=\"share\">ਸਾਂਝਾ ਕਰੋ</string>\n    <string name=\"download\">ਡਾਊਨਲੋਡ ਕਰੋ</string>\n    <string name=\"controls_download_desc\">ਸਟ੍ਰੀਮ ਫ਼ਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ</string>\n    <string name=\"search\">ਖੋਜ ਕਰੋ</string>\n    <string name=\"settings\">ਸੈਟਿੰਗਾਂ</string>\n    <string name=\"did_you_mean\">ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਸੀ \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">ਦੇ ਨਾਲ ਸਾਂਝਾ ਕਰੋ</string>\n    <string name=\"use_external_video_player_title\">ਬਾਹਰੀ ਵੀਡੀਓ ਪਲੇਅਰ ਦੀ ਵਰਤੋਂ ਕਰੋ</string>\n    <string name=\"use_external_video_player_summary\">ਕੁਝ ਰੈਜ਼ੋਲਿਊਸ਼ਨਾਂ \\'ਤੇ ਆਵਾਜ਼ ਹਟ ਸਕਦੀ ਹੈ</string>\n    <string name=\"use_external_audio_player_title\">ਬਾਹਰੀ ਆਡੀਓ ਪਲੇਅਰ ਦੀ ਵਰਤੋਂ ਕਰੋ</string>\n    <string name=\"subscribe_button_title\">ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ</string>\n    <string name=\"subscribed_button_title\">ਸਬਸਕ੍ਰਾਈਬ ਹੈ</string>\n    <string name=\"channel_unsubscribed\">ਚੈਨਲ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਹੋਇਆ</string>\n    <string name=\"subscription_change_failed\">ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਨੂੰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</string>\n    <string name=\"show_info\">ਜਾਣਕਾਰੀ ਵਿਖਾਓ</string>\n    <string name=\"subscription_update_failed\">ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਅਪਡੇਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</string>\n    <string name=\"tab_subscriptions\">ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ</string>\n    <string name=\"tab_bookmarks\">ਬੁੱਕਮਾਰਕ ਕੀਤੀਆਂ ਪਲੇਲਿਸਟਾਂ</string>\n    <string name=\"fragment_feed_title\">ਨਵਾਂ ਕੀ ਹੈ</string>\n    <string name=\"controls_background_title\">ਬੈਕਗ੍ਰਾਊਂਡ</string>\n    <string name=\"controls_popup_title\">ਪੌਪ-ਅਪ</string>\n    <string name=\"controls_add_to_playlist_title\">ਦੇ ਵਿੱਚ ਜੋੜ੍ਹੋ</string>\n    <string name=\"download_path_title\">ਵੀਡੀਓ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ</string>\n    <string name=\"download_path_summary\">ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਇੱਥੇ ਜਮ੍ਹਾਂ ਹੁੰਦੀਆਂ ਹਨ</string>\n    <string name=\"download_path_dialog_title\">ਵੀਡੀਓ ਫ਼ਾਈਲਾਂ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੁਣੋ</string>\n    <string name=\"download_path_audio_title\">ਆਡੀਓ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ</string>\n    <string name=\"download_path_audio_summary\">ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਆਡੀਓ ਫ਼ਾਈਲਾਂ ਇੱਥੇ ਜਮ੍ਹਾਂ ਹੁੰਦੀਆਂ ਹਨ</string>\n    <string name=\"download_path_audio_dialog_title\">ਆਡੀਓ ਫ਼ਾਈਲਾਂ ਲਈ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੁਣੋ</string>\n    <string name=\"default_resolution_title\">ਡਿਫ਼ਾਲਟ ਰੈਜ਼ੋਲਿਊਸ਼ਨ</string>\n    <string name=\"default_popup_resolution_title\">ਪੌਪ-ਅਪ ਲਈ ਡਿਫ਼ਾਲਟ ਰੈਜ਼ੋਲਿਊਸ਼ਨ</string>\n    <string name=\"show_higher_resolutions_title\">ਉੱਚ ਰੈਜ਼ੋਲਿਊਸ਼ਨਾਂ ਵਿਖਾਓ</string>\n    <string name=\"show_higher_resolutions_summary\">ਸਿਰਫ਼ ਕੁਝ ਹੀ ਡਿਵਾਈਸ 2K/4K ਵਿੱਚ ਵੀਡੀਓ ਚਲਾ ਸਕਦੇ ਹਨ</string>\n    <string name=\"play_with_kodi_title\">Kodi ਵਿੱਚ ਚਲਾਓ</string>\n    <string name=\"kore_not_found\">ਗੈਰ ਮੌਜੂਦਾ Kore ਐਪ ਨੂੰ ਇੰਸਟਾਲ ਕਰੋ?</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi ਵਿੱਚ ਚਲਾਓ\\\" ਦਾ ਵਿਕਲਪ ਵਿਖਾਓ</string>\n    <string name=\"show_play_with_kodi_summary\">ਕੋਡੀ ਮੀਡੀਆ ਸੈਂਟਰ ਰਾਹੀਂ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਇੱਕ ਵਿਕਲਪ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ</string>\n    <string name=\"play_audio\">ਆਡੀਓ</string>\n    <string name=\"default_audio_format_title\">ਡੀਫ਼ਾਲਟ ਆਡੀਓ ਫ਼ਾਰਮੈਟ</string>\n    <string name=\"default_video_format_title\">ਡੀਫ਼ਾਲਟ ਵੀਡੀਓ ਫ਼ਾਰਮੈਟ</string>\n    <string name=\"theme_title\">ਥੀਮ</string>\n    <string name=\"light_theme_title\">ਸਫ਼ੈਦ</string>\n    <string name=\"dark_theme_title\">ਗੂੜ੍ਹਾ</string>\n    <string name=\"black_theme_title\">ਕਾਲ਼ਾ</string>\n    <string name=\"popup_remember_size_pos_title\">ਪੌਪ-ਅਪ ਦਾ ਆਕਾਰ ਅਤੇ ਸਥਿਤੀ ਯਾਦ ਰੱਖੋ</string>\n    <string name=\"popup_remember_size_pos_summary\">ਪੌਪ-ਅਪ ਦਾ ਆਖਰੀ ਆਕਾਰ ਅਤੇ ਸਥਿਤੀ ਯਾਦ ਰੱਖੋ</string>\n    <string name=\"use_inexact_seek_title\">ਤੇਜ਼ ਤੇ ਅਣਸਟੀਕ ਭਾਲ ਦੀ ਵਰਤੋਂ ਕਰੋ</string>\n    <string name=\"use_inexact_seek_summary\">ਅਣਸਟੀਕ ਭਾਲ ਨਾਲ ਪਲੇਅਰ ਘੱਟ ਸਟੀਕਤਾ ਦੇ ਪਰ ਅਧਿਕ ਤੇਜ਼ੀ ਨਾਲ ਵੀਡੀਓ ਸਥਿੱਤੀਆਂ ਦੀ ਤਲਾਸ਼ ਕਰ ਸਕਦਾ ਹੈ । ਇਸ ਨਾਲ ਅੱਗੇ-ਪਿੱਛੇ 5, 15 ਜਾਂ 25 ਸਕਿੰਟ ਲਿਜਾਣਾ ਕੰਮ ਨਹੀਂ ਕਰਦਾ ਹੈ</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">ਚਿੱਤਰ ਕੈਸ਼ ਮਿਟਾਇਆ ਗਿਆ</string>\n    <string name=\"metadata_cache_wipe_title\">ਕੈਸ਼ ਕੀਤਾ ਮੈਟਾ-ਡਾਟਾ ਮਿਟਾਓ</string>\n    <string name=\"metadata_cache_wipe_summary\">ਵੈੱਬ-ਪੇਜਾਂ ਦਾ ਕੈਸ਼ ਕੀਤਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">ਮੈਟਾ-ਡਾਟਾ ਕੈਸ਼ੇ ਮਿਟਾਇਆ ਗਿਆ</string>\n    <string name=\"auto_queue_title\">ਅਗਲੀ ਸਟ੍ਰੀਮ ਨੂੰ ਆਟੋ-ਕਤਾਰਬੱਧ ਕਰੋ</string>\n    <string name=\"auto_queue_summary\">ਇੱਕ ਮੁੱਕਣ ਵਾਲੀ ਪਰ ਨਾ-ਦੁਹਰਾਉਣ ਵਾਲੀ ਪਲੇਅਬੈਕ ਕਤਾਰ ਨੂੰ ਸੰਬੰਧਤ ਸਟ੍ਰੀਮ ਜੋੜਦੇ ਹੋਏ ਜਾਰੀ ਰੱਖੋ</string>\n    <string name=\"show_search_suggestions_title\">ਖੋਜ ਸੁਝਾਅ</string>\n    <string name=\"show_search_suggestions_summary\">ਖੋਜ ਕਰਨ ਵੇਲੇ ਵਿਖਾਏ ਜਾਂਦੇ ਸੁਝਾਵਾਂ ਦੀ ਚੋਣ ਕਰੋ</string>\n    <string name=\"enable_search_history_title\">ਖੋਜ ਇਤਿਹਾਸ</string>\n    <string name=\"enable_search_history_summary\">ਖੋਜ ਇਤਲਾਹਾਂ ਨੂੰ ਸਥਾਨਕ ਤੌਰ ਤੇ ਸਟੋਰ ਕਰੋ</string>\n    <string name=\"enable_watch_history_title\">ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦੀ ਸੂਚੀ</string>\n    <string name=\"enable_watch_history_summary\">ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦੀ ਸੂਚੀ ਰੱਖੋ</string>\n    <string name=\"resume_on_audio_focus_gain_title\">ਚਲਾਉਣਾ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">ਵਿਘਨਾਂ (ਜਿਵੇਂ ਕਿ ਫ਼ੋਨ-ਕਾਲਾਂ) ਤੋਂ ਬਾਅਦ ਚਲਾਉਣਾ ਜਾਰੀ ਰੱਖੋ</string>\n    <string name=\"download_dialog_title\">ਡਾਊਨਲੋਡ</string>\n    <string name=\"show_next_and_similar_title\">\\'ਅਗਲੇ\\' ਤੇ \\'ਸਬੰਧਤ\\' ਵੀਡੀਓ ਵਿਖਾਓ</string>\n    <string name=\"show_hold_to_append_title\">\\\"ਕਤਾਰਬੱਧ ਕਰਨ ਵਾਸਤੇ ਦਬਾ ਕੇ ਰੱਖੋ\\\" ਵਿਖਾਓ</string>\n    <string name=\"show_hold_to_append_summary\">ਵੀਡੀਓ ਦੇ ਵੇਰਵੇ ਪੰਨੇ \\'ਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਜਾਂ ਪੌਪ-ਅਪ ਬਟਨ ਨੱਪਣ \\'ਤੇ ਸੁਝਾਅ ਵਿਖਾਓ</string>\n    <string name=\"unsupported_url\">ਅਣ-ਸਹਾਇਕ URL</string>\n    <string name=\"default_content_country_title\">ਸਮੱਗਰੀ ਦਾ ਮੂਲ ਦੇਸ਼</string>\n    <string name=\"settings_category_player_title\">ਪਲੇਅਰ</string>\n    <string name=\"settings_category_player_behavior_title\">ਵਿਵਹਾਰ</string>\n    <string name=\"settings_category_video_audio_title\">ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ</string>\n    <string name=\"settings_category_history_title\">ਇਤਿਹਾਸ ਅਤੇ ਕੈਸ਼-ਭੰਡਾਰ</string>\n    <string name=\"settings_category_appearance_title\">ਦਿੱਖ</string>\n    <string name=\"settings_category_debug_title\">ਡੀ-ਬੱਗ</string>\n    <string name=\"background_player_playing_toast\">ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ</string>\n    <string name=\"popup_playing_toast\">ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ</string>\n    <string name=\"content\">ਸਮੱਗਰੀ</string>\n    <string name=\"show_age_restricted_content_title\">ਉਮਰ ਮੁਤਾਬਕ ਪਾਬੰਦੀਸ਼ੁਦਾ ਸਮੱਗਰੀ ਵਿਖਾਓ</string>\n    <string name=\"duration_live\">ਲਾਈਵ</string>\n    <string name=\"downloads\">ਡਾਊਨਲੋਡਸ</string>\n    <string name=\"downloads_title\">ਡਾਊਨਲੋਡਸ</string>\n    <string name=\"error_report_title\">Error ਰਿਪੋਰਟ</string>\n    <string name=\"all\">ਸਾਰੇ</string>\n    <string name=\"disabled\">ਬੰਦ ਕੀਤਾ</string>\n    <string name=\"clear\">ਸਾਫ ਕਰੋ</string>\n    <string name=\"best_resolution\">ਵਧੀਆ ਰੈਜ਼ੋਲਿਊਸ਼ਨ</string>\n    <string name=\"undo\">ਅਣ-ਕੀਤਾ ਕਰੋ</string>\n    <string name=\"play_all\">ਸਾਰੇ ਚਲਾਓ</string>\n    <string name=\"always\">ਹਮੇਸ਼ਾਂ</string>\n    <string name=\"just_once\">ਸਿਰਫ਼ ਇਸ ਬਾਰ</string>\n    <string name=\"file\">ਫਾਈਲ</string>\n    <string name=\"notification_channel_name\">ਨਿਊਪਾਈਪ ਨੋਟੀਫਿਕੇਸ਼ਨ</string>\n    <string name=\"notification_channel_description\">ਨਿਊਪਾਈਪ ਦੇ ਪਲੇਅਰ ਦੇ ਲਈ ਨੋਟੀਫਿਕੇਸ਼ਨ</string>\n    <string name=\"unknown_content\">[ਅਣਜਾਣ]</string>\n    <string name=\"switch_to_background\">ਬੈਕਗ੍ਰਾਊਂਡ ਮੋਡ ਵਿੱਚ ਚਲਾਓ</string>\n    <string name=\"switch_to_popup\">ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਚਲਾਓ</string>\n    <string name=\"switch_to_main\">ਮੇਨ ਤੇ ਚਲਾਓ</string>\n    <string name=\"import_data_title\">ਡਾਟਾਬੇਸ ਆਯਾਤ ਕਰੋ</string>\n    <string name=\"export_data_title\">ਡਾਟਾਬੇਸ ਨਿਰਯਾਤ ਕਰੋ</string>\n    <string name=\"import_data_summary\">ਤੁਹਾਡੇ ਮੌਜੂਦਾ ਇਤਿਹਾਸ, ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ, ਪਲੇਲਿਸਟਾਂ ਅਤੇ (ਚੋਣਵੇਂ ਤੌਰ \\'ਤੇ) ਸੈਟਿੰਗਾਂ ਨੂੰ ਨਵੀਆਂ ਨਾਲ ਬਦਲ ਦਿੰਦਾ ਹੈ</string>\n    <string name=\"export_data_summary\">ਇਤਿਹਾਸ, ਸੁਬਸਕ੍ਰਿਪਸ਼ਨਾਂ, ਪਲੇਲਿਸਟਾਂ ਅਤੇ ਸੈਟਿੰਗਾਂ ਨਿਰਯਾਤ ਕਰੋ</string>\n    <string name=\"clear_views_history_title\">ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦੀ ਸੂਚੀ ਮਿਟਾਓ</string>\n    <string name=\"clear_views_history_summary\">ਚਲਾਈਆਂ ਗਈਆਂ ਸਟ੍ਰੀਮਾਂ ਦੇ ਇਤਿਹਾਸ ਅਤੇ ਪਲੇ-ਸਥਿਤੀਆਂ ਨੂੰ ਮਿਟਾਉਂਦਾ ਹੈ</string>\n    <string name=\"delete_view_history_alert\">ਕੀ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇ\\?</string>\n    <string name=\"clear_search_history_title\">ਖੋਜ ਸੂਚੀ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾਓ</string>\n    <string name=\"clear_search_history_summary\">ਖੋਜ ਸ਼ਬਦਾਂ ਦੀ ਸੂਚੀ ਮਿਟਾਉਂਦਾ ਹੈ</string>\n    <string name=\"delete_search_history_alert\">ਕੀ ਸਾਰੀ ਖੋਜ ਸੂਚੀ ਮਿਟਾ ਦਿੱਤੀ ਜਾਵੇ \\?</string>\n    <string name=\"search_history_deleted\">ਖੋਜ ਸੂਚੀ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ</string>\n    <string name=\"general_error\">ਤਰੁੱਟੀ</string>\n    <string name=\"network_error\">ਨੈੱਟਵਰਕ ਤਰੁੱਟੀ</string>\n    <string name=\"could_not_load_thumbnails\">ਸਾਰੇ ਥੰਮਨੇਲ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੇ</string>\n    <string name=\"parsing_error\">ਵੈਬਸਾਈਟ parse ਨਹੀਂ ਹੋ ਸਕੀ</string>\n    <string name=\"content_not_available\">ਸਮੱਗਰੀ ਉਪਲਬਧ ਨਹੀਂ ਹੈ</string>\n    <string name=\"could_not_setup_download_menu\">ਡਾਊਨਲੋਡ ਮੀਨੂੰ ਸੈਟ-ਅਪ ਨਹੀਂ ਹੋ ਸਕਿਆ</string>\n    <string name=\"app_ui_crash\">ਐਪ/UI ਕਰੈਸ਼ ਹੋ ਗਈ</string>\n    <string name=\"player_stream_failure\">ਇਸ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</string>\n    <string name=\"player_unrecoverable_failure\">ਅਣਚਾਹੀ ਪਲੇਅਰ ਤਰੁੱਟੀ ਆਈ ਹੈ</string>\n    <string name=\"player_recoverable_failure\">ਪਲੇਅਰ ਤਰੁੱਟੀ ਤੋਂ ਮੁੜ-ਸੁਰਜੀਤ ਹੋ ਰਿਹਾ ਹੈ</string>\n    <string name=\"external_player_unsupported_link_type\">ਬਾਹਰੀ ਪਲੇਅਰ ਇਸ ਕਿਸਮ ਦੇ ਲਿੰਕਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੇ</string>\n    <string name=\"video_streams_empty\">ਕੋਈ ਵੀਡੀਓ ਸਟ੍ਰੀਮ ਨਹੀਂ ਮਿਲੀ</string>\n    <string name=\"audio_streams_empty\">ਕੋਈ ਆਡੀਓ ਸਟ੍ਰੀਮ ਨਹੀਂ ਮਿਲੀ</string>\n    <string name=\"invalid_directory\">ਅਜਿਹਾ ਕੋਈ ਫੋਲਡਰ ਨਹੀਂ</string>\n    <string name=\"invalid_source\">ਅਜਿਹਾ ਕੋਈ ਫਾਈਲ/ਸਮੱਗਰੀ ਸਰੋਤ ਨਹੀਂ ਹੈ</string>\n    <string name=\"invalid_file\">ਫਾਈਲ ਮੌਜੂਦ ਨਹੀਂ ਹੈ ਜਾਂ ਇਸ ਨੂੰ ਪੜ੍ਹਨ ਜਾਂ ਲਿਖਣ ਦੀ ਆਗਿਆ ਨਹੀਂ ਹੈ</string>\n    <string name=\"file_name_empty_error\">ਫਾਈਲ ਨਾਮ ਖਾਲੀ ਨਹੀਂ ਹੋ ਸਕਦਾ</string>\n    <string name=\"error_occurred_detail\">ਇੱਕ ਤਰੁੱਟੀ ਆਈ ਹੈ: %1$s</string>\n    <string name=\"no_streams_available_download\">ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਕੋਈ ਸਟ੍ਰੀਮ ਉਪਲਬਧ ਨਹੀਂ ਹੈ</string>\n    <string name=\"sorry_string\">ਮੁਆਫ ਕਰਨਾ, ਅਜਿਹਾ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਸੀ।</string>\n    <string name=\"error_report_button_text\">ਈ-ਮੇਲ ਦੁਆਰਾ ਇਤਲਾਹ ਦਿਓ</string>\n    <string name=\"error_snackbar_message\">ਅਫ਼ਸੋਸ ਹੈ, ਕੁਝ ਤਰੁੱਟੀਆਂ ਸਾਹਮਣੇ ਆਈਆਂ ਹਨ।</string>\n    <string name=\"error_snackbar_action\">ਇਤਲਾਹ ਕਰੋ</string>\n    <string name=\"what_device_headline\">ਜਾਣਕਾਰੀ:</string>\n    <string name=\"what_happened_headline\">ਕੀ ਹੋਇਆ ਹੈ:</string>\n    <string name=\"info_labels\">ਕੀ:\\nRequest:\\nContent ਭਾਸ਼ਾ/ਬੋਲੀ:\\nContent Country:\\nApp ਭਾਸ਼ਾ/ਬੋਲੀ:\\nService:\\nGMT ਸਮਾਂ:\\nPackage:\\nVersion:\\nOS version:</string>\n    <string name=\"your_comment\">ਤੁਹਾਡੀ ਟਿੱਪਣੀ (ਅੰਗਰੇਜ਼ੀ ਵਿਚ):</string>\n    <string name=\"error_details_headline\">ਵੇਰਵੇ:</string>\n    <string name=\"detail_thumbnail_view_description\">ਵੀਡੀਓ ਚਲਾਓ, ਮਿਆਦ:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">ਅਪਲੋਡਰ ਦਾ ਅਵਤਾਰ ਥੰਮਨੇਲ</string>\n    <string name=\"detail_likes_img_view_description\">ਪਸੰਦਾਂ</string>\n    <string name=\"detail_dislikes_img_view_description\">ਨਾਪਸੰਦਾਂ</string>\n    <string name=\"search_no_results\">ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ</string>\n    <string name=\"empty_list_subtitle\">ਇਥੇ ਦਾ ਖਾਲੀਪਣ ਦੂਰ ਕਰਨ ਲਈ ਕੁਝ ਸਰਚ ਕਰੋ ਜਾਂ ਚੈਨਲ ਸਬਸਕ੍ਰਾਇਬ ਕਰੋ ਅਤੇ ਪਲੇਲਿਸਟ ਬਣਾ ਕੇ ਕੋਈ ਵੀਡੀਓ ਬੁੱਕਮਾਰਕ ਕਰੋ</string>\n    <string name=\"detail_drag_description\">ਮੁੜ-ਕ੍ਰਮਬੱਧ ਕਰਨ ਲਈ ਡਰੈਗ ਕਰੋ</string>\n    <string name=\"video\">ਵੀਡੀਓ</string>\n    <string name=\"audio\">ਆਡੀਓ</string>\n    <string name=\"retry\">ਦੋਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</string>\n    <string name=\"no_subscribers\">ਕੋਈ ਸਬਸਕ੍ਰਾਈਬਰ ਨਹੀਂ</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s ਸਬਸਕ੍ਰਾਈਬਰ</item>\n        <item quantity=\"other\">%s ਸਬਸਕ੍ਰਾਈਬਰਸ</item>\n    </plurals>\n    <string name=\"no_views\">ਕੋਈ ਵਿਊ ਨਹੀਂ</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s ਵਿਊ</item>\n        <item quantity=\"other\">%s ਵਿਊਜ਼</item>\n    </plurals>\n    <string name=\"no_videos\">ਕੋਈ ਵੀਡੀਓ ਨਹੀਂ</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s ਵੀਡੀਓ</item>\n        <item quantity=\"other\">%s ਵੀਡੀਓਜ਼</item>\n    </plurals>\n    <string name=\"start\">ਸ਼ੁਰੂ ਕਰੋ</string>\n    <string name=\"pause\">ਰੋਕੋ</string>\n    <string name=\"create\">ਬਣਾਓ</string>\n    <string name=\"delete\">ਮਿਟਾਓ</string>\n    <string name=\"checksum\">ਚੈੱਕ-ਸਮ</string>\n    <string name=\"dismiss\">ਖਾਰਿਜ ਕਰੋ</string>\n    <string name=\"rename\">ਨਾਮ ਬਦਲੋ</string>\n    <string name=\"ok\">ਠੀਕ ਹੈ</string>\n    <string name=\"msg_name\">ਫਾਈਲ ਦਾ ਨਾਮ</string>\n    <string name=\"msg_threads\">ਥਰੈੱਡ</string>\n    <string name=\"msg_error\">ਤਰੁੱਟੀ</string>\n    <string name=\"msg_running\">ਨਿਊਪਾਈਪ ਡਾਊਨਲੋਡ ਕਰ ਰਹੀ ਹੈ</string>\n    <string name=\"msg_running_detail\">ਵੇਰਵਿਆਂ ਲਈ ਟੈਪ ਕਰੋ</string>\n    <string name=\"msg_wait\">ਕ੍ਰਿਪਾ ਕਰਕੇ ਉਡੀਕ ਕਰੋ…</string>\n    <string name=\"msg_copied\">ਕਲਿਪ-ਬੋਰਡ ਵਿੱਚ ਕਾਪੀ ਹੋ ਗਿਆ ਹੈ</string>\n    <string name=\"no_available_dir\">ਬਾਅਦ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਵਿਚੋਂ ਇੱਕ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਨੂੰ ਚੁਣੋ</string>\n    <string name=\"msg_popup_permission\">ਪੌਪ-ਅਪ ਮੋਡ ਵਿੱਚ ਖੋਲ੍ਹਣ ਵਾਸਤੇ\\nਇਸ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਹੈ</string>\n    <string name=\"one_item_deleted\">1 ਆਈਟਮ ਮਿਟਾਈ ਗਈ।</string>\n    <string name=\"title_activity_recaptcha\">ReCaptcha ਚੁਣੌਤੀ</string>\n    <string name=\"recaptcha_request_toast\">ReCaptcha ਚੁਣੌਤੀ ਲਈ ਬੇਨਤੀ</string>\n    <string name=\"settings_category_downloads_title\">ਡਾਊਨਲੋਡ</string>\n    <string name=\"settings_file_charset_title\">ਫਾਈਲ ਨਾਮ ਵਿੱਚ ਪ੍ਰਵਾਨਿਤ ਅੱਖਰ</string>\n    <string name=\"settings_file_replacement_character_summary\">ਗਲਤ ਅੱਖਰ ਇਸ ਚਿੰਨ ਨਾਲ ਤਬਦੀਲ ਕੀਤੇ ਜਾਣਗੇ</string>\n    <string name=\"settings_file_replacement_character_title\">ਵਟਾਂਦਰਾ ਚਿੰਨ</string>\n    <string name=\"charset_letters_and_digits\">ਅੱਖਰ ਅਤੇ ਅੰਕ</string>\n    <string name=\"charset_most_special_characters\">ਬਹੁਤੇ ਖ਼ਾਸ ਅੱਖਰ</string>\n    <string name=\"title_activity_about\">ਨਿਊਪਾਈਪ ਬਾਰੇ ਵਿੱਚ ਜਾਣੋ</string>\n    <string name=\"title_licenses\">ਤੀਜੀ ਧਿਰ ਦੇ ਲਾਈਸੈਂਸ</string>\n    <string name=\"copyright\" formatted=\"true\">%2$s ਵੱਲੋਂ © %1$s , %3$s ਅਧੀਨ</string>\n    <string name=\"tab_about\">ਐਪ ਬਾਰੇ ਤੇ ਆਮ ਸਵਾਲ</string>\n    <string name=\"tab_licenses\">ਲਾਈਸੈਂਸ</string>\n    <string name=\"app_description\">ਐਂਡਰਾਇਡ ਦੇ ਲਈ ਹਲਕੀ ਅਤੇ ਮੁਫ਼ਤ ਸਟ੍ਰੀਮਿੰਗ ਐਪਲੀਕੇਸ਼ਨ।</string>\n    <string name=\"contribution_title\">ਯੋਗਦਾਨ ਪਾਓ</string>\n    <string name=\"contribution_encouragement\">ਭਾਵੇਂ ਤੁਹਾਡੇ ਕੋਲ ਵਿਚਾਰ ਹਨ; ਅਨੁਵਾਦ, ਡਿਜ਼ਾਈਨ ਬਦਲਾਵ, ਕੋਡ ਦੀ ਸਫਾਈ, ਜਾਂ ਅਸਲ ਭਾਰੀ ਕੋਡ ਬਦਲਾਵ — ਹਰ ਮਦਦ ਦਾ ਸਦਾ ਸਵਾਗਤ ਹੈ। ਜਿੰਨਾ ਇਸ ਨੂੰ ਜ਼ਿਆਦਾ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਉੱਨਾ ਹੀ ਇਹ ਬਿਹਤਰ ਹੁੰਦਾ ਹੈ!</string>\n    <string name=\"view_on_github\">ਗਿਟਹੱਬ ਤੇ ਵੇਖੋ</string>\n    <string name=\"donation_title\">ਦਾਨ ਕਰੋ</string>\n    <string name=\"donation_encouragement\">ਨਿਊਪਾਈਪ ਵਲੰਟੀਅਰਾਂ ਦੁਆਰਾ ਵਿਕਸਤ ਕੀਤੀ ਗਈ ਹੈ ਜੋ ਤੁਹਾਡੇ ਲਈ ਬਿਹਤਰ ਵਰਤੋਂਕਾਰ ਤਜ਼ਰਬਾ ਲਿਆਉਣ ਲਈ ਸਮਾਂ ਬਿਤਾਉਂਦੇ ਹਨ। ਡਿਵੈਲਪਰਾਂ ਵਾਸਤੇ ਇੱਕ ਕੱਪ ਕਾਫ਼ੀ ਖ਼ਰੀਦ ਦਿਓ ਤਾਂ ਕਿ ਇਸਦਾ ਆਨੰਦ ਲੈਂਦੇ ਹੋਏ ਉਹ ਨਿਊਪਾਈਪ ਨੂੰ ਹੋਰ ਵਧੀਆ ਬਣਾ ਸਕਣ।</string>\n    <string name=\"give_back\">ਵਾਪਸ ਦਿਓ</string>\n    <string name=\"website_title\">ਵੈੱਬਸਾਈਟ</string>\n    <string name=\"website_encouragement\">ਵਧੇਰੇ ਜਾਣਕਾਰੀ ਅਤੇ ਖ਼ਬਰਾਂ ਲਈ ਨਿਊਪਾਈਪ ਵੈੱਬਸਾਈਟ ਵੇਖੋ।</string>\n    <string name=\"app_license_title\">ਨਿਊਪਾਈਪ ਲਾਈਸੈਂਸ</string>\n    <string name=\"app_license\">ਨਿਊਪਾਈਪ ਇੱਕ ਕਾਪੀਲਿਫਟ ਮੁਫ਼ਤ ਸਾਫਟਵੇਅਰ ਹੈ। ਤੁਸੀਂ ਇਸ ਦੀ ਵਰਤੋਂ, ਇਸ ਦਾ ਅਧਿਐਨ ਅਤੇ ਇਸ ਨੂੰ ਸਾਂਝਾ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਇਸ ਵਿੱਚ ਆਪਣੀ ਮਰਜ਼ੀ ਅਨੁਸਾਰ ਸੁਧਾਰ ਸਕਦੇ ਹੋ। ਖਾਸ ਤੌਰ \\'ਤੇ ਤੁਸੀਂ ਇਸ ਨੂੰ GNU ਜਨਰਲ ਪਬਲਿਕ ਲਾਈਸੈਂਸ ਦੀਆਂ ਸ਼ਰਤਾਂ ਦੇ ਅਧੀਨ ਵੰਡ ਸਕਦੇ ਹੋ / ਜਾਂ ਸੰਸ਼ੋਧਿਤ ਕਰ ਸਕਦੇ ਹੋ ਜਿਵੇਂ ਕਿ ਮੁਫਤ ਸਾਫਟਵੇਅਰ ਫਾਊਂਡੇਸ਼ਨ ਦੁਆਰਾ ਪ੍ਰਕਾਸ਼ਤ ਕੀਤਾ ਗਿਆ ਹੈ, ਜਾਂ ਤਾਂ ਲਾਈਸੈਂਸ ਦਾ ਵਰਜ਼ਨ 3, ਜਾਂ (ਤੁਹਾਡੇ ਵਿਕਲਪ \\'ਤੇ) ਬਾਅਦ ਦਾ ਕੋਈ ਸੰਸਕਰਣ।</string>\n    <string name=\"read_full_license\">ਲਾਈਸੈਂਸ ਪੜ੍ਹੋ</string>\n    <string name=\"title_activity_history\">ਇਤਿਹਾਸ</string>\n    <string name=\"action_history\">ਇਤਿਹਾਸ</string>\n    <string name=\"delete_item_search_history\">ਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਖੋਜ ਇਤਿਹਾਸ ਵਿੱਚੋਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\\?</string>\n    <string name=\"title_last_played\">ਆਖਰੀ ਚਲਾਈ ਗਈ</string>\n    <string name=\"title_most_played\">ਸਭ ਤੋਂ ਜਿਆਦਾ ਚਲਾਈ ਗਈ</string>\n    <string name=\"main_page_content\">ਮੁੱਖ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ</string>\n    <string name=\"blank_page_summary\">ਖ਼ਾਲੀ ਪੰਨਾ</string>\n    <string name=\"kiosk_page_summary\">ਕਿਓਸਕ ਪੰਨਾ</string>\n    <string name=\"channel_page_summary\">ਚੈਨਲ ਪੰਨਾ</string>\n    <string name=\"select_a_channel\">ਚੈਨਲ ਚੁਣੋ</string>\n    <string name=\"no_channel_subscribed_yet\">ਅਜੇ ਤੱਕ ਕੋਈ ਚੈਨਲ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਨਹੀਂ</string>\n    <string name=\"select_a_kiosk\">ਇੱਕ ਕਿਓਸਕ ਚੁਣੋ</string>\n    <string name=\"export_complete_toast\">ਐਕਸਪੋਰਟ ਕੀਤਾ ਗਿਆ</string>\n    <string name=\"import_complete_toast\">ਇੰਪੋਰਟ ਕੀਤਾ ਗਿਆ</string>\n    <string name=\"no_valid_zip_file\">ਕੋਈ ਵੈਧ ZIP ਫਾਈਲ ਨਹੀਂ ਹੈ</string>\n    <string name=\"could_not_import_all_files\">ਚੇਤਾਵਨੀ: ਸਾਰੀਆਂ ਫਾਈਲਾਂ ਇੰਪੋਰਟ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕੀਆਂ।</string>\n    <string name=\"override_current_data\">ਇਹ ਤੁਹਾਡੇ ਮੌਜੂਦਾ ਸੈਟ-ਅਪ ਨੂੰ ਓਵਰ-ਰਾਈਡ ਕਰ ਦੇਵੇਗਾ।</string>\n    <string name=\"trending\">ਫਿਲਹਾਲ ਰੁਝਾਨ ਵਿੱਚ ਹੈ</string>\n    <string name=\"top_50\">ਸਿਖਰਲੇ 50</string>\n    <string name=\"new_and_hot\">ਨਵੇਂ ਅਤੇ ਤਾਜ਼ਾ-ਤਰੀਨ</string>\n    <string name=\"play_queue_remove\">ਹਟਾਓ</string>\n    <string name=\"play_queue_stream_detail\">ਵੇਰਵੇ</string>\n    <string name=\"play_queue_audio_settings\">ਆਡੀਓ ਸੈਟਿੰਗਾਂ</string>\n    <string name=\"hold_to_append\">ਕਤਾਰਬੱਧ ਕਰਨ ਵਾਸਤੇ ਦਬਾ ਕੇ ਰੱਖੋ</string>\n    <string name=\"start_here_on_background\">ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ</string>\n    <string name=\"start_here_on_popup\">ਪੌਪ-ਅਪ ਵਿੱਚ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ</string>\n    <string name=\"drawer_open\">ਡਰਾਅਰ ਖੋਲੋ</string>\n    <string name=\"drawer_close\">ਡਰਾਅਰ ਬੰਦ ਕਰੋ</string>\n    <string name=\"preferred_open_action_settings_title\">\\'ਖੋਲ੍ਹਣ\\' ਤੇ ਤਰਜੀਹੀ ਐਕਸ਼ਨ</string>\n    <string name=\"preferred_open_action_settings_summary\">ਸਮੱਗਰੀ ਖੋਲ੍ਹਣ ਸਮੇਂ ਡਿਫ਼ਾਲਟ ਕਾਰਵਾਈ — %s</string>\n    <string name=\"video_player\">ਵੀਡੀਓ ਪਲੇਅਰ</string>\n    <string name=\"background_player\">ਬੈਕਗ੍ਰਾਊਂਡ ਪਲੇਅਰ</string>\n    <string name=\"popup_player\">ਪੌਪ-ਅਪ ਪਲੇਅਰ</string>\n    <string name=\"always_ask_open_action\">ਹਮੇਸ਼ਾਂ ਪੁੱਛੋ</string>\n    <string name=\"preferred_player_fetcher_notification_title\">ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">ਬੇਨਤੀ ਕੀਤੀ ਸਮੱਗਰੀ ਲੋਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</string>\n    <string name=\"create_playlist\">ਨਵੀਂ ਪਲੇਲਿਸਟ</string>\n    <string name=\"rename_playlist\">ਨਾਮ ਬਦਲੋ</string>\n    <string name=\"name\">ਨਾਮ</string>\n    <string name=\"add_to_playlist\">ਪਲੇਲਿਸਟ ਵਿੱਚ ਜੋੜ੍ਹੋ</string>\n    <string name=\"set_as_playlist_thumbnail\">ਪਲੇਲਿਸਟ ਥੰਮਨੇਲ ਦੇ ਰੂਪ ਵਿੱਚ ਸੈੱਟ ਕਰੋ</string>\n    <string name=\"bookmark_playlist\">ਪਲੇਲਿਸਟ ਬੁੱਕਮਾਰਕ ਕਰੋ</string>\n    <string name=\"unbookmark_playlist\">ਬੁੱਕਮਾਰਕ ਹਟਾਓ</string>\n    <string name=\"delete_playlist_prompt\">ਕੀ ਇਸ ਪਲੇਲਿਸਟ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?</string>\n    <string name=\"playlist_creation_success\">ਪਲੇਲਿਸਟ ਬਣਾਈ ਗਈ</string>\n    <string name=\"playlist_add_stream_success\">ਪਲੇਲਿਸਟ ਕੀਤਾ ਗਿਆ</string>\n    <string name=\"playlist_thumbnail_change_success\">ਪਲੇਲਿਸਟ ਦਾ ਥੰਮਨੇਲ ਬਦਲ ਦਿੱਤਾ ਗਿਆ।</string>\n    <string name=\"caption_none\">ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ</string>\n    <string name=\"resize_fit\">ਫਿੱਟ</string>\n    <string name=\"resize_fill\">ਭਰੋ</string>\n    <string name=\"resize_zoom\">ਜ਼ੂਮ</string>\n    <string name=\"caption_auto_generated\">ਆਪਣੇ-ਆਪ ਬਣੀ</string>\n    <string name=\"caption_setting_title\">ਸਿਰਲੇਖ</string>\n    <string name=\"caption_setting_description\">ਪਲੇਅਰ ਕੈਪਸ਼ਨ ਟੈਕਸਟ ਸਕੇਲ ਅਤੇ ਬੈਕਗ੍ਰਾਊਂਡ ਸਟਾਈਲ ਨੂੰ ਸੋਧੋ। ਪ੍ਰਭਾਵੀ ਕਰਨ ਲਈ ਐਪ ਨੂੰ ਮੁੜ ਚਾਲੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ</string>\n    <string name=\"enable_leak_canary_summary\">ਮੈਮੋਰੀ ਲੀਕ ਨਿਗਰਾਨੀ, ਐਪ ਨੂੰ ਆਕ੍ਰਿਆਸ਼ੀਲ ਬਣਾ ਸਕਦੀ ਹੈ ਜਦੋਂ ਹੀਪ ਡੰਪਿੰਗ ਹੁੰਦੀ ਹੈ</string>\n    <string name=\"enable_disposed_exceptions_title\">ਚੱਕਰ ਤੋਂ ਬਾਹਰ ਤਰੁੱਟੀਆਂ ਰਿਪੋਰਟ ਕਰੋ</string>\n    <string name=\"enable_disposed_exceptions_summary\">ਨਿਪਟਾਰੇ ਦੇ ਬਾਅਦ ਫਰੈਗਮੈਂਟ ਜਾਂ ਐਕਟੀਵਿਟੀ ਦੇ ਚੱਕਰ ਤੋਂ ਬਾਹਰ ਨਾ ਪਹੁੰਚਾਉਣ ਯੋਗ ਆਰ-ਐਕਸ ਅਪਵਾਦਾਂ ਬਾਰੇ ਜ਼ਬਰੀ ਰਿਪੋਰਟ ਕਰੋ</string>\n    <string name=\"import_title\">ਇੰਪੋਰਟ</string>\n    <string name=\"import_from\">ਤੋਂ ਇੰਪੋਰਟ ਕਰੋ</string>\n    <string name=\"export_to\">ਤੇ ਐਕਸਪੋਰਟ ਕਰੋ</string>\n    <string name=\"import_ongoing\">ਇੰਪੋਰਟ ਹੋ ਰਿਹਾ ਹੈ…</string>\n    <string name=\"export_ongoing\">ਐਕਸਪੋਰਟ ਹੋ ਰਿਹਾ ਹੈ…</string>\n    <string name=\"import_file_title\">ਇੰਪੋਰਟ ਫਾਈਲ</string>\n    <string name=\"previous_export\">ਪਿੱਛਲਾ ਐਕਸਪੋਰਟ</string>\n    <string name=\"subscriptions_import_unsuccessful\">ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ</string>\n    <string name=\"subscriptions_export_unsuccessful\">ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਐਕਸਪੋਰਟ ਨਹੀਂ ਹੋ ਸਕੀਆਂ</string>\n    <string name=\"import_youtube_instructions\">ਗੂਗਲ ਟੇਕਆਊਟ ਤੋਂ ਯੂਟਿਊਬ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਇੰਪੋਰਟ ਕਰਨ ਲਈ ਐਕਸਪੋਰਟ ਫਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ:\\n\\n1. ਇਸ URL ਤੇ ਜਾਓ: %1$s\\n2. ਮੰਗਣ ਤੇ ਆਪਣੇ ਖਾਤੇ \\'ਚ ਲਾਗ-ਇਨ ਕਰੋ\\n3. ਕਲਿੱਕ ਕਰੋ \\\" All data incuded\\\" ਤੇ, ਫੇਰ \\\"Deselect all\\\" ਤੇ ਫੇਰ ਸਿਰਫ \\\"subscriprion\\\" ਚੁਣੋ ਅਤੇ \\\"OK\\\" ਕਰੋ\\n4. \\\"Next step\\\" ਤੇ ਕਲਿੱਕ ਕਰੋ ਅਤੇ ਫੇਰ \\\"create export\\\" ਤੇ\\n5. ਡਾਊਨਲੋਡ ਬਟਨ ਦਿਖਾਈ ਦੇਣ ਤੇ ਇਸ ਤੇ ਕਲਿੱਕ ਕਰੋ। ਇੱਕ ਡਾਉਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ (ਇਹੀ ਐਕਸਪੋਰਟ ਫਾਈਲ ਹੈ)\\n6. ਥੱਲੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰੋ ਤੇ ਡਾਊਨਲੋਡ ਕੀਤੀ .zip ਫਾਈਲ ਚੁਣੋ\\n7. [ਜੇ .zip ਤੋਂ ਐਕਸਪੋਰਟ ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ] ਤਾਂ .csv ਫਾਈਲ ਐਕਸਟਰੈਕਟ ਕਰੋ (ਆਮ ਤੌਰ ਤੇ \\\"YouTube and YouTube Music/subscriptions/subscriptions.csv\\\"), ਥੱਲੇ ਦਿੱਤੇ ਇੰਪੋਰਟ ਫਾਈਲ ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਐਕਸਟਰੈਕਟ ਕੀਤੀ csv ਫਾਈਲ ਚੁਣੋ</string>\n    <string name=\"import_soundcloud_instructions\">URL ਜਾਂ ਆਪਣੀ ID ਟਾਈਪ ਕਰਕੇ ਸਾਉੰਡ ਕਲਾਉਡ ਪ੍ਰੋਫਾਈਲ ਇੰਪੋਰਟ ਕਰੋ: \\n \\n1. ਇੱਕ ਵੈਬ-ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ \\\"ਡੈਸਕਟਾਪ ਮੋਡ\\\" ਨੂੰ ਚਾਲੂ ਕਰੋ (ਸਾਈਟ ਮੋਬਾਈਲ ਉਪਕਰਣਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ) \\n2. ਇਸ URL ਤੇ ਜਾਓ: %1$s \\n3. ਆਪਣੇ ਖਾਤੇ ਚ ਲੌਗ-ਇਨ ਕਰੋ \\n4. ਨਿਰਦੇਸ਼ਤ ਕੀਤੇ ਗਏ ਪ੍ਰੋਫਾਈਲ URL ਨੂੰ ਕਾਪੀ ਕਰੋ।</string>\n    <string name=\"import_soundcloud_instructions_hint\">ਤੁਹਾਡੀ ਆਈਡੀ, soundcloud.com/ਤੁਹਾਡੀ ਆਈਡੀ</string>\n    <string name=\"import_network_expensive_warning\">ਯਾਦ ਰੱਖੋ ਕਿ ਇਸ ਕਾਰਜ ਨਾਲ ਡਾਟਾ ਖਪਤ ਹੋ ਸਕਦਾ ਹੈ।\\n\\nਕੀ ਤੁਸੀਂ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?</string>\n    <string name=\"playback_speed_control\">ਪਲੇਅਬੈਕ ਸਪੀਡ ਕੰਟਰੋਲ</string>\n    <string name=\"playback_tempo\">ਤਾਲ</string>\n    <string name=\"playback_pitch\">ਪਿੱਚ</string>\n    <string name=\"unhook_checkbox\">ਅਲਹਿਦਾ ਕਰੋ (ਵਿਗਾੜ ਪੈ ਸਕਦਾ ਹੈ)</string>\n    <string name=\"import_settings\">ਕੀ ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਵੀ ਇੰਪੋਰਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\\?</string>\n    <string name=\"privacy_policy_title\">ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ</string>\n    <string name=\"privacy_policy_encouragement\">ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਤੁਹਾਡੀ ਗੋਪਨੀਯਤਾ ਨੂੰ ਬਹੁਤ ਗੰਭੀਰਤਾ ਨਾਲ ਲੈਂਦਾ ਹੈ। ਇਸ ਲਈ ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਵੀ ਡਾਟਾ ਇੱਕਠਾ ਨਹੀਂ ਕਰਦਾ।\\nਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡਾਟਾ ਭੇਜਿਆ ਜਾਂ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।</string>\n    <string name=\"read_privacy_policy\">ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਪੜ੍ਹੋ</string>\n    <string name=\"start_accept_privacy_policy\">ਯੂਰਪੀਅਨ ਜਨਰਲ ਡੇਟਾ ਪ੍ਰੋਟੈਕਸ਼ਨ ਰੈਗੂਲੇਸ਼ਨ (ਜੀਡੀਪੀਆਰ) ਦੀ ਪਾਲਣਾ ਕਰਨ ਲਈ, ਅਸੀਂ ਤੁਹਾਡਾ ਧਿਆਨ ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵੱਲ ਖਿੱਚਦੇ ਹਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਇਸਨੂੰ ਧਿਆਨ ਨਾਲ ਪੜ੍ਹੋ।\\nਸਾਨੂੰ ਨੁਕਸ ਰਿਪੋਰਟ ਭੇਜਣ ਲਈ ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਸਵੀਕਾਰ ਕਰਨਾ ਹੋਵੇਗਾ।</string>\n    <string name=\"accept\">ਸਵੀਕਾਰ ਕਰੋ</string>\n    <string name=\"decline\">ਅਸਵੀਕਾਰ</string>\n    <string name=\"limit_data_usage_none_description\">ਕੋਈ ਸੀਮਾ ਨਹੀਂ</string>\n    <string name=\"limit_mobile_data_usage_title\">ਮੋਬਾਈਲ ਡਾਟਾ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨੂੰ ਸੀਮਿਤ ਕਰੋ</string>\n    <string name=\"minimize_on_exit_title\">ਐਪ ਬਦਲਦੇ ਸਮੇਂ ਉਸਨੂੰ ਮਿਨੀਮਾਈਜ਼ ਕਰੋ</string>\n    <string name=\"minimize_on_exit_summary\">ਮੇਨ ਵੀਡੀਓ ਪਲੇਅਰ ਤੋਂ ਦੂਜੇ ਐਪ \\'ਤੇ ਜਾਣ ਵੇਲੇ ਕਾਰਵਾਈ — %s</string>\n    <string name=\"minimize_on_exit_none_description\">ਕੋਈ ਨਹੀਂ</string>\n    <string name=\"minimize_on_exit_background_description\">ਬੈਕਗ੍ਰਾਊਂਡ ਪਲੇਅਰ ਵਿੱਚ ਬਦਲੋ</string>\n    <string name=\"minimize_on_exit_popup_description\">ਪੌਪ-ਅਪ ਪਲੇਅਰ ਵਿੱਚ ਬਦਲੋ</string>\n    <string name=\"skip_silence_checkbox\">ਚੁੱਪ ਦੌਰਾਨ ਤੇਜ਼ੀ ਨਾਲ ਅੱਗੇ ਕਰੋ</string>\n    <string name=\"playback_step\">ਕਦਮ</string>\n    <string name=\"playback_reset\">ਰੀਸੈੱਟ</string>\n    <string name=\"channels\">ਚੈਨਲ</string>\n    <string name=\"playlists\">ਪਲੇਲਿਸਟਾਂ</string>\n    <string name=\"tracks\">ਟਰੈਕਸ</string>\n    <string name=\"users\">ਯੂਜ਼ਰਸ</string>\n    <string name=\"unsubscribe\">ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰੋ</string>\n    <string name=\"tab_choose\">ਟੈਬ ਚੁਣੋ</string>\n    <string name=\"content_language_title\">ਸਮੱਗਰੀ ਦੀ ਮੂਲ ਭਾਸ਼ਾ</string>\n    <string name=\"settings_category_updates_title\">ਅੱਪਡੇਟਾਂ</string>\n    <string name=\"file_deleted\">ਫਾਈਲ ਮਿਟਾ ਦਿੱਤੀ ਗਈ ਹੈ</string>\n    <string name=\"app_update_notification_channel_name\">ਐਪ ਅੱਪਡੇਟ ਨੋਟੀਫਿਕੇਸ਼ਨ</string>\n    <string name=\"app_update_notification_channel_description\">ਨਵੇਂ ਨਿਊਪਾਈਪ ਸੰਸਕਰਣਾਂ ਲਈ ਪ੍ਰਾਪਤ ਸੂਚਨਾਵਾਂ</string>\n    <string name=\"download_to_sdcard_error_title\">ਬਾਹਰੀ ਸਟੋਰੇਜ ਉਪਲਬਧ ਨਹੀਂ ਹੈ</string>\n    <string name=\"download_to_sdcard_error_message\">ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਸੰਭਵ ਨਹੀਂ ਹੈ। ਕੀ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਦੀ ਸਥਿਤੀ ਨੂੰ ਰੀਸੈਟ ਕੀਤਾ ਜਾਵੇ \\?</string>\n    <string name=\"saved_tabs_invalid_json\">ਸਾਂਭੀਆਂ ਟੈਬਾਂ ਨਹੀਂ ਪੜ੍ਹ ਹੋਈਆਂ, ਇਸ ਲਈ ਡਿਫਾਲਟ ਟੈਬਾਂ ਦੀ ਵਰਤੋਂ ਹੋ ਰਹੀ ਹੈ</string>\n    <string name=\"restore_defaults\">ਡੀਫ਼ਾਲਟ ਮੁੜ-ਸਥਾਪਿਤ ਕਰੋ</string>\n    <string name=\"restore_defaults_confirmation\">ਕੀ ਤੁਸੀਂ ਡਿਫਾਲਟ ਮੁੜ-ਸਥਾਪਿਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\\?</string>\n    <string name=\"subscribers_count_not_available\">ਸਬਸਕ੍ਰਾਈਬਰਾਂ ਦੀ ਗਿਣਤੀ ਅਣ-ਉਪਲਬਧ</string>\n    <string name=\"main_page_content_summary\">ਮੁੱਖ ਪੰਨੇ ਤੇ ਕਿਹੜੇ ਟੈਬ ਵਿਖਾਏ ਜਾਣਗੇ</string>\n    <string name=\"updates_setting_title\">ਅੱਪਡੇਟਾਂ</string>\n    <string name=\"updates_setting_description\">ਜਦੋਂ ਐਪ ਦੀ ਨਵੀਂ ਅੱਪਡੇਟ ਉਪਲੱਬਧ ਹੋਵੇ ਤਾਂ ਅੱਪਡੇਟ ਕਰਨ ਵਾਸਤੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿਖਾਓ</string>\n    <string name=\"list_view_mode\">ਸੂਚੀ ਵੇਖਣ ਦਾ ਢੰਗ</string>\n    <string name=\"list\">ਸੂਚੀ</string>\n    <string name=\"grid\">ਗਰਿੱਡ</string>\n    <string name=\"auto\">ਆਟੋ</string>\n    <string name=\"app_update_available_notification_title\">ਨਿਊ-ਪਾਈਪ ਦੀ ਅੱਪਡੇਟ ਉਪਲਬੱਧ ਹੈ!</string>\n    <string name=\"missions_header_finished\">ਮੁਕੰਮਲ ਹੋਇਆ</string>\n    <string name=\"missions_header_pending\">ਬਕਾਇਆ</string>\n    <string name=\"paused\">ਰੋਕਿਆ</string>\n    <string name=\"queued\">ਕਤਾਰ ਵਿੱਚ</string>\n    <string name=\"post_processing\">ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ</string>\n    <string name=\"enqueue\">ਕਤਾਰਬੱਧ ਕਰੋ</string>\n    <string name=\"permission_denied\">ਸਿਸਟਮ ਦੁਆਰਾ ਕਾਰਵਾਈ ਤੋਂ ਇਨਕਾਰ ਕੀਤਾ ਗਿਆ</string>\n    <string name=\"download_failed\">ਡਾਊਨਲੋਡ ਫੇਲ੍ਹ</string>\n    <string name=\"generate_unique_name\">ਵਿਲੱਖਣ ਨਾਮ ਬਣਾਓ</string>\n    <string name=\"overwrite\">ਓਵਰਰਾਈਟ ਕਰੋ</string>\n    <string name=\"download_already_running\">ਇਸ ਨਾਮ ਦੇ ਨਾਲ ਇੱਕ ਡਾਊਨਲੋਡ ਪਹਿਲਾਂ ਤੋਂ ਜਾਰੀ ਹੈ</string>\n    <string name=\"show_error\">ਤਰੁੱਟੀ ਵਿਖਾਓ</string>\n    <string name=\"error_path_creation\">ਮੰਜ਼ਿਲ ਫੋਲਡਰ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ</string>\n    <string name=\"error_file_creation\">ਫਾਈਲ ਨਹੀਂ ਬਣਾਈ ਜਾ ਸਕਦੀ</string>\n    <string name=\"error_ssl_exception\">ਸੁਰੱਖਿਅਤ ਕੁਨੈਕਸ਼ਨ ਸਥਾਪਤ ਨਹੀਂ ਹੋ ਸਕਿਆ</string>\n    <string name=\"error_unknown_host\">ਸਰਵਰ ਨਹੀਂ ਲੱਭ ਸਕਿਆ</string>\n    <string name=\"error_connect_host\">ਸਰਵਰ ਨਾਲ ਜੁੜ ਨਹੀਂ ਸਕਿਆ</string>\n    <string name=\"error_http_no_content\">ਸਰਵਰ ਨੇ ਡਾਟਾ ਨਹੀਂ ਭੇਜਿਆ</string>\n    <string name=\"error_http_unsupported_range\">ਸਰਵਰ ਮਲਟੀ-ਥਰਿੱਡ ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦਾ ਹੈ, @string/msg_threads = 1 ਨਾਲ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ</string>\n    <string name=\"error_http_not_found\">ਨਹੀਂ ਲਭਿਆ</string>\n    <string name=\"error_postprocessing_failed\">ਪੋਸਟ ਪ੍ਰੋਸੈਸਿੰਗ ਫੇਲ੍ਹ ਹੋਈ</string>\n    <string name=\"stop\">ਰੋਕੋ</string>\n    <string name=\"max_retry_msg\">ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ</string>\n    <string name=\"max_retry_desc\">ਡਾਉਨਲੋਡ ਰੱਦ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵੱਧ ਤੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ</string>\n    <string name=\"pause_downloads_on_mobile\">ਮੀਟਰ ਕੀਤੇ ਨੈੱਟਵਰਕ ਤੇ ਰੋਕੋ</string>\n    <string name=\"pause_downloads_on_mobile_desc\">ਮੋਬਾਈਲ ਡਾਟਾ ਦੇ ਇਸਤੇਮਾਲ ਵੇਲੇ ਫਾਇਦੇਮੰਦ ਹੈ, ਹਾਲਾਂਕਿ ਕੁਝ ਡਾਉਨਲੋਡਾਂ ਨੂੰ ਮੁਅੱਤਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</string>\n    <string name=\"events\">ਇਵੇੰਟਸ</string>\n    <string name=\"conferences\">ਕਾਨਫਰੰਸਾਂ</string>\n    <string name=\"show_comments_title\">ਟਿੱਪਣੀਆਂ ਵਿਖਾਓ</string>\n    <string name=\"show_comments_summary\">ਟਿੱਪਣੀਆਂ ਲੁਕਾਉਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰੋ</string>\n    <string name=\"autoplay_title\">ਆਟੋ-ਪਲੇਅ</string>\n    <string name=\"no_comments\">ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ</string>\n    <string name=\"error_unable_to_load_comments\">ਟਿੱਪਣੀਆਂ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀਆਂ</string>\n    <string name=\"close\">ਬੰਦ ਕਰੋ</string>\n    <string name=\"enable_playback_resume_title\">ਪਲੇਅਬੈਕ ਫਿਰ ਚਾਲੂ ਕਰੋ</string>\n    <string name=\"enable_playback_resume_summary\">ਪਿਛਲੀ ਪਲੇਅਬੈਕ ਸਥਿਤੀ ਤੋਂ ਮੁੜ ਚਲਾਓ</string>\n    <string name=\"enable_playback_state_lists_title\">ਸੂਚੀਆਂ ਵਿੱਚ ਸਥਿਤੀ</string>\n    <string name=\"enable_playback_state_lists_summary\">ਸੂਚੀਆਂ ਵਿੱਚ ਪਲੇਅਬੈਕ ਸਥਿਤੀ ਸੂਚਕ ਵਿਖਾਓ</string>\n    <string name=\"settings_category_clear_data_title\">ਡਾਟਾ ਮਿਟਾਓ</string>\n    <string name=\"watch_history_deleted\">ਵੇਖੀਆਂ ਸਟ੍ਰੀਮਾਂ ਦੀ ਇਤਿਹਾਸ ਸੂਚੀ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ</string>\n    <string name=\"watch_history_states_deleted\">ਪਲੇਅਬੈਕ ਸਥਿਤੀਆਂ ਨੂੰ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ</string>\n    <string name=\"missing_file\">ਫਾਈਲ ਤਬਦੀਲ ਕੀਤੀ ਜਾਂ ਮਿਟਾਈ ਗਈ</string>\n    <string name=\"overwrite_unrelated_warning\">ਇਸ ਨਾਮ ਵਾਲੀ ਇੱਕ ਫਾਈਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ</string>\n    <string name=\"overwrite_finished_warning\">ਇਸ ਨਾਮ ਨਾਲ ਡਾਉਨਲੋਡ ਕੀਤੀ ਫਾਈਲ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ</string>\n    <string name=\"overwrite_failed\">ਫਾਈਲ ਓਵਰਰਾਈਟ ਨਹੀਂ ਹੋ ਸਕਦੀ</string>\n    <string name=\"download_already_pending\">ਇਸ ਨਾਮ ਦਾ ਇੱਕ ਡਾਊਨਲੋਡ ਬਕਾਇਆ ਹੈ</string>\n    <string name=\"error_postprocessing_stopped\">ਫਾਈਲ ਤੇ ਕੰਮ ਕਰਦੇ ਸਮੇਂ ਨਿਊਪਾਈਪ ਬੰਦ ਕੀਤੀ ਗਈ</string>\n    <string name=\"error_insufficient_storage_left\">ਡਿਵਾਈਸ ਤੇ ਕੋਈ ਜਗ੍ਹਾ ਨਹੀਂ ਬਚੀ ਹੈ</string>\n    <string name=\"error_progress_lost\">ਪ੍ਰਗਤੀ ਖਤਮ ਹੋ ਗਈ, ਕਿਉਂਕਿ ਫਾਈਲ ਮਿਟਾਈ ਗਈ</string>\n    <string name=\"error_timeout\">ਕੁਨੈਕਸ਼ਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ</string>\n    <string name=\"confirm_prompt\">ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ ਜਾਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\\?</string>\n    <string name=\"enable_queue_limit\">ਡਾਊਨਲੋਡ ਕਤਾਰ ਸੀਮਤ ਕਰੋ</string>\n    <string name=\"enable_queue_limit_desc\">ਇੱਕ ਹੀ ਸਮੇਂ ਤੇ ਇੱਕੋ ਡਾਊਨਲੋਡ ਚੱਲੇਗਾ</string>\n    <string name=\"start_downloads\">ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰੋ</string>\n    <string name=\"pause_downloads\">ਡਾਊਨਲੋਡਸ ਰੋਕੋ</string>\n    <string name=\"downloads_storage_ask_title\">ਡਾਊਨਲੋਡ ਕਿੱਥੇ ਕਰਨਾ ਹੈ, ਦੇ ਲਈ ਪੁੱਛੋ</string>\n    <string name=\"downloads_storage_ask_summary\">ਤੁਹਾਨੂੰ ਹਰ ਵਾਰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿੱਥੇ ਸਾਂਭਣਾ ਹੈ।\n\\nਜੇ ਤੁਸੀਂ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿਸੇ ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਸਾਂਭਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੋਣਕਾਰ (SAF) ਚਾਲੂ ਕਰੋ</string>\n    <string name=\"downloads_storage_use_saf_title\">ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੋਣਕਾਰ (SAF) ਦੀ ਵਰਤੋਂ ਕਰੋ</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'ਸਟੋਰੇਜ ਐਕਸੈਸ ਫ਼ਰੇਮਵਰਕ\\' ਬਾਹਰੀ SD ਕਾਰਡ ਵਿੱਚ ਡਾਊਨਲੋਡ ਕਰਨ ਦਿੰਦਾ ਹੈ</string>\n    <string name=\"notification_scale_to_square_image_title\">ਥੰਮਨੇਲ ਨੂੰ 1:1 ਮਾਪ ਦਾ ਕਰੋ</string>\n    <string name=\"search_showing_result_for\">%s : ਲਈ ਨਤੀਜੇ ਵਿਖਾਏ ਜਾ ਰਹੇ ਹਨ</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">ਜਦੋਂ ਉਪਲਬਧ ਹੋਵੇ ਤਾਂ ਖ਼ਾਸ ਫ਼ੀਡ ਤੋਂ ਮੰਗਵਾਓ</string>\n    <string name=\"feed_load_error_fast_unknown\">ਤੇਜ਼ ਫ਼ੀਡ ਮੋਡ ਇਸ ਬਾਰੇ ਕੋਈ ਹੋਰ ਜਾਣਕਾਰੀ ਮੁੱਹਈਆ ਨਹੀਂ ਕਰਾਉਂਦਾ।</string>\n    <string name=\"new_seek_duration_toast\">ਐਕਸੋਪਲੇਅਰ ਦੀ ਬੰਦਿਸ਼ ਕਰਕੇ ਸੀਕ ਕਰਨ ਦੀ ਮਿਆਦ %d ਸਕਿੰਟ ਸੈੱਟ ਕੀਤੀ ਗਈ</string>\n    <string name=\"error_download_resource_gone\">ਇਹ ਡਾਊਨਲੋਡ ਮੁੜ-ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</string>\n    <string name=\"recovering\">ਮੁੜ-ਪ੍ਰਾਪਤੀ</string>\n    <string name=\"disable_media_tunneling_summary\">ਜੇ ਤੁਹਾਨੂੰ ਕਾਲ੍ਹੀ ਸਕਰੀਨ ਮਿਲੇ ਜਾਂ ਵੀਡਿਓ ਰੁਕ-ਰੁਕ ਕੇ ਚੱਲੇ ਤਾਂ ਮੀਡੀਆ ਟਨਲਿੰਗ ਬੰਦ ਕਰ ਦਿਓ।</string>\n    <string name=\"disable_media_tunneling_title\">ਮੀਡੀਆ ਟਨਲਿੰਗ ਬੰਦ ਕਰੋ</string>\n    <string name=\"show_original_time_ago_summary\">ਸੇਵਾਵਾਂ ਵੱਲੋਂ ਆਈ ਅਸਲ ਲਿਖਤ ਸਟ੍ਰੀਮ ਨਗਾਂ ਵਿੱਚ ਵਿਖਾਈ ਦੇਵੇਗੀ</string>\n    <string name=\"show_original_time_ago_title\">ਨਗਾਂ ਦੇ ਆਉਣ ਦਾ ਅਸਲੀ ਸਮਾਂ ਵਿਖਾਓ</string>\n    <string name=\"show_memory_leaks\">ਮੈਮਰੀ ਲੀਕ ਵਿਖਾਓ</string>\n    <string name=\"playlist_no_uploader\">ਆਪਣੇ-ਆਪ ਬਣੀ (ਕੋਈ ਅਪਲੋਡਰ ਨਹੀਂ ਲੱਭਿਆ)</string>\n    <string name=\"no_playlist_bookmarked_yet\">ਹਾਲੇ ਕੋਈ ਪਲੇਲਿਸਟ ਬੁੱਕਮਾਰਕ ਨਹੀਂ ਕੀਤੀ ਹੋਈ</string>\n    <string name=\"default_kiosk_page_summary\">ਡਿਫ਼ਾਲਟ ਕਿਓਸਕ</string>\n    <string name=\"msg_calculating_hash\">ਹੈਸ਼ ਦਾ ਲੇਖਾ-ਜੋਖਾ ਹੋ ਰਿਹਾ ਹੈ</string>\n    <string name=\"drawer_header_description\">ਸੇਵਾ ਚੁਣੋ, ਮੌਜੂਦਾ ਚੋਣ:</string>\n    <string name=\"error_report_open_github_notice\">ਮਿਹਰਬਾਨੀ ਕਰਕੇ ਜਾਂਚ ਲਓ ਕਿ ਤੁਹਾਡੇ ਵਾਲ੍ਹੇ ਕ੍ਰੈਸ਼ ਦੀ ਗੱਲ ਕਰਦਾ ਕੋਈ ਮਸਲਾ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਤਾਂ ਨਹੀਂ। ਇੱਕੋ ਮਸਲੇ ਦੀਆਂ ਦੋ ਜਾਂ ਵੱਧ ਨਕਲਾਂ ਬਣਾ ਕੇ ਤੁਸੀਂ ਸਾਡੇ ਤੋਂ ਉਹ ਵਕਤ ਖੋਹ ਲੈਂਦੇ ਹੋ ਜੋ ਅਸੀਂ ਅਸਲੀ ਮਸਲੇ ਦੇ ਹੱਲ ਲਈ ਲਾਉਣਾ ਸੀ।</string>\n    <string name=\"copy_for_github\">ਫ਼ਾਰਮੈਟ ਕੀਤੀ ਰਿਪੋਰਟ ਕਾਪੀ ਕਰੋ</string>\n    <string name=\"clear_cookie_summary\">reCAPTCHA ਹੱਲ ਕਰਦੇ ਵੇਲ਼ੇ ਨਿਊਪਾਈਪ ਵਿੱਚ ਜਮ੍ਹਾਂ ਹੋਣ ਵਾਲ਼ੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਕਰੋ</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA ਦੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਹੋ ਗਈਆਂ ਹਨ</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA ਦੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਕਰੋ</string>\n    <string name=\"hash_channel_description\">ਵੀਡਿਓ ਹੈਸ਼ਿੰਗ ਦੀ ਕਾਰਵਾਈ ਦੀ ਮੌਜੂਦਾ ਹਾਲਤ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ</string>\n    <string name=\"restricted_video_no_stream\">ਇਹ ਵੀਡੀਓ ਉਮਰ-ਹੱਦ ਮੁਤਾਬਕ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ।\n\\nਯੂਟਿਊਬ ਦੀਆਂ ਉਮਰ-ਹੱਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਵੀਡੀਓਜ਼ ਬਾਰੇ ਨੀਤੀਆਂ ਦੇ ਕਾਰਨ ਨਿਊ-ਪਾਈਪ ਇਸਦੀਆਂ ਵੀਡੀਓ ਸਟ੍ਰੀਮ ਤੱਕ ਨਹੀਂ ਪਹੁੰਚ ਸਕਦੀ ਅਤੇ ਇਸੇ ਕਰਕੇ ਇਸਨੂੰ ਚਲਾ ਵੀ ਨਹੀਂ ਸਕਦੀ।</string>\n    <string name=\"notification_scale_to_square_image_summary\">ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਏ ਵੀਡਿਓ ਥੰਮਨੇਲ ਨੂੰ 16:9 ਦੀ ਬਜਾਏ 1:1 ਅਨੁਪਾਤ ਦਾ ਵਿਖਾਓ</string>\n    <string name=\"open_with\">ਇਸ ਵਿੱਚ ਖੋਲ੍ਹੋ</string>\n    <string name=\"open_website_license\">ਵੈਬਸਾਈਟ ਖੋਲ੍ਹੋ</string>\n    <string name=\"metadata_privacy_internal\">ਅੰਦਰੂਨੀ</string>\n    <string name=\"metadata_privacy_private\">ਨਿੱਜੀ (ਪ੍ਰਾਈਵੇਟ)</string>\n    <string name=\"metadata_privacy_unlisted\">ਗੈਰ-ਸੂਚੀਬੱਧ</string>\n    <string name=\"metadata_privacy_public\">ਜਨਤਕ</string>\n    <string name=\"metadata_host\">ਮੇਜ਼ਬਾਨ</string>\n    <string name=\"metadata_support\">ਸਹਾਇਤਾ</string>\n    <string name=\"metadata_language\">ਭਾਸ਼ਾ</string>\n    <string name=\"metadata_age_limit\">ਉਮਰ ਹੱਦ</string>\n    <string name=\"metadata_privacy\">ਪਰਦੇਦਾਰੀ</string>\n    <string name=\"metadata_licence\">ਲਾਈਸੈਂਸ</string>\n    <string name=\"metadata_tags\">ਟੈਗ</string>\n    <string name=\"metadata_category\">ਸ਼੍ਰੇਣੀ</string>\n    <string name=\"description_select_disable\">ਵੇਰਵੇ \\'ਚੋਂ ਲਿਖਤ ਚੁਣਨਾ ਬੰਦ ਕਰੋ</string>\n    <string name=\"description_select_enable\">ਵੇਰਵੇ \\'ਚੋਂ ਲਿਖਤ ਚੁਣਨਾ ਚਾਲੂ ਕਰੋ</string>\n    <string name=\"description_select_note\">ਤੁਸੀਂ ਹੁਣ ਵੇਰਵੇ \\'ਚੋਂ ਲਿਖਤ ਨੂੰ ਚੁਣ ਸਕਦੇ ਹੋ। ਨੋਟ ਕਰੋ ਕਿ ਪੰਨਾ ਜਗ-ਬੁੱਝ ਸਕਦਾ ਹੈ ਅਤੇ ਚੋਣ ਮੋਡ ਵਿੱਚ ਹੋਣ ਵੇਲੇ ਲਿੰਕ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਨਹੀਂ ਹੋ ਸਕਦੇ ਹਨ।</string>\n    <string name=\"download_has_started\">ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਹੋ ਗਿਐ</string>\n    <string name=\"select_night_theme_toast\">ਤੁਸੀਂ ਆਪਣੀ ਪਸੰਦੀਦਾ ਰਾਤ ਦੀ ਥੀਮ ਹੇਠਾਂ ਚੁਣ ਸਕਦੇ ਹੋ</string>\n    <string name=\"night_theme_summary\">ਆਪਣੀ ਪਸੰਦੀਦਾ ਰਾਤ ਦੀ ਥੀਮ ਚੁਣੋ — %s</string>\n    <string name=\"auto_device_theme_title\">ਆਟੋਮੈਟਿਕ (ਡਿਵਾਈਸ ਥੀਮ)</string>\n    <string name=\"radio\">ਰੇਡੀਓ</string>\n    <string name=\"featured\">ਫੀਚਰਡ</string>\n    <string name=\"paid_content\">ਇਹ ਸਮੱਗਰੀ ਸਿਰਫ਼ ਉਹਨਾਂ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ ਜਿੰਨ੍ਹਾਂ ਨੇ ਇਸਦੇ ਲਈ ਕੀਮਤ ਦਿੱਤੀ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>\n    <string name=\"account_terminated\">ਖਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ</string>\n    <string name=\"youtube_music_premium_content\">ਇਹ ਵੀਡੀਓ ਸਿਰਫ਼ ਯੂਟਿਊਬ ਮਿਊਜ਼ਿਕ ਦੇ ਪ੍ਰੀਮੀਅਮ ਮੈਂਬਰਾਂ ਲਈ ਉਪਲਬਧ ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>\n    <string name=\"private_content\">ਇਹ ਸਮੱਗਰੀ ਨਿੱਜੀ (ਪ੍ਰਾਈਵੇਟ) ਹੈ, ਇਸ ਕਰਕੇ ਨਿਊ-ਪਾਈਪ ਦੁਆਰਾ ਚਲਾਈ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</string>\n    <string name=\"georestricted_content\">ਇਹ ਸਮੱਗਰੀ ਤੁਹਾਡੇ ਮੁਲਕ ਵਿੱਚ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।</string>\n    <string name=\"no_app_to_open_intent\">ਤੁਹਾਡੇ ਡਿਵਾਈਸ ਦੀ ਕੋਈ ਵੀ ਐਪ ਇਸ ਨੂੰ ਖੋਲ੍ਹ ਨਹੀਂ ਸਕਦੀ</string>\n    <string name=\"chapters\">ਚੈਪਟਰ</string>\n    <string name=\"recent\">ਹਾਲੀਆ</string>\n    <string name=\"show_thumbnail_summary\">ਥੰਮਨੇਲ ਨੂੰ ਲਾਕ ਸਕਰੀਨ ਦੇ ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਦੋਵਾਂ ਲਈ ਵਰਤੋ</string>\n    <string name=\"show_thumbnail_title\">ਥੰਮਨੇਲ ਵਿਖਾਓ</string>\n    <string name=\"playlist_page_summary\">ਪਲੇਲਿਸਟ ਪੰਨਾ</string>\n    <string name=\"video_detail_by\">%s ਦੁਆਰਾ</string>\n    <string name=\"channel_created_by\">%s ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ</string>\n    <string name=\"content_not_supported\">ਇਹ ਸਮੱਗਰੀ ਹਾਲੇ ਨਿਊ-ਪਾਈਪ \\'ਤੇ ਕੰਮ ਨਹੀਂ ਕਰਦੀ।\n\\n\n\\nਉਮੀਦ ਹੈ ਆਉਣ ਵਾਲ਼ੇ ਕਿਸੇ ਵਰਜਨ ਵਿੱਚ ਇਹ ਕੰਮ ਕਰੇਗੀ।</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">ਤੇਜ਼ ਮੋਡ ਬੰਦ ਕਰੋ</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">ਤੇਜ਼ ਮੋਡ ਚਾਲੂ ਕਰੋ</string>\n    <string name=\"feed_load_error_terminated\">ਲੇਖਕ ਦਾ ਖਾਤਾ ਬੰਦ ਹੋ ਚੁੱਕਿਆ ਹੈ।\n\\nਨਿਊ-ਪਾਈਪ ਭਵਿੱਖ ਵਿੱਚ ਇਸ ਫ਼ੀਡ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕਰ ਸਕੇਗੀ।\n\\nਕੀ ਤੁਸੀਂ ਇਸ ਚੈਨਲ ਨੂੰ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰਨਾ ਚਾਹੋਗੇ\\?</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' ਵਾਸਤੇ ਫ਼ੀਡ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀ।</string>\n    <string name=\"feed_load_error\">ਫ਼ੀਡ ਲੋਡ ਕਰਨ ਵਿੱਚ ਤਰੁੱਟੀ ਰਹੀ</string>\n    <string name=\"feed_update_threshold_option_always_update\">ਹਮੇਸ਼ਾਂ ਅੱਪਡੇਟ ਕਰੋ</string>\n    <string name=\"feed_update_threshold_title\">ਫ਼ੀਡ ਅੱਪਡੇਟ ਦੀ ਹੱਦ</string>\n    <string name=\"settings_category_feed_title\">ਫ਼ੀਡ</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">ਸਿਰਫ਼ ਉਹ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਵਿਖਾਓ ਜੋ ਕਿਸੇ ਗਰੁੱਪ ਵਿੱਚ ਨਹੀਂ ਪਾਈਆਂ ਹੋਈਆਂ</string>\n    <string name=\"feed_create_new_group_button_title\">ਨਵਾਂ</string>\n    <string name=\"feed_group_dialog_delete_message\">ਕੀ ਤੁਸੀਂ ਇਸ ਗਰੁੱਪ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">ਗਰੁੱਪ ਦਾ ਨਾਮ ਨਹੀਂ</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d ਚੁਣੀ</item>\n        <item quantity=\"other\">%d ਚੁਣੀਆਂ</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">ਕੋਈ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਨਹੀਂ ਚੁਣੀ ਹੋਈ</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">ਸੁਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਚੁਣੋ</string>\n    <string name=\"feed_processing_message\">ਫ਼ੀਡ \\'ਤੇ ਅਮਲ ਹੋ ਰਿਹੈ…</string>\n    <string name=\"feed_notification_loading\">ਫ਼ੀਡ ਲੋਡ ਹੋ ਰਹੀ ਹੈ…</string>\n    <string name=\"feed_subscription_not_loaded_count\">ਲੋਡ ਨਹੀਂ ਹੋਏ: %d</string>\n    <string name=\"feed_oldest_subscription_update\">ਫ਼ੀਡ ਆਖ਼ਰੀ ਵਾਰ %s ਨੂੰ ਅੱਪਡੇਟ ਹੋਈ</string>\n    <string name=\"feed_groups_header_title\">ਚੈਨਲ ਗਰੁੱਪ</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d ਦਿਨ</item>\n        <item quantity=\"other\">%d ਦਿਨ</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d ਘੰਟਾ</item>\n        <item quantity=\"other\">%d ਘੰਟੇ</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d ਮਿੰਟ</item>\n        <item quantity=\"other\">%d ਮਿੰਟ</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d ਸਕਿੰਟ</item>\n        <item quantity=\"other\">%d ਸਕਿੰਟ</item>\n    </plurals>\n    <string name=\"remove_watched_popup_partially_watched_streams\">ਹਾਂ, ਅਤੇ ਅੱਧ-ਪਚੱਧੀਆਂ ਵੇਖੀਆਂ ਹੋਈਆਂ ਵੀ</string>\n    <string name=\"remove_watched_popup_warning\">ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਿਲ ਪਹਿਲਾਂ ਤੇ ਬਾਅਦ ਵਿੱਚ ਵੇਖੇ ਜਾ ਚੁੱਕੇ ਵੀਡੀਓ ਹਟਾ ਦਿੱਤੇ ਜਾਣਗੇ। \\nਕੀ ਵਾਕਿਆ ਹੀ ਤੁਸੀਂ ਇਹਨਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਇਸ ਕਾਰਵਾਈ ਨੂੰ ਵਾਪਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਣਾ!</string>\n    <string name=\"remove_watched_popup_title\">ਵੇਖੇ ਹੋਏ ਵੀਡੀਓ ਹਟਾ ਦੇਈਏ?</string>\n    <string name=\"remove_watched\">ਵੇਖੇ ਹੋਏ ਨੂੰ ਹਟਾਓ</string>\n    <string name=\"systems_language\">ਸਿਸਟਮ ਡਿਫ਼ਾਲਟ</string>\n    <string name=\"app_language_title\">ਐਪ ਦੀ ਭਾਸ਼ਾ</string>\n    <string name=\"choose_instance_prompt\">ਕੋਈ ਇੰਸਟੈਂਸ ਚੁਣੋ</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">ਐਂਡਰਾਇਡ 10 ਤੋਂ ਸ਼ੁਰੂ ਹੋ ਕੇ ਕੇਵਲ \\'ਸਟੋਰੇਜ ਐਕਸੈੱਸ ਫ਼ਰੇਮਵਰਕ\\' ਸਮਰਥਿਤ ਹੈ</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">ਤੁਹਾਨੂੰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਹਰ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿੱਥੇ ਸਾਂਭਣਾ ਹੈ</string>\n    <string name=\"delete_downloaded_files\">ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ</string>\n    <string name=\"clear_download_history\">ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਹਟਾਓ</string>\n    <string name=\"never\">ਕਦੇ ਨਹੀਂ</string>\n    <string name=\"wifi_only\">ਸਿਰਫ਼ ਵਾਈ-ਫ਼ਾਈ \\'ਤੇ</string>\n    <string name=\"autoplay_summary\">ਸਵੈਚਾਲਿਤ ਤੌਰ ਤੇ ਪਲੇਅਬੈਕ ਸ਼ੁਰੂ ਕਰੋ — %s</string>\n    <string name=\"crash_the_app\">ਐਪ ਕ੍ਰੈਸ਼ ਕਰੋ</string>\n    <string name=\"unmute\">ਅਵਾਜ਼ ਚਾਲੂ ਕਰੋ</string>\n    <string name=\"mute\">ਅਵਾਜ਼ ਬੰਦ ਕਰੋ</string>\n    <string name=\"enqueued\">ਕਤਾਰਬੱਧ ਹੋ ਗਿਆ</string>\n    <string name=\"enqueue_stream\">ਕਤਾਰਬੱਧ ਕਰੋ</string>\n    <string name=\"show_channel_details\">ਚੈਨਲ ਵੇਰਵੇ ਵਿਖਾਓ</string>\n    <string name=\"title_activity_play_queue\">ਪਲੇਅ ਕਤਾਰ</string>\n    <string name=\"most_liked\">ਵਧੇਰੇ ਪਸੰਦ ਕੀਤੇ ਗਏ</string>\n    <string name=\"recently_added\">ਹਾਲ ਹੀ ਵਿੱਚ ਸ਼ਾਮਿਲ</string>\n    <string name=\"local\">ਸਥਾਨਕ</string>\n    <string name=\"select_a_playlist\">ਪਲੇਲਿਸਟ ਚੁਣੋ</string>\n    <string name=\"done\">ਹੋ ਗਿਆ</string>\n    <string name=\"recaptcha_solve\">ਹੱਲ ਕਰੋ</string>\n    <string name=\"subtitle_activity_recaptcha\">ਹੱਲ ਹੋਣ \\'ਤੇ \\\"ਹੋ ਗਿਆ\\\" ਨੱਪੋ</string>\n    <string name=\"no_dir_yet\">ਹਾਲੇ ਕੋਈ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਹੋਇਆ, ਹੁਣੇ ਡਿਫ਼ਾਲਟ ਡਾਊਨਲੋਡ ਫੋਲਡਰ ਚੁਣੋ</string>\n    <string name=\"infinite_videos\">ਅਣਗਿਣਤ ਵੀਡੀਓਜ਼</string>\n    <string name=\"more_than_100_videos\">100+ ਵੀਡੀਓਜ਼</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s ਸਰੋਤਾ</item>\n        <item quantity=\"other\">%s ਸਰੋਤੇ</item>\n    </plurals>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s ਜਣਾ ਵੇਖ ਰਿਹਾ ਹੈ</item>\n        <item quantity=\"other\">%s ਲੋਕ ਵੇਖ ਰਹੇ ਹਨ</item>\n    </plurals>\n    <string name=\"no_one_listening\">ਕੋਈ ਸਰੋਤਾ ਨਹੀਂ ਸੁਣ ਰਿਹਾ</string>\n    <string name=\"no_one_watching\">ਕੋਈ ਦਰਸ਼ਕ ਨਹੀਂ ਵੇਖ ਰਿਹਾ</string>\n    <string name=\"description_tab_description\">ਵੇਰਵਾ</string>\n    <string name=\"related_items_tab_description\">ਸਬੰਧਤ ਆਈਟਮਾਂ</string>\n    <string name=\"comments_tab_description\">ਟਿੱਪਣੀਆਂ</string>\n    <string name=\"error_report_open_issue_button_text\">ਗਿਟਹੱਬ \\'ਤੇ ਜਾ ਕੇ ਇਤਲਾਹ ਦਿਓ</string>\n    <string name=\"permission_display_over_apps\">ਦੂਜੀਆਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਵਿਖਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ</string>\n    <string name=\"delete_playback_states_alert\">ਕੀ ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਣੀਆਂ ਹਨ\\?</string>\n    <string name=\"clear_playback_states_summary\">ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਂਦਾ ਹੈ</string>\n    <string name=\"clear_playback_states_title\">ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਓ</string>\n    <string name=\"hash_channel_name\">ਵੀਡੀਓ ਹੈਸ਼ ਇਤਲਾਹ</string>\n    <string name=\"albums\">ਐਲਬਮ</string>\n    <string name=\"artists\">ਕਲਾਕਾਰ</string>\n    <string name=\"songs\">ਗੀਤ</string>\n    <string name=\"videos_string\">ਵੀਡੀਓ</string>\n    <string name=\"restricted_video\">ਇਹ ਵੀਡੀਓ ਉਮਰ-ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ।\n\\n\n\\nਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਵੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚੋਂ \\\"%1$s\\\" ਚਾਲੂ ਕਰੋ।</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">ਯੂਟਿਊਬ \\\"ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੋਡ\\\" ਉਪਲਬਧ ਕਰਾਉਂਦਾ ਹੈ ਜੋ ਬਾਲਗਾਂ ਵਾਲ਼ੀ ਸਮੱਗਰੀ ਲੁਕਾਉਂਦਾ ਹੈ</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">ਯੂਟਿਊਬ ਦਾ ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੋਡ ਚਾਲੂ ਕਰੋ</string>\n    <string name=\"show_age_restricted_content_summary\">ਉਹ ਸਮੱਗਰੀ ਵੀ ਵਿਖਾਓ ਜੋ ਉਮਰ-ਸੀਮਾ ਕਰਕੇ ਬੱਚਿਆਂ ਲਈ ਸ਼ਾਇਦ ਸਹੀ ਨਾ ਹੋਵੇ (ਜਿਵੇਂ 18+)</string>\n    <string name=\"peertube_instance_add_exists\">ਇੰਸਟੈਂਸ ਪਹਿਲਾਂ ਤੋਂ ਮੌਜੂਦ ਹੈ</string>\n    <string name=\"peertube_instance_add_https_only\">ਸਿਰਫ਼ HTTP URLs ਹੀ ਮੰਨਣਯੋਗ ਹਨ</string>\n    <string name=\"peertube_instance_add_fail\">ਇੰਸਟੈਂਸ ਦੀ ਜਾਇਜ਼ਗੀ ਤਸਦੀਕ ਨਹੀਂ ਹੋ ਸਕੀ</string>\n    <string name=\"peertube_instance_add_help\">ਇੰਸਟੈਂਸ URL ਦਾਖ਼ਲ ਕਰੋ</string>\n    <string name=\"peertube_instance_add_title\">ਇੰਸਟੈਂਸ ਜੋੜੋ</string>\n    <string name=\"peertube_instance_url_help\">ਤੁਹਾਡੇ ਪਸੰਦੀਦਾ ਇੰਸਟੈਂਸ %s \\'ਤੇ ਲੱਭੋ</string>\n    <string name=\"peertube_instance_url_summary\">ਆਪਣੇ ਪਸੰਦੀਦਾ ਪੀਅਰਟਿਊਬ ਇੰਸਟੈਂਸ ਚੁਣੋ</string>\n    <string name=\"peertube_instance_url_title\">ਪੀਅਰਟਿਊਬ ਇੰਸਟੈਂਸ</string>\n    <string name=\"unsupported_url_dialog_message\">URL ਪਛਾਣ ਨਹੀਂ ਹੋਇਆ। ਕਿਸੇ ਹੋਰ ਐਪ ਨਾਲ਼ ਖੋਲ੍ਹਣਾ ਹੈ\\?</string>\n    <string name=\"auto_queue_toggle\">ਆਟੋ ਕਤਾਰਬੱਧ ਕਰੋ</string>\n    <string name=\"show_meta_info_summary\">ਸਟ੍ਰੀਮ ਨਿਰਮਾਤਾ, ਸਟ੍ਰੀਮ ਸਮੱਗਰੀ ਜਾਂ ਖੋਜ ਬੇਨਤੀ ਦੇ ਬਾਰੇ ਵਿੱਚ ਅਤਿਰਿਕਤ ਜਾਣਕਾਰੀ ਦਿੰਦੇ ਮੈਟਾ ਜਾਣਕਾਰੀ ਬਕਸੇ ਨੂੰ ਲੁਕਾਉਣ ਲਈ ਬੰਦ ਕਰੋ</string>\n    <string name=\"show_meta_info_title\">ਮੈਟਾ ਜਾਣਕਾਰੀ ਵਿਖਾਓ</string>\n    <string name=\"show_description_summary\">ਵੀਡੀਓ ਵੇਰਵਾ ਅਤੇ ਵਾਧੂ ਜਾਣਕਾਰੀ ਲੁਕਾਉਣ ਲਈ ਇਸਨੂੰ ਬੰਦ ਕਰੋ</string>\n    <string name=\"show_description_title\">ਵੇਰਵਾ ਵਿਖਾਓ</string>\n    <string name=\"clear_queue_confirmation_description\">ਸਰਗਰਮ ਪਲੇਅਰ ਕਤਾਰ ਨੂੰ ਬਦਲ ਦਿੱਤਾ ਜਾਵੇਗਾ</string>\n    <string name=\"clear_queue_confirmation_summary\">ਇੱਕ ਪਲੇਅਰ ਤੋਂ ਦੂਜੇ ਵਿੱਚ ਬਦਲਣਾ ਤੁਹਾਡੀ ਕਤਾਰ ਨੂੰ ਬਦਲ ਸਕਦਾ ਹੈ</string>\n    <string name=\"clear_queue_confirmation_title\">ਕਤਾਰ ਕਲੀਅਰ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਲਈ ਪੁੱਛੋ</string>\n    <string name=\"seek_duration_title\">ਫਾਸਟ-ਫਾਰਵਰਡ/-ਰਿਵਾਈਂਡ ਸੀਕ ਦੀ ਮਿਆਦ</string>\n    <string name=\"night_theme_title\">ਨਾਈਟ ਥੀਮ</string>\n    <string name=\"notification_colorize_summary\">ਐਂਡਰਾਇਡ ਨੂੰ ਥੰਮਨੇਲ ਵਿੱਚ ਮੁੱਖ ਰੰਗ ਦੇ ਅਨੁਸਾਰ ਨੋਟੀਫਿਕੇਸ਼ਨ ਦੇ ਰੰਗ ਨੂੰ ਅਨੁਕੂਲਿਤ ਕਰਨ ਦਿਓ (ਧਿਆਨ ਦਿਓ ਕਿ ਇਹ ਹਰੇਕ ਡਿਵਾਈਸ \\'ਤੇ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ)</string>\n    <string name=\"notification_colorize_title\">ਰੰਗਦਾਰ ਨੋਟੀਫਿਕੇਸ਼ਨ</string>\n    <string name=\"notification_action_nothing\">ਕੁਝ ਵੀ ਨਹੀਂ</string>\n    <string name=\"notification_action_buffering\">ਬਫ਼ਰਿੰਗ</string>\n    <string name=\"notification_action_shuffle\">ਸ਼ਫਲ ਕਰੋ</string>\n    <string name=\"notification_action_repeat\">ਦੁਹਰਾਓ</string>\n    <string name=\"notification_actions_summary\">ਹੇਠਾਂ ਹਰੇਕ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕਾਰਵਾਈ ਤੇ ਨੱਪਦਿਆਂ ਇਹਨਾਂ ਨੂੰ ਬਦਲੋ। ਇਹਨਾਂ ਦੇ ਸੱਜੇ ਪਾਸੇ ਬਣੇ ਚੈੱਕਬਾਕਸ ਵਰਤਦਿਆਂ ਇਹਨਾਂ ਵਿਚੋਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਤੁਸੀਂ ਕੰਪੈਕਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ।</string>\n    <string name=\"notification_actions_at_most_three\">ਤੁਸੀਂ ਵੱਧ-ਤੋਂ-ਵੱਧ ਤਿੰਨ ਕਾਰਵਾਈਆਂ ਨੂੰ ਕੰਪੈਕਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਉਣ ਲਈ ਚੁਣ ਸਕਦੇ ਹੋ!</string>\n    <string name=\"notification_action_4_title\">ਪੰਜਵਾਂ ਕਾਰਵਾਈ ਬਟਨ</string>\n    <string name=\"notification_action_3_title\">ਚੌਥਾ ਕਾਰਵਾਈ ਬਟਨ</string>\n    <string name=\"notification_action_2_title\">ਤੀਜਾ ਕਾਰਵਾਈ ਬਟਨ</string>\n    <string name=\"notification_action_1_title\">ਦੂਜਾ ਕਾਰਵਾਈ ਬਟਨ</string>\n    <string name=\"notification_action_0_title\">ਪਹਿਲਾ ਕਾਰਵਾਈ ਬਟਨ</string>\n    <string name=\"dont_show\">ਨਾਂ ਵਿਖਾਓ</string>\n    <string name=\"on\">ਆਨ</string>\n    <string name=\"enumeration_comma\">,</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">%s ਡਾਉਨਲੋਡ ਮੁਕੰਮਲ</item>\n        <item quantity=\"other\">%s ਡਾਊਨਲੋਡਾਂ ਮੁਕੰਮਲ</item>\n    </plurals>\n    <string name=\"off\">ਆਫ</string>\n    <string name=\"enqueue_next_stream\">ਕਤਾਰ ਵਿੱਚ ਅੱਗੇ ਸ਼ਾਮਿਲ ਕਰੋ</string>\n    <string name=\"settings_category_player_notification_title\">ਪਲੇਅਰ ਨੋਟੀਫਿਕੇਸ਼ਨ</string>\n    <string name=\"settings_category_player_notification_summary\">ਮੌਜੂਦਾ ਚੱਲ ਰਹੀ ਸਟ੍ਰੀਮ ਦੀ ਨੋਟੀਫਿਕੇਸ਼ਨ ਸੰਰਚਨਾ ਕਰੋ</string>\n    <string name=\"notifications\">ਨੋਟੀਫਿਕੇਸ਼ਨ</string>\n    <string name=\"streams_notification_channel_name\">ਨਵੀਂਆਂ ਸਟ੍ਰੀਮਾਂ</string>\n    <string name=\"streams_notification_channel_description\">ਸਬਸਕ੍ਰਿਪਸ਼ਨਜ਼ ਦੇ ਨਵੀਂ ਸਟ੍ਰੀਮ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ</string>\n    <string name=\"error_report_notification_title\">ਨਿਊਪਾਈਪ ਖਾਮੀ ਤੋਂ ਪ੍ਰਭਾਵਤ ਹੋਈ ਹੈ, ਇੱਥੇ ਨੱਪ ਕੇ ਰਿਪੋਰਟ ਕਰੋ</string>\n    <string name=\"error_report_notification_toast\">ਇੱਕ ਖਾਮੀ ਪ੍ਰਭਾਵੀ ਹੋਈ ਹੈ, ਨੋਟੀਫੀਕੇਸ਼ਨ ਵੇਖੋ</string>\n    <string name=\"main_page_content_swipe_remove\">ਆਈਟਮਾਂ ਨੂੰ ਇੱਕ ਪਾਸੇ ਖਿੱਚ ਕੇ ਹਟਾਓ</string>\n    <string name=\"enable_streams_notifications_title\">ਨਵੀਂ ਸਟ੍ਰੀਮ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ</string>\n    <string name=\"detail_pinned_comment_view_description\">ਪਿੰਨ ਕੀਤੀ ਟਿੱਪਣੀ</string>\n    <string name=\"checking_updates_toast\">ਅੱਪਡੇਟ ਦੀ ਉਪਲੱਬਧਤਾ ਪਰਖੀ ਜਾ ਰਹੀ…</string>\n    <string name=\"mark_as_watched\">ਵੇਖਿਆ ਜਾ ਚੁੱਕਿਆ ਚਿੰਨਤ ਕਰੋ</string>\n    <string name=\"seekbar_preview_thumbnail_title\">ਸੀਕਬਾਰ ਥੰਮਨੇਲ ਦੀ ਝਲਕ</string>\n    <string name=\"feed_update_threshold_summary\">ਸਮਾਂ-ਅਵਧੀ ਜਦ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਦੁਬਾਰਾ ਅੱਪਡੇਟ ਕੀਤੀ ਜਾ ਸਕੇ — %s</string>\n    <string name=\"detail_heart_img_view_description\">ਰਚਨਾਕਾਰ ਨੇ ਦਿਲੋਂ ਪਸੰਦ ਕੀਤਾ</string>\n    <string name=\"progressive_load_interval_summary\">ਪ੍ਰਗਤੀਸ਼ੀਲ ਸਮੱਗਰੀ ਉੱਤੇ ਲੋਡ ਅੰਤਰਾਲ ਆਕਾਰ ਬਦਲੋ (ਮੌਜੂਦਾ %s ਤੇ)। ਛੋਟੀ ਸੰਖਿਆ ਉਸਨੂੰ ਜਲਦੀ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਮੱਦਦ ਦੇ ਸਕਦੀ ਹੈ</string>\n    <string name=\"local_search_suggestions\">ਖੋਜ ਦੇ ਸਥਾਨਕ ਸੁਝਾਅ</string>\n    <string name=\"remote_search_suggestions\">ਖੋਜ ਦੇ ਰਿਮੋਟ ਸੁਝਾਅ</string>\n    <string name=\"start_main_player_fullscreen_title\">ਮੇਨ ਪਲੇਅਰ ਫੁੱਲ ਸਕਰੀਨ ਵਿੱਚ ਸ਼ੁਰੂ ਕਰੋ</string>\n    <string name=\"progressive_load_interval_title\">ਪਲੇਅਬੈਕ ਲੋਡ ਅੰਤਰਾਲ ਆਕਾਰ</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s ਨਵੀਂ ਸਟ੍ਰੀਮ</item>\n        <item quantity=\"other\">%s ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ</item>\n    </plurals>\n    <string name=\"feed_new_items\">ਨਵੀਆਂ ਫੀਡ ਆਈਟਮਾਂ</string>\n    <string name=\"get_notified\">ਸੂਚਨਾ ਪਾਓ</string>\n    <string name=\"select_quality_external_players\">ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਕੁਆਲਿਟੀ ਚੁਣੋ</string>\n    <string name=\"error_report_channel_name\">ਤਰੁੱਟੀ ਰਿਪੋਰਟ ਨੋਟੀਫਿਕੇਸ਼ਨ</string>\n    <string name=\"error_report_channel_description\">ਖ਼ਾਮੀਆਂ ਰਿਪੋਰਟ ਕਰਨ ਲਈ ਨੋਟੀਫਿਕੇਸ਼ਨ</string>\n    <string name=\"comments_are_disabled\">ਟਿੱਪਣੀਆਂ ਬੰਦ ਕੀਤੀਆਂ ਹੋਈਆਂ ਹਨ</string>\n    <string name=\"leak_canary_not_available\">ਲੀਕ-ਕੈਨਰੀ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ</string>\n    <string name=\"show_error_snackbar\">ਤਰੁੱਟੀ ਤੇ ਸਨੈਕਬਾਰ ਵਿਖਾਓ</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">ਕੁਝ ਸੇਵਾਵਾਂ ਵਿੱਚ ਹੀ ਉਪਲੱਬਧ ਇਹ ਤਰੀਕਾ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਫੀਡ ਵਿੱਚ ਤੇਜ ਜਾਣਕਾਰੀ ਮੁਹੱਈਆ ਕਰਵਾਉਂਦਾ ਹੈ, ਪਰ ਕੁਝ ਗਿਣਤੀ ਦੀਆਂ ਹੀ ਆਈਟਮ ਪ੍ਰਦਾਨ ਕਰ ਸਕਦਾ ਹੈ ਉਹ ਵੀ ਅਕਸਰ ਬਿਨਾਂ ਪੂਰੀ ਜਾਣਕਾਰੀ( ਜਿਵੇਂ ਅਵਧੀ, ਸਟ੍ਰੀਮ ਦੀ ਕਿਸਮ, ਕੋਈ ਸਟ੍ਰੀਮ ਲਾਈਵ ਹੈ, ਨਹੀਂ ਦੱਸਦਾ)</string>\n    <string name=\"soundcloud_go_plus_content\">ਇਹ ਸਾਊਂਡਕਲਾਊਡ ਗੋ-ਪਲੱਸ ਟਰੈਕ ਹੈ, ਘੱਟੋ-ਘੱਟ ਤੁਹਾਡੇ ਦੇਸ਼ ਵਿੱਚ, ਇਸ ਲਈ ਇਹ ਸਟ੍ਰੀਮ ਜਾਂ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।</string>\n    <string name=\"unknown_format\">ਅਗਿਆਤ ਫਾਰਮੈਟ</string>\n    <string name=\"unknown_quality\">ਅਗਿਆਤ ਕੁਆਲਿਟੀ</string>\n    <string name=\"faq_title\">ਅਕਸਰ ਪੁੱਛੇ ਜਾਂਦੇ ਸਵਾਲ</string>\n    <string name=\"faq\">ਵੈੱਬਸਾਈਟ \\'ਤੇ ਵੇਖੋ</string>\n    <string name=\"loading_stream_details\">ਸਟ੍ਰੀਮ ਦੇ ਵਿਵਰਣ ਲੋਡ ਹੋ ਰਹੇ ਹਨ…</string>\n    <string name=\"processing_may_take_a_moment\">ਕਾਰਵਾਈ ਵਿੱਚ... ਕੁਝ ਸਮਾਂ ਲੱਗ ਰਿਹਾ ਹੈ</string>\n    <string name=\"show_crash_the_player_title\">\\\"ਪਲੇਅਰ ਕਰੈਸ਼ ਕਰੋ\\\" ਵਿਖਾਉ</string>\n    <string name=\"show_crash_the_player_summary\">ਵਰਤਦੇ ਸਮੇਂ ਪਲੇਅਰ ਕਰੈਸ਼ ਦਾ ਵਿਕਲਪ ਵਿਖਾਉਂਦਾ ਹੈ</string>\n    <string name=\"check_new_streams\">ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਦੀ ਜਾਂਚ ਚਲਾਓ</string>\n    <string name=\"create_error_notification\">ਤਰੁੱਟੀ ਨੋਟੀਫਿਕੇਸ਼ਨ ਬਣਾਓ</string>\n    <string name=\"percent\">ਪ੍ਰਤੀਸ਼ਤ</string>\n    <string name=\"semitone\">ਸੈਮੀਟੋਨ</string>\n    <string name=\"enable_streams_notifications_summary\">ਸਬਸਕ੍ਰਾਈਬ ਕੀਤੇ ਚੈਨਲ ਉੱਪਰ ਨਵੀਂ ਸਟ੍ਰੀਮ ਉੱਪਲਬਧ ਹੋਣ ਤੇ ਨੋਟੀਫਿਕੇਸ਼ਨ ਰਾਹੀਂ ਸੂਚਿਤ ਕਰੋ</string>\n    <string name=\"streams_notifications_interval_title\">ਜਾਂਚ ਅਵਧੀ</string>\n    <string name=\"any_network\">ਕੋਈ ਵੀ ਨੈੱਟਵਰਕ</string>\n    <string name=\"check_for_updates\">ਅੱਪਡੇਟ ਲਈ ਜਾਂਚ ਕਰੋ</string>\n    <string name=\"low_quality_smaller\">ਘੱਟ ਗੁਣਵੱਤਾ (ਛੋਟਾ ਆਕਾਰ)</string>\n    <string name=\"delete_downloaded_files_confirm\">ਡਿਸਕ ਤੋਂ ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਹਟਾਓ\\?</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s ਡਾਊਨਲੋਡ ਹਟਾਇਆ</item>\n        <item quantity=\"other\">%1$s ਡਾਊਨਲੋਡ ਹਟਾਏ</item>\n    </plurals>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">ਚੈਨਲ ਦਾ ਅਵਤਾਰ ਥੰਮਨੇਲ</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">ਇਸ ਕਾਰਜ ਲਈ ਕੋਈ ਢੁਕਵਾਂ ਫਾਈਲ ਮੈਨੇਜਰ ਨਹੀਂ ਮਿਲਿਆ।\n\\nਕ੍ਰਿਪਾ ਕਰਕੇ ਸਟੋਰੇਜ ਐਕਸਿਸ ਫਰੇਮਵਰਕ SAF ਅਨੁਕੂਲ ਫਾਈਲ ਮੈਨੇਜਰ ਇੰਨਸਟਾਲ ਕਰੋ</string>\n    <string name=\"tablet_mode_title\">ਟੈਬਲੇਟ ਮੋਡ</string>\n    <string name=\"notifications_disabled\">ਨੋਟੀਫਿਕੇਸ਼ਨ ਬੰਦ ਕੀਤੇ ਹੋਏ ਹਨ</string>\n    <string name=\"toggle_all\">ਸਭ ਨੂੰ ਟੌਗਲ ਕਰੋ</string>\n    <string name=\"selected_stream_external_player_not_supported\">ਚੁਣੀ ਗਈ ਸਟ੍ਰੀਮ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਸਹਿਯੋਗੀ ਨਹੀਂ ਹੈ</string>\n    <string name=\"streams_not_yet_supported_removed\">ਜਿਹੜੀਆਂ ਸਟ੍ਰੀਮਾਂ ਦਾ ਹਾਲੇ ਐਪ ਡਾਊਨਲੋਡ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ ਉਹ ਛੁਪਾ ਦਿੱਤੀਆਂ ਗਈਆਂ ਹਨ</string>\n    <string name=\"no_audio_streams_available_for_external_players\">ਕੋਈ ਆਡੀਓ ਸਟ੍ਰੀਮ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ</string>\n    <string name=\"sort\">ਲੜੀਬੱਧ ਕਰੋ</string>\n    <string name=\"crash_the_player\">ਪਲੇਅਰ ਕਰੈਸ਼ ਕਰੋ</string>\n    <string name=\"start_main_player_fullscreen_summary\">ਮਿੰਨੀ ਪਲੇਅਰ ਵਿੱਚ ਵੀਡੀਓ ਸ਼ੁਰੂ ਨਾਂ ਕਰੋ ਬਲਕਿ ਜੇ ਆਟੋ-ਰੋਟੇਸ਼ਨ ਲਾਕ ਹੈ ਤਾਂ ਸਿੱਧਾ ਫੁੱਲ ਸਕਰੀਨ ਵਿੱਚ ਚਲਾਓ। ਤੁਸੀਂ ਫਿਰ ਵੀ ਫੁੱਲ ਸਕ੍ਰੀਨ ਤੋਂ ਬਾਹਰ ਆਕੇ ਮਿੰਨੀ-ਪਲੇਅਰ ਤੱਕ ਰਸਾਈ ਹਾਸਿਲ ਕਰ ਸਕਦੇ ਹੋ</string>\n    <string name=\"faq_description\">ਅਗਰ ਤੁਸੀਂ ਐਪ ਦੀ ਵਰਤੋਂ ਸਬੰਧੀ ਮੁਸ਼ਕਿਲਾਂ ਦਾ ਸਾਹਮਣਾ ਕਰ ਰਹੇ ਹੋ, ਤਾਂ ਇਹਨਾਂ ਆਮ ਸਵਾਲਾਂ ਦੇ ਜਵਾਬ ਜਾਣਨਾ ਨਾ ਭੁੱਲੋ!</string>\n    <string name=\"enqueued_next\">ਕਤਾਰ ਵਿੱਚ ਅੱਗੇ ਲਗਾਇਆ ਗਿਆ</string>\n    <string name=\"streams_notifications_network_title\">ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ</string>\n    <string name=\"manual_update_description\">ਨਵੇਂ ਸੰਸਕਰਣਾਂ ਲਈ ਹੱਥੀਂ ਜਾਂਚ ਕਰੋ</string>\n    <string name=\"high_quality_larger\">ਵਧੀਆ ਗੁਣਵੱਤਾ (ਵੱਡਾ ਆਕਾਰ)</string>\n    <string name=\"no_appropriate_file_manager_message\">ਇਸ ਕਾਰਜ ਲਈ ਕੋਈ ਢੁਕਵਾਂ ਫਾਈਲ ਮੈਨੇਜਰ ਨਹੀਂ ਮਿਲਿਆ।\n\\nਕ੍ਰਿਪਾ ਕਰਕੇ ਫਾਈਲ ਮੈਨੇਜਰ ਇੰਨਸਟਾਲ ਕਰੋ ਜਾਂ ਡਾਊਨਲੋਡ ਸੈਟਿੰਗ ਵਿੱਚ \\'%s\\' ਅਸਮਰੱਥ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ</string>\n    <string name=\"you_successfully_subscribed\">ਤੁਸੀਂ ਇਸ ਚੈਨਲ ਨੂੰ ਸਬਸਕ੍ਰਾਈਬ ਕਰ ਲਿਆ ਹੈ</string>\n    <string name=\"no_video_streams_available_for_external_players\">ਕੋਈ ਵੀਡੀਓ ਸਟ੍ਰੀਮ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ਐਕਸੋਪਲੇਅਰ ਡਿਫ਼ਾਲਟ</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">ਕੀ ਤੁਹਾਨੂੰ ਲੱਗਦਾ ਹੈ ਫੀਡ ਹੌਲੀ ਲੋਡ ਹੋ ਰਹੀ ਹੈ\\? ਅਜਿਹਾ ਹੈ ਤਾਂ ਤੇਜ਼ ਫੀਡ ਕ੍ਰਿਆਸ਼ੀਲ ਕਰਕੇ ਵੇਖੋ (ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਜਾਂ ਹੇਠਲਾ ਬਟਨ ਦੱਬ ਕੇ ਕਰ ਸਕਦੇ ਹੋ )\n\\n\n\\nਨਿਊਪਾਈਪ ਫੀਡ ਲੋਡ ਕਰਨ ਲਈ ਦੋ ਤਰਾਂ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਦੀ ਹੈ:\n\\n• ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਚੈਨਲ ਤੋਂ ਪੂਰੀ ਜਾਣਕਾਰੀ ਲੈਂਦੀ ਹੈ ਜੋ ਹੌਲ੍ਹੀ ਮਿਲਦੀ ਹੈ।\n\\n• ਸਮਰਪਿਤ ਸੇਵਾ ਅੰਤਮ ਬਿੰਦੂ ਤੋਂ, ਜੋ ਕਿ ਤੇਜ਼ ਮਿਲਦੀ ਹੈ ਪਰ ਆਮਤੌਰ ਤੇ ਅਧੂਰੀ/ਅਣਸਟੀਕ ਹੁੰਦੀ ਹੈ।\n\\n\n\\nਇਨਾਂ ਦੋਹਾਂ ਵਿੱਚ ਫਰਕ ਇਹ ਹੁੰਦਾ ਹੈ ਕਿ ਤੇਜ਼ ਤਰੀਕਾ ਆਮ ਤੌਰ ਤੇ ਕੁਝ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦੇ ਪਾਉਂਦਾ ਜਿਵੇਂ ਕਿ ਨਗਾਂ ਦੀ ਅਵਧੀ ਜਾਂ ਕਿਸਮ(ਕਿ ਵੀਡੀਓ ਲਾਈਵ ਹਨ ਜਾਂ ਆਮ) ਤੇ ਘੱਟ ਨਗ ਦਿਖ ਸਕਦੇ ਹਨ।\n\\n\n\\nਯੂਟਿਊਬ ਇੱਕ ਅਜਿਹੀ ਸੇਵਾ ਹੈ ਜਿਹੜੀ RSS ਫੀਡ ਜ਼ਰੀਏ ਇਹ ਤੇਜ਼ ਤਰੀਕਾ ਪ੍ਰਦਾਨ ਕਰਦੀ ਹੈ।\n\\n\n\\nਤੁਹਾਡੀ ਚੋਣ ਇਸ ਗੱਲ ਤੇ ਮੁਨੱਸਰ ਕਰਦੀ ਹੈ ਕਿ ਤੁਸੀਂ ਗਤੀ ਤੇ ਸਟੀਕਤਾ ਵਿੱਚੋਂ ਕਿਸ ਨੂੰ ਪ੍ਰਾਥਮਿਕਤਾ ਦਿੰਦੇ ਹੋ।</string>\n    <string name=\"fast_mode\">ਤੇਜ ਮੋਡ</string>\n    <string name=\"import_subscriptions_hint\">3-ਡੌਟ ਮੀਨੂ ਤੋਂ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਨੂੰ ਆਯਾਤ ਜਾਂ ਨਿਰਯਾਤ ਕਰੋ</string>\n    <string name=\"app_update_unavailable_toast\">ਤੁਸੀਂ ਨਿਊਪਾਈਪ ਦਾ ਨਵੀਨਤਮ ਸੰਸਕਰਣ ਚਲਾ ਰਹੇ ਹੋ</string>\n    <string name=\"app_update_available_notification_text\">%s ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ</string>\n    <string name=\"night_theme_available\">ਇਹ ਵਿਕਲਪ ਤਾਂ ਹੀ ਉਪਲਬਧ ਹੁੰਦਾ ਹੈ ਜੇਕਰ %s ਨੂੰ ਥੀਮ ਲਈ ਚੁਣਿਆ ਜਾਂਦਾ ਹੈ</string>\n    <string name=\"unset_playlist_thumbnail\">ਸਥਾਈ ਥੰਮਨੇਲ ਨੂੰ ਅਨਸੈੱਟ ਕਰੋ</string>\n    <string name=\"msg_failed_to_copy\">ਕਲਿੱਪਬੋਰਡ \\'ਤੇ ਕਾਪੀ ਕਰਨ ਵਿੱਚ ਅਸਫਲ</string>\n    <string name=\"card\">ਕਾਰਡ</string>\n    <string name=\"duplicate_in_playlist\">ਧੁੰਦਲੀਆਂ ਕੀਤੀਆਂ ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਇਹ ਆਈਟਮ ਹੈ।</string>\n    <string name=\"playlist_add_stream_success_duplicate\">ਡੁਪਲੀਕੇਟ ਜੋੜ੍ਹਿਆ ਗਿਆ %d ਵਾਰ</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">ਉਪਯੋਗੀ ਹੈ, ਉਦਾਹਰਨ ਲਈ, ਜੇਕਰ ਤੁਸੀਂ ਟੁੱਟੇ ਭੌਤਿਕ ਬਟਨਾਂ ਵਾਲਾ ਹੈੱਡਸੈੱਟ ਵਰਤ ਰਹੇ ਹੋ</string>\n    <string name=\"remove_duplicates\">ਡੁਪਲੀਕੇਟ ਹਟਾਓ</string>\n    <string name=\"remove_duplicates_title\">ਡੁਪਲੀਕੇਟ ਹਟਾਉਣੇ ਹਨ\\?</string>\n    <string name=\"remove_duplicates_message\">ਕੀ ਤੁਸੀਂ ਇਸ ਪਲੇਲਿਸਟ ਵਿੱਚ ਸਾਰੀਆਂ ਡੁਪਲੀਕੇਟ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\\?</string>\n    <string name=\"feed_hide_streams_title\">ਨਿਮਨਲਿਖਤ ਸਟ੍ਰੀਮਾਂ ਵਿਖਾਓ</string>\n    <string name=\"feed_show_watched\">ਪੂਰੀ ਵੇਖਿਆ</string>\n    <string name=\"feed_show_partially_watched\">ਅੰਸ਼ਕ ਤੌਰ \\'ਤੇ ਵੇਖਿਆ ਗਿਆ</string>\n    <string name=\"feed_show_upcoming\">ਆਗਾਮੀ</string>\n    <string name=\"ignore_hardware_media_buttons_title\">ਹਾਰਡਵੇਅਰ ਮੀਡੀਆ ਬਟਨ ਇਵੈਂਟਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰੋ</string>\n    <string name=\"feed_show_hide_streams\">ਸਟ੍ਰੀਮ ਵਿਖਾਓ/ਲੁਕਾਓ</string>\n    <string name=\"right_gesture_control_title\">ਸੱਜੇ ਪਾਸੇ ਦੀ ਸੰਕੇਤ ਕਿਰਿਆ</string>\n    <string name=\"left_gesture_control_title\">ਖੱਬੇ ਪਾਸੇ ਦੀ ਸੰਕੇਤ ਕਿਰਿਆ</string>\n    <string name=\"brightness\">ਚਮਕ</string>\n    <string name=\"none\">ਕੋਈ ਨਹੀਂ</string>\n    <string name=\"left_gesture_control_summary\">ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਖੱਬੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ</string>\n    <string name=\"right_gesture_control_summary\">ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਸੱਜੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ</string>\n    <string name=\"volume\">ਆਵਾਜ਼</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">ਇਹ ਆਪਸ਼ਨ ਨੂੰ ਇਨੇਬਲ ਕਰੋ ਜੇ ਤੁਹਾਨੂੰ ਡੀਕੋਡਰ ਸ਼ੁਰੂ ਕਰਨ ਦੀਆਂ ਸਮੱਸਿਆਵਾਂ ਹਨ, ਜੋ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰਾਂ ਦੀ ਸ਼ੁਰੂਆਤ ਅਸਫਲ ਹੋਣ ਤੇ ਹੇਠਲੇ-ਪ੍ਰਾਥਮਿਕਤਾ ਡੀਕੋਡਰਾਂ \\'ਤੇ ਵਾਪਸ ਲੈ ਜਾਂਦੀ ਹੈ। ਇਸ ਨਾਲ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰਾਂ ਦੀ ਤੁਲਨਾ ਮਾੜੀ ਪਲੇਅਬੈਕ ਕਾਰਗੁਜ਼ਾਰੀ ਹੋ ਸਕਦੀ ਹੈ</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">ਇਹ ਵਰਕਅਰਾਊਂਡ ਸਤਹ ਨੂੰ ਸਿੱਧਾ ਕੋਡੇਕ ਤੇ ਸੈੱਟ ਕਰਨ ਦੀ ਬਜਾਏ, ਸਤਹ ਵਿੱਚ ਤਬਦੀਲੀ ਹੋਣ ਤੇ ਵੀਡੀਓ ਕੋਡੈਕਸ ਨੂੰ ਜਾਰੀ ਅਤੇ ਮੁੜ-ਬਹਾਲ ਕਰਦਾ ਹੈ। ਇਸ ਸਮੱਸਿਆ ਵਾਲੇ ਕੁਝ ਡਿਵਾਈਸਾਂ \\'ਤੇ ਐਕਸੋਪਲੇਅਰ ਦੁਆਰਾ ਇਹ ਪਹਿਲਾਂ ਹੀ ਵਰਤਿਆ ਜਾ ਰਿਹਾ ਹੈ, ਇਸ ਸੈਟਿੰਗ ਦਾ ਸਿਰਫ਼ ਐਂਡਰੌਇਡ 6 ਅਤੇ ਉਸ ਤੋਂ ਵੱਧ \\'ਤੇ ਪ੍ਰਭਾਵ ਹੈ\n\\n\n\\nਇਸ ਵਿਕਲਪ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਨਾਲ ਮੌਜੂਦਾ ਵੀਡੀਓ ਪਲੇਅਰ ਨੂੰ ਸਵਿੱਚ ਕਰਨ ਜਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \\'ਤੇ ਸਵਿੱਚ ਕਰਨ ਵੇਲੇ ਪਲੇਅਬੈਕ ਤਰੁੱਟੀਆਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ</string>\n    <string name=\"prefer_original_audio_title\">ਮੂਲ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ</string>\n    <string name=\"prefer_original_audio_summary\">ਭਾਸ਼ਾ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ ਮੂਲ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ</string>\n    <string name=\"prefer_descriptive_audio_title\">ਵਰਣਨਾਤਮਕ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ</string>\n    <string name=\"prefer_descriptive_audio_summary\">ਜੇ ਉਪਲਬਧ ਹੋਵੇ ਤਾਂ ਦ੍ਰਿਸ਼ਟੀ ਤੋਂ ਅਪੰਗ ਲੋਕਾਂ ਵਾਸਤੇ ਵਰਣਨਾਂ ਵਾਲਾ ਕੋਈ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ</string>\n    <string name=\"play_queue_audio_track\">ਆਡੀਓ: %s</string>\n    <string name=\"audio_track\">ਆਡੀਓ ਟਰੈਕ</string>\n    <string name=\"audio_track_present_in_video\">ਇੱਕ ਆਡੀਓ ਟਰੈਕ ਇਸ ਸਟ੍ਰੀਮ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ</string>\n    <string name=\"select_audio_track_external_players\">ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ</string>\n    <string name=\"unknown_audio_track\">ਅਗਿਆਤ</string>\n    <string name=\"settings_category_exoplayer_title\">ਐਕਸੋਪਲੇਅਰ ਸੈਟਿੰਗਾਂ</string>\n    <string name=\"settings_category_exoplayer_summary\">ਕੁਝ ਐਕਸੋਪਲੇਅਰ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ। ਇਹਨਾਂ ਤਬਦੀਲੀਆਂ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਪਲੇਅਰ ਦੁਬਾਰਾ ਚਲਾਉਣ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">ਐਕਸੋਪਲੇਅਰ ਦੀ ਡੀਕੋਡਰ ਫਾਲਬੈਕ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੋ</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">ਹਮੇਸ਼ਾਂ ਐਕਸੋਪਲੇਅਰ ਦੇ ਵੀਡੀਓ ਆਉਟਪੁੱਟ ਸਤਹ ਸੈਟਿੰਗ ਵਰਕਰਾਊਂਡ ਦੀ ਵਰਤੋਂ ਕਰੋ</string>\n    <string name=\"audio_track_type_original\">ਅਸਲੀ</string>\n    <string name=\"audio_track_type_dubbed\">ਡੱਬ ਕੀਤਾ</string>\n    <string name=\"audio_track_type_descriptive\">ਵਰਣਨਾਤਮਕ</string>\n    <string name=\"main_tabs_position_title\">ਮੁੱਖ ਟੈਬਾਂ ਦੀ ਸਥਿਤੀ</string>\n    <string name=\"main_tabs_position_summary\">ਮੁੱਖ ਟੈਬ ਸਿਲੈਕਟਰ ਨੂੰ ਹੇਠਾਂ ਲੈ ਜਾਓ</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"disable_media_tunneling_automatic_info\">ਮੀਡੀਆ ਟਨਲਿੰਗ ਤੁਹਾਡੀ ਡਿਵਾਈਸ \\'ਤੇ ਡਿਫ਼ਾਲਟ ਤੌਰ \\'ਤੇ ਅਸਮਰੱਥ ਕੀਤੀ ਗਈ ਸੀ ਕਿਉਂਕਿ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਮਾਡਲ ਇਸਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਨ ਲਈ ਜਾਣਿਆ ਜਾਂਦਾ ਹੈ।</string>\n    <string name=\"no_streams\">ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ</string>\n    <string name=\"no_live_streams\">ਕੋਈ ਲਾਈਵ ਸਟ੍ਰੀਮ ਨਹੀਂ</string>\n    <string name=\"channel_tab_videos\">ਵੀਡੀਓਜ਼</string>\n    <string name=\"metadata_subscribers\">ਸਬਸਕ੍ਰਾਈਬਰਜ਼</string>\n    <string name=\"show_channel_tabs_summary\">ਚੈਨਲ ਪੰਨਿਆਂ \\'ਤੇ ਕਿਹੜੀਆਂ ਟੈਬਾਂ ਵਿਖਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ</string>\n    <string name=\"show_channel_tabs\">ਚੈਨਲ ਟੈਬਾਂ</string>\n    <string name=\"channel_tab_shorts\">ਸ਼ੌਰਟਸ</string>\n    <string name=\"loading_metadata_title\">ਮੈਟਾਡੇਟਾ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…</string>\n    <string name=\"feed_fetch_channel_tabs\">ਚੈਨਲ ਟੈਬਾਂ ਪ੍ਰਾਪਤ ਕਰੋ</string>\n    <string name=\"channel_tab_about\">ਦੇ ਬਾਰੇ</string>\n    <string name=\"channel_tab_albums\">ਐਲਬਮਜ਼</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">ਫ਼ੀਡ ਅੱਪਡੇਟ ਕਰਨ ਵੇਲੇ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਟੈਬਾਂ। ਇਸ ਵਿਕਲਪ ਦਾ ਕੋਈ ਅਸਰ ਨਹੀਂ ਹੁੰਦਾ ਜੇਕਰ ਚੈਨਲ ਨੂੰ ਫਾਸਟ ਮੋਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।</string>\n    <string name=\"channel_tab_playlists\">ਪਲੇਲਿਸਟਾਂ</string>\n    <string name=\"channel_tab_tracks\">ਟ੍ਰੈਕਸ</string>\n    <string name=\"channel_tab_channels\">ਚੈਨਲਜ਼</string>\n    <string name=\"channel_tab_livestreams\">ਲਾਈਵ</string>\n    <string name=\"toggle_screen_orientation\">ਸਕ੍ਰੀਨ ਸਥਿਤੀ ਨੂੰ ਟੌਗਲ ਕਰੋ</string>\n    <string name=\"toggle_fullscreen\">ਫੁੱਲ ਸਕ੍ਰੀਨ ਨੂੰ ਟੌਗਲ ਕਰੋ</string>\n    <string name=\"next_stream\">ਅਗਲੀ ਸਟ੍ਰੀਮ</string>\n    <string name=\"open_play_queue\">ਪਲੇ ਕਤਾਰ ਖੋਲ੍ਹੋ</string>\n    <string name=\"forward\">ਅੱਗੇ ਕਰੋ</string>\n    <string name=\"rewind\">ਰੀਵਾਈਂਡ ਕਰੋ</string>\n    <string name=\"replay\">ਦੁਬਾਰਾ ਚਲਾਓ</string>\n    <string name=\"play\">ਚਲਾਓ</string>\n    <string name=\"more_options\">ਹੋਰ ਵਿਕਲਪ</string>\n    <string name=\"duration\">ਮਿਆਦ</string>\n    <string name=\"previous_stream\">ਪਿਛਲੀ ਸਟ੍ਰੀਮ</string>\n    <string name=\"image_quality_title\">ਚਿੱਤਰ ਕੁਆਲਿਟੀ</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"image_quality_low\">ਘੱਟ ਕੁਆਲਿਟੀ</string>\n    <string name=\"metadata_avatars\">ਅਵਤਾਰ</string>\n    <string name=\"metadata_subchannel_avatars\">ਉਪ-ਚੈਨਲ ਅਵਤਾਰ</string>\n    <string name=\"image_quality_none\">ਚਿੱਤਰ ਲੋਡ ਨਾ ਕਰੋ</string>\n    <string name=\"image_quality_high\">ਉੱਚ ਕੁਆਲਿਟੀ</string>\n    <string name=\"image_quality_medium\">ਦਰਮਿਆਨੀ ਕੁਆਲਿਟੀ</string>\n    <string name=\"metadata_uploader_avatars\">ਅਪਲੋਡਰ ਅਵਤਾਰ</string>\n    <string name=\"metadata_banners\">ਬੈਨਰ</string>\n    <string name=\"image_quality_summary\">ਡਾਟਾ ਅਤੇ ਮੈਮੋਰੀ ਵਰਤੋਂ ਨੂੰ ਘਟਾਉਣ ਲਈ ਚਿੱਤਰਾਂ ਦੀ ਗੁਣਵੱਤਾ ਅਤੇ ਚਿੱਤਰਾਂ ਨੂੰ ਬਿਲਕੁਲ ਲੋਡ ਕਰਨਾ ਹੈ ਜਾਂ ਨਹੀਂ, ਚੁਣੋ। ਤਬਦੀਲੀਆਂ ਇਨ-ਮੈਮੋਰੀ ਅਤੇ ਆਨ-ਡਿਸਕ ਚਿੱਤਰ ਕੈਸ਼ ਨੂੰ ਸਾਫ਼ ਕਰਦੀਆਂ ਹਨ — %s</string>\n    <string name=\"metadata_thumbnails\">ਥੰਮਨੇਲ</string>\n    <string name=\"share_playlist_with_list\">URL ਸੂਚੀ ਸਾਂਝੀ ਕਰੋ</string>\n    <string name=\"share_playlist_with_titles\">ਸਿਰਲੇਖਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">ਪਲੇਲਿਸਟ ਸਾਂਝੀ ਕਰੋ</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s ਜਵਾਬ</item>\n        <item quantity=\"other\">%s ਜਵਾਬ</item>\n    </plurals>\n    <string name=\"show_more\">ਹੋਰ ਵਿਖਾਓ</string>\n    <string name=\"notification_actions_summary_android13\">ਇਸ \\'ਤੇ ਟੈਪ ਕਰਕੇ ਹੇਠਾਂ ਹਰੇਕ ਸੂਚਨਾ ਕਾਰਵਾਈ ਨੂੰ ਸੰਪਾਦਿਤ ਕਰੋ। ਪਹਿਲੀਆਂ ਤਿੰਨ ਕਾਰਵਾਈਆਂ (ਚਲਾਓ/ਰੋਕੋ, ਪਿਛਲਾ ਅਤੇ ਅਗਲਾ) ਸਿਸਟਮ ਦੁਆਰਾ ਸੈੱਟ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਅਨੁਕੂਲਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।</string>\n    <string name=\"show_less\">ਘੱਟ ਵਿਖਾਓ</string>\n    <string name=\"yes\">ਹਾਂ</string>\n    <string name=\"auto_update_check_description\">ਨਿਊਪਾਈਪ ਸਮੇਂ-ਸਮੇਂ \\'ਤੇ ਨਵੇਂ ਸੰਸਕਰਣਾਂ ਦੀ ਸਵੈਚਲਿਤ ਤੌਰ \\'ਤੇ ਜਾਂਚ ਕਰ ਸਕਦੀ ਹੈ ਅਤੇ ਇੱਕ ਵਾਰ ਉਪਲਬਧ ਹੋਣ \\'ਤੇ ਤੁਹਾਨੂੰ ਸੂਚਿਤ ਕਰ ਸਕਦੀ ਹੈ।\n\\nਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਇਨੇਬਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</string>\n    <string name=\"settings_category_backup_restore_title\">ਬੈਕਅੱਪ ਅਤੇ ਰੀਸਟੋਰ</string>\n    <string name=\"reset_settings_title\">ਸੈਟਿੰਗਾਂ ਨੂੰ ਰੀਸੈਟ ਕਰੋ</string>\n    <string name=\"reset_settings_summary\">ਸਾਰੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਉਹਨਾਂ ਦੇ ਡਿਫ਼ਾਲਟ ਮੁੱਲਾਂ \\'ਤੇ ਰੀਸੈਟ ਕਰੋ</string>\n    <string name=\"reset_all_settings\">ਸਾਰੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨ ਨਾਲ ਤੁਹਾਡੀਆਂ ਸਾਰੀਆਂ ਤਰਜੀਹੀ ਸੈਟਿੰਗਾਂ ਰੱਦ ਹੋ ਜਾਣਗੀਆਂ ਅਤੇ ਐਪ ਰੀਸਟਾਰਟ ਹੋ ਜਾਵੇਗਾ।\n\\n\n\\nਕੀ ਤੁਸੀਂ ਯਕੀਨੀ ਤੌਰ \\'ਤੇ ਅੱਗੇ ਵਧਣਾ ਚਾਹੁੰਦੇ ਹੋ?</string>\n    <string name=\"error_insufficient_storage\">ਡਿਵਾਈਸ \\'ਤੇ ਲੋੜੀਂਦੀ ਖਾਲੀ ਥਾਂ ਨਹੀਂ ਹੈ</string>\n    <string name=\"no\">ਨਹੀਂ</string>\n    <string name=\"import_settings_vulnerable_format\">ਇੰਪੋਰਟ ਕੀਤੇ ਜਾ ਰਹੇ ਐਕਸਪੋਰਟ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਇੱਕ ਕਮਜ਼ੋਰ ਫਾਰਮੈਟ ਦੀ ਵਰਤੋਂ ਕਰਦੀਆਂ ਹਨ ਜੋ ਨਿਊਪਾਈਪ 0.27.0 ਤੋਂ ਬਰਤਰਫ਼ ਕੀਤਾ ਗਿਆ ਸੀ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਇੰਪੋਰਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਨਿਰਯਾਤ ਇੱਕ ਭਰੋਸੇਯੋਗ ਸਰੋਤ ਤੋਂ ਹੈ, ਅਤੇ ਸਿਰਫ਼ ਨਿਊਪਾਈਪ 0.27.0 ਜਾਂ ਇਸਤੋਂ ਨਵੇਂ ਤੋਂ ਪ੍ਰਾਪਤ ਕੀਤੇ ਐਕਸਪੋਰਟ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨੂੰ ਤਰਜੀਹ ਦਿਓ। ਇਸ ਕਮਜ਼ੋਰ ਫਾਰਮੈਟ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਨੂੰ ਆਯਾਤ ਕਰਨ ਲਈ ਸਮਰਥਨ ਜਲਦੀ ਹੀ ਪੂਰੀ ਤਰ੍ਹਾਂ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ ਅਤੇ ਫਿਰ ਨਿਊਪਾਈਪ ਦੇ ਪੁਰਾਣੇ ਸੰਸਕਰਣ ਹੁਣ ਨਵੇਂ ਸੰਸਕਰਣਾਂ ਤੋਂ ਐਕਸਪੋਰਟ ਦੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਇੰਪੋਰਟ ਕਰਨ ਦੇ ਯੋਗ ਨਹੀਂ ਹੋਣਗੇ।</string>\n    <string name=\"audio_track_type_secondary\">ਸੈਕੰਡਰੀ</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">ਅਸਥਾਈ ਯੂਟਿਊਬ ਪਲੇਲਿਸਟ ਵਜੋਂ ਸਾਂਝਾ ਕਰੋ</string>\n    <string name=\"tab_bookmarks_short\">ਪਲੇਲਿਸਟਾਂ</string>\n    <string name=\"search_with_service_name\">%1$s ਖੋਜੋ</string>\n    <string name=\"search_with_service_name_and_filter\">%1$s (%2$s) ਖੋਜੋ</string>\n    <string name=\"select_a_feed_group\">ਫੀਡ ਗਰੁੱਪ ਚੁਣੋ</string>\n    <string name=\"no_feed_group_created_yet\">ਅਜੇ ਤੱਕ ਕੋਈ ਫੀਡ ਗਰੁੱਪ ਨਹੀਂ ਬਣਾਇਆ ਗਿਆ</string>\n    <string name=\"feed_group_page_summary\">ਚੈਨਲ ਗਰੁੱਪ ਪੰਨਾ</string>\n    <string name=\"channel_tab_likes\">ਪਸੰਦ</string>\n    <string name=\"delete_file\">ਫ਼ਾਈਲ ਮਿਟਾਓ</string>\n    <string name=\"delete_entry\">ਐਂਟਰੀ ਮਿਟਾਓ</string>\n    <string name=\"account_terminated_service_provides_reason\">ਖ਼ਾਤਾ ਬੰਦ ਕੀਤਾ ਗਿਆ\\n\\n%1$s ਇਹ ਕਾਰਨ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ: %2$s</string>\n    <string name=\"entry_deleted\">ਐਂਟਰੀ ਮਿਟਾ ਦਿੱਤੀ ਗਈ</string>\n    <string name=\"permission_display_over_apps_message\">ਪੌਪਅੱਪ ਪਲੇਅਰ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਦਿੱਤੇ Android ਸੈਟਿੰਗ ਮੀਨੂ ਵਿੱਚ %1$s ਚੁਣੋ ਅਤੇ %2$s ਨੂੰ ਇਨੇਬਲ ਕਰੋ।</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"ਹੋਰ ਐਪਾਂ ਉੱਤੇ ਡਿਸਪਲੇ ਦੀ ਆਗਿਆ ਦਿਓ\\\"</string>\n    <string name=\"short_thousand\">%sਹਜ਼ਾਰ</string>\n    <string name=\"short_million\">%sਮਿਲੀਅਨ</string>\n    <string name=\"short_billion\">%sਅਰਬ</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud ਟੌਪ 50 ਪੰਨਾ ਹਟਾ ਦਿੱਤਾ ਗਿਆ</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud ਨੇ ਮੂਲ ਟੌਪ 50 ਚਾਰਟਾਂ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। ਸੰਬੰਧਿਤ ਟੈਬ ਨੂੰ ਤੁਹਾਡੇ ਮੁੱਖ ਪੰਨੇ ਤੋਂ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।</string>\n    <string name=\"migration_info_7_8_title\">YouTube ਸੰਯੁਕਤ ਰੁਝਾਨ ਹਟਾਇਆ ਗਿਆ</string>\n    <string name=\"migration_info_7_8_message\">YouTube ਨੇ 21 ਜੁਲਾਈ 2025 ਤੋਂ ਸੰਯੁਕਤ \\\"ਰੁਝਾਨ ਵਿੱਚ\\\" ਪੰਨੇ ਨੂੰ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ। NewPipe ਨੇ ਡਿਫ਼ਾਲਟ \\\"ਰੁਝਾਨ ਵਿੱਚ\\\" ਪੰਨੇ ਨੂੰ ਟ੍ਰੈਂਡਿੰਗ ਲਾਈਵਸਟ੍ਰੀਮਾਂ ਨਾਲ ਬਦਲ ਦਿੱਤਾ ਹੈ।\\n\\nਤੁਸੀਂ \\\"ਸੈਟਿੰਗਾਂ &gt; ਸਮੱਗਰੀ &gt; ਮੁੱਖ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ\\\" ਵਿੱਚ ਵੱਖ-ਵੱਖ ਟ੍ਰੈਂਡਿੰਗ ਪੰਨਿਆਂ ਨੂੰ ਵੀ ਚੁਣ ਸਕਦੇ ਹੋ।</string>\n    <string name=\"trending_gaming\">ਗੇਮਿੰਗ ਟ੍ਰੈਂਡਸ</string>\n    <string name=\"trending_podcasts\">ਟ੍ਰੈਂਡਿੰਗ ਪੌਡਕਾਸਟ</string>\n    <string name=\"trending_movies\">ਟਰੈਂਡਿੰਗ ਫ਼ਿਲਮਾਂ ਅਤੇ ਸ਼ੋਅ</string>\n    <string name=\"trending_music\">ਟਰੈਂਡਿੰਗ ਸੰਗੀਤ</string>\n    <string name=\"player_http_403\">ਪਲੇਅ ਕਰਦੇ ਸਮੇਂ ਸਰਵਰ ਤੋਂ HTTP error 403 ਪ੍ਰਾਪਤ ਹੋਇਆ, ਜੋ ਸ਼ਾਇਦ ਸਟ੍ਰੀਮਿੰਗ URL ਦੀ ਮਿਆਦ ਪੁੱਗਣ ਜਾਂ IP ਦੀ ਪਾਬੰਦੀ ਕਾਰਨ ਹੋਈ ਹੈ</string>\n    <string name=\"player_http_invalid_status\">ਚਲਾਉਣ ਦੌਰਾਨ ਸਰਵਰ ਤੋਂ HTTP error %1$s ਪ੍ਰਾਪਤ ਹੋਇਆ</string>\n    <string name=\"youtube_player_http_403\">ਪਲੇਅ ਕਰਦੇ ਸਮੇਂ ਸਰਵਰ ਤੋਂ HTTP error 403 ਪ੍ਰਾਪਤ ਹੋਇਆ, ਜੋ ਸ਼ਾਇਦ IP ਬੈਨ ਜਾਂ ਸਟ੍ਰੀਮਿੰਗ URL ਡੀਔਬਫਸਕੇਸ਼ਨ ਸਮੱਸਿਆਵਾਂ ਕਾਰਨ ਹੋਈ ਹੈ</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s ਨੇ ਡੇਟਾ ਪ੍ਰਦਾਨ ਕਰਨ ਤੋਂ ਇਨਕਾਰ ਕਰ ਦਿੱਤਾ, ਅਤੇ ਇਹ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ ਲੌਗਇਨ ਕਰਨ ਲਈ ਕਿਹਾ ਕਿ ਬੇਨਤੀਕਰਤਾ ਬੋਟ ਨਹੀਂ ਹੈ।\\n\\nਹੋ ਸਕਦਾ ਹੈ ਕਿ %1$s ਨੇ ਤੁਹਾਡੇ IP ਨੂੰ ਅਸਥਾਈ ਤੌਰ \\'ਤੇ ਪਾਬੰਦੀ ਲਗਾਈ ਹੋਵੇ, ਤੁਸੀਂ ਕੁਝ ਸਮਾਂ ਉਡੀਕ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਕਿਸੇ ਵੱਖਰੇ IP \\'ਤੇ ਸਵਿੱਚ ਕਰ ਸਕਦੇ ਹੋ (ਉਦਾਹਰਣ ਵਜੋਂ VPN ਨੂੰ ਚਾਲੂ/ਬੰਦ ਕਰਕੇ, ਜਾਂ WiFi ਤੋਂ ਮੋਬਾਈਲ ਡੇਟਾ \\'ਤੇ ਸਵਿੱਚ ਕਰਕੇ)।</string>\n    <string name=\"unsupported_content_in_country\">ਇਹ ਸਮੱਗਰੀ ਵਰਤਮਾਨ ਵਿੱਚ ਚੁਣੇ ਗਏ ਦੇਸ਼ ਦੀ ਸਮੱਗਰੀ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।\\n\\n\\\"ਸੈਟਿੰਗਾਂ &gt; ਸਮੱਗਰੀ &gt; ਡਿਫ਼ਾਲਟ ਸਮੱਗਰੀ ਦੇਸ਼\\\" ਤੋਂ ਆਪਣੀ ਚੋਣ ਬਦਲੋ।</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-pa-rPK/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"search\">کھوجو</string>\n    <string name=\"download_path_title\">ویڈیو ڈاؤن‌لوڈ دا فولڈر</string>\n    <string name=\"download_path_summary\">ڈاؤن‌لوڈ کیتیاں ویڈیو اِتھے جمھااں ہندیاں ہن</string>\n    <string name=\"default_resolution_title\">ریزولوشن دا مول</string>\n    <string name=\"default_popup_resolution_title\">تیردی تصویر لئی ریزولوشن دا مول</string>\n    <string name=\"search_showing_result_for\">%s لئی نتیجے وِکھاۓ جا رہے ہن</string>\n    <string name=\"use_external_video_player_summary\">کجھ ریزولوشناں تے آواز نوں ہٹا دِندے</string>\n    <string name=\"download_path_audio_dialog_title\">آڈیو فائلاں لئی ڈاؤن لوڈ فولڈر دا انتخاب کرو</string>\n    <string name=\"play_with_kodi_title\">کوڈی نال چلاؤ</string>\n    <string name=\"notification_colorize_summary\">اینڈروئیڈ نوں تھمنیل دے رکھ مطابق نوٹ دا رنگ بدلݨ دیو (دھیان دیو کہ ایہہ ہریک ڈِوائیس تے اًپلبدھ نہیں اے)</string>\n    <string name=\"upload_date_text\">%1$s نوں جاری کیتی گئی</string>\n    <string name=\"controls_popup_title\">تیردی تصویر</string>\n    <string name=\"subscribe_button_title\">چندہ دیݨو</string>\n    <string name=\"subscribed_button_title\">چندہ دِتا گیا</string>\n    <string name=\"unsubscribe\">چندہ بند کرو</string>\n    <string name=\"channel_unsubscribed\">چندہ بند کیتا گیا</string>\n    <string name=\"subscription_change_failed\">چندہ بدل نہیں سکیا</string>\n    <string name=\"subscription_update_failed\">چندہ نواں کرن نہیں سکیا</string>\n    <string name=\"tab_subscriptions\">چندے</string>\n    <string name=\"show_play_with_kodi_title\">”کوڈی نال چلاؤ“ چݨ دِکھاؤ</string>\n    <string name=\"show_play_with_kodi_summary\">کوڈی میڈیا کیندر نہیں ویڈیو چلاؤݨ دی چݨ وِکھاؤ</string>\n    <string name=\"notification_action_0_title\">پہلا کاروائی بٹن</string>\n    <string name=\"notification_action_1_title\">دوجا کاروائی بٹن</string>\n    <string name=\"notification_action_2_title\">تیجا کاردائی بٹن</string>\n    <string name=\"notification_action_3_title\">چوتھا کاروائی بٹن</string>\n    <string name=\"notification_action_repeat\">دُہراؤ</string>\n    <string name=\"notification_action_shuffle\">پھینٹݨا</string>\n    <string name=\"notification_action_buffering\">بفر کردے</string>\n    <string name=\"notification_action_nothing\">کجھ وی نہیں</string>\n    <string name=\"notification_colorize_title\">رنگدار نوٹ</string>\n    <string name=\"play_audio\">آڈیو</string>\n    <string name=\"default_audio_format_title\">آڈیو فارمیٹ دا مول</string>\n    <string name=\"default_video_format_title\">وہڈیو فارمیٹ دا مول</string>\n    <string name=\"theme_title\">تھیم</string>\n    <string name=\"light_theme_title\">روشنی</string>\n    <string name=\"dark_theme_title\">گوڑی</string>\n    <string name=\"seek_duration_title\">اگے لنگھاؤݨ یا پچھے کرن دی سماں معد</string>\n    <string name=\"clear_queue_confirmation_description\">سرگرم پکیئر کتار جاوےگا</string>\n    <string name=\"clear_queue_confirmation_title\">کتار نوں خالی کرن توں پہلاں تصویر کرن لئی پچھو</string>\n    <string name=\"show_comments_summary\">ٹپݨیاں وکھاؤݨا روکݨ لئی ایسنوں بند کرو</string>\n    <string name=\"show_comments_title\">ٹپݨیاں دِکھاؤ</string>\n    <string name=\"show_description_title\">وہروا دِکھاؤ</string>\n    <string name=\"show_next_and_similar_title\">”اگے“ تے ”سمانانتر“ ویڈیو دکھاؤ</string>\n    <string name=\"show_meta_info_title\">میٹا جاݨکاری دِکھاؤ</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">تصویر دی کیش ہٹا دتی گئی اے</string>\n    <string name=\"metadata_cache_wipe_summary\">کیش وچ سارے ویب‌سائیٹ دے ڈیٹے ہٹاؤ</string>\n    <string name=\"auto_queue_summary\">اِکّ نا دہراؤݨ والی کتار نوں، سمبندھت سٹریم جوڑدیاں، مُکاؤندے رہو</string>\n    <string name=\"download_dialog_title\">ڈاؤن‌لوڈ</string>\n    <string name=\"enable_watch_history_title\">پہلاں توں ویکھیاں ہوئیاں چیزاں دی لسٹ</string>\n    <string name=\"enable_playback_resume_title\">پلےبیک دوبارہ شروع کرو</string>\n    <string name=\"enable_watch_history_summary\">دیکھو گئے ویڈیواں دی لسٹ رکھو</string>\n    <string name=\"resume_on_audio_focus_gain_title\">چلاؤݨا مُڑ شروع کرو</string>\n    <string name=\"unsupported_url_dialog_message\">ایہہ کڑی دا پتہ پچھاݨ نہیں ہویا۔ کسے ہور اَیپ نال کھولھݨا اے؟</string>\n    <string name=\"default_content_country_title\">ویڈیواں لئی دیش دا مول</string>\n    <string name=\"content_language_title\">یوٹوب توں لکھتاں لئی بولی دا مول</string>\n    <string name=\"settings_category_player_title\">پلیئر</string>\n    <string name=\"settings_category_history_title\">اتیت تے کیش</string>\n    <string name=\"settings_category_debug_title\">ڈیبگ کرو</string>\n    <string name=\"duration_live\">لائیوَ</string>\n    <string name=\"downloads\">ڈاؤن‌لوڈ</string>\n    <string name=\"downloads_title\">ڈاؤن‌لوڈ</string>\n    <string name=\"all\">سارے</string>\n    <string name=\"channels\">چینلاں</string>\n    <string name=\"playlists\">پلےلِسٹاں</string>\n    <string name=\"videos_string\">ویڈیو</string>\n    <string name=\"tracks\">ٹریک</string>\n    <string name=\"users\">ورتنوالے</string>\n    <string name=\"songs\">گیت</string>\n    <string name=\"albums\">البم</string>\n    <string name=\"open_in_popup_mode\">تیردی تصویر وچ کھُلھو</string>\n    <string name=\"no_player_found\">کوئی سٹریم پلیئر نہیں لبھیا۔ تسیں وی‌ایل‌سی اینسٹال کرنا چاہوگے؟</string>\n    <string name=\"no_player_found_toast\">کجھ سٹریم پلیئر نہیں لبھے اے (تسیں وی‌ایل‌سی اینسٹال کرکے ایسنوں چلا سکدے او)۔</string>\n    <string name=\"install\">اینسٹال کرو</string>\n    <string name=\"cancel\">رد کرو</string>\n    <string name=\"open_in_browser\">براؤزر وچ کھُلھو</string>\n    <string name=\"open_with\">ایس وچ کھُلھو</string>\n    <string name=\"share\">سانجھا کرو</string>\n    <string name=\"download\">ڈاؤن‌لوڈ کرو</string>\n    <string name=\"settings\">سیٹنگاں</string>\n    <string name=\"use_external_video_player_title\">باہری ویڈیو پکیئر ورتیو</string>\n    <string name=\"tab_choose\">ٹیب چݨو</string>\n    <string name=\"tab_bookmarks\">سامبھیاں پلےلِسٹاں</string>\n    <string name=\"download_path_audio_title\">آڈیو ڈاؤن‌لوڈ فوکڈر</string>\n    <string name=\"download_path_audio_summary\">ڈاؤن‌لوڈ کیتیاں آڈیو اِتھے جمھاں ہندیاں ہن</string>\n    <string name=\"notification_actions_at_most_three\">تسیں ودھ توں ودھ تِن کاروائیاں نوں پچیڑیاں اِطلاعاں وچ وِکھاؤݨ لئی چݨ سکدے او!</string>\n    <string name=\"black_theme_title\">ਕਾਲਾ</string>\n    <string name=\"ok\">ٹھيک اے</string>\n    <string name=\"controls_download_desc\">سٹریم دی فائل ڈاؤن‌لوڈ کرو</string>\n    <string name=\"did_you_mean\">کیہ تہاڈے مطلب سی ”%1$s“؟</string>\n    <string name=\"controls_background_title\">پچھوکڑ</string>\n    <string name=\"show_higher_resolutions_title\">وڈیاں ریزولوشن دِکھاؤ</string>\n    <string name=\"show_higher_resolutions_summary\">صرف کجھ ہی ڈِوائیس «2k/4k» ویڈیو نوں چلا سکدے ہن</string>\n    <string name=\"kore_not_found\">کورے اَیپ اینسٹال نہیں اے؟</string>\n    <string name=\"notification_action_4_title\">پنجواں کاروائی بٹن</string>\n    <string name=\"use_external_audio_player_title\">باہری آڈیو پلیئر ورتو</string>\n    <string name=\"controls_add_to_playlist_title\">ایس وچ جوڑو</string>\n    <string name=\"download_path_dialog_title\">ویڈیو فائلاں لئی ڈاؤن‌لوڈ فولڈر چݨو</string>\n    <string name=\"crash_the_player\">ویڈیو پلیئر کریش کرو</string>\n    <string name=\"night_theme_title\">رات والی تھیم</string>\n    <string name=\"clear_queue_confirmation_summary\">پلیئر بدلݨ نال تہاڈی بدل سکدی اے</string>\n    <string name=\"enable_search_history_title\">کھوج دا اتیت</string>\n    <string name=\"settings_category_video_audio_title\">ویڈیو تے آڈیو</string>\n    <string name=\"settings_category_clear_data_title\">ڈیٹا پٹاؤ</string>\n    <string name=\"settings_category_player_behavior_title\">ووہار</string>\n    <string name=\"share_dialog_title\">ایس نال سانجھا کرو</string>\n    <string name=\"show_info\">جاݨکاری ویکھاؤ</string>\n    <string name=\"main_bg_subtitle\">شروع کرن لئی وڈدرشی کچ نوں دباؤ۔</string>\n    <string name=\"show_description_summary\">ویڈیو ویروا تے وادھو جاݨکاری لُکاؤݨ لئی ایس ایسنوں بند کر دیو</string>\n    <string name=\"metadata_cache_wipe_title\">کیش وچ میٹا جاݨکاری ہٹاؤ</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">میٹا ڈیٹے دی کیش ہٹا دتی گئی اے</string>\n    <string name=\"auto_queue_toggle\">آپ‌مُختار کتار کردے</string>\n    <string name=\"show_search_suggestions_title\">کھوج سُجھا</string>\n    <string name=\"enable_playback_state_lists_title\">لسٹاں دیاں ستھتیاں</string>\n    <string name=\"enable_playback_resume_summary\">پچھلی پلےبیک ستھتی توں مُڑ چلاؤ</string>\n    <string name=\"settings_category_appearance_title\">دِکھ</string>\n    <string name=\"peertube_instance_add_https_only\">صرف ایچ‌ٹی‌ٹی‌پی‌ایس نال کڑی دا پتہ ہی ماݨنیوگ ہن</string>\n    <string name=\"mark_as_watched\">ویکھیا جا چُکیا چنت کرو</string>\n    <string name=\"content\">سمگری</string>\n    <string name=\"artists\">کلاکار</string>\n    <string name=\"disabled\">بند کیتا</string>\n    <string name=\"clear\">مٹاؤ</string>\n    <string name=\"file\">فائل</string>\n    <string name=\"undo\">موڑو</string>\n    <string name=\"always\">ہمیشہ</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-pl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Naciśnij lupkę, aby rozpocząć.</string>\n    <string name=\"install\">Zainstaluj</string>\n    <string name=\"cancel\">Anuluj</string>\n    <string name=\"open_in_browser\">Otwórz w przeglądarce</string>\n    <string name=\"share\">Udostępnij</string>\n    <string name=\"download\">Pobierz</string>\n    <string name=\"search\">Szukaj</string>\n    <string name=\"settings\">Ustawienia</string>\n    <string name=\"did_you_mean\">Czy chodziło Ci o „%1$s”\\?</string>\n    <string name=\"share_dialog_title\">Udostępnij</string>\n    <string name=\"use_external_video_player_title\">Używaj zewnętrznego odtwarzacza wideo</string>\n    <string name=\"use_external_audio_player_title\">Używaj zewnętrznego odtwarzacza audio</string>\n    <string name=\"upload_date_text\">Opublikowano %1$s</string>\n    <string name=\"no_player_found\">Nie znaleziono odtwarzacza strumieni. Zainstalować VLC\\?</string>\n    <string name=\"download_path_title\">Folder zapisywania wideo</string>\n    <string name=\"download_path_summary\">Pobrane pliki wideo są przechowywane tutaj</string>\n    <string name=\"download_path_dialog_title\">Wybierz folder zapisywania plików wideo</string>\n    <string name=\"download_path_audio_title\">Folder zapisywania audio</string>\n    <string name=\"download_path_audio_summary\">Pobrane pliki audio są przechowywane tutaj</string>\n    <string name=\"download_path_audio_dialog_title\">Wybierz folder zapisywania plików audio</string>\n    <string name=\"default_resolution_title\">Domyślna rozdzielczość</string>\n    <string name=\"play_with_kodi_title\">Odtwórz w Kodi</string>\n    <string name=\"kore_not_found\">Czy zainstalować brakującą aplikację Kore\\?</string>\n    <string name=\"show_play_with_kodi_title\">Pokazuj opcję „Odtwórz z Kodi”</string>\n    <string name=\"show_play_with_kodi_summary\">Wyświetlaj opcję odtwarzania wideo przez centrum multimedialne Kodi</string>\n    <string name=\"play_audio\">Dźwięk</string>\n    <string name=\"default_audio_format_title\">Domyślny format audio</string>\n    <string name=\"theme_title\">Motyw</string>\n    <string name=\"dark_theme_title\">Ciemny</string>\n    <string name=\"light_theme_title\">Jasny</string>\n    <string name=\"download_dialog_title\">Pobierz</string>\n    <string name=\"show_next_and_similar_title\">Pokazuj następne i powiązane wideo</string>\n    <string name=\"unsupported_url\">Nieobsługiwany adres URL</string>\n    <string name=\"content_language_title\">Domyślny język treści</string>\n    <string name=\"settings_category_video_audio_title\">Wideo i audio</string>\n    <string name=\"settings_category_appearance_title\">Wygląd</string>\n    <string name=\"background_player_playing_toast\">Odtwarzanie w tle</string>\n    <string name=\"content\">Zawartość</string>\n    <string name=\"show_age_restricted_content_title\">Pokazuj treści z ograniczeniami wiekowymi</string>\n    <string name=\"duration_live\">Na żywo</string>\n    <string name=\"downloads\">Pobrane</string>\n    <string name=\"downloads_title\">Pobrane</string>\n    <string name=\"error_report_title\">Raport o błędach</string>\n    <string name=\"general_error\">Błąd</string>\n    <string name=\"network_error\">Błąd sieci</string>\n    <string name=\"could_not_load_thumbnails\">Nie udało się załadować wszystkich miniatur</string>\n    <string name=\"parsing_error\">Nie udało się przetworzyć strony internetowej</string>\n    <string name=\"content_not_available\">Treść niedostępna</string>\n    <string name=\"could_not_setup_download_menu\">Nie udało się utworzyć menu pobierania</string>\n    <string name=\"sorry_string\">Przepraszamy, to nie powinno mieć miejsca.</string>\n    <string name=\"error_report_button_text\">Zgłoś przez e-mail</string>\n    <string name=\"error_snackbar_message\">Niestety, coś poszło nie tak</string>\n    <string name=\"error_snackbar_action\">Zgłoś</string>\n    <string name=\"what_device_headline\">Informacje:</string>\n    <string name=\"what_happened_headline\">Co się stało:</string>\n    <string name=\"info_labels\">Co:\\nŻądanie:\\nJęzyk treści:\\nKraj treści:\\nJęzyk aplikacji:\\nUsługa:\\nZnacznik czasu:\\nPakiet:\\nWersja:\\nWersja systemu:</string>\n    <string name=\"your_comment\">Twój komentarz (po angielsku):</string>\n    <string name=\"error_details_headline\">Szczegóły:</string>\n    <string name=\"detail_thumbnail_view_description\">Odtwarzane wideo, czas trwania:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Miniatura awatara przesyłającego</string>\n    <string name=\"detail_likes_img_view_description\">Polubienia</string>\n    <string name=\"detail_dislikes_img_view_description\">Łapki w dół</string>\n    <string name=\"video\">Wideo</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Ponów</string>\n    <string name=\"pause\">Wstrzymaj</string>\n    <string name=\"delete\">Usuń</string>\n    <string name=\"checksum\">Suma kontrolna</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Nazwa pliku</string>\n    <string name=\"msg_threads\">Wątki</string>\n    <string name=\"msg_error\">Błąd</string>\n    <string name=\"msg_running\">Pobieranie NewPipe</string>\n    <string name=\"msg_running_detail\">Naciśnij, aby zobaczyć szczegóły</string>\n    <string name=\"msg_wait\">Proszę czekać…</string>\n    <string name=\"msg_copied\">Skopiowano do schowka</string>\n    <string name=\"no_available_dir\">Zdefiniuj katalog zapisywania później w ustawieniach</string>\n    <string name=\"app_ui_crash\">Awaria aplikacji/interfejsu</string>\n    <string name=\"start\">Rozpocznij</string>\n    <string name=\"title_activity_recaptcha\">Zadanie reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Zażądano rozwiązania reCAPTCHA</string>\n    <string name=\"use_external_video_player_summary\">Usuwa dźwięk w niektórych rozdzielczościach</string>\n    <string name=\"controls_background_title\">W tle</string>\n    <string name=\"default_popup_resolution_title\">Domyślna rozdzielczość trybu okienkowego</string>\n    <string name=\"show_higher_resolutions_title\">Pokazuj wyższe rozdzielczości</string>\n    <string name=\"show_higher_resolutions_summary\">Tylko niektóre urządzenia mogą odtwarzać wideo w 2K/4K</string>\n    <string name=\"default_video_format_title\">Domyślny format wideo</string>\n    <string name=\"black_theme_title\">Czarny</string>\n    <string name=\"popup_remember_size_pos_title\">Pamiętaj właściwości trybu okienkowego</string>\n    <string name=\"popup_remember_size_pos_summary\">Zapamiętaj ostatni rozmiar i pozycję trybu okienkowego</string>\n    <string name=\"show_search_suggestions_title\">Podpowiedzi wyszukiwania</string>\n    <string name=\"show_search_suggestions_summary\">Wybierz podpowiedzi, które będą wyświetlane podczas wyszukiwania</string>\n    <string name=\"popup_playing_toast\">Odtwarzanie w trybie okienkowym</string>\n    <string name=\"all\">Wszystkie</string>\n    <string name=\"disabled\">Wyłączone</string>\n    <string name=\"clear\">Wyczyść</string>\n    <string name=\"msg_popup_permission\">To pozwolenie jest wymagane, aby\n\\notworzyć w trybie okienkowym</string>\n    <string name=\"open_in_popup_mode\">Otwórz w trybie okienkowym</string>\n    <string name=\"controls_popup_title\">Tryb okienkowy</string>\n    <string name=\"best_resolution\">Najlepsza rozdzielczość</string>\n    <string name=\"settings_category_downloads_title\">Pobieranie</string>\n    <string name=\"settings_file_replacement_character_summary\">Nieprawidłowe znaki są zastępowane tą wartością</string>\n    <string name=\"charset_letters_and_digits\">Litery i cyfry</string>\n    <string name=\"title_activity_about\">O NewPipe</string>\n    <string name=\"title_licenses\">Licencje innych firm</string>\n    <string name=\"tab_about\">O aplikacji i FAQ</string>\n    <string name=\"tab_licenses\">Licencje</string>\n    <string name=\"app_description\">Lekkie przesyłanie strumieniowe w systemie Android.</string>\n    <string name=\"view_on_github\">Zobacz na GitHubie</string>\n    <string name=\"app_license_title\">Licencja NewPipe</string>\n    <string name=\"contribution_encouragement\">Niezależnie od tego, czy masz pomysł na tłumaczenie, zmiany w projekcie, oczyszczenie kodu źródłowego, czy na naprawdę ciężkie zmiany w kodzie — pomoc jest zawsze mile widziana. Im więcej jest zrobione, tym lepiej!</string>\n    <string name=\"read_full_license\">Przeczytaj licencję</string>\n    <string name=\"contribution_title\">Wkład</string>\n    <string name=\"settings_file_charset_title\">Dozwolone znaki w nazwach plików</string>\n    <string name=\"settings_file_replacement_character_title\">Znak zastępczy</string>\n    <string name=\"copyright\" formatted=\"true\">©%1$s %2$s na licencji %3$s</string>\n    <string name=\"subscribe_button_title\">Subskrybuj</string>\n    <string name=\"subscribed_button_title\">Subskrybujesz</string>\n    <string name=\"channel_unsubscribed\">Anulowano subskrypcję kanału</string>\n    <string name=\"subscription_change_failed\">Nie udało się zmienić subskrypcji</string>\n    <string name=\"subscription_update_failed\">Nie udało się zaktualizować subskrypcji</string>\n    <string name=\"tab_subscriptions\">Subskrypcje</string>\n    <string name=\"fragment_feed_title\">Co nowego</string>\n    <string name=\"enable_search_history_title\">Historia wyszukiwania</string>\n    <string name=\"enable_search_history_summary\">Przechowuj lokalnie historię wyszukiwania</string>\n    <string name=\"enable_watch_history_title\">Historia oglądania</string>\n    <string name=\"enable_watch_history_summary\">Śledź obejrzane wideo</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Wznawiaj odtwarzanie</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Kontynuuj odtwarzanie po przerwaniu (np. po rozmowie telefonicznej)</string>\n    <string name=\"notification_channel_name\">Powiadomienie NewPipe</string>\n    <string name=\"notification_channel_description\">Powiadomienia dla odtwarzacza NewPipe</string>\n    <string name=\"title_activity_history\">Historia</string>\n    <string name=\"action_history\">Historia</string>\n    <string name=\"settings_category_player_title\">Odtwarzacz</string>\n    <string name=\"settings_category_player_behavior_title\">Zachowanie</string>\n    <string name=\"settings_category_history_title\">Historia i pamięć podręczna</string>\n    <string name=\"undo\">Cofnij</string>\n    <string name=\"search_no_results\">Brak wyników</string>\n    <string name=\"no_views\">Brak wyświetleń</string>\n    <string name=\"show_hold_to_append_title\">Pokazuj poradę „Przytrzymaj, aby dodać”</string>\n    <string name=\"show_hold_to_append_summary\">Pokaż wskazówkę po naciśnięciu tła lub wyskakującego przycisku „Szczegóły” w odtwarzaczu</string>\n    <string name=\"play_all\">Odtwórz wszystkie</string>\n    <string name=\"unknown_content\">[Nieznane]</string>\n    <string name=\"player_stream_failure\">Nie udało się odtworzyć tego strumienia</string>\n    <string name=\"player_unrecoverable_failure\">Wystąpił nieodwracalny błąd odtwarzacza</string>\n    <string name=\"player_recoverable_failure\">Odzyskiwanie po błędzie odtwarzacza</string>\n    <string name=\"empty_list_subtitle\">Nic tu nie ma. Słychać tylko świerszcze.</string>\n    <string name=\"no_subscribers\">Brak subskrybentów</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s subskrybent</item>\n        <item quantity=\"few\">%s subskrybentów</item>\n        <item quantity=\"many\">%s subskrybentów</item>\n        <item quantity=\"other\">%s subskrybentów</item>\n    </plurals>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s wyświetlenie</item>\n        <item quantity=\"few\">%s wyświetlenia</item>\n        <item quantity=\"many\">%s wyświetleń</item>\n        <item quantity=\"other\">%s wyświetleń</item>\n    </plurals>\n    <string name=\"no_videos\">Brak wideo</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s wideo</item>\n        <item quantity=\"few\">%s wideo</item>\n        <item quantity=\"many\">%s wideo</item>\n        <item quantity=\"other\">%s wideo</item>\n    </plurals>\n    <string name=\"charset_most_special_characters\">Większość znaków specjalnych</string>\n    <string name=\"donation_title\">Dotacja</string>\n    <string name=\"donation_encouragement\">NewPipe jest rozwijany przez wolontariuszy, którzy poświęcają swój wolny czas, zapewniając Ci najlepsze wrażenia z użytkowania. To dobry moment na wsparcie programistów i sprawienie, aby NewPipe był jeszcze lepszy, podczas gdy oni będą mogli delektować się filiżanką kawy.</string>\n    <string name=\"give_back\">Wspomóż</string>\n    <string name=\"website_title\">Strona internetowa</string>\n    <string name=\"website_encouragement\">Odwiedź stronę NewPipe, aby uzyskać więcej informacji i najnowsze wiadomości.</string>\n    <string name=\"delete_item_search_history\">Czy chcesz usunąć tę pozycję z historii wyszukiwania?</string>\n    <string name=\"main_page_content\">Zawartość strony głównej</string>\n    <string name=\"blank_page_summary\">Pusta strona</string>\n    <string name=\"kiosk_page_summary\">Strona „Odkrywaj”</string>\n    <string name=\"channel_page_summary\">Strona kanału</string>\n    <string name=\"select_a_channel\">Wybierz kanał</string>\n    <string name=\"no_channel_subscribed_yet\">Nie masz jeszcze subskrypcji kanałów</string>\n    <string name=\"select_a_kiosk\">Wybierz kartę „Odkrywaj”</string>\n    <string name=\"trending\">Na czasie</string>\n    <string name=\"top_50\">50 najlepszych</string>\n    <string name=\"new_and_hot\">Nowe i popularne</string>\n    <string name=\"play_queue_remove\">Usuń</string>\n    <string name=\"play_queue_stream_detail\">Szczegóły</string>\n    <string name=\"play_queue_audio_settings\">Ustawienia dźwięku</string>\n    <string name=\"hold_to_append\">Przytrzymaj, aby zakolejkować</string>\n    <string name=\"start_here_on_background\">Zacznij odtwarzać w tle</string>\n    <string name=\"start_here_on_popup\">Zacznij odtwarzać w trybie okienkowym</string>\n    <string name=\"no_player_found_toast\">Nie znaleziono odtwarzacza strumieni (żeby odtworzyć, możesz zainstalować VLC)</string>\n    <string name=\"default_content_country_title\">Domyślny kraj treści</string>\n    <string name=\"always\">Zawsze</string>\n    <string name=\"just_once\">Tylko raz</string>\n    <string name=\"switch_to_background\">Odtwarzaj w tle</string>\n    <string name=\"external_player_unsupported_link_type\">Zewnętrzne odtwarzacze nie obsługują linków tego typu</string>\n    <string name=\"video_streams_empty\">Nie znaleziono strumieni wideo</string>\n    <string name=\"audio_streams_empty\">Nie znaleziono strumieni audio</string>\n    <string name=\"video_player\">Odtwarzacz wideo</string>\n    <string name=\"background_player\">Odtwarzacz w tle</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Uzyskiwanie informacji…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Ładowanie żądanej treści</string>\n    <string name=\"controls_download_desc\">Pobierz plik strumienia</string>\n    <string name=\"show_info\">Pokaż informacje</string>\n    <string name=\"controls_add_to_playlist_title\">Dodaj do</string>\n    <string name=\"tab_bookmarks\">Ulubione playlisty</string>\n    <string name=\"settings_category_debug_title\">Debugowanie</string>\n    <string name=\"switch_to_popup\">Odtwarzaj w trybie okienkowym</string>\n    <string name=\"switch_to_main\">Odtwarzaj na pierwszym planie</string>\n    <string name=\"import_data_title\">Importuj dane</string>\n    <string name=\"export_data_title\">Eksportuj dane</string>\n    <string name=\"import_data_summary\">Zastępuje bieżącą historię, subskrypcje, playlisty i (opcjonalnie) ustawienia</string>\n    <string name=\"export_data_summary\">Eksportuje bieżącą historię, subskrypcje, playlisty i ustawienia</string>\n    <string name=\"detail_drag_description\">Przeciągnij, aby zmienić kolejność</string>\n    <string name=\"create\">Utwórz</string>\n    <string name=\"dismiss\">Odrzuć</string>\n    <string name=\"rename\">Zmień nazwę</string>\n    <string name=\"title_last_played\">Ostatnio odtwarzane</string>\n    <string name=\"title_most_played\">Najczęściej odtwarzane</string>\n    <string name=\"export_complete_toast\">Wyeksportowano</string>\n    <string name=\"import_complete_toast\">Zaimportowano</string>\n    <string name=\"no_valid_zip_file\">Nieprawidłowy plik ZIP</string>\n    <string name=\"could_not_import_all_files\">Ostrzeżenie: Nie udało się zaimportować wszystkich plików</string>\n    <string name=\"override_current_data\">Zastąpi to obecne ustawienia.</string>\n    <string name=\"drawer_open\">Otwórz menu</string>\n    <string name=\"drawer_close\">Zamknij menu</string>\n    <string name=\"popup_player\">Odtwarzacz w trybie okienkowym</string>\n    <string name=\"always_ask_open_action\">Zawsze pytaj</string>\n    <string name=\"create_playlist\">Nowa playlista</string>\n    <string name=\"rename_playlist\">Zmień nazwę</string>\n    <string name=\"name\">Nazwa</string>\n    <string name=\"add_to_playlist\">Dodaj do playlisty</string>\n    <string name=\"set_as_playlist_thumbnail\">Ustaw jako miniaturę playlisty</string>\n    <string name=\"bookmark_playlist\">Dodaj do ulubionych</string>\n    <string name=\"unbookmark_playlist\">Usuń z ulubionych</string>\n    <string name=\"delete_playlist_prompt\">Czy usunąć tę playlistę\\?</string>\n    <string name=\"playlist_creation_success\">Playlista utworzona</string>\n    <string name=\"playlist_add_stream_success\">Dodano do playlisty</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniatura playlisty zmieniona</string>\n    <string name=\"caption_none\">Bez napisów</string>\n    <string name=\"resize_fit\">Dopasuj</string>\n    <string name=\"resize_fill\">Wypełnij</string>\n    <string name=\"resize_zoom\">Powiększ</string>\n    <string name=\"caption_auto_generated\">Wygenerowane automatycznie</string>\n    <string name=\"enable_leak_canary_summary\">Monitorowanie wycieków pamięci może powodować niestabilność aplikacji podczas zrzutu pamięci</string>\n    <string name=\"enable_disposed_exceptions_title\">Zgłaszaj błędy spoza cyklu życia</string>\n    <string name=\"enable_disposed_exceptions_summary\">Wymuś raportowanie niedostarczonych wyjątków Rx poza cyklem życia fragmentu lub aktywności po usunięciu</string>\n    <string name=\"use_inexact_seek_title\">Używaj szybkiego, niedokładnego przewijania</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Wyczyszczono pamięć podręczną obrazów</string>\n    <string name=\"metadata_cache_wipe_title\">Wyczyść pamięć podręczną metadanych</string>\n    <string name=\"metadata_cache_wipe_summary\">Usuwa całą pamięć podręczną stron</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Wyczyszczono pamięć podręczną metadanych</string>\n    <string name=\"auto_queue_title\">Automatyczne kolejkowanie następnego strumienia</string>\n    <string name=\"auto_queue_summary\">Gdy kończy się kolejka odtwarzania, dodaj do niej kolejną powiązaną pozycję</string>\n    <string name=\"file\">Plik</string>\n    <string name=\"invalid_directory\">Brak takiego folderu</string>\n    <string name=\"invalid_source\">Brak takiego źródła pliku/zawartości</string>\n    <string name=\"invalid_file\">Plik nie istnieje albo brakuje uprawnień do jego odczytu lub zapisu</string>\n    <string name=\"file_name_empty_error\">Nazwa pliku nie może być pusta</string>\n    <string name=\"error_occurred_detail\">Wystąpił błąd: %1$s</string>\n    <string name=\"import_title\">Importuj</string>\n    <string name=\"import_from\">Importuj z</string>\n    <string name=\"export_to\">Eksportuj do</string>\n    <string name=\"import_ongoing\">Importowanie…</string>\n    <string name=\"export_ongoing\">Eksportowanie…</string>\n    <string name=\"import_file_title\">Importuj plik</string>\n    <string name=\"previous_export\">Poprzedni eksport</string>\n    <string name=\"subscriptions_import_unsuccessful\">Nie udało się zaimportować subskrypcji</string>\n    <string name=\"subscriptions_export_unsuccessful\">Nie udało się wyeksportować subskrypcji</string>\n    <string name=\"import_youtube_instructions\">Zaimportuj subskrypcje YouTube z Google Takeout:\n\\n\n\\n1. Przejdź do tego adresu URL: %1$s.\n\\n2. Zaloguj się, gdy zostaniesz o to poproszony(-a).\n\\n3. Naciśnij „Wybrano wszystkie dane z YouTube”, następnie „Odznacz wszystkie”, potem zaznacz tylko „subskrypcje” i naciśnij „OK”.\n\\n4. Naciśnij „Następny krok”, a następnie „Utwórz eksport”.\n\\n5. Naciśnij przycisk „Pobierz”, gdy się pojawi.\n\\n6. Naciśnij IMPORTUJ PLIK poniżej i wybierz pobrany plik ZIP.\n\\n7. [Jeśli importowanie pliku ZIP nie powiedzie się] Wypakuj plik subskrypcje.csv (powinien znajdować się w katalogu „YouTube i YouTube Music/subskrypcje.csv”), naciśnij IMPORTUJ PLIK poniżej i wybierz wypakowany plik CSV.</string>\n    <string name=\"import_network_expensive_warning\">Ta operacja może wygenerować duże użycie danych.\n\\n\n\\nCzy chcesz kontynuować?</string>\n    <string name=\"playback_speed_control\">Sterowanie prędkością odtwarzania</string>\n    <string name=\"playback_tempo\">Tempo</string>\n    <string name=\"playback_pitch\">Wysokość dźwięku</string>\n    <string name=\"import_soundcloud_instructions_hint\">twojeID, soundcloud.com/yourid</string>\n    <string name=\"unhook_checkbox\">Rozłącz (może powodować zniekształcenia)</string>\n    <string name=\"import_soundcloud_instructions\">Zaimportuj profil SoundCloud, wpisując adres URL lub swój identyfikator:\n\\n\n\\n1. Włącz opcję „Wersja na komputery” w przeglądarce internetowej (strona nie jest dostępna dla urządzeń mobilnych).\n\\n2. Przejdź do tego adresu URL: %1$s.\n\\n3. Zaloguj się, gdy zostaniesz o to poproszony(-a).\n\\n4. Skopiuj adres URL profilu, na który zostałeś(-aś) przekierowany(-a).</string>\n    <string name=\"no_streams_available_download\">Brak strumieni do pobrania</string>\n    <string name=\"preferred_open_action_settings_title\">Preferowana akcja „otwórz”</string>\n    <string name=\"preferred_open_action_settings_summary\">Domyślna akcja podczas otwierania treści — %s</string>\n    <string name=\"caption_setting_title\">Napisy</string>\n    <string name=\"caption_setting_description\">Zmodyfikuj rozmiar tekstu napisów odtwarzacza i style tła. Wymaga ponownego uruchomienia aplikacji, aby zmiany zostały uwzględnione</string>\n    <string name=\"clear_views_history_title\">Wyczyść historię oglądania</string>\n    <string name=\"clear_views_history_summary\">Usuwa historię odtworzonych strumieni i pozycje odtwarzania</string>\n    <string name=\"delete_view_history_alert\">Usunąć całą historię oglądania\\?</string>\n    <string name=\"watch_history_deleted\">Usunięto historię oglądania</string>\n    <string name=\"clear_search_history_title\">Wyczyść historię wyszukiwania</string>\n    <string name=\"clear_search_history_summary\">Usuwa historię wyszukiwania słów kluczowych</string>\n    <string name=\"delete_search_history_alert\">Usunąć całą historię wyszukiwania\\?</string>\n    <string name=\"search_history_deleted\">Usunięto historię wyszukiwania</string>\n    <string name=\"one_item_deleted\">Usunięto jedną pozycję</string>\n    <string name=\"app_license\">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.</string>\n    <string name=\"import_settings\">Czy chcesz zaimportować również ustawienia?</string>\n    <string name=\"privacy_policy_title\">Polityka prywatności NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">Projekt NewPipe bardzo poważnie traktuje Twoją prywatność, dlatego aplikacja nie gromadzi żadnych danych bez Twojej zgody.\n\\nPolityka prywatności NewPipe szczegółowo wyjaśnia, jakie dane są zbierane i przesyłane, kiedy wysyłasz raport o awarii aplikacji.</string>\n    <string name=\"read_privacy_policy\">Przeczytaj politykę prywatności</string>\n    <string name=\"start_accept_privacy_policy\">Ze względu na wprowadzenie Ogólnego rozporządzenia o ochronie danych (RODO) chcielibyśmy zwrócić Twoją uwagę na politykę prywatności NewPipe. Prosimy przeczytać ją uważnie.\n\\nMusisz ją zaakceptować, aby przesyłać nam raporty o błędach.</string>\n    <string name=\"accept\">Akceptuj</string>\n    <string name=\"decline\">Odrzuć</string>\n    <string name=\"limit_data_usage_none_description\">Bez limitu</string>\n    <string name=\"limit_mobile_data_usage_title\">Ograniczaj rozdzielczość podczas korzystania z danych mobilnych</string>\n    <string name=\"channels\">Kanały</string>\n    <string name=\"playlists\">Playlisty</string>\n    <string name=\"tracks\">Utwory</string>\n    <string name=\"users\">Użytkownicy</string>\n    <string name=\"skip_silence_checkbox\">Przewijaj do przodu podczas ciszy</string>\n    <string name=\"playback_step\">Krok</string>\n    <string name=\"playback_reset\">Zresetuj</string>\n    <string name=\"minimize_on_exit_title\">Minimalizuj przy przełączaniu aplikacji</string>\n    <string name=\"minimize_on_exit_summary\">Akcja po przejściu do innej aplikacji z głównego odtwarzacza wideo — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Brak</string>\n    <string name=\"minimize_on_exit_background_description\">Zminimalizuj do odtwarzacza w tle</string>\n    <string name=\"minimize_on_exit_popup_description\">Zminimalizuj do odtwarzacza w trybie okienkowym</string>\n    <string name=\"unsubscribe\">Odsubskrybuj</string>\n    <string name=\"tab_choose\">Wybierz kartę</string>\n    <string name=\"settings_category_updates_title\">Aktualizacje</string>\n    <string name=\"file_deleted\">Usunięto plik</string>\n    <string name=\"app_update_notification_channel_name\">Powiadomienie o aktualizacji aplikacji</string>\n    <string name=\"app_update_notification_channel_description\">Powiadomienia o nowych wersjach NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Pamięć zewnętrzna niedostępna</string>\n    <string name=\"download_to_sdcard_error_message\">Pobieranie na kartę pamięci nie jest możliwe. Zresetować lokalizację folderu zapisywania\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Nie udało się odczytać zapisanych kart, więc będą używane domyślne</string>\n    <string name=\"restore_defaults\">Przywróć domyślne</string>\n    <string name=\"restore_defaults_confirmation\">Czy chcesz przywrócić ustawienia domyślne\\?</string>\n    <string name=\"subscribers_count_not_available\">Liczba subskrybentów niedostępna</string>\n    <string name=\"main_page_content_summary\">Karty wyświetlane na stronie głównej</string>\n    <string name=\"updates_setting_title\">Aktualizacje</string>\n    <string name=\"updates_setting_description\">Pokazuj powiadomienie zachęcające do pobrania aktualizacji aplikacji, gdy jest dostępna nowa wersja</string>\n    <string name=\"list_view_mode\">Tryb widoku listy</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"grid\">Siatka</string>\n    <string name=\"auto\">Automatyczny</string>\n    <string name=\"app_update_available_notification_title\">Dostępna jest aktualizacja NewPipe!</string>\n    <string name=\"missions_header_finished\">Zakończone</string>\n    <string name=\"paused\">wstrzymane</string>\n    <string name=\"queued\">w kolejce</string>\n    <string name=\"post_processing\">przetwarzanie końcowe</string>\n    <string name=\"enqueue\">Kolejka</string>\n    <string name=\"permission_denied\">Akcja odrzucona przez system</string>\n    <string name=\"download_failed\">Pobieranie nie powiodło się</string>\n    <string name=\"generate_unique_name\">Wygeneruj unikalną nazwę</string>\n    <string name=\"overwrite\">Nadpisz</string>\n    <string name=\"overwrite_finished_warning\">Pobrany plik o tej nazwie już istnieje</string>\n    <string name=\"download_already_running\">Trwa już pobieranie pliku o tej samej nazwie</string>\n    <string name=\"show_error\">Pokaż błąd</string>\n    <string name=\"error_file_creation\">Nie udało się utworzyć pliku</string>\n    <string name=\"error_path_creation\">Nie udało się utworzyć folderu docelowego</string>\n    <string name=\"error_ssl_exception\">Nie udało się nawiązać bezpiecznego połączenia</string>\n    <string name=\"error_unknown_host\">Nie udało się znaleźć serwera</string>\n    <string name=\"error_connect_host\">Nie udało się połączyć z serwerem</string>\n    <string name=\"error_http_no_content\">Serwer nie wysyła danych</string>\n    <string name=\"error_http_unsupported_range\">Serwer nie akceptuje pobierania wielowątkowego, spróbuj ponownie za pomocą @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Nie znaleziono</string>\n    <string name=\"error_postprocessing_failed\">Przetwarzanie końcowe nie powiodło się</string>\n    <string name=\"stop\">Zatrzymaj</string>\n    <string name=\"max_retry_msg\">Maksymalna liczba ponownych prób</string>\n    <string name=\"max_retry_desc\">Maksymalna liczba prób przed anulowaniem pobierania</string>\n    <string name=\"pause_downloads_on_mobile\">Przerwij przy sieciach z ograniczonym transferem</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Pomocne przy przełączaniu na dane mobilne, chociaż niektóre pobierania nie mogą być wstrzymywane</string>\n    <string name=\"events\">Wydarzenia</string>\n    <string name=\"conferences\">Konferencje</string>\n    <string name=\"missions_header_pending\">Oczekujące</string>\n    <string name=\"show_comments_title\">Pokazuj komentarze</string>\n    <string name=\"show_comments_summary\">Wyłącz, aby ukryć komentarze</string>\n    <string name=\"autoplay_title\">Automatyczne odtwarzanie</string>\n    <string name=\"no_comments\">Brak komentarzy</string>\n    <string name=\"error_unable_to_load_comments\">Nie udało się załadować komentarzy</string>\n    <string name=\"close\">Zamknij</string>\n    <string name=\"enable_playback_resume_title\">Wznawiaj odtwarzanie</string>\n    <string name=\"enable_playback_resume_summary\">Przywracaj odtwarzanie od ostatniej pozycji</string>\n    <string name=\"enable_playback_state_lists_title\">Pozycje odtwarzania na listach</string>\n    <string name=\"enable_playback_state_lists_summary\">Pokazuj wskaźniki pozycji odtwarzania na listach</string>\n    <string name=\"settings_category_clear_data_title\">Wyczyść dane</string>\n    <string name=\"watch_history_states_deleted\">Usunięto pozycje odtwarzania</string>\n    <string name=\"missing_file\">Plik usunięty albo przeniesiony</string>\n    <string name=\"overwrite_unrelated_warning\">Plik o tej nazwie już istnieje</string>\n    <string name=\"overwrite_failed\">Nie udało się nadpisać pliku</string>\n    <string name=\"download_already_pending\">Plik o tej samej nazwie oczekuje na pobranie</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe został zamknięty podczas pracy nad plikiem</string>\n    <string name=\"error_insufficient_storage_left\">Brak miejsca na urządzeniu</string>\n    <string name=\"error_progress_lost\">Utracono postęp, ponieważ plik został usunięty</string>\n    <string name=\"confirm_prompt\">Czy chcesz wyczyścić historię pobierania, czy usunąć wszystkie pobrane pliki\\?</string>\n    <string name=\"enable_queue_limit\">Ogranicz kolejkę pobierania</string>\n    <string name=\"enable_queue_limit_desc\">Tylko jedno pobieranie zostanie uruchomione w tym samym czasie</string>\n    <string name=\"start_downloads\">Rozpocznij pobieranie</string>\n    <string name=\"pause_downloads\">Wstrzymaj pobieranie</string>\n    <string name=\"downloads_storage_ask_title\">Pytaj, gdzie pobrać</string>\n    <string name=\"downloads_storage_ask_summary\">Zostaniesz zapytany(-a), gdzie zapisać każdy pobierany plik.\n\\nWłącz systemowy selektor folderów (SAF), jeśli chcesz pobierać pliki na kartę pamięci</string>\n    <string name=\"error_timeout\">Minął czas połączenia</string>\n    <string name=\"downloads_storage_use_saf_title\">Używaj systemowego selektora folderów (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">Storage Access Framework umożliwia pobieranie na kartę pamięci</string>\n    <string name=\"clear_playback_states_title\">Wyczyść pozycje odtwarzania</string>\n    <string name=\"clear_playback_states_summary\">Usuwa wszystkie pozycje odtwarzania</string>\n    <string name=\"delete_playback_states_alert\">Usunąć wszystkie pozycje odtwarzania\\?</string>\n    <string name=\"drawer_header_description\">Przełącz usługę, aktualnie wybrana:</string>\n    <string name=\"default_kiosk_page_summary\">Domyślna karta „Odkrywaj”</string>\n    <string name=\"no_one_watching\">Nikt nie ogląda</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s oglądający</item>\n        <item quantity=\"few\">%s oglądających</item>\n        <item quantity=\"many\">%s oglądających</item>\n        <item quantity=\"other\">%s oglądających</item>\n    </plurals>\n    <string name=\"no_one_listening\">Nikt nie słucha</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s słuchacz</item>\n        <item quantity=\"few\">%s słuchaczy</item>\n        <item quantity=\"many\">%s słuchaczy</item>\n    </plurals>\n    <string name=\"seek_duration_title\">Wielkość skoku przy przewijaniu</string>\n    <string name=\"peertube_instance_url_title\">Serwery PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Wybierz swoje ulubione serwery PeerTube</string>\n    <string name=\"peertube_instance_url_help\">Znajdź serwery, które lubisz, na %s</string>\n    <string name=\"peertube_instance_add_title\">Dodaj serwer</string>\n    <string name=\"peertube_instance_add_help\">Wprowadź adres URL serwera</string>\n    <string name=\"peertube_instance_add_fail\">Nie udało się sprawdzić poprawności serwera</string>\n    <string name=\"peertube_instance_add_https_only\">Obsługiwane są tylko adresy HTTPS</string>\n    <string name=\"peertube_instance_add_exists\">Serwer już istnieje</string>\n    <string name=\"local\">Lokalne</string>\n    <string name=\"recently_added\">Ostatnio dodane</string>\n    <string name=\"most_liked\">Najbardziej lubiane</string>\n    <string name=\"playlist_no_uploader\">Wygenerowana automatycznie (nie znaleziono przesyłającego)</string>\n    <string name=\"recovering\">odzyskiwanie</string>\n    <string name=\"error_download_resource_gone\">Nie udało się odzyskać tego pobrania</string>\n    <string name=\"choose_instance_prompt\">Wybierz serwer</string>\n    <string name=\"clear_download_history\">Wyczyść historię pobierania</string>\n    <string name=\"delete_downloaded_files\">Usuń pobrane pliki</string>\n    <string name=\"permission_display_over_apps\">Udziel uprawnienia do wyświetlania nad innymi aplikacjami</string>\n    <string name=\"app_language_title\">Język aplikacji</string>\n    <string name=\"systems_language\">Domyślny systemowy</string>\n    <string name=\"subtitle_activity_recaptcha\">Po rozwiązaniu naciśnij „Gotowe”</string>\n    <string name=\"done\">Gotowe</string>\n    <string name=\"videos_string\">Wideo</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekunda</item>\n        <item quantity=\"few\">%d sekundy</item>\n        <item quantity=\"many\">%d sekund</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Wielkość skoku przewijania została ustawiona na %d sekund ze względu na ograniczenia odtwarzacza ExoPlayer</string>\n    <string name=\"mute\">Wycisz</string>\n    <string name=\"unmute\">Wyłącz wyciszenie</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Czy uważasz, że ładowanie kanałów jest zbyt powolne\\? Jeśli tak, spróbuj włączyć szybkie ładowanie (możesz je zmienić w ustawieniach lub naciskając przycisk poniżej).\n\\n\n\\nNewPipe oferuje dwie strategie ładowania kanału:\n\\n• Pobieranie całego kanału subskrypcji, co jest powolne, ale kompletne.\n\\n• Korzystanie z dedykowanego punktu końcowego usługi, co jest szybkie, ale zwykle nie jest kompletne.\n\\n\n\\nRóżnica między nimi polega na tym, że w szybkim zwykle brakuje pewnych informacji, takich jak czas trwania lub typ pozycji (nie można odróżnić wideo na żywo od zwykłych), i może zwrócić mniej pozycji.\n\\n\n\\nYouTube jest przykładem usługi, która oferuje tę szybką metodę z kanałem RSS.\n\\n\n\\nTak więc wybór sprowadza się do tego, co wolisz: szybkość czy precyzyjne informacje.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Wyłącz tryb szybki</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Włącz tryb szybki</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Dostępne w niektórych usługach. Jest zwykle znacznie szybsze, ale może zwrócić ograniczoną liczbę pozycji i często niekompletne informacje (np. brak czasu trwania, typu pozycji, statusu na żywo)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Pobieraj z dedykowanego kanału, jeśli jest dostępny</string>\n    <string name=\"feed_update_threshold_option_always_update\">Zawsze aktualizuj</string>\n    <string name=\"feed_update_threshold_summary\">Czas od ostatniej aktualizacji, zanim subskrypcja zostanie uznana za nieaktualną — %s</string>\n    <string name=\"feed_update_threshold_title\">Próg aktualizacji kanału</string>\n    <string name=\"settings_category_feed_title\">Kanał</string>\n    <string name=\"feed_create_new_group_button_title\">Nowa</string>\n    <string name=\"feed_group_dialog_delete_message\">Czy chcesz usunąć tę grupę\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Pusta nazwa grupy</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d wybrana</item>\n        <item quantity=\"few\">%d wybrane</item>\n        <item quantity=\"many\">%d wybranych</item>\n        <item quantity=\"other\">%d wybranych</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Nie wybrano żadnej subskrypcji</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Wybierz subskrypcje</string>\n    <string name=\"feed_processing_message\">Przetwarzanie danych kanału…</string>\n    <string name=\"feed_notification_loading\">Ładowanie kanału…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Nie załadowano: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Ostatnia aktualizacja kanału: %s</string>\n    <string name=\"feed_groups_header_title\">Grupy kanałów</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dzień</item>\n        <item quantity=\"few\">%d dni</item>\n        <item quantity=\"many\">%d dni</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d godzina</item>\n        <item quantity=\"few\">%d godziny</item>\n        <item quantity=\"many\">%d godzin</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuta</item>\n        <item quantity=\"few\">%d minuty</item>\n        <item quantity=\"many\">%d minut</item>\n    </plurals>\n    <string name=\"content_not_supported\">Ta treść nie jest jeszcze obsługiwana przez NewPipe.\n\\n\n\\nMiejmy nadzieję, że będzie obsługiwana w przyszłej wersji.</string>\n    <string name=\"infinite_videos\">∞ wideo</string>\n    <string name=\"more_than_100_videos\">100+ wideo</string>\n    <string name=\"artists\">Artyści</string>\n    <string name=\"albums\">Albumy</string>\n    <string name=\"songs\">Utwory</string>\n    <string name=\"restricted_video\">To wideo jest objęte ograniczeniem wiekowym.\n\\n\n\\nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć.</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Usuń częściowo obejrzane strumienie</string>\n    <string name=\"remove_watched_popup_warning\">Strumienie, które zostały obejrzane przed i po dodaniu do playlisty, zostaną usunięte. \\nCzy na pewno?</string>\n    <string name=\"remove_watched_popup_title\">Czy usunąć obejrzane strumienie?</string>\n    <string name=\"remove_watched\">Usuń obejrzane</string>\n    <string name=\"show_original_time_ago_summary\">Oryginalne teksty z usług będą widoczne w strumieniowanych pozycjach</string>\n    <string name=\"show_original_time_ago_title\">Pokazuj oryginalny czas na pozycjach</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Włącz tryb ograniczonego dostępu YouTube\\'a</string>\n    <string name=\"video_detail_by\">Przez %s</string>\n    <string name=\"channel_created_by\">Utworzony przez %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Miniatura awatara kanału</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Pokaż tylko niezgrupowane</string>\n    <string name=\"playlist_page_summary\">Strona playlisty</string>\n    <string name=\"no_playlist_bookmarked_yet\">Nie masz jeszcze ulubionych playlist</string>\n    <string name=\"select_a_playlist\">Wybierz playlistę</string>\n    <string name=\"error_report_open_github_notice\">Sprawdź, czy problem dotyczący Twojej awarii już istnieje. Tworząc zduplikowane zgłoszenia, zajmujesz nam czas, który możemy poświęcić na naprawienie istniejącego błędu.</string>\n    <string name=\"error_report_open_issue_button_text\">Zgłoś na GitHubie</string>\n    <string name=\"copy_for_github\">Skopiuj sformatowany raport</string>\n    <string name=\"search_showing_result_for\">Wyświetlanie wyników dla: %s</string>\n    <string name=\"never\">Nigdy</string>\n    <string name=\"wifi_only\">Tylko przez Wi-Fi</string>\n    <string name=\"autoplay_summary\">Rozpoczynaj odtwarzanie automatycznie — %s</string>\n    <string name=\"title_activity_play_queue\">Kolejka odtwarzania</string>\n    <string name=\"unsupported_url_dialog_message\">Nie udało się rozpoznać adresu URL. Otworzyć za pomocą innej aplikacji\\?</string>\n    <string name=\"auto_queue_toggle\">Automatyczna kolejka</string>\n    <string name=\"clear_queue_confirmation_description\">Kolejka aktywnego odtwarzacza zostanie zastąpiona</string>\n    <string name=\"clear_queue_confirmation_summary\">Przejście z jednego odtwarzacza na inny może zastąpić kolejkę</string>\n    <string name=\"clear_queue_confirmation_title\">Poproś o potwierdzenie przed wyczyszczeniem kolejki</string>\n    <string name=\"notification_action_nothing\">Nic</string>\n    <string name=\"notification_action_buffering\">Buforowanie</string>\n    <string name=\"notification_action_shuffle\">Losuj</string>\n    <string name=\"notification_action_repeat\">Powtórz</string>\n    <string name=\"notification_actions_at_most_three\">Możesz wybrać co najwyżej trzy akcje do wyświetlania w kompaktowym powiadomieniu!</string>\n    <string name=\"notification_actions_summary\">Edytuj każdą poniższą akcję powiadomienia, naciskając ją. Wybierz do trzech z nich, które mają być wyświetlane w kompaktowym powiadomieniu, korzystając z pól wyboru po prawej stronie</string>\n    <string name=\"notification_action_4_title\">Przycisk piątej akcji</string>\n    <string name=\"notification_action_3_title\">Przycisk czwartej akcji</string>\n    <string name=\"notification_action_2_title\">Przycisk trzeciej akcji</string>\n    <string name=\"notification_action_1_title\">Przycisk drugiej akcji</string>\n    <string name=\"notification_action_0_title\">Przycisk pierwszej akcji</string>\n    <string name=\"notification_scale_to_square_image_summary\">Przycinaj miniaturę wideo wyświetlaną w powiadomieniu z proporcji 16:9 do 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Przycinaj miniaturę do proporcji 1:1</string>\n    <string name=\"enqueued\">Dodano do kolejki</string>\n    <string name=\"enqueue_stream\">Dodaj do kolejki</string>\n    <string name=\"show_memory_leaks\">Pokaż wycieki pamięci</string>\n    <string name=\"clear_cookie_summary\">Usuwa ciasteczka, które NewPipe przechowuje po rozwiązaniu reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Ciasteczka reCAPTCHA zostały wyczyszczone</string>\n    <string name=\"clear_cookie_title\">Wyczyść ciasteczka reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube udostępnia „Tryb ograniczonego dostępu”, który ukrywa potencjalne treści dla dorosłych</string>\n    <string name=\"show_age_restricted_content_summary\">Pokazuj treści nieodpowiednie dla dzieci ze względu na ograniczenia wiekowe (np. 18+)</string>\n    <string name=\"notification_colorize_summary\">Niech Android dostosuje kolor powiadomienia zgodnie z głównym kolorem na miniaturze (nie jest to dostępne na wszystkich urządzeniach)</string>\n    <string name=\"notification_colorize_title\">Zabarwiaj powiadomienia</string>\n    <string name=\"show_thumbnail_summary\">Używaj miniatury zarówno jako tła ekranu blokady, jak i powiadomień</string>\n    <string name=\"show_thumbnail_title\">Pokazuj miniaturę</string>\n    <string name=\"recent\">Ostatnie</string>\n    <string name=\"msg_calculating_hash\">Obliczanie skrótu</string>\n    <string name=\"hash_channel_description\">Powiadomienia o postępie tworzenia skrótów wideo</string>\n    <string name=\"hash_channel_name\">Powiadomienie o obliczaniu skrótu wideo</string>\n    <string name=\"show_meta_info_summary\">Wyłącz, aby ukryć pola z dodatkowymi informacjami o twórcy strumienia, zawartości strumienia lub żądaniu wyszukiwania</string>\n    <string name=\"show_meta_info_title\">Pokazuj metadane</string>\n    <string name=\"chapters\">Rozdziały</string>\n    <string name=\"description_tab_description\">Opis</string>\n    <string name=\"comments_tab_description\">Komentarze</string>\n    <string name=\"show_description_summary\">Wyłącz, aby ukryć opis wideo i dodatkowe informacje</string>\n    <string name=\"show_description_title\">Pokazuj opis</string>\n    <string name=\"open_with\">Otwórz za pomocą</string>\n    <string name=\"no_app_to_open_intent\">Żadna aplikacja na Twoim urządzeniu nie może tego otworzyć</string>\n    <string name=\"related_items_tab_description\">Powiązane pozycje</string>\n    <string name=\"crash_the_app\">Zepsuj aplikację</string>\n    <string name=\"paid_content\">Ta treść dostępna jest tylko dla użytkowników, którzy za nią zapłacili. Nie może być strumieniowana ani pobierana przez NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">To wideo dostępne jest tylko dla subskrybentów usługi YouTube Music Premium. Nie może być strumieniowane ani pobierane przez NewPipe.</string>\n    <string name=\"private_content\">Ta treść jest prywatna, więc nie może być strumieniowana ani pobierana przez NewPipe.</string>\n    <string name=\"georestricted_content\">Ta treść nie jest dostępna w Twoim kraju.</string>\n    <string name=\"restricted_video_no_stream\">To wideo jest objęte ograniczeniem wiekowym.\n\\nZe względu na nowe zasady YouTube dotyczące wideo z ograniczeniami wiekowymi NewPipe nie może uzyskać dostępu do żadnego z jego strumieni wideo i dlatego nie jest w stanie go odtworzyć.</string>\n    <string name=\"soundcloud_go_plus_content\">To jest utwór SoundCloud Go+ (przynajmniej w Twoim kraju). Nie może być strumieniowany ani pobierany przez NewPipe.</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"featured\">Polecane</string>\n    <string name=\"recaptcha_solve\">Rozwiąż</string>\n    <string name=\"select_night_theme_toast\">Możesz wybrać swój ulubiony motyw nocny poniżej</string>\n    <string name=\"download_has_started\">Rozpoczęto pobieranie</string>\n    <string name=\"night_theme_summary\">Wybierz swój ulubiony motyw nocny — %s</string>\n    <string name=\"auto_device_theme_title\">Automatyczny (motyw urządzenia)</string>\n    <string name=\"night_theme_title\">Motyw nocny</string>\n    <string name=\"show_channel_details\">Pokaż szczegóły kanału</string>\n    <string name=\"disable_media_tunneling_summary\">Wyłącz tunelowanie multimediów, jeśli zaobserwowałeś(-aś) czarny ekran bądź brak płynności odtwarzania wideo.</string>\n    <string name=\"disable_media_tunneling_title\">Wyłącz tunelowanie multimediów</string>\n    <string name=\"metadata_age_limit\">Ograniczenie wiekowe</string>\n    <string name=\"description_select_disable\">Wyłącz zaznaczanie tekstu w opisie</string>\n    <string name=\"description_select_enable\">Włącz zaznaczanie tekstu w opisie</string>\n    <string name=\"metadata_privacy_internal\">Wewnętrzny</string>\n    <string name=\"metadata_privacy_private\">Prywatny</string>\n    <string name=\"metadata_privacy_public\">Publiczny</string>\n    <string name=\"metadata_host\">Host</string>\n    <string name=\"metadata_support\">Wsparcie</string>\n    <string name=\"metadata_language\">Język</string>\n    <string name=\"metadata_privacy\">Widoczność</string>\n    <string name=\"metadata_licence\">Licencja</string>\n    <string name=\"metadata_tags\">Tagi</string>\n    <string name=\"metadata_category\">Kategoria</string>\n    <string name=\"open_website_license\">Otwórz stronę</string>\n    <string name=\"description_select_note\">Teraz możesz zaznaczyć tekst wewnątrz opisu. Pamiętaj, że w trybie zaznaczania strona może migotać i linki nie będą klikalne.</string>\n    <string name=\"account_terminated\">Konto zamknięte.</string>\n    <string name=\"feed_load_error_fast_unknown\">Tryb szybki dla ładowania kanału nie dostarcza więcej informacji na ten temat.</string>\n    <string name=\"feed_load_error_terminated\">Konto autora zostało zawieszone.\n\\nNewPipe nie będzie w stanie załadować tego kanału w przyszłości.\n\\nCzy chcesz anulować subskrypcję tego kanału\\?</string>\n    <string name=\"feed_load_error_account_info\">Nie udało się załadować kanału dla „%s”.</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Począwszy od Androida 10 obsługiwany jest tylko Storage Access Framework</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Zostaniesz zapytany(-a), gdzie zapisać każdy pobierany plik</string>\n    <string name=\"no_dir_yet\">Nie ustawiono jeszcze folderu zapisywania, wybierz domyślny teraz</string>\n    <string name=\"feed_load_error\">Błąd podczas ładowania kanału</string>\n    <string name=\"metadata_privacy_unlisted\">Niepubliczny</string>\n    <string name=\"off\">Wyłączony</string>\n    <string name=\"on\">Włączony</string>\n    <string name=\"tablet_mode_title\">Tryb tabletu</string>\n    <string name=\"comments_are_disabled\">Komentarze są wyłączone</string>\n    <string name=\"low_quality_smaller\">Niska jakość (mniejszy)</string>\n    <string name=\"high_quality_larger\">Wysoka jakość (większy)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Podgląd miniatury na pasku przewijania</string>\n    <string name=\"dont_show\">Nie pokazuj</string>\n    <string name=\"detail_heart_img_view_description\">Serduszko od twórcy</string>\n    <string name=\"mark_as_watched\">Oznacz jako obejrzane</string>\n    <string name=\"remote_search_suggestions\">Zdalne podpowiedzi wyszukiwania</string>\n    <string name=\"local_search_suggestions\">Lokalne podpowiedzi wyszukiwania</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Usunięto %1$s pobranie</item>\n        <item quantity=\"few\">Usunięto %1$s pobrania</item>\n        <item quantity=\"many\">Usunięto %1$s pobrań</item>\n        <item quantity=\"other\">Usunięto %1$s pobrań</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Pobieranie ukończone</item>\n        <item quantity=\"few\">%s ukończone pobrania</item>\n        <item quantity=\"many\">%s ukończonych pobrań</item>\n        <item quantity=\"other\">%s ukończonych pobrań</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Przesuń w bok elementy, aby je usunąć</string>\n    <string name=\"start_main_player_fullscreen_summary\">Nie uruchamiaj wideo w miniodtwarzaczu, ale przełączaj się bezpośrednio na tryb pełnoekranowy, jeśli automatyczne obracanie jest zablokowane. Nadal możesz uzyskać dostęp do miniodtwarzacza, wychodząc z trybu pełnoekranowego</string>\n    <string name=\"start_main_player_fullscreen_title\">Uruchamiaj główny odtwarzacz w trybie pełnoekranowym</string>\n    <string name=\"enqueued_next\">Dodano do kolejki (następny)</string>\n    <string name=\"enqueue_next_stream\">Dodaj do kolejki (następny)</string>\n    <string name=\"processing_may_take_a_moment\">Przetwarzanie… Może to chwilę potrwać</string>\n    <string name=\"checking_updates_toast\">Sprawdzanie aktualizacji…</string>\n    <string name=\"manual_update_description\">Ręcznie sprawdź dostępność nowych wersji</string>\n    <string name=\"check_for_updates\">Sprawdź dostępność aktualizacji</string>\n    <string name=\"feed_new_items\">Nowe pozycje kanału</string>\n    <string name=\"show_crash_the_player_summary\">Pokazuje opcję psucia podczas korzystania z odtwarzacza</string>\n    <string name=\"crash_the_player\">Zepsuj odtwarzacz</string>\n    <string name=\"show_crash_the_player_title\">Pokazuj „Zepsuj odtwarzacz”</string>\n    <string name=\"error_report_channel_name\">Powiadomienie raportu o błędach</string>\n    <string name=\"error_report_channel_description\">Powiadomienia do zgłaszania błędów</string>\n    <string name=\"error_report_notification_title\">NewPipe napotkał błąd. Naciśnij, aby zgłosić</string>\n    <string name=\"error_report_notification_toast\">Wystąpił błąd, zobacz powiadomienie</string>\n    <string name=\"show_error_snackbar\">Pokaż snackbar z błędem</string>\n    <string name=\"create_error_notification\">Utwórz powiadomienie o błędzie</string>\n    <string name=\"no_appropriate_file_manager_message\">Nie znaleziono odpowiedniego menedżera plików dla tej akcji.\n\\nZainstaluj menedżer plików lub spróbuj wyłączyć „%s” w ustawieniach pobierania.</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Nie znaleziono odpowiedniego menedżera plików dla tej akcji.\n\\nZainstaluj menedżer plików zgodny z Storage Access Framework.</string>\n    <string name=\"detail_pinned_comment_view_description\">Przypięty komentarz</string>\n    <string name=\"leak_canary_not_available\">LeakCanary jest niedostępne</string>\n    <string name=\"progressive_load_interval_title\">Rozmiar interwału ładowania odtwarzania</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">domyślny ExoPlayera</string>\n    <string name=\"settings_category_player_notification_title\">Powiadomienie odtwarzacza</string>\n    <string name=\"settings_category_player_notification_summary\">Skonfiguruj powiadomienie aktualnie odtwarzanego strumienia</string>\n    <string name=\"check_new_streams\">Uruchom sprawdzenie nowych strumieni</string>\n    <string name=\"any_network\">Dowolna sieć</string>\n    <string name=\"you_successfully_subscribed\">Subskrybujesz teraz ten kanał</string>\n    <string name=\"notifications\">Powiadomienia</string>\n    <string name=\"streams_notification_channel_name\">Nowe strumienie</string>\n    <string name=\"streams_notification_channel_description\">Powiadomienia o nowych strumieniach dla subskrypcji</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nowy strumień</item>\n        <item quantity=\"few\">%s nowe strumienie</item>\n        <item quantity=\"many\">%s nowych strumieni</item>\n        <item quantity=\"other\">%s nowych strumieni</item>\n    </plurals>\n    <string name=\"loading_stream_details\">Ładowanie szczegółów strumienia…</string>\n    <string name=\"enable_streams_notifications_title\">Powiadomienia o nowych strumieniach</string>\n    <string name=\"enable_streams_notifications_summary\">Powiadamiaj o nowych strumieniach z subskrypcji</string>\n    <string name=\"streams_notifications_interval_title\">Częstotliwość sprawdzania</string>\n    <string name=\"streams_notifications_network_title\">Wymagane połączenie sieciowe</string>\n    <string name=\"delete_downloaded_files_confirm\">Czy usunąć wszystkie pobrane pliki z dysku\\?</string>\n    <string name=\"notifications_disabled\">Powiadomienia są wyłączone</string>\n    <string name=\"get_notified\">Otrzymuj powiadomienia</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Przełącz wszystkie</string>\n    <string name=\"percent\">Procent</string>\n    <string name=\"semitone\">Półton</string>\n    <string name=\"selected_stream_external_player_not_supported\">Wybrany strumień nie jest obsługiwany przez zewnętrzne odtwarzacze</string>\n    <string name=\"streams_not_yet_supported_removed\">Strumienie, których jeszcze nie da się pobrać, nie są wyświetlane</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Brak dostępnych strumieni audio dla zewnętrznych odtwarzaczy</string>\n    <string name=\"no_video_streams_available_for_external_players\">Brak dostępnych strumieni wideo dla zewnętrznych odtwarzaczy</string>\n    <string name=\"select_quality_external_players\">Wybierz jakość dla zewnętrznych odtwarzaczy</string>\n    <string name=\"unknown_format\">Nieznany format</string>\n    <string name=\"unknown_quality\">Nieznana jakość</string>\n    <string name=\"faq_title\">Często zadawane pytania</string>\n    <string name=\"faq_description\">Jeśli masz problemy podczas korzystania z aplikacji, koniecznie sprawdź odpowiedzi na najczęściej pojawiające się pytania!</string>\n    <string name=\"faq\">Zobacz na stronie internetowej</string>\n    <string name=\"sort\">Sortuj</string>\n    <string name=\"app_update_available_notification_text\">Naciśnij, aby pobrać %s</string>\n    <string name=\"fast_mode\">Tryb szybki</string>\n    <string name=\"import_subscriptions_hint\">Importuj lub eksportuj subskrypcje z menu z trzema kropkami.</string>\n    <string name=\"app_update_unavailable_toast\">Używasz najnowszej wersji NewPipe</string>\n    <string name=\"night_theme_available\">Ta opcja jest dostępna tylko wtedy, gdy %s jest wybrany jako motyw</string>\n    <string name=\"unset_playlist_thumbnail\">Usuń stałą miniaturę</string>\n    <string name=\"msg_failed_to_copy\">Nie udało się skopiować do schowka</string>\n    <string name=\"card\">Karta</string>\n    <string name=\"duplicate_in_playlist\">Wyszarzone playlisty zawierają już tę pozycję</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Dodano duplikat %d raz(y)</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Przydatne, na przykład, jeśli używasz zestawu słuchawkowego z zepsutymi fizycznymi przyciskami</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignoruj zdarzenia sprzętowego przycisku multimedialnego</string>\n    <string name=\"remove_duplicates_title\">Czy usunąć duplikaty\\?</string>\n    <string name=\"feed_hide_streams_title\">Pokaż następujące strumienie</string>\n    <string name=\"feed_show_hide_streams\">Pokaż/Ukryj strumienie</string>\n    <string name=\"remove_duplicates\">Usuń duplikaty</string>\n    <string name=\"remove_duplicates_message\">Czy chcesz usunąć wszystkie zduplikowane strumienie z tej playlisty\\?</string>\n    <string name=\"feed_show_watched\">W pełni obejrzane</string>\n    <string name=\"feed_show_partially_watched\">Częściowo obejrzane</string>\n    <string name=\"feed_show_upcoming\">Nadchodzące</string>\n    <string name=\"left_gesture_control_summary\">Wybierz gest dla lewej strony ekranu odtwarzacza</string>\n    <string name=\"left_gesture_control_title\">Akcja gestu z lewej</string>\n    <string name=\"right_gesture_control_summary\">Wybierz gest dla prawej strony ekranu odtwarzacza</string>\n    <string name=\"brightness\">Jasność</string>\n    <string name=\"volume\">Głośność</string>\n    <string name=\"none\">Brak</string>\n    <string name=\"right_gesture_control_title\">Akcja gestu z prawej</string>\n    <string name=\"progressive_load_interval_summary\">Zmień rozmiar interwału ładowania zawartości progresywnych (aktualnie %s). Niższa wartość może przyspieszyć ich początkowe ładowanie</string>\n    <string name=\"prefer_original_audio_title\">Preferuj oryginalny dźwięk</string>\n    <string name=\"prefer_original_audio_summary\">Wybieraj oryginalną ścieżkę dźwiękową niezależnie od języka</string>\n    <string name=\"prefer_descriptive_audio_title\">Preferuj audiodeskrypcję</string>\n    <string name=\"play_queue_audio_track\">Dźwięk: %s</string>\n    <string name=\"audio_track\">Ścieżka dźwiękowa</string>\n    <string name=\"audio_track_present_in_video\">Ścieżka dźwiękowa powinna już się znajdować w tym strumieniu</string>\n    <string name=\"select_audio_track_external_players\">Wybierz ścieżkę dźwiękową dla zewnętrznych odtwarzaczy</string>\n    <string name=\"unknown_audio_track\">Nieznana</string>\n    <string name=\"settings_category_exoplayer_title\">Ustawienia ExoPlayera</string>\n    <string name=\"settings_category_exoplayer_summary\">Zarządzaj niektórymi ustawieniami ExoPlayera. Zmiany te wymagają ponownego uruchomienia odtwarzacza, aby zostały uwzględnione</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Używaj funkcji zapasowego dekodera ExoPlayera</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Zawsze używaj obejścia ustawienia powierzchni wyjścia wideo ExoPlayera</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">oryginalna</string>\n    <string name=\"audio_track_type_dubbed\">dubbing</string>\n    <string name=\"audio_track_type_descriptive\">audiodeskrypcja</string>\n    <string name=\"prefer_descriptive_audio_summary\">Wybieraj ścieżkę dźwiękową z opisami dla osób niedowidzących, jeśli jest dostępna</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\n\\nWłączenie tej opcji może zapobiec błędom odtwarzania podczas przełączania obecnego odtwarzacza wideo lub przechodzenia na pełny ekran</string>\n    <string name=\"main_tabs_position_summary\">Przenieś selektor kart głównych na dół</string>\n    <string name=\"main_tabs_position_title\">Pozycja kart głównych</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Tunelowanie multimediów zostało domyślnie wyłączone na Twoim urządzeniu, ponieważ wiadomo, że model Twojego urządzenia go nie obsługuje</string>\n    <string name=\"no_streams\">Brak strumieni</string>\n    <string name=\"no_live_streams\">Brak transmisji na żywo</string>\n    <string name=\"channel_tab_videos\">Wideo</string>\n    <string name=\"metadata_subscribers\">Subskrybujący</string>\n    <string name=\"show_channel_tabs_summary\">Karty wyświetlane na stronach kanałów</string>\n    <string name=\"show_channel_tabs\">Karty kanałów</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"loading_metadata_title\">Ładowanie metadanych…</string>\n    <string name=\"feed_fetch_channel_tabs\">Pobieranie kart kanału</string>\n    <string name=\"channel_tab_about\">Informacje</string>\n    <string name=\"channel_tab_albums\">Albumy</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Karty do pobrania podczas aktualizacji kanału. Ta opcja nie działa, jeśli kanał jest aktualizowany w trybie szybkim</string>\n    <string name=\"channel_tab_playlists\">Playlisty</string>\n    <string name=\"channel_tab_tracks\">Utwory</string>\n    <string name=\"channel_tab_channels\">Kanały</string>\n    <string name=\"channel_tab_livestreams\">Na żywo</string>\n    <string name=\"toggle_screen_orientation\">Przełącz orientację ekranu</string>\n    <string name=\"toggle_fullscreen\">Włącz/Wyłącz pełny ekran</string>\n    <string name=\"next_stream\">Następny strumień</string>\n    <string name=\"open_play_queue\">Otwórz kolejkę odtwarzania</string>\n    <string name=\"forward\">Przewiń do przodu</string>\n    <string name=\"rewind\">Przewiń do tyłu</string>\n    <string name=\"replay\">Odtwórz ponownie</string>\n    <string name=\"play\">Odtwórz</string>\n    <string name=\"more_options\">Więcej opcji</string>\n    <string name=\"duration\">Czas trwania</string>\n    <string name=\"previous_stream\">Poprzedni strumień</string>\n    <string name=\"image_quality_title\">Jakość obrazów</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"image_quality_low\">Niska jakość</string>\n    <string name=\"metadata_avatars\">Awatary</string>\n    <string name=\"metadata_subchannel_avatars\">Awatary podkanału</string>\n    <string name=\"image_quality_none\">Nie ładuj</string>\n    <string name=\"image_quality_high\">Wysoka jakość</string>\n    <string name=\"image_quality_medium\">Średnia jakość</string>\n    <string name=\"metadata_uploader_avatars\">Awatary przesyłającego</string>\n    <string name=\"metadata_banners\">Banery</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"metadata_thumbnails\">Miniatury</string>\n    <string name=\"share_playlist_with_list\">Udostępnij listę URL-i</string>\n    <string name=\"share_playlist_with_titles\">Udostępnij z tytułami</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">Udostępnij playlistę</string>\n    <string name=\"video_details_list_item\">– %1$s: %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s odpowiedź</item>\n        <item quantity=\"few\">%s odpowiedzi</item>\n        <item quantity=\"many\">%s odpowiedzi</item>\n        <item quantity=\"other\">%s odpowiedzi</item>\n    </plurals>\n    <string name=\"show_more\">Pokaż więcej</string>\n    <string name=\"show_less\">Pokaż mniej</string>\n    <string name=\"notification_actions_summary_android13\">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ć</string>\n    <string name=\"error_insufficient_storage\">Za mało wolnego miejsca na urządzeniu</string>\n    <string name=\"settings_category_backup_restore_title\">Kopia zapasowa i przywracanie</string>\n    <string name=\"reset_settings_summary\">Resetuje wszystkie ustawienia do ich domyślnych wartości</string>\n    <string name=\"reset_settings_title\">Resetuj ustawienia</string>\n    <string name=\"reset_all_settings\">Zresetowanie wszystkich ustawień odrzuci wszystkie Twoje preferowane ustawienia i ponownie uruchomi aplikację.\n\\n\n\\nCzy na pewno chcesz kontynuować?</string>\n    <string name=\"yes\">Tak</string>\n    <string name=\"no\">Nie</string>\n    <string name=\"auto_update_check_description\">NewPipe może od czasu do czasu automatycznie sprawdzać dostępność nowych wersji i powiadamiać Cię, gdy tylko będą dostępne.\n\\nCzy chcesz to włączyć?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">dodatkowa</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Udostępnij jako tymczasową playlistę YouTube</string>\n    <string name=\"tab_bookmarks_short\">Playlisty</string>\n    <string name=\"select_a_feed_group\">Wybierz grupę kanałów</string>\n    <string name=\"feed_group_page_summary\">Strona grupy kanałów</string>\n    <string name=\"no_feed_group_created_yet\">Nie utworzono jeszcze grupy kanałów</string>\n    <string name=\"search_with_service_name\">Szukaj %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Szukaj %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Polubienia</string>\n    <string name=\"migration_info_6_7_title\">Usunięto stronę SoundCloud 50 najlepszych</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud wycofał oryginalną listę 50 najlepszych. Odpowiadająca karta została usunięta ze strony głównej.</string>\n    <string name=\"migration_info_7_8_title\">Usunięto połączone Na czasie YouTube</string>\n    <string name=\"migration_info_7_8_message\">Od 21 lipca 2025 r. YouTube zaprzestał korzystania z połączonego Na czasie. NewPipe zastąpił domyślną stronę Na czasie popularnymi transmisjami na żywo.\\n\\nMożesz także wybrać różne strony Na czasie w „Ustawienia &gt; Zawartość &gt; Zawartość strony głównej”.</string>\n    <string name=\"trending_gaming\">Gry na czasie</string>\n    <string name=\"trending_podcasts\">Podcasty na czasie</string>\n    <string name=\"trending_movies\">Filmy i programy na czasie</string>\n    <string name=\"trending_music\">Muzyka na czasie</string>\n    <string name=\"short_thousand\">%stys.</string>\n    <string name=\"short_million\">%smln</string>\n    <string name=\"short_billion\">%smld</string>\n    <string name=\"delete_file\">Usuń plik</string>\n    <string name=\"delete_entry\">Usuń wpis</string>\n    <string name=\"entry_deleted\">Usunięto wpis</string>\n    <string name=\"permission_display_over_apps_message\">Aby korzystać z odtwarzacza w trybie okienkowym, wybierz %1$s w następującym menu ustawień Androida i włącz %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">„Zezwól na wyświetlanie nad innymi aplikacjami”</string>\n    <string name=\"account_terminated_service_provides_reason\">Konto zamknięte.\\n\\n%1$s podaje następujący powód: %2$s</string>\n    <string name=\"player_http_403\">Podczas odtwarzania otrzymano od serwera błąd HTTP 403, prawdopodobnie spowodowany wygaśnięciem adresu URL strumienia lub blokadą adresu IP.</string>\n    <string name=\"player_http_invalid_status\">Podczas odtwarzania otrzymano od serwera błąd HTTP %1$s.</string>\n    <string name=\"youtube_player_http_403\">Podczas odtwarzania otrzymano od serwera błąd HTTP 403, prawdopodobnie spowodowany blokadą adresu IP lub problemami z odszyfrowaniem adresu URL strumienia.</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s odmówił dostarczenia danych, prosząc o zalogowanie się w celu potwierdzenia, że nie jest się botem.\\n\\nTwoje IP mogło zostać tymczasowo zablokowane przez %1$s. Możesz chwilę poczekać lub zmienić adres IP (na przykład włączając/wyłączając VPN lub przełączając się z sieci Wi-Fi na dane komórkowe).</string>\n    <string name=\"unsupported_content_in_country\">Ta treść nie jest dostępna dla aktualnie wybranego kraju treści.\\n\\nZmień swój wybór w „Ustawienia &gt; Zawartość &gt; Domyślny kraj treści”.</string>\n    <string name=\"kao_dialog_warning\">W sierpniu 2025 r. Google ogłosił, że od września 2026 r. instalowanie aplikacji będzie wymagać weryfikacji ich twórców w przypadku wszystkich aplikacji na Androida na certyfikowanych urządzeniach, w tym tych zainstalowanych poza sklepem Google Play. Ponieważ programiści NewPipe nie zgadzają się z tym wymogiem, NewPipie nie będzie już działać na certyfikowanych urządzeniach z Androidem po tym czasie.</string>\n    <string name=\"kao_dialog_more_info\">Szczegóły</string>\n    <string name=\"kao_solution\">Rozwiązanie</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-pt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Publicado em %1$s</string>\n    <string name=\"no_player_found\">Reprodutor de vídeo não encontrado. Instalar VLC\\?</string>\n    <string name=\"install\">Instalar</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"open_in_browser\">Abrir no navegador</string>\n    <string name=\"share\">Partilhar</string>\n    <string name=\"download\">Descarregar</string>\n    <string name=\"search\">Pesquisar</string>\n    <string name=\"settings\">Definições</string>\n    <string name=\"did_you_mean\">Será que queria dizer \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Partilhar com</string>\n    <string name=\"use_external_video_player_title\">Utilizar reprodutor de vídeo externo</string>\n    <string name=\"use_external_audio_player_title\">Utilizar reprodutor de áudio externo</string>\n    <string name=\"download_path_title\">Pasta para os ficheiros de vídeo</string>\n    <string name=\"download_path_summary\">Os ficheiros de vídeo descarregados serão guardados aqui</string>\n    <string name=\"download_path_dialog_title\">Escolha a pasta para guardar os ficheiros de vídeo</string>\n    <string name=\"default_resolution_title\">Resolução padrão</string>\n    <string name=\"play_with_kodi_title\">Reproduzir no Kodi</string>\n    <string name=\"kore_not_found\">Instalar Kore\\?</string>\n    <string name=\"show_play_with_kodi_title\">Mostrar opção \\\"Reproduzir no Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Mostrar opção para reproduzir o vídeo no Kodi</string>\n    <string name=\"play_audio\">Áudio</string>\n    <string name=\"default_audio_format_title\">Formato padrão de áudio</string>\n    <string name=\"download_dialog_title\">Descarregar</string>\n    <string name=\"show_next_and_similar_title\">Mostrar vídeos \\'Seguintes\\' e \\'Semelhantes\\'</string>\n    <string name=\"unsupported_url\">URL não suportada</string>\n    <string name=\"content_language_title\">Idioma padrão para conteúdo</string>\n    <string name=\"settings_category_video_audio_title\">Vídeo e áudio</string>\n    <string name=\"detail_thumbnail_view_description\">Reproduzir vídeo, duração:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Miniatura do avatar do canal</string>\n    <string name=\"detail_dislikes_img_view_description\">Não gosto</string>\n    <string name=\"detail_likes_img_view_description\">Gosto</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"dark_theme_title\">Escuro</string>\n    <string name=\"light_theme_title\">Claro</string>\n    <string name=\"settings_category_appearance_title\">Aparência</string>\n    <string name=\"background_player_playing_toast\">Reprodução em segundo plano</string>\n    <string name=\"network_error\">Erro de rede</string>\n    <string name=\"download_path_audio_title\">Pasta para os ficheiros de áudio</string>\n    <string name=\"download_path_audio_summary\">Os ficheiros de áudio descarregados serão guardados aqui</string>\n    <string name=\"download_path_audio_dialog_title\">Escolha a pasta para guardar os ficheiros de áudio</string>\n    <string name=\"general_error\">Erro</string>\n    <string name=\"could_not_load_thumbnails\">Não foi possível carregar todas as miniaturas</string>\n    <string name=\"parsing_error\">Não foi possível processar o site</string>\n    <string name=\"content_not_available\">Conteúdo indisponível</string>\n    <string name=\"content\">Conteúdo</string>\n    <string name=\"show_age_restricted_content_title\">Mostrar conteúdo com restrição de idade</string>\n    <string name=\"could_not_setup_download_menu\">Não foi possível configurar o menu de descargas</string>\n    <string name=\"sorry_string\">Bolas, isto não deveria ter acontecido.</string>\n    <string name=\"error_report_button_text\">Reportar por e-mail</string>\n    <string name=\"error_snackbar_message\">Desculpe mas algo correu mal.</string>\n    <string name=\"error_snackbar_action\">Relatório</string>\n    <string name=\"what_device_headline\">Informação:</string>\n    <string name=\"what_happened_headline\">O que ocorreu:</string>\n    <string name=\"your_comment\">Comentários (em inglês):</string>\n    <string name=\"error_details_headline\">Detalhes:</string>\n    <string name=\"video\">Vídeo</string>\n    <string name=\"audio\">Áudio</string>\n    <string name=\"retry\">Tentar novamente</string>\n    <string name=\"main_bg_subtitle\">Toque na lupa para começar.</string>\n    <string name=\"duration_live\">Em direto</string>\n    <string name=\"downloads\">Descargas</string>\n    <string name=\"downloads_title\">Descargas</string>\n    <string name=\"error_report_title\">Relatório de erro</string>\n    <string name=\"start\">Iniciar</string>\n    <string name=\"pause\">Pausa</string>\n    <string name=\"delete\">Eliminar</string>\n    <string name=\"checksum\">Soma de controlo</string>\n    <string name=\"msg_name\">Nome do ficheiro</string>\n    <string name=\"msg_error\">Erro</string>\n    <string name=\"msg_running_detail\">Toque para detalhes</string>\n    <string name=\"msg_wait\">Por favor aguarde…</string>\n    <string name=\"msg_copied\">Copiado para a área de transferência</string>\n    <string name=\"no_available_dir\">Pode definir, mais tarde, uma pasta para as descargas</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_threads\">Processos</string>\n    <string name=\"msg_running\">Descarga NewPipe</string>\n    <string name=\"app_ui_crash\">Aplicação terminou em erro</string>\n    <string name=\"info_labels\">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:</string>\n    <string name=\"open_in_popup_mode\">Abrir no modo popup</string>\n    <string name=\"black_theme_title\">Preto</string>\n    <string name=\"all\">Tudo</string>\n    <string name=\"msg_popup_permission\">Esta permissão é necessária\n\\npara o modo popup</string>\n    <string name=\"title_activity_recaptcha\">Desafio reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Desafio reCAPTCHA solicitado</string>\n    <string name=\"popup_playing_toast\">Reproduzir no modo poppup</string>\n    <string name=\"default_video_format_title\">Formato padrão de vídeo</string>\n    <string name=\"disabled\">Desativado</string>\n    <string name=\"default_popup_resolution_title\">Resolução padrão para janela popup</string>\n    <string name=\"show_higher_resolutions_title\">Mostrar resoluções mais altas</string>\n    <string name=\"show_higher_resolutions_summary\">Apenas alguns dispositivos conseguem reproduzir vídeos em 2K/4K</string>\n    <string name=\"controls_popup_title\">Popup</string>\n    <string name=\"popup_remember_size_pos_title\">Lembrar propriedades do popup</string>\n    <string name=\"clear\">Limpar</string>\n    <string name=\"controls_background_title\">Segundo plano</string>\n    <string name=\"use_external_video_player_summary\">Remove o áudio em algumas resoluções</string>\n    <string name=\"popup_remember_size_pos_summary\">Lembrar último tamanho e posição do popup</string>\n    <string name=\"show_search_suggestions_title\">Sugestões de pesquisa</string>\n    <string name=\"show_search_suggestions_summary\">Escolha as sugestões a mostrar ao pesquisar</string>\n    <string name=\"best_resolution\">Melhor resolução</string>\n    <string name=\"title_activity_about\">Sobre o NewPipe</string>\n    <string name=\"title_licenses\">Licenças de terceiros</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s de %2$s nos termos da %3$s</string>\n    <string name=\"tab_about\">Sobre e perguntas frequentes</string>\n    <string name=\"tab_licenses\">Licenças</string>\n    <string name=\"app_description\">Aplicação de reprodução para Android.</string>\n    <string name=\"view_on_github\">Ver no GitHub</string>\n    <string name=\"app_license_title\">Licença do NewPipe</string>\n    <string name=\"contribution_encouragement\">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á!</string>\n    <string name=\"read_full_license\">Ver licença</string>\n    <string name=\"contribution_title\">Participar</string>\n    <string name=\"subscribe_button_title\">Subscrever</string>\n    <string name=\"subscribed_button_title\">Subscrito</string>\n    <string name=\"channel_unsubscribed\">Canal não subscrito</string>\n    <string name=\"subscription_change_failed\">Não foi possível alterar a subscrição</string>\n    <string name=\"subscription_update_failed\">Não foi possível atualizar a subscrição</string>\n    <string name=\"tab_subscriptions\">Subscrições</string>\n    <string name=\"fragment_feed_title\">Novidades</string>\n    <string name=\"enable_search_history_title\">Pesquisar histórico</string>\n    <string name=\"enable_search_history_summary\">Guardar termos de pesquisa localmente</string>\n    <string name=\"enable_watch_history_title\">Histórico de visualizações</string>\n    <string name=\"enable_watch_history_summary\">Manter histórico dos vídeos visualizados</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Continuar reprodução</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Continuar reprodução após interrupções (ex. chamadas)</string>\n    <string name=\"settings_category_player_title\">Reprodutor</string>\n    <string name=\"settings_category_player_behavior_title\">Comportamento</string>\n    <string name=\"settings_category_history_title\">Histórico e cache</string>\n    <string name=\"undo\">Desfazer</string>\n    <string name=\"notification_channel_name\">Notificação NewPipe</string>\n    <string name=\"notification_channel_description\">Notificações para o reprodutor NewPipe</string>\n    <string name=\"search_no_results\">Sem resultados</string>\n    <string name=\"empty_list_subtitle\">Aqui não há nada para ver</string>\n    <string name=\"no_subscribers\">Sem subscritores</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s subscritor</item>\n        <item quantity=\"many\">%s subscritores</item>\n        <item quantity=\"other\">%s subscritores</item>\n    </plurals>\n    <string name=\"no_views\">Sem visualizações</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s visualização</item>\n        <item quantity=\"many\">%s visualizações</item>\n        <item quantity=\"other\">%s visualizações</item>\n    </plurals>\n    <string name=\"no_videos\">Sem vídeos</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s vídeo</item>\n        <item quantity=\"many\">%s vídeos</item>\n        <item quantity=\"other\">%s vídeos</item>\n    </plurals>\n    <string name=\"settings_category_downloads_title\">Descargas</string>\n    <string name=\"settings_file_charset_title\">Carateres permitidos no nome dos ficheiros</string>\n    <string name=\"settings_file_replacement_character_summary\">Os carateres inválidos são substituídos por este valor</string>\n    <string name=\"settings_file_replacement_character_title\">Carácter de substituição</string>\n    <string name=\"charset_letters_and_digits\">Letras e dígitos</string>\n    <string name=\"charset_most_special_characters\">Mais caracteres especiais</string>\n    <string name=\"title_activity_history\">Histórico</string>\n    <string name=\"action_history\">Histórico</string>\n    <string name=\"delete_item_search_history\">Deseja remover este item do histórico de pesquisas\\?</string>\n    <string name=\"play_all\">Reproduzir tudo</string>\n    <string name=\"unknown_content\">[Desconhecido]</string>\n    <string name=\"player_unrecoverable_failure\">Ocorreu um erro compulsivo do reprodutor</string>\n    <string name=\"player_recoverable_failure\">A recuperar de um erro do reprodutor</string>\n    <string name=\"main_page_content\">Conteúdo da página principal</string>\n    <string name=\"blank_page_summary\">Página vazia</string>\n    <string name=\"channel_page_summary\">Página do canal</string>\n    <string name=\"select_a_channel\">Selecione um canal</string>\n    <string name=\"no_channel_subscribed_yet\">Não existem canais subscritos</string>\n    <string name=\"select_a_kiosk\">Selecione um \\\"kiosk\\\"</string>\n    <string name=\"trending\">Tendências</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Novos e tendências</string>\n    <string name=\"play_queue_remove\">Remover</string>\n    <string name=\"play_queue_stream_detail\">Detalhes</string>\n    <string name=\"play_queue_audio_settings\">Definições de áudio</string>\n    <string name=\"start_here_on_background\">Iniciar reprodução em segundo plano</string>\n    <string name=\"start_here_on_popup\">Iniciar reprodução em popup</string>\n    <string name=\"show_info\">Mostrar informação</string>\n    <string name=\"tab_bookmarks\">Listas de reprodução favoritas</string>\n    <string name=\"always\">Sempre</string>\n    <string name=\"just_once\">Apenas uma vez</string>\n    <string name=\"import_data_title\">Importar base de dados</string>\n    <string name=\"export_data_title\">Exportar base de dados</string>\n    <string name=\"import_data_summary\">Substitui o seu histórico, subscrições, listas de reprodução e (opcionalmente) definições</string>\n    <string name=\"export_data_summary\">Exportar histórico, subscrições, listas de reprodução e definições</string>\n    <string name=\"switch_to_background\">Mudar para segundo plano</string>\n    <string name=\"switch_to_popup\">Mudar para popup</string>\n    <string name=\"switch_to_main\">Mudar para principal</string>\n    <string name=\"player_stream_failure\">Não foi possível reproduzir este vídeo</string>\n    <string name=\"external_player_unsupported_link_type\">Os reprodutores externos não possuem suporte a este tipo de ligações</string>\n    <string name=\"detail_drag_description\">Arraste para reordenar</string>\n    <string name=\"create\">Criar</string>\n    <string name=\"rename\">Mudar nome</string>\n    <string name=\"donation_title\">Doar</string>\n    <string name=\"no_player_found_toast\">Reprodutor de vídeo não encontrado (pode instalar VLC para o efeito).</string>\n    <string name=\"controls_download_desc\">Descarregar ficheiro</string>\n    <string name=\"controls_add_to_playlist_title\">Adicionar a</string>\n    <string name=\"use_inexact_seek_title\">Utilizar pesquisa rápida</string>\n    <string name=\"use_inexact_seek_summary\">Este tipo de pesquisa é mais rápida mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Cache de imagens limpa</string>\n    <string name=\"default_content_country_title\">País padrão para conteúdo</string>\n    <string name=\"settings_category_debug_title\">Depuração</string>\n    <string name=\"video_streams_empty\">Não foram encontrados vídeos</string>\n    <string name=\"audio_streams_empty\">Não foram encontrados áudios</string>\n    <string name=\"invalid_directory\">Pasta inexistente</string>\n    <string name=\"invalid_source\">Fonte de conteúdo/ficheiro inexistente</string>\n    <string name=\"invalid_file\">O ficheiro não existe ou não tem permissões para ler e/ou escrever</string>\n    <string name=\"file_name_empty_error\">O nome do ficheiro não pode estar vazio</string>\n    <string name=\"error_occurred_detail\">Ocorreu um erro: %1$s</string>\n    <string name=\"no_streams_available_download\">Não existem vídeos para descarregar</string>\n    <string name=\"dismiss\">Rejeitar</string>\n    <string name=\"website_title\">Site oficial</string>\n    <string name=\"website_encouragement\">Visite o site NewPipe para obter mais informação e novidades.</string>\n    <string name=\"kiosk_page_summary\">Página \\'kiosk\\'</string>\n    <string name=\"export_complete_toast\">Exportado</string>\n    <string name=\"import_complete_toast\">Importado</string>\n    <string name=\"no_valid_zip_file\">Ficheiro ZIP inválido</string>\n    <string name=\"could_not_import_all_files\">Aviso: não foi possível importar todos os ficheiros.</string>\n    <string name=\"override_current_data\">Está prestes a substituir a configuração atual.</string>\n    <string name=\"drawer_open\">Abrir menu</string>\n    <string name=\"drawer_close\">Fechar menu</string>\n    <string name=\"name\">Nome</string>\n    <string name=\"metadata_cache_wipe_title\">Limpar meta-dados em cache</string>\n    <string name=\"metadata_cache_wipe_summary\">Limpar todos os dados da página web</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Meta-dados em cache limpos</string>\n    <string name=\"file\">Ficheiro</string>\n    <string name=\"title_last_played\">Última reprodução</string>\n    <string name=\"title_most_played\">Mais reproduzido</string>\n    <string name=\"video_player\">Reprodutor de vídeo</string>\n    <string name=\"background_player\">Reprodutor em segundo plano</string>\n    <string name=\"popup_player\">Reprodutor \\'popup\\'</string>\n    <string name=\"always_ask_open_action\">Perguntar sempre</string>\n    <string name=\"preferred_player_fetcher_notification_title\">A obter informação…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">A carregar conteúdo solicitado</string>\n    <string name=\"create_playlist\">Nova lista de reprodução</string>\n    <string name=\"rename_playlist\">Mudar nome</string>\n    <string name=\"add_to_playlist\">Adicionar à lista de reprodução</string>\n    <string name=\"bookmark_playlist\">Guardar lista de reprodução como favorita</string>\n    <string name=\"unbookmark_playlist\">Remover marcador</string>\n    <string name=\"delete_playlist_prompt\">Eliminar esta lista de reprodução\\?</string>\n    <string name=\"playlist_creation_success\">Lista de reprodução criada</string>\n    <string name=\"playlist_add_stream_success\">Adicionado à lista de reprodução</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniatura da lista de reprodução alterada.</string>\n    <string name=\"caption_none\">Sem legendas</string>\n    <string name=\"resize_zoom\">Ampliar</string>\n    <string name=\"caption_auto_generated\">Gerado automaticamente</string>\n    <string name=\"caption_setting_title\">Legendas</string>\n    <string name=\"import_title\">Importar</string>\n    <string name=\"import_from\">Importar de</string>\n    <string name=\"export_to\">Exportar para</string>\n    <string name=\"import_ongoing\">A importar…</string>\n    <string name=\"export_ongoing\">A exportar…</string>\n    <string name=\"import_file_title\">Importar ficheiro</string>\n    <string name=\"previous_export\">Exportação anterior</string>\n    <string name=\"subscriptions_import_unsuccessful\">Não foi possível importar as subscrições</string>\n    <string name=\"subscriptions_export_unsuccessful\">Não foi possível exportar as subscrições</string>\n    <string name=\"import_youtube_instructions\">Importar subscrições do YouTube do Google Takeout:\n\\n\n\\n1. Aceda ao URL: %1$s\n\\n2. Inicie sessão\n\\n3. Clique em \\\"Todos os dados incluídos\\\", depois em \\\"Desmarcar todos\\\", selecione \\\"Subscrições\\\" e clique em \\\"OK\\\".\n\\n4. Clique em \\\"Próximo passo\\\" e, depois, em \\\"Criar exportação\\\".\n\\n5. Clique no botão \\\"Descarregar\\\" após aparecer\n\\n6. Clique em IMPORT FILE abaixo e selecione o ficheiro .zip descarregado\n\\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</string>\n    <string name=\"import_soundcloud_instructions\">Importe o seu perfil SoundCloud digitando o URL ou a ID.:\n\\n\n\\n1. Ative o modo desktop do seu navegador web (o site não está disponível para dispositivos móveis)\n\\n2. Aceda a este URL: %1$s\n\\n3. Inicie a sessão\n\\n4. Copie o URL do seu perfil.</string>\n    <string name=\"import_soundcloud_instructions_hint\">suaID, soundcloud.com/suaID</string>\n    <string name=\"playback_speed_control\">Controlos para velocidade de reprodução</string>\n    <string name=\"playback_tempo\">Ritmo</string>\n    <string name=\"clear_views_history_title\">Limpar histórico de visualizações</string>\n    <string name=\"auto_queue_summary\">Continuar (sem repetição) a fila de reprodução anexando um vídeo relacionado</string>\n    <string name=\"show_hold_to_append_title\">Mostrar dica \\\"Toque longo para colocar na fila\\\"</string>\n    <string name=\"show_hold_to_append_summary\">Mostrar dica ao premir em segundo plano ou no botão \\\"Detalhes:\\\" da janela popup</string>\n    <string name=\"channels\">Canais</string>\n    <string name=\"playlists\">Listas de reprodução</string>\n    <string name=\"tracks\">Faixas</string>\n    <string name=\"users\">Utilizadores</string>\n    <string name=\"clear_views_history_summary\">Remove o histórico dos vídeos reproduzidos e as posições de reprodução</string>\n    <string name=\"delete_view_history_alert\">Remover todo o histórico de visualizações\\?</string>\n    <string name=\"watch_history_deleted\">Histórico de vídeos eliminado</string>\n    <string name=\"clear_search_history_title\">Remover histórico de pesquisas</string>\n    <string name=\"clear_search_history_summary\">Remove o histórico de pesquisas</string>\n    <string name=\"delete_search_history_alert\">Remover todo o histórico de pesquisas\\?</string>\n    <string name=\"search_history_deleted\">Histórico de pesquisa removido</string>\n    <string name=\"one_item_deleted\">1 item eliminado.</string>\n    <string name=\"donation_encouragement\">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.</string>\n    <string name=\"give_back\">Contribuir</string>\n    <string name=\"privacy_policy_title\">Política de privacidade do NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">O projeto NewPipe leva a sua privacidade muito a sério. Por isso, não recolhe dados sem o seu consentimento.\n\\nA polícia de privacidade do NewPipe explica, em detalhe, os tipos de dados enviados sempre que submete um relatório de erro.</string>\n    <string name=\"read_privacy_policy\">Ver política de privacidade</string>\n    <string name=\"auto_queue_title\">Adicionar o próximo vídeo à fila automaticamente</string>\n    <string name=\"app_license\">NewPipe é um software livre \\\"copyleft\\\": pode utilizar, estudar, partilhar e melhorar a aplicação. Especificamente, pode redistribuir e/ou modificar a aplicação nos termos da GNU General Public License, conforme publicada pela Free Software Foundation, tanto a versão 3 da licença ou (por opção) qualquer versão posterior.</string>\n    <string name=\"import_settings\">Também deseja importar as definições\\?</string>\n    <string name=\"hold_to_append\">Toque longo para colocar na fila</string>\n    <string name=\"preferred_open_action_settings_title\">Ação de \\'Abrir\\' preferida</string>\n    <string name=\"preferred_open_action_settings_summary\">Ação padrão ao abrir o conteúdo — %s</string>\n    <string name=\"set_as_playlist_thumbnail\">Definir como miniatura da lista de reprodução</string>\n    <string name=\"resize_fit\">Ajustar</string>\n    <string name=\"resize_fill\">Preencher</string>\n    <string name=\"caption_setting_description\">Alterar escala das legendas e do estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações</string>\n    <string name=\"enable_leak_canary_summary\">A monitorização de memória pode tornar a aplicação instável</string>\n    <string name=\"enable_disposed_exceptions_title\">Reportar erros \\'out-of-lifecycle\\'</string>\n    <string name=\"enable_disposed_exceptions_summary\">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</string>\n    <string name=\"import_network_expensive_warning\">Tenha em atenção de que esta operação pode sobrecarregar a sua rede.\n\\n\n\\nDeseja continuar\\?</string>\n    <string name=\"playback_pitch\">Velocidade</string>\n    <string name=\"unhook_checkbox\">Desvincular (pode causar distorção)</string>\n    <string name=\"skip_silence_checkbox\">Avanço rápido durante silêncio</string>\n    <string name=\"playback_step\">Passo</string>\n    <string name=\"playback_reset\">Repor</string>\n    <string name=\"start_accept_privacy_policy\">Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção.\n\\nTem que aceitar esta política para nos poder enviar o seu relatório.</string>\n    <string name=\"accept\">Aceitar</string>\n    <string name=\"decline\">Recusar</string>\n    <string name=\"limit_data_usage_none_description\">Sem limite</string>\n    <string name=\"limit_mobile_data_usage_title\">Limitar resolução se em dados móveis</string>\n    <string name=\"minimize_on_exit_title\">Minimizar ao trocar de aplicação</string>\n    <string name=\"minimize_on_exit_summary\">Ação a executar ao trocar para outra aplicação a partir do menu principal - %s</string>\n    <string name=\"minimize_on_exit_none_description\">Nenhuma</string>\n    <string name=\"minimize_on_exit_background_description\">Ativar reprodutor em segundo plano</string>\n    <string name=\"minimize_on_exit_popup_description\">Ativar reprodutor \\'popup\\'</string>\n    <string name=\"unsubscribe\">Cancelar subscrição</string>\n    <string name=\"tab_choose\">Escolher separador</string>\n    <string name=\"settings_category_updates_title\">Atualizações</string>\n    <string name=\"file_deleted\">Ficheiro eliminado</string>\n    <string name=\"app_update_notification_channel_name\">Notificação de nova versão</string>\n    <string name=\"app_update_notification_channel_description\">Notificações para novas versões do NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Armazenamento externo indisponível</string>\n    <string name=\"download_to_sdcard_error_message\">Não é possível guardar no cartão SD. Repor pasta de descargas\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Não foi possível ler os separadores guardados e vamos usar os separadores padrão</string>\n    <string name=\"restore_defaults\">Repor predefinições</string>\n    <string name=\"restore_defaults_confirmation\">Deseja repor as predefinições\\?</string>\n    <string name=\"subscribers_count_not_available\">Número de subscrições indisponível</string>\n    <string name=\"main_page_content_summary\">Separadores mostrados na página principal</string>\n    <string name=\"updates_setting_title\">Atualizações</string>\n    <string name=\"updates_setting_description\">Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão</string>\n    <string name=\"list_view_mode\">Modo de exibição</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"grid\">Grelha</string>\n    <string name=\"auto\">Automático</string>\n    <string name=\"app_update_available_notification_title\">Atualização NewPipe disponível!</string>\n    <string name=\"missions_header_finished\">Terminada</string>\n    <string name=\"paused\">em pausa</string>\n    <string name=\"queued\">na fila</string>\n    <string name=\"post_processing\">pós-processamento</string>\n    <string name=\"enqueue\">Colocar na fila</string>\n    <string name=\"permission_denied\">Ação recusada pelo sistema</string>\n    <string name=\"download_failed\">Falha ao descarregar</string>\n    <string name=\"generate_unique_name\">Gerar nome único</string>\n    <string name=\"overwrite\">Sobrescrever</string>\n    <string name=\"overwrite_finished_warning\">Já existe um ficheiro descarregado com este nome</string>\n    <string name=\"download_already_running\">Já existe uma descarga em curso com este nome</string>\n    <string name=\"show_error\">Mostrar erro</string>\n    <string name=\"error_file_creation\">Não foi possível criar o ficheiro</string>\n    <string name=\"error_path_creation\">Não foi possível criar a pasta de destino</string>\n    <string name=\"error_ssl_exception\">Não foi possível estabelecer uma ligação segura</string>\n    <string name=\"error_unknown_host\">Não foi possível encontrar o servidor</string>\n    <string name=\"error_connect_host\">Não foi possível ligar ao servidor</string>\n    <string name=\"error_http_no_content\">O servidor não envia dados</string>\n    <string name=\"error_http_unsupported_range\">O servidor não aceita descargas multi-processo, tente novamente com @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Não encontrado</string>\n    <string name=\"error_postprocessing_failed\">Falha pós-processamento</string>\n    <string name=\"stop\">Parar</string>\n    <string name=\"max_retry_msg\">Tentativas máximas</string>\n    <string name=\"max_retry_desc\">Número máximo de tentativas antes de cancelar a descarga</string>\n    <string name=\"pause_downloads_on_mobile\">Interromper em redes limitadas</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Útil ao trocar para dados móveis, mas algumas descargas não podem ser suspensas</string>\n    <string name=\"events\">Eventos</string>\n    <string name=\"conferences\">Conferências</string>\n    <string name=\"missions_header_pending\">Pendente</string>\n    <string name=\"show_comments_title\">Mostrar comentários</string>\n    <string name=\"show_comments_summary\">Desative para ocultar comentários</string>\n    <string name=\"autoplay_title\">Reprodução automática</string>\n    <string name=\"no_comments\">Sem comentários</string>\n    <string name=\"error_unable_to_load_comments\">Não foi possível carregar os comentários</string>\n    <string name=\"close\">Fechar</string>\n    <string name=\"enable_playback_resume_title\">Continuar reprodução</string>\n    <string name=\"enable_playback_resume_summary\">Restaurar última posição de reprodução</string>\n    <string name=\"enable_playback_state_lists_title\">Posições em listas</string>\n    <string name=\"enable_playback_state_lists_summary\">Mostrar indicadores de posição de reprodução nas listas</string>\n    <string name=\"settings_category_clear_data_title\">Limpar dados</string>\n    <string name=\"watch_history_states_deleted\">Posições de reprodução removidas</string>\n    <string name=\"missing_file\">Ficheiro movido ou eliminado</string>\n    <string name=\"overwrite_unrelated_warning\">Já existe um ficheiro com este nome</string>\n    <string name=\"overwrite_failed\">Não foi possível substituir o ficheiro</string>\n    <string name=\"download_already_pending\">Existe uma descarga pendente com este nome</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe foi fechado enquanto trabalhava no ficheiro</string>\n    <string name=\"error_insufficient_storage_left\">Não há espaço livre no dispositivo</string>\n    <string name=\"error_progress_lost\">Progresso perdido, o ficheiro foi eliminado</string>\n    <string name=\"error_timeout\">Ligação expirada</string>\n    <string name=\"confirm_prompt\">Deseja limpar o histórico de descargas ou eliminar todos os ficheiros descarregados?</string>\n    <string name=\"enable_queue_limit\">Limitar fila de descargas</string>\n    <string name=\"enable_queue_limit_desc\">Permitir apenas uma descarga de cada vez</string>\n    <string name=\"start_downloads\">Iniciar descargas</string>\n    <string name=\"pause_downloads\">Pausa nas descargas</string>\n    <string name=\"downloads_storage_ask_title\">Perguntar onde guardar</string>\n    <string name=\"downloads_storage_ask_summary\">Ser-lhe-á perguntado onde guardar cada descarga.\n\\nAtive o seletor de pastas do sistema (SAF) se quiser descarregar para um cartão SD externo</string>\n    <string name=\"downloads_storage_use_saf_title\">Utilizar seletor de pastas do sistema (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Storage Access Framework\\' permite descargas para um cartão SD externo</string>\n    <string name=\"clear_playback_states_title\">Remover posições de reprodução</string>\n    <string name=\"clear_playback_states_summary\">Remove todas as posições de reprodução</string>\n    <string name=\"delete_playback_states_alert\">Remover todas as posições de reprodução\\?</string>\n    <string name=\"drawer_header_description\">Alternar serviço atualmente selecionado:</string>\n    <string name=\"default_kiosk_page_summary\">\\'Kiosk\\' padrão</string>\n    <string name=\"no_one_watching\">Ninguém está a ver</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s a ver</item>\n        <item quantity=\"many\">%s a ver</item>\n        <item quantity=\"other\">%s a ver</item>\n    </plurals>\n    <string name=\"no_one_listening\">Ninguém está a ouvir</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s ouvinte</item>\n        <item quantity=\"many\">%s ouvintes</item>\n        <item quantity=\"other\">%s ouvintes</item>\n    </plurals>\n    <string name=\"seek_duration_title\">Duração de avanço/recuo rápido</string>\n    <string name=\"peertube_instance_url_title\">Instâncias PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Defina as suas instâncias PeerTube preferidas</string>\n    <string name=\"peertube_instance_url_help\">Encontre as instâncias que gosta em %s</string>\n    <string name=\"peertube_instance_add_title\">Adicionar instância</string>\n    <string name=\"peertube_instance_add_help\">Digite o URL da instância</string>\n    <string name=\"peertube_instance_add_fail\">Falha ao validar a instância</string>\n    <string name=\"peertube_instance_add_https_only\">Apenas são suportados os URL HTTPS</string>\n    <string name=\"peertube_instance_add_exists\">Instância já existe</string>\n    <string name=\"local\">Local</string>\n    <string name=\"recently_added\">Recentes</string>\n    <string name=\"most_liked\">Mais apreciados</string>\n    <string name=\"playlist_no_uploader\">Geração automática (não foi encontrado nenhum carregador)</string>\n    <string name=\"recovering\">a recuperar</string>\n    <string name=\"error_download_resource_gone\">Não é possível recuperar esta descarga</string>\n    <string name=\"choose_instance_prompt\">Escolha uma instância</string>\n    <string name=\"clear_download_history\">Limpar histórico de descargas</string>\n    <string name=\"delete_downloaded_files\">Eliminar ficheiros descarregados</string>\n    <string name=\"permission_display_over_apps\">Permitir sobreposição a outras aplicações</string>\n    <string name=\"app_language_title\">Idioma da aplicação</string>\n    <string name=\"systems_language\">Predefinição do sistema</string>\n    <string name=\"subtitle_activity_recaptcha\">Prima \\\"Feito\\\" ao resolver</string>\n    <string name=\"done\">Feito</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">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\\n\n\\nNewPipe oferece duas estratégias de carregamento:\n\\n- Obter todo o canal - lento, mas completo.\n\\n- Usar um \\'endpoint\\' dedicado - mais rápido, mas não completo.\n\\n\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.\n\\n\n\\nO YouTube é um exemplo de um serviço que oferece este método rápido com a sua fonte RSS.\n\\n\n\\nAssim, a escolha resume-se ao que prefere: velocidade ou informação precisa.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Desativar modo rápido</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Ativar modo rápido</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Se possível, obter de uma fonte dedicada</string>\n    <string name=\"feed_update_threshold_option_always_update\">Atualizar sempre</string>\n    <string name=\"feed_update_threshold_summary\">Tempo após a última atualização antes da subscrição ser considerada desatualizada - %s</string>\n    <string name=\"feed_update_threshold_title\">Limite de atualização da fonte</string>\n    <string name=\"settings_category_feed_title\">Fonte</string>\n    <string name=\"feed_create_new_group_button_title\">Novo</string>\n    <string name=\"feed_group_dialog_delete_message\">Deseja remover este grupo?</string>\n    <string name=\"feed_group_dialog_empty_name\">O nome do grupo está vazio</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d selecionado</item>\n        <item quantity=\"many\">%d selecionados</item>\n        <item quantity=\"other\">%d selecionados</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Nenhuma subscrição selecionada</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Selecionar subscrições</string>\n    <string name=\"feed_processing_message\">A processar…</string>\n    <string name=\"feed_notification_loading\">A carregar…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Não carregado: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Última atualização: %s</string>\n    <string name=\"feed_groups_header_title\">Grupos de canais</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dia</item>\n        <item quantity=\"many\">%d dias</item>\n        <item quantity=\"other\">%d dias</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d hora</item>\n        <item quantity=\"many\">%d horas</item>\n        <item quantity=\"other\">%d horas</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuto</item>\n        <item quantity=\"many\">%d minutos</item>\n        <item quantity=\"other\">%d minutos</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d segundo</item>\n        <item quantity=\"many\">%d segundos</item>\n        <item quantity=\"other\">%d segundos</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Devido às restrições de ExoPlayer, a duração da pesquisa foi definida para %d segundos</string>\n    <string name=\"unmute\">Ativar som</string>\n    <string name=\"mute\">Sem som</string>\n    <string name=\"videos_string\">Vídeos</string>\n    <string name=\"content_not_supported\">Este conteúdo ainda não é suportado pelo NewPipe. \n\\n \n\\nEsperamos que seja suportado numa versão futura.</string>\n    <string name=\"infinite_videos\">∞ vídeos</string>\n    <string name=\"more_than_100_videos\">+100 vídeos</string>\n    <string name=\"artists\">Artistas</string>\n    <string name=\"albums\">Álbuns</string>\n    <string name=\"songs\">Músicas</string>\n    <string name=\"restricted_video\">Este vídeo está restringido a adultos.\n\\n\n\\nPara o poder ver, tem que ativar \\\"%1$s\\\" nas definições.</string>\n    <string name=\"remove_watched_popup_warning\">Os vídeos que tenham sido vistos antes e após serem adicionados à lista de reprodução serão removidos. \\nTem a certeza?</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Sim e também os vídeos parcialmente vistos</string>\n    <string name=\"remove_watched_popup_title\">Remover transmissões vistas?</string>\n    <string name=\"remove_watched\">Remover visualizados</string>\n    <string name=\"show_original_time_ago_summary\">Os textos originais dos serviços serão visíveis nos itens do vídeo</string>\n    <string name=\"show_original_time_ago_title\">Mostrar antiguidade nos itens</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Ativar \\\"Modo restrito\\\" do YouTube</string>\n    <string name=\"video_detail_by\">Por %s</string>\n    <string name=\"channel_created_by\">Criado por %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Miniatura do avatar do canal</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Mostrar apenas subscrições não agrupadas</string>\n    <string name=\"playlist_page_summary\">Página da lista de reprodução</string>\n    <string name=\"no_playlist_bookmarked_yet\">Ainda não há listas de reprodução favoritas</string>\n    <string name=\"select_a_playlist\">Selecione uma lista de reprodução</string>\n    <string name=\"error_report_open_github_notice\">Verifique se o seu erro já foi reportado. A criação de erros em duplicado tira-nos tempo que pode ser utilizado para corrigir os erros.</string>\n    <string name=\"error_report_open_issue_button_text\">Reportar no GitHub</string>\n    <string name=\"copy_for_github\">Copiar relatório formatado</string>\n    <string name=\"search_showing_result_for\">A mostrar resultados para: %s</string>\n    <string name=\"notification_action_3_title\">Quarto botão de ação</string>\n    <string name=\"notification_action_2_title\">Terceiro botão de ação</string>\n    <string name=\"notification_action_1_title\">Segundo botão de ação</string>\n    <string name=\"notification_action_0_title\">Primeiro botão de ação</string>\n    <string name=\"notification_scale_to_square_image_summary\">Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Cortar miniatura na proporção 1:1</string>\n    <string name=\"autoplay_summary\">Iniciar reprodução automaticamente — %s</string>\n    <string name=\"title_activity_play_queue\">Fila de reprodução</string>\n    <string name=\"never\">Nunca</string>\n    <string name=\"notification_action_buffering\">A carregar</string>\n    <string name=\"clear_queue_confirmation_description\">A fila de reprodução atual será substituída</string>\n    <string name=\"unsupported_url_dialog_message\">URL não reconhecida. Abrir com outra aplicação?</string>\n    <string name=\"auto_queue_toggle\">Colocar na fila automaticamente</string>\n    <string name=\"notification_action_shuffle\">Baralhar</string>\n    <string name=\"wifi_only\">Apenas em Wi-Fi</string>\n    <string name=\"notification_action_nothing\">Nada</string>\n    <string name=\"clear_queue_confirmation_summary\">Mudar de um reprodutor para outro pode substituir a sua fila</string>\n    <string name=\"clear_queue_confirmation_title\">Pedir confirmação antes de limpar a fila</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_actions_at_most_three\">Pode selecionar, no máximo, três ações para mostrar na notificação compacta!</string>\n    <string name=\"notification_action_repeat\">Repetir</string>\n    <string name=\"notification_action_4_title\">Quinto botão de ação</string>\n    <string name=\"show_memory_leaks\">Mostrar \\'leaks\\' de memória</string>\n    <string name=\"enqueued\">Colocado na fila</string>\n    <string name=\"enqueue_stream\">Colocar na fila</string>\n    <string name=\"clear_cookie_summary\">Limpar cookies que NewPipe armazena quando resolve um reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Os cookies reCAPTCHA foram limpos</string>\n    <string name=\"clear_cookie_title\">Limpar cookies reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">O YouTube fornece um \\\"Modo restrito\\\" que oculta conteúdo, potencialmente, destinado a adultos</string>\n    <string name=\"show_age_restricted_content_summary\">Mostrar conteúdo possivelmente impróprio para crianças porque tem um limite de idade (como 18+)</string>\n    <string name=\"notification_colorize_summary\">Personalizar cor da notificação com a cor principal da miniatura (esta opção não está disponível em todos os dispositivos)</string>\n    <string name=\"notification_colorize_title\">Notificação colorida</string>\n    <string name=\"show_thumbnail_summary\">Usar miniatura como fundo do ecrã de bloqueio e nas notificações</string>\n    <string name=\"show_thumbnail_title\">Mostrar miniatura</string>\n    <string name=\"msg_calculating_hash\">A calcular \\'hash\\'</string>\n    <string name=\"hash_channel_description\">Notificar sobre o progresso das \\'hash\\' dos vídeos</string>\n    <string name=\"hash_channel_name\">Notificação \\'hash\\' do vídeo</string>\n    <string name=\"recent\">Recentes</string>\n    <string name=\"show_meta_info_summary\">Desative para ocultar as caixas com informações adicionais acerca do criador, do conteúdo ou de um pedido de pesquisa</string>\n    <string name=\"show_meta_info_title\">Mostrar meta-informação</string>\n    <string name=\"no_app_to_open_intent\">Não possui qualquer aplicação para abrir este ficheiro</string>\n    <string name=\"chapters\">Capítulos</string>\n    <string name=\"description_tab_description\">Descrição</string>\n    <string name=\"related_items_tab_description\">Itens relacionados</string>\n    <string name=\"comments_tab_description\">Comentários</string>\n    <string name=\"show_description_summary\">Desative para ocultar a descrição do vídeo e informações adicionais</string>\n    <string name=\"show_description_title\">Mostrar descrição</string>\n    <string name=\"open_with\">Abrir com</string>\n    <string name=\"crash_the_app\">Terminar aplicação</string>\n    <string name=\"restricted_video_no_stream\">Este vídeo tem uma restrição de idade.\n\\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.</string>\n    <string name=\"paid_content\">Este conteúdo só está disponível para utilizadores pagantes e não pode ser reproduzido ou descarregado pelo NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Este vídeo só está disponível para os membros do YouTube Music Premium e não pode ser reproduzido ou descarregado pelo NewPipe.</string>\n    <string name=\"private_content\">Este conteúdo é privado e não pode ser reproduzido ou descarregado pelo NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Esta é uma faixa SoundCloud Go+ e, pelo menos no seu país, não pode ser reproduzida ou descarregada por NewPipe.</string>\n    <string name=\"georestricted_content\">Este conteúdo não está disponível no seu país.</string>\n    <string name=\"radio\">Rádio</string>\n    <string name=\"featured\">Destaques</string>\n    <string name=\"recaptcha_solve\">Resolver</string>\n    <string name=\"night_theme_summary\">Escolha o seu tema escuro favorito — %s</string>\n    <string name=\"download_has_started\">Descarga iniciada</string>\n    <string name=\"select_night_theme_toast\">Pode escolher o seu tema escuro favorito abaixo</string>\n    <string name=\"auto_device_theme_title\">Automático (Tema do dispositivo)</string>\n    <string name=\"night_theme_title\">Tema escuro</string>\n    <string name=\"show_channel_details\">Mostrar detalhes do canal</string>\n    <string name=\"disable_media_tunneling_summary\">Desative o túnel multimédia se tiver um ecrã preto ou paragens na reprodução de vídeos.</string>\n    <string name=\"disable_media_tunneling_title\">Desativar túnel multimédia</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Sempre que descarregar um ficheiro, terá que indicar o local para o guardar</string>\n    <string name=\"no_dir_yet\">Ainda não definiu uma pasta para as descargas. Escolha agora a pasta a utilizar</string>\n    <string name=\"account_terminated\">Conta encerrada</string>\n    <string name=\"feed_load_error_fast_unknown\">O modo de fonte rápida não fornece mais informações sobre isto.</string>\n    <string name=\"feed_load_error_terminated\">A conta do autor foi encerrada.\n\\nNewPipe não será capaz de carregar esta fonte.\n\\nDeseja cancelar a subscrição deste canal?</string>\n    <string name=\"feed_load_error_account_info\">Não foi possível carregar a fonte para \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Erro ao carregar a fonte</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">A partir do Android 10, apenas é compatível o \\'Storage Access Framework\\'</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Pré-visualização da miniatura na barra de pesquisa</string>\n    <string name=\"mark_as_watched\">Marcar como visto</string>\n    <string name=\"off\">Desligado</string>\n    <string name=\"on\">Ligado</string>\n    <string name=\"tablet_mode_title\">Modo tablet</string>\n    <string name=\"open_website_license\">Abrir site</string>\n    <string name=\"detail_heart_img_view_description\">Adorado pelo criador</string>\n    <string name=\"metadata_privacy_internal\">Interno</string>\n    <string name=\"metadata_privacy_private\">Privado</string>\n    <string name=\"metadata_privacy_unlisted\">Não listado</string>\n    <string name=\"metadata_privacy_public\">Público</string>\n    <string name=\"metadata_host\">Servidor</string>\n    <string name=\"metadata_support\">Suporte</string>\n    <string name=\"metadata_language\">Idioma</string>\n    <string name=\"metadata_age_limit\">Limite de idade</string>\n    <string name=\"metadata_privacy\">Privacidade</string>\n    <string name=\"metadata_licence\">Licença</string>\n    <string name=\"metadata_tags\">Etiquetas</string>\n    <string name=\"metadata_category\">Categoria</string>\n    <string name=\"description_select_disable\">Desativar seleção de texto na descrição</string>\n    <string name=\"description_select_enable\">Ativar seleção de texto na descrição</string>\n    <string name=\"description_select_note\">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.</string>\n    <string name=\"dont_show\">Não mostrar</string>\n    <string name=\"low_quality_smaller\">Baixa qualidade (menor)</string>\n    <string name=\"high_quality_larger\">Alta qualidade (maior)</string>\n    <string name=\"comments_are_disabled\">Os comentários estão desativados</string>\n    <string name=\"remote_search_suggestions\">Sugestões de pesquisa remotas</string>\n    <string name=\"local_search_suggestions\">Sugestões de pesquisa locais</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s descarga eliminada</item>\n        <item quantity=\"many\">%1$s descargas eliminadas</item>\n        <item quantity=\"other\">%1$s descargas eliminadas</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">%s descarga concluída</item>\n        <item quantity=\"many\">%s descargas concluídas</item>\n        <item quantity=\"other\">%s descargas concluídas</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Deslize nos itens para os remover</string>\n    <string name=\"start_main_player_fullscreen_summary\">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.</string>\n    <string name=\"start_main_player_fullscreen_title\">Iniciar reprodutor principal em ecrã completo</string>\n    <string name=\"enqueued_next\">Seguinte colocado na fila</string>\n    <string name=\"enqueue_next_stream\">Colocar seguinte na fila</string>\n    <string name=\"processing_may_take_a_moment\">A processar… Pode levar algum tempo</string>\n    <string name=\"check_for_updates\">Procurar atualizações</string>\n    <string name=\"manual_update_description\">Verificar manualmente se existe uma nova versão</string>\n    <string name=\"checking_updates_toast\">A procurar atualizações…</string>\n    <string name=\"feed_new_items\">Novos itens</string>\n    <string name=\"crash_the_player\">Terminou o reprodutor</string>\n    <string name=\"show_crash_the_player_title\">Mostrar \\\"Travar o reprodutor\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Mostra uma opção para terminar o reprodutor</string>\n    <string name=\"error_report_channel_name\">Notificação para relatórios de erro</string>\n    <string name=\"error_report_channel_description\">Notificações para reportar erros</string>\n    <string name=\"error_report_notification_title\">NewPipe encontrou um erro, toque para reportar</string>\n    <string name=\"error_report_notification_toast\">Ocorreu um erro, veja a notificação</string>\n    <string name=\"show_error_snackbar\">Mostrar uma barra de erros</string>\n    <string name=\"create_error_notification\">Criar uma notificação de erro</string>\n    <string name=\"no_appropriate_file_manager_message\">Não foi encontrado um gestor de ficheiros apropriado para esta ação.\n\\nPor favor, instale um gestor de ficheiros ou tente desativar \\'%s\\' nas definições das descargas</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Nenhum gestor de ficheiros apropriado foi encontrado para esta ação.\n\\nPor favor, instale um gestor de ficheiros compatível com SAF (Storage Access Framework)</string>\n    <string name=\"detail_pinned_comment_view_description\">Comentário afixado</string>\n    <string name=\"leak_canary_not_available\">LeakCanary não disponível</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Predefinição ExoPlayer</string>\n    <string name=\"settings_category_player_notification_title\">Notificação do reprodutor</string>\n    <string name=\"settings_category_player_notification_summary\">Configurar notificação da reprodução do vídeo atual</string>\n    <string name=\"notifications\">Notificações</string>\n    <string name=\"loading_stream_details\">A carregar detalhes do vídeo…</string>\n    <string name=\"check_new_streams\">Procurar novos vídeos</string>\n    <string name=\"enable_streams_notifications_title\">Notificações sobre novos vídeos</string>\n    <string name=\"enable_streams_notifications_summary\">Notificar sobre novos vídeos nas subscrições</string>\n    <string name=\"streams_notifications_interval_title\">Frequência da verificação</string>\n    <string name=\"streams_notifications_network_title\">Requer uma ligação de rede</string>\n    <string name=\"any_network\">Qualquer rede</string>\n    <string name=\"you_successfully_subscribed\">É agora um subscritor deste canal</string>\n    <string name=\"toggle_all\">Alternar tudo</string>\n    <string name=\"delete_downloaded_files_confirm\">Eliminar todos os ficheiros descarregados?</string>\n    <string name=\"streams_notification_channel_name\">Novos vídeos</string>\n    <string name=\"streams_notification_channel_description\">Notificações sobre novos vídeos nas subscrições</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s novo vídeo</item>\n        <item quantity=\"many\">%s novos vídeos</item>\n        <item quantity=\"other\">%s novos vídeos</item>\n    </plurals>\n    <string name=\"get_notified\">Obter notificação</string>\n    <string name=\"notifications_disabled\">As notificações estão desativadas</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"percent\">Percentual</string>\n    <string name=\"semitone\">Semi-tom</string>\n    <string name=\"streams_not_yet_supported_removed\">Os vídeos não suportados para descarga não são mostrados</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Não estão disponíveis reproduções de áudio para reprodutores externos</string>\n    <string name=\"no_video_streams_available_for_external_players\">Não estão disponíveis reproduções de vídeo para reprodutores externos</string>\n    <string name=\"select_quality_external_players\">Selecione a qualidade para reprodutores externos</string>\n    <string name=\"unknown_format\">Formato desconhecido</string>\n    <string name=\"unknown_quality\">Qualidade desconhecida</string>\n    <string name=\"selected_stream_external_player_not_supported\">O vídeo selecionado não é suportado por reprodutores externos</string>\n    <string name=\"progressive_load_interval_title\">Tamanho do intervalo de carregamento da reprodução</string>\n    <string name=\"faq_title\">Perguntas frequentes</string>\n    <string name=\"faq\">Ver no site</string>\n    <string name=\"faq_description\">Se está a ter problemas a usar a aplicação, veja estas respostas para as perguntas mais comuns!</string>\n    <string name=\"sort\">Ordem</string>\n    <string name=\"fast_mode\">Modo rápido</string>\n    <string name=\"import_subscriptions_hint\">Importe ou exporte subscrições no menu 3 pontos</string>\n    <string name=\"app_update_unavailable_toast\">Já está a executar a versão mais recente do NewPipe</string>\n    <string name=\"app_update_available_notification_text\">Toque para descarregar %s</string>\n    <string name=\"night_theme_available\">Esta opção só está disponível se estiver selecionado %s para o tema</string>\n    <string name=\"unset_playlist_thumbnail\">Desativar miniatura permanentemente</string>\n    <string name=\"msg_failed_to_copy\">Não foi possível copiar para a área de transferência</string>\n    <string name=\"card\">Cartão</string>\n    <string name=\"duplicate_in_playlist\">As listas de reprodução acinzentadas já contêm este item.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplicado adicionado %d vez(es)</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorar botões físicos</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Útil, por exemplo, se estiver a utilizar auscultadores com botões físicos danificados</string>\n    <string name=\"remove_duplicates\">Remover duplicados</string>\n    <string name=\"remove_duplicates_title\">Remover duplicados\\?</string>\n    <string name=\"feed_show_hide_streams\">Mostrar/ocultar vídeos</string>\n    <string name=\"feed_show_upcoming\">Brevemente</string>\n    <string name=\"remove_duplicates_message\">Deseja remover todos os vídeos duplicados desta lista de reprodução?</string>\n    <string name=\"feed_show_watched\">Completamente visto</string>\n    <string name=\"feed_hide_streams_title\">Mostrar vídeos seguintes</string>\n    <string name=\"feed_show_partially_watched\">Parcialmente visto</string>\n    <string name=\"left_gesture_control_title\">Ação para o gesto à esquerda</string>\n    <string name=\"right_gesture_control_title\">Ação para o gesto à direita</string>\n    <string name=\"brightness\">Brilho</string>\n    <string name=\"volume\">Volume</string>\n    <string name=\"none\">Nada</string>\n    <string name=\"left_gesture_control_summary\">Escolha o gesto para a parte esquerda do ecrã</string>\n    <string name=\"right_gesture_control_summary\">Escolha o gesto para a parte direita do ecrã</string>\n    <string name=\"prefer_descriptive_audio_summary\">Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\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</string>\n    <string name=\"progressive_load_interval_summary\">Altera o tamanho do intervalo de carregamento progressivo (atualmente %s). Um valor menor pode acelerar o carregamento inicial do conteúdo</string>\n    <string name=\"prefer_original_audio_title\">Dar preferência ao áudio original</string>\n    <string name=\"prefer_original_audio_summary\">Seleciona o áudio original, independentemente do idioma</string>\n    <string name=\"prefer_descriptive_audio_title\">Dar preferência ao áudio descritivo</string>\n    <string name=\"play_queue_audio_track\">Áudio: %s</string>\n    <string name=\"audio_track\">Faixa de áudio</string>\n    <string name=\"audio_track_present_in_video\">Já deve existir uma faixa de áudio neste vídeo</string>\n    <string name=\"select_audio_track_external_players\">Selecione a faixa de áudio para reprodutores externos</string>\n    <string name=\"unknown_audio_track\">Desconhecida</string>\n    <string name=\"settings_category_exoplayer_title\">Definições ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">Gere algumas definições ExoPlayer. Tem que reiniciar o reprodutor para aplicar as alterações</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Utilizar descodificador se recurso do ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Usar sempre a configuração de saída alternativa de vídeo do ExoPlayer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"audio_track_type_dubbed\">dobrado</string>\n    <string name=\"audio_track_type_descriptive\">descritivo</string>\n    <string name=\"main_tabs_position_summary\">Mova o seletor do separador principal para a parte inferior</string>\n    <string name=\"main_tabs_position_title\">Posição dos separadores principais</string>\n    <string name=\"disable_media_tunneling_automatic_info\">O túnel multimédia foi desativado no seu dispositivo porque o seu dispositivo não tem suporte à opção.</string>\n    <string name=\"no_live_streams\">Nenhum vídeo em direto</string>\n    <string name=\"no_streams\">Nenhum vídeo</string>\n    <string name=\"loading_metadata_title\">A carregar metadados…</string>\n    <string name=\"feed_fetch_channel_tabs\">Obter separadores de canais</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Separadores a obter ao atualizar a fonte. Esta opção não tem efeito se um canal for atualizado utilizando o modo rápido.</string>\n    <string name=\"image_quality_title\">Qualidade da imagem</string>\n    <string name=\"channel_tab_videos\">Vídeos</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Subscritores</string>\n    <string name=\"show_channel_tabs_summary\">Os separadores a mostrar na página Canal</string>\n    <string name=\"share_playlist_with_list\">Partilhar URL</string>\n    <string name=\"share_playlist_with_titles\">Partilhar com título</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_channel_tabs\">Separadores do canal</string>\n    <string name=\"channel_tab_shorts\">Curtos</string>\n    <string name=\"toggle_screen_orientation\">Alternar orientação do ecrã</string>\n    <string name=\"image_quality_low\">Baixa qualidade</string>\n    <string name=\"toggle_fullscreen\">Alternar ecrã completo</string>\n    <string name=\"metadata_avatars\">Avatars</string>\n    <string name=\"next_stream\">Vídeo seguinte</string>\n    <string name=\"metadata_subchannel_avatars\">Avatar de subcanais</string>\n    <string name=\"open_play_queue\">Abrir fila de reprodução</string>\n    <string name=\"image_quality_none\">Não carregar imagens</string>\n    <string name=\"image_quality_high\">Alta qualidade</string>\n    <string name=\"channel_tab_about\">Sobre</string>\n    <string name=\"share_playlist\">Partilhar lista de reprodução</string>\n    <string name=\"forward\">Avançar</string>\n    <string name=\"channel_tab_albums\">Álbuns</string>\n    <string name=\"rewind\">Recuar</string>\n    <string name=\"replay\">Repetição</string>\n    <string name=\"image_quality_medium\">Média qualidade</string>\n    <string name=\"metadata_uploader_avatars\">Avatar dos publicadores</string>\n    <string name=\"metadata_banners\">Banners</string>\n    <string name=\"channel_tab_playlists\">Listas de reprodução</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"play\">Reproduzir</string>\n    <string name=\"more_options\">Mais opções</string>\n    <string name=\"metadata_thumbnails\">Miniaturas</string>\n    <string name=\"channel_tab_tracks\">Faixas</string>\n    <string name=\"duration\">Duração</string>\n    <string name=\"channel_tab_channels\">Canais</string>\n    <string name=\"previous_stream\">Vídeo anterior</string>\n    <string name=\"channel_tab_livestreams\">Direto</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"show_more\">Mostrar mais</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s resposta</item>\n        <item quantity=\"many\">%s respostas</item>\n        <item quantity=\"other\">%s respostas</item>\n    </plurals>\n    <string name=\"show_less\">Mostrar menos</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"error_insufficient_storage\">Não há espaço suficiente no dispositivo</string>\n    <string name=\"yes\">Sim</string>\n    <string name=\"no\">Não</string>\n    <string name=\"reset_settings_summary\">Repor valores originais de todas as definições</string>\n    <string name=\"settings_category_backup_restore_title\">Cópia de segurança e restauro</string>\n    <string name=\"reset_settings_title\">Repor definições</string>\n    <string name=\"reset_all_settings\">A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará a aplicação.\n\\n\n\\nTem certeza que deseja continuar?</string>\n    <string name=\"auto_update_check_description\">O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis.\n\\nDeseja ativar essa opção?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">secundário</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Partilhar como lista de reprodução temporária do YouTube</string>\n    <string name=\"tab_bookmarks_short\">Listas de reprodução</string>\n    <string name=\"select_a_feed_group\">Selecione um grupo de feeds</string>\n    <string name=\"no_feed_group_created_yet\">Ainda nenhum grupo de feeds criado</string>\n    <string name=\"feed_group_page_summary\">Página do grupo do canal</string>\n    <string name=\"search_with_service_name\">Pesquisar %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Pesquisar %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Gostos</string>\n    <string name=\"migration_info_6_7_title\">Página Top 50 do SoundCloud removida</string>\n    <string name=\"migration_info_6_7_message\">O SoundCloud descontinuou os gráficos originais do Top 50. A guia correspondente foi removida da sua página principal.</string>\n    <string name=\"migration_info_7_8_title\">Tendência combinada do YouTube removida</string>\n    <string name=\"migration_info_7_8_message\">O YouTube descontinuou a página de tendência combinada a partir de 21 de julho de 2025. O NewPipe substituiu a página de tendência predefinida com as streams ao vivo de tendência.\\n\\nTambém pode escolher páginas de tendência diferentes em \\\"Definições &gt; Conteúdo &gt; Conteúdo da página principal\\\".</string>\n    <string name=\"trending_gaming\">Tendências de jogos</string>\n    <string name=\"trending_podcasts\">Tendências de podcasts</string>\n    <string name=\"trending_movies\">Tendências de filmes e shows</string>\n    <string name=\"trending_music\">Tendências de música</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"permission_display_over_apps_message\">Para usar o reprodutor pop-up, escolhe %1$s no menu seguinte de configurações do Android e ative %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">“Permitir exibição sobre outras apps”</string>\n    <string name=\"delete_file\">Apagar ficheiro</string>\n    <string name=\"delete_entry\">Apagar entrada</string>\n    <string name=\"entry_deleted\">Entrada apagada</string>\n    <string name=\"account_terminated_service_provides_reason\">Conta terminada\\n\\n%1$s fornece esta razão: %2$s</string>\n    <string name=\"player_http_invalid_status\">Erro HTTP %1$s recebido do servidor ao reproduzir</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s recusou fornecer dados, pedindo por um login para confirmar que o solicitante não é um bot.\\n\\nO seu IP pode ter sido temporariamente banido por %1$s, pode esperar algum tempo ou mudar para um IP diferente (por exemplo, a ligar / desligar uma VPN, ou a alternar de Wi-Fi para dados móveis).</string>\n    <string name=\"unsupported_content_in_country\">Este conteúdo não está disponível para o país de conteúdo atualmente selecionado.\\n\\nAltere a sua seleção de \\\"Configurações &gt; Conteúdo &gt; País predefinido de conteúdo\\\".</string>\n    <string name=\"player_http_403\">Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado pela URL de streaming expirado ou IP banido</string>\n    <string name=\"youtube_player_http_403\">Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um bloqueio de IP ou problemas de desofuscação da URL de streaming</string>\n    <string name=\"kao_dialog_warning\">Em agosto de 2025, o Google anunciou que, a partir de setembro de 2026, a instalação de apps exigirá a verificação do programador para todas as apps Android em dispositivos certificados, incluindo aqueles instalados fora da Play Store. Como os programadores do NewPipe não concordam com este requisito, o NewPipe já não funcionará em dispositivos Android certificados após essa data.</string>\n    <string name=\"kao_dialog_more_info\">Detalhes</string>\n    <string name=\"kao_solution\">Solução</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-pt-rBR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"audio\">Áudio</string>\n    <string name=\"your_comment\">Seu comentário (em inglês):</string>\n    <string name=\"what_happened_headline\">O que aconteceu:</string>\n    <string name=\"what_device_headline\">Informação:</string>\n    <string name=\"video\">Vídeo</string>\n    <string name=\"black_theme_title\">Preto (AMOLED)</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"checksum\">Checksum</string>\n    <string name=\"content\">Conteúdo</string>\n    <string name=\"content_not_available\">Conteúdo indisponível</string>\n    <string name=\"could_not_load_thumbnails\">Não foi possível carregar todas as miniaturas</string>\n    <string name=\"dark_theme_title\">Escuro</string>\n    <string name=\"default_audio_format_title\">Formato de áudio padrão</string>\n    <string name=\"default_resolution_title\">Resolução padrão</string>\n    <string name=\"delete\">Excluir</string>\n    <string name=\"detail_dislikes_img_view_description\">Não gostei</string>\n    <string name=\"detail_likes_img_view_description\">Curtidas</string>\n    <string name=\"download\">Download</string>\n    <string name=\"download_dialog_title\">Download</string>\n    <string name=\"error_details_headline\">Detalhes:</string>\n    <string name=\"error_report_button_text\">Relatar por e-mail</string>\n    <string name=\"error_report_title\">Relatório de erro</string>\n    <string name=\"error_snackbar_action\">Relatório</string>\n    <string name=\"error_snackbar_message\">Desculpe, algo deu errado.</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"general_error\">Erro</string>\n    <string name=\"install\">Instalar</string>\n    <string name=\"light_theme_title\">Claro</string>\n    <string name=\"msg_error\">Erro</string>\n    <string name=\"msg_copied\">Copiado para a área de transferência</string>\n    <string name=\"msg_name\">Nome do arquivo</string>\n    <string name=\"msg_running_detail\">Toque para mais detalhes</string>\n    <string name=\"msg_running\">O NewPipe está baixando</string>\n    <string name=\"msg_wait\">Por favor, espere…</string>\n    <string name=\"network_error\">Erro de rede</string>\n    <string name=\"open_in_browser\">Abrir no navegador</string>\n    <string name=\"pause\">Pausar</string>\n    <string name=\"title_activity_recaptcha\">Desafio reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Desafio reCAPTCHA solicitado</string>\n    <string name=\"retry\">Tentar novamente</string>\n    <string name=\"content_language_title\">Idioma padrão do conteúdo</string>\n    <string name=\"settings\">Configurações</string>\n    <string name=\"settings_category_appearance_title\">Aparência</string>\n    <string name=\"settings_category_video_audio_title\">Vídeo e áudio</string>\n    <string name=\"share\">Compartilhar</string>\n    <string name=\"share_dialog_title\">Compartilhar com</string>\n    <string name=\"show_age_restricted_content_title\">Mostrar conteúdo com restrição de idade</string>\n    <string name=\"show_next_and_similar_title\">Mostrar \\'Próximo\\' e \\'Similares\\'</string>\n    <string name=\"sorry_string\">Desculpe, isto não devia ter acontecido.</string>\n    <string name=\"start\">Iniciar</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"upload_date_text\">Publicado em  %1$s</string>\n    <string name=\"unsupported_url\">URL não suportado</string>\n    <string name=\"duration_live\">Ao vivo</string>\n    <string name=\"downloads\">Downloads</string>\n    <string name=\"downloads_title\">Downloads</string>\n    <string name=\"did_you_mean\">Você quis dizer \\\"%1$s\\\"\\?</string>\n    <string name=\"app_ui_crash\">O aplicativo travou</string>\n    <string name=\"background_player_playing_toast\">Reproduzindo em segundo plano</string>\n    <string name=\"could_not_setup_download_menu\">O menu de download não pôde ser configurado</string>\n    <string name=\"detail_thumbnail_view_description\">Reproduzir vídeo, duração:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Foto de perfil do autor</string>\n    <string name=\"download_path_audio_dialog_title\">Escolha a pasta de download para arquivos de áudio</string>\n    <string name=\"download_path_audio_summary\">Áudios baixados são salvos aqui</string>\n    <string name=\"download_path_audio_title\">Pasta para áudios baixados</string>\n    <string name=\"download_path_dialog_title\">Escolha a pasta de download para arquivos de vídeo</string>\n    <string name=\"download_path_summary\">Vídeos baixados são salvos aqui</string>\n    <string name=\"download_path_title\">Pasta para vídeos baixados</string>\n    <string name=\"kore_not_found\">Instalar Kore?</string>\n    <string name=\"main_bg_subtitle\">Toque no ícone de lupa para iniciar sua busca.</string>\n    <string name=\"msg_threads\">Processos</string>\n    <string name=\"no_available_dir\">Por favor, defina uma pasta de download depois nas configurações</string>\n    <string name=\"no_player_found\">O player de video não foi encontrado, mas você pode instalar o VLC. Deseja fazer isso?</string>\n    <string name=\"parsing_error\">O site não pôde ser analisado</string>\n    <string name=\"play_audio\">Áudio</string>\n    <string name=\"play_with_kodi_title\">Reproduzir no Kodi</string>\n    <string name=\"search\">Buscar</string>\n    <string name=\"show_play_with_kodi_summary\">Mostrar opção para reproduzir o vídeo no Kodi</string>\n    <string name=\"use_external_audio_player_title\">Usar player de áudio externo</string>\n    <string name=\"use_external_video_player_title\">Usar um player de vídeo alternativo</string>\n    <string name=\"show_play_with_kodi_title\">Mostrar opção \\\"Reproduzir no Kodi\\\"</string>\n    <string name=\"info_labels\">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:</string>\n    <string name=\"open_in_popup_mode\">Reproduzir no modo flutuante</string>\n    <string name=\"default_popup_resolution_title\">Resolução padrão do Popup</string>\n    <string name=\"show_higher_resolutions_title\">Mostrar resoluções mais altas</string>\n    <string name=\"show_higher_resolutions_summary\">Apenas alguns dispositivos suportam vídeos em 2K/4K</string>\n    <string name=\"default_video_format_title\">Formato de vídeo padrão</string>\n    <string name=\"popup_playing_toast\">Reproduzindo em modo Popup</string>\n    <string name=\"all\">Todos</string>\n    <string name=\"disabled\">Desativado</string>\n    <string name=\"msg_popup_permission\">Essa permissão é necessária\n\\npara abrir em modo Popup</string>\n    <string name=\"clear\">Limpar</string>\n    <string name=\"controls_popup_title\">Popup</string>\n    <string name=\"controls_background_title\">Segundo plano</string>\n    <string name=\"popup_remember_size_pos_title\">Lembrar propriedades do Popup</string>\n    <string name=\"popup_remember_size_pos_summary\">Lembrar último tamanho e posição do Popup</string>\n    <string name=\"use_external_video_player_summary\">Atenção: o áudio pode não funcionar em certas resoluções</string>\n    <string name=\"show_search_suggestions_title\">Sugestões de busca</string>\n    <string name=\"show_search_suggestions_summary\">Escolha as sugestões a serem exibidas enquanto estiver buscando</string>\n    <string name=\"best_resolution\">Melhor resolução</string>\n    <string name=\"title_licenses\">Licenças de Terceiros</string>\n    <string name=\"tab_about\">Sobre &amp; FAQ</string>\n    <string name=\"tab_licenses\">Licenças</string>\n    <string name=\"app_description\">Transmissão leve e livre no Android.</string>\n    <string name=\"view_on_github\">Ver no GitHub</string>\n    <string name=\"app_license_title\">Licença do NewPipe</string>\n    <string name=\"contribution_encouragement\">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!</string>\n    <string name=\"read_full_license\">Ver licença</string>\n    <string name=\"contribution_title\">Colaborar</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s %2$s protegido pela licença %3$s</string>\n    <string name=\"title_activity_about\">Sobre o NewPipe</string>\n    <string name=\"settings_category_downloads_title\">Download</string>\n    <string name=\"settings_file_charset_title\">Caracteres permitidos em nome de arquivos</string>\n    <string name=\"settings_file_replacement_character_summary\">Os caracteres inválidos são substituídos por este valor</string>\n    <string name=\"settings_file_replacement_character_title\">Caractere de substituição</string>\n    <string name=\"charset_letters_and_digits\">Letras e dígitos</string>\n    <string name=\"charset_most_special_characters\">Caracteres especiais</string>\n    <string name=\"subscribe_button_title\">Inscrever-se</string>\n    <string name=\"subscribed_button_title\">Inscrito</string>\n    <string name=\"channel_unsubscribed\">Inscrição cancelada</string>\n    <string name=\"subscription_change_failed\">Não foi possível alterar a inscrição</string>\n    <string name=\"subscription_update_failed\">Não foi possível atualizar a inscrição</string>\n    <string name=\"tab_subscriptions\">Inscrições</string>\n    <string name=\"fragment_feed_title\">Novidades</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Continuar reprodução</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Continuar a reprodução após interrupções (por exemplo, chamadas telefônicas)</string>\n    <string name=\"enable_search_history_title\">Histórico de busca</string>\n    <string name=\"enable_search_history_summary\">Armazena o histórico de busca localmente</string>\n    <string name=\"enable_watch_history_title\">Histórico de reprodução</string>\n    <string name=\"enable_watch_history_summary\">Mantenha o controle dos vídeos assistidos</string>\n    <string name=\"title_activity_history\">Histórico</string>\n    <string name=\"action_history\">Histórico</string>\n    <string name=\"notification_channel_name\">Notificação do NewPipe</string>\n    <string name=\"notification_channel_description\">Notificações para o player NewPipe</string>\n    <string name=\"settings_category_player_behavior_title\">Comportamento</string>\n    <string name=\"settings_category_history_title\">Histórico e cache</string>\n    <string name=\"undo\">Desfazer</string>\n    <string name=\"search_no_results\">Sem resultados</string>\n    <string name=\"no_subscribers\">Nenhum inscrito</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s inscrito</item>\n        <item quantity=\"many\">%s inscritos</item>\n        <item quantity=\"other\">%s inscritos</item>\n    </plurals>\n    <string name=\"no_views\">Sem visualizações</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s visualização</item>\n        <item quantity=\"many\">%s visualizações</item>\n        <item quantity=\"other\">%s visualizações</item>\n    </plurals>\n    <string name=\"no_videos\">Nenhum vídeo</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s vídeo</item>\n        <item quantity=\"many\">%s vídeos</item>\n        <item quantity=\"other\">%s vídeos</item>\n    </plurals>\n    <string name=\"settings_category_player_title\">Player</string>\n    <string name=\"empty_list_subtitle\">Nada aqui além de grilos</string>\n    <string name=\"delete_item_search_history\">Deseja excluir este item do histórico de busca\\?</string>\n    <string name=\"main_page_content\">Conteúdo da tela inicial</string>\n    <string name=\"blank_page_summary\">Página em branco</string>\n    <string name=\"kiosk_page_summary\">Página do Kiosk</string>\n    <string name=\"channel_page_summary\">Página do canal</string>\n    <string name=\"select_a_channel\">Selecione um canal</string>\n    <string name=\"no_channel_subscribed_yet\">Nenhuma inscrição ainda</string>\n    <string name=\"select_a_kiosk\">Selecione um Kiosk</string>\n    <string name=\"trending\">Em Alta</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Novos e tendências</string>\n    <string name=\"show_hold_to_append_title\">Mostrar dica \\\"Segure para pôr na fila\\\"</string>\n    <string name=\"show_hold_to_append_summary\">Mostra dica ao tocar no botão segundo plano ou popup em \\\"Detalhes:\\\" do vídeo</string>\n    <string name=\"play_all\">Reproduzir tudo</string>\n    <string name=\"player_stream_failure\">Não é possível reproduzir este vídeo</string>\n    <string name=\"player_unrecoverable_failure\">Ocorreu um erro irrecuperável na reprodução</string>\n    <string name=\"player_recoverable_failure\">Se recuperando de um erro durante a reprodução</string>\n    <string name=\"play_queue_remove\">Remover</string>\n    <string name=\"play_queue_stream_detail\">Detalhes</string>\n    <string name=\"play_queue_audio_settings\">Configurações de áudio</string>\n    <string name=\"hold_to_append\">Toque longo para pôr na fila</string>\n    <string name=\"unknown_content\">[Desconhecido]</string>\n    <string name=\"start_here_on_background\">Reproduzir em segundo plano</string>\n    <string name=\"start_here_on_popup\">Reproduzir em um Popup</string>\n    <string name=\"donation_title\">Fazer doação</string>\n    <string name=\"donation_encouragement\">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é.</string>\n    <string name=\"give_back\">Retribuir</string>\n    <string name=\"website_title\">Site oficial</string>\n    <string name=\"website_encouragement\">Visite o site do NewPipe para mais informações e novidades.</string>\n    <string name=\"no_player_found_toast\">O player de vídeo não foi encontrado, mas você pode instalar o VLC para tentar reproduzi-lo.</string>\n    <string name=\"default_content_country_title\">País padrão do conteúdo</string>\n    <string name=\"always\">Sempre</string>\n    <string name=\"just_once\">Apenas uma vez</string>\n    <string name=\"switch_to_background\">Mudar para segundo plano</string>\n    <string name=\"switch_to_popup\">Mudar para Popup</string>\n    <string name=\"switch_to_main\">Mudar para principal</string>\n    <string name=\"external_player_unsupported_link_type\">Players externos não suportam estes tipos de URL</string>\n    <string name=\"video_streams_empty\">Nenhuma transmissão de vídeo encontrada</string>\n    <string name=\"audio_streams_empty\">Nenhuma transmissão de áudio encontrada</string>\n    <string name=\"video_player\">Player de vídeo</string>\n    <string name=\"background_player\">Reprodução em segundo plano</string>\n    <string name=\"popup_player\">Reprodução em Popup</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Obtendo informação…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Carregando conteúdo solicitado</string>\n    <string name=\"import_data_title\">Importar base de dados</string>\n    <string name=\"export_data_title\">Exportar base de dados</string>\n    <string name=\"import_data_summary\">Substitui seu histórico atual, inscrições, playlists e configurações (opcional)</string>\n    <string name=\"export_data_summary\">Exporta histórico, inscrições, playlists e configurações</string>\n    <string name=\"export_complete_toast\">Exportado</string>\n    <string name=\"import_complete_toast\">Importado</string>\n    <string name=\"no_valid_zip_file\">Nenhum arquivo ZIP válido</string>\n    <string name=\"could_not_import_all_files\">Aviso: Não foi possível importar todos os arquivos.</string>\n    <string name=\"override_current_data\">Isso irá sobrescrever suas configurações atuais.</string>\n    <string name=\"controls_download_desc\">Salvar arquivo para reprodução sem internet</string>\n    <string name=\"show_info\">Mostrar informação</string>\n    <string name=\"tab_bookmarks\">Playlists favoritas</string>\n    <string name=\"controls_add_to_playlist_title\">Adicionar a</string>\n    <string name=\"detail_drag_description\">Arraste para ordenar</string>\n    <string name=\"create\">Criar</string>\n    <string name=\"dismiss\">Descartar</string>\n    <string name=\"rename\">Renomear</string>\n    <string name=\"title_last_played\">Última reprodução</string>\n    <string name=\"title_most_played\">Mais assistidos</string>\n    <string name=\"always_ask_open_action\">Sempre perguntar</string>\n    <string name=\"create_playlist\">Nova playlist</string>\n    <string name=\"rename_playlist\">Renomear</string>\n    <string name=\"name\">Nome</string>\n    <string name=\"add_to_playlist\">Adicionar à playlist</string>\n    <string name=\"set_as_playlist_thumbnail\">Definir como miniatura da playlist</string>\n    <string name=\"bookmark_playlist\">Salvar como playlist favorita</string>\n    <string name=\"unbookmark_playlist\">Remover dos favoritos</string>\n    <string name=\"delete_playlist_prompt\">Excluir esta playlist?</string>\n    <string name=\"playlist_creation_success\">Playlist criada</string>\n    <string name=\"playlist_add_stream_success\">Adicionado à playlist</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniatura da playlist alterada.</string>\n    <string name=\"caption_none\">Sem legendas</string>\n    <string name=\"resize_fit\">Ajustar</string>\n    <string name=\"resize_fill\">Preencher</string>\n    <string name=\"resize_zoom\">Zoom</string>\n    <string name=\"caption_auto_generated\">Gerado automaticamente</string>\n    <string name=\"enable_leak_canary_summary\">O monitoramento de vazamento de memória pode tornar o aplicativo instável durante o despejo de pilha</string>\n    <string name=\"enable_disposed_exceptions_title\">Reportar erros de out-of-lifecycle</string>\n    <string name=\"enable_disposed_exceptions_summary\">Forçar entrega de relatórios de erros Rx fora de um fragmento ou atividade de lifecycle após o descarte</string>\n    <string name=\"use_inexact_seek_title\">Usar busca de posição rápida (inexata)</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"auto_queue_title\">Enfileirar a próxima transmissão automaticamente</string>\n    <string name=\"auto_queue_summary\">Continua a reprodução da fila (sem repetição) adicionando mais transmissões similares</string>\n    <string name=\"file\">Arquivo</string>\n    <string name=\"invalid_directory\">Essa pasta não existe</string>\n    <string name=\"invalid_source\">Arquivo/fonte do conteúdo não existe</string>\n    <string name=\"invalid_file\">O arquivo não existe ou não há permissão para leitura ou escrita</string>\n    <string name=\"file_name_empty_error\">O nome do arquivo não pode ficar vazio</string>\n    <string name=\"error_occurred_detail\">Ocorreu um erro: %1$s</string>\n    <string name=\"import_title\">Importar</string>\n    <string name=\"import_from\">Importar de</string>\n    <string name=\"export_to\">Exportar para</string>\n    <string name=\"import_ongoing\">Importando…</string>\n    <string name=\"export_ongoing\">Exportando…</string>\n    <string name=\"import_file_title\">Importar arquivo</string>\n    <string name=\"previous_export\">Exportação anterior</string>\n    <string name=\"subscriptions_import_unsuccessful\">Não foi possível importar as inscrições</string>\n    <string name=\"subscriptions_export_unsuccessful\">Não foi possível exportar as inscrições</string>\n    <string name=\"import_youtube_instructions\">Importar inscrições do YouTube em Google Takeout:\n\\n\n\\n1. Acesse este URL: %1$s\n\\n2. Faça login quando solicitado\n\\n3. Clique em \\\"Todos os dados incluídos\\\", depois em \\\"Desmarcar todos\\\", selecione apenas \\\"Inscrições\\\" e clique em \\\"OK\\\"\n\\n4. Clique em \\\"Próxima etapa\\\" e, em seguida, em \\\"Criar exportação\\\"\n\\n5. Clique no botão \\\"Download\\\" quando ele aparecer\n\\n6. Clique em IMPORTAR ARQUIVO abaixo e selecione o arquivo .zip baixado\n\\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</string>\n    <string name=\"import_soundcloud_instructions\">Importar um perfil do SoundCloud digitando o URL ou seu ID:\n\\n\n\\n1. Ative o \\\"Modo desktop (computador)\\\" em um navegador da Web (o site não está disponível para dispositivos móveis)\n\\n2. Acesse este URL: %1$s\n\\n3. Faça login quando solicitado\n\\n4. Copie o URL do perfil para o qual você foi redirecionado.</string>\n    <string name=\"import_soundcloud_instructions_hint\">seuID, soundcloud.com/seuid</string>\n    <string name=\"import_network_expensive_warning\">Tenha em mente que esta operação poderá consumir muitos dados.\n\\n\n\\nVocê deseja continuar\\?</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Cache de imagens removidos</string>\n    <string name=\"metadata_cache_wipe_title\">Remover metadados em cache</string>\n    <string name=\"metadata_cache_wipe_summary\">Remover todos os dados da página web armazenados em cache</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Cache de metadados removidos</string>\n    <string name=\"playback_speed_control\">Controles para velocidade de reprodução</string>\n    <string name=\"playback_tempo\">Velocidade</string>\n    <string name=\"playback_pitch\">Afinação</string>\n    <string name=\"unhook_checkbox\">Desvincular (pode causar distorção)</string>\n    <string name=\"preferred_open_action_settings_title\">Ação preferida ao tocar em \\'Abrir\\'</string>\n    <string name=\"preferred_open_action_settings_summary\">Ação padrão ao abrir conteúdo — %s</string>\n    <string name=\"no_streams_available_download\">Nenhum vídeo disponível para download</string>\n    <string name=\"drawer_open\">Abrir gaveta</string>\n    <string name=\"drawer_close\">Fechar gaveta</string>\n    <string name=\"caption_setting_title\">Legendas</string>\n    <string name=\"caption_setting_description\">Mudar tamanho da legenda e estilos de plano de fundo. Requer reiniciar o aplicativo para ter efeito</string>\n    <string name=\"clear_views_history_title\">Remover histórico de reprodução</string>\n    <string name=\"clear_views_history_summary\">Remove o histórico de vídeos assistidos e as posições de reprodução</string>\n    <string name=\"delete_view_history_alert\">Remover todo o histórico de reprodução?</string>\n    <string name=\"watch_history_deleted\">Histórico de reprodução removido</string>\n    <string name=\"clear_search_history_title\">Remover histórico de buscas</string>\n    <string name=\"clear_search_history_summary\">Remove o histórico de buscas</string>\n    <string name=\"delete_search_history_alert\">Remover todo o histórico de buscas?</string>\n    <string name=\"search_history_deleted\">Histórico de busca removido</string>\n    <string name=\"one_item_deleted\">1 item excluído.</string>\n    <string name=\"app_license\">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.</string>\n    <string name=\"import_settings\">Você também quer importar as configurações?</string>\n    <string name=\"privacy_policy_title\">Política de privacidade do NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">O projeto NewPipe leva sua privacidade muito a sério. Por isso, o aplicativo não coleta nenhum dado sem seu consentimento.\n\\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.</string>\n    <string name=\"read_privacy_policy\">Ver política de privacidade</string>\n    <string name=\"start_accept_privacy_policy\">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.\n\\nVocê deve aceitá-la para nos enviar o relatório de erros.</string>\n    <string name=\"accept\">Aceitar</string>\n    <string name=\"decline\">Recusar</string>\n    <string name=\"limit_data_usage_none_description\">Ilimitado</string>\n    <string name=\"limit_mobile_data_usage_title\">Limitar resolução de vídeos ao usar dados móveis</string>\n    <string name=\"minimize_on_exit_title\">Minimizar ao mudar de aplicativos</string>\n    <string name=\"minimize_on_exit_summary\">Ação ao mudar de aplicativo a partir do player principal - %s</string>\n    <string name=\"minimize_on_exit_none_description\">Nenhum</string>\n    <string name=\"minimize_on_exit_background_description\">Minimizar reprodução para o modo de segundo plano</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimizar reprodução para o modo Popup</string>\n    <string name=\"skip_silence_checkbox\">Avançar durante o silêncio</string>\n    <string name=\"playback_step\">Passo</string>\n    <string name=\"playback_reset\">Redefinir</string>\n    <string name=\"channels\">Canais</string>\n    <string name=\"playlists\">Playlists</string>\n    <string name=\"tracks\">Faixas</string>\n    <string name=\"users\">Usuários</string>\n    <string name=\"unsubscribe\">Cancelar inscrição</string>\n    <string name=\"tab_choose\">Escolha a guia</string>\n    <string name=\"settings_category_debug_title\">Depuração</string>\n    <string name=\"settings_category_updates_title\">Atualizações</string>\n    <string name=\"events\">Eventos</string>\n    <string name=\"file_deleted\">Arquivo excluído</string>\n    <string name=\"app_update_notification_channel_name\">Notificação de atualização do aplicativo</string>\n    <string name=\"app_update_notification_channel_description\">Notificações para novas versões do NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Armazenamento externo indisponível</string>\n    <string name=\"download_to_sdcard_error_message\">Não é possível baixar para o cartão SD externo. Redefinir o local da pasta de download\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Não foi possível carregar as guias salvas, portanto, usamos as guias padrão</string>\n    <string name=\"restore_defaults\">Restaurar configurações</string>\n    <string name=\"restore_defaults_confirmation\">Deseja restaurar os padrões?</string>\n    <string name=\"subscribers_count_not_available\">Número de inscritos indisponível</string>\n    <string name=\"main_page_content_summary\">Quais guias são exibidas na tela inicial</string>\n    <string name=\"conferences\">Conferências</string>\n    <string name=\"updates_setting_title\">Atualizações</string>\n    <string name=\"updates_setting_description\">Notificar quando uma nova versão do aplicativo estiver disponível</string>\n    <string name=\"list_view_mode\">Modo de exibição da lista</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"grid\">Grade</string>\n    <string name=\"auto\">Automático</string>\n    <string name=\"app_update_available_notification_title\">Uma atualização do NewPipe está disponível!</string>\n    <string name=\"missions_header_finished\">Finalizado</string>\n    <string name=\"paused\">pausado</string>\n    <string name=\"queued\">na fila</string>\n    <string name=\"post_processing\">pós-processamento</string>\n    <string name=\"enqueue\">Colocar na fila</string>\n    <string name=\"permission_denied\">Ação negada pelo sistema</string>\n    <string name=\"download_failed\">Download falhou</string>\n    <string name=\"generate_unique_name\">Gerar nome único</string>\n    <string name=\"overwrite\">Sobrescrever</string>\n    <string name=\"overwrite_finished_warning\">Um arquivo baixado com esse nome já existe</string>\n    <string name=\"download_already_running\">Já existe um download em progresso com este nome</string>\n    <string name=\"show_error\">Mostrar erro</string>\n    <string name=\"error_file_creation\">O arquivo não pode ser criado</string>\n    <string name=\"error_path_creation\">A pasta de destino não pode ser criada</string>\n    <string name=\"error_ssl_exception\">Não foi possível estabelecer uma conexão segura</string>\n    <string name=\"error_unknown_host\">Não foi possível encontrar o servidor</string>\n    <string name=\"error_connect_host\">Não foi possível se conectar ao servidor</string>\n    <string name=\"error_http_no_content\">O servidor não envia dados</string>\n    <string name=\"error_http_unsupported_range\">O servidor não aceita downloads multi-processo, tente novamente com @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Não encontrado</string>\n    <string name=\"error_postprocessing_failed\">Falha no pós-processamento</string>\n    <string name=\"stop\">Parar</string>\n    <string name=\"max_retry_msg\">Número máximo de tentativas</string>\n    <string name=\"max_retry_desc\">Número máximo de tentativas antes de cancelar o download</string>\n    <string name=\"pause_downloads_on_mobile\">Interromper quando estiver usando dados móveis</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Útil ao mudar para dados móveis, mas alguns downloads podem não ser suspensos</string>\n    <string name=\"missions_header_pending\">Pendente</string>\n    <string name=\"show_comments_title\">Mostrar comentários</string>\n    <string name=\"show_comments_summary\">Desative para ocultar comentários</string>\n    <string name=\"autoplay_title\">Reprodução automática</string>\n    <string name=\"no_comments\">Sem comentários</string>\n    <string name=\"error_unable_to_load_comments\">Não foi possível carregar os comentários</string>\n    <string name=\"close\">Fechar</string>\n    <string name=\"enable_playback_resume_title\">Continuar reprodução</string>\n    <string name=\"enable_playback_resume_summary\">Restaurar a última posição de reprodução</string>\n    <string name=\"enable_playback_state_lists_title\">Posições em listas</string>\n    <string name=\"enable_playback_state_lists_summary\">Mostra os indicadores de posição de reprodução em listas</string>\n    <string name=\"settings_category_clear_data_title\">Remover dados</string>\n    <string name=\"watch_history_states_deleted\">Posições de reprodução removidas</string>\n    <string name=\"missing_file\">Arquivo movido ou excluído</string>\n    <string name=\"overwrite_unrelated_warning\">Já existe um arquivo com este nome</string>\n    <string name=\"overwrite_failed\">O arquivo não pode ser sobrescrito</string>\n    <string name=\"download_already_pending\">Já existe um download pendente com este nome</string>\n    <string name=\"error_postprocessing_stopped\">O NewPipe foi fechado enquanto manipulava o arquivo</string>\n    <string name=\"error_insufficient_storage_left\">Sem espaço disponível</string>\n    <string name=\"error_progress_lost\">O progresso foi perdido pois o arquivo foi excluído</string>\n    <string name=\"error_timeout\">Tempo limite de conexão</string>\n    <string name=\"confirm_prompt\">Excluir todo o histórico de downloads ou excluir todos os arquivos baixados\\?</string>\n    <string name=\"enable_queue_limit\">Limitar fila de downloads</string>\n    <string name=\"enable_queue_limit_desc\">Permitir apenas um download de cada vez</string>\n    <string name=\"start_downloads\">Iniciar downloads</string>\n    <string name=\"pause_downloads\">Pausar downloads</string>\n    <string name=\"downloads_storage_ask_title\">Perguntar onde salvar o arquivo</string>\n    <string name=\"downloads_storage_ask_summary\">Você será questionado onde salvar cada download.\n\\nAtive o seletor de pasta do sistema (SAF) se você quiser baixar em um cartão SD externo</string>\n    <string name=\"downloads_storage_use_saf_title\">Usar o seletor de pastas do sistema (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">A \\\"Estrutura de acesso ao armazenamento\\\" permite baixar em um cartão SD externo</string>\n    <string name=\"clear_playback_states_title\">Remover posições de reprodução</string>\n    <string name=\"clear_playback_states_summary\">Remove todas as posições de reprodução</string>\n    <string name=\"delete_playback_states_alert\">Remover todas as posições de reprodução?</string>\n    <string name=\"drawer_header_description\">Alternar serviço, atualmente selecionado:</string>\n    <string name=\"default_kiosk_page_summary\">Kiosk padrão</string>\n    <string name=\"no_one_watching\">Ninguém está assistindo</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s assistindo</item>\n        <item quantity=\"many\">%s assistindo</item>\n        <item quantity=\"other\">%s assistindo</item>\n    </plurals>\n    <string name=\"no_one_listening\">Ninguém está ouvindo</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s ouvinte</item>\n        <item quantity=\"many\">%s ouvintes</item>\n        <item quantity=\"other\">%s ouvintes</item>\n    </plurals>\n    <string name=\"seek_duration_title\">Duração de avanço/retrocesso rápido</string>\n    <string name=\"peertube_instance_url_title\">Instâncias PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Selecione suas instâncias favoritas do PeerTube</string>\n    <string name=\"peertube_instance_url_help\">Encontre as instâncias que gosta em %s</string>\n    <string name=\"peertube_instance_add_title\">Adicionar instância</string>\n    <string name=\"peertube_instance_add_help\">Insira o URL da instância</string>\n    <string name=\"peertube_instance_add_fail\">Erro ao validar a instância</string>\n    <string name=\"peertube_instance_add_https_only\">Somente URL HTTPS são compatíveis</string>\n    <string name=\"peertube_instance_add_exists\">A instância já existe</string>\n    <string name=\"local\">Local</string>\n    <string name=\"recently_added\">Adicionado recentemente</string>\n    <string name=\"most_liked\">Mais curtidos</string>\n    <string name=\"playlist_no_uploader\">Gerado automaticamente (nenhum carregador encontrado)</string>\n    <string name=\"recovering\">recuperando</string>\n    <string name=\"error_download_resource_gone\">O download não pôde ser recuperado</string>\n    <string name=\"choose_instance_prompt\">Escolha uma instância</string>\n    <string name=\"clear_download_history\">Limpar histórico de downloads</string>\n    <string name=\"delete_downloaded_files\">Excluir arquivos baixados</string>\n    <string name=\"permission_display_over_apps\">Obter permissão para exibir sobre outros aplicativos</string>\n    <string name=\"app_language_title\">Idioma do aplicativo</string>\n    <string name=\"systems_language\">Padrão do sistema</string>\n    <string name=\"subtitle_activity_recaptcha\">Toque em \\\"Pronto\\\" ao resolver</string>\n    <string name=\"done\">Pronto</string>\n    <string name=\"videos_string\">Vídeos</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d segundo</item>\n        <item quantity=\"many\">%d segundos</item>\n        <item quantity=\"other\">%d segundos</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Devido a limitações do ExoPlayer, a duração do avanço foi definida para %d segundos</string>\n    <string name=\"mute\">Desativar som</string>\n    <string name=\"unmute\">Ativar som</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuto</item>\n        <item quantity=\"many\">%d minutos</item>\n        <item quantity=\"other\">%d minutos</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d hora</item>\n        <item quantity=\"many\">%d horas</item>\n        <item quantity=\"other\">%d horas</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dia</item>\n        <item quantity=\"many\">%d dias</item>\n        <item quantity=\"other\">%d dias</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">Grupo de canais</string>\n    <string name=\"feed_oldest_subscription_update\">Última atualização do feed: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Não carregado: %d</string>\n    <string name=\"feed_notification_loading\">Carregando feed…</string>\n    <string name=\"feed_processing_message\">Processando feed…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Selecionar inscrições</string>\n    <string name=\"feed_group_dialog_empty_selection\">Nenhuma inscrição selecionada</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d selecionada</item>\n        <item quantity=\"many\">%d selecionadas</item>\n        <item quantity=\"other\">%d selecionadas</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">Nome do grupo está vazio</string>\n    <string name=\"feed_group_dialog_delete_message\">Excluir este grupo\\?</string>\n    <string name=\"feed_create_new_group_button_title\">Novo</string>\n    <string name=\"settings_category_feed_title\">Feed</string>\n    <string name=\"feed_update_threshold_title\">Limite de atualização do feed</string>\n    <string name=\"feed_update_threshold_summary\">Tempo após a última atualização antes que uma inscrição seja considerada desatualizada — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Sempre atualizar</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Buscar do feed dedicado quando disponível</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Disponível em alguns serviços, geralmente é muito mais rápido mas pode retornar um número limitado de itens e geralmente informações incompletas (por exemplo sem duração, tipo de item, sem status em tempo real)</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Ativar modo rápido</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Desativar modo rápido</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Acha o carregamento do feed muito lento\\? Se sim, tente ativar o modo de carregamento rápido (você pode mudar em configurações ou tocando no botão abaixo).\n\\n\n\\nO NewPipe oferece duas estratégias para carregar o feed:\n\\n• Buscar todo o conteúdo do canal inscrito, que é lento mas completo.\n\\n• Usar um endpoint de serviço dedicado, que é rápido mas geralmente incompleto.\n\\n\n\\nA diferença entre os dois é que no rápido geralmente falta alguma informação, como a duração ou tipo do item (não consegue distinguir entre as lives e os vídeos normais) e pode retornar menos itens.\n\\n\n\\nO YouTube é um exemplo de serviço que oferece o modo rápido com seu feed RSS.\n\\n\n\\nAssim, a escolha se resume ao que você prefere: rapidez ou informação precisa.</string>\n    <string name=\"content_not_supported\">O NewPipe ainda não suporta esse conteúdo.\n\\n\n\\nEsperamos que terá suporte em uma versão futura.</string>\n    <string name=\"infinite_videos\">∞ vídeos</string>\n    <string name=\"more_than_100_videos\">+100 vídeos</string>\n    <string name=\"artists\">Artistas</string>\n    <string name=\"albums\">Álbuns</string>\n    <string name=\"songs\">Músicas</string>\n    <string name=\"restricted_video\">Este vídeo tem restrição de idade.\n\\n\n\\nAtive \\\"%1$s\\\" nas configurações se quiser vê-lo.</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Sim, e vídeos parcialmente assistidos</string>\n    <string name=\"remove_watched_popup_warning\">Os vídeos que foram assistidos antes e depois de terem sidos adicionados à playlist serão removidos. \\nTem certeza?</string>\n    <string name=\"remove_watched_popup_title\">Remover vídeos assistidos?</string>\n    <string name=\"remove_watched\">Remover assistidos</string>\n    <string name=\"show_original_time_ago_summary\">Textos originais dos serviços serão visíveis nos itens de transmissão</string>\n    <string name=\"show_original_time_ago_title\">Mostrar tempo original nos itens</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Ativar o \\\"Modo Restrito\\\" do YouTube</string>\n    <string name=\"video_detail_by\">Por %s</string>\n    <string name=\"channel_created_by\">Criado por %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Foto de perfil do canal</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Mostrar apenas inscrições não agrupadas</string>\n    <string name=\"search_showing_result_for\">Mostrando resultados para: %s</string>\n    <string name=\"no_playlist_bookmarked_yet\">Ainda não há playlist favoritas</string>\n    <string name=\"playlist_page_summary\">Página da playlist</string>\n    <string name=\"select_a_playlist\">Selecione uma playlist</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_report_open_issue_button_text\">Reporte no GitHub</string>\n    <string name=\"copy_for_github\">Copiar relatório formatado</string>\n    <string name=\"never\">Nunca</string>\n    <string name=\"wifi_only\">Apenas em Wi-Fi</string>\n    <string name=\"autoplay_summary\">Iniciar reprodução automaticamente — %s</string>\n    <string name=\"title_activity_play_queue\">Fila de reprodução</string>\n    <string name=\"unsupported_url_dialog_message\">Não foi possível reconhecer a URL. Abrir com outro aplicativo\\?</string>\n    <string name=\"auto_queue_toggle\">Pôr na fila automaticamente</string>\n    <string name=\"clear_queue_confirmation_description\">A fila de reprodução atual será substituída</string>\n    <string name=\"clear_queue_confirmation_summary\">Mudar de um player para outro pode substituir sua fila</string>\n    <string name=\"clear_queue_confirmation_title\">Pedir confirmação antes de limpar a fila</string>\n    <string name=\"notification_action_shuffle\">Aleatório</string>\n    <string name=\"notification_action_buffering\">Carregando</string>\n    <string name=\"notification_action_nothing\">Nada</string>\n    <string name=\"notification_action_repeat\">Repetir</string>\n    <string name=\"notification_actions_at_most_three\">Você pode selecionar até no máximo três botões para mostrar na notificação compacta!</string>\n    <string name=\"notification_actions_summary\">Edite os botões de ação da 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.</string>\n    <string name=\"notification_action_4_title\">Quinto botão de ação</string>\n    <string name=\"notification_action_3_title\">Quarto botão de ação</string>\n    <string name=\"notification_action_2_title\">Terceiro botão de ação</string>\n    <string name=\"notification_action_1_title\">Segundo botão de ação</string>\n    <string name=\"notification_action_0_title\">Primeiro botão de ação</string>\n    <string name=\"notification_scale_to_square_image_summary\">Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Ajustar miniatura para a proporção de 1:1</string>\n    <string name=\"show_memory_leaks\">Mostrar vazamentos de memória</string>\n    <string name=\"enqueued\">Na fila</string>\n    <string name=\"enqueue_stream\">Pôr na fila</string>\n    <string name=\"clear_cookie_summary\">Remove os cookies que o NewPipe armazena quando você resolve um reCAPTCHA</string>\n    <string name=\"clear_cookie_title\">Remover cookies de reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Os cookies de reCAPTCHA foram removidos</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">O YouTube oferece um \\\"Modo Restrito\\\" que oculta conteúdo potencialmente adulto</string>\n    <string name=\"show_age_restricted_content_summary\">Mostra conteúdo possivelmente inadequado para crianças pois tem restrição de idade (como +18)</string>\n    <string name=\"notification_colorize_summary\">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)</string>\n    <string name=\"notification_colorize_title\">Colorir notificação</string>\n    <string name=\"show_thumbnail_summary\">Usar miniatura para o plano de fundo da tela de bloqueio e notificações</string>\n    <string name=\"show_thumbnail_title\">Mostrar miniatura</string>\n    <string name=\"msg_calculating_hash\">Calculando hash</string>\n    <string name=\"hash_channel_description\">Notificações sobre o progresso do hashing de vídeo</string>\n    <string name=\"hash_channel_name\">Notificar hash de vídeo</string>\n    <string name=\"show_meta_info_summary\">Desative para ocultar as caixas de informações de metadados com informações adicionais sobre o autor, conteúdo da transmissão ou uma solicitação de busca</string>\n    <string name=\"show_meta_info_title\">Mostrar informação de metadados</string>\n    <string name=\"recent\">Recente</string>\n    <string name=\"chapters\">Capítulos</string>\n    <string name=\"description_tab_description\">Descrição</string>\n    <string name=\"related_items_tab_description\">Ítens relacionados</string>\n    <string name=\"comments_tab_description\">Comentários</string>\n    <string name=\"show_description_summary\">Desative para ocultar a descrição do vídeo e informações adicionais</string>\n    <string name=\"show_description_title\">Mostrar descrição</string>\n    <string name=\"open_with\">Reproduzir com</string>\n    <string name=\"no_app_to_open_intent\">Nenhum aplicativo em seu dispositivo pode abrir isso</string>\n    <string name=\"crash_the_app\">O aplicativo parou</string>\n    <string name=\"paid_content\">Este conteúdo está disponível apenas para usuários que pagaram, portanto não pode ser transmitido ou baixado pelo NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Este vídeo está disponível apenas para assinantes do YouTube Music Premium, portanto não pode ser transmitido ou baixado pelo NewPipe.</string>\n    <string name=\"private_content\">Este conteúdo é privado, portanto não pode ser transmitido ou baixado pelo NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Esta é uma faixa do SoundCloud Go+, pelo menos no seu país, portanto não pode ser transmitida ou baixada pelo NewPipe.</string>\n    <string name=\"georestricted_content\">Este conteúdo não está disponível em seu país.</string>\n    <string name=\"restricted_video_no_stream\">Este vídeo tem restrição de idade.\n\\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.</string>\n    <string name=\"radio\">Rádio</string>\n    <string name=\"featured\">Destaque</string>\n    <string name=\"recaptcha_solve\">Resolvido</string>\n    <string name=\"download_has_started\">O download foi iniciado</string>\n    <string name=\"select_night_theme_toast\">Você pode selecionar seu tema noturno favorito abaixo</string>\n    <string name=\"night_theme_summary\">Selecione seu tema noturno favorito — %s</string>\n    <string name=\"auto_device_theme_title\">Automático (tema do dispositivo)</string>\n    <string name=\"night_theme_title\">Tema noturno</string>\n    <string name=\"show_channel_details\">Mostrar detalhes do canal</string>\n    <string name=\"disable_media_tunneling_summary\">Desative o túnel de mídia se aparecer uma tela preta ou se tiver travamento durante a reprodução do vídeo.</string>\n    <string name=\"disable_media_tunneling_title\">Desativar túnel de mídia</string>\n    <string name=\"metadata_privacy_internal\">Interno</string>\n    <string name=\"metadata_privacy_private\">Privado</string>\n    <string name=\"metadata_privacy_unlisted\">Não Listado</string>\n    <string name=\"metadata_privacy_public\">Público</string>\n    <string name=\"metadata_age_limit\">Limite de Idade</string>\n    <string name=\"metadata_host\">Hospedado em</string>\n    <string name=\"metadata_support\">Suporte</string>\n    <string name=\"metadata_language\">Idioma</string>\n    <string name=\"metadata_privacy\">Privacidade</string>\n    <string name=\"metadata_licence\">Licença</string>\n    <string name=\"metadata_tags\">Tags</string>\n    <string name=\"metadata_category\">Categoria</string>\n    <string name=\"description_select_disable\">Desativar seleção de texto na descrição</string>\n    <string name=\"description_select_enable\">Ativar seleção de texto na descrição</string>\n    <string name=\"description_select_note\">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.</string>\n    <string name=\"open_website_license\">Abrir site</string>\n    <string name=\"account_terminated\">Conta encerrada</string>\n    <string name=\"feed_load_error_fast_unknown\">O modo feed rápido não fornece mais informações sobre isso.</string>\n    <string name=\"feed_load_error_terminated\">A conta do autor foi encerrada.\n\\nNewPipe não poderá carregar este feed no futuro.\n\\nDeseja cancelar a inscrição neste canal\\?</string>\n    <string name=\"feed_load_error_account_info\">Não foi possível carregar o feed para \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Erro ao carregar o feed</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">A \\\"Estrutura de acesso ao armazenamento\\\" é compatível apenas com versões a partir do Android 10</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Você será questionado onde salvar cada download</string>\n    <string name=\"no_dir_yet\">Nenhuma pasta de download definida ainda, escolha a pasta de download padrão agora</string>\n    <string name=\"off\">Desativado</string>\n    <string name=\"on\">Ativado</string>\n    <string name=\"tablet_mode_title\">Modo tablet</string>\n    <string name=\"dont_show\">Não mostrar</string>\n    <string name=\"low_quality_smaller\">Baixa qualidade (menor)</string>\n    <string name=\"high_quality_larger\">Alta qualidade (melhor)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Pré visualização da miniatura na barra de busca</string>\n    <string name=\"comments_are_disabled\">Os comentários estão desabilitados</string>\n    <string name=\"mark_as_watched\">Marcar como assistido</string>\n    <string name=\"detail_heart_img_view_description\">Curtido pelo criador</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s download excluído</item>\n        <item quantity=\"many\">%1$s downloads excluídos</item>\n        <item quantity=\"other\">%1$s downloads excluídos</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">%s download concluído</item>\n        <item quantity=\"many\">%s downloads concluídos</item>\n        <item quantity=\"other\">%s downloads concluídos</item>\n    </plurals>\n    <string name=\"enqueued_next\">Adicionado na próxima posição da fila</string>\n    <string name=\"enqueue_next_stream\">Enfileira a próxima</string>\n    <string name=\"main_page_content_swipe_remove\">Deslize os itens para remove-los</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"start_main_player_fullscreen_title\">Iniciar reprodução principal em tela cheia</string>\n    <string name=\"remote_search_suggestions\">Sugestões de busca remotas</string>\n    <string name=\"local_search_suggestions\">Sugestões de busca locais</string>\n    <string name=\"processing_may_take_a_moment\">Processando… Pode demorar um pouco</string>\n    <string name=\"check_for_updates\">Buscar atualizações</string>\n    <string name=\"manual_update_description\">Verificar manualmente se há novas versões</string>\n    <string name=\"checking_updates_toast\">Buscando atualizações…</string>\n    <string name=\"crash_the_player\">Travar reprodução</string>\n    <string name=\"show_crash_the_player_title\">Mostrar \\\"Travar reprodução\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Mostra uma opção para travar a reprodução</string>\n    <string name=\"feed_new_items\">Novos itens do feed</string>\n    <string name=\"error_report_channel_name\">Notificação de relatório de erro</string>\n    <string name=\"error_report_channel_description\">Notificações para reportar erros</string>\n    <string name=\"error_report_notification_title\">O NewPipe encontrou um erro, toque para relatar</string>\n    <string name=\"create_error_notification\">Crie uma notificação de erro</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação.\n\\nInstale um gerenciador de arquivos compatível com a \\\"Estrutura de acesso ao armazenamento\\\"</string>\n    <string name=\"error_report_notification_toast\">Ocorreu um erro, consulte a notificação</string>\n    <string name=\"show_error_snackbar\">Mostrar um snackbar de erro</string>\n    <string name=\"no_appropriate_file_manager_message\">Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação.\n\\nInstale um gerenciador de arquivos ou tente desativar \\'%s\\' nas configurações de download</string>\n    <string name=\"detail_pinned_comment_view_description\">Comentário fixado</string>\n    <string name=\"leak_canary_not_available\">O LeakCanary não está disponível</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer padrão</string>\n    <string name=\"settings_category_player_notification_title\">Notificação de reprodução</string>\n    <string name=\"settings_category_player_notification_summary\">Configurar notificação da reprodução do vídeo atual</string>\n    <string name=\"notifications\">Notificações</string>\n    <string name=\"streams_notification_channel_name\">Novos vídeos</string>\n    <string name=\"streams_notification_channel_description\">Notificações sobre novos vídeos de inscrições</string>\n    <string name=\"enable_streams_notifications_title\">Notificações sobre novos vídeos</string>\n    <string name=\"enable_streams_notifications_summary\">Notificar sobre novos vídeos de suas inscrições</string>\n    <string name=\"streams_notifications_interval_title\">Frequência de verificação</string>\n    <string name=\"any_network\">Nenhuma rede</string>\n    <string name=\"delete_downloaded_files_confirm\">Excluir todos os arquivos baixados?</string>\n    <string name=\"you_successfully_subscribed\">Agora você se inscreveu neste canal</string>\n    <string name=\"toggle_all\">Alternar tudo</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"loading_stream_details\">Carregando detalhes da transmissão…</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s novo vídeo</item>\n        <item quantity=\"many\">%s novos vídeos</item>\n        <item quantity=\"other\">%s novos vídeos</item>\n    </plurals>\n    <string name=\"check_new_streams\">Buscar novos vídeos</string>\n    <string name=\"streams_notifications_network_title\">Conexão de rede necessária</string>\n    <string name=\"notifications_disabled\">As notificações estão desativadas</string>\n    <string name=\"get_notified\">Seja notificado</string>\n    <string name=\"percent\">Por cento</string>\n    <string name=\"semitone\">Semitom</string>\n    <string name=\"selected_stream_external_player_not_supported\">O vídeo selecionado não é compatível com players externos</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Nenhuma transmissão de áudio está disponível para players externos</string>\n    <string name=\"streams_not_yet_supported_removed\">Os vídeos que ainda não são suportados pelo assistente de download não são exibidos</string>\n    <string name=\"no_video_streams_available_for_external_players\">Nenhuma transmissão de vídeo está disponível para players externos</string>\n    <string name=\"select_quality_external_players\">Selecione a qualidade para players externos</string>\n    <string name=\"unknown_format\">Formato desconhecido</string>\n    <string name=\"unknown_quality\">Qualidade desconhecida</string>\n    <string name=\"progressive_load_interval_title\">Tamanho do intervalo de carregamento da reprodução</string>\n    <string name=\"faq\">Ver no site</string>\n    <string name=\"faq_description\">Se você está com problemas ao usar o aplicativo, confira estas respostas para perguntas comuns!</string>\n    <string name=\"faq_title\">Perguntas frequentes</string>\n    <string name=\"sort\">Classificar</string>\n    <string name=\"fast_mode\">Modo rápido</string>\n    <string name=\"import_subscriptions_hint\">Importar ou exportar inscrições no menu com 3 pontos</string>\n    <string name=\"app_update_available_notification_text\">Toque para baixar %s</string>\n    <string name=\"app_update_unavailable_toast\">Você já possui a atualização mais recente do NewPipe</string>\n    <string name=\"night_theme_available\">Esta opção só está disponível se %s for selecionado para Tema</string>\n    <string name=\"unset_playlist_thumbnail\">Desativar miniatura permanente</string>\n    <string name=\"card\">Cartão</string>\n    <string name=\"msg_failed_to_copy\">Falha ao copiar para a área de transferência</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplicata adicionada %d vez(es)</string>\n    <string name=\"duplicate_in_playlist\">As playlists em cinza já contêm este item.</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorar eventos de botões físicos (hardware)</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Útil, por exemplo, se você estiver usando um fone de ouvido com botões físicos quebrados</string>\n    <string name=\"remove_duplicates\">Remover duplicados</string>\n    <string name=\"remove_duplicates_title\">Remover duplicados\\?</string>\n    <string name=\"remove_duplicates_message\">Deseja remover todos os vídeos duplicados nesta playlist?</string>\n    <string name=\"feed_hide_streams_title\">Mostrar próximos vídeos</string>\n    <string name=\"feed_show_hide_streams\">Mostrar/ocultar vídeos</string>\n    <string name=\"feed_show_partially_watched\">Parcialmente assistido</string>\n    <string name=\"feed_show_upcoming\">Em breve</string>\n    <string name=\"feed_show_watched\">Totalmente assistido</string>\n    <string name=\"left_gesture_control_summary\">Escolha o gesto para a parte esquerda na tela de reprodução</string>\n    <string name=\"left_gesture_control_title\">Ação para o gesto à esquerda</string>\n    <string name=\"right_gesture_control_summary\">Escolha o gesto para a parte direita na tela de reprodução</string>\n    <string name=\"brightness\">Brilho</string>\n    <string name=\"volume\">Volume</string>\n    <string name=\"none\">Nenhum</string>\n    <string name=\"right_gesture_control_title\">Ação para o gesto à direita</string>\n    <string name=\"progressive_load_interval_summary\">Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo</string>\n    <string name=\"prefer_original_audio_title\">Dar preferência ao áudio original</string>\n    <string name=\"prefer_original_audio_summary\">Selecionar o áudio original e independentemente do idioma</string>\n    <string name=\"prefer_descriptive_audio_title\">Dar preferência ao áudio descritivo</string>\n    <string name=\"prefer_descriptive_audio_summary\">Selecionar um áudio com descrição para pessoas com dificuldades de visão, se disponível</string>\n    <string name=\"play_queue_audio_track\">Áudio: %s</string>\n    <string name=\"audio_track\">Faixa de áudio</string>\n    <string name=\"select_audio_track_external_players\">Selecione a faixa de áudio para players externo</string>\n    <string name=\"unknown_audio_track\">Desconhecido</string>\n    <string name=\"settings_category_exoplayer_title\">Configurar ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">Gerenciar algumas configurações do ExoPlayer. É necessário reiniciar o player para aplicar as mudanças</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"audio_track_type_dubbed\">dublado</string>\n    <string name=\"audio_track_type_descriptive\">descritivo</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\n\\nAtivar esta opção pode evitar erros de reprodução ao alternar o player de vídeo atual ou alternar para tela cheia</string>\n    <string name=\"audio_track_present_in_video\">Uma faixa de áudio já deve estar presente neste vídeo</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Usar decodificador alternativo do ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Usar sempre a solução alternativa de configuração da superfície de saída de vídeo do ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"main_tabs_position_summary\">Mover o seletor da guia principal para a parte inferior</string>\n    <string name=\"main_tabs_position_title\">Posição de guias principais</string>\n    <string name=\"no_streams\">Nenhum conteúdo</string>\n    <string name=\"no_live_streams\">Nenhuma transmissão ao vivo</string>\n    <string name=\"disable_media_tunneling_automatic_info\">O túnel de mídia foi desabilitado por padrão em seu dispositivo porque seu modelo é conhecido por não suportá-lo.</string>\n    <string name=\"channel_tab_videos\">Vídeos</string>\n    <string name=\"metadata_subscribers\">Inscritos</string>\n    <string name=\"show_channel_tabs_summary\">Quais guias são mostradas na página do canal</string>\n    <string name=\"show_channel_tabs\">Guias do canal</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"loading_metadata_title\">Carregando metadados…</string>\n    <string name=\"feed_fetch_channel_tabs\">Buscar guias de canal</string>\n    <string name=\"channel_tab_about\">Sobre</string>\n    <string name=\"channel_tab_albums\">Álbuns</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">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.</string>\n    <string name=\"channel_tab_playlists\">Playlists</string>\n    <string name=\"channel_tab_tracks\">Faixas</string>\n    <string name=\"channel_tab_channels\">Canais</string>\n    <string name=\"channel_tab_livestreams\">Ao vivo</string>\n    <string name=\"image_quality_title\">Qualidade da imagem</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist_with_list\">Compartilhar URLs</string>\n    <string name=\"share_playlist_with_titles\">Compartilhar com títulos</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Compartilhar como playlist temporária do YouTube</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"toggle_screen_orientation\">Alternar orientação da tela</string>\n    <string name=\"image_quality_low\">Baixa qualidade</string>\n    <string name=\"toggle_fullscreen\">Alternar tela cheia</string>\n    <string name=\"metadata_avatars\">Fotos</string>\n    <string name=\"next_stream\">Próximo vídeo</string>\n    <string name=\"metadata_subchannel_avatars\">Fotos de perfil do subcanal</string>\n    <string name=\"open_play_queue\">Abrir fila de reprodução</string>\n    <string name=\"image_quality_none\">Não carregar imagens</string>\n    <string name=\"image_quality_high\">Alta qualidade</string>\n    <string name=\"share_playlist\">Compartilhar playlist</string>\n    <string name=\"forward\">Avançar</string>\n    <string name=\"rewind\">Retroceder</string>\n    <string name=\"replay\">Repetir</string>\n    <string name=\"image_quality_medium\">Qualidade média</string>\n    <string name=\"metadata_uploader_avatars\">Fotos de perfil do autor</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"play\">Reproduzir</string>\n    <string name=\"more_options\">Mais opções</string>\n    <string name=\"metadata_thumbnails\">Miniaturas</string>\n    <string name=\"duration\">Duração</string>\n    <string name=\"previous_stream\">Vídeo anterior</string>\n    <string name=\"metadata_banners\">Banners</string>\n    <string name=\"show_more\">Mostrar mais</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s resposta</item>\n        <item quantity=\"many\">%s respostas</item>\n        <item quantity=\"other\">%s respostas</item>\n    </plurals>\n    <string name=\"show_less\">Mostrar menos</string>\n    <string name=\"error_insufficient_storage\">Não há espaço livre suficiente no dispositivo</string>\n    <string name=\"yes\">Sim</string>\n    <string name=\"no\">Não</string>\n    <string name=\"settings_category_backup_restore_title\">Backup &amp; Restauração</string>\n    <string name=\"auto_update_check_description\">O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis.\n\\nDeseja ativar essa opção?</string>\n    <string name=\"reset_settings_title\">Restaurar configurações</string>\n    <string name=\"reset_settings_summary\">Restaurar todas as configurações para seus valores padrão</string>\n    <string name=\"reset_all_settings\">A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará o aplicativo.\n\\n\n\\nTem certeza de que deseja continuar?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">secundário</string>\n    <string name=\"tab_bookmarks_short\">Playlists</string>\n    <string name=\"select_a_feed_group\">Selecione um grupo de feeds</string>\n    <string name=\"no_feed_group_created_yet\">Nenhum grupo de feeds criado ainda</string>\n    <string name=\"feed_group_page_summary\">Página do grupo do canal</string>\n    <string name=\"search_with_service_name\">Buscar %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Buscar %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Curtidas</string>\n    <string name=\"migration_info_6_7_title\">Página Top 50 do SoundCloud removida</string>\n    <string name=\"migration_info_6_7_message\">O SoundCloud descontinuou as paradas originais do Top 50. A aba correspondente foi removida da sua página principal.</string>\n    <string name=\"permission_display_over_apps_message\">Para usar o Popup Player, selecione %1$s no seguinte menu de configurações do Android e ative %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">“Permitir exibição sobre outros aplicativos”</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"delete_file\">Excluir arquivo</string>\n    <string name=\"delete_entry\">Excluir entrada</string>\n    <string name=\"migration_info_7_8_title\">Tendências combinadas do YouTube removidas</string>\n    <string name=\"migration_info_7_8_message\">O YouTube descontinuou a página de tendências combinadas em 21 de julho de 2025. O NewPipe substituiu a página de tendências padrão pelas transmissões ao vivo em alta.\\n\\nVocê também pode selecionar páginas de tendências diferentes em \\\"Configurações &gt; Conteúdo &gt; Conteúdo da página principal\\\".</string>\n    <string name=\"trending_gaming\">Jogos em alta</string>\n    <string name=\"trending_podcasts\">Podcasts em alta</string>\n    <string name=\"trending_movies\">Filmes e programas em alta</string>\n    <string name=\"trending_music\">Músicas em alta</string>\n    <string name=\"entry_deleted\">Entrada excluída</string>\n    <string name=\"account_terminated_service_provides_reason\">Conta encerrada\\n\\n%1$s informa este motivo: %2$s</string>\n    <string name=\"player_http_403\">Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por URL de streaming expirado ou IP banido</string>\n    <string name=\"player_http_invalid_status\">Erro HTTP %1$s recebido do servidor durante reprodução</string>\n    <string name=\"youtube_player_http_403\">Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um banimento de IP ou problemas de desofuscação de URL de streaming</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s se recusou a fornecer dados, solicitando um login para confirmar que o solicitante não é um bot.\\n\\nSeu IP pode ter sido temporariamente banido por %1$s. Você pode esperar um pouco ou mudar para um IP diferente (por exemplo, ativando/desativando uma VPN ou alternando de Wi-Fi para dados móveis).</string>\n    <string name=\"unsupported_content_in_country\">Este conteúdo não está disponível para o país selecionado atualmente.\\n\\nAltere sua seleção acessando “Configurações &gt; Conteúdo &gt; País padrão do conteúdo”.</string>\n    <string name=\"kao_dialog_warning\">Em agosto de 2025, o Google anunciou que, a partir de setembro de 2026, a instalação de aplicativos exigirá a verificação do desenvolvedor para todos os aplicativos Android em dispositivos certificados, incluindo aqueles instalados fora da Play Store. Como os desenvolvedores do NewPipe não concordam com esse requisito, o NewPipe não funcionará mais em dispositivos Android certificados após essa data.</string>\n    <string name=\"kao_dialog_more_info\">Detalhes</string>\n    <string name=\"kao_solution\">Solução</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-pt-rPT/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"decline\">Recusar</string>\n    <string name=\"start_here_on_background\">Iniciar reprodução em segundo plano</string>\n    <string name=\"import_network_expensive_warning\">Tenha em atenção de que esta operação pode sobrecarregar a sua rede.\n\\n\n\\nDeseja continuar\\?</string>\n    <string name=\"main_bg_subtitle\">Toque na lupa para começar.</string>\n    <string name=\"enable_playback_resume_title\">Continuar reprodução</string>\n    <string name=\"msg_threads\">Processos</string>\n    <string name=\"settings_file_replacement_character_summary\">Os carateres inválidos são substituídos por este valor</string>\n    <string name=\"download\">Descarregar</string>\n    <string name=\"use_external_video_player_summary\">Remove o áudio em algumas resoluções</string>\n    <string name=\"systems_language\">Predefinição do sistema</string>\n    <string name=\"minimize_on_exit_title\">Minimizar ao trocar de aplicação</string>\n    <string name=\"unmute\">Ativar som</string>\n    <string name=\"start_here_on_popup\">Iniciar reprodução num popup</string>\n    <string name=\"import_soundcloud_instructions_hint\">suaID, soundcloud.com/suaID</string>\n    <string name=\"default_popup_resolution_title\">Resolução padrão para janela popup</string>\n    <string name=\"could_not_import_all_files\">Aviso: não foi possível importar todos os ficheiros.</string>\n    <string name=\"download_already_running\">Já existe uma descarga em curso com este nome</string>\n    <string name=\"view_on_github\">Ver no GitHub</string>\n    <string name=\"main_page_content\">Conteúdo da página principal</string>\n    <string name=\"error_progress_lost\">Progresso perdido, o ficheiro foi eliminado</string>\n    <string name=\"channel_unsubscribed\">Canal não subscrito</string>\n    <string name=\"msg_name\">Nome do ficheiro</string>\n    <string name=\"enable_playback_state_lists_summary\">Mostrar indicadores de posição de reprodução nas listas</string>\n    <string name=\"notification_channel_description\">Notificações para o reprodutor do NewPipe</string>\n    <string name=\"unhook_checkbox\">Desvincular (pode causar distorção)</string>\n    <string name=\"show_search_suggestions_summary\">Escolha as sugestões a mostrar ao pesquisar</string>\n    <string name=\"no_valid_zip_file\">Ficheiro ZIP inválido</string>\n    <string name=\"no_views\">Sem visualizações</string>\n    <string name=\"light_theme_title\">Claro</string>\n    <string name=\"subscription_change_failed\">Não foi possível alterar a subscrição</string>\n    <string name=\"overwrite_finished_warning\">Já existe um ficheiro descarregado com este nome</string>\n    <string name=\"caption_setting_title\">Legendas</string>\n    <string name=\"restore_defaults\">Repor predefinições</string>\n    <string name=\"error_occurred_detail\">Ocorreu um erro: %1$s</string>\n    <string name=\"controls_popup_title\">Pop-up</string>\n    <string name=\"msg_running\">Descarga NewPipe</string>\n    <string name=\"new_seek_duration_toast\">Devido às restrições de ExoPlayer, a duração da pesquisa foi definida para %d segundos</string>\n    <string name=\"overwrite\">Sobrescrever</string>\n    <string name=\"mute\">Sem som</string>\n    <string name=\"enable_watch_history_title\">Histórico de visualizações</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s visualização</item>\n        <item quantity=\"many\">%s visualizações</item>\n        <item quantity=\"other\">%s visualizações</item>\n    </plurals>\n    <string name=\"confirm_prompt\">Deseja limpar o histórico de descargas ou eliminar todos os ficheiros descarregados?</string>\n    <string name=\"settings_category_history_title\">Histórico e cache</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Continuar reprodução após interrupções (ex. chamadas)</string>\n    <string name=\"controls_download_desc\">Descarregar ficheiro de vídeo</string>\n    <string name=\"more_than_100_videos\">+100 vídeos</string>\n    <string name=\"resize_fit\">Ajustar</string>\n    <string name=\"feed_update_threshold_option_always_update\">Atualizar sempre</string>\n    <string name=\"play_all\">Reproduzir tudo</string>\n    <string name=\"delete_playlist_prompt\">Eliminar esta lista de reprodução\\?</string>\n    <string name=\"what_device_headline\">Informação:</string>\n    <string name=\"tab_licenses\">Licenças</string>\n    <string name=\"pause_downloads_on_mobile\">Interromper em redes limitadas</string>\n    <string name=\"detail_thumbnail_view_description\">Reproduzir vídeo, duração:</string>\n    <string name=\"feed_create_new_group_button_title\">Novo</string>\n    <string name=\"content_not_supported\">Este conteúdo ainda não é suportado pelo NewPipe. \n\\n \n\\nEsperamos que seja suportado numa versão futura.</string>\n    <string name=\"minimize_on_exit_none_description\">Nenhuma</string>\n    <string name=\"download_path_dialog_title\">Escolha a pasta para colocar os ficheiros de vídeo</string>\n    <string name=\"feed_group_dialog_delete_message\">Deseja apagar este grupo\\?</string>\n    <string name=\"error_unknown_host\">Não foi possível encontrar o servidor</string>\n    <string name=\"subscriptions_import_unsuccessful\">Não foi possível importar as subscrições</string>\n    <string name=\"downloads\">Transferências</string>\n    <string name=\"feed_processing_message\">A processar…</string>\n    <string name=\"restricted_video\">Este vídeo está restringido a idades.\n\\n\n\\nPara o poder ver, tem que ativar \\\"%1$s\\\" nas definições.</string>\n    <string name=\"read_full_license\">Ver licença</string>\n    <string name=\"peertube_instance_add_https_only\">Apenas os URL HTTPS são suportados</string>\n    <string name=\"peertube_instance_add_fail\">Falha ao validar a instância</string>\n    <string name=\"clear_download_history\">Limpar histórico de descargas</string>\n    <string name=\"delete_playback_states_alert\">Remover todas as posições de reprodução\\?</string>\n    <string name=\"enable_queue_limit\">Limitar fila de descargas</string>\n    <string name=\"show_age_restricted_content_title\">Mostrar conteúdo com restrição de idade</string>\n    <string name=\"privacy_policy_encouragement\">O projeto NewPipe leva a sua privacidade muito a sério. Por isso, não recolhe nenhum dado sem o seu consentimento.\n\\nA polícia de privacidade do NewPipe explica, em detalhe, os tipos de dados enviados sempre que submete um relatório de erro.</string>\n    <string name=\"file\">Ficheiro</string>\n    <string name=\"controls_add_to_playlist_title\">Adicionar a</string>\n    <string name=\"clear_playback_states_summary\">Remove todas as posições de reprodução</string>\n    <string name=\"create\">Criar</string>\n    <string name=\"subscribe_button_title\">Subscrever</string>\n    <string name=\"artists\">Artistas</string>\n    <string name=\"error_connect_host\">Não foi possível ligar ao servidor</string>\n    <string name=\"show_play_with_kodi_summary\">Mostrar uma opção para reproduzir o vídeo no Kodi</string>\n    <string name=\"list_view_mode\">Modo de exibição</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"permission_display_over_apps\">Permitir sobreposição a outras aplicações</string>\n    <string name=\"export_to\">Exportar para</string>\n    <string name=\"title_activity_about\">Sobre o NewPipe</string>\n    <string name=\"blank_page_summary\">Página vazia</string>\n    <string name=\"playlist_no_uploader\">Geração automática (não foi encontrado nenhum enviador)</string>\n    <string name=\"default_resolution_title\">Resolução padrão</string>\n    <string name=\"error_report_open_issue_button_text\">Reportar no GitHub</string>\n    <string name=\"detail_likes_img_view_description\">Gosto</string>\n    <string name=\"download_path_title\">Pasta para os ficheiros de vídeo</string>\n    <string name=\"subtitle_activity_recaptcha\">Prima \\\"Feito\\\" ao resolver</string>\n    <string name=\"feed_notification_loading\">A carregar…</string>\n    <string name=\"play_audio\">Áudio</string>\n    <string name=\"show_original_time_ago_title\">Mostrar antiguidade nos itens</string>\n    <string name=\"default_kiosk_page_summary\">\\'Kiosk\\' padrão</string>\n    <string name=\"playlist_creation_success\">Lista de reprodução criada</string>\n    <string name=\"channel_created_by\">Criado por %s</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d segundo</item>\n        <item quantity=\"many\">%d segundos</item>\n        <item quantity=\"other\">%d segundos</item>\n    </plurals>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d selecionado</item>\n        <item quantity=\"many\">%d selecionados</item>\n        <item quantity=\"other\">%d selecionados</item>\n    </plurals>\n    <string name=\"share\">Partilhar</string>\n    <string name=\"read_privacy_policy\">Ver política de privacidade</string>\n    <string name=\"player_unrecoverable_failure\">Ocorreu um erro compulsivo do reprodutor</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Ativar \\\"Modo restrito\\\" do YouTube</string>\n    <string name=\"invalid_directory\">Pasta inexistente</string>\n    <string name=\"all\">Tudo</string>\n    <string name=\"sorry_string\">Bolas, isto não deveria ter acontecido.</string>\n    <string name=\"undo\">Anular</string>\n    <string name=\"no_channel_subscribed_yet\">Não existem canais subscritos</string>\n    <string name=\"settings_category_player_behavior_title\">Comportamento</string>\n    <string name=\"no_available_dir\">Tem que definir, nas definições, uma pasta para as descargas</string>\n    <string name=\"enable_playback_state_lists_title\">Posições em listas</string>\n    <string name=\"enable_queue_limit_desc\">Permitir apenas uma descarga de cada vez</string>\n    <string name=\"error_http_not_found\">Não encontrado</string>\n    <string name=\"background_player_playing_toast\">Reprodução em segundo plano</string>\n    <string name=\"show_higher_resolutions_title\">Mostrar resoluções mais altas</string>\n    <string name=\"no_subscribers\">Sem subscritores</string>\n    <string name=\"use_external_audio_player_title\">Utilizar reprodutor de áudio externo</string>\n    <string name=\"did_you_mean\">Será que queria dizer \\\"%1$s\\\"\\?</string>\n    <string name=\"updates_setting_description\">Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão</string>\n    <string name=\"enqueue\">Enfileirar</string>\n    <string name=\"no_one_watching\">Ninguém está a ver</string>\n    <string name=\"delete_downloaded_files\">Eliminar ficheiros descarregados</string>\n    <string name=\"app_language_title\">Idioma da aplicação</string>\n    <string name=\"users\">Utilizadores</string>\n    <string name=\"remove_watched_popup_warning\">Os vídeos que tenham sido vistos antes e após serem adicionados à lista de reprodução serão removidos. \\nTem a certeza?</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s a ver</item>\n        <item quantity=\"many\">%s a ver</item>\n        <item quantity=\"other\">%s a ver</item>\n    </plurals>\n    <string name=\"msg_wait\">Por favor aguarde…</string>\n    <string name=\"clear\">Limpar</string>\n    <string name=\"unsubscribe\">Cancelar subscrição</string>\n    <string name=\"content\">Conteúdo</string>\n    <string name=\"show_original_time_ago_summary\">Os textos originais dos serviços serão visíveis nos itens do vídeo</string>\n    <string name=\"upload_date_text\">Publicado em %1$s</string>\n    <string name=\"skip_silence_checkbox\">Avanço rápido durante silêncio</string>\n    <string name=\"audio_streams_empty\">Não foram encontrados áudios</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe foi fechado enquanto trabalhava no ficheiro</string>\n    <string name=\"create_playlist\">Nova lista de reprodução</string>\n    <string name=\"copyright\">© %1$s de %2$s nos termos da %3$s</string>\n    <string name=\"black_theme_title\">Preto</string>\n    <string name=\"no_one_listening\">Ninguém está a ouvir</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniatura da lista de reprodução alterada.</string>\n    <string name=\"error_unable_to_load_comments\">Não foi possível carregar os comentários</string>\n    <string name=\"default_content_country_title\">País padrão para conteúdo</string>\n    <string name=\"app_description\">Aplicação livre de reprodução de transmissões para Android.</string>\n    <string name=\"content_language_title\">Idioma padrão para conteúdo</string>\n    <string name=\"import_youtube_instructions\">Importar subscrições do YouTube do Google Takeout:\n\\n\n\\n1. Vá para este URL: %1$s\n\\n2. Faça o login quando solicitado\n\\n3. Clique em \\\"Todos os dados incluídos\\\", depois em \\\"Desmarcar todos\\\", depois selecione apenas \\\"subscrições\\\" e clique em \\\"OK\\\".\n\\n4. Clique em \\\"Próximo passo\\\" e depois em \\\"Criar exportação\\\".\n\\n5. Clique no botão \\\"Descarregar\\\" após aparecer\n\\n6. Clique em IMPORT FILE abaixo e selecione o ficheiro .zip descarregado\n\\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</string>\n    <string name=\"minimize_on_exit_background_description\">Ativar reprodutor em segundo plano</string>\n    <string name=\"recaptcha_request_toast\">Desafio reCAPTCHA solicitado</string>\n    <string name=\"autoplay_title\">Reprodução automática</string>\n    <string name=\"peertube_instance_add_exists\">Instância já existe</string>\n    <string name=\"donation_encouragement\">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.</string>\n    <string name=\"auto_queue_summary\">Continuar (sem repetição) a fila de reprodução anexando um vídeo relacionado</string>\n    <string name=\"always\">Sempre</string>\n    <string name=\"start_accept_privacy_policy\">Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção.\n\\nTem que aceitar esta política para nos poder enviar o seu relatório.</string>\n    <string name=\"feed_groups_header_title\">Grupos de canais</string>\n    <string name=\"install\">Instalar</string>\n    <string name=\"import_settings\">Também deseja importar as definições\\?</string>\n    <string name=\"bookmark_playlist\">Guardar lista de reprodução como favorita</string>\n    <string name=\"playback_step\">Passo</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"detail_dislikes_img_view_description\">Não gosto</string>\n    <string name=\"import_file_title\">Importar ficheiro</string>\n    <string name=\"notification_channel_name\">Notificação NewPipe</string>\n    <string name=\"error_snackbar_message\">Desculpe mas algo correu mal.</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"error_path_creation\">Não foi possível criar a pasta de destino</string>\n    <string name=\"title_licenses\">Licenças de terceiros</string>\n    <string name=\"generate_unique_name\">Gerar nome único</string>\n    <string name=\"minimize_on_exit_summary\">Ação a executar ao trocar para outra aplicação a partir do menu principal - %s</string>\n    <string name=\"use_external_video_player_title\">Utilizar reprodutor de vídeo externo</string>\n    <string name=\"info_labels\">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:</string>\n    <string name=\"contribution_encouragement\">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á!</string>\n    <string name=\"settings_category_clear_data_title\">Limpar dados</string>\n    <string name=\"just_once\">Apenas uma vez</string>\n    <string name=\"feed_subscription_not_loaded_count\">Não carregado: %d</string>\n    <string name=\"resize_fill\">Preencher</string>\n    <string name=\"dark_theme_title\">Escuro</string>\n    <string name=\"retry\">Tentar novamente</string>\n    <string name=\"show_next_and_similar_title\">Mostrar vídeos \\'Seguintes\\' e \\'Semelhantes\\'</string>\n    <string name=\"queued\">na fila</string>\n    <string name=\"open_in_browser\">Abrir no navegador</string>\n    <string name=\"new_and_hot\">Novos e tendências</string>\n    <string name=\"clear_search_history_summary\">Remove o histórico de pesquisas</string>\n    <string name=\"app_update_notification_channel_name\">Notificação de nova versão</string>\n    <string name=\"select_a_playlist\">Selecione uma lista de reprodução</string>\n    <string name=\"feed_oldest_subscription_update\">Última atualização: %s</string>\n    <string name=\"import_data_title\">Importar base de dados</string>\n    <string name=\"error_report_title\">Relatório de erro</string>\n    <string name=\"error_insufficient_storage_left\">Não há espaço livre no dispositivo</string>\n    <string name=\"max_retry_desc\">Número máximo de tentativas antes de cancelar a descarga</string>\n    <string name=\"player_recoverable_failure\">A recuperar de um erro do reprodutor</string>\n    <string name=\"duration_live\">Em direto</string>\n    <string name=\"feed_update_threshold_title\">Limite de atualização da fonte</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"subscription_update_failed\">Não foi possível atualizar a subscrição</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Sim e também os vídeos parcialmente vistos</string>\n    <string name=\"no_playlist_bookmarked_yet\">Ainda não há listas de reprodução favoritas</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s ouvinte</item>\n        <item quantity=\"many\">%s ouvintes</item>\n        <item quantity=\"other\">%s ouvintes</item>\n    </plurals>\n    <string name=\"delete_search_history_alert\">Remover todo o histórico de pesquisas\\?</string>\n    <string name=\"error_report_button_text\">Reportar por e-mail</string>\n    <string name=\"tab_choose\">Escolher separador</string>\n    <string name=\"grid\">Grelha</string>\n    <string name=\"export_complete_toast\">Exportado</string>\n    <string name=\"download_path_audio_dialog_title\">Escolha a pasta para colocar os ficheiros de áudio</string>\n    <string name=\"app_update_available_notification_title\">Atualização NewPipe disponível!</string>\n    <string name=\"events\">Eventos</string>\n    <string name=\"privacy_policy_title\">Política de privacidade do NewPipe</string>\n    <string name=\"could_not_load_thumbnails\">Não foi possível carregar todas as miniaturas</string>\n    <string name=\"audio\">Áudio</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"error_postprocessing_failed\">Falha pós-processamento</string>\n    <string name=\"delete_view_history_alert\">Remover todo o histórico de visualizações\\?</string>\n    <string name=\"preferred_player_fetcher_notification_title\">A obter informação…</string>\n    <string name=\"show_search_suggestions_title\">Sugestões de pesquisa</string>\n    <string name=\"set_as_playlist_thumbnail\">Definir como miniatura da lista de reprodução</string>\n    <string name=\"drawer_open\">Abrir menu</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s subscritor</item>\n        <item quantity=\"many\">%s subscritores</item>\n        <item quantity=\"other\">%s subscritores</item>\n    </plurals>\n    <string name=\"restore_defaults_confirmation\">Deseja repor as predefinições\\?</string>\n    <string name=\"external_player_unsupported_link_type\">Os reprodutores externos não suportam este tipo de hiperligações</string>\n    <string name=\"rename\">Mudar nome</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Storage Access Framework\\' permite transferências para um cartão SD externo</string>\n    <string name=\"seek_duration_title\">Duração da pesquisa de avanço/recuo rápido</string>\n    <string name=\"missing_file\">Ficheiro movido ou eliminado</string>\n    <string name=\"title_last_played\">Última reprodução</string>\n    <string name=\"website_encouragement\">Visite o site NewPipe para obter mais informação e novidades.</string>\n    <string name=\"import_soundcloud_instructions\">Importe o seu perfil SoundCloud digitando o URL ou a ID.:\n\\n\n\\n1. Ative o modo desktop do seu navegador web (o site não está disponível para dispositivos móveis)\n\\n2. Aceda a este URL: %1$s\n\\n3. Inicie a sessão\n\\n4. Copie o URL do seu perfil.</string>\n    <string name=\"metadata_cache_wipe_title\">Limpar meta-dados em cache</string>\n    <string name=\"parsing_error\">Não foi possível processar o site</string>\n    <string name=\"no_comments\">Sem comentários</string>\n    <string name=\"post_processing\">pós-processamento</string>\n    <string name=\"overwrite_failed\">não é possível sobrescrever o ficheiro</string>\n    <string name=\"invalid_source\">Fonte de conteúdo/ficheiro inexistente</string>\n    <string name=\"app_update_notification_channel_description\">Notificações para novas versões do NewPipe</string>\n    <string name=\"action_history\">Histórico</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"remove_watched_popup_title\">Remover transmissões vistas?</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuto</item>\n        <item quantity=\"many\">%d minutos</item>\n        <item quantity=\"other\">%d minutos</item>\n    </plurals>\n    <string name=\"missions_header_finished\">Terminada</string>\n    <string name=\"watch_history_deleted\">Histórico de vídeos apagado</string>\n    <string name=\"no_player_found\">Não tem um reprodutor de vídeo. Instalar o VLC\\?</string>\n    <string name=\"show_comments_summary\">Desative para ocultar comentários</string>\n    <string name=\"limit_mobile_data_usage_title\">Limitar resolução se em dados móveis</string>\n    <string name=\"main_page_content_summary\">Separadores mostrados na página principal</string>\n    <string name=\"play_queue_audio_settings\">Definições de áudio</string>\n    <string name=\"delete\">Eliminar</string>\n    <string name=\"playback_tempo\">Ritmo</string>\n    <string name=\"peertube_instance_url_title\">Instâncias PeerTube</string>\n    <string name=\"settings_category_player_title\">Reprodutor</string>\n    <string name=\"settings_category_debug_title\">Depuração</string>\n    <string name=\"peertube_instance_add_help\">Digite o URL da instância</string>\n    <string name=\"preferred_open_action_settings_title\">Ação de \\'Abrir\\' preferida</string>\n    <string name=\"settings_category_video_audio_title\">Vídeo e áudio</string>\n    <string name=\"charset_letters_and_digits\">Letras e dígitos</string>\n    <string name=\"enable_leak_canary_summary\">A monitorização de memória pode tornar a aplicação instável</string>\n    <string name=\"copy_for_github\">Copiar relatório formatado</string>\n    <string name=\"resize_zoom\">Ampliar</string>\n    <string name=\"file_name_empty_error\">O nome do ficheiro não pode estar vazio</string>\n    <string name=\"video_detail_by\">Por %s</string>\n    <string name=\"charset_most_special_characters\">Mais caracteres especiais</string>\n    <string name=\"download_path_audio_title\">Pasta para ficheiros de áudio</string>\n    <string name=\"error_details_headline\">Detalhes:</string>\n    <string name=\"settings_category_downloads_title\">Transferências</string>\n    <string name=\"settings_category_feed_title\">Fonte</string>\n    <string name=\"playlist_page_summary\">Página da lista de reprodução</string>\n    <string name=\"settings\">Definições</string>\n    <string name=\"title_most_played\">Mais reproduzido</string>\n    <string name=\"search_showing_result_for\">A mostrar resultados para: %s</string>\n    <string name=\"switch_to_background\">Mudar para segundo plano</string>\n    <string name=\"albums\">Álbuns</string>\n    <string name=\"previous_export\">Exportação anterior</string>\n    <string name=\"overwrite_unrelated_warning\">Já existe um ficheiro com este nome</string>\n    <string name=\"error_http_unsupported_range\">O servidor não aceita transferências multi-processo, tente novamente com @string/msg_threads = 1</string>\n    <string name=\"detail_drag_description\">Arraste para reordenar</string>\n    <string name=\"recovering\">a recuperar</string>\n    <string name=\"dismiss\">Rejeitar</string>\n    <string name=\"playback_speed_control\">Controlos para velocidade de reprodução</string>\n    <string name=\"subscriptions_export_unsuccessful\">Não foi possível exportar as subscrições</string>\n    <string name=\"enable_disposed_exceptions_summary\">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</string>\n    <string name=\"recently_added\">Recentes</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s vídeo</item>\n        <item quantity=\"many\">%s vídeos</item>\n        <item quantity=\"other\">%s vídeos</item>\n    </plurals>\n    <string name=\"import_title\">Importar</string>\n    <string name=\"clear_views_history_summary\">Remove o histórico dos vídeos reproduzidos e as posições de reprodução</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dia</item>\n        <item quantity=\"many\">%d dias</item>\n        <item quantity=\"other\">%d dias</item>\n    </plurals>\n    <string name=\"pause_downloads\">Pausa nas transferências</string>\n    <string name=\"title_activity_recaptcha\">Desafio reCAPTCHA</string>\n    <string name=\"import_from\">Importar de</string>\n    <string name=\"one_item_deleted\">1 item eliminado.</string>\n    <string name=\"video_streams_empty\">Não foram encontrados vídeos</string>\n    <string name=\"kiosk_page_summary\">Página \\'kiosk\\'</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d hora</item>\n        <item quantity=\"many\">%d horas</item>\n        <item quantity=\"other\">%d horas</item>\n    </plurals>\n    <string name=\"auto_queue_title\">Adicionar o próximo vídeo à fila automaticamente</string>\n    <string name=\"peertube_instance_url_summary\">Defina as suas instâncias favoritas PeerTube</string>\n    <string name=\"export_data_summary\">Exportar histórico, subscrições, listas de reprodução e definições</string>\n    <string name=\"best_resolution\">Melhor resolução</string>\n    <string name=\"select_a_channel\">Selecione um canal</string>\n    <string name=\"stop\">Parar</string>\n    <string name=\"empty_list_subtitle\">Aqui não há nada para ver</string>\n    <string name=\"could_not_setup_download_menu\">Não foi possível configurar o menu de descargas</string>\n    <string name=\"limit_data_usage_none_description\">Sem limite</string>\n    <string name=\"general_error\">Erro</string>\n    <string name=\"clear_playback_states_title\">Limpar posições de reprodução</string>\n    <string name=\"import_ongoing\">A importar…</string>\n    <string name=\"fragment_feed_title\">Novidades</string>\n    <string name=\"local\">Local</string>\n    <string name=\"app_ui_crash\">Aplicação terminou em erro</string>\n    <string name=\"delete_item_search_history\">Deseja remover este item do histórico de pesquisas\\?</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Continuar reprodução</string>\n    <string name=\"app_license\">NewPipe é um software livre \\\"copyleft\\\": pode utilizar, estudar, partilhar e melhorar a aplicação. Especificamente, pode redistribuir e/ou modificar a aplicação nos termos da GNU General Public License, conforme publicada pela Free Software Foundation, tanto a versão 3 da licença ou (por opção) qualquer versão posterior.</string>\n    <string name=\"infinite_videos\">∞ vídeos</string>\n    <string name=\"export_ongoing\">A exportar…</string>\n    <string name=\"most_liked\">Mais apreciados</string>\n    <string name=\"downloads_storage_use_saf_title\">Utilizar seletor de pastas do sistema (SAF)</string>\n    <string name=\"play_queue_stream_detail\">Detalhes</string>\n    <string name=\"network_error\">Erro de rede</string>\n    <string name=\"enable_search_history_title\">Histórico de pesquisa</string>\n    <string name=\"drawer_header_description\">Alternar serviço atualmente selecionado:</string>\n    <string name=\"play_queue_remove\">Remover</string>\n    <string name=\"your_comment\">Comentários (em inglês):</string>\n    <string name=\"video_player\">Reprodutor de vídeo</string>\n    <string name=\"error_ssl_exception\">Não foi possível estabelecer uma ligação segura</string>\n    <string name=\"playlists\">Listas de reprodução</string>\n    <string name=\"start\">Iniciar</string>\n    <string name=\"download_already_pending\">Existe uma descarga pendente com este nome</string>\n    <string name=\"accept\">Aceitar</string>\n    <string name=\"what_happened_headline\">O que ocorreu:</string>\n    <string name=\"contribution_title\">Participar</string>\n    <string name=\"controls_background_title\">Segundo plano</string>\n    <string name=\"unknown_content\">[Desconhecido]</string>\n    <string name=\"peertube_instance_url_help\">Encontre as instâncias que gosta em %s</string>\n    <string name=\"select_a_kiosk\">Selecione um \\\"kiosk\\\"</string>\n    <string name=\"channels\">Canais</string>\n    <string name=\"max_retry_msg\">Tentativas máximas</string>\n    <string name=\"title_activity_history\">Histórico</string>\n    <string name=\"playback_pitch\">Velocidade</string>\n    <string name=\"error_download_resource_gone\">Não é possível recuperar esta descarga</string>\n    <string name=\"rename_playlist\">Mudar nome</string>\n    <string name=\"feed_group_dialog_empty_selection\">Nenhuma subscrição selecionada</string>\n    <string name=\"enable_watch_history_summary\">Manter histórico dos vídeos visualizados</string>\n    <string name=\"search_history_deleted\">Histórico de pesquisa removido</string>\n    <string name=\"clear_search_history_title\">Limpar histórico de pesquisas</string>\n    <string name=\"msg_error\">Erro</string>\n    <string name=\"popup_remember_size_pos_title\">Lembrar propriedades do popup</string>\n    <string name=\"download_path_summary\">Os ficheiros de vídeo descarregados serão guardados aqui</string>\n    <string name=\"switch_to_main\">Mudar para principal</string>\n    <string name=\"msg_popup_permission\">Esta permissão é necessária\n\\npara o modo popup</string>\n    <string name=\"no_videos\">Sem vídeos</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Miniatura do avatar do canal</string>\n    <string name=\"error_http_no_content\">O servidor não envia dados</string>\n    <string name=\"enable_disposed_exceptions_title\">Reportar erros \\'out-of-lifecycle\\'</string>\n    <string name=\"kore_not_found\">Instalar Kore\\?</string>\n    <string name=\"name\">Nome</string>\n    <string name=\"msg_copied\">Copiado para a área de transferência</string>\n    <string name=\"settings_file_charset_title\">Carateres permitidos no nome dos ficheiros</string>\n    <string name=\"caption_auto_generated\">Gerado automaticamente</string>\n    <string name=\"tab_bookmarks\">Listas de reprodução favoritas</string>\n    <string name=\"missions_header_pending\">Pendente</string>\n    <string name=\"import_complete_toast\">Importado</string>\n    <string name=\"auto\">Automático</string>\n    <string name=\"import_data_summary\">Substitui o seu histórico, subscrições, listas de reprodução e (opcionalmente) definições</string>\n    <string name=\"unbookmark_playlist\">Remover marcador</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Útil ao trocar para dados móveis, mas algumas transferências não podem ser suspensas</string>\n    <string name=\"hold_to_append\">Toque longo para colocar na fila</string>\n    <string name=\"downloads_title\">Transferências</string>\n    <string name=\"error_file_creation\">Não foi possível criar o ficheiro</string>\n    <string name=\"conferences\">Conferências</string>\n    <string name=\"saved_tabs_invalid_json\">Não foi possível ler as guias gravadas, portanto usando as guias predefinidas</string>\n    <string name=\"close\">Fechar</string>\n    <string name=\"caption_none\">Sem legendas</string>\n    <string name=\"website_title\">Site oficial</string>\n    <string name=\"tab_subscriptions\">Subscrições</string>\n    <string name=\"give_back\">Contribuir</string>\n    <string name=\"default_audio_format_title\">Formato padrão de áudio</string>\n    <string name=\"invalid_file\">O ficheiro não existe ou não tem permissões para ler e/ou escrever</string>\n    <string name=\"feed_group_dialog_empty_name\">O nome do grupo está vazio</string>\n    <string name=\"share_dialog_title\">Partilhar com</string>\n    <string name=\"feed_update_threshold_summary\">Tempo após a última atualização antes de a subscrição ser considerada desatualizada - %s</string>\n    <string name=\"search\">Pesquisar</string>\n    <string name=\"settings_category_updates_title\">Atualizações</string>\n    <string name=\"updates_setting_title\">Atualizações</string>\n    <string name=\"start_downloads\">Iniciar transferências</string>\n    <string name=\"enable_search_history_summary\">Guardar termos de pesquisa localmente</string>\n    <string name=\"unsupported_url\">URL não suportado</string>\n    <string name=\"download_dialog_title\">Descarregar</string>\n    <string name=\"app_license_title\">Licença do NewPipe</string>\n    <string name=\"file_deleted\">Ficheiro eliminado</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Ativar modo rápido</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Miniatura do avatar do canal</string>\n    <string name=\"popup_player\">Reprodutor \\'popup\\'</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"watch_history_states_deleted\">Posições de reprodução removidas</string>\n    <string name=\"downloads_storage_ask_title\">Perguntar para onde transferir</string>\n    <string name=\"show_info\">Mostrar informação</string>\n    <string name=\"clear_views_history_title\">Limpar histórico de visualizações</string>\n    <string name=\"download_to_sdcard_error_message\">Não é possível guardar no cartão SD. Repor pasta de descargas\\?</string>\n    <string name=\"checksum\">Soma de controlo</string>\n    <string name=\"enable_playback_resume_summary\">Restaurar última posição de reprodução</string>\n    <string name=\"minimize_on_exit_popup_description\">Ativar reprodutor \\'popup\\'</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Se possível, obter de uma fonte dedicada</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Selecionar subscrições</string>\n    <string name=\"playlist_add_stream_success\">Adicionado à lista de reprodução</string>\n    <string name=\"default_video_format_title\">Formato padrão de vídeo</string>\n    <string name=\"show_hold_to_append_title\">Mostrar dica \\\"Toque longo para enfileirar\\\"</string>\n    <string name=\"choose_instance_prompt\">Escolha uma instância</string>\n    <string name=\"metadata_cache_wipe_summary\">Limpar todos os dados da página web</string>\n    <string name=\"drawer_close\">Fechar menu</string>\n    <string name=\"remove_watched\">Remover visualizados</string>\n    <string name=\"settings_file_replacement_character_title\">Carácter de substituição</string>\n    <string name=\"video\">Vídeo</string>\n    <string name=\"no_streams_available_download\">Não existem vídeos para descarregar</string>\n    <string name=\"download_path_audio_summary\">Os ficheiros de áudio descarregados serão guardados aqui</string>\n    <string name=\"videos_string\">Vídeos</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Meta-dados em cache limpos</string>\n    <string name=\"show_hold_to_append_summary\">Mostrar dica ao premir em segundo plano ou no botão \\\"Detalhes:\\\" da janela popup</string>\n    <string name=\"no_player_found_toast\">Não foi encontrado um reprodutor (pode instalar o VLC para reproduzir).</string>\n    <string name=\"downloads_storage_ask_summary\">Ser-lhe-á perguntado onde guardar cada transferência.\n\\nAtive o seletor de pastas do sistema (SAF) se quiser transferir para um cartão SD externo</string>\n    <string name=\"show_play_with_kodi_title\">Mostrar opção \\\"Reproduzir no Kodi\\\"</string>\n    <string name=\"search_no_results\">Sem resultados</string>\n    <string name=\"disabled\">Desativado</string>\n    <string name=\"trending\">Tendências</string>\n    <string name=\"always_ask_open_action\">Perguntar sempre</string>\n    <string name=\"error_timeout\">Ligação expirada</string>\n    <string name=\"show_higher_resolutions_summary\">Apenas alguns dispositivos conseguem reproduzir vídeos em 2K/4K</string>\n    <string name=\"settings_category_appearance_title\">Aparência</string>\n    <string name=\"donation_title\">Doar</string>\n    <string name=\"error_report_open_github_notice\">Verifique se o seu erro já foi reportado. A criação de erros em duplicado tira-nos tempo que pode ser utilizado para corrigir os erros.</string>\n    <string name=\"content_not_available\">Conteúdo indisponível</string>\n    <string name=\"subscribed_button_title\">Subscrito</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Cache de imagens limpa</string>\n    <string name=\"tab_about\">Sobre e perguntas frequentes</string>\n    <string name=\"subscribers_count_not_available\">Contagem de subscrições indisponível</string>\n    <string name=\"preferred_open_action_settings_summary\">Ação padrão ao abrir o conteúdo — %s</string>\n    <string name=\"playback_reset\">Repor</string>\n    <string name=\"use_inexact_seek_title\">Utilizar pesquisa rápida</string>\n    <string name=\"override_current_data\">Está prestes a substituir a configuração atual.</string>\n    <string name=\"switch_to_popup\">Mudar para popup</string>\n    <string name=\"add_to_playlist\">Adicionar à lista de reprodução</string>\n    <string name=\"popup_playing_toast\">Reproduzir no modo poppup</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">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\\n\n\\nNewPipe oferece duas estratégias de carregamento:\n\\n- Obter todo o canal de subscrição - lento, mas completo.\n\\n- Usar um \\'endpoint\\' dedicado - mais rápido, mas não completo.\n\\n\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.\n\\n\n\\nO YouTube é um exemplo de um serviço que oferece este método rápido com a sua fonte RSS.\n\\n\n\\nAssim, a escolha resume-se ao que prefere: velocidade ou informação precisa.</string>\n    <string name=\"open_in_popup_mode\">Abrir no modo popup</string>\n    <string name=\"pause\">Pausa</string>\n    <string name=\"preferred_player_fetcher_notification_message\">A carregar o conteúdo solicitado</string>\n    <string name=\"channel_page_summary\">Página do canal</string>\n    <string name=\"export_data_title\">Exportar base de dados</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Mostrar apenas subscrições não agrupadas</string>\n    <string name=\"player_stream_failure\">Não foi possível reproduzir este vídeo</string>\n    <string name=\"background_player\">Reprodutor em segundo plano</string>\n    <string name=\"show_error\">Mostrar erro</string>\n    <string name=\"caption_setting_description\">Modificar escala de legendas e estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações</string>\n    <string name=\"permission_denied\">Ação recusada pelo sistema</string>\n    <string name=\"songs\">Músicas</string>\n    <string name=\"peertube_instance_add_title\">Adicionar instância</string>\n    <string name=\"tracks\">Faixas</string>\n    <string name=\"play_with_kodi_title\">Reproduzir no Kodi</string>\n    <string name=\"download_to_sdcard_error_title\">Armazenamento externo indisponível</string>\n    <string name=\"download_failed\">Falha ao descarregar</string>\n    <string name=\"error_snackbar_action\">Relatório</string>\n    <string name=\"msg_running_detail\">Toque para detalhes</string>\n    <string name=\"paused\">em pausa</string>\n    <string name=\"show_comments_title\">Mostrar comentários</string>\n    <string name=\"done\">Concluído</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Desativar modo rápido</string>\n    <string name=\"never\">Nunca</string>\n    <string name=\"wifi_only\">Apenas em Wi-Fi</string>\n    <string name=\"autoplay_summary\">Iniciar reprodução automaticamente — %s</string>\n    <string name=\"title_activity_play_queue\">Reproduzir fila</string>\n    <string name=\"unsupported_url_dialog_message\">URL não reconhecido. Abrir com outra aplicação\\?</string>\n    <string name=\"auto_queue_toggle\">Enfileiramento automático</string>\n    <string name=\"clear_queue_confirmation_description\">A fila do reprodutor ativo será substituída</string>\n    <string name=\"clear_queue_confirmation_summary\">Mudar de um reprodutor para outro pode substituir a sua fila</string>\n    <string name=\"clear_queue_confirmation_title\">Pedir confirmação antes de limpar uma fila</string>\n    <string name=\"popup_remember_size_pos_summary\">Lembrar último tamanho e posição do popup</string>\n    <string name=\"notification_action_nothing\">Nada</string>\n    <string name=\"notification_action_buffering\">A carregar</string>\n    <string name=\"notification_action_shuffle\">Baralhar</string>\n    <string name=\"notification_action_repeat\">Repetir</string>\n    <string name=\"notification_actions_at_most_three\">Pode selecionar, no máximo, três ações para mostrar na notificação compacta!</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_action_4_title\">Quinto botão de ação</string>\n    <string name=\"notification_action_3_title\">Quarto botão de ação</string>\n    <string name=\"notification_action_2_title\">Terceiro botão de ação</string>\n    <string name=\"notification_action_1_title\">Segundo botão de ação</string>\n    <string name=\"notification_action_0_title\">Primeiro botão de ação</string>\n    <string name=\"notification_scale_to_square_image_summary\">Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 (pode introduzir distorções)</string>\n    <string name=\"notification_scale_to_square_image_title\">Cortar miniatura na proporção 1:1</string>\n    <string name=\"show_memory_leaks\">Mostrar \\'leaks\\' de memória</string>\n    <string name=\"enqueued\">Colocado na fila</string>\n    <string name=\"enqueue_stream\">Colocar na fila</string>\n    <string name=\"clear_cookie_summary\">Limpar cookies que NewPipe armazena quando resolve um reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Os cookies reCAPTCHA foram limpos</string>\n    <string name=\"clear_cookie_title\">Limpar cookies reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">O YouTube fornece um \\\"Modo restrito\\\" que oculta o conteúdo destinado a adultos</string>\n    <string name=\"show_age_restricted_content_summary\">Mostrar conteúdo possivelmente impróprio para crianças porque tem um limite de idade (como 18+)</string>\n    <string name=\"notification_colorize_summary\">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)</string>\n    <string name=\"notification_colorize_title\">Colorir notificação</string>\n    <string name=\"show_thumbnail_summary\">Usar miniaturas no fundo do ecrã de bloqueio e em notificações</string>\n    <string name=\"show_thumbnail_title\">Mostrar miniatura</string>\n    <string name=\"recent\">Recentes</string>\n    <string name=\"msg_calculating_hash\">A calcular \\'hash\\'</string>\n    <string name=\"hash_channel_description\">Notificar sobre o progresso das \\'hash\\' de vídeos</string>\n    <string name=\"hash_channel_name\">Notificação \\'hash\\' do vídeo</string>\n    <string name=\"show_meta_info_summary\">Desative para ocultar as caixas com informações adicionais acerca do criador, do conteúdo ou de um pedido de pesquisa</string>\n    <string name=\"show_meta_info_title\">Mostrar meta-informação</string>\n    <string name=\"no_app_to_open_intent\">Não possui qualquer aplicação para abrir este ficheiro</string>\n    <string name=\"chapters\">Capítulos</string>\n    <string name=\"description_tab_description\">Descrição</string>\n    <string name=\"related_items_tab_description\">Emissões relacionadas</string>\n    <string name=\"comments_tab_description\">Comentários</string>\n    <string name=\"show_description_summary\">Desative para ocultar a descrição do vídeo e informações adicionais</string>\n    <string name=\"show_description_title\">Mostrar descrição</string>\n    <string name=\"open_with\">Abrir com</string>\n    <string name=\"crash_the_app\">A app travou</string>\n    <string name=\"paid_content\">Este conteúdo só está disponível para utilizadores que pagaram, portanto não pode ser transmitido ou descarregado pelo NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Este vídeo está disponível apenas para os membros do YouTube Music Premium, portanto não pode ser transmitido ou descarregado pelo NewPipe.</string>\n    <string name=\"private_content\">Este conteúdo é privado, portanto não pode ser transmitido ou descarregado pelo NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Esta é uma faixa de SoundCloud Go+, pelo menos no seu país, pelo que não pode ser transmitida ou descarregada por NewPipe.</string>\n    <string name=\"georestricted_content\">Este conteúdo não está disponível no seu país.</string>\n    <string name=\"restricted_video_no_stream\">Este vídeo tem uma restrição de idade.\n\\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.</string>\n    <string name=\"radio\">Rádio</string>\n    <string name=\"featured\">Destaques</string>\n    <string name=\"recaptcha_solve\">Resolver</string>\n    <string name=\"download_has_started\">Descarga iniciada</string>\n    <string name=\"select_night_theme_toast\">Pode escolher o seu tema escuro favorito abaixo</string>\n    <string name=\"night_theme_summary\">Escolha o seu tema escuro favorito — %s</string>\n    <string name=\"auto_device_theme_title\">Automático (Tema do dispositivo)</string>\n    <string name=\"night_theme_title\">Tema escuro</string>\n    <string name=\"show_channel_details\">Mostrar detalhes do canal</string>\n    <string name=\"disable_media_tunneling_summary\">Desactive o túnel multimédia se tiver um ecrã preto ou gaguejo na reprodução de vídeo.</string>\n    <string name=\"disable_media_tunneling_title\">Desativar túnel multimédia</string>\n    <string name=\"off\">Desligado</string>\n    <string name=\"on\">Ligado</string>\n    <string name=\"tablet_mode_title\">Modo tablet</string>\n    <string name=\"open_website_license\">Abrir site de web</string>\n    <string name=\"detail_heart_img_view_description\">Entusiasmado pelo criador</string>\n    <string name=\"metadata_privacy_internal\">Interno</string>\n    <string name=\"metadata_privacy_private\">Privado</string>\n    <string name=\"metadata_privacy_unlisted\">Não listado</string>\n    <string name=\"metadata_privacy_public\">Público</string>\n    <string name=\"metadata_host\">Servidor</string>\n    <string name=\"metadata_support\">Apoio</string>\n    <string name=\"metadata_language\">Idioma</string>\n    <string name=\"metadata_age_limit\">Limite de idade</string>\n    <string name=\"metadata_privacy\">Privacidade</string>\n    <string name=\"metadata_licence\">Licença</string>\n    <string name=\"metadata_tags\">Marcadores</string>\n    <string name=\"metadata_category\">Categoria</string>\n    <string name=\"description_select_disable\">Desativar seleção de texto na descrição</string>\n    <string name=\"description_select_enable\">Ativar seleção de texto na descrição</string>\n    <string name=\"description_select_note\">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.</string>\n    <string name=\"account_terminated\">Conta encerrada</string>\n    <string name=\"feed_load_error_fast_unknown\">O modo de feed rápido não fornece mais informações sobre isto.</string>\n    <string name=\"feed_load_error_terminated\">A conta do autor foi encerrada.\n\\nNewPipe não será capaz de carregar este feed no futuro.\n\\nQuer cancelar a inscrição deste canal\\?</string>\n    <string name=\"feed_load_error_account_info\">Não foi possível carregar o feed para \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Erro ao carregar o feed</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">A partir do Android 10, apenas o \\'Storage Access Framework\\' é compatível</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Sempre que descarregar um ficheiro, terá que indicar o local para o guardar</string>\n    <string name=\"dont_show\">Não mostrar</string>\n    <string name=\"low_quality_smaller\">Baixa qualidade (menor)</string>\n    <string name=\"high_quality_larger\">Alta qualidade (maior)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Pré-visualização da miniatura da barra de pesquisa</string>\n    <string name=\"no_dir_yet\">Ainda não foi definida uma pasta de descarregamento, escolha agora a pasta de descarregamento padrão</string>\n    <string name=\"comments_are_disabled\">Comentários estão desativados</string>\n    <string name=\"mark_as_watched\">Marcar como visto</string>\n    <string name=\"remote_search_suggestions\">Sugestões de pesquisa remotas</string>\n    <string name=\"local_search_suggestions\">Sugestões de pesquisa locais</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s descarga eliminada</item>\n        <item quantity=\"many\">%1$s descargas eliminadas</item>\n        <item quantity=\"other\">%1$s descargas eliminadas</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Download concluído</item>\n        <item quantity=\"many\">%s Transferências concluídas</item>\n        <item quantity=\"other\">%s Transferências concluídas</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Deslizar itens para removê-los</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"start_main_player_fullscreen_title\">Iniciar reprodutor principal em ecrã completo</string>\n    <string name=\"enqueued_next\">Enfileirado o próximo</string>\n    <string name=\"enqueue_next_stream\">Pôr na fila o próximo</string>\n    <string name=\"processing_may_take_a_moment\">A processar… Pode demorar um momento</string>\n    <string name=\"check_for_updates\">Procurar atualizações</string>\n    <string name=\"manual_update_description\">Verificar manualmente se existe uma nova versão</string>\n    <string name=\"checking_updates_toast\">A procurar atualizações…</string>\n    <string name=\"feed_new_items\">Novos itens</string>\n    <string name=\"crash_the_player\">Travar o reprodutor</string>\n    <string name=\"show_crash_the_player_title\">Mostrar \\\"Travar o reprodutor\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Mostra uma opção de travamento ao usar o reprodutor</string>\n    <string name=\"error_report_channel_name\">Notificação de relatório de erros</string>\n    <string name=\"error_report_channel_description\">Notificações para reportar erros</string>\n    <string name=\"error_report_notification_title\">NewPipe encontrou um erro, toque para relatar</string>\n    <string name=\"error_report_notification_toast\">Ocorreu um erro, veja a notificação</string>\n    <string name=\"show_error_snackbar\">Mostrar um snackbar de erro</string>\n    <string name=\"create_error_notification\">Criar uma notificação de erro</string>\n    <string name=\"no_appropriate_file_manager_message\">Nenhum gestor de ficheiros apropriado foi encontrado para esta ação.\n\\nPor favor, instale um gestor de ficheiros ou tente desativar \\'%s\\' nas configurações de descarregar</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Nenhum gestor de ficheiros apropriado foi encontrado para esta ação.\n\\nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework</string>\n    <string name=\"detail_pinned_comment_view_description\">Comentário fixado</string>\n    <string name=\"leak_canary_not_available\">LeakCanary não está disponível</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Predefinido do ExoPlayer</string>\n    <string name=\"notifications\">Notificações</string>\n    <string name=\"loading_stream_details\">A carregar detalhes do vídeo…</string>\n    <string name=\"check_new_streams\">Verificar se há novos vídeos</string>\n    <string name=\"enable_streams_notifications_title\">Notificações sobre novos vídeos</string>\n    <string name=\"streams_notifications_interval_title\">Frequência da verificação</string>\n    <string name=\"delete_downloaded_files_confirm\">Eliminar todos os ficheiros descarregados do disco?</string>\n    <string name=\"notifications_disabled\">Notificações são desativadas</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s vídeo novo</item>\n        <item quantity=\"many\">%s vídeos novos</item>\n        <item quantity=\"other\">%s vídeos novos</item>\n    </plurals>\n    <string name=\"enable_streams_notifications_summary\">Notificar sobre novos vídeos nas assinaturas</string>\n    <string name=\"streams_notifications_network_title\">Conexão de rede necessária</string>\n    <string name=\"any_network\">Qualquer rede</string>\n    <string name=\"toggle_all\">Alternar tudo</string>\n    <string name=\"streams_notification_channel_description\">Notificações sobre novos vídeos para assinaturas</string>\n    <string name=\"settings_category_player_notification_title\">Notificação do reprodutor</string>\n    <string name=\"settings_category_player_notification_summary\">Configurar a notificação da reprodução do vídeo atual</string>\n    <string name=\"get_notified\">Seja notificado</string>\n    <string name=\"you_successfully_subscribed\">Agora assinou este canal</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"streams_notification_channel_name\">Novos vídeos</string>\n    <string name=\"percent\">Por cento</string>\n    <string name=\"semitone\">Semitom</string>\n    <string name=\"no_video_streams_available_for_external_players\">Não estão disponíveis transmissões de vídeo a reprodutores externos</string>\n    <string name=\"streams_not_yet_supported_removed\">As transmissões que ainda não são suportadas para descarregamento não são mostradas</string>\n    <string name=\"selected_stream_external_player_not_supported\">A transmissão selecionada não é suportada por reprodutores externos</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Não estão disponíveis transmissões de áudio a reprodutores externos</string>\n    <string name=\"unknown_format\">Formato desconhecido</string>\n    <string name=\"unknown_quality\">Qualidade desconhecida</string>\n    <string name=\"select_quality_external_players\">Selecione a qualidade para reprodutores externos</string>\n    <string name=\"progressive_load_interval_title\">Tamanho do intervalo de carregamento da reprodução</string>\n    <string name=\"faq_title\">Perguntas frequentes</string>\n    <string name=\"faq_description\">Se está a ter problemas a usar a aplicação, veja estas respostas para perguntas mais comuns!</string>\n    <string name=\"faq\">Ver no site</string>\n    <string name=\"fast_mode\">Modo rápido</string>\n    <string name=\"import_subscriptions_hint\">Importar ou exportar subscrições do menu de 3 pontos</string>\n    <string name=\"app_update_unavailable_toast\">Já está a executar a versão mais recente do NewPipe</string>\n    <string name=\"app_update_available_notification_text\">Toque para descarregar %s</string>\n    <string name=\"sort\">Ordenação</string>\n    <string name=\"night_theme_available\">Esta opção só está disponível se estiver selecionado %s para o tema</string>\n    <string name=\"unset_playlist_thumbnail\">Desativar miniatura permanente</string>\n    <string name=\"msg_failed_to_copy\">Não foi possível copiar para a área de transferência</string>\n    <string name=\"card\">Cartão</string>\n    <string name=\"duplicate_in_playlist\">As listas de reprodução acinzentadas já contêm este item.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplicar adicionado %d vez(es)</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorar eventos com botões físicos</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Útil por exemplo se estiver a utilizar auscultadores com botões físicos danificados</string>\n    <string name=\"remove_duplicates\">Remover duplicados</string>\n    <string name=\"feed_hide_streams_title\">Mostrar os seguintes vídeos</string>\n    <string name=\"feed_show_hide_streams\">Mostrar/ocultar vídeos</string>\n    <string name=\"feed_show_watched\">Completamente visto</string>\n    <string name=\"feed_show_partially_watched\">Parcialmente visto</string>\n    <string name=\"feed_show_upcoming\">Proximamente</string>\n    <string name=\"remove_duplicates_title\">Remover duplicados\\?</string>\n    <string name=\"remove_duplicates_message\">Quer remover todos os vídeos duplicados nesta lista de reprodução\\?</string>\n    <string name=\"left_gesture_control_title\">Ação do gesto para a esquerda</string>\n    <string name=\"right_gesture_control_title\">Ação do gesto para a direita</string>\n    <string name=\"brightness\">Brilho</string>\n    <string name=\"volume\">Volume</string>\n    <string name=\"none\">Nenhum</string>\n    <string name=\"left_gesture_control_summary\">Escolha o gesto para a metade esquerda do ecrã do reprodutor</string>\n    <string name=\"right_gesture_control_summary\">Escolha o gesto para a metade direita do ecrã do reprodutor</string>\n    <string name=\"play_queue_audio_track\">Áudio: %s</string>\n    <string name=\"audio_track\">Faixa de áudio</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Usar sempre a configuração de saída alternativa de vídeo do ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\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</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"audio_track_type_dubbed\">dobrado</string>\n    <string name=\"audio_track_type_descriptive\">descritivo</string>\n    <string name=\"progressive_load_interval_summary\">Altera o tamanho do intervalo de carregamento progressivo (o atual é %s). Um valor menor pode acelerar o carregamento inicial do vídeo</string>\n    <string name=\"prefer_original_audio_title\">Dar preferência ao áudio original</string>\n    <string name=\"prefer_original_audio_summary\">Selecionar o áudio original independentemente do idioma</string>\n    <string name=\"prefer_descriptive_audio_title\">Dar preferência ao áudio descritivo</string>\n    <string name=\"prefer_descriptive_audio_summary\">Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível</string>\n    <string name=\"audio_track_present_in_video\">Já deve existir uma faixa de áudio nesta transmissão</string>\n    <string name=\"select_audio_track_external_players\">Selecionar faixa de áudio para reprodutores externos</string>\n    <string name=\"unknown_audio_track\">Desconhecida</string>\n    <string name=\"settings_category_exoplayer_title\">Configurações ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">Gere algumas configurações de ExoPlayer. É necessário reiniciar o reprodutor para aplicar as alterações</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Utilizar a função de fallback do descodificador do ExoPlayer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"main_tabs_position_summary\">Mova o seletor da guia principal para a parte inferior</string>\n    <string name=\"main_tabs_position_title\">Posição das guias principais</string>\n    <string name=\"disable_media_tunneling_automatic_info\">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.</string>\n    <string name=\"no_live_streams\">Nenhum vídeo em direto</string>\n    <string name=\"no_streams\">Nenhum vídeo</string>\n    <string name=\"image_quality_title\">Qualidade da imagem</string>\n    <string name=\"channel_tab_videos\">Vídeos</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Subscritores</string>\n    <string name=\"show_channel_tabs_summary\">Os separadores a mostrar na página Canal</string>\n    <string name=\"share_playlist_with_list\">Partilhar lista de URLs</string>\n    <string name=\"share_playlist_with_titles\">Partilhar com títulos</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_channel_tabs\">Separadores do canal</string>\n    <string name=\"channel_tab_shorts\">Curtos</string>\n    <string name=\"loading_metadata_title\">A carregar metadados…</string>\n    <string name=\"toggle_screen_orientation\">Alternar orientação do ecrã</string>\n    <string name=\"image_quality_low\">Baixa qualidade</string>\n    <string name=\"toggle_fullscreen\">Alternar ecrã completo</string>\n    <string name=\"feed_fetch_channel_tabs\">Obter separadores de canais</string>\n    <string name=\"metadata_avatars\">Avatars</string>\n    <string name=\"next_stream\">Fluxo seguinte</string>\n    <string name=\"metadata_subchannel_avatars\">Avatar de subcanais</string>\n    <string name=\"open_play_queue\">Abrir fila de reprodução</string>\n    <string name=\"image_quality_none\">Não carregar imagens</string>\n    <string name=\"image_quality_high\">Alta qualidade</string>\n    <string name=\"channel_tab_about\">Sobre</string>\n    <string name=\"share_playlist\">Partilhar lista de reprodução</string>\n    <string name=\"forward\">Avançar</string>\n    <string name=\"channel_tab_albums\">Álbuns</string>\n    <string name=\"rewind\">Recuar</string>\n    <string name=\"replay\">Repetição</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Separadores a obter ao atualizar o feed. Esta opção não tem efeito se um canal for atualizado utilizando o modo rápido.</string>\n    <string name=\"image_quality_medium\">Média qualidade</string>\n    <string name=\"metadata_uploader_avatars\">Avatar dos publicadores</string>\n    <string name=\"metadata_banners\">Bandeiras</string>\n    <string name=\"channel_tab_playlists\">Listas de reprodução</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"play\">Reproduzir</string>\n    <string name=\"more_options\">Mais opções</string>\n    <string name=\"metadata_thumbnails\">Miniaturas</string>\n    <string name=\"channel_tab_tracks\">Faixas</string>\n    <string name=\"duration\">Duração</string>\n    <string name=\"channel_tab_channels\">Canais</string>\n    <string name=\"previous_stream\">Fluxo anterior</string>\n    <string name=\"channel_tab_livestreams\">Direto</string>\n    <string name=\"show_more\">Mostrar mais</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s resposta</item>\n        <item quantity=\"many\">%s respostas</item>\n        <item quantity=\"other\">%s respostas</item>\n    </plurals>\n    <string name=\"show_less\">Mostrar menos</string>\n    <string name=\"auto_update_check_description\">O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis.\n\\nDeseja ativar essa opção?</string>\n    <string name=\"reset_settings_summary\">Repor valores originais de todas as definições</string>\n    <string name=\"reset_all_settings\">A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará a aplicação.\n\\n\n\\nTem certeza que deseja continuar?</string>\n    <string name=\"yes\">Sim</string>\n    <string name=\"no\">Não</string>\n    <string name=\"settings_category_backup_restore_title\">Cópia de segurança e restauro</string>\n    <string name=\"reset_settings_title\">Repor definições</string>\n    <string name=\"error_insufficient_storage\">Não há espaço suficiente no aparelho</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">secundário</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Partilhar como lista de reprodução temporária do YouTube</string>\n    <string name=\"tab_bookmarks_short\">Listas de reprodução</string>\n    <string name=\"select_a_feed_group\">Selecione um grupo de feeds</string>\n    <string name=\"no_feed_group_created_yet\">Ainda nenhum grupo de feeds criado</string>\n    <string name=\"feed_group_page_summary\">Página do grupo do canal</string>\n    <string name=\"search_with_service_name\">Pesquisar %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Pesquisar %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Gostos</string>\n    <string name=\"migration_info_6_7_title\">Página Top 50 do SoundCloud removida</string>\n    <string name=\"migration_info_6_7_message\">O SoundCloud descontinuou os gráficos originais do Top 50. A guia correspondente foi removida da sua página principal.</string>\n    <string name=\"migration_info_7_8_title\">Tendência combinada do YouTube removida</string>\n    <string name=\"migration_info_7_8_message\">O YouTube descontinuou a página de tendência combinada a partir de 21 de julho de 2025. O NewPipe substituiu a página de tendência predefinida com as streams ao vivo de tendência.\\n\\nTambém pode escolher páginas de tendência diferentes em \\\"Definições &gt; Conteúdo &gt; Conteúdo da página principal\\\".</string>\n    <string name=\"trending_gaming\">Tendências de jogos</string>\n    <string name=\"trending_podcasts\">Tendências de podcasts</string>\n    <string name=\"trending_movies\">Tendências de filmes e shows</string>\n    <string name=\"trending_music\">Tendências de música</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"permission_display_over_apps_message\">Para usar o reprodutor pop-up, escolhe %1$s no menu seguinte de configurações do Android e ative %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">“Permitir exibição sobre outras apps”</string>\n    <string name=\"delete_file\">Apagar ficheiro</string>\n    <string name=\"delete_entry\">Apagar entrada</string>\n    <string name=\"entry_deleted\">Entrada apagada</string>\n    <string name=\"account_terminated_service_provides_reason\">Conta terminada\\n\\n%1$s fornece esta razão: %2$s</string>\n    <string name=\"player_http_invalid_status\">Erro HTTP %1$s recebido do servidor ao reproduzir</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s recusou fornecer dados, pedindo por um login para confirmar que o solicitante não é um bot.\\n\\nO seu IP pode ter sido temporariamente banido por %1$s, pode esperar algum tempo ou mudar para um IP diferente (por exemplo, a ligar / desligar uma VPN, ou a alternar de Wi-Fi para dados móveis).</string>\n    <string name=\"unsupported_content_in_country\">Este conteúdo não está disponível para o país de conteúdo atualmente selecionado.\\n\\nAltere a sua seleção de \\\"Configurações &gt; Conteúdo &gt; País predefinido de conteúdo\\\".</string>\n    <string name=\"player_http_403\">Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado pela URL de streaming expirado ou IP banido</string>\n    <string name=\"youtube_player_http_403\">Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um bloqueio de IP ou problemas de desofuscação da URL de streaming</string>\n    <string name=\"kao_dialog_warning\">Em agosto de 2025, o Google anunciou que, a partir de setembro de 2026, a instalação de apps exigirá a verificação do programador para todas as apps Android em dispositivos certificados, incluindo aqueles instalados fora da Play Store. Como os programadores do NewPipe não concordam com este requisito, o NewPipe já não funcionará em dispositivos Android certificados após essa data.</string>\n    <string name=\"kao_dialog_more_info\">Pormenores</string>\n    <string name=\"kao_solution\">Solução</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ro/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Publicat pe %1$s</string>\n    <string name=\"no_player_found\">Niciun player pentru streaming găsit. Instalați VLC\\?</string>\n    <string name=\"install\">Instalare</string>\n    <string name=\"cancel\">Anulare</string>\n    <string name=\"open_in_browser\">Deschidere în browser</string>\n    <string name=\"share\">Distribuire</string>\n    <string name=\"download\">Descărcare</string>\n    <string name=\"search\">Căutare</string>\n    <string name=\"settings\">Setări</string>\n    <string name=\"did_you_mean\">V-ați referit la: %1$s \\?</string>\n    <string name=\"share_dialog_title\">Distribuiți cu</string>\n    <string name=\"use_external_video_player_title\">Folosiți un player video extern</string>\n    <string name=\"use_external_audio_player_title\">Folosește un player audio extern</string>\n    <string name=\"download_path_title\">Locația videoclipurilor descărcate</string>\n    <string name=\"download_path_summary\">Videoclipurile descărcate sunt stocate aici</string>\n    <string name=\"download_path_dialog_title\">Alegeți folderul de descărcare pentru fișierele video</string>\n    <string name=\"download_path_audio_title\">Dosar de descărcări audio</string>\n    <string name=\"download_path_audio_summary\">Fișierele audio descărcate sunt stocate aici</string>\n    <string name=\"download_path_audio_dialog_title\">Alegeți folderul de descărcare pentru fișierele audio</string>\n    <string name=\"default_resolution_title\">Rezoluție implicită</string>\n    <string name=\"play_with_kodi_title\">Redați folosind Kodi</string>\n    <string name=\"kore_not_found\">Aplicația Kore nu a fost găsită. Doriți să o instalați?</string>\n    <string name=\"show_play_with_kodi_title\">Arată opțiunea \\\"Redați folosind Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Arată opțiunea de redare a videoclipurilor via player-ului media Kodi</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"default_audio_format_title\">Format audio implicit</string>\n    <string name=\"theme_title\">Temă</string>\n    <string name=\"dark_theme_title\">Întunecat</string>\n    <string name=\"light_theme_title\">Luminos</string>\n    <string name=\"download_dialog_title\">Descărcați</string>\n    <string name=\"show_next_and_similar_title\">Arată videoclipurile care \\'Urmează\\' și cele \\'Similare\\'</string>\n    <string name=\"unsupported_url\">URL nesuportat</string>\n    <string name=\"content_language_title\">Limba dorită a conținutului</string>\n    <string name=\"settings_category_video_audio_title\">Video și Audio</string>\n    <string name=\"settings_category_appearance_title\">Aspect</string>\n    <string name=\"background_player_playing_toast\">Redare în fundal</string>\n    <string name=\"content\">Conținut</string>\n    <string name=\"show_age_restricted_content_title\">Afișați conținutul restricționat de vârstă</string>\n    <string name=\"general_error\">Eroare</string>\n    <string name=\"network_error\">Eroare de rețea</string>\n    <string name=\"could_not_load_thumbnails\">Nu s-au putut încărca toate miniaturile</string>\n    <string name=\"parsing_error\">Nu s-a putut analiza site-ul web</string>\n    <string name=\"content_not_available\">Conținut indisponibil</string>\n    <string name=\"could_not_setup_download_menu\">Nu s-a putut configura meniul de descărcare</string>\n    <string name=\"detail_thumbnail_view_description\">Redare video, durata:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Miniatura avatarului autorului</string>\n    <string name=\"detail_likes_img_view_description\">Au apreciat</string>\n    <string name=\"detail_dislikes_img_view_description\">Nu au apreciat</string>\n    <string name=\"main_bg_subtitle\">Apăsați pe lupă pentru a începe.</string>\n    <string name=\"duration_live\">În direct</string>\n    <string name=\"downloads\">Descărcări</string>\n    <string name=\"downloads_title\">Descărcări</string>\n    <string name=\"error_report_title\">Raport de erori</string>\n    <string name=\"sorry_string\">Ne pare rău, asta nu trebuia să se întâmple.</string>\n    <string name=\"error_report_button_text\">Raport prin e-mail</string>\n    <string name=\"error_snackbar_message\">Ne pare rău, ceva a mers prost.</string>\n    <string name=\"error_snackbar_action\">Raportați</string>\n    <string name=\"what_device_headline\">Informații:</string>\n    <string name=\"what_happened_headline\">Ce s-a întâmplat:</string>\n    <string name=\"your_comment\">Comentariul dvs. (în engleză):</string>\n    <string name=\"error_details_headline\">Detalii:</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"retry\">Reîncercare</string>\n    <string name=\"start\">Start</string>\n    <string name=\"pause\">Pauză</string>\n    <string name=\"delete\">Ștergeți</string>\n    <string name=\"checksum\">Suma de control</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Numele fișierului</string>\n    <string name=\"msg_threads\">Fire</string>\n    <string name=\"msg_error\">Eroare</string>\n    <string name=\"msg_running\">NewPipe descarcă</string>\n    <string name=\"msg_running_detail\">Atingeți pentru detalii</string>\n    <string name=\"msg_wait\">Vă rugăm așteptați…</string>\n    <string name=\"msg_copied\">Copiat în clipboard</string>\n    <string name=\"no_available_dir\">Vă rugăm să definiți un folder de descărcare mai târziu în setări</string>\n    <string name=\"open_in_popup_mode\">Deschidere în modul popup</string>\n    <string name=\"msg_popup_permission\">Această permisiune este necesară pentru a \n\\ndeschide în mod pop-up</string>\n    <string name=\"title_activity_recaptcha\">Provocare reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Provocare reCAPTCHA solicitată</string>\n    <string name=\"default_popup_resolution_title\">Rezoluția implicită a ferestrei pop-up</string>\n    <string name=\"show_higher_resolutions_title\">Afișează rezoluții mai mari</string>\n    <string name=\"show_higher_resolutions_summary\">Doar anumite dispozitive suportă redarea videoclipurilor 2K/4K</string>\n    <string name=\"default_video_format_title\">Format video implicit</string>\n    <string name=\"black_theme_title\">Negru</string>\n    <string name=\"popup_playing_toast\">Redare în mod pop-up</string>\n    <string name=\"all\">Toate</string>\n    <string name=\"disabled\">Dezactivat</string>\n    <string name=\"app_ui_crash\">Aplicația/UI s-a oprit</string>\n    <string name=\"info_labels\">Ce:\\nSolicitare:\\nLimba conținutului:\\nȚara conținutului:\\nLimba aplicației:\\nServiciu:\\nOra GMT:\\nPachet:\\nVersiune:\\nVersiune SO:</string>\n    <string name=\"use_external_video_player_summary\">Elimină sunetul audio la anumite rezoluții</string>\n    <string name=\"controls_background_title\">Fundal</string>\n    <string name=\"controls_popup_title\">Pop-up</string>\n    <string name=\"popup_remember_size_pos_title\">Reține dimensiunea și poziția pop-up-ului</string>\n    <string name=\"popup_remember_size_pos_summary\">Reține ultima dimensiune și poziție a pop-up-ului</string>\n    <string name=\"show_search_suggestions_title\">Sugestii de căutare</string>\n    <string name=\"show_search_suggestions_summary\">Alegeți sugestiile care vor fi afișate la căutare</string>\n    <string name=\"clear\">Ștergeți</string>\n    <string name=\"best_resolution\">Rezoluție maximă</string>\n    <string name=\"subscribe_button_title\">Abonare</string>\n    <string name=\"subscribed_button_title\">Abonat(ă)</string>\n    <string name=\"channel_unsubscribed\">Canal dezabonat</string>\n    <string name=\"subscription_change_failed\">Nu s-a putut modifica abonamentul</string>\n    <string name=\"subscription_update_failed\">Nu s-a putut actualiza abonamentul</string>\n    <string name=\"tab_subscriptions\">Abonamente</string>\n    <string name=\"fragment_feed_title\">Noutăți</string>\n    <string name=\"enable_search_history_title\">Istoric de căutări</string>\n    <string name=\"enable_search_history_summary\">Stochează local căutările</string>\n    <string name=\"enable_watch_history_title\">Istoricul vizionărilor</string>\n    <string name=\"enable_watch_history_summary\">Reține videoclipurile vizionate</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Reluați redarea</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Continuă redarea după întreruperi (ex: după apeluri)</string>\n    <string name=\"settings_category_player_title\">Player</string>\n    <string name=\"settings_category_player_behavior_title\">Comportament</string>\n    <string name=\"settings_category_history_title\">Istoric și cache</string>\n    <string name=\"undo\">Anulare</string>\n    <string name=\"notification_channel_name\">Notificare NewPipe</string>\n    <string name=\"notification_channel_description\">Notificări pentru playerul NewPipe</string>\n    <string name=\"search_no_results\">Fără rezultate</string>\n    <string name=\"empty_list_subtitle\">Nimic aici în afară de sunetul greierilor</string>\n    <string name=\"no_subscribers\">Fără abonați</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s abonat</item>\n        <item quantity=\"few\">%s abonați</item>\n        <item quantity=\"other\">%s de abonați</item>\n    </plurals>\n    <string name=\"no_views\">Nicio vizionare</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s vizionare</item>\n        <item quantity=\"few\">%s vizionări</item>\n        <item quantity=\"other\">%s de vizionări</item>\n    </plurals>\n    <string name=\"no_videos\">Nu există videoclipuri</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s videoclip</item>\n        <item quantity=\"few\">%s videoclipuri</item>\n        <item quantity=\"other\">%s de videoclipuri</item>\n    </plurals>\n    <string name=\"settings_category_downloads_title\">Descărcări</string>\n    <string name=\"settings_file_charset_title\">Caractere permise în numele fișierelor</string>\n    <string name=\"settings_file_replacement_character_summary\">Caracterele nevalabile sunt înlocuite cu această valoare</string>\n    <string name=\"settings_file_replacement_character_title\">Caracter de înlocuire</string>\n    <string name=\"charset_letters_and_digits\">Litere și cifre</string>\n    <string name=\"charset_most_special_characters\">Caractere speciale</string>\n    <string name=\"title_activity_about\">Despre NewPipe</string>\n    <string name=\"title_licenses\">Licențe terță-parte</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s de %2$s sub %3$s</string>\n    <string name=\"tab_about\">Despre &amp; FAQ</string>\n    <string name=\"tab_licenses\">Licențe</string>\n    <string name=\"app_description\">Un player de streaming „ușor” liber, pentru Android.</string>\n    <string name=\"view_on_github\">Vedeți pe GitHub</string>\n    <string name=\"app_license_title\">Licența NewPipe</string>\n    <string name=\"contribution_encouragement\">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!</string>\n    <string name=\"read_full_license\">Citiți licența</string>\n    <string name=\"contribution_title\">Contribuiți</string>\n    <string name=\"title_activity_history\">Istoric</string>\n    <string name=\"action_history\">Istoric</string>\n    <string name=\"delete_item_search_history\">Doriți să ștergeți acest element din istoricul de căutare?</string>\n    <string name=\"main_page_content\">Conținutul pagini principale</string>\n    <string name=\"blank_page_summary\">Pagină goală</string>\n    <string name=\"kiosk_page_summary\">Pagina de chioșc</string>\n    <string name=\"channel_page_summary\">Pagină canale</string>\n    <string name=\"select_a_channel\">Alegeți un canal</string>\n    <string name=\"no_channel_subscribed_yet\">Nu v-ați abonat la niciun canal deocamdată</string>\n    <string name=\"select_a_kiosk\">Alegeți un chioșc</string>\n    <string name=\"trending\">Tendințe</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Noi și populare</string>\n    <string name=\"no_player_found_toast\">Niciun player pentru streaming găsit. (Totuși, puteți instala VLC).</string>\n    <string name=\"controls_download_desc\">Descărcați fișierul de flux</string>\n    <string name=\"show_info\">Afișare informații</string>\n    <string name=\"tab_bookmarks\">Playlisturi salvate</string>\n    <string name=\"controls_add_to_playlist_title\">Salvare în</string>\n    <string name=\"use_inexact_seek_title\">Folosește parcurgerea rapidă inexactă</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Datele cache de imagini au fost șterse</string>\n    <string name=\"metadata_cache_wipe_title\">Șterge cache-ul pentru metadata</string>\n    <string name=\"metadata_cache_wipe_summary\">Șterge cache-ul pentru datele de pagini web</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Cache pentru metadata șters</string>\n    <string name=\"auto_queue_title\">Adaugă următorul stream în coadă automat</string>\n    <string name=\"auto_queue_summary\">Continuă coadă de redare (care nu se repetă) prin adăugarea unui flux asemănător</string>\n    <string name=\"show_hold_to_append_title\">Afișați sfatul \\\"Țineți apăsat pentru a adăuga\\\"</string>\n    <string name=\"show_hold_to_append_summary\">Afișați un sfat la apăsarea fundalului sau a butonului popup în videoclipul \\\"Detalii:\\\"</string>\n    <string name=\"default_content_country_title\">Țara implicită pentru conținut</string>\n    <string name=\"settings_category_debug_title\">Depanare</string>\n    <string name=\"play_all\">Redă toate</string>\n    <string name=\"always\">Întotdeauna</string>\n    <string name=\"just_once\">Doar o dată</string>\n    <string name=\"file\">Fișier</string>\n    <string name=\"unknown_content\">[Necunoscut]</string>\n    <string name=\"switch_to_background\">Treceți la fundal</string>\n    <string name=\"switch_to_popup\">Treceți la Popup</string>\n    <string name=\"switch_to_main\">Treceți la principal</string>\n    <string name=\"import_data_title\">Importați baza de date</string>\n    <string name=\"export_data_title\">Exportați baza de date</string>\n    <string name=\"import_data_summary\">Suprascrie istoricul, abonamentele, listele de redare și (opțional) setările curente</string>\n    <string name=\"export_data_summary\">Exportați istoricul, abonamentele, listele de redare și setările</string>\n    <string name=\"player_stream_failure\">Nu a putut reda acest flux</string>\n    <string name=\"player_unrecoverable_failure\">A apărut o eroare irecuperabilă a player-ului</string>\n    <string name=\"player_recoverable_failure\">Se recuperează din eroarea player-ului</string>\n    <string name=\"external_player_unsupported_link_type\">Player-ele externi nu acceptă aceste tipuri de linkuri</string>\n    <string name=\"video_streams_empty\">Niciun stream video găsit</string>\n    <string name=\"audio_streams_empty\">Niciun stream audio găsit</string>\n    <string name=\"invalid_directory\">Director Invalid</string>\n    <string name=\"invalid_source\">Nu există un astfel de fișier/conținut sursă</string>\n    <string name=\"invalid_file\">Fișierul nu există sau lipsește permisiunea de a citi sau scrie în el</string>\n    <string name=\"file_name_empty_error\">Numele fișierului nu poate fi gol</string>\n    <string name=\"error_occurred_detail\">A survenit o eroare: %1$s</string>\n    <string name=\"donation_encouragement\">NewPipe este dezvoltat de voluntari care își petrec timpul liber pentru a vă oferi cea mai bună experiență de utilizare. Donează pentru a ajuta dezvoltatorii să facă NewPipe și mai bun în timp ce ei se bucură de o ceașcă de cafea.</string>\n    <string name=\"give_back\">Dăruiește înapoi</string>\n    <string name=\"website_title\">Site web</string>\n    <string name=\"website_encouragement\">Vizitați site-ul NewPipe pentru mai multe informații și noutăți.</string>\n    <string name=\"title_last_played\">Ultimele vizionări</string>\n    <string name=\"title_most_played\">Cele mai multe vizionări</string>\n    <string name=\"export_complete_toast\">Exportat</string>\n    <string name=\"import_complete_toast\">Importat</string>\n    <string name=\"no_valid_zip_file\">Nici un fișier ZIP valid</string>\n    <string name=\"could_not_import_all_files\">Avertisment: Nu s-au putut importa toate fișierele.</string>\n    <string name=\"override_current_data\">Acest lucru va anula configurația curentă.</string>\n    <string name=\"play_queue_remove\">Eliminați</string>\n    <string name=\"play_queue_stream_detail\">Detalii</string>\n    <string name=\"play_queue_audio_settings\">Setări Audio</string>\n    <string name=\"hold_to_append\">Apăsați pentru a adăuga în coadă</string>\n    <string name=\"start_here_on_background\">Începeți redarea în fundal</string>\n    <string name=\"start_here_on_popup\">Începeți redarea în popup</string>\n    <string name=\"drawer_open\">Deschdeți sertarul</string>\n    <string name=\"drawer_close\">Închideți sertarul</string>\n    <string name=\"preferred_open_action_settings_title\">Opțiunea de deschidere preferată</string>\n    <string name=\"preferred_open_action_settings_summary\">Acțiune implicită la deschiderea conținutului - %s</string>\n    <string name=\"video_player\">Player Video</string>\n    <string name=\"background_player\">Player Fundal</string>\n    <string name=\"popup_player\">Player Popup</string>\n    <string name=\"always_ask_open_action\">Întrebați întotdeauna</string>\n    <string name=\"no_streams_available_download\">Nu există fluxuri disponibile pentru descărcare</string>\n    <string name=\"detail_drag_description\">Trageți pentru a reordona</string>\n    <string name=\"create\">Creați</string>\n    <string name=\"dismiss\">Respingeți</string>\n    <string name=\"rename\">Redenumiți</string>\n    <string name=\"donation_title\">Donați</string>\n    <string name=\"import_settings\">De asemenea, doriți să importați setări?</string>\n    <string name=\"name\">Nume</string>\n    <string name=\"playlist_creation_success\">Listă de redare creată</string>\n    <string name=\"playlist_add_stream_success\">Adăugat la lista de redare</string>\n    <string name=\"caption_auto_generated\">Generat automat</string>\n    <string name=\"import_file_title\">Import fișier</string>\n    <string name=\"playback_speed_control\">Controlul vitezei de redare</string>\n    <string name=\"channels\">Canale</string>\n    <string name=\"users\">Utilizatori</string>\n    <string name=\"playlists\">Liste de redare</string>\n    <string name=\"tracks\">Titluri</string>\n    <string name=\"clear_views_history_title\">Ștergeți istoricul vizionărilor</string>\n    <string name=\"clear_views_history_summary\">Șterge istoricul fluxurilor redate și pozițiile de redare</string>\n    <string name=\"delete_view_history_alert\">Ștergeți întregul istoric al vizionărilor\\?</string>\n    <string name=\"one_item_deleted\">1 element șters.</string>\n    <string name=\"create_playlist\">Playlist nou</string>\n    <string name=\"add_to_playlist\">Adăugați la playlist</string>\n    <string name=\"import_title\">Importare</string>\n    <string name=\"import_from\">Importați din</string>\n    <string name=\"export_to\">Exportați în</string>\n    <string name=\"import_ongoing\">Se importă…</string>\n    <string name=\"export_ongoing\">Se exportă…</string>\n    <string name=\"previous_export\">Export anterior</string>\n    <string name=\"subscriptions_import_unsuccessful\">Nu s-au putut importa abonamentele</string>\n    <string name=\"subscriptions_export_unsuccessful\">Nu s-au putut exporta abonamentele</string>\n    <string name=\"playback_tempo\">Viteză</string>\n    <string name=\"accept\">Acceptați</string>\n    <string name=\"decline\">Refuzați</string>\n    <string name=\"unsubscribe\">Dezabonare</string>\n    <string name=\"tab_choose\">Alegeți fila</string>\n    <string name=\"settings_category_updates_title\">Actualizări</string>\n    <string name=\"events\">Evenimente</string>\n    <string name=\"file_deleted\">Fișier șters</string>\n    <string name=\"app_update_notification_channel_name\">Notificare de actualizare a aplicației</string>\n    <string name=\"app_update_notification_channel_description\">Notificări pentru noi versiuni NewPipe</string>\n    <string name=\"watch_history_deleted\">Istoricul de vizionări a fost șters</string>\n    <string name=\"clear_search_history_title\">Ștergeți istoricul căutărilor</string>\n    <string name=\"clear_search_history_summary\">Șterge istoricul cuvintelor cheie de căutare</string>\n    <string name=\"delete_search_history_alert\">Ștergeți întregul istoric de căutare\\?</string>\n    <string name=\"search_history_deleted\">Istoric de căutare șters</string>\n    <string name=\"download_to_sdcard_error_title\">Stocare externă indisponibilă</string>\n    <string name=\"download_to_sdcard_error_message\">Descărcarea pe cardul SD extern nu este posibilă. Resetați locația folderului de descărcare\\?</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Se obțin informații…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Se încarcă conținutul solicitat</string>\n    <string name=\"rename_playlist\">Redenumiți</string>\n    <string name=\"set_as_playlist_thumbnail\">Setați ca miniatura listei de redare</string>\n    <string name=\"delete_playlist_prompt\">Ștergeți această listă de redare\\?</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniatura listei de redare a fost schimbată.</string>\n    <string name=\"caption_none\">Fără subtitrări</string>\n    <string name=\"resize_fit\">Potrivire</string>\n    <string name=\"resize_fill\">Umplere</string>\n    <string name=\"resize_zoom\">Mărire</string>\n    <string name=\"caption_setting_title\">Subtitrări</string>\n    <string name=\"caption_setting_description\">Modificați scara textului de legendă a playerului și stilurile de fundal. Necesită repornirea aplicației pentru a intra în vigoare</string>\n    <string name=\"app_license\">NewPipe este un software liber cu copyleft: îl puteți folosi, studia, distribui și îmbunătăți în voie. Mai exact, îl puteți redistribui și/sau modifica în conformitate cu termenii Licenței Publice Generale GNU, așa cum a fost publicată de Free Software Foundation, fie versiunea 3 a Licenței, fie (la alegerea dumneavoastră) orice versiune ulterioară.</string>\n    <string name=\"privacy_policy_title\">Politica de confidențialitate a NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">Proiectul NewPipe ia foarte în serios confidențialitatea dumneavoastră. Prin urmare, aplicația nu colectează niciun fel de date fără consimțământul dumneavoastră.\n\\nPolitica de confidențialitate a NewPipe explică în detaliu ce date sunt trimise și stocate atunci când trimiteți un raport de eroare.</string>\n    <string name=\"read_privacy_policy\">Citiți politica de confidențialitate</string>\n    <string name=\"saved_tabs_invalid_json\">Nu s-au putut citi filele salvate, deci se folosesc cele implicite</string>\n    <string name=\"restore_defaults\">Restaurați valorile implicite</string>\n    <string name=\"restore_defaults_confirmation\">Doriți să restaurați valorile implicite\\?</string>\n    <string name=\"subscribers_count_not_available\">Numărul de abonați nu este disponibil</string>\n    <string name=\"main_page_content_summary\">Ce file vor fi afișate pe pagina principală</string>\n    <string name=\"conferences\">Conferințe</string>\n    <string name=\"show_comments_title\">Arată comentariile</string>\n    <string name=\"show_comments_summary\">Dezactivează pentru oprirea afișării comentariilor</string>\n    <string name=\"autoplay_title\">Redare automată</string>\n    <string name=\"no_comments\">Fără comentarii</string>\n    <string name=\"error_unable_to_load_comments\">Nu s-au putut încărca comentariile</string>\n    <string name=\"enable_playback_resume_title\">Reluare redare</string>\n    <string name=\"enable_playback_resume_summary\">Restabilirea ultimei poziții de redare</string>\n    <string name=\"enable_playback_state_lists_title\">Poziții în liste</string>\n    <string name=\"enable_playback_state_lists_summary\">Afișează indicatorii de poziție de redare în liste</string>\n    <string name=\"settings_category_clear_data_title\">Ștergeți datele</string>\n    <string name=\"watch_history_states_deleted\">Poziții de redare șterse</string>\n    <string name=\"missing_file\">Fișier mutat sau șters</string>\n    <string name=\"clear_playback_states_title\">Șterge pozițiile de redare memorate</string>\n    <string name=\"bookmark_playlist\">Marcați lista de redare</string>\n    <string name=\"limit_mobile_data_usage_title\">Limitați rezoluția atunci când utilizați date mobile</string>\n    <string name=\"permission_display_over_apps\">Acordați permisiunea de a afișa peste alte aplicații</string>\n    <string name=\"delete_playback_states_alert\">Ștergeți toate pozițiile din playback\\?</string>\n    <string name=\"clear_playback_states_summary\">Ștergeți toate pozițiile de redare</string>\n    <string name=\"videos_string\">Videoclipuri</string>\n    <string name=\"peertube_instance_add_exists\">Instanța există deja</string>\n    <string name=\"peertube_instance_add_https_only\">Sunt acceptate numai URL-urile HTTPS</string>\n    <string name=\"peertube_instance_add_fail\">Nu s-a putut valida instanța</string>\n    <string name=\"peertube_instance_add_help\">Introduceți URL-ul instanței</string>\n    <string name=\"peertube_instance_add_title\">Adăugați o instanță</string>\n    <string name=\"peertube_instance_url_help\">Găsiți instanțele care vă plac pe %s</string>\n    <string name=\"peertube_instance_url_summary\">Selectați instanțele PeerTube preferate</string>\n    <string name=\"peertube_instance_url_title\">Instanțe PeerTube</string>\n    <string name=\"seek_duration_title\">Durată derulare rapidă înainte/înapoi</string>\n    <string name=\"done\">Gata</string>\n    <string name=\"subtitle_activity_recaptcha\">Apăsați \\\"Gata\\\" după ce ați rezolvat problema</string>\n    <string name=\"error_report_open_issue_button_text\">Raportați pe GitHub</string>\n    <string name=\"clear_cookie_summary\">Ștergeți cookie-urile pe care NewPipe le stochează atunci când rezolvați un reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">Cookie-urile reCAPTCHA au fost șterse</string>\n    <string name=\"clear_cookie_title\">Ștergeți cookie-urile reCAPTCHA</string>\n    <string name=\"hash_channel_description\">Notificări pentru progresul hashing-ului video</string>\n    <string name=\"hash_channel_name\">Notificare hash video</string>\n    <string name=\"artists\">Artiști</string>\n    <string name=\"albums\">Albume</string>\n    <string name=\"songs\">Melodii</string>\n    <string name=\"restricted_video\">Acest videoclip este restricționat în funcție de vârstă.\n\\n\n\\nActivați \\\"%1$s\\\" în setări dacă doriți să îl vedeți.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube oferă un \\\"Mod restricționat\\\" care ascunde conținutul potențial matur</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Activați \\\"Modul restricționat\\\" de pe YouTube</string>\n    <string name=\"show_age_restricted_content_summary\">Afișați conținut posibil nepotrivit pentru copii, deoarece are o limită de vârstă (cum ar fi 18+)</string>\n    <string name=\"unsupported_url_dialog_message\">Adresa URL nu a putut fi recunoscută. Deschideți cu o altă aplicație\\?</string>\n    <string name=\"show_meta_info_title\">Afișează informațiile meta</string>\n    <string name=\"notification_colorize_summary\">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)</string>\n    <string name=\"notification_colorize_title\">Colorează notificarea</string>\n    <string name=\"notification_action_nothing\">Nimic</string>\n    <string name=\"notification_action_buffering\">Se încarcă</string>\n    <string name=\"notification_action_shuffle\">Redare aleatorie</string>\n    <string name=\"notification_action_repeat\">Repetare</string>\n    <string name=\"notification_actions_at_most_three\">Puteți selecta cel mult trei acțiuni pentru afișare în notificarea compactă!</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_action_4_title\">Al cincilea buton de acțiune</string>\n    <string name=\"notification_action_3_title\">Al patrulea buton de acțiune</string>\n    <string name=\"notification_action_2_title\">Al treilea buton de acțiune</string>\n    <string name=\"notification_action_1_title\">Al doilea buton de acțiune</string>\n    <string name=\"notification_action_0_title\">Primul buton de acțiune</string>\n    <string name=\"notification_scale_to_square_image_summary\">Tăiați miniatura video afișată în notificare de la raportul de aspect 16:9 la 1:1 (poate introduce distorsiuni)</string>\n    <string name=\"notification_scale_to_square_image_title\">Tăiere miniatură la raportul de aspect 1:1</string>\n    <string name=\"search_showing_result_for\">Se arată rezultate pentru: %s</string>\n    <string name=\"no_app_to_open_intent\">Nicio aplicație de pe dispozitivul dvs. nu poate deschide acesta</string>\n    <string name=\"chapters\">Capitole</string>\n    <string name=\"recent\">Recente</string>\n    <string name=\"show_thumbnail_summary\">Utilizați miniatura atât pentru fundalul ecranului de blocare, cât și pentru notificări</string>\n    <string name=\"show_thumbnail_title\">Afișați miniatura</string>\n    <string name=\"playlist_page_summary\">Pagina listei de redare</string>\n    <string name=\"video_detail_by\">De %s</string>\n    <string name=\"channel_created_by\">Creat de %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Miniatura de avatar a canalului</string>\n    <string name=\"content_not_supported\">Acest conținut nu este încă acceptat de NewPipe.\n\\n\n\\nSperăm că va fi acceptat într-o versiune viitoare.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Credeți că încărcarea fluxului este prea lentă\\? Dacă da, încercați să activați încărcarea rapidă (puteți schimba acest lucru în setări sau apăsând butonul de mai jos).\n\\n\n\\nNewPipe oferă două strategii de încărcare a fluxului:\n\\n• Preluarea întregului canal de abonament, care este lent, dar complet.\n\\n• Utilizarea unui punct final de serviciu dedicat, care este rapid, dar de obicei nu este complet.\n\\n\n\\nDiferența dintre cele două este că în cazul celei rapide lipsesc de obicei unele informații, cum ar fi durata sau tipul articolului (nu poate face distincția între videoclipurile live și cele normale) și poate returna mai puține articole.\n\\n\n\\nYouTube este un exemplu de serviciu care oferă această metodă rapidă prin intermediul fluxului său RSS.\n\\n\n\\nAșadar, alegerea se reduce la ceea ce preferați: rapiditate sau informații precise.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Dezactivați modul rapid</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Activați modul rapid</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Disponibilă în unele servicii, este, de obicei, mult mai rapidă, dar poate returna un număr limitat de articole și adesea informații incomplete (de exemplu, fără durată, fără tipul de articol, fără stare în direct)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Preluare din fluxul dedicat atunci când este disponibil</string>\n    <string name=\"feed_update_threshold_option_always_update\">Actualizați întotdeauna</string>\n    <string name=\"feed_update_threshold_summary\">Timpul de la ultima actualizare înainte ca un abonament să fie considerat învechit - %s</string>\n    <string name=\"feed_update_threshold_title\">Prag de actualizare a fluxului</string>\n    <string name=\"settings_category_feed_title\">Flux</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Se afișează numai abonamentele negrupate</string>\n    <string name=\"feed_create_new_group_button_title\">Nou</string>\n    <string name=\"feed_group_dialog_delete_message\">Doriți să ștergeți acest grup\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Numele grupului este gol</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d selectat</item>\n        <item quantity=\"few\">%d selectate</item>\n        <item quantity=\"other\">%d selectate</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Niciun abonament selectat</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Selectați abonamente</string>\n    <string name=\"feed_processing_message\">Se procesează feedul …</string>\n    <string name=\"feed_notification_loading\">Se încarcă feedul …</string>\n    <string name=\"feed_subscription_not_loaded_count\">Neîncărcat: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Ultima actualizare a fluxului: %s</string>\n    <string name=\"feed_groups_header_title\">Grupuri de canale</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d zi</item>\n        <item quantity=\"few\">%d zile</item>\n        <item quantity=\"other\">%d de zile</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d oră</item>\n        <item quantity=\"few\">%d ore</item>\n        <item quantity=\"other\">%d de ore</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d secundă</item>\n        <item quantity=\"few\">%d secunde</item>\n        <item quantity=\"other\">%d de secunde</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Datorită constrângerilor ExoPlayer, durata de căutare a fost setată la %d secunde</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Da, și videoclipuri vizionate parțial</string>\n    <string name=\"remove_watched_popup_warning\">Videoclipurile care au fost vizionate înainte și după ce au fost adăugate la lista de redare vor fi eliminate. \\nSunteți sigur? Acest lucru nu poate fi anulat!</string>\n    <string name=\"remove_watched_popup_title\">Eliminați videoclipurile vizionate?</string>\n    <string name=\"remove_watched\">Eliminare cele urmărite</string>\n    <string name=\"systems_language\">Prestabilită de sistem</string>\n    <string name=\"app_language_title\">Limba aplicației</string>\n    <string name=\"choose_instance_prompt\">Alegeți o instanță</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\\"Storage Access Framework\\\" permite descărcări pe un card SD extern</string>\n    <string name=\"downloads_storage_use_saf_title\">Utilizați selectorul de dosare de sistem (SAF)</string>\n    <string name=\"downloads_storage_ask_summary\">Veți fi întrebat unde să salvați fiecare descărcare.\n\\nActivați selectorul de foldere de sistem (SAF) dacă doriți să descărcați pe un card SD extern</string>\n    <string name=\"downloads_storage_ask_title\">Întrebați unde să descărcați</string>\n    <string name=\"pause_downloads\">Întrerupeți descărcările</string>\n    <string name=\"max_retry_msg\">Numărul maxim de încercări</string>\n    <string name=\"show_original_time_ago_title\">Afișați timpul inițial pe articole</string>\n    <string name=\"enable_disposed_exceptions_summary\">Forțarea raportării excepțiilor de Rx nedistribuibile în afara ciclului de viață al fragmentului sau al activității după eliminare</string>\n    <string name=\"auto_queue_toggle\">Coadă automată</string>\n    <string name=\"clear_queue_confirmation_description\">Coada de redare activă va fi înlocuită</string>\n    <string name=\"clear_queue_confirmation_summary\">Trecerea de la un player la altul vă poate înlocui coada de redare</string>\n    <string name=\"clear_queue_confirmation_title\">Solicitați confirmarea înainte de a șterge o listă de redare</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minut</item>\n        <item quantity=\"few\">%d minute</item>\n        <item quantity=\"other\">%d de minute</item>\n    </plurals>\n    <string name=\"start_downloads\">Începeți descărcările</string>\n    <string name=\"enable_queue_limit_desc\">O descărcare va rula în același timp</string>\n    <string name=\"enable_queue_limit\">Limitarea cozii de descărcare</string>\n    <string name=\"close\">Închideți</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Util atunci când treceți la date mobile, deși unele descărcări nu pot fi suspendate</string>\n    <string name=\"pause_downloads_on_mobile\">Întrerupeți pe rețelele măsurate</string>\n    <string name=\"max_retry_desc\">Numărul maxim de încercări înainte de a anula descărcarea</string>\n    <string name=\"stop\">Opriți</string>\n    <string name=\"delete_downloaded_files\">Ștergeți fișierele descărcate</string>\n    <string name=\"confirm_prompt\">Doriți să ștergeți istoricul descărcărilor sau să ștergeți toate fișierele descărcate\\?</string>\n    <string name=\"clear_download_history\">Șterge istoricul descărcărilor</string>\n    <string name=\"error_download_resource_gone\">Nu se poate recupera această descărcare</string>\n    <string name=\"error_timeout\">Conexiunea a expirat</string>\n    <string name=\"error_progress_lost\">Progres pierdut, deoarece fișierul a fost șters</string>\n    <string name=\"error_insufficient_storage_left\">Nu a mai rămas spațiu pe dispozitiv</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe a fost închis în timp ce lucra la fișier</string>\n    <string name=\"error_postprocessing_failed\">Post-procesarea a eșuat</string>\n    <string name=\"error_http_not_found\">Nu a fost găsit</string>\n    <string name=\"error_http_unsupported_range\">Serverul nu acceptă descărcări cu mai multe fire, încercați din nou cu @string/msg_threads = 1</string>\n    <string name=\"error_http_no_content\">Serverul nu trimite date</string>\n    <string name=\"error_connect_host\">Nu se poate conecta la server</string>\n    <string name=\"error_unknown_host\">Nu s-a putut găsi serverul</string>\n    <string name=\"error_ssl_exception\">Nu s-a putut stabili o conexiune sigură</string>\n    <string name=\"error_path_creation\">Folderul de destinație nu poate fi creat</string>\n    <string name=\"error_file_creation\">Fișierul nu poate fi creat</string>\n    <string name=\"show_error\">Afișați eroarea</string>\n    <string name=\"download_already_pending\">Există o descărcare în așteptare cu acest nume</string>\n    <string name=\"download_already_running\">Există o descărcare în curs cu acest nume</string>\n    <string name=\"overwrite_failed\">nu poate suprascrie fișierul</string>\n    <string name=\"overwrite_finished_warning\">Există deja un fișier descărcat cu acest nume</string>\n    <string name=\"overwrite_unrelated_warning\">Există deja un fișier cu acest nume</string>\n    <string name=\"overwrite\">Suprascrieți</string>\n    <string name=\"generate_unique_name\">Generați un nume unic</string>\n    <string name=\"download_failed\">Descărcare eșuată</string>\n    <string name=\"permission_denied\">Acțiune refuzată de sistem</string>\n    <string name=\"enqueue\">Puneți în coadă</string>\n    <string name=\"recovering\">Se recuperează</string>\n    <string name=\"post_processing\">post-procesare</string>\n    <string name=\"queued\">În așteptare</string>\n    <string name=\"paused\">Întrerupt</string>\n    <string name=\"missions_header_pending\">În așteptare</string>\n    <string name=\"missions_header_finished\">Finalizat</string>\n    <string name=\"app_update_available_notification_title\">Actualizare NewPipe disponibilă!</string>\n    <string name=\"auto\">Automat</string>\n    <string name=\"grid\">Grilă</string>\n    <string name=\"list\">Listă</string>\n    <string name=\"list_view_mode\">Mod vizualizare listă</string>\n    <string name=\"never\">Niciodată</string>\n    <string name=\"wifi_only\">Numai pe Wi-Fi</string>\n    <string name=\"autoplay_summary\">Începeți automat redarea - %s</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimizare la playerul popup</string>\n    <string name=\"minimize_on_exit_background_description\">Minimizați la playerul de fundal</string>\n    <string name=\"minimize_on_exit_none_description\">Niciuna</string>\n    <string name=\"minimize_on_exit_summary\">Acțiune la trecerea la altă aplicație de la playerul video principal - %s</string>\n    <string name=\"minimize_on_exit_title\">Minimalizați la comutarea aplicației</string>\n    <string name=\"updates_setting_description\">Afișați o notificare pentru a solicita actualizarea aplicației atunci când este disponibilă o nouă versiune</string>\n    <string name=\"updates_setting_title\">Actualizări</string>\n    <string name=\"limit_data_usage_none_description\">Fără limită</string>\n    <string name=\"start_accept_privacy_policy\">Pentru a respecta Regulamentul general european privind protecția datelor (GDPR), vă atragem atenția asupra politicii de confidențialitate a NewPipe. Vă rugăm să o citiți cu atenție.\n\\nTrebuie să o acceptați pentru a ne trimite raportul de eroare.</string>\n    <string name=\"playback_reset\">Resetare</string>\n    <string name=\"playback_step\">Etapă</string>\n    <string name=\"skip_silence_checkbox\">Înaintare rapidă în timpul tăcerii</string>\n    <string name=\"unhook_checkbox\">Decuplați (poate provoca distorsiuni)</string>\n    <string name=\"playback_pitch\">Înălțime</string>\n    <string name=\"import_network_expensive_warning\">Rețineți că această operațiune poate fi costisitoare în rețea.\n\\n\n\\nContinuați\\?</string>\n    <string name=\"import_soundcloud_instructions_hint\">ID-ul dvs., soundcloud.com/yourid</string>\n    <string name=\"import_soundcloud_instructions\">Importați un profil SoundCloud introducând fie URL-ul, fie ID-ul dvs:\n\\n\n\\n1. Activați \\\"modul desktop\\\" într-un browser web (site-ul nu este disponibil pentru dispozitive mobile)\n\\n2. Mergeți la acest URL: %1$s\n\\n3. Conectați-vă atunci când vi se cere\n\\n4. Copiați URL-ul profilului la care ați fost redirecționat.</string>\n    <string name=\"import_youtube_instructions\">Importați abonamentele YouTube din Google takeout:\n\\n\n\\n1. Mergeți la această adresă URL: %1$s\n\\n2. Autentificați-vă atunci când vi se cere\n\\n3. Faceți clic pe \\\"Toate datele incluse\\\", apoi pe \\\"Deselectați totul\\\", apoi selectați doar \\\"Abonamente\\\" și faceți clic pe \\\"OK\\\"\n\\n4. Faceți clic pe \\\"Pasul următor\\\" și apoi pe \\\"Creați exportul\\\"\n\\n5. Faceți clic pe butonul \\\"Descărcare\\\" după ce acesta apare\n\\n6. Faceți clic pe IMPORT FIȘIER de mai jos și selectați fișierul .zip descărcat\n\\n7. [În cazul în care importul .zip eșuează] Extrageți fișierul .csv (de obicei sub \\\"YouTube and YouTube Music/subscriptions/subscriptions.csv\\\"), faceți clic pe IMPORT FIȘIER de mai jos și selectați fișierul csv extras</string>\n    <string name=\"show_original_time_ago_summary\">Textele originale din servicii vor fi vizibile în elementele de flux</string>\n    <string name=\"enable_disposed_exceptions_title\">Raportați erori în afara ciclului de viață</string>\n    <string name=\"show_memory_leaks\">Afișați scurgeri de memorie</string>\n    <string name=\"enable_leak_canary_summary\">Monitorizarea scurgerilor de memorie poate face ca aplicația să nu mai răspundă atunci când se face heap dumping</string>\n    <string name=\"playlist_no_uploader\">Generat automat (nu a fost găsit niciun uploader)</string>\n    <string name=\"unbookmark_playlist\">Eliminați marcajul</string>\n    <string name=\"unmute\">Activați sunetul</string>\n    <string name=\"mute\">Dezactivați sunetul</string>\n    <string name=\"enqueued\">Pus în coadă</string>\n    <string name=\"enqueue_stream\">Puneți în coadă</string>\n    <string name=\"title_activity_play_queue\">Coadă de redare</string>\n    <string name=\"most_liked\">Cele mai apreciate</string>\n    <string name=\"recently_added\">Adăugate recent</string>\n    <string name=\"local\">Local</string>\n    <string name=\"no_playlist_bookmarked_yet\">Nu există încă marcaje în playlist</string>\n    <string name=\"select_a_playlist\">Selectați un playlist</string>\n    <string name=\"default_kiosk_page_summary\">Chioșc implicit</string>\n    <string name=\"msg_calculating_hash\">Se calculează hash-ul</string>\n    <string name=\"infinite_videos\">∞ videoclipuri</string>\n    <string name=\"more_than_100_videos\">Peste 100 de videoclipuri</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s ascultător</item>\n        <item quantity=\"few\">%s ascultători</item>\n        <item quantity=\"other\">%s de ascultători</item>\n    </plurals>\n    <string name=\"no_one_listening\">Nimeni nu ascultă</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s spectator</item>\n        <item quantity=\"few\">%s spectatori</item>\n        <item quantity=\"other\">%s spectatori</item>\n    </plurals>\n    <string name=\"no_one_watching\">Nimeni nu se uită</string>\n    <string name=\"drawer_header_description\">Comutare serviciu, selectat în prezent:</string>\n    <string name=\"description_tab_description\">Descriere</string>\n    <string name=\"related_items_tab_description\">Articole similare</string>\n    <string name=\"comments_tab_description\">Comentarii</string>\n    <string name=\"error_report_open_github_notice\">Vă rugăm să verificați dacă nu există deja o problemă în care se discută despre eroarea dumneavoastră. Atunci când creați tichete duplicate, ne consumați timp pe care l-am putea dedica rezolvării problemei actuale.</string>\n    <string name=\"copy_for_github\">Copiați raportul formatat</string>\n    <string name=\"show_meta_info_summary\">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</string>\n    <string name=\"show_description_summary\">Dezactivați pentru a ascunde descrierea videoclipului și informațiile suplimentare</string>\n    <string name=\"show_description_title\">Arată descrierea</string>\n    <string name=\"open_with\">Deschidere cu</string>\n    <string name=\"crash_the_app\">Blocați aplicația</string>\n    <string name=\"recaptcha_solve\">Rezolvați</string>\n    <string name=\"featured\">Evidențiate</string>\n    <string name=\"select_night_theme_toast\">Puteți selecta tema de noapte preferată mai jos</string>\n    <string name=\"restricted_video_no_stream\">Acest videoclip este restricționat în funcție de vârstă.\n\\nDin cauza noilor politici YouTube privind videoclipurile cu restricții de vârstă, NewPipe nu poate accesa niciunul dintre fluxurile sale video și, prin urmare, nu îl poate reda.</string>\n    <string name=\"download_has_started\">Descărcarea a început</string>\n    <string name=\"night_theme_summary\">Selectați tema de noapte preferată — %s</string>\n    <string name=\"auto_device_theme_title\">Automat (tema dispozitivului)</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"paid_content\">Acest conținut este disponibil doar pentru utilizatorii care au plătit, ca atare nu poate fi difuzat sau descărcat de NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Acest videoclip este disponibil doar pentru membrii YouTube Music Premium, ca atare nu poate fi difuzat sau descărcat de NewPipe.</string>\n    <string name=\"private_content\">Acest conținut este privat, ca atare nu poate fi difuzat sau descărcat de NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Aceasta este o piesă SoundCloud Go+, cel puțin în țara dvs., deci nu poate fi difuzată sau descărcată de NewPipe.</string>\n    <string name=\"georestricted_content\">Acest conținut nu este disponibil în țara dumneavoastră.</string>\n    <string name=\"show_channel_details\">Afișați detaliile canalului</string>\n    <string name=\"night_theme_title\">Tema de noapte</string>\n    <string name=\"enqueued_next\">Următorul pus în coadă</string>\n    <string name=\"enqueue_next_stream\">Adăugați în coadă pe următorul</string>\n    <string name=\"mark_as_watched\">Marcare ca vizionat</string>\n    <string name=\"off\">Oprit</string>\n    <string name=\"on\">Pornit</string>\n    <string name=\"tablet_mode_title\">Mod tabletă</string>\n    <string name=\"open_website_license\">Deschideți site-ul web</string>\n    <string name=\"detail_heart_img_view_description\">Inimă de la creator</string>\n    <string name=\"metadata_privacy_internal\">Intern</string>\n    <string name=\"metadata_privacy_private\">Privat</string>\n    <string name=\"metadata_privacy_unlisted\">Nelistat</string>\n    <string name=\"metadata_privacy_public\">Public</string>\n    <string name=\"metadata_host\">Gazdă</string>\n    <string name=\"metadata_support\">Sprijin</string>\n    <string name=\"metadata_language\">Limbă</string>\n    <string name=\"metadata_age_limit\">Limita de vârstă</string>\n    <string name=\"metadata_privacy\">Vizibilitate</string>\n    <string name=\"metadata_licence\">Licență</string>\n    <string name=\"metadata_tags\">Etichete</string>\n    <string name=\"metadata_category\">Categorie</string>\n    <string name=\"description_select_disable\">Dezactivați selectarea textului în descriere</string>\n    <string name=\"description_select_enable\">Activați selectarea textului în descriere</string>\n    <string name=\"description_select_note\">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.</string>\n    <string name=\"account_terminated\">Contul a fost închis</string>\n    <string name=\"feed_load_error_fast_unknown\">Modul rapid nu furnizează mai multe informații în acest sens.</string>\n    <string name=\"feed_load_error_terminated\">Contul autorului a fost închis.\n\\nNewPipe nu va mai putea încărca acest flux în viitor.\n\\nDoriți să vă dezabonați de la acest canal\\?</string>\n    <string name=\"feed_load_error_account_info\">Nu s-a putut încărca fluxul pentru \\\"%s\\\".</string>\n    <string name=\"feed_load_error\">Eroare la încărcarea fluxului</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Începând cu Android 10, este acceptat doar \\\"Storage Access Framework\\\"</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Veți fi întrebat unde să salvați fiecare descărcare</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">S-a șters %1$s descărcare</item>\n        <item quantity=\"few\">S-au șters %1$s descărcări</item>\n        <item quantity=\"other\">S-au șters %1$s de descărcări</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Descărcare finalizată</item>\n        <item quantity=\"few\">%s descărcări finalizate</item>\n        <item quantity=\"other\">%s de descărcări finalizate</item>\n    </plurals>\n    <string name=\"disable_media_tunneling_title\">Dezactivați tunelarea media</string>\n    <string name=\"main_page_content_swipe_remove\">Glisați elementele pentru a le elimina</string>\n    <string name=\"no_dir_yet\">Încă nu este setat niciun folder de descărcare, alegeți acum folderul de descărcare implicit</string>\n    <string name=\"comments_are_disabled\">Comentariile sunt dezactivate</string>\n    <string name=\"start_main_player_fullscreen_summary\">Nu porniți videoclipurile în mini player, ci treceți direct la modul ecran complet, dacă rotația automată este blocată. Puteți accesa în continuare mini playerul ieșind din modul fullscreen</string>\n    <string name=\"start_main_player_fullscreen_title\">Porniți playerul principal în ecran complet</string>\n    <string name=\"remote_search_suggestions\">Sugestii de căutare la distanță</string>\n    <string name=\"local_search_suggestions\">Sugestii de căutare locală</string>\n    <string name=\"dont_show\">Nu afișa</string>\n    <string name=\"low_quality_smaller\">Calitate scăzută (mai mică)</string>\n    <string name=\"high_quality_larger\">Calitate înaltă (mai mare)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Miniatură de previzualizare în bara de derulare</string>\n    <string name=\"disable_media_tunneling_summary\">Dezactivați tunelarea media dacă întâmpinați un ecran negru sau blocaje la redarea video.</string>\n    <string name=\"processing_may_take_a_moment\">Procesarea.. Poate dura un moment</string>\n    <string name=\"check_for_updates\">Verifică dacă există actualizări</string>\n    <string name=\"manual_update_description\">Verifică manual dacă există versiuni noi</string>\n    <string name=\"detail_pinned_comment_view_description\">Comentariu lipit</string>\n    <string name=\"error_report_channel_name\">Notificare cu raport de eroare</string>\n    <string name=\"show_crash_the_player_summary\">Afișează opțiunea de a întrerupe atunci când utilizați playerul</string>\n    <string name=\"error_report_notification_toast\">A apărut o eroare, consultați notificarea</string>\n    <string name=\"error_report_notification_title\">NewPipe a întămpinat o eroare, apăsați ca să raportați</string>\n    <string name=\"checking_updates_toast\">Se verifică actualizări…</string>\n    <string name=\"error_report_channel_description\">Notificări pentru a raporta erori</string>\n    <string name=\"create_error_notification\">Creați o notificare de eroare</string>\n    <string name=\"show_crash_the_player_title\">Afișează \\\"Dați crash playerului\\\"</string>\n    <string name=\"show_error_snackbar\">Afișați o eroare de tip snackbar</string>\n    <string name=\"feed_new_items\">Elemente noi în flux</string>\n    <string name=\"settings_category_player_notification_title\">Notificarea player-ului</string>\n    <string name=\"settings_category_player_notification_summary\">Configurați notificarea fluxului de redare curent</string>\n    <string name=\"streams_notification_channel_name\">Fluxuri noi</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s flux nou</item>\n        <item quantity=\"few\">%s fluxuri noi</item>\n        <item quantity=\"other\">%s de fluxuri noi</item>\n    </plurals>\n    <string name=\"loading_stream_details\">Se încarcă detaliile fluxului…</string>\n    <string name=\"enable_streams_notifications_title\">Notificări de fluxuri noi</string>\n    <string name=\"enable_streams_notifications_summary\">Notificare despre fluxuri noi din abonamente</string>\n    <string name=\"streams_notifications_interval_title\">Frecvența verificării</string>\n    <string name=\"streams_notifications_network_title\">Conexiune de rețea necesară</string>\n    <string name=\"any_network\">Orice rețea</string>\n    <string name=\"delete_downloaded_files_confirm\">Ștergeți toate fișierele descărcate de pe disc\\?</string>\n    <string name=\"notifications_disabled\">Notificările sunt dezactivate</string>\n    <string name=\"percent\">Procent</string>\n    <string name=\"semitone\">Semiton</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Implicit ExoPlayer</string>\n    <string name=\"crash_the_player\">Dați crash player-ului</string>\n    <string name=\"leak_canary_not_available\">LeakCanary nu este disponibil</string>\n    <string name=\"notifications\">Notificări</string>\n    <string name=\"streams_notification_channel_description\">Notificări despre noi fluxuri pentru abonamente</string>\n    <string name=\"check_new_streams\">Executați verificarea pentru fluxuri noi</string>\n    <string name=\"no_appropriate_file_manager_message\">Nu a fost găsit niciun manager de fișiere adecvat pentru această acțiune.\n\\nVă rugăm să instalați un manager de fișiere sau să încercați să dezactivați \\'%s\\' în setările de descărcare</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Nu a fost găsit niciun manager de fișiere adecvat pentru această acțiune.\n\\nVă rugăm să instalați un manager de fișiere compatibil cu Storage Access Framework</string>\n    <string name=\"get_notified\">Primiți notificări</string>\n    <string name=\"you_successfully_subscribed\">V-ați abonat la acest canal</string>\n    <string name=\"toggle_all\">Comutați toate</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"streams_not_yet_supported_removed\">Fluxurile care încă nu pot fi descărcate nu sunt afișate</string>\n    <string name=\"selected_stream_external_player_not_supported\">Fluxul selectat nu este acceptat de playerele externe</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Nu sunt disponibile fluxuri audio pentru playerele externe</string>\n    <string name=\"no_video_streams_available_for_external_players\">Nu sunt disponibile fluxuri video pentru playerele externe</string>\n    <string name=\"select_quality_external_players\">Selectați calitatea pentru playerele externe</string>\n    <string name=\"unknown_format\">Format necunoscut</string>\n    <string name=\"unknown_quality\">Calitate necunoscută</string>\n    <string name=\"progressive_load_interval_title\">Dimensiunea intervalului de încărcare de redare</string>\n    <string name=\"faq\">Vedeți pe website</string>\n    <string name=\"faq_description\">Dacă întâmpinați probleme cu utilizarea aplicației, nu uitați să consultați aceste răspunsuri la întrebări frecvente!</string>\n    <string name=\"faq_title\">Întrebări frecvente</string>\n    <string name=\"sort\">Sortare</string>\n    <string name=\"fast_mode\">Modul rapid</string>\n    <string name=\"import_subscriptions_hint\">Importați sau exportați abonamente din meniul cu 3 puncte</string>\n    <string name=\"app_update_unavailable_toast\">Folosiți cea mai recentă versiune NewPipe</string>\n    <string name=\"app_update_available_notification_text\">Atingeți pentru a descărca %s</string>\n    <string name=\"night_theme_available\">Această opțiune este disponibilă numai dacă %s este selectată ca temă</string>\n    <string name=\"card\">Cartelă</string>\n    <string name=\"msg_failed_to_copy\">Nu s-a reușit copierea în clipboard</string>\n    <string name=\"unset_playlist_thumbnail\">Dezactivare miniatură permanentă</string>\n    <string name=\"duplicate_in_playlist\">Listele de redare care colorate în gri conțin deja acest element.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplicat adăugat de %d ori</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorați evenimentele butonului media hardware</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Util, de exemplu, dacă utilizați o cască cu butoane fizice defecte</string>\n    <string name=\"remove_duplicates_message\">Doriți să eliminați toate fluxurile dublate din această listă de redare\\?</string>\n    <string name=\"remove_duplicates\">Eliminare dubluri</string>\n    <string name=\"remove_duplicates_title\">Eliminați dublurile\\?</string>\n    <string name=\"feed_hide_streams_title\">Afișează următoarele fluxuri</string>\n    <string name=\"feed_show_hide_streams\">Afișare/Ascundere fluxuri</string>\n    <string name=\"feed_show_watched\">Vizionat complet</string>\n    <string name=\"feed_show_partially_watched\">Vizionat parțial</string>\n    <string name=\"feed_show_upcoming\">Urmează</string>\n    <string name=\"image_quality_title\">Calitatea imaginii</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"channel_tab_videos\">Videouri</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Abonați</string>\n    <string name=\"unknown_audio_track\">Necunoscut</string>\n    <string name=\"show_channel_tabs_summary\">Ce file sunt afișate pe paginile canalelor</string>\n    <string name=\"audio_track_type_descriptive\">descriptiv</string>\n    <string name=\"share_playlist_with_list\">Distribuiți lista URL</string>\n    <string name=\"share_playlist_with_titles\">Distribuiți cu titluri</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_channel_tabs\">Filele canalului</string>\n    <string name=\"volume\">Volum</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Utilizați funcționalitatea de rezervă a decodorului din ExoPlayer</string>\n    <string name=\"none\">Niciunul</string>\n    <string name=\"loading_metadata_title\">Se încarcă metadata…</string>\n    <string name=\"toggle_screen_orientation\">Schimbați orientarea ecranului</string>\n    <string name=\"settings_category_exoplayer_summary\">Gestionați unele setări pentru ExoPlayer. Aceste schimbări necesită un restart la player ca să aibă efect</string>\n    <string name=\"image_quality_low\">Calitate scăzută</string>\n    <string name=\"main_tabs_position_title\">Poziția filelor principale</string>\n    <string name=\"toggle_fullscreen\">Schimbați pe ecran complet</string>\n    <string name=\"feed_fetch_channel_tabs\">Preluați filele canalului</string>\n    <string name=\"metadata_avatars\">Avatare</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"right_gesture_control_title\">Acțiunea gestului din dreapta</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Utilizați întotdeauna configurarația suprafeței de ieșire video din ExoPlayer ca soluție alternativă</string>\n    <string name=\"next_stream\">Transmisia viitoare</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Tunelizarea media a fost dezactivată în mod implicit pe dispozitivul dumneavoastră deoarece se cunoaște despre acest model de dispozitiv că nu o suportă.</string>\n    <string name=\"metadata_subchannel_avatars\">Avatarele subcanalelor</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\n\\nActivarea acestei opțiuni poate preveni erorile de redare când se schimbă playerul video curent sau se trece pe ecran complet</string>\n    <string name=\"audio_track_present_in_video\">O coloană sonoră ar trebui să fie deja prezentă în această transmisie</string>\n    <string name=\"open_play_queue\">Deschideți coada de redare</string>\n    <string name=\"prefer_original_audio_summary\">Selectați coloana sonoră originală indiferent de limbă</string>\n    <string name=\"image_quality_none\">Nu încărcați imagini</string>\n    <string name=\"image_quality_high\">Calitate înaltă</string>\n    <string name=\"channel_tab_about\">Despre</string>\n    <string name=\"share_playlist\">Distribuiți playlistul</string>\n    <string name=\"forward\">Avansați</string>\n    <string name=\"select_audio_track_external_players\">Selectați coloana sonoră pentru playeri externi</string>\n    <string name=\"channel_tab_albums\">Albume</string>\n    <string name=\"rewind\">Derulați</string>\n    <string name=\"replay\">Reluați</string>\n    <string name=\"audio_track_type_dubbed\">dublat</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">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.</string>\n    <string name=\"prefer_descriptive_audio_summary\">Selectați o coloană sonoră cu descrieri pentru persoane cu deficiențe vizuale, dacă este disponibilă</string>\n    <string name=\"left_gesture_control_title\">Acțiunea gestului din stânga</string>\n    <string name=\"image_quality_medium\">Calitate medie</string>\n    <string name=\"prefer_descriptive_audio_title\">Preferați audioul descriptiv</string>\n    <string name=\"progressive_load_interval_summary\">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ă</string>\n    <string name=\"prefer_original_audio_title\">Preferați audioul original</string>\n    <string name=\"play_queue_audio_track\">Audio: %s</string>\n    <string name=\"metadata_banners\">Bannere</string>\n    <string name=\"channel_tab_playlists\">Playlisturi</string>\n    <string name=\"right_gesture_control_summary\">Alegeți un gest pentru jumătatea dreaptă din ecranul playerului</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"main_tabs_position_summary\">Mutați fila principală în partea de jos</string>\n    <string name=\"audio_track\">Coloană sonoră</string>\n    <string name=\"no_live_streams\">Fără transmisii în direct</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"play\">Redați</string>\n    <string name=\"more_options\">Mai multe opțiuni</string>\n    <string name=\"metadata_thumbnails\">Miniaturi</string>\n    <string name=\"settings_category_exoplayer_title\">Setări pentru ExoPlayer</string>\n    <string name=\"brightness\">Luminozitate</string>\n    <string name=\"duration\">Durată</string>\n    <string name=\"no_streams\">Fără transmisii</string>\n    <string name=\"channel_tab_channels\">Canale</string>\n    <string name=\"previous_stream\">Transmisia anterioară</string>\n    <string name=\"left_gesture_control_summary\">Alegeți un gest pentru jumătatea stângă din ecranul playerului</string>\n    <string name=\"channel_tab_livestreams\">În direct</string>\n    <string name=\"channel_tab_shorts\">Shorturi</string>\n    <string name=\"metadata_uploader_avatars\">Avatarele autorului</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s răspuns</item>\n        <item quantity=\"few\">%s răspunsuri</item>\n        <item quantity=\"other\">%s răspunsuri</item>\n    </plurals>\n    <string name=\"show_more\">Arată mai multe</string>\n    <string name=\"show_less\">Arată mai puține</string>\n    <string name=\"channel_tab_tracks\">Piste</string>\n    <string name=\"error_insufficient_storage\">Nu este suficient spațiu liber pe dispozitiv</string>\n    <string name=\"settings_category_backup_restore_title\">Backup și restabilire</string>\n    <string name=\"auto_update_check_description\">NewPipe poate verifica automat pentru versiuni noi din când în când și vă poate notifica când acestea sunt disponibile.\n\\nDoriți să activați acest lucru?</string>\n    <string name=\"reset_settings_summary\">Resetează toate setările la valorile inițiale</string>\n    <string name=\"yes\">Da</string>\n    <string name=\"no\">Nu</string>\n    <string name=\"reset_settings_title\">Resetează setări</string>\n    <string name=\"reset_all_settings\">Resetarea tuturor setărilor va elimina toate setările tale preferate și va reporni aplicația.\n\\n\n\\nSigur doriți să continuați?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">secundar</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Distribuie ca listă de redare temporară YouTube</string>\n    <string name=\"tab_bookmarks_short\">Liste de redare</string>\n    <string name=\"feed_group_page_summary\">Pagina grupului de canale</string>\n    <string name=\"search_with_service_name\">Caută: %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Caută %1$s (%2$s)</string>\n    <string name=\"select_a_feed_group\">Selectează un grup de fluxuri</string>\n    <string name=\"no_feed_group_created_yet\">Încă nu a fost creat niciun grup de fluxuri</string>\n    <string name=\"channel_tab_likes\">Aprecieri</string>\n    <string name=\"migration_info_6_7_title\">Pagina SoundCloud Top 50 a fost eliminată</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud a eliminat Top 50. Fila corespunzătoare a fost eliminată din pagina principală.</string>\n    <string name=\"permission_display_over_apps_permission_name\">„Permite afișarea deasupra altor aplicații”</string>\n    <string name=\"short_thousand\">%s mii</string>\n    <string name=\"short_million\">%s mil.</string>\n    <string name=\"short_billion\">%s mld.</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-rom/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Опубликовано %1$s</string>\n    <string name=\"no_player_found\">Потоковый плеер не найден. Установить VLC?</string>\n    <string name=\"install\">Установить</string>\n    <string name=\"cancel\">Отмена</string>\n    <string name=\"open_in_browser\">Открыть в браузере</string>\n    <string name=\"share\">Поделиться</string>\n    <string name=\"download\">Скачать</string>\n    <string name=\"search\">Поиск</string>\n    <string name=\"settings\">Настройки</string>\n    <string name=\"did_you_mean\">Возможно, вы имели в виду «%1$s»?</string>\n    <string name=\"share_dialog_title\">Поделиться</string>\n    <string name=\"download_path_title\">Папка для скачанного видео</string>\n    <string name=\"download_path_summary\">Папка для скачанного видео</string>\n    <string name=\"download_path_dialog_title\">Введите путь к папке для скачивания видео</string>\n    <string name=\"default_resolution_title\">Разрешение по умолчанию</string>\n    <string name=\"play_with_kodi_title\">Воспроизвести в Kodi</string>\n    <string name=\"kore_not_found\">Приложение Kore не найдено, установить\\?</string>\n    <string name=\"show_play_with_kodi_title\">Показать опцию «Воспроизвести в Kodi»</string>\n    <string name=\"show_play_with_kodi_summary\">Показать опцию воспроизведения через медиацентр Kodi</string>\n    <string name=\"play_audio\">Аудио</string>\n    <string name=\"default_audio_format_title\">Формат аудио по умолчанию</string>\n    <string name=\"download_dialog_title\">Скачать</string>\n    <string name=\"unsupported_url\">URL не поддерживается</string>\n    <string name=\"show_next_and_similar_title\">Показать похожие видео</string>\n    <string name=\"content_language_title\">Язык контента по умолчанию</string>\n    <string name=\"settings_category_video_audio_title\">Видео и аудио</string>\n    <string name=\"settings_category_appearance_title\">Внешний вид</string>\n    <string name=\"detail_thumbnail_view_description\">Воспроизвести видео, длительность:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Миниатюра аватара пользователя</string>\n    <string name=\"detail_dislikes_img_view_description\">Не понравилось</string>\n    <string name=\"detail_likes_img_view_description\">Понравилось</string>\n    <string name=\"use_external_video_player_title\">Внешний видеоплеер</string>\n    <string name=\"use_external_audio_player_title\">Внешний аудиоплеер</string>\n    <string name=\"background_player_playing_toast\">Воспроизведение в фоновом режиме</string>\n    <string name=\"theme_title\">Тема</string>\n    <string name=\"dark_theme_title\">Тёмная</string>\n    <string name=\"light_theme_title\">Светлая</string>\n    <string name=\"network_error\">Ошибка сети</string>\n    <string name=\"download_path_audio_title\">Папка для скачанного аудио</string>\n    <string name=\"download_path_audio_summary\">Загруженные аудиофайлы хранятся здесь</string>\n    <string name=\"download_path_audio_dialog_title\">Введите путь к папке для скачивания аудио</string>\n    <string name=\"main_bg_subtitle\">Нажмите на лупу, чтобы начать.</string>\n    <string name=\"msg_wait\">Подождите…</string>\n    <string name=\"msg_threads\">Потоки</string>\n    <string name=\"ok\">ОК</string>\n    <string name=\"start\">Начать</string>\n    <string name=\"pause\">Пауза</string>\n    <string name=\"delete\">Удалить</string>\n    <string name=\"checksum\">Контрольная сумма</string>\n    <string name=\"msg_name\">Имя файла</string>\n    <string name=\"msg_error\">Ошибка</string>\n    <string name=\"msg_running\">NewPipe загружает</string>\n    <string name=\"msg_running_detail\">Подробнее</string>\n    <string name=\"msg_copied\">Скопировано в буфер обмена</string>\n    <string name=\"no_available_dir\">Выберите папку для загрузки позже в настройках</string>\n    <string name=\"show_age_restricted_content_title\">Контент с возрастным ограничением</string>\n    <string name=\"general_error\">Ошибка</string>\n    <string name=\"your_comment\">Ваш комментарий (English):</string>\n    <string name=\"content\">Контент</string>\n    <string name=\"duration_live\">Трансляция</string>\n    <string name=\"downloads\">Загрузки</string>\n    <string name=\"downloads_title\">Загрузки</string>\n    <string name=\"error_report_title\">Отчёт об ошибке</string>\n    <string name=\"parsing_error\">Не удалось разобрать веб-сайт</string>\n    <string name=\"content_not_available\">Контент недоступен</string>\n    <string name=\"could_not_setup_download_menu\">Не удалось создать меню загрузки</string>\n    <string name=\"app_ui_crash\">Приложение/UI завершило работу</string>\n    <string name=\"sorry_string\">Никогда такого не было, и вот опять.</string>\n    <string name=\"error_report_button_text\">Отправить по почте</string>\n    <string name=\"error_snackbar_message\">Извините, что-то пошло не так.</string>\n    <string name=\"error_snackbar_action\">Отчёт</string>\n    <string name=\"what_device_headline\">Информация:</string>\n    <string name=\"what_happened_headline\">Что произошло:</string>\n    <string name=\"error_details_headline\">Подробности:</string>\n    <string name=\"video\">Видео</string>\n    <string name=\"audio\">Аудио</string>\n    <string name=\"retry\">Повтор</string>\n    <string name=\"could_not_load_thumbnails\">Не удалось загрузить все миниатюры</string>\n    <string name=\"controls_background_title\">В фоне</string>\n    <string name=\"controls_popup_title\">В окне</string>\n    <string name=\"show_higher_resolutions_summary\">Только некоторые устройства поддерживают видео в 2K/4K</string>\n    <string name=\"default_video_format_title\">Формат видео по умолчанию</string>\n    <string name=\"black_theme_title\">Чёрная</string>\n    <string name=\"popup_remember_size_pos_title\">Помнить параметры окна</string>\n    <string name=\"popup_playing_toast\">Воспроизведение во всплывающем окне</string>\n    <string name=\"clear\">Очистить</string>\n    <string name=\"all\">Всё</string>\n    <string name=\"info_labels\">Что:\\nЗапрос:\\nЯзык контента:\\nСтрана контента:\\nЯзык приложения:\\nСервис:\\nВремя по Гринвичу:\\nПакет:\\nВерсия пакета:\\nВерсия ОС:</string>\n    <string name=\"msg_popup_permission\">Это разрешение нужно для\n\\nвоспроизведения в окне</string>\n    <string name=\"open_in_popup_mode\">Открыть во всплывающем окне</string>\n    <string name=\"show_search_suggestions_summary\">Выберите отображаемые предложения поиска</string>\n    <string name=\"disabled\">Отключено</string>\n    <string name=\"use_external_video_player_summary\">Убирает звук в некоторых разрешениях</string>\n    <string name=\"default_popup_resolution_title\">Разрешение всплывающего окна</string>\n    <string name=\"popup_remember_size_pos_summary\">Помнить последние размер и позицию всплывающего окна</string>\n    <string name=\"show_search_suggestions_title\">Предложения поиска</string>\n    <string name=\"best_resolution\">Лучшее разрешение</string>\n    <string name=\"title_activity_recaptcha\">Запрос reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Запрошен ввод reCAPTCHA</string>\n    <string name=\"show_higher_resolutions_title\">Высокие разрешения</string>\n    <string name=\"title_activity_about\">О NewPipe</string>\n    <string name=\"app_license_title\">Лицензия NewPipe</string>\n    <string name=\"tab_licenses\">Лицензии</string>\n    <string name=\"title_licenses\">Сторонние лицензии</string>\n    <string name=\"tab_about\">О приложении</string>\n    <string name=\"read_full_license\">Прочитать лицензию</string>\n    <string name=\"app_description\">Свободный и легковесный потоковый плеер для Android.</string>\n    <string name=\"view_on_github\">Открыть на GitHub</string>\n    <string name=\"contribution_encouragement\">Приветствуется всё — идеи, перевод, редизайн, чистка кода или огромные изменения в коде. Чем больше сделано, тем лучше!</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s • %2$s • %3$s</string>\n    <string name=\"contribution_title\">Помощь проекту</string>\n    <string name=\"subscribe_button_title\">Подписаться</string>\n    <string name=\"subscription_change_failed\">Не удалось изменить подписку</string>\n    <string name=\"subscription_update_failed\">Не удалось обновить подписку</string>\n    <string name=\"tab_subscriptions\">Подписки</string>\n    <string name=\"fragment_feed_title\">Что нового</string>\n    <string name=\"enable_search_history_title\">История поиска</string>\n    <string name=\"enable_search_history_summary\">Хранить запросы поиска (локально)</string>\n    <string name=\"enable_watch_history_title\">История просмотров</string>\n    <string name=\"enable_playback_resume_title\">Продолжать воспроизведение</string>\n    <string name=\"enable_playback_resume_summary\">Восстанавливать последнюю позицию</string>\n    <string name=\"enable_playback_state_lists_title\">Позиции в списках</string>\n    <string name=\"enable_playback_state_lists_summary\">Показать индикаторы позиций просмотра в списках</string>\n    <string name=\"settings_category_clear_data_title\">Очистка данных</string>\n    <string name=\"enable_watch_history_summary\">Запоминать воспроизведённые потоки</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Возобновить при фокусе</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Возобновлять воспроизведение после перерывов (например, телефонных звонков)</string>\n    <string name=\"notification_channel_name\">Уведомление NewPipe</string>\n    <string name=\"notification_channel_description\">Уведомления для плеера NewPipe</string>\n    <string name=\"settings_category_downloads_title\">Загрузки</string>\n    <string name=\"settings_file_charset_title\">Допустимые символы имён файлов</string>\n    <string name=\"settings_file_replacement_character_summary\">Заменяет недопустимые символы</string>&gt;\n    <string name=\"settings_file_replacement_character_title\">Символ для замены</string>\n    <string name=\"charset_letters_and_digits\">Буквы и цифры</string>\n    <string name=\"charset_most_special_characters\">Большинство спецсимволов</string>\n    <string name=\"title_activity_history\">История</string>\n    <string name=\"action_history\">История</string>\n    <string name=\"settings_category_player_title\">Плеер</string>\n    <string name=\"settings_category_player_behavior_title\">Поведение</string>\n    <string name=\"settings_category_history_title\">История и кэш</string>\n    <string name=\"undo\">Отмена</string>\n    <string name=\"search_no_results\">Нет результатов</string>\n    <string name=\"empty_list_subtitle\">Ничего нет</string>\n    <string name=\"no_subscribers\">Нет подписчиков</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s подписчик</item>\n        <item quantity=\"few\">%s подписчика</item>\n        <item quantity=\"many\">%s подписчиков</item>\n    </plurals>\n    <string name=\"no_views\">Нет просмотров</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s просмотр</item>\n        <item quantity=\"few\">%s просмотра</item>\n        <item quantity=\"many\">%s просмотров</item>\n    </plurals>\n    <string name=\"no_videos\">Нет видео</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s видео</item>\n        <item quantity=\"few\">%s видео</item>\n        <item quantity=\"many\">%s видео</item>\n        <item quantity=\"other\">%s видео</item>\n    </plurals>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s новое видео</item>\n        <item quantity=\"few\">%s новых видео</item>\n        <item quantity=\"many\">%s новых видео</item>\n    </plurals>\n    <string name=\"delete_item_search_history\">Удалить этот элемент из истории поиска?</string>\n    <string name=\"main_page_content\">Главная страница</string>\n    <string name=\"blank_page_summary\">Пустая страница</string>\n    <string name=\"kiosk_page_summary\">Киоск</string>\n    <string name=\"channel_page_summary\">Канал</string>\n    <string name=\"select_a_channel\">Выберите канал</string>\n    <string name=\"select_a_kiosk\">Выберите киоск</string>\n    <string name=\"trending\">Тренды</string>\n    <string name=\"top_50\">Топ 50</string>\n    <string name=\"new_and_hot\">Новое и горячее</string>\n    <string name=\"play_all\">Играть всё</string>\n    <string name=\"player_stream_failure\">Не удалось воспроизвести этот поток</string>\n    <string name=\"play_queue_stream_detail\">Сведения</string>\n    <string name=\"play_queue_audio_settings\">Настройки звука</string>\n    <string name=\"no_channel_subscribed_yet\">Подписок на каналы пока нет</string>\n    <string name=\"play_queue_remove\">Удалить</string>\n    <string name=\"subscribed_button_title\">Вы подписаны</string>\n    <string name=\"channel_unsubscribed\">Подписка отменена</string>\n    <string name=\"show_hold_to_append_title\">Показать подсказку «Зажмите, чтобы добавить»</string>\n    <string name=\"show_hold_to_append_summary\">Показывать подсказку при нажатии \\\"В фоне\\\" или на всплывающую кнопку \\\"Подробнее:\\\" в видео</string>\n    <string name=\"unknown_content\">[Неизвестно]</string>\n    <string name=\"player_recoverable_failure\">Восстановление после ошибки плеера</string>\n    <string name=\"hold_to_append\">Зажмите, чтобы добавить в очередь</string>\n    <string name=\"start_here_on_background\">Играть отсюда в фоне</string>\n    <string name=\"start_here_on_popup\">Играть отсюда в окне</string>\n    <string name=\"no_player_found_toast\">Потоковый плеер не найден (можно установить VLC).</string>\n    <string name=\"default_content_country_title\">Страна контента по умолчанию</string>\n    <string name=\"always\">Всегда</string>\n    <string name=\"just_once\">Только сейчас</string>\n    <string name=\"switch_to_background\">Перейти в фон</string>\n    <string name=\"switch_to_popup\">Перейти в окно</string>\n    <string name=\"switch_to_main\">Перейти в плеер</string>\n    <string name=\"player_unrecoverable_failure\">Неустранимая ошибка плеера</string>\n    <string name=\"external_player_unsupported_link_type\">Внешние плееры не поддерживают эти типы ссылок</string>\n    <string name=\"video_streams_empty\">Видеопотоки не найдены</string>\n    <string name=\"audio_streams_empty\">Аудиопотоки не найдены</string>\n    <string name=\"donation_title\">Пожертвование</string>\n    <string name=\"donation_encouragement\">Разработчики NewPipe ценой своего свободного времени делают вашу жизнь чуть удобнее. Отплатите им тем же — наслаждаясь чашечкой кофе, они смогут сделать NewPipe ещё круче.</string>\n    <string name=\"give_back\">Воздать должное</string>\n    <string name=\"website_title\">Веб-сайт</string>\n    <string name=\"website_encouragement\">Для получения более подробной информации и последних новостей о NewPipe посетите наш веб-сайт.</string>\n    <string name=\"drawer_open\">Открыть боковую панель</string>\n    <string name=\"drawer_close\">Закрыть боковую панель</string>\n    <string name=\"video_player\">Видеоплеер</string>\n    <string name=\"background_player\">Фоновый плеер</string>\n    <string name=\"popup_player\">Плеер в окне</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Получение сведений…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Загрузка запрошенного контента</string>\n    <string name=\"controls_download_desc\">Скачать файл трансляции</string>\n    <string name=\"show_info\">Показать сведения</string>\n    <string name=\"tab_bookmarks\">Плейлисты в закладках</string>\n    <string name=\"controls_add_to_playlist_title\">В плейлист</string>\n    <string name=\"use_inexact_seek_title\">Быстрый поиск позиции</string>\n    <string name=\"use_inexact_seek_summary\">Выполняется быстрее, но менее точно. Не работает для перемотки на 5, 15 или 25 секунд</string>\n    <string name=\"auto_queue_title\">Автодополнение очереди</string>\n    <string name=\"auto_queue_summary\">Добавлять похожие потоки в очередь при воспроизведении последнего потока, если не включён повтор</string>\n    <string name=\"settings_category_debug_title\">Отладка</string>\n    <string name=\"file\">Файл</string>\n    <string name=\"import_data_title\">Импорт данных</string>\n    <string name=\"export_data_title\">Экспорт данных</string>\n    <string name=\"import_data_summary\">Текущие подписки, плейлисты, история и (опционально) настройки будут заменены</string>\n    <string name=\"export_data_summary\">Экспорт подписок, плейлистов, истории и настроек</string>\n    <string name=\"invalid_directory\">Папка не существует</string>\n    <string name=\"invalid_source\">Папка или источник контента не существуют</string>\n    <string name=\"invalid_file\">Файл не существует или нет разрешения на его чтение или запись</string>\n    <string name=\"file_name_empty_error\">Имя файла не может быть пустым</string>\n    <string name=\"error_occurred_detail\">Произошла ошибка: %1$s</string>\n    <string name=\"detail_drag_description\">Перетащите, чтобы изменить порядок</string>\n    <string name=\"create\">Создать</string>\n    <string name=\"dismiss\">Скрыть</string>\n    <string name=\"rename\">Переименовать</string>\n    <string name=\"title_last_played\">Недавно проигранные</string>\n    <string name=\"title_most_played\">Часто проигрываемые</string>\n    <string name=\"export_complete_toast\">Экспорт завершён</string>\n    <string name=\"import_complete_toast\">Импорт завершён</string>\n    <string name=\"no_valid_zip_file\">Нет верного Zip-файла</string>\n    <string name=\"could_not_import_all_files\">Внимание: не все файлы были импортированы.</string>\n    <string name=\"override_current_data\">Текущие данные будут заменены.</string>\n    <string name=\"always_ask_open_action\">Всегда спрашивать</string>\n    <string name=\"create_playlist\">Новый плейлист</string>\n    <string name=\"rename_playlist\">Переименовать</string>\n    <string name=\"name\">Имя</string>\n    <string name=\"add_to_playlist\">В плейлист</string>\n    <string name=\"set_as_playlist_thumbnail\">На миниатюру плейлиста</string>\n    <string name=\"bookmark_playlist\">Сохранить плейлист</string>\n    <string name=\"unbookmark_playlist\">Удалить плейлист</string>\n    <string name=\"delete_playlist_prompt\">Удалить плейлист\\?</string>\n    <string name=\"playlist_creation_success\">Плейлист создан</string>\n    <string name=\"playlist_add_stream_success\">Добавлено в плейлист</string>\n    <string name=\"playlist_thumbnail_change_success\">Миниатюра плейлиста изменена.</string>\n    <string name=\"caption_none\">Без субтитров</string>\n    <string name=\"resize_fit\">Подогнать</string>\n    <string name=\"resize_fill\">Заполнить</string>\n    <string name=\"resize_zoom\">Приблизить</string>\n    <string name=\"caption_auto_generated\">Создано автоматически</string>\n    <string name=\"enable_leak_canary_summary\">Мониторинг утечек памяти может привести к зависанию приложения</string>\n    <string name=\"enable_disposed_exceptions_title\">Сообщать об ошибках вне жизненного цикла</string>\n    <string name=\"enable_disposed_exceptions_summary\">Принудительно сообщать о недоставляемых вне жизненного цикла фрагмента или активности Rx-исключениях после высвобождения ресурсов</string>\n    <string name=\"import_title\">Импорт</string>\n    <string name=\"import_from\">Импорт из</string>\n    <string name=\"export_to\">Экспорт в</string>\n    <string name=\"import_ongoing\">Импорт…</string>\n    <string name=\"export_ongoing\">Экспорт…</string>\n    <string name=\"import_file_title\">Импорт файла</string>\n    <string name=\"previous_export\">Предыдущий экспорт</string>\n    <string name=\"subscriptions_import_unsuccessful\">Не удалось импортировать подписки</string>\n    <string name=\"subscriptions_export_unsuccessful\">Не удалось экспортировать подписки</string>\n    <string name=\"import_youtube_instructions\">Импортируйте подписки YouTube с помощью Google Takeout:\n\\n\n\\n1. Перейдите по ссылке: %1$s\n\\n2. Авторизуйтесь, если потребуется\n\\n3. Отметьте пункт «YouTube и YouTube Music», затем выберите тип «подписки»\n\\n4. Нажмите «Далее» и «Создать экспорт»\n\\n5. Нажмите кнопку «Скачать», когда она появится\n\\n6. Нажмите ИМПОРТ ФАЙЛА внизу и выберите скачанный ZIP-архив\n\\n7. [Если импортировать ZIP-файл не удалось] Из скачанного ZIP-архива распакуйте CSV-файл (обычно это «YouTube и YouTube Music/подписки/подписки.csv»), нажмите ИМПОРТ ФАЙЛА и выберите этот CSV-файл</string>\n    <string name=\"import_soundcloud_instructions\">Импортируйте профиль SoundCloud, введя его URL или ID:\n\\n\n\\n1. Включите «Версия для ПК» в браузере (сайт не поддерживается мобильными устройствами)\n\\n2. Перейдите по ссылке %1$s\n\\n3. Авторизуйтесь, если потребуется\n\\n4. Скопируйте URL профиля из адресной строки.</string>\n    <string name=\"import_soundcloud_instructions_hint\">вашID, soundcloud.com/вашID</string>\n    <string name=\"import_network_expensive_warning\">Это действие может вызвать большой расход трафика.\n\\n \n\\nПродолжить?</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Кэш изображений очищен</string>\n    <string name=\"metadata_cache_wipe_title\">Очистить кэш метаданных</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Кэш метаданных очищен</string>\n    <string name=\"playback_speed_control\">Скорость воспроизведения</string>\n    <string name=\"playback_tempo\">Темп</string>\n    <string name=\"playback_pitch\">Тон</string>\n    <string name=\"unhook_checkbox\">Независимо (искажения)</string>\n    <string name=\"metadata_cache_wipe_summary\">Удалить все загруженные данные веб-страниц</string>\n    <string name=\"preferred_open_action_settings_summary\">При открытии ссылки на контент — %s</string>\n    <string name=\"no_streams_available_download\">Нет потоков для загрузки</string>\n    <string name=\"caption_setting_title\">Субтитры</string>\n    <string name=\"caption_setting_description\">Изменить размер текста и стиль субтитров. Нужен перезапуск</string>\n    <string name=\"clear_views_history_title\">Очистить историю</string>\n    <string name=\"delete_view_history_alert\">Удалить всю историю просмотров\\?</string>\n    <string name=\"watch_history_deleted\">История просмотров удалена</string>\n    <string name=\"clear_search_history_title\">Очистить запросы поиска</string>\n    <string name=\"clear_search_history_summary\">Удалить все запросы поиска</string>\n    <string name=\"clear_views_history_summary\">Удалить историю воспроизведённых потоков и позиции воспроизведения</string>\n    <string name=\"delete_search_history_alert\">Удалить всю историю поиска\\?</string>\n    <string name=\"search_history_deleted\">История поиска удалена</string>\n    <string name=\"one_item_deleted\">1 элемент удалён.</string>\n    <string name=\"app_license\">NewPipe — свободное программное обеспечение: вы можете использовать, изучать и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять его в соответствии с условиями GNU General Public License, опубликованной Free Software Foundation, либо версии 3, либо (по вашему выбору) любой более поздней версии.</string>\n    <string name=\"preferred_open_action_settings_title\">При открытии ссылки</string>\n    <string name=\"import_settings\">Хотите импортировать настройки?</string>\n    <string name=\"privacy_policy_title\">Конфиденциальность</string>\n    <string name=\"privacy_policy_encouragement\">Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никакие данные без вашего согласия.\n\\nПолитика конфиденциальности подробно объясняет, какие данные обрабатываются и хранятся при отправке отчёта о сбоях.</string>\n    <string name=\"read_privacy_policy\">Прочитать политику</string>\n    <string name=\"start_accept_privacy_policy\">В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней.\n\\nВам необходимо принять её условия, чтобы отправить нам отчёт об ошибке.</string>\n    <string name=\"accept\">Принять</string>\n    <string name=\"decline\">Отклонить</string>\n    <string name=\"limit_data_usage_none_description\">Без ограничений</string>\n    <string name=\"limit_mobile_data_usage_title\">Предел разрешения в мобильной сети</string>\n    <string name=\"channels\">Каналы</string>\n    <string name=\"playlists\">Плейлисты</string>\n    <string name=\"tracks\">Треки</string>\n    <string name=\"users\">Пользователи</string>\n    <string name=\"skip_silence_checkbox\">Проматывать тишину</string>\n    <string name=\"playback_step\">Шаг</string>\n    <string name=\"playback_reset\">Сброс</string>\n    <string name=\"minimize_on_exit_title\">При сворачивании плеера</string>\n    <string name=\"minimize_on_exit_summary\">При переключении со встроенного плеера на другое приложение — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Ничего не делать</string>\n    <string name=\"minimize_on_exit_background_description\">Свернуть в фоновый плеер</string>\n    <string name=\"minimize_on_exit_popup_description\">Свернуть в плеер в окне</string>\n    <string name=\"list_view_mode\">Вид списка</string>\n    <string name=\"list\">Список</string>\n    <string name=\"grid\">Сетка</string>\n    <string name=\"auto\">Автоматически</string>\n    <string name=\"download_to_sdcard_error_message\">Загрузка на SD-карту невозможна. Сбросить расположение папки загрузки\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Внешнее хранилище недоступно</string>\n    <string name=\"main_page_content_summary\">Вкладки, видимые на главной странице</string>\n    <string name=\"restore_defaults\">Значения по умолчанию</string>\n    <string name=\"restore_defaults_confirmation\">Восстановить значения по умолчанию\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Ошибка чтения сохранённых вкладок. Используются вкладки по умолчанию</string>\n    <string name=\"subscribers_count_not_available\">Количество подписчиков недоступно</string>\n    <string name=\"tab_choose\">Выберите вкладку</string>\n    <string name=\"unsubscribe\">Отписаться</string>\n    <string name=\"settings_category_updates_title\">Обновления</string>\n    <string name=\"file_deleted\">Файл удалён</string>\n    <string name=\"app_update_notification_channel_name\">Уведомление об обновлении приложения</string>\n    <string name=\"app_update_notification_channel_description\">Уведомления о новых версиях NewPipe</string>\n    <string name=\"updates_setting_title\">Обновления</string>\n    <string name=\"updates_setting_description\">Показать уведомление при наличии новой версии</string>\n    <string name=\"app_update_available_notification_title\">Доступно обновление NewPipe!</string>\n    <string name=\"missions_header_finished\">Завершено</string>\n    <string name=\"paused\">приостановлено</string>\n    <string name=\"queued\">в очереди</string>\n    <string name=\"enqueue\">Добавить в очередь</string>\n    <string name=\"permission_denied\">Действие запрещено системой</string>\n    <string name=\"download_failed\">Ошибка загрузки</string>\n    <string name=\"overwrite\">Перезаписать</string>\n    <string name=\"overwrite_finished_warning\">Файл с таким именем уже существует</string>\n    <string name=\"download_already_running\">Загрузка с таким именем уже выполняется</string>\n    <string name=\"show_error\">Показать текст ошибки</string>\n    <string name=\"error_path_creation\">Папка назначения не может быть создана</string>\n    <string name=\"error_file_creation\">Файл не может быть создан</string>\n    <string name=\"error_unknown_host\">Сервер не найден</string>\n    <string name=\"error_http_unsupported_range\">Сервер не принимает многопоточные загрузки, повторная попытка с @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Не найдено</string>\n    <string name=\"stop\">Остановить</string>\n    <string name=\"events\">События</string>\n    <string name=\"conferences\">Конференции</string>\n    <string name=\"post_processing\">пост-обработка</string>\n    <string name=\"missions_header_pending\">В очереди</string>\n    <string name=\"generate_unique_name\">Создать уникальное имя</string>\n    <string name=\"max_retry_msg\">Максимум попыток</string>\n    <string name=\"max_retry_desc\">Количество попыток перед отменой загрузки</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Некоторые загрузки не поддерживают докачку и начнутся сначала</string>\n    <string name=\"error_ssl_exception\">Не удалось установить защищённое соединение</string>\n    <string name=\"error_connect_host\">Не удалось соединиться с сервером</string>\n    <string name=\"error_http_no_content\">Не удалось получить данные с сервера</string>\n    <string name=\"error_postprocessing_failed\">Пост-обработка не удалась</string>\n    <string name=\"pause_downloads_on_mobile\">Прервать в мобильной сети</string>\n    <string name=\"close\">Закрыть</string>\n    <string name=\"error_timeout\">Время соединения истекло</string>\n    <string name=\"show_comments_title\">Показать комментарии</string>\n    <string name=\"show_comments_summary\">Отключите, чтобы скрыть комментарии</string>\n    <string name=\"autoplay_title\">Автовоспроизведение</string>\n    <string name=\"no_comments\">Нет комментариев</string>\n    <string name=\"error_unable_to_load_comments\">Не удалось загрузить комментарии</string>\n    <string name=\"watch_history_states_deleted\">Позиции воспроизведения удалены</string>\n    <string name=\"missing_file\">Файл перемещён или удалён</string>\n    <string name=\"overwrite_unrelated_warning\">Файл с таким именем уже существует</string>\n    <string name=\"overwrite_failed\">не удаётся перезаписать файл</string>\n    <string name=\"download_already_pending\">В очереди уже есть загрузка с таким именем</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe была закрыта во время работы над файлом</string>\n    <string name=\"error_insufficient_storage_left\">Закончилось свободное место на устройстве</string>\n    <string name=\"error_progress_lost\">Прогресс потерян, так как файл был удалён</string>\n    <string name=\"confirm_prompt\">Действительно удалить историю загрузок и загруженные файлы\\?</string>\n    <string name=\"enable_queue_limit\">Ограничить очередь загрузки</string>\n    <string name=\"enable_queue_limit_desc\">Только одна одновременная загрузка</string>\n    <string name=\"start_downloads\">Начать загрузку</string>\n    <string name=\"pause_downloads\">Приостановить загрузку</string>\n    <string name=\"downloads_storage_ask_title\">Запрашивать папку загрузки</string>\n    <string name=\"downloads_storage_ask_summary\">Для каждой загрузки запрашивать папку для сохранения.\n\\nВключите системный выбор папки (SAF), если хотите загружать на внешнюю SD-карту</string>\n    <string name=\"downloads_storage_use_saf_title\">Системный выбор папки (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">«Storage Access Framework» позволяет сохранять файлы на внешнюю SD-карту</string>\n    <string name=\"clear_playback_states_title\">Очистить позиции воспроизведения</string>\n    <string name=\"clear_playback_states_summary\">Удалить все позиции воспроизведения</string>\n    <string name=\"delete_playback_states_alert\">Удалить все позиции воспроизведения\\?</string>\n    <string name=\"drawer_header_description\">Переключение сервисов, сейчас выбрано:</string>\n    <string name=\"default_kiosk_page_summary\">Киоск по умолчанию</string>\n    <string name=\"no_one_watching\">Никто не смотрел</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s зритель</item>\n        <item quantity=\"few\">%s зрителя</item>\n        <item quantity=\"many\">%s зрителей</item>\n    </plurals>\n    <string name=\"no_one_listening\">Нет слушателей</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s слушатель</item>\n        <item quantity=\"few\">%s слушателя</item>\n        <item quantity=\"many\">%s слушателей</item>\n    </plurals>\n    <string name=\"seek_duration_title\">Шаг перемотки</string>\n    <string name=\"peertube_instance_url_title\">Серверы PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Выберите предпочтительные серверы</string>\n    <string name=\"peertube_instance_url_help\">Каталог серверов: %s</string>\n    <string name=\"peertube_instance_add_title\">Новый сервер</string>\n    <string name=\"peertube_instance_add_help\">URL сервера</string>\n    <string name=\"peertube_instance_add_fail\">Не удалось проверить сервер</string>\n    <string name=\"peertube_instance_add_https_only\">Поддерживается только HTTPS</string>\n    <string name=\"peertube_instance_add_exists\">Сервер уже существует</string>\n    <string name=\"local\">Локальное</string>\n    <string name=\"recently_added\">Новое</string>\n    <string name=\"most_liked\">Популярное</string>\n    <string name=\"playlist_no_uploader\">Создано автоматически (автор не найден)</string>\n    <string name=\"recovering\">восстановление</string>\n    <string name=\"error_download_resource_gone\">Не удалось восстановить загрузку</string>\n    <string name=\"choose_instance_prompt\">Выберите сервер</string>\n    <string name=\"clear_download_history\">Очистить историю загрузок</string>\n    <string name=\"delete_downloaded_files\">Удаление загруженных файлов</string>\n    <string name=\"permission_display_over_apps\">Разрешите отображение поверх приложений</string>\n    <string name=\"app_language_title\">Язык интерфейса</string>\n    <string name=\"systems_language\">Как в системе</string>\n    <string name=\"subtitle_activity_recaptcha\">По завершении нажмите «Готово»</string>\n    <string name=\"done\">Готово</string>\n    <string name=\"videos_string\">Видео</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d секунда</item>\n        <item quantity=\"few\">%d секунды</item>\n        <item quantity=\"many\">%d секунд</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Из-за ограничений ExoPlayer точность перемотки составляет %d секунд</string>\n    <string name=\"mute\">Отключить звук</string>\n    <string name=\"unmute\">Включить звук</string>\n    <string name=\"feed_group_dialog_empty_name\">Введите имя группы</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d выбрана</item>\n        <item quantity=\"few\">%d выбрано</item>\n        <item quantity=\"many\">%d выбрано</item>\n        <item quantity=\"other\">%d выбрано</item>\n    </plurals>\n    <string name=\"feed_group_dialog_select_subscriptions\">Выберите подписки</string>\n    <string name=\"feed_oldest_subscription_update\">Обновлено: %s</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d день</item>\n        <item quantity=\"few\">%d дня</item>\n        <item quantity=\"many\">%d дней</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d час</item>\n        <item quantity=\"few\">%d часа</item>\n        <item quantity=\"many\">%d часов</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d минута</item>\n        <item quantity=\"few\">%d минуты</item>\n        <item quantity=\"many\">%d минут</item>\n    </plurals>\n    <string name=\"feed_group_dialog_delete_message\">Удалить эту группу\\?</string>\n    <string name=\"feed_subscription_not_loaded_count\">Не загружено: %d</string>\n    <string name=\"feed_create_new_group_button_title\">Создать</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Обычный режим</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Быстрый режим</string>\n    <string name=\"feed_update_threshold_title\">Интервал обновления подписок</string>\n    <string name=\"settings_category_feed_title\">Подписки</string>\n    <string name=\"feed_processing_message\">Обработка канала…</string>\n    <string name=\"feed_notification_loading\">Загрузка канала…</string>\n    <string name=\"feed_update_threshold_option_always_update\">Обновлять всегда</string>\n    <string name=\"feed_group_dialog_empty_selection\">Подписки не выбраны</string>\n    <string name=\"feed_groups_header_title\">Группы каналов</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Если подписки обновляются слишком медленно, попробуйте быстрый режим (включите в настройках или кнопкой внизу).\n\\n\n\\nNewPipe может обновлять подписки двумя способами:\n\\n• получение канала целиком, медленное, с полными сведениями;\n\\n• обновление по RSS, быстрое, с потерей сведений.\n\\n\n\\nПри быстром обновлении теряются длительность элемента и его тип (трансляция или обычное видео), могут быть получены не все элементы канала.\n\\n\n\\nКак пример, YouTube поддерживает быстрое обновление.\n\\n\n\\nВыбор за вами: скорость или точность.</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Получать из выделенной ленты, когда доступно</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Доступно для некоторых сервисов, быстрое, может возвращать не всё содержимое канала и не содержать часть сведений (длительность, статус трансляции)</string>\n    <string name=\"feed_update_threshold_summary\">Период актуальности подписок после обновления — %s</string>\n    <string name=\"restricted_video\">Это видео имеет возрастное ограничение.\n\\n\n\\nВключите «%1$s» в настройках, если хотите его видеть.</string>\n    <string name=\"content_not_supported\">NewPipe не поддерживает этот контент. \n\\n \n\\nВозможно, поддержка появится в следующих версиях.</string>\n    <string name=\"infinite_videos\">∞ видео</string>\n    <string name=\"more_than_100_videos\">100+ видео</string>\n    <string name=\"songs\">Треки</string>\n    <string name=\"artists\">Исполнители</string>\n    <string name=\"albums\">Альбомы</string>\n    <string name=\"remove_watched\">Удалить просмотренные</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Да, и частично просмотренные</string>\n    <string name=\"remove_watched_popup_warning\">Трансляции, просмотренные до или после добавления в плейлист, будут удалены. \\nВы уверены?</string>\n    <string name=\"remove_watched_popup_title\">Удалить просмотренные трансляции?</string>\n    <string name=\"show_original_time_ago_summary\">Отображать сообщённое сервисом время с момента публикации</string>\n    <string name=\"show_original_time_ago_title\">Исходное время публикации</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Включить \\\"Ограниченный режим\\\" YouTube</string>\n    <string name=\"video_detail_by\">От %s</string>\n    <string name=\"channel_created_by\">Создано %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Миниатюра значка канала</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Только несгруппированные</string>\n    <string name=\"no_playlist_bookmarked_yet\">Плейлистов ещё нет</string>\n    <string name=\"error_report_open_github_notice\">Проверьте, не открыта ли уже проблема по этой ошибке. Дубликаты впустую тратят наше время, отвлекая от реальных задач.</string>\n    <string name=\"search_showing_result_for\">Результаты для: %s</string>\n    <string name=\"playlist_page_summary\">Страница плейлиста</string>\n    <string name=\"select_a_playlist\">Выберите плейлист</string>\n    <string name=\"error_report_open_issue_button_text\">Сообщить на GitHub</string>\n    <string name=\"copy_for_github\">Копировать Markdown</string>\n    <string name=\"never\">Никогда</string>\n    <string name=\"wifi_only\">Только по Wi-Fi</string>\n    <string name=\"autoplay_summary\">Автовоспроизведение — %s</string>\n    <string name=\"title_activity_play_queue\">Очередь воспроизведения</string>\n    <string name=\"unsupported_url_dialog_message\">Не удалось распознать URL. Открыть в другом приложении\\?</string>\n    <string name=\"auto_queue_toggle\">Авто-очередь</string>\n    <string name=\"clear_queue_confirmation_description\">Очередь активного плеера будет заменена</string>\n    <string name=\"clear_queue_confirmation_title\">Подтверждать очистку очереди</string>\n    <string name=\"clear_queue_confirmation_summary\">Переход от одного плеера к другому может заменить вашу очередь</string>\n    <string name=\"settings_category_player_notification_summary\">Настроить уведомление о воспроизводимом сейчас потоке</string>\n    <string name=\"notification_action_nothing\">Ничего</string>\n    <string name=\"notification_action_buffering\">Буферизация</string>\n    <string name=\"notification_action_shuffle\">Перемешать</string>\n    <string name=\"notification_action_repeat\">Повтор</string>\n    <string name=\"notification_actions_at_most_three\">В компактном уведомлении доступно не более трёх действий!</string>\n    <string name=\"notification_actions_summary\">Отредактируйте каждое действие уведомления ниже, нажав на него. Выберите до трёх из них, которые будут отображаться в компактном уведомлении, используя флажки справа.</string>\n    <string name=\"notification_action_4_title\">Пятое действие</string>\n    <string name=\"notification_action_3_title\">Четвёртое действие</string>\n    <string name=\"notification_action_2_title\">Третье действие</string>\n    <string name=\"notification_action_1_title\">Второе действие</string>\n    <string name=\"notification_action_0_title\">Первое действие</string>\n    <string name=\"notification_scale_to_square_image_summary\">Масштабировать миниатюру видео 16:9 к 1:1 (возможны искажения)</string>\n    <string name=\"notification_scale_to_square_image_title\">Миниатюра 1:1</string>\n    <string name=\"show_memory_leaks\">Показать утечки памяти</string>\n    <string name=\"recaptcha_cookies_cleared\">Куки reCAPTCHA удалены</string>\n    <string name=\"clear_cookie_title\">Удалить куки reCAPTCHA</string>\n    <string name=\"show_age_restricted_content_summary\">Показывать контент, который, возможно, не подходит для детей, так как имеет возрастное ограничение (например, 18+)</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube предоставляет «Безопасный режим», скрывая потенциально взрослый контент</string>\n    <string name=\"enqueued\">Добавлено в очередь</string>\n    <string name=\"enqueue_stream\">Добавить в очередь</string>\n    <string name=\"clear_cookie_summary\">Удалить сохранённые при решении reCAPTCHA куки</string>\n    <string name=\"notification_colorize_summary\">Окрашивать уведомление основным цветом миниатюры. Поддерживается не всеми устройствами</string>\n    <string name=\"notification_colorize_title\">Цветное уведомление</string>\n    <string name=\"show_thumbnail_summary\">Использовать миниатюру для фона уведомлений и экрана блокировки</string>\n    <string name=\"show_thumbnail_title\">Показать миниатюру</string>\n    <string name=\"hash_channel_description\">Показать уведомление при хэшировании видео</string>\n    <string name=\"hash_channel_name\">Уведомление о хэшировании видео</string>\n    <string name=\"msg_calculating_hash\">Вычисляется хэш</string>\n    <string name=\"recent\">Недавнее</string>\n    <string name=\"show_meta_info_summary\">Отключите, чтобы скрыть поля метаданных (автор потока, содержимое потока или поисковый запрос)</string>\n    <string name=\"show_meta_info_title\">Показать метаданные</string>\n    <string name=\"related_items_tab_description\">Похожие потоки</string>\n    <string name=\"chapters\">Главы</string>\n    <string name=\"description_tab_description\">Описание</string>\n    <string name=\"comments_tab_description\">Комментарии</string>\n    <string name=\"show_description_summary\">Отключите, чтобы скрыть описание видео и дополнительные сведения</string>\n    <string name=\"show_description_title\">Показать описание</string>\n    <string name=\"open_with\">Открыть в</string>\n    <string name=\"no_app_to_open_intent\">Подходящее приложение не найдено</string>\n    <string name=\"crash_the_app\">Вызвать сбой приложения</string>\n    <string name=\"paid_content\">Этот контент доступен только оплатившим его пользователям, поэтому NewPipe не может воспроизвести или загрузить его.</string>\n    <string name=\"youtube_music_premium_content\">Это видео доступно только для пользователей YouTube Music Premium, поэтому NewPipe не может воспроизвести или загрузить его.</string>\n    <string name=\"private_content\">Это частный контент, поэтому NewPipe не может воспроизвести или загрузить его.</string>\n    <string name=\"soundcloud_go_plus_content\">Этот трек требует SoundCloud Go+, по крайней мере в Вашей стране. Поэтому NewPipe не может воспроизвести или загрузить его.</string>\n    <string name=\"georestricted_content\">Этот контент недоступен в вашей стране.</string>\n    <string name=\"download_has_started\">Загрузка началась</string>\n    <string name=\"select_night_theme_toast\">Вы можете выбрать предпочтительную ночную тему ниже</string>\n    <string name=\"night_theme_summary\">Выберите предпочтительную ночную тему — %s</string>\n    <string name=\"auto_device_theme_title\">Автоматически (тема устройства)</string>\n    <string name=\"radio\">Радио</string>\n    <string name=\"restricted_video_no_stream\">Это видео имеет возрастные ограничения.\n\\nСогласно новой политике YouTube в отношении видео с возрастными ограничениями NewPipe не может иметь доступ ни к одному потоку этого видео и, таким образом, не может воспроизвести его.</string>\n    <string name=\"night_theme_title\">Ночная тема</string>\n    <string name=\"featured\">Популярное</string>\n    <string name=\"recaptcha_solve\">Решить</string>\n    <string name=\"show_channel_details\">Подробно о канале</string>\n    <string name=\"disable_media_tunneling_summary\">Отключите туннелирование медиа, если видите чёрный экран или видео воспроизводится рывками.</string>\n    <string name=\"disable_media_tunneling_title\">Отключить туннелирование медиа</string>\n    <string name=\"description_select_note\">Теперь вы можете выделить текст внутри описания. В режиме выделения страница может мерцать, ссылки могут быть неактивны.</string>\n    <string name=\"metadata_support\">Поддержка</string>\n    <string name=\"metadata_language\">Язык</string>\n    <string name=\"metadata_age_limit\">Возрастное ограничение</string>\n    <string name=\"metadata_licence\">Лицензия</string>\n    <string name=\"metadata_tags\">Теги</string>\n    <string name=\"metadata_category\">Категория</string>\n    <string name=\"description_select_disable\">Отключить выделение текста в описании</string>\n    <string name=\"description_select_enable\">Включить выделение текста в описании</string>\n    <string name=\"metadata_privacy_internal\">Внутренняя</string>\n    <string name=\"metadata_privacy_private\">Приватная</string>\n    <string name=\"metadata_privacy_unlisted\">Не в списке</string>\n    <string name=\"metadata_privacy_public\">Публичная</string>\n    <string name=\"metadata_host\">Сервер</string>\n    <string name=\"metadata_privacy\">Доступность</string>\n    <string name=\"feed_load_error_fast_unknown\">В быстром режиме обновления подробности об этом не предоставляются.</string>\n    <string name=\"feed_load_error_terminated\">Аккаунт автора отключён.\n\\nNewPipe не сможет загружать эту подписку в будущем.\n\\nОтписаться от этого канала\\?</string>\n    <string name=\"feed_load_error_account_info\">Не удалось загрузить подписку \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Ошибка загрузки подписки</string>\n    <string name=\"open_website_license\">Открыть веб-сайт</string>\n    <string name=\"account_terminated\">Аккаунт отключён</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Начиная с Android 10, поддерживается только \\\"Storage Access Framework\\\"</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Спрашивать, куда сохранять каждую загрузку</string>\n    <string name=\"no_dir_yet\">Папка для загрузки ещё не выбрана, укажите папку для загрузки сейчас</string>\n    <string name=\"off\">Отключить</string>\n    <string name=\"on\">Включить</string>\n    <string name=\"tablet_mode_title\">Режим планшета</string>\n    <string name=\"comments_are_disabled\">Комментарии отключены</string>\n    <string name=\"dont_show\">Не показывать</string>\n    <string name=\"low_quality_smaller\">Низкое качество (меньше)</string>\n    <string name=\"high_quality_larger\">Высокое качество (крупнее)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Миниатюра над полосой прокрутки</string>\n    <string name=\"detail_heart_img_view_description\">Автору видео понравилось это</string>\n    <string name=\"mark_as_watched\">Пометить проигранным</string>\n    <string name=\"remote_search_suggestions\">Серверные предложения поиска</string>\n    <string name=\"local_search_suggestions\">Локальные предложения поиска</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Удалена %1$s загрузка</item>\n        <item quantity=\"few\">Удалено %1$s загрузки</item>\n        <item quantity=\"many\">Удалено %1$s загрузок</item>\n        <item quantity=\"other\">Удалено %1$s загрузок</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">%s загрузка завершено</item>\n        <item quantity=\"few\">%s загрузки завершено</item>\n        <item quantity=\"many\">%s загрузок завершено</item>\n        <item quantity=\"other\">%s загрузок завершено</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Удаление элементов — смахиванием</string>\n    <string name=\"start_main_player_fullscreen_summary\">Запускать видео во весь экран, если отключён автоповорот. Мини-плеер доступен при выходе из полноэкранного режима</string>\n    <string name=\"start_main_player_fullscreen_title\">Начинать просмотр в полноэкранном режиме</string>\n    <string name=\"enqueued_next\">Добавлено следующим</string>\n    <string name=\"enqueue_next_stream\">Добавить следующим</string>\n    <string name=\"processing_may_take_a_moment\">Обработка… Подождите немного</string>\n    <string name=\"manual_update_description\">Проверить обновления вручную</string>\n    <string name=\"check_for_updates\">Проверить обновления</string>\n    <string name=\"checking_updates_toast\">Проверка обновлений…</string>\n    <string name=\"feed_new_items\">Новое на канале</string>\n    <string name=\"notifications\">Уведомления</string>\n    <string name=\"streams_notification_channel_name\">Новые видео</string>\n    <string name=\"streams_notification_channel_description\">Уведомления о новых видео в подписках</string>\n    <string name=\"streams_notifications_interval_title\">Частота проверки</string>\n    <string name=\"enable_streams_notifications_title\">Уведомления о новых видео</string>\n    <string name=\"enable_streams_notifications_summary\">Уведомлять о новых видео в подписках</string>\n    <string name=\"streams_notifications_network_title\">Тип подключения</string>\n    <string name=\"any_network\">Любая сеть</string>\n    <string name=\"notifications_disabled\">Уведомления отключены</string>\n    <string name=\"get_notified\">Уведомлять</string>\n    <string name=\"you_successfully_subscribed\">Вы подписались на канал</string>\n    <string name=\"toggle_all\">Переключить все</string>\n    <string name=\"show_crash_the_player_title\">Показывать \\\"Сбой плеера\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Показать функцию вызова сбоя при работе плеера</string>\n    <string name=\"crash_the_player\">Вызвать сбой плеера</string>\n    <string name=\"error_report_channel_name\">Уведомление отчёта об ошибке</string>\n    <string name=\"error_report_channel_description\">Уведомления для отчётов об ошибках</string>\n    <string name=\"error_report_notification_title\">Ошибка NewPipe, нажмите для отчёта</string>\n    <string name=\"error_report_notification_toast\">Произошла ошибка, подробнее в уведомлении</string>\n    <string name=\"show_error_snackbar\">Показать снэк-бар с ошибкой</string>\n    <string name=\"create_error_notification\">Показать уведомление об ошибке</string>\n    <string name=\"no_appropriate_file_manager_message\">Не найден подходящий для этого действия файловый менеджер.\n\\nУстановите файловый менеджер, или попробуйте отключить \\'%s\\' в настройках загрузок</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Не найден подходящий для этого действия файловый менеджер.\n\\nУстановите файловый менеджер, совместимый с Storage Access Framework</string>\n    <string name=\"detail_pinned_comment_view_description\">Закреплённый комментарий</string>\n    <string name=\"leak_canary_not_available\">LeakCanary недоступна</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Стандартное значение ExoPlayer</string>\n    <string name=\"loading_stream_details\">Загрузка сведений о трансляции…</string>\n    <string name=\"check_new_streams\">Проверить наличие новых трансляций</string>\n    <string name=\"delete_downloaded_files_confirm\">Удалить все загруженные файлы\\?</string>\n    <string name=\"settings_category_player_notification_title\">Уведомление плеера</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"semitone\">Полутон</string>\n    <string name=\"percent\">Проценты</string>\n    <string name=\"selected_stream_external_player_not_supported\">Выбранный поток не поддерживается внешними плеерами</string>\n    <string name=\"no_video_streams_available_for_external_players\">Нет видеопотоков, доступных внешним плеерам</string>\n    <string name=\"streams_not_yet_supported_removed\">Были скрыты трансляции, которые пока ещё не поддерживаются загрузчиком</string>\n    <string name=\"unknown_format\">Неизвестный формат</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Нет аудиопотоков, доступных внешним плеерам</string>\n    <string name=\"select_quality_external_players\">Выберите качество для внешних плееров</string>\n    <string name=\"unknown_quality\">Неизвестное качество</string>\n    <string name=\"progressive_load_interval_title\">Размер интервала загрузки при воспроизведении</string>\n    <string name=\"faq_title\">Ответы на частые вопросы</string>\n    <string name=\"faq_description\">Если у вас возникли проблемы с использованием приложения, обязательно ознакомьтесь с ответами на распространённые вопросы!</string>\n    <string name=\"faq\">Посмотреть на веб-сайте</string>\n    <string name=\"sort\">Сортировка</string>\n    <string name=\"app_update_unavailable_toast\">У вас последняя версия</string>\n    <string name=\"fast_mode\">Быстрый режим</string>\n    <string name=\"import_subscriptions_hint\">Импорт и экспорт подписок в меню с 3-мя точками</string>\n    <string name=\"app_update_available_notification_text\">Нажмите для загрузки %s</string>\n    <string name=\"card\">Карта</string>\n    <string name=\"msg_failed_to_copy\">Не удалось скопировать в буфер обмена</string>\n    <string name=\"night_theme_available\">Доступно, когда Тема установлена в %s</string>\n    <string name=\"unset_playlist_thumbnail\">Убрать постоянную миниатюру</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Дубликат добавлен %d раз(а)</string>\n    <string name=\"duplicate_in_playlist\">Плейлисты, выделенные серым, уже содержат этот объект.</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Игнорировать события аппаратных кнопок</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Полезно при использовании гарнитуры со сломанными кнопками</string>\n    <string name=\"feed_hide_streams_title\">Показать следующие стримы</string>\n    <string name=\"feed_show_hide_streams\">Показать/скрыть стримы</string>\n    <string name=\"feed_show_watched\">Полностью просмотрено</string>\n    <string name=\"feed_show_upcoming\">Предстоящие</string>\n    <string name=\"remove_duplicates\">Удалить дубликаты</string>\n    <string name=\"remove_duplicates_title\">Удалить дубликаты\\?</string>\n    <string name=\"feed_show_partially_watched\">Частично просмотрено</string>\n    <string name=\"remove_duplicates_message\">Удалить все дубликаты потоков в этом плейлисте\\?</string>\n    <string name=\"left_gesture_control_summary\">Жест для левой стороны экрана плеера</string>\n    <string name=\"left_gesture_control_title\">Действие жеста слева</string>\n    <string name=\"right_gesture_control_summary\">Жест для правой стороны экрана плеера</string>\n    <string name=\"right_gesture_control_title\">Действие жеста справа</string>\n    <string name=\"brightness\">Яркость</string>\n    <string name=\"volume\">Громкость</string>\n    <string name=\"none\">Ничего</string>\n    <string name=\"progressive_load_interval_summary\">Изменить интервал загрузки (сейчас %s). Меньшее значение может ускорить запуск видео. Нужен перезапуск плеера</string>\n    <string name=\"prefer_descriptive_audio_title\">Отдать предпочтение описательному звуку</string>\n    <string name=\"play_queue_audio_track\">Аудио: %s</string>\n    <string name=\"audio_track\">Звуковая дорожка</string>\n    <string name=\"unknown_audio_track\">Неизвестная</string>\n    <string name=\"settings_category_exoplayer_title\">Настройки ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">Управление некоторыми настройками ExoPlayer. Эти изменения требуют перезапуска плеера, чтобы они вступили в силу</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Использовать резервную функцию декодера ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Всегда использовать обходной путь настройки поверхности видеовыхода ExoPlayer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">оригинальный</string>\n    <string name=\"audio_track_type_dubbed\">дублированный</string>\n    <string name=\"audio_track_type_descriptive\">описательный</string>\n    <string name=\"prefer_original_audio_title\">Отдать предпочтение оригинальному звуку</string>\n    <string name=\"prefer_original_audio_summary\">Выбирать исходную звуковую дорожку независимо от языка</string>\n    <string name=\"prefer_descriptive_audio_summary\">Выбирать звуковую дорожку с описаниями для слабовидящих, если они доступны</string>\n    <string name=\"audio_track_present_in_video\">Звуковая дорожка уже должна присутствовать в этом потоке</string>\n    <string name=\"select_audio_track_external_players\">Выберите звуковую дорожку для внешних проигрывателей</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Включите этот параметр, если у вас есть проблемы с инициализацией декодера, который возвращается к декодерам с более низким приоритетом в случае сбоя инициализации основных декодеров. Это может привести к ухудшению качества воспроизведения по сравнению с использованием первичных декодеров</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Этот обходной путь освобождает и повторно создаёт видеокодеки при изменении поверхности вместо того, чтобы напрямую устанавливать поверхность для кодека. Уже используется ExoPlayer на некоторых устройствах с этой проблемой, этот параметр влияет только на устройства с Android 6 и выше\n\\n\n\\nВключение этого параметра может предотвратить ошибки воспроизведения при переключении текущего видеоплеера или переключении в полноэкранный режим</string>\n    <string name=\"main_tabs_position_summary\">Переместить основные вкладки в нижнюю часть экрана</string>\n    <string name=\"main_tabs_position_title\">Положение основных вкладок</string>\n    <string name=\"no_streams\">Нет стримов</string>\n    <string name=\"no_live_streams\">Нет прямых трансляций</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Медиа-туннелирование на вашем устройстве отключено по умолчанию, поскольку известно, что ваша модель устройства его не поддерживает.</string>\n    <string name=\"image_quality_title\">Качество изображения</string>\n    <string name=\"channel_tab_videos\">Видео</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Подписчики</string>\n    <string name=\"show_channel_tabs_summary\">Какие вкладки отображаются на страницах каналов</string>\n    <string name=\"share_playlist_with_list\">Поделиться списком URL-адресов</string>\n    <string name=\"share_playlist_with_titles\">Поделиться названиями</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_channel_tabs\">Вкладки канала</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"loading_metadata_title\">Загрузка метаданных…</string>\n    <string name=\"toggle_screen_orientation\">Изменить ориентацию экрана</string>\n    <string name=\"image_quality_low\">Низкое качество</string>\n    <string name=\"toggle_fullscreen\">Переключить полноэкранный режим</string>\n    <string name=\"feed_fetch_channel_tabs\">Получение вкладок канала</string>\n    <string name=\"metadata_avatars\">Аватары</string>\n    <string name=\"next_stream\">Следующий стрим</string>\n    <string name=\"metadata_subchannel_avatars\">Аватары подканалов</string>\n    <string name=\"open_play_queue\">Открыть очередь воспроизведения</string>\n    <string name=\"image_quality_none\">Не загружать изображения</string>\n    <string name=\"image_quality_high\">Высокое качество</string>\n    <string name=\"channel_tab_about\">О канале</string>\n    <string name=\"share_playlist\">Поделиться подборкой</string>\n    <string name=\"forward\">Перемотать вперёд</string>\n    <string name=\"channel_tab_albums\">Альбомы</string>\n    <string name=\"rewind\">Перемотать назад</string>\n    <string name=\"replay\">Повторить</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Получаемые вкладки при обновлении ленты. Эта функция не применяется, если канал обновляется с помощью быстрого режима.</string>\n    <string name=\"image_quality_medium\">Среднее качество</string>\n    <string name=\"metadata_uploader_avatars\">Загрузчик аватаров</string>\n    <string name=\"metadata_banners\">Баннеры</string>\n    <string name=\"channel_tab_playlists\">Подборки</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"image_quality_summary\">Выберите качество изображений и загружать ли изображения вообще, чтобы снизить использование данных и памяти. Изменения очищают кэш изображений как в памяти, так и на диске – %s</string>\n    <string name=\"play\">Воспроизвести</string>\n    <string name=\"more_options\">Другие опции</string>\n    <string name=\"metadata_thumbnails\">Миниатюры</string>\n    <string name=\"channel_tab_tracks\">Треки</string>\n    <string name=\"duration\">Продолжительность</string>\n    <string name=\"channel_tab_channels\">Каналы</string>\n    <string name=\"previous_stream\">Предыдущий стрим</string>\n    <string name=\"channel_tab_livestreams\">Стримы</string>\n    <string name=\"show_more\">Показать больше</string>\n    <string name=\"show_less\">Показать меньше</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s ответ</item>\n        <item quantity=\"few\">%s ответа</item>\n        <item quantity=\"many\">%s ответов</item>\n        <item quantity=\"other\">%s ответов</item>\n    </plurals>\n    <string name=\"notification_actions_summary_android13\">Отредактируйте каждое действие уведомления ниже, нажав на него. Первые три действия (воспроизведение/пауза, предыдущее и следующее) задаются системой и не подлежат настройке.</string>\n    <string name=\"error_insufficient_storage\">Недостаточно свободного места на устройстве</string>\n    <string name=\"reset_settings_summary\">Сбросить все настройки на их значения по умолчанию</string>\n    <string name=\"yes\">Да</string>\n    <string name=\"no\">Нет</string>\n    <string name=\"settings_category_backup_restore_title\">Резервное копирование и восстановление</string>\n    <string name=\"reset_settings_title\">Сбросить настройки</string>\n    <string name=\"auto_update_check_description\">NewPipe может автоматически проверять наличие обновлений и уведомить вас, когда они будут доступны.\n\\nЖелаете включить эту функцию?</string>\n    <string name=\"reset_all_settings\">Сброс всех настроек приведёт к сбросу всех ваших настроек и перезапуску приложения.\n\\n\n\\nВы уверены, что хотите продолжить?</string>\n    <string name=\"import_settings_vulnerable_format\">Настройки в импортируемом экспорте используют уязвимый формат, который устарел с версии NewPipe 0.27.0. Убедитесь, что импортируемый экспорт получен из надёжного источника, и в будущем предпочтительнее использовать только экспорт, полученный из NewPipe 0.27.0 или новее. Поддержка импорта настроек в этом уязвимом формате скоро будет полностью удалена, и тогда старые версии NewPipe больше не смогут импортировать настройки из экспорта из новых версий.</string>\n    <string name=\"audio_track_type_secondary\">вторичный</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Поделиться как временным плейлистом YouTube</string>\n    <string name=\"tab_bookmarks_short\">Плейлисты</string>\n    <string name=\"feed_group_page_summary\">Страница группы каналов</string>\n    <string name=\"select_a_feed_group\">Выберите группу кормов</string>\n    <string name=\"no_feed_group_created_yet\">Группа кормов еще не создана</string>\n    <string name=\"search_with_service_name\">Поиск %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Поиск %1$s (%2$s)</string>\n    <string name=\"channel_tab_likes\">Лайки</string>\n    <string name=\"migration_info_6_7_title\">Страница SoundCloud Top 50 удалена</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud прекратил поддерживать оригинальные чарты Top 50. Соответствующая вкладка была удалена с вашей главной страницы.</string>\n    <string name=\"short_thousand\">%sК</string>\n    <string name=\"short_million\">%sмлн</string>\n    <string name=\"short_billion\">%sмлрд</string>\n    <string name=\"trending_gaming\">Игровые тренды</string>\n    <string name=\"migration_info_7_8_title\">Удалены объединённые тренды YouTube</string>\n    <string name=\"migration_info_7_8_message\">YouTube прекратил поддержку объединённой страницы трендов 21 июля 2025 года. NewPipe заменил страницу трендов по умолчанию на тренды в прямых трансляциях.\\n\\nВы также можете выбрать другие страницы трендов в \\\"Настройки &gt; Контент &gt; Главная страница\\\".</string>\n    <string name=\"trending_podcasts\">Тренды в подкастах</string>\n    <string name=\"trending_movies\">Тренды в фильмах и шоу</string>\n    <string name=\"trending_music\">Тренды в музыке</string>\n    <string name=\"permission_display_over_apps_message\">Чтобы использовать Popup Player, выберите %1$s в следующем меню настроек Android и включите %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">«Разрешить отображение поверх других приложений»</string>\n    <string name=\"delete_file\">Удалить файл</string>\n    <string name=\"delete_entry\">Удалить запись</string>\n    <string name=\"account_terminated_service_provides_reason\">Учётная запись закрыта\\n\\n%1$s указал причину: %2$s</string>\n    <string name=\"entry_deleted\">Запись удалена</string>\n    <string name=\"player_http_403\">Во время воспроизведения получена ошибка HTTP 403 от сервера, вероятно, вызванная истечением срока действия URL-адреса потоковой передачи или блокировкой IP-адреса</string>\n    <string name=\"player_http_invalid_status\">Ошибка HTTP %1$s получена от сервера во время воспроизведения</string>\n    <string name=\"youtube_player_http_403\">Во время воспроизведения получена ошибка HTTP 403 от сервера, вероятно, вызванная блокировкой IP-адреса или проблемами деобфускации URL-адреса потоковой передачи</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s отказался предоставить данные, запросив логин для подтверждения, что запросчик не бот.\\n\\nВозможно, ваш IP-адрес временно заблокирован %1$s. Вы можете подождать некоторое время или переключиться на другой IP-адрес (например, включив/выключив VPN или переключившись с Wi-Fi на мобильный интернет).</string>\n    <string name=\"unsupported_content_in_country\">Этот контент недоступен для выбранной страны контента.\\n\\nИзмените свой выбор в разделе «Настройки &gt; Контент &gt; Страна контента по умолчанию».</string>\n    <string name=\"kao_dialog_warning\">В августе 2025 года, Google анонсировала, что с сентября 2026 года, установка приложений потребует верификации разработчика для всех Android приложений на сертифицированных устройствах, включая те, которые были установлены не через Play Store. Поскольку разработчики NewPipe не согласны с этим требованием, NewPipe перестанет работать на сертифицированных Android устройствах после этой даты.</string>\n    <string name=\"kao_dialog_more_info\">Подробнее</string>\n    <string name=\"kao_solution\">Решение</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ryu/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">%1$sんかいかんかい</string>\n    <string name=\"no_player_found\">ちゃーしがプレイヤーぬみちかやびらん｡VLCインストールさびーが？</string>\n    <string name=\"install\">インストール</string>\n    <string name=\"cancel\">キャンセル</string>\n    <string name=\"open_in_browser\">ブラウザっしふぃらちゅん</string>\n    <string name=\"share\">ちゅーゆーいん</string>\n    <string name=\"download\">ダウンロード</string>\n    <string name=\"search\">きんさく</string>\n    <string name=\"settings\">しってい</string>\n    <string name=\"did_you_mean\">むしかしてぃ： 「%1$s」\\?</string>\n    <string name=\"share_dialog_title\">ちゅーゆーいん</string>\n    <string name=\"download_path_title\">ちゃーしがふずんするフォルダー</string>\n    <string name=\"download_path_summary\">ダウンロードさどぅうがくまんかいふずんさびーん</string>\n    <string name=\"download_path_dialog_title\">ちゃーしがファイルダウンロードするフォルダーさんたくちくぃみそーれー</string>\n    <string name=\"default_resolution_title\">デフォルトふぃんがしち</string>\n    <string name=\"play_with_kodi_title\">Kodiっしさいせい</string>\n    <string name=\"kore_not_found\">インストールさりてぃうぅらんKoreアプリインストールさびーが？</string>\n    <string name=\"show_play_with_kodi_title\">「Kodiっしさいせい」オプションひょうじ</string>\n    <string name=\"show_play_with_kodi_summary\">Kodiメディアセンターけいゆでいちゃーがさうぅいゆいするたみぬしっていひょうじさびーん</string>\n    <string name=\"play_audio\">うんせい</string>\n    <string name=\"default_audio_format_title\">デフォルトぬうんせいけいしき</string>\n    <string name=\"download_dialog_title\">ダウンロード</string>\n    <string name=\"show_next_and_similar_title\">「ちぎぬちゃーしが」とぅ「かんりんちゃーしが」ひょうじ</string>\n    <string name=\"unsupported_url\">たいおうしうぅらんURLやいびーん</string>\n    <string name=\"content_language_title\">デフォルトぬぎんぐしってい</string>\n    <string name=\"settings_category_video_audio_title\">ちゃーしがとぅーいるゆい</string>\n    <string name=\"detail_thumbnail_view_description\">ビデオさいせい、じかん：</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">とうこうしゃアイコンぬサムネイル</string>\n    <string name=\"detail_dislikes_img_view_description\">ていひょうが</string>\n    <string name=\"detail_likes_img_view_description\">かんひょうが</string>\n    <string name=\"use_external_video_player_title\">がうぅいぶちゃーしがプレイヤーしようすん</string>\n    <string name=\"use_external_audio_player_title\">やしがいぶうんせいプレイヤーしようすん</string>\n    <string name=\"background_player_playing_toast\">バックグラウンドっしさいせいちゅう</string>\n    <string name=\"theme_title\">テーマ</string>\n    <string name=\"dark_theme_title\">ダーク</string>\n    <string name=\"light_theme_title\">ホワイト</string>\n    <string name=\"settings_category_appearance_title\">やしがいかん</string>\n    <string name=\"network_error\">ネットワークエラー</string>\n    <string name=\"download_path_audio_title\">うんせいふずんするフォルダー</string>\n    <string name=\"download_path_audio_summary\">ダウンロードさるうんがくファイルくまんかいふずんさびーん</string>\n    <string name=\"download_path_audio_dialog_title\">うんがくファイルダウンロードするフォルダーさんたくちくぃみそーれー</string>\n    <string name=\"general_error\">エラー</string>\n    <string name=\"could_not_load_thumbnails\">まじりぬサムネイルゆみくみやびらんたん</string>\n    <string name=\"parsing_error\">ウェブサイトこーいしちなやびらんたん</string>\n    <string name=\"content_not_available\">コンテンツがいようなやびらん</string>\n    <string name=\"could_not_setup_download_menu\">ふずんメニューしっていなやびらんたん</string>\n    <string name=\"content\">コンテンツ</string>\n    <string name=\"show_age_restricted_content_title\">されいゆいぎんぬあるコンテンツひょうじ</string>\n    <string name=\"sorry_string\">もうしわきあいびらん。そうていがいぬエラーぬはっせいさびたん。</string>\n    <string name=\"error_report_button_text\">メールっしうくいん</string>\n    <string name=\"error_snackbar_message\">もうしわきあいびらん、ふぐあいぬはっせいさびたん。</string>\n    <string name=\"error_snackbar_action\">ほうくーく</string>\n    <string name=\"what_device_headline\">じょうほう：</string>\n    <string name=\"what_happened_headline\">はっせいさんねーんよう：</string>\n    <string name=\"your_comment\">うんじゅがコメント（えいぐでぃ）：</string>\n    <string name=\"error_details_headline\">しょうさい：</string>\n    <string name=\"video\">ちゃーしが</string>\n    <string name=\"audio\">うんせい</string>\n    <string name=\"retry\">さいしこう</string>\n    <string name=\"duration_live\">やーまほうあん</string>\n    <string name=\"main_bg_subtitle\">むしがんちょータップしかいしさびーん。</string>\n    <string name=\"start\">かいし</string>\n    <string name=\"pause\">いちじていし</string>\n    <string name=\"delete\">さくじょ</string>\n    <string name=\"checksum\">チェックサム</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">ファイルめい</string>\n    <string name=\"msg_threads\">どうじらしみーちずくすん</string>\n    <string name=\"msg_error\">エラー</string>\n    <string name=\"msg_running\">ダウンロードちゅう（NewPipe）</string>\n    <string name=\"msg_running_detail\">タップししーょうさいをひょうじ</string>\n    <string name=\"msg_wait\">うまちくぃみそーれー…</string>\n    <string name=\"msg_copied\">クリップボードんかいコピーさびたん</string>\n    <string name=\"no_available_dir\">ぬちふどぅ、ダウンロードフォルダーしっていしみそーれー</string>\n    <string name=\"downloads\">ダウンロード</string>\n    <string name=\"downloads_title\">ダウンロード</string>\n    <string name=\"error_report_title\">ふぐあいほうくーく</string>\n    <string name=\"app_ui_crash\">アプリ（UI）やしがクラッシュさびたん</string>\n    <string name=\"info_labels\">ちゃーるむんだい：\\nリクエスト：\\nコンテンツぬぎんぐ：\\nコンテンツぬくに：\\nアプリぬぎんぐ：\\nサービス：\\nGMTじかん：\\nパッケージ：\\nバージョン：\\nOSぬバージョン：</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHAぬようきゅう</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHAようきゅうさびたん</string>\n    <string name=\"black_theme_title\">ブラック</string>\n    <string name=\"all\">まじり</string>\n    <string name=\"open_in_popup_mode\">ポップアップモードっしふぃらちゅん</string>\n    <string name=\"msg_popup_permission\">ポップアップモードっしふぃらちゅんがー\n\\nきんぎんぬきょかがふぃちようでぃす</string>\n    <string name=\"popup_playing_toast\">ポップアップモードっしさいせいちゅう</string>\n    <string name=\"disabled\">んーか</string>\n    <string name=\"default_video_format_title\">デフォルトぬちゃーがけいしき</string>\n    <string name=\"default_popup_resolution_title\">デフォルトふぃんがしち（ポップアップひょうじ）</string>\n    <string name=\"show_higher_resolutions_title\">ゆりたかさしがしーちひょうじ</string>\n    <string name=\"show_higher_resolutions_summary\">2K/4Kちゃーがはいちぶぬデバイスっしぬみさいゆいなやびーん</string>\n    <string name=\"controls_background_title\">バックグラウンド</string>\n    <string name=\"controls_popup_title\">ポップアップ</string>\n    <string name=\"clear\">しーょうきょ</string>\n    <string name=\"popup_remember_size_pos_title\">ポップアップぬずくせいちーうくすん</string>\n    <string name=\"popup_remember_size_pos_summary\">ポップアップぬサイズとぅいちちーうくすん</string>\n    <string name=\"use_external_video_player_summary\">いちぶぬかいずうどぅっしうっちゃきーるゆいがあいびらん</string>\n    <string name=\"show_search_suggestions_title\">きんさくくうふぬひょうじ</string>\n    <string name=\"show_search_suggestions_summary\">きーるさくじんかいふぃいょうじするこうふをしんたくさびーん</string>\n    <string name=\"best_resolution\">さいこう</string>\n    <string name=\"title_activity_about\">NewPipeにちいてぃ</string>\n    <string name=\"title_licenses\">サードパーティーライセンス</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s さくしゃ %2$s ライセンス %3$s</string>\n    <string name=\"tab_about\">バージョンじょうほうとぅゆくあるしちむん</string>\n    <string name=\"tab_licenses\">ライセンス</string>\n    <string name=\"app_description\">Androidんきーぬフリーっしけいりょうなストリーミング。</string>\n    <string name=\"view_on_github\">GitHubっしひょうじ</string>\n    <string name=\"app_license_title\">NewPipeぬライセンス</string>\n    <string name=\"contribution_encouragement\">ふんやちゅん、デザインぬへんかん、コードぬせいり、ちゃーさぬんぶさるコードぬへんかんんでー、アイデアうむちっしぇーあいびらに？ヘルポーいちやてぃんかんぎうぅいさびーん。ゆりじょーとぅーまじゅんちゅくいとぅらさびら！</string>\n    <string name=\"read_full_license\">ライセンスゆむん</string>\n    <string name=\"contribution_title\">かんきんすん</string>\n    <string name=\"subscribe_button_title\">チャンネルとぅうるく</string>\n    <string name=\"subscribed_button_title\">とうるくじみ</string>\n    <string name=\"channel_unsubscribed\">チャンネルとぅうるいちゅんこーいじょさました</string>\n    <string name=\"subscription_change_failed\">チャンネルとぅうるいちゅんへいるかんなやびらん</string>\n    <string name=\"subscription_update_failed\">チャンネルとぅうるいちゅんかんしでぃちゃびらん</string>\n    <string name=\"tab_subscriptions\">とうるいちゅるチャンネル</string>\n    <string name=\"fragment_feed_title\">しじちゃいちゅん</string>\n    <string name=\"enable_search_history_title\">きんさくりりき</string>\n    <string name=\"enable_search_history_summary\">きんさくりりききうくさびーん</string>\n    <string name=\"enable_watch_history_title\">さいせいりりき</string>\n    <string name=\"enable_watch_history_summary\">さいせいりりききうくさびーん</string>\n    <string name=\"resume_on_audio_focus_gain_title\">さいせいぬさいかい</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">でぃんわんでーにゆるちゅうだんぬあとぅ、さいせいさいかいさびーん</string>\n    <string name=\"settings_category_player_title\">プレイヤー</string>\n    <string name=\"show_hold_to_append_summary\">ちゃーしがぬしょうさいページっし、「バックグラウンド」あらんでぃ「ポップアップ」ボタンぬうさったるとぅちにヒントひょうじすん</string>\n    <string name=\"settings_category_player_behavior_title\">ちゃーさ</string>\n    <string name=\"settings_category_history_title\">りりきとぅキャッシュ</string>\n    <string name=\"undo\">むとぅんかいむどぅすん</string>\n    <string name=\"play_all\">まじりさいせい</string>\n    <string name=\"notification_channel_name\">NewPipeぬちうち</string>\n    <string name=\"unknown_content\">[ふめいうぅい]</string>\n    <string name=\"player_stream_failure\">ちゃーしがぬさいゆいがなやびらんたん</string>\n    <string name=\"player_unrecoverable_failure\">かいふくふのうなエラーぬはっせいさびたん</string>\n    <string name=\"search_no_results\">いっちするきっかーあいびらんたん</string>\n    <string name=\"no_subscribers\">チャンネルとぅうるくしゃなし</string>\n    <string name=\"no_videos\">ちゃーしががあいびらん</string>\n    <string name=\"settings_category_downloads_title\">ふずん</string>\n    <string name=\"settings_file_charset_title\">ファイルめいなさなやーぬうなんじ</string>\n    <string name=\"settings_file_replacement_character_summary\">んーかやーんじぇーくまでぃしてぃいしたんじんかいうきけーららりやびーん</string>\n    <string name=\"settings_file_replacement_character_title\">ファイルみいなじちゃーしゅうせい</string>\n    <string name=\"charset_letters_and_digits\">むじんでぃすーいんじ</string>\n    <string name=\"charset_most_special_characters\">むじんでぃすーいんじんでぃ、おおくぬとぅくしゅむじ</string>\n    <string name=\"donation_title\">ちーふ</string>\n    <string name=\"donation_encouragement\">NewPipeー、うんじゅんかいさいこうぬたいきんていきょうすんでぃ、ボランティアぬじぶんぬちゃーぬじかんちかてぃかいはちそーいびーん。かいはちしゃぬちゃーがコーヒーぬまがちーNewPipeけいずいちゅてぃちーにかいりょうないるよう、ぐさいんうにげーさびら。</string>\n    <string name=\"website_title\">ウェブサイト</string>\n    <string name=\"website_encouragement\">NewPipeぬくわしさんじょうほうやさいしんじょうほうにちいてぃは、ウェブサイトんーちくぃみそーれー。</string>\n    <string name=\"title_activity_history\">りりき</string>\n    <string name=\"action_history\">りりき</string>\n    <string name=\"delete_item_search_history\">くぬアイテムきーるさくりりきからさくじょさびーが？</string>\n    <string name=\"main_page_content\">メインページぬコンテンツ</string>\n    <string name=\"blank_page_summary\">くゎいるはくページ</string>\n    <string name=\"kiosk_page_summary\">Kioskページ</string>\n    <string name=\"channel_page_summary\">チャンネルページ</string>\n    <string name=\"select_a_channel\">チャンネルしんたく</string>\n    <string name=\"no_channel_subscribed_yet\">とうるくさてぃうぅるチャンネルーあいびらん</string>\n    <string name=\"select_a_kiosk\">Kioskしんたく</string>\n    <string name=\"trending\">にいるき</string>\n    <string name=\"top_50\">トップ50</string>\n    <string name=\"play_queue_remove\">さくじょ</string>\n    <string name=\"play_queue_stream_detail\">しょうさい</string>\n    <string name=\"play_queue_audio_settings\">うんせいぬしってい</string>\n    <string name=\"switch_to_background\">バックグラウンドさいゆいかいし</string>\n    <string name=\"switch_to_popup\">ポップアップさいゆいかいし</string>\n    <string name=\"switch_to_main\">メインさいゆいんかいきりけーい</string>\n    <string name=\"no_player_found_toast\">ちゃーがプレイヤーぬみちかやびらん（VLCインストールしさいせいなやびーる）。</string>\n    <string name=\"default_content_country_title\">デフォルトぬちいちしってい</string>\n    <string name=\"always\">ちゃー</string>\n    <string name=\"just_once\">いちどぅてーん</string>\n    <string name=\"import_data_title\">データベースインポート</string>\n    <string name=\"export_data_title\">データベースエクスポート</string>\n    <string name=\"import_data_summary\">きすんぬいりき、んでぃうるいちゅるチャンネルいちらん、プレイリストうゆび (んかいんうぅい) しってえーうわがきさりやびーん</string>\n    <string name=\"export_data_summary\">さいせいりりき、んでぃうるいちゅるチャンネルいちらん、プレイリストうゆびしっていエクスポートさびーん</string>\n    <string name=\"player_recoverable_failure\">エラーからがいふくちゅうでぃす</string>\n    <string name=\"external_player_unsupported_link_type\">やしがいぶプレイヤーや、くりらぬタイプぬリンクサポートさびらん</string>\n    <string name=\"export_complete_toast\">エクスポートさびたん</string>\n    <string name=\"import_complete_toast\">インポートさびたん</string>\n    <string name=\"no_valid_zip_file\">ゆうこうなZIPファイルっしぇーあいびらん</string>\n    <string name=\"could_not_import_all_files\">けいくーく：まじりぬファイルインポートなやびらんたん。</string>\n    <string name=\"override_current_data\">くりにゆり、ぎんじぇーぬしっていぬうわがきさりやびーん。</string>\n    <string name=\"start_here_on_background\">バックグラウンドっしりんずくささるゆいかいし</string>\n    <string name=\"drawer_open\">ドロワーふぃらちゅん</string>\n    <string name=\"drawer_close\">ドロワーくーいん</string>\n    <string name=\"video_player\">ちゃーしがプレイヤー</string>\n    <string name=\"background_player\">バックグラウンドプレイヤー</string>\n    <string name=\"popup_player\">ポップアッププレイヤー</string>\n    <string name=\"preferred_player_fetcher_notification_title\">じょうほうしーゅとぅくそーいびーん…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">コンテンツゆみくどーいびーん</string>\n    <string name=\"controls_download_desc\">ちゃーしがダウンロード</string>\n    <string name=\"show_info\">じょうほうひょうじ</string>\n    <string name=\"tab_bookmarks\">ブックマークさるプレイリスト</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">やしがぞうキャッシュしーょうきょさびたん</string>\n    <string name=\"metadata_cache_wipe_title\">キャッシュしーょうきょ</string>\n    <string name=\"metadata_cache_wipe_summary\">アプリねーんぬキャッシュデータまじりさくじょさます</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">キャッシュぬしーょうきょさりやびたん</string>\n    <string name=\"auto_queue_title\">ちぎぬちゃーがじちゃーっしキューんかいちいかすいん</string>\n    <string name=\"settings_category_debug_title\">デバッグ</string>\n    <string name=\"file\">ファイル</string>\n    <string name=\"video_streams_empty\">ちゃーしががみちかやびらん</string>\n    <string name=\"audio_streams_empty\">うんせいがみちかやびらん</string>\n    <string name=\"invalid_directory\">フォルダーぬみちかやびらん</string>\n    <string name=\"invalid_file\">ファイルぬすんじぇーさんが、ゆみがきするきんぎんぬあいびらん</string>\n    <string name=\"file_name_empty_error\">ファイルめえーくゎいるはくんかいなやびらん</string>\n    <string name=\"error_occurred_detail\">エラーぬはっせいさびたん： %1$s</string>\n    <string name=\"no_streams_available_download\">ダウンロードないんちゃーしがーあいびらん</string>\n    <string name=\"detail_drag_description\">ドラッグしならべいがい</string>\n    <string name=\"create\">さくせい</string>\n    <string name=\"dismiss\">はき</string>\n    <string name=\"rename\">やーめーへいるかん</string>\n    <string name=\"always_ask_open_action\">ちゃーかくにん</string>\n    <string name=\"create_playlist\">しんきプレイリスト</string>\n    <string name=\"rename_playlist\">へんかん</string>\n    <string name=\"name\">プレイリストめい</string>\n    <string name=\"add_to_playlist\">プレイリストんかいちちが</string>\n    <string name=\"set_as_playlist_thumbnail\">プレイリストぬサムネイルんかいしってい</string>\n    <string name=\"bookmark_playlist\">プレイリストブックマーク</string>\n    <string name=\"unbookmark_playlist\">ブックマークさちゅるじょ</string>\n    <string name=\"delete_playlist_prompt\">くぬプレイリストさちゅるじょさびーが？</string>\n    <string name=\"playlist_creation_success\">プレイリストぬさくせいさりやびたん</string>\n    <string name=\"playlist_add_stream_success\">プレイリストんかいちいからさびたん</string>\n    <string name=\"playlist_thumbnail_change_success\">プレイリストぬサムネイルへいるかんさびたん。</string>\n    <string name=\"caption_none\">じまちゅるひょうじなし</string>\n    <string name=\"import_title\">インポート</string>\n    <string name=\"import_from\">インポートむとぅ</string>\n    <string name=\"export_to\">エクスポートさき</string>\n    <string name=\"import_ongoing\">インポートそーいびーん…</string>\n    <string name=\"export_ongoing\">エクスポートそーいびーん…</string>\n    <string name=\"import_file_title\">ファイルからインポート</string>\n    <string name=\"previous_export\">じんかいぬエクスポートさき</string>\n    <string name=\"subscriptions_import_unsuccessful\">とうるいちゅるリストぬインポートなやびらんたん</string>\n    <string name=\"subscriptions_export_unsuccessful\">とうるいちゅるリストぬエクスポートなやびらんたん</string>\n    <string name=\"playback_tempo\">すくどぅ</string>\n    <string name=\"playback_pitch\">うんてい</string>\n    <string name=\"clear_views_history_title\">さいせいりりきしーょうきょ</string>\n    <string name=\"clear_views_history_summary\">さいせいちゃんちゃーがぬいりきとぅさいせいいちさちゅるじょさびーん</string>\n    <string name=\"watch_history_deleted\">さいせいりりきさちゅるじょさびたん</string>\n    <string name=\"clear_search_history_title\">きんさくりりきしーょうきょ</string>\n    <string name=\"clear_search_history_summary\">きんさくキーワードぬいりきさちゅるじょさびーん</string>\n    <string name=\"search_history_deleted\">きんさくりりきさちゅるじょさびたん</string>\n    <string name=\"import_settings\">しっていんインポートさびーが？</string>\n    <string name=\"caption_setting_title\">じまちゅん</string>\n    <string name=\"channels\">チャンネル</string>\n    <string name=\"playlists\">プレイリスト</string>\n    <string name=\"users\">ユーザー</string>\n    <string name=\"privacy_policy_title\">NewPipeプライバシーポリシー</string>\n    <string name=\"read_privacy_policy\">プライバシーポリシーかくにん</string>\n    <string name=\"use_inexact_seek_title\">おおまかやるシーク</string>\n    <string name=\"use_inexact_seek_summary\">おおまかやるシークしようするくとぅっしさいどぅがさがいるかわりんかいこうすくんかいシークぬなやびーん。5びょう、15びょうあらんでぃ25びょうかんかくぬシークーなやびらん</string>\n    <string name=\"auto_queue_summary\">キューんかいかんりんちゃーがちいからちさいせいちづきーん（くいけーしさんーあい）</string>\n    <string name=\"delete_view_history_alert\">まじりぬさいせいりりきさちゅるじょさびーが？</string>\n    <string name=\"delete_search_history_alert\">まじりどぅきらんさくりりきさちゅるじょさびーが？</string>\n    <string name=\"invalid_source\">くぬファイル/コンテンツーあいびらん</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">チャンネルとぅうるくしゃすう %sんかいん</item>\n        <item quantity=\"other\">チャンネルとぅうるくしゃすう %sんかいん</item>\n    </plurals>\n    <string name=\"no_views\">さいせいなし</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">さいせいかいすん %sかい</item>\n        <item quantity=\"other\">さいせいかいすん %sかい</item>\n    </plurals>\n    <string name=\"one_item_deleted\">てぃーちぬアイテムぬさちゅるじょさりやびたん。</string>\n    <string name=\"give_back\">しーいんすん</string>\n    <string name=\"privacy_policy_encouragement\">NewPipeプロジェクトーうんじゅがプライバシーふぃじょうにてーしちなちょーいびーん。うんじゅがちゃーいがねーんかぎり、アプレーいかなるデータんしゅうしゅうさびらん。\n\\nNewPipeぬプライバシー・ポリシーっしぇー、クラッシュリポートそうしんじんかいちゃぬぐとーるしゅるいぬデータぬあんしん・きるくされいがしーょうさいにしちめいそーいびーん。</string>\n    <string name=\"app_license\">NewPipeーコピーレフトなソフトウェアやいびーん。うんじょーじゆうにうりさし、きんきゅうしー、きょうゆうし、あんしがいじんするくとぅがなやびーん。うんじょー、GNUフリーソフトウェアじぇーやんんがかんかいすん GNU General Publicライセンスバージョン3いかぬむとぅんかい、じゆうにさえーいーん・しゅうせいうくないるくとぅがなやびーん。</string>\n    <string name=\"title_last_played\">さいしゅうさいせいにちじ</string>\n    <string name=\"title_most_played\">むっとぅむさいせいさったんちゃーしが</string>\n    <string name=\"resize_zoom\">かくだい</string>\n    <string name=\"controls_add_to_playlist_title\">プレイリスト</string>\n    <string name=\"show_hold_to_append_title\">「ながうしっしキューんかいちちが」ぬヒントひょうじ</string>\n    <string name=\"tracks\">トラック</string>\n    <string name=\"notification_channel_description\">NewPipeぬプレイヤーぬちうち</string>\n    <string name=\"new_and_hot\">しんちゃくとぅにんき</string>\n    <string name=\"hold_to_append\">ながうしっしキューんかいちちが</string>\n    <string name=\"start_here_on_popup\">ポップアップっしりんずくささるゆいかいし</string>\n    <string name=\"preferred_open_action_settings_title\">うくぬみぬ「ふぃらく」アクション</string>\n    <string name=\"preferred_open_action_settings_summary\">コンテンツふぃらちゅるとぅちぬデフォルトちゃーさ — %s</string>\n    <string name=\"resize_fit\">フィット</string>\n    <string name=\"resize_fill\">じんぬみん</string>\n    <string name=\"caption_auto_generated\">じどうせいせい</string>\n    <string name=\"caption_setting_description\">プレーヤーぬキャプションテキストぬしーゅくしゃくとぅはいけいスタイルへいるかんさびーん。ゆうこうなすんがー、アプリぬさいきちゃーがふぃちようやいびーん</string>\n    <string name=\"empty_list_subtitle\">ぬーんあいびらん</string>\n    <string name=\"import_youtube_instructions\">Google takeoutからYouTubeぬとぅうるいちゅるリストインポート：\n\\n\n\\n1. くぬURLふぃらちゃびーん： %1$s\n\\n2. ログインしうぅらんだれーログインさびーん\n\\n3. \\\"まじりしんたく\\\" クリックしー、あんし \\\"しんたくまじりかいじょ\\\" クリック、あんし \\\"んでぃうるいちゅるチャンネル\\\" ぬみしんたくし、\\\"OK\\\" クリック\n\\n4. \\\"ちぎぬステップ\\\" クリックしー、あんし \\\"エクスポートさくせい\\\" クリック\n\\n5. ひょうじされいねー \\\"ダウンロード\\\" ボタンクリック\n\\n6. ファイルからインポートクリックしダウンロードさるzipファイルしんたく\n\\n7.（インポートぬしーやんじねー）csvファイル（たいてい、\\\"YouTubeとぅYouTube Music/とぅうるいちゅるチャンネル/とぅうるいちゅるチャンネル.csv\\\" んかいあん）ちゅうさゅちし、ファイルからインポートクリックしてぃちゅうしゅちしたcsvファイルしんたく</string>\n    <string name=\"playback_reset\">リセット</string>\n    <string name=\"accept\">ちゃーいすん</string>\n    <string name=\"decline\">きょふぃする</string>\n    <string name=\"limit_data_usage_none_description\">せいぎんなし</string>\n    <string name=\"limit_mobile_data_usage_title\">モバイルネットワークさじぬがしーち</string>\n    <string name=\"minimize_on_exit_title\">アプリきりけーいじぬさいしょうか</string>\n    <string name=\"minimize_on_exit_summary\">プレイヤーからふかぬアプリんかいきりけーいじぬちゃーさ — %s</string>\n    <string name=\"minimize_on_exit_none_description\">ぬーんさん</string>\n    <string name=\"minimize_on_exit_background_description\">バックグラウンドんかいへいるかん</string>\n    <string name=\"minimize_on_exit_popup_description\">ポップアップんかいへいるかん</string>\n    <string name=\"enable_leak_canary_summary\">メモリリークぬかんしぇー、ヒープダンピングじんかいアプリぬむはんのうになるぎんいんとぅなやびーん</string>\n    <string name=\"enable_disposed_exceptions_title\">ライフサイクルエラーぬほうくーく</string>\n    <string name=\"enable_disposed_exceptions_summary\">はきさったるフラグメントあらんでぃアクティビティぬ、ライフサイクルはんいぬいでぃのーいしんふぬうなRxれいがいちーょうせいてぃきにほうくくさびーん</string>\n    <string name=\"import_soundcloud_instructions\">URLあらんでぃIDんかいゅうりょくしてぃSoundCloudプロファイルインポートさびーん：：\n\\n\n\\n1. Webブラウザーっし \\\"デスクトップモード\\\" ゆうこうなさびーん（サイトーけいたいデバイスでぃりようなやびらん）\n\\n2. くぬURLんかいうぅいちゃーさびーん： %1$s\n\\n3. ふぃちぐとぅうぅーじてぃログインさびーん\n\\n4. リダイレクトさったるプロファイルURLコピーさびーん。</string>\n    <string name=\"import_soundcloud_instructions_hint\">うんじゅがID, soundcloud.com/うんじゅがid</string>\n    <string name=\"import_network_expensive_warning\">くぬあしっさにゆりちうしんりょうきんがかじゅーいるくとぅがあいびーん。ぐちゅういください。\n\\n\n\\nずっこうさびーが？</string>\n    <string name=\"playback_speed_control\">とうるくさゃすう</string>\n    <string name=\"unhook_checkbox\">すくどぅとぅうんていりんちゃーさじんかいへいるかん（ゆがむんかむしりやびらん）</string>\n    <string name=\"skip_silence_checkbox\">むうんぬあいだにはやうくり</string>\n    <string name=\"playback_step\">うんかい</string>\n    <string name=\"unsubscribe\">とうるいちゅんかいじょ</string>\n    <string name=\"tab_choose\">タブしんたく</string>\n    <string name=\"settings_category_updates_title\">アプリぬこうしん</string>\n    <string name=\"events\">イベント</string>\n    <string name=\"app_update_notification_channel_description\">みーさるNewPipeバージョンぬちうち</string>\n    <string name=\"download_to_sdcard_error_title\">がいぶちうちゅるすうちはりようなやびらん</string>\n    <string name=\"restore_defaults\">っちいちんかいむどぅすん</string>\n    <string name=\"restore_defaults_confirmation\">きていぬしっていふちゅるぎんさびーが？</string>\n    <string name=\"subscribers_count_not_available\">とうるくさゃすうはりようでぃきましん</string>\n    <string name=\"conferences\">がいぎ</string>\n    <string name=\"start_accept_privacy_policy\">ヨーロッパぬいちぱんデータふぐきせい（GDPR）にじゅんきょしーんたみに、NewPipeぬくじんじょうほうふぐほうしんにぐちゅういください。ゆーゆでぃくぃみそーれー。\n\\nわったーんかいふぐあいほうくーくうくいんでー、くりうけいりらんだれーなやびらん。</string>\n    <string name=\"updates_setting_title\">アプリぬこうしん</string>\n    <string name=\"list_view_mode\">リストビューモード</string>\n    <string name=\"list\">リスト</string>\n    <string name=\"grid\">グリッド</string>\n    <string name=\"auto\">じちゃー</string>\n    <string name=\"app_update_available_notification_title\">NewPipeぬアップデートぬあいびーん！</string>\n    <string name=\"missions_header_finished\">かんりょう</string>\n    <string name=\"missions_header_pending\">じゅんばんにしょりちゅう</string>\n    <string name=\"paused\">いちじていし</string>\n    <string name=\"queued\">じゅんばんまちにちいかしました</string>\n    <string name=\"post_processing\">ふずんさりそーいびーん</string>\n    <string name=\"enqueue\">じゅんばんにしょりする</string>\n    <string name=\"permission_denied\">あしっさがシステムにゆってぃきょふぃさりました</string>\n    <string name=\"download_failed\">ダウンロードんかいしっぺーさびたん</string>\n    <string name=\"generate_unique_name\">いちいぬやーめーせいせいさびーん</string>\n    <string name=\"overwrite\">うわがき</string>\n    <string name=\"overwrite_unrelated_warning\">くぬなめーぬファイルーしでぃにすんじぇーさびーん</string>\n    <string name=\"overwrite_finished_warning\">くぬなめーぬダウンロードファイルーしでぃにすんじぇーさびーん</string>\n    <string name=\"download_already_running\">いぬなめーむちゅるダウンロードぬしでぃにしんこうちゅうやいびーん</string>\n    <string name=\"show_error\">エラーひょうじすん</string>\n    <string name=\"error_path_creation\">あてぃさきぬフォルダーさくせいなやびらん</string>\n    <string name=\"error_file_creation\">ファイルさくせいなやびらん</string>\n    <string name=\"error_ssl_exception\">あんさんやーしちずくにしっぺーさびたん</string>\n    <string name=\"error_unknown_host\">サーバぬみちかやびらんたん</string>\n    <string name=\"error_connect_host\">サーバなさちどーくなやびらん</string>\n    <string name=\"error_http_no_content\">サーバぬデータあんしんさびらん</string>\n    <string name=\"error_http_unsupported_range\">サーバぬどうじらしみーちどーいちゅるダウンロードうきちきやびらん。さいしこうしみそーれー @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">みちかやびらん</string>\n    <string name=\"error_postprocessing_failed\">ふずんしーょりにしっぺーしました</string>\n    <string name=\"stop\">ていし</string>\n    <string name=\"max_retry_msg\">さちゃるいさいしこうかいすん</string>\n    <string name=\"max_retry_desc\">ダウンロードちゅうしするまでぃぬさちゃるいさいしこうかいすん</string>\n    <string name=\"file_deleted\">ファイルさちゅるじょさびたん</string>\n    <string name=\"app_update_notification_channel_name\">アプリぬこうしんちうち</string>\n    <string name=\"download_to_sdcard_error_message\">やしがいぶSDカードんかいダウンロードなやびらん。ダウンロードフォルダーぬばしょリセットさびーが？</string>\n    <string name=\"saved_tabs_invalid_json\">ふずんさったるタブゆみくみらんたみ、デフォルトぬタブしーようさびーん</string>\n    <string name=\"main_page_content_summary\">メインページんかいひょうじさりーるタブ</string>\n    <string name=\"updates_setting_description\">みーさるバージョンがいようかのうなとぅちにアプリぬこうしんかくにんすんちうちひょうじさびーん</string>\n    <string name=\"pause_downloads_on_mobile\">じゅうりょうせいかきんネットワークぬわりくみ</string>\n    <string name=\"pause_downloads_on_mobile_desc\">モバイルデータちうしぬんかいきりけーいーあいにびんりやいびーしが、いちぶぬダウンロードーいちじていしなやびらん</string>\n    <string name=\"show_comments_title\">コメントひょうじ</string>\n    <string name=\"show_comments_summary\">んーかなすんでぃコメントふぃふぃょうじなさびーん</string>\n    <string name=\"autoplay_title\">じちゃーさいせい</string>\n    <string name=\"no_comments\">コメントなし</string>\n    <string name=\"error_unable_to_load_comments\">コメントゆみくみやびらんたん</string>\n    <string name=\"close\">くーいん</string>\n    <string name=\"error_timeout\">しちずいちゅるタイムアウト</string>\n    <string name=\"enable_playback_resume_title\">さいせいさいかい</string>\n    <string name=\"enable_playback_resume_summary\">さいぐなさうぅいせいちゃるいちふちゅるぎんさびーん</string>\n    <string name=\"enable_playback_state_lists_title\">リストねーんぬいち</string>\n    <string name=\"enable_playback_state_lists_summary\">リストんかいさいせいいちインジケーターひょうじさびーん</string>\n    <string name=\"settings_category_clear_data_title\">データさちゅるじょ</string>\n    <string name=\"watch_history_states_deleted\">さいせいいちさちゅるじょさびたん</string>\n    <string name=\"missing_file\">ファイルぬうぅいちゃーあらんでぃさくじょさりやびたん</string>\n    <string name=\"overwrite_failed\">ファイルうわがきなやびらん</string>\n    <string name=\"download_already_pending\">いぬファイルめいぬダウンロードぬしでぃにしんこうちゅうやいびーん</string>\n    <string name=\"error_postprocessing_stopped\">ファイルぬさぎょうちゅうにNewPipeぬくーららりやびたん</string>\n    <string name=\"error_insufficient_storage_left\">デバイスんかいにりらりょうぬあいびらん</string>\n    <string name=\"error_progress_lost\">ファイルぬさちゅるじょさったるたみ、しんこうじょうちゅーがうしならりやびたん</string>\n    <string name=\"confirm_prompt\">ダウンロードりりき、あらんでぃダウンロードさるファイルしーょうきょさびーが？</string>\n    <string name=\"enable_queue_limit\">ダウンロードキューぬせいぎん</string>\n    <string name=\"enable_queue_limit_desc\">どうじーがてぃーちぬダウンロードぬじっこうさりやびーん</string>\n    <string name=\"start_downloads\">ダウンロードぬかいし</string>\n    <string name=\"pause_downloads\">ダウンロードぬいちじていし</string>\n    <string name=\"downloads_storage_ask_title\">ダウンロードさきたんにいん</string>\n    <string name=\"downloads_storage_ask_summary\">ダウンロードぬたびにふずんすーしょたんにやびーん。\n\\nSDカードんかいダウンロードさるいばあえーシステムフォルダピッカー（SAF）ゆーいるこうかさびーん</string>\n    <string name=\"downloads_storage_use_saf_title\">システムフォルダピッカー（SAF）しようすん</string>\n    <string name=\"downloads_storage_use_saf_summary\">ストレージアクセスフレームワークー、がいぶSDカードんかいぬダウンロードぬかのうやいびーん</string>\n    <string name=\"clear_playback_states_title\">さいせいいちのさくじょ</string>\n    <string name=\"clear_playback_states_summary\">まじりぬさいせいいちさちゅるじょさびーん</string>\n    <string name=\"delete_playback_states_alert\">まじりぬさいせいいちさちゅるじょさびーが？</string>\n    <string name=\"drawer_header_description\">サービスぬきりけーい、ぎんじぇーぬしんたく：</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%sふんぬちゃーしが</item>\n        <item quantity=\"other\">%sふんぬちゃーしが</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">デフォルトぬKiosk</string>\n    <string name=\"no_one_watching\">たーんんーじゃびらん</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%sんかいんがしちょうちゅう</item>\n        <item quantity=\"other\">%sんかいんがしちょうちゅう</item>\n    </plurals>\n    <string name=\"no_one_listening\">たーんちちゃびらん</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%sんかいんがちょうしゅちゅう</item>\n        <item quantity=\"other\">%sんかいんがちょうしゅちゅう</item>\n    </plurals>\n    <string name=\"seek_duration_title\">こうすくはやうくい/まきむどぅしかんかく</string>\n    <string name=\"peertube_instance_url_title\">PeerTubeインスタンス</string>\n    <string name=\"peertube_instance_url_summary\">PeerTubeインスタンスさんたくすん</string>\n    <string name=\"peertube_instance_url_help\">うんじゅんかいさちちーやーインスタンスかめーいん：%s</string>\n    <string name=\"peertube_instance_add_title\">インスタンスちちが</string>\n    <string name=\"peertube_instance_add_help\">インスタンスぬURLんかいゅうりょく</string>\n    <string name=\"peertube_instance_add_fail\">インスタンスきんしょうするくとぅがなやびらんたん</string>\n    <string name=\"peertube_instance_add_https_only\">HTTPSぬURLぬみんかいたいおうそーいびーん</string>\n    <string name=\"peertube_instance_add_exists\">インスタンスーしでぃにすんじぇーそーいびーん</string>\n    <string name=\"local\">ローカル</string>\n    <string name=\"recently_added\">さいきんちいからさったん</string>\n    <string name=\"most_liked\">かんひょうが</string>\n    <string name=\"recovering\">しーゅうふくちゅう</string>\n    <string name=\"error_download_resource_gone\">ダウンロードぬしーゅうふくなやびらん</string>\n    <string name=\"choose_instance_prompt\">インスタンスしんたく</string>\n    <string name=\"clear_download_history\">ダウンロードりりきしーょうきょ</string>\n    <string name=\"delete_downloaded_files\">ダウンロードさるファイルしーょうきょ</string>\n    <string name=\"playlist_no_uploader\">じちゃーせいせい（アップローダーぬみちかやびらん）</string>\n    <string name=\"permission_display_over_apps\">ふかぬアプリぬういにふぃいょうじしーんきんぎんをあてーてぃください</string>\n    <string name=\"app_language_title\">アプリぬぎんぐ</string>\n    <string name=\"systems_language\">システムぬっちうぅい</string>\n    <string name=\"subtitle_activity_recaptcha\">とぅきーねー「かんりょう」うちくぃみそーれー</string>\n    <string name=\"done\">かんりょう</string>\n    <string name=\"videos_string\">ちゃーしが</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%dびょう</item>\n        <item quantity=\"other\">%dびょう</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">ExoPlayerぬゆいてぃがろーくぬたみシークかんかこー%dびょうんかいしっていさりやびたん</string>\n    <string name=\"mute\">ミュート</string>\n    <string name=\"unmute\">ミュートかいじょ</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%dふん</item>\n        <item quantity=\"other\">%dふん</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%dじがん</item>\n        <item quantity=\"other\">%dじがん</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%dんかいち</item>\n        <item quantity=\"other\">%dんかいち</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">チャンネルグループ</string>\n    <string name=\"feed_oldest_subscription_update\">フィードぬさいしゅうこうしん：%s</string>\n    <string name=\"feed_subscription_not_loaded_count\">ゆみくみしっぺー：%d</string>\n    <string name=\"feed_notification_loading\">フィードゆみくみちゅう…</string>\n    <string name=\"feed_processing_message\">フィードしーょりちゅう…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">チャンネルしんたく</string>\n    <string name=\"feed_group_dialog_empty_selection\">チャンネルがせんたくされていません</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%dさんたくちゅう</item>\n        <item quantity=\"other\">%dさんたくちゅう</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">グループみいがからやいびーん</string>\n    <string name=\"feed_group_dialog_delete_message\">くぬグループさちゅるじょさびーが？</string>\n    <string name=\"feed_create_new_group_button_title\">しんき</string>\n    <string name=\"settings_category_feed_title\">フィード</string>\n    <string name=\"feed_update_threshold_title\">フィードぬこうしんかんかく</string>\n    <string name=\"feed_update_threshold_summary\">さいぐぬこうしんぐ、んでぃうるいちゅるチャンネルこうしんすんびきんでぃすかぬじがん ― %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">ちゃーこうしんすん</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">かのうやれーしんようフィードからしゅうとぅく</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">いくちがぬサービスっしりようかのう。ちうじーょうゆりむこうすくでぃすがせいぎんさりたじょうほうがしゅとぅくさり、たいていぬばあいふかんじんやいびーん（れい： さいせいじがん、しーゅるい、ライブステータスんでーがねーん）</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">こうすくモードゆーいんかんが</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">こうすくモードんーかなやー</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">フィードぬゆみくみがにーしじーんでぃうむやびーが？うぬばあい、こうすくゆみくみゆーいるこうかしんーちくぃみそーれー（しってい、あらんでぃしちゃぬボタンうしてぃへんかんするくとぅがなやびーん）。\n\\n\n\\nNewPipeーたーちぬゆみくみほうほうていきょうさびーん：\n\\n・とうるいちゅるチャンネルじんたいしゅとぅくさびーん。くれーていすくやいびーしがかんじんやいびーん。\n\\n・しんようぬサービスエンドポイントしーようさびーん。くれーこうすくやいびーしが、たいていぬばあいふかんじんやいびーん。\n\\n\n\\nたーちぬちがいとぅしてぃ、こうすくなむのーちうじょう、さいせいじがんてぃがろーしーゅるい（ライブんでぃちうじーょうぬどうがをくびちでぃきない）んでーぬじょうほうがふすくしてぃ、ただしいーょうぬじょうほうゆりすくなくしゅとぅくするくとぅがあいびーん。\n\\n\n\\nYouTubeー、くぬこうすくやーゆみくみほうほうRSSフィードっしていきょうするサービスぬてぃーちやいびーん。\n\\n\n\\nちまり、ゆみくみほうほうぬしんたくはすくどぅあらんでぃゆいかくさぬどぅちらゆーいるしんすが、うんじゅがしちがゆやびーん。</string>\n    <string name=\"infinite_videos\">∞ぬちゃーしが</string>\n    <string name=\"more_than_100_videos\">100いじょうぬちゃーしが</string>\n    <string name=\"content_not_supported\">くぬコンテンツーなーらNewPipeっしサポートさりやびらん。\n\\n\n\\nくんぐぬバージョンっしサポートさりーんかむしりやびらん。</string>\n    <string name=\"songs\">きょく</string>\n    <string name=\"artists\">アーティスト</string>\n    <string name=\"albums\">アルバム</string>\n    <string name=\"restricted_video\">くぬちゃーがんかいはにーるれいうぅいゆいぎんぬあいびーん。\n\\n\n\\nいちらんさるいばあい、しっていから \\\"%1$s\\\" ゆーいるこうかしみそーれー。</string>\n    <string name=\"remove_watched_popup_warning\">プレイリストんかいちいからさりーるめーんちいからさったるあとぅんしちょうさんちゃーしがはプレイリストからさくじょさりやびーん。 \\nゆたさいびーが？くぬあしっさーむとぅんかいむどぅしやびらん！</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">はい、ぶぶんてぃちーがしちょうさんちゃーしがんさちゅるじょさびーん</string>\n    <string name=\"remove_watched_popup_title\">しちょうじみぬちゃーしがさちゅるじょさびーが？</string>\n    <string name=\"remove_watched\">しちょうじみさちゅるじょ</string>\n    <string name=\"show_original_time_ago_summary\">サービスぬオリジナルぬテキストぬやーまほうあぬんかいひょうじさりやびーん</string>\n    <string name=\"show_original_time_ago_title\">アイテムんかいむとぅぬじがんひょうじ</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTubeせいぎんちきモードゆーいんかんが</string>\n    <string name=\"video_detail_by\">%sにゆる</string>\n    <string name=\"channel_created_by\">%sにゆりさくせい</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">チャンネルぬサムネイル</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">グループがさりてぃうぅらんとぅうるいちゅるチャンネルぬみひょうじ</string>\n    <string name=\"no_playlist_bookmarked_yet\">なーらプレイリストブックマークーあいびらん</string>\n    <string name=\"error_report_open_github_notice\">クラッシュしちめいするむんだいぬしでぃにすんじぇーそーんがちゃーがかくにんしみそーれー。じゅうふくさるチケットさくせいすーあい、うんじょーわったーからじっさいぬバグしーゅうせいすんじがんぼーいるくとぅなやびーん。</string>\n    <string name=\"search_showing_result_for\">ちぎぬきんさくきっかひょうじちょーいびーん：%s</string>\n    <string name=\"error_report_open_issue_button_text\">GitHubでぃほうくくすん</string>\n    <string name=\"copy_for_github\">せいけいじみリポートコピー</string>\n    <string name=\"playlist_page_summary\">プレイリストページ</string>\n    <string name=\"select_a_playlist\">プレイリストさんたくちくぃみそーれー</string>\n    <string name=\"autoplay_summary\">じちゃーてぃきなさうぅいゆいかいしさびーん — %s</string>\n    <string name=\"auto_queue_toggle\">じちゃーっしキューんかいちちが</string>\n    <string name=\"clear_queue_confirmation_description\">アクティブやるプレイヤーぬキューぬいりちがーやびーん</string>\n    <string name=\"clear_queue_confirmation_summary\">プレイヤーびちぬプレイヤーんかいきりけーいねーキューぬうきかわいるかのうゆいがあいびーん</string>\n    <string name=\"never\">さん</string>\n    <string name=\"wifi_only\">Wi-Fiぬみ</string>\n    <string name=\"title_activity_play_queue\">キューさいせい</string>\n    <string name=\"clear_queue_confirmation_title\">キューしーょうきょするめーんかいかくにんすん</string>\n    <string name=\"unsupported_url_dialog_message\">URLにいるしちなやびらんたん。ふかぬアプリっしふぃらちゃびーが？</string>\n    <string name=\"notification_scale_to_square_image_summary\">ちまーにひょうじさりーるサムネイル16:9からせいほうけいなさびーん</string>\n    <string name=\"notification_scale_to_square_image_title\">サムネイルせいほうけいなすん</string>\n    <string name=\"notification_actions_summary\">いかタップしちうちぬアクションへんしゅうさびーん。みぎぬわんかいあんチェックボックスしーようしコンパクトやるちまーにひょうじすし３ちまっししんたくさびーん。</string>\n    <string name=\"notification_actions_at_most_three\">コンパクトやるちまーにひょうじさりーるアクションー3ちまっしいらぶるくとぅがなやびーん！</string>\n    <string name=\"notification_action_4_title\">5ばんみぬアクションボタン</string>\n    <string name=\"notification_action_3_title\">4ばんみぬアクションボタン</string>\n    <string name=\"notification_action_2_title\">3ばんみぬアクションボタン</string>\n    <string name=\"notification_action_1_title\">2ばんみぬアクションボタン</string>\n    <string name=\"notification_action_0_title\">1ばんみぬアクションボタン</string>\n    <string name=\"notification_action_nothing\">なし</string>\n    <string name=\"notification_action_repeat\">くいけーし</string>\n    <string name=\"notification_action_shuffle\">シャッフル</string>\n    <string name=\"notification_action_buffering\">バッファリング</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTubeー、せいじんんきーぬかのうゆいやしがあんコンテンツじょがいすん「せいぎんちきモード」ていきょうそーいびーん</string>\n    <string name=\"show_age_restricted_content_summary\">されいせいぎん（18+んでー）ぬいゆーいっし、わらびんかえーふていくしーちなかのうゆいぬあるコンテンツひょうじすん</string>\n    <string name=\"enqueue_stream\">キューんかいちちが</string>\n    <string name=\"enqueued\">キューんかいちいからさびたん</string>\n    <string name=\"clear_cookie_summary\">reCAPTCHAとぅちゃるとぅちにNewPipeぬふずんさるCookieしーょうきょさびーん</string>\n    <string name=\"clear_cookie_title\">reCAPTCHAぬCookieしーょうきょ</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHAぬCookieぬしーょうきょさりやびたん</string>\n    <string name=\"show_memory_leaks\">メモリリークひょうじ</string>\n    <string name=\"show_thumbnail_summary\">ロックぬみんのーいけいとぅちうちぬりょうほうんかいサムネイルさすん</string>\n    <string name=\"show_thumbnail_title\">サムネイルひょうじすん</string>\n    <string name=\"notification_colorize_title\">うぅれーちきぬちうち</string>\n    <string name=\"notification_colorize_summary\">サムネイルぬメインカラーむとぅんかい、ちうちカラーなさびーん（まじりぬデバイスっしちゃーさすいんでーかぎやびらん）</string>\n    <string name=\"show_meta_info_title\">メタじょうほうひょうじ</string>\n    <string name=\"msg_calculating_hash\">ハッシュけいさんちゅう</string>\n    <string name=\"hash_channel_name\">ちゃーしがぬハッシュかちうち</string>\n    <string name=\"hash_channel_description\">ちゃーしがぬハッシュかしんこうじょうちゅーぬちうち</string>\n    <string name=\"comments_tab_description\">コメント</string>\n    <string name=\"show_description_summary\">んーかなしねーちゃーがぬがいようらんとぅちいかじょうほうふぃふぃょうじなさびーん</string>\n    <string name=\"show_description_title\">がいようらんひょうじ</string>\n    <string name=\"recent\">さいきん</string>\n    <string name=\"open_with\">ふぃらく</string>\n    <string name=\"description_tab_description\">しちめい</string>\n    <string name=\"related_items_tab_description\">かんりんちゃーしが</string>\n    <string name=\"show_meta_info_summary\">ちゃーしがさくせいしゃ、ちゃーしがコンテンツ、きんさくリクエストんかいかんすんちいかじょうほうくくむんメタじょうほうボックスふぃふぃょうじなすんがーオフなさびーん</string>\n    <string name=\"no_app_to_open_intent\">うちかいぬデバイスじょうぬアプリっしぇー、くりふぃらちゅしぇーなやびらん</string>\n    <string name=\"chapters\">チャプター</string>\n    <string name=\"paid_content\">くぬコンテンツーゆーいるりょうぬユーザーぬみがいようないるたみ、NewPipeっしぬストリーミングてぃがろーダウンロードーなやびらん。</string>\n    <string name=\"youtube_music_premium_content\">くぬちゃーしがーYouTubeミュージックプレミアムかいさるんぬみがいようないるようなとーくとぅ、NewPipeっしストリーミングてぃがろーダウンロードうくないしぇーなやびらん。</string>\n    <string name=\"private_content\">くぬコンテンツーふぃかかいぬたみ、NewPipeっしストリーミングてぃがろーダウンロードすしぇーなやびらん。</string>\n    <string name=\"soundcloud_go_plus_content\">くれーSoundCloud Go+トラックやくとぅ、すくなくとぅむうんじゅがくにっしぇー、NewPipeっしぇーストリーミングてぃがろーダウンロードぬなやびらん。</string>\n    <string name=\"georestricted_content\">くぬコンテンツー、うすんまいぬくにっしぇーぐりよういただきやびらん。</string>\n    <string name=\"crash_the_app\">アプリぬクラッシュ</string>\n    <string name=\"restricted_video_no_stream\">くぬちゃーがはにーるれいうぅいゆいぎんぬあいびーん。\n\\nされいせいぎんちきちゃーがくくむんみーさるYouTubeポリシーにゆり、NewPipeーちゃーがストリームんかいアクセスならんたみさいせいうぅいなやびらん。</string>\n    <string name=\"select_night_theme_toast\">いかからうくぬみぬやっくゎんテーマさんたくなやびーん</string>\n    <string name=\"auto_device_theme_title\">じちゃー（デバイスぬテーマ）</string>\n    <string name=\"night_theme_summary\">うくぬみぬやっくゎんテーマしんたく — %s</string>\n    <string name=\"recaptcha_solve\">かいきち</string>\n    <string name=\"night_theme_title\">やっくゎんテーマ</string>\n    <string name=\"download_has_started\">ダウンロードかいしさびたん</string>\n    <string name=\"show_channel_details\">チャンネルぬしーょうさいひょうじ</string>\n    <string name=\"radio\">ラジオ</string>\n    <string name=\"featured\">うすすみ</string>\n    <string name=\"disable_media_tunneling_summary\">ビデオさいゆいがとぅまたいでぃねーんばあえーメディアトンネリングんーかがしみそーれー。</string>\n    <string name=\"disable_media_tunneling_title\">マルチメディアトンネリングんーかなすん</string>\n    <string name=\"metadata_privacy_public\">かんかい</string>\n    <string name=\"metadata_privacy_unlisted\">ぎんてぃかんかい</string>\n    <string name=\"metadata_privacy_private\">ふぃかんかい</string>\n    <string name=\"metadata_privacy_internal\">やーいぶ</string>\n    <string name=\"metadata_category\">カテゴリ</string>\n    <string name=\"metadata_tags\">タグ</string>\n    <string name=\"metadata_licence\">ライセンス</string>\n    <string name=\"metadata_privacy\">プライバシー</string>\n    <string name=\"metadata_age_limit\">されいせいぎん</string>\n    <string name=\"metadata_language\">ぎんぐ</string>\n    <string name=\"metadata_support\">サポート</string>\n    <string name=\"metadata_host\">ホスト</string>\n    <string name=\"open_website_license\">ウェブサイトふぃらちゅん</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">ダウンロードぬかーじにふずんすーしょたんにやびーん</string>\n    <string name=\"no_dir_yet\">ダウンロードフォルダーぬなーらしっていさりやびらん。なまちゃーきデフォルトぬフォルダーさんたくちくぃみそーれー</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Android10いこおー \\'Storage Access Framework\\' ぬみやしがサポートさりやびーん</string>\n    <string name=\"feed_load_error_fast_unknown\">こうすくモードっしくぬじょうほうぬしーょうさいーていきょうさりやびらん。</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' ぬフィードゆみくみやびらんたん。</string>\n    <string name=\"feed_load_error\">フィードぬゆみくみエラー</string>\n    <string name=\"description_select_disable\">しちめいぶんぬテキストぬしんたくんーかなすん</string>\n    <string name=\"description_select_enable\">しちめいぶんぬテキストぬしんたくゆうこうなすん</string>\n    <string name=\"description_select_note\">なましちめいぶんぬテキストさんたくなやびーん。しんたくモードちゅおーページぬちらちちゃいリンクぬクリックならんなたいしーんくとぅんかいちゅういしみそーれー。</string>\n    <string name=\"account_terminated\">ていしさったるアカウント</string>\n    <string name=\"feed_load_error_terminated\">くぬとうこうしゃぬアカウントーていしさりとーいびーん。\n\\nNewPipeーしーょうらいてぃきにくぬフィードゆみくみらんなやびーん。\n\\nくぬチャンネルぬとぅうるいちゅんこーいじょさびーが？</string>\n    <string name=\"off\">オフ</string>\n    <string name=\"on\">オン</string>\n    <string name=\"tablet_mode_title\">タブレットモード</string>\n    <string name=\"dont_show\">ひょうじさん</string>\n    <string name=\"low_quality_smaller\">ていふぃんしち（しょう）</string>\n    <string name=\"high_quality_larger\">かんふぃんしち（だい）</string>\n    <string name=\"seekbar_preview_thumbnail_title\">シークバーぬサムネイルプレビュー</string>\n    <string name=\"comments_are_disabled\">コメントーんーかなとーいびーん</string>\n    <string name=\"mark_as_watched\">しちょうじみとぅしてぃマーク</string>\n    <string name=\"remote_search_suggestions\">リモートきんさくかんふ</string>\n    <string name=\"local_search_suggestions\">ローカルきんさくかんふ</string>\n    <string name=\"main_page_content_swipe_remove\">アイテムスワイプしさちゅるじょ</string>\n    <string name=\"start_main_player_fullscreen_summary\">ちょくしちフルスクリーンモードんかいきりけーてぃ、ミニプレイヤーっしちゃーがかいしさびらん。じどーでぃんうぅてぃんがロックさりとーーあいやてぃん、フルスクリーンしーゅうりょうするくとぅでぃミニプレイヤーんかいアクセスなやびーん</string>\n    <string name=\"start_main_player_fullscreen_title\">プレイヤーフルスクリーンっしかいし</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$sちぬダウンロードさちゅるじょさびたん</item>\n        <item quantity=\"other\">%1$sちぬダウンロードさちゅるじょさびたん</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">%sちぬダウンロードぬかんりょうさびたん</item>\n        <item quantity=\"other\">%sちぬダウンロードぬかんりょうさびたん</item>\n    </plurals>\n    <string name=\"processing_may_take_a_moment\">しーょりちゅう… くーてーんじがんがかかいんかむしりやびらん</string>\n    <string name=\"manual_update_description\">みーさるバージョンしーゅどうでぃかくにんさびーん</string>\n    <string name=\"checking_updates_toast\">アップデートかくにんちゅう…</string>\n    <string name=\"check_for_updates\">アップデートかくにん</string>\n    <string name=\"enqueue_next_stream\">ちぎキューんかいちちが</string>\n    <string name=\"enqueued_next\">ちぎキューんかいちいからさびたん</string>\n    <string name=\"detail_heart_img_view_description\">クリエイターぬちむくみてぃ</string>\n    <string name=\"show_crash_the_player_title\">\\\"プレイヤーぬクラッシュ\\\"ひょうじ</string>\n    <string name=\"crash_the_player\">プレイヤーぬクラッシュ</string>\n    <string name=\"feed_new_items\">みーさるフィードアイテム</string>\n    <string name=\"error_report_channel_name\">エラーほうくーくちうち</string>\n    <string name=\"error_report_notification_toast\">エラーぬはっせいさびたん。ちうちんーちくぃみそーれー</string>\n    <string name=\"error_report_notification_title\">エラーぬはっせいさびたん（タップしーねーほうくーくなやびーん）</string>\n    <string name=\"show_error_snackbar\">スナックバーんかいエラーひょうじ</string>\n    <string name=\"detail_pinned_comment_view_description\">くていさったるコメント</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">くぬちゃーさうぅてぃくしーちやーファイルマネージャぬみちかやびらんたん。\n\\nStorage Access Frameworkとぅぐかんゆいぬあんファイルマネージャインストールしみそーれー</string>\n    <string name=\"no_appropriate_file_manager_message\">くぬちゃーさうぅてぃくしーちやーファイルマネージャぬみちかやびらんたん\n\\nファイルマネージャインストールすが、ダウンロードしっていっし \\'%s\\' んーかなするくとぅうたみしくぃみそーれー</string>\n    <string name=\"show_crash_the_player_summary\">プレイヤーしようじんかいクラッシュオプションひょうじ</string>\n    <string name=\"create_error_notification\">エラーちうちさくせい</string>\n    <string name=\"error_report_channel_description\">エラーほうくーくすんちうち</string>\n    <string name=\"leak_canary_not_available\">LeakCanaryがりようふかのうやいびーん</string>\n    <string name=\"settings_category_player_notification_title\">プレイヤーちうち</string>\n    <string name=\"loading_stream_details\">ストリームぬしょうさいゆみくどーいびーん…</string>\n    <string name=\"enable_streams_notifications_summary\">とうるいちゅるチャンネルぬみーさるストリームんかいちいていちうちすん</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"notifications_disabled\">ちうちぇーんーかなやーさりとーいびーん</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayerぬデフォルト</string>\n    <string name=\"get_notified\">ちうちうきとぅいん</string>\n    <string name=\"you_successfully_subscribed\">くぬチャンネルかんどぅくさびたん</string>\n    <string name=\"delete_downloaded_files_confirm\">ディスクからダウンロードさるまじりぬファイルさちゅるじょさびーが？</string>\n    <string name=\"toggle_all\">まじりてーんがい</string>\n    <string name=\"streams_notifications_interval_title\">かくにんすんふぃんどぅ</string>\n    <string name=\"check_new_streams\">みーさるストリームぬチェックじっこう</string>\n    <string name=\"streams_notification_channel_description\">かんどぅちゅるチャンネルぬみーさるストリームんかいかんすんちうち</string>\n    <string name=\"enable_streams_notifications_title\">みーさるストリームぬちうち</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%sきんぬみーさるストリーム</item>\n        <item quantity=\"other\">%sきんぬみーさるストリーム</item>\n    </plurals>\n    <string name=\"streams_notification_channel_name\">みーさるストリーム</string>\n    <string name=\"notifications\">ちうち</string>\n    <string name=\"settings_category_player_notification_summary\">ぎんじぇーさいせいちょーるストリームぬちうちこうせい</string>\n    <string name=\"streams_notifications_network_title\">ふぃちぐとーるネットワークぬしーゅるい</string>\n    <string name=\"percent\">パーセント</string>\n    <string name=\"semitone\">はんうん</string>\n    <string name=\"any_network\">まじりぬネットワーク</string>\n    <string name=\"progressive_load_interval_title\">データぬゆみくみかんかく</string>\n    <string name=\"unknown_format\">みちぬけいしき</string>\n    <string name=\"unknown_quality\">みちぬふぃんしち</string>\n    <string name=\"streams_not_yet_supported_removed\">ダウンローダーにゆってぃサポートさりてぃうぅらんちゃーがーひょうじさりやびらん</string>\n    <string name=\"selected_stream_external_player_not_supported\">しんたくさったんちゃーがーがいぶプレイヤーんかいゆってぃサポートさりやびらん</string>\n    <string name=\"no_audio_streams_available_for_external_players\">やしがいぶプレイヤーっしりようがのうのーいるゆいストリームぬあいびらん</string>\n    <string name=\"no_video_streams_available_for_external_players\">やしがいぶプレイヤーっしりりようがのうやーちゃーがストリームぬあいびらん</string>\n    <string name=\"select_quality_external_players\">やしがいぶプレイヤーっしぬふぃんしちしんたく</string>\n    <string name=\"sort\">ならびがい</string>\n    <string name=\"faq\">ウェブサイトひょうじ</string>\n    <string name=\"app_update_available_notification_text\">タップし%sダウンロード</string>\n    <string name=\"app_update_unavailable_toast\">うんじょーNewPipeぬさいしんばんきどうそーいびーん</string>\n    <string name=\"faq_title\">ゆーあしちまん</string>\n    <string name=\"faq_description\">アアプリぬちかいかたんかいくまたるとぅちぇー、ゆーあんさちむぬんかいくてーとーいびーくとぅ、じふぃんーちくぃみそーれー！</string>\n    <string name=\"night_theme_available\">%sぬテーマなさんたくさったーあいぬみ、くぬしんたくしがりようかのうやいびーん</string>\n    <string name=\"fast_mode\">こうすくモード</string>\n    <string name=\"import_subscriptions_hint\">3てぃんメニューからんでぃうるいちゅるチャンネルぬゆみくみあらんでぃかきだしがかのう</string>\n    <string name=\"card\">カード</string>\n    <string name=\"msg_failed_to_copy\">クリップボードんかいぬコピーんかいしっぺーさびたん</string>\n    <string name=\"duplicate_in_playlist\">はいーらでぃひょうじさっとーるプレイリストんかえー、しでぃにくぬアイテムぬくくまっとーいびーん。</string>\n    <string name=\"playlist_add_stream_success_duplicate\">%dかいじゅうふくちいかさりやびたん</string>\n    <string name=\"unset_playlist_thumbnail\">くていサムネイルぬしっていこーいじょ</string>\n    <string name=\"remove_duplicates_title\">じゅうふくさくじょさびーが？</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">たとぅいねー、ぶちりボタンぬやんでぃたるヘッドセットしーようそーーあいにびんりやいびーん</string>\n    <string name=\"remove_duplicates_message\">くぬさいせいリストねーんぬじゅうふくさるストリームまじりさくじょさびーが？</string>\n    <string name=\"ignore_hardware_media_buttons_title\">ハードウェアメディアボタンイベントむしすん</string>\n    <string name=\"remove_duplicates\">じゅうふくさちゅるじょ</string>\n    <string name=\"feed_hide_streams_title\">ちぎぬストリームひょうじ</string>\n    <string name=\"feed_show_hide_streams\">ストリームぬひょうじ/ふぃふぃょうじ</string>\n    <string name=\"feed_show_watched\">かんじぬんかいしちょうじみ</string>\n    <string name=\"feed_show_partially_watched\">いちぶしはべるじみ</string>\n    <string name=\"feed_show_upcoming\">くんぐ</string>\n    <string name=\"left_gesture_control_summary\">さいせいがみんぬふぃだりはんぶんぐとぅジェスチャーしんたく</string>\n    <string name=\"left_gesture_control_title\">ふぃだりぬジェスチャーちゃーさ</string>\n    <string name=\"right_gesture_control_summary\">さいせいがみんぬみぎはんぶんようぬジェスチャーしんたく</string>\n    <string name=\"right_gesture_control_title\">みぎぬジェスチャーちゃーさ</string>\n    <string name=\"brightness\">あかるさ</string>\n    <string name=\"volume\">うんりょう</string>\n    <string name=\"none\">む</string>\n    <string name=\"prefer_original_audio_title\">オリジナルうんゆいゆーいんしんすん</string>\n    <string name=\"prefer_original_audio_summary\">ぎんぐんかいかんきうぅらなくオリジナルぬオーディオトラックさんたくすん</string>\n    <string name=\"prefer_descriptive_audio_title\">うんせいかいしちゆーいんしんすん</string>\n    <string name=\"main_tabs_position_summary\">メインタブセレクタさるにいちゃー</string>\n    <string name=\"main_tabs_position_title\">メインタブぬばしょ</string>\n    <string name=\"progressive_load_interval_summary\">ゆみくみかんかくへいるかんさびーん。（ぎんじぇー %s）くぬあたいくーくしーねーさいせいかいしまでぃぬじがんがいんちゃくなやびーん。へんかんてぃきようすんがーさいきちゃーがふぃちようやいびーん</string>\n    <string name=\"prefer_descriptive_audio_summary\">りようかのうなばあいんかいしかくしょうがいしゃむきのおんせいかいしちトラックさんたくすん</string>\n    <string name=\"play_queue_audio_track\">オーディオ：%s</string>\n    <string name=\"audio_track\">オーディオトラック</string>\n    <string name=\"select_audio_track_external_players\">やしがいぶプレイヤーようぬオーディオトラックしんたく</string>\n    <string name=\"unknown_audio_track\">ふめいうぅい</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer しってい</string>\n    <string name=\"audio_track_present_in_video\">オーディオトラックーしでぃにくぬししらぎんかいすんじぇーそーるふぃちようがあいびーん</string>\n    <string name=\"disable_media_tunneling_automatic_info\">うちかいぬデバイスぬモデルっしぇーメディアトンネリングぬサポートさりてぃうぅらんたみ、くぬデバイスっしぇーメディアトンネリングぬデフォルトっしんーかなとーいびーん。</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">デコーダぬしーむんだいぬあーあえー、くぬオプションゆーいるこうかしプライマリデコーダしーょきかしっぺーじにふぃくいゆうしんどぅぬデコーダんかいフォールバックさびーん。プライマリデコーダしようじやかパフォーマンスぬあっかすがのうゆいがあいびーん</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">くぬかいきちさこーちょくしちコーデックサーフェスんかいしっていしーんかわりんかい、サーフェスぬへいるかんさったるさいんかいえいぞうコーデックかいほうしさいインスタンスがさびーん。しでぃにいくちがぬデバイスっしくぬかいきちさくぬささりとーいびーしが、Android 6いくてぃぬみちぬーさびーん\n\\n\n\\nくぬオプションゆーいるこうかしーんくとぅっしプレイヤーきりけーたい、フルスクリーンんかいきりけーたいしーんさいぬさいせいエラーふしじゃびーん</string>\n    <string name=\"audio_track_type_dubbed\">ふきけー</string>\n    <string name=\"settings_category_exoplayer_summary\">ExoPlayerぬしっていかんりさびーん。くりらぬへんかんはんえいすんがープレイヤーぬさいきちゃーがふぃちようやいびーん</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">ちゃーExoPlayerぬえいぞうしーゅちりょくサーフェスしっていぬかいきちさくしようすん</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_descriptive\">うんせいかいしち</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">ExoPlayerぬデコーダフォールバックちぬーさすん</string>\n    <string name=\"audio_track_type_original\">オリジナル</string>\n    <string name=\"no_streams\">ストリームーあいびらん</string>\n    <string name=\"no_live_streams\">ライブーいしのーあいびらん</string>\n    <string name=\"channel_tab_videos\">ちゃーしが</string>\n    <string name=\"metadata_subscribers\">とうるくさゃ</string>\n    <string name=\"show_channel_tabs_summary\">チャンネルページんかいひょうじさりーんタブ</string>\n    <string name=\"show_channel_tabs\">チャンネルタブ</string>\n    <string name=\"channel_tab_shorts\">ショート</string>\n    <string name=\"loading_metadata_title\">メタじょうほうゆみくどーいびーん…</string>\n    <string name=\"feed_fetch_channel_tabs\">チャンネルタブしーゅとぅくしーん</string>\n    <string name=\"channel_tab_about\">しょうさい</string>\n    <string name=\"channel_tab_albums\">アルバム</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">フィードこうしんすんとぅちなしゅとぅくしーんタブ。 こうすくモードさしてぃチャンネルこうしんすーあえー、かんがぬあいびらん。</string>\n    <string name=\"channel_tab_playlists\">プレイリスト</string>\n    <string name=\"channel_tab_tracks\">トラック</string>\n    <string name=\"channel_tab_channels\">チャンネル</string>\n    <string name=\"channel_tab_livestreams\">ライブ</string>\n    <string name=\"toggle_screen_orientation\">やしがみんぬむききりかいーん</string>\n    <string name=\"toggle_fullscreen\">フルスクリーンんかいきりかいーん</string>\n    <string name=\"next_stream\">ちぎぬストリーム</string>\n    <string name=\"open_play_queue\">さいせいキューふぃらちゅん</string>\n    <string name=\"forward\">フォワード</string>\n    <string name=\"rewind\">まきんどぅし</string>\n    <string name=\"replay\">リプレイ</string>\n    <string name=\"play\">さいせい</string>\n    <string name=\"more_options\">うぬふかぬオプション</string>\n    <string name=\"duration\">ちかん</string>\n    <string name=\"previous_stream\">めーぬストリーム</string>\n    <string name=\"image_quality_title\">ふぃんしち</string>\n    <string name=\"question_mark\">？</string>\n    <string name=\"image_quality_low\">ていふぃんしち</string>\n    <string name=\"metadata_avatars\">アバター</string>\n    <string name=\"metadata_subchannel_avatars\">サブチャンネルぬアバター</string>\n    <string name=\"image_quality_none\">やしがぞうゆみくまん</string>\n    <string name=\"image_quality_high\">かんふぃんしち</string>\n    <string name=\"image_quality_medium\">ちゅうふぃんしち</string>\n    <string name=\"metadata_uploader_avatars\">アップローダーぬアバター</string>\n    <string name=\"metadata_banners\">バナー</string>\n    <string name=\"image_quality_summary\">やしがぞうぬふぃんしちとぅぬぞうゆみくむがちゃーがさんたくち、データとぅメモリぬしようりょうさくぎんさびーん。 へんかんにゆり、メモリねーんとぅディスクじょうぬがぞうキャッシュぬりょうほうがクリアさりやびーん — %s</string>\n    <string name=\"metadata_thumbnails\">サムネイル</string>\n    <string name=\"share_playlist_with_list\">URLリストっしちゅーゆーいん</string>\n    <string name=\"share_playlist_with_titles\">タイトルちきっしちゅーゆーいん</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">プレイリストちゅーゆーいん</string>\n    <string name=\"video_details_list_item\">- %1$s： %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%sぬへんしん</item>\n        <item quantity=\"other\">%sぬへんしん</item>\n    </plurals>\n    <string name=\"show_more\">なーふぃんんーじゅん</string>\n    <string name=\"show_less\">ひょうじいきらくすん</string>\n    <string name=\"notification_actions_summary_android13\">いかぬちうちアクションタップしへんしゅうさびーん。さいしょぬみーちぬアクション （さいせい/いちじていし、めーんかい、ちぎんかい）ーシステムにゆってぃしっていさりてぃうぅい、カスタマイズすしぇーなやびらん。</string>\n    <string name=\"yes\">はい</string>\n    <string name=\"auto_update_check_description\">NewPipeーてぃんじちーがみーさるバージョンじちゃーてぃきんかいチェックしー、こうしんがのうないるとぅちうちさびーん。\n\\nゆうこうなさびーが？</string>\n    <string name=\"error_insufficient_storage\">デバイスぬあきゆういょうがふすくそーいびーん</string>\n    <string name=\"no\">うぅーうぅー</string>\n    <string name=\"settings_category_backup_restore_title\">バックアップとぅふくぎん</string>\n    <string name=\"reset_settings_title\">しっていリセット</string>\n    <string name=\"reset_settings_summary\">まじりぬしっていデフォルトじょうたいんかいリセットさびーん</string>\n    <string name=\"reset_all_settings\">まじりぬしっていリセットしーねー、ゆーいるしんしっていぬまじりはちされい、アプリぬさいきちゃーさびーん。\n\\n\n\\nずっこうさびーが？</string>\n    <string name=\"import_settings_vulnerable_format\">インポートさりとーるエクスポートぬしってえー、NewPipe 0.27.0いこおーふぃするいしょうでぃあったけいしきしーようさびーん。 インポートさりとーるエクスポートーしんらいないるじょうほうぎんからでぃあり、しょうらいていちがーNewPipe 0.27.0がくりやかみーさるバージョンからいらりーるエクスポートぬみゆーいるしんししようさびーん。 くぬぜいじゃくやるけいしきっししっていインポートするたみぬたいおおーちゃーきかんじんにさくじょされい、みーさるバージョンからエクスポートぬしっていインポートすしぇーなやびらん。</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-sat/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"share_dialog_title\">ᱥᱟᱞᱟᱜ ᱦᱟᱹᱴᱤᱧ ᱢᱮ</string>\n    <string name=\"settings\">ᱥᱟᱡᱟᱣᱠᱚ</string>\n    <string name=\"search\">ᱥᱮᱸᱫᱽᱨᱟ</string>\n    <string name=\"download\">ᱰᱟᱩᱱᱞᱚᱰ</string>\n    <string name=\"share\">ᱦᱟᱹᱴᱤᱧ</string>\n    <string name=\"open_in_browser\">ᱵᱨᱟᱣᱡᱟᱚᱨ ᱨᱮ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ</string>\n    <string name=\"cancel\">ᱵᱟᱹᱰᱨᱟᱹ</string>\n    <string name=\"install\">ᱵᱚᱦᱟᱞ</string>\n    <string name=\"main_bg_subtitle\">ᱮᱦᱚᱵ ᱞᱟᱹᱜᱤᱫ ᱢᱮᱜᱽᱱᱤᱯᱷᱟᱭᱤᱝ ᱜᱽᱞᱟᱥ ᱨᱮ ᱚᱛᱟᱭ ᱢᱮ ᱾</string>\n    <string name=\"use_external_video_player_title\">ᱵᱟᱦᱨᱮ ᱣᱤᱰᱤᱭᱚ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱮᱵᱷᱟᱨ ᱢᱮ</string>\n    <string name=\"search_showing_result_for\">ᱛᱮᱞᱟ ᱫᱮᱠᱷᱟᱣᱜᱽ ᱠᱟᱱᱟᱺ%s</string>\n    <string name=\"did_you_mean\">ᱟᱢᱟᱜ ᱚᱨᱛᱷᱚ \\\"%1$s\\\" ᱥᱮ\\?</string>\n    <string name=\"controls_download_desc\">ᱥᱴᱨᱤᱢ ᱨᱮᱫ ᱰᱟᱩᱱᱞᱳᱰ ᱢᱮ</string>\n    <string name=\"open_in_popup_mode\">ᱯᱚᱯᱚᱯ ᱢᱳᱰ ᱨᱮ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ</string>\n    <string name=\"no_player_found_toast\">ᱚᱠᱟ ᱥᱴᱨᱤᱢ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ (ᱟᱢ VLC ᱯᱞᱮᱭᱟᱹᱨ ᱵᱚᱦᱟᱞ ᱠᱟᱛᱮ ᱚᱱᱟ ᱨᱮ ᱯᱞᱮ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱢ)᱾</string>\n    <string name=\"no_player_found\">ᱚᱠᱟ ᱥᱴᱨᱤᱢ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ ᱾ VLC ᱵᱚᱦᱟᱞ ᱟᱢ ᱥᱮ\\?</string>\n    <string name=\"upload_date_text\">%1$s ᱨᱮ ᱩᱪᱷᱟᱹᱱ ᱮᱱᱟ</string>\n    <string name=\"subscribe_button_title\">ᱥᱟᱹᱵᱥᱠᱨᱟᱭᱤᱵᱽ</string>\n    <string name=\"unsubscribe\">ᱟᱹᱱᱥᱟᱹᱵᱥᱠᱨᱟᱭᱤᱵᱽ</string>\n    <string name=\"subscribed_button_title\">ᱥᱟᱹᱵᱥᱠᱨᱭᱤᱵᱽ ᱮᱱᱟ</string>\n    <string name=\"subscription_change_failed\">ᱥᱟᱹᱵᱥᱠᱨᱭᱤᱯᱥᱚᱱ ᱵᱚᱫᱚᱞ ᱵᱟᱭ ᱜᱟᱱᱟᱜᱽ ᱠᱟᱱᱟ</string>\n    <string name=\"channel_unsubscribed\">ᱪᱟᱱᱱᱮᱹᱞ ᱟᱹᱱᱥᱟᱹᱵᱥᱠᱨᱟᱭᱤᱵᱽ ᱮᱱᱟ</string>\n    <string name=\"use_external_audio_player_title\">ᱵᱟᱦᱨᱮ ᱟᱹᱰᱤᱭᱚ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱮᱵᱽᱦᱟᱨ ᱢᱮ</string>\n    <string name=\"tab_bookmarks\">ᱵᱩᱻᱠᱢᱟᱨᱠ ᱯᱞᱮᱞᱤᱥᱴ ᱠᱚ</string>\n    <string name=\"tab_subscriptions\">ᱥᱟᱹᱵᱥᱠᱨᱤᱯᱥᱚᱱ ᱠᱚ</string>\n    <string name=\"show_info\">ᱤᱱᱯᱷᱚ ᱫᱮᱠᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"subscription_update_failed\">ᱥᱟᱹᱵᱥᱠᱨᱤᱯᱥᱚᱱ ᱵᱟᱝ ᱟᱹᱯᱰᱮᱴ ᱜᱟᱱᱚᱜᱽ ᱱᱟᱠᱟ</string>\n    <string name=\"use_external_video_player_summary\">ᱥᱟᱲᱮ ᱠᱚ ᱛᱤᱱᱟᱹᱝ ᱜᱟᱱ ᱨᱤᱡᱚᱞᱭᱩᱥᱚᱱ ᱠᱚ ᱴᱷᱮᱱ ᱚᱪᱚᱜᱽ ᱟᱭ</string>\n    <string name=\"download_path_title\">ᱣᱤᱰᱤᱭᱚ ᱰᱟᱩᱱᱞᱳᱰ ᱯᱚᱴᱚᱢ</string>\n    <string name=\"controls_add_to_playlist_title\">ᱥᱮᱞᱮᱫᱽ ᱢᱮ</string>\n    <string name=\"controls_popup_title\">ᱯᱳᱯᱟᱹᱯ</string>\n    <string name=\"controls_background_title\">ᱵᱮᱠᱜᱨᱟᱩᱸᱰ</string>\n    <string name=\"tab_choose\">ᱴᱮᱵᱽ ᱵᱟᱪᱷᱟᱣᱢᱮ</string>\n    <string name=\"download_path_summary\">ᱰᱟᱩᱱᱞᱳᱰ ᱠᱟᱱ ᱣᱤᱰᱤᱭᱚ ᱨᱮᱫ ᱱᱚᱰᱮ ᱫᱚᱦᱚᱜᱼᱟ</string>\n    <string name=\"show_higher_resolutions_title\">ᱡᱟᱹᱥᱛᱤ ᱨᱤᱡᱽᱚᱞᱭᱩᱥᱚᱱ ᱫᱮᱠᱷᱟᱣᱢᱮ</string>\n    <string name=\"default_popup_resolution_title\">ᱢᱩᱞ ᱯᱷᱮᱲᱟᱛ ᱯᱚᱯ-ᱚᱯ ᱨᱤᱡᱽᱚᱞᱭᱩᱥᱚᱱ</string>\n    <string name=\"default_resolution_title\">ᱢᱩᱞ ᱯᱷᱮᱲᱟᱛ ᱨᱮᱡᱽᱚᱞᱭᱩᱥᱚᱱ</string>\n    <string name=\"download_path_audio_dialog_title\">ᱥᱟᱫᱮ ᱨᱮᱫᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱰᱟᱩᱱᱞᱳᱰ ᱯᱚᱴᱚᱢ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"download_path_audio_summary\">ᱰᱟᱩᱱᱞᱳᱰ ᱟᱠᱟᱱ ᱥᱟᱲᱮ ᱮᱨᱫ ᱠᱚ ᱱᱚᱰᱮ ᱫᱚᱦᱚᱜᱼᱟ</string>\n    <string name=\"download_path_audio_title\">ᱥᱟᱲᱮ ᱰᱟᱩᱱᱞᱳᱰ ᱯᱚᱴᱚᱢ</string>\n    <string name=\"download_path_dialog_title\">ᱣᱤᱰᱤᱭᱚ ᱨᱮᱫᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱰᱟᱩᱱᱞᱳᱰ ᱯᱚᱴᱚᱢ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"play_with_kodi_title\">Kodi ᱥᱟᱞᱟᱜ ᱪᱟᱹᱞᱩᱭ ᱢᱮ</string>\n    <string name=\"show_higher_resolutions_summary\">ᱠᱷᱟᱹᱞᱤ ᱛᱤᱱᱟᱹᱝ ᱜᱟᱱ ᱥᱟᱫᱷᱚᱱ ᱢᱮᱱᱟᱜᱼᱟ ᱚᱠᱟ ᱫᱚ 2K/4K ᱣᱤᱰᱤᱭᱚ ᱠᱚ ᱪᱟᱹᱞᱩ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱭ</string>\n    <string name=\"open_with\">ᱥᱟᱞᱟᱜ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ</string>\n    <string name=\"kore_not_found\">Kore ᱮᱯ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ, ᱵᱚᱦᱟᱞ ᱟ ᱥᱮ\\?</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi ᱢᱮᱰᱤᱭᱟ ᱯᱞᱮᱭᱟᱹᱨ ᱛᱮ ᱣᱤᱰᱤᱭᱚ ᱯᱞᱮ ᱨᱮᱭᱟᱜ ᱚᱯᱥᱚᱱ ᱫᱮᱠᱷᱟᱣᱢᱮ</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi ᱛᱮ ᱪᱟᱹᱞᱩ\\\" ᱚᱯᱥᱚᱱ ᱫᱮᱠᱷᱟᱣᱢᱮ</string>\n    <string name=\"notification_colorize_title\">ᱱᱚᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱠᱚᱞᱚᱨ ᱠᱟᱜ ᱢᱮ</string>\n    <string name=\"notification_action_nothing\">ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱝ</string>\n    <string name=\"notification_action_buffering\">ᱵᱟᱹᱯᱷᱨᱤᱝ</string>\n    <string name=\"notification_action_shuffle\">ᱥᱚᱯᱷᱚᱞ</string>\n    <string name=\"notification_action_repeat\">ᱨᱤᱯᱤᱴ</string>\n    <string name=\"notification_actions_at_most_three\">ᱠᱚᱢᱯᱮᱠᱼᱴ ᱱᱚᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱨᱮ ᱫᱮᱠᱷᱟᱣ ᱪᱷᱚ ᱞᱟᱹᱜᱤᱫ ᱟᱢ ᱯᱮ ᱠᱟᱹᱢᱤ ᱦᱟᱹᱵᱤᱡ ᱮᱢ ᱵᱟᱪᱷᱟᱣ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ!</string>\n    <string name=\"notification_actions_summary\">ᱡᱷᱚᱛᱚ ᱱᱚᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱪᱮᱛᱟᱱ ᱨᱮ ᱥᱟᱯᱲᱟᱣ ᱮᱢ ᱞᱟᱹᱜᱤᱫ ᱚᱱᱟ ᱨᱮ ᱚᱛᱟᱭ ᱢᱮ ᱾ ᱠᱚᱢᱯᱮᱠᱼᱴ ᱱᱚᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱨᱮ ᱡᱚᱡᱚᱢ ᱛᱤ ᱯᱟᱦᱴᱟ ᱨᱮ ᱪᱮᱠᱵᱟᱠᱚᱥ ᱨᱮ ᱫᱮᱠᱷᱟᱣ ᱪᱷᱚ ᱞᱟᱹᱜᱤᱫ ᱯᱮ ᱠᱷᱚᱱ ᱡᱟᱹᱥᱛᱤ ᱵᱟᱪᱷᱟᱣ ᱛᱟᱭ ᱫᱚᱨᱠᱟᱨ ᱾</string>\n    <string name=\"notification_action_4_title\">ᱢᱚᱬᱮᱤᱭᱟᱹ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ</string>\n    <string name=\"notification_action_3_title\">ᱚᱱᱟ ᱛᱮᱥᱟᱨ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ</string>\n    <string name=\"notification_action_2_title\">ᱛᱮᱥᱟᱨ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ</string>\n    <string name=\"notification_action_1_title\">ᱫᱚᱥᱟᱨ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ</string>\n    <string name=\"notification_action_0_title\">ᱢᱟᱲᱟᱝ ᱠᱟᱹᱢᱤ ᱵᱩᱛᱟᱹᱢ</string>\n    <string name=\"notification_scale_to_square_image_title\">ᱛᱷᱟᱹᱢᱵᱽᱱᱮᱞ ᱫᱚ ᱑:᱑ ᱮᱥᱯᱮᱠᱼᱴ ᱨᱮᱥᱤᱭᱚ ᱨᱮ ᱜᱮᱫ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"ok\">ᱴᱷᱤᱠ</string>\n    <string name=\"play_audio\">ᱥᱟᱰᱮ</string>\n    <string name=\"mark_as_watched\">ᱧᱮᱞ ᱠᱟᱱ ᱞᱮᱠᱷᱟ ᱪᱤᱱᱦᱟᱹ ᱠᱟᱜ ᱢᱮ</string>\n    <string name=\"crash_the_player\">ᱯᱞᱮᱭᱚᱨ ᱠᱨᱟᱥ ᱠᱟᱜ ᱢᱮ</string>\n    <string name=\"theme_title\">ᱛᱷᱤᱢ</string>\n    <string name=\"light_theme_title\">ᱟᱨᱥᱟᱞ</string>\n    <string name=\"dark_theme_title\">ᱧᱩᱛ</string>\n    <string name=\"night_theme_title\">ᱧᱩᱛ ᱛᱷᱤᱢ</string>\n    <string name=\"black_theme_title\">ᱦᱮᱱᱫᱮ</string>\n    <string name=\"high_quality_larger\">ᱪᱮᱛᱟᱱ ᱥᱤᱠᱷᱱᱟᱹᱛ (ᱢᱟᱨᱟᱝ)</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"delete\">ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"best_resolution\">ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱱᱟᱯᱟᱭ ᱨᱩᱣᱟᱹ</string>\n    <string name=\"file_deleted\">ᱦᱟᱹᱴᱤᱧ ᱪᱷᱟᱯᱟ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"disable_media_tunneling_title\">ᱢᱤᱰᱤᱭᱟ ᱴᱚᱱᱮᱞᱤᱝ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"feed_update_threshold_option_always_update\">ᱥᱟᱱᱟᱢ ᱚᱵᱚᱫᱷᱤ</string>\n    <string name=\"default_audio_format_title\">ᱰᱤᱯᱷᱚᱞᱴ ᱥᱟᱰᱮ ᱯᱷᱚᱨᱢᱮᱴ</string>\n    <string name=\"enable_watch_history_title\">ᱧᱮᱞ ᱱᱟᱜᱟᱢ</string>\n    <string name=\"resume_on_audio_focus_gain_title\">ᱠᱷᱤᱞᱚᱱᱰ ᱮᱦᱚᱵ ᱢᱮ</string>\n    <string name=\"tracks\">ᱴᱨᱮᱠ</string>\n    <string name=\"import_data_title\">ᱤᱢᱯᱳᱨᱴ ᱰᱮᱴᱟᱵᱮᱥ</string>\n    <string name=\"general_error\">ᱪᱷᱟᱸᱪ</string>\n    <string name=\"contribution_encouragement\">ᱟᱢᱟᱜ ᱟᱭᱳ ᱟᱲᱟᱝ, ᱰᱤᱡᱟᱭᱤᱱ ᱵᱮᱵᱚᱥᱛᱟ, ᱠᱳᱰ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ, ᱟᱨᱵᱟᱝ ᱟᱹᱰᱤ ᱢᱟᱨᱟᱝ ᱠᱳᱰ ᱵᱮᱵᱚᱥᱛᱟ ᱨᱮᱱᱟᱜ ᱟᱭᱳ ᱟᱲᱟᱝ ᱢᱮᱱᱟᱜᱼᱟ ⁇ ᱜᱚᱲᱚ ᱫᱚ ᱡᱚᱛᱚ ᱚᱠᱛᱚ ᱨᱮᱜᱮ ᱥᱟᱨᱦᱟᱣ ᱢᱮᱱᱟᱜᱼᱟ ᱾ ᱰᱤᱜᱟᱱ ᱠᱟᱹᱢᱤ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱚᱱᱟ ᱜᱮ ᱱᱟᱯᱟᱭᱚᱜ-ᱟ ᱾</string>\n    <string name=\"view_on_github\">GitHub ᱨᱮ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"most_liked\">ᱡᱟᱹᱥᱛᱤ ᱞᱟᱭᱠᱟᱨ</string>\n    <string name=\"delete_downloaded_files\">ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞᱤᱯ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"delete_downloaded_files_confirm\">ᱰᱤᱥᱠ ᱠᱷᱚᱱ ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ?</string>\n    <string name=\"radio\">ᱨᱮᱰᱤᱭᱳ</string>\n    <string name=\"settings_category_player_title\">ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ</string>\n    <string name=\"grid\">ᱜᱽᱨᱤᱰ</string>\n    <string name=\"stop\">ᱥᱴᱚᱯ</string>\n    <string name=\"enable_queue_limit\">ᱰᱟᱩᱱᱞᱚᱰ ᱞᱤᱢᱤᱴᱮᱰ ᱠᱩᱣᱮ</string>\n    <string name=\"main_tabs_position_summary\">ᱢᱩᱬᱩᱛ ᱴᱮᱵᱽ ᱵᱟᱪᱷᱟᱣᱤᱭᱟᱹ ᱫᱚ ᱞᱟᱛᱟᱨ ᱨᱮ ᱞᱟᱜᱟᱜ ᱢᱮ</string>\n    <string name=\"blank_page_summary\">ᱵᱞᱮᱠ ᱥᱟᱦᱴᱟ</string>\n    <string name=\"card\">ᱠᱟᱨᱰ</string>\n    <string name=\"no_video_streams_available_for_external_players\">ᱵᱟᱦᱨᱮ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱵᱟᱭ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"select_quality_external_players\">ᱵᱟᱦᱨᱮ ᱮᱱᱮᱡᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"unknown_format\">ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱟᱠᱟᱱ ᱯᱷᱚᱨᱢᱮᱴ</string>\n    <string name=\"no_streams\">ᱵᱟᱹᱱᱩᱜᱼᱟ ᱫᱟᱜ</string>\n    <string name=\"msg_popup_permission\">ᱱᱚᱶᱟ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ_x000D_\n\\nᱯᱚᱯ-ᱟᱯ ᱢᱚᱰ ᱨᱮ ᱮᱛᱦᱚᱵ ᱢᱮ</string>\n    <string name=\"subtitle_activity_recaptcha\">ᱡᱚᱠᱷᱚᱱ ᱥᱟᱦᱟᱣ ᱟᱠᱟᱱᱟ \\\"Done\\\" ᱚᱞ ᱢᱮ</string>\n    <string name=\"give_back\">ᱨᱩᱣᱟ.</string>\n    <string name=\"select_a_kiosk\">ᱠᱤᱭᱳᱥᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"new_and_hot\">ᱱᱟᱣᱟ ᱟᱨ ᱦᱮᱴ</string>\n    <string name=\"recently_added\">ᱱᱟᱦᱟᱜ ᱥᱮᱞᱮᱫ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"show_channel_details\">ᱪᱟᱱᱮᱞ ᱵᱟᱰᱟᱭ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"enqueue_stream\">ᱤᱱᱠᱭᱩᱤᱝ</string>\n    <string name=\"enqueued\">ᱮᱱᱠᱭᱩᱣᱮᱰ</string>\n    <string name=\"start_here_on_background\">ᱚᱛᱱᱚ ᱨᱮ ᱥᱮᱞᱮᱫ ᱮᱛᱚᱦᱚᱵ ᱢᱮ</string>\n    <string name=\"always_ask_open_action\">ᱡᱚᱛᱚ ᱚᱠᱛᱚ ᱯᱮᱨᱮᱡ ᱢᱮ</string>\n    <string name=\"preferred_player_fetcher_notification_title\">ᱤᱱᱯᱷᱳ ᱧᱟᱢ…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">ᱞᱟᱹᱠᱛᱤ ᱟᱠᱟᱱ ᱥᱟᱦᱴᱟ ᱞᱚᱰ ᱮᱱᱟ</string>\n    <string name=\"name\">ᱧᱩᱛᱩᱢ</string>\n    <string name=\"add_to_playlist\">ᱥᱮᱨᱮᱧ ᱞᱤᱥᱴᱤ ᱨᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ</string>\n    <string name=\"processing_may_take_a_moment\">ᱠᱟᱹᱢᱤᱦᱚᱨᱟ... ᱚᱠᱛᱚ ᱫᱷᱟᱹᱵᱤᱡ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ</string>\n    <string name=\"show_crash_the_player_title\">ᱠᱨᱟᱥ ᱴᱷᱮᱱ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ</string>\n    <string name=\"disable_media_tunneling_automatic_info\">ᱟᱢᱟᱜ ᱚᱱᱚᱞ ᱨᱮ ᱢᱤᱰᱤᱭᱟ ᱴᱩᱱᱮᱞᱤᱝ ᱫᱚ ᱰᱤᱯᱚᱞᱴ ᱞᱮᱠᱟᱛᱮ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ ᱪᱮᱫᱟᱜ ᱥᱮ ᱟᱢᱟᱜ ᱚᱱᱚᱞ ᱢᱚᱰᱮᱞ ᱱᱚᱶᱟ ᱵᱟᱭ ᱥᱚᱦᱚᱫᱟ ᱾</string>\n    <string name=\"crash_the_app\">ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"show_error_snackbar\">ᱢᱤᱫ error ᱥᱱᱮᱠᱵᱟᱨ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"import_soundcloud_instructions\">URL ᱥᱮ ᱟᱢᱟᱜ ID ᱚᱞ ᱠᱟᱛᱮᱜ ᱢᱤᱫ SoundCloud ᱯᱨᱚᱯᱷᱟᱭᱤᱞ ᱮᱢ ᱢᱮ:_x000D_\n\\n_x000D_\n\\n1. ᱢᱤᱫ ᱣᱮᱵᱽ-ᱵᱽᱨᱟᱣᱡᱚᱨ ᱨᱮ \\\"ᱰᱮᱥᱠᱴᱚᱯ ᱢᱳᱰ\\\" ᱮᱱᱮᱡ ᱢᱮ (ᱡᱚᱵᱮᱛᱟᱨᱮ ᱢᱚᱵᱟᱭᱤᱞ ᱰᱤᱵᱟᱤᱥ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱧᱟᱢᱚᱜᱼᱟ)_x000D_\n\\n2. ᱱᱚᱶᱟ URL ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ: %1$s_x000D_\n\\n3. ᱞᱚᱜᱤᱱ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ_x000D_\n\\n4. ᱟᱢ ᱚᱠᱟ ᱨᱮ ᱥᱮᱞᱮᱫ ᱞᱮᱱᱟᱢ ᱚᱱᱟ ᱯᱨᱚᱯᱷᱟᱭᱤᱞ URL ᱠᱚᱯᱤ ᱢᱮ.</string>\n    <string name=\"playback_speed_control\">ᱯᱞᱮᱵᱮᱠ ᱥᱯᱤᱰ ᱠᱚᱱᱴᱨᱚᱞ</string>\n    <string name=\"playback_tempo\">ᱴᱮᱢᱯᱳ</string>\n    <string name=\"unhook_checkbox\">ᱵᱚᱫᱚᱞ ᱢᱮ (ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ)</string>\n    <string name=\"skip_silence_checkbox\">ᱥᱤᱛᱩᱝ ᱚᱠᱛᱚ ᱨᱮ ᱯᱷᱮᱥᱯᱷᱚᱨᱰ ᱢᱮ</string>\n    <string name=\"percent\">ᱯᱨᱚ᱐ᱤᱥᱚᱫ</string>\n    <string name=\"accept\">ᱮᱠᱥᱮᱯᱴ</string>\n    <string name=\"enable_streams_notifications_title\">ᱱᱟᱣᱟ ᱥᱴᱨᱚᱢ ᱨᱮᱭᱟᱜ ᱠᱷᱚᱵᱚᱨ</string>\n    <string name=\"streams_notifications_interval_title\">ᱪᱟᱪᱞᱟᱣ ᱚᱵᱚᱥᱛᱟ</string>\n    <string name=\"manual_update_title\">ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"paused\">ᱛᱷᱟᱯᱚᱱ</string>\n    <string name=\"overwrite_unrelated_warning\">ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱟᱱᱟᱜ ᱢᱤᱫ ᱯᱷᱤᱞ ᱢᱮᱱᱟᱜᱼᱟ</string>\n    <string name=\"overwrite_finished_warning\">ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱟᱱ ᱢᱤᱫ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞ ᱢᱮᱱᱟᱜᱼᱟ</string>\n    <string name=\"error_ssl_exception\">ᱥᱤᱠᱷᱱᱟᱹᱛ ᱡᱚᱱᱚᱲᱟᱣ ᱵᱟᱭ ᱛᱮᱭᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"downloads_storage_ask_title\">ᱡᱟᱦᱟᱸ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮ</string>\n    <string name=\"new_seek_duration_toast\">ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱠᱛᱤᱭᱟᱜ ᱞᱟᱹᱠᱛᱤᱭᱟᱜ ᱞᱟᱹᱠᱛᱤᱭᱟᱜ ᱚᱠᱛᱚ %d ᱥᱮᱠᱮᱱᱰ ᱨᱮ ᱞᱟᱜᱟᱣ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"fragment_feed_title\">ᱪᱮᱫ ᱱᱟᱣᱟ</string>\n    <string name=\"selected_stream_external_player_not_supported\">ᱵᱟᱦᱨᱮ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹᱠᱚ ᱵᱟᱠᱚ ᱥᱚᱦᱚᱫ ᱟᱠᱟᱫ ᱪᱷᱟᱸᱪ</string>\n    <string name=\"no_audio_streams_available_for_external_players\">ᱵᱟᱦᱨᱮ ᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱚᱰᱤᱭᱚ ᱥᱴᱨᱤᱢ ᱵᱟᱭ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"audio_track_type_original\">ᱚᱥᱚᱞ</string>\n    <string name=\"songs\">ᱥᱮᱨᱮᱧ</string>\n    <string name=\"recent\">ᱱᱟᱣᱟ</string>\n    <string name=\"notification_actions_summary_android13\">ᱱᱚᱶᱟ ᱨᱮ ᱴᱟᱯ ᱠᱟᱛᱮ ᱞᱟᱛᱟᱨ ᱨᱮ ᱮᱢ ᱟᱠᱟᱱ ᱡᱚᱛᱚ ᱱᱤᱯᱷᱩᱴ ᱮᱠᱥᱚᱱ ᱥᱟᱯᱲᱟᱣ ᱢᱮ ᱾ ᱯᱩᱭᱞᱩ ᱯᱮᱭᱟ ᱠᱟᱹᱢᱤ (ᱯᱞᱮ/ᱯᱷᱟᱣᱩᱥ, ᱯᱩᱭᱞᱩ ᱟᱨ ᱛᱟᱭᱚᱢ) ᱫᱚ ᱥᱤᱥᱴᱚᱢ ᱦᱚᱛᱮᱛᱮ ᱥᱮᱴᱮᱨ ᱟᱠᱟᱱᱟ ᱟᱨ ᱱᱚᱣᱟ ᱠᱚ ᱟᱹᱨᱤᱪᱟᱹᱞᱤ ᱛᱮ ᱵᱟᱭ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾</string>\n    <string name=\"notification_colorize_summary\">ᱟᱱᱰᱨᱚᱭᱮᱰ ᱴᱷᱟᱹᱣᱠᱟᱹ ᱟᱠᱟᱱ ᱪᱤᱛᱟᱹᱨ ᱨᱮ ᱢᱩᱬ ᱪᱤᱛᱟᱹᱨ ᱞᱮᱠᱟᱛᱮ ᱱᱤᱯᱷᱩᱴ ᱪᱤᱛᱟᱹᱨ ᱨᱮᱱᱟᱜ ᱨᱚᱝ ᱵᱮᱱᱟᱣ ᱢᱮ (ᱱᱚᱶᱟ ᱡᱚᱛᱚ ᱰᱤᱵᱟᱤᱥ ᱨᱮ ᱵᱟᱝ ᱧᱟᱢᱚᱜᱼᱟ)</string>\n    <string name=\"popup_remember_size_pos_title\">ᱴᱟᱴᱠᱟ ᱜᱩᱱᱠᱚ ᱢᱚᱱᱮ ᱠᱟᱜ ᱢᱮ</string>\n    <string name=\"seek_duration_title\">ᱯᱷᱮᱥᱯᱷᱚᱨᱰ/ᱨᱟᱭᱣᱤᱞᱰ ᱥᱮᱪᱮᱛ ᱚᱠᱛᱚ</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ, ᱡᱩᱫᱤ ᱟᱢ ᱡᱟᱦᱟᱸᱭ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱ ᱵᱷᱤᱛᱨᱤ ᱵᱚᱫᱚᱞ ᱛᱮ ᱦᱮᱰᱥᱮᱴ ᱠᱚ ᱵᱮᱵᱷᱟᱨ ᱮᱫᱟ</string>\n    <string name=\"show_comments_title\">ᱴᱤᱯᱚᱬᱤ ᱠᱚ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"show_description_summary\">ᱵᱷᱤᱰᱤᱭᱳ ᱵᱟᱵᱚᱫᱽ ᱟᱨ ᱮᱴᱟᱜ ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱱᱚᱶᱟ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">ᱪᱤᱛᱟᱹᱨ ᱠᱮᱪ ᱵᱚᱫᱚᱞ</string>\n    <string name=\"metadata_cache_wipe_title\">ᱠᱟᱪᱷ ᱢᱮᱴᱟᱰᱮᱴᱟ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"metadata_cache_wipe_summary\">ᱥᱟᱱᱟᱢ ᱠᱮᱪ ᱟᱠᱟᱱ ᱣᱮᱵᱽ ᱯᱮᱡ ᱨᱮᱱᱟᱜ ᱰᱮᱴᱟ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"left_gesture_control_summary\">ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱥᱠᱨᱤᱱ ᱨᱮᱱᱟᱜ ᱪᱮᱛᱟᱱ ᱨᱮ ᱪᱤᱱᱦᱟᱹ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"volume\">ᱵᱷᱚᱞᱚᱢ</string>\n    <string name=\"none\">ᱡᱟᱦᱟᱱ ᱵᱟᱝ</string>\n    <string name=\"enable_search_history_title\">ᱛᱚᱨᱡᱚᱢᱟ ᱱᱟᱜᱟᱢ</string>\n    <string name=\"enable_search_history_summary\">ᱞᱚᱠᱟᱞ ᱞᱮᱠᱟᱛᱮ ᱥᱩᱪᱚᱱᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"enable_playback_state_lists_title\">ᱞᱤᱥᱴᱤ ᱨᱮ ᱯᱳᱡᱤᱥᱚᱱ</string>\n    <string name=\"enable_playback_state_lists_summary\">ᱞᱤᱥᱴᱤ ᱨᱮ ᱯᱞᱮᱼᱯᱷᱚᱞ ᱯᱳᱡᱤᱥᱚᱱ ᱤᱱᱰᱮᱠᱴᱚᱨ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"settings_category_clear_data_title\">ᱥᱟᱱᱛᱟᱲᱤ ᱚᱱᱚᱞ</string>\n    <string name=\"show_hold_to_append_title\">enqueue ᱴᱤᱯ ᱞᱟᱹᱜᱤᱫ ᱫᱚᱦᱚᱭ ᱢᱮ</string>\n    <string name=\"show_hold_to_append_summary\">Details: ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱨᱮ ᱯᱷᱚᱱ ᱥᱮ ᱯᱚᱯᱯᱟᱯ ᱵᱩᱛᱟᱹᱢ ᱞᱟᱜᱟᱣ ᱞᱮᱠᱷᱟᱱ ᱴᱤᱯ ᱮᱢ ᱢᱮ</string>\n    <string name=\"peertube_instance_url_help\">%s ᱨᱮ ᱟᱢᱟᱜ ᱞᱟᱹᱠᱛᱤ ᱠᱚ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"settings_category_history_title\">ᱱᱟᱜᱟᱢ ᱟᱨ ᱠᱷᱟᱪ</string>\n    <string name=\"settings_category_appearance_title\">ᱧᱮᱧᱮᱞ</string>\n    <string name=\"settings_category_debug_title\">ᱰᱤᱵᱩᱜ</string>\n    <string name=\"settings_category_player_notification_title\">ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱵᱟᱰᱟᱭ</string>\n    <string name=\"background_player_playing_toast\">ᱛᱷᱚᱠ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ</string>\n    <string name=\"restricted_video\">ᱱᱚᱶᱟ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱩᱢᱮᱨ ᱦᱟᱹᱴᱤᱧ ᱠᱟᱱᱟ._x000D_\n\\n_x000D_\n\\nᱡᱩᱫᱤ ᱟᱢ ᱱᱚᱶᱟ ᱧᱮᱞᱢᱮ ᱠᱷᱟᱱ ᱟᱢᱟᱜ ᱥᱤᱴᱤᱝ ᱨᱮ %1$s\\\" ᱚᱞ ᱢᱮ ᱾\\\"</string>\n    <string name=\"downloads\">ᱰᱟᱩᱱᱞᱚᱰ</string>\n    <string name=\"downloads_title\">ᱰᱟᱩᱱᱞᱚᱰ</string>\n    <string name=\"albums\">ᱟᱞᱵᱚᱢ</string>\n    <string name=\"artists\">ᱟᱨᱴᱤᱥᱴ ᱠᱚ</string>\n    <string name=\"disabled\">ᱵᱷᱮᱜᱟᱨ ᱦᱚᱲ</string>\n    <string name=\"clear\">ᱠᱞᱟᱨ</string>\n    <string name=\"notification_channel_description\">ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱨᱮᱱᱟᱜ ᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱱᱳᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ</string>\n    <string name=\"hash_channel_description\">ᱵᱷᱤᱰᱤᱭᱳ ᱦᱟᱥᱤᱝ ᱯᱨᱚᱜᱨᱮᱥ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱚᱵᱚᱨ</string>\n    <string name=\"streams_notification_channel_name\">ᱱᱟᱣᱟ ᱫᱟᱨᱮ ᱠᱚ</string>\n    <string name=\"streams_notification_channel_description\">ᱥᱮᱞᱮᱫ ᱞᱟᱹᱜᱤᱫ ᱱᱟᱣᱟ ᱥᱴᱨᱚᱢ ᱠᱚ ᱵᱟᱰᱟᱭ ᱦᱚᱪᱚ</string>\n    <string name=\"error_report_channel_description\">ᱵᱟᱹᱲᱤᱡ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱚᱵᱚᱨ ᱠᱚ</string>\n    <string name=\"unknown_content\">[ᱱᱚᱣᱟ ᱵᱟᱰᱟᱭᱚᱜ ᱠᱟᱱᱟ]</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA ᱠᱩᱠᱤ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA ᱠᱩᱠᱤ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"export_data_summary\">ᱮᱠᱥᱯᱳᱨᱴ ᱦᱤᱥᱛᱟ, ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ, ᱯᱞᱮ ᱞᱤᱥᱴ ᱟᱨ ᱥᱮᱴᱤᱝ</string>\n    <string name=\"clear_views_history_title\">ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ ᱱᱟᱜᱟᱢ</string>\n    <string name=\"clear_views_history_summary\">ᱠᱷᱮᱞ ᱟᱠᱟᱱ ᱥᱴᱨᱤᱢ ᱨᱮᱱᱟᱜ ᱱᱟᱜᱟᱢ ᱟᱨ ᱠᱷᱮᱞ ᱟᱠᱟᱱ ᱯᱳᱡᱤᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞᱟ</string>\n    <string name=\"delete_view_history_alert\">ᱥᱟᱱᱟᱢ ᱧᱮᱞ ᱱᱟᱜᱟᱢ ᱵᱚᱫᱚᱞ ᱢᱮ?</string>\n    <string name=\"watch_history_deleted\">ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ</string>\n    <string name=\"download_to_sdcard_error_title\">ᱵᱟᱦᱨᱮ ᱥᱴᱳᱨᱮᱡ ᱵᱟᱭ ᱧᱟᱢᱚᱜ</string>\n    <string name=\"search_history_deleted\">ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ ᱺ</string>\n    <string name=\"fast_mode\">ᱦᱟᱛᱟᱝ ᱢᱚᱰ</string>\n    <string name=\"main_tabs_position_title\">ᱢᱩᱬᱩᱛ ᱴᱮᱵᱽ ᱨᱮᱱᱟᱜ ᱴᱷᱟᱶ</string>\n    <string name=\"download_to_sdcard_error_message\">ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱦᱚᱪᱚ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱟ. ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱞᱚᱠᱮᱥᱚᱱ ᱨᱤᱥᱮᱴ ᱢᱮ ?</string>\n    <string name=\"could_not_load_thumbnails\">ᱡᱚᱛᱚ ᱪᱤᱛᱟᱹᱨ ᱠᱚ ᱞᱚᱰ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"parsing_error\">ᱣᱮᱵᱽᱥᱟᱭᱤᱴ ᱵᱟᱭ ᱯᱟᱨᱥ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ</string>\n    <string name=\"content_not_available\">ᱥᱟᱦᱴᱟ ᱵᱟᱹᱱᱩᱜ-ᱟ</string>\n    <string name=\"external_player_unsupported_link_type\">ᱵᱟᱦᱨᱮ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ ᱱᱚᱝᱠᱟᱱ ᱡᱚᱱᱚᱲ ᱠᱚ ᱵᱟᱠᱚ ᱥᱚᱦᱚᱫᱟ</string>\n    <string name=\"video_streams_empty\">ᱡᱟᱦᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"audio_streams_empty\">ᱚᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"error_report_notification_toast\">ᱢᱤᱫ ᱵᱷᱩᱞ ᱦᱩᱭ ᱞᱮᱱᱟ, ᱱᱤᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"error_report_open_issue_button_text\">GitHub ᱨᱮ ᱚᱱᱚᱞ</string>\n    <string name=\"error_snackbar_action\">ᱨᱤᱯᱚᱨᱴ</string>\n    <string name=\"info_labels\">What:\\nRequest:\\nContent Language:\\nContent ᱫᱤᱥᱚᱢ:\\nApp Language:\\nService:\\nGMT ᱚᱠᱛᱚ:\\nPackage:\\nVersion:\\nOS version:</string>\n    <string name=\"your_comment\">ᱟᱢᱟᱜ ᱯᱟᱹᱛᱭᱟᱹᱣ (ᱤᱝᱞᱤᱥ ᱛᱮ):</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">ᱚᱯᱞᱚᱰᱟᱨᱟᱜ ᱟᱵᱟᱛᱟᱨ ᱛᱷᱩᱱᱤᱠᱟ</string>\n    <string name=\"detail_likes_img_view_description\">ᱞᱟᱭᱠ</string>\n    <string name=\"search_no_results\">ᱡᱟᱦᱟᱱ ᱡᱤᱱᱤᱥ</string>\n    <string name=\"empty_list_subtitle\">ᱱᱚᱣᱟ ᱨᱮᱫᱚ ᱡᱟᱹᱥᱛᱤ ᱡᱟᱹᱥᱛᱤ ᱠᱨᱤᱠᱮᱴ ᱢᱮᱱᱟᱜᱼᱟ ᱾</string>\n    <string name=\"video\">ᱵᱷᱤᱰᱤᱭᱳ</string>\n    <string name=\"subscribers_count_not_available\">ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱞᱮᱠᱷᱟ ᱵᱟᱭ ᱦᱟᱹᱴᱤᱧ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"no_views\">ᱵᱟᱱᱩᱜ ᱧᱮᱞ</string>\n    <string name=\"no_videos\">ᱵᱷᱤᱰᱤᱭᱳ ᱵᱟᱹᱱᱩᱜᱼᱟ</string>\n    <string name=\"more_than_100_videos\">᱑᱐᱐+ ᱵᱷᱤᱰᱤᱭᱳ</string>\n    <string name=\"no_live_streams\">ᱡᱤᱣᱤ ᱥᱴᱨᱤᱢ ᱵᱟᱹᱱᱩᱜᱼᱟ</string>\n    <string name=\"checksum\">ᱪᱮᱠᱥᱢ</string>\n    <string name=\"dismiss\">ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"msg_wait\">ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱮᱛᱦᱚᱵ ᱢᱮ ᱾</string>\n    <string name=\"msg_copied\">ᱠᱞᱤᱯᱵᱳᱨᱰ ᱨᱮ ᱠᱚᱯᱤ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA ᱪᱟᱞᱟᱣ</string>\n    <string name=\"settings_file_replacement_character_title\">ᱵᱮᱱᱟᱣ ᱪᱤᱠᱤ</string>\n    <string name=\"settings_file_replacement_character_summary\">ᱵᱟᱹᱞᱤ ᱪᱤᱠᱤ ᱠᱚ ᱱᱚᱶᱟ ᱢᱟᱹᱱ ᱥᱟᱞᱟᱜ ᱛᱮ ᱵᱚᱫᱚᱞᱚᱜᱼᱟ</string>\n    <string name=\"charset_letters_and_digits\">ᱚᱞ ᱟᱨ ᱮᱞ</string>\n    <string name=\"charset_most_special_characters\">ᱡᱟᱹᱥᱛᱤ ᱵᱤᱥᱮᱥ ᱪᱤᱠᱤ</string>\n    <string name=\"no_valid_zip_file\">ᱪᱟᱹᱞᱩ ZIP ᱯᱷᱤᱞ ᱫᱚ ᱵᱟᱝ</string>\n    <string name=\"could_not_import_all_files\">ᱞᱟᱹᱱᱟᱹᱤ: ᱡᱚᱛᱚ ᱪᱤᱱᱦᱟᱹ ᱠᱚ ᱤᱱᱯᱷᱚᱨᱢ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ.</string>\n    <string name=\"override_current_data\">ᱱᱚᱶᱟ ᱫᱚ ᱟᱢᱟᱜ ᱱᱮᱛᱟᱨᱟᱜ ᱥᱮᱴᱯᱟᱴ ᱩᱫᱩᱜ ᱮᱫᱟ ᱾</string>\n    <string name=\"import_settings\">ᱟᱢ ᱥᱤᱴᱤᱝ ᱦᱚᱸ ᱟᱢᱯᱷᱮᱨᱟᱣ ᱦᱩᱭᱩᱜ ᱛᱟᱢᱟ?</string>\n    <string name=\"error_unable_to_load_comments\">ᱠᱚᱢᱮᱱᱴ ᱞᱚᱰ ᱫᱚ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"top_50\">ᱢᱩᱬ ᱕᱐</string>\n    <string name=\"conferences\">ᱠᱚᱱᱯᱷᱮᱨᱮᱱᱥ</string>\n    <string name=\"title_activity_play_queue\">ᱠᱷᱮᱞ ᱞᱟᱦᱟ</string>\n    <string name=\"play_queue_remove\">ᱥᱟᱦᱟᱣ ᱢᱮ</string>\n    <string name=\"play_queue_stream_detail\">ᱡᱚᱠᱷᱟ</string>\n    <string name=\"audio_track\">ᱚᱰᱤᱭᱳ ᱴᱨᱟᱠ</string>\n    <string name=\"hold_to_append\">ᱥᱮᱞᱮᱫᱚᱜ ᱞᱟᱹᱜᱤᱫ ᱫᱚᱦᱚᱭ ᱢᱮ</string>\n    <string name=\"enqueue_next_stream\">ᱛᱟᱭᱚᱢ ᱛᱮ Enqueue</string>\n    <string name=\"enqueued_next\">ᱛᱟᱭᱚᱢ ᱛᱮ ᱥᱮᱞᱮᱫ ᱢᱮ</string>\n    <string name=\"drawer_open\">ᱚᱯᱮᱱ ᱰᱨᱟᱵᱷᱤᱴ</string>\n    <string name=\"preferred_open_action_settings_title\">ᱵᱟᱹᱲᱛᱤ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ \\\"ᱚᱯᱮᱱ\\\" ᱠᱟᱹᱢᱤ</string>\n    <string name=\"preferred_open_action_settings_summary\">⁇ %s ᱡᱚᱠᱷᱚᱱ ᱥᱟᱦᱴᱟ ᱵᱚᱫᱚᱞᱚᱜ-ᱟ</string>\n    <string name=\"video_player\">ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱟᱨ</string>\n    <string name=\"background_player\">ᱯᱟᱛᱷᱟᱢ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ</string>\n    <string name=\"popup_player\">ᱯᱚᱯᱯᱟᱯ ᱯᱞᱮᱭᱟᱨ</string>\n    <string name=\"duplicate_in_playlist\">ᱥᱟᱨᱮᱡ ᱟᱠᱟᱱ ᱯᱞᱮ ᱞᱤᱥᱴᱤ ᱨᱮ ᱱᱤᱛᱚᱜ ᱱᱚᱣᱟ ᱡᱤᱱᱤᱥ ᱢᱮᱱᱟᱜᱼᱟ ᱾</string>\n    <string name=\"rename_playlist\">ᱧᱩᱛᱩᱢ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"unmute\">Unmute</string>\n    <string name=\"unset_playlist_thumbnail\">ᱵᱟᱝ ᱥᱮᱴᱮᱨ ᱟᱠᱟᱱ ᱟᱹᱪᱩᱨ ᱦᱟᱹᱴᱤᱧ</string>\n    <string name=\"playlist_add_stream_success\">ᱯᱮᱭᱞᱤᱥᱴ</string>\n    <string name=\"playlist_add_stream_success_duplicate\">%d ᱚᱠᱛᱚ ᱵᱟᱨᱟᱵᱟᱨᱤ ᱥᱮᱞᱮᱫᱚᱜᱼᱟ</string>\n    <string name=\"playlist_creation_success\">ᱪᱤᱛᱟᱹᱨ ᱵᱮᱱᱟᱣ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"playlist_thumbnail_change_success\">ᱥᱮᱨᱮᱧ ᱞᱤᱥᱴᱤ ᱨᱮᱱᱟᱜ ᱛᱷᱤᱢᱵᱽᱱᱟᱭᱟᱨ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ.</string>\n    <string name=\"playlist_no_uploader\">ᱚᱴᱚ-ᱡᱮᱱᱮᱨᱮᱴ (ᱯᱷᱮᱰᱟᱛ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ)</string>\n    <string name=\"caption_none\">ᱚᱞ ᱪᱤᱠᱤ ᱵᱟᱹᱱᱩᱜ</string>\n    <string name=\"resize_fit\">ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ</string>\n    <string name=\"resize_fill\">ᱯᱷᱤᱞᱰ</string>\n    <string name=\"resize_zoom\">ᱡᱩᱢ</string>\n    <string name=\"caption_setting_description\">ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱜ ᱪᱷᱟᱸᱪ ᱚᱞ ᱨᱮᱱᱟᱜ ᱟᱥᱚᱞ ᱟᱨ ᱯᱟᱛᱷᱟᱢ ᱥᱴᱟᱭᱤᱞᱥ ᱵᱚᱫᱚᱞ ᱢᱮ. ᱪᱟᱹᱞᱩᱜ ᱞᱟᱹᱜᱤᱫ ᱮᱯ ᱮᱥᱴᱟᱨᱴ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ</string>\n    <string name=\"show_memory_leaks\">ᱢᱮᱢᱚᱨᱤ ᱞᱤᱠᱟᱞ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"leak_canary_not_available\">LeakCanary ᱵᱟᱭ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"enable_leak_canary_summary\">ᱢᱮᱢᱚᱨᱤ ᱞᱤᱠᱟᱞ ᱢᱚᱱᱤᱴᱚᱨᱤᱝ ᱦᱤᱯ ᱰᱟᱢᱯᱤᱝ ᱚᱠᱛᱚ ᱨᱮ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱨᱟᱥᱴᱨᱤᱭ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ</string>\n    <string name=\"enable_disposed_exceptions_title\">ᱡᱤᱭᱚᱱ ᱪᱤᱠᱤ ᱠᱷᱚᱱ ᱵᱟᱦᱨᱮ ᱨᱮ ᱵᱷᱮᱜᱟᱨ ᱠᱚ ᱚᱱᱚᱞ ᱢᱮ</string>\n    <string name=\"show_crash_the_player_summary\">ᱯᱞᱮᱭᱟᱨ ᱵᱮᱵᱷᱟᱨ ᱚᱠᱛᱮ ᱨᱮ ᱠᱨᱟᱥ ᱚᱯᱥᱚᱱ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"import_title\">ᱤᱢᱯᱳᱨᱴ</string>\n    <string name=\"import_from\">ᱤᱢᱯᱚᱨᱴ</string>\n    <string name=\"export_to\">ᱮᱥᱯᱳᱨᱴ ᱢᱮ</string>\n    <string name=\"import_ongoing\">ᱤᱢᱯᱳᱨᱴ…</string>\n    <string name=\"export_ongoing\">ᱮᱠᱥᱯᱳᱨᱴ…</string>\n    <string name=\"import_file_title\">ᱤᱢᱯᱳᱨᱴ ᱯᱷᱤᱞ</string>\n    <string name=\"previous_export\">ᱢᱟᱲᱟᱝ ᱮᱠᱥᱯᱚᱨᱴ</string>\n    <string name=\"subscriptions_import_unsuccessful\">ᱥᱚᱵᱥᱠᱨᱤᱯᱥᱚᱱ ᱮᱢ ᱫᱟᱲᱮᱭᱟᱜ ᱵᱟᱝ ᱠᱟᱱᱟ</string>\n    <string name=\"import_network_expensive_warning\">\\\"ᱱᱚᱶᱟ ᱚᱯᱨᱮᱥᱚᱱ ᱨᱮ ᱱᱮᱴᱣᱟᱨᱠ ᱰᱷᱮᱨ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱢᱮᱱᱛᱮ ᱢᱟᱱᱟᱣ ᱢᱮ ᱾\\\"\n\\n\n\\nᱟᱢ ᱫᱚ ᱪᱮᱫ ᱮᱢ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ?\\\"</string>\n    <string name=\"playback_reset\">ᱨᱤᱥᱮᱴ</string>\n    <string name=\"semitone\">ᱥᱮᱢᱤᱴᱚᱱ</string>\n    <string name=\"decline\">ᱰᱷᱮᱨᱚᱜ</string>\n    <string name=\"limit_data_usage_none_description\">ᱞᱤᱢᱤᱴ ᱵᱟᱹᱱᱩᱜ</string>\n    <string name=\"limit_mobile_data_usage_title\">ᱢᱚᱵᱟᱤᱞ ᱰᱟᱴᱟ ᱵᱮᱵᱷᱟᱨ ᱚᱠᱛᱚ ᱨᱮ ᱞᱤᱢᱤᱴ ᱫᱟᱲᱮ</string>\n    <string name=\"manual_update_description\">ᱱᱟᱣᱟ ᱵᱷᱮᱨᱥᱚᱱ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱢᱟᱱᱩᱣᱟᱞ ᱪᱮᱠ</string>\n    <string name=\"minimize_on_exit_title\">ᱟᱯᱞᱤᱠᱮᱥᱚᱱ ᱥᱤᱴᱤᱪ ᱨᱮ ᱞᱟᱹᱴᱩ ᱦᱚᱪᱚ</string>\n    <string name=\"minimize_on_exit_summary\">ᱢᱩᱬᱩᱛ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱟᱨ ᱠᱷᱚᱱ ᱮᱴᱟᱜ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱚᱠᱛᱚ ᱨᱮᱱᱟᱜ ᱠᱟᱹᱢᱤ ⁇ %s</string>\n    <string name=\"minimize_on_exit_none_description\">ᱡᱟᱦᱟᱱ ᱵᱟᱝ</string>\n    <string name=\"minimize_on_exit_background_description\">ᱚᱛᱱᱚ ᱯᱞᱮᱭᱟᱨ ᱨᱮ ᱞᱟᱹᱴᱩ ᱦᱚᱪᱚ</string>\n    <string name=\"wifi_only\">Wi-Fi ᱨᱮᱜᱮ</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Seekbar thumbnail preview ᱧᱮᱞᱢᱮ</string>\n    <string name=\"low_quality_smaller\">ᱠᱚᱢ ᱠᱣᱟᱞᱤᱴᱤ (ᱢᱤᱫ ᱠᱷᱚᱱ ᱠᱚᱢ)</string>\n    <string name=\"dont_show\">ᱵᱟᱝ ᱧᱮᱞᱚᱜ</string>\n    <string name=\"app_update_unavailable_toast\">ᱟᱢ NewPipe ᱨᱮᱭᱟᱜ ᱱᱟᱣᱟ ᱵᱟᱨᱥᱚᱱ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"missions_header_pending\">ᱯᱮᱱᱰᱤᱝ</string>\n    <string name=\"queued\">ᱠᱩᱠᱞᱤ</string>\n    <string name=\"post_processing\">ᱯᱟᱥᱴᱟ ᱯᱨᱚᱥᱟᱥᱚᱱ</string>\n    <string name=\"enqueue\">ᱤᱱᱠᱭᱩᱤᱝ</string>\n    <string name=\"permission_denied\">ᱥᱤᱥᱴᱮᱢ ᱦᱚᱛᱮᱛᱮ ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱ ᱠᱟᱹᱢᱤ</string>\n    <string name=\"overwrite_failed\">ᱯᱷᱟᱹᱞ ᱪᱮᱛᱟᱱ ᱵᱟᱝ ᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ</string>\n    <string name=\"download_already_running\">ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱛᱮ ᱢᱤᱫ ᱰᱟᱩᱱᱞᱚᱰ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"download_already_pending\">ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱛᱮ ᱢᱤᱫ ᱚᱞᱚᱜ ᱠᱟᱱ ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮᱱᱟᱜᱼᱟ</string>\n    <string name=\"error_path_creation\">ᱴᱷᱟᱶ ᱯᱷᱳᱞᱰᱚᱨ ᱛᱮᱭᱟᱨ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ</string>\n    <string name=\"error_download_resource_gone\">ᱱᱚᱶᱟ ᱰᱟᱩᱱᱞᱚᱰ ᱫᱚ ᱵᱟᱭ ᱨᱤᱠᱳᱨᱰ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"clear_download_history\">ᱰᱟᱩᱱᱞᱚᱰ ᱦᱤᱥᱛᱟ ᱪᱷᱟᱯᱟ ᱢᱮ</string>\n    <string name=\"max_retry_msg\">ᱟᱹᱰᱤ ᱡᱟᱹᱥᱛᱤ ᱫᱟᱲᱮ</string>\n    <string name=\"pause_downloads_on_mobile\">ᱢᱤᱴᱟᱨ ᱛᱮᱭᱟᱨ ᱟᱠᱟᱱ ᱱᱮᱴᱣᱟᱨᱠ ᱨᱮ ᱵᱚᱫᱚᱞ</string>\n    <string name=\"start_downloads\">ᱰᱟᱩᱱᱞᱚᱰ ᱮᱦᱚᱵ ᱢᱮ</string>\n    <string name=\"remove_watched\">ᱧᱮᱞᱚᱜ ᱟᱠᱟᱱ ᱥᱟᱯᱲᱟᱣ ᱢᱮ</string>\n    <string name=\"remove_watched_popup_title\">ᱧᱮᱞ ᱟᱠᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱪᱷᱩᱴᱟᱹᱣ?</string>\n    <string name=\"remove_duplicates\">ᱫᱩᱯᱞᱟᱹᱲ ᱠᱚ ᱦᱮᱡ ᱢᱮ</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">ᱭ, ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱡᱟᱦᱟᱸ ᱞᱮᱠᱟ ᱧᱮᱞᱚᱜᱼᱟ</string>\n    <string name=\"feed_groups_header_title\">ᱪᱟᱱᱮᱞ ᱜᱨᱩᱯ</string>\n    <string name=\"feed_oldest_subscription_update\">ᱯᱷᱤᱰ ᱢᱩᱪᱟᱹᱫ ᱵᱚᱫᱚᱞᱟᱠᱟᱱ: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">ᱵᱟᱝ ᱞᱚᱰ ᱟᱠᱟᱱᱟ: %d</string>\n    <string name=\"feed_notification_loading\">ᱯᱷᱤᱰ ᱞᱚᱰᱚᱜ ᱠᱟᱱᱟ…</string>\n    <string name=\"feed_processing_message\">ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱡᱚᱢᱟᱜ…</string>\n    <string name=\"feed_group_dialog_empty_name\">ᱜᱩᱴ ᱧᱩᱛᱩᱢ ᱵᱟᱱᱩᱜᱼᱟ</string>\n    <string name=\"feed_group_dialog_delete_message\">ᱟᱢ ᱱᱚᱶᱟ ᱜᱽᱨᱩᱯ ᱵᱚᱫᱚᱞ ᱢᱮᱢᱮ?</string>\n    <string name=\"feed_create_new_group_button_title\">ᱱᱟᱣᱟ</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">ᱦᱟᱹᱴᱤᱧ ᱢᱚᱰ ᱨᱮ ᱥᱮᱞᱮᱫ ᱢᱮ</string>\n    <string name=\"feed_hide_streams_title\">ᱞᱟᱛᱟᱨ ᱨᱮ ᱚᱞ ᱟᱠᱟᱱ ᱥᱴᱨᱤᱢ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"feed_fetch_channel_tabs\">ᱪᱟᱱᱮᱞ ᱛᱟᱵᱽ ᱠᱚ ᱦᱟᱛᱟᱣ</string>\n    <string name=\"channel_created_by\">%s ᱛᱮᱭᱟᱨ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"video_detail_by\">%s ᱦᱚᱛᱮᱛᱮ</string>\n    <string name=\"show_thumbnail_title\">ᱛᱟᱢᱤᱞ ᱪᱤᱛᱟᱹᱨ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"chapters\">ᱪᱮᱯᱴᱟᱨᱥ</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ ᱟᱢ ᱢᱤᱫ ᱯᱷᱤᱞ ᱢᱟᱱᱮᱡᱚᱨ ᱤᱱᱥᱴᱚᱞ ᱢᱮ ᱟᱨᱵᱟᱝ ᱰᱟᱩᱱᱞᱚᱰ ᱥᱤᱴᱤᱝ ᱨᱮ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱯᱨᱚᱵᱷᱟᱣ ᱢᱮ\\\"</string>\n    <string name=\"youtube_music_premium_content\">ᱱᱚᱶᱟ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱣᱡᱤᱠ ᱯᱨᱤᱢᱤᱭᱟᱢ ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱜᱮ ᱧᱟᱢᱚᱜᱼᱟ, ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱫᱚ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱦᱚᱛᱮᱛᱮ ᱵᱟᱝ ᱥᱴᱨᱤᱢ ᱟᱨ ᱵᱟᱝ ᱰᱟᱩᱱᱞᱳᱰ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾</string>\n    <string name=\"auto_device_theme_title\">ᱚᱴᱚᱢᱟᱴᱤᱠ (ᱰᱤᱵᱟᱤᱥ ᱛᱷᱮᱢ)</string>\n    <string name=\"night_theme_summary\">ᱟᱢᱟᱜ ᱯᱩᱭᱞᱩ ᱧᱤᱫᱟᱹ ᱛᱷᱤᱢ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ⁇ %s</string>\n    <string name=\"select_night_theme_toast\">ᱟᱢ ᱞᱟᱛᱟᱨ ᱨᱮ ᱟᱢᱟᱜ ᱧᱤᱫᱟᱹ ᱪᱮᱛᱟᱱ ᱵᱟᱪᱷᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱟ</string>\n    <string name=\"description_select_disable\">ᱪᱤᱛᱟᱹᱨ ᱨᱮ ᱚᱞ ᱪᱤᱠᱤ ᱵᱟᱪᱷᱟᱣ ᱫᱚᱦᱚᱭ ᱢᱮ</string>\n    <string name=\"metadata_category\">ᱛᱷᱚᱠ</string>\n    <string name=\"metadata_licence\">ᱞᱟᱭᱥᱮᱱᱥ</string>\n    <string name=\"metadata_avatars\">ᱟᱵᱟᱛᱟᱨ</string>\n    <string name=\"metadata_banners\">ᱵᱮᱱᱚᱨ</string>\n    <string name=\"metadata_privacy_unlisted\">ᱵᱟᱝ ᱞᱤᱥᱴᱤ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"notifications_disabled\">ᱱᱤᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"you_successfully_subscribed\">ᱟᱢ ᱱᱤᱛᱚᱜ ᱱᱚᱣᱟ ᱪᱮᱱᱮᱞ ᱨᱮ ᱥᱮᱞᱮᱫ ᱟᱠᱟᱱᱟᱢ</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"select_audio_track_external_players\">ᱵᱟᱦᱨᱮ ᱯᱞᱮᱭᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱚᱰᱤᱭᱚ ᱴᱨᱟᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"unknown_quality\">ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱧᱟᱢ ᱟᱠᱟᱱ ᱥᱤᱠᱷᱱᱟᱹᱛ</string>\n    <string name=\"unknown_audio_track\">ᱵᱟᱝ ᱵᱟᱰᱟᱭ</string>\n    <string name=\"feed_show_watched\">ᱡᱚᱛᱚ ᱛᱮ ᱧᱮᱞᱚᱜᱼᱟ</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">ExoPlayer ᱨᱮᱭᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱟᱯᱩᱴ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱥᱤᱴᱤᱝ ᱣᱟᱨᱠᱟᱨᱚᱸᱜ ᱵᱮᱵᱷᱟᱨ ᱢᱮ</string>\n    <string name=\"channel_tab_videos\">ᱵᱷᱤᱰᱤᱭᱳ</string>\n    <string name=\"channel_tab_tracks\">ᱴᱨᱮᱠ</string>\n    <string name=\"channel_tab_shorts\">ᱥᱟᱨᱴᱥ</string>\n    <string name=\"channel_tab_livestreams\">ᱡᱤᱣᱤ</string>\n    <string name=\"channel_tab_channels\">ᱪᱟᱱᱮᱞ</string>\n    <string name=\"channel_tab_playlists\">ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ</string>\n    <string name=\"channel_tab_albums\">ᱟᱞᱵᱚᱢ</string>\n    <string name=\"channel_tab_about\">ᱤᱫᱤ ᱠᱟᱛᱮ</string>\n    <string name=\"show_channel_tabs\">ᱪᱟᱱᱮᱞ ᱛᱟᱵᱽ</string>\n    <string name=\"toggle_screen_orientation\">ᱥᱠᱨᱤᱱ ᱴᱳᱜᱞ ᱳᱭᱨᱮᱱᱟᱥᱚᱱ</string>\n    <string name=\"previous_stream\">ᱢᱟᱲᱟᱝ ᱥᱴᱨᱤᱢ</string>\n    <string name=\"forward\">ᱯᱷᱚᱨᱣᱟᱨᱰ</string>\n    <string name=\"image_quality_title\">ᱪᱤᱛᱟᱹᱨ ᱥᱤᱠᱷᱱᱟᱹᱛ</string>\n    <string name=\"image_quality_none\">ᱪᱤᱛᱟᱹᱨ ᱵᱟᱝ ᱞᱚᱰ ᱢᱮ</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist\">ᱥᱮᱨᱮᱧ ᱛᱟᱹᱞᱠᱟᱹ ᱮᱢ</string>\n    <string name=\"share_playlist_with_titles\">ᱧᱩᱛᱩᱢ ᱥᱟᱶ ᱮᱱᱮᱢ ᱢᱮ</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_more\">ᱟᱨᱦᱚᱸ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"show_less\">ᱠᱚᱢ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"clear_queue_confirmation_title\">ᱛᱟᱹᱞᱠᱟᱹ ᱪᱟᱪᱞᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱮᱢ ᱢᱮ</string>\n    <string name=\"clear_queue_confirmation_summary\">ᱢᱤᱫ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟ. ᱠᱷᱚᱱ ᱮᱴᱟᱜ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟ. ᱛᱮ ᱵᱚᱫᱚᱞ ᱠᱟᱛᱮᱜ ᱟᱢᱟᱜ ᱠᱩᱠᱞᱤ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ</string>\n    <string name=\"clear_queue_confirmation_description\">ᱮᱠᱴᱤᱵᱽ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱩᱠᱞᱤ ᱫᱚ ᱵᱚᱫᱚᱞᱚᱜ-ᱟ</string>\n    <string name=\"show_description_title\">ᱞᱟᱹᱱᱟᱹᱤ ᱠᱚ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"restore_defaults\">ᱰᱤᱯᱷᱚᱞᱴ ᱠᱚ ᱨᱤᱯᱚᱴ ᱢᱮ</string>\n    <string name=\"progressive_load_interval_title\">ᱯᱞᱮᱵᱮᱠ ᱞᱚᱰ ᱤᱱᱴᱟᱨᱵᱷᱮᱞ ᱨᱮᱱᱟᱜ ᱢᱟᱨᱟᱝ</string>\n    <string name=\"local\">ᱞᱚᱠᱟᱞ</string>\n    <string name=\"account_terminated\">ᱮᱠᱟᱩᱱᱴ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"get_notified\">ᱵᱟᱰᱟᱭ ᱢᱮ</string>\n    <string name=\"ignore_hardware_media_buttons_title\">ᱦᱟᱨᱰᱣᱮᱭᱟᱨ ᱢᱤᱰᱤᱭᱟ ᱵᱩᱴᱚᱱ ᱦᱮᱯᱨᱟᱣ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"downloads_storage_use_saf_title\">System folder picker (SAF) ᱵᱮᱵᱷᱟᱨ ᱢᱮ</string>\n    <string name=\"default_video_format_title\">ᱰᱤᱯᱷᱚᱞᱴ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱷᱚᱨᱢᱮᱴ</string>\n    <string name=\"popup_remember_size_pos_summary\">ᱯᱚᱯ-ᱟᱯ ᱨᱮᱱᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱢᱟᱨᱟᱝ ᱟᱨ ᱴᱷᱟᱶ ᱫᱚᱦᱚᱭ ᱢᱮ</string>\n    <string name=\"use_inexact_seek_title\">ᱦᱩᱰᱤᱧ ᱵᱟᱹᱱᱩᱜ-ᱟ ᱞᱟᱦᱟᱱᱛᱤ ᱵᱮᱵᱷᱟᱨ</string>\n    <string name=\"use_inexact_seek_summary\">ᱵᱟᱝ ᱥᱟᱹᱨᱤ ᱧᱮᱞ ᱠᱷᱟᱱ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱫᱚ ᱵᱟᱹᱲᱛᱤ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ ᱥᱟᱶ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ ᱠᱚ ᱵᱟᱰᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ ᱕, ᱑᱕ ᱟᱨ ᱒᱕ ᱥᱮᱠᱮᱱᱰ ᱞᱟᱹᱜᱤᱫ ᱧᱮᱞᱚᱜᱼᱟ ᱱᱚᱶᱟ ᱥᱟᱶ ᱵᱟᱝ ᱠᱟᱹᱢᱤᱭᱟ</string>\n    <string name=\"show_comments_summary\">ᱮᱱᱮᱢ ᱠᱚ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱱᱚᱶᱟ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"show_next_and_similar_title\">\\'Next\\' ᱟᱨ \\'Similar\\' ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"show_meta_info_title\">ᱢᱮᱴᱟ ᱴᱷᱟᱶ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"show_meta_info_summary\">ᱥᱴᱨᱤᱢ ᱵᱮᱱᱟᱣᱤᱭᱟᱹ, ᱥᱴᱨᱤᱢ ᱟᱹᱛᱩ ᱟᱨᱵᱟᱝ ᱥᱟᱨᱪ ᱞᱟᱹᱠᱛᱤ ᱵᱟᱵᱚᱛ ᱟᱨᱦᱚᱸ ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱢᱮᱴᱟ ᱤᱱᱯᱷᱳ ᱵᱚᱠᱥ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"auto_queue_title\">ᱱᱮᱛᱟᱨᱟᱜ ᱥᱴᱨᱤᱢ ᱨᱮ ᱚᱴᱚᱼᱠᱤᱣ</string>\n    <string name=\"auto_queue_summary\">ᱡᱚᱲᱟᱣ ᱟᱠᱟᱱ ᱥᱴᱨᱤᱢ ᱥᱮᱞᱮᱫ ᱠᱟᱛᱮ ᱪᱟᱪᱞᱟᱣ ᱪᱮᱛᱟᱱ (ᱱᱚᱱ-ᱨᱩᱯᱨᱤᱭᱩᱴᱤᱝ) ᱯᱞᱮᱼᱵᱷᱤᱠ ᱪᱮᱛᱟᱱ ᱪᱟᱪᱞᱟᱣ ᱢᱮ</string>\n    <string name=\"prefer_original_audio_summary\">ᱯᱟᱹᱨᱥᱤ ᱵᱟᱝ ᱧᱮᱞ ᱠᱟᱛᱮᱜ ᱚᱨᱡᱤᱱᱤᱭᱟᱞ ᱚᱰᱤᱭᱚ ᱴᱨᱟᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"prefer_descriptive_audio_title\">ᱰᱤᱥᱠᱨᱤᱯᱴᱤᱵᱷ ᱚᱰᱤᱭᱚ ᱵᱟᱹᱲᱛᱤ</string>\n    <string name=\"auto_queue_toggle\">ᱚᱴᱚ-ᱮᱱᱠᱭᱩᱤᱝ</string>\n    <string name=\"prefer_descriptive_audio_summary\">ᱡᱩᱫᱤ ᱢᱮᱱᱟᱜ ᱟ ᱡᱩᱫᱤ ᱧᱮᱞ ᱵᱟᱹᱲᱤᱡ ᱦᱚᱲ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱚᱰᱤᱭᱚ ᱴᱨᱟᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">ᱢᱮᱴᱟᱰᱮᱴᱟ ᱠᱮᱪ ᱵᱚᱫᱚᱞ</string>\n    <string name=\"left_gesture_control_title\">ᱞᱤᱣᱮᱴ ᱡᱮᱥᱴ ᱮᱠᱥᱚᱱ</string>\n    <string name=\"right_gesture_control_summary\">ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱥᱠᱨᱤᱱ ᱨᱮᱱᱟᱜ ᱪᱮᱛᱟᱱ ᱨᱮ ᱪᱤᱱᱦᱟᱹ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"right_gesture_control_title\">ᱞᱟᱹᱭ ᱪᱤᱠᱤ ᱠᱟᱹᱢᱤ</string>\n    <string name=\"start_main_player_fullscreen_summary\">ᱢᱤᱱᱤ ᱯᱞᱮᱭᱟᱨ ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱮᱛᱚᱦᱚᱵ ᱵᱟᱝ ᱢᱮ, ᱡᱩᱫᱤ ᱚᱴᱚᱯᱷᱤ ᱨᱚᱴᱮᱴ ᱞᱚᱠ ᱟᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ ᱥᱟᱹᱛ ᱥᱠᱨᱤᱱ ᱨᱮ ᱵᱚᱫᱚᱞ ᱢᱮ ᱾ ᱟᱢ ᱢᱤᱱᱤ ᱯᱞᱮᱭᱟᱨ ᱪᱷᱟᱰᱟ ᱠᱟᱛᱮᱜ ᱦᱚᱸ ᱥᱮᱞᱮᱫ ᱫᱟᱲᱮᱭᱟᱜ ᱟ</string>\n    <string name=\"autoplay_title\">ᱚᱴᱚᱯᱷᱟᱭ</string>\n    <string name=\"unsupported_url\">ᱵᱟᱝ ᱥᱚᱦᱚᱫ ᱟᱠᱟᱱ URL</string>\n    <string name=\"unsupported_url_dialog_message\">URL ᱵᱟᱭ ᱧᱟᱢ ᱫᱟᱲᱮᱭᱟᱫᱼᱟ. ᱮᱴᱟᱜ ᱟᱯᱞᱤᱠᱮᱥᱚᱱ ᱛᱮ ᱮᱛᱚᱦᱚᱵ ᱢᱮ?</string>\n    <string name=\"brightness\">ᱡᱤᱞᱤᱧ</string>\n    <string name=\"show_search_suggestions_title\">ᱛᱚᱨᱡᱚᱢᱟ ᱥᱟᱯᱲᱟᱣ</string>\n    <string name=\"show_search_suggestions_summary\">ᱧᱮᱞ ᱛᱟᱵᱩᱱ ᱯᱮ ᱺ</string>\n    <string name=\"remote_search_suggestions\">ᱨᱮᱢᱳᱴ ᱥᱟᱨᱪ ᱥᱩᱯᱨᱮᱥ</string>\n    <string name=\"enable_watch_history_summary\">ᱧᱮᱞ ᱟᱠᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱚ ᱪᱮᱛᱟᱱ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">ᱡᱟᱦᱟᱱᱟᱜ ᱵᱚᱫᱚᱞ ᱛᱟᱭᱚᱢ ᱠᱷᱮᱞ ᱫᱚᱦᱚᱭ ᱢᱮ (ᱡᱮᱞᱮᱠᱟ: ᱯᱷᱚᱱ ᱠᱚᱞ)</string>\n    <string name=\"download_dialog_title\">ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮ</string>\n    <string name=\"start_main_player_fullscreen_title\">ᱢᱩᱬᱩᱛ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱡᱚᱛᱚ ᱪᱤᱛᱟᱹᱨ ᱨᱮ ᱮᱛᱚᱦᱚᱵ ᱢᱮ</string>\n    <string name=\"content_language_title\">ᱰᱤᱯᱷᱚᱞᱴ ᱠᱚᱱᱴᱮᱱᱴ ᱯᱟᱹᱨᱥᱤ</string>\n    <string name=\"peertube_instance_url_title\">PeerTube ᱚᱞ ᱠᱚ</string>\n    <string name=\"peertube_instance_url_summary\">ᱟᱢᱟᱜ ᱧᱩᱛᱩᱢᱟᱱ PeerTube ᱵᱷᱤᱛᱨᱤ ᱠᱚ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"peertube_instance_add_fail\">ᱞᱟᱹᱱᱟᱹᱤ ᱫᱚᱦᱚ ᱫᱟᱲᱮᱭᱟᱜ ᱵᱟᱝ</string>\n    <string name=\"settings_category_video_audio_title\">ᱵᱷᱤᱰᱤᱭᱳ ᱟᱨ ᱚᱰᱤᱭᱳ</string>\n    <string name=\"peertube_instance_add_https_only\">HTTPS URL ᱠᱚ ᱜᱮ ᱥᱚᱯᱷᱴᱣᱮᱨ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"peertube_instance_add_exists\">ᱤᱱᱥᱴᱮᱱᱥ ᱫᱚ ᱟᱞᱮ ᱢᱮᱱᱟᱜᱼᱟ</string>\n    <string name=\"settings_category_player_behavior_title\">ᱟᱹᱱᱟᱹᱨᱤ</string>\n    <string name=\"settings_category_player_notification_summary\">ᱚᱛᱱᱚᱜ ᱪᱤᱛᱟᱹᱨ ᱠᱷᱚᱸᱫᱽᱨᱚᱸᱫᱽ ᱥᱟᱯᱲᱟᱣ</string>\n    <string name=\"show_age_restricted_content_summary\">ᱜᱤᱫᱨᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱠᱟᱛᱷᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ ᱪᱮᱫᱟᱜ ᱥᱮ ᱱᱚᱣᱟ ᱨᱮ ᱢᱤᱫ ᱩᱢᱮᱨ ᱞᱤᱢᱤᱴ ᱢᱮᱱᱟᱜᱼᱟ (ᱡᱮᱞᱮᱠᱟ ᱑᱘+)</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱫ \\\"Restricted Mode\\\" ᱮᱢᱚᱜᱼᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱯᱚᱴᱮᱱᱥᱤᱭᱟᱞ ᱢᱚᱰᱩᱞ ᱠᱚᱱᱴᱮᱱᱴ (mature content) ᱫᱚᱦᱚᱭᱟ</string>\n    <string name=\"restricted_video_no_stream\">ᱱᱤᱭᱟᱹ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱩᱢᱚᱨ ᱞᱟᱹᱜᱤᱫ ᱜᱮ᱾_x000D_\n\\nᱭᱩᱴᱭᱩᱵᱽ ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱨᱮᱱᱟᱜ ᱩᱢᱮᱨ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱫ ᱱᱟᱣᱟ ᱯᱳᱞᱤᱥᱤ ᱠᱷᱟᱹᱛᱤᱨ, ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯᱷ ᱫᱚ ᱟᱡᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱨᱮᱱᱟᱜ ᱡᱟᱦᱟᱸᱭ ᱦᱚᱸ ᱥᱮᱴᱮᱨ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱵᱟᱝ ᱟᱨ ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱯᱞᱮᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾</string>\n    <string name=\"duration_live\">ᱡᱤᱣᱤ</string>\n    <string name=\"playlists\">ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ</string>\n    <string name=\"videos_string\">ᱵᱷᱤᱰᱤᱭᱳ</string>\n    <string name=\"users\">ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ</string>\n    <string name=\"events\">ᱜᱷᱚᱴᱚᱱ ᱠᱚ</string>\n    <string name=\"app_update_notification_channel_name\">ᱮᱯ ᱟᱯᱰᱮᱴ ᱱᱳᱴᱤᱯᱮᱥᱚᱱ</string>\n    <string name=\"app_update_notification_channel_description\">ᱱᱟᱣᱟ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱵᱟᱨᱥᱚᱱ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱚᱵᱚᱨ</string>\n    <string name=\"error_report_title\">ᱪᱷᱟᱸᱪ ᱠᱚ</string>\n    <string name=\"hash_channel_name\">ᱵᱷᱤᱰᱤᱭᱳ ᱦᱟᱥ ᱱᱮᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ</string>\n    <string name=\"error_report_channel_name\">ᱪᱟᱹᱠᱨᱤ ᱠᱷᱚᱵᱚᱨ ᱠᱷᱚᱵᱚᱨ</string>\n    <string name=\"switch_to_background\">ᱯᱷᱚᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ</string>\n    <string name=\"switch_to_popup\">ᱯᱚᱯ-ᱟᱯ ᱨᱮ ᱥᱮᱞᱮᱫ ᱢᱮ</string>\n    <string name=\"switch_to_main\">ᱢᱩᱬᱩᱛ ᱨᱮ ᱞᱤᱱ ᱢᱮ</string>\n    <string name=\"export_data_title\">ᱮᱠᱥᱯᱳᱨᱴ ᱰᱮᱴᱟᱵᱮᱥ</string>\n    <string name=\"import_data_summary\">ᱟᱢᱟᱜ ᱱᱮᱛᱟᱨᱟᱜ ᱱᱟᱜᱟᱢ, ᱥᱟᱵᱽᱥᱠᱨᱟᱭᱵᱽᱥ, ᱯᱷᱟᱭᱞᱤᱥᱴ ᱟᱨ (ᱵᱟᱪᱷᱱᱟᱣ ᱞᱮᱠᱟᱛᱮ) ᱥᱤᱴᱤᱝ ᱠᱚ ᱩᱪᱟᱹᱲᱟ</string>\n    <string name=\"clear_cookie_summary\">ᱟᱢ ᱢᱤᱫ reCAPTCHA ᱥᱟᱯᱲᱟᱣ ᱞᱮᱠᱷᱟᱱ NewPipe ᱥᱟᱦᱴᱟᱨᱮ ᱥᱚᱫᱚᱨ ᱟᱠᱟᱱ ᱠᱩᱠᱤ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"clear_playback_states_title\">ᱯᱷᱟᱭᱞᱟᱣ ᱴᱷᱟᱶ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"clear_playback_states_summary\">ᱡᱚᱛᱚ ᱯᱞᱮᱤᱯᱷᱟᱭᱤᱰ ᱯᱚᱡᱤᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞᱟ</string>\n    <string name=\"delete_playback_states_alert\">ᱡᱚᱛᱚ ᱯᱞᱮᱵᱟᱠ ᱯᱳᱡᱤᱥᱚᱱ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ?</string>\n    <string name=\"watch_history_states_deleted\">ᱠᱷᱮᱞᱚᱸᱰ ᱨᱮᱱᱟᱜ ᱴᱷᱟᱶ ᱠᱚ ᱪᱷᱩᱴᱟᱹᱣ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"clear_search_history_title\">ᱥᱩᱪᱚᱱᱟ ᱨᱮᱭᱟᱜ ᱱᱟᱜᱟᱢ ᱪᱷᱟᱯᱟ ᱢᱮ</string>\n    <string name=\"clear_search_history_summary\">ᱪᱷᱟᱸᱪ:Search keywords ᱨᱮᱱᱟᱜ ᱱᱟᱜᱟᱢ ᱪᱷᱟᱸᱪᱟᱣᱟ</string>\n    <string name=\"delete_search_history_alert\">ᱥᱟᱱᱟᱢ ᱥᱩᱪᱚᱱᱟ ᱱᱟᱜᱟᱢ ᱵᱚᱫᱚᱞ ᱢᱮ?</string>\n    <string name=\"could_not_setup_download_menu\">ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮᱱᱩ ᱵᱟᱭ ᱥᱮᱯᱴᱮᱭᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ</string>\n    <string name=\"app_ui_crash\">ᱮᱯᱞᱤᱠᱮᱥᱚᱱ/UI ᱠᱨᱟᱥ ᱞᱮᱱᱟ</string>\n    <string name=\"player_stream_failure\">ᱱᱚᱣᱟ ᱥᱴᱨᱤᱢ ᱯᱞᱮ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"player_unrecoverable_failure\">ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱵᱟᱭ ᱵᱩᱡᱷᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ</string>\n    <string name=\"player_recoverable_failure\">ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱦᱩᱫᱤᱥ ᱠᱷᱚᱱ ᱨᱤᱠᱳᱨᱰ</string>\n    <string name=\"invalid_file\">ᱱᱚᱶᱟ ᱯᱷᱤᱞ ᱵᱟᱹᱱᱩᱜᱼᱟ ᱥᱮ ᱱᱚᱶᱟ ᱨᱮ ᱚᱞ ᱟᱨ ᱯᱟᱲᱦᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱫᱟᱣ ᱵᱟᱹᱱᱩᱜᱼᱟ</string>\n    <string name=\"file_name_empty_error\">ᱯᱷᱤᱞᱤᱢ ᱧᱩᱛᱩᱢ ᱵᱚᱸᱫᱚ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱵᱟᱝ</string>\n    <string name=\"error_occurred_detail\">%1$s ᱢᱤᱫ ᱵᱷᱩᱞ ᱦᱩᱭ ᱞᱮᱱᱟ:</string>\n    <string name=\"no_streams_available_download\">ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱡᱟᱦᱟᱱ ᱥᱴᱨᱤᱢ ᱵᱟᱭ</string>\n    <string name=\"saved_tabs_invalid_json\">ᱥᱚᱞᱦᱮ ᱟᱠᱟᱱ ᱴᱮᱵᱽ ᱠᱚ ᱵᱟᱝ ᱯᱟᱲᱦᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ, ᱚᱱᱟᱛᱮ ᱵᱮᱵᱷᱟᱨᱤᱡᱽ ᱠᱚ</string>\n    <string name=\"restore_defaults_confirmation\">ᱟᱢ ᱥᱩᱯᱚᱨᱴ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮᱢᱮ?</string>\n    <string name=\"permission_display_over_apps\">ᱮᱴᱟᱜ ᱮᱯ ᱨᱮ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱫᱟᱣ ᱮᱢ ᱢᱮ</string>\n    <string name=\"error_report_notification_title\">NewPipe ᱨᱮ ᱢᱤᱫᱴᱟᱹᱝ ᱵᱷᱩᱞ ᱧᱟᱢ ᱞᱮᱱᱟ, ᱠᱷᱚᱵᱚᱨ ᱞᱟᱹᱜᱤᱫ ᱴᱟᱯ ᱢᱮ</string>\n    <string name=\"sorry_string\">ᱤᱧᱤᱧ ᱵᱟᱹᱧ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ, ᱱᱚᱶᱟ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭᱩᱜ ᱞᱟᱹᱠᱛᱤ ᱛᱟᱦᱮᱸᱫ ᱾</string>\n    <string name=\"error_report_button_text\">ᱤ-ᱢᱮᱞ ᱤᱫᱤ ᱠᱟᱛᱮ ᱨᱤᱯᱚᱨᱴ ᱢᱮ</string>\n    <string name=\"copy_for_github\">ᱯᱷᱚᱨᱢᱮᱴ ᱟᱠᱟᱱ ᱨᱤᱯᱳᱨᱴ ᱠᱚᱯᱤ ᱢᱮ</string>\n    <string name=\"error_report_open_github_notice\">ᱟᱢᱟᱜ ᱠᱨᱮᱥᱴ ᱵᱟᱵᱚᱫᱽ ᱛᱮ ᱢᱤᱫ ᱚᱱᱚᱞ ᱢᱮᱱᱟᱜ ᱟ ᱥᱮ ᱵᱟᱝ ᱚᱱᱟ ᱧᱮᱞ ᱢᱮ ᱾ ᱰᱩᱯᱞᱤᱠᱮᱴ ᱴᱤᱠᱮᱴ ᱵᱮᱱᱟᱣ ᱞᱮᱠᱷᱟᱱ, ᱟᱢ ᱫᱚ ᱚᱠᱛᱚ ᱟᱢᱮᱢ ᱦᱟᱛᱟᱣᱮᱫᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱥᱚᱞ ᱵᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱨᱮ ᱟᱢᱮᱢ ᱦᱟᱛᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾</string>\n    <string name=\"what_device_headline\">ᱤᱱᱯᱷᱳ:</string>\n    <string name=\"what_happened_headline\">ᱪᱮᱫ ᱦᱩᱭ ᱞᱮᱱᱟ:</string>\n    <string name=\"error_details_headline\">ᱞᱟᱹᱱᱟᱹᱤ:</string>\n    <string name=\"detail_thumbnail_view_description\">ᱵᱷᱤᱰᱤᱭᱚ ᱯᱞᱮ, ᱚᱠᱛᱚ:</string>\n    <string name=\"detail_dislikes_img_view_description\">ᱵᱟᱹᱲᱤᱡ</string>\n    <string name=\"comments_tab_description\">ᱠᱚᱢᱮᱱᱴ</string>\n    <string name=\"related_items_tab_description\">ᱥᱟᱶᱦᱮᱫ ᱮᱞᱠᱷᱟ</string>\n    <string name=\"description_tab_description\">ᱞᱟᱹᱱᱟᱹᱤ</string>\n    <string name=\"import_subscriptions_hint\">᱓ ᱰᱳᱴ ᱢᱮᱱᱩ ᱠᱷᱚᱱ ᱤᱢᱯᱳᱨᱴ ᱟᱨ ᱮᱠᱥᱯᱳᱨᱴ ᱥᱟᱵᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ</string>\n    <string name=\"detail_drag_description\">ᱱᱟᱣᱟ ᱟᱹᱨᱡᱤ ᱞᱟᱹᱜᱤᱫ ᱟᱹᱪᱩᱨ ᱢᱮ</string>\n    <string name=\"audio\">ᱚᱰᱤᱭᱳ</string>\n    <string name=\"retry\">ᱟᱨᱦᱚᱸ ᱯᱟᱲᱦᱟᱣ ᱢᱮ</string>\n    <string name=\"drawer_header_description\">ᱱᱤᱛᱚᱜ ᱵᱟᱪᱷᱟᱣ ᱟᱠᱟᱱ ᱴᱳᱜᱞ ᱥᱮᱵᱟ:</string>\n    <string name=\"no_subscribers\">ᱚᱵᱷᱤᱱᱮᱛᱟᱨ ᱵᱟᱹᱱᱩᱜᱼᱟ</string>\n    <string name=\"no_one_watching\">ᱚᱠᱚᱭ ᱦᱚᱸ ᱵᱟᱝ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"done\">ᱜᱚᱴᱟ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"title_activity_about\">ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱵᱟᱵᱚᱛ</string>\n    <string name=\"title_licenses\">ᱯᱮᱨᱟᱜ ᱞᱟᱭᱥᱮᱱᱥ</string>\n    <string name=\"donation_title\">ᱰᱳᱱᱮᱴ ᱢᱮ</string>\n    <string name=\"no_one_listening\">ᱡᱟᱦᱟᱸᱭ ᱜᱮᱭ ᱟᱸᱡᱚᱢᱟ</string>\n    <string name=\"infinite_videos\">∞ ᱵᱷᱤᱰᱤᱭᱳ</string>\n    <string name=\"no_comments\">ᱵᱟᱦᱟ ᱵᱟᱹᱱᱩᱜᱼᱟ</string>\n    <string name=\"comments_are_disabled\">ᱠᱚᱢᱮᱱᱴ ᱫᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"start\">ᱮᱛᱚᱦᱚᱵ</string>\n    <string name=\"pause\">ᱯᱷᱟᱭᱩᱥ</string>\n    <string name=\"create\">ᱵᱮᱱᱟᱣ ᱢᱮ</string>\n    <string name=\"no_available_dir\">ᱛᱷᱚᱠ ᱨᱮ ᱛᱟᱭᱚᱢ ᱛᱮ ᱢᱤᱫ ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱮᱢ ᱢᱮ</string>\n    <string name=\"one_item_deleted\">ᱢᱤᱫᱴᱟᱹᱝ ᱡᱤᱱᱤᱥ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA challenge ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ</string>\n    <string name=\"recaptcha_solve\">ᱥᱚᱞᱦᱮ</string>\n    <string name=\"donation_encouragement\">ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱤᱡᱮᱨᱟᱜ ᱚᱠᱛᱚ ᱟᱢᱟᱜ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱵᱷᱟᱹᱜᱤ ᱵᱷᱟᱹᱜᱤ ᱥᱟᱹᱜᱟᱹᱭ ᱮᱢ ᱠᱟᱛᱮ ᱵᱮᱱᱟᱣ ᱟᱠᱟᱱᱟ ᱾ ᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱵᱮᱨᱮᱫ ᱞᱟᱹᱜᱤᱫ ᱮᱱᱮᱢᱤᱭᱟᱹ ᱠᱚ ᱜᱚᱲᱚ ᱥᱚᱦᱚᱫ ᱮᱢ ᱢᱮ ᱾</string>\n    <string name=\"website_title\">ᱣᱮᱵᱽᱥᱟᱭᱤᱴ</string>\n    <string name=\"app_license_title\">ᱱᱤᱣ ᱯᱟᱭᱯ ᱨᱮᱭᱟᱜ ᱞᱟᱭᱥᱮᱱᱥ</string>\n    <string name=\"app_license\">ᱱᱤᱭᱩ ᱯᱟᱭᱯ ᱫᱚ ᱠᱚᱯᱤᱞᱮᱠᱴ ᱞᱤᱵᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱭᱟᱨ ᱠᱟᱱᱟ ᱾ ᱟᱢ ᱱᱚᱶᱟ ᱵᱮᱵᱷᱟᱨ, ᱯᱟᱲᱦᱟᱣ, ᱮᱴᱟᱜ ᱦᱚᱲ ᱥᱟᱶ ᱮᱢ ᱟᱨ ᱵᱮᱵᱚᱥᱛᱟ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ ᱟᱢ ᱱᱚᱶᱟ GNU General Public License ᱞᱮᱠᱟᱛᱮ ᱯᱟᱨᱥᱟᱞ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱟᱨ/ᱟᱨᱵᱟᱝ Free Software Foundation ᱦᱚᱛᱮᱛᱮ ᱵᱮᱵᱦᱟᱨ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱞᱟᱭᱥᱮᱱᱥ ᱨᱮᱱᱟᱜ ᱵᱟᱨᱥᱚᱱ ᱓ ᱥᱮ (ᱛᱟᱢᱟᱜ ᱵᱟᱪᱷᱟᱣ ᱞᱮᱠᱟᱛᱮ) ᱡᱟᱦᱟᱸᱱᱟᱜ ᱛᱟᱭᱚᱢ ᱵᱟᱨᱥᱚᱱ ᱠᱟᱱᱟ ᱾</string>\n    <string name=\"website_encouragement\">ᱟᱨᱦᱚᱸ ᱵᱟᱰᱟᱭ ᱟᱨ ᱠᱷᱚᱵᱚᱨ ᱞᱟᱹᱜᱤᱫ NewPipe ᱣᱮᱵᱽᱥᱟᱭᱤᱴ ᱧᱮᱞ ᱢᱮ ᱾</string>\n    <string name=\"faq_description\">ᱡᱩᱫᱤ ᱟᱢ ᱱᱚᱶᱟ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱵᱮᱵᱚᱦᱟᱨ ᱨᱮ ᱠᱷᱟᱡᱽᱱᱟ ᱮ ᱧᱟᱢᱟ, ᱮᱱᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱥᱟᱸᱣ ᱡᱩᱲᱟᱹᱣ ᱟᱠᱟᱱ ᱯᱩᱥᱴᱟᱹ ᱠᱚ ᱧᱮᱞ ᱢᱮ!</string>\n    <string name=\"faq\">ᱣᱮᱵᱽᱥᱟᱭᱤᱴ ᱨᱮ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"title_activity_history\">ᱱᱟᱜᱟᱢ</string>\n    <string name=\"action_history\">ᱱᱟᱜᱟᱢ</string>\n    <string name=\"delete_item_search_history\">ᱟᱢ ᱱᱚᱶᱟ ᱡᱤᱱᱤᱥ ᱥᱟᱸᱪᱟᱨ ᱱᱟᱜᱟᱢ ᱠᱷᱚᱱ ᱵᱚᱫᱚᱞ ᱢᱮᱢᱮ?</string>\n    <string name=\"title_last_played\">ᱢᱩᱪᱟᱹᱫ ᱠᱷᱮᱞ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"title_most_played\">ᱡᱟᱹᱥᱛᱤ ᱠᱷᱮᱞ ᱟᱠᱟᱱ</string>\n    <string name=\"main_page_content\">ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱥᱟᱦᱴᱟ</string>\n    <string name=\"main_page_content_summary\">ᱢᱩᱬᱩᱛ ᱥᱟᱦᱴᱟ ᱨᱮ ᱚᱠᱟ ᱛᱟᱵᱽ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"main_page_content_swipe_remove\">ᱡᱤᱱᱤᱥ ᱠᱚ ᱵᱟᱧᱪᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱥᱣᱟᱭᱯ ᱢᱮ</string>\n    <string name=\"default_kiosk_page_summary\">ᱰᱤᱯᱷᱚᱞᱴ ᱠᱤᱭᱳᱥᱠ</string>\n    <string name=\"kiosk_page_summary\">ᱠᱤᱭᱳᱥᱠ ᱥᱟᱦᱴᱟ</string>\n    <string name=\"channel_page_summary\">ᱪᱟᱱᱮᱞ ᱥᱟᱦᱴᱟ</string>\n    <string name=\"select_a_channel\">ᱪᱟᱱᱮᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"no_channel_subscribed_yet\">ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱪᱮᱱᱮᱞ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽ ᱵᱟᱝ</string>\n    <string name=\"select_a_playlist\">ᱢᱤᱫ ᱯᱷᱟᱤᱞᱤᱥᱴ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"import_complete_toast\">ᱤᱢᱯᱳᱨᱴ</string>\n    <string name=\"no_playlist_bookmarked_yet\">ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ playlist bookmarks ᱵᱟᱹᱱᱩᱜᱼᱟ</string>\n    <string name=\"export_complete_toast\">ᱮᱥᱯᱟᱨᱴ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"trending\">ᱴᱨᱮᱱᱰᱤᱝ</string>\n    <string name=\"play_queue_audio_settings\">ᱚᱰᱤᱭᱳ ᱥᱮᱴᱤᱝ</string>\n    <string name=\"play_queue_audio_track\">ᱚᱰᱤᱭᱳ: %s</string>\n    <string name=\"loading_stream_details\">ᱥᱴᱨᱤᱢ ᱨᱮᱱᱟᱜ ᱰᱮᱴᱮᱞ ᱞᱚᱰ ᱠᱟᱱᱟ…</string>\n    <string name=\"drawer_close\">ᱥᱩᱯᱚᱨ ᱰᱨᱟᱵᱷᱤᱴ</string>\n    <string name=\"create_playlist\">ᱱᱟᱶᱟ ᱯᱞᱮᱭᱞᱤᱥᱴ</string>\n    <string name=\"mute\">ᱢᱩᱴ</string>\n    <string name=\"start_here_on_popup\">ᱢᱤᱫ ᱯᱚᱯ-ᱟᱯ ᱨᱮ ᱠᱷᱮᱞᱚᱸᱰ ᱮᱛᱚᱦᱚᱵ ᱢᱮ</string>\n    <string name=\"set_as_playlist_thumbnail\">ᱯᱷᱟᱤᱞᱤᱯᱷᱟᱤᱞᱤ ᱞᱮᱠᱟᱛᱮ ᱥᱮᱞᱮᱫ ᱢᱮ</string>\n    <string name=\"bookmark_playlist\">ᱵᱩᱠᱢᱟᱨᱠ ᱯᱞᱮᱭᱞᱤᱥᱴ</string>\n    <string name=\"caption_setting_title\">ᱪᱷᱟᱸᱪ</string>\n    <string name=\"enable_disposed_exceptions_summary\">ᱡᱤᱵᱚᱱ ᱪᱟᱞᱟᱣ ᱛᱟᱭᱚᱢ ᱡᱟᱹᱛᱤ ᱥᱮ ᱠᱟᱹᱢᱤ ᱡᱤᱭᱚᱱ ᱪᱮᱛᱟᱱ ᱵᱟᱦᱨᱮ ᱨᱮ ᱵᱟᱝ ᱦᱟᱹᱴᱤᱧ ᱫᱟᱲᱮᱭᱟᱜ Rx ᱮᱥᱠᱮᱪᱥᱚᱱ ᱨᱮᱱᱟᱜ ᱯᱷᱚᱨᱥ ᱨᱮᱯᱚᱨᱴᱤᱝ</string>\n    <string name=\"unbookmark_playlist\">ᱵᱩᱠᱢᱟᱨᱠ ᱚᱪᱚᱭ ᱢᱮ</string>\n    <string name=\"delete_playlist_prompt\">ᱱᱚᱶᱟ ᱯᱷᱟᱭᱞᱤᱥᱴ ᱵᱚᱫᱚᱞ ᱢᱮ?</string>\n    <string name=\"caption_auto_generated\">ᱚᱴᱚ-ᱡᱮᱱᱮᱨᱮᱴ</string>\n    <string name=\"show_original_time_ago_title\">ᱡᱤᱱᱤᱥ ᱠᱚᱨᱮᱱᱟᱜ ᱢᱩᱞ ᱚᱠᱛᱚ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"show_original_time_ago_summary\">ᱥᱮᱵᱟ ᱠᱷᱚᱱ ᱚᱨᱡᱤᱱᱤᱭᱟᱞ ᱴᱮᱠᱥᱴ ᱠᱚ ᱥᱴᱨᱤᱢ ᱤᱴᱮᱢ ᱨᱮ ᱧᱮᱞᱚᱜᱼᱟ</string>\n    <string name=\"disable_media_tunneling_summary\">ᱡᱩᱫᱤ ᱟᱢ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱚᱯ ᱨᱮ ᱵᱞᱮᱠ ᱥᱠᱨᱤᱱ ᱟᱨᱵᱟᱝ ᱠᱷᱟᱹᱞᱤ ᱥᱴᱮᱴᱞᱤᱝ ᱮᱢ ᱧᱟᱢᱟ ᱮᱱᱠᱷᱟᱱ ᱢᱤᱰᱤᱭᱟ ᱴᱩᱱᱮᱞᱤᱝ ᱵᱚᱫᱚᱞ ᱢᱮ ᱾</string>\n    <string name=\"check_new_streams\">ᱱᱟᱣᱟ ᱥᱴᱨᱤᱢ ᱞᱟᱹᱜᱤᱫ ᱪᱟᱪᱞᱟᱣ ᱢᱮ</string>\n    <string name=\"create_error_notification\">ᱢᱤᱫ error notification ᱛᱮᱭᱟᱨ ᱢᱮ</string>\n    <string name=\"subscriptions_export_unsuccessful\">ᱥᱮᱞᱮᱫ ᱮᱠᱥᱯᱳᱨᱴ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"import_youtube_instructions\">\\\"ᱜᱩᱜᱩᱞ ᱴᱮᱠᱟᱣᱩᱴ ᱠᱷᱚᱱ ᱭᱩᱴᱭᱩᱵᱽ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽᱥ ᱤᱱᱯᱳᱨᱴ ᱢᱮ:\n\\n\n\\n1. ᱱᱚᱶᱟ URL ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ: %1$s\n\\n2. ᱞᱚᱜᱤᱱ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ\n\\n3. \\\"\\'All data included\\\"\\' ᱨᱮ ᱞᱤᱱ ᱢᱮ, ᱛᱟᱭᱚᱢ \\\"\\'Deselect all\\\"\\' ᱨᱮ ᱞᱤᱱ ᱢᱮ, ᱛᱟᱭᱚᱢ \\\"\\'subscriptions\\\"\\' ᱨᱮ ᱞᱤᱱ ᱢᱮ ᱟᱨ \\\"\\'OK\\\"\\' ᱨᱮ ᱞᱤᱱ ᱢᱮ\n\\n4. \\\"Next step\\\" ᱨᱮ ᱟᱨ ᱚᱱᱟ ᱛᱟᱭᱚᱢ \\\"Create export\\\" ᱨᱮ ᱞᱤᱱ ᱢᱮ\n\\n5. ᱱᱚᱶᱟ ᱧᱮᱞ ᱛᱟᱭᱚᱢ \\\"\\\"Download\\\"\\\" ᱵᱩᱴᱚᱱ ᱨᱮ ᱠᱞᱤᱠ ᱢᱮ\n\\n6. ᱞᱟᱛᱟᱨ ᱨᱮ IMPORT FILE ᱨᱮ ᱞᱤᱱ ᱢᱮ ᱟᱨ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ . zip ᱯᱷᱤᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ\n\\n7. ᱡᱩᱫᱤ .zip ᱤᱱᱯᱷᱚᱨᱴ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱵᱟᱝ ᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ .csv ᱯᱷᱤᱞ ᱮᱠᱥᱴᱨᱟᱠᱴ ᱢᱮ (\\\"ᱭᱩᱴᱭᱩᱵᱽ ᱟᱨ ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱣᱡᱤᱠ/ᱥᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ/ᱥᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ.ᱥᱤᱵᱷ\\\" ᱨᱮ), ᱞᱟᱛᱟᱨ ᱨᱮ IMPORT FILE ᱨᱮ ᱠᱞᱤᱠ ᱢᱮ ᱟᱨ ᱮᱠᱥᱴᱨᱟᱠᱴ ᱟᱠᱟᱱ csv ᱯᱷᱤᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"import_soundcloud_instructions_hint\">yourID, soundcloud.com/yourid</string>\n    <string name=\"start_accept_privacy_policy\">\\\"ᱤᱭᱩᱨᱚᱯᱤᱭᱚ ᱡᱚᱡᱚᱱᱟ ᱯᱨᱚᱫᱚᱭᱚᱜᱤᱠᱤ (ᱡᱤ.ᱰᱤ.ᱯᱤ.ᱟᱨ.) ᱥᱟᱞᱟᱜ ᱥᱚᱢᱵᱚᱸᱫᱷ ᱞᱟᱹᱜᱤᱫ ᱛᱮ, ᱱᱚᱣᱟ ᱦᱚᱛᱮᱛᱮ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱨᱮᱭᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱯᱚᱞᱤᱥᱤ ᱨᱮ ᱟᱵᱚᱣᱟᱜ ᱟᱫᱷᱤᱱᱤᱭᱚᱢ ᱠᱚ ᱩᱫᱩᱜ ᱦᱚᱪᱚᱭᱟ। ᱱᱚᱶᱟ ᱫᱚ ᱞᱟᱹᱭᱛᱮ ᱯᱟᱲᱦᱟᱣ ᱢᱮ ᱾\n\\nᱟᱢ ᱫᱚ ᱱᱚᱶᱟ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱢᱮ ᱡᱮ ᱟᱢ ᱵᱷᱤᱜᱽ ᱨᱮᱯᱳᱨᱴ ᱮᱢ ᱢᱮ ᱾\\\"</string>\n    <string name=\"enable_streams_notifications_summary\">ᱥᱚᱵᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱥᱴᱨᱤᱢ ᱠᱚ ᱵᱟᱰᱟᱭ ᱢᱮ</string>\n    <string name=\"updates_setting_title\">ᱚᱯᱰᱮᱴᱥ</string>\n    <string name=\"updates_setting_description\">ᱡᱚᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱵᱟᱨᱥᱚᱱ ᱢᱮᱱᱟᱜ-ᱟ ᱮᱯ ᱟᱯᱰᱮᱴ ᱞᱟᱹᱜᱤᱫ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"minimize_on_exit_popup_description\">ᱯᱚᱯ-ᱟᱯ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱞᱟᱹᱜᱤᱫ ᱞᱟᱹᱴᱩ ᱦᱚᱪᱚ</string>\n    <string name=\"autoplay_summary\">ᱚᱞᱪᱤᱠᱤ ᱛᱮ ᱨᱩᱭᱟᱹᱲᱚᱜ ᱢᱮ - %s</string>\n    <string name=\"list_view_mode\">ᱞᱤᱥᱴᱤ ᱧᱮᱧᱮᱞ ᱢᱚᱰ</string>\n    <string name=\"list\">ᱞᱤᱥᱴᱤ</string>\n    <string name=\"auto\">ᱚᱴᱚ</string>\n    <string name=\"app_update_available_notification_title\">ᱱᱟᱣᱟ ᱯᱟᱭᱤᱯ ᱚᱯᱰᱮᱴ ᱢᱮᱱᱟᱜ-ᱟ!</string>\n    <string name=\"app_update_available_notification_text\">%s ᱠᱚᱰ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱴᱟᱯ ᱢᱮ</string>\n    <string name=\"missions_header_finished\">ᱢᱩᱪᱟᱹᱫ</string>\n    <string name=\"checking_updates_toast\">ᱱᱤᱛᱚᱜᱟᱜ ᱠᱷᱚᱵᱚᱨ ᱠᱚ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ…</string>\n    <string name=\"download_failed\">ᱰᱟᱩᱱᱞᱚᱰ ᱵᱟᱹᱱᱩᱜ-ᱟ</string>\n    <string name=\"generate_unique_name\">ᱧᱩᱛᱩᱢ ᱛᱮᱭᱟᱨ ᱢᱮ</string>\n    <string name=\"overwrite\">ᱩᱫᱩᱜ ᱢᱮ</string>\n    <string name=\"show_error\">ᱪᱷᱟᱸᱪ:Fact</string>\n    <string name=\"error_file_creation\">ᱯᱷᱤᱞ ᱵᱮᱱᱟᱣ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ</string>\n    <string name=\"error_unknown_host\">ᱥᱮᱵᱟ ᱧᱟᱢ ᱵᱟᱝ ᱜᱟᱱᱚᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"error_http_no_content\">ᱥᱮᱵᱟ ᱫᱚ ᱚᱱᱚᱞ ᱵᱟᱝ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"error_http_unsupported_range\">ᱥᱟᱨᱵᱟᱨ ᱫᱚ ᱢᱚᱞᱴᱤ-ᱛᱷᱨᱮᱰ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱟᱝ ᱮᱢᱚᱜ ᱠᱟᱱᱟ, @string/msg_threads = 1 ᱥᱟᱶᱛᱮ ᱮᱱᱮᱡ ᱢᱮ</string>\n    <string name=\"error_postprocessing_failed\">ᱛᱟᱭᱚᱢ ᱛᱮᱭᱟᱨ ᱵᱟᱝ ᱪᱟᱞᱟᱣ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"error_postprocessing_stopped\">ᱱᱩᱯᱯᱟᱭᱤᱯᱷ ᱯᱷᱤᱞ ᱨᱮ ᱠᱟᱹᱢᱤ ᱚᱠᱛᱚ ᱨᱮ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"error_progress_lost\">ᱯᱟᱹᱛᱭᱟᱹᱣ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ, ᱪᱮᱫᱟᱜ ᱥᱮ ᱯᱷᱤᱞᱤᱯᱟᱭᱤᱰ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"error_timeout\">ᱡᱚᱱᱚᱲ ᱚᱠᱛᱚ</string>\n    <string name=\"confirm_prompt\">ᱟᱢ ᱟᱢᱟᱜ ᱰᱟᱩᱱᱞᱚᱰ ᱦᱤᱥᱛᱟ ᱵᱚᱫᱚᱞ ᱢᱮ ᱟᱨᱵᱟᱝ ᱥᱟᱱᱟᱢ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ?</string>\n    <string name=\"max_retry_desc\">ᱰᱟᱩᱱᱞᱚᱰ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱵᱟᱲᱛᱤ ᱥᱟᱸᱣᱛᱟ</string>\n    <string name=\"pause_downloads_on_mobile_desc\">ᱢᱚᱵᱟᱤᱞ ᱰᱟᱴᱟ ᱨᱮ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱵᱮᱵᱚᱦᱟᱨᱚᱜ ᱟ, ᱢᱮᱱᱠᱷᱟᱱ ᱛᱤᱱᱟᱹᱜ ᱜᱟᱱ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ ᱟ</string>\n    <string name=\"enable_queue_limit_desc\">ᱢᱤᱫᱴᱟᱹᱝ ᱰᱟᱩᱱᱞᱚᱰ ᱢᱤᱫ ᱚᱠᱛᱚ ᱨᱮ ᱪᱟᱞᱟᱜᱼᱟ</string>\n    <string name=\"pause_downloads\">ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"downloads_storage_ask_summary\">ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱡᱟᱦᱟᱸ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ ᱚᱱᱟ ᱟᱢᱮᱢ ᱩᱫᱩᱜᱟ._x000D_\n\\nᱡᱩᱫᱤ ᱟᱢ ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱮᱠᱴᱤᱵᱷ ᱢᱮ</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">ᱟᱢ ᱡᱟᱦᱟᱸ ᱨᱮ ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱥᱟᱦᱴᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚᱭ ᱢᱮ</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'ᱥᱴᱚᱨᱮᱡᱽ ᱮᱠᱥᱮᱥ ᱯᱷᱨᱮᱢᱠᱣᱟᱨᱠ\\' ᱢᱤᱫ ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱮᱢᱚᱜ ᱟ</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">ᱚᱸᱰᱨᱚᱭᱮᱰ ᱑᱐ ᱠᱷᱚᱱ ᱮᱛᱚᱦᱚᱵ ᱠᱟᱛᱮ \\'ᱥᱴᱳᱨᱮᱡ ᱮᱠᱥᱮᱥ ᱯᱷᱨᱮᱢᱚᱠ\\' ᱜᱮ ᱥᱚᱯᱷᱚᱨᱴ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"choose_instance_prompt\">ᱢᱤᱫ ᱤᱱᱥᱴᱟᱱᱥ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"app_language_title\">ᱟᱯᱞᱤᱠᱮᱥᱚᱱ ᱯᱟᱹᱨᱥᱤ</string>\n    <string name=\"systems_language\">ᱥᱤᱥᱴᱮᱢ ᱰᱤᱯᱚᱞᱴ</string>\n    <string name=\"remove_duplicates_title\">ᱰᱩᱯᱞᱤᱠᱮᱴ ᱠᱚ ᱪᱷᱩᱴᱟᱹᱣ?</string>\n    <string name=\"remove_duplicates_message\">ᱟᱢ ᱱᱚᱶᱟ ᱯᱷᱟᱭᱞᱤᱥᱴ ᱨᱮ ᱡᱚᱛᱚ ᱫᱩᱯᱞᱤᱠᱮᱴ ᱥᱴᱨᱤᱢ ᱠᱚ ᱦᱮᱡ ᱟᱫᱮᱭᱟᱢ ᱥᱮ?</string>\n    <string name=\"remove_watched_popup_warning\">ᱥᱮᱨᱮᱧ ᱛᱟᱹᱞᱤᱠᱟ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱢᱟᱲᱟᱝ ᱟᱨ ᱛᱟᱭᱚᱢ ᱨᱮ ᱡᱟᱦᱟᱸ ᱵᱷᱤᱰᱤᱣ ᱠᱚ ᱧᱮᱞ ᱟᱠᱟᱱᱟ, ᱚᱱᱟ ᱠᱚ ᱪᱷᱟᱹᱲ ᱮᱢ ᱦᱩᱭᱩᱜᱼᱟ ᱾ ᱟᱢ ᱠᱤ ᱜᱚᱴᱟᱵᱩᱴᱟᱹ ᱠᱟᱱᱟ? ᱱᱚᱶᱟ ᱫᱚ ᱨᱩᱣᱟᱹᱲ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾</string>\n    <string name=\"feed_new_items\">ᱱᱟᱣᱟ ᱡᱚᱢᱟᱜ ᱡᱤᱱᱤᱥ ᱠᱚ</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">ᱥᱮᱞᱮᱫ ᱠᱚ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"feed_group_dialog_empty_selection\">ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱱᱟᱣ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">ᱡᱟᱦᱟᱱᱟᱜ ᱵᱟᱝ ᱜᱩᱴ ᱟᱠᱟᱱ ᱥᱚᱵᱥᱠᱨᱟᱭᱵᱮᱥ ᱠᱚ ᱧᱮᱞ ᱢᱮ</string>\n    <string name=\"settings_category_feed_title\">ᱯᱷᱮᱰ</string>\n    <string name=\"feed_update_threshold_title\">ᱯᱷᱤᱰ ᱟᱯᱰᱮᱴ ᱞᱟᱦᱟᱨᱮ</string>\n    <string name=\"feed_update_threshold_summary\">ᱢᱤᱫ ᱥᱚᱵᱥᱠᱨᱟᱭᱵᱽᱥᱚᱱ ᱵᱟᱥᱠᱮᱴᱮᱰ ᱦᱩᱭᱩᱜ ᱢᱟᱬᱟᱝ ᱨᱮ ᱯᱟᱹᱪᱷᱤᱢ ᱩᱫᱩᱜ ᱠᱷᱚᱱ ᱛᱟᱭᱚᱢ ᱚᱠᱛᱚ ⁇ %s</string>\n    <string name=\"feed_load_error\">Error loading feed ᱥᱟᱯᱲᱟᱣ</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' ᱞᱟᱹᱜᱤᱫ ᱯᱷᱤᱰ ᱞᱚᱰ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ.</string>\n    <string name=\"feed_load_error_terminated\">ᱮᱠᱴᱚᱨᱟᱜ ᱮᱠᱟᱶᱴ ᱫᱚ ᱛᱷᱟᱯᱚᱱ ᱟᱠᱟᱱᱟ ᱾\n\\nNewPipe ᱫᱚ ᱱᱚᱣᱟ ᱯᱷᱤᱰ ᱫᱚ ᱟᱵᱚ ᱦᱟᱵᱤᱡ ᱵᱟᱝ ᱞᱚᱰ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾\n\\nᱟᱢ ᱱᱚᱣᱟ ᱪᱟᱱᱮᱨ ᱠᱷᱚᱱ ᱟᱹᱪᱩᱨ ᱚᱪᱚᱜ ᱠᱟᱹᱢᱤᱭᱟᱢ ᱥᱮ?</string>\n    <string name=\"feed_load_error_fast_unknown\">ᱯᱷᱚᱥᱴ ᱯᱷᱤᱰ ᱢᱚᱰ ᱱᱚᱶᱟ ᱨᱮ ᱵᱟᱹᱲᱛᱤ ᱵᱟᱰᱟᱭ ᱮᱢ ᱮᱫᱟ ᱾</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">ᱡᱩᱫᱤ ᱢᱮᱱᱟᱜᱼᱟ ᱮᱢ ᱟᱠᱟᱱ ᱡᱚᱢᱟᱜ ᱠᱷᱚᱱ ᱦᱟᱛᱟᱣ</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">ᱟᱭᱢᱟ ᱥᱮᱵᱟ ᱨᱮ ᱧᱟᱢᱚᱜᱼᱟ, ᱱᱚᱶᱟ ᱫᱚ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱟᱹᱰᱤ ᱦᱩᱰᱤᱧ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱢᱤᱫ ᱞᱮᱠᱟᱱ ᱤᱱᱴᱮᱢᱥ ᱟᱨ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱵᱟᱝ ᱯᱩᱨᱟᱹᱣ ᱟᱠᱟᱱ ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ (ᱡᱮᱞᱮᱠᱟ ᱺ ᱚᱠᱛᱚ ᱵᱟᱝ, ᱤᱱᱴᱮᱢᱥ ᱨᱮᱱᱟᱜ ᱞᱮᱠᱷᱟ, ᱚᱞᱤᱵᱽ ᱥᱴᱮᱴᱥ ᱵᱟᱝ) ᱨᱩᱣᱟᱹᱲ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">ᱯᱷᱮᱥᱵᱩᱠ ᱢᱚᱰ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">ᱟᱢᱟᱜ ᱢᱚᱱᱮ ᱨᱮ ᱡᱚᱢᱟᱜ ᱨᱮᱱᱟᱜ ᱞᱚᱰ ᱟᱹᱰᱤ ᱟᱞᱜᱟ ᱜᱮᱭᱟ? ᱡᱩᱫᱤ ᱱᱚᱶᱟ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ, ᱮᱱᱠᱷᱟᱱ ᱥᱯᱤᱰ ᱞᱚᱰ ᱮᱱᱟᱝ ᱮᱱᱮᱡ (ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱢ ᱥᱤᱴᱤᱝ ᱨᱮ ᱥᱮ ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱵᱩᱛᱟᱹᱢ ᱚᱞ ᱠᱟᱛᱮᱢ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ)\n\\n\n\\nᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱫᱚ ᱵᱟᱨᱭᱟ ᱯᱷᱤᱰ ᱞᱚᱰ ᱥᱴᱨᱮᱴᱡᱤ ᱮᱢᱚᱜ ᱠᱟᱱᱟ:\n\\n• ᱡᱚᱛᱚ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽ ᱪᱮᱱᱮᱞ ᱦᱟᱛᱟᱣ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱞᱜᱟ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱯᱩᱨᱟᱹᱣᱜᱼᱟ ᱾\n\\n• ᱰᱮᱰᱤᱠᱮᱴᱮᱰ ᱥᱮᱵᱟ ᱮᱱᱰ ᱯᱚᱭᱮᱱᱴ ᱵᱮᱵᱷᱟᱨ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱦᱩᱲᱟᱹᱜ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱯᱩᱨᱟᱹᱣ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭᱩᱜᱼᱟ ᱾\n\\n\n\\nᱵᱟᱨᱭᱟ ᱛᱟᱞᱟᱨᱮᱱᱟᱜ ᱵᱷᱮᱜᱟᱨ ᱫᱚ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ ᱡᱮ ᱦᱩᱲᱟᱹᱜ ᱢᱤᱫᱴᱟᱹᱝ ᱜᱮ ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ ᱵᱟᱹᱱᱩᱜᱼᱟ, ᱡᱮᱞᱮᱠᱟ ᱤᱢᱮᱠᱥ ᱨᱮᱱᱟᱜ ᱚᱠᱛᱚ ᱥᱮ ᱛᱷᱚᱠ (ᱡᱟᱦᱟᱸ ᱫᱚ ᱞᱟᱭᱤᱵᱷᱤᱰᱤᱭᱳ ᱟᱨ ᱱᱚᱨᱢᱟᱞ ᱨᱮᱱᱟᱜ ᱵᱷᱮᱜᱟᱨ ᱵᱟᱭ ᱵᱟᱰᱟᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ) ᱟᱨ ᱱᱚᱶᱟ ᱠᱚᱢ ᱤᱢᱮᱠᱥ ᱠᱚ ᱨᱩᱣᱟᱹᱲ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾\n\\n\n\\nᱭᱩᱴᱭᱩᱵᱽ ᱫᱚ ᱢᱤᱫᱴᱮᱱ ᱥᱮᱵᱟ ᱨᱮᱱᱟᱜ ᱢᱤᱫ ᱞᱟᱹᱱᱟᱹᱤ ᱠᱟᱱᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱱᱚᱶᱟ ᱦᱚᱨᱟ ᱟᱡᱟᱜ RSS ᱯᱷᱤᱰ ᱥᱟᱶᱛᱮ ᱮᱢᱚᱜ ᱠᱟᱱᱟ ᱾\n\\n\n\\nᱚᱱᱟᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱫᱚ ᱟᱢ ᱪᱮᱫ ᱜᱮᱢ ᱵᱷᱟᱹᱵᱤᱛᱟ: ᱦᱩᱲᱟᱹᱜ ᱟᱨᱵᱟᱝ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ ᱠᱟᱛᱷᱟ ᱾</string>\n    <string name=\"feed_show_hide_streams\">ᱥᱴᱨᱤᱢ ᱠᱚ ᱵᱚᱫᱚᱞ/ᱥᱚᱫᱚᱨ ᱢᱮ</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">ᱡᱚᱠᱷᱚᱱ ᱯᱷᱤᱰ ᱚᱯᱰᱮᱴ ᱦᱩᱭᱩᱜᱼᱟ, ᱚᱱᱟ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱴᱮᱵᱽ ᱠᱚ ᱦᱟᱛᱟᱣ ᱢᱮ ᱾ ᱡᱩᱫᱤ ᱢᱤᱫ ᱪᱮᱱᱮᱞ ᱫᱚ fast mode ᱵᱮᱵᱷᱟᱨ ᱠᱟᱛᱮ update ᱟᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ ᱱᱚᱶᱟ option ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ ᱾</string>\n    <string name=\"content_not_supported\">ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱭᱟᱨ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾_x000D_\n\\n_x000D_\n\\nᱱᱚᱶᱟ ᱫᱚ ᱢᱚᱵᱟᱤᱞ ᱣᱟᱨᱥᱚᱱ ᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱨ ᱦᱩᱭᱩᱜᱼᱟ ᱾</string>\n    <string name=\"show_thumbnail_summary\">ᱞᱚᱠ ᱥᱠᱨᱤᱱ ᱛᱷᱚᱠ ᱟᱨ ᱱᱳᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱵᱟᱱᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱛᱚᱢᱱᱤᱞ ᱵᱮᱵᱷᱟᱨ ᱢᱮ</string>\n    <string name=\"no_app_to_open_intent\">ᱟᱢᱟᱜ ᱰᱤᱵᱟᱤᱥ ᱨᱮ ᱱᱚᱶᱟ ᱮᱯ ᱵᱟᱹᱱᱩᱜ-ᱟ</string>\n    <string name=\"no_appropriate_file_manager_message\">ᱱᱚᱶᱟ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ ᱫᱚ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱯᱷᱤᱞ ᱢᱮᱱᱮᱡᱚᱨ ᱵᱟᱝ ᱧᱟᱢ ᱞᱮᱱᱟ ᱾ %s</string>\n    <string name=\"georestricted_content\">ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱟᱢᱟᱜ ᱫᱤᱥᱚᱢ ᱨᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾</string>\n    <string name=\"soundcloud_go_plus_content\">ᱱᱩᱶᱟ ᱫᱚ ᱢᱤᱫ ᱥᱟᱣᱚᱱᱰᱠᱞᱟᱣᱩᱰ ᱜᱳ+ ᱴᱨᱟᱠ ᱠᱟᱱᱟ, ᱟᱢᱟᱜ ᱫᱤᱥᱚᱢ ᱨᱮ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱠᱚᱢ, ᱚᱱᱟᱛᱮ ᱱᱩᱭᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱚᱣᱟ ᱴᱨᱟᱠ ᱥᱴᱨᱤᱢ ᱟᱨ ᱰᱟᱩᱱᱞᱚᱰ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾</string>\n    <string name=\"private_content\">ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱤᱡᱮᱨᱟᱜ ᱠᱟᱱᱟ, ᱚᱱᱟᱛᱮ ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱫᱚ ᱱᱚᱣᱟ ᱵᱟᱭ ᱰᱟᱩᱱᱞᱚᱰ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱨ ᱵᱟᱝ ᱥᱴᱨᱤᱢ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾</string>\n    <string name=\"paid_content\">ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱨᱮᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱯᱮᱨᱮᱡ ᱥᱮᱞᱮᱫ ᱠᱚᱣᱟ, ᱚᱱᱟᱛᱮ ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱨᱮᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱯᱮᱨᱮᱡ ᱥᱮᱞᱮᱫ ᱵᱟᱝ ᱠᱚ ᱧᱟᱢ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾</string>\n    <string name=\"featured\">ᱯᱷᱮᱭᱟᱨ ᱟᱠᱟᱱ</string>\n    <string name=\"night_theme_available\">ᱱᱚᱶᱟ ᱵᱟᱪᱷᱟᱣ ᱫᱚ ᱚᱱᱠᱟᱱ ᱞᱟᱹᱜᱤᱫ ᱜᱮ ᱵᱮᱵᱦᱟᱨᱚᱜᱼᱟ ᱡᱩᱫᱤ %s ᱴᱷᱤᱠᱟᱹᱱᱟ</string>\n    <string name=\"download_has_started\">ᱰᱟᱩᱱᱞᱚᱰ ᱮᱛᱚᱦᱚᱵ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"description_select_note\">ᱟᱢ ᱱᱤᱛᱚᱜ ᱚᱞ ᱪᱤᱠᱤ ᱨᱮ ᱚᱞ ᱪᱤᱠᱤ ᱵᱟᱪᱷᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱟ. ᱵᱟᱰᱟᱭ ᱢᱮ ᱡᱮ ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱷᱤᱸᱰᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱨ ᱵᱟᱪᱷᱟᱣ ᱢᱚᱰ ᱨᱮ ᱞᱤᱱᱠ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾</string>\n    <string name=\"description_select_enable\">ᱪᱤᱠᱤ ᱨᱮ ᱚᱞ ᱵᱟᱪᱷᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱮᱱᱮᱢ ᱢᱮ</string>\n    <string name=\"metadata_privacy\">ᱯᱨᱟᱭᱵᱷᱮᱴ</string>\n    <string name=\"metadata_age_limit\">ᱩᱢᱚᱨ ᱨᱮᱭᱟᱜ ᱞᱤᱢᱤᱴ</string>\n    <string name=\"metadata_language\">ᱯᱟᱹᱨᱥᱤ</string>\n    <string name=\"metadata_support\">ᱥᱚᱦᱚᱫ</string>\n    <string name=\"metadata_thumbnails\">ᱛᱷᱩᱢᱱᱟᱭᱤᱴ</string>\n    <string name=\"metadata_uploader_avatars\">ᱚᱯᱞᱚᱰᱟᱨ ᱟᱵᱟᱛᱟᱨ</string>\n    <string name=\"metadata_subchannel_avatars\">ᱥᱟᱵ-ᱪᱟᱱᱮᱞ ᱟᱵᱟᱛᱟᱨ</string>\n    <string name=\"metadata_privacy_private\">ᱯᱨᱟᱭᱵᱷᱮᱴ</string>\n    <string name=\"metadata_privacy_internal\">ᱤᱱᱴᱟᱨᱱᱟᱞ</string>\n    <string name=\"metadata_subscribers\">ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱟᱨ</string>\n    <string name=\"detail_pinned_comment_view_description\">ᱯᱤᱱ ᱟᱠᱟᱱ ᱟᱹᱱᱤᱡ</string>\n    <string name=\"detail_heart_img_view_description\">ᱵᱮᱱᱟᱣᱤᱡᱟᱜ ᱢᱚᱱᱮ</string>\n    <string name=\"open_website_license\">ᱚᱯᱮᱱ ᱣᱮᱵᱥᱟᱤᱴ</string>\n    <string name=\"tablet_mode_title\">ᱴᱮᱵᱽᱞᱮᱴ ᱢᱚᱰ</string>\n    <string name=\"on\">ᱨᱮ</string>\n    <string name=\"off\">ᱚᱯᱷ</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱰᱤᱯᱚᱞᱴ</string>\n    <string name=\"toggle_all\">ᱥᱟᱱᱟᱢ ᱪᱟᱞᱟᱣ ᱢᱮ</string>\n    <string name=\"streams_not_yet_supported_removed\">ᱡᱟᱦᱟᱸᱱ ᱥᱴᱨᱤᱢ ᱠᱚ ᱱᱤᱛ ᱫᱷᱟᱹᱵᱤᱡ ᱰᱟᱩᱱᱞᱚᱰᱡᱚᱨ ᱦᱚᱛᱮᱛᱮ ᱥᱚᱯᱷᱴᱣᱮᱰ ᱵᱟᱱᱟᱣ ᱟᱠᱟᱱᱟ ᱚᱱᱟ ᱠᱚ ᱵᱟᱹᱱᱩᱜᱼᱟ</string>\n    <string name=\"audio_track_present_in_video\">ᱱᱚᱶᱟ ᱥᱴᱨᱤᱢ ᱨᱮ ᱢᱤᱫᱴᱟᱹᱝ ᱚᱰᱤᱭᱳ ᱴᱨᱟᱠ ᱢᱮᱱᱟᱜ ᱛᱟᱭᱟ</string>\n    <string name=\"feed_show_partially_watched\">ᱡᱟᱹᱥᱛᱤ ᱧᱮᱞ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"feed_show_upcoming\">ᱢᱟᱲᱟᱝ ᱨᱮ</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">ᱡᱩᱫᱤ ᱟᱢᱟᱜ ᱰᱤᱠᱳᱰᱟᱨ ᱮᱛᱚᱦᱚᱵ ᱨᱮᱭᱟᱜ ᱞᱟᱹᱞᱤᱥ ᱛᱟᱦᱮᱸᱱᱟ, ᱮᱱᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱵᱟᱪᱷᱱᱟᱣ ᱫᱚ ᱮᱥᱮᱨ ᱢᱮ, ᱡᱟᱦᱟᱫᱚ ᱮᱛᱚᱦᱚᱵ ᱰᱤᱠᱳᱰᱟᱨ ᱮᱛᱚᱦᱚᱵ ᱵᱟᱝ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱞᱟᱛᱟᱨᱼᱯᱨᱳᱭᱨᱤᱴᱤ ᱰᱤᱠᱳᱰᱟᱨ ᱨᱮ ᱨᱩᱣᱟᱹᱲ ᱦᱮᱡᱚᱜᱼᱟ ᱾ ᱱᱚᱶᱟ ᱨᱮᱭᱟᱜ ᱚᱡᱮ ᱫᱚ ᱮᱛᱚᱦᱚᱵ ᱰᱤᱠᱳᱰᱟᱨ ᱠᱚ ᱵᱮᱣᱦᱟᱨ ᱚᱠᱛᱚ ᱠᱷᱚᱱ ᱵᱮᱼᱲᱤᱪᱟᱹᱲ ᱯᱟᱥᱱᱟᱶ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">ᱱᱚᱶᱟ ᱠᱟᱹᱢᱤ ᱦᱚᱨᱟ ᱫᱚ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱳᱰᱮᱠ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱨ ᱨᱤ-ᱤᱱᱥᱴᱟᱱᱥᱟᱭᱤᱴ (re-instantiates) ᱮᱫᱟ, ᱚᱱᱟ ᱫᱚ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱠᱳᱰᱮᱠ ᱨᱮ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱥᱩᱯᱩᱨ ᱥᱩᱯᱩᱨ ᱛᱮ ᱥᱮᱴᱮᱨᱚᱜ ᱨᱮᱱᱟᱜ ᱠᱟᱱᱟ ᱾ ᱱᱚᱶᱟ ᱥᱟᱛᱟᱢ ᱥᱟᱶᱛᱮ ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱟᱭᱢᱟ ᱚᱱᱚᱞ ᱨᱮ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱟᱱᱟ, ᱱᱚᱶᱟ ᱥᱤᱴᱤᱝ ᱫᱚ ᱟᱱᱰᱨᱚᱭᱮᱰ ᱖ ᱟᱨ ᱚᱱᱟ ᱠᱷᱚᱱ ᱪᱮᱛᱟᱱ ᱨᱮᱜᱮ ᱟᱯᱷᱮᱠᱴ ᱟᱠᱟᱱᱟ\n\\n\n\\nᱱᱮᱛᱟᱨᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱟᱨ ᱥᱮ ᱯᱷᱩᱞᱥᱠᱨᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱡᱚᱠᱷᱚᱱ ᱱᱚᱶᱟ ᱵᱟᱪᱷᱟᱣ ᱮᱢ ᱫᱚᱦᱚ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ</string>\n    <string name=\"show_channel_tabs_summary\">ᱪᱮᱱᱟᱞ ᱥᱟᱦᱴᱟ ᱠᱚᱨᱮ ᱪᱮᱫ ᱴᱮᱵᱽ ᱠᱚ ᱵᱚᱫᱚᱞᱟ</string>\n    <string name=\"open_play_queue\">ᱚᱯᱮᱱ ᱯᱞᱮ ᱠᱭᱩᱤ</string>\n    <string name=\"toggle_fullscreen\">ᱡᱚᱛᱚ ᱥᱠᱨᱤᱱ ᱨᱮ ᱵᱷᱮᱡᱟ ᱢᱮ</string>\n    <string name=\"next_stream\">ᱱᱮᱛᱟᱨᱟᱜ ᱫᱟᱜᱽ</string>\n    <string name=\"play\">ᱠᱷᱮᱞ</string>\n    <string name=\"replay\">ᱨᱤᱯᱷᱟᱭᱤᱞ</string>\n    <string name=\"duration\">ᱚᱠᱛᱚ</string>\n    <string name=\"rewind\">ᱨᱩᱣᱟ.</string>\n    <string name=\"image_quality_summary\">ᱰᱮᱴᱟ ᱟᱨ ᱢᱮᱢᱚᱨᱤ ᱵᱮᱵᱷᱟᱨ ᱠᱚᱢ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱪᱤᱛᱟᱹᱨ ᱠᱚᱣᱟᱜ ᱥᱤᱠᱷᱱᱟᱹᱛ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ᱟᱨ ᱪᱤᱛᱟᱹᱨ ᱠᱚ ᱚᱞ ᱦᱚᱪᱚ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱢᱮ. ᱢᱤᱢᱮᱨᱤ ᱟᱨ ᱚᱱ-ᱰᱤᱥᱠ ᱪᱤᱛᱟᱹᱨ ᱠᱮᱪ ᱵᱟᱱᱟᱨ ⁇ %s ᱪᱷᱟᱯᱟ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"image_quality_low\">ᱞᱟᱯᱷᱟᱝ ᱥᱤᱠᱷᱱᱟ.</string>\n    <string name=\"image_quality_medium\">ᱛᱟᱞᱢᱟ ᱥᱤᱠᱷᱱᱟᱹᱛ</string>\n    <string name=\"image_quality_high\">ᱩᱥᱩᱞ ᱥᱤᱠᱷᱱᱟᱹᱛ</string>\n    <string name=\"share_playlist_with_list\">URL ᱛᱟᱹᱞᱠᱟᱹ ᱥᱟᱯᱲᱟᱣ</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"notification_scale_to_square_image_summary\">ᱱᱚᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱨᱮ ᱑᱖:᱙ ᱠᱷᱚᱱ ᱑:᱑ ᱟᱥᱯᱮᱠᱴ ᱚᱱᱩᱯᱟᱹᱛ ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱛᱷᱚᱢᱵᱱᱮᱞ ᱜᱮᱫᱽ ᱢᱮ</string>\n    <string name=\"recovering\">ᱨᱤᱠᱟᱵᱽᱞᱤᱝ</string>\n    <string name=\"default_content_country_title\">ᱰᱤᱯᱷᱚᱞᱴ ᱠᱚᱱᱴᱮᱱᱴ ᱫᱤᱥᱚᱢ</string>\n    <string name=\"playback_pitch\">ᱯᱤᱪ</string>\n    <string name=\"metadata_host\">ᱦᱳᱥᱴ</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">ExoPlayer ᱨᱮᱭᱟᱜ ᱰᱤᱠᱚᱰᱟᱨ ᱯᱷᱮᱞᱚᱵᱮᱠ ᱯᱷᱤᱪᱚᱨ ᱵᱮᱵᱷᱟᱨ ᱢᱮ</string>\n    <string name=\"settings_category_exoplayer_title\">ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱥᱮᱴᱤᱝ</string>\n    <string name=\"settings_category_exoplayer_summary\">ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱥᱮᱴᱤᱸᱜᱽᱥ ᱠᱚ ᱪᱟᱪᱞᱟᱣ ᱢᱮ ᱾ ᱱᱚᱶᱟ ᱞᱟᱹᱜᱤᱫ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱨᱤᱥᱴᱟᱨᱴ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ</string>\n    <string name=\"audio_track_type_dubbed\">ᱰᱟᱵᱞᱤᱝ</string>\n    <string name=\"audio_track_type_descriptive\">ᱰᱮᱥᱠᱨᱤᱯᱴᱤᱵ</string>\n    <string name=\"progressive_load_interval_summary\">ᱯᱨᱚᱜᱨᱮᱥᱤᱵᱽ ᱠᱚᱴᱮᱱᱴ (ᱱᱤᱛᱚᱜ %s) ᱨᱮ ᱞᱚᱰ ᱤᱱᱴᱟᱨᱵᱷᱮᱞ ᱨᱮᱱᱟᱜ ᱢᱟᱨᱟᱝ ᱮᱢ ᱢᱮ ᱢᱤᱫ ᱠᱚᱢ ᱵᱷᱚᱞᱮᱡᱽ ᱟᱡᱟᱜ ᱮᱛᱚᱦᱚᱵ ᱞᱚᱰᱰᱤᱝ ᱨᱮᱱᱟᱜ ᱟᱯᱞᱚᱰ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ</string>\n    <string name=\"prefer_original_audio_title\">ᱚᱥᱴᱨᱮᱞᱤᱭᱟᱱ ᱚᱰᱤᱭᱳ ᱞᱟᱹᱜᱤᱫ</string>\n    <string name=\"local_search_suggestions\">ᱴᱚᱴᱷᱟᱠᱤᱭᱟ. ᱥᱩᱪᱚᱱᱟ</string>\n    <string name=\"enable_playback_resume_title\">ᱠᱷᱚᱵᱚᱨ ᱮᱦᱚᱵ ᱢᱮ</string>\n    <string name=\"enable_playback_resume_summary\">ᱢᱩᱪᱟᱹᱫ ᱠᱷᱚᱵᱚᱨ ᱴᱷᱟᱹᱶᱠᱟᱹ</string>\n    <string name=\"peertube_instance_add_title\">ᱤᱱᱥᱴᱮᱸᱥ ᱥᱮᱞᱮᱫ ᱢᱮ</string>\n    <string name=\"peertube_instance_add_help\">ᱤᱱᱥᱴᱟᱱᱥ URL ᱮᱢ ᱢᱮ</string>\n    <string name=\"settings_category_updates_title\">ᱚᱯᱰᱮᱴᱥ</string>\n    <string name=\"popup_playing_toast\">ᱯᱚᱯ-ᱟᱯ ᱢᱚᱰ ᱨᱮ ᱠᱷᱮᱞᱚᱸᱰ</string>\n    <string name=\"content\">ᱥᱟᱦᱴᱟ</string>\n    <string name=\"show_age_restricted_content_title\">ᱩᱢᱮᱨ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱠᱟᱛᱷᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">ᱭᱩᱴᱭᱩᱵᱽ ᱨᱮᱱᱟᱜ \\\"Restricted Mode\\\" ᱚᱞ ᱢᱮ</string>\n    <string name=\"all\">ᱡᱚᱛᱚ</string>\n    <string name=\"network_error\">ᱱᱮᱴᱣᱟᱨᱠ ᱵᱷᱩᱞ</string>\n    <string name=\"app_description\">ᱟᱱᱰᱨᱚᱭᱮᱰ ᱨᱮ ᱞᱤᱵᱨᱮ ᱞᱟᱭᱤᱴᱣᱮᱴ ᱥᱴᱨᱤᱢᱤᱝ</string>\n    <string name=\"metadata_tags\">ᱴᱮᱜᱥ</string>\n    <string name=\"metadata_privacy_public\">ᱥᱚᱨᱠᱟᱨᱤ</string>\n    <string name=\"error_insufficient_storage_left\">ᱚᱱᱚᱞ ᱨᱮ ᱡᱟᱭᱜᱟ ᱵᱟᱹᱱᱩᱜᱼᱟ</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">ᱪᱮᱱᱮᱞ ᱨᱮᱱᱟᱜ ᱟᱵᱟᱛᱟᱨ ᱛᱷᱩᱱᱤᱠᱟ</string>\n    <string name=\"playlist_page_summary\">ᱥᱮᱨᱮᱧ ᱞᱤᱥᱴᱤ ᱥᱟᱦᱴᱟ</string>\n    <string name=\"never\">ᱵᱟᱝ</string>\n    <string name=\"settings_category_downloads_title\">ᱰᱟᱩᱱᱞᱚᱰ ᱢᱮ</string>\n    <string name=\"settings_file_charset_title\">ᱯᱷᱤᱞ ᱧᱩᱛᱩᱢ ᱨᱮ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱪᱤᱠᱤ ᱠᱚ</string>\n    <string name=\"msg_failed_to_copy\">ᱪᱷᱟᱸᱪ:Copy to clipboard ᱨᱮ ᱪᱷᱟᱸᱪ:Copy to clipboard</string>\n    <string name=\"rename\">ᱧᱩᱛᱩᱢ ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"msg_name\">ᱯᱷᱤᱞᱤᱢ ᱧᱩᱛᱩᱢ</string>\n    <string name=\"msg_threads\">ᱛᱷᱤᱭᱮᱴᱚᱨ</string>\n    <string name=\"msg_error\">ᱪᱷᱟᱸᱪ</string>\n    <string name=\"msg_running\">NewPipe ᱮᱯᱞᱤᱠᱮᱥᱚᱱ</string>\n    <string name=\"msg_running_detail\">ᱵᱟᱰᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱴᱟᱯ ᱢᱮ</string>\n    <string name=\"msg_calculating_hash\">ᱦᱟᱥᱤ ᱠᱚᱞᱠᱟᱛᱟ</string>\n    <string name=\"no_dir_yet\">ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱥᱮᱴ ᱵᱟᱝ, ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱰᱟᱩᱱᱞᱚᱰ ᱯᱷᱳᱞᱰᱟᱨ ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>\n    <string name=\"copyright\">© %1$s ᱛᱮ %2$s ᱞᱟᱛᱟᱨ ᱨᱮ %3$s</string>\n    <string name=\"tab_about\">About &amp; FAQ</string>\n    <string name=\"tab_licenses\">ᱞᱟᱭᱥᱮᱱᱥ</string>\n    <string name=\"contribution_title\">ᱥᱮᱞᱮᱫᱚᱜ ᱢᱮ</string>\n    <string name=\"privacy_policy_title\">ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱨᱮᱱᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴᱤ ᱯᱚᱞᱤᱥᱤ</string>\n    <string name=\"privacy_policy_encouragement\">ᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱯᱨᱚᱡᱮᱠᱴ ᱟᱢᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱟᱹᱰᱤ ᱥᱚᱨᱮᱥ ᱜᱮᱭᱟ. ᱚᱱᱟᱛᱮ, ᱟᱢᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱵᱟᱹᱱᱩᱜ ᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱡᱟᱦᱟᱱ ᱰᱮᱴᱟ ᱵᱟᱭ ᱥᱟᱢᱟᱝᱟ ᱾_x000D_\n\\nᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱨᱮᱱᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱯᱚᱞᱤᱥᱤ ᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱰᱮᱴᱟ ᱠᱚ ᱟᱢ ᱠᱨᱮᱥᱚᱨ ᱨᱮᱯᱳᱨᱴ ᱚᱠᱟᱛᱮ ᱟᱢ ᱚᱠᱟ ᱞᱮᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱰᱮᱴᱟ ᱠᱚ ᱵᱚᱫᱚᱞᱟ ᱟᱨ ᱵᱚᱫᱚᱞᱟ ᱚᱱᱟ ᱵᱟᱵᱚᱫ ᱛᱮ ᱡᱚᱛᱚ ᱵᱟᱰᱟᱭ ᱮᱢᱚᱜ ᱟ᱾</string>\n    <string name=\"read_privacy_policy\">ᱯᱨᱟᱭᱵᱷᱮᱴᱤ ᱯᱚᱞᱤᱥ ᱯᱟᱲᱦᱟᱣ ᱢᱮ</string>\n    <string name=\"read_full_license\">ᱞᱟᱭᱥᱮᱱᱥ ᱯᱟᱲᱦᱟᱣ ᱢᱮ</string>\n    <string name=\"faq_title\">ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱚᱞ ᱟᱠᱟᱱ ᱯᱩᱥᱴᱟ</string>\n    <string name=\"missing_file\">ᱯᱷᱤᱞ ᱥᱮᱴᱮᱨ ᱟᱠᱟᱱᱟ ᱟᱨ ᱵᱟᱝ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"invalid_directory\">ᱱᱚᱝᱠᱟᱱ ᱯᱷᱳᱞᱰᱟᱨ ᱵᱟᱹᱱᱩᱜᱼᱟ</string>\n    <string name=\"invalid_source\">ᱱᱚᱝᱠᱟᱱ ᱯᱷᱤᱞ/ᱥᱟᱹᱛ ᱨᱮᱱᱟᱜ ᱜᱟᱞᱢᱟᱨᱟᱣ ᱵᱟᱹᱱᱩᱜᱼᱟ</string>\n    <string name=\"loading_metadata_title\">ᱢᱮᱴᱟᱰᱟᱴᱟ ᱞᱚᱰ ᱠᱟᱱᱟ…</string>\n    <string name=\"channels\">ᱪᱟᱱᱮᱞ</string>\n    <string name=\"undo\">ᱵᱚᱫᱚᱞ ᱢᱮ</string>\n    <string name=\"play_all\">ᱥᱟᱱᱟᱢ ᱠᱷᱮᱞ ᱢᱮ</string>\n    <string name=\"always\">ᱡᱚᱦᱚᱜ</string>\n    <string name=\"just_once\">ᱢᱤᱫ ᱫᱷᱟᱣ</string>\n    <string name=\"file\">ᱯᱷᱤᱞᱤ</string>\n    <string name=\"notifications\">ᱱᱳᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ</string>\n    <string name=\"notification_channel_name\">ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱵᱟᱰᱟᱭ ᱦᱚᱪᱚ</string>\n    <string name=\"playback_step\">ᱥᱴᱮᱯ</string>\n    <string name=\"error_connect_host\">ᱥᱮᱵᱟ ᱨᱮ ᱡᱚᱲᱟᱣ ᱵᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ</string>\n    <string name=\"error_http_not_found\">ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱᱟ</string>\n    <string name=\"sort\">ᱥᱮᱞᱮᱫ</string>\n    <string name=\"error_snackbar_message\">ᱤᱧ ᱵᱟᱹᱧ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ, ᱡᱟᱦᱟᱸᱱᱟᱜ ᱠᱷᱟᱹᱛᱤᱨ ᱤᱧ ᱵᱟᱹᱧ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾</string>\n    <string name=\"streams_notifications_network_title\">ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱱᱮᱴᱣᱟᱨᱠ ᱡᱚᱲᱟᱣ</string>\n    <string name=\"any_network\">ᱡᱟᱦᱟᱱ ᱱᱮᱴᱣᱟᱨᱠ</string>\n    <string name=\"close\">ᱥᱩᱯᱩᱨ</string>\n    <string name=\"more_options\">ᱰᱷᱮᱨ ᱵᱟᱪᱷᱟᱣ</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-sc/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"import_youtube_instructions\">Importa sas iscritziones dae Google takeout:\n\\n\n\\n1. Bae a custu URL: %1$s\n\\n2. Intra cando ti l\\'ant a pedire\n\\n3. Incarca in \\\"Totu sos datos incluidos\\\", a pustis in \\\"Boga sa seletzione a totus\\\" e a pustis galu ischerta petzi \\\"iscritziones\\\" e incarca \\\"AB\\\"\n\\n4. Incarca in \\\"Passu imbeniente\\\" e a pustis in \\\"Crea un\\'esportatzione\\\"\n\\n5. Cando aparit, incarca in su butone \\\"Iscarrigamentu\\\"\n\\n6. Incarca in IMPORTA SU DOCUMENTU in suta e ischerta su documentu .zip iscarrigadu\n\\n6. [Si s\\'importatzione fallit] Estrae su documentu .csv (de sòlitu tenet su nùmene\\\"\\\"YouTube and YouTube Music/subscriptions/subscriptions.csv\\\"), incarca in IMPORTA SU DOCUMENTU in suta e ischerta su documentu csv estratu</string>\n    <string name=\"subscriptions_export_unsuccessful\">Esportatzione de s\\'iscritzione fallida</string>\n    <string name=\"subscriptions_import_unsuccessful\">Importatzione de s\\'iscritzione fallida</string>\n    <string name=\"previous_export\">Esportatzione anteposta</string>\n    <string name=\"import_file_title\">Importa su documentu</string>\n    <string name=\"import_ongoing\">Importende…</string>\n    <string name=\"export_to\">Esporta in</string>\n    <string name=\"import_from\">Importa dae</string>\n    <string name=\"import_title\">Importa</string>\n    <string name=\"show_original_time_ago_summary\">Su testu originale dae sos servìtzios at a èssere visìbile in sos elementos de flussu</string>\n    <string name=\"show_original_time_ago_title\">Ammustra sa data originale in sos elementos</string>\n    <string name=\"enable_disposed_exceptions_summary\">Fortzat sinnalatziones de etzetziones Rx non cunsinnàbiles in foras de su tziclu de bida de sos framnentos o de sas atividades a pustis de s\\'ismaltimentu</string>\n    <string name=\"enable_disposed_exceptions_title\">Sinnala sos errores in foras de su tziclu de bida</string>\n    <string name=\"enable_leak_canary_summary\">Sa compidada de sa pèrdida de memòria diat pòdere causare blocos de s\\'aplicatzione durante d\\'iscarrigamentu de sa memòria (heap dumping)</string>\n    <string name=\"caption_setting_description\">Muda sa mannària e sos istiles de isfundu de su testu de sos suta-tìtulos. Depes torrare a allùghere s\\'aplicatzione pro chi tèngiat efetu</string>\n    <string name=\"caption_setting_title\">Suta-tìtulos</string>\n    <string name=\"caption_auto_generated\">Ingendradu automaticamente</string>\n    <string name=\"resize_zoom\">Ismànnia</string>\n    <string name=\"resize_fill\">Prenu</string>\n    <string name=\"resize_fit\">Adata</string>\n    <string name=\"caption_none\">Perunu suta-titulu</string>\n    <string name=\"playlist_no_uploader\">Ingendradu automaticamente (perunu carrigadore agatadu)</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniadura de s\\'iscalita mudada.</string>\n    <string name=\"playlist_add_stream_success\">Postu in s\\'iscalita</string>\n    <string name=\"playlist_creation_success\">Iscalita creada</string>\n    <string name=\"delete_playlist_prompt\">Iscantzellare custa iscalita\\\\\\?</string>\n    <string name=\"unbookmark_playlist\">Boga su sinnalibru</string>\n    <string name=\"bookmark_playlist\">Annanghe s\\'iscalita a sos preferidos</string>\n    <string name=\"set_as_playlist_thumbnail\">Imposta che a miniadura de s\\'iscalita</string>\n    <string name=\"unmute\">Allughe su sonu</string>\n    <string name=\"mute\">Pone a sa muda</string>\n    <string name=\"add_to_playlist\">Annanghe a s\\'iscalita</string>\n    <string name=\"name\">Nùmene</string>\n    <string name=\"rename_playlist\">Càmbia de nùmene</string>\n    <string name=\"create_playlist\">Iscalita noa</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Carrighende su cuntenutu pedidu</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Otenende informatziones…</string>\n    <string name=\"always_ask_open_action\">Pedi semper</string>\n    <string name=\"popup_player\">Riproduidore a ventanedda</string>\n    <string name=\"background_player\">Riproduidore in s\\'isfundu</string>\n    <string name=\"video_player\">Riproduidore de vìdeos</string>\n    <string name=\"preferred_open_action_settings_summary\">Atzione predefinida cando aberis unu cuntenutu — %s</string>\n    <string name=\"preferred_open_action_settings_title\">Atzione de abertura predefinida</string>\n    <string name=\"drawer_close\">Serra su pannellu</string>\n    <string name=\"drawer_open\">Aberi su pannellu</string>\n    <string name=\"start_here_on_popup\">Incumintza a riproduire in una ventanedda</string>\n    <string name=\"start_here_on_background\">Incumintza a riproduire in s\\'isfundu</string>\n    <string name=\"hold_to_append\">Mantene incarcadu pro pònnere in s\\'elencu</string>\n    <string name=\"play_queue_audio_settings\">Impostatziones àudio</string>\n    <string name=\"play_queue_stream_detail\">Detàllios</string>\n    <string name=\"play_queue_remove\">Boga</string>\n    <string name=\"conferences\">Cunferèntzias</string>\n    <string name=\"most_liked\">Prus agradèssidos</string>\n    <string name=\"recently_added\">Annànghidos dae pagu</string>\n    <string name=\"local\">Locale</string>\n    <string name=\"new_and_hot\">Noos e Populares</string>\n    <string name=\"top_50\">Sos mègius 50</string>\n    <string name=\"trending\">Tendèntzias</string>\n    <string name=\"error_unable_to_load_comments\">Carrigamentu de sos cummentos fallidu</string>\n    <string name=\"import_settings\">Cheres fintzas importare sas impostatziones\\?</string>\n    <string name=\"override_current_data\">Custu at a subraiscrìere sas impostatziones tuas de como.</string>\n    <string name=\"could_not_import_all_files\">Avisu: no est istadu possìbile importare totu sos documentos.</string>\n    <string name=\"no_valid_zip_file\">Perunu documentu ZIP vàlidu</string>\n    <string name=\"import_complete_toast\">Importatzione acabada</string>\n    <string name=\"export_complete_toast\">Esportatzione acabada</string>\n    <string name=\"select_a_kiosk\">Ischerta una pàgina de cuntenutos in evidèntzia personalizados</string>\n    <string name=\"no_channel_subscribed_yet\">Galu peruna iscritzione a sos canales</string>\n    <string name=\"select_a_channel\">Ischerta unu canale</string>\n    <string name=\"channel_page_summary\">Pàgina de su canale</string>\n    <string name=\"default_kiosk_page_summary\">Cuntenutos in evidèntzia predefinidos</string>\n    <string name=\"kiosk_page_summary\">Cuntenutos in evidèntzia personalizados</string>\n    <string name=\"blank_page_summary\">Pàgina bòida</string>\n    <string name=\"main_page_content_summary\">Ischedas benint ammustradas in sa pàgina printzipale</string>\n    <string name=\"main_page_content\">Cuntenutu de sa pàgina printzipale</string>\n    <string name=\"title_most_played\">Prus riproduidos</string>\n    <string name=\"title_last_played\">Ùrtima riprodutzione</string>\n    <string name=\"delete_item_search_history\">Cheres iscantzellare custu elementu dae sa cronologia de chirca\\?</string>\n    <string name=\"action_history\">Cronologia</string>\n    <string name=\"title_activity_history\">Cronologia</string>\n    <string name=\"read_full_license\">Leghe sa litzèntzia</string>\n    <string name=\"app_license\">NewPipe est unu programma lìberu cun litzèntzia copyleft: lu podes impreare, cumpartzire e megiorare comente cheres. Pro èssere prus craros, lu podes torrare a intregare in suta de sos tèrmines de sa Litzèntzia Generale Pùblica GNU publicada dae sa Free Software Foundation, sa versione 3 de sa litzèntzia o, si preferis, una prus noa.</string>\n    <string name=\"app_license_title\">Litzèntzia de NewPipe</string>\n    <string name=\"read_privacy_policy\">Leghe sa polìtica de riservadesa</string>\n    <string name=\"privacy_policy_encouragement\">Su progetu NewPipe pigat sa riservadesa tua in manera sèria a beru. Pro custa resone s\\'aplicatzione non collit perunu datu chene su cunsensu tuo.\n\\n Sa polìtica de riservadesa de NewPipe ispiegat a sa minuda ite genia de datos benint imbiados cando imbias unu raportu de errore.</string>\n    <string name=\"privacy_policy_title\">Polìtica de riservadesa de NewPipe</string>\n    <string name=\"website_encouragement\">Bìsita su situ web de NewPipe pro àteras informatziones e noas.</string>\n    <string name=\"website_title\">Situ web</string>\n    <string name=\"give_back\">Retribui</string>\n    <string name=\"donation_encouragement\">NewPipe benit isvilupadu dae voluntàrios chi impreant su tempus lìberu issoro batende·ti sa mègius esperièntzia de impreadore. Torra·li su favore pro agiudare sos isvilupadores a megiorare NewPipe galu de prus, in su mentres chi si gosant una tzìchera de cafè.</string>\n    <string name=\"donation_title\">Dona</string>\n    <string name=\"view_on_github\">Pòmpia in GitHub</string>\n    <string name=\"contribution_encouragement\">Si tenes ideas pro sa tradutzione, modìficas de su progetu, pro s\\'innetadura de su còdighe o pro modìficas de su còdighe mannas, s\\'agiudu est semper benebènnidu. Prus si faghet e mègius est!</string>\n    <string name=\"contribution_title\">Contribui</string>\n    <string name=\"app_description\">Riprodutzione lìbera e lèbia de trasmissiones (streaming) in Android.</string>\n    <string name=\"tab_licenses\">Litzèntzias</string>\n    <string name=\"tab_about\">Informatziones e PF</string>\n    <string name=\"copyright\">© %1$s de %2$s cun litzèntzia %3$s</string>\n    <string name=\"title_licenses\">Litzèntzias de tertzas partes</string>\n    <string name=\"title_activity_about\">In subra de NewPipe</string>\n    <string name=\"charset_most_special_characters\">Majoria de sos caràteres ispetziales</string>\n    <string name=\"charset_letters_and_digits\">Lìteras e tzifras</string>\n    <string name=\"settings_file_replacement_character_title\">Caràtere de remplasamentu</string>\n    <string name=\"settings_file_replacement_character_summary\">Sos caràteres non vàlidos benint remplasados cun custu valore</string>\n    <string name=\"settings_file_charset_title\">Caràteres permìtidos in sos nùmenes de sos documentos</string>\n    <string name=\"settings_category_downloads_title\">Iscàrriga</string>\n    <string name=\"done\">Fatu</string>\n    <string name=\"recaptcha_request_toast\">B\\'at bisòngiu de risòlvere unu reCAPTCHA</string>\n    <string name=\"subtitle_activity_recaptcha\">Incarca \\\"Fatu\\\" cando est risoltu</string>\n    <string name=\"title_activity_recaptcha\">Disafiu reCAPTCHA</string>\n    <string name=\"one_item_deleted\">1 elementu iscantzelladu.</string>\n    <string name=\"no_available_dir\">Issèbera una cartella de iscarrigamentu prus a tardu in sas impostatziones</string>\n    <string name=\"msg_copied\">Copiadu in punta de billete</string>\n    <string name=\"msg_wait\">Iseta…</string>\n    <string name=\"msg_running_detail\">Toca pro detàllios</string>\n    <string name=\"msg_running\">NewPipe est iscarrighende</string>\n    <string name=\"msg_error\">Errore</string>\n    <string name=\"msg_threads\">Connessiones simultàneas</string>\n    <string name=\"msg_name\">Nùmene de su documentu</string>\n    <string name=\"ok\">AB</string>\n    <string name=\"rename\">Càmbia de nùmene</string>\n    <string name=\"dismiss\">Ignora</string>\n    <string name=\"checksum\">Summa de verìfica</string>\n    <string name=\"delete\">Iscantzella</string>\n    <string name=\"create\">Crea</string>\n    <string name=\"pause\">Pàusa</string>\n    <string name=\"start\">Incumintza</string>\n    <string name=\"no_comments\">Perunu cummentu</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s vìdeos</item>\n        <item quantity=\"other\">%s vìdeu</item>\n    </plurals>\n    <string name=\"infinite_videos\">∞ vìdeos</string>\n    <string name=\"more_than_100_videos\">100+ vìdeos</string>\n    <string name=\"no_videos\">Perunu vìdeu</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s ascurtadore</item>\n        <item quantity=\"other\">%s ascurtadores</item>\n    </plurals>\n    <string name=\"no_one_listening\">Nemos est ascurtende</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s est pompiende</item>\n        <item quantity=\"other\">%s sunt pompiende</item>\n    </plurals>\n    <string name=\"no_one_watching\">Nemos est pompiende</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s visualizatzione</item>\n        <item quantity=\"other\">%s visualizatziones</item>\n    </plurals>\n    <string name=\"no_views\">Peruna visualizatzione</string>\n    <string name=\"subscribers_count_not_available\">Contadore de sos iscritos non disponìbile</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s iscritu</item>\n        <item quantity=\"other\">%s iscritos</item>\n    </plurals>\n    <string name=\"no_subscribers\">Perunu iscritu</string>\n    <string name=\"drawer_header_description\">Allughe/istuda su servìtziu. Ischertadu como:</string>\n    <string name=\"retry\">Torra a proare</string>\n    <string name=\"audio\">Àudio</string>\n    <string name=\"video\">Vìdeu</string>\n    <string name=\"detail_drag_description\">Traga pro torrare a ordinare</string>\n    <string name=\"empty_list_subtitle\">Non b\\'at nudda inoghe</string>\n    <string name=\"search_no_results\">Perunu resurtadu</string>\n    <string name=\"detail_dislikes_img_view_description\">Disagradessimentos</string>\n    <string name=\"detail_likes_img_view_description\">Agradessimentos</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Miniadura de s\\'avatar de su carrigadore</string>\n    <string name=\"detail_thumbnail_view_description\">Riprodui su vìdeu, longària:</string>\n    <string name=\"error_details_headline\">Detàllios:</string>\n    <string name=\"your_comment\">Su cummentu tuo (in inglesu):</string>\n    <string name=\"what_happened_headline\">Ite est acontèssidu:</string>\n    <string name=\"what_device_headline\">Informatziones:</string>\n    <string name=\"error_snackbar_action\">Sinnala</string>\n    <string name=\"error_report_button_text\">Sinnala cun sa posta eletrònica</string>\n    <string name=\"sorry_string\">Iscusa, custu non diat dèpere èssere acontèssidu.</string>\n    <string name=\"permission_display_over_apps\">Fruni su permissu pro l\\'ammustrare in subra de àteras aplicatziones</string>\n    <string name=\"restore_defaults_confirmation\">Cheres ripristinare sos valores predefinidos\\?</string>\n    <string name=\"restore_defaults\">Riprìstina sos predefinidos</string>\n    <string name=\"saved_tabs_invalid_json\">No est istadu possìbile lèghere sas ischedas sarbadas. S\\'ant a impreare sas predefinidas</string>\n    <string name=\"no_streams_available_download\">Perunu flussu a disponimentu pro s\\'iscarrigamentu</string>\n    <string name=\"error_occurred_detail\">B\\'at àpidu un\\'errore: %1$s</string>\n    <string name=\"file_name_empty_error\">Su nùmene de su documentu non podet èssere bòidu</string>\n    <string name=\"invalid_file\">Su documentu no esistit o mancat su permissu pro lèghere e pro b\\'iscrìere cosa</string>\n    <string name=\"invalid_source\">Custa fonte de documentos o cuntenutos no esistit</string>\n    <string name=\"invalid_directory\">Sa cartella no esistit</string>\n    <string name=\"missing_file\">Documentu iscostiadu o iscantzelladu</string>\n    <string name=\"audio_streams_empty\">Peruna trasmissione àudio agatada</string>\n    <string name=\"video_streams_empty\">Perunu flussu de vìdeu agatadu</string>\n    <string name=\"external_player_unsupported_link_type\">Sos riproduidores esternos non suportant custas castas de ligàmenes</string>\n    <string name=\"player_recoverable_failure\">Riprìstinu a pustis de s\\'errore de su riproduidore</string>\n    <string name=\"player_unrecoverable_failure\">B\\'at àpidu un\\'errore de su riproduidore non recuperàbile</string>\n    <string name=\"player_stream_failure\">Riprodutzione de custu flussu fallida</string>\n    <string name=\"app_ui_crash\">S\\'apl./s\\'IU s\\'est serrada</string>\n    <string name=\"no_playlist_bookmarked_yet\">Galu perunu sinnalibru de iscalitas</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Pensas chi su carrigamentu de sa fonte de cuntenutos (su feed) siat tropu lentu\\? Si est gasi, proa a abilitare su carrigamentu lestru (lu podes mudare in sas impostatziones o incarchende su butone inoghe in suta).\n\\n\n\\nNewPipe oferit duas istrategias de carrigamentu de sas fontes de cuntenutos:\n\\n • Recuperende totu su canale de iscritzione, cosa chi est lenta ma prus cumprida.\n\\n • Impreende unu puntu de essida de unu servìtziu dedicadu, cosa chi est lestra ma, de sòlitu, non cumprida.\n\\n\n\\nSa diferèntzia printzipale intre sas duas est su fatu chi cun sa lestra, de sòlitu, unas cantas informatziones mancant, che a sa longària de s\\'elementu o sa casta sua (non podet bìdere sa diferèntzia intre sos vìdeos indireta e sos chi sunt normales) diat pòdere frunire prus pagos elementos.\n\\n\n\\nYouTube est un\\'esèmpiu de unu servìtziu chi frunit custu mètodu lestru cun sa fonte de cuntenutos RSS sua.\n\\n\n\\nDuncas s\\'issèberu dipendet dae su chi preferis tue: sa lestresa o sas informatziones a sa minuda.</string>\n    <string name=\"downloads_storage_use_saf_summary\">Sa \\'Storage Access Framework\\' (Istrutura de Atzessu a s\\'Archiviatzione) permitet sos iscarrigamentos in un\\'ischeda SD esterna</string>\n    <string name=\"queued\">postu in lista</string>\n    <string name=\"updates_setting_description\">Ammustra una notìfica pro cussigiare un\\'agiornamentu de s\\'aplicatzione cando b\\'est una versione noa a disponimentu</string>\n    <string name=\"import_soundcloud_instructions\">Importa unu profilu de SoundCloud iscriende o s\\'URL o su còdighe identificativu (ID) tuo:\n\\n\n\\n 1. Abìlita sa modalidade \\\"pro elaboradores de iscrivania\\\" in unu navigadore web (custu situ no est a disponimentu pro dispositivos mòbiles)\n\\n 2. Bae a custu URL: %1$s\n\\n 3. Intra in su contu tuo cando ti lu benit pedidu\n\\n 4. Còpia s\\'URL de su profilu a ue ses istadu mandadu.</string>\n    <string name=\"export_ongoing\">Esportende…</string>\n    <string name=\"msg_popup_permission\">B\\'at bisòngiu de custu permissu pro\n\\nabèrrere sa modalidade ventanedda</string>\n    <string name=\"info_labels\">Ite:\\nRechesta:\\nLimba de su cuntenutu\\nIstadu de su cuntenutu:\\nLimba de s\\'aplicatzione:\\nServìtziu:\\nOràriu GMT:\\nPachete:\\nVersione:\\nVersione SO:</string>\n    <string name=\"error_snackbar_message\">A dolu mannu b\\'at àpidu carchi problema.</string>\n    <string name=\"search_history_deleted\">Cronologia de chirca iscantzellada</string>\n    <string name=\"restricted_video\">Custu vìdeu tenet unu lìmite de edade.\n\\n\n\\nAllughe \\\"%1$s\\\" in sas impostatziones si lu cheres pompiare.</string>\n    <string name=\"no_player_found_toast\">Perunu riproduidore de flussos agatadu (pro lu riproduire podes installare VLC).</string>\n    <string name=\"playlist_page_summary\">Pàgina de s\\'iscalita</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Ammustra petzi sas iscritziones no agrupadas</string>\n    <string name=\"select_a_playlist\">Ischerta un\\'iscalita</string>\n    <string name=\"error_report_open_github_notice\">Pro praghere verìfica si esistit giai una sinnalatzione chi chistionat de s\\'arrestu anòmalu tuo. Creende sinnalatziones dòpias nos pigas tempus chi diamus pòdere impreare pro acontzare su problema.</string>\n    <string name=\"error_report_open_issue_button_text\">Sinnala in GitHub</string>\n    <string name=\"copy_for_github\">Còpia su raportu formatadu</string>\n    <string name=\"search_showing_result_for\">Ammustrende sos resurtados pro: %s</string>\n    <string name=\"video_detail_by\">De %s</string>\n    <string name=\"channel_created_by\">Creadu dae %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Miniadura de avatar de su canale</string>\n    <string name=\"content_not_supported\">Custu cuntenutu no est galu suportadu dae NewPipe.\n\\n\n\\n Isperamus chi at a èssere suportadu in una versione benidora.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Disabìlita sa modalidade lestra</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Abìlita sa modalidade lestra</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">A disponimentu in unos cantos servìtzios, de sòlitu est meda prus lestru ma diat pòdere frunire unu nùmeru limitadu de elementos e, fatu-fatu, informatziones no intreas (es. peruna longària, casta de elementu, indicadore de istadu in direta)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Recùperu dae una fonte de cuntenutos dedicada, cando est a disponimentu</string>\n    <string name=\"feed_update_threshold_option_always_update\">Agiorna semper</string>\n    <string name=\"feed_update_threshold_summary\">Tempus chi depet colare a pustis de s\\'ùrtimu agiornamentu, in antis chi un\\'abbonamentu bèngiat cunsideradu tropu betzu — %s</string>\n    <string name=\"feed_update_threshold_title\">Lìmite de agiornamentu de sa fonte de cuntenutos</string>\n    <string name=\"settings_category_feed_title\">Fonte de cuntenutos</string>\n    <string name=\"feed_create_new_group_button_title\">Nou</string>\n    <string name=\"feed_group_dialog_delete_message\">Cheres iscantzellare custu grupu\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Su nùmene de su grupu est bòidu</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d ischertadu</item>\n        <item quantity=\"other\">%d ischertados</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Perunu abbonamentu ischertadu</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Ischerta sas iscritziones</string>\n    <string name=\"feed_processing_message\">Protzessende sa fonte de cuntenutos…</string>\n    <string name=\"feed_notification_loading\">Carrighende sa fonte de cuntenutos…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Non carrigadas: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Ùrtimu agiornamentu de sa fonte (feed): %s</string>\n    <string name=\"feed_groups_header_title\">Grupos de canales</string>\n    <string name=\"fragment_feed_title\">Ite b\\'at de nou</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dies</item>\n        <item quantity=\"other\">%d die</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d ora</item>\n        <item quantity=\"other\">%d oras</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minutu</item>\n        <item quantity=\"other\">%d minutos</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d segundos</item>\n        <item quantity=\"other\">%d segundu</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Pro more de sos lìmites de ExoPlayer sa longària de s\\'iscostiamentu lestru est istada impostada a %d segundos</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Eja, e fintzas sos vìdeos pompiados in parte</string>\n    <string name=\"remove_watched_popup_warning\">Sos vìdeos pompiados in antis e a pustis de los àere annànghidos a s\\'iscalita ant a èssere bogados. \\n Seguru ses? Custu no est reversìbile!</string>\n    <string name=\"remove_watched_popup_title\">Bogare sos elementos pompiados?</string>\n    <string name=\"remove_watched\">Boga sos elementos pompiados</string>\n    <string name=\"systems_language\">Predefinida de su sistema</string>\n    <string name=\"app_language_title\">Limba de s\\'aplicatzione</string>\n    <string name=\"choose_instance_prompt\">Issèbera un\\'istàntzia</string>\n    <string name=\"downloads_storage_use_saf_title\">Imprea s\\'ischertadore de cartellas de sistema (SAF)</string>\n    <string name=\"downloads_storage_ask_summary\">T\\'at a bènnere pedidu in ue sarvare cada documentu.\n\\nAbìlita s\\'ischertadore de cartellas de sistema (SAF) si cheres iscarrigare in un\\'ischeda SD esterna</string>\n    <string name=\"downloads_storage_ask_title\">Pedi in ue iscarrigare</string>\n    <string name=\"pause_downloads\">Pone in pàusa sos iscarrigamentos</string>\n    <string name=\"start_downloads\">Faghe incumintzare sos iscarrigamentos</string>\n    <string name=\"enable_queue_limit_desc\">B\\'at a èssere petzi un\\'iscarrigamentu a sa borta</string>\n    <string name=\"enable_queue_limit\">Lìmita s\\'elencu de iscarrigamentu</string>\n    <string name=\"close\">Serra</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Discansosu cando colas a sos datos mòbiles, fintzas si unoscantos iscarrigamentos non podent èssere postos in pàusa</string>\n    <string name=\"pause_downloads_on_mobile\">Firma cun sas connessiones a consumu</string>\n    <string name=\"max_retry_desc\">Nùmeru màssimu de tentativos in antis chi s\\'annullet s\\'iscarrigamentu</string>\n    <string name=\"max_retry_msg\">Tentativos màssimos</string>\n    <string name=\"stop\">Firma</string>\n    <string name=\"delete_downloaded_files\">Iscantzella sos documentos iscarrigados</string>\n    <string name=\"confirm_prompt\">Cheres isboidare sa cronologia de sos iscarrigamentos tuos o iscantzellare totu sos documentos iscarrigados\\?</string>\n    <string name=\"clear_download_history\">Isbòida sa cronologia de sos iscarrigamentos</string>\n    <string name=\"error_download_resource_gone\">Impossìbile recuperare custu iscarrigamentu</string>\n    <string name=\"error_timeout\">Connessione iscadida</string>\n    <string name=\"error_progress_lost\">Su progressu s\\'est pèrdidu, ca su documentu est istadu iscantzelladu</string>\n    <string name=\"error_insufficient_storage_left\">Perunu ispàtziu abarradu in su dispositivu</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe est istadu serradu in su mentres chi fiat traballende a su documentu</string>\n    <string name=\"error_postprocessing_failed\">Post-protzessamentu fallidu</string>\n    <string name=\"error_http_not_found\">No agatadu</string>\n    <string name=\"error_http_unsupported_range\">Custu serbidore no atzetat iscarrigamentos a filos mùltiplos, torra a proare cun @string/msg_threads = 1</string>\n    <string name=\"error_http_no_content\">Su serbidore no imbiat datos</string>\n    <string name=\"error_connect_host\">Connessione a su serbidore impossìbile</string>\n    <string name=\"error_unknown_host\">No est istadu possìbile agatare su serbidore</string>\n    <string name=\"error_ssl_exception\">No est istadu possìbile istabilire una connessione segura</string>\n    <string name=\"error_path_creation\">Sa cartella de destinatzione non podet èssere creada</string>\n    <string name=\"error_file_creation\">Su documentu non podet èssere creadu</string>\n    <string name=\"show_error\">Ammustra s\\'errore</string>\n    <string name=\"download_already_pending\">B\\'est un\\'iscarrigamentu in isetu cun custu nùmene</string>\n    <string name=\"download_already_running\">B\\'est un\\'iscarrigamentu in cursu cun custu nùmene</string>\n    <string name=\"overwrite_failed\">impossìbile subraiscrìere su documentu</string>\n    <string name=\"overwrite_finished_warning\">B\\'est giai unu documentu iscarrigadu cun custu nùmene</string>\n    <string name=\"overwrite_unrelated_warning\">B\\'est giai unu documentu cun custu nùmene</string>\n    <string name=\"overwrite\">Subraiscrie</string>\n    <string name=\"generate_unique_name\">Ingendra unu nùmene ùnivocu</string>\n    <string name=\"download_failed\">Iscarrigamentu fallidu</string>\n    <string name=\"permission_denied\">Atzione vietada dae su sistema</string>\n    <string name=\"enqueue\">Pone in lista</string>\n    <string name=\"recovering\">recuperende</string>\n    <string name=\"post_processing\">post-protzessamentu</string>\n    <string name=\"paused\">in pàusa</string>\n    <string name=\"missions_header_pending\">In isetu</string>\n    <string name=\"missions_header_finished\">Acabadu</string>\n    <string name=\"app_update_available_notification_title\">B\\'est un\\'agiornamentu de NewPipe disponìbile!</string>\n    <string name=\"auto\">Automàtica</string>\n    <string name=\"grid\">Grìllia</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"list_view_mode\">Modalidade de vista de sa lista</string>\n    <string name=\"minimize_on_exit_popup_description\">Mìnima in su riproduidore a ventanedda</string>\n    <string name=\"minimize_on_exit_background_description\">Mìnima in s\\'isfundu</string>\n    <string name=\"minimize_on_exit_none_description\">Nudda</string>\n    <string name=\"minimize_on_exit_summary\">Atzione cando colas a un\\'àtera aplicatzione dae su riproduidore de vìdeos printzipale — %s</string>\n    <string name=\"minimize_on_exit_title\">Mìnima mudende aplicatzione</string>\n    <string name=\"updates_setting_title\">Agiornamentos</string>\n    <string name=\"limit_mobile_data_usage_title\">Lìmita sa risolutzione durante s\\'impreu de sos datos mòbiles</string>\n    <string name=\"limit_data_usage_none_description\">Perunu lìmite</string>\n    <string name=\"decline\">Refuda</string>\n    <string name=\"accept\">Atzeto</string>\n    <string name=\"start_accept_privacy_policy\">Pro pòdere rispetare su Regulamentu Europeu Generale de Amparu de sos Datos (GDPR) ti pedimus de dare cara a sa polìtica de riservadesa de NewPipe.\n\\n La depes atzetare pro nos pòdere imbiare sa sinnalatzione de errore.</string>\n    <string name=\"playback_reset\">Reseta</string>\n    <string name=\"playback_step\">Passu</string>\n    <string name=\"skip_silence_checkbox\">Avantzamentu lestru durante su silèntziu</string>\n    <string name=\"unhook_checkbox\">Iscollega (diat pòdere causare istorchimentos)</string>\n    <string name=\"playback_pitch\">Tonu</string>\n    <string name=\"playback_tempo\">Ritmu</string>\n    <string name=\"playback_speed_control\">Controllos de sa lestresa de riprodutzione</string>\n    <string name=\"import_network_expensive_warning\">Ammenta·ti chi custa operatzione diat pòdere impreare meda sa retza tua.\n\\n\n\\n Cheres sighire\\?</string>\n    <string name=\"import_soundcloud_instructions_hint\">IDtuo, soundcloud.com/IDtuo</string>\n    <string name=\"could_not_setup_download_menu\">Impostatzione de su menù de iscarrigamentu fallida</string>\n    <string name=\"content_not_available\">Cuntenutu no a disponimentu</string>\n    <string name=\"parsing_error\">Anàlisi de su situ web fallida</string>\n    <string name=\"could_not_load_thumbnails\">No est istadu possìbile carrigare totu sas miniaduras</string>\n    <string name=\"network_error\">Errore de retza</string>\n    <string name=\"download_to_sdcard_error_message\">Impossìbile iscarrigare in s\\'ischeda SD esterna. Cheres resetare sa positzione de sa cartella de iscarrigamentu\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Memòria esterna non disponìbile</string>\n    <string name=\"general_error\">Errore</string>\n    <string name=\"delete_search_history_alert\">Cheres iscantzellare totu sa cronologia de sas chircas\\?</string>\n    <string name=\"clear_search_history_summary\">Iscantzella sa cronologia de sas paràulas chircadas</string>\n    <string name=\"clear_search_history_title\">Iscantzella sa cronologia de chirca</string>\n    <string name=\"watch_history_states_deleted\">Positziones de riprodutzione iscantzelladas</string>\n    <string name=\"delete_playback_states_alert\">Cheres iscantzellare totu sas positziones de riprodutzione\\?</string>\n    <string name=\"clear_playback_states_summary\">Iscantzella totu sas positziones de riprodutzione</string>\n    <string name=\"clear_playback_states_title\">Iscantzella sas positziones de riprodutzione</string>\n    <string name=\"watch_history_deleted\">Cronologia de sos pompiados iscantzellada</string>\n    <string name=\"delete_view_history_alert\">Cheres iscantzellare totu sa cronologia de sos pompiados\\?</string>\n    <string name=\"clear_views_history_summary\">Iscantzellat sa cronologia de sos cuntenutos riproduidos e sas positziones de riprodutzione</string>\n    <string name=\"clear_views_history_title\">Isbòida sa cronologia de sos pompiados</string>\n    <string name=\"export_data_summary\">Esporta sa cronologia, sos abbonamentos, sas iscalitas e sas impostatziones</string>\n    <string name=\"import_data_summary\">Subraiscriet sa cronologia, sos abbonamentos, sas iscalita e (optzionalmente) sas impostatziones tuas atuales</string>\n    <string name=\"export_data_title\">Esporta sa base de datos</string>\n    <string name=\"import_data_title\">Importa sa base de datos</string>\n    <string name=\"switch_to_main\">Cola a sa modalidade printzipale</string>\n    <string name=\"switch_to_popup\">Cola a sa ventanedda</string>\n    <string name=\"switch_to_background\">Cola a s\\'isfundu</string>\n    <string name=\"unknown_content\">[Disconnotu]</string>\n    <string name=\"app_update_notification_channel_description\">Notìficas pro sas versiones noas de NewPipe</string>\n    <string name=\"app_update_notification_channel_name\">Notìfica de agiornamentu de s\\'aplicatzione</string>\n    <string name=\"notification_channel_description\">Notìficas pro su riproduidore de NewPipe</string>\n    <string name=\"notification_channel_name\">Notìficas de NewPipe</string>\n    <string name=\"file\">Documentu</string>\n    <string name=\"just_once\">Una borta ebbia</string>\n    <string name=\"always\">Semper</string>\n    <string name=\"play_all\">Riprodui totu</string>\n    <string name=\"file_deleted\">Documentu iscantzelladu</string>\n    <string name=\"undo\">Annulla</string>\n    <string name=\"best_resolution\">Risolutzione mègius</string>\n    <string name=\"clear\">Isbòida</string>\n    <string name=\"disabled\">Disabilitadu</string>\n    <string name=\"artists\">Artista</string>\n    <string name=\"albums\">Albums</string>\n    <string name=\"songs\">Cantzones</string>\n    <string name=\"events\">Eventos</string>\n    <string name=\"users\">Impreadores</string>\n    <string name=\"tracks\">Rastas</string>\n    <string name=\"videos_string\">Vìdeos</string>\n    <string name=\"playlists\">Iscalitas</string>\n    <string name=\"channels\">Canales</string>\n    <string name=\"all\">Totu</string>\n    <string name=\"error_report_title\">Sinnalatzione de errores</string>\n    <string name=\"downloads_title\">Iscarrigamentos</string>\n    <string name=\"downloads\">Iscarrigamentos</string>\n    <string name=\"duration_live\">In direta</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Allughe sa modalidade cun restritziones de YouTube</string>\n    <string name=\"show_age_restricted_content_title\">Ammustra sos cuntenutos limitados pro edade</string>\n    <string name=\"content\">Cuntenutos</string>\n    <string name=\"popup_playing_toast\">Riproduende in modalidade a ventanedda</string>\n    <string name=\"background_player_playing_toast\">Riproduende in s\\'isfundu</string>\n    <string name=\"settings_category_updates_title\">Agiornamentos</string>\n    <string name=\"settings_category_debug_title\">Depuratzione de errores</string>\n    <string name=\"settings_category_appearance_title\">Aparèntzia</string>\n    <string name=\"settings_category_history_title\">Cronologia e memòria temporànea</string>\n    <string name=\"settings_category_video_audio_title\">Vìdeos e àudio</string>\n    <string name=\"settings_category_player_behavior_title\">Cumportamentu</string>\n    <string name=\"settings_category_player_title\">Riproduidore</string>\n    <string name=\"peertube_instance_add_exists\">S\\'istàntzia esistit giai</string>\n    <string name=\"peertube_instance_add_https_only\">Petzi sos URL HTTPS sunt suportados</string>\n    <string name=\"peertube_instance_add_fail\">Impossìbile cunvalidare s\\'istàntzia</string>\n    <string name=\"peertube_instance_add_help\">Inserta s\\'URL de s\\'istàntzia</string>\n    <string name=\"peertube_instance_add_title\">Annanghe un\\'istàntzia</string>\n    <string name=\"peertube_instance_url_help\">Agata sas istàntzias chi t\\'agradant in %s</string>\n    <string name=\"peertube_instance_url_summary\">Ischerta sas istàntzias de PeerTube preferidas tuas</string>\n    <string name=\"peertube_instance_url_title\">Istàntzias de PeerTube</string>\n    <string name=\"content_language_title\">Limba predefinida pro sos cuntenutos</string>\n    <string name=\"default_content_country_title\">Istadu predefinidu pro sos cuntenutos</string>\n    <string name=\"unsupported_url\">URL non suportadu</string>\n    <string name=\"show_hold_to_append_summary\">Ammustra un\\'impòsitu cando incarcas in su butone de isfundu o de sa ventanedda in sa pàgina de sos detàllios de unu vìdeu</string>\n    <string name=\"show_hold_to_append_title\">Ammustra s\\'impòsitu \\\"Mantene incarcadu pro pònnere in lista\\\"</string>\n    <string name=\"show_next_and_similar_title\">Ammustra sos vìdeos imbenientes e simigiantes</string>\n    <string name=\"autoplay_title\">Riprodutzione automàtica</string>\n    <string name=\"download_dialog_title\">Iscàrriga</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Sighi a riproduire a pustis de sas interrutziones (a es. una mutida)</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Sighi a riproduire</string>\n    <string name=\"enable_watch_history_summary\">Sarva sa cronologia de sos elementos pompiados</string>\n    <string name=\"settings_category_clear_data_title\">Isbòida sos datos</string>\n    <string name=\"enable_playback_state_lists_summary\">Ammustra sos indicadores de sa positzione de riprodutzione in sas listas</string>\n    <string name=\"enable_playback_state_lists_title\">Positziones in sas listas</string>\n    <string name=\"enable_playback_resume_summary\">Riprìstina s\\'ùrtima positzione de riprodutzione</string>\n    <string name=\"enable_playback_resume_title\">Sighi cun sa riprodutzione</string>\n    <string name=\"enable_watch_history_title\">Cronologia de sos pompiados</string>\n    <string name=\"enable_search_history_summary\">Sarva sas chircas in locale</string>\n    <string name=\"enable_search_history_title\">Cronologia de sas chircas</string>\n    <string name=\"show_search_suggestions_summary\">Issèbera sos consìgios de ammustrare in sas chircas</string>\n    <string name=\"show_search_suggestions_title\">Cussìgios de chirca</string>\n    <string name=\"auto_queue_summary\">Sighi a riproduire (chene ripetitziones) annanghende unu vìdeu correladu a sa lista</string>\n    <string name=\"auto_queue_title\">Annanghe in automàticu su flussu imbeniente a sa lista</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Memòria temporànea de sos metadatos iscarrigada</string>\n    <string name=\"metadata_cache_wipe_summary\">Boga totu sos datos de sa pàgina web in sa memòria temporànea</string>\n    <string name=\"metadata_cache_wipe_title\">Iscantzella sos metadatos in sa memòria temporànea</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Memòria temporànea de sas immàgines isboidada</string>\n    <string name=\"show_comments_summary\">Istuda pro cuare sos cummentos</string>\n    <string name=\"show_comments_title\">Ammustra sos cummentos</string>\n    <string name=\"seek_duration_title\">Longària de s\\'avantzamentu e de sa torrada in segus lestros</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"use_inexact_seek_title\">Imprea su moimentu inesatu lestru</string>\n    <string name=\"popup_remember_size_pos_title\">Ammenta sas propriedades de sa ventanedda</string>\n    <string name=\"black_theme_title\">Nieddu</string>\n    <string name=\"dark_theme_title\">Iscuru</string>\n    <string name=\"light_theme_title\">Craru</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"default_video_format_title\">Formadu vìdeu predefinidu</string>\n    <string name=\"default_audio_format_title\">Formadu àudio predefinidu</string>\n    <string name=\"play_audio\">Àudio</string>\n    <string name=\"show_play_with_kodi_summary\">Ammustra un\\'optzione pro riproduire unu vìdeu pro mèdiu de su tentru multimediale Kodi</string>\n    <string name=\"show_play_with_kodi_title\">Ammustra s\\'optzione \\\"Riprodui cun Kodi\\\"</string>\n    <string name=\"kore_not_found\">Cheres installare s\\'aplicatzione Kore chi mancat\\?</string>\n    <string name=\"play_with_kodi_title\">Riprodui cun Kodi</string>\n    <string name=\"show_higher_resolutions_summary\">Petzi unos cantos dispositivos podent riproduire vìdeos in 2K/4K</string>\n    <string name=\"show_higher_resolutions_title\">Ammustra sas risolutziones prus artas</string>\n    <string name=\"default_popup_resolution_title\">Risolutzione predefinida de sa ventanedda</string>\n    <string name=\"default_resolution_title\">Risolutzione predefinida</string>\n    <string name=\"download_path_audio_dialog_title\">Issèbera sa cartella de iscarrigamentu pro sos documentos àudio</string>\n    <string name=\"download_path_audio_summary\">Sos documentos àudio iscarrigados benint sarvados inoghe</string>\n    <string name=\"download_path_audio_title\">Cartella de iscarrigamentu de s\\'àudio</string>\n    <string name=\"download_path_dialog_title\">Issèbera sa cartella de iscarrigamentu pro sos documentos de sos vìdeos</string>\n    <string name=\"download_path_summary\">Sos documentos de sos vìdeos benint sarvados inoghe</string>\n    <string name=\"download_path_title\">Cartella de iscarrigamentu de sos vìdeos</string>\n    <string name=\"controls_add_to_playlist_title\">Annanghe a</string>\n    <string name=\"controls_popup_title\">Ventanedda</string>\n    <string name=\"controls_background_title\">Isfundu</string>\n    <string name=\"tab_choose\">Issèbera un\\'ischeda</string>\n    <string name=\"tab_bookmarks\">Iscalitas sarvadas</string>\n    <string name=\"tab_subscriptions\">Iscritziones</string>\n    <string name=\"show_info\">Ammustra sas informatziones</string>\n    <string name=\"subscription_update_failed\">Agiornamentu de s\\'iscritzione fallidu</string>\n    <string name=\"subscription_change_failed\">Mudadura de s\\'iscritzione fallida</string>\n    <string name=\"channel_unsubscribed\">Non ses prus iscritu a su canale</string>\n    <string name=\"unsubscribe\">Boga s\\'iscritzione</string>\n    <string name=\"subscribed_button_title\">Iscritu</string>\n    <string name=\"subscribe_button_title\">Iscrie·ti</string>\n    <string name=\"use_external_audio_player_title\">Imprea unu riproduidore àudio esternu</string>\n    <string name=\"use_external_video_player_summary\">Bogat s\\'àudio pro unas cantas risolutziones</string>\n    <string name=\"use_external_video_player_title\">Imprea unu riproduidore de vìdeos esternu</string>\n    <string name=\"share_dialog_title\">Cumpartzi cun</string>\n    <string name=\"did_you_mean\">Cherias nàrrere \\\"%1$s\\\"\\?</string>\n    <string name=\"settings\">Impostatziones</string>\n    <string name=\"search\">Chirca</string>\n    <string name=\"controls_download_desc\">Iscàrriga su documentu de trasmissione</string>\n    <string name=\"download\">Iscarriga</string>\n    <string name=\"share\">Cumpartzi</string>\n    <string name=\"open_in_popup_mode\">Aberi in sa modalidade a ventanedda</string>\n    <string name=\"open_in_browser\">Aberi in su navigadore web</string>\n    <string name=\"cancel\">Annulla</string>\n    <string name=\"install\">Installa</string>\n    <string name=\"no_player_found\">Perunu riproduidore de flussos agatadu. Cheres installare VLC\\?</string>\n    <string name=\"upload_date_text\">Publicadu su %1$s</string>\n    <string name=\"main_bg_subtitle\">Toca sa lente de ismanniamentu pro incumintzare.</string>\n    <string name=\"never\">Mai</string>\n    <string name=\"wifi_only\">Cun su Wi-Fi ebbia</string>\n    <string name=\"autoplay_summary\">Incumintza cun sa riprodutzione automaticamente — %s</string>\n    <string name=\"title_activity_play_queue\">Lista de riprodutzione</string>\n    <string name=\"unsupported_url_dialog_message\">Reconnoschimentu de s\\'URL fallidu. Lu cheres abèrrere cun un\\'àtera aplicatzione\\?</string>\n    <string name=\"auto_queue_toggle\">Annanghidura automàtica a sa lista</string>\n    <string name=\"clear_queue_confirmation_description\">Sa lista dae su riproduidore ativu at a èssere remplasada</string>\n    <string name=\"clear_queue_confirmation_summary\">Colende dae unu riproduidore a s\\'àteru dias pòdere remplasare sa lista tua</string>\n    <string name=\"clear_queue_confirmation_title\">Pedi una cunfirma in antis de iscantzellare una lista</string>\n    <string name=\"notification_action_shuffle\">Òrdine casuale</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_scale_to_square_image_summary\">Sega sa miniadura ammustrada in sa notìfica dae su formadu in 16:9 a cussu 1:1</string>\n    <string name=\"notification_action_nothing\">Nudda</string>\n    <string name=\"notification_action_buffering\">Carrighende</string>\n    <string name=\"notification_action_repeat\">Repite</string>\n    <string name=\"notification_actions_at_most_three\">Podes ischertare a su màssimu tres atziones de ammustrare in sas notìficas cumpatas!</string>\n    <string name=\"notification_action_4_title\">Su de chimbe butones de atzione</string>\n    <string name=\"notification_action_3_title\">Su de bator butones de atzione</string>\n    <string name=\"notification_action_2_title\">Su de tres butones de atzione</string>\n    <string name=\"notification_action_1_title\">Su de duos butones de atzione</string>\n    <string name=\"notification_action_0_title\">Su de unu butone de atzione</string>\n    <string name=\"notification_scale_to_square_image_title\">Sega sa miniadura in formadu 1:1</string>\n    <string name=\"show_memory_leaks\">Ammustra sas pèrdidas de memòria</string>\n    <string name=\"enqueued\">Annànghidu a sa lista</string>\n    <string name=\"enqueue_stream\">Pone in lista</string>\n    <string name=\"clear_cookie_summary\">Iscantzella sos testimòngios chi NewPipe sarvat cando risolves unu reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">As isboidadu sos testimòngios reCAPTCHA</string>\n    <string name=\"clear_cookie_title\">Isbòida sos testimòngios reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube frunit una \\\"Modalidade cun restritziones\\\" chi cuat sos cuntenudos chi diant pòdere èssere pro adultos</string>\n    <string name=\"show_age_restricted_content_summary\">Ammustra sos cuntenutos chi diant pòdere no èssere adatos pro sos pitzinnos ca tenent unu lìmite de edade (che a 18+)</string>\n    <string name=\"notification_colorize_summary\">Pedi a Android de personalizare su colore de sa notìfica sighende su colore printzipale de sa miniadura (ammenta·ti chi custu no est a disponimentu pro totu sos dispositivos)</string>\n    <string name=\"notification_colorize_title\">Colora sas notìficas</string>\n    <string name=\"popup_remember_size_pos_summary\">Ammenta s\\'ùrtima mannària e sa positzione in sa ventanedda</string>\n    <string name=\"show_thumbnail_summary\">Imprea sa miniatura siat comente isfundu de s\\'ischermada de blocu e siat in sas notìficas</string>\n    <string name=\"show_thumbnail_title\">Ammustra sa miniatura</string>\n    <string name=\"msg_calculating_hash\">Carculende s\\'hash</string>\n    <string name=\"hash_channel_description\">Notìficas pro su protzessu de hashàgiu de su vìdeu</string>\n    <string name=\"hash_channel_name\">Notìfica de hash de su vìdeu</string>\n    <string name=\"recent\">Reghente</string>\n    <string name=\"show_meta_info_summary\">Istuda·lu pro cuare sas iscatuleddas cun informatziones additzionales in subra de su creadore de su flussu, de su cuntenutu de su flussu o de una rechesta de chirca</string>\n    <string name=\"show_meta_info_title\">Ammustra informatziones meta</string>\n    <string name=\"no_app_to_open_intent\">Peruna aplicatzione in su dispositivu tuo podet abèrrere custu</string>\n    <string name=\"chapters\">Capìtulos</string>\n    <string name=\"description_tab_description\">Descritzione</string>\n    <string name=\"related_items_tab_description\">Flussos ligados</string>\n    <string name=\"comments_tab_description\">Cummentos</string>\n    <string name=\"show_description_summary\">Istuda pro cuare sa descritzione de su vìdeu e sas informatziones additzionales</string>\n    <string name=\"show_description_title\">Ammustra sa descritzione</string>\n    <string name=\"open_with\">Aberi cun</string>\n    <string name=\"paid_content\">Custu vìdeu est a disponimentu petzi pro sos impreadores chi ant pagadu, e duncas non podet èssere riproduidu o iscarrigadu dae NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Custu vìdeu est a disponimentu petzi pro sos membros de YouTube Music Premium, e duncas non podet èssere riproduidu o iscarrigadu dae NewPipe.</string>\n    <string name=\"private_content\">Custu cuntenutu est privadu, e duncas non podet èssere riproduidu o iscarrigadu dae NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Custa est una rasta SoundCloud Go+, a su mancu in su paisu tuo, e duncas non podet èssere riproduida o iscarrigada dae NewPipe.</string>\n    <string name=\"georestricted_content\">Custu cuntenutu no est a disponimentu in su paisu tuo.</string>\n    <string name=\"crash_the_app\">Faghe serrare s\\'aplicatzione</string>\n    <string name=\"restricted_video_no_stream\">Custu vìdeu tenet unu lìmite de edade.\n\\nPro neghe de sas polìticas noas de YouTube in subra de sos vìdeos limitados pro edade, NewPipe non podet atzèdere a perunu flussu vìdeu de custa genia e duncas non los podet riproduire.</string>\n    <string name=\"radio\">Ràdiu</string>\n    <string name=\"featured\">In evidèntzia</string>\n    <string name=\"recaptcha_solve\">Risolve</string>\n    <string name=\"download_has_started\">S\\'iscarrigamentu est incumintzadu</string>\n    <string name=\"select_night_theme_toast\">Podes ischertare su tema pro sa note preferidu tuo inoghe in suta</string>\n    <string name=\"night_theme_summary\">Ischerta su tema pro sa note preferidu tuo — %s</string>\n    <string name=\"auto_device_theme_title\">Automàticu (tema de su dispositivu)</string>\n    <string name=\"night_theme_title\">Tema pro sa note</string>\n    <string name=\"show_channel_details\">Ammustra sos detàllios de su canale</string>\n    <string name=\"disable_media_tunneling_summary\">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.</string>\n    <string name=\"disable_media_tunneling_title\">Disabìlita sa tunnellizatzione de sos mèdios</string>\n    <string name=\"metadata_privacy_internal\">Internu</string>\n    <string name=\"metadata_privacy_unlisted\">No elencadu</string>\n    <string name=\"metadata_privacy_private\">Privadu</string>\n    <string name=\"metadata_privacy_public\">Pùblicu</string>\n    <string name=\"metadata_host\">Istrangiadore</string>\n    <string name=\"metadata_support\">Suportu</string>\n    <string name=\"metadata_language\">Limba</string>\n    <string name=\"metadata_age_limit\">Lìmite de edade</string>\n    <string name=\"metadata_privacy\">Riservadesa</string>\n    <string name=\"metadata_licence\">Litzèntzia</string>\n    <string name=\"metadata_tags\">Etichetas</string>\n    <string name=\"metadata_category\">Categoria</string>\n    <string name=\"description_select_disable\">Disabìlita s\\'ischerta de su testu in sa descritzione</string>\n    <string name=\"description_select_enable\">Abìlita s\\'ischerta de su testu in sa descritzione</string>\n    <string name=\"description_select_note\">Como podes ischertare su testu in intro de sa descritzione. Ammenta·ti chi sa pàgina diat pòdere trèmere e sos ligàmenes si diant pòdere no abèrrere cando ses in modalidade de ischerta.</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Incumintzende dae Android 10 petzi sa \\'Storage Access Framework\\' (Istrutura de Atzessu a s\\'Archiviatzione) est suportada</string>\n    <string name=\"open_website_license\">Aberi su situ web</string>\n    <string name=\"account_terminated\">Contu serradu</string>\n    <string name=\"feed_load_error_fast_unknown\">Su recùperu lestru de sos flussos non frunit àteras informatziones in subra de custu.</string>\n    <string name=\"feed_load_error_terminated\">Su contu de s\\'autore l\\'ant serradu.\n\\nNewPipe no at a èssere prus in gradu de carrigare custu flussu in su tempus benidore.\n\\nCheres bogare s\\'iscritzione a custu canale\\?</string>\n    <string name=\"feed_load_error_account_info\">Carrigamentu de su flussu pro \\'%s\\' fallidu.</string>\n    <string name=\"feed_load_error\">Errore carrighende su flussu</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">T\\'at a bènnere pedidu in ue sarvare cada documentu</string>\n    <string name=\"no_dir_yet\">Non b\\'at galu peruna cartella de iscarrigamentu impostada. Issèbera como sa cartella de iscarrigamentu predefinida</string>\n    <string name=\"off\">Istudadu</string>\n    <string name=\"on\">Allutu</string>\n    <string name=\"tablet_mode_title\">Modalidade tauledda</string>\n    <string name=\"dont_show\">No ammustres</string>\n    <string name=\"low_quality_smaller\">Calidade bassa (prus minore)</string>\n    <string name=\"high_quality_larger\">Calidade arta (prus manna)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Antiprima in sa barra de avantzamentu</string>\n    <string name=\"comments_are_disabled\">Sos cummentos sunt disabilitados</string>\n    <string name=\"detail_heart_img_view_description\">Su creadore b\\'at postu unu coro</string>\n    <string name=\"mark_as_watched\">Marca comente pompiadu</string>\n    <string name=\"remote_search_suggestions\">Impòsitos de chirca remota</string>\n    <string name=\"local_search_suggestions\">Impòsitos de chirca locales</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s iscarrigamentu iscantzelladu</item>\n        <item quantity=\"other\">%1$s iscarrigamentos iscantzellados</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Iscarrigamentu acabadu</item>\n        <item quantity=\"other\">%s iscarrigamentos acabados</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Trìsina sos elementos pro los bogare</string>\n    <string name=\"start_main_player_fullscreen_summary\">Si sa rotatzione automàtica est blocada no avies sos vìdeos in su riproduidore mini ma diretamente in sa modalidade a ischermu intreu. Podes atzèdere su matessi a su riproduidore mini essende dae s\\'ischermu intreu</string>\n    <string name=\"start_main_player_fullscreen_title\">Allughe su letore printzipale a ischermu intreu</string>\n    <string name=\"enqueued_next\">Postu in lista comente imbeniente</string>\n    <string name=\"enqueue_next_stream\">Pone in lista comente imbeniente</string>\n    <string name=\"processing_may_take_a_moment\">Protzessende… Bi diat pòdere chèrrere unu pagu de tempus</string>\n    <string name=\"check_for_updates\">Chirca agiornamentos</string>\n    <string name=\"manual_update_description\">Verìfica in manera manuale pro versiones noas</string>\n    <string name=\"checking_updates_toast\">Controllende sos agiornamentos…</string>\n    <string name=\"error_report_notification_title\">NewPipe at rilevadu un\\'errore, toca pro lu sinnalare</string>\n    <string name=\"error_report_notification_toast\">B\\'at àpidu un\\'errore, pòmpia sa notìfica</string>\n    <string name=\"show_error_snackbar\">Ammustra una barra de errore</string>\n    <string name=\"error_report_channel_description\">Notìficas pro sinnalare errores</string>\n    <string name=\"error_report_channel_name\">Notìfica de sinnalatzione de errores</string>\n    <string name=\"show_crash_the_player_summary\">Ammustra un\\'optzione pro fàghere serrare de repente su riproduidore cando l\\'impreas</string>\n    <string name=\"create_error_notification\">Crea una notìfica de errore</string>\n    <string name=\"feed_new_items\">Elementos noos de su flussu</string>\n    <string name=\"no_appropriate_file_manager_message\">No est istadu agatadu perunu gestore de documentos pro custa atzione.\n\\nPro praghere installa·nde unu o proa a inabilitare \\'%s\\' in sas impostatziones de iscarrigamentu</string>\n    <string name=\"show_crash_the_player_title\">Ammustra \\\"faghe serrare su riproduidore\\\"</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">No est istadu agatadu perunu gestore de documentos pro custa atzione.\n\\nPro praghere installa unu gestore de documentos cumpatìbile cun su \\\"Sistema de Atzessu a s\\'Archiviatzione\\\"</string>\n    <string name=\"crash_the_player\">Faghe serrare su riproduidore</string>\n    <string name=\"detail_pinned_comment_view_description\">Cummentu apicadu</string>\n    <string name=\"leak_canary_not_available\">LeakCanary no est a disponimentu</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Valore ExoPlayer predefinidu</string>\n    <string name=\"settings_category_player_notification_summary\">Cunfigura sa notìfica de su flussu in cursu de riprodutzione</string>\n    <string name=\"streams_notification_channel_description\">Notìficas de flussos noos dae sas iscritziones</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s flussu nou</item>\n        <item quantity=\"other\">%s flussos noos</item>\n    </plurals>\n    <string name=\"loading_stream_details\">Carrighende sos detàllios de su flussu…</string>\n    <string name=\"check_new_streams\">Avia una verìfica pro flussos noos</string>\n    <string name=\"enable_streams_notifications_title\">Notìficas pro sos flussos noos</string>\n    <string name=\"enable_streams_notifications_summary\">Notìfica de flussos noos dae sas iscritziones</string>\n    <string name=\"streams_notifications_interval_title\">Frecuèntzia de controllu</string>\n    <string name=\"streams_notifications_network_title\">Connessione de retze rechesta</string>\n    <string name=\"any_network\">Cale si siat retze</string>\n    <string name=\"notifications_disabled\">Sas notìficas sunt disabilitadas</string>\n    <string name=\"get_notified\">Retzi notìficas</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Ativa/disativa totu</string>\n    <string name=\"you_successfully_subscribed\">Como ses iscritu a custu canale</string>\n    <string name=\"settings_category_player_notification_title\">Notìfica de su riproduidore</string>\n    <string name=\"notifications\">Notìficas</string>\n    <string name=\"streams_notification_channel_name\">Flussos noos</string>\n    <string name=\"delete_downloaded_files_confirm\">Iscantzellare totu sos archìvios iscarrigados dae su discu\\?</string>\n    <string name=\"percent\">Pertzentuale</string>\n    <string name=\"semitone\">Semitonu</string>\n    <string name=\"select_quality_external_players\">Seletziona sa calidade pro sos letores esternos</string>\n    <string name=\"streams_not_yet_supported_removed\">Sos flussos chi non sunt galu suportados dae s\\'iscarrigadore non sunt ammustrados</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Non b\\'est perunu flussu sonoru a disponimentu pro letores esternos</string>\n    <string name=\"no_video_streams_available_for_external_players\">Non bi sunt flussos de vìdeu a disponimentu pro letores esternos</string>\n    <string name=\"unknown_format\">Formadu disconnotu</string>\n    <string name=\"unknown_quality\">Calidade disconnota</string>\n    <string name=\"selected_stream_external_player_not_supported\">Su flussu seletzionadu no est galu suportadu dae letores esternos</string>\n    <string name=\"progressive_load_interval_title\">Mannària de s\\'intervallu de carrigamentu de sa riprodutzione</string>\n    <string name=\"faq_title\">Preguntas fitianas</string>\n    <string name=\"faq_description\">Si ses tenende problemas impreende s\\'aplicatzione assegura·ti de consultare custas rispostas a preguntas fitianas!</string>\n    <string name=\"faq\">Pòmpia in su situ web</string>\n    <string name=\"sort\">Òrdina</string>\n    <string name=\"app_update_available_notification_text\">Toca pro iscarrigare %s</string>\n    <string name=\"fast_mode\">Modalidade lestra</string>\n    <string name=\"import_subscriptions_hint\">Importa o esporta iscritziones dae su menù a 3 puntos</string>\n    <string name=\"app_update_unavailable_toast\">Ses impreende s\\'ùrtima versione de NewPipe</string>\n    <string name=\"night_theme_available\">Custa optzione est a disponimentu petzi si %s est seletzionadu comente tema</string>\n    <string name=\"card\">Carta</string>\n    <string name=\"msg_failed_to_copy\">Còpia in punta de billete fallida</string>\n    <string name=\"unset_playlist_thumbnail\">Disativa sa miniadura permanente</string>\n    <string name=\"duplicate_in_playlist\">Sas iscalitas in colore murru tenent giai custu elementu.</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplicadu annantu %d borta(s)</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignora eventos de sos butones multimediales fìsicos</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Ùtile, a esempru, si ses impreende cùfias cun butones fìsicos segados</string>\n    <string name=\"feed_hide_streams_title\">Ammustra sos flussos chi sighint</string>\n    <string name=\"remove_duplicates\">Boga sos duplicados</string>\n    <string name=\"remove_duplicates_title\">Bogare sos duplicados\\?</string>\n    <string name=\"remove_duplicates_message\">Boles bogare totu sos flussos duplicados in custa iscalita\\?</string>\n    <string name=\"feed_show_hide_streams\">Ammustra/Cua flussos</string>\n    <string name=\"feed_show_watched\">Bidu de su totu</string>\n    <string name=\"feed_show_partially_watched\">Bidu in parte</string>\n    <string name=\"feed_show_upcoming\">Luego</string>\n    <string name=\"left_gesture_control_title\">Atzione de su gestu de manca</string>\n    <string name=\"right_gesture_control_title\">Atzione de su gestu de destra</string>\n    <string name=\"volume\">Volume</string>\n    <string name=\"left_gesture_control_summary\">Issèbera unu gestu pro sa metade de manca de s\\'ischermu de su riproduidore</string>\n    <string name=\"right_gesture_control_summary\">Issèbera unu gestu pro sa metade de destra de s\\'ischermu de su riproduidore</string>\n    <string name=\"brightness\">Luminosidade</string>\n    <string name=\"none\">Perunu</string>\n    <string name=\"progressive_load_interval_summary\">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</string>\n    <string name=\"prefer_original_audio_title\">Preferi s\\'àudio originale</string>\n    <string name=\"prefer_descriptive_audio_title\">Preferi un\\'àudio descritivu</string>\n    <string name=\"prefer_descriptive_audio_summary\">Seletziona una rasta àudio cun descritziones pro persones cun problemas de vista, si bi nd\\'at a disponimentu</string>\n    <string name=\"play_queue_audio_track\">Àudio: %s</string>\n    <string name=\"audio_track\">Rasta àudio</string>\n    <string name=\"unknown_audio_track\">Disconnotu</string>\n    <string name=\"settings_category_exoplayer_summary\">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</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Imprea sa funtzionalidade de riserva de su decodificadore de ExoPlayer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">originale</string>\n    <string name=\"audio_track_type_dubbed\">dopiadu</string>\n    <string name=\"audio_track_type_descriptive\">descritivu</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Imprea semper sa solutzione alternativa de s\\'impostatzione de superfìtzie de s\\'essida vìdeu de ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\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</string>\n    <string name=\"select_audio_track_external_players\">Seletziona una rasta àudio pro riproduidores esternos</string>\n    <string name=\"prefer_original_audio_summary\">Seletziona sa rasta sonora originale in manera indipendente dae sa limba</string>\n    <string name=\"audio_track_present_in_video\">Una rasta àudio diat dèpere èssere giai presente in custu flussu</string>\n    <string name=\"settings_category_exoplayer_title\">Impostatziones pro ExoPlayer</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"image_quality_title\">Calidade de s\\'immàgine</string>\n    <string name=\"channel_tab_videos\">Vìdeos</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Iscritos</string>\n    <string name=\"show_channel_tabs_summary\">Ite ischedas benint ammustradas in sas pàginas de su canale</string>\n    <string name=\"share_playlist_with_list\">Cumpartzi una lista de URL</string>\n    <string name=\"share_playlist_with_titles\">Cumpartzi cun sos tìtulos</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_channel_tabs\">Ischedas de su canale</string>\n    <string name=\"channel_tab_shorts\">Curtzos</string>\n    <string name=\"loading_metadata_title\">Carrighende sos metadatos…</string>\n    <string name=\"toggle_screen_orientation\">Càmbia s\\'orientamentu de s\\'ischermu</string>\n    <string name=\"image_quality_low\">Calidade bassa</string>\n    <string name=\"main_tabs_position_title\">Positzione de sas ischedas printzipales</string>\n    <string name=\"toggle_fullscreen\">Allughe/istuda s\\'ischermu intreu</string>\n    <string name=\"feed_fetch_channel_tabs\">Recùpera sas ischedas de su canale</string>\n    <string name=\"metadata_avatars\">Avatars</string>\n    <string name=\"next_stream\">Flussu imbeniente</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Sa tunnellizatzione multimediale est istada disabilitada comente cunfiguratzione predefinida ca su modellu de dispositivu tuo s\\'ischit chi non la suportat.</string>\n    <string name=\"metadata_subchannel_avatars\">Avatars de sos suta-canales</string>\n    <string name=\"open_play_queue\">Aberi sa lista de riprodutzione</string>\n    <string name=\"image_quality_none\">Non càrrighes immàgines</string>\n    <string name=\"image_quality_high\">Calidade arta</string>\n    <string name=\"channel_tab_about\">Informatziones</string>\n    <string name=\"share_playlist\">Cumpartzi s\\'iscalita</string>\n    <string name=\"forward\">A dae in antis</string>\n    <string name=\"channel_tab_albums\">Albums</string>\n    <string name=\"rewind\">Torra in segus</string>\n    <string name=\"replay\">Torra a reprodùere</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Ischedas de recuperare cando agiornas sa fonte. Custa optzione non tenet efetu si unu canale benit agiornadu impreende sa modalidade lestra.</string>\n    <string name=\"image_quality_medium\">Calidade mesana</string>\n    <string name=\"metadata_uploader_avatars\">Avatars de su carrigadore</string>\n    <string name=\"metadata_banners\">Insignas</string>\n    <string name=\"channel_tab_playlists\">Iscalitas</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"main_tabs_position_summary\">Moe su seletzionadore de s\\'ischeda printzipale a fundu</string>\n    <string name=\"no_live_streams\">Perunu flussu in direta</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"play\">Riprodue</string>\n    <string name=\"more_options\">Prus optziones</string>\n    <string name=\"metadata_thumbnails\">Miniaduras</string>\n    <string name=\"channel_tab_tracks\">Rastas</string>\n    <string name=\"duration\">Longària</string>\n    <string name=\"no_streams\">Perunu flussu</string>\n    <string name=\"channel_tab_channels\">Canales</string>\n    <string name=\"previous_stream\">Flussu antepostu</string>\n    <string name=\"channel_tab_livestreams\">Diretas</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"error_insufficient_storage\">Non b\\'at ispàtziu lìberu bastante in su dispositivu</string>\n    <string name=\"show_less\">Mustra de mancu</string>\n    <string name=\"auto_update_check_description\">NewPipe podet chircare in automàticu versiones noas cada tantu e notificare·ti cando sunt a disponimentu.\n\\nLu boles abilitare?</string>\n    <string name=\"no\">Nono</string>\n    <string name=\"settings_category_backup_restore_title\">Còpia de seguresa e riprìstinu</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s risposta</item>\n        <item quantity=\"other\">%s rispostas</item>\n    </plurals>\n    <string name=\"show_more\">Mustra de prus</string>\n    <string name=\"yes\">Eja</string>\n    <string name=\"reset_settings_title\">Reseta sas impostatziones</string>\n    <string name=\"reset_settings_summary\">Reseta totu sas impostatziones a sos valores predefinidos issoro</string>\n    <string name=\"reset_all_settings\">Resetende totu sas impostatziones as a iscartare totu sas impostatziones preferidas tuas e a torrare a allùghere s\\'aplicatzione.\n\\n\n\\nSes seguru de bòlere sighire?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"tab_bookmarks_short\">Iscalitas</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Cumpartzi comente un\\'iscalita temporànea de YouTube</string>\n    <string name=\"audio_track_type_secondary\">segundàriu</string>\n    <string name=\"search_with_service_name\">Chirca in %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Chirca %1$s (%2$s)</string>\n    <string name=\"select_a_feed_group\">Seletziona unu grupu de flussos</string>\n    <string name=\"no_feed_group_created_yet\">Galu perunu grupu de flussos creadu</string>\n    <string name=\"feed_group_page_summary\">Pàgina de grupu de canales</string>\n    <string name=\"channel_tab_likes\">Agradessimentos</string>\n    <string name=\"migration_info_6_7_title\">Pàgina Top 50 de SoundCloud bogada</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud at abbandonadu sos gràficos Top 50 originales. S\\'ischeda currispondente est istada bogada dae sa pàgina printzipale tua.</string>\n    <string name=\"migration_info_7_8_title\">Tendèntzias cumbinadas de YouTube bogadas</string>\n    <string name=\"migration_info_7_8_message\">YouTube at abbandonadu sa pàgina de sas tendèntzias cumbinadas in su 21 de trìulas de su 2025. NewPipe at sostituidu sa pàgina de sas tendèntzias printzipales cun sas diretas de tendèntzia.\\n\\nPodes fintzas seletzionare pàginas de sas tendèntzias diferentes in \\\"Impostatziones &gt; Cuntenutos &gt; Cuntenutu de sa pàgina printzipale\\\".</string>\n    <string name=\"trending_gaming\">Giogos de tendèntzia</string>\n    <string name=\"trending_podcasts\">Podcasts de tendèntzia</string>\n    <string name=\"trending_movies\">Films e programmas de tendèntzia</string>\n    <string name=\"trending_music\">Mùsica de tendèntzia</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-scn/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources></resources>"
  },
  {
    "path": "app/src/main/res/values-si/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"show_info\">තොරතුරු පෙන්වන්න</string>\n    <string name=\"did_you_mean\">ඔබ අදහස් කළේ \\\"%1$s\\\" ද\\?</string>\n    <string name=\"settings\">සැකසුම්</string>\n    <string name=\"search\">සොයන්න</string>\n    <string name=\"use_external_video_player_title\">බාහිර මෘදුකාංගයක් භාවිත කරන්න</string>\n    <string name=\"subscribe_button_title\">Subscribe කිරීම</string>\n    <string name=\"tab_choose\">ටැබය තෝරන්න</string>\n    <string name=\"download_path_summary\">භාගත කල චලන රූප මෙහි තැන්පත් ය</string>\n    <string name=\"main_bg_subtitle\">ආරම්භ කිරීමට අණ්වීක්ෂය ඔබන්න.</string>\n    <string name=\"open_with\">හරහා විවෘත කරන්න</string>\n    <string name=\"share\">බෙදාගන්න</string>\n    <string name=\"upload_date_text\">පලකරන ලද්දේ %1$s</string>\n    <string name=\"install\">ස්ථාපනය කරන්න</string>\n    <string name=\"cancel\">අවලංගු කරන්න</string>\n    <string name=\"open_in_browser\">Browser එක මගින් විවෘත කරන්න</string>\n    <string name=\"download\">බාගත කරන්න</string>\n    <string name=\"mark_as_watched\">බැලූ ලෙස සලකුණු කරන්න</string>\n    <string name=\"ok\">හරි</string>\n    <string name=\"search_showing_result_for\">%s සඳහා ප්‍රතිපල පෙන්වයි</string>\n    <string name=\"subscribed_button_title\">Subscribe කර ඇත</string>\n    <string name=\"controls_add_to_playlist_title\">ඇතුලත් කරන්න මෙයට</string>\n    <string name=\"download_path_title\">චලන රූප භාගත කරන ස්තානය</string>\n    <string name=\"download_path_dialog_title\">චලන රූප ගබඩා කිරීමට ස්තානයක් තෝරන්න</string>\n    <string name=\"open_in_popup_mode\">උත්පතන මාදිලියේ විවෘත කරන්න</string>\n    <string name=\"share_dialog_title\">සමඟ බෙදාගන්න</string>\n    <string name=\"use_external_audio_player_title\">බාහිර ශ්‍රව්‍ය වාදකය භාවිතා කරන්න</string>\n    <string name=\"use_external_video_player_summary\">සමහර විභේදනවලදී හඬ ඉවත් කරයි</string>\n    <string name=\"no_player_found_toast\">ප්‍රවාහ වාදකයක් හමු නොවීය (ඔබට එය වාදනය කිරීමට VLC ස්ථාපනය කළ හැක).</string>\n    <string name=\"controls_download_desc\">ප්‍රවාහ ගොනුව බාගන්න</string>\n    <string name=\"no_player_found\">ප්‍රවාහ වාදකයක් හමු නොවීය. VLC ස්ථාපනය කරන්නද?</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-sk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Zverejnené %1$s</string>\n    <string name=\"no_player_found\">Nenašiel sa prehrávač. Chcete nainštalovať VLC?</string>\n    <string name=\"install\">Inštalovať</string>\n    <string name=\"cancel\">Zrušiť</string>\n    <string name=\"open_in_browser\">Otvoriť v prehliadači</string>\n    <string name=\"share\">Zdieľať</string>\n    <string name=\"download\">Prevziať</string>\n    <string name=\"search\">Hľadať</string>\n    <string name=\"settings\">Nastavenia</string>\n    <string name=\"did_you_mean\">Mysleli ste \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Zdieľať s</string>\n    <string name=\"use_external_video_player_title\">Použiť externý prehrávač videa</string>\n    <string name=\"use_external_audio_player_title\">Použiť externý prehrávač zvuku</string>\n    <string name=\"download_path_title\">Adresár stiahnutých videí</string>\n    <string name=\"download_path_summary\">Stiahnuté video súbory sú uložené tu</string>\n    <string name=\"download_path_dialog_title\">Vyberte priečinok pre stiahnuté video</string>\n    <string name=\"download_path_audio_title\">Priečinok pre stiahnuté audio</string>\n    <string name=\"download_path_audio_dialog_title\">Vyberte priečinok pre audio súbory</string>\n    <string name=\"download_path_audio_summary\">Stiahnuté zvukové súbory sú uložené tu</string>\n    <string name=\"default_resolution_title\">Štandardné rozlíšenie</string>\n    <string name=\"play_with_kodi_title\">Prehrať cez Kodi</string>\n    <string name=\"kore_not_found\">Nainštalovať chýbajúcu aplikáciu Kore\\?</string>\n    <string name=\"show_play_with_kodi_title\">Zobraziť možnosť \\\"Prehrať cez Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Zobrazí možnosť prehrať video cez mediálne centrum Kodi</string>\n    <string name=\"play_audio\">Zvuk</string>\n    <string name=\"default_audio_format_title\">Predvolený zvukový formát</string>\n    <string name=\"theme_title\">Téma</string>\n    <string name=\"dark_theme_title\">Tmavá</string>\n    <string name=\"light_theme_title\">Svetlá</string>\n    <string name=\"download_dialog_title\">Prevziať</string>\n    <string name=\"show_next_and_similar_title\">Ukázať \\'Ďalšie\\' a \\'Podobné\\' videá</string>\n    <string name=\"unsupported_url\">URL nie je podporovaná</string>\n    <string name=\"content_language_title\">Preferovaný jazyk obsahu</string>\n    <string name=\"settings_category_video_audio_title\">Video a zvuk</string>\n    <string name=\"settings_category_appearance_title\">Vzhľad</string>\n    <string name=\"background_player_playing_toast\">Prehrávanie na pozadí</string>\n    <string name=\"general_error\">Chyba</string>\n    <string name=\"network_error\">Chyba siete</string>\n    <string name=\"could_not_load_thumbnails\">Nemožno zobraziť všetky náhľady</string>\n    <string name=\"parsing_error\">Nemožno analyzovať webovú stránku</string>\n    <string name=\"content_not_available\">Obsah nie je dostupný</string>\n    <string name=\"detail_thumbnail_view_description\">Prehrať video, dĺžka:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Náhľad avataru uploadera</string>\n    <string name=\"detail_likes_img_view_description\">Lajky</string>\n    <string name=\"detail_dislikes_img_view_description\">Dislajky</string>\n    <string name=\"main_bg_subtitle\">Začnite ťuknutím na lupu.</string>\n    <string name=\"content\">Obsah</string>\n    <string name=\"show_age_restricted_content_title\">Zobraziť vekovo obmedzený obsah</string>\n    <string name=\"duration_live\">Naživo</string>\n    <string name=\"could_not_setup_download_menu\">Nemožno nastaviť menu preberania</string>\n    <string name=\"sorry_string\">Pardon, toto sa nemalo stať.</string>\n    <string name=\"error_report_button_text\">Nahlásiť cez e-mail</string>\n    <string name=\"error_snackbar_message\">Pardon, niečo sa pokazilo.</string>\n    <string name=\"error_snackbar_action\">Správa</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"what_happened_headline\">Čo sa stalo:</string>\n    <string name=\"your_comment\">Váš komentár (v Angličtine):</string>\n    <string name=\"error_details_headline\">Detaily:</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Zvuk</string>\n    <string name=\"retry\">Znova</string>\n    <string name=\"start\">Štart</string>\n    <string name=\"pause\">Pauza</string>\n    <string name=\"delete\">Zmazať</string>\n    <string name=\"checksum\">Kontrolný súčet</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Názov súboru</string>\n    <string name=\"msg_threads\">Vlákna</string>\n    <string name=\"msg_error\">Chyba</string>\n    <string name=\"msg_running\">NewPipe Preberanie</string>\n    <string name=\"msg_running_detail\">Dotykom zobraziť detaily</string>\n    <string name=\"msg_wait\">Čakajte prosím…</string>\n    <string name=\"msg_copied\">Skopírované do schránky</string>\n    <string name=\"no_available_dir\">Priečinok na sťahovanie zadefinujte prosím neskôr v nastaveniach</string>\n    <string name=\"downloads\">Stiahnuté súbory</string>\n    <string name=\"downloads_title\">Stiahnuté</string>\n    <string name=\"error_report_title\">Hlásenie o chybe</string>\n    <string name=\"app_ui_crash\">Aplikácia/UP zlyhalo</string>\n    <string name=\"info_labels\">Čo:\\nPožiadavka:\\nJazyk obsahu:\\nKrajina Obsahu:\\nJazyk Aplikácie:\\nSlužba:\\nČas v GMT:\\nBalík:\\nVerzia:\\nOS:</string>\n    <string name=\"title_activity_recaptcha\">Výzva reCAPTCHA</string>\n    <string name=\"black_theme_title\">Čierna</string>\n    <string name=\"all\">Všetko</string>\n    <string name=\"recaptcha_request_toast\">Požiadavka reCAPTCHA</string>\n    <string name=\"open_in_popup_mode\">Otvoriť vo vyskakovacom okne</string>\n    <string name=\"msg_popup_permission\">Tieto práva sú potrebné pre\n\\nprehrávanie v mini okne</string>\n    <string name=\"default_video_format_title\">Preferovaný formát videa</string>\n    <string name=\"popup_playing_toast\">Prehrávanie v mini okne</string>\n    <string name=\"disabled\">Vypnuté</string>\n    <string name=\"default_popup_resolution_title\">Predvolená veľkosť mini okna</string>\n    <string name=\"show_higher_resolutions_title\">Zobraziť vyššie rozlíšenie</string>\n    <string name=\"show_higher_resolutions_summary\">Len niektoré zariadenia podporujú videá 2K/4K</string>\n    <string name=\"controls_background_title\">Na pozadí</string>\n    <string name=\"controls_popup_title\">V okne</string>\n    <string name=\"clear\">Vyčistiť</string>\n    <string name=\"use_external_video_player_summary\">Odstráni audio pri niektorých rozlíšeniach</string>\n    <string name=\"popup_remember_size_pos_title\">Zapamätať si parametre mini okna</string>\n    <string name=\"popup_remember_size_pos_summary\">Zapamätá si posledné nastavenie veľkosti a pozície vyskakovacieho okna</string>\n    <string name=\"show_search_suggestions_title\">Hľadať návrhy</string>\n    <string name=\"show_search_suggestions_summary\">Vyberte návrhy, ktoré sa majú zobrazovať pri vyhľadávaní</string>\n    <string name=\"best_resolution\">Najlepšie rozlíšenie</string>\n    <string name=\"subscribe_button_title\">Odoberať</string>\n    <string name=\"subscribed_button_title\">Odoberané</string>\n    <string name=\"channel_unsubscribed\">Odber zrušený</string>\n    <string name=\"subscription_change_failed\">Nemožno zmeniť odber</string>\n    <string name=\"subscription_update_failed\">Nemožno aktualizovať odber</string>\n    <string name=\"tab_subscriptions\">Odbery</string>\n    <string name=\"fragment_feed_title\">Čo je nové</string>\n    <string name=\"enable_search_history_title\">Hľadať v histórií</string>\n    <string name=\"enable_search_history_summary\">Hľadané výrazy uloží lokálne</string>\n    <string name=\"enable_watch_history_title\">História pozerania</string>\n    <string name=\"enable_watch_history_summary\">Uloží históriu pozeraných videí</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Pokračovať v prehrávaní</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Pokračouje v prehrávaní po prerušení (napr. po telefonáte)</string>\n    <string name=\"notification_channel_name\">NewPipe oznámenia</string>\n    <string name=\"notification_channel_description\">Notifikácie NewPipe prehrávača</string>\n    <string name=\"settings_category_downloads_title\">Preberanie</string>\n    <string name=\"settings_file_charset_title\">Povolené znaky v názvoch súborov</string>\n    <string name=\"settings_file_replacement_character_summary\">Neplatné znaky budú nahradené znakmi s týmto významom</string>\n    <string name=\"settings_file_replacement_character_title\">Náhradný znak</string>\n    <string name=\"charset_letters_and_digits\">Písmená a číslice</string>\n    <string name=\"charset_most_special_characters\">Väčšina špeciálnych znakov</string>\n    <string name=\"title_activity_about\">O NewPipe</string>\n    <string name=\"title_licenses\">Licencie tretích strán</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s od %2$s pod %3$s</string>\n    <string name=\"tab_about\">O nás a často kladené otázky</string>\n    <string name=\"tab_licenses\">Licencie</string>\n    <string name=\"app_description\">Ľahké prehrávanie na Androide.</string>\n    <string name=\"view_on_github\">Pozrieť na GitHube</string>\n    <string name=\"app_license_title\">Licencia NewPipe</string>\n    <string name=\"contribution_encouragement\">Či už máte nápady, prekladáte, spravíte zmenu dizajnu, čistenie kódu alebo skutočné ťažké zmeny v kóde, pomoc je vždy vítaná. Čím viac, tým lepšie!</string>\n    <string name=\"read_full_license\">Prečítať licencie</string>\n    <string name=\"contribution_title\">Zapojiť sa</string>\n    <string name=\"title_activity_history\">História</string>\n    <string name=\"action_history\">História</string>\n    <string name=\"settings_category_player_title\">Prehrávač</string>\n    <string name=\"settings_category_player_behavior_title\">Správanie</string>\n    <string name=\"settings_category_history_title\">História a vyrovnávacia pamäť</string>\n    <string name=\"undo\">Vrátiť</string>\n    <string name=\"search_no_results\">Žiadne výsledky</string>\n    <string name=\"empty_list_subtitle\">Zatiaľ je tu ticho ako v hrobe</string>\n    <string name=\"no_subscribers\">Žiadni odberatelia</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s odberateľ</item>\n        <item quantity=\"few\">%s odberatelia</item>\n        <item quantity=\"other\">%s odberateľov</item>\n    </plurals>\n    <string name=\"no_views\">Žiadne zobrazenia</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s zobrazenie</item>\n        <item quantity=\"few\">%s zobrazenia</item>\n        <item quantity=\"many\">%s zobrazení</item>\n        <item quantity=\"other\">%s zobrazení</item>\n    </plurals>\n    <string name=\"no_videos\">Žiadne videá</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"few\">%s videá</item>\n        <item quantity=\"other\">%s videí</item>\n    </plurals>\n    <string name=\"no_player_found_toast\">Nebol nájdený žiadny prehrávač pre stream (môžete si nainštalovať napr. VLC).</string>\n    <string name=\"controls_download_desc\">Stiahnuť súbor streamu</string>\n    <string name=\"show_info\">Zobraziť info</string>\n    <string name=\"tab_bookmarks\">Uložené playlisty</string>\n    <string name=\"controls_add_to_playlist_title\">Pridať do</string>\n    <string name=\"show_hold_to_append_title\">Zobrazovať tip \\\"Pridať podržaním\\\"</string>\n    <string name=\"show_hold_to_append_summary\">Zobrazí tip pri stlačení tlačidiel pozadia alebo vyskakovacieho okna videa \\\"Podrobnosti:\\\"</string>\n    <string name=\"default_content_country_title\">Predvolený obsah pre krajinu</string>\n    <string name=\"play_all\">Prehrať všetko</string>\n    <string name=\"always\">Vždy</string>\n    <string name=\"just_once\">Iba raz</string>\n    <string name=\"unknown_content\">[Neznámy]</string>\n    <string name=\"switch_to_background\">Prepnúť na pozadie</string>\n    <string name=\"switch_to_popup\">Prepnúť do mini okna</string>\n    <string name=\"switch_to_main\">Prepnúť na Video</string>\n    <string name=\"import_data_title\">Importovať databázu</string>\n    <string name=\"export_data_title\">Exportovať databázu</string>\n    <string name=\"import_data_summary\">Prepíše aktuálnu históriu, odbery, playlisty a (voliteľne) nastavenia</string>\n    <string name=\"export_data_summary\">Exportuje históriu, odbery, playlisty a nastavenia</string>\n    <string name=\"player_stream_failure\">Nepodarilo sa prehrať tento stream</string>\n    <string name=\"player_unrecoverable_failure\">Pri prehrávaní došlo k chybe a nemožno pokračovať</string>\n    <string name=\"player_recoverable_failure\">Zotavovanie po chybe v prehrávaní</string>\n    <string name=\"external_player_unsupported_link_type\">Externé prehrávače nepodporujú tieto typy odkazov</string>\n    <string name=\"video_streams_empty\">Neboli nájdené žiadne video streamy</string>\n    <string name=\"audio_streams_empty\">Neboli nájdené žiadne audio streamy</string>\n    <string name=\"detail_drag_description\">Potiahnutím zmeniť poradie</string>\n    <string name=\"create\">Vytvoriť</string>\n    <string name=\"dismiss\">Zrušiť</string>\n    <string name=\"rename\">Premenovať</string>\n    <string name=\"donation_title\">Prispieť</string>\n    <string name=\"donation_encouragement\">Aplikácia NewPipe je vyvíjaná dobrovoľníkmi v ich voľnom čase snažiac sa vám priniesť najlepší zážitok z appky, ak sa vám páči, odmeňte vývojárov aby mohli NewPipe naďalej vylepšovať napríklad pri šálke dobrej kávy.</string>\n    <string name=\"give_back\">Daruj</string>\n    <string name=\"website_title\">Webstránka</string>\n    <string name=\"website_encouragement\">Pre viac informácií a noviniek navštívte webstránku NewPipe.</string>\n    <string name=\"delete_item_search_history\">Chcete odstrániť túto položku z histórie vyhľadávania?</string>\n    <string name=\"title_last_played\">Naposledy prehrávané</string>\n    <string name=\"title_most_played\">Najprehrávanejšie</string>\n    <string name=\"main_page_content\">Obsah na hlavnej stránke</string>\n    <string name=\"blank_page_summary\">Prázdna stránka</string>\n    <string name=\"kiosk_page_summary\">Kiosk</string>\n    <string name=\"channel_page_summary\">Kanál</string>\n    <string name=\"select_a_channel\">Vyberte si kanál</string>\n    <string name=\"no_channel_subscribed_yet\">Zatiaľ nemáte žiadne odbery kanálov</string>\n    <string name=\"select_a_kiosk\">Vyberte si kiosk</string>\n    <string name=\"export_complete_toast\">Export dokončený</string>\n    <string name=\"import_complete_toast\">Import dokončený</string>\n    <string name=\"no_valid_zip_file\">Neplatný ZIP súbor</string>\n    <string name=\"could_not_import_all_files\">Upozornenie: Nemožno importovať všetky súbory.</string>\n    <string name=\"override_current_data\">Toto prepíše vaše aktuálne nastavenie.</string>\n    <string name=\"trending\">Populárne</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"new_and_hot\">Nové a horúce</string>\n    <string name=\"play_queue_remove\">Odstrániť</string>\n    <string name=\"play_queue_stream_detail\">Podrobnosti</string>\n    <string name=\"play_queue_audio_settings\">Nastavenie zvuku</string>\n    <string name=\"hold_to_append\">Podržaním pridať do zoznamu</string>\n    <string name=\"start_here_on_background\">Prehrať (zvuk) odtiaľto na pozadí</string>\n    <string name=\"start_here_on_popup\">Spustiť prehrávanie vo vyskakovacom okne</string>\n    <string name=\"drawer_open\">Otvoriť zásuvku</string>\n    <string name=\"drawer_close\">Zavrieť zásuvku</string>\n    <string name=\"video_player\">Prehrávač videa</string>\n    <string name=\"background_player\">Zvuk na pozadí</string>\n    <string name=\"popup_player\">Mini okno</string>\n    <string name=\"always_ask_open_action\">Vždy sa opýtať</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Získavajú sa informácie…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Načítanie požadované obsahu</string>\n    <string name=\"create_playlist\">Nový playlist</string>\n    <string name=\"rename_playlist\">Premenovať</string>\n    <string name=\"name\">Názov</string>\n    <string name=\"add_to_playlist\">Pridať do playlistu</string>\n    <string name=\"set_as_playlist_thumbnail\">Nastaviť ako miniatúru playlistu</string>\n    <string name=\"bookmark_playlist\">Pridať playlist medzi záložky</string>\n    <string name=\"unbookmark_playlist\">Odstrániť záložku</string>\n    <string name=\"delete_playlist_prompt\">Odstrániť tento playlist?</string>\n    <string name=\"playlist_creation_success\">Playlist bol vytvorený</string>\n    <string name=\"playlist_add_stream_success\">V playliste</string>\n    <string name=\"playlist_thumbnail_change_success\">Miniatúra playlistu bola zmenená.</string>\n    <string name=\"caption_none\">Bez titulkov</string>\n    <string name=\"resize_fit\">Prispôsobiť</string>\n    <string name=\"resize_fill\">Vyplniť</string>\n    <string name=\"resize_zoom\">Zväčšiť</string>\n    <string name=\"use_inexact_seek_title\">Používať rýchly posun</string>\n    <string name=\"use_inexact_seek_summary\">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ý</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Vyrovnávacia pamäť obrázkov vymazaná</string>\n    <string name=\"metadata_cache_wipe_title\">Vymazať metadáta uložené vo vyrovnávacej pamäti</string>\n    <string name=\"metadata_cache_wipe_summary\">Odstráni všetky údaje webových stránok vo vyrovnávacej pamäti</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Vyrovnávacia pamäť metadát bola vymazaná</string>\n    <string name=\"auto_queue_title\">Automaticky zaradiť ďalší stream</string>\n    <string name=\"auto_queue_summary\">Končiaci (neopakujúci sa) zoznam prehrávania bude pokračovať súvisiacim streamom</string>\n    <string name=\"settings_category_debug_title\">Ladenie</string>\n    <string name=\"file\">Súbor</string>\n    <string name=\"invalid_directory\">Neplatný adresár</string>\n    <string name=\"invalid_source\">Neplatný zdroj súboru/obsahu</string>\n    <string name=\"invalid_file\">Súbor buď neexistuje alebo nemáte dostatočné práva na je čítanie či zápis</string>\n    <string name=\"file_name_empty_error\">Názov súboru nesme byť prázdny</string>\n    <string name=\"error_occurred_detail\">Nastala chyba: %1$s</string>\n    <string name=\"no_streams_available_download\">Žiadne streamy nie sú k dispozícii na prevzatie</string>\n    <string name=\"preferred_open_action_settings_title\">Preferovaná akcia \\'otvoriť\\'</string>\n    <string name=\"preferred_open_action_settings_summary\">Predvolená akcia pri otváraní obsahu — %s</string>\n    <string name=\"caption_auto_generated\">Automaticky vygenerované</string>\n    <string name=\"caption_setting_title\">Titulky</string>\n    <string name=\"caption_setting_description\">Upravte mierku textu titulkov prehrávača a štýly pozadia. Vyžaduje sa reštart aplikácie</string>\n    <string name=\"enable_leak_canary_summary\">Monitorovanie úniku pamäte môže spôsobiť, že aplikácia nebude reagovať</string>\n    <string name=\"enable_disposed_exceptions_title\">Nahlásiť mimo-cyklické chyby</string>\n    <string name=\"enable_disposed_exceptions_summary\">Vynúti hlásenie nedoručiteľných výnimiek Rx mimo časového cyklu fragmentov alebo aktivity po zneškodnení</string>\n    <string name=\"import_title\">Import</string>\n    <string name=\"import_from\">Importovať z</string>\n    <string name=\"export_to\">Exportovať do</string>\n    <string name=\"import_ongoing\">Importovanie…</string>\n    <string name=\"export_ongoing\">Exportovanie…</string>\n    <string name=\"import_file_title\">Import súboru</string>\n    <string name=\"previous_export\">Predchádzajúci export</string>\n    <string name=\"subscriptions_import_unsuccessful\">Nemožno importovať odbery</string>\n    <string name=\"subscriptions_export_unsuccessful\">Nemožno exportovať odbery</string>\n    <string name=\"import_youtube_instructions\">Import odberov služby YouTube pomocou Google takeout:\n\\n\n\\n1. Prejdite na túto adresu URL: %1$s\n\\n2. Po výzve sa prihláste do svojho účtu\n\\n3. Kliknite na \\\"Zahrnuté sú všetky údaj služby YouTube\\\", kliknite na \\\"Zrušiť výber\\\", zaškrtnite \\\"odbery\\\" a kliknite na OK\n\\n4. Kliknite na \\\"Ďalší krok\\\" a potom na \\\"Vytvoriť export\\\"\n\\n5. Po chvíli sa objaví tlačidlo s nápisom \\\"Stiahnuť\\\"\n\\n6. Kliknite na IMPORT ZO SÚBORU a zvoľte stiahnutý zip súbor\n\\n7. Ak import zip súbory zlyhá. Stiahnutý súbor otvorte a extrahujte .csv súbor (nachádza sa v \\\"/Takeout/YouTube a YouTube Music/odbery/\\\"), tento súbor importujte do NewPipe</string>\n    <string name=\"import_soundcloud_instructions\">Importovať SoundCloud profil zadaním URL adresy alebo vášho ID:\n\\n\n\\n1. Prepnite režim na \\\"desktop\\\" (web nie je dostupný pre mobilné zariadenia)\n\\n2. Prejdite na túto URL adresu: %1$s\n\\n3. Po výzve sa prihláste do svojho účtu\n\\n4. Skopírujte adresu URL, na ktorú ste boli presmerovaní.</string>\n    <string name=\"import_soundcloud_instructions_hint\">vašeID, soundcloud.com/vašeid</string>\n    <string name=\"import_network_expensive_warning\">Operácia môže byť náročná na počet prenesených dát.\n\\n\n\\nChcete pokračovať?</string>\n    <string name=\"playback_speed_control\">Ovládanie rýchlosti prehrávania</string>\n    <string name=\"playback_tempo\">Rýchlosť</string>\n    <string name=\"playback_pitch\">Výška</string>\n    <string name=\"unhook_checkbox\">Spraviť nezávislými (môže spôsobovať skreslenie)</string>\n    <string name=\"clear_views_history_title\">Vymazať históriu pozerania</string>\n    <string name=\"clear_views_history_summary\">Odstráni históriu a pozície prehrávaných streamov</string>\n    <string name=\"delete_view_history_alert\">Vymazať celú históriu pozerania?</string>\n    <string name=\"watch_history_deleted\">História pozerania bola vymazaná</string>\n    <string name=\"clear_search_history_title\">Vymazať históriu vyhľadávania</string>\n    <string name=\"clear_search_history_summary\">Odstráni históriu vyhľadávania kľúčových slov</string>\n    <string name=\"delete_search_history_alert\">Vymazať celú históriu vyhľadávania\\?</string>\n    <string name=\"search_history_deleted\">História vyhľadávaní bola vymazaná</string>\n    <string name=\"one_item_deleted\">1 položka bola vymazaná.</string>\n    <string name=\"app_license\">NewPipe je slobodný softvér pod licenciou copyleft. Môžete ho používať, študovať a vylepšovať ako len chcete. Konkrétne ho môžete šíriť a/alebo upravovať pod podmienkami Všeobecnej verejnej licencie GNU, ako ju publikuje Free Software Foundation, buď verzia 3 licencie, alebo (podľa vašej voľby) ktorákoľvek neskoršia verzia.</string>\n    <string name=\"privacy_policy_title\">Ochrana osobných údajov v NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe projekt berie vaše súkromie vážne. Preto aplikácia nezhromažďuje žiadne údaje bez vášho súhlasu.\n\\nNewPipe v ochrane súkromia podrobne vysvetľuje, aké údaje budú odoslané a uložené pri hlásení o páde.</string>\n    <string name=\"read_privacy_policy\">Prečítajte si pravidlá ochrany osobných údajov</string>\n    <string name=\"import_settings\">Chcete zároveň importovať aj nastavenia?</string>\n    <string name=\"start_accept_privacy_policy\">V súlade s Európskym Všeobecným Nariadením o Ochrane Údajov (GDPR), chceme upriamiť Vašu pozornosť na zmluvu o ochrane osobných údajov v NewPipe. Starostlivo si ju prečítajte.\n\\nMusíte ju prijať pred nahlásením chyby.</string>\n    <string name=\"accept\">Prijať</string>\n    <string name=\"decline\">Odmietnuť</string>\n    <string name=\"limit_data_usage_none_description\">Bez limitu</string>\n    <string name=\"limit_mobile_data_usage_title\">Limitovať rozlíšenie pri použití mobilných dát</string>\n    <string name=\"channels\">Kanály</string>\n    <string name=\"playlists\">Playlisty</string>\n    <string name=\"tracks\">Skladby</string>\n    <string name=\"users\">Používatelia</string>\n    <string name=\"skip_silence_checkbox\">Pretáčať tiché pasáže</string>\n    <string name=\"playback_step\">Krok</string>\n    <string name=\"playback_reset\">Vynulovať</string>\n    <string name=\"minimize_on_exit_title\">Minimalizovať pri prepnutí aplikácie</string>\n    <string name=\"minimize_on_exit_summary\">Akcia pri prepnutí do inej aplikácie z hlavného prehrávača videa - %s</string>\n    <string name=\"minimize_on_exit_none_description\">Nič</string>\n    <string name=\"minimize_on_exit_background_description\">Prehrávať na pozadí</string>\n    <string name=\"minimize_on_exit_popup_description\">Prehrávať v okne</string>\n    <string name=\"unsubscribe\">Zrušiť odber</string>\n    <string name=\"tab_choose\">Zvoliť panel</string>\n    <string name=\"settings_category_updates_title\">Aktualizácie</string>\n    <string name=\"events\">Udalosti</string>\n    <string name=\"file_deleted\">Súbor vymazaný</string>\n    <string name=\"app_update_notification_channel_name\">Oznámenie o aktualizácii aplikácie</string>\n    <string name=\"app_update_notification_channel_description\">Upozornenia na novú verziu NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Externé úložisko je nedostupné</string>\n    <string name=\"download_to_sdcard_error_message\">Sťahovanie na externú SD kartu nie je možné. Obnoviť umiestnenie priečinka na sťahovanie\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Chyba pri načítavaní uložených kariet, použijú sa predvolené</string>\n    <string name=\"restore_defaults\">Obnoviť predvolené nastavenia</string>\n    <string name=\"restore_defaults_confirmation\">Chcete obnoviť predvolené hodnoty\\?</string>\n    <string name=\"subscribers_count_not_available\">Počet odberateľov nie je k dispozícii</string>\n    <string name=\"main_page_content_summary\">Aké karty sa zobrazujú na hlavnej stránke</string>\n    <string name=\"conferences\">Konferencie</string>\n    <string name=\"updates_setting_title\">Aktualizácie</string>\n    <string name=\"updates_setting_description\">Zobrazí sa výzva na aktualizáciu aplikácie, keď je k dispozícii nová verzia</string>\n    <string name=\"list_view_mode\">Režim zobrazenia zoznamu</string>\n    <string name=\"list\">Zoznam</string>\n    <string name=\"grid\">Mriežka</string>\n    <string name=\"auto\">Auto</string>\n    <string name=\"app_update_available_notification_title\">Aktualizácia NewPipe je k dispozícii!</string>\n    <string name=\"missions_header_finished\">Ukončené</string>\n    <string name=\"missions_header_pending\">Vo fronte</string>\n    <string name=\"paused\">pozastavené</string>\n    <string name=\"queued\">vo fronte</string>\n    <string name=\"post_processing\">následné spracovanie</string>\n    <string name=\"enqueue\">Fronta</string>\n    <string name=\"permission_denied\">Akcia odmietnutá systémom</string>\n    <string name=\"download_failed\">Sťahovanie zlyhalo</string>\n    <string name=\"generate_unique_name\">Vytvoriť jedinečný názov</string>\n    <string name=\"overwrite\">Prepísať</string>\n    <string name=\"overwrite_unrelated_warning\">Súbor s týmto názvom už existuje</string>\n    <string name=\"overwrite_finished_warning\">Stiahnutý súbor s týmto názvom už existuje</string>\n    <string name=\"download_already_running\">Sťahovanie s týmto názvom už prebieha</string>\n    <string name=\"show_error\">Zobraziť chybu</string>\n    <string name=\"error_path_creation\">Adresár nie je možné vytvoriť</string>\n    <string name=\"error_file_creation\">Nie je možné vytvoriť súbor</string>\n    <string name=\"error_ssl_exception\">Nepodarilo sa vytvoriť zabezpečené pripojenie</string>\n    <string name=\"error_unknown_host\">Server sa nepodarilo nájsť</string>\n    <string name=\"error_connect_host\">Nepodarilo sa pripojiť k serveru</string>\n    <string name=\"error_http_no_content\">Server neposiela údaje</string>\n    <string name=\"error_http_unsupported_range\">Server neakceptuje preberanie viacerých vlákien, zopakujte s @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Nenájdené</string>\n    <string name=\"error_postprocessing_failed\">Post-spracovanie zlyhalo</string>\n    <string name=\"stop\">Stop</string>\n    <string name=\"max_retry_msg\">Maximum opakovaní</string>\n    <string name=\"max_retry_desc\">Maximálny počet pokusov pred zrušením sťahovania</string>\n    <string name=\"pause_downloads_on_mobile\">Pozastaviť pri prechode na mobilné dáta</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Je to užitočné pri prechode na mobilné dáta, niektoré sťahovania však nemožno pozastaviť</string>\n    <string name=\"show_comments_title\">Zobraziť komentáre</string>\n    <string name=\"show_comments_summary\">Vypnutím tejto funkcie sa nebudú zobrazovať komentáre</string>\n    <string name=\"autoplay_title\">Automatické prehrávanie</string>\n    <string name=\"no_comments\">Žiadne komentáre</string>\n    <string name=\"error_unable_to_load_comments\">Nemožno načítať komentáre</string>\n    <string name=\"close\">Zatvoriť</string>\n    <string name=\"enable_playback_resume_title\">Obnoviť prehrávanie</string>\n    <string name=\"enable_playback_resume_summary\">Obnoví poslednú pozíciu prehrávania</string>\n    <string name=\"enable_playback_state_lists_title\">Poradie v zoznamoch</string>\n    <string name=\"enable_playback_state_lists_summary\">Zobrazí indikátory pozície prehrávania v zoznamoch</string>\n    <string name=\"settings_category_clear_data_title\">Vymazať údaje</string>\n    <string name=\"watch_history_states_deleted\">Pozície prehrávania boli odstránené</string>\n    <string name=\"missing_file\">Súbor bol presunutý alebo odstránený</string>\n    <string name=\"overwrite_failed\">súbor nemožno prepísať</string>\n    <string name=\"download_already_pending\">Súbor s rovnakým názvom už čaká na stiahnutie</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe bol ukončený počas spracovávania súboru</string>\n    <string name=\"error_insufficient_storage_left\">V zariadení už nie je voľné miesto</string>\n    <string name=\"error_progress_lost\">Nemožno pokračovať, súbor bol vymazaný</string>\n    <string name=\"error_timeout\">Spojenie vypršalo</string>\n    <string name=\"confirm_prompt\">Chcete vymazať históriu sťahovania alebo odstrániť všetky stiahnuté súbory\\?</string>\n    <string name=\"enable_queue_limit\">Limitovať počet položiek pri sťahovaní</string>\n    <string name=\"enable_queue_limit_desc\">Súbory sa budú sťahovať jeden po druhom</string>\n    <string name=\"start_downloads\">Spustite sťahovanie</string>\n    <string name=\"pause_downloads\">Pozastaviť sťahovanie</string>\n    <string name=\"downloads_storage_ask_title\">Pýtať sa na adresár sťahovania</string>\n    <string name=\"downloads_storage_ask_summary\">Pri každom sťahovaní súboru sa bude vyžadovať zadanie cieľového adresára.\n\\nAk chcete súbory sťahovať na externú SD kartu povoľte možnosť výberu adresára (SAF)</string>\n    <string name=\"downloads_storage_use_saf_title\">Použite výber adresára (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\\"Storage Access Framework\\\" umožňuje sťahovanie na externú SD kartu</string>\n    <string name=\"clear_playback_states_title\">Odstrániť pozície prehrávania</string>\n    <string name=\"clear_playback_states_summary\">Odstráni všetky pozície prehrávania</string>\n    <string name=\"delete_playback_states_alert\">Odstrániť všetky pozície prehrávania\\?</string>\n    <string name=\"drawer_header_description\">Prepnúť službu, práve vybraté:</string>\n    <string name=\"default_kiosk_page_summary\">Predvolený kiosk</string>\n    <string name=\"no_one_watching\">Toto nikto nesleduje</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s sleduje</item>\n        <item quantity=\"few\">%s sledujú</item>\n        <item quantity=\"other\">%s sleduje</item>\n    </plurals>\n    <string name=\"no_one_listening\">Toto nikto nepočúva</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s poslucháč</item>\n        <item quantity=\"few\">%s poslucháči</item>\n        <item quantity=\"other\">%s poslucháčov</item>\n    </plurals>\n    <string name=\"seek_duration_title\">Dĺžka rýchleho pretáčania</string>\n    <string name=\"peertube_instance_url_title\">Inštancie PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Vyberte si svoje obľúbené inštancie PeerTube</string>\n    <string name=\"peertube_instance_url_help\">Nájdite inštancie, ktoré chcete na %s</string>\n    <string name=\"peertube_instance_add_title\">Pridať inštanciu</string>\n    <string name=\"peertube_instance_add_help\">Vložiť URL inštancie</string>\n    <string name=\"peertube_instance_add_fail\">Nepodarilo sa overiť inštanciu</string>\n    <string name=\"peertube_instance_add_https_only\">Podporované sú iba adresy URL s HTTPS</string>\n    <string name=\"peertube_instance_add_exists\">Inštancia už existuje</string>\n    <string name=\"local\">Miestne</string>\n    <string name=\"recently_added\">Nedávno pridané</string>\n    <string name=\"most_liked\">Najobľúbenejšie</string>\n    <string name=\"playlist_no_uploader\">Automaticky generované (používateľ sa nenašiel)</string>\n    <string name=\"recovering\">obnovovanie</string>\n    <string name=\"error_download_resource_gone\">Sťahovanie nemožno obnoviť</string>\n    <string name=\"choose_instance_prompt\">Vyberte inštanciu</string>\n    <string name=\"clear_download_history\">Vymazať históriu sťahovania</string>\n    <string name=\"delete_downloaded_files\">Vymazať stiahnuté súbory</string>\n    <string name=\"permission_display_over_apps\">Súhlas pre zobrazenie cez ďalšie aplikácie</string>\n    <string name=\"app_language_title\">Jazyk aplikácie</string>\n    <string name=\"systems_language\">Predvolený</string>\n    <string name=\"subtitle_activity_recaptcha\">Vyrieš a stlač \\\"Hotovo\\\"</string>\n    <string name=\"done\">Hotovo</string>\n    <string name=\"videos_string\">Videá</string>\n    <string name=\"new_seek_duration_toast\">Pre obmedzenie ExoPlayera bolo prehľadávania nastavené na %d sekúnd</string>\n    <string name=\"mute\">Stlmiť</string>\n    <string name=\"unmute\">Povoliť</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekunda</item>\n        <item quantity=\"few\">%d sekundy</item>\n        <item quantity=\"other\">%d sekúnd</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minuta</item>\n        <item quantity=\"few\">%d minuty</item>\n        <item quantity=\"other\">%d minút</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d hodina</item>\n        <item quantity=\"few\">%d hodiny</item>\n        <item quantity=\"other\">%d hodín</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d deň</item>\n        <item quantity=\"few\">%d dni</item>\n        <item quantity=\"other\">%d dní</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">Skupiny kanálov</string>\n    <string name=\"feed_oldest_subscription_update\">Zdroj aktualizovaný: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Nenačítané: %d</string>\n    <string name=\"feed_notification_loading\">Načítavanie zdroja…</string>\n    <string name=\"feed_processing_message\">Spracovávanie zdroja…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Vyberte odbery</string>\n    <string name=\"feed_group_dialog_empty_selection\">Žiadne vybrané odbery</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d vybraný</item>\n        <item quantity=\"few\">%d vybrané</item>\n        <item quantity=\"other\">%d vybraných</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">Bez názvu skupiny</string>\n    <string name=\"feed_group_dialog_delete_message\">Chcete zmazať vybranú skupinu\\?</string>\n    <string name=\"feed_create_new_group_button_title\">Nový</string>\n    <string name=\"settings_category_feed_title\">Zdroj</string>\n    <string name=\"feed_update_threshold_title\">Interval obnovy zdroja</string>\n    <string name=\"feed_update_threshold_summary\">Čas od poslednej aktualizácie, kedy sa odber považuje za neaktuálny - %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Vždy aktualizovať</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Načítať z vyhradeného zdroja, ak je k dispozícii</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Povoliť rýchly režim</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Zakázať rýchly režim</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Myslíte si, že načítavanie informačného kanála je príliš pomalé\\? Ak áno, skúste povoliť rýchle načítanie (môžete ho zmeniť v nastaveniach alebo stlačením tlačidla nižšie). \n\\n \n\\nNewPipe ponúka dve stratégie načítania informačného kanála: \n\\n• Načítava sa celý kanál prihlásenia na odber, ktorý je pomalý, ale úplný. \n\\n• Používanie vyhradeného koncového bodu služby, ktorý je rýchly, ale zvyčajne nie je kompletný. \n\\n \n\\nRozdiel medzi nimi je ten, že v prípade rýchleho zvyčajne chýbajú nejaké informácie, napríklad trvanie alebo typ položky (nedá sa rozlíšiť medzi živými videami a normálnymi videami) a môže načítať menej položiek. \n\\n \n\\nYouTube je príkladom služby, ktorá ponúka túto rýchlu metódu s informačným kanálom RSS. \n\\n \n\\nTakže výber sa zredukuje na to, čo uprednostňujete: rýchlosť alebo presné informácie.</string>\n    <string name=\"content_not_supported\">Tento obsah ešte nie je podporovaný v NwPipe.\n\\n\n\\nMožno v budúcnosti sa to zmení.</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Áno aj čiastočne pozreté videá</string>\n    <string name=\"remove_watched_popup_warning\">Videá, ktoré ste sledovali pred a po pridaní do playlistu, budú odstránené. \\nNaozaj to chcete urobiť?</string>\n    <string name=\"remove_watched_popup_title\">Odstrániť pozerané videá?</string>\n    <string name=\"remove_watched\">Odstrániť pozerané</string>\n    <string name=\"show_original_time_ago_summary\">Pôvodné texty zo služieb budú viditeľné v položkách streamu</string>\n    <string name=\"show_original_time_ago_title\">Zobrazovať pôvodný čas</string>\n    <string name=\"infinite_videos\">∞ videí</string>\n    <string name=\"more_than_100_videos\">100+ videí</string>\n    <string name=\"artists\">Umelci</string>\n    <string name=\"songs\">Skladby</string>\n    <string name=\"albums\">Albumy</string>\n    <string name=\"restricted_video\">Vekovo obmedzené video.\n\\n\n\\nPre zobrazenie videa povoľte \\\"%1$s\\\" v nastaveniach.</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Zapnúť \\\"Obmedzený režim YouTube\\\"</string>\n    <string name=\"video_detail_by\">%s</string>\n    <string name=\"channel_created_by\">Vytvoril %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Minuatúrny avatar kanála</string>\n    <string name=\"error_report_open_issue_button_text\">Nahlásiť na GitHub-e</string>\n    <string name=\"copy_for_github\">Kopírovať formátované hlásenie</string>\n    <string name=\"search_showing_result_for\">Zobrazujú sa výsledky pre: %s</string>\n    <string name=\"playlist_page_summary\">Zoznam playlistov</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Zobraziť iba nezoskupené odbery</string>\n    <string name=\"never\">Nikdy</string>\n    <string name=\"wifi_only\">Iba na WiFi</string>\n    <string name=\"autoplay_summary\">Spustí automatické prehrávanie - %s</string>\n    <string name=\"title_activity_play_queue\">Prehrať zoznam</string>\n    <string name=\"no_playlist_bookmarked_yet\">Žiadne záložky playlistov</string>\n    <string name=\"select_a_playlist\">Vyberte playlist</string>\n    <string name=\"error_report_open_github_notice\">Skontrolujte prosím, či rovnaká chyba už nie je nahlásená. Vytváranie duplicitných hlásení komplikuje prácu vývojárov.</string>\n    <string name=\"unsupported_url_dialog_message\">Nemožno rozpoznať URL. Otvoriť pomocou inej aplikácie\\?</string>\n    <string name=\"auto_queue_toggle\">Automatický rad</string>\n    <string name=\"clear_queue_confirmation_description\">Zoznam aktuálneho prehrávača bude prepísaný</string>\n    <string name=\"clear_queue_confirmation_summary\">Prepnutie z jedného prehrávača na druhý môže nahradiť vaše poradie</string>\n    <string name=\"clear_queue_confirmation_title\">Vyžadovať povolenie pred vyčistením zoznamu</string>\n    <string name=\"notification_action_nothing\">Nič</string>\n    <string name=\"notification_action_buffering\">Bufferuje</string>\n    <string name=\"notification_action_shuffle\">Náhodné</string>\n    <string name=\"notification_action_repeat\">Opakovať</string>\n    <string name=\"notification_actions_at_most_three\">V kompaktnom oznámení môžete vybrať najviac tri akcie, ktoré sa majú zobraziť!</string>\n    <string name=\"notification_actions_summary\">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í.</string>\n    <string name=\"notification_action_4_title\">Akčné tlačidlo päť</string>\n    <string name=\"notification_action_3_title\">Akčné tlačidlo štyri</string>\n    <string name=\"notification_action_2_title\">Akčné tlačidlo tri</string>\n    <string name=\"notification_action_1_title\">Akčné tlačidlo dva</string>\n    <string name=\"notification_action_0_title\">Akčné tlačidlo jedna</string>\n    <string name=\"notification_scale_to_square_image_summary\">Oreže miniatúru videa zobrazenej v oznámení z pomeru strán 16:9 na 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Orezať pomer strán miniatúry na 1: 1</string>\n    <string name=\"show_memory_leaks\">Zobraziť memory leaks</string>\n    <string name=\"enqueued\">Zaradené do poradia</string>\n    <string name=\"enqueue_stream\">Zaradiť do poradia</string>\n    <string name=\"clear_cookie_summary\">Vymaže cookies, ktoré NewPipe ukladá, keď vyriešite reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA cookies boli vymazané</string>\n    <string name=\"clear_cookie_title\">Vymazať cookies reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube poskytuje \\\"Obmedzený režim\\\", ktorý skrýva potenciálny obsah pre dospelých</string>\n    <string name=\"show_age_restricted_content_summary\">Zobrazí obsah, ktorý je pravdepodobne nevhodný pre deti, pretože má vekové obmedzenie (napríklad 18+)</string>\n    <string name=\"notification_colorize_summary\">Nechajte Android, aby prispôsobil farbu oznámenia podľa hlavnej farby v miniatúre (nemusí to fungovať na všetkých zariadeniach)</string>\n    <string name=\"notification_colorize_title\">Farby upozornení</string>\n    <string name=\"show_thumbnail_title\">Zobrazovať miniatúru</string>\n    <string name=\"show_thumbnail_summary\">Použije miniatúru pre pozadie uzamknutej obrazovke a oznámenia</string>\n    <string name=\"msg_calculating_hash\">Počítanie hash</string>\n    <string name=\"hash_channel_description\">Oznámenia o priebehu hašovania videa</string>\n    <string name=\"hash_channel_name\">Oznámenie o hashovaní videa</string>\n    <string name=\"recent\">Nedávne</string>\n    <string name=\"show_meta_info_summary\">Vypnutím skryjete metainformačné polia s ďalšími informáciami o autorovi streamu, obsahu streamu alebo požiadavke na vyhľadávanie</string>\n    <string name=\"show_meta_info_title\">Zobrazovať meta informácie</string>\n    <string name=\"chapters\">Kapitoly</string>\n    <string name=\"description_tab_description\">Popis</string>\n    <string name=\"related_items_tab_description\">Súvisiace streamy</string>\n    <string name=\"comments_tab_description\">Komentáre</string>\n    <string name=\"show_description_summary\">Vypnutím skryjete popis videa a ďalšie informácie</string>\n    <string name=\"show_description_title\">Zobraziť popis</string>\n    <string name=\"open_with\">Otvoriť s</string>\n    <string name=\"no_app_to_open_intent\">Aplikácia na otvorenie súboru nie je nainštalovaná</string>\n    <string name=\"paid_content\">Tento obsah je k dispozícii iba platiacim používateľom, preto ho NewPipe nemôže streamovať ani sťahovať.</string>\n    <string name=\"youtube_music_premium_content\">Toto video je k dispozícii iba členom služby YouTube Music Premium, preto ho NewPipe nemôže streamovať ani sťahovať.</string>\n    <string name=\"private_content\">Toto je privátny obsah a preto ho NewPipe nemôže prehrávať ani sťahovať.</string>\n    <string name=\"soundcloud_go_plus_content\">Táto skladba je typu SoundCloud Go+, pre vašu krajinu je tento typ zakázaný a preto ju NewPipe nemôže streamovať ani sťahovať.</string>\n    <string name=\"georestricted_content\">Tento obsah nie je vo vašej krajine k dispozícii.</string>\n    <string name=\"crash_the_app\">Vynútiť zastavenie</string>\n    <string name=\"restricted_video_no_stream\">Toto video je vekovo obmedzené.\n\\nNewPipe ho nemôže prehrať z dôvodu nových pravidiel služby YouTube pre videá s vekovým obmedzením.</string>\n    <string name=\"download_has_started\">Sťahovanie začalo</string>\n    <string name=\"select_night_theme_toast\">Dolu si môžete vybrať svoju obľúbenú nočnú tému</string>\n    <string name=\"night_theme_summary\">Vyberte si svoju obľúbenú nočnú tému — %s</string>\n    <string name=\"auto_device_theme_title\">Automatická (téma zariadenia)</string>\n    <string name=\"radio\">Rádio</string>\n    <string name=\"featured\">Najlepšie</string>\n    <string name=\"show_channel_details\">Zobraziť podrobnosti kanála</string>\n    <string name=\"recaptcha_solve\">Vyrieš</string>\n    <string name=\"night_theme_title\">Nočná téma</string>\n    <string name=\"disable_media_tunneling_summary\">Ak sa video pri prehrávaní seká alebo sa objaví čierna obrazovka, vypnite tunelovanie médií.</string>\n    <string name=\"disable_media_tunneling_title\">Zakázať tunelovanie médií</string>\n    <string name=\"metadata_privacy_internal\">Interné</string>\n    <string name=\"metadata_privacy_private\">Súkromné</string>\n    <string name=\"metadata_privacy_unlisted\">Nezaradené</string>\n    <string name=\"metadata_privacy_public\">Verejné</string>\n    <string name=\"metadata_host\">Hostiteľ</string>\n    <string name=\"metadata_support\">Podpora</string>\n    <string name=\"metadata_language\">Jazyk</string>\n    <string name=\"metadata_age_limit\">Vekový limit</string>\n    <string name=\"metadata_privacy\">Ochrana osobných údajov</string>\n    <string name=\"metadata_licence\">Licencia</string>\n    <string name=\"metadata_tags\">Tagy</string>\n    <string name=\"metadata_category\">Kategória</string>\n    <string name=\"description_select_disable\">Zakázať výber textu v popise</string>\n    <string name=\"description_select_enable\">Povolenie výberu textu v popise</string>\n    <string name=\"description_select_note\">Teraz môžete vybrať text vo vnútri popisu. Upozorňujeme, že stránka môže blikať a odkazy nemusia byť klikateľné, keď je v režime výberu.</string>\n    <string name=\"open_website_license\">Otvoriť webstránku</string>\n    <string name=\"account_terminated\">Účet bol zrušený</string>\n    <string name=\"feed_load_error_fast_unknown\">Tento rýchly režim neposkytuje viac informácií.</string>\n    <string name=\"feed_load_error_terminated\">Účet autora bol zrušený.\n\\nPreto ho NewPipe nebude môcť v budúcnosti načítať.\n\\nChcete sa odhlásiť z odberu tohto kanála\\?</string>\n    <string name=\"feed_load_error_account_info\">Nemožno načítať informačný kanál \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Chyba pri načítaní kanála</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Od Androidu 10 je podporovaný len \\'Storage Access Framework\\'</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Pri každom sťahovaní sa zobrazí výzva, kam uložiť súbor</string>\n    <string name=\"no_dir_yet\">Nie je nastavený adresár na sťahovanie, nastavte ho teraz</string>\n    <string name=\"mark_as_watched\">Označiť ako videné</string>\n    <string name=\"off\">Vypnuté</string>\n    <string name=\"on\">Zapnuté</string>\n    <string name=\"tablet_mode_title\">Režim tabletu</string>\n    <string name=\"detail_heart_img_view_description\">Obľúbené autorom</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s sťahovanie zmazané</item>\n        <item quantity=\"few\">%1$s sťahovania zmazané</item>\n        <item quantity=\"other\">%1$s sťahovaní zmazaných</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Sťahovanie ukončené</item>\n        <item quantity=\"few\">%s ukončené sťahovania</item>\n        <item quantity=\"other\">%s ukončených sťahovaní</item>\n    </plurals>\n    <string name=\"dont_show\">Neukazovať</string>\n    <string name=\"low_quality_smaller\">Nízka kvalita (menšie)</string>\n    <string name=\"high_quality_larger\">Vysoká kvalita (väčšie)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Náhľad miniatúry pri vyhľadávaní</string>\n    <string name=\"main_page_content_swipe_remove\">Potiahnutím vymazať</string>\n    <string name=\"comments_are_disabled\">Komentáre sú zakázané</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"start_main_player_fullscreen_title\">Hlavný prehrávač na celej obrazovke</string>\n    <string name=\"remote_search_suggestions\">Návrhy vzdialeného vyhľadávania</string>\n    <string name=\"local_search_suggestions\">Miestne návrhy vyhľadávania</string>\n    <string name=\"enqueue_next_stream\">Pridať do zoznamu</string>\n    <string name=\"enqueued_next\">Ďaľší v poradí</string>\n    <string name=\"processing_may_take_a_moment\">Spracovávanie... môže to chvíľku trvať</string>\n    <string name=\"check_for_updates\">Skontrolovať aktualizácie</string>\n    <string name=\"manual_update_description\">Ručne skontrolovať nové verzie</string>\n    <string name=\"checking_updates_toast\">Kontrolujú sa aktualizácie…</string>\n    <string name=\"feed_new_items\">Nové položky informačného kanála</string>\n    <string name=\"no_appropriate_file_manager_message\">Pre túto akciu sa nenašiel vhodný správca súborov.\n\\nNainštalujte si správcu súborov alebo skúste vypnúť \\'%s\\' v nastaveniach sťahovania</string>\n    <string name=\"show_crash_the_player_title\">Zobraziť „Zhodiť prehrávač“</string>\n    <string name=\"leak_canary_not_available\">LeakCanary nie je k dispozícii</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Pre túto akciu sa nenašiel vhodný správca súborov.\n\\nNainštalujte správcu súborov kompatibilného s rozhraním Storage Access Framework</string>\n    <string name=\"detail_pinned_comment_view_description\">Pripnutý komentár</string>\n    <string name=\"crash_the_player\">Zlyhanie prehrávača</string>\n    <string name=\"error_report_channel_name\">Nahlásenie chyby</string>\n    <string name=\"error_report_channel_description\">Hlásenie chýb</string>\n    <string name=\"error_report_notification_title\">V NewPipe sa vyskytla chyba, klepnutím ju nahláste</string>\n    <string name=\"error_report_notification_toast\">Vyskytla sa chyba, pozrite si upozornenie</string>\n    <string name=\"show_crash_the_player_summary\">Zobrazí možnosť zlyhania pri používaní prehrávača</string>\n    <string name=\"show_error_snackbar\">Zobraziť krátke oznámenie chyby</string>\n    <string name=\"create_error_notification\">Oznámte chybu</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer preddefinovaný</string>\n    <string name=\"notifications\">Upozornenia</string>\n    <string name=\"streams_notifications_interval_title\">Frekvencia kontroly</string>\n    <string name=\"delete_downloaded_files_confirm\">Vymazať všetky stiahnuté súbory z disku\\?</string>\n    <string name=\"notifications_disabled\">Upozornenia sú vypnuté</string>\n    <string name=\"settings_category_player_notification_title\">Upozornenie z prehrávača</string>\n    <string name=\"settings_category_player_notification_summary\">Nastavte oznámenie aktuálneho streamu prehrávania</string>\n    <string name=\"streams_notifications_network_title\">Je vyžadované pripojenie na internet</string>\n    <string name=\"you_successfully_subscribed\">Začali ste odoberať tento kanál</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Zapnúť všetko</string>\n    <string name=\"streams_notification_channel_name\">Nové streamy</string>\n    <string name=\"streams_notification_channel_description\">Oznámenia o nových streamoch v odberoch</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s nový stream</item>\n        <item quantity=\"few\">%s nové streamy</item>\n        <item quantity=\"other\">%s nových streamov</item>\n    </plurals>\n    <string name=\"check_new_streams\">Skontrolovať nové streamy</string>\n    <string name=\"enable_streams_notifications_title\">Upozornenia na nové streamy</string>\n    <string name=\"enable_streams_notifications_summary\">Upozorní na nové streamy z odberov</string>\n    <string name=\"any_network\">Akákoľvek sieť</string>\n    <string name=\"get_notified\">Dostávať upozornenia</string>\n    <string name=\"semitone\">Poltón</string>\n    <string name=\"loading_stream_details\">Nahrávanie podrobností streamu…</string>\n    <string name=\"percent\">Percent</string>\n    <string name=\"selected_stream_external_player_not_supported\">Vybraný stream nie je podporovaný externými prehrávačmi</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Žiadne audio streamy nie sú k dispozícií pre externé prehrávače</string>\n    <string name=\"select_quality_external_players\">Vybrať kvalitu pre externé prehrávače</string>\n    <string name=\"unknown_format\">Neznámy formát</string>\n    <string name=\"progressive_load_interval_title\">Interval medzipamäte</string>\n    <string name=\"streams_not_yet_supported_removed\">Streamy nepodporované sťahovačom sa nezobrazujú</string>\n    <string name=\"no_video_streams_available_for_external_players\">Žiadne video streamy nie sú k dispozícií pre externé prehrávače</string>\n    <string name=\"unknown_quality\">Neznáma kvalita</string>\n    <string name=\"faq_title\">Často kladené otázky</string>\n    <string name=\"faq\">Pozrieť na webovej stránke</string>\n    <string name=\"sort\">Usporiadať</string>\n    <string name=\"faq_description\">Ak máte problémy s používaním aplikácie, určite si prečítajte tieto odpovede na časté otázky!</string>\n    <string name=\"unset_playlist_thumbnail\">Vypnutie trvalého náhľadu</string>\n    <string name=\"msg_failed_to_copy\">Kopírovanie do schránky zlyhalo</string>\n    <string name=\"duplicate_in_playlist\">Playlisty zobrazené šedou farbou už obsahujú danú položku.</string>\n    <string name=\"card\">Karta</string>\n    <string name=\"app_update_available_notification_text\">Dotykom stiahnite %s</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Duplikát bol pridaný %d-krát</string>\n    <string name=\"app_update_unavailable_toast\">Používate najnovšiu verziu NewPipe</string>\n    <string name=\"night_theme_available\">Táto možnosť je dostupná len pre motív %s</string>\n    <string name=\"fast_mode\">Rýchly režim</string>\n    <string name=\"import_subscriptions_hint\">Importujte alebo exportujte odbery v menu s 3-mi bodkami</string>\n    <string name=\"left_gesture_control_title\">Akcia gesta vľavo</string>\n    <string name=\"right_gesture_control_summary\">Vyberte gesto pre pravú polovicu obrazovky prehrávača</string>\n    <string name=\"right_gesture_control_title\">Akcia gesta vpravo</string>\n    <string name=\"left_gesture_control_summary\">Vyberte gesto pre ľavú polovicu obrazovky prehrávača</string>\n    <string name=\"brightness\">Jas</string>\n    <string name=\"volume\">Hlasitosť</string>\n    <string name=\"none\">Nič</string>\n    <string name=\"remove_duplicates\">Odstrániť duplikáty</string>\n    <string name=\"remove_duplicates_title\">Odstrániť duplikáty\\?</string>\n    <string name=\"feed_show_partially_watched\">Rozpozerané</string>\n    <string name=\"feed_show_watched\">Dopozerané</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Toto sa môže hodiť v prípade, že máte pokazené tlačidlá na slúchadlách</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorovať fyzické tlačidlá</string>\n    <string name=\"progressive_load_interval_summary\">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</string>\n    <string name=\"prefer_original_audio_title\">Preferovať pôvodné audio</string>\n    <string name=\"prefer_original_audio_summary\">Vyberte pôvodnú zvukovú stopu bez ohľadu na jazyk</string>\n    <string name=\"prefer_descriptive_audio_title\">Preferovať prehrávanie popisu</string>\n    <string name=\"play_queue_audio_track\">Zvuk: %s</string>\n    <string name=\"audio_track\">Zvuková stopa</string>\n    <string name=\"remove_duplicates_message\">Chcete odstrániť všetky duplikátne streamy z tohoto playlistu?</string>\n    <string name=\"feed_hide_streams_title\">Zobrazovať nasledovné streamy</string>\n    <string name=\"audio_track_present_in_video\">V tomto streame by už mala byť prítomná zvuková stopa</string>\n    <string name=\"select_audio_track_external_players\">Výber zvukovej stopy pre externé prehrávače</string>\n    <string name=\"unknown_audio_track\">Neznáma</string>\n    <string name=\"feed_show_upcoming\">Nadchádzajúce</string>\n    <string name=\"settings_category_exoplayer_summary\">Úprava niektorých nastavení prehrávača ExoPlayer. Pre aplikovanie týchto zmien je potrebné reštartovať prehrávač</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Použiť funkciu záložného dekodéra prehrávača ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Vždy použiť nastavenia výstupu videa ExoPlayera</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">povodná</string>\n    <string name=\"audio_track_type_dubbed\">dabovaná</string>\n    <string name=\"prefer_descriptive_audio_summary\">Vyberte zvukovú stopu s popisom pre osoby so zrakovým postihnutím, ak je k dispozícii</string>\n    <string name=\"feed_show_hide_streams\">Zobrazovať/Skrývať streamy</string>\n    <string name=\"settings_category_exoplayer_title\">Nastavenia ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\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</string>\n    <string name=\"audio_track_type_descriptive\">popisná</string>\n    <string name=\"channel_tab_videos\">Videá</string>\n    <string name=\"metadata_subscribers\">Odberatelia</string>\n    <string name=\"show_channel_tabs_summary\">Aké karty sa zobrazujú na stránkach kanála</string>\n    <string name=\"show_channel_tabs\">Karty kanálov</string>\n    <string name=\"channel_tab_shorts\">Krátke</string>\n    <string name=\"loading_metadata_title\">Načítavanie metadát…</string>\n    <string name=\"toggle_screen_orientation\">Prepnúť orientáciu obrazovky</string>\n    <string name=\"main_tabs_position_title\">Poloha hlavných kariet</string>\n    <string name=\"toggle_fullscreen\">Prepnúť na celú obrazovku</string>\n    <string name=\"feed_fetch_channel_tabs\">Načítať karty kanála</string>\n    <string name=\"next_stream\">Ďalší stream</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Vaše zariadenie nepodporuje tunelovanie medií a preto bolo tunelovanie medií zakázané.</string>\n    <string name=\"open_play_queue\">Otvoriť zoznam prehrávania</string>\n    <string name=\"channel_tab_about\">O kanále</string>\n    <string name=\"forward\">Dopredu</string>\n    <string name=\"channel_tab_albums\">Albumy</string>\n    <string name=\"rewind\">Dozadu</string>\n    <string name=\"replay\">Opäť prehrať</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">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.</string>\n    <string name=\"channel_tab_playlists\">Playlisty</string>\n    <string name=\"main_tabs_position_summary\">Presunie výber hlavnej karty do spodnej časti</string>\n    <string name=\"no_live_streams\">Žiadne živé prenosy</string>\n    <string name=\"play\">Prehrať</string>\n    <string name=\"more_options\">Ďalšie možnosti</string>\n    <string name=\"channel_tab_tracks\">Stopy</string>\n    <string name=\"duration\">Dĺžka</string>\n    <string name=\"no_streams\">Žiadne videá</string>\n    <string name=\"channel_tab_channels\">Kanály</string>\n    <string name=\"previous_stream\">Predchádzajúci stream</string>\n    <string name=\"channel_tab_livestreams\">Naživo</string>\n    <string name=\"image_quality_title\">Kvalita obrázkov</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"image_quality_low\">Nízka kvalita</string>\n    <string name=\"metadata_avatars\">Avatary</string>\n    <string name=\"image_quality_none\">Nenačítavať obrázky</string>\n    <string name=\"image_quality_high\">Vysoká kvalita</string>\n    <string name=\"share_playlist\">Zdieľať playlist</string>\n    <string name=\"image_quality_medium\">Stredná kvalita</string>\n    <string name=\"metadata_banners\">Bannery</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"show_more\">Zobraziť viac</string>\n    <string name=\"show_less\">Zobraziť menej</string>\n    <string name=\"notification_actions_summary_android13\">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ť.</string>\n    <string name=\"metadata_thumbnails\">Náhľady</string>\n    <string name=\"metadata_uploader_avatars\">Avatary uploadera</string>\n    <string name=\"metadata_subchannel_avatars\">Sub-kanálové avatary</string>\n    <string name=\"share_playlist_with_titles\">Zdieľať s názvami</string>\n    <string name=\"share_playlist_with_list\">Zdieľať URL playlistu</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s odpoveď</item>\n        <item quantity=\"few\">%s odpovede</item>\n        <item quantity=\"other\">%s odpovedí</item>\n    </plurals>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"error_insufficient_storage\">Nedostatok voľného miesta v zariadení</string>\n    <string name=\"reset_settings_summary\">Obnoví všetky nastavenia na pôvodné hodnoty</string>\n    <string name=\"reset_settings_title\">Obnoviť nastavenia</string>\n    <string name=\"settings_category_backup_restore_title\">Záloha a obnovenie</string>\n    <string name=\"reset_all_settings\">Obnovením nastavení sa zrušia všetky preferované nastavenia a aplikácia sa reštartuje.\n\\n\n\\nSte si istí, že chcete pokračovať?</string>\n    <string name=\"no\">Nie</string>\n    <string name=\"yes\">Áno</string>\n    <string name=\"auto_update_check_description\">NewPipe môže z času na čas automaticky kontrolovať nové verzie a upozorniť vás, keď budú k dispozícii.\n\\nChcete to povoliť?</string>\n    <string name=\"import_settings_vulnerable_format\">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í.</string>\n    <string name=\"audio_track_type_secondary\">sekundárny</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Zdieľať ako dočasný playlist YouTube</string>\n    <string name=\"tab_bookmarks_short\">Playlisty</string>\n    <string name=\"select_a_feed_group\">Vybrať skupinu kanálov</string>\n    <string name=\"no_feed_group_created_yet\">Skupina kanálov zatiaľ nie je vytvorená</string>\n    <string name=\"feed_group_page_summary\">Stránka skupiny kanálov</string>\n    <string name=\"search_with_service_name_and_filter\">Hľadať %1$s (%2$s)</string>\n    <string name=\"search_with_service_name\">Hľadať %1$s</string>\n    <string name=\"channel_tab_likes\">Páči sa</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud Top 50 stránka odstránená</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud prestal používať pôvodnú Top 50. Daná stránka bola odstránená z hlavnej stránky.</string>\n    <string name=\"migration_info_7_8_title\">Odstránené kombinované trendy na YouTube</string>\n    <string name=\"migration_info_7_8_message\">YouTube ukončil prevádzku kombinovanej stránky s trendmi k 21. júlu 2025. NewPipe nahradil predvolenú stránku s trendmi stránkou s trendovými živými prenosmi.\\n\\nV nastaveniach „Nastavenia &gt; Obsah &gt; Obsah hlavnej stránky“ môžete vybrať aj iné stránky s trendmi.</string>\n    <string name=\"trending_gaming\">Populárne hry</string>\n    <string name=\"trending_podcasts\">Populárne podcasty</string>\n    <string name=\"trending_movies\">Populárne filmy a seriály</string>\n    <string name=\"trending_music\">Populárna hudba</string>\n    <string name=\"short_thousand\">%stis.</string>\n    <string name=\"short_million\">%smil.</string>\n    <string name=\"short_billion\">%smld.</string>\n    <string name=\"entry_deleted\">Položka vymazaná</string>\n    <string name=\"delete_entry\">Vymazať položku</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"Povoliť zobrazenie cez iné aplikácie\\\"</string>\n    <string name=\"delete_file\">Vymazať súbor</string>\n    <string name=\"permission_display_over_apps_message\">Ak chcete používať Popup Player, vyberte %1$s v nasledujúcej ponuke nastavení Androidu a povoľte %2$s.</string>\n    <string name=\"account_terminated_service_provides_reason\">Účet bol zrušený\\n\\n%1$s uvádza tento dôvod: %2$s</string>\n    <string name=\"player_http_403\">Počas prehrávania bola zo servera prijatá chyba HTTP 403, pravdepodobne spôsobená vypršaním platnosti streamingovej adresy URL alebo zákazom IP adresy</string>\n    <string name=\"player_http_invalid_status\">Chyba HTTP %1$s prijatá zo servera počas prehrávania</string>\n    <string name=\"youtube_player_http_403\">Chyba HTTP 403 prijatá zo servera počas prehrávania, pravdepodobne spôsobená zákazom IP adresy alebo problémami s deobfuskáciou streamingovej URL adresy</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s odmietol poskytnúť údaje, žiada o prihlásenie na potvrdenie, že žiadateľ nie je bot.\\n\\nVaša IP adresa mohla byť dočasne zakázaná %1$s, môžete nejaký čas počkať alebo prejsť na inú IP adresu (napríklad zapnutím/vypnutím VPN alebo prepnutím z WiFi na mobilné dáta).</string>\n    <string name=\"unsupported_content_in_country\">Tento obsah nie je dostupný pre aktuálne zvolenú krajinu obsahu.\\n\\nZmeňte výber v ponuke \\\"Nastavenia &gt; Obsah &gt; Predvolená krajina obsahu\\\".</string>\n    <string name=\"kao_dialog_warning\">V auguste 2025 spoločnosť Google oznámila, že od septembra 2026 bude inštalácia aplikácií vyžadovať overenie vývojára pre všetky aplikácie Android na certifikovaných zariadeniach, vrátane tých, ktoré sú inštalované mimo obchodu Play Store. Keďže vývojári NewPipe s touto požiadavkou nesúhlasia, NewPipe po tomto termíne nebude na certifikovaných zariadeniach Android fungovať.</string>\n    <string name=\"kao_dialog_more_info\">Podrobnosti</string>\n    <string name=\"kao_solution\">Riešenie</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-sl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Objavljeno %1$s</string>\n    <string name=\"no_player_found\">Predvajalnika pretoka ni mogoče najti. Želite namestiti program VLC\\?</string>\n    <string name=\"install\">Namesti</string>\n    <string name=\"cancel\">Prekliči</string>\n    <string name=\"open_in_browser\">Odpri v brskalniku</string>\n    <string name=\"share\">Omogoči souporabo</string>\n    <string name=\"download\">Prejmi</string>\n    <string name=\"search\">Iskanje</string>\n    <string name=\"settings\">Nastavitve</string>\n    <string name=\"did_you_mean\">Ali ste mislili \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Omogoči souporabo z</string>\n    <string name=\"use_external_video_player_title\">Uporabi zunanji predvajalnik videa</string>\n    <string name=\"use_external_audio_player_title\">Uporabi zunanji predvajalnik zvoka</string>\n    <string name=\"download_path_title\">Mapa z prenesenimi videi</string>\n    <string name=\"download_path_summary\">Preneseni video so shranjeni tukaj</string>\n    <string name=\"download_path_dialog_title\">Izberite mapo za prenos video datotek</string>\n    <string name=\"default_resolution_title\">Privzeta ločljivost</string>\n    <string name=\"play_with_kodi_title\">Predvajaj s Kodi</string>\n    <string name=\"kore_not_found\">Ali želite namestiti manjkajoči program Kore\\?</string>\n    <string name=\"show_play_with_kodi_title\">Pokaži možnost \\\"Predvajaj s Kodi\\\"</string>\n    <string name=\"default_audio_format_title\">Privzet zapis zvoka</string>\n    <string name=\"play_audio\">Zvok</string>\n    <string name=\"download_dialog_title\">Prenesi</string>\n    <string name=\"show_next_and_similar_title\">Pokaži naslednje in podobne posnetke</string>\n    <string name=\"unsupported_url\">Nepodprt URL</string>\n    <string name=\"content_language_title\">Privzeti jezik vsebine</string>\n    <string name=\"settings_category_video_audio_title\">Video in zvok</string>\n    <string name=\"detail_thumbnail_view_description\">Predvajaj video, dolžina:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Sličica objavitelja</string>\n    <string name=\"show_play_with_kodi_summary\">Pokaži možnost predvajanja videa preko predstavnega središča Kodi</string>\n    <string name=\"detail_likes_img_view_description\">Všeč mi je</string>\n    <string name=\"detail_dislikes_img_view_description\">Ni mi všeč</string>\n    <string name=\"background_player_playing_toast\">Predvajanje v ozadju</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"dark_theme_title\">Temna</string>\n    <string name=\"light_theme_title\">Svetla</string>\n    <string name=\"settings_category_appearance_title\">Videz</string>\n    <string name=\"network_error\">Omrežna napaka</string>\n    <string name=\"download_path_audio_title\">Mapa prenesenih avdio datotek</string>\n    <string name=\"download_path_audio_summary\">Prenesene avdio datoteke so shranjene tukaj</string>\n    <string name=\"download_path_audio_dialog_title\">Izberite mapo za prenos avdio datotek</string>\n    <string name=\"general_error\">Napaka</string>\n    <string name=\"could_not_load_thumbnails\">Vseh sličic videov ni mogoče naložiti</string>\n    <string name=\"parsing_error\">Ni mogoče razčleniti spletišča</string>\n    <string name=\"content_not_available\">Vsebina ni na voljo</string>\n    <string name=\"could_not_setup_download_menu\">Ni mogoče nastaviti menija za prejem datotek</string>\n    <string name=\"content\">Vsebina</string>\n    <string name=\"show_age_restricted_content_title\">Pokaži starostno omejeno vsebino</string>\n    <string name=\"sorry_string\">Do te napake naj ne bi prišlo.</string>\n    <string name=\"error_report_button_text\">Prijavite to napako po e-pošti</string>\n    <string name=\"error_snackbar_message\">Prišlo je do napak.</string>\n    <string name=\"error_snackbar_action\">Poročilo</string>\n    <string name=\"what_device_headline\">Podrobnosti:</string>\n    <string name=\"what_happened_headline\">Kaj se je zgodilo:</string>\n    <string name=\"error_details_headline\">Podrobnosi:</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Zvok</string>\n    <string name=\"retry\">Poskusi znova</string>\n    <string name=\"your_comment\">Opomba (v angleščini):</string>\n    <string name=\"duration_live\">v živo</string>\n    <string name=\"main_bg_subtitle\">Pritisnite lupo in začnite z iskanjem.</string>\n    <string name=\"start\">Začni</string>\n    <string name=\"pause\">Premor</string>\n    <string name=\"delete\">Izbriši</string>\n    <string name=\"checksum\">Nadzorna vsota</string>\n    <string name=\"msg_name\">Ime datoteke</string>\n    <string name=\"msg_threads\">Nizi</string>\n    <string name=\"msg_error\">Napaka</string>\n    <string name=\"msg_running\">Prejemanje</string>\n    <string name=\"msg_running_detail\">Podrobnosti</string>\n    <string name=\"msg_wait\">Počakajte …</string>\n    <string name=\"msg_copied\">Kopirano v odložišče</string>\n    <string name=\"no_available_dir\">Izberite mapo za prejem</string>\n    <string name=\"ok\">V redu</string>\n    <string name=\"downloads\">Prejemi</string>\n    <string name=\"downloads_title\">Prejemi</string>\n    <string name=\"error_report_title\">Poročilo o napaki</string>\n    <string name=\"app_ui_crash\">Program se je sesul</string>\n    <string name=\"title_activity_recaptcha\">Izziv reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Zahtevan izziv reCAPTCHA</string>\n    <string name=\"info_labels\">Predmet:\\nZahteva:\\nJezik vsebine:\\nDržava vsebine:\\nJezik aplikacije:\\nStoritev:\\nČas v GMT:\\nPaket:\\nRazličica:\\nRazličica OS:</string>\n    <string name=\"black_theme_title\">Črna</string>\n    <string name=\"all\">Vse</string>\n    <string name=\"open_in_popup_mode\">Odpri v pojavnem načinu</string>\n    <string name=\"msg_popup_permission\">To dovoljenje je potrebno za odpiranje \n\\nv pojavnem načinu</string>\n    <string name=\"popup_playing_toast\">Predvajanje v pojavnem načinu</string>\n    <string name=\"disabled\">Onemogočeno</string>\n    <string name=\"default_video_format_title\">Prednostni zapis video datoteke</string>\n    <string name=\"default_popup_resolution_title\">Privzeta ločljivost pojavnega okna</string>\n    <string name=\"show_higher_resolutions_title\">Pokaži večje ločljivosti</string>\n    <string name=\"show_higher_resolutions_summary\">Predvajanje posnetkov 2K/4K omogočajo le nekatere naprave</string>\n    <string name=\"controls_background_title\">Ozadje</string>\n    <string name=\"controls_popup_title\">Pojavno okno</string>\n    <string name=\"clear\">Počisti</string>\n    <string name=\"popup_remember_size_pos_title\">Zapomni si položaj in velikost pojavnega okna</string>\n    <string name=\"popup_remember_size_pos_summary\">Zapomni si položaj in velikost pojavnega okna</string>\n    <string name=\"use_external_video_player_summary\">Pri nekaterih ločljivostih bo posnetek brez zvoka</string>\n    <string name=\"show_search_suggestions_title\">Predlogi iskanja</string>\n    <string name=\"show_search_suggestions_summary\">Pokaži predloge med iskanjem</string>\n    <string name=\"best_resolution\">Najboljša ločljivost</string>\n    <string name=\"title_activity_about\">O programu</string>\n    <string name=\"title_licenses\">Dovoljenja zunanjih programskih paketov</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s z %2$s z dovoljenjem %3$s</string>\n    <string name=\"tab_about\">O programu</string>\n    <string name=\"tab_licenses\">Dovoljenja</string>\n    <string name=\"view_on_github\">Pokaži na Github</string>\n    <string name=\"app_license_title\">Dovoljenje NewPipe</string>\n    <string name=\"read_full_license\">Preberi določila dovoljenja</string>\n    <string name=\"app_description\">Odprtokodni predvajalnik za Android.</string>\n    <string name=\"subscribe_button_title\">Naroči</string>\n    <string name=\"subscribed_button_title\">Naročeno</string>\n    <string name=\"channel_unsubscribed\">Kanal ni naročen</string>\n    <string name=\"subscription_change_failed\">Ni bilo mogoče spremeniti naročnine</string>\n    <string name=\"subscription_update_failed\">Ni bilo mogoče posodobiti naročnine</string>\n    <string name=\"tab_subscriptions\">Naročnine</string>\n    <string name=\"fragment_feed_title\">Kaj je novega</string>\n    <string name=\"settings_category_downloads_title\">Prejmi</string>\n    <string name=\"settings_file_charset_title\">Dovoljeni znaki v imenih datotek</string>\n    <string name=\"settings_file_replacement_character_summary\">Neveljavni znaki so zamenjani z znakom</string>\n    <string name=\"settings_file_replacement_character_title\">Znak za zamenjavo</string>\n    <string name=\"charset_letters_and_digits\">Črke in številke</string>\n    <string name=\"charset_most_special_characters\">Večina posebnih znakov</string>\n    <string name=\"enable_search_history_title\">Zgodovina iskanja</string>\n    <string name=\"enable_search_history_summary\">Iskalne poizvedbe shranjuj krajevno</string>\n    <string name=\"enable_watch_history_title\">Zgodovina ogledov</string>\n    <string name=\"enable_watch_history_summary\">Sledi zgodovini predvajanih posnetkov</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Nadaljuj predvajanje</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Nadaljuj s predvajanjem po prekinitvi (npr. po telefonskem klicu)</string>\n    <string name=\"notification_channel_name\">Obvestila NewPipe</string>\n    <string name=\"notification_channel_description\">Obvestila predvajalnika NewPipe</string>\n    <string name=\"contribution_title\">Doprinos k projektu</string>\n    <string name=\"title_activity_history\">Zgodovina</string>\n    <string name=\"action_history\">Zgodovina</string>\n    <string name=\"contribution_encouragement\">Če imate odlične zamisli, predloge za prevode in oblikovne spremembe, izboljšave kode ali obvladate programiranje in bi želeli sodelovati, vedite, da je pomoč vedno dobrodošla!</string>\n    <string name=\"settings_category_player_title\">Predvajalnik</string>\n    <string name=\"settings_category_player_behavior_title\">Obnašanje</string>\n    <string name=\"settings_category_history_title\">Zgodovina in predpomnilnik</string>\n    <string name=\"undo\">Razveljavi</string>\n    <string name=\"search_no_results\">Ni rezultatov iskanja</string>\n    <string name=\"empty_list_subtitle\">Tu ni ničesar, razen čričkov</string>\n    <string name=\"no_subscribers\">Ni naročnikov</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s naročnik</item>\n        <item quantity=\"two\">%s naročnika</item>\n        <item quantity=\"few\">%s naročniki</item>\n        <item quantity=\"other\">%s naročnikov</item>\n    </plurals>\n    <string name=\"no_views\">Ni še zabeleženih ogledov</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s ogled</item>\n        <item quantity=\"two\">%s ogleda</item>\n        <item quantity=\"few\">%s ogledi</item>\n        <item quantity=\"other\">%s ogledov</item>\n    </plurals>\n    <string name=\"no_videos\">Ni posnetkov</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video posnetek</item>\n        <item quantity=\"two\">%s video posnetka</item>\n        <item quantity=\"few\">%s video posnetkov</item>\n        <item quantity=\"other\">%s posnetkov</item>\n    </plurals>\n    <string name=\"delete_item_search_history\">Ali želite izbrisati predmet iz zgodovine iskanja?</string>\n    <string name=\"play_all\">Predvajaj vse</string>\n    <string name=\"unknown_content\">[ Neznano ]</string>\n    <string name=\"player_stream_failure\">Predvajanje pretoka je spodletelo</string>\n    <string name=\"main_page_content\">Vsebina glavne strani</string>\n    <string name=\"blank_page_summary\">Prazna stran</string>\n    <string name=\"channel_page_summary\">Stran kanalov</string>\n    <string name=\"select_a_channel\">Izbor kanala</string>\n    <string name=\"top_50\">Najboljših 50</string>\n    <string name=\"new_and_hot\">Novo in priljubljeno</string>\n    <string name=\"play_queue_remove\">Odstrani</string>\n    <string name=\"play_queue_stream_detail\">Podrobnosti</string>\n    <string name=\"play_queue_audio_settings\">Nastavitve zvoka</string>\n    <string name=\"donation_title\">Donacija</string>\n    <string name=\"website_title\">Spletišče</string>\n    <string name=\"controls_download_desc\">Prenesi pretočno datoteko</string>\n    <string name=\"show_info\">Pokaži podrobnosti</string>\n    <string name=\"tab_bookmarks\">Zaznamki</string>\n    <string name=\"controls_add_to_playlist_title\">Dodaj k</string>\n    <string name=\"settings_category_debug_title\">Razhroščevanje</string>\n    <string name=\"always\">Vedno</string>\n    <string name=\"just_once\">Le enkrat</string>\n    <string name=\"switch_to_background\">Preklopi na ozadje</string>\n    <string name=\"switch_to_popup\">Preklopi na pojavno</string>\n    <string name=\"switch_to_main\">Preklopi na osnovno okno</string>\n    <string name=\"import_data_title\">Uvozi podatkovno zbirko</string>\n    <string name=\"export_data_title\">Izvozi podatkovno zbirko</string>\n    <string name=\"video_streams_empty\">Ni najdenega video pretoka</string>\n    <string name=\"audio_streams_empty\">Ni najdenega zvočnega pretoka</string>\n    <string name=\"create\">Ustvari</string>\n    <string name=\"dismiss\">Opusti</string>\n    <string name=\"rename\">Preimenuj</string>\n    <string name=\"app_language_title\">Jezik aplikacije</string>\n    <string name=\"downloads_storage_use_saf_title\">Uporabi SAF</string>\n    <string name=\"downloads_storage_ask_title\">Vprašaj kam shraniti</string>\n    <string name=\"pause_downloads\">Začasno ustavi prenašanja</string>\n    <string name=\"start_downloads\">Začni prenose</string>\n    <string name=\"enable_queue_limit_desc\">Naenkrat bo potekal en prenos</string>\n    <string name=\"close\">Zapri</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Uporabno ko preklopite na mobilne podatke, četudi nekateri prenosi ne morejo biti začasno ustavljeni</string>\n    <string name=\"max_retry_desc\">Največje število poskusov pred preklicom prenosa</string>\n    <string name=\"delete_downloaded_files\">Izbriši prenesene datoteke</string>\n    <string name=\"confirm_prompt\">Želite počistiti zgodovino prenosov ali izbrisati vse prenose\\?</string>\n    <string name=\"clear_download_history\">Počisti zgodovino prenosa</string>\n    <string name=\"error_download_resource_gone\">Ni mogoče povrniti prenos</string>\n    <string name=\"error_progress_lost\">Napredek je izgubljen, ker je bila datoteka izbrisana</string>\n    <string name=\"error_insufficient_storage_left\">Ni več prostora v vaši napravi</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe se je zaprl medtem ko je delal z datoteko</string>\n    <string name=\"error_http_not_found\">Ni najden</string>\n    <string name=\"error_http_no_content\">Strežnik ne pošilja informacij</string>\n    <string name=\"error_connect_host\">Ni mogoče vspostaviti povezavo s strežnikom</string>\n    <string name=\"error_unknown_host\">Strežnika ni mogoče najti</string>\n    <string name=\"error_ssl_exception\">Ni mogoče vspostaviti varne povezave</string>\n    <string name=\"error_file_creation\">Ni mogoče ustvariti datoteke</string>\n    <string name=\"overwrite_finished_warning\">Prenesena datoteka s tem imenom že obstaja</string>\n    <string name=\"overwrite_unrelated_warning\">Datoteka s tem imenom že obstaja</string>\n    <string name=\"generate_unique_name\">Ustvari edinstveno ime</string>\n    <string name=\"download_failed\">Prenos spodletel</string>\n    <string name=\"paused\">Pavza</string>\n    <string name=\"missions_header_finished\">Končano</string>\n    <string name=\"list\">Seznam</string>\n    <string name=\"updates_setting_title\">Posodobitve</string>\n    <string name=\"accept\">Sprejmi</string>\n    <string name=\"playback_reset\">Resetiraj</string>\n    <string name=\"subscriptions_export_unsuccessful\">Ni mogoče izvoziti naročnine</string>\n    <string name=\"subscriptions_import_unsuccessful\">Ni mogoče uvoziti naročnine</string>\n    <string name=\"previous_export\">Prejšnji izvoz</string>\n    <string name=\"import_file_title\">Uvozi datoteko</string>\n    <string name=\"export_ongoing\">Izvažanje…</string>\n    <string name=\"import_ongoing\">Uvažanje…</string>\n    <string name=\"export_to\">Izvozi k</string>\n    <string name=\"import_from\">Uvozi iz</string>\n    <string name=\"import_title\">Uvozi</string>\n    <string name=\"resize_zoom\">Povečaj</string>\n    <string name=\"resize_fill\">Napolni</string>\n    <string name=\"playlist_creation_success\">Seznam predvajanja je bil ustvarjen</string>\n    <string name=\"delete_playlist_prompt\">Izbrišem seznam predvajanja\\?</string>\n    <string name=\"add_to_playlist\">Dodaj v seznam predvajanja</string>\n    <string name=\"rename_playlist\">Preimenuj</string>\n    <string name=\"create_playlist\">Nov seznam predvajanja</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Nalaganje zahtevano vsebino</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Pridobivanje podatkov…</string>\n    <string name=\"always_ask_open_action\">Vedno vprašaj</string>\n    <string name=\"video_player\">Predvajalnik videa</string>\n    <string name=\"start_here_on_background\">Začni igrati v ozadju</string>\n    <string name=\"most_liked\">Najbolj všečkan</string>\n    <string name=\"recently_added\">Dodano nedolgo nazaj</string>\n    <string name=\"local\">Lokalno</string>\n    <string name=\"error_unable_to_load_comments\">Ni mogoče naložiti komentarjev</string>\n    <string name=\"no_valid_zip_file\">Ni veljavne ZIP datoteke</string>\n    <string name=\"import_complete_toast\">Uvoženo</string>\n    <string name=\"export_complete_toast\">Izvoženo</string>\n    <string name=\"no_channel_subscribed_yet\">Ni še nobene naročnine</string>\n    <string name=\"title_most_played\">Najbolj igrano</string>\n    <string name=\"title_last_played\">Nazadnje igrano</string>\n    <string name=\"read_privacy_policy\">Preberi pravilnik zasebnosti</string>\n    <string name=\"privacy_policy_title\">NewPipe-ovi pravilnik zasebnosti</string>\n    <string name=\"website_encouragement\">Obiščite spletno mesto od NewPipe za več informacij in novic.</string>\n    <string name=\"done\">Končano</string>\n    <string name=\"no_comments\">Ni komentarjev</string>\n    <string name=\"no_one_listening\">Nobeden ne posluša</string>\n    <string name=\"no_one_watching\">Nobeden ne gleda</string>\n    <string name=\"error_occurred_detail\">Zgodila se je napaka: %1$s</string>\n    <string name=\"invalid_directory\">Ni take mape</string>\n    <string name=\"missing_file\">Datoteka premaknjena ali izbrisana</string>\n    <string name=\"download_to_sdcard_error_message\">Prenašanje na zunanjo SD kartico ni mogoče. Resetiram lokacijo mape z prenosi\\?</string>\n    <string name=\"watch_history_deleted\">Zgodovina gledanja izbrisana</string>\n    <string name=\"delete_view_history_alert\">Izbrišem vso zgodovino gledanja\\?</string>\n    <string name=\"clear_views_history_title\">Izbriši zgodovino gledanja</string>\n    <string name=\"export_data_summary\">Izvozi zgodovino, naročnine, sezname predvajanj in nastavitve</string>\n    <string name=\"app_update_notification_channel_name\">Obvestila posodobitve aplikacije</string>\n    <string name=\"file\">Datoteka</string>\n    <string name=\"file_deleted\">Datoteka izbrisana</string>\n    <string name=\"users\">Uporabniki</string>\n    <string name=\"playlists\">Seznami predvajanja</string>\n    <string name=\"channels\">Kanali</string>\n    <string name=\"settings_category_updates_title\">Posodobitve</string>\n    <string name=\"peertube_instance_add_https_only\">Samo HTTPS URL-ji so podprti</string>\n    <string name=\"show_hold_to_append_title\">Prikaži namig \\\"drži za dodajanje\\\"</string>\n    <string name=\"settings_category_clear_data_title\">Počisti podatke</string>\n    <string name=\"enable_playback_state_lists_title\">Pozicija v seznamih</string>\n    <string name=\"auto_queue_title\">Samodejno predvajaj naslednji video</string>\n    <string name=\"metadata_cache_wipe_title\">Izbriši shranjene metapodatke</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Predshramba za slike je bila izbrisana</string>\n    <string name=\"show_comments_title\">Prikaži komentarje</string>\n    <string name=\"tab_choose\">Izberi zavihek</string>\n    <string name=\"unsubscribe\">Odjava</string>\n    <string name=\"no_player_found_toast\">Predvajalnika pretoka ni mogoče najti (namestite lahko VLC program za predvajanje).</string>\n    <string name=\"background_player\">Predvajalnik v ozadju</string>\n    <string name=\"import_settings\">Želite uvoziti tudi nastavite\\?</string>\n    <string name=\"search_history_deleted\">Zgodovina iskanja izbrisana</string>\n    <string name=\"delete_search_history_alert\">Izbrišem vso zgodovino brskanja\\?</string>\n    <string name=\"clear_search_history_title\">Izbriši zgodovino brskanja</string>\n    <string name=\"clear_cookie_summary\">Izbriši piškotke, ki jih NewPipe shrani, ko rešite reCAPTCHA</string>\n    <string name=\"clear_cookie_title\">Izbrišite piškodke reCAPTCHA</string>\n    <string name=\"enable_playback_resume_title\">Nadaljuj s predvajanjem</string>\n    <string name=\"enable_playback_resume_summary\">Povrni zadnji položaj predvajanja</string>\n    <string name=\"auto_queue_toggle\">Samodejno uvrščanje</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Predpomnjeni metapodatki so bili odstranjeni</string>\n    <string name=\"show_meta_info_title\">Prikaži meta informacije</string>\n    <string name=\"show_comments_summary\">Onemogoči da se ustavi prikazovanje komentarjev</string>\n    <string name=\"clear_queue_confirmation_description\">Dejavna vrsta bo zamenjana</string>\n    <string name=\"clear_queue_confirmation_summary\">Preklop na drugi predvajanik lahko zamenja vašo čakalno vrsto</string>\n    <string name=\"clear_queue_confirmation_title\">Vprašaj za potrditev pred čiščenjem vrste</string>\n    <string name=\"notification_colorize_summary\">Prepustite, da Android izbere barvo obvestila na podlagi glavne barve v sličici (upoštevajte, da to ni na voljo v vseh napravah)</string>\n    <string name=\"notification_colorize_title\">Obarvajte obvestilo</string>\n    <string name=\"notification_action_nothing\">Nič</string>\n    <string name=\"notification_action_buffering\">Nalaganje</string>\n    <string name=\"notification_action_shuffle\">Naključno</string>\n    <string name=\"notification_action_repeat\">Ponovi</string>\n    <string name=\"notification_actions_at_most_three\">Izberete lahko največ 3 dejanja, ki se bodo prikazala v kompaktnem obvestilu!</string>\n    <string name=\"notification_actions_summary\">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</string>\n    <string name=\"notification_action_4_title\">Gumb za peto dejanje</string>\n    <string name=\"notification_action_3_title\">Gumb za četrto dejanje</string>\n    <string name=\"notification_action_2_title\">Gumb za tretje dejanje</string>\n    <string name=\"notification_action_1_title\">Gumb za drugo dejanje</string>\n    <string name=\"notification_action_0_title\">Gumb za prvo dejanje</string>\n    <string name=\"notification_scale_to_square_image_summary\">Povečaj sličico videa, ki je prikazana v obvestilu iz razmerja 16:9 v razmerje 1:1</string>\n    <string name=\"crash_the_app\">Zruši aplikacijo</string>\n    <string name=\"caption_setting_description\">Spremeni velikost besedila podnapisov in slog ozadja v predvajalniku. Zahteva ponovni zagon aplikacije, da učinkuje</string>\n    <string name=\"caption_setting_title\">Podnapisi</string>\n    <string name=\"caption_auto_generated\">Samodejno ustvarjeno</string>\n    <string name=\"resize_fit\">Prilagodi zaslonu</string>\n    <string name=\"caption_none\">Ni podnapisov</string>\n    <string name=\"playlist_no_uploader\">Samodejno ustvarjenjo (nalagalca ni bilo mogoče najti)</string>\n    <string name=\"playlist_thumbnail_change_success\">Sličica seznama predvajanja je bila spremenjena.</string>\n    <string name=\"playlist_add_stream_success\">Na seznamu predvajanja</string>\n    <string name=\"unbookmark_playlist\">Odstrani zaznamek</string>\n    <string name=\"bookmark_playlist\">Shrani seznam predvajanja med zaznamke</string>\n    <string name=\"set_as_playlist_thumbnail\">Nastavi kot sličico seznama predvajanja</string>\n    <string name=\"unmute\">Vklopi zvok</string>\n    <string name=\"mute\">Utišaj</string>\n    <string name=\"name\">Ime</string>\n    <string name=\"popup_player\">Predvajalnik v pojavnem oknu</string>\n    <string name=\"preferred_open_action_settings_summary\">Privzeto dejanje ob odprtju vsebine — %s</string>\n    <string name=\"preferred_open_action_settings_title\">Prednostno dejanje \\'odpri\\'</string>\n    <string name=\"drawer_close\">Zapri omaro</string>\n    <string name=\"drawer_open\">Odpri omaro</string>\n    <string name=\"start_here_on_popup\">Začni predvajati v pojavnem oknu</string>\n    <string name=\"enqueued\">Uvrščeno</string>\n    <string name=\"enqueue_stream\">Uvrsti</string>\n    <string name=\"hold_to_append\">Pridržite za uvrstitev</string>\n    <string name=\"title_activity_play_queue\">Predvajaj seznam</string>\n    <string name=\"conferences\">Konference</string>\n    <string name=\"trending\">Priljubljeno</string>\n    <string name=\"override_current_data\">To bo nadomestilo vaše trenutne nastavitve.</string>\n    <string name=\"could_not_import_all_files\">Opozorilo: ni mogoče uvoziti vseh datotek.</string>\n    <string name=\"select_a_playlist\">Izberi seznam predvajanja</string>\n    <string name=\"app_license\">NewPipe je prosta in odprta programska oprema: lahko jo uporabljaš, preučuješ in izboljšaš po želji. Lahko jo distributiraš in/ali spremeniš pod pogoji GNU General Public Licence, kot jo je izdala Free Software Foundation v različici 3 ali po izbiri v katerikoli novejši različici.</string>\n    <string name=\"privacy_policy_encouragement\">Projekt NewPipe jemlje vašo zasebnost zelo resno. Aplikacija zato ne zbira kakršnih koli podatkov brez vašega dovoljenja.\n\\nPolitika zasebnosti NewPipe-a podrobno pojasnjuje, kateri podatki so poslani in shranjeni, ko pošljete poročilo o zrušitvi.</string>\n    <string name=\"give_back\">Pomagaj</string>\n    <string name=\"donation_encouragement\">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.</string>\n    <string name=\"subtitle_activity_recaptcha\">Pritisni \\\"končano\\\" ko je rešena</string>\n    <string name=\"one_item_deleted\">Odstranjen 1 element.</string>\n    <string name=\"msg_calculating_hash\">Izračun zgoščevalne funkcije je v teku</string>\n    <string name=\"infinite_videos\">∞ videoposnetkov</string>\n    <string name=\"more_than_100_videos\">100+ videov</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s poslušalec</item>\n        <item quantity=\"two\">%s poslušalca</item>\n        <item quantity=\"few\">%s poslušalcev</item>\n        <item quantity=\"other\">%s poslušalcev</item>\n    </plurals>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s gledalec</item>\n        <item quantity=\"two\">%s gledalca</item>\n        <item quantity=\"few\">%s gledalcev</item>\n        <item quantity=\"other\">%s gledalcev</item>\n    </plurals>\n    <string name=\"subscribers_count_not_available\">Število naročnikov ni na voljo</string>\n    <string name=\"drawer_header_description\">Vklop/izklop storitve, trenutno izbrana:</string>\n    <string name=\"detail_drag_description\">Povlecite za preureditev</string>\n    <string name=\"description_tab_description\">Opis</string>\n    <string name=\"related_items_tab_description\">Podobni pretoki</string>\n    <string name=\"comments_tab_description\">Komentarji</string>\n    <string name=\"error_report_open_github_notice\">Prosimo preverite, če težava, ki opisuje vašo zrušitev aplikacije že obstaja. Ko ustvarite dvojne pripombe, vzamete naš čas, ki bi ga lahko porabili z odpravljanjem dejanske napake.</string>\n    <string name=\"error_report_open_issue_button_text\">Prijavite na GitHub-u</string>\n    <string name=\"copy_for_github\">Kopiraj oblikovano poročilo</string>\n    <string name=\"permission_display_over_apps\">Odobrite dovoljenje, da se ta aplikacija prikaže pred drugimi aplikacijami</string>\n    <string name=\"restore_defaults_confirmation\">Ali želite obnoviti privzete vrednosti\\?</string>\n    <string name=\"restore_defaults\">Povrni privzeto</string>\n    <string name=\"no_streams_available_download\">Nobeden pretok ni na voljo za prenos</string>\n    <string name=\"file_name_empty_error\">Ime datoteke ne sme biti prazno</string>\n    <string name=\"invalid_file\">Datoteka ne obstaja ali ji manjka dovoljenje za branje ali pisanje</string>\n    <string name=\"invalid_source\">Ni takšne datoteke/vira vsebine</string>\n    <string name=\"external_player_unsupported_link_type\">Zunanji predvajalniki ne podpirajo teh vrst povezav</string>\n    <string name=\"player_recoverable_failure\">Obnavljanje od napake predvajanika</string>\n    <string name=\"player_unrecoverable_failure\">Prišlo je do neobnovljive napake v predvajalniku</string>\n    <string name=\"download_to_sdcard_error_title\">Zunanja shramba ni na voljo</string>\n    <string name=\"clear_search_history_summary\">Izbriše zgodovino ključnih besed za iskanje</string>\n    <string name=\"watch_history_states_deleted\">Položaji predvajalnika so bili izbrisani</string>\n    <string name=\"delete_playback_states_alert\">Ali želite izbrisati vse položaje predvajalnika\\?</string>\n    <string name=\"clear_playback_states_summary\">Izbriše vse položaje predvajalnika</string>\n    <string name=\"clear_playback_states_title\">Izbriši položaje predvajalnika</string>\n    <string name=\"clear_views_history_summary\">Izbriše zgodovino predvajanih videoposnetkov in položajev predvajalnika</string>\n    <string name=\"import_data_summary\">Prepiše vašo trenutno zgodovino in naročnine</string>\n    <string name=\"recaptcha_cookies_cleared\">Piškotki reCAPTCHA so bili izbrisani</string>\n    <string name=\"hash_channel_description\">Obvestila za zgoščevanje videa v teku</string>\n    <string name=\"hash_channel_name\">Obvestilo hash-a videa</string>\n    <string name=\"app_update_notification_channel_description\">Obvestila za nove verzije NewPipe</string>\n    <string name=\"artists\">Izvajalci</string>\n    <string name=\"albums\">Albumi</string>\n    <string name=\"songs\">Pesmi</string>\n    <string name=\"events\">Dogodki</string>\n    <string name=\"tracks\">Posnetki</string>\n    <string name=\"videos_string\">Videoposnetki</string>\n    <string name=\"restricted_video\">Ta video ima omejitev starosti.\n\\n\n\\nVklopite \\\"%1$s\\\" v nastavitvah, če ga želite predvajati.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">Youtube ponuja \\\"omejeni način\\\", ki skrije potencialno vsebino za odrasle</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Vklop YouTubovega \\\"omejenega načina\\\"</string>\n    <string name=\"show_age_restricted_content_summary\">Prikaz vsebin, ki so morda neprimerne za otroke zaradi omejitve starosti (kot na primer 18+)</string>\n    <string name=\"peertube_instance_add_exists\">Instanca že obstaja</string>\n    <string name=\"peertube_instance_add_fail\">Validacija instance ni bila mogoča</string>\n    <string name=\"peertube_instance_add_help\">Vnesite URL instance</string>\n    <string name=\"peertube_instance_add_title\">Dodaj instanco</string>\n    <string name=\"peertube_instance_url_help\">Najdite instance, ki so vam všeč na %s</string>\n    <string name=\"peertube_instance_url_summary\">Izberite vaše najljubše instance PeerTuba</string>\n    <string name=\"peertube_instance_url_title\">Instance PeerTube</string>\n    <string name=\"default_content_country_title\">Privzeta država vsebine</string>\n    <string name=\"unsupported_url_dialog_message\">URL-ja ni bilo mogoče prepoznati. Želite odpreti z drugo aplikacijo\\?</string>\n    <string name=\"show_hold_to_append_summary\">Pokaži nasvet, ko boste pritisnili na ozadje ali pojavno okno v \\\"Podrobnosti:\\\"</string>\n    <string name=\"autoplay_title\">Samodejno predvajanje</string>\n    <string name=\"enable_playback_state_lists_summary\">Pokaži indikator položaja predvajalnika na seznamih</string>\n    <string name=\"show_description_summary\">Izklopite, če želite skriti opis videa in dodatnih informacij</string>\n    <string name=\"show_description_title\">Prikaži opis</string>\n    <string name=\"search_showing_result_for\">Prikazujem rezultate za %s</string>\n    <string name=\"enqueue\">Vrsta</string>\n    <string name=\"queued\">V vrsti</string>\n    <string name=\"app_update_available_notification_title\">NewPipe posodobitve so na voljo!</string>\n    <string name=\"auto\">Avtomatsko</string>\n    <string name=\"grid\">Mreža</string>\n    <string name=\"never\">Nikoli</string>\n    <string name=\"wifi_only\">Samo na Wi-Fi</string>\n    <string name=\"minimize_on_exit_background_description\">Minimiziraj na predvajalnik v ozadju</string>\n    <string name=\"minimize_on_exit_none_description\">Nič</string>\n    <string name=\"limit_mobile_data_usage_title\">Omeji ločjlivost pri uporabi mobilnih podatkov</string>\n    <string name=\"limit_data_usage_none_description\">Brez omejitev</string>\n    <string name=\"decline\">Zavrni</string>\n    <string name=\"playback_step\">Korak</string>\n    <string name=\"import_soundcloud_instructions_hint\">tvojID, soundcloud.com/tvojid</string>\n    <string name=\"kiosk_page_summary\">Stran kiosk</string>\n    <string name=\"main_page_content_summary\">Kateri zavihki so prikazani na domači strani</string>\n    <string name=\"recaptcha_solve\">Rešiti</string>\n    <string name=\"metadata_cache_wipe_summary\">Izbrišite vse predpomnjene podatke spletnih strani</string>\n    <string name=\"open_with\">Odpiranje z</string>\n    <string name=\"show_memory_leaks\">Prikaži puščanje pomnilnika</string>\n    <string name=\"show_channel_details\">Prikaži detajle kanala</string>\n    <string name=\"night_theme_title\">Nočna tema</string>\n    <string name=\"notification_scale_to_square_image_title\">Povečaj sličico na razmerje 1:1</string>\n    <string name=\"mark_as_watched\">Označi kot že ogledano</string>\n    <string name=\"use_inexact_seek_title\">Uporabite hitro nenatančno iskanje</string>\n    <string name=\"crash_the_player\">Sesuj predvajalnik</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-so/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"use_inexact_seek_title\">Dhaafinta dagdaga ah</string>\n    <string name=\"popup_remember_size_pos_summary\">Xusuusnow meeshii iyo cabirkii udambeeyay ee daaqada</string>\n    <string name=\"popup_remember_size_pos_title\">Xusuusnow fadhiga daaqada</string>\n    <string name=\"dark_theme_title\">Madow</string>\n    <string name=\"theme_title\">Nashqada</string>\n    <string name=\"default_video_format_title\">Nooca muuqaalka</string>\n    <string name=\"default_audio_format_title\">Nooca dhagaysiga</string>\n    <string name=\"notification_colorize_summary\">Androidka hakuu baddalo midabka ogaysiiska galka waxa daaran asagoo kusalaynaya midabka galka shayga daaran (aalladahoo dhan looma wada heli karo nidaamkan)</string>\n    <string name=\"notification_colorize_title\">Midabbee ogaysiiska</string>\n    <string name=\"notification_action_buffering\">Soo Kicinaya</string>\n    <string name=\"notification_action_shuffle\">isku qas</string>\n    <string name=\"notification_action_repeat\">Ku celi</string>\n    <string name=\"notification_actions_at_most_three\">Ugu badnaan waxad dooran kartaa sadex shay iney ka muuqdaan ogaysiiska yar!</string>\n    <string name=\"notification_actions_summary\">Wax ka baddal hawsha ogaysiiska adigoo dushooda ku dhufanaya. Dooro ilaa sadex kamida si ay uga muuqdaan ogaysiiska yar adigoo saxaya santuuqa dhanka midig kaga yaala</string>\n    <string name=\"notification_action_4_title\">Batoonka hawsha shanaad</string>\n    <string name=\"notification_action_3_title\">Batoonka hawsha afraad</string>\n    <string name=\"notification_action_2_title\">Batoonka hawsha sadexaad</string>\n    <string name=\"notification_action_1_title\">Batoonka hawsha labaad</string>\n    <string name=\"notification_action_0_title\">Batoonka hawsha koowaad</string>\n    <string name=\"notification_scale_to_square_image_summary\">La ekaysii galka muuqaalka xaga ogaysiisyada ka muuqda cabirka 1:1 ayadoo laga soo baddalayo 16:9</string>\n    <string name=\"notification_scale_to_square_image_title\">Galka la ekaysii cabirka 1:1</string>\n    <string name=\"show_play_with_kodi_summary\">Soo bandhig istikhyaar ah in muuqaalka lagu furo xarunta madadaalada Kodi</string>\n    <string name=\"show_play_with_kodi_title\">Soodhig istikhyaarka \\\"Ku fur Kodi\\\"</string>\n    <string name=\"kore_not_found\">Kushub appka maqan ee Kore\\?</string>\n    <string name=\"play_with_kodi_title\">Ku fur Kodi</string>\n    <string name=\"show_higher_resolutions_summary\">Aalladaha qaar kaliya ayaa furi kara muuqaalada 2K/4K ga ah</string>\n    <string name=\"show_higher_resolutions_title\">Tus tayooyinka kasii sareeeya</string>\n    <string name=\"default_popup_resolution_title\">Tayada muuqaalka daaqada</string>\n    <string name=\"default_resolution_title\">Tayada muuqaalka</string>\n    <string name=\"download_path_audio_dialog_title\">Dooro khaanada dhagaysiga lasoo dajiyo</string>\n    <string name=\"download_path_dialog_title\">Dooro khaanada muuqaalada lasoo dajiyo</string>\n    <string name=\"download_path_audio_summary\">Dhagaysiyada lasoo dajiyay halkan ayaa lagu kaydiyaa</string>\n    <string name=\"download_path_summary\">Muuqaalada lasoo dajiyo halkan ayaa lagu kaydiyaa</string>\n    <string name=\"download_path_audio_title\">Khaanada dajinta dhagaysiga</string>\n    <string name=\"download_path_title\">Khaanada dajinta muuqaalada</string>\n    <string name=\"controls_add_to_playlist_title\">Ku Dar</string>\n    <string name=\"controls_popup_title\">Daaqad</string>\n    <string name=\"controls_background_title\">Xaga Dambe</string>\n    <string name=\"tab_choose\">Dooro Daaqada</string>\n    <string name=\"tab_bookmarks\">La calaamadsaday</string>\n    <string name=\"tab_subscriptions\">Rukunka</string>\n    <string name=\"show_info\">Faahfaahinta</string>\n    <string name=\"subscription_update_failed\">Lama cusbooneysiin karo rukunka</string>\n    <string name=\"subscription_change_failed\">Lama baddali karo rukunka</string>\n    <string name=\"channel_unsubscribed\">Kanaalka waad iskajoojisay</string>\n    <string name=\"unsubscribe\">Iskajooji Rukunka</string>\n    <string name=\"subscribed_button_title\">Rukuntay</string>\n    <string name=\"subscribe_button_title\">Rukumo</string>\n    <string name=\"use_external_audio_player_title\">Isticmaal dhagaysi daare dibada ah</string>\n    <string name=\"use_external_video_player_summary\">Codka ayuu ka saaraa tayada muuqaalada qaar</string>\n    <string name=\"use_external_video_player_title\">Isticmaal muuqaal daare dibada ah</string>\n    <string name=\"share_dialog_title\">La wadaag</string>\n    <string name=\"search_showing_result_for\">Kutusaya natiijooyinka: %s</string>\n    <string name=\"did_you_mean\">Ma waxaad ka waday \\\"%1$s\\\"\\?</string>\n    <string name=\"settings\">Fadhiga</string>\n    <string name=\"controls_download_desc\">Daji midka socda</string>\n    <string name=\"share\">La wadaag</string>\n    <string name=\"open_in_popup_mode\">Ku fur qaabka daaqada</string>\n    <string name=\"open_in_browser\">Ku fur browserka</string>\n    <string name=\"cancel\">Ka noqo</string>\n    <string name=\"install\">Ku shub</string>\n    <string name=\"no_player_found_toast\">Wax fura lama helin shaygan. (waxaad Ku shuban kartaa VLC si aad u furto).</string>\n    <string name=\"no_player_found\">Wax fura lama helin shaygan. Ku shubo VLC\\?</string>\n    <string name=\"upload_date_text\">Lasoo galiyay: %1$s</string>\n    <string name=\"main_bg_subtitle\">Ku dhufo waynaysada 🔍 si aad wax uraadiso.</string>\n    <string name=\"overwrite_unrelated_warning\">Shay magacan leh ayaa horay ujiray</string>\n    <string name=\"overwrite\">Ku badal</string>\n    <string name=\"generate_unique_name\">Usamee magac gaar ah</string>\n    <string name=\"download_failed\">Dajintii ma guulaysan</string>\n    <string name=\"permission_denied\">Hawshan waxaa diiday aalada</string>\n    <string name=\"recovering\">kasoo kabanaya</string>\n    <string name=\"queued\">la horay</string>\n    <string name=\"paused\">la qabtay</string>\n    <string name=\"missions_header_pending\">Socda</string>\n    <string name=\"missions_header_finished\">Dhamaystirmay</string>\n    <string name=\"app_update_available_notification_title\">Nooc cusub oo NewPipe ah ayaa diyaar ah!</string>\n    <string name=\"list_view_mode\">Qaabka soobandhigga</string>\n    <string name=\"never\">Marna</string>\n    <string name=\"wifi_only\">WiFi-ga kaliya</string>\n    <string name=\"minimize_on_exit_title\">Yaree marka app kale loo gudbo</string>\n    <string name=\"updates_setting_title\">Cusboonaysiinta</string>\n    <string name=\"limit_data_usage_none_description\">Ha xadidin</string>\n    <string name=\"playback_reset\">Sidii hore kuceli</string>\n    <string name=\"skip_silence_checkbox\">Horay u dhaafi meelaha aamusan</string>\n    <string name=\"playback_speed_control\">Maamulista Xawaaraha</string>\n    <string name=\"import_soundcloud_instructions_hint\">ID-gaaga, soundcloud.com/yourid</string>\n    <string name=\"subscriptions_export_unsuccessful\">Rukunka lama gudbin karo</string>\n    <string name=\"subscriptions_import_unsuccessful\">Lama soo galin karo rukunka</string>\n    <string name=\"previous_export\">Gudbin hore</string>\n    <string name=\"import_file_title\">Soo gali fayl</string>\n    <string name=\"export_ongoing\">Gudbinaya…</string>\n    <string name=\"import_ongoing\">Soo galinaya…</string>\n    <string name=\"export_to\">U gudbi</string>\n    <string name=\"import_from\">Kasoo gali</string>\n    <string name=\"import_title\">Soo gali</string>\n    <string name=\"show_original_time_ago_summary\">Qoraaladii asal ahaan adeegyada la socday (wakhtigii kasoo wareegay) way ka muuqan doonaan waxyaabaha aad furanayso</string>\n    <string name=\"show_original_time_ago_title\">Tus wakhtigii asalka ahaa</string>\n    <string name=\"enable_disposed_exceptions_summary\">Ku khasab warinta ka reebitaanada aan la fulin karin ee \\'Rx\\' ka ee dibada qayb ama wakhtiga hawsha kadib marka la iska dhaafo</string>\n    <string name=\"enable_disposed_exceptions_title\">Warinta khaladyada hore</string>\n    <string name=\"show_memory_leaks\">Tus ciladaha kaydka</string>\n    <string name=\"enable_leak_canary_summary\">Dabagalka cillada kaydka waxay sababi kartaa inuu app-ku istaago marka \\'heap dump\\' la samaynayo</string>\n    <string name=\"caption_setting_description\">Wax ka baddal cabirka xarfaha qoraal-hooseedka iyo midabkooda xaga dambe. Appka waa in dib loo soo bilaabaa si ay u hirgasho</string>\n    <string name=\"resize_zoom\">Soo dhawee</string>\n    <string name=\"resize_fill\">Ku buuxi</string>\n    <string name=\"caption_none\">Qoraal-hooseed la\\'aan</string>\n    <string name=\"playlist_no_uploader\">isa-sameeyay (soosaare lama helin)</string>\n    <string name=\"playlist_thumbnail_change_success\">Galkii xulka waa la baddalay.</string>\n    <string name=\"playlist_add_stream_success\">La xulay</string>\n    <string name=\"playlist_creation_success\">Xulka waa la sameeyay</string>\n    <string name=\"delete_playlist_prompt\">Saar xulkan\\?</string>\n    <string name=\"unbookmark_playlist\">Ka saar calaamadsashada</string>\n    <string name=\"bookmark_playlist\">Calaamadso Xulka</string>\n    <string name=\"set_as_playlist_thumbnail\">Ku fadhiisi galka xulka</string>\n    <string name=\"unmute\">Ka hadalsii</string>\n    <string name=\"add_to_playlist\">Ku dar xul</string>\n    <string name=\"rename_playlist\">Magaca ka baddal</string>\n    <string name=\"create_playlist\">Xul Cusub</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Soo kicinaya shayga la codsaday</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Helaya xogta…</string>\n    <string name=\"always_ask_open_action\">Waydii marwalba</string>\n    <string name=\"background_player\">Gadaal ku daare</string>\n    <string name=\"video_player\">Muuqaal daareha</string>\n    <string name=\"preferred_open_action_settings_summary\">Hawsha la doorbiday marka shay la furayo — %s</string>\n    <string name=\"preferred_open_action_settings_title\">Hawsha \\'fur\\' loo doorbiday</string>\n    <string name=\"drawer_close\">Xidh Khaanada</string>\n    <string name=\"drawer_open\">Fur Khaanada</string>\n    <string name=\"start_here_on_popup\">Xaga daaqada ku daar</string>\n    <string name=\"start_here_on_background\">Xaga dambe ku daar</string>\n    <string name=\"enqueued\">La horay</string>\n    <string name=\"hold_to_append\">Xaji si loo horo</string>\n    <string name=\"play_queue_audio_settings\">Fadhiga Dhagaysiga</string>\n    <string name=\"play_queue_stream_detail\">Faahfaahin</string>\n    <string name=\"play_queue_remove\">Ka saar</string>\n    <string name=\"title_activity_play_queue\">Daar hormada</string>\n    <string name=\"most_liked\">inta loogu jecelyahay</string>\n    <string name=\"recently_added\">Dhawaan Lasoo Galiyay</string>\n    <string name=\"trending\">Shiddan</string>\n    <string name=\"new_and_hot\">Cusub oo Shiddan</string>\n    <string name=\"top_50\">50ka Sare</string>\n    <string name=\"error_unable_to_load_comments\">Faallooyinka lama soo kicin karo</string>\n    <string name=\"import_settings\">Inaad sidoo kale fadhiga soo galiso ma rabtaa\\?</string>\n    <string name=\"override_current_data\">Tani waxay baddali fadhiga siduu kuu yahay hadda.</string>\n    <string name=\"could_not_import_all_files\">Digniin: Lama soowada galin karo faylashoo dhan.</string>\n    <string name=\"no_valid_zip_file\">Shay ZIP ah oo sax ah majiro</string>\n    <string name=\"import_complete_toast\">Lasoogaliyay</string>\n    <string name=\"export_complete_toast\">La Gudbiyay</string>\n    <string name=\"select_a_kiosk\">Dooro Bandhig</string>\n    <string name=\"no_playlist_bookmarked_yet\">Wax xul ah wali lama calaamadsanin</string>\n    <string name=\"select_a_playlist\">Dooro xul</string>\n    <string name=\"no_channel_subscribed_yet\">Wax kanaal ah wali lama rukuman</string>\n    <string name=\"select_a_channel\">Dooro kanaal</string>\n    <string name=\"channel_page_summary\">Boga Kanaalka</string>\n    <string name=\"default_kiosk_page_summary\">Bandhigga siduu ahaa</string>\n    <string name=\"kiosk_page_summary\">Bogga Bandhigga</string>\n    <string name=\"blank_page_summary\">Bog Madhan</string>\n    <string name=\"main_page_content_summary\">Daaqadaha lasoobandhigo bogga guud</string>\n    <string name=\"main_page_content\">Bogga guud</string>\n    <string name=\"title_most_played\">Badanaa La Daawado</string>\n    <string name=\"title_last_played\">U Dambeeyay ee La Daawaday</string>\n    <string name=\"delete_item_search_history\">Ma rabtaa inaad ka saarto shaygan kaydka wixii la raadiyay\\?</string>\n    <string name=\"action_history\">Wixii Hore</string>\n    <string name=\"read_full_license\">Akhri laysinka</string>\n    <string name=\"app_license\">NewPipe waa barnaamij bilaash ah oo aan lahayn xuquuqda daabacaada: Waad isticmaali kartaa, waad wadaagi kartaa waadna hormarin kartaa hadaad rabto. Gaar ahaan waad sii daabici kartaa ama wax baad ka baddali kartaa ayadoo la raacayo shuruudaha sharciga guud ee GNU sida ay soosaareen Ururka Barnaamijyada Bilaashka ah, soosaarista 3aad ee laysinka, ama (hadaad doonto) nooc walba oo kasii dambeeyay laysinkii 3aad.</string>\n    <string name=\"privacy_policy_title\">Siyaasada Sirdhawrka NewPipe</string>\n    <string name=\"app_license_title\">Laysanka NewPipe</string>\n    <string name=\"read_privacy_policy\">Akhri siyaasada sirdhawrka</string>\n    <string name=\"privacy_policy_encouragement\">Mashruuca NewPipe sir dhawrkaaga aad ayuu u qiimeeyaa. Sidaas darteed, App-ku wax xogtaada ah ma uruuriyo fasax la\\'aan.\n\\nSiyaasada sir-dhawrka NewPipe ayaa si faahfaahsan u sharaxda wixii xog ah ee la diro lana kaydiyo markaad cilad farsamo wariso.</string>\n    <string name=\"website_encouragement\">Booqo website-ka NewPipe si aad xog intaas dheer iyo warar uhesho.</string>\n    <string name=\"website_title\">Website-ka</string>\n    <string name=\"give_back\">U fidi caawin</string>\n    <string name=\"donation_encouragement\">NewPipe waxaa sameeyay dad iskood isku xilqaamay oo wakhtiga ay xorta yihiin qayb kamid ah ku kharash gareeya inay kuu keenaan wax markaad isticmaalayso aad ku qanacdo. U fidi taageero sameeyaasha appka si ay NewPipe xataa sidan oga sii fiicneeyaan.</string>\n    <string name=\"donation_title\">Ugu Deeq</string>\n    <string name=\"view_on_github\">Xaga GitHub fur</string>\n    <string name=\"contribution_encouragement\">Hadaad hayso fikrado; rogid, qaab baddal, nadiifin koodh, ama koodhka ood si wayn wax oga badashaa—caawinta marwalba waa lasoo dhawaynayaa. Waxbadan hadii la qabto waxbadan ayaa fiicnaan!</string>\n    <string name=\"contribution_title\">Kusoo Kordhin</string>\n    <string name=\"app_description\">App bilaash ah oo fudud looguna talagalay in Androidka wax loogu daawado.</string>\n    <string name=\"tab_licenses\">Laysimada</string>\n    <string name=\"tab_about\">Kusaabsan NewPipe</string>\n    <string name=\"copyright\">© %1$s sameeyay %2$s ayagoo raacaya %3$s</string>\n    <string name=\"title_licenses\">Laysimada gacanta sadexaad</string>\n    <string name=\"title_activity_about\">Kusaabsan NewPipe</string>\n    <string name=\"charset_most_special_characters\">Xarfaha gaarka ah kuwa ugu badan</string>\n    <string name=\"charset_letters_and_digits\">Xarfaha iyo godadka</string>\n    <string name=\"settings_file_replacement_character_title\">Xarafka lagu baddalayo</string>\n    <string name=\"settings_file_replacement_character_summary\">Xarfaha aan la taageerin waxaa lagu bdadali midkan</string>\n    <string name=\"settings_file_charset_title\">Xarafyada magaca shayga loo ogol yahay</string>\n    <string name=\"settings_category_downloads_title\">Dajinta</string>\n    <string name=\"done\">Dhameeyay</string>\n    <string name=\"recaptcha_request_toast\">Tijaabada reCAPTCHA ayaa la codsaday</string>\n    <string name=\"subtitle_activity_recaptcha\">Taabo \\\"Dhameeyay\\\" ✅ markaad xaliso</string>\n    <string name=\"title_activity_recaptcha\">Tijaabada reCAPTCHA</string>\n    <string name=\"one_item_deleted\">1 shay ayaa la saaray.</string>\n    <string name=\"msg_popup_permission\">Ogolaanshahan ayaa loo baahan yahay si\n\\nloogu furo qaabka daaqada</string>\n    <string name=\"no_available_dir\">Fadlan khaanada wax lagu dajin doono hadhawto xaga fadhiga kasoo dooro</string>\n    <string name=\"msg_copied\">Dhakada ayaa lagu qabtay</string>\n    <string name=\"msg_wait\">Fadlan sug…</string>\n    <string name=\"msg_calculating_hash\">Xisaabinaya baddalka</string>\n    <string name=\"msg_running_detail\">Faahfaahinta kusii dhufo</string>\n    <string name=\"msg_running\">NewPipe wuu dajinayaa</string>\n    <string name=\"msg_error\">Khalad</string>\n    <string name=\"msg_threads\">Qaybaha</string>\n    <string name=\"msg_name\">Magaca shayga</string>\n    <string name=\"ok\">Hagaag</string>\n    <string name=\"rename\">Magaca ka baddal</string>\n    <string name=\"dismiss\">Iska dhaaf</string>\n    <string name=\"checksum\">Xaqiijiyaha</string>\n    <string name=\"delete\">Tirtir</string>\n    <string name=\"create\">Samee</string>\n    <string name=\"pause\">Qabo</string>\n    <string name=\"start\">Bilow</string>\n    <string name=\"no_comments\">faallooyin ma jiraan</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s muuqaal</item>\n        <item quantity=\"other\">%s muuqaal</item>\n    </plurals>\n    <string name=\"infinite_videos\">muuqaalo ∞</string>\n    <string name=\"more_than_100_videos\">100+ muuqaal</string>\n    <string name=\"no_videos\">muuqaalo ma jiraan</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s dhagayste</item>\n        <item quantity=\"other\">%s dhagaystayaal</item>\n    </plurals>\n    <string name=\"no_one_listening\">Cidna ma dhagaysanayso</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s ayaa daawanaya</item>\n        <item quantity=\"other\">%s ayaa daawanaysa</item>\n    </plurals>\n    <string name=\"no_one_watching\">Cidna ma daawanayso</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s ayaa lafuray</item>\n        <item quantity=\"other\">%s ayaa lafuray</item>\n    </plurals>\n    <string name=\"no_views\">Lama furin</string>\n    <string name=\"subscribers_count_not_available\">inta rukumatay lama heli karo</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s ayaa rukuntay</item>\n        <item quantity=\"other\">%s ayaa rukumatay</item>\n    </plurals>\n    <string name=\"no_subscribers\">Dad rukuntay ma jiraan</string>\n    <string name=\"drawer_header_description\">Furo adeega, hada waxaa dooran:</string>\n    <string name=\"retry\">ku celi</string>\n    <string name=\"audio\">Dhagaysi</string>\n    <string name=\"video\">Muuqaal</string>\n    <string name=\"detail_drag_description\">Farta ku jiid si aad ukala hormariso</string>\n    <string name=\"empty_list_subtitle\">meel madhan</string>\n    <string name=\"search_no_results\">natiijo lama helin</string>\n    <string name=\"detail_dislikes_img_view_description\">intaan ka helin</string>\n    <string name=\"detail_likes_img_view_description\">inta ka heshay</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Sawirka u saaran soosaareha</string>\n    <string name=\"detail_thumbnail_view_description\">Daar muuqaalka, intuu socdo:</string>\n    <string name=\"info_labels\">Shayga:\\nCodsiga:\\nLuuqada Shayga:\\nWadanka Shayga:\\nLuuqada Appka:\\nAdeega:\\nWakhtiga oo GMT ah:\\nXidhmada:\\nTirsiga Appka:\\nTirsiga Nooca Barnaamijka:</string>\n    <string name=\"error_details_headline\">Faahfaahin:</string>\n    <string name=\"your_comment\">Faalladaada (oo Ingiriis ah):</string>\n    <string name=\"what_happened_headline\">Waxa dhacay:</string>\n    <string name=\"what_device_headline\">Xogta:</string>\n    <string name=\"error_snackbar_action\">Wari</string>\n    <string name=\"error_snackbar_message\">Waan ka xunahay, waxbaa khaldamay.</string>\n    <string name=\"error_report_open_github_notice\">Fadlan hubi in arin cilladdan ka hadlaya horay loo wariyay. Marka wax horay u jiray la wariyo markale, wakhti ayaad naga qaadaysaa wakhtigaas oo aan cilada ku sixi la hayn.</string>\n    <string name=\"error_report_open_issue_button_text\">Ku wari xaga GitHub-ka</string>\n    <string name=\"copy_for_github\">Koobiyee warka oo diyaarsan</string>\n    <string name=\"error_report_button_text\">Khaladkan email ahaan ku warceli</string>\n    <string name=\"sorry_string\">Waan ka xunahay, sidaa inay dhacdo ma ahayn.</string>\n    <string name=\"permission_display_over_apps\">U ogolow appka inuu dul fuulo applicationada kale</string>\n    <string name=\"restore_defaults_confirmation\">Ma rabtaa inaad sidii hore kuceliso\\?</string>\n    <string name=\"restore_defaults\">Dib ugu celi sidii hore</string>\n    <string name=\"saved_tabs_invalid_json\">Lama akhrin karo daaqadihii la kaydiyay, …isticmaalaya kuwii app-ku kusoo baxay</string>\n    <string name=\"no_streams_available_download\">Wax la dajiyo lama heli karo</string>\n    <string name=\"error_occurred_detail\">Khalad ayaa ka dhacay: %1$s</string>\n    <string name=\"file_name_empty_error\">Magaca shayga ma madhnaan karo</string>\n    <string name=\"invalid_file\">Shaygani ma jiro ama ogolaansho looma haysto in wax laga baddalo ama la furo</string>\n    <string name=\"invalid_source\">Shaygan/tixraaca shayga lama heli karo</string>\n    <string name=\"invalid_directory\">khaanadan ma jirto</string>\n    <string name=\"missing_file\">Shaygan waa la guuriyay ama waa la tirtiray</string>\n    <string name=\"audio_streams_empty\">Wax la dhagaysto lama helin</string>\n    <string name=\"video_streams_empty\">Muuqaalo la daawado lama helin</string>\n    <string name=\"external_player_unsupported_link_type\">Daareyaasha dibada ah linkiyda noocan ah ma furaan</string>\n    <string name=\"player_recoverable_failure\">kasoo kabanaya khaladkii xaga daareha kadhacay</string>\n    <string name=\"player_unrecoverable_failure\">khalad xaga daareha ah oon la sixi karin ayaa dhacay</string>\n    <string name=\"player_stream_failure\">shaygan lama daari karo</string>\n    <string name=\"app_ui_crash\">Appka/UI ga ayaa khalkhalay</string>\n    <string name=\"could_not_setup_download_menu\">Lama soo kicin karo tusmada dajinta</string>\n    <string name=\"content_not_available\">shaygan lama heli karo</string>\n    <string name=\"parsing_error\">Lama furi karo website-ka</string>\n    <string name=\"could_not_load_thumbnails\">Lama soo wada kicin karo galalkoo dhan</string>\n    <string name=\"network_error\">khalad xaga khadka ah</string>\n    <string name=\"download_to_sdcard_error_message\">Ku dajinta kaydka dibadda (mimoriga) suurtogal ma aha. Dib u fadhiisi khaanada wax lagu dajiyo\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Kaydka dibadda lama heli karo</string>\n    <string name=\"general_error\">Khalad</string>\n    <string name=\"search_history_deleted\">Wixii la raadiyay waa la tirtiray</string>\n    <string name=\"delete_search_history_alert\">Tirtir dhamaan wixii la raadiyay\\?</string>\n    <string name=\"clear_search_history_summary\">Wuxuu tirtiraa kaydka wixii lagu qoray xaga raadinta</string>\n    <string name=\"watch_history_states_deleted\">Meelihii ay marayeen waa la tirtiray</string>\n    <string name=\"clear_search_history_title\">Tirtir wixii la raadiyay</string>\n    <string name=\"delete_playback_states_alert\">Tirtir dhamaan meelaha ay kuu marayeen\\?</string>\n    <string name=\"clear_playback_states_summary\">Wuxuu tirtiraa meelihii ay kuu marayeen waxyaabaha aad furtay oo dhan</string>\n    <string name=\"clear_playback_states_title\">Tirtir meelaha ay marayaan</string>\n    <string name=\"file\">Kaydka</string>\n    <string name=\"clear\">Nadiifi</string>\n    <string name=\"artists\">Fanaan</string>\n    <string name=\"albums\">Albumo</string>\n    <string name=\"songs\">Heeso</string>\n    <string name=\"tracks\">Muusik</string>\n    <string name=\"playlists\">Xul</string>\n    <string name=\"channels\">Kanaalo</string>\n    <string name=\"downloads_title\">Dajinta</string>\n    <string name=\"downloads\">Dajinta</string>\n    <string name=\"duration_live\">Toos</string>\n    <string name=\"undo\">Soo celi</string>\n    <string name=\"disabled\">Xidhan</string>\n    <string name=\"users\">Isticmaale</string>\n    <string name=\"videos_string\">Muuqaalo</string>\n    <string name=\"all\">Dhammaan</string>\n    <string name=\"watch_history_deleted\">Kaydka wixii ladaawaday waa la tirtiray</string>\n    <string name=\"delete_view_history_alert\">Tirtir gabi ahaan kaydka wixii ladaawaday\\?</string>\n    <string name=\"clear_views_history_summary\">Wuxuu tirtiraa kaydka wixii la daaray iyo meelihii ay kuu marayeen</string>\n    <string name=\"clear_views_history_title\">Nadiifi kaydka wixii ladaawaday</string>\n    <string name=\"clear_cookie_summary\">Nadiifi kaydka uu NewPipe kaydiyo markaad xaliso reCAPTCHA</string>\n    <string name=\"export_data_summary\">Dibadda u gudbi kaydka wixii la daawaday, rukunka, xulalka iyo fadhiga</string>\n    <string name=\"import_data_summary\">Wuxuu baddalaa kaydka waxaad daawatay, rukunka, xulalka iyo (hadaad doorato) fadhiga</string>\n    <string name=\"recaptcha_cookies_cleared\">Kaydkii reCAPTCHA waa la nadiifiyay</string>\n    <string name=\"clear_cookie_title\">Nadiifi kaydka reCAPTCHA</string>\n    <string name=\"export_data_title\">Gudbi xog diyaarsan</string>\n    <string name=\"import_data_title\">Soo gali xog kaydsan</string>\n    <string name=\"switch_to_main\">U baddal Sida Caadiga ah</string>\n    <string name=\"switch_to_popup\">U baddal qaabka Daaqada</string>\n    <string name=\"switch_to_background\">U Baddal Xaga Dambe</string>\n    <string name=\"unknown_content\">[Garanwaa]</string>\n    <string name=\"hash_channel_name\">Ogaysiiska baddalida Muuqaalka</string>\n    <string name=\"hash_channel_description\">Ogaysiisyada heerka uu marayo baddalida muuqaalka</string>\n    <string name=\"app_update_notification_channel_description\">Ogaysiisyada nooca cusub ee NewPipe</string>\n    <string name=\"app_update_notification_channel_name\">Ogaysiiska Cusbonaysiinta appka</string>\n    <string name=\"notification_channel_description\">Ogaysiisyada NewPipe markuu gadaal iyo xaga daaqada wax ka daarayo</string>\n    <string name=\"notification_channel_name\">Ogaysiisyada NewPipe</string>\n    <string name=\"just_once\">Markan uun</string>\n    <string name=\"always\">Marwalba</string>\n    <string name=\"play_all\">Wada Daar</string>\n    <string name=\"file_deleted\">Waa la saaray</string>\n    <string name=\"best_resolution\">Tayada ugu fiican</string>\n    <string name=\"events\">Bandhigyo</string>\n    <string name=\"error_report_title\">Warcelin khalad</string>\n    <string name=\"restricted_video\">Muuqaalkan da\\'da qofka ayuu ku xidhanyahay.\n\\n\n\\nKasoo fur \\\"%1$s\\\" xaga fadhiga hadaad rabto inaad aragto.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube-ku wuxuu leeyahay nidaamka \\\"Qaabka Xadidan\\\" kaasoo qariya waxyaabo laga yaabo ineysa haboonayn</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Fur \\\"Qaabka Xadidan\\\"</string>\n    <string name=\"show_age_restricted_content_summary\">Soo bandhig waxyaabaha laga yaabo inaysa ku haboonayn caruurta sababtoo ah waxay ku xidhan yihiin da\\'da qofka (sida 18+)</string>\n    <string name=\"show_age_restricted_content_title\">Tus waxyaabaha da\\'da ku xidhan</string>\n    <string name=\"content\">Luuqada &amp; Fadhiga Kale</string>\n    <string name=\"popup_playing_toast\">Ku daaraya daaqada</string>\n    <string name=\"background_player_playing_toast\">Ka daaraya xaga dambe</string>\n    <string name=\"settings_category_updates_title\">Cusboonaysiinta</string>\n    <string name=\"settings_category_debug_title\">Cilad bixinta</string>\n    <string name=\"settings_category_appearance_title\">Nashqada</string>\n    <string name=\"settings_category_history_title\">Wixii Hore &amp; kaydka K/G ah</string>\n    <string name=\"settings_category_video_audio_title\">Muuqaalada &amp; Dhagaysiga</string>\n    <string name=\"settings_category_player_title\">Daareha</string>\n    <string name=\"settings_category_player_behavior_title\">Dabeecada</string>\n    <string name=\"peertube_instance_add_exists\">Qaybtan horay ayay ujirtay</string>\n    <string name=\"peertube_instance_add_https_only\">Kaliya waxaa la taageeraa tixraacyada HTTPS-ka ah</string>\n    <string name=\"peertube_instance_add_fail\">Lama ansixin karo qaybtan</string>\n    <string name=\"peertube_instance_add_help\">Gali tixraaca qaybta</string>\n    <string name=\"peertube_instance_add_title\">Ku dar qayb</string>\n    <string name=\"peertube_instance_url_help\">Ka hel qaybaha aad jeceshahay %s</string>\n    <string name=\"peertube_instance_url_summary\">Dooro qaybaha aad jeceshahay ee PeerTube-ka</string>\n    <string name=\"peertube_instance_url_title\">Qaybaha PeerTube</string>\n    <string name=\"content_language_title\">Luuqada muuqaalka/dhagaysiga</string>\n    <string name=\"default_content_country_title\">Wadanka muuqaalada/dhagaysiga</string>\n    <string name=\"unsupported_url_dialog_message\">Lama aqoonsan karo tixraacan. Ku fur app kale\\?</string>\n    <string name=\"unsupported_url\">Tixraac aan la furi karin</string>\n    <string name=\"show_hold_to_append_summary\">Tus sharaxaada marka la riixayo batoonka xaga dambe ama midka daaqada ee ku yaala xaga \\\"Faahfaahinta:\\\" muuqaalka</string>\n    <string name=\"show_hold_to_append_title\">Tus sharaxaada \\\"Farta ku hay si aad iskugu darto\\\"</string>\n    <string name=\"show_next_and_similar_title\">Muuqaalada \\'Xiga\\' iyo \\'La xidhiidha\\'</string>\n    <string name=\"autoplay_title\">isdaarida</string>\n    <string name=\"download_dialog_title\">Daji</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Sii wad wixii daaraa marka la dhabqiyo kadib (tusaale marka wicitaan kusoo galo)</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Sii wad daaridda</string>\n    <string name=\"enable_watch_history_summary\">La soco [oo kaydi] muuqaalada ladaawaday</string>\n    <string name=\"settings_category_clear_data_title\">Tirtir Xogta</string>\n    <string name=\"enable_playback_state_lists_summary\">Tus meelaha waxa daaran meeshuu marayo tilmaamaya ee xaga liistada</string>\n    <string name=\"enable_playback_state_lists_title\">Meelaha ay marayeen (xaga liistada)</string>\n    <string name=\"enable_playback_resume_summary\">Kasii wad meeshii hore</string>\n    <string name=\"enable_playback_resume_title\">Sii wad daarrida</string>\n    <string name=\"enable_watch_history_title\">Wixii la daawaday</string>\n    <string name=\"enable_search_history_summary\">Ku kaydi wixii la raadiyay aallada</string>\n    <string name=\"enable_search_history_title\">Wixii laraadiyay</string>\n    <string name=\"show_search_suggestions_summary\">Dooro soojeedinada lasoo bandhigo marka wax la raadinayo</string>\n    <string name=\"show_search_suggestions_title\">Soojeedinada raadinta</string>\n    <string name=\"auto_queue_toggle\">Hormada isutalisa</string>\n    <string name=\"auto_queue_summary\">Sii wad dhamaystirka (mida aan isku celcelinin) hormada shidan ayadoo lagu sii darayo waxyaabo la xidhiidha shayga daaran</string>\n    <string name=\"auto_queue_title\">Ku xiji hormada shayga xiga</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Waa la tirtiray kaydkii K/G ahaa fahfaahinada yaryar</string>\n    <string name=\"metadata_cache_wipe_summary\">Tirtir waxyaabaha K/G ah ee boga website-ka</string>\n    <string name=\"metadata_cache_wipe_title\">Tirtir faahfaahinada yaryar</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">kaydkii kumeelgaadhka ahaa ee sawirka waa la tirtiray</string>\n    <string name=\"show_comments_summary\">Xidh si aad uqariso faallooyinka</string>\n    <string name=\"show_comments_title\">Tus faallooyinka</string>\n    <string name=\"clear_queue_confirmation_description\">Hormada daareha hadda wax shidaya waa la baddali doonaa</string>\n    <string name=\"clear_queue_confirmation_summary\">Kala baddalka daareha waxay badali kartaa hormada sidaas darteed waydii in la xaqiijiyo intaan hormada la tirtirin</string>\n    <string name=\"clear_queue_confirmation_title\">Xaqiijinta tirtirka hormada</string>\n    <string name=\"seek_duration_title\">Wakhtiga horay udhaafinta/dibucelinta</string>\n    <string name=\"black_theme_title\">Mugdi</string>\n    <string name=\"light_theme_title\">Caddaan</string>\n    <string name=\"play_audio\">Dhagaysi</string>\n    <string name=\"notification_action_nothing\">Waxba</string>\n    <string name=\"search\">Raadi</string>\n    <string name=\"download\">Daji</string>\n    <string name=\"fragment_feed_title\">Maxaa Cusub (Rukunka)</string>\n    <string name=\"stop\">Jooji</string>\n    <string name=\"close\">Ka bax</string>\n    <string name=\"grid\">Shax</string>\n    <string name=\"minimize_on_exit_none_description\">Waxba</string>\n    <string name=\"decline\">Diid</string>\n    <string name=\"name\">Magaca</string>\n    <string name=\"conferences\">Shirar</string>\n    <string name=\"feed_create_new_group_button_title\">Mid Cusub</string>\n    <string name=\"auto\">ismaamulaya</string>\n    <string name=\"playback_step\">Talaabo</string>\n    <string name=\"mute\">Aamusii</string>\n    <string name=\"autoplay_summary\">Daaridda si iskeed ah u bilow — %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Lama soo kicinin: %d</string>\n    <string name=\"download_already_pending\">Waxaa jirta dajin hormada ku jirta oo magacan leh</string>\n    <string name=\"max_retry_desc\">Tirada dib iskugu dayida sixida dajinta intaan la iska daynin</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d ayaa la calaamadiyay</item>\n        <item quantity=\"other\">%d ayaa la calaamadiyay</item>\n    </plurals>\n    <string name=\"enqueue\">Hormada gali</string>\n    <string name=\"recent\">Ugu Dambeeyay</string>\n    <string name=\"settings_category_feed_title\">Bandhigga</string>\n    <string name=\"error_http_no_content\">Martigaliyahu wax masoo dirin</string>\n    <string name=\"post_processing\">habaynaya</string>\n    <string name=\"list\">Si taxan</string>\n    <string name=\"playback_tempo\">Teembada</string>\n    <string name=\"enqueue_stream\">Hormo gali</string>\n    <string name=\"local\">Gudaha</string>\n    <string name=\"show_thumbnail_summary\">U isticmaal galka xaga shaashada markay xidhantahay iyo xaga kore ee ogaysiisyada</string>\n    <string name=\"playlist_page_summary\">Boga xulka</string>\n    <string name=\"show_thumbnail_title\">Soobandhig galka</string>\n    <string name=\"video_detail_by\">Sameeyay %s</string>\n    <string name=\"channel_created_by\">Waxaa sameeyay %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Waxa u saaran kanaalka</string>\n    <string name=\"content_not_supported\">Shaygan wali NewPipe ma taageerin.\n\\n\n\\nMustaqbalka in la taageero ayaa la rajaynayaa.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Soo kicinta bandhiggu aad miyuu u daahayaa\\? Haday saas tahay, iskuday furashada qaabka dagdaga ah (waxaad ka baddali kartaa xaga fadhiga ama adoo riixaya batoonka hoose).\n\\n\n\\nNewPipe wuxuu leeyahay laba qaab oo uu bandhiga usoo furo:\n\\n• Soo kicinta dhamaan rukunka kanaalka, taasoo ah mid culus laakiin dhamaystiran.\n\\n• Inuu isticmaalo adeeg hawshan loogu talagalay, taasoo ah mid dagdaga ah laakiin badanaa aan dhamaystirnayn.\n\\n\n\\nFarqiga labadan u dhexeeya ayaa ah in midka dagdaga ah uu la\\'yahay xogta shayga qaar, sida intuu shaygu socdo ama nooca (mana kala garan karo muuqaalada tooska ah iyo kuwa caadiga ah) wuxuuna sidoo kale soodhigi karaa waxyaabo yar.\n\\n\n\\nYouTube waa tusaale adeegyada ku bixiya qaabka dagdaga ah xagooda bandhiga RSS -ka.\n\\n\n\\nSidaa darteed dookhu wuxuu ku xidhanyahay kolba kaad rabto: adeeg dagdag ah ama wax saxan oo dhamaystiran.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Xidh qaabka dagdaga</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Fur qaabka dagdaga ah</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Laga heli karo adeegyada qaar, inta badana wuu ka dagdag badanyahay laakiin wuu ka natiijooyin yar yahay inta badana xogtu ma dhamaystirna (tusaale intuu shaygu soconayo ma tusayo, nooca shayga sidoo kale, mana sheegayo inuu muuqaalku toos yahay)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Qaabka dagdaga ah</string>\n    <string name=\"feed_update_threshold_option_always_update\">Marwalba cusboonaysii</string>\n    <string name=\"feed_update_threshold_summary\">Wakhtiga cusboonaysiinta udambaysa ee bandhigga, ka hor intaan rukunka laga sooqaadin mid duug ah — %s</string>\n    <string name=\"feed_update_threshold_title\">Xadka cusboonaysiinta</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Rukummada aan kooxaysnayn kaliya</string>\n    <string name=\"feed_group_dialog_delete_message\">Ma rabtaa inaad kooxdan saarto\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Magac kooxeed madhan</string>\n    <string name=\"feed_group_dialog_empty_selection\">Wax rukun ah lama dooran</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Dooro rukummada</string>\n    <string name=\"feed_processing_message\">Habaynaya bandhigga…</string>\n    <string name=\"feed_notification_loading\">Soo kicinaya bandhigga…</string>\n    <string name=\"feed_oldest_subscription_update\">La cusboonaysiiyay: %s</string>\n    <string name=\"feed_groups_header_title\">Kooxaha kanaalka</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d maalin</item>\n        <item quantity=\"other\">%d maalmood</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d saac</item>\n        <item quantity=\"other\">%d saac</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d daqiiqo</item>\n        <item quantity=\"other\">%d daqiiqo</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d ilbiriqsi</item>\n        <item quantity=\"other\">%d ilbiriqsi</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Ayadooy ugu wacantahay xayiraad xaga ExoPlayer-ka ah xadka dhaaf-dhaafinta waa %d ilbiriqsi</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Haa, sidoo kale ku dar muuqaalada qayb laga daawaday</string>\n    <string name=\"remove_watched_popup_warning\">Muuqaalada la daawaday kahor iyo kadib markii xulka lagu daray waa la saari doonaa. \\nMa hubtaa? Arrinkan dib looma soocelin karo!</string>\n    <string name=\"remove_watched_popup_title\">Saar muuqaalada la daawaday?</string>\n    <string name=\"remove_watched\">Saar kuwa la daawaday</string>\n    <string name=\"systems_language\">Aaladu saytahay</string>\n    <string name=\"app_language_title\">Luuqada Appka</string>\n    <string name=\"choose_instance_prompt\">Dooro qayb</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Storage Access Framework\\' loosoo gaabiyo SAF wuxuu suurto galiyaa in mimoriga wax lagu dajiyo</string>\n    <string name=\"downloads_storage_use_saf_title\">Maamulaha faylasha ee aallada (SAF)</string>\n    <string name=\"downloads_storage_ask_summary\">Shay walba meesha lagu kaydin doono ayaa lagu waydiin.\n\\nSoo fur maamulaha faylasha aallada (SAF) hadaad rabto inaad ku dajiso mimoriga</string>\n    <string name=\"downloads_storage_ask_title\">Waydii meesha lagu dajinayo</string>\n    <string name=\"pause_downloads\">Wada qabo dajinta</string>\n    <string name=\"start_downloads\">Wada bilow dajinta</string>\n    <string name=\"enable_queue_limit_desc\">Hal soodajin ayaa markiiba socon</string>\n    <string name=\"enable_queue_limit\">Xadid hormada dajinta</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Tani waxay muhiim tahay marka khadka la isticmaalayo midka SIM-ka loo baddalo ayadoo la qabanayo dajinta socota inkastooo soodajimaha qaar aan lajoojin karin</string>\n    <string name=\"pause_downloads_on_mobile\">Dhabqinta dajinta (khadka xadidan)</string>\n    <string name=\"max_retry_msg\">Xadka dib-isugudayida</string>\n    <string name=\"delete_downloaded_files\">Saar dajinta</string>\n    <string name=\"confirm_prompt\">Ma waxaad rabtaa inaad nadiifiso kaydka wixii lasoo dajiyay (tani ma tirtirto wixii lasoo dajiyay) mise inaad saarto dhammaan wixii lasoo dajiyay\\?</string>\n    <string name=\"clear_download_history\">Nadiifi dajinta</string>\n    <string name=\"error_download_resource_gone\">Dajintan lama hagaajin karo</string>\n    <string name=\"error_timeout\">Ku xidhidii ayaa wakhtigii ka dhacay</string>\n    <string name=\"error_progress_lost\">Hawshii socotay way kala kacday, sababtoo ah shayga waa lala saaray</string>\n    <string name=\"error_insufficient_storage_left\">Meel banaan oo wax lagu kaydiyo aalaada kuma hadhin</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe waxaa la xidhay asagoo fayl ka shaqaynaya</string>\n    <string name=\"error_postprocessing_failed\">Habayntii way guuldareystay</string>\n    <string name=\"error_http_not_found\">Lama helin</string>\n    <string name=\"error_http_unsupported_range\">Martigaliyuhu ma aqbalo dajinta qaybaha badan leh, iskula day @string/msg_threads = 1</string>\n    <string name=\"error_connect_host\">Kuma xidhi karo martigaliyaha</string>\n    <string name=\"error_unknown_host\">Lama heli karo martigaliyaha</string>\n    <string name=\"error_ssl_exception\">Lama samayn karo iskuxidh amni ah</string>\n    <string name=\"error_path_creation\">khaanadii la rabay lama samayn karo</string>\n    <string name=\"error_file_creation\">Faylka lama samayn karo</string>\n    <string name=\"show_error\">Tus khaladka</string>\n    <string name=\"download_already_running\">Waxaa jirta dajin socota oo magacan leh</string>\n    <string name=\"overwrite_failed\">Faylka laguma baddali karo</string>\n    <string name=\"overwrite_finished_warning\">Shay horay loo soo dajiyay oo magacan leh ayaa jira</string>\n    <string name=\"minimize_on_exit_popup_description\">U gudbi xaga daaqada</string>\n    <string name=\"minimize_on_exit_background_description\">U gudbi xaga dambe</string>\n    <string name=\"minimize_on_exit_summary\">Waxa la samayn doono marka app kale loo gudbayo ayadoo muuqaal caadi u daaran yahay — %s</string>\n    <string name=\"updates_setting_description\">Ogaysiis soo bandhig doonaya inaad appka cusboonaysiiso marka mid cusub soo baxo</string>\n    <string name=\"limit_mobile_data_usage_title\">Xadid tayada (khadka SIM-ka)</string>\n    <string name=\"accept\">Aqbal</string>\n    <string name=\"start_accept_privacy_policy\">Si loogu hogaansamo Maaraynta Xog Dhawrka Guud ee heer Yurub (GDPR), waxaan halkan kugu xusuusinaynaa siyaasada sirdhawrka NewPipe. Fadlan si taxadar leh u akhriso.\n\\nWaana inaad aqbashaa si [hadii aad damacdo] aad cilad appka ah warcelin nooga soo dirto.</string>\n    <string name=\"playback_pitch\">Dheelitirka codka</string>\n    <string name=\"unhook_checkbox\">Ka fur (sababi kara isdbadal)</string>\n    <string name=\"import_network_expensive_warning\">Hawlgalkan wuxuu noqon karaa mid khad badan isticmaala.\n\\n\n\\nMa rabtaa inaad sii wado\\?</string>\n    <string name=\"import_soundcloud_instructions\">Soogali meesha SoundCloud adoo ku qoraya tixraaca ama ID-gaaga:\n\\n\n\\n1. Fur nidaamka \\\"Desktop mode\\\" browser-kaaga dhexdiisa (sababtoo ah websitekan moobilada kuma shaqaynayo)\n\\n2. Booqo tixraacan %1$s\n\\n3. Gali akoonkaaga marka lagu waydiiyo \n\\n4. Koobiyee tixraaca boga ee lagugu xawilay.</string>\n    <string name=\"import_youtube_instructions\">Soo gali rukumada YouTube-ka:\n\\n\n\\n1. Booqo tixraacan: %1$s\n\\n2. Gali akoonkaaga marka lagu waydiiyo\n\\n3. Kusii dhufo \\\"Xogtoo dhan ku dar\\\", kadibna \\\"Ha calaamdin dhamaan\\\" kadibna dooro kaliya \\\"Rukunka\\\" oo \\\"OK\\\" dheh\n\\n4. Ku dhufo \\\"Talaabada xigta\\\" kadibna \\\"Samee gudbin\\\"\n\\n5. Ku dhufo batoonka \\\"Daji\\\" kadib markuu soo muuqdo\n\\n6. Zip-ka lasoo dajiyay kala furfur faylka .jason (badanaa wuxuu hoos tagaa \\\" \\\"YouTube and YouTube Music/subscriptions/subscriptions.json\\\") kadibna xagan soo gali.</string>\n    <string name=\"caption_setting_title\">Qoraal-hooseed</string>\n    <string name=\"caption_auto_generated\">isa-sameeyay</string>\n    <string name=\"resize_fit\">La ekaysii</string>\n    <string name=\"popup_player\">Daareha daaqada</string>\n    <string name=\"title_activity_history\">Wixii Hore</string>\n    <string name=\"show_meta_info_summary\">Halkan xidh si aad u qariso santuuqyada faahfaahinada yaryarka ah ee xogaha dheeraadka ah ee soosaaraha muuqaalka/dhagaysiga, waxa la daawanayo ama codsi raadin</string>\n    <string name=\"show_meta_info_title\">Faahfaahinta dheeraadka ah</string>\n    <string name=\"chapters\">Cutubyada</string>\n    <string name=\"description_tab_description\">Faahfaahin</string>\n    <string name=\"related_items_tab_description\">La xidhiidha</string>\n    <string name=\"comments_tab_description\">Faallooyin</string>\n    <string name=\"show_description_summary\">Xidh si aad u qariso faahfaahinta muuqaalka iyo xogaha dheeraadka ah</string>\n    <string name=\"show_description_title\">Tus faahfaahinta</string>\n    <string name=\"open_with\">Ku fur</string>\n    <string name=\"no_app_to_open_intent\">Wax app ah oo kuugu jira mafuri karo midkan</string>\n    <string name=\"radio\">Raadye</string>\n    <string name=\"featured\">Laguu sooxulay</string>\n    <string name=\"paid_content\">Shaygan waxaa loo heli karaa kaliya xubnaha bixiyay lacag, sidaa darteed NewPipe laguma daawan/dagsan karo.</string>\n    <string name=\"youtube_music_premium_content\">Muuqaalkan waxaa loo heli karaa kaliya xubnaha YouTube Music Premium, sidaa darteed NewPipe laguma daawan/dagsan karo.</string>\n    <string name=\"private_content\">Shaygan waa khaas, sidaa darteed NewPipe laguma daawan karo lagumana dajin karo.</string>\n    <string name=\"soundcloud_go_plus_content\">Shaygan waa SoundCloud Go+, ama ugu yaraan wadankaaga ayuu ka yahay, sidaa darteed NewPipe laguma daawan/dagsan karo.</string>\n    <string name=\"georestricted_content\">Shaygan wadanka aad joogto looma heli karo.</string>\n    <string name=\"crash_the_app\">Khalkhali appka</string>\n    <string name=\"recaptcha_solve\">Xalli</string>\n    <string name=\"restricted_video_no_stream\">Muuqaalkan da\\'da qofka ayuu ku xidhan yahay.\n\\nAyadooy ugu wacantahay talaabooyin cusub oo YouTube uu ku qaaday muuqaalada da\\'da ku xidhan, NewPipe ma furi karo muuqaalkan.</string>\n    <string name=\"download_has_started\">Dajintii way bilaabatay</string>\n    <string name=\"select_night_theme_toast\">Hoos ayaad ka dooran kartaa nashqada habaynkii ee aad door-biday</string>\n    <string name=\"night_theme_summary\">Dooro nashqada habaynkii ee aad doorbiday — %s</string>\n    <string name=\"auto_device_theme_title\">ismaamulaya (raacaya aallada)</string>\n    <string name=\"night_theme_title\">Nashqada Habaynka</string>\n    <string name=\"show_channel_details\">Faahfaahinta kanaalka</string>\n    <string name=\"off\">Xidhan</string>\n    <string name=\"on\">Furan</string>\n    <string name=\"tablet_mode_title\">Qaabka tablet-ka</string>\n    <string name=\"open_website_license\">Fur websiteka</string>\n    <string name=\"metadata_privacy_internal\">Gudaha</string>\n    <string name=\"metadata_privacy_private\">Gaar ah</string>\n    <string name=\"metadata_privacy_unlisted\">Aan liistada kujirin</string>\n    <string name=\"metadata_privacy_public\">Lawada arko</string>\n    <string name=\"metadata_host\">Martigaliye</string>\n    <string name=\"metadata_support\">Taageero</string>\n    <string name=\"metadata_language\">Luuqada</string>\n    <string name=\"metadata_age_limit\">Xadidka da\\'da</string>\n    <string name=\"metadata_privacy\">Gaar-ahaanshaha dhinaca muuqashada iyo fudayka isticmaalka ee shayga daaran</string>\n    <string name=\"metadata_licence\">Laysin</string>\n    <string name=\"metadata_tags\">Shaambadaha</string>\n    <string name=\"metadata_category\">Qaybta</string>\n    <string name=\"description_select_disable\">Xidh caalamadinta qoraalka</string>\n    <string name=\"description_select_enable\">Fur caalamadinta qoraalka</string>\n    <string name=\"description_select_note\">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.</string>\n    <string name=\"account_terminated\">Akoonka waa lajoojiyay</string>\n    <string name=\"feed_load_error_fast_unknown\">Nidaamka dagdaga ah faahfaahin dheeraad ah uma hayo shaygan.</string>\n    <string name=\"feed_load_error_terminated\">Akoonka soosaaraha waa la joojiyay.\n\\nNewPipe ma awoodi doono inuu soo kiciyo bandhiggan mustaqbalka.\n\\nMa iska joojin rabtaa rukunka kanaalkan\\?</string>\n    <string name=\"feed_load_error_account_info\">Lama soo kicin karo bandhigga: \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Khalad ayaa ka dhacay sookicintii</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Laga bilaabo Android 10 kaliya waxaa la isticmaali \\'SAF\\'</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Dajin walba meeshii lagu kaydin lahaa ayaa lagu waydiin</string>\n    <string name=\"disable_media_tunneling_summary\">Iska xidh kala-leexinta muuqaalada/dhagaysiga hadaad lakulanto shaashad madow ama muuqaalka oo isistaaga</string>\n    <string name=\"disable_media_tunneling_title\">Xidh kala-leexinta</string>\n    <string name=\"no_dir_yet\">Wali lama fadhiisin khaanadii dajinta, dooro khaanada wax lagu dajin doono hadda</string>\n    <string name=\"use_inexact_seek_summary\">Dhaaf-dhaafinta dagdaga ah ee waxa daaran, si buuxda oo sax ah wax uma dhaafiso balse waxay u sahashaa muuqaal daareha inuu u dhaaf dhaafiyo si dagdag ah. Nidaamkan 5, 15 ama 25 ilbiriqsi wax looma dhaafin karo</string>\n    <string name=\"dont_show\">Hatusin</string>\n    <string name=\"low_quality_smaller\">Tayo hoose (ka yar)</string>\n    <string name=\"high_quality_larger\">Tayo sare (ka wayn)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Tusmada dhaafdhaafinta</string>\n    <string name=\"comments_are_disabled\">Fallooyinka waa laxidhay</string>\n    <string name=\"detail_heart_img_view_description\">Kahelay soosaaraha</string>\n    <string name=\"mark_as_watched\">Waan daawaday</string>\n    <string name=\"remote_search_suggestions\">Soojeedinada raadinta banaanka</string>\n    <string name=\"local_search_suggestions\">Soojeedinada raadinta gudaha</string>\n    <string name=\"progressive_load_interval_title\">Cabirka soodaarida udhexeeya</string>\n    <string name=\"crash_the_player\">Jabi Daareha</string>\n    <string name=\"yes\">Haa</string>\n    <string name=\"no\">Maya</string>\n    <string name=\"search_with_service_name\">Raadi %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Raadi %1$s (%2$s)</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-sq/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Shtyp mbi lupën zmadhuese për të filluar.</string>\n    <string name=\"upload_date_text\">Publikuar më %1$s</string>\n    <string name=\"install\">Instalo</string>\n    <string name=\"cancel\">Anulo</string>\n    <string name=\"open_in_browser\">Hape në shfletues uebi</string>\n    <string name=\"share\">Shpërndaje</string>\n    <string name=\"download\">Shkarko</string>\n    <string name=\"search\">Kërko</string>\n    <string name=\"settings\">Cilësimet</string>\n    <string name=\"did_you_mean\">A po mendonit \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Shpërndaje me</string>\n    <string name=\"show_info\">Shfaq informatat</string>\n    <string name=\"fragment_feed_title\">Të rejat</string>\n    <string name=\"controls_add_to_playlist_title\">Shto në</string>\n    <string name=\"default_resolution_title\">Rezolucioni i parazgjedhur</string>\n    <string name=\"play_with_kodi_title\">Luaj me Kodi</string>\n    <string name=\"play_audio\">Audio</string>\n    <string name=\"black_theme_title\">E zezë</string>\n    <string name=\"show_search_suggestions_title\">Sugjerimet e kërkimit</string>\n    <string name=\"enable_watch_history_title\">Të shikuarat</string>\n    <string name=\"enable_watch_history_summary\">Ruaji videot e shikuara</string>\n    <string name=\"download_dialog_title\">Shkarko</string>\n    <string name=\"content_language_title\">Gjuha e dëshiruar e përmbajtjeve</string>\n    <string name=\"settings_category_player_title\">Luajtësi</string>\n    <string name=\"settings_category_player_behavior_title\">Sjellja</string>\n    <string name=\"settings_category_video_audio_title\">Video dhe audio</string>\n    <string name=\"settings_category_history_title\">Historia dhe depoja</string>\n    <string name=\"settings_category_appearance_title\">Pamja</string>\n    <string name=\"content\">Përmbajtja</string>\n    <string name=\"downloads\">Shkarkimet</string>\n    <string name=\"downloads_title\">Shkarkimet</string>\n    <string name=\"error_report_title\">Raporti i gabimit</string>\n    <string name=\"all\">Të gjitha</string>\n    <string name=\"missions_header_pending\">Në pritje</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d i zgjedhur</item>\n        <item quantity=\"other\">%d të zgjedhura</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Nuk u zgjodh asnjë abonim</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Zgjidhni abonimet</string>\n    <string name=\"feed_processing_message\">Duke procesuar listën…</string>\n    <string name=\"feed_notification_loading\">Duke ngarkuar listën…</string>\n    <string name=\"feed_subscription_not_loaded_count\">E pangarkuar: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Lista u përditësua së fundmi: %s</string>\n    <string name=\"feed_groups_header_title\">Grupet e kanaleve</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d orë</item>\n        <item quantity=\"other\">%d orë</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minutë</item>\n        <item quantity=\"other\">%d minuta</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekondë</item>\n        <item quantity=\"other\">%d sekonda</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">Për shkak të limitimeve të ExoPlayer kohëzgjatja e kërkimit u vendos në %d sekonda</string>\n    <string name=\"systems_language\">E parazgjedhura e sistemit</string>\n    <string name=\"app_language_title\">Gjuha e aplikacionit</string>\n    <string name=\"choose_instance_prompt\">Zgjidhni një instancë</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Storage Access Framework\\' lejon shkarkime në një kartë SD të jashtme</string>\n    <string name=\"downloads_storage_use_saf_title\">Përdor zgjedhësin e direktorisë së sistemit (SAF)</string>\n    <string name=\"downloads_storage_ask_summary\">Ju do të pyeteni se ku duhet ruajtur çdo shkarkim\n\\nAktivizoni zgjedhësin e direktorisë së sistemit (SAF) nëse doni t\\'i shkarkoni në një kartë SD të jashtme</string>\n    <string name=\"downloads_storage_ask_title\">Pyet se ku duhet shkarkuar</string>\n    <string name=\"pause_downloads\">Ndërprit shkarkimet</string>\n    <string name=\"start_downloads\">Nis shkarkimet</string>\n    <string name=\"enable_queue_limit_desc\">Një shkarkim do të vazhdojë gjatë gjithë kohës</string>\n    <string name=\"enable_queue_limit\">Limito radhën e shkarkimeve</string>\n    <string name=\"close\">Mbyll</string>\n    <string name=\"pause_downloads_on_mobile_desc\">E dobishme kur kaloni në internet përmes SIM, por disa shkarkimi nuk mund të pezullohen</string>\n    <string name=\"pause_downloads_on_mobile\">Ndërprit në rrjete të limituara</string>\n    <string name=\"max_retry_desc\">Numri maksimal i provave para se të anulohet shkarkimi</string>\n    <string name=\"max_retry_msg\">Provat maksimale</string>\n    <string name=\"stop\">Ndalo</string>\n    <string name=\"delete_downloaded_files\">Fshij skedarët e shkarkuar</string>\n    <string name=\"confirm_prompt\">A dëshironi të boshatisni historikun e shkarkimeve apo të fshini të gjithë skedarët e shkarkuar\\?</string>\n    <string name=\"clear_download_history\">Boshatis historikun e shkarkimeve</string>\n    <string name=\"error_download_resource_gone\">Nuk mund të rikuperohet ky shkarkim</string>\n    <string name=\"error_timeout\">Koha e lidhjes skadoi</string>\n    <string name=\"error_progress_lost\">Progresi humbi, pasi skedari është fshirë</string>\n    <string name=\"error_insufficient_storage_left\">Nuk ka vend bosh në pajisje</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe u mbyll ndërkohë që po punohej mbi skedarin</string>\n    <string name=\"error_postprocessing_failed\">Procesimi dështoi</string>\n    <string name=\"error_http_not_found\">Nuk u gjet</string>\n    <string name=\"error_http_unsupported_range\">Serveri nuk pranon shkarkime paralele, riprovoni me @string/msg_threads = 1</string>\n    <string name=\"error_http_no_content\">Serveri nuk dërgon të dhëna</string>\n    <string name=\"error_connect_host\">Nuk mund të lidhet me serverin</string>\n    <string name=\"error_unknown_host\">Nuk u arrit të gjendej serveri</string>\n    <string name=\"error_ssl_exception\">Nuk u arrit të vendosej një lidhje e sigurtë</string>\n    <string name=\"error_path_creation\">Dosja destinacion nuk mund të krijohet</string>\n    <string name=\"error_file_creation\">Skedari nuk mund të krijohet</string>\n    <string name=\"show_error\">Shfaq problemin</string>\n    <string name=\"download_already_pending\">Ka një shkarkim në pritje me këtë emër</string>\n    <string name=\"download_already_running\">Ka një shkarkim në progres me këtë emër</string>\n    <string name=\"overwrite_failed\">nuk mund të mbishkruhet skedari</string>\n    <string name=\"overwrite_finished_warning\">Një skedar i shkarkuar me këtë emër ekziston tashmë</string>\n    <string name=\"overwrite_unrelated_warning\">Një skedar me këtë emër ekziston tashmë</string>\n    <string name=\"overwrite\">Mbishkruaj</string>\n    <string name=\"generate_unique_name\">Gjenero një emër unik</string>\n    <string name=\"download_failed\">Shkarkimi dështoi</string>\n    <string name=\"permission_denied\">Veprim i ndaluar nga sistemi</string>\n    <string name=\"enqueue\">Radha</string>\n    <string name=\"recovering\">duke rikuperuar</string>\n    <string name=\"post_processing\">duke procesuar</string>\n    <string name=\"queued\">e shtuar në radhë</string>\n    <string name=\"paused\">ndalur</string>\n    <string name=\"missions_header_finished\">Përfunduar</string>\n    <string name=\"app_update_available_notification_title\">Përditësim i ri i NewPipe është i disponueshëm!</string>\n    <string name=\"auto\">Automatike</string>\n    <string name=\"list\">Listë</string>\n    <string name=\"list_view_mode\">Pamja e listës</string>\n    <string name=\"grid\">Rrjet</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimizoje në luajtësin popup</string>\n    <string name=\"minimize_on_exit_background_description\">Minimizoje në luajtësin në sfond</string>\n    <string name=\"minimize_on_exit_none_description\">Asnjë</string>\n    <string name=\"minimize_on_exit_summary\">Veprimi që ndërmerret kur kalohet në aplikacione të tjera nga luajtësi kryesor i videove — %s</string>\n    <string name=\"minimize_on_exit_title\">Minimizoje kur kalon midis aplikacioneve</string>\n    <string name=\"updates_setting_description\">Shfaq një njoftim për të përditësuar menjëherë aplikacionin kur një version i ri është i disponueshëm</string>\n    <string name=\"updates_setting_title\">Përditësimet</string>\n    <string name=\"limit_mobile_data_usage_title\">Limitoje rezolucionin kur je duke përdorur internetin nga SIM</string>\n    <string name=\"limit_data_usage_none_description\">Pa limit</string>\n    <string name=\"decline\">Refuzo</string>\n    <string name=\"accept\">Prano</string>\n    <string name=\"start_accept_privacy_policy\">Për të qenë në përputhje me Rregulloren e Përgjithshme Evropiane për Mbrojtjen e të Dhënave (GDPR), ne ju tërheqim vëmendjen tek politika e privatësisë së NewPipe. Ju lutemi lexojeni me kujdes.\n\\nJu duhet ta pranoni atë për të na dërguar raportin e problemit.</string>\n    <string name=\"playback_reset\">Rikthe</string>\n    <string name=\"playback_step\">Shkallë</string>\n    <string name=\"skip_silence_checkbox\">Shtyje përpara gjatë momenteve të heshtura</string>\n    <string name=\"unhook_checkbox\">Ç\\'lidhe (mund të shkaktojë shtrembërim)</string>\n    <string name=\"playback_pitch\">Intonacioni</string>\n    <string name=\"playback_tempo\">Ritmi</string>\n    <string name=\"playback_speed_control\">Kontrolli i Shpejtësisë së Luajtjes</string>\n    <string name=\"import_network_expensive_warning\">Duhet të dini se ku veprim mund të jetë i shtrenjtë në kosto interneti.\n\\n\n\\nDëshironi të vazhdoni\\?</string>\n    <string name=\"import_soundcloud_instructions_hint\">IDjuaj, soundcloud.com/idjuaj</string>\n    <string name=\"import_soundcloud_instructions\">Importoni një profil nga SoundCloud duke shkruar URL ose ID tuaj:\n\\n\n\\n1. Aktivizoni \\\"modalitetin desktop\\\" në një shfletues interneti (faqja e internetit nuk është e disponueshme për pajisjet mobile)\n\\n2. Shkoni tek kjo URL: %1$s\n\\n3. Hyni kur t\\'ju kërkohet\n\\n4. Kopjoni URL e profilit drejt të cilit u ridrejtuat.</string>\n    <string name=\"import_youtube_instructions\">Importoni abonimet nga YouTube përmes Google Takeout:\n\\n\n\\n1. Shkoni tek kjo URL: %1$s\n\\n2. Hyni kur t\\'ju kërkohet\n\\n3. Klikoni në \\\"All data included\\\", më pas në \\\"Deselect all\\\", dhe më pas zgjidhni vetëm \\\"subscriptions\\\" dhe klikoni \\\"OK\\\"\n\\n4. Klikoni në \\\"Next step\\\" dhe më pas në \\\"Create export\\\"\n\\n5. Klikoni në butonin \\\"Download\\\" pasi të shfaqet dhe\n\\n6. Nga skedari zip i shkarkuar, ekstraktoni skedarin .json (zakonisht ndodhet tek \\\"YouTube and YouTube Music/subscriptions/subscriptions.json\\\") dhe importojeni atë këtu.</string>\n    <string name=\"subscriptions_export_unsuccessful\">Nuk arritën të eksportohen abonimet</string>\n    <string name=\"subscriptions_import_unsuccessful\">Nuk arritën të importohen abonimet</string>\n    <string name=\"previous_export\">Eksportimi i kaluar</string>\n    <string name=\"import_file_title\">Importo skedarin</string>\n    <string name=\"export_ongoing\">Duke eksportuar…</string>\n    <string name=\"import_ongoing\">Duke importuar…</string>\n    <string name=\"export_to\">Eksporto në</string>\n    <string name=\"import_from\">Importo nga</string>\n    <string name=\"import_title\">Importo</string>\n    <string name=\"enable_disposed_exceptions_title\">Raporto gabimet e jashtë-ciklit-të-jetës</string>\n    <string name=\"enable_leak_canary_summary\">Monitorimi i rrjedhjeve të memorjes mund të bëjë aplikacionin të mos reagojë kur bëhet zbrazja e memorjes heap</string>\n    <string name=\"caption_setting_description\">Modifikoni shkallën e tekstit të titrave dhe llojet e sfondeve të luajtësit. Kërkon një rinisje të aplikacionit që të aplikohen ndryshimet</string>\n    <string name=\"caption_setting_title\">Titrat</string>\n    <string name=\"caption_auto_generated\">E gjeneruar automatikisht</string>\n    <string name=\"resize_zoom\">Afroje</string>\n    <string name=\"resize_fill\">Mbushe ekranin</string>\n    <string name=\"resize_fit\">Përshtat me ekranin</string>\n    <string name=\"caption_none\">Pa Titra</string>\n    <string name=\"playlist_no_uploader\">E gjeneruar automatikisht (nuk u gjet ngarkues)</string>\n    <string name=\"playlist_thumbnail_change_success\">Pamja statike e listës së luajtjes u ndryshua.</string>\n    <string name=\"playlist_add_stream_success\">E shtuar në listën e luajtjes</string>\n    <string name=\"playlist_creation_success\">Lista e luajtjes u krijua</string>\n    <string name=\"delete_playlist_prompt\">Të fshihet kjo listë luajtjeje\\?</string>\n    <string name=\"unbookmark_playlist\">Hiq Shenjuesin</string>\n    <string name=\"bookmark_playlist\">Shenjoje Listën e Luajtjes</string>\n    <string name=\"set_as_playlist_thumbnail\">Vendose si pamjen statike të listës së luajtjes</string>\n    <string name=\"unmute\">Me zë</string>\n    <string name=\"mute\">Pa zë</string>\n    <string name=\"add_to_playlist\">Shto në listën e luajtjes</string>\n    <string name=\"name\">Emri</string>\n    <string name=\"rename_playlist\">Riemërto</string>\n    <string name=\"create_playlist\">Listë Luajtje e Re</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Duke ngarkuar përmbajtjen e kërkuar</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Duke marrë informacion…</string>\n    <string name=\"always_ask_open_action\">Gjithmonë pyet</string>\n    <string name=\"popup_player\">Luajtësi popup</string>\n    <string name=\"background_player\">Luajtësi në sfond</string>\n    <string name=\"video_player\">Luajtësi video</string>\n    <string name=\"preferred_open_action_settings_summary\">Veprimi i parazgjedhur kur hapet përmbajtja — %s</string>\n    <string name=\"preferred_open_action_settings_title\">Veprimi i preferuar për \\'hapjen\\'</string>\n    <string name=\"drawer_close\">Mbyll Sirtarin</string>\n    <string name=\"drawer_open\">Hap Sirtarin</string>\n    <string name=\"start_here_on_popup\">Nis luajtjen në një popup të ri</string>\n    <string name=\"start_here_on_background\">Nis luajtjen në sfond</string>\n    <string name=\"hold_to_append\">Mbaj shtypur për të shtuar në radhë</string>\n    <string name=\"play_queue_audio_settings\">Aranzhimet Audio</string>\n    <string name=\"play_queue_stream_detail\">Detaje</string>\n    <string name=\"play_queue_remove\">Hiq</string>\n    <string name=\"conferences\">Konferencat</string>\n    <string name=\"most_liked\">Më të pëlqyerat</string>\n    <string name=\"recently_added\">Të shtuara së fundmi</string>\n    <string name=\"local\">Lokale</string>\n    <string name=\"new_and_hot\">Të rejat dhe të nxehtat</string>\n    <string name=\"top_50\">Top 50</string>\n    <string name=\"trending\">E trendit</string>\n    <string name=\"error_unable_to_load_comments\">Nuk mundën të ngarkohen komentet</string>\n    <string name=\"import_settings\">A dëshironi që të importoni dhe aranzhimet gjithashtu\\?</string>\n    <string name=\"override_current_data\">Kjo do të mbishkruajë strukturimin tuaj të tanishëm.</string>\n    <string name=\"could_not_import_all_files\">Kujdes: Nuk arritën të importohen të gjithë skedarët.</string>\n    <string name=\"no_valid_zip_file\">Nuk është skedar ZIP i vlefshëm</string>\n    <string name=\"import_complete_toast\">U importua</string>\n    <string name=\"export_complete_toast\">U eksportua</string>\n    <string name=\"select_a_kiosk\">Zgjidhni një kioskë</string>\n    <string name=\"no_channel_subscribed_yet\">Nuk ka ende kanale të abonuara</string>\n    <string name=\"select_a_channel\">Zgjidhni një kanal</string>\n    <string name=\"channel_page_summary\">Faqja e Kanaleve</string>\n    <string name=\"default_kiosk_page_summary\">Kioska e Parazgjedhur</string>\n    <string name=\"kiosk_page_summary\">Faqja Kioskë</string>\n    <string name=\"blank_page_summary\">Faqe Bosh</string>\n    <string name=\"main_page_content_summary\">Cilat tab-e shfaqen në faqen kryesore</string>\n    <string name=\"main_page_content\">Përmbajtja e faqes kryesore</string>\n    <string name=\"title_most_played\">Më të Luajturat</string>\n    <string name=\"title_last_played\">Luajtur së Fundmi</string>\n    <string name=\"delete_item_search_history\">Doni ta fshini këtë objekt nga historiku i kërkimeve\\?</string>\n    <string name=\"title_activity_history\">Historiku</string>\n    <string name=\"action_history\">Historiku</string>\n    <string name=\"read_full_license\">Lexo licensën</string>\n    <string name=\"app_license_title\">Licensa e NewPipe</string>\n    <string name=\"read_privacy_policy\">Lexoni politikën e privatësisë</string>\n    <string name=\"privacy_policy_encouragement\">Projekti NewPipe e merr privatësinë tuaj seriozisht. Kështu, aplikacioni nuk mbledh të dhëna pa dijeninë tuaj.\n\\nPolitika e privatësisë së NewPipe shpjegon në detaje se çfarë të dhënat dërgohen dhe ruhen kur ju dërgoni një raport dështimi/crash.</string>\n    <string name=\"privacy_policy_title\">Politika e Privatësisë së NewPipe</string>\n    <string name=\"website_encouragement\">Shfletoni faqen e internetit të NewPipe për më tepër informacion dhe lajme.</string>\n    <string name=\"website_title\">Faqja e internetit</string>\n    <string name=\"give_back\">Jep</string>\n    <string name=\"donation_encouragement\">NewPipe zhvillohet nga zhvillues të cilët shpenzojnë kohën e tyre të lirë për t\\'u prurë juve eksperiencën më të mirë për përdoruesin. Ktheni nderin duke ndihmuar zhvilluesit që ta bëjnë NewPipe akoma edhe më të mirë ndërkohë që ata pijnë një filxhan kafe.</string>\n    <string name=\"donation_title\">Dhuro</string>\n    <string name=\"view_on_github\">Shikoje në GitHub</string>\n    <string name=\"contribution_encouragement\">Nëse keni ide rreth; përkthimeve, ndryshimeve në dizajn, pastrimit të kodit, apo ndryshime rrënjësore të kodit—ndihma është gjithnjë e mirëpritur. Sa më shumë të bëhet aq më mirë do jetë!</string>\n    <string name=\"contribution_title\">Kontribuo</string>\n    <string name=\"app_description\">Luajtës i lehtë dhe libre në Android.</string>\n    <string name=\"tab_licenses\">Licensat</string>\n    <string name=\"tab_about\">Rreth</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s nga %2$s nën %3$s</string>\n    <string name=\"title_licenses\">Licensat e palëve të treta</string>\n    <string name=\"title_activity_about\">Rreth NewPipe</string>\n    <string name=\"charset_most_special_characters\">Shumica e karaktereve speciale</string>\n    <string name=\"charset_letters_and_digits\">Shkronjat dhe numrat</string>\n    <string name=\"settings_file_replacement_character_title\">Karakteri zëvendësues</string>\n    <string name=\"settings_file_replacement_character_summary\">Karakteret e palejuara zëvendësohen me këtë vlerë</string>\n    <string name=\"settings_file_charset_title\">Karakteret e lejuara në emrat e skedarëve</string>\n    <string name=\"settings_category_downloads_title\">Shkarko</string>\n    <string name=\"done\">U bë</string>\n    <string name=\"recaptcha_request_toast\">sfida reCAPTCHA u kërkua</string>\n    <string name=\"subtitle_activity_recaptcha\">Shtyp \\\"U bë\\\" kur ta zgjidhni</string>\n    <string name=\"title_activity_recaptcha\">sfida reCAPTCHA</string>\n    <string name=\"one_item_deleted\">1 objekt u fshi.</string>\n    <string name=\"msg_popup_permission\">Kjo leje duhet për\n\\nt\\'u hapur në modalitetin popup</string>\n    <string name=\"no_available_dir\">Ju lutemi vendosni një dosje shkarkimi më vonë nga aranzhimet</string>\n    <string name=\"msg_copied\">U kopjua në tabelën e kopjeve</string>\n    <string name=\"msg_wait\">Ju lutem prisni…</string>\n    <string name=\"msg_running_detail\">Shtyp për detajet</string>\n    <string name=\"msg_running\">NewPipe duke shkarkuar</string>\n    <string name=\"msg_error\">Gabim</string>\n    <string name=\"msg_threads\">Veprimet paralele</string>\n    <string name=\"msg_name\">Emri i skedarit</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"rename\">Riemërto</string>\n    <string name=\"dismiss\">Hiqe</string>\n    <string name=\"checksum\">Kodi verifikues</string>\n    <string name=\"delete\">Fshij</string>\n    <string name=\"create\">Krijo</string>\n    <string name=\"pause\">Ndaloje</string>\n    <string name=\"start\">Nis</string>\n    <string name=\"no_comments\">Nuk ka komente</string>\n    <string name=\"infinite_videos\">∞ video</string>\n    <string name=\"more_than_100_videos\">100+ video</string>\n    <string name=\"no_videos\">Nuk ka video</string>\n    <string name=\"no_one_listening\">Askush nuk po dëgjon</string>\n    <string name=\"no_one_watching\">Askush nuk po e sheh</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s shikim</item>\n        <item quantity=\"other\">%s shikime</item>\n    </plurals>\n    <string name=\"no_views\">Nuk ka shikime</string>\n    <string name=\"subscribers_count_not_available\">Numri i abonentëve është i padisponueshëm</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s abonent</item>\n        <item quantity=\"other\">%s abonentë</item>\n    </plurals>\n    <string name=\"no_subscribers\">Nuk ka abonues</string>\n    <string name=\"drawer_header_description\">Aktivizoje shërbimin, momentalisht e zgjedhur:</string>\n    <string name=\"retry\">Riprovo</string>\n    <string name=\"audio\">Audio</string>\n    <string name=\"video\">Video</string>\n    <string name=\"detail_drag_description\">Tërhiqe për të ri-radhitur</string>\n    <string name=\"empty_list_subtitle\">Nuk ka asgjë këtu përveç bulkthave</string>\n    <string name=\"search_no_results\">Nuk ka rezultate</string>\n    <string name=\"detail_dislikes_img_view_description\">Mospëlqimet</string>\n    <string name=\"detail_likes_img_view_description\">Pëlqimet</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Pamja statike e fotos së ngarkuesit</string>\n    <string name=\"detail_thumbnail_view_description\">Luaje videon, kohëzgjatja:</string>\n    <string name=\"error_details_headline\">Detajet:</string>\n    <string name=\"your_comment\">Komenti juaj (në Anglisht):</string>\n    <string name=\"info_labels\">Çfarë:\\nKërkesa:\\nGjuha e përmbajtjes:\\nShteti i pëmbajtjes:\\nGjuha e aplikacionit:\\nShërbimi:\\nKoha në GMT:\\nPaketa:\\nVersioni:\\nVersioni i sistemit operativ:</string>\n    <string name=\"what_happened_headline\">Çfarë ndodhi:</string>\n    <string name=\"what_device_headline\">Informacion:</string>\n    <string name=\"error_snackbar_action\">Raporto</string>\n    <string name=\"error_snackbar_message\">Na vjen keq, diçka shkoi keq.</string>\n    <string name=\"error_report_button_text\">Raportoni këtë problem përmes e-mailit</string>\n    <string name=\"sorry_string\">Na vjen keq, kjo nuk duhej të ndodhte.</string>\n    <string name=\"permission_display_over_apps\">Jepni leje për tu shfaqur mbi aplikacionet e tjera</string>\n    <string name=\"restore_defaults_confirmation\">A doni të riktheheni në gjendjen fillestare\\?</string>\n    <string name=\"restore_defaults\">Kthe në gjendjen fillestare</string>\n    <string name=\"saved_tabs_invalid_json\">Nuk arritën të lexohen tab-et e ruajtura, do përdoren të paravendosurat</string>\n    <string name=\"no_streams_available_download\">Nuk ka streams të disponueshme për shkarkim</string>\n    <string name=\"error_occurred_detail\">Ndodhi një gabim: %1$s</string>\n    <string name=\"file_name_empty_error\">Emri i skedarit nuk mund të jetë bosh</string>\n    <string name=\"invalid_file\">Ky skedar nuk ekziston ose mungon leja për të lexuar ose shkruar në të</string>\n    <string name=\"tab_subscriptions\">Abonimet</string>\n    <string name=\"subscribe_button_title\">Abonohu</string>\n    <string name=\"invalid_source\">Nuk ka burim të tillë për skedarin/përmbajtjen</string>\n    <string name=\"invalid_directory\">Nuk ka dosje të tillë</string>\n    <string name=\"missing_file\">Skedari ka lëvizur ose është fshirë</string>\n    <string name=\"audio_streams_empty\">Nuk u gjendën stream për audio</string>\n    <string name=\"download_path_title\">Dosja e videove të shkarkuara</string>\n    <string name=\"controls_background_title\">Në sfond</string>\n    <string name=\"tab_choose\">Zgjidh Tabin</string>\n    <string name=\"tab_bookmarks\">Listat e Ruajtura</string>\n    <string name=\"subscription_update_failed\">Nuk mund të përditësohej abonimi</string>\n    <string name=\"subscription_change_failed\">Nuk mund të ndryshohej abonimi</string>\n    <string name=\"channel_unsubscribed\">Kanali u ç\\'abonua</string>\n    <string name=\"unsubscribe\">Ç\\'abonohu</string>\n    <string name=\"subscribed_button_title\">I abonuar</string>\n    <string name=\"use_external_audio_player_title\">Përdor lexues të jashtëm audio</string>\n    <string name=\"use_external_video_player_summary\">Heq audio për disa rezolucione</string>\n    <string name=\"use_external_video_player_title\">Përdorni lexues video të jashtëm</string>\n    <string name=\"controls_download_desc\">Shkarko skedarin stream</string>\n    <string name=\"open_in_popup_mode\">Hape në modalitetin popup</string>\n    <string name=\"no_player_found\">Nuk u gjend lexues për stream. Instalo VLC\\?</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">%s video</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d ditë</item>\n        <item quantity=\"other\">%d ditë</item>\n    </plurals>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s dëgjues</item>\n        <item quantity=\"other\">%s dëgjues</item>\n    </plurals>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s duke e parë</item>\n        <item quantity=\"other\">%s duke parë</item>\n    </plurals>\n    <string name=\"controls_popup_title\">Popup</string>\n    <string name=\"tracks\">Pistë</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Mendoni se lista po ngarkohet shumë ngadalë\\? Nëse po, provoni të aktivizoni ngarkimin e shpejtë (ju mund ta ndryshoni tek aranzhimet ose duke shtypur butonin më poshtë). \n\\n \n\\nNewPipe ofron dy strategji të ndryshme të ngarkimit: \n\\n• Të merret i gjithë kanali i abonuar, më e ngadaltë por e plotë \n\\n• Të përdoret një shërbim i dedikuar, i cili është i shpejtë por jo i plotë. \n\\n \n\\nNdryshimi midis të dyjave është se i shpejti zakonisht ka më pak informacion, si psh kohëzgjatja e objektit apo lloji (nuk mund të bëjë dallimin midis videove në kohë reale apo atyre normale) dhe mund të kthejë më pak objekte. \n\\n \n\\nYouTube është një shembull i një shërbimi i cili e ofron këtë metodë të shpejtë me anë të listës së vetë RSS. \n\\n \n\\nSi përfundim, zgjedhja mbetet në dorën tuaj dhe se çfarë ju preferoni: shpejtësi apo informacion të saktë.</string>\n    <string name=\"enable_disposed_exceptions_summary\">Detyroni raportimin e përjashtimeve Rx të padërgueshme jashtë fragmentit apo ciklit jetësor të aktivitetit pas hedhjes</string>\n    <string name=\"app_license\">NewPipe është program i lirë copyleft: Ju mund ta përdorni, ta studioni, ta ndani me të tjerët dhe ta përmirësoni sipas dëshirës. Specifikisht ju mund ta rishpërndani dhe/ose ta modifikoni sipas kushteve të Licensës GNU General Public siç është publikuar nga Fondacioni për Softuerin e Lirë (FSF), sipas versionit 3 të Licensës, ose (sipas mundësive tuaja) në një version më të ri.</string>\n    <string name=\"content_not_supported\">Kjo përmbajtje nuk është ende e mbështetur nga NewPipe.\n\\n\n\\nShpresojmë se do të mbështetet në një version të ardhshëm.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Çaktivizo</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Aktivizo modalitetin e shpejtë</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">E disponueshme në disa shërbime, zakonisht është shumë më e shpejtë por mund të kthejë një numër të limituar objektesh dhe shpesh informacion të paplotë (psh. pa kohëzgjatje, lloj objekti, status në kohë reale)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Merr nga një listë e dedikuar kur është e mundur</string>\n    <string name=\"feed_update_threshold_option_always_update\">Përditëso gjithnjë</string>\n    <string name=\"feed_update_threshold_summary\">Koha pas një përditësimi të fundit para se një abonim të konsiderohet i vjetëruar — %s</string>\n    <string name=\"feed_update_threshold_title\">Pragu i përditësimit të listës</string>\n    <string name=\"settings_category_feed_title\">Lista</string>\n    <string name=\"feed_create_new_group_button_title\">E re</string>\n    <string name=\"feed_group_dialog_delete_message\">A doni ta fshini këtë grup\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Emër bosh i grupit</string>\n    <string name=\"video_streams_empty\">Nuk u gjendën stream për video</string>\n    <string name=\"external_player_unsupported_link_type\">Luajtësit e jashtëm nuk i mbështesin këto lloje ndërlidhjesh</string>\n    <string name=\"player_recoverable_failure\">Duke rikuperuar nga problemi i luajtësit</string>\n    <string name=\"player_unrecoverable_failure\">Ndodhi një problem i parikuperueshëm i luajtësit</string>\n    <string name=\"player_stream_failure\">Nuk u arrit të luhej ky stream</string>\n    <string name=\"app_ui_crash\">Aplikacioni/UI u prish</string>\n    <string name=\"could_not_setup_download_menu\">Nuk u arrit të vendosej menuja e shkarkimeve</string>\n    <string name=\"content_not_available\">Përmbajtja e padisponueshme</string>\n    <string name=\"parsing_error\">Nuk u arrit të analizohej faqja</string>\n    <string name=\"could_not_load_thumbnails\">Nuk u mundën të ngarkoheshin të gjitha pamjet statike</string>\n    <string name=\"network_error\">Problem rrjeti</string>\n    <string name=\"download_to_sdcard_error_message\">Shkarkimi në kartën SD të jashtme nuk ishte i mundur. Doni të rivendosni vendndodhjen e dosjes së shkarkimeve\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Magazina e jashtme u padisponueshme</string>\n    <string name=\"general_error\">Gabim</string>\n    <string name=\"search_history_deleted\">Historiku i kërkimeve u fshi</string>\n    <string name=\"delete_search_history_alert\">Doni të fshini të gjithë historikun e kërkimeve\\?</string>\n    <string name=\"clear_search_history_summary\">Fshin historikun e fjalëve kyçe të kërkuara</string>\n    <string name=\"clear_search_history_title\">Fshini historikun e kërkimeve</string>\n    <string name=\"watch_history_states_deleted\">Pozicionet e luajtjeve u fshinë</string>\n    <string name=\"delete_playback_states_alert\">Doni të fshini të gjitha pozicionet e luajtjeve\\?</string>\n    <string name=\"clear_playback_states_summary\">Fshini të gjitha pozicionet e luajtjeve</string>\n    <string name=\"clear_playback_states_title\">Fshini pozicionin e luajtjes</string>\n    <string name=\"watch_history_deleted\">Historiku i videove të luajtura u fshi</string>\n    <string name=\"delete_view_history_alert\">Doni të fshini të gjithë historikun e videove të luajtura\\?</string>\n    <string name=\"clear_views_history_summary\">Fshin historikun e stream-ave të luajtura dhe pozicioneve të luajtjes</string>\n    <string name=\"clear_views_history_title\">Pastro historinë e videove të luajtura</string>\n    <string name=\"export_data_summary\">Eksporto historikun, abonimet, listat e luajtjes dhe mundësimet</string>\n    <string name=\"import_data_summary\">Mbishkruan historinë, abonimet tuaja të tanishme, listat e luajtjes dhe mundësimet (opsionale)</string>\n    <string name=\"export_data_title\">Eksporto databazën</string>\n    <string name=\"import_data_title\">Importo databazën</string>\n    <string name=\"switch_to_main\">Kaloje në Qendrore</string>\n    <string name=\"switch_to_popup\">Kaloje në Popup</string>\n    <string name=\"switch_to_background\">Kaloje në Sfond</string>\n    <string name=\"unknown_content\">[E panjohur]</string>\n    <string name=\"app_update_notification_channel_description\">Njoftimet për versionet e reja të NewPipe</string>\n    <string name=\"app_update_notification_channel_name\">Njoftimi për Përditësime të Aplikacionit</string>\n    <string name=\"notification_channel_description\">Njoftimet për luajtësit në sfond dhe popup të NewPipe</string>\n    <string name=\"notification_channel_name\">Njoftim nga NewPipe</string>\n    <string name=\"file\">Skedar</string>\n    <string name=\"just_once\">Vetëm një Herë</string>\n    <string name=\"always\">Gjithmonë</string>\n    <string name=\"play_all\">Luaj të Gjitha</string>\n    <string name=\"file_deleted\">Skedari u fshi</string>\n    <string name=\"undo\">Zhbëj</string>\n    <string name=\"best_resolution\">Rezolucioni më i mirë</string>\n    <string name=\"clear\">Pastro</string>\n    <string name=\"disabled\">E çaktivizuar</string>\n    <string name=\"artists\">Artistët</string>\n    <string name=\"albums\">Albumet</string>\n    <string name=\"songs\">Këngët</string>\n    <string name=\"events\">Eventet</string>\n    <string name=\"users\">Përdoruesit</string>\n    <string name=\"videos_string\">Videot</string>\n    <string name=\"playlists\">Listat e videove</string>\n    <string name=\"channels\">Kanalet</string>\n    <string name=\"duration_live\">Në kohë reale</string>\n    <string name=\"restricted_video\">Kjo video ka kufizime moshe.\n\\n\n\\nAktivizoni \\\"%1$s\\\" tek aranzhimet nëse doni ta shihni.</string>\n    <string name=\"show_age_restricted_content_title\">Shfaq përmbajtjet me moshë të kufizuar</string>\n    <string name=\"popup_playing_toast\">Duke luajtur në modalitetin popup</string>\n    <string name=\"background_player_playing_toast\">Duke luajtur në sfond</string>\n    <string name=\"settings_category_updates_title\">Përditësimet</string>\n    <string name=\"settings_category_debug_title\">Rregullo</string>\n    <string name=\"peertube_instance_add_exists\">Instanca ekziston tashmë</string>\n    <string name=\"peertube_instance_add_https_only\">Vetëm URL-të HTTPS janë të mbështetura</string>\n    <string name=\"peertube_instance_add_fail\">Nuk arriti të vërtetësohej instanca</string>\n    <string name=\"peertube_instance_add_help\">Vendosni URL e instancës</string>\n    <string name=\"peertube_instance_add_title\">Shtoni instancë</string>\n    <string name=\"peertube_instance_url_help\">Gjeni instancat që ju pëlqeni në %s</string>\n    <string name=\"peertube_instance_url_summary\">Zgjidhni instancat tuaja të preferuara të PeerTube</string>\n    <string name=\"peertube_instance_url_title\">Instancat PeerTube</string>\n    <string name=\"default_content_country_title\">Shteti i parazgjedhur i përmbajtjes</string>\n    <string name=\"unsupported_url\">URL e pambështetur</string>\n    <string name=\"show_hold_to_append_summary\">Trego ndihmën kur shtypet sfondi ose butoni i popup në \\\"Detajet:\\\" e videos</string>\n    <string name=\"show_hold_to_append_title\">Trego ndihmën \\\"Mbaje shtypur për ta shtuar në listë\\\"</string>\n    <string name=\"show_next_and_similar_title\">Trego \\'Tjetra\\' dhe videot \\'E ngjashme\\'</string>\n    <string name=\"autoplay_title\">Luajtje automatike</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Vazhdoje luajtjen pas ndërprerjeve (psh. telefonatat)</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Vazhdoje luajtjen</string>\n    <string name=\"settings_category_clear_data_title\">Fshij të dhënat</string>\n    <string name=\"enable_playback_state_lists_summary\">Shfaq treguesit e pozicionit të luajtjes në lista</string>\n    <string name=\"enable_playback_state_lists_title\">Pozicionet në lista</string>\n    <string name=\"enable_playback_resume_summary\">Rikthe pozicionin e fundit të luajtjes</string>\n    <string name=\"enable_playback_resume_title\">Vazhdo luajtjen</string>\n    <string name=\"enable_search_history_summary\">Ruani frazat e kërkuara lokalisht</string>\n    <string name=\"enable_search_history_title\">Historia e kërkimit</string>\n    <string name=\"show_search_suggestions_summary\">Shfaq sugjerime kur jeni duke kërkuar</string>\n    <string name=\"auto_queue_summary\">Vazhdoje radhën e luajtjes së mbarueshme (e papërsëritur) duke shtuar një stream të ngjashëm</string>\n    <string name=\"auto_queue_title\">Auto-radhit stream-in e radhës</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Depoja e të dhënave meta u boshatis</string>\n    <string name=\"metadata_cache_wipe_summary\">Boshatis depon e të gjitha të dhënave të faqeve të internetit</string>\n    <string name=\"metadata_cache_wipe_title\">Boshatis depon e të dhënave meta</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Depoja e imazheve u boshatis</string>\n    <string name=\"show_comments_summary\">Fikeni për të fshehur komentet</string>\n    <string name=\"show_comments_title\">Shfaq komentet</string>\n    <string name=\"seek_duration_title\">Kohëzgjatja e kërkimit me shtytje-përpara/-pas</string>\n    <string name=\"use_inexact_seek_summary\">Kërkuesi i pasaktë e lejon luajtësin që të kërkojë pozicionet më shpejt më saktësi të reduktuar. Kërkimi për 5, 15 ose 25 sekonda nuk punon me këtë</string>\n    <string name=\"use_inexact_seek_title\">Përdor kërkuesin e pasaktë por të shpejtë</string>\n    <string name=\"popup_remember_size_pos_summary\">Mbaj mend madhësinë e fundit dhe pozicionin e popup</string>\n    <string name=\"popup_remember_size_pos_title\">Mbaj mend popup</string>\n    <string name=\"dark_theme_title\">E errët</string>\n    <string name=\"light_theme_title\">E bardhë</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"default_video_format_title\">Formati i parazgjedhur video</string>\n    <string name=\"default_audio_format_title\">Formati i parazgjedhur audio</string>\n    <string name=\"show_play_with_kodi_summary\">Shfaq një opsion për të luajtur videot përmes Kodi</string>\n    <string name=\"show_play_with_kodi_title\">Shfaq opsionin \\\"Luaj me Kodi\\\"</string>\n    <string name=\"kore_not_found\">Instaloni aplikacionin Kore që mungon\\?</string>\n    <string name=\"show_higher_resolutions_summary\">Vetëm disa pajisje mund të luajnë video 2K/4K</string>\n    <string name=\"show_higher_resolutions_title\">Shfaq rezolucione më të larta</string>\n    <string name=\"default_popup_resolution_title\">Rezolucioni i parazgjedhur i popup</string>\n    <string name=\"download_path_audio_dialog_title\">Zgjidhni dosjen e shkarkimit për skedarët audio</string>\n    <string name=\"download_path_audio_summary\">Skedarët audio të shkarkuara ruhen lëtu</string>\n    <string name=\"download_path_audio_title\">Dosja e shkarkimeve audio</string>\n    <string name=\"download_path_dialog_title\">Zgjidhni dosjen e shkarkimit për skedarët video</string>\n    <string name=\"download_path_summary\">Skedarët video të shkarkuara ruhen këtu</string>\n    <string name=\"no_player_found_toast\">Nuk u gjend lexues për stream (ju mund të instaloni VLC për ta lexuar).</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Po, dhe videot e shikuara pjesërisht</string>\n    <string name=\"remove_watched_popup_warning\">Videot që janë shikuar më parë dhe pasi janë shtuar në listën e luajtjes do të hiqen. \\nA jeni të sigurt? Kjo nuk mund të zhbëhet!</string>\n    <string name=\"remove_watched_popup_title\">Dëshironi t\\'i hiqni videot e para?</string>\n    <string name=\"remove_watched\">Hiq të parat</string>\n    <string name=\"show_original_time_ago_summary\">Tekstet origjinale nga shërbimet do shihen në produktet e luajtshme</string>\n    <string name=\"show_original_time_ago_title\">Shfaq titullin origjinal \\\"kohë më parë\\\" në objekte</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Aktivizo modalitetin e kufizuar të YouTube</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Pamja statike e avatarit të kanalit</string>\n    <string name=\"video_detail_by\">Nga %s</string>\n    <string name=\"channel_created_by\">Krijuar nga %s</string>\n    <string name=\"playlist_page_summary\">Faqja e listës së luajtjes</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Shfaq vetëm abonimet e pagrupuara</string>\n    <string name=\"no_playlist_bookmarked_yet\">Nuk ka ende shënjues të listave të luajtjes</string>\n    <string name=\"select_a_playlist\">Zgjidhni një listë luajtjeje</string>\n    <string name=\"error_report_open_github_notice\">Ju lutemi kontrolloni nëse një raport ku diskutohet problemi ekziston tashmë. Kur krijoni raporte të duplikuara, ju merrni më tepër kohë nga ne, kohë të cilën mund ta shpenzonim mbi rregullimin e problemit aktual.</string>\n    <string name=\"error_report_open_issue_button_text\">Raporto në GitHub</string>\n    <string name=\"copy_for_github\">Kopjo raportin e formatuar</string>\n    <string name=\"search_showing_result_for\">Duke shfaqur rezultatet për: %s</string>\n    <string name=\"wifi_only\">Vetëm në Wi-Fi</string>\n    <string name=\"notification_actions_summary\">Redakto çdo veprim njoftimi më poshtë duke shtypur mbi të. Zgjidhni deri në tre prej tyre që të shfaqen në njoftimin kompakt duke përdorur kutitë në të djathtë</string>\n    <string name=\"never\">Kurrë</string>\n    <string name=\"autoplay_summary\">Nise luajtjen automatikisht — %s</string>\n    <string name=\"title_activity_play_queue\">Lista e luajtjes</string>\n    <string name=\"unsupported_url_dialog_message\">Nuk u njoh URL. Të hapet me një aplikacion tjetër\\?</string>\n    <string name=\"auto_queue_toggle\">Listë automatike luajtjeje</string>\n    <string name=\"clear_queue_confirmation_description\">Lista aktive e luajtjes do të zëvendësohet</string>\n    <string name=\"clear_queue_confirmation_summary\">Kalimi nga një luajtës në një tjetër mund të zëvendësojë listën tuaj të luajtjes</string>\n    <string name=\"clear_queue_confirmation_title\">Pyet për konfirmim para se të boshatiset një rradhë luajtjeje</string>\n    <string name=\"notification_action_nothing\">Asgjë</string>\n    <string name=\"notification_action_buffering\">Ngarkimi</string>\n    <string name=\"notification_action_shuffle\">Trazo</string>\n    <string name=\"notification_action_repeat\">Përsërit</string>\n    <string name=\"notification_actions_at_most_three\">Ju mund të zgjidhni e shumta tre veprime për të shfaqur në njoftimin kompakt!</string>\n    <string name=\"notification_action_4_title\">Butoni i pestë i veprimit</string>\n    <string name=\"notification_action_3_title\">Butoni i katërt i veprimit</string>\n    <string name=\"notification_action_2_title\">Butoni i tretë i veprimit</string>\n    <string name=\"notification_action_1_title\">Butoni i dytë i veprimit</string>\n    <string name=\"notification_action_0_title\">Butoni i parë i veprimit</string>\n    <string name=\"notification_scale_to_square_image_summary\">Shkallëzoje pamjen miniaturë të videos së treguar në njoftim nga aspekti 16:9 në 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Shkallëzoje pamjen miniaturë në aspektin 1:1</string>\n    <string name=\"show_memory_leaks\">Shfaq rrjedhjet e memories</string>\n    <string name=\"recaptcha_cookies_cleared\">Biskotat reCAPTCHA janë pastruar</string>\n    <string name=\"clear_cookie_title\">Pastroni biskotat reCAPTCHA</string>\n    <string name=\"notification_colorize_title\">Ngjyros njoftimin</string>\n    <string name=\"no_app_to_open_intent\">Nuk ka app në këtë pajisje që mund ta ngarkojë</string>\n    <string name=\"chapters\">Kapitujt</string>\n    <string name=\"recent\">Të fundit</string>\n    <string name=\"show_thumbnail_title\">Shfaq pamjen miniaturë</string>\n    <string name=\"msg_calculating_hash\">Duke llogaritur hash</string>\n    <string name=\"description_tab_description\">Përshkrimi</string>\n    <string name=\"related_items_tab_description\">Streams të ngjashme</string>\n    <string name=\"comments_tab_description\">Komentet</string>\n    <string name=\"hash_channel_description\">Njoftimet mbi progresin e hash-imit të videove</string>\n    <string name=\"hash_channel_name\">Njoftimi për Hash e Videos</string>\n    <string name=\"show_meta_info_title\">Shfaq të dhënat meta</string>\n    <string name=\"show_description_summary\">Ç\\'aktivizoje për të fshehur përshkrimin e videos dhe informacione shtesë</string>\n    <string name=\"show_description_title\">Shfaq përshkrimin</string>\n    <string name=\"notification_colorize_summary\">Lejoje Android që të modifikojë ngjyrën e njoftimit bazuar tek ngjyra kryesore në pamjen miniaturë (mbani mend që kjo nuk është e disponueshme në të gjitha pajisjet)</string>\n    <string name=\"open_with\">Hape me</string>\n    <string name=\"clear_cookie_summary\">Pastroni biskotat që NewPipe ruan kur zgjidhni një reCAPTCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube ofron një \\\"Modalitet të Kufizuar\\\" që fsheh përmbajtje vetëm për të rritur</string>\n    <string name=\"show_age_restricted_content_summary\">Shfaq përmbajtje ndoshta të papërshtatshme për fëmijë sepse ka një kufi moshe (si 18+)</string>\n    <string name=\"featured\">E përzgjedhur</string>\n    <string name=\"paid_content\">Kjo përmbajtje është e disponueshme vetëm për përdoruesit që kanë paguar, kështu që nuk mund të luhet apo shkarkohet nga NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Kjo video është e disponueshme vetëm për anëtarët e YouTube Music Premium, kështu që nuk mund të luhet apo shkarkohet nga NewPipe.</string>\n    <string name=\"soundcloud_go_plus_content\">Ky është një skedar SoundCloud Go+, të paktën në shtetin tuaj, kështu që nuk mund të luhet apo shkarkohet nga NewPipe.</string>\n    <string name=\"show_meta_info_summary\">Fikeni për të fshehur kutitë e të dhënave meta me information ekstra rreth krijuesit të stream, përmbajtjen e stream dhe kërkimit</string>\n    <string name=\"off\">Fikur</string>\n    <string name=\"on\">Ndezur</string>\n    <string name=\"tablet_mode_title\">Modaliteti tablet</string>\n    <string name=\"open_website_license\">Hap faqen e internetit</string>\n    <string name=\"metadata_privacy_internal\">E brendshme</string>\n    <string name=\"metadata_privacy_private\">Private</string>\n    <string name=\"metadata_privacy_unlisted\">E palistuar</string>\n    <string name=\"metadata_privacy_public\">Publike</string>\n    <string name=\"metadata_host\">Mundësuesi</string>\n    <string name=\"metadata_support\">Mbështetje</string>\n    <string name=\"metadata_language\">Gjuha</string>\n    <string name=\"metadata_age_limit\">Limiti i moshës</string>\n    <string name=\"metadata_privacy\">Privatësia</string>\n    <string name=\"metadata_licence\">Licensa</string>\n    <string name=\"metadata_tags\">Etiketat</string>\n    <string name=\"metadata_category\">Kategoria</string>\n    <string name=\"description_select_disable\">Ç\\'aktivizo selektimin e tekstit në përshkrim</string>\n    <string name=\"description_select_enable\">Aktivizo selektimin e tekstit në përshkrim</string>\n    <string name=\"description_select_note\">Ju tani mund të selektoni tekst brenda përshkrimit. Faqja mund të dridhet dhe ndërlidhjet mund të mos jenë të klikueshme në modalitetin e selektimit.</string>\n    <string name=\"download_has_started\">Shkarkimi ka filluar</string>\n    <string name=\"select_night_theme_toast\">Ju mund të zgjidhni temën tuaj të preferuar të natës më poshtë</string>\n    <string name=\"night_theme_summary\">Zgjidhni temën tuaj të preferuar të natës - %s</string>\n    <string name=\"auto_device_theme_title\">Automatike (tema e pajisjes)</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"account_terminated\">Llogaria është mbyllur</string>\n    <string name=\"private_content\">Kjo përmbajtje është private, kështu që nuk mund të luhet apo shkarkohet nga NewPipe.</string>\n    <string name=\"georestricted_content\">Kjo përmbajtje nuk është e disponueshme në shtetin tuaj.</string>\n    <string name=\"show_thumbnail_summary\">Përdor pamje statike për sfondin e ekranit të kyçur si dhe për njoftimet</string>\n    <string name=\"feed_load_error_fast_unknown\">Modaliteti i feed-it të shpejtë nuk mundëson më tepër informacion mbi këtë.</string>\n    <string name=\"feed_load_error_terminated\">Llogaria e autorit është bllokuar.\n\\nNewPipe nuk do mund ta ngarkojë këtë feed në të ardhmen.\n\\nA doni të ç\\'abonoheni nga ky kanal\\?</string>\n    <string name=\"feed_load_error_account_info\">Nuk u arrit të ngarkohej feed-i për \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Gabim gjatë ngarkimit të feed-it</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Duke nisur nga Android 10 vetëm \\'Storage Access Framework\\' është i mbështetur</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Ju do të pyeteni se ku doni të ruani çdo shkarkim</string>\n    <string name=\"crash_the_app\">Rrëzoje aplikacionin manualisht</string>\n    <string name=\"disable_media_tunneling_summary\">Ç\\'aktivizo tunelin e medias nëse po hasni një ekran të zi apo ngecje gjatë luajtjes së një videoje</string>\n    <string name=\"disable_media_tunneling_title\">Ç\\'aktivizo tunelin e medias</string>\n    <string name=\"enqueued\">E futur në radhë</string>\n    <string name=\"enqueue_stream\">Fute në radhë</string>\n    <string name=\"show_channel_details\">Shfaq detajet e kanalit</string>\n    <string name=\"recaptcha_solve\">Zgjidh</string>\n    <string name=\"no_dir_yet\">Nuk ka ende një skedar të zgjedhur të shkarkimeve, zgjidheni skedarin e paravendosur tani</string>\n    <string name=\"restricted_video_no_stream\">Kjo video është e kufizuar në moshë.\n\\nPër shkak të politikave të reja të YouTube në lidhje me videot e kufizuara në moshë, NewPipe nuk mund të aksesojë asnjë nga videot dhe nuk mund t\\'i luajë ato.</string>\n    <string name=\"night_theme_title\">Tema e natës</string>\n    <string name=\"detail_heart_img_view_description\">E pëlqyer nga krijuesi</string>\n    <string name=\"dont_show\">Mos shfaq</string>\n    <string name=\"low_quality_smaller\">Cilësi e ulët (më e vogël)</string>\n    <string name=\"high_quality_larger\">Cilësi e lartë (më e madhe)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Parapamje e pamjes miniaturë të lëvizësit të kohës</string>\n    <string name=\"comments_are_disabled\">Komentet janë të ç\\'aktivizuara</string>\n    <string name=\"mark_as_watched\">Shëno si të parë</string>\n    <string name=\"brightness\">Drita</string>\n    <string name=\"volume\">Volumi</string>\n    <string name=\"get_notified\">Njoftohu</string>\n    <string name=\"unknown_quality\">Qualitet i panjohur</string>\n    <string name=\"any_network\">Cilidi rrjet</string>\n    <string name=\"card\">Kartë</string>\n    <string name=\"unknown_audio_track\">Panjohur</string>\n    <string name=\"unknown_format\">Format i panjohur</string>\n    <string name=\"remove_duplicates_title\">Hiq duplikatet\\?</string>\n    <string name=\"feed_show_upcoming\">Së shpejti</string>\n    <string name=\"feed_show_watched\">Te shikuara në plotësi</string>\n    <string name=\"feed_show_partially_watched\">Gjysmë të shikuar</string>\n    <string name=\"audio_track_type_original\">origjinal</string>\n    <string name=\"audio_track_type_dubbed\">dubluar</string>\n    <string name=\"audio_track_type_descriptive\">përshkruese</string>\n    <string name=\"remove_duplicates\">Hiq duplikatet</string>\n    <string name=\"fast_mode\">Modi i shpejtë</string>\n    <string name=\"sort\">Rradhit</string>\n    <string name=\"channel_tab_livestreams\">Live</string>\n    <string name=\"channel_tab_albums\">Albumet</string>\n    <string name=\"play\">Luaj</string>\n    <string name=\"duration\">Zgjatja</string>\n    <string name=\"rewind\">Rikthe</string>\n    <string name=\"forward\">Para</string>\n    <string name=\"no_streams\">Nuk ka streams</string>\n    <string name=\"play_queue_audio_track\">Audio: %s</string>\n    <string name=\"metadata_avatars\">Avataret</string>\n    <string name=\"metadata_banners\">Banerat</string>\n    <string name=\"channel_tab_channels\">Kanalet</string>\n    <string name=\"channel_tab_videos\">Videot</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"replay\">Ri-luaj</string>\n    <string name=\"yes\">Po</string>\n    <string name=\"no\">Jo</string>\n    <string name=\"channel_tab_about\">Rreth</string>\n    <string name=\"next_stream\">Streami i rradhes</string>\n    <string name=\"notifications\">Njoftimet</string>\n    <string name=\"remote_search_suggestions\">Sugjerime jo-lokale për kërkim</string>\n    <string name=\"faq\">Shikoje në faqen ueb</string>\n    <string name=\"faq_title\">Pyetjet më të shpeshta</string>\n    <string name=\"prefer_original_audio_title\">Prefero audion origjinale</string>\n    <string name=\"prefer_descriptive_audio_title\">Prefero audio përshkruese</string>\n    <string name=\"none\">Asnjë</string>\n    <string name=\"local_search_suggestions\">Sugjerime lokale për kërkim</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-sr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Објављено %1$s</string>\n    <string name=\"no_player_found\">Нема извођача довода. Да ли уградити ВЛЦ?</string>\n    <string name=\"install\">Инсталирај</string>\n    <string name=\"cancel\">Откажи</string>\n    <string name=\"open_in_browser\">Отвори у прегледачу</string>\n    <string name=\"share\">Дели</string>\n    <string name=\"download\">Преузми</string>\n    <string name=\"search\">Претрага</string>\n    <string name=\"settings\">Подешавања</string>\n    <string name=\"did_you_mean\">Да ли сте мислили: „%1$s“\\?</string>\n    <string name=\"share_dialog_title\">Делите помоћу</string>\n    <string name=\"download_path_title\">Фолдер за преузимање видео снимака</string>\n    <string name=\"download_path_summary\">Преузети видео снимци се чувају овде</string>\n    <string name=\"download_path_dialog_title\">Изаберите фолдер за преузимање видео снимака</string>\n    <string name=\"default_resolution_title\">Подразумевана резолуција</string>\n    <string name=\"play_with_kodi_title\">Пусти помоћу Kodi-ја</string>\n    <string name=\"kore_not_found\">Инсталирати апликацију Kore која недостаје\\?</string>\n    <string name=\"show_play_with_kodi_title\">Прикажи опцију „Пусти помоћу Kodi-ја“</string>\n    <string name=\"show_play_with_kodi_summary\">Прикажите опцију за пуштање видео снимака преко Kodi медија центра</string>\n    <string name=\"play_audio\">Аудио снимак</string>\n    <string name=\"default_audio_format_title\">Подразумевани формат аудио снимка</string>\n    <string name=\"download_dialog_title\">Преузимање</string>\n    <string name=\"unsupported_url\">URL адреса није подржана</string>\n    <string name=\"show_next_and_similar_title\">Прикажи „следеће“ и „сличне“ видео снимке</string>\n    <string name=\"content_language_title\">Подразумевани језик садржаја</string>\n    <string name=\"settings_category_video_audio_title\">Видео и аудио снимци</string>\n    <string name=\"detail_thumbnail_view_description\">Пусти видео снимак, трајање:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Аватар пошиљаоца</string>\n    <string name=\"detail_dislikes_img_view_description\">Несвиђања</string>\n    <string name=\"detail_likes_img_view_description\">Свиђања</string>\n    <string name=\"use_external_video_player_title\">Користи спољни плејер видео снимака</string>\n    <string name=\"use_external_audio_player_title\">Користи спољни плејер аудио снимака</string>\n    <string name=\"background_player_playing_toast\">Пуштање у позадини</string>\n    <string name=\"theme_title\">Тема</string>\n    <string name=\"dark_theme_title\">Тамна</string>\n    <string name=\"light_theme_title\">Светла</string>\n    <string name=\"settings_category_appearance_title\">Изглед</string>\n    <string name=\"network_error\">Мрежна грешка</string>\n    <string name=\"download_path_audio_title\">Фолдер за преузимање аудио снимака</string>\n    <string name=\"download_path_audio_dialog_title\">Изаберите фолдер за преузимање аудио снимака</string>\n    <string name=\"download_path_audio_summary\">Преузети аудио снимци се чувају овде</string>\n    <string name=\"general_error\">Грешка</string>\n    <string name=\"could_not_load_thumbnails\">Није могуће учитати све сличице</string>\n    <string name=\"parsing_error\">Није могуће рашчланити веб-сајт</string>\n    <string name=\"content_not_available\">Садржај је недоступан</string>\n    <string name=\"content\">Садржај</string>\n    <string name=\"show_age_restricted_content_title\">Прикажи старосно ограничени садржај</string>\n    <string name=\"could_not_setup_download_menu\">Није могуће подесити мени преузимања</string>\n    <string name=\"sorry_string\">Извините, ово није требало да се деси.</string>\n    <string name=\"error_report_button_text\">Пријави путем имејла</string>\n    <string name=\"error_snackbar_message\">Извините, нешто није у реду.</string>\n    <string name=\"error_snackbar_action\">Пријави</string>\n    <string name=\"what_device_headline\">Информације:</string>\n    <string name=\"what_happened_headline\">Шта се десило:</string>\n    <string name=\"your_comment\">Ваш коментар (на енглеском):</string>\n    <string name=\"error_details_headline\">Детаљи:</string>\n    <string name=\"video\">Видео снимак</string>\n    <string name=\"audio\">Аудио снимак</string>\n    <string name=\"retry\">Покушај поново</string>\n    <string name=\"duration_live\">Уживо</string>\n    <string name=\"main_bg_subtitle\">Додирните лупу ради почетка.</string>\n    <string name=\"start\">Почни</string>\n    <string name=\"pause\">Паузирај</string>\n    <string name=\"delete\">Избриши</string>\n    <string name=\"checksum\">Контролна сума</string>\n    <string name=\"ok\">У реду</string>\n    <string name=\"msg_name\">Назив фајла</string>\n    <string name=\"msg_threads\">Нити</string>\n    <string name=\"msg_error\">Грешка</string>\n    <string name=\"msg_running\">NewPipe преузима</string>\n    <string name=\"msg_running_detail\">Додирните за детаље</string>\n    <string name=\"msg_wait\">Сачекајте…</string>\n    <string name=\"msg_copied\">Копирано у привремену меморију</string>\n    <string name=\"no_available_dir\">Одредите фолдер за преузимање касније у подешавањима</string>\n    <string name=\"downloads\">Преузимања</string>\n    <string name=\"downloads_title\">Преузимања</string>\n    <string name=\"error_report_title\">Извештај о грешци</string>\n    <string name=\"app_ui_crash\">Програм је отказао</string>\n    <string name=\"info_labels\">Шта:\\nЗахтев:\\nЈезик садржаја:\\nДржава садржаја:\\nЈезик апликације:\\nУслуга:\\nGMT време:\\nПакет:\\nВерзија:\\nВерзија ОС-а:</string>\n    <string name=\"title_activity_recaptcha\">„reCAPTCHA“ задатак</string>\n    <string name=\"recaptcha_request_toast\">Решите „reCAPTCHA“ задатак</string>\n    <string name=\"black_theme_title\">Црна</string>\n    <string name=\"all\">Све</string>\n    <string name=\"open_in_popup_mode\">Отвори у искачућем облику</string>\n    <string name=\"msg_popup_permission\">Ова дозвола је потребна за\n\\nотварање у искачућем режиму</string>\n    <string name=\"popup_playing_toast\">Пуштање у режиму искачућег прозора</string>\n    <string name=\"disabled\">Онемогућено</string>\n    <string name=\"default_video_format_title\">Подразумевани формат видео снимка</string>\n    <string name=\"default_popup_resolution_title\">Подразумевана резолуција искачућих прозора</string>\n    <string name=\"show_higher_resolutions_title\">Прикажи веће резолуције</string>\n    <string name=\"show_higher_resolutions_summary\">Само неки уређаји могу да пуштају 2K/4K видео снимке</string>\n    <string name=\"clear\">Очисти</string>\n    <string name=\"controls_background_title\">Позадина</string>\n    <string name=\"controls_popup_title\">Искачући прозор</string>\n    <string name=\"use_external_video_player_summary\">Уклања звук на неким резолуцијама</string>\n    <string name=\"popup_remember_size_pos_title\">Упамти својства искачућег прозора</string>\n    <string name=\"popup_remember_size_pos_summary\">Памти последњу величину и позицију искачућег прозора</string>\n    <string name=\"show_search_suggestions_title\">Предлози за претрагу</string>\n    <string name=\"show_search_suggestions_summary\">Изаберите предлоге који ће се приказати приликом претраге</string>\n    <string name=\"subscribed_button_title\">Пратите</string>\n    <string name=\"subscribe_button_title\">Запрати</string>\n    <string name=\"tab_subscriptions\">Праћења</string>\n    <string name=\"fragment_feed_title\">Шта је ново</string>\n    <string name=\"enable_search_history_title\">Историја претраге</string>\n    <string name=\"enable_search_history_summary\">Локално чувајте упите за претрагу</string>\n    <string name=\"enable_watch_history_title\">Историја гледања</string>\n    <string name=\"enable_watch_history_summary\">Чувајте листу одгледаних видео снимака</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Настави са пуштањем</string>\n    <string name=\"best_resolution\">Најбоља резолуција</string>\n    <string name=\"settings_category_downloads_title\">Преузимање</string>\n    <string name=\"title_activity_about\">О NewPipe</string>\n    <string name=\"tab_about\">О нама и ЧПП</string>\n    <string name=\"tab_licenses\">Лиценце</string>\n    <string name=\"app_description\">Слободно и лагано токовање на Android-у.</string>\n    <string name=\"view_on_github\">Погледај на GitHub-у</string>\n    <string name=\"read_full_license\">Прочитај лиценцу</string>\n    <string name=\"contribution_title\">Допринос</string>\n    <string name=\"title_activity_history\">Историја</string>\n    <string name=\"action_history\">Историја</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Наставите са пуштањем након прекида (нпр. телефонски позиви)</string>\n    <string name=\"settings_file_charset_title\">Дозвољени знакови у називима фајлова</string>\n    <string name=\"charset_letters_and_digits\">Слова и бројеви</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s од %2$s под %3$s</string>\n    <string name=\"channel_unsubscribed\">Прекинуто праћење канала</string>\n    <string name=\"subscription_change_failed\">Није могуће променити праћење</string>\n    <string name=\"subscription_update_failed\">Није могуће ажурирати праћење</string>\n    <string name=\"settings_category_player_title\">Плејер</string>\n    <string name=\"settings_category_player_behavior_title\">Понашање</string>\n    <string name=\"settings_category_history_title\">Историја и кеш</string>\n    <string name=\"undo\">Поништи</string>\n    <string name=\"notification_channel_name\">NewPipe обавештење</string>\n    <string name=\"notification_channel_description\">Обавештења за NewPipe плејер</string>\n    <string name=\"search_no_results\">Нема резултата</string>\n    <string name=\"empty_list_subtitle\">Овде нема ничега осим цврчака</string>\n    <string name=\"no_subscribers\">Нема пратилаца</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s пратилац</item>\n        <item quantity=\"few\">%s пратиоца</item>\n        <item quantity=\"other\">%s пратилаца</item>\n    </plurals>\n    <string name=\"no_views\">Нема прегледа</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s преглед</item>\n        <item quantity=\"few\">%s прегледа</item>\n        <item quantity=\"other\">%s прегледа</item>\n    </plurals>\n    <string name=\"no_videos\">Нема видео снимака</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s видео снимак</item>\n        <item quantity=\"few\">%s видео снимка</item>\n        <item quantity=\"other\">%s видео снимака</item>\n    </plurals>\n    <string name=\"settings_file_replacement_character_summary\">Неисправни знакови биће замењени овим вредностима</string>\n    <string name=\"settings_file_replacement_character_title\">Заменски знак</string>\n    <string name=\"charset_most_special_characters\">Већина посебних знакова</string>\n    <string name=\"title_licenses\">Лиценце треће стране</string>\n    <string name=\"app_license_title\">Лиценца NewPipe-а</string>\n    <string name=\"contribution_encouragement\">Без обзира имате ли идеје; превод, промене дизајна, чишћење кода или праве, озбиљне, промене кода—помоћ је увек добродошла. Што се више уради, то је боље!</string>\n    <string name=\"show_hold_to_append_summary\">Прикажите савет када притиснете позадину или искачуће дугме у видео снимку „Детаљи:“</string>\n    <string name=\"play_all\">Пусти све</string>\n    <string name=\"player_stream_failure\">Није могуће пустити овај ток</string>\n    <string name=\"player_unrecoverable_failure\">Дошло је до непоправљиве грешке плејера</string>\n    <string name=\"player_recoverable_failure\">Опорављање од грешке плејера</string>\n    <string name=\"delete_item_search_history\">Желите ли да избришете ову ставку из историје претраге\\?</string>\n    <string name=\"main_page_content\">Садржај главне странице</string>\n    <string name=\"blank_page_summary\">Празна страница</string>\n    <string name=\"kiosk_page_summary\">Киоск страница</string>\n    <string name=\"channel_page_summary\">Страница канала</string>\n    <string name=\"select_a_channel\">Изаберите канал</string>\n    <string name=\"no_channel_subscribed_yet\">Још нема претплата на канале</string>\n    <string name=\"select_a_kiosk\">Изаберите киоск</string>\n    <string name=\"trending\">У тренду</string>\n    <string name=\"top_50\">Топ 50</string>\n    <string name=\"new_and_hot\">Ново и популарно</string>\n    <string name=\"play_queue_remove\">Уклони</string>\n    <string name=\"play_queue_stream_detail\">Детаљи</string>\n    <string name=\"play_queue_audio_settings\">Подешавања аудио снимка</string>\n    <string name=\"no_player_found_toast\">Није пронађен ниједан извођач довода (можете уградити ВЛЦ ради извођења садржаја).</string>\n    <string name=\"controls_download_desc\">Преузимање фајла тока</string>\n    <string name=\"show_info\">Прикажи информације</string>\n    <string name=\"tab_bookmarks\">Обележене плејлисте</string>\n    <string name=\"controls_add_to_playlist_title\">Додај на</string>\n    <string name=\"default_content_country_title\">Подразумевана држава садржаја</string>\n    <string name=\"settings_category_debug_title\">Исправљање грешака</string>\n    <string name=\"always\">Увек</string>\n    <string name=\"just_once\">Само једном</string>\n    <string name=\"unknown_content\">[Непознато]</string>\n    <string name=\"show_hold_to_append_title\">Прикажи савет „Задржати за стављање у редослед”</string>\n    <string name=\"donation_title\">Донација</string>\n    <string name=\"donation_encouragement\">NewPipe је развијен од стране волонтера који проводе своје слободно време доносећи вам најбоље корисничко искуство. Узвратите програмерима како би учинили NewPipe још бољим, док уживају у шољици кафе.</string>\n    <string name=\"give_back\">Узврати</string>\n    <string name=\"website_title\">Веб-сајт</string>\n    <string name=\"website_encouragement\">За више информација и новости посетите NewPipe веб-сајт.</string>\n    <string name=\"hold_to_append\">Задржати за стављање у редослед</string>\n    <string name=\"use_inexact_seek_title\">Користи брзо, непрецизно премотавање</string>\n    <string name=\"use_inexact_seek_summary\">Непрецизно премотавање омогућава плејеру да брже долази до позиције уз смањену прецизност. Премотавање за 5, 15 или 25 секунди са овом опцијом не ради</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Очишћен кеш са сликама</string>\n    <string name=\"metadata_cache_wipe_title\">Уклони кеширане метаподатке</string>\n    <string name=\"metadata_cache_wipe_summary\">Уклања све податке кешираних веб-страница</string>\n    <string name=\"unsubscribe\">Прекини праћење</string>\n    <string name=\"tab_choose\">Изаберите картицу</string>\n    <string name=\"show_comments_title\">Приказ коментара</string>\n    <string name=\"show_comments_summary\">Искључите да бисте сакрили коментаре</string>\n    <string name=\"new_seek_duration_toast\">Због ограничења ExoPlayer-а, премотавање је постављено на %d секунди</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Да, и делимично одгледани видео снимци</string>\n    <string name=\"remove_watched_popup_warning\">Видео снимци који су одгледани пре и после додавања на плејлисту биће уклоњени. \\nЈесте ли сигурни? Ово се не може поништити!</string>\n    <string name=\"remove_watched_popup_title\">Уклонити одгледане видео снимке?</string>\n    <string name=\"remove_watched\">Уклони одгледано</string>\n    <string name=\"systems_language\">Системски подразумевано</string>\n    <string name=\"app_language_title\">Језик апликације</string>\n    <string name=\"choose_instance_prompt\">Изаберите инстанцу</string>\n    <string name=\"downloads_storage_use_saf_summary\">„Storage Access Framework“ омогућава преузимање на спољну, SD (меморијску), картицу</string>\n    <string name=\"downloads_storage_use_saf_title\">Користи системски бирач фолдера (SAF)</string>\n    <string name=\"downloads_storage_ask_summary\">Бићете упитани где желите да сачувате свако преузимање.\n\\nОмогућите системски бирач фолдера (SAF), ако желите да преузмете на спољну, SD (меморијску), картицу</string>\n    <string name=\"downloads_storage_ask_title\">Питај где да се преузме</string>\n    <string name=\"pause_downloads\">Паузирај преузимања</string>\n    <string name=\"start_downloads\">Започни преузимања</string>\n    <string name=\"enable_queue_limit_desc\">Једно преузимање ће бити покренуто у исто време</string>\n    <string name=\"enable_queue_limit\">Ограничи редослед преузимања</string>\n    <string name=\"close\">Затвори</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Корисно при преласку на мобилне податке, иако нека преузимања не могу бити обустављена</string>\n    <string name=\"pause_downloads_on_mobile\">Прекид на мрежама с ограничењем</string>\n    <string name=\"max_retry_desc\">Највећи број покушаја пре отказивања преузимања</string>\n    <string name=\"max_retry_msg\">Највише покушаја</string>\n    <string name=\"stop\">Заустави</string>\n    <string name=\"delete_downloaded_files\">Избриши преузете фајлове</string>\n    <string name=\"confirm_prompt\">Желите ли да очистите историју преузимања или избришете све преузете фајлове\\?</string>\n    <string name=\"clear_download_history\">Очисти историју преузимања</string>\n    <string name=\"error_download_resource_gone\">Није могуће опоравити ово преузимање</string>\n    <string name=\"error_timeout\">Веза је истекла</string>\n    <string name=\"error_progress_lost\">Напредак је изгубљен, јер је фајл избрисан</string>\n    <string name=\"error_insufficient_storage_left\">Недовољно меморије на уређају</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe је затворен док је радио на фајлу</string>\n    <string name=\"error_postprocessing_failed\">Накнадна обрада није успела</string>\n    <string name=\"error_http_not_found\">Није пронађено</string>\n    <string name=\"error_http_unsupported_range\">Сервер не прихвата преузимања са више нити. Покушајте са @string/msg_threads = 1</string>\n    <string name=\"error_http_no_content\">Сервер не шаље податке</string>\n    <string name=\"error_connect_host\">Није могуће повезати се са сервером</string>\n    <string name=\"error_unknown_host\">Није могуће пронаћи сервер</string>\n    <string name=\"error_ssl_exception\">Није могуће успоставити безбедну везу</string>\n    <string name=\"error_path_creation\">Одредишни фолдер се не може направити</string>\n    <string name=\"error_file_creation\">Фајл се не може направити</string>\n    <string name=\"show_error\">Прикажи грешку</string>\n    <string name=\"download_already_pending\">Преузимање са овим називом чека на ред</string>\n    <string name=\"download_already_running\">У току је преузимање са овим називом</string>\n    <string name=\"overwrite_failed\">није могуће преписати фајл</string>\n    <string name=\"overwrite_finished_warning\">Преузет фајл са овим називом већ постоји</string>\n    <string name=\"overwrite_unrelated_warning\">Фајл са овим називом већ постоји</string>\n    <string name=\"overwrite\">Препиши</string>\n    <string name=\"generate_unique_name\">Генериши јединствен назив</string>\n    <string name=\"download_failed\">Преузимање није успело</string>\n    <string name=\"permission_denied\">Систем је одбио радњу</string>\n    <string name=\"enqueue\">Стави у редослед</string>\n    <string name=\"recovering\">опорављање</string>\n    <string name=\"post_processing\">накнадна обрада</string>\n    <string name=\"queued\">у редоследу</string>\n    <string name=\"paused\">паузирано</string>\n    <string name=\"missions_header_pending\">На чекању</string>\n    <string name=\"missions_header_finished\">Завршено</string>\n    <string name=\"app_update_available_notification_title\">Доступно је ажурирање за NewPipe!</string>\n    <string name=\"auto\">Аутоматски</string>\n    <string name=\"grid\">Мрежа</string>\n    <string name=\"list\">Листа</string>\n    <string name=\"list_view_mode\">Режим приказа листе</string>\n    <string name=\"never\">Никад</string>\n    <string name=\"wifi_only\">Само на Wi-Fi-у</string>\n    <string name=\"autoplay_summary\">Покрени репродукцију аутоматски — %s</string>\n    <string name=\"minimize_on_exit_popup_description\">Умањи на искачући плејер</string>\n    <string name=\"minimize_on_exit_background_description\">Умањи на позадински плејер</string>\n    <string name=\"minimize_on_exit_none_description\">Ниједно</string>\n    <string name=\"minimize_on_exit_summary\">Радња при преласку на другу апликацију са главног плејера видео снимака — %s</string>\n    <string name=\"minimize_on_exit_title\">Умањи при мењању апликације</string>\n    <string name=\"updates_setting_description\">Прикажи обавештење када постоји нова верзија апликације</string>\n    <string name=\"updates_setting_title\">Ажурирања</string>\n    <string name=\"limit_mobile_data_usage_title\">Ограничење резолуције када се користе мобилни подаци</string>\n    <string name=\"decline\">Одбиј</string>\n    <string name=\"limit_data_usage_none_description\">Без ограничења</string>\n    <string name=\"accept\">Прихвати</string>\n    <string name=\"start_accept_privacy_policy\">Да бисмо били у складу са Европском општом уредбом о заштити података (GDPR), скрећемо вам пажњу на политику приватности NewPipe-а. Пажљиво је прочитајте.\n\\nМорате је прихватити да бисте нам послали извештај о грешци.</string>\n    <string name=\"playback_reset\">Ресетуј</string>\n    <string name=\"playback_step\">Корак</string>\n    <string name=\"skip_silence_checkbox\">Премотавање унапред током тишине</string>\n    <string name=\"unhook_checkbox\">Откачи (може изазвати изобличења)</string>\n    <string name=\"playback_pitch\">Висина тона</string>\n    <string name=\"playback_tempo\">Брзина</string>\n    <string name=\"playback_speed_control\">Контроле брзине репродукције</string>\n    <string name=\"import_network_expensive_warning\">Имајте на уму да ова операција може потрошити доста података.\n\\n\n\\nЖелите ли да наставите\\?</string>\n    <string name=\"import_soundcloud_instructions_hint\">ВашID, soundcloud.com/yourid</string>\n    <string name=\"import_soundcloud_instructions\">Увезите SoundCloud профил тако што ћете откуцати URL адресу или свој ID:\n\\n\n\\n1. Омогућите „верзију сајта за рачунар“ у веб-прегледачу (сајт није доступан за мобилне уређаје)\n\\n2. Идите на ову URL адресу: %1$s\n\\n3. Пријавите се када се то од вас затражи\n\\n4. Копирајте URL адресу профила на који сте преусмерени.</string>\n    <string name=\"import_youtube_instructions\">Увезите YouTube праћења из Google Takeout-а:\n\\n\n\\n1. Идите на ову URL адресу: %1$s\n\\n2. Пријавите се када се то од вас затражи\n\\n3. Кликните на „Сви подаци укључени“, затим на „Опозови све“, затим изаберите само „праћења“ и кликните на „ У реду“\n\\n4. Кликните на „Следећи корак“, а затим на „Направи извоз“\n\\n5. Кликните на дугме „Преузми“ након што се појави\n\\n6. Кликните на УВЕЗИ ФАЈЛ испод и изаберите преузети .zip фајл\n\\n7. [Ако увоз .zip не успе] Извуците .csv фајл (обично под „YouTube and YouTube Music/subscriptions/subscriptions.csv“), кликните на УВЕЗИ ФАЈЛ испод и изаберите извучени csv фајл</string>\n    <string name=\"subscriptions_export_unsuccessful\">Није могуће извести праћења</string>\n    <string name=\"subscriptions_import_unsuccessful\">Није могуће увести праћења</string>\n    <string name=\"previous_export\">Претходни извоз</string>\n    <string name=\"import_file_title\">Увези фајл</string>\n    <string name=\"import_ongoing\">Увоз…</string>\n    <string name=\"export_ongoing\">Извоз…</string>\n    <string name=\"export_to\">Извоз у</string>\n    <string name=\"import_from\">Увоз из</string>\n    <string name=\"import_title\">Увоз</string>\n    <string name=\"crash_the_app\">Срушите апликацију</string>\n    <string name=\"show_original_time_ago_summary\">Изворни текстови са услуга биће видљиви у ставкама тока</string>\n    <string name=\"show_original_time_ago_title\">Прикажи изворно време ставки</string>\n    <string name=\"enable_disposed_exceptions_summary\">Присилно извештавање о „Rx“ изузецима који се не могу испоручити ван фрагмента или животног циклуса активности након одлагања</string>\n    <string name=\"enable_disposed_exceptions_title\">Пријави грешке ван животног циклуса</string>\n    <string name=\"show_memory_leaks\">Прикажи цурење меморије</string>\n    <string name=\"enable_leak_canary_summary\">Праћење цурења меморије може довести до тога да апликација престане да реагује када се прикупљају извештаји</string>\n    <string name=\"caption_setting_description\">Измените размеру натписа титлова плејера и стилове позадине. Захтева рестартовање апликације да би се применило</string>\n    <string name=\"caption_setting_title\">Титлови</string>\n    <string name=\"caption_auto_generated\">Аутоматски генерисано</string>\n    <string name=\"resize_zoom\">Увеличано</string>\n    <string name=\"resize_fill\">Попуњено</string>\n    <string name=\"resize_fit\">Уклопљено</string>\n    <string name=\"caption_none\">Без титлова</string>\n    <string name=\"playlist_no_uploader\">Аутоматски генерисано (нема отпремача)</string>\n    <string name=\"playlist_thumbnail_change_success\">Сличица плејлисте је промењена.</string>\n    <string name=\"playlist_add_stream_success\">Додато на плејлисту</string>\n    <string name=\"playlist_creation_success\">Плејлиста је направљена</string>\n    <string name=\"delete_playlist_prompt\">Избрисати ову плејлисту\\?</string>\n    <string name=\"bookmark_playlist\">Обележи плејлисту</string>\n    <string name=\"unbookmark_playlist\">Уклони обележивач</string>\n    <string name=\"set_as_playlist_thumbnail\">Постави као сличицу плејлисте</string>\n    <string name=\"unmute\">Укључи звук</string>\n    <string name=\"mute\">Искључи звук</string>\n    <string name=\"add_to_playlist\">Додај на плејлисту</string>\n    <string name=\"name\">Назив</string>\n    <string name=\"rename_playlist\">Преименуј</string>\n    <string name=\"create_playlist\">Нова плејлиста</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Учитавање траженог садржаја</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Прикупљање информација…</string>\n    <string name=\"always_ask_open_action\">Увек питај</string>\n    <string name=\"popup_player\">Искачући плејер</string>\n    <string name=\"background_player\">Позадински плејер</string>\n    <string name=\"video_player\">Плејер видео снимака</string>\n    <string name=\"preferred_open_action_settings_summary\">Подразумевана радња при отварању садржаја — %s</string>\n    <string name=\"preferred_open_action_settings_title\">Преферирана радња при отварању</string>\n    <string name=\"drawer_close\">Затвори фиоку</string>\n    <string name=\"drawer_open\">Отвори фиоку</string>\n    <string name=\"start_here_on_popup\">Почни пуштање у искачућем прозору</string>\n    <string name=\"start_here_on_background\">Почни пуштање у позадини</string>\n    <string name=\"enqueue_stream\">Стави у редослед</string>\n    <string name=\"enqueued\">Стављено у редослед</string>\n    <string name=\"title_activity_play_queue\">Редослед пуштања</string>\n    <string name=\"conferences\">Конференције</string>\n    <string name=\"most_liked\">Највише свиђања</string>\n    <string name=\"recently_added\">Недавно додато</string>\n    <string name=\"local\">Локално</string>\n    <string name=\"error_unable_to_load_comments\">Није могуће учитати коментаре</string>\n    <string name=\"import_settings\">Желите ли да увезете и подешавања\\?</string>\n    <string name=\"override_current_data\">Ово ће заменити ваше тренутно подешавање.</string>\n    <string name=\"could_not_import_all_files\">Упозорење: Није могуће увести све фајлове.</string>\n    <string name=\"no_valid_zip_file\">Нема важећег ZIP фајла</string>\n    <string name=\"import_complete_toast\">Увезено</string>\n    <string name=\"export_complete_toast\">Извезено</string>\n    <string name=\"no_playlist_bookmarked_yet\">Још нема обележивача плејлисте</string>\n    <string name=\"select_a_playlist\">Изаберите плејлисту</string>\n    <string name=\"default_kiosk_page_summary\">Подразумевани киоск</string>\n    <string name=\"main_page_content_summary\">Које картице се приказују на главној страници</string>\n    <string name=\"title_most_played\">Највише пуштано</string>\n    <string name=\"title_last_played\">Последње пуштано</string>\n    <string name=\"app_license\">NewPipe је слободан софтвер за копирање: Можете га користити, проучавати, делити и побољшавати по жељи. Конкретно, можете га поново дистрибуирати и/или модификовати под условима GNU Опште јавне лиценце коју је објавила Фондација за слободни софтвер, било верзију 3 лиценце или (по вашем избору) било коју каснију верзију.</string>\n    <string name=\"read_privacy_policy\">Прочитај политику приватности</string>\n    <string name=\"privacy_policy_encouragement\">Пројекат NewPipe веома озбиљно схвата вашу приватност. Стога, апликација не прикупља никакве податке без вашег пристанка.\n\\nПолитика приватности NewPipe-а детаљно објашњава који се подаци шаљу и чувају када пошаљете извештај о отказивању апликације.</string>\n    <string name=\"privacy_policy_title\">Политика приватности NewPipe-а</string>\n    <string name=\"done\">Готово</string>\n    <string name=\"recaptcha_solve\">Реши</string>\n    <string name=\"subtitle_activity_recaptcha\">Притисните „Готово“ када решите</string>\n    <string name=\"one_item_deleted\">Избрисана је 1 ставка.</string>\n    <string name=\"msg_calculating_hash\">Израчунавање хеша</string>\n    <string name=\"rename\">Преименуј</string>\n    <string name=\"dismiss\">Одбаци</string>\n    <string name=\"create\">Направи</string>\n    <string name=\"no_comments\">Нема коментара</string>\n    <string name=\"infinite_videos\">∞ видео снимака</string>\n    <string name=\"more_than_100_videos\">100+ видео снимака</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s слушалац</item>\n        <item quantity=\"few\">%s слушаоца</item>\n        <item quantity=\"other\">%s слушалаца</item>\n    </plurals>\n    <string name=\"no_one_listening\">Нико не слуша</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s гледалац</item>\n        <item quantity=\"few\">%s гледаоца</item>\n        <item quantity=\"other\">%s гледалаца</item>\n    </plurals>\n    <string name=\"no_one_watching\">Нико не гледа</string>\n    <string name=\"subscribers_count_not_available\">Број пратилаца није доступан</string>\n    <string name=\"drawer_header_description\">Изаберите услугу, тренутно изабрана:</string>\n    <string name=\"detail_drag_description\">Превуците за преуређивање</string>\n    <string name=\"description_tab_description\">Опис</string>\n    <string name=\"comments_tab_description\">Коментари</string>\n    <string name=\"error_report_open_github_notice\">Проверите да ли већ постоји проблем који говори о вашем отказивању апликације. Када правите дупликате карата, одузимате нам време које бисмо могли потрошити на исправљање стварне грешке.</string>\n    <string name=\"error_report_open_issue_button_text\">Пријави на GitHub-у</string>\n    <string name=\"copy_for_github\">Копирајте форматирани извештај</string>\n    <string name=\"permission_display_over_apps\">Дајте дозволу за приказивање преко других апликација</string>\n    <string name=\"restore_defaults\">Врати подразумеване вредности</string>\n    <string name=\"restore_defaults_confirmation\">Желите ли да вратите подразумеване вредности\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Није могуће прочитати сачуване картице, тако да се користе подразумеване</string>\n    <string name=\"no_streams_available_download\">Нема токова доступних за преузимање</string>\n    <string name=\"error_occurred_detail\">Дошло је до грешке: %1$s</string>\n    <string name=\"invalid_file\">Фајл не постоји или нема дозволе за читање или писање</string>\n    <string name=\"file_name_empty_error\">Назив фајла не може бити празан</string>\n    <string name=\"invalid_source\">Нема таквог фајла/извора садржаја</string>\n    <string name=\"invalid_directory\">Нема таквог фолдера</string>\n    <string name=\"missing_file\">Фајл је премештен или избрисан</string>\n    <string name=\"video_streams_empty\">Нису пронађени видео токови</string>\n    <string name=\"audio_streams_empty\">Нису пронађени аудио токови</string>\n    <string name=\"external_player_unsupported_link_type\">Спољни плејери не подржавају ове врсте линкова</string>\n    <string name=\"download_to_sdcard_error_message\">Преузимање на спољну, SD (меморијску), картицу није могуће. Ресетовати локацију фолдера за преузимање\\?</string>\n    <string name=\"download_to_sdcard_error_title\">Спољна меморија није доступна</string>\n    <string name=\"search_history_deleted\">Историја претраге је избрисана</string>\n    <string name=\"delete_search_history_alert\">Избрисати целу историју претраге\\?</string>\n    <string name=\"clear_search_history_summary\">Брише историју кључних речи за претрагу</string>\n    <string name=\"clear_search_history_title\">Очисти историју претраге</string>\n    <string name=\"watch_history_states_deleted\">Позиције репродукције су избрисане</string>\n    <string name=\"delete_playback_states_alert\">Избрисати све позиције репродукције\\?</string>\n    <string name=\"clear_playback_states_summary\">Брише све позиције репродукције</string>\n    <string name=\"clear_playback_states_title\">Избриши позиције репродукције</string>\n    <string name=\"watch_history_deleted\">Историја гледања је избрисана</string>\n    <string name=\"delete_view_history_alert\">Избрисати целу историју гледања\\?</string>\n    <string name=\"clear_views_history_summary\">Брише историју пуштаних токова и позиције репродукције</string>\n    <string name=\"clear_views_history_title\">Очисти историју гледања</string>\n    <string name=\"clear_cookie_summary\">Чисти колачиће које NewPipe чува када решите „reCAPTCHA“</string>\n    <string name=\"export_data_summary\">Извоз историје, праћења, плејлисти и подешавања</string>\n    <string name=\"import_data_summary\">Замениће вашу тренутну историју, праћења, плејлисте и (опционално) подешавања</string>\n    <string name=\"recaptcha_cookies_cleared\">„reCAPTCHA“ колачићи су очишћени</string>\n    <string name=\"clear_cookie_title\">Очисти „reCAPTCHA“ колачиће</string>\n    <string name=\"export_data_title\">Извоз базе података</string>\n    <string name=\"import_data_title\">Увоз базе података</string>\n    <string name=\"switch_to_main\">Пребаци на главно</string>\n    <string name=\"switch_to_popup\">Пребаци на искачући прозор</string>\n    <string name=\"switch_to_background\">Пребаци у позадину</string>\n    <string name=\"hash_channel_description\">Обавештења о напретку хеширања видео снимка</string>\n    <string name=\"hash_channel_name\">Обавештење о хешу видео снимка</string>\n    <string name=\"app_update_notification_channel_description\">Обавештења о новим верзијама NewPipe-а</string>\n    <string name=\"app_update_notification_channel_name\">Обавештење о ажурирању апликације</string>\n    <string name=\"file\">Фајл</string>\n    <string name=\"file_deleted\">Фајл избрисан</string>\n    <string name=\"artists\">Извођачи</string>\n    <string name=\"albums\">Албуми</string>\n    <string name=\"songs\">Песме</string>\n    <string name=\"events\">Догађаји</string>\n    <string name=\"users\">Корисници</string>\n    <string name=\"tracks\">Нумере</string>\n    <string name=\"videos_string\">Видео снимци</string>\n    <string name=\"playlists\">Плејлисте</string>\n    <string name=\"channels\">Канали</string>\n    <string name=\"restricted_video_no_stream\">Овај видео снимак је старосно ограничен.\n\\nЗбог нових YouTube смерница за старосно ограничене видео снимке, NewPipe не може да им приступи, па није у могућности да их пушта.</string>\n    <string name=\"restricted_video\">Овај видео снимак је старосно ограничен.\n\\n\n\\nУкључите „%1$s“ у подешавањима, ако желите да га видите.</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube омогућава „Ограничени режим“ који скрива потенцијални садржај за одрасле</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Укључи YouTube-ов „Ограничени режим“</string>\n    <string name=\"show_age_restricted_content_summary\">Приказивање садржаја који можда није прикладан за децу, јер има старосну границу (попут 18+)</string>\n    <string name=\"settings_category_updates_title\">Ажурирања</string>\n    <string name=\"peertube_instance_add_exists\">Инстанца већ постоји</string>\n    <string name=\"peertube_instance_add_https_only\">Подржане су само HTTPS URL адресе</string>\n    <string name=\"peertube_instance_add_fail\">Није могуће потврдити инстанцу</string>\n    <string name=\"peertube_instance_add_help\">Унесите URL адресу инстанце</string>\n    <string name=\"peertube_instance_add_title\">Додајте инстанцу</string>\n    <string name=\"peertube_instance_url_help\">Пронађите инстанце које вам се свиђају на %s</string>\n    <string name=\"peertube_instance_url_title\">PeerTube инстанце</string>\n    <string name=\"peertube_instance_url_summary\">Изаберите своје омиљене PeerTube инстанце</string>\n    <string name=\"unsupported_url_dialog_message\">URL адреса није препозната. Отворити помоћу друге апликације\\?</string>\n    <string name=\"autoplay_title\">Аутоматско пуштање</string>\n    <string name=\"settings_category_clear_data_title\">Чишћење података</string>\n    <string name=\"enable_playback_state_lists_summary\">Прикажите индикаторе положаја репродукције на листама</string>\n    <string name=\"enable_playback_state_lists_title\">Позиције на листама</string>\n    <string name=\"enable_playback_resume_summary\">Вратите последњу позицију репродукције</string>\n    <string name=\"enable_playback_resume_title\">Настави репродукцију</string>\n    <string name=\"auto_queue_toggle\">Аутоматско стављање у редослед</string>\n    <string name=\"auto_queue_summary\">Наставите да завршавате (непонављајући) редослед репродукције додавањем сродног тока</string>\n    <string name=\"auto_queue_title\">Аутоматски стави у редослед следећи ток</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Кеш метаподатака обрисан</string>\n    <string name=\"show_meta_info_summary\">Искључите да бисте сакрили поља за метаподатке са додатним информацијама о креатору тока, садржају тока или захтеву за претрагу</string>\n    <string name=\"show_meta_info_title\">Прикажи метаподатке</string>\n    <string name=\"show_description_summary\">Искључите да бисте сакрили опис видео снимка и додатне информације</string>\n    <string name=\"show_description_title\">Прикажи опис</string>\n    <string name=\"clear_queue_confirmation_description\">Редослед активног плејера биће замењен</string>\n    <string name=\"clear_queue_confirmation_summary\">Пребацивање на други плејер може променити ваш редослед</string>\n    <string name=\"clear_queue_confirmation_title\">Питај за потврду пре чишћења редоследа</string>\n    <string name=\"seek_duration_title\">Период премотавања напред/назад</string>\n    <string name=\"night_theme_title\">Ноћна тема</string>\n    <string name=\"notification_colorize_summary\">Android ће прилагодити боју обавештења према главној боји на сличици (није доступно на свим уређајима)</string>\n    <string name=\"notification_colorize_title\">Обоји обавештење</string>\n    <string name=\"notification_action_nothing\">Ништа</string>\n    <string name=\"notification_action_buffering\">Учитавање</string>\n    <string name=\"notification_action_shuffle\">Мешање</string>\n    <string name=\"notification_action_repeat\">Понављање</string>\n    <string name=\"notification_actions_at_most_three\">Можете да изаберете највише три радње за приказ у компактном обавештењу!</string>\n    <string name=\"notification_actions_summary\">Измените сваку радњу обавештења додиром на њу. Означите до три радње које ће се приказивати у компактном обавештењу помоћу поља за потврду са десне стране.</string>\n    <string name=\"notification_action_4_title\">Дугме пете радње</string>\n    <string name=\"notification_action_3_title\">Дугме четврте радње</string>\n    <string name=\"notification_action_2_title\">Дугме треће радње</string>\n    <string name=\"notification_action_1_title\">Дугме друге радње</string>\n    <string name=\"notification_action_0_title\">Дугме прве радње</string>\n    <string name=\"notification_scale_to_square_image_summary\">Исеците сличицу видео снимка приказану у обавештењу с размере 16:9 на размеру 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">Исеци сличицу на размеру 1:1</string>\n    <string name=\"search_showing_result_for\">Приказивање резултата за: %s</string>\n    <string name=\"open_with\">Отвори помоћу</string>\n    <string name=\"download_has_started\">Преузимање је започело</string>\n    <string name=\"select_night_theme_toast\">Испод можете изабрати своју омиљену ноћну тему</string>\n    <string name=\"night_theme_summary\">Изаберите своју омиљену ноћну тему — %s</string>\n    <string name=\"auto_device_theme_title\">Аутоматски (тема уређаја)</string>\n    <string name=\"radio\">Радио</string>\n    <string name=\"featured\">Истакнуто</string>\n    <string name=\"paid_content\">Овај садржај је доступан само корисницима који су платили, тако да га NewPipe не може токовати или преузимати.</string>\n    <string name=\"youtube_music_premium_content\">Овај видео снимак је доступан само премијум YouTube Music члановима, тако да га NewPipe не може токовати или преузимати.</string>\n    <string name=\"private_content\">Овај садржај је приватан, тако да га NewPipe не може токовати или преузимати.</string>\n    <string name=\"soundcloud_go_plus_content\">Ово је SoundCloud Go+ нумера, барем у вашој земљи, тако да је NewPipe не може токовати или преузимати.</string>\n    <string name=\"georestricted_content\">Овај садржај није доступан у вашој земљи.</string>\n    <string name=\"no_app_to_open_intent\">Ниједна апликација на вашем уређају не може да отвори ово</string>\n    <string name=\"chapters\">Поглавља</string>\n    <string name=\"recent\">Недавни</string>\n    <string name=\"show_thumbnail_summary\">Користите сличицу и за позадину закључаног екрана и за обавештења</string>\n    <string name=\"show_thumbnail_title\">Прикажи сличицу</string>\n    <string name=\"playlist_page_summary\">Страница плејлисте</string>\n    <string name=\"video_detail_by\">Од %s</string>\n    <string name=\"channel_created_by\">Направио %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Сличица аватара канала</string>\n    <string name=\"content_not_supported\">NewPipe још увек не подржава овај садржај.\n\\n\n\\nНадамо се да ће бити подржан у будућој верзији.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Мислите ли да је учитавање фида превише споро\\? Ако јесте, покушајте да омогућите брзо учитавање (можете га променити у подешавањима или притиском на дугме испод).\n\\n\n\\nNewPipe нуди две стратегије учитавања фида:\n\\n• Прикупљање целог претплатничког канала, што је споро, али потпуно.\n\\n• Коришћење наменске крајње тачке услуге, која је брза, али обично није потпуна.\n\\n\n\\nРазлика између њих је у томе што брзом начину обично недостају неке информације, као што је трајање или врста ставке (не могу да се разликују видео снимци уживо и нормални) и може да врати мање ставки.\n\\n\n\\nYouTube је пример услуге која нуди ову брзу методу са својим RSS фидом.\n\\n\n\\nДакле, избор се своди на оно што ви преферирате: брзину или прецизне информације.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Онемогући брзи режим</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Омогући брзи режим</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Доступан у неким услугама, обично је много бржи, али може да врати ограничену количину ставки и често непотпуне информације (нпр. нема трајања, врсте ставке, нема статуса уживо)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Прикупи из наменског фида, када је доступан</string>\n    <string name=\"feed_update_threshold_option_always_update\">Увек ажурирај</string>\n    <string name=\"feed_update_threshold_summary\">Време након последњег ажурирања пре него што се праћење сматра застарелом — %s</string>\n    <string name=\"feed_update_threshold_title\">Праг освежавања фида</string>\n    <string name=\"settings_category_feed_title\">Фид</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Прикажи само негруписана праћења</string>\n    <string name=\"feed_create_new_group_button_title\">Нова</string>\n    <string name=\"feed_group_dialog_delete_message\">Желите ли да избришете ову групу\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Празан назив групе</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d изабран</item>\n        <item quantity=\"few\">%d изабрана</item>\n        <item quantity=\"other\">%d изабраних</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Нема изабраних праћења</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Изабрана праћења</string>\n    <string name=\"feed_processing_message\">Обрађивање фида…</string>\n    <string name=\"feed_notification_loading\">Учитавање фида…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Није учитано: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Фид последњи пут ажуриран: %s</string>\n    <string name=\"feed_groups_header_title\">Групе канала</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d дан</item>\n        <item quantity=\"few\">%d дана</item>\n        <item quantity=\"other\">%d дана</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d сат</item>\n        <item quantity=\"few\">%d сата</item>\n        <item quantity=\"other\">%d сати</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d минут</item>\n        <item quantity=\"few\">%d минута</item>\n        <item quantity=\"other\">%d минута</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d секунда</item>\n        <item quantity=\"few\">%d секунде</item>\n        <item quantity=\"other\">%d секунди</item>\n    </plurals>\n    <string name=\"show_channel_details\">Прикажи детаље о каналу</string>\n    <string name=\"related_items_tab_description\">Сродне ставке</string>\n    <string name=\"disable_media_tunneling_summary\">Онемогућите тунеловање медија ако искусите црни екран или застајкивање при репродукцији видео снимка.</string>\n    <string name=\"disable_media_tunneling_title\">Онемогући тунеловање медија</string>\n    <string name=\"open_website_license\">Отвори веб-сајт</string>\n    <string name=\"metadata_privacy_internal\">Унутрашње</string>\n    <string name=\"metadata_privacy_private\">Приватно</string>\n    <string name=\"metadata_privacy_unlisted\">По позиву</string>\n    <string name=\"metadata_privacy_public\">Јавно</string>\n    <string name=\"metadata_host\">Домаћин</string>\n    <string name=\"metadata_support\">Подршка</string>\n    <string name=\"metadata_language\">Језик</string>\n    <string name=\"metadata_age_limit\">Старосно ограничење</string>\n    <string name=\"metadata_privacy\">Приватност</string>\n    <string name=\"metadata_licence\">Лиценца</string>\n    <string name=\"metadata_tags\">Ознаке</string>\n    <string name=\"metadata_category\">Категорија</string>\n    <string name=\"description_select_enable\">Омогући бирање текста унутар описа</string>\n    <string name=\"description_select_disable\">Онемогући бирање текста унутар описа</string>\n    <string name=\"description_select_note\">Сада можете изабрати текст унутар описа. Имајте на уму да страница може треперети и да се на линкове можда неће моћи кликнути док сте у режиму избора.</string>\n    <string name=\"account_terminated\">Налог укинут</string>\n    <string name=\"feed_load_error_fast_unknown\">Режим брзог фида не пружа више информација о овоме.</string>\n    <string name=\"feed_load_error_terminated\">Налог аутора је укинут.\n\\nNewPipe убудуће неће моћи да учита овај фид.\n\\nЖелите ли да прекинете праћење овог канала\\?</string>\n    <string name=\"feed_load_error_account_info\">Није могуће учитати фид за „%s“.</string>\n    <string name=\"feed_load_error\">Грешка при учитавању фида</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Од Android-а 10 само „Storage Access Framework“ је подржан</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Бићете упитани где желите да сачувате свако преузимање</string>\n    <string name=\"no_dir_yet\">Фолдер за преузимање није одређен, изаберите подразумевани фолдер</string>\n    <string name=\"off\">Искључи</string>\n    <string name=\"on\">Укључи</string>\n    <string name=\"tablet_mode_title\">Режим таблета</string>\n    <string name=\"enqueue_next_stream\">Стави у редослед следећи</string>\n    <string name=\"enqueued_next\">Стављен у редослед следећи</string>\n    <string name=\"local_search_suggestions\">Локални предлози претраге</string>\n    <string name=\"remote_search_suggestions\">Удаљени предлози претраге</string>\n    <string name=\"mark_as_watched\">Означи као одгледано</string>\n    <string name=\"comments_are_disabled\">Коментари су онемогућени</string>\n    <string name=\"processing_may_take_a_moment\">Обрађивање… Може потрајати пар тренутака</string>\n    <string name=\"start_main_player_fullscreen_summary\">Не покрећите видео снимке у мини-плејеру, већ директно пређите на режим целог екрана, ако је аутоматска ротација закључана. И даље можете приступити мини-плејеру тако што ћете изаћи из целог екрана</string>\n    <string name=\"start_main_player_fullscreen_title\">Покрени главни плејер преко целог екрана</string>\n    <string name=\"crash_the_player\">Срушите плејер</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">%s преузимање је завршено</item>\n        <item quantity=\"few\">%s преузимања су завршена</item>\n        <item quantity=\"other\">%s преузимања је завршено</item>\n    </plurals>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"enable_streams_notifications_title\">Обавештења о новим токовима</string>\n    <string name=\"notifications\">Обавештења</string>\n    <string name=\"faq\">Погледај на веб-сајту</string>\n    <string name=\"faq_description\">Ако имате проблема са коришћењем апликације, обавезно погледајте ове одговоре на честа питања!</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Дупликат је додат %d пут(а)</string>\n    <string name=\"streams_notifications_network_title\">Потребна мрежна веза</string>\n    <string name=\"feed_show_watched\">Потпуно одгледано</string>\n    <string name=\"feed_show_partially_watched\">Делимично одгледано</string>\n    <string name=\"main_page_content_swipe_remove\">Превуците ставке да бисте их уклонили</string>\n    <string name=\"low_quality_smaller\">Низак квалитет (мањи)</string>\n    <string name=\"unset_playlist_thumbnail\">Поништи трајну сличицу</string>\n    <string name=\"any_network\">Било која мрежа</string>\n    <string name=\"manual_update_description\">Ручно проверите постоје ли нове верзије</string>\n    <string name=\"selected_stream_external_player_not_supported\">Спољни плејери не подржавају изабрани ток</string>\n    <string name=\"main_tabs_position_summary\">Померите главни бирач картице на дно</string>\n    <string name=\"main_tabs_position_title\">Положај главних картица</string>\n    <string name=\"error_report_notification_toast\">Дошло је до грешке, погледајте обавештење</string>\n    <string name=\"error_report_notification_title\">NewPipe је наишао на грешку, додирните да бисте пријавили</string>\n    <string name=\"show_error_snackbar\">Прикажи траку са грешком</string>\n    <string name=\"streams_notifications_interval_title\">Учесталост провере</string>\n    <string name=\"card\">Картица</string>\n    <string name=\"remove_duplicates_title\">Уклонити дупликате\\?</string>\n    <string name=\"remove_duplicates_message\">Желите ли да уклоните све дупликате токова на овој плејлисти?</string>\n    <string name=\"feed_show_upcoming\">Предстојеће</string>\n    <string name=\"settings_category_exoplayer_title\">Подешавања ExoPlayer-а</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Увек користи заобилазно решење ExoPlayer-а за подешавање површине излаза видео снимка</string>\n    <string name=\"select_quality_external_players\">Изабери квалитет за спољне плејере</string>\n    <string name=\"no_streams\">Нема токова</string>\n    <string name=\"no_live_streams\">Нема токова уживо</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s нови ток</item>\n        <item quantity=\"few\">%s нова тока</item>\n        <item quantity=\"other\">%s нових токова</item>\n    </plurals>\n    <string name=\"loading_stream_details\">Учитавање детаља тока…</string>\n    <string name=\"show_crash_the_player_title\">Прикажи „Сруши плејер“</string>\n    <string name=\"check_new_streams\">Покрени проверу нових токова</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Тунеловање медија је подразумевано онемогућено на вашем уређају, јер је познато да ваш уређај то не подржава.</string>\n    <string name=\"semitone\">Полутон</string>\n    <string name=\"enable_streams_notifications_summary\">Обавештавање о новим токовима из праћења</string>\n    <string name=\"checking_updates_toast\">Провера ажурирања…</string>\n    <string name=\"delete_downloaded_files_confirm\">Избрисати све преузете фајлове са диска\\?</string>\n    <string name=\"remove_duplicates\">Уклони дупликате</string>\n    <string name=\"detail_pinned_comment_view_description\">Прикачен коментар</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer подразумевано</string>\n    <string name=\"toggle_all\">Изабери све</string>\n    <string name=\"streams_not_yet_supported_removed\">Не приказују се токови које програм за преузимање још увек не подржава</string>\n    <string name=\"audio_track_present_in_video\">Аудио снимак би већ требало да буде присутан у овом току</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Нема доступних аудио токова за спољне плејере</string>\n    <string name=\"no_video_streams_available_for_external_players\">Нема доступних видео токова за спољне плејере</string>\n    <string name=\"unknown_format\">Непознати формат</string>\n    <string name=\"unknown_quality\">Непознати квалитет</string>\n    <string name=\"unknown_audio_track\">Непознато</string>\n    <string name=\"high_quality_larger\">Висок квалитет (већи)</string>\n    <string name=\"progressive_load_interval_title\">Величина интервала учитавања репродукције</string>\n    <string name=\"error_report_channel_name\">Обавештење о извештају о грешци</string>\n    <string name=\"feed_new_items\">Нове ставке фида</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Занемари догађаје хардверског дугмета за медије</string>\n    <string name=\"duplicate_in_playlist\">Плејлисте које су затамњене већ садрже ову ставку.</string>\n    <string name=\"leak_canary_not_available\">LeakCanary није доступан</string>\n    <string name=\"app_update_available_notification_text\">Додирните да бисте преузели %s</string>\n    <string name=\"check_for_updates\">Провера ажурирања</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Преглед сличице траке за претрагу</string>\n    <string name=\"feed_hide_streams_title\">Приказ следећих токова</string>\n    <string name=\"feed_show_hide_streams\">Прикажи/сакриј токове</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Користи резервну функцију декодера ExoPlayer-а</string>\n    <string name=\"audio_track_type_original\">оригинални</string>\n    <string name=\"progressive_load_interval_summary\">Промените величину интервала учитавања на прогресивним садржајима (тренутно %s). Нижа вредност може убрзати њихово почетно учитавање</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Корисно, на пример, ако користите слушалице са поквареним физичким дугмадима</string>\n    <string name=\"left_gesture_control_summary\">Изаберите покрет за леву половину екрана плејера</string>\n    <string name=\"left_gesture_control_title\">Радња покретом улево</string>\n    <string name=\"right_gesture_control_summary\">Изаберите покрет за десну половину екрана плејера</string>\n    <string name=\"settings_category_player_notification_title\">Обавештење плејера</string>\n    <string name=\"streams_notification_channel_description\">Обавештења о новим токовима за праћења</string>\n    <string name=\"settings_category_player_notification_summary\">Конфигуришите обавештење о тренутно репродукованом току</string>\n    <string name=\"prefer_original_audio_summary\">Изаберите оригинални аудио снимак, без обзира на језик</string>\n    <string name=\"prefer_descriptive_audio_summary\">Изаберите аудио снимак са описима за особе са оштећеним видом, ако је доступан</string>\n    <string name=\"prefer_descriptive_audio_title\">Преферирај описни аудио снимак</string>\n    <string name=\"right_gesture_control_title\">Радња покретом удесно</string>\n    <string name=\"brightness\">Осветљеност</string>\n    <string name=\"volume\">Јачина звука</string>\n    <string name=\"none\">Ниједно</string>\n    <string name=\"streams_notification_channel_name\">Нови токови</string>\n    <string name=\"error_report_channel_description\">Обавештења за пријаву грешака</string>\n    <string name=\"import_subscriptions_hint\">Увезите или извезите праћења из менија са 3 тачке</string>\n    <string name=\"audio_track\">Аудио снимак</string>\n    <string name=\"create_error_notification\">Направите обавештење о грешци</string>\n    <string name=\"percent\">Проценат</string>\n    <string name=\"app_update_unavailable_toast\">Користите најновију верзију NewPipe-а</string>\n    <string name=\"dont_show\">Не приказуј</string>\n    <string name=\"no_appropriate_file_manager_message\">Није пронађен одговарајући менаџер фајлова за ову радњу.\n\\nИнсталирајте менаџер фајлова или покушајте да онемогућите „%s“ у подешавањима преузимања</string>\n    <string name=\"faq_title\">Често постављана питања</string>\n    <string name=\"show_crash_the_player_summary\">Приказује опцију рушења, када користите плејер</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Избрисано је %1$s преузимање</item>\n        <item quantity=\"few\">Избрисано је %1$s преузимања</item>\n        <item quantity=\"other\">Избрисано је %1$s преузимања</item>\n    </plurals>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Није пронађен одговарајући менаџер фајлова за ову радњу.\n\\nИнсталирајте менаџер фајлова компатибилан са Storage Access Framework-ом</string>\n    <string name=\"detail_heart_img_view_description\">Срце од стране креатора</string>\n    <string name=\"notifications_disabled\">Обавештења су онемогућена</string>\n    <string name=\"get_notified\">Добијајте обавештења</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Омогућите ову опцију ако имате проблема са иницијализацијом декодера, која се враћа на декодере нижег приоритета, ако иницијализација примарних декодера не успе. Ово може резултирати лошијим перформансама репродукције него када користите примарне декодере</string>\n    <string name=\"night_theme_available\">Ова опција је доступна само ако је %s изабрано за тему</string>\n    <string name=\"audio_track_type_descriptive\">описни</string>\n    <string name=\"audio_track_type_dubbed\">синхронизовани</string>\n    <string name=\"settings_category_exoplayer_summary\">Управљајте неким подешавањима ExoPlayer-а. Ове промене захтевају рестартовање плејера да би се примениле</string>\n    <string name=\"prefer_original_audio_title\">Преферирај оригинални аудио снимак</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Ово заобилазно решење ослобађа и поново инстанцира кодеке видео снимка када дође до промене површине, уместо да се површина директно поставља на кодек. ExoPlayer већ користи ово на неким уређајима са овим проблемом, ово подешавање утиче само на Android 6 и новије верзије.\n\\n\n\\nОмогућавање ове опције може спречити грешке при репродукцији приликом пребацивања тренутног плејера видео снимака или преласка на цео екран</string>\n    <string name=\"play_queue_audio_track\">Аудио снимак: %s</string>\n    <string name=\"fast_mode\">Брзи режим</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"msg_failed_to_copy\">Копирање у привремену меморију није успело</string>\n    <string name=\"sort\">Сортирање</string>\n    <string name=\"you_successfully_subscribed\">Сада пратите овај канал</string>\n    <string name=\"select_audio_track_external_players\">Изабери аудио снимак за спољне плејере</string>\n    <string name=\"metadata_subscribers\">Пратиоци</string>\n    <string name=\"loading_metadata_title\">Учитавање метаподатака…</string>\n    <string name=\"feed_fetch_channel_tabs\">Прикупи картице канала</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Картице за прикупљање приликом ажурирања фида. Ова опција нема ефекта ако се канал ажурира у брзом режиму.</string>\n    <string name=\"channel_tab_videos\">Видео снимци</string>\n    <string name=\"show_channel_tabs_summary\">Које картице се приказују на страницама канала</string>\n    <string name=\"show_channel_tabs\">Картице канала</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"channel_tab_about\">Информације</string>\n    <string name=\"channel_tab_albums\">Албуми</string>\n    <string name=\"channel_tab_playlists\">Плејлисте</string>\n    <string name=\"channel_tab_tracks\">Снимци</string>\n    <string name=\"channel_tab_channels\">Канали</string>\n    <string name=\"channel_tab_livestreams\">Уживо</string>\n    <string name=\"image_quality_title\">Квалитет слике</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"toggle_screen_orientation\">Укључи оријентацију екрана</string>\n    <string name=\"image_quality_low\">Низак квалитет</string>\n    <string name=\"toggle_fullscreen\">Укључи цео екран</string>\n    <string name=\"metadata_avatars\">Аватари</string>\n    <string name=\"next_stream\">Следећи ток</string>\n    <string name=\"metadata_subchannel_avatars\">Аватари потканала</string>\n    <string name=\"open_play_queue\">Отвори редослед пуштања</string>\n    <string name=\"image_quality_none\">Не учитавај слике</string>\n    <string name=\"image_quality_high\">Висок квалитет</string>\n    <string name=\"forward\">Унапред</string>\n    <string name=\"rewind\">Премотавање</string>\n    <string name=\"replay\">Поново пусти</string>\n    <string name=\"image_quality_medium\">Средњи квалитет</string>\n    <string name=\"metadata_uploader_avatars\">Аватари отпремаоца</string>\n    <string name=\"metadata_banners\">Банери</string>\n    <string name=\"image_quality_summary\">Изаберите квалитет слика и да ли ћете уопште учитавати слике да бисте смањили потрошњу података и меморије. Промене бришу кеш слике у меморији и на диску — %s</string>\n    <string name=\"play\">Пусти</string>\n    <string name=\"more_options\">Више опција</string>\n    <string name=\"metadata_thumbnails\">Сличице</string>\n    <string name=\"duration\">Трајање</string>\n    <string name=\"previous_stream\">Претходни ток</string>\n    <string name=\"share_playlist_with_list\">Дели листу URL адреса</string>\n    <string name=\"share_playlist_with_titles\">Дели са насловима</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">Дели плејлисту</string>\n    <string name=\"video_details_list_item\">-%1$s: %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s одговор</item>\n        <item quantity=\"few\">%s одговора</item>\n        <item quantity=\"other\">%s одговора</item>\n    </plurals>\n    <string name=\"show_more\">Прикажи више</string>\n    <string name=\"show_less\">Прикажи мање</string>\n    <string name=\"notification_actions_summary_android13\">Измените сваку радњу обавештења у наставку тако што ћете је додирнути. Прве три радње (пусти/паузирај, претходни и следећи) поставља систем и не могу се прилагодити.</string>\n    <string name=\"error_insufficient_storage\">Нема довољно слободног меморијског простора на уређају</string>\n    <string name=\"settings_category_backup_restore_title\">Прављење резервне копије и враћање</string>\n    <string name=\"reset_settings_title\">Ресетуј подешавања</string>\n    <string name=\"reset_settings_summary\">Ресетујте сва подешавања на подразумеване вредности</string>\n    <string name=\"reset_all_settings\">Ресетовање свих подешавања ће одбацити сва жељена подешавања и поново покренути апликацију.\n\\n\n\\nЖелите ли заиста да наставите?</string>\n    <string name=\"no\">Не</string>\n    <string name=\"yes\">Да</string>\n    <string name=\"auto_update_check_description\">NewPipe може аутоматски да проверава да ли постоје нове верзије с времена на време и да вас обавести када буду доступне.\n\\nЖелите ли да омогућите ово?</string>\n    <string name=\"import_settings_vulnerable_format\">Подешавања у извозу који се увозе користе рањив формат који је застарео од NewPipe верзије 0.27.0. Уверите се да извоз који се увози долази из поузданог извора и радије користите само извозе добијене из NewPipe 0.27.0 или новије верзије, у будућности. Подршка за увоз подешавања у овом рањивом формату ће ускоро бити потпуно уклоњена и тада старе NewPipe верзије више неће моћи да увозе подешавања извоза из нових верзија.</string>\n    <string name=\"audio_track_type_secondary\">секундарни</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Дели као YouTube привремену плејлисту</string>\n    <string name=\"tab_bookmarks_short\">Плејлисте</string>\n    <string name=\"no_feed_group_created_yet\">Још није направљена ниједна група фидова</string>\n    <string name=\"select_a_feed_group\">Изаберите групу фидова</string>\n    <string name=\"feed_group_page_summary\">Страница групе канала</string>\n    <string name=\"channel_tab_likes\">Ликовања</string>\n    <string name=\"search_with_service_name\">Претрага %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Претрага %1$s (%2$s)</string>\n    <string name=\"permission_display_over_apps_message\">Да бисте користили искачући плејер, изаберите %1$s у следећем менију подешавања Android-а и омогућите %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">„Дозволи приказ преко других апликација“</string>\n    <string name=\"short_thousand\">%sк</string>\n    <string name=\"short_million\">%sмлн.</string>\n    <string name=\"short_billion\">%sмлрд.</string>\n    <string name=\"delete_file\">Избриши фајл</string>\n    <string name=\"delete_entry\">Избриши унос</string>\n    <string name=\"account_terminated_service_provides_reason\">Налог је укинут\\n\\n%1$s наводи овај разлог: %2$s</string>\n    <string name=\"migration_info_6_7_title\">Страница SoundCloud Top 50 је уклоњена</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud је укинуо оригиналне топ 50 листе. Одговарајућа картица је уклоњена са ваше главне странице.</string>\n    <string name=\"migration_info_7_8_title\">Уклоњен је комбиновану страницу у тренду на YouTube-у</string>\n    <string name=\"migration_info_7_8_message\">YouTube је укинуо комбиновану страницу у тренду од 21. јула 2025. NewPipe је заменио подразумевану страницу у тренду са страницом уживо у тренду.\\n\\nТакође можете одабрати различите странице у тренду у „Подешавања &gt; Садржај &gt; Садржај главне странице“.</string>\n    <string name=\"trending_gaming\">Игре у тренду</string>\n    <string name=\"trending_podcasts\">Подкасти у тренду</string>\n    <string name=\"trending_movies\">Филмови и серије у тренду</string>\n    <string name=\"trending_music\">Музика у тренду</string>\n    <string name=\"entry_deleted\">Унос избрисан</string>\n    <string name=\"player_http_403\">HTTP грешка 403 примљена са сервера током репродукције, вероватно узрокована истеком URL-а за токовање или забраном IP адресе</string>\n    <string name=\"player_http_invalid_status\">HTTP грешка %1$s примљена са сервера током репродукције</string>\n    <string name=\"youtube_player_http_403\">HTTP грешка 403 примљена са сервера током репродукције, вероватно узрокована забраном IP адресе или проблемима са деобфускацијом URL-а за токовање</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s је одбио да пружи податке, тражећи пријаву како би се потврдило да подносилац захтева није бот.\\n\\nВаша IP адреса је можда привремено забрањена од стране %1$s, можете сачекати неко време или прећи на другу IP адресу (на пример, укључивањем/искључивањем VPN-а или преласком са WiFi-ја на мобилне податке).</string>\n    <string name=\"unsupported_content_in_country\">Овај садржај није доступан за тренутно изабрану земљу садржаја.\\n\\nПромените свој избор у „Подешавања &gt; Садржај &gt; Подразумевана држава садржаја“.</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-sv/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Tryck på förstoringsglaset för att komma igång.</string>\n    <string name=\"upload_date_text\">Publicerad den %1$s</string>\n    <string name=\"no_player_found\">Ingen strömspelare hittades. Vill du installera VLC?</string>\n    <string name=\"install\">Installera</string>\n    <string name=\"cancel\">Avbryt</string>\n    <string name=\"open_in_browser\">Öppna i webbläsare</string>\n    <string name=\"open_in_popup_mode\">Öppna i popup-läge</string>\n    <string name=\"share\">Dela</string>\n    <string name=\"download\">Hämta</string>\n    <string name=\"search\">Sök</string>\n    <string name=\"settings\">Inställningar</string>\n    <string name=\"did_you_mean\">Menade du: %1$s\\?</string>\n    <string name=\"share_dialog_title\">Dela med</string>\n    <string name=\"use_external_video_player_title\">Använd extern videospelare</string>\n    <string name=\"use_external_video_player_summary\">Tar bort ljud vid vissa upplösningar</string>\n    <string name=\"use_external_audio_player_title\">Använd extern ljudspelare</string>\n    <string name=\"controls_background_title\">Bakgrund</string>\n    <string name=\"controls_popup_title\">Popup</string>\n    <string name=\"download_path_title\">Hämtningsmapp för video</string>\n    <string name=\"download_path_summary\">Hämtade videofiler lagras här</string>\n    <string name=\"download_path_dialog_title\">Välj hämtningsmapp för videofiler</string>\n    <string name=\"download_path_audio_title\">Hämtningsmapp för ljud</string>\n    <string name=\"download_path_audio_summary\">Hämtade ljudfiler lagras här</string>\n    <string name=\"download_path_audio_dialog_title\">Välj hämtningsmapp för ljudfiler</string>\n    <string name=\"default_resolution_title\">Standardupplösning</string>\n    <string name=\"default_popup_resolution_title\">Standardupplösning för popup</string>\n    <string name=\"show_higher_resolutions_title\">Visa högre upplösningar</string>\n    <string name=\"show_higher_resolutions_summary\">Endast ett fåtal enheter har stöd för uppspelning av 2K/4K-videor</string>\n    <string name=\"play_with_kodi_title\">Spela upp med Kodi</string>\n    <string name=\"kore_not_found\">Kore-appen hittades inte. Installera den?</string>\n    <string name=\"show_play_with_kodi_title\">Visa alternativet \\\"Spela upp med Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Visa ett alternativ för att spela upp en video med mediacentret Kodi</string>\n    <string name=\"play_audio\">Ljud</string>\n    <string name=\"default_audio_format_title\">Standardformat för ljud</string>\n    <string name=\"default_video_format_title\">Standardformat för video</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"light_theme_title\">Ljust</string>\n    <string name=\"dark_theme_title\">Mörkt</string>\n    <string name=\"black_theme_title\">Svart</string>\n    <string name=\"popup_remember_size_pos_title\">Kom ihåg popupinställningar</string>\n    <string name=\"popup_remember_size_pos_summary\">Kom ihåg popup-rutans senaste storlek och position</string>\n    <string name=\"show_search_suggestions_title\">Sökförslag</string>\n    <string name=\"show_search_suggestions_summary\">Välj förslag att visa i samband med sökning</string>\n    <string name=\"download_dialog_title\">Hämta</string>\n    <string name=\"show_next_and_similar_title\">Visa \\'Nästa\\' och \\'Liknande\\' videor</string>\n    <string name=\"unsupported_url\">Webbadressen stöds inte</string>\n    <string name=\"content_language_title\">Standard innehållsspråk</string>\n    <string name=\"settings_category_video_audio_title\">Video och ljud</string>\n    <string name=\"settings_category_appearance_title\">Utseende</string>\n    <string name=\"background_player_playing_toast\">Spelar upp i bakgrunden</string>\n    <string name=\"popup_playing_toast\">Spelar upp i popup-läge</string>\n    <string name=\"content\">Innehåll</string>\n    <string name=\"show_age_restricted_content_title\">Visa åldersbegränsat innehåll</string>\n    <string name=\"duration_live\">Live</string>\n    <string name=\"downloads\">Hämtningar</string>\n    <string name=\"downloads_title\">Hämtningar</string>\n    <string name=\"error_report_title\">Felrapport</string>\n    <string name=\"all\">Alla</string>\n    <string name=\"disabled\">Inaktiverad</string>\n    <string name=\"clear\">Rensa</string>\n    <string name=\"best_resolution\">Bästa upplösningen</string>\n    <string name=\"general_error\">Fel</string>\n    <string name=\"network_error\">Nätverksfel</string>\n    <string name=\"could_not_load_thumbnails\">Det gick inte att läsa in alla miniatyrbilder</string>\n    <string name=\"parsing_error\">Det gick inte att analysera webbplatsen</string>\n    <string name=\"content_not_available\">Innehållet är inte tillgängligt</string>\n    <string name=\"could_not_setup_download_menu\">Det gick inte att ställa in hämtningsmenyn</string>\n    <string name=\"app_ui_crash\">App/Användargränssnittet kraschade</string>\n    <string name=\"sorry_string\">Oj, det där skulle inte ha hänt.</string>\n    <string name=\"error_snackbar_message\">Tyvärr gick någonting fel.</string>\n    <string name=\"error_snackbar_action\">Rapportera</string>\n    <string name=\"what_device_headline\">Info:</string>\n    <string name=\"what_happened_headline\">Vad som skedde:</string>\n    <string name=\"your_comment\">Din kommentar (på Engelska):</string>\n    <string name=\"error_details_headline\">Detaljer:</string>\n    <string name=\"detail_likes_img_view_description\">Gillar</string>\n    <string name=\"detail_dislikes_img_view_description\">Ogillar</string>\n    <string name=\"subscribe_button_title\">Prenumerera</string>\n    <string name=\"subscribed_button_title\">Prenumererar</string>\n    <string name=\"channel_unsubscribed\">Prenumeration avslutad</string>\n    <string name=\"subscription_change_failed\">Kunde inte ändra prenumeration</string>\n    <string name=\"subscription_update_failed\">Kunde inte uppdatera prenumeration</string>\n    <string name=\"tab_subscriptions\">Prenumerationer</string>\n    <string name=\"fragment_feed_title\">Vad är nytt</string>\n    <string name=\"enable_search_history_title\">Sökhistorik</string>\n    <string name=\"enable_search_history_summary\">Spara sökfrågor lokalt</string>\n    <string name=\"enable_watch_history_title\">Visningshistorik</string>\n    <string name=\"enable_watch_history_summary\">Håll koll på videor som du tittat på</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Återuppta uppspelning</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Fortsätt uppspelning efter avbrott (t.ex. telefonsamtal)</string>\n    <string name=\"show_hold_to_append_title\">Visa \\\"Håll för att köa\\\"-tips</string>\n    <string name=\"show_hold_to_append_summary\">Visa tips när bakgrunds eller popup-knappen trycks på sidan för video \\\"Detaljer:\\\"</string>\n    <string name=\"settings_category_player_title\">Spelare</string>\n    <string name=\"settings_category_player_behavior_title\">Beteende</string>\n    <string name=\"settings_category_history_title\">Historik och cacheminne</string>\n    <string name=\"undo\">Ångra</string>\n    <string name=\"play_all\">Spela alla</string>\n    <string name=\"notification_channel_name\">NewPipe avisering</string>\n    <string name=\"notification_channel_description\">Aviseringar för NewPipes spelare</string>\n    <string name=\"unknown_content\">[Okänd]</string>\n    <string name=\"player_stream_failure\">Misslyckades med att spela denna ström</string>\n    <string name=\"player_unrecoverable_failure\">Allvarligt spelarfel inträffade</string>\n    <string name=\"player_recoverable_failure\">Återhämtar sig från spelarfel</string>\n    <string name=\"error_report_button_text\">Rapportera via e-post</string>\n    <string name=\"info_labels\">Vad:\\nBegäran:\\nInnehållsspråk:\\nInnehållsland:\\nApp-språk:\\nTjänst:\\nGMT-tid:\\nPaket:\\nVersion:\\nOS-version:</string>\n    <string name=\"detail_thumbnail_view_description\">Spela video, längd:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Uppladdarens avatar-miniatyrbild</string>\n    <string name=\"search_no_results\">Inga resultat</string>\n    <string name=\"empty_list_subtitle\">Här va\\' det tomt</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Ljud</string>\n    <string name=\"retry\">Försök igen</string>\n    <string name=\"no_subscribers\">Inga prenumeranter</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s prenumerant</item>\n        <item quantity=\"other\">%s prenumeranter</item>\n    </plurals>\n    <string name=\"no_views\">Inga visningar</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s visning</item>\n        <item quantity=\"other\">%s visningar</item>\n    </plurals>\n    <string name=\"no_videos\">Inga videor</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">%s videor</item>\n    </plurals>\n    <string name=\"start\">Start</string>\n    <string name=\"pause\">Pausa</string>\n    <string name=\"delete\">Ta bort</string>\n    <string name=\"checksum\">Kontrollsumma</string>\n    <string name=\"ok\">Okej</string>\n    <string name=\"msg_name\">Filnamn</string>\n    <string name=\"msg_threads\">Trådar</string>\n    <string name=\"msg_error\">Fel</string>\n    <string name=\"msg_running\">NewPipe-hämtning</string>\n    <string name=\"msg_running_detail\">Tryck för detaljer</string>\n    <string name=\"msg_wait\">Vänta…</string>\n    <string name=\"msg_copied\">Kopierat till urklipp</string>\n    <string name=\"no_available_dir\">Ange en hämtningsmapp senare i inställningarna</string>\n    <string name=\"msg_popup_permission\">Denna tillåtelse behövs för att\n\\nöppna i popup-läge</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA utmaning</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA utmaning begärd</string>\n    <string name=\"settings_category_downloads_title\">Hämtning</string>\n    <string name=\"settings_file_charset_title\">Tillåtna tecken i filnamn</string>\n    <string name=\"settings_file_replacement_character_summary\">Ogiltiga tecken ersätts med detta värde</string>\n    <string name=\"settings_file_replacement_character_title\">Ersättningstecken</string>\n    <string name=\"charset_letters_and_digits\">Bokstäver och siffror</string>\n    <string name=\"charset_most_special_characters\">De flesta specialtecken</string>\n    <string name=\"title_activity_about\">Om NewPipe</string>\n    <string name=\"title_licenses\">Tredjepartslicenser</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s av %2$s under %3$s</string>\n    <string name=\"tab_about\">Om &amp; FAQ</string>\n    <string name=\"tab_licenses\">Licenser</string>\n    <string name=\"app_description\">Öppen och enkel Android-app för mediastreaming.</string>\n    <string name=\"view_on_github\">Visa på GitHub</string>\n    <string name=\"app_license_title\">NewPipes licens</string>\n    <string name=\"contribution_encouragement\">Vad du än har för idéer; översättningar, designändringar, kodstädning eller riktiga stora kodändringar—hjälp är alltid välkommen. Ju mer som görs desto bättre blir det!</string>\n    <string name=\"read_full_license\">Läs hela licensen</string>\n    <string name=\"contribution_title\">Bidra</string>\n    <string name=\"title_activity_history\">Historik</string>\n    <string name=\"action_history\">Historik</string>\n    <string name=\"delete_item_search_history\">Vill du ta bort det här objektet från sökhistoriken?</string>\n    <string name=\"main_page_content\">Huvudsidans innehåll</string>\n    <string name=\"blank_page_summary\">Tom sida</string>\n    <string name=\"kiosk_page_summary\">Kiosksida</string>\n    <string name=\"channel_page_summary\">Kanalsida</string>\n    <string name=\"select_a_channel\">Välj en kanal</string>\n    <string name=\"no_channel_subscribed_yet\">Inga kanal prenumerationer ännu</string>\n    <string name=\"select_a_kiosk\">Välj en kiosk</string>\n    <string name=\"trending\">Trendande</string>\n    <string name=\"top_50\">Topp 50</string>\n    <string name=\"new_and_hot\">Nytt och populärt</string>\n    <string name=\"play_queue_remove\">Ta bort</string>\n    <string name=\"play_queue_stream_detail\">Detaljer</string>\n    <string name=\"play_queue_audio_settings\">Ljudinställningar</string>\n    <string name=\"hold_to_append\">Håll för att köa</string>\n    <string name=\"start_here_on_background\">Börja spela i bakgrunden</string>\n    <string name=\"start_here_on_popup\">Börja spela i en popup</string>\n    <string name=\"donation_title\">Donera</string>\n    <string name=\"donation_encouragement\">NewPipe utvecklas av frivilliga som spenderar sin fritid på att ge dig den bästa användarupplevelsen. Nu är det tid att ge tillbaka för att säkerställa att utvecklarna kan göra NewPipe ännu bättre medan de njuter av en kopp kaffe.</string>\n    <string name=\"give_back\">Ge tillbaka</string>\n    <string name=\"website_title\">Webbplats</string>\n    <string name=\"website_encouragement\">För att få mer information och de senaste nyheterna om NewPipe, besök vår webbplats.</string>\n    <string name=\"show_info\">Visa info</string>\n    <string name=\"tab_bookmarks\">Bokmärkta Spellistor</string>\n    <string name=\"controls_add_to_playlist_title\">Lägg till i</string>\n    <string name=\"use_inexact_seek_title\">Använd snabb icke-exakt sökning</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Cacheminnet för bilder rensat</string>\n    <string name=\"settings_category_debug_title\">Debug</string>\n    <string name=\"always\">Alltid</string>\n    <string name=\"just_once\">Bara en gång</string>\n    <string name=\"file\">Fil</string>\n    <string name=\"metadata_cache_wipe_title\">Rensa metadatan i cacheminnet</string>\n    <string name=\"no_player_found_toast\">Ingen strömspelare hittades (du kan installera VLC för att spela upp).</string>\n    <string name=\"controls_download_desc\">Hämta strömfil</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"metadata_cache_wipe_summary\">Ta bort alla cachade webbsidor</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Metadata cache rensad</string>\n    <string name=\"auto_queue_title\">Köa nästa strömning automatiskt</string>\n    <string name=\"auto_queue_summary\">Fortsätt avsluta (icke-upprepande) uppspelningskö genom att lägga till en relaterad ström</string>\n    <string name=\"default_content_country_title\">Standard innehållsland</string>\n    <string name=\"channels\">Kanaler</string>\n    <string name=\"playlists\">Spellistor</string>\n    <string name=\"tracks\">Spår</string>\n    <string name=\"users\">Användare</string>\n    <string name=\"switch_to_background\">Växla till Bakgrunden</string>\n    <string name=\"switch_to_popup\">Växla till Popup</string>\n    <string name=\"switch_to_main\">Växla till main</string>\n    <string name=\"import_data_title\">Importera databas</string>\n    <string name=\"export_data_title\">Exportera databas</string>\n    <string name=\"import_data_summary\">Skriver över din nuvarande historik, prenumerationer, spellistor och (valbart) inställningar</string>\n    <string name=\"export_data_summary\">Exportera historik, prenumerationer, spellistor och inställningar</string>\n    <string name=\"clear_views_history_title\">Rensa visningshistorik</string>\n    <string name=\"clear_views_history_summary\">Tar bort historiken för spelade videoklipp och uppspelningspositioner</string>\n    <string name=\"delete_view_history_alert\">Ta bort hela visningshistoriken\\?</string>\n    <string name=\"watch_history_deleted\">Visningshistorik borttagen</string>\n    <string name=\"clear_search_history_title\">Rensa sökhistorik</string>\n    <string name=\"clear_search_history_summary\">Tar bort historiken för sökta nyckelord</string>\n    <string name=\"delete_search_history_alert\">Ta bort hela sökhistoriken\\?</string>\n    <string name=\"search_history_deleted\">Sökhistorik borttagen</string>\n    <string name=\"external_player_unsupported_link_type\">Externa spelare stöder inte dessa typer av länkar</string>\n    <string name=\"video_streams_empty\">Inga videoströmningar hittades</string>\n    <string name=\"audio_streams_empty\">Inga ljudspår hittades</string>\n    <string name=\"invalid_directory\">Ingen sådan mapp</string>\n    <string name=\"invalid_source\">Ingen sådan fil/innehållskälla</string>\n    <string name=\"invalid_file\">Filen finns inte eller behörighet att läsa eller skriva till den saknas</string>\n    <string name=\"file_name_empty_error\">Filnamnet får inte vara tomt</string>\n    <string name=\"error_occurred_detail\">Ett fel uppstod: %1$s</string>\n    <string name=\"no_streams_available_download\">Inga strömningar tillgängliga för hämtning</string>\n    <string name=\"detail_drag_description\">Dra för att ändra ordning</string>\n    <string name=\"create\">Skapa</string>\n    <string name=\"dismiss\">Avfärda</string>\n    <string name=\"rename\">Byt namn</string>\n    <string name=\"one_item_deleted\">1 objekt borttaget.</string>\n    <string name=\"privacy_policy_title\">NewPipes sekretesspolicy</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe-projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande.\n\\nNewPipes sekretesspolicy förklarar i detalj vad för data som skickas och lagras när du skickar en kraschrapport.</string>\n    <string name=\"read_privacy_policy\">Läs sekretesspolicy</string>\n    <string name=\"app_license\">NewPipe är copyleft fri programvara: Du kan använda, studera, dela och förbättra den som du vill. Specifikt kan du distribuera och/eller modifiera det under villkoren för GNU General Public License som publicerats av Free Software Foundation, antingen version 3 av licensen, eller (om du så önskar) en senare version.</string>\n    <string name=\"title_last_played\">Senast spelade</string>\n    <string name=\"title_most_played\">Mest spelade</string>\n    <string name=\"export_complete_toast\">Exporterad</string>\n    <string name=\"import_complete_toast\">Importerad</string>\n    <string name=\"no_valid_zip_file\">Ogiltig ZIP-fil</string>\n    <string name=\"could_not_import_all_files\">Varning: det gick inte att importera alla filer.</string>\n    <string name=\"override_current_data\">Det här kommer skriva över dina nuvarande inställningar.</string>\n    <string name=\"import_settings\">Vill du också importera inställningar?</string>\n    <string name=\"drawer_open\">Öppna navigationspanelen</string>\n    <string name=\"drawer_close\">Stäng navigationspanelen</string>\n    <string name=\"preferred_open_action_settings_title\">Föredragen \\\"öppna\\\" åtgärd</string>\n    <string name=\"preferred_open_action_settings_summary\">Standardåtgärden när du öppnar innehåll — %s</string>\n    <string name=\"video_player\">Videospelare</string>\n    <string name=\"background_player\">Bakgrundsspelare</string>\n    <string name=\"popup_player\">Popup-spelare</string>\n    <string name=\"always_ask_open_action\">Fråga alltid</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Hämtar information…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Läser in begärt innehåll</string>\n    <string name=\"create_playlist\">Ny spellista</string>\n    <string name=\"rename_playlist\">Byt namn</string>\n    <string name=\"name\">Namn</string>\n    <string name=\"add_to_playlist\">Lägg till i spellista</string>\n    <string name=\"set_as_playlist_thumbnail\">Använd som spellistans miniatyrbild</string>\n    <string name=\"bookmark_playlist\">Bokmärk spellistan</string>\n    <string name=\"unbookmark_playlist\">Ta bort bokmärke</string>\n    <string name=\"delete_playlist_prompt\">Ta bort spellista\\?</string>\n    <string name=\"playlist_creation_success\">Spellistan skapades</string>\n    <string name=\"playlist_add_stream_success\">Tillagd i spellistan</string>\n    <string name=\"playlist_thumbnail_change_success\">Spellistans miniatyrbild förändrades.</string>\n    <string name=\"caption_none\">Ingen textning</string>\n    <string name=\"resize_fit\">Passa</string>\n    <string name=\"resize_fill\">Fyll</string>\n    <string name=\"resize_zoom\">Zoom</string>\n    <string name=\"caption_auto_generated\">Automatiskt genererad</string>\n    <string name=\"caption_setting_title\">Textning</string>\n    <string name=\"caption_setting_description\">Ändra spelarens textskala och bakgrundsstil. Kräver att appen startas om för att träda i kraft</string>\n    <string name=\"enable_leak_canary_summary\">Minnesläcka övervakning kan orsaka att appen inte svarar under heap dumpning</string>\n    <string name=\"enable_disposed_exceptions_title\">Rapportera out-of-lifecycle fel</string>\n    <string name=\"enable_disposed_exceptions_summary\">Tvinga rapportering av otillåtna Rx-undantag utanför fragment eller aktivitetslivscykel efter uppstädning</string>\n    <string name=\"import_title\">Importera</string>\n    <string name=\"import_from\">Importera från</string>\n    <string name=\"export_to\">Exportera till</string>\n    <string name=\"import_ongoing\">Importera…</string>\n    <string name=\"export_ongoing\">Exporterar…</string>\n    <string name=\"import_file_title\">Importera fil</string>\n    <string name=\"previous_export\">Föregående export</string>\n    <string name=\"subscriptions_import_unsuccessful\">Kunde inte importera prenumerationer</string>\n    <string name=\"subscriptions_export_unsuccessful\">kunde inte exportera prenumerationer</string>\n    <string name=\"import_youtube_instructions\">Importera YouTube-prenumerationer från Google takeout:\n\\n\n\\n1. Gå till följande webbadress: %1$s\n\\n2. Logga in när du blir tillfrågad\n\\n3. Klicka på \\\"All YouTube-data tas med\\\", sen på \\\"Avmarkera alla\\\", välj sen bara \\\"prenumerationer\\\" och klicka på \\\"OK\\\"\n\\n4. Klicka på \\\"Nästa steg\\\" och sen på \\\"Skapa export\\\"\n\\n5. Klicka på \\\"Hämta\\\"-knappen när den kommer fram\n\\n6. Klicka på IMPORTERA FIL nedan och välj den nedladdade zip-filen\n\\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</string>\n    <string name=\"import_soundcloud_instructions\">Importera en SoundCloud-profil genom att skriva in webbadressen eller ditt ID:\n\\n\n\\n1. Aktivera \\\"skrivbordsläge\\\" i en webbläsare (sidan är inte tillgänglig för mobila enheter)\n\\n2. Gå till följande webbadress: %1$s\n\\n3. Logga in när du blir tillfrågad\n\\n4. Kopiera profilens webbadress som du blev omdirigerad till.</string>\n    <string name=\"import_soundcloud_instructions_hint\">dittID, soundcloud.com/dittid</string>\n    <string name=\"import_network_expensive_warning\">Tänk på att denna operation kan vara nätverksintensiv.\n\\n\n\\nVill du fortsätta\\?</string>\n    <string name=\"playback_speed_control\">Kontroller för uppspelningshastighet</string>\n    <string name=\"playback_tempo\">Tempo</string>\n    <string name=\"playback_pitch\">Tonhöjd</string>\n    <string name=\"unhook_checkbox\">Avlänka (kan orsaka förvrängning)</string>\n    <string name=\"skip_silence_checkbox\">Snabbspola vid frånvaro av ljud</string>\n    <string name=\"playback_step\">Steg</string>\n    <string name=\"playback_reset\">Återställ</string>\n    <string name=\"start_accept_privacy_policy\">För att uppfylla den Europeiska dataskyddsförordningen (GDPR), uppmärksammar vi härmed NewPipes sekretesspolicy. Var god och läs den noggrant.\n\\nDu måste acceptera den för att kunna skicka felrapporten.</string>\n    <string name=\"accept\">Acceptera</string>\n    <string name=\"decline\">Avböj</string>\n    <string name=\"limit_data_usage_none_description\">Ingen gräns</string>\n    <string name=\"limit_mobile_data_usage_title\">Begränsa upplösningen när du använder mobil data</string>\n    <string name=\"minimize_on_exit_title\">Minimera vid växling av applikationen</string>\n    <string name=\"minimize_on_exit_summary\">Åtgärd när du växlar till andra applikationer från huvudvideospelare — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Ingen</string>\n    <string name=\"minimize_on_exit_background_description\">Minimera till bakgrundsspelare</string>\n    <string name=\"minimize_on_exit_popup_description\">Minimera till popup-spelare</string>\n    <string name=\"unsubscribe\">Sluta prenumerera</string>\n    <string name=\"tab_choose\">Välj flik</string>\n    <string name=\"settings_category_updates_title\">Uppdateringar</string>\n    <string name=\"file_deleted\">Fil raderad</string>\n    <string name=\"app_update_notification_channel_name\">Avisering för appuppdatering</string>\n    <string name=\"app_update_notification_channel_description\">Aviseringar för nya NewPipe versioner</string>\n    <string name=\"download_to_sdcard_error_title\">Extern lagring otillgänglig</string>\n    <string name=\"saved_tabs_invalid_json\">Fel vid läsning av sparade flikar, använder standardflikar</string>\n    <string name=\"restore_defaults\">Återställ standardvärden</string>\n    <string name=\"restore_defaults_confirmation\">Vill du återställa till standard\\?</string>\n    <string name=\"subscribers_count_not_available\">Antalet prenumeranter är otillgängligt</string>\n    <string name=\"main_page_content_summary\">Vilka flikar visas på huvudsidan</string>\n    <string name=\"updates_setting_title\">Uppdateringar</string>\n    <string name=\"updates_setting_description\">Visa avisering för att uppdatera appen när en ny version finns tillgänglig</string>\n    <string name=\"list_view_mode\">Listvy</string>\n    <string name=\"list\">Lista</string>\n    <string name=\"grid\">Rutnät</string>\n    <string name=\"auto\">Automatisk</string>\n    <string name=\"app_update_available_notification_title\">En NewPipe-uppdatering är tillgänglig!</string>\n    <string name=\"missions_header_finished\">Färdig</string>\n    <string name=\"paused\">pausad</string>\n    <string name=\"queued\">köad</string>\n    <string name=\"post_processing\">efterbehandling</string>\n    <string name=\"enqueue\">Köa</string>\n    <string name=\"permission_denied\">Åtgärden nekas av systemet</string>\n    <string name=\"download_failed\">Hämtningen misslyckades</string>\n    <string name=\"generate_unique_name\">Generera unikt namn</string>\n    <string name=\"overwrite\">Skriv över</string>\n    <string name=\"download_already_running\">Det finns en pågående hämtning med det namnet</string>\n    <string name=\"show_error\">Visa fel</string>\n    <string name=\"error_ssl_exception\">Kunde inte fastställa en säker anslutning</string>\n    <string name=\"error_unknown_host\">Kunde inte hitta servern</string>\n    <string name=\"error_connect_host\">Kunde inte ansluta till servern</string>\n    <string name=\"error_http_no_content\">Servern skickar ingen data</string>\n    <string name=\"error_http_unsupported_range\">Servern accepterar inte flertrådade hämtningar, försök igen med @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Hittades inte</string>\n    <string name=\"error_postprocessing_failed\">Efterbehandling misslyckades</string>\n    <string name=\"stop\">Stanna</string>\n    <string name=\"max_retry_msg\">Max försök</string>\n    <string name=\"max_retry_desc\">Maximalt antal försök innan hämtningen avbryts</string>\n    <string name=\"events\">Händelser</string>\n    <string name=\"conferences\">Konferenser</string>\n    <string name=\"show_comments_title\">Visa kommentarer</string>\n    <string name=\"show_comments_summary\">Inaktivera för att dölja kommentarer</string>\n    <string name=\"enable_playback_resume_title\">Återuppta uppspelning</string>\n    <string name=\"enable_playback_resume_summary\">Återställ den senaste uppspelningspositionen</string>\n    <string name=\"enable_playback_state_lists_title\">Positioner i listor</string>\n    <string name=\"autoplay_title\">Spela automatiskt</string>\n    <string name=\"settings_category_clear_data_title\">Rensa data</string>\n    <string name=\"seek_duration_title\">Spola framåt/bakåt sökvaraktighet</string>\n    <string name=\"enable_playback_state_lists_summary\">Visa indikatorer för uppspelningsposition i listor</string>\n    <string name=\"clear_playback_states_title\">Ta bort uppspelningspositioner</string>\n    <string name=\"peertube_instance_url_title\">PeerTube-instanser</string>\n    <string name=\"peertube_instance_url_summary\">Välj dina favoritpeertube-instanser</string>\n    <string name=\"peertube_instance_url_help\">Hitta de instanser du gillar på %s</string>\n    <string name=\"peertube_instance_add_title\">Lägg till instans</string>\n    <string name=\"peertube_instance_add_help\">Ange instansens URL</string>\n    <string name=\"peertube_instance_add_fail\">Det gick inte att validera instansen</string>\n    <string name=\"peertube_instance_add_https_only\">Endast HTTPS-URL:er stöds</string>\n    <string name=\"peertube_instance_add_exists\">Instansen finns redan</string>\n    <string name=\"videos_string\">Videor</string>\n    <string name=\"delete_playback_states_alert\">Ta bort alla uppspelningspositioner\\?</string>\n    <string name=\"clear_playback_states_summary\">Tar bort alla uppspelningspositioner</string>\n    <string name=\"missing_file\">Filen har flyttats eller tagits bort</string>\n    <string name=\"download_to_sdcard_error_message\">Hämtning till externt SD-kort är inte möjligt. Återställ hämtningsmappens plats\\?</string>\n    <string name=\"watch_history_states_deleted\">Uppspelningspositionerna har tagits bort</string>\n    <string name=\"artists\">Artister</string>\n    <string name=\"albums\">Album</string>\n    <string name=\"songs\">Låtar</string>\n    <string name=\"restricted_video\">Denna video är åldersbegränsad.\n\\n\n\\nOm du vill visa den aktiverar du \\\"%1$s\\\" i inställningarna.</string>\n    <string name=\"no_comments\">Inga kommentarer</string>\n    <string name=\"subtitle_activity_recaptcha\">Tryck på \\\"Klar\\\" när det är löst</string>\n    <string name=\"infinite_videos\">∞ videor</string>\n    <string name=\"more_than_100_videos\">100+ videor</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s lyssnare</item>\n        <item quantity=\"other\">%s lyssnare</item>\n    </plurals>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s tittar</item>\n        <item quantity=\"other\">%s tittar</item>\n    </plurals>\n    <string name=\"no_one_watching\">Ingen tittar</string>\n    <string name=\"drawer_header_description\">Växla tjänst, för närvarande vald:</string>\n    <string name=\"permission_display_over_apps\">Ge behörighet att visa över andra appar</string>\n    <string name=\"no_one_listening\">Ingen lyssnar</string>\n    <string name=\"default_kiosk_page_summary\">Standardkiosk</string>\n    <string name=\"error_path_creation\">Destinationsmappen kan inte skapas</string>\n    <string name=\"error_file_creation\">Det går inte att skapa filen</string>\n    <string name=\"download_already_pending\">Det finns en pågående hämtning med det här namnet</string>\n    <string name=\"overwrite_failed\">kan inte skriva över filen</string>\n    <string name=\"overwrite_finished_warning\">Det finns redan en hämtad fil med det här namnet</string>\n    <string name=\"overwrite_unrelated_warning\">En fil med det namnet finns redan</string>\n    <string name=\"recovering\">återhämtar</string>\n    <string name=\"missions_header_pending\">Väntande</string>\n    <string name=\"show_original_time_ago_summary\">Originaltexter från tjänster kommer att synas i streamobjekt</string>\n    <string name=\"show_original_time_ago_title\">Visa ursprungstid på objekt</string>\n    <string name=\"playlist_no_uploader\">Automatiskt genererad (ingen uppladdare hittades)</string>\n    <string name=\"unmute\">Slå på ljudet</string>\n    <string name=\"mute\">Tysta</string>\n    <string name=\"most_liked\">Mest gillade</string>\n    <string name=\"recently_added\">Nyligen tillagd</string>\n    <string name=\"local\">Lokala</string>\n    <string name=\"done\">Klar</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Slå på YouTubes \\\"Begränsat läge\\\"</string>\n    <string name=\"error_unable_to_load_comments\">Det gick inte att läsa in kommentarerna</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Inaktivera snabbläge</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Aktivera snabbläge</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Det är tillgängligt i vissa tjänster och är vanligtvis mycket snabbare, men kan returnera en begränsad mängd objekt och ofta ofullständig information (t.ex. ingen speltid, objekttyp, ingen live-status)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Hämta från dedikerat flöde när det finns tillgängligt</string>\n    <string name=\"feed_update_threshold_option_always_update\">Uppdatera alltid</string>\n    <string name=\"feed_update_threshold_summary\">Tid efter senaste uppdatering innan en prenumeration anses vara föråldrad — %s</string>\n    <string name=\"feed_update_threshold_title\">Tröskel för uppdatering av flöde</string>\n    <string name=\"settings_category_feed_title\">Flöde</string>\n    <string name=\"feed_create_new_group_button_title\">Ny</string>\n    <string name=\"feed_group_dialog_delete_message\">Vill du ta bort den här gruppen\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Tomt gruppnamn</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d vald</item>\n        <item quantity=\"other\">%d valda</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Ingen prenumeration vald</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Välj prenumerationer</string>\n    <string name=\"feed_processing_message\">Bearbetar flöde…</string>\n    <string name=\"feed_notification_loading\">Läser in flöde…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Inte inläst: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Flödet senast uppdaterat: %s</string>\n    <string name=\"feed_groups_header_title\">Kanalgrupper</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d dag</item>\n        <item quantity=\"other\">%d dagar</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d timme</item>\n        <item quantity=\"other\">%d timmar</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d minut</item>\n        <item quantity=\"other\">%d minuter</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d sekund</item>\n        <item quantity=\"other\">%d sekunder</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">På grund av ExoPlayer-begränsningar sattes söktiden till %d sekunder</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Ja, och delvis tittade videor</string>\n    <string name=\"remove_watched_popup_warning\">Strömningar som har spelats före och efter att de har lagts till i spellistan kommer att tas bort. \\nÄr du säker?</string>\n    <string name=\"remove_watched_popup_title\">Ta bort tittade strömningar?</string>\n    <string name=\"remove_watched\">Ta bort tittade</string>\n    <string name=\"systems_language\">Systemstandard</string>\n    <string name=\"app_language_title\">Appspråk</string>\n    <string name=\"choose_instance_prompt\">Välj en instans</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\\"Storage Access Framework\\\" möjliggör hämtningar till ett externt SD-kort</string>\n    <string name=\"downloads_storage_use_saf_title\">Använd systemmappväljaren (SAF)</string>\n    <string name=\"downloads_storage_ask_summary\">Du kommer att bli tillfrågad var du vill spara varje hämtning.\n\\nAktivera systemmappväljaren (SAF) om du vill hämta till ett externt SD-kort</string>\n    <string name=\"downloads_storage_ask_title\">Fråga var filen ska sparas</string>\n    <string name=\"pause_downloads\">Pausa hämtningar</string>\n    <string name=\"start_downloads\">Starta hämtningar</string>\n    <string name=\"enable_queue_limit_desc\">En hämtning körs samtidigt</string>\n    <string name=\"enable_queue_limit\">Begränsa hämtningskön</string>\n    <string name=\"close\">Stäng ner</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Användbart vid byte till mobildata, även om vissa hämtningar inte kan avbrytas</string>\n    <string name=\"pause_downloads_on_mobile\">Avbryt på uppmätta nätverk</string>\n    <string name=\"delete_downloaded_files\">Ta bort hämtade filer</string>\n    <string name=\"confirm_prompt\">Vill du rensa din hämtningshistorik eller ta bort alla hämtade filer\\?</string>\n    <string name=\"clear_download_history\">Rensa hämtningshistorik</string>\n    <string name=\"error_download_resource_gone\">Kan inte återställa den här hämtningen</string>\n    <string name=\"error_timeout\">Anslutnings avbrott</string>\n    <string name=\"error_progress_lost\">Framsteg förlorat, för att filen blev borttagen</string>\n    <string name=\"error_insufficient_storage_left\">Inget utrymme kvar på enhet</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe stängdes under arbete med en fil</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_report_open_issue_button_text\">Rapportera på GitHub</string>\n    <string name=\"copy_for_github\">Kopiera formaterad felrapport</string>\n    <string name=\"search_showing_result_for\">Visar resultat för: %s</string>\n    <string name=\"select_a_playlist\">Välj en spellista</string>\n    <string name=\"video_detail_by\">Av %s</string>\n    <string name=\"channel_created_by\">Skapad av %s</string>\n    <string name=\"no_playlist_bookmarked_yet\">Ingen spellista har bokmärkts än</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Visa endast prenumerationer som inte grupperats</string>\n    <string name=\"notification_scale_to_square_image_title\">Beskär miniatyrbild till 1: 1 bildförhållande</string>\n    <string name=\"wifi_only\">Endast över Wi-Fi</string>\n    <string name=\"notification_scale_to_square_image_summary\">Beskär videominiatyrbilden som visas i aviseringen från 16:9 till 1:1 bildförhållande</string>\n    <string name=\"autoplay_summary\">Starta uppspelning automatiskt — %s</string>\n    <string name=\"title_activity_play_queue\">Uppspelningskö</string>\n    <string name=\"unsupported_url_dialog_message\">Kunde inte känna igen URL:en. Vill du öppna med annan app\\?</string>\n    <string name=\"auto_queue_toggle\">Köa automatiskt</string>\n    <string name=\"clear_queue_confirmation_description\">Den aktiva spellistan kommer att ersättas</string>\n    <string name=\"clear_queue_confirmation_summary\">Att byta från en spelare till en annan kan ersätta din kö</string>\n    <string name=\"clear_queue_confirmation_title\">Fråga om bekräftelse innan en kö töms</string>\n    <string name=\"notification_action_buffering\">Buffring</string>\n    <string name=\"notification_action_repeat\">Upprepa</string>\n    <string name=\"notification_action_4_title\">Femte åtgärdsknappen</string>\n    <string name=\"notification_action_3_title\">Fjärde åtgärdsknappen</string>\n    <string name=\"notification_action_2_title\">Tredje åtgärdsknappen</string>\n    <string name=\"notification_action_1_title\">Andra åtgärdsknappen</string>\n    <string name=\"notification_action_0_title\">Första åtgärdsknappen</string>\n    <string name=\"content_not_supported\">Detta innehåll stöds ännu inte av NewPipe.\n\\n\n\\nDetta kommer förhoppningsvis ändras i en kommande version.</string>\n    <string name=\"playlist_page_summary\">Spellistesida</string>\n    <string name=\"never\">Aldrig</string>\n    <string name=\"notification_action_nothing\">Ingenting</string>\n    <string name=\"clear_cookie_summary\">Rensar kakor som NewPipe lagrar när du löser en reCAPTCHA</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA-kakor har tagits bort</string>\n    <string name=\"clear_cookie_title\">Rensa reCAPTCHA-kakor</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube erbjuder ett \\\"Begränsat läge\\\" som döljer material som potentiellt är olämpligt för barn</string>\n    <string name=\"auto_device_theme_title\">Automatiskt (enhetens tema)</string>\n    <string name=\"notification_action_shuffle\">Blanda</string>\n    <string name=\"enqueued\">Köad</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Från och med Android 10 stöds bara \\\"Storage Access Framework\\\"</string>\n    <string name=\"soundcloud_go_plus_content\">Det här är ett SoundCloud Go+-spår, åtminstone i ditt land, så det kan inte strömmas eller hämtas via NewPipe.</string>\n    <string name=\"metadata_host\">Värd</string>\n    <string name=\"open_website_license\">Öppna webbplats</string>\n    <string name=\"tablet_mode_title\">Surfplatteläge</string>\n    <string name=\"enqueue_stream\">Köa</string>\n    <string name=\"related_items_tab_description\">Relaterade objekt</string>\n    <string name=\"hash_channel_name\">Avisering för videohashning</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Tycker du att inläsningen av flödet är för långsamt\\? Testa i så fall att aktivera snabbinläsning (du kan ändra det i inställningarna eller genom att trycka på knappen nedan).\n\\n\n\\nNewPipe erbjuder två strategier för att ladda flödet:\n\\n• Att hämta hela den prenumererade kanalen, vilket är långsamt, men komplett.\n\\n• Att använda en \\\"dedicated service endpoint\\\", vilket är snabbt, men vanligtvis inte komplett.\n\\n\n\\nSkillnaden mellan de två är att den snabba varianten ofta saknar viss information, som objektets speltid eller typ (kan inte skilja på livevideor och vanliga videor) och den kan returnera färre objekt.\n\\n\n\\nYouTube är ett exempel på en tjänst som erbjuder denna snabba metod genom sitt RSS-flöde.\n\\n\n\\nSå valet handlar i grunden om vad du föredrar: hastighet eller precis information.</string>\n    <string name=\"show_meta_info_summary\">Inaktivera för att dölja rutor med metainformation som ytterligare information om strömmens skapare, strömmens innehåll eller sökord</string>\n    <string name=\"show_description_summary\">Inaktivera för att dölja videobeskrivning och ytterligare information</string>\n    <string name=\"show_meta_info_title\">Visa meta-information</string>\n    <string name=\"show_thumbnail_summary\">Använd miniatyrbild som bakgrund till både låsskärm och aviseringar</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_colorize_summary\">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)</string>\n    <string name=\"notification_colorize_title\">Färglägg avisering</string>\n    <string name=\"notification_actions_at_most_three\">Du kan som mest välja tre åtgärder att visa i den kompakta aviseringen!</string>\n    <string name=\"recaptcha_solve\">Lös</string>\n    <string name=\"metadata_support\">Support</string>\n    <string name=\"metadata_privacy\">Tillgänglighet</string>\n    <string name=\"off\">Av</string>\n    <string name=\"on\">På</string>\n    <string name=\"metadata_privacy_internal\">Intern</string>\n    <string name=\"metadata_privacy_private\">Privat</string>\n    <string name=\"metadata_privacy_public\">Offentlig</string>\n    <string name=\"metadata_language\">Språk</string>\n    <string name=\"metadata_age_limit\">Åldersgräns</string>\n    <string name=\"metadata_licence\">Licens</string>\n    <string name=\"metadata_tags\">Taggar</string>\n    <string name=\"metadata_category\">Kategori</string>\n    <string name=\"description_select_disable\">Omöjliggör markering av text i beskrivningen</string>\n    <string name=\"description_select_enable\">Möjliggör markering av text i beskrivningen</string>\n    <string name=\"description_select_note\">Du kan nu markera text i beskrivningen. Notera att sidan kan flimra och att länkar kan vara oklickbara när du är i markeringsläge.</string>\n    <string name=\"download_has_started\">Hämtningen har startat</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"paid_content\">Detta innehåll är endast tillgängligt för användare som har betalat för det, så det kan inte strömmas eller hämtas av NewPipe.</string>\n    <string name=\"account_terminated\">Kontot avslutat</string>\n    <string name=\"youtube_music_premium_content\">Denna video är endast tillgänglig för YouTube Music Premium-medlemmar, så den kan inte strömmas eller hämtas av NewPipe.</string>\n    <string name=\"private_content\">Detta innehåll är privat, så det kan inte strömmas eller hämtas av NewPipe.</string>\n    <string name=\"georestricted_content\">Detta innehåll är inte tillgängligt i ditt land.</string>\n    <string name=\"no_app_to_open_intent\">Ingen app på din enhet kan öppna detta</string>\n    <string name=\"chapters\">Kapitel</string>\n    <string name=\"feed_load_error_account_info\">Det gick inte att läsa in flödet för \\\"%s\\\".</string>\n    <string name=\"feed_load_error_terminated\">Innehållsskaparens konto har avslutats.\n\\nNewPipe kommer framöver inte kunna läsa in detta flöde.\n\\nVill du avsluta din prenumeration på denna kanal\\?</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Du kommer att tillfrågas var varje hämtning ska sparas</string>\n    <string name=\"show_channel_details\">Visa kanaldetaljer</string>\n    <string name=\"no_dir_yet\">Ingen hämtningsmapp har ställts in ännu, välj standardmapp för hämtning nu</string>\n    <string name=\"msg_calculating_hash\">Beräknar hash</string>\n    <string name=\"dont_show\">Visa inte</string>\n    <string name=\"low_quality_smaller\">Låg kvalitet (mindre)</string>\n    <string name=\"high_quality_larger\">Hög kvalitet (större)</string>\n    <string name=\"crash_the_app\">Krascha appen</string>\n    <string name=\"show_memory_leaks\">Visa minnesläckor</string>\n    <string name=\"comments_are_disabled\">Kommentarer är inaktiverade</string>\n    <string name=\"description_tab_description\">Beskrivning</string>\n    <string name=\"comments_tab_description\">Kommentarer</string>\n    <string name=\"restricted_video_no_stream\">Denna video här en åldersgräns.\n\\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.</string>\n    <string name=\"show_age_restricted_content_summary\">Visa innehåll som pga sin åldersgräns (ex 18+) kan vara olämpligt för barn</string>\n    <string name=\"show_description_title\">Visa beskrivning</string>\n    <string name=\"open_with\">Öppna med</string>\n    <string name=\"show_thumbnail_title\">Visa miniatyrer</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanalens visningsminiatyr</string>\n    <string name=\"feed_load_error_fast_unknown\">Det snabba flödesläget ger inte mer information om detta.</string>\n    <string name=\"feed_load_error\">Fel vid inläsning av flödet</string>\n    <string name=\"mark_as_watched\">Markera som sedd</string>\n    <string name=\"metadata_privacy_unlisted\">Ej listad</string>\n    <string name=\"featured\">Aktuellt</string>\n    <string name=\"night_theme_title\">Natt-tema</string>\n    <string name=\"hash_channel_description\">Aviseringar för videohashningsframsteg</string>\n    <string name=\"disable_media_tunneling_summary\">Inaktivera medietunnel om du upplever en svart skärm eller att videouppspelningen hackar.</string>\n    <string name=\"disable_media_tunneling_title\">Inaktivera medietunnel</string>\n    <string name=\"detail_heart_img_view_description\">Hjärtmärkt av innehållsskaparen</string>\n    <string name=\"select_night_theme_toast\">Du kan välja det natt-tema du föredrar nedan</string>\n    <string name=\"night_theme_summary\">Välj det natt-tema du föredrar — %s</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Sökradens förhandsvisningsminiatyr</string>\n    <string name=\"local_search_suggestions\">Lokala sökningsförslag</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Tog bort %1$s nedladdning</item>\n        <item quantity=\"other\">Tog bort %1$s nedladdningar</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">Nedladdning slutförd</item>\n        <item quantity=\"other\">%s nedladdningar slutförda</item>\n    </plurals>\n    <string name=\"enqueue_next_stream\">Köa nästa</string>\n    <string name=\"enqueued_next\">Köade nästa</string>\n    <string name=\"start_main_player_fullscreen_title\">Starta huvudspelaren i helskärmsläge</string>\n    <string name=\"processing_may_take_a_moment\">Bearbetar… Kan ta en stund</string>\n    <string name=\"recent\">Senaste</string>\n    <string name=\"main_page_content_swipe_remove\">Svep objekt för att ta bort dem</string>\n    <string name=\"remote_search_suggestions\">Förslag via fjärrsökning</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"check_for_updates\">Sök efter uppdateringar</string>\n    <string name=\"manual_update_description\">Kolla manuellt efter nya versioner</string>\n    <string name=\"checking_updates_toast\">Söker efter uppdateringar…</string>\n    <string name=\"feed_new_items\">Nya flödes objekt</string>\n    <string name=\"show_crash_the_player_title\">Visa \\\"Krascha spelaren\\\"</string>\n    <string name=\"crash_the_player\">Krascha spelaren</string>\n    <string name=\"show_crash_the_player_summary\">Visar ett kraschalternativ vid användning av spelaren</string>\n    <string name=\"error_report_channel_name\">Felrapport-avisering</string>\n    <string name=\"error_report_channel_description\">Aviseringar om att rapportera fel</string>\n    <string name=\"error_report_notification_title\">NewPipe stötte på ett fel, tryck för att rapportera</string>\n    <string name=\"error_report_notification_toast\">Ett fel uppstod, se aviseringen</string>\n    <string name=\"show_error_snackbar\">Visa en fel snackbar</string>\n    <string name=\"create_error_notification\">Skapa en felavisering</string>\n    <string name=\"no_appropriate_file_manager_message\">Ingen lämplig filhanterare hittades för denna åtgärd.\n\\nInstallera en filhanterare eller testa att inaktivera \\'%s\\' i nedladdningsinställningarna</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Ingen lämplig filhanterare hittades för denna åtgärd.\n\\nInstallera en filhanterare som är kompatibel med Storage Access Framework</string>\n    <string name=\"detail_pinned_comment_view_description\">Fäst kommentar</string>\n    <string name=\"leak_canary_not_available\">LeakCanary är inte tillgänglig</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer standard</string>\n    <string name=\"progressive_load_interval_summary\">Ä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</string>\n    <string name=\"streams_notifications_interval_title\">Uppdateringsintervall</string>\n    <string name=\"streams_notifications_network_title\">Nödvändig nätverksanslutning</string>\n    <string name=\"any_network\">Alla nätverk</string>\n    <string name=\"delete_downloaded_files_confirm\">Radera alla nedladdade filer från disken\\?</string>\n    <string name=\"notifications_disabled\">Aviseringar är avstängda</string>\n    <string name=\"get_notified\">Bli meddelad</string>\n    <string name=\"you_successfully_subscribed\">Du har nu prenumenerat till denna kanalen</string>\n    <string name=\"streams_notification_channel_description\">Aviseringar om nya strömningar för prenumerationer</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s Ny strömning</item>\n        <item quantity=\"other\">strömningar%s Nya strömningar</item>\n    </plurals>\n    <string name=\"settings_category_player_notification_summary\">Konfigurera meddelande om aktuell ström som spelas upp</string>\n    <string name=\"check_new_streams\">Kör leta efter nya strömningar</string>\n    <string name=\"enable_streams_notifications_summary\">Meddela om nya strömningar från prenumerationer</string>\n    <string name=\"notifications\">Aviseringar</string>\n    <string name=\"streams_notification_channel_name\">Nya strömningar</string>\n    <string name=\"loading_stream_details\">Laddar strömdetaljer…</string>\n    <string name=\"enable_streams_notifications_title\">Aviseringar om nya strömningar</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"settings_category_player_notification_title\">Spelaravisering</string>\n    <string name=\"toggle_all\">Växla alla</string>\n    <string name=\"percent\">Procent</string>\n    <string name=\"semitone\">Halvton</string>\n    <string name=\"no_video_streams_available_for_external_players\">Inga videoströmningar tillgängliga för externa spelare</string>\n    <string name=\"unknown_quality\">Okänd kvalitet</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Inga ljudströmningar tillgängliga för externa spelare</string>\n    <string name=\"unknown_format\">Okänt format</string>\n    <string name=\"streams_not_yet_supported_removed\">Videoströmningar som ännu inte stöds av nedladdaren visas inte</string>\n    <string name=\"progressive_load_interval_title\">Inläsningsintervallsstorlek</string>\n    <string name=\"select_quality_external_players\">Välj kvalitet för externa spelare</string>\n    <string name=\"selected_stream_external_player_not_supported\">Den valda videoströmmen stöds inte av externa spelare</string>\n    <string name=\"faq_description\">Om du har problem med att använda appen, kolla in dessa svar på vanligt ställda frågor!</string>\n    <string name=\"faq_title\">Vanligt ställda frågor</string>\n    <string name=\"faq\">Visa på webbplats</string>\n    <string name=\"sort\">Sortera</string>\n    <string name=\"import_subscriptions_hint\">Importera eller exportera prenumerationer från 3-punktsmenyn</string>\n    <string name=\"fast_mode\">Snabbt läge</string>\n    <string name=\"app_update_unavailable_toast\">Du använder den senaste versionen av NewPipe</string>\n    <string name=\"app_update_available_notification_text\">Tryck för att ladda ner %s</string>\n    <string name=\"night_theme_available\">Det här alternativet är endast tillgängligt om %s har valts som Tema</string>\n    <string name=\"unset_playlist_thumbnail\">Inaktivera permanent miniatyrbild</string>\n    <string name=\"msg_failed_to_copy\">Det gick inte att kopiera till urklipp</string>\n    <string name=\"card\">Kort</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Dubblett tillagd %d gång(er)</string>\n    <string name=\"duplicate_in_playlist\">Spellistor som är gråmarkerade innehåller redan det här objektet.</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Användbart om du till exempel använder ett headset med trasiga fysiska knappar</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ignorera hårdvarans mediaknappar</string>\n    <string name=\"remove_duplicates_title\">Ta bort dubbletter\\?</string>\n    <string name=\"feed_hide_streams_title\">Visa följande strömningar</string>\n    <string name=\"feed_show_partially_watched\">Delvis sedd</string>\n    <string name=\"remove_duplicates_message\">Vill du ta bort alla duplicerade strömningar i den här spellistan\\?</string>\n    <string name=\"remove_duplicates\">Ta bort dubbletter</string>\n    <string name=\"feed_show_hide_streams\">Visa/Dölj strömningar</string>\n    <string name=\"feed_show_watched\">Fullständigt sedd</string>\n    <string name=\"feed_show_upcoming\">Kommande</string>\n    <string name=\"volume\">Volym</string>\n    <string name=\"none\">Ingen</string>\n    <string name=\"left_gesture_control_summary\">Välj en gest för den vänstra halvan av spelarskärmen</string>\n    <string name=\"brightness\">Ljusstyrka</string>\n    <string name=\"left_gesture_control_title\">Vänstergest åtgärd</string>\n    <string name=\"right_gesture_control_summary\">Välj en gest för den högra halvan av spelarskärmen</string>\n    <string name=\"right_gesture_control_title\">Högergest åtgärd</string>\n    <string name=\"play_queue_audio_track\">Ljud: %s</string>\n    <string name=\"audio_track\">Ljudspår</string>\n    <string name=\"audio_track_present_in_video\">Ett ljudspår bör redan finnas i denna ström</string>\n    <string name=\"select_audio_track_external_players\">Välj ljudspår för externa spelare</string>\n    <string name=\"unknown_audio_track\">Okänt</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer inställningar</string>\n    <string name=\"settings_category_exoplayer_summary\">Hantera vissa ExoPlayer inställningar. Dessa ändringar kräver en omstart av spelaren för att träda i kraft</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Använd alltid ExoPlayers lösning för inställning av videoutgångsyta</string>\n    <string name=\"prefer_original_audio_title\">Föredra originalljud</string>\n    <string name=\"prefer_original_audio_summary\">Välj originalljudspåret oavsett språk</string>\n    <string name=\"prefer_descriptive_audio_title\">Föredra beskrivande ljud</string>\n    <string name=\"prefer_descriptive_audio_summary\">Välj ett ljudspår med beskrivningar för synskadade personer om det finns tillgängligt</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Använd ExoPlayers reservfunktion för avkodare</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\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</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">original</string>\n    <string name=\"audio_track_type_descriptive\">beskrivande</string>\n    <string name=\"audio_track_type_dubbed\">dubbad</string>\n    <string name=\"main_tabs_position_summary\">Flytta huvudflik väljaren till botten</string>\n    <string name=\"main_tabs_position_title\">Huvudflikarnas position</string>\n    <string name=\"no_streams\">Inga strömningar</string>\n    <string name=\"no_live_streams\">Inga live-strömningar</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Medietunnel har inaktiverats som standard på din enhet eftersom att enhetsmodellen inte stöder funktionen.</string>\n    <string name=\"image_quality_title\">Bildkvalité</string>\n    <string name=\"channel_tab_videos\">Videor</string>\n    <string name=\"metadata_subscribers\">Prenumeranter</string>\n    <string name=\"show_channel_tabs_summary\">Vilka filkar visas på kanalsidorna</string>\n    <string name=\"share_playlist_with_list\">Dela URL-lista</string>\n    <string name=\"show_channel_tabs\">Kanalflikar</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"loading_metadata_title\">Laddar Metadata…</string>\n    <string name=\"toggle_screen_orientation\">Aktivera skärmorientering</string>\n    <string name=\"image_quality_low\">Låg kvalité</string>\n    <string name=\"toggle_fullscreen\">Aktivera helskärm</string>\n    <string name=\"feed_fetch_channel_tabs\">Hämta kanalflikar</string>\n    <string name=\"next_stream\">Nästa strömning</string>\n    <string name=\"open_play_queue\">Öppna spelkö</string>\n    <string name=\"image_quality_none\">Ladda inte bilder</string>\n    <string name=\"image_quality_high\">Hög kvalité</string>\n    <string name=\"channel_tab_about\">Om</string>\n    <string name=\"share_playlist\">Dela spellista</string>\n    <string name=\"forward\">Spola frammåt</string>\n    <string name=\"channel_tab_albums\">Album</string>\n    <string name=\"rewind\">Spola tillbaka</string>\n    <string name=\"replay\">Återspela</string>\n    <string name=\"image_quality_medium\">Medelkvalité</string>\n    <string name=\"channel_tab_playlists\">Spellistor</string>\n    <string name=\"play\">Spela</string>\n    <string name=\"more_options\">Fler alternativ</string>\n    <string name=\"metadata_thumbnails\">Miniatyrbilder</string>\n    <string name=\"channel_tab_tracks\">Spår</string>\n    <string name=\"duration\">Längd</string>\n    <string name=\"channel_tab_channels\">Kanaler</string>\n    <string name=\"previous_stream\">Föregående strömning</string>\n    <string name=\"channel_tab_livestreams\">Live</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist_with_titles\">Dela med Titlar</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"metadata_avatars\">Visningsbilder</string>\n    <string name=\"metadata_subchannel_avatars\">Underkanalens visningsbilder</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Flikar att hämta när flödet uppdateras. Det här alternativet har ingen effekt om en kanal uppdateras i snabbt läge.</string>\n    <string name=\"metadata_uploader_avatars\">Uppladdarens visningsbilder</string>\n    <string name=\"metadata_banners\">Banderoller</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"show_more\">Visa mer</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s svar</item>\n        <item quantity=\"other\">%s svar</item>\n    </plurals>\n    <string name=\"show_less\">Visa mindre</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"error_insufficient_storage\">Inte tillräckligt med ledigt utrymme på enheten</string>\n    <string name=\"no\">Nej</string>\n    <string name=\"settings_category_backup_restore_title\">Säkerhetskopiering och återställning</string>\n    <string name=\"yes\">Ja</string>\n    <string name=\"auto_update_check_description\">NewPipe kan automatiskt söka efter nya versioner då och då och meddela dig när de är tillgängliga.\n\\nVill du aktivera detta?</string>\n    <string name=\"reset_settings_title\">Återställ inställningar</string>\n    <string name=\"reset_settings_summary\">Återställ alla inställningar till deras standardvärden</string>\n    <string name=\"reset_all_settings\">Om du återställer alla inställningar försvinner alla dina föredragna inställningar och appen startas om.\n\\n\n\\nÄr du säker på att du vill fortsätta?</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"audio_track_type_secondary\">sekundär</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Dela som YouTube temporär spellista</string>\n    <string name=\"tab_bookmarks_short\">Spellistor</string>\n    <string name=\"select_a_feed_group\">Välj en flödesgrupp</string>\n    <string name=\"no_feed_group_created_yet\">Ingen flödesgrupp har skapats ännu</string>\n    <string name=\"feed_group_page_summary\">Kanalgruppsida</string>\n    <string name=\"search_with_service_name\">Sök %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Sök %1$s (%2$s)</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"channel_tab_likes\">Gillar</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud Topp 50-sida borttagen</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud har lagt ner de ursprungliga topp 50-listorna. Motsvarande flik har tagits bort från din startsida.</string>\n    <string name=\"migration_info_7_8_title\">YouTubes kombinerade trender har tagits bort</string>\n    <string name=\"migration_info_7_8_message\">YouTube har upphört med den kombinerade trendsidan från och med den 21 juli 2025. NewPipe ersatte standardtrendsidan med trendiga livestreams.\\n\\nDu kan också välja olika trendsidor i \\\"Inställningar &gt; Innehåll &gt; Innehåll på huvudsidan\\\".</string>\n    <string name=\"trending_gaming\">Speltrender</string>\n    <string name=\"trending_podcasts\">Trendiga poddar</string>\n    <string name=\"trending_movies\">Trendiga filmer och serier</string>\n    <string name=\"trending_music\">Trendig musik</string>\n    <string name=\"permission_display_over_apps_message\">För att använda Popup Player, välj %1$s i följande Android-inställningsmeny och aktivera %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"Tillåt visning över andra appar\\\"</string>\n    <string name=\"delete_file\">Ta bort fil</string>\n    <string name=\"delete_entry\">Ta bort post</string>\n    <string name=\"account_terminated_service_provides_reason\">Konto avslutat\\n\\n%1$s anger denna anledning: %2$s</string>\n    <string name=\"entry_deleted\">Posten borttagen</string>\n    <string name=\"player_http_403\">HTTP-fel 403 mottogs från servern under uppspelning, troligen orsakat av att streaming-URL:en har löpt ut eller att en IP-adress har blockerats</string>\n    <string name=\"player_http_invalid_status\">HTTP-fel %1$s mottogs från servern under spelning</string>\n    <string name=\"youtube_player_http_403\">HTTP-fel 403 mottogs från servern under spelning, troligen orsakat av en IP-avstängning eller problem med deobfuskering av streaming-URL:er</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s vägrade att tillhandahålla data och bad om en inloggning för att bekräfta att den som begärde detta inte är en bot.\\n\\nDin IP-adress kan ha blivit tillfälligt avstängd av %1$s. Du kan vänta en stund eller byta till en annan IP-adress (till exempel genom att slå på/av ett VPN eller genom att byta från WiFi till mobildata).</string>\n    <string name=\"unsupported_content_in_country\">Detta innehåll är inte tillgängligt för det valda innehållslandet.\\n\\nÄndra ditt val från \\\"Inställningar &gt; Innehåll &gt; Standardinnehållsland\\\".</string>\n    <string name=\"kao_dialog_warning\">Google har meddelat att från och med 2026/2027 kommer alla appar på certifierade Android-enheter att kräva att utvecklarna lämnar sina personliga identitetsuppgifter direkt till Google. Eftersom utvecklarna av denna app inte accepterar detta krav kommer appen inte längre att fungera på certifierade Android-enheter efter den tiden.</string>\n    <string name=\"kao_dialog_more_info\">Detaljer</string>\n    <string name=\"kao_solution\">Lösning</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-sw/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Gusa kioo la kukuza ili kuanza.</string>\n    <string name=\"show_higher_resolutions_summary\">Ni baadhi ya vifaa vingine pekee vinavyoweza kucheza video za 2K/4K</string>\n    <string name=\"play_with_kodi_title\">Cheza na Kodi</string>\n    <string name=\"show_play_with_kodi_title\">Onyesha chaguo la \\\"Cheza na Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Onyesha chaguo la kucheza video kupitia kituo cha media cha Kodi</string>\n    <string name=\"upload_date_text\">iliyochapishwa kwa %1$s</string>\n    <string name=\"no_player_found\">Hakuna stream player kilichopatikana. Sakinisha VLC\\?</string>\n    <string name=\"no_player_found_toast\">Hakuna stream player kilichopatikana(unaweza sakinisha VLC kuicheza).</string>\n    <string name=\"install\">Sakinisha</string>\n    <string name=\"cancel\">Cancel</string>\n    <string name=\"open_in_browser\">Fungua katika mtandao</string>\n    <string name=\"open_in_popup_mode\">Fungua katika “popup mode”</string>\n    <string name=\"mark_as_watched\">Weka alama kuwa umetazama</string>\n    <string name=\"open_with\">Fungua na</string>\n    <string name=\"share\">Share</string>\n    <string name=\"download\">Download</string>\n    <string name=\"settings\">Settings</string>\n    <string name=\"search\">Tafuta</string>\n    <string name=\"did_you_mean\">Ulimaanisha \\\"%1$s\\\"\\?</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"search_showing_result_for\">Inaonyesha matokeo ya:%s</string>\n    <string name=\"use_external_audio_player_title\">Tumia kicheza sauti cha nje</string>\n    <string name=\"notification_action_0_title\">Kitufe cha kitendo cha kwanza</string>\n    <string name=\"seek_duration_title\">Fast-forward/-rewind seek duration</string>\n    <string name=\"popup_remember_size_pos_summary\">Kumbuka ukubwa wa mwisho na nafasi ya popup</string>\n    <string name=\"notification_action_4_title\">Kitufe cha kitendo cha tano</string>\n    <string name=\"notification_action_shuffle\">Changanya</string>\n    <string name=\"notification_action_repeat\">Rudia</string>\n    <string name=\"controls_download_desc\">Download stream file</string>\n    <string name=\"use_external_video_player_title\">Tumia kicheza video cha nje</string>\n    <string name=\"subscribe_button_title\">Subscribe</string>\n    <string name=\"subscribed_button_title\">Subscribed</string>\n    <string name=\"unsubscribe\">Unsubscribe</string>\n    <string name=\"subscription_change_failed\">Haikuweza kubadilisha \\\"subscription\\\"</string>\n    <string name=\"show_info\">Onyesha habari</string>\n    <string name=\"controls_add_to_playlist_title\">Ongeza kwa</string>\n    <string name=\"notification_action_2_title\">Kitufe cha kitendo cha tatu</string>\n    <string name=\"notification_action_1_title\">Kitufe cha kitendo cha pili</string>\n    <string name=\"notification_action_3_title\">Kitufe cha kitendo cha nne</string>\n    <string name=\"notification_action_buffering\">Buffering</string>\n    <string name=\"notification_action_nothing\">Hakuna</string>\n    <string name=\"use_inexact_seek_title\">Use fast inexact seek</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-sw600dp/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"popup_default_width\">230dp</dimen>\n    <dimen name=\"popup_minimum_width\">160dp</dimen>\n    <!-- Video Item Detail View Dimensions-->\n    <!-- Text Size -->\n    <dimen name=\"channel_item_detail_title_text_size\">18sp</dimen>\n    <dimen name=\"video_item_detail_title_text_size\">16sp</dimen>\n    <dimen name=\"video_item_detail_views_text_size\">16sp</dimen>\n    <dimen name=\"video_item_detail_likes_text_size\">14sp</dimen>\n    <dimen name=\"video_item_detail_sub_channel_text_size\">16sp</dimen>\n    <dimen name=\"video_item_detail_uploader_text_size\">12sp</dimen>\n    <dimen name=\"video_item_detail_upload_date_text_size\">16sp</dimen>\n    <dimen name=\"video_item_detail_description_text_size\">16sp</dimen>\n    <!-- Elements Size -->\n    <dimen name=\"video_item_detail_uploader_image_size\">40dp</dimen>\n    <dimen name=\"video_item_detail_sub_channel_image_size\">20dp</dimen>\n    <dimen name=\"video_item_detail_like_image_height\">18sp</dimen>\n    <dimen name=\"video_item_detail_like_image_width\">18sp</dimen>\n    <!-- Paddings & Margins -->\n    <dimen name=\"video_item_detail_pinned_right_margin\">10dp</dimen>\n    <dimen name=\"video_item_detail_like_margin\">10dp</dimen>\n\n    <dimen name=\"search_suggestion_text_size\">14sp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-sw600dp-land/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- Video Item Search View Dimensions-->\n    <!-- Text Size -->\n    <dimen name=\"channel_item_detail_title_text_size\">21sp</dimen>\n    <dimen name=\"video_item_search_title_text_size\">14sp</dimen>\n    <dimen name=\"video_item_search_duration_text_size\">11sp</dimen>\n    <dimen name=\"video_item_search_uploader_text_size\">12sp</dimen>\n    <dimen name=\"video_item_search_upload_date_text_size\">12sp</dimen>\n    <!-- Paddings & Margins -->\n    <dimen name=\"video_item_search_image_right_margin\">6dp</dimen>\n    <dimen name=\"video_item_search_avatar_right_margin\">33dp</dimen>\n    <dimen name=\"video_item_search_duration_vertical_padding\">1sp</dimen>\n    <dimen name=\"video_item_search_duration_horizontal_padding\">5sp</dimen>\n    <!-- Miscellaneous -->\n    <dimen name=\"comment_item_avatar_right_margin\">9dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ta/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">ஆரம்பிக்க பூதக்கண்ணாடியைத் தட்டு.</string>\n    <string name=\"upload_date_text\">%1$s அன்று வெளியிடப்பட்டது</string>\n    <string name=\"no_player_found\">நிகழ்பட ஓட்டி இல்லை. VLCஐ நிறுவவா\\?</string>\n    <string name=\"install\">நிறுவு</string>\n    <string name=\"cancel\">ரத்துசெய்</string>\n    <string name=\"open_in_browser\">உலாவியில் திற</string>\n    <string name=\"share\">பகிர்</string>\n    <string name=\"download\">பதிவிறக்கம்</string>\n    <string name=\"search\">தேடு</string>\n    <string name=\"settings\">அமைவு</string>\n    <string name=\"share_dialog_title\">இதனுடன் பகிர்</string>\n    <string name=\"no_player_found_toast\">நிகழ்பட ஓட்டி இல்லை (இதை இயக்க VLC-ஐப் பயன்படுத்தலாம்).</string>\n    <string name=\"open_in_popup_mode\">திரைமேல் நிலையில் காட்டு</string>\n    <string name=\"controls_download_desc\">நிகழ்பட கோப்பைப் பதிவிறக்கு</string>\n    <string name=\"did_you_mean\">\\\"%1$s\\\" என்றீர்களா\\?</string>\n    <string name=\"use_external_video_player_title\">வேறு நிகழ்பட ஓட்டியைப் பயன்படுத்து</string>\n    <string name=\"use_external_audio_player_title\">வேறு ஒலி இயக்கியைப் பயன்படுத்து</string>\n    <string name=\"subscribe_button_title\">சந்தாசேர்</string>\n    <string name=\"subscribed_button_title\">சந்தாசேர்ந்தாயிற்று</string>\n    <string name=\"channel_unsubscribed\">சேனல் சந்தாநீக்கப்பட்டது</string>\n    <string name=\"subscription_change_failed\">சந்தாவை மாற்ற முடியவில்லை</string>\n    <string name=\"subscription_update_failed\">சந்தாவைப் புதுப்பிக்க முடியவில்லை</string>\n    <string name=\"show_info\">தகவல் காண்பி</string>\n    <string name=\"tab_subscriptions\">சந்தாக்கள்</string>\n    <string name=\"tab_bookmarks\">நூற்குறித்த ஒளிச்சரங்கள்</string>\n    <string name=\"fragment_feed_title\">புதிதாக</string>\n    <string name=\"controls_background_title\">பின்புலம்</string>\n    <string name=\"controls_popup_title\">திரைமேல்</string>\n    <string name=\"controls_add_to_playlist_title\">இதற்கு சேர்</string>\n    <string name=\"download_path_title\">காணொளி பதிவிறக்க அடைவு</string>\n    <string name=\"download_path_summary\">பதிவிறங்கிய காணொளி கோப்புகள் இங்கே தேங்கும்</string>\n    <string name=\"download_path_dialog_title\">காணொளியின் பதிவிறக்க அடைவை தேர்வு செய்</string>\n    <string name=\"download_path_audio_title\">ஒலி பதிவிறக்க அடைவு</string>\n    <string name=\"download_path_audio_summary\">பதிவிறங்கிய ஒலி கோப்புகள் இங்கே தேங்கும்</string>\n    <string name=\"download_path_audio_dialog_title\">ஒலி கோப்புகளுக்கான பதிவிறக்கப் அடைவை தேர்வு செய்</string>\n    <string name=\"default_resolution_title\">இயல்பிருப்பு பிரிதிறன்</string>\n    <string name=\"default_popup_resolution_title\">இயல்பிருப்பு திரைமேல் நிலை பிரிதிறன்</string>\n    <string name=\"show_higher_resolutions_title\">உயரிய பிரிதிறன்களைக் காட்டு</string>\n    <string name=\"play_with_kodi_title\">Kodiயுடன் இயக்கு</string>\n    <string name=\"kore_not_found\">இல்லாத Kore செயலியை நிறுவவா\\?</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodiயுடன் இயக்கு\\\" இடப்பைக் காட்டு</string>\n    <string name=\"play_audio\">ஒலி</string>\n    <string name=\"default_audio_format_title\">இயல்பிருப்பு ஒலி வடிவம்</string>\n    <string name=\"default_video_format_title\">இயல்பிருப்பு காணொளி வடிவம்</string>\n    <string name=\"theme_title\">தோற்றம்</string>\n    <string name=\"light_theme_title\">வெளிர்ந்த</string>\n    <string name=\"dark_theme_title\">இருண்ட</string>\n    <string name=\"black_theme_title\">கருமை</string>\n    <string name=\"popup_remember_size_pos_title\">திரைமேல் பண்புகளை நினைவுகொள்</string>\n    <string name=\"popup_remember_size_pos_summary\">திரைமேல் நிலையின் கடைசி அளவையும் இடத்தையும் நினைவுகொள்</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">பட பதுக்ககம் அழிக்கப்பட்டது</string>\n    <string name=\"metadata_cache_wipe_title\">மேல்நிலைத்தரவின் பதுக்ககம் அழிக்கப்பட்டது</string>\n    <string name=\"metadata_cache_wipe_summary\">பதுக்ககப்படுத்திய வலைப்பக்கத் தரவை நீக்கு</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">மேல்நிலைத் தரவு பதுக்ககம் அழிக்கப்பட்டது</string>\n    <string name=\"show_search_suggestions_title\">பரிந்துரைகளைத் தேடு</string>\n    <string name=\"enable_search_history_title\">தேடல் வரலாறு</string>\n    <string name=\"enable_watch_history_title\">பார்த்த வரலாறு</string>\n    <string name=\"enable_watch_history_summary\">பார்த்த காணொளிகளை குறிப்பிடு</string>\n    <string name=\"download_dialog_title\">பதிவிறக்கு</string>\n    <string name=\"settings_category_player_title\">இயக்கி</string>\n    <string name=\"settings_category_player_behavior_title\">பண்பு</string>\n    <string name=\"settings_category_video_audio_title\">காணொளியும் ஒலியும்</string>\n    <string name=\"settings_category_history_title\">வரலாறும் பதுக்ககமும்</string>\n    <string name=\"settings_category_appearance_title\">தோற்றம்</string>\n    <string name=\"background_player_playing_toast\">பிண்ணணியில் ஓடுகிறது</string>\n    <string name=\"popup_playing_toast\">திரைமேல் நிலையில் ஓடுகிறது</string>\n    <string name=\"duration_live\">நேரலை</string>\n    <string name=\"downloads\">பதிவிறக்கங்கள்</string>\n    <string name=\"downloads_title\">பதிவிறக்கங்கள்</string>\n    <string name=\"all\">அனைத்தும்</string>\n    <string name=\"playlists\">ஒளிச்சரங்கள்</string>\n    <string name=\"users\">பயனர்கள்</string>\n    <string name=\"clear\">அழி</string>\n    <string name=\"always\">எப்பொழுதும்</string>\n    <string name=\"just_once\">ஒரு முறை</string>\n    <string name=\"file\">கோப்பு</string>\n    <string name=\"clear_views_history_title\">பார்த்த வரலாற்றை அழி</string>\n    <string name=\"watch_history_deleted\">பார்த்த வரலாறு அழிக்கப்பட்டது</string>\n    <string name=\"clear_search_history_title\">தேடல் வரலாற்றை அழி</string>\n    <string name=\"search_history_deleted\">தேடல் வரலாறு அழிக்கப்பட்டது</string>\n    <string name=\"file_name_empty_error\">கோப்பு பெயர் காலியாக இருக்க முடியாது</string>\n    <string name=\"error_snackbar_message\">மன்னிக்கவும், ஏதோ தவறாகிற்று.</string>\n    <string name=\"what_device_headline\">தகவல்:</string>\n    <string name=\"error_details_headline\">விவரங்கள்:</string>\n    <string name=\"detail_likes_img_view_description\">விருப்பங்கள்</string>\n    <string name=\"search_no_results\">முடிவுகள் இல்லை</string>\n    <string name=\"empty_list_subtitle\">எந்த முடிவுகளும் இல்லை</string>\n    <string name=\"detail_drag_description\">இழுத்து வரிசைமாற்று</string>\n    <string name=\"video\">காணொலி</string>\n    <string name=\"audio\">ஒலி</string>\n    <string name=\"retry\">மீண்டும் முயற்சி</string>\n    <string name=\"use_external_video_player_summary\">சில பிரிதிறன்களில் ஒலியை நீக்கும்</string>\n    <string name=\"show_higher_resolutions_summary\">சில சாதனங்கள் மட்டுமே 2k/4k காணொளிகளை இயக்கமுடியும்</string>\n    <string name=\"show_play_with_kodi_summary\">காணொளிகளை Kodi media centerஉடன் இயக்கும் இடப்பைக் காட்டு</string>\n    <string name=\"use_inexact_seek_title\">வேகமான பொருத்தமற்ற தேடலை பயன்படுத்து</string>\n    <string name=\"show_search_suggestions_summary\">தேடும்போது காட்ட, பரிந்துரைகளைத் தெரிவுசெய்</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">தொலைபேசி அழைப்பு போன்ற குறுக்கீடுகளுக்கு பிறகு தொடரவும்</string>\n    <string name=\"show_next_and_similar_title\">\\'அடுத்து\\' மற்றும் \\'ஒப்பான\\' காணொளிகளைக் காட்டு</string>\n    <string name=\"enable_search_history_summary\">தேடல் வாக்கியத்தை அமைவிடத்தில் தேக்கு</string>\n    <string name=\"unsupported_url\">ஆதரிக்கப்படாத உரலி</string>\n    <string name=\"default_content_country_title\">உள்ளடக்க இயல்பிருப்பு நாடு</string>\n    <string name=\"settings_category_debug_title\">வழுநீக்கு</string>\n    <string name=\"content\">உள்ளடக்கம்</string>\n    <string name=\"show_age_restricted_content_title\">வயது வரம்புக்குட்பட்ட உள்ளடக்கத்தைக் காட்டு</string>\n    <string name=\"auto_queue_title\">அடுத்த பாய்வில் தானாக-தாரைபடுத்து</string>\n    <string name=\"error_report_title\">பிழை அறிக்கை</string>\n    <string name=\"channels\">சேனல்கள்</string>\n    <string name=\"disabled\">செயலிழக்கச் செய்யப்பட்டுள்ளது</string>\n    <string name=\"undo\">முந்தய நிலைக்குச் செல்</string>\n    <string name=\"play_all\">அனைத்தையும் இயக்கு</string>\n    <string name=\"notification_channel_name\">NewPipe அறிவிப்பு</string>\n    <string name=\"unknown_content\">[அறியப்படவில்லை]</string>\n    <string name=\"switch_to_background\">பின்னனிக்கு மாறு</string>\n    <string name=\"show_hold_to_append_title\">\\\"சாரைபடுத்த நீண்டழுத்து\\\" துணுக்குதவியைக் காட்டு</string>\n    <string name=\"import_data_title\">தகவல்கலை இறக்குமதி செய்</string>\n    <string name=\"export_data_title\">தகவல்கலை ஏற்றுமதி செய்</string>\n    <string name=\"import_data_summary\">தற்போதைய வரலாறு, சந்தாக்கள், ஒளிச்சரங்கள் மற்றும் (விரும்பினால்) அமைவை மீறும்</string>\n    <string name=\"export_data_summary\">வரலாறு, சந்தாக்கள், ஒளிச்சரங்கள் மற்றும் அமைவை ஏற்றுமதி செய்</string>\n    <string name=\"delete_view_history_alert\">பார்த்த வரலாறு முழுவதையும் அழி\\?</string>\n    <string name=\"clear_search_history_summary\">தேடப்பட்ட வார்த்தைகளின் வரலாற்றை அழி</string>\n    <string name=\"delete_search_history_alert\">தேடல் வரலாறு முழுவதையும் அழி\\?</string>\n    <string name=\"general_error\">பிழை</string>\n    <string name=\"best_resolution\">சிறந்த திரைத் தெளிவுத்திறன்</string>\n    <string name=\"notification_channel_description\">NewPipe இயக்கிக்கான அறிவிப்புகள்</string>\n    <string name=\"switch_to_popup\">பாப்அப் இயக்கிக்கு மாறு</string>\n    <string name=\"unsubscribe\">சந்தாநீக்கு</string>\n    <string name=\"enqueue\">சாரைபடுத்து</string>\n    <string name=\"network_error\">நெட்வொர்க் பிழை</string>\n    <string name=\"app_ui_crash\">செயலி நிறுத்தப்பட்டது</string>\n    <string name=\"sorry_string\">மன்னிக்கவும்.</string>\n    <string name=\"error_report_button_text\">மின்னஞ்சல் வழியாக அறிக்கை</string>\n    <string name=\"what_happened_headline\">என்ன நடந்தது:</string>\n    <string name=\"your_comment\">உங்கள் கருத்து:</string>\n    <string name=\"detail_dislikes_img_view_description\">வெறுப்புகள்</string>\n    <string name=\"no_subscribers\">பின் தொடர்பவர்கள் இல்லை</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s பின் தொடர்பவர்</item>\n        <item quantity=\"other\">%s பின் தொடர்பவர்கள்</item>\n    </plurals>\n    <string name=\"no_views\">யாரும் பார்க்கவில்லை</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s பார்வை</item>\n        <item quantity=\"other\">%s பார்வைகள்</item>\n    </plurals>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s காணொளி</item>\n        <item quantity=\"other\">%s காணொளிகள்</item>\n    </plurals>\n    <string name=\"switch_to_main\">முதற்பக்கத்துக்கு மாற்று</string>\n    <string name=\"video_streams_empty\">எந்த காணொலியும் இல்லை</string>\n    <string name=\"audio_streams_empty\">எந்த ஒலியோடையும் இல்லை</string>\n    <string name=\"invalid_directory\">அப்படியொரு அடைவுகள் இல்லை</string>\n    <string name=\"invalid_source\">அப்படியொரு கோப்பு இல்லை</string>\n    <string name=\"error_occurred_detail\">ஒரு பிழை நிகழ்ந்தது: %1$s</string>\n    <string name=\"tracks\">காணொளிக் கோப்புகள்</string>\n    <string name=\"tab_choose\">பக்கத்தை தேர்வு செய்</string>\n    <string name=\"settings_category_updates_title\">புதுப்பித்தல்கள்</string>\n    <string name=\"file_deleted\">கோப்பு அழிக்கப்பட்டது</string>\n    <string name=\"app_update_notification_channel_name\">செயலி புதுப்பித்தல் அறிவிப்பு</string>\n    <string name=\"app_update_notification_channel_description\">புதிய NewPipe பதிப்புக்கான அறிவிப்புகள்</string>\n    <string name=\"download_to_sdcard_error_title\">வெளி சேமிப்பு இயலாது</string>\n    <string name=\"subscribers_count_not_available\">சந்தாதாரர் எண்ணிக்கை கிடைக்கவில்லை</string>\n    <string name=\"events\">நிகழ்வுகள்</string>\n    <string name=\"show_comments_title\">கருத்துக்களைக் காண்பி</string>\n    <string name=\"show_comments_summary\">கருத்துக்களை மறைக்க அணை</string>\n    <string name=\"autoplay_title\">தானாக ஓட்டு</string>\n    <string name=\"enable_playback_resume_title\">திரையிடலை தொடங்கு</string>\n    <string name=\"enable_playback_state_lists_title\">பட்டியலில் இடங்கள்</string>\n    <string name=\"settings_category_clear_data_title\">தரவை அழி</string>\n    <string name=\"missing_file\">கோப்பு மாற்ற அல்லது நீக்கப்பட்டது</string>\n    <string name=\"no_one_watching\">யாரும் பார்க்கவில்லை</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s பார்க்கிறார்</item>\n        <item quantity=\"other\">%s பார்க்கிறார்கள்</item>\n    </plurals>\n    <string name=\"seek_duration_title\">வேகமாக முன்னோக்கி / திரும்பத் தேடும் காலம்</string>\n    <string name=\"clear_queue_confirmation_title\">வரிசையை அழிக்கும் முன் உறுதிப்படுத்தலைக் கேள்</string>\n    <string name=\"confirm_prompt\">உங்கள் பதிவிறக்க வரலாற்றை அழிக்க வேண்டுமா அ எல்லா பதிவிறக்கிய கோப்புகளையும் நீக்க வேண்டுமா\\?</string>\n    <string name=\"clear_download_history\">பதிவிறக்க வரலாற்றை அழி</string>\n    <string name=\"delete_item_search_history\">தேடல் வரலாற்றிலிருந்து இந்த உருப்படியை நீக்கவா\\?</string>\n    <string name=\"action_history\">வரலாறு</string>\n    <string name=\"title_activity_history\">வரலாறு</string>\n    <string name=\"show_meta_info_title\">மேனிலை தகவல் காட்டு</string>\n    <string name=\"show_description_summary\">காணொளி விளக்கம் மற்றும் கூடுதல் தகவல்களை மறைக்க அணை</string>\n    <string name=\"show_description_title\">விளக்கத்தைக் காட்டு</string>\n    <string name=\"clear_queue_confirmation_description\">செயலிலுள்ள இயக்கி வரிசை மாற்றப்படும்</string>\n    <string name=\"clear_queue_confirmation_summary\">ஒரு இயக்கி விட்டு மறு இயக்கி மாறுதல் உங்கள் வரிசையை மாற்றக்கூடும்</string>\n    <string name=\"use_inexact_seek_summary\">துல்லியமற்ற நாடல் குறைந்த துல்லியத்துடன் விரைவாக நாட இயக்கியை அனுமதிக்கிறது. 5, 15 அ 25 நொடிகள் நாடுவது இதனுடன் செயல்படாது</string>\n    <string name=\"night_theme_title\">இரவுத் தோற்றம்</string>\n    <string name=\"notification_colorize_summary\">சிறுபடத்திலுள்ள முதன்மை நிறத்திற்கேற்ப அறிவிப்பின் நிறத்தை Androidஐ தனிப்பயனாக்கச் செய் (இது எல்லா சாதனங்களிலும் கிடைக்காதென்பதை குறித்துக்கொள்)</string>\n    <string name=\"notification_colorize_title\">அறிவிப்பை வண்ணமயமாக்கு</string>\n    <string name=\"notification_action_nothing\">ஏதுமில்லை</string>\n    <string name=\"notification_action_buffering\">இடையகப்படுத்துகிறது</string>\n    <string name=\"notification_action_shuffle\">கலக்கு</string>\n    <string name=\"notification_action_repeat\">மீண்டும்</string>\n    <string name=\"notification_actions_at_most_three\">சுருக்க அறிவிப்பில் காட்ட அதிகபட்சம் மூன்று செயல்களை நீங்கள் தேர்ந்தெடுக்கலாம்!</string>\n    <string name=\"notification_actions_summary\">ஒவ்வொரு அறிவிப்பு செயலையும் தட்டுவதன் மூலம் அதைத் தட்டவும். வலதுபுறத்தில் உள்ள தேர்வுப்பெட்டிகளைப் பயன்படுத்தி சிறிய அறிவிப்பில் காட்டப்படுவதற்கு அவற்றில் மூன்று வரை தேர்ந்தெடுக்கவும்.</string>\n    <string name=\"notification_action_4_title\">ஐந்தாம் செயல் பொத்தான்</string>\n    <string name=\"notification_action_3_title\">நான்காம் செயல் பொத்தான்</string>\n    <string name=\"notification_action_2_title\">மூன்றாம் செயல் பொத்தான்</string>\n    <string name=\"notification_action_1_title\">இரண்டாம் செயல் பொத்தான்</string>\n    <string name=\"notification_action_0_title\">முதல் செயல் பொத்தான்</string>\n    <string name=\"notification_scale_to_square_image_summary\">அறிவிப்பில் தெரியும் காணொளி முகப்புபடத்தை 16: 9 முதல் 1: 1 அம்ச விகிதம் வரை அளவிட்டு பிரித்து எது</string>\n    <string name=\"notification_scale_to_square_image_title\">அட்டைப் படத்தை 1:1 விகிதத்தில் செதுக்கவும்</string>\n    <string name=\"search_showing_result_for\">%s :க்கான முடிவுகளைக் காட்டுகிறது</string>\n    <string name=\"open_with\">இதனுடன் திற</string>\n    <string name=\"tab_about\">பற்றி &amp; கேள்விகள்</string>\n    <string name=\"title_activity_about\">நியூபைப் பற்றி</string>\n    <string name=\"trending\">நடப்பு</string>\n    <string name=\"download_failed\">பதிவிறக்கம் தோல்வியடைந்தது</string>\n    <string name=\"low_quality_smaller\">குறைந்த தரம்</string>\n    <string name=\"limit_mobile_data_usage_title\">மொபைல் தரவைப் பயன்படுத்தும் போது வீடியோ தரத்தைக் கட்டுப்படுத்துங்கள்</string>\n    <string name=\"limit_data_usage_none_description\">வரம்பற்ற</string>\n    <string name=\"content_not_available\">உள்ளடக்கம் கிடைக்கவில்லை</string>\n    <string name=\"mark_as_watched\">பார்த்ததாகக் குறி</string>\n    <string name=\"ok\">சரி</string>\n    <string name=\"could_not_load_thumbnails\">எல்லா சிறுபடங்களையும் ஏற்ற முடியவில்லை</string>\n    <string name=\"parsing_error\">வலைத்தளத்தைப் பாகுபடுத்த முடியவில்லை</string>\n    <string name=\"remote_search_suggestions\">தொலைதேடல் பரிந்துரைகள்</string>\n    <string name=\"auto_queue_toggle\">தானாக-தாரைபடுத்தல்</string>\n    <string name=\"enable_playback_resume_summary\">கடைசியாக மீட்பொலித்த இருப்பிடத்தை மீட்டெடு</string>\n    <string name=\"local_search_suggestions\">உள்ளூர் தேடல் பரிந்துரைகள்</string>\n    <string name=\"show_meta_info_summary\">பாய்வு உருவாக்குநர், பாய்வு உள்ளடக்கம் அ தேடல் கோரிக்கை குறித்த கூடுதல் தகவலையுடைய மேனிலைத் தகவட்பெட்டிகளை மறைக்க அணை</string>\n    <string name=\"peertube_instance_url_title\">பியர்டியூப் நிகழ்வுகள்</string>\n    <string name=\"download_to_sdcard_error_message\">புற SD அட்டைக்குப் பதிவிறக்குதல் சாத்தியமில்லை. பதிவிறக்க அடைவிடத்தை அகரமாக்கவா\\?</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA நினைவிகளைத் துடை</string>\n    <string name=\"restore_defaults_confirmation\">இயல்பிருப்புகளை மீட்டெடுக்க வேண்டுமா\\?</string>\n    <string name=\"related_items_tab_description\">உறவுடைய உருப்படிகள்</string>\n    <string name=\"clear_cookie_summary\">reCAPTCHAஐ தீர்க்கையில் NewPipe சேமிக்கும் நினைவிகளைத் துடை</string>\n    <string name=\"start_main_player_fullscreen_title\">முதன்மை இயக்கியை முழுதிரையில் துவக்கு</string>\n    <string name=\"peertube_instance_add_fail\">நிகழ்வை செல்லுபடுயாக்க முடியவில்லை</string>\n    <string name=\"clear_playback_states_summary\">எல்லா இயக்கக குறியிடங்களையும் அழிக்கும்</string>\n    <string name=\"delete_playback_states_alert\">எல்லா இயக்கக குறியிடங்களையும் அழிக்கவா\\?</string>\n    <string name=\"watch_history_states_deleted\">இயக்கக குறியிடங்கள் அழிக்கப்பட்டன</string>\n    <string name=\"description_tab_description\">விவரிப்பு</string>\n    <string name=\"albums\">தொகுப்புகள்</string>\n    <string name=\"artists\">கலைஞர்கள்</string>\n    <string name=\"videos_string\">காணொளிகள்</string>\n    <string name=\"peertube_instance_add_https_only\">HTTPS உரலிகள் மட்டுமே ஆதரிக்கப்படுகின்றன</string>\n    <string name=\"peertube_instance_add_help\">நிகழ்வு உரலியை உள்ளிடு</string>\n    <string name=\"peertube_instance_add_title\">நிகழ்வைச் சேர்</string>\n    <string name=\"peertube_instance_url_help\">உமக்குப் பிடித்த நிகழ்வை கண்டுபிடி இங்கு %s</string>\n    <string name=\"peertube_instance_url_summary\">உம் அபிமான பியர்டியூப் நிகழ்வுகளைத் தேர்ந்தெடு</string>\n    <string name=\"content_language_title\">உள்ளடக்க இயல்பிருப்பு மொழி</string>\n    <string name=\"resume_on_audio_focus_gain_title\">இயக்குதலைத் மறுதொடர்</string>\n    <string name=\"peertube_instance_add_exists\">நிகழ்வு ஏற்கனவே உள்ளது</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">யூடியூபின் \\\"கட்டுப்பாடு பயன்முறை\\\"ஐ இயக்கு</string>\n    <string name=\"songs\">பாடல்கள்</string>\n    <string name=\"error_report_channel_description\">பிழைகளைப் புகாரளிக்க அறிவிப்புகள்</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA நினைவிகள் துடைக்கப்பட்டன</string>\n    <string name=\"clear_views_history_summary\">இயக்கிய பாய்வுகள் மற்றும் இயக்கக குறியிடங்களின் வரலாற்றை அழிக்கும்</string>\n    <string name=\"clear_playback_states_title\">இயக்கக குறியிடங்களை அழி</string>\n    <string name=\"could_not_setup_download_menu\">பதிவிறக்கச்சிறுபட்டியை அமைக்க முடியவில்லை</string>\n    <string name=\"restore_defaults\">இயல்பிருப்புகளை மீட்டெடு</string>\n    <string name=\"error_report_notification_title\">NewPipe பிழையைச் எதிர்கொண்டது, புகாரளிக்க தட்டு</string>\n    <string name=\"error_snackbar_action\">புகாரளி</string>\n    <string name=\"info_labels\">என்ன:\\nகோரிக்கை:\\nஉள்ளடக்க மொழி:\\nஉள்ளடக்க நாடு:\\nசெயலி மொழி:\\nசேவை:\\nGMT நேரம்:\\nசிப்பம்:\\nபதிப்பு:\\nOS பதிப்பு:</string>\n    <string name=\"detail_thumbnail_view_description\">காணொளியை இயக்கு, காலவளவு:</string>\n    <string name=\"comments_tab_description\">கருத்தளிப்புகள்</string>\n    <string name=\"crash_the_player\">இயக்கியைச் சிதை</string>\n    <string name=\"enable_playback_state_lists_summary\">பட்டியல்களில் இயக்கக குறியட நிலைகாட்டிகளைக் காட்டு</string>\n    <string name=\"start_main_player_fullscreen_summary\">துணையியக்கியில் காணொளிகளை துவக்காதே, ஆனால் தானாக சுழற்றல் பூட்டப்பட்டிருந்தால் நேரடியாக முழுதிரைக்குத் திரும்பு. முழுதிரையை வெளியேறி நீங்கள் இன்னும் துணையியக்கியை அணுகலாம்</string>\n    <string name=\"unsupported_url_dialog_message\">உரலியை அங்கீகரக்க முடியவில்லை. மற்றொரு செயலியில் திறக்கவா\\?</string>\n    <string name=\"restricted_video\">இக்காணொளி வயது வரம்புக்குட்டபட்டது.\n\\n\n\\nஇதைக் காண வேண்டுமெனில் அமைவில் \\\"%1$s\\\"ஐ இயக்கு.</string>\n    <string name=\"error_report_channel_name\">பிழையறிக்கை அறிவிப்பு</string>\n    <string name=\"player_stream_failure\">இப்பாய்வினை இயக்க முடியவில்லை</string>\n    <string name=\"player_unrecoverable_failure\">மீட்கவியலாத இயக்கி பிழை ஏற்பட்டது</string>\n    <string name=\"error_report_notification_toast\">பிழை ஏற்பட்டது, அறிவிப்பைப் பார்</string>\n    <string name=\"player_recoverable_failure\">இயக்கி பிழையிலிருந்து மீளப்பெறுகிறது</string>\n    <string name=\"invalid_file\">கோப்பு இல்லை அ அதனை எழுதபடிக்கும் அனுமதி குறைகிறது</string>\n    <string name=\"no_streams_available_download\">பதிவிறக்கா எப்பாய்வும் கிடைக்கவில்லை</string>\n    <string name=\"saved_tabs_invalid_json\">சேமித்த தாவல்களை வாசிக்க முடியவில்லை, ஆக இயல்பிருப்புகளைப் பயன்படுத்துகிறது</string>\n    <string name=\"error_report_open_issue_button_text\">GitHub இல் புகாரளி</string>\n    <string name=\"external_player_unsupported_link_type\">இவ்வகை தொடுப்புகளைப் புற இயக்கிகள் ஆதரக்கா</string>\n    <string name=\"copy_for_github\">வடிவமைக்கப்பட்ட அறிக்கையை நகலெடு</string>\n    <string name=\"permission_display_over_apps\">பிற செயலிகள் மீது காட்டும் அனுமதி கொடு</string>\n    <string name=\"preferred_player_fetcher_notification_message\">கோரிய உள்ளடக்கத்தை ஏற்றுகிறது</string>\n    <string name=\"auto\">தானாக</string>\n    <string name=\"night_theme_summary\">உம் அபிமான இருண்ட தோற்றத்தைத் தேர்ந்தெடு — %s</string>\n    <string name=\"close\">மூடு</string>\n    <string name=\"preferred_player_fetcher_notification_title\">தகவலைப் பெறுகிறது…</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s பதிவிறக்கம் அழிக்கபட்டது</item>\n        <item quantity=\"other\">%1$s பதிவிறக்கங்கள் அழிக்கபட்டன</item>\n    </plurals>\n    <string name=\"msg_copied\">நகலகத்திற்கு நகலெடுக்கபட்டது</string>\n    <string name=\"app_language_title\">செயலியின் மொழி</string>\n    <string name=\"no_dir_yet\">பதிவிறக்க அடைவு இன்னும் அமைக்கப்படவில்லை, இப்போதைக்கு இயல்பிருப்பு பதிவிறக்க அடைவைத் தெரிவுசெய்</string>\n    <string name=\"download_already_pending\">இப்பெயருடன் ஒரு பதிவிறக்கம் நிலுவையிலுள்ளது</string>\n    <string name=\"no_available_dir\">பின்னர் பதிவிறக்க அடைவை அமைவில் வரையறுக்கவும்</string>\n    <string name=\"settings_category_downloads_title\">பதிவிறக்கம்</string>\n    <string name=\"max_retry_desc\">பதிவிறக்கத்தை ரத்துசெய்வதற்கு முன் செய்யவேண்டிய அதிகபட்ச முயற்சிகள்</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">பதிவிறக்கம் முடிந்தது</item>\n        <item quantity=\"other\">%s பதிவிறக்கங்கள் முடிந்தன</item>\n    </plurals>\n    <string name=\"download_already_running\">இப்பெயருடன் ஒரு பதிவிறக்கம் நடைபெறுகிறது</string>\n    <string name=\"updates_setting_description\">புதிய பதிப்பு கிடைத்தால் செயலி புதுப்பிப்பு பற்றி நினைப்பூட்ட ஓர் அறிவிப்பைக் காட்டு</string>\n    <string name=\"show_thumbnail_summary\">பூட்டுத்திரைப் பின்புலத்திற்கும் அறிவிப்புகளுக்கும் சிறுபடத்தைப் பயன்படுத்து</string>\n    <string name=\"main_page_content\">முகப்புப்பக்க உள்ளடக்கம்</string>\n    <string name=\"select_night_theme_toast\">உம் அபிமான இருண்ட தோற்றத்தைக் கீழே தேர்ந்தெடுக்கலாம்</string>\n    <string name=\"error_download_resource_gone\">இப்பதிவிறக்கத்தை மீட்டெடுக்க முடியவில்லை</string>\n    <string name=\"main_page_content_swipe_remove\">உருப்படிகளை அகற்ற அவற்றைத் தேய்</string>\n    <string name=\"create_error_notification\">பிழை அறிவிப்பைப் படை</string>\n    <string name=\"app_update_available_notification_title\">NewPipe புதுப்பிப்பு கிடைக்கிறது!</string>\n    <string name=\"wifi_only\">அருகலையில் மட்டும்</string>\n    <string name=\"never\">ஒருபோதுமில்லை</string>\n    <string name=\"list_view_mode\">பட்டியல் பார்வை முறை</string>\n    <string name=\"overwrite_finished_warning\">இப்பெயருடன் ஏற்கனவே ஒரு பதிவிறக்கிய கோப்பு உள்ளது</string>\n    <string name=\"delete_downloaded_files\">பதிவிறக்கிய கோப்புகளை நீக்கு</string>\n    <string name=\"systems_language\">இயங்குதள இயல்பிருப்பு</string>\n    <string name=\"show_thumbnail_title\">சிறுபடங்காட்டு</string>\n    <string name=\"auto_device_theme_title\">தானியங்கி (சாதன தோற்றம்)</string>\n    <string name=\"enqueue_next_stream\">அடுத்தைச் சாரைபடுத்து</string>\n    <string name=\"enqueued_next\">அடுத்தது சாரைபடுத்தப்பட்டது</string>\n    <string name=\"rename_playlist\">மறுபெயரிடு</string>\n    <string name=\"no_playlist_bookmarked_yet\">ஒளிச்சர நூற்குறிகள் இன்னுமில</string>\n    <string name=\"unbookmark_playlist\">நூற்குறியை நீக்கு</string>\n    <string name=\"set_as_playlist_thumbnail\">ஒளிச்சர சிறுபடமாக அமை</string>\n    <string name=\"playlist_creation_success\">ஒளிச்சரம் படைக்கப்பட்டது</string>\n    <string name=\"settings_file_replacement_character_title\">மாற்றீடு வரியுரு</string>\n    <string name=\"playlist_page_summary\">ஒளிச்சரப் பக்கம்</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">ஒன்றிணைக்கா சந்தாக்களை மட்டும் காட்டு</string>\n    <string name=\"import_settings\">அமைவையும் இறக்குமதி செய்யவா\\?</string>\n    <string name=\"start_here_on_background\">பின்னணியில் இயங்கத் துவங்கு</string>\n    <string name=\"start_here_on_popup\">பாப்அப்பில் இயங்கத் துவங்கு</string>\n    <string name=\"show_channel_details\">பதிவுத்தட விவரங்களைக் காட்டு</string>\n    <string name=\"select_a_playlist\">ஒளிச்சரத்தைத் தேர்ந்தெடு</string>\n    <string name=\"add_to_playlist\">ஒளிச்சரத்தில் சேர்</string>\n    <string name=\"bookmark_playlist\">ஒளிச்சரத்தை நூற்குறி</string>\n    <string name=\"playlist_add_stream_success\">ஒளிச்சரமிடப்பட்டது</string>\n    <string name=\"playlist_no_uploader\">தானாக-உண்டான (பதிவேற்றி எதுவுமில்லை)</string>\n    <string name=\"hold_to_append\">சாரைபடுத்த நீண்டழுத்து</string>\n    <string name=\"enqueue_stream\">சாரைபடுத்து</string>\n    <string name=\"no_channel_subscribed_yet\">எப்பதிவுத்தட சந்தாக்களுமில்லை</string>\n    <string name=\"play_queue_audio_settings\">ஒலியமைவு</string>\n    <string name=\"create_playlist\">புதிய ஒளிச்சரம்</string>\n    <string name=\"subscriptions_import_unsuccessful\">சந்தாக்களை இறக்குமதி செய்ய முடியவில்லை</string>\n    <string name=\"playlist_thumbnail_change_success\">ஒளிச்சர சிறுபடம் மாறியது.</string>\n    <string name=\"settings_file_charset_title\">கோப்புப்பெயர்களில் அனுமதிக்கப்பட்ட வரியுருக்கள்</string>\n    <string name=\"delete_playlist_prompt\">இந்த ஒளிச்சரத்தை அழிக்கவா\\?</string>\n    <string name=\"enqueued\">சாரைபடுத்தப்பட்டது</string>\n    <string name=\"subscriptions_export_unsuccessful\">சந்தாக்களை ஏற்றுமதி செய்ய முடியவில்லை</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">சந்தாக்களைத் தேர்ந்தெடு</string>\n    <string name=\"settings_file_replacement_character_summary\">செல்லா வரியுருக்கள் இம்மதிப்புடன் மாற்றீடுசெய்யப்படும்</string>\n    <string name=\"preferred_open_action_settings_title\">நயமான \\'திற\\' செயல்</string>\n    <string name=\"progressive_load_interval_title\">பின்னணி சுழற்சியின் கால அளவு</string>\n    <string name=\"settings_category_player_notification_title\">பிளேயர் அறிவிப்பு</string>\n    <string name=\"settings_category_player_notification_summary\">தற்போதைய இயங்கும் ஸ்ட்ரீம் அறிவிப்பை உள்ளமைக்கவும்</string>\n    <string name=\"show_hold_to_append_summary\">\\\"விவரங்கள்:\\\" வீடியோவில் பின்னணி அல்லது பாப்அப் பட்டனை அழுத்தும் போது உதவிக்குறிப்பைக் காட்டு</string>\n    <string name=\"auto_queue_summary\">தொடர்புடைய ஸ்ட்ரீமைச் சேர்ப்பதன் மூலம் (மீண்டும் நிகழாத) பிளேபேக் வரிசையைத் தொடரவும்</string>\n    <string name=\"progressive_load_interval_summary\">முற்போக்கான உள்ளடக்கங்களில் (தற்போது %s) சுமை இடைவெளி அளவை மாற்றவும். குறைந்த மதிப்பு அவற்றின் ஆரம்ப ஏற்றுதலை விரைவுபடுத்தக்கூடும்</string>\n    <string name=\"show_age_restricted_content_summary\">வயது வரம்பு (18+ போன்ற) இருப்பதால், குழந்தைகளுக்குப் பொருத்தமற்ற உள்ளடக்கத்தைக் காட்டு</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube \\\"கட்டுப்படுத்தப்பட்ட பயன்முறையை\\\" வழங்குகிறது, இது முதிர்ந்த உள்ளடக்கத்தை மறைக்கிறது</string>\n    <string name=\"notifications\">அறிவிப்புகள்</string>\n    <string name=\"hash_channel_name\">வீடியோ ஹாஷ் அறிவிப்பு</string>\n    <string name=\"streams_notification_channel_name\">புதிய நீரோடைகள்</string>\n    <string name=\"hash_channel_description\">வீடியோ ஹேஷிங் முன்னேற்றத்திற்கான அறிவிப்புகள்</string>\n    <string name=\"streams_notification_channel_description\">சந்தாவுக்கான புதிய ஸ்ட்ரீம்கள் பற்றிய அறிவிப்புகள்</string>\n    <string name=\"restricted_video_no_stream\">இந்த வீடியோ வயது வரம்புக்குட்பட்டது.\n\\nவயது வரம்புக்குட்பட்ட வீடியோக்கள் கொண்ட புதிய YouTube கொள்கைகள் காரணமாக, NewPipe ஆல் அதன் எந்த வீடியோ ஸ்ட்ரீம்களையும் அணுக முடியாது, இதனால் அதை இயக்க முடியவில்லை.</string>\n    <string name=\"fast_mode\">வேகமான பயன்முறை</string>\n    <string name=\"yes\">ஆம்</string>\n    <string name=\"no\">இல்லை</string>\n    <string name=\"delete_downloaded_files_confirm\">வட்டில் இருக்கும் பதிவிறக்கம் செய்யப்பட்ட அனைத்து கோப்புகளையும் அழிக்கவா?</string>\n    <string name=\"feed_group_dialog_delete_message\">இந்தக் குழுவை நீக்க வேண்டுமா?</string>\n    <string name=\"delete\">நீக்கு</string>\n    <string name=\"one_item_deleted\">ஒரு உருப்படி நீக்கப்பட்டது.</string>\n    <string name=\"read_privacy_policy\">தனியுரிமைக் கொள்கையைப் படியுங்கள்</string>\n    <string name=\"error_unknown_host\">சேவையகத்தைக் கண்டுபிடிக்க முடியவில்லை</string>\n    <string name=\"drawer_header_description\">சேவையை மாற்றி, தற்போது தேர்ந்தெடுக்கப்பட்டது:</string>\n    <string name=\"caption_none\">தலைப்புகள் இல்லை</string>\n    <string name=\"feed_groups_header_title\">சேனல் குழுக்கள்</string>\n    <string name=\"left_gesture_control_summary\">பிளேயர் திரையின் இடது பாதிக்கு சைகையைத் தேர்வுசெய்க</string>\n    <string name=\"msg_popup_permission\">இந்த இசைவு தேவை\\n பாப்அப் பயன்முறையில் திறக்கவும்</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d மணித்துளி</item>\n        <item quantity=\"other\">%d நிமிடங்கள்</item>\n    </plurals>\n    <string name=\"feed_show_watched\">முழுமையாகப் பார்த்தேன்</string>\n    <string name=\"feed_notification_loading\">ஏற்றுதல் தீவனம்…</string>\n    <string name=\"no_one_listening\">யாரும் கேட்கவில்லை</string>\n    <string name=\"recaptcha_solve\">தீர்க்க</string>\n    <string name=\"view_on_github\">கிட்அப்பில் காண்க</string>\n    <string name=\"donation_title\">நன்கொடை</string>\n    <string name=\"audio_track\">ஆடியோ டிராக்</string>\n    <string name=\"resize_fill\">நிரப்பவும்</string>\n    <string name=\"resize_zoom\">பெரிதாக்கு</string>\n    <string name=\"import_soundcloud_instructions_hint\">YourID, SoundCloud.com/yourid</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d நாள்</item>\n        <item quantity=\"other\">%d நாட்கள்</item>\n    </plurals>\n    <string name=\"unknown_audio_track\">தெரியவில்லை</string>\n    <string name=\"recaptcha_request_toast\">ரெக்காப்ட்சா அறைகூவல் கோரப்பட்டது</string>\n    <string name=\"website_title\">வலைத்தளம்</string>\n    <string name=\"read_full_license\">உரிமத்தைப் படியுங்கள்</string>\n    <string name=\"new_and_hot\">புதிய மற்றும் சூடான</string>\n    <string name=\"show_error_snackbar\">பிழை சிற்றுண்டியைக் காட்டு</string>\n    <string name=\"playback_step\">படி</string>\n    <string name=\"app_update_available_notification_text\">%s பதிவிறக்க தட்டவும்</string>\n    <string name=\"settings_category_feed_title\">தீவனம்</string>\n    <string name=\"metadata_privacy_private\">தனிப்பட்ட</string>\n    <string name=\"brightness\">ஒளி</string>\n    <string name=\"main_tabs_position_summary\">முதன்மையான தாவல் தேர்வாளரை கீழே நகர்த்தவும்</string>\n    <string name=\"checksum\">செக்சம்</string>\n    <string name=\"title_activity_recaptcha\">ரெக்காப்ட்சா அறைகூவல்</string>\n    <string name=\"subtitle_activity_recaptcha\">தீர்க்கும்போது \\\"முடிந்தது\\\" என்பதை அழுத்தவும்</string>\n    <string name=\"done\">முடிந்தது</string>\n    <string name=\"privacy_policy_title\">நியூபைப்பின் தனியுரிமைக் கொள்கை</string>\n    <string name=\"faq_title\">அடிக்கடி கேட்கப்படும் கேள்விகள்</string>\n    <string name=\"top_50\">முதல் 50</string>\n    <string name=\"loading_stream_details\">ச்ட்ரீம் விவரங்களை ஏற்றுகிறது…</string>\n    <string name=\"duplicate_in_playlist\">சாம்பல் நிறமாக இருக்கும் பிளேலிச்ட்களில் ஏற்கனவே இந்த உருப்படி உள்ளது.</string>\n    <string name=\"playback_speed_control\">பின்னணி வேக கட்டுப்பாடுகள்</string>\n    <string name=\"list\">பட்டியல்</string>\n    <string name=\"seekbar_preview_thumbnail_title\">சீக்பர் சிறுபடம் முன்னோட்டம்</string>\n    <string name=\"high_quality_larger\">உயர் தகுதி (பெரியது)</string>\n    <string name=\"missions_header_finished\">முடிந்தது</string>\n    <string name=\"missions_header_pending\">நிலுவையில் உள்ளது</string>\n    <string name=\"paused\">இடைநிறுத்தப்பட்டது</string>\n    <string name=\"error_http_unsupported_range\">சேவையகம் பல திரிக்கப்பட்ட பதிவிறக்கங்களை ஏற்காது, @சரம்/msg_threads = 1 உடன் மீண்டும் முயற்சிக்கவும்</string>\n    <string name=\"error_postprocessing_failed\">பிந்தைய செயலாக்கம் தோல்வியடைந்தது</string>\n    <string name=\"enable_queue_limit\">பதிவிறக்க வரிசையை கட்டுப்படுத்துங்கள்</string>\n    <string name=\"enable_queue_limit_desc\">ஒரு பதிவிறக்கம் ஒரே நேரத்தில் இயங்கும்</string>\n    <string name=\"no_app_to_open_intent\">உங்கள் சாதனத்தில் எந்த பயன்பாடும் இதைத் திறக்க முடியாது</string>\n    <string name=\"metadata_subchannel_avatars\">துணை சேனல் அவதாரங்கள்</string>\n    <string name=\"metadata_avatars\">அவதாரங்கள்</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">எக்சோப்ளேயர் இயல்புநிலை</string>\n    <string name=\"notifications_disabled\">அறிவிப்புகள் முடக்கப்பட்டுள்ளன</string>\n    <string name=\"feed_show_partially_watched\">ஓரளவு பார்த்தேன்</string>\n    <string name=\"channel_tab_playlists\">பிளேலிச்ட்கள்</string>\n    <string name=\"channel_tab_albums\">ஆல்பம்</string>\n    <string name=\"toggle_fullscreen\">மாற்று முழுத்திரை</string>\n    <string name=\"play\">விளையாடுங்கள்</string>\n    <string name=\"image_quality_none\">படங்களை ஏற்ற வேண்டாம்</string>\n    <string name=\"image_quality_low\">குறைந்த தகுதி</string>\n    <string name=\"image_quality_medium\">நடுத்தர தகுதி</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist\">பிளேலிச்ட்டைப் பகிரவும்</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"share_playlist_content_details\">%1$s\\n %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s பதில்</item>\n        <item quantity=\"other\">%s பதில்கள்</item>\n    </plurals>\n    <string name=\"feed_update_threshold_summary\">சந்தா காலாவதியானதாகக் கருதப்படுவதற்கு முன் கடைசி புதுப்பிப்புக்குப் பிறகு நேரம் - %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">சேனலின் அவதார் சிறுபடம்</string>\n    <string name=\"unknown_format\">தெரியாத வடிவம்</string>\n    <string name=\"unknown_quality\">அறியப்படாத தகுதி</string>\n    <string name=\"recent\">அண்மைக் கால</string>\n    <string name=\"chapters\">பாடங்கள்</string>\n    <string name=\"metadata_age_limit\">அகவை வரம்பு</string>\n    <string name=\"import_youtube_instructions\">கூகிள் டேக்அவுட்டிலிருந்து YouTube சந்தாக்களை இறக்குமதி செய்க:\\n\\n 1. இந்த முகவரி க்குச் செல்லுங்கள்: %1$s\\n 2. கேட்டபோது உள்நுழைக\\n 3. \\\"அனைத்து தரவுகளும் சேர்க்கப்பட்டுள்ளன\\\" என்பதைக் சொடுக்கு செய்க, பின்னர் \\\"அனைத்தையும் தேர்வு செய்யுங்கள்\\\", பின்னர் \\\"சந்தாக்கள்\\\" மட்டுமே தேர்ந்தெடுத்து \\\"சரி\\\" என்பதைக் சொடுக்கு செய்க\\n 4. \\\"அடுத்த படி\\\" என்பதைக் சொடுக்கு செய்து, பின்னர் \\\"ஏற்றுமதி உருவாக்கு\\\"\\n 5. \\\"பதிவிறக்கு\\\" பொத்தானைக் சொடுக்கு செய்த பிறகு சொடுக்கு செய்க\\n 6. கீழே உள்ள இறக்குமதி கோப்பைக் சொடுக்கு செய்து பதிவிறக்கம் செய்யப்பட்ட .zip கோப்பைத் தேர்ந்தெடுக்கவும்\\n 7.[.zip இறக்குமதி தோல்வியடைந்தால்] .csv கோப்பை பிரித்தெடுக்கவும் (வழக்கமாக \\\"YouTube மற்றும் YouTube Music/subscriptions/subscriptions.csv\\\" என்பதன் கீழ்), கீழே உள்ள IMPORT FILE என்பதைக் கிளிக் செய்து, பிரித்தெடுக்கப்பட்ட csv கோப்பைத் தேர்ந்தெடு</string>\n    <string name=\"remove_watched_popup_warning\">பிளேலிச்ட்டில் சேர்க்கப்படுவதற்கு முன்னும் பின்னும் பார்க்கப்பட்ட வீடியோக்கள் அகற்றப்படும்.\\n நீங்கள் உறுதியாக இருக்கிறீர்களா? இதை செயல்தவிர்க்க முடியாது!</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">இந்த செயலுக்கு பொருத்தமான கோப்பு மேலாளர் எதுவும் கிடைக்கவில்லை.\\n சேமிப்பக அணுகல் கட்டமைப்பு இணக்கமான கோப்பு மேலாளரை நிறுவவும்</string>\n    <string name=\"audio_track_type_secondary\">இரண்டாம் நிலை</string>\n    <string name=\"channel_tab_shorts\">குறுக்குகள்</string>\n    <string name=\"show_channel_tabs_summary\">சேனல் பக்கங்களில் என்ன தாவல்கள் காட்டப்பட்டுள்ளன</string>\n    <string name=\"open_play_queue\">திறந்த விளையாட்டு வரிசை</string>\n    <string name=\"toggle_screen_orientation\">திரை நோக்குநிலையை மாற்றவும்</string>\n    <string name=\"forward\">முன்னோக்கி</string>\n    <string name=\"image_quality_title\">பட தகுதி</string>\n    <string name=\"image_quality_high\">உயர் தகுதி</string>\n    <string name=\"more_options\">மேலும் விருப்பங்கள்</string>\n    <string name=\"duration\">காலம்</string>\n    <string name=\"rewind\">முன்னாடி</string>\n    <string name=\"share_playlist_with_titles\">தலைப்புகளுடன் பகிர்ந்து கொள்ளுங்கள்</string>\n    <string name=\"share_playlist_with_list\">முகவரி பட்டியலைப் பகிரவும்</string>\n    <string name=\"show_more\">மேலும் காட்டு</string>\n    <string name=\"show_less\">குறைவாகக் காட்டு</string>\n    <string name=\"error_postprocessing_stopped\">கோப்பில் பணிபுரியும் போது நியூபைப் மூடப்பட்டது</string>\n    <string name=\"on\">ஆன்</string>\n    <string name=\"max_retry_msg\">அதிகபட்ச முயற்சிகள்</string>\n    <string name=\"metadata_tags\">குறிச்சொற்கள்</string>\n    <string name=\"default_kiosk_page_summary\">இயல்புநிலை கியோச்க்</string>\n    <string name=\"channel_page_summary\">சேனல் பக்கம்</string>\n    <string name=\"select_a_channel\">ஒரு சேனலைத் தேர்ந்தெடுக்கவும்</string>\n    <string name=\"could_not_import_all_files\">எச்சரிக்கை: எல்லா கோப்புகளையும் இறக்குமதி செய்ய முடியவில்லை.</string>\n    <string name=\"video_player\">வீடியோ பிளேயர்</string>\n    <string name=\"mute\">முடக்கு</string>\n    <string name=\"dont_show\">காட்ட வேண்டாம்</string>\n    <string name=\"start_downloads\">பதிவிறக்கங்களைத் தொடங்குங்கள்</string>\n    <string name=\"pause_downloads\">பதிவிறக்கங்களை இடைநிறுத்தவும்</string>\n    <string name=\"downloads_storage_ask_title\">எங்கு பதிவிறக்கம் செய்வது என்று கேளுங்கள்</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s புதிய ச்ட்ரீம்</item>\n        <item quantity=\"other\">%s புதிய நீரோடைகள்</item>\n    </plurals>\n    <string name=\"sort\">வரிசைப்படுத்து</string>\n    <string name=\"audio_track_type_original\">அசல்</string>\n    <string name=\"audio_track_type_dubbed\">டப்பிங்</string>\n    <string name=\"prefer_original_audio_title\">அசல் ஆடியோவை விரும்புங்கள்</string>\n    <string name=\"stop\">நிறுத்து</string>\n    <string name=\"featured\">இடம்பெற்றது</string>\n    <string name=\"remove_duplicates\">நகல்களை அகற்று</string>\n    <string name=\"remove_watched_popup_title\">பார்த்த வீடியோக்களை அகற்றவா?</string>\n    <string name=\"remove_duplicates_title\">நகல்களை அகற்றவா?</string>\n    <string name=\"remove_duplicates_message\">இந்த பிளேலிச்ட்டில் உள்ள அனைத்து நகல் நீரோடைகளையும் அகற்ற விரும்புகிறீர்களா?</string>\n    <string name=\"feed_new_items\">புதிய தீவன உருப்படிகள்</string>\n    <string name=\"feed_group_dialog_empty_name\">வெற்று குழு பெயர்</string>\n    <string name=\"feed_update_threshold_title\">உணவுப் புதுப்பிப்பு வாசல்</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">வேகமான பயன்முறையை இயக்கவும்</string>\n    <string name=\"feed_hide_streams_title\">பின்வரும் நீரோடைகளைக் காட்டு</string>\n    <string name=\"feed_show_hide_streams\">ச்ட்ரீம்களைக் காட்டு/மறைக்க</string>\n    <string name=\"georestricted_content\">இந்த உள்ளடக்கம் உங்கள் நாட்டில் கிடைக்கவில்லை.</string>\n    <string name=\"give_back\">திருப்பித் தரவும்</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">ஆம், மற்றும் ஓரளவு பார்த்த வீடியோக்கள்</string>\n    <string name=\"feed_oldest_subscription_update\">கடைசியாக புதுப்பிக்கப்பட்டது: %s</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s கேட்பவர்</item>\n        <item quantity=\"other\">%s கேட்போர்</item>\n    </plurals>\n    <string name=\"import_settings_vulnerable_format\">ஏற்றுமதியில் இறக்குமதி செய்யப்படும் அமைப்புகள் பாதிக்கப்படக்கூடிய வடிவமைப்பைப் பயன்படுத்துகின்றன, இது நியூபைப் 0.27.0 முதல் நீக்கப்பட்டது. இறக்குமதி செய்யப்படும் ஏற்றுமதி நம்பகமான மூலத்திலிருந்து வந்தது என்பதை உறுதிப்படுத்திக் கொள்ளுங்கள், மேலும் நியூபைப் 0.27.0 அல்லது எதிர்காலத்தில் புதியதாக பெறப்பட்ட ஏற்றுமதியை மட்டுமே பயன்படுத்த விரும்புகிறது. இந்த பாதிக்கப்படக்கூடிய வடிவத்தில் அமைப்புகளை இறக்குமதி செய்வதற்கான உதவி விரைவில் முழுமையாக அகற்றப்படும், பின்னர் நியூபைப்பின் பழைய பதிப்புகள் புதிய பதிப்புகளிலிருந்து ஏற்றுமதியின் அமைப்புகளை இனி இறக்குமதி செய்ய முடியாது.</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d இரண்டாவது</item>\n        <item quantity=\"other\">%d விநாடிகள்</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d மணி</item>\n        <item quantity=\"other\">%d மணிநேரம்</item>\n    </plurals>\n    <string name=\"import_subscriptions_hint\">3-டாட் மெனுவிலிருந்து சந்தாக்களை இறக்குமதி செய்யுங்கள் அல்லது ஏற்றுமதி செய்யுங்கள்</string>\n    <string name=\"dismiss\">தள்ளுபடி</string>\n    <string name=\"msg_calculating_hash\">ஆச் கணக்கிடுதல்</string>\n    <string name=\"msg_wait\">தயவுசெய்து காத்திருங்கள்…</string>\n    <string name=\"local\">உள்ளக</string>\n    <string name=\"always_ask_open_action\">எப்போதும் கேளுங்கள்</string>\n    <string name=\"caption_setting_title\">தலைப்புகள்</string>\n    <string name=\"playback_reset\">மீட்டமை</string>\n    <string name=\"accept\">ஏற்றுக்கொள்</string>\n    <string name=\"updates_setting_title\">புதுப்பிப்புகள்</string>\n    <string name=\"minimize_on_exit_popup_description\">பாப்அப் பிளேயருக்குக் குறைக்கவும்</string>\n    <string name=\"overwrite_unrelated_warning\">இந்த பெயருடன் ஒரு கோப்பு ஏற்கனவே உள்ளது</string>\n    <string name=\"error_file_creation\">கோப்பை உருவாக்க முடியாது</string>\n    <string name=\"error_path_creation\">இலக்கு கோப்புறையை உருவாக்க முடியாது</string>\n    <string name=\"error_connect_host\">சேவையகத்துடன் இணைக்க முடியாது</string>\n    <string name=\"error_progress_lost\">முன்னேற்றம் இழந்தது, ஏனெனில் கோப்பு நீக்கப்பட்டது</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'சேமிப்பக அணுகல் கட்டமைப்பு\\' வெளிப்புற எச்டி கார்டுக்கு பதிவிறக்கங்களை அனுமதிக்கிறது</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">ஆண்ட்ராய்டு 10 இலிருந்து தொடங்கி \\'சேமிப்பக அணுகல் கட்டமைப்பு\\' மட்டுமே ஆதரிக்கப்படுகிறது</string>\n    <string name=\"feed_load_error\">ஊட்டத்தை ஏற்றுதல்</string>\n    <string name=\"channel_created_by\">%s ஆல் உருவாக்கப்பட்டது</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">ஊட்டத்தை புதுப்பிக்கும்போது பெற தாவல்கள். வேகமான பயன்முறையைப் பயன்படுத்தி ஒரு சேனல் புதுப்பிக்கப்பட்டால் இந்த விருப்பம் எந்த விளைவையும் ஏற்படுத்தாது.</string>\n    <string name=\"tablet_mode_title\">டேப்லெட் பயன்முறை</string>\n    <string name=\"off\">அணை</string>\n    <string name=\"no_audio_streams_available_for_external_players\">வெளிப்புற வீரர்களுக்கு ஆடியோ ச்ட்ரீம்கள் எதுவும் கிடைக்கவில்லை</string>\n    <string name=\"select_quality_external_players\">வெளிப்புற வீரர்களுக்கான தரத்தைத் தேர்ந்தெடுக்கவும்</string>\n    <string name=\"feed_show_upcoming\">வரவிருக்கும்</string>\n    <string name=\"no_videos\">வீடியோக்கள் இல்லை</string>\n    <string name=\"resize_fit\">பொருத்தம்</string>\n    <string name=\"grid\">வலைவாய்</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"notification_actions_summary_android13\">ஒவ்வொரு அறிவிப்பு செயலையும் தட்டுவதன் மூலம் அதைத் தட்டவும். முதல் மூன்று செயல்கள் (நாடகம்/இடைநிறுத்தம், முந்தைய மற்றும் அடுத்தவை) கணினியால் அமைக்கப்பட்டன, மேலும் அவை தனிப்பயனாக்க முடியாது.</string>\n    <string name=\"ignore_hardware_media_buttons_title\">வன்பொருள் மீடியா பொத்தான் நிகழ்வுகளை புறக்கணிக்கவும்</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">உதாரணமாக, நீங்கள் உடைந்த உடல் பொத்தான்களுடன் எட்செட் பயன்படுத்துகிறீர்கள் என்றால் பயனுள்ளதாக இருக்கும்</string>\n    <string name=\"prefer_original_audio_summary\">மொழியைப் பொருட்படுத்தாமல் அசல் ஆடியோ டிராக்கைத் தேர்ந்தெடுக்கவும்</string>\n    <string name=\"prefer_descriptive_audio_title\">விளக்க ஆடியோவை விரும்புங்கள்</string>\n    <string name=\"prefer_descriptive_audio_summary\">கிடைத்தால் பார்வையற்றவர்களுக்கு விளக்கங்களுடன் ஆடியோ டிராக்கைத் தேர்ந்தெடுக்கவும்</string>\n    <string name=\"left_gesture_control_title\">இடது சைகை நடவடிக்கை</string>\n    <string name=\"right_gesture_control_summary\">பிளேயர் திரையின் வலது பாதிக்கு சைகையைத் தேர்வுசெய்க</string>\n    <string name=\"right_gesture_control_title\">சரியான சைகை நடவடிக்கை</string>\n    <string name=\"volume\">தொகுதி</string>\n    <string name=\"none\">எதுவுமில்லை</string>\n    <string name=\"settings_category_backup_restore_title\">காப்புப்பிரதி மற்றும் மீட்டமை</string>\n    <string name=\"loading_metadata_title\">மெட்டாடேட்டாவை ஏற்றுகிறது…</string>\n    <string name=\"main_tabs_position_title\">முதன்மையான தாவல்கள் நிலை</string>\n    <string name=\"error_report_open_github_notice\">உங்கள் விபத்து பற்றி விவாதிக்கும் சிக்கல் ஏற்கனவே இருக்கிறதா என்று சரிபார்க்கவும். நகல் டிக்கெட்டுகளை உருவாக்கும்போது, உண்மையான பிழையை சரிசெய்ய நாங்கள் செலவழிக்கக்கூடிய எங்களிடமிருந்து நீங்கள் நேரத்தை எடுத்துக்கொள்கிறீர்கள்.</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">பதிவேற்றியவரின் அவதார் சிறுபடம்</string>\n    <string name=\"more_than_100_videos\">100+ வீடியோக்கள்</string>\n    <string name=\"infinite_videos\">வீடியோக்கள்</string>\n    <string name=\"no_comments\">கருத்துகள் இல்லை</string>\n    <string name=\"comments_are_disabled\">கருத்துகள் முடக்கப்பட்டுள்ளன</string>\n    <string name=\"no_streams\">நீரோடைகள் இல்லை</string>\n    <string name=\"no_live_streams\">நேரடி நீரோடைகள் இல்லை</string>\n    <string name=\"start\">தொடங்கு</string>\n    <string name=\"pause\">இடைநிறுத்தம்</string>\n    <string name=\"create\">உருவாக்கு</string>\n    <string name=\"rename\">மறுபெயரிடுங்கள்</string>\n    <string name=\"msg_name\">கோப்புப்பெயர்</string>\n    <string name=\"msg_threads\">நூல்கள்</string>\n    <string name=\"msg_error\">பிழை</string>\n    <string name=\"msg_running\">நியூபைப் பதிவிறக்குதல்</string>\n    <string name=\"msg_running_detail\">விவரங்களுக்கு தட்டவும்</string>\n    <string name=\"msg_failed_to_copy\">இடைநிலைப்பலகைக்கு நகலெடுப்பதில் தோல்வி</string>\n    <string name=\"charset_letters_and_digits\">கடிதங்கள் மற்றும் இலக்கங்கள்</string>\n    <string name=\"charset_most_special_characters\">மிகவும் சிறப்பு எழுத்துக்கள்</string>\n    <string name=\"title_licenses\">மூன்றாம் தரப்பு உரிமங்கள்</string>\n    <string name=\"copyright\">© %1$s %2$s க்கு கீழ் %3$s க்கு கீழ்</string>\n    <string name=\"tab_licenses\">உரிமங்கள்</string>\n    <string name=\"app_description\">ஆண்ட்ராய்டு இல் லிப்ரே லைட்வெயிட் ச்ட்ரீமிங்.</string>\n    <string name=\"contribution_title\">பங்களிப்பு</string>\n    <string name=\"contribution_encouragement\">உங்களிடம் சிந்தனைகள் உள்ளதா; மொழிபெயர்ப்பு, வடிவமைப்பு மாற்றங்கள், குறியீடு தூய்மை அல்லது உண்மையான கனமான குறியீடு மாற்றங்கள் - உதவி எப்போதும் வரவேற்கத்தக்கது. மேலும் சிறப்பாகச் செய்யப்படுகிறது!</string>\n    <string name=\"donation_encouragement\">புதிய பயனர் அனுபவத்தை கொண்டு வரும் தன்னார்வலர்கள் தங்கள் இலவச நேரத்தை செலவழிப்பதன் மூலம் புதிய பாடத்தை உருவாக்கியுள்ளனர். உருவாக்குபவர்கள் ஒரு கப் காபியை அனுபவிக்கும் போது புதிய பக்கத்தை இன்னும் சிறப்பாக செய்ய உதவ உதவுகின்றன.</string>\n    <string name=\"website_encouragement\">மேலும் செய்தி மற்றும் செய்திகளுக்கு நியூபைப் வலைத்தளத்தைப் பார்வையிடவும்.</string>\n    <string name=\"privacy_policy_encouragement\">நியூபைப் திட்டம் உங்கள் தனியுரிமையை மிகவும் தீவிரமாக எடுத்துக்கொள்கிறது. எனவே, பயன்பாடு உங்கள் அனுமதியின்றி எந்த தரவையும் சேகரிக்காது.\\n நீங்கள் ஒரு செயலிழப்பு அறிக்கையை அனுப்பும்போது என்ன தரவு அனுப்பப்படுகிறது மற்றும் சேமிக்கப்படுகிறது என்பதை நியூபிப்பின் தனியுரிமைக் கொள்கை விரிவாக விளக்குகிறது.</string>\n    <string name=\"app_license_title\">நியூபைப்பின் உரிமம்</string>\n    <string name=\"app_license\">நியூபைப் என்பது நகலெடுக்கப்பட்ட லிப்ரே மென்பொருள்: நீங்கள் அதைப் பயன்படுத்தலாம், படிக்கலாம், பகிரலாம் மற்றும் மேம்படுத்தலாம். குறிப்பாக நீங்கள் இலவச மென்பொருள் அறக்கட்டளையால் வெளியிடப்பட்ட குனு பொது பொதுமக்கள் உரிமத்தின் விதிமுறைகளின் கீழ் மறுபகிர்வு மற்றும்/அல்லது மாற்றியமைக்கலாம், உரிமத்தின் பதிப்பு 3 அல்லது (உங்கள் விருப்பத்தில்) பின்னர் எந்தப் பதிப்பையும் மாற்றலாம்.</string>\n    <string name=\"faq_description\">பயன்பாட்டைப் பயன்படுத்துவதில் சிக்கல் இருந்தால், பொதுவான கேள்விகளுக்கு இந்த பதில்களைப் பார்க்கவும்!</string>\n    <string name=\"faq\">இணையதளத்தில் காண்க</string>\n    <string name=\"title_last_played\">கடைசியாக விளையாடியது</string>\n    <string name=\"title_most_played\">அதிகம் விளையாடியது</string>\n    <string name=\"main_page_content_summary\">என்ன தாவல்கள் முதன்மையான பக்கத்தில் காட்டப்பட்டுள்ளன</string>\n    <string name=\"blank_page_summary\">வெற்று பக்கம்</string>\n    <string name=\"kiosk_page_summary\">கியோச்க் பக்கம்</string>\n    <string name=\"select_a_kiosk\">ஒரு கியோச்கைத் தேர்ந்தெடுக்கவும்</string>\n    <string name=\"export_complete_toast\">ஏற்றுமதி</string>\n    <string name=\"import_complete_toast\">இறக்குமதி செய்யப்பட்டது</string>\n    <string name=\"no_valid_zip_file\">செல்லுபடியாகும் சிப் கோப்பு இல்லை</string>\n    <string name=\"override_current_data\">இது உங்கள் தற்போதைய அமைப்பை மேலெழுதும்.</string>\n    <string name=\"error_unable_to_load_comments\">கருத்துகளை ஏற்ற முடியவில்லை</string>\n    <string name=\"recently_added\">அண்மைக் காலத்தில் சேர்க்கப்பட்டது</string>\n    <string name=\"most_liked\">மிகவும் பிடித்தது</string>\n    <string name=\"conferences\">மாநாடுகள்</string>\n    <string name=\"title_activity_play_queue\">வரிசை விளையாடுங்கள்</string>\n    <string name=\"play_queue_remove\">அகற்று</string>\n    <string name=\"play_queue_stream_detail\">விவரங்கள்</string>\n    <string name=\"play_queue_audio_track\">ஆடியோ: %s</string>\n    <string name=\"drawer_open\">திறந்த அலமாரியை</string>\n    <string name=\"drawer_close\">மூடு டிராயர்</string>\n    <string name=\"preferred_open_action_settings_summary\">உள்ளடக்கத்தைத் திறக்கும்போது இயல்புநிலை செயல் - %s</string>\n    <string name=\"background_player\">பின்னணி பிளேயர்</string>\n    <string name=\"popup_player\">பாப்அப் பிளேயர்</string>\n    <string name=\"name\">பெயர்</string>\n    <string name=\"processing_may_take_a_moment\">செயலாக்கம்… ஒரு கணம் ஆகலாம்</string>\n    <string name=\"unmute\">ஊன்</string>\n    <string name=\"unset_playlist_thumbnail\">நிரந்தர சிறுபடம்</string>\n    <string name=\"playlist_add_stream_success_duplicate\">நகல் சேர்க்கப்பட்ட %d நேரம் (கள்)</string>\n    <string name=\"caption_auto_generated\">தானாக உருவாக்கிய</string>\n    <string name=\"caption_setting_description\">பிளேயர் தலைப்பு உரை அளவு மற்றும் பின்னணி பாணிகளை மாற்றவும். நடைமுறைக்கு வர பயன்பாட்டு மறுதொடக்கம் தேவை</string>\n    <string name=\"leak_canary_not_available\">கசிவு கிடைக்கவில்லை</string>\n    <string name=\"enable_leak_canary_summary\">நினைவக கசிவு கண்காணிப்பு குவியல் கொட்டும்போது பயன்பாடு பதிலளிக்காமல் இருக்கக்கூடும்</string>\n    <string name=\"show_memory_leaks\">நினைவக கசிவுகளைக் காட்டு</string>\n    <string name=\"enable_disposed_exceptions_title\">வாழ்நாள் முழுவதும் பிழைகள் புகாரளிக்கவும்</string>\n    <string name=\"enable_disposed_exceptions_summary\">அகற்றப்பட்ட பிறகு துண்டு அல்லது செயல்பாட்டு வாழ்க்கைச் சுழற்சிக்கு வெளியே வழங்க முடியாத ஆர்எக்ச் விதிவிலக்குகளை கட்டாயப்படுத்துதல்</string>\n    <string name=\"show_original_time_ago_title\">அசல் நேரத்திற்கு முன்பு உருப்படிகளில் காட்டு</string>\n    <string name=\"show_original_time_ago_summary\">சேவைகளிலிருந்து அசல் நூல்கள் ச்ட்ரீம் உருப்படிகளில் காணப்படும்</string>\n    <string name=\"disable_media_tunneling_title\">மீடியா சுரங்கப்பாதையை முடக்கு</string>\n    <string name=\"disable_media_tunneling_summary\">நீங்கள் ஒரு கருப்பு திரை அனுபவித்தால் அல்லது வீடியோ பிளேபேக்கில் திணறினால் மீடியா சுரங்கப்பாதையை முடக்கு.</string>\n    <string name=\"disable_media_tunneling_automatic_info\">உங்கள் சாதனத்தில் முன்னிருப்பாக மீடியா சுரங்கப்பாதை முடக்கப்பட்டது, ஏனெனில் உங்கள் சாதன மாதிரி அதை ஆதரிக்காது என்று அறியப்படுகிறது.</string>\n    <string name=\"show_crash_the_player_title\">\\\"வீரரை செயலிழக்க\\\" காட்டு</string>\n    <string name=\"show_crash_the_player_summary\">பிளேயரைப் பயன்படுத்தும் போது செயலிழப்பு விருப்பத்தைக் காட்டுகிறது</string>\n    <string name=\"check_new_streams\">புதிய நீரோடைகளுக்கு காசோலை இயக்கவும்</string>\n    <string name=\"crash_the_app\">பயன்பாட்டை செயலிழக்கச் செய்யுங்கள்</string>\n    <string name=\"import_title\">இறக்குமதி</string>\n    <string name=\"import_from\">இருந்து இறக்குமதி</string>\n    <string name=\"export_to\">ஏற்றுமதி</string>\n    <string name=\"import_ongoing\">இறக்குமதி…</string>\n    <string name=\"export_ongoing\">ஏற்றுமதி செய்கிறது…</string>\n    <string name=\"import_file_title\">கோப்பு இறக்குமதி</string>\n    <string name=\"previous_export\">முந்தைய ஏற்றுமதி</string>\n    <string name=\"import_soundcloud_instructions\">முகவரி அல்லது உங்கள் ஐடியை தட்டச்சு செய்வதன் மூலம் சவுண்ட்க்ளூட் சுயவிவரத்தை இறக்குமதி செய்க:\\n\\n 1. வலை உலாவியில் \\\"டெச்க்டாப் பயன்முறையை\\\" இயக்கவும் (மொபைல் சாதனங்களுக்கு தளம் கிடைக்கவில்லை)\\n 2. இந்த முகவரி க்குச் செல்லுங்கள்: %1$s\\n 3. கேட்டபோது உள்நுழைக\\n 4. நீங்கள் திருப்பி விடப்பட்ட சுயவிவர முகவரி ஐ நகலெடுக்கவும்.</string>\n    <string name=\"import_network_expensive_warning\">இந்த செயல்பாடு பிணையம் விலை உயர்ந்ததாக இருக்கும் என்பதை நினைவில் கொள்ளுங்கள்.\\n\\n நீங்கள் தொடர விரும்புகிறீர்களா?</string>\n    <string name=\"playback_tempo\">டெம்போ</string>\n    <string name=\"playback_pitch\">குனிவு</string>\n    <string name=\"unhook_checkbox\">அவலூக் (விலகலை ஏற்படுத்தக்கூடும்)</string>\n    <string name=\"skip_silence_checkbox\">ம .னத்தின் போது வேகமாக முன்னோக்கி</string>\n    <string name=\"percent\">விழுக்காடு</string>\n    <string name=\"semitone\">செமிடோன்</string>\n    <string name=\"start_accept_privacy_policy\">ஐரோப்பிய பொது தரவு பாதுகாப்பு ஒழுங்குமுறை (சிடிபிஆர்) உடன் இணங்குவதற்காக, நியூபைப்பின் தனியுரிமைக் கொள்கைக்கு இதன்மூலம் உங்கள் கவனத்தை ஈர்க்கிறோம். தயவுசெய்து அதை கவனமாகப் படியுங்கள்.\\n பிழை அறிக்கையை எங்களுக்கு அனுப்ப நீங்கள் அதை ஏற்றுக்கொள்ள வேண்டும்.</string>\n    <string name=\"decline\">வீழ்ச்சி</string>\n    <string name=\"enable_streams_notifications_title\">புதிய ச்ட்ரீம்கள் அறிவிப்புகள்</string>\n    <string name=\"enable_streams_notifications_summary\">சந்தாக்களிலிருந்து புதிய ச்ட்ரீம்கள் பற்றி அறிவிக்கவும்</string>\n    <string name=\"streams_notifications_interval_title\">அதிர்வெண் சரிபார்க்கிறது</string>\n    <string name=\"streams_notifications_network_title\">தேவையான பிணைய இணைப்பு</string>\n    <string name=\"any_network\">எந்த பிணையமும்</string>\n    <string name=\"check_for_updates\">புதுப்பிப்புகளை சரிபார்க்கவும்</string>\n    <string name=\"auto_update_check_description\">நியூபைப் தானாகவே புதிய பதிப்புகள் அவ்வப்போது சரிபார்க்கலாம் மற்றும் அவை கிடைத்தவுடன் உங்களுக்குத் தெரிவிக்கலாம்.\\n இதை இயக்க விரும்புகிறீர்களா?</string>\n    <string name=\"manual_update_description\">புதிய பதிப்புகளை கைமுறையாக சரிபார்க்கவும்</string>\n    <string name=\"minimize_on_exit_title\">பயன்பாட்டு சுவிட்சில் குறைக்கவும்</string>\n    <string name=\"minimize_on_exit_summary\">முதன்மையான வீடியோ பிளேயரிடமிருந்து பிற பயன்பாட்டிற்கு மாறும்போது செயல் - %s</string>\n    <string name=\"minimize_on_exit_none_description\">எதுவுமில்லை</string>\n    <string name=\"minimize_on_exit_background_description\">பின்னணி பிளேயருக்குக் குறைக்கவும்</string>\n    <string name=\"autoplay_summary\">பிளேபேக்கை தானாகத் தொடங்குங்கள் - %s</string>\n    <string name=\"card\">அட்டை</string>\n    <string name=\"app_update_unavailable_toast\">நீங்கள் நியூபைப்பின் அண்மைக் கால பதிப்பை இயக்குகிறீர்கள்</string>\n    <string name=\"queued\">வரிசையில்</string>\n    <string name=\"post_processing\">பிந்தைய செயலாக்கம்</string>\n    <string name=\"recovering\">மீண்டு</string>\n    <string name=\"permission_denied\">கணினி மறுத்த நடவடிக்கை</string>\n    <string name=\"checking_updates_toast\">புதுப்பிப்புகளைச் சரிபார்க்கிறது…</string>\n    <string name=\"reset_settings_title\">அமைப்புகளை மீட்டமைக்கவும்</string>\n    <string name=\"reset_settings_summary\">எல்லா அமைப்புகளையும் அவற்றின் இயல்புநிலை மதிப்புகளுக்கு மீட்டமைக்கவும்</string>\n    <string name=\"reset_all_settings\">எல்லா அமைப்புகளையும் மீட்டமைப்பது உங்களுக்கு விருப்பமான அமைப்புகள் அனைத்தையும் நிராகரித்து பயன்பாட்டை மறுதொடக்கம் செய்யும்.\\n\\n நீங்கள் தொடர விரும்புகிறீர்களா?</string>\n    <string name=\"generate_unique_name\">தனித்துவமான பெயரை உருவாக்குங்கள்</string>\n    <string name=\"overwrite\">மேலெழுதும்</string>\n    <string name=\"overwrite_failed\">கோப்பை மேலெழுத முடியாது</string>\n    <string name=\"show_error\">பிழையைக் காட்டு</string>\n    <string name=\"error_ssl_exception\">பாதுகாப்பான இணைப்பை நிறுவ முடியவில்லை</string>\n    <string name=\"error_http_no_content\">சேவையகம் தரவை அனுப்பாது</string>\n    <string name=\"error_http_not_found\">கண்டுபிடிக்கப்படவில்லை</string>\n    <string name=\"error_insufficient_storage\">சாதனத்தில் போதுமான இலவச இடம் இல்லை</string>\n    <string name=\"error_insufficient_storage_left\">சாதனத்தில் எந்த இடமும் இல்லை</string>\n    <string name=\"error_timeout\">இணைப்பு நேரம் முடிந்தது</string>\n    <string name=\"pause_downloads_on_mobile\">மீட்டர் நெட்வொர்க்குகளில் குறுக்கீடு</string>\n    <string name=\"pause_downloads_on_mobile_desc\">மொபைல் தரவுக்கு மாறும்போது பயனுள்ளதாக இருக்கும், இருப்பினும் சில பதிவிறக்கங்களை இடைநிறுத்த முடியாது</string>\n    <string name=\"downloads_storage_ask_summary\">ஒவ்வொரு பதிவிறக்கத்தையும் எங்கு சேமிப்பது என்று கேட்கப்படும்.\\n வெளிப்புற எச்டி கார்டில் பதிவிறக்கம் செய்ய விரும்பினால் கணினி கோப்புறை பிக்கர் (SAF) ஐ இயக்கவும்</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">ஒவ்வொரு பதிவிறக்கத்தையும் எங்கு சேமிப்பது என்று கேட்கப்படும்</string>\n    <string name=\"downloads_storage_use_saf_title\">கணினி கோப்புறை பிக்கர் (SAF) ஐப் பயன்படுத்தவும்</string>\n    <string name=\"choose_instance_prompt\">ஒரு நிகழ்வைத் தேர்வுசெய்க</string>\n    <string name=\"remove_watched\">பார்த்ததை அகற்று</string>\n    <string name=\"new_seek_duration_toast\">எக்சோப்ளேயர் கட்டுப்பாடுகள் காரணமாக தேடல் காலம் %d விநாடிகளுக்கு அமைக்கப்பட்டது</string>\n    <string name=\"feed_subscription_not_loaded_count\">ஏற்றப்படவில்லை: %d</string>\n    <string name=\"feed_processing_message\">செயலாக்க ஊட்டம்…</string>\n    <string name=\"feed_group_dialog_empty_selection\">சந்தா எதுவும் தேர்ந்தெடுக்கப்படவில்லை</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d தேர்ந்தெடுக்கப்பட்டது</item>\n        <item quantity=\"other\">%d தேர்ந்தெடுக்கப்பட்டன</item>\n    </plurals>\n    <string name=\"feed_create_new_group_button_title\">புதிய</string>\n    <string name=\"feed_update_threshold_option_always_update\">எப்போதும் புதுப்பிக்கவும்</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' க்கு ஊட்டத்தை ஏற்ற முடியவில்லை.</string>\n    <string name=\"feed_load_error_terminated\">ஆசிரியரின் கணக்கு நிறுத்தப்பட்டுள்ளது.\\n நியூபைப் எதிர்காலத்தில் இந்த ஊட்டத்தை ஏற்ற முடியாது.\\n இந்த சேனலில் இருந்து குழுவிலக விரும்புகிறீர்களா?</string>\n    <string name=\"feed_load_error_fast_unknown\">ஃபாச்ட் ஃபீட் பயன்முறை இது குறித்த கூடுதல் தகவலை வழங்காது.</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">கிடைக்கும்போது பிரத்யேக ஊட்டத்திலிருந்து பெறுங்கள்</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">சில சேவைகளில் கிடைக்கிறது, இது பொதுவாக மிக வேகமாக இருக்கும், ஆனால் ஒரு குறிப்பிட்ட அளவு உருப்படிகள் மற்றும் பெரும்பாலும் முழுமையற்ற தகவல்களைத் தரக்கூடும் (எ.கா. காலம், உருப்படி வகை, நேரடி நிலை இல்லை)</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">வேகமான பயன்முறையை முடக்கு</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">தீவன ஏற்றுதல் மிகவும் மெதுவாக இருப்பதாக நீங்கள் நினைக்கிறீர்களா? அப்படியானால், வேகமாக ஏற்றுவதை இயக்க முயற்சிக்கவும் (நீங்கள் அதை அமைப்புகளில் மாற்றலாம் அல்லது கீழே உள்ள பொத்தானை அழுத்துவதன் மூலம்).\\n\\n நியூபைப் இரண்டு தீவன ஏற்றுதல் உத்திகளை வழங்குகிறது:\\n சந்தா சேனலைப் பெறுதல், இது மெதுவாக ஆனால் முழுமையானது.\\n பணி ஒரு பிரத்யேக பணி இறுதிப் புள்ளியைப் பயன்படுத்துதல், இது வேகமானது ஆனால் பொதுவாக முழுமையடையாது.\\n\\n இரண்டிற்கும் இடையிலான வேறுபாடு என்னவென்றால், வேகமானவருக்கு வழக்கமாக உருப்படியின் காலம் அல்லது வகை போன்ற சில தகவல்கள் இல்லை (நேரடி வீடியோக்களுக்கும் சாதாரணமானவற்றுக்கும் இடையில் வேறுபடுத்த முடியாது) மற்றும் அது குறைவான உருப்படிகளைத் தரக்கூடும்.\\n\\n இந்த வேகமான முறையை அதன் ஆர்எச்எச் ஊட்டத்துடன் வழங்கும் சேவைக்கு யூடியூப் ஒரு எடுத்துக்காட்டு.\\n\\n எனவே தேர்வு நீங்கள் விரும்புவதைக் குறைக்கிறது: விரைவு அல்லது துல்லியமான செய்தி.</string>\n    <string name=\"feed_fetch_channel_tabs\">சேனல் தாவல்களைப் பெறுங்கள்</string>\n    <string name=\"content_not_supported\">இந்த உள்ளடக்கத்தை இன்னும் நியூபைப் ஆதரிக்கவில்லை.\\n\\n இது எதிர்கால பதிப்பில் ஆதரிக்கப்படும்.</string>\n    <string name=\"video_detail_by\">மூலம் %s</string>\n    <string name=\"no_appropriate_file_manager_message\">இந்த செயலுக்கு பொருத்தமான கோப்பு மேலாளர் எதுவும் கிடைக்கவில்லை.\\n தயவுசெய்து ஒரு கோப்பு மேலாளரை நிறுவவும் அல்லது பதிவிறக்க அமைப்புகளில் \\'%s\\' ஐ முடக்க முயற்சிக்கவும்</string>\n    <string name=\"soundcloud_go_plus_content\">இது ஒரு சவுண்ட்க்ளூட் கோ+ டிராக் ஆகும், குறைந்தபட்சம் உங்கள் நாட்டில், எனவே இதை நியூபைப் மூலம் ச்ட்ரீம் செய்யவோ பதிவிறக்கம் செய்யவோ முடியாது.</string>\n    <string name=\"private_content\">இந்த உள்ளடக்கம் தனிப்பட்டது, எனவே இதை நியூபைப் மூலம் ச்ட்ரீம் செய்யவோ பதிவிறக்கம் செய்யவோ முடியாது.</string>\n    <string name=\"youtube_music_premium_content\">இந்த வீடியோ யூடியூப் மியூசிக் காப்பீடு உறுப்பினர்களுக்கு மட்டுமே கிடைக்கிறது, எனவே இதை நியூபைப்பால் ச்ட்ரீம் செய்யவோ பதிவிறக்கம் செய்யவோ முடியாது.</string>\n    <string name=\"account_terminated\">கணக்கு நிறுத்தப்பட்டது</string>\n    <string name=\"paid_content\">இந்த உள்ளடக்கம் பணம் செலுத்திய பயனர்களுக்கு மட்டுமே கிடைக்கிறது, எனவே இதை நியூபைப் மூலம் ச்ட்ரீம் செய்யவோ பதிவிறக்கம் செய்யவோ முடியாது.</string>\n    <string name=\"radio\">வானொலி</string>\n    <string name=\"night_theme_available\">கருப்பொருளுக்கு %s தேர்ந்தெடுக்கப்பட்டால் மட்டுமே இந்த விருப்பம் கிடைக்கும்</string>\n    <string name=\"download_has_started\">பதிவிறக்கம் தொடங்கியது</string>\n    <string name=\"description_select_note\">நீங்கள் இப்போது விளக்கத்திற்குள் உரையைத் தேர்ந்தெடுக்கலாம். தேர்வு பயன்முறையில் இருக்கும்போது பக்கம் ஃப்ளிக்கர் மற்றும் இணைப்புகள் சொடுக்கு செய்யப்படாமல் இருக்கலாம் என்பதை நினைவில் கொள்க.</string>\n    <string name=\"description_select_enable\">விளக்கத்தில் உரையைத் தேர்ந்தெடுப்பதை இயக்கவும்</string>\n    <string name=\"description_select_disable\">விளக்கத்தில் உரையைத் தேர்ந்தெடுப்பதை முடக்கு</string>\n    <string name=\"metadata_category\">வகை</string>\n    <string name=\"metadata_licence\">உரிமம்</string>\n    <string name=\"metadata_privacy\">தனியுரிமை</string>\n    <string name=\"metadata_language\">மொழி</string>\n    <string name=\"metadata_support\">உதவி</string>\n    <string name=\"metadata_host\">விருந்தோம்பி</string>\n    <string name=\"metadata_thumbnails\">சிறு உருவங்கள்</string>\n    <string name=\"metadata_uploader_avatars\">பதிவேற்றும் அவதாரங்கள்</string>\n    <string name=\"metadata_banners\">பதாகைகள்</string>\n    <string name=\"metadata_privacy_public\">பொது</string>\n    <string name=\"metadata_privacy_unlisted\">பட்டியலிடப்படாதது</string>\n    <string name=\"metadata_privacy_internal\">உள்</string>\n    <string name=\"metadata_subscribers\">சந்தாதாரர்கள்</string>\n    <string name=\"detail_pinned_comment_view_description\">பின்னப்பட்ட கருத்து</string>\n    <string name=\"detail_heart_img_view_description\">படைப்பாளரால் மனம்</string>\n    <string name=\"open_website_license\">திறந்த வலைத்தளம்</string>\n    <string name=\"get_notified\">அறிவிக்க</string>\n    <string name=\"you_successfully_subscribed\">நீங்கள் இப்போது இந்த சேனலுக்கு குழுசேர்ந்தீர்கள்</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">அனைத்தையும் மாற்று</string>\n    <string name=\"streams_not_yet_supported_removed\">பதிவிறக்கத்தால் இன்னும் ஆதரிக்கப்படாத நீரோடைகள் காட்டப்படவில்லை</string>\n    <string name=\"audio_track_present_in_video\">இந்த ச்ட்ரீமில் ஏற்கனவே ஆடியோ டிராக் இருக்க வேண்டும்</string>\n    <string name=\"selected_stream_external_player_not_supported\">தேர்ந்தெடுக்கப்பட்ட ச்ட்ரீம் வெளிப்புற வீரர்களால் ஆதரிக்கப்படவில்லை</string>\n    <string name=\"no_video_streams_available_for_external_players\">வெளிப்புற வீரர்களுக்கு வீடியோ ச்ட்ரீம்கள் எதுவும் கிடைக்கவில்லை</string>\n    <string name=\"select_audio_track_external_players\">வெளிப்புற பிளேயர்களுக்கான ஆடியோ டிராக்கைத் தேர்ந்தெடுக்கவும்</string>\n    <string name=\"settings_category_exoplayer_title\">எக்சோப்ளேயர் அமைப்புகள்</string>\n    <string name=\"settings_category_exoplayer_summary\">சில எக்சோப்ளேயர் அமைப்புகளை நிர்வகிக்கவும். இந்த மாற்றங்கள் நடைமுறைக்கு வர ஒரு வீரர் மறுதொடக்கம் தேவை</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">எக்சோப்ளேயரின் டிகோடர் குறைவடையும் அம்சத்தைப் பயன்படுத்தவும்</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">உங்களிடம் டிகோடர் துவக்க சிக்கல்கள் இருந்தால் இந்த விருப்பத்தை இயக்கவும், இது முதன்மை டிகோடர்கள் துவக்கம் தோல்வியுற்றால் குறைந்த முன்னுரிமை டிகோடர்களுக்குத் திரும்பும். முதன்மை டிகோடர்களைப் பயன்படுத்துவதை விட இது மோசமான பின்னணி செயல்திறனை ஏற்படுத்தக்கூடும்</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">எப்போதும் எக்சோப்ளேயரின் வீடியோ வெளியீட்டு மேற்பரப்பு அமைப்பு பணித்தொகுப்பைப் பயன்படுத்துங்கள்</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">இந்த பணித்தொகுப்பு ஒரு மேற்பரப்பு மாற்றம் நிகழும்போது வீடியோ கோடெக்குகளை வெளியிட்டு மீண்டும் நிறுவுகிறது, அதற்கு பதிலாக கோடெக்கிற்கு நேரடியாக மேற்பரப்பை அமைப்பதற்கு பதிலாக. இந்த சிக்கலுடன் சில சாதனங்களில் ஏற்கனவே எக்சோப்ளேயரால் பயன்படுத்தப்படுகிறது, இந்த அமைப்பு ஆண்ட்ராய்டு 6 மற்றும் அதற்கு மேற்பட்டவற்றில் மட்டுமே தாக்கத்தை ஏற்படுத்துகிறது\\n\\n இந்த விருப்பத்தை இயக்குவது தற்போதைய வீடியோ பிளேயரை மாற்றும்போது அல்லது முழுத்திரைக்கு மாறும்போது பிளேபேக் பிழைகளைத் தடுக்கலாம்</string>\n    <string name=\"audio_track_type_descriptive\">விளக்கமான</string>\n    <string name=\"channel_tab_videos\">வீடியோக்கள்</string>\n    <string name=\"channel_tab_tracks\">தடங்கள்</string>\n    <string name=\"channel_tab_livestreams\">வாழ</string>\n    <string name=\"channel_tab_channels\">சேனல்கள்</string>\n    <string name=\"channel_tab_about\">பற்றி</string>\n    <string name=\"show_channel_tabs\">சேனல் தாவல்கள்</string>\n    <string name=\"previous_stream\">முந்தைய ச்ட்ரீம்</string>\n    <string name=\"next_stream\">அடுத்த ச்ட்ரீம்</string>\n    <string name=\"replay\">மீண்டும்</string>\n    <string name=\"image_quality_summary\">தரவு மற்றும் நினைவக பயன்பாட்டைக் குறைக்க, படங்களின் தகுதி மற்றும் படங்களை ஏற்ற வேண்டுமா என்பதைத் தேர்வுசெய்க. மாற்றங்கள் நினைவகம் மற்றும் ஆன்-வட்டு பட தற்காலிக சேமிப்பு இரண்டையும் அழிக்கின்றன- %s</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">YouTube தற்காலிக பிளேலிச்ட்டாக பகிரவும்</string>\n    <string name=\"tab_bookmarks_short\">பிளேலிச்ட்கள்</string>\n    <string name=\"select_a_feed_group\">தீவனக் குழுவைத் தேர்ந்தெடுக்கவும்</string>\n    <string name=\"no_feed_group_created_yet\">இதுவரை எந்த ஊட்டக் குழுவும் உருவாக்கப்படவில்லை</string>\n    <string name=\"feed_group_page_summary\">சேனல் குழு பக்கம்</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-te/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">మొదలుపెట్టుటకు బూతద్దము గురుతుని తట్టండి.</string>\n    <string name=\"upload_date_text\">%1$sన ప్రచురించబడింది</string>\n    <string name=\"install\">ఇన్స్టాల్</string>\n    <string name=\"cancel\">రద్దు చేయి</string>\n    <string name=\"open_in_browser\">బ్రౌజర్ లో తెరవండి</string>\n    <string name=\"share\">షేర్</string>\n    <string name=\"download\">డౌన్లోడ్</string>\n    <string name=\"search\">వెతుకు</string>\n    <string name=\"settings\">అమరికలు</string>\n    <string name=\"did_you_mean\">మీ ఉద్దేశ్యం \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">పంచుకో</string>\n    <string name=\"use_external_audio_player_title\">బాహ్య ఆడియో ప్లేయర్ని ఉపయోగించండి</string>\n    <string name=\"subscribe_button_title\">సభ్యత్వం</string>\n    <string name=\"subscribed_button_title\">సబ్ స్క్రైబ్</string>\n    <string name=\"channel_unsubscribed\">ఛానెల్ సభ్యత్వం తీసివేయబడినది</string>\n    <string name=\"subscription_change_failed\">సబ్ స్క్రైబ్ సాధ్యం కాలేదు</string>\n    <string name=\"subscription_update_failed\">సబ్ స్క్రైబ్ నవీకరించలేరు</string>\n    <string name=\"tab_subscriptions\">సభ్యత్వం</string>\n    <string name=\"fragment_feed_title\">కొత్తది ఏమిటి</string>\n    <string name=\"controls_background_title\">వెనుకగా</string>\n    <string name=\"controls_popup_title\">పాపప్</string>\n    <string name=\"download_path_title\">వీడియో డౌన్లోడ్ మార్గం</string>\n    <string name=\"download_path_summary\">డౌన్లోడ్ చేసిన వీడియోలను నిల్వ చేయడానికి మార్గం</string>\n    <string name=\"download_path_dialog_title\">వీడియోల కోసం డౌన్లోడ్ మార్గాన్ని నమోదు చేయండి</string>\n    <string name=\"download_path_audio_title\">ఆడియో డౌన్లోడ్ మార్గం</string>\n    <string name=\"download_path_audio_summary\">ఆడియో కోసం డౌన్లోడ్ మార్గాన్ని నమోదు చేయండి</string>\n    <string name=\"download_path_audio_dialog_title\">ఆడియో ఫైల్లకు డౌన్లోడ్ మార్గాన్ని ఇవ్వండి</string>\n    <string name=\"play_with_kodi_title\">కోడితో ప్లే చేయండి</string>\n    <string name=\"kore_not_found\">కోరే ఆప్ కనుగొనబడలేదు. దీన్ని ఇన్స్టాల్ చెయ్యాలా\\?</string>\n    <string name=\"show_play_with_kodi_title\">కోరే అనువర్తనం కనుగొనబడలేదు. దీన్ని ఇన్స్టాల్ చేయండి</string>\n    <string name=\"play_audio\">ఆడియో</string>\n    <string name=\"default_audio_format_title\">డిఫాల్ట్ ఆడియో ఫార్మాట్</string>\n    <string name=\"theme_title\">థీమ్</string>\n    <string name=\"light_theme_title\">ప్రకాశం</string>\n    <string name=\"enable_watch_history_title\">చరిత్రను చూడండి</string>\n    <string name=\"download_dialog_title\">డౌన్‌లోడ్</string>\n    <string name=\"show_next_and_similar_title\">\\'తదుపరి\\' మరియు \\'ఇలాంటి\\' వీడియోలను చూపించు</string>\n    <string name=\"show_hold_to_append_title\">చిట్కాను అనుబంధించడానికి హోల్డ్ను చూపు</string>\n    <string name=\"unsupported_url\">Url మద్దతు లేదు</string>\n    <string name=\"content_language_title\">డిఫాల్ట్ భాష</string>\n    <string name=\"settings_category_player_title\">ప్లేయర్</string>\n    <string name=\"settings_category_player_behavior_title\">ప్రవర్తన</string>\n    <string name=\"settings_category_video_audio_title\">వీడియో &amp; ఆడియో</string>\n    <string name=\"settings_category_history_title\">చరిత్ర మరియు కాష్</string>\n    <string name=\"settings_category_appearance_title\">స్వరూపం</string>\n    <string name=\"background_player_playing_toast\">వెనకవైపులో ఆడుతున్నారు</string>\n    <string name=\"popup_playing_toast\">పాపప్ రీతిలో ప్లే చేస్తోంది</string>\n    <string name=\"content\">విషయము</string>\n    <string name=\"downloads\">డౌన్ లోడ్ల</string>\n    <string name=\"downloads_title\">డౌన్ లోడ్</string>\n    <string name=\"error_report_title\">లోపం నివేదిక</string>\n    <string name=\"all\">అన్ని</string>\n    <string name=\"play_all\">అన్నింటినీ ప్లే చేయండి</string>\n    <string name=\"notification_channel_name\">న్యూప్యాప్ నోటిఫికేషన్</string>\n    <string name=\"general_error\">లోపం</string>\n    <string name=\"network_error\">నెట్వర్క్ లోపం</string>\n    <string name=\"could_not_load_thumbnails\">అన్ని సూక్ష్మచిత్రాలను లోడ్ చేయలేకపోయాము</string>\n    <string name=\"parsing_error\">వెబ్సైట్ను అన్వయించడం సాధ్యం కాలేదు</string>\n    <string name=\"content_not_available\">కంటెంట్ అందుబాటులో లేదు</string>\n    <string name=\"could_not_setup_download_menu\">డౌన్లోడ్ మెనుని సెటప్ చేయడం సాధ్యపడలేదు</string>\n    <string name=\"player_stream_failure\">ఈ స్ట్రీమ్ని ప్లే చేయడం విఫలమైంది</string>\n    <string name=\"player_recoverable_failure\">ప్లేయర్ లోపం నుండి పునరుద్ధరించబడుతున్నది</string>\n    <string name=\"sorry_string\">క్షమించాలి, అది జరగకూడదు</string>\n    <string name=\"error_report_button_text\">ఇ-మెయిల్ ద్వారా లోపాన్ని నివేదించుము</string>\n    <string name=\"error_snackbar_message\">క్షమించండి, ఏదో తప్పు జరిగింది.</string>\n    <string name=\"error_snackbar_action\">నివేదిక</string>\n    <string name=\"what_device_headline\">సమాచారం:</string>\n    <string name=\"what_happened_headline\">ఏం జరిగింది:</string>\n    <string name=\"your_comment\">మీ వ్యాఖ్య(ఆంగ్లం లో):</string>\n    <string name=\"error_details_headline\">వివరములు:</string>\n    <string name=\"detail_thumbnail_view_description\">వీడియోని ప్లే చేయండి, వ్యవధి:</string>\n    <string name=\"detail_likes_img_view_description\">ఇష్టాలు</string>\n    <string name=\"detail_dislikes_img_view_description\">మంది ఇష్టపడలేదు</string>\n    <string name=\"search_no_results\">ఫలితాలు లేవు</string>\n    <string name=\"video\">వీడియో</string>\n    <string name=\"audio\">ఆడియో</string>\n    <string name=\"retry\">మళ్ళీ ప్రయత్నించు</string>\n    <string name=\"no_subscribers\">సభ్యులు లేరు</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s సభ్యుడు</item>\n        <item quantity=\"other\">%s సభ్యులు</item>\n    </plurals>\n    <string name=\"no_views\">వీక్షణలు లేవు</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s వీక్షణ</item>\n        <item quantity=\"other\">%s వీక్షణలు</item>\n    </plurals>\n    <string name=\"no_videos\">వీడియోలు లేవు</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s వీడియో</item>\n        <item quantity=\"other\">%s వీడియోలు</item>\n    </plurals>\n    <string name=\"start\">ప్రారంభం</string>\n    <string name=\"pause\">విరామం</string>\n    <string name=\"delete\">తొలగించు</string>\n    <string name=\"ok\">అలాగే</string>\n    <string name=\"msg_name\">ఫైలుపేరు</string>\n    <string name=\"msg_threads\">థ్రెడ్లు</string>\n    <string name=\"msg_error\">లోపం</string>\n    <string name=\"msg_running\">న్యూపిప్ డౌన్లోడ్ అవుతంది</string>\n    <string name=\"msg_running_detail\">వివరాల కోసం నొక్కండి</string>\n    <string name=\"msg_wait\">దయచేసి వేచి ఉండండి…</string>\n    <string name=\"msg_copied\">క్లిప్బోర్డ్కు కాపీ చేయబడింది</string>\n    <string name=\"no_available_dir\">డౌన్లోడ్ ఫోల్డర్ను అమరికలలో తరువాత ఎంచుకోండి</string>\n    <string name=\"settings_category_downloads_title\">డౌన్లోడ్</string>\n    <string name=\"settings_file_charset_title\">ఫైల్ పేర్లలో అనుమతించిన అక్షరాలు</string>\n    <string name=\"settings_file_replacement_character_summary\">చెల్లని అక్షరాలు ఈ విలువతో భర్తీ చేయబడతాయి</string>\n    <string name=\"settings_file_replacement_character_title\">ప్రత్యామ్నాయ అక్షరం</string>\n    <string name=\"charset_letters_and_digits\">లెటర్స్ మరియు అంకెలు</string>\n    <string name=\"title_activity_about\">న్యూపిప్ గురించి</string>\n    <string name=\"title_licenses\">మూడవ పార్టీ లైసెన్స్</string>\n    <string name=\"tab_about\">గురించి</string>\n    <string name=\"tab_licenses\">లైసెన్సులు</string>\n    <string name=\"view_on_github\">GitHub పై చూడండి</string>\n    <string name=\"app_license_title\">న్యూపెయిప్ యొక్క లైసెన్స్</string>\n    <string name=\"contribution_encouragement\">మీకు ఆలోచనలు ఉన్నాయా; అనువాదం, డిజైన్ మార్పులు, కోడ్ శుభ్రపరచడం లేదా నిజమైన భారీ కోడ్ మార్పులు-సహాయం ఎల్లప్పుడూ స్వాగతం. ఎంత ఎక్కువ చేస్తే అంత మంచిది!</string>\n    <string name=\"read_full_license\">లైసెన్స్‌ను చదువు</string>\n    <string name=\"contribution_title\">సహకరించటానికి</string>\n    <string name=\"title_activity_history\">చరిత్ర</string>\n    <string name=\"action_history\">చరిత్ర</string>\n    <string name=\"delete_item_search_history\">మీరు ఈ అంశాన్ని శోధన చరిత్ర నుండి తొలగించాలనుకుంటున్నారా?</string>\n    <string name=\"main_page_content\">ప్రధాన పేజీ యొక్క కంటెంట్</string>\n    <string name=\"blank_page_summary\">ఖాళీ పేజీ</string>\n    <string name=\"channel_page_summary\">ఛానెల్ పేజీ</string>\n    <string name=\"select_a_channel\">ఛానెల్ని ఎంచుకోండి</string>\n    <string name=\"no_channel_subscribed_yet\">ఇంకా ఏ ఛానెల్ సభ్యత్వం లేదు</string>\n    <string name=\"trending\">ట్రెండింగ్</string>\n    <string name=\"top_50\">టాప్ 50</string>\n    <string name=\"new_and_hot\">క్రొత్తది మరియు వేడి</string>\n    <string name=\"play_queue_remove\">తొలగించు</string>\n    <string name=\"play_queue_stream_detail\">వివరాలు</string>\n    <string name=\"play_queue_audio_settings\">ఆడియో సెట్టింగ్లు</string>\n    <string name=\"hold_to_append\">ఎన్క్యూలో పట్టుకోండి</string>\n    <string name=\"no_player_found\">మీదగ్గర వీడియోకి కావాల్సిన ప్లేయర్ లేదు. VLC ప్లేయర్ని ఇన్స్టాల్ చేసుకుంటారా\\?</string>\n    <string name=\"no_player_found_toast\">మీదగ్గర వీడియోకి కావాల్సిన ప్లేయర్ లేదు (మీరు VLCని ఇన్స్టాల్ చేసుకోండి ).</string>\n    <string name=\"open_in_popup_mode\">పాపప్ మోడ్లో తెరవండి</string>\n    <string name=\"default_popup_resolution_title\">డిఫాల్ట్ పాపప్ స్పష్టత</string>\n    <string name=\"controls_download_desc\">ప్రసార ఫైలుని డౌన్లోడ్ చేయండి</string>\n    <string name=\"use_external_video_player_title\">బాహ్య వీడియో ప్లేయర్ని ఉపయోగించండి</string>\n    <string name=\"use_external_video_player_summary\">కొన్ని స్పష్టతల్లో ఆడియోను తొలగిస్తుంది</string>\n    <string name=\"start_main_player_fullscreen_title\">పూర్తి స్క్రీన్‌లో ప్రధాన ప్లేయర్‌ని ప్రారంభించండి</string>\n    <string name=\"settings_category_debug_title\">డీబగ్ చేయండి</string>\n    <string name=\"notification_action_nothing\">ఏమిలేదు</string>\n    <string name=\"notification_scale_to_square_image_summary\">నోటిఫికేషన్‌లో చూపబడిన వీడియో థంబ్‌నెయిల్‌ను 16:9 నుండి 1:1 కారక నిష్పత్తికి మార్చుము</string>\n    <string name=\"notification_action_repeat\">పునరావృతం చేయండి</string>\n    <string name=\"show_hold_to_append_summary\">వీడియో \\\"వివరాలు:\\\"లో బ్యాక్‌గ్రౌండ్ లేదా పాప్‌అప్ బటన్‌ను నొక్కినప్పుడు చిట్కాను చూపు</string>\n    <string name=\"unsupported_url_dialog_message\">URLని గుర్తించడం సాధ్యపడలేదు. మరొక యాప్‌తో తెరవాలా\\?</string>\n    <string name=\"notification_colorize_title\">నోటిఫికేషన్‌ను రంగులమయం చేయండి</string>\n    <string name=\"local_search_suggestions\">స్థానిక శోధన సూచనలు</string>\n    <string name=\"remote_search_suggestions\">రిమోట్ శోధన సూచనలు</string>\n    <string name=\"autoplay_title\">ఆటోప్లే</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">అంతరాయాలు (ఉదా. ఫోన్‌కాల్స్) తర్వాత ప్లే చేయడం కొనసాగించండి</string>\n    <string name=\"show_meta_info_title\">మెటా సమాచారాన్ని చూపు</string>\n    <string name=\"show_play_with_kodi_summary\">కోడి మీడియా సెంటర్ ద్వారా వీడియోను ప్లే చేయడానికి ఎంపికను ప్రదర్శించండి</string>\n    <string name=\"show_higher_resolutions_summary\">కొన్ని పరికరాలు మాత్రమే 2K/4K వీడియోలను ప్లే చేయగలవు</string>\n    <string name=\"mark_as_watched\">వీక్షించినట్లు గుర్తుపెట్టుము</string>\n    <string name=\"open_with\">దీనితో తెరువుము</string>\n    <string name=\"search_showing_result_for\">దీని కోసం ఫలితాలను చూపుతోంది: %s</string>\n    <string name=\"default_resolution_title\">డిఫాల్ట్ స్పష్టత</string>\n    <string name=\"show_higher_resolutions_title\">అధిక స్పష్టతను చూపుము</string>\n    <string name=\"black_theme_title\">నలుపు</string>\n    <string name=\"popup_remember_size_pos_title\">పాప్అప్ లక్షణాలను గుర్తుంచుకో</string>\n    <string name=\"show_comments_title\">వ్యాఖ్యలను చూపించు</string>\n    <string name=\"show_comments_summary\">వ్యాఖ్యలను దాచడాన్ని ఆఫ్ చేయండి</string>\n    <string name=\"peertube_instance_url_help\">%sలో మీకు నచ్చిన సందర్భాలను కనుగొనండి</string>\n    <string name=\"peertube_instance_url_title\">పీర్‌ట్యూబ్ ఉదాహరణలు</string>\n    <string name=\"notification_action_2_title\">మూడవ చర్య బటన్</string>\n    <string name=\"use_inexact_seek_summary\">ఖచ్చితమైన శోధన తగ్గిన ఖచ్చితత్వంతో వేగంగా స్థానాలను పొందేందుకు ఆటగాడిని అనుమతిస్తుంది. 5, 15 లేదా 25 సెకన్ల పాటు కోరడం దీనితో పని చేయదు</string>\n    <string name=\"use_inexact_seek_title\">వేగవంతమైన ఖచ్చితమైన శోధనను ఉపయోగించండి</string>\n    <string name=\"controls_add_to_playlist_title\">జోడించండి</string>\n    <string name=\"tab_bookmarks\">బుక్‌మార్క్ చేయబడిన వినోదజాబితాలు</string>\n    <string name=\"tab_choose\">ట్యాబ్‌ని ఎంచుకోండి</string>\n    <string name=\"unsubscribe\">సభ్యత్వాన్ని తొలగించుము</string>\n    <string name=\"show_info\">సమాచారాన్ని చూపుము</string>\n    <string name=\"notification_scale_to_square_image_title\">సూక్ష్మచిత్రాన్ని 1:1 కారక నిష్పత్తికి మార్చుము</string>\n    <string name=\"clear_queue_confirmation_summary\">ఒక ప్లేయర్ నుండి మరొక ప్లేయర్‌కు మారడం వలన మీ క్యూను భర్తీ చేయవచ్చు</string>\n    <string name=\"auto_queue_summary\">సంబంధిత స్ట్రీమ్‌ను జోడించడం ద్వారా (పునరావృతం కాని) ప్లేబ్యాక్ క్యూను ముగించడాన్ని కొనసాగించండి</string>\n    <string name=\"notification_actions_summary\">దిగువన ఉన్న ప్రతి నోటిఫికేషన్ చర్యను దానిపై నొక్కడం ద్వారా సవరించండి. కుడివైపు ఉన్న చెక్‌బాక్స్‌లను ఉపయోగించడం ద్వారా కాంపాక్ట్ నోటిఫికేషన్‌లో చూపబడే వాటిలో మూడు వరకు ఎంచుకోండి</string>\n    <string name=\"popup_remember_size_pos_summary\">పాప్అప్ చివరి పరిమాణం మరియు స్థానాన్ని గుర్తుంచుకోండి</string>\n    <string name=\"show_description_summary\">వీడియో వివరణ మరియు అదనపు సమాచారాన్ని దాచడాన్ని ఆఫ్ చేయండి</string>\n    <string name=\"show_meta_info_summary\">స్ట్రీమ్ సృష్టికర్త, స్ట్రీమ్ కంటెంట్ లేదా శోధన అభ్యర్థన గురించి అదనపు సమాచారంతో మెటా సమాచార పెట్టెలను దాచడానికి ఆఫ్ చేయండి</string>\n    <string name=\"show_search_suggestions_summary\">శోధిస్తున్నప్పుడు చూపాల్సిన సూచనలను ఎంచుకోండి</string>\n    <string name=\"enable_playback_resume_summary\">చివరి ప్లేబ్యాక్ స్థానాన్ని పునరుద్ధరించండి</string>\n    <string name=\"peertube_instance_url_summary\">మీకు ఇష్టమైన పీర్‌ట్యూబ్ సందర్భాలను ఎంచుకోండి</string>\n    <string name=\"enable_watch_history_summary\">వీక్షించిన వీడియోలను ట్రాక్ చేయండి</string>\n    <string name=\"start_main_player_fullscreen_summary\">మినీ ప్లేయర్‌లో వీడియోలను ప్రారంభించవద్దు, ఆటో రొటేషన్ లాక్ చేయబడితే, నేరుగా పూర్తి స్క్రీన్ మోడ్‌కి మారండి. మీరు పూర్తి స్క్రీన్ నుండి నిష్క్రమించడం ద్వారా ఇప్పటికీ మినీ ప్లేయర్‌ని యాక్సెస్ చేయవచ్చు</string>\n    <string name=\"peertube_instance_add_title\">సందర్భాన్ని జోడించండి</string>\n    <string name=\"settings_category_updates_title\">నవీకరణలు</string>\n    <string name=\"peertube_instance_add_https_only\">HTTPS URLలకు మాత్రమే మద్దతు ఉంది</string>\n    <string name=\"notification_action_1_title\">రెండవ చర్య బటన్</string>\n    <string name=\"notification_action_3_title\">నాల్గవ చర్య బటన్</string>\n    <string name=\"crash_the_player\">ప్లేయర్ క్రాష్ చేయండి</string>\n    <string name=\"notification_action_0_title\">మొదటి చర్య బటన్</string>\n    <string name=\"notification_action_4_title\">ఐదవ చర్య బటన్</string>\n    <string name=\"notification_actions_at_most_three\">మీరు కాంపాక్ట్ నోటిఫికేషన్‌లో చూపడానికి గరిష్టంగా మూడు చర్యలను ఎంచుకోవచ్చు!</string>\n    <string name=\"notification_action_shuffle\">షఫుల్ చేయండి</string>\n    <string name=\"notification_action_buffering\">బఫరింగ్</string>\n    <string name=\"default_video_format_title\">డిఫాల్ట్ వీడియో ఫార్మాట్</string>\n    <string name=\"night_theme_title\">చీకటి థీమ్</string>\n    <string name=\"dark_theme_title\">చీకటి</string>\n    <string name=\"seek_duration_title\">ఫాస్ట్-ఫార్వర్డ్/-రివైండ్ సీక్ వ్యవధి</string>\n    <string name=\"clear_queue_confirmation_title\">క్యూను క్లియర్ చేయడానికి ముందు నిర్ధారణ కోసం అడగండి</string>\n    <string name=\"clear_queue_confirmation_description\">క్రియాశీల ప్లేయర్ క్యూ భర్తీ చేయబడుతుంది</string>\n    <string name=\"show_description_title\">వివరణను చూపు</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">చిత్రం కాష్ తుడిచివేయబడింది</string>\n    <string name=\"metadata_cache_wipe_title\">కాష్ చేయబడిన మెటాడేటాను తుడిచివేయండి</string>\n    <string name=\"metadata_cache_wipe_summary\">కాష్ చేసిన వెబ్‌పేజీ డేటా మొత్తాన్ని తీసివేయండి</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">మెటాడేటా కాష్ తుడిచివేయబడింది</string>\n    <string name=\"show_search_suggestions_title\">సూచనలను శోధించండి</string>\n    <string name=\"enable_search_history_title\">శోధన చరిత్ర</string>\n    <string name=\"enable_search_history_summary\">శోధన ప్రశ్నలను స్థానికంగా నిల్వ చేయండి</string>\n    <string name=\"enable_playback_resume_title\">ప్లేబ్యాక్ పునఃప్రారంభించండి</string>\n    <string name=\"enable_playback_state_lists_title\">జాబితాలలో స్థానాలు</string>\n    <string name=\"enable_playback_state_lists_summary\">జాబితాలలో ప్లేబ్యాక్ స్థాన సూచికలను చూపు</string>\n    <string name=\"settings_category_clear_data_title\">డేటాను క్లియర్ చేయండి</string>\n    <string name=\"resume_on_audio_focus_gain_title\">ప్లే చేయడం కొనసాగించండి</string>\n    <string name=\"default_content_country_title\">డిఫాల్ట్ కంటెంట్ దేశం</string>\n    <string name=\"peertube_instance_add_help\">ఉదాహరణ URLని నమోదు చేయండి</string>\n    <string name=\"peertube_instance_add_fail\">ఉదాహరణను ధృవీకరించడం సాధ్యపడలేదు</string>\n    <string name=\"peertube_instance_add_exists\">ఉదాహరణ ఇప్పటికే ఉంది</string>\n    <string name=\"users\">వినియోగదారులు</string>\n    <string name=\"events\">ఈవెంట్స్</string>\n    <string name=\"app_update_notification_channel_description\">కొత్త NewPipe వెర్షన్ కోసం నోటిఫికేషన్‌లు</string>\n    <string name=\"show_age_restricted_content_summary\">కంటెంట్‌కి వయస్సు పరిమితి (18+ వంటివి) ఉన్నందున పిల్లలకు అనుచితమైన కంటెంట్‌ను చూపండి</string>\n    <string name=\"restricted_video_no_stream\">ఈ వీడియో వయో పరిమితి విధించబడింది.\n\\nవయో-నియంత్రిత వీడియోలతో కూడిన కొత్త YouTube విధానాల కారణంగా, NewPipe దాని వీడియో స్ట్రీమ్‌లలో దేనినీ యాక్సెస్ చేయదు మరియు దానిని ప్లే చేయడం సాధ్యం కాదు.</string>\n    <string name=\"restricted_video\">ఈ వీడియోకు వయో పరిమితి ఉంది.\n\\n\n\\nమీరు దీన్ని చూడాలనుకుంటే సెట్టింగ్‌లలో \\\"%1$s\\\"ని ఆన్ చేయండి.</string>\n    <string name=\"tracks\">ట్రాక్స్</string>\n    <string name=\"songs\">పాటలు</string>\n    <string name=\"switch_to_background\">వెనుకగా మార్చు</string>\n    <string name=\"file_deleted\">ఫైల్ తొలగించబడింది</string>\n    <string name=\"always\">ఎల్లప్పుడూ</string>\n    <string name=\"just_once\">ఒక్కసారి మాత్రమే</string>\n    <string name=\"file\">ఫైల్</string>\n    <string name=\"notification_colorize_summary\">థంబ్‌నెయిల్‌లోని ప్రధాన రంగు ప్రకారం నోటిఫికేషన్ రంగును Android అనుకూలీకరించండి (ఇది అన్ని పరికరాల్లో అందుబాటులో లేదని గమనించండి)</string>\n    <string name=\"hash_channel_name\">వీడియో హాష్ నోటిఫికేషన్</string>\n    <string name=\"hash_channel_description\">వీడియో హ్యాషింగ్ పురోగతి కోసం నోటిఫికేషన్‌లు</string>\n    <string name=\"playlists\">ప్లేజాబితాలు</string>\n    <string name=\"notification_channel_description\">NewPipe ప్లేయర్‌ నోటిఫికేషన్‌లు</string>\n    <string name=\"duration_live\">ప్రత్యక్ష (ప్రసారం)</string>\n    <string name=\"show_age_restricted_content_title\">వయో పరిమితి ఉన్న కంటెంట్‌ని చూపండి</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTube యొక్క \\\"పరిమితం చేయబడిన మోడ్\\\"ని ఆన్ చేయండి</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube \\\"పరిమితం చేయబడిన మోడ్\\\"ని అందిస్తుంది, ఇది పరిణతి చెందిన కంటెంట్‌ను దాచిపెడుతుంది</string>\n    <string name=\"channels\">ఛానెల్లు</string>\n    <string name=\"videos_string\">వీడియోలు</string>\n    <string name=\"albums\">ఆల్బమ్‌లు</string>\n    <string name=\"artists\">కళాకారులు</string>\n    <string name=\"disabled\">నిలిపివేయబడినది</string>\n    <string name=\"clear\">శుభ్రపరచు</string>\n    <string name=\"best_resolution\">ఉత్తమ స్పష్టత</string>\n    <string name=\"app_update_notification_channel_name\">యాప్‌ నవీకరణ నోటిఫికేషన్</string>\n    <string name=\"unknown_content\">[తెలియదు]</string>\n    <string name=\"file_name_empty_error\">ఫైల్ పేరు ఖాళీగా ఉండకూడదు</string>\n    <string name=\"saved_tabs_invalid_json\">సేవ్ చేసిన ట్యాబ్‌లను చదవడం సాధ్యం కాలేదు, కాబట్టి డిఫాల్ట్ వాటిని ఉపయోగిస్తోంది</string>\n    <string name=\"restore_defaults_confirmation\">మీరు డిఫాల్ట్‌లను పునరుద్ధరించాలనుకుంటున్నారా\\?</string>\n    <string name=\"watch_history_states_deleted\">ప్లేబ్యాక్ స్థానాలు తొలగించబడ్డాయి</string>\n    <string name=\"external_player_unsupported_link_type\">బాహ్య ప్లేయర్‌లు ఈ రకమైన లింక్‌లకు మద్దతు ఇవ్వవు</string>\n    <string name=\"checksum\">చెక్సమ్</string>\n    <string name=\"error_report_open_issue_button_text\">GitHubపై నివేదించు</string>\n    <string name=\"empty_list_subtitle\">ఇక్కడ క్రికెట్‌లు తప్ప మరేమీ లేదు</string>\n    <string name=\"no_one_listening\">ఎవరూ వినడం లేదు</string>\n    <string name=\"no_one_watching\">ఎవరూ చూడటం లేదు</string>\n    <string name=\"no_comments\">వ్యాఖ్యలు లేవు</string>\n    <string name=\"download_to_sdcard_error_message\">బాహ్య SD కార్డ్‌కి డౌన్‌లోడ్ చేయడం సాధ్యం కాదు. డౌన్‌లోడ్ ఫోల్డర్ స్థానాన్ని రీసెట్ చేయాలా\\?</string>\n    <string name=\"create\">సృష్టించు</string>\n    <string name=\"no_streams_available_download\">డౌన్‌లోడ్ చేయడానికి స్ట్రీమ్‌లు ఏవీ అందుబాటులో లేవు</string>\n    <string name=\"restore_defaults\">డిఫాల్ట్‌ విలువలకు మార్చు</string>\n    <string name=\"detail_drag_description\">క్రమాన్ని మార్చడానికి లాగండి</string>\n    <string name=\"clear_views_history_title\">వీక్షణ చరిత్రను శుభ్రపరచుము</string>\n    <string name=\"delete_view_history_alert\">మొత్తం వీక్షణ చరిత్రను తొలగించాలా\\?</string>\n    <string name=\"clear_playback_states_title\">ప్లేబ్యాక్ స్థానాలను తొలగించండి</string>\n    <string name=\"download_to_sdcard_error_title\">బాహ్య నిల్వ అందుబాటులో లేదు</string>\n    <string name=\"app_ui_crash\">యాప్/UI విఫలమైనది</string>\n    <string name=\"audio_streams_empty\">ఆడియో స్ట్రీమ్‌లు ఏవీ కనుగొనబడలేదు</string>\n    <string name=\"invalid_directory\">అటువంటి ఫోల్డర్ లేదు</string>\n    <string name=\"permission_display_over_apps\">ఇతర యాప్‌లలో ప్రదర్శించడానికి అనుమతి ఇవ్వండి</string>\n    <string name=\"copy_for_github\">ఫార్మాట్ చేసిన నివేదికను కాపీ చేయండి</string>\n    <string name=\"description_tab_description\">వివరణ</string>\n    <string name=\"drawer_header_description\">టోగుల్ సేవ, ప్రస్తుతం ఎంపిక చేయబడింది:</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s శ్రోత</item>\n        <item quantity=\"other\">%s శ్రోతలు</item>\n    </plurals>\n    <string name=\"more_than_100_videos\">100+ వీడియోలు</string>\n    <string name=\"infinite_videos\">∞ వీడియోలు</string>\n    <string name=\"comments_are_disabled\">వ్యాఖ్యలు నిలిపివేయబడ్డాయి</string>\n    <string name=\"clear_cookie_summary\">మీరు reCAPTCHAని పరిష్కరించినప్పుడు NewPipe స్టోర్ చేసే కుక్కీలను క్లియర్ చేయండి</string>\n    <string name=\"delete_playback_states_alert\">అన్ని ప్లేబ్యాక్ స్థానాలను తొలగించాలా\\?</string>\n    <string name=\"watch_history_deleted\">వీక్షణ చరిత్ర తొలగించబడింది</string>\n    <string name=\"search_history_deleted\">శోధన చరిత్ర తొలగించబడింది</string>\n    <string name=\"clear_search_history_title\">శోధన చరిత్రను శుభ్రపరచు</string>\n    <string name=\"clear_search_history_summary\">శోధన కీలకపదాల చరిత్రను తొలగిస్తుంది</string>\n    <string name=\"delete_search_history_alert\">మొత్తం శోధన చరిత్రను తొలగించాలా\\?</string>\n    <string name=\"clear_playback_states_summary\">అన్ని ప్లేబ్యాక్ స్థానాలను తొలగిస్తుంది</string>\n    <string name=\"clear_views_history_summary\">ప్లే చేసిన స్ట్రీమ్‌ల చరిత్ర మరియు ప్లేబ్యాక్ స్థానాలను తొలగిస్తుంది</string>\n    <string name=\"invalid_source\">అటువంటి ఫైల్/కంటెంట్ సోర్స్ లేదు</string>\n    <string name=\"error_report_open_github_notice\">దయచేసి మీ క్రాష్‌ను చర్చిస్తున్న సమస్య ఇప్పటికే ఉందో లేదో తనిఖీ చేయండి. డూప్లికేట్ టిక్కెట్‌లను క్రియేట్ చేస్తున్నప్పుడు, అసలు బగ్‌ని పరిష్కరించడానికి మేము వెచ్చించే సమయాన్ని మీరు మా నుండి తీసుకుంటారు.</string>\n    <string name=\"comments_tab_description\">వ్యాఖ్యలు</string>\n    <string name=\"related_items_tab_description\">సంబంధిత అంశాలు</string>\n    <string name=\"subscribers_count_not_available\">సభ్యుల సంఖ్య అందుబాటులో లేదు</string>\n    <string name=\"player_unrecoverable_failure\">ప్లేయర్లో కోలుకోలేని లోపం సంభవించింది</string>\n    <string name=\"video_streams_empty\">వీడియో స్ట్రీమ్‌లు ఏవీ కనుగొనబడలేదు</string>\n    <string name=\"missing_file\">ఫైల్ తరలించబడింది లేదా తొలగించబడింది</string>\n    <string name=\"invalid_file\">ఫైల్ ఉనికిలో లేదు లేదా దానిని చదవడానికి లేదా వ్రాయడానికి అనుమతి లేదు</string>\n    <string name=\"error_occurred_detail\">లోపం సంభవించింది: %1$s</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s చూస్తున్నాడు</item>\n        <item quantity=\"other\">%s చూస్తున్నారు</item>\n    </plurals>\n    <string name=\"error_report_channel_description\">లోపాలు నివేదించడానికి నోటిఫికేషన్‌లు</string>\n    <string name=\"error_report_channel_name\">లోపనివేదన నోటిఫికేషన్</string>\n    <string name=\"undo\">చెరుపు</string>\n    <string name=\"main_page_content_swipe_remove\">వాటిని తీసివేయడానికి వాటిని స్వైప్ చేయండి</string>\n    <string name=\"website_encouragement\">మరింత సమాచారం మరియు వార్తల కోసం NewPipe వెబ్‌సైట్‌ని సందర్శించండి.</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe ప్రాజెక్ట్ మీ గోప్యతను చాలా తీవ్రంగా పరిగణిస్తుంది. కాబట్టి, మీ సమ్మతి లేకుండా యాప్ ఎలాంటి డేటాను సేకరించదు.\n\\nNewPipe యొక్క గోప్యతా విధానం మీరు క్రాష్ నివేదికను పంపినప్పుడు ఏ డేటా పంపబడుతుందో మరియు నిల్వ చేయబడుతుందో వివరంగా వివరిస్తుంది.</string>\n    <string name=\"app_license\">NewPipe అనేది కాపీ లెఫ్ట్ లిబ్రే సాఫ్ట్‌వేర్: మీరు దీన్ని ఇష్టానుసారంగా ఉపయోగించవచ్చు, అధ్యయనం చేయవచ్చు మరియు మెరుగుపరచవచ్చు. ప్రత్యేకంగా మీరు ఫ్రీ సాఫ్ట్‌వేర్ ఫౌండేషన్ ద్వారా ప్రచురించబడిన GNU జనరల్ పబ్లిక్ లైసెన్స్ నిబంధనల ప్రకారం, లైసెన్స్ యొక్క వెర్షన్ 3 లేదా (మీ ఐచ్ఛికం ప్రకారం) ఏదైనా తర్వాతి సంస్కరణలో దాన్ని పునఃపంపిణీ చేయవచ్చు మరియు/లేదా సవరించవచ్చు.</string>\n    <string name=\"no_playlist_bookmarked_yet\">ప్లేజాబితా బుక్‌మార్క్‌లు ఇంకా లేవు</string>\n    <string name=\"read_privacy_policy\">గోప్యతా విధానాన్ని చదవండి</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">అప్‌లోడర్ అవతార్ థంబ్‌నెయిల్</string>\n    <string name=\"donation_title\">విరాళం ఇవ్వండి</string>\n    <string name=\"select_a_kiosk\">కియోస్క్‌ని ఎంచుకోండి</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA కుక్కీలను క్లియర్ చేయండి</string>\n    <string name=\"msg_popup_permission\">దీనికి ఈ అనుమతి అవసరం\n\\nతేలియాడే పద్ధతిలో తెరవండి</string>\n    <string name=\"copyright\">© %3$s కింద %2$s ద్వారా %1$s</string>\n    <string name=\"title_last_played\">చివరిగా ఆడింది</string>\n    <string name=\"export_data_summary\">చరిత్ర, సభ్యత్వాలు, ప్లేజాబితాలు మరియు అమరికలను ఎగుమతిచేయుము</string>\n    <string name=\"import_data_summary\">మీ ప్రస్తుత చరిత్ర, సభ్యత్వాలు, ప్లేజాబితాలు మరియు (ఐచ్ఛికంగా) సెట్టింగ్‌లను భర్తీ చేస్తుంది</string>\n    <string name=\"import_data_title\">డాటాబేసుని దిగుమతిచేయుము</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA కుక్కీలను క్లియర్ చేయండి</string>\n    <string name=\"error_report_notification_title\">NewPipe లోపాన్ని ఎదుర్కొంది, నివేదించడానికి నొక్కండి</string>\n    <string name=\"error_report_notification_toast\">లోపం సంభవించింది, నోటిఫికేషన్ చూడండి</string>\n    <string name=\"dismiss\">రద్దుచేయుము</string>\n    <string name=\"rename\">పేరు మార్చండి</string>\n    <string name=\"msg_calculating_hash\">హాష్‌ని లెక్కిస్తోంది</string>\n    <string name=\"no_dir_yet\">ఇంకా డౌన్‌లోడ్ ఫోల్డర్ సెట్ చేయబడలేదు, ఇప్పుడే డిఫాల్ట్ డౌన్‌లోడ్ ఫోల్డర్‌ను ఎంచుకోండి</string>\n    <string name=\"one_item_deleted\">1 అంశం తొలగించబడింది.</string>\n    <string name=\"subtitle_activity_recaptcha\">పరిష్కరించబడినప్పుడు \\\"పూర్తయింది\\\" నొక్కండి</string>\n    <string name=\"recaptcha_solve\">పరిష్కరించండి</string>\n    <string name=\"done\">పూర్తి</string>\n    <string name=\"charset_most_special_characters\">చాలా ప్రత్యేక పాత్రలు</string>\n    <string name=\"app_description\">ఆండ్రాయిడ్‌లో లిబ్రే తేలికపాటి స్ట్రీమింగ్.</string>\n    <string name=\"donation_encouragement\">వాలంటీర్లు తమ ఖాళీ సమయాన్ని వెచ్చిస్తూ మీకు ఉత్తమ వినియోగదారు అనుభవాన్ని అందించడం ద్వారా NewPipe అభివృద్ధి చేయబడింది. డెవలపర్‌లు ఒక కప్పు కాఫీని ఆస్వాదిస్తున్నప్పుడు న్యూపైప్‌ని మరింత మెరుగ్గా చేయడంలో సహాయపడటానికి తిరిగి ఇవ్వండి.</string>\n    <string name=\"give_back\">తిరిగి ఇవ్వండి</string>\n    <string name=\"website_title\">వెబ్సైట్</string>\n    <string name=\"privacy_policy_title\">NewPipe యొక్క గోప్యతా విధానం</string>\n    <string name=\"title_most_played\">ఎక్కువగా ఆడినవి</string>\n    <string name=\"main_page_content_summary\">ప్రధాన పేజీలో ఏ ట్యాబ్‌లు చూపబడతాయి</string>\n    <string name=\"kiosk_page_summary\">కియోస్క్ పేజీ</string>\n    <string name=\"default_kiosk_page_summary\">డిఫాల్ట్ కియోస్క్</string>\n    <string name=\"export_complete_toast\">ఎగుమతి చేయబడింది</string>\n    <string name=\"import_complete_toast\">దిగుమతి చేయబడింది</string>\n    <string name=\"no_valid_zip_file\">చెల్లుబాటు అయ్యే జిప్ ఫైల్ లేదు</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA సవాలు</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA సవాలు అభ్యర్థించబడింది</string>\n    <string name=\"select_a_playlist\">ప్లేజాబితాను ఎంచుకోండి</string>\n    <string name=\"export_data_title\">డాటాబేసుని ఎగుమతిచేయుము</string>\n    <string name=\"show_channel_details\">ఛానెల్ వివరాలను చూపు</string>\n    <string name=\"preferred_open_action_settings_summary\">కంటెంట్‌ని తెరిచేటప్పుడు డిఫాల్ట్ చర్య — %s</string>\n    <string name=\"preferred_open_action_settings_title\">ప్రాధాన్య \\'తెరవండి\\' చర్య</string>\n    <string name=\"enqueue_next_stream\">తదుపరి ఎన్క్యూ</string>\n    <string name=\"enqueued_next\">తదుపరి క్యూలో ఉంచారు</string>\n    <string name=\"preferred_player_fetcher_notification_title\">సమాచారాన్ని పొందుతోంది…</string>\n    <string name=\"start_here_on_popup\">తేలియాడే విధంగా ప్లే చేయడం ప్రారంభించండి</string>\n    <string name=\"local\">స్థానిక</string>\n    <string name=\"preferred_player_fetcher_notification_message\">అభ్యర్థించిన కంటెంట్ లోడ్ అవుతోంది</string>\n    <string name=\"create_playlist\">కొత్త ప్లేజాబితా</string>\n    <string name=\"rename_playlist\">పేరు మార్చండి</string>\n    <string name=\"name\">పేరు</string>\n    <string name=\"popup_player\">తేలియాడే ప్లేయర్</string>\n    <string name=\"always_ask_open_action\">ప్రతిసారీ అడుగు</string>\n    <string name=\"add_to_playlist\">ప్లేజాబితాకు చేర్చు</string>\n    <string name=\"mute\">మూగ</string>\n    <string name=\"could_not_import_all_files\">హెచ్చరిక: అన్ని ఫైల్‌లను దిగుమతి చేయడం సాధ్యపడలేదు.</string>\n    <string name=\"override_current_data\">ఇది మీ ప్రస్తుత సెటప్‌ను భర్తీ చేస్తుంది.</string>\n    <string name=\"import_settings\">మీరు అమరికలను కూడా దిగుమతి చేయాలనుకుంటున్నారా\\?</string>\n    <string name=\"error_unable_to_load_comments\">వ్యాఖ్యలను లోడ్ చేయడం సాధ్యపడలేదు</string>\n    <string name=\"recently_added\">ఇటీవల జోడించినవి</string>\n    <string name=\"most_liked\">చాలా నచ్చింది</string>\n    <string name=\"conferences\">సమావేశాలు</string>\n    <string name=\"title_activity_play_queue\">ప్లే క్యూ</string>\n    <string name=\"enqueue_stream\">ఎన్క్యూ</string>\n    <string name=\"enqueued\">క్యూలో ఉంచారు</string>\n    <string name=\"start_here_on_background\">వెనుకగా ప్లే చేయడం ప్రారంభించండి</string>\n    <string name=\"drawer_open\">డ్రాయర్ తెరవండి</string>\n    <string name=\"drawer_close\">డ్రాయర్‌ని మూసివేయండి</string>\n    <string name=\"video_player\">చలనచిత్ర ప్లేయర్</string>\n    <string name=\"background_player\">తేలియాడే ప్లేయర్</string>\n    <string name=\"processing_may_take_a_moment\">ప్రాసెస్ చేస్తోంది... కొంత సమయం పట్టవచ్చు</string>\n    <string name=\"playlist_thumbnail_change_success\">వినోదజాబితా సూక్ష్మచిత్రం మార్చబడింది.</string>\n    <string name=\"caption_none\">శీర్షికలు వద్దు</string>\n    <string name=\"playlist_creation_success\">వినోదజాబితా రూపొందించబడింది</string>\n    <string name=\"playlist_add_stream_success\">వినోదజాబితా చేయబడింది</string>\n    <string name=\"unmute\">అన్‌మ్యూట్ చేయండి</string>\n    <string name=\"set_as_playlist_thumbnail\">వినోదజాబితాకు సూక్ష్మచిత్రంగా మార్చుము</string>\n    <string name=\"bookmark_playlist\">వినోదజాబితాను ఇష్టంశంగా మార్చుము</string>\n    <string name=\"unbookmark_playlist\">ఇష్టంశాన్ని తొలగించండి</string>\n    <string name=\"delete_playlist_prompt\">ఇష్టంశాన్ని నాశనం చేయాలా\\?</string>\n    <string name=\"resize_fit\">తగినది</string>\n    <string name=\"resize_fill\">పూరించండి</string>\n    <string name=\"resize_zoom\">పరివీక్షణ</string>\n    <string name=\"switch_to_popup\">తేలియాడే విధంగా మార్చు</string>\n    <string name=\"auto_queue_title\">తదుపరి స్ట్రీమ్‌ను స్వీయ-ఎన్క్యూ</string>\n    <string name=\"leak_canary_not_available\">LeakCanary అందుబాటులో లేదు</string>\n    <string name=\"caption_setting_description\">ప్లేయర్ శీర్షిక వచన స్థాయి మరియు నేపథ్య శైలులను సవరించండి. అమలులోకి రావడానికి యాప్ రీస్టార్ట్ అవసరం</string>\n    <string name=\"playlist_no_uploader\">స్వయంచాలకంగా రూపొందించబడింది (ఎక్కించినవారు కనబడుటలేదు)</string>\n    <string name=\"caption_auto_generated\">స్వయంచాలకంగా రూపొందించబడింది</string>\n    <string name=\"caption_setting_title\">శీర్షికలు</string>\n    <string name=\"streams_notification_channel_description\">సభ్యత్వాల కోసం కొత్త స్ట్రీమ్‌ల గురించి నోటిఫికేషన్‌లు</string>\n    <string name=\"playback_reset\">స్థితి పునరుద్ధరణ</string>\n    <string name=\"playback_tempo\">లయ</string>\n    <string name=\"streams_notification_channel_name\">కొత్త స్ట్రీమ్స్</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s కొత్త స్ట్రీమ్</item>\n        <item quantity=\"other\">%s కొత్త స్ట్రీమ్స్</item>\n    </plurals>\n    <string name=\"loading_stream_details\">స్ట్రీమ్ వివరాలను లోడ్ చేస్తోంది…</string>\n    <string name=\"show_memory_leaks\">మెమరీ లీక్‌లను చూపించు</string>\n    <string name=\"enable_disposed_exceptions_title\">జీవితచక్రం లేని లోపాలను నివేదించండి</string>\n    <string name=\"import_network_expensive_warning\">ఈ చర్య నెట్‌వర్క్ ఖరీదైనదని గుర్తుంచుకోండి.\n\\n\n\\nమీరు కొనసాగించాలనుకుంటున్నారా\\?</string>\n    <string name=\"percent\">శాతం</string>\n    <string name=\"semitone\">అర్ధరాగం</string>\n    <string name=\"progressive_load_interval_title\">ప్లేబ్యాక్ లోడ్ విరామం పరిమాణం</string>\n    <string name=\"show_original_time_ago_title\">వస్తువులపై అసలు క్రిత సమయాన్ని చూపుము</string>\n    <string name=\"enable_disposed_exceptions_summary\">పారవేయడం తర్వాత ఫ్రాగ్మెంట్ లేదా యాక్టివిటీ లైఫ్‌సైకిల్ వెలుపల బట్వాడా చేయలేని Rx మినహాయింపులను బలవంతంగా నివేదించడం</string>\n    <string name=\"enable_leak_canary_summary\">మెమరీ లీక్ మానిటరింగ్ హీప్ డంపింగ్ చేసినప్పుడు యాప్ స్పందించక పోవడానికి కారణం కావచ్చు</string>\n    <string name=\"playback_pitch\">శృతి</string>\n    <string name=\"unhook_checkbox\">అన్‌హుక్ (వక్రీకరణకు కారణం కావచ్చు)</string>\n    <string name=\"playback_step\">అడుగు</string>\n    <string name=\"skip_silence_checkbox\">నిశ్శబ్ద సమయంలో వేగంగా ముందుకు వెళ్లుము</string>\n    <string name=\"playback_speed_control\">ప్లేబ్యాక్ స్పీడ్ నియంత్రణలు</string>\n    <string name=\"minimize_on_exit_none_description\">ఏమిలేదు</string>\n    <string name=\"disable_media_tunneling_summary\">మీరు బ్లాక్ స్క్రీన్ లేదా చలనచిత్రం ప్లేబ్యాక్‌లో అంతరాయాన్ని అనుభవిస్తే మీడియా టన్నెలింగ్‌ను నిలిపివేయండి</string>\n    <string name=\"show_error_snackbar\">లోపం స్నాక్‌బార్‌ని చూపండి</string>\n    <string name=\"app_update_unavailable_toast\">మీరు NewPipe యొక్క తాజా సంస్కరణను అమలు చేస్తున్నారు</string>\n    <string name=\"app_update_available_notification_title\">NewPipe నవీకరణ అందుబాటులో ఉంది!</string>\n    <string name=\"missions_header_finished\">పూర్తయింది</string>\n    <string name=\"missions_header_pending\">వేలాడుతున్న</string>\n    <string name=\"show_original_time_ago_summary\">సర్వీస్‌ల నుండి ఒరిజినల్ టెక్స్ట్‌లు స్ట్రీమ్ ఐటెమ్‌లలో కనిపిస్తాయి</string>\n    <string name=\"show_crash_the_player_title\">\\\"ప్లేయర్ పతనం\\\" చూపించు</string>\n    <string name=\"show_crash_the_player_summary\">ప్లేయర్‌ని ఉపయోగిస్తున్నప్పుడు పతనం ఎంపికను చూపుము</string>\n    <string name=\"crash_the_app\">యాప్‌ను పతనం చేయండి</string>\n    <string name=\"low_quality_smaller\">తక్కువ నాణ్యత (చిన్నది)</string>\n    <string name=\"dont_show\">చూపించవద్దు</string>\n    <string name=\"disable_media_tunneling_title\">మీడియా టన్నెలింగ్‌ని నిలిపివేయండి</string>\n    <string name=\"check_new_streams\">కొత్త స్ట్రీమ్‌ల కోసం తనిఖీని అమలు చేయండి</string>\n    <string name=\"create_error_notification\">ఎర్రర్ నోటిఫికేషన్‌ను సృష్టించండి</string>\n    <string name=\"import_title\">దిగుమతి</string>\n    <string name=\"paused\">ఆగిపోయింది</string>\n    <string name=\"sort\">క్రమం</string>\n    <string name=\"app_update_available_notification_text\">%sని డౌన్‌లోడ్ చేయడానికి నొక్కండి</string>\n    <string name=\"notification_actions_summary_android13\">దిగువన ఉన్న ప్రతి నోటిఫికేషన్ చర్యను దానిపై నొక్కడం ద్వారా సవరించండి. మొదటి మూడు చర్యలు (ప్లే/పాజ్, మునుపటి మరియు తదుపరి) సిస్టమ్ ద్వారా సెట్ చేయబడ్డాయి మరియు అనుకూలీకరించబడవు.</string>\n    <string name=\"prefer_original_audio_summary\">భాషతో సంబంధం లేకుండా అసలు ఆడియో ట్రాక్‌ని ఎంచుకోండి</string>\n    <string name=\"prefer_descriptive_audio_title\">వివరణాత్మక ఆడియోకు ప్రాధాన్యత ఇవ్వండి</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">ఉదాహరణకు, మీరు విరిగిన భౌతిక బటన్‌లతో హెడ్‌సెట్‌ని ఉపయోగిస్తుంటే ఉపయోగకరంగా ఉంటుంది</string>\n    <string name=\"progressive_load_interval_summary\">ప్రగతిశీల విషయాలపై లోడ్ విరామం పరిమాణాన్ని మార్చండి (ప్రస్తుతం %s). తక్కువ విలువ వాటి ప్రారంభ లోడింగ్‌ను వేగవంతం చేయవచ్చు</string>\n    <string name=\"ignore_hardware_media_buttons_title\">హార్డ్‌వేర్ మీడియా బటన్ ఈవెంట్‌లను విస్మరించండి</string>\n    <string name=\"prefer_original_audio_title\">అసలు శ్రావ్యయానికి ప్రాధాన్యత ఇవ్వండి</string>\n    <string name=\"limit_mobile_data_usage_title\">మొబైల్ డేటా వాడుతున్నప్పుడు స్పష్టతకు హద్దుపెట్టు</string>\n    <string name=\"import_subscriptions_hint\">3-చుక్కల మెనూలో సభ్యత్వాలను ఎగుమతి లేదా దిగుమతి చేయండి</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-th/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">แตะที่สัญลักษณ์แว่นขยายเพื่อเริ่มต้น</string>\n    <string name=\"upload_date_text\">เผยแพร่เมื่อ %1$s</string>\n    <string name=\"no_player_found\">ไม่พบแอปที่สามารถสตรีมสื่อวีดีโอได้ คุณต้องการติดตั้ง VLC หรือไม่\\?</string>\n    <string name=\"no_player_found_toast\">ไม่พบแอปที่สามารถสตรีมสื่อวีดีโอได้ (คุณสามารถติดตั้ง VLC เพื่อดูวีดีโอ)</string>\n    <string name=\"install\">ติดตั้ง</string>\n    <string name=\"cancel\">ยกเลิก</string>\n    <string name=\"open_in_browser\">เปิดด้วยเว็บบราวเซอร์</string>\n    <string name=\"open_in_popup_mode\">เปิดในโหมดป๊อปอัพ</string>\n    <string name=\"share\">แชร์</string>\n    <string name=\"download\">ดาวน์โหลด</string>\n    <string name=\"controls_download_desc\">ดาวน์โหลดไฟล์สตรีม</string>\n    <string name=\"search\">ค้นหา</string>\n    <string name=\"settings\">การตั้งค่า</string>\n    <string name=\"did_you_mean\">หรือคุณหมายถึง \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">แชร์ด้วย</string>\n    <string name=\"use_external_video_player_title\">ใช้เครื่องเล่นวีดิโอภายนอก</string>\n    <string name=\"use_external_audio_player_title\">ใช้เครื่องเล่นเสียงภายนอก</string>\n    <string name=\"subscribe_button_title\">ติดตาม</string>\n    <string name=\"subscribed_button_title\">ติดตามแล้ว</string>\n    <string name=\"unsubscribe\">ยกเลิกการติดตาม</string>\n    <string name=\"channel_unsubscribed\">ยกเลิกการติดตามช่องแล้ว</string>\n    <string name=\"subscription_change_failed\">ไม่สามารถเปลี่ยนสถานะการติดตามได้</string>\n    <string name=\"subscription_update_failed\">ไม่สามารถอัพเดทการติดตาม</string>\n    <string name=\"show_info\">แสดงข้อมูล</string>\n    <string name=\"tab_subscriptions\">การติดตาม</string>\n    <string name=\"tab_bookmarks\">เพลย์ลิสต์ที่เก็บไว้</string>\n    <string name=\"tab_choose\">เลือกแท็บ</string>\n    <string name=\"fragment_feed_title\">มีอะไรใหม่</string>\n    <string name=\"controls_background_title\">เล่นในพื้นหลัง</string>\n    <string name=\"controls_popup_title\">พ็อปอัพ</string>\n    <string name=\"controls_add_to_playlist_title\">เพิ่มไปยัง</string>\n    <string name=\"download_path_title\">โฟลเดอร์ดาวน์โหลดของวิดีโอ</string>\n    <string name=\"download_path_summary\">ไฟล์วิดีโอที่ดาวน์โหลดไว้จะถูกเก็บที่นี่</string>\n    <string name=\"download_path_dialog_title\">เลือกโฟลเดอร์ดาวน์โหลดสำหรับไฟล์วิดีโอ</string>\n    <string name=\"download_path_audio_title\">โฟลเดอร์ดาวน์โหลดของเสียง</string>\n    <string name=\"download_path_audio_summary\">ไฟล์เสียงที่ดาวน์โหลดไว้จะถูกเก็บไว้ที่นี่</string>\n    <string name=\"download_path_audio_dialog_title\">เลือกโฟลเดอร์ดาวน์โหลดสำหรับไฟล์เสียง</string>\n    <string name=\"default_resolution_title\">ความละเอียดเริ่มต้น</string>\n    <string name=\"default_popup_resolution_title\">ความละเอียดเริ่มต้นในโหมดพ็อปอัพ</string>\n    <string name=\"show_higher_resolutions_title\">แสดงความละเอียดที่สูงขึ้น</string>\n    <string name=\"show_higher_resolutions_summary\">เฉพาะบางอุปกรณ์ที่รองรับการเล่นวิดีโอ 2K/4K</string>\n    <string name=\"play_with_kodi_title\">เปิดด้วย Kodi</string>\n    <string name=\"kore_not_found\">ไม่พบแอป Kore จะติดตั้งหรือไม่\\?</string>\n    <string name=\"show_play_with_kodi_title\">แสดงตัวเลือก \\\"เปิดด้วย Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">แสดงตัวเลือกในการเล่นวิดีโอผ่าน Kodi media center</string>\n    <string name=\"play_audio\">เสียง</string>\n    <string name=\"default_audio_format_title\">รูปแบบเสียงเริ่มต้น</string>\n    <string name=\"default_video_format_title\">รูปแบบวีดีโอเริ่มต้น</string>\n    <string name=\"theme_title\">ธีม</string>\n    <string name=\"light_theme_title\">สว่าง</string>\n    <string name=\"dark_theme_title\">มืด</string>\n    <string name=\"black_theme_title\">สีดำ</string>\n    <string name=\"popup_remember_size_pos_title\">จำขนาดและตำแหน่งของป๊อปอัพ</string>\n    <string name=\"popup_remember_size_pos_summary\">จำขนาดและตำแหน่งสุดท้ายของป๊อปอัพ</string>\n    <string name=\"use_inexact_seek_title\">ใช้การข้ามที่ไม่แม่นยำ</string>\n    <string name=\"use_inexact_seek_summary\">การข้ามช่วงที่ไม่แม่นยำจะทำให้เลื่อนไปยังตำแหน่งเวลาที่ต้องการได้เร็วขึ้น แต่จะลดความแม่นยำในการลากตำแหน่งลง</string>\n    <string name=\"show_comments_title\">แสดงความคิดเห็น</string>\n    <string name=\"show_comments_summary\">ปิดใช้งานเพื่อซ่อนความคิดเห็น</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">ล้างแคชของรูปภาพแล้ว</string>\n    <string name=\"metadata_cache_wipe_summary\">ลบข้อมูลเว็บเพจที่แคชไว้ทั้งหมด</string>\n    <string name=\"auto_queue_title\">คิววีดีโอถัดไปโดยอัตโนมัติ</string>\n    <string name=\"auto_queue_summary\">ต่อท้ายวีดีโอที่เกี่ยวข้องโดยอัตโนมัติเมื่อเล่นถึงรายการสุดท้ายในกรณีที่ไม่ได้ตั้งให้เล่นซ้ำ</string>\n    <string name=\"show_search_suggestions_title\">คำแนะนำการค้นหา</string>\n    <string name=\"show_search_suggestions_summary\">แสดงคำแนะนำเมื่อทำการค้นหา</string>\n    <string name=\"enable_search_history_title\">ประวัติการค้นหา</string>\n    <string name=\"enable_search_history_summary\">จัดเก็บคำที่เคยค้นหาไว้ในเครื่อง</string>\n    <string name=\"enable_watch_history_title\">ประวัติการดู</string>\n    <string name=\"enable_watch_history_summary\">เก็บประวัติการเข้าดูวีดิโอไว้</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">เล่นต่อหลังการขัดจังหวะ (เช่น การรับโทรศัพท์)</string>\n    <string name=\"download_dialog_title\">ดาวน์โหลด</string>\n    <string name=\"autoplay_title\">เล่นอัตโนมัติ</string>\n    <string name=\"show_next_and_similar_title\">แสดงวิดีโอ \\'ถัดไป\\' และ \\'ที่คล้ายกัน\\'</string>\n    <string name=\"show_hold_to_append_title\">แสดงเคล็ดลับ \\\"แตะค้างเพื่อเพิ่ม\\\"</string>\n    <string name=\"show_hold_to_append_summary\">แสดงเคล็ดลับเมื่อกดปุ่มพื้นหลังหรือป๊อปอัพในหน้ารายละเอียดวิดีโอ</string>\n    <string name=\"unsupported_url\">URL ที่ไม่สนับสนุน</string>\n    <string name=\"default_content_country_title\">ประเทศเริ่มต้นของเนื้อหา</string>\n    <string name=\"content_language_title\">ภาษาของเนื้อหาเริ่มต้น</string>\n    <string name=\"settings_category_player_title\">เครื่องเล่น</string>\n    <string name=\"settings_category_player_behavior_title\">พฤติกรรม</string>\n    <string name=\"settings_category_video_audio_title\">วิดีโอและเสียง</string>\n    <string name=\"settings_category_history_title\">ประวัติและแคช</string>\n    <string name=\"settings_category_appearance_title\">ลักษณะ</string>\n    <string name=\"settings_category_debug_title\">แก้ข้อบกพร่อง</string>\n    <string name=\"settings_category_updates_title\">อัพเดต</string>\n    <string name=\"background_player_playing_toast\">กำลังเล่นในโหมดพื้นหลัง</string>\n    <string name=\"popup_playing_toast\">กำลังเล่นในโหมดป๊อปอัพ</string>\n    <string name=\"content\">เนื้อหา</string>\n    <string name=\"show_age_restricted_content_title\">เนื้อหาที่จำกัดอายุ</string>\n    <string name=\"duration_live\">สด</string>\n    <string name=\"downloads\">ดาวน์โหลด</string>\n    <string name=\"downloads_title\">ดาวน์โหลด</string>\n    <string name=\"error_report_title\">รายงานข้อผิดพลาด</string>\n    <string name=\"all\">ทั้งหมด</string>\n    <string name=\"channels\">ช่อง</string>\n    <string name=\"playlists\">เพลย์ลิสต์</string>\n    <string name=\"tracks\">แทร็ค</string>\n    <string name=\"users\">ผู้ใช้</string>\n    <string name=\"events\">เหตุการณ์</string>\n    <string name=\"disabled\">ปิดการใช้งาน</string>\n    <string name=\"clear\">ล้าง</string>\n    <string name=\"best_resolution\">ความละเอียดที่ดีที่สุด</string>\n    <string name=\"undo\">เลิกทำ</string>\n    <string name=\"file_deleted\">ลบไฟล์แล้ว</string>\n    <string name=\"play_all\">เล่นทั้งหมด</string>\n    <string name=\"always\">ตลอดเวลา</string>\n    <string name=\"just_once\">เพียงครั้งเดียว</string>\n    <string name=\"file\">ไฟล์</string>\n    <string name=\"notification_channel_name\">การแจ้งเตือน NewPipe</string>\n    <string name=\"notification_channel_description\">การแจ้งเตือนของแอป NewPipe เมื่อเล่นสื่อในโหมดพื้นหลังและป๊อปอัพ</string>\n    <string name=\"app_update_notification_channel_name\">การแจ้งเตือนการอัปเดตแอป</string>\n    <string name=\"app_update_notification_channel_description\">การแจ้งเตือนสำหรับ NewPipe เวอร์ชั่นใหม่</string>\n    <string name=\"unknown_content\">[ไม่ทราบ]</string>\n    <string name=\"switch_to_background\">สลับไปยังโหมดพื้นหลัง</string>\n    <string name=\"switch_to_popup\">สลับไปยังโหมดป๊อปอัพ</string>\n    <string name=\"switch_to_main\">สลับไปยังโหมดหลัก</string>\n    <string name=\"import_data_title\">นำเข้าฐานข้อมูล</string>\n    <string name=\"export_data_title\">ส่งออกฐานข้อมูล</string>\n    <string name=\"import_data_summary\">แทนที่ประวัติการดูและการสมัครรับข้อมูลของคุณ</string>\n    <string name=\"export_data_summary\">ส่งออกประวัติการดู ช่องที่ได้บอกรับและเพลย์ลิสต์</string>\n    <string name=\"clear_views_history_title\">ล้างประวัติการดู</string>\n    <string name=\"clear_views_history_summary\">ลบประวัติของวีดีโอที่เคยเล่น</string>\n    <string name=\"delete_view_history_alert\">ลบประวัติการดูทั้งหมดหรือไม่\\?</string>\n    <string name=\"clear_search_history_title\">ล้างประวัติการค้นหา</string>\n    <string name=\"clear_search_history_summary\">ลบประวัติของคำที่เคยค้นหา</string>\n    <string name=\"delete_search_history_alert\">ลบประวัติการค้นหาทั้งหมดหรือไม่\\?</string>\n    <string name=\"search_history_deleted\">ลบประวัติการค้นหาแล้ว</string>\n    <string name=\"general_error\">เกิดข้อผิดพลาด</string>\n    <string name=\"download_to_sdcard_error_title\">พื้นที่เก็บข้อมูลภายนอกไม่พร้อมใช้งาน</string>\n    <string name=\"download_to_sdcard_error_message\">การดาวน์โหลดไปยังการ์ดความจำภายนอกยังไม่สามารถทำได้ รีเซ็ตตำแหน่งโฟลเดอร์ดาวน์โหลดหรือไม่\\?</string>\n    <string name=\"network_error\">ข้อผิดพลาดของเครือข่าย</string>\n    <string name=\"could_not_load_thumbnails\">ไม่สามารถโหลดรูปขนาดย่อทั้งหมด</string>\n    <string name=\"parsing_error\">ไม่สามารถแยกวิเคราะห์เว็บไซต์</string>\n    <string name=\"content_not_available\">เนื้อหาไม่พร้อมใช้งาน</string>\n    <string name=\"could_not_setup_download_menu\">ไม่สามารถตั้งค่าเมนูดาวน์โหลด</string>\n    <string name=\"app_ui_crash\">แอป / UI ขัดข้อง</string>\n    <string name=\"player_stream_failure\">ไม่สามารถเล่นสตรีมนี้</string>\n    <string name=\"player_unrecoverable_failure\">เกิดข้อผิดพลาดของตัวเล่นที่ไม่สามารถกู้คืนได้</string>\n    <string name=\"player_recoverable_failure\">กำลังกู้คืนจากข้อผิดพลาดของตัวเล่น</string>\n    <string name=\"external_player_unsupported_link_type\">ตัวเล่นภายนอกไม่สนับสนุนลิงก์ประเภทนี้</string>\n    <string name=\"video_streams_empty\">ไม่พบสตรีมวิดีโอ</string>\n    <string name=\"audio_streams_empty\">ไม่พบสตรีมเสียง</string>\n    <string name=\"invalid_directory\">ไม่มีโฟลเดอร์ตามที่ระบุ</string>\n    <string name=\"invalid_source\">ไม่มีแหล่งแฟ้ม/เนื้อหาดังกล่าว</string>\n    <string name=\"invalid_file\">ไฟล์นี้ไม่มีอยู่หรือไม่ได้รับอนุญาตให้อ่านหรือเขียนไฟล์</string>\n    <string name=\"file_name_empty_error\">ชื่อไฟล์ต้องไม่ว่างเปล่า</string>\n    <string name=\"error_occurred_detail\">เกิดข้อผิดพลาด: %1$s</string>\n    <string name=\"no_streams_available_download\">ไม่มีสตรีมให้ดาวน์โหลด</string>\n    <string name=\"saved_tabs_invalid_json\">เรียกคืนการวางตำแหน่งแท็บเป็นค่าเดิม เนื่องจากพบข้อผิดพลาดในการอ่านการวางตำแหน่งแท็บที่บันทึกไว้</string>\n    <string name=\"restore_defaults\">คืนค่าเริ่มต้น</string>\n    <string name=\"restore_defaults_confirmation\">คุณต้องการคืนค่าเริ่มต้นหรือไม่\\?</string>\n    <string name=\"error_report_button_text\">รายงานข้อผิดพลาดผ่านทาง e-mail</string>\n    <string name=\"what_device_headline\">ข้อมูล:</string>\n    <string name=\"what_happened_headline\">เกิดอะไรขึ้น:</string>\n    <string name=\"your_comment\">ความคิดเห็นของคุณ (เป็นภาษาอังกฤษ):</string>\n    <string name=\"error_details_headline\">รายละเอียด:</string>\n    <string name=\"detail_thumbnail_view_description\">ภาพของตัวอย่างวิดีโอขนาดย่อ</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">รูปขนาดย่อของผู้อัปโหลด</string>\n    <string name=\"detail_likes_img_view_description\">ชอบ</string>\n    <string name=\"detail_dislikes_img_view_description\">ไม่ชอบ</string>\n    <string name=\"search_no_results\">ไม่มีผลลัพธ์</string>\n    <string name=\"empty_list_subtitle\">ไม่มีอะไรที่นี่นอกจากจิ้งหรีด</string>\n    <string name=\"detail_drag_description\">ลากเพื่อจัดลำดับใหม่</string>\n    <string name=\"video\">วิดีโอ</string>\n    <string name=\"audio\">เสียง</string>\n    <string name=\"retry\">ลองอีกครั้ง</string>\n    <string name=\"no_subscribers\">ไม่มีสมาชิกที่สมัครรับ</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"other\">%s บอกรับ</item>\n    </plurals>\n    <string name=\"subscribers_count_not_available\">ไม่สามารถนับจำนวนสมาชิกได้</string>\n    <string name=\"no_views\">ไม่มียอดวิว</string>\n    <plurals name=\"views\">\n        <item quantity=\"other\">%s วิว</item>\n    </plurals>\n    <string name=\"no_videos\">ไม่มีวิดีโอ</string>\n    <string name=\"no_comments\">ไม่มีความคิดเห็น</string>\n    <string name=\"start\">เริ่ม</string>\n    <string name=\"pause\">หยุดพัก</string>\n    <string name=\"create\">สร้าง</string>\n    <string name=\"delete\">ลบ</string>\n    <string name=\"dismiss\">ไม่สนใจ</string>\n    <string name=\"rename\">เปลี่ยนชื่อ</string>\n    <string name=\"msg_name\">ชื่อไฟล์</string>\n    <string name=\"msg_running\">NewPipe กำลังดาวน์โหลด</string>\n    <string name=\"msg_running_detail\">แตะเพื่อดูรายละเอียด</string>\n    <string name=\"msg_wait\">โปรดรอ…</string>\n    <string name=\"msg_copied\">คัดลอกไปที่คลิปบอร์ดแล้ว</string>\n    <string name=\"no_available_dir\">โปรดเลือกโฟลเดอร์ดาวน์โหลดที่พร้อมใช้งาน</string>\n    <string name=\"msg_popup_permission\">การอนุญาตนี้เป็นสิ่งจำเป็นเพื่อ\n\\nเปิดในโหมดป๊อปอัป</string>\n    <string name=\"one_item_deleted\">ลบ 1 รายการแล้ว</string>\n    <string name=\"settings_category_downloads_title\">ดาวน์โหลด</string>\n    <string name=\"settings_file_charset_title\">อักขระที่อนุญาตในชื่อไฟล์</string>\n    <string name=\"settings_file_replacement_character_summary\">อักขระที่ไม่ถูกต้องจะถูกแทนที่ด้วยค่านี้</string>\n    <string name=\"settings_file_replacement_character_title\">อักขระทดแทน</string>\n    <string name=\"charset_letters_and_digits\">ตัวอักษรและตัวเลข</string>\n    <string name=\"charset_most_special_characters\">อักขระพิเศษส่วนใหญ่</string>\n    <string name=\"title_activity_about\">เกี่ยวกับ NewPipe</string>\n    <string name=\"title_licenses\">สัญญาอนุญาตของบุคคลที่สาม</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s โดย %2$s ภายใต้ %3$s</string>\n    <string name=\"tab_about\">เกี่ยวกับ</string>\n    <string name=\"tab_licenses\">สัญญาอนุญาต</string>\n    <string name=\"app_description\">แอปสตรีมมิ่งที่เล็กและเสรีบน Android</string>\n    <string name=\"contribution_title\">สนับสนุน</string>\n    <string name=\"contribution_encouragement\">ไม่ว่าคุณจะมีความคิดที่จะช่วยแปลภาษา เปลี่ยนดีไซน์ แก้ไขโค้ดของโปรแกรมให้ดีขึ้นทั้งในระดับเล็กน้อยหรือจะเปลี่ยนแปลงกันแบบขนานใหญ่ เรายินดีให้คุณได้ร่วมช่วยเหลือเสมอ… ยิ่งทำมาก ยิ่งช่วยให้ดีขึ้นมาก!</string>\n    <string name=\"view_on_github\">ดูบน GitHub</string>\n    <string name=\"donation_title\">บริจาค</string>\n    <string name=\"give_back\">คืนให้</string>\n    <string name=\"website_title\">เว็บไซต์</string>\n    <string name=\"website_encouragement\">เยี่ยมชมเว็บไซต์ NewPipe สำหรับข้อมูลเพิ่มเติมและข่าวสาร</string>\n    <string name=\"privacy_policy_title\">นโยบายความเป็นส่วนตัวของ NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">โครงการ NewPipe คำนึงถึงความเป็นส่วนตัวของคุณอย่างจริงจัง ดังนั้นแอปจะไม่เก็บรวบรวมข้อมูลใดๆ โดยไม่ได้รับความยินยอมจากคุณ\n\\nนโยบายความเป็นส่วนตัวของ NewPipe มีการอธิบายในรายละเอียดเกี่ยวกับข้อมูลที่จะถูกส่งออกไปและเก็บไว้เมื่อคุณรายงานความผิดพลาดของแอป</string>\n    <string name=\"read_privacy_policy\">อ่านนโยบายความเป็นส่วนตัว</string>\n    <string name=\"app_license_title\">สัญญาอนุญาตของ NewPipe</string>\n    <string name=\"read_full_license\">อ่านสัญญาอนุญาต</string>\n    <string name=\"title_activity_history\">ประวัติ</string>\n    <string name=\"action_history\">ประวัติ</string>\n    <string name=\"delete_item_search_history\">คุณต้องการลบรายการนี้ออกจากประวัติการค้นหาหรือไม่\\?</string>\n    <string name=\"title_last_played\">เล่นครั้งล่าสุด</string>\n    <string name=\"title_most_played\">เล่นมากที่สุด</string>\n    <string name=\"main_page_content\">เนื้อหาของหน้าหลัก</string>\n    <string name=\"main_page_content_summary\">แท็บใดบ้างที่ต้องการให้แสดงบนหน้าหลัก</string>\n    <string name=\"blank_page_summary\">หน้าว่าง</string>\n    <string name=\"kiosk_page_summary\">หน้า Kiosk</string>\n    <string name=\"channel_page_summary\">หน้าของช่อง</string>\n    <string name=\"select_a_channel\">เลือกช่อง</string>\n    <string name=\"no_channel_subscribed_yet\">ยังไม่มีการสมัครรับข้อมูลช่องในตอนนี้</string>\n    <string name=\"select_a_kiosk\">เลือกหน้า Kiosk</string>\n    <string name=\"export_complete_toast\">ส่งออกแล้ว</string>\n    <string name=\"import_complete_toast\">นำเข้าแล้ว</string>\n    <string name=\"no_valid_zip_file\">ไม่มีไฟล์ ZIP ที่ถูกต้อง</string>\n    <string name=\"could_not_import_all_files\">คำเตือน: ไม่สามารถนำเข้าไฟล์ทั้งหมดได้</string>\n    <string name=\"override_current_data\">สิ่งนี้จะแทนที่การตั้งค่าปัจจุบันของคุณ</string>\n    <string name=\"import_settings\">คุณยังต้องการนำเข้าการตั้งค่าด้วยหรือไม่\\?</string>\n    <string name=\"error_unable_to_load_comments\">ไม่สามารถโหลดความคิดเห็นได้</string>\n    <string name=\"trending\">มาแรง</string>\n    <string name=\"top_50\">50 อันดับแรก</string>\n    <string name=\"new_and_hot\">ใหม่และมาแรง</string>\n    <string name=\"conferences\">การประชุม</string>\n    <string name=\"play_queue_remove\">เอาออก</string>\n    <string name=\"play_queue_stream_detail\">รายละเอียด</string>\n    <string name=\"play_queue_audio_settings\">การตั้งค่าเสียง</string>\n    <string name=\"hold_to_append\">กดค้างไว้เพื่อเพิ่มลงในคิว</string>\n    <string name=\"start_here_on_background\">เล่นจากจุดนี้ในโหมดพื้นหลัง</string>\n    <string name=\"start_here_on_popup\">เล่นจากจุดนี้ในโหมดป๊อปอัพ</string>\n    <string name=\"preferred_open_action_settings_title\">การดำเนินการ \\'เปิด\\' ที่ต้องการ</string>\n    <string name=\"preferred_open_action_settings_summary\">การดำเนินการเริ่มต้นเมื่อเปิดเนื้อหา — %s</string>\n    <string name=\"video_player\">เครื่องเล่นวิดีโอ</string>\n    <string name=\"background_player\">เครื่องเล่นพื้นหลัง</string>\n    <string name=\"popup_player\">เครื่องเล่นป๊อปอัพ</string>\n    <string name=\"always_ask_open_action\">ถามเสมอ</string>\n    <string name=\"preferred_player_fetcher_notification_title\">กำลังรับข้อมูล…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">กำลังโหลดเนื้อหาที่ร้องขอ</string>\n    <string name=\"create_playlist\">เพลย์ลิสต์ใหม่</string>\n    <string name=\"rename_playlist\">เปลี่ยนชื่อ</string>\n    <string name=\"name\">ชื่อ</string>\n    <string name=\"add_to_playlist\">เพิ่มในเพลย์ลิสต์</string>\n    <string name=\"set_as_playlist_thumbnail\">ตั้งเป็นรูปขนาดย่อของเพลย์ลิสต์</string>\n    <string name=\"bookmark_playlist\">เก็บเพลย์ลิสต์</string>\n    <string name=\"unbookmark_playlist\">เอาที่คั่นหน้าออก</string>\n    <string name=\"delete_playlist_prompt\">ลบเพลย์ลิสต์นี้หรือไม่\\?</string>\n    <string name=\"playlist_creation_success\">สร้างเพลย์ลิสต์แล้ว</string>\n    <string name=\"playlist_add_stream_success\">เพิ่มลงในเพลย์ลิสต์แล้ว</string>\n    <string name=\"playlist_thumbnail_change_success\">เปลี่ยนภาพย่อของเพลย์ลิสต์แล้ว</string>\n    <string name=\"caption_none\">ไม่มีคำอธิบายภาพ</string>\n    <string name=\"resize_fit\">พอดี</string>\n    <string name=\"resize_fill\">เติม</string>\n    <string name=\"resize_zoom\">ขยาย</string>\n    <string name=\"caption_auto_generated\">สร้างขึ้นโดยอัตโนมัติ</string>\n    <string name=\"caption_setting_title\">คำบรรยายภาพ</string>\n    <string name=\"caption_setting_description\">ปรับเปลี่ยนขนาดตัวอักษร สีของข้อความหรือพื้นหลังของคำอธิบายภาพ (จำเป็นตองปิดและเปิดแอปใหม่เพื่อให้การเปลี่ยนแปลงมีผล)</string>\n    <string name=\"enable_leak_canary_summary\">การตรวจสอบการรั่วไหลของหน่วยความจำอาจทำให้แอปจะไม่ตอบสนองเมื่อมีการดึงข้อมูลจากหน่วยความจำ</string>\n    <string name=\"import_title\">นำเข้า</string>\n    <string name=\"import_from\">นำเข้าจาก</string>\n    <string name=\"export_to\">ส่งออกไปยัง</string>\n    <string name=\"import_ongoing\">กำลังนำเข้า…</string>\n    <string name=\"export_ongoing\">กำลังส่งออก…</string>\n    <string name=\"import_file_title\">นำเข้าไฟล์</string>\n    <string name=\"previous_export\">การส่งออกก่อนหน้านี้</string>\n    <string name=\"subscriptions_import_unsuccessful\">ไม่สามารถนำเข้าการสมัครรับข้อมูล</string>\n    <string name=\"subscriptions_export_unsuccessful\">ไม่สามารถส่งออกการสมัครรับข้อมูล</string>\n    <string name=\"import_youtube_instructions\">นำเข้ารายการช่องที่บอกรับใน YouTube โดยการดาวน์โหลดไฟล์การส่งออก: \n\\n \n\\n1. ไปที่ URL นี้: %1$s \n\\n2. เข้าสู่ระบบเมื่อระบบถาม \n\\n3. การดาวน์โหลดควรเริ่มต้น (นั่นคือไฟล์ที่ส่งออก)</string>\n    <string name=\"import_soundcloud_instructions\">นำเข้าโปรไฟล์ SoundCloud โดยการพิมพ์ URL หรือรหัสไอดีผู้ใช้ของคุณ: \n\\n \n\\n1. เปิดใช้งาน \\\"โหมดเดสก์ท็อป\\\" ในเว็บเบราว์เซอร์ (เว็บไซต์ไม่สามารถใช้ได้สำหรับอุปกรณ์มือถือ) \n\\n2. ไปที่ URL นี้: %1$s \n\\n3. เข้าสู่ระบบเมื่อระบบถาม \n\\n4. คัดลอก URL ของโปรไฟล์ที่คุณถูกเปลี่ยนเส้นทางไป</string>\n    <string name=\"import_network_expensive_warning\">โปรดทราบว่าการดำเนินการนี้อาจใช้งานข้อมูลมือถือที่มีค่าใช้จ่าย\n\\n\n\\nคุณต้องการที่จะทำต่อไปหรือไม่\\?</string>\n    <string name=\"playback_speed_control\">การควบคุมความเร็วในการเล่น</string>\n    <string name=\"playback_tempo\">จังหวะ</string>\n    <string name=\"playback_pitch\">เสียงสูงต่ำ</string>\n    <string name=\"unhook_checkbox\">ยกเลิกการเชื่อมโยง (อาจทำให้เสียงมีการบิดเบือน)</string>\n    <string name=\"skip_silence_checkbox\">กรอไปข้างหน้าระหว่างความเงียบ</string>\n    <string name=\"playback_step\">ทีละ</string>\n    <string name=\"playback_reset\">รีเซ็ต</string>\n    <string name=\"start_accept_privacy_policy\">เพื่อให้สอดคล้องกับระเบียบข้อบังคับว่าด้วยการป้องกันข้อมูลทั่วไปของยุโรป (GDPR) เราขอแนะนำให้คุณอ่านนโยบายความเป็นส่วนตัวของ NewPipe อย่างระมัดระวังและถี่ถ้วน\n\\nคุณต้องยอมรับข้อตกลงเพื่ออนุญาตให้ส่งรายงานข้อผิดพลาดถึงเรา</string>\n    <string name=\"accept\">ยอมรับ</string>\n    <string name=\"decline\">ปฏิเสธ</string>\n    <string name=\"limit_data_usage_none_description\">ไม่จำกัด</string>\n    <string name=\"limit_mobile_data_usage_title\">จำกัดความละเอียดเมื่อใช้ข้อมูลมือถือ</string>\n    <string name=\"updates_setting_title\">อัพเดท</string>\n    <string name=\"updates_setting_description\">แสดงการแจ้งเตือนการปรับปรุงให้ทราบก่อนอัพเดทแอพ เมื่อมีเวอร์ชั่นใหม่ให้พร้อมใช้งาน</string>\n    <string name=\"minimize_on_exit_title\">ย่อเล็กสุดเมื่อสลับแอป</string>\n    <string name=\"minimize_on_exit_summary\">การดำเนินการเมื่อสลับไปยังแอปอื่นๆ จากโปรแกรมเล่นวิดีโอหลัก — %s</string>\n    <string name=\"minimize_on_exit_none_description\">ไม่มี</string>\n    <string name=\"minimize_on_exit_background_description\">ย่อเล็กสุดไปยังการเล่นพื้นหลัง</string>\n    <string name=\"minimize_on_exit_popup_description\">ย่อเล็กสุดไปยังการเล่นป๊อปอัพ</string>\n    <string name=\"list_view_mode\">โหมดมุมมองรายการ</string>\n    <string name=\"list\">รายการ</string>\n    <string name=\"grid\">ตาราง</string>\n    <string name=\"auto\">อัตโนมัติ</string>\n    <string name=\"app_update_available_notification_title\">NewPipe พร้อมให้อัพเดทแล้ว!</string>\n    <string name=\"missions_header_finished\">เสร็จแล้ว</string>\n    <string name=\"missions_header_pending\">อยู่ในคิว</string>\n    <string name=\"paused\">หยุดชั่วคราว</string>\n    <string name=\"queued\">อยู่ในคิวแล้ว</string>\n    <string name=\"enqueue\">คิว</string>\n    <string name=\"permission_denied\">การดำเนินการถูกปฏิเสธโดยระบบ</string>\n    <string name=\"download_failed\">การดาวน์โหลดล้มเหลว</string>\n    <string name=\"generate_unique_name\">สร้างชื่อเฉพาะ</string>\n    <string name=\"overwrite\">เขียนทับ</string>\n    <string name=\"download_already_running\">มีการดาวน์โหลดที่กำลังดำเนินการอยู่ด้วยไฟล์ชื่อนี้อยู่แล้ว</string>\n    <string name=\"show_error\">แสดงข้อผิดพลาด</string>\n    <string name=\"error_path_creation\">ไม่สามารถสร้างไฟล์ได้</string>\n    <string name=\"error_file_creation\">ไม่สามารถสร้างโฟลเดอร์ปลายทางได้</string>\n    <string name=\"error_ssl_exception\">ล้มเหลวในการสร้างการเชื่อมต่อที่ปลอดภัย</string>\n    <string name=\"error_unknown_host\">ไม่พบเซิร์ฟเวอร์</string>\n    <string name=\"error_connect_host\">ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์</string>\n    <string name=\"error_http_no_content\">เซิร์ฟเวอร์ไม่ส่งข้อมูล</string>\n    <string name=\"error_http_unsupported_range\">เซิร์ฟเวอร์ไม่รองรับการดาวน์โหลดแบบพร้อมกันหลายส่วน โปรดลองอีกครั้งด้วย @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">ไม่พบ</string>\n    <string name=\"stop\">หยุด</string>\n    <string name=\"max_retry_msg\">จำนวนครั้งสูงสุดที่จะลองใหม่</string>\n    <string name=\"max_retry_desc\">จำนวนครั้งสูงสุดที่จะลองใหม่ก่อนจะยกเลิกการดาวน์โหลด</string>\n    <string name=\"pause_downloads_on_mobile\">หยุดชั่วคราวเมื่อเปลี่ยนเป็นข้อมูลมือถือ</string>\n    <string name=\"pause_downloads_on_mobile_desc\">การดาวน์โหลดที่ไม่สามารถหยุดพักได้จะเริ่มต้นใหม่</string>\n    <string name=\"close\">ปิด</string>\n    <string name=\"use_external_video_player_summary\">ลบเสียงสำหรับบางความละเอียดหน้าจอ</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">แคช metadate ถูกลบแล้ว</string>\n    <string name=\"resume_on_audio_focus_gain_title\">เล่นต่อหลังจากการขัดจังหวะ</string>\n    <string name=\"enable_playback_resume_title\">เล่นต่อ</string>\n    <string name=\"enable_playback_resume_summary\">เล่นต่อจากที่เคยเล่นครั้งล่าสุด</string>\n    <string name=\"enable_playback_state_lists_title\">ตำแหน่งวีดิโอในรายการ</string>\n    <string name=\"enable_playback_state_lists_summary\">แสดงตำแหน่งวีดิโอที่เล่นในรายการ</string>\n    <string name=\"settings_category_clear_data_title\">ล้างข้อมูล</string>\n    <string name=\"search_showing_result_for\">กำลังแสดงผลลัพธ์สำหรับ: %s</string>\n    <string name=\"open_with\">เปิดด้วย</string>\n    <string name=\"mark_as_watched\">ทำเครื่องหมายว่าดูแล้ว</string>\n    <string name=\"ok\">ตกลง</string>\n    <string name=\"notification_action_3_title\">ปุ่มคำสั่งที่สี่</string>\n    <string name=\"notification_action_0_title\">ปุ่มคำสั่งแรก</string>\n    <string name=\"notification_action_2_title\">ปุ่มคำสั่งที่สาม</string>\n    <string name=\"notification_action_4_title\">ปุ่มคำสั่งที่ห้า</string>\n    <string name=\"notification_actions_summary\">แก้ไขคำสั่งของการแต่การแจ้งเตือนด้วยการแตะไปที่มัน เลือกสามรายการที่จะแสดงในการแจ้งเตือนในการแจ้งเตือนแบบกระทัดรัดโดยใช้ปุ่มกาเครื่องหมายทางขวา</string>\n    <string name=\"notification_scale_to_square_image_title\">ตัดหน้าปกวิดีโอเป็นอัตราส่วน 1:1</string>\n    <string name=\"notification_scale_to_square_image_summary\">ตัดหน้าปกวิดีโอที่แสดงในการแจ้งเตือนจากอัตราส่วน 16:9 เป็น 1:1</string>\n    <string name=\"crash_the_player\">เครื่องเล่นวิดีโอแครช</string>\n    <string name=\"notification_action_1_title\">ปุ่มคำสั่งที่สอง</string>\n    <string name=\"night_theme_title\">โหมดกลางคืน</string>\n    <string name=\"prefer_original_audio_summary\">เลือกเสียงต้นฉบับโดยไม่คำนึงถึงภาษาที่ใช้</string>\n    <string name=\"show_description_summary\">ปิดเพื่อซ่อนคำอธิบายของวิดีโอและข้อมูลเพิ่มเติมอื่นๆ</string>\n    <string name=\"prefer_original_audio_title\">ชอบเสียงต้นฉบับมากกว่า</string>\n    <string name=\"prefer_descriptive_audio_title\">ชอบเสียงแบบบรรยายมากกว่า</string>\n    <string name=\"left_gesture_control_title\">คำสั่งสัมผัสฝั่งซ้าย</string>\n    <string name=\"none\">ไม่มี</string>\n    <string name=\"peertube_instance_add_help\">ใส่ที่อยู่ URL ของอินสแตนซ์</string>\n    <string name=\"peertube_instance_add_exists\">มีอินสแตนซ์นี้อยู่แล้ว</string>\n    <string name=\"notification_action_shuffle\">สลับ</string>\n    <string name=\"notification_colorize_title\">เปลี่ยนสีการแจ้งเตือน</string>\n    <string name=\"clear_queue_confirmation_summary\">เปลี่ยนจากเครื่องเล่นหนึ่งไปอีกเครื่องเล่นหนึ่งอาจแทนที่คิวของคุณ</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">มีประโยชน์อย่างมากเมื่อใส่หูฟังที่ปุ่มกดพัง</string>\n    <string name=\"prefer_descriptive_audio_summary\">เลือกเสียงแบบบรรยายสำหรับผู้มีความบกพร่องทางการมองเห็น ถ้าเกิดมีตัวเลือกนี้</string>\n    <string name=\"local_search_suggestions\">แนะนำการค้นหาที่อยู่ในท้องที่</string>\n    <string name=\"left_gesture_control_summary\">เลือกคำสั่งสัมผัสสำหรับฝั่งซ้ายของหน้าจอเครื่องเล่น</string>\n    <string name=\"settings_category_player_notification_title\">การแจ้งเตือนจากเครื่องเล่น</string>\n    <string name=\"notification_action_repeat\">วนซ้ำ</string>\n    <string name=\"seek_duration_title\">เร่งความเร็วไปข้างหน้า/ย้อนกลับหาช่วงเวลา</string>\n    <string name=\"start_main_player_fullscreen_title\">เริ่มเครื่องเล่นหลักแบบเต็มหน้าจอ</string>\n    <string name=\"start_main_player_fullscreen_summary\">อย่าเริ่มวิดีโอในเครื่องเล่นเล็ก แต่เปลี่ยนเป็นเต็มหน้าจอโดยตรง ถ้าการหมุนหน้าจออัตโนมัติล็อคไว้ คุณยังสามารถเข้าถึงเครื่องเล่นเล็กโดยการออกจากโหมดเต็มหน้าจอ</string>\n    <string name=\"unsupported_url_dialog_message\">ไม่สามารถระบุที่อยู่ URL ได้ ลองเปิดด้วยแอปอื่น</string>\n    <string name=\"clear_queue_confirmation_title\">ถามก่อนการเคลียร์คิว</string>\n    <string name=\"clear_queue_confirmation_description\">คิวในเครื่องเล่นที่ใช้งานอยู่จะถูกแทนที่</string>\n    <string name=\"show_description_title\">แสดงคำอธิบาย</string>\n    <string name=\"show_meta_info_title\">แสดง meta info</string>\n    <string name=\"metadata_cache_wipe_title\">ล้าง cached metadata</string>\n    <string name=\"auto_queue_toggle\">เข้าคิวอัตโนมัติ</string>\n    <string name=\"right_gesture_control_summary\">เลือกคำสั่งสัมผัสฝั่งขวาของหน้าจอเครื่องเล่น</string>\n    <string name=\"right_gesture_control_title\">คำสั่งสัมผัสฝั่งขวา</string>\n    <string name=\"brightness\">ความสว่าง</string>\n    <string name=\"volume\">ระดับเสียง</string>\n    <string name=\"remote_search_suggestions\">แนะนำการค้นหาที่อยู่ไกลขึ้น</string>\n    <string name=\"peertube_instance_url_title\">PeerTube อินสแตนซ์</string>\n    <string name=\"peertube_instance_url_summary\">เลือก PeerTube อินสแตนซ์โปรดของคุณ</string>\n    <string name=\"peertube_instance_url_help\">หาอินสแตนซ์ที่คุณชอบอยู่ใน %s</string>\n    <string name=\"peertube_instance_add_title\">เพิ่มอินสแตนซ์</string>\n    <string name=\"peertube_instance_add_fail\">ไม่สามารถตรวจสอบอินสแตนซ์ได้</string>\n    <string name=\"peertube_instance_add_https_only\">รับรองเฉพาะที่อยู่ URL แบบ HTTPS</string>\n    <string name=\"notification_action_nothing\">ไม่มี</string>\n    <string name=\"no\">ไม่</string>\n    <string name=\"yes\">ใช่/ตกลง</string>\n    <string name=\"videos_string\">วิดีโอ</string>\n    <string name=\"mute\">ปิดเสียง</string>\n    <string name=\"unmute\">เลิกปิดเสียง</string>\n    <string name=\"feed_create_new_group_button_title\">ใหม่</string>\n    <string name=\"settings_category_feed_title\">ฟีด</string>\n    <string name=\"songs\">เพลง</string>\n    <string name=\"albums\">อัลบั้ม</string>\n    <string name=\"never\">ไม่ต้อง</string>\n    <string name=\"recent\">ล่าสุด</string>\n    <string name=\"comments_tab_description\">ความคิดเห็น</string>\n    <string name=\"description_tab_description\">คำอธิบาย</string>\n    <string name=\"featured\">แนะนำ</string>\n    <string name=\"metadata_category\">หมวดหมู่</string>\n    <string name=\"metadata_tags\">แท็ก</string>\n    <string name=\"metadata_licence\">ลิขสิทธิ์</string>\n    <string name=\"metadata_language\">ภาษา</string>\n    <string name=\"sort\">จัดเรียง</string>\n    <string name=\"card\">การ์ด</string>\n    <string name=\"feed_show_upcoming\">กำลังจะมา</string>\n    <string name=\"search_with_service_name\">ค้นหา %1$s</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ti/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"cancel\">ሰረዝ</string>\n    <string name=\"open_in_browser\">ኣብ መርበብ-ሓበሬታ ክፉት</string>\n    <string name=\"search_showing_result_for\">ውጽኢት ናይ፦ %s</string>\n    <string name=\"main_bg_subtitle\">ንኽትጅምር ነቲ ምድላይ ምልክት ጠውቆ።</string>\n    <string name=\"upload_date_text\">ዝተሓትመሉ ዕለት %1$s</string>\n    <string name=\"no_player_found\">ናይ ዥረት ተጻዋታይ ኣይተረኽበን። VLC ይውርድ፧</string>\n    <string name=\"ok\">ሐራይ</string>\n    <string name=\"settings\">ቅጥዕታት</string>\n    <string name=\"did_you_mean\">\\\"%1$s\\\" ማለቱ ድዩ፧</string>\n    <string name=\"mark_as_watched\">ዚተሪየ ጋባራ</string>\n    <string name=\"open_with\">ክፉቴ ምሲ</string>\n    <string name=\"controls_download_desc\">ስትሪም ፋይል ኣውርድ</string>\n    <string name=\"search\">ድለ</string>\n    <string name=\"share\">ኣካፍሎ</string>\n    <string name=\"download\">ኣራግፍ</string>\n    <string name=\"share_dialog_title\">ኣካፍሎም ምሲ</string>\n    <string name=\"channel_unsubscribed\">መስመር ኣይትጽንበሩ</string>\n    <string name=\"open_in_popup_mode\">ኣብ ፖፕኣፕ ኣገባብ ክፉት</string>\n    <string name=\"subscribed_button_title\">ሰዓብካ\\'ኪ</string>\n    <string name=\"subscription_change_failed\">ክቕይር ኣይከኣለን ምዝገብ</string>\n    <string name=\"use_external_video_player_summary\">ድምጺታት ኣብ ገለ ርዝነት የወግድ</string>\n    <string name=\"no_player_found_toast\">ወሓይዝ ዚጻወት ኣይተረኽበን። (ንኽትጻወቶ VLC ከተውራድ ትኽእል)።</string>\n    <string name=\"subscription_update_failed\">ክሕደስ ኣይከኣለን ምዝገባ</string>\n    <string name=\"subscribe_button_title\">ሰዓበ</string>\n    <string name=\"use_external_video_player_title\">ናይ ደገ ቪድዮ ተጠቐም መጻወቲ</string>\n    <string name=\"install\">ምውራድ</string>\n    <string name=\"unsubscribe\">ምስዓብ ኣቋርጽ</string>\n    <string name=\"notification_scale_to_square_image_summary\">ነቲ ኣብ\\'ቲ ምልክታ ዝተርኣየ ናይ ቪድዮ ምስሊ ካብ 16:9 ናብ 1:1 ርሕቐት ኣቀራርባ ቅረጽ</string>\n    <string name=\"play_with_kodi_title\">ምስ Kodi ተጻወት</string>\n    <string name=\"controls_add_to_playlist_title\">ድምር ምስ</string>\n    <string name=\"show_info\">ሓበሬታ ኣርእዩ</string>\n    <string name=\"notification_colorize_title\">መፍለጢ ሕብሪ ልኸ</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Play with Kodi\\\" ኣማራጺ</string>\n    <string name=\"show_higher_resolutions_title\">ዝያዳ ድንቀት ኣርኢ</string>\n    <string name=\"download_path_dialog_title\">ንተንቃሳቀሴ-ምስሌ ፋይላት ዝኸውን ናይ ምውራድ ማህደር ምረጽ</string>\n    <string name=\"crash_the_player\">ተጻዋታይ ወደቀ</string>\n    <string name=\"play_audio\">ድምጺ</string>\n    <string name=\"download_path_audio_summary\">ድምጺ ምውራድ ማህደር ፋይላት ኣብዚ ይኽዘኑ</string>\n    <string name=\"notification_action_nothing\">ዋላ-ሓንቲ</string>\n    <string name=\"show_higher_resolutions_summary\">ገለ መሳርሒታት ጥራይ እዮም 2K/4K ተንቃሳቀሴ-ምስሌ ክጻወቱ ዝኽእሉ</string>\n    <string name=\"use_external_audio_player_title\">ናይ ደገ ድምጺ መጻወቲ ተጠቐም</string>\n    <string name=\"notification_colorize_summary\">Android ሕብሪ ናይቲ መተሓሳሰቢ ብመሰረት እቲ ኣብቲ ንእሽቶ ስእሊ ዘሎ ቀንዲ ሕብሪ ከም ዝጥዕሞ ግበር (እዚ ኣብ ኩሉ መሳርሒታት ከምዘይርከብ ኣስተውዕል)</string>\n    <string name=\"default_popup_resolution_title\">ትሑዝ ፖፕኣፕ ድንቀት</string>\n    <string name=\"notification_actions_summary\">ነፍሲ ወከፍ መፍለጢ ተግባር ኣብ ታሕቲ ብምጥዋቕ ኣርትዖ። ኣብቲ ውህሉል መተሓሳሰቢ ንኽርአ ክሳብ ሰለስተ ካብኣቶም ምረጽ፡ ኣብ የማናይ ሸነኽ ዘሎ ሳጹናት ብምጥቃም።</string>\n    <string name=\"controls_popup_title\">ፖፕኣፕ</string>\n    <string name=\"default_resolution_title\">ትሑዝ ድንቀት</string>\n    <string name=\"download_path_summary\">ዝወረዱ ናይ ተንቃሳቀሴ-ምስሌ ፋይላት ኣብዚ ይኽዘኑ</string>\n    <string name=\"default_video_format_title\">ነባሪ ቪድዮ ፎርማት</string>\n    <string name=\"notification_scale_to_square_image_title\">ናይ እኽሊ ምስሊ ምስ ናይ 1:1 ርክባት</string>\n    <string name=\"notification_action_0_title\">ቀዳማይ ወሰን ተጠዋቃ</string>\n    <string name=\"notification_action_repeat\">ደገመ</string>\n    <string name=\"download_path_audio_title\">ድምጺ ምውራድ ማህደር</string>\n    <string name=\"tab_bookmarks\">ዝርዝር-ጸወታት</string>\n    <string name=\"download_path_audio_dialog_title\">ናይ ድምጺ ፋይል ኣራግፍ ምረጽ</string>\n    <string name=\"kore_not_found\">ዝጎደለ ኮረ ኣፕፕ ኣውራድ፧</string>\n    <string name=\"default_audio_format_title\">ነባሪ ቅርጺ ድምጺ</string>\n    <string name=\"tab_subscriptions\">እትስዕቦም</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi ሚድያ ማእኸል ቪድዮ ንምጽዋት ዝሕግዝ ኣማራጺ</string>\n    <string name=\"notification_actions_at_most_three\">ኣብቲ ውሱን መፍለጢ ንምርኣይ እንተበዝሐ ሰለስተ ተግባራት ክትመርጽ ትኽእል ኢኻ!</string>\n    <string name=\"download_path_title\">ተንቃሳቀሴ-ምስሌ ፋይል ኣራግፍ</string>\n    <string name=\"tab_choose\">ታብ ምረጽ</string>\n    <string name=\"controls_background_title\">ድሕረ ባይታ</string>\n    <string name=\"light_theme_title\">ብርሃን</string>\n    <string name=\"dark_theme_title\">ጸልማት</string>\n    <string name=\"notification_action_1_title\">ካልኣይ ስጉምቲ መጠወቒ</string>\n    <string name=\"notification_action_2_title\">ሳልሳይ ስጉምቲ መጠወቒ</string>\n    <string name=\"notification_action_4_title\">ሓሙሻይ ስጉምቲ መጠወቒ</string>\n    <string name=\"yes\">እወ</string>\n    <string name=\"no\">ኣይፋልን</string>\n    <string name=\"black_theme_title\">ጸሊም</string>\n    <string name=\"theme_title\">ቆርበት ኣርእስቲ</string>\n    <string name=\"night_theme_title\">ለይታው ቆርበት</string>\n    <string name=\"popup_remember_size_pos_title\">ናይ ፖፕኣፕ ባህርያት ዘክር</string>\n    <string name=\"popup_remember_size_pos_summary\">ናይ ፖፕኣፕ ዝነበሮ ቦታ ዘክር</string>\n    <string name=\"clear_queue_confirmation_title\">ቅድሚ ምጽራይ ተራታት ናይ መረጋገጺ ሕተት</string>\n    <string name=\"show_comments_title\">ርእይቶታት ኣርእዩ</string>\n    <string name=\"show_comments_summary\">ርእይቶታት ንምሕባእ እዚ ኣጥፍእ</string>\n    <string name=\"none\">ዋላ-ሓደ</string>\n    <string name=\"download_dialog_title\">ውራድ</string>\n    <string name=\"settings_category_player_title\">ኣጻዋታይ</string>\n    <string name=\"settings_category_appearance_title\">ትርኢት</string>\n    <string name=\"content\">ትሕዝቶ</string>\n    <string name=\"duration_live\">ህያው</string>\n    <string name=\"downloads\">ርጋፍታት</string>\n    <string name=\"downloads_title\">ርጋፍታት</string>\n    <string name=\"all\">ኵሉ</string>\n    <string name=\"channels\">መስመርት</string>\n    <string name=\"playlists\">ዝርዝር-ጸወታ</string>\n    <string name=\"videos_string\">ቪዶ</string>\n    <string name=\"users\">ተጠቀምቲ</string>\n    <string name=\"events\">ፍጻመታት</string>\n    <string name=\"songs\">ደርፍታት</string>\n    <string name=\"albums\">ኣልበማት</string>\n    <string name=\"artists\">ስነ-ጥበባውያን</string>\n    <string name=\"search_with_service_name\">%1$s ድለ</string>\n    <string name=\"search_with_service_name_and_filter\">ድለ %1$sን %2$s</string>\n    <string name=\"tab_bookmarks_short\">ዝርዝር-ጸወታት</string>\n    <string name=\"notification_action_3_title\">ራብዓይ ስጉምቲ መጠወቒ</string>\n    <string name=\"notification_action_shuffle\">ሕንፍሽፍሽ</string>\n    <string name=\"action_history\">ታሪኽ</string>\n    <string name=\"local\">ዞባዊ</string>\n    <string name=\"conferences\">ኣኼባ</string>\n    <string name=\"play_queue_remove\">ኣወግድ</string>\n    <string name=\"play_queue_stream_detail\">ዝርዝር ሓበሬታ</string>\n    <string name=\"enqueue_stream\">መስርዕ</string>\n    <string name=\"enqueued\">ተሰሪዑ</string>\n    <string name=\"rename_playlist\">ስም ቀያር</string>\n    <string name=\"name\">ስም</string>\n    <string name=\"mute\">ዓባስ</string>\n    <string name=\"playlist_add_stream_success\">ኣብ ዝርዝር-ጸወታ ኮነ</string>\n    <string name=\"resize_fit\">ግጡም</string>\n    <string name=\"resize_fill\">ሙሉእ</string>\n    <string name=\"playback_step\">ስጉሚ</string>\n    <string name=\"accept\">ተቐበል</string>\n    <string name=\"decline\">ንጸግ</string>\n    <string name=\"minimize_on_exit_none_description\">ዋላ-ሓደ</string>\n    <string name=\"never\">ብፍጹም</string>\n    <string name=\"list\">ዝርዝር</string>\n    <string name=\"caption_none\">ብዘይ መግለጺ ጽሑፍ</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s ተራእዩ</item>\n        <item quantity=\"other\">%s ተራእዩ</item>\n    </plurals>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s ተኸታሊ</item>\n        <item quantity=\"other\">%s ተኸታተልቲ</item>\n    </plurals>\n    <string name=\"create_playlist\">ሓድሽ ዝርዝር ጸወታ</string>\n    <string name=\"create\">ፍጠር</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d ሰዓት</item>\n        <item quantity=\"other\">%d ሰዓታት</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d መዓልቲ</item>\n        <item quantity=\"other\">%d መዓልታት</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d ካልኢት</item>\n        <item quantity=\"other\">%d ካልኢት</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d ደቒቕ</item>\n        <item quantity=\"other\">%d ደቓይቕ</item>\n    </plurals>\n    <string name=\"fragment_feed_title\">እንታይ ሓድሽ ኣሎ</string>\n    <string name=\"feed_create_new_group_button_title\">ሓድሽ</string>\n    <string name=\"feed_groups_header_title\">ጉጅለታት መስመር</string>\n    <string name=\"play_all\">ኩሉ ተጻወቶ</string>\n    <string name=\"feed_show_upcoming\">ኣብ ዝመጺእ</string>\n    <string name=\"feed_show_partially_watched\">ብኸፊል ዝተራእየ</string>\n    <string name=\"feed_show_watched\">ብምሉእ ዝተራእየ</string>\n    <string name=\"feed_hide_streams_title\">እዞም ዝስዕቡ ውሕጅታት ኣርእዩ</string>\n    <string name=\"feed_oldest_subscription_update\">ዝተሓደሰ ዕለት: %s</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">ቅልጡፍ ኣገባብ ኣንቅሕ</string>\n    <string name=\"error_details_headline\">ዝርዝራት:</string>\n    <string name=\"detail_likes_img_view_description\">ፈተውቲ</string>\n    <string name=\"detail_dislikes_img_view_description\">ጸላእቲ</string>\n    <string name=\"comments_tab_description\">ርእይቶታት</string>\n    <string name=\"description_tab_description\">መብርሂ</string>\n    <string name=\"audio\">ብድምጺ</string>\n    <string name=\"retry\">እንደገና ፈትን</string>\n    <string name=\"short_thousand\">%sሽ</string>\n    <string name=\"short_million\">%sሚ</string>\n    <string name=\"short_billion\">%sቢ</string>\n    <string name=\"start\">ጀምር</string>\n    <string name=\"delete\">ደምስስ</string>\n    <string name=\"dismiss\">ሰሩዞ</string>\n    <string name=\"rename\">ስም ቀያር</string>\n    <string name=\"msg_error\">ስሕተት</string>\n    <string name=\"metadata_tags\">መፍለዪ</string>\n    <string name=\"metadata_privacy_public\">ህዝባዊ</string>\n    <string name=\"metadata_privacy\">ብሕትነት</string>\n    <string name=\"tab_licenses\">ፍቓድታት</string>\n    <string name=\"read_full_license\">ፍቓድ ኣንብብ</string>\n    <string name=\"metadata_category\">ምድብ</string>\n    <string name=\"metadata_licence\">ፍቓድ</string>\n    <string name=\"settings_category_updates_title\">እዋናዊታት</string>\n    <string name=\"metadata_avatars\">ኣቫታራት</string>\n    <string name=\"metadata_banners\">ባነራት</string>\n    <string name=\"metadata_privacy_unlisted\">ዘይተዘርዘረ</string>\n    <string name=\"metadata_privacy_private\">ብሕታዊ</string>\n    <string name=\"metadata_privacy_internal\">ውሽጣዊ</string>\n    <string name=\"metadata_subscribers\">ተኸታተልቲ</string>\n    <string name=\"open_website_license\">መርበብ-ቦታ ክፈት</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-tl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"light_theme_title\">Maliwanag</string>\n    <string name=\"dark_theme_title\">Madilim</string>\n    <string name=\"restricted_video_no_stream\">Ang video na ito ay may paghihigpit sa edad.\n\\n\n\\nDahil sa mga bagong polisiya ng Youtube, hindi maaring ma-access ng NewPipe ang mga video streams nito, kaya hindi ito maipapalabas.</string>\n    <string name=\"subscription_change_failed\">Di-mabago ang subscription</string>\n    <string name=\"show_comments_summary\">Patayin upang maitago ang mga puna</string>\n    <string name=\"mark_as_watched\">I-tanda bilang napanood na</string>\n    <string name=\"share\">Ibahagi</string>\n    <string name=\"download\">I-download</string>\n    <string name=\"controls_download_desc\">I-download ang stream file</string>\n    <string name=\"settings\">Ayos ng App</string>\n    <string name=\"did_you_mean\">Ibig mo bang sabihin \\\"%1$s\\\"\\?</string>\n    <string name=\"search_showing_result_for\">Ipinapakita ang mga resulta para sa: %s</string>\n    <string name=\"open_with\">Buksan sa</string>\n    <string name=\"main_bg_subtitle\">Pindutin ang magnifiying glass upang magsimula.</string>\n    <string name=\"upload_date_text\">Inilathala noong %1$s</string>\n    <string name=\"ok\">Sige</string>\n    <string name=\"your_comment\">Iyong puna (sa Ingles):</string>\n    <string name=\"use_external_video_player_summary\">Tinatanggal ang audio sa ilang mga resolusyon</string>\n    <string name=\"subscribe_button_title\">Mag-subscribe</string>\n    <string name=\"channel_unsubscribed\">Naka-unsubscribe na sa channel</string>\n    <string name=\"controls_background_title\">Likuran</string>\n    <string name=\"show_info\">Ipakita ang paglalarawan</string>\n    <string name=\"tab_subscriptions\">Mga subscription</string>\n    <string name=\"black_theme_title\">Maitim</string>\n    <string name=\"show_description_title\">Ipakita ang paglalarawan</string>\n    <string name=\"show_search_suggestions_title\">Mga mungkahi sa paghahanap</string>\n    <string name=\"enable_playback_resume_title\">Ituloy ang pagpapalabas</string>\n    <string name=\"enable_watch_history_title\">Kasaysayan ng napanood</string>\n    <string name=\"settings_category_clear_data_title\">Linisin ang data</string>\n    <string name=\"autoplay_title\">Kusang pagpapalabas</string>\n    <string name=\"downloads\">Mga Download</string>\n    <string name=\"downloads_title\">Mga Download</string>\n    <string name=\"all\">Lahat</string>\n    <string name=\"channels\">Mga Channel</string>\n    <string name=\"playlists\">Mga Listahan ng Ipapalabas</string>\n    <string name=\"videos_string\">Mga Video</string>\n    <string name=\"tracks\">Mga Track</string>\n    <string name=\"users\">Mga Gumagamit</string>\n    <string name=\"events\">Mga Kaganapan</string>\n    <string name=\"songs\">Mga Awit</string>\n    <string name=\"albums\">Mga Album</string>\n    <string name=\"no_comments\">Walang puna</string>\n    <string name=\"comments_are_disabled\">Hindi pinapahintulot ang pagpuna</string>\n    <string name=\"no_views\">Wala pang nakapanood</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s panonood</item>\n        <item quantity=\"other\">Mga %s panonood</item>\n    </plurals>\n    <string name=\"trending\">Mga Patok Ngayon</string>\n    <string name=\"show_comments_title\">Ipakita ang mga puna</string>\n    <string name=\"cancel\">Ipagpaliban</string>\n    <string name=\"open_in_browser\">Buksan sa browser</string>\n    <string name=\"search\">Maghanap</string>\n    <string name=\"share_dialog_title\">Ibahagi sa</string>\n    <string name=\"use_external_video_player_title\">Gumamit ng ibang video player</string>\n    <string name=\"comments_tab_description\">Mga Puna</string>\n    <string name=\"error_unable_to_load_comments\">Hindi mai-karga ang mga puna</string>\n    <string name=\"detail_pinned_comment_view_description\">Naka-pin na puna</string>\n    <string name=\"show_description_summary\">Patayin upang itago ang paglalarawan ng video at ang karagdagang kaalaman nito</string>\n    <string name=\"restricted_video\">Ang video na ito ay may paghihigpit sa edad.\n\\n\n\\nBuksan ang \\\"%1$s\\\" sa ayos ng app kung gusto mong makita ito.</string>\n    <string name=\"artists\">Mga Artista</string>\n    <string name=\"controls_popup_title\">Nakalutang</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-tok/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">ni li kama lon lon tenpo %1$s</string>\n    <string name=\"no_player_found\">sina jo ala e ilo pi lukin e sitelen tawa. sina wile kama jo e ilo VLC anu seme\\?</string>\n    <string name=\"install\">o kama jo.</string>\n    <string name=\"cancel\">o weka.</string>\n    <string name=\"ok\">pona.</string>\n    <string name=\"open_in_browser\">open lon ilo linluwi</string>\n    <string name=\"mark_as_watched\">o sitelen la mi lukin</string>\n    <string name=\"open_with\">o open kepeken</string>\n    <string name=\"share\">o pana e ni tawa jan ante</string>\n    <string name=\"use_external_video_player_title\">o kepeken e ilo pi sitelen tawa ante</string>\n    <string name=\"subscribed_button_title\">jan ni li pana e sitelen tawa la, mi toki tawa sina</string>\n    <string name=\"unsubscribe\">jan ni li pana e sitelen tawa la, o toki ala tawa mi</string>\n    <string name=\"show_info\">o pana e sona</string>\n    <string name=\"tab_subscriptions\">jan ni li pana e sitelen tawa la, o toki tawa mi</string>\n    <string name=\"controls_background_title\">sitelen monsi</string>\n    <string name=\"controls_add_to_playlist_title\">pana lon</string>\n    <string name=\"download_path_title\">poki lipu pi sitelen tawa lon ilo mi</string>\n    <string name=\"notification_action_shuffle\">o pana lon nasin nasa</string>\n    <string name=\"notification_action_buffering\">mi kama jo e sitelen tawa</string>\n    <string name=\"notification_action_nothing\">ala</string>\n    <string name=\"dark_theme_title\">pimeja</string>\n    <string name=\"main_bg_subtitle\">open la, o luka e ilo pi lukin suli</string>\n    <string name=\"no_player_found_toast\">sina jo ala e ilo pi lukin e sitelen tawa. (sina wile lukin la, sina ken kama jo e ilo VLC).</string>\n    <string name=\"search\">o lukin sitelen</string>\n    <string name=\"settings\">ante</string>\n    <string name=\"did_you_mean\">sina wile toki e \\\"%1$s\\\" anu seme\\?</string>\n    <string name=\"search_showing_result_for\">mi lawa la sina wile toki e: %s</string>\n    <string name=\"share_dialog_title\">o pana e ni tawa</string>\n    <string name=\"subscribe_button_title\">jan ni li pana e sitelen tawa la, o toki tawa mi</string>\n    <string name=\"use_external_video_player_summary\">lukin pona lili pi sitelen tawa la, ni li weka e kalama</string>\n    <string name=\"default_resolution_title\">lukin pona pi sitelen tawa mute</string>\n    <string name=\"show_higher_resolutions_summary\">ilo lili li ken oko e sitelen pona pi lukin pona 2K/4K</string>\n    <string name=\"theme_title\">lukin</string>\n    <string name=\"use_external_audio_player_title\">o kepeken e ilo kalama ante</string>\n    <string name=\"play_with_kodi_title\">o oko e sitelen tawa kepeken ilo Kosi (Kodi)</string>\n    <string name=\"night_theme_title\">lukin pimeja</string>\n    <string name=\"download_path_audio_dialog_title\">ante e ma pi poki lipu kalama lon ilo sina</string>\n    <string name=\"download_path_summary\">sitelen tawa lon ilo sina li lon ma ni</string>\n    <string name=\"download_path_audio_title\">poki lipu kalama lon ilo sina</string>\n    <string name=\"download_path_audio_summary\">poki lipu kalama lon ilo sina li lon ma ni</string>\n    <string name=\"show_higher_resolutions_title\">o oko e pona lukin pi sitelen tawa pi pona mute mute</string>\n    <string name=\"kore_not_found\">sina wile kama jo e ilo Kole (Kore) anu seme\\?</string>\n    <string name=\"notification_action_repeat\">sin</string>\n    <string name=\"black_theme_title\">pimeja</string>\n    <string name=\"play_audio\">kalama</string>\n    <string name=\"default_audio_format_title\">nasin lipu kalama mute</string>\n    <string name=\"default_video_format_title\">nasin lipu pi sitelen tawa mute</string>\n    <string name=\"light_theme_title\">walo</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-tr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Başlamak için büyütece dokunun.</string>\n    <string name=\"upload_date_text\">%1$s tarihinde yayınlandı</string>\n    <string name=\"no_player_found\">Video oynatıcısı bulunamadı. VLC kurulsun mu?</string>\n    <string name=\"install\">Kur</string>\n    <string name=\"cancel\">İptal</string>\n    <string name=\"open_in_browser\">Tarayıcıda aç</string>\n    <string name=\"share\">Paylaş</string>\n    <string name=\"download\">İndir</string>\n    <string name=\"search\">Ara</string>\n    <string name=\"settings\">Ayarlar</string>\n    <string name=\"did_you_mean\">Bunu mu demek istediniz: \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Şununla paylaş</string>\n    <string name=\"use_external_video_player_title\">Dış video oynatıcı kullan</string>\n    <string name=\"use_external_audio_player_title\">Dış ses oynatıcı kullan</string>\n    <string name=\"download_path_title\">Video indirme klasörü</string>\n    <string name=\"download_path_summary\">İndirilen video dosyaları burada depolanır</string>\n    <string name=\"download_path_dialog_title\">Video dosyaları için indirme klasörünü seç</string>\n    <string name=\"download_path_audio_title\">Ses indirme klasörü</string>\n    <string name=\"download_path_audio_summary\">İndirilen ses dosyaları burada depolanır</string>\n    <string name=\"download_path_audio_dialog_title\">Ses dosyaları için indirme klasörünü seç</string>\n    <string name=\"default_resolution_title\">Varsayılan çözünürlük</string>\n    <string name=\"play_with_kodi_title\">Kodi ile oynat</string>\n    <string name=\"kore_not_found\">Eksik Kore uygulaması yüklensin mi\\?</string>\n    <string name=\"show_play_with_kodi_title\">\\\"Kodi ile oynat\\\" seçeneğini göster</string>\n    <string name=\"show_play_with_kodi_summary\">Kodi ortam merkezi üzerinden video oynatmak için bir seçenek göster</string>\n    <string name=\"default_audio_format_title\">Varsayılan ses biçimi</string>\n    <string name=\"theme_title\">Tema</string>\n    <string name=\"dark_theme_title\">Koyu</string>\n    <string name=\"light_theme_title\">Açık</string>\n    <string name=\"download_dialog_title\">İndir</string>\n    <string name=\"show_next_and_similar_title\">\\'Sonraki\\' ve \\'Benzer\\' videoları göster</string>\n    <string name=\"unsupported_url\">Desteklenmeyen URL</string>\n    <string name=\"content_language_title\">Öntanımlı içerik dili</string>\n    <string name=\"play_audio\">Ses</string>\n    <string name=\"settings_category_video_audio_title\">Video ve ses</string>\n    <string name=\"settings_category_appearance_title\">Görünüm</string>\n    <string name=\"background_player_playing_toast\">Arka planda oynatılıyor</string>\n    <string name=\"content\">İçerik</string>\n    <string name=\"show_age_restricted_content_title\">Yaş kısıtlı içeriği göster</string>\n    <string name=\"duration_live\">Canlı</string>\n    <string name=\"downloads\">İndirilenler</string>\n    <string name=\"downloads_title\">İndirilenler</string>\n    <string name=\"error_report_title\">Hata bildirimi</string>\n    <string name=\"general_error\">Hata</string>\n    <string name=\"network_error\">Ağ hatası</string>\n    <string name=\"could_not_load_thumbnails\">Küçük resimlerin tamamı yüklenemedi</string>\n    <string name=\"parsing_error\">Web sitesi ayrıştırılamadı</string>\n    <string name=\"content_not_available\">İçerik kullanılamıyor</string>\n    <string name=\"app_ui_crash\">Uygulama/kullanıcı arayüzü çöktü</string>\n    <string name=\"sorry_string\">Üzgünüz, bu olmamalıydı.</string>\n    <string name=\"error_report_button_text\">E-posta ile bildir</string>\n    <string name=\"error_snackbar_message\">Üzgünüz, bir şeyler yanlış gitti.</string>\n    <string name=\"error_snackbar_action\">Bildir</string>\n    <string name=\"what_device_headline\">Bilgi:</string>\n    <string name=\"what_happened_headline\">Ne oldu:</string>\n    <string name=\"info_labels\">Ne:\\nİstek:\\nİçerik Dili:\\nİçerik Ülkesi:\\nUygulama Dili:\\nHizmet:\\nGMT Zamanı:\\nPaket:\\nSürüm:\\nİşletim sistemi sürümü:</string>\n    <string name=\"detail_thumbnail_view_description\">Videoyu oynat, süre:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Yükleyenin avatar küçük resmi</string>\n    <string name=\"detail_likes_img_view_description\">Beğeni</string>\n    <string name=\"detail_dislikes_img_view_description\">Beğenmeme</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Ses</string>\n    <string name=\"retry\">Yeniden dene</string>\n    <string name=\"start\">Başlat</string>\n    <string name=\"pause\">Duraklat</string>\n    <string name=\"delete\">Sil</string>\n    <string name=\"checksum\">Doğrulama</string>\n    <string name=\"ok\">Tamam</string>\n    <string name=\"msg_name\">Dosya adı</string>\n    <string name=\"msg_threads\">İş parçacığı</string>\n    <string name=\"msg_error\">Hata</string>\n    <string name=\"msg_running\">NewPipe İndiriliyor</string>\n    <string name=\"msg_running_detail\">Ayrıntılar için dokunun</string>\n    <string name=\"msg_wait\">Lütfen bekleyin…</string>\n    <string name=\"msg_copied\">Panoya kopyalandı</string>\n    <string name=\"no_available_dir\">Lütfen daha sonra ayarlardan uygun indirme klasörü belirleyin</string>\n    <string name=\"could_not_setup_download_menu\">İndirme menüsü ayarlanamadı</string>\n    <string name=\"open_in_popup_mode\">Açılır pencere modunda aç</string>\n    <string name=\"default_popup_resolution_title\">Varsayılan açılır pencere çözünürlüğü</string>\n    <string name=\"show_higher_resolutions_title\">Yüksek çözünürlükleri göster</string>\n    <string name=\"show_higher_resolutions_summary\">Yalnızca bazı aygıtlar 2K/4K videoları oynatabilir</string>\n    <string name=\"default_video_format_title\">Varsayılan video biçimi</string>\n    <string name=\"black_theme_title\">Siyah</string>\n    <string name=\"popup_playing_toast\">Açılır pencere kipinde oynatılıyor</string>\n    <string name=\"all\">Tümü</string>\n    <string name=\"disabled\">Devre dışı</string>\n    <string name=\"your_comment\">Yorumunuz (İngilizce):</string>\n    <string name=\"error_details_headline\">Ayrıntılar:</string>\n    <string name=\"msg_popup_permission\">Bu izin, açılır pencere kipinde\n\\naçmak için gereklidir</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA formu</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA formu istendi</string>\n    <string name=\"controls_background_title\">Arka plan</string>\n    <string name=\"controls_popup_title\">Açılır pencere</string>\n    <string name=\"clear\">Temizle</string>\n    <string name=\"popup_remember_size_pos_title\">Açılır pencere özelliklerini hatırla</string>\n    <string name=\"popup_remember_size_pos_summary\">Açılan pencerenin son boyutunu ve konumunu hatırla</string>\n    <string name=\"use_external_video_player_summary\">Bazı çözünürlüklerde sesi kaldırır</string>\n    <string name=\"show_search_suggestions_title\">Arama önerileri</string>\n    <string name=\"show_search_suggestions_summary\">Arama yaparken öneriler gösterilsin mi</string>\n    <string name=\"best_resolution\">En iyi çözünürlük</string>\n    <string name=\"title_activity_about\">NewPipe Hakkında</string>\n    <string name=\"title_licenses\">Üçüncü Taraf Lisansları</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s, %2$s tarafından %3$s altında</string>\n    <string name=\"tab_about\">Hakkında ve SSS</string>\n    <string name=\"tab_licenses\">Lisanslar</string>\n    <string name=\"app_description\">Android\\'de özgür ve hafif bir oynatıcı.</string>\n    <string name=\"view_on_github\">GitHub\\'da Görüntüle</string>\n    <string name=\"app_license_title\">NewPipe\\'ın Lisansı</string>\n    <string name=\"contribution_encouragement\">Fikirleriniz; çeviri, tasarım değişiklikleri, kod temizliği ya da gerçek köklü kod değişikleri olsun yardımınıza her zaman açığız. Ne kadar çok yapılırsa o kadar iyi olur!</string>\n    <string name=\"read_full_license\">Lisansı oku</string>\n    <string name=\"contribution_title\">Katkıda bulunun</string>\n    <string name=\"settings_category_downloads_title\">İndir</string>\n    <string name=\"settings_file_charset_title\">Dosya adlarında izin verilen karakterler</string>\n    <string name=\"settings_file_replacement_character_summary\">Geçersiz karakterler bu değer ile değiştirilir</string>\n    <string name=\"settings_file_replacement_character_title\">Değiştirme karakteri</string>\n    <string name=\"charset_letters_and_digits\">Harfler ve rakamlar</string>\n    <string name=\"charset_most_special_characters\">Çoğu özel karakterler</string>\n    <string name=\"subscribe_button_title\">Abone ol</string>\n    <string name=\"subscribed_button_title\">Abone olundu</string>\n    <string name=\"channel_unsubscribed\">Kanal aboneliğinden çıkıldı</string>\n    <string name=\"subscription_change_failed\">Abonelik değiştirilemedi</string>\n    <string name=\"subscription_update_failed\">Abonelik güncellenemedi</string>\n    <string name=\"tab_subscriptions\">Abonelikler</string>\n    <string name=\"fragment_feed_title\">Yenilikler</string>\n    <string name=\"enable_search_history_title\">Arama geçmişi</string>\n    <string name=\"enable_search_history_summary\">Arama sorgularını yerel olarak sakla</string>\n    <string name=\"enable_watch_history_title\">İzleme geçmişi</string>\n    <string name=\"enable_watch_history_summary\">İzlenen videoların kaydını tut</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Oynatmayı sürdür</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Kesintilerden sonra (örneğin telefon çağrısı) oynatmayı sürdür</string>\n    <string name=\"settings_category_player_title\">Oynatıcı</string>\n    <string name=\"settings_category_player_behavior_title\">Davranış</string>\n    <string name=\"settings_category_history_title\">Geçmiş ve önbellek</string>\n    <string name=\"undo\">Geri al</string>\n    <string name=\"notification_channel_name\">NewPipe bildirimi</string>\n    <string name=\"notification_channel_description\">NewPipe oynatıcısı için bildirimler</string>\n    <string name=\"search_no_results\">Sonuç yok</string>\n    <string name=\"empty_list_subtitle\">Burada cırcır böceklerinden başka bir şey yok</string>\n    <string name=\"no_subscribers\">Abone yok</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s abone</item>\n        <item quantity=\"other\">%s abone</item>\n    </plurals>\n    <string name=\"no_views\">Görüntüleme yok</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s görüntülenme</item>\n        <item quantity=\"other\">%s görüntülenme</item>\n    </plurals>\n    <string name=\"no_videos\">Video yok</string>\n    <string name=\"title_activity_history\">Geçmiş</string>\n    <string name=\"action_history\">Geçmiş</string>\n    <string name=\"delete_item_search_history\">Bu ögeyi arama geçmişinden silmek istiyor musunuz\\?</string>\n    <string name=\"show_hold_to_append_title\">\\\"Basılı tutarak kuyruğa ekle\\\" ipucunu göster</string>\n    <string name=\"show_hold_to_append_summary\">Video \\\"Ayrıntılar:\\\" sayfasında arka plan ya da açılır pencere düğmesine basıldığında ipucu göster</string>\n    <string name=\"play_all\">Tümünü Oynat</string>\n    <string name=\"unknown_content\">[Bilinmeyen]</string>\n    <string name=\"player_stream_failure\">Bu akış oynatılamadı</string>\n    <string name=\"player_unrecoverable_failure\">Kurtarılamayan oynatıcı hatası oluştu</string>\n    <string name=\"player_recoverable_failure\">Oynatıcı hatasından kurtarılıyor</string>\n    <string name=\"main_page_content\">Ana sayfanın içeriği</string>\n    <string name=\"blank_page_summary\">Boş sayfa</string>\n    <string name=\"kiosk_page_summary\">Kiosk sayfası</string>\n    <string name=\"channel_page_summary\">Kanal sayfası</string>\n    <string name=\"select_a_channel\">Kanal seçin</string>\n    <string name=\"no_channel_subscribed_yet\">Henüz kanal aboneliği yok</string>\n    <string name=\"select_a_kiosk\">Kiosk seçin</string>\n    <string name=\"trending\">Popüler</string>\n    <string name=\"top_50\">En iyi 50</string>\n    <string name=\"new_and_hot\">Yeni ve popüler</string>\n    <string name=\"play_queue_remove\">Kaldır</string>\n    <string name=\"play_queue_stream_detail\">Ayrıntılar</string>\n    <string name=\"play_queue_audio_settings\">Ses Ayarları</string>\n    <string name=\"hold_to_append\">Basılı tutarak kuyruğa ekle</string>\n    <string name=\"start_here_on_background\">Arka planda oynatmayı başlat</string>\n    <string name=\"start_here_on_popup\">Açılır pencerede oynatmayı başlat</string>\n    <string name=\"donation_title\">Bağışta bulunun</string>\n    <string name=\"donation_encouragement\">NewPipe, boş zamanlarını size en iyi kullanıcı deneyimi sunmak için harcayan gönüllüler tarafından geliştirilmiştir. Geliştiricilerin bir fincan kahvenin tadını çıkarırken NewPipe\\'ı daha iyi hale getirmelerine yardımcı olun.</string>\n    <string name=\"give_back\">Bağışta bulunun</string>\n    <string name=\"website_title\">Web sitesi</string>\n    <string name=\"website_encouragement\">Daha çok bilgi ve haber için NewPipe web sitesini ziyaret edin.</string>\n    <string name=\"default_content_country_title\">Öntanımlı içerik ülkesi</string>\n    <string name=\"switch_to_background\">Arka Plana Geç</string>\n    <string name=\"switch_to_popup\">Açılır Pencereye Geç</string>\n    <string name=\"switch_to_main\">Ana Görünüme Geç</string>\n    <string name=\"drawer_open\">Çekmeceyi Aç</string>\n    <string name=\"drawer_close\">Çekmeceyi Kapat</string>\n    <string name=\"no_player_found_toast\">Video oynatıcı bulunamadı (Oynatmak için VLC kurabilirsiniz).</string>\n    <string name=\"always\">Her Zaman</string>\n    <string name=\"just_once\">Yalnızca Bir Kez</string>\n    <string name=\"external_player_unsupported_link_type\">Dış oynatıcılar bu tür bağlantıları desteklemez</string>\n    <string name=\"video_streams_empty\">Video akışı bulunamadı</string>\n    <string name=\"audio_streams_empty\">Ses akışı bulunamadı</string>\n    <string name=\"video_player\">Video oynatıcı</string>\n    <string name=\"background_player\">Arka plan oynatıcı</string>\n    <string name=\"popup_player\">Açılır pencere oynatıcı</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Bilgi alınıyor…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">İstenen içerik yükleniyor</string>\n    <string name=\"import_data_title\">Veri tabanını içe aktar</string>\n    <string name=\"export_data_title\">Veri tabanını dışa aktar</string>\n    <string name=\"import_data_summary\">Geçerli geçmişinizi, aboneliklerinizi, oynatma listelerinizi ve (isteğe bağlı olarak) ayarlarınızı geçersiz kılar</string>\n    <string name=\"export_data_summary\">Geçmişi, abonelikleri, oynatma listelerini ve ayarları dışa aktar</string>\n    <string name=\"export_complete_toast\">Dışa aktarıldı</string>\n    <string name=\"import_complete_toast\">İçe aktarıldı</string>\n    <string name=\"no_valid_zip_file\">Geçerli ZIP dosyası yok</string>\n    <string name=\"could_not_import_all_files\">Uyarı: Tüm dosyalar içe aktarılamadı.</string>\n    <string name=\"override_current_data\">Bu, var olan kurulumunuzu geçersiz kılacaktır.</string>\n    <string name=\"controls_download_desc\">Akış dosyasını indir</string>\n    <string name=\"show_info\">Bilgi göster</string>\n    <string name=\"tab_bookmarks\">İmlenen Oynatma Listeleri</string>\n    <string name=\"controls_add_to_playlist_title\">Ekle</string>\n    <string name=\"detail_drag_description\">Yeniden düzenlemek için sürükleyin</string>\n    <string name=\"create\">Oluştur</string>\n    <string name=\"dismiss\">Dışla</string>\n    <string name=\"rename\">Yeniden adlandır</string>\n    <string name=\"title_last_played\">Son Oynatılan</string>\n    <string name=\"title_most_played\">En Çok Oynatılan</string>\n    <string name=\"always_ask_open_action\">Her zaman sor</string>\n    <string name=\"create_playlist\">Yeni Oynatma Listesi</string>\n    <string name=\"rename_playlist\">Yeniden adlandır</string>\n    <string name=\"name\">Ad</string>\n    <string name=\"add_to_playlist\">Oynatma listesine ekle</string>\n    <string name=\"set_as_playlist_thumbnail\">Oynatma listesi küçük resmi olarak ayarla</string>\n    <string name=\"bookmark_playlist\">Oynatma listesini yer imlerine ekle</string>\n    <string name=\"unbookmark_playlist\">Yer imini kaldır</string>\n    <string name=\"delete_playlist_prompt\">Bu oynatma listesi silinsin mi\\?</string>\n    <string name=\"playlist_creation_success\">Oynatma listesi oluşturuldu</string>\n    <string name=\"playlist_add_stream_success\">Oynatma listesine eklendi</string>\n    <string name=\"playlist_thumbnail_change_success\">Oynatma listesinin küçük resmi değiştirildi.</string>\n    <string name=\"caption_none\">Alt yazı yok</string>\n    <string name=\"resize_fit\">Sığdır</string>\n    <string name=\"resize_fill\">Doldur</string>\n    <string name=\"resize_zoom\">Yakınlaştır</string>\n    <string name=\"settings_category_debug_title\">Hata ayıklama</string>\n    <string name=\"caption_auto_generated\">Kendiliğinden oluşturulan</string>\n    <string name=\"enable_leak_canary_summary\">Bellek sızıntısı izleme, yığın boşaltımı sırasında uygulamanın yanıtlamamasına neden olabilir</string>\n    <string name=\"enable_disposed_exceptions_title\">Yaşam döngüsü dışı hatalarını bildir</string>\n    <string name=\"enable_disposed_exceptions_summary\">Parçanın dışında veya atımdan sonraki etkinlik yaşam döngüsündeki teslim edilemeyen Rx beklentilerinin bildirimini zorla</string>\n    <string name=\"use_inexact_seek_title\">Hızlı isabetsiz konumlama kullan</string>\n    <string name=\"use_inexact_seek_summary\">İ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</string>\n    <string name=\"auto_queue_title\">Sonraki videoyu kuyruğa otomatik ekle</string>\n    <string name=\"auto_queue_summary\">İlgili bir akış ekleyerek sonlanacak (yinelemeyen) oynatma sırasını sürdür</string>\n    <string name=\"file\">Dosya</string>\n    <string name=\"invalid_directory\">Böylesi klasör yok</string>\n    <string name=\"invalid_source\">Böyle bir dosya/içerik kaynağı yok</string>\n    <string name=\"invalid_file\">Dosya yok ya da okuma veya yazma izni bulunmuyor</string>\n    <string name=\"file_name_empty_error\">Dosya adı boş olamaz</string>\n    <string name=\"error_occurred_detail\">Hata oluştu: %1$s</string>\n    <string name=\"import_title\">İçe aktar</string>\n    <string name=\"import_from\">Şuradan içe aktar</string>\n    <string name=\"export_to\">Şuraya dışa aktar</string>\n    <string name=\"import_ongoing\">İçe aktarılıyor…</string>\n    <string name=\"export_ongoing\">Dışa aktarılıyor…</string>\n    <string name=\"import_file_title\">Dosyayı içe aktar</string>\n    <string name=\"previous_export\">Önceki dışa aktarım</string>\n    <string name=\"subscriptions_import_unsuccessful\">Abonelikler içe aktarılamadı</string>\n    <string name=\"subscriptions_export_unsuccessful\">Abonelikler dışa aktarılamadı</string>\n    <string name=\"import_youtube_instructions\">Google Takeout\\'tan YouTube aboneliklerini içe aktar:\n\\n\n\\n1. Şu adrese gidin: %1$s\n\\n2. Sorulduğunda hesabınıza giriş yapın\n\\n3. \\\"Tüm veriler dahil\\\"e ve sonrasında \\\"Hiçbirini seçme\\\"ye tıklayın, ardından yalnızca \\\"abonelikler\\\"i seçin ve \\\"Tamam\\\"a tıklayın\n\\n4. \\\"Sonraki adım\\\"a ve ardından \\\"Dışa aktar\\\"a tıklayın\n\\n5. Göründüğünde \\\"İndir\\\" düğmesini tıklayın\n\\n6. Aşağıdaki DOSYAYI İÇE AKTAR düğmesini tıklayın ve indirilen .zip dosyasını seçin\n\\n7. [.zip içe aktarma işlemi başarısız olursa] .csv dosyasını çıkarın (genellikle \\\"YouTube and YouTube Music/subscriptions/subscriptions.csv\\\"), aşağıdaki DOSYAYI İÇE AKTAR düğmesini tıklayın ve çıkarılan csv dosyasını seçin</string>\n    <string name=\"import_soundcloud_instructions\">URL\\'yi veya ID\\'nizi yazarak SoundCloud profilini içe aktarın:\n\\n\n\\n1. Web tarayıcısında \\\"masaüstü kipi\\\" etkinleştirin (site, mobil aygıtlar için uygun değildir)\n\\n2. Şu adrese gidin: %1$s\n\\n3. Sorulduğunda giriş yapın\n\\n4. Yönlendirildiğiniz profil URL\\'sini kopyalayın.</string>\n    <string name=\"import_soundcloud_instructions_hint\">kimliginiz, soundcloud.com/kimliginiz</string>\n    <string name=\"import_network_expensive_warning\">Bu sürecin ağa yük olabileceğini unutmayın.\n\\n\n\\nSürdürmek istiyor musunuz\\?</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Resim önbelleği temizlendi</string>\n    <string name=\"metadata_cache_wipe_title\">Önbelleğe alınmış meta verileri silin</string>\n    <string name=\"metadata_cache_wipe_summary\">Önbelleğe alınmış tüm web sayfası verilerini kaldır</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Üstveri önbelleği temizlendi</string>\n    <string name=\"playback_speed_control\">Oynatım Hızı Denetimleri</string>\n    <string name=\"playback_tempo\">Hız</string>\n    <string name=\"playback_pitch\">Ses yüksekliği</string>\n    <string name=\"unhook_checkbox\">Ayır (bozulmaya neden olabilir)</string>\n    <string name=\"no_streams_available_download\">İndirilebilecek akış yok</string>\n    <string name=\"preferred_open_action_settings_title\">Yeğlenen \\'aç\\' eylemi</string>\n    <string name=\"preferred_open_action_settings_summary\">Paylaşma ekranında tanımlı eylem — %s</string>\n    <string name=\"caption_setting_title\">Alt yazılar</string>\n    <string name=\"caption_setting_description\">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</string>\n    <string name=\"clear_views_history_title\">İzleme geçmişini temizle</string>\n    <string name=\"clear_views_history_summary\">Oynatılan akışların geçmişini ve kalınan oynatım konumlarını siler</string>\n    <string name=\"delete_view_history_alert\">İzleme geçmişinin tamamı silinsin mi\\?</string>\n    <string name=\"watch_history_deleted\">İzleme geçmişi silindi</string>\n    <string name=\"clear_search_history_title\">Arama geçmişini temizle</string>\n    <string name=\"clear_search_history_summary\">Aramada kullanılan anahtar kelimelerin geçmişini siler</string>\n    <string name=\"delete_search_history_alert\">Tüm arama geçmişi silinsin mi\\?</string>\n    <string name=\"search_history_deleted\">Arama geçmişi silindi</string>\n    <string name=\"one_item_deleted\">1 öge silindi.</string>\n    <string name=\"app_license\">NewPipe, telif müsaadeli özgür yazılımdır: İstediğiniz gibi kullanabilir, öğrenebilir, paylaşabilir ve geliştirebilirsiniz. Özellikle, Özgür Yazılım Vakfı tarafından yayımlanan GNU Genel Kamu Lisansı 3. sürümü veya (isterseniz) daha sonraki sürümleri koşulları altında yeniden dağıtabilir ve/veya değiştirebilirsiniz.</string>\n    <string name=\"import_settings\">Ayarları da içe aktarmak istiyor musunuz?</string>\n    <string name=\"privacy_policy_title\">NewPipe\\'ın Gizlilik İlkesi</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe projesi, gizliliğinizi çok ciddiye alıyor. Bu nedenle, uygulama sizin izniniz olmadan herhangi bir veri toplamaz.\n\\nNewPipe\\'ın gizlilik ilkesi, çökme raporu gönderdiğinizde hangi verilerin gönderildiğini ve saklandığını ayrıntılı olarak açıklar.</string>\n    <string name=\"read_privacy_policy\">Gizlilik ilkesini oku</string>\n    <string name=\"start_accept_privacy_policy\">Avrupa Genel Veri Koruma Yönetmeliğine (GDPR) uymak için, dikkatinizi NewPipe\\'ın gizlilik ilkesine çekiyoruz. Lütfen dikkatlice okuyun.\n\\nBize hata bildirimini göndermek için kabul etmelisiniz.</string>\n    <string name=\"accept\">Kabul et</string>\n    <string name=\"decline\">Reddet</string>\n    <string name=\"limit_data_usage_none_description\">Sınır yok</string>\n    <string name=\"limit_mobile_data_usage_title\">Mobil veri kullanırken çözünürlüğü sınırla</string>\n    <string name=\"minimize_on_exit_title\">Uygulama geçişinde küçült</string>\n    <string name=\"minimize_on_exit_summary\">Ana video oynatıcıdan diğer uygulamaya geçiş yaparken eylem — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Yok</string>\n    <string name=\"minimize_on_exit_background_description\">Arka plan oynatıcısını küçült</string>\n    <string name=\"minimize_on_exit_popup_description\">Açılır pencere oynatıcısına küçült</string>\n    <string name=\"skip_silence_checkbox\">Sessizlik sırasında hızlı ileri</string>\n    <string name=\"playback_step\">Adım</string>\n    <string name=\"playback_reset\">Sıfırla</string>\n    <string name=\"channels\">Kanallar</string>\n    <string name=\"playlists\">Oynatma Listeleri</string>\n    <string name=\"tracks\">Parçalar</string>\n    <string name=\"users\">Kullanıcılar</string>\n    <string name=\"unsubscribe\">Abonelikten çık</string>\n    <string name=\"tab_choose\">Sekmeyi Seçin</string>\n    <string name=\"settings_category_updates_title\">Güncellemeler</string>\n    <string name=\"file_deleted\">Dosya silindi</string>\n    <string name=\"app_update_notification_channel_name\">Uygulama güncelleme bildirimi</string>\n    <string name=\"app_update_notification_channel_description\">Yeni NewPipe sürümleri için bildirimler</string>\n    <string name=\"download_to_sdcard_error_title\">Dış depolama kullanılamıyor</string>\n    <string name=\"download_to_sdcard_error_message\">Dış SD karta indirilemiyor. İndirme klasörü konumu sıfırlansın mı\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Kayıtlı sekmeler okunamadı, bu nedenle öntanımlılar kullanılıyor</string>\n    <string name=\"restore_defaults\">Öntanımlıları geri yükle</string>\n    <string name=\"restore_defaults_confirmation\">Öntanımlıları geri yüklemek istiyor musunuz\\?</string>\n    <string name=\"subscribers_count_not_available\">Abone sayısı yok</string>\n    <string name=\"main_page_content_summary\">Ana sayfada hangi sekmeler gösterilir</string>\n    <string name=\"updates_setting_title\">Güncellemeler</string>\n    <string name=\"updates_setting_description\">Yeni sürüm olduğunda uygulama güncellemesi için bildirim göster</string>\n    <string name=\"list_view_mode\">Liste görünümü kipi</string>\n    <string name=\"list\">Liste</string>\n    <string name=\"grid\">Izgara</string>\n    <string name=\"auto\">Kendiliğinden</string>\n    <string name=\"missions_header_finished\">Tamamlandı</string>\n    <string name=\"paused\">durduruldu</string>\n    <string name=\"queued\">sırada</string>\n    <string name=\"post_processing\">son işlemler uygulanıyor</string>\n    <string name=\"enqueue\">Kuyruğa al</string>\n    <string name=\"permission_denied\">İşlem sistemce reddedildi</string>\n    <string name=\"download_failed\">İndirme başarısız</string>\n    <string name=\"generate_unique_name\">Benzersiz ad oluştur</string>\n    <string name=\"overwrite\">Üzerine yaz</string>\n    <string name=\"overwrite_finished_warning\">Bu isme sahip indirilen bir dosya zaten var</string>\n    <string name=\"download_already_running\">Bu isim ile bir indirme süreci var</string>\n    <string name=\"show_error\">Hatayı göster</string>\n    <string name=\"error_file_creation\">Dosya oluşturulamıyor</string>\n    <string name=\"error_path_creation\">Hedef klasör oluşturulamıyor</string>\n    <string name=\"error_ssl_exception\">Güvenli bağlantı kurulamadı</string>\n    <string name=\"error_unknown_host\">Sunucu bulunamadı</string>\n    <string name=\"error_connect_host\">Sunucuya bağlanılamıyor</string>\n    <string name=\"error_http_no_content\">Sunucu veri göndermiyor</string>\n    <string name=\"error_http_unsupported_range\">Sunucu, çok iş parçacıklı indirmeleri kabul etmez, @string/msg_threads = 1 ile yeniden deneyin</string>\n    <string name=\"error_http_not_found\">Bulunamadı</string>\n    <string name=\"error_postprocessing_failed\">İşlem sonrası başarısız</string>\n    <string name=\"stop\">Durdur</string>\n    <string name=\"max_retry_msg\">Azami deneme sayısı</string>\n    <string name=\"max_retry_desc\">İndirmeyi iptal etmeden önce azami deneme sayısı</string>\n    <string name=\"pause_downloads_on_mobile\">Kotalı bağlantılarda durdur</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Bazı indirmelerin bekletilememesine rağmen mobil veriye geçerken kullanışlıdır</string>\n    <string name=\"events\">Olaylar</string>\n    <string name=\"conferences\">Konferanslar</string>\n    <string name=\"missions_header_pending\">Beklemede</string>\n    <string name=\"show_comments_title\">Yorumları göster</string>\n    <string name=\"show_comments_summary\">Yorumları gizlemek için kapatın</string>\n    <string name=\"autoplay_title\">Kendiliğinden oynat</string>\n    <string name=\"no_comments\">Yorum yok</string>\n    <string name=\"error_unable_to_load_comments\">Yorumlar yüklenemedi</string>\n    <string name=\"close\">Kapat</string>\n    <string name=\"enable_playback_resume_title\">Oynatımı sürdür</string>\n    <string name=\"enable_playback_resume_summary\">Son oynatım konumunu geri yükle</string>\n    <string name=\"enable_playback_state_lists_title\">Oynatma listelerindeki konumlar</string>\n    <string name=\"enable_playback_state_lists_summary\">Oynatma listelerinde oynatım konumlarını göster</string>\n    <string name=\"settings_category_clear_data_title\">Veri temizleme</string>\n    <string name=\"watch_history_states_deleted\">Oynatım konumları silindi</string>\n    <string name=\"missing_file\">Dosya taşındı veya silindi</string>\n    <string name=\"overwrite_unrelated_warning\">Bu isimde bir dosya zaten bulunuyor</string>\n    <string name=\"overwrite_failed\">dosyanın üzerine yazılamaz</string>\n    <string name=\"download_already_pending\">Bu isim ile bekleyen bir indirme var</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe bu dosya üzerinde çalışırken kapandı</string>\n    <string name=\"error_insufficient_storage_left\">Aygıt üzerinde yer yok</string>\n    <string name=\"error_progress_lost\">İlerleme kaybedildi, çünkü dosya silinmiş</string>\n    <string name=\"error_timeout\">Bağlantı zaman aşımı</string>\n    <string name=\"confirm_prompt\">İndirme geçmişinizi temizlemek veya indirilen tüm dosyaları silmek istiyor musunuz\\?</string>\n    <string name=\"enable_queue_limit\">İndirme kuyruğunu sınırla</string>\n    <string name=\"enable_queue_limit_desc\">Aynı anda yalnızca bir indirme yürütülecek</string>\n    <string name=\"start_downloads\">İndirmeleri başlat</string>\n    <string name=\"pause_downloads\">İndirmeleri duraklat</string>\n    <string name=\"downloads_storage_ask_title\">Nereye indirileceğini sor</string>\n    <string name=\"downloads_storage_ask_summary\">Her indirmede nereye kaydedileceği sorulacak.\n\\nDış SD karta indirmek istiyorsanız sistem klasör seçiciyi (SAF) etkinleştirin</string>\n    <string name=\"downloads_storage_use_saf_title\">Sistem klasör seçiciyi (SAF) kullan</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Depolama Erişimi Çerçevesi\\' dış SD karta indirmeyi sağlar</string>\n    <string name=\"clear_playback_states_title\">Oynatım konumlarını sil</string>\n    <string name=\"clear_playback_states_summary\">Tüm oynatım konumlarını siler</string>\n    <string name=\"delete_playback_states_alert\">Tüm oynatım konumları silinsin mi\\?</string>\n    <string name=\"drawer_header_description\">Hizmeti değiştir, şu anda seçili olan:</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s video</item>\n        <item quantity=\"other\">%s video</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">Öntanımlı Kiosk</string>\n    <string name=\"no_one_watching\">Kimse izlemiyor</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s izleyici</item>\n        <item quantity=\"other\">%s izleyici</item>\n    </plurals>\n    <string name=\"no_one_listening\">Kimse dinlemiyor</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s dinleyici</item>\n        <item quantity=\"other\">%s dinleyici</item>\n    </plurals>\n    <string name=\"seek_duration_title\">Hızlı ileri/geri atlama süresi</string>\n    <string name=\"peertube_instance_url_title\">PeerTube örnekleri</string>\n    <string name=\"peertube_instance_url_summary\">Favori PeerTube örneklerinizi seçin</string>\n    <string name=\"peertube_instance_url_help\">%s adresinde beğendiğiniz örnekleri bulun</string>\n    <string name=\"peertube_instance_add_title\">Örnek ekle</string>\n    <string name=\"peertube_instance_add_help\">Örnek URL\\'sini girin</string>\n    <string name=\"peertube_instance_add_fail\">Örnek doğrulanamadı</string>\n    <string name=\"peertube_instance_add_https_only\">Yalnızca HTTPS URL\\'leri desteklenmektedir</string>\n    <string name=\"peertube_instance_add_exists\">Örnek zaten var</string>\n    <string name=\"local\">Yerel</string>\n    <string name=\"recently_added\">Son eklenen</string>\n    <string name=\"most_liked\">En çok beğenilen</string>\n    <string name=\"playlist_no_uploader\">Kendiliğinden oluşturulan (yükleyen bulunamadı)</string>\n    <string name=\"recovering\">kurtarılıyor</string>\n    <string name=\"error_download_resource_gone\">Bu indirme kurtarılamıyor</string>\n    <string name=\"choose_instance_prompt\">Oluşum seçin</string>\n    <string name=\"clear_download_history\">İndirme geçmişini temizle</string>\n    <string name=\"delete_downloaded_files\">İndirilen dosyaları sil</string>\n    <string name=\"permission_display_over_apps\">Diğer uygulamaların üzerinde görüntüleme izni ver</string>\n    <string name=\"app_language_title\">Uygulama dili</string>\n    <string name=\"systems_language\">Sistem öntanımlısı</string>\n    <string name=\"subtitle_activity_recaptcha\">Çözüldüğünde \\\"Bitti\\\" düğmesine basın</string>\n    <string name=\"done\">Bitti</string>\n    <string name=\"videos_string\">Videolar</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d saniye</item>\n        <item quantity=\"other\">%d saniye</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">ExoPlayer kısıtlamaları gereği konumlama süresi %d saniyeye belirlenmiştir</string>\n    <string name=\"mute\">Sessize al</string>\n    <string name=\"unmute\">Sesi aç</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d dakika</item>\n        <item quantity=\"other\">%d dakika</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d saat</item>\n        <item quantity=\"other\">%d saat</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d gün</item>\n        <item quantity=\"other\">%d gün</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">Kanal grupları</string>\n    <string name=\"feed_oldest_subscription_update\">Akış en son güncellendi: %s</string>\n    <string name=\"feed_subscription_not_loaded_count\">Yüklenmedi: %d</string>\n    <string name=\"feed_notification_loading\">Akış yükleniyor…</string>\n    <string name=\"feed_processing_message\">Akış işleniyor…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Abonelikleri seç</string>\n    <string name=\"feed_group_dialog_empty_selection\">Abonelik seçilmedi</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d öge seçildi</item>\n        <item quantity=\"other\">%d öge seçildi</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">Boş grup adı</string>\n    <string name=\"feed_group_dialog_delete_message\">Bu grubu silmek istiyor musunuz\\?</string>\n    <string name=\"feed_create_new_group_button_title\">Yeni</string>\n    <string name=\"settings_category_feed_title\">Akış</string>\n    <string name=\"feed_update_threshold_title\">Akış güncelleme eşiği</string>\n    <string name=\"feed_update_threshold_summary\">Bir aboneliğin eski sayılmadan önce son güncellemeden sonra geçen zaman — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">Her zaman güncelle</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Uygunken özel akıştan edinin</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Bazı servislerde kullanılabilir, genellikle daha hızlıdır ancak kısıtlı sayıda öge ve eksik bilgi (örn. süre, öge türü, canlı durumu olmaksızın) getirilebilir</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Hızlı kipi etkinleştir</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Hızlı kipi devre dışı bırak</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Akışın çok yavaş yüklendiğini mi düşünüyorsunuz\\? Öyleyse, hızlı yüklemeyi etkinleştirin (ayarlardan değiştirebilir veya aşağıdaki düğmeye dokunabilirsiniz).\n\\n\n\\nNewPipe iki akış yükleme yordamı sunar:\n\\n• Tüm abonelik kanalını edinme, bu yavaş ancak tamdır.\n\\n• Adanmış hizmet son noktası kullanır, bu hızlıdır ancak genellikle tam değildir.\n\\n\n\\nİkisinin arasındaki fark, hızlı olanın genellikle ögenin süresi veya türü (canlı ve sıradan videoları ayrımsayamaz) gibi bazı bilgilerden yoksunluğu ve daha az öge getirmesidir.\n\\n\n\\nYouTube, RSS akışıyla bu hızlı yöntemi sunan servislerden biridir.\n\\n\n\\nSeçim, sizin neyi yeğlediğinize kalmış: hız veya kusursuz bilgi.</string>\n    <string name=\"content_not_supported\">Bu içerik henüz NewPipe tarafından desteklenmiyor.\n\\n\n\\nUmarım gelecekteki bir sürümde desteklenir.</string>\n    <string name=\"infinite_videos\">∞ video</string>\n    <string name=\"more_than_100_videos\">100+ video</string>\n    <string name=\"artists\">Sanatçılar</string>\n    <string name=\"albums\">Albümler</string>\n    <string name=\"songs\">Şarkılar</string>\n    <string name=\"restricted_video\">Bu video yaş kısıtlıdır.\n\\n\n\\nGörmek istiyorsanız ayarlarda \\\"%1$s\\\" seçeneğini açın.</string>\n    <string name=\"remove_watched_popup_warning\">Oynatma listesine eklenmeden önce ve sonra izlenen yayınlar kaldırılacaktır. \\nEmin misiniz?</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Evet ve kısmen izlenmiş videolar</string>\n    <string name=\"remove_watched_popup_title\">İzlenen yayınları kaldır?</string>\n    <string name=\"remove_watched\">İzleneni kaldır</string>\n    <string name=\"show_original_time_ago_summary\">Akış ögelerinde hizmetlerden alınan özgün metinler görünecektir</string>\n    <string name=\"show_original_time_ago_title\">Ögelerde özgün \\'… önce\\'yi göster</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">YouTube\\'un \\\"Kısıtlı Kip\\\"ini aç</string>\n    <string name=\"video_detail_by\">%s tarafından</string>\n    <string name=\"channel_created_by\">%s tarafından oluşturuldu</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Kanalın avatar küçük resmi</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Yalnızca gruplanmamış abonelikleri göster</string>\n    <string name=\"playlist_page_summary\">Oynatma listesi sayfası</string>\n    <string name=\"select_a_playlist\">Oynatma listesi seç</string>\n    <string name=\"error_report_open_issue_button_text\">GitHub\\'da bildir</string>\n    <string name=\"copy_for_github\">Biçimlendirilmiş raporu kopyala</string>\n    <string name=\"search_showing_result_for\">Sonuçlar gösteriliyor: %s</string>\n    <string name=\"error_report_open_github_notice\">Lütfen hatanızı tartışan sorunun var olup olmadığını kontrol edin. Yinelenen istekler oluştururken, bizden asıl hatayı düzeltmek için harcayabileceğimiz zamanı alırsınız.</string>\n    <string name=\"no_playlist_bookmarked_yet\">Henüz oynatma listesi yer imleri yok</string>\n    <string name=\"never\">Asla</string>\n    <string name=\"wifi_only\">Yalnızca Wi-Fi</string>\n    <string name=\"autoplay_summary\">Oynatmayı kendiliğinden başlat — %s</string>\n    <string name=\"title_activity_play_queue\">Oynatma kuyruğu</string>\n    <string name=\"unsupported_url_dialog_message\">URL tanınamadı. Başka bir uygulamayla açılsın mı\\?</string>\n    <string name=\"auto_queue_toggle\">Otomatik kuyruğa alış</string>\n    <string name=\"clear_queue_confirmation_description\">Etkin oynatıcının kuyruğu değiştirilecek</string>\n    <string name=\"clear_queue_confirmation_summary\">Bir oynatıcıdan diğerine geçmek kuyruğunuzu değiştirebilir</string>\n    <string name=\"clear_queue_confirmation_title\">Bir sırayı temizlemeden önce onay iste</string>\n    <string name=\"notification_action_nothing\">Hiçbir şey</string>\n    <string name=\"notification_action_buffering\">Ara belleğe alınıyor</string>\n    <string name=\"notification_action_shuffle\">Karıştır</string>\n    <string name=\"notification_action_repeat\">Yinele</string>\n    <string name=\"notification_actions_at_most_three\">Bildirim sekmesinde gösterilecek en fazla üç eylem seçebilirsiniz!</string>\n    <string name=\"notification_actions_summary\">Aşağıdaki bildirim eyleminlerini üzerine dokunarak düzenleyin. Sağdaki onay kutularını kullanarak üst bildirimde gösterilecek üç eylemi seçin.</string>\n    <string name=\"notification_action_4_title\">Beşinci eylem düğmesi</string>\n    <string name=\"notification_action_3_title\">Dördüncü eylem düğmesi</string>\n    <string name=\"notification_action_2_title\">Üçüncü eylem düğmesi</string>\n    <string name=\"notification_action_1_title\">İkinci eylem düğmesi</string>\n    <string name=\"notification_action_0_title\">Birinci eylem düğmesi</string>\n    <string name=\"notification_scale_to_square_image_summary\">Bildirimde gösterilen video küçük resmini 16:9\\'dan 1:1 en boy oranına kırp</string>\n    <string name=\"notification_scale_to_square_image_title\">Küçük resmi 1:1 en boy oranına kırp</string>\n    <string name=\"show_memory_leaks\">Bellek sızıntılarını göster</string>\n    <string name=\"enqueued\">Sıraya eklendi</string>\n    <string name=\"enqueue_stream\">Kuyruğa ekle</string>\n    <string name=\"clear_cookie_summary\">reCAPTCHA çözdüğünüzde NewPipe\\'ın sakladığı çerezleri temizle</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA çerezleri temizlendi</string>\n    <string name=\"clear_cookie_title\">reCAPTCHA çerezlerini temizle</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube, olası yetişkin içeriği gizleyen \\\"Kısıtlı Kip\\\" sağlamaktadır</string>\n    <string name=\"show_age_restricted_content_summary\">Yaş kısıtı (18+ gibi) nedeniyle çocuklara uygun olmayabilecek içeriği göster</string>\n    <string name=\"show_thumbnail_summary\">Hem kilit ekranı arka planı hem de bildirimler için küçük resmi kullan</string>\n    <string name=\"show_thumbnail_title\">Küçük resmi göster</string>\n    <string name=\"notification_colorize_summary\">Android\\'in bildirim rengini küçük resimdeki ana renge göre özelleştirmesini sağlayın (bunun tüm aygıtlarda kullanılamadığını unutmayın)</string>\n    <string name=\"notification_colorize_title\">Bildirimi renklendir</string>\n    <string name=\"msg_calculating_hash\">Hash hesaplanıyor</string>\n    <string name=\"hash_channel_description\">Video dosya özetleme süreci için bildirimler</string>\n    <string name=\"hash_channel_name\">Video dosya özeti bildirimi</string>\n    <string name=\"recent\">En Son</string>\n    <string name=\"show_meta_info_summary\">Akış oluşturucu, akış içeriği veya arama isteğiyle ilgili ek bilgiler içeren üst veri bilgi kutularını gizlemek için kapat</string>\n    <string name=\"show_meta_info_title\">Üst bilgiyi göster</string>\n    <string name=\"chapters\">Bölümler</string>\n    <string name=\"description_tab_description\">Açıklama</string>\n    <string name=\"related_items_tab_description\">İlgili akışlar</string>\n    <string name=\"comments_tab_description\">Yorumlar</string>\n    <string name=\"show_description_summary\">Video açıklamasını ve ek bilgileri gizlemek için kapatın</string>\n    <string name=\"show_description_title\">Açıklamayı göster</string>\n    <string name=\"open_with\">Birlikte aç</string>\n    <string name=\"no_app_to_open_intent\">Aygıtınızdaki hiçbir uygulama bunu açamıyor</string>\n    <string name=\"crash_the_app\">Uygulamayı çöktür</string>\n    <string name=\"paid_content\">Bu içerik yalnızca ücretini ödemiş kullanıcılara açıktır, bu nedenle NewPipe tarafından oynatılamaz ve indirilemez.</string>\n    <string name=\"youtube_music_premium_content\">Bu video yalnızca YouTube Müzik Premium üyelerine açıktır, bu nedenle NewPipe tarafından oynatılamaz veya indirilemez.</string>\n    <string name=\"private_content\">Bu içerik özeldir, bu nedenle NewPipe tarafından oynatılamaz ve indirilemez.</string>\n    <string name=\"soundcloud_go_plus_content\">Bu SoundCloud Go+ parçasıdır, en azından sizin ülkenizde, bu nedenle NewPipe tarafından oynatılamaz ve indirilemez.</string>\n    <string name=\"georestricted_content\">Bu içerik ülkenizde kullanılamaz.</string>\n    <string name=\"restricted_video_no_stream\">Bu video yaş kısıtlıdır.\n\\nYouTube\\'un yeni yaş kısıtlı videolar ilkesi gereği, NewPipe böylesi videoların akışına erişemez ve bu nedenle oynatamaz.</string>\n    <string name=\"featured\">Öne çıkan</string>\n    <string name=\"radio\">Radyo</string>\n    <string name=\"recaptcha_solve\">Çöz</string>\n    <string name=\"download_has_started\">İndirme başladı</string>\n    <string name=\"select_night_theme_toast\">Gözde gece temanızı aşağıdan seçebilirsiniz</string>\n    <string name=\"night_theme_summary\">Gözde gece temanızı seçin — %s</string>\n    <string name=\"auto_device_theme_title\">Kendiliğinden (aygıt teması)</string>\n    <string name=\"night_theme_title\">Gece teması</string>\n    <string name=\"show_channel_details\">Kanal ayrıntılarını göster</string>\n    <string name=\"disable_media_tunneling_summary\">Ortam yürütümünde siyah ekran veya tutukluk yaşıyorsanız ortam tünellemeyi devre dışı bırakın.</string>\n    <string name=\"disable_media_tunneling_title\">Ortam tünellemeyi devre dışı bırak</string>\n    <string name=\"metadata_privacy_internal\">İç</string>\n    <string name=\"metadata_privacy_private\">Gizli</string>\n    <string name=\"metadata_privacy_unlisted\">Listelenmemiş</string>\n    <string name=\"metadata_privacy_public\">Herkese Açık</string>\n    <string name=\"metadata_host\">Konakçı</string>\n    <string name=\"metadata_support\">Destek</string>\n    <string name=\"metadata_language\">Dil</string>\n    <string name=\"metadata_age_limit\">Yaş sınırı</string>\n    <string name=\"metadata_privacy\">Gizlilik</string>\n    <string name=\"metadata_licence\">Lisans</string>\n    <string name=\"metadata_tags\">Etiketler</string>\n    <string name=\"metadata_category\">Kategori</string>\n    <string name=\"description_select_disable\">Açıklamadaki metni seçmeyi devre dışı bırak</string>\n    <string name=\"description_select_enable\">Açıklamadaki metni seçmeyi etkinleştir</string>\n    <string name=\"description_select_note\">Artık, açıklamadaki metni seçebilirsiniz. Seçim kipindeyken sayfanın titreyebileceğini ve bağlantıların tıklanamayacağını unutmayın.</string>\n    <string name=\"open_website_license\">Web sitesini aç</string>\n    <string name=\"account_terminated\">Hesap sonlandırıldı</string>\n    <string name=\"feed_load_error_fast_unknown\">Hızlı besleme kipi bununla ilgili daha çok bilgi sağlamıyor.</string>\n    <string name=\"feed_load_error_terminated\">Yazarın hesabı sonlandırılmış.\n\\nNewPipe, bu beslemeyi gelecekte yükleyemeyecek.\n\\nBu kanalın aboneliğinden çıkmak ister misiniz\\?</string>\n    <string name=\"feed_load_error_account_info\">\\'%s\\' için besleme yüklenemedi.</string>\n    <string name=\"feed_load_error\">Besleme yüklenirken hata</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">\\'Depolama Erişimi Çerçevesi\\' yalnızca Android 10\\'dan başlayarak desteklenmektedir</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Her indirmede nereye kaydedileceği sorulacak</string>\n    <string name=\"no_dir_yet\">İndirme klasörü belirlenmedi, şimdi öntanımlı indirme klasörünü seçin</string>\n    <string name=\"off\">Kapalı</string>\n    <string name=\"on\">Aç</string>\n    <string name=\"tablet_mode_title\">Tablet kipi</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Konum çubuğu küçük resim ön izlemesi</string>\n    <string name=\"dont_show\">Gösterme</string>\n    <string name=\"low_quality_smaller\">Düşük nitelik (küçük)</string>\n    <string name=\"high_quality_larger\">Yüksek nitelik (geniş)</string>\n    <string name=\"comments_are_disabled\">Yorumlar devre dışı</string>\n    <string name=\"detail_heart_img_view_description\">Yaratıcısınca kalplendi</string>\n    <string name=\"mark_as_watched\">İzlendi olarak işaretle</string>\n    <string name=\"remote_search_suggestions\">Uzak arama önerileri</string>\n    <string name=\"local_search_suggestions\">Yerel arama önerileri</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">%1$s indirme silindi</item>\n        <item quantity=\"other\">%1$s indirme silindi</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">İndirme tamamlandı</item>\n        <item quantity=\"other\">%s indirme tamamlandı</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Ögeleri kaldırmak için kaydır</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"start_main_player_fullscreen_title\">Ana oynatıcıyı tam ekranda başlat</string>\n    <string name=\"enqueue_next_stream\">Bundan sonra oynat</string>\n    <string name=\"enqueued_next\">Bundan sonra oynatılmak için sıraya eklendi</string>\n    <string name=\"processing_may_take_a_moment\">İşleniyor… Biraz zaman alabilir</string>\n    <string name=\"check_for_updates\">Güncellemeleri denetle</string>\n    <string name=\"manual_update_description\">Yeni sürümleri el ile denetleyin</string>\n    <string name=\"checking_updates_toast\">Güncellemeler denetleniyor…</string>\n    <string name=\"feed_new_items\">Yeni akış ögeleri</string>\n    <string name=\"error_report_channel_name\">Hata raporlama bildirimi</string>\n    <string name=\"error_report_notification_title\">NewPipe hatayla karşılaştı, bildirmek için dokun</string>\n    <string name=\"error_report_notification_toast\">Hata oluştu, bildirime bakın</string>\n    <string name=\"show_crash_the_player_title\">\\\"Oynatıcıyı çöktür\\\"ü göster</string>\n    <string name=\"create_error_notification\">Hata bildirimi oluştur</string>\n    <string name=\"show_error_snackbar\">Hata balonu göster</string>\n    <string name=\"no_appropriate_file_manager_message\">Bu eyleme uygun dosya yönetici yok.\n\\nLütfen dosya yönetici kurun veya indirme ayarlarında \\'%s\\' devre dışı bırakın</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Bu eyleme uygun dosya yönetici bulunamadı.\n\\nLütfen Depolama Erişimi Çerçevesi uyumlu dosya yönetici kurun</string>\n    <string name=\"error_report_channel_description\">Hata raporları için bildirimler</string>\n    <string name=\"show_crash_the_player_summary\">Oynatıcı kullanırken çöktürme seçeneği gösterir</string>\n    <string name=\"crash_the_player\">Oynatıcıyı çökert</string>\n    <string name=\"detail_pinned_comment_view_description\">Sabitlenmiş yorum</string>\n    <string name=\"leak_canary_not_available\">LeakCanary yok</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer öntanımlısı</string>\n    <string name=\"enable_streams_notifications_title\">Yeni akış bildirimleri</string>\n    <string name=\"notifications\">Bildirimler</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s yeni yayın</item>\n        <item quantity=\"other\">%s yeni yayın</item>\n    </plurals>\n    <string name=\"check_new_streams\">Yeni akışları denetlemeyi çalıştır</string>\n    <string name=\"settings_category_player_notification_title\">Oynatıcı bildirimi</string>\n    <string name=\"settings_category_player_notification_summary\">Oynatılan akış bildirimini yapılandır</string>\n    <string name=\"streams_notification_channel_name\">Yeni akışlar</string>\n    <string name=\"loading_stream_details\">Akış ayrıntıları yükleniyor…</string>\n    <string name=\"streams_notification_channel_description\">Abonelikler için yeni akışlarla ilgili bildirimler</string>\n    <string name=\"streams_notifications_network_title\">Gerekli ağ bağlantısı</string>\n    <string name=\"notifications_disabled\">Bildirimler devre dışı</string>\n    <string name=\"get_notified\">Bildirim alın</string>\n    <string name=\"you_successfully_subscribed\">Artık bu kanala abone oldunuz</string>\n    <string name=\"enable_streams_notifications_summary\">Aboneliklerden yeni akışlarla ilgili bildirim gönder</string>\n    <string name=\"streams_notifications_interval_title\">Denetleme sıklığı</string>\n    <string name=\"any_network\">Herhangi bir ağ</string>\n    <string name=\"delete_downloaded_files_confirm\">İndirilen tüm dosyalar diskten silinsin mi\\?</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">Tümünü değiştir</string>\n    <string name=\"percent\">Yüzde</string>\n    <string name=\"semitone\">Ara ton</string>\n    <string name=\"selected_stream_external_player_not_supported\">Seçilen akış dış oynatıcılarca desteklenmiyor</string>\n    <string name=\"streams_not_yet_supported_removed\">İndiricice henüz desteklenmeyen akışlar gösterilmez</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Dış oynatıcılar için ses akışı yok</string>\n    <string name=\"no_video_streams_available_for_external_players\">Dış oynatıcılar için video akışı yok</string>\n    <string name=\"select_quality_external_players\">Dış oynatıcılar için nitelik seç</string>\n    <string name=\"unknown_format\">Bilinmeyen biçim</string>\n    <string name=\"unknown_quality\">Bilinmeyen nitelik</string>\n    <string name=\"progressive_load_interval_title\">Oynatma yükleme aralığı boyutu</string>\n    <string name=\"faq_title\">Sık Sorulan Sorular</string>\n    <string name=\"faq\">Web sitesinde görüntüle</string>\n    <string name=\"faq_description\">Uygulamayı kullanırken sorun yaşıyorsanız, sık sorulan sorulara verilen bu yanıtlara göz atmayı unutmayın!</string>\n    <string name=\"sort\">Sırala</string>\n    <string name=\"fast_mode\">Hızlı kip</string>\n    <string name=\"app_update_unavailable_toast\">En yeni NewPipe sürümünü kullanıyorsunuz</string>\n    <string name=\"app_update_available_notification_title\">NewPipe güncellemesi var!</string>\n    <string name=\"app_update_available_notification_text\">%s indirmek için dokunun</string>\n    <string name=\"import_subscriptions_hint\">3-nokta menüsünden abonelikleri içe veya dışa aktarın</string>\n    <string name=\"night_theme_available\">Bu seçenek yalnızca tema için %s seçildiğinde kullanılabilir</string>\n    <string name=\"unset_playlist_thumbnail\">Kalıcı küçük resmin ayarını kaldır</string>\n    <string name=\"card\">Kart</string>\n    <string name=\"msg_failed_to_copy\">Panoya kopyalanamadı</string>\n    <string name=\"playlist_add_stream_success_duplicate\">%d kez kopyası eklendi</string>\n    <string name=\"duplicate_in_playlist\">Gri oynatma listeleri halihazırda bu ögeyi içeriyor.</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Donanımsal ortam düğmesi olaylarını yoksay</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Örneğin, fiziksel düğmeleri bozuk bir kulaklık kullanıyorsanız kullanışlıdır</string>\n    <string name=\"remove_duplicates\">Kopyaları kaldır</string>\n    <string name=\"remove_duplicates_title\">Kopyalar kaldırılsın mı\\?</string>\n    <string name=\"remove_duplicates_message\">Bu oynatma listesindeki tüm yinelenen akışları kaldırmak istiyor musunuz\\?</string>\n    <string name=\"feed_hide_streams_title\">Aşağıdaki akışları göster</string>\n    <string name=\"feed_show_hide_streams\">Akışları göster/gizle</string>\n    <string name=\"feed_show_watched\">Tamamen izlendi</string>\n    <string name=\"feed_show_upcoming\">Yaklaşan</string>\n    <string name=\"feed_show_partially_watched\">Kısmen izlendi</string>\n    <string name=\"brightness\">Parlaklık</string>\n    <string name=\"volume\">Ses düzeyi</string>\n    <string name=\"none\">Hiçbiri</string>\n    <string name=\"left_gesture_control_summary\">Parmağınızı ekranın sol yarısında kaydırırken ne yapılacağını seçin</string>\n    <string name=\"prefer_descriptive_audio_summary\">Varsa, görsel engelli kişiler için betimli ses parçasını seç</string>\n    <string name=\"unknown_audio_track\">Bilinmeyen</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer ayarları</string>\n    <string name=\"settings_category_exoplayer_summary\">Kimi ExoPlayer ayarlarını yönet. Bu değişiklikler oynatıcının yeniden başlatılmasını gerektirir</string>\n    <string name=\"audio_track_type_original\">özgün</string>\n    <string name=\"audio_track_type_dubbed\">dublaj</string>\n    <string name=\"audio_track_type_descriptive\">betimlemeli</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"select_audio_track_external_players\">Dış oynatıcılar için ses parçası seç</string>\n    <string name=\"prefer_original_audio_summary\">Dilden bağımsız olarak orijinal ses parçasını seçin</string>\n    <string name=\"play_queue_audio_track\">Ses: %s</string>\n    <string name=\"prefer_original_audio_title\">Orijinal sesi tercih edin</string>\n    <string name=\"prefer_descriptive_audio_title\">Açıklayıcı sesi tercih edin</string>\n    <string name=\"audio_track\">Ses parçası</string>\n    <string name=\"audio_track_present_in_video\">Bu akışta halihazırda bir ses parçası bulunmalıdır</string>\n    <string name=\"no_streams\">Akış yok</string>\n    <string name=\"no_live_streams\">Canlı akış yok</string>\n    <string name=\"right_gesture_control_title\">Sağ hareket işlemi</string>\n    <string name=\"main_tabs_position_summary\">Ana sekme seçiciyi alta taşı</string>\n    <string name=\"main_tabs_position_title\">Ana sekme konumu</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Ortam tünelleme öntanımlı olarak devre dışı bırakılmıştır çünkü aygıt modelinizin desteği bilinmemektedir.</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Çö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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Her zaman ExoPlayer\\'ın video çıktısı yüzey ayar çözümünü kullan</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\n\n\\nBu ayarı etkinleştirmek, geçerli video oynatıcısını değiştirirken veya tam ekrana geçerkenki oynatma hatalarını önleyebilir</string>\n    <string name=\"progressive_load_interval_summary\">Progresif içeriklerdeki yükleme aralığı boyutunu değiştir (şu anda %s). Daha düşük değer ilk yüklemeyi hızlandırabilir</string>\n    <string name=\"left_gesture_control_title\">Sol hareket işlemi</string>\n    <string name=\"right_gesture_control_summary\">Parmağınızı ekranın sağ yarısında kaydırırken ne yapılacağını seçin</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">ExoPlayer\\'ın çözücü yedek özelliğini kullan</string>\n    <string name=\"image_quality_title\">Resim niteliği</string>\n    <string name=\"channel_tab_videos\">Videolar</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"metadata_subscribers\">Aboneler</string>\n    <string name=\"show_channel_tabs_summary\">Kanal sayfalarında hangi sekmelerin gösterileceği</string>\n    <string name=\"share_playlist_with_list\">Adres Listesiyle Paylaş</string>\n    <string name=\"share_playlist_with_titles\">Başlıklarla Paylaş</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_channel_tabs\">Kanal sekmeleri</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"loading_metadata_title\">Üst Veri Yükleniyor…</string>\n    <string name=\"toggle_screen_orientation\">Ekran yönelimini değiştir</string>\n    <string name=\"image_quality_low\">Düşük nitelik</string>\n    <string name=\"toggle_fullscreen\">Tam ekranı değiştir</string>\n    <string name=\"feed_fetch_channel_tabs\">Kanal sekmelerini al</string>\n    <string name=\"metadata_avatars\">Avatarlar</string>\n    <string name=\"next_stream\">Sonraki akış</string>\n    <string name=\"metadata_subchannel_avatars\">Alt kanal avatarları</string>\n    <string name=\"open_play_queue\">Oynatma kuyruğunu aç</string>\n    <string name=\"image_quality_none\">Resimleri yükleme</string>\n    <string name=\"image_quality_high\">Yüksek nitelik</string>\n    <string name=\"channel_tab_about\">Hakkında</string>\n    <string name=\"share_playlist\">Oynatma Listesini Paylaş</string>\n    <string name=\"forward\">İleri sar</string>\n    <string name=\"channel_tab_albums\">Albümler</string>\n    <string name=\"rewind\">Geri sar</string>\n    <string name=\"replay\">Yeniden oynat</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Besleme güncellenirken alınacak sekmeler. Hızlı kip kullanılırken kanal güncelleniyorsa bu seçeneğin etkisi yoktur.</string>\n    <string name=\"image_quality_medium\">Orta nitelik</string>\n    <string name=\"metadata_uploader_avatars\">Yükleyen avatarları</string>\n    <string name=\"metadata_banners\">Afişler</string>\n    <string name=\"channel_tab_playlists\">Oynatma listeleri</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"play\">Oynat</string>\n    <string name=\"more_options\">Daha çok seçenekler</string>\n    <string name=\"metadata_thumbnails\">Küçük resimler</string>\n    <string name=\"channel_tab_tracks\">Parçalar</string>\n    <string name=\"duration\">Süre</string>\n    <string name=\"channel_tab_channels\">Kanallar</string>\n    <string name=\"previous_stream\">Önceki akış</string>\n    <string name=\"channel_tab_livestreams\">Canlı</string>\n    <string name=\"show_more\">Daha fazla göster</string>\n    <string name=\"show_less\">Daha az göster</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s yanıt</item>\n        <item quantity=\"other\">%s yanıt</item>\n    </plurals>\n    <string name=\"error_insufficient_storage\">Aygıtta yeterli boş alan yok</string>\n    <string name=\"settings_category_backup_restore_title\">Yedekle ve geri yükle</string>\n    <string name=\"reset_settings_title\">Ayarları sıfırla</string>\n    <string name=\"reset_settings_summary\">Tüm ayarları öntanımlı değerlerine sıfırlayın</string>\n    <string name=\"reset_all_settings\">Tüm ayarları sıfırlamak, tercih edilen tüm ayarlarınızı kaldırır ve uygulamayı yeniden başlatır.\n\\n\n\\nDevam etmek istediğinizden emin misiniz?</string>\n    <string name=\"yes\">Evet</string>\n    <string name=\"no\">Hayır</string>\n    <string name=\"auto_update_check_description\">NewPipe zaman zaman yeni sürümleri kendiliğinden denetleyebilir ve kullanılabilir olduklarında sizi bilgilendirebilir.\n\\nBunu etkinleştirmek istiyor musunuz?</string>\n    <string name=\"import_settings_vulnerable_format\">İç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.</string>\n    <string name=\"audio_track_type_secondary\">ikincil</string>\n    <string name=\"tab_bookmarks_short\">Oynatma Listeleri</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">YouTube geçici oynatma listesi olarak paylaş</string>\n    <string name=\"select_a_feed_group\">Besleme kümesi seç</string>\n    <string name=\"feed_group_page_summary\">Kanal küme sayfası</string>\n    <string name=\"no_feed_group_created_yet\">Besleme kümesi oluşturulmadı</string>\n    <string name=\"channel_tab_likes\">Beğeni</string>\n    <string name=\"search_with_service_name\">%1$s İle Ara</string>\n    <string name=\"search_with_service_name_and_filter\">%1$s İle Ara (%2$s)</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud Top 50 sayfası kaldırıldı</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud, özgün Top 50 listesini artık yayınlamıyor. İlgili sekme ana sayfanızdan kaldırıldı.</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"migration_info_7_8_title\">YouTube birleşik trendler kaldırıldı</string>\n    <string name=\"migration_info_7_8_message\">YouTube, 21 Temmuz 2025\\'ten sonra birleşik trendler sayfasını kaldırdı. NewPipe, öntanımlı trendler sayfasını trend canlı akışlarla değiştirdi.\\n\\n\\\"Ayarlar &gt; İçerik &gt; Ana sayfanın içeriği\\\"nden başka trend sayfalar seçebilirsiniz.</string>\n    <string name=\"trending_gaming\">Oyun trendleri</string>\n    <string name=\"trending_podcasts\">Trend podcastler</string>\n    <string name=\"trending_movies\">Trend film ve gösteriler</string>\n    <string name=\"trending_music\">Trend müzik</string>\n    <string name=\"permission_display_over_apps_message\">Açılır Oynatıcıyı kullanmak için Android ayarlar menüsünden %1$s seçilmeli ve %2$s etkinleştirilmeli.</string>\n    <string name=\"permission_display_over_apps_permission_name\">“Diğer uygulamaların üstünde göstermeye izin ver”</string>\n    <string name=\"delete_file\">Dosyayı sil</string>\n    <string name=\"delete_entry\">Girdiyi sil</string>\n    <string name=\"entry_deleted\">Girdi silindi</string>\n    <string name=\"account_terminated_service_provides_reason\">Hesap sonlandırıldı\\n\\n%1$s şu nedeni sağladı: %2$s</string>\n    <string name=\"player_http_403\">Oynatırken sunucudan HTTP 403 hatası alındı, akış URL’si bitmiş ya da IP engellenmiş olabilir</string>\n    <string name=\"player_http_invalid_status\">Oynatırken sunucudan HTTP %1$s hatası alındı</string>\n    <string name=\"youtube_player_http_403\">Oynatırken sunucudan HTTP 403 hatası alındı, IP engeli ya da akış URL’si çözme sorunları olabilir</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s veri sağlamayı geri çevirdi, istekçinin robot olmadığını doğrulaması için oturum açmasını istiyor.\\n\\n%1$s, IP adresinizi geçici olarak engellemiş olabilir, bir süre bekleyebilir ya da başka IP\\'ye geçebilirsiniz (örneğin VPN\\'i açıp/kapatarak ya da WiFi\\'den mobil veriye geçerek).</string>\n    <string name=\"unsupported_content_in_country\">Bu içerik şu anda seçili içerik ülkesinde kullanılamıyor.\\n\\nSeçiminizi \\\"Ayarlar &gt; İçerik &gt; Öntanımlı içerik ülkesi\\\"nden değiştirin.</string>\n    <string name=\"kao_dialog_warning\">Google, Eylül 2026\\'dan itibaren sertifikalı Android cihazlardaki Play Store harici olmak üzere tüm uygulamaların, geliştiricilerin kişisel kimlik bilgilerini doğrudan Google’a göndermesini gerektireceğini duyurdu. NewPipe geliştiricileri bu zorunluluğu kabul etmediğinden, NewPipe bu tarihten sonra sertifikalı Android cihazlarda çalışmayacaktır.</string>\n    <string name=\"kao_dialog_more_info\">Detaylar</string>\n    <string name=\"kao_solution\">Çözüm</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-tt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"install\">Урнаштыру</string>\n    <string name=\"cancel\">Баш тарту</string>\n    <string name=\"ok\">Ярар</string>\n    <string name=\"yes\">Әйе</string>\n    <string name=\"no\">Юк</string>\n    <string name=\"open_in_browser\">Браузерда ачу</string>\n    <string name=\"download\">Йөкләп алу</string>\n    <string name=\"search\">Эзләү</string>\n    <string name=\"settings\">Көйләүләр</string>\n    <string name=\"subscribe_button_title\">Язылу</string>\n    <string name=\"show_info\">Мәгълүматны күрсәтү</string>\n    <string name=\"controls_background_title\">Арткы план</string>\n    <string name=\"play_with_kodi_title\">Kodi белән уйнату</string>\n    <string name=\"theme_title\">Тема</string>\n    <string name=\"light_theme_title\">Ачык</string>\n    <string name=\"black_theme_title\">Кара</string>\n    <string name=\"volume\">Тавыш көче</string>\n    <string name=\"none\">Бернинди дә</string>\n    <string name=\"settings_category_clear_data_title\">Мәгълүматны чистарту</string>\n    <string name=\"download_dialog_title\">Йөкләп алу</string>\n    <string name=\"autoplay_title\">Автоматик уйнату</string>\n    <string name=\"peertube_instance_url_title\">\\\"PeerTube\\\" серверлары</string>\n    <string name=\"settings_category_appearance_title\">Тышкы күренеш</string>\n    <string name=\"settings_category_debug_title\">Хата төзәтү</string>\n    <string name=\"settings_category_updates_title\">Яңартулар</string>\n    <string name=\"channels\">Каналлар</string>\n    <string name=\"songs\">Җырлар</string>\n    <string name=\"disabled\">Cүндерелде</string>\n    <string name=\"undo\">Кире алу</string>\n    <string name=\"file\">Файл</string>\n    <string name=\"brightness\">Яктылык</string>\n    <string name=\"show_search_suggestions_title\">Эзләү тәкъдимнәре</string>\n    <string name=\"local_search_suggestions\">Локаль эзләү тәкъдимнәре</string>\n    <string name=\"enable_search_history_title\">Эзләү тарихы</string>\n    <string name=\"settings_category_player_behavior_title\">Тәртип</string>\n    <string name=\"settings_category_video_audio_title\">Видео һәм аудио</string>\n    <string name=\"settings_category_history_title\">Тарих һәм кэш</string>\n    <string name=\"users\">Кулланучылар</string>\n    <string name=\"events\">Вакыйгалар</string>\n    <string name=\"peertube_instance_add_title\">Сервер өстәү</string>\n    <string name=\"content\">Эчтәлек</string>\n    <string name=\"duration_live\">Турыдан-туры</string>\n    <string name=\"clear\">Чистарту</string>\n    <string name=\"notification_channel_name\">NewPipe искәртүе</string>\n    <string name=\"file_deleted\">Файл бетерелде</string>\n    <string name=\"notifications\">Искәртүләр</string>\n    <string name=\"unknown_content\">[Билгесез]</string>\n    <string name=\"play_all\">Барысын да уйнату</string>\n    <string name=\"always\">Һәрвакыт</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-tzm/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"controls_add_to_playlist_title\">Rnu ɣer</string>\n    <string name=\"tab_choose\">Sty aseksel</string>\n    <string name=\"show_info\">Smal ineɣmisen</string>\n    <string name=\"share_dialog_title\">Bḍu aked</string>\n    <string name=\"settings\">Tisɣal</string>\n    <string name=\"search\">Rzu</string>\n    <string name=\"download\">Agem</string>\n    <string name=\"share\">Bḍu</string>\n    <string name=\"cancel\">Ser</string>\n    <string name=\"show_comments_title\">Smal iɣfawalen</string>\n    <string name=\"black_theme_title\">Aberkan</string>\n    <string name=\"dark_theme_title\">Adeɣmum</string>\n    <string name=\"light_theme_title\">Anafaw</string>\n    <string name=\"theme_title\">Asgum</string>\n    <string name=\"play_audio\">Imesli</string>\n    <string name=\"notification_action_nothing\">Walu</string>\n    <string name=\"play_with_kodi_title\">Γeṛ s Kodi</string>\n    <string name=\"search_showing_result_for\">Asmal n tyufa i: %s</string>\n    <string name=\"upload_date_text\">ittufser g %1$s</string>\n    <string name=\"no_comments\">Walu ixfawalen</string>\n    <string name=\"notification_channel_name\">Tineɣmisin n NewPipe</string>\n    <string name=\"download_path_title\">Asedaw n ividyuten yugem</string>\n    <string name=\"delete_downloaded_files\">Kkes ifuyla yugmen</string>\n    <string name=\"downloads_storage_use_saf_title\">Semres SAF</string>\n    <string name=\"download_path_audio_title\">Asdaw n wagam n imesli</string>\n    <string name=\"clear_download_history\">Sfeḍ amzruy n wagam</string>\n    <string name=\"downloads_storage_ask_title\">Seqsa mani ɣa tagemd</string>\n    <string name=\"clear_views_history_title\">Sfeḍ amzruy n wannay</string>\n    <string name=\"settings_category_history_title\">Amzruy d uffiren</string>\n    <string name=\"enable_watch_history_title\">Amzruy n wannay</string>\n    <string name=\"enable_search_history_title\">Rzu amzruy</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">ittannay %s</item>\n        <item quantity=\"other\">ttanayen %s</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d wass</item>\n        <item quantity=\"other\">%d wussan</item>\n    </plurals>\n    <string name=\"remove_watched_popup_title\">Kkes ividyuten ittwannayen?</string>\n    <string name=\"more_than_100_videos\">100+ ividyuten</string>\n    <string name=\"no_videos\">walu ividyuten</string>\n    <string name=\"video_detail_by\">Sɣur %s</string>\n    <string name=\"infinite_videos\">∞ ividyuten</string>\n    <string name=\"your_comment\">Axefawal-nnek (s tneglizt):</string>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d Tsraget</item>\n        <item quantity=\"other\">%d Tsragin</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d tusdidet</item>\n        <item quantity=\"other\">%d tusdidin</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d tsinet</item>\n        <item quantity=\"other\">%d tsinin</item>\n    </plurals>\n    <string name=\"app_language_title\">Tutlayt n tsensi</string>\n    <string name=\"start_downloads\">Senti agamen</string>\n    <string name=\"close\">Rgel</string>\n    <string name=\"wifi_only\">Γas s uwifi</string>\n    <string name=\"resize_zoom\">Semɣeṛ</string>\n    <string name=\"video_player\">Ameɣri n uvidyu</string>\n    <string name=\"play_queue_audio_settings\">Tiɣal n imesli</string>\n    <string name=\"play_queue_remove\">Sitey</string>\n    <string name=\"select_a_kiosk\">Sty yan n ukiyusk</string>\n    <string name=\"select_a_channel\">Sty yat n tbadut</string>\n    <string name=\"channel_page_summary\">Tasna n Tbadut</string>\n    <string name=\"kiosk_page_summary\">Tasna n ukiyusk</string>\n    <string name=\"delete_item_search_history\">Is nit txsed ad tkksed aferdis-a seg umezruy n urezzu\\?</string>\n    <string name=\"view_on_github\">Ẓeṛ g GitHub</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s uvidyu</item>\n        <item quantity=\"other\">%s ividyuten</item>\n    </plurals>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s Tannayt</item>\n        <item quantity=\"other\">%s Tannayin</item>\n    </plurals>\n    <string name=\"detail_thumbnail_view_description\">Γer avidyu, azemz:</string>\n    <string name=\"error_snackbar_action\">Mel</string>\n    <string name=\"error_report_open_issue_button_text\">Mel g GitHub</string>\n    <string name=\"watch_history_deleted\">Ittwakkes umzruy n wannay.</string>\n    <string name=\"search_history_deleted\">Ittwakkes umezruy n urezzu.</string>\n    <string name=\"delete_search_history_alert\">Kkes amzruy n urezzu maṛṛa\\?</string>\n    <string name=\"clear_search_history_title\">Sfeḍ amzruy n urezzu</string>\n    <string name=\"delete_view_history_alert\">Kkes amzruy n wannay maṛṛa\\?</string>\n    <string name=\"app_update_notification_channel_description\">Tineɣmisin i tleqqimt tamaynut n NewPipe</string>\n    <string name=\"play_all\">Γer maṛṛa</string>\n    <string name=\"file_deleted\">Ittwakkes ufaylu</string>\n    <string name=\"content\">Akettur</string>\n    <string name=\"settings_category_video_audio_title\">Avidyu d imesli</string>\n    <string name=\"settings_category_clear_data_title\">Sfeḍ isefka</string>\n    <string name=\"show_higher_resolutions_summary\">Zmern ad ɣren kra n wallalen ividyuten 2K/4K</string>\n    <string name=\"feed_create_new_group_button_title\">Amaynu</string>\n    <string name=\"stop\">Sbedd</string>\n    <string name=\"grid\">Aẓeṭṭa</string>\n    <string name=\"list\">Talgamet</string>\n    <string name=\"minimize_on_exit_none_description\">Walu</string>\n    <string name=\"updates_setting_title\">Tisdɣiwin</string>\n    <string name=\"decline\">Agey</string>\n    <string name=\"accept\">Deggi</string>\n    <string name=\"mute\">Ẓẓiẓen</string>\n    <string name=\"name\">Isem</string>\n    <string name=\"local\">Adɣran</string>\n    <string name=\"website_title\">Asit wib</string>\n    <string name=\"tab_about\">Γef</string>\n    <string name=\"settings_category_downloads_title\">Agam</string>\n    <string name=\"msg_name\">Isem n ufaylu</string>\n    <string name=\"ok\">WAXXA</string>\n    <string name=\"delete\">Kkes</string>\n    <string name=\"create\">Senulfu</string>\n    <string name=\"start\">Senti</string>\n    <string name=\"retry\">Als-arem</string>\n    <string name=\"audio\">Imesli</string>\n    <string name=\"video\">Avidyu</string>\n    <string name=\"what_device_headline\">Umelan:</string>\n    <string name=\"general_error\">Tazgelt</string>\n    <string name=\"file\">Afaylu</string>\n    <string name=\"always\">Ku dwal</string>\n    <string name=\"clear\">Sfeḍ</string>\n    <string name=\"artists\">Inaẓuṛen</string>\n    <string name=\"songs\">Tiɣennijin</string>\n    <string name=\"events\">Imezza</string>\n    <string name=\"users\">Inessemras</string>\n    <string name=\"videos_string\">Ividyuten</string>\n    <string name=\"channels\">Tibuda</string>\n    <string name=\"all\">Maṛṛa</string>\n    <string name=\"downloads_title\">Tagamin</string>\n    <string name=\"downloads\">Tagamin</string>\n    <string name=\"duration_live\">Usrid</string>\n    <string name=\"settings_category_updates_title\">Tisdɣiwin</string>\n    <string name=\"settings_category_player_title\">Ameɣri</string>\n    <string name=\"download_dialog_title\">Agem</string>\n    <string name=\"subscribe_button_title\">Lteɣ</string>\n    <string name=\"main_bg_subtitle\">Add \\\"Rzu\\\" i usenti</string>\n    <string name=\"show_play_with_kodi_title\">Ssemal tadɣert \\\"Γer s Kodi\\\"</string>\n    <string name=\"download_path_dialog_title\">Dɣer asedaw n wagam n ifuyla n ividyuten</string>\n    <string name=\"use_external_audio_player_title\">Ssemres ameɣri n imsli abeṛṛani</string>\n    <string name=\"use_external_video_player_summary\">La-ittekkes imsli d kra n tɣariwin</string>\n    <string name=\"use_external_video_player_title\">Asenṭeḍ ameɣri n uvidyu abeṛṛani</string>\n    <string name=\"did_you_mean\">Txsed ad tarad \\\"%1$s\\\"\\?</string>\n    <string name=\"night_theme_title\">Asgum n yiḍ</string>\n    <string name=\"open_with\">Ṛẓem s</string>\n    <string name=\"feed_groups_header_title\">Tirubba n tbadut</string>\n    <string name=\"fragment_feed_title\">Matta n umaynu</string>\n    <string name=\"always_ask_open_action\">ttseqsa abda</string>\n    <string name=\"blank_page_summary\">Tasna ixwan</string>\n    <string name=\"title_activity_about\">Ɣef NewPipe</string>\n    <string name=\"msg_wait\">Ṛaja…</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s umsflid</item>\n        <item quantity=\"other\">%s imsfliden</item>\n    </plurals>\n    <string name=\"no_views\">Walu tannayin</string>\n    <string name=\"network_error\">Azgal n uẓeṭṭa</string>\n    <string name=\"just_once\">Ɣas yat</string>\n    <string name=\"radio\">Aṛadyu</string>\n    <string name=\"recaptcha_solve\">Fru</string>\n    <string name=\"comments_tab_description\">Ixfawalen</string>\n    <string name=\"never\">Usar</string>\n    <string name=\"playback_step\">Asurif</string>\n    <string name=\"rename_playlist\">Sisem</string>\n    <string name=\"action_history\">Amezray</string>\n    <string name=\"title_activity_history\">Amezray</string>\n    <string name=\"msg_error\">Azgal</string>\n    <string name=\"rename\">Sisem</string>\n    <string name=\"pause\">Sbedd</string>\n    <string name=\"unknown_content\">[Arussin]</string>\n    <string name=\"description_tab_description\">Aglam</string>\n    <string name=\"playlist_add_stream_success\">Rnu ɣer telgamt n tɣuri</string>\n    <string name=\"tab_licenses\">Turagin</string>\n    <string name=\"dismiss\">Ttu</string>\n    <string name=\"undo\">Ser</string>\n    <string name=\"albums\">Ilbumen</string>\n    <string name=\"playlists\">Tilgamin n tɣuri</string>\n    <string name=\"autoplay_title\">Taɣuri tawurmant</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-uk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">Опубліковано %1$s</string>\n    <string name=\"no_player_found\">Програвач потокового відео не знайдений. Встановити VLC\\?</string>\n    <string name=\"install\">Встановити</string>\n    <string name=\"cancel\">Скасувати</string>\n    <string name=\"open_in_browser\">Відкрити в оглядачі</string>\n    <string name=\"share\">Поширити</string>\n    <string name=\"download\">Завантажити</string>\n    <string name=\"search\">Пошук</string>\n    <string name=\"settings\">Налаштування</string>\n    <string name=\"did_you_mean\">Ви мали на увазі: «%1$s»\\?</string>\n    <string name=\"share_dialog_title\">Поширити через</string>\n    <string name=\"use_external_video_player_title\">Зовнішній відеопрогравач</string>\n    <string name=\"use_external_audio_player_title\">Зовнішній аудіопрогравач</string>\n    <string name=\"download_path_title\">Тека для завантаження відео</string>\n    <string name=\"download_path_dialog_title\">Виберіть теку для завантаження відеофайлів</string>\n    <string name=\"download_path_audio_dialog_title\">Виберіть теку для завантаження аудіофайлів</string>\n    <string name=\"download_path_summary\">Шлях до теки із завантаженими відео</string>\n    <string name=\"download_path_audio_title\">Тека для завантаження аудіо</string>\n    <string name=\"download_path_audio_summary\">Завантажені аудіофайли зберігаються тут</string>\n    <string name=\"default_resolution_title\">Типова роздільність</string>\n    <string name=\"play_with_kodi_title\">Програти в Kodi</string>\n    <string name=\"kore_not_found\">Установити відсутній застосунок Kore\\?</string>\n    <string name=\"show_play_with_kodi_title\">Показати опцію «Відтворити у Kodi»</string>\n    <string name=\"show_play_with_kodi_summary\">Показати опцію відтворення відео в Kodi</string>\n    <string name=\"play_audio\">Аудіо</string>\n    <string name=\"default_audio_format_title\">Типовий формат звуку</string>\n    <string name=\"theme_title\">Тема</string>\n    <string name=\"dark_theme_title\">Темна</string>\n    <string name=\"light_theme_title\">Світла</string>\n    <string name=\"download_dialog_title\">Завантажити</string>\n    <string name=\"show_next_and_similar_title\">Показувати «Наступне» і «Схожі» відео</string>\n    <string name=\"unsupported_url\">URL не підтримується</string>\n    <string name=\"content_language_title\">Переважна мова вмісту</string>\n    <string name=\"settings_category_video_audio_title\">Відео та звук</string>\n    <string name=\"settings_category_appearance_title\">Зовнішній вигляд</string>\n    <string name=\"background_player_playing_toast\">Відтворення у фоновому режимі</string>\n    <string name=\"content\">Вміст</string>\n    <string name=\"show_age_restricted_content_title\">Вміст із віковими обмеженнями</string>\n    <string name=\"duration_live\">Наживо</string>\n    <string name=\"general_error\">Помилка</string>\n    <string name=\"network_error\">Помилка мережі</string>\n    <string name=\"could_not_load_thumbnails\">Не вдалося завантажити всі ескізи</string>\n    <string name=\"parsing_error\">Не вдалося проаналізувати вебсайт</string>\n    <string name=\"content_not_available\">Вміст недоступний</string>\n    <string name=\"could_not_setup_download_menu\">Не вдалося налаштувати меню завантаження</string>\n    <string name=\"sorry_string\">Перепрошуємо, цього не мало статися.</string>\n    <string name=\"error_report_button_text\">Надіслати звіт е-поштою</string>\n    <string name=\"error_snackbar_message\">Вибачте, щось пішло не так.</string>\n    <string name=\"error_snackbar_action\">Звіт</string>\n    <string name=\"what_device_headline\">Інформація:</string>\n    <string name=\"what_happened_headline\">Що сталося:</string>\n    <string name=\"main_bg_subtitle\">Торкніться лупи, щоб розпочати.</string>\n    <string name=\"black_theme_title\">Чорна</string>\n    <string name=\"downloads\">Завантаження</string>\n    <string name=\"downloads_title\">Завантаження</string>\n    <string name=\"error_report_title\">Звіт про помилку</string>\n    <string name=\"all\">Усе</string>\n    <string name=\"disabled\">Вимкнено</string>\n    <string name=\"app_ui_crash\">Збій застосунку/інтерфейсу</string>\n    <string name=\"your_comment\">Ваш коментар (англійською):</string>\n    <string name=\"error_details_headline\">Деталі:</string>\n    <string name=\"detail_thumbnail_view_description\">Відтворити відео, тривалість:</string>\n    <string name=\"video\">Відео</string>\n    <string name=\"audio\">Аудіо</string>\n    <string name=\"retry\">Повторити спробу</string>\n    <string name=\"start\">Почати</string>\n    <string name=\"pause\">Пауза</string>\n    <string name=\"delete\">Видалити</string>\n    <string name=\"checksum\">Контрольна сума</string>\n    <string name=\"ok\">Гаразд</string>\n    <string name=\"msg_name\">Назва файлу</string>\n    <string name=\"msg_threads\">Потоки</string>\n    <string name=\"msg_error\">Помилка</string>\n    <string name=\"msg_running\">NewPipe завантажує</string>\n    <string name=\"msg_running_detail\">Деталі</string>\n    <string name=\"msg_wait\">Зачекайте…</string>\n    <string name=\"msg_copied\">Скопійовано до буфера обміну</string>\n    <string name=\"no_available_dir\">Вкажіть теку для завантажень пізніше в налаштуваннях</string>\n    <string name=\"no_player_found_toast\">Програвач потокового відео не знайдений (ви можете встановити VLC для програвання).</string>\n    <string name=\"open_in_popup_mode\">Відкрити у віконному режимі</string>\n    <string name=\"use_external_video_player_summary\">Прибирає звук за певної роздільності</string>\n    <string name=\"subscribe_button_title\">Підписатися</string>\n    <string name=\"subscribed_button_title\">Ви підписалися</string>\n    <string name=\"channel_unsubscribed\">Ви відписалися від каналу</string>\n    <string name=\"subscription_change_failed\">Не вдалося змінити підписку</string>\n    <string name=\"subscription_update_failed\">Не вдалося оновити підписку</string>\n    <string name=\"tab_subscriptions\">Підписки</string>\n    <string name=\"fragment_feed_title\">Новинки</string>\n    <string name=\"controls_background_title\">У фоні</string>\n    <string name=\"controls_popup_title\">У вікні</string>\n    <string name=\"default_popup_resolution_title\">Типова роздільність вікна</string>\n    <string name=\"show_higher_resolutions_summary\">Не всі пристрої можуть відтворювати 2K/4K-відео</string>\n    <string name=\"show_higher_resolutions_title\">Показувати вищі роздільності</string>\n    <string name=\"default_video_format_title\">Типовий формат відео</string>\n    <string name=\"popup_remember_size_pos_title\">Памʼятати властивості вікна</string>\n    <string name=\"popup_remember_size_pos_summary\">Памʼятати останній розмір і позицію вікна</string>\n    <string name=\"show_search_suggestions_title\">Пошукові пропозиції</string>\n    <string name=\"show_search_suggestions_summary\">Виберіть які пропозиції показувати під час пошуку</string>\n    <string name=\"enable_search_history_title\">Історія пошуків</string>\n    <string name=\"enable_search_history_summary\">Зберігати пошукові запити локально</string>\n    <string name=\"enable_playback_resume_title\">Продовжувати перегляд</string>\n    <string name=\"enable_playback_resume_summary\">Відновлювати останню позицію</string>\n    <string name=\"enable_playback_state_lists_title\">Позиції у списках</string>\n    <string name=\"enable_playback_state_lists_summary\">Показувати індикатори позицій переглядів у списках</string>\n    <string name=\"settings_category_clear_data_title\">Очистити дані</string>\n    <string name=\"enable_watch_history_summary\">Вести облік перегляду відеозаписів</string>\n    <string name=\"enable_watch_history_title\">Історія переглядів</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Відновлювати відтворення</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Продовжувати відтворення після переривань (напр. телефонних дзвінків)</string>\n    <string name=\"show_hold_to_append_title\">Показати підказку «Затисніть, щоб додати»</string>\n    <string name=\"default_content_country_title\">Типова країна вмісту</string>\n    <string name=\"settings_category_player_title\">Програвач</string>\n    <string name=\"settings_category_player_behavior_title\">Поведінка</string>\n    <string name=\"settings_category_history_title\">Історія та кеш</string>\n    <string name=\"popup_playing_toast\">Відтворення у віконному режимі</string>\n    <string name=\"clear\">Очистити</string>\n    <string name=\"best_resolution\">Найкраща роздільність</string>\n    <string name=\"undo\">Скасувати</string>\n    <string name=\"play_all\">Відтворити все</string>\n    <string name=\"always\">Завжди</string>\n    <string name=\"just_once\">Лише раз</string>\n    <string name=\"notification_channel_name\">Сповіщення NewPipe</string>\n    <string name=\"notification_channel_description\">Сповіщення для програвачів NewPipe</string>\n    <string name=\"unknown_content\">[Невідомо]</string>\n    <string name=\"switch_to_background\">Перейти у фоновий режим</string>\n    <string name=\"switch_to_popup\">Перемкнути у вікно</string>\n    <string name=\"switch_to_main\">Перемкнути на головну</string>\n    <string name=\"import_data_title\">Імпортувати базу даних</string>\n    <string name=\"export_data_title\">Експортувати базу даних</string>\n    <string name=\"import_data_summary\">Поточні підписки, добірки, історія і (за бажанням) налаштування буде замінено</string>\n    <string name=\"export_data_summary\">Експорт підписок, списків відтворення, історії та налаштувань</string>\n    <string name=\"player_stream_failure\">Не вдалося відтворити цей потік</string>\n    <string name=\"player_recoverable_failure\">Відновлення після помилки програвача</string>\n    <string name=\"video_streams_empty\">Відеопотоки не знайдено</string>\n    <string name=\"audio_streams_empty\">Аудіопотоки не знайдено</string>\n    <string name=\"no_subscribers\">Немає підписників</string>\n    <string name=\"no_videos\">Немає відео</string>\n    <string name=\"msg_popup_permission\">Цей дозвіл потрібен для перегляду\n\\nу віконному режимі</string>\n    <string name=\"settings_category_downloads_title\">Завантаження</string>\n    <string name=\"settings_file_charset_title\">Допустимі символи в назвах файлів</string>\n    <string name=\"settings_file_replacement_character_summary\">Недопустимі символи замінюватимуться цим значенням</string>\n    <string name=\"settings_file_replacement_character_title\">Замінні символи</string>\n    <string name=\"charset_letters_and_digits\">Букви та цифри</string>\n    <string name=\"charset_most_special_characters\">Більшість спеціальних символів</string>\n    <string name=\"title_activity_about\">Про NewPipe</string>\n    <string name=\"tab_licenses\">Ліцензії</string>\n    <string name=\"contribution_title\">Посприяти</string>\n    <string name=\"view_on_github\">Переглянути на GitHub</string>\n    <string name=\"donation_title\">Фінансова допомога</string>\n    <string name=\"website_title\">Вебсайт</string>\n    <string name=\"title_activity_history\">Історія</string>\n    <string name=\"export_complete_toast\">Експортовано</string>\n    <string name=\"import_complete_toast\">Імпортовано</string>\n    <string name=\"top_50\">Топ 50</string>\n    <string name=\"new_and_hot\">Нове та гаряче</string>\n    <string name=\"play_queue_stream_detail\">Подробиці</string>\n    <string name=\"play_queue_audio_settings\">Налаштування аудіо</string>\n    <string name=\"video_player\">Відеопрогравач</string>\n    <string name=\"background_player\">Тильний програвач</string>\n    <string name=\"popup_player\">Віконний програвач</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Отримання інформації…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Завантаження запитаного контенту</string>\n    <string name=\"controls_download_desc\">Завантажити потоковий файл</string>\n    <string name=\"show_info\">Показати інформацію</string>\n    <string name=\"tab_bookmarks\">Закладки відтворення</string>\n    <string name=\"controls_add_to_playlist_title\">Додати до</string>\n    <string name=\"show_hold_to_append_summary\">Показувати підказку під час натискання фонової або спливної кнопки у відео \\\"Деталі:\\\"</string>\n    <string name=\"player_unrecoverable_failure\">Сталася невиправна помилка програвача</string>\n    <string name=\"external_player_unsupported_link_type\">Зовнішні програвачі не підтримують такі види посилань</string>\n    <string name=\"info_labels\">Що:\\nЗапит:\\nМова вмісту:\\nКраїна вмісту:\\nМова застосунку:\\nСлужба:\\nЧас GMT:\\nПакунок:\\nВерсія:\\nВерсія ОС:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Мініатюрний аватар завантажувача відео</string>\n    <string name=\"detail_likes_img_view_description\">Вподобані</string>\n    <string name=\"detail_dislikes_img_view_description\">Не сподобалося</string>\n    <string name=\"search_no_results\">Нічого не знайдено</string>\n    <string name=\"detail_drag_description\">Перетягуйте для впорядкування</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s підписник</item>\n        <item quantity=\"few\">%s підписники</item>\n        <item quantity=\"many\">%s підписників</item>\n    </plurals>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s відео</item>\n        <item quantity=\"few\">%s відео</item>\n        <item quantity=\"many\">%s відео</item>\n    </plurals>\n    <string name=\"create\">Створити</string>\n    <string name=\"dismiss\">Відхилити</string>\n    <string name=\"rename\">Перейменувати</string>\n    <string name=\"title_licenses\">Ліцензії третіх сторін</string>\n    <string name=\"tab_about\">Про застосунок і ЧаП</string>\n    <string name=\"app_description\">Вільне та легке потокове програвання на Android.</string>\n    <string name=\"contribution_encouragement\">Які б не були ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторинг — будь-яка допомога завжди у пригоді. Що більше зроблено, то ліпшим стає NewPipe!</string>\n    <string name=\"settings_category_debug_title\">Налагодження</string>\n    <string name=\"empty_list_subtitle\">Нічого немає… чути лише цвіркунів</string>\n    <string name=\"no_views\">Немає переглядів</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s перегляд</item>\n        <item quantity=\"few\">%s перегляди</item>\n        <item quantity=\"many\">%s переглядів</item>\n    </plurals>\n    <string name=\"title_activity_recaptcha\">Перевірка reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Запит перевірки reCAPTCHA</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s, %2$s під %3$s</string>\n    <string name=\"donation_encouragement\">NewPipe розроблений добровольцями, які витрачають власний час заради вашого задоволення. Допоможіть розробникам зробити NewPipe ще ліпшим, насолоджуючись філіжанкою кави.</string>\n    <string name=\"give_back\">Ваша допомога</string>\n    <string name=\"website_encouragement\">Завітайте на офіційний сайт NewPipe, щоб отримати більше інформації та новин.</string>\n    <string name=\"app_license_title\">Ліцензія NewPipe</string>\n    <string name=\"read_full_license\">Прочитати ліцензію</string>\n    <string name=\"action_history\">Історія</string>\n    <string name=\"delete_item_search_history\">Видалити цей елемент з історії пошуку\\?</string>\n    <string name=\"title_last_played\">Відтворювалося останнім</string>\n    <string name=\"title_most_played\">Відтворювалося найбільше</string>\n    <string name=\"main_page_content\">Вміст на головній сторінці</string>\n    <string name=\"blank_page_summary\">Порожня сторінка</string>\n    <string name=\"kiosk_page_summary\">Сторінка кіоску</string>\n    <string name=\"channel_page_summary\">Сторінка каналу</string>\n    <string name=\"select_a_channel\">Обрати канал</string>\n    <string name=\"no_channel_subscribed_yet\">Немає підписок на канали</string>\n    <string name=\"select_a_kiosk\">Обрати кіоск</string>\n    <string name=\"no_valid_zip_file\">Немає дійсного ZIP-файлу</string>\n    <string name=\"could_not_import_all_files\">Увага: не вдалося імпортувати всі файли.</string>\n    <string name=\"override_current_data\">Це перезапише ваші поточні налаштування.</string>\n    <string name=\"trending\">Набуває популярності</string>\n    <string name=\"play_queue_remove\">Вилучити</string>\n    <string name=\"hold_to_append\">Утримуйте, щоб додати в чергу</string>\n    <string name=\"start_here_on_background\">Розпочати програвання на фоні</string>\n    <string name=\"start_here_on_popup\">Почати відтворення у вікні</string>\n    <string name=\"drawer_open\">Відкрити бічну панель</string>\n    <string name=\"drawer_close\">Закрити бічну панель</string>\n    <string name=\"always_ask_open_action\">Завжди питати</string>\n    <string name=\"create_playlist\">Нова добірка</string>\n    <string name=\"rename_playlist\">Перейменувати</string>\n    <string name=\"name\">Назва</string>\n    <string name=\"add_to_playlist\">Додати в добірку</string>\n    <string name=\"set_as_playlist_thumbnail\">Призначити ескізом добірки</string>\n    <string name=\"bookmark_playlist\">Додати добірку до закладок</string>\n    <string name=\"unbookmark_playlist\">Видалити закладку</string>\n    <string name=\"delete_playlist_prompt\">Видалити цю добірку\\?</string>\n    <string name=\"playlist_creation_success\">Добірку створено</string>\n    <string name=\"playlist_add_stream_success\">Додано в добірку</string>\n    <string name=\"playlist_thumbnail_change_success\">Ескіз добірки змінено.</string>\n    <string name=\"caption_none\">Без субтитрів</string>\n    <string name=\"resize_fit\">Вписати</string>\n    <string name=\"resize_fill\">Заповнити</string>\n    <string name=\"resize_zoom\">Збільшити</string>\n    <string name=\"caption_auto_generated\">Створені автоматично</string>\n    <string name=\"enable_leak_canary_summary\">Моніторинг втрат пам\\'яті може призвести до нереагування застосунку під час запису дампу</string>\n    <string name=\"enable_disposed_exceptions_title\">Звітувати про помилки життєвого циклу застосунку</string>\n    <string name=\"enable_disposed_exceptions_summary\">Примусове звітування про неможливість доставлення Rx-винятків, які відбуваються за межами фрагменту або діяльності життєвого циклу після усунення</string>\n    <string name=\"use_inexact_seek_title\">Швидкий неточний пошук</string>\n    <string name=\"use_inexact_seek_summary\">Швидше, але не точне перемотування. Перехід на 5, 15 або 25 секунд не працюватиме</string>\n    <string name=\"auto_queue_title\">Автододавання в чергу наступної трансляції</string>\n    <string name=\"auto_queue_summary\">Продовжити при завершені (не повторюваної) черги, додавши повʼязаний запис</string>\n    <string name=\"file\">Файл</string>\n    <string name=\"invalid_directory\">Такої теки не існує</string>\n    <string name=\"invalid_source\">Такого джерела файлу/вмісту не існує</string>\n    <string name=\"invalid_file\">Файл не існує або відсутній дозвіл на його читання або запис</string>\n    <string name=\"file_name_empty_error\">Назва файлу не може бути порожньою</string>\n    <string name=\"error_occurred_detail\">Сталася помилка: %1$s</string>\n    <string name=\"import_title\">Імпорт</string>\n    <string name=\"import_from\">Імпортувати з</string>\n    <string name=\"export_to\">Експортувати до</string>\n    <string name=\"import_ongoing\">Імпортування…</string>\n    <string name=\"export_ongoing\">Експортування…</string>\n    <string name=\"import_file_title\">Вибрати файл</string>\n    <string name=\"previous_export\">Попереднє експортування</string>\n    <string name=\"subscriptions_import_unsuccessful\">Не вдалося імпортувати підписки</string>\n    <string name=\"subscriptions_export_unsuccessful\">Не вдалося експортувати підписки</string>\n    <string name=\"import_youtube_instructions\">Імпортуйте підписки YouTube за допомогою Google Takeout:\n\\n\n\\n1. Перейдіть за посиланням: %1$s\n\\n2. Авторизуйтесь, якщо буде потрібно\n\\n3. Позначте пункт «YouTube і YouTube Music», потім виберіть тип «підписки»\n\\n4. Натисніть «Наступний крок» і «Експортувати дані»\n\\n5. Натисніть кнопку «Завантажити», коли вона з\\'явиться\n\\n6. Натисніть на ІМПОРТУВАТИ ФАЙЛ нижче і виберіть завантажений zip-файл\n\\n7. [Якщо не вдалося імпортувати zip] Видобудьте файл .csv (зазвичай у розділі «YouTube і YouTube Music/Підписки/subscriptions.csv»), натисніть ІМПОРТУВАТИ ФАЙЛ нижче та виберіть видобутий файл csv</string>\n    <string name=\"import_soundcloud_instructions\">Імпортуйте профіль SoundCloud, вписавши або URL, або ваш ID:\n\\n\n\\n1. Увімкніть режим «Версія для ПК» у браузері (сайт не підтримується мобільними пристроями)\n\\n2. Перейдіть за цим посиланням: %1$s\n\\n3. За запитом увійдіть до облікового запису\n\\n4. Скопіюйте URL профілю, до якого ви будете переспрямовані.</string>\n    <string name=\"import_soundcloud_instructions_hint\">вашID, soundcloud.com/yourid</string>\n    <string name=\"import_network_expensive_warning\">Майте на увазі: ця операція може потребувати багато трафіку.\n\\n\n\\nБажаєте продовжити\\?</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Кеш зображень стерто</string>\n    <string name=\"metadata_cache_wipe_title\">Стерти кеш метаданих</string>\n    <string name=\"metadata_cache_wipe_summary\">Видалити всі кешовані дані вебсторінок</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Кеш метаданих стерто</string>\n    <string name=\"playback_speed_control\">Керування швидкістю відтворення</string>\n    <string name=\"playback_tempo\">Темп</string>\n    <string name=\"playback_pitch\">Тон</string>\n    <string name=\"unhook_checkbox\">Від\\'єднати (може спричинити спотворення)</string>\n    <string name=\"no_streams_available_download\">Відсутні потоки, доступні для завантаження</string>\n    <string name=\"preferred_open_action_settings_title\">Бажана дія під час відкривання</string>\n    <string name=\"preferred_open_action_settings_summary\">Типова дія під час відкриття вмісту — %s</string>\n    <string name=\"caption_setting_title\">Субтитри</string>\n    <string name=\"caption_setting_description\">Зміна висоти тексту субтитрів та стилів тла. Потребує перезапуску застосунку</string>\n    <string name=\"clear_views_history_title\">Очистити історію переглядів</string>\n    <string name=\"clear_views_history_summary\">Видаляє історію відтворень і позицій відтворення</string>\n    <string name=\"delete_view_history_alert\">Видалити всю історію переглядів\\?</string>\n    <string name=\"watch_history_deleted\">Історію переглядів видалено</string>\n    <string name=\"clear_search_history_title\">Очистити історію пошуку</string>\n    <string name=\"clear_search_history_summary\">Видаляє історію пошукових запитів</string>\n    <string name=\"delete_search_history_alert\">Видалити всю історію пошуку\\?</string>\n    <string name=\"search_history_deleted\">Історію пошуку видалено</string>\n    <string name=\"one_item_deleted\">Видалено 1 елемент.</string>\n    <string name=\"app_license\">NewPipe є вільним (копілефт) застосунком: ви можете використовувати, поширювати та вдосконалювати його на власний розсуд. Зокрема ви можете розповсюджувати та/або змінювати його за умов дотримання вимог GNU General Public License 3-ї версії або (на ваш вибір) будь-якої пізнішої версії, опублікованої Free Software Foundation.</string>\n    <string name=\"import_settings\">Імпортувати разом з налаштуваннями\\?</string>\n    <string name=\"privacy_policy_title\">Політика приватності NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому застосунок не збирає ніяких даних без вашої згоди.\n\\nПолітика приватності докладно NewPipe пояснює, які дані надсилаються і зберігаються у звіті про збій.</string>\n    <string name=\"read_privacy_policy\">Читати політику приватності</string>\n    <string name=\"start_accept_privacy_policy\">З метою дотримання Загального регламенту про захист даних ЄС (General Data Protection Regulation, GDPR) ми звертаємо вашу увагу на політику приватності NewPipe. Будь ласка, прочитайте уважно.\n\\nВи маєте прийняти її, аби надіслати нам звіт про помилку.</string>\n    <string name=\"accept\">Прийняти</string>\n    <string name=\"decline\">Відхилити</string>\n    <string name=\"limit_data_usage_none_description\">Без обмежень</string>\n    <string name=\"limit_mobile_data_usage_title\">Обмежити роздільність під час мобільних даних</string>\n    <string name=\"skip_silence_checkbox\">Пропускати тихі проміжки</string>\n    <string name=\"playback_step\">Крок</string>\n    <string name=\"playback_reset\">Скинути</string>\n    <string name=\"minimize_on_exit_title\">Зменшити при перемиканні застосунку</string>\n    <string name=\"minimize_on_exit_summary\">Дія при перемиканні до інших застосунків з основного відеопрогравача — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Нічого</string>\n    <string name=\"minimize_on_exit_background_description\">Згорнути у фоновий програвач</string>\n    <string name=\"minimize_on_exit_popup_description\">Зменшити до програвача у вікні</string>\n    <string name=\"channels\">Канали</string>\n    <string name=\"playlists\">Добірки</string>\n    <string name=\"tracks\">Треки</string>\n    <string name=\"users\">Користувачі</string>\n    <string name=\"list_view_mode\">Режим перегляду списком</string>\n    <string name=\"list\">Список</string>\n    <string name=\"grid\">Сiтка</string>\n    <string name=\"unsubscribe\">Відписатися</string>\n    <string name=\"tab_choose\">Обрати вкладку</string>\n    <string name=\"settings_category_updates_title\">Оновлення</string>\n    <string name=\"events\">Події</string>\n    <string name=\"file_deleted\">Файл видалено</string>\n    <string name=\"app_update_notification_channel_name\">Сповіщення про оновлення застосунку</string>\n    <string name=\"app_update_notification_channel_description\">Сповіщення про нові версії NewPipe</string>\n    <string name=\"download_to_sdcard_error_title\">Зовнішнє сховище недоступне</string>\n    <string name=\"restore_defaults\">Відновити типові налаштування</string>\n    <string name=\"restore_defaults_confirmation\">Відновити типові значення\\?</string>\n    <string name=\"subscribers_count_not_available\">Кількість підписників недоступна</string>\n    <string name=\"conferences\">Конференції</string>\n    <string name=\"updates_setting_title\">Оновлення</string>\n    <string name=\"auto\">Автоматично</string>\n    <string name=\"app_update_available_notification_title\">Доступне оновлення NewPipe!</string>\n    <string name=\"missions_header_finished\">Завершено</string>\n    <string name=\"missions_header_pending\">Очікує</string>\n    <string name=\"paused\">призупинено</string>\n    <string name=\"queued\">додано в чергу</string>\n    <string name=\"post_processing\">пост-обробка</string>\n    <string name=\"enqueue\">Додати у чергу</string>\n    <string name=\"permission_denied\">Дію заборонено системою</string>\n    <string name=\"download_failed\">Помилка завантаження</string>\n    <string name=\"generate_unique_name\">Згенерувати унікальну назву</string>\n    <string name=\"overwrite\">Перезаписати</string>\n    <string name=\"overwrite_unrelated_warning\">Файл з такою назвою вже існує</string>\n    <string name=\"overwrite_finished_warning\">Завантажений файл з такою назвою вже існує</string>\n    <string name=\"download_already_running\">Файл з такою назвою вже завантажується</string>\n    <string name=\"show_error\">Показати помилку</string>\n    <string name=\"error_path_creation\">Неможливо створити цільову теку</string>\n    <string name=\"error_file_creation\">Неможливо створити файл</string>\n    <string name=\"error_ssl_exception\">Захищене з\\'єднання не встановлено</string>\n    <string name=\"error_unknown_host\">Сервер не знайдено</string>\n    <string name=\"error_connect_host\">Не вдалося з\\'єднатися із сервером</string>\n    <string name=\"error_http_no_content\">Сервер не надсилає дані</string>\n    <string name=\"error_http_unsupported_range\">Сервер не підтримує завантажень у декілька потоків, спробуйте з параметром @string/msg_threads = 1</string>\n    <string name=\"error_http_not_found\">Не знайдено</string>\n    <string name=\"error_postprocessing_failed\">Невдала пост-обробка</string>\n    <string name=\"stop\">Зупинити</string>\n    <string name=\"max_retry_msg\">Максимум спроб</string>\n    <string name=\"max_retry_desc\">Найбільша кількість спроб перед скасуванням завантаження</string>\n    <string name=\"pause_downloads_on_mobile\">Переривати завантаження на небезлімітних з\\'єднаннях</string>\n    <string name=\"download_to_sdcard_error_message\">Завантаження до зовнішньої SD-карти неможливе. Скинути розташування теки для завантажень\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Помилка зчитування збережених вкладок. Використовуються типові вкладки</string>\n    <string name=\"main_page_content_summary\">Вкладки, показані на головній сторінці</string>\n    <string name=\"updates_setting_description\">Показувати сповіщення з пропозицією оновити застосунок за наявності нової версії</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Корисно під час перемикання на мобільні дані, хоча деякі завантаження неможливо призупинити</string>\n    <string name=\"show_comments_title\">Показувати коментарі</string>\n    <string name=\"show_comments_summary\">Вимкніть, щоб сховати коментарі</string>\n    <string name=\"autoplay_title\">Автовідтворення</string>\n    <string name=\"no_comments\">Коментарі відсутні</string>\n    <string name=\"error_unable_to_load_comments\">Не вдалося завантажити коментарі</string>\n    <string name=\"close\">Закрити</string>\n    <string name=\"watch_history_states_deleted\">Позиції відтворення видалено</string>\n    <string name=\"missing_file\">Файл переміщено або видалено</string>\n    <string name=\"overwrite_failed\">не можу перезаписати файл</string>\n    <string name=\"download_already_pending\">Завантаження з такою назвою вже додано в чергу</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe був закритий під час роботи над файлом</string>\n    <string name=\"error_insufficient_storage_left\">На пристрої не залишилося вільного простору</string>\n    <string name=\"error_progress_lost\">Прогрес втрачено через видалення файлу</string>\n    <string name=\"error_timeout\">Час очікування з\\'єднання вичерпано</string>\n    <string name=\"confirm_prompt\">Очистити історію завантажень чи завантажені файли\\?</string>\n    <string name=\"enable_queue_limit\">Обмежити чергу завантажень</string>\n    <string name=\"enable_queue_limit_desc\">Одночасно виконувати лише одне завантаження</string>\n    <string name=\"start_downloads\">Почати завантаження</string>\n    <string name=\"pause_downloads\">Призупинити завантаження</string>\n    <string name=\"downloads_storage_ask_title\">Запитувати, куди завантажувати</string>\n    <string name=\"downloads_storage_ask_summary\">Вас питатиме, куди зберігати кожне завантаження.\n\\nУвімкніть системний вибір теки (SAF), якщо бажаєте завантажувати на зовнішню SD-картку</string>\n    <string name=\"downloads_storage_use_saf_title\">Використовувати системний вибір теки (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">Фреймворк доступу до сховища (SAF) дозволяє завантажувати на зовнішню SD-картку</string>\n    <string name=\"clear_playback_states_title\">Видалити позиції відтворення</string>\n    <string name=\"clear_playback_states_summary\">Видаляє всі позиції відтворення</string>\n    <string name=\"delete_playback_states_alert\">Видалити всі позиції відтворення\\?</string>\n    <string name=\"drawer_header_description\">Перемкнути службу, наразі обрано:</string>\n    <string name=\"default_kiosk_page_summary\">Типовий кіоск</string>\n    <string name=\"no_one_watching\">Немає переглядів</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s глядач</item>\n        <item quantity=\"few\">%s глядача</item>\n        <item quantity=\"many\">%s глядачів</item>\n    </plurals>\n    <string name=\"no_one_listening\">Ніхто не слухає</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s слухач</item>\n        <item quantity=\"few\">%s слухача</item>\n        <item quantity=\"many\">%s слухачів</item>\n    </plurals>\n    <string name=\"seek_duration_title\">Швидке перемотування</string>\n    <string name=\"peertube_instance_url_title\">Екземпляри PeerTube</string>\n    <string name=\"peertube_instance_url_summary\">Виберіть сервер PeerTube</string>\n    <string name=\"peertube_instance_url_help\">Каталог серверів: %s</string>\n    <string name=\"peertube_instance_add_title\">Додати екземпляр</string>\n    <string name=\"peertube_instance_add_help\">Введіть URL екземпляра</string>\n    <string name=\"peertube_instance_add_https_only\">Підтримуються лише HTTPS-посилання</string>\n    <string name=\"peertube_instance_add_exists\">Екземпляр уже існує</string>\n    <string name=\"recently_added\">Недавно додані</string>\n    <string name=\"most_liked\">Найвподобаніші</string>\n    <string name=\"recovering\">відновлення</string>\n    <string name=\"error_download_resource_gone\">Неможливо відновити це завантаження</string>\n    <string name=\"choose_instance_prompt\">Вибрати екземпляр</string>\n    <string name=\"clear_download_history\">Очистити історію завантажень</string>\n    <string name=\"delete_downloaded_files\">Видалити завантажені файли</string>\n    <string name=\"permission_display_over_apps\">Потрібен дозвіл показувати поверх інших застосунків</string>\n    <string name=\"app_language_title\">Мова</string>\n    <string name=\"systems_language\">Мова телефону</string>\n    <string name=\"subtitle_activity_recaptcha\">Після завершення натисніть «Готово»</string>\n    <string name=\"done\">Готово</string>\n    <string name=\"feed_create_new_group_button_title\">Нова</string>\n    <string name=\"feed_group_dialog_delete_message\">Бажаєте видалити цю групу\\?</string>\n    <string name=\"feed_group_dialog_empty_selection\">Підписки не вибрані</string>\n    <string name=\"feed_groups_header_title\">Групи каналів</string>\n    <plurals name=\"days\">\n        <item quantity=\"one\">%d день</item>\n        <item quantity=\"few\">%d дні</item>\n        <item quantity=\"many\">%d днів</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"one\">%d година</item>\n        <item quantity=\"few\">%d години</item>\n        <item quantity=\"many\">%d годин</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"one\">%d хвилина</item>\n        <item quantity=\"few\">%d хвилини</item>\n        <item quantity=\"many\">%d хвилин</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"one\">%d секунда</item>\n        <item quantity=\"few\">%d секунди</item>\n        <item quantity=\"many\">%d секунд</item>\n    </plurals>\n    <string name=\"mute\">Вимкнути звук</string>\n    <string name=\"unmute\">Увімкнути звук</string>\n    <string name=\"local\">Локальне</string>\n    <string name=\"videos_string\">Відео</string>\n    <string name=\"peertube_instance_add_fail\">Не вдалося перевірити сервер</string>\n    <string name=\"content_not_supported\">NewPipe ще не підтримує цей вміст.\n\\n\n\\nМожливо, підтримка з\\'явиться в наступних версіях.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">Якщо оновлення підписок здається вам занадто повільним, спробуйте увімкнути швидкий режим (змінити можна в налаштуваннях або кнопкою внизу).\n\\n\n\\nNewPipe дозволяє оновлювати підписки різними способами:\n\\n• Отримання каналу цілком, повільно, але з повною інформацією.\n\\n• Оновлення через RSS-канал, швидко, але інформація не повна.\n\\n\n\\nЗа швидкого оновлення втрачається тривалість елемента і його тип (не можна визначити, трансляція це або звичайне відео), а також елементи каналу.\n\\n\n\\nYouTube є прикладом такої служби, яка дозволяє виконувати швидке оновлення по RSS.\n\\n\n\\nВибір за вами: швидкість або точність.</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Звичайний режим</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Швидкий режим</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">Доступно для деяких служб, швидке, але може повертати не весь вміст каналу і часто неповну інформацію (тривалість, тип елемента, статус трансляції)</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Отримувати з виділеної стрічки, коли доступно</string>\n    <string name=\"feed_update_threshold_option_always_update\">Оновлювати постійно</string>\n    <string name=\"feed_update_threshold_summary\">Період актуальності підписок після поновлення — %s</string>\n    <string name=\"feed_update_threshold_title\">Поріг оновлення підписок</string>\n    <string name=\"settings_category_feed_title\">Підписки</string>\n    <string name=\"feed_group_dialog_empty_name\">Порожня назва групи</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"one\">%d вибрано</item>\n        <item quantity=\"few\">%d вибрано</item>\n        <item quantity=\"many\">%d вибрано</item>\n        <item quantity=\"other\">%d вибрано</item>\n    </plurals>\n    <string name=\"feed_group_dialog_select_subscriptions\">Виберіть підписки</string>\n    <string name=\"feed_processing_message\">Обробка каналу…</string>\n    <string name=\"feed_notification_loading\">Завантаження каналу…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Не завантажено: %d</string>\n    <string name=\"feed_oldest_subscription_update\">Останнє оновлення: %s</string>\n    <string name=\"new_seek_duration_toast\">Через обмеження ExoPlayer точність перемотування становить %d секунд</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Так, а також частково переглянуті відео</string>\n    <string name=\"remove_watched_popup_warning\">Потоки, які були переглянуті до та після додавання в добірку, будуть видалені. \\nВи впевнені?</string>\n    <string name=\"remove_watched_popup_title\">Видалити переглянуті потоки?</string>\n    <string name=\"remove_watched\">Видалити переглянуті</string>\n    <string name=\"playlist_no_uploader\">Створено автоматично (автора не знайдено)</string>\n    <string name=\"infinite_videos\">∞ вiдео</string>\n    <string name=\"more_than_100_videos\">100+ вiдео</string>\n    <string name=\"artists\">Виконавці</string>\n    <string name=\"albums\">Альбоми</string>\n    <string name=\"songs\">Пісні</string>\n    <string name=\"restricted_video\">Це відео з віковим обмеженням.\n\\n\n\\nЩоб побачити його ввімкніть «%1$s» в налаштуваннях.</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Ескіз аватара каналу</string>\n    <string name=\"show_original_time_ago_summary\">Оригінальні тексти сервісів будуть видимі в потокових елементах</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Увімкнути \\\"Обмежений режим\\\" YouTube</string>\n    <string name=\"search_showing_result_for\">Результати для: %s</string>\n    <string name=\"channel_created_by\">Створено %s</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Показати лише незгруповані підписки</string>\n    <string name=\"copy_for_github\">Скопіювати відформатований звіт</string>\n    <string name=\"error_report_open_issue_button_text\">Повідомити на GitHub</string>\n    <string name=\"error_report_open_github_notice\">Перевірте, будь ласка, чи проблема що спричинила збій вже відома спільноті та розробникам. Дублюючи запити на вирішення помилок ви забираєте час розробників, який можна було б витратити на розв\\'язання наявних проблем.</string>\n    <string name=\"select_a_playlist\">Вибрати добірку</string>\n    <string name=\"no_playlist_bookmarked_yet\">Жодну добірку ще не додано</string>\n    <string name=\"playlist_page_summary\">Сторінка добірки</string>\n    <string name=\"notification_action_nothing\">Нічого</string>\n    <string name=\"notification_action_buffering\">Буферизація</string>\n    <string name=\"notification_action_shuffle\">Перемішати</string>\n    <string name=\"notification_action_repeat\">Повтор</string>\n    <string name=\"notification_action_4_title\">Кнопка пʼятої дії</string>\n    <string name=\"notification_action_3_title\">Кнопка четвертої дії</string>\n    <string name=\"notification_action_2_title\">Кнопка третьої дії</string>\n    <string name=\"notification_action_1_title\">Кнопка другої дії</string>\n    <string name=\"notification_action_0_title\">Кнопка першої дії</string>\n    <string name=\"notification_scale_to_square_image_title\">Обрізати ескіз до пропорцій 1:1</string>\n    <string name=\"open_with\">Відкрити через</string>\n    <string name=\"download_has_started\">Завантаження почалося</string>\n    <string name=\"night_theme_summary\">Виберіть нічну тему — %s</string>\n    <string name=\"auto_device_theme_title\">Автоматична (тема пристрою)</string>\n    <string name=\"radio\">Радіо</string>\n    <string name=\"georestricted_content\">Цей вміст недоступний у вашій країні.</string>\n    <string name=\"no_app_to_open_intent\">На вашому пристрої нема програми, щоб відкрити це</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube надає «Обмежений режим», що ховає потенційно дорослий вміст</string>\n    <string name=\"chapters\">Розділи</string>\n    <string name=\"recent\">Останні</string>\n    <string name=\"show_thumbnail_title\">Показувати ескіз</string>\n    <string name=\"never\">Ніколи</string>\n    <string name=\"wifi_only\">Лише через Wi-Fi</string>\n    <string name=\"autoplay_summary\">Починати відтворення автоматично — %s</string>\n    <string name=\"show_memory_leaks\">Показувати витоки памʼяті</string>\n    <string name=\"show_channel_details\">Показати деталі каналу</string>\n    <string name=\"title_activity_play_queue\">Відтворити чергу</string>\n    <string name=\"description_tab_description\">Опис</string>\n    <string name=\"related_items_tab_description\">Повʼязані елементи</string>\n    <string name=\"comments_tab_description\">Коментарі</string>\n    <string name=\"settings_category_player_notification_summary\">Налаштувати повідомлення про відтворюваний наразі потік</string>\n    <string name=\"unsupported_url_dialog_message\">Не розпізнано URL. Відкрити через інший застосунок\\?</string>\n    <string name=\"auto_queue_toggle\">Автоматична черга</string>\n    <string name=\"show_meta_info_title\">Показувати метадані</string>\n    <string name=\"show_description_title\">Показувати описи</string>\n    <string name=\"night_theme_title\">Нічна тема</string>\n    <string name=\"video_detail_by\">Від %s</string>\n    <string name=\"show_thumbnail_summary\">Використовувати ескізи для фону екрана блокування і для сповіщень</string>\n    <string name=\"soundcloud_go_plus_content\">Це доріжка для SoundCloud Go+, принаймні у вашій країні, тому її не можна передавати потоково або завантажувати через NewPipe.</string>\n    <string name=\"private_content\">Цей вміст є приватним, тому його не можна передавати потоково або завантажувати через NewPipe.</string>\n    <string name=\"youtube_music_premium_content\">Це відео доступне лише для користувачів YouTube Music Premium, тому його не можна передавати потоково або завантажувати через NewPipe.</string>\n    <string name=\"paid_content\">Цей вміст доступний лише користувачам, які заплатили, тому його не можна передавати потоково або завантажувати через NewPipe.</string>\n    <string name=\"select_night_theme_toast\">Ви можете вибрати нічну тему нижче</string>\n    <string name=\"featured\">Рекомендовані</string>\n    <string name=\"crash_the_app\">Збій застосунку</string>\n    <string name=\"show_original_time_ago_title\">Початковий час оприлюднення</string>\n    <string name=\"enqueued\">Додано у чергу</string>\n    <string name=\"enqueue_stream\">Додати у чергу</string>\n    <string name=\"recaptcha_solve\">Розв\\'язати</string>\n    <string name=\"msg_calculating_hash\">Обчислення хешу</string>\n    <string name=\"clear_cookie_summary\">Очистити збережені під час вирішення reCAPTCHA реп\\'яшки (cookies)</string>\n    <string name=\"recaptcha_cookies_cleared\">Реп\\'яшки (cookies) reCAPTCHA видалено</string>\n    <string name=\"clear_cookie_title\">Очистити реп\\'яшки (cookies) reCAPTCHA</string>\n    <string name=\"hash_channel_description\">Сповіщення про перебіг відеогешування</string>\n    <string name=\"hash_channel_name\">Сповіщення про відеохешування</string>\n    <string name=\"restricted_video_no_stream\">Це відео має вікові обмеження.\n\\nЗгідно з новою політикою YouTube щодо відео з віковими обмеженнями NewPipe не може мати доступ до жодного потоку цього відео і, таким чином, не має можливості відтворити його.</string>\n    <string name=\"show_age_restricted_content_summary\">Показувати вміст, який, можливо, не підходить для дітей, бо має вікове обмеження (наприклад, 18+)</string>\n    <string name=\"show_meta_info_summary\">Вимкніть, щоб приховати поля метаданих (автор потоку, вміст потоку або пошуковий запит)</string>\n    <string name=\"show_description_summary\">Вимкніть, щоб приховати опис відео та додаткові відомості</string>\n    <string name=\"clear_queue_confirmation_description\">Черга активного програвача буде замінена</string>\n    <string name=\"clear_queue_confirmation_summary\">Перехід від одного програвача до іншого може замінити вашу чергу</string>\n    <string name=\"clear_queue_confirmation_title\">Підтверджувати очищення черги</string>\n    <string name=\"notification_colorize_summary\">Кольорувати повідомлення основним кольором мініатюри. Підтримується не всіма пристроями</string>\n    <string name=\"notification_colorize_title\">Кольорове сповіщення</string>\n    <string name=\"notification_actions_at_most_three\">У компактному сповіщенні є не більше трьох дій!</string>\n    <string name=\"notification_actions_summary\">Відредагуйте кожну дію сповіщення, натиснувши на неї. Виберіть до трьох з них, які будуть показані в компактному сповіщенні, за допомогою прапорців праворуч.</string>\n    <string name=\"notification_scale_to_square_image_summary\">Обрізати мініатюру відео показувану в сповіщенні з пропорцій 16: 9 до 1:1</string>\n    <string name=\"disable_media_tunneling_summary\">Вимкнення тунелювання медіаданих за наявності чорного екрана або гальмування під час відтворення відео.</string>\n    <string name=\"disable_media_tunneling_title\">Вимкнути тунелювання медіа</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Починаючи з Android 10, підтримується тільки \\\"Storage Access Framework\\\"</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Вас питатиме, куди зберігати кожне завантаження</string>\n    <string name=\"no_dir_yet\">Не вказано теки завантаження, оберіть типову теку завантаження зараз</string>\n    <string name=\"open_website_license\">Відкрити вебсайт</string>\n    <string name=\"metadata_privacy_internal\">Внутрішнє</string>\n    <string name=\"metadata_privacy_public\">Публічне</string>\n    <string name=\"metadata_privacy_private\">Приватне</string>\n    <string name=\"metadata_privacy_unlisted\">Поза списком</string>\n    <string name=\"metadata_host\">Власник</string>\n    <string name=\"metadata_support\">Підтримка</string>\n    <string name=\"metadata_language\">Мова</string>\n    <string name=\"metadata_age_limit\">Вікове обмеження</string>\n    <string name=\"metadata_privacy\">Приватність</string>\n    <string name=\"metadata_licence\">Ліцензія</string>\n    <string name=\"metadata_tags\">Мітки</string>\n    <string name=\"metadata_category\">Категорія</string>\n    <string name=\"description_select_disable\">Заборонити виділення тексту в описі</string>\n    <string name=\"description_select_enable\">Дозволити виділяти текст в описі</string>\n    <string name=\"description_select_note\">Тепер можна виділяти текст в описі. Зауважте, що сторінка може мигати і посилання можуть не працювати в режимі виділення.</string>\n    <string name=\"feed_load_error_account_info\">Неможливо завантажити стрічку для «%s».</string>\n    <string name=\"feed_load_error\">Помилка завантаження стрічки</string>\n    <string name=\"feed_load_error_terminated\">Обліковий запис автора припинено.\n\\nNewPipe не зможе завантажити цей канал у майбутньому.\n\\nВідписатися від цього каналу\\?</string>\n    <string name=\"off\">Вимкнути</string>\n    <string name=\"on\">Увімкнути</string>\n    <string name=\"tablet_mode_title\">Режим планшета</string>\n    <string name=\"account_terminated\">Обліковий запис припинено</string>\n    <string name=\"feed_load_error_fast_unknown\">Режим швидкої підписки не надає багато інформації щодо цього.</string>\n    <string name=\"comments_are_disabled\">Коментарі вимкнено</string>\n    <string name=\"dont_show\">Не показувати</string>\n    <string name=\"low_quality_smaller\">Низька якість (менше)</string>\n    <string name=\"high_quality_larger\">Висока якість (більше)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Мініатюра з попереднім переглядом на повзунку поступу</string>\n    <string name=\"detail_heart_img_view_description\">Вподобано автором</string>\n    <string name=\"mark_as_watched\">Позначити переглянутим</string>\n    <string name=\"remote_search_suggestions\">Віддалені пропозиції пошуку</string>\n    <string name=\"local_search_suggestions\">Локальні пошукові пропозиції</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"one\">Видалено %1$s завантаження</item>\n        <item quantity=\"few\">Видалено %1$s завантаження</item>\n        <item quantity=\"many\">Видалено %1$s завантажень</item>\n        <item quantity=\"other\">Видалено %1$s завантажень</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"one\">%s завантаження завершено</item>\n        <item quantity=\"few\">%s завантаження завершено</item>\n        <item quantity=\"many\">%s завантажень завершено</item>\n        <item quantity=\"other\">%s завантажень завершено</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Проведіть пальцем по елементах, щоб вилучити їх</string>\n    <string name=\"start_main_player_fullscreen_summary\">Не запускати відео в мініпрогравачі, а перемикати в повноекранний режим безпосередньо, якщо автообертання заблоковано. Ви все одно можете отримати доступ до мініпрогравача, вийшовши з повноекранного режиму</string>\n    <string name=\"start_main_player_fullscreen_title\">Запустити основний програвач у повноекранному режимі</string>\n    <string name=\"enqueued_next\">Заплановано наступним</string>\n    <string name=\"enqueue_next_stream\">Запланувати наступним</string>\n    <string name=\"processing_may_take_a_moment\">Обробка… Трохи заждіть</string>\n    <string name=\"check_for_updates\">Перевірити наявність оновлень</string>\n    <string name=\"manual_update_description\">Перевірка нових версій вручну</string>\n    <string name=\"checking_updates_toast\">Перевірка оновлень…</string>\n    <string name=\"feed_new_items\">Нові записи стрічки</string>\n    <string name=\"show_crash_the_player_title\">Показати \\\"Збій програвача\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Показує параметр збою під час використання програвача</string>\n    <string name=\"crash_the_player\">Збій програвача</string>\n    <string name=\"error_report_channel_name\">Сповіщення про звіт про помилку</string>\n    <string name=\"error_report_channel_description\">Сповіщення для звітів про помилки</string>\n    <string name=\"error_report_notification_title\">Сталася помилка NewPipe, торкніться, щоб звітувати</string>\n    <string name=\"error_report_notification_toast\">Сталася помилка. Перегляньте сповіщення</string>\n    <string name=\"no_appropriate_file_manager_message\">Для цієї дії не знайдено відповідного файлового менеджера.\n\\nУстановіть файловий менеджер або спробуйте вимкнути «%s» у налаштуваннях завантажень</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">Для цієї дії не знайдено відповідного файлового менеджера.\n\\nУстановіть файловий менеджер, сумісний зі Storage Access Framework</string>\n    <string name=\"show_error_snackbar\">Показати панель помилок</string>\n    <string name=\"create_error_notification\">Створити сповіщення про помилку</string>\n    <string name=\"detail_pinned_comment_view_description\">Закріплений коментар</string>\n    <string name=\"leak_canary_not_available\">LeakCanary недоступний</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Типовий ExoPlayer</string>\n    <string name=\"you_successfully_subscribed\">Ви підписалися на цей канал</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"streams_notification_channel_description\">Сповіщення про нові трансляції для підписок</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s нова трансляція</item>\n        <item quantity=\"few\">%s нові трансляції</item>\n        <item quantity=\"many\">%s нових трансляцій</item>\n        <item quantity=\"other\">%s нових трансляцій</item>\n    </plurals>\n    <string name=\"loading_stream_details\">Завантаження відомостей про трансляцію…</string>\n    <string name=\"check_new_streams\">Запустити виявлення нових трансляцій</string>\n    <string name=\"enable_streams_notifications_summary\">Сповіщати про нові трансляції з підписок</string>\n    <string name=\"notifications_disabled\">Сповіщення вимкнено</string>\n    <string name=\"any_network\">Будь-яка мережа</string>\n    <string name=\"delete_downloaded_files_confirm\">Видалити всі завантажені файли з диска\\?</string>\n    <string name=\"toggle_all\">Перемкнути всі</string>\n    <string name=\"get_notified\">Сповіщати</string>\n    <string name=\"settings_category_player_notification_title\">Сповіщення програвача</string>\n    <string name=\"notifications\">Сповіщення</string>\n    <string name=\"streams_notification_channel_name\">Нові трансляції</string>\n    <string name=\"enable_streams_notifications_title\">Сповіщення про нові трансляції</string>\n    <string name=\"streams_notifications_interval_title\">Частота перевірки</string>\n    <string name=\"streams_notifications_network_title\">Необхідний тип з\\'єднання</string>\n    <string name=\"percent\">Відсоток</string>\n    <string name=\"semitone\">Напівтон</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Немає аудіотрансляцій доступних для зовнішніх програвачів</string>\n    <string name=\"no_video_streams_available_for_external_players\">Немає доступних відеотрансляцій для зовнішніх програвачів</string>\n    <string name=\"unknown_format\">Невідомий формат</string>\n    <string name=\"streams_not_yet_supported_removed\">Трансляції, які ще не підтримуються завантажувачем, не показані</string>\n    <string name=\"selected_stream_external_player_not_supported\">Вибрана трансляція не підтримується зовнішніми програвачами</string>\n    <string name=\"select_quality_external_players\">Виберіть якість для зовнішніх програвачів</string>\n    <string name=\"unknown_quality\">Невідома якість</string>\n    <string name=\"progressive_load_interval_title\">Розмір інтервалу завантаження відтворення</string>\n    <string name=\"faq\">Переглянути на сайті</string>\n    <string name=\"faq_title\">Поширені запитання</string>\n    <string name=\"faq_description\">Якщо у вас виникли проблеми з використанням застосунку, обов\\'язково ознайомтеся з відповідями на поширені запитання!</string>\n    <string name=\"sort\">Сортувати</string>\n    <string name=\"app_update_unavailable_toast\">Ви використовуєте найновішу версію NewPipe</string>\n    <string name=\"app_update_available_notification_text\">Торкніться, щоб завантажити %s</string>\n    <string name=\"import_subscriptions_hint\">Імпорт або експорт підписок з 3-крапкового меню</string>\n    <string name=\"fast_mode\">Швидкий режим</string>\n    <string name=\"night_theme_available\">Ця опція доступна, лише якщо темою обрано %s</string>\n    <string name=\"unset_playlist_thumbnail\">Прибрати постійну мініатюру</string>\n    <string name=\"card\">Картки</string>\n    <string name=\"msg_failed_to_copy\">Не вдалося скопіювати до буфера обміну</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Дублікат додано %d раз(ів)</string>\n    <string name=\"duplicate_in_playlist\">У виділених сірим кольором добірках цей елемент уже є.</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Ігнорувати події апаратних медіакнопок</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">Корисно, наприклад, якщо ви використовуєте гарнітуру зі зламаними фізичними кнопками</string>\n    <string name=\"remove_duplicates\">Вилучити дублікати</string>\n    <string name=\"remove_duplicates_title\">Вилучити дублікати\\?</string>\n    <string name=\"remove_duplicates_message\">Бажаєте вилучити всі повторювані трансляції в цій добірці\\?</string>\n    <string name=\"feed_show_hide_streams\">Показати/сховати трансляції</string>\n    <string name=\"feed_show_upcoming\">Незабаром</string>\n    <string name=\"feed_hide_streams_title\">Показати такі трансляції</string>\n    <string name=\"feed_show_watched\">Повністю переглянуто</string>\n    <string name=\"feed_show_partially_watched\">Частково переглянуто</string>\n    <string name=\"brightness\">Яскравість</string>\n    <string name=\"none\">Нічого</string>\n    <string name=\"left_gesture_control_title\">Дія жестом ліворуч</string>\n    <string name=\"left_gesture_control_summary\">Виберіть жест для лівої половини екрана програвача</string>\n    <string name=\"right_gesture_control_summary\">Виберіть жест для правої половини екрана програвача</string>\n    <string name=\"right_gesture_control_title\">Дія жесту праворуч</string>\n    <string name=\"volume\">Гучність</string>\n    <string name=\"progressive_load_interval_summary\">Змінити розмір інтервалу завантаження прогресивного вмісту (наразі %s). Нижче значення може прискорити його початкове завантаження</string>\n    <string name=\"prefer_original_audio_title\">Надавати перевагу оригінальному аудіо</string>\n    <string name=\"prefer_original_audio_summary\">Вибирати оригінальну звукову доріжку незалежно від мови</string>\n    <string name=\"prefer_descriptive_audio_title\">Надавати перевагу описовому аудіо</string>\n    <string name=\"prefer_descriptive_audio_summary\">Вибирати звукову доріжку з описом для людей із вадами зору, якщо вона є</string>\n    <string name=\"play_queue_audio_track\">Аудіо: %s</string>\n    <string name=\"audio_track\">Звукова доріжка</string>\n    <string name=\"select_audio_track_external_players\">Вибір звукової доріжки для зовнішніх програвачів</string>\n    <string name=\"unknown_audio_track\">Невідомо</string>\n    <string name=\"settings_category_exoplayer_title\">Налаштування ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">Керування деякими налаштуваннями ExoPlayer. Щоб ці зміни набули чинності, потрібно перезапустити програвач</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Використовувати запасну функцію декодера ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Завжди використовувати обхідний шлях налаштування поверхні відеовиходу ExoPlayer</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"audio_track_type_original\">оригінальна</string>\n    <string name=\"audio_track_type_dubbed\">дубльована</string>\n    <string name=\"audio_track_type_descriptive\">описова</string>\n    <string name=\"audio_track_present_in_video\">У цій трансляції вже має бути звукова доріжка</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">Увімкніть цю опцію, якщо у вас є проблеми з ініціалізацією декодерів, які повертаються до декодерів нижчого пріоритету, якщо не вдається ініціалізувати первинні декодери. Це може призвести до погіршення якості відтворення порівняно з використанням первинних декодерів</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">Цей обхідний шлях вивільняє і повторно встановлює відеокодеки, коли відбувається зміна поверхні, замість того, щоб налаштовувати поверхню на кодек безпосередньо. Це налаштування вже використовується ExoPlayer на деяких пристроях з цією проблемою, але воно працює лише на Android 6 і новіших версіях\n\\n\n\\nУвімкнення цієї опції може запобігти помилкам відтворення під час перемикання поточного відеопрогравача або переходу до повноекранного режиму</string>\n    <string name=\"main_tabs_position_summary\">Перемістити селектор головної вкладки вниз</string>\n    <string name=\"main_tabs_position_title\">Розташування основних вкладок</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Тунелювання медіа типово було вимкнено на вашому пристрої, оскільки ваша модель його не підтримує.</string>\n    <string name=\"no_streams\">Немає трансляцій</string>\n    <string name=\"no_live_streams\">Немає трансляцій наживо</string>\n    <string name=\"channel_tab_videos\">Відео</string>\n    <string name=\"metadata_subscribers\">Підписники</string>\n    <string name=\"show_channel_tabs_summary\">Які вкладки показуються на сторінках каналів</string>\n    <string name=\"show_channel_tabs\">Вкладки каналу</string>\n    <string name=\"channel_tab_shorts\">Shorts</string>\n    <string name=\"loading_metadata_title\">Завантаження метаданих…</string>\n    <string name=\"feed_fetch_channel_tabs\">Отримання вкладок каналу</string>\n    <string name=\"channel_tab_about\">Про канал</string>\n    <string name=\"channel_tab_albums\">Альбоми</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">Отримувані вкладки під час оновлення стрічки. Ця опція не застосовується, якщо канал оновлюється за допомогою швидкого режиму.</string>\n    <string name=\"channel_tab_playlists\">Добірки</string>\n    <string name=\"channel_tab_tracks\">Треки</string>\n    <string name=\"channel_tab_channels\">Канали</string>\n    <string name=\"channel_tab_livestreams\">Наживо</string>\n    <string name=\"toggle_screen_orientation\">Змінити орієнтацію екрана</string>\n    <string name=\"toggle_fullscreen\">Перемкнути повноекранний режим</string>\n    <string name=\"next_stream\">Наступний стрим</string>\n    <string name=\"open_play_queue\">Відкрити чергу відтворення</string>\n    <string name=\"forward\">Перемотати вперед</string>\n    <string name=\"rewind\">Відмотати назад</string>\n    <string name=\"replay\">Повторити</string>\n    <string name=\"play\">Відтворити</string>\n    <string name=\"more_options\">Інші опції</string>\n    <string name=\"duration\">Тривалість</string>\n    <string name=\"previous_stream\">Попередній стрим</string>\n    <string name=\"image_quality_title\">Якість зображення</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"image_quality_low\">Низька якість</string>\n    <string name=\"metadata_avatars\">Аватари</string>\n    <string name=\"metadata_subchannel_avatars\">Аватари підканалів</string>\n    <string name=\"image_quality_none\">Не завантажувати зображення</string>\n    <string name=\"image_quality_high\">Висока якість</string>\n    <string name=\"image_quality_medium\">Середня якість</string>\n    <string name=\"metadata_uploader_avatars\">Вивантажувач аватарів</string>\n    <string name=\"metadata_banners\">Банери</string>\n    <string name=\"image_quality_summary\">Виберіть якість зображень і чи завантажувати зображення взагалі, щоб знизити використання даних і пам\\'яті. Зміни очищують кеш зображень як у пам\\'яті, так і на диску — %s</string>\n    <string name=\"metadata_thumbnails\">Мініатюри</string>\n    <string name=\"share_playlist_with_list\">Поділитися списком URL-адрес</string>\n    <string name=\"share_playlist_with_titles\">Поділитися з назвами</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">Поділитися добіркою</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"show_more\">Показати більше</string>\n    <string name=\"notification_actions_summary_android13\">Відредагуйте кожну дію сповіщення, натиснувши на неї. Перші три дії (відтворення/пауза, попередній і наступний) встановлюються системою і не можуть бути змінені.</string>\n    <plurals name=\"replies\">\n        <item quantity=\"one\">%s відповідь</item>\n        <item quantity=\"few\">%s відповіді</item>\n        <item quantity=\"many\">%s відповідей</item>\n        <item quantity=\"other\">%s відповідей</item>\n    </plurals>\n    <string name=\"show_less\">Показати менше</string>\n    <string name=\"error_insufficient_storage\">Недостатньо вільного простору на пристрої</string>\n    <string name=\"reset_settings_title\">Скинути налаштування</string>\n    <string name=\"settings_category_backup_restore_title\">Резервне копіювання і відновлення</string>\n    <string name=\"auto_update_check_description\">NewPipe може час від часу автоматично перевіряти наявність нових версій і сповіщати вас про їх появу.\n\\nХочете увімкнути цю функцію?</string>\n    <string name=\"yes\">Так</string>\n    <string name=\"no\">Ні</string>\n    <string name=\"reset_settings_summary\">Скинути всі налаштування до усталених значень</string>\n    <string name=\"reset_all_settings\">Скидання всіх налаштувань призведе до скидання всіх вибраних вами налаштувань і перезапуску застосунку.\n\\n\n\\nВи впевнені, що хочете продовжити?</string>\n    <string name=\"import_settings_vulnerable_format\">Параметри експорту, який імпортується, використовують вразливий формат, який не підтримується з NewPipe 0.27.0. Переконайтеся, що експорт, який імпортується, походить із надійного джерела, і в майбутньому віддайте перевагу використанню лише експорту, отриманого з NewPipe 0.27.0 або новішої версії. Підтримку імпорту налаштувань у цьому вразливому форматі незабаром буде повністю припинено, і тоді старі версії NewPipe більше не зможуть імпортувати налаштування експорту з нових версій.</string>\n    <string name=\"audio_track_type_secondary\">вторинний</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Поділитися як тимчасовим списком відтворення YouTube</string>\n    <string name=\"tab_bookmarks_short\">Списки відтворення</string>\n    <string name=\"feed_group_page_summary\">Сторінка групи каналів</string>\n    <string name=\"select_a_feed_group\">Виберіть групу каналів</string>\n    <string name=\"no_feed_group_created_yet\">Групу каналів ще не створено</string>\n    <string name=\"channel_tab_likes\">Вподобання</string>\n    <string name=\"search_with_service_name\">Пошук %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Пошук %1$s (%2$s)</string>\n    <string name=\"migration_info_6_7_title\">Сторінку SoundCloud Top 50 видалено</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud припинив підтримку оригінальних чартів Топ-50. Відповідну вкладку видалено з вашої головної сторінки.</string>\n    <string name=\"migration_info_7_8_title\">Видалено об’єднаний тренд YouTube</string>\n    <string name=\"migration_info_7_8_message\">YouTube припинив підтримку об’єднаної сторінки трендів з 21 липня 2025 року. NewPipe замінив стандартну сторінку трендів на сторінку трендових прямих трансляцій.\\n\\nВи також можете вибрати різні сторінки трендів у розділі «Налаштування» &gt; «Контент» &gt; «Контент головної сторінки».</string>\n    <string name=\"trending_gaming\">Ігрові тренди</string>\n    <string name=\"trending_podcasts\">Популярні подкасти</string>\n    <string name=\"trending_movies\">Популярні фільми та шоу</string>\n    <string name=\"trending_music\">Популярна музика</string>\n    <string name=\"short_thousand\">%sтис</string>\n    <string name=\"short_million\">%sмлн</string>\n    <string name=\"short_billion\">%sмлрд</string>\n    <string name=\"permission_display_over_apps_message\">Щоб використовувати спливаючий програвач, виберіть %1$s у наступному меню налаштувань Android та увімкніть %2$s.</string>\n    <string name=\"permission_display_over_apps_permission_name\">“Дозволити показ поверх інших програм”</string>\n    <string name=\"delete_file\">Видалити файл</string>\n    <string name=\"delete_entry\">Видалити запис</string>\n    <string name=\"entry_deleted\">Запис видалено</string>\n    <string name=\"account_terminated_service_provides_reason\">Обліковий запис заблоковано\\n\\n%1$s вказує таку причину: %2$s</string>\n    <string name=\"player_http_403\">Під час відтворення від сервера отримано помилку HTTP 403, ймовірно, через закінчення терміну дії URL-адреси потокової передачі або заборону IP-адреси</string>\n    <string name=\"player_http_invalid_status\">Помилка HTTP %1$s отримана від сервера під час відтворення</string>\n    <string name=\"youtube_player_http_403\">Під час відтворення від сервера отримано помилку HTTP 403, ймовірно, через заборону IP-адреси або проблеми з деобфускацією URL-адреси потокової передачі</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s відмовився надати дані, запитуючи логін для підтвердження того, що запитувач не є ботом.\\n\\nВаша IP-адреса могла бути тимчасово заблокована %1$s. Ви можете почекати деякий час або перейти на іншу IP-адресу (наприклад, увімкнувши/вимкнувши VPN або переключившись з Wi-Fi на мобільні дані).</string>\n    <string name=\"unsupported_content_in_country\">Цей контент недоступний для вибраної країни контенту.\\n\\nЗмініть свій вибір у розділі \\\"Налаштування &gt; Контент &gt; Країна контенту за замовчуванням\\\".</string>\n    <string name=\"kao_dialog_warning\">У серпні 2025 року, Google анонсувала, що з вересня 2026 року, для встановлення застосунків буде потрібна верифікація розробника для всіх Android застосунків на сертифікованих пристроях, включаючи ті, що були встановлені не через Play Store. Оскільки розробники NewPipe не згодні з цією вимогою, NewPipe перестане працювати на сертифікованих Android пристроях після цієї дати.</string>\n    <string name=\"kao_dialog_more_info\">Детальніше</string>\n    <string name=\"kao_solution\">Вирішення</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-und/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">شروع کرن لئی وڈدرشی کچ نوں دباؤ۔</string>\n    <string name=\"install\">اینسٹال کرو</string>\n    <string name=\"ok\">ٹھیک اے</string>\n    <string name=\"share\">سانجھا کرو</string>\n    <string name=\"download\">ڈاؤن‌لوڈ کرو</string>\n    <string name=\"search\">کھوجو</string>\n    <string name=\"settings\">سیٹنگاں</string>\n    <string name=\"no_player_found\">کوئی سٹریم پلیئر نہیں لبھیا۔ تسیں وی‌ایل‌سی اینسٹال کرنا چاہوگے؟</string>\n    <string name=\"open_in_browser\">براؤزر وچ کھُلھو</string>\n    <string name=\"share_dialog_title\">ایس نال سانجھا کرو</string>\n    <string name=\"use_external_video_player_title\">باہری ویڈیو پکیئر ورتیو</string>\n    <string name=\"use_external_video_player_summary\">کجھ ریزولوشناں تے آواز نوں ہٹا دِندے</string>\n    <string name=\"no_player_found_toast\">کجھ سٹریم پلیئر نہیں لبھے اے (تسیں وی‌ایل‌سی اینسٹال کرکے ایسنوں چلا سکدے او)۔</string>\n    <string name=\"did_you_mean\">کیہ تہاڈے مطلب سی ”%1$s“؟</string>\n    <string name=\"show_info\">جاݨکاری ویکھاؤ</string>\n    <string name=\"use_external_audio_player_title\">باہری آڈیو پلیئر ورتو</string>\n    <string name=\"controls_popup_title\">تیردی تصویر</string>\n    <string name=\"notification_action_repeat\">دُہراؤ</string>\n    <string name=\"tab_choose\">ٹیب چݨو</string>\n    <string name=\"controls_add_to_playlist_title\">ایس وچ جوڑو</string>\n    <string name=\"download_path_title\">ویڈیو ڈاؤن‌لوڈ دا فولڈر</string>\n    <string name=\"show_higher_resolutions_summary\">صرف کجھ ہی ڈِوائیس «2k/4k» ویڈیو نوں چلا سکدے ہن</string>\n    <string name=\"play_with_kodi_title\">کوڈی نال چلاؤ</string>\n    <string name=\"kore_not_found\">کورے اَیپ اینسٹال نہیں اے؟</string>\n    <string name=\"show_play_with_kodi_title\">”کوڈی نال چلاؤ“ چݨ دِکھاؤ</string>\n    <string name=\"show_play_with_kodi_summary\">کوڈی میڈیا کیندر نہیں ویڈیو چلاؤݨ دی چݨ وِکھاؤ</string>\n    <string name=\"crash_the_player\">ویڈیو پلیئر کریش کرو</string>\n    <string name=\"notification_action_0_title\">پہلا کاروائی بٹن</string>\n    <string name=\"notification_action_1_title\">دوجا کاروائی بٹن</string>\n    <string name=\"notification_action_2_title\">تیجا کاردائی بٹن</string>\n    <string name=\"notification_action_3_title\">چوتھا کاروائی بٹن</string>\n    <string name=\"notification_action_4_title\">پنجواں کاروائی بٹن</string>\n    <string name=\"notification_actions_at_most_three\">تسیں ودھ توں ودھ تِن کاروائیاں نوں پچیڑیاں اِطلاعاں وچ وِکھاؤݨ لئی چݨ سکدے او!</string>\n    <string name=\"notification_action_shuffle\">پھینٹݨا</string>\n    <string name=\"light_theme_title\">روشنی</string>\n    <string name=\"dark_theme_title\">گوڑی</string>\n    <string name=\"black_theme_title\">کالا</string>\n    <string name=\"night_theme_title\">رات والی تھیم</string>\n    <string name=\"notification_colorize_title\">رنگدار نوٹ</string>\n    <string name=\"notification_colorize_summary\">اینڈروئیڈ نوں تھمنیل دے رکھ مطابق نوٹ دا رنگ بدلݨ دیو (دھیان دیو کہ ایہہ ہریک ڈِوائیس تے اًپلبدھ نہیں اے)</string>\n    <string name=\"default_audio_format_title\">آڈیو فارمیٹ دا مول</string>\n    <string name=\"default_video_format_title\">وہڈیو فارمیٹ دا مول</string>\n    <string name=\"seek_duration_title\">اگے لنگھاؤݨ یا پچھے کرن دی سماں معد</string>\n    <string name=\"settings_category_player_behavior_title\">ووہار</string>\n    <string name=\"settings_category_appearance_title\">دِکھ</string>\n    <string name=\"settings_category_debug_title\">ڈِیبَگ</string>\n    <string name=\"downloads\">ڈاؤن‌لوڈ</string>\n    <string name=\"downloads_title\">ڈاؤن‌لوڈ</string>\n    <string name=\"all\">سارے</string>\n    <string name=\"channels\">چینلاں</string>\n    <string name=\"playlists\">پلےلِسٹاں</string>\n    <string name=\"videos_string\">ویڈیو</string>\n    <string name=\"tracks\">ٹریک</string>\n    <string name=\"songs\">گیت</string>\n    <string name=\"albums\">البم</string>\n    <string name=\"disabled\">بند کیتا</string>\n    <string name=\"clear\">مٹاؤ</string>\n    <string name=\"always\">ہمیشہ</string>\n    <string name=\"notifications\">نوٹ</string>\n    <string name=\"unknown_content\">[نامعلوم]</string>\n    <string name=\"general_error\">خرابی</string>\n    <string name=\"audio_streams_empty\">کوئی وی آڈیو سٹریماں نہیں ملیاں</string>\n    <string name=\"error_snackbar_action\">رپورٹ کرو</string>\n    <string name=\"error_details_headline\">ویروے:</string>\n    <string name=\"detail_likes_img_view_description\">پسند</string>\n    <string name=\"detail_dislikes_img_view_description\">ناپسند</string>\n    <string name=\"comments_tab_description\">ٹپݨیاں</string>\n    <string name=\"video\">ویڈیو</string>\n    <string name=\"audio\">آڈیو</string>\n    <string name=\"retry\">فیر کرو</string>\n    <string name=\"create\">بݨاؤ</string>\n    <string name=\"tab_about\">بارے</string>\n    <string name=\"tab_licenses\">لائیسنس</string>\n    <string name=\"action_history\">اتیت</string>\n    <string name=\"add_to_playlist\">پلےلِسٹ وچ پایو</string>\n    <string name=\"always_ask_open_action\">ہمیشا پچھو</string>\n    <string name=\"accept\">سویکار کرو</string>\n    <string name=\"app_language_title\">اَیپ دی بولی</string>\n    <string name=\"cancel\">رد کرو</string>\n    <string name=\"notification_action_nothing\">کجھ وی نہیں</string>\n    <string name=\"download_dialog_title\">ڈاؤن‌لوڈ</string>\n    <string name=\"autoplay_title\">آٹوپلے</string>\n    <string name=\"settings_category_player_title\">پلیئر</string>\n    <string name=\"controls_background_title\">پچھوکڑ</string>\n    <string name=\"play_audio\">آڈیو</string>\n    <string name=\"notification_action_buffering\">بفر کردے</string>\n    <string name=\"settings_category_downloads_title\">ڈاؤن‌لوڈ</string>\n    <string name=\"app_license_title\">لائیسنس</string>\n    <string name=\"theme_title\">تھیم</string>\n    <string name=\"description_tab_description\">تفصیل</string>\n    <string name=\"pause\">روکو</string>\n    <string name=\"delete\">مٹاؤ</string>\n    <string name=\"account_terminated\">کھاتہ بند کیتا گیا</string>\n    <string name=\"auto\">آٹو</string>\n    <string name=\"upload_date_text\">%1$s نوں جاری کیتی گئی</string>\n    <string name=\"open_with\">ایس وچ کھُلھو</string>\n    <string name=\"open_in_popup_mode\">تیردی تصویر وچ کھُلھو</string>\n    <string name=\"controls_download_desc\">سٹریم دی فائل ڈاؤن‌لوڈ کرو</string>\n    <string name=\"search_showing_result_for\">%s لئی نتیجے وِکھاۓ جا رہے ہن</string>\n    <string name=\"tab_bookmarks\">سانبھیاں پلےلِسٹاں</string>\n    <string name=\"download_path_audio_title\">آڈیو ڈاؤن‌لوڈ فوکڈر</string>\n    <string name=\"download_path_summary\">ڈاؤن‌لوڈ کیتیاں ویڈیو اِتھے جمھااں ہندیاں ہن</string>\n    <string name=\"download_path_dialog_title\">ویڈیو فائلاں لئی ڈاؤن‌لوڈ فولڈر چݨو</string>\n    <string name=\"download_path_audio_summary\">ڈاؤن‌لوڈ کیتیاں آڈیو اِتھے جمھاں ہندیاں ہن</string>\n    <string name=\"download_path_audio_dialog_title\">آڈیو فائلاں لئی لئی فولڈر چݨو</string>\n    <string name=\"default_resolution_title\">ریزولوشن دا مول</string>\n    <string name=\"default_popup_resolution_title\">تیردی تصویر لئی ریزولوشن دا مول</string>\n    <string name=\"show_higher_resolutions_title\">وڈیاں ریزولوشن دِکھاؤ</string>\n    <string name=\"duration_live\">لائیوَ</string>\n    <string name=\"users\">ورتنوالے</string>\n    <string name=\"undo\">موڑو</string>\n    <string name=\"file\">فائل</string>\n    <string name=\"clear_search_history_title\">کھوج دا اتیت ہٹاؤ</string>\n    <string name=\"close\">بند کرو</string>\n    <string name=\"clear_queue_confirmation_title\">کتار نوں خالی کرن توں پہلاں تصویر کرن لئی پچھو</string>\n    <string name=\"clear_queue_confirmation_summary\">پلیئر بدلݨ نال تہاڈی بدل سکدی اے</string>\n    <string name=\"clear_queue_confirmation_description\">سرگرم پکیئر کتار جاوےگا</string>\n    <string name=\"show_description_title\">وہروا دِکھاؤ</string>\n    <string name=\"enable_search_history_title\">کھوج دا اتیت</string>\n    <string name=\"settings_category_clear_data_title\">ڈیٹا پٹاؤ</string>\n    <string name=\"settings_category_video_audio_title\">ویڈیو تے آڈیو</string>\n    <string name=\"artists\">کلاکار</string>\n    <string name=\"best_resolution\">ودھیا ریزولوشن</string>\n    <string name=\"file_deleted\">فائل مٹا دتی گئی اے</string>\n    <string name=\"play_all\">سارے چلاؤ</string>\n    <string name=\"just_once\">صرف ایس بار</string>\n    <string name=\"notification_channel_name\">نیوپائیپ نوٹ</string>\n    <string name=\"import_data_title\">ڈیٹابیس اِمپورٹ کرو</string>\n    <string name=\"export_data_title\">ڈیٹابیس ایکسپورٹ کرو</string>\n    <string name=\"error_report_open_issue_button_text\">کِٹ‌ہب تے رپورٹ کریو</string>\n    <string name=\"related_items_tab_description\">سبندھت نگ</string>\n    <string name=\"search_no_results\">کوئی نےیجے</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">تصویر دی کیش ہٹائی گئی اے</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-ur/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">شروع کرنے کے لیے \\\"کلاں نما شیشہ\\\" پر ٹیپ کریں</string>\n    <string name=\"upload_date_text\">%1$s کو شائع ہوا</string>\n    <string name=\"install\">انسٹال</string>\n    <string name=\"cancel\">منسوخ کریں</string>\n    <string name=\"share\">اشتراک کریں</string>\n    <string name=\"download\">ڈاؤن لوڈ</string>\n    <string name=\"search\">تلاش کریں</string>\n    <string name=\"did_you_mean\">کیا آپ کا مطلب یہ ہے؟: %1$s</string>\n    <string name=\"open_in_browser\">براؤزر میں کھولیں</string>\n    <string name=\"settings\">ترتیبات</string>\n    <string name=\"no_player_found\">کوئی اسٹریم پلیئر نہیں ملا۔ کیا آپ VLC انسٹال کرنا چاہتے ہیں؟</string>\n    <string name=\"no_player_found_toast\">کوئی اسٹریم پلیئر نہیں ملا (آپ VLC انسٹال کر سکتے ہیں)۔</string>\n    <string name=\"open_in_popup_mode\">پاپ اپ وضع میں کھولیں</string>\n    <string name=\"controls_download_desc\">اسٹریم فائل ڈاؤن لوڈ کریں</string>\n    <string name=\"share_dialog_title\">کے ساتھ اشتراک کریں</string>\n    <string name=\"use_external_video_player_title\">خارجی ویڈیو پلئیر استعمال کریں</string>\n    <string name=\"use_external_video_player_summary\">کچھ ریزولوشن پر آڈیو دستیاب نہیں ہوگی.</string>\n    <string name=\"use_external_audio_player_title\">خارجی آڈیو پلیر استعمال کریں</string>\n    <string name=\"subscribe_button_title\">رکنیت اختیار کریں</string>\n    <string name=\"subscribed_button_title\">رکنیت شدہ</string>\n    <string name=\"channel_unsubscribed\">چینل کی رکنیت ختم کردی گئی</string>\n    <string name=\"subscription_change_failed\">رکنیت کو تبدیل نہیں کیا جا سکا</string>\n    <string name=\"subscription_update_failed\">رکنیت کی تازہ کاری نہیں ہو سکی</string>\n    <string name=\"show_info\">معلومات دکھائیں</string>\n    <string name=\"tab_subscriptions\">رکنیتیں</string>\n    <string name=\"tab_bookmarks\">نشان زدہ پلے لسٹس</string>\n    <string name=\"fragment_feed_title\">نیا کیا ہے</string>\n    <string name=\"controls_background_title\">پس منظر</string>\n    <string name=\"controls_popup_title\">پوپ اپ</string>\n    <string name=\"controls_add_to_playlist_title\">شامل کریں</string>\n    <string name=\"download_path_title\">ویڈیو ڈاؤن لوڈ فولڈر</string>\n    <string name=\"download_path_summary\">ڈاؤن لوڈ کی گئی ویڈیو فائلیں یہاں محفوظ ہیں</string>\n    <string name=\"download_path_dialog_title\">ویڈیو فائلوں کے لئے ڈاؤن لوڈ فولڈر کا انتخاب کریں</string>\n    <string name=\"download_path_audio_title\">آڈیو ڈاؤن لوڈ فولڈر</string>\n    <string name=\"download_path_audio_summary\">ڈاؤن لوڈ کی گئی آڈیو فائلیں یہاں محفوظ ہیں</string>\n    <string name=\"download_path_audio_dialog_title\">آڈیو فائلوں کے لئے ڈاؤن لوڈ فولڈر کا انتخاب کریں</string>\n    <string name=\"default_resolution_title\">طے شدہ ریزولوشن</string>\n    <string name=\"default_popup_resolution_title\">طے شدہ پوپ اپ ریزولوشن</string>\n    <string name=\"show_higher_resolutions_title\">اعلیٰ معیارات دکھائیں</string>\n    <string name=\"show_higher_resolutions_summary\">صرف کچھ آلات 2K / 4K ویڈیوز چلانے کے قابل ہوتے ہیں.</string>\n    <string name=\"play_with_kodi_title\">کوڈی کے ساتھ استعمال کریں</string>\n    <string name=\"kore_not_found\">لاپتہ کوری ایپ کو انسٹال کریں؟</string>\n    <string name=\"show_play_with_kodi_title\">\\\"کودی کے ساتھ چلائیں\\\" آپشن دکھائیں</string>\n    <string name=\"show_play_with_kodi_summary\">کوڈی کے ذریعے ویڈیو چلانے کا آپشن دکھائیں</string>\n    <string name=\"play_audio\">آڈیو</string>\n    <string name=\"default_audio_format_title\">طے شدہ آڈیو فارمیٹ</string>\n    <string name=\"default_video_format_title\">طے شدہ وڈیو فارمیٹ</string>\n    <string name=\"theme_title\">خیالیہ</string>\n    <string name=\"light_theme_title\">روشن</string>\n    <string name=\"dark_theme_title\">تاریک</string>\n    <string name=\"black_theme_title\">سیاہ</string>\n    <string name=\"popup_remember_size_pos_title\">پاپ اپ جسامت اور مقام کو یاد رکھیں</string>\n    <string name=\"popup_remember_size_pos_summary\">پچھلی جسامت اور پوپ اپ کا مقام یاد رکھیں</string>\n    <string name=\"use_inexact_seek_title\">بالواسطہ رسائی استعمال کریں</string>\n    <string name=\"use_inexact_seek_summary\">بالواسطہ تلاش مشکلات کو کم کر کے پلیئر کو تیز رفتاری سے مقامات تک رسائی کرنے دیتی ہے۔ 5 ، 15 یا 25 سیکنڈ کی تلاش اس کے ساتھ کام نہیں کرتی ہے:</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">تصویری کیشے کی صفائی ہوئی</string>\n    <string name=\"metadata_cache_wipe_title\">کیشے میٹا ڈیٹا کو صاف کریں</string>\n    <string name=\"metadata_cache_wipe_summary\">ویب پیج کے سبھی کیشے ڈیٹا کو ہٹا دیں</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">میٹا ڈیٹا کیشے کی صفائی ہوئی</string>\n    <string name=\"auto_queue_title\">اگلی اسٹریم خود قطار</string>\n    <string name=\"auto_queue_summary\">متعلقہ سلسلے کو جوڑ کر پلے بیک کی قطار کو اختتام تک (نہ دہراتے ہوئے) جاری رکھیں</string>\n    <string name=\"show_search_suggestions_title\">تلاش کے اشارے</string>\n    <string name=\"show_search_suggestions_summary\">تلاش کے دوران دکھانے کے لئے تجاویز کا انتخاب کریں</string>\n    <string name=\"enable_search_history_title\">سرگزشت تلاش کریں</string>\n    <string name=\"enable_search_history_summary\">تلاش کے استفسارات کو مقامی طور پر ذخیرہ کریں</string>\n    <string name=\"enable_watch_history_title\">دیکھے جانے کی سرگزشت</string>\n    <string name=\"enable_watch_history_summary\">دیکھی گئی ویڈیوز کی سرگزشت رکھیں</string>\n    <string name=\"resume_on_audio_focus_gain_title\">دوبارہ چلائیں</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">مداخلت کے بعد چلانا جاری رکھیں (مثلاً فون کالز)</string>\n    <string name=\"download_dialog_title\">ڈاؤن لوڈ</string>\n    <string name=\"show_next_and_similar_title\">\\'اگلی\\' اور \\'ملتی جلتی\\' ویڈیوز دکھائیں</string>\n    <string name=\"show_hold_to_append_title\">’’شامل کرنے کے لئے ہولڈ کریں‘‘ اشارہ دکھائیں</string>\n    <string name=\"show_hold_to_append_summary\">ویڈیو کی \\\"تفصیلات:\\\" میں پس منظر یا پاپ اپ بٹن دبانے پر اشارے دکھائیں</string>\n    <string name=\"unsupported_url\">غیر موافق URL</string>\n    <string name=\"default_content_country_title\">مشمولات کا طے شدہ ملک</string>\n    <string name=\"settings_category_player_title\">پلیئر</string>\n    <string name=\"settings_category_player_behavior_title\">برتاؤ</string>\n    <string name=\"settings_category_video_audio_title\">ویڈیو اور آڈیو</string>\n    <string name=\"settings_category_history_title\">سرگزشت اور کیشے</string>\n    <string name=\"settings_category_appearance_title\">اظہار</string>\n    <string name=\"settings_category_debug_title\">ڈِیبَگ</string>\n    <string name=\"background_player_playing_toast\">پس منظر میں چلائیں</string>\n    <string name=\"popup_playing_toast\">پوپ اپ اسلوب میں جاری</string>\n    <string name=\"content\">مشمول</string>\n    <string name=\"show_age_restricted_content_title\">عمر کی پابندی والے مواد دکھائیں</string>\n    <string name=\"duration_live\">براہ راست</string>\n    <string name=\"downloads\">ڈاؤن لوڈز</string>\n    <string name=\"downloads_title\">ڈاؤن لوڈز</string>\n    <string name=\"error_report_title\">خرابی کی اطلاع</string>\n    <string name=\"all\">تمام</string>\n    <string name=\"disabled\">غیر فعال</string>\n    <string name=\"clear\">صاف</string>\n    <string name=\"best_resolution\">بہترین ریزولوشن</string>\n    <string name=\"undo\">کالعدم کریں</string>\n    <string name=\"play_all\">تمام چلائیں</string>\n    <string name=\"always\">ہمیشہ</string>\n    <string name=\"just_once\">صرف ایک بار</string>\n    <string name=\"file\">فائل</string>\n    <string name=\"notification_channel_name\">نیو پائپ اطلاعات</string>\n    <string name=\"notification_channel_description\">نیو پائپ پلیئرز کیلئے اطلاعات</string>\n    <string name=\"unknown_content\">[نامعلوم]</string>\n    <string name=\"switch_to_background\">پس منظر پر جائیں</string>\n    <string name=\"switch_to_popup\">پاپ اپ پر جائیں</string>\n    <string name=\"switch_to_main\">مرکزی صفحہ پر جائیں</string>\n    <string name=\"import_data_title\">ڈیٹا بیس درآمد کریں</string>\n    <string name=\"export_data_title\">ڈیٹا بیس برآمد کریں</string>\n    <string name=\"import_data_summary\">اپنی موجودہ سرگزشت، رکنیت، پلے لسٹ اور ترتیبات (اختیاری) مٹائیں</string>\n    <string name=\"export_data_summary\">سرگزشت، رکنیتیں اور پلے لسٹ برآمد کریں</string>\n    <string name=\"general_error\">خرابی</string>\n    <string name=\"network_error\">نیٹ ورک کی خرابی</string>\n    <string name=\"could_not_load_thumbnails\">تمام نظرِ انگشتی لوڈ نہیں کر سکے</string>\n    <string name=\"parsing_error\">ویب سائٹ کو تجزیہ نہیں کیا جاسکا</string>\n    <string name=\"content_not_available\">مواد دستیاب نہیں ہے</string>\n    <string name=\"could_not_setup_download_menu\">ڈاؤن لوڈ مینو ترتیب نہیں دے سکتے</string>\n    <string name=\"app_ui_crash\">ایپ/UI تباہ</string>\n    <string name=\"player_stream_failure\">یہ سلسلہ نہیں چل سکا</string>\n    <string name=\"player_unrecoverable_failure\">پلیئر میں نا قابلِ تلافی نقص واقع ہوئی</string>\n    <string name=\"player_recoverable_failure\">پلیر نقص سے بازیافت کیا جارہا ہے</string>\n    <string name=\"external_player_unsupported_link_type\">بیرونی پلیئر اس قسم کے روابط کی حمایت نہیں کرتے</string>\n    <string name=\"video_streams_empty\">کوئی ویڈیو سلسلے نہیں ملے</string>\n    <string name=\"audio_streams_empty\">کوئی آڈیو سلسلے نہیں ملے</string>\n    <string name=\"invalid_directory\">ایسا کوئی فولڈر نہیں</string>\n    <string name=\"invalid_source\">ایسی کوئی فائل/مواد کا ذریعہ نہیں</string>\n    <string name=\"invalid_file\">فائل موجود نہیں ہے یا اسے پڑھنے یا لکھنے کی اجازت کا فقدان ہے</string>\n    <string name=\"file_name_empty_error\">فائل کا نام ضروری ہے</string>\n    <string name=\"error_occurred_detail\">ایک خامی پیش آگئی: %1$s</string>\n    <string name=\"no_streams_available_download\">کوئی سلسلسہ ڈاؤن لوڈ کرنے کے لئے دستیاب نہیں</string>\n    <string name=\"sorry_string\">معذرت، ایسا نہیں ہونا چاہئے تھا۔</string>\n    <string name=\"error_report_button_text\">ای میل کے ذریعے اطلاع دیں</string>\n    <string name=\"error_snackbar_message\">معذرت، کچھ غلط ہوا۔</string>\n    <string name=\"error_snackbar_action\">رپورٹ کریں</string>\n    <string name=\"what_device_headline\">معلومات:</string>\n    <string name=\"what_happened_headline\">کیا ہوا:</string>\n    <string name=\"info_labels\">کیا ہوا:\\nدرخواست:\\nمواد کی زبان:\\nملک:\\nایپ کی زبان:\\nسروس:\\nجی ایم ٹٰ:\\nوقت:\\nپیکیج:\\nورژن:\\nآپریٹنگ سسٹم ورزن:</string>\n    <string name=\"your_comment\">آپ کا تبصرہ (انگریزی میں):</string>\n    <string name=\"error_details_headline\">تفصیلات:</string>\n    <string name=\"detail_thumbnail_view_description\">ویڈیو چلائیں، دورانیہ:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">اپ لوڈر کا اوتار نظرِ انگشتی</string>\n    <string name=\"detail_likes_img_view_description\">پسندیدگی</string>\n    <string name=\"detail_dislikes_img_view_description\">ناپسندیدگی</string>\n    <string name=\"search_no_results\">کوئی نتائج نہیں</string>\n    <string name=\"empty_list_subtitle\">یہاں کچھ نہیں سوائے میرے</string>\n    <string name=\"detail_drag_description\">دوبارہ ترتیب دینے کیلئے کھینچں</string>\n    <string name=\"video\">ویڈیو</string>\n    <string name=\"audio\">آڈیو</string>\n    <string name=\"retry\">دوبارہ کوشش کریں</string>\n    <string name=\"no_subscribers\">کوئی صارفین نہیں</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"one\">%s صارف</item>\n        <item quantity=\"other\">%s صارفین</item>\n    </plurals>\n    <string name=\"no_views\">کوئی مناظر نہیں</string>\n    <plurals name=\"views\">\n        <item quantity=\"one\">%s منظر</item>\n        <item quantity=\"other\">%s مناظر</item>\n    </plurals>\n    <string name=\"no_videos\">ویڈیوز دستیاب نہیں</string>\n    <plurals name=\"videos\">\n        <item quantity=\"one\">%s ویڈیو</item>\n        <item quantity=\"other\">%s ویڈیوز</item>\n    </plurals>\n    <string name=\"start\">شروع کریں</string>\n    <string name=\"pause\">توقف</string>\n    <string name=\"create\">بنانا</string>\n    <string name=\"delete\">حذف کریں</string>\n    <string name=\"checksum\">تشخیص کریں</string>\n    <string name=\"dismiss\">برخاست کریں</string>\n    <string name=\"rename\">نام تبدیل کریں</string>\n    <string name=\"ok\">ٹھيک ہے</string>\n    <string name=\"msg_name\">فائل کا نام</string>\n    <string name=\"msg_threads\">موضوعات</string>\n    <string name=\"msg_error\">خرابی</string>\n    <string name=\"msg_running\">نیو پائپ ڈاؤن لوڈ ہو رہا ہے</string>\n    <string name=\"msg_running_detail\">تفصیلات کے لیے ٹیپ کریں</string>\n    <string name=\"msg_wait\">براۓ مہربانی انتظار کريں…</string>\n    <string name=\"msg_copied\">کلپ بورڈ میں نقل ہوا</string>\n    <string name=\"no_available_dir\">براہ کرم بعد میں ترتیبات میں ڈاؤن لوڈ فولڈر کی وضاحت رکھیں</string>\n    <string name=\"msg_popup_permission\">پوپ اپ موڈ میں کھولنے کیلئے اس اجازت کی ضرورت ہے</string>\n    <string name=\"recaptcha_request_toast\">reCAPTCHA چیلینج کی درخواست کی گئی</string>\n    <string name=\"settings_category_downloads_title\">ڈاؤن لوڈ</string>\n    <string name=\"settings_file_charset_title\">فائل کے ناموں میں ان حروف کی اجازت ہے</string>\n    <string name=\"settings_file_replacement_character_summary\">ناجائز کریکٹر اس قدر کے ساتھ تبدیل کیےگئے</string>\n    <string name=\"settings_file_replacement_character_title\">متبادل کریکٹر</string>\n    <string name=\"charset_letters_and_digits\">حروف اور ہندسے</string>\n    <string name=\"charset_most_special_characters\">اہم مخصوص حروف</string>\n    <string name=\"title_activity_about\">نیو پائپ کے بارے میں</string>\n    <string name=\"title_licenses\">تیسری پارٹی کی لائسنس</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s بذریعہ %2$s %3$s کے تحت</string>\n    <string name=\"tab_about\">کے بارے میں اور اکثر پوچھے گئے سوالات</string>\n    <string name=\"tab_licenses\">لائسنس</string>\n    <string name=\"app_description\">اینڈروئیڈ پر لِبرے کی ہلکی اسٹریمنگ۔</string>\n    <string name=\"contribution_title\">تعاون کریں</string>\n    <string name=\"contribution_encouragement\">جو بھی آپ کے خیالات ہوں؛ ترجمہ، ڈیزائن میں تبدیلیاں، کوڈ کی درستی، یا حقیقتاً کوڈ میں بڑی تبدیلی—مدد کا ہمیشہ خیرمقدم ہے۔ جتنا زیادہ ہوگا اتنی ہی بہتری ہو گی!</string>\n    <string name=\"view_on_github\">گٹ ہب پر دیکھیں</string>\n    <string name=\"donation_title\">عطیہ</string>\n    <string name=\"donation_encouragement\">نیو پائپ رضاکاروں کے ذریعہ تیار کیا گیا ہے جو آپ کو بہترین تجربہ فراہم کرنے میں وقت صرف کرتے ہیں۔ ایک کپ کافی سے لطف اندوز ہوتے ہوئے ڈویلپرز کو نیو پائپ کو اور بہتر بنانے میں بہتر تعاون کریں</string>\n    <string name=\"give_back\">بدلہ دیں</string>\n    <string name=\"website_title\">ویب سائٹ</string>\n    <string name=\"website_encouragement\">مزید معلومات اور خبروں کے لئے نیو پائپ ویب سائٹ ملاحظہ کریں۔</string>\n    <string name=\"app_license_title\">نیو پائپ کا لائسنس</string>\n    <string name=\"read_full_license\">لائسنس پڑھیں</string>\n    <string name=\"title_activity_history\">سرگزشت</string>\n    <string name=\"action_history\">سرگزشت</string>\n    <string name=\"delete_item_search_history\">کیا آپ اس آئٹم کو تلاش کی سرگزشت سے حذف کرنا چاہتے ہیں؟</string>\n    <string name=\"title_last_played\">آخری چلائی گئی</string>\n    <string name=\"title_most_played\">سب سے زیادہ چلائی گئی</string>\n    <string name=\"main_page_content\">مرکزی صفحہ کا مواد</string>\n    <string name=\"blank_page_summary\">خالی صفحہ</string>\n    <string name=\"kiosk_page_summary\">رجحان صفحہ</string>\n    <string name=\"channel_page_summary\">چینل کا صفحہ</string>\n    <string name=\"select_a_channel\">ایک چینل منتخب کریں</string>\n    <string name=\"no_channel_subscribed_yet\">اب تک چینل کی رکنیت نہیں</string>\n    <string name=\"select_a_kiosk\">ایک کیوسک منتخب کریں</string>\n    <string name=\"export_complete_toast\">برآمد شدہ</string>\n    <string name=\"import_complete_toast\">درآمدشدہ</string>\n    <string name=\"no_valid_zip_file\">درست زپ فائل نہیں ہے</string>\n    <string name=\"could_not_import_all_files\">انتباہ: تمام فائلوں کو درآمد نہیں کیا جاسکا۔</string>\n    <string name=\"override_current_data\">یہ آپ کی موجودہ سیٹ اپ کو باطل کر دے گا۔</string>\n    <string name=\"trending\">رجحان میں</string>\n    <string name=\"top_50\">اوّل 50</string>\n    <string name=\"new_and_hot\">نیا اور تازہ</string>\n    <string name=\"play_queue_remove\">ہٹائیں</string>\n    <string name=\"play_queue_stream_detail\">تفصیلات</string>\n    <string name=\"play_queue_audio_settings\">آڈیو کی ترتیبات</string>\n    <string name=\"hold_to_append\">انقطار کو پکڑو</string>\n    <string name=\"start_here_on_background\">پس منظر میں چلانا شروع کریں</string>\n    <string name=\"start_here_on_popup\">پوپ اپ میں چلانا شروع کریں</string>\n    <string name=\"drawer_open\">دراز کھولیں</string>\n    <string name=\"drawer_close\">دراز بند کریں</string>\n    <string name=\"preferred_open_action_settings_title\">پسندیدہ \\'کھلی\\' کارروائی</string>\n    <string name=\"preferred_open_action_settings_summary\">مواد کھولنے پر طے شدہ کارروائی — %s</string>\n    <string name=\"video_player\">ویڈیو پلیئر</string>\n    <string name=\"background_player\">پس منظر پلیئر</string>\n    <string name=\"popup_player\">پوپ اپ پلیئر</string>\n    <string name=\"always_ask_open_action\">ہمیشہ اجازت لیں</string>\n    <string name=\"preferred_player_fetcher_notification_title\">معلومات حاصل کر رہا ہے…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">درخواست کردہ مواد کو لوڈ کیا جارہا ہے</string>\n    <string name=\"create_playlist\">نئی پلے لسٹ</string>\n    <string name=\"rename_playlist\">نام تبدیل کریں</string>\n    <string name=\"name\">نام</string>\n    <string name=\"add_to_playlist\">پلے لسٹ میں شامل</string>\n    <string name=\"set_as_playlist_thumbnail\">بطور پلے لسٹ تھمبنیل طے کریں</string>\n    <string name=\"bookmark_playlist\">پلے لسٹ کو نشان زد کریں</string>\n    <string name=\"unbookmark_playlist\">نشان زد حدف کریں</string>\n    <string name=\"delete_playlist_prompt\">کیا یہ پلے لسٹ حذف کریں؟</string>\n    <string name=\"playlist_creation_success\">پلے لسٹ بنائی گئی</string>\n    <string name=\"playlist_add_stream_success\">فہرست میں شامل کر دیا</string>\n    <string name=\"playlist_thumbnail_change_success\">پلے لسٹ انگشتی تبدیل ہوا۔</string>\n    <string name=\"caption_none\">کوئی عنوانات نہیں</string>\n    <string name=\"resize_fit\">فٹ</string>\n    <string name=\"resize_fill\">بھریں</string>\n    <string name=\"resize_zoom\">زوم</string>\n    <string name=\"caption_auto_generated\">خود بخود تیار</string>\n    <string name=\"enable_leak_canary_summary\">میموری لیک ہونے کی مانیٹرنگ، ہیپ ڈمپنگ کے وقت ایپ کو غیرذمہ دار بننے کا باعث بن سکتی ہے</string>\n    <string name=\"enable_disposed_exceptions_title\">گردشِ حیات سے دوری کی غلطیوں کی اطلاع دیں</string>\n    <string name=\"enable_disposed_exceptions_summary\">فریگمنٹ یا دائرۂ حیات کی سر گرمی کے بعد Rx پیغامات نہ پہنچایا جا سکے تو ضرور کوشش کریں</string>\n    <string name=\"import_title\">در آمد</string>\n    <string name=\"import_from\">سے درآمد کریں</string>\n    <string name=\"export_to\">کو بر آمد کریں</string>\n    <string name=\"import_ongoing\">در آمد کیا جا رہا ہے…</string>\n    <string name=\"export_ongoing\">بر آمد کر رہا ہے…</string>\n    <string name=\"import_file_title\">فائل در آمد کریں</string>\n    <string name=\"previous_export\">پچھلی بر آمد</string>\n    <string name=\"subscriptions_import_unsuccessful\">رکنیتوں کو در آمد نہیں کیا جا سکا</string>\n    <string name=\"subscriptions_export_unsuccessful\">رکنیتوں بر آمد نہیں کر سکا</string>\n    <string name=\"import_youtube_instructions\">برآمد فائل کو ڈاؤن لوڈ کرکے YouTube کی رکنیت کو درآمد کریں: \n\\n \n\\n1. اس URL پر جائیں:\n\\n%1$s \n\\n2. جب پوچھا جائے تو لاگ ان کریں \n\\n3. ڈاؤن لوڈ شروع ہونا چاہئے (یہ برآمد فائل ہے)</string>\n    <string name=\"import_soundcloud_instructions\">۔URL یا آپ کی ID ٹائپ کرکے ایک SoundCloud پروفائل درآمد کریں: \n\\n \n\\n1. ویب براؤزر میں \\\"ڈیسک ٹاپ موڈ\\\" کو فعال کریں (یہ سائٹ موبائل آلات کے لئے دستیاب نہیں ہے) \n\\n2. اس URL پر جائیں:\n\\n%1$s \n\\n3. جب پوچھا جائے تو لاگ ان کریں \n\\n4. پروفائل URL کاپی کریں جہاں تک آپ کی رہنمائی کی گئی تھی۔</string>\n    <string name=\"import_soundcloud_instructions_hint\">آپ کی آئی ڈی، soundcloud.com/yourid</string>\n    <string name=\"import_network_expensive_warning\">اس بات کو ذہن میں رکھیں کہ اس عملیہ کا نیٹ ورک مہنگا ہو سکتا ہے۔\n\\n\n\\nکیا آپ جاری رکھنا چاہتے ہیں ؟</string>\n    <string name=\"playback_speed_control\">پلے بیک رفتار کنٹرول</string>\n    <string name=\"playback_tempo\">ٹیمپو</string>\n    <string name=\"playback_pitch\">موٹی آواز</string>\n    <string name=\"unhook_checkbox\">غیر مربوط (مسخ کا سبب بن سکتا ہے)</string>\n    <string name=\"caption_setting_title\">عنوانات</string>\n    <string name=\"caption_setting_description\">پلیئر کیپشن ٹیکسٹ اسکیل اور بیک گراونڈ اسٹائل میں ترمیم کریں۔ اثر لینے کیلئے ایپ کو دوبارہ شروع کرنا ضروری ہے۔</string>\n    <string name=\"clear_views_history_title\">دیکھنے کی سرگزشت صاف کریں</string>\n    <string name=\"clear_views_history_summary\">چلائے گئے سلسلوں اور پلے بیک پوزیشنز کی سرگزشت کو حذف کیا گیا</string>\n    <string name=\"delete_view_history_alert\">دیکھے جانے کی تمام سرگزشت حذف کریں؟</string>\n    <string name=\"clear_search_history_title\">تلاش کی سرگزشت مٹائیں</string>\n    <string name=\"clear_search_history_summary\">تلاش کے الفاظ کی سرگزشت حذف کی گئیں</string>\n    <string name=\"delete_search_history_alert\">تلاش کی مکمل سرگزشت حذف کریں؟</string>\n    <string name=\"search_history_deleted\">تلاش کی سرگزشت حذف ہوئی</string>\n    <string name=\"one_item_deleted\">1 شے حذف کر دی گئی۔</string>\n    <string name=\"app_license\">نیو پائپ کاپی لیفٹ فری سافٹ ویئر ہے: آپ استعمال، مطالعہ، شیئر اور اپنی مرضی سے اسے بہتر بنا سکتے ہیں۔ خاص طور پر آپ اسے مفت سافٹ ویئر فاؤنڈیشن کے ذریعہ شائع کردہ GNU جنرل پبلک لائسنس کی شرائط کے تحت دوبارہ تقسیم اور/یا ترمیم کرسکتے ہیں، خواہ لائسنس کا ورژن 3، یا (آپ کے اختیار پر) کسی بھی بعد کا ورژن میں۔</string>\n    <string name=\"import_settings\">کیا آپ ترتیبات بھی درآمد کرنا چاہتے ہیں؟</string>\n    <string name=\"privacy_policy_title\">نیو پائپ کی رازداری کی پالیسی</string>\n    <string name=\"privacy_policy_encouragement\">نیو پائپ منصوبہ آپ کی رازداری کو بہت سنجیدگی سے لیتا ہے. لہذا، ایپلی کیشن آپ کی رضامندی کے بغیر کسی بھی ڈیٹا کو جمع نہیں کرتا./nنیو پائپ کی رازداری پالیسی تفصیل سے وضاحت کرتی ہے کہ آپ کے کریش رپورٹ بھیجنے پر کیا ڈیٹا بھیجا جاتا ہے اور ذخیرہ کیا جاتا ہے ۔</string>\n    <string name=\"read_privacy_policy\">رازداری کی پالیسی پڑھیں</string>\n    <string name=\"start_accept_privacy_policy\">یورپی جنرل ڈیٹا پروٹیکشن ریگولیشن (جی ڈی پی آر) کی تعمیل کرنے کیلئے، ہم آپ کی توجہ نیو پائپ کی رازداری کی پالیسی کی طرف مبذول کراتے ہیں۔ برائے مہربانی اسے غور سے پڑھیں۔ \n\\nہمیں بگ رپورٹ بھیجنے کے لیے آپ کو اسے قبول کرنا ضروری ہے۔</string>\n    <string name=\"accept\">قبول</string>\n    <string name=\"decline\">رد</string>\n    <string name=\"limit_data_usage_none_description\">لا محدود</string>\n    <string name=\"limit_mobile_data_usage_title\">موبائل ڈیٹا کا استعمال کرتے وقت ریزولوشن کو محدود کریں</string>\n    <string name=\"minimize_on_exit_title\">ایپ بدلنے پر چھوٹا کریں</string>\n    <string name=\"minimize_on_exit_summary\">اصل ویڈیو پلیئر سے دوسرے ایپ میں تبدیل ہوتے وقت کارروائی — %s</string>\n    <string name=\"minimize_on_exit_none_description\">کوئی نہیں</string>\n    <string name=\"minimize_on_exit_background_description\">پس منظر پلیئر میں کم کریں</string>\n    <string name=\"minimize_on_exit_popup_description\">پاپ اپ پلیئر میں کم کریں</string>\n    <string name=\"skip_silence_checkbox\">خاموشی کے دوران فاسٹ فارورڈ</string>\n    <string name=\"playback_step\">قدم</string>\n    <string name=\"playback_reset\">ری سیٹ کریں</string>\n    <string name=\"channels\">چینلز</string>\n    <string name=\"playlists\">پلے لسٹس</string>\n    <string name=\"tracks\">ویڈیوز</string>\n    <string name=\"users\">صارفین</string>\n    <string name=\"unsubscribe\">رکنیت چھوڑیں</string>\n    <string name=\"tab_choose\">ٹیب منتخب کریں</string>\n    <string name=\"content_language_title\">مشمولات کی طےشدہ زبان</string>\n    <string name=\"settings_category_updates_title\">تازہ کاریاں</string>\n    <string name=\"file_deleted\">فائل حذف ہوگئی</string>\n    <string name=\"app_update_notification_channel_name\">ایپ اَپ ڈیٹ کی اطلاع</string>\n    <string name=\"app_update_notification_channel_description\">جدید نیو پائپ ورژن کے لیے اطلاعات</string>\n    <string name=\"download_to_sdcard_error_title\">بیرونی ذخیرہ دستیاب نہیں</string>\n    <string name=\"download_to_sdcard_error_message\">بیرونی ایسڈی کارڈ پر ڈاؤن لوڈ ممکن نہیں۔ ڈاؤن لوڈ فولڈر کے مقام کو دوبارہ ترتیب دیں؟</string>\n    <string name=\"saved_tabs_invalid_json\">محفوظ شدہ ٹیبز نہیں پڑھ سکے لہذا پہلے سے طے شدہ کا استعمال کر رہے ہیں</string>\n    <string name=\"restore_defaults\">طے شدہ بحال کریں</string>\n    <string name=\"restore_defaults_confirmation\">کیا آپ پہلے سے طے شدہ کو بحال کرنا چاہتے ہیں؟</string>\n    <string name=\"subscribers_count_not_available\">صارفین کا شمار دستیاب نہیں</string>\n    <string name=\"main_page_content_summary\">مرکزی صفحہ پر کون کون سے ٹیبز دکھائے جاہیں</string>\n    <string name=\"updates_setting_title\">تازہ کاری</string>\n    <string name=\"updates_setting_description\">نیا ورژن دستیاب ہونے پر ایپ کی تازہ کاری کے لیے اجازتی اطلاع دکھائیں</string>\n    <string name=\"list_view_mode\">فہرست نما اسلوب</string>\n    <string name=\"list\">فہرست</string>\n    <string name=\"grid\">گرڈ</string>\n    <string name=\"auto\">خودکار</string>\n    <string name=\"app_update_available_notification_title\">نیو پائپ کی تازہ کاری دستیاب!</string>\n    <string name=\"missions_header_finished\">ختم</string>\n    <string name=\"missions_header_pending\">ملتوی</string>\n    <string name=\"paused\">توقف</string>\n    <string name=\"queued\">قطار میں</string>\n    <string name=\"post_processing\">بعد کا عمل جاری</string>\n    <string name=\"enqueue\">قطار</string>\n    <string name=\"permission_denied\">سسٹم کے ذریعہ کارروائی سے انکار کیا گیا</string>\n    <string name=\"download_failed\">ڈاؤن لوڈ ناکام</string>\n    <string name=\"generate_unique_name\">منفرد نام بنائیں</string>\n    <string name=\"overwrite\">برتحریر</string>\n    <string name=\"download_already_running\">اس نام کے ساتھ ایک ڈاؤن لوڈ جاری ہے</string>\n    <string name=\"show_error\">غلطی دکھائیں</string>\n    <string name=\"error_path_creation\">مطلوبہ فولڈر نہیں بنایا جا سکتا</string>\n    <string name=\"error_file_creation\">فائل نہیں بنائی جاسکتی ہے</string>\n    <string name=\"error_ssl_exception\">محفوظ کنکشن ناکام</string>\n    <string name=\"error_unknown_host\">سرور نہیں مل سکا</string>\n    <string name=\"error_connect_host\">سرور سے متصل نہیں ہو سکتا</string>\n    <string name=\"error_http_no_content\">سرور ڈیٹا نہیں بھیجتا ہے</string>\n    <string name=\"error_http_unsupported_range\">سرور ملٹی تھریڈڈ ڈاؤن لوڈز کو قبول نہیں کرتا ہے، @string/msg_threads = 1 کے ساتھ دوبارہ کوشش کریں</string>\n    <string name=\"error_http_not_found\">نہیں ملا</string>\n    <string name=\"error_postprocessing_failed\">بعد کا عمل نا کام</string>\n    <string name=\"stop\">روکیں</string>\n    <string name=\"max_retry_msg\">زیادہ سے زیادہ کوششیں</string>\n    <string name=\"max_retry_desc\">ڈاؤن لوڈ منسوخ کرنے سے پہلے کوششوں کی زیادہ سے زیادہ تعداد</string>\n    <string name=\"pause_downloads_on_mobile\">میٹر والی نیٹ ورک پر مداخلت</string>\n    <string name=\"pause_downloads_on_mobile_desc\">موبائل ڈیٹا پر بدلتے وقت مفید ہے، اگرچہ کچھ ڈاؤن لوڈ معطل نہیں ہوسکتی ہیں</string>\n    <string name=\"events\">تقریبات</string>\n    <string name=\"conferences\">کانفرنسیں</string>\n    <string name=\"show_comments_title\">تبصرے دکھائیں</string>\n    <string name=\"show_comments_summary\">تبصرے چھپانے کیلئے بند کریں</string>\n    <string name=\"autoplay_title\">آٹوپلے</string>\n    <string name=\"no_comments\">کوئی تبصرہ نہیں</string>\n    <string name=\"error_unable_to_load_comments\">تبصرے لوڈ نہیں ہو سکے</string>\n    <string name=\"close\">بند کریں</string>\n    <string name=\"enable_playback_resume_title\">پلے بیک دوبارہ شروع کریں</string>\n    <string name=\"enable_playback_resume_summary\">آخری پلے بیک پوزیشن بحال کریں</string>\n    <string name=\"enable_playback_state_lists_title\">فہرست میں مقامات</string>\n    <string name=\"enable_playback_state_lists_summary\">فہرستوں میں پلے بیک مقامات کے اشارے دکھائیں</string>\n    <string name=\"settings_category_clear_data_title\">کوائف صاف کریں</string>\n    <string name=\"watch_history_deleted\">دیکھے جانے کی سرگزشت حذف ہو گئی</string>\n    <string name=\"watch_history_states_deleted\">پلے بیک پوزیشنس حذف ہوئیں</string>\n    <string name=\"missing_file\">فائل منتقل یا حذف ہوگئی</string>\n    <string name=\"overwrite_unrelated_warning\">اس نام والی فائل پہلے سے موجود ہے</string>\n    <string name=\"overwrite_finished_warning\">اس نام کی ڈاؤن لوڈ کی گئی فائل پہلے سے موجود ہے</string>\n    <string name=\"overwrite_failed\">فائل برتحریر نہیں کر سکتا</string>\n    <string name=\"download_already_pending\">اس نام کے ساتھ ڈاؤن لوڈ زیر التوا ہے</string>\n    <string name=\"error_postprocessing_stopped\">فائل پر کام کرنے کے دوران نیو پائپ بند کردی گئی تھی</string>\n    <string name=\"error_insufficient_storage_left\">آلہ میں کوئی جگہ نہیں بچی</string>\n    <string name=\"error_progress_lost\">پیشرفت ختم ہوگئی، کیونکہ فائل کو حذف کردیا گیا تھا</string>\n    <string name=\"error_timeout\">رابطے کا وقت ختم</string>\n    <string name=\"confirm_prompt\">کیا آپ اپنی ڈاؤن لوڈ کی سرگزشت کو صاف کرنا چاہتے ہیں یا ڈاؤن لوڈ کی گئی تمام فائلوں کو حذف کرنا چاہتے ہیں؟</string>\n    <string name=\"enable_queue_limit\">ڈاؤن لوڈ کی قطار کو محدود کریں</string>\n    <string name=\"enable_queue_limit_desc\">ایک ڈاؤن لوڈ ایک ہی وقت میں چلے گا</string>\n    <string name=\"start_downloads\">ڈاؤن لوڈ شروع کریں</string>\n    <string name=\"pause_downloads\">ڈاؤن لوڈ روکیں</string>\n    <string name=\"downloads_storage_ask_title\">ڈاؤن لوڈ کہاں کریں، پوچھیں</string>\n    <string name=\"downloads_storage_ask_summary\">ہر ڈاؤن لوڈ کو کہاں محفوظ کرنا ہے آپ سے پوچھا جائے گا</string>\n    <string name=\"downloads_storage_use_saf_title\">SAF استعمال کریں</string>\n    <string name=\"downloads_storage_use_saf_summary\">اسٹوریج ایکسیس فریم ورک ایک بیرونی SD کارڈ میں ڈاؤن لوڈ کی اجازت دیتا ہے۔\n\\nنوٹ: کچھ آلات مطابقت نہیں رکھتے ہیں</string>\n    <string name=\"clear_playback_states_title\">پلے بیک پوزیشن حذف کریں</string>\n    <string name=\"clear_playback_states_summary\">تمام پلے بیک پوزیشن حذف کی گئی</string>\n    <string name=\"delete_playback_states_alert\">تمام پلے بیک پوزیشنس حذف کریں؟</string>\n    <string name=\"drawer_header_description\">ٹوگل خدمت، حالیہ منتخب:</string>\n    <string name=\"no_one_watching\">کوئی نہیں دیکھ رہا ہے</string>\n    <plurals name=\"watching\">\n        <item quantity=\"one\">%s دیکھ رہا</item>\n        <item quantity=\"other\">%s دیکھ رہے</item>\n    </plurals>\n    <string name=\"no_one_listening\">کوئی نہیں سن رہا ہے</string>\n    <plurals name=\"listening\">\n        <item quantity=\"one\">%s سننے والا</item>\n        <item quantity=\"other\">%s سننے والے</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">طے شدہ کیوسک</string>\n    <string name=\"seek_duration_title\">آگے بھگانے /- پیچھے کرنے کی مدت</string>\n    <string name=\"peertube_instance_url_title\">پیر ٹیوب واقعات</string>\n    <string name=\"peertube_instance_url_summary\">اپنے پسندیدہ پیر ٹیوب کی مثالیں منتخب کریں</string>\n    <string name=\"peertube_instance_url_help\">ایسی مثالوں کی تلاش کریں جو آپ %s پر پسند کرتے ہیں</string>\n    <string name=\"peertube_instance_add_title\">مثال شامل کریں</string>\n    <string name=\"peertube_instance_add_help\">مثال کا URL درج کریں</string>\n    <string name=\"peertube_instance_add_fail\">مثال کی توثیق نہیں کی جا سکی</string>\n    <string name=\"peertube_instance_add_https_only\">صرف HTTPS URLs موافق ہیں</string>\n    <string name=\"peertube_instance_add_exists\">مثال پہلے سے موجود ہے</string>\n    <string name=\"local\">مقامی</string>\n    <string name=\"recently_added\">حال ہی میں شامل</string>\n    <string name=\"most_liked\">زیادہ پسندیدہ</string>\n    <string name=\"playlist_no_uploader\">خود سے بنا (کوئی اپ لوڈر نہیں ملا)</string>\n    <string name=\"recovering\">بازیافتی ہو رہی</string>\n    <string name=\"error_download_resource_gone\">یہ ڈاؤن لوڈ بازیافت نہیں ہو سکتا</string>\n    <string name=\"choose_instance_prompt\">ایک مثال منتخب کریں</string>\n    <string name=\"clear_download_history\">ڈاؤن لوڈ کی سرگزشت صاف کریں</string>\n    <string name=\"delete_downloaded_files\">ڈاؤن لوڈ شدہ فائلیں حذف کریں</string>\n    <string name=\"msg_calculating_hash\">ہیش کا حساب لگا رہے ہیں</string>\n    <string name=\"infinite_videos\">∞ ویڈیوز</string>\n    <string name=\"more_than_100_videos\">100 سے زائد ویڈیو</string>\n    <string name=\"description_tab_description\">‪تفصیل</string>\n    <string name=\"related_items_tab_description\">متعلقہ سلسلے</string>\n    <string name=\"comments_tab_description\">تبصرے</string>\n    <string name=\"error_report_open_github_notice\">براہ کرم چیک کریں کہ آیا آپ کے کریش پر بحث کرنے والا مسئلہ پہلے سے موجود ہے۔ ڈپلیکیٹ ٹکٹ بناتے وقت آپ ہم سے وقت لیتے ہیں، جو ہم اصل مسئلے کو ٹھیک کرنے میں صرف کرتے ہیں۔</string>\n    <string name=\"error_report_open_issue_button_text\">گِٹ ہب میں اطلاع دیں</string>\n    <string name=\"copy_for_github\">فارمیٹڈ رپورٹ کو کاپی کریں</string>\n    <string name=\"permission_display_over_apps\">دوسرے ایپس پر نظر آنے کی اجازت دیں</string>\n    <string name=\"clear_cookie_summary\">ان کوکیز کو صاف کریں جنہیں نیو پائپ ری کیپچا حل کرنے کے دوران جمع کرتا ہے</string>\n    <string name=\"recaptcha_cookies_cleared\">ری کیپچا کوکیز صاف ہوئیں</string>\n    <string name=\"clear_cookie_title\">ری کیپچا کوکیز کو صاف کریں</string>\n    <string name=\"hash_channel_description\">ویڈیو ہیسنگ پیشرفت کے لئے اطلاعات</string>\n    <string name=\"hash_channel_name\">ویڈیو ہیش اطلاع</string>\n    <string name=\"artists\">کردار</string>\n    <string name=\"albums\">البم</string>\n    <string name=\"songs\">گانے</string>\n    <string name=\"videos_string\">ویڈٰو</string>\n    <string name=\"restricted_video\">اس ویڈیو پر عمر کی پابندی ہے۔\n\\n\n\\nاگر آپ اسے دیکھنا چاہتے ہیں تو ترتیبات میں \\\"%1$s\\\" کو آن کریں۔</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">یوٹیوب ایک \\\"پابندی والا وضع\\\" فراہم کرتا ہے جو امکانی طور پر نازیبا مواد کو چھپاتا ہے</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">یوٹیوب کا \\\"پابندی والا وضع\\\" چالو کریں</string>\n    <string name=\"show_age_restricted_content_summary\">وہ مواد دکھائیں جو بچوں کے لیے ممکنہ طور پر نا مناسب ہیں کیوں کہ اس میں عمر کی حد ہے (جیسے 18+)</string>\n    <string name=\"unsupported_url_dialog_message\">URL کو نہیں پہچان سکے۔ کسی اور ایپ کے ساتھ کھولیں؟</string>\n    <string name=\"auto_queue_toggle\">خود کار قطار</string>\n    <string name=\"show_meta_info_summary\">اسٹریم کے موجد، اسٹریم مواد یا تلاش کی درخواست کے بارے میں اضافی معلومات والے میٹا انفارمیشن بکسوں کو چھپانے کیلئے بند کریں</string>\n    <string name=\"show_meta_info_title\">میٹا معلومات دکھائیں</string>\n    <string name=\"show_description_summary\">ویڈیو کی تفصیل اور اضافی معلومات کو چھپانے کیلئے بند کریں</string>\n    <string name=\"show_description_title\">تفصیل دکھائیں</string>\n    <string name=\"clear_queue_confirmation_description\">فعال پلیئر کی قطار تبدیل کردی جائے گی</string>\n    <string name=\"clear_queue_confirmation_summary\">ایک پلئیر سے دوسرے میں تبدیل ہونا آپ کی قطار بدل سکتا ہے</string>\n    <string name=\"clear_queue_confirmation_title\">قطار صاف کرنے سے پہلے تصدیق کے لئے پوچھیں</string>\n    <string name=\"notification_colorize_summary\">تھمب نیل میں مرکزی رنگ کے مطابق اینڈروئیڈ کی اطلاع کے رنگ کو حسب منشا بنائیں (واضح ہو کہ یہ تمام آلات پر دستیاب نہیں ہے)</string>\n    <string name=\"notification_colorize_title\">نوٹیفکیشن کو رنگین بنائیں</string>\n    <string name=\"notification_action_nothing\">کچھ نہیں</string>\n    <string name=\"notification_action_buffering\">بفرینگ</string>\n    <string name=\"notification_action_shuffle\">شفل</string>\n    <string name=\"notification_action_repeat\">دوہرائیں</string>\n    <string name=\"notification_actions_at_most_three\">آپ کومپیکٹ نوٹیفکیشن میں زیادہ سے زیادہ تین ایکشن منتخب کرسکتے ہیں!</string>\n    <string name=\"notification_actions_summary\">ذیل میں ہر اطلاع کی کارروائی پر ٹیپ کرکے اس میں ترمیم کریں۔ دائیں طرف کے چیک باکسز کا استعمال کرکے کمپیکٹ نوٹیفکیشن میں دکھائے جانے والے ان میں سے تین تک کا انتخاب کریں۔</string>\n    <string name=\"notification_action_4_title\">پانچواں ایکشن بٹن</string>\n    <string name=\"notification_action_3_title\">چوتھا ایکشن بٹن</string>\n    <string name=\"notification_action_2_title\">تیسرا ایکشن بٹن</string>\n    <string name=\"notification_action_1_title\">دوسرا ایکشن بٹن</string>\n    <string name=\"notification_action_0_title\">پہلا ایکشن بٹن</string>\n    <string name=\"notification_scale_to_square_image_summary\">نوٹیفیکیشن میں دکھائے جانے والے ویڈیو تھمب نیل کو 16: 9 سے 1:1 پہلو تناسب میں اسکیل کریں</string>\n    <string name=\"notification_scale_to_square_image_title\">تھمب نیل کو 1:1 کی تناسب میں تراشیں</string>\n    <string name=\"search_showing_result_for\">%s کے لئے نتائج دکھا رہا ہے</string>\n    <string name=\"open_with\">کے ساتھ کھولیں</string>\n    <string name=\"crash_the_player\">ویڈیو پلیئر کو کریش کریں</string>\n    <string name=\"mark_as_watched\">دیکھے ہوئے کو نشان لگائیں</string>\n    <string name=\"local_search_suggestions\">مقامی تلاش کی سفارشات</string>\n    <string name=\"notifications\">اطلاعات</string>\n    <string name=\"start_main_player_fullscreen_title\">مین پلیئر فل اسکرین میں شروع کریں</string>\n    <string name=\"error_report_channel_name\">خرابی کی اطلاع کا نوٹیفکیشن</string>\n    <string name=\"error_report_channel_description\">خرابیوں کی اطلاع کی نوٹیفیکیشنس</string>\n    <string name=\"subtitle_activity_recaptcha\">جب ٹھیک ہو جائے تو \\\"Done\\\" دبائیں</string>\n    <string name=\"recaptcha_solve\">حل کریں</string>\n    <string name=\"faq_title\">زیادہ تر پوچھے گئے سوالات</string>\n    <string name=\"faq_description\">اگر آپ کو یہ ایپ استعمال کرنے میں دشواری آ رہی ہو تو ان عام سوالات کے جوابات کو ضرور دیکھیں!</string>\n    <string name=\"faq\">ویب سائٹ پر دیکھیں</string>\n    <string name=\"error_report_notification_title\">NewPipe کو ایک خرابی کا سامنا کرنا پڑا، رپورٹ کرنے کے لیے ٹیپ کریں</string>\n    <string name=\"settings_category_player_notification_summary\">موجودہ پلیئنگ اسٹریم نوٹیفکیشن کو ترتیب دیں</string>\n    <string name=\"main_page_content_swipe_remove\">آئٹمز کو ہٹانے کے لیے سوائپ کریں</string>\n    <string name=\"night_theme_title\">نائٹ تھیم</string>\n    <string name=\"main_tabs_position_summary\">مین ٹیب سلیکٹر کو نیچے منتقل کریں</string>\n    <string name=\"main_tabs_position_title\">مین ٹیب کی پوزیشن</string>\n    <string name=\"error_report_notification_toast\">ایک خرابی پیش آگئی، نوٹیفکیشن دیکھیں</string>\n    <string name=\"comments_are_disabled\">تبصرے غیر فعال ہیں</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"one\">%s نئی اسٹریم</item>\n        <item quantity=\"other\">%s نئی اسٹریمز</item>\n    </plurals>\n    <string name=\"no_dir_yet\">ابھی تک کوئی ڈاؤن لوڈ فولڈر سیٹ نہیں ہے، ابھی ڈیفالٹ ڈاؤن لوڈ فولڈر کا انتخاب کریں</string>\n    <string name=\"done\">Done</string>\n    <string name=\"title_activity_play_queue\">قطار چلائیں</string>\n    <string name=\"play_queue_audio_track\">آڈیو: %s</string>\n    <string name=\"audio_track\">آڈیو ٹریک</string>\n    <string name=\"show_channel_details\">چینل کی تفصیلات دکھائیں</string>\n    <string name=\"enqueue_stream\">قطار میں</string>\n    <string name=\"enqueued\">قطار میں شامل ہوا</string>\n    <string name=\"enqueue_next_stream\">اگلے کو قطار میں کریں</string>\n    <string name=\"enqueued_next\">اگلا قطار میں کیا گیا</string>\n    <string name=\"duplicate_in_playlist\">جو پلے لسٹس سُرمئی ہو چکے ہیں ان میں یہ آئٹم پہلے سے موجود ہے۔</string>\n    <string name=\"unmute\">غیر خاموش</string>\n    <string name=\"mute\">خاموش</string>\n    <string name=\"processing_may_take_a_moment\">کارروائی ہو رہی ہے… کچھ وقت لگ سکتا ہے</string>\n    <string name=\"restricted_video_no_stream\">یہ ویڈیو اٹھارہ سال سے بڑے لوگوں کے لیے ہے۔\n\\nیو ٹیوب کی نئی پالیسیوں کی وجہ سے نیوپائپ ان ویڈیوز تک رسائی حاصل نہیں کر سکتا لہٰذا اس ویڈیو کو چلانے سے قاصر ہے۔</string>\n    <string name=\"prefer_original_audio_title\">اصل آڈیو کو ترجیح دیں</string>\n    <string name=\"prefer_original_audio_summary\">زبان سے قطع نظر اصل آڈیو ٹریک منتخب کریں</string>\n    <string name=\"prefer_descriptive_audio_title\">وضاحتی آڈیو کو ترجیح دیں</string>\n    <string name=\"left_gesture_control_summary\">پلیئر اسکرین کے بائیں نصف حصے کے لئے اشارے کا انتخاب کریں</string>\n    <string name=\"right_gesture_control_summary\">پلیئر اسکرین کے دائیں نصف حصے کے لئے اشارے کا انتخاب کریں</string>\n    <string name=\"right_gesture_control_title\">دائیں اشارے کا عمل</string>\n    <string name=\"brightness\">چمک</string>\n    <string name=\"volume\">والیوم</string>\n    <string name=\"none\">کچھ نہیں</string>\n    <string name=\"remote_search_suggestions\">ریموٹ تلاش کی تجاویز</string>\n    <string name=\"settings_category_player_notification_title\">پلیئر کی نوٹیفکیشن</string>\n    <string name=\"streams_notification_channel_name\">نئی اسٹریم</string>\n    <string name=\"select_a_playlist\">ایک پلے لسٹ منتخب کریں</string>\n    <string name=\"no_playlist_bookmarked_yet\">ابھی تک کوئی پلے لسٹ بک مارکس نہیں ہے</string>\n    <string name=\"fast_mode\">فاسٹ موڈ</string>\n    <string name=\"import_subscriptions_hint\">3-ڈاٹ مینو سے سبسکرپشن درآمد یا برآمد کریں</string>\n    <string name=\"msg_failed_to_copy\">کلپ بورڈ میں کاپی کرنے میں ناکام</string>\n    <string name=\"loading_stream_details\">اسٹریم کی تفصیلات لوڈ کر رہے ہیں…</string>\n    <string name=\"start_main_player_fullscreen_summary\">منی پلیئر میں ویڈیوز شروع نہ کریں، بلکہ اگر آٹو روٹیشن لاک ہے تو براہ راست فل اسکرین موڈ کا رخ کریں۔ آپ اب بھی فل اسکرین سے باہر نکل کر منی پلیئر تک رسائی حاصل کرسکتے ہیں۔</string>\n    <string name=\"streams_notification_channel_description\">سبسکرپشن کے لئے نئی اسٹریمز کے بارے میں اطلاعات</string>\n    <string name=\"title_activity_recaptcha\">ری کیپچا چیلینج</string>\n    <string name=\"progressive_load_interval_title\">ترتیب کے لیے عنوان۔ ترتیب کی تفصیل یہاں محفوظ ہے: https://hosted.weblate.org/translate/newpipe/strings/en/\\?checksum=b23a75618764df0f</string>\n    <string name=\"prefer_descriptive_audio_summary\">اگر دستیاب ہو تو بصارت سے محروم افراد کے لئے تفصیل کے ساتھ آڈیو ٹریک منتخب کریں</string>\n    <string name=\"left_gesture_control_title\">بائیں اشارے کی کارروائی</string>\n    <string name=\"unset_playlist_thumbnail\">مستقل تھمب نیل کو ان سیٹ کریں</string>\n    <string name=\"ignore_hardware_media_buttons_title\">ہارڈ ویئر میڈیا بٹن کے واقعات کو نظر انداز کریں</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">کار آمد، مثلاً، اگر آپ ہیڈسیٹ ٹوٹے ہوئے فزیکل بٹن کے ساتھ استعمال کر رہے ہیں</string>\n    <string name=\"notification_actions_summary_android13\">ذیل میں ہر اطلاعی کارروائی پر ٹیپ کرکے ترمیم کریں۔ پہلے تین ایکشن (پلے/پاؤز، پچھلی اور اگلی) سسٹم کے ذریعے سیٹ کیے گئے ہیں اور انہیں اپنی مرضی کے مطابق نہیں بنایا جا سکتا۔</string>\n    <string name=\"progressive_load_interval_summary\">پروگریسو مواد پر لوڈ وقفہ کا سائز تبدیل کریں (فی الحال %s)۔ کم کیمیت ان کی ابتدائی لوڈنگ کو تیز کر سکتی ہے</string>\n    <string name=\"tab_bookmarks_short\">پلے لسٹ</string>\n    <string name=\"yes\">ہاں</string>\n    <string name=\"no\">نہیں</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-v27/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- Base Theme -->\n    <style name=\"Base.V27\" parent=\"Base.V21\">\n        <item name=\"android:navigationBarColor\">@android:color/transparent</item>\n    </style>\n    <style name=\"Base\" parent=\"Base.V27\"/>\n\n    <!-- Light Theme -->\n    <style name=\"Base.V27.LightTheme\" parent=\"Base.V21.LightTheme\">\n        <item name=\"android:windowLightNavigationBar\">true</item>\n    </style>\n    <style name=\"Base.LightTheme\" parent=\"Base.V27.LightTheme\" />\n\n    <!-- Dark Theme -->\n    <style name=\"Base.V27.DarkTheme\" parent=\"Base.V21.DarkTheme\">\n        <item name=\"android:windowLightNavigationBar\">false</item>\n    </style>\n    <style name=\"Base.DarkTheme\" parent=\"Base.V27.DarkTheme\" />\n\n    <!-- Black Theme -->\n    <style name=\"Base.V27.BlackTheme\" parent=\"Base.V21.BlackTheme\">\n        <!-- BlackTheme inherits DarkTheme, so no need to specify windowLightNavigationBar here -->\n    </style>\n    <style name=\"Base.BlackTheme\" parent=\"Base.V27.BlackTheme\" />\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-v29/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- Base Theme -->\n    <style name=\"Base.V29\" parent=\"Base.V27\">\n        <item name=\"android:enforceNavigationBarContrast\">false</item>\n    </style>\n    <style name=\"Base\" parent=\"Base.V29\"/>\n\n    <!-- Light Theme -->\n    <style name=\"Base.V29.LightTheme\" parent=\"Base.V27.LightTheme\">\n    </style>\n    <style name=\"Base.LightTheme\" parent=\"Base.V29.LightTheme\" />\n\n    <!-- Dark Theme -->\n    <style name=\"Base.V29.DarkTheme\" parent=\"Base.V27.DarkTheme\">\n\n    </style>\n    <style name=\"Base.DarkTheme\" parent=\"Base.V29.DarkTheme\" />\n\n    <!-- Black Theme -->\n    <style name=\"Base.V29.BlackTheme\" parent=\"Base.V27.BlackTheme\">\n\n    </style>\n    <style name=\"Base.BlackTheme\" parent=\"Base.V29.BlackTheme\" />\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-v35/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- Base Theme -->\n    <style name=\"Base.V35\" parent=\"Base.V29\">\n        <item name=\"android:windowOptOutEdgeToEdgeEnforcement\">true</item>\n    </style>\n    <style name=\"Base\" parent=\"Base.V35\"/>\n\n    <!-- Light Theme -->\n    <style name=\"Base.V35.LightTheme\" parent=\"Base.V29.LightTheme\">\n    </style>\n    <style name=\"Base.LightTheme\" parent=\"Base.V35.LightTheme\" />\n\n    <!-- Dark Theme -->\n    <style name=\"Base.V35.DarkTheme\" parent=\"Base.V29.DarkTheme\">\n\n    </style>\n    <style name=\"Base.DarkTheme\" parent=\"Base.V35.DarkTheme\" />\n\n    <!-- Black Theme -->\n    <style name=\"Base.V35.BlackTheme\" parent=\"Base.V29.BlackTheme\">\n\n    </style>\n    <style name=\"Base.BlackTheme\" parent=\"Base.V35.BlackTheme\" />\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-vi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">Nhấn vào kính lúp để bắt đầu.</string>\n    <string name=\"upload_date_text\">Đăng vào %1$s</string>\n    <string name=\"no_player_found\">Không tìm thấy trình phát trực tuyến. Cài đặt VLC\\?</string>\n    <string name=\"install\">Cài đặt</string>\n    <string name=\"cancel\">Hủy</string>\n    <string name=\"open_in_browser\">Mở trong trình duyệt</string>\n    <string name=\"open_in_popup_mode\">Mở trong cửa sổ bật lên</string>\n    <string name=\"share\">Chia sẻ</string>\n    <string name=\"download\">Tải xuống</string>\n    <string name=\"search\">Tìm kiếm</string>\n    <string name=\"settings\">Cài đặt</string>\n    <string name=\"did_you_mean\">Ý bạn là \\\"%1$s\\\"\\?</string>\n    <string name=\"share_dialog_title\">Chia sẻ với</string>\n    <string name=\"use_external_video_player_title\">Sử dụng trình phát video bên ngoài</string>\n    <string name=\"use_external_video_player_summary\">Loại bỏ âm thanh ở một số độ phân giải</string>\n    <string name=\"use_external_audio_player_title\">Sử dụng trình phát âm thanh bên ngoài</string>\n    <string name=\"controls_popup_title\">Bật lên</string>\n    <string name=\"download_path_title\">Thư mục video tải về</string>\n    <string name=\"download_path_summary\">Video đã tải về được lưu ở đây</string>\n    <string name=\"download_path_dialog_title\">Chọn thư mục tải xuống cho các tệp video</string>\n    <string name=\"download_path_audio_title\">Thư mục tải xuống âm thanh</string>\n    <string name=\"download_path_audio_summary\">Các tệp âm thanh đã tải xuống được lưu trữ tại đây</string>\n    <string name=\"download_path_audio_dialog_title\">Chọn thư mục tải xuống cho các tệp âm thanh</string>\n    <string name=\"default_resolution_title\">Độ phân giải mặc định</string>\n    <string name=\"default_popup_resolution_title\">Độ phân giải cửa sổ bật lên mặc định</string>\n    <string name=\"show_higher_resolutions_title\">Hiện độ phân giải cao hơn</string>\n    <string name=\"show_higher_resolutions_summary\">Chỉ một số thiết bị có thể phát video 2K/4K</string>\n    <string name=\"play_with_kodi_title\">Phát với Kodi</string>\n    <string name=\"kore_not_found\">Cài đặt ứng dụng Kore bị thiếu\\?</string>\n    <string name=\"show_play_with_kodi_title\">Hiển thị tùy chọn \\\"Phát với Kodi\\\"</string>\n    <string name=\"show_play_with_kodi_summary\">Hiển thị tùy chọn phát video qua trung tâm truyền thông Kodi</string>\n    <string name=\"play_audio\">Âm thanh</string>\n    <string name=\"default_audio_format_title\">Định dạng âm thanh mặc định</string>\n    <string name=\"default_video_format_title\">Định dạng video mặc định</string>\n    <string name=\"controls_background_title\">Nền</string>\n    <string name=\"theme_title\">Chủ đề</string>\n    <string name=\"light_theme_title\">Sáng</string>\n    <string name=\"dark_theme_title\">Tối</string>\n    <string name=\"black_theme_title\">Đen</string>\n    <string name=\"popup_remember_size_pos_title\">Ghi nhớ thuộc tính cửa sổ bật lên</string>\n    <string name=\"popup_remember_size_pos_summary\">Ghi nhớ kích thước và vị trí cuối cùng của cửa sổ bật lên</string>\n    <string name=\"show_search_suggestions_title\">Đề xuất tìm kiếm</string>\n    <string name=\"show_search_suggestions_summary\">Chọn các đề xuất để hiển thị khi tìm kiếm</string>\n    <string name=\"download_dialog_title\">Tải xuống</string>\n    <string name=\"show_next_and_similar_title\">Hiện các video \\\"Tiếp theo\\\" và \\\"Tương tự\\\"</string>\n    <string name=\"unsupported_url\">URL không hỗ trợ</string>\n    <string name=\"settings_category_appearance_title\">Vẻ ngoài</string>\n    <string name=\"background_player_playing_toast\">Đang phát trong nền</string>\n    <string name=\"popup_playing_toast\">Đang phát trong chế độ bật lên</string>\n    <string name=\"content\">Nội dung</string>\n    <string name=\"show_age_restricted_content_title\">Hiển thị nội dung bị giới hạn độ tuổi</string>\n    <string name=\"duration_live\">Trực tiếp</string>\n    <string name=\"downloads\">Tải xuống</string>\n    <string name=\"downloads_title\">Tải xuống</string>\n    <string name=\"error_report_title\">Báo lỗi</string>\n    <string name=\"all\">Tất cả</string>\n    <string name=\"disabled\">Vô hiệu</string>\n    <string name=\"clear\">Xóa</string>\n    <string name=\"best_resolution\">Độ phân giải tốt nhất</string>\n    <string name=\"general_error\">Lỗi</string>\n    <string name=\"network_error\">Lỗi kết nối mạng</string>\n    <string name=\"could_not_load_thumbnails\">Không thể tải tất cả hình thu nhỏ</string>\n    <string name=\"parsing_error\">Không thể phân tích cú pháp trang web vì trang này đã ngừng hoạt động vào 21/07/2025.</string>\n    <string name=\"content_not_available\">Nội dung không khả dụng</string>\n    <string name=\"could_not_setup_download_menu\">Không thể thiết lập menu tải về</string>\n    <string name=\"app_ui_crash\">Ứng dụng/Giao diện người dùng bị lỗi</string>\n    <string name=\"sorry_string\">Có vẻ NewPipe đã xảy ra lỗi, lướt xuống kiểm tra xem.</string>\n    <string name=\"error_report_button_text\">Báo lỗi qua email</string>\n    <string name=\"error_snackbar_message\">Rất tiếc, đã xảy ra lỗi.</string>\n    <string name=\"error_snackbar_action\">Báo cáo</string>\n    <string name=\"what_device_headline\">Thông tin:</string>\n    <string name=\"what_happened_headline\">Chuyện gì đã xảy ra:</string>\n    <string name=\"info_labels\">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:</string>\n    <string name=\"your_comment\">Nhận xét của bạn (bằng tiếng Anh):</string>\n    <string name=\"error_details_headline\">Chi tiết:</string>\n    <string name=\"detail_thumbnail_view_description\">Phát video, thời lượng:</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">Hình thu nhỏ của avatar người tải lên</string>\n    <string name=\"detail_likes_img_view_description\">Lượt thích</string>\n    <string name=\"detail_dislikes_img_view_description\">Lượt không thích</string>\n    <string name=\"video\">Video</string>\n    <string name=\"audio\">Âm thanh</string>\n    <string name=\"retry\">Thử lại</string>\n    <string name=\"start\">Bắt đầu</string>\n    <string name=\"pause\">Dừng</string>\n    <string name=\"delete\">Xóa</string>\n    <string name=\"checksum\">Mã tổng kiểm (checksum)</string>\n    <string name=\"ok\">OK</string>\n    <string name=\"msg_name\">Tên file</string>\n    <string name=\"msg_threads\">Chủ đề</string>\n    <string name=\"msg_error\">Lỗi</string>\n    <string name=\"msg_running\">NewPipe đang tải xuống</string>\n    <string name=\"msg_running_detail\">Chạm để biết chi tiết</string>\n    <string name=\"msg_wait\">Vui lòng chờ…</string>\n    <string name=\"msg_copied\">Đã sao chép vào khay nhớ tạm</string>\n    <string name=\"no_available_dir\">Vui lòng xác định thư mục tải xuống sau trong cài đặt</string>\n    <string name=\"msg_popup_permission\">Sự cho phép này là cần thiết để\n\\nmở trong chế độ bật lên</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA</string>\n    <string name=\"recaptcha_request_toast\">Yêu cầu reCAPTCHA</string>\n    <string name=\"title_activity_about\">Giới thiệu về NewPipe</string>\n    <string name=\"title_licenses\">Giấy phép của bên thứ ba</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s bởi %2$s dưới %3$s</string>\n    <string name=\"tab_about\">Giới thiệu &amp; Câu hỏi thường gặp</string>\n    <string name=\"tab_licenses\">Giấy phép</string>\n    <string name=\"app_description\">Phát trực tuyến nhẹ tự do trên Android.</string>\n    <string name=\"view_on_github\">Xem trên GitHub</string>\n    <string name=\"app_license_title\">Giấy phép của NewPipe</string>\n    <string name=\"contribution_encouragement\">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!</string>\n    <string name=\"read_full_license\">Đọc giấy phép</string>\n    <string name=\"contribution_title\">Đóng góp</string>\n    <string name=\"content_language_title\">Ngôn ngữ nội dung ưu tiên</string>\n    <string name=\"settings_category_video_audio_title\">Video và âm thanh</string>\n    <string name=\"enable_watch_history_title\">Lịch sử xem</string>\n    <string name=\"settings_category_history_title\">Lịch sử và bộ nhớ đệm</string>\n    <string name=\"search_no_results\">Không tìm thấy</string>\n    <string name=\"subscribe_button_title\">Đăng ký</string>\n    <string name=\"subscribed_button_title\">Đã đăng ký</string>\n    <string name=\"channel_unsubscribed\">Đã hủy đăng ký kênh</string>\n    <string name=\"subscription_change_failed\">Không thể thay đổi tình trạng đăng ký</string>\n    <string name=\"subscription_update_failed\">Không thể cập nhật tình trạng đăng ký</string>\n    <string name=\"no_player_found_toast\">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).</string>\n    <string name=\"controls_download_desc\">Tải tệp luồng về</string>\n    <string name=\"show_info\">Hiện thông tin</string>\n    <string name=\"tab_subscriptions\">Kênh đăng ký</string>\n    <string name=\"tab_bookmarks\">Đã đánh dấu danh sách phát</string>\n    <string name=\"fragment_feed_title\">Có gì mới</string>\n    <string name=\"controls_add_to_playlist_title\">Thêm vào</string>\n    <string name=\"use_inexact_seek_title\">Dùng tua nhanh ít chính xác</string>\n    <string name=\"use_inexact_seek_summary\">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</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">Đã xóa bộ nhớ cache hình ảnh</string>\n    <string name=\"metadata_cache_wipe_title\">Xóa sạch siêu dữ liệu đã lưu đệm</string>\n    <string name=\"metadata_cache_wipe_summary\">Xóa tất cả dữ liệu trang web được lưu trong bộ nhớ cache</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">Đã xóa bộ nhớ cache siêu dữ liệu</string>\n    <string name=\"auto_queue_title\">Tự động thêm vào hàng đợi luồng phát tiếp theo</string>\n    <string name=\"auto_queue_summary\">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</string>\n    <string name=\"enable_search_history_title\">Lịch sử tìm kiếm</string>\n    <string name=\"enable_search_history_summary\">Lưu trữ truy vấn tìm kiếm cục bộ</string>\n    <string name=\"enable_watch_history_summary\">Theo dõi các video đã xem</string>\n    <string name=\"resume_on_audio_focus_gain_title\">Tiếp tục đang phát</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">Tiếp tục phát lại sau khi bị gián đoạn (ví dụ: cuộc gọi)</string>\n    <string name=\"show_hold_to_append_title\">Hiển thị mẹo \\\"Giữ để thêm vào hàng đợi\\\"</string>\n    <string name=\"show_hold_to_append_summary\">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</string>\n    <string name=\"default_content_country_title\">Quốc gia nội dung mặc định</string>\n    <string name=\"settings_category_player_title\">Trình phát</string>\n    <string name=\"settings_category_player_behavior_title\">Hành vi</string>\n    <string name=\"settings_category_debug_title\">Gỡ lỗi</string>\n    <string name=\"channels\">Kênh</string>\n    <string name=\"playlists\">Danh sách phát</string>\n    <string name=\"tracks\">Bản nhạc</string>\n    <string name=\"users\">Người dùng</string>\n    <string name=\"undo\">Hoàn tác</string>\n    <string name=\"play_all\">Phát tất cả</string>\n    <string name=\"always\">Luôn luôn</string>\n    <string name=\"just_once\">Chỉ một lần</string>\n    <string name=\"file\">Tập tin</string>\n    <string name=\"notification_channel_name\">Thông báo NewPipe</string>\n    <string name=\"notification_channel_description\">Thông báo cho trình phát của NewPipe</string>\n    <string name=\"unknown_content\">[Không xác định]</string>\n    <string name=\"switch_to_background\">Chuyển sang nền</string>\n    <string name=\"switch_to_popup\">Chuyển sang Cửa sổ bật lên</string>\n    <string name=\"switch_to_main\">Chuyển sang Chính</string>\n    <string name=\"import_data_title\">Nhập cơ sở dữ liệu</string>\n    <string name=\"export_data_title\">Xuất cơ sở dữ liệu</string>\n    <string name=\"import_data_summary\">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</string>\n    <string name=\"export_data_summary\">Xuất lịch sử, đăng ký, danh sách phát và các cài đặt</string>\n    <string name=\"clear_views_history_title\">Xóa lịch sử xem</string>\n    <string name=\"clear_views_history_summary\">Xóa lịch sử các luồng đã phát và các vị trí phát lại</string>\n    <string name=\"delete_view_history_alert\">Xóa toàn bộ lịch sử xem\\?</string>\n    <string name=\"watch_history_deleted\">Đã xoá lịch sử xem</string>\n    <string name=\"clear_search_history_title\">Xóa lịch sử tìm kiếm</string>\n    <string name=\"clear_search_history_summary\">Xóa lịch sử tìm kiếm mà bạn đã ghi</string>\n    <string name=\"delete_search_history_alert\">Xóa toàn bộ lịch sử tìm kiếm\\?</string>\n    <string name=\"search_history_deleted\">Đã xóa lịch sử tìm kiếm</string>\n    <string name=\"player_stream_failure\">Không thể phát luồng này</string>\n    <string name=\"player_unrecoverable_failure\">Đã xảy ra lỗi trình phát không thể khôi phục</string>\n    <string name=\"player_recoverable_failure\">Phục hồi lại trình phát bị lỗi</string>\n    <string name=\"external_player_unsupported_link_type\">Trình phát ngoài không hỗ trợ các loại liên kết này</string>\n    <string name=\"video_streams_empty\">Không tìm thấy luồng video nào</string>\n    <string name=\"audio_streams_empty\">Không tìm thấy luồng âm thanh nào</string>\n    <string name=\"invalid_directory\">Thư mục không hợp lệ</string>\n    <string name=\"invalid_source\">Tệp/nguồn nội dung không hợp lệ</string>\n    <string name=\"invalid_file\">Tệp không tồn tại hoặc không có quyền đọc/ghi</string>\n    <string name=\"file_name_empty_error\">Tên tệp không được để trống</string>\n    <string name=\"error_occurred_detail\">Đã xảy ra lỗi: %1$s</string>\n    <string name=\"no_streams_available_download\">Không có luồng nào để tải về</string>\n    <string name=\"empty_list_subtitle\">Không có gì cả :P</string>\n    <string name=\"detail_drag_description\">Kéo để sắp xếp lại</string>\n    <string name=\"no_subscribers\">Không có người đăng ký</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"other\">%s người đăng ký</item>\n    </plurals>\n    <string name=\"no_views\">Không có lượt xem nào</string>\n    <plurals name=\"views\">\n        <item quantity=\"other\">%s lượt xem</item>\n    </plurals>\n    <string name=\"no_videos\">Không có video nào</string>\n    <plurals name=\"videos\">\n        <item quantity=\"other\">%s video</item>\n    </plurals>\n    <string name=\"create\">Tạo</string>\n    <string name=\"dismiss\">Bỏ qua</string>\n    <string name=\"rename\">Đổi tên</string>\n    <string name=\"one_item_deleted\">Đã xóa 1 mục.</string>\n    <string name=\"settings_category_downloads_title\">Tải xuống</string>\n    <string name=\"settings_file_charset_title\">Các ký tự được cho phép trong tên tệp</string>\n    <string name=\"settings_file_replacement_character_summary\">Ký tự không hợp lệ được thay thế bằng giá trị này</string>\n    <string name=\"settings_file_replacement_character_title\">Ký tự thay thế</string>\n    <string name=\"charset_letters_and_digits\">Chỉ chữ cái và chữ số</string>\n    <string name=\"charset_most_special_characters\">Hầu hết các ký tự đặc biệt</string>\n    <string name=\"donation_title\">Quyên tặng</string>\n    <string name=\"donation_encouragement\">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ê.</string>\n    <string name=\"give_back\">Đền đáp</string>\n    <string name=\"website_title\">Trang web</string>\n    <string name=\"website_encouragement\">Truy cập website chính thức của NewPipe để biết thêm thông tin và tin tức.</string>\n    <string name=\"privacy_policy_title\">Chính sách bảo mật của NewPipe</string>\n    <string name=\"privacy_policy_encouragement\">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.\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ố.</string>\n    <string name=\"read_privacy_policy\">Đọc chính sách bảo mật</string>\n    <string name=\"app_license\">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.</string>\n    <string name=\"title_activity_history\">Lịch sử</string>\n    <string name=\"action_history\">Lịch sử</string>\n    <string name=\"delete_item_search_history\">Bạn có muốn xóa mục này khỏi lịch sử tìm kiếm không?</string>\n    <string name=\"title_last_played\">Lần phát cuối</string>\n    <string name=\"title_most_played\">Được phát nhiều nhất</string>\n    <string name=\"main_page_content\">Nội dung trang chính</string>\n    <string name=\"blank_page_summary\">Trang trống</string>\n    <string name=\"kiosk_page_summary\">Trang chủ</string>\n    <string name=\"channel_page_summary\">Trang kênh</string>\n    <string name=\"select_a_channel\">Chọn kênh</string>\n    <string name=\"no_channel_subscribed_yet\">Chưa đăng ký kênh nào</string>\n    <string name=\"select_a_kiosk\">Chọn Trang chủ</string>\n    <string name=\"export_complete_toast\">Đã xuất</string>\n    <string name=\"import_complete_toast\">Đã nhập</string>\n    <string name=\"no_valid_zip_file\">Không có tệp ZIP hợp lệ</string>\n    <string name=\"could_not_import_all_files\">Cảnh báo: Không thể nhập tất cả các tệp.</string>\n    <string name=\"override_current_data\">Thao tác này sẽ ghi đè cài đặt hiện tại của bạn.</string>\n    <string name=\"import_settings\">Bạn có muốn cũng nhập các cài đặt không?</string>\n    <string name=\"trending\">Đang thịnh hành</string>\n    <string name=\"new_and_hot\">Mới và phổ biến</string>\n    <string name=\"play_queue_remove\">Loại bỏ</string>\n    <string name=\"play_queue_stream_detail\">Chi tiết</string>\n    <string name=\"play_queue_audio_settings\">Cài đặt âm thanh</string>\n    <string name=\"hold_to_append\">Chờ để thêm vào hàng đợi</string>\n    <string name=\"start_here_on_background\">Bắt đầu phát trong nền</string>\n    <string name=\"start_here_on_popup\">Bắt đầu phát trong cửa sổ bật lên</string>\n    <string name=\"drawer_open\">Mở ngăn kéo</string>\n    <string name=\"drawer_close\">Đóng ngăn</string>\n    <string name=\"preferred_open_action_settings_title\">Ưu tiên hành động \\'mở\\'</string>\n    <string name=\"preferred_open_action_settings_summary\">Hành động mặc định khi mở nội dung — %s</string>\n    <string name=\"video_player\">Trình phát video</string>\n    <string name=\"background_player\">Trình phát trong nền</string>\n    <string name=\"popup_player\">Trình phát cửa sổ nổi</string>\n    <string name=\"always_ask_open_action\">Luôn hỏi</string>\n    <string name=\"preferred_player_fetcher_notification_title\">Đang nhận thông tin…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">Đang tải nội dung được yêu cầu</string>\n    <string name=\"create_playlist\">Danh sách phát mới</string>\n    <string name=\"rename_playlist\">Đổi tên</string>\n    <string name=\"name\">Tên</string>\n    <string name=\"add_to_playlist\">Thêm vào danh sách phát</string>\n    <string name=\"set_as_playlist_thumbnail\">Đặt làm hình thu nhỏ của danh sách phát</string>\n    <string name=\"bookmark_playlist\">Đánh dấu danh sách phát</string>\n    <string name=\"unbookmark_playlist\">Loại bỏ đánh dấu</string>\n    <string name=\"delete_playlist_prompt\">Xóa danh sách phát này\\?</string>\n    <string name=\"playlist_creation_success\">Đã tạo danh sách phát</string>\n    <string name=\"playlist_add_stream_success\">Đã thêm danh sách phát</string>\n    <string name=\"playlist_thumbnail_change_success\">Hình thu nhỏ của danh sách phát đã thay đổi.</string>\n    <string name=\"caption_none\">Không có phụ đề</string>\n    <string name=\"resize_fit\">Phù hợp</string>\n    <string name=\"resize_fill\">Lấp đầy</string>\n    <string name=\"resize_zoom\">Thu phóng</string>\n    <string name=\"caption_auto_generated\">Tự động tạo ra</string>\n    <string name=\"caption_setting_title\">Phụ đề</string>\n    <string name=\"caption_setting_description\">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</string>\n    <string name=\"enable_leak_canary_summary\">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ữ</string>\n    <string name=\"enable_disposed_exceptions_title\">Báo cáo lỗi ngoài vòng đời</string>\n    <string name=\"enable_disposed_exceptions_summary\">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ý</string>\n    <string name=\"import_title\">Nhập</string>\n    <string name=\"import_from\">Nhập từ</string>\n    <string name=\"export_to\">Xuất sang</string>\n    <string name=\"import_ongoing\">Đang nhập…</string>\n    <string name=\"export_ongoing\">Đang xuất…</string>\n    <string name=\"import_file_title\">Nhập tệp</string>\n    <string name=\"previous_export\">Xuất trước</string>\n    <string name=\"subscriptions_import_unsuccessful\">Không thể nhập kênh đăng ký</string>\n    <string name=\"subscriptions_export_unsuccessful\">Không thể xuất kênh đăng ký</string>\n    <string name=\"import_youtube_instructions\">Nhập danh sách đăng ký YouTube từ Google Takeout:\n\\n\n\\n1. Vào URL này: %1$s\n\\n2. Đăng nhập khi được yêu cầu\n\\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\n\\n4. Nhấn nút \\\"Bước tiếp theo\\\" rồi nhấn \\\"Tạo tệp xuất\\\"\n\\n5. Nhấn nút \\\"Tải xuống\\\" khi nó xuất hiện\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.\n\\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</string>\n    <string name=\"import_soundcloud_instructions\">Để 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\\n\n\\n1. Bật \\\"chế độ máy tính\\\" trong trình duyệt web (trang web không khả dụng cho thiết bị di động)\n\\n2. Truy cập URL này: %1$s\n\\n3. Đăng nhập khi được hỏi\n\\n4. Sao chép URL tiểu sử mà bạn đã được chuyển hướng đến.</string>\n    <string name=\"import_network_expensive_warning\">Hãy nhớ rằng hoạt động này có thể khiến bạn bị mất kênh bạn đã đăng ký trước đó.\n\\n\n\\nBạn có muốn tiếp tục không\\?</string>\n    <string name=\"playback_speed_control\">Điều khiển tốc độ phát lại</string>\n    <string name=\"playback_tempo\">Tốc độ</string>\n    <string name=\"playback_pitch\">Độ cao</string>\n    <string name=\"unhook_checkbox\">Bỏ gắn (có thể gây méo)</string>\n    <string name=\"skip_silence_checkbox\">Chuyển nhanh qua khoảng lặng</string>\n    <string name=\"playback_step\">Bước</string>\n    <string name=\"playback_reset\">Đặt lại</string>\n    <string name=\"start_accept_privacy_policy\">Để 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ỹ.\n\\nBạn phải chấp nhận nó để gửi cho chúng tôi báo cáo lỗi.</string>\n    <string name=\"accept\">Chấp nhận</string>\n    <string name=\"decline\">Từ chối</string>\n    <string name=\"limit_data_usage_none_description\">Không giới hạn</string>\n    <string name=\"limit_mobile_data_usage_title\">Giới hạn độ phân giải khi sử dụng dữ liệu di động</string>\n    <string name=\"minimize_on_exit_title\">Thu nhỏ khi chuyển qua ứng dụng khác</string>\n    <string name=\"minimize_on_exit_summary\">Hành động khi chuyển sang ứng dụng khác từ trình phát video chính — %s</string>\n    <string name=\"minimize_on_exit_none_description\">Không</string>\n    <string name=\"minimize_on_exit_background_description\">Thu nhỏ xuống trình phát nền</string>\n    <string name=\"minimize_on_exit_popup_description\">Thu nhỏ xuống trình phát bật lên</string>\n    <string name=\"unsubscribe\">Hủy đăng ký</string>\n    <string name=\"tab_choose\">Chọn tab</string>\n    <string name=\"settings_category_updates_title\">Cập nhật</string>\n    <string name=\"events\">Sự kiện</string>\n    <string name=\"file_deleted\">Đã xóa tập tin</string>\n    <string name=\"app_update_notification_channel_name\">Thông báo cập nhật ứng dụng</string>\n    <string name=\"app_update_notification_channel_description\">Thông báo phiên bản NewPipe mới</string>\n    <string name=\"download_to_sdcard_error_title\">Bộ nhớ ngoài không khả dụng</string>\n    <string name=\"download_to_sdcard_error_message\">Không thể tải vào thẻ SD ngoài. Đặt lại vị trí tải về\\?</string>\n    <string name=\"saved_tabs_invalid_json\">Không thể đọc tab đã lưu, sử dụng tab mặc định</string>\n    <string name=\"restore_defaults\">Khôi phục về mặc định</string>\n    <string name=\"restore_defaults_confirmation\">Bạn có muốn khôi phục về mặc định\\?</string>\n    <string name=\"subscribers_count_not_available\">Số người đăng ký không khả dụng</string>\n    <string name=\"main_page_content_summary\">Chọn các tab để hiện trên trang chủ</string>\n    <string name=\"top_50\">Top 50 phổ biến</string>\n    <string name=\"import_soundcloud_instructions_hint\">Nhập ID SoundCloud hoặc link soundcloud.com/&lt;ID của bạn&gt;</string>\n    <string name=\"updates_setting_title\">Cập nhật</string>\n    <string name=\"updates_setting_description\">Hiển thị thông báo để nhắc cập nhật ứng dụng khi có phiên bản mới</string>\n    <string name=\"list_view_mode\">Chế độ hiển thị danh sách</string>\n    <string name=\"list\">Danh sách</string>\n    <string name=\"grid\">Lưới</string>\n    <string name=\"auto\">Tự động</string>\n    <string name=\"app_update_available_notification_title\">Đã có bản cập nhật mới!</string>\n    <string name=\"missions_header_finished\">Xong</string>\n    <string name=\"paused\">đã tạm dừng</string>\n    <string name=\"queued\">trong hàng đợi</string>\n    <string name=\"post_processing\">đang xử lý</string>\n    <string name=\"enqueue\">Xếp hàng</string>\n    <string name=\"permission_denied\">Thao tác bị từ chối bởi hệ thống</string>\n    <string name=\"download_failed\">Tải xuống thất bại</string>\n    <string name=\"generate_unique_name\">Tạo tên riêng biệt</string>\n    <string name=\"overwrite\">Ghi đè</string>\n    <string name=\"overwrite_finished_warning\">Có một tệp đã tải về trùng tên</string>\n    <string name=\"download_already_running\">Có một tệp trùng tên đang tải về</string>\n    <string name=\"show_error\">Hiện lỗi</string>\n    <string name=\"error_file_creation\">Không thể tạo tệp</string>\n    <string name=\"error_path_creation\">Không thể tạo thư mục đích</string>\n    <string name=\"error_ssl_exception\">Không thể thiết lập kết nối an toàn</string>\n    <string name=\"error_unknown_host\">Không thể tìm máy chủ</string>\n    <string name=\"error_connect_host\">Không thế kết nối với máy chủ</string>\n    <string name=\"error_http_no_content\">Máy chủ không gửi dữ liệu về</string>\n    <string name=\"error_http_unsupported_range\">Máy chủ không chấp nhận tải đa luồng, thử lại với số luồng = 1</string>\n    <string name=\"error_http_not_found\">Không tìm thấy</string>\n    <string name=\"error_postprocessing_failed\">Xử lý thất bại</string>\n    <string name=\"stop\">Dừng</string>\n    <string name=\"max_retry_msg\">Số lượt thử lại tối đa</string>\n    <string name=\"max_retry_desc\">Số lượt thử lại trước khi hủy tải về</string>\n    <string name=\"pause_downloads_on_mobile\">Tạm dừng tải khi trên dữ liệu di động</string>\n    <string name=\"pause_downloads_on_mobile_desc\">Hữu ích khi chuyển sang dữ liệu di động, nhưng một số tải xuống không thể bị đình chỉ</string>\n    <string name=\"missions_header_pending\">Đang chờ xử lý</string>\n    <string name=\"conferences\">Hội thảo</string>\n    <string name=\"show_comments_title\">Hiện bình luận</string>\n    <string name=\"show_comments_summary\">Tắt để ẩn bình luận</string>\n    <string name=\"autoplay_title\">Tự động phát</string>\n    <string name=\"no_comments\">Không có bình luận nào</string>\n    <string name=\"error_unable_to_load_comments\">Không thể tải bình luận</string>\n    <string name=\"close\">Đóng</string>\n    <string name=\"enable_playback_resume_title\">Tiếp tục phát lại</string>\n    <string name=\"enable_playback_resume_summary\">Khôi phục vị trí phát lại cuối cùng</string>\n    <string name=\"enable_playback_state_lists_title\">Vị trí phát trong danh sách</string>\n    <string name=\"enable_playback_state_lists_summary\">Hiển chỉ báo vị trí phát lại trong danh sách</string>\n    <string name=\"settings_category_clear_data_title\">Xóa dữ liệu</string>\n    <string name=\"watch_history_states_deleted\">Đã xoá vị trí phát</string>\n    <string name=\"missing_file\">Tệp đã di chuyển hoặc đã xoá</string>\n    <string name=\"overwrite_unrelated_warning\">Tên file này đã tồn tại</string>\n    <string name=\"overwrite_failed\">Không thể ghi đè lên tệp</string>\n    <string name=\"download_already_pending\">Có một bản tải xuống đang chờ xử lý với tên này</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe đã bị đóng khi đang xử lý tệp</string>\n    <string name=\"error_insufficient_storage_left\">Không đủ dung lượng trên máy</string>\n    <string name=\"error_progress_lost\">Quá trình tải bị hủy, vì tập tin đã bị xoá</string>\n    <string name=\"error_timeout\">Kết nối hết thời gian</string>\n    <string name=\"confirm_prompt\">Bạn muốn xóa lịch sử tải về hay xóa tất cả những file đã tải về\\?</string>\n    <string name=\"enable_queue_limit\">Giới hạn hàng chờ tải xuống</string>\n    <string name=\"enable_queue_limit_desc\">Chỉ một lần tải mỗi lượt</string>\n    <string name=\"start_downloads\">Bắt đầu tải xuống</string>\n    <string name=\"pause_downloads\">Tạm dừng tải xuống</string>\n    <string name=\"downloads_storage_ask_title\">Hỏi nơi thư mục để tải xuống</string>\n    <string name=\"downloads_storage_ask_summary\">Bạn sẽ được hỏi nơi lưu vào mỗi lần tải xuống.\n\\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ớ</string>\n    <string name=\"clear_playback_states_title\">Xóa vị trí phát</string>\n    <string name=\"clear_playback_states_summary\">Xóa tất cả vị trí phát</string>\n    <string name=\"delete_playback_states_alert\">Xóa tất cả vị trí phát\\?</string>\n    <string name=\"feed_groups_header_title\">Nhóm kênh</string>\n    <string name=\"choose_instance_prompt\">Chọn một thực thể</string>\n    <string name=\"peertube_instance_add_exists\">Thực thể đã tồn tại</string>\n    <string name=\"peertube_instance_add_fail\">Không thể xác nhận thực thể</string>\n    <string name=\"peertube_instance_add_help\">Nhập URL thực thể</string>\n    <string name=\"peertube_instance_add_title\">Thêm thực thể</string>\n    <string name=\"peertube_instance_url_help\">Tìm thực thể bạn thích trên %s</string>\n    <plurals name=\"days\">\n        <item quantity=\"other\">%d ngày</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"other\">%d giờ</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"other\">%d phút</item>\n    </plurals>\n    <plurals name=\"seconds\">\n        <item quantity=\"other\">%d giây</item>\n    </plurals>\n    <string name=\"remove_watched_popup_partially_watched_streams\">Có, và video đã xem một phần</string>\n    <string name=\"remove_watched_popup_warning\">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!</string>\n    <string name=\"remove_watched_popup_title\">Xóa các video đã xem?</string>\n    <string name=\"remove_watched\">Loại bỏ đã xem</string>\n    <string name=\"systems_language\">Mặc định hệ thống</string>\n    <string name=\"app_language_title\">Ngôn ngữ ứng dụng</string>\n    <string name=\"downloads_storage_use_saf_summary\">\\'Khung truy cập lưu trữ\\' cho phép tải xuống một thẻ SD bên ngoài</string>\n    <string name=\"downloads_storage_use_saf_title\">Sử dụng trình chọn thư mục của hệ thống (SAF)</string>\n    <string name=\"delete_downloaded_files\">Xóa file đã tải về</string>\n    <string name=\"clear_download_history\">Xóa lịch sử tải về</string>\n    <string name=\"error_download_resource_gone\">Không thể khôi phục bản tải xuống này</string>\n    <string name=\"unmute\">Bật tiếng</string>\n    <string name=\"mute\">Tắt tiếng</string>\n    <string name=\"most_liked\">Được yêu thích nhất</string>\n    <string name=\"recently_added\">Đã thêm gần đây</string>\n    <string name=\"subtitle_activity_recaptcha\">Bấm \\\"Xong\\\" khi hoàn thành</string>\n    <string name=\"done\">Đã hoàn thành</string>\n    <string name=\"infinite_videos\">∞ video</string>\n    <string name=\"more_than_100_videos\">100+ video</string>\n    <plurals name=\"listening\">\n        <item quantity=\"other\">%s người nghe</item>\n    </plurals>\n    <string name=\"no_one_listening\">Không có người nghe</string>\n    <string name=\"no_one_watching\">Không có người xem</string>\n    <plurals name=\"watching\">\n        <item quantity=\"other\">%s người xem</item>\n    </plurals>\n    <string name=\"permission_display_over_apps\">Cho phép hiển thị trên các ứng dụng khác</string>\n    <string name=\"artists\">Nghệ sĩ</string>\n    <string name=\"albums\">Album</string>\n    <string name=\"songs\">Bài hát</string>\n    <string name=\"videos_string\">Các video</string>\n    <string name=\"restricted_video\">Video này bị giới hạn độ tuổi.\n\\n\n\\nBật \\\"%1$s\\\" trong cài đặt nếu bạn muốn xem video này.</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">Bật chế độ hạn chế YouTube</string>\n    <string name=\"peertube_instance_add_https_only\">Chỉ URL HTTPS được hỗ trợ</string>\n    <string name=\"peertube_instance_url_summary\">Chọn thực thể PeerTube ưa thích</string>\n    <string name=\"peertube_instance_url_title\">Thực thể PeerTube</string>\n    <string name=\"seek_duration_title\">Thời lượng tua-nhanh tới/-lùi</string>\n    <string name=\"show_original_time_ago_summary\">Dòng chữ mô tả thời gian gốc từ các dịch vụ sẽ được hiển thị thay thế</string>\n    <string name=\"show_original_time_ago_title\">Hiển thị thời gian ban đầu trước đây trên các mục</string>\n    <string name=\"drawer_header_description\">Chọn dịch vụ; dịch vụ hiện tại:</string>\n    <string name=\"video_detail_by\">Bởi %s</string>\n    <string name=\"channel_created_by\">Được tạo bởi %s</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">Ảnh đại diện của kênh</string>\n    <string name=\"content_not_supported\">NewPipe chưa hỗ trợ loại nội dung này.\n\\n\n\\nCó thể nó sẽ được hỗ trợ bởi một phiên bản mới hơn trong tương lai.</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">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\\n\n\\nNewPipe cung cấp hai chiến lược tải nguồn cấp dữ liệu:\n\\n• Tìm nạp toàn bộ kênh đăng ký, tuy chậm nhưng đầy đủ.\n\\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\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\\n\n\\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\\n\n\\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.</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">Tìm nạp từ nguồn cấp dữ liệu chuyên dụng khi có sẵn</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">Bật chế độ nhanh</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">Tắt chế độ nhanh</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">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)</string>\n    <string name=\"feed_update_threshold_option_always_update\">Luôn cập nhật</string>\n    <string name=\"feed_update_threshold_summary\">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</string>\n    <string name=\"feed_update_threshold_title\">Ngưỡng cập nhật nguồn cấp dữ liệu</string>\n    <string name=\"settings_category_feed_title\">Nguồn cấp dữ liệu</string>\n    <string name=\"feed_create_new_group_button_title\">Tạo mới</string>\n    <string name=\"feed_group_dialog_delete_message\">Bạn có muốn xóa nhóm này\\?</string>\n    <string name=\"feed_group_dialog_empty_name\">Tên nhóm trống</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"other\">Đã chọn %d</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_selection\">Chưa chọn kênh đăng ký nào</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">Chọn kênh đăng ký</string>\n    <string name=\"feed_processing_message\">Đang xử lý nguồn cấp dữ liệu…</string>\n    <string name=\"feed_subscription_not_loaded_count\">Chưa tải được: %d</string>\n    <string name=\"feed_notification_loading\">Đang tải nguồn cấp dữ liệu…</string>\n    <string name=\"feed_oldest_subscription_update\">Nguồn cấp được cập nhật lần cuối: %s</string>\n    <string name=\"new_seek_duration_toast\">Do các hạn chế của ExoPlayer, đã đặt lại thời lượng tua thành %d giây</string>\n    <string name=\"recovering\">đang khôi phục</string>\n    <string name=\"playlist_no_uploader\">Được tạo tự động (không tìm thấy người tải lên)</string>\n    <string name=\"local\">Cục bộ</string>\n    <string name=\"default_kiosk_page_summary\">Trang chính mặc định</string>\n    <string name=\"playlist_page_summary\">Trang danh sách phát</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">Chỉ hiển thị các đăng ký chưa được nhóm</string>\n    <string name=\"never\">Không bao giờ</string>\n    <string name=\"wifi_only\">Chỉ trên Wi-Fi</string>\n    <string name=\"autoplay_summary\">Bắt đầu phát lại tự động — %s</string>\n    <string name=\"title_activity_play_queue\">Phát hàng đợi</string>\n    <string name=\"no_playlist_bookmarked_yet\">Chưa đánh dấu danh sách phát nào</string>\n    <string name=\"select_a_playlist\">Chọn danh sách phát</string>\n    <string name=\"error_report_open_github_notice\">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.</string>\n    <string name=\"error_report_open_issue_button_text\">Báo cáo trên GitHub</string>\n    <string name=\"copy_for_github\">Sao chép bản báo cáo đã được định dạng</string>\n    <string name=\"unsupported_url_dialog_message\">Không thể đọc URL này. Mở với ứng dụng khác?</string>\n    <string name=\"auto_queue_toggle\">Tự động thêm vào hàng đợi</string>\n    <string name=\"clear_queue_confirmation_description\">Hàng đợi của trình phát hiện tại sẽ bị thay thế</string>\n    <string name=\"clear_queue_confirmation_summary\">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</string>\n    <string name=\"clear_queue_confirmation_title\">Yêu cầu xác nhận trước khi xóa hàng đợi</string>\n    <string name=\"notification_action_nothing\">Để trống</string>\n    <string name=\"notification_action_buffering\">Đang tải</string>\n    <string name=\"notification_action_shuffle\">Ngẫu nhiên</string>\n    <string name=\"notification_action_repeat\">Lặp lại</string>\n    <string name=\"notification_actions_at_most_three\">Bạn có thể chọn tối đa ba hành động để hiện trong thông báo thu gọn!</string>\n    <string name=\"notification_actions_summary\">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.</string>\n    <string name=\"notification_action_4_title\">Nút hành động thứ năm</string>\n    <string name=\"notification_action_3_title\">Nút hành động thứ tư</string>\n    <string name=\"notification_action_2_title\">Nút hành động thứ ba</string>\n    <string name=\"notification_action_1_title\">Nút hành động thứ hai</string>\n    <string name=\"notification_action_0_title\">Nút hành động đầu tiên</string>\n    <string name=\"notification_scale_to_square_image_summary\">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</string>\n    <string name=\"notification_scale_to_square_image_title\">Chỉnh ảnh thu nhỏ thành tỉ lệ 1:1</string>\n    <string name=\"search_showing_result_for\">Đang hiện kết quả cho: %s</string>\n    <string name=\"enqueue_stream\">Thêm vào hàng đợi</string>\n    <string name=\"show_age_restricted_content_summary\">Hiển thị nội dung không phù hợp vì có giới hạn độ tuổi (18+)</string>\n    <string name=\"show_thumbnail_summary\">Hiện ảnh thu nhỏ (thumbnail) trên nền màn hình khóa và trong thông báo</string>\n    <string name=\"show_thumbnail_title\">Xem hình thu nhỏ</string>\n    <string name=\"show_memory_leaks\">Kiểm tra bộ nhớ</string>\n    <string name=\"enqueued\">Đã thêm vào hàng đợi</string>\n    <string name=\"clear_cookie_summary\">Xoá Cookie mà NewPipe lưu trữ sau khi bạn hoàn thành nó</string>\n    <string name=\"recaptcha_cookies_cleared\">Cookie reCAPTCHA đã được xóa</string>\n    <string name=\"clear_cookie_title\">Xóa Cookie của reCAPCHA</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">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</string>\n    <string name=\"notification_colorize_summary\">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ị)</string>\n    <string name=\"notification_colorize_title\">Tô màu thông báo</string>\n    <string name=\"no_app_to_open_intent\">Thiết bị của bạn không có ứng dụng để mở tệp này</string>\n    <string name=\"chapters\">Chương</string>\n    <string name=\"recent\">Gần đây</string>\n    <string name=\"msg_calculating_hash\">Đang tính hash</string>\n    <string name=\"description_tab_description\">Mô tả</string>\n    <string name=\"related_items_tab_description\">Các mục liên quan</string>\n    <string name=\"comments_tab_description\">Bình luận</string>\n    <string name=\"hash_channel_description\">Thông báo cho quá trình băm video</string>\n    <string name=\"hash_channel_name\">Thông báo băm video</string>\n    <string name=\"show_meta_info_summary\">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</string>\n    <string name=\"show_meta_info_title\">Hiển thị thông tin meta</string>\n    <string name=\"show_description_summary\">Tắt để ẩn mô tả video và các thông tin bổ sung</string>\n    <string name=\"show_description_title\">Hiện mô tả</string>\n    <string name=\"open_with\">Mở bằng</string>\n    <string name=\"download_has_started\">Tệp đang được tải xuống</string>\n    <string name=\"select_night_theme_toast\">Bạn có thể chọn giao diện ban đêm cho mình phía bên dưới</string>\n    <string name=\"night_theme_summary\">Chọn giao diện ban đêm của bạn — %s</string>\n    <string name=\"auto_device_theme_title\">Tự động (giao diện hệ thống)</string>\n    <string name=\"radio\">Radio</string>\n    <string name=\"paid_content\">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.</string>\n    <string name=\"youtube_music_premium_content\">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.</string>\n    <string name=\"private_content\">Nội dung này được để ở chế độ riêng tư, nên NewPipe không thể phát hay tải xuống.</string>\n    <string name=\"soundcloud_go_plus_content\">Đâ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.</string>\n    <string name=\"georestricted_content\">Nội dung này không có sẵn ở quốc gia của bạn.</string>\n    <string name=\"crash_the_app\">Làm văng ứng dụng</string>\n    <string name=\"restricted_video_no_stream\">Video này bị giới hạn độ tuổi.\n\\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ó.</string>\n    <string name=\"night_theme_title\">Chủ đề đêm</string>\n    <string name=\"featured\">Nổi bật</string>\n    <string name=\"show_channel_details\">Hiện chi tiết kênh</string>\n    <string name=\"recaptcha_solve\">Hoàn thành</string>\n    <string name=\"disable_media_tunneling_summary\">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.</string>\n    <string name=\"disable_media_tunneling_title\">Tắt truyền phương tiện qua đường hầm</string>\n    <string name=\"off\">Tắt</string>\n    <string name=\"on\">Bật</string>\n    <string name=\"tablet_mode_title\">Chế độ máy tính bảng</string>\n    <string name=\"open_website_license\">Mở trang web</string>\n    <string name=\"metadata_privacy_internal\">Nội bộ</string>\n    <string name=\"metadata_privacy_private\">Riêng tư</string>\n    <string name=\"metadata_privacy_unlisted\">Chưa được liệt kê</string>\n    <string name=\"metadata_privacy_public\">Công khai</string>\n    <string name=\"metadata_host\">Nơi chứa</string>\n    <string name=\"metadata_support\">Hỗ trợ</string>\n    <string name=\"metadata_language\">Ngôn ngữ</string>\n    <string name=\"metadata_age_limit\">Giới hạn độ tuổi</string>\n    <string name=\"metadata_privacy\">Chế độ</string>\n    <string name=\"metadata_licence\">Giấy phép</string>\n    <string name=\"metadata_tags\">Thẻ</string>\n    <string name=\"metadata_category\">Thể loại</string>\n    <string name=\"description_select_disable\">Tắt chọn văn bản trong mô tả</string>\n    <string name=\"description_select_enable\">Bật chọn văn bản trong mô tả</string>\n    <string name=\"description_select_note\">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.</string>\n    <string name=\"account_terminated\">Tài khoản đã bị chấm dứt</string>\n    <string name=\"feed_load_error_fast_unknown\">Chế độ nạp nhanh không cung cấp thêm thông tin về điều này.</string>\n    <string name=\"feed_load_error_terminated\">Tài khoản của tác giả đã bị chấm dứt.\n\\nNewPipe sẽ không thể tải nguồn cấp dữ liệu này trong tương lai.\n\\nBạn có muốn hủy đăng ký khỏi kênh này không\\?</string>\n    <string name=\"feed_load_error_account_info\">Không thể tải nguồn cấp dữ liệu cho \\'%s\\'.</string>\n    <string name=\"feed_load_error\">Lỗi tải nguồn cấp dữ liệu</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">\\'Khung truy cập lưu trữ\\' chỉ được hỗ trợ từ Android 10 trở lên</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">Bạn sẽ được hỏi nơi bạn muốn lưu mỗi mục tải xuống</string>\n    <string name=\"no_dir_yet\">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</string>\n    <string name=\"dont_show\">Không hiện</string>\n    <string name=\"low_quality_smaller\">Chất lượng thấp (nhỏ hơn)</string>\n    <string name=\"high_quality_larger\">Chất lượng cao (lớn hơn)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">Xem trước hình thu nhỏ trên thanh tua</string>\n    <string name=\"comments_are_disabled\">Bình luận đã bị tắt</string>\n    <string name=\"detail_heart_img_view_description\">Đã được chủ kênh thả \\\"thính\\\"</string>\n    <string name=\"mark_as_watched\">Đánh dấu là đã xem</string>\n    <string name=\"remote_search_suggestions\">Đề xuất tìm kiếm trên mạng</string>\n    <string name=\"local_search_suggestions\">Đề xuất tìm kiếm cục bộ</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"other\">Đã xóa %1$s lượt tải xuống</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"other\">%s lượt tải xuống đã hoàn tất</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">Vuốt các mục để loại bỏ chúng</string>\n    <string name=\"start_main_player_fullscreen_summary\">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</string>\n    <string name=\"start_main_player_fullscreen_title\">Khởi động trình phát chính ở toàn màn hình</string>\n    <string name=\"enqueued_next\">Đã xếp kế tiếp vào hàng</string>\n    <string name=\"enqueue_next_stream\">Xếp kế tiếp vào hàng</string>\n    <string name=\"processing_may_take_a_moment\">Đang xử lý... Có thể mất chút thời gian</string>\n    <string name=\"error_report_channel_name\">Thông báo lỗi</string>\n    <string name=\"error_report_channel_description\">Thông báo để báo cáo lỗi</string>\n    <string name=\"error_report_notification_title\">NewPipe đã gặp sự cố, nhấn để xem và báo cáo</string>\n    <string name=\"error_report_notification_toast\">Có lỗi xảy ra, hãy xem thông báo</string>\n    <string name=\"show_crash_the_player_title\">Hiện \\\"làm trình phát dừng\\\"</string>\n    <string name=\"show_crash_the_player_summary\">Hiện tùy chọn dừng đột ngột khi sử dụng trình phát</string>\n    <string name=\"show_error_snackbar\">Hiện thanh báo lỗi</string>\n    <string name=\"create_error_notification\">Tạo thông báo lỗi</string>\n    <string name=\"check_for_updates\">Kiểm tra cập nhật</string>\n    <string name=\"manual_update_description\">Kiểm tra phiên bản mới theo cách thủ công</string>\n    <string name=\"checking_updates_toast\">Đang kiểm tra cập nhật…</string>\n    <string name=\"feed_new_items\">Mục nguồn cấp dữ liệu mới</string>\n    <string name=\"crash_the_player\">Làm sập trình phát</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">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.\n\\nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework</string>\n    <string name=\"no_appropriate_file_manager_message\">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.\n\\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</string>\n    <string name=\"leak_canary_not_available\">LeakCanary không khả dụng</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">Mặc định ExoPlayer</string>\n    <string name=\"detail_pinned_comment_view_description\">Bình luận được ghim</string>\n    <string name=\"settings_category_player_notification_title\">Thông báo trình phát</string>\n    <string name=\"settings_category_player_notification_summary\">Cấu hình thông báo hiện đang phát trực tuyến</string>\n    <string name=\"notifications\">Thông báo</string>\n    <string name=\"streams_notification_channel_name\">Luồng truyền mới</string>\n    <string name=\"streams_notification_channel_description\">Thông báo về luồng mới của kênh đăng ký</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"other\">%s luồng truyền mới</item>\n    </plurals>\n    <string name=\"loading_stream_details\">Đang tải chi tiết luồng phát trực tiếp…</string>\n    <string name=\"check_new_streams\">Chạy kiểm tra luồng truyền mới</string>\n    <string name=\"enable_streams_notifications_title\">Thông báo về luồng mới</string>\n    <string name=\"enable_streams_notifications_summary\">Thông báo về các luồng mới từ các kênh đăng ký</string>\n    <string name=\"streams_notifications_interval_title\">Thời gian kiểm tra</string>\n    <string name=\"streams_notifications_network_title\">Yêu cầu kết nối mạng</string>\n    <string name=\"any_network\">Bất kỳ loại mạng nào (có thể tính phí)</string>\n    <string name=\"delete_downloaded_files_confirm\">Xóa tất cả các tệp đã tải xuống khỏi bộ nhớ\\?</string>\n    <string name=\"notifications_disabled\">Thông báo bị tắt</string>\n    <string name=\"get_notified\">Được thông báo</string>\n    <string name=\"you_successfully_subscribed\">Bạn hiện đã đăng ký kênh này</string>\n    <string name=\"toggle_all\">Bật/tắt tất cả</string>\n    <string name=\"percent\">Phần trăm</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"semitone\">Nửa cung</string>\n    <string name=\"streams_not_yet_supported_removed\">Các luồng chưa được trình tải xuống hỗ trợ sẽ không được hiển thị</string>\n    <string name=\"no_video_streams_available_for_external_players\">Không có luồng video nào khả dụng cho trình phát bên ngoài</string>\n    <string name=\"selected_stream_external_player_not_supported\">Luồng phát đã chọn không được trình phát ngoài hỗ trợ</string>\n    <string name=\"no_audio_streams_available_for_external_players\">Không có luồng âm thanh nào khả dụng cho máy phát bên ngoài</string>\n    <string name=\"select_quality_external_players\">Chọn chất lượng cho trình chạy ngoài</string>\n    <string name=\"unknown_format\">Định dạng không xác định</string>\n    <string name=\"unknown_quality\">Độ phân giải không xác định</string>\n    <string name=\"progressive_load_interval_title\">Kích thước tải thời lượng phát lại</string>\n    <string name=\"sort\">Thể loại</string>\n    <string name=\"faq_title\">Câu hỏi thường gặp</string>\n    <string name=\"faq\">Xem trên website</string>\n    <string name=\"faq_description\">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 !</string>\n    <string name=\"import_subscriptions_hint\">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</string>\n    <string name=\"msg_failed_to_copy\">Không thể sao chép vào khay nhớ tạm</string>\n    <string name=\"playlist_add_stream_success_duplicate\">Đã thêm trùng lặp %d lần</string>\n    <string name=\"card\">Dạng thẻ</string>\n    <string name=\"app_update_unavailable_toast\">Bạn đang dùng phiên bản mới nhất</string>\n    <string name=\"night_theme_available\">Tùy chọn này chỉ được bật khi chủ đề %s được dùng</string>\n    <string name=\"app_update_available_notification_text\">Nhấn để tải %s</string>\n    <string name=\"fast_mode\">Chế độ tăng tốc</string>\n    <string name=\"duplicate_in_playlist\">Danh sách phát màu xám thì đã chứa mục này.</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">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</string>\n    <string name=\"ignore_hardware_media_buttons_title\">Bỏ qua nhận nút phương tiện vật lý</string>\n    <string name=\"remove_duplicates\">Loại bỏ các bản trùng lặp</string>\n    <string name=\"remove_duplicates_title\">Loại bỏ các bản trùng lặp?</string>\n    <string name=\"remove_duplicates_message\">Bạn có muốn loại bỏ mọi luồng trùng lặp trong danh sách phát này\\?</string>\n    <string name=\"feed_show_hide_streams\">Hiện/Ẩn luồng phát</string>\n    <string name=\"feed_hide_streams_title\">Hiển thị các luồng phát sau</string>\n    <string name=\"feed_show_watched\">Đã xem đầy đủ</string>\n    <string name=\"feed_show_partially_watched\">Đã xem một phần</string>\n    <string name=\"unset_playlist_thumbnail\">Bỏ đặt vĩnh viễn hình thu nhỏ</string>\n    <string name=\"progressive_load_interval_summary\">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</string>\n    <string name=\"audio_track_present_in_video\">Một bản âm thanh đã có sẵn trong luồng này</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">Sử dụng tính năng bộ giải mã dự phòng của ExoPlayer</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">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\\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</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">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</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">Luôn dùng biện pháp thay thế cho bề mặt đầu ra video cho ExoPlayer</string>\n    <string name=\"audio_track_type_original\">nguyên gốc</string>\n    <string name=\"audio_track_type_descriptive\">mô tả</string>\n    <string name=\"audio_track_type_dubbed\">lồng tiếng</string>\n    <string name=\"prefer_original_audio_title\">Ưu tiên âm thanh gốc</string>\n    <string name=\"prefer_original_audio_summary\">Chọn bản âm thanh gốc kể cả nhiều ngôn ngữ</string>\n    <string name=\"prefer_descriptive_audio_title\">Ưu tiên âm thanh mô tả</string>\n    <string name=\"prefer_descriptive_audio_summary\">Chọn một bản âm thanh có mô tả cho người khiếm thị nếu có</string>\n    <string name=\"left_gesture_control_summary\">Chọn cử chỉ vuốt cho nửa bên trái màn hình của trình phát</string>\n    <string name=\"left_gesture_control_title\">Hành động cho cử chỉ trái</string>\n    <string name=\"right_gesture_control_summary\">Chọn cử chỉ vuốt cho nửa bên phải màn hình của trình phát</string>\n    <string name=\"right_gesture_control_title\">Hành động cho cử chỉ phải</string>\n    <string name=\"brightness\">Độ sáng</string>\n    <string name=\"volume\">Âm lượng</string>\n    <string name=\"none\">Không</string>\n    <string name=\"play_queue_audio_track\">Âm thanh: %s</string>\n    <string name=\"audio_track\">Bản âm thanh</string>\n    <string name=\"feed_show_upcoming\">Sắp tới</string>\n    <string name=\"unknown_audio_track\">Không rõ</string>\n    <string name=\"select_audio_track_external_players\">Chọn bản âm thanh cho máy phát bên ngoài</string>\n    <string name=\"settings_category_exoplayer_title\">Cài đặt ExoPlayer</string>\n    <string name=\"settings_category_exoplayer_summary\">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</string>\n    <string name=\"loading_metadata_title\">Đang tải siêu dữ liệu…</string>\n    <string name=\"main_tabs_position_title\">Vị trí tab chính</string>\n    <string name=\"feed_fetch_channel_tabs\">Tìm nạp các tab kênh</string>\n    <string name=\"disable_media_tunneling_automatic_info\">Đườ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.</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">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.</string>\n    <string name=\"metadata_uploader_avatars\">Hình đại diện của người tải lên</string>\n    <string name=\"main_tabs_position_summary\">Di chuyển bộ chọn tab chính xuống dưới cùng</string>\n    <string name=\"no_live_streams\">Không có luồng trực tiếp</string>\n    <string name=\"metadata_thumbnails\">Ảnh xem trước</string>\n    <string name=\"no_streams\">Không có luồng</string>\n    <string name=\"channel_tab_videos\">Các video</string>\n    <string name=\"metadata_subscribers\">Người đăng ký</string>\n    <string name=\"show_channel_tabs_summary\">Những thẻ nào được hiển thị trên các trang kênh</string>\n    <string name=\"show_channel_tabs\">Thẻ kênh</string>\n    <string name=\"toggle_screen_orientation\">Chuyển đổi hướng màn hình</string>\n    <string name=\"toggle_fullscreen\">Chuyển đổi toàn màn hình</string>\n    <string name=\"metadata_avatars\">Hình đại diện</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"next_stream\">Luồng tiếp theo</string>\n    <string name=\"metadata_subchannel_avatars\">Hình đại diện kênh phụ</string>\n    <string name=\"open_play_queue\">Mở phát hàng chờ</string>\n    <string name=\"channel_tab_about\">Giới thiệu</string>\n    <string name=\"replay\">Phát lại</string>\n    <string name=\"metadata_banners\">Băng rôn</string>\n    <string name=\"channel_tab_playlists\">Danh sách phát</string>\n    <string name=\"play\">Phát</string>\n    <string name=\"more_options\">Lựa chọn khác</string>\n    <string name=\"duration\">Thời lượng</string>\n    <string name=\"channel_tab_channels\">Kênh</string>\n    <string name=\"previous_stream\">Luồng trước đó</string>\n    <string name=\"image_quality_title\">Chất lượng ảnh</string>\n    <string name=\"question_mark\">\\?</string>\n    <string name=\"share_playlist_with_list\">Chia sẻ danh sách URL</string>\n    <string name=\"share_playlist_with_titles\">Chia sẻ với Tiêu đề</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"channel_tab_shorts\">Video ngắn</string>\n    <string name=\"image_quality_low\">Chất lượng thấp</string>\n    <string name=\"image_quality_none\">Không tải ảnh</string>\n    <string name=\"image_quality_high\">Chất lượng cao</string>\n    <string name=\"share_playlist\">Chia sẻ danh sách phát</string>\n    <string name=\"forward\">Tua đi</string>\n    <string name=\"channel_tab_albums\">Album</string>\n    <string name=\"rewind\">Tua lại</string>\n    <string name=\"image_quality_medium\">Chất lượng trung bình</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <string name=\"image_quality_summary\">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</string>\n    <string name=\"channel_tab_tracks\">Track</string>\n    <string name=\"channel_tab_livestreams\">Trực tiếp</string>\n    <string name=\"notification_actions_summary_android13\">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.</string>\n    <string name=\"show_less\">Hiện ít hơn</string>\n    <string name=\"show_more\">Hiện nhiều hơn</string>\n    <plurals name=\"replies\">\n        <item quantity=\"other\">%s hồi đáp</item>\n    </plurals>\n    <string name=\"error_insufficient_storage\">Không đủ dung lượng trống trên thiết bị</string>\n    <string name=\"settings_category_backup_restore_title\">Sao lưu và khôi phục</string>\n    <string name=\"reset_settings_title\">Đặt lại cài đặt</string>\n    <string name=\"reset_settings_summary\">Đặt lại tất cả cài đặt về giá trị mặc định</string>\n    <string name=\"reset_all_settings\">Việc đặt lại tất cả cài đặt sẽ loại bỏ tất cả các cài đặt mà bạn đã đặt và khởi động lại ứng dụng. \\n \\nBạn có chắc muốn tiếp tục?</string>\n    <string name=\"no\">Không</string>\n    <string name=\"auto_update_check_description\">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.\n\\nBạn có muốn kích hoạt tính năng này không?</string>\n    <string name=\"yes\">Có</string>\n    <string name=\"import_settings_vulnerable_format\">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.</string>\n    <string name=\"search_with_service_name\">Tìm kiếm %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">Tìm kiếm %1$s (%2$s)</string>\n    <string name=\"tab_bookmarks_short\">Danh sách phát</string>\n    <string name=\"short_thousand\">%sN</string>\n    <string name=\"short_million\">%sTr</string>\n    <string name=\"short_billion\">%sTỷ</string>\n    <string name=\"select_a_feed_group\">Chọn một nhóm nguồn cấp dữ liệu</string>\n    <string name=\"no_feed_group_created_yet\">Chưa có nhóm nguồn cấp dữ liệu nào được tạo</string>\n    <string name=\"feed_group_page_summary\">Trang nhóm kênh</string>\n    <string name=\"audio_track_type_secondary\">phụ</string>\n    <string name=\"channel_tab_likes\">Thích</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">Chia sẻ dưới dạng danh sách phát tạm thời của YouTube</string>\n    <string name=\"migration_info_6_7_title\">SoundCloud 50 trang hàng đầu đã xóa</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud đã ngừng hiển thị bảng xếp hạng Top 50 ban đầu. Tab tương ứng đã bị xóa khỏi trang chính của bạn.</string>\n    <string name=\"migration_info_7_8_title\">Đã xóa kết hợp đang thịnh hành của YouTube</string>\n    <string name=\"migration_info_7_8_message\">YouTube đã ngừng cung cấp trang thịnh hành kết hợp kể từ ngày 21 tháng 7 năm 2025. NewPipe đã thay thế trang xu hướng mặc định bằng các buổi phát trực tiếp theo thịnh hành.\\n\\nBạn cũng có thể chọn các trang thịnh hành khác nhau trong \\\"Cài đặt &gt; Nội dung &gt; Nội dung của trang chính\\\".</string>\n    <string name=\"trending_gaming\">Trò chơi thịnh hành</string>\n    <string name=\"trending_podcasts\">Podcasts đang thịnh hành</string>\n    <string name=\"trending_movies\">Phim và chương trình đang thịnh hành</string>\n    <string name=\"trending_music\">Âm nhạc đang thịnh hành</string>\n    <string name=\"player_http_403\">Đã xảy ra lỗi HTTP 403 trong khi phát, có thể do URL phát sóng đã hết hạn hoặc bị ban IP</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s đã từ chối cung cấp dữ liệu, cần phải đăng nhập để xác nhận yêu cầu viên ko phải là bot.\\n\\nIP này có vẻ đã bị ban tạm thời bởi %1$s, bạn có thể đợi một lúc hoặc chuyển sang IP khác (ví dụ như việc tắt / bật lại VPN, hoặc là chuyển mạng từ WIFI sang 4G/5G).</string>\n    <string name=\"unsupported_content_in_country\">Nội dung này không được hỗ trợ tại quốc gia mà bạn chọn.\\n\\nHãy đổi quốc gia trong phần \\\"Cài đặt &gt; Nội dung &gt; Nội dung quốc gia mặc định\\\".</string>\n    <string name=\"permission_display_over_apps_message\">Để sử dụng tính năng phát video nổi, hãy chọn %1$s trong Cài đặt Android và bật tính năng %2$s.</string>\n    <string name=\"youtube_player_http_403\">Đã xảy ra lỗi HTTP 403 trong khi phát, có thể IP này đã bị ban hoặc vấn đề phát URL deobfuscation</string>\n    <string name=\"permission_display_over_apps_permission_name\">\\\"Cho phép hiển thị trên ứng dụng khác\\\"</string>\n    <string name=\"delete_file\">Xóa file</string>\n    <string name=\"delete_entry\">Xóa entry</string>\n    <string name=\"account_terminated_service_provides_reason\">Tài khoản bị vô hiệu hóa. \\n\\n%1$s cung cấp lý do này: %2$s</string>\n    <string name=\"entry_deleted\">Entry đã xóa</string>\n    <string name=\"player_http_invalid_status\">Đã xảy ra lỗi HTTP %1$s trong khi phát</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-vmf/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"open_in_browser\">im brüscher öffn</string>\n    <string name=\"yes\">passd scho</string>\n    <string name=\"ok\">passd scho</string>\n    <string name=\"cancel\">stoarnieren</string>\n    <string name=\"install\">iser</string>\n    <string name=\"no\">net</string>\n    <string name=\"share\">tealn</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n\n    <dimen name=\"video_item_grid_thumbnail_image_width\">208dp</dimen>\n    <dimen name=\"video_item_grid_thumbnail_image_height\">117dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"main_bg_subtitle\">点击放大镜图标即可开始使用。</string>\n    <string name=\"upload_date_text\">发布于 %1$s</string>\n    <string name=\"open_in_browser\">在浏览器中打开</string>\n    <string name=\"open_in_popup_mode\">在悬浮窗中打开</string>\n    <string name=\"did_you_mean\">您要找的是不是“%1$s”？</string>\n    <string name=\"no_player_found_toast\">找不到串流播放器（您可以安装 VLC 以播放串流）。</string>\n    <string name=\"controls_download_desc\">下载串流文件</string>\n    <string name=\"install\">安装</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下载</string>\n    <string name=\"search\">搜索</string>\n    <string name=\"settings\">设置</string>\n    <string name=\"share_dialog_title\">分享给</string>\n    <string name=\"download_path_title\">视频下载路径</string>\n    <string name=\"download_path_summary\">已下载的视频将存储于此</string>\n    <string name=\"download_path_dialog_title\">请选择下载视频的保存位置</string>\n    <string name=\"download_path_audio_summary\">已下载的音频将存储于此</string>\n    <string name=\"download_path_audio_dialog_title\">选择下载音频的储存位置</string>\n    <string name=\"play_with_kodi_title\">使用 Kodi 播放</string>\n    <string name=\"theme_title\">主题</string>\n    <string name=\"light_theme_title\">浅色</string>\n    <string name=\"dark_theme_title\">深色</string>\n    <string name=\"black_theme_title\">暗黑</string>\n    <string name=\"download_dialog_title\">下载</string>\n    <string name=\"unsupported_url\">不支持的 URL</string>\n    <string name=\"settings_category_appearance_title\">外观</string>\n    <string name=\"all\">全部</string>\n    <string name=\"network_error\">网络错误</string>\n    <plurals name=\"videos\">\n        <item quantity=\"other\">%s 个视频</item>\n    </plurals>\n    <string name=\"disabled\">已停用</string>\n    <string name=\"controls_background_title\">后台</string>\n    <string name=\"show_search_suggestions_title\">显示搜索建议</string>\n    <string name=\"subscribe_button_title\">订阅</string>\n    <string name=\"subscribed_button_title\">已订阅</string>\n    <string name=\"enable_watch_history_title\">记录播放记录</string>\n    <string name=\"settings_category_player_title\">播放器</string>\n    <string name=\"settings_category_history_title\">历史记录与缓存</string>\n    <string name=\"undo\">撤销</string>\n    <string name=\"play_all\">播放全部</string>\n    <string name=\"always\">总是</string>\n    <string name=\"just_once\">仅一次</string>\n    <string name=\"controls_add_to_playlist_title\">添加至</string>\n    <string name=\"file\">文件</string>\n    <string name=\"clear_views_history_title\">清空播放历史</string>\n    <string name=\"minimize_on_exit_none_description\">无</string>\n    <string name=\"minimize_on_exit_background_description\">最小化至后台播放</string>\n    <string name=\"minimize_on_exit_popup_description\">最小化至悬浮窗播放</string>\n    <string name=\"channels\">频道</string>\n    <string name=\"playlists\">播放列表</string>\n    <string name=\"unsubscribe\">取消订阅</string>\n    <string name=\"settings_category_updates_title\">更新</string>\n    <string name=\"file_deleted\">文件已删除</string>\n    <string name=\"subscribers_count_not_available\">无法得知订阅人数</string>\n    <string name=\"updates_setting_description\">有新版本时，显示通知提示更新应用</string>\n    <string name=\"grid\">网格</string>\n    <string name=\"app_update_available_notification_title\">NewPipe 可更新！</string>\n    <string name=\"error_http_unsupported_range\">服务器不接受多线程下载, 使用 @string/msg_threads = 1 重试</string>\n    <string name=\"autoplay_title\">自动播放</string>\n    <string name=\"settings_category_clear_data_title\">清空数据</string>\n    <string name=\"watch_history_deleted\">播放历史已删除</string>\n    <string name=\"detail_likes_img_view_description\">喜欢</string>\n    <string name=\"detail_dislikes_img_view_description\">不喜欢</string>\n    <string name=\"video\">视频</string>\n    <string name=\"audio\">音频</string>\n    <string name=\"retry\">重试</string>\n    <plurals name=\"views\">\n        <item quantity=\"other\">%s 次观看</item>\n    </plurals>\n    <string name=\"start\">开始</string>\n    <string name=\"pause\">暂停</string>\n    <string name=\"delete\">删除</string>\n    <string name=\"checksum\">校验</string>\n    <string name=\"ok\">确定</string>\n    <string name=\"msg_name\">文件名</string>\n    <string name=\"msg_threads\">线程数</string>\n    <string name=\"msg_error\">错误</string>\n    <string name=\"msg_running_detail\">点击了解详情</string>\n    <string name=\"msg_wait\">请稍候…</string>\n    <string name=\"msg_copied\">已复制到剪贴板</string>\n    <string name=\"controls_popup_title\">悬浮窗播放</string>\n    <string name=\"title_activity_about\">关于 NewPipe</string>\n    <string name=\"title_licenses\">第三方许可</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s 由 %2$s 遵循 %3$s 协议发布</string>\n    <string name=\"tab_about\">关于和常见问题</string>\n    <string name=\"tab_licenses\">许可证</string>\n    <string name=\"settings_category_downloads_title\">下载</string>\n    <string name=\"settings_file_charset_title\">文件名中允许的字符</string>\n    <string name=\"settings_file_replacement_character_summary\">无效字符将会被替换为该字符</string>\n    <string name=\"charset_letters_and_digits\">字母和数字</string>\n    <string name=\"charset_most_special_characters\">特殊字符</string>\n    <string name=\"search_no_results\">没有结果</string>\n    <string name=\"no_subscribers\">无人订阅</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"other\">%s 位订阅者</item>\n    </plurals>\n    <string name=\"no_videos\">无视频</string>\n    <string name=\"detail_drag_description\">拖动以重新排序</string>\n    <string name=\"create\">新建</string>\n    <string name=\"dismiss\">退出</string>\n    <string name=\"rename\">重命名</string>\n    <string name=\"one_item_deleted\">已删除一个项目。</string>\n    <string name=\"main_page_content_summary\">自定义主页显示的标签页</string>\n    <string name=\"list_view_mode\">列表视图模式</string>\n    <string name=\"missions_header_finished\">已完成</string>\n    <string name=\"missions_header_pending\">等待中</string>\n    <string name=\"paused\">已暂停</string>\n    <string name=\"queued\">已加入队列</string>\n    <string name=\"enqueue\">加入队列</string>\n    <string name=\"permission_denied\">操作已被系统拒绝</string>\n    <string name=\"download_failed\">下载失败</string>\n    <string name=\"no_comments\">没有评论</string>\n    <string name=\"drawer_header_description\">切换服务，当前选择：</string>\n    <string name=\"no_player_found\">找不到串流播放器。是否安装 VLC？</string>\n    <string name=\"use_external_video_player_title\">使用外部视频播放器</string>\n    <string name=\"use_external_audio_player_title\">使用外部音频播放器</string>\n    <string name=\"download_path_audio_title\">音频下载文件夹</string>\n    <string name=\"default_resolution_title\">默认分辨率</string>\n    <string name=\"kore_not_found\">未找到 Kore。是否安装 Kore？</string>\n    <string name=\"show_play_with_kodi_title\">显示“使用 Kodi 播放”选项</string>\n    <string name=\"show_play_with_kodi_summary\">显示“通过 Kodi 媒体中心播放视频”选项</string>\n    <string name=\"play_audio\">音频</string>\n    <string name=\"default_audio_format_title\">默认音频格式</string>\n    <string name=\"show_next_and_similar_title\">显示“接下来”和“相似视频”</string>\n    <string name=\"settings_category_video_audio_title\">视频和音频</string>\n    <string name=\"background_player_playing_toast\">后台播放</string>\n    <string name=\"content\">内容</string>\n    <string name=\"show_age_restricted_content_title\">显示年龄限制的内容</string>\n    <string name=\"duration_live\">直播</string>\n    <string name=\"downloads\">下载</string>\n    <string name=\"downloads_title\">下载</string>\n    <string name=\"error_report_title\">反馈错误</string>\n    <string name=\"general_error\">错误</string>\n    <string name=\"could_not_load_thumbnails\">无法加载所有缩略图</string>\n    <string name=\"parsing_error\">无法解析网址</string>\n    <string name=\"content_not_available\">内容不可用</string>\n    <string name=\"could_not_setup_download_menu\">无法设置下载菜单</string>\n    <string name=\"app_ui_crash\">App/UI 崩溃</string>\n    <string name=\"sorry_string\">抱歉, 这本不该发生。</string>\n    <string name=\"error_report_button_text\">使用电子邮件反馈</string>\n    <string name=\"error_snackbar_message\">抱歉，发生了一些错误。</string>\n    <string name=\"error_snackbar_action\">反馈</string>\n    <string name=\"what_device_headline\">信息：</string>\n    <string name=\"what_happened_headline\">发生了什么：</string>\n    <string name=\"info_labels\">详情：\\n请求：\\n内容语言：\\n内容国家：\\n客户端语言：\\n服务：\\nGMT时间：\\n包名：\\n版本：\\n操作系统版本：</string>\n    <string name=\"your_comment\">您的附加说明（请用英文）：</string>\n    <string name=\"error_details_headline\">详细信息：</string>\n    <string name=\"detail_thumbnail_view_description\">播放视频，时长：</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">视频上传者的头像缩略图</string>\n    <string name=\"msg_running\">NewPipe 正在下载</string>\n    <string name=\"no_available_dir\">请稍后在设置中设定下载目录</string>\n    <string name=\"msg_popup_permission\">使用悬浮窗模式\n\\n需要该权限</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA 验证</string>\n    <string name=\"recaptcha_request_toast\">已请求新的 reCAPTCHA 验证</string>\n    <string name=\"popup_playing_toast\">在悬浮窗中播放</string>\n    <string name=\"default_popup_resolution_title\">悬浮窗默认分辨率</string>\n    <string name=\"show_higher_resolutions_title\">使用更高的分辨率</string>\n    <string name=\"show_higher_resolutions_summary\">仅部分设备支持播放 2K 或 4K 视频</string>\n    <string name=\"clear\">清除</string>\n    <string name=\"popup_remember_size_pos_title\">记住悬浮窗属性（大小与位置）</string>\n    <string name=\"popup_remember_size_pos_summary\">记住上一次使用悬浮窗的大小和位置</string>\n    <string name=\"use_external_video_player_summary\">部分分辨率下没有音频</string>\n    <string name=\"show_search_suggestions_summary\">选择搜索时显示的建议</string>\n    <string name=\"best_resolution\">最佳分辨率</string>\n    <string name=\"app_description\">自由且小巧的 Android 媒体播放器。</string>\n    <string name=\"view_on_github\">在 GitHub 上查看</string>\n    <string name=\"app_license_title\">NewPipe 的许可证</string>\n    <string name=\"contribution_encouragement\">你是否想过要翻译、设计、清理或重构代码——我们始终欢迎你来贡献！</string>\n    <string name=\"read_full_license\">阅读许可证</string>\n    <string name=\"contribution_title\">贡献</string>\n    <string name=\"settings_file_replacement_character_title\">替换字符</string>\n    <string name=\"channel_unsubscribed\">已取消订阅频道</string>\n    <string name=\"subscription_change_failed\">无法修改订阅</string>\n    <string name=\"subscription_update_failed\">无法更新订阅</string>\n    <string name=\"tab_subscriptions\">订阅</string>\n    <string name=\"fragment_feed_title\">最新</string>\n    <string name=\"resume_on_audio_focus_gain_title\">自动恢复播放</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">在播放被打断（例如突然来电）后恢复播放</string>\n    <string name=\"enable_search_history_title\">记录搜索历史</string>\n    <string name=\"enable_search_history_summary\">Newpipe 将在本地存储搜索历史记录</string>\n    <string name=\"enable_watch_history_summary\">Newpipe 将保留播放记录</string>\n    <string name=\"title_activity_history\">历史记录</string>\n    <string name=\"action_history\">历史记录</string>\n    <string name=\"notification_channel_name\">NewPipe 通知</string>\n    <string name=\"notification_channel_description\">NewPipe 播放器的通知</string>\n    <string name=\"default_video_format_title\">默认视频格式</string>\n    <string name=\"settings_category_player_behavior_title\">行为</string>\n    <string name=\"empty_list_subtitle\">空空如也</string>\n    <string name=\"no_views\">无人观看过</string>\n    <string name=\"delete_item_search_history\">是否删除此条搜索历史记录？</string>\n    <string name=\"main_page_content\">主页面的显示内容</string>\n    <string name=\"blank_page_summary\">空白页</string>\n    <string name=\"kiosk_page_summary\">Kiosk 页面</string>\n    <string name=\"channel_page_summary\">频道页</string>\n    <string name=\"select_a_channel\">选择一个频道</string>\n    <string name=\"no_channel_subscribed_yet\">尚未订阅频道</string>\n    <string name=\"select_a_kiosk\">选择一个时下流行页</string>\n    <string name=\"trending\">时下流行</string>\n    <string name=\"top_50\">前 50</string>\n    <string name=\"new_and_hot\">最新与热门</string>\n    <string name=\"show_hold_to_append_title\">显示“长按加入播放队列”提示</string>\n    <string name=\"show_hold_to_append_summary\">在视频详情页中，按下后台播放或悬浮窗播放按钮时显示提示</string>\n    <string name=\"player_stream_failure\">无法播放此串流</string>\n    <string name=\"player_unrecoverable_failure\">发生无法处理的播放器错误</string>\n    <string name=\"player_recoverable_failure\">播放器错误 自动恢复</string>\n    <string name=\"play_queue_remove\">移除</string>\n    <string name=\"play_queue_stream_detail\">详情</string>\n    <string name=\"play_queue_audio_settings\">音频设置</string>\n    <string name=\"hold_to_append\">长按加入播放队列</string>\n    <string name=\"unknown_content\">[未知]</string>\n    <string name=\"start_here_on_background\">开始后台播放</string>\n    <string name=\"start_here_on_popup\">开始在悬浮窗中播放</string>\n    <string name=\"donation_title\">捐赠</string>\n    <string name=\"donation_encouragement\">NewPipe 由志愿者开发，他们利用自己的空闲时间，为您带来最佳的用户体验。是时候回馈他们，让他们享受一杯咖啡，帮助开发者们让 NewPipe 变得更好。</string>\n    <string name=\"give_back\">回馈</string>\n    <string name=\"website_title\">官网</string>\n    <string name=\"website_encouragement\">请访问 NewPipe 网站以了解更多信息和新闻。</string>\n    <string name=\"default_content_country_title\">视频默认国家/地区</string>\n    <string name=\"switch_to_background\">切换到后台播放</string>\n    <string name=\"switch_to_popup\">切换到悬浮窗播放</string>\n    <string name=\"switch_to_main\">切换到主页面</string>\n    <string name=\"drawer_open\">打开抽屉</string>\n    <string name=\"drawer_close\">关闭抽屉</string>\n    <string name=\"external_player_unsupported_link_type\">第三方播放器不支持此类型链接</string>\n    <string name=\"video_streams_empty\">未找到视频串流</string>\n    <string name=\"audio_streams_empty\">找不到音频串流</string>\n    <string name=\"video_player\">视频播放器</string>\n    <string name=\"background_player\">后台播放器</string>\n    <string name=\"popup_player\">悬浮窗播放器</string>\n    <string name=\"preferred_player_fetcher_notification_title\">正在获取信息…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">正在加载请求的内容</string>\n    <string name=\"import_data_title\">导入数据库</string>\n    <string name=\"export_data_title\">导出数据库</string>\n    <string name=\"import_data_summary\">覆盖您的当前播放历史、订阅、播放列表和设置（可选）</string>\n    <string name=\"export_data_summary\">导出历史记录、订阅、播放列表和设置</string>\n    <string name=\"export_complete_toast\">导出成功</string>\n    <string name=\"import_complete_toast\">导入成功</string>\n    <string name=\"no_valid_zip_file\">没有有效的 ZIP 文件</string>\n    <string name=\"could_not_import_all_files\">警告：无法导入所有文件。</string>\n    <string name=\"override_current_data\">此操作会覆盖当前设置。</string>\n    <string name=\"show_info\">显示信息</string>\n    <string name=\"tab_bookmarks\">收藏</string>\n    <string name=\"title_last_played\">最近观看</string>\n    <string name=\"title_most_played\">最多观看</string>\n    <string name=\"always_ask_open_action\">每次询问</string>\n    <string name=\"create_playlist\">新建播放列表</string>\n    <string name=\"rename_playlist\">重命名</string>\n    <string name=\"name\">名称</string>\n    <string name=\"add_to_playlist\">添加至播放列表</string>\n    <string name=\"set_as_playlist_thumbnail\">设为播放列表封面</string>\n    <string name=\"bookmark_playlist\">收藏播放列表</string>\n    <string name=\"unbookmark_playlist\">删除收藏</string>\n    <string name=\"delete_playlist_prompt\">是否删除此播放列表？</string>\n    <string name=\"playlist_creation_success\">新建播放列表成功</string>\n    <string name=\"playlist_add_stream_success\">加入播放列表成功</string>\n    <string name=\"playlist_thumbnail_change_success\">播放列表封面已更改。</string>\n    <string name=\"caption_none\">无字幕</string>\n    <string name=\"resize_fit\">适应屏幕</string>\n    <string name=\"resize_fill\">填充屏幕</string>\n    <string name=\"resize_zoom\">缩放画面</string>\n    <string name=\"settings_category_debug_title\">调试</string>\n    <string name=\"caption_auto_generated\">自动生成</string>\n    <string name=\"enable_leak_canary_summary\">内存泄漏监测可能会导致应用在堆转储时无响应</string>\n    <string name=\"enable_disposed_exceptions_title\">报告超出生命周期的错误</string>\n    <string name=\"enable_disposed_exceptions_summary\">强制报告处理后的未送达的 Activity 或 Fragment 生命周期之外的 Rx 异常</string>\n    <string name=\"use_inexact_seek_title\">使用快速寻址（不精确）</string>\n    <string name=\"use_inexact_seek_summary\">快速寻址定位允许播放器以较低精确度为代价换取更快的寻址定位速度。此功能不适用于以 5、15 或 25 秒为隔的寻址定位</string>\n    <string name=\"auto_queue_title\">自动将“接下来”视频加入播放队列</string>\n    <string name=\"auto_queue_summary\">播放完（非循环）队列中的最后一个视频后，自动将一个相关视频添加到当前播放队列</string>\n    <string name=\"invalid_directory\">没有该文件夹</string>\n    <string name=\"invalid_source\">无相似文件/内容源</string>\n    <string name=\"invalid_file\">文件不存在，或缺少读写文件权限</string>\n    <string name=\"file_name_empty_error\">文件名不能为空</string>\n    <string name=\"error_occurred_detail\">发生错误：%1$s</string>\n    <string name=\"import_title\">导入</string>\n    <string name=\"import_from\">导入自</string>\n    <string name=\"export_to\">导出到</string>\n    <string name=\"import_ongoing\">正在导入…</string>\n    <string name=\"export_ongoing\">正在导出…</string>\n    <string name=\"import_file_title\">导入文件</string>\n    <string name=\"previous_export\">先前的导出</string>\n    <string name=\"subscriptions_import_unsuccessful\">无法导入订阅</string>\n    <string name=\"subscriptions_export_unsuccessful\">无法导出订阅</string>\n    <string name=\"import_youtube_instructions\">从 Google takeout 导入 YouTube 订阅：\n\\n\n\\n1. 打开这个网址：%1$s\n\\n2. 登录谷歌账号\n\\n3. 单击“包含所有数据”，然后单击“取消全选”，然后仅选择“订阅”并单击“确定”\n\\n4. 点击“下一步”，然后点击“创建导出作业”\n\\n5. 出现“下载”按钮后点击它\n\\n6. 单击下面的导入文件并选择下载的 .zip 文件\n\\n7.（如果 .zip 导入失败）解压 .csv文件（通常在“YouTube和YouTube Music/subscriptions/subscriptions.csv”下），点击下方的导入文件，选择解压出来的 csv 文件</string>\n    <string name=\"import_soundcloud_instructions\">通过输入网址或你的 ID 导入 SoundCloud 配置文件：\n\\n\n\\n1. 在浏览器中启用“电脑模式“（该网站未适配移动设备）；\n\\n2. 打开该网站：%1$s；\n\\n3. 登录（如果需要）；\n\\n4. 复制得到的配置文件下载地址。</string>\n    <string name=\"import_soundcloud_instructions_hint\">你的 ID：soundcloud.com/［你的ID］</string>\n    <string name=\"import_network_expensive_warning\">该操作消耗大量流量，\n\\n\n\\n你想继续吗？</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">清空图像缓存成功</string>\n    <string name=\"metadata_cache_wipe_title\">清空已缓存的元数据</string>\n    <string name=\"metadata_cache_wipe_summary\">清空已缓存的网页数据</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">清空元数据缓存成功</string>\n    <string name=\"playback_speed_control\">播放速度控制</string>\n    <string name=\"playback_tempo\">节奏</string>\n    <string name=\"playback_pitch\">音调</string>\n    <string name=\"unhook_checkbox\">解除音视挂钩（可能导致失真）</string>\n    <string name=\"preferred_open_action_settings_title\">首选“打开”操作</string>\n    <string name=\"preferred_open_action_settings_summary\">打开内容时的默认操作 — %s</string>\n    <string name=\"no_streams_available_download\">没有可下载的串流</string>\n    <string name=\"caption_setting_title\">字幕</string>\n    <string name=\"caption_setting_description\">修改播放器字幕文本比例和背景样式。重启应用后生效</string>\n    <string name=\"clear_views_history_summary\">删除串流播放历史和播放痕迹记录</string>\n    <string name=\"delete_view_history_alert\">删除全部播放历史？</string>\n    <string name=\"clear_search_history_title\">清空搜索历史</string>\n    <string name=\"clear_search_history_summary\">清空搜索历史关键词</string>\n    <string name=\"delete_search_history_alert\">是否删除全部搜索历史？</string>\n    <string name=\"search_history_deleted\">搜索历史已删除</string>\n    <string name=\"app_license\">NewPipe 是 Copyleft 的自由软件：您可以随时使用、研究共享和改进它。您可以根据自由软件基金会发布的 GNU 通用公共许可证 GPLv3 或（由您选择的）任何更高版本的许可证重新分发或修改该许可证。</string>\n    <string name=\"import_settings\">是否要导入设置？</string>\n    <string name=\"privacy_policy_title\">NewPipe 隐私政策</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe 项目非常重视您的隐私。因此，未经您的同意，应用程序不会收集任何数据。\n\\nNewPipe 的隐私政策详细解释了发送崩溃报告时会发送和存储的数据。</string>\n    <string name=\"read_privacy_policy\">阅读隐私政策</string>\n    <string name=\"start_accept_privacy_policy\">为了遵守欧盟的《通用数据保护条例 (GDPR)》，我们特此提醒您注意 NewPipe 的隐私政策，请您仔细阅读。\n\\n您必须在同意以后才能向我们发送错误报告。</string>\n    <string name=\"accept\">接受</string>\n    <string name=\"decline\">拒绝</string>\n    <string name=\"limit_data_usage_none_description\">无限制</string>\n    <string name=\"limit_mobile_data_usage_title\">使用移动数据播放时降低分辨率</string>\n    <string name=\"minimize_on_exit_title\">退出应用时最小化</string>\n    <string name=\"minimize_on_exit_summary\">从主播放器切换到其他应用时的操作 — %s</string>\n    <string name=\"skip_silence_checkbox\">静音时快进</string>\n    <string name=\"playback_step\">比例调整</string>\n    <string name=\"playback_reset\">重置</string>\n    <string name=\"tracks\">曲目</string>\n    <string name=\"users\">用户</string>\n    <string name=\"tab_choose\">选择标签</string>\n    <string name=\"content_language_title\">视频默认语言</string>\n    <string name=\"app_update_notification_channel_name\">应用更新通知</string>\n    <string name=\"app_update_notification_channel_description\">NewPipe 新版本的通知</string>\n    <string name=\"download_to_sdcard_error_title\">外置存储不可用</string>\n    <string name=\"download_to_sdcard_error_message\">无法下载到外部 SD 卡，修改下载文件夹位置？</string>\n    <string name=\"saved_tabs_invalid_json\">读取已保存标签时发生错误，因此使用默认标签</string>\n    <string name=\"restore_defaults\">恢复默认</string>\n    <string name=\"restore_defaults_confirmation\">是否恢复默认值？</string>\n    <string name=\"updates_setting_title\">更新</string>\n    <string name=\"list\">列表</string>\n    <string name=\"auto\">自动</string>\n    <string name=\"post_processing\">处理中</string>\n    <string name=\"generate_unique_name\">生成唯一名称</string>\n    <string name=\"overwrite\">覆盖</string>\n    <string name=\"download_already_running\">已存在一进行中并使用该名称的下载任务</string>\n    <string name=\"show_error\">显示错误</string>\n    <string name=\"error_path_creation\">无法创建目标文件夹</string>\n    <string name=\"error_file_creation\">无法创建文件</string>\n    <string name=\"error_ssl_exception\">建立安全连接失败</string>\n    <string name=\"error_unknown_host\">找不到服务器</string>\n    <string name=\"error_connect_host\">无法连接至服务器</string>\n    <string name=\"error_http_no_content\">服务器未发送数据</string>\n    <string name=\"error_http_not_found\">找不到</string>\n    <string name=\"error_postprocessing_failed\">后期处理失败</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"max_retry_msg\">最大重试次数</string>\n    <string name=\"max_retry_desc\">取消下载前的最多重试次数</string>\n    <string name=\"pause_downloads_on_mobile\">切换到按流量计费的网络后中断下载</string>\n    <string name=\"pause_downloads_on_mobile_desc\">切换至移动数据时可能有用，虽然部分下载无法被暂停</string>\n    <string name=\"events\">事件</string>\n    <string name=\"conferences\">会议大会</string>\n    <string name=\"show_comments_title\">显示评论</string>\n    <string name=\"show_comments_summary\">是否隐藏评论</string>\n    <string name=\"error_unable_to_load_comments\">无法加载评论</string>\n    <string name=\"close\">关闭</string>\n    <string name=\"enable_playback_resume_title\">记录播放痕迹历史</string>\n    <string name=\"enable_playback_resume_summary\">再次打开播放过的视频时, 自动定位到上次播放时位置</string>\n    <string name=\"enable_playback_state_lists_title\">在列表中显示历史播放位置</string>\n    <string name=\"enable_playback_state_lists_summary\">在列表中，使用底端进度条显示某一视频上次播放时的播放位置</string>\n    <string name=\"watch_history_states_deleted\">已删除播放痕迹历史</string>\n    <string name=\"missing_file\">文件已被移动或被删除</string>\n    <string name=\"overwrite_unrelated_warning\">同名文件已存在</string>\n    <string name=\"overwrite_finished_warning\">同名的已下载文件已经存在</string>\n    <string name=\"overwrite_failed\">无法覆盖文件</string>\n    <string name=\"download_already_pending\">已暂停下载包含此名称的任务</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe 在处理文件时被关闭</string>\n    <string name=\"error_insufficient_storage_left\">设备上没有剩余储存空间</string>\n    <string name=\"error_progress_lost\">进度丢失，文件已被删除</string>\n    <string name=\"error_timeout\">连接超时</string>\n    <string name=\"confirm_prompt\">是否清空下载记录或删除所有下载的文件？</string>\n    <string name=\"enable_queue_limit\">限制下载并行任务数</string>\n    <string name=\"enable_queue_limit_desc\">同一时间内只允许进行一个下载任务</string>\n    <string name=\"start_downloads\">开始下载</string>\n    <string name=\"pause_downloads\">暂停下载</string>\n    <string name=\"downloads_storage_ask_title\">总是询问下载位置</string>\n    <string name=\"downloads_storage_ask_summary\">系统将询问您将每次下载的保存位置。\n\\n如果要下载到外部 SD 卡，请启用系统文件夹选择器 (SAF)</string>\n    <string name=\"downloads_storage_use_saf_title\">使用系统文件夹选择器 (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">存储访问框架（SAF）允许下载文件到外部 SD 卡</string>\n    <string name=\"clear_playback_states_title\">删除播放痕迹历史</string>\n    <string name=\"clear_playback_states_summary\">删除所有播放痕迹历史</string>\n    <string name=\"delete_playback_states_alert\">是否删除全部播放痕迹历史？</string>\n    <string name=\"default_kiosk_page_summary\">『时下流行』页-默认</string>\n    <string name=\"no_one_watching\">没有人在观看</string>\n    <plurals name=\"watching\">\n        <item quantity=\"other\">%s 人在观看</item>\n    </plurals>\n    <string name=\"no_one_listening\">没有人在听</string>\n    <plurals name=\"listening\">\n        <item quantity=\"other\">%s 位听众</item>\n    </plurals>\n    <string name=\"peertube_instance_url_title\">PeerTube 服务器</string>\n    <string name=\"peertube_instance_url_summary\">设置自定义 PeerTube 服务器</string>\n    <string name=\"peertube_instance_url_help\">查找你需要的服务器 %s</string>\n    <string name=\"peertube_instance_add_title\">添加服务器</string>\n    <string name=\"peertube_instance_add_help\">输入服务器网址（URL）</string>\n    <string name=\"peertube_instance_add_fail\">无法验证服务器</string>\n    <string name=\"peertube_instance_add_https_only\">仅支持 HTTPS URL</string>\n    <string name=\"peertube_instance_add_exists\">该服务器已存在</string>\n    <string name=\"local\">本地</string>\n    <string name=\"recently_added\">最近添加</string>\n    <string name=\"most_liked\">最受欢迎</string>\n    <string name=\"playlist_no_uploader\">自动生成的（找不到上传者）</string>\n    <string name=\"recovering\">正在恢复</string>\n    <string name=\"error_download_resource_gone\">无法恢复此下载</string>\n    <string name=\"choose_instance_prompt\">选择一个服务器</string>\n    <string name=\"seek_duration_title\">快进 / 快退的寻址定位时间间隔</string>\n    <string name=\"clear_download_history\">清空下载记录</string>\n    <string name=\"delete_downloaded_files\">删除下载文件</string>\n    <string name=\"permission_display_over_apps\">授予在其他应用上层显示的权限</string>\n    <string name=\"app_language_title\">应用语言</string>\n    <string name=\"systems_language\">系统默认</string>\n    <string name=\"subtitle_activity_recaptcha\">完成后请点击“完成”</string>\n    <string name=\"done\">完成</string>\n    <string name=\"videos_string\">视频</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"other\">%d 秒</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">由于 ExoPlayer 的限制，寻址间隔置为 %d 秒</string>\n    <string name=\"mute\">静音</string>\n    <string name=\"unmute\">取消静音</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"other\">%d 分钟</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"other\">%d 小时</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"other\">%d 天</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">频道组</string>\n    <string name=\"feed_oldest_subscription_update\">订阅最后更新：%s</string>\n    <string name=\"feed_subscription_not_loaded_count\">未加载：%d</string>\n    <string name=\"feed_notification_loading\">正在加载 feed…</string>\n    <string name=\"feed_processing_message\">正在处理 feed…</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">选择订阅</string>\n    <string name=\"feed_group_dialog_empty_selection\">未选中任何订阅</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"other\">已选中 %d</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">清空组名</string>\n    <string name=\"feed_group_dialog_delete_message\">您要删除该组吗？</string>\n    <string name=\"feed_create_new_group_button_title\">新建</string>\n    <string name=\"settings_category_feed_title\">订阅</string>\n    <string name=\"feed_update_threshold_title\">Feed 更新阈值</string>\n    <string name=\"feed_update_threshold_summary\">上次更新后，订阅被视为过期的时间 — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">始终更新</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">可用时使用专用 feed 获取</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">仅在某些服务中可用，通常速度更快，但返回的视频数量可能有限，而且信息通常不完整（如无视频时长、类型，无直播状态）</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">启用快速模式</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">停用快速模式</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">您是否觉得 feed 加载太慢？如果是这样，请尝试启用快速加载（可在设置中修改，也可使用下面的按钮修改）\n\\n\n\\nNewPipe 提供两种 feed 加载策略:\n\\n•获取整个订阅频道，很慢但是很完整。\n\\n•使用专用的服务端点，比较快但通常不完整\n\\n\n\\n两者之间的区别在于，后者通常缺少一些信息，如视频的持续时间或类型（无法区分直播视频和普通视频），并且可能返回更少的视频条目。\n\\n\n\\nYouTube 是一个通过其 RSS feed 提供这种快速方法的服务示例。\n\\n\n\\n因此，选择哪种方式取决于您的偏好：加载速度还是信息准确。</string>\n    <string name=\"content_not_supported\">NewPipe 尚不支持该内容。\n\\n\n\\n也许未来版本会支持它。</string>\n    <string name=\"infinite_videos\">∞ 部视频</string>\n    <string name=\"more_than_100_videos\">100+ 部视频</string>\n    <string name=\"artists\">艺术家</string>\n    <string name=\"albums\">专辑</string>\n    <string name=\"songs\">歌曲</string>\n    <string name=\"restricted_video\">该视频有年龄限制!\n\\n\n\\n如果您想要观看，请在设置中启用“%1$s”。</string>\n    <string name=\"video_detail_by\">由 %s</string>\n    <string name=\"channel_created_by\">由 %s 创建</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">频道的头像缩略图</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">是的，包括没看完的视频</string>\n    <string name=\"remove_watched_popup_warning\">已经看过且在之后被加入播放列表的视频将被删除。 \\n您确定吗？</string>\n    <string name=\"remove_watched_popup_title\">移除看过的视频？</string>\n    <string name=\"remove_watched\">移除看过的视频</string>\n    <string name=\"show_original_time_ago_summary\">来自服务的原始文本将在串流项目中可见</string>\n    <string name=\"show_original_time_ago_title\">在项目上显示原始时间</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">启用 YouTube“受限模式”</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">仅显示未分组订阅</string>\n    <string name=\"playlist_page_summary\">播放列表页</string>\n    <string name=\"no_playlist_bookmarked_yet\">尚无收藏</string>\n    <string name=\"select_a_playlist\">选择播放列表</string>\n    <string name=\"error_report_open_github_notice\">请先检查您的要提交的问题是否已经存在。如果你创建了重复的反馈, 就会额外耗费我们用来修复这个问题的宝贵时间。</string>\n    <string name=\"error_report_open_issue_button_text\">在 GitHub 上反馈</string>\n    <string name=\"copy_for_github\">复制已整理的报告</string>\n    <string name=\"search_showing_result_for\">显示结果：%s</string>\n    <string name=\"never\">从不</string>\n    <string name=\"wifi_only\">仅在 Wi-Fi 下</string>\n    <string name=\"autoplay_summary\">自动开始播放 — %s</string>\n    <string name=\"title_activity_play_queue\">播放队列</string>\n    <string name=\"unsupported_url_dialog_message\">无法识别此 URL。是否用其他应用打开\\?</string>\n    <string name=\"auto_queue_toggle\">自动加入播放队列</string>\n    <string name=\"clear_queue_confirmation_description\">当前播放队列将被替换</string>\n    <string name=\"clear_queue_confirmation_summary\">从一个播放器切换到另一个播放器后，你的播放队列可能会被替换</string>\n    <string name=\"clear_queue_confirmation_title\">清空播放队列前再次确认</string>\n    <string name=\"notification_action_nothing\">无</string>\n    <string name=\"notification_action_buffering\">正在缓冲</string>\n    <string name=\"notification_action_shuffle\">随机播放</string>\n    <string name=\"notification_action_repeat\">单曲循环</string>\n    <string name=\"notification_actions_at_most_three\">最多可以选择三个操作显示在紧凑通知中！</string>\n    <string name=\"notification_actions_summary\">轻按下面的每一个通知操作进行编辑。使用右方的复选框选择在紧凑通知中显示的操作，最多可以选择三个。</string>\n    <string name=\"notification_action_4_title\">第五操作按钮</string>\n    <string name=\"notification_action_3_title\">第四操作按钮</string>\n    <string name=\"notification_action_2_title\">第三操作按钮</string>\n    <string name=\"notification_action_1_title\">第二操作按钮</string>\n    <string name=\"notification_action_0_title\">第一操作按钮</string>\n    <string name=\"notification_scale_to_square_image_summary\">将通知中视频缩略图的长宽比从 16:9 裁剪到 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">裁剪缩略图至 1:1 比例</string>\n    <string name=\"show_memory_leaks\">显示内存泄漏</string>\n    <string name=\"enqueued\">已加入播放队列</string>\n    <string name=\"enqueue_stream\">加入播放队列</string>\n    <string name=\"clear_cookie_summary\">清空与本地存储的 reCAPTCHA 验证码有关的 cookie</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA cookie 已被清空</string>\n    <string name=\"clear_cookie_title\">清空 reCAPTCHA cookie</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube提供了“受限模式”，可以隐藏潜在的成人内容</string>\n    <string name=\"show_age_restricted_content_summary\">展示有年龄限制的、可能不适合儿童观看的内容（比如 18+）</string>\n    <string name=\"notification_colorize_summary\">让 Android 系统根据视频缩略图的主色彩给通知着色（注意，该特性仅在部分设备上可用）</string>\n    <string name=\"notification_colorize_title\">自动着色通知</string>\n    <string name=\"show_thumbnail_summary\">锁屏背景和通知中使用缩略图</string>\n    <string name=\"show_thumbnail_title\">显示缩略图</string>\n    <string name=\"hash_channel_name\">视频哈希值计算通知</string>\n    <string name=\"hash_channel_description\">正在计算视频哈希值时显示的通知</string>\n    <string name=\"msg_calculating_hash\">正在计算哈希值</string>\n    <string name=\"recent\">最近</string>\n    <string name=\"show_meta_info_summary\">关闭以隐藏包含有关流创建者、流内容或搜索请求的附加信息的元信息框</string>\n    <string name=\"show_meta_info_title\">显示元数据信息</string>\n    <string name=\"show_description_title\">显示简介</string>\n    <string name=\"chapters\">章节</string>\n    <string name=\"description_tab_description\">简介</string>\n    <string name=\"related_items_tab_description\">相关视频</string>\n    <string name=\"comments_tab_description\">评论</string>\n    <string name=\"show_description_summary\">显示视频描述和其他信息</string>\n    <string name=\"open_with\">打开方式</string>\n    <string name=\"no_app_to_open_intent\">设备上没有应用可以打开</string>\n    <string name=\"crash_the_app\">让应用崩溃</string>\n    <string name=\"paid_content\">此内容仅对已付费的用户可用，因此 NewPipe 无法流式传输或下载该内容。</string>\n    <string name=\"youtube_music_premium_content\">该视频仅供 YouTube Music Premium 会员使用，NewPipe 无法流式传输或下载该视频。</string>\n    <string name=\"private_content\">此内容是私有的，因此 NewPipe 无法流式传输或下载该内容。</string>\n    <string name=\"soundcloud_go_plus_content\">这是 SoundCloud Go +曲目，至少在你所在的国家/地区是这样，因此 NewPipe 无法流式传输或下载它。</string>\n    <string name=\"georestricted_content\">此内容在你所在的国家/地区不可用。</string>\n    <string name=\"restricted_video_no_stream\">这个视频有年龄限制。\n\\n由于 YouTube 针对此类视频的新政策，NewPipe 无法访问其任何视频流，因此无法播放该视频。</string>\n    <string name=\"recaptcha_solve\">处理</string>\n    <string name=\"radio\">电台</string>\n    <string name=\"featured\">精选</string>\n    <string name=\"auto_device_theme_title\">自动（系统主题）</string>\n    <string name=\"download_has_started\">下载已开始</string>\n    <string name=\"select_night_theme_toast\">在此选择您最喜欢的夜间主题</string>\n    <string name=\"night_theme_summary\">选择你最喜欢的夜间主题 — %s</string>\n    <string name=\"night_theme_title\">夜间主题</string>\n    <string name=\"show_channel_details\">显示频道详情</string>\n    <string name=\"disable_media_tunneling_summary\">如果在视频播放中遇到黑屏或卡顿的情况，请停用媒体隧道。</string>\n    <string name=\"disable_media_tunneling_title\">停用媒体隧道</string>\n    <string name=\"description_select_disable\">停用简介中的文本选择功能</string>\n    <string name=\"metadata_privacy_internal\">内部</string>\n    <string name=\"metadata_privacy_private\">私享</string>\n    <string name=\"metadata_privacy_unlisted\">未分类</string>\n    <string name=\"metadata_privacy_public\">公开</string>\n    <string name=\"metadata_host\">所在服务器</string>\n    <string name=\"metadata_support\">支持</string>\n    <string name=\"metadata_language\">语言</string>\n    <string name=\"metadata_age_limit\">年龄限制</string>\n    <string name=\"metadata_privacy\">私密性</string>\n    <string name=\"metadata_licence\">许可</string>\n    <string name=\"metadata_tags\">标签</string>\n    <string name=\"metadata_category\">类别</string>\n    <string name=\"description_select_enable\">启用简介中的文本选择功能</string>\n    <string name=\"description_select_note\">你现在可以选择简介中的文本，注意，在选择模式下，页面可能会闪烁，链接可能无法点击。</string>\n    <string name=\"open_website_license\">打开网站</string>\n    <string name=\"account_terminated\">账号被终止</string>\n    <string name=\"feed_load_error_fast_unknown\">快速 Feed 模式不提供关于这个的更多信息。</string>\n    <string name=\"feed_load_error_terminated\">作者账号已被终止。\n\\nNewPipe 今后将无法加载此 Feed。\n\\n你要退订此频道吗？</string>\n    <string name=\"feed_load_error_account_info\">无法加载“%s”的 Feed。</string>\n    <string name=\"feed_load_error\">加载 Feed 时出错</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">仅 Android 10 及以上版本支持“存储访问框架”</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">你会被问到在哪里保存每个下载</string>\n    <string name=\"no_dir_yet\">尚未设置下载文件夹，现在选择默认下载文件夹</string>\n    <string name=\"tablet_mode_title\">平板模式</string>\n    <string name=\"off\">关闭</string>\n    <string name=\"on\">开启</string>\n    <string name=\"comments_are_disabled\">评论功能已停用</string>\n    <string name=\"seekbar_preview_thumbnail_title\">进度条缩略图预览</string>\n    <string name=\"dont_show\">不显示</string>\n    <string name=\"low_quality_smaller\">低品质（较小）</string>\n    <string name=\"high_quality_larger\">高品质（较大）</string>\n    <string name=\"detail_heart_img_view_description\">被创作者喜爱</string>\n    <string name=\"mark_as_watched\">标记为已观看</string>\n    <string name=\"remote_search_suggestions\">远程搜索建议</string>\n    <string name=\"local_search_suggestions\">本地搜索建议</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"other\">删除了 %1$s 个下载</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"other\">完成了 %s 个下载</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">滑动即可删除项目</string>\n    <string name=\"start_main_player_fullscreen_summary\">若自动旋转被锁定，不在以小窗播放器形式中播放视频，而直接切换到全屏模式。仍可以通过退出全屏以切换至小窗播放器</string>\n    <string name=\"start_main_player_fullscreen_title\">以全屏启动主播放器</string>\n    <string name=\"enqueued_next\">已添加为下一个播放</string>\n    <string name=\"enqueue_next_stream\">下一个播放</string>\n    <string name=\"processing_may_take_a_moment\">处理中…可能需要一些时间</string>\n    <string name=\"manual_update_description\">手动检查新版本</string>\n    <string name=\"checking_updates_toast\">检查更新中…</string>\n    <string name=\"check_for_updates\">检查更新</string>\n    <string name=\"feed_new_items\">新订阅源条目</string>\n    <string name=\"show_crash_the_player_title\">显示\\\"使播放器崩溃\\\"</string>\n    <string name=\"show_crash_the_player_summary\">在使用播放器时显示一个崩溃选项</string>\n    <string name=\"crash_the_player\">使播放器崩溃</string>\n    <string name=\"error_report_channel_name\">错误报告通知</string>\n    <string name=\"error_report_channel_description\">提示报告错误的通知</string>\n    <string name=\"error_report_notification_toast\">发生错误，详见通知</string>\n    <string name=\"show_error_snackbar\">显示错误警示SnackBar</string>\n    <string name=\"create_error_notification\">创建一条错误通知</string>\n    <string name=\"no_appropriate_file_manager_message\">找不到适合此操作的文件管理器。\n\\n请安装一文件管理器或尝试在下载设置中禁用“%s”</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">找不到适合此操作的文件管理器。\n\\n请安装兼容存储访问框架(SAF)的文件管理器</string>\n    <string name=\"error_report_notification_title\">NewPipe 遇到了一个错误，点击此处报告此错误</string>\n    <string name=\"detail_pinned_comment_view_description\">置顶评论</string>\n    <string name=\"leak_canary_not_available\">LeakCanary 不可用</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer 默认</string>\n    <string name=\"settings_category_player_notification_summary\">配置当前正在播放的串流的通知</string>\n    <string name=\"enable_streams_notifications_title\">新串流通知</string>\n    <string name=\"streams_notifications_interval_title\">检查频率</string>\n    <string name=\"streams_notifications_network_title\">所需的网络连接</string>\n    <string name=\"notifications_disabled\">通知已被禁用</string>\n    <string name=\"you_successfully_subscribed\">你刚刚订阅了此频道</string>\n    <string name=\"enumeration_comma\">，</string>\n    <string name=\"toggle_all\">全选</string>\n    <string name=\"settings_category_player_notification_title\">播放器通知</string>\n    <string name=\"notifications\">通知</string>\n    <string name=\"streams_notification_channel_name\">新的串流</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"other\">%s 个新音视频流</item>\n    </plurals>\n    <string name=\"streams_notification_channel_description\">被订阅的新串流的通知</string>\n    <string name=\"loading_stream_details\">正在加载串流详情…</string>\n    <string name=\"check_new_streams\">检查新串流</string>\n    <string name=\"any_network\">任何网络</string>\n    <string name=\"delete_downloaded_files_confirm\">清除所有下载的文件？</string>\n    <string name=\"get_notified\">获取通知</string>\n    <string name=\"enable_streams_notifications_summary\">来自订阅的新串流的通知</string>\n    <string name=\"semitone\">半音</string>\n    <string name=\"percent\">百分比</string>\n    <string name=\"unknown_format\">未知格式</string>\n    <string name=\"no_audio_streams_available_for_external_players\">没有音频流可用于外部播放器</string>\n    <string name=\"select_quality_external_players\">选择外部播放器画质</string>\n    <string name=\"selected_stream_external_player_not_supported\">外部播放器不支持所选串流</string>\n    <string name=\"no_video_streams_available_for_external_players\">没有视频流可用于外部播放器</string>\n    <string name=\"streams_not_yet_supported_removed\">不显示下载器尚不支持的串流</string>\n    <string name=\"unknown_quality\">未知画质</string>\n    <string name=\"progressive_load_interval_title\">播放加载间隔大小</string>\n    <string name=\"faq_title\">常见问题</string>\n    <string name=\"faq_description\">如果你在使用本应用时遇到问题，请务必查看这些常见问题的答案！</string>\n    <string name=\"faq\">在网站上查看</string>\n    <string name=\"sort\">排序</string>\n    <string name=\"fast_mode\">快速模式</string>\n    <string name=\"import_subscriptions_hint\">从三点菜单导入或导出订阅</string>\n    <string name=\"app_update_unavailable_toast\">你正在运行最新版的 NewPipe</string>\n    <string name=\"app_update_available_notification_text\">轻按下载 %s</string>\n    <string name=\"night_theme_available\">只有在主题中选择了 %s 该选项才可用</string>\n    <string name=\"unset_playlist_thumbnail\">取消设置永久缩略图</string>\n    <string name=\"card\">卡片</string>\n    <string name=\"msg_failed_to_copy\">无法复制到剪贴板</string>\n    <string name=\"duplicate_in_playlist\">变灰的播放列表已经包含此项目。</string>\n    <string name=\"playlist_add_stream_success_duplicate\">重复添加了 %d 次</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">如果你在使用一副物理按钮坏掉的耳机，该选项应该会有帮助</string>\n    <string name=\"ignore_hardware_media_buttons_title\">忽略硬件媒体按钮事件</string>\n    <string name=\"remove_duplicates_title\">删除重复吗？</string>\n    <string name=\"remove_duplicates_message\">你想删除这个播放列表中所有重复项吗？</string>\n    <string name=\"feed_hide_streams_title\">显示下列音视频流</string>\n    <string name=\"feed_show_hide_streams\">显示/隐藏音视频流</string>\n    <string name=\"feed_show_watched\">完整看过</string>\n    <string name=\"feed_show_partially_watched\">只看了一部分</string>\n    <string name=\"feed_show_upcoming\">即将到来</string>\n    <string name=\"remove_duplicates\">删除重复</string>\n    <string name=\"brightness\">亮度</string>\n    <string name=\"volume\">音量</string>\n    <string name=\"right_gesture_control_title\">右半边手势动作</string>\n    <string name=\"left_gesture_control_title\">左半边手势动作</string>\n    <string name=\"left_gesture_control_summary\">选择播放器屏幕左半边手势</string>\n    <string name=\"right_gesture_control_summary\">选择播放器屏幕右半边手势</string>\n    <string name=\"none\">无</string>\n    <string name=\"progressive_load_interval_summary\">更改渐进式内容的加载间隔大小（当前为 %s）。较低的值可加快初始加载</string>\n    <string name=\"prefer_descriptive_audio_title\">偏好描述性音频</string>\n    <string name=\"prefer_descriptive_audio_summary\">如果可用，为视障人群选择带描述的音轨</string>\n    <string name=\"play_queue_audio_track\">音频：%s</string>\n    <string name=\"audio_track_present_in_video\">此串流中应该已经有音轨</string>\n    <string name=\"select_audio_track_external_players\">选择外部播放器音轨</string>\n    <string name=\"unknown_audio_track\">未知</string>\n    <string name=\"settings_category_exoplayer_summary\">管理一些 ExoPlayer 设置。这些更改需要重启播放器才能生效</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">使用 ExoPlayer 的编码器回退功能</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">始终使用 ExoPlayer 的视频输出界面设置变通方法</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">此变通方法在发生界面更改时会释放并重新初始化视频编解码器，而不是直接将编解码器设置到新界面。在某些有这个问题的设备上，Exoplayer 已经在使用这个方法。此设置仅适用于 Android 6 及更高的系统版本\n\\n\n\\n启用此选项可防止切换当前视频播放器或切换到全屏播放时出现播放错误</string>\n    <string name=\"audio_track_type_original\">原始</string>\n    <string name=\"audio_track_type_dubbed\">配音</string>\n    <string name=\"audio_track_type_descriptive\">描述</string>\n    <string name=\"prefer_original_audio_title\">偏好原始音频</string>\n    <string name=\"prefer_original_audio_summary\">不管何种语言都选择原始音轨</string>\n    <string name=\"audio_track\">音轨</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer 设置</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">如遇解码器初始化方面的问题可开启此选项。启用后，如主解码器初始化失败，ExoPlayer 将使用较低优先级的解码器进行播放。请注意，这可能导致播放性能下降</string>\n    <string name=\"main_tabs_position_summary\">将主标签页选择器移到底部</string>\n    <string name=\"main_tabs_position_title\">主标签页位置</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"disable_media_tunneling_automatic_info\">媒体隧道功能在你的设备上默认停用，因为已知你的设备型号不支持它。</string>\n    <string name=\"no_live_streams\">无直播</string>\n    <string name=\"no_streams\">无音视频流</string>\n    <string name=\"channel_tab_videos\">视频</string>\n    <string name=\"metadata_subscribers\">订阅者</string>\n    <string name=\"show_channel_tabs_summary\">展示在频道页面上的标签页</string>\n    <string name=\"show_channel_tabs\">频道标签页</string>\n    <string name=\"channel_tab_shorts\">短视频</string>\n    <string name=\"loading_metadata_title\">正在加载元数据…</string>\n    <string name=\"feed_fetch_channel_tabs\">获取频道标签页</string>\n    <string name=\"channel_tab_about\">关于</string>\n    <string name=\"channel_tab_albums\">专辑</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">更新数据源时要获取的标签页。如果使用快速模式更新频道，则该选项无效果。</string>\n    <string name=\"channel_tab_playlists\">播放列表</string>\n    <string name=\"channel_tab_tracks\">歌曲</string>\n    <string name=\"channel_tab_channels\">频道</string>\n    <string name=\"channel_tab_livestreams\">直播</string>\n    <string name=\"toggle_screen_orientation\">切换全屏方向</string>\n    <string name=\"toggle_fullscreen\">切换全屏</string>\n    <string name=\"next_stream\">下一条串流</string>\n    <string name=\"open_play_queue\">打开播放队列</string>\n    <string name=\"forward\">前进</string>\n    <string name=\"rewind\">后退</string>\n    <string name=\"replay\">重放</string>\n    <string name=\"play\">播放</string>\n    <string name=\"more_options\">更多选项</string>\n    <string name=\"duration\">持续时间</string>\n    <string name=\"previous_stream\">上一条串流</string>\n    <string name=\"image_quality_title\">图片质量</string>\n    <string name=\"question_mark\">？</string>\n    <string name=\"image_quality_low\">低质量</string>\n    <string name=\"metadata_avatars\">头像</string>\n    <string name=\"metadata_subchannel_avatars\">子频道头像</string>\n    <string name=\"image_quality_none\">不加载图片</string>\n    <string name=\"image_quality_high\">高质量</string>\n    <string name=\"image_quality_medium\">中等质量</string>\n    <string name=\"metadata_uploader_avatars\">上传者头像</string>\n    <string name=\"metadata_banners\">横幅</string>\n    <string name=\"image_quality_summary\">选择图片质量以及是否根本不加载图片来降低数据和内存使用。更改选项会清除内存中和磁盘上的图片缓存 - %s</string>\n    <string name=\"metadata_thumbnails\">缩略图</string>\n    <string name=\"share_playlist_with_list\">只包含视频网址</string>\n    <string name=\"share_playlist_with_titles\">分享时带视频标题</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">分享播放列表</string>\n    <string name=\"video_details_list_item\">- %1$s: %2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"other\">%s 条回复</item>\n    </plurals>\n    <string name=\"show_more\">显示较多</string>\n    <string name=\"show_less\">显示较少</string>\n    <string name=\"notification_actions_summary_android13\">轻按下方的每个通知操作进行编辑。头三个动作（播放/暂停、上一个和下一个）是系统设置的，不能自定义。</string>\n    <string name=\"error_insufficient_storage\">设备剩余空间不足</string>\n    <string name=\"settings_category_backup_restore_title\">备份和还原</string>\n    <string name=\"reset_settings_title\">重置设置</string>\n    <string name=\"reset_settings_summary\">将所有设置重置为默认值</string>\n    <string name=\"reset_all_settings\">重置所有设置会取消你所有的偏好设置并重启应用。\n\\n\n\\n你确定想要继续吗？</string>\n    <string name=\"no\">否</string>\n    <string name=\"auto_update_check_description\">NewPipe 可以自动时不时地检查新版本并在新版本可用时通知你。\n\\n你想开启该功能吗？</string>\n    <string name=\"yes\">是</string>\n    <string name=\"import_settings_vulnerable_format\">正导入的导出文件中的设置使用了有漏洞的格式，该格式已从 NewPipe 0.27.0 版本起被弃用。请确保导入的导出文件来自可信来源，今后最好只使用从 NewPipe 0.27.0 或更新版本获取的导出文件。不久后将完全不支持导入这一有漏洞格式的设置，到时旧版 NewPipe 再不能导入来自新版应用的设置导出文件。</string>\n    <string name=\"audio_track_type_secondary\">第二</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">分享为 YouTube 临时播放列表</string>\n    <string name=\"tab_bookmarks_short\">播放列表</string>\n    <string name=\"feed_group_page_summary\">频道组页面</string>\n    <string name=\"select_a_feed_group\">选择一个订阅源组</string>\n    <string name=\"no_feed_group_created_yet\">尚未创建订阅源组</string>\n    <string name=\"channel_tab_likes\">赞</string>\n    <string name=\"search_with_service_name\">搜索%1$s</string>\n    <string name=\"search_with_service_name_and_filter\">搜索 %1$s （%2$s）</string>\n    <string name=\"migration_info_6_7_title\">移除了 SoundCloud Top 50 页面</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud 已停止发布原创 Top 50 榜单。相应的标签页已从你的主页移除。</string>\n    <string name=\"migration_info_7_8_title\">移除了 Youtube 合并的“时下流行”标签页</string>\n    <string name=\"migration_info_7_8_message\">自 2025.7.21 起， Youtube 下线了合并的“时下流行”标签页。Newpipe 用“时下流行”的直播替代了默认的“时下流行”页。\\n\\n你也可以在 “设置 &gt; 内容&gt; 主页内容”中选择不同的“时下流行”页。</string>\n    <string name=\"trending_gaming\">“时下流行”的游戏视频</string>\n    <string name=\"trending_podcasts\">“时下流行”的播客</string>\n    <string name=\"trending_movies\">“时下流行”的电影和娱乐节目</string>\n    <string name=\"trending_music\">“时下流行”的音乐</string>\n    <string name=\"short_thousand\">%s千</string>\n    <string name=\"short_million\">%s百万</string>\n    <string name=\"short_billion\">%s十亿</string>\n    <string name=\"permission_display_over_apps_message\">要使用弹窗播放器，请在接下来的安卓设置中选择 %1$s 并开启 %2$s。</string>\n    <string name=\"permission_display_over_apps_permission_name\">“允许显示在其他应用上方”</string>\n    <string name=\"delete_file\">删除文件</string>\n    <string name=\"delete_entry\">删除条目</string>\n    <string name=\"entry_deleted\">删除了条目</string>\n    <string name=\"account_terminated_service_provides_reason\">账户终止\\n\\n%1$s 提供了这个原因：%2$s</string>\n    <string name=\"player_http_403\">播放时从服务器收到 HTTP 403 错误，可能因串流 URL 过期或 IP 封锁导致</string>\n    <string name=\"player_http_invalid_status\">播放时从服务器收到 HTTP %1$s 错误</string>\n    <string name=\"youtube_player_http_403\">播放时从服务器收到 HTTP 403 错误，可能因 IP 封锁或串流 URL 解密问题导致</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s 拒绝提供数据， 要求登录确认请求方不是机器人。\\n\\n你的 IP 可能已经暂时被 %1$s 封禁，你可以等待一段时间或切换到不同 IP （比如开/关 VPN, 或者从 WiFi 连接切换到移动数据）。</string>\n    <string name=\"unsupported_content_in_country\">此内容对当前选中的内容地区不可用。\\n\\n要更改选择，请前往 “设置 &gt; 内容 &gt; 默认内容地区”。</string>\n    <string name=\"kao_dialog_warning\">2025 年 8 月，Google 宣布自 2026 年 9 月起，在已认证设备上安装所有安卓应用都需要开发者验证身份，包括在 Play 商店之外安装的应用。由于 NewPipe 开发者反对此要求，NewPipe 在此时间点后不会再在已认证设备上工作。</string>\n    <string name=\"kao_dialog_more_info\">详情</string>\n    <string name=\"kao_solution\">解决方案</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-zh-rHK/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"install\">安裝</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"upload_date_text\">喺 %1$s 發佈</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下載</string>\n    <string name=\"search\">搜尋</string>\n    <string name=\"settings\">設定</string>\n    <string name=\"did_you_mean\">你係咪想搵「%1$s」？</string>\n    <string name=\"use_external_video_player_title\">用出面嘅影片播放器</string>\n    <string name=\"use_external_audio_player_title\">用出面嘅音樂播放器</string>\n    <string name=\"download_path_title\">影片下載路徑</string>\n    <string name=\"download_path_summary\">下載咗嘅影片檔案會收埋喺度</string>\n    <string name=\"download_path_dialog_title\">揀選影片檔案嘅下載文件夾</string>\n    <string name=\"default_resolution_title\">預設嘅解像度</string>\n    <string name=\"play_with_kodi_title\">用 Kodi 嚟播放</string>\n    <string name=\"kore_not_found\">裝唔裝缺少咗嘅 Kore app？</string>\n    <string name=\"show_play_with_kodi_title\">顯示「用 Kodi 嚟播放」嘅選項</string>\n    <string name=\"show_play_with_kodi_summary\">顯示以 Kodi 媒體中心播放影片嘅選項</string>\n    <string name=\"play_audio\">聲音</string>\n    <string name=\"default_audio_format_title\">預設聲音檔案格式</string>\n    <string name=\"theme_title\">主題色系</string>\n    <string name=\"dark_theme_title\">黑眼睛</string>\n    <string name=\"light_theme_title\">白頭浪</string>\n    <string name=\"download_dialog_title\">下載</string>\n    <string name=\"show_next_and_similar_title\">顯示「接續落」同「咁上下」嘅影片</string>\n    <string name=\"unsupported_url\">唔支援呢個網址</string>\n    <string name=\"content_language_title\">預設內容語言</string>\n    <string name=\"settings_category_video_audio_title\">影音</string>\n    <string name=\"settings_category_appearance_title\">版面</string>\n    <string name=\"background_player_playing_toast\">幕後播緊</string>\n    <string name=\"network_error\">網絡問題</string>\n    <string name=\"detail_thumbnail_view_description\">播放影片，片長：</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">上載者嘅頭像縮圖</string>\n    <string name=\"detail_likes_img_view_description\">讚好</string>\n    <string name=\"detail_dislikes_img_view_description\">負皮</string>\n    <string name=\"no_player_found\">搵唔到串流播放器。要唔要裝 VLC？</string>\n    <string name=\"open_in_browser\">喺瀏覽器開啟</string>\n    <string name=\"share_dialog_title\">分享影片畀</string>\n    <string name=\"download_path_audio_title\">音樂下載文件夾</string>\n    <string name=\"download_path_audio_summary\">下載咗嘅音樂檔案會收埋喺度</string>\n    <string name=\"download_path_audio_dialog_title\">揀選音樂檔案嘅下載文件夾</string>\n    <string name=\"main_bg_subtitle\">撳放大鏡開始。</string>\n    <string name=\"content\">內容</string>\n    <string name=\"show_age_restricted_content_title\">顯示年齡設限嘅內容</string>\n    <string name=\"duration_live\">直播</string>\n    <string name=\"general_error\">問題</string>\n    <string name=\"could_not_load_thumbnails\">載入唔晒全部縮圖</string>\n    <string name=\"parsing_error\">解析唔到網站</string>\n    <string name=\"could_not_setup_download_menu\">設定唔到下載功能表</string>\n    <string name=\"sorry_string\">啫係嗱，世事講唔埋嘅，真係唔好意思。</string>\n    <string name=\"error_report_button_text\">以電郵報告</string>\n    <string name=\"error_snackbar_message\">出咗啲問題，唔好意思。</string>\n    <string name=\"error_snackbar_action\">報告</string>\n    <string name=\"what_device_headline\">資訊：</string>\n    <string name=\"what_happened_headline\">出咗咩事：</string>\n    <string name=\"your_comment\">你嘅見解 (請以英文輸入)：</string>\n    <string name=\"error_details_headline\">詳情：</string>\n    <string name=\"video\">影片</string>\n    <string name=\"audio\">聲音</string>\n    <string name=\"retry\">重試</string>\n    <string name=\"downloads\">下載</string>\n    <string name=\"downloads_title\">下載</string>\n    <string name=\"error_report_title\">問題報告</string>\n    <string name=\"content_not_available\">未能提供內容</string>\n    <string name=\"start\">開始</string>\n    <string name=\"pause\">暫停</string>\n    <string name=\"delete\">剷走</string>\n    <string name=\"checksum\">校驗碼</string>\n    <string name=\"ok\">好</string>\n    <string name=\"msg_name\">檔案名稱</string>\n    <string name=\"msg_threads\">執行緒數量</string>\n    <string name=\"msg_error\">錯誤</string>\n    <string name=\"msg_running\">NewPipe 下載緊</string>\n    <string name=\"msg_running_detail\">撳一下睇詳情</string>\n    <string name=\"msg_wait\">請等等…</string>\n    <string name=\"msg_copied\">複製咗去剪貼簿</string>\n    <string name=\"no_available_dir\">請之後喺設定度揀定一個下載資料夾</string>\n    <string name=\"open_in_popup_mode\">以浮面模式開啟</string>\n    <string name=\"default_popup_resolution_title\">預設浮面播放器嘅解像度</string>\n    <string name=\"show_higher_resolutions_title\">顯示更高解像度</string>\n    <string name=\"show_higher_resolutions_summary\">得某啲機先播到 2K/4K 影片</string>\n    <string name=\"default_video_format_title\">預設嘅影片檔案格式</string>\n    <string name=\"black_theme_title\">紅日降</string>\n    <string name=\"popup_playing_toast\">浮面播緊</string>\n    <string name=\"all\">全部嘢</string>\n    <string name=\"app_ui_crash\">App/界面閃退</string>\n    <string name=\"info_labels\">經過：\\n請求：\\n內容語言：\\n內容國家：\\nApp 語言：\\n服務：\\nGMT 時間：\\n封裝：\\n版本：\\nOS 版本：</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA 考驗</string>\n    <string name=\"msg_popup_permission\">以浮面模式開啟\n\\n有呢個權限至得</string>\n    <string name=\"recaptcha_request_toast\">要完成 reCAPTCHA 考驗</string>\n    <string name=\"use_external_video_player_summary\">某啲影片可能會冇聲</string>\n    <string name=\"controls_background_title\">幕後播</string>\n    <string name=\"controls_popup_title\">浮面播</string>\n    <string name=\"popup_remember_size_pos_title\">記住浮面嘅擺法</string>\n    <string name=\"popup_remember_size_pos_summary\">記住上次浮面嘅大細同擺位</string>\n    <string name=\"show_search_suggestions_title\">搜尋建議</string>\n    <string name=\"show_search_suggestions_summary\">揀選搜尋嘅時候顯示邊啲建議</string>\n    <string name=\"disabled\">不適用</string>\n    <string name=\"clear\">抹走</string>\n    <string name=\"best_resolution\">最佳解像度</string>\n    <string name=\"title_activity_about\">關於 NewPipe</string>\n    <string name=\"title_licenses\">第三方版權協議</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s %2$s 版權所有，根據 %3$s 嘅條款授權</string>\n    <string name=\"tab_about\">跋記</string>\n    <string name=\"tab_licenses\">版權協議</string>\n    <string name=\"app_description\">喺 Android 上盡享自由輕快嘅串流。</string>\n    <string name=\"view_on_github\">去 GitHub 睇下</string>\n    <string name=\"app_license_title\">NewPipe 嘅版權協議</string>\n    <string name=\"contribution_encouragement\">無論你對翻譯、設計改動、打掃程式碼，抑或開山劈石編寫程式碼有咩偈仔，都勁歡迎你嚟幫手。聚沙成塔，眾志成城！</string>\n    <string name=\"read_full_license\">閱讀版權協議</string>\n    <string name=\"contribution_title\">貢獻</string>\n    <string name=\"clear_views_history_title\">抹走播放紀錄</string>\n    <string name=\"no_player_found_toast\">搵唔到串流播放器 (你可以裝 VLC 嚟播)。</string>\n    <string name=\"controls_download_desc\">下載串流檔案</string>\n    <string name=\"subscribe_button_title\">訂閱</string>\n    <string name=\"subscribed_button_title\">訂閱咗</string>\n    <string name=\"unsubscribe\">取消訂閱</string>\n    <string name=\"channel_unsubscribed\">已取消訂閱頻道</string>\n    <string name=\"subscription_change_failed\">改唔到訂閱</string>\n    <string name=\"subscription_update_failed\">更新唔到訂閱</string>\n    <string name=\"show_info\">顯示資訊</string>\n    <string name=\"tab_subscriptions\">訂閱</string>\n    <string name=\"tab_bookmarks\">儲起嘅播放清單</string>\n    <string name=\"use_inexact_seek_title\">用粗略嘅快轉</string>\n    <string name=\"controls_add_to_playlist_title\">加入去</string>\n    <string name=\"tab_choose\">選擇標籤</string>\n    <string name=\"notification_action_0_title\">第一粒動作掣</string>\n    <string name=\"notification_action_1_title\">第二粒動作掣</string>\n    <string name=\"notification_action_2_title\">第三粒動作掣</string>\n    <string name=\"notification_action_3_title\">第四粒動作掣</string>\n    <string name=\"notification_action_shuffle\">隨機播放</string>\n    <string name=\"notification_action_buffering\">緩衝緊</string>\n    <string name=\"notification_action_nothing\">空寥寥</string>\n    <string name=\"local_search_suggestions\">本機搜尋建議</string>\n    <string name=\"remote_search_suggestions\">遠端搜尋建議</string>\n    <string name=\"enable_search_history_summary\">喺本機儲低搵過嘅紀錄</string>\n    <string name=\"enable_watch_history_title\">有睇過有紀錄</string>\n    <string name=\"enable_playback_resume_title\">恢復播放</string>\n    <string name=\"enable_playback_resume_summary\">返返去最後播放嘅嗰個位</string>\n    <string name=\"enable_playback_state_lists_title\">清單度睇到播到去邊</string>\n    <string name=\"notification_scale_to_square_image_title\">縮圖以 1:1 長寬比框起</string>\n    <string name=\"notification_scale_to_square_image_summary\">顯示喺通知嘅影片縮圖由 16:9 剪成 1:1 長寬比</string>\n    <string name=\"notification_colorize_title\">通知色彩化</string>\n    <string name=\"notification_colorize_summary\">等 Android 根據縮圖嘅主色自訂通知嘅顏色 (注意：唔係部部機都用得)</string>\n    <string name=\"night_theme_title\">晚風色系</string>\n    <string name=\"seek_duration_title\">跳前/跳後嘅快轉長短</string>\n    <string name=\"show_description_summary\">閂埋佢去隱藏影片描述同附加資訊</string>\n    <string name=\"mark_as_watched\">剔低睇過</string>\n    <string name=\"open_with\">開啟方式係</string>\n    <string name=\"search_showing_result_for\">搜尋到嘅嘢係：%s</string>\n    <string name=\"notification_action_4_title\">第五粒動作掣</string>\n    <string name=\"notification_actions_summary\">撳下面嘅掣去更改對應嘅通知動作。用右手邊嘅格仔剔選最多三個，擺落去精簡通知度。</string>\n    <string name=\"notification_actions_at_most_three\">精簡通知最多淨係擺到三個動作！</string>\n    <string name=\"notification_action_repeat\">循環播放</string>\n    <string name=\"show_comments_title\">顯示留言</string>\n    <string name=\"show_comments_summary\">關閉去隱藏留言</string>\n    <string name=\"enable_search_history_title\">搜尋紀錄</string>\n    <string name=\"enable_playback_state_lists_summary\">喺清單入面顯示最後播放到去邊個位</string>\n    <string name=\"settings_category_clear_data_title\">抹除資料</string>\n    <string name=\"show_description_title\">顯示描述</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">抹除咗影像快取</string>\n    <string name=\"metadata_cache_wipe_summary\">移除所有網頁嘅快取資料</string>\n    <string name=\"use_inexact_seek_summary\">粗略嘅快轉允許播放器比較籠統咁快轉去其他位置。快轉 5、15 或 25 秒就太仔細，做唔到</string>\n    <string name=\"settings_category_player_title\">播放器</string>\n    <string name=\"default_content_country_title\">預設嘅國家內容</string>\n    <string name=\"artists\">演出者</string>\n    <string name=\"albums\">專輯</string>\n    <string name=\"peertube_instance_add_https_only\">淨係支援 HTTPS 嘅 URL</string>\n    <string name=\"settings_category_debug_title\">除錯</string>\n    <string name=\"undo\">復原</string>\n    <string name=\"file_deleted\">剷走咗個檔案</string>\n    <string name=\"always\">幾時都係</string>\n    <string name=\"just_once\">一次咁多</string>\n    <string name=\"file\">檔案</string>\n    <string name=\"notification_channel_name\">NewPipe 通知</string>\n    <string name=\"app_update_notification_channel_name\">App 更新通知</string>\n    <string name=\"app_update_notification_channel_description\">NewPipe 有新版本嘅通知</string>\n    <string name=\"clear_cookie_title\">抹走 reCAPTCHA Cookie</string>\n    <string name=\"channels\">頻道</string>\n    <string name=\"videos_string\">影片</string>\n    <string name=\"users\">使用者</string>\n    <string name=\"events\">事件</string>\n    <string name=\"songs\">歌曲</string>\n    <string name=\"clear_cookie_summary\">抹走當你完成 reCAPTCHA 嘅時候， NewPipe 儲存嘅 Cookie</string>\n    <string name=\"switch_to_main\">轉返主版面</string>\n    <string name=\"switch_to_background\">收埋喺背景</string>\n    <string name=\"switch_to_popup\">撈起去浮面</string>\n    <string name=\"import_data_title\">匯入資料庫</string>\n    <string name=\"start_main_player_fullscreen_title\">主播放器用全螢幕開啟</string>\n    <string name=\"start_main_player_fullscreen_summary\">開啟影片嘅時候唔用袖珍播放器就直接飛去全螢幕模式，如果自動旋轉鎖定嘅話。你仍可結束全螢幕返返去袖珍播放器</string>\n    <string name=\"unsupported_url_dialog_message\">認唔出呢個 URL。要唔要用另一個 app 開？</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube 提供嘅「嚴格篩選模式」可以過濾潛在嘅成人內容</string>\n    <string name=\"show_age_restricted_content_summary\">有年齡限制 (例如 18+/兒童不宜）嘅內容都照顯示</string>\n    <string name=\"restricted_video\">呢部影片有年齡限制。\n\\n\n\\n如果你想睇，請喺設定度開啟「%1$s」。</string>\n    <string name=\"restricted_video_no_stream\">呢部影片有年齡限制。\n\\n鑑於 YouTube 就年齡限制影片嘅新政策，NewPipe 存取唔到條片嘅任何影像串流，所以播放唔到。</string>\n    <string name=\"unknown_content\">[未知]</string>\n    <string name=\"export_data_title\">匯出資料庫</string>\n    <string name=\"recaptcha_cookies_cleared\">抹走咗 reCAPTCHA Cookie</string>\n    <string name=\"resume_on_audio_focus_gain_title\">恢復播放</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">打斷 (例如有電話) 完之後繼續播放</string>\n    <string name=\"enable_watch_history_summary\">記低晒睇過嘅影片</string>\n    <string name=\"autoplay_title\">自動播放</string>\n    <string name=\"settings_category_updates_title\">更新</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">開啟 YouTube 嘅「嚴格篩選模式」</string>\n    <string name=\"no_streams_available_download\">冇串流下載得到</string>\n    <string name=\"permission_display_over_apps\">畀權限去喺其他 app 上面顯示</string>\n    <string name=\"error_report_open_issue_button_text\">去 GitHub 度報告</string>\n    <string name=\"comments_tab_description\">留言</string>\n    <string name=\"related_items_tab_description\">咁上下嘅嘢</string>\n    <string name=\"description_tab_description\">描述</string>\n    <string name=\"player_stream_failure\">播放唔到呢個串流</string>\n    <string name=\"player_unrecoverable_failure\">發生無法復原嘅播放器錯誤</string>\n    <string name=\"external_player_unsupported_link_type\">外置播放器唔支援呢類型嘅連結</string>\n    <string name=\"video_streams_empty\">搵唔到影像串流</string>\n    <string name=\"audio_streams_empty\">搵唔到聲音串流</string>\n    <string name=\"missing_file\">檔案搬走咗或剷走咗</string>\n    <string name=\"invalid_file\">個檔案唔喺度，又或者欠缺讀寫權限</string>\n    <string name=\"file_name_empty_error\">檔名冇得留空</string>\n    <string name=\"player_recoverable_failure\">復原緊播放器錯誤</string>\n    <string name=\"invalid_directory\">冇呢個資料夾</string>\n    <string name=\"invalid_source\">冇呢個檔案/內容來源</string>\n    <string name=\"saved_tabs_invalid_json\">讀取唔到儲存咗嘅分頁，所以用返預設分頁</string>\n    <string name=\"restore_defaults\">還原返預設噉樣</string>\n    <string name=\"error_occurred_detail\">發生錯誤：%1$s</string>\n    <string name=\"restore_defaults_confirmation\">你係咪要還原返做預設嗰個樣？</string>\n    <string name=\"copy_for_github\">複製執咗格式嘅報告</string>\n    <string name=\"search_no_results\">乜都搵唔到</string>\n    <string name=\"enumeration_comma\">、</string>\n    <string name=\"name\">名稱</string>\n    <string name=\"accept\">接受</string>\n    <string name=\"close\">閂埋佢</string>\n    <string name=\"download_failed\">下載失敗</string>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"other\">完成咗 %s 嘅下載</item>\n    </plurals>\n    <string name=\"generate_unique_name\">產生獨一無二嘅名稱</string>\n    <string name=\"import_file_title\">匯入檔案</string>\n    <string name=\"export_ongoing\">匯出緊…</string>\n    <string name=\"previous_export\">先前嘅匯出</string>\n    <string name=\"import_network_expensive_warning\">請注意：呢項操作可能相當消耗網絡數據。\n\\n\n\\n你係咪要繼續？</string>\n    <string name=\"never\">幾時都唔使</string>\n    <string name=\"auto\">自動</string>\n    <string name=\"low_quality_smaller\">低畫質 (細格啲)</string>\n    <string name=\"dont_show\">唔顯示</string>\n    <string name=\"no_views\">無觀看次數</string>\n    <plurals name=\"listening\">\n        <item quantity=\"other\">%s 個人聽緊</item>\n    </plurals>\n    <string name=\"dismiss\">明白</string>\n    <string name=\"queued\">排緊隊</string>\n    <string name=\"post_processing\">後期處理緊</string>\n    <string name=\"paused\">暫停咗</string>\n    <string name=\"limit_data_usage_none_description\">無限制</string>\n    <string name=\"playlist_no_uploader\">自動產生 (搵唔到上載者)</string>\n    <string name=\"settings_file_replacement_character_title\">代替字元</string>\n    <string name=\"no_valid_zip_file\">個 ZIP 檔無效</string>\n    <string name=\"most_liked\">最多讚</string>\n    <string name=\"export_complete_toast\">匯出咗</string>\n    <plurals name=\"views\">\n        <item quantity=\"other\">%s 次觀看</item>\n    </plurals>\n    <string name=\"no_one_watching\">無人睇緊</string>\n    <plurals name=\"videos\">\n        <item quantity=\"other\">%s 部影片</item>\n    </plurals>\n    <string name=\"no_comments\">無留言</string>\n    <string name=\"msg_calculating_hash\">計算緊雜湊</string>\n    <string name=\"settings_file_charset_title\">檔名准用啲咩字元</string>\n    <string name=\"settings_file_replacement_character_summary\">無效嘅字元會用呢一楷嚟代替</string>\n    <string name=\"website_encouragement\">去 NewPipe 網站睇更多資訊同最新消息。</string>\n    <string name=\"read_privacy_policy\">閱讀私隱政策</string>\n    <string name=\"import_complete_toast\">匯入咗</string>\n    <string name=\"preferred_player_fetcher_notification_title\">攞緊資訊…</string>\n    <string name=\"resize_fill\">填滿</string>\n    <string name=\"resize_zoom\">縮放</string>\n    <string name=\"subscriptions_import_unsuccessful\">匯入唔到訂閱</string>\n    <string name=\"playback_tempo\">節奏</string>\n    <string name=\"playback_speed_control\">播放速度控掣</string>\n    <string name=\"systems_language\">系統預設</string>\n    <string name=\"check_for_updates\">檢查有冇更新</string>\n    <string name=\"app_language_title\">個 App 用咩語言</string>\n    <string name=\"remove_watched\">睇咗嗰啲剷咗佢</string>\n    <string name=\"remove_watched_popup_title\">係咪要剷走睇咗嘅影片？</string>\n    <string name=\"website_title\">網站</string>\n    <string name=\"privacy_policy_title\">NewPipe 嘅私隱政策</string>\n    <string name=\"rename_playlist\">改過個名</string>\n    <string name=\"playback_pitch\">音高</string>\n    <string name=\"missions_header_finished\">完成咗</string>\n    <string name=\"no_videos\">無影片</string>\n    <string name=\"video_player\">影片播放器</string>\n    <string name=\"wifi_only\">淨係用 Wi-Fi 嗰陣</string>\n    <string name=\"high_quality_larger\">高畫質 (大格啲)</string>\n    <string name=\"no_subscribers\">無訂閱者</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"other\">%s 位訂閱者</item>\n    </plurals>\n    <string name=\"subscribers_count_not_available\">訂閱者人數不詳</string>\n    <plurals name=\"watching\">\n        <item quantity=\"other\">%s 個人睇緊</item>\n    </plurals>\n    <string name=\"no_one_listening\">無人聽緊</string>\n    <string name=\"more_than_100_videos\">100+ 部影片</string>\n    <string name=\"infinite_videos\">∞ 部影片</string>\n    <string name=\"comments_are_disabled\">未開放留言</string>\n    <string name=\"create\">加新</string>\n    <string name=\"no_dir_yet\">未設定下載資料夾，請立即揀選預設嘅下載資料夾</string>\n    <string name=\"one_item_deleted\">刪除咗 1 個項目。</string>\n    <string name=\"recaptcha_solve\">執執佢</string>\n    <string name=\"done\">搞掂</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe 專案非常著重你嘅私隱。因此，呢個 app 未得你同意係唔會收集任何資料。\n\\nNewPipe 嘅私隱政策會詳述，當你傳送彈 app 報告嗰陣，有咩資料會傳送同保存。</string>\n    <string name=\"title_last_played\">最近播放</string>\n    <string name=\"title_most_played\">最常播放</string>\n    <string name=\"main_page_content\">頭條新嘢</string>\n    <string name=\"main_page_content_summary\">頭版要擺放邊啲分頁</string>\n    <string name=\"main_page_content_swipe_remove\">打橫掃走啲項目去剷走佢</string>\n    <string name=\"blank_page_summary\">空白頁</string>\n    <string name=\"trending\">時興</string>\n    <string name=\"top_50\">頭 50 位</string>\n    <string name=\"new_and_hot\">最新同大熱</string>\n    <string name=\"could_not_import_all_files\">警告：未能匯入晒全部檔案。</string>\n    <string name=\"override_current_data\">噉樣做會冚咗你而家嘅設定個囉噃。</string>\n    <string name=\"import_settings\">你想唔想匯入埋啲設定？</string>\n    <string name=\"error_unable_to_load_comments\">載入唔到留言</string>\n    <string name=\"recently_added\">最近新加</string>\n    <string name=\"play_queue_remove\">剷咗佢</string>\n    <string name=\"play_queue_stream_detail\">詳細資料</string>\n    <string name=\"unmute\">唔使噤聲</string>\n    <string name=\"background_player\">背景播放器</string>\n    <string name=\"popup_player\">浮面播放器</string>\n    <string name=\"always_ask_open_action\">幾時都問</string>\n    <string name=\"preferred_player_fetcher_notification_message\">載入緊請求嘅內容</string>\n    <string name=\"caption_setting_title\">字幕</string>\n    <string name=\"caption_none\">無字幕</string>\n    <string name=\"caption_auto_generated\">自動產生</string>\n    <string name=\"resize_fit\">貼合</string>\n    <string name=\"import_title\">匯入</string>\n    <string name=\"import_from\">由呢處匯入</string>\n    <string name=\"export_to\">匯出去呢度</string>\n    <string name=\"import_ongoing\">匯入緊…</string>\n    <string name=\"skip_silence_checkbox\">無聲嘅時候快轉</string>\n    <string name=\"playback_reset\">重設</string>\n    <string name=\"start_accept_privacy_policy\">為符合歐盟嘅《通用數據保障條例》(GDPR) 規範，我哋謹請你注意 NewPipe 嘅私隱政策。請仔細閱讀。\n\\n你必須接受，先可以傳送錯誤報告畀我哋。</string>\n    <string name=\"decline\">拒絕</string>\n    <string name=\"limit_mobile_data_usage_title\">用流動數據嘅時候限制解像度</string>\n    <string name=\"updates_setting_title\">更新</string>\n    <string name=\"updates_setting_description\">出咗新版本嘅時候，顯示通知提示升級個 app</string>\n    <string name=\"manual_update_description\">手動檢查下有冇新版本</string>\n    <string name=\"app_update_available_notification_title\">NewPipe 出咗更新喇！</string>\n    <string name=\"missions_header_pending\">仲等緊</string>\n    <string name=\"recovering\">恢復緊</string>\n    <string name=\"permission_denied\">動作被系統拒絕咗</string>\n    <string name=\"checking_updates_toast\">檢查緊有冇更新…</string>\n    <string name=\"overwrite\">覆寫</string>\n    <plurals name=\"hours\">\n        <item quantity=\"other\">%d 個鐘</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"other\">%d 日</item>\n    </plurals>\n    <string name=\"fragment_feed_title\">有咩新嘢</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"other\">%d 秒</item>\n    </plurals>\n    <plurals name=\"minutes\">\n        <item quantity=\"other\">%d 分鐘</item>\n    </plurals>\n    <string name=\"rename\">改過個名</string>\n    <string name=\"charset_letters_and_digits\">字母同數目字</string>\n    <string name=\"charset_most_special_characters\">大部份嘅特殊字元</string>\n    <string name=\"settings_category_downloads_title\">下載</string>\n    <string name=\"donation_title\">課金</string>\n    <string name=\"subscriptions_export_unsuccessful\">匯出唔到訂閱</string>\n    <string name=\"caption_setting_description\">修改播放器字幕大細同背景款式。要重新開過個 app 先會生效</string>\n    <string name=\"subtitle_activity_recaptcha\">執好就撳一下「搞掂」</string>\n    <string name=\"mute\">噤聲</string>\n    <string name=\"processing_may_take_a_moment\">處理緊… 可能要等等</string>\n    <string name=\"crash_the_player\">令播放器閃退</string>\n    <string name=\"auto_queue_toggle\">自動輪候</string>\n    <string name=\"delete_view_history_alert\">係咪要全部剷走晒睇片嘅紀錄？</string>\n    <string name=\"show_meta_info_title\">顯示元資訊</string>\n    <string name=\"show_meta_info_summary\">閂埋佢去隱藏元資訊窗口，收起有關串流創作者、串流內容或者搜尋請求嘅額外資訊</string>\n    <string name=\"show_hold_to_append_title\">顯示「撳住就輪候」提示</string>\n    <string name=\"peertube_instance_url_summary\">揀選啱你心水嘅 PeerTube 站</string>\n    <string name=\"settings_category_history_title\">紀錄與快取</string>\n    <string name=\"notification_channel_description\">NewPipe 播放器嘅通知</string>\n    <string name=\"metadata_cache_wipe_title\">抹除元資料快取</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">抹除咗元資料快取</string>\n    <string name=\"auto_queue_title\">自動輪候接落串流</string>\n    <string name=\"auto_queue_summary\">排隊清單嘅片要播完嘅時候 (並未設定循環播放) ，就追加一條相似性質嘅串流片</string>\n    <string name=\"peertube_instance_url_title\">PeerTube 站</string>\n    <string name=\"peertube_instance_url_help\">去 %s 發掘啱你心水嘅站</string>\n    <string name=\"playlists\">播放清單</string>\n    <string name=\"error_report_channel_name\">問題報告通知</string>\n    <string name=\"error_report_channel_description\">報告問題嘅通知</string>\n    <string name=\"clear_views_history_summary\">剷走播放過嘅串流同之前啲片睇到邊嘅紀錄</string>\n    <string name=\"watch_history_deleted\">剷走咗睇過嘅紀錄</string>\n    <string name=\"error_report_notification_title\">NewPipe 遇到問題，撳一下去報告</string>\n    <string name=\"error_report_notification_toast\">發生問題，詳見通知</string>\n    <string name=\"detail_drag_description\">拖條片去執好清單排位</string>\n    <string name=\"drawer_header_description\">轉換服務，而家揀選咗嘅係：</string>\n    <string name=\"list_view_mode\">清單檢視模式</string>\n    <string name=\"error_progress_lost\">做做下冇咗，因為個檔案刪除咗</string>\n    <string name=\"error_timeout\">等太耐連線</string>\n    <string name=\"start_downloads\">開始晒所有下載</string>\n    <string name=\"enable_queue_limit_desc\">下載要排隊逐個嚟</string>\n    <string name=\"recent\">近期</string>\n    <string name=\"account_terminated\">已終止帳戶</string>\n    <string name=\"metadata_language\">語言</string>\n    <string name=\"metadata_support\">支援</string>\n    <string name=\"overwrite_failed\">覆寫唔到個檔案</string>\n    <string name=\"pause_downloads\">暫停晒所有下載</string>\n    <string name=\"on\">開</string>\n    <string name=\"tablet_mode_title\">平板電腦模式</string>\n    <string name=\"error_file_creation\">建立唔到呢個檔案</string>\n    <string name=\"delete_item_search_history\">你係咪想喺搜尋紀錄度剷走呢個項目？</string>\n    <string name=\"show_error\">睇下咩問題</string>\n    <string name=\"download_already_running\">有個整緊嘅下載撞名</string>\n    <string name=\"download_already_pending\">有個等緊嘅下載撞名</string>\n    <string name=\"max_retry_desc\">試盡幾多次就取消個下載算數</string>\n    <string name=\"show_thumbnail_summary\">喺鎖定畫面背景同埋通知都擺放縮圖</string>\n    <string name=\"download_has_started\">開始咗下載</string>\n    <string name=\"metadata_age_limit\">年齡限制</string>\n    <string name=\"no_app_to_open_intent\">你部機冇 app 開到佢</string>\n    <string name=\"youtube_music_premium_content\">呢部影片係 YouTube Music Premium 會員限定，因此 NewPipe 未能串流或下載。</string>\n    <string name=\"night_theme_summary\">揀選啱你心水嘅夜色主題 — %s</string>\n    <string name=\"paid_content\">呢部內容係付費使用者限定，因此 NewPipe 未能串流或下載。</string>\n    <string name=\"select_night_theme_toast\">你可以喺下面揀選啱你心水嘅夜色主題</string>\n    <string name=\"description_select_disable\">停止揀選描述入面嘅文字</string>\n    <string name=\"grid\">一格格</string>\n    <string name=\"list\">一行行</string>\n    <string name=\"add_to_playlist\">加入去播放清單</string>\n    <string name=\"create_playlist\">新嘅播放清單</string>\n    <string name=\"show_channel_details\">顯示頻道詳情</string>\n    <string name=\"error_http_not_found\">唔見咗影</string>\n    <string name=\"select_a_playlist\">揀選一個播放清單</string>\n    <string name=\"error_http_unsupported_range\">伺服器唔接受多執行緒下載，請改用 @string/msg_threads = 1 再試下啦</string>\n    <string name=\"error_connect_host\">連接唔到伺服器</string>\n    <string name=\"playlist_page_summary\">播放清單頁面</string>\n    <string name=\"hold_to_append\">撳住就輪候</string>\n    <string name=\"error_path_creation\">建立唔到呢個目的地資料夾</string>\n    <string name=\"error_ssl_exception\">建立唔到安全連線</string>\n    <string name=\"start_here_on_background\">喺幕後開始播放</string>\n    <string name=\"error_insufficient_storage_left\">部機冇晒位</string>\n    <string name=\"max_retry_msg\">頂櫳重試幾多次</string>\n    <string name=\"pause_downloads_on_mobile_desc\">若然有機會用到流動數據嘅時候，可能會用得著，雖則有啲下載冇得暫停</string>\n    <string name=\"enable_queue_limit\">輪住嚟下載</string>\n    <string name=\"metadata_privacy_internal\">內部</string>\n    <string name=\"metadata_privacy_private\">私人</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"pause_downloads_on_mobile\">按用量收費嘅網絡就閘住</string>\n    <string name=\"clear_download_history\">抹走下載紀錄</string>\n    <string name=\"confirm_prompt\">你想抹走你嘅下載紀錄，定係想剷走晒所有下載咗嘅檔案？</string>\n    <string name=\"delete_downloaded_files\">剷走下載咗嘅檔案</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"other\">剷走咗 %1$s 個下載</item>\n    </plurals>\n    <string name=\"downloads_storage_ask_title\">問我要下載去邊</string>\n    <string name=\"enqueue\">排隊排隊尾</string>\n    <string name=\"error_unknown_host\">搵唔到伺服器</string>\n    <string name=\"error_http_no_content\">伺服器冇傳返資料嚟</string>\n    <string name=\"error_postprocessing_failed\">後期處理失敗</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe 未搞掂個檔案就閂埋咗</string>\n    <string name=\"error_download_resource_gone\">呢個下載檔案恢復唔到</string>\n    <string name=\"overwrite_finished_warning\">同個下載咗嘅檔案撞名</string>\n    <string name=\"overwrite_unrelated_warning\">同個現有嘅檔案撞名</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"other\">揀選咗 %d 個</item>\n    </plurals>\n    <string name=\"feed_group_dialog_select_subscriptions\">揀選訂閱</string>\n    <string name=\"feed_group_dialog_empty_selection\">未有揀選訂閱</string>\n    <string name=\"show_thumbnail_title\">顯示縮圖</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">頻道嘅頭像縮圖</string>\n    <string name=\"channel_created_by\">由 %s 建立</string>\n    <string name=\"video_detail_by\">出自 %s</string>\n    <string name=\"chapters\">章節</string>\n    <string name=\"content_not_supported\">NewPipe 仲未支援到呢樣。\n\\n\n\\n希望未來會喺日後嘅版本支援啦。</string>\n    <string name=\"no_appropriate_file_manager_message\">搵唔到合適嘅檔案總管進行呢個動作。\n\\n請安裝一個檔案管理程式，又或者試下喺下載設定度停用「%s」</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">搵唔到合適嘅檔案總管進行呢個動作。\n\\n請安裝一個與儲存空間存取框架兼容嘅檔案管理程式</string>\n    <string name=\"georestricted_content\">呢部內容限區，喺你所在國家未有提供。</string>\n    <string name=\"soundcloud_go_plus_content\">呢首 (至少喺你所在國家而言) 係 SoundCloud Go+ 單曲，因此 NewPipe 未能串流或下載。</string>\n    <string name=\"private_content\">呢部內容係私人嘢，因此 NewPipe 未能串流或下載。</string>\n    <string name=\"auto_device_theme_title\">明或暗 (跟返部機嘅主題色系)</string>\n    <string name=\"featured\">精選</string>\n    <string name=\"radio\">廣播</string>\n    <string name=\"description_select_note\">你而家可以揀選喺描述入面嘅文字喇。不過要單聲先，喺揀選模式嘅時候，版面可能會有啲眨，同埋啲連結可能會撳唔到。</string>\n    <string name=\"description_select_enable\">啟用揀選描述入面嘅文字</string>\n    <string name=\"metadata_licence\">版權協議</string>\n    <string name=\"metadata_category\">分類</string>\n    <string name=\"metadata_tags\">標籤</string>\n    <string name=\"metadata_privacy\">公開設定</string>\n    <string name=\"metadata_privacy_public\">公開</string>\n    <string name=\"metadata_privacy_unlisted\">憑網址瀏覽</string>\n    <string name=\"detail_pinned_comment_view_description\">置頂留言</string>\n    <string name=\"detail_heart_img_view_description\">創作者畀咗心心</string>\n    <string name=\"open_website_license\">開啟網站</string>\n    <string name=\"off\">閂</string>\n    <string name=\"metadata_host\">主機</string>\n    <string name=\"show_hold_to_append_summary\">喺影片詳情撳一下「幕後播」或「浮面播」個掣嘅時候顯示提示</string>\n    <string name=\"title_activity_history\">紀錄</string>\n    <string name=\"action_history\">紀錄</string>\n    <string name=\"enqueue_next_stream\">攝咗做下個播</string>\n    <string name=\"enable_leak_canary_summary\">記憶體洩露監測喺傾卸堆疊嘢嘅時候，或者會導致個 app 冇反應</string>\n    <string name=\"drawer_close\">閂埋選單</string>\n    <string name=\"enqueued_next\">攝咗做下個播</string>\n    <string name=\"settings_category_player_behavior_title\">點做法</string>\n    <string name=\"hash_channel_description\">影片雜湊進度嘅通知</string>\n    <string name=\"empty_list_subtitle\">大笪地</string>\n    <string name=\"clear_search_history_title\">抹走搜尋紀錄</string>\n    <string name=\"clear_search_history_summary\">剷走晒搜尋關鍵字嘅紀錄</string>\n    <string name=\"delete_search_history_alert\">係咪要全部剷走晒搜尋嘅紀錄？</string>\n    <string name=\"channel_page_summary\">頻道頁面</string>\n    <string name=\"select_a_channel\">揀選一個頻道</string>\n    <string name=\"title_activity_play_queue\">排隊播</string>\n    <string name=\"play_queue_audio_settings\">聲音設定</string>\n    <string name=\"drawer_open\">開啟選單</string>\n    <string name=\"set_as_playlist_thumbnail\">揀做播放清單縮圖</string>\n    <string name=\"playlist_creation_success\">整咗個播放清單</string>\n    <string name=\"playlist_add_stream_success\">加咗入播放清單</string>\n    <string name=\"leak_canary_not_available\">LeakCanary 用唔到</string>\n    <string name=\"show_memory_leaks\">顯示記憶體洩露</string>\n    <string name=\"enable_disposed_exceptions_summary\">強制報告喺片段或週期棄置後送遞唔到嘅 Rx 狀況</string>\n    <string name=\"show_crash_the_player_title\">顯示「令播放器閃退」</string>\n    <string name=\"show_crash_the_player_summary\">用播放器嘅時候顯示一個閃退選項</string>\n    <string name=\"crash_the_app\">令個 app 閃退</string>\n    <string name=\"show_error_snackbar\">顯示一則錯誤橫條</string>\n    <string name=\"create_error_notification\">建立一則出現錯誤通知</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">好，包括埋睇過但未睇晒嘅影片</string>\n    <string name=\"new_seek_duration_toast\">礙於 ExoPlayer 所限，快轉長度經已改為 %d 秒</string>\n    <string name=\"hash_channel_name\">影片雜湊通知</string>\n    <string name=\"enqueued\">排咗去隊尾</string>\n    <string name=\"preferred_open_action_settings_title\">揀定「開啟」動作</string>\n    <string name=\"preferred_open_action_settings_summary\">預設開啟內容嘅時候做咩好 — %s</string>\n    <string name=\"unhook_checkbox\">脫鈎 (聲音可能會失真)</string>\n    <string name=\"playback_step\">飛前一格</string>\n    <string name=\"no_playlist_bookmarked_yet\">未有收起嘅播放清單</string>\n    <string name=\"play_all\">照單全播</string>\n    <string name=\"no_channel_subscribed_yet\">未有頻道訂閱</string>\n    <string name=\"playlist_thumbnail_change_success\">轉咗播放清單縮圖。</string>\n    <string name=\"enable_disposed_exceptions_title\">報告週期完結後嘅錯誤</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">每次下載都會問你要儲存去邊</string>\n    <string name=\"downloads_storage_ask_summary\">每次下載都會問你要儲存去邊。\n\\n如果你想儲存落外置 SD 卡入面，請啟用系統資料夾揀選器 (SAF)</string>\n    <string name=\"downloads_storage_use_saf_title\">用系統資料夾揀選器 (SAF)</string>\n    <string name=\"remove_watched_popup_warning\">加入去播放清單之前或之後睇過嘅影片都會剷走個囉喎。 \\n你肯定？剷走咗冇得掹個囉喎！</string>\n    <string name=\"downloads_storage_use_saf_summary\">「儲存空間存取框架」係畀你下載落外置 SD 卡嗰度</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">Android 10 打上，局住要用「儲存空間存取框架」</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer 預設值</string>\n    <string name=\"download_to_sdcard_error_title\">外置儲存空間用唔到</string>\n    <string name=\"enqueue_stream\">排隊尾等待播放</string>\n    <string name=\"search_history_deleted\">剷走晒搜尋紀錄</string>\n    <string name=\"download_to_sdcard_error_message\">冇得下載落外置 SD 卡嗰度。要唔要重設下載資料夾嘅位置？</string>\n    <string name=\"start_here_on_popup\">喺浮面開始播放</string>\n    <string name=\"bookmark_playlist\">收起播放清單</string>\n    <string name=\"unbookmark_playlist\">唔再收埋</string>\n    <string name=\"delete_playlist_prompt\">係咪要剷走呢個播放清單？</string>\n    <string name=\"settings_category_player_notification_title\">播放器通知</string>\n    <string name=\"settings_category_player_notification_summary\">調整目前播放緊咩串流嘅通知</string>\n    <string name=\"streams_notification_channel_description\">訂閱有新加串流嘅通知</string>\n    <string name=\"loading_stream_details\">載入緊串流詳細資料…</string>\n    <string name=\"enable_streams_notifications_summary\">通知訂閱有新嘅串流</string>\n    <string name=\"streams_notifications_interval_title\">檢查頻率</string>\n    <string name=\"streams_notifications_network_title\">用咩網絡連線</string>\n    <string name=\"any_network\">咩網絡都無所謂</string>\n    <string name=\"get_notified\">收取通知</string>\n    <string name=\"you_successfully_subscribed\">你而家訂閱咗呢個頻道</string>\n    <string name=\"toggle_all\">全部切換</string>\n    <string name=\"check_new_streams\">執行檢查有冇新加串流</string>\n    <string name=\"notifications\">通知</string>\n    <string name=\"streams_notification_channel_name\">新加嘅串流</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"other\">%s 個新加串流</item>\n    </plurals>\n    <string name=\"enable_streams_notifications_title\">新嘅串流通知</string>\n    <string name=\"delete_downloaded_files_confirm\">係咪要喺磁碟機上面消除晒全部下載咗嘅檔案？</string>\n    <string name=\"notifications_disabled\">已停用通知</string>\n    <string name=\"tracks\">單曲</string>\n    <string name=\"clear_playback_states_summary\">全部剷走晒播放到邊個位</string>\n    <string name=\"error_report_open_github_notice\">請睇過係咪已經有人喺度講緊你呢次彈 app 嘅狀況。若然重複發表已有嘅議題，就會嘥咗我哋可以真正用嚟修復其他錯漏嘅時間㗎喇。</string>\n    <string name=\"donation_encouragement\">NewPipe 係由一班熱心人用空閒時間義務咁開發㗎，為咗帶畀你最佳嘅使用體驗。係時候慷慨解囊，撐返開發者嘅付出，使 NewPipe 更臻完美，同時畀杯咖啡佢哋嘆下。</string>\n    <string name=\"local\">站內</string>\n    <string name=\"conferences\">聚首</string>\n    <string name=\"minimize_on_exit_title\">轉 app 嘅時候借過</string>\n    <string name=\"minimize_on_exit_summary\">當喺主影片播放器轉去第個 app 嘅時候點做好 — %s</string>\n    <string name=\"minimize_on_exit_background_description\">借過幕後播</string>\n    <string name=\"minimize_on_exit_popup_description\">借過浮面播</string>\n    <string name=\"autoplay_summary\">自動開始播放 — %s</string>\n    <string name=\"minimize_on_exit_none_description\">上返行人路</string>\n    <string name=\"seekbar_preview_thumbnail_title\">時間軸預覽縮圖</string>\n    <string name=\"feed_notification_loading\">載入緊摘要…</string>\n    <string name=\"feed_processing_message\">處理緊摘要…</string>\n    <string name=\"settings_category_feed_title\">摘要</string>\n    <string name=\"feed_oldest_subscription_update\">摘要上次更新到：%s</string>\n    <string name=\"feed_subscription_not_loaded_count\">未有載入：%d</string>\n    <string name=\"feed_update_threshold_title\">摘要隔幾耐要更新</string>\n    <string name=\"feed_update_threshold_summary\">訂閱對上一次更新後，隔幾耐視之為過時 — %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">幾時都照更新</string>\n    <string name=\"feed_load_error\">載入摘要嘅時候發生問題</string>\n    <string name=\"feed_load_error_account_info\">載入唔到「%s」嘅摘要。</string>\n    <string name=\"feed_load_error_fast_unknown\">快速摘要模式就此冇補充。</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">有得攞就攞特設摘要</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">啟用快速模式</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">停用快速模式</string>\n    <string name=\"give_back\">少少無拘</string>\n    <string name=\"watch_history_states_deleted\">全部剷走咗播放到邊個位</string>\n    <string name=\"select_quality_external_players\">揀選外面嘅播放器用咩畫質</string>\n    <string name=\"selected_stream_external_player_not_supported\">外面嘅播放器唔支援揀選嘅串流</string>\n    <string name=\"no_audio_streams_available_for_external_players\">外面嘅播放器用得到嘅聲音串流欠奉</string>\n    <string name=\"no_video_streams_available_for_external_players\">外面嘅播放器用得到嘅影片串流欠奉</string>\n    <string name=\"unknown_format\">未知格式</string>\n    <string name=\"unknown_quality\">未知畫質</string>\n    <string name=\"streams_not_yet_supported_removed\">下載工具暫未支援嘅串流，就無謂擺出嚟喇</string>\n    <string name=\"feed_load_error_terminated\">著作者嘅帳戶已經被終止。\n\\nNewPipe 日後唔會載入到呢個摘要。\n\\n你要唔要取消訂閱呢個頻道？</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">某啲服務有提供，通常會快趣好多，但項目數量可能有限同埋資訊欠奉 (例如片長、項目類型、直播狀態)</string>\n    <string name=\"clear_playback_states_title\">剷走播放到邊個位</string>\n    <string name=\"delete_playback_states_alert\">係咪要全部剷走晒之前啲片嘅播放位置嘅紀錄？</string>\n    <string name=\"percent\">百分比</string>\n    <string name=\"semitone\">半音</string>\n    <string name=\"progressive_load_interval_summary\">更改載入播放間隔大細 (目前係 %s)。細啲或者可以等條片快啲開波</string>\n    <string name=\"clear_queue_confirmation_title\">問咗先至將排隊列表清走</string>\n    <string name=\"clear_queue_confirmation_description\">目前播放器嘅排隊列表將會清走</string>\n    <string name=\"peertube_instance_add_title\">加一個站</string>\n    <string name=\"peertube_instance_add_help\">請輸入個站嘅 URL</string>\n    <string name=\"peertube_instance_add_fail\">驗證唔到個站</string>\n    <string name=\"peertube_instance_add_exists\">個站已經喺度喇</string>\n    <string name=\"import_data_summary\">冚過你目前嘅紀錄、訂閱、播放清單，同埋 (有得揀係咪冚埋) 設定</string>\n    <string name=\"export_data_summary\">匯出紀錄、訂閱、播放清單，同埋設定</string>\n    <string name=\"feed_new_items\">新嘅摘要項目</string>\n    <string name=\"choose_instance_prompt\">揀選一個站</string>\n    <string name=\"clear_queue_confirmation_summary\">轉換播放器嘅時候，排隊列表可能會清走</string>\n    <string name=\"app_license\">NewPipe 係「著佐權」(copyleft) 嘅自由軟件：你可以隨意使用、考究、分享同改進佢。具體而言，你可以依據自由軟件基金會發佈嘅《GNU 通用公眾特許條款》第 3 版或 (按你選擇) 之後任一版本之下嘅條款，重新分發及/或修改呢個軟件。</string>\n    <string name=\"progressive_load_interval_title\">載入播放間隔大細</string>\n    <string name=\"kiosk_page_summary\">互動頁面</string>\n    <string name=\"default_kiosk_page_summary\">預設嘅互動站（Kiosk）</string>\n    <string name=\"import_soundcloud_instructions\">輸入 URL 或者你嘅 ID 去匯入 SoundCloud 個人檔案：\n\\n\n\\n一、喺網頁瀏覽器啟用「桌面版模式」(個網唔支援手機版)\n\\n二、去呢個網址：%1$s\n\\n三、叫你登入就去馬\n\\n四、複製佢彈返畀你去個人檔案嗰版個 URL。</string>\n    <string name=\"import_soundcloud_instructions_hint\">你個 ID、soundcloud.com/你個id</string>\n    <string name=\"select_a_kiosk\">揀選互動站</string>\n    <string name=\"show_original_time_ago_title\">顯示返項目原本話時隔幾耐</string>\n    <string name=\"disable_media_tunneling_title\">停用多媒體隧道</string>\n    <string name=\"feed_groups_header_title\">頻道成谷</string>\n    <string name=\"feed_group_dialog_empty_name\">成谷名留空</string>\n    <string name=\"feed_create_new_group_button_title\">新</string>\n    <string name=\"feed_group_dialog_delete_message\">你係咪要刪除呢個谷？</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">淨係顯示未成谷嘅訂閱</string>\n    <string name=\"show_original_time_ago_summary\">服務原本嘅字會騷返喺串流項目上面</string>\n    <string name=\"disable_media_tunneling_summary\">若果播片嘅時候窒下窒下或者黑畫面，就停用多媒體隧道啦。</string>\n    <string name=\"import_youtube_instructions\">點樣用 Google 匯出嚟匯入 YouTube 訂閱：\n\\n\n\\n一、去呢個網址：%1$s\n\\n二、叫你就登入\n\\n三、撳一下「包含所有資料」，再撳一下「全部不選」，之後淨係剔返「訂閱」，然後撳「確定」\n\\n四、撳一下「下一步」然後揀「建立匯出」\n\\n五、個掣騷出嚟嘅時候就撳一下「下載」\n\\n六、返返嚟呢度，喺下低撳「匯入檔案」，揀返下載咗嗰個 .zip 檔案\n\\n七、[個 .zip 匯入唔到點算好] 將個 .csv 檔案解壓縮抽返出嚟 (通常係擺喺「YouTube and YouTube Music/subscriptions/subscriptions.csv」)，喺下低撳「匯入檔案」，揀返抽出嚟個 csv 檔案</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">係咪覺得摘要「懸浮於半路太久，可否再快兩步」？可以試下啟用快速載入 (你可以喺設定度更改，又或者撳一下下低個掣)。\n\\n\n\\nNewPipe 提供兩種載入摘要嘅方針：\n\\n• 攞晒成個訂閱頻道，慢得嚟志在夠完整。\n\\n• 用特設嘅服務終端，快得嚟啲料爭少少。\n\\n\n\\n兩者嘅分別在於，快趣嗰個通常都係爭咁啲料：譬如話項目嘅片長同類型 (分唔到係直播定上載)，同埋攞返嚟數目可能會少啲。\n\\n\n\\nYouTube 就係其中一個有用 RSS 摘要提供呢個快趣門路嘅服務。\n\\n\n\\n所以就睇你點揀：想快定要準。</string>\n    <string name=\"faq\">去網站睇下</string>\n    <string name=\"sort\">排序</string>\n    <string name=\"faq_title\">常見問題</string>\n    <string name=\"faq_description\">若然你係用緊呢個 app嗰陣有疑問，然而「亦有些難啟齒」，不妨睇下常見問題集，話唔定會發現「有場舞還未發表」！</string>\n    <string name=\"fast_mode\">快速模式</string>\n    <string name=\"import_subscriptions_hint\">右上角嘅選單有得匯入或匯出訂閱</string>\n    <string name=\"app_update_unavailable_toast\">你已經用緊最新版本嘅 NewPipe</string>\n    <string name=\"app_update_available_notification_text\">撳一下去下載 %s</string>\n    <string name=\"unset_playlist_thumbnail\">唔再揀定封面縮圖</string>\n    <string name=\"night_theme_available\">主題色系揀做%s 嘅時候至有得揀</string>\n    <string name=\"msg_failed_to_copy\">複製唔到去剪貼簿</string>\n    <string name=\"card\">一張張</string>\n    <string name=\"duplicate_in_playlist\">灰咗嘅播放清單，即係已經有呢個項目。</string>\n    <string name=\"playlist_add_stream_success_duplicate\">重複加入咗 %d 次</string>\n    <string name=\"ignore_hardware_media_buttons_title\">忽略硬件多媒體掣嘅事件</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">譬如話你用耳機嗰陣，撳上面啲實體掣就會有用</string>\n    <string name=\"remove_duplicates\">重複嗰啲剷咗佢</string>\n    <string name=\"remove_duplicates_title\">重複咗嗰啲係咪要剷走？</string>\n    <string name=\"feed_hide_streams_title\">下列嘅串流見得光</string>\n    <string name=\"feed_show_hide_streams\">顯示/隱藏串流</string>\n    <string name=\"feed_show_watched\">睇晒</string>\n    <string name=\"feed_show_partially_watched\">未睇晒</string>\n    <string name=\"feed_show_upcoming\">未夠鐘上畫</string>\n    <string name=\"remove_duplicates_message\">你係咪要剷走呢個播放清單入面所有重複咗嘅串流？</string>\n    <string name=\"left_gesture_control_summary\">揀選左手邊播放器螢幕嘅手勢</string>\n    <string name=\"left_gesture_control_title\">左手邊手勢動作</string>\n    <string name=\"right_gesture_control_summary\">揀選右手邊播放器螢幕嘅手勢</string>\n    <string name=\"right_gesture_control_title\">右手邊手勢動作</string>\n    <string name=\"brightness\">調整光暗度</string>\n    <string name=\"volume\">音量</string>\n    <string name=\"none\">乜都唔使做</string>\n    <string name=\"prefer_original_audio_title\">優先揀原聲</string>\n    <string name=\"prefer_descriptive_audio_title\">優先揀旁述</string>\n    <string name=\"prefer_descriptive_audio_summary\">揀選為視障人士而設嘅旁述音軌 (如有提供)</string>\n    <string name=\"prefer_original_audio_summary\">揀選原始音軌，唔理佢講咩話</string>\n    <string name=\"play_queue_audio_track\">聲音： %s</string>\n    <string name=\"audio_track\">音軌</string>\n    <string name=\"unknown_audio_track\">未知</string>\n    <string name=\"audio_track_present_in_video\">呢個串流已經有音軌喇</string>\n    <string name=\"settings_category_exoplayer_title\">Exoplayer 設定</string>\n    <string name=\"settings_category_exoplayer_summary\">管理一啲 ExoPlayer 設定。呢啲變更需要重新啟動播放程式先會生效</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">用 ExoPlayer 嘅解碼器汰退功能</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">如果遇到解碼器初始化問題，請啟用呢個選項，如果主解碼器初始化失敗，就會用優先順序較低的解碼器。咁樣可能會導致播放性能比使用主解碼器嗰陣差</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">幾時都用 Exoplayer嘅浮面影片輸出設定解決方法</string>\n    <string name=\"audio_track_type_original\">原聲</string>\n    <string name=\"audio_track_type_dubbed\">配音</string>\n    <string name=\"audio_track_type_descriptive\">旁述</string>\n    <string name=\"select_audio_track_external_players\">為外面嘅播放器揀選音軌</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">呢個解決方法係喺發生表面變動嗰陣釋放同埋重新確認視訊編解碼器，而非直接將表面設定做編解碼器。ExoPlayer 已經喺部份有問題嘅裝置上使用了呢個設定，呢個設定僅係對 Android 6 或以上嘅更新版本有效。\n\\n\n\\n啟用呢個選項可以避免喺切換現有視訊播放程式或切換到全螢幕時出現播放錯誤</string>\n    <string name=\"image_quality_title\">啲圖嘅畫質</string>\n    <string name=\"channel_tab_videos\">影片</string>\n    <string name=\"question_mark\">？</string>\n    <string name=\"metadata_subscribers\">訂閱者</string>\n    <string name=\"show_channel_tabs_summary\">頻道頁要騷邊啲分頁出嚟</string>\n    <string name=\"share_playlist_with_list\">齋分享 URL 清單</string>\n    <string name=\"share_playlist_with_titles\">分享埋片名</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"show_channel_tabs\">頻道分頁</string>\n    <string name=\"channel_tab_shorts\">短片</string>\n    <string name=\"loading_metadata_title\">載入緊元資料…</string>\n    <string name=\"toggle_screen_orientation\">橫豎轉換</string>\n    <string name=\"image_quality_low\">低畫質</string>\n    <string name=\"main_tabs_position_title\">主畫面分頁擺位</string>\n    <string name=\"toggle_fullscreen\">切換全螢幕</string>\n    <string name=\"feed_fetch_channel_tabs\">攞邊啲頻道分頁</string>\n    <string name=\"metadata_avatars\">頭像</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"next_stream\">下一個串流</string>\n    <string name=\"disable_media_tunneling_automatic_info\">已知您部機個型號唔支援多媒體隧道，因此預設已經停用咗先。</string>\n    <string name=\"metadata_subchannel_avatars\">子頻道嘅頭像</string>\n    <string name=\"open_play_queue\">跳去排隊播</string>\n    <string name=\"image_quality_none\">唔要載入啲圖</string>\n    <string name=\"image_quality_high\">高畫質</string>\n    <string name=\"channel_tab_about\">簡介</string>\n    <string name=\"share_playlist\">分享播放清單</string>\n    <string name=\"forward\">跳前</string>\n    <string name=\"channel_tab_albums\">專輯</string>\n    <string name=\"rewind\">跳後</string>\n    <string name=\"replay\">重播</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">更新摘要嘅時候要攞邊啲分頁返嚟。若果頻道用快速模式更新，就橫豎都無相干嘞。</string>\n    <string name=\"image_quality_medium\">一般畫質</string>\n    <string name=\"metadata_uploader_avatars\">上載者嘅頭像</string>\n    <string name=\"metadata_banners\">橫額</string>\n    <string name=\"channel_tab_playlists\">播放清單</string>\n    <string name=\"video_details_list_item\">- %1$s：%2$s</string>\n    <string name=\"main_tabs_position_summary\">主畫面嘅分頁揀選搬落最底</string>\n    <string name=\"no_live_streams\">無直播串流</string>\n    <string name=\"image_quality_summary\">揀選啲圖嘅畫質，定索性唔載入啲圖，去慳啲用數據同記憶體。更改會抹走記憶體同磁碟入面嘅影像快取 — %s</string>\n    <string name=\"play\">播放</string>\n    <string name=\"more_options\">其他選項</string>\n    <string name=\"metadata_thumbnails\">縮圖</string>\n    <string name=\"channel_tab_tracks\">曲目</string>\n    <string name=\"duration\">片長</string>\n    <string name=\"no_streams\">無串流</string>\n    <string name=\"channel_tab_channels\">頻道</string>\n    <string name=\"previous_stream\">上一個串流</string>\n    <string name=\"channel_tab_livestreams\">直播</string>\n    <plurals name=\"replies\">\n        <item quantity=\"other\">%s 個回覆</item>\n    </plurals>\n    <string name=\"show_less\">摺埋</string>\n    <string name=\"show_more\">拉開</string>\n    <string name=\"notification_actions_summary_android13\">撳下面嘅掣去更改對應嘅通知動作。頭三個動作 (播放/暫停、上一個、下一個) 系統預設咗，冇得揀。</string>\n    <string name=\"error_insufficient_storage\">部機冇晒位</string>\n    <string name=\"yes\">要</string>\n    <string name=\"auto_update_check_description\">NewPipe 可以周不時自動睇過有冇新版本，一出咗就通知您。\n\\n您想唔想啟用呢個功能？</string>\n    <string name=\"reset_settings_title\">推翻所有設定</string>\n    <string name=\"reset_all_settings\">推翻所有設定就會全盤抹走晒您喜好過嘅設定，然後重新開過個 app 個囉噃。\n\\n\n\\n您確定要不惜一切推倒重來？</string>\n    <string name=\"settings_category_backup_restore_title\">備份與還原</string>\n    <string name=\"no\">唔使喇</string>\n    <string name=\"reset_settings_summary\">顛覆所有設定，光復成預設值重新開始</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-zh-rTW/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"upload_date_text\">發佈於 %1$s</string>\n    <string name=\"no_player_found\">找不到串流播放器。是否安裝 VLC？</string>\n    <string name=\"install\">安裝</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"open_in_browser\">以瀏覽器開啟</string>\n    <string name=\"share\">分享</string>\n    <string name=\"download\">下載</string>\n    <string name=\"search\">搜尋</string>\n    <string name=\"settings\">設定</string>\n    <string name=\"did_you_mean\">您是不是要找「%1$s」？</string>\n    <string name=\"share_dialog_title\">以……分享</string>\n    <string name=\"use_external_video_player_title\">使用外部影片播放器</string>\n    <string name=\"use_external_audio_player_title\">使用外部音訊播放器</string>\n    <string name=\"download_path_title\">影片下載資料夾</string>\n    <string name=\"download_path_summary\">下載完的影片檔案會儲存在這裡</string>\n    <string name=\"download_path_dialog_title\">選擇視訊檔案的下載資料夾</string>\n    <string name=\"default_resolution_title\">預設解析度</string>\n    <string name=\"play_with_kodi_title\">使用 Kodi 播放</string>\n    <string name=\"show_play_with_kodi_summary\">顯示使用 Kodi 媒體中心播放影片的選項</string>\n    <string name=\"play_audio\">聲音</string>\n    <string name=\"kore_not_found\">要安裝缺少的 Kore 應用程式嗎？</string>\n    <string name=\"show_play_with_kodi_title\">顯示「使用 Kodi 播放」的選項</string>\n    <string name=\"default_audio_format_title\">預設音訊格式</string>\n    <string name=\"theme_title\">主題</string>\n    <string name=\"dark_theme_title\">深色</string>\n    <string name=\"light_theme_title\">淺色</string>\n    <string name=\"download_dialog_title\">下載</string>\n    <string name=\"show_next_and_similar_title\">顯示「下一部」與「相關」的影片</string>\n    <string name=\"unsupported_url\">不支援此網址</string>\n    <string name=\"content_language_title\">預設內容語言</string>\n    <string name=\"settings_category_video_audio_title\">影片與音訊</string>\n    <string name=\"settings_category_appearance_title\">外觀</string>\n    <string name=\"background_player_playing_toast\">正在背景播放</string>\n    <string name=\"network_error\">網路錯誤</string>\n    <string name=\"detail_thumbnail_view_description\">播放影片，持續時間：</string>\n    <string name=\"detail_uploader_thumbnail_view_description\">發布者的頭像縮圖</string>\n    <string name=\"detail_likes_img_view_description\">喜歡</string>\n    <string name=\"detail_dislikes_img_view_description\">不喜歡</string>\n    <string name=\"download_path_audio_title\">音訊下載資料夾</string>\n    <string name=\"download_path_audio_summary\">下載好的音訊檔案會儲存在這裡</string>\n    <string name=\"download_path_audio_dialog_title\">選擇音訊檔案的下載資料夾</string>\n    <string name=\"main_bg_subtitle\">輕觸放大鏡即可開始。</string>\n    <string name=\"open_in_popup_mode\">以懸浮視窗開啟</string>\n    <string name=\"use_external_video_player_summary\">移除某些解析度的音訊</string>\n    <string name=\"controls_background_title\">背景播放</string>\n    <string name=\"default_popup_resolution_title\">懸浮視窗預設解析度</string>\n    <string name=\"show_higher_resolutions_title\">顯示更高的解析度</string>\n    <string name=\"show_higher_resolutions_summary\">僅部份裝置可播放 2K/4K 影片</string>\n    <string name=\"default_video_format_title\">預設影片格式</string>\n    <string name=\"black_theme_title\">黑色</string>\n    <string name=\"popup_remember_size_pos_title\">記住懸浮視窗屬性</string>\n    <string name=\"popup_remember_size_pos_summary\">記住上次使用時懸浮視窗的大小和位置</string>\n    <string name=\"show_search_suggestions_title\">搜尋建議</string>\n    <string name=\"show_search_suggestions_summary\">選擇在搜尋時顯示建議</string>\n    <string name=\"popup_playing_toast\">正在以懸浮視窗播放</string>\n    <string name=\"content\">內容</string>\n    <string name=\"show_age_restricted_content_title\">顯示年齡限制內容</string>\n    <string name=\"downloads\">下載</string>\n    <string name=\"downloads_title\">下載</string>\n    <string name=\"error_report_title\">回報錯誤</string>\n    <string name=\"all\">全部</string>\n    <string name=\"disabled\">已停用</string>\n    <string name=\"clear\">清除</string>\n    <string name=\"best_resolution\">最佳解析度</string>\n    <string name=\"general_error\">錯誤</string>\n    <string name=\"could_not_load_thumbnails\">無法載入所有縮圖</string>\n    <string name=\"parsing_error\">無法解析網站</string>\n    <string name=\"content_not_available\">內容無法使用</string>\n    <string name=\"could_not_setup_download_menu\">無法設定下載選單</string>\n    <string name=\"app_ui_crash\">應用程式或介面已崩潰</string>\n    <string name=\"sorry_string\">抱歉，這是不該發生的。</string>\n    <string name=\"error_report_button_text\">透過電子郵件回報</string>\n    <string name=\"error_snackbar_message\">抱歉，發生問題。</string>\n    <string name=\"error_snackbar_action\">回報</string>\n    <string name=\"what_device_headline\">資訊：</string>\n    <string name=\"what_happened_headline\">發生了什麼事：</string>\n    <string name=\"info_labels\">發生了什麼：\\n請求：\\n內容語言：\\n內容國家：\\n應用程式語言：\\n服務：\\nGMT 時間：\\n套件：\\n版本：\\n系統版本：</string>\n    <string name=\"your_comment\">您的留言 (請用英語)：</string>\n    <string name=\"error_details_headline\">詳細資訊：</string>\n    <string name=\"video\">影片</string>\n    <string name=\"audio\">音訊</string>\n    <string name=\"retry\">重試</string>\n    <string name=\"start\">開始</string>\n    <string name=\"pause\">暫停</string>\n    <string name=\"delete\">刪除</string>\n    <string name=\"checksum\">檢查碼</string>\n    <string name=\"ok\">確定</string>\n    <string name=\"msg_name\">檔案名稱</string>\n    <string name=\"msg_threads\">執行緒數目</string>\n    <string name=\"msg_error\">錯誤</string>\n    <string name=\"msg_running\">NewPipe 下載中</string>\n    <string name=\"msg_running_detail\">輕觸以顯示詳細資訊</string>\n    <string name=\"msg_wait\">請稍候…</string>\n    <string name=\"msg_copied\">已複製到剪貼簿</string>\n    <string name=\"no_available_dir\">稍後請在設定中選擇下載資料夾</string>\n    <string name=\"msg_popup_permission\">使用懸浮視窗模式\n\\n需要此權限</string>\n    <string name=\"title_activity_recaptcha\">reCAPTCHA 驗證</string>\n    <string name=\"recaptcha_request_toast\">已請求 reCAPTCHA 驗證</string>\n    <string name=\"controls_popup_title\">懸浮視窗</string>\n    <string name=\"duration_live\">直播</string>\n    <string name=\"subscribe_button_title\">訂閱</string>\n    <string name=\"subscribed_button_title\">已訂閱</string>\n    <string name=\"channel_unsubscribed\">已取消訂閱頻道</string>\n    <string name=\"subscription_change_failed\">無法更改訂閱</string>\n    <string name=\"subscription_update_failed\">無法更新訂閱</string>\n    <string name=\"tab_subscriptions\">訂閱清單</string>\n    <string name=\"fragment_feed_title\">新鮮事</string>\n    <string name=\"enable_search_history_title\">搜尋記錄</string>\n    <string name=\"enable_search_history_summary\">在本機儲存搜尋記錄</string>\n    <string name=\"enable_watch_history_title\">觀看記錄</string>\n    <string name=\"enable_watch_history_summary\">記錄已觀看的影片</string>\n    <string name=\"resume_on_audio_focus_gain_title\">恢復播放</string>\n    <string name=\"resume_on_audio_focus_gain_summary\">在干擾結束後繼續播放 (例如有來電)</string>\n    <string name=\"settings_category_player_title\">播放器</string>\n    <string name=\"settings_category_player_behavior_title\">行為</string>\n    <string name=\"settings_category_history_title\">歷史記錄與快取</string>\n    <string name=\"undo\">復原</string>\n    <string name=\"notification_channel_name\">NewPipe 通知</string>\n    <string name=\"notification_channel_description\">NewPipe 播放器的通知</string>\n    <string name=\"search_no_results\">沒有結果</string>\n    <string name=\"empty_list_subtitle\">這裡空空如也</string>\n    <string name=\"no_subscribers\">無訂閱者</string>\n    <plurals name=\"subscribers\">\n        <item quantity=\"other\">%s 位訂閱者</item>\n    </plurals>\n    <string name=\"no_views\">無觀看次數</string>\n    <plurals name=\"views\">\n        <item quantity=\"other\">%s 次觀看</item>\n    </plurals>\n    <string name=\"no_videos\">沒有影片</string>\n    <string name=\"settings_category_downloads_title\">下載</string>\n    <string name=\"settings_file_charset_title\">檔案名稱中允許的字元</string>\n    <string name=\"settings_file_replacement_character_summary\">無效字元將會被替換為此值</string>\n    <string name=\"settings_file_replacement_character_title\">替換字元</string>\n    <string name=\"charset_letters_and_digits\">字母與數字</string>\n    <string name=\"charset_most_special_characters\">大部分的特殊字元</string>\n    <string name=\"title_activity_about\">關於 NewPipe</string>\n    <string name=\"title_licenses\">第三方授權</string>\n    <string name=\"copyright\" formatted=\"true\">© %1$s 由 %2$s 使用 %3$s 授權條款發布</string>\n    <string name=\"tab_about\">關於與常見問題</string>\n    <string name=\"tab_licenses\">授權條款</string>\n    <string name=\"app_description\">Android 上自由且輕巧的串流播放器。</string>\n    <string name=\"view_on_github\">在 GitHub 上檢視</string>\n    <string name=\"app_license_title\">NewPipe 使用的授權條款</string>\n    <string name=\"contribution_encouragement\">不管您有什麼點子 ── 翻譯、設計、清理或撰寫大量程式碼 ── 我們永遠歡迎您來幫忙。做得越多，NewPipe 就會更好！</string>\n    <string name=\"read_full_license\">閱讀授權條款</string>\n    <string name=\"contribution_title\">貢獻</string>\n    <string name=\"title_activity_history\">歷史記錄</string>\n    <string name=\"action_history\">歷史記錄</string>\n    <string name=\"delete_item_search_history\">確定要刪除此項搜尋記錄嗎？</string>\n    <string name=\"no_player_found_toast\">找不到串流播放器 (您可以安裝 VLC 來播放)。</string>\n    <string name=\"show_hold_to_append_title\">顯示「長按以新增」提示</string>\n    <string name=\"default_content_country_title\">預設內容國家</string>\n    <string name=\"play_all\">全部播放</string>\n    <string name=\"always\">總是</string>\n    <string name=\"just_once\">僅一次</string>\n    <string name=\"unknown_content\">[未知]</string>\n    <string name=\"switch_to_background\">切換到背景</string>\n    <string name=\"switch_to_popup\">切換到懸浮視窗</string>\n    <string name=\"switch_to_main\">切換到主介面</string>\n    <string name=\"player_stream_failure\">無法播放此串流</string>\n    <string name=\"player_unrecoverable_failure\">發生無法復原的播放器錯誤</string>\n    <string name=\"player_recoverable_failure\">正在從播放器錯誤中復原</string>\n    <string name=\"show_hold_to_append_summary\">按下影片「詳細資訊：」中的背景或懸浮式視窗按鈕時顯示提示</string>\n    <string name=\"external_player_unsupported_link_type\">外部播放器不支援此類型連結</string>\n    <string name=\"video_streams_empty\">找不到影片串流</string>\n    <string name=\"audio_streams_empty\">找不到音訊串流</string>\n    <string name=\"donation_title\">贊助</string>\n    <string name=\"website_title\">網站</string>\n    <string name=\"import_data_title\">匯入資料庫</string>\n    <string name=\"export_data_title\">匯出資料庫</string>\n    <string name=\"import_data_summary\">覆寫您目前的歷史記錄、訂閱與設定 (選用)</string>\n    <string name=\"export_data_summary\">匯出歷史記錄、訂閱內容、播放清單、設定</string>\n    <string name=\"give_back\">回饋</string>\n    <string name=\"website_encouragement\">如欲了解更多有關 NewPipe 的資訊和新聞，請造訪我們的網站。</string>\n    <string name=\"main_page_content\">首頁內容</string>\n    <string name=\"blank_page_summary\">空白頁面</string>\n    <string name=\"kiosk_page_summary\">互動導覽頁面</string>\n    <string name=\"channel_page_summary\">頻道頁面</string>\n    <string name=\"select_a_channel\">選擇頻道</string>\n    <string name=\"no_channel_subscribed_yet\">尚未訂閱任何頻道</string>\n    <string name=\"select_a_kiosk\">選擇互動導覽</string>\n    <string name=\"export_complete_toast\">已匯出</string>\n    <string name=\"import_complete_toast\">已匯入</string>\n    <string name=\"no_valid_zip_file\">無效的 ZIP 檔案</string>\n    <string name=\"could_not_import_all_files\">警告：無法匯入所有檔案。</string>\n    <string name=\"override_current_data\">這將覆蓋您目前的設定。</string>\n    <string name=\"trending\">熱門</string>\n    <string name=\"top_50\">前 50</string>\n    <string name=\"new_and_hot\">最新與熱門</string>\n    <string name=\"play_queue_remove\">移除</string>\n    <string name=\"play_queue_stream_detail\">詳細資訊</string>\n    <string name=\"play_queue_audio_settings\">音訊設定</string>\n    <string name=\"start_here_on_background\">在背景開始播放</string>\n    <string name=\"start_here_on_popup\">在彈出式視窗中開始播放</string>\n    <string name=\"hold_to_append\">長按以新增至佇列</string>\n    <string name=\"donation_encouragement\">NewPipe 由志願者所開發，他們花費他們的空閒時間務求為您帶來最佳的使用體驗。現在是時候回過頭來，讓我們的開發人員能夠在使 NewPipe 更臻完美的同時，享受一杯咖啡。</string>\n    <string name=\"drawer_open\">打開抽屜</string>\n    <string name=\"drawer_close\">關閉抽屜</string>\n    <string name=\"video_player\">影片播放器</string>\n    <string name=\"background_player\">背景播放器</string>\n    <string name=\"popup_player\">懸浮視窗播放器</string>\n    <string name=\"preferred_player_fetcher_notification_title\">正在取得資訊…</string>\n    <string name=\"preferred_player_fetcher_notification_message\">正在載入要求的內容</string>\n    <string name=\"controls_download_desc\">下載串流檔案</string>\n    <string name=\"show_info\">顯示資訊</string>\n    <string name=\"tab_bookmarks\">書籤播放清單</string>\n    <string name=\"controls_add_to_playlist_title\">新增至</string>\n    <string name=\"detail_drag_description\">拖曳以重新排序</string>\n    <string name=\"create\">建立</string>\n    <string name=\"dismiss\">退出</string>\n    <string name=\"rename\">重新命名</string>\n    <string name=\"title_last_played\">上一次播放</string>\n    <string name=\"title_most_played\">最常播放</string>\n    <string name=\"always_ask_open_action\">總是詢問</string>\n    <string name=\"create_playlist\">新的播放清單</string>\n    <string name=\"rename_playlist\">重新命名</string>\n    <string name=\"name\">名稱</string>\n    <string name=\"add_to_playlist\">新增至播放清單</string>\n    <string name=\"set_as_playlist_thumbnail\">設為播放清單縮圖</string>\n    <string name=\"bookmark_playlist\">將播放清單加入書籤</string>\n    <string name=\"unbookmark_playlist\">移除書籤</string>\n    <string name=\"delete_playlist_prompt\">刪除此播放清單？</string>\n    <string name=\"playlist_creation_success\">已建立播放清單</string>\n    <string name=\"playlist_add_stream_success\">已增至播放清單</string>\n    <string name=\"playlist_thumbnail_change_success\">播放清單縮圖已更改。</string>\n    <string name=\"caption_none\">沒有字幕</string>\n    <string name=\"resize_fit\">合適的</string>\n    <string name=\"resize_fill\">填滿</string>\n    <string name=\"resize_zoom\">縮放</string>\n    <string name=\"settings_category_debug_title\">除錯</string>\n    <string name=\"caption_auto_generated\">自動產生</string>\n    <string name=\"enable_leak_canary_summary\">記憶體洩漏監測，在 heap dumping 時可能導致應用程式無法回應</string>\n    <string name=\"enable_disposed_exceptions_title\">報告週期不足錯誤</string>\n    <string name=\"enable_disposed_exceptions_summary\">強制報告在處理完片段或活動週期外發生的無法傳遞的 Rx 異常</string>\n    <string name=\"use_inexact_seek_title\">使用粗略但快速的尋找</string>\n    <string name=\"use_inexact_seek_summary\">粗略的尋找能讓播放器以降低的精確度更快找到影片的進度位置。尋找 5、15 或 25 秒無法與其一同使用</string>\n    <string name=\"auto_queue_title\">自動佇列至下一個串流</string>\n    <string name=\"auto_queue_summary\">透過加入相關的串流來繼續結束的 (未重複) 播放佇列</string>\n    <string name=\"file\">檔案</string>\n    <string name=\"invalid_directory\">無效的資料夾</string>\n    <string name=\"invalid_source\">無效的檔案或內容來源</string>\n    <string name=\"file_name_empty_error\">檔案名稱不能留空</string>\n    <string name=\"error_occurred_detail\">發生錯誤： %1$s</string>\n    <string name=\"import_title\">匯入</string>\n    <string name=\"import_from\">匯入自</string>\n    <string name=\"export_to\">匯出至</string>\n    <string name=\"import_ongoing\">正在匯入…</string>\n    <string name=\"export_ongoing\">正在匯出…</string>\n    <string name=\"import_file_title\">匯入檔案</string>\n    <string name=\"subscriptions_import_unsuccessful\">無法匯入訂閱內容</string>\n    <string name=\"subscriptions_export_unsuccessful\">無法匯出訂閱內容</string>\n    <string name=\"previous_export\">之前的匯出</string>\n    <string name=\"invalid_file\">檔案不存在或缺少讀寫檔案的權限</string>\n    <string name=\"import_youtube_instructions\">從 Google Takeout 匯入您的 YouTube 訂閱： \\n \\n1. 移至此網址：%1$s \\n2. 當被提示時登入帳號 \\n3. 按一下「包含所有資料」，接著「取消選取全部」，然後僅勾選「訂閱」並按一下「確定」 \\n4. 按一下「下一步」然後「建立匯出」 \\n5. 在「下載」按鈕出現後按一下它 \\n6. 點擊下方的「匯入檔案」並選取已下載的 zip 檔案 \\n7. [若 zip 匯入失敗] 擷取 .csv 檔案 (通常位於「YouTube 與 YouTube Music/訂閱/訂閱.csv」)，按一下下方的「匯入檔案」並選取擷取的 csv 檔案</string>\n    <string name=\"import_soundcloud_instructions_hint\">您的 ID, soundcloud.com/yourid</string>\n    <string name=\"import_network_expensive_warning\">請記住，此操作可造成昂貴網路花費。 \n\\n \n\\n您是否希望繼續？</string>\n    <string name=\"import_soundcloud_instructions\">透過輸入 URL 或您的 ID 來匯入 SoundCloud 個人設定檔： \n\\n \n\\n1. 在瀏覽器中啟用「桌面模式」(該網站不適用於行動裝置) \n\\n2. 移至此網址： %1$s \n\\n3. 當被提示時登入帳號 \n\\n4. 複製您被重新導向到的個人設定檔網址。</string>\n    <string name=\"thumbnail_cache_wipe_complete_notice\">已清除圖片快取</string>\n    <string name=\"metadata_cache_wipe_title\">清除已快取的詮釋資料</string>\n    <string name=\"metadata_cache_wipe_summary\">移除所有已快取的網頁資料</string>\n    <string name=\"metadata_cache_wipe_complete_notice\">已清除詮釋資料快取</string>\n    <string name=\"playback_speed_control\">播放速度控制</string>\n    <string name=\"playback_tempo\">節奏</string>\n    <string name=\"playback_pitch\">音高</string>\n    <string name=\"unhook_checkbox\">解除掛鉤 (可能導致失真)</string>\n    <string name=\"preferred_open_action_settings_title\">偏好的「開啟」動作</string>\n    <string name=\"preferred_open_action_settings_summary\">開啟內容時的預設動作 ─ %s</string>\n    <string name=\"no_streams_available_download\">沒有可供下載的串流</string>\n    <string name=\"caption_setting_title\">字幕</string>\n    <string name=\"caption_setting_description\">調整播放器字幕文字大小與背景樣式。必須重新啟動應用程式才會生效</string>\n    <string name=\"clear_views_history_title\">清除觀看歷史</string>\n    <string name=\"clear_views_history_summary\">刪除播放過的串流與播放位置歷史</string>\n    <string name=\"delete_view_history_alert\">刪除所有觀看歷史記錄？</string>\n    <string name=\"watch_history_deleted\">觀看歷史已刪除</string>\n    <string name=\"clear_search_history_title\">清除搜尋歷史</string>\n    <string name=\"clear_search_history_summary\">刪除搜尋關鍵字的記錄</string>\n    <string name=\"delete_search_history_alert\">刪除所有搜尋歷史記錄？</string>\n    <string name=\"search_history_deleted\">搜尋記錄已刪除</string>\n    <string name=\"one_item_deleted\">已刪除一個項目。</string>\n    <string name=\"app_license\">NewPipe 是一個 Copyleft 的自由軟體：您可以隨意使用、研究、分享並改進它。在遵守由自由軟體基金會所發佈的 GNU 通用公共授權條款的狀況下，您可以自由地再散佈及／或修改它；授權條款預設使用第三版，但您也可以選擇更新的版本。</string>\n    <string name=\"import_settings\">您是否要同時匯入設定？</string>\n    <string name=\"privacy_policy_title\">NewPipe 的隱私政策</string>\n    <string name=\"privacy_policy_encouragement\">NewPipe 專案非常重視您的隱私。因此，未經您同意此程式不會收集任何資料。 \n\\nNewPipe 的隱私權政策詳細說明了當您發送錯誤回報時，什麼資料會被傳送及儲存。</string>\n    <string name=\"read_privacy_policy\">閱讀隱私政策</string>\n    <string name=\"start_accept_privacy_policy\">為配合歐洲通用資料保護條例 ( GDPR ) ，我們在此請您注意 NewPipe 的隱私政策。請務必仔細閱讀。 \n\\n您必須接受它才能向我們發送錯誤報告。</string>\n    <string name=\"accept\">接受</string>\n    <string name=\"decline\">拒絕</string>\n    <string name=\"limit_data_usage_none_description\">沒有限制</string>\n    <string name=\"limit_mobile_data_usage_title\">使用行動網路時限制解析度</string>\n    <string name=\"minimize_on_exit_title\">切換 app 時最小化</string>\n    <string name=\"minimize_on_exit_summary\">從主影片播放器切換到其他 app 時要執行的動作 ─ %s</string>\n    <string name=\"minimize_on_exit_none_description\">無</string>\n    <string name=\"minimize_on_exit_background_description\">最小化為背景播放器</string>\n    <string name=\"minimize_on_exit_popup_description\">最小化為彈出式播放器</string>\n    <string name=\"skip_silence_checkbox\">靜音時快轉</string>\n    <string name=\"playback_step\">步進</string>\n    <string name=\"playback_reset\">重設</string>\n    <string name=\"channels\">頻道</string>\n    <string name=\"playlists\">播放清單</string>\n    <string name=\"tracks\">曲目</string>\n    <string name=\"users\">使用者</string>\n    <string name=\"unsubscribe\">取消訂閱</string>\n    <string name=\"tab_choose\">選擇分頁</string>\n    <string name=\"settings_category_updates_title\">更新</string>\n    <string name=\"file_deleted\">已刪除檔案</string>\n    <string name=\"app_update_notification_channel_name\">應用程式更新通知</string>\n    <string name=\"app_update_notification_channel_description\">新 NewPipe 版本通知</string>\n    <string name=\"download_to_sdcard_error_title\">無法使用外部儲存空間</string>\n    <string name=\"download_to_sdcard_error_message\">無法下載到外部 SD 卡。重設下載資料夾位置？</string>\n    <string name=\"saved_tabs_invalid_json\">無法讀取已儲存的分頁，因此使用預設分頁</string>\n    <string name=\"restore_defaults\">恢復預設值</string>\n    <string name=\"restore_defaults_confirmation\">您想要恢復預設值嗎？</string>\n    <string name=\"subscribers_count_not_available\">訂閱數不可用</string>\n    <string name=\"main_page_content_summary\">要在首頁顯示哪些分頁</string>\n    <string name=\"updates_setting_title\">更新</string>\n    <string name=\"updates_setting_description\">當有新版本可用時顯示通知以告知應用程式更新</string>\n    <string name=\"list_view_mode\">清單檢視模式</string>\n    <string name=\"list\">清單</string>\n    <string name=\"grid\">網格</string>\n    <string name=\"auto\">自動</string>\n    <string name=\"app_update_available_notification_title\">有可用的 NewPipe 更新！</string>\n    <string name=\"missions_header_finished\">已完成</string>\n    <string name=\"missions_header_pending\">有待處理</string>\n    <string name=\"paused\">已暫停</string>\n    <string name=\"queued\">已排入佇列</string>\n    <string name=\"post_processing\">正在後處理</string>\n    <string name=\"enqueue\">排入佇列</string>\n    <string name=\"permission_denied\">動作被系統拒絕</string>\n    <string name=\"download_failed\">下載失敗</string>\n    <string name=\"generate_unique_name\">生成獨特的名稱</string>\n    <string name=\"overwrite\">覆寫</string>\n    <string name=\"overwrite_finished_warning\">有已下載的同名檔案</string>\n    <string name=\"download_already_running\">已有進行中的下載與此同名</string>\n    <string name=\"show_error\">顯示錯誤</string>\n    <string name=\"error_file_creation\">無法建立檔案</string>\n    <string name=\"error_path_creation\">無法建立目的地資料夾</string>\n    <string name=\"error_ssl_exception\">無法建立安全連線</string>\n    <string name=\"error_unknown_host\">找不到伺服器</string>\n    <string name=\"error_connect_host\">無法連線到伺服器</string>\n    <string name=\"error_http_no_content\">伺服器沒有傳送資料</string>\n    <string name=\"error_http_unsupported_range\">伺服器不接受多執行緒下載，請以 @string/msg_threads = 1 重試</string>\n    <string name=\"error_http_not_found\">找不到</string>\n    <string name=\"error_postprocessing_failed\">後處理失敗</string>\n    <string name=\"stop\">停止</string>\n    <string name=\"max_retry_msg\">最大重試次數</string>\n    <string name=\"max_retry_desc\">在取消下載前的最大嘗試數</string>\n    <string name=\"pause_downloads_on_mobile\">在計量收費網路上時中斷</string>\n    <string name=\"pause_downloads_on_mobile_desc\">切換到行動數據時很有用，雖然某些下載無法暫停</string>\n    <string name=\"events\">事件</string>\n    <string name=\"conferences\">會議</string>\n    <string name=\"error_timeout\">連線已逾時</string>\n    <string name=\"show_comments_title\">顯示留言</string>\n    <string name=\"show_comments_summary\">關閉以隱藏留言</string>\n    <string name=\"autoplay_title\">自動播放</string>\n    <string name=\"no_comments\">沒有留言</string>\n    <string name=\"error_unable_to_load_comments\">無法載入留言</string>\n    <string name=\"close\">關閉</string>\n    <string name=\"enable_playback_resume_title\">恢復播放</string>\n    <string name=\"enable_playback_resume_summary\">回復到上一次播放的位置</string>\n    <string name=\"enable_playback_state_lists_title\">清單中的位置</string>\n    <string name=\"enable_playback_state_lists_summary\">在清單中顯示播放位置指示器</string>\n    <string name=\"settings_category_clear_data_title\">清除資料</string>\n    <string name=\"watch_history_states_deleted\">播放位置已刪除</string>\n    <string name=\"missing_file\">檔案已被移動或刪除</string>\n    <string name=\"overwrite_unrelated_warning\">同名的檔案已存在</string>\n    <string name=\"overwrite_failed\">無法覆寫檔案</string>\n    <string name=\"download_already_pending\">已有擱置中的下載與此同名</string>\n    <string name=\"error_postprocessing_stopped\">NewPipe 在處理檔案時被關閉</string>\n    <string name=\"error_insufficient_storage_left\">裝置上沒有剩餘的空間</string>\n    <string name=\"error_progress_lost\">進度遺失，因為檔案已被刪除</string>\n    <string name=\"confirm_prompt\">您想要清除您的下載歷史記錄，還是刪除所有已下載的檔案？</string>\n    <string name=\"enable_queue_limit\">限制下載佇列</string>\n    <string name=\"enable_queue_limit_desc\">一次執行一個下載</string>\n    <string name=\"start_downloads\">開始下載</string>\n    <string name=\"pause_downloads\">暫停下載</string>\n    <string name=\"downloads_storage_ask_title\">詢問要下載到哪裡</string>\n    <string name=\"downloads_storage_ask_summary\">每次下載都會詢問您要下載到哪裡。\n\\n如果您想要下載到外部的 SD 記憶卡的話，請啟用系統資料夾挑選器 (SAF)</string>\n    <string name=\"downloads_storage_use_saf_title\">使用系統資料夾挑選器 (SAF)</string>\n    <string name=\"downloads_storage_use_saf_summary\">「儲存空間存取框架」讓您可以下載到外部的 SD 記憶卡</string>\n    <string name=\"clear_playback_states_title\">刪除播放位置</string>\n    <string name=\"clear_playback_states_summary\">刪除所有播放位置</string>\n    <string name=\"delete_playback_states_alert\">刪除所有播放位置？</string>\n    <string name=\"drawer_header_description\">切換服務，目前已選取：</string>\n    <plurals name=\"videos\">\n        <item quantity=\"other\">%s 部影片</item>\n    </plurals>\n    <string name=\"default_kiosk_page_summary\">預設 Kiosk</string>\n    <string name=\"no_one_watching\">沒有人在看</string>\n    <plurals name=\"watching\">\n        <item quantity=\"other\">%s 個觀眾</item>\n    </plurals>\n    <string name=\"no_one_listening\">沒有人正在聽</string>\n    <plurals name=\"listening\">\n        <item quantity=\"other\">%s 位聽眾</item>\n    </plurals>\n    <string name=\"seek_duration_title\">快轉／快退搜尋持續時間</string>\n    <string name=\"peertube_instance_url_title\">PeerTube 實例</string>\n    <string name=\"peertube_instance_url_summary\">選取您最愛的 PeerTube 實例</string>\n    <string name=\"peertube_instance_url_help\">在 %s 上找到您喜歡的實例</string>\n    <string name=\"peertube_instance_add_title\">新增實例</string>\n    <string name=\"peertube_instance_add_help\">輸入實例網址</string>\n    <string name=\"peertube_instance_add_fail\">無法驗證實例</string>\n    <string name=\"peertube_instance_add_https_only\">僅支援 HTTPS 網址</string>\n    <string name=\"peertube_instance_add_exists\">實例已存在</string>\n    <string name=\"local\">本機</string>\n    <string name=\"recently_added\">最近新增</string>\n    <string name=\"most_liked\">最喜歡</string>\n    <string name=\"playlist_no_uploader\">自動生成 (未找到上傳者)</string>\n    <string name=\"recovering\">正在恢復</string>\n    <string name=\"error_download_resource_gone\">無法恢復此下載</string>\n    <string name=\"choose_instance_prompt\">選擇一個實例</string>\n    <string name=\"clear_download_history\">清除下載歷史記錄</string>\n    <string name=\"delete_downloaded_files\">刪除已下載的檔案</string>\n    <string name=\"permission_display_over_apps\">給予顯示在其他應用程式上層的權限</string>\n    <string name=\"app_language_title\">應用程式語言</string>\n    <string name=\"systems_language\">系統預設值</string>\n    <string name=\"subtitle_activity_recaptcha\">解決後請按「完成」</string>\n    <string name=\"done\">完成</string>\n    <string name=\"videos_string\">影片</string>\n    <plurals name=\"seconds\">\n        <item quantity=\"other\">%d 秒</item>\n    </plurals>\n    <string name=\"new_seek_duration_toast\">因為 ExoPlayer 的限制，搜尋持續時間設定為 %d 秒</string>\n    <string name=\"mute\">靜音</string>\n    <string name=\"unmute\">取消靜音</string>\n    <plurals name=\"minutes\">\n        <item quantity=\"other\">%d 分鐘</item>\n    </plurals>\n    <plurals name=\"hours\">\n        <item quantity=\"other\">%d 小時</item>\n    </plurals>\n    <plurals name=\"days\">\n        <item quantity=\"other\">%d 天</item>\n    </plurals>\n    <string name=\"feed_groups_header_title\">頻道群組</string>\n    <string name=\"feed_oldest_subscription_update\">Feed 最後更新：%s</string>\n    <string name=\"feed_subscription_not_loaded_count\">未載入：%d</string>\n    <string name=\"feed_notification_loading\">正在載入 feed……</string>\n    <string name=\"feed_processing_message\">正在處理 feed……</string>\n    <string name=\"feed_group_dialog_select_subscriptions\">選取訂閱</string>\n    <string name=\"feed_group_dialog_empty_selection\">未選取訂閱</string>\n    <plurals name=\"feed_group_dialog_selection_count\">\n        <item quantity=\"other\">已選取 %d 個</item>\n    </plurals>\n    <string name=\"feed_group_dialog_empty_name\">清空群組名稱</string>\n    <string name=\"feed_group_dialog_delete_message\">您想要刪除此群組嗎？</string>\n    <string name=\"feed_create_new_group_button_title\">新</string>\n    <string name=\"settings_category_feed_title\">Feed</string>\n    <string name=\"feed_update_threshold_title\">Feed 更新閾值</string>\n    <string name=\"feed_update_threshold_summary\">上次更新後，訂閱被視為過時的時間 ─ %s</string>\n    <string name=\"feed_update_threshold_option_always_update\">總是更新</string>\n    <string name=\"feed_use_dedicated_fetch_method_title\">在可用時從專用 feed 擷取</string>\n    <string name=\"feed_use_dedicated_fetch_method_summary\">其在某些服務中可用，且通常較快速，但可能只會回傳有限的項目，而且資訊通常不完整 (例如：沒有持續時間、項目類型、沒有即時狀態)</string>\n    <string name=\"feed_use_dedicated_fetch_method_enable_button\">啟用快速模式</string>\n    <string name=\"feed_use_dedicated_fetch_method_disable_button\">停用快速模式</string>\n    <string name=\"feed_use_dedicated_fetch_method_help_text\">您覺得 feed 載入太慢了嗎？如果是的話，試著啟用快速載入 (您可以在設定中變更或按下下方的按鈕)。 \\n \\nNewPipe 提供兩個 feed 載入策略： \\n• 擷取整個訂閱頻道，慢但是完整。 \\n• 使用專用的伺服器端點，較快速但是通常不完整。 \\n \\n兩者之間的差別是，較快速的通常缺少部份資訊，如項目的持續時間或類型（無法區分直播影片或一般影片），而且其可能會回傳較少項目。 \\n \\nYouTube 是一種透過其 RSS feed 提供這種快速方式的例子。 \\n \\n因此，請選取您較偏好的：速度或準確的資訊。</string>\n    <string name=\"content_not_supported\">NewPipe 尚未支援此內容。\n\\n\n\\n希望它會在未來的版本中支援。</string>\n    <string name=\"infinite_videos\">∞ 部影片</string>\n    <string name=\"more_than_100_videos\">超過 100 部影片</string>\n    <string name=\"artists\">演出者</string>\n    <string name=\"albums\">專輯</string>\n    <string name=\"songs\">歌曲</string>\n    <string name=\"restricted_video\">此影片設有年齡限制。\n\\n\n\\n如果您想要觀看，請在設定中開啟「%1$s」。</string>\n    <string name=\"remove_watched_popup_partially_watched_streams\">是的，包括已部份觀看的影片</string>\n    <string name=\"remove_watched_popup_warning\">已觀看過的串流在加入播放清單後將被移除。\\n您確定嗎？</string>\n    <string name=\"remove_watched_popup_title\">移除已觀看的串流？</string>\n    <string name=\"remove_watched\">移除已觀看的影片</string>\n    <string name=\"show_original_time_ago_summary\">來自服務的原始文字將在串流項目中可見</string>\n    <string name=\"show_original_time_ago_title\">在項目上顯示原始時間</string>\n    <string name=\"youtube_restricted_mode_enabled_title\">開啟 YouTube 的「嚴格篩選模式」</string>\n    <string name=\"video_detail_by\">由 %s</string>\n    <string name=\"channel_created_by\">由 %s 建立</string>\n    <string name=\"detail_sub_channel_thumbnail_view_description\">頻道大頭貼縮圖</string>\n    <string name=\"feed_group_show_only_ungrouped_subscriptions\">僅顯示未分組的訂閱</string>\n    <string name=\"no_playlist_bookmarked_yet\">尚無播放清單書籤</string>\n    <string name=\"playlist_page_summary\">播放清單頁面</string>\n    <string name=\"select_a_playlist\">選取播放清單</string>\n    <string name=\"error_report_open_github_notice\">請檢查是否已有與您的應用程式崩潰相關的討論議題。當建立重複的客服單時，您就是在耗費我們本來可以用來修復錯誤的時間。</string>\n    <string name=\"error_report_open_issue_button_text\">在 GitHub 上回報</string>\n    <string name=\"copy_for_github\">複製格式化過的報告</string>\n    <string name=\"search_showing_result_for\">目前顯示 %s 的結果</string>\n    <string name=\"never\">從不</string>\n    <string name=\"wifi_only\">僅在 Wi-Fi 上</string>\n    <string name=\"autoplay_summary\">自動開始播放 ─ %s</string>\n    <string name=\"title_activity_play_queue\">播放佇列</string>\n    <string name=\"unsupported_url_dialog_message\">無法識別此網址。要用其他應用程式開啟嗎？</string>\n    <string name=\"auto_queue_toggle\">自動佇列</string>\n    <string name=\"clear_queue_confirmation_description\">啟動中播放器的佇列可能會被取代</string>\n    <string name=\"clear_queue_confirmation_summary\">從一個播放器切換到另一個可能會取代您的佇列</string>\n    <string name=\"clear_queue_confirmation_title\">清除佇列前要求確認</string>\n    <string name=\"notification_action_nothing\">無</string>\n    <string name=\"notification_action_buffering\">正在緩衝</string>\n    <string name=\"notification_action_shuffle\">隨機</string>\n    <string name=\"notification_action_repeat\">循環</string>\n    <string name=\"notification_actions_at_most_three\">您可以選取最多三個動作來顯示在簡潔通知中！</string>\n    <string name=\"notification_actions_summary\">透過輕觸下方的通知動作來編輯它們。使用右側的勾選框，最多可以選取三個在簡潔通知中顯示。</string>\n    <string name=\"notification_action_4_title\">第五動作按鈕</string>\n    <string name=\"notification_action_3_title\">第四動作按鈕</string>\n    <string name=\"notification_action_2_title\">第三動作按鈕</string>\n    <string name=\"notification_action_1_title\">第二動作按鈕</string>\n    <string name=\"notification_action_0_title\">第一動作按鈕</string>\n    <string name=\"notification_scale_to_square_image_summary\">將通知中顯示的影片縮圖從 16:9 裁剪到 1:1</string>\n    <string name=\"notification_scale_to_square_image_title\">將縮圖裁剪為 1:1 的長寬比</string>\n    <string name=\"show_memory_leaks\">顯示記憶體洩漏</string>\n    <string name=\"enqueued\">已加入佇列</string>\n    <string name=\"enqueue_stream\">加入佇列</string>\n    <string name=\"clear_cookie_summary\">清除 NewPipe 在您解決 reCAPTCHA 時儲存的 cookie</string>\n    <string name=\"recaptcha_cookies_cleared\">reCAPTCHA cookies 已被清除</string>\n    <string name=\"clear_cookie_title\">清除 reCAPTCHA cookies</string>\n    <string name=\"youtube_restricted_mode_enabled_summary\">YouTube 有提供「嚴格篩選模式」，可以隱藏潛在的成人內容</string>\n    <string name=\"show_age_restricted_content_summary\">顯示可能不適於兒童的內容，因為其有年齡限制 (例如 18 歲以上)</string>\n    <string name=\"notification_colorize_summary\">讓 Android 根據縮圖中的主要色彩來自訂通知的顏色 (請注意，此功能並不是在所有裝置上都能正常運作)</string>\n    <string name=\"notification_colorize_title\">彩色通知</string>\n    <string name=\"show_thumbnail_summary\">於鎖定畫面背景與通知使用縮圖</string>\n    <string name=\"show_thumbnail_title\">顯示縮圖</string>\n    <string name=\"msg_calculating_hash\">正在計算雜湊</string>\n    <string name=\"hash_channel_description\">影片雜湊流程通知</string>\n    <string name=\"hash_channel_name\">影片雜湊通知</string>\n    <string name=\"recent\">最近</string>\n    <string name=\"show_meta_info_summary\">關閉以隱藏帶有關於串流建立者、串流內容或搜尋請求等額外資料的詮釋資料框</string>\n    <string name=\"show_meta_info_title\">顯示詮釋資訊</string>\n    <string name=\"chapters\">章節</string>\n    <string name=\"description_tab_description\">說明</string>\n    <string name=\"related_items_tab_description\">相關項目</string>\n    <string name=\"comments_tab_description\">留言</string>\n    <string name=\"show_description_summary\">關閉以隱藏影片說明及其他附帶資訊</string>\n    <string name=\"show_description_title\">顯示說明</string>\n    <string name=\"open_with\">以……開啟</string>\n    <string name=\"no_app_to_open_intent\">您裝置上沒有應用程式可以打開這個</string>\n    <string name=\"crash_the_app\">應用程式當機</string>\n    <string name=\"paid_content\">此內容僅對已付費的內容可用，因此無法由 NewPipe 串流或下載。</string>\n    <string name=\"youtube_music_premium_content\">此影片僅供 YouTube Music Premium 會員使用，因此無法由 NewPipe 串流或下載。</string>\n    <string name=\"private_content\">此內容為私人內容，因此無法由 NewPipe 串流或下載。</string>\n    <string name=\"soundcloud_go_plus_content\">這是 SoundCloud Go+ 的曲目，因此至少在您的國家無法由 NewPipe 串流或下載。</string>\n    <string name=\"georestricted_content\">此內容在您所在的國家不可用。</string>\n    <string name=\"restricted_video_no_stream\">此影片有年齡限制。\n\\n因為 YouTube 新的年齡影片限制政策，NewPipe 無法存取任何這類的視訊串流，因此無法播放。</string>\n    <string name=\"radio\">廣播</string>\n    <string name=\"featured\">精選</string>\n    <string name=\"recaptcha_solve\">解決</string>\n    <string name=\"download_has_started\">下載已經開始</string>\n    <string name=\"select_night_theme_toast\">您可以在下方選取您最愛的夜間佈景主題</string>\n    <string name=\"night_theme_summary\">選取您最愛的夜間佈景主題 ─ %s</string>\n    <string name=\"auto_device_theme_title\">自動 (裝置佈景主題)</string>\n    <string name=\"night_theme_title\">深色主題</string>\n    <string name=\"show_channel_details\">顯示頻道詳細資訊</string>\n    <string name=\"disable_media_tunneling_summary\">如果您遇到黑畫面或影片播放停頓的現象，請停用媒體隧道。</string>\n    <string name=\"disable_media_tunneling_title\">停用媒體隧道</string>\n    <string name=\"metadata_privacy_internal\">內部</string>\n    <string name=\"metadata_privacy_private\">私人</string>\n    <string name=\"metadata_privacy_unlisted\">未列出</string>\n    <string name=\"metadata_privacy_public\">公開</string>\n    <string name=\"metadata_host\">主機</string>\n    <string name=\"metadata_support\">支援</string>\n    <string name=\"metadata_language\">語言</string>\n    <string name=\"metadata_age_limit\">年齡限制</string>\n    <string name=\"metadata_privacy\">隱私</string>\n    <string name=\"metadata_licence\">授權條款</string>\n    <string name=\"metadata_tags\">標籤</string>\n    <string name=\"metadata_category\">分類</string>\n    <string name=\"description_select_disable\">停用選取描述中的文字</string>\n    <string name=\"description_select_enable\">啟用選取描述中的文字</string>\n    <string name=\"description_select_note\">您現在可以選取描述中的文字了。請注意，在選取模式下，頁面可能會閃爍，連結也可能無法點擊。</string>\n    <string name=\"open_website_license\">開啟網站</string>\n    <string name=\"account_terminated\">帳號已終止</string>\n    <string name=\"feed_load_error_fast_unknown\">快速 feed 模式不會提供更多資訊。</string>\n    <string name=\"feed_load_error_terminated\">作者的帳號已被終止。\n\\nNewPipe 未來將無法載入此 feed。\n\\n您想要取消訂閱此頻道嗎？</string>\n    <string name=\"feed_load_error_account_info\">無法載入「%s」。</string>\n    <string name=\"feed_load_error\">載入 feed 時發生錯誤</string>\n    <string name=\"downloads_storage_use_saf_summary_api_29\">從 Android 10 開始僅支援「儲存空間存取框架」</string>\n    <string name=\"downloads_storage_ask_summary_no_saf_notice\">每次下載都會詢問您要下載到哪裡</string>\n    <string name=\"no_dir_yet\">尚未設定下載資料夾，立刻選擇預設的下載資料夾</string>\n    <string name=\"off\">關閉</string>\n    <string name=\"on\">開啟</string>\n    <string name=\"tablet_mode_title\">平板電腦模式</string>\n    <string name=\"comments_are_disabled\">留言已停用</string>\n    <string name=\"dont_show\">不要顯示</string>\n    <string name=\"low_quality_smaller\">低品質 (較小)</string>\n    <string name=\"high_quality_larger\">高品質 (較大)</string>\n    <string name=\"seekbar_preview_thumbnail_title\">拖動列縮圖預覽</string>\n    <string name=\"detail_heart_img_view_description\">被創作者加心號</string>\n    <string name=\"mark_as_watched\">標記為已觀看</string>\n    <string name=\"remote_search_suggestions\">遠端搜尋建議</string>\n    <string name=\"local_search_suggestions\">本機搜尋建議</string>\n    <plurals name=\"deleted_downloads_toast\">\n        <item quantity=\"other\">已刪除 %1$s 下載</item>\n    </plurals>\n    <plurals name=\"download_finished_notification\">\n        <item quantity=\"other\">%s 下載已完成</item>\n    </plurals>\n    <string name=\"main_page_content_swipe_remove\">滑動項目即可移除</string>\n    <string name=\"start_main_player_fullscreen_summary\">如果自動旋轉被鎖定，請不要在迷你播放器中啟動影片，而是直接切換到全螢幕模式。您仍然可以透過結束全螢幕存取迷你播放器</string>\n    <string name=\"start_main_player_fullscreen_title\">以全螢幕開始主播放器</string>\n    <string name=\"enqueued_next\">已將下一個加入佇列</string>\n    <string name=\"enqueue_next_stream\">將下一個加入佇列</string>\n    <string name=\"processing_may_take_a_moment\">正在處理……可能需要一點時間</string>\n    <string name=\"check_for_updates\">檢查更新</string>\n    <string name=\"manual_update_description\">手動檢查新版本</string>\n    <string name=\"checking_updates_toast\">正在檢查更新……</string>\n    <string name=\"feed_new_items\">新 feed 項目</string>\n    <string name=\"crash_the_player\">讓播放器崩潰</string>\n    <string name=\"show_crash_the_player_title\">顯示「播放器當機」</string>\n    <string name=\"show_crash_the_player_summary\">使用播放器時顯示當機選項</string>\n    <string name=\"error_report_channel_name\">錯誤回報通知</string>\n    <string name=\"error_report_channel_description\">回報錯誤的通知</string>\n    <string name=\"show_error_snackbar\">顯示錯誤 SnackBar</string>\n    <string name=\"create_error_notification\">建立錯誤通知</string>\n    <string name=\"no_appropriate_file_manager_message_android_10\">找不到適合此動作的檔案管理員。 \\n請安裝相容於儲存空間存取框架的檔案管理員</string>\n    <string name=\"no_appropriate_file_manager_message\">找不到適合此動作的檔案管理員。 \\n請安裝檔案管理員或在下載設定裡嘗試停用「%s」</string>\n    <string name=\"error_report_notification_title\">NewPipe 遭遇了一個錯誤，輕觸以回報</string>\n    <string name=\"error_report_notification_toast\">發生錯誤，請查看通知</string>\n    <string name=\"detail_pinned_comment_view_description\">釘選的留言</string>\n    <string name=\"leak_canary_not_available\">LeakCanary 無法使用</string>\n    <string name=\"progressive_load_interval_exoplayer_default\">ExoPlayer 預設值</string>\n    <string name=\"settings_category_player_notification_title\">播放器通知</string>\n    <string name=\"notifications\">通知</string>\n    <string name=\"loading_stream_details\">正在載入串流詳細資訊……</string>\n    <string name=\"you_successfully_subscribed\">您已訂閱此頻道</string>\n    <string name=\"enumeration_comma\">,</string>\n    <string name=\"toggle_all\">切換全部</string>\n    <string name=\"enable_streams_notifications_title\">新串流通知</string>\n    <string name=\"settings_category_player_notification_summary\">設定目前播放串流通知</string>\n    <string name=\"streams_notifications_network_title\">需要網路連線</string>\n    <string name=\"delete_downloaded_files_confirm\">從磁碟清除所有已下載的檔案？</string>\n    <string name=\"get_notified\">取得通知</string>\n    <string name=\"streams_notification_channel_name\">新串流</string>\n    <string name=\"streams_notification_channel_description\">關於訂閱的新串流通知</string>\n    <string name=\"check_new_streams\">執行新串流檢查</string>\n    <string name=\"enable_streams_notifications_summary\">通知來自訂閱的新串流</string>\n    <string name=\"streams_notifications_interval_title\">檢查頻率</string>\n    <string name=\"notifications_disabled\">通知已停用</string>\n    <plurals name=\"new_streams\">\n        <item quantity=\"other\">%s 個新串流</item>\n    </plurals>\n    <string name=\"any_network\">任意網路</string>\n    <string name=\"percent\">百分比</string>\n    <string name=\"semitone\">半音</string>\n    <string name=\"unknown_format\">未知格式</string>\n    <string name=\"unknown_quality\">未知品質</string>\n    <string name=\"streams_not_yet_supported_removed\">不顯示下載程式尚不支援的串流</string>\n    <string name=\"selected_stream_external_player_not_supported\">外部播放程式不支援選定的串流</string>\n    <string name=\"no_audio_streams_available_for_external_players\">沒有可用於外部播放程式的音訊串流</string>\n    <string name=\"no_video_streams_available_for_external_players\">沒有可用於外部播放程式的視訊串流</string>\n    <string name=\"select_quality_external_players\">選取外部播放程式的畫質</string>\n    <string name=\"progressive_load_interval_title\">播放載入間隔大小</string>\n    <string name=\"faq_title\">常見問題</string>\n    <string name=\"faq\">在網站上檢視</string>\n    <string name=\"sort\">排序</string>\n    <string name=\"faq_description\">若您在使用此應用程式時遇到任何問題，請務必先看看常見問題的答案！</string>\n    <string name=\"app_update_unavailable_toast\">您正在執行最新版本的 NewPipe</string>\n    <string name=\"app_update_available_notification_text\">輕觸以下載 %s</string>\n    <string name=\"fast_mode\">快速模式</string>\n    <string name=\"import_subscriptions_hint\">從三點式選單匯入或匯出訂閱</string>\n    <string name=\"night_theme_available\">此選項僅在主題選擇為 %s 時可用</string>\n    <string name=\"card\">卡片</string>\n    <string name=\"unset_playlist_thumbnail\">取消設定永久縮圖</string>\n    <string name=\"msg_failed_to_copy\">無法複製到剪貼簿</string>\n    <string name=\"playlist_add_stream_success_duplicate\">重複新增 %d 次</string>\n    <string name=\"duplicate_in_playlist\">變灰的播放清單已經包含此項目。</string>\n    <string name=\"ignore_hardware_media_buttons_title\">忽略硬體媒體鍵事件</string>\n    <string name=\"ignore_hardware_media_buttons_summary\">這很有用，舉例來說，若您正在使用物理按鍵壞掉的耳機</string>\n    <string name=\"remove_duplicates_title\">移除重複的？</string>\n    <string name=\"feed_hide_streams_title\">顯示以下串流</string>\n    <string name=\"feed_show_hide_streams\">顯示/隱藏串流</string>\n    <string name=\"feed_show_watched\">完全看完</string>\n    <string name=\"feed_show_partially_watched\">部份觀看</string>\n    <string name=\"feed_show_upcoming\">即將到來</string>\n    <string name=\"remove_duplicates\">移除重複的</string>\n    <string name=\"remove_duplicates_message\">您想要移除所有在此播放清單中重複的串流？</string>\n    <string name=\"left_gesture_control_title\">左側手勢動作</string>\n    <string name=\"right_gesture_control_title\">右側手勢動作</string>\n    <string name=\"brightness\">亮度</string>\n    <string name=\"volume\">音量</string>\n    <string name=\"left_gesture_control_summary\">為播放器畫面左側選擇手勢</string>\n    <string name=\"right_gesture_control_summary\">為播放器畫面右側選擇手勢</string>\n    <string name=\"none\">無</string>\n    <string name=\"prefer_original_audio_title\">偏好原始音訊</string>\n    <string name=\"play_queue_audio_track\">音訊：%s</string>\n    <string name=\"audio_track\">音訊軌道</string>\n    <string name=\"audio_track_present_in_video\">此串流應已存在音訊軌道</string>\n    <string name=\"select_audio_track_external_players\">為外部播放程式選取音訊軌道</string>\n    <string name=\"unknown_audio_track\">未知</string>\n    <string name=\"settings_category_exoplayer_title\">ExoPlayer 設定</string>\n    <string name=\"use_exoplayer_decoder_fallback_title\">使用 ExoPlayer 的解碼器汰退功能</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_title\">一律使用 ExoPlayer 的視訊輸出表面設定解決方法</string>\n    <string name=\"audio_track_type_original\">原始</string>\n    <string name=\"audio_track_type_dubbed\">配音</string>\n    <string name=\"audio_track_type_descriptive\">描述性</string>\n    <string name=\"progressive_load_interval_summary\">變更漸進式內容的載入間隔大小 (目前為 %s)。較低的值可能會加速初始載入速度</string>\n    <string name=\"prefer_descriptive_audio_title\">偏好描述性的音訊</string>\n    <string name=\"prefer_descriptive_audio_summary\">若可用，為視障人士選取帶有描述的音訊軌道</string>\n    <string name=\"prefer_original_audio_summary\">無論語言都選取原始音訊軌道</string>\n    <string name=\"settings_category_exoplayer_summary\">管理一些 ExoPlayer 設定。這些變更需要重新啟動播放程式才會生效</string>\n    <string name=\"use_exoplayer_decoder_fallback_summary\">若您有解碼器初始化的問題，請啟用此選項，若主要的解碼器初始化失敗，其將會汰退至較低優先度的解碼器。這可能會導致播放效能比使用主要解碼器時差</string>\n    <string name=\"always_use_exoplayer_set_output_surface_workaround_summary\">此解決方法是在發生表面變動時釋放並重新確認視訊編解碼器，而非直接將表面設定為編解碼器。ExoPlayer 已在部份有問題的裝置上使用了此設定，此設定僅對 Android 6 或更新版本有效。\n\\n\n\\n啟用此選項可以避免在切換目前視訊播放程式或切換到全螢幕時出現播放錯誤</string>\n    <string name=\"main_tabs_position_summary\">將主分頁選擇器移動至底部</string>\n    <string name=\"main_tabs_position_title\">主分頁位置</string>\n    <string name=\"audio_track_name\">%1$s %2$s</string>\n    <string name=\"disable_media_tunneling_automatic_info\">因為您的裝置型號已知不支援媒體隧道，因此已預設停用。</string>\n    <string name=\"no_streams\">無串流</string>\n    <string name=\"no_live_streams\">無直播串流</string>\n    <string name=\"channel_tab_videos\">影片</string>\n    <string name=\"metadata_subscribers\">訂閱者</string>\n    <string name=\"show_channel_tabs_summary\">頻道頁面上顯示哪些分頁</string>\n    <string name=\"show_channel_tabs\">頻道分頁</string>\n    <string name=\"channel_tab_shorts\">短片</string>\n    <string name=\"loading_metadata_title\">正在載入詮釋資料……</string>\n    <string name=\"feed_fetch_channel_tabs\">擷取頻道分頁</string>\n    <string name=\"channel_tab_about\">關於</string>\n    <string name=\"channel_tab_albums\">專輯</string>\n    <string name=\"feed_fetch_channel_tabs_summary\">更新 feed 時要擷取的分頁。若使用快速模式更新頻道，則此選項無效。</string>\n    <string name=\"channel_tab_playlists\">播放清單</string>\n    <string name=\"channel_tab_tracks\">軌道</string>\n    <string name=\"channel_tab_channels\">頻道</string>\n    <string name=\"channel_tab_livestreams\">直播</string>\n    <string name=\"toggle_screen_orientation\">切換螢幕方向</string>\n    <string name=\"toggle_fullscreen\">切換全螢幕</string>\n    <string name=\"next_stream\">下一個串流</string>\n    <string name=\"open_play_queue\">開啟播放佇列</string>\n    <string name=\"forward\">快轉</string>\n    <string name=\"rewind\">倒帶</string>\n    <string name=\"replay\">重播</string>\n    <string name=\"play\">播放</string>\n    <string name=\"more_options\">更多選項</string>\n    <string name=\"duration\">持續時間</string>\n    <string name=\"previous_stream\">上一個串流</string>\n    <string name=\"image_quality_title\">畫質</string>\n    <string name=\"image_quality_none\">不要載入圖片</string>\n    <string name=\"metadata_thumbnails\">影片縮圖</string>\n    <string name=\"question_mark\">？</string>\n    <string name=\"image_quality_low\">低品質</string>\n    <string name=\"metadata_avatars\">大頭照</string>\n    <string name=\"metadata_subchannel_avatars\">子頻道大頭照</string>\n    <string name=\"image_quality_high\">高品質</string>\n    <string name=\"image_quality_medium\">中等品質</string>\n    <string name=\"metadata_uploader_avatars\">上傳者大頭照</string>\n    <string name=\"metadata_banners\">橫幅</string>\n    <string name=\"image_quality_summary\">選擇影像品質以及是否載入影像，以減少資料與記憶體使用。變更會清除記憶體中與磁碟上的影像快取 — %s</string>\n    <string name=\"share_playlist_with_list\">分享網址清單</string>\n    <string name=\"share_playlist_with_titles\">分享標題</string>\n    <string name=\"share_playlist_content_details\">%1$s\n\\n%2$s</string>\n    <string name=\"share_playlist\">分享播放清單</string>\n    <string name=\"video_details_list_item\">- %1$s：%2$s</string>\n    <plurals name=\"replies\">\n        <item quantity=\"other\">%s 個回覆</item>\n    </plurals>\n    <string name=\"show_more\">顯示更多</string>\n    <string name=\"show_less\">顯示較少</string>\n    <string name=\"notification_actions_summary_android13\">透過輕觸下方的通知動作來編輯它們。前三個動作 (播放/暫停、上一個與下一個) 由系統設定，無法自訂。</string>\n    <string name=\"error_insufficient_storage\">裝置上沒有足夠的空間</string>\n    <string name=\"settings_category_backup_restore_title\">備份與還原</string>\n    <string name=\"reset_settings_title\">重設設定</string>\n    <string name=\"reset_settings_summary\">將所有設定重設為預設值</string>\n    <string name=\"reset_all_settings\">重設所有設定將會放棄您的所有偏好設定並重新啟動應用程式。\n\\n\n\\n您確定您想要繼續嗎？</string>\n    <string name=\"yes\">是</string>\n    <string name=\"no\">否</string>\n    <string name=\"auto_update_check_description\">NewPipe 可以隨時自動檢查新版本，並在新版本可用時通知您。\n\\n您想要啟用此功能嗎？</string>\n    <string name=\"import_settings_vulnerable_format\">匯入的匯出中的設定使用自 NewPipe 0.27.0 起已廢棄的脆弱格式。請確定匯入的匯出是來自可信賴的來源，並在未來只使用從 NewPipe 0.27.0 或更新版本取得的匯出。對於匯入此脆弱格式設定的支援即將完全移除，屆時舊版本的 NewPipe 將無法再匯入新版本匯出的設定。</string>\n    <string name=\"audio_track_type_secondary\">次要</string>\n    <string name=\"share_playlist_as_youtube_temporary_playlist\">分享為 YouTube 臨時播放清單</string>\n    <string name=\"tab_bookmarks_short\">播放清單</string>\n    <string name=\"feed_group_page_summary\">頻道群組頁面</string>\n    <string name=\"select_a_feed_group\">選取 feed 群組</string>\n    <string name=\"no_feed_group_created_yet\">尚未建立 feed 群組</string>\n    <string name=\"channel_tab_likes\">喜歡</string>\n    <string name=\"search_with_service_name\">搜尋 %1$s</string>\n    <string name=\"search_with_service_name_and_filter\">搜尋 %1$s (%2$s)</string>\n    <string name=\"migration_info_6_7_title\">已移除 SoundCloud Top 50 頁面</string>\n    <string name=\"migration_info_6_7_message\">SoundCloud 已停止原有的 Top 50 排行榜。對應的標籤已從您的首頁移除。</string>\n    <string name=\"short_thousand\">%sK</string>\n    <string name=\"short_million\">%sM</string>\n    <string name=\"short_billion\">%sB</string>\n    <string name=\"migration_info_7_8_title\">已移除 YouTube 合併熱門</string>\n    <string name=\"migration_info_7_8_message\">YouTube 自2025年7月21日起停止使用合併熱門頁面。NewPipe 用熱門直播取代預設熱門頁面。\\n\\n您也可以在「設定」→「內容」→「首頁內容」中選擇不同的熱門頁面。</string>\n    <string name=\"trending_gaming\">遊戲熱門</string>\n    <string name=\"trending_podcasts\">熱門 podcast</string>\n    <string name=\"trending_movies\">熱門電影與節目</string>\n    <string name=\"trending_music\">熱門音樂</string>\n    <string name=\"permission_display_over_apps_message\">若要使用彈出式播放器，請在以下 Android 設定選單中選取 %1$s，並啟用 %2$s。</string>\n    <string name=\"permission_display_over_apps_permission_name\">「顯示在其他應用程式上層」</string>\n    <string name=\"delete_file\">刪除檔案</string>\n    <string name=\"delete_entry\">刪除條目</string>\n    <string name=\"entry_deleted\">已刪除條目</string>\n    <string name=\"account_terminated_service_provides_reason\">帳號已終止\\n\\n%1$s 提供了理由：%2$s</string>\n    <string name=\"player_http_403\">播放時收到來自伺服器的 HTTP 錯誤 403，可能因串流網址過期或 IP 封鎖所致</string>\n    <string name=\"player_http_invalid_status\">播放時收到來自伺服器的 HTTP 錯誤 %1$s</string>\n    <string name=\"youtube_player_http_403\">播放時收到來自伺服器的 HTTP 錯誤 403，可能因 IP 封鎖或串流網址去混淆化問題所致</string>\n    <string name=\"sign_in_confirm_not_bot_error\">%1$s 拒絕提供資料，要求登入以確認請求者並非機器人。\\n\\n您的 IP 位址可能已被 %1$s 暫時封鎖，您可稍候片刻或切換至其他 IP 位址（例如開啟/關閉 VPN，或從 Wi-Fi 切換至行動數據）。</string>\n    <string name=\"unsupported_content_in_country\">此內容目前無法於您所選的國家/地區提供。\\n\\n請至「設定」→「內容」→「預設內容國家」變更您的選擇。</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/xml/appearance_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:title=\"@string/settings_category_appearance_title\">\n\n    <ListPreference\n        android:defaultValue=\"@string/default_theme_value\"\n        android:entries=\"@array/theme_description_list\"\n        android:entryValues=\"@array/theme_values_list\"\n        android:key=\"@string/theme_key\"\n        android:title=\"@string/theme_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/default_night_theme_value\"\n        android:entries=\"@array/night_theme_description_list\"\n        android:entryValues=\"@array/night_theme_values_list\"\n        android:key=\"@string/night_theme_key\"\n        android:summary=\"@string/night_theme_summary\"\n        android:title=\"@string/night_theme_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/show_hold_to_append_key\"\n        android:summary=\"@string/show_hold_to_append_summary\"\n        android:title=\"@string/show_hold_to_append_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/tablet_mode_auto_key\"\n        android:entries=\"@array/tablet_mode_description\"\n        android:entryValues=\"@array/tablet_mode_values\"\n        android:key=\"@string/tablet_mode_key\"\n        android:title=\"@string/tablet_mode_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/list_view_mode_value\"\n        android:entries=\"@array/list_view_mode_description\"\n        android:entryValues=\"@array/list_view_mode_values\"\n        android:key=\"@string/list_view_mode_key\"\n        android:title=\"@string/list_view_mode\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <Preference\n        android:key=\"@string/caption_settings_key\"\n        android:summary=\"@string/caption_setting_description\"\n        android:title=\"@string/caption_setting_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/main_tabs_position_key\"\n        android:summary=\"@string/main_tabs_position_summary\"\n        android:title=\"@string/main_tabs_position_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/automotive_app_desc.xml",
    "content": "<automotiveApp>\n    <uses name=\"media\" />\n</automotiveApp>\n"
  },
  {
    "path": "app/src/main/res/xml/backup_restore_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen  xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:title=\"@string/settings_category_backup_restore_title\">\n    <Preference\n        android:key=\"@string/import_data\"\n        android:summary=\"@string/import_data_summary\"\n        android:title=\"@string/import_data_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:key=\"@string/export_data\"\n        android:summary=\"@string/export_data_summary\"\n        android:title=\"@string/export_data_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:key=\"@string/reset_settings\"\n        android:title=\"@string/reset_settings_title\"\n        android:summary=\"@string/reset_settings_summary\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:key=\"@string/export_subscriptions_key\"\n        android:title=\"@string/export_subscriptions_title\"\n        android:summary=\"@string/export_subscriptions_summary\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:key=\"@string/import_subscriptions_key\"\n        android:title=\"@string/import_subscriptions_title\"\n        android:summary=\"@string/import_subscriptions_summary\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n</PreferenceScreen>"
  },
  {
    "path": "app/src/main/res/xml/content_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:title=\"@string/content\">\n\n    <ListPreference\n        android:defaultValue=\"@string/default_localization_key\"\n        android:entries=\"@array/app_language_name\"\n        android:entryValues=\"@array/app_language_code\"\n        android:key=\"@string/app_language_key\"\n        android:title=\"@string/app_language_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <Preference\n        android:key=\"@string/app_language_android_13_and_up_key\"\n        android:title=\"@string/app_language_title\"\n        app:isPreferenceVisible=\"false\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/default_localization_key\"\n        android:entries=\"@array/language_names\"\n        android:entryValues=\"@array/language_codes\"\n        android:key=\"@string/content_language_key\"\n        android:title=\"@string/content_language_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/default_localization_key\"\n        android:entries=\"@array/country_names\"\n        android:entryValues=\"@array/country_codes\"\n        android:key=\"@string/content_country_key\"\n        android:title=\"@string/default_content_country_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.tabs.ChooseTabsFragment\"\n        android:key=\"@string/main_page_content_key\"\n        android:summary=\"@string/main_page_content_summary\"\n        android:title=\"@string/main_page_content\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <MultiSelectListPreference\n        android:key=\"@string/show_channel_tabs_key\"\n        android:summary=\"@string/show_channel_tabs_summary\"\n        android:title=\"@string/show_channel_tabs\"\n        android:entries=\"@array/show_channel_tabs_description_list\"\n        android:entryValues=\"@array/show_channel_tabs_value_list\"\n        android:defaultValue=\"@array/show_channel_tabs_value_list\"\n        app:iconSpaceReserved=\"false\"\n        app:singleLineTitle=\"false\" />\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.PeertubeInstanceListFragment\"\n        android:key=\"@string/peertube_instance_setup_key\"\n        android:summary=\"@string/peertube_instance_url_summary\"\n        android:title=\"@string/peertube_instance_url_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/show_age_restricted_content\"\n        android:summary=\"@string/show_age_restricted_content_summary\"\n        android:title=\"@string/show_age_restricted_content_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/youtube_restricted_mode_enabled\"\n        android:summary=\"@string/youtube_restricted_mode_enabled_summary\"\n        android:title=\"@string/youtube_restricted_mode_enabled_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <MultiSelectListPreference\n        android:key=\"@string/show_search_suggestions_key\"\n        android:summary=\"@string/show_search_suggestions_summary\"\n        android:title=\"@string/show_search_suggestions_title\"\n        android:entries=\"@array/show_search_suggestions_description_list\"\n        android:entryValues=\"@array/show_search_suggestions_value_list\"\n        android:defaultValue=\"@array/show_search_suggestions_value_list\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/image_quality_default\"\n        android:entries=\"@array/image_quality_description\"\n        android:entryValues=\"@array/image_quality_values\"\n        android:key=\"@string/image_quality_key\"\n        android:summary=\"@string/image_quality_summary\"\n        android:title=\"@string/image_quality_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/show_comments_key\"\n        android:summary=\"@string/show_comments_summary\"\n        android:title=\"@string/show_comments_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/show_next_video_key\"\n        android:title=\"@string/show_next_and_similar_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/show_description_key\"\n        android:summary=\"@string/show_description_summary\"\n        android:title=\"@string/show_description_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/show_meta_info_key\"\n        android:summary=\"@string/show_meta_info_summary\"\n        android:title=\"@string/show_meta_info_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceCategory\n        android:layout=\"@layout/settings_category_header_layout\"\n        android:title=\"@string/settings_category_feed_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\">\n\n        <org.schabi.newpipe.settings.custom.DurationListPreference\n            android:defaultValue=\"@string/feed_update_threshold_default_value\"\n            android:entries=\"@array/feed_update_threshold_options\"\n            android:entryValues=\"@array/feed_update_threshold_values\"\n            android:key=\"@string/feed_update_threshold_key\"\n            android:summary=\"@string/feed_update_threshold_summary\"\n            android:title=\"@string/feed_update_threshold_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <SwitchPreferenceCompat\n            android:defaultValue=\"false\"\n            android:key=\"@string/feed_use_dedicated_fetch_method_key\"\n            android:summary=\"@string/feed_use_dedicated_fetch_method_summary\"\n            android:title=\"@string/feed_use_dedicated_fetch_method_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <MultiSelectListPreference\n            android:key=\"@string/feed_fetch_channel_tabs_key\"\n            android:summary=\"@string/feed_fetch_channel_tabs_summary\"\n            android:title=\"@string/feed_fetch_channel_tabs\"\n            android:entries=\"@array/feed_fetch_channel_tabs_description_list\"\n            android:entryValues=\"@array/feed_fetch_channel_tabs_value_list\"\n            android:defaultValue=\"@array/feed_fetch_channel_tabs_value_list\"\n            app:iconSpaceReserved=\"false\"\n            app:singleLineTitle=\"false\" />\n\n    </PreferenceCategory>\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/debug_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:key=\"general_preferences\"\n    android:title=\"@string/settings_category_debug_title\">\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/allow_heap_dumping_key\"\n        android:summary=\"@string/enable_leak_canary_summary\"\n        android:title=\"@string/leakcanary\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:key=\"@string/show_memory_leaks_key\"\n        android:title=\"@string/show_memory_leaks\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/allow_disposed_exceptions_key\"\n        android:summary=\"@string/enable_disposed_exceptions_summary\"\n        android:title=\"@string/enable_disposed_exceptions_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/show_original_time_ago_key\"\n        android:summary=\"@string/show_original_time_ago_summary\"\n        android:title=\"@string/show_original_time_ago_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/show_crash_the_player_key\"\n        android:summary=\"@string/show_crash_the_player_summary\"\n        android:title=\"@string/show_crash_the_player_title\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:key=\"@string/check_new_streams_key\"\n        android:title=\"@string/check_new_streams\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:key=\"@string/crash_the_app_key\"\n        android:title=\"@string/crash_the_app\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:key=\"@string/show_error_snackbar_key\"\n        android:title=\"@string/show_error_snackbar\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:key=\"@string/create_error_notification_key\"\n        android:title=\"@string/create_error_notification\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/download_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:title=\"@string/settings_category_downloads_title\">\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/downloads_storage_ask\"\n        android:summary=\"@string/downloads_storage_ask_summary\"\n        android:title=\"@string/downloads_storage_ask_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/storage_use_saf\"\n        android:summary=\"@string/downloads_storage_use_saf_summary\"\n        android:title=\"@string/downloads_storage_use_saf_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:dialogTitle=\"@string/download_path_dialog_title\"\n        android:key=\"@string/download_path_video_key\"\n        android:summary=\"@string/download_path_summary\"\n        android:title=\"@string/download_path_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:dialogTitle=\"@string/download_path_audio_dialog_title\"\n        android:key=\"@string/download_path_audio_key\"\n        android:summary=\"@string/download_path_audio_summary\"\n        android:title=\"@string/download_path_audio_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/default_file_charset_value\"\n        android:entries=\"@array/settings_filename_charset_name\"\n        android:entryValues=\"@array/settings_filename_charset\"\n        android:key=\"@string/settings_file_charset_key\"\n        android:title=\"@string/settings_file_charset_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <EditTextPreference\n        android:defaultValue=\"@string/settings_file_replacement_character_default_value\"\n        android:key=\"@string/settings_file_replacement_character_key\"\n        android:summary=\"@string/settings_file_replacement_character_summary\"\n        android:title=\"@string/settings_file_replacement_character_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/downloads_maximum_retry_default\"\n        android:entries=\"@array/downloads_maximum_retry_list\"\n        android:entryValues=\"@array/downloads_maximum_retry_list\"\n        android:key=\"@string/downloads_maximum_retry\"\n        android:summary=\"@string/max_retry_desc\"\n        android:title=\"@string/max_retry_msg\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/downloads_cross_network\"\n        android:summary=\"@string/pause_downloads_on_mobile_desc\"\n        android:title=\"@string/pause_downloads_on_mobile\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/downloads_queue_limit\"\n        android:summary=\"@string/enable_queue_limit_desc\"\n        android:title=\"@string/enable_queue_limit\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/exoplayer_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:title=\"@string/settings_category_exoplayer_title\">\n\n    <ListPreference\n        android:defaultValue=\"@string/progressive_load_interval_default_value\"\n        android:entries=\"@array/progressive_load_interval_descriptions\"\n        android:entryValues=\"@array/progressive_load_interval_values\"\n        android:key=\"@string/progressive_load_interval_key\"\n        android:summary=\"@string/progressive_load_interval_summary\"\n        android:title=\"@string/progressive_load_interval_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/use_exoplayer_decoder_fallback_key\"\n        android:summary=\"@string/use_exoplayer_decoder_fallback_summary\"\n        android:title=\"@string/use_exoplayer_decoder_fallback_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/disable_media_tunneling_key\"\n        android:summary=\"@string/disable_media_tunneling_summary\"\n        android:title=\"@string/disable_media_tunneling_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/always_use_exoplayer_set_output_surface_workaround_key\"\n        android:summary=\"@string/always_use_exoplayer_set_output_surface_workaround_summary\"\n        android:title=\"@string/always_use_exoplayer_set_output_surface_workaround_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/history_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:key=\"general_preferences\"\n    android:title=\"@string/settings_category_history_title\">\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/enable_watch_history_key\"\n        android:summary=\"@string/enable_watch_history_summary\"\n        android:title=\"@string/enable_watch_history_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:dependency=\"@string/enable_watch_history_key\"\n        android:key=\"@string/enable_playback_resume_key\"\n        android:summary=\"@string/enable_playback_resume_summary\"\n        android:title=\"@string/enable_playback_resume_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:dependency=\"@string/enable_watch_history_key\"\n        android:key=\"@string/enable_playback_state_lists_key\"\n        android:summary=\"@string/enable_playback_state_lists_summary\"\n        android:title=\"@string/enable_playback_state_lists_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/enable_search_history_key\"\n        android:summary=\"@string/enable_search_history_summary\"\n        android:title=\"@string/enable_search_history_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceCategory\n        android:layout=\"@layout/settings_category_header_layout\"\n        android:title=\"@string/settings_category_clear_data_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\">\n\n        <Preference\n            android:key=\"@string/metadata_cache_wipe_key\"\n            android:summary=\"@string/metadata_cache_wipe_summary\"\n            android:title=\"@string/metadata_cache_wipe_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <Preference\n            android:key=\"@string/clear_views_history_key\"\n            android:summary=\"@string/clear_views_history_summary\"\n            android:title=\"@string/clear_views_history_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <Preference\n            android:key=\"@string/clear_playback_states_key\"\n            android:summary=\"@string/clear_playback_states_summary\"\n            android:title=\"@string/clear_playback_states_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <Preference\n            android:key=\"@string/clear_search_history_key\"\n            android:summary=\"@string/clear_search_history_summary\"\n            android:title=\"@string/clear_search_history_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <Preference\n            android:key=\"@string/clear_cookie_key\"\n            android:summary=\"@string/clear_cookie_summary\"\n            android:title=\"@string/clear_cookie_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n    </PreferenceCategory>\n\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/main_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:key=\"general_preferences\"\n    android:title=\"@string/settings\">\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.VideoAudioSettingsFragment\"\n        android:icon=\"@drawable/ic_headset\"\n        android:title=\"@string/settings_category_video_audio_title\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.DownloadSettingsFragment\"\n        android:icon=\"@drawable/ic_file_download\"\n        android:title=\"@string/settings_category_downloads_title\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.AppearanceSettingsFragment\"\n        android:icon=\"@drawable/ic_palette\"\n        android:title=\"@string/settings_category_appearance_title\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.HistorySettingsFragment\"\n        android:icon=\"@drawable/ic_history\"\n        android:title=\"@string/settings_category_history_title\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.ContentSettingsFragment\"\n        android:icon=\"@drawable/ic_language\"\n        android:title=\"@string/content\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.NotificationsSettingsFragment\"\n        android:icon=\"@drawable/ic_notifications\"\n        android:title=\"@string/notifications\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.UpdateSettingsFragment\"\n        android:icon=\"@drawable/ic_cloud_download\"\n        android:key=\"update_pref_screen_key\"\n        android:title=\"@string/settings_category_updates_title\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.BackupRestoreSettingsFragment\"\n        android:icon=\"@drawable/ic_settings_backup_restore\"\n        android:title=\"@string/settings_category_backup_restore_title\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.DebugSettingsFragment\"\n        android:icon=\"@drawable/ic_bug_report\"\n        android:key=\"@string/debug_pref_screen_key\"\n        android:title=\"@string/settings_category_debug_title\"\n        app:iconSpaceReserved=\"false\" />\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/notifications_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\txmlns:app=\"http://schemas.android.com/apk/res-auto\"\n\tandroid:key=\"general_preferences\"\n\tandroid:title=\"@string/notifications\">\n\n\t<PreferenceScreen\n\t\tandroid:key=\"@string/player_notification_screen_key\"\n\t\tandroid:fragment=\"org.schabi.newpipe.settings.PlayerNotificationSettingsFragment\"\n\t\tandroid:summary=\"@string/settings_category_player_notification_summary\"\n\t\tandroid:title=\"@string/settings_category_player_notification_title\"\n\t\tapp:singleLineTitle=\"false\"\n\t\tapp:iconSpaceReserved=\"false\" />\n\n\t<SwitchPreference\n\t\tandroid:defaultValue=\"false\"\n\t\tandroid:key=\"@string/enable_streams_notifications\"\n\t\tandroid:summary=\"@string/enable_streams_notifications_summary\"\n\t\tandroid:title=\"@string/enable_streams_notifications_title\"\n\t\tapp:singleLineTitle=\"false\"\n\t\tapp:iconSpaceReserved=\"false\" />\n\n\t<org.schabi.newpipe.settings.custom.DurationListPreference\n\t\tandroid:defaultValue=\"@string/streams_notifications_interval_default\"\n\t\tandroid:dependency=\"@string/enable_streams_notifications\"\n\t\tandroid:entries=\"@array/streams_notifications_interval_description\"\n\t\tandroid:entryValues=\"@array/streams_notifications_interval_values\"\n\t\tandroid:key=\"@string/streams_notifications_interval_key\"\n\t\tandroid:title=\"@string/streams_notifications_interval_title\"\n\t\tapp:singleLineTitle=\"false\"\n\t\tapp:iconSpaceReserved=\"false\"\n\t\tapp:useSimpleSummaryProvider=\"true\" />\n\n\t<ListPreference\n\t\tandroid:defaultValue=\"@string/streams_notifications_network_default\"\n\t\tandroid:dependency=\"@string/enable_streams_notifications\"\n\t\tandroid:entries=\"@array/streams_notifications_network_description\"\n\t\tandroid:entryValues=\"@array/streams_notifications_network_values\"\n\t\tandroid:key=\"@string/streams_notifications_network_key\"\n\t\tandroid:title=\"@string/streams_notifications_network_title\"\n\t\tapp:singleLineTitle=\"false\"\n\t\tapp:iconSpaceReserved=\"false\"\n\t\tapp:useSimpleSummaryProvider=\"true\" />\n\n\t<Preference\n\t\tandroid:fragment=\"org.schabi.newpipe.settings.notifications.NotificationModeConfigFragment\"\n\t\tandroid:dependency=\"@string/enable_streams_notifications\"\n\t\tandroid:key=\"@string/streams_notifications_channels_key\"\n\t\tandroid:title=\"@string/channels\"\n\t\tapp:singleLineTitle=\"false\"\n\t\tapp:iconSpaceReserved=\"false\" />\n\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/player_notification_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:title=\"@string/settings_category_player_notification_title\">\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/scale_to_square_image_in_notifications_key\"\n        android:summary=\"@string/notification_scale_to_square_image_summary\"\n        android:title=\"@string/notification_scale_to_square_image_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/notification_colorize_key\"\n        android:summary=\"@string/notification_colorize_summary\"\n        android:title=\"@string/notification_colorize_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/show_thumbnail_key\"\n        android:title=\"@string/show_thumbnail_title\"\n        android:summary=\"@string/show_thumbnail_summary\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceCategory\n        android:layout=\"@layout/settings_category_header_layout\"\n        app:iconSpaceReserved=\"false\">\n\n        <org.schabi.newpipe.settings.custom.NotificationActionsPreference />\n    </PreferenceCategory>\n\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/update_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:title=\"@string/settings_category_updates_title\">\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/update_app_key\"\n        android:summary=\"@string/updates_setting_description\"\n        android:title=\"@string/updates_setting_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <Preference\n        android:key=\"@string/manual_update_key\"\n        android:summary=\"@string/manual_update_description\"\n        android:title=\"@string/manual_update_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/main/res/xml/video_audio_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:title=\"@string/settings_category_video_audio_title\">\n\n    <ListPreference\n        android:defaultValue=\"@string/default_resolution_value\"\n        android:entries=\"@array/resolution_list_description\"\n        android:entryValues=\"@array/resolution_list_values\"\n        android:key=\"@string/default_resolution_key\"\n        android:title=\"@string/default_resolution_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/default_popup_resolution_value\"\n        android:entries=\"@array/resolution_list_description\"\n        android:entryValues=\"@array/resolution_list_values\"\n        android:key=\"@string/default_popup_resolution_key\"\n        android:title=\"@string/default_popup_resolution_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/limit_mobile_data_usage_value\"\n        android:entries=\"@array/limit_data_usage_description_list\"\n        android:entryValues=\"@array/limit_data_usage_values_list\"\n        android:key=\"@string/limit_mobile_data_usage_key\"\n        android:title=\"@string/limit_mobile_data_usage_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/show_higher_resolutions_key\"\n        android:summary=\"@string/show_higher_resolutions_summary\"\n        android:title=\"@string/show_higher_resolutions_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/default_video_format_value\"\n        android:entries=\"@array/video_format_description_list\"\n        android:entryValues=\"@array/video_format_values_list\"\n        android:key=\"@string/default_video_format_key\"\n        android:title=\"@string/default_video_format_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <ListPreference\n        android:defaultValue=\"@string/default_audio_format_value\"\n        android:entries=\"@array/audio_format_description_list\"\n        android:entryValues=\"@array/audio_format_values_list\"\n        android:key=\"@string/default_audio_format_key\"\n        android:title=\"@string/default_audio_format_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"\n        app:useSimpleSummaryProvider=\"true\" />\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"true\"\n        android:key=\"@string/prefer_original_audio_key\"\n        android:summary=\"@string/prefer_original_audio_summary\"\n        android:title=\"@string/prefer_original_audio_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"/>\n\n    <SwitchPreferenceCompat\n        android:defaultValue=\"false\"\n        android:key=\"@string/prefer_descriptive_audio_key\"\n        android:summary=\"@string/prefer_descriptive_audio_summary\"\n        android:title=\"@string/prefer_descriptive_audio_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\"/>\n\n    <PreferenceScreen\n        android:fragment=\"org.schabi.newpipe.settings.ExoPlayerSettingsFragment\"\n        android:key=\"@string/exoplayer_settings_key\"\n        android:summary=\"@string/settings_category_exoplayer_summary\"\n        android:title=\"@string/settings_category_exoplayer_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\" />\n\n    <PreferenceCategory\n        android:layout=\"@layout/settings_category_header_layout\"\n        android:title=\"@string/settings_category_player_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\">\n\n        <SwitchPreferenceCompat\n            android:defaultValue=\"false\"\n            android:key=\"@string/use_external_video_player_key\"\n            android:summary=\"@string/use_external_video_player_summary\"\n            android:title=\"@string/use_external_video_player_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <SwitchPreferenceCompat\n            android:defaultValue=\"false\"\n            android:key=\"@string/use_external_audio_player_key\"\n            android:title=\"@string/use_external_audio_player_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <SwitchPreferenceCompat\n            android:defaultValue=\"false\"\n            android:key=\"@string/show_play_with_kodi_key\"\n            android:summary=\"@string/show_play_with_kodi_summary\"\n            android:title=\"@string/show_play_with_kodi_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <ListPreference\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:defaultValue=\"seekbar_preview_thumbnail_high_quality\"\n            android:entries=\"@array/seekbar_preview_thumbnail_type_description\"\n            android:entryValues=\"@array/seekbar_preview_thumbnail_type_key\"\n            android:key=\"@string/seekbar_preview_thumbnail_key\"\n            android:title=\"@string/seekbar_preview_thumbnail_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\"\n            app:useSimpleSummaryProvider=\"true\" />\n\n    </PreferenceCategory>\n\n    <PreferenceCategory\n        android:layout=\"@layout/settings_category_header_layout\"\n        android:title=\"@string/settings_category_player_behavior_title\"\n        app:singleLineTitle=\"false\"\n        app:iconSpaceReserved=\"false\">\n\n        <ListPreference\n            android:defaultValue=\"@string/preferred_open_action_default\"\n            android:entries=\"@array/preferred_open_action_description_list\"\n            android:entryValues=\"@array/preferred_open_action_values_list\"\n            android:key=\"@string/preferred_open_action_key\"\n            android:summary=\"@string/preferred_open_action_settings_summary\"\n            android:title=\"@string/preferred_open_action_settings_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <ListPreference\n            android:defaultValue=\"@string/minimize_on_exit_value\"\n            android:entries=\"@array/minimize_on_exit_action_description\"\n            android:entryValues=\"@array/minimize_on_exit_action_key\"\n            android:key=\"@string/minimize_on_exit_key\"\n            android:summary=\"@string/minimize_on_exit_summary\"\n            android:title=\"@string/minimize_on_exit_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <SwitchPreferenceCompat\n            android:defaultValue=\"false\"\n            android:key=\"@string/start_main_player_fullscreen_key\"\n            android:summary=\"@string/start_main_player_fullscreen_summary\"\n            android:title=\"@string/start_main_player_fullscreen_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <ListPreference\n            android:defaultValue=\"@string/autoplay_value\"\n            android:entries=\"@array/autoplay_type_description\"\n            android:entryValues=\"@array/autoplay_type_key\"\n            android:key=\"@string/autoplay_key\"\n            android:summary=\"@string/autoplay_summary\"\n            android:title=\"@string/autoplay_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <SwitchPreferenceCompat\n            android:defaultValue=\"false\"\n            android:key=\"@string/auto_queue_key\"\n            android:summary=\"@string/auto_queue_summary\"\n            android:title=\"@string/auto_queue_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <SwitchPreferenceCompat\n            android:defaultValue=\"false\"\n            android:key=\"@string/resume_on_audio_focus_gain_key\"\n            android:summary=\"@string/resume_on_audio_focus_gain_summary\"\n            android:title=\"@string/resume_on_audio_focus_gain_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <ListPreference\n            android:defaultValue=\"@string/default_left_gesture_control_value\"\n            android:entries=\"@array/left_gesture_control_description\"\n            android:entryValues=\"@array/left_gesture_control_values\"\n            android:key=\"@string/left_gesture_control_key\"\n            android:summary=\"@string/left_gesture_control_summary\"\n            android:title=\"@string/left_gesture_control_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <ListPreference\n            android:defaultValue=\"@string/default_right_gesture_control_value\"\n            android:entries=\"@array/right_gesture_control_description\"\n            android:entryValues=\"@array/right_gesture_control_values\"\n            android:key=\"@string/right_gesture_control_key\"\n            android:summary=\"@string/right_gesture_control_summary\"\n            android:title=\"@string/right_gesture_control_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <SwitchPreferenceCompat\n            android:defaultValue=\"true\"\n            android:key=\"@string/popup_remember_size_pos_key\"\n            android:summary=\"@string/popup_remember_size_pos_summary\"\n            android:title=\"@string/popup_remember_size_pos_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <SwitchPreferenceCompat\n            android:defaultValue=\"false\"\n            android:key=\"@string/use_inexact_seek_key\"\n            android:summary=\"@string/use_inexact_seek_summary\"\n            android:title=\"@string/use_inexact_seek_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <ListPreference\n            android:defaultValue=\"@string/seek_duration_default_value\"\n            android:entries=\"@array/seek_duration_description\"\n            android:entryValues=\"@array/seek_duration_value\"\n            android:key=\"@string/seek_duration_key\"\n            android:title=\"@string/seek_duration_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\"\n            app:useSimpleSummaryProvider=\"true\" />\n\n        <SwitchPreferenceCompat\n            android:defaultValue=\"false\"\n            android:key=\"@string/clear_queue_confirmation_key\"\n            android:summary=\"@string/clear_queue_confirmation_summary\"\n            android:title=\"@string/clear_queue_confirmation_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n\n        <SwitchPreferenceCompat\n            android:defaultValue=\"false\"\n            android:key=\"@string/ignore_hardware_media_buttons_key\"\n            android:summary=\"@string/ignore_hardware_media_buttons_summary\"\n            android:title=\"@string/ignore_hardware_media_buttons_title\"\n            app:singleLineTitle=\"false\"\n            app:iconSpaceReserved=\"false\" />\n    </PreferenceCategory>\n</PreferenceScreen>\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/NewVersionManagerTest.kt",
    "content": "package org.schabi.newpipe\n\nimport java.time.Instant\nimport java.time.ZoneId\nimport java.time.format.DateTimeFormatter\nimport kotlin.math.abs\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\nimport org.schabi.newpipe.util.ReleaseVersionUtil.coerceUpdateCheckExpiry\nimport org.schabi.newpipe.util.ReleaseVersionUtil.isLastUpdateCheckExpired\n\nclass NewVersionManagerTest {\n\n    @Test\n    fun `Expiry is reached`() {\n        val oneHourEarlier = Instant.now().atZone(ZoneId.of(\"GMT\")).minusHours(1)\n\n        val expired = isLastUpdateCheckExpired(oneHourEarlier.toEpochSecond())\n\n        assertTrue(expired)\n    }\n\n    @Test\n    fun `Expiry is not reached`() {\n        val oneHourLater = Instant.now().atZone(ZoneId.of(\"GMT\")).plusHours(1)\n\n        val expired = isLastUpdateCheckExpired(oneHourLater.toEpochSecond())\n\n        assertFalse(expired)\n    }\n\n    /**\n     * Equal within a range of 5 seconds\n     */\n    private fun assertNearlyEqual(a: Long, b: Long) {\n        assertTrue(abs(a - b) < 5)\n    }\n\n    @Test\n    fun `Expiry must be returned as is because it is inside the acceptable range of 6-72 hours`() {\n        val sixHoursLater = Instant.now().atZone(ZoneId.of(\"GMT\")).plusHours(6)\n\n        val coerced = coerceUpdateCheckExpiry(DateTimeFormatter.RFC_1123_DATE_TIME.format(sixHoursLater))\n\n        assertNearlyEqual(sixHoursLater.toEpochSecond(), coerced)\n    }\n\n    @Test\n    fun `Expiry must be increased to 6 hours if below`() {\n        val tooLow = Instant.now().atZone(ZoneId.of(\"GMT\")).plusHours(5)\n\n        val coerced = coerceUpdateCheckExpiry(DateTimeFormatter.RFC_1123_DATE_TIME.format(tooLow))\n\n        assertNearlyEqual(tooLow.plusHours(1).toEpochSecond(), coerced)\n    }\n\n    @Test\n    fun `Expiry must be decreased to 72 hours if above`() {\n        val tooHigh = Instant.now().atZone(ZoneId.of(\"GMT\")).plusHours(73)\n\n        val coerced = coerceUpdateCheckExpiry(DateTimeFormatter.RFC_1123_DATE_TIME.format(tooHigh))\n\n        assertNearlyEqual(tooHigh.minusHours(1).toEpochSecond(), coerced)\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/database/playlist/PlaylistLocalItemTest.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2022-2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.database.playlist\n\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\nimport org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity\nimport org.schabi.newpipe.local.bookmark.MergedPlaylistManager\n\nclass PlaylistLocalItemTest {\n\n    @Test\n    fun emptyPlaylists() {\n        val localPlaylists = listOf<PlaylistMetadataEntry?>()\n        val remotePlaylists = listOf<PlaylistRemoteEntity?>()\n        val mergedPlaylists = MergedPlaylistManager.merge(localPlaylists, remotePlaylists)\n        assertEquals(0, mergedPlaylists.size)\n    }\n\n    @Test\n    fun onlyLocalPlaylists() {\n        val localPlaylists = listOf<PlaylistMetadataEntry?>(\n            PlaylistMetadataEntry(1, \"name1\", \"\", 0, false, -1, 1),\n            PlaylistMetadataEntry(2, \"name2\", \"\", 1, false, -1, 1),\n            PlaylistMetadataEntry(3, \"name3\", \"\", 3, false, -1, 1)\n        )\n        val remotePlaylists = listOf<PlaylistRemoteEntity?>()\n        val mergedPlaylists = MergedPlaylistManager.merge(localPlaylists, remotePlaylists)\n\n        assertEquals(3, mergedPlaylists.size)\n        assertEquals(0L, mergedPlaylists[0]!!.displayIndex)\n        assertEquals(1L, mergedPlaylists[1]!!.displayIndex)\n        assertEquals(3L, mergedPlaylists[2]!!.displayIndex)\n    }\n\n    @Test\n    fun onlyRemotePlaylists() {\n        val localPlaylists = listOf<PlaylistMetadataEntry?>()\n        val remotePlaylists = listOf<PlaylistRemoteEntity?>(\n            PlaylistRemoteEntity(1, 1, \"name1\", \"url1\", \"\", \"\", 1, 1),\n            PlaylistRemoteEntity(2, 2, \"name2\", \"url2\", \"\", \"\", 2, 1),\n            PlaylistRemoteEntity(3, 3, \"name3\", \"url3\", \"\", \"\", 4, 1)\n        )\n        val mergedPlaylists = MergedPlaylistManager.merge(localPlaylists, remotePlaylists)\n\n        assertEquals(3, mergedPlaylists.size)\n        assertEquals(1L, mergedPlaylists[0]!!.displayIndex)\n        assertEquals(2L, mergedPlaylists[1]!!.displayIndex)\n        assertEquals(4L, mergedPlaylists[2]!!.displayIndex)\n    }\n\n    @Test\n    fun sameIndexWithDifferentName() {\n        val localPlaylists = listOf<PlaylistMetadataEntry?>(\n            PlaylistMetadataEntry(1, \"name1\", \"\", 0, false, -1, 1),\n            PlaylistMetadataEntry(2, \"name2\", \"\", 1, false, -1, 1)\n        )\n        val remotePlaylists = listOf<PlaylistRemoteEntity?>(\n            PlaylistRemoteEntity(1, 1, \"name3\", \"url1\", \"\", \"\", 0, 1),\n            PlaylistRemoteEntity(2, 2, \"name4\", \"url2\", \"\", \"\", 1, 1)\n        )\n        val mergedPlaylists = MergedPlaylistManager.merge(localPlaylists, remotePlaylists)\n\n        assertEquals(4, mergedPlaylists.size)\n        assertTrue(mergedPlaylists[0] is PlaylistMetadataEntry)\n        assertEquals(\"name1\", (mergedPlaylists[0] as PlaylistMetadataEntry).orderingName)\n        assertTrue(mergedPlaylists[1] is PlaylistRemoteEntity)\n        assertEquals(\"name3\", (mergedPlaylists[1] as PlaylistRemoteEntity).orderingName)\n        assertTrue(mergedPlaylists[2] is PlaylistMetadataEntry)\n        assertEquals(\"name2\", (mergedPlaylists[2] as PlaylistMetadataEntry).orderingName)\n        assertTrue(mergedPlaylists[3] is PlaylistRemoteEntity)\n        assertEquals(\"name4\", (mergedPlaylists[3] as PlaylistRemoteEntity).orderingName)\n    }\n\n    @Test\n    fun sameNameWithDifferentIndex() {\n        val localPlaylists = listOf<PlaylistMetadataEntry?>(\n            PlaylistMetadataEntry(1, \"name1\", \"\", 1, false, -1, 1),\n            PlaylistMetadataEntry(2, \"name2\", \"\", 3, false, -1, 1)\n        )\n        val remotePlaylists = listOf<PlaylistRemoteEntity?>(\n            PlaylistRemoteEntity(1, 1, \"name1\", \"url1\", \"\", \"\", 0, 1),\n            PlaylistRemoteEntity(2, 2, \"name2\", \"url2\", \"\", \"\", 2, 1)\n        )\n        val mergedPlaylists = MergedPlaylistManager.merge(localPlaylists, remotePlaylists)\n\n        assertEquals(4, mergedPlaylists.size)\n        assertTrue(mergedPlaylists[0] is PlaylistRemoteEntity)\n        assertEquals(\"name1\", (mergedPlaylists[0] as PlaylistRemoteEntity).orderingName)\n        assertTrue(mergedPlaylists[1] is PlaylistMetadataEntry)\n        assertEquals(\"name1\", (mergedPlaylists[1] as PlaylistMetadataEntry).orderingName)\n        assertTrue(mergedPlaylists[2] is PlaylistRemoteEntity)\n        assertEquals(\"name2\", (mergedPlaylists[2] as PlaylistRemoteEntity).orderingName)\n        assertTrue(mergedPlaylists[3] is PlaylistMetadataEntry)\n        assertEquals(\"name2\", (mergedPlaylists[3] as PlaylistMetadataEntry).orderingName)\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/error/ReCaptchaActivityTest.kt",
    "content": "package org.schabi.newpipe.error\n\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\n\nclass ReCaptchaActivityTest {\n    private fun assertSanitized(expected: String, actual: String?) {\n        assertEquals(expected, ReCaptchaActivity.sanitizeRecaptchaUrl(actual))\n    }\n\n    @Test fun `null, empty or blank url is sanitized correctly`() {\n        assertSanitized(ReCaptchaActivity.YT_URL, null)\n        assertSanitized(ReCaptchaActivity.YT_URL, \"\")\n        assertSanitized(ReCaptchaActivity.YT_URL, \"  \\n \\t \")\n    }\n\n    @Test fun `YouTube url containing pbj=1 is sanitized correctly`() {\n        val sanitizedUrl = \"https://m.youtube.com/results?search_query=test\"\n        assertSanitized(sanitizedUrl, \"https://m.youtube.com/results?search_query=test\")\n        assertSanitized(sanitizedUrl, \"https://m.youtube.com/results?search_query=test&pbj=1&pbj=1\")\n        assertSanitized(sanitizedUrl, \"https://m.youtube.com/results?pbj=1&search_query=test\")\n        assertSanitized(\"pbj://pbj.pbj.pbj/pbj\", \"pbj://pbj.pbj.pbj/pbj?pbj=1\")\n        assertSanitized(\"http://www.host.com/b?p1=7&p2=9\", \"http://www.host.com/b?p1=7&pbj=1&p2=9\")\n        assertSanitized(\"http://www.host.com/a?pbj=0\", \"http://www.host.com/a?pbj=0\")\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/ktx/ThrowableExtensionsTest.kt",
    "content": "package org.schabi.newpipe.ktx\n\nimport java.io.IOException\nimport java.io.InterruptedIOException\nimport java.net.SocketException\nimport javax.net.ssl.SSLException\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\n\nclass ThrowableExtensionsTest {\n    @Test fun `assignable causes`() {\n        assertTrue(Throwable().hasAssignableCause<Throwable>())\n        assertTrue(Exception().hasAssignableCause<Exception>())\n        assertTrue(IOException().hasAssignableCause<Exception>())\n\n        assertTrue(IOException().hasAssignableCause<IOException>())\n        assertTrue(Exception(SocketException()).hasAssignableCause<IOException>())\n        assertTrue(Exception(IllegalStateException()).hasAssignableCause<RuntimeException>())\n        assertTrue(Exception(Exception(IOException())).hasAssignableCause<IOException>())\n        assertTrue(Exception(IllegalStateException(Exception(IOException()))).hasAssignableCause<IOException>())\n        assertTrue(Exception(IllegalStateException(Exception(SocketException()))).hasAssignableCause<IOException>())\n        assertTrue(Exception(IllegalStateException(Exception(SSLException(\"IO\")))).hasAssignableCause<IOException>())\n        assertTrue(Exception(IllegalStateException(Exception(InterruptedIOException()))).hasAssignableCause<IOException>())\n        assertTrue(Exception(IllegalStateException(Exception(InterruptedIOException()))).hasAssignableCause<RuntimeException>())\n\n        assertTrue(IllegalStateException().hasAssignableCause<Throwable>())\n        assertTrue(IllegalStateException().hasAssignableCause<Exception>())\n        assertTrue(Exception(IllegalStateException(Exception(InterruptedIOException()))).hasAssignableCause<InterruptedIOException>())\n    }\n\n    @Test fun `no assignable causes`() {\n        assertFalse(Throwable().hasAssignableCause<Exception>())\n        assertFalse(Exception().hasAssignableCause<IOException>())\n        assertFalse(Exception(IllegalStateException()).hasAssignableCause<IOException>())\n        assertFalse(Exception(NullPointerException()).hasAssignableCause<IOException>())\n        assertFalse(Exception(IllegalStateException(Exception(Exception()))).hasAssignableCause<IOException>())\n        assertFalse(Exception(IllegalStateException(Exception(SocketException()))).hasAssignableCause<InterruptedIOException>())\n        assertFalse(Exception(IllegalStateException(Exception(InterruptedIOException()))).hasAssignableCause<InterruptedException>())\n    }\n\n    @Test fun `exact causes`() {\n        assertTrue(Throwable().hasExactCause<Throwable>())\n        assertTrue(Exception().hasExactCause<Exception>())\n\n        assertTrue(IOException().hasExactCause<IOException>())\n        assertTrue(Exception(SocketException()).hasExactCause<SocketException>())\n        assertTrue(Exception(Exception(IOException())).hasExactCause<IOException>())\n        assertTrue(Exception(IllegalStateException(Exception(IOException()))).hasExactCause<IOException>())\n        assertTrue(Exception(IllegalStateException(Exception(SocketException()))).hasExactCause<SocketException>())\n        assertTrue(Exception(IllegalStateException(Exception(SSLException(\"IO\")))).hasExactCause<SSLException>())\n        assertTrue(Exception(IllegalStateException(Exception(InterruptedIOException()))).hasExactCause<InterruptedIOException>())\n        assertTrue(Exception(IllegalStateException(Exception(InterruptedIOException()))).hasExactCause<IllegalStateException>())\n    }\n\n    @Test fun `no exact causes`() {\n        assertFalse(Throwable().hasExactCause<Exception>())\n        assertFalse(Exception().hasExactCause<Throwable>())\n\n        assertFalse(SocketException().hasExactCause<IOException>())\n        assertFalse(IllegalStateException().hasExactCause<RuntimeException>())\n        assertFalse(Exception(SocketException()).hasExactCause<IOException>())\n        assertFalse(Exception(IllegalStateException(Exception(IOException()))).hasExactCause<RuntimeException>())\n        assertFalse(Exception(IllegalStateException(Exception(SocketException()))).hasExactCause<IOException>())\n        assertFalse(Exception(IllegalStateException(Exception(InterruptedIOException()))).hasExactCause<IOException>())\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/local/playlist/ExportPlaylistTest.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2025 NewPipe contributors <https://newpipe.net>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npackage org.schabi.newpipe.local.playlist\n\nimport android.content.Context\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.mockito.Mockito.mock\nimport org.schabi.newpipe.database.playlist.PlaylistStreamEntry\nimport org.schabi.newpipe.database.stream.model.StreamEntity\nimport org.schabi.newpipe.extractor.stream.StreamType\nimport org.schabi.newpipe.local.playlist.PlayListShareMode.JUST_URLS\nimport org.schabi.newpipe.local.playlist.PlayListShareMode.YOUTUBE_TEMP_PLAYLIST\n\nclass ExportPlaylistTest {\n\n    @Test\n    fun exportAsYouTubeTempPlaylist() {\n        val playlist = asPlaylist(\n            \"https://www.youtube.com/watch?v=10000000000\",\n            \"https://soundcloud.com/cautious-clayofficial/cold-war-2\", // non-Youtube URLs should be ignored\n            \"https://www.youtube.com/watch?v=20000000000\",\n            \"https://www.youtube.com/watch?v=30000000000\"\n        )\n\n        val url = export(YOUTUBE_TEMP_PLAYLIST, playlist, mock(Context::class.java))\n\n        assertEquals(\n            \"https://www.youtube.com/watch_videos?video_ids=\" +\n                \"10000000000,\" +\n                \"20000000000,\" +\n                \"30000000000\",\n            url\n        )\n    }\n\n    @Test\n    fun exportMoreThan50Items() {\n        /*\n         * Playlist has more than 50 items => take the last 50\n         * (YouTube limitation)\n         */\n\n        val playlist = asPlaylist(\n            (10..70).map { id -> \"https://www.youtube.com/watch?v=aaaaaaaaa$id\" } // YouTube video IDs are 11 characters long\n        )\n\n        val url = export(YOUTUBE_TEMP_PLAYLIST, playlist, mock(Context::class.java))\n\n        val videoIDs = (21..70).map { id -> \"aaaaaaaaa$id\" }.joinToString(\",\")\n\n        assertEquals(\n            \"https://www.youtube.com/watch_videos?video_ids=$videoIDs\",\n            url\n        )\n    }\n\n    @Test\n    fun exportJustUrls() {\n        val playlist = asPlaylist(\n            \"https://www.youtube.com/watch?v=10000000000\",\n            \"https://www.youtube.com/watch?v=20000000000\",\n            \"https://www.youtube.com/watch?v=30000000000\"\n        )\n\n        val exported = export(JUST_URLS, playlist, mock(Context::class.java))\n\n        assertEquals(\n            \"\"\"\n            https://www.youtube.com/watch?v=10000000000\n            https://www.youtube.com/watch?v=20000000000\n            https://www.youtube.com/watch?v=30000000000\n            \"\"\".trimIndent(),\n            exported\n        )\n    }\n}\n\nfun asPlaylist(vararg urls: String): List<PlaylistStreamEntry> {\n    return asPlaylist(listOf(*urls))\n}\n\nfun asPlaylist(urls: List<String>): List<PlaylistStreamEntry> {\n    return urls.map { newPlaylistStreamEntry(it) }\n}\n\nfun newPlaylistStreamEntry(url: String): PlaylistStreamEntry {\n    return PlaylistStreamEntry(newStreamEntity(url), 0, 0, 0)\n}\n\nfun newStreamEntity(url: String): StreamEntity {\n    return StreamEntity(\n        0,\n        1,\n        url,\n        \"Title\",\n        StreamType.VIDEO_STREAM,\n        100,\n        \"Uploader\"\n    )\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/local/subscription/FeedGroupIconTest.kt",
    "content": "package org.schabi.newpipe.local.subscription\n\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertTrue\nimport org.junit.Test\n\nclass FeedGroupIconTest {\n    @Test\n    fun `No gaps and repeated ids`() {\n        val usedIds = HashSet<Int>()\n\n        for ((shouldBeId, currentIcon) in FeedGroupIcon.entries.withIndex()) {\n            val added = usedIds.add(currentIcon.id)\n            assertTrue(\"Repeated ids (current item: ${currentIcon.name} - ${currentIcon.id})\", added)\n\n            assertEquals(\n                \"Gap between ids detected (current item: ${currentIcon.name} - ${currentIcon.id} → should be: $shouldBeId)\",\n                shouldBeId,\n                currentIcon.id\n            )\n        }\n    }\n\n    @Test\n    fun `No icons pointing to the same attr`() {\n        val usedIcons = HashSet<Int>()\n\n        for (groupIcon in FeedGroupIcon.entries) {\n            val added = usedIcons.add(groupIcon.drawableResource)\n            assertTrue(\"Repeated icon (current item: ${groupIcon.name} - ${groupIcon.id})\", added)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/local/subscription/services/ImportExportJsonHelperTest.java",
    "content": "package org.schabi.newpipe.local.subscription.services;\n\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\n\nimport org.junit.Test;\nimport org.schabi.newpipe.extractor.subscription.SubscriptionExtractor;\nimport org.schabi.newpipe.local.subscription.workers.ImportExportJsonHelper;\nimport org.schabi.newpipe.local.subscription.workers.SubscriptionItem;\n\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Arrays;\nimport java.util.List;\n\n/**\n * @see ImportExportJsonHelper\n */\npublic class ImportExportJsonHelperTest {\n    @Test\n    public void testEmptySource() throws Exception {\n        final String emptySource =\n                \"{\\\"app_version\\\":\\\"0.11.6\\\",\\\"app_version_int\\\": 47,\\\"subscriptions\\\":[]}\";\n\n        final var items = ImportExportJsonHelper.readFrom(\n                new ByteArrayInputStream(emptySource.getBytes(StandardCharsets.UTF_8)));\n        assertTrue(items.isEmpty());\n    }\n\n    @Test\n    public void testInvalidSource() {\n        final var invalidList = Arrays.asList(\"{}\", \"\", null, \"gibberish\");\n\n        for (final String invalidContent : invalidList) {\n            try {\n                if (invalidContent != null) {\n                    final byte[] bytes = invalidContent.getBytes(StandardCharsets.UTF_8);\n                    ImportExportJsonHelper.readFrom(new ByteArrayInputStream(bytes));\n                } else {\n                    ImportExportJsonHelper.readFrom(null);\n                }\n\n                fail(\"didn't throw exception\");\n            } catch (final Exception e) {\n                final boolean isExpectedException =\n                        e instanceof SubscriptionExtractor.InvalidSourceException;\n                assertTrue(\"\\\"\" + e.getClass().getSimpleName()\n                        + \"\\\" is not the expected exception\", isExpectedException);\n            }\n        }\n    }\n\n    @Test\n    public void ultimateTest() throws Exception {\n        // Read from file\n        final var itemsFromFile = readFromFile();\n\n        // Test writing to an output\n        final String jsonOut = testWriteTo(itemsFromFile);\n\n        // Read again\n        final var itemsSecondRead = readFromWriteTo(jsonOut);\n\n        // Check if both lists have the exact same items\n        if (!itemsFromFile.equals(itemsSecondRead)) {\n            fail(\"The list of items were different from each other\");\n        }\n    }\n\n    private List<SubscriptionItem> readFromFile() throws Exception {\n        final var inputStream = getClass().getClassLoader()\n                .getResourceAsStream(\"import_export_test.json\");\n        final var itemsFromFile = ImportExportJsonHelper.readFrom(inputStream);\n\n        if (itemsFromFile.isEmpty()) {\n            fail(\"ImportExportJsonHelper.readFrom(input) returned a null or empty list\");\n        }\n\n        return itemsFromFile;\n    }\n\n    private String testWriteTo(final List<SubscriptionItem> itemsFromFile) {\n        final var out = new ByteArrayOutputStream();\n        ImportExportJsonHelper.writeTo(itemsFromFile, out);\n        final String jsonOut = out.toString(StandardCharsets.UTF_8);\n\n        if (jsonOut.isEmpty()) {\n            fail(\"JSON returned by writeTo was empty\");\n        }\n\n        return jsonOut;\n    }\n\n    private List<SubscriptionItem> readFromWriteTo(final String jsonOut) throws Exception {\n        final var inputStream = new ByteArrayInputStream(jsonOut.getBytes(StandardCharsets.UTF_8));\n        final var secondReadItems = ImportExportJsonHelper.readFrom(inputStream);\n\n        if (secondReadItems.isEmpty()) {\n            fail(\"second call to readFrom returned an empty list\");\n        }\n\n        return secondReadItems;\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueItemTest.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotEquals;\n\npublic class PlayQueueItemTest {\n\n    public static final String URL = \"MY_URL\";\n\n    @Test\n    public void equalsMustNotBeOverloaded() {\n        final PlayQueueItem a = PlayQueueTest.makeItemWithUrl(URL);\n        final PlayQueueItem b = PlayQueueTest.makeItemWithUrl(URL);\n        assertEquals(a, a);\n        assertNotEquals(a, b); // they should compare different even if they have the same data\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/player/playqueue/PlayQueueTest.java",
    "content": "package org.schabi.newpipe.player.playqueue;\n\nimport org.junit.Before;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\nimport org.schabi.newpipe.extractor.stream.StreamInfoItem;\nimport org.schabi.newpipe.extractor.stream.StreamType;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Objects;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertNull;\nimport static org.junit.Assert.assertSame;\nimport static org.junit.Assert.assertTrue;\nimport static org.mockito.Mockito.doReturn;\nimport static org.mockito.Mockito.spy;\n\n@SuppressWarnings(\"checkstyle:HideUtilityClassConstructor\")\npublic class PlayQueueTest {\n    static PlayQueue makePlayQueue(final int index, final List<PlayQueueItem> streams) {\n        // I tried using Mockito, but it didn't work for some reason\n        return new PlayQueue(index, streams) {\n            @Override\n            public boolean isComplete() {\n                throw new UnsupportedOperationException();\n            }\n\n            @Override\n            public void fetch() {\n                throw new UnsupportedOperationException();\n            }\n        };\n    }\n\n    static PlayQueueItem makeItemWithUrl(final String url) {\n        final StreamInfoItem infoItem = new StreamInfoItem(\n                0, url, \"\", StreamType.VIDEO_STREAM\n        );\n        return new PlayQueueItem(infoItem);\n    }\n\n    public static class SetIndexTests {\n        private static final int SIZE = 5;\n        private PlayQueue nonEmptyQueue;\n        private PlayQueue emptyQueue;\n\n        @Before\n        public void setup() {\n            final List<PlayQueueItem> streams = new ArrayList<>(5);\n            for (int i = 0; i < 5; ++i) {\n                streams.add(makeItemWithUrl(\"URL_\" + i));\n            }\n            nonEmptyQueue = spy(makePlayQueue(0, streams));\n            emptyQueue = spy(makePlayQueue(0, new ArrayList<>()));\n        }\n\n        @Test\n        public void negative() {\n            nonEmptyQueue.setIndex(-5);\n            assertEquals(0, nonEmptyQueue.getIndex());\n\n            emptyQueue.setIndex(-5);\n            assertEquals(0, nonEmptyQueue.getIndex());\n        }\n\n        @Test\n        public void inBounds() {\n            nonEmptyQueue.setIndex(2);\n            assertEquals(2, nonEmptyQueue.getIndex());\n\n            // emptyQueue not tested because 0 isn't technically inBounds\n        }\n\n        @Test\n        public void outOfBoundIsComplete() {\n            doReturn(true).when(nonEmptyQueue).isComplete();\n            nonEmptyQueue.setIndex(7);\n            assertEquals(2, nonEmptyQueue.getIndex());\n\n            doReturn(true).when(emptyQueue).isComplete();\n            emptyQueue.setIndex(2);\n            assertEquals(0, emptyQueue.getIndex());\n        }\n\n        @Test\n        public void outOfBoundsNotComplete() {\n            doReturn(false).when(nonEmptyQueue).isComplete();\n            nonEmptyQueue.setIndex(7);\n            assertEquals(SIZE - 1, nonEmptyQueue.getIndex());\n\n            doReturn(false).when(emptyQueue).isComplete();\n            emptyQueue.setIndex(2);\n            assertEquals(0, emptyQueue.getIndex());\n        }\n\n        @Test\n        public void indexZero() {\n            nonEmptyQueue.setIndex(0);\n            assertEquals(0, nonEmptyQueue.getIndex());\n\n            doReturn(true).when(emptyQueue).isComplete();\n            emptyQueue.setIndex(0);\n            assertEquals(0, emptyQueue.getIndex());\n\n            doReturn(false).when(emptyQueue).isComplete();\n            emptyQueue.setIndex(0);\n            assertEquals(0, emptyQueue.getIndex());\n        }\n\n        @Test\n        public void addToHistory() {\n            nonEmptyQueue.setIndex(0);\n            assertFalse(nonEmptyQueue.previous());\n\n            nonEmptyQueue.setIndex(3);\n            assertTrue(nonEmptyQueue.previous());\n            assertEquals(\"URL_0\", Objects.requireNonNull(nonEmptyQueue.getItem()).getUrl());\n        }\n    }\n\n    public static class GetItemTests {\n        private static List<PlayQueueItem> streams;\n        private PlayQueue queue;\n\n        @BeforeClass\n        public static void init() {\n            streams = new ArrayList<>(Collections.nCopies(5, makeItemWithUrl(\"OTHER_URL\")));\n            streams.set(3, makeItemWithUrl(\"TARGET_URL\"));\n        }\n\n        @Before\n        public void setup() {\n            queue = makePlayQueue(0, streams);\n        }\n\n        @Test\n        public void inBounds() {\n            assertEquals(\"TARGET_URL\", Objects.requireNonNull(queue.getItem(3)).getUrl());\n            assertEquals(\"OTHER_URL\", Objects.requireNonNull(queue.getItem(1)).getUrl());\n        }\n\n        @Test\n        public void outOfBounds() {\n            assertNull(queue.getItem(-1));\n            assertNull(queue.getItem(5));\n        }\n\n        @Test\n        public void itemsAreNotCloned() {\n            final PlayQueueItem item = makeItemWithUrl(\"A url\");\n            final PlayQueue playQueue = makePlayQueue(0, List.of(item));\n\n            // make sure that items are not cloned when added to the queue\n            assertSame(playQueue.getItem(), item);\n        }\n    }\n\n    public static class EqualsTests {\n        private final PlayQueueItem item1 = makeItemWithUrl(\"URL_1\");\n        private final PlayQueueItem item2 = makeItemWithUrl(\"URL_2\");\n\n        @Test\n        public void sameStreams() {\n            final List<PlayQueueItem> streams = Collections.nCopies(5, item1);\n            final PlayQueue queue1 = makePlayQueue(0, streams);\n            final PlayQueue queue2 = makePlayQueue(0, streams);\n            assertTrue(queue1.equalStreams(queue2));\n            assertTrue(queue1.equalStreamsAndIndex(queue2));\n        }\n\n        @Test\n        public void sameStreamsDifferentIndex() {\n            final List<PlayQueueItem> streams = Collections.nCopies(5, item1);\n            final PlayQueue queue1 = makePlayQueue(1, streams);\n            final PlayQueue queue2 = makePlayQueue(4, streams);\n            assertTrue(queue1.equalStreams(queue2));\n            assertFalse(queue1.equalStreamsAndIndex(queue2));\n        }\n\n        @Test\n        public void sameSizeDifferentItems() {\n            final List<PlayQueueItem> streams1 = Collections.nCopies(5, item1);\n            final List<PlayQueueItem> streams2 = Collections.nCopies(5, item2);\n            final PlayQueue queue1 = makePlayQueue(0, streams1);\n            final PlayQueue queue2 = makePlayQueue(0, streams2);\n            assertFalse(queue1.equalStreams(queue2));\n        }\n\n        @Test\n        public void differentSizeStreams() {\n            final List<PlayQueueItem> streams1 = Collections.nCopies(5, item1);\n            final List<PlayQueueItem> streams2 = Collections.nCopies(6, item2);\n            final PlayQueue queue1 = makePlayQueue(0, streams1);\n            final PlayQueue queue2 = makePlayQueue(0, streams2);\n            assertFalse(queue1.equalStreams(queue2));\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/settings/ImportAllCombinationsTest.kt",
    "content": "package org.schabi.newpipe.settings\n\nimport android.content.SharedPreferences\nimport java.io.File\nimport java.io.IOException\nimport kotlin.io.path.createTempFile\nimport kotlin.io.path.exists\nimport kotlin.io.path.fileSize\nimport org.junit.Assert\nimport org.junit.Test\nimport org.mockito.Mockito\nimport org.schabi.newpipe.settings.export.BackupFileLocator\nimport org.schabi.newpipe.settings.export.ImportExportManager\nimport org.schabi.newpipe.streams.io.StoredFileHelper\nimport us.shandian.giga.io.FileStream\n\nclass ImportAllCombinationsTest {\n\n    companion object {\n        private val classloader = ImportExportManager::class.java.classLoader!!\n    }\n\n    private enum class Ser(val id: String) {\n        YES(\"ser\"),\n        VULNERABLE(\"vulnser\"),\n        NO(\"noser\")\n    }\n\n    private data class FailData(\n        val containsDb: Boolean,\n        val containsSer: Ser,\n        val containsJson: Boolean,\n        val filename: String,\n        val throwable: Throwable\n    )\n\n    private fun testZipCombination(\n        containsDb: Boolean,\n        containsSer: Ser,\n        containsJson: Boolean,\n        filename: String,\n        runTest: (test: () -> Unit) -> Unit\n    ) {\n        val zipFile = File(classloader.getResource(filename)?.file!!)\n        val zip = Mockito.mock(StoredFileHelper::class.java, Mockito.withSettings().stubOnly())\n        Mockito.`when`(zip.stream).then { FileStream(zipFile) }\n\n        val fileLocator = Mockito.mock(\n            BackupFileLocator::class.java,\n            Mockito.withSettings().stubOnly()\n        )\n        val db = createTempFile(\"newpipe_\", \"\")\n        val dbJournal = createTempFile(\"newpipe_\", \"\")\n        val dbWal = createTempFile(\"newpipe_\", \"\")\n        val dbShm = createTempFile(\"newpipe_\", \"\")\n        Mockito.`when`(fileLocator.db).thenReturn(db)\n        Mockito.`when`(fileLocator.dbJournal).thenReturn(dbJournal)\n        Mockito.`when`(fileLocator.dbShm).thenReturn(dbShm)\n        Mockito.`when`(fileLocator.dbWal).thenReturn(dbWal)\n\n        if (containsDb) {\n            runTest {\n                Assert.assertTrue(ImportExportManager(fileLocator).extractDb(zip))\n                Assert.assertFalse(dbJournal.exists())\n                Assert.assertFalse(dbWal.exists())\n                Assert.assertFalse(dbShm.exists())\n                Assert.assertTrue(\"database file size is zero\", db.fileSize() > 0)\n            }\n        } else {\n            runTest {\n                Assert.assertFalse(ImportExportManager(fileLocator).extractDb(zip))\n                Assert.assertTrue(dbJournal.exists())\n                Assert.assertTrue(dbWal.exists())\n                Assert.assertTrue(dbShm.exists())\n                Assert.assertEquals(0, db.fileSize())\n            }\n        }\n\n        val preferences = Mockito.mock(SharedPreferences::class.java, Mockito.withSettings().stubOnly())\n        var editor = Mockito.mock(SharedPreferences.Editor::class.java)\n        Mockito.`when`(preferences.edit()).thenReturn(editor)\n        Mockito.`when`(editor.commit()).thenReturn(true)\n\n        when (containsSer) {\n            Ser.YES -> runTest {\n                Assert.assertTrue(ImportExportManager(fileLocator).exportHasSerializedPrefs(zip))\n                ImportExportManager(fileLocator).loadSerializedPrefs(zip, preferences)\n\n                Mockito.verify(editor, Mockito.times(1)).clear()\n                Mockito.verify(editor, Mockito.times(1)).commit()\n                Mockito.verify(editor, Mockito.atLeastOnce())\n                    .putBoolean(Mockito.anyString(), Mockito.anyBoolean())\n                Mockito.verify(editor, Mockito.atLeastOnce())\n                    .putString(Mockito.anyString(), Mockito.anyString())\n                Mockito.verify(editor, Mockito.atLeastOnce())\n                    .putInt(Mockito.anyString(), Mockito.anyInt())\n            }\n\n            Ser.VULNERABLE -> runTest {\n                Assert.assertTrue(ImportExportManager(fileLocator).exportHasSerializedPrefs(zip))\n                Assert.assertThrows(ClassNotFoundException::class.java) {\n                    ImportExportManager(fileLocator).loadSerializedPrefs(zip, preferences)\n                }\n\n                Mockito.verify(editor, Mockito.never()).clear()\n                Mockito.verify(editor, Mockito.never()).commit()\n            }\n\n            Ser.NO -> runTest {\n                Assert.assertFalse(ImportExportManager(fileLocator).exportHasSerializedPrefs(zip))\n                Assert.assertThrows(IOException::class.java) {\n                    ImportExportManager(fileLocator).loadSerializedPrefs(zip, preferences)\n                }\n\n                Mockito.verify(editor, Mockito.never()).clear()\n                Mockito.verify(editor, Mockito.never()).commit()\n            }\n        }\n\n        // recreate editor mock so verify() behaves correctly\n        editor = Mockito.mock(SharedPreferences.Editor::class.java)\n        Mockito.`when`(preferences.edit()).thenReturn(editor)\n        Mockito.`when`(editor.commit()).thenReturn(true)\n\n        if (containsJson) {\n            runTest {\n                Assert.assertTrue(ImportExportManager(fileLocator).exportHasJsonPrefs(zip))\n                ImportExportManager(fileLocator).loadJsonPrefs(zip, preferences)\n\n                Mockito.verify(editor, Mockito.times(1)).clear()\n                Mockito.verify(editor, Mockito.times(1)).commit()\n                Mockito.verify(editor, Mockito.atLeastOnce())\n                    .putBoolean(Mockito.anyString(), Mockito.anyBoolean())\n                Mockito.verify(editor, Mockito.atLeastOnce())\n                    .putString(Mockito.anyString(), Mockito.anyString())\n                Mockito.verify(editor, Mockito.atLeastOnce())\n                    .putInt(Mockito.anyString(), Mockito.anyInt())\n            }\n        } else {\n            runTest {\n                Assert.assertFalse(ImportExportManager(fileLocator).exportHasJsonPrefs(zip))\n                Assert.assertThrows(IOException::class.java) {\n                    ImportExportManager(fileLocator).loadJsonPrefs(zip, preferences)\n                }\n\n                Mockito.verify(editor, Mockito.never()).clear()\n                Mockito.verify(editor, Mockito.never()).commit()\n            }\n        }\n    }\n\n    @Test\n    fun `Importing all possible combinations of zip files`() {\n        val failedAssertions = mutableListOf<FailData>()\n        for (containsDb in listOf(true, false)) {\n            for (containsSer in Ser.entries) {\n                for (containsJson in listOf(true, false)) {\n                    val filename = \"settings/${if (containsDb) \"db\" else \"nodb\"}_${\n                        containsSer.id}_${if (containsJson) \"json\" else \"nojson\"}.zip\"\n                    testZipCombination(containsDb, containsSer, containsJson, filename) { test ->\n                        try {\n                            test()\n                        } catch (e: Throwable) {\n                            failedAssertions.add(\n                                FailData(\n                                    containsDb,\n                                    containsSer,\n                                    containsJson,\n                                    filename,\n                                    e\n                                )\n                            )\n                        }\n                    }\n                }\n            }\n        }\n\n        if (failedAssertions.isNotEmpty()) {\n            for (a in failedAssertions) {\n                println(\n                    \"Assertion failed with containsDb=${a.containsDb}, containsSer=${\n                        a.containsSer}, containsJson=${a.containsJson}, filename=${a.filename}:\"\n                )\n                a.throwable.printStackTrace()\n                println()\n            }\n            Assert.fail(\"${failedAssertions.size} assertions failed\")\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/settings/ImportExportManagerTest.kt",
    "content": "package org.schabi.newpipe.settings\n\nimport android.content.SharedPreferences\nimport com.grack.nanojson.JsonParser\nimport java.io.File\nimport java.io.ObjectInputStream\nimport java.nio.file.Paths\nimport java.util.zip.ZipFile\nimport kotlin.io.path.createTempDirectory\nimport kotlin.io.path.createTempFile\nimport kotlin.io.path.deleteIfExists\nimport kotlin.io.path.div\nimport kotlin.io.path.exists\nimport kotlin.io.path.fileSize\nimport kotlin.io.path.inputStream\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertFalse\nimport org.junit.Assert.assertThrows\nimport org.junit.Assert.assertTrue\nimport org.junit.Assume\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport org.mockito.Mockito\nimport org.mockito.Mockito.anyBoolean\nimport org.mockito.Mockito.anyInt\nimport org.mockito.Mockito.anyString\nimport org.mockito.Mockito.atLeastOnce\nimport org.mockito.Mockito.verify\nimport org.mockito.Mockito.`when`\nimport org.mockito.Mockito.withSettings\nimport org.mockito.junit.MockitoJUnitRunner\nimport org.schabi.newpipe.settings.export.BackupFileLocator\nimport org.schabi.newpipe.settings.export.ImportExportManager\nimport org.schabi.newpipe.streams.io.StoredFileHelper\nimport us.shandian.giga.io.FileStream\n\n@RunWith(MockitoJUnitRunner::class)\nclass ImportExportManagerTest {\n\n    companion object {\n        private val classloader = ImportExportManager::class.java.classLoader!!\n    }\n\n    private lateinit var fileLocator: BackupFileLocator\n    private lateinit var storedFileHelper: StoredFileHelper\n\n    @Before\n    fun setupFileLocator() {\n        fileLocator = Mockito.mock(BackupFileLocator::class.java, withSettings().stubOnly())\n        storedFileHelper = Mockito.mock(StoredFileHelper::class.java, withSettings().stubOnly())\n    }\n\n    @Test\n    fun `The settings must be exported successfully in the correct format`() {\n        val db = Paths.get(classloader.getResource(\"settings/newpipe.db\")!!.toURI())\n        `when`(fileLocator.db).thenReturn(db)\n\n        val expectedPreferences = mapOf(\"such pref\" to \"much wow\")\n        val sharedPreferences =\n            Mockito.mock(SharedPreferences::class.java, withSettings().stubOnly())\n        `when`(sharedPreferences.all).thenReturn(expectedPreferences)\n\n        val output = File.createTempFile(\"newpipe_\", \"\")\n        `when`(storedFileHelper.openAndTruncateStream()).thenReturn(FileStream(output))\n        ImportExportManager(fileLocator).exportDatabase(sharedPreferences, storedFileHelper)\n\n        val zipFile = ZipFile(output)\n        val entries = zipFile.entries().toList()\n        assertEquals(3, entries.size)\n\n        zipFile.getInputStream(entries.first { it.name == \"newpipe.db\" }).use { actual ->\n            db.inputStream().use { expected ->\n                assertEquals(expected.reader().readText(), actual.reader().readText())\n            }\n        }\n\n        zipFile.getInputStream(entries.first { it.name == \"newpipe.settings\" }).use { actual ->\n            val actualPreferences = ObjectInputStream(actual).readObject()\n            assertEquals(expectedPreferences, actualPreferences)\n        }\n\n        zipFile.getInputStream(entries.first { it.name == \"preferences.json\" }).use { actual ->\n            val actualPreferences = JsonParser.`object`().from(actual)\n            assertEquals(expectedPreferences, actualPreferences)\n        }\n    }\n\n    @Test\n    fun `Ensuring db directory existence must work`() {\n        val path = createTempDirectory(\"newpipe_\") / BackupFileLocator.FILE_NAME_DB\n        Assume.assumeTrue(path.parent.deleteIfExists())\n        `when`(fileLocator.db).thenReturn(path)\n\n        ImportExportManager(fileLocator).ensureDbDirectoryExists()\n        assertTrue(path.parent.exists())\n    }\n\n    @Test\n    fun `Ensuring db directory existence must work when the directory already exists`() {\n        val path = createTempDirectory(\"newpipe_\") / BackupFileLocator.FILE_NAME_DB\n        `when`(fileLocator.db).thenReturn(path)\n\n        ImportExportManager(fileLocator).ensureDbDirectoryExists()\n        assertTrue(path.parent.exists())\n    }\n\n    @Test\n    fun `The database must be extracted from the zip file`() {\n        val db = createTempFile(\"newpipe_\", \"\")\n        val dbJournal = createTempFile(\"newpipe_\", \"\")\n        val dbWal = createTempFile(\"newpipe_\", \"\")\n        val dbShm = createTempFile(\"newpipe_\", \"\")\n        `when`(fileLocator.db).thenReturn(db)\n        `when`(fileLocator.dbJournal).thenReturn(dbJournal)\n        `when`(fileLocator.dbShm).thenReturn(dbShm)\n        `when`(fileLocator.dbWal).thenReturn(dbWal)\n\n        val zip = File(classloader.getResource(\"settings/db_ser_json.zip\")?.file!!)\n        `when`(storedFileHelper.stream).thenReturn(FileStream(zip))\n        val success = ImportExportManager(fileLocator).extractDb(storedFileHelper)\n\n        assertTrue(success)\n        assertFalse(dbJournal.exists())\n        assertFalse(dbWal.exists())\n        assertFalse(dbShm.exists())\n        assertTrue(\"database file size is zero\", db.fileSize() > 0)\n    }\n\n    @Test\n    fun `Extracting the database from an empty zip must not work`() {\n        val db = createTempFile(\"newpipe_\", \"\")\n        val dbJournal = createTempFile(\"newpipe_\", \"\")\n        val dbWal = createTempFile(\"newpipe_\", \"\")\n        val dbShm = createTempFile(\"newpipe_\", \"\")\n        `when`(fileLocator.db).thenReturn(db)\n\n        val emptyZip = File(classloader.getResource(\"settings/nodb_noser_nojson.zip\")?.file!!)\n        `when`(storedFileHelper.stream).thenReturn(FileStream(emptyZip))\n        val success = ImportExportManager(fileLocator).extractDb(storedFileHelper)\n\n        assertFalse(success)\n        assertTrue(dbJournal.exists())\n        assertTrue(dbWal.exists())\n        assertTrue(dbShm.exists())\n        assertEquals(0, db.fileSize())\n    }\n\n    @Test\n    fun `Contains setting must return true if a settings file exists in the zip`() {\n        val zip = File(classloader.getResource(\"settings/db_ser_json.zip\")?.file!!)\n        `when`(storedFileHelper.stream).thenReturn(FileStream(zip))\n        assertTrue(ImportExportManager(fileLocator).exportHasSerializedPrefs(storedFileHelper))\n    }\n\n    @Test\n    fun `Contains setting must return false if no settings file exists in the zip`() {\n        val emptyZip = File(classloader.getResource(\"settings/nodb_noser_nojson.zip\")?.file!!)\n        `when`(storedFileHelper.stream).thenReturn(FileStream(emptyZip))\n        assertFalse(ImportExportManager(fileLocator).exportHasSerializedPrefs(storedFileHelper))\n    }\n\n    @Test\n    fun `Preferences must be set from the settings file`() {\n        val zip = File(classloader.getResource(\"settings/db_ser_json.zip\")?.file!!)\n        `when`(storedFileHelper.stream).thenReturn(FileStream(zip))\n\n        val preferences = Mockito.mock(SharedPreferences::class.java, withSettings().stubOnly())\n        val editor = Mockito.mock(SharedPreferences.Editor::class.java)\n        `when`(preferences.edit()).thenReturn(editor)\n        `when`(editor.commit()).thenReturn(true)\n\n        ImportExportManager(fileLocator).loadSerializedPrefs(storedFileHelper, preferences)\n\n        verify(editor, atLeastOnce()).putBoolean(anyString(), anyBoolean())\n        verify(editor, atLeastOnce()).putString(anyString(), anyString())\n        verify(editor, atLeastOnce()).putInt(anyString(), anyInt())\n    }\n\n    @Test\n    fun `Importing preferences with a serialization injected class should fail`() {\n        val emptyZip = File(classloader.getResource(\"settings/db_vulnser_json.zip\")?.file!!)\n        `when`(storedFileHelper.stream).thenReturn(FileStream(emptyZip))\n\n        val preferences = Mockito.mock(SharedPreferences::class.java, withSettings().stubOnly())\n\n        assertThrows(ClassNotFoundException::class.java) {\n            ImportExportManager(fileLocator).loadSerializedPrefs(storedFileHelper, preferences)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/settings/tabs/TabTest.java",
    "content": "package org.schabi.newpipe.settings.tabs;\n\nimport org.junit.Test;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\nimport static org.junit.Assert.assertTrue;\n\npublic class TabTest {\n    @Test\n    public void checkIdDuplication() {\n        final Set<Integer> usedIds = new HashSet<>();\n\n        for (final Tab.Type type : Tab.Type.values()) {\n            final boolean added = usedIds.add(type.getTabId());\n            assertTrue(\"Id was already used: \" + type.getTabId(), added);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/settings/tabs/TabsJsonHelperTest.java",
    "content": "package org.schabi.newpipe.settings.tabs;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\nimport static org.junit.Assert.fail;\nimport static java.util.Objects.requireNonNull;\n\nimport com.grack.nanojson.JsonArray;\nimport com.grack.nanojson.JsonObject;\nimport com.grack.nanojson.JsonParser;\nimport com.grack.nanojson.JsonParserException;\n\nimport org.junit.Test;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\npublic class TabsJsonHelperTest {\n    private static final String JSON_TABS_ARRAY_KEY = \"tabs\";\n    private static final String JSON_TAB_ID_KEY = \"tab_id\";\n\n    @Test\n    public void testEmptyAndNullRead() throws TabsJsonHelper.InvalidJsonException {\n        final List<Tab> defaultTabs = TabsJsonHelper.getDefaultTabs();\n\n        final String emptyTabsJson = \"{\\\"\" + JSON_TABS_ARRAY_KEY + \"\\\":[]}\";\n        List<Tab> items = TabsJsonHelper.getTabsFromJson(emptyTabsJson);\n        assertEquals(items, defaultTabs);\n\n        final String nullSource = null;\n        items = TabsJsonHelper.getTabsFromJson(nullSource);\n        assertEquals(items, defaultTabs);\n    }\n\n    @Test\n    public void testInvalidIdRead() throws TabsJsonHelper.InvalidJsonException {\n        final int blankTabId = Tab.Type.BLANK.getTabId();\n        final String emptyTabsJson = \"{\\\"\" + JSON_TABS_ARRAY_KEY + \"\\\":[\"\n                + \"{\\\"\" + JSON_TAB_ID_KEY + \"\\\":\" + blankTabId + \"},\"\n                + \"{\\\"\" + JSON_TAB_ID_KEY + \"\\\":\" + 12345678 + \"}\" + \"]}\";\n        final List<Tab> items = TabsJsonHelper.getTabsFromJson(emptyTabsJson);\n\n        assertEquals(\"Should ignore the tab with invalid id\", 1, items.size());\n        assertEquals(blankTabId, items.get(0).getTabId());\n    }\n\n    @Test\n    public void testInvalidRead() {\n        final List<String> invalidList = Arrays.asList(\n                \"{\\\"notTabsArray\\\":[]}\",\n                \"{invalidJSON]}\",\n                \"{}\"\n        );\n\n        for (final String invalidContent : invalidList) {\n            try {\n                TabsJsonHelper.getTabsFromJson(invalidContent);\n\n                fail(\"didn't throw exception\");\n            } catch (final Exception e) {\n                final boolean isExpectedException =\n                        e instanceof TabsJsonHelper.InvalidJsonException;\n                assertTrue(\"\\\"\" + e.getClass().getSimpleName()\n                        + \"\\\" is not the expected exception\", isExpectedException);\n            }\n        }\n    }\n\n    @Test\n    public void testEmptyAndNullSave() throws JsonParserException {\n        final List<Tab> emptyList = Collections.emptyList();\n        String returnedJson = TabsJsonHelper.getJsonToSave(emptyList);\n        assertTrue(isTabsArrayEmpty(returnedJson));\n\n        final List<Tab> nullList = null;\n        returnedJson = TabsJsonHelper.getJsonToSave(nullList);\n        assertTrue(isTabsArrayEmpty(returnedJson));\n    }\n\n    private boolean isTabsArrayEmpty(final String returnedJson) throws JsonParserException {\n        final JsonObject jsonObject = JsonParser.object().from(returnedJson);\n        assertTrue(jsonObject.containsKey(JSON_TABS_ARRAY_KEY));\n        return jsonObject.getArray(JSON_TABS_ARRAY_KEY).isEmpty();\n    }\n\n    @Test\n    public void testSaveAndReading() throws JsonParserException {\n        // Saving\n        final Tab.BlankTab blankTab = new Tab.BlankTab();\n        final Tab.DefaultKioskTab defaultKioskTab = new Tab.DefaultKioskTab();\n        final Tab.SubscriptionsTab subscriptionsTab = new Tab.SubscriptionsTab();\n        final Tab.ChannelTab channelTab = new Tab.ChannelTab(\n                666, \"https://example.org\", \"testName\");\n        final Tab.KioskTab kioskTab = new Tab.KioskTab(123, \"trending_key\");\n        final Tab.FeedGroupTab feedGroupTab = new Tab.FeedGroupTab(\n                1L, \"x\", 123);\n\n        final List<Tab> tabs = Arrays.asList(\n                blankTab, defaultKioskTab, subscriptionsTab, channelTab, kioskTab, feedGroupTab);\n        final String returnedJson = TabsJsonHelper.getJsonToSave(tabs);\n\n        // Reading\n        final JsonObject jsonObject = JsonParser.object().from(returnedJson);\n        assertTrue(jsonObject.containsKey(JSON_TABS_ARRAY_KEY));\n        final JsonArray tabsFromArray = jsonObject.getArray(JSON_TABS_ARRAY_KEY);\n\n        assertEquals(tabs.size(), tabsFromArray.size());\n\n        final Tab.BlankTab blankTabFromReturnedJson = requireNonNull((Tab.BlankTab) Tab.from(\n                (JsonObject) tabsFromArray.get(0)));\n        assertEquals(blankTab.getTabId(), blankTabFromReturnedJson.getTabId());\n\n        final Tab.DefaultKioskTab defaultKioskTabFromReturnedJson = requireNonNull(\n                (Tab.DefaultKioskTab) Tab.from((JsonObject) tabsFromArray.get(1)));\n        assertEquals(defaultKioskTab.getTabId(), defaultKioskTabFromReturnedJson.getTabId());\n\n        final Tab.SubscriptionsTab subscriptionsTabFromReturnedJson = requireNonNull(\n                (Tab.SubscriptionsTab) Tab.from((JsonObject) tabsFromArray.get(2)));\n        assertEquals(subscriptionsTab.getTabId(), subscriptionsTabFromReturnedJson.getTabId());\n\n        final Tab.ChannelTab channelTabFromReturnedJson = requireNonNull((Tab.ChannelTab) Tab.from(\n                (JsonObject) tabsFromArray.get(3)));\n        assertEquals(channelTab.getTabId(), channelTabFromReturnedJson.getTabId());\n        assertEquals(channelTab.getChannelServiceId(),\n                channelTabFromReturnedJson.getChannelServiceId());\n        assertEquals(channelTab.getChannelUrl(), channelTabFromReturnedJson.getChannelUrl());\n        assertEquals(channelTab.getChannelName(), channelTabFromReturnedJson.getChannelName());\n\n        final Tab.KioskTab kioskTabFromReturnedJson = requireNonNull((Tab.KioskTab) Tab.from(\n                (JsonObject) tabsFromArray.get(4)));\n        assertEquals(kioskTab.getTabId(), kioskTabFromReturnedJson.getTabId());\n        assertEquals(kioskTab.getKioskServiceId(), kioskTabFromReturnedJson.getKioskServiceId());\n        assertEquals(kioskTab.getKioskId(), kioskTabFromReturnedJson.getKioskId());\n\n        final Tab.FeedGroupTab grpTabFromReturnedJson = requireNonNull(\n                (Tab.FeedGroupTab) Tab.from((JsonObject) tabsFromArray.get(5)\n                ));\n        assertEquals(feedGroupTab.getTabId(), grpTabFromReturnedJson.getTabId());\n        assertEquals(feedGroupTab.getFeedGroupId(), grpTabFromReturnedJson.getFeedGroupId());\n        assertEquals(feedGroupTab.getIconId(), grpTabFromReturnedJson.getIconId());\n        assertEquals(feedGroupTab.getFeedGroupName(), grpTabFromReturnedJson.getFeedGroupName());\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/streams/SrtFromTtmlWriterTest.java",
    "content": "package org.schabi.newpipe.streams;\n\nimport org.junit.Test;\nimport org.jsoup.Jsoup;\nimport org.jsoup.nodes.Document;\nimport org.jsoup.nodes.Element;\nimport org.jsoup.nodes.Node;\nimport org.jsoup.parser.Parser;\nimport java.io.ByteArrayInputStream;\nimport java.lang.reflect.Method;\nimport java.nio.charset.StandardCharsets;\nimport static org.junit.Assert.assertEquals;\n\n/**\n * Unit tests for {@link SrtFromTtmlWriter}.\n *\n * Tests focus on {@code extractText()} and its handling of TTML <p> elements.\n * Note:\n * - Uses reflection to call the private {@code extractText()} method.\n * - Update {@code EXTRACT_TEXT_METHOD} if renamed.\n *\n * ---\n * NOTE ABOUT ENTITIES VS UNICODE ESCAPES\n *\n * - In short:\n *   * UNICODE ESCAPES → used in Java source (e.g. SrtFromTtmlWriter.java)\n *   * ENTITIES → used in TTML strings (this test file)\n *\n * - TTML is an XML-based format. Real TTML subtitles often encode special\n *   characters as XML entities (named or numeric), e.g.:\n *       &amp;    → '&' (\\u0026)\n *       &lt;     → '<' (\\u003C)\n *       &#x9;    → tab (\\u0009)\n *       &#xA;    → line feed (\\u000A)\n *       &#xD;    → carriage return (\\u000D)\n *\n * - Java source code uses **Unicode escapes** (e.g. \"\\u00A0\") which are resolved\n *   at compile time, so they do not represent real XML entities.\n *\n * - Purpose of these tests:\n *   We simulate *real TTML input* as NewPipe receives it — i.e., strings that\n *   still contain encoded XML entities (&#x9;, &#xA;, &#xD;, etc.).\n *   The production code (`decodeXmlEntities()`) must convert these into their\n *   actual Unicode characters before normalization.\n */\npublic class SrtFromTtmlWriterTest {\n    private static final String TTML_WRAPPER_START = \"<tt><body><div>\";\n    private static final String TTML_WRAPPER_END = \"</div></body></tt>\";\n    private static final String EXTRACT_TEXT_METHOD = \"extractText\";\n    // Please keep the same definition from `SrtFromTtmlWriter` class.\n    private static final String NEW_LINE = \"\\r\\n\";\n\n    /*\n     * TTML example for simple paragraph <p> without nested tags.\n     * <p begin=\"00:00:01.000\" end=\"00:00:03.000\" style=\"s2\">Hello World!</p>\n     */\n    private static final String SIMPLE_TTML = \"<p begin=\\\"00:00:01.000\\\" end=\\\"00:00:03.000\\\" \"\n            + \"style=\\\"s2\\\">Hello World!</p>\";\n    /**\n     * TTML example with nested tags with <br>.\n     * <p begin=\"00:00:01.000\" end=\"00:00:03.000\"><span style=\"s4\">Hello</span><br>World!</p>\n     */\n    private static final String NESTED_TTML = \"<p begin=\\\"00:00:01.000\\\" end=\\\"00:00:03.000\\\">\"\n            + \"<span style=\\\"s4\\\">Hello</span><br>World!</p>\";\n\n    /**\n     * TTML example with HTML entities.\n     * &lt; → <, &gt; → >, &amp; → &, &quot; → \", &apos; → '\n     * &#39; → '\n     * &#xA0; → ' '\n     */\n    private static final String ENTITY_TTML = \"<p begin=\\\"00:00:05.000\\\" \"\n            + \"end=\\\"00:00:07.000\\\">\"\n            + \"&lt;tag&gt; &amp; &quot;text&quot;&apos;&apos;&#39;&#39;\"\n            + \"&#xA0;&#xA0;\"\n            + \"</p>\";\n    /**\n     * TTML example with special characters:\n     * - Spaces appear at the beginning and end of the text.\n     * - Spaces are also present within the text (not just at the edges).\n     * - The text includes various HTML entities such as &nbsp;,\n     *   &amp;, &lt;, &gt;, etc.\n     * &nbsp; → non-breaking space (Unicode: '\\u00A0', Entity: '&#xA0;')\n     */\n    private static final String SPECIAL_TTML = \"<p begin=\\\"00:00:05.000\\\" end=\\\"00:00:07.000\\\">\"\n            + \"   ～~-Hello&nbsp;&nbsp;&amp;&amp;&lt;&lt;&gt;&gt;World!!   \"\n            + \"</p>\";\n\n    /**\n     * TTML example with characters: tab.\n     * &#x9; → \\t\n     * They are separated by '+' for clarity.\n     */\n    private static final String TAB_TTML = \"<p begin=\\\"00:00:05.000\\\" \"\n            + \"end=\\\"00:00:07.000\\\">\"\n            + \"&#x9;&#x9;+&#x9;&#x9;+&#x9;&#x9;\"\n            + \"</p>\";\n\n    /**\n     * TTML example with line endings.\n     * &#xD; → \\r\n     */\n    private static final String LINE_ENDING_0_TTML = \"<p begin=\\\"00:00:05.000\\\" \"\n            + \"end=\\\"00:00:07.000\\\">\"\n            + \"&#xD;&#xD;+&#xD;&#xD;+&#xD;&#xD;\"\n            + \"</p>\";\n    // &#xA; → \\n\n    private static final String LINE_ENDING_1_TTML = \"<p begin=\\\"00:00:05.000\\\" \"\n            + \"end=\\\"00:00:07.000\\\">\"\n            + \"&#xA;&#xA;+&#xA;&#xA;+&#xA;&#xA;\"\n            + \"</p>\";\n    private static final String LINE_ENDING_2_TTML =\n            \"<p begin=\\\"00:00:05.000\\\" end=\\\"00:00:07.000\\\">\"\n            + \"&#xD;&#xA;+&#xD;&#xA;+&#xD;&#xA;\"\n            + \"</p>\";\n\n    /**\n     * TTML example with control characters.\n     * For example:\n     * &#x0001; → \\u0001\n     * &#x001F; → \\u001F\n     *\n     * These control characters, if included as raw Unicode(e.g. '\\u0001'),\n     * are either invalid in XML or rendered as '?' when processed.\n     * To avoid issues, they should be encoded(e.g. '&#x0001;') in TTML file.\n     *\n     * - Reference:\n     *   Unicode Basic Latin (https://unicode.org/charts/PDF/U0000.pdf),\n     *   ASCII Control (https://en.wikipedia.org/wiki/ASCII#Control_characters).\n     *   and the defination of these characters can be known.\n     */\n    private static final String CONTROL_CHAR_TTML = \"<p begin=\\\"00:00:05.000\\\" \"\n            + \"end=\\\"00:00:07.000\\\">\"\n            + \"&#x0001;+&#x0008;+&#x000B;+&#x000C;+&#x000E;+&#x001F;\"\n            + \"</p>\";\n\n\n\n    private static final String EMPTY_TTML = \"<p begin=\\\"00:00:01.000\\\" \"\n            + \"end=\\\"00:00:03.000\\\">\"\n            + \"\"\n            + \"</p>\";\n\n    /**\n     * TTML example with Unicode space characters.\n     * These characters are encoded using character references\n     * (&#xXXXX;).\n     *\n     * Includes:\n     * (&#x202F;) '\\u202F' → Narrow no-break space\n     * (&#x205F;) '\\u205F' → Medium mathematical space\n     * (&#x3000;) '\\u3000' → Ideographic space\n     * '\\u2000' ~ '\\u200A' are whitespace characters:\n     * (&#x2000;) '\\u2000' → En quad\n     * (&#x2002;) '\\u2002' → En space\n     * (&#x200A;) '\\u200A' → Hair space\n     *\n     * Each character is separated by '+' for clarity.\n     */\n    private static final String UNICODE_SPACE_TTML = \"<p begin=\\\"00:00:05.000\\\" \"\n            + \"end=\\\"00:00:07.000\\\">\"\n            + \"&#x202F;+&#x205F;+&#x3000;+&#x2000;+&#x2002;+&#x200A;\"\n            + \"</p>\";\n\n    /**\n     * TTML example with non-spacing (invisible) characters.\n     * These are encoded using character references (&#xXXXX;).\n     *\n     * Includes:\n     * (&#x200B;)'\\u200B' → Zero-width space (ZWSP)\n     * (&#x200E;)'\\u200E' → Left-to-right mark (LRM)\n     * (&#x200F;)'\\u200F' → Right-to-left mark (RLM)\n     *\n     * They don't display any characters to the human eye.\n     * '+' is used between them for clarity in test output.\n     */\n    private static final String NON_SPACING_TTML = \"<p begin=\\\"00:00:05.000\\\" \"\n            + \"end=\\\"00:00:07.000\\\">\"\n            + \"&#x200B;+&#x200E;+&#x200F;\"\n            + \"</p>\";\n\n    /**\n     * Parses TTML string into a JSoup Document and selects the first <p> element.\n     *\n     * @param ttmlContent TTML content (e.g., <p>...</p>)\n     * @return the first <p> element\n     * @throws Exception if parsing or reflection fails\n     */\n    private Element parseTtmlParagraph(final String ttmlContent) throws Exception {\n        final String ttml = TTML_WRAPPER_START + ttmlContent + TTML_WRAPPER_END;\n        final Document doc = Jsoup.parse(\n                new ByteArrayInputStream(ttml.getBytes(StandardCharsets.UTF_8)),\n                \"UTF-8\", \"\", Parser.xmlParser());\n        return doc.select(\"body > div > p\").first();\n    }\n\n    /**\n     * Invokes private extractText method via reflection.\n     *\n     * @param writer SrtFromTtmlWriter instance\n     * @param paragraph <p> element to extract text from\n     * @param text StringBuilder to store extracted text\n     * @throws Exception if reflection fails\n     */\n    private void invokeExtractText(final SrtFromTtmlWriter writer, final Element paragraph,\n                                  final StringBuilder text) throws Exception {\n        final Method method = writer.getClass()\n                .getDeclaredMethod(EXTRACT_TEXT_METHOD, Node.class, StringBuilder.class);\n        method.setAccessible(true);\n        method.invoke(writer, paragraph, text);\n    }\n\n    private String extractTextFromTtml(final String ttmlInput) throws Exception {\n        final Element paragraph = parseTtmlParagraph(ttmlInput);\n        final StringBuilder text = new StringBuilder();\n        final SrtFromTtmlWriter writer = new SrtFromTtmlWriter(null, false);\n        invokeExtractText(writer, paragraph, text);\n\n        final String actualText = text.toString();\n        return actualText;\n    }\n\n    @Test\n    public void testExtractTextSimpleParagraph() throws Exception {\n        final String expected = \"Hello World!\";\n        final String actual = extractTextFromTtml(SIMPLE_TTML);\n        assertEquals(expected, actual);\n    }\n\n    @Test\n    public void testExtractTextNestedTags() throws Exception {\n        final String expected = \"Hello\\r\\nWorld!\";\n        final String actual = extractTextFromTtml(NESTED_TTML);\n        assertEquals(expected, actual);\n    }\n\n    @Test\n    public void testExtractTextWithEntity() throws Exception {\n        final String expected = \"<tag> & \\\"text\\\"''''  \";\n        final String actual = extractTextFromTtml(ENTITY_TTML);\n        assertEquals(expected, actual);\n    }\n\n    @Test\n    public void testExtractTextWithSpecialCharacters() throws Exception {\n        final String expected = \"   ～~-Hello  &&<<>>World!!   \";\n        final String actual = extractTextFromTtml(SPECIAL_TTML);\n        assertEquals(expected, actual);\n    }\n\n    @Test\n    public void testExtractTextWithTab() throws Exception {\n        final String expected = \"  +  +  \";\n        final String actual = extractTextFromTtml(TAB_TTML);\n        assertEquals(expected, actual);\n    }\n\n    @Test\n    public void testExtractTextWithLineEnding0() throws Exception {\n        final String expected = NEW_LINE + NEW_LINE + \"+\"\n                                + NEW_LINE + NEW_LINE + \"+\"\n                                + NEW_LINE + NEW_LINE;\n        final String actual = extractTextFromTtml(LINE_ENDING_0_TTML);\n        assertEquals(expected, actual);\n    }\n\n    @Test\n    public void testExtractTextWithLineEnding1() throws Exception {\n        final String expected = NEW_LINE + NEW_LINE + \"+\"\n                                + NEW_LINE + NEW_LINE + \"+\"\n                                + NEW_LINE + NEW_LINE;\n        final String actual = extractTextFromTtml(LINE_ENDING_1_TTML);\n        assertEquals(expected, actual);\n    }\n\n    @Test\n    public void testExtractTextWithLineEnding2() throws Exception {\n        final String expected = NEW_LINE + \"+\"\n                                + NEW_LINE + \"+\"\n                                + NEW_LINE;\n        final String actual = extractTextFromTtml(LINE_ENDING_2_TTML);\n        assertEquals(expected, actual);\n    }\n\n    @Test\n    public void testExtractTextWithControlCharacters() throws Exception {\n        final String expected = \"+++++\";\n        final String actual = extractTextFromTtml(CONTROL_CHAR_TTML);\n        assertEquals(expected, actual);\n    }\n\n    /**\n    * Test case to ensure that extractText() does not throw an exception\n    * when there are no text in the TTML paragraph (i.e., the paragraph\n    * is empty).\n    *\n    * Note:\n    *   In the NewPipe, *.srt files will contain empty text lines by default.\n    */\n    @Test\n    public void testExtractTextWithEmpty() throws Exception {\n        final String expected = \"\";\n        final String actual = extractTextFromTtml(EMPTY_TTML);\n        assertEquals(expected, actual);\n    }\n\n    @Test\n    public void testExtractTextWithUnicodeSpaces() throws Exception {\n        final String expected = \" + + + + + \";\n        final String actual = extractTextFromTtml(UNICODE_SPACE_TTML);\n        assertEquals(expected, actual);\n    }\n\n    @Test\n    public void testExtractTextWithNonSpacingCharacters() throws Exception {\n        final String expected = \"++\";\n        final String actual = extractTextFromTtml(NON_SPACING_TTML);\n        assertEquals(expected, actual);\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/util/ListHelperTest.java",
    "content": "package org.schabi.newpipe.util;\n\nimport org.junit.Test;\nimport org.schabi.newpipe.extractor.MediaFormat;\nimport org.schabi.newpipe.extractor.stream.AudioStream;\nimport org.schabi.newpipe.extractor.stream.AudioTrackType;\nimport org.schabi.newpipe.extractor.stream.VideoStream;\n\nimport java.util.ArrayList;\nimport java.util.Comparator;\nimport java.util.List;\nimport java.util.Locale;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertFalse;\nimport static org.junit.Assert.assertTrue;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\npublic class ListHelperTest {\n    private static final String BEST_RESOLUTION_KEY = \"best_resolution\";\n    private static final List<AudioStream> AUDIO_STREAMS_TEST_LIST = List.of(\n            generateAudioStream(\"m4a-128-1\", MediaFormat.M4A, 128),\n            generateAudioStream(\"webma-192\", MediaFormat.WEBMA, 192),\n            generateAudioStream(\"mp3-64\", MediaFormat.MP3, 64),\n            generateAudioStream(\"webma-192\", MediaFormat.WEBMA, 192),\n            generateAudioStream(\"m4a-128-2\", MediaFormat.M4A, 128),\n            generateAudioStream(\"mp3-128\", MediaFormat.MP3, 128),\n            generateAudioStream(\"webma-64\", MediaFormat.WEBMA, 64),\n            generateAudioStream(\"m4a-320\", MediaFormat.M4A, 320),\n            generateAudioStream(\"mp3-192\", MediaFormat.MP3, 192),\n            generateAudioStream(\"webma-320\", MediaFormat.WEBMA, 320));\n\n    private static final List<AudioStream> AUDIO_TRACKS_TEST_LIST = List.of(\n            generateAudioTrack(\"en.or\", \"en.or\", Locale.ENGLISH, AudioTrackType.ORIGINAL),\n            generateAudioTrack(\"en.du\", \"en.du\", Locale.ENGLISH, AudioTrackType.DUBBED),\n            generateAudioTrack(\"en.ds\", \"en.ds\", Locale.ENGLISH, AudioTrackType.DESCRIPTIVE),\n            generateAudioTrack(\"unknown\", null, null, null),\n            generateAudioTrack(\"de.du\", \"de.du\", Locale.GERMAN, AudioTrackType.DUBBED),\n            generateAudioTrack(\"de.ds\", \"de.ds\", Locale.GERMAN, AudioTrackType.DESCRIPTIVE)\n    );\n\n    private static final List<VideoStream> VIDEO_STREAMS_TEST_LIST = List.of(\n            generateVideoStream(\"mpeg_4-720\", MediaFormat.MPEG_4, \"720p\", false),\n            generateVideoStream(\"v3gpp-240\", MediaFormat.v3GPP, \"240p\", false),\n            generateVideoStream(\"webm-480\", MediaFormat.WEBM, \"480p\", false),\n            generateVideoStream(\"v3gpp-144\", MediaFormat.v3GPP, \"144p\", false),\n            generateVideoStream(\"mpeg_4-360\", MediaFormat.MPEG_4, \"360p\", false),\n            generateVideoStream(\"webm-360\", MediaFormat.WEBM, \"360p\", false));\n\n    private static final List<VideoStream> VIDEO_ONLY_STREAMS_TEST_LIST = List.of(\n            generateVideoStream(\"mpeg_4-720-1\", MediaFormat.MPEG_4, \"720p\", true),\n            generateVideoStream(\"mpeg_4-720-2\", MediaFormat.MPEG_4, \"720p\", true),\n            generateVideoStream(\"mpeg_4-2160\", MediaFormat.MPEG_4, \"2160p\", true),\n            generateVideoStream(\"mpeg_4-1440_60\", MediaFormat.MPEG_4, \"1440p60\", true),\n            generateVideoStream(\"webm-720_60\", MediaFormat.WEBM, \"720p60\", true),\n            generateVideoStream(\"mpeg_4-2160_60\", MediaFormat.MPEG_4, \"2160p60\", true),\n            generateVideoStream(\"mpeg_4-720_60\", MediaFormat.MPEG_4, \"720p60\", true),\n            generateVideoStream(\"mpeg_4-1080\", MediaFormat.MPEG_4, \"1080p\", true),\n            generateVideoStream(\"mpeg_4-1080_60\", MediaFormat.MPEG_4, \"1080p60\", true));\n\n    @Test\n    public void getSortedStreamVideosListTest() {\n        List<VideoStream> result = ListHelper.getSortedStreamVideosList(MediaFormat.MPEG_4, true,\n                VIDEO_STREAMS_TEST_LIST, VIDEO_ONLY_STREAMS_TEST_LIST, true, false);\n\n        List<String> expected = List.of(\"144p\", \"240p\", \"360p\", \"480p\", \"720p\", \"720p60\",\n                \"1080p\", \"1080p60\", \"1440p60\", \"2160p\", \"2160p60\");\n\n        assertEquals(expected.size(), result.size());\n        for (int i = 0; i < result.size(); i++) {\n            assertEquals(result.get(i).getResolution(), expected.get(i));\n            assertEquals(expected.get(i), result.get(i).getResolution());\n        }\n\n        ////////////////////\n        // Reverse Order //\n        //////////////////\n\n        result = ListHelper.getSortedStreamVideosList(MediaFormat.MPEG_4, true,\n                VIDEO_STREAMS_TEST_LIST, VIDEO_ONLY_STREAMS_TEST_LIST, false, false);\n        expected = List.of(\"2160p60\", \"2160p\", \"1440p60\", \"1080p60\", \"1080p\", \"720p60\",\n                \"720p\", \"480p\", \"360p\", \"240p\", \"144p\");\n        assertEquals(expected.size(), result.size());\n        for (int i = 0; i < result.size(); i++) {\n            assertEquals(expected.get(i), result.get(i).getResolution());\n        }\n    }\n\n    @Test\n    public void getSortedStreamVideosListWithPreferVideoOnlyStreamsTest() {\n        List<VideoStream> result = ListHelper.getSortedStreamVideosList(MediaFormat.MPEG_4, true,\n                null, VIDEO_ONLY_STREAMS_TEST_LIST, true, true);\n\n        List<String> expected =\n                List.of(\"720p\", \"720p60\", \"1080p\", \"1080p60\", \"1440p60\", \"2160p\", \"2160p60\");\n\n        assertEquals(expected.size(), result.size());\n        for (int i = 0; i < result.size(); i++) {\n            assertEquals(expected.get(i), result.get(i).getResolution());\n            assertTrue(result.get(i).isVideoOnly());\n        }\n\n        //////////////////////////////////////////////////////////\n        // No video only streams -> should return mixed streams //\n        //////////////////////////////////////////////////////////\n\n        result = ListHelper.getSortedStreamVideosList(MediaFormat.MPEG_4, true,\n                VIDEO_STREAMS_TEST_LIST, null, false, true);\n        expected = List.of(\"720p\", \"480p\", \"360p\", \"240p\", \"144p\");\n        assertEquals(expected.size(), result.size());\n        for (int i = 0; i < result.size(); i++) {\n            assertEquals(expected.get(i), result.get(i).getResolution());\n            assertFalse(result.get(i).isVideoOnly());\n        }\n\n        /////////////////////////////////////////////////////////////////\n        // Both types of  streams -> should return correct one streams //\n        /////////////////////////////////////////////////////////////////\n\n        result = ListHelper.getSortedStreamVideosList(MediaFormat.MPEG_4, true,\n                VIDEO_STREAMS_TEST_LIST, VIDEO_ONLY_STREAMS_TEST_LIST, true, true);\n        expected = List.of(\"144p\", \"240p\", \"360p\", \"480p\", \"720p\", \"720p60\",\n                \"1080p\", \"1080p60\", \"1440p60\", \"2160p\", \"2160p60\");\n        final List<String> expectedVideoOnly =\n                List.of(\"720p\", \"720p60\", \"1080p\", \"1080p60\", \"1440p60\", \"2160p\", \"2160p60\");\n\n        assertEquals(expected.size(), result.size());\n        for (int i = 0; i < result.size(); i++) {\n            assertEquals(expected.get(i), result.get(i).getResolution());\n            assertEquals(expectedVideoOnly.contains(result.get(i).getResolution()),\n                    result.get(i).isVideoOnly());\n        }\n    }\n\n    @Test\n    public void getSortedStreamVideosExceptHighResolutionsTest() {\n        ////////////////////////////////////\n        // Don't show Higher resolutions //\n        //////////////////////////////////\n\n        final List<VideoStream> result = ListHelper.getSortedStreamVideosList(MediaFormat.MPEG_4,\n                false, VIDEO_STREAMS_TEST_LIST, VIDEO_ONLY_STREAMS_TEST_LIST, false, false);\n        final List<String> expected = List.of(\n                \"1080p60\", \"1080p\", \"720p60\", \"720p\", \"480p\", \"360p\", \"240p\", \"144p\");\n        assertEquals(expected.size(), result.size());\n        for (int i = 0; i < result.size(); i++) {\n            assertEquals(expected.get(i), result.get(i).getResolution());\n        }\n    }\n\n    @Test\n    public void getDefaultResolutionTest() {\n        final List<VideoStream> testList = new ArrayList<>(List.of(\n                generateVideoStream(\"mpeg_4-720\", MediaFormat.MPEG_4, \"720p\", false),\n                generateVideoStream(\"v3gpp-240\", MediaFormat.v3GPP, \"240p\", false),\n                generateVideoStream(\"webm-480\",  MediaFormat.WEBM, \"480p\", false),\n                generateVideoStream(\"webm-240\", MediaFormat.WEBM, \"240p\", false),\n                generateVideoStream(\"mpeg_4-240\", MediaFormat.MPEG_4, \"240p\", false),\n                generateVideoStream(\"webm-144\", MediaFormat.WEBM, \"144p\", false),\n                generateVideoStream(\"mpeg_4-360\", MediaFormat.MPEG_4, \"360p\", false),\n                generateVideoStream(\"webm-360\", MediaFormat.WEBM, \"360p\", false)));\n        VideoStream result = testList.get(ListHelper.getDefaultResolutionIndex(\n                \"720p\", BEST_RESOLUTION_KEY, MediaFormat.MPEG_4, testList));\n        assertEquals(\"720p\", result.getResolution());\n        assertEquals(MediaFormat.MPEG_4, result.getFormat());\n\n        // Have resolution and the format\n        result = testList.get(ListHelper.getDefaultResolutionIndex(\n                \"480p\", BEST_RESOLUTION_KEY, MediaFormat.WEBM, testList));\n        assertEquals(\"480p\", result.getResolution());\n        assertEquals(MediaFormat.WEBM, result.getFormat());\n\n        // Have resolution but not the format\n        result = testList.get(ListHelper.getDefaultResolutionIndex(\n                \"480p\", BEST_RESOLUTION_KEY, MediaFormat.MPEG_4, testList));\n        assertEquals(\"480p\", result.getResolution());\n        assertEquals(MediaFormat.WEBM, result.getFormat());\n\n        // Have resolution and the format\n        result = testList.get(ListHelper.getDefaultResolutionIndex(\n                \"240p\", BEST_RESOLUTION_KEY, MediaFormat.WEBM, testList));\n        assertEquals(\"240p\", result.getResolution());\n        assertEquals(MediaFormat.WEBM, result.getFormat());\n\n        // The best resolution\n        result = testList.get(ListHelper.getDefaultResolutionIndex(\n                BEST_RESOLUTION_KEY, BEST_RESOLUTION_KEY, MediaFormat.WEBM, testList));\n        assertEquals(\"720p\", result.getResolution());\n        assertEquals(MediaFormat.MPEG_4, result.getFormat());\n\n        // Doesn't have the 60fps variant and format\n        result = testList.get(ListHelper.getDefaultResolutionIndex(\n                \"720p60\", BEST_RESOLUTION_KEY, MediaFormat.WEBM, testList));\n        assertEquals(\"720p\", result.getResolution());\n        assertEquals(MediaFormat.MPEG_4, result.getFormat());\n\n        // Doesn't have the 60fps variant\n        result = testList.get(ListHelper.getDefaultResolutionIndex(\n                \"480p60\", BEST_RESOLUTION_KEY, MediaFormat.WEBM, testList));\n        assertEquals(\"480p\", result.getResolution());\n        assertEquals(MediaFormat.WEBM, result.getFormat());\n\n        // Doesn't have the resolution, will return the best one\n        result = testList.get(ListHelper.getDefaultResolutionIndex(\n                \"2160p60\", BEST_RESOLUTION_KEY, MediaFormat.WEBM, testList));\n        assertEquals(\"720p\", result.getResolution());\n        assertEquals(MediaFormat.MPEG_4, result.getFormat());\n    }\n\n    @Test\n    public void getHighestQualityAudioFormatTest() {\n        Comparator<AudioStream> cmp = ListHelper.getAudioFormatComparator(MediaFormat.M4A, false);\n        AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank(\n                        AUDIO_STREAMS_TEST_LIST, cmp));\n        assertEquals(320, stream.getAverageBitrate());\n        assertEquals(MediaFormat.M4A, stream.getFormat());\n\n        cmp = ListHelper.getAudioFormatComparator(MediaFormat.WEBMA, false);\n        stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank(\n                AUDIO_STREAMS_TEST_LIST, cmp));\n        assertEquals(320, stream.getAverageBitrate());\n        assertEquals(MediaFormat.WEBMA, stream.getFormat());\n\n        cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, false);\n        stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank(\n                AUDIO_STREAMS_TEST_LIST, cmp));\n        assertEquals(192, stream.getAverageBitrate());\n        assertEquals(MediaFormat.MP3, stream.getFormat());\n    }\n\n    @Test\n    public void getHighestQualityAudioFormatPreferredAbsent() {\n        final Comparator<AudioStream> cmp =\n                ListHelper.getAudioFormatComparator(MediaFormat.MP3, false);\n\n        //////////////////////////////////////////\n        // Doesn't contain the preferred format //\n        ////////////////////////////////////////\n\n        List<AudioStream> testList = List.of(\n                generateAudioStream(\"m4a-128\", MediaFormat.M4A, 128),\n                generateAudioStream(\"webma-192\", MediaFormat.WEBMA, 192));\n        // List doesn't contains this format\n        // It should fallback to the highest bitrate audio no matter what format it is\n        AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp));\n        assertEquals(192, stream.getAverageBitrate());\n        assertEquals(MediaFormat.WEBMA, stream.getFormat());\n\n        ////////////////////////////////////////////////////////\n        // Multiple not-preferred-formats and equal bitrates //\n        //////////////////////////////////////////////////////\n\n        testList = new ArrayList<>(List.of(\n                generateAudioStream(\"webma-192-1\", MediaFormat.WEBMA, 192),\n                generateAudioStream(\"m4a-192-1\", MediaFormat.M4A, 192),\n                generateAudioStream(\"webma-192-2\", MediaFormat.WEBMA, 192),\n                generateAudioStream(\"m4a-192-2\", MediaFormat.M4A, 192),\n                generateAudioStream(\"webma-192-3\", MediaFormat.WEBMA, 192),\n                generateAudioStream(\"m4a-192-3\", MediaFormat.M4A, 192),\n                generateAudioStream(\"webma-192-4\", MediaFormat.WEBMA, 192)));\n        // List doesn't contains this format, it should fallback to the highest bitrate audio and\n        // the highest quality format.\n        stream =\n                testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp));\n        assertEquals(192, stream.getAverageBitrate());\n        assertEquals(MediaFormat.M4A, stream.getFormat());\n\n        // Adding a new format and bitrate. Adding another stream will have no impact since\n        // it's not a preferred format.\n        testList.add(generateAudioStream(\"webma-192-5\", MediaFormat.WEBMA, 192));\n        stream =\n                testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp));\n        assertEquals(192, stream.getAverageBitrate());\n        assertEquals(MediaFormat.M4A, stream.getFormat());\n    }\n\n    @Test\n    public void getHighestQualityAudioNull() {\n        final Comparator<AudioStream> cmp = ListHelper.getAudioFormatComparator(null, false);\n        assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, cmp));\n        assertEquals(-1, ListHelper.getAudioIndexByHighestRank(new ArrayList<>(), cmp));\n    }\n\n    @Test\n    public void getLowestQualityAudioFormatTest() {\n        Comparator<AudioStream> cmp = ListHelper.getAudioFormatComparator(MediaFormat.M4A, true);\n        AudioStream stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank(\n                AUDIO_STREAMS_TEST_LIST, cmp));\n        assertEquals(128, stream.getAverageBitrate());\n        assertEquals(MediaFormat.M4A, stream.getFormat());\n\n        cmp = ListHelper.getAudioFormatComparator(MediaFormat.WEBMA, true);\n        stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank(\n                AUDIO_STREAMS_TEST_LIST, cmp));\n        assertEquals(64, stream.getAverageBitrate());\n        assertEquals(MediaFormat.WEBMA, stream.getFormat());\n\n        cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, true);\n        stream = AUDIO_STREAMS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank(\n                AUDIO_STREAMS_TEST_LIST, cmp));\n        assertEquals(64, stream.getAverageBitrate());\n        assertEquals(MediaFormat.MP3, stream.getFormat());\n    }\n\n    @Test\n    public void getLowestQualityAudioFormatPreferredAbsent() {\n        Comparator<AudioStream> cmp = ListHelper.getAudioFormatComparator(MediaFormat.MP3, true);\n\n        //////////////////////////////////////////\n        // Doesn't contain the preferred format //\n        ////////////////////////////////////////\n\n        List<AudioStream> testList = new ArrayList<>(List.of(\n                generateAudioStream(\"m4a-128\", MediaFormat.M4A, 128),\n                generateAudioStream(\"webma-192-1\", MediaFormat.WEBMA, 192)));\n        // List doesn't contains this format\n        // It should fallback to the most compact audio no matter what format it is.\n        AudioStream stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp));\n        assertEquals(128, stream.getAverageBitrate());\n        assertEquals(MediaFormat.M4A, stream.getFormat());\n\n        // WEBMA is more compact than M4A\n        testList.add(generateAudioStream(\"webma-192-2\", MediaFormat.WEBMA, 128));\n        stream = testList.get(ListHelper.getAudioIndexByHighestRank(testList, cmp));\n        assertEquals(128, stream.getAverageBitrate());\n        assertEquals(MediaFormat.WEBMA, stream.getFormat());\n\n        ////////////////////////////////////////////////////////\n        // Multiple not-preferred-formats and equal bitrates //\n        //////////////////////////////////////////////////////\n\n        testList = new ArrayList<>(List.of(\n                generateAudioStream(\"webma-192-1\", MediaFormat.WEBMA, 192),\n                generateAudioStream(\"m4a-192-1\",   MediaFormat.M4A, 192),\n                generateAudioStream(\"webma-256\", MediaFormat.WEBMA, 256),\n                generateAudioStream(\"m4a-192-2\", MediaFormat.M4A, 192),\n                generateAudioStream(\"webma-192-2\", MediaFormat.WEBMA, 192),\n                generateAudioStream(\"m4a-192-3\", MediaFormat.M4A, 192)));\n        // List doesn't contain this format\n        // It should fallback to the most compact audio no matter what format it is.\n        stream = testList.get(\n                ListHelper.getAudioIndexByHighestRank(testList, cmp));\n        assertEquals(192, stream.getAverageBitrate());\n        assertEquals(MediaFormat.WEBMA, stream.getFormat());\n\n        // Should be same as above\n        cmp = ListHelper.getAudioFormatComparator(null, true);\n        stream = testList.get(\n                ListHelper.getAudioIndexByHighestRank(testList, cmp));\n        assertEquals(192, stream.getAverageBitrate());\n        assertEquals(MediaFormat.WEBMA, stream.getFormat());\n    }\n\n    @Test\n    public void getLowestQualityAudioNull() {\n        final Comparator<AudioStream> cmp = ListHelper.getAudioFormatComparator(null, false);\n        assertEquals(-1, ListHelper.getAudioIndexByHighestRank(null, cmp));\n        assertEquals(-1, ListHelper.getAudioIndexByHighestRank(new ArrayList<>(), cmp));\n    }\n\n    @Test\n    public void getAudioTrack() {\n        // English language\n        Comparator<AudioStream> cmp =\n                ListHelper.getAudioTrackComparator(Locale.ENGLISH, false, false);\n        AudioStream stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank(\n                AUDIO_TRACKS_TEST_LIST, cmp));\n        assertEquals(\"en.or\", stream.getId());\n\n        // German language\n        cmp = ListHelper.getAudioTrackComparator(Locale.GERMAN, false, false);\n        stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank(\n                AUDIO_TRACKS_TEST_LIST, cmp));\n        assertEquals(\"de.du\", stream.getId());\n\n        // German language, but prefer original\n        cmp = ListHelper.getAudioTrackComparator(Locale.GERMAN, true, false);\n        stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank(\n                AUDIO_TRACKS_TEST_LIST, cmp));\n        assertEquals(\"en.or\", stream.getId());\n\n        // Prefer descriptive audio\n        cmp = ListHelper.getAudioTrackComparator(Locale.ENGLISH, false, true);\n        stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank(\n                AUDIO_TRACKS_TEST_LIST, cmp));\n        assertEquals(\"en.ds\", stream.getId());\n\n        // Japanese language, fall back to original\n        cmp = ListHelper.getAudioTrackComparator(Locale.JAPANESE, true, false);\n        stream = AUDIO_TRACKS_TEST_LIST.get(ListHelper.getAudioIndexByHighestRank(\n                AUDIO_TRACKS_TEST_LIST, cmp));\n        assertEquals(\"en.or\", stream.getId());\n    }\n\n    @Test\n    public void getVideoDefaultStreamIndexCombinations() {\n        final List<VideoStream> testList = List.of(\n                generateVideoStream(\"mpeg_4-1080\", MediaFormat.MPEG_4, \"1080p\",  false),\n                generateVideoStream(\"mpeg_4-720_60\", MediaFormat.MPEG_4, \"720p60\", false),\n                generateVideoStream(\"mpeg_4-720\", MediaFormat.MPEG_4, \"720p\",   false),\n                generateVideoStream(\"webm-480\", MediaFormat.WEBM, \"480p\",   false),\n                generateVideoStream(\"mpeg_4-360\", MediaFormat.MPEG_4, \"360p\",   false),\n                generateVideoStream(\"webm-360\", MediaFormat.WEBM, \"360p\",   false),\n                generateVideoStream(\"v3gpp-240_60\", MediaFormat.v3GPP, \"240p60\", false),\n                generateVideoStream(\"webm-144\", MediaFormat.WEBM, \"144p\",   false));\n\n        // exact matches\n        assertEquals(1, ListHelper.getVideoStreamIndex(\"720p60\", MediaFormat.MPEG_4, testList));\n        assertEquals(2, ListHelper.getVideoStreamIndex(\"720p\", MediaFormat.MPEG_4, testList));\n\n        // match but not refresh\n        assertEquals(0, ListHelper.getVideoStreamIndex(\"1080p60\", MediaFormat.MPEG_4, testList));\n        assertEquals(6, ListHelper.getVideoStreamIndex(\"240p\", MediaFormat.v3GPP, testList));\n\n        // match but not format\n        assertEquals(1, ListHelper.getVideoStreamIndex(\"720p60\", MediaFormat.WEBM, testList));\n        assertEquals(2, ListHelper.getVideoStreamIndex(\"720p\", MediaFormat.WEBM, testList));\n        assertEquals(1, ListHelper.getVideoStreamIndex(\"720p60\", null, testList));\n        assertEquals(2, ListHelper.getVideoStreamIndex(\"720p\", null, testList));\n\n        // match but not format and not refresh\n        assertEquals(0, ListHelper.getVideoStreamIndex(\"1080p60\", MediaFormat.WEBM, testList));\n        assertEquals(6, ListHelper.getVideoStreamIndex(\"240p\", MediaFormat.WEBM, testList));\n        assertEquals(0, ListHelper.getVideoStreamIndex(\"1080p60\", null, testList));\n        assertEquals(6, ListHelper.getVideoStreamIndex(\"240p\", null, testList));\n\n        // match closest lower resolution\n        assertEquals(7, ListHelper.getVideoStreamIndex(\"200p\", MediaFormat.WEBM, testList));\n        assertEquals(7, ListHelper.getVideoStreamIndex(\"200p60\", MediaFormat.WEBM, testList));\n        assertEquals(7, ListHelper.getVideoStreamIndex(\"200p\", MediaFormat.MPEG_4, testList));\n        assertEquals(7, ListHelper.getVideoStreamIndex(\"200p60\", MediaFormat.MPEG_4, testList));\n        assertEquals(7, ListHelper.getVideoStreamIndex(\"200p\", null, testList));\n        assertEquals(7, ListHelper.getVideoStreamIndex(\"200p60\", null, testList));\n\n        // Can't find a match\n        assertEquals(-1, ListHelper.getVideoStreamIndex(\"100p\", null, testList));\n    }\n\n    @NonNull\n    private static AudioStream generateAudioStream(@NonNull final String id,\n                                                   @Nullable final MediaFormat mediaFormat,\n                                                   final int averageBitrate) {\n        return new AudioStream.Builder()\n                .setId(id)\n                .setContent(\"\", true)\n                .setMediaFormat(mediaFormat)\n                .setAverageBitrate(averageBitrate)\n                .build();\n    }\n\n    private static AudioStream generateAudioTrack(\n            @NonNull final String id,\n            @Nullable final String trackId,\n            @Nullable final Locale locale,\n            @Nullable final AudioTrackType trackType) {\n        return new AudioStream.Builder()\n                .setId(id)\n                .setContent(\"\", true)\n                .setMediaFormat(MediaFormat.M4A)\n                .setAverageBitrate(128)\n                .setAudioTrackId(trackId)\n                .setAudioLocale(locale)\n                .setAudioTrackType(trackType)\n                .build();\n    }\n\n    @NonNull\n    private static VideoStream generateVideoStream(@NonNull final String id,\n                                                   @Nullable final MediaFormat mediaFormat,\n                                                   @NonNull final String resolution,\n                                                   final boolean isVideoOnly) {\n        return new VideoStream.Builder()\n                .setId(id)\n                .setContent(\"\", true)\n                .setIsVideoOnly(isVideoOnly)\n                .setResolution(resolution)\n                .setMediaFormat(mediaFormat)\n                .build();\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/util/LocalizationTest.kt",
    "content": "package org.schabi.newpipe.util\n\nimport java.time.LocalDate\nimport java.time.OffsetDateTime\nimport java.time.ZoneOffset\nimport java.util.Locale\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\nimport org.ocpsoft.prettytime.PrettyTime\n\nclass LocalizationTest {\n    @Test(expected = NullPointerException::class)\n    fun `relativeTime() must fail without initializing pretty time`() {\n        Localization.relativeTime(OffsetDateTime.of(2021, 1, 6, 0, 0, 0, 0, ZoneOffset.UTC))\n    }\n\n    @Test\n    fun `relativeTime() with a OffsetDateTime must work`() {\n        val prettyTime = PrettyTime(LocalDate.of(2021, 1, 1), ZoneOffset.UTC)\n        prettyTime.locale = Locale.ENGLISH\n        Localization.initPrettyTime(prettyTime)\n\n        val offset = OffsetDateTime.of(2021, 1, 6, 0, 0, 0, 0, ZoneOffset.UTC)\n        val actual = Localization.relativeTime(offset)\n\n        assertEquals(\"5 days from now\", actual)\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/util/QuadraticSliderStrategyTest.java",
    "content": "package org.schabi.newpipe.util;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\npublic class QuadraticSliderStrategyTest {\n    private static final int STEP = 100;\n    private static final float DELTA = 1f / (float) STEP;\n\n    private final SliderStrategy.Quadratic standard =\n            new SliderStrategy.Quadratic(0f, 100f, 50f, STEP);\n\n    @Test\n    public void testLeftBound() {\n        assertEquals(standard.progressOf(0), 0);\n        assertEquals(standard.valueOf(0), 0f, DELTA);\n    }\n\n    @Test\n    public void testCenter() {\n        assertEquals(standard.progressOf(50), 50);\n        assertEquals(standard.valueOf(50), 50f, DELTA);\n    }\n\n    @Test\n    public void testRightBound() {\n        assertEquals(standard.progressOf(100), 100);\n        assertEquals(standard.valueOf(100), 100f, DELTA);\n    }\n\n    @Test\n    public void testLeftRegion() {\n        final int leftProgress = standard.progressOf(25);\n        final double leftValue = standard.valueOf(25);\n        assertTrue(leftProgress > 0 && leftProgress < 50);\n        assertTrue(leftValue > 0f && leftValue < 50);\n    }\n\n    @Test\n    public void testRightRegion() {\n        final int leftProgress = standard.progressOf(75);\n        final double leftValue = standard.valueOf(75);\n        assertTrue(leftProgress > 50 && leftProgress < 100);\n        assertTrue(leftValue > 50f && leftValue < 100);\n    }\n\n    @Test\n    public void testConversion() {\n        assertEquals(standard.progressOf(standard.valueOf(0)), 0);\n        assertEquals(standard.progressOf(standard.valueOf(25)), 25);\n        assertEquals(standard.progressOf(standard.valueOf(50)), 50);\n        assertEquals(standard.progressOf(standard.valueOf(75)), 75);\n        assertEquals(standard.progressOf(standard.valueOf(100)), 100);\n    }\n\n    @Test\n    public void testReverseConversion() {\n        // Need a larger delta since step size / granularity is too small and causes\n        // floating point round-off errors during conversion\n        final float largeDelta = 1f;\n\n        assertEquals(standard.valueOf(standard.progressOf(0)), 0f, largeDelta);\n        assertEquals(standard.valueOf(standard.progressOf(25)), 25f, largeDelta);\n        assertEquals(standard.valueOf(standard.progressOf(50)), 50f, largeDelta);\n        assertEquals(standard.valueOf(standard.progressOf(75)), 75f, largeDelta);\n        assertEquals(standard.valueOf(standard.progressOf(100)), 100f, largeDelta);\n    }\n\n    @Test\n    public void testQuadraticPropertyLeftRegion() {\n        final double differenceCloserToCenter =\n                Math.abs(standard.valueOf(40) - standard.valueOf(45));\n        final double differenceFurtherFromCenter =\n                Math.abs(standard.valueOf(10) - standard.valueOf(15));\n        assertTrue(differenceCloserToCenter < differenceFurtherFromCenter);\n    }\n\n    @Test\n    public void testQuadraticPropertyRightRegion() {\n        final double differenceCloserToCenter =\n                Math.abs(standard.valueOf(75) - standard.valueOf(70));\n        final double differenceFurtherFromCenter =\n                Math.abs(standard.valueOf(95) - standard.valueOf(90));\n        assertTrue(differenceCloserToCenter < differenceFurtherFromCenter);\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/util/external_communication/TimestampExtractorTest.java",
    "content": "package org.schabi.newpipe.util.external_communication;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.junit.runners.Parameterized;\nimport org.schabi.newpipe.util.text.TimestampExtractor;\n\nimport java.time.Duration;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.regex.Matcher;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNull;\nimport static org.junit.Assert.fail;\n\n@RunWith(Parameterized.class)\npublic class TimestampExtractorTest {\n\n    @Parameterized.Parameter(0)\n    public Duration expected;\n\n    @Parameterized.Parameter(1)\n    public String stringToProcess;\n\n    @Parameterized.Parameters(name = \"Expecting {0} for \\\"{1}\\\"\")\n    public static List<Object[]> dataForTests() {\n        return Arrays.asList(new Object[][]{\n                // Simple valid values\n                {Duration.ofSeconds(1), \"0:01\"},\n                {Duration.ofSeconds(1), \"00:01\"},\n                {Duration.ofSeconds(1), \"0:00:01\"},\n                {Duration.ofSeconds(1), \"00:00:01\"},\n                {Duration.ofMinutes(1).plusSeconds(23), \"1:23\"},\n                {Duration.ofMinutes(1).plusSeconds(23), \"01:23\"},\n                {Duration.ofMinutes(1).plusSeconds(23), \"0:01:23\"},\n                {Duration.ofMinutes(1).plusSeconds(23), \"00:01:23\"},\n                {Duration.ofHours(1).plusMinutes(23).plusSeconds(45), \"1:23:45\"},\n                {Duration.ofHours(1).plusMinutes(23).plusSeconds(45), \"01:23:45\"},\n                // Check with additional text\n                {Duration.ofSeconds(1), \"Wow 0:01 words\"},\n                {Duration.ofMinutes(1).plusSeconds(23), \"Wow 1:23 words\"},\n                {Duration.ofSeconds(1), \"Wow 0:01 words! 33:\"},\n                {null, \"Wow0:01 abc\"},\n                {null, \"Wow 0:01abc\"},\n                {null, \"Wow0:01abc\"},\n                {null, \"Wow0:01\"},\n                {null, \"0:01abc\"},\n                // Boundary checks\n                {Duration.ofSeconds(0), \"0:00\"},\n                {Duration.ofHours(59).plusMinutes(59).plusSeconds(59), \"59:59:59\"},\n                {null, \"60:59:59\"},\n                {null, \"60:59\"},\n                {null, \"0:60\"},\n                // Format checks\n                {null, \"000:0\"},\n                {null, \"123:01\"},\n                {null, \"123:123\"},\n                {null, \"2:123\"},\n                {null, \"2:3\"},\n                {null, \"1:2:3\"},\n                {null, \":3\"},\n                {null, \"01:\"},\n                {null, \":01\"},\n                {null, \"a:b:c\"},\n                {null, \"abc:def:ghj\"},\n                {null, \"::\"},\n                {null, \":\"},\n                {null, \"\"}\n        });\n    }\n\n    @Test\n    public void testExtract() {\n        final Matcher m = TimestampExtractor.TIMESTAMPS_PATTERN.matcher(this.stringToProcess);\n\n        if (!m.find()) {\n            if (expected == null) {\n                return;\n            }\n            fail(\"No match found but expected one\");\n        }\n\n        final TimestampExtractor.TimestampMatchDTO timestampMatchDTO =\n                TimestampExtractor\n                        .getTimestampFromMatcher(m, this.stringToProcess);\n\n        if (timestampMatchDTO == null) {\n            if (expected == null) {\n                return;\n            }\n            fail(\"Result shouldn't be null\");\n        } else if (expected == null) {\n            assertNull(\"Expected that the dto is null, but it isn't\", timestampMatchDTO);\n            return;\n        }\n\n        final int actualSeconds = timestampMatchDTO.seconds();\n\n        assertEquals(expected.getSeconds(), actualSeconds);\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/util/image/ImageStrategyTest.java",
    "content": "package org.schabi.newpipe.util.image;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.schabi.newpipe.extractor.Image.HEIGHT_UNKNOWN;\nimport static org.schabi.newpipe.extractor.Image.WIDTH_UNKNOWN;\nimport static org.schabi.newpipe.util.image.ImageStrategy.choosePreferredImage;\nimport static org.schabi.newpipe.util.image.ImageStrategy.estimatePixelCount;\n\nimport org.junit.Test;\nimport org.schabi.newpipe.extractor.Image;\nimport org.schabi.newpipe.extractor.Image.ResolutionLevel;\n\nimport java.util.List;\n\npublic class ImageStrategyTest {\n\n    private static final List<ResolutionLevel> RESOLUTION_LEVELS = List.of(\n            ResolutionLevel.LOW, ResolutionLevel.MEDIUM, ResolutionLevel.HIGH);\n\n    private Image img(final int height, final int width) {\n        return new Image(\"\", height, width, ResolutionLevel.UNKNOWN);\n    }\n\n    private Image img(final String url, final ResolutionLevel resolutionLevel) {\n        return new Image(url, HEIGHT_UNKNOWN, WIDTH_UNKNOWN, resolutionLevel);\n    }\n\n    private Image img(final String url,\n                      final int height,\n                      final int width,\n                      final ResolutionLevel resolutionLevel) {\n        return new Image(url, height, width, resolutionLevel);\n    }\n\n    private void assertChoosePreferredImage(final String low,\n                                            final String medium,\n                                            final String high,\n                                            final List<Image> images) {\n        assertEquals(low, choosePreferredImage(images, PreferredImageQuality.LOW));\n        assertEquals(medium, choosePreferredImage(images, PreferredImageQuality.MEDIUM));\n        assertEquals(high, choosePreferredImage(images, PreferredImageQuality.HIGH));\n    }\n\n\n    // CHECKSTYLE:OFF\n    @Test\n    public void testEstimatePixelCountAllKnown() {\n        assertEquals(20000.0, estimatePixelCount(img(100, 200),  1.0), 0.0);\n        assertEquals(20000.0, estimatePixelCount(img(100, 200), 12.0), 0.0);\n        assertEquals(  100.0, estimatePixelCount(img(100,   1), 12.0), 0.0);\n        assertEquals(  100.0, estimatePixelCount(img(  1, 100),  0.5), 0.0);\n    }\n\n    @Test\n    public void testEstimatePixelCountHeightUnknown() {\n        assertEquals( 10000.0, estimatePixelCount(img(HEIGHT_UNKNOWN, 100),  1.0    ), 0.0);\n        assertEquals( 20000.0, estimatePixelCount(img(HEIGHT_UNKNOWN, 200),  2.0    ), 0.0);\n        assertEquals(    10.0, estimatePixelCount(img(HEIGHT_UNKNOWN,   1),  0.1    ), 0.0);\n        assertEquals(230400.0, estimatePixelCount(img(HEIGHT_UNKNOWN, 640), 16.0/9.0), 0.0);\n    }\n\n    @Test\n    public void testEstimatePixelCountWidthUnknown() {\n        assertEquals( 10000.0, estimatePixelCount(img(100, WIDTH_UNKNOWN),  1.0    ), 0.0);\n        assertEquals( 20000.0, estimatePixelCount(img(200, WIDTH_UNKNOWN),  0.5    ), 0.0);\n        assertEquals(    12.0, estimatePixelCount(img(  1, WIDTH_UNKNOWN), 12.0    ), 0.0);\n        assertEquals(230400.0, estimatePixelCount(img(360, WIDTH_UNKNOWN), 16.0/9.0), 0.0);\n    }\n\n    @Test\n    public void testEstimatePixelCountAllUnknown() {\n        assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN),  1.0    ), 0.0);\n        assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN), 12.0    ), 0.0);\n        assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN),  0.1    ), 0.0);\n        assertEquals(0.0, estimatePixelCount(img(HEIGHT_UNKNOWN, WIDTH_UNKNOWN), 16.0/9.0), 0.0);\n    }\n    // CHECKSTYLE:ON\n\n\n    @Test\n    public void testChoosePreferredImageAllKnown() {\n        // the resolution level of the images is more important than the actual resolution\n        assertChoosePreferredImage(\"a\", \"b\", \"c\", List.of(\n                img(\"a\", 1, 1, ResolutionLevel.LOW),\n                img(\"b\", 200, 200, ResolutionLevel.MEDIUM),\n                img(\"c\", 10000, 10000, ResolutionLevel.HIGH)\n        ));\n        assertChoosePreferredImage(\"a\", \"b\", \"c\", List.of(\n                img(\"a\", 10000, 10000, ResolutionLevel.LOW),\n                img(\"b\", 200, 200, ResolutionLevel.MEDIUM),\n                img(\"c\", 1, 1, ResolutionLevel.HIGH)\n        ));\n\n        assertChoosePreferredImage(\"b\", \"c\", \"d\", List.of(\n                img(\"a\", 2, 1, ResolutionLevel.LOW),\n                img(\"b\", 50, 25, ResolutionLevel.LOW),\n                img(\"c\", 200, 100, ResolutionLevel.LOW),\n                img(\"d\", 300, 150, ResolutionLevel.LOW)\n        ));\n\n        assertChoosePreferredImage(\"c\", \"d\", \"d\", List.of(\n                img(\"a\", 2, 1, ResolutionLevel.MEDIUM),\n                img(\"b\", 50, 25, ResolutionLevel.MEDIUM),\n                img(\"c\", 60, 30, ResolutionLevel.MEDIUM),\n                img(\"d\", 300, 150, ResolutionLevel.MEDIUM)\n        ));\n    }\n\n    @Test\n    public void testChoosePreferredImageSomeKnown() {\n        // the resolution level of the images is more important than the actual resolution\n        assertChoosePreferredImage(\"a\", \"b\", \"c\", List.of(\n                img(\"a\", 1, WIDTH_UNKNOWN, ResolutionLevel.LOW),\n                img(\"b\", HEIGHT_UNKNOWN, 200, ResolutionLevel.MEDIUM),\n                img(\"c\", 10000, WIDTH_UNKNOWN, ResolutionLevel.HIGH)\n        ));\n        assertChoosePreferredImage(\"a\", \"b\", \"c\", List.of(\n                img(\"a\", HEIGHT_UNKNOWN, 10000, ResolutionLevel.LOW),\n                img(\"b\", 200, WIDTH_UNKNOWN, ResolutionLevel.MEDIUM),\n                img(\"c\", HEIGHT_UNKNOWN, 1, ResolutionLevel.HIGH)\n        ));\n\n        assertChoosePreferredImage(\"b\", \"c\", \"d\", List.of(\n                img(\"a\", HEIGHT_UNKNOWN, 1, ResolutionLevel.HIGH),\n                img(\"b\", 50, WIDTH_UNKNOWN, ResolutionLevel.HIGH),\n                img(\"c\", HEIGHT_UNKNOWN, 120, ResolutionLevel.HIGH),\n                img(\"d\", 340, WIDTH_UNKNOWN, ResolutionLevel.HIGH)\n        ));\n\n        assertChoosePreferredImage(\"c\", \"d\", \"d\", List.of(\n                img(\"a\", 2, WIDTH_UNKNOWN, ResolutionLevel.MEDIUM),\n                img(\"b\", HEIGHT_UNKNOWN, 50, ResolutionLevel.MEDIUM),\n                img(\"c\", 60, WIDTH_UNKNOWN, ResolutionLevel.MEDIUM),\n                img(\"d\", HEIGHT_UNKNOWN, 340, ResolutionLevel.MEDIUM)\n        ));\n    }\n\n    @Test\n    public void testChoosePreferredImageMixed() {\n        for (final ResolutionLevel resolutionLevel : RESOLUTION_LEVELS) {\n            assertChoosePreferredImage(\"d\", \"b\", \"c\", List.of(\n                    img(\"a\", ResolutionLevel.UNKNOWN),\n                    img(\"b\", 200, 100, resolutionLevel),\n                    img(\"c\", 400, WIDTH_UNKNOWN, resolutionLevel),\n                    img(\"d\", HEIGHT_UNKNOWN, 50, resolutionLevel),\n                    img(\"e\", resolutionLevel)\n            ));\n        }\n        for (final ResolutionLevel resolutionLevel : RESOLUTION_LEVELS) {\n            assertChoosePreferredImage(\"b\", \"b\", \"b\", List.of(\n                    img(\"a\", ResolutionLevel.UNKNOWN),\n                    img(\"b\", 200, 100, resolutionLevel),\n                    img(\"e\", resolutionLevel)\n            ));\n        }\n        assertChoosePreferredImage(\"b\", \"b\", \"e\", List.of(\n                img(\"a\", ResolutionLevel.UNKNOWN),\n                img(\"b\", 200, 100, ResolutionLevel.LOW),\n                img(\"e\", ResolutionLevel.HIGH)\n        ));\n    }\n\n    @Test\n    public void testChoosePreferredImageAllUnknown() {\n        assertChoosePreferredImage(\"b\", \"c\", \"d\", List.of(\n                img(\"a\", ResolutionLevel.UNKNOWN),\n                img(\"b\", ResolutionLevel.LOW),\n                img(\"c\", ResolutionLevel.MEDIUM),\n                img(\"d\", ResolutionLevel.HIGH)\n        ));\n        assertChoosePreferredImage(\"c\", \"c\", \"d\", List.of(\n                img(\"a\", ResolutionLevel.UNKNOWN),\n                img(\"c\", ResolutionLevel.MEDIUM),\n                img(\"d\", ResolutionLevel.HIGH)\n        ));\n        assertChoosePreferredImage(\"b\", \"c\", \"c\", List.of(\n                img(\"a\", ResolutionLevel.UNKNOWN),\n                img(\"b\", ResolutionLevel.LOW),\n                img(\"c\", ResolutionLevel.MEDIUM)\n        ));\n\n        // UNKNOWN is avoided as much as possible\n        assertChoosePreferredImage(\"d\", \"d\", \"d\", List.of(\n                img(\"a\", ResolutionLevel.UNKNOWN),\n                img(\"d\", ResolutionLevel.HIGH)\n        ));\n        assertChoosePreferredImage(\"b\", \"b\", \"b\", List.of(\n                img(\"a\", ResolutionLevel.UNKNOWN),\n                img(\"b\", ResolutionLevel.LOW)\n        ));\n        assertChoosePreferredImage(\"a\", \"a\", \"a\", List.of(\n                img(\"a\", ResolutionLevel.UNKNOWN)\n        ));\n    }\n}\n"
  },
  {
    "path": "app/src/test/java/org/schabi/newpipe/util/urlfinder/UrlFinderTest.kt",
    "content": "package org.schabi.newpipe.util.urlfinder\n\nimport org.junit.Assert.assertEquals\nimport org.junit.Test\n\n/**\n * Keep in mind that patterns from PatternsCompat are used, and they are already being extensively tested.\n */\nclass UrlFinderTest {\n    @Test fun `first url from long text`() {\n        val expected = \"https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_\"\n        val result = UrlFinder.firstUrlFromInput(\n            \"\"\"\n            |Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. \n            |Eu tincidunt tortor aliquam nulla. URL: https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_ Sed dictum consequat dui. \n            |Pharetra diam sit amet nisl suscipit adipiscing bibendum est. \n            |Volutpat sed cras ornare arcu dui vivamus. Nulla posuere sollicitudin aliquam ultrices sagittis. \n            |Amet nisl purus in mollis nunc sed id. Ut aliquam purus sit amet luctus. Sit amet nisl suscipit adipiscing. \n            |Dapibus ultrices in iaculis nunc sed augue lacus viverra. Nisl purus in mollis nunc. \n            |Viverra nibh cras pulvinar mattis. ####!@!@!@!#### Not this one: https://www.youtube.com/playlist?list=SHOULD_NOT Nunc sed blandit libero volutpat. \n            |Nisl tincidunt eget nullam non nisi est sit amet. Purus in massa tempor nec feugiat nisl pretium fusce id. \n            |Vulputate eu scelerisque felis imperdiet proin fermentum leo vel.\n            \"\"\".trimMargin()\n        )\n\n        assertEquals(expected, result)\n    }\n\n    @Test fun `no url from long text`() {\n        val result = UrlFinder.firstUrlFromInput(\n            \"\"\"\n            |Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. \n            |Eu tincidunt tortor aliquam nulla. Sed dictum consequat dui. Pharetra diam sit amet nisl suscipit adipiscing bibendum est. \n            |Volutpat sed cras ornare arcu dui vivamus. Nulla posuere sollicitudin aliquam ultrices sagittis. \n            |Amet nisl purus in mollis nunc sed id. Ut aliquam purus sit amet luctus. Sit amet nisl suscipit adipiscing. \n            |Dapibus ultrices in iaculis nunc sed augue lacus viverra. Nisl purus in mollis nunc. \n            |Viverra nibh cras pulvinar mattis. Not this one: sed blandit libero volutpat. \n            |Nisl tincidunt eget nullam non nisi est sit amet. Purus in massa tempor nec feugiat nisl pretium fusce id. \n            |Vulputate eu scelerisque felis imperdiet proin fermentum leo vel.\n            \"\"\".trimMargin()\n        )\n\n        assertEquals(null, result)\n    }\n\n    @Test fun `null and empty input`() {\n        assertEquals(null, UrlFinder.firstUrlFromInput(null))\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"\"))\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"            \"))\n    }\n\n    @Test fun `normal urls`() {\n        assertEquals(\n            \"https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_\",\n            UrlFinder.firstUrlFromInput(\"https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_\")\n        )\n\n        assertEquals(\n            \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n            UrlFinder.firstUrlFromInput(\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\")\n        )\n\n        assertEquals(\n            \"http://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n            UrlFinder.firstUrlFromInput(\"http://www.youtube.com/watch?v=dQw4w9WgXcQ\")\n        )\n\n        assertEquals(\"https://www.google.com\", UrlFinder.firstUrlFromInput(\"https://www.google.com\"))\n        assertEquals(\"http://www.google.com/test/\", UrlFinder.firstUrlFromInput(\"http://www.google.com/test/\"))\n        assertEquals(\"https://www.google.com/test?x=yz#123\", UrlFinder.firstUrlFromInput(\"https://www.google.com/test?x=yz#123\"))\n        assertEquals(\"https://208.67.222.222\", UrlFinder.firstUrlFromInput(\"https://208.67.222.222\"))\n        assertEquals(\"https://208.67.222.222/\", UrlFinder.firstUrlFromInput(\"https://208.67.222.222/\"))\n        assertEquals(\"http://208.67.222.222/\", UrlFinder.firstUrlFromInput(\"http://208.67.222.222/\"))\n    }\n\n    @Test fun `unknown protocols`() {\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"httpsS://www.youtube.com/watch?v=dQw4w9WgXcQ\"))\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"rtsp://www.youtube.com/watch?v=dQw4w9WgXcQ\"))\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"ftp://www.youtube.com/watch?v=dQw4w9WgXcQ\"))\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"ASDF://www.youtube.com/watch?v=dQw4w9WgXcQ\"))\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"https→://www.youtube.com/watch?v=dQw4w9WgXcQ\"))\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"file:///etc/fstab\"))\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"://www.youtube.com/watch?v=dQw4w9WgXcQ\"))\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"www.youtube.com/watch?v=dQw4w9WgXcQ\"))\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"youtube.com/watch?v=dQw4w9WgXcQ\"))\n    }\n\n    @Test fun `no ipv6 urls`() {\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"http://[2620:119:35::35]/test\"))\n        assertEquals(null, UrlFinder.firstUrlFromInput(\"https://[2620:119:35::35]\"))\n    }\n\n    @Test fun `random prefixes and suffixes`() {\n        assertEquals(\n            \"https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_\",\n            UrlFinder.firstUrlFromInput(\"$#!@#@!#https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_ @@@@@@@@@@@\")\n        )\n\n        assertEquals(\n            \"https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_\",\n            UrlFinder.firstUrlFromInput(\"(___\\\"https://www.youtube.com/playlist?list=PLabcdefghij-ABCDEFGHIJ1234567890_\\\")))_\")\n        )\n\n        assertEquals(\n            \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n            UrlFinder.firstUrlFromInput(\"              https://www.youtube.com/watch?v=dQw4w9WgXcQ           \")\n        )\n\n        assertEquals(\n            \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n            UrlFinder.firstUrlFromInput(\" ------_---__-https://www.youtube.com/watch?v=dQw4w9WgXcQ !!!!!!\")\n        )\n\n        assertEquals(\n            \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n            UrlFinder.firstUrlFromInput(\"****https://www.youtube.com/watch?v=dQw4w9WgXcQ _\")\n        )\n        assertEquals(\n            \"https://www.youtube.com/watch?v=dQw4w9WgXcQ\",\n            UrlFinder.firstUrlFromInput(\"https://www.youtube.com/watch?v=dQw4w9WgXcQ\\\"Not PartOfTheUrl\")\n        )\n    }\n}\n"
  },
  {
    "path": "app/src/test/resources/import_export_test.json",
    "content": "{\n  \"app_version\": \"0.11.6\",\n  \"app_version_int\": 47,\n  \"subscriptions\": [\n    {\n      \"service_id\": 0,\n      \"url\": \"https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q\",\n      \"name\": \"Kurzgesagt \\u2013 In a Nutshell\"\n    },\n    {\n      \"service_id\": 0,\n      \"url\": \"https://www.youtube.com/channel/UCEOXxzW2vU0P-0THehuIIeg\",\n      \"name\": \"CaptainDisillusion\"\n    },\n    {\n      \"service_id\": 0,\n      \"url\": \"https://www.youtube.com/channel/UCAuUUnT6oDeKwE6v1NGQxug\",\n      \"name\": \"TED\"\n    },\n    {\n      \"service_id\": 0,\n      \"url\": \"https://www.youtube.com/channel/UCfIXdjDQH9Fau7y99_Orpjw\",\n      \"name\": \"Gorillaz\"\n    },\n    {\n      \"service_id\": 0,\n      \"url\": \"https://www.youtube.com/channel/UCJ0-OtVpF0wOKEqT2Z1HEtA\",\n      \"name\": \"ElectroBOOM\"\n    },\n    {\n      \"service_id\": 0,\n      \"url\": \"https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q\",\n      \"name\": \"ⓤⓝⓘⓒⓞⓓⓔ\"\n    },\n    {\n      \"service_id\": 0,\n      \"url\": \"https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q\",\n      \"name\": \"中文\"\n    },\n    {\n      \"service_id\": 0,\n      \"url\": \"https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8Q\",\n      \"name\": \"हिंदी\"\n    }\n  ]\n}"
  },
  {
    "path": "app/src/test/resources/settings/README.md",
    "content": "`*.zip` files in this folder are NewPipe database exports, in all possible configurations:\n- `db` / `nodb` indicates if there is a `newpipe.db` database included or not\n- `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\n- `json` / `nojson` indicates if there is a `preferences.json` JSON preferences file included or not\n"
  },
  {
    "path": "build.gradle.kts",
    "content": "/*\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\nplugins {\n    alias(libs.plugins.android.application) apply false\n    alias(libs.plugins.jetbrains.kotlin.android) apply false\n    alias(libs.plugins.jetbrains.kotlin.kapt) apply false\n    alias(libs.plugins.google.ksp) apply false\n    alias(libs.plugins.jetbrains.kotlin.parcelize) apply false\n    alias(libs.plugins.jetbrains.kotlinx.serialization) apply false\n    alias(libs.plugins.sonarqube) apply false\n}\n"
  },
  {
    "path": "buildSrc/build.gradle.kts",
    "content": "/*\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\nplugins {\n    `kotlin-dsl`\n}\n\nrepositories {\n    gradlePluginPortal()\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/CheckDependenciesOrder.kt",
    "content": "/*\n * SPDX-FileCopyrightText: 2024 NewPipe contributors <https://newpipe.net>\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\nimport org.gradle.api.DefaultTask\nimport org.gradle.api.file.RegularFileProperty\nimport org.gradle.api.tasks.InputFile\nimport org.gradle.api.tasks.TaskAction\n\nabstract class CheckDependenciesOrder : DefaultTask() {\n\n    @get:InputFile\n    abstract val tomlFile: RegularFileProperty\n\n    init {\n        group = \"verification\"\n        description = \"Checks that each section in libs.versions.toml is sorted alphabetically\"\n    }\n\n    @TaskAction\n    fun run() {\n        val file = tomlFile.get().asFile\n        if (!file.exists()) error(\"TOML file not found\")\n\n        val lines = file.readLines()\n        val nonSortedBlocks = mutableListOf<List<String>>()\n        var currentBlock = mutableListOf<String>()\n        var prevLine = \"\"\n        var prevIndex = 0\n\n        lines.forEachIndexed { lineIndex, line ->\n            if (line.trim().isNotEmpty() && !line.startsWith(\"#\")) {\n                if (line.startsWith(\"[\")) {\n                    prevLine = \"\"\n                } else {\n                    val currIndex = lineIndex + 1\n                    if (prevLine > line) {\n                        if (currentBlock.isNotEmpty() && currentBlock.last() == \"$prevIndex: $prevLine\") {\n                            currentBlock.add(\"$currIndex: $line\")\n                        } else {\n                            if (currentBlock.isNotEmpty()) {\n                                nonSortedBlocks.add(currentBlock)\n                                currentBlock = mutableListOf()\n                            }\n                            currentBlock.add(\"$prevIndex: $prevLine\")\n                            currentBlock.add(\"$currIndex: $line\")\n                        }\n                    }\n                    prevLine = line\n                    prevIndex = lineIndex + 1\n                }\n            }\n        }\n\n        if (currentBlock.isNotEmpty()) {\n            nonSortedBlocks.add(currentBlock)\n        }\n\n        if (nonSortedBlocks.isNotEmpty()) {\n            error(\n                \"The following lines were not sorted:\\n\" +\n                        nonSortedBlocks.joinToString(\"\\n\\n\") { it.joinToString(\"\\n\") }\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "checkstyle/checkstyle.xml",
    "content": "<?xml version=\"1.0\"?>\n<!DOCTYPE module PUBLIC\n          \"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN\"\n          \"https://checkstyle.org/dtds/configuration_1_3.dtd\">\n<module name=\"Checker\">\n    <!--\n        If you set the basedir property below, then all reported file\n        names will be relative to the specified directory. See\n        https://checkstyle.org/5.x/config.html#Checker\n\n        <property name=\"basedir\" value=\"${basedir}\"/>\n    -->\n    <property name=\"severity\" value=\"error\"/>\n\n    <property name=\"fileExtensions\" value=\"java, properties, xml\"/>\n\n    <!-- Excludes all 'module-info.java' files              -->\n    <!-- See https://checkstyle.org/config_filefilters.html -->\n    <module name=\"BeforeExecutionExclusionFileFilter\">\n        <property name=\"fileNamePattern\" value=\"module\\-info\\.java$\"/>\n    </module>\n\n    <!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->\n    <module name=\"SuppressionFilter\">\n        <property name=\"file\" value=\"${config_loc}/suppressions.xml\" />\n        <property name=\"optional\" value=\"true\"/>\n    </module>\n\n    <!-- Checks that a package-info.java file exists for each package.     -->\n    <!-- See https://checkstyle.org/config_javadoc.html#JavadocPackage -->\n    <!--<module name=\"JavadocPackage\"/>-->\n\n    <!-- Checks whether files end with a new line.                        -->\n    <!-- See https://checkstyle.org/config_misc.html#NewlineAtEndOfFile -->\n    <module name=\"NewlineAtEndOfFile\"/>\n\n    <!-- Checks that property files contain the same keys.         -->\n    <!-- See https://checkstyle.org/config_misc.html#Translation -->\n    <module name=\"Translation\"/>\n\n    <!-- Checks for Size Violations.                    -->\n    <!-- See https://checkstyle.sourceforge.io/checks/sizes/index.html -->\n    <module name=\"FileLength\"/>\n    <module name=\"LineLength\">\n      <property name=\"max\" value=\"100\"/>\n      <property name=\"fileExtensions\" value=\"java\"/>\n      <!-- Also allow links in javadocs to be longer (the default would just cover imports) -->\n      <property name=\"ignorePattern\" value=\"^((package|import) .*)|( *\\* &lt;a href ?\\= ?&quot;.*&quot;&gt;)$\"/>\n    </module>\n\n    <!-- Checks for whitespace                               -->\n    <!-- See https://checkstyle.org/config_whitespace.html -->\n    <module name=\"FileTabCharacter\"/>\n\n    <!-- Miscellaneous other checks.                   -->\n    <!-- See https://checkstyle.org/config_misc.html -->\n    <module name=\"RegexpSingleline\">\n       <property name=\"format\" value=\"\\s+$\"/>\n       <property name=\"minimum\" value=\"0\"/>\n       <property name=\"maximum\" value=\"0\"/>\n       <property name=\"message\" value=\"Line has trailing spaces.\"/>\n    </module>\n\n    <!-- Checks for Headers                                -->\n    <!-- See https://checkstyle.org/config_header.html   -->\n    <!-- <module name=\"Header\"> -->\n    <!--   <property name=\"headerFile\" value=\"${checkstyle.header.file}\"/> -->\n    <!--   <property name=\"fileExtensions\" value=\"java\"/> -->\n    <!-- </module> -->\n\n    <module name=\"SuppressWarningsFilter\" />\n\n    <module name=\"TreeWalker\">\n        <module name=\"SuppressionCommentFilter\"/>\n\n        <!-- Checks for Javadoc comments.                     -->\n        <!-- See https://checkstyle.org/config_javadoc.html -->\n        <module name=\"InvalidJavadocPosition\"/>\n        <module name=\"JavadocMethod\"/>\n        <module name=\"JavadocType\"/>\n        <!--<module name=\"JavadocVariable\"/>-->\n        <module name=\"JavadocStyle\"/>\n        <!--<module name=\"MissingJavadocMethod\"/>-->\n\n        <!-- Checks for Naming Conventions.                  -->\n        <!-- See https://checkstyle.org/config_naming.html -->\n        <module name=\"ConstantName\"/>\n        <module name=\"LocalFinalVariableName\"/>\n        <module name=\"LocalVariableName\"/>\n        <module name=\"MemberName\">\n            <property name=\"format\" value=\"^(TAG|DEBUG|[a-z][a-zA-Z0-9]*)$\"/>\n        </module>\n        <module name=\"MethodName\"/>\n        <module name=\"PackageName\"/>\n        <module name=\"ParameterName\"/>\n        <module name=\"StaticVariableName\"/>\n        <module name=\"TypeName\"/>\n\n        <!-- Checks for imports                              -->\n        <!-- See https://checkstyle.org/config_import.html -->\n        <module name=\"AvoidStarImport\"/>\n        <module name=\"IllegalImport\"> <!-- defaults to sun.* packages -->\n            <property name=\"illegalClasses\" value=\"\n                org.jetbrains.annotations.Nullable,\n                org.jetbrains.annotations.NotNull,\n                javax.annotation.Nullable,\n                javax.annotation.Nonnull,\n                io.reactivex.rxjava3.annotations.NonNull,\n                io.reactivex.rxjava3.annotations.Nullable\" />\n        </module>\n        <module name=\"RedundantImport\"/>\n        <module name=\"UnusedImports\"/>\n\n        <!-- Checks for Size Violations.                    -->\n        <!-- See https://checkstyle.org/config_sizes.html -->\n        <module name=\"MethodLength\">\n            <property name=\"severity\" value=\"warning\"/>\n        </module>\n        <module name=\"ParameterNumber\">\n            <property name=\"severity\" value=\"warning\"/>\n        </module>\n\n        <!-- Checks for whitespace                               -->\n        <!-- See https://checkstyle.org/config_whitespace.html -->\n        <module name=\"EmptyForIteratorPad\"/>\n        <module name=\"GenericWhitespace\"/>\n        <module name=\"MethodParamPad\"/>\n        <module name=\"NoWhitespaceAfter\"/>\n        <module name=\"NoWhitespaceBefore\"/>\n        <module name=\"OperatorWrap\"/>\n        <module name=\"OperatorWrap\">\n            <property name=\"tokens\" value=\"ASSIGN,DIV_ASSIGN,PLUS_ASSIGN,MINUS_ASSIGN,STAR_ASSIGN,MOD_ASSIGN,SR_ASSIGN,BSR_ASSIGN,SL_ASSIGN,BXOR_ASSIGN,BOR_ASSIGN,BAND_ASSIGN\"/>\n            <property name=\"option\" value=\"eol\"/>\n        </module>\n        <module name=\"ParenPad\"/>\n        <module name=\"TypecastParenPad\"/>\n        <module name=\"WhitespaceAfter\"/>\n        <module name=\"WhitespaceAround\"/>\n\n        <!-- Modifier Checks                                    -->\n        <!-- See https://checkstyle.org/config_modifiers.html -->\n        <module name=\"ModifierOrder\"/>\n        <module name=\"RedundantModifier\"/>\n\n        <!-- Checks for blocks. You know, those {}'s         -->\n        <!-- See https://checkstyle.org/config_blocks.html -->\n        <module name=\"AvoidNestedBlocks\"/>\n        <module name=\"EmptyBlock\"/>\n        <module name=\"LeftCurly\"/>\n        <module name=\"NeedBraces\"/>\n        <module name=\"RightCurly\"/>\n\n        <!-- Checks for common coding problems               -->\n        <!-- See https://checkstyle.org/config_coding.html -->\n        <module name=\"EmptyStatement\"/>\n        <module name=\"EqualsHashCode\">\n            <property name=\"severity\" value=\"warning\"/>\n        </module>\n        <module name=\"HiddenField\">\n            <property name=\"ignoreConstructorParameter\" value=\"true\"/>\n            <property name=\"ignoreSetter\" value=\"true\"/>\n        </module>\n        <module name=\"IllegalInstantiation\"/>\n        <module name=\"InnerAssignment\"/>\n        <!--<module name=\"MagicNumber\"/>-->\n        <!--<module name=\"MissingSwitchDefault\">\n            <property name=\"severity\" value=\"warning\"/>\n        </module>-->\n        <module name=\"MultipleVariableDeclarations\"/>\n        <module name=\"SimplifyBooleanExpression\"/>\n        <module name=\"SimplifyBooleanReturn\"/>\n        <module name=\"FinalLocalVariable\">\n            <property name=\"tokens\" value=\"VARIABLE_DEF,PARAMETER_DEF\"/>\n            <property name=\"validateEnhancedForLoopVariable\" value=\"true\"/>\n        </module>\n\n        <!-- Checks for class design                         -->\n        <!-- See https://checkstyle.org/config_design.html -->\n        <!--<module name=\"DesignForExtension\"/>-->\n        <module name=\"FinalClass\"/>\n        <module name=\"HideUtilityClassConstructor\"/>\n        <module name=\"InterfaceIsType\"/>\n        <!--<module name=\"VisibilityModifier\">\n            <property name=\"ignoreAnnotationCanonicalNames\" value=\"State,ColumnInfo\"/>\n            <property name=\"severity\" value=\"warning\"/>\n        </module>-->\n\n        <!-- Miscellaneous other checks.                   -->\n        <!-- See https://checkstyle.org/config_misc.html -->\n        <module name=\"ArrayTypeStyle\"/>\n        <module name=\"FinalParameters\"/>\n        <!--<module name=\"TodoComment\">\n            <property name=\"format\" value=\"(TODO:|FIXME:)\"/>\n            <property name=\"severity\" value=\"warning\"/>\n        </module>-->\n        <module name=\"UpperEll\"/>\n\n        <module name=\"SuppressWarningsHolder\" />\n    </module>\n</module>\n"
  },
  {
    "path": "checkstyle/suppressions.xml",
    "content": "<?xml version=\"1.0\"?>\n<!DOCTYPE suppressions PUBLIC\n  \"-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN\"\n  \"https://checkstyle.org/dtds/suppressions_1_2.dtd\">\n<suppressions>\n  <!-- Use @SuppressWarnings(\"...\") if it is possible, only use this file if it is not -->\n\n  <suppress checks=\"FileLength\"\n    files=\"Player.java\"/>\n\n  <suppress checks=\"FileLength\"\n    files=\"VideoDetailFragment.java\"/>\n</suppressions>\n"
  },
  {
    "path": "doc/README.ar.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\"> .Android واجهة أمامية متدفقة خفيفة الوزن لنظام</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-fr.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub release\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"License: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Build Status\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Translation Status\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC channel: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#لقطات-الشاشة\">لقطات الشاشة</a> &bull; <a href=\"#الخدمات-المدعومة\">الخدمات المدعومة</a> &bull; <a href=\"#وصف\">وصف</a> &bull; <a href=\"#سمات\">سمات</a> &bull; <a href=\"#التثبيت-و-التحديثات\">التثبيت والتحديثات</a> &bull; <a href=\"#مساهمة\">مساهمة</a> &bull; <a href=\"#التبرعات\">التبرعات</a> &bull; <a href=\"#رخصة\">رخصة</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">موقع</a> &bull; <a href=\"https://newpipe.net/blog/\">مدونة</a> &bull; <a href=\"https://newpipe.net/FAQ/\">الأسئلة الشائعة</a> &bull; <a href=\"https://newpipe.net/press/\">إضغط</a></p>\n<hr>\n\n*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)*\n\n> [!warning] > <b> .عن طريق ملء نموذج المشكلةGITHUB هذا التطبيق في مرحلة البيتا، لذا قد تواجه بعض الأخطاء. إذا واجهت أي أخطاء، يرجى فتح مشكلة في مستودعنا على </b>\n>\n> <b> .ينتهك شروطهم وأحكامهم Google Play أو أي فرع منه، في متجرNewPipe وضع تطبيق </b>\n\n## لقطات الشاشة\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n### الخدمات المدعومة\n\nحاليًا هذه الخدمات NewPipe يدعم\n\n<!-- We link to the service websites separately to avoid people accidentally opening a website they didn't want to. -->\n\n- YouTube ([موقع إلكتروني](https://www.youtube.com/)) و YouTube Music ([موقع إلكتروني](https://music.youtube.com/)) ([ويكي](https://fr.wikipedia.org/wiki/YouTube))\n- PeerTube ([موقع إلكتروني](https://joinpeertube.org/)) و جميع حالاته (قم بزيارة الموقع لتعرف ماذا يعني ذلك!) ([ويكي](https://fr.wikipedia.org/wiki/PeerTube))\n- Bandcamp ([موقع إلكتروني](https://bandcamp.com/)) ([ويكي](https://fr.wikipedia.org/wiki/Bandcamp))\n- SoundCloud ([موقع إلكتروني](https://soundcloud.com/)) ([ويكي](https://fr.wikipedia.org/wiki/SoundCloud))\n- media.ccc.de ([موقع إلكتروني](https://media.ccc.de/)) ([ويكي](https://fr.wikipedia.org/wiki/Chaos_Computer_Club))\n\nكما يمكنكم ملاحظة، يدعم نيوبايب العديد من خدمات الفيديو والصوت. على الرغم من أن البداية كانت مع يوتيوب، إلا أن أشخاصًا آخرين قاموا بإضافة خدمات جديدة على مر السنين، مما جعل نيوبايب أكثر تنوعًا ومرونة!\n\nجزئيًا بسبب الظروف، وجزئيًا بسبب شعبيته، يوتيوب هو الخدمة الأفضل دعمًا من بين هذه الخدمات. إذا كنت تستخدم أو تعرف أيًا من هذه الخدمات الأخرى، فالرجاء مساعدتنا في تحسين الدعم لها! نحن بحاجة إلى من يعتنون بساوندكلاود وبييرتيوب.\n\nإذا كان لديك نية في إضافة خدمة جديدة، يرجى التواصل معنا أولا! توفر  [مستنداتنا] (https://teamnewpipe.github.io/documentation/) المزيد من المعلومات حول كيفية إضافة خدمة جديدة إلى التطبيق وإلى [NewPipe Extractor] (https://github.com/TeamNewPipe/NewPipeExtractor)..\n\n## وصف\n\nنيوبايب يعمل عن طريق جلب البيانات المطلوبة من واجهة برمجة التطبيقات الرسمية (مثل بيرتيوب) للخدمة التي تستخدمها. إذا كانت واجهة برمجة التطبيقات الرسمية مقيدة (مثل يوتيوب) لأغراضنا، أو مملوكة، يقوم التطبيق بتحليل الموقع الإلكتروني أو استخدام واجهة برمجة التطبيقات الداخلية بدلاً من ذلك. وهذا يعني أنك لا تحتاج إلى حساب على أي خدمة لاستخدام نيوبايب.\n\nأيضًا، نظرًا لأنهما برمجيات حرة ومفتوحة المصدر، فإن التطبيق ولا المستخرج يستخدمان أي مكتبات أو إطارات برمجية مملوكة، مثل خدمات جوجل بلاي. وهذا يعني أنه يمكنك استخدام نيوبايب على الأجهزة أو الرومات المخصصة التي لا تحتوي على تطبيقات جوجل المثبتة.\n\n### سمات\n\n- 4K شاهد مقاطع الفيديو بدقة تصل إلى \n- الاستماع إلى الصوت في الخلفية، وتحميل دفق الصوت فقط لحفظ البيانات\n- الوضع المنبثق (المشغل العائم، المعروف أيضًا باسم Picture-in-Picture)\n- مشاهدة البث المباشر\n- إظهار/إخفاء الترجمة\n- ابحث عن مقاطع فيديو وصوت (على اليوتيوب، يمكنك أيضًا تحديد لغة المحتوى)\n- وضع مقاطع الفيديو في قائمة الانتظار (وحفظها اختياريًا كقوائم تشغيل محلية)\n- إظهار/إخفاء المعلومات العامة حول مقاطع الفيديو (مثل الوصف والعلامات)\n- إظهار/إخفاء مقاطع الفيديو التالية أو ذات الصلة\n- إظهار/إخفاء التعليقات\n- ابحث عن مقاطع الفيديو والصوت والقنوات وقوائم التشغيل والألبومات\n- تصفح مقاطع الفيديو والتسجيلات الصوتية للقناة\n- الاشتراك في القنوات (نعم، دون الحاجة إلى تسجيل الدخول إلى حساب!)\n- تلقي إشعارات حول مقاطع الفيديو الجديدة من القنوات التي اشتركت فيها.\n- إنشاء مجموعات القنوات وتحريرها (لتسهيل الإدارة والتنقل)\n- تصفح خلاصات الفيديو التي تم إنشاؤها من مجموعات القنوات الخاصة بك\n- عرض وبحث تاريخ العرض الخاص بك\n- عرض قوائم التشغيل والبحث فيها (هذه قوائم تشغيل عن بعد، أي أنه يتم سحبها من الخدمة التي تتصفحها)\n- إنشاء وتحرير قوائم التشغيل المحلية (يتم إنشاؤها وحفظها داخل التطبيق، وليس لها أي علاقة بأي من الخدمات)\n- تنزيل مقاطع الفيديو/الصوت/الترجمات\n- العب في كودي\n- مشاهدة/حظر المحتوى المقيد بالفئة العمرية\n\n<!-- Hidden span to keep old links compatible. You should remove this span if you're translating the README into another language.-->\n\n<span id=\"التحديثات\"></span>\n\n## التثبيت والتحديثات\n\n\nيمكنك تثبيت نيوبايب باستخدام إحدى الطرق التالية:\n\n1. أضف مستودعنا في F-Droid وقم بتثبيت التطبيق من هناك. الإرشادات متوفرة هنا: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n2.  قم بتنزيل APK من [إصدارات GitHub](https://github.com/TeamNewPipe/NewPipe/releases) وقم بتثبيته.\n3.  قم بتحديث التطبيق عبر F-Droid. هذه الطريقة هي الأبطأ للحصول على التحديثات، حيث يجب على F-Droid اكتشاف التغييرات، وبناء ملف APK بنفسه، وتوقيعه، ثم نشر التحديث أخيرًا.\n4.  قم بإنشاء ملف APK للتصحيح بنفسك. هذه هي الطريقة الأسرع للحصول على ميزات جديدة على جهازك، لكنها أكثر تعقيدًا بكثير، ولهذا نوصي باستخدام أحد الطرق الأخرى.\n5.  ذا كنت مهتمًا بميزة معينة أو إصلاح خلل محدد في طلب سحب (PR) من هذا المستودع، يمكنك أيضًا تنزيل ملف APK من هذا الطلب. ستجد التعليمات في وصف الطلب. الرائع في ملفات APK الخاصة بالطلبات السحب هو أنها تُثبت بجانب التطبيق الرسمي، لذا لا داعي للقلق بشأن فقدان بياناتك أو تعطيل أي شيء.\n\nنوصي بالطريقة الأولى لمعظم المستخدمين. يتوافق ملفات APK التي تم تثبيتها باستخدام الطرق الأولى أو الثانية مع بعضها البعض (مما يعني أنه إذا قمت بتثبيت NewPipe باستخدام إحدى هاتين الطريقتين، يمكنك أيضًا تحديث NewPipe باستخدام الطريقة الأخرى)، ولكن لا يتوافق ذلك مع تلك التي تم تثبيتها باستخدام الطريقة الثالثة. يرجع ذلك إلى استخدام نفس مفتاح التوقيع (الخاص بنا) للطرق الأولى والثانية، بينما يتم استخدام مفتاح مختلف (مفتاح F-Droid) للطريقة الثالثة. إن بناء ملف APK للتصحيح باستخدام الطريقة الرابعة لا يتطلب أي مفتاح. تساعد مفاتيح التوقيع في التأكد من عدم خداع المستخدم وتثبيت تحديث غير مشروع للتطبيق. عند استخدام الطريقة الخامسة، يتم توقيع كل ملف APK بمفتاح توقيع فريد وعشوائي يتم إنشاؤه بواسطة GitHub Actions؛ لذا لا يمكنك تحديثها. فيجب عليك حفظ واستعادة بيانات التطبيق في كل مرة ترغب في استخدام ملف APK جديد.\n\nفي الوقت الحاضر، إذا كنت ترغب في تغيير المصدر لأي سبب من الأسباب (على سبيل المثال، إذا كانت ميزة NewPipe الأساسية معطلة ولم يتم تحديثها بعد على F-Droid)، نوصي باتباع هذه الإجراءات:\n\n1. قم بعمل نسخة احتياطية من بياناتك عبر الإعدادات > المحتوى > تصدير قاعدة البيانات للحفاظ على السجل والاشتراكات وقوائم التشغيل.\n2. إلغاء تثبيت NewPipe\n3. قم بتنزيل APK من المصدر الجديد وتثبيته.\n4. قم باستعادة البيانات من الخطوة 1 عبر الإعدادات > المحتوى > استيراد قاعدة البيانات\n\n<b>ملاحظة: عندما تقوم بإستيراد قاعدة بيانات إلى التطبيق الرسمي، تأكد دائمًا من أنها تم استخراجها من التطبيق الرسمي. إذا قمت بإستيراد قاعدة بيانات من APK آخر غير الرسمي، قد تحدث مشاكل. هذا الإجراء غير مدعوم، ويجب عليك فعل ذلك فقط عندما تكون متأكدًا تمامًا من ما تفعله.</b>\n\n## مساهمة\n\nسواء كانت لديك أفكار، أو ترجمات، أو تغييرات في التصميم، أو تنظيف التعليمات البرمجية، أو حتى تغيير كبير في التعليمات البرمجية، فنحن نرحب بأي مساعدة. التطبيق يصبح أفضل قليلا مع كل مساهمة، مهما كانت كبيرة أو صغيرة! إذا كنت ترغب في المشاركة، قم بإلقاء نظرة على [ملاحظات المساهمة](.github/CONTRIBUTING.md).\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Translation status\" />\n</a>\n\n## التبرعات\n\nإذا كنت تحب NewPipe، فنحن نرحب بك لإرسال التبرع. نحن نفضل Liberapay لأنه مفتوح المصدر وغير ربحي. لمزيد من المعلومات حول كيفية التبرع لـ NewPipe، تفضل بزيارة [موقعنا الإلكتروني](https://newpipe.net/donate)\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"assets/liberapay_qr_code.png\" alt=\"Visitez NewPipe sur liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"assets/liberapay_donate_button.svg\" alt=\"Donnez via Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## سياسة الخصوصية\n\nيهدف مشروع NewPipe إلى توفير تجربة خاصة ومجهولة لاستخدام خدمات الوسائط المستندة إلى الويب. ولذلك، فإن التطبيق لا يجمع أي بيانات دون موافقتك. تشرح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير بالحادث أو ترك تعليق على مدونتنا. يمكنك العثور على المستند [هنا](https://newpipe.net/legal/privacy/).\n\n## رخصة\n\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)\n\nNewPipe هو برنامج مجاني: يمكنك استخدامه ودراسته ومشاركته وتحسينه كما يحلو لك. وبشكل أكثر تحديدًا، يمكنك إعادة توزيعه و/أو تعديله بموجب شروط [رخصة GNU العامة](https://www.gnu.org/licenses/gpl.html) كما نشرتها مؤسسة البرمجيات الحرة، أيًا من الإصدارين. 3 من الترخيص، أو (حسب اختيارك) أي إصدار لاحق.\n"
  },
  {
    "path": "doc/README.asm.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">এণ্ড্ৰইডৰ বাবে এটা লিব্ৰে লাইটৱেট ষ্ট্ৰীমিং ফ্ৰন্ট-এণ্ড।</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-en.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub release\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"License: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Build Status\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Translation Status\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC channel: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#স্ত্ৰীনশ্বট\">স্ক্ৰীণশ্বট</a> &bull; \n  <a href=\"#সমৰ্থিত-সেৱাসমূহ\">সমৰ্থিত সেৱাসমূহ</a> &bull; <a href=\"#বিৱৰণ\">বিৱৰণ</a> &bull; \n  <a href=\"#বৈশিষ্ট্যসমূহ\">বৈশিষ্ট্যসমূহ</a> &bull; <a href=\"#ইনষ্টল-আৰু-আপডেটসমূহ\">ইনষ্টল আৰু আপডেটসমূহ</a> &bull;\n  <a href=\"#অৱদান\">অৱদান</a> &bull;     <a href=\"#অনুদান\">অনুদান</a> &bull; \n  <a href=\"#অনুজ্ঞাপত্ৰ\">অনুজ্ঞাপত্ৰ</a></p><p align=\"center\">\n  <a href=\"https://newpipe.net\">Website</a> &bull;   <a href=\"https://newpipe.net/blog/\">Blog</a> &bull; \n  <a href=\"https://newpipe.net/FAQ/\">FAQ</a> &bull; \n  <a href=\"https://newpipe.net/press/\">Press</a></p><hr>\n\n*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)*\n\n> [!warning]\n> <b>এই এপটো নিৰ্মিয়মান অৱস্থাত আছে, গতিকে আপুনি ব্যৱহাৰ কৰোঁতে কোনো অসুবিধাৰ সন্মুখীন হ'ব পাৰে।  যদি আপুনি অসুবিধাৰ সন্মুখীন হয়, ইছ্যু টেমপ্লেট পূৰণ কৰি আমাৰ GITHUB ৰিপ'জিটৰিত এটা ইছ্যু খোলক।</b>\n>\n> <b>NEWPIPE, GOOGLE PLAY ষ্ট'ৰত ৰাখিলে তেওঁলোকৰ চৰ্ত আৰু নিয়ম উলংঘা হয়</b>\n\n## স্ত্ৰীনশ্বট\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n## সমৰ্থিত সেৱাসমূহ\n\nNewPipe এ বৰ্তমান এই সেৱাসমূহ সমৰ্থন কৰে:\n\n<!-- আমি সেৱাৰ ৱেবছাইটসমূহৰ সৈতে পৃথকে লিংক কৰোঁ যাতে মানুহে ভুলবশতঃ তেওঁলোকে নিবিচৰা ৱেবছাইট এটা খুলিব নোৱাৰে। -->\n* YouTube ([website](https://www.youtube.com/)) and YouTube Music ([website](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube))\n* PeerTube ([website](https://joinpeertube.org/)) and all its instances (তাৰ অৰ্থ কি জানিবলৈ ৱেবছাইটটো খোলক!) ([wiki](https://en.wikipedia.org/wiki/PeerTube))\n* Bandcamp ([website](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp))\n* SoundCloud ([website](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud))\n* media.ccc.de ([website](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club))\n\nআপুনি দেখাৰ দৰে, NewPipe এ একাধিক ভিডিঅ' আৰু অডিঅ' সেৱা সমৰ্থন কৰে। ই YouTube ৰ পৰা আৰম্ভ হৈছিল, বছৰ বছৰ ধৰি আন মানুহে অধিক সেৱা যোগ কৰিছে, যাৰ ফলত NewPipe আৰু অধিক বহুমুখী হৈ পৰিছে!\n\nপৰিস্থিতি আৰু ইয়াৰ জনপ্ৰিয়তাৰ বাবে, এই সেৱাসমূহৰ ভিতৰত ইউটিউব সৰ্বোত্তম সমৰ্থিত। যদি আপুনি এই অন্য কোনো সেৱা ব্যৱহাৰ কৰে বা পৰিচিত, অনুগ্ৰহ কৰি আমাক ইয়াৰ বাবে সমৰ্থন উন্নত কৰাত সহায় কৰক! আমি SoundCloud আৰু PeerTube ৰ বাবে ৰক্ষণাবেক্ষণকাৰী বিচাৰিছো।\n\nযদি আপুনি নতুন সেৱা যোগ কৰাৰ মনস্থ কৰিছে তেন্তে প্ৰথমে আমাৰ সৈতে যোগাযোগ কৰক!  অধিক তথ্যৰ বাবে  [docs](https://teamnewpipe.github.io/documentation/) আৰু [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor) চাওক।\n\n## বিৱৰণ\n\nNewPipe এ আপুনি ব্যৱহাৰ কৰা সেৱাৰ অফিচিয়েল API (যেনে PeerTube) ৰ পৰা প্ৰয়োজনীয় তথ্য আনি কাম কৰে।  যদিও আমাৰ উদ্দেশ্যৰ বাবে অফিচিয়েল API নিষিদ্ধ (যেনে YouTube), বা মালিকানাধীন, এপটোৱে ৱেবছাইটটো বিশ্লেষণ কৰে বা ইয়াৰ পৰিৱৰ্তে এটা আভ্যন্তৰীণ API ব্যৱহাৰ কৰে।  ইয়াৰ অৰ্থ হ'ল NewPipe ব্যৱহাৰ কৰিবলৈ কোনো সেৱাত একাউণ্টৰ প্ৰয়োজন নাই। লগতে, যিহেতু ই বিনামূলীয়া আৰু মুক্ত উৎস(Open Source) চফ্টৱেৰ, এপ বা এক্সট্ৰেক্টৰে কোনো মালিকানাধীন লাইব্ৰেৰী বা ফ্ৰেমৱৰ্ক ব্যৱহাৰ নকৰে, যেনে গুগল প্লে সেৱা।  অৰ্থাৎ আপুনি এনে ডিভাইচ বা কাষ্টম ৰমত NewPipe ব্যৱহাৰ কৰিব পাৰে যিবোৰত গুগল এপ ইনষ্টল কৰা হোৱা নাই। \n\n## বৈশিষ্ট্যসমূহ\n\n* 4K পৰ্যন্ত ৰিজ’লিউচনত ভিডিঅ’ চাওক\n* এপ নোখোলাকৈ অডিঅ' শুনা\n* পপআপ মোড (ফ্ল'টিং প্লেয়াৰ, ওৰফে PIP )\n* কেপচন অন/অফৰ ব্যৱস্থা\n* ভিডিঅ' আৰু অডিঅ' সন্ধান কৰক (ইউটিউবত, আপুনি বিষয়বস্তুৰ ভাষাও নিৰ্দিষ্ট কৰি দিব পাৰে)\n* ভিডিঅ'সমূহ পৰৱৰ্তী সময়ত চাবলৈ প্ৰথমে বাছনি কৰা (আৰু সিহতক স্থানীয় প্লেলিষ্ট হিচাপে সংৰক্ষণ কৰা)\n* ভিডিঅ'সমূহৰ বিষয়ে সাধাৰণ তথ্য দেখুৱা/লুকুৱা (যেনে ভিডিঅ'ৰ বিৱৰণ আৰু টেগসমূহ)\n* পৰৱৰ্তী/আগৰ ভিডিঅ'ৰ সম্পৰ্কীয় ভিডিঅ' দেখুৱা/লুকুৱা\n* মন্তব্য সমূহ দেখুৱা/লুকুৱা\n* ভিডিঅ', অডিঅ', চেনেল, প্লেলিষ্ট আৰু এলবামৰ সন্ধান কৰক\n* এটা চেনেলৰ ভিতৰত ভিডিঅ’ আৰু অডিঅ’ ব্ৰাউজ কৰা\n* চেনেল চাবস্ক্ৰাইব কৰা (কোনো একাউণ্টত লগ ইন নকৰাকৈ কৰিব পাৰিব)\n* আপুনি চাবস্ক্ৰাইব কৰা চেনেলৰ পৰা নতুন ভিডিঅ'ৰ বিষয়ে জাননী লাভ কৰা\n* চেনেলৰ গোট সৃষ্টি আৰু সম্পাদনা কৰা (সহজ ব্ৰাউজিং আৰু ব্যৱস্থাপনাৰ বাবে)\n* আপোনাৰ চেনেলৰ গোটসমূহৰ ভিডিঅ' ফিডসমূহ ব্ৰাউজ কৰা\n* আপোনাৰ ভিডিঅ' উপভোগৰ ইতিহাস চোৱা আৰু সন্ধান কৰা\n* প্লেলিষ্টসমূহৰ সন্ধান (এইবোৰ দূৰৱৰ্তী প্লেলিষ্ট, যাৰ অৰ্থ হৈছে আপুনি ব্ৰাউজ কৰা সেৱাৰ পৰা ইয়াক অনা হয়)\n* স্থানীয় প্লেলিষ্ট সৃষ্টি আৰু সম্পাদনা কৰা (এইবোৰ এপৰ ভিতৰত সৃষ্টি আৰু সংৰক্ষণ কৰা হয়, আৰু কোনো সেৱাৰ সৈতে কোনো সম্পৰ্ক নাই)\n* ভিডিঅ'/অডিঅ'/চাবটাইটেল ডাউনলোড কৰা (কেপচন)\n* যিকোনো ভিডিঅ' Kodi ত খুলিব পৰা\n* বয়স নিষিদ্ধ সামগ্ৰী চোৱা/ব্লক কৰা\n\n## ইনষ্টল আৰু আপডেটসমূহ\n\nআপুনি নিম্নলিখিত পদ্ধতিসমূহৰ এটা ব্যৱহাৰ কৰি NewPipe ইনষ্টল কৰিব পাৰিব:\n\n১) আমাৰ কাষ্টম ৰেপো F-Droid ত যোগ কৰক আৰু তাৰ পৰাই ইনষ্টল কৰক।  নিৰ্দেশনাসমূহ ইয়াত আছে:https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n\n২) [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) ৰ পৰা এপ ডাউনলোড আৰু ইনষ্টল কৰক।\n\n৩) F-Droid ৰ জৰিয়তে আপডেট কৰক।  এইটো আপডেট পোৱাৰ আটাইতকৈ লেহেমীয়া পদ্ধতি, কাৰণ F-Droid এ সকলো কাম নিজে কৰি ব্যৱহাৰকাৰীলৈ আপডেট সমূহ পঠিয়ায়।\n\n৪) নিজেই এটা Debug APK নিৰ্মাণ কৰক।\n\n৫) আপোনাৰ ডিভাইচত নতুন বৈশিষ্ট্যসমূহ পোৱাৰ এইটো আটাইতকৈ দ্ৰুত উপায়, কিন্তু ই বহুত বেছি জটিল, গতিকে আমি অন্য পদ্ধতিসমূহৰ এটা ব্যৱহাৰ কৰাৰ পৰামৰ্শ দিওঁ। যদি আপুনি ইয়াৰ নিৰ্দিষ্ট বৈশিষ্ট্য বা সমস্যা সমাধানৰ প্ৰতি আগ্ৰহী, আপুনি ইয়াৰ APK PR ৰ ভিতৰৰ পৰাও ডাউনলোড কৰিব পাৰে।  নিৰ্দেশনাৰ বাবে জনসংযোগৰ বিৱৰণ পঢ়ক।  PR APK সমূহৰ বিষয়ে ডাঙৰ কথাটো হ'ল যে ইয়াক অফিচিয়েল এপৰ সৈতে একেলগে ইনষ্টল কৰা হয়, যাতে আপুনি আপোনাৰ ডাটা হেৰুৱাব বা একো গোলমাল কৰাৰ চিন্তা কৰিব নালাগে।\nআমি বেছিভাগ ব্যৱহাৰকাৰীৰ বাবে পদ্ধতি ১ ৰ পৰামৰ্শ দিওঁ।  পদ্ধতি 1 বা 2 ব্যৱহাৰ কৰি সংস্থাপন কৰা APKসমূহ ইটোৱে সিটোৰ সৈতে সুসংগত (অৰ্থাৎ যদি আপুনি পদ্ধতি 1 বা 2 ব্যৱহাৰ কৰি NewPipe ইনষ্টল কৰিছে, আপুনি অন্যটো ব্যৱহাৰ কৰি NewPipe আপডেট কৰিব পাৰে), কিন্তু পদ্ধতি 3 ব্যৱহাৰ কৰি সংস্থাপন কৰাসমূহৰ সৈতে নহয় কিয়নো ১ আৰু ২ ৰ বাবে একেটা স্বাক্ষৰ ব্যৱহাৰ কৰা হৈছে, কিন্তু এটা ভিন্ন স্বাক্ষৰ (F-Droid's) 3 ৰ বাবে ব্যৱহাৰ কৰা হৈছে। পদ্ধতি ৪ ব্যৱহাৰ কৰি এটা ডিবাগ APK নিৰ্মাণ কৰিলে এটা স্বাক্ষৰ সম্পূৰ্ণৰূপে পৃথক হৈ পৰে।  চাইনিং চাবি সমূহে নিশ্চিত কৰাত সহায় কৰে যে এজন ব্যৱহাৰকাৰীয়ে এটা এপৰ বিপদজনক আপডেট ইনষ্টল কৰা নাই।  পদ্ধতি ৫ ব্যৱহাৰ কৰাৰ সময়ত, প্ৰতিটো APK, GitHub Actions দ্বাৰা যোগান ধৰা এটা ভিন্ন যাদৃচ্ছিক চাবিৰ সৈতে স্বাক্ষৰিত হয়, গতিকে আপুনি ইয়াক আপডেটো কৰিব নোৱাৰে।  আপুনি প্ৰতিবাৰেই এটা নতুন APK ব্যৱহাৰ কৰিব বিচৰাৰ সময়ত এপ ডাটা বেকআপ আৰু পুনৰুদ্ধাৰ কৰিব লাগিব।\n\n ইয়াৰ মাজতে, যদি আপুনি কোনো কাৰণত উৎস সলনি কৰিব বিচাৰে (যেনে NewPipe ৰ মূল কাৰ্য্যকৰীতা বিচ্ছিন্ন হয় আৰু F-Droid ৰ শেহতীয়া আপডেট লাভ কৰা নাই), আমি এই পদ্ধতি অনুসৰণ কৰিবলৈ পৰামৰ্শ দিওঁ:\n\n১)Settings > Backup and Restore > Export Database ৰ জৰিয়তে ভিডিঅ' উপভোগৰ ইতিহাস, প্লেলিষ্ট আদি ৰপ্তানি কৰক।\n\n২)NewPipe আনইনষ্টল কৰক।\n\n৩)নতুন উৎসৰ পৰা APK ডাউনলোড কৰি ইনষ্টল কৰক\n\n৪)Settings > Backup and Restore > Import Database যোগেদি তথ্য আমদানি কৰক<b>\n\nটোকা: যেতিয়া আপুনি এটা ডাটাবেছ অফিচিয়েল এপলৈ আমদানি কৰে, সদায় নিশ্চিত কৰক যে সেইটো আপুনি অফিচিয়েল এপৰ পৰা ৰপ্তানি কৰাটোৱেই।  যদি আপুনি অফিচিয়েল এপৰ বাহিৰে অন্য এটা APK ৰ পৰা ৰপ্তানি কৰা ডাটাবেছ আমদানি কৰে, ই এপটো অক্ষম কৰি ব পাৰে।  এনে কাৰ্য্য সমৰ্থিত নহয়, আৰু আপুনি তেতিয়াহে তেনে কৰা উচিত যেতিয়া আপুনি সম্পূৰ্ণ নিশ্চিত যে আপুনি কি কৰি আছে সেয়া জানে।</b>\n\n## অৱদান\n\nআপোনাৰ ধাৰণা, অনুবাদ, ডিজাইন পৰিবৰ্তন, ক'ড পৰিষ্কাৰ কৰা, বা আনকি ডাঙৰ ক'ড পৰিৱৰ্তন হওক, সহায় সদায় আদৰণীয়। প্ৰতিটো অৱদানৰ লগে লগে এপটো ভাল হৈ পৰে, যিমানেই ডাঙৰ বা সৰু নহওক কিয়! যদি আপুনি জড়িত হ'ব বিচাৰে তেন্তে চাওক আমাৰ [অবদানৰ টোকা সমূহ](/.github/CONTRIBUTING.md).<a href=\"https://hosted.weblate.org/engage/newpipe/\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Translation status\" /></a>\n\n## অনুদান\n\nযদি আপুনি NewPipe ভাল পায় তেন্তে অনুদান প্ৰেৰণ কৰিব পাৰে।  আমি Liberapay পছন্দ কৰো, কাৰণ ই মুক্ত উৎস(Open Source) আৰু অলাভজনক(Non-profit) দুয়োটা।  NewPipe লৈ দান দিয়াৰ বিষয়ে অধিক তথ্যৰ বাবে অনুগ্ৰহ কৰি আমাৰ  [ৱেবচাইট](https://newpipe.net/donate) চাওক.\n\n<table>  \n  <tr>    \n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>    \n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"Visit NewPipe at liberapay.com\" width=\"100px\"></a></td>    \n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Donate via Liberapay\" height=\"35px\"></a></td>  \n  </tr> \n</table>\n\n## গোপনীয়তা নীতি\n\nনিউপাইপ প্ৰকল্পৰ লক্ষ্য হৈছে ৱেব-ভিত্তিক মিডিয়া সেৱা ব্যৱহাৰৰ বাবে এক ব্যক্তিগত অভিজ্ঞতা প্ৰদান কৰা।  গতিকে আপোনাৰ সন্মতি অবিহনে এপটোৱে কোনো তথ্য সংগ্ৰহ নকৰে।  NewPipe ৰ গোপনীয়তা নীতিয়ে বিতংভাৱে ব্যাখ্যা কৰে যেতিয়া আপুনি এটা ক্ৰেচ লগ প্ৰেৰণ কৰে, বা আমাৰ ব্লগত এটা মন্তব্য দিয়ে। আপুনি [ইয়াত](https://newpipe.net/legal/privacy/) নথিখন চাব পাৰে।\n\n## অনুজ্ঞাপত্ৰ\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe হৈছে বিনামূলীয়া চফ্টৱেৰ: আপুনি ইয়াক ইচ্ছামতে ব্যৱহাৰ, অধ্যয়ন, চেয়াৰ আৰু উন্নত কৰিব পাৰে। বিশেষভাৱে আপুনি ইয়াক মুক্ত চফ্টৱেৰ(Open Source) ফাউণ্ডেচনে প্ৰকাশ কৰাৰ দৰে  [GNU General Public License](https://www.gnu.org/licenses/gpl.html)ৰ চৰ্তসমূহৰ অধীনত পৰিবৰ্তন কৰিব পাৰিব(অনুজ্ঞাৰ সংস্কৰণ ৩, বা যিকোনো পৰৱৰ্তী সংস্কৰণ।\n"
  },
  {
    "path": "doc/README.de.md",
    "content": "<h3 align=\"center\">Wir sind im Prozess, größere Teile unseres Codes <i>neuzuschreiben</i>, um eine <a href=\"https://github.com/TeamNewPipe/NewPipe/discussions/10118\">moderne und stabile</a> NewPipe App zu kreieren! Du kannst nightly builds <a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\">hier</a> herunterladen.</h3>\n<h4 align=\"center\">Bitte nutze den <code>refactor</code> branch als Arbeitsgrundlage, wenn du <i>neue Funktionen</i> beitragen willst. Die aktuelle Codebase ist im reinen Maintenance mode und bekommt nur noch <i>Fehlerbehebungen</i>.</h4>\n\n<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">Eine freie, offene und leichtgewichtige Streaming App für Android.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-de.svg\" alt=\"Hole es dir auf F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub Release\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"Lizenz: GPLv3\"><img src=\"https://img.shields.io/badge/Lizenz-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Status des Builds\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Übersetzt\"><img src=\"https://hosted.weblate.org/widgets/newpipe/de/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC Chat: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20Chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshots\">Screenshots</a> &bull; <a href=\"#unterstützte-dienste\">Unterstützte Dienste</a> &bull; <a href=\"#beschreibung\">Beschreibung</a> &bull; <a href=\"#features\">Features</a> &bull; <a href=\"#installation-und-updates\">Installation und Updates</a> &bull; <a href=\"#beitrag\">Beitrag</a> &bull; <a href=\"#spenden\">Spenden</a> &bull; <a href=\"#lizenz\">Lizenz</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Website</a> &bull; <a href=\"https://newpipe.net/blog/\">Blog</a> &bull; <a href=\"https://newpipe.net/FAQ/\">FAQ</a> &bull; <a href=\"https://newpipe.net/press/\">Über NewPipe</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>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.</b>\n>\n> <b>NEWPIPE, ODER JEGLICHEN FORK DAVON, IM GOOGLE PLAYSTORE ANZUBIETEN, VERLETZT DESSEN GESCHÄFTSBEDINGUNGEN.</b>\n\n## Screenshots\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n## Unterstützte Dienste\n\nAktuell unterstützt NewPipe die folgenden Dienste:\n\n<!-- Um das versehentliche Öffnen einer Webseite zu verhindern, werden diese separat verlinkt. -->\n* YouTube ([Webseite](https://www.youtube.com/)) und YouTube Music ([Webseite](https://music.youtube.com/)) ([Wiki](https://en.wikipedia.org/wiki/YouTube))\n* PeerTube ([Webseite](https://joinpeertube.org/)) sowie all seine *Instanzen* (öffne die Webseite um herauszufinden was das bedeutet!) ([Wiki](https://en.wikipedia.org/wiki/PeerTube))\n* Bandcamp ([Webseite](https://bandcamp.com/)) ([Wiki](https://en.wikipedia.org/wiki/Bandcamp))\n* SoundCloud ([Webseite](https://soundcloud.com/)) ([Wiki](https://en.wikipedia.org/wiki/SoundCloud))\n* media.ccc.de ([Webseite](https://media.ccc.de/)) ([Wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club))\n\nNewPipe 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!\n\nTeils 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.\n\nFalls 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.\n\n## Beschreibung\n\nNewPipe 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.\n\nDa 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.\nNewPipe kann also unproblematisch auf Geräten und Custom ROMs benutzt werden, die keine Google Apps installiert haben.\n\n### Features\n\n* Sieh dir Videos mit einer Auflösung von bis zu 4K an\n* Höre Audio im Hintergrund, wodurch nur der Audio Stream geladen wird, um Daten zu sparen\n* Popup Modus (\"schwebender Player\", auch bekannt als Picture-in-Picture)\n* Schaue Live Streams\n* Ein- und Ausblenden von Untertitel\n* Suche nach Videos und Musik (bei YouTube kann zusätzlich die Sprache des Inhalts festgelegt werden)\n* Warteschlangen für Videos (speichere sie optional als lokale Playlists)\n* Ein- und Ausblenden von allgemeinen Information über die Videos (z.B. Beschreibung und Tags)\n* Ein- und Ausblenden von nächsten/ähnlichen Videos\n* Ein- und Ausblenden der Kommentarsektion\n* Suche Videos, Musik, Kanäle, Playlists und Alben\n* Durchsuche Videos und Musik innerhalb eines Kanals\n* Abonniere Kanäle (ja, ohne sich mit einem Account anzumelden!)\n* Bekomme Benachrichtigungen für neue Videos von Kanälen, die du abonniert hast\n* Erstelle und bearbeite Gruppen von Kanälen (um das Durchsuchen und Organisieren zu vereinfachen)\n* Durchsuche Video Feeds, die aus deinen Kanalgruppen entstehen\n* Schaue dir deinen Verlauf an und durchsuche ihn\n* Suche und schaue dir Playlists an (Es handelt sich um „Remote Playlists“, die also vom Dienst abgerufen werden, den du gerade durchsuchst)\n* Erstelle und bearbeite lokale Playlists (diese werden lediglich in der App gespeichert, also nicht im jeweiligen Dienst!)\n* Nutze Videos/Audio/Untertitel offline\n* Mit Kodi Medien öffnen\n* Schaue oder blockiere altergeschützten Inhalt\n\n## Installation und Updates\nNewPipe kann über einer der folgenden Methoden installiert werden:\n 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/\n 2. Lade die APK direkt von den [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) herunter und installiere es manuell.\n 3. Updates via F-Droid.\n 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.\n 4. Erstelle selbst die APK.\n Das ist die beste Methode, um neue Features schnellstmöglich zu bekommen, aber auch sehr kompliziert und umständlich.\n Wir raten dir daher zu einer der anderen Methoden.\n 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.\n 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.\n Du musst also nicht fürchten, dass deine Daten verloren gehen oder irgendetwas kaputt geht.\n\nFür die meisten Benutzer empfehlen wir die erste Methode.\nAPKs, 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.\nDas liegt daran, dass Methode 1 und 2 den gleichen Signierschlüssel benutzen (unseren), während Methode 3 einen anderen benutzt (den von F-Droid).\nEine mit Methode 4 gebaute Debug APK benutzt überhaupt gar keinen Schlüssel.\nDas Signieren mit Schlüssel hilft, zu verhindern, dass Benutzer dazu verleitet werden, bösartige Updates zu installieren.\nBei Methode 5 wird für jede APK ein zufälliger Signierschlüssel von GitHub Actions generiert, d.h. Updates sind unmöglich.\nBei jeder neuen APK Installation muss ein Backup gemacht werden und die Daten wiederhergestellt werden.\n\nFalls 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:\n1. Mache ein Back-up über _Einstellungen > Inhalt > Datenbank exportieren_, damit dein Verlauf, deine Abos und Playlists nicht verloren gehen\n2. Deinstalliere NewPipe\n3. Lade die APK von der neuen Quelle herunter und installiere sie\n4. Importiere die Daten aus Schritt 1 über _Einstellungen > Inhalt > Datenbank importieren_\n\n<!-- What is an unsupported app anyway? -->\n<b>Hinweis: Wenn du eine Datenbank in die offizielle App importierst, stelle sicher, dass sie _von_ der offiziellen App exportiert wurde.\nWenn du eine Datenbank aus einer nicht offiziellen APK importierst, können Dinge kaputt gehen.\nSo eine Aktion wird nicht unterstützt und du solltest sie nur in Erwägung ziehen, wenn du weißt, was du tust.</b>\n\n\n## Beitrag\nEgal ob du neue Ideen, Übersetzungen, Designvorschläge, kleine Code-Bereinigungen, oder sogar große Code-Verbesserungen hast, jegliche Unterstützung ist immer gern gesehen.\nDie App wird mit _jedem_ Beitrag besser und besser - egal wie viel Arbeit in ihn gesteckt wird!\nWenn du dich einbringen willst, sieh dir die [Beitragshinweise](/.github/CONTRIBUTING.md) an.\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/de/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/de/287x66-grey.png\" alt=\"Übersetzt\" />\n</a>\n\n## Spenden\nWenn dir NewPipe gefällt, kannst du uns gerne durch eine Spende unterstützen.\nWir bevorzugen Liberapay, da es sowohl quelloffen als auch nicht gewinnorientiert ist.\nFür weitere Informationen über Spenden an NewPipe, besuche unsere [Website](https://newpipe.net/donate).\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"Gehe zu NewPipe auf liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Spenden mit Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Privacy Policy\n\nDas NewPipe Projekt hat zum Ziel, eine private und anonyme Benutzung von Web-basierten Medien-Dienste zu ermöglichen.\nDaher sammelt die App keinerlei Daten ohne deine Zustimmung.\nNewPipe'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.\nDu findest das Dokument [hier](https://newpipe.net/legal/privacy/).\n\n## Lizenz\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.de.html)  \n\nNewPipe ist freie Software: Du kannst es nach Belieben benutzen, studieren, teilen, und verbessern.\nDu 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.\n"
  },
  {
    "path": "doc/README.es.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p>\n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">Una interfaz de streaming ligera y libre para Android.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-es.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"Lanzamientos GitHub\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"Licencia: GPLv3\"><img src=\"https://img.shields.io/badge/Licencia-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Estado del Build\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/es/\" alt=\"Estado de la Traducción\"><img src=\"https://hosted.weblate.org/widgets/newpipe/es/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"Canal de IRC: #newpipe\"><img src=\"https://img.shields.io/badge/Canal%20de%20IRC%20-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n\n<p align=\"center\"><a href=\"#capturas-de-pantalla\">Capturas de Pantalla</a> &bull; <a href=\"#descripción\">Descripción</a> &bull; <a href=\"#características\">Características</a> &bull; <a href=\"#instalación-y-actualizaciones\">Instalación y Actualizaciones</a> &bull; <a href=\"#contribución\">Contribución</a> &bull; <a href=\"#donar\">Donar</a> &bull; <a href=\"#licencia\">Licencia</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Sitio Web</a> &bull; <a href=\"https://newpipe.net/blog/\">Blog</a> &bull; <a href=\"https://newpipe.net/FAQ/\">Preguntas Frecuentes</a> &bull; <a href=\"https://newpipe.net/press/\">Prensa</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>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.</b>\n>\n> <b>COLOCAR NEWPIPE O CUALQUIER FORK DE NEWPIPE EN LA GOOGLE PLAY STORE VIOLARÁ SUS TÉRMINOS Y CONDICIONES.</b>\n\n## Capturas de Pantalla\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n## Descripción\n\nNewPipe no usa ninguna librería del framework de Google, ni la API de YouTube. Los sitios web solamente se analizan para extraer la información requerida, por lo que esta app se puede usar sin los servicios de Google instalados. Además, no se necesita una cuenta de YouTube para usar NewPipe, que es un programa libre <i lang=\"en\">copyleft</i>.\n\n### Características\n\n* Buscar videos\n* No requiere inicio de sesión\n* Mostrar información general sobre videos\n* Mirar videos de YouTube\n* Modo de solo audio en videos de YouTube\n* Modo pop-up (reproductor flotante)\n* Elegir un reproductor de video externo para mirar videos\n* Descargar videos\n* Descargar solo audio\n* Abrir videos en Kodi\n* Mostrar videos próximos/relacionados\n* Buscar a través de YouTube en un idioma específico\n* Mirar/Bloquear videos restringidos por edad\n* Mostrar información general sobre canales\n* Buscador de canales\n* Mirar videos de un canal\n* Soporte Orbot/Tor (todavía no directamente)\n* Soporte para videos en 1080p/2K/4K\n* Historial de videos vistos\n* Suscripción a canales\n* Historial de búsquedas\n* Buscar/Mirar listas de reproducción\n* Mirar listas de reproducción en cola\n* Poner videos en cola\n* Listas de reproducción locales\n* Subtítulos\n* Soporte para transmisiones en vivo\n* Mostrar comentarios\n\n### Servicios Soportados\n\nNewPipe soporta varios servicios. Nuestras [documentaciones](https://teamnewpipe.github.io/documentation/) ofrecen más información sobre cómo se puede agregar un servicio nuevo a la app y al extractor. Por favor ponte en contacto con nosotros si tienes pensado agregar uno nuevo. Actualmente los servicios soportados son:\n\n* YouTube\n* SoundCloud \\[beta\\]\n* media.ccc.de \\[beta\\]\n* PeerTube instances \\[beta\\]\n* Bandcamp \\[beta\\]\n\n## Instalación y Actualizaciones\n\nSe puede instalar NewPipe usando uno de los métodos siguientes:\n\n 1. Agregando nuestro repositorio personalizado a F-Droid e instalarlo desde allí. Las instrucciones están [aquí](https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/).\n 2. Descargando el archivo APK de [aquí](https://github.com/TeamNewPipe/NewPipe/releases) y posteriormente instalarlo.\n 3. Usando el repositorio oficial de F-Droid. Este es el método más lento para obtener actualizaciones, ya que F-Droid debe reconocer los cambios, construir el APK aparte, firmarlo con una clave, y finalmente publicar la actualización.\n 4. Construyendo la app usted mismo. Este es el modo más rápido para obtener nuevas características en su dispositivo, pero es mucho más complicado, así que recomendamos uno de los otros métodos.\n\nRecomendamos el método 1 para la mayoría de usuarios. Los APKs instalados usando método 1 y 2 son compatibles entre sí, pero no lo son con los instalados usando el método 3. Esto es debido a la clave de firmado, ya que los métodos 1 y 2 usan la misma clave (la nuestra), pero el método 3 usa una clave diferente (la de F-Droid). El método 4 excluye totalmente una clave de firmado. Las claves de firmado aseguran que el usuario no esté siendo engañado para instalar/actualizar una APK maliciosa.\n\nAdemás, si quiere cambiar el método de instalación por alguna razón (por ejemplo: la funcionalidad del núcleo de NewPipe se rompe o F-Droid aún no publica la actualización), recomendamos el siguiente procedimiento:\n1. Respalde su información a través de Ajustes > Contenido > Exportar base de datos; esto guardará su historial (videos vistos y búsquedas), suscripciones, listas de reproducción y ajustes.\n2. Desinstale NewPipe.\n3. Descargue el APK con un método distinto e instálelo.\n4. Importe la información (la base de datos extraída del paso 1) a través de Ajustes > Contenido > Importar base de datos. Tenga en cuenta que esta opción superpondrá su historial actual (tanto de vídeos como de búsquedas), sus listas de reproducción y (opcionalmente) sus configuraciones.\n\n## Contribución\n\nSi tiene ideas, traducciones, cambios de diseño, limpieza de código o cambios grandes de código, su ayuda es siempre bienvenida. ¡Cuanto más hagamos, NewPipe será mucho mejor!\n\nSi quiere involucrarse, fíjese en nuestras [notas de contribución](../.github/CONTRIBUTING.md).\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/es/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/es/287x66-grey.png\" alt=\"Estado de la Traducción\" />\n</a>\n\n## Donar\nSi 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.\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"Visita NewPipe en liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Dona vía Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Política de Privacidad\n\nEl proyecto NewPipe tiene como objetivo ofrecer una experience privada y anónima al usar servicios web multimedia. Por lo tanto, la app no recoleta ningún tipo de información sin su consentimiento. La politica de privacidad de NewPipe explica en detalle qué información es enviada y almacenada cuando envía un informe de error o comenta en [nuestro blog](https://newpipe.net/blog/). Puede encontrar el documento [aquí](https://newpipe.net/legal/privacy/).\n\n## Licencia\n\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.html)\n\nNewPipe es Software Libre: Puede usarlo, estudiarlo, compartirlo y mejorarlo a su voluntad. Más específicamente, puede redistribuirlo y/o modificarlo bajo los términos de la [GNU General Public License](https://www.gnu.org/licenses/gpl.html) publicada por la Free Software Foundation tanto si usa la versión 3 o posterior de la licencia.\n"
  },
  {
    "path": "doc/README.fr.md",
    "content": "<h3 align=\"center\">Nous prévoyons de <i>réécrire</i> une large partie de code, afin de créer <a href=\"https://github.com/TeamNewPipe/NewPipe/discussions/10118\">un NewPipe encore plus moderne et stable</a>!</h3>\n<h4 align=\"center\">Prière de ne pas ouvrir de nouvelles pull-up requêtes contenant de <i>nouvelles fonctionnalités</i>. Seules les corrections de bugs seront acceptées.</h4>\n\n<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">Un front-end de streaming libre et léger pour Android.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-fr.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub release\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"License: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Build Status\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Translation Status\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC channel: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#captures-décran\">Captures d'écran</a> &bull; <a href=\"#services-supportés\">Services Supportés</a> &bull; <a href=\"#description\">Description</a> &bull; <a href=\"#fonctionnalités\">Fonctionnalités</a> &bull; <a href=\"#installation-et-mises-à-jour\">Installation et mises à jour</a> &bull; <a href=\"#contribuer\">Contribuer</a> &bull; <a href=\"#dons\">Dons</a> &bull; <a href=\"#licence\">Licence</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Site</a> &bull; <a href=\"https://newpipe.net/blog/\">Blog</a> &bull; <a href=\"https://newpipe.net/FAQ/\">FAQ</a> &bull; <a href=\"https://newpipe.net/press/\">Presse</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>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.</b>\n>\n> <b>AJOUTER NEWPIPE, OU N'IMPORTE QUEL FORK DE NEWPIPE, SUR LE GOOGLE PLAY STORE ENFREINT LEURS CONDITIONS D'UTILISATION</b>\n\n## Captures d'écran\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n### Services supportés\n\nNewPipe supporte actuellement ces services:\n\n<!-- We link to the service websites separately to avoid people accidentally opening a website they didn't want to. -->\n* YouTube ([site web](https://www.youtube.com/)) et YouTube Music ([site web](https://music.youtube.com/)) ([wiki](https://fr.wikipedia.org/wiki/YouTube))\n* 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))\n* Bandcamp ([site web](https://bandcamp.com/)) ([wiki](https://fr.wikipedia.org/wiki/Bandcamp))\n* SoundCloud ([site web](https://soundcloud.com/)) ([wiki](https://fr.wikipedia.org/wiki/SoundCloud))\n* media.ccc.de ([site web](https://media.ccc.de/)) ([wiki](https://fr.wikipedia.org/wiki/Chaos_Computer_Club))\n\nComme 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 !\n\nGrace 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.\n\nSi 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).\n\n## Description\n\nNewPipe 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.\n\nDe 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.\n\n### Fonctionnalités\n\n* Regarder des vidéos à des résolutions allant jusqu'à la 4K\n* Écouter de l'audio en arrière-plan, en ne chargant que le flux audio pour économiser des données\n* Mode Popup (lecteur floattant, aka Picture-in-Picture)\n* Regarder des diffusions en direct\n* Afficher/masquer les sous-titres\n* Chercher des vidéos et des audios (sur Youtube, vous pouvez également spécifier la langue du contenu)\n* Mettre en file d'attente les vidéos (et éventuellement les enregistrer en tant que listes de lecture locales)\n* Afficher/cacher les informations générales à propos des vidéos (comme la description et les tags)\n* Afficher/cacher les vidéos suivantes ou en relation\n* Afficher/cacher les commentaires\n* Chercher des vidéos, des audios, des chaînes, des listes de lecture et des albums\n* Parcourir les vidéos et les audios d'une chaîne\n* S'abonner à des chaînes (oui, sans avoir besoin de se connecter à un compte !)\n* Recevoir des notifications sur les nouvelles vidéos des chaînes auxquelles vous êtes abonnés.\n* Créer et modifier des groupes de chaînes (pour une gestion et une navigation plus simples)\n* Parcourir des fils de vidéos générés depuis vos groupes de chaînes\n* Voir et rechercher dans votre historique de visionnage\n* 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)\n* 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)\n* Télécharger des vidéos/de l'audio/des sous-titres\n* Lire dans Kodi\n* Regarder/bloquer du contenu restreint en fonction de l'âge\n\n<!-- Hidden span to keep old links compatible. You should remove this span if you're translating the README into another language.-->\n<span id=\"updates\"></span>\n\n## Installation et mises à jour\nVous pouvez installer NewPipe en utilisant l'une de ces méthodes:\n 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/\n 2. Téléchargez l'APK depuis les [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) et l'installer.\n 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.\n 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.\n 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.\n\nNous 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.\n\nEntre 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 :\n1. 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.\n2. Désinstallez NewPipe\n3. Téléchargez l'APK depuis la nouvelle source et installez le.\n4. Restaurez les données de l'étape 1 via Settings > Content > Import Database\n\n<b>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</b>\n\n## Contribuer\n\nQue 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).\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Translation status\" />\n</a>\n\n## Dons\nSi 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)\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"assets/liberapay_qr_code.png\" alt=\"Visitez NewPipe sur liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"assets/liberapay_donate_button.svg\" alt=\"Donnez via Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Politique de confidentialité\n\nLe 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/).\n\n## Licence\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe 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.\n"
  },
  {
    "path": "doc/README.hi.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \r\n<h2 align=\"center\"><b>NewPipe</b></h2>\r\n<h4 align=\"center\">Android के लिए एक ओपन सोर्स, हल्का YouTube ऐप।</h4>\r\n\r\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-hi.svg\" alt=\"इसे F-Droid पर पाएँ\" width=206/></a></p>\r\n\r\n<p align=\"center\">\r\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub प्रकाशन\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\r\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\r\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\r\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"लाइसेंस: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\r\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"बिल्ड की स्थिति\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\r\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"अनुवाद की स्थिति\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\r\n</p>\r\n\r\n<p align=\"center\">\r\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC चैनल: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\r\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\r\n</p>\r\n\r\n<hr>\r\n<p align=\"center\"><a href=\"#ऐप-कैसी-दिखती-है\">ऐप कैसी दिखती है</a> &bull; <a href=\"#समर्थित-सेवाएँ\">समर्थित सेवाएँ</a> &bull; <a href=\"#विवरण\">विवरण</a> &bull; <a href=\"#सुविधाएँ\">सुविधाएँ</a> &bull; <a href=\"#स्थापित-करना-और-अपडेट-करना\">स्थापित करना और अपडेट करना</a> &bull; <a href=\"#योगदान-करें\">योगदान करें</a> &bull; <a href=\"#आर्थिक-योगदान-करें\">आर्थिक योगदान करें</a> &bull; <a href=\"#लाइसेंस\">लाइसेंस</a></p>\r\n<p align=\"center\"><a href=\"https://newpipe.net\">वेबसाइट</a> &bull; <a href=\"https://newpipe.net/blog/\">ब्लॉग</a> &bull; <a href=\"https://newpipe.net/FAQ/\">साधारण सवाल-जवाब</a> &bull; <a href=\"https://newpipe.net/press/\">प्रेस</a></p>\r\n<hr>\r\n\r\n*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)*\r\n\r\n> [!warning]\r\n> <b>यह एक बीटा संस्करण है, तो अगर आपको इसमें बग्स नज़र आते हैं, कृपया हमारे GitHub रिपॉज़िटरी के ज़रिए एक समस्या खोल दें।</b>\r\n>\r\n> <b>NewPipe या इसके किसी फोर्क को Google Play Store पर डालने पर Store के नियमों और शर्तों का उल्लंघन होता है।</b>\r\n\r\n## ऐप कैसी दिखती है\r\n\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\r\n<br/><br/>\r\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\r\n\r\n## समर्थित सेवाएँ\r\n\r\nन्यूपाइप वर्तमान में इन सेवाओं का समर्थन करता है:\r\n\r\n<!-- हम सेवा वेबसाइटों को अलग से लिंक करते हैं ताकि लोग गलती से ऐसी वेबसाइट न खोल लें जिसे वे खोलना नहीं चाहते। -->\r\n* YouTube ([वेबसाइट](https://www.youtube.com/)) and YouTube Music ([वेबसाइट](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube))\r\n* PeerTube ([वेबसाइट](https://joinpeertube.org/)) और इसके सभी इंसटैंस (इसका क्या अर्थ है यह जानने के लिए वेबसाइट खोलें!) ([wiki](https://en.wikipedia.org/wiki/PeerTube))\r\n* Bandcamp ([वेबसाइट](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp))\r\n* SoundCloud ([वेबसाइट](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud))\r\n* media.ccc.de ([वेबसाइट](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club))\r\n\r\nजैसा कि आप देख सकते हैं, न्यूपाइप कई वीडियो और ऑडियो सेवाओं का समर्थन करता है। इसकी शुरुआत YouTube से हुई, लेकिन पिछले कुछ वर्षों में अन्य लोगों ने अन्य सेवाएँ जोड़ी हैं, जिससे न्यूपाइप और भी बहुमुखी बन गया है!\r\n\r\nपरिस्थितियों और लोकप्रियता के कारण, YouTube इन सेवाओं में से सबसे अच्छा समर्थित है। यदि आप इनमें से किसी भी अन्य सेवा का उपयोग करते हैं या उससे परिचित हैं, तो कृपया उनके लिए समर्थन को बेहतर बनाने में हमारी सहायता करें! हम SoundCloud और PeerTube के लिए मेंटेनरज़ की तलाश कर रहे हैं।\r\n\r\nयदि आप कोई नई सेवा जोड़ना चाहते हैं, कृपया पहले हमसे संपर्क करें! हमारे [प्रलेख](https://teamnewpipe.github.io/documentation/) में यह बताया गया है कि ऐप और  [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor) में एक नई सेवा कैसे जोड़ी जा सकती है।\r\n\r\n## विवरण\r\n\r\nNewPipe ना ही किसी Google फ्रेमवर्क लाइब्रेरी, और ना ही YouTube के API का इस्तेमाल करता है। इस ऐप को चलाने के लिए सिर्फ वेबसाइट्स से जानकारी प्राप्त करने की ज़रूरत है, तो इस ऐप का इस्तेमाल उन डिवाइसों पर भी किया जा सकता है जिनपर Google की सेवाएँ स्थापित नहीं हैं। और NewPipe जैसे कॉपीलेफ्ट किए गए मुक्त सॉफ़्टवेयर का इस्तेमाल करने के लिए आपको YouTube खाते की ज़रूरत नहीं।\r\n\r\n## सुविधाएँ\r\n\r\n* वीडियो खोजें\r\n* खाते की ज़रूरत नहीं\r\n* वीडियो के बारे में साधारण जानकारी पाएँ\r\n* YouTube के वीडियो देखें\r\n* YouTube के वीडियो सुनें\r\n* वीडियो देखते हुए दूसरे ऐप्स का इस्तेमाल करें (फ़्लोटिंग प्लेयर)\r\n* वीडियो देखने के लिए स्ट्रीम करने का प्लेयर चुनें\r\n* वीडियो डाउनलोड करें\r\n* सिर्फ ऑडियो डाउनलोड करें\r\n* Kodi में वीडियो को खोलें\r\n* अगले/संबंधित वीडियो देखें\r\n* YouTube को किसी विशिष्ट भाषा में खोजें\r\n* उम्र से जुड़ी पाबंदी वाले वीडियो देखें/छिपाएँ\r\n* चैनलों के बारे में साधारण जानकारी पाएँ\r\n* चैनल खोजें\r\n* किसी विशिष्ट चैनल से वीडियो देखें\r\n* Orbot/Tor के साथ चलाएँ (मुश्किलें आ सकती हैं)\r\n* 1080p/2K/4K में देखें\r\n* ऐप आपके देखे गए वीडियो याद रखेगी\r\n* चैनलों पर सदस्यता लें\r\n* देखे गए वीडियो खोजें\r\n* प्लेलिस्ट्स खोजें/देखें\r\n* प्लेलिस्ट्स को सूची में जोड़कर देखें\r\n* वीडियों को सूची में डालें\r\n* खुदकी प्लेलिस्ट्स बनाएँ\r\n* उपशीर्षक\r\n* लाइवस्ट्रीम देखें\r\n* वीडियो पे टिप्पणियाँ देखें\r\n\r\n## स्थापित करना और अपडेट करना\r\nआप इनमें से किसी एक तरीके से NewPipe को स्थापित कर सकते हैं:\r\n 1. हमारे अपने रिपॉज़िटरी को F-Droid पर जोड़ें और उसे वहाँ से स्थापित करें। अनुदेश यहाँ हैं: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\r\n 2. [GitHub प्रकाशन](https://github.com/TeamNewPipe/NewPipe/releases) से APK डाउनलोड करें और उसे स्थापित करें।\r\n 3. F-Droid के ज़रिए अपडेट करें। यह अपडेट करने का सबसे धीमा तरीका है, क्योंकि पहले F-Droid को बदलाव पहचानने होंगे, फिर वह APK बनाएगा, उसपर हस्ताक्षर करेगा, और आखिर में उपयोगकर्ताओं को अपडेट पुश करेगा।\r\n 4. अपने आप एक डीबग APK बनाएँ। यह अपडेट पाने का सबसे तेज़ तरीका है, मगर यह काफ़ी कठिन है, तो हम सलाह देंगे कि आप किसी दूसरे तरीके का इस्तेमाल करें।\r\n \r\nज़्यादातर उपयोगकर्ताओं के लिए पहला तरीका ठीक है। पहले और दूसरे तरीके से स्थापित APK एक-दूसरे के अनुकूल हैं, मगर तीसरे तरीके से स्थापित APK से नहीं। ऐसा इसलिए है क्योंकि पहले और दूसरे तरीके में एक ही (हमारे) हस्ताक्षर कुँजी का इस्तेमाल हुआ है, मगर तीसरे तरीके में दूसरे (F-Droid के) हस्ताक्षर कुँजी का इस्तेमाल किया जाता है। चौथे तरीके से अपना डीबग APK फ़ाइल बनाने पर कुँजी की ज़रूरत ही नहीं पड़ती। कुँजियों से यह निश्चित किया जाता है कि उपयोगकर्ता कहीं ऐप पर कोई दुर्भावनापूर्ण अपडेट तो स्थापित नहीं कर रहा।\r\n\r\nइस दौरान अगर आप स्रोत बदलना चाहते हैं (मान लीजिए NewPipe की मूल सुविधा खराब हो गई और F-Droid पर कोई अपडेट नहीं आया है), हम इस अनुदेश का इस्तेमाल करने की सलाह देंगे:\r\n1. सेटिंग्स > बैकअप और रिस्टोर > डेटाबेस निर्यात करें — इसके ज़रिए अपने डेटा को बैकअप कर लें ताकि आपके पास अपने देखे गए वीडियो, सदस्यताएँ और प्लेलिस्ट्स हो\r\n2. NewPipe को डिवाइस से हटाएँ\r\n3. नए स्रोत से APK डाउनलोड करें और उसे स्थापित करें\r\n4. सेटिंग्स > बैकअप और रिस्टोर > डेटाबेस आयात करें — इसके ज़रिए पहले चरण के डेटा को आयात करें\r\n\r\n<b>ध्यान दें: जब आप किसी डेटाबेस को आधिकारिक ऐप में आयात कर रहे हैं, तो हमेशा सुनिश्चित करें कि यह वही है जिसे आपने आधिकारिक ऐप से निर्यात किया था। यदि आप आधिकारिक ऐप के अलावा किसी एपीके से निर्यात किया गया डेटाबेस आयात करते हैं, तो यह चीजों को तोड़ सकता है। ऐसी कार्रवाई समर्थित नहीं है, और आपको ऐसा केवल तभी करना चाहिए जब आप पूरी तरह से आश्वस्त हों कि आप जानते हैं कि आप क्या कर रहे हैं।</b>\r\n\r\n## योगदान करें\r\nचाहे आप अपने विचार जोड़ना चाहे, या अनुवाद, डिज़ाइन में बदलाव, कोड में सफ़ाई, या कोड में भारी बदलाव, सहायता ज़रूर करें।\r\nजितने योगदान हो, ऐप उतनी ही बेहतर होती जाती है!\r\n\r\nअगर आप योगदान करना चाहते हैं, हमारे [योगदान के दिशानिर्देश](/.github/CONTRIBUTING.md) देखें।\r\n\r\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\r\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"अनुवाद की स्थिति\" />\r\n</a>\r\n\r\n## आर्थिक योगदान करें\r\nयदि आपको न्यूपाइप पसंद है, तो दान भेजने के लिए आपका स्वागत है। आप Liberapay से दान कर सकते हैं। हम Liberapay को प्राथमिकता देते हैं, क्योंकि यह ओपन-सोर्स और गैर-लाभकारी दोनों है। न्यूपाइप को दान देने के बारे में अधिक जानकारी के लिए कृपया हमारी [वेबसाइट](https://newpipe.net/donate) पर जाएँ।\r\n\r\n<table>\r\n  <tr>\r\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\"></a></td>\r\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"liberapay.com पर NewPipe को देखें\" width=\"100px\"></a></td>\r\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Liberapay के ज़रिए दान करें\" height=\"35px\"></a></td>\r\n  </tr>\r\n</table>\r\n\r\n## गोपनीयता और शर्तें\r\n\r\nNewPipe परियोजना का लक्ष्य है मीडिया वेब सेवाओं का इस्तेमाल करने के लिए एक निजी, गुमनाम अनुभव प्रदान करना,\r\nइसलिए यह ऐप आपकी अनुमति के बिना कोई भी डेटा प्राप्त नहीं करती है। NewPipe की गोपनीयता और शर्तों में विस्तार से बताया गया है कि क्रैश रिपोर्ट भेजते समय या हमारे ब्लॉग पर टिप्पणी जोड़ते समय कौन-कौन-सी डेटा भेजी जाती है। आपको दस्तावेज़ [यहाँ](https://newpipe.net/legal/privacy/) मिल जाएगा।\r\n\r\n## लाइसेंस\r\n[![GNU GPLv3 का चित्र](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \r\n\r\nNewPipe ओपन सोर्स सॉफ़्टवेयर है: आप इच्छानुसार इसे सुधार सकते हैं, जाँच सकते हैं, बाँट सकते हैं और इस्तेमाल कर सकते हैं। विशिष्ट रूप से, आप मुक्त सॉफ़्टवेयर संस्थान द्वारा परिभाषित [GNU साधारण सार्वजनिक लाइसेंस](https://www.gnu.org/licenses/gpl.html) के संस्करण 3 या फिर वैकल्पिक रूप से किसी नवीन संस्करण के शर्तों के अनुसार इसे दोबारा बाँट सकते हैं और/या बदल सकते हैं।\r\n"
  },
  {
    "path": "doc/README.it.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">Un <i>frontend</i> di streaming libero e leggero per Android.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-en.svg\" alt=\"Scaricalo su F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"Rilascio GitHub\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"Licenza: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Stato <i>Build</i>\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Stato Traduzione\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC channel: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshot\"><i>Screenshot</i></a> &bull; <a href=\"#servizi-supportati\">Servizi Supportati</a> &bull; <a href=\"#descrizione\">Descrizione</a> &bull; <a href=\"#funzionalità\">Funzionalità</a> &bull; <a href=\"#installazione-e-aggiornamenti\">Installazione e aggiornamenti</a> &bull; <a href=\"#contribuire\">Contribuire</a> &bull; <a href=\"#donare\">Donare</a> &bull; <a href=\"#licenza\">Licenza</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Sito</a> &bull; <a href=\"https://newpipe.net/blog/\"><i>Blog</i></a> &bull; <a href=\"https://newpipe.net/FAQ/\"><i>FAQ</i></a> &bull; <a href=\"https://newpipe.net/press/\">Stampa</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>QUEST'APP È IN BETA, QUINDI POTRESTI IMBATTERTI IN <i>BUG</i>. SE COSÌ FOSSE, APRI UN'<i>ISSUE</i> SUL NOSTRO REPOSITORIO GITHUB COMPILANDO IL <i>TEMPLATE ISSUE</i>.</b>\n>\n> <b>METTERE NEWPIPE, O QUALSIASI SUA <i>FORK</i>, NEL GOOGLE PLAY STORE, VIOLA I LORO TERMINI E CONDIZIONI.</b>\n\n## Screenshot\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n### Servizi Supportati\n\nNewPipe supporta, al momento, questi servizi:\n\n<!-- Mettiamo un link separato ai siti dei servizi per evitare gente che apre un sito senza volere -->\n* YouTube ([sito](https://www.youtube.com/)) e YouTube Music ([sito](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube))\n* PeerTube ([sito](https://joinpeertube.org/)) e tutte le sue istanze (apri il sito per capire cosa significa!) ([wiki](https://en.wikipedia.org/wiki/PeerTube))\n* Bandcamp ([sito](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp))\n* SoundCloud ([sito](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud))\n* media.ccc.de ([sito](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club))\n\nCome 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!\n\nParzialmente 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.\n\nSe 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).\n\n## Descrizione\n\nNewPipe 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.\n\nInoltre, 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.\n\n### Funzionalità\n\n* Guarda video a risoluzioni fino al 4K\n* Ascolta audio in sottofondo, caricando solo il flusso audio per risparmiare dati\n* Modalità pop-up (lettore *floating*, anche noto come *Picture-in-Picture*)\n* Guarda dirette\n* Mostra/nascondi sottotitoli\n* Cerca video e audio (su YouTube, puoi anche specificare la lingua dei contenuti)\n* Accoda video (e salvali facoltativamente come *playlist* locali)\n* Mostra/nascondi informazioni sui video (come descrizione e *tag*)\n* Mostra/nascondi prossimi video o video correlati\n* Mostra/nascondi commenti\n* Cerca video, audio, canali, *playlist* e *album*\n* Esplora video e audio in un canale\n* Iscriviti a canali (sì, senza entrare in alcun *account*!)\n* Ricevi notifiche su video nuovi di canali a cui sei iscritto\n* Crea e modifica gruppi di canali (per navigazione e gestione facili)\n* Esplora *feed* di video generati dai tuoi gruppi di canali\n* Visualizza la tua cronologia e cerca in quest'ultima\n* Cerca e guarda *playlist* (queste sono *playlist* remote, il chè significa che sono prese dal servizio che stai esplorando)\n* Crea e modifica *playlist* locali (queste sono create e salvate nell'app, e non hanno niente a che fare con alcun servizio)\n* Scarica video/audio/sottotitoli (*closed caption*)\n* Apri in Kodi\n* Guarda/Blocca materiale soggetto a limiti di età\n\n## Installazione e aggiornamenti\n\nPuoi installare NewPipe usando uno dei seguenti metodi:\n1. Aggiungi il nostro repo a F-Droid e installalo da lì. Le istruzioni sono qui: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n2. Scarica l'APK da [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) e installalo.\n3. 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.\n4. 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.\n5. 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.\n\nConsigliamo 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.\n\nNel 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:\n1. Fai il *backup* dei tuoi dati tramite Impostazioni > Contenuti > Esporta Database così puoi mantenere la tua cronologia, le tue iscrizioni, e le tue *playlist*\n2. Disinstalla NewPipe\n3. Scarica l'APK dalla nuova fonte e installalo\n4. Importa i dati del passo 1 da Impostazioni > Contenuti > Importa Database\n\n<b>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.</b>\n\n## Contribuire\n\nSe 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).\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Stato traduzione\" />\n</a>\n\n## Donare\n\nSe 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).\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"Visita NewPipe su liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Dona via Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Privacy Policy\n\nIl 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/).\n\n## Licenza\n\n[![Immagine GNU GPLv3](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe è 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.\n"
  },
  {
    "path": "doc/README.ja.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">自由で軽量な Android 向けストリーミングフロントエンド</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-ja.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub リリース\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"ライセンス: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"ビルド状態\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"翻訳状態\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC チャンネル: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshots\">スクリーンショット</a> &bull; <a href=\"#description\">説明</a> &bull; <a href=\"#features\">機能</a> &bull; <a href=\"#installation-and-updates\">インストールと更新</a> &bull; <a href=\"#contribution\">貢献</a> &bull; <a href=\"#donate\">寄付</a> &bull; <a href=\"#license\">ライセンス</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">ウェブサイト</a> &bull; <a href=\"https://newpipe.net/blog/\">ブログ</a> &bull; <a href=\"https://newpipe.net/FAQ/\">FAQ</a> &bull; <a href=\"https://newpipe.net/press/\">ニュース</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>これはベータ版のため、バグが発生する可能性があります。もしバグが発生した場合、GitHub のリポジトリで Issue を開いてください。</b>\n>\n> <b>NewPipe 及びいずれのフォークを Google Play ストアに公開すると、Google の取引条件の違反になります。</b>\n\n<span id=\"screenshots\"></span>\n## スクリーンショット\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n<span id=\"description\"></span>\n## 説明\n\n自由なコピーレフトソフトウェアの NewPipe は一切のGoogleフレームワークライブラリ及び、YouTube API を使用しません。ウェブサイトは必要な情報のためだけに読み込まれるため、このアプリはGoogleのサービスがインストールされていない端末でも使用できます。また、NewPipeの使用にYouTubeアカウントは必要ありません。\n\n<span id=\"features\"></span>\n### 機能\n\n* 動画の検索\n* 動画の基本情報の表示\n* YouTube の動画の視聴\n* YouTube の動画のバックグラウンド再生\n* ポップアップモード (フローティングプレイヤー)\n* 動画を視聴するストリーミングプレイヤーの選択\n* 動画のダウンロード\n* 音声のみのダウンロード\n* Kodiでの動画再生\n* 次の動画/関連動画の表示\n* 特定の言語の YouTube の検索\n* 年齢制限のあるコンテンツの視聴/ブロック\n* チャンネルの基本情報の表示\n* チャンネルの検索\n* チャンネルからの動画の視聴\n* Orbot/Tor 対応 (直接的なものは未実装)\n* 1080p/2K/4K 対応\n* 履歴の表示\n* チャンネルの登録\n* 履歴の検索\n* 再生リストの検索/視聴\n* 再生リストをキューに追加して再生\n* 動画のキューへの追加\n* 端末内の再生リスト\n* 字幕\n* ライブ配信の対応\n* コメントの表示\n\n### 対応しているサービス\n\nNewPipe は複数のサービスに対応しています。[ドキュメント](https://teamnewpipe.github.io/documentation/)は、どのようにしてアプリと NewPipe Extractor にサービスを追加できるかについて詳細な情報を提供しています。もし、新しいサービスを追加するならば、是非私たちに連絡をお願いします。現在対応しているサービスは：\n\n* YouTube\n* SoundCloud \\[ベータ\\]\n* media.ccc.de \\[ベータ\\]\n* PeerTube インスタンス \\[ベータ\\]\n* Bandcamp \\[ベータ\\]\n\n<!-- Hidden span to keep old links compatible. -->\n<span id=\"updates\"></span>\n\n<span id=\"installation-and-updates\"></span>\n## インストールと更新\n以下の方法のいずれかに従うことによって NewPipe をインストールできます。\n1. カスタムリポジトリを F-Droid に追加してリリースが公開され次第インストールする。この方法の説明はこちら： https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n2. リリースが公開され次第[GitHub のリリース](https://github.com/TeamNewPipe/NewPipe/releases)から APK をダウンロードしてインストールする。\n3. F-Droid から更新する。これは更新を手にする上で最も遅い方法です。F-Droid が変更を検知して、APK をビルドし、署名、そしてユーザーに更新を届ける必要があるためです。\n4. 自分でデバッグ APK をビルドする。これは新しい機能を使用する上で最も早い方法ですが、他と比べてとても複雑なので、他の方法の使用を推奨します。\n\n私たちはほとんどのユーザーに方法1を推奨します。方法1と2でインストールされた APK は互換性がありますが、方法3でインストールされたものにはありません。これは方法1と2では、同じ署名鍵 (私たちが使用するもの)が使用されますが、方法3では異なった署名鍵 (F-Droidが使用するもの)が使用されるためです。方法4を使ったデバッグ APK のビルドは根本的に署名鍵の問題を除きます。署名鍵はユーザーが騙されて悪意のある更新がアプリにインストールされないことを助けるためにあります。\n\nもし、何かしらの理由によりソースを切り替えたい場合 (例: NewPipe のコア機能が壊れてしまったが F-Droid はまだ更新をしていない) は、この手順を推奨します。\n1. 履歴や登録チャンネル、再生リストを保つために 設定 > コンテンツ > データベースをエクスポート からデータをバックアップ\n2. NewPipe をアンインストール\n3. 新しいソースから APK をダウンロードしてインストール\n4. 設定 > コンテンツ > データベースをインポート からステップ1で作ったデータベースをインポート\n\n<span id=\"contribution\"></span>\n## 貢献\n翻訳、デザインの変更、コードの整理、大規模なコードの変更などの助けはいつでも歓迎します。\nより良いものを一緒に作り上げましょう！\n\nもし貢献をしたい場合、[貢献ノート](../.github/CONTRIBUTING.md)をご確認ください。\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"翻訳状態\" />\n</a>\n\n<span id=\"donate\"></span>\n## 寄付\nもし、NewPipe を気に入っていただけたら、寄付をしていただけると嬉しいです。Bitcoin または Bountysource, Liberapay から寄付をすることができます。NewPipe への寄付については、[ウェブサイト](https://newpipe.net/donate)からお願いします。\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"liberapay.com で NewPipe を訪れる\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Liberapay で寄付\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## プライバシーポリシー\nNewPipe プロジェクトはメディアウェブサービスを使用する上でのプライベートで匿名の体験を提供することを目的としています。\nそのため、アプリはあなたの同意なしで一切のデータを収集しません。NewPipe のプライバシーポリシーはあなたがクラッシュレポートまたは、私たちのブログでコメントを送信した場合にどのようなデータが送信され、保存されるのかを詳細に説明しています。そのドキュメントは[こちら](https://newpipe.net/legal/privacy/)から見つけることができます。\n\n<span id=\"license\"></span>\n## ライセンス\n[![GNU GPLv3 のロゴ](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe はフリーソフトウェアなので、あなたはあなたの望むように使用、習得、共有、改善を行えます。\n具体的には、フリーソフトウェア財団により公開された [GNU General Public License](https://www.gnu.org/licenses/gpl.html) のバージョン3のライセンスもしくは、(あなたの選択で) いずれかの後継バージョンの規約の元で配布または改変を行うことができます。\n"
  },
  {
    "path": "doc/README.ko.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">A libre lightweight streaming frontend for Android.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-ko.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub release\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"License: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Build Status\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Translation Status\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC channel: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshots\">Screenshots</a> &bull; <a href=\"#description\">Description</a> &bull; <a href=\"#features\">Features</a> &bull; <a href=\"#updates\">Updates</a> &bull; <a href=\"#contribution\">Contribution</a> &bull; <a href=\"#donate\">Donate</a> &bull; <a href=\"#license\">License</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Website</a> &bull; <a href=\"https://newpipe.net/blog/\">Blog</a> &bull; <a href=\"https://newpipe.net/FAQ/\">FAQ</a> &bull; <a href=\"https://newpipe.net/press/\">Press</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GitHub 저장소에서 Issue를 열람하여 주십시오.</b>\n>\n> <b>NewPipe 또는 NewPipe 포크를 구글 플레이스토어에 올리는 것은 그들의 이용약관을 위반합니다.</b>\n\n## 스크린샷\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n### 지원되는 서비스\n\nNewPipe는 현재 이 서비스들을 지원합니다: \n\n* YouTube ([웹사이트](https://www.youtube.com/)) 와 YouTube Music ([웹사이트](https://music.youtube.com/)) ([위키](https://en.wikipedia.org/wiki/YouTube))\n* PeerTube ([웹사이트](https://joinpeertube.org/)) 와 모든 인스턴스 (인스턴스가 무엇인지 아려면 웹사이트를 참조하세요.) ([위키](https://en.wikipedia.org/wiki/PeerTube))\n* Bandcamp ([웹사이트](https://bandcamp.com/)) ([위키](https://en.wikipedia.org/wiki/Bandcamp))\n* SoundCloud ([웹사이트](https://soundcloud.com/)) ([위키](https://en.wikipedia.org/wiki/SoundCloud))\n* media.ccc.de ([웹사이트](https://media.ccc.de/)) ([위키](https://en.wikipedia.org/wiki/Chaos_Computer_Club))\n\nNewPipe는 여러 영상·오디오 서비스를 지원합니다. YouTube부터 시작해서, 다른 사람들이 몇 년간 여러 서비스들을 추가해주어 NewPipe의 기능을 풍부하게 해 주었습니다.\n\n현재 상황과, YouTube의 인기로 인해 현재 서비스 중에서 YouTube가 가장 잘 지원됩니다. 다른 서비스를 사용하시거나, 잘 알고 계시다면 지원을 개선할 수 있도록 도와주세요! SoundCloud와 PeerTube의 관리자를 찾고 있습니다.\n\n새로운 서비스를 추가하고 싶으시다면, 먼저 저희에게 연락해 주세요! 저희의 [문서](https://teamnewpipe.github.io/documentation/)가 앱과 [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor)에 서비스를 추가하는 법에 대한 정보를 제공합니다.\n\n## 설명\n\nNewPipe는 서비스의 공식 API를 이용하여 정보를 받아오는 방식으로 작동합니다. 공식 API가 저희의 목적을 제한하는 경우 (예: YouTube), 또는 독점적인 경우 NewPipe는 웹사이트의 구문을 분석하거나 내부 API를 사용합니다. 즉, NewPipe를 사용할 때 계정은 필요하지 않습니다.\n\n### 기능\n\n* 최대 4K 화질로 영상 보기\n* 백그라운드에서 노래 듣기 (노래 데이터만을 가져오므로 데이터 절약)\n* 팝업 모드 (floating player, 또는 Picture-in-Picture)\n* 실시간 영상 보기\n* 부제/자막 표시/숨기기\n* 영상과 오디오 검색하기 (YouTube에서는 콘텐츠 언어를 지정할 수 있습니다)\n* 영상 대기열 추가 (로컬 플레이리스트에 추가 가능)\n* 영상에 대한 기본 정보 표시/숨기기 (설명이나 태그 등)\n* 다음/관련 영상 표시/숨기기\n* 댓글 표시/숨기기\n* 영상, 오디오, 채널, 플레이리스트, 앨범 검색하기\n* 채널 내부에서 영상, 오디오 찾기\n* 채널 구독하기 (계정에 로그인 불필요!)\n* 구독한 채널의 영상 알림 받기\n* 채널 그룹 생성, 수정 (쉬운 탐색과 관리를 위해)\n* 채널 그룹에서 생성된 영상 피드 탐색\n* 시청 기록 보기, 검색\n* 플레이리스트 검색, 시청 (서비스에서 원격으로 받아옴)\n* 로컬 플레이리스트 만들기/수정 (다른 서비스에서 할 필요 없이 NewPipe 내부에 저장)\n* 영상/오디오/자막 다운로드\n* Kodi에서 열기\n* 나이 제한 영상 시청/차단\n\n## 설치 및 업데이트\n당신은 NewPipe를 설치하기 위해 이 방법 중 하나를 사용할 수 있습니다:\n 1. 우리의 커스텀 저장소를 F-Droid에 추가하고 우리가 릴리즈를 게시하는 대로 F-Droid에서 릴리즈를 설치할 수 있습니다. 지침은 여기 있습니다: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n 2. 우리가 릴리즈를 게시하는 대로 [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases)에서 APK를 받고 이것을 설치할 수 있습니다.\n 3. F-Droid를 통해 업데이트 할 수 있습니다. F-Droid는 변화를 인식하고, 스스로 APK를 생성하고, 이것에 서명하고, 사용자들에서 업데이트를 전달해야만 하기 때문에,\n 이것은 업데이트를 받는 가장 느린 방법입니다.\n 4. 스스로 디버그 APK 빌드하기. 이것은 새 기능을 기기에 추가하는 가장 빠른 방법이지만, 매우 복잡하므로, 다른 방법 중 하나를 사용하는 것을 권장합니다.\n 5. 이 저장소의 PR에 제공된 기능 또는 버그 픽스에 관심이 있다면, PR의 APK를 받을 수 있습니다. 지침을 위해선 PR 설명을 따르십시오. PR APK는 공식 APK와 같이 설치되기 때문에, 데이터를 잃거나 무언가 잘못될 걱정을 하지 않으도 됩니다.\n\n우리는 대부분의 사용자에게 1번째 방법을 추천합니다. 방법 1 또는 2를 사용하여 설치된 APK는 서로 호환되지만 (NewPipe를 방법 1로 설치한 후 방법 2로 업데이트할 수 있음을 의미합니다), 방법 3을 사용하여 설치된 것들과는 호환되지 않습니다. 이것은 방법 1 또는 2에서는 같은 (우리의)서명 키가 사용되지만, 방법 3에서는 다른 (F-Droid의)서명 키가 사용되기 때문입니다. 방법 4를 사용하여 디버그 APK를 생성하는 것에서는 키가 완전히 제외됩니다. 서명 키는 사용자가 앱에 악의적인 업데이트를 설치하는 것에 대해 속지 않도록 보장하는 것을 도와줍니다.\n\n한편, 만약 어떠한 이유(예. NewPipe의 핵심 기능이 손상되었고 F-Droid에 아직 업데이트가 없는 경우) 때문에 소스를 바꾸길 원한다면, \n우리는 다음과 같은 절차를 따르는 것을 권장합니다:\n1. 당신의 기록, 구독, 그리고 재생목록을 유지할 수 있도록 Settings > Content > Export Database 를 통해 데이터를 백업하십시오.\n2. NewPipe를 삭제하십시오.\n3. 새로운 소스에서 APK를 다운로드하고 이것을 설치하십시오.\n4. Step 1의 Settings > Content > Import Database 을 통해 데이터를 불러오십시오.\n\n## 기여\n당신이 아이디어, 번역, 디자인 변경, 코드 정리, 또는 정말 큰 코드 수정에 대한 의견이 있다면, 도움은 항상 환영합니다.\n더 많이 수행될수록 더 많이 발전할 수 있습니다! \n\n만약 참여하고 싶다면, 우리의 [기여 공지](../.github/CONTRIBUTING.md)를 참고하십시오.\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Translation status\" />\n</a>\n\n## 기부\n만약 NewPipe가 마음에 들었다면, 우리는 기부에 대해 기꺼이 환영합니다. bitcoin을 보내거나, Bountysource 또는 Liberapay를 통해 기부할 수 있습니다. NewPipe에 기부하는 것에 대한 자세한 정보를 원한다면, 우리의 [웹사이트](https://newpipe.net/donate)를 방문하여 주십시오.\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"Visit NewPipe at liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Donate via Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## 개인정보 보호 정책\n\nNewPipe 프로젝트는 미디어 웹 서비스를 사용하는 것에 대한 사적의, 익명의 경험을 제공하는 것을 목표로 하고 있습니다.\n그러므로, 앱은 당신의 동의 없이 어떤 데이터도 수집하지 않습니다. NewPipe의 개인정보보호정책은 당신이 충돌 리포트를 보내거나, 또는 우리의 블로그에 글을 남길 때 어떤 데이터가 보내지고 저장되는지에 대해 상세히 설명합니다. 이 문서는 [여기](https://newpipe.net/legal/privacy/)에서 확인할 수 있습니다.\n\n## 라이선스\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe는 자유 소프트웨어입니다: 당신의 마음대로 이것을 사용하고, 연구하고, 공유하고, 개선할 수 있습니다. \n구체적으로 당신은 자유 소프트웨어 재단에서 발행되는, 버전 3 또는 (당신의 선택에 따라)이후 버전의,\n[GNU General Public License](https://www.gnu.org/licenses/gpl.html) 하에서 이것을 재배포 및/또는 수정할 수 있습니다. \n"
  },
  {
    "path": "doc/README.pa.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \r\n<h2 align=\"center\"><b>NewPipe</b></h2>\r\n<h4 align=\"center\">ਐਂਡਰੌਇਡ ਲਈ ਇੱਕ ਮੁਫ਼ਤ ਹਲਕਾ-ਫੁਲਕਾ ਸਟ੍ਰੀਮਿੰਗ ਯੂਟਿਊਬ ਫਰੰਟ-ਐਂਡ।</h4>\r\n\r\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-pa.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\r\n\r\n<p align=\"center\">\r\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub ਰਿਲੀਜ਼\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\r\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\r\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\r\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"ਲਾਈਸੈਂਸ: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\r\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"ਬਿਲਡ ਦੀ ਸਥਿਤੀ\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\r\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"ਅਨੁਵਾਦ ਦੀ ਸਥਿਤੀ\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\r\n</p>\r\n\r\n<p align=\"center\">\r\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC ਚੈਨਲ: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\r\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\r\n</p>\r\n\r\n<hr>\r\n<p align=\"center\"><a href=\"#ਐਪ-ਕਿਹੋ-ਜਿਹੀ-ਦਿਖਦੀ-ਹੈ\">ਐਪ ਕਿਹੋ-ਜਿਹੀ ਦਿਖਦੀ ਹੈ</a> &bull; <a href=\"#ਸਮਰਥਿਤ-ਸੇਵਾਵਾਂ\">ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ</a> &bull; <a href=\"#ਵਰਣਨ\">ਵਰਣਨ</a> &bull; <a href=\"#ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ\">ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ</a> &bull; <a href=\"#ਇੰਸਟਾਲੇਸ਼ਨ-ਅਤੇ-ਅੱਪਡੇਟ\">ਇੰਸਟਾਲੇਸ਼ਨ ਅਤੇ ਅੱਪਡੇਟ</a> &bull; <a href=\"#ਯੋਗਦਾਨ\">ਯੋਗਦਾਨ</a> &bull; <a href=\"#ਦਾਨ\">ਦਾਨ</a> &bull; <a href=\"#ਲਾਈਸੈਂਸ\">ਲਾਈਸੈਂਸ</a></p>\r\n<p align=\"center\"><a href=\"https://newpipe.net\">ਵੈੱਬਸਾਈਟ</a> &bull; <a href=\"https://newpipe.net/blog/\">ਬਲੌਗ</a> &bull; <a href=\"https://newpipe.net/FAQ/\">ਆਮ ਸਵਾਲ ਜਵਾਬ</a> &bull; <a href=\"https://newpipe.net/press/\">ਪ੍ਰੈਸ</a></p>\r\n<hr>\r\n\r\n*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)*\r\n\r\n> [!warning]\r\n> <b>ਇਹ ਐਪ ਬੀਟਾ ਵਿੱਚ ਹੈ, ਇਸ ਲਈ ਤੁਸੀਂ ਬੱਗ ਦਾ ਸਾਹਮਣਾ ਕਰ ਸਕਦੇ ਹੋ। ਜੇਕਰ ਤੁਸੀਂ ਅਜਿਹਾ ਕਰਦੇ ਹੋ, ਤਾਂ ਟੈਮਪਲੇਟ ਨੂੰ ਭਰ ਕੇ ਸਾਡੀ ਗਿਟਹੱਬ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਇੱਕ ਮੁੱਦਾ ਖੋਲ੍ਹੋ</b>\r\n>\r\n> <b>ਗੂਗਲ ਪਲੇ ਸਟੋਰ ਵਿੱਚ ਨਿਊਪਾਈਪ ਜਾਂ ਇਸ ਦਾ ਕੋਈ ਵੀ ਫੋਰਕ ਲਗਾਉਣਾ ਉਹਨਾਂ ਦੇ ਨਿਯਮਾਂ ਅਤੇ ਸ਼ਰਤਾਂ ਦੀ ਉਲੰਘਣਾ ਕਰਦਾ ਹੈ।</b>\r\n\r\n## ਐਪ ਕਿਹੋ-ਜਿਹੀ ਦਿਖਦੀ ਹੈ\r\n\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\r\n<br/><br/>\r\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\r\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\r\n\r\n## ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ\r\n\r\nNewPipe ਵਰਤਮਾਨ ਵਿੱਚ ਇਹਨਾਂ ਸੇਵਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ::\r\n\r\n<!-- ਅਸੀਂ ਸੇਵਾ ਦੀਆਂ ਵੈੱਬਸਾਈਟਾਂ ਨਾਲ ਵੱਖਰੇ ਤੌਰ 'ਤੇ ਲਿੰਕ ਕਰਦੇ ਹਾਂ ਤਾਂ ਜੋ ਲੋਕ ਗਲਤੀ ਨਾਲ ਅਜਿਹੀ ਵੈੱਬਸਾਈਟ ਖੋਲ੍ਹਣ ਤੋਂ ਬਚ ਸਕਣ ਜੋ ਉਹ ਨਹੀਂ ਚਾਹੁੰਦੇ ਸਨ। -->\r\n* YouTube ([ਵੈੱਬਸਾਈਟ](https://www.youtube.com/)) and YouTube Music ([ਵੈੱਬਸਾਈਟ](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube))\r\n* PeerTube ([ਵੈੱਬਸਾਈਟ](https://joinpeertube.org/)) ਅਤੇ ਇਸ ਦੇ ਸਾਰੇ ਇੰਸਟੈਂਸ (ਇਸ ਦਾ ਮਤਲਬ ਜਾਣਨ ਲਈ ਵੈੱਬਸਾਈਟ ਖੋਲ੍ਹੋ!) ([wiki](https://en.wikipedia.org/wiki/PeerTube))\r\n* Bandcamp ([ਵੈੱਬਸਾਈਟ](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp))\r\n* SoundCloud ([ਵੈੱਬਸਾਈਟ](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud))\r\n* media.ccc.de ([ਵੈੱਬਸਾਈਟ](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club))\r\n\r\nਜਿਵੇਂ ਕਿ ਤੁਸੀਂ ਦੇਖ ਸਕਦੇ ਹੋ, NewPipe ਕਈ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਸੇਵਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ। ਇਹ YouTube ਦੇ ਨਾਲ ਸ਼ੁਰੂ ਹੋਇਆ ਸੀ, ਦੂਜੇ ਲੋਕਾਂ ਨੇ ਸਾਲਾਂ ਦੌਰਾਨ ਹੋਰ ਸੇਵਾਵਾਂ ਜੋੜੀਆਂ ਹਨ, ਜਿਸ ਨਾਲ NewPipe ਨੂੰ ਹੋਰ ਵੀ ਬਹੁਮੁਖੀ ਬਣਾਇਆ ਗਿਆ ਹੈ!\r\n\r\nਹਾਲਾਤ ਅਤੇ ਪ੍ਰਸਿੱਧੀ ਦੇ ਕਾਰਨ, YouTube ਇਹਨਾਂ ਸੇਵਾਵਾਂ ਵਿੱਚੋਂ ਸਭ ਤੋਂ ਵਧੀਆ ਸਮਰਥਿਤ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਇਹਨਾਂ ਵਿੱਚੋਂ ਕਿਸੇ ਵੀ ਹੋਰ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ ਜਾਂ ਉਹਨਾਂ ਤੋਂ ਜਾਣੂ ਹੋ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਉਹਨਾਂ ਲਈ ਸਹਾਇਤਾ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਸਾਡੀ ਮਦਦ ਕਰੋ! ਅਸੀਂ SoundCloud ਅਤੇ PeerTube ਲਈ ਮੇਨਟੇਨਰਾਂ ਦੀ ਭਾਲ ਕਰ ਰਹੇ ਹਾਂ।\r\n\r\nਜੇ ਤੁਸੀਂ ਕੋਈ ਨਵੀਂ ਸੇਵਾ ਜੋੜਨਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਪਹਿਲਾਂ ਸਾਡੇ ਨਾਲ ਸੰਪਰਕ ਕਰੋ! ਸਾਡੇ [ਦਸਤਾਵੇਜ਼](https://teamnewpipe.github.io/documentation/) ਇਸ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਪ੍ਰਦਾਨ ਕਰਦੇ ਹਨ ਕਿ ਐਪ ਅਤੇ [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor). ਵਿੱਚ ਨਵੀਂ ਸੇਵਾ ਕਿਵੇਂ ਸ਼ਾਮਲ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।\r\n\r\n## ਵਰਣਨ\r\n\r\nNewPipe ਤੁਹਾਡੇ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਰਹੀ ਸੇਵਾ ਦੇ ਅਧਿਕਾਰਤ API (ਉਦਾਹਰਨ ਲਈ PeerTube) ਤੋਂ ਲੋੜੀਂਦਾ ਡੇਟਾ ਪ੍ਰਾਪਤ ਕਰਕੇ ਕੰਮ ਕਰਦਾ ਹੈ। ਜੇਕਰ ਅਧਿਕਾਰਤ API ਸਾਡੇ ਉਦੇਸ਼ਾਂ ਲਈ ਪ੍ਰਤਿਬੰਧਿਤ ਹੈ (ਉਦਾਹਰਨ ਲਈ YouTube) ਜਾਂ ਮਲਕੀਅਤ ਹੈ, ਤਾਂ ਐਪ ਵੈੱਬਸਾਈਟ ਨੂੰ ਪਾਰਸ ਕਰਦੀ ਹੈ ਜਾਂ ਇਸਦੀ ਬਜਾਏ ਇੱਕ ਅੰਦਰੂਨੀ API ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਹਾਨੂੰ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਕਿਸੇ ਵੀ ਸੇਵਾ 'ਤੇ ਖਾਤੇ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ।\r\n\r\nਨਾਲ ਹੀ, ਕਿਉਂਕਿ ਇਹ ਮੁਫਤ ਅਤੇ ਓਪਨ ਸੋਰਸ ਸੌਫਟਵੇਅਰ ਹਨ, ਨਾ ਤਾਂ ਐਪ ਅਤੇ ਨਾ ਹੀ ਐਕਸਟਰੈਕਟਰ ਕਿਸੇ ਵੀ ਮਲਕੀਅਤ ਲਾਇਬ੍ਰੇਰੀਆਂ ਜਾਂ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹਨ, ਜਿਵੇਂ ਕਿ Google Play ਸੇਵਾਵਾਂ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਸੀਂ ਉਹਨਾਂ ਡਿਵਾਈਸਾਂ ਜਾਂ ਕਸਟਮ ਰੋਮਾਂ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ ਜਿਨ੍ਹਾਂ ਵਿੱਚ Google ਐਪਸ ਸਥਾਪਿਤ ਨਹੀਂ ਹਨ।\r\n\r\n## ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ\r\n\r\n* 4K ਤੱਕ ਰੈਜ਼ੋਲਿਊਸ਼ਨ 'ਤੇ ਵੀਡੀਓ ਵੇਖੋ \r\n* ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਆਡੀਓ ਸੁਣੋ, ਡਾਟਾ ਬਚਾਉਣ ਲਈ  ਸਿਰਫ਼ ਆਡੀਓ ਸਟ੍ਰੀਮ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾਂਦਾ ਹੈ\r\n* ਪੌਪਅੱਪ ਮੋਡ (ਫਲੋਟਿੰਗ ਪਲੇਅਰ, ਉਰਫ ਪਿਕਚਰ-ਇਨ-ਪਿਕਚਰ)\r\n* ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਵੇਖੋ/ਸੁਣੋ\r\n* ਸਬਟਾਈਟਲ/ ਕਲੋਜ਼ਡ ਕੈਪਸ਼ਨਾਂ ਵਿਖਾਓ/ਲੁਕਾਓ\r\n* ਵੀਡੀਓ ਅਤੇ ਆਡੀਓਜ਼ ਖੋਜੋ (ਯੂਟਿਊਬ 'ਤੇ, ਤੁਸੀਂ ਸਮੱਗਰੀ ਦੀ ਭਾਸ਼ਾ ਵੀ ਨਿਰਧਾਰਤ ਕਰ ਸਕਦੇ ਹੋ)\r\n* ਵੀਡੀਓਜ਼ ਨੂੰ ਕਤਾਰਬੱਧ ਕਰੋ /ਵੇਖੋ (ਅਤੇ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਉਹਨਾਂ ਨੂੰ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਵਜੋਂ ਸੁਰੱਖਿਅਤ ਕਰੋ)\r\n* ਵੀਡੀਓਜ਼ ਬਾਰੇ ਆਮ ਜਾਣਕਾਰੀ ਵਿਖਾਓ/ਛੁਪਾਓ (ਜਿਵੇਂ ਕਿ ਵਰਣਨ ਅਤੇ ਟੈਗਸ)\r\n* ਅਗਲੇ/ਸਬੰਧਤ ਵੀਡੀਓ ਵਿਖਾਓ/ਲੁਕਾਓ\r\n* ਟਿੱਪਣੀਆਂ ਵਿਖਾਓ/ਲੁਕਾਓ\r\n* ਵੀਡੀਓ, ਆਡੀਓ, ਚੈਨਲ, ਪਲੇਲਿਸਟਾਂ ਅਤੇ ਐਲਬਮਾਂ ਖੋਜੋ\r\n* ਇੱਕ ਚੈਨਲ ਦੇ ਅੰਦਰ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਬ੍ਰਾਊਜ਼ ਕਰੋ\r\n* ਚੈਨਲਾਂ ਨੂੰ ਸਬਸਕਰਾਈਬ ਕਰੋ(ਹਾਂ, ਕਿਸੇ ਵੀ ਖਾਤੇ ਵਿੱਚ ਲੌਗਇਨ ਕੀਤੇ ਬਿਨਾਂ!)\r\n* ਤੁਹਾਡੇ ਦੁਆਰਾ ਸਬਸਕ੍ਰਾਈਬ ਕੀਤੇ ਗਏ ਚੈਨਲਾਂ ਤੋਂ ਨਵੇਂ ਵੀਡੀਓਜ਼ ਬਾਰੇ ਸੂਚਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ\r\n* ਚੈਨਲ ਸਮੂਹ ਬਣਾਓ ਅਤੇ ਸੰਪਾਦਿਤ ਕਰੋ (ਆਸਾਨ ਬ੍ਰਾਊਜ਼ਿੰਗ ਅਤੇ ਪ੍ਰਬੰਧਨ ਲਈ)\r\n* ਤੁਹਾਡੇ ਚੈਨਲ ਸਮੂਹਾਂ ਤੋਂ ਤਿਆਰ ਵੀਡੀਓ ਫੀਡਾਂ ਨੂੰ ਬ੍ਰਾਊਜ਼ ਕਰੋ\r\n* ਆਪਣਾ ਵੇਖੀਆਂ ਸਟ੍ਰੀਮਾਂ ਦਾ ਇਤਿਹਾਸ ਵੇਖੋ ਅਤੇ ਖੋਜੋ\r\n* ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਖੋਜੋ ਅਤੇ ਵੇਖੋ (ਇਹ ਰਿਮੋਟ ਪਲੇਲਿਸਟਾਂ ਹਨ, ਜਿਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਉਹ ਤੁਹਾਡੇ ਦੁਆਰਾ ਬ੍ਰਾਊਜ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਸੇਵਾ ਤੋਂ ਪ੍ਰਾਪਤ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ)\r\n* ਖੁਦ ਦੀਆਂ ਸਥਾਨਕ ਪਲੇਲਿਸਟਸ ਬਣਾਓ ਅਤੇ ਸੰਪਾਦਿਤ ਕਰੋ (ਇਹ ਐਪ ਦੇ ਅੰਦਰ ਬਣਾਈਆਂ ਅਤੇ ਸੁਰੱਖਿਅਤ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ, ਅਤੇ ਇਹਨਾਂ ਦਾ ਕਿਸੇ ਸੇਵਾ ਨਾਲ ਕੋਈ ਲੈਣਾ-ਦੇਣਾ ਨਹੀਂ ਹੈ)\r\n* ਵੀਡੀਓ/ਆਡੀਓ/ਸਬਟਾਈਟਲ (ਕਲੋਜ਼ਡ ਕੈਪਸ਼ਨਾਂ ) ਡਾਊਨਲੋਡ ਕਰੋ\r\n* Kodi ਵਿੱਚ ਵੀਡੀਓ ਨੂੰ ਖੋਲ੍ਹੋ\r\n* ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਸਮੱਗਰੀ ਵੇਖੋ /ਬਲਾਕ ਕਰੋ\r\n\r\n## ਇੰਸਟਾਲੇਸ਼ਨ ਅਤੇ ਅੱਪਡੇਟ\r\nਤੁਸੀਂ ਹੇਠਾਂ ਦਿੱਤੇ ਤਰੀਕਿਆਂ ਵਿੱਚੋਂ ਇੱਕ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਨਿਊਪਾਈਪ ਨੂੰ ਇੰਸਟਾਲ ਕਰ ਸਕਦੇ ਹੋ:\r\n 1. ਸਾਡੇ ਕਸਟਮ ਰੈਪੋ ਨੂੰ F-Droid ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਉਥੋਂ ਇੰਸਟਾਲ ਕਰੋ। ਨਿਰਦੇਸ਼ ਇੱਥੇ ਹਨ: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\r\n 2. [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) ਤੋਂ ਏਪੀਕੇ ਡਾਊਨਲੋਡ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਇੰਸਟਾਲ ਕਰੋ।\r\n 3. F-Droid ਰਾਹੀਂ ਅੱਪਡੇਟ ਕਰੋ। ਇਹ ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਦਾ ਸਭ ਤੋਂ ਹੌਲੀ ਤਰੀਕਾ ਹੈ, ਕਿਉਂਕਿ F-Droid ਨੂੰ ਤਬਦੀਲੀਆਂ ਨੂੰ ਪਛਾਣਨਾ ਹੁੰਦਾ ਹੈ, ਏਪੀਕੇ ਨੂੰ ਖੁਦ ਬਣਾਉਣਾ ਹੁੰਦਾ ਹੈ, ਇਸ 'ਤੇ ਦਸਤਖਤ ਕਰਨਾ ਹੁੰਦਾ ਹੈ, ਅਤੇ ਫਿਰ ਉਪਭੋਗਤਾਵਾਂ ਤੱਕ ਅੱਪਡੇਟ ਨੂੰ ਭੇਜਦੇ ਹਨ।\r\n 4. ਇੱਕ ਡੀਬੱਗ APK ਆਪਣੇ ਆਪ ਬਣਾਓ। ਇਹ ਤੁਹਾਡੀ ਡਿਵਾਈਸ 'ਤੇ ਨਵੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਦਾ ਸਭ ਤੋਂ ਤੇਜ਼ ਤਰੀਕਾ ਹੈ, ਪਰ ਇਹ ਬਹੁਤ ਜ਼ਿਆਦਾ ਗੁੰਝਲਦਾਰ ਹੈ, ਇਸ ਲਈ ਅਸੀਂ ਹੋਰ ਤਰੀਕਿਆਂ ਵਿੱਚੋਂ ਇੱਕ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਸਿਫਾਰਸ਼ ਕਰਦੇ ਹਾਂ।\r\n 5. ਜੇ ਤੁਸੀਂ ਇਸ ਰੈਪੋ ਵਿੱਚ ਪੁੱਲ ਬੇਨਤੀ ਵਿੱਚ ਪ੍ਰਦਾਨ ਕੀਤੀ ਗਈ ਇੱਕ ਵਿਸ਼ੇਸ਼ ਵਿਸ਼ੇਸ਼ਤਾ ਜਾਂ ਬੱਗਫਿਕਸ ਵਿੱਚ ਦਿਲਚਸਪੀ ਰੱਖਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਪੀਆਰ ਦੇ ਅੰਦਰੋਂ ਇਸਦਾ ਏਪੀਕੇ ਵੀ ਡਾਊਨਲੋਡ ਕਰ ਸਕਦੇ ਹੋ। ਨਿਰਦੇਸ਼ਾਂ ਲਈ PR ਵਰਣਨ ਪੜ੍ਹੋ। PR-ਵਿਸ਼ੇਸ਼ APKs ਬਾਰੇ ਸਭ ਤੋਂ ਵੱਡੀ ਗੱਲ ਇਹ ਹੈ ਕਿ ਉਹ ਅਧਿਕਾਰਤ ਐਪ ਦੇ ਨਾਲ-ਨਾਲ ਸਥਾਪਿਤ ਕੀਤੇ ਗਏ ਹਨ, ਇਸ ਲਈ ਤੁਹਾਨੂੰ ਆਪਣਾ ਡੇਟਾ ਗੁਆਉਣ ਜਾਂ ਕਿਸੇ ਵੀ ਗੜਬੜੀ ਬਾਰੇ ਚਿੰਤਾ ਕਰਨ ਦੀ ਕੋਈ ਲੋੜ ਨਹੀਂ ਹੈ।\r\n\r\nਅਸੀਂ ਜ਼ਿਆਦਾਤਰ ਉਪਭੋਗਤਾਵਾਂ ਲਈ ਵਿਧੀ 1 ਦੀ ਸਿਫ਼ਾਰਿਸ਼ ਕਰਦੇ ਹਾਂ। ਵਿਧੀ 1 ਜਾਂ 2 ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸਥਾਪਤ ਕੀਤੇ ਏਪੀਕੇ ਇੱਕ ਦੂਜੇ ਦੇ ਅਨੁਕੂਲ ਹੁੰਦੇ ਹਨ (ਮਤਲਬ ਕਿ ਜੇਕਰ ਤੁਸੀਂ ਕਿਸੇ ਵੀ ਵਿਧੀ 1 ਜਾਂ 2 ਦੀ ਵਰਤੋਂ ਕਰਕੇ NewPipe ਨੂੰ ਸਥਾਪਿਤ ਕੀਤਾ ਹੈ, ਤਾਂ ਤੁਸੀਂ ਦੂਜੀ ਦੀ ਵਰਤੋਂ ਕਰਕੇ NewPipe ਨੂੰ ਵੀ ਅੱਪਡੇਟ ਕਰ ਸਕਦੇ ਹੋ), ਪਰ ਉਹਨਾਂ ਨਾਲ ਨਹੀਂ ਜੋ ਵਿਧੀ 3 ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਸਥਾਪਿਤ ਕੀਤੇ ਗਏ ਹਨ। ਇੱਕੋ ਸਾਈਨਿੰਗ ਕੁੰਜੀ (ਸਾਡੀ) 1 ਅਤੇ 2 ਲਈ ਵਰਤੀ ਜਾ ਰਹੀ ਹੈ, ਪਰ 3 ਲਈ ਇੱਕ ਵੱਖਰੀ ਸਾਈਨਿੰਗ ਕੁੰਜੀ (F-Droid's) ਵਰਤੀ ਜਾ ਰਹੀ ਹੈ। ਵਿਧੀ 4 ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਇੱਕ ਡੀਬੱਗ ਏਪੀਕੇ ਬਣਾਉਣਾ ਇੱਕ ਕੁੰਜੀ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਬਾਹਰ ਰੱਖਦਾ ਹੈ। ਦਸਤਖਤ ਕਰਨ ਵਾਲੀਆਂ ਕੁੰਜੀਆਂ ਇਹ ਯਕੀਨੀ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਦੀਆਂ ਹਨ ਕਿ ਕਿਸੇ ਉਪਭੋਗਤਾ ਨੂੰ ਐਪ ਲਈ ਇੱਕ ਖਤਰਨਾਕ ਅੱਪਡੇਟ ਸਥਾਪਤ ਕਰਨ ਲਈ ਧੋਖਾ ਨਹੀਂ ਦਿੱਤਾ ਗਿਆ ਹੈ। ਵਿਧੀ 5 ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ, ਹਰੇਕ ਏਪੀਕੇ ਨੂੰ GitHub ਐਕਸ਼ਨਾਂ ਦੁਆਰਾ ਸਪਲਾਈ ਕੀਤੀ ਇੱਕ ਵੱਖਰੀ ਬੇਤਰਤੀਬ ਕੁੰਜੀ ਨਾਲ ਹਸਤਾਖਰਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਇਸਲਈ ਤੁਸੀਂ ਇਸਨੂੰ ਅਪਡੇਟ ਵੀ ਨਹੀਂ ਕਰ ਸਕਦੇ ਹੋ। ਹਰ ਵਾਰ ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ ਏਪੀਕੇ ਵਰਤਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਤੁਹਾਨੂੰ ਐਪ ਡੇਟਾ ਦਾ ਬੈਕਅੱਪ ਅਤੇ ਰੀਸਟੋਰ ਕਰਨਾ ਹੋਵੇਗਾ।\r\n\r\nਇਸ ਦੌਰਾਨ, ਜੇਕਰ ਤੁਸੀਂ ਕਿਸੇ ਕਾਰਨ ਕਰਕੇ ਸਰੋਤਾਂ ਨੂੰ ਬਦਲਣਾ ਚਾਹੁੰਦੇ ਹੋ (ਜਿਵੇਂ ਕਿ NewPipe ਦੀ ਕੋਰ ਕਾਰਜਸ਼ੀਲਤਾ ਬਰੇਕ ਅਤੇ F-Droid ਵਿੱਚ ਅਜੇ ਤੱਕ ਨਵੀਨਤਮ ਅੱਪਡੇਟ ਨਹੀਂ ਹੈ), ਤਾਂ ਅਸੀਂ ਇਸ ਪ੍ਰਕਿਰਿਆ ਦੀ ਪਾਲਣਾ ਕਰਨ ਦੀ ਸਿਫ਼ਾਰਿਸ਼ ਕਰਦੇ ਹਾਂ:\r\n1. ਸੈਟਿੰਗਾਂ > ਬੈਕਅੱਪ ਅਤੇ ਰੀਸਟੋਰ > ਐਕਸਪੋਰਟ ਡੇਟਾਬੇਸ ਰਾਹੀਂ ਆਪਣੇ ਡੇਟਾ ਦਾ ਬੈਕਅੱਪ ਲਓ ਤਾਂ ਜੋ ਤੁਸੀਂ ਆਪਣਾ ਇਤਿਹਾਸ, ਸਬਸਕਰਿਪਸ਼ਨਾਂ ਅਤੇ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਰੱਖੋ\r\n2. ਨਿਊ ਪਾਈਪ ਨੂੰ ਅਣਇੰਸਟਾਲ ਕਰੋ\r\n3. ਨਵੇਂ ਸਰੋਤ ਤੋਂ ਏਪੀਕੇ ਡਾਊਨਲੋਡ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਸਥਾਪਿਤ ਕਰੋ\r\n4. ਸੈਟਿੰਗਾਂ > ਬੈਕਅੱਪ ਅਤੇ ਰੀਸਟੋਰ > ਆਯਾਤ ਡੇਟਾਬੇਸ ਰਾਹੀਂ ਸਟੈਪ 1 ਤੋਂ ਡੇਟਾ ਆਯਾਤ ਕਰੋ\r\n\r\n<b>ਨੋਟ: ਜਦੋਂ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਵਿੱਚ ਇੱਕ ਡੇਟਾਬੇਸ ਨੂੰ ਆਯਾਤ ਕਰ ਰਹੇ ਹੋ, ਤਾਂ ਹਮੇਸ਼ਾਂ ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਇਹ ਉਹੀ ਹੈ ਜੋ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਤੋਂ ਨਿਰਯਾਤ ਕੀਤਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਅਧਿਕਾਰਤ ਐਪ ਤੋਂ ਇਲਾਵਾ ਕਿਸੇ ਏਪੀਕੇ ਤੋਂ ਨਿਰਯਾਤ ਕੀਤੇ ਡੇਟਾਬੇਸ ਨੂੰ ਆਯਾਤ ਕਰਦੇ ਹੋ, ਤਾਂ ਇਹ ਚੀਜ਼ਾਂ ਨੂੰ ਤੋੜ ਸਕਦਾ ਹੈ। ਅਜਿਹੀ ਕਾਰਵਾਈ ਅਸਮਰਥਿਤ ਹੈ, ਅਤੇ ਤੁਹਾਨੂੰ ਅਜਿਹਾ ਉਦੋਂ ਹੀ ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ ਜਦੋਂ ਤੁਹਾਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਯਕੀਨ ਹੋਵੇ ਕਿ ਤੁਸੀਂ ਜਾਣਦੇ ਹੋ ਕਿ ਤੁਸੀਂ ਕੀ ਕਰ ਰਹੇ ਹੋ।</b>\r\n\r\n## ਯੋਗਦਾਨ\r\n\r\nਭਾਵੇਂ ਤੁਹਾਡੇ ਕੋਲ ਵਿਚਾਰ, ਅਨੁਵਾਦ, ਡਿਜ਼ਾਈਨ ਤਬਦੀਲੀਆਂ, ਕੋਡ ਦੀ ਸਫਾਈ, ਜਾਂ ਇੱਥੋਂ ਤੱਕ ਕਿ ਵੱਡੀਆਂ ਕੋਡ ਤਬਦੀਲੀਆਂ ਹੋਣ, ਮਦਦ ਦਾ ਹਮੇਸ਼ਾ ਸਵਾਗਤ ਹੈ। ਐਪ ਹਰੇਕ ਯੋਗਦਾਨ ਦੇ ਨਾਲ ਬਿਹਤਰ ਹੋ ਜਾਂਦੀ ਹੈ, ਚਾਹੇ ਉਹ ਕਿੰਨਾ ਵੱਡਾ ਜਾਂ ਛੋਟਾ ਹੋਵੇ!\r\n\r\nਜੇਕਰ ਤੁਸੀਂ ਯੋਗਦਾਨ ਪਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਸਾਡੇ [ਯੋਗਦਾਨ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ਾਂ](/.github/CONTRIBUTING.md) ਨੂੰ ਵੇਖੋ।\r\n\r\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\r\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Translation status\" />\r\n</a>\r\n\r\n## ਦਾਨ\r\nਜੇਕਰ ਤੁਹਾਨੂੰ NewPipe ਪਸੰਦ ਹੈ, ਤਾਂ ਤੁਹਾਡਾ ਦਾਨ ਭੇਜਣ ਲਈ ਸੁਆਗਤ ਹੈ। ਅਸੀਂ Liberapay ਨੂੰ ਤਰਜੀਹ ਦਿੰਦੇ ਹਾਂ, ਕਿਉਂਕਿ ਇਹ ਓਪਨ-ਸੋਰਸ ਅਤੇ ਗੈਰ-ਮੁਨਾਫ਼ਾ ਦੋਵੇਂ ਹੈ। ਨਿਊ ਪਾਈਪ ਨੂੰ ਦਾਨ ਕਰਨ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ ਸਾਡੀ [ਵੈੱਬਸਾਈਟ](https://newpipe.net/donate) 'ਤੇ ਜਾਓ।\r\n\r\n<table>\r\n  <tr>\r\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\r\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"assets/liberapay_qr_code.png\" alt=\"liberapay.com 'ਤੇ NewPipe ਨੂੰ ਵੇਖੋ\" width=\"100px\"></a></td>\r\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"assets/liberapay_donate_button.svg\" alt=\"Donate via Liberapay\" height=\"35px\"></a></td>\r\n  </tr>\r\n</table>\r\n\r\n## ਗੋਪਨੀਅਤਾ ਨੀਤੀ\r\n \r\nਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਦਾ ਉਦੇਸ਼ ਵੈੱਬ-ਆਧਾਰਿਤ ਮੀਡੀਆ ਸੇਵਾਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਇੱਕ ਨਿੱਜੀ, ਅਗਿਆਤ ਅਨੁਭਵ ਪ੍ਰਦਾਨ ਕਰਨਾ ਹੈ। ਇਸ ਲਈ, ਇਹ ਐਪ ਤੁਹਾਡੀ ਇਜਾਜ਼ਤ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਡਾਟਾ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕਰਦੀ ਹੈ। NewPipe ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਅਤੇ ਸ਼ਰਤਾਂ ਵਿਸਤਾਰ ਵਿੱਚ ਦੱਸਦੀਆਂ ਹਨ ਕਿ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਣ ਤੇ ਜਾਂ ਸਾਡੇ ਬਲੌਗ ਵਿੱਚ ਕੋਈ ਟਿੱਪਣੀ ਛੱਡਦੇ ਸਮੇਂ ਕਿਹੜਾ ਡੇਟਾ ਭੇਜਿਆ ਅਤੇ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਤੁਹਾਨੂੰ ਦਸਤਾਵੇਜ਼ [ਇੱਥੇ](https://newpipe.net/legal/privacy/) ਮਿਲ ਜਾਵੇਗਾ।\r\n\r\n## ਲਾਈਸੈਂਸ\r\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \r\n\r\nNewPipe ਮੁਫਤ ਓਪਨ ਸੋਰਸ ਸਾਫ਼ਟਵੇਅਰ ਹੈ: ਤੁਸੀਂ ਆਪਣੀ ਮਰਜ਼ੀ ਨਾਲ ਇਸਨੂੰ ਸੁਧਾਰ ਸਕਦੇ ਹੋ, ਜਾਂਚ ਸਕਦੇ ਹੋ, ਸਾਂਝਾ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਵਰਤ ਸਕਦੇ ਹੋ। ਖਾਸ ਤੌਰ 'ਤੇ ਤੁਸੀਂ ਇਸ ਨੂੰ ਫ੍ਰੀ ਸਾਫ਼ਟਵੇਅਰ ਫਾਊਂਡੇਸ਼ਨ ਦੁਆਰਾ ਪ੍ਰਕਾਸ਼ਿਤ [GNU ਜਨਰਲ ਪਬਲਿਕ ਲਾਈਸੈਂਸ](https://www.gnu.org/licenses/gpl.html) ਦੇ ਸੰਸਕਰਣ 3 ਜਾਂ (ਵਿਕਲਪਿਕ ਤੌਰ ਤੇ) ਬਾਅਦ ਵਾਲੇ ਕਿਸੇ ਨਵੀਨਤਮ ਸੰਸਕਰਣ ਦੀਆਂ ਸ਼ਰਤਾਂ ਦੇ ਤਹਿਤ ਮੁੜ ਵੰਡ ਸਕਦੇ ਹੋ ਅਤੇ/ਜਾਂ ਸੋਧ ਸਕਦੇ ਹੋ।\r\n"
  },
  {
    "path": "doc/README.pl.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">Wolny, lekki streamingowy frontend na Androida.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-pl.svg\" alt=\"Pobierz z F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub release\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"License: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Build Status\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Translation Status\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC channel: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshoty\">Screenshoty</a> &bull; <a href=\"#opis\">Opis</a> &bull; <a href=\"#funkcje\">Funkcje</a> &bull; <a href=\"#instalacja-i-aktualizacje\">Instalacja i aktualizacje</a> &bull; <a href=\"#wkład\">Wkład</a> &bull; <a href=\"#wesprzyj\">Wesprzyj</a> &bull; <a href=\"#licencja\">Licencja</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Strona</a> &bull; <a href=\"https://newpipe.net/blog/\">Blog</a> &bull; <a href=\"https://newpipe.net/FAQ/\">FAQ</a> &bull; <a href=\"https://newpipe.net/press/\">Press</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>TO JEST WERSJA BETA, WIĘC MOŻESZ NAPOTKAĆ BŁĘDY. JEŚLI TAK SIĘ STANIE, OTWÓRZ NOWY \"ISSUE\" NA GITHUBIE.</b>\n>\n> <b>PUBLIKOWANIE NEWPIPE LUB JAKIEGOKOLWIEK JEGO FORKU W SKLEPIE PLAY NARUSZA ICH WARUNKI UŻYTKOWANIA.</b>\n\n## Screenshoty\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n## Opis\n\nNewPipe nie używa żadnych bibliotek Google ani API YouTube. Strony są jedynie analizowane aby zdobyć wymagane informacje, dzięki czemu ta aplikacja może zostać zainstalowana na urządzeniach bez Usług Google Play. Konto YouTube nie jest wymagane aby używać NewPipe, które jest wolnym oprogramowaniem copyleft.\n\n### Funkcje\n\n* Wyszukiwanie filmów\n* Brak wymogu konta Google/YouTube\n* Wyświetlanie generalnych informacji o filmach\n* Oglądanie filmów na YouTube\n* Słuchanie filmów na YouTube\n* Tryb okienkowy (Pływające okno)\n* Wybieranie odtwarzacza przez który możemy oglądać film\n* Pobieranie filmów\n* Pobieranie audio\n* Otwieranie filmów w Kodi\n* Pokazanie następnych/podobnych filmów\n* Wyszukiwanie w YouTube w konkretnym języku\n* Oglądanie/Blokowanie materiałów zablokowanych wiekowo.\n* Wyświetlanie generalnych informacji o kanałach\n* Wyszukiwanie kanałów\n* Oglądanie filmów ze strony kanału\n* Wsparcie dla Orbot/Tor (Jeszcze nie bezpośrednio)\n* Wsparcie dla 1080p/2K/4K\n* Historia oglądania\n* Subskrybowanie kanałów\n* Historia wyszukiwania\n* Wyszukiwanie/Oglądanie playlist\n* Oglądanie playlist w kolejce\n* Dodawnaie filmów do kolejki\n* Lokalne playlisty\n* Napisy\n* Wsparcie dla livestream'ów\n* Wyświetlanie komentarzy\n\n### Wspierane usługi\n\nNewPipe wspiera wiele usług. Nasza [dokumentacja](https://teamnewpipe.github.io/documentation/) dostarcza więcej informacji o tym jak nowe usługi mogą zostać dodane do aplikacji i extractora. Proszę skontaktuj się z nami jeśli masz zamiar dodać jakąś nową usługę. Obecnie wspierane usługi to:\n\n* YouTube\n* SoundCloud \\[beta\\]\n* media.ccc.de \\[beta\\]\n* Instancje PeerTube \\[beta\\]\n* Bandcamp \\[beta\\]\n\n## Instalacja i aktualizacje\nMożesz zainstalować NewPipe za pomocą jednej z tych metod:\n 1. Dodaj nasze repozytorium do F-Droid i z tamtąd pobierz NewPipe. Instrukcje znajdują się tutaj: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n 2. Pobierz APK z [Wydań na GitHubie](https://github.com/TeamNewPipe/NewPipe/releases) i zainstaluj go.\n 3. Zaktualizuj poprzez F-Droid. Jest to najwolniejsza metoda aktualizacji, ponieważ F-Droid musi rozpoznać zmiany, zbudować APK, podpisać go i dopiero wypuścić aktualizację do użytkowników.\n 4. Zbuduj debug APK samemu. Jest to najszybszy sposób na zdobycie najnowszych funkcji, ale jest to o wiele, wiele bardziej skomplikowane, dlatego rekomendujemy używania jednej z powyższych metod.\n\nDla większości użytkowników rekomendujemy metodę 1. Pliki APK zainstalowane za pomocą metod 1 lub 2 są ze sobą kompatybilne, lecz nie są kompatybilne z tymi zainstalowanymi metodą 3. Dzieje się tak ponieważ ten sam (nasz) klucz jest używany do podpisania APK z metod 1 i 2, ale APK z metody 3 podpisany jest innym kluczem (F-Droida). Budowanie debug APK z metody 4 w ogóle nie uwzględnia klucza. Klucze podpisu zapewniają, że użytkownik omylnie nie zainstaluje złośliwej aktualizacji żadnej aplikacji.\n\nW międzyczasie, jeśli z jakiegoś powodu chcesz zmienić źródło (np. rdzenna funkcjonalność NewPipe psuje się a F-Droid nie ma jeszcze najnowszej aktualizacji), rekomendujemy użyć następującej procedury:\n1. Zrób kopię danych wchodząc w Ustawienia > Zawartość > Eksportuj dane, dzięki czemu zachowasz swoją historię, subskrypcje i playlisty\n2. Odinstaluj NewPipe\n3. Pobierz APK z nowego źródła i zainstaluj go\n4. Przywróć dane z kroku 1 wchodząc w Ustawienia > Zawartość > Importuj dane\n\n## Wkład\nJeśli masz jakieś pomysły, tłumaczenia, zmiany designu, oczyszczony kod, lub wielkie zmiany w kodzie, pomoc jest zawsze mile widziana.\nIm więcej jest zrobione, tym lepsza staje się aplikacja!\n\nJeśli chcesz pomóc, przeczytaj [Notkę o wkładzie](../.github/CONTRIBUTING.md).\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Translation status\" />\n</a>\n\n## Wesprzyj\nJeś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).\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"Visit NewPipe at liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Donate via Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Polityka prywatności\n\nZałożeniem projektu NewPipe jest dostarczanie prywatnego, anonimowego dostępu do zasobów i usług internetowych. \nDlatego też, ta aplikacja nie zbiera żadnych informacji bez twojej zgody. Polityka prywatności NewPipe dokładnie wyjaśnia jakie dane są wysyłane i przechowywane, gdy wyślesz raport awarii lub komentarz na naszym blogu. Możesz znaleźć ten dokument [tutaj](https://newpipe.net/legal/privacy/).\n\n## Licencja\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe to wolne oprogramowanie: Możesz używać, uczyć się, udostępniać i ulepszać je do woli. \nMożesz udostępniać i/lub modyfikować je na zasadach licencji\n[GNU General Public License](https://www.gnu.org/licenses/gpl.html) \npublikowaną przez Free Software Foundation, wersję 3 Licencji, lub\n(twój wybór) każdną nowszą wersję.  \n"
  },
  {
    "path": "doc/README.pt_BR.md",
    "content": "<h3 align=\"center\">Nós estamos planejando <i>reescrever</i> grandes pedaços do código base, para gerar <a href=\"https://github.com/TeamNewPipe/NewPipe/discussions/10118\"> um novo, moderno e estável NewPipe</a>!</h3>\n<h4 align=\"center\">Por favor, <b>não</b> abra solicitações de pull para <i>novos recursos</i> por enquanto, apenas correções de bugs serão aceitas.</h4>\n\n<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n\n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">Uma interface de streaming leve e gratuita para Android.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-pt-br.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub release\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"License: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Build Status\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Translation Status\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC channel: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshots\">Screenshots</a> &bull; <a href=\"#serviços-suportados\">Serviços Suportados</a> &bull; <a href=\"#descrição\">Descrição</a> &bull; <a href=\"#recursos\">Recursos</a> &bull; <a href=\"#instalação-e-atualizações\">Instalação e atualizações</a> &bull; <a href=\"#contribuições\">Contribuições</a> &bull; <a href=\"#doar\">Doar</a> &bull; <a href=\"#licença\">Licença</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Site</a> &bull; <a href=\"https://newpipe.net/blog/\">Blog</a> &bull; <a href=\"https://newpipe.net/FAQ/\">FAQ</a> &bull; <a href=\"https://newpipe.net/press/\">Press</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>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.</b>\n>\n> <b>COLOCAR NEWPIPE, OU QUALQUER FORK DELE, NA GOOGLE PLAY STORE VIOLA SEUS TERMOS E CONDIÇÕES.</b>\n\n## Screenshots\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n### Serviços Suportados\n\nAtualmente, os serviços suportados são:\n\n* YouTube ([site](https://www.youtube.com/)) e YouTube Music ([site](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube))\n* 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))\n* Bandcamp ([site](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp))\n* SoundCloud ([site](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud))\n* media.ccc.de ([site](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club))\n\nComo 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!\n\nParcialmente 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.\n\nSe 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).\n\n## Descrição\n\nNewPipe 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.\n\nTambé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.\n\n### Recursos\n\n* Assistir vídeos em resoluções de até 4K\n* Escutar o áudio em segundo plano, carregando apenas o fluxo de áudio para salvar dados\n* Modo popup (player flutuante, aka Picture-in-Picture)\n* Assista a transmissões ao vivo\n* Mostrar/esconder legendas/closed captions\n* Buscar vídeos e áudios (no YouTube, você pode especificar o conteúdo da linguagem também)\n* Enfileirar vídeos (e opcionalmente salvar eles como playlists locais)\n* Mostrar/esconder informações gerais sobre os vídeos (como descrições e tags)\n* Mostrar/esconder vídeos próximos/relacionados\n* Mostrar/esconder comentários\n* Buscar vídeos, áudios, canais, playlists e álbuns\n* Navegar vídeos e áudios dentro de um canal\n* Inscrever-se a canais (sim, mesmo se não estiver logado a qualquer conta!)\n* Receba notificações sobre novos vídeos de canais em que você está inscrito\n* Crie e edite grupos de canais (para facilitar a navegação e o gerenciamento)\n* Navege feeds de vídeo gerados a partir dos seus grupos de canais\n* Veja e pesquise seu histórico de vídeos\n* Pesquise e assista playlists (Eles são playlists remotas, o que significa que eles serão obtidos do serviço que você está navegando)\n* Crie e edite playlists locais (Eles são criados e salvos no aplicativo, e não são relacionados com nenhum serviço)\n* Baixe vídeos/áudios/legendas (closed captions)\n* Abra no Kodi\n* Assista/Bloqueie material restrito\n\n## Instalação e atualizações\nVocê pode instalar NewPipe com um dos seguintes métodos: \n 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/\n 2. Baixe o APK aqui no [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) e instalá-lo assim que publicarmos um lançamento.\n 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.\n 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.\n 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.\n\nRecomendamos 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.\n\nEnquanto 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:\n1. 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\n2. Desinstale o NewPipe\n3. Baixe o APK da nova fonte e instale-o\n4. Importe os dados da etapa 1 via Configurações > Backup e Restauração > Importar Base de Dados\n\n## Contribuições\nSe 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).\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Estado da tradução\" />\n</a>\n\n## Doar\nSe 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).\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"Visite NewPipe em liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Doar via Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Política de Privacidade\n\nO projeto NewPipe tem como objetivo proporcionar uma experiência privada e anônima para o uso de serviços web de mídia.\nPortanto, o aplicativo não coleta nenhum dado sem o seu consentimento. A política de privacidade da NewPipe explica em detalhes quais dados são enviados e armazenados quando você envia um relatório de erro ou comenta em nosso blog. Você pode encontrar o documento [aqui](https://newpipe.net/legal/privacy/).\n\n## Licença\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe é Software Livre: Você pode usar, estudar compartilhamento e melhorá-lo à sua vontade.\n Especificamente, você pode redistribuir e/ou modificá-lo sob os termos do\n[GNU General Public License](https://www.gnu.org/licenses/gpl.html) publicado pela Free Software Foundation, seja a versão 3 da Licença, ou\n(a sua opção) qualquer versão posterior.  \n"
  },
  {
    "path": "doc/README.ro.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">Un front-end de streaming „uşor” liber, pentru Android.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-ro.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub release\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"License: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Build Status\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Translation Status\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC channel: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshots\">Capturi de ecran</a> &bull; <a href=\"#description\">Descriere</a> &bull; <a href=\"#features\">Funcţii</a> &bull; <a href=\"#installation-and-updates\">Instalare şi actualizări</a> &bull; <a href=\"#contribution\">Contribuţie</a> &bull; <a href=\"#donate\">Donaţi</a> &bull; <a href=\"#license\">Licenţă</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Website</a> &bull; <a href=\"https://newpipe.net/blog/\">Blog</a> &bull; <a href=\"https://newpipe.net/FAQ/\">FAQ</a> &bull; <a href=\"https://newpipe.net/press/\">Presă</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>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.</b>\n>\n> <b>PUNERA NEWPIPE SAU ORICĂRUI FORK AL ACESTUIA ÎN MAGAZINUL GOOGLE PLAY LE ÎNCALCĂ TERMENII ŞI CONDIŢIILE.</b>\n\n## Capturi de ecran\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n## Descriere\n\nNewPipe nu foloseşte nici-o bibliotecă Google framework sau API-ul Youtube. Website-urile sunt doar analizate pentru a prelua informaţia necesară, aşa că această aplicaţie poate fi folosită pe telefoane fără Serviciile Google instalate. De asemenea, nu aveţi nevoie de un cont Youtube pentru a folosi Newpipe, care este sofware liber şi copylefted.\n\n### Funcţii\n\n* Căutarea videoclipurilor\n* Nu este necesară logarea\n* Afişarea informaţiilor generale despre videoclipuri\n* Urmărirea videoclipurilor Youtube\n* Ascultarea videoclipurilor Youtube\n* Modul popup (player plutitor)\n* Selectarea playerului de streaming pentru vizionarea videoclipului\n* Descărcarea videoclipurilor\n* Doar descărcarea sunetului\n* Deschiderea videoclipurilor cu Kodi\n* Expunerea videoclipurilor următoare/asociate\n* Căutarea YouTube într-o limbă specifică\n* Vizionarea/Blocarea materialului restricţionat în funcţie de vârstă\n* Afişarea informaţiilor generale despre canale\n* Căutarea canalelor\n* Vizionarea videoclipurilor dintr-un canal\n* Suport Orbot/Tor (încă nu direct)\n* Suport 1080p/2K/4K\n* Vizionarea istoricului\n* Abonarea la canale\n* Căutarea în istoric\n* Căutarea/vizionarea playlisturilor\n* Vizionarea ca playlisturi puse în coadă\n* Punerea în coadă a videoclipurilor\n* Playlisturi locale\n* Subtitrări\n* Suport al transmiterilor live\n* Afişarea comentariilor\n\n### Servicii întreţinute\n\nNewPipe suportă servicii multiple. [Documentele](https://teamnewpipe.github.io/documentation/) noastre furnizează mai multe informaţii în legătură cu modalităţile prin care un nou serviciu poate fi adăugat aplicaţiei şi extractorului. Vă rugăm să ne contactaţi dacă doriţi să adăugaţi unul nou. Serviciile întreţinute acum sunt:\n\n* YouTube\n* SoundCloud \\[beta\\]\n* media.ccc.de \\[beta\\]\n* Instanţe PeerTube \\[beta\\]\n* Bandcamp \\[beta\\]\n\n<!-- Hidden span to keep old links compatible. -->\n<span id=\"updates\"></span>\n\n## Instalare şi actualizări\nPuteţi instala NewPipe folosind una dintre următoarele metode:\n 1. Adăugaţi depozitul nostru F-droid personalizat. Instrucţiunile sunt aici: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n 2. Descărcaţi APK-ul din [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) şi instalaţi-l.\n 3. Actualizaţi via F-Droid. Aceasta este cea mai lentă metodă de a obţine actualizări, deoarece F-Droid trebuie să recunoască schimbările, să constriască APK-ul, să îl semneze, iar apoi să îl trimită utilizatorilor.\n 4. Construiţi un APK de depanare. Aceasta este cea mai rapidă metodă de a primi funcţii noi, dar este mult mai complicată, aşa că vă recomandăm să folosiţi una dintre celelalte metode.\n\nRecomandăm metoda 1 pentru majoritatea utilizatorilor. APK-urile din metodele 1 şi 2 suntcompatibile una cu cealaltă, dar nu cu cele din metoda 3. Acest lucru se datorează faptului că aceeași cheie de semnare (a noastră) este utilizată pentru 1 și 2, dar o altă cheie de semnare (F-Droid) este utilizată pentru 3. Construirea unui APK de depanare folosind metoda 4 exclude o cheie în întregime. Cheile de semnare vă asigură că un utilizator nu este păcălit să instaleze o actualizare rău intenționată a unei aplicații.\n\nÎntre timp, dacă doriți să schimbați sursa dintr-un anumit motiv (de exemplu, funcționalitatea de bază a NewPipe a fost întreruptă și F-Droid nu are încă actualizarea), vă recomandăm să folosiţi următoarea procedură:\n1. Faceți o copie de rezervă a datelor prin Setări> Conținut> Exportați baza de date, astfel încât să vă păstrați istoricul, abonamentele și playlisturile\n2. Dezinstalaţi NewPipe\n3. Descărcaţi APK-ul din noua sursă şi instalaţi-l\n4. Importați datele de la pasul 1 prin Setări> Conținut> Importare bază de date\n\n## Contribuţie\nDacă aveţi idei, traduceri, schimbări de design, curaţarea codului, sau schimbări majore ale codului, ajutorul este întotdeauna binevenit.\nCu cât se face mai mult cu atât mai bună devine aplicaţia!\n\nDacă doriţi să vă implicaţi, accesaţi [notele noastre de contribuţie](../.github/CONTRIBUTING.md).\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Translation status\" />\n</a>\n\n## Donaţii\nDacă 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).\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"Visit NewPipe at liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Donate via Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Politica de Confidenţialitate\n\nProiectul NewPipe îşi propune să furnizeze o experienţă privată şi anonimă pentru utilizarea serviciilor web media.\nPrin urmare, aplicaţia nu colectează niciun fel de informaţii fără acordul dumneavoastră. Politica de confidențialitate a NewPipe explică în detaliu ce date sunt trimise și stocate atunci când trimiteți un raport de blocare sau comentați pe blogul nostru. Puteți găsi documentul [aici](https://newpipe.net/legal/privacy/).\n\n## Licenţă\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe este Software Gratuit: Îl puteţi folosi şi împărtăşi cum doriţi. Mai exact, îl puteți redistribui și / sau modifica în conformitate cu termenii\n[GNU General Public License](https://www.gnu.org/licenses/gpl.html) aşa cum a fost publicat de Free Software Foundation, fie versiunea 3 a Licenței, fie\n(la alegerea dvs.) orice versiune ulterioară.\n"
  },
  {
    "path": "doc/README.ru.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">Свободный и легковесный клиент потоковых сервисов для Android.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-en.svg\" alt=\"Скачать на F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub release\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"Лицензия: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Состояние сборки\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Состояние перевода\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"Канал IRC: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshots\">Скриншоты</a> &bull; <a href=\"#supported-services\">Поддерживаемые сервисы</a> &bull; <a href=\"#description\">Описание</a> &bull; <a href=\"#features\">Возможности</a> &bull; <a href=\"#installation-and-updates\">Установка и обновления</a> &bull; <a href=\"#contribution\">Участие</a> &bull; <a href=\"#donate\">Пожертвование</a> &bull; <a href=\"#license\">Лицензия</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Сайт</a> &bull; <a href=\"https://newpipe.net/blog/\">Блог</a> &bull; <a href=\"https://newpipe.net/FAQ/\">ЧЗВ</a> &bull; <a href=\"https://newpipe.net/press/\">Пресса</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>ЭТО ПРИЛОЖЕНИЕ НАХОДИТСЯ В СТАДИИ БЕТА, ПОЭТОМУ ВЫ МОЖЕТЕ ОБНАРУЖИТЬ ОШИБКИ. ЕСЛИ ЭТО СЛУЧИТСЯ, ОТКРОЙТЕ ВОПРОС В НАШЕМ РЕПОЗИТОРИИ GITHUB, ЗАПОЛНЯ ЕГО ПО ШАБЛОНУ.</b>\n>\n> <b>РАЗМЕЩЕНИЕ NEWPIPE ИЛИ ЕГО ОТВЕТВЛЕНИЙ В МАГАЗИНЕ GOOGLE PLAY НАРУШАЕТ ИХ УСЛОВИЯ И ПОЛОЖЕНИЯ.</b>\n\n## Скриншоты\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n\n### Поддерживаемые сервисы\n\nNewPipe на данный момент поддерживает эти сервисы:\n\n<!-- We link to the service websites separately to avoid people accidentally opening a website they didn't want to. -->\n* YouTube ([сайт](https://www.youtube.com/)) и YouTube Music ([сайт](https://music.youtube.com/)) ([Вики](https://en.wikipedia.org/wiki/YouTube))\n* PeerTube ([сайт](https://joinpeertube.org/)) и все его вариации (откройте этот сайт, чтобы понять о чём мы!) ([Вики](https://en.wikipedia.org/wiki/PeerTube))\n* Bandcamp ([сайт](https://bandcamp.com/)) ([Вики](https://en.wikipedia.org/wiki/Bandcamp))\n* SoundCloud ([сайт](https://soundcloud.com/)) ([Вики](https://en.wikipedia.org/wiki/SoundCloud))\n* media.ccc.de ([сайт](https://media.ccc.de/)) ([Вики](https://en.wikipedia.org/wiki/Chaos_Computer_Club))\n\nКак видите, NewPipe поддерживает несколько видео- и аудиосервисов. Хотя все началось с YouTube, с годами люди добавляли новые сервисы, делая NewPipe все более и более универсальным!\n\nЧастично из-за обстоятельств, а частично из-за своей популярности лучше всего из этих сервисов поддерживается YouTube. Если вы используете какие-либо из них или знакомы с ними, помогите нам улучшить их поддержку! Мы ищем сопровождающих для SoundCloud и PeerTube.\n\nЕсли вы хотите добавить новый сервис, сначала свяжитесь с нами! В нашей [документации](https://teamnewpipe.github.io/documentation/) содержится дополнительная информация о том, как можно добавить новый сервис в приложение и в [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor).\n\n## Описание\n\nNewPipe работает, извлекая необходимые данные из официального API (например, PeerTube) сервиса, который вы используете. Если официальный API ограничен (например, YouTube) для наших целей или является проприетарным, приложение анализирует веб-сайт или использует вместо этого внутренний API. Это означает, что вам не нужна учетная запись в этих сервисах для использования NewPipe.\n\nКроме того, поскольку это бесплатное и открытое программное обеспечение, ни приложение, ни Extractor не используют какие-либо проприетарные библиотеки или платформы, такие как Google Play Services. Это означает, что вы можете использовать NewPipe на устройствах или пользовательских ROM, на которых не установлены приложения Google.\n\n### Возможности\n\n* Смотрите видео с разрешением до 4K\n* Слушайте аудио в фоновом режиме, загружая аудиопоток только для сохранения данных\n* Режим всплывания (плавающий плеер, он же «Картинка в картинке»)\n* Смотрите прямые трансляции\n* Показать/скрыть субтитры/скрытые титры\n* Поиск видео и аудио (на YouTube вы также можете указать язык контента)\n* Очередь видео (и, при желании, сохраняйте их как локальные плейлисты)\n* Показать/скрыть общую информацию о видео (например, описание и теги)\n* Показать/скрыть следующие/похожие видео\n* Показать/скрыть комментарии\n* Поиск видео, аудио, каналов, плейлистов и альбомов\n* Просматривайте видео и аудио на канале\n* Подписывайтесь на каналы (да, без входа в какой-либо аккаунт!)\n* Получайте уведомления о новых видео с каналов, на которые вы подписаны\n* Создавайте и редактируйте группы каналов (для более удобного просмотра и управления)\n* Просматривайте ленты с видео, добавленными из ваших групп каналов\n* Обзор и поиск истории просмотра\n* Поиск и просмотр списков воспроизведения (это удаленные списки воспроизведения, что означает, что они получены из сервиса, которую вы просматриваете)\n* Создавайте и редактируйте локальные списки воспроизведения (они создаются и сохраняются в приложении и не имеют ничего общего с каким-либо сервисом)\n* Скачивайте видео/аудио/субтитры (скрытые титры)\n* Откройте в Kodi\n* Смотрите/блокируйте материалы с возрастным ограничением\n\n## Установка и обновления\nВы можете установить NewPipe одним из следующих способов:\n 1. Добавьте наш пользовательский репозиторий в F-Droid и установите его оттуда. Инструкции находятся здесь: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n 2. Скачайте APK из [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases) и установите его.\n 3. Обновите через F-Droid. Это самый медленный способ получения обновлений, так как F-Droid должен распознавать изменения, создавать сам APK, подписывать его, а затем отправлять обновления пользователям.\n 4. Создайте отладочный APK самостоятельно. Это самый быстрый способ получить новые функции на вашем устройстве, но он намного сложнее, поэтому мы рекомендуем использовать другие способы.\n 5. Если вас интересует конкретная функция или исправление ошибки, предоставленные в пул реквесте в этом репозитории, вы также можете скачать файл APK из PR. Прочтите описание PR для получения инструкций. Отличительной особенностью APK-файлов из PR является то, что они устанавливаются рядом с официальным приложением, поэтому вам не нужно беспокоиться о потере ваших данных или о том, что возникнет путаница.\n\nМы рекомендуем 1 способ для большинства пользователей. APK, установленные 1 или 2 способом, совместимы друг с другом (это означает, что если вы установили NewPipe с помощью способа 1 или 2, вы также можете обновить NewPipe с помощью другого), но не с теми APK, которые были установлены с помощью способа 3. Это потому, что для 1 и 2 способа используется один и тот же ключ подписи (наш), но для способа 3 используется другой ключ подписи (F-Droid). Создание отладочного APK с использованием 4 способа полностью исключает ключ. Ключи подписи помогают гарантировать, что пользователь не будет обманут установкой вредоносного обновления для приложения. При использовании 5 способа каждый APK подписывается разными случайными ключами, предоставляемыми GitHub Actions, поэтому вы даже не сможете его обновить. Вам придется делать резервную копию и восстанавливать данные приложения каждый раз, когда захотите использовать новый APK.\n\nМежду тем, если вы хотите по какой-то причине сменить источник (например, основные функции NewPipe не работают, а для F-Droid ещё нет последнего обновления), мы рекомендуем выполнить следующую процедуру:\n1. Создайте резервную копию своих данных через «Настройки» > «Контент» > «Экспортировать базу данных», чтобы сохранить историю, подписки и плейлисты.\n2. Удалите NewPipe\n3. Загрузите APK из нового источника и установите его.\n4. Импортируйте данные из шага 1 через «Настройки» > «Содержимое» > «Импортировать базу данных».\n\n<b>Примечание: когда вы импортируете базу данных в официальное приложение, убедитесь, что это именно та база данных, которую вы экспортировали _из_ официального приложения. Если вы импортируете базу данных, экспортированную из APK, отличного от официального приложения, это может привести к ошибке. Такое действие не поддерживается, и вы должны делать его только тогда, когда абсолютно уверены, что знаете, что делаете.</b>\n\n## Участие\nЕсли у вас есть идеи, переводы, изменения дизайна, очистка кода или даже серьезные изменения кода, помощь всегда приветствуется. Приложение становится всё лучше и лучше с каждым вкладом, независимо от того, большой он или маленький! Если вы хотите принять участие, ознакомьтесь с нашими [заметками об участии](/.github/CONTRIBUTING.md).\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Состояние перевода\">\n</a>\n\n## Пожертвование\nЕсли вам нравится NewPipe, вы можете отправить пожертвование. Мы предпочитаем Liberapay, так как это открытая и некоммерческая платформа. Для получения дополнительной информации о пожертвовании NewPipe посетите наш [сайт](https://newpipe.net/donate).\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"assets/liberapay_qr_code.png\" alt=\"Посетите NewPipe на liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"assets/liberapay_donate_button.svg\" alt=\"Пожертвование через Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Политика конфиденциальности\n\nЦелью проекта NewPipe является предоставление конфиденциального анонимного доступа к мультимедийным веб-сервисам. Поэтому приложение не собирает никаких данных без вашего согласия. Политика конфиденциальности NewPipe подробно объясняет, какие данные отправляются и сохраняются, когда вы отправляете отчёт о сбое или оставляете комментарий в нашем блоге. Вы можете найти документ [здесь](https://newpipe.net/legal/privacy/).\n\n## Лицензия\n[![Изображение GNU GPLv3](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.ru.html)  \n\nNewPipe — это бесплатное программное обеспечение: вы можете использовать, изучать, делиться и улучшать его по своему усмотрению. В частности, вы можете распространять и/или изменять ее в соответствии с условиями [Стандартной общественной лицензии GNU](https://www.gnu.org/licenses/gpl.html) (GPL-3.0), опубликованной Free Software Foundation, либо версии 3 Лицензии или (на ваш выбор) любая более поздняя версия.\n"
  },
  {
    "path": "doc/README.ryu.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">じゆーいっしけいりょうなAndroidんきーストリーミングフロントエンド</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-ja.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub リリース\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"ライセンス: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"ビルドじょうたい\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"ふんやちゅるじょうたい\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC チャンネル: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshots\">スクリーンショット</a> &bull; <a href=\"#description\">しちめい</a> &bull; <a href=\"#features\">ちぬー</a> &bull; <a href=\"#installation-and-updates\">インストールとぅこうしん</a> &bull; <a href=\"#contribution\">こうきん</a> &bull; <a href=\"#donate\">ちーふ</a> &bull; <a href=\"#license\">ライセンス</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">ウェブサイト</a> &bull; <a href=\"https://newpipe.net/blog/\">ブログ</a> &bull; <a href=\"https://newpipe.net/FAQ/\">FAQ</a> &bull; <a href=\"https://newpipe.net/press/\">ニュース</a></p>\n<hr>\n\n*ふかぬぎんぐっしゆむん： [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)*\n\n> [!warning]\n> <b>くれーベータばんぬたみ、バグぬはっせいすがのうゆいがあいびーん。むしバグぬはっせいさーあい、GitHubぬリポジトリっしIssueふぃらちくぃみそーれー。</b>\n>\n> <b>NewPipeうゆびいじりぬフォークGoogle Playストアんかいかんかいしーねー、Googleぬとぅいふぃちじょうきんぬいはんになります。</b>\n\n<span id=\"screenshots\"></span>\n## スクリーンショット\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n<span id=\"description\"></span>\n## しちめい\n\nじゆうなコピーレフトソフトウェアぬNewPipeーいっさいぬGoogleフレームワークライブラリうゆび、YouTube APIさしましん。ウェブサイトーふぃちぐとーるじょうほうぬたみてーぬんかいゆみくまりーるたみ、くぬアプレーGoogleぬサービスぬインストールさりてぃうぅらんたんまちっししようぬなやびーん。また、NewPipeぬしようんかいYouTubeアカウントーふぃちようとぅなやびらん。\n\n<span id=\"features\"></span>\n### ちぬー\n\n* ちゃーしがぬきんさく\n* ちゃーしがどぅちふんじょうほうぬひょうじ\n* YouTubeぬちゃーしがぬしちょう\n* YouTubeぬちゃーしがぬバックグラウンドさいせい\n* ポップアップモード（フローティングプレイヤー）\n* ちゃーしがしちょうするストリーミングプレイヤーぬしんたく\n* ちゃーしがぬダウンロード\n* うんせいぬみぬダウンロード\n* Kodiっしぬちゃーしがさいせい\n* ちぎぬちゃーしが/かんりんちゃーしがぬひょうじ\n* とぅくていぬぎんぐぬYouTubeぬきんさく\n* されいゆいぎんぬあるコンテンツぬしちょう/ブロック\n* チャンネルぬきふんじょうほうぬひょうじ\n* チャンネルぬきんさく\n* チャンネルからぬちゃーしがぬしちょう\n* Orbot/Torたいおう（ちょくしちてぃきなむぬはみじっそう）\n* 1080p/2K/4Kたいおう\n* りりきぬひょうじ\n* チャンネルぬとぅうるく\n* りりきぬきんさく\n* さいせいリストぬきんさく/しちょう\n* さいせいリストキューんかいちいからちさいせい\n* ちゃーしがぬキューんかいぬちいが\n* たんまちなじぬさいせいリスト\n* じまちゅん\n* ライブーいしんぬたいおう\n* コメントぬひょうじ\n\n### たいおうそーるサービス\n\nNewPipeーふくすんぬサービスんかいたいおうそーいびーん。[ドキュメント](https://teamnewpipe.github.io/documentation/)ー、ちゃぬぐとぅしアプリとぅNewPipe Extractorんかいサービス追加ないがにちいてぃしーょうさいなじょうほうていきょうそーいびーん。むし、みーさるサービスちいかすいらー、じふぃわったーんかいりんらくうにげーさびら。ぎんじぇーたいおうそーるサービスー：\n\n* YouTube\n* SoundCloud \\[ベータ\\]\n* media.ccc.de \\[ベータ\\]\n* PeerTube インスタンス \\[ベータ\\]\n* Bandcamp \\[ベータ\\]\n\n<!-- Hidden span to keep old links compatible. -->\n<span id=\"updates\"></span>\n\n<span id=\"installation-and-updates\"></span>\n## インストールとぅこうしん\nいかぬほうほうぬいじりがんかいしたがいるくとぅにゆってぃNewPipeインストールなやびーん。\n1. カスタムリポジトリF-Droidんかいちいからちリリースぬかんかいされいしだいインストールすん。くぬほうほうぬしちめえーくちら： https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n2. リリースぬかんかいされいしだい[GitHubぬリリース](https://github.com/TeamNewPipe/NewPipe/releases)からAPKダウンロードしインストールすん。\n3. F-Droidからこうしんすん。くれーこうしんてぃなするういっしむっとぅむにーさるほうほうやいびーん。F-Droidがへいるかんきんちし、APKビルドしー、しょめい、あんしユーザーんかいこうしんとぅどぅきーるふぃちようがあるたみやいびーん。\n4. じぶんっしデバッグAPKビルドすん。くれーみーさるちぬーしようするういっしむっとぅむふぇーさるほうほうやいびーしが、ふかんでぃくらびてぃいっぺーふちゅるざちやくとぅ、ふかぬほうほうぬしようすいしょうさびーん。\n\nわったーやふとぅんどぅぬユーザーんかいほうほう1すいしょうさびーん。ほうほう1んでぃ2っしインストールさったん APKーぐかんせいがあいびーしが、ほうほう3っしインストールさったるむぬんかえーあいびらん。くれーほうほう1んでぃ2っしぇー、いぬしょめいかぎ（わったーがしようすし）がささりやびーしが、ほうほう3っしぇーくとぅなたしょめいかぎ（F-Droidがしようすし）がささりーるたみやいびーん。ほうほう4ちかたるデバッグAPKぬビルドーくでぃぷんてぃきなしょめいかぎぬむんだいをぬずきます。しーょめいかぎはユーザーぬだまさってぃあくいぬあるこうしんぬアプリんかいインストールさりらんくとぅたしきーんでぃあいびーん。\n\nむし、ぬーやいびーがやーぬいゆーいんにゆりソースきりけーたるいばあい（れい： NewPipeぬコアちぬーがやんでぃてぃねーんしがF-Droidーなーらこうしんしうぅらん）ー、くぬてぃじゅんをすいしょうさびーん。\n1. りりきやとぅいるるいちゅるチャンネル、さいせいリストたむちゅんでぃ しってい > コンテンツ > データベースエクスポートからデータバックアップ\n2. NewPipeアンインストール\n3. みーさるソースからAPKダウンロードしインストール\n4. しってい > コンテンツ > データベースインポートからステップ1っしちゅくたるデータベースインポート\n\n<span id=\"contribution\"></span>\n## こうきん\nふんやちゅん、デザインぬへんかん、コードぬせいり、だいきぶやーコードぬへんかんんでーぬたしきーやいちやてぃんかんぎうぅいさびーん。\nゆりじょーとぅーまじゅんちゅくいとぅらさびら！\n\nむしこうきんさるいばあい、[こうきんノート](../.github/CONTRIBUTING.md)ぐかくにんくぃみそーれー。\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"ふんやちゅるじょうたい\" />\n</a>\n\n<span id=\"donate\"></span>\n## ちーふ\nむし、NewPipeちーがんじいただけいねー、ちーふしいただけいねーうっさいびーん。BitcoinあらんでぃBountysource,Liberapayからちーふするくとぅがなやびーん。NewPipeんかいどぅちふにちいてー、[ウェブサイト](https://newpipe.net/donate)からうにげーさびら。\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"liberapay.comっしNewPipeちゅーん\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Liberapayなちーふ\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## プライバシーポリシー\nNewPipeプロジェクトーメディアウェブサービスしようするういっしぬプライベートっしとぅくめいぬたいきんてぃいちょうするくとぅをむくてぃきとぅそーいびーん。\nうぬたみ、アプリーうんじゅがちゃーいなしっしいっさいぬデータしゅうしゅうさびらん。NewPipeぬプライバシーポリシーやうんじゅがクラッシュレポートあらんでぃ、わったーがブログっしコメントあんしんさーあいんかいちゃぬぐとーるデータぬあんしんされい、ふずんさりーるぬがしーょうさいにしちめいそーいびーん。うぬドキュメントー[くちら](https://newpipe.net/legal/privacy/)からみーちきーるくとぅがなやびーん。\n\n<span id=\"license\"></span>\n## ライセンス\n[![GNU GPLv3ぬロゴ](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipeーフリーソフトウェアやくとぅ、うんじょーうんじゅがぬじゅむるぐとぅさ、しゅうとぅく、きょうゆう、かいじんうくねーやびーん。\nぐたちちーがー、フリーソフトウェアじぇーやんんにゆりかんかいさったん [GNU General Public License](https://www.gnu.org/licenses/gpl.html) ぬバージョン3ぬライセンスあらんでぃ、（うんじゅがしんたくでぃ）いじりがぬこうけいバージョンぬきやくぬむとぅっしはいふあらんでぃかいんかいんうくないるくとぅがなやびーん。\n"
  },
  {
    "path": "doc/README.so.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">App bilaash ah oo fudud looguna talagalay in Android-ka wax loogu daawado.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-so.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"Siidaynta GitHub \"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"Laysinka: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Darajada Dhismaha\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Heerka Turjimaada\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"Kanaalka IRC: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#sawir-shaashadeed\">Sawir-shaashadeed</a> &bull; <a href=\"#faahfaahin\">Faahfaahin</a> &bull; <a href=\"#waxqabadka\">Waxqabadka</a> &bull; <a href=\"#kushubida-iyo-cusboonaysiinta\">Kushubida iyo cusboonaysiinta</a> &bull; <a href=\"#kusoo-kordhin\">Kusoo Kordhin</a> &bull; <a href=\"#ugu-deeq\">Ugu Deeq</a> &bull; <a href=\"#laysinka\">Laysinka</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Website-ka</a> &bull; <a href=\"https://newpipe.net/blog/\">Maqaalada</a> &bull; <a href=\"https://newpipe.net/FAQ/\">Su'aalaha Aalaa La-iswaydiiyo</a> &bull; <a href=\"https://newpipe.net/press/\">Warbaahinta</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>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.</b>\n>\n> <b>NEWPIPE AMA KUWA KU SALAYSAN IN PLAYSTORE-KA LA GALIYO WAXAY KA HOR IMANAYSAA SHARCIGA IYO SHURUUDAHA AY LEEYIHIIN.</b>\n\n## Sawir-shaashadeed\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n## Faahfaahin\n\nNewPipe ma isticmalo nidaamka wada shaqaynta Google, ama API-ga YouTube. Kaliya website-yada ayaa la furaa si xogta loo baahanyahay loogala soo dhex baxo, App-kan waxaa lagu isticmaali karaa aaladaha aysa ku jirin Adeegyada Google. Sidoo kale, uma baahnid akoon YouTube ah si aad u isticmaasho NewPipe, kaasoo ah barnaamij bilaash ah.\n\n### Waxqabadka\n\n* Raadi muuqaalo\n* Soo bandhiga faahfaahin guud oo muuqaalada ku saabsan\n* Ku daawo muuqaalada YouTube\n* Dhagayso muuqaalada YouTube\n* Qaab daaqad ah (muuqaal daare yar oo application-nada dul fuula)\n* Dooro muuqaal daareha aad rabto inaad wax ku daawato\n* Daji muuqaalada\n* Daji dhagaysiga kaliya (cod)\n* Ku fur muuqaal Kodi\n* Tus muuqaalada ka xiga/kuwa lamidka ah\n* Inaad luuqada aad rabto wax kaga dhex raadiso YouTube\n* Daawo/xanib muuqaalada da'da ku xidhan\n* Soo bandhig xog guud oo ku saabsan kanaalada\n* Raadi kanaalo\n* Daawo muuqaalada kanaal\n* Taageerida Orbot/Tor (wali toos ma aha)\n* Taageerida muuqaalada 1080p/2K/4K \n* Kaydka wixii hore [aad u daawatay]\n* Inaad rukumato kanaalada\n* Kaydinta waxaad raadisay\n* Raadi/daawo xulalka\n* U daawo sidii xulal la horay\n* Hormo gali muuqaalada\n* Xulal gudaha [aalada] ah\n* Qoraal-hooseed\n* Taageerida waxyaabaha tooska ah\n* Soo bandhiga faalooyinka\n\n### Adeegyada la Taageero\n\nNewPipe wuxuu taageeraa adeegyo badan. [warqadan](https://teamnewpipe.github.io/documentation/) ayaa si faahfaahsan u sharaxaysa sida adeeg cusub loogu soo dari lahaa iyo kala fur-furaha. Fadlan nala soo xidhiidh hadaad rabto inaad mid cusub kusoo darto. Adeegyada aan hadda taageero waxaa kamid ah:\n\n* YouTube\n* SoundCloud \\[tijaabo\\]\n* media.ccc.de \\[tijaabo\\]\n* PeerTube instances \\[tijaabo\\]\n* Bandcamp \\[tijaabo\\]\n\n## Kushubida iyo cusboonaysiinta\nMarka koodhka NewPipe isbadal ku dhaco (wax cusub oo lagusoo kordhiyay ama cilad bixin), ugu dambayn waxaa lasii daayaa mid cusub (Siidayn). Siidaynta qaabkeedu waa x.xx.x . Si aad midka cusub u hesho, waxaad samayn kartaa:\n 1. Inaad mid cusub (APK) adigu dhisato. Tani waa mida ugu dagdag badan eed waxyaabaha cusub ku heli karto, laakiin way adagtahay, sidaa darteed waxaan soojeedinaynaa inaad isticmaasho qababka kale.\n 2. Ku dar qayb gaar ah xaganaga F-Droid oo xagaas kaga shub isla markay siidayn soobaxdo. Hagitaanka xagan ka eeg: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n 3. Kasoo dajiso APK-ga xaga [Siidaynta GitHub](https://github.com/TeamNewPipe/NewPipe/releases) oo ku shubo isla markay siidayn soobaxdo.\n 4. Ka cusboonaysii xaga F-Droid. Tani waa mida ugu daahitaanka badan, sababtoo ah F-Droid waxay fiirin isbadalka waxayna iyadu dhisi mid (app), sixiixi, kadibna ay cusboonaysiinta usiidayn isticmaalayaasha.\n\nWaxaan usoojeedinaynaa isticmaaalka qaabka 2 dadka badankood. APK-yada loogu shubo qaabka 2 ama 3 way isqaadan karaan, laakiin isma qaadan karaan kuwa loogu shubay qaabka 4. Sababtuna waxaa weeye furaha sixiixa oo iskumid ah (kaanaga weeye) oo loo isticmaalay 2 iyo 3, laakiin furo sixiixeed ka duwan (midka F-Droid) oo loo isticmaalay 4. Dhisida APK ayadoo la isticmaalayo qaabka 1 waxay gabi ahaanba ka reebtaa wax fure ah. Furayaasha sixiixa waxay xaqiijiyaan in isticmaalaha aan lagu khaldin inuu ku shubto cusboonaysiin khalad ah (wax lasoo dhexraaciyay) app-ka.\n\nWaxaa kale, hadaad rabto inaad tixraacayada kala badasho sabab jirta awgeed (tusaale shaqaynta aasaasiga ah ee NewPipe ayaa khalkhashay F-Droid-na wali cusboonysiin ma hayo), waxaan soojeedinaynaa isticmaalka qaabkan:\n1. Xogtaada koobi ka samee adoo raacaya Fadhiga > Luuqada & Fadhiga Kale > Gudbi Xog Diyaaran si aysa kaaga bixin kaydka wixii hore, rukunka, iyo xulalka\n2. Saar NewPipe\n3. Kasoo daji APK-ga tixraaca cusub oo ku shub\n4. Kasoo gali xogta talaabada 1 xaga Fadhiga > Luuqada & Fadhiga Kale >  Soo Gali Xog Kaydsan\n\n## Kusoo Kordhin\nHadaad hayso fikrado; rogid, qaab badal, nadiifin koodh, ama koodhka ood si wayn wax oga badashaa—caawinta marwalba waa lasoo dhawaynayaa. Waxbadan hadii la qabto waxbadan ayaa fiicnaan!\n\nHadaad jeceshahay inaad qayb ka noqoto, fiiri [ogaysiisyada kusoo kordhinta](../.github/CONTRIBUTING.md).\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Heerka turjimaada\" />\n</a>\n\n## Ugu Deeq\nHadaad 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).\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"Visit NewPipe at liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Donate via Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Siyaasada Sirdhawrka\n\nMashruuca NewPipe waxay ujeedadiisu tahay inuu bixiyo wax kuu gaar ah, oo adoon shaqsi ahaan laguu aqoonsan aad isticmaasho website-yada wax laga daawado/dhagaysto.\nSidaa darteed, app-ku wax xog ah ma uruuriyo fasaxaaga la'aantii. Siyaasada Sirdhawrka NewPipe ayaa si faahfaahsan u sharaxda waxii xog ah ee la diro markaad cillad wariso, ama aad bogganaga faallo ka dhiibato. Warqada waxaad ka heli kartaa [halkan](https://newpipe.net/legal/privacy/).\n\n## Laysinka\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe waa barnaamij bilaash ah oon lahayn xuquuqda daabacaada: Waad isticmaali kartaa, waad wadaagi kartaa waadna hormarin kartaa hadaad rabto. Gaar ahaan waad sii daabici kartaa ama wax baad ka badali kartaa ayadoo la raacayo shuruudaha sharciga guud ee [GNU](https://www.gnu.org/licenses/gpl.html) sida ay soosaareen Ururka Barnaamijyada Bilaashka ah, soosaarista 3aad ee laysinka, ama (hadaad doonto) nooc walba oo kasii dambeeyay laysinkii 3aad. \n"
  },
  {
    "path": "doc/README.sr.md",
    "content": "<h3 align=\"center\"><html>Планирамо да <i>препишемо</i> велике делове кода, како бисмо створили <a href=\"https://github.com/TeamNewPipe/NewPipe/discussions/10118\">нови, модеран и стабилан NewPipe</a>!</h3>\n<h4 align=\"center\"><b>Немојте</b> сада слати захтеве за <i>нове функције</i>, прихватаће се само захтеви за исправљање грешака.</h4>\n\n<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">Бесплатна и лагана апликација за стримовање за Android.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-sr.svg\" alt=\"Набавите на F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub release\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"License: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Build Status\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Translation Status\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC channel: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshots\">Снимци екрана</a> &bull; <a href=\"#supported-services\">Подржане услуге</a> &bull; <a href=\"#description\">Опис</a> &bull; <a href=\"#features\">Карактеристике</a> &bull; <a href=\"#installation-and-updates\">Инсталација и ажурирања</a> &bull; <a href=\"#contribution\">Допринос</a> &bull; <a href=\"#donate\">Донација</a> &bull; <a href=\"#license\">Лиценца</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Веб-сајт</a> &bull; <a href=\"https://newpipe.net/blog/\">Блог</a> &bull; <a href=\"https://newpipe.net/FAQ/\">ЧПП</a> &bull; <a href=\"https://newpipe.net/press/\">Штампа</a></p>\n<hr>\n\n*Прочитајте овај документ на другим језицима: [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)*\n\n> [!warning]\n> <b>ОВА АПЛИКАЦИЈА ЈЕ У БЕТА ВЕРЗИЈИ, ТАКО ДА МОЖЕТЕ НАИЋИ НА ГРЕШКЕ. АКО НАИЂЕТЕ, НАПИШИТЕ ИЗВЕШТАЈ У НАШЕМ GITHUB РЕПОЗИТОРИЈУМУ ПОПУЊАВАЊЕМ ШАБЛОНА ИЗВЕШТАЈА.</b>\n>\n> <b>ПОСТАВЉАЊЕ АПЛИКАЦИЈЕ NEWPIPE ИЛИ БИЛО КОГ ЊЕНОГ ФОРКА, У GOOGLE PLAY ПРОДАВНИЦУ КРШИ ЊИХОВЕ УСЛОВЕ И ОДРЕДБЕ.</b>\n\n## Снимци екрана\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n### Подржане услуге\n\nNewPipe тренутно подржава ове услуге: \n\n<!-- Повезујемо се са веб-сајтовима услуга одвојено, како бисмо избегли да људи случајно отворе веб-сајт који нису желели. -->\n* YouTube ([веб-сајт](https://www.youtube.com/)) и YouTube Music ([веб-сајт](https://music.youtube.com/)) ([вики](https://en.wikipedia.org/wiki/YouTube))\n* PeerTube ([веб-сајт](https://joinpeertube.org/)) и све његове инстанце (отворите веб-сајт да бисте сазнали шта то значи!) ([вики](https://en.wikipedia.org/wiki/PeerTube))\n* Bandcamp ([веб-сајт](https://bandcamp.com/)) ([вики](https://en.wikipedia.org/wiki/Bandcamp))\n* SoundCloud ([веб-сајт](https://soundcloud.com/)) ([вики](https://en.wikipedia.org/wiki/SoundCloud))\n* media.ccc.de ([веб-сајт](https://media.ccc.de/)) ([вики](https://en.wikipedia.org/wiki/Chaos_Computer_Club))\n\nКао што видите, NewPipe подржава више видео и аудио услуга. Иако је почело са YouTube-ом, други људи су додали више услуга током година, чинећи NewPipe све разноврснијим!\n\nДелимично због околности, а делимично због своје популарности, YouTube је најбоље подржан од ових услуга. Ако користите или сте упознати са било којом од ових других услуга, помозите нам да побољшамо подршку за њих! Тражимо одржаваоце за SoundCloud и PeerTube.\n\nАко намеравате да додате нову услугу, прво нас контактирајте! Наши [документи](https://teamnewpipe.github.io/documentation/) пружају више информација о томе како се нова услуга може додати у апликацију и у [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor).\n\n## Опис\n\nNewPipe ради тако што преузима потребне податке из званичног API-ја (нпр. PeerTube) услуге коју користите. Ако је званични API ограничен (нпр. YouTube) за наше сврхе или је власнички, апликација анализира веб-сајт или уместо тога користи унутрашњи API. То значи да вам није потребан налог ни на једној услузи да бисте користили NewPipe.\n\nТакође, пошто су бесплатни и отвореног кода, ни апликација, ни Extractor не користе никакве власничке библиотеке или радне оквире, као што су Google Play услуге. То значи да можете да користите NewPipe на уређајима или прилагођеним ROM-овима који немају инсталиране Google апликације.\n\n### Карактеристике\n\n * Гледајте видео снимке у резолуцијама до 4К\n * Слушајте аудио снимке у позадини, само учитавајући аудио стрим да бисте сачували податке\n * Искачући режим (плутајући плејер, познат као „Слика у слици”)\n * Гледајте стримове уживо\n * Прикажите/сакријте титлове/скривене титлове\n * Претражујте видео и аудио снимке (на YouTube-у можете одредити и језик садржаја)\n * Ставите видео снимке у ред чекања (и опционо их сачувајте као локалне плејлисте)\n * Прикажите/сакријте опште информације о видео снимцима (као што су опис и ознаке)\n * Прикажите/сакријте следеће/сродне видео снимке\n * Прикажите/сакријте коментаре\n * Претражујте видео снимке, аудио снимке, канале, плејлисте и албуме\n * Прегледајте видео и аудио снимке унутар канала\n * Претплатите се на канале (да, без пријављивања на било који налог!)\n * Добијајте обавештења о новим видео снимцима са канала на које сте претплаћени\n * Креирајте и уређујте групе канала (за лакше прегледање и управљање)\n * Прегледајте фидове видео снимака генерисане из ваших група канала\n * Прегледајте и претражујте историју гледања\n * Претражујте и гледајте плејлисте (ово су даљинске плејлисте, што значи да се преузимају са услуге коју прегледате)\n * Направите и уређујте локалне плејлисте (оне се креирају и чувају у апликацији и немају никакве везе са било којом услугом)\n * Преузмите видео снимке/аудио снимке/титлове (скривене титлове)\n * Отварајте у Kodi-ју\n * Гледајте/блокирајте старосно ограничени материјал\n\n## Инсталација и ажурирања\nМожете да инсталирате NewPipe користећи један од следећих начина:\n 1. Додајте наш прилагођени репозиторијум на F-Droid и инсталирајте га одатле. Упутства су овде: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n 2. Преузмите APK са [GitHub издања](https://github.com/TeamNewPipe/NewPipe/releases) и инсталирајте га.\n 3. Ажурирајте преко F-Droid-а. Ово је најспорији начин добијања ажурирања, јер F-Droid мора да препозна промене, да направи сам APK, да га потпише, а затим да ажурирање пошаље корисницима.\n 4. Сами направите APK за отклањање грешака. Ово је најбржи начин да добијете нове функције на свом уређају, али је много компликованији, па препоручујемо да користите неки од других начина. \n 5. Ако сте заинтересовани за одређену функцију или исправку грешке која се налази у захтеву за повлачење у овом репозиторијуму, такође можете преузети његов APK из захтева за повлачење. Прочитајте опис захтева за повлачење за упутства. Одлична ствар у вези са APK-овима специфичним за захтев за повлачење је то што су инсталирани упоредо са званичном апликацијом, тако да не морате да бринете да ћете изгубити своје податке или нешто забрљати. \n\nПрепоручујемо 1. начин за већину корисника. APK-ови инсталирани коришћењем 1. или 2. начина су компатибилни један са другим (што значи да ако сте инсталирали NewPipe користећи било који 1. или 2. начин, можете, такође, да ажурирате NewPipe користећи други начин), али не и са онима инсталираним коришћењем 3. начина. То је због истог кључа за потписивање (нашег) који се користи за 1. и 2. начин, али се други кључ за потписивање (F-Droid-ови) користи за 3. начин. Израда APK-а за отклањање грешака коришћењем 4. начина искључује кључ у потпуности. Кључеви за потписивање помажу да се осигура да корисник не буде преварен да инсталира злонамерно ажурирање за апликацију. Када користите 5. начин, сваки APK је потписан различитим, насумичним кључем који обезбеђује GitHub Actions, тако да не можете ни да га ажурирате. Мораћете да направите резервну копију и вратите податке апликације сваки пут када желите да користите нови APK.\n\nУ међувремену, ако желите да промените изворе из неког разлога (нпр. основна функционалност NewPipe-а се прекида, а F-Droid још увек нема најновије ажурирање), препоручујемо вам да следите ову процедуру: 1. Направите резервну копију података преко Подешавања > Садржај > Извези базу података, да бисте задржали своју историју, претплате и листе песама 2. Деинсталирајте NewPipe 3. Преузмите APK са новог извора и инсталирајте га 4. Увезите податке из 1. корака преко Подешавања > Садржај > Увези базу података\n\n<b>Напомена: када увозите базу података у званичну апликацију, увек се уверите да је то она коју сте извезли _из_ званичне апликације. Ако увезете базу података извезену из APK-а, који није званична апликација, то може покварити ствари. Таква радња није подржана и требало би да то урадите само када сте потпуно сигурни да знате шта радите.</b>\n\n## Допринос\nБез обзира да ли имате идеје, преводе, промене дизајна, чишћење кода или чак велике промене кода, помоћ је увек добродошла. Апликација постаје све боља и боља са сваким доприносом, без обзира колико је он велики или мали! Ако желите да се укључите, погледајте наше [напомене о доприносима](/.github/CONTRIBUTING.md).\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Статус превода\" />\n</a>\n\n## Донација\nАко вам се свиђа NewPipe, можете послати донацију. Више волимо Liberapay, јер је отвореног кода и непрофитан. За више информација о донирању апликацији NewPipe, посетите наш [веб-сајт](https://newpipe.net/donate).\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"Visit NewPipe at liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Donate via Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Политика приватности\n\nПројекат NewPipe има за циљ да обезбеди приватно, анонимно искуство за коришћење медијских услуга заснованих на вебу. Стога, апликација не прикупља никакве податке без вашег пристанка. Политика приватности апликације NewPipe детаљно објашњава који се подаци шаљу и чувају када пошаљете извештај о отказивању или оставите коментар на нашем блогу. Документ можете пронаћи [овде](https://newpipe.net/legal/privacy/).\n\n## Лиценца\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe је бесплатан софтвер: можете га користити, проучавати, делити и побољшавати по жељи. Конкретно, можете га редистрибуирати и/или модификовати под условима [GNU General Public License](https://www.gnu.org/licenses/gpl.html), коју је објавила Фондација за слободни софтвер, било верзију 3 лиценце или (по вашем избору) било коју каснију верзију.\n"
  },
  {
    "path": "doc/README.tr.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">Android için hafif ve özgür bir akış arayüzü.</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-tr.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub sürümleri\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"Lisans: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"Derleme Durumu\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"Çeviri Durumu\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC kanalı: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#ekran-fotoğrafları\">Ekran fotoğrafları</a> &bull; <a href=\"#açıklama\">Açıklama</a> &bull; <a href=\"#özellikler\">Özellikler</a> &bull; <a href=\"#kurulum-ve-güncellemeler\">Kurulum ve güncellemeler</a> &bull; <a href=\"#katkıda-bulunma\">Katkıda bulunma</a> &bull; <a href=\"#bağış\">Bağış</a> &bull; <a href=\"#lisans\">Lisans</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">Web sitesi</a> &bull; <a href=\"https://newpipe.net/blog/\">Blog</a> &bull; <a href=\"https://newpipe.net/FAQ/\">SSS</a> &bull; <a href=\"https://newpipe.net/press/\">Basın</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>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.</b>\n>\n> <b>GOOGLE PLAY STORE'A NEWPIPE VEYA BAŞKA BİR KOPYASINI KOYMAK, PLAY STORE ŞARTLARINI VE KOŞULLARINI İHLAL EDER.</b>\n\n## Ekran görüntüleri\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n## Açıklama\n\nNewPipe herhangi bir Google çerçeve kütüphanesini, ya da YouTube API hizmetlerini kullanmaz. Gerekli web hizmetleri yalnızca gerekli bilgileri almak için kaynak olarak kullanılır, bu nedenle bu uygulama Google hizmetleri yüklü olmayan cihazlarda da kullanılabilir. Ayrıca, copyleft özgür yazılımı olan NewPipe'ı kullanmak için bir YouTube hesabına ihtiyacınız yoktur.\n\n### Özellikler\n\n* Video arama\n* Videolar hakkında genel bilgileri görüntüleme\n* YouTube videoları izleme\n* YouTube videolarını dinleme\n* Pop-up modu (hareketli oynatıcı)\n* Video izlemek için akış oynatıcısını seçme\n* Video indirme\n* Sadece ses indirme\n* Videoyu Kodi'de açma\n* Sonraki video/ilgili videolar\n* YouTube'u belirli bir dilde arayın\n* Yaş sınırlı içeriği izleme/engelleme\n* Kanallar hakkındaki genel bilgileri görüntüleme\n* Kanal arama\n* Bir kanaldaki videoları izleme\n* Orbot/Tor desteği (henüz direkt olarak değil)\n* 1080p/2K/4K desteği\n* Geçmişi görme\n* Kanallara abone olma\n* Geçmişte arama\n* Oynatma listesi arama/oynatma\n* Çalma listelerini sıralayıp oynatın\n* Videoları sırayla oynatın\n* Yerel oynatma listeleri\n* Altyazılar\n* Canlı yayın desteği\n* Yorumları görme\n\n### Desteklenen servisler\n\nNewPipe birden fazla hizmeti destekler. Uygulamaya ve ayıklayıcıya yeni bir hizmet ekleme konusunda daha fazla bilgiye [kılavuzlarımızdan](https://teamnewpipe.github.io/documentation/) ulaşabilirsiniz. Yeni bir hizmet eklemek istiyorsanız lütfen bizimle iletişime geçin. Şu anda desteklenen hizmetler şunlardır:\n\n* YouTube\n* SoundCloud \\[beta\\]\n* media.ccc.de \\[beta\\]\n* PeerTube \\[beta\\]\n* Bandcamp \\[beta\\]\n\n<!-- Eski bağlantıları uyumlu tutmak için gizli span. -->\n<span id=\"updates\"></span>\n\n## Kurulum ve güncellemeler\nAşağıdaki yöntemlerden birini kullanarak NewPipe'ı kurabilirsiniz:\n 1. Özel depomuzu F-Droid'e ekleyin ve oradan yükleyin. Kılavuzu şurada bulabilirsiniz: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n 2. APK'yı [GitHub sürümlerinden](https://github.com/TeamNewPipe/NewPipe/releases) indirin ve kurun.\n 3. F-Droid ile güncelleyin. Bu, güncellemeleri almanın en yavaş yöntemidir, çünkü F-Droid değişiklikleri tanımalı, APK'yı kendisi oluşturmalı, imzalamalı ve ardından güncellemeyi kullanıcılara dağıtmalıdır.\n 4. Kendiniz bir APK derleyin. Bu yöntem, cihazınızda yeni özellikler edinmenin en hızlı yoludur, ancak çok daha karmaşıktır, bu nedenle diğer yöntemlerden birini kullanmanızı öneririz.\n\nÇoğu kullanıcı için yöntem 1'i öneririz. Yöntem 1 veya 2 kullanılarak yüklenen APK'lar birbiriyle uyumludur, ancak yöntem 3 kullanılarak yüklenenlerle uyumlu değildir. Bu durum, 1 ve 2 için kullanılan aynı imzalama anahtarıın (bizim anahtarımız) 3 için kullanılan imzalama anahtarından (F-Droid'in anahtarı) farklı olmasından kaynaklanmaktadır. Yöntem 4 kullanılarak oluşturulan deneysel APK'larda anahtar yoktur. İmzalama anahtarları, bir kullanıcının bir uygulamaya kötü amaçlı bir güncelleme yüklemek için kandırılmadığından emin olmanıza yardımcı olur.\n\nBu arada, herhangi bir nedenle kaynakları değiştirmek istiyorsanız (örneğin, NewPipe'ın temel bir işlevi bozuldu ve F-Droid tarafında henüz bir güncelleme yayınlanmadı), bu prosedürü izlemenizi öneririz:\n1. Verilerinizi yedekleyin. `NewPipe Ayarları > İçerik > Veritabanını dışa aktar` seçeneklerini izleyerek aboneliklerinizi, oynatma listelerinizi ve geçmişinizi yedekleyin.\n2. NewPipe'ı kaldırın\n3. APK dosyasını yeni bir kaynaktan indirin ve yükleyin\n4. `Ayarlar > İçerik > Veritabanını içe aktar` seçeneklerini izleyerek 1. adımdaki verileri içe aktarın\n\n## Katkıda bulunma\nFikirleriniz, çevirileriniz, tasarım değişiklikleriniz, kod temizlemeniz veya ağır kod değişiklikleriniz olsun, yardımınıza her zaman açığız.\nYapılan her değişiklikle NewPipe daha da iyi bir konuma geliyor!\n\nEğer yer almak istiyorsanız, [katkı sağlayanlar için hazırladığımız notları](../.github/CONTRIBUTING.md) kontrol edin.\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Çeviri istatistikleri\" />\n</a>\n\n## Bağış\nNewPipe'ı 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.\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"liberapay.com üzerinde NewPipe'ı ziyaret edin\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Liberapay aracılığıyla bağış yapın\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## Gizlilik politikası\n\nNewPipe projesi, çevrimiçi akış hizmetlerini kullanmak için özel, özgür ve anonim bir deneyim sunmayı amaçlamaktadır.\nBu doğrultuda, uygulama sizin izniniz olmadan herhangi bir veri toplamaz. NewPipe'ın Gizlilik Politikası, bir çökme raporu gönderdiğinizde veya blogumuzda yorum yaptığınızda hangi verilerin gönderildiğini ve saklandığını ayrıntılı olarak açıklar. İlgili belgeyi [burada](https://newpipe.net/legal/privacy/) bulabilirsiniz.\n\n## Lisans\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe özgür bir yazılımdır. Kendi başınıza kullanabilir, öğrenebilir, paylaşabilir\nve geliştirebilirsiniz. Free Software Foundation tarafından yayınlanan GNU Genel Kamu Lisansı,\nLisansın 3. sürümü veya (isteğe bağlı olarak) daha sonraki bir sürümü şartları ve\nkoşulları altında yeniden dağıtabilir ve/veya değiştirebilirsiniz.\n"
  },
  {
    "path": "doc/README.zh_TW.md",
    "content": "<p align=\"center\"><a href=\"https://newpipe.net\"><img src=\"../assets/new_pipe_icon_5.png\" width=\"150\"></a></p> \n<h2 align=\"center\"><b>NewPipe</b></h2>\n<h4 align=\"center\">輕巧的 Android 串流前端</h4>\n\n<p align=\"center\"><a href=\"https://f-droid.org/packages/org.schabi.newpipe/\"><img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on-zh-tw.svg\" alt=\"Get it on F-Droid\" width=206/></a></p>\n\n<p align=\"center\">\n<a href=\"https://github.com/TeamNewPipe/NewPipe/releases\" alt=\"GitHub 發佈\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe.svg\" ></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-nightly/releases\" alt=\"GitHub NewPipe nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-nightly.svg?labelColor=purple&label=dev%20nightly\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe-refactor-nightly/releases\" alt=\"GitHub NewPipe refactor nightly releases\"><img src=\"https://img.shields.io/github/release/TeamNewPipe/NewPipe-refactor-nightly.svg?labelColor=purple&label=refactor%20nightly\"></a>\n<a href=\"https://www.gnu.org/licenses/gpl-3.0\" alt=\"授權條款: GPLv3\"><img src=\"https://img.shields.io/badge/License-GPL%20v3-blue.svg\"></a>\n<a href=\"https://github.com/TeamNewPipe/NewPipe/actions\" alt=\"建置狀態\"><img src=\"https://github.com/TeamNewPipe/NewPipe/actions/workflows/ci.yml/badge.svg?branch=dev&event=push\"></a>\n<a href=\"https://hosted.weblate.org/engage/newpipe/\" alt=\"翻譯進度\"><img src=\"https://hosted.weblate.org/widgets/newpipe/-/svg-badge.svg\"></a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://web.libera.chat/#newpipe\" alt=\"IRC 頻道: #newpipe\"><img src=\"https://img.shields.io/badge/IRC%20chat-%23newpipe-brightgreen.svg\"></a>\n<a href=\"https://matrix.to/#/#newpipe:matrix.newpipe-ev.de\" alt=\"Matrix channel: #newpipe\"><img src=\"https://img.shields.io/badge/Matrix%20chat-%23newpipe-blue\"></a>\n</p>\n\n<hr>\n<p align=\"center\"><a href=\"#screenshots\">截圖</a> &bull; <a href=\"#description\">說明</a> &bull; <a href=\"#features\">功能</a> &bull; <a href=\"#installation-and-updates\">安裝與更新</a> &bull; <a href=\"#contribution\">貢獻</a> &bull; <a href=\"#donate\">捐款</a> &bull; <a href=\"#license\">授權憑證</a></p>\n<p align=\"center\"><a href=\"https://newpipe.net\">網站</a> &bull; <a href=\"https://newpipe.net/blog/\">部落格</a> &bull; <a href=\"https://newpipe.net/FAQ/\">FAQ</a> &bull; <a href=\"https://newpipe.net/press/\">媒體</a></p>\n<hr>\n\n*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)*\n\n> [!warning]\n> <b>這是測試版本，可能會發生錯誤。如果遇到錯誤，請在我們的 GITHUB REPO 開 ISSUE 回報。</b>\n>\n> <b>將 NEWPIPE 或其任何分支上傳至 GOOGLE PLAY 商店違反了他們的使用者合約。</b>\n\n<span id=\"screenshots\"></span>\n## 截圖\n\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png\" width=160>](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)\n<br/><br/>\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png)\n[<img src=\"../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png\" width=405>](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png)\n\n<span id=\"description\"></span>\n## 說明\n\nNewPipe 不使用任何 Google 架構的函式庫或 Youtube API。因為只解析網站來取得必要資訊，此軟體可以在沒有安裝 Google 服務的裝置上使用。此外，使用 NewPipe 不需要 YouTube 帳號。NewPipe 是個 copyleft 自由軟體。\n\n<span id=\"features\"></span>\n### 功能\n\n* 搜索影片\n* 無須登入\n* 顯示影片的基本資訊\n* 播放 Youtube 影片\n* 收聽 Youtube 影片\n* 彈出模式（懸浮模式）\n* 選擇串流播放器來播放影片\n* 下載影片\n* 只下載音訊\n* 在 Kodi 開啟影片\n* 顯示上/下一部影片\n* 搜尋特定語言的影片\n* 播放/屏蔽有年齡限的制內容\n* 顯示頻道資訊\n* 搜索頻道\n* 觀看頻道影片\n* 支援 Orbot/Tor （目前未直接實裝） \n* 支援 1080p/2K/4K \n* 觀看歷史\n* 訂閱頻道\n* 搜尋歷史\n* 搜索/播放播放清單\n* 將播放清單加入待播清單\n* 將影片加入待播清單\n* 末端播放清單\n* 字幕\n* 支援直播\n* 顯示評論\n\n### 支援的網站\n\nNewPipe 支援多種服務。我們的[使用文件](https://teamnewpipe.github.io/documentation/)有如何增加新服務與下載器的說明。想新增服務的話，請聯絡我們。目前支援的服務有：\n\n* YouTube\n* SoundCloud \\[測試\\]\n* media.ccc.de \\[測試\\]\n* PeerTube instances \\[測試\\]\n* Bandcamp \\[測試\\]\n\n<!-- Hidden span to keep old links compatible. -->\n<span id=\"updates\"></span>\n\n<span id=\"installation-and-updates\"></span>\n## 安裝與更新\n你可以用以下的任何方法安裝 NewPipe：\n1. 將我們的 repo 加至 F-Droid 再從那邊安裝。詳細的說明在此：https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/\n2. 從 [Github 發布](https://github.com/TeamNewPipe/NewPipe/releases) 下載 APK 再安裝。\n3. 自 F-Droid 更新。這是取得更新最慢的方式，因為 F-Droid 要檢測到更新、建置 APK 、簽署後才會將更新推送給使用者。\n4. 自己建置 APK。這是取得更新最快的方法，但因為這也比較複雜，所以我們推薦使用其他方法。\n\n對一般的使用者我們推薦方法一。使用方法一或二安裝的 APK 互相相容，但都不相容於方法三。因為前兩者的簽章使用相同的（我們的）金鑰，與後者（使用 F-Droid 的金鑰）的不同。使用方法四建置除錯 APK 完全避免了金鑰的問題。簽章金鑰能幫助使用者避免安裝惡意的更新。\n\n若你想更換安裝來源（如果 NewPipe 的核心機能壞掉而 F-Droid 又還沒有最新的更新），我們推薦以下的步驟：\n1. 在 設定 > 內容 > 匯出資料庫 備份資料以保留歷史、訂閱與播放清單\n2. 移除 NewPipe\n3. 從新的來源下載 APK 並安裝\n4. 在 設定 > 內容 > 匯入資料庫 匯入在步驟 1 備份的資料\n\n<span id=\"contribution\"></span>\n## 貢獻\n若你有任何想法、翻譯、設計、整理原始碼或大範圍的原始碼改動，我們歡迎任何幫助。\n\n若你想參與，請閱讀[貢獻須知（英文）](../.github/CONTRIBUTING.md)。\n\n<a href=\"https://hosted.weblate.org/engage/newpipe/\">\n<img src=\"https://hosted.weblate.org/widgets/newpipe/-/287x66-grey.png\" alt=\"Translation status\" />\n</a>\n\n<span id=\"donate\"></span>\n## 捐款\n若你喜歡 NewPipe 我們歡迎捐款。你可以使用 bitcoin ，也能在 Bountysource 或 Liberapay 上捐款。 更多關於捐款資訊，請見我們的[網站](https://newpipe.net/donate)。\n\n<table>\n  <tr>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/2/27/Liberapay_logo_v2_white-on-yellow.svg\" alt=\"Liberapay\" width=\"80px\" ></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/\"><img src=\"../assets/liberapay_qr_code.png\" alt=\"Visit NewPipe at liberapay.com\" width=\"100px\"></a></td>\n    <td><a href=\"https://liberapay.com/TeamNewPipe/donate\"><img src=\"../assets/liberapay_donate_button.svg\" alt=\"Donate via Liberapay\" height=\"35px\"></a></td>\n  </tr>\n</table>\n\n## 隱私權政策\nNewPipe 專案旨在提供私人與匿名的網路媒體使用體驗。\n因此，此軟體不在沒有你的同意下收集任何資料。NewPipe 的隱私權政策說明了送出錯誤報告與在我們的部落格上留言時何種資料會被傳輸或儲存。你可以在[這裡](https://newpipe.net/legal/privacy/)找到此文件。\n\n<span id=\"license\"></span>\n## 授權條款\n[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)  \n\nNewPipe 是自由軟體：可以任意使用、研究、分享或更改。在自由軟體基金會發布的[ GPL 通用公眾授權條款]（第三或更新的版本）下可以重新散佈與/或修改。\n\n"
  },
  {
    "path": "doc/gradle.md",
    "content": "# Custom gradle parameters\n\nYou can use these parameters by specifying them inside the `gradle.properties` file as \n`systemProp.<name>=<value>` or passing them through the CLI with `-D<name>=<value>`.\n\n## packageSuffix\nThis allows you to specify a suffix, which will be added on release builds to the application id, \nthe `app_name` string and the apk file.  \nNo validation is made, so make sure to pass in a valid value.\n\n## skipFormatKtlint\nThis allows you to skip the `formatKtLint` task.  \nNo value is needed.   \nIt is used for CI in order to check for badly formatted files.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/1000.txt",
    "content": "تحسنت\n• جعل وصف قائمة التشغيل قابلاً للنقر لإظهار محتوى أكثر / أقل\n• [PeerTube] تعامل مع روابط مثيل \"subscribeto.me\" تلقائيًا\n• ابدأ تشغيل عنصر واحد فقط في شاشة المحفوظات\n\nثابت\n• إصلاح رؤية زر RSS\n• إصلاح أعطال معاينة شريط البحث\n• إصلاح قائمة التشغيل لعنصر بدون صورة مصغرة\n• إصلاح الخروج من مربع حوار التنزيل قبل ظهوره\n• إصلاح العناصر ذات الصلة قائمة الانتظار المنبثقة\n• إصلاح الترتيب في مربع حوار الإضافة إلى قائمة التشغيل\n• ضبط تخطيط عنصر الإشارة المرجعية لقائمة التشغيل\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/1001.txt",
    "content": "تحسنت\n• اسمح دائمًا بتغيير تفضيلات الإشعارات للمشغل على Android 13+\n\nمصلحة\n• لن يؤدي إصلاح تصدير قاعدة البيانات/الاشتراكات إلى اقتطاع ملف موجود بالفعل، مما قد يؤدي إلى تصدير تالف\n• إصلاح المشغل الذي يستأنف من البداية عند النقر على الطابع الزمني\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/1002.txt",
    "content": "تم إصلاح مشكلة عدم تشغيل YouTube لأي بث.\n\nيعالج هذا الإصدار فقط الخطأ الأكثر إلحاحًا الذي يمنع تحميل تفاصيل فيديو YouTube.\nنحن ندرك وجود مشاكل أخرى، وسنقوم قريباً بإصدار إصدار منفصل لحلها.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/1003.txt",
    "content": "هذا إصدار إصلاح عاجل يعمل على إصلاح أخطاء YouTube:\n• [يوتيوب] إصلاح عدم تحميل أي معلومات فيديو ، وإصلاح أخطاء HTTP 403 أثناء تشغيل مقاطع الفيديو واستعادة تشغيل بعض مقاطع الفيديو المقيدة بالفئة العمرية\n• إصلاح أحجام التسميات التوضيحية التي لا يتم تغييرها\n• إصلاح معلومات التنزيل مرتين عند فتح البث\n• [Soundcloud] قم بإزالة التدفقات المحمية بإدارة الحقوق الرقمية غير القابلة للتشغيل\n• ترجمات محدثة\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/1004.txt",
    "content": "يعمل هذا الإصدار على إصلاح YouTube الذي يوفر دفق 360 بكسل فقط.\n\nلاحظ أن الحل المستخدم في هذا الإصدار مؤقت على الأرجح، وعلى المدى الطويل يجب تنفيذ بروتوكول فيديو SABR، لكن أعضاء TeamNewPipe مشغولون حاليًا، لذا فإن أي مساعدة ستكون موضع تقدير كبير! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/1005.txt",
    "content": "جديد\n• أضف دعمًا لنظام Android Auto\n• السماح لإعداد مجموعات التغذية كعلامات شاشة رئيسية\n• [يوتيوب] شارك كقائمة تشغيل مؤقتة\n• [SoundCloud] Leges Table Tab\n\nتحسن\n• تلميحات شريط بحث أفضل\n• عرض تاريخ التنزيل في التنزيلات\n• استخدام Android 13 لكل لغة\n\nمُثَبَّت\n• إصلاح ألوان النص المكسورة في الوضع المظلم\n• [youtube] إصلاح قوائم التشغيل لا تحميل أكثر من 100 عنصر\n• [youtube] إصلاح مقاطع الفيديو الموصى بها مفقودة\n• إصلاح حوادث في عرض قائمة التاريخ\n• إصلاح الطوابع الزمنية في ردود التعليقات\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/1006.txt",
    "content": "# التحسينات\nالإبقاء على المشغل الحالي عند الضغط على الزمن.\nمحاولة استعادة مهام التنزيل المعلقة قدر الإمكان.\nإضافة خيار لحذف سجل التنزيل دون حذف الملف الفعلي.\nإذن الظهور فوق التطبيقات: عرض مربع توضيحي لإصدارات أندرويد > R.\nدعم فتح روابط على.soundcloud.\nالعديد من التحسينات.\n\n# الإصلاحات\nإصلاح تنسيق الأرقام المختصرة لإصدارات أندرويد الأقدم من 7.\nإصلاح الإشعارات الوهمية.\nإصلاحات لملفات ترجمة SRT.\nإصلاح عدد كبير من الأعطال.\n\n# التطوير\nتحديث البنية البرمجية الداخلية.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/1007.txt",
    "content": "تم إصلاح YouTube الذي لا يقوم بتشغيل أي دفق\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/63.txt",
    "content": "### تحسينات\n- إعدادات الاستيراد / التصدير #1333\n- تقليل السحب الزائد (تحسين الأداء) #1371\n- تحسينات التعليمات البرمجية الصغيرة #1375\n- أضف كل شيء عن اللائحة العامة لحماية البيانات رقم #1420\n\n### مثبت\n- أداة التنزيل: إصلاح التعطل عند تحميل التنزيلات غير المكتملة من ملفات .جيغا #1407\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/64.txt",
    "content": "### تحسينات\n- تمت إضافة القدرة على تقييد جودة الفيديو في حالة استخدام بيانات الجوال. #1339\n- تذكر السطوع للدورة #1442 \n- تحسين أداء التنزيل لوحدات المعالجة المركزية الأضعف #1431\n- اضافة دعم (عاملة) للجلسة الاعلامية رقم#1433\n\n### الإصلاح\n- إصلاح التعطل عند فتح التنزيلات (الإصلاح متوفر الآن لإصدارات الإصدارات) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/65.txt",
    "content": "### تحسينات\n\n- تعطيل الرسوم المتحركة لرمز قائمة برجر#1486 \n- التراجع عن حذف التنزيلات #1472 \n- خيار التنزيل في قائمة المشاركة #1498\n- تمت إضافة خيار المشاركة إلى قائمة النقر الطويلة #1454 \n- تصغير المشغل الرئيسي عند الخروج #1354 \n- تحديث إصدار المكتبة وإصلاح النسخ الاحتياطي لقاعدة البيانات #1510 \n- ExoPlayer 2.8.2 تحديث #1392\n  - تمت إعادة صياغة مربع حوار التحكم في سرعة التشغيل لدعم أحجام الخطوات المختلفة لتغيير السرعة بشكل أسرع.\n  - تمت إضافة مفتاح تبديل للتقديم السريع أثناء فترات الصمت في التحكم في سرعة التشغيل. يجب أن يكون هذا مفيدًا للكتب الصوتية وأنواع موسيقية معينة ، ويمكن أن يجلب تجربة \nسلسة حقيقية (ويمكن كسر أغنية مع الكثير من الصمت =\\\\).  \n  -دقة مصدر الوسائط المعاد تشكيلها للسماح بتمرير البيانات الوصفية إلى جانب الوسائط داخليًا في المشغل ، بدلاً من القيام بذلك يدويًا. الآن لدينا مصدر واحد للبيانات الوصفية\n وهو متاح مباشرة عند بدء التشغيل.\n  -عدم تحديث البيانات الوصفية لقائمة التشغيل عن بُعد الثابتة عند توفر بيانات وصفية جديدة عند فتح جزء من قائمة التشغيل.\n  - إصلاحات مختلفة لواجهة المستخدم: #1383, أصبحت عناصر التحكم في إشعارات مشغل الخلفية بيضاء دائمًا ، مما يسهل إيقاف تشغيل مشغل النوافذ المنبثقة من خلال قذفه\n- استخدم مستخرجًا جديدًا بهندسة مُعاد تصنيعها للخدمات المتعددة\n\n### إصلاحات\n\n- يصلح #1440 تخطيط معلومات الفيديو المكسور #1491 \n- عرض تاريخ الإصلاح #1497\n  - #1495, عن طريق تحديث البيانات الوصفية (الصورة المصغرة والعنوان وعدد مقاطع الفيديو) بمجرد وصول المستخدم إلى قائمة التشغيل. \n  - #1475, من خلال تسجيل طريقة عرض في قاعدة البيانات عندما يبدأ المستخدم مقطع فيديو على مشغل خارجي على جزء التفاصيل.\n- إصلاح مهلة الشاشة في حالة ظهور النافذة المنبثقة. #1463 (ثابت #640)\n- إصلاح مشغل الفيديو الرئيسي #1509 \n  - [#1412] تم إصلاح وضع التكرار الذي يتسبب في ظهور NPE للاعب عند تلقي نية جديدة أثناء وجود نشاط اللاعب في الخلفية.\n  - لا يؤدي تصغير المشغل الثابت إلى النافذة المنبثقة إلى تدمير اللاعب عند عدم منح إذن منبثق.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/66.txt",
    "content": "# التغيير منv0.13.7\n\n### ثابت\n- إصلاح مشكلات عامل التصفية من v0.13.6\n\n# التغيير من v0.13.6\n\n### تحسينات\n\n- تعطيل الرسوم المتحركة لرمز قائمة برجر #1486 \n- التراجع عن حذف التنزيلات #1472 \n- خيار التنزيل في قائمة المشاركة #1498\n- تمت إضافة خيار المشاركة إلى قائمة النقر الطويلة #1454 \n- تصغير المشغل الرئيسي عند الخروج #1354 \n- تحديث إصدار المكتبة وإصلاح النسخ الاحتياطي لقاعدة البيانات #1510 \n- ExoPlayer 2.8.2 تحديث #1392\n  - تمت إعادة صياغة مربع حوار التحكم في سرعة التشغيل لدعم أحجام الخطوات المختلفة لتغيير السرعة بشكل أسرع.\n  - تمت إضافة مفتاح تبديل للتقديم السريع أثناء فترات الصمت في التحكم في سرعة التشغيل. يجب أن يكون هذا مفيدًا للكتب الصوتية وأنواع موسيقية معينة ، ويمكن أن يجلب تجربة سلسة حقيقية (ويمكن كسر أغنية مع الكثير من الصمت\n=\\\\).  \n  - دقة مصدر الوسائط المعاد تشكيلها للسماح بتمرير البيانات الوصفية إلى جانب الوسائط داخليًا في المشغل ، بدلاً من القيام بذلك يدويًا. الآن لدينا مصدر واحد للبيانات الوصفية و\n متاح مباشرة عند بدء التشغيل.\n  - عدم تحديث البيانات الوصفية لقائمة التشغيل عن بُعد الثابتة عند توفر بيانات وصفية جديدة عند فتح جزء من قائمة التشغيل.\n  - إصلاحات مختلفة لواجهة المستخدم: #1383, أصبحت عناصر التحكم في إشعارات مشغل الخلفية بيضاء دائمًا ، مما يسهل إيقاف تشغيل مشغل النوافذ المنبثقة من خلال قذفه\n- استخدم مستخرجًا جديدًا بهندسة مُعاد تصنيعها للخدمات المتعددة\n\n### إصلاحات\n\n- الإصلاح #1440 تخطيط معلومات الفيديو المكسور#1491 \n- عرض تاريخ الإصلاح #1497\n  - #1495, عن طريق تحديث البيانات الوصفية (الصورة المصغرة والعنوان وعدد مقاطع الفيديو) بمجرد وصول المستخدم إلى قائمة التشغيل. \n  - #1475, من خلال تسجيل طريقة عرض في قاعدة البيانات عندما يبدأ المستخدم مقطع فيديو على مشغل خارجي على جزء التفاصيل.\n- إصلاح مهلة الشاشة في حالة ظهور النافذة المنبثقة. #1463 (ثابت #640)\n- إصلاح مشغل الفيديو الرئيسي #1509 \n  - [#1412] تم إصلاح وضع التكرار الذي يتسبب في ظهور NPE للاعب عند تلقي نية جديدة أثناء وجود نشاط اللاعب في الخلفية.\n  - لا يؤدي تصغير المشغل الثابت إلى النافذة المنبثقة إلى تدمير اللاعب عند عدم منح إذن منبثق.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/68.txt",
    "content": "# تغييرات للإصدار 0.14.1\n\n### مُثَبَّت\n- فشل ثابت في فك تشفير عنوان url للفيديو # 1659\n- رابط الوصف الثابت غير مستخرج جيدًا # 1657\n\n# تغييرات للإصدار 0.14.0\n\n### جديد\n- تصميم درج جديد رقم 1461\n- صفحة أمامية جديدة قابلة للتخصيص # 1461\n\n### تحسينات\n- إعادة صياغة ضوابط الإيماءات # 1604\n- طريقة جديدة لإغلاق المشغل المنبثق # 1597\n\n### مُثَبَّت\n- إصلاح الخطأ عندما لا يتوفر عدد الاشتراكات. يغلق # 1649.\n  - اعرض \"عدد المشتركين غير متوفر\" في تلك الحالات\n  - إصلاح أي شيء يظهر استثناء مشغلات التقرير\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/69.txt",
    "content": "### جديد\n- النقر لفترة طويلة حذف والمشاركة في الاشتراكات # 1516 \n- واجهة مستخدم الكمبيوتر اللوحي وتخطيط قائمة الشبكة # 1617 \n\n### إصلاحات\n- إصلاح تحليل الوقت ل. ، لذلك يمكن استخدام NewPipe في فنلندا\n- إصلاح عدد الاشتراكات\n- إضافة إذن خدمة المقدمة لأجهزة API 28+ # 1830\n\n### البق المعروف\n- لا يمكن حفظ حالة التشغيل على Android P\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/70.txt",
    "content": "تنبيه: ربما يكون هذا الإصدار عبارة عن bugfest ، تماما مثل الإصدار الأخير. ولكن بسبب الإغلاق الكامل منذ 17. نسخة مكسورة أفضل من أي إصدار. صح؟ ¯\\_(ツ)_/¯\n\n### التحسينات\n* يمكن الآن فتح الملفات التي تم تنزيلها بنقرة واحدة # 1879 \n* إسقاط الدعم لالروبوت 4.1 - 4.3 # 1884 \n* إزالة اللاعب القديم # 1884\n* المعالجة اللاحقة للتنزيلات وتنفيذ الميزات المفقودة # 1759 بواسطة @kapodamy\n  * البنية التحتية لما بعد المعالجة\n  * التعامل مع الخطأ السليم \"البنية التحتية\" (للتنزيل)\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/71.txt",
    "content": "تحسين\n*إضافة إشعار تحديث التطبيق لبناء GitHub (#1608 بواسطة krtkush)\n*تحسينات مختلفة على برنامج التنزيل(#1944 بواسطة kapodamy):\n  *إضافة الرموز البيضاء المفقودة واستخدام طريقة hardcored لتغيير ألوان الرمز\n  *تحقق مما إذا كان المكرر قد تمت تهيئته(إصلاحات #2031)\n  *السماح بإعادة المحاولة مع ظهور خطأ \"فشلت المعالجة اللاحقة\" في muxer الجديد\n  *MPEG-4 muxer جديد يعمل على تثبيت تدفقات الفيديو والصوت غير المتزامنة(#2039)\n\nتصليح\n*توقف البث المباشر على يوتيوب عن التشغيل بعد وقت قصير(#1996 by @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/730.txt",
    "content": "# ثابت\n- إصلاح خطأ وظيفة فك التشفير مرة أخرى.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/740.txt",
    "content": "<h4> التحسينات </h4>\n<ul>\n<li> جعل الروابط في التعليقات قابلة للنقر ، وزيادة حجم النص </li>\n<li> السعي عند النقر فوق روابط الطابع الزمني في التعليقات </li>\n<li> إظهار علامة التبويب المفضلة استنادا إلى الحالة المحددة مؤخرا</li>\n<li> أضف قائمة تشغيل إلى قائمة الانتظار عند النقر لفترة طويلة على &#39; الخلفية &#39; في نافذة قائمة التشغيل </li>\n<li>البحث عن نص مشترك عندما لا يكون عنوان URL</li>\n</ul>\n<h4> ثابت </h4>\n<ul>\n<li> تم إصلاح التمرير مع التعليقات والتدفقات ذات الصلة معطلة </li>\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/750.txt",
    "content": "الجديد\nاستئناف التشغيل # 2288\n• استئناف التدفقات حيث توقفت في المرة الأخيرة\nتحسينات التنزيل # 2149 \n• استخدم إطار الوصول إلى التخزين لتخزين التنزيلات على بطاقات SD الخارجية\n• mp4 muxer جديد\n• اختياريا تغيير دليل التنزيل قبل بدء التنزيل\n• احترام الشبكات المقننة \n\nتحسين\n• تمت إزالة سلاسل جيما # 2295\n• التعامل مع تغييرات الدوران (التلقائي) أثناء دورة حياة النشاط # 2444\n• جعل قوائم الضغط الطويل متسقة # 2368\n\nثابت\n• تم إصلاح اسم مسار الترجمة المحدد الذي لم يتم عرضه # 2394\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/760.txt",
    "content": "التغييرات في 0.17.1\n\nالجديد\n• توطين التايلاندية\n\nتحسين\n• إضافة بدء اللعب هنا العمل في قوائم الضغط لفترة طويلة لقوائم التشغيل مرة أخرى # 2518\n• إضافة مفتاح ل SAF / منتقي الملفات القديم # 2521\n\nتحسين\n• تمت إزالة سلاسل جيما # 2295\n• التعامل مع تغييرات التدوير\n• جعل قوائم الضغط الطويل متسقة # 2368\n\nثابت\n• [SoundCloud] تعطل ثابت عند تحميل قوائم التشغيل TeamNewPipe / NewPipeExtractor # 170\n• [يوتيوب] لا يمكن تحديد المدة الثابتة TeamNewPipe / NewPipeExtractor # 177\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/770.txt",
    "content": "التغييرات في 0.17.2\n\nالإصلاح\n• إصلاح عدم توفر فيديو\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/780.txt",
    "content": "تغييرات في 0.17.3\n\nمحسّن\n• تمت إضافة خيار لمسح حالات التشغيل #2550\n• إظهار الدلائل المخفية في منتقي الملفات #2591\n• دعم عناوين URL من مثيلات \"invidio.us\" ليتم فتحها باستخدام NewPipe  #2488 \n• أضف دعمًا لـ `music.youtube.com` URLs TeamNewPipe/NewPipeمستخرج#194\n\nثابت\n• [موقع YouTube] ثابت 'java.lang.IllegalArgumentException #192\n• [YouTube] البث المباشر الثابت لا يعمل TeamNewPipe/NewPipeExtractor#195\n• تم إصلاح مشكلة الأداء في أندرويد عند تنزيل البث #2592\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/790.txt",
    "content": "محسّن\n• أضف المزيد من العناوين لتحسين إمكانية الوصول للمكفوفين #2655\n• اجعل لغة إعداد مجلد التنزيل أكثر اتساقًا وأقل غموضًا #2637\n\nثابت\n• تحقق مما إذا تم تنزيل آخر بايت في الكتلة #2646\n• التمرير الثابت في جزء تفاصيل الفيديو #2672\n• إزالة الرسوم المتحركة مربع مسح البحث المزدوج إلى واحد #2695\n• [SoundCloud] إصلاح استخراج client_id #2745\n\nتطوير\n• أضف التبعيات المفقودة الموروثة من NewPipeExtractor إلى NewPipe #2535\n• الانتقال إلى AndroidX #2685\n• تحديث ل ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/800.txt",
    "content": "الجديد\n• دعم PeerTube بدون P2P (# 2201) [بيتا]:\n  ◦ مشاهدة وتنزيل مقاطع الفيديو من مثيلات PeerTube\n  ◦ قد تكون هناك مشاكل في مصافحة SSL على Android 4.4 و 7.1 عند الوصول إلى حالات معينة مما يؤدي إلى حدوث خطأ في الشبكة.\n\n• تنزيل (# 2679):\n  ◦ حساب تحميل ETA\n  ◦ قم بتنزيل التأليف (ملفات webm) بتنسيق ogg\n  ◦ استعادة روابط التنزيل منتهية الصلاحية لاستئناف التنزيلات بعد توقف طويل\n\nتطور\n• تحديث ExoPlayer إلى 2.10.8 # 2791 ، # 2816\n• قم بتحديث Gradle إلى 3.5.1 وإضافة دعم Kotlin # 2714\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/810.txt",
    "content": "الجديد\n• إظهار الصورة المصغرة للفيديو على شاشة القفل عند اللعب في الخلفية\n\nتحسين\n• إضافة قائمة تشغيل محلية إلى قائمة الانتظار عند الضغط لفترة طويلة على زر الخلفية / النافذة المنبثقة\n• اجعل علامات تبويب الصفحة الرئيسية قابلة للتمرير وإخفائها عندما يكون هناك علامة تبويب واحدة فقط\n• إضافة زر لحذف الملفات التي تم تنزيلها أو تنزيل السجل في \"التنزيلات\"\n• [يوتيوب] إضافة دعم إلى /c/shortened_url روابط القنوات\n\nثابت\n• ترحيل نتائج البحث الثابتة\n• [يوتيوب] ثابت التبديل على فارغة تسبب NPE\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/820.txt",
    "content": "تم إصلاح اسم وظيفة فك تشفير regex مما يجعل YouTube غير قابل للاستخدام.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/830.txt",
    "content": "تم تحديث Client_id SoundCloud لإصلاح مشكلات SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/840.txt",
    "content": "جديد\n• تمت إضافة محدد اللغة لتغيير لغة التطبيق\n• تمت إضافة زر الإرسال إلى Kodi إلى قائمة المشغل القابلة للطي\n• تمت إضافة إمكانية نسخ التعليقات عند الضغط لفترة طويلة\n\nمحسّن\n• إصلاح نشاط ReCaptcha وحفظ ملفات تعريف الارتباط التي تم الحصول عليها بشكل صحيح\n• تمت إزالة قائمة النقاط لصالح الدرج وزر إخفاء السجل عندما لا يتم تمكين سجل المشاهدة في الإعدادات\n• اطلب العرض فوق إذن التطبيقات الأخرى في الإعدادات بشكل صحيح على Android 6 والإصدارات الأحدث\n• إعادة تسمية قائمة التشغيل المحلية عن طريق النقر لفترة ط\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/850.txt",
    "content": "هذا الإصدار تم تحديث نسخة موقع يوتيوب. سيتم إيقاف إصدار موقع الويب القديم في مارس ، وبالتالي يتعين عليك ترقية NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/860.txt",
    "content": "محسّن\n• حفظ واستعادة ما إذا كان الملعب والإيقاع غير منزعج أم لا\n• دعم انقطاع العرض في المشغل\n• جولة الرأي وعدد المشتركين\n• تحسين يوتيوب لاستخدام بيانات أقل\n\nتم إصلاح أكثر من 15 خطأً متعلقًا ب YouTube في هذا الإصدار.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/870.txt",
    "content": "هذا إصدار الإصلاح العاجل يقوم بتحديث NewPipe للسماح باستخدام SoundCloud دون متاعب كبيرة مرة أخرى.\nيتم استخدام v2 API الخاص ب SoundCloud في المستخرج الآن وتم تحسين الكشف عن معرفات العملاء غير الصالحة.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/900.txt",
    "content": "جديد\n• مجموعات الاشتراك والأعلاف المصنفة\n• زر كتم الصوت في اللاعبين\n\nمحسّن\n• السماح بفتح روابط music.youtube.com و media.ccc.de في NewPipe\n• قم بنقل إعدادين من المظهر إلى المحتوى\n• إخفاء خيارات البحث 5 ، 15 ، 25 ثانية إذا تم تمكين البحث غير الدقيق\n\nثابت\n• بعض مقاطع فيديو WebM لا يمكن البحث عنها\n• النسخ الاحتياطي لقاعدة البيانات على Android P.\n• تعطل عند مشاركة ملف تم تنزيله\n• طن من قضية استخراج يوتيوب وأكثر ...\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/910.txt",
    "content": "تم إصلاح ترحيل قاعدة البيانات الذي منع NewPipe من البدء في بعض الحالات النادرة.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/920.txt",
    "content": "محسّن\n\n• تمت إضافة تاريخ التحميل وعدد المشاهدات على عناصر شبكة الدفق\n• تحسينات على تخطيط رأس الدرج\n\nثابت\n\n• زر كتم الصوت الثابت الذي تسبب في حدوث أعطال في API 19\n• تنزيل ثابت لمقاطع الفيديو الطويلة 1080p 60fps\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/930.txt",
    "content": "جديد\n• البحث على يوتيوب الموسيقى\n• دعم Android TV الأساسي\n\nمحسّن\n• تمت إضافة القدرة على إزالة جميع مقاطع الفيديو التي تمت مشاهدتها من قائمة التشغيل المحلية\n• إظهار الرسالة عندما لا يتم دعم المحتوى حتى الآن بدلاً من التعطل\n• تحسين مشغل النوافذ المنبثقة مع إيماءات القرص\n• قائمة تيارات على الضغط لفترة طويلة على الخلفية والأزرار المنبثقة في القناة\n• معالجة حجم محسّن لعنوان رأس الدرج\n\nثابت\n• إعداد المحتوى المقيّد بالعمر الثابت لا يعمل\n• إصلاح أنواع معينة من reCAPTCHAs\n• تم إصلاح الانهيار عند فتح الإش\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/940.txt",
    "content": "جديد\n• إضافة دعم لتعليقات ساوند كلاود\n• إضافة وضع تقييد وضع يوتيوب\n• إظهار تفاصيل القناة الأصل بيرتوب\n\nمحسّن\n• إظهار زر كوري للخدمات المدعومة فقط\n• حظر إيماءات المشغل التي تبدأ من شريط التنقل أو شريط الحالة\n• تغيير لون خلفية أزرار إعادة المحاولة والاشتراك بناءً على لون الخدمة\n\nثابت\n• إصلاح تجميد مربع حوار التنزيل\n• فتح في زر المتصفح الآن يفتح بالفعل في المتصفح\n• إصلاح التعطل عند فتح مقاطع الفيديو و \"تعذر تشغيل هذا الدفق\"\n\nو اكثر\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/950.txt",
    "content": "يقدم هذا الإصدار ثلاثة إصلاحات صغيرة:\n• وصول التخزين الثابت على Android 10+\n• أكشاك فتح ثابتة\n• مدة ثابتة لتحليل مقاطع الفيديو الطويلة\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/951.txt",
    "content": "جديد\n• إضافة بحث عن منتقي الاشتراك في مربع حوار مجموعة الخلاصة\n• إضافة عامل تصفية إلى مربع حوار مجموعة الخلاصة لإظهار الاشتراكات غير المجمعة فقط\n• إضافة علامة تبويب قائمة التشغيل إلى الصفحة الرئيسية\n• التقديم / الترجيع السريع في الخلفية / قائمة انتظار المشغل المنبثقة\n• عرض اقتراح البحث: هل تقصد & إظهار نتيجة لـ\n\nمحسّن\n• إسقاط كتابة البيانات الوصفية للتطبيق في ملفات muxed\n• لا تقم بإزالة التدفقات الفاشلة من قائمة الانتظار\n• تحديث لون شريط الحالة لمطابقة لون شريط الأدوات\n\nثابت\n• إصلاح عدم تزامن ال\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/952.txt",
    "content": "محسّن\n• يتوفر التشغيل التلقائي لجميع الخدمات (بدلاً من YouTube فقط)\n\nثابت\n• إصلاح التدفقات ذات الصلة من خلال دعم عمليات استمرار YouTube الجديدة\n• تم إصلاح مقاطع فيديو YouTube المقيدة بحسب العمر\n• [Android TV] تراكب تمييز التركيز البؤري الثابت\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/953.txt",
    "content": "إصلاح استخراج وظيفة فك التشفير في YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/954.txt",
    "content": "• سير عمل جديد للتطبيق: قم بتشغيل مقاطع الفيديو على صفحة التفاصيل ، واسحب لأسفل لتقليل المشغل\n• إخطارات MediaStyle: إجراءات قابلة للتخصيص في الإخطارات ، وتحسينات في الأداء\n• تغيير الحجم الأساسي عند استخدام NewPipe كتطبيق سطح المكتب\n\n• إظهار الحوار مع الخيارات المفتوحة في حالة وجود نخب عنوان URL غير مدعوم\n• تحسين تجربة اقتراح البحث عندما يتعذر جلب الاقتراحات البعيدة\n• زيادة جودة الفيديو الافتراضية إلى 720p60 (مشغل داخل التطبيق) و 480 بكسل (مشغل منبثق)\n\n• طن من إصلاحات الأخطاء وأكثر من ذلك\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/955.txt",
    "content": "[YouTube] إصلاح البحث عن بعض المستخدمين\n[YouTube] إصلاح استثناءات فك التشفير العشوائي\n[SoundCloud] عناوين URL التي تنتهي بشرطة مائلة يتم تحليلها الآن بشكل صحيح\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/956.txt",
    "content": "[يوتيوب] عطل ثابت عند تحميل أي فيديو\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/957.txt",
    "content": "• توحيد إجراءات قائمة محددة في واحد\n• إيماءة بإصبعين لإغلاق اللاعب\n• السماح بمسح ملفات تعريف الارتباط reCAPTCHA\n• خيار عدم تلوين الإخطار\n• تحسين كيفية فتح تفاصيل الفيديو لإصلاح التخزين المؤقت اللانهائي وسلوك عربات التي تجرها الدواب عند المشاركة على NewPipe وغيرها من التناقضات\n• تسريع مقاطع فيديو YouTube وإصلاح القيود العمرية\n• إصلاح الانهيار عند التقديم / الترجيع السريع\n• لا تقم بإعادة ترتيب القوائم عن طريق سحب الصور المصغرة\n• تذكر دائمًا خصائص النوافذ المنبثقة\n• إضافة اللغة السانتالية\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/958.txt",
    "content": "جديد ومحسن:\n• إعادة إضافة خيار لإخفاء الصورة المصغرة على شاشة القفل\n• اسحب لتحديث التغذية\n• تحسين الأداء عند جلب القوائم المحلية\n\nثابت:\n• تم إصلاح الانهيار عند بدء تشغيل NewPipe بعد إزالته من ذاكرة الوصول العشوائي\n• عطل ثابت عند بدء التشغيل عندما لا يكون هناك اتصال بالإنترنت\n• إصلاح احترام إعدادات إيماءات السطوع ومستوى الصوت\n• [يوتيوب] قوائم التشغيل الطويلة الثابتة\n\nآخر:\n• تنظيف الكود والعديد من التحسينات الداخلية\n• تحديثات التبعية\n• تحديثات الترجمة\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/959.txt",
    "content": "تم إصلاح حلقة لا نهاية لها من الأعطال بعد فتح مراسل الأخطاء.\nقائمة محدثة بمثيلات PeerTube التي يمكن فتحها تلقائيًا بواسطة NewPipe.\nتحديث الترجمات.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/960.txt",
    "content": "• وصف محسن لخيار تصدير قاعدة البيانات في الإعدادات.\n• ثابت تحليل تعليقات يوتيوب.\n• اسم عرض ثابت لخدمة media.ccc.de.\n• ترجمات محدثة.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/961.txt",
    "content": "• [يوتيوب] مزيج الدعم\n• [YouTube] عرض معلومات حول محطات البث العامة و Covid-19\n• [media.ccc.de] تمت إضافة مقاطع فيديو حديثة\n• تمت إضافة الترجمة الصومالية\n\n• العديد من التحسينات الداخلية\n\n• إصلاح مشاركة مقاطع الفيديو من داخل المشغل\n• إصلاح عرض الويب ReCaptcha الفارغ\n• التحطم الثابت الذي حدث عند إزالة دفق من القائمة\n• [PeerTube] تيارات ثابتة ذات صلة\n• [YouTube] بحث ثابت عن موسيقى YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/962.txt",
    "content": "اضافة مقاطع فيديو \"حديثة\" لخدمة media.ccc.de.\nاضافة بث مباشر لخدمة media.ccc.de وكذلك دعم البث المباشر.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/963.txt",
    "content": "• [يوتيوب] ثابت استمرار القناة\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/964.txt",
    "content": "• دعم إضافي للفصول في ضوابط المشغل\n• [PeerTube] تمت إضافة بحث بني داكن\n• إعادة إضافة زر المشاركة في عرض تفاصيل الفيديو ونقل وصف الدفق إلى تخطيط علامة التبويب\n• تعطيل استعادة السطوع إذا تم تعطيل إيماءة السطوع\n• تمت إضافة عنصر قائمة لتشغيل الفيديو على kodi\n• تم إصلاح التعطل عند عدم تعيين متصفح افتراضي على بعض الأجهزة وتحسين مربعات حوار المشاركة\n• تبديل التشغيل / الإيقاف المؤقت باستخدام زر مساحة الجهاز في مشغل ملء الشاشة\n• [media.ccc.de] إصلاحات وتحسينات مختلفة\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/965.txt",
    "content": "إصلاح عطل يحدث عند إعادة ترتيب مجمعات القنوات.\nإصلاح الحصول على المزيد من فيديوهات يوتيوب من القنوات ومجموعات التشغيل.\nإصلاح الحصول على تعليقات يوتيوب.\nدعم /watch/ و /v/ و /w/ في روابط يوتيوب.\nإصلاح SoundCloud.\nإضافة اللغة الكردية الشمالية.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/966.txt",
    "content": "جديد:\n• أضف خدمة جديدة: باندكامب (Bandcamp)\n\nمطوّر:\n• أضف خيارًا لتجعل التطبيق يتبع سمة الجهاز\n• منع بعض الانهيارات عن طريق إظهار شاشة خطأ مطوّرة\n• أظهر المزيد من المعلومات عن سبب عدم وجود المحتوى\n• زر الفراخ الحقيقي يفعل التشغيل/الإيقاف\n• أظهر إشعارًا عند بدأ التنزيل\n\nمصلح:\n• أصلح صور مصغّرة صغيرة جدًا عند التشغيل في الخلفيّة\n• أصلح عنوان فارغ في المشغل المصغّر\n• أصلح عدم استعادة آخر وضع تحديد حجم بشكل صحيح\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/967.txt",
    "content": "تم إصلاح YouTube لا يعمل بشكل صحيح في الاتحاد الأوروبي. كان هذا بسبب نظام جديد لملفات تعريف الارتباط والموافقة على الخصوصية يتطلب من NewPipe تعيين ملف تعريف ارتباط الموافقة.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/968.txt",
    "content": "تمت إضافة خيار تفاصيل القناة إلى قائمة الضغط لفترة طويلة.\nتمت إضافة وظيفة لإعادة تسمية اسم قائمة التشغيل من واجهة قائمة التشغيل.\nالسماح للمستخدم بالتوقف مؤقتا أثناء التخزين المؤقت للفيديو.\nمصقول موضوع أبيض.\nإصلاح الخطوط المتداخلة عند استخدام حجم خط أكبر.\nتم إصلاح أي فيديو على أجهزة Formuler و Zephier.\nإصلاح مختلف الأعطال.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/969.txt",
    "content": "• السماح بالتثبيت على وحدة التخزين الخارجية\n• [Bandcamp] تمت إضافة دعم لعرض التعليقات الثلاثة الأولى على البث\n• إظهار نخب \"بدأ التنزيل\" فقط عند بدء التنزيل\n• لا تقم بتعيين ملف تعريف ارتباط reCaptcha عندما لا يكون هناك ملف تعريف ارتباط مخزن\n• [لاعب] تحسين أداء ذاكرة التخزين المؤقت\n• [لاعب] لاعب ثابت لا يلعب تلقائيا\n• استبعاد Snackbars السابقة عند حذف التنزيلات\n• تم إصلاح محاولة حذف كائن غير موجود في القائمة\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/970.txt",
    "content": "الجديد\n• إظهار البيانات الوصفية للمحتوى (العلامات ، الفئات ، الترخيص ، ...) أسفل الوصف\n• تمت إضافة خيار \"إظهار تفاصيل القناة\" في قوائم التشغيل البعيدة (غير المحلية)\n• تمت إضافة خيار \"فتح في المتصفح\" إلى قائمة الضغط لفترة طويلة\n\nثابت\n• تعطل دوران ثابت على صفحة تفاصيل الفيديو\n• ثابت زر \"اللعب مع Kodi\" في لاعب يطالب دائما لتثبيت كور\n• إعداد ثابت ومحسن لمسارات الاستيراد والتصدير\n• [يوتيوب] تعليق ثابت مثل العد\nوأكثر من ذلك بكثير\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/971.txt",
    "content": "الإصلاح العاجل\n• زيادة المخزن المؤقت للتشغيل بعد المخزن المؤقت\n• تعطل ثابت على الأجهزة اللوحية وأجهزة التلفزيون عند النقر على أيقونة قائمة انتظار التشغيل في المشغل\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/972.txt",
    "content": "الجديد\nالتعرف على الطوابع الزمنية وعلامات التصنيف في الوصف\nتمت إضافة إعداد وضع الكمبيوتر اللوحي اليدوي\nتمت إضافة القدرة على إخفاء العناصر التي تم تشغيلها في موجز ويب\n\nتحسين\nدعم إطار الوصول إلى التخزين بشكل صحيح\nمعالجة أفضل للأخطاء في القنوات غير المتاحة والتي تم إنهاؤها\nتعرض ورقة مشاركة Android لمستخدمي Android 10+ الآن عنوان المحتوى.\nتم تحديث حالات Invidious ودعم الروابط المنقولة بالأنابيب.\n\nثابت\n[يوتيوب] المحتوى المقيد على فئات عمرية معينة\nمنع تسرب استثناء النافذة عند فتح مربع حوار الاختيار\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/973.txt",
    "content": "الإصلاح العاجل\n• إصلاح الصور المصغرة والعناوين التي يتم قصها في تخطيط الشبكة ، بسبب الحساب الخاطئ لعدد مقاطع الفيديو التي يمكن وضعها في صف واحد\n• إصلاح مربع حوار التنزيل الذي يختفي دون القيام بأي شيء إذا تم فتحه من قائمة المشاركة\n• تحديث مكتبة تتعلق بفتح الأنشطة الخارجية مثل منتقي ملفات إطار الوصول إلى التخزين\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/974.txt",
    "content": "الإصلاح العاجل\n• إصلاح مشكلات التخزين المؤقت الناتجة عن اختناق YouTube\n• إصلاح استخراج تعليقات YouTube وأعطالها مع التعليقات المعطلة\n• إصلاح البحث عن الموسيقى يوتيوب\n• إصلاح البث المباشر PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/975.txt",
    "content": "الجديد\n• إظهار معاينة الصورة المصغرة أثناء البحث\n• كشف التعليقات المعطلة\n• السماح بوضع علامة على عنصر تغذية على أنه تمت مشاهدته\n• إظهار قلوب التعليق\n\nتحسين\n• تحسين البيانات الوصفية وتخطيط العلامات\n• تطبيق لون الخدمة على مكونات واجهة المستخدم\n\nثابت\n• إصلاح الصورة المصغرة في مشغل صغير\n• إصلاح التخزين المؤقت الذي لا نهاية له على عناصر قائمة الانتظار المكررة\n• بعض إصلاحات اللاعب مثل الدوران والإغلاق الأسرع\n• تعطيل النقرات أثناء تحديث الخلاصة\n• إصلاح بعض أعطال التنزيل\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/976.txt",
    "content": "• خيار مضاف لفتح المشغل مباشرة في وضع ملء الشاشة\n• السماح باختيار أنواع اقتراحات البحث التي سيتم عرضها\n• المظهر الداكن الآن أغمق + تمت إضافة شاشة البداية الداكنة\n• منتقي ملفات محسّن لإخفاء الملفات غير المرغوب فيها\n• إصلاح استيراد اشتراكات YouTube\n• إعادة تشغيل تيار يتطلب النقر على زر إعادة التشغيل مرة أخرى\n• إصلاح إغلاق الجلسة الصوتية\n• [Android TV] يقفز شريط البحث الطويل الثابت عند استخدام DPad\n\nلمشاهدة المزيد من التغييرات ، قم بعرض سجل التغيير (ومنشور المدونة) من علامة التبويب الروابط أدناه.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/977.txt",
    "content": "• تمت إضافة زر \"تشغيل التالي\" إلى قائمة الضغط لفترة طويلة\n• تمت إضافة بادئة مسار قصير على YouTube إلى مرشح الهدف\n• استيراد الإعدادات الثابتة\n• تبديل موضع شريط البحث مع أزرار المشغل في شاشة قائمة الانتظار\n• إصلاحات مختلفة متعلقة بـ MediasessionManager\n• لم يكتمل شريط البحث الثابت بعد انتهاء الفيديو\n• تم تعطيل نفق الوسائط على RealtekATV\n• توسيع منطقة أزرار المشغل المصغرة القابلة للنقر\n\nلمشاهدة المزيد من التغييرات ، قم بعرض سجل التغيير (ومنشور المدونة) من علامة التبويب الروابط أدناه.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/978.txt",
    "content": "تم إصلاح تنفيذ الشيك لإصدار NewPipe جديد. تم تنفيذ هذا الفحص في وقت مبكر جدا في بعض الأحيان وبالتالي أدى إلى تعطل التطبيق. يجب إصلاح ذلك الآن.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/979.txt",
    "content": "- إصلاح استئناف التشغيل\n- تحسينات للتأكد من أن الخدمة التي تحدد ما إذا كان يجب على NewPipe التحقق من إصدار جديد لم يتم تشغيلها في الخلفية\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/980.txt",
    "content": "الجديد\n• تمت إضافة خيار \"إضافة إلى قائمة التشغيل\" لمشاركة القائمة\n• إضافة دعم لروابط y2u.be و PeerTube القصيرة\n\nتحسين\n• جعل التحكم في سرعة التشغيل أكثر إحكاما\n• تغذية يسلط الضوء على عناصر جديدة الآن\n• يتم الآن حفظ خيار \"إظهار العناصر التي تمت مشاهدتها\" في الخلاصة\n\nثابت\n• إصلاح يوتيوب يحب ويكره استخراج\n• إعادة التشغيل التلقائي الثابت بعد العودة من الخلفية\nوأكثر من ذلك بكثير\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/981.txt",
    "content": "تمت إزالة دعم MediaParser لإصلاح استئناف التشغيل الفاشل بعد التخزين المؤقت على Android 11+.\nنفق وسائط معطل على QM16XE من Philips لإصلاح مشاكل التشغيل.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/982.txt",
    "content": "تم إصلاح YouTube الذي لا يقوم بتشغيل أي دفق\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/983.txt",
    "content": "إضافة واجهة مستخدم وسلوك جديدين للنقر المزدوج للبحث\nجعل الإعدادات قابلة للبحث\nتمييز التعليقات المثبتة على هذا النحو\nإضافة دعم مفتوح مع التطبيق لمثيل PeerTube الخاص ب FSFE\nإضافة إشعارات بالخطأ\nإصلاح إعادة تشغيل عنصر قائمة الانتظار الأول عند تغيير اللاعب\nانتظر لفترة أطول عند التخزين المؤقت أثناء البث المباشر قبل الفشل\nإصلاح ترتيب نتائج البحث المحلية\nإصلاح حقول العناصر الفارغة في قائمة انتظار التشغيل\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/984.txt",
    "content": "قم بتحميل عناصر أولية كافية في القوائم لملء الشاشة بأكملها ولإصلاح التمرير على الأجهزة اللوحية وأجهزة التلفزيون\nإصلاح الأعطال العشوائية أثناء التمرير عبر القوائم\nاجعل قوس تراكب البحث السريع للاعب يمر تحت واجهة مستخدم النظام\nالتراجع عن التغييرات إلى القواطع عند اللعب في نافذة متعددة ، مما يتسبب في تراجع المشغل في غير محله على بعض الهواتف\nزيادة برنامج التنمية المستدامة من 30 إلى 31\nتحديث مكتبة الإبلاغ عن الأخطاء\nإعادة بناء بعض التعليمات البرمجية في المشغل\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/985.txt",
    "content": "تم إصلاح YouTube الذي لا يقوم بتشغيل أي دفق\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/986.txt",
    "content": "الجديد\n• إخطارات للتيارات الجديدة\n• الانتقال السلس بين الخلفية ومشغلات الفيديو\n• تغيير درجة الصوت بنصف نغمة\n• إلحاق قائمة انتظار اللاعب الرئيسي بقائمة تشغيل\n\nتحسين\n• تذكر حجم خطوة السرعة / الملعب\n• تخفيف التخزين المؤقت الطويل الأولي في مشغل الفيديو\n• تحسين واجهة مستخدم المشغل لتلفزيون Android\n• تأكيد قبل حذف جميع الملفات التي تم تنزيلها\n\nثابت\n• إصلاح زر الوسائط لا يخفي عناصر تحكم اللاعب\n• إصلاح إعادة تعيين التشغيل عند تغيير نوع اللاعب\n• إصلاح تدوير مربع حوار قائمة التشغيل\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/987.txt",
    "content": "الجديد\n• دعم طرق التسليم بخلاف HTTP التقدمي: وقت تحميل تشغيل أسرع ، وإصلاحات ل PeerTube و SoundCloud ، وتشغيل البث المباشر على YouTube الذي انتهى مؤخرا\n• إضافة زر لإضافة قائمة تشغيل عن بعد إلى قائمة تشغيل محلية\n• معاينة الصورة في ورقة مشاركة Android 10+\n\nتحسين\n• تحسين مربع حوار معلمات التشغيل\n• نقل أزرار استيراد / تصدير الاشتراك إلى قائمة ثلاثية النقاط\n\nثابت\n• إصلاح إزالة مقاطع الفيديو التي تمت مشاهدتها بالكامل من قائمة التشغيل\n• إصلاح موضوع قائمة المشاركة وإدخال \"إضافة إلى قائمة التشغيل\"\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/988.txt",
    "content": "[يوتيوب] إصلاح الخطأ \"تعذر الحصول على أي بث\" عند محاولة تشغيل أي فيديو\n[يوتيوب] إصلاح الرسالة \"المحتوى التالي غير متوفر في هذا التطبيق.\" تظهر بدلا من الفيديو المطلوب\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/989.txt",
    "content": "• [يوتيوب] إصلاح التحميل اللانهائي عند محاولة تشغيل أي فيديو\n• [يوتيوب] إصلاح الاختناق على بعض مقاطع الفيديو\n• قم بترقية مكتبة jsoup إلى 1.15.3 ، والتي تتضمن إصلاحا أمنيا\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/990.txt",
    "content": "يسقط هذا الإصدار الدعم لنظام Android 4.4 KitKat ، والآن الحد الأدنى للإصدار هو Android 5 Lollipop!\n\nالجديد\n• إخفاء مقاطع الفيديو المستقبلية في الخلاصة\n• مشاركة قوائم التشغيل المحلية\n\nتحسين\n• إعادة بناء رمز اللاعب إلى مكونات صغيرة: ذاكرة وصول عشوائي أقل مستخدمة ، أخطاء أقل\n• تحسين وضع مقياس الصور المصغرة\n\nثابت\n• إصلاح المشكلات المختلفة المتعلقة بإخطار اللاعب: معلومات الوسائط القديمة / المفقودة ، الصورة المصغرة المشوهة\n• إصلاح ملء الشاشة باستخدام 1/4 من الشاشة\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/991.txt",
    "content": "جديد\n• إضافة زر \"فتح في المتصفح\" على واجهة الخطأ\n• إضافة خيار لعرض مجموعات القنوات على شكل قائمة\n• [YouTube] ضغطة مطولة على مقاطع الدفق لمشاركة رابط URL مع الطابع الزمني\n• إضافة زر قائمة انتظار التشغيل للمشغل الصغير\n\nتحسينات\n• إضافة الترجمة الأيسلندية وتحديث العديد من الترجمات الأخرى\n• العديد من التحسينات الداخلية\n\nتصليحات\n• إصلاح أعطاب متعددة\n• [YouTube] إصلاح مشكلات تحميل القنوات، وتحميل التغذية غير المخصصة، والتشغيل البديل في بعض البلدان\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/992.txt",
    "content": "الجديد\n• عدد المشتركين في تفاصيل الفيديو\n• تحميل من قائمة الانتظار\n• تعيين صورة مصغرة لقائمة التشغيل بشكل دائم\n• هاشتاغ وروابط الضغط لفترة طويلة\n• وضع عرض البطاقة\n\nتحسين\n• زر إغلاق مشغل صغير أكبر\n• تصغير حجم الصورة المصغرة بشكل أكثر سلاسة\n• الهدف الروبوت 13 (API 33)\n• السعي لم يعد يوقف اللاعب مؤقتا\n\nثابت\n• إصلاح تراكب على DeX / الماوس\n• السماح لمشغل الخلفية بدون تدفقات صوتية منفصلة\n• إصلاحات يوتيوب مختلفة وأكثر من ذلك …\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/993.txt",
    "content": "الجديد\n• إضافة تحذير عند إضافة مكررات قائمة التشغيل وإضافة زر لإزالتها\n• السماح بتجاهل أزرار الأجهزة\n• السماح بإخفاء مقاطع الفيديو التي تمت مشاهدتها جزئيا في الخلاصة\n\nتحسين\n• استخدم المزيد من أعمدة الشبكة على الشاشات الكبيرة\n• جعل مؤشرات التقدم متسقة مع الإعدادات\n\nثابت\n• إصلاح فتح عناوين URL للمتصفح والتنزيلات والمشغل الخارجي على Android 11+\n• إصلاح التفاعل مع ملء الشاشة الذي يتطلب نقرتين على اجهزة MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/994.txt",
    "content": "الجديد\n• دعم مسارات / لغات صوتية متعددة\n• السماح بإعداد إيماءات مستوى الصوت والسطوع على أي جانب من الشاشة\n• دعم لعرض علامات التبويب الرئيسية في الجزء السفلي من الشاشة\n\nتحسين\n• [Bandcamp] التعامل مع المسارات خلف جدار الدفع\n\nثابت\n• [يوتيوب] 403 أخطاء HTTP للتدفقات\n• مشغل أسود عند التبديل إلى المشغل الرئيسي من عرض قائمة التشغيل\n• تسرب ذاكرة لخدمة المشغل\n• تم تبديل [PeerTube] رافع الصور الرمزية والقناة الفرعية\n\nوأكثر من ذلك\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/995.txt",
    "content": "جديد\n• دعم علامات التبويب القناة\n• تحديد جودة الصورة\n• الحصول على العناوين لجميع الصور\n\nتحسين\n• إمكانية الوصول إلى واجهات المشغل\n• اختيار أفضل للصوت لتنزيلات الفيديو فقط\n• خيار لتضمين قائمة التشغيل وأسماء الفيديو لمحتوى قائمة التشغيل المشتركة\n\nمُثَبَّت\n• [يوتيوب] إصلاح جلب عدد الإعجابات\n• إصلاح عدم استجابة المشغل للنوافذ المنبثقة والأعطال\n• اختيار لغات خاطئة في منتقي اللغة\n• تركيز صوت المشغل لم يكن يحترم كتم الصوت\n• إضافة عنصر قائمة التشغيل لا يعمل في بعض الأحيان\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/996.txt",
    "content": "تم إصلاح NullPointerException عند فتح قناة / مؤتمر في media.ccc.de.\nحاول احدهم كسر الهدية التي قدمناها لك، لكننا تخطينا الأمر.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/997.txt",
    "content": "جديد\n• إضافة ردود التعليق\n• السماح بإعادة ترتيب قوائم التشغيل\n• عرض وصف قائمة التشغيل ومدتها\n• السماح بإعادة ضبط الإعدادات\n\nتحسين\n• [Android 13+] استعادة إجراءات الإشعارات المخصصة\n• طلب الموافقة للتحقق من التحديث\n• السماح بتشغيل/إيقاف الإشعارات مؤقتًا أثناء التخزين المؤقت\n• إعادة ترتيب بعض الإعدادات\n\nمُثَبَّت\n• [YouTube] إصلاح مشكلة عدم تحميل التعليقات، بالإضافة إلى إصلاحات وتحسينات أخرى\n• حل مشكلة عدم الحصانة في إعدادات الاستيراد والتحويل إلى JSON\n• إصلاحات التنزيل المختلفة\n• تقليم نص البحث\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/998.txt",
    "content": "تم إصلاح عدم تشغيل YouTube لأي بث بسبب أخطاء HTTP 403.\n\nلم يتم إصلاح أخطاء HTTP 403 العرضية في منتصف مقطع فيديو YouTube بعد.\nستتم معالجة هذه المشكلة في إصدار إصلاح عاجل آخر في أقرب وقت ممكن.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/changelogs/999.txt",
    "content": "يعمل إصدار الإصلاح الجديد هذا على إصلاح أخطاء HTTP 403 في منتصف مقاطع فيديو YouTube.\n\nجديد\n• [SoundCloud] إضافة دعم لعناوين URL الخاصة بـ on.soundcloud.com\n\nتحسنت\n• [Bandcamp] عرض معلومات إضافية في كشك الراديو\n\nثابت\n• [YouTube] إصلاح أخطاء HTTP 403 العرضية في بداية مقاطع الفيديو أو في منتصفها\n• [YouTube] استخراج الصورة الرمزية والشعار من المزيد من أنواع رؤوس القنوات\n• [Bandcamp] إصلاح الأخطاء المختلفة واستخدام HTTPS دائمًا\n"
  },
  {
    "path": "fastlane/metadata/android/ar/full_description.txt",
    "content": "نيو بايب (NewPipe) لا يستعمل أي مكتبات برمجية من جوجل أو واجهة برمجة التطبيقات الخاصة بيوتيوب. نيو بايب فقط يستخرج المعلومات التي يحتاجها من موقع يوتيوب. لذلك يمكن استعمال هذا التطبيق على أجهزة لم يتم تحميل خدمات جوجل عليها. أيضاً، لا تحتاج إلى حساب يوتيوب من أجل استعمال نيو بايب، وهو مجاني ومفتوح المصدر.\n"
  },
  {
    "path": "fastlane/metadata/android/ar/short_description.txt",
    "content": "واجهة يوتيوب مجانية ومفتوحة المصدر وخفيفة لأندرويد.\n"
  },
  {
    "path": "fastlane/metadata/android/ar_LY/changelogs/63.txt",
    "content": "### تحسينات\n- استيراد / تصدير إعدادات # 1333 \n- تقليل السحب على المكشوف (تحسين الأداء) #1371 \n- تحسينات رمز صغير # 1375 \n- أضف كل شيء عن الناتج المحلي الإجمالي #1420\n### ثابت\n- تنزيل: إصلاح تحطم على تحميل التنزيلات التي لم تنته من .ملفات جيجا # 1407\n"
  },
  {
    "path": "fastlane/metadata/android/ar_LY/changelogs/64.txt",
    "content": "### تحسينات\n- أضيفت القدرة على الحد من جودة الفيديو في حالة استخدام البيانات المتنقلة. #1339 \n- تذكر السطوع للدورة # 1442 \n- تحسين أداء التنزيل لوحدات المعالجة المركزية الأضعف # 1431 \n- إضافة (العمل) دعم الدورة الإعلامية # 1433\n\n### إصلاح\n- فيكس تحطم على فتح التنزيلات (فيكس متاحة الآن ليبني الإصدار) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/ar_LY/full_description.txt",
    "content": "نيو بايب لا تستخدم أي مكتبات إطار جوجل ، أو يوتيوب API. إنه يوزع الموقع فقط من أجل الحصول على المعلومات التي يحتاجها. لذلك يمكن استخدام هذا التطبيق على الأجهزة دون تثبيت خدمات جوجل. أيضا ، لا تحتاج إلى حساب يوتيوب لاستخدام نيو بايب ، وانها الخيط.\n"
  },
  {
    "path": "fastlane/metadata/android/ar_LY/short_description.txt",
    "content": "واجهة يوتيوب خفيفة مجانية للاندرويد\n"
  },
  {
    "path": "fastlane/metadata/android/ast/full_description.txt",
    "content": "NewPipe ye una aplicación llibre y gratuita que nun usa nin les biblioteques del framework de Google nin l'API de YouTube, namás analiza'l sitiu web pa recoyer la información que precisa. Poro, esta aplicación pue usase en preseos que nun tengan los servicios de Google instalaos. Tampoco ye necesaria una cuenta pa usar NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/ast/short_description.txt",
    "content": "Un frontal de YouTube llixeru y llibre p'Android.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/1002.txt",
    "content": "YouTube-un heç bir yayım oynatmaması düzəldildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/1003.txt",
    "content": "YouTube-un heç bir yayım oynatmaması düzəldildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/1004.txt",
    "content": "YouTube-un heç bir yayım oynatmaması düzəldildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/1007.txt",
    "content": "YouTube-un heç bir yayım oynatmaması düzəldildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/63.txt",
    "content": "### Təkmilləşdirmələr \n-İdxal/ixrac tənzimləmələri #1333 \n-Həddindən artıq çəkilişi azaldın (performansın yaxşılaşdırılması) #1371 \n- Kiçik kod təkmilləşdirmələri #1375 \n- GDPR #1420 haqqında hər şeyi əlavə edin \n\n### Sabit \n- Yükləyici: .giga fayllarından bitməmiş endirmələrin yüklənməsi zamanı yaranan nasazlığı aradan qaldırın #1407\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/64.txt",
    "content": "### Təkmilləşdirmələr\n- Mobil datadan istifadə edərkən video keyfiyyətini məhdudlaşdırmaq imkanı əlavə edildi. #1339\n- Sessiya üçün parlaqlığı yadda saxla #1442\n- Daha zəif CPU-lar üçün yükləmə performansını yaxşılaşdırın #1431\n- media sessiyası üçün (işləyən) dəstək əlavə edin #1433\n### Düzəliş\n- Yükləmələrin açılması zamanı qəzanı düzəldin (indi buraxılış quruluşları üçün əlçatandır) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/65.txt",
    "content": "### Təkmilləşdirmələr\n\n- Burgermenyu ikona animasiyasını deaktiv edin #1486\n\n- yükləmələrin silinməsini geri qaytarın #1472\n- Paylaşım menyusunda yükləmə seçimi #1498\n- Uzun toxunma menyusuna paylaşma seçimi əlavə edildi #1454\n- Çıxışda əsas oyunçunu minimuma endirin #1354 - Kitabxana versiyasının yenilənməsi və verilənlər bazası backup fix #1510\n- ExoPlayer 2.8.2 Yeniləmə #139\n- Daha sürətli sürət dəyişikliyi üçün müxtəlif addım ölçülərini dəstəkləmək üçün oxutma sürətinə nəzarət dialoqu yenidən işlənmişdir.\n- Oynatma sürətinə nəzarətdə səssizliklər zamanı sürətli irəliləməyə keçid əlavə edildi. Bu, audiokitablar və müəyyən musiqi janrları üçün faydalı olmalıdır və əsl qüsursuz təcrübə gətirə bilər (və çoxlu səssizliklərlə mahnını poza bilər =\\\\).\n- Metaməlumatların əl ilə deyil, pleyerdə daxili media ilə yanaşı ötürülməsinə imkan vermək üçün refaktor edilmiş media mənbəsinin həlli. İndi bizim tək metadata mənbəyimiz var və oxutma başlayanda birbaşa əlçatan olur.\n- Pleylist fraqmenti açıldığında yeni metadata mövcud olduqda uzaqdan pleylist metadatasının yenilənməməsi düzəldildi.\n- Müxtəlif UI düzəlişləri: #1383, fon pleyeri bildirişi indi həmişə ağdır, fırlatmaqla pop-up pleyerini bağlamaq daha asandır\n- Multiservis üçün yenidən işlənmiş arxitekturaya malik yeni çıxarıcıdan istifadə edin\n\n### Düzəlişlər\n\n- Düzəltmə #1440 Sınıq Video Məlumat Düzeni #1491\n- Tarixçəyə baxış düzəlişi #1497\n- #1495, istifadəçi pleylistə daxil olan kimi metadatanı (kiçik şəkil, başlıq və video sayı) yeniləyərək.\n- # 1475, istifadəçi detal fraqmentində xarici pleyerdə videoya başladıqda verilənlər bazasında görünüşü qeydiyyatdan keçirərək.\n- Pop-up rejimi vəziyyətində ekran fasiləsini düzəldin. #1463 (Sabit #640)\n- Əsas video pleyer düzəlişi #1509\n- [#1412] Oyunçu fəaliyyəti fonda olarkən yeni niyyət qəbul edildikdə oyunçu NPE-yə səbəb olan sabit təkrar rejimi.\n- Açılan pəncərəyə icazə verilmədikdə, oyunçunun pop-up üçün minimuma endirilməsi pleyeri məhv etmir.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/66.txt",
    "content": "# V0.13.7 Dəyişikliklər Qrupu \n\n### Düzəltildi\n - v0.13.6-nın çeşidləmə filtri məsələləri düzəldildi\n \n# v0.13.6-nın Dəyişiklikləri \n### Təkmilləşdirmələr\n - Burgermenu ikona animasiyasını söndürün #1486 - yükləmələrin silinməsini ləğv edin\n #1472 - Paylaşım menyusunda yükləmə seçimi \n# 1498 - Uzun klikləmə menyusuna paylaşma seçimi əlavə edildi \n#1454 - Çıxışda əsas oyunçunu minimuma endirin #1354 - Kitabxana versiyası yeniləməsi və verilənlər bazası ehtiyat nüsxəsini düzəltmə #1510 - ExoPlayer 2.8.2 Yeniləmə\n #1392 - Müxtəlif addım ölçülərini dəstəkləmək üçün oxutma sürətinə nəzarət dialoqu yenidən işlənmişdir. Daha sürətli sürət dəyişikliyi. \n- Oynatma sürətinə nəzarətdə səssizliklər zamanı sürətli irəliləməyə keçid əlavə edildi. Bu, audiokitablar və müəyyən musiqi janrları üçün faydalı olmalıdır və əsl qüsursuz təcrübə gətirə bilər (və çoxlu səssizliklərlə mahnını poza bilər =\\\\). \n- Metaməlumatların əl ilə deyil, pleyerdə daxili media ilə yanaşı ötürülməsinə imkan vermək üçün refaktor edilmiş media mənbəsinin həlli. İndi bizim tək metadata mənbəyimiz var və oxutma başlayanda birbaşa əlçatan olur. \n- Pleylist fraqmenti açıldığında yeni metadata mövcud olduqda uzaqdan pleylist metadatasının yenilənməməsi düzəldildi.\n - Müxtəlif UI düzəlişləri: \n#1383, fon pleyeri bildirişi indi həmişə ağdır, fırlatmaqla pop-up pleyerini bağlamaq daha asandır \n- Multiservis üçün yenidən işlənmiş arxitekturaya malik yeni çıxarıcıdan istifadə edin \n### Düzəlişlər \n- Düzəltmə\n #1440 Sınıq Video Məlumat Düzeni\n#1491 - İstifadəçi pleylistə daxil olan kimi metaməlumatları (kiçik şəkil, başlıq və video sayı) güncəlləşdirməklə #1497 \n- #1495 tarixçəsinə baxın. \n- # 1475, istifadəçi detal fraqmentində xarici pleyerdə videoya başladıqda verilənlər bazasında görünüşü qeydiyyatdan keçirərək.\n - Pop-up rejimi vəziyyətində ekran fasiləsini düzəldin.\n #1463 (Sabit #640)\n - Əsas video pleyer düzəlişi #1509\n - [#1412] Oyunçu fəaliyyəti fonda olarkən yeni niyyət qəbul edildikdə oyunçu NPE-yə səbəb olan sabit təkrar rejimi. \n- Açılan pəncərəyə icazə verilmədikdə, oyunçunun pop-up üçün minimuma endirilməsi pleyeri məhv etmir.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/68.txt",
    "content": "# v0.14.1 dəyişiklikləri\n\n### Sabit\n\n- Video URL-nin şifrəsini açmaqda uğursuzluq düzəldildi#1659\n- Sabit təsvir linki yaxşı çıxarılmadı#1657\n\n# v0.14.0 dəyişiklikləri\n\n### Yeni\n\n- Yeni Çəkməcə dizaynı\n#1461\n- Yeni fərdiləşdirilə bilən ön səhifə\n# 1461\n\n### Təkmilləşdirmələr\n\n- Yenidən işlənmiş Jest nəzarətləri\n#1604\n- Pop-up pleyerini bağlamağın yeni yolu #1597\n\n### Sabit\n\n- Abunə sayı mövcud olmadıqda xətanı düzəldin.№1649 bağlanır.\n- Bu hallarda \"Abunəçi sayı mövcud deyil\"i göstərin\n- YouTube pleylist boş olduqda NPE-ni düzəldin\n- SoundCloud-da köşklər üçün sürətli düzəliş\n- Refaktor və səhv düzəltmə #1623\n- Dövri axtarış nəticəsi #1562-ni düzəldin\n- Axtarış panelinin statik olaraq yerləşdirilməməsini düzəldin\n- YT Premium videonun düzgün bloklanmamasını düzəldin\n- Videoların bəzən yüklənməməsini düzəldin (DASH təhlilinə görə)\n- Video təsvirindəki keçidləri düzəldin\n- Kimsə xarici sdcard-a endirməyə cəhd edərkən xəbərdarlığı göstərin\n- Göstərilən heç nəyi düzəldin istisna hesabatı işə salır\n- Miniatür arxa fonda göstərilmir android 8.1 üçün oyunçu [buraya baxın](https://github.com/TeamNewPipe/NewPipe/issues/943)\n- Yayım qəbuledicisinin qeydiyyatını düzəldin. №1641 bağlanır.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/69.txt",
    "content": "### Yeni \n- Uzun kliklə silin və abunəliklərdə paylaşın #1516 - Planşet UI və şəbəkə siyahısı tərtibatı #1617 \n\n### Təkmilləşdirmələr \n- sonuncu istifadə olunan aspekt nisbətini saxlayıb yenidən yükləyin #1748\n - Tam video adları ilə Yükləmələr fəaliyyətində xətti düzümü aktivləşdirin #1771\n - Abunəlikləri birbaşa abunəliklər tabından silin və paylaşın #1516 \n- Növbəyə yığmaq, əgər oxutma növbəsi artıq bitibsə, videonun oynatılmasını tetikler #1783\n - Səs və parlaqlıq jestləri üçün ayrıca parametrlər #1644\n - Lokallaşdırma üçün dəstək əlavə edin #1792\n\n ### Düzəlişlər\n -vaxt təhlilini düzəldin. format, beləliklə, NewPipe Finlandiyada istifadə oluna bilər\n - Abunəlik sayını düzəldin \n- API 28+ cihazları üçün ön plana xidmət icazəsi əlavə edin #1830\n\n ### Məlum Xətalar \n- Oxutma vəziyyəti Android P-də yadda saxlanıla bilməz\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/70.txt",
    "content": "DİQQƏT: Bu versiya yəqin ki, sonuncu versiya kimi bir bugfestdir. Lakin 17-ci ildən bəri tam bağlanması səbəbindən. qırıq versiya heç bir versiyadan daha yaxşıdır. Düzdür? ¯\\_(ツ)_/¯\n\n ### Təkmilləşdirmələr\n * endirilmiş fayllar indi bir kliklə açıla bilər #1879 * android 4.1 - 4.3 üçün dəstəyi buraxın #1884 \n* köhnə oyunçunu silin #1884 \n* sürüşdürməklə axınları cari oyun növbəsindən silin onları sağa #1915 \n* yeni axın əl ilə növbəyə salındıqda avtomatik növbəyə qoyulmuş axını silin #1878\n * Yükləmələr üçün postprocessing və çatışmayan funksiyaları həyata keçirin #1759 @kapodamy\n * Post-proses infrastrukturu\n * Düzgün xəta idarəsi \"infrastruktur\" (yükləyici üçün) \n* Çoxsaylı yükləmələr əvəzinə növbə saxlayın\n * Seriallaşdırılmış gözlənilən yükləmələri (`.giga` faylları) proqram datasına köçürün\n * Maksimum endirmə cəhdini həyata keçirin \n* Düzgün çoxmüxtəlif endirmənin dayandırılmasını \n* Mobil şəbəkəyə keçərkən yükləmələri dayandırın (heç vaxt işləmir, 2-ci nöqtəyə baxın)\n * Saxla növbəti yükləmələr üçün mövzu sayı\n * Çoxlu uyğunsuzluqlar düzəldildi\n\n### Düzəltildi \n* Defolt ayırdetmə ən yaxşı və məhdud mobil data ayırdetmə səviyyəsinə təyin edilmiş qəzanı düzəldin #1835\n * pop-up pleyer qəzası düzəldildi #1874 \n* Fon pleyeri açmağa çalışarkən NPE # 1901 \n* Yerləşdirmə üçün düzəliş g avtomatik növbə aktivləşdirildikdə yeni axınlar #1878 \n* Bağlama şəhərinin şifrəsinin açılması problemi həll edildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/71.txt",
    "content": "### Təkmilləşdirmələr\n * GitHub quruluşu üçün proqram yeniləmə bildirişi əlavə edin (@krtkush tərəfindən #1608) \n* Yükləyiciyə müxtəlif təkmilləşdirmələr (@kapodamy tərəfindən #1944): \n* çatışmayan ağ nişanlar əlavə edin və simvol rənglərini dəyişdirmək üçün sərt üsuldan istifadə edin \n* olub olmadığını yoxlayın iterator işə salındı (düzəlişlər #2031)\n * yeni muxerdə \"sonradan emal alınmadı\" xətası ilə yenidən yükləmələrə icazə verin \n* sinxron olmayan video və audio axınları düzəldən yeni MPEG-4 muxer (#2039)\n### Sabit\n * YouTube canlı yayımlar qısa müddətdən sonra ifa etməyi dayandırır (@yausername tərəfindən #1996)\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/730.txt",
    "content": "# Sabit \n- Yenidən qaynar şəkildə deşifrə funksiyası xətası.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/740.txt",
    "content": "<h4>Təkmilləşdirmələr</h4>\n<ul>\n<li> şərhlərdəki keçidləri tıklanabilir etmək, mətn ölçüsünü artırmaq</li>\n<li> şərhlərdə vaxt damğası bağlantılarına klikləməyə çalışın</li>\n<li> son seçilmiş vəziyyətə əsasən üstünlük verilən tabı göstərin</li>\n<li> pleylist pəncərəsində \"Arxa fon\" üzərinə uzun müddət kliklədikdə pleylistini növbəyə əlavə edin</li>\n<li> URL olmadığı zaman paylaşılan mətni axtarın</li><\nli> əsas video pleyerə \"cari vaxtda paylaş\" düyməsini əlavə edin</li>\n<li> video növbəsi bitdikdə əsas pleyerə bağlama düyməsini əlavə edin</li>\n<li> video siyahı elementləri üçün uzun basaraq menyuya \"Birbaşa Fonda Oynat\" əlavə edin</li><li> Play/Enqueue əmrləri üçün ingilis dili tərcümələrini təkmilləşdirin</li>\n<li> kiçik performans təkmilləşdirmələri</li>\n<li> istifadə olunmamış faylları silin</li>\n<li> ExoPlayer-i 2.9.6-a yeniləyin</li>\n<li> Invidious bağlantılar üçün dəstək əlavə edin</li>\n</ul>\n<h4> Sabit</h4>\n<ul>\n<li> şərhlər və əlaqəli axınlarla sabit sürüşdürmə deaktiv edildi</li>\n<li> Sabit CheckForNewAppVersionTask yerinə yetirilməməlidir</li>\n<li> sabit youtube abunə idxalı: etibarsız url olanlara məhəl qoymayın və başlığı boş olanları saxlayın</li>\n<li> etibarsız YouTube url-ni düzəldin: imza teqinin adı həmişə \"imza\" deyil, axınların yüklənməsinə mane olur</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/750.txt",
    "content": "Yeni \nOxuma xülasəsi #2288 \n• Sonuncu dəfə dayandırdığınız yayımları davam etdirin \nYükləyici Təkmilləşdirmələri #2149\n • Endirmələri xarici SD-kartlarda saxlamaq üçün Yaddaş Giriş Çərçivəsindən istifadə edin \n• Yeni mp4 muxer\n • Yükləməyə başlamazdan əvvəl yükləmə qovluğunu istəyə görə dəyişdirin\n • Ölçülmüş şəbəkələrə hörmət edin \n\nTəkmilləşdirilmiş\n • Silinmiş gema sətirləri #2295\n • Fəaliyyətin həyat dövrü ərzində (avtomatik) fırlanma dəyişikliklərini idarə edin #2444\n • Uzun basılan menyuları ardıcıl edin #2368 \n\nDüzəltildi \n• Seçilmiş altyazı trek adının göstərilməməsi düzəldildi #2394\n • Proqram yeniləməsinin yoxlanılması uğursuz olduqda qəzaya uğramayın (GitHub versiya) #2423\n • Sabit endirmələr 99,9% qalıb #2440\n • Oynatma növbəsi metadatasını güncəlləyin #2453 \n• [SoundCloud] Pleylistləri yükləyərkən yaranan xəta düzəldildi TeamNewPipe/NewPipeExtractor#170\n • [YouTube] Sabit müddət Team7Pipe/Newtractor paresed edilə bilməz\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/760.txt",
    "content": "0.17.1-də dəyişikliklər \n\nYeni\n • Tayland lokalizasiyası \n\nTəkmilləşdi \n• Pleylistlər üçün uzun basılan menyularda yenidən burada ifa etməyə başlayın əməliyyatı əlavə edin #2518 \n• SAF / köhnə fayl seçicisi üçün keçid əlavə edin #2521\n\n Sabitləşdirildi \n• Proqramları dəyişdirərkən yükləmələr görünüşündə yoxa çıxan düymələri düzəldin #2487 \n• Baxış tarixçəsi deaktiv edilsə də, oxutma mövqeyini düzəldin \n• Siyahı görünüşlərində oxutma mövqeyinin yaratdığı performansı azaldın №2517 \n• [Extractor] ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186-nı düzəldin\n • [Extractor] [YouTube] Təsadüfi axtarış xətasını düzəldin. çalğı siyahıları nəticələrdədir TeamNewPipe/NewPipeExtractor#185\n\n\n 0.17.0-da dəyişikliklər\n Yeni \nOynatma davamı #2288\n • Sonuncu dəfə dayandırdığınız yayımları davam etdirin Downloader Təkmilləşdirmələri #2149\n • Endirmələri xarici SD-kartlarda saxlamaq üçün Yaddaş Giriş Çərçivəsindən istifadə edin \n• Seçim olaraq yeni mp4 muxer. endirməyə başlamazdan əvvəl endirmə kataloqunu dəyişdirin\n • Ölçülmüş şəbəkələrə hörmət edin \n\nTəkmilləşdirildi \n• Silinmiş gema sətirləri #2295\n • Fəaliyyətin həyat dövrü ərzində (avtomatik) fırlanma dəyişikliklərini idarə edin #2444\n • Uzun müddətə edin -menyuları ardıcıl basın #2368\n\n Sabitləndi\n • Seçilmiş altyazı trekinin adının göstərilməməsi düzəldildi #2394 \n• Proqram yeniləməsinin yoxlanılması uğursuz olduqda qəzaya uğramayın (GitHub versiyası) #2423\n • Sabit endirmələr 99,9%-də qaldı #2440 \n• Oynatma növbəsinin metadatasını yeniləyin #2453 \n• [SoundCloud] TeamNewPipe/NewPipeExtractor#170 pleylistlərini yükləyərkən yaranan xəta düzəldildi • [YouTube] Sabit müddət TeamNewPipe/NewPipeExtractor#177 ilə paresd edilə bilməz\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/770.txt",
    "content": "0.17.2 Dəyişiklikləri \n\nDüzəlt \n• Düzəldi. Heç bir video mövcud deyildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/780.txt",
    "content": "0.17.3-də dəyişikliklər\n\n Təkmilləşdi \n• Oxutma vəziyyətlərini silmək üçün seçim əlavə edildi #2550 \n• Fayl seçicidə gizli kataloqları göstərin #2591 \n• NewPipe #2488 ilə açılacaq `invidio.us` instansiyalarından URL-ləri dəstəkləyin\n • `music.youtube üçün dəstək əlavə edin .com` URL'ləri TeamNewPipe/NewPipeExtractor#194\n\nDüzəltildi \n• [YouTube] Sabit 'java.lang.IllegalArgumentException #192\n • [YouTube] Sabit canlı yayımların işləməməsi TeamNewPipe/NewPipeExtractor#195-in işləməsi problemi\n • #52-də endirmə düzəlib\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/790.txt",
    "content": "Təkmilləşdirilmiş \n• Kor insanlar üçün əlçatanlığı yaxşılaşdırmaq üçün daha çox başlıq əlavə edin #2655 \n• Yükləmə qovluğunun dilini daha ardıcıl və daha az qeyri-müəyyən edin #2637 \n\nDüzəltildi \n• Blokdakı son baytın endirilib-endirilmədiyini yoxlayın #2646 \n• Video təfərrüatlı fraqmentdə sabit sürüşdürmə #2672\n • İkiqat axtarışın aydın qutusu animasiyalarını bir #2695-ə silin \n• [SoundCloud] Client_id hasilatı #2745 \n\nİnkişafını düzəldin\n • NewPipeExtractor-dan NewPipe #2535-ə miras qalmış çatışmayan asılılıqları əlavə edin \n• AndroidX #2685-ə köçürün\n • ExoPlayer 2.10.6 #2736-a yeniləyin, #2\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/800.txt",
    "content": "Yeni\n • P2P olmadan PeerTube dəstəyi (#2201) \n[Beta]: \n◦ PeerTube nümunələrindən videolara baxın və endirin \n◦ Tam PeerTube dünyasına daxil olmaq üçün parametrlərə nümunələr əlavə edin\n ◦ Müəyyən girişlərə daxil olan zaman Android 4.4 və 7.1-də SSL əl sıxmalarında problemlər ola bilər. şəbəkə xətası ilə nəticələnən hallar.\n\n • Yükləyici (#2679): \n◦ Endirmə ETA-nı hesablayın \n◦ Opus (veb faylları) ogg kimi endirin\n ◦ Uzun fasilədən sonra endirmələri davam etdirmək üçün vaxtı keçmiş endirmə bağlantılarını bərpa edin\n\n Təkmilləşdirildi\n • KioskFragment-i üstünlük verilən məzmun ölkəsindəki dəyişikliklərdən xəbərdar edin və bütün performansını yaxşılaşdırın əsas nişanlar #2742 \n• №2713 çıxarıcıdan yeni Lokallaşdırma və Yükləyici tətbiqlərindən istifadə edin\n • \"Defolt köşk\" sətrini tərcümə edilə bilən edin\n • Qara mövzu üçün qara naviqasiya paneli #2569\n\n Sabitləşdirildi \n• Başqa barmaq yerləşdirilərkən pop-up pleyerini hərəkət etdirə bilməyən xəta düzəldildi. pop-up pleyerinin hərəkət etdirilməsi #2772 \n• Yükləyicisi çatmayan pleylistlərə icazə verin və bu problemlə bağlı qəzaları düzəldin №2724, TeamNewPipe/NewPipeExtractor#219\n • MediaC ilə TLS əl sıxışmasını düzəltmək üçün Android 4.4 cihazlarında (API 19/KitKat) TLS1.1/1.2 işə salınır və bəzi PeerTube nümunələri #2792\n • [SoundCloud] Sabit müştəri kimliyinin çıxarılması TeamNewPipe/NewPipeExtractor#217 • [SoundCloud] Audio axınının çıxarılmasının işlənməsini düzəldin \n• ExoPlayer-i 2.10.8 #2791, #2816-a yeniləyin \n• Güncəlləmə 3.5.1-ə keçin və Kotlin dəstəyi #2714 əlavə edin\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/810.txt",
    "content": "Yeni \n• Arxa fonda ifa edərkən kilid ekranında video miniatürünü göstər \n\nTəkmilləşdirilmiş \n• Arxa fonda / popup düyməsini uzun müddət basdıqda növbəyə yerli pleylist əlavə edin\n • Yalnız bir tab olduqda əsas səhifə nişanlarını sürüşdürün və gizlədin \n• Bildiriş miniatürünün miqdarını məhdudlaşdırın fon pleyerində yeniləmələr\n • Boş yerli çalğı siyahıları üçün dummy miniatür əlavə edin \n• *.webm əvəzinə *.opus fayl uzantısından istifadə edin və endirmə açılan menyusunda \"WebM Opus\" əvəzinə format etiketində \"opus\"u göstərin • Yüklənmiş faylları silmək üçün düyməni əlavə edin və ya \"Yükləmələr\"də endirmə tarixçəsi\n • [YouTube] /c/shortened_url kanal linklərinə dəstək əlavə edin \n\nDüzəltildi \n• Videonu NewPipe-da paylaşarkən və onun axınlarını birbaşa endirərkən bir çox problem həll edildi \n• Yaradılan mövzudan oyunçu girişi düzəldildi\n • Sabit axtarış nəticəsi səhifələnməsi \n• [YouTube] NPE-yə səbəb olan null-un işə salınması düzəldildi \n• [YouTube] invidio.us url-i açarkən şərhlərə baxılması düzəldildi \n• [SoundCloud] Yenilənmiş müştəri_id\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/820.txt",
    "content": "YouTube-u yararsız hala gətirən regex funksiyasının şifrəsinin açılması düzəldildi.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/830.txt",
    "content": "SoundCloud problemlərini həll etmək üçün yenilənmiş SoundCloud client_id.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/840.txt",
    "content": "Yeni\n • Proqram dilini dəyişmək üçün dil seçicisi əlavə edildi\n • Oyunçuların yığıla bilən menyusuna Kodi-yə göndər düyməsi əlavə edildi\n • Uzun basışda şərhləri kopyalamaq imkanı əlavə edildi \n\nTəkmilləşdirildi\n • ReCaptcha fəaliyyətini düzəldin və əldə edilmiş kukiləri düzgün saxlayın\n • Çekmece və gizlətmə lehinə nöqtə menyusu silindi parametrlərdə baxış tarixçəsi aktiv edilmədikdə tarix düyməsi \n• Android 6 və sonrakı versiyalarda düzgün şəkildə parametrlərdə digər proqramlar üzərində göstərilməsi üçün icazə istəyin\n • BookmarkFragment-də uzun klikləməklə yerli pleylistinin adını dəyişin\n • Müxtəlif PeerTube təkmilləşdirmələri \n• Təkmilləşdirilmiş bir neçə ingilis mənbə sətirləri \n\nSabitləşdirildi \n• Sabit pleyer \"Tətbiq keçidində minimuma endirmək\" seçimi aktiv edildikdə və NewPipe minimuma endirildikdə dayandırılsa da, yenidən başlayır \n• Jest üçün ilkin parlaqlıq dəyərini düzəldin \n• Sabit .srt altyazı yükləmələri bütün sətir fasilələrini ehtiva etmədi \n• SD karta endirmənin uğursuzluğu müəyyən edildi, çünki bəzi Android 5 cihazları CTF uyğun deyil\n • Android KitKat-da sabit endirmə • Sabit pozulmuş video .mp4 faylının audio fayl kimi tanınması\n • Sabit multi yanlış Çin dili kodları da daxil olmaqla ple lokalizasiya problemləri \n• [YouTube] Təsvirdəki vaxt möhürləri yenidən klikləilə bilər\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/850.txt",
    "content": "Bu buraxılışda YouTube veb-saytının versiyası yeniləndi. Köhnə vebsayt versiyası mart ayında dayandırılacaq və buna görə də sizdən yeniləməyiniz tələb olunur.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/860.txt",
    "content": "Təkmilləşdirilmiş \n• Səthin və tempin açılıb\n-açılmadığını yadda saxlayın və bərpa edin\n • Pleyerdə displey kəsilməsini dəstəkləyin\n • Dairəvi görünüş və abunəçilərin sayı \n• Daha az məlumat istifadə etmək üçün optimallaşdırılmış YouTube \n\nBu buraxılışda YouTube ilə əlaqəli 15-dən çox baq düzəldildi.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/870.txt",
    "content": "Bu, SoundCloud-dan yenidən böyük çətinliklər olmadan istifadə etməyə imkan vermək üçün NewPipe-ı yeniləyən düzəliş buraxılışıdır. \nSoundCloud-un v2 API-si indi ekstraktorda istifadə olunur və etibarsız müştəri ID-lərinin aşkarlanması təkmilləşdirilib.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/900.txt",
    "content": "Yeni \n• Abunə qrupları və çeşidlənmiş lentlər \n• Pleyerlərdə səssiz düyməsi \n\nTəkmilləşdirilmiş\n • NewPipe-də music.youtube.com və media.ccc.de linklərinin açılmasına icazə verin\n • Görünüşdən Məzmuna iki parametrin yerini dəyişin \n• Dəqiq olduqda 5, 15, 25 saniyəlik axtarış seçimlərini gizlədin. axtarış aktivləşdirildi \n\nSabitləşdirildi\n • bəzi WebM videoları axtarıla bilməz \n• Android P-də verilənlər bazası ehtiyat nüsxəsi \n• endirilmiş faylı paylaşarkən qəza \n• tonlarla YouTube çıxarılması problemi və s.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/910.txt",
    "content": "Bəzi nadir hallarda NewPipe-ın başlamasına mane olan sabit məlumatlar bazası miqrasiyası.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/920.txt",
    "content": "Təkmilləşdi\n\n • Yayım şəbəkəsi elementlərinə yükləmə tarixi və baxış sayı əlavə edildi \n• Çekmə başlığının tərtibatı üçün təkmilləşdirmələr\n\n Sabitləndi \n\n• API 19-da qəzalara səbəb olan sabit səssiz düyməsi \n• Uzun 1080p 60 kadr videoların endirilməsi düzəldildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/930.txt",
    "content": "Yeni \n• YouTube Musiqidə axtarın \n• Əsas Android TV dəstəyi \n\nTəkmilləşdi\n • Bütün baxılan videoları yerli pleylistdən silmək imkanı əlavə edildi \n• Məzmunu pozmaq əvəzinə hələ dəstəklənməyəndə mesajı göstərin\n • Çimdik jestləri ilə təkmilləşdirilmiş pop-up pleyerinin ölçüsünü dəyişdirin \n• Yayımları sıralayın arxa fonda və kanalda açılan düymələrə uzun müddət basmaq\n • Çekmece başlığının başlığının təkmilləşdirilmiş ölçü idarəsi \n\nSabitləndi \n• Yaş məhdudiyyəti ilə bağlı sabit məzmun parametri işləmir\n • Müəyyən növ reCAPTCHA-lar düzəldildi\n • Pleylist `null` olarkən əlfəcinləri açarkən qəza düzəldildi\n • Şəbəkənin sabit aşkarlanması əlaqədar istisnalar\n • Abunəliklər fraqmentində qrup çeşidləmə düyməsinin sabit görünməsi və daha çox\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/940.txt",
    "content": "Yeni\n • SoundCloud şərhləri üçün dəstək əlavə edin\n • YouTube məhdudlaşdırılmış rejim ayarı əlavə edin \n• PeerTube ana kanalı təfərrüatlarını göstərin \n\nTəkmilləşdi \n• Yalnız dəstəklənən xidmətlər üçün Kore düyməsini göstərin\n • Naviqasiya Panelində və ya StatusBar-da başlayan oyunçu jestlərini bloklayın \n• Xidmətə əsasən yenidən cəhd edin və abunə olun düymələrinin fon rəngini dəyişdirin rəng \n\nDüzəltildi\n • Yükləmə dialoqunun dondurulmasını düzəldin\n • Brauzerdə aç düyməsi indi həqiqətən brauzerdə açılır\n • Videoların açılması zamanı yaranan nasazlığı aradan qaldırın və \"Bu yayımı oynatmaq mümkün olmadı\" və s.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/950.txt",
    "content": "Bu buraxılış üç kiçik düzəliş gətirir: \n• Adroid 10+-da sabit yaddaş girişi \n• Sabit açılış köşkləri \n• Uzun videoların sabit müddət təhlili\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/951.txt",
    "content": "Yeni\n\n • Lent qrupu dialoqunda abunə seçicisi üçün axtarış əlavə edin \n• Yalnız qruplaşdırılmamış abunələri göstərmək üçün lent qrupu dialoquna filtr əlavə edin \n• Əsas səhifəyə pleylist nişanı əlavə edin \n• Arxa fonda/pop-up oyunçu növbəsində sürətli irəli/geri sarın\n •Axtarış təklifini göstərin: bunu nəzərdə tutursunuz və nəticəni göstərirsiniz\n\nTəkmilləşdirildi\n • Tətbiq metadatasını dəyişdirilmiş fayllarda buraxın \n• Uğursuz axınları növbədən silməyin \n• Alətlər panelinin rənginə uyğunlaşdırmaq üçün status panelinin rəngini güncəlləyin\n\nSabit \n• Üzən nöqtə kümülatif xətaların səbəb olduğu sabit audio/video sinxronizasiyası düzəldildi\n • [PeerTube ] Silinmiş şərhləri idarə edin və s\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/952.txt",
    "content": "Təkmilləşdirilmiş\n • Avtomatik oxutma bütün xidmətlər üçün əlçatandır (yalnız YouTube üçün əvəzinə) \n\nSabit \n• YouTube-un yeni davamını dəstəkləyərək əlaqəli axınlar \ndüzəldildi \n• Sabit yaş məhdudiyyəti olan YouTube videoları \n• [Android TV] Sabit uzanan fokus vurğulanması\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/953.txt",
    "content": "YouTube-un deşifrə funksiyasının çıxarılmasını düzəldin.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/954.txt",
    "content": "• yeni proqram iş prosesi: ətraflı səhifəsində videoları oynatın, oyunçunu minimuma endirmək üçün aşağı sürüşdürün\n • MediaStyle bildirişləri: bildirişlərdə fərdiləşdirilə bilən hərəkətlər, performans təkmilləşdirmələri\n • NewPipe-dan masaüstü proqramı kimi istifadə edərkən əsas ölçülərin dəyişdirilməsi\n • dəstəklənməyən URL tost zamanı açıq seçimlərlə dialoq göstərin \n• Uzaqdan olanları əldə etmək mümkün olmadıqda axtarış təklifi təcrübəsini təkmilləşdirin \n• Defolt video keyfiyyəti 720p60 (tətbiqdaxili pleyer) və 480p (pop-up pleyer) səviyyəsinə qaldırıldı\n• tonla səhv düzəltmələri və daha çox\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/955.txt",
    "content": "[YouTube] Bəzi istifadəçilər üçün axtarışı düzəldin [YouTube] Təsadüfi deşifrə istisnalarını düzəldin\n\n [SoundCloud] Çizgi ilə bitən URL-lər indi düzgün təhlil edildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/956.txt",
    "content": "[YouTube] Hər hansı videonu yükləyərkən yaranan nasazlıq aradan qaldırıldı\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/957.txt",
    "content": "• Xüsusi növbə hərəkətlərini birinə birləşdirin \n• Oyunçu bağlamaq üçün iki barmaq jesti \n• reCAPTCHA kukilərinin təmizlənməsinə icazə verin\n• Bildirişi rəngləndirməmək üçün seçim \n• Sonsuz buferləşdirməni, NewPipe ilə paylaşarkən səhv davranışı və digər uyğunsuzluqları düzəltmək üçün video detallarının necə açıldığını təkmilləşdirin\n• YouTube videolarını sürətləndirin və yaş məhdudiyyəti olanları düzəldin \n• Sürətli irəli/geri çevirmə zamanı qəzanı düzəldin\n• Eskizləri dartmaqla siyahıları yenidən təşkil etməyin\n• Həmişə pop-up xassələrini xatırlayın \n• Santali dili əlavə edildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/958.txt",
    "content": "Yeni və təkmilləşdirilmiş:\n • Kilid ekranında miniatürü gizlətmək üçün seçim yenidən əlavə edildi \n• Lenti yeniləmək üçün çəkin \n• Yerli siyahıları əldə edərkən təkmilləşdirilmiş performans \n\nSabit:\n • RAM-dan çıxarıldıqdan sonra NewPipe-ı işə salarkən yaranan qəza düzəldildi\n • İnternet bağlantısı olmadıqda işə salma zamanı yaranan qəza düzəldildi \n• Parlaqlıq və həcm jest parametrlərinə uyğun olaraq düzəldildi \n• [YouTube] Sabit uzun çalğı siyahıları \n\nDigər:\n • Kodun təmizlənməsi və bir sıra daxili təkmilləşdirmələr \n• Asılılıq yeniləmələri \n• Tərcümə yeniləmələri.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/959.txt",
    "content": "Səhv reportyorunu açdıqdan sonra sonsuz qəza döngəsi düzəldildi.\nNewPipe tərəfindən avtomatik açıla bilən PeerTube nümunələrinin yenilənmiş siyahısı.\nYenilənmiş tərcümələr.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/960.txt",
    "content": "• Parametrlərdə ixrac verilənlər bazası seçiminin təkmilləşdirilmiş təsviri. \n• YouTube şərhlərinin təhlili düzəldildi.\n • media.ccc.de xidmətinin sabit displey adı.\n • Yenilənmiş tərcümələr.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/961.txt",
    "content": "• [YouTube] Mix dəstəyi\n • [YouTube] İctimai yayımçılar və Covid-19 haqqında məlumatı göstərin \n• [media.ccc.de] Son videolar əlavə edildi \n• Somali tərcüməsi əlavə edildi\n\n• Çoxlu daxili təkmilləşdirmələr\n\n • Pleyer daxilində videoların paylaşılması düzəldildi \n• Sabit boş ReCaptcha veb görünüşü • Siyahıdan axını silərkən baş verən qəza düzəldildi \n• [PeerTube] Sabit əlaqəli axınlar \n• [YouTube] Sabit YouTube Musiqi axtarışı\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/962.txt",
    "content": "media.ccc.de xidmətinə \"son\" videolar əlavə edildi.\nMedia.ccc.de xidmətinə canlı yayımlar və həmçinin canlı yayım dəstəyi əlavə edildi.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/963.txt",
    "content": "• [YouTube] Sabit kanalın davamı\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/964.txt",
    "content": "• Oyunçu idarələrində fəsillər üçün əlavə dəstək\n • [PeerTube] Sepia axtarışı əlavə edildi \n• Video təfərrüatları görünüşündə paylaşma düyməsi yenidən əlavə edildi və axın təsviri tab tərtibatına köçürüldü \n• Parlaqlıq jesti deaktiv edilibsə, parlaqlığın bərpasını deaktiv edin\n • Videonu kodi-də oynamaq üçün siyahı elementi əlavə edildi \n• Bəzi cihazlarda heç bir defolt brauzer təyin edilmədikdə qəza düzəldildi və paylaşma dialoqlarını təkmilləşdirin\n • Tam ekran pleyerində hardware sahəsi düyməsi ilə oynat/fasilə dəyişin\n • [media.ccc.de] Müxtəlif düzəlişlər və təkmilləşdirmələr\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/965.txt",
    "content": "Kanal qruplarını yenidən sıralayarkən baş verən qəza düzəldildi.\nKanallardan və pleylistlərdən daha çox YouTube videosu əldə etmək həll edildi.\nYouTube şərhlərinin alınması düzəldildi.\nYouTube URL-lərində /watch/, /v/ və /w/ alt yolları üçün əlavə dəstək.\nSoundCloud müştəri identifikatorunun və coğrafi məhdudiyyətli məzmunun sabit çıxarılması. Şimali Kürd lokalizasiyası əlavə edildi.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/966.txt",
    "content": "Yeni: \n• Yeni xidmət əlavə edin: Bandcamp \n\nTəkmilləşdirilmiş: \n• Proqramın cihaz mövzusunu izləməsi üçün seçim əlavə edin \n• Təkmil xəta panelini göstərməklə bəzi qəzaların qarşısını alın\n • Məzmunun niyə əlçatmaz olması haqqında daha çox məlumat göstərin \n• Avadanlıq boşluq düyməsi oynatma/pauza verir\n • \"Yükləmə başladı\" tostunu göstərin \n\nSabit:\n • Arxa fonda oxuyarkən video təfərrüatlarında çox kiçik miniatürləri düzəldin\n • Kiçilmiş oyunçuda boş başlığı düzəldin \n• Düzgün bərpa edilməmiş sonuncu ölçü dəyişdirmə rejimi düzəldi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/967.txt",
    "content": "YouTube-un AB-də düzgün işləməməsi düzəldildi. Buna NewPipe-dan RAZILIQ kukisi təyin etməyi tələb edən yeni kuki və məxfilik razılığı sistemi səbəb olub.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/968.txt",
    "content": "Uzun basılan menyuya kanal təfərrüatları seçimi əlavə edildi.\nPleylist interfeysindən Pleylist adını dəyişmək üçün funksionallıq əlavə edildi.\nVideo buferlənərkən istifadəçiyə fasilə verməyə icazə verin.\nAğ mövzunu cilaladı.\nDaha böyük şrift ölçüsündən istifadə edərkən üst-üstə düşən şriftlər düzəldildi.\nFormuler və Zephier cihazlarında heç bir video düzəldilməyib. Müxtəlif qəzaları aradan qaldırdı.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/969.txt",
    "content": "• Xarici yaddaşda quraşdırmaya icazə verin\n • [Bandcamp] Yayımda ilk üç şərhi göstərmək üçün əlavə dəstək \n• Yükləmə başlandıqda yalnız \"download başladı\" tostunu göstərin \n• Saxlanılan kuki olmadıqda reCaptcha kukisini təyin etməyin \n• [Oyunçu] Keş performansını təkmilləşdirin \n• [Oyunçu] Sabit oyunçunun avtomatik oynamaması\n • Yükləmələri silərkən əvvəlki Snackbarları rədd edin\n • Siyahıda olmayan obyekti silmək cəhdi düzəldildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/970.txt",
    "content": "Yeni\n • Təsvirin altında məzmun metadatasını (teqlər, kateqoriyalar, lisenziya, ...) göstərin \n• Uzaqdan (yerli olmayan) pleylistlərdə \"Kanal təfərrüatlarını göstər\" seçimi əlavə edildi.\n • Uzun basılan menyuya \"Brauzerdə aç\" seçimi əlavə edildi \n\nSabit \n• Video təfərrüatları səhifəsində sabit fırlanma qəzası \n• Pleyerdəki \"Kodi ilə Oyna\" düyməsi həmişə Kore quraşdırmağı təklif edir \n• Sabit və təkmilləşdirilmiş qəbulu idxal və ixrac yolları \n• [YouTube] Bəyənmə sayı düzəldildi Və daha çox\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/971.txt",
    "content": "Düzəltmə \n• Rebuferdən sonra oxutma üçün buferi artırın\n • Pleyerdə oynatma növbəsi ikonasına klikləyərkən planşetlərdə və televizorlarda yaranan nasazlıq aradan qaldırıldı\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/972.txt",
    "content": "Yeni \nTəsvirdə vaxt ştamplarını və hashtagları tanıyın Əl ilə planşet rejimi parametri əlavə edildi Lentdə oynanılan elementləri gizlətmək imkanı əlavə edildi\n\nTəkmilləşdirilmiş \nYaddaş Giriş Çərçivəsini düzgün şəkildə dəstəkləyin \nƏlçatan olmayan və dayandırılmış kanalların daha yaxşı idarə edilməsi\n Android 10+ istifadəçiləri üçün Android paylaşım vərəqi indi məzmunun başlığını göstərir. \n\nYenilənmiş\n Invidious instansiyaları və boru bağlantılarını dəstəkləyir. Sabit [YouTube] Yaş məhdudiyyəti olan məzmun Seçim dialoqunu açarkən sızan pəncərə İstisnasının qarşısını alın\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/973.txt",
    "content": "Düzəltmə\n • Bir cərgəyə neçə videonun yerləşə biləcəyi ilə bağlı səhv hesablamaya görə tor düzümündə kəsilmiş miniatürləri və başlıqları düzəldin \n• Paylaşım menyusundan açılsa, yükləmə dialoqunun heç nə etmədən yoxa çıxmasını düzəldin \n• Storage Access Framework fayl seçicisi kimi xarici fəaliyyətlərin açılması ilə bağlı kitabxananı yeniləyin\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/974.txt",
    "content": "Düzəltmə \n• YouTube tənzimləməsinin səbəb olduğu buferləmə problemlərini həll edin \n• YouTube şərhlərinin çıxarılmasını və əlil şərhlərlə qəzaları düzəldin \n• YouTube musiqi axtarışını düzəldin • PeerTube canlı yayımlarını düzəldin\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/975.txt",
    "content": "Yeni\n • Axtararkən miniatür önizləməsini göstərin \n• Əlil şərhləri aşkar edin \n• Lent elementini baxılmış kimi qeyd etməyə icazə verin\n • Şərh ürəklərini göstərin \n\nTəkmilləşdirilmiş\n • Metadata və teqlərin tərtibatını təkmilləşdirin \n• UI komponentlərinə xidmət rəngini tətbiq edin \n\nSabit \n• Mini pleyerdə miniatürü düzəldin\n • Dublikat növbə elementlərində sonsuz buferləşdirməni düzəldin \n• Fırlanma və daha sürətli bağlanma kimi bəzi oyunçu düzəlişləri \n• Fonda yüklənmiş qalan ReCAPTCHA-nı düzəldin \n• Lenti təzələyərkən klikləri söndürün\n • Bəzi yükləyici qəzalarını düzəldin\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/976.txt",
    "content": "• Tam ekranda oyunçunu birbaşa açmaq üçün seçim əlavə edildi\n • Hansı növ axtarış təkliflərinin göstərilməsinə icazə verin\n • Qaranlıq mövzu indi daha tünd + tünd ekran əlavə edildi\n • Arzuolunmaz faylları bozlaşdırmaq üçün təkmilləşdirilmiş fayl seçicisi \n• YouTube abunəliklərinin idxalı düzəldildi\n • Yayımı təkrar oxutmaq üçün təkrar oxutma düyməsinə yenidən toxunmaq lazımdır \n• Sabit bağlanan audio sessiya \n• [Android TV] DPad istifadə edərkən uzun axtarış çubuğu atlamaları düzəldildi.\nƏlavə dəyişiklikləri görmək üçün aşağıdakı Linklər sekmesinden dəyişiklik jurnalına (və blog yazısına) baxın.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/977.txt",
    "content": "• Uzun mətbuat menyusuna \"növbəti oynat\" düyməsi əlavə edildi \n• Niyyət filtrinə YouTube şortu yolu prefiksi əlavə edildi \n• Sabit Parametrlərin idxalı\n • Növbə ekranında oyunçu düymələri ilə axtarış çubuğunun yerini dəyişdirin \n• MediasessionManager ilə bağlı müxtəlif düzəlişlər \n• Sabit axtarış çubuğu video bitdikdən sonra tamamlanmadı \n• RealtekATV-də media tunelləri söndürüldü \n• Genişləndirilmiş kiçildilmiş oyunçu düymələri tıklanabilir sahə Əlavə dəyişiklikləri görmək üçün aşağıdakı Linklər sekmesinden dəyişiklik jurnalına (və blog yazısına) baxın.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/978.txt",
    "content": "Yeni bir NewPipe versiyası üçün yoxlamanın aparılması düzəldildi. Bu yoxlama bəzən çox erkən həyata keçirilirdi və buna görə də tətbiq qəzasına səbəb olur. Bu, indi düzəldilməlidir.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/979.txt",
    "content": "- Oynatmanın davam etdirilməsi düzəldildi \n- NewPipe-ın yeni versiyanın yoxlanılmasının olub olmadığını müəyyən edən xidmətin arxa planda başlamamasını təmin etmək üçün təkmilləşdirmələr\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/980.txt",
    "content": "Yeni\n • Menyu paylaşmaq üçün \"Pleylistə əlavə et\" seçimi əlavə edildi\n • y2u.be və PeerTube qısa keçidləri üçün əlavə dəstək\n\n Təkmilləşdirilmiş • Playback-Speed-Controlları daha yığcam etdi \n• Lent indi yeni elementləri vurğulayır \n• Lentdə \"Baxılan elementləri göstər\" seçimi indi yadda saxlanılıb \n\nSabit \n• Sabit YouTube bəyənmə və bəyənməmələrin çıxarılması \n• Arxa fondan qayıtdıqdan sonra avtomatik təkrar oynatma düzəldildi \nVə daha çox\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/981.txt",
    "content": "Android 11+-da buferdən sonra uğursuz oxutma davamını düzəltmək üçün MediaParser dəstəyi silindi.\n Oxutma problemlərini həll etmək üçün Philips QM16XE-də media tunelini deaktiv etdi.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/982.txt",
    "content": "YouTube-un heç bir yayım oynatmaması düzəldildi.\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/983.txt",
    "content": "Axtarmaq üçün yeni iki dəfə toxunan UI və davranış əlavə edin Parametrləri axtara bilən edin \nSabitlənmiş şərhləri belə vurğulayın FSFE-nin PeerTube nümunəsi üçün açıq proqram dəstəyi əlavə edin Səhv bildirişləri əlavə edin\n Oyunçu dəyişikliyində birinci növbə elementinin təkrarını düzəldin\n Canlı yayımlar zamanı buferləmə zamanı uğursuzluqdan əvvəl daha çox gözləyin\n Yerli axtarış nəticələrinin sırasını düzəldin \nOyun növbəsindəki boş element sahələrini düzəldin\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/984.txt",
    "content": "Bütün ekranı doldurmaq və planşet və televizorlarda sürüşməni düzəltmək üçün siyahılara kifayət qədər ilkin elementləri yükləyin Siyahılar arasında sürüşərkən təsadüfi qəzaları düzəldin\nOyunçuda sürətli axtarış üst-üstə düşmə qövsünü sistem UI-nin altına daxil edin\n Çox pəncərədə oynadarkən bəzi telefonlarda yersiz oyunçu reqressiyasına səbəb olan dəyişiklikləri kəsiklərə qaytarın \nSdk-ni 30-dan 31-ə qədər artırın\nXəta hesabatı kitabxanasını yeniləyin \nPleyerdə bəzi kodu refaktor edin\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/985.txt",
    "content": "YouTube-un heç bir yayım oynatmaması düzəldildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/986.txt",
    "content": "Yeni \n• Yeni axınlar üçün bildirişlər \n• Fon və video pleyerlər arasında problemsiz keçid \n• Səthi yarımtonlarla dəyişdirin \n• Pleylistə əsas oyunçu növbəsini əlavə edin\n\n Təkmilləşdirilmiş \n• Sürət/pitch addım ölçüsünü yadda saxla\n • Video pleyerdə ilkin uzun buferləməni azaldın\n • Android TV üçün oyunçu interfeysini təkmilləşdirin \n• Bütün endirilmiş faylları silməzdən əvvəl təsdiqləyin \n\nSabit \n• Yeni axınlar üçün bildirişlər \n• Fon və video pleyerlər arasında problemsiz keçid \n• Səthi yarımtonlarla dəyişdirin\n • Pleylistə əsas oyunçu növbəsini əlavə edin\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/987.txt",
    "content": "Yeni\n• Tədricən HTTP'dən başqa çatdırılma üsullarını dəstəkləyin: daha sürətli oynatma yükləmə zamanı, PeerTube və SoundCloud üçün düzəlişlər, bu yaxınlarda başa çatmış YouTube canlı yayımlarının oynadılması\n• Yerli siyahıya uzaqdan pleylist əlavə etmək üçün düyməni əlavə edin\n• Android 10+ paylaşım vərəqində şəkilə baxış\n\nTəkmilləşdirildi\n• Oynatma tənzimləmələrini təkmilləşdirin\n• Abunəlik idxal/ixrac düymələrini üç nöqtəli menyuya köçürün\n\nSabitləndi\n• Tam baxılmış videoların pleylistdən çıxarılmasını düzəldin\n• Paylaşım menyusu mövzusunu və \"pleylistə əlavə et\" girişini düzəldin\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/988.txt",
    "content": "[YouTube] Videonu başlatmağa başladıqda \"Heç bir yayım əldə etmək mümkün olmadı\" xətası aradan qaldırıldı\n[YouTube] Vide sorğusu əvəzinə \"Bu məzmun bu tətbiqdə əlçatan deyil\" xətası aradan qaldırıldı\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/989.txt",
    "content": "• [YouTube] İstənilən videonu oynatmağa cəhd edilərkən sonsuz tüklənmə düzəldildi\n• [YouTube] Bəzi videolarda yavaşılama aradan qaldırıldı\n• 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\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/991.txt",
    "content": "Yeni \n• Xəta panelində \"Brauzerdə aç\" düyməsini əlavə et\n• Kanal qruplarını siyahı kimi göstərmək üçün seçim əlavə et\n• [YouTube] Vaxt möhürü URL-ni paylaşmaq üçün yayım seqmentlərinə uzun kliklə\n• Mini oynadıcıya oynatma növbəsi düyməsini əlavə et\n\nTəkmilləşdirildi\n• İslandiya lokalizasiyası əlavə edildi və bir çox digər tərcümələr yeniləndi\n• Bir çox daxili təkmilləşdirmələr\n\nDüzəldildi\n• Çoxsaylı qəzalar düzəldilib\n• [YouTube] Bəzi ölkələrdə yükləmə kanallarını, qeyri-müəyyən axın və müvəqqəti oynatma problemlərini həll et\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/998.txt",
    "content": "YouTube-un heç bir yayım oynatmaması düzəldildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/changelogs/999.txt",
    "content": "YouTube-un heç bir yayım oynatmaması düzəldildi\n"
  },
  {
    "path": "fastlane/metadata/android/az/full_description.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/az/short_description.txt",
    "content": "Android üçün pulsuz və yüngül YouTube müştərisi.\n"
  },
  {
    "path": "fastlane/metadata/android/azb/short_description.txt",
    "content": "اندرویددا یوتیوب اوچون بیر اؤزگور و یونگول قاپاخ.\n"
  },
  {
    "path": "fastlane/metadata/android/bar/short_description.txt",
    "content": "A fraie, schmoiche YouTube-Abb füa Android.\n"
  },
  {
    "path": "fastlane/metadata/android/be/changelogs/63.txt",
    "content": "### Паляпшэнні\n- Імпарт/экспарт налад #1333\n- Зменшана перамалёўка (аптымізацыя прадуктыўнасці) #1371\n- Невялікія паляпшэнні кода #1375\n- Дададзена ўсё пра GDPR #1420\n\n### Выпраўлена\n- Загрузчык: Выпраўленне збою пры загрузцы незавершаных загрузак з .giga файлаў #1407\n"
  },
  {
    "path": "fastlane/metadata/android/be/changelogs/64.txt",
    "content": "### Паляпшэнні\n- Дададзена магчымасць абмежаваць якасць відэа пры выкарыстанні мабільных дадзеных. #1339 \n- Запамінанне яркасці для сесіі #1442 \n- Паляпшенне прадуктыўнасці загрузкі для слабых працэсараў #1431 \n- Дададзена (працоўная) падтрымка медыя-сесіі #1433\n\n### Выпраўленне\n- Выпраўленне збою пры адкрыцці загрузак (выпраўленне зараз даступна для рэлізных зборак) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/be/changelogs/65.txt",
    "content": "### Выпраўлена\n\n- Выключэнне анімацыі меню атладчыка #1486 \n- адмяніць выдаленне усталёўкі #1472 \n- Опцыя \"Усталяваць у меню падзяліцца #1498\n- Дададзена опцыя падзяліцца да меню доўгага касання #1454 \n- Мінімізаваць галоўны прайгравальнік пры выхадзе #1354 \n- Абноўлена версія бібліятэкі і выпраўлены бэкап базы дадзеных #1510 \n- ExoPlayer 2.8.2 Абнаўленне #1392\n  - Reworked the playback speed control dialog to support different step sizes for faster speed change.\n  - 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 =\\\\).  \n  - 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.\n  - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened.\n  - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging\n- Use new extractor with refactored architecture for multiservice\n\n### Fixes\n\n- Fix #1440 Broken Video Info Layout #1491 \n- View history fix #1497\n  - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. \n  - #1475, by registering a view in the database when the user starts a video on external player on detail fragment.\n- Fix creen timeout in case of popup mode. #1463 (Fixed #640)\n- Main video player fix #1509 \n  - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background.\n  - Fixed minimizing player to popup does not destroy player when popup permission is not granted.\n"
  },
  {
    "path": "fastlane/metadata/android/be/changelogs/992.txt",
    "content": "Новае\n- Колькасць падпісчыкаў у дэталях відэа\n- Загрузка з чаргі\n- Сталая ўсталёўка мініяцюры плэйліста\n- Доўгі націск на хэштэгі і спасылкі\n- Карткавы рэжым прагляду\n\nПаляпшэнні\n- Павялічаная кнопка зачынення міні-плэера\n- Больш плаўнае змяншэнне памеру мініяцюр\n- Мэтавая версія Android 13 (API 33)\n- Пошук больш не ставіць плэера на паўзу\n\nВыпраўленні\n- Выпраўленне накладання на DeX/мыш\n- Дазволены фонавы плэер без асобных аўдыятрансляцый\n- Розныя выпраўленні YouTube і гэтак далей…\n"
  },
  {
    "path": "fastlane/metadata/android/be/full_description.txt",
    "content": "NewPipe не выкарыстоўвае бібліятэкі фрэймворку Google ці API YouTube. Ён толькі аналізуе вэб-сайт, каб атрымаць неабходную інфармацыю. Таму гэтую праграму можна выкарыстоўваць на прыладах без усталяваных сэрвісаў Google. Акрамя таго, вам не патрэбен уліковы запіс YouTube, каб выкарыстоўваць NewPipe, гэта вольнае і адкрытае праграмнае забеспячэнне.\n"
  },
  {
    "path": "fastlane/metadata/android/be/short_description.txt",
    "content": "Вольны і лёгкі кліент YouTube для Android.\n"
  },
  {
    "path": "fastlane/metadata/android/bg/changelogs/1000.txt",
    "content": "Подобрено\n• Направи описанието на плейлиста възможно за избиране за показване на повече/по-малко съдържание\n• [PeerTube] Поддръжка\n`subscribeto.me` инстанцията се свързва автоматично\n• Пускай само един обект в екрана за история\nПоправено\n• Поправи видимостта на RSS бутона\n• Поправи сриване на предварителния преглед на полето за търсене\n• Поправи показването на обект без обложка\n• Поправено е излизането от диалоговия прозорец за изтегляне, преди да се появи\n• Поправка на изскачащ прозорец за добавяне в опашката на списък със свързани елементи\n• Поправка на реда в диалоговия прозорец за добавяне към плейлиста\n• Регулиране на оформлението на елементите от отметките в плейлиста\n"
  },
  {
    "path": "fastlane/metadata/android/bg/changelogs/64.txt",
    "content": "### Подобрения\n-Добавена е възможността да се ограничи качеството на видеото ако се използва мобилен интернет. #1339.\n- Запаметява яркостта за сесията #1442.\n- Оптимизиране при изтегляне с по-слаби процесори #1431.\n\n### Поправени\n- Поправен срив при отваряне на изтегления #1441\n"
  },
  {
    "path": "fastlane/metadata/android/bg/full_description.txt",
    "content": "NewPipe не използва никакви рамкови библиотеки на Google или API на YouTube. Той анализира уебсайта само за да получи информацията, от която се нуждае. Следователно това приложение може да се използва на устройства без инсталирани услуги на Google. Освен това не ви е необходим акаунт в YouTube, за да използвате NewPipe и това е FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/bg/short_description.txt",
    "content": "Безплатен и лек YouTube клиент за Android.\n"
  },
  {
    "path": "fastlane/metadata/android/bm/short_description.txt",
    "content": "ߦߕߎߓߎ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߣߌ߫ ߝߍߡߊ߲ ߢߊߝߘߍ߫ ߜ߲ߘߙߏߌߘ ߞߊ߲߬.\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/63.txt",
    "content": "###অগ্রগতিসমূহ\n- আমদানি/রপ্তানি সেটিংস #১৩৩৩\n- বাহুল্যতা কমানো( দক্ষতার উন্নয়ন)#১৩৭১\n- সংক্ষিপ্ত কোডের উন্নয়নসমূহ #১৩৭৫\n- জিডিপিআরের(GDPR) সমস্তকিছু সংযুক্তকরণ #১৪২০\n###সংশোধন\n- ডাউনলোডকারী: .giga ফাইল থেকে অসম্পূর্ণ ডাউনলোড লোড হওয়ার সময় অচলাবস্থা ঠিক করা হয়েছে #১৪০৭\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/64.txt",
    "content": "### অগ্রগতিসমূহ\n- মোবাইল ডাটা ব্যবহার করার সময় ভিডিও মানের সীমা নির্ধারণ করা যাবে। #1339।\n- প্লেয়ারের উজ্জ্বলতা মনে রাখুন #1442।\n- দুর্বল সিপিইউর ডিভাইসে পারফরম্যান্স উন্নত করা হয়েছে #1431।\n- মিডিয়া সেশন এখন সঠিকভাবে কাজ করে #1433।\n\n### সংশোধনসমূহ\n- ডাউনলোডগুলোতে প্রবেশ করার সময় ক্র্যাশ ঠিক করা হয়েছে (রিলিজ নির্মাণগুলোর জন্য) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/65.txt",
    "content": "### উন্নয়নসমূহ\n\n- বার্গারমেনু আইকন এনিমেশন বন্ধ করা হয়েছে #1486 \n- ডাউনগুলো পুনরায় ফিরিয়ে আনার অপশন রাখা হয়েছে #1472 \n- শেয়ার মেনুতে ডাউনলোড অপশন রাখা হয়েছে #1498\n- দীর্ঘ ট্যাপ মেনুতে ডাউনলোড অপশন রাখা হয়েছে #1454 \n- মূল প্লেয়ার থেকে প্রস্থান করার সময় মিনিমাইজ করার অপশন রাখা হয়েছে #1354 \n- লাইব্রেরি সংস্করণ হালনাগাদ এবং ডেটা ব্যাকআপ ঠিক করা হয়েছে #1510 \n- এক্সোপ্লেয়ার ২.৮.২ সংস্করণ #1392\n  - দ্রুত প্লেব্যাক গতি পরিবর্তন করার জন্য বিভিন্ন স্টেপ সাইজ নির্বাচন করার সুবিধা রাখা হয়েছে\n  - মৌনতার সময় দ্রুত অগ্রসর হওয়ার অপশন রাখা হয়েছে।\n অডিওবুক, কিছু ধারার সঙ্গীতের জন্য উপযোগী। (গানের মধ্যে অত্যধিক বিরতি উপেক্ষা করা যাবে=\\\\).  \n  - স্বয়ংক্রিয়ভাবে অভ্যন্তরীণ মিডিয়ার পাশাপাশি মেটাডেটা গ্রহণ করার জন্য  মিডিয়া রেজ্যুলুশনকে অনুমতি দেয়া হয়েছে। মেটাডেটার একটিমাত্র উৎস থাকায় এখন প্লেব্যাক শুরু হওয়ার সাথে সাথে মেটাডেটা পাওয়া যাবে।\n  - দূরবর্তী প্লেলিস্টের ক্ষেত্রে প্লেলিস্ট ফ্র্যাগমেন্ট খোলা থাকা অবস্থায় মেটাডেটা হালনাগাদ না হওয়া ঠিক করা হয়েছে।\n  - ইউআইতে নানা সংশোধন: #1383, ব্যাকগ্রাউন্ড প্লেয়ার নোটিফিকেশন এখন সর্বদা সাদা, পপআপ প্লেয়ার টেনে বন্ধ করা এখন আরো সহজ\n- বিভিন্ন সেবা ব্যবহার করার জন্য নিষ্কর্ষক গঠন পরিবর্তন করা হয়েছে\n\n### সংশোধনসমূহ\n\n- #1440 ভিডিও তথ্য লেআউট ঠিক করা হয়েছে #1491 \n- ইতিহাস সঠিকভাবে দেখা যাবে #1497\n  - #1495, ব্যবহারকারী প্লেলিস্টে প্রবেশ করার সাথে সাথে মেটাডেটা (থাম্বনেইল, শিরোনাম ও ভিডিও দর্শকসংখ্যা) হালনাগাদ হয়ে যাবে।\n  - #1475, বাহ্যিক প্লেয়ারে ভিডিও প্লে করলে ডেটাবেজের ডিটেইল ফ্র্যাগমেন্টে দর্শন গণনা করা হবে।\n- পপআপ প্লেয়ারের জন্য স্ক্রিন টাইমআউট ঠিক করা হয়েছে #1463 (সংশোধিত #640)\n- মূল প্লেয়ার সংশোধন #1509 \n  - [#1412] ব্যাকগ্রাউন্ডে নতুন ইনটেন্ট গ্রহণ করার সময় পুনরাবৃত্তি মোড সঠিকভাবে প্রয়োগ না হওয়া ঠিক করা হয়েছে ‌।\n  - পপআপ প্লেয়ার অনুমতি প্রদান না করা হলে পপআপ প্লেয়ারে মিনিমাইজেশন সুবিধা বন্ধ হবে না।\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/66.txt",
    "content": "# v0.13.7 এর পরিবর্তনসূচী\n\n### স্থির\n- v0.13.6 এর বাছাই করা ফিল্টার সমস্যাগুলি ঠিক করুন\n\n# v0.13.6 এর পরিবর্তনসূচী\n\n### উন্নতি\n\n- বার্গারমেনু আইকন অ্যানিমেশন #1486 অক্ষম করা হয়েছে \n- ডাউনলোড #1472 মুছে ফেলা হয়েছে পূর্বাবস্থায়\n- শেয়ার মেনু #1498 এ ডাউনলোড এর অপশন\n- লং ট্যাপ মেনু #1454 এ শেয়ার অপশন যোগ করা হয়েছে\n- প্রস্থান #1354 এ প্রধান প্লেয়ার ছোট  করা যাবে\n- লাইব্রেরি সংস্করণ আপডেট এবং ডাটাবেস ব্যাকআপ নিষ্কাশন #1510\n- ExoPlayer 2.8.2 আপডেট #1392\n  - দ্রুত গতি পরিবর্তনের জন্য বিভিন্ন ধাপের আকার সমর্থন করতে প্লেব্যাক গতি নিয়ন্ত্রণ ডায়ালগ পুনরায় কাজ করেছে৷\n  - প্লেব্যাক গতি নিয়ন্ত্রণে নীরবতার সময় ফাস্ট-ফরওয়ার্ডে একটি টগল যুক্ত করা হয়েছে। এটি অডিওবুক এবং নির্দিষ্ট সঙ্গীত ঘরানার জন্য সহায়ক হওয়া উচিত এবং একটি সত্যিকারের বিরামহীন অভিজ্ঞতা আনতে পারে (এবং প্রচুর নীরবতার সাথে একটি গান ভাঙতে পারে =\\\\)।\n  - ম্যানুয়ালি না করে প্লেয়ারে অভ্যন্তরীণভাবে মিডিয়ার পাশাপাশি মেটাডেটা পাস করার অনুমতি দেওয়ার জন্য রিফ্যাক্টর করা মিডিয়া সোর্স রেজোলিউশন। এখন আমাদের কাছে মেটাডেটার একটি একক উৎস আছে এবং প্লেব্যাক শুরু হলে সরাসরি উপলব্ধ।\n  - প্লেলিস্ট ফ্র্যাগমেন্ট খোলার সময় নতুন মেটাডেটা উপলব্ধ হলে রিমোট প্লেলিস্ট মেটাডেটা আপডেট হচ্ছে না।\n  - বিভিন্ন UI ফিক্স: #1383, ব্যাকগ্রাউন্ড প্লেয়ার নোটিফিকেশন কন্ট্রোল এখন সবসময় সাদা, ফ্লিংিংয়ের মাধ্যমে পপআপ প্লেয়ার বন্ধ করা সহজ\n- মাল্টি সার্ভিসের জন্য রিফ্যাক্টরযুক্ত আর্কিটেকচার সহ নতুন এক্সট্র্যাক্টর ব্যবহার করুন\n\n### সমাধান\n\n- #1440 ব্রোকেন ভিডিও ইনফো লেআউট #1491 ঠিক করুন\n- দেখুন ইতিহাস সংশোধন #1497\n  - #1495, ব্যবহারকারী প্লেলিস্ট অ্যাক্সেস করার সাথে সাথে মেটাডেটা (থাম্বনেল, শিরোনাম এবং ভিডিও গণনা) আপডেট করে।\n  - #1475, ডাটাবেসে একটি ভিউ রেজিস্টার করে যখন ব্যবহারকারী ডিটেইল ফ্র্যাগমেন্টে এক্সটার্নাল প্লেয়ারে একটি ভিডিও শুরু করে।\n- পপআপ মোডের ক্ষেত্রে ক্রিনের সময়সীমা ঠিক করুন। #1463 (স্থির #640)\n- প্রধান ভিডিও প্লেয়ার ফিক্স #1509\n  - [#1412] ফিক্সড রিপিট মোড প্লেয়ার এনপিই সৃষ্টি করে যখন প্লেয়ার অ্যাক্টিভিটি ব্যাকগ্রাউন্ডে থাকে তখন নতুন ইন্টেন্ট পাওয়া যায়।\n  - পপআপের জন্য ফিক্সড মিনিমাইজিং প্লেয়ার প্লেয়ারকে ধ্বংস করে না যখন পপআপের অনুমতি না দেওয়া হয়।\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/68.txt",
    "content": "https://hosted.weblate.org/translate/newpipe/metadata/bn/?checksum=2a64aca6716bd69b\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/730.txt",
    "content": "# নিস্কাসিত\n- দ্রুত হট নিষ্কাসন ডিক্রিপ্ট ফাংশন ত্রুটি আরেকবার।\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/770.txt",
    "content": "০.১৭.২ এ পরিবর্তনসূচী\n\nনিষ্কাসন\n• কোনো ভিডিও নেই সমস্যা ঠিক করা হয়েছে\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/820.txt",
    "content": "ডিক্রিপ্ট ফাংশন নাম রেজেক্সের জন্য ইউটিউবের ব্যবহারযোগ্যতা ঠিক করা।\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/830.txt",
    "content": "সাউন্ডক্লাউড সমস্যা ঠিক করতে সাউন্ডক্লাউড client_id হালনাগাদ করা।\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/850.txt",
    "content": "এ সংস্করণে ইউটিউব ওয়েবসাইট সংস্করণ হালনাগাদ করা হয়েছে। পুরোনো ওয়েবসাইট সংস্করণ মার্চ মাস থেকে রহিত করা হবে এবং এজন্য আপনার নিউপাইপ হালনাগাদ করা উচিত।\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/953.txt",
    "content": "ইউটিউবের ডিক্রিপশন ফাংশনের নিষ্কাশন ঠিক করা।\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/956.txt",
    "content": "[ইউটিউব] কোনো ভিডিও লোড হওয়ার মধ্যের ক্র্যাশ নিষ্কাসন করা হয়েছে\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/962.txt",
    "content": "media.ccc.de সেবার \"সাম্প্রতিক\" ভিডিও যোগ করা হয়েছে।\nmedia.ccc.de সেবার সরাসরি ধারা যোগ করা হয়েছে এবং সাধারণ সরাসরি ধারা সমর্থনও যোগকৃত।\n"
  },
  {
    "path": "fastlane/metadata/android/bn/changelogs/963.txt",
    "content": "• [ইউটিউব] চ্যানেল ধারাবাহিকতা ঠিক করা\n"
  },
  {
    "path": "fastlane/metadata/android/bn/full_description.txt",
    "content": "নিউপাইপ গুগলের কোন ফ্রেমওয়ার্ক লাইব্রেরি বা ইউটিউব এপিআই ব্যবহার করে না। এটা শুধুমাত্র ওয়েবসাইটের সাথে সংযুক্ত হয়ে প্রয়োজনীয় তথ্য সংগ্রহ করে। এজন্য গুগল পরিষেবা ইন্সটল না থাকা যন্ত্রেও এটি ব্যবহার করা সম্ভব। একইসাথে ইউটিউব অ্যাকাউন্ট না থাকা সত্ত্বেও আপনি ইউটিউব ব্যবহার করতে পারবেন এবং এটি উন্মুক্ত সফটওয়্যার।\n"
  },
  {
    "path": "fastlane/metadata/android/bn/short_description.txt",
    "content": "অ্যানড্রয়েডের জন্য একটি মুক্ত ও সরল ইউটিউব ফ্রন্টএন্ড।\n"
  },
  {
    "path": "fastlane/metadata/android/bn_BD/changelogs/63.txt",
    "content": "### উন্নতিসমূহ\n- Import/export সেটিংস #1333\n- চিত্রণ কমানো (দক্ষতার উন্নতি) #1371\n- ছোটখাটো কোডে উন্নতি #1375\n- GDPR এর সবকিছু যোগ হওয়া #1420\n\n### নিষ্কাসীত\n- ডাউনলোডার: .giga ফাইল থেকে অসমাপ্ত ডাউনলোড গুলোর থেমে যাওয়া লোড এর নিষ্কাসন #1407\n"
  },
  {
    "path": "fastlane/metadata/android/bn_BD/changelogs/64.txt",
    "content": "### উন্নতিসমুহ\n- মোবাইল ডেটা ব্যাবহারে ভিডিও মানে সীমা দেয়ার ক্ষমতা যোগ করা হয়েছে। #1339\n- সেশন এর মাধ্যমে উজ্জ্বলতা মনে রাখা। #1442\n- দুর্বল সিপিইউগুলোতে ডাউনলোডের দক্ষতার উন্নতি। #1431\n- মিডিয়া সেশনগুলোই সাহায্যকারী যোগ করা হয়েছে। #1433\n\n### নিষ্কাশন\n- ডাউনলোডগুলো খুলতে বিধ্বস্ত হওয়া নিষ্কাসন( ছেড়ে রাখা নির্মাণ গুলোর জন্যেও নিষ্কাসন উপলুদ্ধ) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/bn_BD/full_description.txt",
    "content": "নিউপাইপ গুগলের বা ইউটিউবের কোনো ফ্রেমওয়ার্ক লাইব্রেরি ব্যাবহার করেনা। এটা শুধু ওয়েবসাইট গুলোকে পারস করে যে তথ্যগুলো দরকার সেগুলোর প্রয়োজনে। এজন্যেই এই অ্যাপটা গুগলের কোনো সেবা ইনস্টল করা ছাড়াই ব্যাবহার করা যায়। আর, নিউপাইপ ব্যাবহার করতে তোমার কোনো ইউটিউব একাউন্ট প্রয়োজন হবে না, আর এইটা ফেশোর মতো।\n"
  },
  {
    "path": "fastlane/metadata/android/bn_BD/short_description.txt",
    "content": "অ্যান্ড্রয়েড এর জন্যে একটা মুক্ত সরল ইউটিউব ফ্রন্টএন্ড।\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/1000.txt",
    "content": "Poboljšano\n• Opis liste za reprodukciju učinite klikom za prikaz više/manje sadržaja\n• [PeerTube] Automatski obrađuje linkove instanci `subscribeto.me`\n• Pokreni reprodukciju samo jedne stavke na ekranu historije\n\nIspravljeno\n• Ispravljena vidljivost RSS dugmeta\n• Ispravljeno rušenje pregleda trake za pretraživanje\n• Ispravljena stavka bez sličice prilikom dodavanja na listu za reprodukciju\n• Ispravljeno izlaženje iz dijaloga za preuzimanje prije nego što se pojavi\n• Ispravljen skočni prozor za dodavanje u red čekanja za povezane stavke\n• Ispravljen redoslijed u dijalogu za dodavanje na listu za reprodukciju\n• Prilagodite raspored stavki označenih na listi za reprodukciju\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/1001.txt",
    "content": "Poboljšano\n• Uvijek dozvoli promjenu postavki obavještenja igrača na Androidu 13+\n\nIspravljeno\n• Ispravljena greška izvoza baze podataka/pretplata koja nije skraćivala već postojeću datoteku, što je moglo dovesti do oštećenja izvoza\n• Ispravljeno ponovno pokretanje igrača od početka klikom na vremensku oznaku\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/1002.txt",
    "content": "Ispravljena greška zbog koje YouTube nije reproducirao nijedan tok.\n\nOvo izdanje rješava samo najhitniju grešku koja sprječava učitavanje detalja YouTube videa.\nSvjesni smo da postoje i drugi problemi i uskoro ćemo objaviti zasebno izdanje kako bismo ih riješili.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/1003.txt",
    "content": "Ovo je hitna ispravka koja ispravlja greške na YouTubeu:\n• [YouTube] Ispravljeno neučitavanje informacija o videozapisu, ispravljene greške HTTP 403 prilikom reprodukcije videozapisa i vraćanje reprodukcije nekih videozapisa s ograničenjem za uzrast\n• Ispravljena veličina titlova koja se nije mijenjala\n• Ispravljeno dvostruko preuzimanje informacija prilikom otvaranja toka\n• [Soundcloud] Uklonjeni nereproducirani tokovi zaštićeni DRM-om\n• Ažurirani prijevodi\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/1004.txt",
    "content": "Ovo izdanje ispravlja problem sa YouTube-om koji pruža samo 360p tok.\n\nImajte na umu da je rješenje korišteno u ovoj verziji vjerovatno privremeno i da dugoročno gledano treba implementirati SABR video protokol, ali članovi TeamNewPipe-a su trenutno zauzeti, tako da bi svaka pomoć bila veoma cijenjena! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/1005.txt",
    "content": "Novo\n• Dodata podrška za Android Auto\n• Omogućeno postavljanje grupa feedova kao kartica na glavnom ekranu\n• [YouTube] Dijeli kao privremenu listu za reprodukciju\n• [SoundCloud] Kartica kanala sa sviđanjima\n\nPoboljšano\n• Bolji savjeti u traci za pretragu\n• Prikaz datuma preuzimanja u Preuzimanjema\n• Korištenje jezika Androida 13 po aplikaciji\n\nIspravljeno\n• Ispravljene boje teksta koje ne rade u tamnom režimu\n• [YouTube] Ispravljeno liste za reprodukciju koje ne učitavaju više od 100 stavki\n• [YouTube] Ispravljeni nedostajući preporučeni videozapisi\n• Ispravljeni rušenja u prikazu liste historije\n• Ispravljene vremenske oznake u odgovorima na komentare\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/1007.txt",
    "content": "Ispravljeno je da YouTube ne reprodukuje nijedan tok\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/63.txt",
    "content": "### Poboljšanja\n- Postavke za uvoz/izvoz #1333 \n- Smanjite prekoravanje (poboljšanje performansi) #1371 \n- Mala poboljšanja koda #1375 \n- Dodaj sve o GDPR #1420\n\n### Popravljeno\n- Skidač: Popravljen pad tokom skidanja nedovršenih preuzimanja iz .giga datoteka # 1407\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/64.txt",
    "content": "### Poboljšanja\n- Dodata je mogućnost ograničavanja kvalitete videa ako se koriste mobilni podaci. #1339\n- Zapamti svjetlinu za sesiju #1442\n- Poboljšane performanse preuzimanja za slabije procesore #1431\n- dodana (funkcionalna) podrška za medijsku sesiju #1433\n\n### Ispravka\n- Ispravljen pad sistema prilikom otvaranja preuzimanja (ispravka je sada dostupna za izdane verzije) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/65.txt",
    "content": "### Poboljšanja\n\n- Onemogućavanje animacije ikone burgermenuja #1486\n- poništavanje brisanja preuzimanja #1472\n- Opcija preuzimanja u meniju za dijeljenje #1498\n- Dodata opcija dijeljenja u meni s dugim dodirom #1454\n- Minimiziranje glavnog playera pri izlasku #1354\n- Ispravka ažuriranja verzije biblioteke i sigurnosne kopije baze podataka #1510\n- Ažuriranje ExoPlayera 2.8.2 #1392\n- Prerađen dijalog za kontrolu brzine reprodukcije radi podrške za različite veličine koraka za bržu promjenu brzine.\n- Dodan je prekidač za premotavanje unaprijed tokom tišina u kontroli brzine reprodukcije. Ovo bi trebalo biti korisno za audio knjige i određene muzičke žanrove, a može donijeti zaista besprijekorno iskustvo (i može prekinuti pjesmu s puno tišina =\\\\).\n- Refaktorisana rezolucija izvora medija kako bi se omogućilo interno prosljeđivanje metapodataka uz medije u playeru, umjesto ručnog. Sada imamo jedan izvor metapodataka i direktno je dostupan kada reprodukcija počne.\n- Ispravljeni metapodaci udaljene liste za reprodukciju koji se ne ažuriraju kada su novi metapodaci dostupni kada se otvori fragment liste za reprodukciju.\n- Razne ispravke korisničkog interfejsa: #1383, kontrole obavještenja u pozadini playera sada su uvijek bijele, lakše je isključiti iskačući player prebacivanjem.\n- Koristi se novi ekstraktor s refaktoriranom arhitekturom za više servisa.\n\n### Ispravke\n\n- Ispravka #1440 Neispravan raspored informacija o videu #1491\n- Ispravka historije pregleda #1497\n- #1495, ažuriranjem metapodataka (sličica, naslov i broj videa) čim korisnik pristupi listi za reprodukciju.\n- #1475, registracijom pregleda u bazi podataka kada korisnik pokrene video na vanjskom playeru na fragmentu detalja.\n- Ispravljeno vremensko ograničenje ekrana u slučaju iskačućeg načina rada. #1463 (Ispravljeno #640)\n- Ispravka glavnog video playera #1509\n- [#1412] Ispravljen je način ponavljanja koji je uzrokovao NPE playera kada se primi nova namjera dok je aktivnost playera u pozadini.\n- Ispravljena je greška minimiziranja playera u iskačući prozor koja ne uništava player kada nije odobrena dozvola za iskačući prozor.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/66.txt",
    "content": "# Dnevnik promjena v0.13.7\n\n### Ispravljeno\n- Ispravljeni problemi sa filterom sortiranja iz v0.13.6\n\n# Dnevnik promjena v0.13.6\n\n### Poboljšanja\n\n- Onemogućena animacija ikone burger menija #1486\n- poništavanje brisanja preuzimanja #1472\n- Opcija preuzimanja u meniju za dijeljenje #1498\n- Dodata opcija dijeljenja u meni dugog dodira #1454\n- Minimiziranje glavnog playera pri izlasku #1354\n- Ispravka ažuriranja verzije biblioteke i sigurnosne kopije baze podataka #1510\n- Ažuriranje ExoPlayera 2.8.2 #1392\n- Prerađen dijalog za kontrolu brzine reprodukcije kako bi se podržale različite veličine koraka za bržu promjenu brzine.\n- Dodan je prekidač za premotavanje unaprijed tokom tišina u kontroli brzine reprodukcije. Ovo bi trebalo biti korisno za audio knjige i određene muzičke žanrove i može donijeti zaista besprijekorno iskustvo (i može prekinuti pjesmu s puno tišina =\\\\). \n- Refaktorisana rezolucija izvora medija kako bi se omogućilo interno prosljeđivanje metapodataka zajedno s medijima u playeru, umjesto ručnog. Sada imamo jedan izvor metapodataka i on je direktno dostupan kada počne reprodukcija.\n- Ispravljeni metapodaci udaljene liste za reprodukciju koji se nisu ažurirali kada su novi metapodaci dostupni prilikom otvaranja fragmenta liste za reprodukciju.\n- Razne ispravke korisničkog interfejsa: #1383, kontrole obavještenja u pozadini playera sada su uvijek bijele, lakše je isključiti iskačući player prebacivanjem.\n- Koristi se novi ekstraktor s refaktorisanom arhitekturom za više servisa.\n\n### Ispravke\n\n- Ispravka #1440 Neispravan raspored informacija o videu #1491\n- Ispravka historije pregleda #1497\n- #1495, ažuriranjem metapodataka (sličica, naslov i broj videa) čim korisnik pristupi listi za reprodukciju.\n- #1475, registracijom pregleda u bazi podataka kada korisnik pokrene video na vanjskom playeru na fragmentu detalja.\n- Ispravljeno vremensko ograničenje ekrana u slučaju iskačućeg načina rada. #1463 (Ispravljeno #640)\n- Ispravka glavnog video plejera #1509\n- [#1412] Ispravljen je način ponavljanja koji je uzrokovao NPE plejera kada se primi nova namjera dok je aktivnost plejera u pozadini.\n- Ispravljeno je minimiziranje plejera u skočni prozor koje nije uništilo plejer kada nije odobrena dozvola za skočni prozor.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/68.txt",
    "content": "# promjene v0.14.1\n\n### Ispravljeno\n- Ispravljeno neuspješno dešifriranje URL-a videa #1659\n- Ispravljeno nije dobro izdvajanje linka opisa #1657\n\n# promjene v0.14.0\n\n### Novo\n- Novi dizajn ladice #1461\n- Nova prilagodljiva početna stranica #1461\n\n### Poboljšanja\n- Prerađene kontrole gestikulacije #1604\n- Novi način zatvaranja iskačućeg playera #1597\n\n### Ispravljeno\n- Ispravljena greška kada broj pretplata nije dostupan. Zatvara se #1649.\n- Prikaži \"Broj pretplatnika nije dostupan\" u tim slučajevima\n- Ispravljen NPE kada je YouTube lista za reprodukciju prazna\n- Brzo rješenje za kioske u SoundCloudu\n- Refaktoriranje i ispravka greške #1623\n- Ispravljen ciklički rezultat pretrage #1562\n- Ispravljena traka za pretraživanje koja nije statički postavljena\n- Ispravljeno YT Premium videozapisi nisu ispravno blokirani\n- Ispravljeno videozapisi koji se ponekad ne učitavaju (zbog DASH parsiranja)\n- Ispravljeni linkovi u opisu videozapisa\n- Prikaži upozorenje kada neko pokuša preuzeti na eksternu sd karticu\n- ispravljen izuzetak koji se ne prikazuje, a pokreće izvještaj\n- sličica se ne prikazuje u pozadinskom playeru za Android 8.1 [pogledajte ovdje](https://github.com/TeamNewPipe/NewPipe/issues/943)\n- Ispravljeno registracija prijemnika emitiranja. Zatvoreno #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/69.txt",
    "content": "### Novo\n- Dugi dodir za brisanje i dijeljenje u pretplatama #1516\n- Korisnički interfejs tableta i raspored mreže #1617\n\n### Poboljšanja\n- pohranjivanje i ponovno učitavanje posljednjeg korištenog omjera širine i visine #1748\n- Omogućavanje linearnog rasporeda u aktivnosti preuzimanja s punim nazivima videozapisa #1771\n- Brisanje i dijeljenje pretplata direktno iz kartice pretplata #1516\n- Stavljanje u red čekanja sada pokreće reprodukciju videozapisa ako je red čekanja za reprodukciju već završen #1783\n- Odvojene postavke za geste jačine zvuka i svjetline #1644\n- Dodana podrška za lokalizaciju #1792\n\n### Ispravke\n- Ispravljeno raščlanjivanje vremena za . format, tako da se NewPipe može koristiti u Finskoj\n- Ispravljen broj pretplata\n- Dodana dozvola za uslugu u prvom planu za API 28+ uređaje #1830\n\n### Poznate greške\n- Stanje reprodukcije se ne može sačuvati na Android P\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/70.txt",
    "content": "PAŽNJA: Ova verzija je vjerovatno puna grešaka, baš kao i prethodna. Međutim, zbog potpunog gašenja od verzije 17, bolja je i pokvarena verzija nego nikakva. Zar ne? ¯\\_(ツ)_/¯\n\n### Poboljšanja\n* preuzete datoteke se sada mogu otvoriti jednim klikom #1879\n* ukidanje podrške za Android 4.1 - 4.3 #1884\n* uklanjanje starog plejera #1884\n* uklanjanje tokova iz trenutnog reda čekanja prevlačenjem prsta udesno #1915\n* uklanjanje automatski dodanog toka u red čekanja kada se novi tok ručno doda u red čekanja #1878\n* Naknadna obrada preuzimanja i implementacija nedostajućih funkcija #1759 od @kapodamy\n* Infrastruktura naknadne obrade\n* Ispravna \"infrastruktura\" za rukovanje greškama (za program za preuzimanje)\n* Stavljanje u red čekanja umjesto više preuzimanja\n* Premještanje serijaliziranih preuzimanja na čekanju (`.giga` datoteke) u podatke aplikacije\n* Implementacija maksimalnog broja ponovnih pokušaja preuzimanja\n* Ispravno pauziranje preuzimanja u više niti\n* Zaustavljanje preuzimanja prilikom prebacivanja na mobilnu mrežu (nikada ne radi, pogledajte 2. tačku)\n* Sačuvanje broja niti za sljedeća preuzimanja\n* Mnogo nedosljednosti ispravljeno\n\n### Ispravljeno\n* Ispravljen pad sistema sa zadanom rezolucijom postavljenom na najbolju i ograničenom rezolucijom mobilnih podataka #1835\n* Ispravljen pad sistema prilikom iskačućeg plejera #1874\n* NPE pri pokušaju otvaranja pozadinskog plejera #1901\n* Ispravljeno umetanje novih tokova kada je omogućeno automatsko stavljanje u red #1878\n* Ispravljen problem sa dešifriranjem i isključivanjem sistema\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/71.txt",
    "content": "### Poboljšanja\n* Dodana obavijest o ažuriranju aplikacije za GitHub verziju (#1608 od @krtkush)\n* Različita poboljšanja programa za preuzimanje (#1944 od @kapodamy):\n* dodane nedostajuće bijele ikone i korištenje ugrađenog načina za promjenu boja ikona\n* provjera da li je iterator inicijaliziran (ispravke #2031)\n* omogućava ponovni pokušaj preuzimanja s greškom \"naknadna obrada nije uspjela\" u novom multiplekseru\n* novi MPEG-4 multiplekser ispravlja nesinhrone video i audio tokove (#2039)\n\n### Ispravljeno\n* YouTube tokovi uživo prestaju s reprodukcijom nakon kratkog vremena (#1996 od @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/730.txt",
    "content": "# Ispravljeno\n- Ispravljena greška funkcije dešifriranja.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/740.txt",
    "content": "<h4>Poboljšanja</h4><ul><li> učinite linkove u komentarima klikabilnim, povećajte veličinu teksta</li><li> traži klikom na linkove vremenskih oznaka u komentarima</li><li> prikaži preferiranu karticu na osnovu nedavno odabranog stanja</li><li> dodaje listu pjesama u red čekanja kada se dugo klikne na &#39;Pozadina&#39; u prozoru liste pjesama</li><li> traži dijeljeni tekst kada nije URL</li><li> Dodajte dugme &quot;podijeli u trenutno vrijeme&quot; u glavni video plejer</li><li> dodajte dugme za zatvaranje u glavni plejer kada se završi red čekanja za video</li><li> Dodajte &quot;Reproduciraj direktno u pozadini&quot; u meni s dugim pritiskom za stavke liste videozapisa</li><li> poboljšati engleske prijevode za naredbe Play/Enqueue</li><li> mala poboljšanja performansi</li><li> uklonite nekorištene datoteke</li><li> Ažurirajte ExoPlayer na verziju 2.9.6</li><li> dodajte podršku za Invidious linkove</li></ul><h4> Fiksno</h4><ul><li> Ispravljeno skrolovanje sa onemogućenim komentarima i povezanim tokovima</li><li> ispravljena greška prilikom izvršavanja CheckForNewAppVersionTask-a kada ne bi trebalo</li><li> Ispravljen uvoz pretplata na YouTube: ignorišite one sa nevažećim URL-om i zadržite one sa praznim naslovom</li><li> Ispravljen nevažeći YouTube URL: naziv oznake potpisa nije uvijek &quot;potpis&quot;, što sprječava učitavanje tokova</li></ul>\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/750.txt",
    "content": "Novo\nNastavak reprodukcije #2288\n• Nastavite tokove tamo gdje ste prošli put stali\nPoboljšanja programa za preuzimanje #2149\n• Koristite okvir za pristup pohrani za pohranu preuzimanja na eksterne SD kartice\n• Novi mp4 muxer\n• Opcionalno promijenite direktorij za preuzimanje prije početka preuzimanja\n• Poštujte mjerene mreže\n\nPoboljšano\n• Uklonjeni gema stringovi #2295\n• Obrađuje promjene (automatske) rotacije tokom životnog ciklusa aktivnosti #2444\n• Učinite menije s dugim pritiskom konzistentnim #2368\n\nIspravljeno\n• Ispravljeno neprikazivanje naziva odabrane pjesme s titlovima #2394\n• Nije došlo do pada programa kada provjera ažuriranja aplikacije ne uspije (GitHub verzija) #2423\n• Ispravljena preuzimanja zaglavljena na 99,9% #2440\n• Ažuriranje metapodataka reda čekanja za reprodukciju #2453\n• [SoundCloud] Ispravljen pad programa prilikom učitavanja lista za reprodukciju TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Fiksno trajanje se ne može parsirati TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/760.txt",
    "content": "Promjene u verziji 0.17.1\n\nNovo\n• Tajlandska lokalizacija\n\nPoboljšano\n\n• Ponovo dodana akcija \"počni reprodukciju ovdje\" u menijima dugog pritiska za liste za reprodukciju #2518\n• Dodan prekidač za SAF / birač starih datoteka #2521\n\nIspravljeno\n• Ispravljeni dugmad koja nestaju u prikazu preuzimanja prilikom prebacivanja aplikacija #2487\n• Ispravljena je greška u poziciji reprodukcije koja se pohranjuje iako je historija gledanja onemogućena\n• Ispravljene smanjene performanse uzrokovane pozicijom reprodukcije u prikazima liste #2517\n• [Extractor] Ispravljena je ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor #186\n• [Extractor] [YouTube] Ispravljena je slučajna greška u pretrazi kada su liste za reprodukciju u rezultatima TeamNewPipe/NewPipeExtractor #185\n\nPromjene u verziji 0.17.0\n\nNovo\nNastavak reprodukcije #2288\n• Nastavite tokove tamo gdje ste zadnji put stali\nPoboljšanja programa za preuzimanje #2149\n• Koristite okvir za pristup pohrani za pohranjivanje preuzimanja na eksterne SD kartice\n• Novi mp4 muxer\n• Opcionalno promijenite direktorij za preuzimanje prije početka preuzimanja\n• Poštujte mjerene mreže\n\nPoboljšano\n• Uklonjeni gema stringovi #2295\n• Obrađuje promjene (automatske) rotacije tokom životnog ciklusa aktivnosti #2444\n• Učinite menije s dugim pritiskom konzistentnim #2368\n\nIspravljeno\n• Ispravljeno ime odabrane numere titlova koje se ne prikazuje #2394\n• Nije došlo do pada programa kada provjera ažuriranja aplikacije ne uspije (GitHub verzija) #2423\n• Ispravljena preuzimanja zaglavljena na 99,9% #2440\n• Ažuriranje metapodataka reda za reprodukciju #2453\n• [SoundCloud] Ispravljen pad programa prilikom učitavanja lista za reprodukciju TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Fiksno trajanje se ne može parsirati TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/770.txt",
    "content": "Promjene u verziji 0.17.2\n\nIspravka\n• Ispravka da nijedan video nije bio dostupan\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/780.txt",
    "content": "Promjene u verziji 0.17.3\n\nPoboljšano\n• Dodata opcija za brisanje stanja reprodukcije #2550\n• Prikaz skrivenih direktorija u biraču datoteka #2591\n• Podrška za otvaranje URL-ova iz instanci `invidio.us` pomoću NewPipe #2488\n• Dodata podrška za URL-ove `music.youtube.com` TeamNewPipe/NewPipeExtractor#194\n\nIspravljeno\n• [YouTube] Ispravljen 'java.lang.IllegalArgumentException #192\n• [YouTube] Ispravljen prenos uživo koji nije radio TeamNewPipe/NewPipeExtractor#195\n• Ispravljen problem s performansama u android pie-u prilikom preuzimanja prenosa #2592\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/790.txt",
    "content": "Poboljšano\n• Dodavanje više naslova radi poboljšanja pristupačnosti za slijepe osobe #2655\n• Učiniti jezik postavki mape za preuzimanje konzistentnijim i manje dvosmislenim #2637\n\nIspravljeno\n• Provjera da li je posljednji bajt u bloku preuzet #2646\n• Ispravljeno pomicanje u fragmentu detalja videa #2672\n• Uklanjanje dvostrukih animacija okvira za brisanje pretrage u jednu #2695\n• [SoundCloud] Ispravljanje ekstrakcije client_id-a #2745\n\nRazvoj\n• Dodavanje nedostajućih zavisnosti naslijeđenih iz NewPipeExtractor-a u NewPipe #2535\n• Migracija na AndroidX #2685\n• Ažuriranje na ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/800.txt",
    "content": "Novo\n• Podrška za PeerTube bez P2P-a (#2201) [Beta]:\n◦ Gledajte i preuzimajte videozapise s PeerTube instanci\n◦ Dodajte instance u postavkama za pristup cijelom PeerTube svijetu\n◦ Moguće je da postoje problemi s SSL handshake-ovima na Androidu 4.4 i 7.1 prilikom pristupa određenim instancama, što rezultira mrežnom greškom.\n\n• Downloader (#2679):\n◦ Izračunaj etalon preuzimanja (ETA)\n◦ Preuzmi opus (webm datoteke) kao ogg\n◦ Oporavi istekle linkove za preuzimanje kako bi se nastavilo preuzimanje nakon duge pauze\n\nPoboljšano\n• Učini KioskFragment svjesnim promjena u željenoj zemlji sadržaja i poboljšaj performanse svih glavnih kartica #2742\n• Koristi nove implementacije lokalizacije i downloadera iz ekstraktora #2713\n• Učini niz \"Default kiosk\" prevodivim\n• Crna navigacijska traka za crnu temu #2569\n\nIspravljeno\n• Ispravljena greška koja nije mogla pomicati popup player ako je drugi prst postavljen tokom pomicanja popup playera #2772\n• Omogući liste za reprodukciju kojima nedostaje uploader i ispravi padove povezane s ovim problemom #2724, TeamNewPipe/NewPipeExtractor#219\n• Omogući TLS1.1/1.2 na Android 4.4 uređajima (API 19/KitKat) za ispravljanje TLS rukovanja s MediaCCC i nekim PeerTube instance #2792\n• [SoundCloud] Ispravljena ekstrakcija client_id-a TeamNewPipe/NewPipeExtractor #217\n• [SoundCloud] Ispravljena ekstrakcija audio toka\n\nRazvoj\n• Ažuriranje ExoPlayera na 2.10.8 #2791, #2816\n• Ažuriranje Gradlea na 3.5.1 i dodavanje podrške za Kotlin #2714\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/810.txt",
    "content": "Novo\n• Prikaz minijature videa na zaključanom ekranu prilikom reprodukcije u pozadini\n\nPoboljšano\n\n• Dodavanje lokalne liste za reprodukciju u red čekanja prilikom dugog pritiska na dugme za pozadinu / skočni prozor\n• Omogućavanje pomicanja kartica glavne stranice i njihovo skrivanje kada postoji samo jedna kartica\n• Ograničavanje broja ažuriranja minijatura obavještenja u pozadinskom playeru\n• Dodavanje lažne minijature za prazne lokalne liste za reprodukciju\n• Korištenje ekstenzije datoteke *.opus umjesto *.webm i prikaz \"opus\" u oznaci formata umjesto \"WebM Opus\" u padajućem izborniku za preuzimanje\n• Dodavanje dugmeta za brisanje preuzetih datoteka ili historije preuzimanja u \"Preuzimanja\"\n• [YouTube] Dodana podrška za linkove kanala /c/shortened_url\n\nIspravljeno\n• Ispravljeno više problema prilikom dijeljenja videa na NewPipe i direktnog preuzimanja njegovih tokova\n• Ispravljen pristup playeru izvan teme njegovog kreiranja\n• Ispravljeno podjeljivanje rezultata pretrage\n• [YouTube] Ispravljeno prebacivanje na null što je uzrokovalo NPE\n• [YouTube] Ispravljeno pregledavanje komentara prilikom otvaranja invidio.us URL-a\n• [SoundCloud] Ažuriran client_id\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/820.txt",
    "content": "Ispravljen je regularni izraz naziva funkcije dešifriranja koji je YouTube činio neupotrebljivim.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/830.txt",
    "content": "Ažuriran je SoundCloud client_id kako bi se riješili problemi sa SoundCloudom.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/840.txt",
    "content": "Novo\n• Dodan je birač jezika za promjenu jezika aplikacije\n• Dodano je dugme \"pošalji na Kodi\" u sklopivi meni plejera\n• Dodana je mogućnost kopiranja komentara dugim pritiskom\n\nPoboljšano\n• Ispravljena je ReCaptcha aktivnost i ispravno spremanje dobijenih kolačića\n• Uklonjen je meni s tačkama u korist dugmeta \"ladica\" i \"sakrivanje historije\" kada historija gledanja nije omogućena u postavkama\n• Ispravno traženje dozvole za prikaz preko drugih aplikacija u postavkama na Androidu 6 i novijim verzijama\n• Preimenovanje lokalne liste za reprodukciju dugim klikom u BookmarkFragmentu\n• Različita poboljšanja PeerTubea\n• Poboljšano je nekoliko izvornih nizova na engleskom jeziku\n\nIspravljeno\n• Ispravljeno je ponovno pokretanje plejera iako je pauziran kada je omogućena opcija \"minimiziraj pri prebacivanju aplikacija\" i NewPipe je minimiziran\n• Ispravljena je početna vrijednost svjetline za gestu\n• Ispravljena su preuzimanja .srt titlova koja nisu sadržavala sve prijelome reda\n• Ispravljeno je neuspješno preuzimanje na SD karticu jer neki Android 5 uređaji nisu kompatibilni sa CTF-om\n• Ispravljeno je preuzimanje na Android KitKat-u\n• Ispravljena je oštećena video .mp4 datoteka koja se prepoznaje kao audio datoteka\n• Ispravljeni su višestruki problemi s lokalizacijom, uključujući pogrešne kineske jezičke kodove\n• [YouTube] Vremenske oznake u opisu su ponovo dostupne za klikanje\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/850.txt",
    "content": "U ovom izdanju ažurirana je verzija YouTube web stranice. Stara verzija web stranice bit će ukinuta u martu i stoga je potrebno nadograditi NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/860.txt",
    "content": "Poboljšano\n• Spremanje i vraćanje bez obzira da li su visina tona i tempo otkačeni ili ne\n• Podrška za izrezivanje ekrana u playeru\n• Kružni prikaz i broj pretplatnika\n• Optimizovan YouTube za korištenje manje podataka\n\nU ovom izdanju ispravljeno je više od 15 grešaka povezanih s YouTubeom.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/870.txt",
    "content": "Ovo je hitna ispravka koja ažurira NewPipe kako bi se ponovo omogućilo korištenje SoundClouda bez većih problema.\nSoundCloudov v2 API se sada koristi u ekstraktoru, a detekcija nevažećih ID-ova klijenata je poboljšana.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/900.txt",
    "content": "Novo\n• Grupe pretplata i sortirani feedovi\n• Dugme za isključivanje zvuka u playerima\n\nPoboljšano\n\n• Omogućeno otvaranje linkova music.youtube.com i media.ccc.de u NewPipe-u\n• Premještanje dvije postavke iz Izgled u Sadržaj\n• Sakrivanje opcija pretraživanja od 5, 15, 25 sekundi ako je omogućeno neprecizno pretraživanje\n\nIspravljeno\n• neki WebM videozapisi se ne mogu pretraživati\n• sigurnosna kopija baze podataka na Android P\n• rušenje prilikom dijeljenja preuzete datoteke\n• mnoštvo problema s ekstrakcijom YouTubea i još mnogo toga ...\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/910.txt",
    "content": "Ispravljena migracija baze podataka koja je u nekim rijetkim slučajevima sprečavala pokretanje NewPipe-a.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/920.txt",
    "content": "Poboljšano\n\n• Dodan datum otpremanja i broj pregleda za stavke mreže toka\n• Poboljšanja za raspored zaglavlja ladice\n\nIspravljeno\n\n• Ispravljeno dugme za isključivanje zvuka koje je uzrokovalo pad sistema na API 19\n• Ispravljeno preuzimanje dugih 1080p 60fps videa\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/930.txt",
    "content": "Novo\n• Pretraga na YouTube Musicu\n• Osnovna podrška za Android TV\n\nPoboljšano\n\n• Dodana je mogućnost uklanjanja svih gledanih videa s lokalne liste za reprodukciju\n• Prikaz poruke kada sadržaj još nije podržan umjesto rušenja\n• Poboljšana promjena veličine skočnog playera gestama štipanja\n• Stavljanje tokova u red čekanja dugim pritiskom na pozadinu i skočne dugmad u kanalu\n• Poboljšano rukovanje veličinom naslova zaglavlja ladice\n\nIspravljeno\n• Ispravljena postavka sadržaja s ograničenjem prema dobi koja nije radila\n• Ispravljene određene vrste reCAPTCHA-a\n• Ispravljen pad prilikom otvaranja oznaka dok je lista za reprodukciju `null`\n• Ispravljeno otkrivanje izuzetaka povezanih s mrežom\n• Ispravljena vidljivost dugmeta za sortiranje grupe u fragmentu pretplata\n\ni više\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/940.txt",
    "content": "Novo\n• Dodana podrška za komentare na SoundCloudu\n• Dodana postavka ograničenog načina rada na YouTubeu\n• Prikaz detalja nadređenog kanala na PeerTubeu\n\nPoboljšano\n• Prikaz dugmeta Kore samo za podržane usluge\n• Blokiranje gestova igrača koji počinju na navigacijskoj traci ili statusnoj traci\n• Promjena boje pozadine dugmadi za ponovni pokušaj i pretplatu na osnovu boje usluge\n\nIspravljeno\n• Ispravljeno zamrzavanje dijaloga za preuzimanje\n• Dugme \"Otvori u pregledniku\" sada se zaista otvara u pregledniku\n• Ispravljeno rušenje sistema pri otvaranju videa i \"Nije moguće reproducirati ovaj tok\"\n\ni još mnogo toga\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/950.txt",
    "content": "Ovo izdanje donosi tri male ispravke:\n• Ispravljen pristup pohrani na Androidu 10+\n• Ispravljeno otvaranje kioska\n• Ispravljeno parsiranje dužih videa\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/951.txt",
    "content": "Novo\n• Dodan je alat za odabir pretplata u dijalogu grupe feedova\n• Dodan je filter u dijalog grupe feedova kako bi se prikazale samo negrupirane pretplate\n• Dodana je kartica liste za reprodukciju na glavnu stranicu\n• Premotavanje naprijed/nazad u pozadini/u redu čekanja playera\n• Prikaz prijedloga za pretragu: da li ste mislili na & prikaz rezultata za\n\nPoboljšano\n• Izostavljanje metapodataka aplikacije za pisanje u multipliciranim datotekama\n• Ne uklanjanje neuspjelih tokova iz reda čekanja\n• Ažuriranje boje statusne trake da odgovara boji alatne trake\n\nIspravljeno\n• Ispravljena je desinkronizacija zvuka/videa uzrokovana kumulativnim greškama s pomičnim zarezom\n• [PeerTube] Obrada izbrisanih komentara\n\ni više\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/952.txt",
    "content": "Poboljšano\n• Automatska reprodukcija je dostupna za sve usluge (umjesto samo za YouTube)\n\nIspravljeno\n• Ispravljeni povezani tokovi podrškom za nove YouTube nastavke\n• Ispravljeni YouTube videozapisi s ograničenjem za određene uzraste\n• [Android TV] Ispravljeno dugotrajno preklapanje istaknutog fokusa\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/953.txt",
    "content": "Ispravljena ekstrakcija funkcije dešifriranja na YouTubeu.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/954.txt",
    "content": "• novi tijek rada aplikacije: reproducirajte videozapise na stranici s detaljima, prevucite prema dolje da biste minimizirali player\n\n• MediaStyle obavještenja: prilagodljive radnje u obavještenjima, poboljšanja performansi\n• osnovna promjena veličine pri korištenju NewPipe-a kao desktop aplikacije\n\n• prikaži dijalog s otvorenim opcijama u slučaju nepodržanog URL tosta\n• Poboljšano iskustvo prijedloga za pretraživanje kada se udaljeni URL-ovi ne mogu dohvatiti\n• Povećan zadani kvalitet videozapisa na 720p60 (player u aplikaciji) i 480p (skočni player)\n\n• mnoštvo ispravki grešaka i još mnogo toga\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/955.txt",
    "content": "[YouTube] Ispravljena pretraga za neke korisnike\n[YouTube] Ispravljeni izuzeci slučajnog dešifriranja\n[SoundCloud] URL-ovi koji završavaju kosom crtom sada se ispravno parsiraju\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/956.txt",
    "content": "[YouTube] Ispravljen pad aplikacije prilikom učitavanja bilo kojeg videa\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/957.txt",
    "content": "• Ujedinite specifične radnje stavljanja u red u jednu\n• Gesta dva prsta za zatvaranje playera\n• Omogućite brisanje reCAPTCHA kolačića\n• Opcija da se obavještenja ne oboje\n• Poboljšajte način otvaranja detalja videa kako biste riješili beskonačno baferovanje, greške prilikom dijeljenja na NewPipe i druge nedosljednosti\n• Ubrzajte YouTube videozapise i ispravite one s ograničenjem po uzrastu\n• Ispravite pad sistema prilikom premotavanja unaprijed/unazad\n• Nemojte preuređivati liste povlačenjem sličica\n• Uvijek pamtite svojstva skočnih prozora\n• Dodan je santalski jezik\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/958.txt",
    "content": "Novo i poboljšano:\n• Ponovno dodana opcija za skrivanje sličice na zaključanom ekranu\n• Povlačenje za osvježavanje feeda\n• Poboljšane performanse prilikom preuzimanja lokalnih lista\n\nIspravljeno:\n• Ispravljen pad sistema prilikom pokretanja NewPipe-a nakon što je uklonjen iz RAM-a\n• Ispravljen pad sistema prilikom pokretanja kada nema internet veze\n• Ispravljeno u vezi s postavkama gestova za svjetlinu i jačinu zvuka\n• [YouTube] Ispravljene duge liste reprodukcije\n\nOstalo:\n• Čišćenje koda i nekoliko internih poboljšanja\n• Ažuriranja zavisnosti\n• Ažuriranja prevoda\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/959.txt",
    "content": "Ispravljen beskonačan niz rušenja sistema nakon otvaranja izvještaja o greškama.\nAžurirana lista PeerTube instanci koje NewPipe može automatski otvoriti.\nAžurirani prijevodi.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/960.txt",
    "content": "• Poboljšan opis opcije izvoza baze podataka u postavkama.\n• Ispravljeno parsiranje komentara na YouTubeu.\n• Ispravljeno ime za prikaz servisa media.ccc.de. • Ažurirani prijevodi.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/961.txt",
    "content": "• [YouTube] Podrška za Mix\n• [YouTube] Prikaz informacija o javnim emiterima i Covid-19\n• [media.ccc.de] Dodani nedavni videozapisi\n• Dodan prijevod na somalski jezik\n\n• Mnoga interna poboljšanja\n\n• Ispravljeno dijeljenje videozapisa iz playera\n• Ispravljen prazan ReCaptcha web prikaz\n• Ispravljen pad aplikacije koji se javljao prilikom uklanjanja toka s liste\n• [PeerTube] Ispravljeni povezani tokovi\n• [YouTube] Ispravljena pretraga YouTube muzike\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/962.txt",
    "content": "Dodani \"nedavni\" videozapisi na servis media.ccc.de.\nDodani su prijenosi uživo na servis media.ccc.de, kao i podrška za prijenos uživo.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/963.txt",
    "content": "• [YouTube] Ispravljen nastavak kanala\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/964.txt",
    "content": "• Dodana podrška za poglavlja u kontrolama playera\n• [PeerTube] Dodana pretraga u sepia boji\n• Ponovo dodano dugme za dijeljenje u detaljnom prikazu videa i opis toka premješten u raspored kartica\n• Onemogućeno vraćanje svjetline ako je gesta za svjetlinu onemogućena\n• Dodana stavka liste za reprodukciju videa na Kodiju\n• Ispravljen pad sistema kada na nekim uređajima nije postavljen zadani preglednik i poboljšani su dijalozi za dijeljenje\n• Uključivanje/isključivanje reprodukcije/pauze pomoću hardverskog dugmeta za razmak u playeru preko cijelog ekrana\n• [media.ccc.de] Razne ispravke i poboljšanja\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/965.txt",
    "content": "Ispravljen pad sistema koji se javljao prilikom promjene redoslijeda grupa kanala.\nIspravljeno dobijanje više YouTube videa sa kanala i plejlista.\nIspravljeno dobijanje YouTube komentara.\nDodana je podrška za podputanje /watch/, /v/ i /w/ u YouTube URL-ovima.\nIspravljeno izdvajanje SoundCloud klijentskog ID-a i geo-ograničenog sadržaja.\nDodana je lokalizacija za sjeverni kurdski jezik.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/966.txt",
    "content": "Novo:\n• Dodana nova usluga: Bandcamp\n\nPoboljšano:\n• Dodana opcija da aplikacija prati temu uređaja\n• Spriječeni su neki rušenji prikazivanjem poboljšane ploče s greškama\n• Prikaz više informacija o tome zašto sadržaj nije dostupan\n• Dugme za razmak na hardveru pokreće reprodukciju/pauzu\n• Prikaz tosta \"Preuzimanje započeto\"\n\nIspravljeno:\n• Ispravljena je vrlo mala sličica u detaljima videa tokom reprodukcije u pozadini\n• Ispravljen je prazan naslov u minimiziranom playeru\n• Ispravljena je greška zbog koje se posljednji način promjene veličine nije ispravno vraćao\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/967.txt",
    "content": "Ispravljen je problem sa neispravnim radom YouTubea u EU. Uzrok tome je bio novi sistem za pristanak na kolačiće i privatnost koji zahtijeva da NewPipe postavi kolačić PRISTANAK.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/968.txt",
    "content": "Dodana je opcija za detalje kanala u meni s dugim pritiskom.\nDodana je funkcionalnost preimenovanja naziva liste za reprodukciju iz sučelja liste za reprodukciju.\nOmogućeno korisniku pauziranje dok se video učitava.\nDotjerana je bijela tema.\nIspravljeno preklapanje fontova pri korištenju veće veličine fonta.\nIspravljen je problem s nedostatkom videa na Formuler i Zephier uređajima.\nIspravljeni su razni padovi sistema.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/969.txt",
    "content": "• Dozvoljena instalacija na eksternu memoriju\n• [Bandcamp] Dodata podrška za prikaz prva tri komentara na toku\n• Prikaži samo obavijest 'preuzimanje je počelo' kada je preuzimanje pokrenuto\n• Ne postavljaj reCaptcha kolačić kada nema pohranjenih kolačića\n• [Player] Poboljšane performanse keša\n• [Player] Ispravljena greška u reprodukciji u plejeru\n• Odbaci prethodne Snackbarove prilikom brisanja preuzimanja\n• Ispravljen pokušaj brisanja objekta koji nije na listi\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/970.txt",
    "content": "Novo\n• Prikaz metapodataka sadržaja (oznake, kategorije, licenca, ...) ispod opisa\n• Dodana opcija \"Prikaži detalje kanala\" u udaljenim (nelokalnim) listama za reprodukciju\n• Dodana opcija \"Otvori u pregledniku\" u meni s dugim pritiskom\n\nIspravljeno\n• Ispravljen pad sistema prilikom rotacije na stranici s detaljima videa\n• Ispravljeno dugme \"Reproduciraj s Kodijem\" u playeru koje uvijek traži instalaciju Kore-a\n• Ispravljeno i poboljšano podešavanje putanja uvoza i izvoza\n• [YouTube] Ispravljen broj lajkova za komentare\nI još mnogo toga\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/971.txt",
    "content": "Hitna ispravka\n• Povećanje bafera za reprodukciju nakon ponovnog baferovanja\n• Ispravljen pad sistema na tabletima i televizorima prilikom klika na ikonu reda za reprodukciju u plejeru\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/972.txt",
    "content": "Novo\nPrepoznavanje vremenskih oznaka i hashtagova u opisu\nDodano ručno podešavanje tablet režima\nDodana mogućnost skrivanja reprodukovanih stavki u feedu\n\nPoboljšano\nIspravno podržavanje okvira za pristup pohrani\nBolje rukovanje greškama nedostupnih i prekinutih kanala\nAndroid tabela za dijeljenje za korisnike Androida 10+ sada prikazuje naslov sadržaja.\nAžurirane su Invidious instance i podrška za preusmjerene linkove.\n\nIspravljeno\n[YouTube] Sadržaj ograničen prema dobi\nSpriječen izuzetak curenja prozora prilikom otvaranja dijaloga za izbor\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/973.txt",
    "content": "Hitna ispravka\n• Ispravljene sličice i naslovi koji su se skraćivali u rasporedu mreže, zbog pogrešnog izračuna koliko videozapisa može stati u jedan red\n• Ispravljen dijalog za preuzimanje koji je nestajao bez ikakve radnje ako se otvori iz menija za dijeljenje\n• Ažurirana biblioteka povezana s otvaranjem vanjskih aktivnosti kao što je birač datoteka Storage Access Frameworka\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/974.txt",
    "content": "Hitna ispravka\n• Ispravljeni problemi s baferovanjem uzrokovani ograničavanjem YouTubea\n• Ispravljeno izdvajanje komentara na YouTubeu i rušenja aplikacije s onemogućenim komentarima\n• Ispravljena pretraga muzike na YouTubeu\n• Ispravljeni prenosi uživo na PeerTubeu\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/975.txt",
    "content": "Novo\n• Prikaz pregleda sličice tokom pretraživanja\n• Detekcija onemogućenih komentara\n• Omogućeno označavanje stavke feeda kao gledane\n• Prikaz srca u komentarima\n\nPoboljšano\n• Poboljšan raspored metapodataka i oznaka\n• Primjena boje usluge na UI komponente\n\nIspravljeno\n• Ispravljena sličica u mini playeru\n• Ispravljeno beskonačno baferovanje duplih stavki reda čekanja\n• Neke ispravke playera poput rotacije i bržeg zatvaranja\n• Ispravljena ReCAPTCHA koja ostaje učitana u pozadini\n• Onemogući klikove prilikom osvježavanja feeda\n• Ispravljeni neki padovi preuzimanja\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/976.txt",
    "content": "• Dodana je opcija za direktno otvaranje playera preko cijelog ekrana\n• Omogućen je odabir vrsta prijedloga za pretragu koji će se prikazivati\n• Tamna tema je sada tamnija + dodan je tamniji početni ekran\n• Poboljšan birač datoteka za sivo označavanje neželjenih datoteka\n• Ispravljen uvoz YouTube pretplata\n• Ponovna reprodukcija toka zahtijeva ponovni dodir dugmeta za reprodukciju\n• Ispravljeno zatvaranje audio sesije\n• [Android TV] Ispravljeni su dugi skokovi na traci za pretraživanje prilikom korištenja DPad-a\n\nDa biste vidjeli daljnje promjene, pogledajte dnevnik promjena (i objavu na blogu) na kartici Linkovi ispod.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/977.txt",
    "content": "• Dodano dugme \"reproduciraj sljedeće\" u meni dugog pritiska\n• Dodan prefiks putanje YouTube kratkih videozapisa u filter namjere\n• Ispravljen uvoz postavki\n• Zamjena pozicije trake za pretraživanje s dugmadima playera na ekranu reda čekanja\n• Razne ispravke vezane za MediasessionManager\n• Ispravljena traka za pretraživanje koja se nije dovršila nakon završetka videa\n• Onemogućeno tuneliranje medija na RealtekATV-u\n• Prošireno područje za klik na minimizirana dugmad playera\n\nDa biste vidjeli daljnje promjene, pogledajte dnevnik promjena (i objavu na blogu) na kartici Linkovi ispod.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/978.txt",
    "content": "Ispravljeno izvršavanje provjere za novu verziju NewPipe-a. Ova provjera se ponekad izvršavala prerano i stoga je dovodila do pada aplikacije. To bi sada trebalo biti ispravljeno.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/979.txt",
    "content": "- Ispravljeno nastavljanje reprodukcije\n- Poboljšanja kako bi se osiguralo da servis koji određuje da li NewPipe treba provjeravati nove verzije nije pokrenut u pozadini\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/980.txt",
    "content": "Novo\n• Dodana je opcija \"Dodaj na listu za reprodukciju\" u meni za dijeljenje\n• Dodana je podrška za kratke linkove na y2u.be i PeerTube\n\nPoboljšano\n• Kontrole brzine reprodukcije su kompaktnije\n• Feed sada ističe nove stavke\n• Opcija \"Prikaži gledane stavke\" u feedu je sada sačuvana\n\nIspravljeno\n• Ispravljeno izdvajanje lajkova i nesviđanja na YouTubeu\n• Ispravljena je automatska reprodukcija nakon povratka iz pozadine\nI još mnogo toga\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/981.txt",
    "content": "Uklonjena je podrška za MediaParser kako bi se riješio problem neuspjelog nastavka reprodukcije nakon baferovanja na Androidu 11+.\nOnemogućeno je tuneliranje medija na Philips QM16XE uređaju kako bi se riješili problemi s reprodukcijom.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/982.txt",
    "content": "Ispravljena greška zbog koje YouTube nije reprodukovao nijedan tok.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/983.txt",
    "content": "Dodati novi korisnički interfejs i ponašanje za pretraživanje dvostrukim dodirom\nOmogućiti pretraživanje postavki\nIstaknuti zakačene komentare kao takve\nDodati podršku za otvaranje s aplikacijom za FSFE-ovu PeerTube instancu\nDodati obavještenja o greškama\nIspraviti ponavljanje prve stavke reda čekanja pri promjeni igrača\nDuže čekati prilikom učitavanja u međuspremniku tokom prijenosa uživo prije nego što dođe do greške\nIspraviti redoslijed lokalnih rezultata pretrage\nIspraviti prazna polja stavki u redu čekanja za reprodukciju\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/984.txt",
    "content": "Učitajte dovoljno početnih stavki u listama da popune cijeli ekran i da se riješi problem skrolovanja na tabletima i televizorima\nIspravite nasumična rušenja prilikom skrolovanja kroz liste\nNeka se luk preklapanja brzog pretraživanja plejera nalazi ispod sistemskog korisničkog interfejsa\nVratite promjene izreza prilikom reprodukcije u više prozora, što je uzrokovalo regresiju pogrešno postavljenog plejera na nekim telefonima\nPovećajte compileSdk sa 30 na 31\nAžurirajte biblioteku za prijavljivanje grešaka\nRefaktorišite dio koda u plejeru\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/985.txt",
    "content": "Ispravljeno je da YouTube ne reprodukuje nijedan tok\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/986.txt",
    "content": "Novo\n• Obavještenja za nove tokove\n• Besprijekoran prijelaz između pozadinskog i video playera\n• Promjena visine tona za polutone\n• Dodavanje reda čekanja glavnog playera na listu za reprodukciju\n\nPoboljšano\n\n• Zapamti brzinu/veličinu koraka visine tona\n• Ublaži početno dugo baferovanje u video playeru\n• Poboljšan korisnički interfejs playera za Android TV\n• Potvrdi prije brisanja svih preuzetih datoteka\n\nIspravljeno\n• Ispravljeno dugme za medije koje nije skrivalo kontrole playera\n• Ispravljeno resetovanje reprodukcije pri promjeni tipa playera\n• Ispravljeno rotiranje dijaloga liste za reprodukciju\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/987.txt",
    "content": "Novo\n• Podrška za metode isporuke osim progresivnog HTTP-a: brže vrijeme učitavanja reprodukcije, ispravke za PeerTube i SoundCloud, reprodukcija nedavno završenih YouTube prijenosa uživo\n• Dodano dugme za dodavanje udaljene liste za reprodukciju na lokalnu\n• Pregled slike u Android 10+ listu za dijeljenje\n\nPoboljšano\n• Poboljšan dijalog parametara reprodukcije\n• Dugmad za uvoz/izvoz pretplate premještena u meni s tri tačke\n\nIspravljeno\n• Ispravljeno uklanjanje potpuno pregledanih videozapisa s liste za reprodukciju\n• Ispravljena tema menija za dijeljenje i unos \"dodaj na listu za reprodukciju\"\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/988.txt",
    "content": "[YouTube] Ispravljena greška \"Nije moguće dobiti tok\" prilikom pokušaja reprodukcije bilo kojeg videa\n[YouTube] Ispravljena poruka \"Sljedeći sadržaj nije dostupan u ovoj aplikaciji\" koja se prikazuje umjesto traženog videa\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/989.txt",
    "content": "• [YouTube] Ispravljeno beskonačno učitavanje pri pokušaju reprodukcije bilo kojeg videa\n• [YouTube] Ispravljeno ograničavanje reprodukcije nekih videa\n• Nadogradite biblioteku jsoup na verziju 1.15.3, što uključuje sigurnosnu ispravku\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/990.txt",
    "content": "Ovo izdanje ukida podršku za Android 4.4 KitKat, sada je minimalna verzija Android 5 Lollipop!\n\nNovo\n• Preuzimanje iz menija s dugim pritiskom\n• Skrivanje budućih videa u feedu\n• Dijeljenje lokalnih lista za reprodukciju\n\nPoboljšano\n• Refaktorisanje koda playera u male komponente: manje RAM-a se koristi, manje grešaka\n• Poboljšan način skaliranja sličica\n• Vektorska konverzija rezerviranih mjesta za slike\n\nIspravljeno\n• Ispravljeni razni problemi s obavještenjima playera: zastarjele/nedostajuće informacije o medijima, iskrivljena sličica\n• Ispravljen prikaz preko cijelog ekrana koristeći 1/4 ekrana\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/991.txt",
    "content": "Novo\n• Dodano dugme \"Otvori u pregledniku\" u panelu s greškama\n• Dodana opcija za prikaz grupa kanala kao liste\n• [YouTube] Dugi klik na segmente toka za dijeljenje URL-a vremenske oznake\n• Dodano dugme za red čekanja za reprodukciju u mini player\n\nPoboljšano\n\n• Dodana lokalizacija za islandski jezik i ažurirani mnogi drugi prijevodi\n• Mnoga interna poboljšanja\n\nIspravljeno\n• Ispravljeno višestruko rušenje sistema\n• [YouTube] Ispravljeno učitavanje kanala, nenamjenski feed i zaobilazno rješenje problema s reprodukcijom u nekim zemljama\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/992.txt",
    "content": "Novo\n• Broj pretplatnika u detaljima videa\n• Preuzimanje iz reda čekanja\n• Trajno postavljanje sličice liste za reprodukciju\n• Dugi pritisak na hashtagove i linkove\n• Način prikaza kartice\n\nPoboljšano\n• Veće dugme za zatvaranje mini-playera\n• Glatko smanjenje sličica\n• Ciljano za Android 13 (API 33)\n• Traženje više ne pauzira player\n\nIspravljeno\n• Ispravljen prekrivač na DeX-u/mišu\n• Omogućen pozadinski player bez odvojenih audio tokova\n• Razne ispravke za YouTube i još mnogo toga…\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/993.txt",
    "content": "Novo\n• Dodano upozorenje prilikom dodavanja duplikata liste za reprodukciju i dodavanje dugmeta za njihovo uklanjanje\n• Omogućeno ignorisanje hardverskih dugmadi\n• Omogućeno skrivanje djelomično pregledanih videa u feedu\n\nPoboljšano\n• Koristiti više kolona mreže na velikim ekranima\n• Usaglasiti indikatore napretka s postavkama\n\nIspravljeno\n• Ispravljeno otvaranje URL-ova preglednika, preuzimanja i vanjskih playera na Androidu 11+\n• Ispravljena interakcija s cijelim ekranom koja zahtijeva dva dodira na MIUI-ju\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/994.txt",
    "content": "Novo\n• Podrška za više audio zapisa/jezika\n• Omogućeno podešavanje jačine zvuka i svjetline gestama sa bilo koje strane ekrana\n• Podrška za prikaz glavnih kartica na dnu ekrana\n\nPoboljšano\n• [Bandcamp] Rukovanje zapisima iza paywalla\n\nIspravljeno\n• [YouTube] 403 HTTP greške za tokove\n• Crni plejer pri prelasku na glavni plejer sa prikaza liste za reprodukciju\n• Curenje memorije servisa plejera\n• [PeerTube] Avatari za uploader i podkanal su zamijenjeni\n\ni više\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/995.txt",
    "content": "Novo\n• Podrška za kartice kanala\n• Odabir kvalitete slike\n• Dobijanje URL-ova za sve slike\n\nPoboljšano\n• Pristupačnost interfejsa playera\n• Bolji odabir zvuka za preuzimanja samo videozapisa\n• Opcija za uključivanje naziva popisa za reprodukciju i videozapisa u dijeljeni sadržaj popisa za reprodukciju\n\nIspravljeno\n• [YouTube] Ispravljeno dobijanje broja lajkova\n• Ispravljeni skočni prozori i padovi sustava koji ne reagiraju na player\n• Odabir pogrešnih jezika u biraču jezika\n• Fokus zvuka playera nije poštovao zvuk\n• Dodavanje stavki popisa za reprodukciju povremeno nije radilo\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/996.txt",
    "content": "Ispravljen je NullPointerException prilikom otvaranja kanala/konferencije u media.ccc.de.\nGrinch je pokušao da vam pokvari naš božićni poklon, ali smo ga ispravili.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/997.txt",
    "content": "Novo\n• Dodajte odgovore na komentare\n• Omogućite promjenu redoslijeda lista za reprodukciju\n• Prikažite opis i trajanje liste za reprodukciju\n• Omogućite resetiranje postavki\n\nPoboljšano\n• [Android 13+] Vratite prilagođene radnje obavještenja\n• Zatražite saglasnost za provjeru ažuriranja\n• Omogućite reprodukciju/pauziranje obavještenja tokom učitavanja u međuspremnik\n• Promijenite redoslijed nekih postavki\n\nIspravljeno\n• [YouTube] Ispravljen komentari koji se ne učitavaju, plus druge ispravke i poboljšanja\n• Rješite ranjivost u uvozu postavki i prebacite se na JSON\n• Razne ispravke preuzimanja\n• Skratite tekst pretrage\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/998.txt",
    "content": "Ispravljena greška zbog koje YouTube nije reproducirao nijedan tok zbog HTTP 403 greške.\n\nPovremene HTTP 403 greške usred YouTube videa još nisu ispravljene.\nTaj problem će biti riješen u drugom izdanju hitne ispravke što je prije moguće.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/changelogs/999.txt",
    "content": "Ovo izdanje hitne ispravke ispravlja HTTP 403 greške usred YouTube videa.\n\nNovo\n• [SoundCloud] Dodata podrška za on.soundcloud.com URL-ove\n\nPoboljšano\n• [Bandcamp] Prikaz dodatnih informacija u radio kiosku\n\nIspravljeno\n• [YouTube] Ispravljene povremene HTTP 403 greške na početku ili usred videa\n• [YouTube] Izdvajanje avatara i banera iz više tipova zaglavlja kanala\n• [Bandcamp] Ispravljene razne greške i uvijek korištenje HTTPS-a\n"
  },
  {
    "path": "fastlane/metadata/android/bs/full_description.txt",
    "content": "NewPipe ne koristi nikakve Google framework biblioteke, ili YouTube API. Parsi samo web stranicu da bi stekla informaciju koja joj treba. S time se ova aplikacija može koristiti na uređajima bez instalisanih Google Servisa. Također vam ni ne treba YouTube račun da koristite NewPipe, a i FLOSS je.\n"
  },
  {
    "path": "fastlane/metadata/android/bs/short_description.txt",
    "content": "Jednostavna i besplatna zamjena za YouTube na Android-u.\n"
  },
  {
    "path": "fastlane/metadata/android/ca/full_description.txt",
    "content": "El NewPipe no fa servir cap tipus de llibreria de Google o la API de YouTube. El que fa és analitzar el lloc web amb tal d'obtenir l'informació necessària. D'aquesta manera l'aplicació pot utilitzar-se sense tenir els Serveis de Google instal·lats. Tampoc cal un compte de YouTube per fer servir NewPipe. NewPipe és programari lliure, gratuït i de codi obert.\n"
  },
  {
    "path": "fastlane/metadata/android/ca/short_description.txt",
    "content": "Un reproductor de YouTube lliure i lleuger per a Android.\n"
  },
  {
    "path": "fastlane/metadata/android/ckb/changelogs/960.txt",
    "content": "• وەسفی باشترکراو بۆ هەڵبژاردەی بنکەی زانیاری هەناردەکردن لە ڕێکخستنەکان.\n• شیکردنەوەی سەرنجەکانی یووتیووب چاککراو.\n• ناوی پیشاندانی چاککراو media.ccc.de خزمەتگوزاری.\n• وەرگێڕانە نوێیەکان.\n"
  },
  {
    "path": "fastlane/metadata/android/ckb/short_description.txt",
    "content": "بەرنامەیەکی سوکەڵەی یوتوب دیزاینکراو بۆ ئەندرۆیدەکەت.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/1000.txt",
    "content": "Vylepšeno\n• Popis playlistu je klikatelný pro více/méně obsahu\n• [PeerTube] Auto. zpracování odkazů instance subscribeto.me\n• Spustit přehrávání pouze jedné položky v historii\n\nOpraveno\n• Oprava viditelnosti tl. RSS\n• Oprava pádů náhledů na liště videa\n• Oprava přidání položky bez miniatury do playlistu\n• Oprava ukončení okna stahování před jeho zobrazením\n• Oprava okna seznamu souvisejících položek\n• Oprava pořadí v okně přidání do playlistu\n• Úprava rozložení položek záložek playlistu\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/1001.txt",
    "content": "Vylepšení\n• Vždy umožněno změnit nastavení oznámení přehrávače na Android 13+\n\nOpraveno\n• Oprava chyby, při které export databáze/odběrů nezkracoval již existující soubor, což mohlo vést k poškozenému exportu\n• Opraveno pokračování přehrávače v přehrávání videa po klepnutí na časovou značku\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/1002.txt",
    "content": "Opraveno nepřehrávání jakéhokoli streamu ve službě YouTube.\n\nTato verze řeší pouze nejpalčivější chybu, která brání načtení detailů videa na YouTube.\nJsme si vědomi, že existují i další problémy, a brzy připravíme samostatné vydání, které je vyřeší.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/1003.txt",
    "content": "Opravná verze, která opravuje chyby YouTube:\n- [YouTube] Oprava nenačítání informací o videu, oprava chyb HTTP 403 při přehrávání videí a obnovení přehrávání některých videí s věkovým omezením.\n- Oprava nezměněných velikostí titulků\n- Oprava dvojího stahování informací při otevření streamu\n- [Soundcloud] Odstranění nepřehratelných streamů chráněných DRM\n- Aktualizovány překlady\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/1004.txt",
    "content": "Tato verze opravuje problém, kdy YouTube poskytoval stream pouze v rozlišení 360p.\n\nUpozorňujeme, že použité řešení je pravděpodobně dočasné a z dlouhodobého hlediska bude potřeba implementovat video protokol SABR, ale členové týmu TeamNewPipe jsou momentálně zaneprázdnění, takže jakákoli pomoc bude velmi vítána! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/1005.txt",
    "content": "Nově\n• Podpora pro Android Auto\n• Možnost nastavit skupiny zdrojů jako záložky\n• [YouTube] Sdílení jako dočasný playlist\n• [SoundCloud] Záložka Oblíbené u kanálů\n\nVylepšeno\n• Lepší našeptávač vyhledávače\n• Zobrazení data stažení ve Stažených\n• Použití individuálního jazyka\n\nOpraveno\n• Oprava chybných barev textu v tmavém režimu\n• [YouTube] Oprava nenačtení více než 100 položek v playlistech\n• [YouTube] Oprava chybějících doporučených videí\n• Oprava pádů v Historii\n• Oprava časů v odpovědích\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/1006.txt",
    "content": "# Vylepšení\nPonechání aktuálního přehrávače při klepnutí na časová razítka\nPokus o obnovení čekajících stahování, pokud to jde\nMožnost odstranění stahování bez smazání souboru\nOprávnění Zobrazení přes ostatní aplikace: zobrazení vysvětlení pro Android > R\nPodpora odkazů on.soundcloud\n\n# Opravy\nOprava formátování pro verze Androidu nižší než 7\nOprava falešných oznámení\nOpravy souborů titulků SRT\nOprava spousty pádů\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/1007.txt",
    "content": "Oprava chyby „Obsah není k dispozici“: videa z YouTube lze nyní opět přehrávat!\n\nDalší opravy chyb z verze 0.28.1:\n• Přetahování položek playlistu pouze na sousední pozice\n• Blikání názvu/komentářů mezi aktuálním a předchozím videem\n• Nefunkční možnost „Spustit hlavní přehrávač na celou obrazovku“\n\nDalší vylepšení:\n• [YouTube] Opětovné povolení přetáčení živých přenosů až o 4 hodiny zpět\n• Nepřetáčení živého videa při přehrávání na pozadí\n• Nové uživatelské rozhraní pro „Odebrat zhlédnuté“\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/1008.txt",
    "content": "∙ Opraveno obnovení streamů na poslední pozici přehrávání\n∙ [YouTube] Přidána podpora pro více formátů URL kanálů\n∙ [YouTube] Přidána podpora pro více formátů metainformací videí\n∙ Aktualizovány překlady\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/1009.txt",
    "content": "Důležité\nPřidány informace a výzva k akci v rámci kampaně Keep Android Open: https://www.keepandroidopen.org/\n\nVylepšeno\n[Feed] Změna pořadí aktualizace starších odběrů\nZrušeno kupení stránek s komentáři\nNepředávání události kliknutí podkladovým zobrazením při kliknutí na stránku s podrobnostmi o videu\n\nOpraveno\nRozložení záhlaví odpovědí na komentáře bez avataru\nNěkolik oprav rozhraní souvisejících s přehrávačem\n[SoundCloud] Oprava streamů s dlouhými ID\n\na další opravy a vylepšení!\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/63.txt",
    "content": "### Improvements\n- Import/export settings #1333 \n- Reduce overdraw (performance improvement) #1371 \n- Small code improvements #1375 \n- Add everything about GDPR #1420\n\n### Fixed\n- Downloader: Fix crash on loading unfinished downloads from .giga files #1107\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/64.txt",
    "content": "### Vylepšení\n- Přidáni možnosti omezení kvality videa při použití mobilních dat. #1339\n- Zapamatování jasu pro relaci. #1442\n- Zlepšený výkon pro stahování se slabším CPU #1431\n- Přidána (fungující) podpora pro mediální relace #1433\n\n### Oprava\n- Opraveno selhání aplikace při otevření stáhnutých souborů (oprava je nyní k dispozici pro vydané sestavy. #1441\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/65.txt",
    "content": "### Improvements\n\n- Disable burgermenu icon animation #1486 \n- undo delete of downloads #1472 \n- Download option in share menu #1498\n- Added share option to long tap menu #1454 \n- Minimize main player on exit #1354 \n- Library version update and database backup fix #1510 \n- ExoPlayer 2.8.2 Update #1392\n  - Reworked the playback speed control dialog to support different step sizes for faster speed change.\n  - \n  - \n  - \n  - \n- \n-\n-\n-\n- \n- \n  -\n  -\n- \n- \n  -\n  -.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/66.txt",
    "content": "# v0.13.17 - seznam změn\n\n### Opraveno\n- Řazení filtrů\n\n# v0.13.6 - seznam změn\n\n### Vylepšeno\n\n- Zakázání animace tlačítka menu\n- Zrušení odstranění stahování\n- Možnost stažení v menu sdílení\n- Sdílení v menu při dlouhém podržení\n- Minimalizace hlavního přehrávače při opuštění\n-Aktualizace ExoPlayer 2.8.2\n  - Přepracován dialog ovládání rychlosti přehrávání\n  - Přidán přepínač pro rychlé přetočení v tichých částech\nDalší změny/opravy viz GitHub.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/68.txt",
    "content": "# changes of v0.14.1\n\n### Fixed\n- Fixed failed to decrypt video url #1659 \n- Fixed description link not extract well #1657\n\n# changes of v0.14.0\n\n### New\n- New Drawer design #1461\n- New customizable front page #1461\n\n### Improvements\n- Reworked Gesture controls #1604 \n- New way to close the popup player #1597\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/69.txt",
    "content": "### New\n- Odstranění a sdílení v odběrech dlouhým klepnutím #1516 \n- Uživatelské rozhraní tabletu a rozvržení seznamu mřížky #1617 \n\n### Vylepšení\n- ukládání a opětovné načítání naposledy použitého poměru stran #1748 \n- Povolení lineárního rozložení v aktivitě Stahování s úplnými názvy videí #1771 \n- Odstraňování a sdílení odběrů přímo z karty odběrů #1516 \n- Enqueuing nyní spustí přehrávání videa, pokud fronta přehrávání již skončila #1783\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/70.txt",
    "content": "UPOZORNĚNÍ: Tato verze je pravděpodobně plná chyb, stejně jako ta předchozí. Nicméně vzhledem k úplnému vypnutí od 17. je lepší rozbitá verze než žádná. Nebo ne? ¯\\_(ツ)_/¯\n\n### Vylepšení\n* stažené soubory lze nyní otevřít jedním kliknutím #1879 \n* podpora upuštění pro Android 4.1 - 4.3 #1884 \n* odstranění starého přehrávače #1884 \n* odstranění streamů z aktuální fronty přehrávání přejetím doprava #1915\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/71.txt",
    "content": "### Vylepšení\n* Přidání oznámení o aktualizaci aplikace pro sestavení na GitHubu (#1608 by @krtkush)\n* Různá vylepšení downloaderu (#1944 by @kapodamy):\n  * přidat chybějící bílé ikony a použít hardcorový způsob změny barev ikon\n  * kontrola, zda je iterátor inicializován (oprava #2031)\n  * umožnit opakování stahování při chybě \"post-processing failed\" v novém muxeru\n  * nový muxer MPEG-4 opravuje nesynchronní video a audio toky (#2039)\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/730.txt",
    "content": "# Fixed\n- Znovu opravte chybu funkce dešifrování.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/740.txt",
    "content": "<h4>Improvements</h4>\n<ul>\n<li>make links in comments clickable, increase text size</li>\n<li>seek on clicking timestamp links in comments</li>\n<li>show preferred tab based on recently selected state</li>\n<li>add playlist to queue when long clicking on &#39;Background&#39; in playlist window</li>\n<li>search for shared text when it is not an URL</li>\n<li>add &quot;share at current time&quot; button to the main video player</li>\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/750.txt",
    "content": "New\nPlayback resume #2288\n• Resume streams where you stopped last time\nDownloader Enhancements #2149 \n• Use Storage Access Framework to store downloads on external SD-cards\n• New mp4 muxer\n• Optionally change the download directory before starting a download\n• Respect metered networks \n\n\nImproved\n• Removed gema strings #2295\n• Handle (auto)rotation changes during activity lifecycle #2444\n• Make long-press menus consistent #2368\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/760.txt",
    "content": "Změny ve verzi 0.17.1\n\nNové stránky\n- Thajská lokalizace\n\n\nVylepšené stránky\n- Znovu přidána akce \"začít přehrávat zde\" v nabídkách pro dlouhé stisknutí pro seznamy skladeb #2518\n- Přidání přepínače pro výběr souborů SAF / legacy #2521\n\nOpraveno\n- Oprava mizení tlačítek v zobrazení stahování při přepínání aplikací #2487\n- Oprava pozice přehrávání se ukládá, i když je vypnutá historie sledování\n- Oprava sníženého výkonu způsobeného pozicí přehrávání v zobrazeních seznamu #2517\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/770.txt",
    "content": "Změny ve verzi 0.17.2\n\nOprava\n- Oprava nebylo k dispozici žádné video\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/780.txt",
    "content": "Změny ve verzi 0.17.3\n\nVylepšené stránky\n- Přidána možnost vymazat stavy přehrávání #2550\n- Zobrazení skrytých adresářů ve výběru souborů #2591\n- Podpora otevírání adres URL z instancí `invidio.us` pomocí NewPipe #2488 \n- Přidána podpora pro adresy URL `music.youtube.com` TeamNewPipe/NewPipeExtractor#194\n\nOpraveno\n- YouTube] Opraveno 'java.lang.IllegalArgumentException #192\n- YouTube] Opraveno nefunkční živé vysílání TeamNewPipe/NewPipeExtractor#195\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/790.txt",
    "content": "Vylepšené stránky\n- Přidání více nadpisů pro zlepšení přístupnosti pro nevidomé #2655\n- Udělejte jazyk nastavení složky pro stahování konzistentnější a méně nejednoznačný #2637\n\nOpraveno\n- Kontrola, zda je stažen poslední bajt v bloku #2646\n- Opraveno posouvání ve fragmentu detailu videa #2672\n- Odstranění dvojité animace vymazání vyhledávacího pole na jednu #2695\n- [SoundCloud] Oprava extrakce client_id #2745\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/800.txt",
    "content": "Nový\n- Podpora PeerTube bez P2P (#2201) [Beta]:\n  ◦ Sledování a stahování videí z instancí PeerTube\n  ◦ Přidání instancí v nastavení pro přístup ke kompletnímu světu PeerTube\n  ◦ V systémech Android 4.4 a 7.1 mohou být při přístupu k některým instancím problémy s přenosem SSL, což může vést k chybě sítě.\n\n- Downloader (#2679):\n  ◦ Vypočítat předpokládaný čas stahování\n  ◦ Stáhnout opus (soubory webm) jako ogg\n  ◦ Obnovení vypršených odkazů ke stažení pro obnovení stahování po dlouhé pauze\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/810.txt",
    "content": "Nový\n- Zobrazení miniatury videa na zamykací obrazovce při přehrávání na pozadí\n\nVylepšená stránka\n- Přidání místního seznamu skladeb do fronty při dlouhém stisknutí tlačítka na pozadí / vyskakovacího tlačítka\n- Umožnit posouvání karet hlavní stránky a jejich skrytí, pokud je k dispozici pouze jedna karta\n- Omezit počet aktualizací miniatur oznámení v přehrávači na pozadí\n- Přidání fiktivní miniatury pro prázdné místní seznamy skladeb\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/820.txt",
    "content": "Opraven regex názvu dešifrovací funkce, který znemožňuje použití služby YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/830.txt",
    "content": "Aktualizováno klient_id služby SoundCloud pro opravu problémů se službou SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/840.txt",
    "content": "Nový\n- Přidán volič jazyka pro změnu jazyka aplikace\n- Přidáno tlačítko odeslat do Kodi do skládací nabídky přehrávače\n- Přidána možnost kopírování komentářů při dlouhém stisknutí\n\nVylepšena stránka\n- Oprava aktivity ReCaptcha a správné ukládání získaných souborů cookie\n- Odstraněna nabídka s tečkami ve prospěch šuplíku a skrytí tlačítka historie, pokud není v nastavení povolena historie sledování\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/850.txt",
    "content": "V tomto vydání byla aktualizována verze webových stránek YouTube. Stará verze webových stránek bude v březnu ukončena, a proto je nutné provést aktualizaci NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/860.txt",
    "content": "Vylepšené stránky\n- Uložení a obnovení, zda je výška tónu a tempo odpojeno, nebo ne\n- Podpora výřezu displeje v přehrávači\n- Kulaté zobrazení a počet účastníků\n- Optimalizováno pro YouTube tak, aby využívalo méně dat\n\nV této verzi bylo opraveno více než 15 chyb souvisejících s YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/870.txt",
    "content": "Jedná se o opravnou verzi, která aktualizuje NewPipe tak, aby opět umožňovala používání služby SoundCloud bez větších potíží.\nV extraktoru se nyní používá rozhraní API SoundCloud v2 a byla vylepšena detekce neplatných ID klientů.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/900.txt",
    "content": "Nový\n- Skupiny předplatného a tříděné kanály\n- Tlačítko ztlumení zvuku v přehrávačích\n\nVylepšené stránky\n- Povoleno otevírání odkazů na music.youtube.com a media.ccc.de v aplikaci NewPipe\n- Přemístění dvou nastavení ze vzhledu do obsahu\n- Skrytí možností vyhledávání po 5, 15 a 25 sekundách, pokud je povoleno nepřesné vyhledávání\n\nOpraveno\n- některá videa WebM nelze zobrazit\n- zálohování databáze v systému Android P\n- pád při sdílení staženého souboru\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/910.txt",
    "content": "Opravena migrace databáze, která v některých vzácných případech znemožňovala spuštění aplikace NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/920.txt",
    "content": "Vylepšeno\n\n- Přidáno datum nahrání a počet zobrazení na položkách mřížky streamu\n- Vylepšení rozvržení záhlaví zásuvky\n\nOpraveno\n\n- Opraveno tlačítko ztlumení zvuku způsobující pády na rozhraní API 19\n- Opraveno stahování dlouhých videí 1080p 60fps\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/930.txt",
    "content": "Nový\n- Vyhledávání na YouTube Music\n- Základní podpora Android TV\n\nVylepšené stránky\n- Přidána možnost odstranit všechna sledovaná videa z místního seznamu skladeb\n- Zobrazení zprávy, když obsah ještě není podporován, místo pádu.\n- Vylepšena změna velikosti vyskakovacího přehrávače pomocí gest štípnutí\n- Enqueue streamy při dlouhém stisknutí tlačítek na pozadí a vyskakovacích tlačítek v kanálu\n- Vylepšené zpracování velikosti záhlaví zásuvky\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/940.txt",
    "content": "Nový\n- Přidání podpory pro komentáře SoundCloud\n- Přidání nastavení omezeného režimu YouTube\n- Zobrazení podrobností o nadřazeném kanálu PeerTube\n\nVylepšené stránky\n- Zobrazení tlačítka Kore pouze pro podporované služby\n- Blokování gest přehrávače, která začínají na panelu NavigationBar nebo StatusBar\n- Změna barvy pozadí tlačítek opakování a přihlášení k odběru na základě barvy služby\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/950.txt",
    "content": "Tato verze přináší tři drobné opravy:\n- Oprava přístupu k úložišti v systému Adroid 10+\n- Opraveno otevírání kiosků\n- Opraveno rozbor trvání dlouhých videí\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/951.txt",
    "content": "Nový\n- Přidání vyhledávání pro výběr odběru v dialogovém okně skupiny kanálů\n- Přidání filtru do dialogového okna skupiny kanálů pro zobrazení pouze neseskupených odběrů\n- Přidání karty seznamu skladeb na hlavní stránku\n- Rychlé převíjení vpřed/vzad ve frontě přehrávačů na pozadí/vyskočení.\n- Zobrazení návrhu vyhledávání: mysleli jste a zobrazení výsledku pro\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/952.txt",
    "content": "Vylepšeno\n• Automatické přehrávaní je dostupné pro všechny služby (místo pouze pro YouTube)\n\nOpraveno\n• Opraveny související streamy díky podpoře nové komunikace YouTubu\n• Opraveny YouTube videa s omezeným věkem\n• [Android TV]\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/953.txt",
    "content": "Oprava extrakce dešifrovací funkce YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/954.txt",
    "content": "- nový pracovní postup aplikace: přehrávání videí na stránce s detailem, přejetí prstem dolů pro minimalizaci přehrávače\n- Oznámení MediaStyle: přizpůsobitelné akce v oznámeních, zlepšení výkonu\n- základní změna velikosti při používání aplikace NewPipe jako aplikace pro stolní počítače\n\n- zobrazení dialogu s možnostmi otevření v případě přípitku nepodporované adresy URL\n- Zlepšení zkušeností s návrhy vyhledávání, pokud nelze načíst ty vzdálené\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/955.txt",
    "content": "[YouTube] Oprava vyhledávání pro některé uživatele\n[YouTube] Oprava náhodných výjimek při dešifrování\n[SoundCloud] Adresy URL, které končí lomítkem, jsou nyní zpracovávány správně\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/956.txt",
    "content": "[YouTube] Opraveno selhání při načítání jakéhokoli videa\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/957.txt",
    "content": "- Sjednocení specifických akcí enqueue do jedné\n- Gesto dvěma prsty pro zavření přehrávače\n- Povolení vymazání souborů cookie reCAPTCHA\n- Možnost nezabarvovat oznámení\n- Vylepšení způsobu otevírání detailů videa s cílem opravit nekonečné vyrovnávací paměti, chybné chování při sdílení do NewPipe a další nesrovnalosti\n- Zrychlení videí na YouTube a oprava videí s věkovým omezením\n- Oprava pádu při rychlém převíjení vpřed/vzad\n- Nepřeuspořádávat seznamy přetahováním miniatur\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/958.txt",
    "content": "Nové a vylepšené:\n- Znovu přidána možnost skrýt miniaturu na zamykací obrazovce\n- Tažení pro obnovení kanálu\n- Vylepšený výkon při načítání místních seznamů\n\nOpraveno:\n- Opraven pád při spuštění aplikace NewPipe po jejím vyjmutí z paměti RAM\n- Opraven pád při spuštění, když není připojení k internetu\n- Opraveno: Respektování nastavení jasu a nastavení hlasitosti\n- YouTube] Opraveny dlouhé seznamy skladeb\n\nOstatní:\n- Vyčištění kódu a několik interních vylepšení\n- Aktualizace závislostí\n-\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/959.txt",
    "content": "Opravena nekonečná smyčka pádů po otevření hlášení chyb.\nAktualizován seznam instancí PeerTube, které lze automaticky otevřít pomocí NewPipe.\nAktualizovány překlady.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/960.txt",
    "content": "- Vylepšený popis možnosti exportu databáze v nastavení.\n- Opraveno zpracování komentářů na YouTube.\n- Opraveno zobrazení názvu služby media.ccc.de.\n- Aktualizovány překlady.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/961.txt",
    "content": "- [YouTube] Podpora mixu\n- [YouTube] Zobrazení informací o veřejnoprávních vysílatelích a Covid-19\n- [media.ccc.de] Přidána nejnovější videa\n- Přidán somálský překlad\n\n- Mnoho interních vylepšení\n\n- Opraveno sdílení videí z přehrávače\n- Opraveno prázdné webové zobrazení ReCaptcha\n- Opraven pád, ke kterému docházelo při odebírání streamu ze seznamu\n- [PeerTube] Opraveny související streamy\n- YouTube] Opraveno vyhledávání hudby na YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/962.txt",
    "content": "Doplněna \"nedávná\" videa do služby media.ccc.de.\nDoplněny živé streamy do služby media.ccc.de a také podpora živých streamů.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/963.txt",
    "content": "- [YouTube] Opraveno pokračování kanálu\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/964.txt",
    "content": "- Přidána podpora kapitol v ovládání hráče\n- [PeerTube] Přidáno vyhledávání v sépiové barvě\n- Znovu přidáno tlačítko pro sdílení v zobrazení detailu videa a popis streamu přesunut do rozložení karet\n- Zakázáno obnovení jasu, pokud je gesto jasu zakázáno\n- Přidána položka seznamu pro přehrávání videa v Kodi\n- Opraven pád v případě, že na některých zařízeních není nastaven výchozí prohlížeč, a vylepšeny dialogy sdílení\n-\n-\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/965.txt",
    "content": "Opraven pád, ke kterému docházelo při změně pořadí skupin kanálů.\nOpraveno získávání dalších videí YouTube z kanálů a seznamů skladeb.\nOpraveno získávání komentářů YouTube.\nPřidána podpora podcest /watch/, /v/ a /w/ v adresách URL YouTube.\nOpraveno získávání id klienta služby SoundCloud a obsahu s geografickým omezením.\nPřidána lokalizace do severní kurdštiny.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/966.txt",
    "content": "Novinka:\n- Přidat novou službu: Bandcamp\n\nVylepšeno:\n- Přidána možnost, aby aplikace následovala motiv zařízení\n- Předcházení některým pádům zobrazením vylepšeného panelu chyb\n- Zobrazení více informací o tom, proč je obsah nedostupný\n- Hardwarové tlačítko mezerníku spouští přehrávání/pauzu\n- Zobrazení přípitku \"Stahování zahájeno\"\n\nOpraveno:\n- Oprava velmi malé miniatury v detailech videa při přehrávání na pozadí\n- Oprava prázdného názvu v minimalizovaném přehrávači\n-\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/967.txt",
    "content": "Opraveno nesprávné fungování služby YouTube v EU. To bylo způsobeno novým systémem souborů cookie a souhlasu s ochranou osobních údajů, který vyžaduje, aby NewPipe nastavil soubor cookie CONSENT.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/968.txt",
    "content": "Do nabídky dlouhého stisknutí tlačítka byla přidána možnost Podrobnosti o kanálu.\nPřidána funkce přejmenování názvu seznamu skladeb z rozhraní seznamu skladeb.\nUmožňuje uživateli pozastavit video během jeho ukládání do vyrovnávací paměti.\nVyleštěn bílý motiv.\nOpraveno překrývání písem při použití větší velikosti písma.\nOpraveno chybějící video na zařízeních Formuler a Zephier.\nOpraveny různé pády.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/969.txt",
    "content": "- Povolení instalace na externí úložiště\n- [Bandcamp] Přidána podpora pro zobrazení prvních tří komentářů u streamu\n- Zobrazení přípitku \"stahování zahájeno\" pouze po zahájení stahování\n- Nenastavovat soubor cookie reCaptcha, pokud není uložen žádný soubor cookie\n- Přehrávač] Zlepšení výkonu mezipaměti\n- Přehrávač] Opraveno automatické nepřehrávání přehrávače\n- Zrušit předchozí Snackbary při mazání stahování\n- Opraven pokus o odstranění objektu, který není v seznamu\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/970.txt",
    "content": "Nový\n- Zobrazení metadat obsahu (značky, kategorie, licence, ...) pod popisem\n- Přidána možnost \"Zobrazit podrobnosti o kanálu\" ve vzdálených (nelokálních) seznamech skladeb\n- Přidána možnost \"Otevřít v prohlížeči\" do nabídky dlouhého stisknutí tlačítka\n\nOpravena stránka\n- Opraven pád při otáčení na stránce s podrobnostmi o videu\n- Opraveno tlačítko \"Přehrát s Kodi\" v přehrávači, které vždy vyzve k instalaci aplikace Kore\n- Opraveno a vylepšeno nastavení cest pro import a export\n-\n-\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/971.txt",
    "content": "Hotfix\n- Zvětšení vyrovnávací paměti pro přehrávání po obnovení vyrovnávací paměti\n- Opraven pád na tabletech a televizorech při kliknutí na ikonu přehrávání v přehrávači\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/972.txt",
    "content": "Nový\nRozpoznání časových razítek a hashtagů v popisu\nPřidáno ruční nastavení režimu tabletu\nPřidána možnost skrýt přehrávané položky ve zdroji\n\nVylepšený\nSprávná podpora rozhraní Storage Access Framework\nLepší zpracování chyb nedostupných a ukončených kanálů\nList sdílení Android pro uživatele Androidu 10+ nyní zobrazuje název obsahu.\nAktualizované instance Invidious a podpora předávaných odkazů.\n\nStabilní\n[YouTube] Obsah s věkovým omezením\n-\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/973.txt",
    "content": "Hotfix\n- Oprava ořezávání miniatur a názvů v mřížkovém rozložení kvůli špatnému výpočtu, kolik videí se vejde do jednoho řádku.\n- Oprava dialogu stahování, který zmizí, aniž by cokoli provedl, pokud je otevřen z nabídky sdílení\n- Aktualizace knihovny související s otevíráním externích činností, například výběrem souborů v rámci Storage Access Framework\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/974.txt",
    "content": "Hotfix\n- Oprava problémů s vyrovnávací pamětí způsobených škrcením YouTube\n- Oprava extrakce komentářů YouTube a pádů s vypnutými komentáři\n- Oprava vyhledávání hudby na YouTube\n- Oprava živých přenosů PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/975.txt",
    "content": "Nový\n- Zobrazení náhledu miniatur při hledání\n- Rozpoznání zakázaných komentářů\n- Umožňuje označit položku kanálu jako sledovanou\n- Zobrazit srdíčka komentářů\n\nVylepšené stránky\n- Vylepšení rozvržení metadat a značek\n- Použití barvy služby na součásti uživatelského rozhraní\n\nOpraveno\n- Oprava miniatur v mini přehrávači\n- Oprava nekonečného vyrovnávací paměti u duplicitních položek fronty\n- Opravy některých přehrávačů, jako je otáčení a rychlejší zavírání\n-\n-\n-\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/976.txt",
    "content": "- Přidána možnost přímého otevření přehrávače ve fullscreenu\n- Umožňuje vybrat, které typy návrhů vyhledávání se mají zobrazit\n- Tmavé téma je nyní tmavší + přidána tmavá úvodní obrazovka\n- Vylepšený nástroj pro výběr souborů, který šedě označuje nechtěné soubory\n- Opraven import odběrů YouTube\n- Opakované přehrávání streamu vyžaduje opětovné klepnutí na tlačítko přehrávání\n- Opraveno ukončení zvukové relace\n-\n-\n-.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/977.txt",
    "content": "- Do nabídky dlouhého stisku bylo přidáno tlačítko \"přehrát další\".\n- Do filtru záměrů byla přidána předpona cesty ke krátkým filmům YouTube\n- Opraven import nastavení\n- Výměna pozice panelu vyhledávání s tlačítky přehrávače na obrazovce Fronta\n- Různé opravy související se správcem MediasessionManager\n- Opraveno nedokončení panelu vyhledávání po skončení videa\n- Zakázáno tunelování médií na RealtekATV\n- Rozšířena klikatelná oblast minimalizovaných tlačítek přehrávače\n\n-.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/978.txt",
    "content": "Opraveno provádění kontroly nové verze NewPipe. Tato kontrola se někdy prováděla příliš brzy, a proto vedla k pádu aplikace. To by nyní mělo být opraveno.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/979.txt",
    "content": "- Opraveno obnovení přehrávání\n- Vylepšení zajišťující, že služba, která určuje, zda má NewPipe kontrolovat nové verze, není spuštěna na pozadí\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/980.txt",
    "content": "Nový\n- Přidání možnosti \"Přidat do seznamu skladeb\" do nabídky sdílení\n- Přidána podpora pro krátké odkazy na y2u.be a PeerTube\n\nVylepšené stránky\n- Kompaktnější ovládání rychlosti přehrávání\n- Kanál nyní zvýrazňuje nové položky\n- Možnost \"Zobrazit sledované položky\" ve feedu je nyní uložena\n\nOpraveno\n- Opravena extrakce lajků a dislajků na YouTube\n- Opraveno automatické přehrávání po návratu z pozadí\nA mnoho dalšího\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/981.txt",
    "content": "Odstraněna podpora MediaParser, aby se opravilo selhání obnovení přehrávání po vyrovnávací paměti v systému Android 11+.\nZakázáno tunelování médií na přehrávači Philips QM16XE, aby se odstranily problémy s přehráváním.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/982.txt",
    "content": "Opraveno nepřehrávání jakéhokoli streamu ve službě YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/983.txt",
    "content": "Přidání nového uživatelského rozhraní a chování při hledání dvojitým klepnutím\nMožnost vyhledávání v nastavení\nZvýraznění připnutých komentářů jako takových\nPřidat podporu open-with-app pro instanci FSFE PeerTube\nPřidat oznámení o chybách\nOprava přehrávání první položky fronty při změně hráče\nPři vyrovnávací paměti během živých přenosů čekat déle, než dojde k selhání\nOprava pořadí výsledků místního vyhledávání\nOprava prázdných políček položek ve frontě přehrávání\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/984.txt",
    "content": "načtení dostatečného množství počátečních položek v seznamech, aby zaplnily celou obrazovku, a oprava posouvání na tabletech a televizorech.\nOprava náhodných pádů při procházení seznamů\nNechat překryvný oblouk rychlého vyhledávání hráče přejít pod uživatelské rozhraní systému\nVrátit změny výřezů při přehrávání ve více oknech, které způsobovaly regresi chybně umístěného přehrávače na některých telefonech\nZvýšit compileSdk z 30 na 31\nAktualizovat knihovnu pro hlášení chyb\n-\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/985.txt",
    "content": "Opraveno nepřehrávání jakéhokoli streamu ve službě YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/986.txt",
    "content": "Nový\n• Oznámení o nových streamech\n• Bezproblémový přechod mezi přehrávači na pozadí a videem\n• Změna výšky tónu podle půltónů\n• Připojení fronty hlavního přehrávače k seznamu skladeb\n\nVylepšený\n• Zapamatujte si velikost kroku rychlosti / stoupání\n• Zmírnění počátečního dlouhého ukládání do vyrovnávací paměti v přehrávači videa\n• Vylepšete uživatelské rozhraní přehrávače pro Android TV\n• Potvrďte před odstraněním všech stažených souborů\n\nStabilní\n•\n•\n•\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/987.txt",
    "content": "Nový\n- Podpora jiných způsobů doručování než progresivního HTTP: rychlejší načítání přehrávání, opravy pro PeerTube a SoundCloud, přehrávání nedávno ukončených živých přenosů na YouTube.\n- Tlačítko Přidat pro přidání vzdáleného seznamu skladeb do místního seznamu skladeb\n- Náhled obrázku ve sdíleném listu systému Android 10+\n\nVylepšená stránka\n- Vylepšení dialogového okna s parametry přehrávání\n- Přesunutí tlačítek pro import/export předplatného do nabídky se třemi tečkami\n\nOpraveno\n-\n-\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/988.txt",
    "content": "[YouTube] Oprava chyby \"Nelze načíst žádný stream\" při pokusu o přehrání jakéhokoli videa\n[YouTube] Oprava zprávy \"Následující obsah není v této aplikaci k dispozici.\" zobrazené místo požadovaného videa\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/989.txt",
    "content": "• [YouTube] Oprava nekonečného načítání při pokusu přehrát jakékoli video\n• [YouTube] Oprava omezování výkonu u některých videí\n• Aktualizace knihovny jsoup na verzi 1.15.3, která obsahuje bezpečnostní opravu\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/990.txt",
    "content": "V této verzi byla zrušena podpora Androidu 4.4 KitKat, nyní je minimální verzí Android 5 Lollipop!\n\nNové\n• Stahování z nabídky dlouhého stisknutí\n• Skrytí nadcházejících videí ve zdroji\n• Sdílení místních seznamů skladeb\n\nVylepšení\n• Přepracování kódu přehrávače na malé komponenty: menší využití RAM, méně chyb\n• Vylepšení režimu měřítka miniatur\n• Vektorizace zástupných symbolů obrázků\n\nOpravy\n• Oprava různých problémů s oznámeními: neaktuální/chybějící informace o médiích, zkreslené miniatury\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/991.txt",
    "content": "Nové\n• Přidáno tlačítko „Otevřít v prohlížeči“ do panelu chyb\n• Přidána možnost zobrazit skupiny kanálů jako seznam\n• [YouTube] Dlouhým klepnutím na segmenty streamu lze sdílet URL časového razítka\n• Přidání tlačítka fronty přehrávání do minipřehrávače\n\nVylepšeno\n• Přidána islandská lokalizace a aktualizovány další překlady\n• Mnoho interních vylepšení\n\nOpraveno\n• Oprava několika pádů\n• [YouTube] Oprava načítání kanálů, nevyhrazeného kanálu a řešení problémů s přehráváním v některých zemích\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/992.txt",
    "content": "Novinky\n• Počet odběratelů v podrobnostech videa\n• Stahování z fronty\n• Permanentní nastavení náhledu playlistu\n• Dlouhé podržení hashtagů a odkazů\n• Režim zobrazení v kartách\n\nVylepšení\n• Větší tlačítko k zavření minipřehrávače\n• Jemnější zmenšování náhledů\n• Cíl Android 13 (API 33)\n• Posouvání v přehrávači jej již nezastaví\n\nOpravy\n• Oprava překrytí s DeX/myší\n• Povolení přehrávače na pozadí bez oddělených streamů zvuku\n• Různé opravy YouTube a další…\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/993.txt",
    "content": "Nové\n• Upozornění při přidávání duplicit do playlistu a tlačítko pro jejich odstranění\n• Povolit ignorování hardwarových tlačítek\n• Povolit skrývání částečně zhlédnutých videí v kanálu\n\nVylepšeno\n• Více sloupců mřížky na velkých obrazovkách\n• Ukazatele průběhu konzistentní s nastavením\n\nOpraveno\n• Oprava otevírání URL prohlížeče, stahování a externích přehrávačů v Android 11+\n• Oprava interakce s celou obrazovkou v MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/994.txt",
    "content": "Nové\n- Podpora více zvukových stop/jazyků\n- Umožňuje nastavení hlasitosti a jasu gesty na libovolné straně obrazovky\n- Podpora zobrazování hlavních karet ve spodní části obrazovky\n\nVylepšeno\n- [Bandcamp] Zpracování skladeb za paywallem\n\nOpraveno\n- [YouTube] Chyby 403 HTTP pro streamy\n- Černý přehrávač při přepnutí do hlavního přehrávače ze zobrazení seznamu skladeb\n- Únik paměti služby přehrávače\n- [PeerTube] Avatary nahrávače a podkanálu byly prohozeny\n\na další\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/995.txt",
    "content": "Nové\n• Podpora karet kanálů\n• Výběr kvality obrázků\n• Získání URL všech obrázků\n\nVylepšeno\n• Přístupnost rozhraní přehrávače\n• Lepší výběr zvuku pro stahování videa\n• Možnost přidat název playlistů a videí do obsahu sdíleného playlistu\n\nOpraveno\n• [YouTube] Opraveno získání počtů líbí se\n• Opraveny popupy neodpovídání přehrávače a pády\n• Výběr nesprávných jazyků ve výběru jazyka\n• Zaměření zvuku přehrávače nerespektovalo ztlumení\n• Přidávání položek do playlistů někdy nefungovalo\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/996.txt",
    "content": "Opravena chyba NullPointerException při otevírání kanálu / konference na media.ccc.de.\nJežíšek nám málem doručil rozbitý dárek pro vás, ale opravili jsme to.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/997.txt",
    "content": "Nové\n• Odpovědi na komentáře\n• Změna pořadí playlistů\n• Zobrazení popisu a trvání playlistu\n• Možnost resetu nastavení\n\nVylepšeno\n• [Android 13+] Obnovení vlastních akcí oznámení\n• Žádost o souhlas pro kontrolu aktualizací\n• Povolení přehrání/pozastavení oznámení při načítání\n• Změna pořadí některých nastavení\n\nOpraveno\n• [YouTube] Opraveno nenačítání komentářů a další opravy a vylepšení\n• Oprava závislosti v importu nastavení a přechod na JSON\n• Různé opravy stahování\n• Trim vyhledávaného textu\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/998.txt",
    "content": "Opraveno nepřehrávání žádného streamu ve službě YouTube kvůli chybám HTTP 403.\n\nObčasné chyby HTTP 403 uprostřed videí zatím nejsou opraveny.\nTento problém bude opraven v dalším hotfix vydání jak nejdříve to bude možné.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/changelogs/999.txt",
    "content": "Tato opravná verze opravuje chyby HTTP 403 uprostřed videí YouTube.\n\nNové\n- [SoundCloud] Přidána podpora pro adresy on.soundcloud.com\n\nVylepšení\n- [Bandcamp] Zobrazení dalších informací v rádiovém kiosku\n\nOpravena stránka\n- [YouTube] Oprava občasných chyb HTTP 403 na začátku nebo uprostřed videí\n- YouTube] Extrahování avataru a banneru z více typů hlaviček kanálů\n- Bandcamp] Opraveny různé chyby a vynucené použití protokolu HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/cs/full_description.txt",
    "content": "NewPipe nepoužívá žádné knihovny Google Framework nebo YouTube API. Aplikace pouze analyzuje webovou stránku YouTube, aby získala potřebné informace. Proto lze tuto aplikaci použít i na zařízeních bez nainstalovaných Služeb Google. K používání NewPipe navíc není potřeba žádný YouTube účet, je to snadné.\n"
  },
  {
    "path": "fastlane/metadata/android/cs/short_description.txt",
    "content": "Svobodný a nenáročný YouTube frontend pro Android.\n"
  },
  {
    "path": "fastlane/metadata/android/cy/changelogs/63.txt",
    "content": "### Gwelliannau\n- Gosodiadau mewnforio/Allforio #1333 \n- Lleihau dros dynnu (gwelliant perfformiad) #1371 \n- Gwelliannau bychan cod #1375 \n- Ychwanegu popeth am y GDPR #1420\n\n### Trwsio\n- Llwythwr: Trwsio'r chwalu wrth lwytho llwythi i lawr heb eu gorffen o ffeiliau .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/cy/full_description.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/cy/short_description.txt",
    "content": "Blaen YouTube ysgafn rhad a rhydd ar gyfer Android.\n"
  },
  {
    "path": "fastlane/metadata/android/da/changelogs/63.txt",
    "content": "### Forbedringer\n- Import/export indstillinger #1333 \n- Reducering af overtegning (ydeevne forbedring )#1371 \n- Små kode forbedringer #1375 \n- GDPR er nu dokumenteret #1420\n\n### Fikset\n- Downloader: Et crash når man loadede et ikke-færdiggjort download fra .giga filer #1407\n"
  },
  {
    "path": "fastlane/metadata/android/da/full_description.txt",
    "content": "NewPipe bruger ingen af Googles programmeringsplatforme eller YouTubes API. Det besøger kun hjemmesiden for at finde de informationer det har brug for. derfor kan denne app køre på enheder uden Google Services, desuden har du ikke brug for en Google konto for at bruge appen. NewPipe er udgivet under en fri og open source licens.\n"
  },
  {
    "path": "fastlane/metadata/android/da/short_description.txt",
    "content": "En gratis let klient til YouTube på Android.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/1000.txt",
    "content": "Verbessert\n• Wiedergabelisten-Beschreibung klickbar, um mehr/weniger Inhalt anzuzeigen\n• [PeerTube] Automat. Handhabung von `subscribeto.me`-Instanzlinks\n• Nur einzelnes Element im Verlaufsbildschirm abspielen\n\nBehoben\n• Sichtbarkeit der RSS-Schaltfläche\n• Abstürze der Suchleistenvorschau\n• Erstellen einer Wiedergabeliste ohne Vorschaubild\n• Beenden des Download-Dialogs, bevor er erscheint\n• Pop-up-Fenster für die Liste der verwandten Elemente in der Warteschlange\n• …\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/1001.txt",
    "content": "Verbessert\n• Ändern der Player-Benachrichtigungseinstellungen ist unter Android 13+ immer möglich\n\nBehoben\n• Beim Exportieren von Datenbanken/Abonnements wurde eine bereits vorhandene Datei nicht verkürzt, was möglicherweise zu einem beschädigten Export führte\n• Der Player wurde beim Anklicken eines Zeitstempel von Anfang an fortgesetzt\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/1002.txt",
    "content": "Behoben: YouTube spielt keinen Stream ab.\n\nDiese Version behebt nur den dringenden Fehler, der das Laden von YouTube-Videodetails verhindert.\nWir sind uns bewusst, dass es andere Probleme gibt, und wir werden bald eine separate Version erstellen, um sie zu lösen.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/1003.txt",
    "content": "Dies ist eine Hotfix-Version, die YouTube-Fehler behebt:\n• [Youtube] Behebung, dass keine Videoinformationen geladen werden, Behebung von HTTP 403-Fehlern beim Abspielen von Videos und Wiederherstellung der Wiedergabe einiger altersbeschränkter Videos\n• Die Größe der Untertitel wird nicht mehr geändert\n• Behebung des doppelten Herunterladens von Informationen beim Öffnen eines Streams\n• [Soundcloud] Entfernen von nicht abspielbaren DRM-geschützten Streams\n• Aktualisierte Übersetzungen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/1004.txt",
    "content": "Behoben, dass YouTube nur einen 360p-Stream bereitstellt.\n\nBeachte, dass die in dieser Version verwendete Lösung wahrscheinlich nur vorübergehend ist und langfristig das SABR-Videoprotokoll implementiert werden muss, aber die Mitglieder von TeamNewPipe sind derzeit sehr beschäftigt, daher wäre jede Hilfe sehr willkommen! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/1005.txt",
    "content": "Neu\n• Android Auto\n• Feed-Gruppen als Hauptbildschirm-Tabs\n• [YouTube] Teilen als temporäre Wiedergabeliste\n• [SoundCloud] Gefällt-Kanal-Tab\n\nVerbessert\n• Bessere Suchleisten-Hinweise\n• Anzeige des Downloaddatums\n• App-spezifische Spracheinstellungen (Android 13)\n\nBehoben\n• Fehlerhafte Textfarben im dunklen Modus\n• [YouTube] Wiedergabelisten laden nicht mehr als 100 Einträge\n• [YouTube] Fehlende empfohlene Videos\n• Abstürze in der Verlaufslisten-Ansicht\n• Zeitstempel in Kommentarantworten\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/1006.txt",
    "content": "# Verbesserungen\nAktuellen Player beim Klick auf Zeitstempel beibehalten\nWiederherstellen ausstehender Downloadaufträge\nDownloads löschen, ohne gleichzeitiges Löschen der Datei\nOverlay-Berechtigung: Erklärendes Dialogfeld für Android > R\nUnterstützung von on.soundcloud-Links\nViele kleine Verbesserungen und Optimierungen\n\n# Behoben\nKurzformatierung für Android-Versionen unter 7\nGeisterbenachrichtigungen\nSRT-Untertiteldateien\nZahlreiche Abstürze\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/1007.txt",
    "content": "Dieser Hotfix behebt „Inhalt nicht verfügbar“: YouTube-Videos können nun wieder abgespielt werden!\n\nEinige in 0.28.1 aufgetretene Fehler behoben:\n• Wiedergabelisten-Elemente können nur auf benachbarte Pos. gezogen werden\n• Titel/Kommentare flackern zwischen aktuellem und vorherigem Video\n• „Hauptplayer im Vollbildmodus starten“\n\nWeitere Verbesserungen:\n• [YouTube] Livestreams bis zu 4 Stunden zurückspulen\n• Livestreams bei Wiedergabe im Hintergrund nicht laden\n• Neue UI für „Gesehene entfernen“\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/1008.txt",
    "content": "∙ Fortsetzen von Streams an der letzten Wiedergabeposition korrigiert\n∙ [YouTube] Unterstützung für weitere Kanal-URL-Formate\n∙ [YouTube] Unterstützung für weitere Video-Metainfo-Formate\n∙ Übersetzungen aktualisiert\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/1009.txt",
    "content": "Wichtig\nInformationen zur Kampagne „Keep Android Open“: https://keepandroidopen.org/de/\n\nVerbessert\n[Feed] Die Reihenfolge, in der veraltete Abos aktualisiert werden\nKommentarseiten nicht stapeln\nBeim Klicken auf die Videodetailseite keine Klickereignisse an darunterliegende Ansichten weiterleiten\n\nBehoben\nLayout der Kommentarantworten ohne Profilbild\nMehrere Player-bezogene Korrekturen der Bedienoberfläche \n[SoundCloud] Streams mit langen IDs\n\nund weitere Korrekturen und Verbesserungen!\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/63.txt",
    "content": "### Verbesserungen\n- Import/Export-Einstellungen #1333 \n- Reduzierung der Überzeichnung (Leistungsverbesserung) #1371 \n- Kleine Codeverbesserungen #1375 \n- Alles über DSGVO hinzugefügt #1420\n\n### Behoben\n- Downloader: Absturz beim Laden unvollendeter Downloads von .giga-Dateien behoben #1407\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/64.txt",
    "content": "### Verbesserungen\n- Es wurde die Möglichkeit hinzugefügt bei der Verwendung von Mobilen Daten die Videoqualität zu limitieren #1339\n- Die eingestellte Helligkeit wird während der Sitzung beibehalten #1442 \n- Verbesserung der Download-Performance auf schwächeren CPUs #1431 \n- (Funktionierender) Support für \"Media session\" wurde hinzugefügt #1433\n\n### Fehlerbehebungen\n- Absturz beim Starten von Downloads wurde behoben (Fehlerbehebung nun verfügbar für Release Builds) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/65.txt",
    "content": "Verbesserungen\n\n-Menüanimation deaktiviert #1486\n-Löschen von Downloads rückgängig machen #1472\n-Option zum Downloaden im Teilen-Menü #1498\n-hinzufügen der Teilen-Funktion im Menü #1454\n-Minimieren der Wiedergabe beim Beenden #1354\n-Datenbank Versions Aktualisierung und Datenbestand Wiederherstellung #1510\n-ExoPlayer 2.8.2 aktualisiert #1392\n-Überarbeitung der Wiedergabegeschwindigkeitskontrolle um Änderungen besser zu unterstützen.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/66.txt",
    "content": "# Versionsänderung von v0.13.7\n\n### Behebungen\n- Probleme der Filterung von v.0.13.6 behoben\n\n# Versionsänderung von v0.13.6\n\n### Verbesserungen\n\n- Animation der Burgermenü-Icon entfernt #1486\n- Löschen von Downloads rückgängig machen #1472\n- Im \"Teilen\"-Tab die Download option hinzugefügt #1498\n- Option \"Teilen\" zum Long-Tap-Menü hinzugefügt #1454\n\n### Behebungen\n\n- Probleme mit dem kaputten Video Info layout behoben. #1440 / #1491\n- Probleme mit dem Verlauf wurden behoben. #1497.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/68.txt",
    "content": "# Änderungen von v0.14.1\n\n### Behoben\n- nicht entschlüsselt Video url #1659\n- Beschreibungs Link nicht extrahierbar #1657\n\n# Änderungen von v0.14.0\n\n### Neu\n- Neues Schubladendesign #1461\n- Neue anpassbare Titelseite #1461\n\n### Verbesserungen\n- Reworked Gesture Controls #1604\n- Neue Möglichkeit, den Pop-up-Player #1597 zu schließen\n\n### Behoben\n- Fehler beheben, wenn die Anzahl der Abonnements nicht verfügbar ist. Schließt #1649.\n- Zeigen Sie \"Abonnentenzählung nicht verfügbar\" in diesen Fällen.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/69.txt",
    "content": "### Neu\n- Langes Tippen zum Löschen/Teilen in Abonnements #1516\n- Tablet-UI und Rasterlistenlayout #1617\n\n### Verbesserungen\n- Speichern/Neuladen des zuletzt verwendeten Seitenverhältnisses #1748\n- Separate Einstellungen für Lautstärke-/Helligkeitsgesten #1644\n- Unterstützung für Lokalisierung #1792\n\n### Fehlerbehebungen\n- Anzahl der Abonnements\n- Vordergrund-Dienstberechtigung für Geräte mit API 28+ hinzugefügt #1830\n\n### Bekannte Fehler\n- Wiedergabestatus wird unter Android P nicht gespeichert\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/70.txt",
    "content": "ACHTUNG: Diese Version ist wahrscheinlich ein Bugfest.\n\n### Verbesserungen\n* heruntergeladene Dateien können mit einem Klick #1879 geöffnet werden\n* Drop-Unterstützung für Android 4.1 - 4.3 #1884\n* Streams aus der aktuellen Warteschlange entfernt, indem sie nach rechts swipen #1915\n\n### Behoben\n* Crash mit Standard-Auflösung eingestellt auf beste und begrenzte mobile Datenauflösung #1835\n* Pop-up-Spieler-Absturz behoben #1874\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/71.txt",
    "content": "### Verbesserungen\n* Benachrichtigung über App-Updates für GitHub-Build (#1608 von @krtkush)\n* Verschiedene Verbesserungen am Downloader (#1944 von @kapodamy):\n  * Weiße Symbole und Hardcoded-Methode zum Ändern der Symbolfarben\n  * Überprüfung, ob der Iterator initialisiert ist (behebt #2031)\n  * Erlaubt erneute Downloads mit dem Fehler „Nachbearbeitung fehlgeschlagen“ im neuen Muxer\n  * Neuer MPEG-4-Muxer (#2039)\n\n### Behoben\n* YouTube-Livestreams werden nicht abgespielt (#1996 von @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/730.txt",
    "content": "# Behoben\n- Fehler bei der Entschlüsselungsfunktion erneut behoben.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/740.txt",
    "content": "<h4>Verbesserungen</h4>\n<ul>\n<li>Links in Kommentaren anklickbar machen, Textgröße erhöhen</li>\n<li>Bei Anklicken von Zeitstempel-Links in Kommentaren suchen</li>\n<li>Bevorzugte Registerkarte basierend auf zuletzt ausgewähltem Status anzeigen</li>\n<li>Unterstützung für Invidious-Links</li>\n</ul>\n<h4>Behoben</h4>\n<ul>\n<li>Scrollen mit deaktivierten Kommentaren und verwandten Streams behoben</li>\n<li>CheckForNewAppVersionTask wird nicht mehr ausgeführt, wenn es nicht sollte</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/750.txt",
    "content": "Neu\nWiedergabe fortsetzen #2288\nDownloader-Verbesserungen #2149 \n\nVerbessert\n• GEMA-Strings entfernt #2295\n• (Automatische) Rotationsänderungen #2444\n• Menüs bei langem Drücken #2368\n\nBehoben\n• Untertitelnamenanzeige #2394\n• Absturz, wenn die Überprüfung auf App-Updates fehlschlägt (GitHub-Version) #2423 \n• Downloads, die bei 99,9 % hängen bleiben #2440\n• Metadaten der Wiedergabeliste aktualisieren #2453 \n• [SoundCloud] Absturz beim Laden von Wiedergabelisten TeamNewPipe/NewPipeExtractor#170\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/760.txt",
    "content": "Veränderung in 0,17.1\n\nNeu\n• thailändische Lokalisierung\n\n\nVerbessert\n• Schalter für SAF / Legacy Datei Picker #2521 hinzufügen\n\nBehoben\n• Löschen Sie Löschtasten in Downloads Ansicht beim Umschalten von Apps #2487\n\nVeränderungen in 0,17,0\n\nNeu\nPlayback Lebenslauf #2288\n• Resume Streams, wo Sie letztes Mal aufgehört haben\nDownloader Verbesserungen #2149\n\nVerbessert\n• Gemaketten entfernen #2295\n\nBehoben\n• Behoben ausgewählter Subtitle Track Name nicht angezeigt #2394\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/770.txt",
    "content": "Veränderungen in 0.17.2\n\nBehoben\n• Behebung von kein Video verfügbar\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/780.txt",
    "content": "Veränderungen in 0,17,3\n\nVerbessert\n• Hinzugefügte Option, um die Wiedergabezustände #2550 zu löschen\n• Versteckte Verzeichnisse in der Datei Picker #2591 anzeigen\n• Unterstützung von URLs von `invidio.us` Instanzen, die mit NewPipe #2488 geöffnet werden sollen\n• Unterstützung für `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194\n\nBehoben\n• [YouTube] Behoben 'java.lang.IllegalArgumentException #192\n• [YouTube] Feste Live-Streams nicht arbeiten TeamNewPipe/NewPipeExtractor#195\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/790.txt",
    "content": "Verbessert\n• Weitere Titel hinzufügen, um die Zugänglichkeit für Blinde zu verbessern #2655\n• Sprache des Download-Ordners konsistenter und weniger eindeutig #2637\n\nBehoben\n• Fixed Scrolling in Video Detail Fragment #2672\n• Entfernen Sie doppelte Suche klare Box-Animationen zu einem #2695\n• [SoundCloud] Client_id Extraktion fix #2745\n\nEntwicklung\n• Hinzufügen fehlender Abhängigkeiten von NewPipeExtractor in NewPipe #2535\n• Migration auf AndroidX #2685\n• Update auf ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/800.txt",
    "content": "Neu\n• PeerTube Unterstützung ohne P2P (#2201) (Beta)\n Es könnte Probleme mit SSL Handshakes auf Android 4.4 & 7.1 geben, wenn auf bestimmte Instanzen zugegriffen wird.\n\nVerbessert\n• Neue Localization and Downloader von Extractor #2713\n• Schwarze Navigationsleiste für schwarzes Theme #2569\n\nBehoben\n• Fehler wurde behoben, der den Pop-up-Player nicht verschieben konnte, wenn ein anderer Finger beim Verschieben des Pop-up-Players #2772 platziert wurde\n• [SoundCloud] Audio-Stream-Extraktion\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/810.txt",
    "content": "Neu\n• Video Vorschau auf den Sperrbildschirm beim Spielen im Hintergrund anzeigen\n\nVerbessert\n• Fügen Sie lokale Wiedergabeliste hinzu, um zu löschen, wenn lange Drücken auf Hintergrund / Pop-up-Taste\n\nBehoben\n• Mehrere Probleme behoben, wenn ein Video zu NewPipe geteilt und seine Streams direkt herunterladen\n• [YouTube] Festes Einschalten Null verursacht NPE\n• [YouTube] Behobene Betrachtungskommentare beim Öffnen eines invidio.us url\n• [SoundCloud] Update von client_id\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/820.txt",
    "content": "Der Regex für den Namen der Entschlüsselungsfunktion, der YouTube unbrauchbar machte, wurde korrigiert.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/830.txt",
    "content": "Aktualisierung der SoundCloud client_id, um SoundCloud-Probleme zu beheben.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/840.txt",
    "content": "Neu\n• Sprachauswahl hinzugefügt, um die App-Sprache zu ändern\n• Hinzugefügt senden zu Kodi Taste zu Spieler zusammenklappbare Menü\n\nVerbessert\n• Entfernen von dot-menu für Schublade und verstecken Geschichte Taste, wenn die Uhr Geschichte nicht in den Einstellungen aktiviert ist\n\nBehoben\n• Fix initialer Helligkeitswert für die Geste\n• [YouTube] Timestamps in der Beschreibung sind wieder anklickbar\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/850.txt",
    "content": "In dieser Veröffentlichung wurde die Version der Youtube Internetseite aktualisiert. Die alte Version der Internetseite wird im März abgeschaltet und darum ist es nötig NewPipe zu aktualisieren.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/860.txt",
    "content": "Verbesserungen\n• Sichern und wiederherstellen ob Tonhöhe und Geschwindigkeit gekoppelt sein sollen oder nicht\n• Das Ausschalten des Bildschirms während dem Abspielen\n• Anzahl an Aufrufen und Abonnenten gerundet\n• YouTube optimiert um weniger Daten zu verbrauchen\n\nMehr als 15 weitere YouTube bezogene Fehler wurden behoben.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/870.txt",
    "content": "Dies ist eine Hotfix-Version, die es NewPipe erneut erlaubt, SoundCloud ohne gröbere Probleme zu nutzen.\nDer Extraktor nutzt nun die v2 API von SoundCloud und die Detektion ungültiger Client-IDs wurde verbessert.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/900.txt",
    "content": "Neu:\n• Abonnementgruppen und sortierte Feeds\n• Stummschalttaste in Playern\n\nVerbessert:\n• Öffnen von music.youtube.com und media.ccc.de Links in NewPipe erlaubt\n• Zwei Einstellungen von „Erscheinungsbild“ zu „Inhalt“ verschoben\n• Ausblenden der Suchoptionen 5, 15 und 25 Sekunden, wenn die ungenaue Suche aktiviert ist\n\nBehoben:\n• Einige WebM-Videos sind nicht suchbar\n• Datenbank-Backup auf Android P\n• Absturz beim Teilen einer heruntergeladenen Datei\n• YouTube-Extraktionsprobleme und mehr …\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/910.txt",
    "content": "Fehler bei Datenbankmigration behoben, welche in seltenen Fällen einen Start der App verhinderte.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/920.txt",
    "content": "Verbessert:\n\n• Upload-Datum und Ansichtsanzahl für Stream-Grid-Elemente hinzugefügt\n• Verbesserungen für das Layout der Schubladenüberschriften\n\nKorrekturen:\n\n• Bug, der den Stumm-Schalter in API 19 zum Crash der App geführt hat wurde behoben\n• Das Herunterladen von langen 1080p 60fps Videos wurde behoben\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/930.txt",
    "content": "Neu\n• Suche auf YouTube Musik\n• Basic Android TV-Unterstützung\n\nVerbessert\n• Hinzugefügt die Fähigkeit, alle beobachteten Videos von einer lokalen Wiedergabeliste zu entfernen\n• Nachricht anzeigen, wenn der Inhalt noch nicht unterstützt wird, anstatt zu stürzen\n\nBehoben\n• Feste altersbeschränkte Inhaltseinstellung nicht funktionieren\n• Behoben bestimmte Arten von reCAPTCHAs\n• Feste Sichtbarkeit der Gruppen-Sort-Taste im Abonnement-Bereich\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/940.txt",
    "content": "Neu\n- Unterstützung für SoundCloud-Kommentare hinzufügen\n- YouTube-Einstellung für eingeschränkten Modus hinzufügen\n- Details des übergeordneten PeerTube-Kanals anzeigen\n\nVerbessert\n- Anzeige der Kore-Schaltfläche nur für unterstützte Dienste\n- Blockieren von Player-Gesten, die in der Navigationsleiste oder Statusleiste beginnen\n- Ändern der Hintergrundfarbe der Schaltflächen Wiederholen und Abonnieren, basierend auf der Farbe des Dienstes\n\nBehoben\n- Einfrieren des Download-Dialogs behoben\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/950.txt",
    "content": "Diese Version enthält drei kleine Änderungen:\n• Speicherzugriff für Android 10+ behoben\n• Öffnen des Kiosks behoben\n• Laden von langen Videos verbessert\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/951.txt",
    "content": "Neu\n- Suche nach Abonnements im Feed-Gruppen-Dialog hinzufügen\n- Filter zum Feed-Gruppen-Dialog hinzufügen, um nur nicht gruppierte Abonnements anzuzeigen\n- Registerkarte Wiedergabeliste zur Hauptseite hinzufügen\n- Schneller Vorlauf/Rücklauf im Hintergrund/Pop-up-Player-Warteschlange\n- Suchvorschlag anzeigen: meinten Sie & Ergebnis anzeigen für\n\nVerbessert\n- Anwendungsmetadaten nicht mehr in gemuxte Dateien schreiben\n- Fehlerhafte Streams nicht aus der Warteschlange entfernen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/952.txt",
    "content": "Verbessert\n• Autoplay ist nun für alle Services verfügbar (nicht nur für YouTube)\n\nBehoben\n• Verwandte Streams wurden behoben, indem die neuen Streamfortsetzungen von YouTube unterstützt werden\n• Altersbeschränkte Videos repariert\n• [Android TV] Überlagerung von Fokus-Hervorhebungen behoben\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/953.txt",
    "content": "Korrektur der Extraktion der Entschlüsselungsfunktion von YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/954.txt",
    "content": "• Neuer Anwendungsworkflow: Videos auf der Detailseite abspielen und nach unten wischen, um den Player zu minimieren\n• MediaStyle-Benachrichtigungen: Anpassbare Aktionen in Benachrichtigungen\n• Grundlegende Größenänderung für NewPipe als Desktop-App\n\n• Dialog mit offenen Optionen bei nicht unterstütztem URL-Toast anzeigen \n• Verbesserte Suchvorschläge, wenn Remote-Vorschläge nicht abgerufen werden können\n• Standardvideoqualität auf 720p60 (In-App) und 480p (Pop-up) angepasst\n\n• Fehlerbehebungen\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/955.txt",
    "content": "[YouTube] Suche für einige Benutzer korrigiert\n[YouTube] Zufällige Entschlüsselungsausnahmen korrigiert\n[SoundCloud] URLs, die mit einem Schrägstrich enden, werden jetzt korrekt geparst\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/956.txt",
    "content": "[YouTube] Absturz beim Laden eines Videos behoben\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/957.txt",
    "content": "• Vereinheitlichung spezifischer Warteschlangenaktionen\n• Zweifinger-Geste zum Schließen des Players\n• reCAPTCHA-Cookies können gelöscht werden\n• Option um Benachrichtigung nicht einzufärben\n• Verbesserung der Videodetails\n• YouTube Videos beschleunigen und Fehlerbehebung bei altersbeschränkten Videos\n• Fehlerbehebung beim Vor- und Zurückspulen\n• Listen werden beim Verschieben von Miniaturansichten nicht mehr umsortiert\n• Pop-up-Einstellungen werden immer gemerkt\n• Santali-Sprache hinzugefügt\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/958.txt",
    "content": "Neu und verbessert:\n• Option Vorschaubild auf Sperrbildschirm ausblenden wieder hinzugefügt\n• Ziehen zum Feed aktualisieren\n• Verbesserte Leistung beim Abruf lokaler Listen\n\nBehoben:\n• Absturz, NewPipe-Start nachdem es aus dem RAM entfernt wurde\n• Absturz, NewPipe-Start ohne Internetverbindung\n• Einstellungen Helligkeits- und Lautstärkegesten\n• [YT] Lange Wiedergabelisten\n\nSonstiges:\n• Codebereinigung, etliche interne Verbesserungen\n• Abhängigkeiten aktualisiert\n• Übersetzungen aktualisiert\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/959.txt",
    "content": "Endlose Abstürze beim Öffnen eines Fehlerberichts wurden behoben.\nDie Liste der PeerTube-Instanzen, die von NewPipe automatisch geöffnet werden können, wurde aktualisiert.\nÜbersetzungen wurden aktualisiert.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/960.txt",
    "content": "• Verbesserte Beschreibung der Option \"Datenbank exportieren\" in den Einstellungen.\n• Das Parsen von YouTube-Kommentaren wurde behoben.\n• Anzeige des Namens des Dienstes media.ccc.de korrigiert.\n• Aktualisierte Übersetzungen.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/961.txt",
    "content": "• [YouTube] Mix-Unterstützung\n• [YouTube] Anzeige von Infos zu öffentlich-rechtlichen Sendern und Covid-19\n• [media.ccc.de] Neue Videos hinzugefügt\n• Somali-Übersetzung hinzugefügt\n\n• Viele interne Verbesserungen\n\n• Fehler beim Teilen von Videos aus dem Player heraus behoben\n• Leere ReCaptcha-Webansicht behoben\n• Absturz behoben, der beim Entfernen eines Streams aus einer Liste auftrat\n• [PeerTube] Verwandte Streams korrigiert\n• [YouTube] Fehler bei YouTube-Musiksuche behoben\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/962.txt",
    "content": "\"Neuste\" Videos zu media.ccc.de hinzugefügt.\nLive Streams zu media.ccc.de hinzugefügt und die Unterstützung von Live Streams.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/963.txt",
    "content": "• [YouTube] Fortsetzung des Kanals korrigiert\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/964.txt",
    "content": "- Unterstützung für Kapitel in der Playersteuerung hinzugefügt\n- [PeerTube] Sepia-Suche hinzugefügt\n- Schaltfläche zum Teilen in der Video-Detailansicht wieder hinzugefügt und Stream-Beschreibung in das Tab-Layout verschoben\n- Deaktiviert die Wiederherstellung der Helligkeit, wenn die Helligkeitsgeste deaktiviert ist\n- Listenelement zum Abspielen von Videos auf Kodi hinzugefügt\n- Absturz behoben, wenn auf manchen Geräten kein Standardbrowser eingestellt ist, und Freigabedialoge verbessert\n...\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/965.txt",
    "content": "Absturz behoben, der beim Neuordnen von Kanalgruppen auftrat.\nDas Abrufen weiterer YouTube-Videos aus Kanälen und Wiedergabelisten wurde behoben.\nDas Abrufen von YouTube-Kommentaren wurde behoben.\nUnterstützung für /watch/, /v/ und /w/ Unterpfade in YouTube URLs hinzugefügt.\nDie Extraktion der SoundCloud-Client-ID und geografisch eingeschränkter Inhalte wurde korrigiert.\nNordkurdische Lokalisierung wurde hinzugefügt.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/966.txt",
    "content": "Neu:\n• Neuer Service: Bandcamp\n\nVerbessert:\n• Die App kann jetzt die Design Einstellungen des Gerätes befolgen\n• Verbessertes Fehler-Fenster\n• Es werden mehr Informationen angezeigt, warum ein Inhalt nicht verfügbar ist\n• Videos können über die Leertaste abgespielt/angehalten werden\n• Zeige \"Download gestartet\" Toast\n\nBehoben:\n• sehr kleine Vorschaubilder wenn Videos im Hintergrund abgespielt werden\n• leerer Titel im minimierten Video-Player\n• vorheriger Video Modus wurde nicht wiederhergestellt\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/967.txt",
    "content": "Problem behoben, bei dem YouTube in der EU nicht richtig funktionierte. Dies wurde durch ein neues Cookie- und Datenschutz-Einwilligungssystem verursacht, welches ein CONSENT-Cookie von NewPipe erfordert.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/968.txt",
    "content": "Option „Kanaldetails“ dem Langdruck-Menü hinzugefügt.\nFunktion zum Umbenennen des Namens der Wiedergabeliste der Oberfläche hinzugefügt.\nBenutzer kann nun pausieren, während ein Video gepuffert wird.\nWeißes Design wurde aufpoliert.\nÜberlappende Schriftarten bei Verwendung einer größeren Schriftgröße behoben.\nVideoanzeige auf Formuler- und Zephier-Geräten behoben.\nVerschiedene Abstürze behoben.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/969.txt",
    "content": "• Installation auf externen Speicher möglich\n• [Bandcamp] Unterstützung für die Anzeige der ersten drei Kommentare in einem Stream\n• Nur Hinweisanzeige \"Download gestartet\", wenn der Download gestartet wird\n• Setzt kein reCaptcha-Cookie, wenn kein Cookie gespeichert wird\n• Cache-Leistung verbessert\n• Problem behoben, dass die Wiedergabe nicht automatisch abspielt wird\n• Verwerfen früherer Snackbars beim Löschen von Downloads\n• Fehler beim Löschen des Objekts, das nicht in der Liste enthalten ist\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/970.txt",
    "content": "Neu:\n• Inhaltsmetadaten (Tags, Kategorien, Lizenz, …) unter der Beschreibung anzeigen\n• Option „Kanaldetails anzeigen“ in remote (nicht lokalen) Wiedergabelisten hinzugefügt\n• Option „Im Browser öffnen“ zum Langdruck-Menü hinzugefügt\n\nBehoben:\n• Rotationsabsturz auf der Videodetailseite\n• „Mit Kodi spielen“-Schaltfläche im Player fordert immer auf, Kore zu installieren\n• Setzen von Import- und Exportpfaden wurde behoben und verbessert\n• [YouTube] Anzahl Kommentar-Likes korrigiert\nUnd vieles mehr\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/971.txt",
    "content": "Hotfix\n• Puffer für Wiedergabe nach Rebuffer erhöhen\n• Absturz auf Tablets und TVs beim Klicken auf das Widergabewartelisten-Symbol im Player behoben\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/972.txt",
    "content": "Neu\nErkennung von Zeitstempeln/Hashtags in der Beschreibung\nManuelle Einstellung des Tablet-Modus\nAbgespielte Elemente können nun im Feed ausgeblendet werden\n\nVerbessert\nKorrekte Unterstützung des Storage-Access-Frameworks\nBessere Fehlerbehandlung von nicht verfügbaren und geschlossenen Kanälen\nDas Android-Freigabefenster für Nutzer von Android 10+ zeigt nun den Titel des Inhalts an\nInvidious-Instanzen aktualisiert und Unterstützung von Piped-Links \n\nBehoben\n[YouTube] Altersbeschränkte Inhalte\n…\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/973.txt",
    "content": "Hotfix\n- Thumbnails und Titel werden im Grid-Layout nicht mehr abgeschnitten, da falsch berechnet wurde, wie viele Videos in eine Reihe passen\n- Der Download-Dialog verschwindet nicht mehr, wenn er über das Freigabemenü geöffnet wird\n- Aktualisierung einer Bibliothek im Zusammenhang mit dem Öffnen von externen Aktivitäten wie dem Storage Access Framework File Picker\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/974.txt",
    "content": "Hotfix\n- Behebung von Pufferproblemen, die durch YouTube-Drosselung verursacht werden\n- Behebt die Extraktion von YouTube-Kommentaren und Abstürze bei deaktivierten Kommentaren\n- Behebung der YouTube-Musiksuche\n- Behebung von PeerTube-Livestreams\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/975.txt",
    "content": "Neu:\n• Vorschaubild-Anzeige während der Suche\n• Deaktivierte Kommentare erkennen\n• Feed-Element als beobachtet markieren\n• Kommentarherzen anzeigen\n\nVerbessert:\n• Layout von Metadaten und Tags\n• Dienstfarbe für UI-Komponenten\n\nBehoben:\n• Vorschaubild im Mini-Player\n• Endlose Pufferung bei doppelten Warteschlangenelementen\n• Einige Player-Fixes wie Rotation und schnelleres Schließen\n• ReCAPTCHA lädt im Hintergrund\n• Klicks bei Feed-Aktualisierung deaktivieren\n• Einige Downloader-Abstürze\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/976.txt",
    "content": "• Option zum direkten Öffnen des Players im Vollbildmodus hinzugefügt\n• Auswahl der anzuzeigenden Suchvorschläge möglich\n• Dunkles Design nun dunkler + dunkler Splash-Screen hinzugefügt\n• Verbesserte Dateiauswahl, um unerwünschte Dateien auszugrauen\n• Import von YouTube-Abonnements behoben\n• Das Wiederholen eines Streams erfordert ein erneutes Tippen auf die Wiedergabetaste\n• Behoben: Audio-Sitzung schließen\n…\n\nÄnderungen finden Sie im Changelog (und im Blogbeitrag) auf dem Links-Tab unten.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/977.txt",
    "content": "• Die Schaltfläche „Weiter abspielen“ dem Langdruckmenü hinzugefügt\n• YouTube-Shorts-Pfadpräfix zum Absichtsfilter hinzugefügt\n• Import von Einstellungen behoben\n• Position der Suchleiste mit Player-Schaltflächen im Warteschlangen-Bildschirm getauscht\n• Verschiedene Korrekturen im Zusammenhang mit MediasessionManager\n• Die Suchleiste wurde nach dem Ende des Videos nicht abgeschlossen\n…\n\nWeitere Änderungen finden Sie im Changelog (und im Blogbeitrag) auf dem Links-Tab unten.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/978.txt",
    "content": "Die Prüfung auf eine neue NewPipe-Version wurde korrigiert. Diese Prüfung wurde manchmal zu früh ausgeführt und führte daher zu einem Absturz der App. Dies sollte nun behoben sein.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/979.txt",
    "content": "- Wiederaufnahme der Wiedergabe behoben\n- Verbesserungen, um sicherzustellen, dass der Dienst, der bestimmt, ob NewPipe nach einer neuen Version suchen soll, nicht im Hintergrund gestartet wird\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/980.txt",
    "content": "Neu:\n• Option „Zur Wiedergabeliste hinzufügen“ zum Freigabemenü hinzugefügt\n• Unterstützung für y2u.be- und PeerTube-Kurzlinks hinzugefügt\n\nVerbessert:\n• Playback-Speed-Controls kompakter gemacht\n• Feed hebt jetzt neue Elemente hervor\n• „Beobachtete Artikel anzeigen“-Option im Feed wird nun gespeichert\n\nBehoben:\n• Extraktion von YouTube Likes und Dislikes behoben\n• Automatische Wiederholung nach Rückkehr aus dem Hintergrund behoben\nUnd vieles mehr\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/981.txt",
    "content": "Die MediaParser-Unterstützung wurde entfernt, um Probleme bei der Wiederaufnahme der Wiedergabe nach der Pufferung unter Android 11+ zu beheben.\nMedia Tunneling auf Philips QM16XE deaktiviert, um Wiedergabeprobleme zu beheben.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/982.txt",
    "content": "Behoben, dass YouTube keinen Stream abspielte.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/983.txt",
    "content": "Neue UI und Verhalten beim doppelten Antippen zum Suchen hinzufügen\nEinstellungen durchsuchbar machen\nAngepinnte Kommentare als solche markieren\nOpen-With-App Unterstützung für FSFEs PeerTube-Instanz hinzufügen\nHinzufügen von Fehlerbenachrichtigungen\nReplay des ersten Warteschlangenelements bei Spielerwechsel korrigieren\nLängeres Warten beim Puffern während Livestreams, bevor ein Fehler auftritt\nReihenfolge der lokalen Suchergebnisse korrigieren\nLeere Felder in der Warteschlange beheben\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/984.txt",
    "content": "Scrollen in Listen auf Tablets und TVs behoben\nZufällige Abstürze beim Scrollen durch Listen behoben\nDas Overlay zum schnellen Vor- und Zurückspringen liegt jetzt unter der System-UI\nÄnderungen für bessere Unterstützung von Cutouts wurden rückgängig gemacht, da diese auf einigen Geräten die Oberfläche des Players verschiebt\ncompileSDK wurde von 30auf 31 erhöht\nDie Bibliothek zum Melden von Fehlern wurde aktualisiert\nKleine Teile des Player Codes wurden umstrukturiert\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/985.txt",
    "content": "Behoben, dass YouTube keinen Stream abspielte\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/986.txt",
    "content": "Neu\n• Benachrichtigungen für neue Streams\n• Nahtloser Übergang zwischen Hintergrund- und Videoplayer\n• Ändern der Tonhöhe um Halbtöne\n• Warteschlange des Hauptplayers an Wiedergabeliste anfügen\n\nVerbessert\n• Speichern der Geschwindigkeit/Tonhöhenschrittweite\n• Anfängliche lange Videoplayer-Pufferung verringert\n• Player-UI für Android TV\n• Löschbestätigung aller heruntergeladenen Dateien\n\nBehoben\n• Medienschaltfläche blendet Player-Steuerelemente nicht aus\n• …\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/987.txt",
    "content": "Neu\n• Unterstützung anderer Übertragungsmethoden als progressives HTTP: schnellere Ladezeit bei Wiedergabe, Fehlerbehebungen für PeerTube/SoundCloud, Wiedergabe kürzlich beendeter YouTube-Livestreams\n• Schaltfläche, um Remote-Wiedergabeliste einer Lokalen hinzuzufügen\n• Bildvorschau im Teilen-Dialog von Android 10+\n\nVerbessert\n• Wiedergabewerte-Dialog\n• Import/Export-Schaltflächen für Abos in Drei-Punkte-Menü verschoben\n\nBehoben\n• Entfernen vollständig angesehener Videos aus Wiedergabeliste\n• …\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/988.txt",
    "content": "[YouTube] Fehler „Konnte keinen Stream abrufen“ behoben beim Versuch, ein Video abzuspielen\n[YouTube] \"Der folgende Inhalt ist in dieser App nicht verfügbar.\" anstelle des angeforderten Videos behoben\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/989.txt",
    "content": "• [YouTube] Unendliches Laden behoben beim Versuch, ein Video abzuspielen\n• [YouTube] Drosselung bei einigen Videos behoben\n• Aktualisierung der jsoup-Bibliothek auf 1.15.3, die einen Sicherheitsfix enthält\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/990.txt",
    "content": "Mit dieser Version entfällt die Unterstützung für Android 4.4 KitKat, die Mindestversion ist nun Android 5 Lollipop!\n\nNeu:\n• Herunterladen aus dem Langdruckmenü\n• Zukünftige Videos im Feed ausblenden\n• Lokale Wiedergabelisten teilen\n\nVerbessert:\n• Player-Code in kleine Komponenten refaktorisiert: weniger RAM-Verbrauch, weniger Bugs\n• Skalierungsmodus für Miniaturansicht\n\nBehoben:\n• Verschiedene Probleme mit Player-Benachrichtigung: veraltete/fehlende Medieninfos, verzerrte Miniaturansicht\n…\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/991.txt",
    "content": "Neu:\n• Neue Schaltfläche \"Im Browser öffnen\" im Fehler-Fenster\n• Anzeigeoption von Kanalgruppen als Liste\n• [YouTube] Langer Klick auf Streamsegmente um Zeitstempel-URL zu teilen\n• Schaltfläche „Warteschlange abspielen“ im Mini-Player\n\nVerbessert:\n• Isländische Lokalisierung hinzugefügt, viele Übersetzungen aktualisiert\n• Viele interne Verbesserungen\n\nBehoben:\n• Mehrere Abstürze behoben\n• [YouTube] Fehlerbehebung für Laden von Kanälen, nicht zugeordnete Feeds und Wiedergabe in einigen Ländern\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/992.txt",
    "content": "Neu:\n• Anzahl der Abonnenten in den Videodetails\n• Herunterladen aus der Warteschlange\n• Dauerhaftes Einstellen einer Wiedergabelisten-Miniaturansicht\n• Hashtags und Links lang drücken\n• Kartenansicht-Modus\n\nVerbessert:\n• Größere Schaltfläche um Mini-Player zu schließen\n• Glattere Miniaturansicht-Skalierung\n• Android 13 (API 33)\n• Suchen hält den Player nicht mehr an\n\nBehoben:\n• Overlay auf DeX/Maus\n• Hintergrundplayer ohne separate Audiostreams\n• YouTube-Korrekturen und mehr…\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/993.txt",
    "content": "Neu\n• Warnung beim Erstellen von Duplikaten in Wiedergabelisten und neue Schaltfläche um diese zu entfernen\n• Möglichkeit, Hardwaretasten zu ignorieren\n• Möglichkeit, teilweise gesehene Videos im Feed auszublenden\n\nVerbessert\n• Mehr Gitterspalten auf großen Displays\n• Fortschrittsbalken sind jetzt konsistent mit Einstellungen\n\nBehoben\n• Das Öffnen von Browser-URLs, Downloads und externen Videoplayern unter Android 11+\n• Vollbildmodus-Bedienung benötigte zweimaliges Tippen unter MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/994.txt",
    "content": "Neu\n• Unterstützung mehrerer Audiospuren/Sprachen\n• Lautstärke- und Helligkeitsgesten auf jeder Bildschirmseite ermöglicht\n• Unterstützung für die Anzeige von Haupttabs am unteren Bildschirmrand\n\nVerbessert\n• [Bandcamp] Handhabung von Titeln hinter der Bezahlschranke\n\nBehoben\n• [YouTube] 403-HTTP-Fehler bei Streams\n• Schwarzer Player beim Wechsel von der Wiedergabeliste zum Hauptplayer\n• Speicherleck im Playerdienst\n• [PeerTube] Benutzer- und Unterkanal-Profilbilder getauscht\n\nund mehr\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/995.txt",
    "content": "Neu\n• Unterstützung von Kanaltabs\n• Bildqualität auswählbar\n• URLs zu allen Bildern erhalten\n\nVerbessert\n• Zugänglichkeit der Player-Oberflächen\n• Bessere Audioauswahl bei reinen Video-Downloads\n• Option zur Aufnahme von Wiedergabelisten-/Videonamen in geteilten Wiedergabelisteninhalten\n\nBehoben\n• [YouTube] Erhalten der Like-Anzahl\n• Nicht reagierende Pop-ups und Abstürze des Players\n• Hinzufügen von Wiedergabelistenelementen funktionierte gelegentlich nicht\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/996.txt",
    "content": "Eine NullPointerException beim Öffnen eines Kanals / einer Konferenz in media.ccc.de behoben.\nDer Grinch hat versucht, unser Weihnachtsgeschenk für Sie zu zerstören, aber wir haben es behoben.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/997.txt",
    "content": "Neu\n• Antwort auf Kommentar\n• Wiedergabelisten umordnen\n• Wiedergabelisten-Beschreibung/-Dauer\n• Rücksetzen der Einstellungen\n\nVerbessert\n• [Android 13+] Wiederherstellen benutzerd. Benachrichtigungsaktionen\n• Zustimmung zur Updateprüfung\n• Wiedergabe/Pause von Benachrichtigungen während Pufferung\n• Neuanordnung einiger Einstellungen\n\nBehoben\n• [YouTube] Kommentare wurden nicht geladen, weitere Fehlerbehebungen/Verbesserungen\n• Sicherheitslücke beim Einstellungsimport und Umstellung auf JSON\n• …\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/998.txt",
    "content": "Behoben: YouTube spielt keinen Stream wegen HTTP-403-Fehlern ab.\n\nGelegentliche HTTP-403-Fehler in der Mitte eines YouTube-Videos sind noch nicht behoben.\nDieses Problem wird in einer weiteren Hotfix-Version so bald wie möglich behoben.\n"
  },
  {
    "path": "fastlane/metadata/android/de/changelogs/999.txt",
    "content": "Diese Hotfix-Version behebt HTTP-403-Fehler mitten in YouTube-Videos.\n\nNeu\n• [SoundCloud] Unterstützung für on.soundcloud.com-URLs hinzugefügt\n\nVerbessert\n• [Bandcamp] Anzeige zusätzlicher Informationen im Radio-Kiosk\n\nBehoben\n• [YouTube] Gelegentliche HTTP-403-Fehler am Anfang oder in der Mitte von Videos\n• [YouTube] Extrahieren von Profilbildern und Banner aus mehr Kanal-Header-Typen\n• [Bandcamp] Verschiedene Fehler behoben und HTTPS wird immer verwendet\n"
  },
  {
    "path": "fastlane/metadata/android/de/full_description.txt",
    "content": "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).\n"
  },
  {
    "path": "fastlane/metadata/android/de/short_description.txt",
    "content": "Eine kostenlose, leichte YouTube-App für Android.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/1000.txt",
    "content": "Βελτιώσεις\n• Κάντε κλικ στην περιγραφή της λίστας αναπαραγωγής για να εμφανίζεται περισσότερο / λιγότερο περιεχόμενο\n• [PeerTube] Χειριστείτε αυτόματα συνδέσμους παρουσίας «subscribeto.me».\n• Ξεκινήστε την αναπαραγωγή μόνο ενός στοιχείου στην οθόνη ιστορικού\n\nΔιορθώσεις\n• Διορθώστε την ορατότητα του κουμπιού RSS\n• Διορθώστε τα σφάλματα προεπισκόπησης της γραμμής αναζήτησης\n• Διορθώστε την εισχώρηση στη λίστα αναπαραγωγής ενός στοιχείου χωρίς μικρογραφίες\n• Διορθώστε την έξοδο από το παράθυρο διαλόγου λήψης προτού εμφανιστεί\n• Διορθώστε το αναδυόμενο παράθυρο ουράς λίστας σχετικών στοιχείων\n• Διορθώστε τη σειρά στο παράθυρο διαλόγου προσθήκης στη λίστα αναπαραγωγής\n• Προσαρμόστε τη διάταξη του σελιδοδείκτη της λίστας αναπαραγωγής\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/1001.txt",
    "content": "Βελτιωμένο\n- Επιτρέπει πάντα την αλλαγή των προτιμήσεων ειδοποίησης παίκτη στο Android 13+\n\nΔιορθωμένο\n- Διόρθωση Η εξαγωγή βάσης δεδομένων/συνδρομών δεν έκοβε ένα ήδη υπάρχον αρχείο, οδηγώντας ενδεχομένως σε κατεστραμμένη εξαγωγή\n- Διόρθωση της συνέχισης του παίκτη από την αρχή όταν κάνετε κλικ σε μια χρονοσφραγίδα\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/1002.txt",
    "content": "Διορθώθηκε το YouTube που δεν αναπαράγει καμία ροή.\n\nΑυτή η έκδοση αντιμετωπίζει μόνο το πιο πιεστικό σφάλμα που εμποδίζει τη φόρτωση λεπτομερειών βίντεο του YouTube.\nΓνωρίζουμε ότι υπάρχουν και άλλα προβλήματα και σύντομα θα προβούμε σε ξεχωριστή έκδοση για την επίλυσή τους.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/1003.txt",
    "content": "Αυτή είναι μια έκδοση hotfix που διορθώνει σφάλματα του YouTube:\n- [YouTube] Διόρθωση της μη φόρτωσης πληροφοριών βίντεο, διόρθωση σφαλμάτων HTTP 403 κατά την αναπαραγωγή βίντεο και αποκατάσταση της αναπαραγωγής ορισμένων βίντεο με περιορισμούς ηλικίας.\n- Διόρθωση της μη αλλαγής των μεγεθών των λεζάντων\n- Διόρθωση της λήψης πληροφοριών δύο φορές κατά το άνοιγμα μιας ροής\n- [Soundcloud] Αφαίρεση μη αναπαραγώγιμων ροών με προστασία DRM\n- Ενημερωμένες μεταφράσεις\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/1004.txt",
    "content": "Αυτή η έκδοση διορθώνει το πρόβλημα που παρουσίαζε το YouTube μόνο σε ροή 360p.\n\nΣημειώστε ότι η λύση που χρησιμοποιείται σε αυτήν την έκδοση είναι πιθανώς προσωρινή και μακροπρόθεσμα πρέπει να εφαρμοστεί το πρωτόκολλο βίντεο SABR, αλλά τα μέλη του TeamNewPipe είναι απασχολημένα αυτήν τη στιγμή, επομένως οποιαδήποτε βοήθεια θα εκτιμηθεί ιδιαίτερα! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/1005.txt",
    "content": "Νέο\n• Προσθήκη υποστήριξης για το Android Auto\n• Επιτρέπεται ο ορισμός ομάδων ροών ως καρτέλες κύριας οθόνης\n• [YouTube] Κοινή χρήση ως προσωρινή λίστα αναπαραγωγής\n• [SoundCloud] Καρτέλα καναλιού \"Μου αρέσει\"\n\nΒελτιωμένη\n• Καλύτερες υποδείξεις γραμμής αναζήτησης\n• Εμφάνιση ημερομηνίας λήψης στις Λήψεις\n• Χρήση γλώσσας Android 13 ανά εφαρμογή\n\nΔιορθώθηκε\n• Διόρθωση σπασμένων χρωμάτων κειμένου σε σκοτεινή λειτουργία\n• [YouTube] Διόρθωση λιστών αναπαραγωγής που δεν φόρτωναν περισσότερα από 100 στοιχεία\n• [YouTube] Διόρθωση προτεινόμενων βίντεο που λείπουν\n• Διόρθωση σφαλμάτων στην προβολή λίστας ιστορικού\n• Διόρθωση χρονικών σημάνσεων στις απαντήσεις σχολίων\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/63.txt",
    "content": "###Βελτιώσεις\n- Εισαγωγή/εξαγωγή ρυθμίσεων #1333\n- Ελάττωση υπερβολών (βελτίωση απόδοσης) #1371\n- Μικροβελτιώσεις του κώδικα #1375\n- Προστέθηκαν τα πάντα σχετικά με τον GDPR #1420\n\n###Επιδιορθώθηκαν\n- Μηχανισμός λήψεων: Επιδιόρθωση καταρρεύσεως κατά τη φόρτωση ημιτελών λήψεων από αρχεία .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/64.txt",
    "content": "### Βελτιώσεις\n- Προσθήκη δυνατότητας περιορισμού της ποιότητας του βίντεο, όταν χρησιμοποιείτε δεδομένα δικτύου. #1339 \n- Απομνημόνευση φωτεινότητας για τη συνεδρία. #1442 \n- Βελτίωση απόδοσης κατεβάσματος για πιο αδύναμες CPUs. #1431 \n- Προσθήκη (λειτουργικής) υποστήριξης για συνεδρία μέσων. #1433\n\n### Διορθώσεις\n- Διόρθωση κατάρρευσης κατά το άνοιγμα των ληφθέντων αρχείων. #1441\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/65.txt",
    "content": "### Βελτιώσεις\n\n- Απενεργοποίηση της κίνησης του εικονιδίου του burgermenu #1486 \n- Αναίρεση διαγραφής λήψεων #1472 \n- Επιλογή λήψης στο μενού κοινής χρήσης #1498\n- Προστέθηκε επιλογή κοινής χρήσης στο μενού παρατεταμένου πατήματος #1454 \n- Ελαχιστοποίηση του κύριου προγράμματος αναπαραγωγής κατά την έξοδο #1354 \n- Ενημέρωση της έκδοσης της βιβλιοθήκης και διόρθωση αντιγράφων ασφαλείας της βάσης δεδομένων #1510 \n- Ενημέρωση ExoPlayer 2.8.2 #1392\n  - Ανασχεδιάστηκε ο διάλογος ελέγχου της ταχύτητας αναπαραγωγής ώστε να υποστηρίζει διαφορετικά μεγέθη βημάτων για ταχύτερη αλλαγή ταχύτητας.\n  - Προστέθηκε μια εναλλαγή για γρήγορη μετακίνηση προς τα εμπρός κατά τη διάρκεια σιωπής στον έλεγχο ταχύτητας αναπαραγωγής. Αυτό θα πρέπει να είναι χρήσιμο για τα ακουστικά βιβλία και ορισμένα είδη μουσικής και μπορεί να φέρει μια πραγματικά απρόσκοπτη εμπειρία (και μπορεί να σπάσει ένα τραγούδι με πολλές σιωπές =\\\\).  \n  - Αναδιαμόρφωση της ανάλυσης πηγής πολυμέσων ώστε να επιτρέπεται η μετάδοση μεταδεδομένων μαζί με τα πολυμέσα εσωτερικά στον αναπαραγωγέα, αντί να γίνεται χειροκίνητα. Τώρα έχουμε μια ενιαία πηγή μεταδεδομένων και είναι άμεσα διαθέσιμα κατά την έναρξη της αναπαραγωγής.\n  - Διορθώθηκε η μη ενημέρωση των απομακρυσμένων μεταδεδομένων της λίστας αναπαραγωγής όταν είναι διαθέσιμα νέα μεταδεδομένα κατά το άνοιγμα του τμήματος της λίστας αναπαραγωγής.\n  - Διάφορες διορθώσεις στο UI: #1383, τα στοιχεία ελέγχου ειδοποίησης αναπαραγωγής στο παρασκήνιο είναι τώρα πάντα λευκά, είναι ευκολότερο να κλείσετε το αναδυόμενο πρόγραμμα αναπαραγωγής μέσω εκτίναξης\n- Χρήση νέου εξαηωγέα με ανασχεδιασμένη αρχιτεκτονική για πολλαπλές υπηρεσίες\n\n### Διορθώσεις\n\n- Διόρθωση #1440 Προβληματική διάταξη πληροφοριών βίντεο #1491 \n- Διόρθωση ιστορικού προβολής #1497\n  - #1495, ενημέρωση των μεταδεδομένων (μικρογραφία, τίτλος και αριθμός βίντεο) μόλις ο χρήστης αποκτήσει πρόσβαση στη λίστα αναπαραγωγής. \n  - #1475, με την καταχώριση μιας προβολής στη βάση δεδομένων όταν ο χρήστης ξεκινάει ένα βίντεο σε εξωτερική συσκευή αναπαραγωγής σε λεπτομερές θραύσμα.\n- Διόρθωση του χρονικού ορίου creen σε περίπτωση λειτουργίας αναδυόμενου παραθύρου. #1463 (Διορθώθηκε το #640)\n- Διόρθωση του κύριου προγράμματος αναπαραγωγής βίντεο #1509 \n  - #1412] Διορθώθηκε η λειτουργία επανάληψης που προκαλεί NPE του αναπαραγωγέα όταν λαμβάνεται νέα εντολή ενώ εργάζεται στο παρασκήνιο.\n  - Διορθώθηκε κατά την ελαχιστοποίηση του αναπαραγωγέα σε αναδυόμενο παράθυρο, να μην τον καταστρέφει όταν δεν έχει χορηγηθεί άδεια αναδυόμενου παραθύρου.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/66.txt",
    "content": "### Βελτιώσεις\n\n- Απενεργοποίηση της κίνησης του εικονιδίου του burgermenu #1486 \n- Αναίρεση διαγραφής λήψεων #1472 \n- Επιλογή λήψης στο μενού κοινής χρήσης #1498\n- Προστέθηκε επιλογή κοινής χρήσης στο μενού παρατεταμένου πατήματος #1454 \n- Ελαχιστοποίηση του κύριου προγράμματος αναπαραγωγής κατά την έξοδο #1354 \n- Ενημέρωση της έκδοσης της βιβλιοθήκης και διόρθωση αντιγράφων ασφαλείας της βάσης δεδομένων #1510 \n- Ενημέρωση ExoPlayer 2.8.2 #1392\n  - Ανασχεδιάστηκε ο διάλογος ελέγχου της ταχύτητας αναπαραγωγής ώστε να υποστηρίζει διαφορετικά μεγέθη βημάτων για ταχύτερη αλλαγή ταχύτητας.\n  - Προστέθηκε μια εναλλαγή για γρήγορη μετακίνηση προς τα εμπρός κατά τη διάρκεια σιωπής στον έλεγχο ταχύτητας αναπαραγωγής. Αυτό θα πρέπει να είναι χρήσιμο για τα ακουστικά βιβλία και ορισμένα είδη μουσικής και μπορεί να φέρει μια πραγματικά απρόσκοπτη εμπειρία (και μπορεί να σπάσει ένα τραγούδι με πολλές σιωπές =\\\\).  \n  - Αναδιαμόρφωση της ανάλυσης πηγής πολυμέσων ώστε να επιτρέπεται η μετάδοση μεταδεδομένων μαζί με τα πολυμέσα εσωτερικά στον αναπαραγωγέα, αντί να γίνεται χειροκίνητα. Τώρα έχουμε μια ενιαία πηγή μεταδεδομένων και είναι άμεσα διαθέσιμα κατά την έναρξη της αναπαραγωγής.\n  - Διορθώθηκε η μη ενημέρωση των απομακρυσμένων μεταδεδομένων της λίστας αναπαραγωγής όταν είναι διαθέσιμα νέα μεταδεδομένα κατά το άνοιγμα του τμήματος της λίστας αναπαραγωγής.\n  - Διάφορες διορθώσεις στο UI: #1383, τα στοιχεία ελέγχου ειδοποίησης αναπαραγωγής στο παρασκήνιο είναι τώρα πάντα λευκά, είναι ευκολότερο να κλείσετε το αναδυόμενο πρόγραμμα αναπαραγωγής μέσω εκτίναξης\n- Χρήση νέου εξαηωγέα με ανασχεδιασμένη αρχιτεκτονική για πολλαπλές υπηρεσίες\n\n### Διορθώσεις\n\n- Διόρθωση #1440 Προβληματική διάταξη πληροφοριών βίντεο #1491 \n- Διόρθωση ιστορικού προβολής #1497\n  - #1495, ενημέρωση των μεταδεδομένων (μικρογραφία, τίτλος και αριθμός βίντεο) μόλις ο χρήστης αποκτήσει πρόσβαση στη λίστα αναπαραγωγής. \n  - #1475, με την καταχώριση μιας προβολής στη βάση δεδομένων όταν ο χρήστης ξεκινάει ένα βίντεο σε εξωτερική συσκευή αναπαραγωγής σε λεπτομερές θραύσμα.\n- Διόρθωση του χρονικού ορίου creen σε περίπτωση λειτουργίας αναδυόμενου παραθύρου. #1463 (Διορθώθηκε το #640)\n- Διόρθωση του κύριου προγράμματος αναπαραγωγής βίντεο #1509 \n  - #1412] Διορθώθηκε η λειτουργία επανάληψης που προκαλεί NPE του αναπαραγωγέα όταν λαμβάνεται νέα εντολή ενώ εργάζεται στο παρασκήνιο.\n  - Διορθώθηκε κατά την ελαχιστοποίηση του αναπαραγωγέα σε αναδυόμενο παράθυρο, να μην τον καταστρέφει όταν δεν έχει χορηγηθεί άδεια αναδυόμενου παραθύρου.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/68.txt",
    "content": "# αλλαγές της v0.14.1\n\n### Διορθώθηκε\n- Διορθώθηκε η αποτυχία αποκρυπτογράφησης url βίντεο #1659 \n- Διορθώθηκε ο σύνδεσμος περιγραφής που δεν εξάγεται καλά #1657\n\n# αλλαγές της v0.14.0\n\n### Νέα\n- Νέος σχεδιασμός συρταριού #1461\n- Νέα προσαρμόσιμη αρχική σελίδα #1461\n\n### Βελτιώσεις\n- Αναθεωρημένοι έλεγχοι χειρονομιών #1604 \n- Νέος τρόπος για να κλείσετε το αναδυόμενο πρόγραμμα αναπαραγωγής #1597\n\n### Διορθώσεις\n- Διόρθωση σφάλματος όταν ο αριθμός των συνδρομών δεν είναι διαθέσιμος. Κλείνει το #1649.\n  - Εμφάνιση της φράσης «Ο αριθμός των συνδρομητών δεν είναι διαθέσιμος» σε αυτές τις περιπτώσεις.\n- Διόρθωση NPE όταν μια λίστα αναπαραγωγής του YouTube είναι κενή\n- Γρήγορη διόρθωση για τα περίπτερα στο SoundCloud\n- Αναδιαμόρφωση και διόρθωση σφάλματος #1623 \n  - Διόρθωση κυκλικού αποτελέσματος αναζήτησης #1562\n  - Διόρθωση της γραμμής αναζήτησης που δεν είναι στατικά τοποθετημένη\n  - Διόρθωση Τα βίντεο YT Premium δεν μπλοκάρονται σωστά\n  - Διόρθωση Βίντεο που μερικές φορές δεν φορτώνονται (λόγω ανάλυσης DASH)\n  - Διόρθωση συνδέσμων στην περιγραφή βίντεο\n  - Εμφάνιση προειδοποίησης όταν κάποιος προσπαθεί να κάνει λήψη σε εξωτερική sdcard\n  - διόρθωση της εξαίρεσης που δεν εμφανίζεται τίποτα προκαλεί αναφορά\n  - η μικρογραφία δεν εμφανίζεται στο πρόγραμμα αναπαραγωγής στο παρασκήνιο για το Android 8.1 [δείτε εδώ](https://github.com/TeamNewPipe/NewPipe/issues/943)\n- Διορθώστε την εγγραφή του δέκτη εκπομπής. Κλείνει το #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/69.txt",
    "content": "### New\n- Μεγάλο πάτημα διαγραφής και κοινής χρήσης στις συνδρομές #1516 \n- UI tablet και διάταξη λίστας πλέγματος #1617 \n\n### Βελτιώσεις\n- αποθήκευση και επαναφόρτωση της τελευταίας χρησιμοποιούμενης αναλογίας διαστάσεων #1748 \n- Ενεργοποίηση γραμμικής διάταξης στη δραστηριότητα «Λήψεις» με πλήρη ονόματα βίντεο #1771 \n- Διαγραφή και κοινή χρήση συνδρομών απευθείας από την καρτέλα συνδρομών #1516 \n- Η δημιουργία ουράς ενεργοποιεί τώρα την αναπαραγωγή βίντεο εάν η ουρά αναπαραγωγής έχει ήδη ολοκληρωθεί #1783 \n- Ξεχωριστές ρυθμίσεις για τις χειρονομίες έντασης και φωτεινότητας #1644\n- Προσθήκη υποστήριξης για την τοπική προσαρμογή #1792\n\n### Διορθώσεις\n- Διορθώστε την ανάλυση της ώρας για τη μορφή ., ώστε το NewPipe να μπορεί να χρησιμοποιηθεί στη Φινλανδία\n- Διορθώστε την καταμέτρηση συνδρομών\n- Προσθήκη δικαιώματος υπηρεσίας foreground για συσκευές API 28+ #1830\n\n### Γνωστά σφάλματα\n- Η κατάσταση αναπαραγωγής δεν μπορεί να αποθηκευτεί στο Android P\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/70.txt",
    "content": "ΠΡΟΣΟΧΗ: Αυτή η έκδοση πιθανότατα έχει πολλά bugs, όπως και η προηγούμενη. Ωστόσο, λόγω του πλήρους τερματισμού λειτουργίας από την έκδοση 17, μια προβληματική έκδοση είναι καλύτερη από καμία έκδοση. Σωστά;  ¯\\_(ツ)_/¯\n\n### Βελτιώσεις\n* τα ληφθέντα αρχεία μπορούν πλέον να ανοιχτούν με ένα κλικ #1879\n* κατάργηση υποστήριξης για android 4.1 - 4.3 #1884\n* κατάργηση παλιού προγράμματος αναπαραγωγής #1884\n* κατάργηση ροών από την τρέχουσα ουρά αναπαραγωγής σύροντάς τες προς τα δεξιά #1915\n* κατάργηση της αυτόματης ροής σε ουρά όταν μια νέα ροή μπαίνει στην ουρά χειροκίνητα #1878\n* Επεξεργασία μετά την επεξεργασία για λήψεις και εφαρμογή ελλειπουσών λειτουργιών #1759 από @kapodamy\n* Υποδομή μετεπεξεργασίας\n* Σωστός χειρισμός σφαλμάτων \"υποδομής\" (για πρόγραμμα λήψης)\n* Ουρά αντί για πολλαπλές λήψεις\n* Μετακίνηση σειριοποιημένων εκκρεμών λήψεων (αρχεία `.giga`) στα δεδομένα εφαρμογής\n* Εφαρμογή μέγιστης επανάληψης λήψης\n* Σωστή παύση λήψης πολλαπλών νημάτων\n* Διακοπή λήψεων κατά τη μετάβαση σε δίκτυο κινητής τηλεφωνίας (δεν λειτουργεί ποτέ, δείτε το 2ο σημείο)\n* Αποθήκευση του αριθμού νημάτων για τις επόμενες λήψεις\n* Πολλά  Διορθώθηκαν οι ασυνέπειες\n\n### Διορθώθηκε\n* Διορθώθηκε το σφάλμα με την προεπιλεγμένη ανάλυση να έχει οριστεί στην καλύτερη και την περιορισμένη ανάλυση δεδομένων κινητής τηλεφωνίας #1835\n* διορθώθηκε το σφάλμα του αναδυόμενου προγράμματος αναπαραγωγής #1874\n* NPE κατά την προσπάθεια ανοίγματος του προγράμματος αναπαραγωγής φόντου #1901\n* Διορθώθηκε η εισαγωγή νέων ροών όταν είναι ενεργοποιημένη η αυτόματη ουρά #1878\n* Διορθώθηκε το πρόβλημα αποκρυπτογράφησης του shuttown\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/71.txt",
    "content": "### Βελτιώσεις\n* Προσθήκη ειδοποίησης ενημέρωσης εφαρμογής για την έκδοση GitHub (#1608 από @krtkush)\n* Διάφορες βελτιώσεις στο πρόγραμμα λήψης (#1944 από @kapodamy):\n* προσθήκη λευκών εικονιδίων που λείπουν και χρήση σκληροπυρηνικής μεθόδου για αλλαγή των χρωμάτων των εικονιδίων\n* έλεγχος εάν ο επαναλήπτης έχει αρχικοποιηθεί (διορθώσεις #2031)\n* δυνατότητα επανάληψης λήψεων με σφάλμα \"αποτυχία μετα-επεξεργασίας\" στον νέο πολυπλέκτη\n* νέος πολυπλέκτης MPEG-4 που διορθώνει μη σύγχρονες ροές βίντεο και ήχου (#2039)\n\n### Διορθώθηκε\n* Οι ζωντανές ροές YouTube σταματούν να αναπαράγονται μετά από σύντομο χρονικό διάστημα (#1996 από @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/730.txt",
    "content": "Επιδιόρθωση\n- Επίλυση ξανά του προβλήματος αποκρυπτογράφησης.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/770.txt",
    "content": "Αλλαγες στην έκδοση 0.17.2\n\nΕπιδιόρθωση:\n• Επιδιόρθωση του προβλήματος οταν το βίντεο δεν ήταν διαθέσιμο\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/820.txt",
    "content": "Επιδιόρθωση της function αποκρυπτογράφησης ονόματος regex η οποία απέτρεπε το YouTube απο το να λειτουργεί σωστά.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/830.txt",
    "content": "Ενημέρωση του SoundCloud client_id ώστε να διορθωθούν τα πρόβλημα του Sound Cloud.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/850.txt",
    "content": "Σε αυτή την έκδοση, η έκδοση της ιστοσελίδας του YouTube έχει ενημερωθεί. Η παλιά έκδοση του ιστότοπου θα σταματήσει να λειτουργεί τον Μάρτιο και γι'αυτό θα χρειαστεί να ενημερώσετε το NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/910.txt",
    "content": "Επιδιόρθωση μετεγκατάστασης της βάσης δεδομένων η οποία σε μερικές σπάνιες περιπτώσεις απέτρεπε το NewPipe να ξεκινήσει.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/950.txt",
    "content": "Η έκδοση αυτή φέρει τρείς μικρές επιδιορθώσεις:\n• Επιδιόρθωση πρόσβασης αποθηκευτικού χώρου για Adroid 10+\n• Επιδιόρθωση των kiosks ανοίγματος.\n• Επιδιόρθωση ανάλυσης της διάρκειας μεγάλων βίντεο\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/952.txt",
    "content": "Βελτίωση\n• Η αυτόματη αναπαραγωγή είναι διαθέσιμη για όλες τις υπηρεσίες (όχι μόνο για το YouTube)\n\nΕπιδιόρθωση\n• Επιδιορθώθηκαν σχετικές ροές μέσω της υποστήριξης νέων επεκτάσεων του YouTube\n• Επιδιορθώθηκαν βίντεο του YouTube με ηλικιακούς περιορισμούς\n• [Android TV] Επιδιορθώθηκε η παρατεταμένη εστίαση επισημασμένης επικάλυψης\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/953.txt",
    "content": "Επιδιόρθωση εξαγωγής της λειτουργίας αποκρυπτογράφησης του YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/955.txt",
    "content": "[YouTube] Επιδιόρθωση αναζήτησης για κάποιους χρήστες\n[YouTube] Επιδιόρθωση τυχαίων εξαιρέσεων αποκωδικοποίησης\n[SoundCloud] Οι τοποθεσίες ιστοτόπων που τελειώνουν με κάθετο αναλύονται σωστά τώρα πλέον\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/956.txt",
    "content": "[YouTube] Επιδιόρθωση σφάλματος κατά την φόρτωση οποιοδήποτε βίντεο\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/962.txt",
    "content": "Προστέθηκε \"πρόσφατα\" βίντεο στην υπηρεσία media.ccc.de.\nΠροστέθηκε ζωντανή ροή στην υπηρεσία media.ccc.de και επίσης υποστήριξη ζωντανής ροής.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/963.txt",
    "content": "• [YouTube] Διόρθωση της συνέχισης ενός καναλιού\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/996.txt",
    "content": "Διορθώθηκε μια NullPointerException κατά το άνοιγμα ενός καναλιού/συνεδρίου στο media.ccc.de.\nΟ Grinch προσπάθησε να σπάσει το χριστουγεννιάτικο δώρο μας προς εσάς, αλλά το διορθώσαμε.\n"
  },
  {
    "path": "fastlane/metadata/android/el/changelogs/999.txt",
    "content": "Αυτή η έκδοση επείγουσας επιδιόρθωσης διορθώνει σφάλματα HTTP 403 στη μέση των βίντεο του YouTube. Νέος • [SoundCloud] Προσθέστε υποστήριξη για διευθύνσεις URL on.soundcloud.com Βελτιωμένο • [Bandcamp] Εμφάνιση πρόσθετων πληροφοριών στο ραδιοφωνικό κιόσκι διορθώσεις • [YouTube] Διόρθωση περιστασιακών σφαλμάτων HTTP 403 στην αρχή ή στη μέση των βίντεο • [YouTube] Εξαγωγή avatar και banner από περισσότερους τύπους κεφαλίδων καναλιού • [Bandcamp] Διορθώστε διάφορα σφάλματα και χρησιμοποιείτε πάντα HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/el/full_description.txt",
    "content": "Το NewPipe δε χρησιμοποιεί καμία βιβλιοθήκη της Google, ή το API του YouTube. Αναλύει μόνο τον ιστότοπο για να αποκτήσει τις απαραίτητες πληροφορίες. Επομένως, αυτή η εφαρμογή μπορεί να χρησιμοποιηθεί σε συσκευές που δεν έχουν εγκατεστημένες τις υπηρεσίες της Google. Ακόμη, δεν απαιτείται λογαριασμός στο YouTube για τη χρήση του NewPipe και είναι ΕΛΛΑΚ.\n"
  },
  {
    "path": "fastlane/metadata/android/el/short_description.txt",
    "content": "Ένα δωρεάν ελαφρύ εμπρόσθιο τμήμα του YouTube για συσκευές Android.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/1000.txt",
    "content": "Improved\n• Make playlist description clickable to show more / less content\n• [PeerTube] Handle `subscribeto.me` instance links automatically\n• Only start playing single item in history screen\n\nFixed\n• Fix RSS button visibility\n• Fix seekbar preview crashes\n• Fix playlisting a thumbnail-less item\n• Fix exiting the download dialog before it appears\n• Fix related items list enqueue popup\n• Fix order in add to playlist dialog\n• Adjust the playlist bookmark item layout\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/1001.txt",
    "content": "Improved\n• Always allow changing player notification preferences on Android 13+\n\nFixed\n• Fix exporting database/subscriptions would not truncate an already existing file, possibly leading to a corrupted export\n• Fix player resuming from start when clicking on a timestamp"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/1002.txt",
    "content": "Fixed YouTube not playing any stream.\n\nThis release only addresses the most pressing error that prevents YouTube video details from loading.\nWe are aware there are other problems, and we will soon make a separate release to solve them.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/1003.txt",
    "content": "This is a hotfix release that fixes YouTube errors:\n• [YouTube] Fix not loading any video information, fix HTTP 403 errors while playing videos and restore playback of some age-restricted videos\n• Fix caption sizes not being changed\n• Fix downloading info twice when opening a stream\n• [Soundcloud] Remove unplayable DRM-protected streams\n• Updated translations\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/1004.txt",
    "content": "This release fixes YouTube only providing a 360p stream.\n\nNote that the solution employed in this version is likely temporary, and in the long run the SABR video protocol needs to be implemented, but TeamNewPipe members are currently busy so any help would be greatly appreciated! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/1005.txt",
    "content": "New\n• Add support for Android Auto\n• Allow setting feed groups as main screen tabs\n• [YouTube] Share as temporary playlist\n• [SoundCloud] Likes channel tab\n\nImproved\n• Better search bar hints\n• Show download date in Downloads\n• Use Android 13 per-app language\n\nFixed\n• Fix broken text colors in dark mode\n• [YouTube] Fix playlists not loading more than 100 items\n• [YouTube] Fix missing recommended videos\n• Fix crashes in History list view\n• Fix timestamps in comment replies"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/1006.txt",
    "content": "# Improved\nKeep current player when clicking on timestamps\nTry to recover pending download missions when possible\nAdd option to delete a download without also deleting file\nOverlay Permission: display explanatory dialog for Android > R\nSupport on.soundcloud link opening\nA lot of small improvements and optimizations\n\n# Fixed\nFix short count formatting for Android versions below 7\nFix ghost notifications\nFixes for SRT subtitle files\nFixed tons of crashes\n\n# Development\nInternal code modernization"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/1007.txt",
    "content": "This hotfix release fixes the \"Content not available\" error: YouTube videos can now be played again!\n\nIt also fixes a few bugs introduced in 0.28.1:\n• Playlist items dragging to only neighbor positions\n• Title/comments flickering between current and previous video\n• \"Start main player in fullscreen\" option not working\n\nOther improvements:\n• [YouTube] Allow rewinding livestreams up to 4 hours again\n• Don't load livestream video when playing in background\n• New UI for \"Remove watched\""
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/1008.txt",
    "content": "∙ Fixed resuming streams at the last playback position\n∙ [YouTube] Added support for more channel URL formats\n∙ [YouTube] Added support for more video metainfo formats\n∙ Updated translations"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/1009.txt",
    "content": "Important\nInformation on and call for action for the Keep Android Open campaign added: https://www.keepandroidopen.org/\n\nImproved\n[Feed] Shuffle the order outdated subscriptions are updated in\nDo not stack comment pages\nDo not pass click events to underlying views when clicking on video detail page\n\nFixed\nComment replies header layout without avatar image\nMultiple player-related UI fixes\n[SoundCloud] Fix streams with long IDs\n\nand more fixes and improvements!\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/63.txt",
    "content": "### Improvements\n- Import/export settings #1333 \n- Reduce overdraw (performance improvement) #1371 \n- Small code improvements #1375 \n- Add everything about GDPR #1420\n\n### Fixed\n- Downloader: Fix crash on loading unfinished downloads from .giga files #1407\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/64.txt",
    "content": "### Improvements\n- Added the ability to limit video quality if using mobile data. #1339 \n- Remember brightness for the session #1442 \n- Improve download performance for weaker CPUs #1431 \n- add (working) support for media session #1433\n\n### Fix\n- Fix crash on opening downloads (fix now available for release builds) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/65.txt",
    "content": "### Improvements\n\n- Disable burgermenu icon animation #1486 \n- undo delete of downloads #1472 \n- Download option in share menu #1498\n- Added share option to long tap menu #1454 \n- Minimize main player on exit #1354 \n- Library version update and database backup fix #1510 \n- ExoPlayer 2.8.2 Update #1392\n  - Reworked the playback speed control dialog to support different step sizes for faster speed change.\n  - 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 =\\\\).  \n  - 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.\n  - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened.\n  - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging\n- Use new extractor with refactored architecture for multiservice\n\n### Fixes\n\n- Fix #1440 Broken Video Info Layout #1491 \n- View history fix #1497\n  - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. \n  - #1475, by registering a view in the database when the user starts a video on external player on detail fragment.\n- Fix creen timeout in case of popup mode. #1463 (Fixed #640)\n- Main video player fix #1509 \n  - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background.\n  - Fixed minimizing player to popup does not destroy player when popup permission is not granted.\n\n\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/66.txt",
    "content": "# Changelog of v0.13.7\n\n### Fixed\n- Fix sort filter issues of v0.13.6\n\n# Changelog of v0.13.6\n\n### Improvements\n\n- Disable burgermenu icon animation #1486 \n- undo delete of downloads #1472 \n- Download option in share menu #1498\n- Added share option to long tap menu #1454 \n- Minimize main player on exit #1354 \n- Library version update and database backup fix #1510 \n- ExoPlayer 2.8.2 Update #1392\n  - Reworked the playback speed control dialog to support different step sizes for faster speed change.\n  - 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 =\\\\).  \n  - 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.\n  - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened.\n  - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging\n- Use new extractor with refactored architecture for multiservice\n\n### Fixes\n\n- Fix #1440 Broken Video Info Layout #1491 \n- View history fix #1497\n  - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. \n  - #1475, by registering a view in the database when the user starts a video on external player on detail fragment.\n- Fix creen timeout in case of popup mode. #1463 (Fixed #640)\n- Main video player fix #1509 \n  - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background.\n  - Fixed minimizing player to popup does not destroy player when popup permission is not granted.\n\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/68.txt",
    "content": "# changes of v0.14.1\n\n### Fixed\n- Fixed failed to decrypt video url #1659 \n- Fixed description link not extract well #1657\n\n# changes of v0.14.0\n\n### New\n- New Drawer design #1461\n- New customizable front page #1461\n\n### Improvements\n- Reworked Gesture controls #1604 \n- New way to close the popup player #1597\n\n### Fixed\n- Fix error when subscription count is not available. Closes #1649.\n  - Show \"Subscriber count not available\" in those cases\n- Fix NPE when a YouTube playlist is empty\n- Quick fix for the kiosks in SoundCloud\n- Refactor and bugfix #1623 \n  - Fix Cyclic search result  #1562\n  - Fix Seek bar not statically lay outed\n  - Fix YT Premium video are not blocked correctly\n  - Fix Videos sometimes not loading (due to DASH parsing)\n  - Fix links in video description\n  - Show warning when someone tries to download to external sdcard\n  - fix nothing shown exception triggers report\n  -  thumbnail not shown in background player for android 8.1 [see here](https://github.com/TeamNewPipe/NewPipe/issues/943)\n- Fix registering of broadcast receiver. Closes #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/69.txt",
    "content": "### New\n- Long-tap delete and share in subscriptions #1516 \n- Tablet UI and grid list layout #1617 \n\n### Improvements\n- store and reload the last used aspect ratio #1748 \n- Enable linear layout in Downloads activity with full video names #1771 \n- Delete and share subscriptions directly from within the subscriptions tab #1516 \n- Enqueuing now triggers video playing if the play queue has already ended #1783 \n- Separate settings for volume and brightness gestures #1644\n- Add support for Localization #1792\n\n### Fixes\n- Fix time parsing for . format, so NewPipe can be used in Finland\n- Fix subscription count\n- Add foreground service permission for API 28+ devices #1830\n\n### Known Bugs\n- Playback state can not be saved on Android P\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/70.txt",
    "content": "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? ¯\\_(ツ)_/¯\n\n### Improvements\n* downloaded files can now be opened with one click #1879 \n* drop support for android 4.1 - 4.3 #1884 \n* remove old player #1884 \n* remove streams from current play queue by swiping them to the right #1915 \n* remove auto queued stream when a new stream is enqueued manually #1878 \n* Postprocessing for downloads and implement missing features #1759 by @kapodamy\n  * Post-processing infrastructure\n  * Proper error handling \"infrastructure\" (for downloader)\n  * Queue instead of multiple downloads\n  * Move serialized pending downloads (`.giga` files) to app data\n  * Implement max download retry\n  * Proper multi-thread download pausing\n  * Stop downloads when swicthing to mobile network (never works, see 2nd point)\n  * Save the thread count for next downloads\n  * A lot of incoherences fixed\n\n### Fixed\n* Fix crash with default resolution set to best and limited mobile data resolution #1835\n* pop-up player crash fixed #1874 \n* NPE when trying to open background player #1901\n* Fix for inserting new streams when auto queuing is enabled #1878\n* Fixed the decypering shuttown issue \n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/71.txt",
    "content": "### Improvements\n* Add app update notification for GitHub build (#1608 by @krtkush)\n* Various improvements to the downloader (#1944 by @kapodamy):\n  * add missing white icons and use hardcored way for change the icon colors\n  * check if the iterator is initialized (fixes #2031)\n  * allow retry downloads with \"post-processing failed\" error in the new muxer\n  * new MPEG-4 muxer fixing non-synchronous video and audio streams (#2039)\n\n### Fixed\n* YouTube live streams stop playing after a short time (#1996 by @yausername)\n\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/730.txt",
    "content": "# Fixed\n- Hot fix decrypt function error again.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/740.txt",
    "content": "<h4>Improvements</h4>\n<ul>\n<li>make links in comments clickable, increase text size</li>\n<li>seek on clicking timestamp links in comments</li>\n<li>show preferred tab based on recently selected state</li>\n<li>add playlist to queue when long clicking on &#39;Background&#39; in playlist window</li>\n<li>search for shared text when it is not an URL</li>\n<li>add &quot;share at current time&quot; button to the main video player</li>\n<li>add close button to main player when video queue is finished</li>\n<li>add &quot;Play directly in Background&quot; to longpress menu for video list items</li>\n<li>improve English translations for Play/Enqueue commands</li>\n<li>small performance improvements</li>\n<li>remove unused files</li>\n<li>update ExoPlayer to 2.9.6</li>\n<li>add support for Invidious links</li>\n</ul>\n<h4>Fixed</h4>\n<ul>\n<li>fixed scroll w/ comments and related streams disabled</li>\n<li>fixed CheckForNewAppVersionTask being executed when it shouldn&#39;t</li>\n<li>fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title</li>\n<li>fix invalid YouTube url: signature tag name is not always \"signature\" preventing streams from loading</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/750.txt",
    "content": "New\nPlayback resume #2288\n• Resume streams where you stopped last time\nDownloader Enhancements #2149 \n• Use Storage Access Framework to store downloads on external SD-cards\n• New mp4 muxer\n• Optionally change the download directory before starting a download\n• Respect metered networks \n\n\nImproved\n• Removed gema strings #2295\n• Handle (auto)rotation changes during activity lifecycle #2444\n• Make long-press menus consistent #2368\n\nFixed\n• Fixed selected subtitle track name not being shown #2394\n• Do not crash when check for app update fails (GitHub version) #2423 \n• Fixed downloads stuck at 99.9% #2440\n• Update play queue metadata #2453 \n• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177\n\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/760.txt",
    "content": "Changes in 0.17.1\n\nNew\n• Thai localization\n\n\nImproved\n• Add start playing here action in long-press menus for playlists again #2518\n• Add switch for SAF / legacy file picker #2521\n\nFixed\n• Fix disappearing buttons in downloads view when switching apps #2487\n• Fix playback position is stored although watch history is disabled\n• Fix reduced performance caused by playback position in list views #2517\n• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186\n• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185\n\n\n\nChanges in 0.17.0\n\nNew\nPlayback resume #2288\n• Resume streams where you stopped last time\nDownloader Enhancements #2149 \n• Use Storage Access Framework to store downloads on external SD-cards\n• New mp4 muxer\n• Optionally change the download directory before starting a download\n• Respect metered networks \n\n\nImproved\n• Removed gema strings #2295\n• Handle (auto)rotation changes during activity lifecycle #2444\n• Make long-press menus consistent #2368\n\nFixed\n• Fixed selected subtitle track name not being shown #2394\n• Do not crash when check for app update fails (GitHub version) #2423 \n• Fixed downloads stuck at 99.9% #2440\n• Update play queue metadata #2453 \n• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177\n\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/770.txt",
    "content": "Changes in 0.17.2\n\nFix\n• Fix no video was available\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/780.txt",
    "content": "Changes in 0.17.3\n\nImproved\n• Added option to clear playback states #2550\n• Show hidden directories in the file picker #2591\n• Support URLs from `invidio.us` instances to be opened with NewPipe  #2488 \n• Add support for `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194\n\nFixed\n• [YouTube] Fixed 'java.lang.IllegalArgumentException #192\n• [YouTube] Fixed live streams not working TeamNewPipe/NewPipeExtractor#195\n• Fixed performance problem in android pie when downloading a stream #2592\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/790.txt",
    "content": "Improved\n• Add more titles to improve accessibility for blind people #2655\n• Make language of download folder setting more consistent and less ambiguous #2637\n\nFixed\n• Check if last byte in the block is downloaded #2646\n• Fixed scrolling in video detail fragment #2672\n• Remove double search clear box animations to one #2695\n• [SoundCloud] Fix client_id extraction #2745\n\nDevelopment\n• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535\n• Migrate to AndroidX #2685\n• Update to ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/800.txt",
    "content": "New\n• PeerTube support without P2P (#2201) [Beta]:\n  ◦ Watch and download videos from PeerTube instances\n  ◦ Add instances in the settings to access the complete PeerTube world\n  ◦ There might be problems with SSL handshakes on Android 4.4 and 7.1 when accessing certain instances resulting in a network error.\n\n• Downloader (#2679):\n  ◦ Calculate download ETA\n  ◦ Download opus (webm files) as ogg\n  ◦ Recover expired download links to resume downloads after a long pause\n\nImproved\n• Make the KioskFragment aware of changes in the preferred content country and improve performance of all main tabs #2742\n• Use new Localization and Downloader implementations from extractor #2713 \n• Make \"Default kiosk\" string translatable\n• Black navigation bar for black theme #2569\n\nFixed\n• Fixed a bug that could not move the popup player if another finger was placed while moving the popup player #2772 \n• Allow playlists missing an uploader and fix crashes related to this problem #2724, TeamNewPipe/NewPipeExtractor#219\n• Enabling TLS1.1/1.2 on Android 4.4 devices (API 19/KitKat) to fix TLS handshake with MediaCCC and some PeerTube instances  #2792\n• [SoundCloud] Fixed client_id extraction TeamNewPipe/NewPipeExtractor#217\n• [SoundCloud] Fix audio stream extraction\n\nDevelopment\n• Update ExoPlayer to 2.10.8 #2791, #2816\n• Update Gradle to 3.5.1 and add Kotlin support #2714 \n\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/810.txt",
    "content": "New\n• Show video thumbnail on the lock screen when playing in the background\n\nImproved\n• Add local playlist to queue when long pressing on background / popup button\n• Make main page tabs scrollable and hide when there is only a single tab\n• Limit amount of notification thumbnail updates in background player\n• Add dummy thumbnail for empty local playlists\n• Use *.opus file extension instead of *.webm and show \"opus\" in format label instead of \"WebM Opus\" in the download dropdown\n• Add button to delete downloaded files or download history in \"Downloads\"\n• [YouTube] Add support to /c/shortened_url channel links\n\nFixed\n• Fixed multiple issues when sharing a video to NewPipe and downloading its streams directly\n• Fixed player access out of its creation thread\n• Fixed search result paging\n• [YouTube] Fixed switching on null causing NPE\n• [YouTube] Fixed viewing comments when opening an invidio.us url\n• [SoundCloud] Updated client_id"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/820.txt",
    "content": "Fixed decrypt function name regex making YouTube unusable.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/830.txt",
    "content": "Updated SoundCloud client_id to fix SoundCloud issues.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/840.txt",
    "content": "New\n• Added language selector to change the app language\n• Added send to Kodi button to player collapsible menu\n• Added ability to copy comments on long press\n\nImproved\n• Fix ReCaptcha activity and correctly save obtained cookies\n• Removed dot-menu in favour of drawer and hide history button when watch history is not enabled in settings\n• Ask for display over other apps permission in settings correctly on Android 6 and later\n• Rename local playlist by long-clicking in BookmarkFragment\n• Various PeerTube improvements\n• Improved several English source strings\n\nFixed\n• Fixed player starting again although it is paused when option \"minimize on app switch\" enabled and NewPipe is minimized\n• Fix initial brightness value for gesture\n• Fixed .srt subtitle downloads containing not all line breaks\n• Fixed download to SD card failing because some Android 5 devices are not CTF compliant\n• Fixed downloading on Android KitKat\n• Fixed corrupt video .mp4 file being recognized as audio file\n• Fixed multiple localization problems, including wrong Chinese language codes\n• [YouTube] Timestamps in description are clickable again"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/850.txt",
    "content": "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."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/860.txt",
    "content": "Improved\n• Save and restore whether pitch and tempo are unhooked or not\n• Support display cutout in player\n• Round view and subscriber count\n• Optimized YouTube to use less data\n\nMore than 15 YouTube-related bugs were fixed in this release."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/870.txt",
    "content": "This is a hotfix release updating NewPipe to allow using SoundCloud without major hassles again.\nSoundCloud's v2 API is used in the extractor now and the detection of invalid client IDs has been improved."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/900.txt",
    "content": "New\n• Subscription groups and sorted feeds\n• Mute button in players\n\nImproved\n• Allow opening music.youtube.com and media.ccc.de links in NewPipe\n• Relocate two settings from Appearance to Content\n• Hide 5, 15, 25 second seek options if inexact seek is enabled\n\nFixed\n• some WebM videos are not seekable\n• database backup on Android P\n• crash when sharing a downloaded file\n• tons of YouTube extraction issue and more ..."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/910.txt",
    "content": "Fixed database migration which prevented NewPipe from starting in some rare cases."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/920.txt",
    "content": "Improved\n\n• Added upload date and view count on stream grid items\n• Improvements for the drawer header layout\n\nFixed\n\n• Fixed mute button causing crashes on API 19\n• Fixed downloading of long 1080p 60fps videos"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/930.txt",
    "content": "New\n• Search on YouTube Music\n• Basic Android TV support\n\nImproved\n• Added the ability to remove all watched videos from a local playlist\n• Show message when content isn't supported yet instead of crashing\n• Improved popup player resize with pinch gestures\n• Enqueue streams on long press on background and popup buttons in channel\n• Improved size handling of the drawer header title\n\nFixed\n• Fixed age restricted content setting not working\n• Fixed certain kinds of reCAPTCHAs\n• Fixed crash when opening bookmarks while playlist is `null`\n• Fixed detection of network related exceptions\n• Fixed visibility of group sort button in the subscriptions fragment\n\nand more\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/940.txt",
    "content": "New\n• Add support for SoundCloud comments\n• Add YouTube restricted mode setting\n• Show PeerTube parent channel details\n\nImproved\n• Show Kore button only for supported services\n• Block player gestures that begin at the NavigationBar or StatusBar\n• Change retry & subscribe buttons background color based on service color\n\nFixed\n• Fix download dialog freeze\n• Open in browser button now really opens in browser\n• Fix crash on opening videos and \"Could not play this stream\"\n\nand more\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/950.txt",
    "content": "This release brings three small fixes:\n• Fixed storage access on Adroid 10+\n• Fixed opening kiosks\n• Fixed duration parsing of long videos"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/951.txt",
    "content": "New\n• Add search for subscription picker in the feed group dialog\n• Add filter to the feed group dialog to show only ungrouped subscriptions\n• Add playlist tab to main page\n• Fast forward/rewind in background/pop-up player queue\n• Display search suggestion: did you mean & showing result for\n\nImproved\n• Drop writing application metadata in muxed files\n• Do not remove failed streams from the queue\n• Update status bar color to match toolbar color\n\nFixed\n• Fixed audio/video desync caused by floating point cumulative errors\n• [PeerTube] Handle deleted comments\n\nand more"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/952.txt",
    "content": "Improved\n• Auto-play is available for all services (instead of only for YouTube)\n\nFixed\n• Fixed related streams by supporting YouTube's new continuations\n• Fixed age restricted YouTube videos\n• [Android TV] Fixed lingering focus highlight overlay"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/953.txt",
    "content": "Fix extraction of YouTube's decryption function."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/954.txt",
    "content": "• new application workflow: play videos on detail page, swipe down to minimize player\n• MediaStyle notifications: customizable actions in notifications, performance improvements\n• basic resizing when using NewPipe as desktop app\n\n• show dialog with open options in case of an unsupported URL toast\n• Improve search suggestion experience when remote ones can't be fetched\n• Increased default video quality to 720p60 (in-app player) and 480p (pop-up player)\n\n• tons of bug fixes and more"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/955.txt",
    "content": "[YouTube] Fix search for some users\n[YouTube] Fix random decryption exceptions\n[SoundCloud] URLs that end with a slash are now parsed correctly"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/956.txt",
    "content": "[YouTube] Fixed crash when loading any video\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/957.txt",
    "content": "• Unify specific enqueue actions into one\n• Two finger gesture to close player\n• Allow clearing reCAPTCHA cookies\n• Option to not colorize notification\n• Improve how video details are opened to fix infinite buffering, buggy behaviour when sharing to NewPipe and other inconsistencies\n• Speed up YouTube videos and fix age restricted ones\n• Fix crash on fast forward/rewind\n• Don't rearrange lists by dragging thumbnails\n• Always remember popup properties\n• Add Santali language\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/958.txt",
    "content": "New and improved:\n• Re-added option to hide thumbnail on lock screen\n• Pull to refresh feed\n• Improved performance when fetching local lists\n\nFixed:\n• Fixed crash when starting NewPipe after it was removed from RAM\n• Fixed crash on startup when there is no internet connection\n• Fixed respecting brightness- and volume-gesture settings\n• [YouTube] Fixed long playlists\n\nOther:\n• Code cleanup and several internal improvements\n• Dependency updates\n• Translation updates"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/959.txt",
    "content": "Fixed endless loop of crashes after opening the error reporter.\nUpdated list of PeerTube instances which can be opened automatically by NewPipe.\nUpdated translations."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/960.txt",
    "content": "• Improved description of export database option in settings.\n• Fixed YouTube comments parsing.\n• Fixed display name of media.ccc.de service.\n• Updated translations."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/961.txt",
    "content": "• [YouTube] Mix support\n• [YouTube] Display info about public broadcasters and Covid-19\n• [media.ccc.de] Added recent videos\n• Added Somali translation\n\n• Many internal improvements\n\n• Fixed sharing videos from within the player\n• Fixed blank ReCaptcha webview\n• Fixed crash which occurred when removing a stream from a list\n• [PeerTube] Fixed related streams\n• [YouTube] Fixed YouTube Music search"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/962.txt",
    "content": "Added \"recent\" videos to media.ccc.de service.\nAdded live streams to media.ccc.de service and also live stream support."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/963.txt",
    "content": "• [YouTube] Fixed channel continuation\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/964.txt",
    "content": "• Added support for chapters in player controls\n• [PeerTube] Added Sepia search\n• Re-added share button in video detail view and moved stream description into the tab layout\n• Disable restoring brightness if brightness gesture is disabled\n• Added list item to play video on kodi\n• Fixed crash when no default browser is set on some devices and improve share dialogs\n• Toggle play/pause with hardware space button in fullscreen player\n• [media.ccc.de] Various fixes and improvements"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/965.txt",
    "content": "Fixed crash which occurred when reordering channel groups.\nFixed getting more YouTube videos from channels and playlists.\nFixed getting YouTube comments.\nAdded support for /watch/, /v/ and /w/ subpaths in YouTube URLs.\nFixed extraction of SoundCloud client id and geo-restricted content.\nAdded Northern Kurdish localization.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/966.txt",
    "content": "New:\n• Add a new service: Bandcamp\n\nImproved:\n• Add an option to have the app follow the device theme\n• Prevent some crashes by showing an improved error panel\n• Show more information on why content in unavailable\n• Hardware space button triggers play/pause\n• Show \"Download started\" toast\n\nFixed:\n• Fix very small thumbnail in video details while playing in the background\n• Fix empty title in minimized player\n• Fix last resize mode not being restored correctly\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/967.txt",
    "content": "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."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/968.txt",
    "content": "Added channel details option to long-press menu.\nAdded functionality to rename Playlist Name from playlist interface.\nAllow the user to pause while a video is buffering.\nPolished the white theme.\nFixed overlapping fonts when using a larger font size.\nFixed no video on Formuler and Zephier devices.\nFixed various crashes."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/969.txt",
    "content": "• Allow installation on external storage\n• [Bandcamp] Added support for displaying the first three comments on a stream\n• Only show 'download has started' toast when download is started\n• Do not set reCaptcha cookie when there is no cookie stored\n• [Player] Improve cache performance\n• [Player] Fixed player not automatically playing\n• Dismiss previous Snackbars when deleting downloads\n• Fixed trying to delete object not in list"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/970.txt",
    "content": "New\n• Show content metadata (tags, categories, license, ...) below the description\n• Added \"Show channel details\" option in remote (non-local) playlists\n• Added \"Open in browser\" option to long-press menu\n\nFixed\n• Fixed rotation crash on video detail page\n• Fixed \"Play with Kodi\" button in player always prompts to install Kore\n• Fixed and improved setting import and export paths\n• [YouTube] Fixed comment like count\nAnd much more\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/971.txt",
    "content": "Hotfix\n• Increase buffer for playback after rebuffer\n• Fixed crash on tablets and TVs when clicking on the play-queue icon in the player\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/972.txt",
    "content": "New\nRecognize timestamps and hashtags in description\nAdded manual tablet mode setting\nAdded ability to hide played items in a feed\n\nImproved\nSupport Storage Access Framework properly\nBetter error handling of unavailable and terminated channels\nThe Android share sheet for Android 10+ users now shows the content title.\nUpdated Invidious instances and support Piped links.\n\nFixed\n[YouTube] Age restricted content\nPrevent leaked window Exception when opening choice dialog\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/973.txt",
    "content": "Hotfix\n• Fix thumbnails and titles being trimmed in grid layout, due to a wrong calculation of how many videos can fit in one row\n• Fix download dialog disappearing without doing anything if opened from the share menu\n• Update a library related to opening external activities such as the Storage Access Framework file picker\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/974.txt",
    "content": "Hotfix\n• Fix buffering issues caused by YouTube throttling\n• Fix YouTube comments extraction and crashes with disabled comments\n• Fix YouTube music search\n• Fix PeerTube livestreams\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/975.txt",
    "content": "New\n• Show a thumbnail preview while seeking\n• Detect disabled comments\n• Allow marking a feed item as watched\n• Show comment hearts\n\nImproved\n• Improve metadata and tags layout\n• Apply service color to UI components\n\nFixed\n• Fix thumbnail in mini player\n• Fix endless buffering on duplicate queue items\n• Some player fixes like rotation and faster closing\n• Fix ReCAPTCHA remaining loaded in background\n• Disable clicks while refreshing feed\n• Fix some downloader crashes\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/976.txt",
    "content": "• Added option to directly open player in fullscreen\n• Allow choosing which types of search suggestions to show\n• Dark theme now darker + dark splash screen added\n• Improved file picker to gray out unwanted files\n• Fixed importing YouTube subscriptions\n• Replaying a stream requires on tap on the replay button again\n• Fixed closing audio session\n• [Android TV] Fixed long seekbar jumps when using a DPad\n\nTo see further changes, view the changelog (and blog post) from the Links tab below."
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/977.txt",
    "content": "• Added a \"play next\" button to the long press menu\n• Added YouTube shorts path prefix to intent filter\n• Fixed Settings import\n•  Swap seekbar position with player buttons in Queue screen\n• Various fixes related to MediasessionManager\n• Fixed seekbar not completed after video end\n• Disabled media tunneling on RealtekATV\n• Expanded minimized player buttons clickable area\n\nTo see further changes, view the changelog (and blog post) from the Links tab below.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/978.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/979.txt",
    "content": "- Fixed resuming playback\n- Improvements to ensure that the service which determines if NewPipe should check for a new version checks is not started in background"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/980.txt",
    "content": "New\n• Added \"Add to playlist\" option to share menu\n• Added support for y2u.be and PeerTube short links\n\nImproved\n• Made Playback-Speed-Controls more compact\n• Feed highlights new items now\n• \"Show watched items\" option in the feed is now saved\n\nFixed\n• Fixed YouTube likes and dislikes extraction\n• Fixed automatic replay after returning from the background\nAnd much more\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/981.txt",
    "content": "Removed MediaParser support to fix failing playback resume after buffering on Android 11+.\nDisabled media tunneling on Philips QM16XE to fix playback problems.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/982.txt",
    "content": "Fixed YouTube not playing any stream. "
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/983.txt",
    "content": "Add new double-tap-to-seek UI and behaviour\nMake settings searchable\nHighlight pinned comments as such\nAdd open-with-app support for FSFE's PeerTube instance\nAdd error notifications\nFix replay of first queue item on player change\nWait longer when buffering during livestreams before failing\nFix order of local search results\nFix empty item fields in play queue\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/984.txt",
    "content": "Load enough initial items in lists to fill the whole screen and to fix scrolling on tablets and TVs\nFix random crashes while scrolling through lists\nHave the player fast seek overlay arc go under the system UI\nRevert changes to cutouts when playing in multi window, causing the misplaced player regression on some phones\nIncrease compileSdk from 30 to 31\nUpdate error reporting library\nRefactor some code in the player\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/985.txt",
    "content": "Fixed YouTube not playing any stream"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/986.txt",
    "content": "New\n• Notifications for new streams\n• Seamless transition between background and video players\n• Change pitch by semitones\n• Append the main player queue to a playlist\n\nImproved\n• Remember speed/pitch step size\n• Mitigate initial long buffering in the video player\n• Improve player UI for Android TV\n• Confirm before deleting all downloaded files\n\nFixed\n• Fix media button not hiding player controls\n• Fix playback reset on player type change\n• Fix rotating the playlist dialog"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/987.txt",
    "content": "New\n• Support delivery methods other than progressive HTTP: faster playback loading time, fixes for PeerTube and SoundCloud, playback of recently-ended YouTube livestreams\n• Add button to add a remote playlist to a local one\n• Image preview in Android 10+ share sheet\n\nImproved\n• Improve playback parameters dialog\n• Move subscription import/export buttons to three-dot menu\n\nFixed\n• Fix removing fully watched videos from playlist\n• Fix share menu theme and \"add to playlist\" entry\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/988.txt",
    "content": "[YouTube] Fix \"Could not get any stream\" error when trying to play any video\n[YouTube] Fix \"The Following content is not available on this app.\" message shown instead of the video requested"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/989.txt",
    "content": "• [YouTube] Fix infinite loading when trying to play any video\n• [YouTube] Fix throttling on some videos\n• Upgrade the jsoup library to 1.15.3, which includes a security fix\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/990.txt",
    "content": "This release drops support for Android 4.4 KitKat, now the minimum version is Android 5 Lollipop!\n\nNew\n• Download from long-press menu\n• Hide future videos in feed\n• Share local playlists\n\nImproved\n• Refactor the player code into small components: less RAM used, less bugs\n• Improve thumbnails' scale mode\n• Vector-ize image placeholders\n\nFixed\n• Fix various issues with the player notification: outdated/missing media info, distorted thumbnail\n• Fix fullscreen using 1/4 of screen\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/991.txt",
    "content": "New\n• Add \"Open in browser\" button in error panel\n• Add option to display channel groups as list\n• [YouTube] Long-click on stream segments to share timestamp URL\n• Add play queue button to mini player\n\nImproved\n• Add Icelandic localization and updated many other translations\n• Many internal improvements\n\nFixed\n• Fix multiple crashes\n• [YouTube] Fix loading channels, non-dedicated feed and workaround playback issues in some countries\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/992.txt",
    "content": "New\n• Subscriber count in video details\n• Download from the queue\n• Permanently set a playlist thumbnail\n• Long-press hashtags and links\n• Card view mode\n\nImproved\n• Larger mini-player close button\n• Smoother thumbnail downscaling\n• Target Android 13 (API 33)\n• Seeking no longer pauses the player\n\nFixed\n• Fix overlay on DeX/mouse\n• Allow background player with no separate audio streams\n• Various YouTube fixes and more…"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/993.txt",
    "content": "New\n• Add warning when adding playlist duplicates and add button to remove them\n• Allow ignoring hardware buttons\n• Allow hiding partially watched videos in feed\n\nImproved\n• Use more grid columns on big screens\n• Make progress indicators consistent with settings\n\nFixed\n• Fix opening browser URLs, downloads and external players on Android 11+\n• Fix interacting with fullscreen requiring two taps on MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/994.txt",
    "content": "New\n• Support multiple audio tracks/languages\n• Allow setting volume and brightness gestures on any side of the screen\n• Support for displaying main-tabs at the bottom of the screen\n\nImproved\n• [Bandcamp] Handle tracks behind pay wall\n\nFixed\n• [YouTube] 403 HTTP errors for streams\n• Black player when switching to main player from playlist view\n• Player service memory leak\n• [PeerTube] Uploader and subchannel avatars were swapped\n\nand more\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/995.txt",
    "content": "New\n• Support channel tabs\n• Select image quality\n• Get URLs to all images\n\nImproved\n• Accessibility of player interfaces\n• Better audio selection for video-only downloads\n• Option to include playlist and video names to shared playlist content\n\nFixed\n• [YouTube] Fix getting like count\n• Fix player not responding popups and crashes\n• Selection of wrong languages in language picker\n• Player audio focus was not respecting mute\n• Playlist item addition occasionally not working"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/996.txt",
    "content": "Fixed a NullPointerException when opening a channel / conference in media.ccc.de.\nThe Grinch tried to break our Christmas gift to you, but we fixed it.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/997.txt",
    "content": "New\n• Add comment replies\n• Allow reordering playlists\n• Show playlist description and duration\n• Allow resetting settings\n\nImproved\n• [Android 13+] Restore custom notification actions\n• Request consent for update check\n• Allow notification play/pause while buffering\n• Reorder some settings\n\nFixed\n• [YouTube] Fix comments not loading, plus other fixes and improvements\n• Solve vulnerability in settings import and switch to JSON\n• Various download fixes\n• Trim search text"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/998.txt",
    "content": "Fixed YouTube not playing any stream because of HTTP 403 errors.\n\nOccasional HTTP 403 errors in the middle of a YouTube video are not fixed yet.\nThat issue will be addressed in another hotfix release as soon as possible.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/changelogs/999.txt",
    "content": "This hotfix release fixes HTTP 403 errors in the middle of YouTube videos.\n\nNew\n• [SoundCloud] Add support for on.soundcloud.com URLs\n\nImproved\n• [Bandcamp] Show additional info in radio kiosk\n\nFixed\n• [YouTube] Fix occasional HTTP 403 errors at the beginning or in the middle of videos\n• [YouTube] Extract avatar and banner from more channel header types\n• [Bandcamp] Fix various bugs and always use HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "content": "NewPipe does not use any Google framework libraries, or the YouTube API. It only parses the website in order to gain the information it needs. Therefore this app can be used on devices without Google Services installed. Also, you don't need a YouTube account to use NewPipe, and it's FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "content": "A free lightweight YouTube frontend for Android.\n"
  },
  {
    "path": "fastlane/metadata/android/en_GB/changelogs/1000.txt",
    "content": "Improved\n• Make playlist description clickable to show more / less content\n• [PeerTube] Handle `subscribeto.me` instance links automatically\n• Only start playing single item in history screen\n\nFixed\n• Fix RSS button visibility\n• Fix seekbar preview crashes\n• Fix playlisting a thumbnail-less item\n• Fix exiting the download dialog before it appears\n• Fix related items list enqueue popup\n• Fix order in add to playlist dialog\n• Adjust the playlist bookmark item layout\n"
  },
  {
    "path": "fastlane/metadata/android/en_GB/changelogs/1001.txt",
    "content": "Improved\n• Always allow changing player notification preferences on Android 13+\n\nFixed\n• Fix exporting database/subscriptions would not truncate an already existing file, possibly leading to a corrupted export\n• Fix player resuming from start when clicking on a timestamp\n"
  },
  {
    "path": "fastlane/metadata/android/en_GB/changelogs/1002.txt",
    "content": "Fixed YouTube not playing any stream.\n\nThis release only addresses the most pressing error that prevents YouTube video details from loading.\nWe are aware there are other problems, and we will soon make a separate release to solve them.\n"
  },
  {
    "path": "fastlane/metadata/android/en_GB/changelogs/1003.txt",
    "content": "This is a hotfix release that fixes YouTube errors:\n• [YouTube] Fix not loading any video information, fix HTTP 403 errors while playing videos and restore playback of some age-restricted videos\n• Fix caption sizes not being changed\n• Fix downloading info twice when opening a stream\n• [Soundcloud] Remove unplayable DRM-protected streams\n• Updated translations\n"
  },
  {
    "path": "fastlane/metadata/android/en_GB/changelogs/1004.txt",
    "content": "This release fixes YouTube only providing a 360p stream.\n\nNote that the solution employed in this version is likely temporary, and in the long run the SABR video protocol needs to be implemented, but TeamNewPipe members are currently busy so any help would be greatly appreciated! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/en_GB/changelogs/1005.txt",
    "content": "New\n• Add support for Android Auto\n• Allow setting feed groups as main screen tabs\n• [YouTube] Share as temporary playlist\n• [SoundCloud] Likes channel tab\n\nImproved\n• Better search bar hints\n• Show download date in Downloads\n• Use Android 13 per-app language\n\nFixed\n• Fix broken text colours in dark mode\n• [YouTube] Fix playlists not loading more than 100 items\n• [YouTube] Fix missing recommended videos\n• Fix crashes in History list view\n• Fix timestamps in comment replies\n"
  },
  {
    "path": "fastlane/metadata/android/en_GB/changelogs/63.txt",
    "content": "### Improvements\n- Import/export settings #1333 \n- Reduce overdraw (performance improvement) #1371 \n- Small code improvements #1375 \n- Add everything about GDPR #1420\n\n### Fixed\n- Downloader: Fix crash on loading unfinished downloads from .giga files #1407\n"
  },
  {
    "path": "fastlane/metadata/android/en_GB/changelogs/64.txt",
    "content": "### Improvements\n- Added the ability to limit video quality if using mobile data. #1339 \n- Remember brightness for the session #1442 \n- Improve download performance for weaker CPUs #1431 \n- add (working) support for media session #1433\n\n### Fix\n- Fix crash on opening downloads (fix now available for release builds) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/en_GB/full_description.txt",
    "content": "NewPipe does not use any Google framework libraries, or the YouTube API. It only parses the website in order to gain the information it needs. Therefore this app can be used on devices without Google Services installed. Also, you don't need a YouTube account to use NewPipe, and it's FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/en_GB/short_description.txt",
    "content": "A free lightweight YouTube frontend for Android.\n"
  },
  {
    "path": "fastlane/metadata/android/eo/changelogs/63.txt",
    "content": "### Plibonigojn\n- Importi/eksporti konfiguraĵojn #1333\n- Malpliigi superdesegnaĵon (rendimentan plibonigon) #1371\n- Malgrandajn kodajn plibonigojn #1375\n- Aldoni ĉion pri GDPR #1420\n\n### Fiksitaj\n- Elŝutilo: Fiksi kraŝon kiam ŝarĝi malfinitajn elŝutaĵojn el .giga-j dosieroj #1407\n"
  },
  {
    "path": "fastlane/metadata/android/eo/full_description.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/eo/short_description.txt",
    "content": "Libera kaj plumpeza fasado por Jutubo por Androido.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/1000.txt",
    "content": "Mejorado\n• Lista de reproducción muestra más/menos contenido\n• [PeerTube] Manejar automáticamente las instancia de subscribeto.me.\n• Reproducir único elemento en el historial\n\nCorregido\n• Visibilidad del botón RSS\n• Bloqueos en la barra de búsqueda.\n• Reproducción de un elemento sin miniaturas\n• Salir del cuadro de diálogo de descarga antes de que aparezca\n• Lista de elementos relacionados a la cola\n• Orden al añadir a la lista de reproducción\n• Diseño de favoritos en lista de reproducción\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/1001.txt",
    "content": "Mejorado\n• Permitir siempre cambiar las preferencias de notificación del reproductor en Android 13+\n\nCorregido\n• Al exportar bases de datos/suscripciones no se truncaba un archivo ya existente, lo que podía dar lugar a una exportación corrupta\n• El reproductor se reiniciaba desde el principio al hacer clic en una marca de tiempo\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/1002.txt",
    "content": "Arreglo en YouTube no reproduciendo flujos\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/1003.txt",
    "content": "Arreglo en YouTube no reproduciendo flujos\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/1004.txt",
    "content": "Arreglo en YouTube no reproduciendo flujos\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/1005.txt",
    "content": "Nuevo\nAñadido soporte a Android Auto  \nPemitir configurar grupos de feeds como pestaña en la pantalla principal  \n[YouTube] Compartir como playlist temporal  \n[SoundCloud] Pestaña de likes en el canal  \n \nMejoras\nMejores sugerencias en la barra de busqueda  \nMostrar la fecha de descargas en Descargas  \nUsar el idioma por aplicacion en Android 13  \n  \nArreglos\nArreglado texto de colores rotos en el modo oscuro  \n[YouTube] Solucionado el problema que las playlist con mas de 100 elementos no cargaban\n[YouTube] Solucionado problema de no mostrar los videos recomendados\nSolucionado cierres inesperados en vista de listas en Historial\nArreglado marcas de tiempo en respuestas de comentarios\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/1006.txt",
    "content": "#Mejoras\nMantener el reproductor actual al hacer clic en marcas de tiempo.\nIntentar recuperar descargas pendientes cuando sea posible.\nAñadir opción para eliminar una descarga sin borrar el archivo.\nPermiso de superposición: mostrar diálogo explicativo en Android 11 y superior.\nSoporte para abrir enlaces on.soundcloud.\nMuchas pequeñas mejoras y optimizaciones.\n\n#Corregido\nFormato corto de conteos en Android inferior a 7.\nNotificaciones fantasma.\nProblemas con archivos de subtítulos SRT.\nNumerosos crashes.\n\n#Desarrollo\nModernización interna del código.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/1007.txt",
    "content": "Arreglo en YouTube no reproduciendo flujos\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/63.txt",
    "content": "### Mejoras\n- Importar/exportar configuraciones #1333 \n- Reducción de sobreescritura (mejora de rendimiento) #1371 \n- Pequeñas mejoras de código #1375 \n- Agregado todo lo referente al RGPD #1420\n\n### Arreglos\n- Descargas: Solución al fallo generado al recuperar descargas no finalizadas por medio de archivos .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/64.txt",
    "content": "### Mejoras\n- Capacidad para limitar la calidad de video si se están usando datos móviles. #1339\n- Recordar brillo para la sesión #1442\n- Mejorado el rendimiento de descarga en procesadores débiles #1431\n- Agregado soporte para sesiones multimedia #1433\n\n### Arreglos\n- Arreglado crasheo al abrir descargas #1441\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/65.txt",
    "content": "### Mejoras\n\n- Desactivar la animación del icono del burgermenu #1486 \n- Deshacer la eliminación de descargas #1472 \n- Opción de descarga en el menú de compartir #1498\n- Añadida la opción de compartir en el menú de pulsación larga #1454 \n- Minimizar el reproductor principal al salir #1354 \n- Actualización de la versión de la biblioteca y corrección de la copia de seguridad de la base de datos #1510 \n- Actualización de ExoPlayer 2.8.2 #1392\n  - Se ha rediseñado el diálogo de control de la velocidad de reproducción para que admita diferentes tamaños de paso para un cambio de velocidad más rápido.\n  - Se ha añadido una opción para avanzar rápidamente durante los silencios en el control de la velocidad de reproducción. Esto debería ser útil para los audiolibros y ciertos géneros musicales, y puede traer una verdadera experiencia sin problemas (y puede romper una canción con muchos silencios =\\).  \n  - Se ha refactorizado la resolución de la fuente de medios para permitir pasar los metadatos junto a los medios internamente en el reproductor, en lugar de hacerlo manualmente. Ahora tenemos una única fuente de metadatos y está directamente disponible cuando se inicia la reproducción.\n  - Se ha corregido que los metadatos de las listas de reproducción remotas no se actualizan cuando hay nuevos metadatos disponibles al abrir el fragmento de la lista de reproducción.\n  - Varias correcciones de la interfaz de usuario: #1383, los controles de notificación del reproductor en segundo plano ahora siempre son blancos, es más fácil apagar el reproductor emergente mediante el lanzamiento\n- Usar nuevo extractor con arquitectura refactorizada para multiservicio\n\n### Correcciones\n\n- Arreglo #1440 Diseño de información de vídeo roto #1491 \n- Arreglo del historial de visualización #1497\n  - #1495, actualizando los metadatos (miniatura, título y recuento de vídeos) en cuanto el usuario accede a la lista de reproducción \n  - #1475, registrando una vista en la base de datos cuando el usuario inicia un vídeo en un reproductor externo en el fragmento de detalle.\n- Arreglar el tiempo de espera de Creen en caso de modo emergente. #1463 (Arreglado #640)\n- Arreglo del reproductor de vídeo principal #1509 \n  - [#1412] Corregido el modo de repetición que provoca NPE en el reproductor cuando se recibe una nueva intención mientras la actividad del reproductor está en segundo plano.\n  - Corregido que al minimizar el reproductor a la ventana emergente no se destruye el reproductor cuando el permiso de la ventana emergente no está concedido.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/66.txt",
    "content": "# Cambios de v0.13.7\n\n### Fijado\n- Arreglar problemas de lod filtros de ordenación de la v0.13.6\n\n# Cambios de la v0.13.6\n\n### Mejoras\n\n- Desactivar la animación drl icono de burgermenu #1486 \n- deshacer borrar las descargas #1472 \n- Descargar opción en el menú compartido #1498 \n- Añadida opción de compartir al menú #1454 \n- Minimizar el jugador principal en la salida #1354 \n- Actualización de la versión de biblioteca y copia de seguridad de la base de datos #1510 \n- ExoPlayer 2.8.2 Actualización #1392\n  - Reelaborado el diálogo de control de velocidad de reproducción para admitir diferentes tamaños de pasos para un cambio de velocidad más rápido.\n  - Añadido un conmutador para avanzar rápido durante los silencios en el control de velocidad de reproducción. Esto debería ser útil para audiolibros y ciertos géneros musicales, y puede traer una verdadera experiencia perfecta (y puede romper una canción con muchos silencios =\\\\).  \n  - Resolución de fuente de medios refactorizada para permitir la transmisión de metadatos junto con los medios internamente en el reproductor, en lugar de hacerlo manualmente. Ahora tenemos una única fuente de metadatos y está directamente disponible cuando comienza la reproducción.\n  - Se ha corregido que los metadatos de la lista de reproducción remota no se actualizan cuando los nuevos metadatos están disponibles cuando se abre el fragmento de la lista de reproducción.\n  - Varias correcciones de interfaz de usuario: #1383, controles de notificación del reproductor de fondo ahora siempre blanco, más fácil de apagar el reproductor emergente a través de flinging\n- Utilice un nuevo extractor con arquitectura refactorizada para multiservicio\n\n### Fijaciones\n\n- Arreglar #1440 Broken Video Info Layout #1491 \n- Ver el historial correctivo #1497\n  - #1495, actualizando los metadatos (miniatura, título y recuento de vídeos) en cuanto el usuario acceda a la lista de reproducción. \n  - #1475, registrando una vista en la base de datos cuando el usuario inicia un vídeo en reproductor externo sobre fragmentos de detalle.\n- Arreglar tiempo de espera en caso de modo emergente. #1463 (Arreglar #640) \n- Corrección principal del reproductor de video #1509 \n  - [#1412] Se corrige el modo de repetición que provoca NPE del reproductor cuando se recibe una nueva intent mientras la actividad del reproductor está en segundo plano.\n  - Corregido minimizar el reproductor a popup no destruye el reproductor cuando no se concede el permiso de popup.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/68.txt",
    "content": "# cambios de la v0.14.1\n\n### Arreglado\n- Arreglado el fallo de descifrar la url del vídeo #1659 \n- Corregido el enlace de descripción que no se extrae bien #1657\n\n# cambios de la v0.14.0\n\n### Nuevo\n- Nuevo diseño del drawer #1461\n- Nueva página frontal personalizable #1461\n\n### Mejoras\n- Mejora de los controles gestuales #1604 \n- Nueva forma de cerrar el reproductor emergente #1597\n\n### Corregido\n- Corregido el error cuando el recuento de suscripciones no está disponible. Cierra #1649.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/69.txt",
    "content": "- La puesta en cola ahora activa la reproducción de vídeo si la cola de reproducción ya terminó #1783 \n- Ajustes separados para los gestos de volumen y brillo #1644\n- Añadir soporte para la localización #1792\n\n### Correcciones\n- Corregir parse en .format, para que NewPipe se pueda utilizar en Finlandia\n- Corregir el recuento de suscripciones\n- Añadir permiso de servicio en primer plano para dispositivos API 28+ #1830\n\n### Bugs conocidos\n- El estado de la reproducción no se guarda en Android P\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/70.txt",
    "content": "ATENCIÓN: Esta versión quizá sea un festival de errores, como la anterior. Sin embargo, debido al cierre total desde la 17. una versión rota es mejor que ninguna versión. ¿Cierto? ¯\\_(ツ)_/¯\n\n### Mejorías\n* los archivos descargados ahora pueden ser abiertos con un solo clic #1879 \n* descenso de soporte para android 4.1 - 4.3 #1884 \n* eliminar el reproductor antiguo #1884 \n* eliminar los flujos de la cola de reproducción actual deslizándolos hacia la derecha #1915 \n* eliminar cola de reproducción automática cuando se pone en cola una nueva secuencia manualmente #1878 \n* Posprocesamiento para descargas e implementación de características faltantes #1759 por @kapodamy\n  * Infraestructura de posprocesamiento\n  * Infraestructura de manejo de errores adecuada (para el descargador)\n  * Cola en lugar de descargas múltiples\n* Mover las descargas pendientes serializadas (archivos `.giga`) hacia datos de aplicación\n  * Implementar el reintento máximo de descarga\n  * Pausa adecuada de descargas multihilo\n* Detener las descargas cuando se cambia hacia red móvil (nunca funciona, ver 2º punto)\n* Guardar el conteo de hilos para las próximas descargas\n  * Un montón de incoherencias corregidas\n\n### Corregidos\n* Arreglado el fallo con la resolución por defecto ajustada a la mejor y resolución de datos móviles limitada #1835\n* Arreglado el fallo del reproductor emergente #1874 \n* NPE al intentar abrir el reproductor en segundo plano #1901\n* Corrección de la inserción de nuevos flujos cuando la cola automática está activada #1878\n* Corregido el problema de descifrado de shuttown\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/71.txt",
    "content": "### Mejoras\n* Añadir notificación de actualización de la aplicación para la versión de GitHub (#1608 por @krtkush)\n* Varias mejoras en el gestor de descargas (#1944 de @kapodamy):\n* añadir los iconos blancos que faltan y utilizar la manera de cambiar los colores de los iconos\n  * comprobar si el iterador está inicializado (corrige #2031)\n  * permite reintentar las descargas con el error \"post-procesamiento fallido\" en el nuevo muxer\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/730.txt",
    "content": "# Corregido\n-Parche rápido del error de la función de descifrado de nuevo.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/740.txt",
    "content": "<h4>Mejorías</h4>\n<ul>\n<li>hacer cliqueables enlaces en comentarios, aumentar el tamaño del texto</li>\n<li>buscar al hacer clic en enlaces de marca de tiempo en comentarios</li>\n<li>mostrar pestaña preferida según el estado seleccionado recientemente</li>\n<li>añadir lista de reproducción a cola cuando se hace un clic largo en &#39;Fondo&#39; en ventana de lista de reproducción</li>\n<li>buscar texto compartido cuando no es una URL</li>\n<li>añadir botón &quot;compartir en el momento actual&quot; al reproductor de vídeo principal</li>\n<li>añadir botón de cierre a reproductor principal cuando la cola de vídeo haya terminado</li>\n<li>añadir &quot;Reproducir directamente en segundo plano&quot; a menú de pulsación larga para elementos lista de vídeos</li>\n<li>mejorar traducciones a inglés de comandos Reproducir/PonerEnCola</li>\n<li>pequeñas mejorías de rendimiento</li>\n<li>eliminar archivos no utilizados</li>\n<li>actualizar ExoPlayer a 2.9.6</li>\n<li>añadir soporte para enlaces Invidious</li>\n</ul>\n<h4>Arreglado</h4>\n<ul>\n<li>arreglado desplazamiento con comentarios y flujos relacionados desactivados</li>\n<li>arreglado que TareaBuscarNuevaVersiónDeApp se ejecute cuando no debería</li>\n<li>corregida la importación de suscripciones a YouTube: ignorar las que tienen URL inválida y mantener las que tienen el título vacío</li>\narreglar URL inválida de YouTube: nombre de etiqueta de firma no es siempre \"firma\", lo que impide cargar flujos</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/750.txt",
    "content": "Nuevo\nReanudación de la reproducción #2288\n- Reanudar la reproducción donde se detuvo la última vez\nMejoras en el gestor de descargas #2149 \n- Utilizar el marco de acceso al almacenamiento para guardar las descargas en tarjetas SD externas\n- Nuevo mp4 muxer\n- Opción de cambiar el directorio de descarga antes de iniciar una descarga\n- Respetar las redes con contador \n\n\nMejorado\n- Eliminación de las cadenas de gema #2295\n- Manejar cambios de (auto)rotación en el ciclo de vida de la actividad #2444\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/760.txt",
    "content": "Cambios en 0.17.1\n\nNuevo\n•Localización tailandesa\n\n\nMejora de\n•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\n•Añadir interruptor para SAF / legado selector de archivos #2521\n\nCorregido\n• Arreglar la desaparición de los botones en la vista de descargas al cambiar de aplicación #2487\n• Arreglar que la posición de reproducción se almacene aunque el historial de visionado esté desactivado\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/770.txt",
    "content": "Cambios en 0.17.2\n\nCorregido\n- Corregido, el video no estaba disponible\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/780.txt",
    "content": "Cambios en 0.17.3\n\nSe ha mejorado\n• Añadida la opción de borrar los estados de reproducción #2550\n• Mostrar directorios ocultos en el selector de archivos #2591\n• Soportar URLs de instancias de `invidio.us` para ser abiertas con NewPipe #2488 \n• Añadir soporte para URLs de `music.youtube.com` TeamNewPipe/NewPipeExtractor#194\n\nCorregido\n- YouTube] Corregido 'java.lang.IllegalArgumentException #192\n- YouTube] Arreglado que las transmisiones en directo no funcionan TeamNewPipe/NewPipeExtractor#195\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/790.txt",
    "content": "Mejorado\n• Añadir más títulos para mejorar la accesibilidad de los invidentes #2655\n• Hacer que el lenguaje de la configuración de la carpeta de descarga sea más consistente y menos ambiguo #2637\n\nCorregido\n• Comprobar si se descarga el último byte del bloque #2646\n• Corregido el desplazamiento en el fragmento de detalle del vídeo #2672\n• Eliminar las animaciones de doble caja de búsqueda a una sola #2695\n• [SoundCloud] Arreglar la extracción de client_id #2745\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/800.txt",
    "content": "Nuevo\n• Soporte de PeerTube sin P2P (#2201) [Beta]:\n  ◦ Ver y descargar vídeos de las instancias de PeerTube.\n  ◦ Añadir instancias en la configuración para acceder al mundo completo de PeerTube\n  ◦ 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.\n\n• Gestor de descargas (#2679):\n  ◦ Calcular el tiempo estimado de descarga\n  ◦ Descargar opus (archivos webm) como ogg\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/810.txt",
    "content": "Nuevo\n- Mostrar la miniatura del vídeo en la pantalla de bloqueo cuando se reproduce en segundo plano\n\nMejorado\n- Añadir la lista de reproducción local a la cola cuando se hace una pulsación larga en el botón de fondo / emergente\n- Hacer que las pestañas de la página principal se puedan desplazar y ocultar cuando sólo hay una pestaña\n- Limitar la cantidad de actualizaciones de miniaturas de notificación en el reproductor de fondo\n- Añadir una miniatura ficticia para listas de reproducción locales vacías\n- 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\n- Añadir un botón para eliminar archivos descargados o el historial de descargas en \"Descargas\"\n- [YouTube] Añadir soporte a los enlaces de canal /c/shortened_url\n\nCorregidos\n- Corregidos múltiples problemas al compartir un video a NewPipe y al descargar sus secuencias directamente\n- Corregido el acceso al reproductor fuera de su hilo de creación\n- Corregida la paginación de resultados de búsqueda\n- [YouTube] Corregido el cambio a nulo que causaba NPE\n- [YouTube] Corregida la visualización de comentarios al abrir una url de invidio.us\n- [SoundCloud] Actualizado client_id\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/820.txt",
    "content": "Corregida la función \"regex\" que hacia a YouTube inusable.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/830.txt",
    "content": "Se actualizo SoundCloud client_id para corregir los problemas con SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/840.txt",
    "content": "Nuevo\n• Selector de idioma añadido para cambiar el idioma\n• Se agregó el botón Enviar a Kodi al menú desplegable del reproductor.\n• Se agregó la capacidad de copiar comentarios al presionar prolongadamente\n\nMejorado\n• Corrige la actividad de ReCaptcha y guarda correctamente las cookies obtenidas\n• 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\n• Solicitar permiso para mostrar sobre otras aplicaciones en la configuración en Android 6 y versiones posteriores\n• Cambiar el nombre de la lista de reproducción local haciendo clic largo en BookmarkFragment\n• Varias mejoras de PeerTube\n• Varias cadenas fuente en inglés mejoradas\n\nFijado\n• 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\n• Fijar el valor de brillo inicial para el gesto\n• Se corrigieron las descargas de subtítulos .srt que no contenían todos los saltos de línea.\n• Se corrigió la falla de la descarga a la tarjeta SD porque algunos dispositivos con Android 5 no son compatibles con CTF\n• Descarga fija en Android KitKat\n• Se corrigió el archivo corrupto de video .mp4 que se reconoce como archivo de audio\n• Se corrigieron múltiples problemas de localización, incluidos códigos de idioma chino incorrectos.\n• [YouTube] Las marcas de tiempo en la descripción se pueden volver a hacer clic\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/850.txt",
    "content": "En esta versión, el sitio web de Youtube fue actualizado. La antigua versión será descontinuada en marzo y será necesario actualizar NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/860.txt",
    "content": "Mejorado\n- Guardar y restaurar si el tono y el tempo están desenganchados o no\n- Soporte de recorte de pantalla en el reproductor\n- Redondeo de vistas y recuento de suscriptores\n- Optimizado YouTube para utilizar menos datos\n\nEn esta versión se han corregido más de 15 errores relacionados con YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/870.txt",
    "content": "Esta es una versión de hotfix que actualiza NewPipe para permitir el uso de SoundCloud sin mayores problemas de nuevo.\nLa API v2 de SoundCloud se utiliza ahora en el extractor y se ha mejorado la detección de IDs de clientes no válidos.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/900.txt",
    "content": "Nuevo\n- Grupos de suscriptores y feeds ordenados\n- Botón de silencio en reproductores\n\nMejora de\n- Permitir la apertura de enlaces music.youtube.com y media.ccc.de en NewPipe\n- Reubicar dos ajustes de Apariencia a Contenido\n- Ocultar opciones de búsqueda de 5, 15 y 25 seg. si activada búsqueda inexacta\n\nCorregido\n- algunos vídeos WebM no pueden ser buscados\n- copia de seguridad de base de datos en Android P\n- caída al compartir un archivo descargado\n- montones de problema de extracción de YouTube y más ...\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/910.txt",
    "content": "Se ha corregido la migración de la base de datos que impedía que NewPipe se iniciara en algunos casos raros.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/920.txt",
    "content": "Mejorado\n\n- Se ha añadido la fecha de carga y el recuento de vistas en los elementos de la cuadrícula de flujo\n- Mejoras en el diseño de la cabecera del cajón\n\nCorregido\n\n- Arreglado el botón de silencio que provoca fallos en la API 19\n- Corregida la descarga de vídeos largos de 1080p 60fps\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/930.txt",
    "content": "Nuevo\n- Búsqueda en YouTube Music\n- Soporte básico de Android TV\n\nMejorías de\n- Añadida la opción de borrar todos los vídeos vistos de lista de reproducción local\n- Mostrar mensaje cuando el contenido aún no es compatible en lugar de caída\n- Mejora del tamaño del reproductor emergente con gestos de pellizco\n- Puesta en cola de flujos con presión prolongada de botones de fondo y emergentes en el canal\n- Mejora de la gestión del tamaño del título de la cabecera de cajón\n\nCorregido\n- Arreglado ajuste restringido de contenido por edad que no funciona\n- Corregidos ciertos tipos de reCAPTCHAs\n- Fallo corregido al abrir marcadores mientras lista de reproducción es \"nula\".\n- Corregida la detección de excepciones relacionadas con la red\n- Corregida visibilidad de botón de clasificación de grupos en fragmento de suscripciones\n\ny más\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/940.txt",
    "content": "Nuevos\n- Añadir soporte para los comentarios de SoundCloud\n- Añadir la configuración del modo restringido de YouTube\n- Mostrar los detalles del canal padre de PeerTube\n\nMejora de\n- Mostrar el botón Kore sólo para los servicios compatibles\n- Bloquear gestos de reproductor que inician en NavigationBar o StatusBar\n- Cambio color fondo de botones reintento y suscripción según color de servicio\n\nArreglados\n- Corregido el congelamiento del diálogo de descarga\n- El botón \"Abrir en navegador\" ahora se abre realmente en navegador\n- Arreglo de colapso al abrir vídeos y \"No se pudo reproducir este flujo\"\n\ny más\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/950.txt",
    "content": "Esta versión repara tres pequeños errores:\n• Reparado el acceso a almacenamiento en Android 10+\n• Reparada la apertura de quioscos\n• Reparado el análisis de duración de videos largos\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/951.txt",
    "content": "Nuevo\n• Búsqueda para suscripciones en grupos del feed\n• Filtros para mostrar suscripciones sin agrupar\n• Pestaña de listas de reproducción en la página principal\n• Ir adelante y atrás en la cola del reproductor de fondo y en miniatura\n• Sugerencias de búsqueda\n\nMejorado\n• Ya no se escriben metadatos de la app en archivos unidos\n• No se borran streams fallados de la cola\n• Se actualiza el color de la barra de estado\n\nReparado\n• Desincronización de audio y video\n• [PeerTube] Comentarios borrados\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/952.txt",
    "content": "Mejorado\n• Reproducción automática disponible para todos los servicios (no sólo para YouTube)\n\nArreglado\n• Streams relacionados, gracias al soporte de las nuevas continuaciones de YouTube\n• Videos con restricción de edad en YouTube\n• [Android TV] Superposición de los destacados de foco persistente\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/953.txt",
    "content": "Se reparó la función de decriptación de YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/954.txt",
    "content": "• nueva función: mira videos en la página de detalles, desliza hacia abajo para minimizar el reproductor\n• notificaciones MediaStyle: acciones personalizables, mejoras de rendimiento\n• cambiar tamaño de videos al usar NewPipe como app de escritorio\n\n• diálogo con opciones en caso de una URL no soportada\n• se mejoraron las sugerencias de búsqueda cuando no se pueden obtener remotamente\n• se incrementó la calidad de video a 720p60 (en la app) y 480p (en miniatura)\n\n• muchos errores reparados y más\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/955.txt",
    "content": "[YouTube] Corrección de la búsqueda para algunos usuarios\n[YouTube] Corrección de excepciones en el descifrado aleatorio\n[SoundCloud] Las URL que terminan con una barra, ahora se analizan correctamente\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/956.txt",
    "content": "[YouTube] Arreglado crasheo cargando cualquier video\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/957.txt",
    "content": "• Unificacion de acciones de cola\n• Gesto de 2 dedos para cerrar el reproductor\n• Permitir borrado de cookies reCAPTCHA\n• Descolorizar la notificación\n• Mejoras en detalles de video para prevenir carga infinita, bugs al compartir y otras inconsistencias\n• Acelerar videos y arreglo de los de edad restringida\n• Arreglo en crasheo cuando se recorría en el video\n• No reordenar listas agarrando miniaturas\n• Recordar opciones del pop up\n• Añadido el lenguaje Santali\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/958.txt",
    "content": "Nuevo/ Mejoras:\n• Opción de ocultar miniatura en pantalla de bloqueo\n• Deslizar para actualizar el feed\n• Rendimiento mejorado para listas\n\nArreglos:\n• Crasheos cuando se iniciaba la app tras cerrarla en RAM\n• Crasheos cuando no había internet\n• Gestos de brillo y volumen\n• [YouTube] listas largas\n\nOtros:\n• Limpieza en código y mejoras internas\n• Dependencias actualizadas\n• Traducciones\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/959.txt",
    "content": "Arreglado un bucle interminable de caídas después de abrir el reportador de errores.\nLista actualizada de instancias de PeerTube que pueden ser abiertas automáticamente por NewPipe.\nTraducciones actualizadas.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/960.txt",
    "content": "- Se ha mejorado la descripción de la opción de exportar la base de datos en los ajustes.\n- Se ha corregido el análisis de los comentarios de YouTube.\n- Se ha corregido el nombre de media.ccc.de.service\n- Actualizadas las traducciones.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/961.txt",
    "content": "- [YouTube] Apoyo a la mezcla\n- [YouTube] Mostrar información sobre las emisoras públicas y Covid-19\n- [media.ccc.de] Añadidos vídeos recientes\n- Añadida la traducción al somalí\n\n- Muchas mejoras internas\n\n- Se ha corregido la posibilidad de compartir vídeos desde el reproductor\n- Corregida la vista web de ReCaptcha en blanco\n- Corregido el fallo que se producía al eliminar un stream de una lista\n- [PeerTube] Corregidos los flujos relacionados\n- [YouTube] Corregida la búsqueda de música en YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/962.txt",
    "content": "Se han añadido vídeos \"recientes\" a media.ccc.de.service\nAñadidas las transmisiones en directo a media.ccc.de.service y también la compatibilidad con las transmisiones en directo.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/963.txt",
    "content": "• [YouTube] Arregló la continuación de canal\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/964.txt",
    "content": "- Soporte añadido para capítulos en controles del reproductor\n- [PeerTube] Añadida la búsqueda de Sepia\n- Botón compartir reañadido en vista detalles de vídeo y descripción de secuencia movida a diseño de pestaña\n- Desactivar restauración de brillo si gesto de brillo desactivado\n- Añadido el elemento de lista para reproducir vídeo en kodi\n- Fallo corregido si no hay navegador por defecto en ciertos dispositivos, diálogos compartir mejorados\n- Alternar reproducción/pausa con botón de espacio de hardware en reproductor de pantalla completa\n- [media.ccc.de] Varias correcciones y mejoras\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/965.txt",
    "content": "Se ha corregido el fallo que se producía al reordenar los grupos de canales.\nSe ha corregido la obtención de más vídeos de YouTube desde los canales y las listas de reproducción.\nSe ha corregido la obtención de comentarios de YouTube.\nSe ha añadido soporte para las sub-rutas /watch/, /v/ y /w/ en las URLs de YouTube.\nSe ha corregido la extracción del identificador de cliente de SoundCloud y del contenido con restricciones geográficas.\nAñadida la localización en kurdo del norte.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/966.txt",
    "content": "Nuevo:\n- Añadir un nuevo servicio: Bandcamp\n\nMejorados:\n- Añadir una opción para que la app siga el tema del dispositivo\n- Evitar algunos colapsos mostrando un panel de error mejorado\n- Mostrar más información sobre razón de contenido no disponible\n- Botón de espacio de hardware activa reproducción/pausa\n- Mostrar brindis de \"Descarga iniciada\"\n\nCorregidos:\n- Arreglar miniatura chica en detalles de vídeo durante reproducción de fondo\n- Arreglar título vacío en el reproductor minimizado\n- Arreglar último modo de redimensionamiento no restaurable correctamente\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/967.txt",
    "content": "Se ha solucionado el problema de que YouTube no funcione correctamente en la UE. Esto fue causado por un nuevo sistema de cookies y consentimiento de privacidad que requiere que NewPipe establezca una cookie de CONSENTIMIENTO.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/968.txt",
    "content": "Opción de detalles de canal añadida a menú de pulsación larga.\nFunción añadida de cambiar Nombre de Lista de Reproducción desde su interfaz.\nPermitir al usuario pausar video almacenando en memoria intermedia.\nSe ha pulido el tema blanco.\nSolapamiento corregido de fuentes al usar un tamaño mayor de fuente.\nAusencia de video corregida en dispositivos Formuler y Zephier.\nSe han corregido varios fallos.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/969.txt",
    "content": "- Permitir instalación en almacenamiento externo\n- Bandcamp] Soporte añadido para mostrar 3 primeros comentarios en una secuencia\n- Sólo mostrar brindis de \"descarga iniciada\" cuando la descarga inicia\n- No establecer la cookie reCaptcha si no hay cookies almacenadas\n- [Reproductor] Mejorar el rendimiento de la caché\n- [Reproductor] Arreglado reproductor sin reproducción automática\n- Descartar Snackbars anteriores al borrar descargas\n- Corregido intento de eliminar objetos fuera de lista\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/970.txt",
    "content": "Nuevos\n- Mostrar metadatos de contenido (etiquetas, categorías, licencia, ...) bajo descripción\n- Opción añadida \"Mostrar detalles de canal\" en listas de reproducción remotas (no locales)\n- Opción añadida \"Abrir en navegador\" en menú de pulsación larga\n\nCorregidos\n- Fallo corregido de rotación en la página de detalles de vídeo\n- Botón corregido \"Reproducir con Kodi\" en reproductor que siempre pide instalar Kore\n- Corregido y mejorado ajuste de rutas de importación y exportación\n- [YouTube] Corregido el recuento de comentarios preferidos\nY mucho más\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/971.txt",
    "content": "Hotfix\n- Aumento del búfer para la reproducción después del rebuffer\n- Corregido el fallo en tabletas y televisores al hacer clic en el icono de la cola de reproducción en el reproductor\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/972.txt",
    "content": "Nuevo\nReconocimiento de marcas de tiempo y hashtags en descripción\nAñadido ajuste manual del modo tableta\nAñadida la posibilidad de ocultar elementos ya reproducidos en feed\n\nMejorado\nSoporte adecuado para el sistema de acceso al almacenamiento (SAF)\nMejor manejo de los errores en canales no disponibles y eliminados\nEl menú de compartir para usuarios de Android 10+ ahora muestra el título del contenido\nActualizadas instancias de Invidious y soporte para enlaces de Piped\n\n... y otras correcciones\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/973.txt",
    "content": "Corrección en caliente\n- Corrección de miniaturas y títulos recortados en diseño de cuadrícula, por cálculo erróneo de cuántos vídeos caben en 1 fila\n- Corrección de diálogo de descarga que desaparece sin hacer nada si se abre desde menú compartir\n- Actualización de biblioteca relacionada con apertura de actividades externas, como selector de archivos de Marco de Acceso a Almacenamiento\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/974.txt",
    "content": "Hotfix\n- Corrección de los problemas de almacenamiento en el búfer causados por el estrangulamiento de YouTube\n- Corrección de la extracción de comentarios de YouTube y de los fallos con los comentarios desactivados\n- Corrección de la búsqueda de música en YouTube\n- Corrección de las transmisiones en directo de PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/975.txt",
    "content": "Nuevo\n• Muestra una miniatura mientras se busca\n• Detecta comentarios desactivados\n• Permite marcar un elemento del feed como visto\n• Muestra comentarios encorazonados\n\nMejorado\n• Metadatos y diseño de etiquetas\n• Aplica color de servicio a componentes de la IU\n\nCorregido\n• Miniaturas en el mini player\n• Buffering infinito en elementos duplicados de la lista de espera\n• Correcciones del reproductor como la rotación y el cerrado\n• Cargado de ReCAPTCHA en segundo plano\n• Y otras correcciones más\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/976.txt",
    "content": "• Opción para abrir reproductor directamente en pantalla completa\n• Escoge que tipo de sugerencias de búsqueda mostrar\n• Tema oscuro más oscuro + splash screen oscura\n• Selector de archivos mejorado\n• Importación de YouTube corregida\n• Reanudar stream requiere pulsar botón de reproducción otra vez\n• Corregido cierre de sesión de audio\n• [Android TV] Corregidos saltos en barra de reproducción al usar DPad\n\nPara ver más cambios, revisa nuestro registro (y blog) en la pestaña de enlaces de abajo.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/977.txt",
    "content": "• Añade botón de \"reproducir siguiente\" al menú presionado\n• Añadido prefijo de ruta de YouTube Shorts\n• Corregida importación de ajustes\n• Intercambio entre barra y botones en pantalla de cola\n• Correcciones relacionadas con MediasessionManager\n• Corregida barra incompleta al terminar video\n• Desactivado túnel de medios en RealtekATV\n• Ampliada zona de pulsación en botones del reproductor minimizado\n\nPara ver más cambios, revisa nuestro registro (y blog) en la pestaña de enlaces de abajo.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/978.txt",
    "content": "Se ha corregido la comprobación de nuevas versiones de NewPipe. Esta operación a veces se ejecutaba de manera prematura, provocando cierres inesperados en la aplicación. Ese error debiese estar corregido ahora.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/979.txt",
    "content": "- Reanudación de reproducción corregida\n- Mejoras para asegurar que el servicio, que determina si NewPipe debe buscar una nueva versión, no se inicie en segundo plano\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/980.txt",
    "content": "Nuevos\n- Opción añadida \"Añadir a lista de reproducción\" a menú compartir\n- Soporte añadido para enlaces cortos de y2u.be y PeerTube\n\nMejorados\n- Controles de velocidad de reproducción más compactos\n- Feed destaca ahora nuevos elementos\n- Ahora se guarda la opción \"Mostrar elementos vistos\" en feed\n\nCorregidos\n- Extracción corregida de \"likes\" y \"dislikes\" de YouTube\n- Repetición automática corregida después de volver del fondo\nY mucho más\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/981.txt",
    "content": "Eliminada la compatibilidad con MediaParser para poder solucionar problemas de reanudación de la reproducción tras el almacenamiento en búfer en Android 11+.\nDeshabilitado el túnel de medios en Philips QM16XE para poder solucionar problemas de reproducción.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/982.txt",
    "content": "Arreglado el fallo por el cuál YouTube no reproducía ningún stream.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/983.txt",
    "content": "Añadir una nueva interfaz de usuario y comportamiento de doble pulsación para buscar\nHacer que se pueda buscar en los ajustes\nResaltar los comentarios anclados como tales\nAñadir compatibilidad con aplicaciones abiertas para la instancia PeerTube de la FSFE\nAñadir notificaciones de error\nArreglar la repetición del primer elemento de la cola al cambiar de jugador\nEsperar más tiempo en el búfer durante las transmisiones en directo antes de fallar\nCorregir el orden de los resultados de la búsqueda local\nArreglar los campos de elementos vacíos en la cola de reproducción\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/984.txt",
    "content": "Carga suficientes elementos iniciales en listas para llenar pantalla entera y arreglo desplazamiento en tabletas y televisores\nArreglar fallos aleatorios al desplazarse por las listas\nHacer que arco de superposición de búsqueda rápida de reproductor vaya bajo la IU de sistema\nRevertir cambios en cortes al reproducir en multiventana, que causan regresión de reproductor desubicado en teléfonos\nAumentar compileSdk de 30 a 31\nActualizar la biblioteca de informes de errores\nRefactorizar algunos códigos en reproductor\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/985.txt",
    "content": "Arreglo en YouTube no reproduciendo flujos\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/986.txt",
    "content": "Nuevos\n- Notificaciones de nuevos flujos\n- Transición perfecta entre fondo y reproductores de vídeo\n- Cambio de tono por semitonos\n- Añadir cola de reproductor principal a lista de reproducción\n\nMejorías\n- Recordar el tamaño del paso de velocidad/tono\n- Mitigar el largo buffering inicial en el reproductor de vídeo\n- Mejor interfaz de usuario de reproductor para Android TV\n- Confirmar antes de borrar todos los archivos descargados\n\nCorregidos\n- Arreglar botón multimedia no oculta controles de reproductor\n- Corregir reinicio reproducción al cambiar tipo de reproductor\n- Arreglar rotación de diálogo de lista de reproducción\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/987.txt",
    "content": "Nuevos\n- Soporta métodos de entrega distintos a HTTP progresivo: tiempo más rápido de carga de reproducción, arreglos PeerTube y SoundCloud, reproducción de livestreams YouTube recién terminados\n- Botón para añadir una lista de reproducción remota a una local\n- Vista previa de imagen en hoja de compartir de Android 10+\n\nMejorías\n- Mejorar diálogo de parámetros de reproducción\n- Mover botones de importación/exportación de suscripciones a menú de 3 puntos\n\nArreglados\n- Arreglar eliminación de vídeos totalmente vistos de lista de reproducción\n- Tema corregido de menú compartir y entrada \"añadir a lista de reproducción\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/988.txt",
    "content": "[YouTube] Arreglo error \"No se pudo obtener flujo\" al intentar reproducir videos\n[YouTube] Arreglo el mensaje \"Siguiente contenido no disponible en esta aplicación\" en lugar de video solicitado\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/989.txt",
    "content": "- YouTube] Arreglo carga infinita al tratar de reproducir videos\n- YouTube] Arreglo de ralentización de algunos vídeos\n- Actualización de biblioteca jsoup a versión 1.15.3, con un arreglo de seguridad\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/990.txt",
    "content": "Esta versión deja de soportar Android 4.4 KitKat, ¡ahora la versión mínima es Android 5 Lollipop!\n\nNuevos\n- Descarga desde menú de pulsación larga\n- Ocultar futuros vídeos en feed\n- Compartir listas de reproducción locales\n\nMejorados\n- Refactorización de código de reproductor en componentes pequeños: menos RAM usada, menos errores\n- Mejorar el modo de escala de miniaturas\n- Vectorizar marcadores de posición de imágenes\n\nCorregidos\n- Arreglos varios con notificación de reproductor: antigua/falta información de medios, miniatura distorsionada\n- Arreglo pantalla completa usa 1/4 de pantalla\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/991.txt",
    "content": "Nuevo\n* Se añadió el botón \"Abrir en el navegador\" en el panel de error.\n* Se añadió la opción de mostrar grupos de canales como lista.\n* [YouTube] Haga click prolongado en un segmento del stream para compartir la URL del tiempo exacto.\n* Se añadió el botón \"Abrir en el navegador\" en el panel de error.\n\nMejorado\n* Se añadió localización de Islandés y se actualizaron muchas otras traducciones.\n* Muchas mejoras internas\n\nArreglado\n* Se arreglaron múltiples crasheos.\n* [YouTube] Se arreglaron las cargas de canales, feeds no dedicados y problemas de contenido en algunos países\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/992.txt",
    "content": "Nuevo\n• Número de suscriptores en los detalles del video\n• Descarga desde la cola\n• Establecer permanentemente una miniatura de lista de reproducción\n• Hashtags y enlaces con pulsación de larga duración\n• Modo de vista de tarjeta\n\nMejorado\n• Botón de cierre del minirreproductor más grande\n• Reducción de escala de miniaturas más suave\n• Objetivo Android 13 (API 33)\n• Buscar ya no detiene el reproductor\n\nArreglos\n• Solucionar superposición en DeX/ratón\n• Permitir reproductor de fondo sin transmisiones de audio separadas\n• Varias correcciones de YouTube y más…\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/993.txt",
    "content": "Nuevo\n• Aviso al poner duplicados en lista de reproducción y botón para quitarlos\n• Ignorar botones físicos\n• Ocultar videos vistos a medias en el feed\n\nMejorado\n• Más columnas en pantallas grandes\n• Indicadores de progreso sean consistentes con la configuración\n\nSolucionado\n• Abrir URL del navegador, descargas y reproductores externos en Android 11+\n• Interación en pantalla completa, requería dos toques en MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/994.txt",
    "content": "Nuevo\n• Admite múltiples pistas de audio/idiomas\n• Configurar gestos de volumen y brillo en la pantalla\n• Mostrar pestañas principales en la parte inferior de la pantalla\n\nMejorado\n• [Bandcamp] Maneja las pistas detrás del muro de pago\n\nFijado\n• [YouTube] errores HTTP 403 para transmisiones\n• Reproductor en negro al cambiar al reproductor principal desde la lista de reproducción\n• Pérdida de memoria del reproductor\n• [PeerTube] Se intercambiaron los avatares del subcanal y del cargador.\n\ny más\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/995.txt",
    "content": "Nuevo\n• Pestañas de canal\n• Calidad de imagen\n• URLs de las imágenes\n\nMejora de\n• Accesibilidad de las interfaces de los reproductores\n• Mejor selección de audio para descargas de vídeo\n• Incluir nombres de listas de reproducción y vídeos en listas compartidas\n\nCorregido\n• [YouTube] Corrección del recuento \"Me gusta\"\n• Ventanas emergentes y bloqueos\n• Idiomas incorrectos en selector de idiomas\n• Audio del reproductor no respetaba silencio\n• La lista de reproducción no funcionaba ocasionalmente\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/996.txt",
    "content": "Corregida una NullPointerException al abrir un canal / conferencia en media.ccc.de.\nEl Grinch trató de romper nuestro regalo de Navidad para usted, pero lo arreglamos.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/997.txt",
    "content": "Nuevo\n• Añadir respuestas a comentarios\n• Reordenar listas de reproducción\n• Mostrar descripción y duración de listas de reproducción\n• Restaurar ajustes\n\nMejorado\n• [Android 13+] acciones de notificación personalizadas\n• Permiso para comprobar actualizaciones\n• Reproducir/pausar notificaciones al almacenar en búfer\n• Algunos ajustes\n\nCorregido\n• [YouTube] Corregir comentarios que no se cargan y mejoras\n• Fallo al importar de ajustes y JSON\n• Corrección de varias descargas\n• texto de búsqueda\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/998.txt",
    "content": "Se solucionó el problema por el cual YouTube no reproducía ninguna transmisión debido a errores HTTP 403. \n\nLos errores HTTP 403 ocasionales en medio de un video de YouTube aún no se han solucionado. \nEse problema se solucionará en otra liberación de solución de errores lo antes posible.\n"
  },
  {
    "path": "fastlane/metadata/android/es/changelogs/999.txt",
    "content": "Esta versión corrige errores HTTP 403 en medio de los videos de YouTube.\n\nNuevo\n• [SoundCloud] Agregar soporte para URL on.soundcloud.com\n\nMejorado\n• [Bandcamp] Mostrar información adicional en el quiosco de radio\n\nCorregido\n• [YouTube] Se corrigen errores HTTP 403 ocasionales al principio o en el medio de los videos.\n• [YouTube] Extraer avatar y banner de más tipos de encabezado de canal\n• [Bandcamp] Corrige varios errores y usa siempre HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/es/full_description.txt",
    "content": "NewPipe no usa librerías de Google ni la API de YouTube. Solamente analiza el sitio web para obtener la información que necesita. Por lo tanto esta app puede ser utilizada en dispositivos que no tengan los servicios de Google instalados. Además, no necesitas una cuenta de YouTube para usar NewPipe, y es FLOSS (software libre y de código abierto).\n"
  },
  {
    "path": "fastlane/metadata/android/es/short_description.txt",
    "content": "Un cliente de YouTube gratuito y ligero para Android.\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/1000.txt",
    "content": "Täiendused\n• Esitusloend on kokku/lahtiklikatav \n• [PeerTube] `subscribeto.me` serverite lingid toimivad automaatselt\n• Käivitame ajaloost vaid ühe rakenduse instantsi\n\nParandused\n• RSSi nupu nähtavus\n• Otsinguriba eelvaate kokkujooksmine\n• Pisipildita kirje lisamine esitusloendisse\n• Allalaadimisvaate sulgemine enne avamist\n• Seotud kirjed esitusloendi hüpikaknas\n• Esitusloendisse lisamise järjekord\n• Esitusloendi järjehoidjate kirjete paigutus\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/1001.txt",
    "content": "Täiendused\n• Meediaesitaja teavituste seadistusi saab Android 13+ puhul alati muuta\n\nParandused\n• Parandasime olukorra, kus andmebaasi/tellimuste eksport ei tühjendanud olemasolevat faili, põhjustades sellega vigase varukoopia tekkimise\n• Parandasime esituse jätkamise klõpsides ajatemplil\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/1002.txt",
    "content": "Parandasime vea, kus ühtegi YouTube'i meediavoogu ei õnnestunud esitada.\n\nSee versioon parandab vaid hetkel kõige olulisema vea, kus YouTube'i video andmeid ei õnnestunud laadida.\nMe oleme teadlikud ka muudest vigadest ning nendega tegeleme hiljem.\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/1003.txt",
    "content": "See on kiirparandus, mis teeb korda need YouTube'i vead:\n• [YouTube] Parandasime vea, kus ühtegi meediavoogu ei õnnestunud esitada, parandasime HTTP 403-tüüpi vead videote esitamisel ja taastasime mõnede vanusepiirangutega videote esitamise\n• Parandasime vea, kus subtiitrite suurus ei muutunud\n• Parandasime vea, kus meediavoo avamisel laadisime tema teabe kaks korda alla\n• [Soundcloud] eemaldasime mitteesitatavad DRM-kaitsega meediavood\n• Uuendasime tõlkeid\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/1005.txt",
    "content": "Uus\n• Android Auto tugi\n• Meedivoogude grupid põhivaates\n• [YouTube] Jagamine ajutise esitusloendina\n• [SoundCloud] Meeldimiste kanali vahekaart\n\nTäiendatud\n• Paremad otsinguvihjed\n• Allalaadimise kuupäev vastavas vaates\n• Android 13 puhul rakendusekohane keel\n\nParandatud\n• Tekstivärvid tumedas kujundused\n• [YouTube] Esitusloend ei laadinud üle 100 kirje\n• [YouTube] Puuduvad videosoovitused\n• Ajaloovaate kookujooksmine\n• Ajatemplid kommentaaride vastustes\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/63.txt",
    "content": "### Täiustused\n- Impordi/ekspordi seaded #1333\n- Ülejoonistamise vähendamine (jõudluse parendus) #1371\n- Väikesed koodi täiustused #1375\n- Lisandus igasugune kasutaja andmete kaitse (GDPR) tugi #1420\n\n### Parandused\n- Alla laadija: Parandati krahh, mille põhjustas katkenud .giga failide alla laadimine #1407\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/64.txt",
    "content": "### Täiustused\n- Lisatud võimalus piirata videokvaliteeti mobiilse andmeside kasutamisel. #1339\n- Pea seansi heledus meeles #1442\n- Parandatud allalaadimise jõudlust nõrgematel protsessoritel #1431\n- Lisatud (töötav) tugi meediaseansile #1433\n\n### Parandus\n- Parandatud allalaadimiste avamisel tekkinud krahh #1441\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/962.txt",
    "content": "Lisasime hiljutiste videote kuvamise media.ccc.de teenusele.\nLisasime otseetris olevad videovood to media.ccc.de teenusele ning otseetri toe.\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/967.txt",
    "content": "Taastasime olukorra, et YouTube töötaks Euroopa Liidus. Põhjuseks oli uus küpsis ja privaatsusnõusolek, mille tõttu NewPipe salvestab nüüd CONSENT-küpsise.\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/969.txt",
    "content": "• Luba paigaldust välisele andmekandjale\n• [Bandcamp] Lisasime kolme esimese kommentaari kuvamise\n• Allalaadimisel näitame vaid 'Allalaadimine on alanud' teadet\n• Kui reCaptcha küpsist pole kasutusel, siis ära loo uut küpsist\n• [Esitaja] Parandasime puhvri kasutust\n• [Esitaja] Parandasime vea, kus automaatne esitamine ei toiminud\n• Allalaadimiste kustutamisel ära arvesta eelmiseid teateid\n• Parandasime olukorra, kus püüdsime kustutada kirjet, mis polnud loendis\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/978.txt",
    "content": "Parandasime NewPipe'i versiooni kontrollimise vea. Me nimelt mõnikord üritasime seda teha liiga varajases faasis ja võis viia rakenduse kokkujooksmiseni.\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/979.txt",
    "content": "- Tegime korda taasesituse jätkamise\n- Kohendasime, et uuendusi kontrolliv teenus ei käivituks asjatult taustal\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/998.txt",
    "content": "Parandasime vea, kus ühtegi YouTube'i meediavoogu ei õnnestunud esitada ja HTTP olekuteade oli 403.\n\nJuhuslikud HTTP 403 veas esituse keskel pole veel parandatud.\nMe oleme teadlikud ka sellest veast ja kiirparandus lisandub niipea, kui võimalik.\n"
  },
  {
    "path": "fastlane/metadata/android/et/changelogs/999.txt",
    "content": "See kiirparandus teeb korda vea, kus YouTube'i video esituse keskel esitus katkeb HTTP olekuteatega 403.\n\nUus\n• [SoundCloud] Lisandus on.soundcloud.com võrguaadresside tugi\n\nTäiendused\n• [Bandcamp] Näitame lisateavet raadiokioski vaates\n\nParandused\n• [YouTube] Parandasime juhuslikud HTTP 403 vead videoesituse keskel\n• [YouTube] Tuvastame tunnuspildi ja päisepildi enamatest kanalipäisete tüüpidest\n• [Bandcamp] Mitmed veaparandused ja nüüdsest alati kasutame HTTPSi\n"
  },
  {
    "path": "fastlane/metadata/android/et/full_description.txt",
    "content": "NewPipe ei kasuta Google'i raamistiku teeke ega YouTube'i APIt. Ta ainult sõelub veebilehelt vajamineva info. Seega saab rakendust kasutada ka seadmes, millesse ei ole paigaldatud Google'i teenuseid (Google Services). Lisaks ei ole NewPipe'i kasutamisel vaja YouTube'i kontot ja tegemist on avatud lähtekoodil põhineva tasuta ja vaba tarkvaraga.\n"
  },
  {
    "path": "fastlane/metadata/android/et/short_description.txt",
    "content": "Tasuta ja lihtne rakendus YouTube'i vaatamiseks.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/1000.txt",
    "content": "Hobetua\n• Zerrenda deskribapena klikagarria\n• [PeerTube] subscribeto.me estekak auto-kudeatu\n• Historia elementu bakarra hasi\n\nKonpondua\n• RSS botoien ikusgarritasuna\n• Bilaketa aurrebista matxurak\n• Miniaturarik gabeko zerrenda\n• Deskarga elkarrizketa irtetea\n• Erlazionatutako elementuen leihoa\n• Zerrendan gehitzeko ordena\n• Laster-marken diseinua\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/1001.txt",
    "content": "Hobetua\n• Onartu beti jokalarien jakinarazpenen hobespenak aldatzea Android 13+-n\n\nKonpondua\n• Konpondu datu-basea/harpidetzak esportatzeak lehendik zegoen fitxategi bat ez mozten zuelako, eta horrek esportazio bat hondatzea eragin zezakeelako\n• Denbora-zigilu batean klik egitean jokalaria hasieratik jarraitzea konpondu\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/1002.txt",
    "content": "Konpondu da YouTube-k ez zuela inolako stream-ik erreproduzitzen.\n\nBertsio honek YouTube bideoen xehetasunak kargatzea eragozten duen errore larriena baino ez du konpontzen.\nBadakigu beste arazo batzuk ere badaudela, eta laster beste argitalpen bat kaleratuko dugu horiek konpontzeko.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/1003.txt",
    "content": "YouTube-ko akatsak zuzentzen dituen zuzenketa-bertsio bat da hau:\n• [YouTube] Bideoen informaziorik kargatzen ez zen arazoa konpondu, bideoak erreproduzitzean HTTP 403 erroreak konpondu eta adin-murrizketak dituzten bideo batzuen erreprodukzioa leheneratu\n• Konpondu aldatzen ez ziren azpitituluen tamainak\n• Konpondu informazioa bi aldiz deskargatzea erreprodukzio bat irekitzean\n• [Soundcloud] Kendu erreproduziezinak diren DRM bidez babestutako erreprodukzioak\n• Itzulpen eguneratuak\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/1004.txt",
    "content": "Bertsio honek YouTube-k 360p-ko erreprodukzioa soilik eskaintzen zuen arazoa konpontzen du.\n\nKontuan izan bertsio honetan erabilitako irtenbidea ziurrenik aldi baterakoa izango dela, eta epe luzera SABR bideo protokoloa inplementatu beharko dela, baina TeamNewPipe-ko kideak lanpetuta daude une honetan, beraz, edozein laguntza eskertzekoa izango litzateke! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/1005.txt",
    "content": "Berria\n• Android Auto laguntza\n• Jario-taldeak fitxa gisa\n• [YouTube] Partekatu zerrenda aldi baterako\n• [SoundCloud] Atsegin dut fitxa\n\nHobetua\n• Bilaketa aholku hobeak\n• Deskarga data erakutsi\n• Android 13 hizkuntza\n\nKonpondua\n• Testu-koloreak modu ilunean\n• [YouTube] 100+ elementuko zerrendak\n• [YouTube] Gomendatutako bideoak\n• Historia ikuspegiko hutsegiteak\n• Iruzkinen denbora-zigiluak\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/1006.txt",
    "content": "# Hobetua\nErreproduzitzailea denbora-zigiluetan mantendu\nDeskarga misioak berreskuratu\nEzabatu deskarga fitxategia gorde\nGainjartze baimena Android > R\n.soundcloud estekak ireki\nHobekuntza txikiak\n\n# Konpondua\nAndroid <7 zenbaketa laburrak\nMamu jakinarazpenak\nSRT azpititulu fitxategiak\nIstripu tona\n\n# Garapena\nKodearen modernizazioa\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/1007.txt",
    "content": "Konpondu da YouTube-k ez zuela inolako erreprodukziorik erreproduzitzen\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/63.txt",
    "content": "### Hobekuntzak\n- Inportatu/esportatu ezarpenak #1333\n- Murriztu gainmarrazketa (errendimendu hobekuntza) #1371\n- Kode hobekuntza txikiak #1375\n- Gehitu GDPR-i buruzko guztia #1420\n\n### Konponduta\n- Deskargatzailea: hutsegitea bukatu gabeko deskargatutako .giga fitxategiak kargatzen saiatzerakoan #1407\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/64.txt",
    "content": "### Hobekuntzak\n- Mugikorreko datuak erabiltzen badira bideoaren kalitatea mugatzeko aukera gehitu. #1339\n- Gogoan izan saiorako distira #1442\n- Deskargaren errendimendua CPU ahulagoentzat hobetu #1431\n- gehitu (funtzionatzen duen) multimedia saioentzako euskarria#1433\n\n### Konponduta\n- Konpondu deskargak irekitzean izandako hutsegitea (konponketa bertsioen bertsioetarako erabilgarri dago orain) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/65.txt",
    "content": "### Hobekuntzak\n\n- Burger menuko animazioa desgaitu #1486 \n- Deskargen ezabaketa desegin #1472 \n- Partekatze-menuan deskargatzeko aukera #1498\n- Sakatze luzeko menuan partekatzeko aukera gehitu da #1454 \n- Minimizatu erreproduzigailua irtetzean #1354 \n- Liburutegiaren bertsioa eguneratu eta datu-basearen babeskopia konpondu #1510 \n- ExoPlayer 2.8.2 eguneraketa #1392\n\n### Konponketak\n\n- #1440 Bideoaren informazio ikuspegia apurtuta konponduta #1491 \n- Historia ikustea konponduta #1497\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/66.txt",
    "content": "# 0.13.7 bertsioaren aldaketa-erregistroa\n### Konpondua\n- Ordenazio-iragazkiak\n\n# 0.13.6 bertsioaren aldaketa-erregistroa\n### Hobekuntzak\n- Hanburgesa animazioa desgaitu\n- Deskargak ezabaketa desegin\n- Partekatu menuan deskarga\n- Jokalaria minimizatu\n- ExoPlayer 2.8.2\n- Abiadura kontrolak hobetuak\n- Isilune saltoa\n- Metadatu egitura berria\n- UI konponketak\n\n### Konponketak\n\n- Bideoaren informazio diseinua\n- Ikusi historia eguneraketa\n- Pantaila denbora-muga leiho-moduan\n- Jokalari NPE konpondua\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/68.txt",
    "content": "# changes of v0.14.1\n### New\n- New Drawer design\n- New customizable front page\n\n### Improvements\n- Reworked Gesture controls\n- New way to close the popup player\n\n### Fixed\n- Fix error when subscription count is not available.\n  - Show \"Subscriber count not available\" in those cases\n- Fix NPE when a YouTube playlist is empty\n  - Fix Cyclic search result\n  - Fix YT Premium video are not blocked correctly\n  - Fix Videos sometimes not loading (due to DASH parsing)\n  - Fix links in video description.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/69.txt",
    "content": "### New\n- Long-tap delete and share in subscriptions\n- Tablet UI and grid list layout\n\n### Improvements\n- store and reload the last used aspect ratio\n- Enable linear layout in Downloads activity with full video names\n- Separate settings for volume and brightness gestures\n- Add support for Localization\n\n### Fixes\n- NewPipe can be used in Finland\n- Fix subscription count\n\n### Known Bugs\n- Playback state can not be saved on Android P\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/70.txt",
    "content": "### Improvements\n* downloaded files can now be opened with one click\n* drop support for android 4.1 - 4.3\n* remove streams from current play queue by swiping them to the right\n* remove auto queued stream when a new stream is enqueued manually\n* Postprocessing for downloads and implement missing features\n\n### Fixed\n* Fix crash with default resolution set to best and limited mobile data resolution\n* pop-up player crash fixed\n* NPE when trying to open background player\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/71.txt",
    "content": "### Improvements\n* Add app update notification for GitHub build (#1608 by @krtkush)\n* Various improvements to the downloader (#1944 by @kapodamy):\n  * add missing white icons and use hardcored way for change the icon colors\n  * check if the iterator is initialized\n  * allow retry downloads with \"post-processing failed\" error in the new muxer\n  * new MPEG-4 muxer fixing non-synchronous video and audio streams\n\n### Fixed\n* YouTube live streams stop playing after a short time (by @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/730.txt",
    "content": "# Konponduta\n- Konpondu deszifratze funtzioaren errorea berriro.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/740.txt",
    "content": "<h4>Improvements</h4>\n<ul>\n<li>make links in comments clickable, increase text size</li>\n<li>seek on clicking timestamp links in comments</li>\n<li>add playlist to queue when long clicking on &#39;Background&#39; in playlist window</li>\n</ul>\n<h4>Fixed</h4>\n<ul>\n<li>fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title</li>\n<li>fix invalid YouTube url: signature tag name is not always \"signature\" preventing streams from loading</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/750.txt",
    "content": "New\nPlayback resume\n• Resume streams where you stopped last time\nDownloader Enhancements\n• Use Storage Access Framework to store downloads on external SD-cards\n• New mp4 muxer\n• Respect metered networks\n\n\nImproved\n• Handle (auto)rotation changes during activity lifecycle\n• Make long-press menus consistent\n\nFixed\n• Fixed selected subtitle track name not being shown\n• Do not crash when check for app update fails\n• Fixed downloads stuck at 99.9%\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/760.txt",
    "content": "Aldaketak 0.17.1ean\n\nBerria\n• Thai lokalizazioa\n• Lehengoan gelditu zineneko errekak berrabiarazi.\n• Biltegira sartzeko esparrua erabili deskargak kanpoko SD-txarteletan gordetzeko.\n\nHobetua\n• Gehitu hemen jotzen hastea prentsa luzeko menuetan erreprodukzio zerrendetarako\n• Gehitu etengailua SAF/Legacy File Picker\n\nKonponketak\n• Konpondu erreprodukzio-posizioa gordeta dago, nahiz eta erlojuaren historia desaktibatuta egon.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/770.txt",
    "content": "0.17.2ko aldaketak\n\nKonpondu\n• Konpondu ez zegoen bideorik erabilgarri\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/780.txt",
    "content": "Changes in 0.17.3\n\nImproved\n• Added option to clear playback states #2550\n• Show hidden directories in the file picker #2591\n• Support URLs from `invidio.us` instances to be opened with NewPipe  #2488 \n• Add support for `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194\n\nFixed\n• [YouTube] Fixed 'java.lang.IllegalArgumentException #192\n• [YouTube] Fixed live streams not working TeamNewPipe/NewPipeExtractor#195\n• Fixed performance problem in android pie when downloading a stream #2592\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/790.txt",
    "content": "Improved\n• Add more titles to improve accessibility for blind people #2655\n• Make language of download folder setting more consistent and less ambiguous #2637\n\nFixed\n• Check if last byte in the block is downloaded #2646\n• Fixed scrolling in video detail fragment #2672\n• Remove double search clear box animations to one #2695\n• [SoundCloud] Fix client_id extraction #2745\n\nDevelopment\n• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535\n• Migrate to AndroidX #2685\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/800.txt",
    "content": "Berria\n• PeerTube euskarria P2P gabe\n  ◦ Instantziak gehitu\n  ◦  PeerTube instantziak ikusi eta deskargatu\nDeskargak\n  ◦ Deskarga ETA kalkulatu\n  ◦ Opus ogg gisa\n  ◦ Estekak berreskuratu\n\nHobetua\n• Fitxen errendimendua eta lokalizazioa\n• Lokalizazio berriak\n• Nabigazio barra beltza\n\nKonpondua\n• Popup hatz-mugimendua\n• Igotzailerik gabeko zerrendak\n• TLS Android 4.4\n• [SoundCloud] Client_id\n• Audio-jarioa\n\nGarapena\n• ExoPlayer 2.10.8\n• Gradle 3.5.1 eta Kotlin onartu\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/810.txt",
    "content": "Berria\n• Miniatura blokeatutako pantailan\n\nHobetua\n• Zerrenda ilaran botoia\n• Fitxak korritzeko moduan\n• Jakinarazpen miniatura mugatu\n• Irudi zerrenda hutsentzat\n• *.opus luzapena erabili\n• Deskarga historia ezabatu\n• [YouTube] /c/ estekak\n\nKonpondua\n• Partekatzeko arazoak\n• Erreproduzitzaile sarbidea\n• Bilaketa orrialdekatzea\n• [YouTube] NPE nulua\n• [YouTube] invidio.us iruzkinak\n• [SoundCloud] bezeroaren_id\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/820.txt",
    "content": "YouTube erabilezin bihurtzen zuen funtzio-izenaren regex deszifratzea konpondu da.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/830.txt",
    "content": "SoundCloud client_id eguneratu da SoundCloud-eko arazoak konpontzeko.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/840.txt",
    "content": "Berria\n• Hizkuntza hautatzailea\n• Kodira bidali botoia\n• Iruzkinak kopiatu\n\nHobetua\n• ReCaptcha eta cookieak\n• Puntu-menua kendu\n• Bistaratu baimena eskatu\n• Zerrenda izena aldatu\n• PeerTube hobekuntzak\n\nKonpondua\n• Erreproduzitzailea abiarazi minimizatuta\n• Keinu distira\n• .srt lerro-jauziak\n• SD txartel deskargak\n• Android KitKat deskargak\n• .mp4 ezagutza\n• Lokalizazio arazoak\n• [YouTube] Denbora-zigiluak\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/850.txt",
    "content": "Bertsio honetan YouTube webgunearen bertsioa eguneratu da. Webgune zaharra martxoan eten egingo da eta, beraz, NewPipe eguneratu beharko duzu.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/860.txt",
    "content": "Hobetua\n• Gorde eta leheneratu tonua eta tempoa deskonektatuta dauden ala ez\n• Erreproduzitzailean pantailaren mozketa onartzen du\n• Txanda-ikuspenak eta harpidedun kopurua\n• YouTube optimizatu da datu gutxiago erabiltzeko\n\nBertsio honetan YouTube-rekin lotutako 15 akats baino gehiago konpondu dira.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/870.txt",
    "content": "Hau NewPipe eguneratzen duen zuzenketa bat da, SoundCloud arazorik gabe berriro erabili ahal izateko.\nSoundCloud-en v2 APIa erabiltzen da orain erauzgailuan eta bezero ID baliogabeen detekzioa hobetu da.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/900.txt",
    "content": "Berria\n• Harpidetza taldeak eta ordenatutako jarioak\n• Isilarazteko botoia erreproduzitzaileetan\n\nHobetua\n• music.youtube.com eta media.ccc.de estekak irekitzeko aukera eman\n• Bi ezarpen Itxuratik Edukira lekuz aldatu\n• Ezkutatu 5, 15, 25 segundoko bilaketa aukerak bilaketa zehatza gaituta badago\n\nKonpondua\n• WebM bideo batzuk ezin dira bilatu\n• datu-basearen babeskopia Android P-n\n• Deskargatutako fitxategi bat partekatzean huts egitea\n• YouTube erauzketa arazo mordoa eta gehiago ...\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/910.txt",
    "content": "NewPipe kasu arraro batzuetan hastea eragozten zuen datu base migrazioa konponduta.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/920.txt",
    "content": "Hobetua\n\n• Gehitu dira igoera data eta ikustaldi kopurua erreprodukzio-sareko elementuetan\n• Tiraderaren goiburuaren diseinuaren hobekuntzak\n\nKonpondua\n\n• API 19an huts egiteak eragiten zuen isilarazteko botoia konpondu da\n• 1080p 60 fps-ko bideo luzeen deskarga konpondu da\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/930.txt",
    "content": "Berria\n• YouTube Music bilaketa\n• Android TV oinarrizkoa\n\nHobetua\n• Ikusitako bideoak kendu\n• Mezua eduki onartzen ez\n• Leiho tamaina keinuak\n• Ilaran kanaleko botoiak\n• Tiradera izenburu kudeaketa\n\nKonpondua\n• Adin mugatuko edukia\n• reCAPTCHA motak\n• Laster-markak null\n• Sareko salbuespena\n• Harpidetza ordenatzea\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/940.txt",
    "content": "Berria\n• SoundCloud iruzkinak\n• YouTube modu mugatua\n• PeerTube guraso xehetasunak\n\nHobetua\n• Kore botoia onartutakoentzat\n• Blokeatu keinuak barran\n• Berriro saiatu/harpidetu koloreak\n\nKonpondua\n• Deskarga elkarrizketa izoztea\n• Ireki arakatzailean botoia\n• Bideoak irekitzeko hutsegitea\n\neta gehiago\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/950.txt",
    "content": "Bertsio honek hiru konponketa txiki dakartza:\n• Biltegirako sarbidea konpondu da Android 10+ bertsioan\n• Kioskoen irekitzea konpondu dira\n• Bideo luzeen iraupenaren analisia konpondu da\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/951.txt",
    "content": "Berria\n• Harpidetzak bilatu jario-taldeetan\n• Iragazkiak harpidetza taldekatu gabeak erakusteko\n• Hasierako orrialdeko erreprodukzio-zerrenden fitxa\n• Aurrera eta atzera egin atzeko planoan eta miniaturazko ilaran\n• Bilaketa-iradokizunak\n\nHobetua\n• Aplikazioaren metadatuak ez dira idazten elkartutako fitxategietan\n• Huts egindako erreprodukzioak ez dira ilaratik ezabatzen\n• Egoera-barraren kolorea eguneratu da\n\nKonpondua\n• Audio eta bideo desinkronizazioa\n• [PeerTube] Ezabatutako iruzkinak\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/952.txt",
    "content": "Hobetua\n• Erreprodukzio automatikoa zerbitzu guztietarako dago eskuragarri (YouTube-rako bakarrik izan beharrean)\n\nKonpondua\n• YouTube-ren jarraipen berriak onartuz, erlazionatutako erreprodukzioak konpondu ziren.\n• Adin-mugako YouTube bideoak konpondu dira\n• [Android TV] Fokuaren nabarmentze-gainjartze iraunkorra konpondu da\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/953.txt",
    "content": "YouTube-ren deszifratze funtzioaren erauzketa konpondu da.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/954.txt",
    "content": "• Ezaugarri berria: Ikusi bideoak xehetasunen orrian, irristatu behera erreproduzitzailea minimizatzeko\n• MediaStyle jakinarazpenak: ekintza pertsonalizagarriak, errendimendu hobekuntzak\n• Aldatu bideoaren tamaina NewPipe mahaigaineko aplikazio gisa erabiltzean\n\n• URL bateraezin baten kasuan aukerekin elkarrizketa-koadroa\n• Bilaketa-iradokizunak hobetu dira emaitzak urrunetik lortu ezin direnean\n• Bideoaren kalitatea 720p60ra (aplikazioan) eta 480p-ra (miniaturan) igo da\n\n• Akats asko konponduak\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/955.txt",
    "content": "[YouTube] Konpondu bilaketa erabiltzaile batzuentzat\n[YouTube] Konpondu salbuespenak ausaz deszifratzean\n[SoundCloud] Barra batekin amaitzen diren URLak orain ondo analizatzen dira\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/956.txt",
    "content": "[YouTube] Hutsegitea edozein bideo irekitzean konponduta\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/957.txt",
    "content": "• Errenkadatze ekintzak bateratu\n• Bi hatz keinua erreproduktorea ixteko\n• reCAPTCHA cookieak garbitu daitezke\n• Jakinarazpena ez koloreztatzeko aukera\n• Bideoen xehetasunak nola irekitzen diren hobetu buffer infinitua konpontzeko, portaera arraroa NewPiperekin partekatzean eta bestelakoak\n• Azkartu YouTube bideoak, konpondu adinez mugatutakoak\n• Konpondu aurreratze/atzeratze azkarra\n• Ez berrantolatu zerrendak miniaturak arrastatuz\n• Gogoratu beti popupen propietateak\n• Gehitu Santali hizkuntza\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/958.txt",
    "content": "Berria eta hobetua:\n• Blokeo pantailan miniatura ezkutatzeko aukera berriro gehitu da\n• Tiratu jarioa freskatzeko\n• Errendimendu hobea zerrendak eskuratzerakoan\n\nKonponduta:\n• Hutsegitea NewPipe RAMetik kendu ondoren abiaraztean\n• Hutsegitea abiaraztean konexiorik ez dagoenean\n• Distira eta bolumen-keinuen ezarpenak errespetatzen dira\n• [YouTube] Erreprodukzio zerrenda luzeak konponduta\n\nBestelakoak:\n• Kodearen garbiketa eta barne hobekuntzak\n• Menpekotasunen eguneraketa\n• Itzulpenen eguneraketa\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/959.txt",
    "content": "Akatsen txostena ireki ostean zeuden hutsegite amaigabeak konpondu dira.\nNewPipekin automatikoki ireki daitezkeen PeerTube instantziak eguneratu dira.\nItzulpenak eguneratuta.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/960.txt",
    "content": "• Ezarpenetan esportatu datu-basea aukeraren deskribapena hobetu da.\n• YouTube iruzkinen analisia konpondu da.\n• media.ccc.de zerbitzuaren bistaratzeko izena konpondu da.\n• Itzulpenak eguneratuta.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/961.txt",
    "content": "• [YouTube] Mix bateragarritasuna\n• [YouTube] Erakutsi emisore publikoei eta Covid-19ri buruzko informazioa\n• [media.ccc.de] Azken bideoak gehitu dira\n• Somaliar itzulpena gehitu da\n\n• Barne hobekuntza ugari\n\n• Erreproduzitzailetik bideoak partekatzea konpondu da\n• ReCaptcha web ikuspegi hutsa konpondu da\n• Zerrenda batetik jario bat kentzean gertatutako kraskadura konpondu da\n• [PeerTube] Konpondu erlazionatutako jarioak\n• [YouTube] YouTube Music bilaketa konpondu da\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/962.txt",
    "content": "\"Azken\" bideoak media.ccc.de zerbitzura gehitu dira.\nZuzeneko jarioak eta zuzeneko jarioen bateragarritasuna gehitu dira media.ccc.de zerbitzuan.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/963.txt",
    "content": "• [YouTube] Kanalen jarraipena konpondu da\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/964.txt",
    "content": "• Kapituluen euskarria gehitu\n• [PeerTube] Sepia bilaketa gehitu\n• Bideoaren xehetasunetan partekatzeko botoia gehitu eta jarioen deskribapena fitxetara mugitu\n• Desgaitu distira berrezartzea keinua desgaituta badago\n• Kodi-n bideoa erreproduzitzeko zerrenda-elementua gehitu\n• Lehenetsitako arakatzailerik ez zeukaten gailuetan hutsegitea konpondu eta partekatzeko elkarrizketak hobetu\n• Erreproduzitu/pausatu erreproduzitzailean hardware espazio botoiarekin\n• [media.ccc.de] Hainbat hobekuntza\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/965.txt",
    "content": "Kanal taldeak berrantolatzean gertatzen zen hutsegitea konpondu da.\nKonpondu da kanal eta erreprodukzio-zerrendetatik YouTube bideo gehiago lortzea.\nYouTubeko iruzkinak jasotzea konpondu da.\nYouTube URLetan /watch/, /v/ eta /w/ azpibideetarako laguntza gehitu da.\nSoundCloud bezeroaren IDaren eta geo-murriztutako edukiaren erauzketa konpondu da.\nIparraldeko kurduera lokalizazioa gehitu da.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/966.txt",
    "content": "Berria:\n• Zerbitzu berria gehitu: Bandcamp\n\nHobetua:\n• Aplikazioak gailuaren gaiari jarraitzeko aukera\n• Errore-panel bat erakutsi hutsegiteak saihesteko\n• Edukia erabilgarri ez dagoenaren informazio gehiago\n• Hardware espazio botoiak erreproduzitu/pausatu aktibatzen du\n• \"Deskargatzen hasita\" mezua erakutsi\n\nKonpondua:\n• Miniatura txikiak atzeko planoan erreproduzitzen\n• Erreproduzitzaile minimizatuan izenburu hutsa\n• Tamaina aldatzeko modua leheneratzen ez zena\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/967.txt",
    "content": "YouTube EBn behar bezala ez funtzionatzea konpondu da. Hau cookie eta pribatutasun baimen sistema berri batek eragin zuen, eta horrek NewPipe-k CONSENT cookie bat ezartzea eskatzen du.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/968.txt",
    "content": "Kanalaren xehetasunen aukera gehitu da sakatuta edukitzeko menuan.\nErreprodukzio-zerrendaren izena erreprodukzio-zerrendaren interfazetik aldatzeko funtzionalitatea gehitu da.\nUtzi erabiltzaileari bideoa bufferrean gordetzen ari den bitartean pausatzen.\nGai zuria leundu da.\nLetra-tamaina handiagoa erabiltzean gainjarritako letra-tipoak konpondu dira.\nFormuler eta Zephier gailuetan bideorik ez egotea konpondu da.\nHainbat hutsegite konpondu.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/969.txt",
    "content": "• Kanpoko biltegiratzean instalazioa baimendu\n• [Bandcamp] Erreprodukzio bateko lehen hiru iruzkinak bistaratzeko laguntza gehitu da\n• Deskargatzen hasten denean bakarrik erakutsi \"deskarga hasi da\" menua\n• Ez ezarri reCaptcha cookierik cookierik gordeta ez dagoenean\n• Cachearen errendimendua hobetu\n• Jokalaria automatikoki ez jokatzea konpondu da\n• Deskargak ezabatzean, baztertu aurreko Snackbar-ak\n• Zerrendan ez zegoen objektua ezabatzen saiatzean izandako arazoa konpondu da\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/970.txt",
    "content": "Berria\n• Erakutsi edukiaren metadatuak (etiketak, kategoriak, lizentzia) deskribapenaren azpian\n• \"Erakutsi kanalaren xehetasunak\" aukera urruneko erreprodukzio-zerrendetan\n• \"Ireki arakatzailean\" aukera sakatuta edukitzeko menuan\n\nKonpondua\n• Bideoaren xehetasunen orrialdean errotazio-matxura\n• \"Jolastu Kodirekin\" botoia Kore instalatzeko eskatzen zuena\n• Inportazio eta esportazio bideak konpondu eta hobetu\n• [YouTube] Iruzkinen \"atsegin dut\" kopurua\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/971.txt",
    "content": "Konponketa\n• Bufferra handitu erreprodukziorako rebuffer-aren ondoren\n• Tabletetan eta telebistetan erreproduzitzailearen erreprodukzio-ilararen ikonoan klik egitean gertatzen zen hutsegitea konpondu da\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/972.txt",
    "content": "Berria\nDenbora-zigiluen eta traolen ezagutza deskribapenean\nTableta moduaren eskuzko doikuntza gehitu da\nJarioan erreproduzitutako elementuak ezkutatzeko aukera gehitu da\n\nHobetua\nBiltegiratze sarbide sistemarako (SAF) laguntza egokia\nEzabatutako eta erabilgarri ez dauden kanaletako erroreen kudeaketa hobetua\nAndroid 10+ erabiltzaileentzako partekatzeko menuak edukiaren izenburua erakusten du orain.\nInvidious-en instantzia eguneratuak eta Piped estekak erabiltzeko laguntza\n\n...eta zuzenketak\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/973.txt",
    "content": "Konponketa\n• Konpondu sareta-diseinuan moztutako miniaturak eta izenburuak, errenkada batean zenbat bideo sartu daitezkeen gaizki kalkulatzeagatik.\n• Konpondu deskargatzeko elkarrizketa-koadroa ezer egin gabe desagertzea partekatzeko menutik irekitzean\n• Kanpoko jarduerak irekitzearekin lotutako liburutegi bat eguneratu, hala nola Storage Access Framework fitxategi hautatzailea\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/974.txt",
    "content": "Konponketa\n• Konpondu YouTube-ren mugatzeak eragindako buffering arazoak\n• Konpondu YouTubeko iruzkinen erauzketa eta iruzkin desgaituekin matxurak\n• Konpondu YouTubeko musika bilaketa\n• Konpondu PeerTube zuzeneko emankizunak\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/975.txt",
    "content": "Berria\n• Miniatura erakutsi bilatzen ari den bitartean\n• Desgaitutako iruzkinak detektatu\n• Jarioko elementua ikusita gisa markatu\n• Bihotz-formako iruzkinak erakutsi\n\nHobetua\n• Metadatuen eta etiketen diseinua\n• Zerbitzuaren kolorea UI osagai guztiei aplikatu\n\nZuzenduta\n• Mini erreproduzitzailean miniaturak konpondu\n• Elementu bikoiztuen buffering infinitua konpondu\n• Jokalarien zuzenketak: errotazioa eta itxiera\n• ReCAPTCHA atzeko planoan kargatu\n• Beste zuzenketa batzuk\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/976.txt",
    "content": "• Erreproduzitzailea pantaila osoan zuzenean ireki\n• Bilaketa-iradokizun motak aukeratu\n• Gai iluna ilunagoa + pantaila-aurreikuspen iluna\n• Fitxategi-hautatzailea: nahi ez direnak gris koloreztatu\n• YouTubeko harpidetzak inportatzea konpondu\n• Berriro erreproduzitzeko botoia sakatu behar da\n• Amaierako audio saioa konpondu\n• [Android TV] Bilaketa-barraren jauzi luzeak DPad-ekin konpondu\n\nAldaketa gehiago ikusteko, ikusi aldaketa-erregistroa beheko Estekak fitxan.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/977.txt",
    "content": "• \"Hurrengoa erreproduzitu\" botoia sakatuta edukitzeko menuan\n• YouTubeko bideo labur bide-aurrizkia asmo-iragazkian\n• Ezarpen finkoak inportatu\n• Bilaketa-barra eta jokalari botoiak trukatu Ilara-pantailan\n• MediasessionManager konponketak\n• Bilaketa-barra bideoa amaitu ondoren ez amaitzea konpondu\n• RealtekATV multimedia tunela desgaituta\n• Jokalari botoien klik eremua handitu\n\nAldaketa gehiago ikusteko, ikusi aldaketa-erregistroa beheko Estekak fitxan.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/978.txt",
    "content": "NewPipe bertsio berri baten egiaztapena exekutatzea konpondu da. Batzuetan egiaztapen hau goizegi exekutatzen zen eta, beraz, aplikazioaren kraskadura eragiten zuen. Hori orain konpondu beharko litzateke.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/979.txt",
    "content": "- Erreprodukzioa berriro hasteko arazoa konpondu da\n- Hobekuntzak NewPipe-k bertsio berri bat egiaztatu behar duen zehazten duen zerbitzua atzeko planoan abiarazten ez dela ziurtatzeko\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/980.txt",
    "content": "Berria\n- \"Gehitu erreprodukzio-zerrendara\" aukera gehitu da partekatzeko menuan\n- y2u.be eta PeerTube esteka laburretarako laguntza gehitu da\n\nHobetua\n- Erreprodukzio-abiaduraren kontrol trinkoagoak\n- Jarioak elementu berriak nabarmentzen ditu orain\n- \"Erakutsi ikusitako elementuak\" aukera orain jarioan gordeta dago\n\nZuzenduta\n- YouTube-tik \"atsegin dut\" eta \"ez dut\" mezuen erauzketa konpondu da\n- Errepikapen automatikoa konpondu da atzeko planotik itzuli ondoren\nEta askoz gehiago\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/981.txt",
    "content": "MediaParserren euskarria kendu da Android 11+-n bufferrean sartu ondoren erreprodukzioa berriro hasteko huts egitea konpontzeko.\nPhilips QM16XE-n multimedia tunelizazioa desgaitu da erreprodukzio arazoak konpontzeko.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/982.txt",
    "content": "Konpondu da YouTube-k ez zuela inolako erreprodukziorik erreproduzitzen.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/983.txt",
    "content": "Gehitu bi aldiz sakatuta bilatzeko interfazea eta portaera berriak\nEgin ezarpenak bilagarri\nNabarmendu finkatutako iruzkinak horrela\nGehitu aplikazioarekin irekitzeko euskarria FSFEren PeerTube instantziarako\nGehitu errore-jakinarazpenak\nKonpondu jokalaria aldatzean lehenengo ilarako elementuaren errepikapena\nItxaron denbora gehiago zuzeneko erreprodukzioetan bufferrean gordetzean huts egin aurretik\nTokiko bilaketa-emaitzen ordena konpondu\nKonpondu erreprodukzio-ilarako elementu-eremu hutsak\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/984.txt",
    "content": "Kargatu elementu nahikoa pantaila betetzeko eta tableta/telebista korritzea konpondu\nZerrendetan mugitzeko ausazko hutsegiteak konpondu\nBilaketa azkarraren gainjartze-arkua sistemaren azpian jarri\nLeiho anitzetan mozketen aldaketak leheneratu (kokapen okerreko atzerakada)\ncompileSdk 30etik 31ra handitu\nErroreen liburutegia eguneratu\nErreproduzitzailearen kodea berregituratu\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/985.txt",
    "content": "Konpondu da YouTube-k ez zuela inolako erreprodukziorik erreproduzitzen\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/986.txt",
    "content": "Berria\n• Erreprodukzio berrien jakinarazpenak\n• Trantsizio hobetua atzeko planoa/bideo artean\n• Tonua erdi-tonuz aldatu\n• Ilara erreprodukzio-zerrenda bati erantsi\n\nHobetua\n• Abiadura/tonu urratsaren tamaina gogoratu\n• Hasierako buffering luzea arintu\n• Android TV interfazea hobetu\n• Fitxategi guztiak ezabatu aurretik berretsi\n\nKonpondua\n• Multimedia botoiak kontrolak ezkutatzen ez zituen\n• Erreprodukzioa berrezartzea mota aldatzean\n• Erreprodukzio-zerrenda elkarrizketa biratzea\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/987.txt",
    "content": "Berria\n• Beste bidalketa-metodoak: karga azkarragoa, PeerTube/SoundCloud konponketak, YouTube zuzeneko emankizunak\n• Urruneko zerrenda tokikora gehitu botoia\n• Irudi aurrebista Android 10+ partekatze-orrian\n\nHobetua\n• Erreprodukzio-parametroen elkarrizketa hobetu\n• Harpidetza botoiak hiru puntuko menura eraman\n\nKonpondua\n• Ikusitako bideoak kentzea zerrendatik\n• Partekatzeko menuaren gaia eta zerrenda sarrera\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/988.txt",
    "content": "[YouTube] Konpondu \"Ezin izan da korronterik jaso\" errorea edozein bideo erreproduzitzen saiatzean\n[YouTube] Konpondu \"Ondoko edukia ez dago erabilgarri aplikazio honetan\". eskatutako bideoaren ordez agertzen den mezua\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/989.txt",
    "content": "• [YouTube] Karga amaigabea konpondu edozein bideo erreproduzitzen saiatzean\n• [YouTube] Bideo batzuen sare-geldotzea konpontzen da\n• Jsoup liburutegia 1.15.3ra eguneratzen da, segurtasun konponketak barne\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/990.txt",
    "content": "Bertsio honek Android 4.4 KitKat onartzeari uzten dio, orain gutxieneko bertsioa Android 5 Lollipop da!\n\nBerria\n• Ukipen-luzeko menutik deskargatu\n• Jarioan etorkizuneko bideoak ezkutatu\n• Erreprodukzio-zerrenda lokalak partekatu\n\nHobetua\n• Errefaktatu erreproduzigailuaren kodea osagai txikietan.\n• Miniaturen eskala-modua hobetu\n• Irudi leku-markak bektorizatu\n\nKonponduta\n• Erreproduzigailuaren jakinarazpenekin hainbat arazo konpondu\n• Pantaila osoak pantailaren 1/4 erabiltzen du\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/991.txt",
    "content": "Berria\n• \"Ireki arakatzailean\" botoia errore-panelean\n• Kanal taldeak zerrenda gisa bistaratzeko aukera\n• [YouTube] Klik luze segmentuetan denbora-zigilu URLa partekatzeko\n• Erreprodukzio-ilarako botoia erreproduzitzaile txikian\n\nHobetua\n• Islandierazko lokalizazioa eta itzulpen eguneraketak\n• Barne-hobekuntza asko\n\nKonpondua\n• Hainbat hutsegite konpondu\n• [YouTube] Kanalak kargatzea, jario ez-dedikatuak eta erreprodukzio-konponbideak herrialde batzuetan\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/992.txt",
    "content": "Berria\n• Harpidedun kopurua bideoaren xehetasunetan\n• Deskargatu ilaratik\n• Zerrenda miniatura behin betiko ezarri\n• Sakatu luze traolak eta estekak\n• Txartelen ikuspegi modua\n\nHobetua\n• Mini-erreproduzitzailearen ixteko botoia handiagoa\n• Miniaturen eskala txikiagotzea leunagoa\n• Helburua Android 13 (API 33)\n• Bilatzeak ez du jokalaria pausatzen\n\nKonpondua\n• Gainjartzea DeX/saguaren gainean konpondu\n• Atzeko planoan audio-jariorik gabe baimendu\n• Hainbat YouTube konponketa eta gehiago\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/993.txt",
    "content": "Berria\n• Gehitu abisua erreprodukzio-zerrenda bikoiztuak gehitzean eta gehitu botoia kentzeko\n• Hardware botoiak baztertzea baimendu\n• Jarioan partzialki ikusitako bideoak ezkutatzea baimendu\n\nHobetua\n• Erabili sareta-zutabe gehiago pantaila handietan\n• Aurrerapen adierazleak ezarpenekin bat etorriz egin\n\nKonpondua\n• Konpondu arakatzailearen URLak, deskargak eta kanpoko erreproduzitzaileak irekitzeko arazoak Android 11+-n\n• MIUI-n bi ukitu behar izatearen pantaila osoko interakzioa konpondu\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/994.txt",
    "content": "Berria\n• Audio pista eta hizkuntza anitz onartzen ditu\n• Bolumen eta distira keinuak pantailaren edozein aldetan ezarri\n• Fitxa nagusiak pantailaren behealdean bistaratzeko laguntza\n\nHobetua\n• [Bandcamp] Ordainpeko hormaren atzean dauden abestiak kudeatu\n\nKonpondua\n• [YouTube] 403 HTTP erroreak erreprodukzioetarako\n• Jokalari beltza zerrendaren ikuspegitik nagusira aldatzean\n• Jokalarien zerbitzuaren memoria-ihesa\n• [PeerTube] Igotzailearen eta azpikanalaren avatarrak trukatu\n\neta gehiago\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/995.txt",
    "content": "Berria\n• Kanal fitxak laguntza\n• Hautatu irudiaren kalitatea\n• Irudi guztien URLak lortu\n\nHobetua\n• Jokalarien interfazeen irisgarritasuna\n• Bideo-deskargetarako audio-hautaketa hobea\n• Partekatutako zerrendetan izenak sartzeko aukera\n\nKonpondua\n• [YouTube] Atsegin dut kopurua lortzea\n• Erreproduzitzaileak erantzuten ez duen leihoak eta kraskadurak\n• Hizkuntza hautatzailean hizkuntza okerrak hautatzea\n• Audioaren fokuak isilaraztea errespetatu\n• Zerrendako elementuen gehikuntzak\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/996.txt",
    "content": "NullPointerException bat konpondu da media.ccc.de-n kanal/konferentzia bat irekitzean.\nGrinch-a gure Gabonetako oparia apurtzen saiatu zen, baina konpondu dugu.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/997.txt",
    "content": "Berria\n• Gehitu erantzunak iruzkinei\n• Err. zerr. berrantolaketa\n• Erakutsi err. zerr. deskribapena eta iraupena\n• Ezarpenak berrezartzea\n\nHobetuta\n• [Android 13+] jakinarazpen-ekintza pertsonalizatuak\n• Baimena eskatu eguneraketak egiaztatzeko\n• Errepr./pausatu jakinarazpenak bufferean\n• Ezarpen batzuk berrantolatu\n\nKonponduta\n• [YouTube] Konpondu iruzkinak ez kargatzea\n• Konpondu ahultasuna ezarpenen importazioan eta JSON-era aldatu\n• Konpondu hainbat deskarga\n• Moztu bilaketa-testua\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/998.txt",
    "content": "Konpondu da YouTube-k ez zuela inolako erreprodukziorik erreproduzitzen HTTP 403 erroreengatik.\n\nYouTube bideo baten erdian noizbehinkako HTTP 403 erroreak ez dira oraindik konpondu.\nArazo hori ahalik eta azkarren konponduko da beste hotfix bertsio batean.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/changelogs/999.txt",
    "content": "Bertsio honek YouTube bideoen erdian dauden HTTP 403 erroreak konpontzen ditu.\n\nBerria\n• [SoundCloud] Gehitu URLaren euskarria on.soundcloud.com webgunean\n\nHobetua\n• [Bandcamp] Erakutsi informazio gehigarria irrati-kioskoan\n\nZuzenduta\n• [YouTube] Bideoen hasieran edo erdian noizbehinkako HTTP 403 erroreak konpondu dira.\n• [YouTube] Atera avatarra eta bannerra kanal goiburu mota gehiagotatik\n• [Bandcamp] Hainbat akats konpontzen ditu eta beti HTTPS erabiltzen du\n"
  },
  {
    "path": "fastlane/metadata/android/eu/full_description.txt",
    "content": "NewPipe-k ez du Google liburutegirik edo YouTuben APIa erabiltzen. Webgunea aztertzen du, behar duen informazioa lortzeko. Hori dela eta, aplikazio hau Google Zerbitzuak instalatu gabeko gailuetan erabili daiteke. Gainera, ez duzu YouTube konturik behar NewPipe erabiltzeko, eta FLOSS da.\n"
  },
  {
    "path": "fastlane/metadata/android/eu/short_description.txt",
    "content": "Android-erako doako YouTube frontend arina.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/1002.txt",
    "content": "مشکل عدم نمایش پخش‌زنده برطرف شد\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/1003.txt",
    "content": "مشکل عدم نمایش پخش‌زنده برطرف شد\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/1004.txt",
    "content": "مشکل عدم نمایش پخش‌زنده برطرف شد\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/1007.txt",
    "content": "مشکل عدم نمایش پخش‌زنده برطرف شد\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/63.txt",
    "content": "### بهبودها\n- تنظیمات درون/برون‌ریزی #1333\n- کاهش بیش‌کشی (بهبود کارایی) #1371\n- بهبودهای ریز کد #1375\n- افزودن هرچیزی دربارهٔ GDRP #1420\n\n### تعمیر شده\n- بارگیر : تعمیر فروپاشی در بار کردن بارگیری‌های ناتمام از پرونده‌های ‪.giga‬ #1407\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/64.txt",
    "content": "### بهبودها\n- Added the ability to limit video quality if using mobile data. #1339 \n- Remember brightness for the session #1442 \n- Improve download performance for weaker CPUs #1431 \n- add (working) support for media session #1433\n\n### تعمیر\n- Fix crash on opening downloads (fix now available for release builds) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/65.txt",
    "content": "### بهبوودها\n\n- #1486\n- #1472\n- #1498\n- #1454\n- #1354\n- #1510\n- #1392\n  - Reworked the playback speed control dialog.\n  - Added a toggle to fast-forward.\n  - Refactored media source resolution.\n  - Fixed remote playlist metadata not updating .\n  - #1383\n- Use new extractor\n\n### تعمیرها\n\n- Fix #1440 #1491\n- #1497\n  - #1495.\n  - #1475.\n- #1463 (Fixed #640)\n- #1509\n  - [#1412].\n  - Fixed minimizing player.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/66.txt",
    "content": "# گزارش دگرگونی v0.13.7\n\n### تعیمر شده\n- تعمیر مشکلات پالایهٔ چینش v0.13.6\n\n# گزارش دگرگونی v0.13.6\n\n### بهبودها\n\n- #1486\n- #1472\n- #1498\n- #1454\n- #1354\n- #1510\n- #1392\n  - playback speed control dialog.\n  - toggle to fast-forward.\n  - media source resolution.\n  - remote playlist metadata.\n  - UI fixes: #1383\n- new extractor\n\n### Fixes\n\n- #1491\n- #1497\n  - #1495.\n  - #1475.\n  -. #1463 (Fixed #640)\n  - #1509.\n  - [#1412].\n  - Fixed player.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/730.txt",
    "content": "# رفع شده\n- Hot fix decrypt function error again.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/770.txt",
    "content": "Changes in 0.17.2\n\nتعمیر\n• Fix no video was available\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/820.txt",
    "content": "تعمیر عبارت با قاعدهٔ نام تابع رمزگشا که موجب ناپایداری یوتوب می‌شد.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/830.txt",
    "content": "به‌روز رسانی شناسهٔ کارخواه سوندکلود برای رفع مشکلات سوندکلود.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/850.txt",
    "content": "در این نسخه سایت یوتیوب آپدیت شد. سایت قدیمی منسوخ شد و دیگر قابل استفاده نخواهد بود، درنتیجه لازم است که شما اپلیکیشن را آپدیت کنید.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/870.txt",
    "content": "این یک آپدیت مهمی بوده که اجازه میده از SoundCloud دیگه بدون دردسر استفاده کنید.\nالان دیگه از نسخه 2 ی api ی SoundCloud استفاده شده برای استخراج و از شناسایی شدن جلوگیری شده.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/910.txt",
    "content": "نقص بخش مهاجرت دیتابیس درونی اپ برطرف شده، که باعث بروز خطا میشد.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/952.txt",
    "content": "بهبود\n• پخش خودکار روی همه خدمات در دسترس است (نه فقط برای یوتیوب)\n\nرفع\n• اصلاح جریان‌های مرتبط با پشتیبانی از تداوم‌های جدید یوتیوب\n• رفع مشکل ویدئوهای دارای محدودیت سنی یوتیوب\n• [Android TV] Fixed lingering focus highlight overlay\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/953.txt",
    "content": "اصلاح تابع استخراج رمزگشایی یوتیوب.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/954.txt",
    "content": "• روند کاری جدید برنامه: پخش ویدئوها در برگه جزئیات، کشیدن به پایین برای کمینه کردن پخش‌کننده\n• اعلان‌های سبک رسانه: کنش‌های قابل سفارشی‌سازی در اعلان، بهبود عملکرد\n• تغییر ابعاد ابتدایی زمانی که به صورت رومیزی اجرا می‌شود\n\n\n• نمایش پنجره به گزبنه باز کردن برای نشانی‌های فاقد پشتیبانی\n• بهبود تجربه پیشنهاد جستجو زمانی که جستجوی راه دور قابل دریافت نباشد\n• افزایش کیفیت پیش‌فرض ویدئو به 720p60 در پخش‌کننده داخلی و 480p (پخش‌کننده تصویر در تصویر)\n• بسیاری رفع مشکلات دیگر\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/955.txt",
    "content": "[یوتوب] Fix search for some users\n[یوتوب] Fix random decryption exceptions\n[سوندکلود] URLs that end with a slash are now parsed correctly\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/956.txt",
    "content": "[یوتوب] Fixed crash when loading any video\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/957.txt",
    "content": "• Unify specific enqueue actions into one\n• Two finger gesture to close player\n• Allow clearing reCAPTCHA cookies\n• Option to not colorize notification\n• Improve how video details are opened to fix infinite buffering, buggy behaviour when sharing to NewPipe and other inconsistencies\n• Speed up YouTube videos and fix age restricted ones\n• Fix crash on fast forward/rewind\n• Don't rearrange lists by dragging thumbnails\n• Always remember popup properties\n• افزودن زبان سانتالی\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/958.txt",
    "content": "جدید و بهبود یافته:\n• Re-added option to hide thumbnail on lock screen\n• Pull to refresh feed\n• Improved performance when fetching local lists\n\nرفع شده:\n• Fixed crash when starting NewPipe after it was removed from RAM\n• Fixed crash on startup when there is no internet connection\n• Fixed respecting brightness- and volume-gesture settings\n• [YouTube] Fixed long playlists\n\nدیگر:\n• Code cleanup and several internal improvements\n• Dependency updates\n• Translation updates\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/959.txt",
    "content": "Fixed endless loop of crashes after opening the error reporter.\nUpdated list of PeerTube instances which can be opened automatically by NewPipe.\nترجمه‌های به‌روز شده.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/960.txt",
    "content": "• Improved description of export database option in settings.\n• Fixed YouTube comments parsing.\n• Fixed display name of media.ccc.de service.\n• ترجمه‌های به‌روز شده.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/961.txt",
    "content": "• [یوتوب] Mix support\n• [بوتوب] Display info about public broadcasters and Covid-19\n• [media.ccc.de] Added recent videos\n• Added Somali translation\n\n• Many internal improvements\n\n• Fixed sharing videos from within the player\n• Fixed blank ReCaptcha webview\n• Fixed crash which occurred when removing a stream from a list\n• [پیرتیوب] Fixed related streams\n• [یوتوب] Fixed YouTube Music search\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/962.txt",
    "content": "افزودن ویدیوهای «اخیر» به خدمت media.ccc.de.\nAdded live streams to media.ccc.de service and also live stream support.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/963.txt",
    "content": "• [یوتوب] Fixed channel continuation\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/964.txt",
    "content": "• افزودن پشتیبانی از فصل‌ها در واپایش‌های پخش‌کننده\n• [PeerTube] Added Sepia search\n• Re-added share button in video detail view and moved stream description into the tab layout\n• Disable restoring brightness if brightness gesture is disabled\n• Added list item to play video on kodi\n• Fixed crash when no default browser is set on some devices and improve share dialogs\n• Toggle play/pause with hardware space button in fullscreen player\n• [media.ccc.de] Various fixes and improvements\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/965.txt",
    "content": "Fixed crash which occurred when reordering channel groups.\nFixed getting more YouTube videos from channels and playlists.\nFixed getting YouTube comments.\nAdded support for /watch/, /v/ and /w/ subpaths in YouTube URLs.\nFixed extraction of SoundCloud client id and geo-restricted content.\nافزودن محلّی سازی کردی شمالی.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/966.txt",
    "content": "جدید:\n• Add a new service: Bandcamp\n\nبهبود یافته:\n• Add an option to have the app follow the device theme\n• Prevent some crashes by showing an improved error panel\n• Show more information on why content in unavailable\n• Hardware space button triggers play/pause\n• Show \"Download started\" toast\n\nتعمیر شده:\n• Fix very small thumbnail in video details while playing in the background\n• Fix empty title in minimized player\n• Fix last resize mode not being restored correctly\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/967.txt",
    "content": "تعمیر کار نکردن درست یوتوب در اروپا. This was caused by a new cookie and privacy consent system which requires NewPipe to set a CONSENT cookie.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/968.txt",
    "content": "افزودن گزینهٔ جزییات کانال به فهرست لمس طولانی\nAdded functionality to rename Playlist Name from playlist interface.\nAllow the user to pause while a video is buffering.\nPolished the white theme.\nFixed overlapping fonts when using a larger font size.\nFixed no video on Formuler and Zephier devices.\nFixed various crashes.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/969.txt",
    "content": "• اجازهٔ نصب روی ذخیره‌ساز خارجی\n• [Bandcamp] Added support for displaying the first three comments on a stream\n• Only show 'download has started' toast when download is started\n• Do not set reCaptcha cookie when there is no cookie stored\n• [Player] Improve cache performance\n• [Player] Fixed player not automatically playing\n• Dismiss previous Snackbars when deleting downloads\n• Fixed trying to delete object not in list\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/970.txt",
    "content": "جدید\n• Show content metadata (tags, categories, license, ...) below the description\n• Added \"Show channel details\" option in remote (non-local) playlists\n• Added \"Open in browser\" option to long-press menu\n\nتعمیر شده\n• Fixed rotation crash on video detail page\n• Fixed \"Play with Kodi\" button in player always prompts to install Kore\n• Fixed and improved setting import and export paths\n• [YouTube] Fixed comment like count\nو بیش‌تر\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/971.txt",
    "content": "تعمیر سریع\n• Increase buffer for playback after rebuffer\n• Fixed crash on tablets and TVs when clicking on the play-queue icon in the player\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/972.txt",
    "content": "جدید\nRecognize timestamps and hashtags in description\nAdded manual tablet mode setting\nAdded ability to hide played items in a feed\n\nبهبود یافته\nSupport Storage Access Framework properly\nBetter error handling of unavailable and terminated channels\nThe Android share sheet for Android 10+ users now shows the content title.\nUpdated Invidious instances and support Piped links.\n\nتعمیر شده\n[YouTube] Age restricted content\nPrevent leaked window Exception when opening choice dialog\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/973.txt",
    "content": "تعمیر سریع\n• Fix thumbnails and titles being trimmed in grid layout, due to a wrong calculation of how many videos can fit in one row\n• Fix download dialog disappearing without doing anything if opened from the share menu\n• Update a library related to opening external activities such as the Storage Access Framework file picker\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/974.txt",
    "content": "تعمیر فوری\n• تعمیر مشکلات میانگیری ایجاد شده به دست دریچه‌بندی یوتوب\n• تعمیر استخراج نظرهای یوتوب و فروپاشی‌ها با نظرهای از کار افتاده\n• تعمیر جست‌وجوی آهنگ‌های یوتوب\n• تعمیر جریان‌های زندهٔ پیرتیوب\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/975.txt",
    "content": "جدید\n• نشان دادن یک پیش‌نمایش بندانگشتی هنگام جویش\n• تشخیص نظرهای از کار افتاده\n• اجازه به نشانه گذاشتن یک خوراک به تماشا شده\n• نماشی قلب‌های نظر\n\nبهبود\n• بهبود چینش برچسب‌ها و فراداده\n• اعمال رنگ خدمت به مولفه‌های رابط کاربری\n\nتعمیر\n• تعمیر بندانگشتی در پخش‌کنندهٔ کوچک\n• تعمیر میان‌گیری بی‌پایان روی موارد صف تکراری\n• برخی تعمیرهای پخش‌کننده چون چرخش و بستن سریع‌تر\n• تعمیر بارشده ماندن ری‌کپچا در پس‌زمینه\n• از کار انداختن کلیک‌ها هنگام تازه‌سازی خوراک\n• تعمیر برخی فروپاشی‌های بارگیر\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/976.txt",
    "content": "• افزودن گزینه برای گشودن مستقیم پخش‌کننده در تمام‌صفحه\n• اجازه انتخاب گونهٔ پیشنهاد جست‌وجو برای نمایش\n• افزودن زمینه تاریک تاریک‌تر و صفحه گشایش تاریک\n• بهبود گزینشگر پرونده برای تار کردن پرونده‌های ناخواسته\n• تعمیر درون‌ریزی اشتراک‌های یوتوب\n• نیاز به زدن دوباره روی دکمهٔ پخش دوباره برای پخش دوباره جریان\n• تعمیر بستن نشست صوتی\n• [تلویزیون اندرویدی] تعمیر پرش‌های بلند نوار جویش هنگام استفاده از دی‌پد\n\nبرای دیدن تغییرات بیش‌تر، گزارش دگرگونی (و فرسته وبلاگی) را از زبانهٔ پیوندها در زیر ببینید.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/977.txt",
    "content": "• افزودن یک دکمهٔ «پخش بعدی» به فهرست لمس طولانی\n• افزودن پیشوند مسیر کوتاه‌های یوتوب به پالایهٔ intent\n• تعمیر درون‌ریزی تنظیمات\n• جابه‌جایی موقعیت نوار جویش با دکمه‌های پخش‌کننده در صفحهٔ صف\n• تعمیرهای مختلف مربوط به مدیر نشست رسانه\n• تعمیر کامل نشدن نوار جویش پس از پایان ویدیو\n• از کار انداختن تونل‌زنی رسانه روی RealtekATV\n• گستردن ناحیهٔ قابل کلیک دکمه‌های پخش‌کنندهٔ کمینه\n\nبرای دیدن دگرگونی‌های بیش‌تر،‌گزارش دگرگونی (و فرستهٔ وبلاگی) را از زبانهٔ پیوندها در زیر ببینید.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/978.txt",
    "content": "تعمیر اجرای بررسی برای نگارش جدیدی از نیوپایپ. این بررسی گاهی بیش از حد زود انجام می‌شد که منجر به فروپاشی کاره می‌شد. اکنون باید درست شده باشد.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/979.txt",
    "content": "- تعمیر از سر گیری پخش\n- بهبودهایی برای اطمینان از لزوم بررسی نگارش‌های جدید\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/981.txt",
    "content": "برداشتن پشتیبانی MediaParser برای تعمیر شکست از سر گیری پخش پس از میانگیری روی اندروید ۱۱+.\nتونل‌زنی رسانهٔ از کارافتاده روی QM16XE فیلیپس برای تعمیر مشکلات پخش.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/982.txt",
    "content": "مشکل عدم نمایش پخش‌زنده برطرف شد.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/985.txt",
    "content": "مشکل عدم نمایش پخش‌زنده برطرف شد\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/998.txt",
    "content": "مشکل عدم نمایش پخش‌زنده برطرف شد\n"
  },
  {
    "path": "fastlane/metadata/android/fa/changelogs/999.txt",
    "content": "مشکل عدم نمایش پخش‌زنده برطرف شد\n"
  },
  {
    "path": "fastlane/metadata/android/fa/full_description.txt",
    "content": "نیوپایپ از هیچ کتابخانه از چهارچوب گوگل یا API یوتیوب استفاده نمی‌کند. این برنامه تنها وب‌گاه را به منظور دریافت اطلاعات مورد نیاز تجزیه می‌کند. در نتیجه این برنامه، بدون نصب بودن خدمات گوکل نیز قابل استفاده است. همچنین برای استفاده از نیوپایپ، نیازی به حساب یوتیوب ندارید. آزاد نیز هست.\n"
  },
  {
    "path": "fastlane/metadata/android/fa/short_description.txt",
    "content": "یک رابط کاربری اندرویدی سبک و آزاد برای یوتیوب.\n"
  },
  {
    "path": "fastlane/metadata/android/fi/changelogs/63.txt",
    "content": "### Parannukset\n- Tuonti-/vientiasetukset #1333\n- Vähennetty ylipiirtoa (suorituskyvyn parannus) #1371\n- Pieniä koodiparannuksia #1375\n- Lisätty kaikkea yleiseen tietosuoja-asetukseen (GDPR) liittyen #1420\n\n### Korjattu\n- Lataaja: Korjattu kaatuminen ladattaessa keskeneräisiä tallennuksia .-giga-tiedostoista #1407\n"
  },
  {
    "path": "fastlane/metadata/android/fi/changelogs/64.txt",
    "content": "### Parannukset\n- Lisätty mahdollisuus rajoittaa videon laatua mobiilidataa käytettäessä. #1339\n- Muista istunnon kirkkaus #1442\n- Parannettu lataussuorituskykyä heikommilla suorittimilla #1431\n- lisätty (toimiva) tuki mediaistunnolle #1433\n\n### Korjaukset\n- Korjattu kaatuminen latausten avaamisessa (korjaus nyt saatavilla julkaisuversioissa) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/fi/changelogs/830.txt",
    "content": "Päivitetty SoundCloud client_id korjatakseen ongelmia SoundCloudissa.\n"
  },
  {
    "path": "fastlane/metadata/android/fi/changelogs/957.txt",
    "content": "• Yhdistetty tietyt jonotoiminnot\n• Kahden sormen ele soittimen sulkemiseksi\n• Valinta reCAPTCHA-evästeiden tyhjentämiseksi\n• Ilmoitusvärin muokkaus\n• Korjattu videon tietojen avaaminen, buginen käyttäytyminen NewPipeen jaettaessa ja muita epäjohdonmukaisuuksia\n• Nopeutettu YouTube-videoita ja korjattu ikärajoitettuja\n• Korjattu kaatuminen eteen-/taaksekelattaessa\n• Ei uudelleenjärjestä listoja raahaatessa esikatselukuvia\n• Ponnahdusikkunan ominaisuudet muistetaan aina\n• Lisätty santalin kieli\n"
  },
  {
    "path": "fastlane/metadata/android/fi/changelogs/973.txt",
    "content": "Pikakorjaus\n* Korjattu esikatselukuvien ja otsikoiden leikkautuminen johtuen väärästä laskelmasta montako videota mahtuu riville\n* Korjattu latausnäkymän katoaminen itsestään, jos se avattiin jakamisvalikosta\n* Päivitetty kirjasto ulkoisten aktiviteettien avaamiseen kuten SAF-tiedostovalitsimeen\n"
  },
  {
    "path": "fastlane/metadata/android/fi/changelogs/974.txt",
    "content": "Pikakorjaus\n* Korjattu puskurointiongelmat, jotka johtuvat YouTuben kuristumisesta\n* Korjattu YouTuben kommenttien lataaminen ja kaatumiset poistettuihin kommentteihin liittyen\n* Korjattu YouTuben musiikkihaku\n* Korjattu PeerTuben suoratoistot\n"
  },
  {
    "path": "fastlane/metadata/android/fi/changelogs/975.txt",
    "content": "Uutta\n* Näyttää esikatselukuvat selatessa\n* Tunnistaa poistetut kommentit\n* Sallii kohteen merkitsemisen luetuksi\n* Näyttää sydämet kommenteissa\n\nParanneltua\n* Metadatan ja tagien asettelu\n* Palvelun väri UI-komponentteihin\n\nKorjattua\n* Pienoiskuvake minisoittimessa\n* Loputon puskurointi jonon duplikaattikohteissa\n* Toistinkorjauksia: kiertäminen ja nopeampi sulkeminen\n* Taustalle lataamaan jäänyt ReCAPTCHA\n* Poistettu klikkaukset syötteen päivittämisessä\n* Lataajan kaatumisia\n"
  },
  {
    "path": "fastlane/metadata/android/fi/full_description.txt",
    "content": "NewPipe ei käytä mitään Google-kirjastoja tai YouTuben API:a. Se ainoastaan käsittelee verkkosivuja saadakseen tarvitsemansa informaation. Siksi tätä sovellusta voidaan käyttää laitteilla ilman Google Palveluiden asentamista. Et myöskään tarvitse YouTube-tiliä käyttääksesi NewPipea, ja se on FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/fi/short_description.txt",
    "content": "Vapaa kevyt YouTube-katseluohjelma Androidille.\n"
  },
  {
    "path": "fastlane/metadata/android/fil/changelogs/63.txt",
    "content": "### Mga Pagpapabuti\n- Mag-import/export ng mga setting #1333\n- Bawasan ang pag-overdraw (nakabubuti sa pagtakbo ng app) #1371\n- Ilan pang mga pagpapahusay #1375\n- Mga bagay tungkol sa GDPR #1420\n\n### Mga Pagsasaayos\n- Pang-download: Iwasan ang pag-crash kapag pinoproseso ang mga hindi pa natatapos na download mula sa mga .giga file #1407\n"
  },
  {
    "path": "fastlane/metadata/android/fil/changelogs/64.txt",
    "content": "### Mga pagpapabuti\n- Maaari nang limitahan ang kalidad ng video kung gumagamit ng mobile data. #1339 \n- Tandaan ang liwanag ng screen para sa sesyon #1442 \n- Mas pinainam na pag-download sa mahihinang CPU #1431 \n- (Gumaganang) suporta para sa media session #1433\n\n### Fix\n- Inayos ang crash tuwing binubuksan ang mga download (nasa release builds na rin ito) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/fil/full_description.txt",
    "content": "Hindi gumagamit ng mga framework library ng Google o API ng YouTube ang NewPipe. Pina-parse lang nito ang website upang makuha ang kinakailangang impormasyon, kaya maaaring itong gamitin sa mga device kung saan hindi naka-install ang Google Services. FLOSS ito, at hindi mo rin kailangang gumamit ng account.\n"
  },
  {
    "path": "fastlane/metadata/android/fil/short_description.txt",
    "content": "Libre't magaang YouTube frontend para sa Android.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/1000.txt",
    "content": "Améliorations\n• Rendre la description de la liste de lecture cliquable pour afficher plus / moins de contenu.\n• Ne lancer la lecture que d'un seul élément dans l'écran de l'historique.\n\nCorrections\n• Correction des plantages de l'aperçu de la barre de recherche.\n• Correction de l'ajout à la playlist d'un élément sans vignette.\n• Correction de la fenêtre contextuelle de mise en file d'attente des éléments associés.\n• Ajustement de la disposition des éléments des signets de la liste de lecture.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/1001.txt",
    "content": "Amélioré\n• Toujours autoriser la modification des préférences de notification du lecteur sur Android 13+\n\nCorrigé\n• Correction de l'exportation de la base de données / des abonnements qui ne tronquait pas un fichier déjà existant, ce qui pouvait conduire à une exportation corrompue\n• Correction de la reprise de lecture depuis le début en cliquant sur un horodatage\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/1002.txt",
    "content": "Correction d'un problème empêchant YouTube de lire les vidéos en streaming.\n\nCette version résout uniquement l'erreur la plus urgente qui empêche le chargement des détails des vidéos YouTube.\nNous sommes conscients qu'il existe d'autres problèmes et nous publierons bientôt une version séparée pour les résoudre.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/1003.txt",
    "content": "Cette m.à.j corrective résout les problèmes suivants sur YouTube :\n• [YouTube] Correction du problème de chargement des informations vidéo, des erreurs HTTP 403 lors de la lecture et restauration de la lecture de certaines vidéos à contenu restreint.\n• Correction du problème d'affichage de la taille des sous-titres.\n• Correction du double téléchargement des informations lors de l'ouverture d'un flux.\n• [SoundCloud] Suppression des flux protégés par DRM et illisibles.\n• Traductions mises à jour.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/1004.txt",
    "content": "Correction de YouTube qui ne lisait aucun média\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/1005.txt",
    "content": "Nouveautés\n• Ajout de la compatibilité avec Android Auto\n• Possibilité de définir des groupes de flux comme onglets de l'écran principal\n\nAméliorations\n• Amélioration des suggestions de la barre de recherche\n• Affichage de la date de téléchargement dans Téléchargements\n\nCorrections\n• Correction des couleurs de texte défectueuses en mode sombre\n• [YouTube] Correction du chargement des playlists de plus de 100 éléments\n• [YouTube] Correction de l'affichage des vidéos recommandées manquantes\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/1006.txt",
    "content": "Conservation du lecteur en cours lors du clic sur les horodatages\nTentative de récupération des téléchargements en attente\nAjout d'une option pour supprimer un téléchargement sans supprimer le fichier\nAutorisation de superposition : affichage d'une boîte de dialogue explicative pour Android > R\n\nCorrection du formatage du nombre court pour les versions Android inférieures à 7\nCorrection des notifications fantômes\nCorrections pour les fichiers de sous-titres SRT\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/1007.txt",
    "content": "Correction de YouTube qui ne lisait aucun média\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/1008.txt",
    "content": "∙ Correction de la reprise des flux à la dernière position de lecture.\n∙ [YouTube] Ajout de la prise en charge d'autres formats d'URL de chaîne.\n∙ [YouTube] Ajout de la prise en charge d'autres formats de métadonnées vidéo.\n∙ Mise à jour des traductions\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/1009.txt",
    "content": "Important\nInformations et appel à l'action pour la campagne Keep Android Open ajoutés : https://www.keepandroidopen.org/\n\nAméliorations\n[Flux] Ordre de mise à jour des abonnements obsolètes aléatoire\nPages de commentaires non empilées\nÉvénements de clic désactivés sur la page de détails d'une vidéo\n\n\nCorrections\nAffichage de l'en-tête des réponses aux commentaires sans image d'avatar\nCorrections d'interface utilisateur pour plusieurs lecteurs\n[SoundCloud] Correction des flux avec des identifiants longs\n\nEt bien d'autres corrections et améliorations !\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/63.txt",
    "content": "### Améliorations\n- Import/export des paramètres #1333 \n- Réduction overdraw (amélioration des performances) #1371 \n- Petites améliorations du code #1375 \n- Ajout d'un popup RGPD #1420\n\n### Corrections\n- Téléchargeur : Correction d'un plantage lors du chargement de téléchargements inachevés de fichiers .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/64.txt",
    "content": "### Améliorations\n- Possibilité de limiter la qualité vidéo pour l'utilisation des données mobiles #1339 \n- Mémoriser la luminosité pour la session #1442 \n- Améliorations des performances de téléchargement pour les processeurs peu performants #1431 \n- Support pour les sessions média #1433\n\n### Corrections\n- Plantage lors de l'ouverture des téléchargements (disponible pour les versions ultérieures) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/65.txt",
    "content": "### Améliorations\n- Ajout d'une option pour avancer rapidement pendant les silences dans le contrôle de la vitesse de lecture. Cette fonction devrait être utile pour les livres audio et certains genres musicaux, et peut offrir une expérience d'écoute parfaitement fluide (mais peut aussi perturber la lecture d'un morceau comportant de nombreux silences =\\\\)\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/66.txt",
    "content": "# Journal des modifications de la v0.13.7\n\n### Améliorations\n- Mise à jour de la version de la bibliothèque et correction de la sauvegarde de la base de données #1510\n- Refonte de la boîte de dialogue de contrôle de la vitesse de lecture pour permettre des incréments différents et ainsi accélérer les changements de vitesse.\n\n### Corrections\n- #1495 : mise à jour des métadonnées (miniature, titre et nombre de vidéos) dès que l'utilisateur accède à la liste de lecture.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/68.txt",
    "content": "# Modifications de la v0.14.1\n\n### Nouveau\n- Nouveau design du tiroir (#1461)\n- Nouvelle page d'accueil personnalisable (#1461)\n\n### Améliorations\n- Refonte des commandes gestuelles (#1604)\n- Nouvelle méthode pour fermer le lecteur pop-up (#1597)\n\n### Corrigé\n - Afficher « Nombre d'abonnés indisponible » dans ces cas\n- Correction du blocage incorrect des vidéos YouTube Premium\n- Afficher un avertissement lors d'une tentative de téléchargement sur carte SD externe\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/69.txt",
    "content": "### Nouveau\n- Suppression et partage par appui long dans les abonnements #1516\n- Interface utilisateur pour tablettes et disposition de la liste en grille #1617\n\n### Améliorations\n- Activation de la disposition linéaire dans l'activité Téléchargements avec les noms complets des vidéos #1771\n- La mise en file d'attente déclenche désormais la lecture de la vidéo si la file d'attente de lecture est déjà terminée #1783\n\n### Bugs connus\n- État de lecture ne peut être enregistré sur Android P\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/70.txt",
    "content": "### Améliorations\n* Les fichiers téléchargés peuvent maintenant être ouverts en un seul clic. \n* Post-traitement pour les téléchargements et implémentation des fonctionnalités manquantes #1759 par @kapodamy\n* Déplacer les téléchargements sérialisés en attente (fichiers `.giga`) vers les données de l'application.\n\n### Corrigé\n* Correction d'un crash avec la résolution par défaut réglée sur la meilleure et la résolution limitée des données mobiles #1835\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/71.txt",
    "content": "### Améliorations\n* Notification maj GitHub #1608\n* Améliorations téléchargeur #1944 :\n  * Ajout des icônes blanches manquantes et utilisation d'une méthode hardcodé pour changer leurs couleurs\n  * Vérification si l'itérateur est initialisé (#2031)\n  * Autoriser le ré-essai de téléchargement après une erreur \"post-processing failed\" dans le nouveau muxer\n  * Nouveau muxer MPEG-4 corrigeant les flux non synchrones (#2039)\n\n### Corrections\n* Flux YouTube en direct s'arrêtent #1996\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/730.txt",
    "content": "# Corrections\n- Erreur liée à la fonctions de décryptage (encore).\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/740.txt",
    "content": "<h4>Améliorations</h4>\n<li>Rendre les liens dans les commentaires cliquables, augmenter la taille du texte</li>\n<li>Rechercher en cliquant sur les liens d'horodatage dans les commentaires</li>\n\n</ul>\n<h4>Corrections</h4>\n<li> Importation des abonnements YouTube : ignorer ceux dont l’URL est invalide et conserver ceux dont le titre est vide</li>\n<li>URL YouTube invalide : le nom de la balise signature n'est pas toujours \"signature\", ce qui empêche le chargement des flux.</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/750.txt",
    "content": "Nouveautés\n• Utilisation de Storage Access Framework pour stocker les téléchargements sur des cartes SD externes\n• Possibilité de modifier le répertoire de téléchargement avant de lancer un téléchargement\n\nAméliorations\n• Suppression des chaînes gema #2295\n• Gestion des changements de rotation (automatique) pendant le cycle de vie de l'activité #2444\n\nCorrections\n• Correction du blocage des téléchargements à 99,9 % #2440\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/760.txt",
    "content": "Changements dans la version 0.17.1\n\nAméliorations\n• Ajout de l'action \"Commencer à jouer ici\" dans les menus qui s'appuient longuement pour les playlists #2518\n• Ajout d'un commutateur pour le sélecteur de fichiers SAF / hérité #2521\n\nCorrections\n• [Extractor] Correction de ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186\n• [Extractor] [YouTube] Correction de l'erreur de recherche occasionnelle lorsque les playlists sont dans les résultats TeamNewPipe/NewPipeExtractor#185\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/770.txt",
    "content": "Changements 0.17.2\n\nCorrection\n- Aucune vidéo n'était disponible\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/780.txt",
    "content": "Changements 0.17.3\n\nAméliorations\n- Option pour effacer les états de lecture #2550\n- Affichage des répertoires cachés #2591\n- Support des URL des instances `invidio.us` #2488 \n- Support des URL de `music.youtube.com` TeamNewPipe/NewPipeExtractor#194\n\nCorrections\n- Exception \"java.lang.IllegalArgumentException #192\n- Flux en direct ne fonctionnant pas TeamNewPipe/NewPipeExtractor#195\n- Performance sur Android Pie lors du téléchargement d'un flux #2592\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/790.txt",
    "content": "Améliorations\n- Titres plus accessibles aux personnes aveugles #2655\n- Réglage langue du dossier de téléchargement #2637\n\nCorrections\n- Vérification si le dernier octet est téléchargé #2646\n- Défilement dans le fragment vidéo #2672\n- Double animation de recherche #2695\n- [SoundCloud] Correction de l'extraction du client_id #2745\n\nDéveloppement\n- Ajout dépendances manquantes de NewPipeExtractor dans NewPipe #2535\n- Migration AndroidX #2685\n- Mise à jour d'ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/800.txt",
    "content": "Amélioré\n- 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\n\nCorrection\n- 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 \n- Autorise les playlists sans uploader et corrige les crashs liés à ce problème #2724, TeamNewPipe/NewPipeExtractor#219\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/810.txt",
    "content": "Nouveautée :\n• Affiche la miniature de la vidéo sur l'écran de verrouillage lorsqu'elle est lu en arrière-plan\n\nAméliorations :\n• Ajout de la playlist locale à la file d'attente lors d'une pression longue sur le bouton arrière-plan / flottant\n• Possibilité de faire défiler les onglets de la page principale et les masquent lorsqu'il n'y a qu'un seul onglet\n\nCorrections :\n• Correction de plusieurs problèmes lors du partage d'une vidéo sur NewPipe et du téléchargement direct de ses flux\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/820.txt",
    "content": "Correction de la regex du nom de la fonction de décryptage rendant YouTube inutilisable.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/830.txt",
    "content": "Mise à jour du client SoundCloud_id pour corriger les problèmes de SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/840.txt",
    "content": "Nouveau\n• Ajout d'un sélecteur de langue pour changer la langue de l'application\n• Ajout de la possibilité de copier les commentaires en appuyant longuement\n\nAmélioré\n• 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\n\nCorrigé\n• 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\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/850.txt",
    "content": "Dans cette version, la version du site YouTube a été mise à jour. L'ancienne version du site web sera abandonnée en mars et vous devez donc mettre à jour NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/860.txt",
    "content": "Améliorations\n- Sauvegarde et restauration, que la hauteur et le tempo soient détachés ou non\n- Coupure d'affichage dans le lecteur\n- Calcul de l'arrondi pour le nombre de vues et le nombre d'abonnés\n- Optimisation YouTube pour utiliser moins de données\n\nPlus de 15 bogues liés à YouTube ont été corrigés dans cette version.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/870.txt",
    "content": "Il s'agit d'un correctif qui met à jour NewPipe pour permettre d'utiliser à nouveau SoundCloud sans problèmes majeurs.\nL'API v2 de SoundCloud est maintenant utilisée dans l'extracteur et la détection des ID clients invalides a été améliorée.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/900.txt",
    "content": "Ajouts\n- Groupes d'abonnement et flux triés\n- Bouton \"Mute\" dans les lecteurs\n\nAméliorations\n- Ouverture des liens music.youtube.com et media.ccc.de dans NewPipe\n- Déplacement de deux paramètres de Apparence vers Contenu\n- Cacher les options 5,15,25 secs si la recherche inexacte est activée\n\nCorrections\n- Certaines vidéos WebM ne sont pas navigables\n- Sauvegarde de la base de données sur Android P\n- Crash lors du partage d'un fichier téléchargé\n- Tonnes de problèmes d'extraction sur YouTube...\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/910.txt",
    "content": "Correction de la migration de la base de données qui empêchait NewPipe de démarrer dans de rares cas.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/920.txt",
    "content": "Améliorations\n\n- Ajout de la date de publication et du nombre de visionnages sur les éléments de la grille des diffusions\n- Améliorations pour le dessin de la mise en page de l'en-tête\n\nCorrections\n\n- Bouton de mise en sourdine entraînant des plantages sur l'API 19\n- Téléchargement de longues vidéos 1080p 60fps\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/930.txt",
    "content": "Nouveau\n• Recherche sur YouTube Music\n• Prise en charge Android TV de base\n\nAmélioré\n• Ajout de la possibilité de supprimer toutes les vidéos regardées d'une playlist locale\n• Afficher un message lorsque le contenu n'est pas encore pris en charge au lieu de planter\n\nCorrigé\n• Correction du paramètre de contenu restreint par âge qui ne fonctionne pas\n• Correction de certains types de reCAPTCHA\n• Correction du crash lors de l'ouverture des signets alors que la playlist est « nulle »\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/940.txt",
    "content": "Ajouts\n- Support commentaires de SoundCloud\n- Mode restreint de YouTube\n- Détails de la chaîne parentale de PeerTube\n\nAméliorations\n- Bouton Kore uniquement pour les services supportés\n- Blocage des gestes débutant sur la barre de navigation ou d'état\n- Couleur de fond des boutons réessai & abonnement\n\nCorrections\n- Gel de la boîte de dialogue de téléchargement\n- \"Ouvrir dans le navigateur\" s'ouvre réellement dans le navigateur\n- Crash à l'ouverture des vidéos et \"Impossible de lire ce flux\"\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/950.txt",
    "content": "Cette version apporte trois petites corrections :\n – correction de l’accès au stockage pour Android 10+\n – correction de l’ouverture des kiosques\n – correction de la durée d’analyse des longues vidéos\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/951.txt",
    "content": "Ajouts\n- Recherche dans sélecteur d'abonnement\n- Filtre pour abonnements non groupés\n- Onglet \"Playlist\" à la page principale\n- Avance/retour dans la file du lecteur en arrière-plan/pop-up\n- Affichage suggestions de recherche\n\nAméliorations\n- Retrait métadonnées dans fichiers multiplexés\n- Ne pas retirer les flux qui ont échoué de la file\n- Couleurs barres d'outils et d'état similaires\n\nCorrections\n- Correction de la désynchronisation audio/vidéo\n- [PeerTube] Gestion des commentaires supprimés\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/952.txt",
    "content": "Améliorations\n• La lecture automatique est maintenant disponible pour tous les services (et plus seulement pour YouTube)\n\nCorrections\n• Correction des flux suggérés par l’ajout de la prise en charge des nouvelles continuations de YouTube\n• Correction des vidéos YouTube avec restriction d’âge\n• [Android TV] Correction de la persistance du surlignement de la cible de saisie sur le texte d’avant-plan\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/953.txt",
    "content": "Correction de l’extraction de la fonction de déchiffrement de YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/954.txt",
    "content": "• nouv. fonctionnement de l'appli : lire une vidéo sur sa page, glisser vers le bas pour minimiser\n• notifications MediaStyle : actions customisables dans les notifications, amélioration des performances\n• NewPipe mode bureau : redimensionnement possible\n\n• Affichage d'un dialogue avec options si URL pas supportée\n• Amélioration expérience des suggestions de recherche\n• Qualité par défaut augmentée : 720p60 (plein écran) & 480p (popup)\n\n• bcp de corrections de bug et +\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/955.txt",
    "content": "[YouTube] Correction de la recherche pour certains utilisateurs\n[YouTube] Correction des exceptions de déchiffrement aléatoires\n[SoundCloud] Les URL qui finissent par un slash sont désormais lues correctement\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/956.txt",
    "content": "[YouTube] Correction d’un plantage lors du chargement de n’importe quelle vidéo\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/957.txt",
    "content": "• Unification des actions spécifiques à la liste d’attente\n• Geste à deux doigts pour fermer le lecteur\n• Option de suppression des cookies reCAPTCHA\n• Option pour ne pas coloriser les notifications\n• Correction de la tamponisation infinie\n• Accélération des vidéos YouTube et correction de celles avec restriction d’âge\n• Correction de l’avance et retour rapide\n• Pas réarrangement des listant en glissant les miniatures\n• Toujours mémoriser les propriétés du lecteur flottant\n• Ajout du Santali\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/958.txt",
    "content": "Nouveautés :\n• Tirer pour actualiser les abonnements\n• Option pour masquer la miniature sur l'écran de verrouillage de nouveau dispo.\n• Amélioration du chargement des listes locales (playlists, historique…)\n\nCorrigé :\n• Crash au démarrage quand NewPipe n'était plus dans la RAM\n• Crash au démarrage quand l'appareil n'était pas connecté à internet\n• Paramètres de luminosité et de volume\n• [YouTube] Playlists longues\n\nAutres :\n• Mise à jour des traductions\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/959.txt",
    "content": "Correction d'une boucle infinie de crash lors de l'ouverture du système de reportage des erreurs.\nMise à jour de la liste des instances PeerTube qui peuvent être ouvertes automatiquement par NewPipe.\nMise à jour des traductions.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/960.txt",
    "content": "• Amélioration de la description de l'option export de la base de donnée dans les paramètres.\n• Analyse des commentaires YouTube corrigé.\n• Affichage du nom du service media.ccc.de corrigé.\n• Traductions mises à jour.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/961.txt",
    "content": "• [YouTube] Support des Mix\n• [YouTube] Affichage des informations à propos du Covid et des chaines de service public\n• [media.ccc.de] Support des vidéos récentes\n• Traduction en Somalien\n\n• Beaucoup d'améliorations internes\n\nCorrections :\n• Partager des vidéos depuis le lecteur\n• Page ReCaptcha blanche\n• Crash lors de la suppression d'un élément d'une liste\n• [PeerTube] Vidéos liées\n• [YouTube] Moteur de recherche YouTube Music\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/962.txt",
    "content": "Ajout de vidéos « récentes » au service media.ccc.de.\nAjout de flux en direct au service media.ccc.de et également à la prise en charge du flux en direct.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/963.txt",
    "content": "• [YouTube] rétablissement des flux\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/964.txt",
    "content": "• Ajout des chapitres dans lecteur\n• [PeerTube] Ajout recherche en sépia\n• Ajout bouton de partage en vue détaillée de la vidéo, déplacement description du flux dans l'onglet\n• Désactivation restauration de luminosité si le geste est désactivé\n• Ajout élément de liste pour lire vidéos sur Kodi\n• Correction crash si aucun navigateur par défaut défini, amélioration dialogues de partage\n• Basculer lecture/pause avec bouton d'espace matériel en lecteur plein écran\n• [media.ccc.de] Corrections\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/965.txt",
    "content": "Correction d'un crash lors de la réorganisation des groupes de chaînes.\nCorrection d'erreurs lors du chargement de la suite des vidéos d'une chaîne ou playlist YouTube.\nCorrection de la récupération des commentaires YouTube.\nCorrection de l'extraction de SoundCloud et du contenu géo-restreint.\nAjout du support des chemins /watch/, /v/ et /w/ dans les URLs YouTube.\nAjout de la traduction du Kurde du Nord.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/966.txt",
    "content": "Nouveautés\n• Ajout Bandcamp\n\nAméliorations\n• Ajout option pour que application suive thème de l'appareil\n• Prévention plantages par affichage panneau d'erreurs amélioré\n• Plus d'informations sur raison indisponibilité contenu\n• Bouton matériel espace déclenche lecture/pause\n• Affichage toast \"Téléchargement commencé\"\n\nCorrections\n• Très petite vignette dans détails de vidéo lors de lecture en arrière-plan\n• Titre vide dans lecteur réduit\n• Dernier mode redimensionnement pas restauré correctement\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/967.txt",
    "content": "La réparation du flux YouTube ne fonctionnait pas correctement dans l'UE. Ceci était dû à un nouveau système de cookies et de consentement à la confidentialité qui exige que NewPipe définisse un cookie CONSENT.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/968.txt",
    "content": "Ajout d'une option de détails sur les chaînes dans le menu de pression longue.\nAjout d'une fonctionnalité permettant de renommer le nom de la playlist à partir de l'interface de la playlist.\nPermet à l'utilisateur de faire une pause pendant la mise en mémoire tampon d'une vidéo.\nLe thème blanc a été amélioré.\nCorrection du chevauchement des polices lors de l'utilisation d'une taille de police plus grande.\nCorrection de l'absence de vidéo sur les appareils Formuler et Zephier.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/969.txt",
    "content": "• Autoriser installation sur un stockage externe\n• [Bandcamp] Ajout fonction permettant d'afficher les trois premiers commentaires d'un flux\n• Afficher 'download has started' uniquement lorsque téléchargement lancé\n• Ne pas définir cookie reCaptcha lorsqu'aucun n'est stocké\n• [Player] Amélioration performances cache\n• [Player] Correction problème lecture automatique\n• Désactiver barres d'état précédentes lors suppr. des téléchargements\n• Correction suppression objet ne figurant pas dans la liste\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/970.txt",
    "content": "Nouveautés\n• Affichage métadonnées du contenu sous la description\n• Ajout option \"Afficher les détails de la chaîne\" dans les playlists distantes\n• Ajout option \"Ouvrir dans le navigateur\" dans le menu de la touche longue\n\nCorrections\n• Correction d'un crash de rotation sur la page de détails de la vidéo\n• Correction du bouton \"Jouer avec Kodi\" qui demande toujours d'installer Kore\n• Correction chemins d'import/export des paramètres\n• Correction nombre de commentaires aimés\nEt bien plus encore\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/971.txt",
    "content": "Correctifs\n• Augmentation de la mémoire tampon pour la lecture après le re-buffer\n• Correction d'un crash sur les tablettes et les téléviseurs lors d'un clic sur l'icône de la file d'attente dans le lecteur\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/972.txt",
    "content": "#Nouveautés :\n-Identifier dates et étiquettes dans la description\n-Ajout des paramètres manuels du mode tablette\n-Possibilité de masquer l'élément en cours dans le flux\n\n#Améliorations :\n-Prend correctement en charge l'infrastructure logicielle\n-Meilleur maniabilité des erreurs de chaînes indisponibles ou supprimées\n-La fenêtre de partage d'Android pour les utilisateurs d'Android 10+ affiche le titre\n-Mise à jour d'instances et prise en charge de liens de Pipe.\n\n#Et quelques corrections…\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/973.txt",
    "content": "Correctifs\n• Correction des vignettes et des titres qui sont coupés dans la mise en page en vue grille, dû à un calcul erroné du nombre de vidéos pouvant tenir dans une rangée.\n• Correction de la boîte de dialogue de téléchargement qui disparaît sans rien faire si elle est ouverte à partir du menu de partage\n• Maj d'une bibliothèque liée à l'ouverture d'activités externes telles que le sélecteur de fichiers du framewok d'accès stockage\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/974.txt",
    "content": "Correctifs\n• Correction des problèmes de mise en mémoire tampon causés par la restriction de débit de YouTube\n• Correction de l'extraction des commentaires de YouTube et des plantages avec les commentaires désactivés\n• Correction de la recherche de musique sur YouTube\n• Correction des directs PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/975.txt",
    "content": "Nouveau\n• Miniature de prévisualisation lors d’une recherche\n• Détecte les commentaires désactivés\n• Autorise le marquage d’un item de flux comme vu\n• Affiche les cœurs de commentaires\n\nAméliorations\n• Métadonnées et mise en page des balises améliorées\n• Application de la couleur de service sur les composants de l’interface\n\nCorrections\n• Correction de la mise en tampon infinie\n• Correction du ReCAPTCHA restant chargé en arrière-plan\n• Désactivation des clics lors du rafraîchissement d’un flux\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/976.txt",
    "content": "• Ajout d'une option pour mettre directement le plein écran\n• Laisse le choix du type de suggestion de recherche\n• Le thème sombre est maintenant plus sombre + ajout de l'écran de démarrage sombre\n• Amélioration du sélecteur de fichier en colorant en gris les fichiers non désiré\n• Correction de l'importation des abonnement YouTube\n• Relancer un flux demande de réappuyer sur le bouton relancer\n• Correction\n• [Android TV]\n\nPour voir plus de modification, regardez le journal de modifications.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/977.txt",
    "content": "• Ajout bouton \"lecture suivante\" au menu de la pression longue\n• Ajout préfixe du chemin des shorts YouTube au filtre d'intention\n• Correction importation des paramètres\n• Permutation position barre de recherche avec boutons du lecteur dans l'écran de la file d'attente\n• Corrections liées à MediasessionManager\n• Correction barre de progression qui ne se termine pas après fin de vidéo\n• Désactivation tunneling média sur RealtekATV\n• Élargissement zone cliquable des boutons de lecture minimisés\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/978.txt",
    "content": "Correction de la vérification d'une nouvelle version de NewPipe. Cette vérification était parfois exécutée trop tôt ce qui entraînait un plantage de l'application.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/979.txt",
    "content": "- Correction de la reprise de la lecture\n- Améliorations pour assurer que le service qui détermine si NewPipe devrait vérifier les mises à jour n'est pas lancée en arrière-plan\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/980.txt",
    "content": "Nouveautés\n• Ajout option \"Ajouter à la playlist\" au menu de partage\n• Ajout prise en charge des liens courts y2u.be et PeerTube\n\nAméliorations\n• Commandes de vitesse de lecture plus compactes\n• Le flux met désormais en évidence les nouveaux éléments\n• L'option \"Afficher les éléments surveillés\" dans le flux est maintenant enregistrée\n\nCorrections\n• Correction extraction des likes/dislikes de YouTube\n• Correction relecture automatique après le retour de l'arrière-plan\nEt bien d'autres\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/981.txt",
    "content": "Suppression du support de MediaParser pour corriger les échec des lectures après le transfère en mémoire tampon sur Android 11+.\nDésactivation de la tunnelisation de media sur les Philips QM16XE pour corriger les problèmes de lectures.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/982.txt",
    "content": "Correction de YouTube qui ne lisait aucun média.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/983.txt",
    "content": "Ajoute de nouveaux interface et comportement pour la recherche par double-touche\nRend les paramètres recherchables\nSurligne les commentaires épinglés comme tels\nAjoute l’ouverture avec app pour l’instance PeerTube de la FSFE\nAjoute les notifications d’erreur\nCorrige la relecture du premier item de la file lorsque le lecteur change\nAttend plus longtemps lors des directs avant d’échouer\nCorrige l’ordre des résultats d’une recherche locale\nCorrige les champs d’item vides dans la playlist\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/984.txt",
    "content": "Charge assez d’items dans les listes pour remplir l’écran et corriger le défilement sur les tablettes et les télés\nCorrige les plantages lors du défilement des listes\nL’arc de superposition de l’avance rapide est désormais sous l’interface du système\nRevient sur les modifications des découpes lors de la lecture en multi-fenêtres, qui causent la régression du lecteur mal positionné sur certains appareils\nMet à jour compileSdk à la version 31\nMet à jour la bibliothèque de rapports d’erreur\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/985.txt",
    "content": "Correction de YouTube qui ne lisait aucun média\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/986.txt",
    "content": "Ajouts\n• Notifications pour les nouveaux flux\n• Transition fluide entre les lecteurs vidéo et en arrière-plan\n• Modification de la hauteur de son par demi-tons\n• Ajout de la file du lecteur principal dans une playlist \n\nAméliorations\n• Enregistrement du pas de la vitesse et de la hauteur audios\n• Réduction du chargement initial d’une vidéo\n• Confirmer avant la suppression de tous les fichiers téléchargés\n\nCorrections\n• Réinitialisation de la lecture lors du changement de lecteur\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/987.txt",
    "content": "Nouveautés\n• Prise en charge d'autres méthodes de diffusion que le HTTP progressif : temps de chargement plus rapide, corrections pour PeerTube et SoundCloud, lecture des nouveaux flux en directs de YouTube\n• Bouton pour ajouter une playlist distante à une locale\n• Prévisualisation d'images lors d'un partage pour Andoid 10+\n\nAméliorations\n• Amélioration de la boîte de dialogue des paramètres de la lecture\n• Déplacement des boutons importation/exportation vers le menu à trois points\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/988.txt",
    "content": "[YouTube] Correction de l'erreur « Impossible d'obtenir un flux » lors de la lecture d'une vidéo\n[YouTube] Correction du message « Le contenu suivant n'est pas disponible sur cette application. » affiché à la place de la vidéo demandée\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/989.txt",
    "content": "• [YouTube] Correction du chargement infini lors de la lecture d'une vidéo\n• [YouTube] Correction de l'accélération de certaines vidéos\n• Mise à jour 1.15.3 de la bibliothèque jsoup contenant une correction de sécurité\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/990.txt",
    "content": "Cette mise à jour abandonne la prise en charge d'Android 4.4 KitKat, la nouvelle version minimum est Android 5 Lollipop !\n\nNouveautés\n• Télécharger depuis le menu d'appuis long\n• Cacher les futures vidéos dans le flux\n• Partager des playlists locales\n\nAméliorations\n• Réusinage du code du lecteur en petits composants : moins de mémoire vive utilisée, moins de bogues\n• Meilleur redimension des miniatures\n• Vectorisation des emplacements des images\n\nCorrections\n• Notifications\n• Plein écran\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/991.txt",
    "content": "Nouveautés\n• Ajout du bouton « Ouvrir dans un navigateur » dans le paneau d'erreur\n• Ajout de la possibilité d'afficher les groupes de chaîne en liste\n• [YouTube] Appuis long sur le segment d'un flux pour partager l'URL avec l'horodatage\n• Ajout d'un bouton sur le lecteur reduit\n\nAméliorations\n• Ajout de la traduction en islandais et mise à jour de d'autre langues\n• De nombreuses améliorations internes\n\nCorrections\n• Correction de plantages\n• [YouTube] Correction du chargement des chaînes\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/992.txt",
    "content": "Nouveau\n• Nombre d'abonnés dans les détails de la vidéo\n• Télécharger depuis la file d'attente\n• Définir de manière permanente une miniature de playlist \n• Hashtags et liens à appui long\n• Mode d'affichage de la carte\n\nAmélioré\n• Bouton de fermeture du mini-lecteur plus grand\n• Réduction d'échelle des vignettes plus fluide\n• La recherche ne met plus le lecteur en pause\n\nCorrigé\n• Correction de la superposition sur DeX/souris\n• Autoriser le lecteur d'arrière-plan sans flux audio séparés\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/993.txt",
    "content": "Nouveau\n• Ajout d'un avertissement lors de l'ajout de doublons de playlist et ajout d'un bouton pour les supprimer\n• Autoriser l'ignorance des boutons matériels\n• Autoriser le masquage des vidéos partiellement regardées dans le flux\n\nAmélioré\n• Utiliser plus de colonnes de grille sur les grands écrans\n• Rendre les indicateurs de progression cohérents avec les paramètres\n\nCorrigé\n• Correction de l'ouverture des URL du navigateur, des téléchargements et des lecteurs externes sur Android 11+\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/994.txt",
    "content": "Nouveau\n• Prise en charge de plusieurs pistes audio/langues\n• Possibilité de régler le volume et la luminosité par gestes sur n'importe quel côté de l'écran\n• Prise en charge de l'affichage des onglets principaux en bas de l'écran\n\nAmélioré\n• [Bandcamp] Gestion des pistes derrière le mur payant\n\nCorrigé\n• [YouTube] Erreurs HTTP 403 pour les flux\n• Fuite de mémoire du service de lecture\n• [PeerTube] Les avatars du téléchargeur et du sous-canal ont été échangés\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/995.txt",
    "content": "Nouveau\n• Prise en charge des onglets de chaîne\n• Sélection de la qualité de l'image\n• Obtenir les URL de toutes les images\n\nAmélioré\n• Meilleure sélection audio pour les téléchargements de vidéos uniquement\n• Option permettant d'inclure les noms de playlist et de vidéo dans le contenu de playlist partagé\n\nCorrigé\n• [YouTube] Correction de l'obtention du nombre de like\n• Correction des fenêtres contextuelles et des plantages du lecteur\n• Sélection de mauvaises langues dans le sélecteur de langue\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/996.txt",
    "content": "Correction d'une NullPointerException lors de l'ouverture d'un canal/conférence dans media.ccc.de.\nLe Grinch a essayé de vous interrompre avec notre cadeau de Noël, mais nous avons résolu le problème.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/997.txt",
    "content": "Nouveau\n• Ajouter des réponses aux commentaires\n• Autoriser la réorganisation des playlists \n• Afficher la description et la durée de la playlist \n\nAmélioré\n• Demander le consentement pour la vérification des mises à jour\n• Autoriser la lecture/pause de notifications pendant la mise en mémoire tampon\n\nCorrigé\n• [YouTube] Correction des commentaires qui ne se chargent pas, ainsi que d'autres correctifs et améliorations\n• Résoudre la vulnérabilité dans l'importation des paramètres et passer à JSON\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/998.txt",
    "content": "Correction de YouTube ne lisant aucun flux à cause d'erreurs HTTP 403.\n\nLes erreurs HTTP 403 occasionnelles au milieu d'une vidéo YouTube ne sont pas encore corrigées.\nCe problème sera traité dans un autre correctif dès que possible.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/changelogs/999.txt",
    "content": "Nouveau\n• [SoundCloud] Ajout de la prise en charge des URL on.soundcloud.com\n\nAmélioré\n• [Bandcamp] Afficher des informations supplémentaires dans le kiosque radio\n\nCorrigé\n• [YouTube] Correction des erreurs HTTP 403 occasionnelles au début ou au milieu des vidéos\n• [YouTube] Extraction de l'avatar et de la bannière de plus de types d'en-têtes de chaînes\n• [Bandcamp] Correction de divers bugs et utilisation systématique de HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/fr/full_description.txt",
    "content": "NewPipe n’utilise aucune bibliothèque logicielle de Google ni l’API de YouTube. Il analyse seulement le site Web afin de récupérer les informations nécessaires. Par conséquent, cette application peut être utilisée sur les appareils sans les services Google. De plus, vous n’avez pas besoin d’un compte YouTube pour utiliser NewPipe, et c’est un logiciel libre.\n"
  },
  {
    "path": "fastlane/metadata/android/fr/short_description.txt",
    "content": "Une interface YouTube libre et légère pour Android.\n"
  },
  {
    "path": "fastlane/metadata/android/gl/full_description.txt",
    "content": "NewPipe non usa ningunha libraría de Google nin a API de YouTube. Só analiza a páxina web para obter a información que precisa. Polo tanto esta aplicación pode usarse en dispositivos sen os servizos de Google. Ademais non necesitas unha conta de Youtube para usar NewPipe, e é FLOSS (software libre de código aberto).\n"
  },
  {
    "path": "fastlane/metadata/android/gl/short_description.txt",
    "content": "Un cliente de YouTube gratuíto e livián para Android.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/1002.txt",
    "content": "תוקנה התקלה ש־YouTube לא מנגן אף תזרים\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/1003.txt",
    "content": "תוקנה התקלה ש־YouTube לא מנגן אף תזרים\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/1004.txt",
    "content": "תוקנה התקלה ש־YouTube לא מנגן אף תזרים\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/1007.txt",
    "content": "תוקנה התקלה ש־YouTube לא מנגן אף תזרים\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/63.txt",
    "content": "### שיפורים\n- ייבוא/ייצוא הגדרות #1333\n- הפחתת ציור יתר (שיפור בביצועים) #1371\n- שיפורי קוד קטנים #1375 \n- נוספו כל מיני עניינים על GDPR‏ #1420\n\n### תיקונים\n- מנגנון ההורדה: תוקנה קריסה בעת טעינת הורדות שלא הסתיימו מקובצי ‎.giga‏ #1407\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/64.txt",
    "content": "### שיפורים\n- נוספה האפשרות להגביל את איכות הווידאו בעת שימוש בנתונים סלולריים. #1339 \n- הבהירות נשמרת למהלך כל אותה ההפעלה #1442 \n- ביצועי ההורדה שופרו במעבדים יותר חלשים #1431 \n- הוספת תמיכה (עובדת) בהפעלות מדיה #1433\n\n### תיקון\n- תוקנה קריסה בפתיחת הורדות (התיקון זמין כעת במהדורות היציבות) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/951.txt",
    "content": "חדש\n• הוספת חיפוש לבורר המינויים בדו־שיח קבוצת ההזנות\n• הוספת מסנן לדו־שיח קבוצת ההזנות כדי להציג מינויים בלתי מקובצים בלבד\n• הוספת לשונית רשימת נגינה לעמוד הראשי\n• הרצה מהירה קדימה/אחורה בתור נגן צף/רקע\n• הצגת הצעות חיפוש: למה התכוונת ומוצגות תוצאות עבור\n\nשיפורים\n• השמטת כתיבת נתוני על של יישומון בקבצים מרובבים\n• תזרימים שנכשלו לא יוסרו מהתור\n• צבע שורת המצב תואם לצבע סרגל הכלים\n\nתיקונים\n• תוקן סנכרון שמע/וידאו שנגרם עקב שגיאות נקודה צפה מצטברות\n• [PeerTube] טיפול בהערות שנמחקו\n\nועוד\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/952.txt",
    "content": "שיפורים\n• נגינה אוטומטית זמינה לכל השירותים (במקום רק ל־YouTube)\n\nתיקונים\n• תוקנו תזרימים קשורים על ידי תמיכה בהמשך נגינה החדש של YouTube\n• תוקנו מגבלות גיל על סרטונים של YouTube\n• [Android TV] תוקנה השתהות הצגת על של הדגשת מיקוד\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/953.txt",
    "content": "תוקן החילוץ של פונקציית הפענוח של YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/954.txt",
    "content": "• תצורת הנגינה השתנתה: ניתן לנגן סרטונים בעמוד הפירוט, לגרור כלפי מטה כדי למזער את הנגן\n• התראות MediaStyle: פעולות מותאמות אישית בהתראות, שיפורי ביצועים\n• שינוי גודל בסיסי בעת שימוש ב־NewPipe כיישומון שולחן עבודה\n\n• להציג דו־שיח עם אפשרויות פתיחה במקרה של הגשת כתובת בלתי נתמכת\n• לשפר את חוויית תוצאות החיפוש כאשר אי אפשר להביא תוצאות מרוחקות\n• בררת המחדל של איכות הווידאו עלתה ל־720p60 (בנגן הפנימי) ול־480p (בנגן הצף)\n\n• ערימות נכבדות של תיקוני באגים ועוד\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/955.txt",
    "content": "[YouTube] תוקן החיפוש אצל חלק מהמשתמשים\n[YouTube] תוקנו חריגות פענוח הצפנה אקראיות\n[SoundCloud] כתובות שמסתיימות בלוכסן מפוענחות כראוי\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/956.txt",
    "content": "[YouTube] תוקנה קריסה בעת טעינת כל סרטון שהוא\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/957.txt",
    "content": "• מיזוג פעולות הוספה מסוימות לתור לפעולה אחת\n• מחווה בשתי אצבעות לסגירת הנגן\n• לאפשר לפנות עוגיות reCAPTCHA\n• אפשרות לבטל את הצביעה של ההתראות\n• שיפור האופן בו הפרטים נפתחים כדי לתקן טעינה אינסופית, התנהגות קלוקלת בעת שיתוף ל־NewPipe לרבות חוסר אחידות במגוון מוקדים \n• להאיץ את סרטוני YouTube ולתקן את אלו עם הגבלת הגיל\n• תיקון קריסה על הרצה קדימה/חזרה אחורה\n• לא לשנות סדר רשימות על ידי גרירת התמונות המוקטנות\n• תמיד לזכור את מאפייני החלון הצף\n• הוספת השפה הסנטלית\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/958.txt",
    "content": "חידושים ושיפורים:\n• האפשרות להסתרת התמונה הממוזערת על מסך הנעילה נוספה מחדש\n• משיכה לרענון ההזנה\n• ביצועים משופרים בקבלת רשימות מקומיות\n\nתיקונים:\n• תוקנה קריסה עם הפעלת NewPipe לאחר הסרה מהזיכרון\n• תוקנה קריסה בהפעלה כשאין חיבור לאינטרנט\n• תוקנו תקלות עם מחוות בהירות ושמע\n• [YouTube] תוקנות רשימות נגינה ארוכות\n\nשונות:\n• מחיקת קוד ישן וכמה שינויים פנימיים\n• עדכון תלויות\n• התרגומים עודכנו\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/959.txt",
    "content": "תוקנה לולאה אינסופית בפתיחת מדווח השגיאות.\nרשימת מופעי ה־PeerTube שניתן לפתוח אוטומטית עם NewPipe עודכנה.\nהתרגומים עודכנו.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/960.txt",
    "content": "• תיאור מסד הנתונים המיוצא בהגדרות השתפר.\n• תוקן פענוח התגובות ב־YouTube.\n• תוקן שם התצוגה של השירות media.ccc.de.\n• התרגומים עודכנו.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/961.txt",
    "content": "• [YouTube] תמיכה בערבול\n• [YouTube] הצגת מידע על משדרים ציבוריים וקורונה\n• [media.ccc.de] נוספו סרטונים אחרונים\n• נוסף תרגום לסומלית\n\n• מגוון שיפורים פנימיים\n\n• תוקן שיתוף סרטונים מתוך הנגן\n• תוקנה תצוגת ReCaptcha (מבחן טיורינג) ריקה\n• תוקנה קריסה שנגרמה בעת הסרת תזרים מרשימה\n• [PeerTube] תוקנו תזרימים קשורים\n• [YouTube] תוקן החיפוש ב־YouTube Music\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/962.txt",
    "content": "נוספו סרטונים „אחרונים” לשירות media.ccc.de.\nנוספו תזרימים חיים לשירות media.ccc.de וגם תמיכה בתזרים חי.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/963.txt",
    "content": "• [YouTube] תוקנה המשכיות ערוץ\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/964.txt",
    "content": "• נוספה תמיכה בפרקים בפקדי הנגינה\n• [PeerTube] נוסף חיפוש Sepia\n• כפתור השיתוף נוסף מחדש לתצוגת פרטי הווידאו ותיאור התזרים הועבר לפריסת הלשונית\n• השבתת שחזור בהירות אם מחוות הבהירות מושבתת\n• נוסף פריט ברשימה לנגן את הסרטון בקודי\n• תוקנה קריסה כאשר לא מוגדר דפדפן בררת מחדל בחלק מהמכשירים ושיפור דו־שיח השיתוף\n• החלפת נגינה/השהיה בכפתור רווח חומרתי בנגן במסך מלא\n• [media.ccc.de] מגוון תיקונים ושיפורים\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/965.txt",
    "content": "תוקנה קריסה שהתרחשה בסידור מחדש של קבוצות ערוצים.\nתוקנה משיכת סרטונים נוספים מ־YouTube מערוצים ורשימות נגינה.\nתוקנה משיכת תגובות מ־YouTube.\nנוספה תמיכה בנתיבי המשנה /watch/,‏ /v/ ו־/w/ בכתובות של YouTube.\nתוקן חילוץ מזהה לקוח ב־SoundCloud ולקוח עם הגבלה גאוגרפית.\nנוסף תרגום לכורדית צפונית.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/966.txt",
    "content": "חדש:\n• נוסף שירות חדש: Bandcamp\n\nהשתפר:\n• נוספה האפשרות שהיישומון ייצמד לערכת העיצוב של המכשיר\n• כמה קריסות נמנעו בזכות הצגת לוח שגיאה משופר\n• מופיע יותר מידע בנוגע לסיבה בגנה התוכן לא זמין\n• מקש רווח חומרתי מבצע נגינה/השהיה\n• מופיעה הודעה „ההורדה החלה”\n\nתוקן:\n• תיקון של תמונה ממוזערת מדי בפרטי הסרטון בעת ניגון ברקע\n• תוקנה כותרת ריקה בנגן ממוזער\n• תיקון בעיה שמצב שינוי גודל אחרון לא משוחזר נכון\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/967.txt",
    "content": "תוקנה בעיה ש־YouTube לא עבד כראוי באירופה. נגרמה עקב מערכת עוגיות והסכמת פרטיות שדורשת מ־NewPipe להגדיר עוגיית הסכמה.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/968.txt",
    "content": "נוספה אפשרות פרטי ערוץ לתפריט נגיעה ארוכה.\nנוספה יכולת לשנות את שמות רשימות הנגינה ממנשק רשימת הנגינה.\nלאפשר למשתמש להשהות בזמן טעינת הסרטון.\nערכת העיצוב הלבנה לוטשה.\nתוקנו גופנים חופפים בעת שימוש בגופן גדול יותר.\nתוקנה תקלה שלא הופיעו סרטונים במכשירי Formuler ו־Zephier.\nתוקנו מגוון קריסות.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/969.txt",
    "content": "• אפשר להתקין על אחסון חיצוני\n• [Bandcamp] נוספה תמיכה להצגת שלוש התגובות הראשונות על תזרים\n• להציג את המודעה ‚ההורדה החלה’ רק כאשר ההורדה אכן החלה\n• לא להגדיר עוגיית מבחן טיורינג כשלא מאוחסנת עוגייה\n• [נגן] ביצועי זיכרון המטמון שופרו\n• [נגן] תוקנה בעיה בה הנגן לא החל לנגן אוטומטית\n• להתעלם מחטיפים קודמים בעת מחיקת הורדות\n• תוקן ניסיון למחוק פריטים שאינם ברשימה\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/970.txt",
    "content": "חדש\n• הצגת נתוני על של התוכן (תגיות, קטגוריות, רישיון, …) מתחת לתיאור\n• נוספה האפשרות „הצגת פרטי הערוץ” ברשימות נגינה מרוחקות (לא מקומיות)\n• נוספה האפשרות \"פתיחה בדפדפן\" לתפריט הלחיצה הארוכה\n\nתוקן\n• תוקנה קריסת הטייה בעמוד פרטי הסרטון\n• תוקן הכפתור „נגינה עם Kodi” בנגן שתמיד מציע להתקין את Kore\n• נתיבי הייבוא והייצוא של ההגדרות תוקנו ושופרו\n• [YouTube] כמות הלייקים על תגובות תוקנה\nועוד ערב רב של תיקונים\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/971.txt",
    "content": "תיקון ביניים\n• זיכרון הנגינה הוגדל לאחר אגירה מחדש\n• תוקנה קריסה במחשבי לוח וטלוויזיות בלחיצה על הסמל נגינה-תור בנגן\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/973.txt",
    "content": "תיקון בזק\n• תוקן חיתוך של תמונות ממוזערות וכותרות בתצוגת רשת, קרה עקב חישוב לקוי של כמות הסרטונים שיכולים להיכנס בשורה אחת\n• תוקנה בעיה שחלונית ההורדה נעלמה ללא כל פעולת משתמש אם נפתחה מתפריט השיתוף\n• עודכנה ספרייה שקשורה לפתיחת פעילויות חיצוניות כגון בוחר הקבצים של תשתית הגישה לאחסון\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/976.txt",
    "content": "• נוספה אפשרות לפתוח את הנגן ישירות במסך מלא\n• אפשר לבחור אילו סוגי הצעות חיפוש להציג\n• ערכת העיצוב הכהה מעתה כהה יותר וגם נוסף מסך פתיחה כהה\n• בוחר הקבצים עבר מקצה שיפורים והוא מאפיר קבצים בלתי רצויים\n• ייבוא המינויים מ־YouTube תוקן\n• ניגון של תזרים מחדש דורש נגיעה בכפתור הנגינה מחדש פעם נוספת\n• סגירת הפעלת שמע תוקנה\n• [Android TV] תוקנו קפיצות גדולות בפס הנגינה עם שימוש ב־DPad\n\nכדי לצפות בשינויים נוספים יש לעיין ביומן השינויים (וברשומה בבלוג) מלשונית הקישורים שלהלן.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/977.txt",
    "content": "• נוסף כפתור „לנגן את הבא” לתפריט הנגיעה הארוכה\n• נוספה קידומת נתיב YouTube shorts למסנן intents\n• תוקן ייבוא הגדרות\n• הוחלף מיקום סרגל הנגינה עם כפתור הנגן במסך התור\n• מגוון תיקונים שקשורים ב־MediasessionManager\n• תוקן מצב שבו סרגל הנגינה לא הסתיים לאחר סיום נגינת הסרטון\n• הושבת תיעול מדיה דרך RealtekATV\n• אזור הלחיצה של הכפתורים בנגן הממוזער הורחב\n\nניתן לעיין בשינויים הנוספים וביומן השינויים (והרשומה בבלוג) דרך לשונית הקישורים שלהלן.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/978.txt",
    "content": "הפעלת איתור הגרסאות החדשות של NewPipe תוקנה. בדיקה זאת הופעלה מוקדם מדי לפעמים ולכן הובילה לקריסת היישומון. עכשיו זה אמור להיות תקין.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/979.txt",
    "content": "- תוקן המשך נגינה\n- שיפורים כדי לוודא שהשירות שמוודא אם על NewPipe לבדוק זמינות של גרסה חדשה לא מופעל ברקע\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/980.txt",
    "content": "חדש\n• נוספה האפשרות „הוספה לרשימת נגינה” לתפריט השיתוף\n• נוספה תמיכה ב־y2u.be וקישורים מקוצרים של PeerTube\n\nשיפורים\n• פקדי מהירות הנגינה צומצמו\n• ההזנה מדגישה מעתה פריטים חדשים\n• האפשרות „הצגת פריטים שנצפו” בהזנה נשמרת מעתה\n\nתיקונים\n• תוקן חילוץ הלייקים והלא לייקים ב־YouTube\n• תוקנה נגינה חוזרת אוטומטית בחזרה מעבודה ברקע\nקצרה היריעה מלהכיל\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/981.txt",
    "content": "הוסרה תמיכה ב־MediaParser כדי לתקן המשך נגינה שנכשל לאחר אגירה ב־Android 11+‎.\nהושבת תיעול מדיה ב־Philips QM16XE כדי לתקן בעיות נגינה.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/982.txt",
    "content": "תוקנה התקלה ש־YouTube לא מנגן אף תזרים.\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/983.txt",
    "content": "הוספת מנשק משתמש והתנהגות חדשים לנגיעה כפולה לקפיצות\nאפשר מעתה לחפש בהגדרות\nהדגשת הערות נעוצות\nהוספת תמיכה בפתיחה עם יישומון לעותק ה־PeerTube של FSFE\nנוספו התראות שגיאה\nתוקן ניגון מחדש של הפריט הראשון בתור במהלך תזרימים חיים בטרם כשל בתהליך\nההמתנה לאגירה במהלך תזרימים חיים התארכה עד להחלטה על כשל\nתוקן סדר תוצאות החיפוש המקומיות\nתוקנו שדות פריט ריקים בתור הנגינה\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/984.txt",
    "content": "מספיק פריטים נטענים באופן ראשוני ברשימות כדי למלא את כל המסך ולתקן גלילה במחשבי לוח ובטלוויזיות\nתוקנו קריסות אקראיות בעת גלילה ברשימות\nקשת הקפיצה קדימה שמופיעה על הסרטון יורדת אל מתחת לשכבת מנשק המשתמש במערכת\nשוחזרו השינויים לחיתוכים בעת נגינה במספר חלונות, מה שגרם לנסיגה בנגן שהוזז בחלק מהטלפונים\ncompileSdk שודרג מ־30 ל־31\nספריית דיווח השגיאות עודכנה\nחלק מהקוד בנגן שופץ\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/985.txt",
    "content": "תוקנה התקלה ש־YouTube לא מנגן אף תזרים\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/986.txt",
    "content": "חדש\n• התראות על תזרימים חדשים\n• מעבר חלק בין נגני רקע ווידאו\n• שינוי גובה הצליל בחצאי טונים\n• הוספת התור מהנגן הראשי לתור\n\nשיפורים\n• גודל צעד מהירות/גובה צליל נשמר\n• צמצום זמן הטעינה הראשונית בנגן הווידאו\n• מנשק המשתמש בנגן Android TV השתפר\n• אישור לפני מחיקת כל הקבצים שהורדו\n\nתיקונים\n• תוקנה התופעה שכפתורי המדיה לא מסתירים את פקדי הנגן\n• תוקנה איפוס נגינה בשינוי סוג נגן\n• תוקנה החלפת חלונית רשימת הנגינה\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/988.txt",
    "content": "[YouTube] תוקנה השגיאה „אי אפשר לקבל שום תזרים” בעת ניסיון לנגן סרטונים\n[YouTube] תוקנה ההודעה „התוכן הבא אינו זמין ביישומון הזה” שמופיעה במקום הסרטון המבוקש\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/995.txt",
    "content": "חדש\n• תמיכה בלשוניות ערוצים\n• בחירת איכות תמונה\n• קבלת כתובות לכל התמונות\n\nמשופר\n• גישה למנשקי הנגן\n• אפשרות להוספת שם רשימת נגינה ושם סרטון לתוכן שמשותף ברשימת נגינה\n• שיפורים פנימיים ועדכוני תלויות\n\nתוקן\n• בחירה בשפה הלא נכונה בבורר השפות\n• מיקוד השמע של הנגן לא כיבד השתקה\n• הוספת פריטים לרשימות נגינה לא עבדה במקרים מסוימים\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/998.txt",
    "content": "תוקנה התקלה ש־YouTube לא מנגן אף תזרים\n"
  },
  {
    "path": "fastlane/metadata/android/he/changelogs/999.txt",
    "content": "תוקנה התקלה ש־YouTube לא מנגן אף תזרים\n"
  },
  {
    "path": "fastlane/metadata/android/he/full_description.txt",
    "content": "ב־NewPipe לא נעשה שימוש באף ספרייה מסביבת הריצה של Google או ב־API של YouTube. היישומון מנתח את האתר כדי לקבל את המידע הנדרש. לכן ניתן להשתמש ביישומון הזה במכשירים בלי התקנה של שירותי Google‏ (Services). כמו כן, אין לך צורך בחשבון YouTube כדי להשתמש ב־NewPipe וזה יישומון חופשי ובקוד פתוח.\n"
  },
  {
    "path": "fastlane/metadata/android/he/short_description.txt",
    "content": "מנשק משתמש חופשי ופשוט ל־YouTube עבור Android.\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/1000.txt",
    "content": "सुधार\n• अधिक/कम सामग्री दिखाने के लिए प्लेलिस्ट विवरण को क्लिक करने योग्य बनाएं\n• [PeerTube] `subscribeto.me` इंस्टेंस लिंक को स्वचालित रूप से हैंडल करें\n• इतिहास स्क्रीन में केवल एकल आइटम चलाना शुरू करें\n\nठीक किया गया\n• RSS बटन दृश्यता को ठीक करें\n• सीकबार पूर्वावलोकन क्रैश को ठीक करें\n• थंबनेल-रहित आइटम को प्लेलिस्ट में डालना ठीक करें\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/1001.txt",
    "content": "सुधार\n• Android 13+ पर हमेशा प्लेयर नोटिफिकेशन प्राथमिकताएँ बदलने की अनुमति दें\n\nठीक किया गया\n• डेटाबेस/सदस्यता निर्यात करने से पहले से मौजूद फ़ाइल को छोटा नहीं किया जा सकता था, जिससे संभवतः दूषित निर्यात हो सकता था\n• टाइमस्टैम्प पर क्लिक करने पर प्लेयर फिर से शुरू होने की समस्या को ठीक किया गया\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/1002.txt",
    "content": "YouTube द्वारा कोई भी स्ट्रीम न चलाए जाने की समस्या को ठीक किया गया।\n\nयह रिलीज़ केवल सबसे ज़्यादा दबाव वाली त्रुटि को संबोधित करती है जो YouTube वीडियो विवरण को लोड होने से रोकती है।\nहम जानते हैं कि अन्य समस्याएँ भी हैं, और हम जल्द ही उन्हें हल करने के लिए एक अलग रिलीज़ जारी करेंगे।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/1003.txt",
    "content": "यह एक हॉटफ़िक्स रिलीज़ है जो YouTube त्रुटियों को ठीक करता है:\n• [YouTube] कोई भी वीडियो जानकारी लोड न होने की समस्या को ठीक करें, वीडियो चलाते समय HTTP 403 त्रुटियाँ ठीक करें और कुछ आयु-प्रतिबंधित वीडियो के प्लेबैक को पुनर्स्थापित करें\n• कैप्शन का आकार न बदलने की समस्या को ठीक करें\n• स्ट्रीम खोलते समय जानकारी दो बार डाउनलोड होने की समस्या को ठीक करें\n• [साउंडक्लाउड] न चलाए जा सकने वाले DRM-संरक्षित स्ट्रीम हटाएँ\n• अपडेट किए गए अनुवाद\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/1004.txt",
    "content": "इस रिलीज़ में YouTube सिर्फ़ 360p स्ट्रीम दे रहा था, इसे ठीक किया गया है।\n\nध्यान दें कि इस वर्शन में इस्तेमाल किया गया सॉल्यूशन शायद टेम्पररी है, और लंबे समय में SABR वीडियो प्रोटोकॉल को लागू करने की ज़रूरत है, लेकिन TeamNewPipe के सदस्य अभी बिज़ी हैं, इसलिए किसी भी मदद की बहुत तारीफ़ होगी! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/1005.txt",
    "content": "नया\n• Android Auto के लिए समर्थन जोड़ें\n• फ़ीड समूहों को मुख्य स्क्रीन टैब के रूप में सेट करने की अनुमति दें\n• [YouTube] अस्थायी प्लेलिस्ट के रूप में साझा करें\n• [SoundCloud] \"पसंद\" चैनल टैब जोङी गई\n\nबेहतर किए\n• खोज बार संकेत\n• डाउनलोडस स्क्रीन में डाउनलोड की तारीख दिखाएं\n• Android 13+ पर प्रति-ऐप भाषा का उपयोग करें \n\nफिक्स किए\n• डार्क मोड में पाठ के रंग ठीक करें\n• [YouTube] 100 से अधिक आइटम लोड नहीं करने वाली प्लेलिस्ट को ठीक करें\n• टिप्पणी के उत्तरों में टाइमस्टैम्प को ठीक करें\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/1006.txt",
    "content": "# बेहतर किए\nटाइमस्टैम्प पर क्लिक करते समय मौजूदा प्लेयर पर ही दिखाएं\nजब हो सके तो पेंडिंग डाउनलोड मिशन को रिकवर करने की कोशिश करें\nफ़ाइल डिलीट किए बिना डाउनलोड डिलीट करने का ऑप्शन जोड़ें\n.soundcloud लिंक खोलने में सपोर्ट करें\n\n7 से कम Android वर्शन के लिए छोटे नंबर फ़ॉर्मेटिंग को ठीक किया गया\nखाली नोटिफ़िकेशन को ठीक किया गया\nSRT सबटाइटल फ़ाइलों के लिए ठीक किया गया\nकई क्रैश ठीक किए गए\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/1007.txt",
    "content": "फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/63.txt",
    "content": "### सुधार\n- आयात/निर्यात सेटिंग्स #1333\n- ओवरड्रॉ को कम करें (प्रदर्शन सुधार) #1371\n- कोड में कुछ छोटे सुधार #1375\n- जीडीपीआर के बारे में सब कुछ जोड़ें #1420\n\n### ठीक किए गए\n- डाउनलोडर: .गीगा फाइलों से अधूरे डाउनलोड लोड करने पर क्रैश को ठीक करें #1407\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/64.txt",
    "content": "### सुधार \n- मोबाइल डेटा का उपयोग करते समय वीडियो की गुणवत्ता को सीमित करने की क्षमता को जोड़ा गया। #1339 \n- सत्र # 1442 के लिए चमक याद रखें \n- कमजोर सीपीयू # 1431 के लिए डाउनलोड प्रदर्शन में सुधार \n- मीडिया सत्र # 1433 के लिए समर्थन जोड़ें (काम कर रहा है) \n\n### फिक्स \n- डाउनलोड खोलने पर क्रैश ठीक करें (रिलीज बिल्ड के लिए अब उपलब्ध है) # 1441\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/65.txt",
    "content": "### सुधार\n\n- बर्गरमेनू आइकन एनिमेशन को डिसेबल करें #1486\n- डाउनलोड को अनडू करें #1472\n- शेयर मेनू में डाउनलोड ऑप्शन #1498\n- लॉन्ग टैप मेनू में शेयर ऑप्शन जोड़ा गया #1454\n- ExoPlayer 2.8.2 अपडेट #1392\n- कई UI फ़िक्स: #1383\n\n### फ़िक्स\n\n- व्यू हिस्ट्री फ़िक्स #1497\n- #1495, जैसे ही यूज़र प्लेलिस्ट एक्सेस करता है, मेटाडेटा (थंबनेल, टाइटल और वीडियो काउंट) को अपडेट करके।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/66.txt",
    "content": "# v0.13.7 का चेंजलॉग\n\n### ठीक किया गया\n- v0.13.6 के सॉर्ट फ़िल्टर की दिक्कतें ठीक की गईं\n\n# v0.13.6 का चेंजलॉग\n\n### सुधार\n\n- बर्गरमेनू आइकन एनिमेशन डिसेबल करें #1486\n- डाउनलोड को अनडू डिलीट करें #1472\n- शेयर मेनू में डाउनलोड ऑप्शन #1498\n- लॉन्ग टैप मेनू में शेयर ऑप्शन जोड़ा गया #1454\n- ExoPlayer 2.8.2 अपडेट #1392\nकई UI फ़िक्स: #1383\n\n### फ़िक्स\n\n- फ़िक्स #1440 टूटा हुआ वीडियो इन्फ़ो लेआउट #1491\n- व्यू हिस्ट्री फ़िक्स #1497\n- मेन वीडियो प्लेयर फिक्स #1509।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/68.txt",
    "content": "# v0.14.1 में बदलाव\n\n### ठीक किया गया\n- वीडियो URL डिक्रिप्ट करने में फेल होना ठीक किया गया #1659\n- डिस्क्रिप्शन लिंक ठीक से एक्सट्रेक्ट नहीं हो रहा था, इसे ठीक किया गया #1657\n\n# v0.14.0 में बदलाव\n\n### नया\n- नया ड्रॉअर डिज़ाइन #1461\n- नया कस्टमाइज़ेबल फ्रंट पेज #1461\n\n### सुधार\n- पॉपअप प्लेयर बंद करने का नया तरीका #1597\n\n### ठीक किया गया\n- जब YouTube प्लेलिस्ट खाली हो तो NPE को ठीक करें\n- SoundCloud में कियोस्क के लिए क्विक फिक्स\n- रीफैक्टर और बगफिक्स #1623।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/69.txt",
    "content": "### नया\n- सब्सक्रिप्शन में लंबे समय तक टैप करके डिलीट और शेयर करें #1516\n- टैबलेट UI और ग्रिड लिस्ट लेआउट #1617\n\n### सुधार\n- वॉल्यूम और ब्राइटनेस जेस्चर के लिए अलग सेटिंग्स #1644\n- लोकलाइज़ेशन के लिए सपोर्ट जोड़ें #1792\n\n### सुधार\n- . फ़ॉर्मेट के लिए टाइम पार्सिंग ठीक करें, ताकि फ़िनलैंड में NewPipe का इस्तेमाल किया जा सके\n- सब्सक्रिप्शन काउंट ठीक करें\n- API 28+ डिवाइस के लिए फ़ोरग्राउंड सर्विस परमिशन जोड़ें #1830\n\n### जाने-पहचाने बग\n- Android P पर प्लेबैक स्टेट सेव नहीं किया जा सकता\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/70.txt",
    "content": "### सुधार\n* डाउनलोड की गई फ़ाइलें अब एक क्लिक से खोली जा सकती हैं #1879\n* एंड्रॉयड 4.1 - 4.3 के लिए सपोर्ट हटा दिया गया #1884\n* पुराना प्लेयर हटाएँ #1884\n* मौजूदा प्ले क्यू से स्ट्रीम को दाईं ओर स्वाइप करके हटाएँ #1915\n* बहुत सारी डाउनलोड गड़बड़ियाँ ठीक करके सुधार किया गए\n\n### ठीक किया गया\n* डिफ़ॉल्ट रिज़ॉल्यूशन को बेस्ट और लिमिटेड मोबाइल डेटा रिज़ॉल्यूशन पर सेट करने पर क्रैश को ठीक किया गया #1835\n* पॉप-अप प्लेयर क्रैश को ठीक किया गया #1874\n* बैकग्राउंड प्लेयर खोलने की कोशिश करते समय NPE #1901\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/71.txt",
    "content": "### सुधार\n* GitHub बिल्ड के लिए ऐप अपडेट नोटिफ़िकेशन जोड़ें (#1608 @krtkush द्वारा)\n* डाउनलोडर में कई सुधार #1944\n* नया MPEG-4 म्यूक्सर नॉन-सिंक्रोनस वीडियो और ऑडियो स्ट्रीम को ठीक करता है (#2039)\n\n### फिकसड\n* YouTube लाइव स्ट्रीम थोड़े समय बाद चलना बंद हो जाती हैं (#1996 @yausername द्वारा)\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/730.txt",
    "content": "# हल किया गया \n- हॉट फिक्स डिक्रिप्ट फ़ंक्शन त्रुटि फिर से।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/740.txt",
    "content": "<h4>सुधार</h4>\n<ul>\n<li>कमेंट्स में लिंक को क्लिक करने लायक बनाएं, टेक्स्ट का साइज़ बढ़ाएं</li>\n<li>कमेंट्स में टाइमस्टैम्प लिंक पर क्लिक करने पर खोजें</li>\n<li>जब शेयर किया गया टेक्स्ट URL न हो तो उसे खोजें</li>\n<li>मेन वीडियो प्लेयर में \"अभी के समय शेयर करें\" बटन जोड़ें</li>\n<li>ExoPlayer को 2.9.6 पर अपडेट करना</li>\n<h4>फिकसड</h4>\n\n<ul>\n<li>गलत YouTube URL ठीक करें: सिग्नेचर टैग का नाम हमेशा \"सिग्नेचर\" नहीं होता, जिससे स्ट्रीम लोड नहीं हो पातीं</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/750.txt",
    "content": "नया\nप्लेबैक फिर से शुरू करें #2288\n• स्ट्रीम वहीं से फिर से शुरू करें जहाँ आपने पिछली बार रोका था\nडाउनलोडर एन्हांसमेंट #2149\n• एक्सटर्नल SD-कार्ड पर डाउनलोड स्टोर करने के लिए स्टोरेज एक्सेस फ्रेमवर्क का इस्तेमाल करें\n\nबेहतर\n• एक्टिविटी लाइफसाइकल के दौरान (ऑटो) रोटेशन में बदलाव को हैंडल करें #2444\n• लॉन्ग-प्रेस मेनू को एक जैसा बनाएं #2368\n\nठीक किया गया\n• चुने हुए सबटाइटल ट्रैक का नाम नहीं दिखना ठीक किया गया #2394\n• 99.9% पर अटके डाउनलोड को ठीक किया गया #2440\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/760.txt",
    "content": "0.17.1 में बदलाव\n\nनया\n• थाई लोकलाइज़ेशन\n\nबेहतर\n• प्लेलिस्ट के लिए लॉन्ग-प्रेस मेनू में फिर से 'यहाँ से प्ले करना शुरू करें' एक्शन जोड़ें #2518\n• SAF / लेगेसी फ़ाइल पिकर के लिए स्विच जोड़ें #2521\n\nठीक किया गया\n• ऐप बदलते समय डाउनलोड व्यू में बटन गायब होने की समस्या ठीक करें #2487\n• लिस्ट व्यू में प्लेबैक पोज़िशन की वजह से परफॉर्मेंस में आई कमी को ठीक करें #2517\n• [एक्सट्रैक्टर] [YouTube] जब प्लेलिस्ट रिज़ल्ट में हों तो कैज़ुअल सर्च एरर को ठीक करें TeamNewPipe/NewPipeExtractor#185\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/770.txt",
    "content": "0.17.2 में परिवर्तन \n\nफिक्स \n• फिक्स कोई वीडियो उपलब्ध नहीं था\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/780.txt",
    "content": "Changes in 0.17.3\n\nImproved\n• Added option to clear playback states #2550\n• Show hidden directories in the file picker #2591\n• Support URLs from `invidio.us` instances to be opened with NewPipe  #2488 \n• Add support for `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194\n\nFixed\n• [YouTube] Fixed 'java.lang.IllegalArgumentException #192\n• [YouTube] Fixed live streams not working TeamNewPipe/NewPipeExtractor#195\n• Fixed performance problem in android pie when downloading a stream #2592\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/790.txt",
    "content": "ठीक किया गया\n• चेक करें कि ब्लॉक में आखिरी बाइट डाउनलोड हुआ है या नहीं #2646\n• वीडियो डिटेल फ़्रैगमेंट में स्क्रॉलिंग को ठीक किया गया #2672\n• [साउंडक्लाउड] client_id एक्सट्रैक्शन को ठीक करें #2745\n\nडेवलपमेंट\n• NewPipeExtractor से मिली गायब डिपेंडेंसी को NewPipe में जोड़ें #2535\n• AndroidX पर माइग्रेट करें #2685\n• ExoPlayer 2.10.6 पर अपडेट करें #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/800.txt",
    "content": "नया\n• P2P के बिना PeerTube सपोर्ट (#2201) [बीटा]:\n\n◦ लंबे समय तक रुकने के बाद डाउनलोड फिर से शुरू करने के लिए एक्सपायर हो चुके डाउनलोड लिंक रिकवर करें\n\nबेहतर\n• KioskFragment को पसंदीदा कंटेंट देश में होने वाले बदलावों के बारे में बताएं और सभी मेन टैब की परफॉर्मेंस को बेहतर बनाएं #2742\n\nफिक्स किया गया\n• Android 4.4 डिवाइस (API 19/KitKat) पर TLS1.1/1.2 इनेबल करें\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/810.txt",
    "content": "नया\n• बैकग्राउंड में चलने पर लॉक स्क्रीन पर वीडियो थंमनेल दिखाएं\n\nबेहतर\n• बैकग्राउंड / पॉपअप बटन पर देर तक दबाने पर लोकल प्लेलिस्ट को क्यू में जोड़ें\n• [YouTube] /c/shortened_url चैनल लिंक के लिए सपोर्ट जोड़ें\n\nफिकसड\n• NewPipe पर वीडियो शेयर करते समय और सीधे उसकी स्ट्रीम डाउनलोड करते समय कई दिक्कतें ठीक की गईं\n• सर्च रिज़ल्ट पेजिंग ठीक की गई\n• [SoundCloud] client_id अपडेट किया गया\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/820.txt",
    "content": "फिक्स्ड डिक्रिप्ट फ़ंक्शन नाम रेगेक्स YouTube को अनुपयोगी बना रहा।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/830.txt",
    "content": "साउंडक्लाउड समस्याओं को ठीक करने के लिए साउंडक्लाउड क्लाइंट_आईडी अपडेट किया गया।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/840.txt",
    "content": "नया\n• ऐप की भाषा बदलने के लिए भाशा सिलेक्टर जोड़ा गया\n• प्लेयर कोलैप्सिबल मेनू में कोडी को भेजें बटन जोड़ा गया\n• देर तक दबाने पर कमेंट्स कॉपी करने की सुविधा जोड़ी गई\n\nबेहतर\n• ReCaptcha एक्टिविटी को ठीक किया गया और मिली हुई कुकीज़ को सही ढंग से सेव किया गया\n\nठीक किया गया\n• Android KitKat पर डाउनलोडिंग ठीक की गई\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/850.txt",
    "content": "इस रिलीज़ में YouTube वेबसाइट संस्करण अपडेट किया गया था। पुराना वेबसाइट संस्करण मार्च में बंद होने जा रहा है और इसलिए आपको न्यूपाइप को अपग्रेड करना होगा।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/860.txt",
    "content": "उन्नत \n• सेव करें और रिस्टोर करें कि क्या पिच और टेंपो अनहुक हैं या नहीं \n• प्लेयर में सपोर्ट डिस्प्ले कटआउट \n• गोल दृश्य और ग्राहकों की संख्या \n• कम डेटा का उपयोग करने के लिए यूट्यूब को अनुकूलित किया गया \n\nइस रिलीज़ में यूट्यूब से संबंधित 15 से अधिक बग ठीक किए गए थे।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/870.txt",
    "content": "यह एक हॉटफिक्स रिलीज़ है जो न्यूपाइप को बिना किसी बड़ी परेशानी के फिर से साउंडक्लाउड का उपयोग करने की अनुमति देता है। \nसाउंडक्लाउड के v2 एपीआई का उपयोग अब एक्सट्रैक्टर में किया जाता है और अमान्य क्लाइंट आईडी का पता लगाने में सुधार किया गया है।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/900.txt",
    "content": "New\n• Subscription groups and sorted feeds\n• Mute button in players\n\nImproved\n• Allow opening music.youtube.com and media.ccc.de links in NewPipe\n• Relocate two settings from Appearance to Content\n• Hide 5, 15, 25 second seek options if inexact seek is enabled\n\nFixed\n• some WebM videos are not seekable\n• database backup on Android P\n• crash when sharing a downloaded file\n• tons of YouTube extraction issue and more ...\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/910.txt",
    "content": "फिक्स्ड डेटाबेस माइग्रेशन जो न्यूपाइप को कुछ दुर्लभ मामलों में शुरू होने से रोकता है।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/920.txt",
    "content": "Improved\n\n• Added upload date and view count on stream grid items\n• Improvements for the drawer header layout\n\nFixed\n\n• Fixed mute button causing crashes on API 19\n• Fixed downloading of long 1080p 60fps videos\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/930.txt",
    "content": "नया\n• YouTube Music पर सर्च करें\n• बेसिक Android TV सपोर्ट\n\nबेहतर\n• लोकल प्लेलिस्ट से सभी देखे गए वीडियो हटाने की सुविधा जोड़ी गई\n• जब कंटेंट अभी सपोर्टेड न हो, तो क्रैश होने के बजाय मैसेज दिखाएं\n\nफिकसड\n• उम्र पर रोक वाली कंटेंट सेटिंग काम नहीं कर रही थी, इसे ठीक किया गया\n• कुछ तरह के reCAPTCHA को ठीक किया गया\n\nऔर भी बहुत कुछ\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/940.txt",
    "content": "नया\n• SoundCloud कमेंट्स के लिए सपोर्ट जोड़ें\n• YouTube रेस्ट्रिक्टेड मोड सेटिंग जोड़ें\n• PeerTube पेरेंट चैनल की डिटेल्स दिखाएँ\n\nबेहतर\n• सिर्फ़ सपोर्टेड सर्विसेज़ के लिए Kore बटन दिखाएँ\n\nफिक्स किया गया\n• डाउनलोड डायलॉग फ़्रीज़ होने की समस्या को ठीक करें\n• ब्राउज़र में खोलें बटन अब सच में ब्राउज़र में खुलता है\n• वीडियो खोलने पर क्रैश और \"यह स्ट्रीम नहीं चला सका\"\n\nऔर भी बहुत कुछ\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/950.txt",
    "content": "यह रिलीज़ तीन छोटे सुधार लाता है: \n• Android 10+ पर फिक्स्ड स्टोरेज एक्सेस \n• फिक्स्ड ओपनिंग कियोस्क \n• लंबे वीडियो की निश्चित अवधि पार्सिंग\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/951.txt",
    "content": "नया\n• फ़ीड ग्रुप डायलॉग में सब्सक्रिप्शन पिकर के लिए सर्च जोड़ें\n• फ़ीड ग्रुप डायलॉग में फ़िल्टर जोड़ें ताकि सिर्फ़ अनग्रुप्ड सब्सक्रिप्शन दिखें\n• मेन पेज पर प्लेलिस्ट टैब जोड़ें\n\nबेहतर\n• म्यूक्स की गई फ़ाइलों में एप्लीकेशन मेटाडेटा लिखना बंद करें\n• फ़ेल स्ट्रीम को क्यू से न हटाएं\n\nफिकसड\n• फ़्लोटिंग पॉइंट क्यूमुलेटिव एरर के कारण होने वाले ऑडियो/वीडियो डीसिंक को ठीक किया गया\n\nऔर भी बहुत कुछ\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/952.txt",
    "content": "Improved\n• Auto-play is available for all services (instead of only for YouTube)\n\nFixed\n• Fixed related streams by supporting YouTube's new continuations\n• Fixed age restricted YouTube videos\n• [Android TV] Fixed lingering focus highlight overlay\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/953.txt",
    "content": "यूट्यूब के डिक्रिप्शन फ़ंक्शन का निष्कर्षण ठीक किया गया।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/954.txt",
    "content": "• नए एप्लिकेशन वर्कफ़्लो: विस्तार पृष्ठ पर वीडियो चलाएं, प्लेयर को छोटा करने के लिए नीचे स्वाइप करें \n• मीडियास्टाइल सूचनाएँ: सूचनाओं में अनुकूलन योग्य क्रियाएं, प्रदर्शन सुधार \n• डेस्कटॉप ऐप के रूप में न्यूपाइप का उपयोग करते समय मूल आकार परिवर्तन \n\n• असमर्थित यूआरएल टोस्ट के मामले में खुले विकल्पों के साथ संवाद दिखाएं \n• रिमोट सुझावों के अनुपलब्धता पर अनुभव में सुधार \n• 720p60 (इन-ऐप प्लेयर) और 480p (पॉप-अप प्लेयर) के लिए डिफ़ॉल्ट वीडियो की गुणवत्ता वृद्धि\n\n• त्रुटियों में सुधार और बहुत कुछ\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/955.txt",
    "content": "[यूट्यूब] कुछ उपयोगकर्ताओं के लिए खोज को ठीक किया गया \n[यूट्यूब] यादृच्छिक डिक्रिप्शन अपवादों को ठीक किया गया\n[साउंडक्लाउड] एक स्लैश के साथ समाप्त होने वाले यूआरएल अब सही ढंग से पदच्छेदन किया गया\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/956.txt",
    "content": "[यूट्यूब] किसी भी वीडियो को लोड करते समय क्रैश में सुधार\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/957.txt",
    "content": "• एक में विशिष्ट एनक्यूई क्रियाओं को एकजुट किया\n• दो उँगलियों के जेस्चर से वीडियो प्लेयर को बंद करना \n• रेकॉप्टचा कूकीज को हटाने की अनुमति \n• अधिसूचना को रंगीन न करने का विकल्प\n• न्यूपाइप को साझा करते समय अनंत बफ़रिंग,त्रुटियां और अन्य विसंगतियों में सुधार \n• यूट्यूब वीडियो को गति दें और आयु प्रतिबंधित वीडियो में सुधार \n• फास्ट फॉरवर्ड / रिवाइंड पर क्रैश ठीक किया गया \n• थंबनेल खींचकर सूचियों को पुनर्व्यवस्थित न करने का संशोधन \n• हमेशा पॉपअप गुणों को याद रखने का संशोधन \n• संताली भाषा जोड़ी गयी\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/958.txt",
    "content": "नया और बेहतर:\n• लॉक स्क्रीन पर थंबनेल छिपाने के लिए पुनः जोड़ा गया विकल्प\n• फ़ीड ताज़ा करने के लिए खींचो\n• स्थानीय सूचियों को लाने पर बेहतर प्रदर्शन\n\nफिक्स्ड:\n• रैम से हटाए जाने के बाद न्यूपाइप शुरू करते समय क्रैश का निवारन\n• इंटरनेट कनेक्शन न होने पर स्टार्टअप पर क्रैश का निवारन\n• फिक्स्ड चमक- और वॉल्यूम- जेस्चर सेटिंग्स\n• [यूट्यूब] फिक्स्ड लंबे प्लेलिस्ट\n\nअन्य:\n• कोड शोधन और कई आंतरिक सुधार\n• निर्भरता अद्यतन\n• अनुवाद अपडेट\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/959.txt",
    "content": "त्रुटि रिपोर्टर खोलने के बाद क्रैश का निश्चित अंतहीन लूप।\nपीरट्यूब इंस्टेंस सूची जो निऊपाईप द्वारा स्वचालित रूप से खोली जा सकती है।\nअपडेट किए गए अनुवाद।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/960.txt",
    "content": "• सेटिंग्स में निर्यात डेटाबेस विकल्प का बेहतर विवरण। \n• फिक्स्ड YouTube टिप्पणियों का पदच्छेद। \n• Media.ccc.de सेवा का निश्चित प्रदर्शन नाम में सुधार।\n• अपडेट किए गए अनुवाद।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/961.txt",
    "content": "• [यूट्यूब] मिक्स सपोर्ट\n• [यूट्यूब] सार्वजनिक प्रसारकों और कोविद -19 के बारे में जानकारी प्रदर्शित किया गया\n• [media.ccc.de] “ताज़ा” वीडियो जोड़े गए\n• सोमाली अनुवाद जोड़ा गया \n\n• कई आंतरिक सुधार \n\n• विडियो प्लेयर के भीतर शेयरिंग वीडियो में सुधार \n• फिक्स्ड रिक्त रिक्प्चा वेबव्यू \n• फिक्स्ड क्रैश जो एक सूची से एक धारा को हटाते समय होता था\n• [पीयरट्यूब] फिक्स्ड संबंधित धाराएँ \n• [यूट्यूब] निश्चित यूट्यूब संगीत खोज\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/962.txt",
    "content": "मीडिया.सिसिसी.डीई सेवा में \"हाल के\" वीडियो जोड़े गए।\nमीडिया.सिसिसी.डीई सेवा में लाइव स्ट्रीम जोड़ा गया और लाइव स्ट्रीम समर्थन भी।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/963.txt",
    "content": "• [यूट्यूब] फिक्स्ड निश्चित चैनल निरंतरता\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/964.txt",
    "content": "• Added support for chapters in player controls\n• [PeerTube] Added Sepia search\n• Re-added share button in video detail view and moved stream description into the tab layout\n• Disable restoring brightness if brightness gesture is disabled\n• Added list item to play video on kodi\n• Fixed crash when no default browser is set on some devices and improve share dialogs\n• Toggle play/pause with hardware space button in fullscreen player\n• [media.ccc.de] Various fixes and improvements\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/965.txt",
    "content": "Fixed crash which occurred when reordering channel groups.\nFixed getting more YouTube videos from channels and playlists.\nFixed getting YouTube comments.\nAdded support for /watch/, /v/ and /w/ subpaths in YouTube URLs.\nFixed extraction of SoundCloud client id and geo-restricted content.\nAdded Northern Kurdish localization.\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/966.txt",
    "content": "New:\n• Add a new service: Bandcamp\n\nImproved:\n• Add an option to have the app follow the device theme\n• Prevent some crashes by showing an improved error panel\n• Show more information on why content in unavailable\n• Hardware space button triggers play/pause\n• Show \"Download started\" toast\n\nFixed:\n• Fix very small thumbnail in video details while playing in the background\n• Fix empty title in minimized player\n• Fix last resize mode not being restored correctly\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/967.txt",
    "content": "यूरोपीय संघ में YouTube ठीक से काम नहीं कर रहा है। यह एक नई कुकी और गोपनीयता सहमति प्रणाली के कारण हुआ था जिसके लिए न्यूपाइप को एक सहमति कुकी सेट करने की आवश्यकता होती है।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/968.txt",
    "content": "Added channel details option to long-press menu.\nAdded functionality to rename Playlist Name from playlist interface.\nAllow the user to pause while a video is buffering.\nPolished the white theme.\nFixed overlapping fonts when using a larger font size.\nFixed no video on Formuler and Zephier devices.\nFixed various crashes.\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/969.txt",
    "content": "• Allow installation on external storage\n• [Bandcamp] Added support for displaying the first three comments on a stream\n• Only show 'download has started' toast when download is started\n• Do not set reCaptcha cookie when there is no cookie stored\n• [Player] Improve cache performance\n• [Player] Fixed player not automatically playing\n• Dismiss previous Snackbars when deleting downloads\n• Fixed trying to delete object not in list\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/970.txt",
    "content": "New\n• Show content metadata (tags, categories, license, ...) below the description\n• Added \"Show channel details\" option in remote (non-local) playlists\n• Added \"Open in browser\" option to long-press menu\n\nFixed\n• Fixed rotation crash on video detail page\n• Fixed \"Play with Kodi\" button in player always prompts to install Kore\n• Fixed and improved setting import and export paths\n• [YouTube] Fixed comment like count\nAnd much more\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/971.txt",
    "content": "हॉटफिक्स \n• रिबफर के बाद प्लेबैक के लिए बफर बढ़ाएं \n• प्लेयर में प्ले-क्यू आइकन पर क्लिक करने पर टैबलेट और टीवी पर क्रैश ठीक किया गया\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/972.txt",
    "content": "New\nRecognize timestamps and hashtags in description\nAdded manual tablet mode setting\nAdded ability to hide played items in a feed\n\nImproved\nSupport Storage Access Framework properly\nBetter error handling of unavailable and terminated channels\nThe Android share sheet for Android 10+ users now shows the content title.\nUpdated Invidious instances and support Piped links.\n\nFixed\n[YouTube] Age restricted content\nPrevent leaked window Exception when opening choice dialog\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/973.txt",
    "content": "Hotfix\n• Fix thumbnails and titles being trimmed in grid layout, due to a wrong calculation of how many videos can fit in one row\n• Fix download dialog disappearing without doing anything if opened from the share menu\n• Update a library related to opening external activities such as the Storage Access Framework file picker\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/974.txt",
    "content": "Hotfix\n• Fix buffering issues caused by YouTube throttling\n• Fix YouTube comments extraction and crashes with disabled comments\n• Fix YouTube music search\n• Fix PeerTube livestreams\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/975.txt",
    "content": "New\n• Show a thumbnail preview while seeking\n• Detect disabled comments\n• Allow marking a feed item as watched\n• Show comment hearts\n\nImproved\n• Improve metadata and tags layout\n• Apply service color to UI components\n\nFixed\n• Fix thumbnail in mini player\n• Fix endless buffering on duplicate queue items\n• Some player fixes like rotation and faster closing\n• Fix ReCAPTCHA remaining loaded in background\n• Disable clicks while refreshing feed\n• Fix some downloader crashes\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/976.txt",
    "content": "• Added option to directly open player in fullscreen\n• Allow choosing which types of search suggestions to show\n• Dark theme now darker + dark splash screen added\n• Improved file picker to gray out unwanted files\n• Fixed importing YouTube subscriptions\n• Replaying a stream requires on tap on the replay button again\n• Fixed closing audio session\n• [Android TV] Fixed long seekbar jumps when using a DPad\n\nTo see further changes, view the changelog (and blog post) from the Links tab below.\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/977.txt",
    "content": "• Added a \"play next\" button to the long press menu\n• Added YouTube shorts path prefix to intent filter\n• Fixed Settings import\n•  Swap seekbar position with player buttons in Queue screen\n• Various fixes related to MediasessionManager\n• Fixed seekbar not completed after video end\n• Disabled media tunneling on RealtekATV\n• Expanded minimized player buttons clickable area\n\nTo see further changes, view the changelog (and blog post) from the Links tab below.\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/978.txt",
    "content": "एक नए न्यूपाइप संस्करण के लिए चेक को ठीक किया गया। यह चेक कभी-कभी बहुत जल्दी निष्पादित किया गया था और इसलिए ऐप क्रैश हो गया। इसे अभी ठीक किया जाना चाहिए।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/979.txt",
    "content": "- प्लेबैक फिर से शुरू करना \n- यह सुनिश्चित करने के लिए सुधार कि सेवा जो यह निर्धारित करती है कि न्यूपाइप को नए संस्करण की जांच करनी चाहिए या नहीं, पृष्ठभूमि में शुरू नहीं हुई है\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/980.txt",
    "content": "New\n• Added \"Add to playlist\" option to share menu\n• Added support for y2u.be and PeerTube short links\n\nImproved\n• Made Playback-Speed-Controls more compact\n• Feed highlights new items now\n• \"Show watched items\" option in the feed is now saved\n\nFixed\n• Fixed YouTube likes and dislikes extraction\n• Fixed automatic replay after returning from the background\nAnd much more\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/981.txt",
    "content": "Android 11+ पर बफ़रिंग के बाद विफल प्लेबैक रिज्यूमे को ठीक करने के लिए MediaParser समर्थन को हटा दिया गया। \nप्लेबैक समस्याओं को ठीक करने के लिए Philips QM16XE पर मीडिया टनलिंग अक्षम की गई।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/982.txt",
    "content": "फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/983.txt",
    "content": "Add new double-tap-to-seek UI and behaviour\nMake settings searchable\nHighlight pinned comments as such\nAdd open-with-app support for FSFE's PeerTube instance\nAdd error notifications\nFix replay of first queue item on player change\nWait longer when buffering during livestreams before failing\nFix order of local search results\nFix empty item fields in play queue\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/984.txt",
    "content": "Load enough initial items in lists to fill the whole screen and to fix scrolling on tablets and TVs\nFix random crashes while scrolling through lists\nHave the player fast seek overlay arc go under the system UI\nRevert changes to cutouts when playing in multi window, causing the misplaced player regression on some phones\nIncrease compileSdk from 30 to 31\nUpdate error reporting library\nRefactor some code in the player\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/985.txt",
    "content": "फिक्स्ड YouTube कोई स्ट्रीम नहीं चला रहा है\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/986.txt",
    "content": "New\n• Notifications for new streams\n• Seamless transition between background and video players\n• Change pitch by semitones\n• Append the main player queue to a playlist\n\nImproved\n• Remember speed/pitch step size\n• Mitigate initial long buffering in the video player\n• Improve player UI for Android TV\n• Confirm before deleting all downloaded files\n\nFixed\n• Fix media button not hiding player controls\n• Fix playback reset on player type change\n• Fix rotating the playlist dialog\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/987.txt",
    "content": "New\n• Support delivery methods other than progressive HTTP: faster playback loading time, fixes for PeerTube and SoundCloud, playback of recently-ended YouTube livestreams\n• Add button to add a remote playlist to a local one\n• Image preview in Android 10+ share sheet\n\nImproved\n• Improve playback parameters dialog\n• Move subscription import/export buttons to three-dot menu\n\nFixed\n• Fix removing fully watched videos from playlist\n• Fix share menu theme and \"add to playlist\" entry\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/988.txt",
    "content": "[यूट्यूब] किसी भी वीडियो को चलाने का प्रयास करते समय \"कोई स्ट्रीम नहीं मिल सका\" त्रुटि को ठीक करें \n[यूट्यूब] ठीक करें \"निम्न सामग्री इस ऐप पर उपलब्ध नहीं है।\" अनुरोधित वीडियो के बजाय दिखाया गया संदेश\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/989.txt",
    "content": "• [यूट्यूब] किसी भी वीडियो को चलाने का प्रयास करते समय असीमित लोडिंग को ठीक करें \n• [यूट्यूब] कुछ वीडियो पर थ्रॉटलिंग ठीक करें \n• jsoup लाइब्रेरी को 1.15.3 में अपग्रेड करें, जिसमें सुरक्षा समाधान शामिल है\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/990.txt",
    "content": "This release drops support for Android 4.4 KitKat, now the minimum version is Android 5 Lollipop!\n\nNew\n• Download from long-press menu\n• Hide future videos in feed\n• Share local playlists\n\nImproved\n• Refactor the player code into small components: less RAM used, less bugs\n• Improve thumbnails' scale mode\n• Vector-ize image placeholders\n\nFixed\n• Fix various issues with the player notification: outdated/missing media info, distorted thumbnail\n• Fix fullscreen using 1/4 of screen\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/991.txt",
    "content": "नया \n• त्रुटि पैनल में \"ब्राउज़र में खोलें\" बटन जोड़ें \n• चैनल समूहों को सूची के रूप में प्रदर्शित करने का विकल्प जोड़ें \n• [यूट्यूब] टाइमस्टैम्प यूआरएल साझा करने के लिए स्ट्रीम सेगमेंट पर लंबे समय तक क्लिक करें \n• मिनी प्लेयर में क्यू प्ले बटन जोड़ें\n\nउन्नत \n• आइसलैंडिक स्थानीयकरण जोड़ें और कई अन्य अनुवादों को अपडेट करें \n• कई आंतरिक सुधार \n\nहल किया गया \n• कई सारे क्रैश को ठीक करें \n• [यूट्यूब] कुछ देशों में लोडिंग चैनल, गैर-समर्पित फ़ीड और प्लेबैक समस्याओं को ठीक करें\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/992.txt",
    "content": "नया \n• वीडियो विवरण में सब्सक्राइबर गिनती \n• कतार से डाउनलोड करें \n• स्थायी रूप से एक प्लेलिस्ट थंबनेल सेट करें \n• लंबे समय तक प्रेस हैशटैग और लिंक \n• कार्ड दृश्य मोड \n\nबेहतर \n• बड़ा मिनी-प्लेयर बंद बटन \n• चिकना थंबनेल डाउनस्केलिंग \n• लक्ष्य Android 13 (API 33) \n• अब मांगने से खिलाड़ी रुक जाता है \n\nसही किए \n• DeX/माउस पर ओवरले ठीक करें \n• बिना किसी अलग ऑडियो स्ट्रीम के पृष्ठभूमि प्लेयर की अनुमति दें \n• विभिन्न यूट्यूब फिक्स और अधिक…\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/993.txt",
    "content": "नया\n• प्लेलिस्ट डुप्लिकेट जोड़ते समय चेतावनी जोड़ें और उन्हें हटाने के लिए बटन जोड़ें\n• हार्डवेयर बटन को अनदेखा करने की अनुमति दें\n• फ़ीड में आंशिक रूप से देखे गए वीडियो को छिपाने की अनुमति दें\n\nबेहतर\n• बड़ी स्क्रीन पर अधिक ग्रिड कॉलम का उपयोग करें\n• प्रगति संकेतक सेटिंग्स के अनुरूप बनाएं\n\nफिक्स\n• एंड्रॉइड 11+ पर ब्राउज़र यूआरएल, डाउनलोड और बाहरी खिलाड़ियों को खोलने को ठीक करें\n• एमआईयूआई पर दो टैप की आवश्यकता वाले फुलस्क्रीन के साथ इंटरेक्टि करना ठीक करें\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/994.txt",
    "content": "नया\n• एकाधिक ऑडियो ट्रैक/भाषाओं का समर्थन करें\n• स्क्रीन के किसी भी तरफ वॉल्यूम और ब्राइटनेस जेस्चर सेट करने की अनुमति दें\n• स्क्रीन के नीचे मुख्य-टैब प्रदर्शित करने के लिए समर्थन\n\nकिए सुधार\n• [बैंडकैंप] पे वॉल के पीछे ट्रैक संभालें\n\nहल किया गया\n• [यूट्यूब] स्ट्रीम के लिए 403 HTTP त्रुटियाँ\n• प्लेलिस्ट दृश्य से मुख्य प्लेयर पर स्विच करते समय काला प्लेयर\n• प्लेयर सेवा मेमोरी लीक\n• [पीयरट्यूब] अपलोडर और सबचैनल अवतारों की अदला-बदली की गई\n\nऔर अधिक\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/995.txt",
    "content": "नया\n• चैनल टैब्स का समर्थन करें\n• छवि गुणवत्ता का चयन करें\n\nसुधार किए\n• प्लेयर इंटरफ़ेस की पहुंच\n• केवल-वीडियो डाउनलोड के लिए बेहतर ऑडियो चयन\n\nठीक किए\n• [यूट्यूब] लाइक पाने की संख्या ठीक करें\n• पॉपअप और क्रैश पर प्रतिक्रिया नहीं देने वाले प्लेयर को ठीक करें\n• भाषा चयनकर्ता में गलत भाषाओं का चयन ठीक करें\n• प्लेयर ऑडियो फोकस म्यूट का सम्मान नहीं कर रहा था\n• प्लेलिस्ट में आइटम ना जुड़ना ठीक किया\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/996.txt",
    "content": "Media.ccc.de में चैनल/कॉन्फ़्रेंस खोलते समय NullPointerException को ठीक किया गया।\nग्रिंच ने आपको हमारा क्रिसमस उपहार तोड़ने की कोशिश की, लेकिन हमने इसे ठीक कर दिया।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/997.txt",
    "content": "नया\n• टिप्पणियों के उत्तर जोड़ें\n• प्लेलिस्ट को पुन: व्यवस्थित करने की अनुमति दें\n• प्लेलिस्ट विवरण और अवधि दिखाएं\n• सेटिंग्स रीसेट करने की अनुमति दें\n\nसुधार\n• [एंड्रॉइड 13+] कस्टम अधिसूचना क्रियाएं पुनर्स्थापित करें\n• कुछ सेटिंग्स पुनः व्यवस्थित करें\n\nठीक किए\n• [यूट्यूब] लोड न होने वाली टिप्पणियों को ठीक करें, साथ ही अन्य फिक्स और सुधार भी\n• विभिन्न डाउनलोड सुधार\n• खोज पाठ को ट्रिम करें\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/998.txt",
    "content": "HTTP 403 त्रुटियों के कारण YouTube द्वारा कोई स्ट्रीम न चलाए जाने की समस्या को ठीक किया गया।\n\nYouTube वीडियो के बीच में कभी-कभी आने वाली HTTP 403 त्रुटियों को अभी तक ठीक नहीं किया गया है।\nइस समस्या को जल्द से जल्द किसी अन्य हॉटफ़िक्स रिलीज़ में संबोधित किया जाएगा।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/changelogs/999.txt",
    "content": "यह हॉटफ़िक्स रिलीज़ YouTube वीडियो के बीच में HTTP 403 त्रुटियाँ ठीक करता है।\n\nनया\n• [SoundCloud] on.soundcloud.com URL के लिए समर्थन जोड़ें\n\nसुधार किया गया\n• [Bandcamp] रेडियो कियोस्क में अतिरिक्त जानकारी दिखाएँ\n\nठीक किया गया\n• [YouTube] वीडियो की शुरुआत में या बीच में कभी-कभी होने वाली HTTP 403 त्रुटियाँ ठीक करें\n• [YouTube] अधिक चैनल हेडर प्रकारों से अवतार और बैनर संजोए\n• [Bandcamp] विभिन्न बग ठीक करें और हमेशा HTTPS का उपयोग करें\n"
  },
  {
    "path": "fastlane/metadata/android/hi/full_description.txt",
    "content": "न्यूपाइप किसी भी गुगल फ्रेमवर्क लाइब्रेरी, या यूट्यूब एपीआई का उपयोग नहीं करता है। यह केवल वेबसाइट को पार्स करता है ताकि इसकी आवश्यकता वाली जानकारी हासिल की जा सके। इसलिए इस ऐप का उपयोग गुगल सेवाओं के स्थापित किए बिना उपकरणों पर किया जा सकता है। इसके अलावा, आपको न्यूपाइप का उपयोग करने के लिए युट्युब खाते की आवश्यकता नहीं है, और यह मुक्त और खुला है।\n"
  },
  {
    "path": "fastlane/metadata/android/hi/short_description.txt",
    "content": "एंड्रॉयड के लिए एक मुफ्त लाइट यूट्यूब फ्रंटएंड।\n"
  },
  {
    "path": "fastlane/metadata/android/hr/full_description.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/hr/short_description.txt",
    "content": "Jednostavno i besplatno YouTube sučelje za Android.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/1000.txt",
    "content": "Fejlesztés\n• A lejátszási lista leírása kattinthatóvá vált, hogy több/kevesebb tartalom jelenjen meg\n• [PeerTube] Automatikusan kezeli a „subscribeto.me” példány linkjeit\n• Az előzmények közül egyszerre csak egy kerül lejátszásra\n\nJavítva\n• RSS gomb láthatósága\n• Keresősáv előnézet fagyások\n• Bélyegkép nélküli videó is hozzáadható a listához\n• A letöltésből idő előtti kilépés\n• A listához kapcsolódó elemek felugró panelje\n• A listához való hozzáadás panel sorrendje\n• A lejátszólista könyvjelző elemének elrendezése\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/1001.txt",
    "content": "Fejlesztés\n• Mindig engedélyezi a lejátszó értesítési beállításainak módosítását Android 13+ rendszeren\n\nJavítások\n• Az adatbázis/feliratkozások exportálása nem vágja le a már létező fájlt, ami esetleg sérült exportáláshoz vezethetne\n• Egy időbélyegzőre nyomva a lejátszás folytatása nem a videó elejétől indul\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/1002.txt",
    "content": "Javítva a YouTube-ról nem játszik le semmilyen streamet.\n\nEz a kiadás csak a legsürgősebb hibát kezeli, ami megakadályozza a YouTube videó részleteinek betöltését.\nTisztában vagyunk azzal, hogy vannak más problémák is, és hamarosan külön kiadást készítünk ezek megoldására.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/1003.txt",
    "content": "Ez egy azonnali kiadás, amely a YouTube hibáit javítja:\n• [YouTube] A videóinformációk betöltésének elmaradása, a videók lejátszása közben fellépő HTTP 403 hibák javítása és néhány korhatáros videó lejátszásának visszaállítása\n• A feliratméret váltásának javítása\n• Az információ kétszeri letöltésének javítása a stream megnyitásakor\n• [Soundcloud] A lejátszhatatlan DRM-védett streamek eltávolítása\n• Frissített fordítások\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/1004.txt",
    "content": "Ez a kiadás javítja, hogy a YouTube csak 360p felbontásban képes lejátszani.\n\nVegyük figyelembe, hogy az ebben a verzióban alkalmazott megoldás valószínűleg ideiglenes, és hosszú távon a SABR videó protokollt kell megvalósítani, de a TeamNewPipe tagjai jelenleg elfoglaltak, így minden segítséget nagyra értékelnénk! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/1005.txt",
    "content": "Újdonság\n- Android Auto támogatás hozzáadása\n- A hírfolyamcsoportok főképernyőfülekként való beállítása\n- [YouTube] Megosztás ideiglenes lejátszási listaként\n- [SoundCloud] „Kedvelések” csatorna lap\n\nTovábbfejlesztve\n- Jobb keresősáv-súgók\n- Letöltési dátum megjelenítése a letöltések között\n- Android 13 alkalmazásonkénti nyelv használata\n\nJavítva\n- Törött szövegszínek javítása sötét módban\n- [YouTube] A lejátszási listák 100-nál több elemet nem töltöttek be.\n- [YouTube] Az ajánlott videók hiányának javítása\n- Az előzmények listanézetben bekövetkező összeomlások javítása\n- A hozzászólásválaszok időbélyegeinek javítása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/1006.txt",
    "content": "# Továbbfejlesztve\nAz aktuális lejátszó megmarad időbélyegre kattintáskor\nFüggőben lévő letöltések helyreállításának megkísérlése\nLetöltés törlése a fájl megtartásával\nOverlay engedélyhez magyarázó párbeszédablak (Android 11+)\non.soundcloud hivatkozások támogatása\nSok kisebb fejlesztés és optimalizálás\n\n# Javítva\nSzámozás javítása Android 7 alatt\nSzellem értesítések javítása\nSRT felirat javítások\nSok összeomlás javítva\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/1007.txt",
    "content": "Immáron minden YouTube videó lejátszásra kerül\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/63.txt",
    "content": "### Fejlesztések\n- Beállítások importálása/exportálása #1333 \n- Túlrajzolás csökkentése (teljesítménybeli javítás) #1371 \n- Apró kódfejlesztések #1375 \n- GDPR információk hozzáadása #1420\n\n### Javítva\n- Letöltő: A befejezetlen .giga fájl letöltések betöltése közbeni összeomlás javítása #1407\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/64.txt",
    "content": "### Fejlesztések\n- Lehetőség a videó minőségének korlátozására mobiladat-kapcsolaton #1339 \n- A munkamenet erejéig megjegyzi a fényerő-beállítást #1442 \n- Jobb letöltési teljesítmény gyengébb CPU esetén #1431 \n- (működő) médiamunkamenet támogatásának hozzáadása #1433\n\n### Javítások\n- 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\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/65.txt",
    "content": "### Fejlesztések\n\n- Burgermenü animáció tiltása #1486\n- a letöltések törlésének visszavonása #1472\n- Letöltési a megosztásban #1498\n- Megosztás a hosszú érintéshez #1454\n- Fő lejátszó minimalizálása a kilépésnél #1354\n- Könyvtár verzió frissítés és az adatbázis biztonsági mentésének javítása #1510\n- ExoPlayer 2.8.2 frissítés #1392\n  - Átdolgoztuk a lejátszásisebesség-vezérlő panelt, hogy támogasson gyorsabb csévélést is.\n  - 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 =\\\\).\n  - Á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.\n  - 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.\n  - 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\n- Újraírt kivonatoló használata több szolgáltatáshoz\n\n### Javítások\n\n- a #1440 Hibás videó információs elrendezés #1491\n- Előzmények megtekintése #1497\n  - #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.\n  - #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.\n- a képernyő túllépés felugró mód esetén. #1463 (javítva #640)\n- Fő videólejátszó #1509\n  - [#1412] a háttérben levő ismétlőmód NPE-t okozhatott.\n  - Felugró mód engedélyezése nélkül való átváltás esetén nem záródik be.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/66.txt",
    "content": "# Változásnapló v0.13.7\n\n### Javítva\n- v0.13.6a szűrés javítása\n\n# v0.13.6 változásnaplója\n\n### Fejlesztések\n\n- Burgermenü animációk kikapcsolása #1486 \n- Letöltések törlésének visszavonása #1472 \n- Letöltés megjelenítése a megosztás menüben #1498\n- Megosztás hozzáadása a hosszú lenyomás menühöz #1454 \n- Főlejátszó minimalizálása kilépéskor #1354 \n- Könyvtár verzió frissítés és adatbázis biztonsági mentés javítás #1510 \n- ExoPlayer 2.8.2 Frissítés #1392\n  - Visszajátszási sebesség irányítópult újradolgozása a különböző sebességléptek támogatására.\n  - 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 =\\\\).  \n  - 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.\n  - Lejátszási lista darabka megnyitásakor megjelenő új metaadatnál nincs frissülés.\n  - 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\n- Multiszervizes kibontó újradolgozása\n\n### Javítások\n\n- Javítás #1440 Hibás videó infó elrendezés #1491 \n- Előzmény megtekintés javítás #1497\n  - #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. \n  - #1475, adatbázis nézet regisztrálásra kerül a külső lejátszó elemrészleteinél.\n- Időtúllépés javítása kiugró ablaknál. #1463 (Fixed #640)\n- Fő videólejátszó javítás #1509 \n  - [#1412] Az ismétlő mód NPE-t okoz, amikor a háttérben futó alkalmazás ilyen parancsot kap.\n  - A felugró ablak mód letiltása esetén felugró mód nem zárja be az appot.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/68.txt",
    "content": "# Változások v0.14.1\n\n### Javítva\n- a nem sikerül visszafejteni a videó URL-t #1659\n- a leíró link nem jól kibontható #1657\n\n# Változások v0.14.0\n\n### Új\n- fiókkialakítás #1461\n- testreszabható címlap #1461\n\n### Fejlesztések\n- Átdolgozott gesztusvezérlők #1604\n- Új módja a felugrólejátszó bezárásának #1597\n\n### Javítva\n- a feliratkozók száma nem érhető el hibája. Bezárva a #1649.\n- Ezekben az esetekben „A feliratkozók száma nem érhető el” megjelenítése\n- az NPE, ha egy YouTube lejátszási lista üres\n- Gyors javítás a SoundCloud kioszkjaihoz\n- Refaktor és hibajavítás #1623\n  - a ciklikus keresési eredmény #1562\n  - a keresősáv nincs statikusan elrendezve\n  - az YT Prémium videó nincs megfelelően blokkolva\n  - a videók néha nem töltődnek be (a DASH elemzés miatt)\n  - a linkek a videó leírásában\n  - Figyelmeztetés megjelenítése, ha valaki külső SD-kártyára próbál letölteni\n  - a semmi sem jelenik meg kivétel jelentést vált ki\n  - 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)\n- a műsorszóró vevőregisztrációja. Bezárva a #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/69.txt",
    "content": "### Új\n- Hosszú lenyomásnál törlés és megosztás a feliratkozásoknál #1516 \n- Tablet felület és rácslistát elrendezés #1617 \n\n### Fejlesztések\n- Legutolsó képarány mentése és betöltése #1748 \n- Letöltések egyszerű elrendezése teljes videó nevekkel #1771 \n- Feliratkozások törlése és megosztása közvetlenül a feliratkozások fülön #1516 \n- Ha a lista végére kerül egy videó, akkor a lista végeztével folytatja azzal #1783 \n- Külön beállítások a hangerő és fényerő gesztusokhoz #1644\n- Nyelvek támogatása #1792\n\n### Javítások\n- Idő elemzés fixálása a . format formátumhoz, így Finnországban is használható a NewPipe\n- Feliratkozó számláló javítása\n- Az API 28+ eszközök esetén előtéri szolgáltatás elérés hozzáadása #1830\n\n### Ismert hibák\n- Lejátszási státusz nem menthető Android P-n\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/70.txt",
    "content": "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? ¯\\_(ツ)_/¯\n\n### Fejlesztések\n* letöltött fájl egy érintéssel megnyitható #1879 \n* android 4.1 - 4.3 támogatása megszűnt #1884 \n* régi lejátszó eltávolítása #1884 \n* videók eltávolítása a listából jobbra húzással #1915 \n* automata hozzáadott videók eltávolítása manuális hozzáadásnál #1878 \n* Utófeldolgozás a letöltésekhez és hiányzó funkciók pótlása #1759 @kapodamy jóvoltából\n  * Utófeldolgozási infrastruktúra\n  * Rendes hibakezelő \"infrastruktúra\" (letöltéshez)\n  * Több párhuzamos letöltés helyett sorba letöltés\n  * Sorbarendezett letöltések áthelyezése az app data-ba (`.giga` fájlok)\n  * Maximum letöltési újrapróbálkozás implementálása\n  * Rendes többszálú letöltés szüneteltetés\n  * Letöltések megállítása mobiladatra váltáskor (sosem működik, lásd második pont)\n  * Szálak számának mentése a következő letöltésekhez\n  * Sok zavaros kód javítása\n\n### Javítás\n* Limitált adathasználat melletti legnagyobb felbontás használata esetén fagyás javítása #1835\n* Kiugró ablakos lejátszó fagyás javítása #1874 \n* NPE a háttérben futó lejátszó megnyitásakor #1901\n* Új videók hozzáadásának javítása ha fel van töltve a lista automata videókkal #1878\n* A megfejtett leállás hiba javítása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/71.txt",
    "content": "### Fejlesztések\n* App frissítések értesítés hozzáadása a GitHub verzióhoz (#1608 @krtkush jóvoltából)\n* Különféle javítások a letöltőhöz (#1944 @kapodamy jóvoltából):\n  * hiányzó fehér gombok pótlása és ikon színek módosítása\n  * megbizonyosodni arról, hogy az iterátor kezdésre kész-e (fixes #2031)\n  * az új muxer lehetővé teszi az újbóli letöltés próbálkozást az \"sikertelen utómunkálat\" hiba esetén\n  * az új MPEG-4 muxer javítja ha a videó és hang nincs szinkronban (#2039)\n\n### Javítás\n* YouTube élő streamek leállnak egy idő után (#1996 @yausername jóvoltából)\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/730.txt",
    "content": "# Javítás\n- Funkció hiba feloldás újabb gyors javítása.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/740.txt",
    "content": "<h4>Fejlesztések</h4>\n<ul>\n<li>kommentekben levő linkek kattinthatóak, szöveg méret növelése</li>\n<li>kommentben levő időlinknél oda ugrik</li>\n<li>preferált fül mutatása az utoljára kijelölt alapján</li>\n<li>lejátszás lista hozzáadása amikor hosszan nyomja a &#39;Háttér&#39; gombot a lista ablakban</li>\n<li>megosztott szövegben keresés ha nem link</li>\n<li>&quot;megosztás jelenlegi időben&quot; gomb hozzáadása a fő videó lejátszóhoz</li>\n<li>fő lejátszónál megjelenik a bezárás gomb, ha a lista végére ért</li>\n<li>&quot;Közvetelnül háttérben lejátszás&quot; hozzáadása a hosszú nyomás menühöz a videó lista elemekhez</li>\n<li>Angol fordítások javítása a Lejátszás/Listáhozadás parancsoknál</li>\n<li>kisebb teljesítményi javítás</li>\n<li>nem használt fájlok eltávolítása</li>\n<li>ExoPlayer frissítése 2.9.6-ra</li>\n<li>egyéni linkek támogatása</li>\n</ul>\n<h4>Javítás</h4>\n<ul>\n<li>scroll javítása kikapcsolt kommentek és streamek esetében</li>\n<li>CheckForNewAppVersionTask elindul amikor nem kéne javítása</li>\n<li>youtube feliratkozó import javítása: hibás URL címek figyelmen kívül hagyása, üres címmel ellátottak megtartása</li>\n<li>helytelen youtube url javítása: aláírás címke neve nem mindig \"aláírás\", mely megakadályozza a videók betöltését</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/750.txt",
    "content": "Újdonság\nLejátszás folytatás #2288\n• Videó folytatása ott ahol leállításra került\nLetöltő Downloader javítások #2149 \n• Háttértár Hozzáférés Keretrendszer használata az SD kártyára való mentéshez\n• Új mp4 muxer\n• Opcionálisan megváltoztatható a letöltési könyvtár letöltés előtt\n• Mért hálózatok tiszteletben tartása \n\n\nFejlesztések\n• gema stringek eltávolítása #2295\n• Auto-elforgatás használat változások életciklus aktivitás közben #2444\n• Hosszan nyomós menük konzisztensebb viselkedése #2368\n\nJavítás\n• Javítva, a kiválasztott feliratsáv neve nem jelenik meg #2394\n• Ha nem sikerül a frissítés keresése, nem omlik össze (GitHub version) #2423 \n• Letöltés nem akad meg 99,9%-nál #2440\n• Lejátszási lista metaadatainak frissítése #2453 \n• [SoundCloud] Lejátszási lista betöltésnél levő összeomlás javítása TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Nem kielemezhető a videó hossza javítva TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/760.txt",
    "content": "Változások a 0.17.1-ban\n\nÚj\n• Thai fordítás\n\n\nFejlesztések\n• Lejátszás innen lista funkció újra hozzáadása a hosszúnyomás menühöz #2518\n• Kapcsoló hozzáadása a SAF-hoz / régi fájl kiválasztó #2521\n\nJavítások\n• App váltásnál a letöltés nézetnél eltűnő gombok javítása #2487\n• Lejátszási pozíció elmentődik, de nem menti az előzményeket\n• Listanézet visszajátszás pozíciója által okozott csökkentett teljesítmény gondok javítása #2517\n• [Kivonatoló] ReCaptchaActivity javítása #2527, TeamNewPipe/NewPipeExtractor#186\n• [Kivonatoló] [YouTube] Lista eredményes keresésnél felmerülő hiba javítása TeamNewPipe/NewPipeExtractor#185\n\n\n\nVáltozások a 0.17.0-ban\n\nÚj\nLejátszás folytatás #2288\n• Videók ott folytatása, hol abba maradtak\nLetöltő Javítások #2149\n• Tárhely Hozzáférés Keretrendszer használata a külső SD kártyára való mentéshez\n• Új mp4 muxer\n• Opcionálisan megváltoztatható a letöltési könyvtár letöltés előtt\n• Fizetős hálózatok tiszteletben tartása \n\n\nFejlesztések\n• Gema string-ek eltávolítása #2295\n• Munkamenet közbeni (auto)elforgatás változtatások #2444\n• Hosszan nyomandó menük konzisztensebbek #2368\n\nJavítások\n• Egyes felirat nevek nem jelentek meg #2394\n• Sikertelen frissítés esetén most már nem omlik össze (GitHub verzió) #2423 \n• Letöltés nem áll meg 99,9%-nál #2440\n• Lejátszási lista metaadat frissítése #2453 \n• [SoundCloud] Lejátszásilista betöltésnél való összeomlás javítása TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Videó hossza nem kiszámítható hiba javítása TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/770.txt",
    "content": "Változások a 0.17.2-ben\n\nJavítás\n• Videó nem volt elérhető javítása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/780.txt",
    "content": "Változások a 0.17.3-ban\n\nFejlesztések\n• Opció a lejátszási státusz törlésére #2550\n• Rejtett mappák mutatása a fájl kiválasztónál #2591\n• `invidio.us` címek megnyitása NewPipe-al #2488 \n• `music.youtube.com` címek megnyitása TeamNewPipe/NewPipeExtractor#194\n\nJavítások\n• [YouTube] 'java.lang.IllegalArgumentException javítva #192\n• [YouTube] élő streamek immáron működnek TeamNewPipe/NewPipeExtractor#195\n• Videó letöltésénél Android Pie-nál teljesítménybeli probléma javítása #2592\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/790.txt",
    "content": "Fejlesztések\n• Hosszabb cím hozzáadása a gyengék látók miatt #2655\n• Jobban értelmezhető és következetesebb a letöltés beállítások nyelvezete #2637\n\nJavítások\n• Letöltött fájl utolsó byte-jának ellenőrzése #2646\n• Videó részleti között szkrollozás fixálva #2672\n• A kereső rubrika kitörlés animációja nem duplázódik #2695\n• [SoundCloud] client_id kivonása fixálva #2745\n\nFejlesztés\n• Hiányzó összefüggések pótlása melyek a NewPipeExtractorból jönnek a NewPipe rendszerbe #2535\n• Migráció AndroidX-be #2685\n• Frissítés ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/800.txt",
    "content": "Új\n• P2P támogatás nélküli PeerTube támogatás (#2201) [Beta]:\n  ◦ Videó megtekintés és letöltés PeerTube munkamenetekből\n  ◦ Az egész PeerTube világ elérése egy opció menüből\n  ◦ 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.\n\n• Letöltőt (#2679):\n  ◦ Hátralevő letöltési idő kalkulálása\n  ◦ Opus letöltése (webm fájlok) ogg-ként\n  ◦ Hosszas szüneteltetés után lejárt letöltési link helyreállítása\n\nFejlesztések\n• Kioszkdarab tudomására hozni a preferált kontentországot, és teljesítményjavítás minden főlapon #2742\n• Új fordítások és letöltő implementációk a kivonatolóból #2713 \n• Az \"Alap kioszk\" sor lefordítható\n• Fekete navigációs bár a fekete témához #2569\n\nJavítások\n• 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 \n• 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\n• 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\n• [SoundCloud] client_id extraction TeamNewPipe/NewPipeExtractor javítva #217\n• [SoundCloud] Audió sáv mentés javítása\n\nFrissítés\n• ExoPlayer frissítése 2.10.8 #2791-re #2816\n• Gradle frissítése 3.5.1-re, és Kotlin támogatás hozzáadása #2714\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/810.txt",
    "content": "Új\n• Bélyegkép mutatása a lezárt képernyőn ha a háttérben fut\n\nFejlesztések\n• Háttér hosszú nyomásánál vagy felugró gombnál hozzáadja a helyi lejátszólistát\n• Fő fülek scrollozhatóak, és egy fül esetén elrejtődik a többi\n• Indexképek limitálása a háttérben futó lejátszónál\n• Ál-indexkép használata hiányos helyi listákhoz\n• *.opus kiterjesztés használata *.webm helyett a \"WebM Opus\" letöltési opciónál\n• Új gomb a letöltések és előzmények törlésére a Letöltések-nél\n• [YouTube] Támogatás a /c/shortened_url csatorna linkekhez\n\nJavítások\n• Több hiba javítása NewPipe-on megosztást követő letöltés esetén\n• Lejátszó hozzáférés létrehozó szál fixálása\n• Keresési eredmény lapozás fixálása\n• [YouTube] NPE-tokozó null fixálása\n• [YouTube] Kommentek megtekintése invidio.us domain megnyitásánál\n• [SoundCloud] client_id frissítése\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/820.txt",
    "content": "Regex név feloldás funkció használhatatlanná teszi a Youtube-ot\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/830.txt",
    "content": "SoundCloud client_id frissítése.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/840.txt",
    "content": "Új\n• Nyelvválasztó hozzáadása\n• Küldés Kodi-ba opció a legördülő menüben\n• Kommentek hosszan nyomása másolja őket\n\nFejlesztések\n• ReCaptcha aktivitás fixálása, és beérkező sütik korrekt kezelése\n• 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\n• Android 6 és későbbi verzióknál korrektül megjelenik az overlay hozzáférés opció panel\n• Helyi lejátszásilista átnevezése a \"KönyvjelzőRész\"-re hosszan nyomással\n• Különböző egyéb PeerTube fejlesztések\n• Több Angol fordítószál javítása\n\nJavítások\n• Lejátszó újrindul annak ellenére, hogy a beállításokban \"átváltás minimalizálásnál\" van beállítva\n• Kiinduló fényerő érték javítása gesztus-irányításnál\n• .srt felirat letöltést követően nem tartalmaz minden sortörést\n• 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\n• Android KitKat letöltések fixálása\n• Hibás mp4 videó hangfájlként felismerés fixálása\n• Többféle fordítási probléma javítása, a kínai nyelvkóddal együtt\n• [YouTube] Időkódok újra klikkelhetőek a leírásban\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/850.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/860.txt",
    "content": "Fejlesztések\n• A tempó és hangszín állapotának mentése és visszaállítása\n• Kijelző kivágás támogatása a lejátszóban\n• Kerekített és sima feliratkozói számláló\n• Youtube optimalizálása, hogy kevesebb adatot használjon\n\nTöbb mint 15 YouTube orientált bug került fixálásra ebben a verzióban.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/870.txt",
    "content": "Ez egy gyorsfix verzió, hogy újra használható legyen a SoundCloud különösebb szenvedés nélkül.\nImmá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.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/900.txt",
    "content": "Új\n• Feliratkozói csoportok és feed-ek rendbetétele\n• Némító gomb a lejátszókban\n\nFejlesztések\n• A music.youtube.com és media.ccc.de domainek megnyitása a NewPipe-ban\n• Két beállítás áthelyezése a Megjelenésből a Kontetbe\n• Az 5, 15, 25 mp-es csévélés kikapcsolva ha a pontatlan keresés be van kapcsolva\n\nJavítások\n• Egyes WebM videók most már csévélhetőek\n• Adatbázis biztonsági mentás Android P-n\n• Összeomlás egy letöltött fájl megosztásánál\n• Egy tonna YouTube kivonatoló és még sok más hiba javítása...\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/910.txt",
    "content": "Adatbázis migráció fixálva, mely megakadályozta a NewPipe elindulását egyes esetekben.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/920.txt",
    "content": "Fejlesztések\n\n• Feltöltési dátum és nézőszám megjelenítése a videó szélén levő infókhoz\n• A felső legördülő menü elrendezés fejlesztése\n\nJavítások\n\n• Némító gomb javítása ami a 19-es API-nál hibára fut\n• Hosszú 1080p 60fps videók letöltésének fixálása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/930.txt",
    "content": "Új\n• Keresés YouTube Music-on\n• Alap Android TV támogatás\n\nFejlesztések\n• Letörölhető minden megnézett videó a helyi lejátszási listából\n• Összeomlás helyett most már kiírja az app, hogy nem támogatott kontent\n• Kiugró lejátszó átméretezés csípéssel fejlesztve\n• Listához hozzáadja a videó a háttéren tartva azujjat, és megjelenít gombokat a csatornán\n• A főcímsáv méretezésének javítása\n\nJavítások\n• Korhatáros kontent beállítás javítása\n• Egyes reCAPTCHA-k javítása\n• Összeomlás ha a lejátszási lista `null` és megnyitásra kerül a könyvjelző javításra került\n• Hálózat orientált kivételek felismerésének javítása\n• A csoport rendező gomb láthatóságának javítása a feliratkozási mezőben\n\nés még sok más\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/940.txt",
    "content": "Új\n• SoundCloud kommentek támogatása\n• YouTube korlátolt beállítás hozzáadása\n• A PeerTube fő csatorna részletek mutatása\n\nFejlesztések\n• Csak a támogatott szolgáltatásoknál jelenik meg a Kore gomb\n• A navigációssáv és a státuszsor területébe belelógó gesztus navigációk blokkolása\n• Újra próbálkozás és Feliratkozás gomb stílusának igazítása a szolgáltatásnak megfelelően\n\nJavítások\n• Letöltési felület fagyásának javítása\n• A böngészőben megnyitás valóban böngészőben nyitja meg a linket\n• A videó megnyitáskori összeomlás és a \"Videó nem lejátszható\" kiírás javítása\n\nés más egyéb\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/950.txt",
    "content": "Ez a verzió három kicsi javítást tartalmaz:\n• Háttértár hozzáférés javítás Android 10+ esetében\n• Megnyitási panel fixálása\n• Hosszú videók idejének felismerésének javítása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/951.txt",
    "content": "Új\n• Kereső hozzáadása a feliratkozás kiválasztóhoz a feed csoport panelhez\n• Filter hozzáadása a feed csoport panelhez, hogy csak csoporton kívüli feliratkozásokat is mutasson\n• Lejátszásilista fül hozzáadása a fő ablakhoz\n• Gyors ütemű előre/hátra csévélés a háttérben és kiugró lejátszóban\n• Keresés ajánlások mutatása: biztosan ezt értette-e & annak eredményei\n\nFejlesztések\n• Nincs többé app metaadat írás a muxolt fájloknál\n• Ne törölje a sikertelenül lejátszott videókat a listákból\n• Státuszbár színének igazítása az eszközsáv színéhez\n\nJavítások\n• A Lebegőpontos összeg miatt keletkező hang/videó deszink javítása\n• [PeerTube] Törölt kommentek kezelése\n\nés még sok más\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/952.txt",
    "content": "Fejlesztések\n• Minden szolgáltatásnál működik az auto-lejátszás (nem csak a YouTube-nál)\n\nJavítás\n• Fixálva a kapcsolódó videók a YouTube új folytatásával\n• A korhatáros videók javítása\n• [Android TV] Fixálva a késő fókusz kiemelés felületréteg\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/953.txt",
    "content": "A YouTube dekódolás funkció kivonatolásának javítása.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/954.txt",
    "content": "• Új app workflow: videók lejátszása a részletes oldalon, és lehúzva minimalizálja a lejátszót\n• MediaStílus értesítések: testre szabható műveletek az értesítésekben, teljesítmény javítások\n• Alapvető átméretezés amikor a NewPipe mint asztali alkalmazás fut\n\n• Ablak szabad beállításokkal ha esetleg nem támogatott URL toast üzenet jelenik meg\n• Keresési ajánlatok feljavítása amikor a távoliak nem elérhetőek\n• Alap lejátszó minőség megemelve 720p60-re (belső lejátszó) és 480p-re (felugró lejátszó)\n\n• Egy tonna hibajavítás és egyéb\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/955.txt",
    "content": "[YouTube] Keresés fixálása egyes felhasználók számára\n[YouTube] Véletlen előforduló dekódoló kivételek fixálása\n[SoundCloud] Megfelelően kerülnek feldolgozásra azon címek amelyek per jelre végződnek\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/956.txt",
    "content": "[YouTube] Bármely videó betöltésnél okozott összeomlás javítása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/957.txt",
    "content": "• Az egyes sorba állítási műveletek egyesítése\n• Lejátszó bezárása kétujjas gesztussal\n• reCAPTCHA sütik törlésének engedélyezése\n• Opció, hogy az értesítések ne színeződjenek\n• Videó leírás javítása annak érdekében hogy ne buffereljen végtelenségig, bugos viselkedés NewPipe megosztásnál, más egyéb ellentmondás javítása\n• Youtube videók felgyorsítása, és korhatáros videók fixálása\n• Csévéléskori összeomlás fixálása\n• Ne rendezze újra a listát az indexkép mozgatásával\n• Emlékezzen a kiugró lejátszó beállításokra\n• Szantáli nyelv hozzáadása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/958.txt",
    "content": "Újdonságok és fejlesztések:\n• Újra el lehet rejteni a bélyegképet a lezárási képernyőn\n• Lehúzással frissül a feed\n• Teljesítmények javítása a helyi listák beszerzésekor\n\nJavítások:\n• A RAM-ból való eltávolítástás utáni indítás utáni összeomlás javítása\n• Internet kapcsolat hiánya miatti összeomlás javítása\n• Világosság és hangerő megjegyzése, és a gesztusirányítás javítása\n• [YouTube] Hosszú lejátszásilisták javítása\n\nEgyéb:\n• Kód tisztítás és más egyéb belső fejlesztés\n• Tartozákok frissítése\n• Fordítási frissítések\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/959.txt",
    "content": "A hiba bejelentő megnyitásakor folyamatos összeomlás javítása.\nPeerTube folyamat listák frissítése amiket automata módon megnyithatóak NewPipe-al.\nFordítások frissítése.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/960.txt",
    "content": "• Export adatbázis leírások opciójának fejlesztése a beállításokban.\n• YouTube kommentek feldolgozásának javítása.\n• media.ccc.de szolgáltatás neve fixálva\n• Fordítások frissítése.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/961.txt",
    "content": "• [YouTube] Mix támogatás\n• [YouTube] Kiírás a publikus adásokról és Covid-19-ről\n• [media.ccc.de] Legutóbbi videók hozzáadása\n• Szomális fordítás hozzáadása\n\n• Sok belső fejlesztés\n\n• Lejátszón belüli megosztás javítása\n• Üres ReCaptcha fixálása\n• Videó listából való eltávolítása esetén van összeomlás fixálása\n• [PeerTube] Kapcsolódó videók fixálása\n• [YouTube] A YouTube Music keresés fixálása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/962.txt",
    "content": "Legutóbbi videók hozzáadása a media.ccc.de szolgáltatáshoz.\nÉlő közvetítések hozzáadás a media.ccc.de-hez, közvetítések támogatása.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/963.txt",
    "content": "• [YouTube] Csatorna folytatás fixálása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/964.txt",
    "content": "• Fejezetek támogatása a lejátszó vezérlőknél\n• [PeerTube] Sepia keresés hozzáadása\n• Újra hozzáadva a megosztás gomb a részletekhez, és a fül felülethez került a leírás maga\n• Ha a fényerő gesztus ki van kapcsolva, a fényerő helyreállítás nem lehetséges\n• Új listaelemként megjelenik a Kodi-ban való lejátszás\n• Összeomlás javítása egyes eszközöknél ahol nincs megjelölve az alapértelmezett böngésző, megosztási panel fejlesztése\n• Lejátszás/szüneteltetés funkció a fizikai billentyűzet szóközével\n• [media.ccc.de] Számtalan javítás és fejlesztés\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/965.txt",
    "content": "Csatona csoportoknál fellépő összeomlás javítása.\nTovábbi videók és lejátszásilisták kérésének fixálása.\nYouTube kommentek megjelenítésének fixálása.\nA /watch/, /v/ és /w/ YouTube alcímek támogatása.\nA SoundCLoud kliens id és földrajzilag korlátozott kontent kibontásának fixálása.\nÉszek-Kurd fordítás hozzáadása.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/966.txt",
    "content": "Új:\n• Új szolgáltatás került hozzáadásra: Bandcamp\n\nFejlesztések:\n• Készülék téma követő beállítás hozzáadása\n• Egyes hibák megakadályozása az újradolgozott hibaértesítő segítségével\n• Többi információ arról, hogy miért nem elérhető a kontent\n• Hardveres szóköz aktiválja a lejátszást/szüneteltetést\n• \"letöltés megkezdődött\" toast értesítő mutatása\n\nJavítva:\n• A videó bélyegképe túl kicsi volt a háttérlejátszónál\n• Üres cím javítása a háttérben való lejátszásnál\n• Utolsó méretezés helyreállítása nem történt meg\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/967.txt",
    "content": "A YouTube nem megfelelő működése az EU-n belül javításra került. Ez egy új beleegyező süti miatt történt, de immáron beállításra került.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/968.txt",
    "content": "Menü hosszú nyomásánál megjeleníthető a csatorna részletei.\nA Lista felületen átnevezhető a lejátszásilista.\nVideó megállítható bufferelés közben.\nA világos téma felfrissítve.\nNagyobb betűméretnél nem takarják egymást a szövegek.\nFormuler és Zephier eszközökön immáron megjelennek a videók.\nMegannyi hibajavítás.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/969.txt",
    "content": "• Külső meghajtóról való telepítés engedélyezése\n• [Bandcamp] A legelső három komment megjelenítése a zenén\n• A 'letöltés megkezdődött' toast értesítő csak valóban a letöltéskor jelenik meg\n• Ha nincs engedélyezve a süti tárolás, ne tárolja a reCaptcha sütiket se\n• [Lejátszó] Cache teljesítmény javítása\n• [Lejátszó] A lejátszó most már automatikusan elindul\n• Korábbi Snackbar-ok elutasítása a letöltések törlésénél\n• A listában nem szereplő elem törlésének javítása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/970.txt",
    "content": "Új\n• Tartalom metaadat megjelenítése (tagek, kategóriák, licensz, ...) a lenti leírásban\n• \"Csatona részletek megjelenítése\" hozzáadása távoli (nem-helyi) lejátszási listáknál\n• \"Megniytás böngészőben\" opció megjelenítése hosszú nyomáskor\n\nJavítások\n• Részletek oldal forgatás összeomlás javítása\n• A \"Eljátszás Kodi-val\" lejátszó gomb most már nem akar mindig Kore-t installálni\n• Javított beállítás import és export útvonalak\n• [YouTube] Komment like számláló mutatása\nÉs sok más\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/971.txt",
    "content": "Gyorsjavítás\n• Buffer növelése lejátszáshoz rebuffer-t követően\n• Összeomlás javítása a tévéken és tableteken a lejátszás-hozzáadás gomb megnyomásakor\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/972.txt",
    "content": "Új\nIdőpontok és kettőskeresztek felismerése\nManuális tablet mód hozzáadva\nMegnézett videók elrejtése a feed-ben\n\nFejlesztések\nA Háttértár Hozzáférés Keretrendszer megfelelő támogatása\nJobb hibajelentés elérhetetlen és törölt csatornák esetében\nAz Android 10+ megosztás panel immáron megjeleníti a tartalom címét is.\nInvidious folyamatok frissítése és Piped linkek támogatása.\n\nJavítás\n[YouTube] Korhatáros tartalom\nMegakadályozva, hogy a kivételek ablaka belecsússzon a megnyitott lehetőség panelbe\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/973.txt",
    "content": "Gyorsjavítás\n• Indexképek levágása rácsos nézetben fixálása, ami egy rossz kalkuláció eredménye volt\n• A megosztás menüből történő letöltésnél nem történik semmi, csak kiírásra kerül a letöltés fixálva\n• Külső tevékenységekkel kapcsolatos könyvtárak frissítése, mint például a Héttártár Hozzáférés Keretrendszer fájl kiválasztó\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/974.txt",
    "content": "Gyorsjavítás\n• A YouTube szabályozás által okozott pufferelési problémák javítása\n• Javítva a YouTube megjegyzések kinyerése által okozott összeomlás letiltott megjegyzéseknél\n• Javítva a YouTube zenei keresés\n• A PeerTube élő közvetítések javítva\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/975.txt",
    "content": "Új\n• Videón belüli keresésnél mutassa az előképet\n• Kikapcsolt kommentek felismerése\n• A feed-en megjelenő videók megnézettnek jelölése\n• Komment szívecskézés megjelenítése\n\nFejlesztések\n• Metaadat és tag elrendezés javítása\n• Szolgáltatás szín alkalmazása a felhasználói felületre\n\nJavítások\n• Indexképek javítása a mini lejátszóban\n• Duplázott listaelemnél végtelen bufferelés javítása\n• Lejátszó javítások, mint például az elforgatás és a gyorsabb bezárás\n• ReCAPTCHA immáron nem fut tovább a háttérben\n• Interakció kikapcsolása a feed frissíténél\n• Egyes letöltő összeomlás javítása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/976.txt",
    "content": "• Hozzáadott lehetőség, hogy közvetlenül teljes képernyőn nyíljon meg a lejátszó\n• Kiválasztható milyen keresési javaslat jelenjen meg\n• A sötét téma sötétebb + sötét kezdőkép hozzáadása\n• Fájl kiválasztó kiszürkíti az oda nem illő fájlokat\n• YouTube feliratkozások javítása\n• A videó végeztével az ismétlő gombbal újra működik az újrakezdés\n• A hang nélküli munkamenet javítása\n• [Android TV] Az irányválasztó gombbal lehet ugrani az idővonalon\n\nA további változásokért, tekintse meg a változásnaplót (és blog bejegyzést) a lenti Linkek résznél.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/977.txt",
    "content": "• \"következő lejátszása\" gomb hozzáadása a hosszan nyomandó menühöz\n• Most már a short-ok prefixét is támogatja a filter\n• Beállítások importjának javítása\n• A lista képernyőn az idővonal leváltódik gombokra\n• Számos javítás a MédiaMunkamenetMenedzserrel kapcsolatban\n• Videó végeztével most már teljesen végigfut a idővonal\n• Kikapcsolásra kerül a média alagutazás a RealtekATV-n\n• A minimalizált lejátszó gombok klikkelhető területének növelése\n\nA további változásokért, tekintse meg a változásnaplót (és blog bejegyzést) a lenti Linkek résznél.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/978.txt",
    "content": "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égrehajtva, és ez az alkalmazás összeomlásához vezetett. Ez javításra került.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/979.txt",
    "content": "- Javítva a lejátszásfolytatás\n- 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\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/980.txt",
    "content": "Új\n• A megosztás menübe bekerült a \"Hozzáadás listához\" opció\n• y2u.be és PeerTube rövid linkek támogatása\n\nFejlesztések\n• A Visszajátszás-Sebesség-Irányítók összébb tömörítése\n• A feed most már kiemeli az új elemeket\n• A \"Mutassa a megtekintett videókat\" opció megfelelően mentésre kerül\n\nJavítás\n• A YouTube Tetszik/Nem tetszik kinyerés javításra került\n• Automata újrajátszás javítása a háttérből való visszaváltáskor\nÉs még sok minden más\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/981.txt",
    "content": "MédiaElemző támogatás eltávolításra került az Anroid 11+ rendszereken a bufferelés utáni sikertelen lejátszás javítása miatt.\nA Philips QM16XE-en kikapcsolásra kerül a média alagútazás a visszajátszási problémák kiküszöbölése miatt.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/982.txt",
    "content": "A YouTube immáron lejátszik minden videót.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/983.txt",
    "content": "Új dupla-érintéses-csévélés felhasználói felület és kezelés hozzáadása\nKereshetőek a beállítások\nKiemelt kommentek valóban kiemelésre kerülnek\nAz FSFE PeerTube folyamatok számára appal-való-megnyitás támogatás hozzáadása\nHiba értesítő hozzáadása\nLejátszó váltáskor az első videó hiábs lejátszásának javítása\nA bufferelés során több ideig vár a lejátszó mielőtt hibára fut az élő közvetítés\nA helyi keresési eredmények sorrendjének javítása\nÜres elemek javítása a lejátszási listában\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/984.txt",
    "content": "Kellő mennyiségű elemet töltsön be a lista elejére, hogy mind a Tv és a tablet képernyőt betelítse\nVéletlenszerű kifagyások javítása listák görgetése közben\nA lejátszó gyorskeresés felülete kerüljön a rendszer felülete alá\nA többablakos nézetnél kivágós üzemmődban fut, ezzel kijavítva, hogy egyes telefonokon rossz helyre helyeződik át a lejátszó\nA compileSdk növelése 30-ról 31-re\nHiba jelentő mappa frissítése\nA lejátszó egyes kódjainak refaktorálása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/985.txt",
    "content": "Immáron minden YouTube videó lejátszásra kerül\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/986.txt",
    "content": "Új\n• Értesítések új videókról\n• Zavartalan átvezető a háttérből való lejátszó váláskor\n• Félhangonkénti hangszint váltás\n• A főljeátszó listázás hozzácsatolása a lejátszólistához\n\nFejlesztések\n• Emlékezzen a sebesség/hangszintlépés méretére\n• A kezdő hosszú bufferelés csökkentése a videó lejátszóban\n• Lejátszó felület fejlesztése Anroid TV-n\n• Rákérdezés az összes videó törlése előtt\n\nJavítások\n• A média gomb most már elrejti a lejátszó vezérlőket\n• Visszajátszás fixálva lejátszó típus váltáskor\n• Lejátszólista elforgatásának javításata\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/987.txt",
    "content": "Új\n• A progresszív HTTP-n kívül más átadó támogatása: gyorsabb visszajátszó betöltés idő, javítások PeerTube-hoz és SoundCloud-hoz, nemrég befejezett élő adások visszajátszása\n• Távoli listához hozzáadandó helyi lista gomb hozzáadása\n• Előkép az Android 10+ megosztó felületen\n\nFejlesztések\n• Visszajátszási paraméter dialógus fejlesztése\n• A felirakozás importálás/exportálás gomb berakása a három-pontos menübe\n\nJavítások\n• Teljesen megnézett videók eltávolítása a feed-ből javítása\n• megosztási menü téma fixálása, és \"listához adás\" elem hozzáadása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/988.txt",
    "content": "[YouTube] A \"Nem elérhető a videó\" hiba javítása lejátszáskor\n[YouTube] A \"A következő kontent nem elérhetőaz országában\" jelenik meg a videó lekérése helyett\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/989.txt",
    "content": "• [YouTube] A videók végtelenségig tartó betöltésének javítása\n• [YouTube] Egyes videóknál előforduló visszafogás javítása\n• Frissítés a jsoup programkönyvtár 1.15.3-as verziójára, amely egy biztonsági javítást tartalmaz\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/990.txt",
    "content": "Ez a verzió elhagyja az Android 4.4 KitKat támogatását, mostantól legalább Android 5 Lollipop szükséges.\n\nÚj\n• Letöltés a hosszú érintéses menüből\n• Jövőbeli videók elrejtése\n• Helyi lejátszólisták megosztása\n\nFejlesztések\n• A lejátszó kódjának refaktorálása: kevesebb RAM használat, kevesebb hibával\n• A bélyegképek skálázási módjának fejlesztése\n• Helykitöltő képek vektorosítása\n\nJavítások\n• Különböző lejátszóértesítési problémák javítása: lejárt/hiányos mádia információ, zavaros bélyegkép\n• A teljes képernyős csak a negyed képet teszi ki\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/991.txt",
    "content": "Újdonság\n• \"Megnyitás böngészőben\" gomb került a hibapanelre\n• Bekerült a csatornacsoportok listaként megjeleníthetősége\n• [YouTube] A szegmensekre való hosszan-nyomás időbélyeggel megosztást tesznek lehetővé\n• Sor lejátszása gomb került a minilejátszóra\n\nJavítások\n• Bekerült az izlandi fordítás és sok fordítás frissítve lett\n• Sok más belső javítás \n\nJavítások\n• Többféle összeomlás javítása\n• [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\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/992.txt",
    "content": "Új\n• Feliratkozó szám a videó részleteinál\n• Letöltés a listából is\n• Végleges előkép hozzáadása a listához\n• Kettőskeresztekre és linkekre való hosszú nyomás\n• Kártya néző mód\n\nFejlesztések\n• Nagyobb mini-lejátszó bezáró gomb\n• Simább bélyegkép méretezés\n• Kiemelt cél az Anrdoid 13 (API 33)\n• A keresés immáron nem szünetelteti a lejátszást\n\nJavítások\n• Felület javítása DeX/egérnél\n• Háttérlejátszás ha a videó nem rendelkezik hangsávval\n• Számos YouTube javítás és egyéb…\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/993.txt",
    "content": "Új\n• 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\n• Engedélyezve a hardvergombok figyelmen kívül hagyása\n• A hírfolyamban részben megtekintett videók elrejtésének engedélyezése\n\nFejlesztés\n• Több rácsoszlop használata a nagy képernyőkön\n• A folyamatjelzők összhangban állítása a beállításokkal\n\nJavítva\n• A böngésző nyitó URL-címeinek, letöltéseinek és külső lejátszóinak javítása Android 11+ rendszeren\n• A MIUI két érintést igénylő teljes képernyős kölcsönhatásának javítása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/994.txt",
    "content": "Új\n• Több hang/nyelv sáv támogatása\n• A hangerő és fényerő bármely képernyőszélen állítható\n• A fő fülek a képernyő alján is megjeleníthetőek\n\nFejlesztés\n• [Bandcamp] Paywall mögötti számok kezelése\n\nJavítások\n• [YouTube] 203 HTTP videó hiba javítása\n• Lejátszó befeketedésének javítása a lista nézetből váltáskor\n• Lejátszó szolgáltatás memória szivárgás\n• [PeerTube] Feltöltő és alcsatorna avatárok felcserélésre kerültek\n\nés sok más\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/995.txt",
    "content": "Új\n• Csatorna támogatói fülek\n• Kép minőség kiválasztása\n• URL minden képhez\n\nFejlesztések\n• Lejátszó felület könnyebb használhatósága\n• Jobb hang kiválasztás a kizárólag videós letöltésekhez\n• A lista megosztásnál feltüntethető maga a lista és a videók neve is\n\nJavítások\n• [YouTube] Tetszés szám kinyerésének javítása\n• A felugró üzenetek immáron nem fagyasztják ki a lejátszót\n• A nyelv kiválasztónál többféle nem megfelelő nyelv jelent meg korábban\n• A lejátszó nem reagált a némításra eddig\n• A lista elem hozzáadás nem mindig működött\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/996.txt",
    "content": "A media.ccc.de csatorna/konferencia megnyitásakor javításra került egy NullPointerException.\nA Grincs megpróbálta ellopni a karácsonyi ajándékunkat, de kicseleztük.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/997.txt",
    "content": "Új\n• Komment válaszok mutatása\n• Listák renderelésének engedélyezése\n• Listák leírásának és hosszának mutatása\n• Beállítások alaphelyzetbe állíthatóak\n\nFejlesztések\n• [Android 13+] Egyéni értesítési műveletek visszaállítása\n• Engedély szükséges a frissítés ellenőrzéshez\n• Bufferelés közben lehet az értesítésen folytatni/szüneteltetni\n• Egyes beállítások újrarendezése\n\nJavítások\n• [YouTube] Kommentek betöltésének javítása, valamint más egyéb fejlesztések\n• Javítva egy beállítás import sérülékenység, átváltás JSON-ra\n• Különböző letöltési javítások\n• Keresési szöveg levágása\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/998.txt",
    "content": "A YouTube videók HTTP 403-as hibára futásának javítása.\n\nA videó közben megjelenő 403-as hiba még nem került megoldásra.\nEz a hiba a következő patch-el kerül kijavításra amilyen hamar csak tudjuk.\n"
  },
  {
    "path": "fastlane/metadata/android/hu/changelogs/999.txt",
    "content": "Ez a gyorsjavítás javítja a 403-as YouTube videó közben fellépő hibát.\n\nÚj\n• [SoundCloud] Az on.soundcloud.com cím támogatása\n\nFejlesztés\n• [Bandcamp] A rádió fülke részen további infó jelenik meg\n\nJavítások\n• [YouTube] A videó elején s közepén fellépő HTTP 403-as hiba javítása\n• [YouTube] Az avatár és banner kinyerése több csatorna fejlécből\n• [Bandcamp] Különböző bugok javítása, és áttérés HTTPS-re\n"
  },
  {
    "path": "fastlane/metadata/android/hu/full_description.txt",
    "content": "A NewPipe nem használ semmilyen Google keretrendszer-programkönyvtárat, sem a YouTube API-t. Csupán a weboldalt dolgozza fel, hogy kinyerje a szükséges információkat. Így ez az alkalmazás a Google Szolgáltatások nélküli eszközökön is használható. Továbbá a NewPipe használatához nincs szükség YouTube-fiókra, emellett szabad és nyílt forráskódú szoftver (FLOSS).\n"
  },
  {
    "path": "fastlane/metadata/android/hu/short_description.txt",
    "content": "Egy ingyenes, könnyű YouTube felület Androidra.\n"
  },
  {
    "path": "fastlane/metadata/android/ia/short_description.txt",
    "content": "Reproductor de YouTube libere e legier pro Android.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/1000.txt",
    "content": "Peningkatan\n• Jadikan deskripsi daftar putar dapat diklik untuk menampilkan lebih banyak/sedikit konten\n• [PeerTube] Menangani tautan server `subscribeto.me` secara otomatis\n• Hanya mulai memutar satu item di layar riwayat\n\nTelah diperbaiki\n• Visibilitas tombol RSS\n• Kemogokan pratinjau seekbar\n• Daftar putar item tanpa gambar mini\n• Keluar dari dialog unduhan sebelum muncul\n• Popup antrean daftar item terkait\n• Urutan dalam dialog tambah ke daftar putar\n• Tata letak item penanda daftar putar\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/1001.txt",
    "content": "Ditingkatkan\n- Selalu izinkan mengubah preferensi pemberitahuan pemain di Android 13+\n\nDiperbaiki\n- Memperbaiki mengekspor database/langganan tidak akan memotong file yang sudah ada, yang mungkin menyebabkan ekspor rusak\n- Memperbaiki pemutar yang melanjutkan dari awal saat mengklik stempel waktu\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/1002.txt",
    "content": "Memperbaiki YouTube yang tidak memutar streaming apa pun\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/1003.txt",
    "content": "Memperbaiki YouTube yang tidak memutar streaming apa pun\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/1004.txt",
    "content": "Memperbaiki YouTube yang tidak memutar streaming apa pun\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/1005.txt",
    "content": "Baru\n• Dukungan untuk Android Auto\n• Grup umpan sebagai tab layar utama\n• [YouTube] Bagikan sebagai daftar putar sementara\n• [SoundCloud] Tab saluran suka\n\nDitingkatkan\n• Petunjuk bilah pencarian lebih baik\n• Tanggal unduhan di Unduhan\n• Bahasa per aplikasi Android 13\n\nDiperbaiki\n• Warna teks rusak di mode gelap\n• [YouTube] Daftar putar tidak lebih dari 100 item\n• [YouTube] Video rekomendasi hilang\n• Kerusakan di tampilan Riwayat\n• Cap waktu dalam balasan komentar\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/1007.txt",
    "content": "Memperbaiki YouTube yang tidak memutar streaming apa pun\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/63.txt",
    "content": "\"###Peningkatan\n- Pengaturan Impor/Ekspor #1333\n- Mengurangi Pengambaran berlebih (peningkatan performa) #1371\n- Perbaikan kecil dalam kode #1375\n- Penambahan semua tentang GDPR #1420\n\n###Diperbaiki\n- Downloader: perbaikan kegagalan ketika memuat unduhan yang belum selesai dari berkas dengan format .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/64.txt",
    "content": "\"### Peningkatan\n- Menambahkan kemampuan untuk membatasi kualitas video jika menggunakan data seluler. #1339\n- Ingat kecerahan untuk sesi yang sedang dipakai #1442 \n- Tingkatkan kinerja unduhan untuk CPU yang lebih lemah performanya #1431\n- Tambah dukungan (hidup) untuk sesi media #1433\n\n###Perbaikan\n- Memperbaiki crash ketika memulai unduhan (perbaikan sekarang tersedia untuk rilis build) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/65.txt",
    "content": "### peningkatan\n\n- Nonaktifkan Animasi Ikon burgermenu #1486\n- Kembali (undo) hapus unduhan #1472\n- Unduh Opsi di menu Bagikan #1498\n- Tambah Pilihan Bagikan ke menu ketuk panjang #1454\n- Minimalkan pemutar utama saat keluar #1354\n- Perpustakaan versi pembaruan dan basis data Backup Fix #1510\n- Pembaruan ExoPlayer 2.8.2 #1392\n(weblate notification : Translation text too long! (terjemahan terlalu panjang)\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/66.txt",
    "content": "# Catatan perubahan v0.13.7\n\n### Diperbaiki\n- Perbaiki masalah filter pengurutan v0.13.6\n\n# Changelog v0.13.6\n\n### Perbaikan\n\n- Nonaktifkan animasi ikon menu burger #1486\n- batalkan penghapusan unduhan #1472\n- Opsi unduh di menu berbagi #1498\n- Menambahkan opsi berbagi ke menu ketuk panjang #1454\n- Minimalkan pemutar utama saat keluar #1354\n- Pembaruan versi library dan perbaikan cadangan basis data #1510\n- Pembaruan ExoPlayer 2.8.2 #1392\n  - Mengolah ulang dialog kontrol kecepatan pemutaran untuk mendukung ukuran langkah yang berbeda untuk perubahan kecepatan yang lebih cepat.\n  - 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 =\\\\).\n  - 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.\n  - Memperbaiki metadata daftar putar jarak jauh yang tidak diperbarui ketika metadata baru tersedia ketika fragmen daftar putar dibuka.\n  - Berbagai perbaikan UI: #1383, kontrol notifikasi pemutar latar belakang kini selalu berwarna putih, lebih mudah untuk mematikan pemutar popup melalui lemparan\n- Gunakan ekstraktor baru dengan arsitektur yang difaktorkan ulang untuk multilayanan\n\n### Perbaikan\n\n- Perbaiki #1440 Tata Letak Info Video Rusak #1491\n- Lihat perbaikan riwayat #1497\n  - #1495, dengan memperbarui metadata (thumbnail, judul, dan jumlah video) segera setelah pengguna mengakses daftar putar.\n  - #1475, dengan mendaftarkan tampilan di database saat pengguna memulai video di pemutar eksternal pada fragmen detail.\n- Perbaiki batas waktu layar jika ada mode popup. #1463 (Diperbaiki #640)\n- Perbaikan pemutar video utama #1509\n  - [#1412] Memperbaiki mode pengulangan yang menyebabkan pemutar NPE ketika intent baru diterima saat aktivitas pemutar berada di latar belakang.\n  - Perbaiki meminimalkan pemutar ke popup tidak menghancurkan pemutar ketika izin popup tidak diberikan.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/68.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/69.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/70.txt",
    "content": "(weblate notification : Translation text too long! (terjemahan terlalu panjang)\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/71.txt",
    "content": "(weblate notification : Translation text too long! (terjemahan terlalu panjang)\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/730.txt",
    "content": "(weblate notification : Translation text too long! (terjemahan terlalu panjang)\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/740.txt",
    "content": "(weblate notification : Translation text too long! (terjemahan terlalu panjang)\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/750.txt",
    "content": "(weblate notification : Translation text too long! (terjemahan terlalu panjang)\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/760.txt",
    "content": "(weblate notification : Translation text too long! (terjemahan terlalu panjang)\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/770.txt",
    "content": "Perubahan di 0.17.2\n\nFix\n• Fix no video was available\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/780.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/790.txt",
    "content": "Peningkatan\n• Tambahan judul untuk akesesibilitas pada tuna aksara #2655\n• Bahasa pengaturan folder Unduhan lebih konsisten & kurang ambiguitas #2637\n\nPerbaikan\n• Periksa jika byte terakhir dalam blok telah terunduh #2646\n• #2672\n• Animasi clear box dual pencarian menjadi hanya satu #2695\n• [SoundCloud] Perbaikan ekstrak id_klien #2745\n\nPengembangan\n• Penambahan 'dependencies' dari NewPipeExtractor ke NewPipe #2535\n• Migrasi ke AndroidX #2685\n• Permbaharuan ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/800.txt",
    "content": "(weblate notification : Translation text too long! (terjemahan terlalu panjang)\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/810.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\ndan juga\n(weblate notification : Translation text too long! (terjemahan terlalu panjang)\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/820.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\ndan juga\n(weblate notification : Translation text too long! (terjemahan terlalu panjang)\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/830.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\ndan juga\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/840.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\ndan juga\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/850.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\ndan juga\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/860.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\ndan juga\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/870.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\ndan juga\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/900.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/910.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/920.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/930.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/940.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/950.txt",
    "content": "Rilis terbaru dengan perbaikan kecil:\n• Memperbaiki akses penyimpanan di Adroid 10+\n• Memperbaiki pembuka kiosks\n• Memperbaiki pemecah lama video\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/951.txt",
    "content": "Apa yang baru?\n• Menambahkan kolom pencarian untuk alat pilah langganan di feed diskusi\n• Menambahkan filter untuk menampilkan feed diskusi yang belum berlangganan\n• Menambahan tab daftar putar ke halaman utama\n• Kecepatan pemutaran / Pemutaran mundur\n• Menampilkan saran penelusuran: \"maksud Anda...\" & \"menampilkan hasil untuk ... \"\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/952.txt",
    "content": "Peningkatan\n• Pemutar otomatis tersedia untuk semua layanan (tidak hanya pada Youtube)\n\nPerbaikan\n• Memperbaiki siaran yang terkait dengan mendukung feature lanjutkan YouTube\n• Memperbaiki batasan usia video YouTube\n• [Android TV] Memperbaiki sisa overlay sorotan fokus\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/953.txt",
    "content": "Perbaikan pada ekstraksi pada fungsi dekripsi Youtube.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/954.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/955.txt",
    "content": "[YouTube] Perbaiki pencarian untuk beberapa pengguna\n[YouTube] Perbaiki pengecualian dekripsi acak\n[SoundCloud] URL yang berakhir dengan garis miring sekarang diuraikan dengan benar\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/956.txt",
    "content": "[Youtube] Diperbaiki crash ketika memuat video apapun\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/957.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/958.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/959.txt",
    "content": "Memperbaiki crash loop tanpa henti setelah membuka pelapor kesalahan\nMemperbarui daftar contoh PeerTube yang dapat dibuka secara otomatis oleh NewPipe\nTerjemahan diperbarui.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/960.txt",
    "content": "• Memperjelas deskripsi dari opsi ekspor database pada pengaturan.\n• Memperbaiki penguraian komentar YouTube.\n• Memperbaiki tampilan nama layanan media.ccc.de.\n• Memperbarui terjemahan.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/961.txt",
    "content": "•[YouTube] Dukungan Mix.\n•[YouTube] Menampilkan informasi public broadcasters dan COVID-19\n•[media.cc.de]Menambahkan recent videos\n•Menambahkan translasi Somali\n\n•Peningkatan internal lainnya\n\n•Memperbaiki berbagi video dari pemutar\n•Memperbaiki ReCaptcha webview yang kosong\n•Memperbaiki crash yang terjadi saat menghapus sebuah stream dari daftar\n•[PeerTube]Memperbaiki related streams\n•[YouTube]Memperbaiki pencarian YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/962.txt",
    "content": "Menambahkan \"recent\" video ke layanan media.cc.de.\nMenambahkan live streams ke layanan media.cc.de dan dukungan live stream.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/963.txt",
    "content": "• [YouTube] Diperbaiki lanjut putar kanal\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/964.txt",
    "content": "old version not being translated. (F-Droid only show updated verson description)\nversi lama tidak diterjemahkan. (FDroid hanya menampilkan deskripsi untuk versi terbaru)\n(weblate notification : Translation text too long! (terjemahan terlalu panjang).\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/965.txt",
    "content": "Memperbaiki kerusakan yang terjadi saat menata ulang grup saluran.\nMemperbaiki mendapatkan lebih banyak video YouTube dari saluran dan daftar putar.\nTetap mendapatkan komentar YouTube.\nMenambahkan dukungan untuk / menonton /, / v / dan / w / subpath di URL YouTube.\nEkstraksi tetap ID klien SoundCloud dan konten yang dibatasi geografis.\nMenambahkan lokalisasi Kurdi utara.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/966.txt",
    "content": "Baru:\n• Tambahkan layanan baru: Bandcamp\n\nDitingkatkan:\n• Tambahkan opsi mengikuti tema perangkat\n• Mencegah beberapa crash dengan panel kesalahan\n• Tampilkan informasi mengapa konten tidak tersedia\n• Tombol Memicu putar/jeda\n• Tampilkan kolom \"Unduh Dimulai\"\n\nDiperbaiki:\n• Perbaiki thumbnail saat bermain di latar belakang\n• Perbaiki judul kosong\n• Perbaiki mode ulang terakhir\n(weblate notification : Translation text too long! (terjemahan terlalu panjang)\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/967.txt",
    "content": "YouTube Tetap tidak berfungsi dengan baik di UE. Ini disebabkan oleh sebuah sistem cookie dan persetujuan privasi baru yang membutuhkan NewPipe untuk menetapkan cookie PERSETUJUAN.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/968.txt",
    "content": "Menambahkan opsi rincian channel ke menu tekan-lama.\nMenambahkan fungsionalitas untuk mengganti Nama Daftar Putar dari antarmuka daftar putar.\nMengizinkan pengguna berhenti sejenak saat video sedang buffer.\nPolesan tema putih.\nPerbaikan font tumpang tindih saat menggunakan ukuran font yang lebih besar.\nPerbaikan tidak ada video pada perangkat Formuler dan Zephier.\nPerbaikan berbagai crash.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/969.txt",
    "content": "• Izinkan instalasi pada penyimpanan eksternal\n• [Bandcamp] Penambahan dukungan untuk menampilkan tiga komentar pertama pada stream\n• Hanya Tampilkan toast 'Unduh telah dimulai' saat mengunduh dimulai\n• Jangan mengatur cookie reCaptcha ketika tidak ada cookie yang disimpan\n• [Pemutar] Peningkatan kinerja cache\n• [Pemutar] Tidak memutar secara otomatis\n• Abaikan Snackbars sebelumnya saat menghapus unduhan\n• Perbaikan mencoba menghapus objek tidak dalam daftar\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/970.txt",
    "content": "Baru\n• Menampilkan metadata konten (tag, kategori, lisensi, ...) dibawah deskripi\n• Penambahan opsi \"Tampilkan rincian channel\" dalam daftar putar non-lokal\n• Penambahan opsi \"Buka di peramban web\" ke menu tekan-lama\n\nDiperbaiki\n• Perbaikan crash rotasi di halaman rincian video\n• Perbaikan tombol \"Putar dengan Kodi\" di pemutar selalu meminta memasang Kore\n• Perbaikan dan peningkatan pengaturan path impor dan ekspor\n• [Youtube] Perbaikan perhitungan komentar suka\nDan banyak lagi\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/971.txt",
    "content": "Perbaikan\n• Menaikkan buffer untuk pemutar stlah buffer ulang\n• Diperbaiki crash pada tablet dan TVs saat klik ikon antrian pada pemutar\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/972.txt",
    "content": "Baru\nMengenali stempel waktu dan hashtag dalam deskripsi\nMenambahkan pengaturan mode tablet manual\nMenambahkan kemampuan untuk menyembunyikan item yang diputar di feed\n\nDitingkatkan\nMendukung Kerangka Akses Penyimpanan dengan benar\nPenanganan kesalahan yang lebih baik untuk saluran yang tidak tersedia dan dihentikan\nLembar berbagi Android untuk pengguna Android 10+ sekarang menampilkan judul konten.\nMemperbarui instance Invidious dan mendukung tautan Piped.\n\nDiperbaiki\n[YouTube] Konten yang dibatasi usia\nCegah Pengecualian jendela bocor saat membuka dialog pilihan\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/973.txt",
    "content": "Perbaikan terbaru\n- Memperbaiki thumbnail dan judul yang terpotong dalam tata letak grid, karena perhitungan yang salah tentang berapa banyak video yang dapat ditampung dalam satu baris\n- Memperbaiki dialog unduhan yang menghilang tanpa melakukan apa pun jika dibuka dari menu berbagi\n- Memperbarui pustaka yang terkait dengan membuka aktivitas eksternal seperti pemilih file Storage Access Framework\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/974.txt",
    "content": "Perbaikan terbaru\n• Memperbaiki masalah buffering yang disebabkan oleh pembatasan YouTube\n• Memperbaiki ekstraksi komentar YouTube dan kerusakan pada komentar yang dinonaktifkan\n• Perbaiki pencarian musik YouTube\n• Perbaiki streaming langsung PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/975.txt",
    "content": "Baru\n• Menampilkan Thumbnail ketika Mempercepat\n• Deteksi komentar yang dimatikan\n• Penandaan item feed sebagai ditonton\n• Menampilkan Komentar disukai\n\nPeningkatan\n• Pembaruan Layout metadata dan tag\n• Penerapan warna layanan pada komponen UI\n\nPerbaikan\n• Perbaiki thumbnail pada mini player\n• Perbaiki buffering tanpa akhir pada item antrian duplikat\n• Perbaikan Beberapa player rotasi layar dan penutupan yang lebih cepat\n• Perbaiki ReCaptcha tetap termuat di latar belakang\n• Matikan klik saat memuat feed\n• Perbaiki beberapa kerusakan pengunduh\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/976.txt",
    "content": "• Tambahkan opsi untuk langsung membuka pemutar dalam layar penuh\n• Izinkan memilih jenis saran pencarian yang akan ditampilkan\n• Tema gelap kini lebih gelap + layar splash gelap ditambahkan\n• Peningkatan pemilih file untuk menyembunyikan file yang tidak diinginkan\n• Memperbaiki impor langganan YouTube\n• Memutar ulang stream memerlukan ketukan pada tombol putar ulang lagi\n• Memperbaiki sesi audio penutup\n• [Android TV] Memperbaiki lompatan seekbar yang panjang saat menggunakan DPad\n\nUntuk melihat perubahan lebih lanjut, lihat log perubahan (dan postingan blog) dari tab Tautan di bawah.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/977.txt",
    "content": "• Menambahkan tombol \"mainkan berikutnya\" ke menu tekan lama\n• Menambahkan awalan jalur pendek YouTube ke filter maksud\n• Impor Pengaturan Tetap\n• Tukar posisi seekbar dengan tombol pemutar di layar Antrian\n• Berbagai perbaikan terkait MediasessionManager\n• Memperbaiki bilah pencari yang tidak selesai setelah video berakhir\n• Menonaktifkan terowongan media di RealtekATV\n• Memperluas area yang dapat diklik tombol pemutar yang diperkecil\n\nUntuk melihat perubahan lebih lanjut, lihat log perubahan (dan postingan blog) dari tab Tautan di bawah.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/978.txt",
    "content": "Memperbaiki pelaksanaan pemeriksaan untuk versi NewPipe baru. Pemeriksaan ini terkadang dilakukan terlalu dini sehingga menyebabkan aplikasi mogok. Itu harus diperbaiki sekarang.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/979.txt",
    "content": "- Memperbaiki melanjutkan pemutaran\n- Perbaikan untuk memastikan bahwa layanan yang menentukan apakah NewPipe harus memeriksa pemeriksaan versi baru tidak dimulai di latar belakang\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/980.txt",
    "content": "Baru\n• Menambahkan opsi \"Tambahkan ke playlist\" untuk berbagi menu\n• Menambahkan dukungan untuk tautan pendek y2u.be dan PeerTube\n\nDitingkatkan\n• Membuat Kontrol Kecepatan Pemutaran menjadi lebih ringkas\n• Feed menyoroti item baru sekarang\n• Opsi \"Tampilkan item yang ditonton\" di feed kini disimpan\n\nTetap\n• Memperbaiki ekstraksi suka dan tidak suka YouTube\n• Memperbaiki pemutaran ulang otomatis setelah kembali dari latar belakang\nDan banyak lagi\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/981.txt",
    "content": "Menghapus dukungan MediaParser untuk memperbaiki pemutaran yang gagal dilanjutkan setelah buffering di Android 11+.\nMenonaktifkan terowongan media pada Philips QM16XE untuk memperbaiki masalah pemutaran.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/982.txt",
    "content": "Memperbaiki YouTube yang tidak memutar streaming apa pun.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/983.txt",
    "content": "Tambahkan UI dan perilaku ketuk dua kali untuk mencari\nJadikan pengaturan dapat dicari\nSorot komentar yang disematkan seperti itu\nTambahkan dukungan terbuka dengan aplikasi untuk instance PeerTube FSFE\nTambahkan pemberitahuan kesalahan\nPerbaiki pemutaran ulang item antrian pertama saat pergantian pemain\nTunggu lebih lama saat melakukan buffering selama streaming langsung sebelum gagal\nPerbaiki urutan hasil pencarian lokal\nPerbaiki bidang item kosong di antrian putar\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/984.txt",
    "content": "Muat item awal secukupnya dalam daftar untuk memenuhi seluruh layar dan untuk memperbaiki pengguliran di tablet dan TV\nPerbaiki kerusakan acak saat menelusuri daftar\nMinta pemain untuk mencari overlay dengan cepat di bawah UI sistem\nMengembalikan perubahan pada potongan saat memutar di multi jendela, menyebabkan regresi pemutar salah tempat di beberapa ponsel\nTingkatkan kompilasiSdk dari 30 menjadi 31\nPerbarui pustaka pelaporan kesalahan\nRefactor beberapa kode di pemutar\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/985.txt",
    "content": "Memperbaiki YouTube yang tidak memutar streaming apa pun\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/986.txt",
    "content": "Baru\n• Notifikasi untuk stream baru\n• Transisi tanpa batas antara pemutar latar belakang & video\n• Ubah nada dgn semitone\n• Tambahkan antrean pemain utama ke daftar putar\n\nPerbaikan\n• Ingat ukuran langkah kecepatan/nada\n• Kurangi buffering panjang awal di pemutar video\n• Tingkatkan UI pemutar utk Android TV\n• Konfirmasi sblm menghapus semua file yang diunduh\n\nDiperbaiki\n• Tombol media agar tdk menyembunyikan kontrol pemain\n• Reset pemutaran pada perubahan tipe pemutar\n• Memutar dialog dftr putar\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/987.txt",
    "content": "Baru\n• Mendukung metode pengiriman selain HTTP progresif: waktu pemuatan pemutaran lebih cepat, perbaikan untuk PeerTube dan SoundCloud, pemutaran streaming langsung YouTube yang baru saja berakhir\n• Tombol Tambah untuk menambahkan playlist jarak jauh ke playlist lokal\n• Pratinjau gambar di lembar berbagi Android 10+\n\nDitingkatkan\n• Meningkatkan dialog parameter pemutaran\n• Pindahkan tombol ekspor-impor langganan ke menu tiga titik\n\nTetap\n• Perbaiki penghapusan video yang ditonton sepenuhnya dari daftar putar\n• Perbaiki tema menu berbagi dan entri \"tambahkan ke daftar putar\".\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/988.txt",
    "content": "[YouTube] Perbaiki kesalahan \"Tidak dapat memperoleh streaming apa pun\" saat mencoba memutar video apa pun\n[YouTube] Perbaiki \"Konten berikut tidak tersedia di aplikasi ini.\" pesan ditampilkan alih-alih video yang diminta\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/989.txt",
    "content": "• [YouTube] Perbaiki pemuatan tanpa batas saat mencoba memutar video apa pun\n• [YouTube] Memperbaiki pembatasan pada beberapa video\n• Tingkatkan perpustakaan jsoup ke 1.15.3, yang mencakup perbaikan keamanan\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/990.txt",
    "content": "Rilis ini menghilangkan dukungan untuk Android 4.4 KitKat, sekarang versi minimumnya adalah Android 5 Lollipop!\n\nBaru\n• Download dari menu tekan lama\n• Sembunyikan video mendatang di feed\n• Bagikan playlist lokal\n\nDitingkatkan\n• Memfaktorkan ulang kode pemutar menjadi komponen-komponen kecil: lebih sedikit RAM yang digunakan, lebih sedikit bug\n• Meningkatkan mode skala thumbnail\n• Placeholder gambar berukuran vektor\n\nTetap\n• Memperbaiki berbagai masalah dengan notifikasi pemutar: info media yang ketinggalan jaman, gambar mini yang terdistorsi\n• Perbaiki layar penuh menggunakan 1/4 layar\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/991.txt",
    "content": "Baru\n• Tambahkan tombol \"Buka di browser\" di panel kesalahan\n• Tambahkan opsi untuk menampilkan grup saluran sebagai daftar\n• [YouTube] Klik-lama pada segmen streaming untuk membagikan URL stempel waktu\n• Tambahkan tombol antrian putar ke pemutar mini\n\nDisempurnakan\n• Tambahkan lokalisasi Islandia dan perbarui banyak terjemahan lainnya\n• Banyak perbaikan internal\n\nDiperbaiki\n• Memperbaiki beberapa kerusakan\n• [YouTube] Memperbaiki pemuatan saluran, feed non-khusus, dan mengatasi masalah pemutaran di beberapa negara\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/992.txt",
    "content": "Baru\n- Jumlah pelanggan dalam detail video\n- Unduh dari antrean\n- Mengatur gambar mini daftar putar secara permanen\n- Tekan lama tagar dan tautan\n- Mode tampilan kartu\n\nLebih baik\n- Tombol tutup pemutar mini yang lebih besar\n- Pengecilan ukuran gambar mini yang lebih halus\n- Target Android 13 (API 33)\n- Mencari tidak lagi menjeda pemain\n\nDiperbaiki\n- Perbaiki overlay pada DeX/mouse\n- Izinkan pemutar latar belakang tanpa aliran audio terpisah\n- Berbagai perbaikan YouTube dan banyak lagi…\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/993.txt",
    "content": "Baru\n• Tambahkan peringatan saat menambahkan duplikat daftar putar dan tombol tambahkan untuk menghapusnya\n• Izinkan pengabaian tombol perangkat keras\n• Izinkan menyembunyikan video yang ditonton sebagian di feed\n\nDitingkatkan\n• Gunakan lebih banyak kolom grid di layar besar\n• Membuat indikator kemajuan konsisten dengan pengaturan\n\nTetap\n• Memperbaiki URL pembuka browser, unduhan, dan pemutar eksternal di Android 11+\n• Memperbaiki interaksi dengan layar penuh yang memerlukan dua ketukan pada MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/994.txt",
    "content": "Baru\n• Mendukung beberapa track audio/bahasa\n• Izinkan mengatur gestur volume dan kecerahan di sisi mana pun pada layar\n• Dukungan untuk menampilkan tab utama di bagian bawah layar\n\nDisempurnakan\n• [Bandcamp] Menangani track berbayar\n\nDiperbaiki\n• [YouTube] Kesalahan HTTP 403 untuk streaming\n• Pemutar berwarna hitam saat beralih ke pemutar utama dari tampilan daftar putar\n• Kebocoran memori layanan pemutar\n• [PeerTube] Avatar pengunggah dan subsaluran ditukar\n\ndan banyak lagi\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/995.txt",
    "content": "Baru\n• Mendukung tab saluran\n• Pilih kualitas gambar\n• Dapatkan URL ke semua gambar\n\nDitingkatkan\n• Aksesibilitas antarmuka pemutar\n• Pilihan audio yang lebih baik untuk unduhan video saja\n• Pilihan untuk memasukkan nama playlist dan video ke konten daftar putar bersama\n\nDiperbaiki\n• [YouTube] Perbaiki penghitungan jumlah suka\n• Perbaiki pemutar yang tidak merespons popup dan crash\n• Pemilihan bahasa yang salah di pemilih bahasa\n• Fokus audio pemutar tidak menerapkan mode senyap\n• Penambahan item daftar putar terkadang tidak berfungsi\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/996.txt",
    "content": "Perbaiki NullPointerException saat membuka saluran / konferensi di media.ccc.de.\nThe Grinch mencoba untuk merusak hadiah Natal kami ke anda, tapi kami memperbaikinya.\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/997.txt",
    "content": "Baru\n• Tambah balasan komentar\n• Izinkan susunan ulg playlist\n• Tampilkan deskripsi & durasi daftar putar\n• Izinkan setelan ulg\n• [Android 13+] Pulihkan tindakan notifikasi khusus\n• Minta persetujuan utk pemeriksaan update\n• Izinkan pemutaran notifikasi sementara buffering\n• Susun ulg bbrp setelan\n\nPerbaikan\n• [YouTube] Perbaiki komentar yg tdk dapat dimuat, ditambah perbaikan & peningkatan\n• Atasi kerentanan pengimporan pengaturan & ubah ke JSON\n• Perbaikan unduhan\n• Pangkas teks pencarian\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/998.txt",
    "content": "Memperbaiki YouTube yang tidak memutar streaming apa pun\n"
  },
  {
    "path": "fastlane/metadata/android/id/changelogs/999.txt",
    "content": "Memperbaiki YouTube yang tidak memutar streaming apa pun\n"
  },
  {
    "path": "fastlane/metadata/android/id/full_description.txt",
    "content": "NewPipe sama sekali tidak menggunakan pustaka kerangka kerja Google, atau layanan API YouTube. NewPipe hanya mengunakan informasi situs YouTube untuk mendapatkan informasi yang dibutuhkan. Oleh karena itu, NewPipe bisa digunakan pada perangkat tanpa Layanan Google. Anda juga tidak membutuhkan akun YouTube untuk menggunakan NewPipe, dan aplikasi ini sepenuhnya FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/id/short_description.txt",
    "content": "Sebuah klien YouTube gratis dan ringan untuk Android.\n"
  },
  {
    "path": "fastlane/metadata/android/is/changelogs/997.txt",
    "content": "Nýtt\n• Bætt við svörum í athugasemdum\n• Leyfð endurröðun spilunarlista\n• Birt lýsing og lengd spilunarlista\n• Leyfð frumstilling stillinga\n\nBætt\n• [Android 13+] Endurheimt aðgerða sérsniðinna tilkynninga\n• Beðið um samþykki við leit að uppfærslum\n• Leyfð afspilun/bið tilkynninga á meðan biðminni er fyllt\n• Endurröðun sumra stillinga\n\nLagfært\n• [YouTube] Lagaðir hnökrar við innhleðslu athugasemda, auk annarra endurbóta\n• Leystur öryggisgalli við innflutning stillinga og yfirfærsla í JSON\n• Ýmsar endurbætur við niðurhal\n• Afskurður óþarfa leitartexta\n"
  },
  {
    "path": "fastlane/metadata/android/is/full_description.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/is/short_description.txt",
    "content": "Frjáls og létt birtingarmynd YouTube fyrir Android.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/1000.txt",
    "content": "Miglioramenti\n• Rendi cliccabile la descrizione della playlist per mostrare più/meno contenuti\n• [PeerTube] Gestisci automaticamente i collegamenti alle istanze \"subscribeto.me\"\n• Inizia a riprodurre solo un singolo elemento nella schermata della cronologia\n\nRisolti\n• Fix visibilità pulsante RSS\n• Fix arresti anomali dell'anteprima della barra di ricerca\n• Fix mettere in playlist un elemento senza miniatura\n• Fix uscita finestra di dialogo di download prima che venga visualizzata\n• Fix popup di accodamento dell'elenco degli elementi correlati\n• Fix ordine nella finestra di dialogo Aggiungi alla playlist\n• Regola il layout degli elementi dei segnalibri della playlist\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/1001.txt",
    "content": "Migliorato\n• Consenti sempre di modificare le preferenze di notifica del lettore su Android 13+\n\nCorretto\n• Correzione del problema per cui l'esportazione di database/abbonamenti non troncava un file già esistente, causando un'esportazione corrotta\n• Correzione del problema per cui il lettore riprendeva dall'inizio quando si faceva clic su un timestamp\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/1002.txt",
    "content": "Risolto il problema per cui YouTube non riproduceva alcun flusso\n\nQuesta versione risolve solo l'errore più urgente che impedisce il caricamento dei dettagli dei video di YouTube.\nSiamo consapevoli che ci sono altri problemi e presto pubblicheremo una versione separata per risolverli.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/1003.txt",
    "content": "Questa versione corregge gli errori di YouTube:\n• [YouTube] Corretto il problema del mancato caricamento delle informazioni video, degli errori HTTP 403 durante la riproduzione dei video e ripristinata la riproduzione di alcuni video con limiti di età\n• Corrette le dimensioni delle didascalie che non vengono modificate\n• Corretto il download delle informazioni due volte durante l'apertura di un flusso\n• [Soundcloud] Rimossi i flussi protetti da DRM non riproducibili\n• Traduzioni aggiornate\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/1004.txt",
    "content": "Questa versione risolve il problema di YouTube che permette di riprodurre video solo a 360p.\n\nLa soluzione impiegata in questa versione è probabilmente temporanea, e a lungo termine c'è da implementare il protocollo video SABR, ma i membri del TeamNewPipe non hanno tempo al momento, quindi qualsiasi aiuto sarebbe molto apprezzato! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/1005.txt",
    "content": "Novità\n• Ora NewPipe funziona su Android Auto\n• Aggiungi feed di gruppi di canali nella schermata principale\n• [YouTube] Condividi come playlist temporanea\n• [SoundCloud] Mi piace nei canali\n\nMigliorie\n• Indizi nella barra di ricerca\n• Mostrata la data di scaricamento nella relativa sezione\n• Uso della possibilità di scegliere la lingua dell'app, funzione nativa di Android 13\n\nCorrezioni\n• Sistemati i colori del testo col tema scuro\n• [YouTube] Ora si caricano più di 100 video nelle playlist\n• [YouTube] Ripristinati i video consigliati\n• Sistemati i crash nella cronologia\n* Sistemato un errore nell'orario di inserimento di una risposta nei commenti\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/1006.txt",
    "content": "# Migliorie\nTieni il player attuale se si cliccano le marche temporali\nRecupera i download in sospeso se possibile\nOpzione per eliminare un download senza anche eliminare il file\nAutorizzazione di sovrapposizione: mostra finestra esplicativa per Android > R\nSupporto per link on.soundcloud\nTanti piccoli miglioramenti e ottimizzazioni\n\n# Correzioni\nFormattazione breve del conto per Android < 7\nNotifiche fantasma\nFile di sottotitoli SRT\nCrash vari\n\n# Sviluppo\nAmmodernamento del codice interno\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/1007.txt",
    "content": "Risolto l’errore \"Contenuto non disponibile\": i video YouTube ora funzionano di nuovo!\n\nRisolti vari bug introdotti nella 0.28.1:\n• Trascinamento elementi playlist limitato a posizioni adiacenti\n• Titoli/commenti si alternano tra video corrente e precedente\n• Opzione \"Avvia riproduzione a schermo intero\" non funzionante\n\nAltri miglioramenti:\n• [YouTube] Riavvolgimento dirette fino a 4 ore\n• Non caricare il video delle dirette riprodotte in background\n• Nuova UI per \"Rimuovi visti\""
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/63.txt",
    "content": "### Miglioramenti\n- Impostazioni di importazione / esportazione #1333\n- Ridotto l'overdraw (miglioramento delle prestazioni) #1371\n- Piccoli miglioramenti al codice #1375\n- Aggiunto tutto ciò che riguarda il GDPR #1420\n\n### Risolto\n- Downloader: risolto il crash durante il caricamento di download incompleti dai file .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/64.txt",
    "content": "### Miglioramenti\n- Aggiunta la possibilità di limitare la qualità del video se si utilizzano dati mobili. # 1339\n- Ricorda la luminosità per la sessione # 1442\n- Migliorate le prestazioni di download per le CPU più deboli # 1431\n- Aggiunto il supporto (funzionante) per la sessione multimediale # 1433\n\n### Correzioni\n- Risolto il crash all'apertura dei download (correzione ora disponibile per le build di rilascio) # 1441\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/65.txt",
    "content": "### Miglioramenti\n\n- Disattiva l'animazione dell'icona burgermenu #1486\n- annulla l'eliminazione dei download #1472\n- Opzione di download nel menu di condivisione #1498\n- Aggiunta l'opzione di condivisione al menu a lungo tap #1454\n- Riduci a icona il giocatore principale all'uscita #1354\n- Aggiornamento della versione della libreria e correzione del backup del database n. 1510\n- Aggiornamento ExoPlayer 2.8.2 n. 1392\n  - Rielaborata la finestra di dialogo di controllo della velocità di riproduzione per supportare diverse dimensioni del passo per un cambio di velocità più rapido.\n  - Aggiunto un interruttore per l'avanzamento rapido durante i silenzi nel controllo della velocità di riproduzione. Questo dovrebbe essere utile per gli audiolibri e alcuni generi musicali e può portare un'esperienza davvero senza interruzioni (e può interrompere una canzone con molti silenzi =\\\\).\n  - Rifattorizzazione della risoluzione della sorgente multimediale per consentire il passaggio di metadati insieme ai media all'interno del lettore, anziché farlo manualmente. Ora abbiamo un'unica fonte di metadati ed è direttamente disponibile all'avvio della riproduzione.\n  - Risolto il problema con i metadati della playlist remota che non si aggiornavano quando sono disponibili nuovi metadati quando viene aperto il frammento della playlist.\n  - Varie correzioni dell'interfaccia utente: n. 1383, controlli di notifica del giocatore in background ora sempre bianchi, più facile da spegnere il lettore popup tramite lancio\n- Usa il nuovo estrattore con architettura refactored per il multiservizio\n\n### Correzioni\n\n- Correzione n. 1440 Layout di informazioni video interrotto n. 1491\n- Visualizza la correzione della cronologia n. 1497\n  - #1495, aggiornando i metadati (miniatura, titolo e conteggio video) non appena l'utente accede alla playlist.\n  - #1475, registrando una vista nel database quando l'utente avvia un video su un lettore esterno su un frammento di dettaglio.\n- Risolto il timeout della schermata in caso di modalità popup. #1463 (Risolto #640)\n- Correzione del lettore video principale n. 1509\n  - [#1412] Risolto il problema con la modalità di ripetizione che causava NPE al giocatore quando veniva ricevuto un nuovo intento mentre l'attività del giocatore era in background.\n  - Risolto il problema con la riduzione a icona del giocatore in popup che non distruggeva il giocatore quando l'autorizzazione per il popup non è concessa.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/66.txt",
    "content": "# Registro delle modifiche della v0.13.7\n\n### Fisso\n- Risolti i problemi del filtro di ordinamento della v0.13.6\n\n# Registro delle modifiche della v0.13.6\n\n### Miglioramenti\n\n- Disattiva l'animazione dell'icona burgermenu #1486\n- annulla l'eliminazione dei download #1472\n- Opzione di download nel menu di condivisione #1498\n- Aggiunta l'opzione di condivisione al menu a lungo tap #1454\n- Riduci a icona il giocatore principale all'uscita #1354\n- Aggiornamento della versione della libreria e correzione del backup del database n. 1510\n- Aggiornamento ExoPlayer 2.8.2 n. 1392\n  - Rielaborata la finestra di dialogo di controllo della velocità di riproduzione per supportare diverse dimensioni del passo per un cambio di velocità più rapido.\n  - Aggiunto un interruttore per l'avanzamento rapido durante i silenzi nel controllo della velocità di riproduzione. Questo dovrebbe essere utile per gli audiolibri e alcuni generi musicali e può portare un'esperienza davvero senza interruzioni (e può interrompere una canzone con molti silenzi =\\\\).\n  - Rifattorizzazione della risoluzione della sorgente multimediale per consentire il passaggio di metadati insieme ai media all'interno del lettore, anziché farlo manualmente. Ora abbiamo un'unica fonte di metadati ed è direttamente disponibile all'avvio della riproduzione.\n  - Risolto il problema con i metadati della playlist remota che non si aggiornavano quando sono disponibili nuovi metadati quando viene aperto il frammento della playlist.\n  - Varie correzioni dell'interfaccia utente: n. 1383, controlli di notifica del giocatore in background ora sempre bianchi, più facile da spegnere il lettore popup tramite lancio\n- Usa il nuovo estrattore con architettura refactored per il multiservizio\n\n### Correzioni\n\n- Correzione n. 1440 Layout di informazioni video interrotto n. 1491\n- Visualizza la correzione della cronologia n. 1497\n  - #1495, aggiornando i metadati (miniatura, titolo e conteggio video) non appena l'utente accede alla playlist.\n  - #1475, registrando una vista nel database quando l'utente avvia un video su un lettore esterno su un frammento di dettaglio.\n- Risolto il timeout della schermata in caso di modalità popup. #1463 (Risolto #640)\n- Correzione del lettore video principale n. 1509\n  - [#1412] Risolto il problema con la modalità di ripetizione che causava NPE al giocatore quando veniva ricevuto un nuovo intento mentre l'attività del giocatore era in background.\n  - Risolto il problema con la riduzione a icona del giocatore in popup che non distruggeva il giocatore quando l'autorizzazione per il popup non è concessa.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/68.txt",
    "content": "# modifiche della v0.14.1\n\n### Fisso\n- Risolto il problema con la decrittografia dell'URL del video n. 1659\n- Corretto il collegamento alla descrizione che non estrae bene #1657\n\n# modifiche della v0.14.0\n\n### Nuovo\n- Nuovo design del cassetto #1461\n- Nuova prima pagina personalizzabile #1461\n\n### Miglioramenti\n- Controlli dei gesti rielaborati #1604\n- Nuovo modo per chiudere il popup player #1597\n\n### Fisso\n- Risolto l'errore quando il conteggio delle iscrizioni non è disponibile. Chiude #1649.\n  - Mostra \"Conteggio iscritti non disponibile\" in questi casi\n- Risolto NPE quando una playlist di YouTube è vuota\n- Soluzione rapida per i chioschi in SoundCloud\n- Refactor e correzione di bug #1623\n  - Risolto il risultato della ricerca ciclica n. 1562\n  - Risolto il problema con la barra di ricerca non disposta staticamente\n  - Risolto il problema con i video YT Premium non bloccati correttamente\n  - Risolto il problema con i video che a volte non venivano caricati (a causa dell'analisi DASH)\n  - Correggi i collegamenti nella descrizione del video\n  - Mostra avviso quando qualcuno tenta di scaricare su sdcard esterna\n  - non correggi il rapporto sui trigger di eccezione mostrati\n  - miniatura non mostrata nel lettore in background per Android 8.1 [vedi qui](https://github.com/TeamNewPipe/NewPipe/issues/943)\n- Risolto il problema con la registrazione del ricevitore di trasmissione. Chiude #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/69.txt",
    "content": "### Nuovo\n- Tocca a lungo elimina e condividi gli abbonamenti #1516\n- Interfaccia utente tablet e layout elenco griglia #1617\n\n### Miglioramenti\n- memorizza e ricarica l'ultima proporzione utilizzata #1748\n- Abilita il layout lineare nell'attività Download con i nomi video completi #1771\n- Elimina e condividi gli abbonamenti direttamente dalla scheda abbonamenti n. 1516\n- L'accodamento ora attiva la riproduzione del video se la coda di riproduzione è già terminata #1783\n- Impostazioni separate per i gesti di volume e luminosità #1644\n- Aggiungi il supporto per la localizzazione #1792\n\n### Correzioni\n- Risolto il problema con l'analisi del tempo per . formato, quindi NewPipe può essere utilizzato in Finlandia\n- Risolto il conteggio degli abbonamenti\n- Aggiungi l'autorizzazione al servizio in primo piano per i dispositivi API 28+ #1830\n\n### Bug noti\n- Lo stato di riproduzione non può essere salvato su Android P\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/70.txt",
    "content": "ATTENZIONE: Questa versione probabilmente è un bugfest, proprio come l'ultima. Tuttavia, a causa dell'arresto completo dalla 17. una versione non funzionante è meglio di nessuna versione. Destra? ¯\\_(ツ)_/¯\n\n### Miglioramenti\n* i file scaricati possono ora essere aperti con un clic #1879\n* drop supporto per Android 4.1 - 4.3 #1884\n* rimuovi il vecchio giocatore #1884\n* rimuovi gli stream dalla coda di riproduzione corrente facendoli scorrere verso destra #1915\n* rimuove il flusso in coda automaticamente quando un nuovo flusso viene accodato manualmente #1878\n* Post-elaborazione per i download e implementazione delle funzionalità mancanti #1759 di @kapodamy\n  * Infrastruttura di post-elaborazione\n  * Corretta gestione degli errori \"infrastruttura\" (per downloader)\n  * Coda invece di download multipli\n  * Sposta i download serializzati in sospeso (file `.giga`) nei dati dell'app\n  * Implementare il numero massimo di tentativi di download\n  * Sospensione corretta del download multi-thread\n  * Interrompi i download quando passi alla rete mobile (non funziona mai, vedi 2° punto)\n  * Salva il conteggio dei thread per i prossimi download\n  * Risolte molte incoerenze\n\n### Fisso\n* Risolto l'arresto anomalo con la risoluzione predefinita impostata sulla risoluzione dei dati mobili migliore e limitata #1835\n* arresto anomalo del lettore pop-up risolto #1874\n* NPE quando si tenta di aprire il giocatore in background #1901\n* Risolto il problema con l'inserimento di nuovi flussi quando l'accodamento automatico è abilitato #1878\n* Risolto il problema del decypering shuttown\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/71.txt",
    "content": "### Miglioramenti\n* Aggiungi la notifica di aggiornamento dell'app per la build di GitHub (#1608 di @krtkush)\n* Vari miglioramenti al downloader (#1944 di @kapodamy):\n  * aggiungi icone bianche mancanti e usa il modo hardcore per cambiare i colori delle icone\n  * controlla se l'iteratore è inizializzato (correzioni #2031)\n  * consente di riprovare i download con l'errore \"post-elaborazione non riuscita\" nel nuovo muxer\n  * nuovo muxer MPEG-4 che corregge flussi video e audio non sincroni (#2039)\n\n### Fisso\n* I live streaming di YouTube smettono di essere riprodotti dopo poco tempo (#1996 di @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/730.txt",
    "content": "# Risolto\n- Sistemato di nuovo un errore nella funzione di decifrazione.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/740.txt",
    "content": "<h4>Miglioramenti</h4>\n<ul>\n<li>rendi cliccabili i link nei commenti, aumenta la dimensione del testo</li>\n<li>cerca facendo clic sui collegamenti timestamp nei commenti</li>\n<li>mostra la scheda preferita in base allo stato selezionato di recente</li>\n<li>aggiungi playlist alla coda facendo clic a lungo su &#39;Sfondo&#39; nella finestra playlist</li>\n<li>cerca il testo condiviso quando non è un URL</li>\n<li>aggiungi il pulsante &quot;condividi all'ora corrente&quot; al video player principale</li>\n<li>aggiungi il pulsante di chiusura al lettore principale quando la coda video è terminata</li>\n<li>aggiungi &quot;Riproduci direttamente in background&quot; al menu a pressione lunga per gli elementi dell'elenco video</li>\n<li>migliora le traduzioni in inglese per i comandi di riproduzione/accodamento</li>\n<li>piccoli miglioramenti delle prestazioni</li>\n<li>rimuove i file inutilizzati</li>\n<li>aggiorna ExoPlayer a 2.9.6</li>\n<li>aggiungi supporto per collegamenti Invidious</li>\n</ul>\n<h4>Risolto</h4>\n<ul>\n<li>corretto lo scorrimento con commenti e relativi flussi disabilitati</li>\n<li>risolto il problema con CheckForNewAppVersionTask in esecuzione quando non avrebbe dovuto&#39;t</li>\n<li>corretta l'importazione dell'abbonamento YouTube: ignora quelli con URL non valido e mantieni quelli con titolo vuoto</li>\n<li>correggi l'URL YouTube non valido: il nome del tag della firma non è sempre \"firma\" che impedisce il caricamento degli stream</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/750.txt",
    "content": "Nuovo\nRiprendi la riproduzione #2288\n• Riprendi gli stream dal punto in cui ti sei fermato l'ultima volta\nMiglioramenti del downloader #2149\n• Utilizzare Storage Access Framework per archiviare i download su schede SD esterne\n• Nuovo mixer mp4\n• Modificare facoltativamente la directory di download prima di avviare un download\n• Rispettare le reti a consumo\n\n\nMigliorato\n• Rimosse le stringhe gema #2295\n• Gestire le modifiche alla rotazione (automatica) durante il ciclo di vita dell'attività #2444\n• Rendi coerenti i menu a lunga pressione #2368\n\nFisso\n• Risolto il problema con il nome della traccia dei sottotitoli selezionata che non veniva mostrato #2394\n• Non arrestarsi in modo anomalo quando il controllo dell'aggiornamento dell'app non riesce (versione GitHub) #2423\n• Risolti i download bloccati al 99,9% #2440\n• Aggiorna i metadati della coda di riproduzione #2453\n• [SoundCloud] Risolto crash durante il caricamento delle playlist TeamNewPipe/NewPipeExtractor#170\n• [YouTube] La durata fissa non può essere modificata TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/760.txt",
    "content": "Modifiche in 0.17.1\n\nNuovo\n• Localizzazione tailandese\n\n\nMigliorato\n• Aggiungi di nuovo l'azione inizia a giocare qui nei menu a lunga pressione per le playlist #2518\n• Aggiungi un'opzione per SAF/selettore file legacy #2521\n\nFisso\n• Risolto il problema con i pulsanti che scomparivano nella visualizzazione dei download quando si cambia app #2487\n• La posizione di riproduzione fissa viene memorizzata anche se la cronologia di visualizzazione è disabilitata\n• Risolto il problema con le prestazioni ridotte causate dalla posizione di riproduzione nelle visualizzazioni elenco #2517\n• [Estrattore] Correzione di ReCaptchaActivity n. 2527, TeamNewPipe/NewPipeExtractor n. 186\n• [Extractor] [YouTube] Risolto l'errore di ricerca casuale quando le playlist sono nei risultati TeamNewPipe/NewPipeExtractor#185\n\n\n\nModifiche in 0.17.0\n\nNuovo\nRiprendi la riproduzione #2288\n• Riprendi gli stream dal punto in cui ti sei fermato l'ultima volta\nMiglioramenti del downloader #2149\n• Utilizzare Storage Access Framework per archiviare i download su schede SD esterne\n• Nuovo mixer mp4\n• Modificare facoltativamente la directory di download prima di avviare un download\n• Rispettare le reti a consumo\n\n\nMigliorato\n• Rimosse le stringhe gema #2295\n• Gestire le modifiche alla rotazione (automatica) durante il ciclo di vita dell'attività #2444\n• Rendi coerenti i menu a lunga pressione #2368\n\nFisso\n• Risolto il problema con il nome della traccia dei sottotitoli selezionata che non veniva mostrato #2394\n• Non arrestarsi in modo anomalo quando il controllo dell'aggiornamento dell'app non riesce (versione GitHub) #2423\n• Risolti i download bloccati al 99,9% #2440\n• Aggiorna i metadati della coda di riproduzione #2453\n• [SoundCloud] Risolto crash durante il caricamento delle playlist TeamNewPipe/NewPipeExtractor#170\n• [YouTube] La durata fissa non può essere modificata TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/770.txt",
    "content": "Modifiche su 0.17.2\n\nCorrezioni\n• Risolto il problema con nessun video disponibile\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/780.txt",
    "content": "Modifiche in 0.17.3\n\nMigliorato\n• Aggiunta l'opzione per cancellare gli stati di riproduzione #2550\n• Mostra le directory nascoste nel selettore di file #2591\n• Supporta gli URL delle istanze `invidio.us` da aprire con NewPipe #2488\n• Aggiunta del supporto per gli URL di `music.youtube.com` TeamNewPipe/NewPipeExtractor#194\n\nFisso\n• [YouTube] Risolto 'java.lang.IllegalArgumentException #192\n• [YouTube] Risolto il problema con i live streaming che non funzionavano TeamNewPipe/NewPipeExtractor#195\n• Risolto problema di prestazioni in Android Pie durante il download di uno stream #2592\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/790.txt",
    "content": "Migliorato\n• Aggiungi più titoli per migliorare l'accessibilità per i non vedenti #2655\n• Rendi la lingua dell'impostazione della cartella di download più coerente e meno ambigua #2637\n\nFisso\n• Verificare se l'ultimo byte nel blocco è stato scaricato #2646\n• Corretto lo scorrimento nel frammento di dettaglio video #2672\n• Rimuovere le animazioni della casella di cancellazione della doppia ricerca in un #2695\n• [SoundCloud] Correzione dell'estrazione client_id #2745\n\nSviluppo\n• Aggiungere le dipendenze mancanti ereditate da NewPipeExtractor in NewPipe #2535\n• Migra ad AndroidX #2685\n• Aggiorna a ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/800.txt",
    "content": "Nuovo\n• Supporto PeerTube senza P2P (#2201) [Beta]:\n  ◦ Guarda e scarica video da istanze PeerTube\n  ◦ Aggiungi istanze nelle impostazioni per accedere al mondo PeerTube completo\n  ◦ Potrebbero esserci problemi con gli handshake SSL su Android 4.4 e 7.1 quando si accede a determinate istanze con conseguente errore di rete.\n\n• Downloader (#2679):\n  ◦ Calcola l'ETA di download\n  ◦ Scarica opus (file webm) come ogg\n  ◦ Recupera i link di download scaduti per riprendere i download dopo una lunga pausa\n\nMigliorato\n• Rendi il KioskFragment consapevole delle modifiche nel Paese dei contenuti preferito e migliora le prestazioni di tutte le schede principali #2742\n• Utilizzare le nuove implementazioni di localizzazione e downloader dall'estrattore #2713\n• Rendi traducibile la stringa \"Chiosco predefinito\".\n• Barra di navigazione nera per il tema nero #2569\n\nFisso\n• Risolto un bug che non poteva spostare il popup player se veniva posizionato un altro dito mentre si spostava il popup player #2772\n• Consenti alle playlist manca un caricatore e correggi gli arresti anomali relativi a questo problema #2724, TeamNewPipe/NewPipeExtractor#219\n• Abilitazione di TLS1.1/1.2 su dispositivi Android 4.4 (API 19/KitKat) per correggere l'handshake TLS con MediaCCC e alcune istanze PeerTube #2792\n• [SoundCloud] Risolto il problema con l'estrazione di client_id TeamNewPipe/NewPipeExtractor#217\n• [SoundCloud] Correzione dell'estrazione del flusso audio\n\nSviluppo\n• Aggiorna ExoPlayer a 2.10.8 #2791, #2816\n• Aggiorna Gradle a 3.5.1 e aggiungi il supporto Kotlin #2714\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/810.txt",
    "content": "Nuovo\n• Mostra la miniatura del video sulla schermata di blocco durante la riproduzione in background\n\nMigliorato\n• Aggiungi playlist locale alla coda premendo a lungo sul pulsante in background/popup\n• Rendere scorrevoli le schede della pagina principale e nasconderle quando è presente una sola scheda\n• Limita la quantità di aggiornamenti delle miniature delle notifiche nel lettore in background\n• Aggiungi miniature fittizie per playlist locali vuote\n• Usa l'estensione del file *.opus invece di *.webm e mostra \"opus\" nell'etichetta del formato invece di \"WebM Opus\" nel menu a discesa del download\n• Pulsante Aggiungi per eliminare i file scaricati o la cronologia dei download in \"Download\"\n• [YouTube] Aggiungi supporto ai link del canale /c/shortened_url\n\nFisso\n• Risolti diversi problemi durante la condivisione di un video su NewPipe e il download diretto dei suoi flussi\n• Risolto il problema con l'accesso del giocatore dal suo thread di creazione\n• Corretto il paging dei risultati di ricerca\n• [YouTube] Risolto il problema con l'attivazione di NPE che causava NPE\n• [YouTube] Risolto il problema con la visualizzazione dei commenti all'apertura di un URL invidio.us\n• [SoundCloud] Client_id aggiornato\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/820.txt",
    "content": "Risolto il problema con l'espressione regolare del nome della funzione di decrittografia che rendeva YouTube inutilizzabile.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/830.txt",
    "content": "Aggiornato SoundCloud client_id per risolvere i problemi di SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/840.txt",
    "content": "Nuovo\n• Aggiunto selettore della lingua per cambiare la lingua dell'app\n• Aggiunto il pulsante Invia a Kodi al menu pieghevole del giocatore\n• Aggiunta la possibilità di copiare i commenti premendo a lungo\n\nMigliorato\n• Correggi l'attività di ReCaptcha e salva correttamente i cookie ottenuti\n• Rimosso il menu a punti a favore del cassetto e nascondi il pulsante della cronologia quando la cronologia delle visualizzazioni non è abilitata nelle impostazioni\n• Richiedi l'autorizzazione per la visualizzazione su altre app nelle impostazioni correttamente su Android 6 e versioni successive\n• Rinominare la playlist locale facendo clic a lungo in BookmarkFragment\n• Vari miglioramenti a PeerTube\n• Migliorate diverse stringhe di origine in inglese\n\nFisso\n• Risolto il problema con il riavvio del lettore anche se è stato messo in pausa quando l'opzione \"riduci a icona al passaggio dell'app\" è abilitata e NewPipe è ridotto a icona\n• Correzione del valore di luminosità iniziale per i gesti\n• Risolti i download di sottotitoli .srt contenenti non tutte le interruzioni di riga\n• Risolto il problema con il download su scheda SD non riuscito perché alcuni dispositivi Android 5 non sono compatibili con CTF\n• Risolto il problema con il download su Android KitKat\n• Risolto il problema con il file video .mp4 danneggiato riconosciuto come file audio\n• Risolti più problemi di localizzazione, inclusi codici di lingua cinese errati\n• [YouTube] I timestamp nella descrizione sono nuovamente selezionabili\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/850.txt",
    "content": "In questa versione è stata aggiornata la versione del sito web di YouTube. La vecchia versione del sito web verrà interrotta a Marzo e quindi è necessario aggiornare NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/860.txt",
    "content": "Migliorato\n• Salvare e ripristinare se intonazione e tempo sono sganciati o meno\n• Supporta il ritaglio del display nel lettore\n• Visualizzazione rotonda e numero di iscritti\n• YouTube ottimizzato per utilizzare meno dati\n\nIn questa versione sono stati corretti più di 15 errori relativi a YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/870.txt",
    "content": "Questa è una versione hotfix che aggiorna NewPipe per consentire nuovamente l'utilizzo di SoundCloud senza grossi problemi.\nL'API v2 di SoundCloud viene ora utilizzata nell'estrattore e il rilevamento di ID client non validi è stato migliorato.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/900.txt",
    "content": "Nuovo\n• Gruppi di abbonamento e feed ordinati\n• Pulsante muto nei giocatori\n\nMigliorato\n• Consenti l'apertura di collegamenti music.youtube.com e media.ccc.de in NewPipe\n• Riposizionare due impostazioni da Aspetto a Contenuto\n• Nascondi le opzioni di ricerca di 5, 15, 25 secondi se è abilitata la ricerca inesatta\n\nFisso\n• alcuni video WebM non sono ricercabili\n• backup del database su Android P\n• crash durante la condivisione di un file scaricato\n• tonnellate di problemi di estrazione di YouTube e altro ...\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/910.txt",
    "content": "Corretta la migrazione del database che in alcuni rari casi impediva l'avvio di NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/920.txt",
    "content": "Migliorato\n\n• Aggiunta la data di caricamento e il conteggio delle visualizzazioni sugli elementi della griglia di flusso\n• Miglioramenti al layout dell'intestazione del cassetto\n\nFisso\n\n• Risolto il problema con il pulsante muto che causava arresti anomali su API 19\n• Risolto il problema con il download di video lunghi 1080p 60fps\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/930.txt",
    "content": "Nuovo\n• Cerca su YouTube Music\n• Supporto Android TV di base\n\nMigliorato\n• Aggiunta la possibilità di rimuovere tutti i video guardati da una playlist locale\n• Mostra il messaggio quando il contenuto non è ancora supportato invece di andare in crash\n• Migliorato il ridimensionamento del lettore popup con i gesti di pizzico\n• Accodare gli stream premendo a lungo sullo sfondo e sui pulsanti popup nel canale\n• Gestione delle dimensioni migliorata del titolo dell'intestazione del cassetto\n\nFisso\n• Risolto il problema con l'impostazione del contenuto con limiti di età non funzionante\n• Risolti alcuni tipi di reCAPTCHA\n• Risolto crash durante l'apertura dei segnalibri mentre la playlist è `null`\n• Risolto il problema con il rilevamento delle eccezioni relative alla rete\n• Corretta la visibilità del pulsante di ordinamento dei gruppi nel frammento delle iscrizioni\n\ne altro ancora\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/940.txt",
    "content": "Nuovo\n• Supporto commenti SoundCloud\n• \"Mod. con Restrizioni\" di YouTube\n• Mostra dettagli canale genitore PeerTube\n\nMigliorato\n• Mostra pulsante Kore solo per dispositivi supportati\n• Gesti bloccati quando si tocca la Barra di Navigazione o la Barra di Stato\n• Cambiato colresfondo pulsanti \"Riptova\" e \"Iscriviti\" in base al servizio\n\nAggiustato\n• Congelamento fin. dialogo download\n• Pulsante \"Apri nel Browser\" funziona correttamente\n• Crash ed errori all'apertura di alcuni video\n\naltro\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/950.txt",
    "content": "Aggiustato\n• Accesso archiviazione su Adroid 10+\n• Apertura kiosk\n• Analisi durata per video lunghi\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/951.txt",
    "content": "Nuovo\n• Aggiungi la ricerca per la selezione delle iscrizioni nella finestra di dialogo del gruppo di feed\n• Aggiungi un filtro alla finestra di dialogo del gruppo di feed per mostrare solo le iscrizioni non raggruppate\n• Aggiungi la scheda playlist alla pagina principale\n• Avanti/indietro veloce nella coda del lettore in background/pop-up\n• Mostra suggerimento di ricerca: intendevi e mostra il risultato per\n\nMigliorato\n• Eliminare la scrittura dei metadati dell'applicazione in file confusi\n• Non rimuovere i flussi non riusciti dalla coda\n• Aggiorna il colore della barra di stato in modo che corrisponda al colore della barra degli strumenti\n\nFisso\n• Risolto il problema con la desincronizzazione audio/video causata da errori cumulativi in virgola mobile\n• [PeerTube] Gestisce i commenti eliminati\n\ne altro ancora\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/952.txt",
    "content": "Migliorato\n• Riproduzione automatica disponibile per tutte le piattaforme (invece che solo per YouTube)\n\nAggiustato\n• Contenuti consigliati per supportare le continuazioni di YouTube\n• Restrizioni d'età per i video di YouTube\n• [Android TV] Focus prolungato overlay\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/953.txt",
    "content": "Corretta l'estrazione della funzione di decifrazione di YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/954.txt",
    "content": "• Nuovo funzionamento dell'app: riproduci i video coi dettagli e trascina verso il basso per minimizzare\n• Notifiche MediaStyle: bottoni personalizzabili e prestazioni migliori\n• NewPipe può ora essere ridimensionata se usata su desktop\n\n• Finestra con opzioni di condivisione per URL non supportati\n• Esperienza di ricerca più fluida in caso di problemi di connessione\n• Qualità predefinita aumentata a 720p60 (player integrato) e 480p (pop-up)\n\n• Svariate correzioni di bug e altro\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/955.txt",
    "content": "[YouTube] Aggiustata la ricerca per alcuni utenti\n[YouTube] Aggiustate eccezioni casuali di decodifica\n[SoundCloud] Gli URL che finiscono con uno slash sono analizzati correttamente\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/956.txt",
    "content": "[YouTube] Risolto un arresto anomalo durante il caricamento di qualsiasi video\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/957.txt",
    "content": "• Unificare le azioni di accodamento specifiche in una\n• Gesto con due dita per chiudere il lettore\n• Consenti cancellazione dei cookie reCAPTCHA\n• Opzione per non colorare la notifica\n• Migliora il modo in cui i dettagli del video vengono aperti per correggere il buffering infinito, il comportamento buggy durante la condivisione su NewPipe e altre incoerenze\n• Velocizza i video di YouTube e correggi quelli soggetti a limiti di età\n• Risolto crash durante l'avanzamento/riavvolgimento veloce\n• Non riordinare gli elenchi trascinando le miniature\n• Ricorda sempre le proprietà dei popup\n• Aggiungi la lingua Santali\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/958.txt",
    "content": "Novità e Miglioramenti:\n• Ripristinata opzione per nascondere la copertina nella notifica e sul blocco schermo\n• Trascina verso il basso per aggiornare i feed\n• Prestazioni migliorate nelle liste locali\n\nCorrezioni:\n• Crash all'avvio e dopo che NewPipr è stato rimosso dalla RAM\n• Crash all'avvio quando manca la connessione internet\n• Gesto per luminosità e volume\n• [YouTube] Sistemate le playlist lunghe\n\nAltro:\n• Pulizia e miglioramenti del codice\n• Dipendenze aggiornate\n• Traduzioni aggiornate\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/959.txt",
    "content": "• Sistemato un loop infinito di crash dopo l'apertura della pagina di segnalazione degli errori.\n• Aggiornata la lista di istanze di PeerTube che possono essere aperte in automatico da parte di NewPipe.\n• Le traduzioni sono state aggiornate.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/960.txt",
    "content": "• Migliorata la descrizione dell'opzione per l'esportazione del database nelle impostazioni.\n• Sistemato il parsing dei commenti per YouTube.\n• Sistemato il nome mostrato per il servizio media.ccc.de.\n• Traduzioni aggiornate.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/961.txt",
    "content": "- [YouTube] Supporto mix\n- [YouTube] Visualizza le informazioni sulle emittenti pubbliche e su Covid-19\n- [media.ccc.de] Aggiunti video recenti\n- Aggiunta traduzione in somalo\n\n- Molti miglioramenti interni\n\n- Condivisione fissa dei video dall'interno del lettore\n- Vuoto fisso ReCaptcha webview\n- Crash fisso che si è verificato durante la rimozione di un flusso da una lista\n- [PeerTube] Flussi fissi correlati\n- [YouTube] Ricerca fissa di musica su YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/962.txt",
    "content": "Aggiunto video \"recenti\" al servizio media.ccc.de.\nAggiunto live stream al servizio media.ccc.de e anche supporto live stream.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/963.txt",
    "content": "• [YouTube] Corretta continuazione del canale\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/964.txt",
    "content": "• I capitoli sono ora supportati nei controlli del riproduttore video\n• [PeerTube] Aggiunta la ricerca Sepia\n• Riaggiunto il bottone di condivisione e migliorate le schede nella pagina dei dettagli del video\n• Non ripristinare la luminosità se il gesto è disabilitato\n• Aggiunta un'azione rapida per riprodurre su kodi\n• Miglioramenti e sistemazione di bug per i menu di condivisione\n• Con il video è a schermo intero, metti in pausa o riproduci premendo spazio\n• [media.ccc.de] Miglioramenti vari\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/965.txt",
    "content": "Risolto crash che si verificava durante il riordino dei gruppi di canali.\nRisolto il problema con la ricezione di più video di YouTube da canali e playlist.\nRisolto il problema con la ricezione di commenti su YouTube.\nAggiunto supporto per i sottopercorsi /watch/, /v/ e /w/ negli URL di YouTube.\nRisolto il problema con l'estrazione dell'ID client SoundCloud e del contenuto con restrizioni geografiche.\nAggiunta la localizzazione del curdo settentrionale.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/966.txt",
    "content": "Nuovo:\n• Aggiungi un nuovo servizio: Bandcamp\n\nMigliorato:\n• Aggiungi un'opzione per fare in modo che l'app segua il tema del dispositivo\n• Prevenire alcuni arresti anomali mostrando un pannello di errore migliorato\n• Mostra ulteriori informazioni sul motivo per cui il contenuto non è disponibile\n• Il pulsante dello spazio hardware attiva la riproduzione/pausa\n• Mostra il brindisi \"Download iniziato\".\n\nFisso:\n• Correzione di miniature molto piccole nei dettagli del video durante la riproduzione in background\n• Risolto il problema con il titolo vuoto nel lettore ridotto a icona\n• Risolto il problema con l'ultima modalità di ridimensionamento che non veniva ripristinata correttamente\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/967.txt",
    "content": "Risolto il problema con YouTube che non funzionava correttamente nell'UE. Ciò è stato causato da un nuovo sistema di cookie e consenso alla privacy che richiede a NewPipe di impostare un cookie di CONSENSO.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/968.txt",
    "content": "Aggiunta l'opzione dei dettagli del canale al menu a pressione prolungata.\nAggiunta la funzionalità per rinominare il nome della playlist dall'interfaccia della playlist.\nConsenti all'utente di mettere in pausa durante il buffering di un video.\nLucidato il tema bianco.\nCorretti i caratteri sovrapposti quando si utilizza una dimensione del carattere più grande.\nRisolto nessun video sui dispositivi Formuler e Zephier.\nRisolti vari arresti anomali.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/969.txt",
    "content": "• Consenti installazione su memoria esterna\n• [Bandcamp] Aggiunto supporto per la visualizzazione dei primi tre commenti su uno stream\n• Mostra l'avviso \"download iniziato\" solo all'avvio del download\n• Non impostare il cookie reCaptcha quando non ci sono cookie memorizzati\n• [Player] Migliora le prestazioni della cache\n• [Giocatore] Risolto il problema con il giocatore che non giocava automaticamente\n• Ignora le precedenti Snackbar quando si eliminano i download\n• Risolto il problema con il tentativo di eliminare l'oggetto non nell'elenco\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/970.txt",
    "content": "Nuovo\n• Mostra i metadati del contenuto (tag, categorie, licenza, ...) sotto la descrizione\n• Aggiunta l'opzione \"Mostra dettagli canale\" nelle playlist remote (non locali).\n• Aggiunta l'opzione \"Apri nel browser\" al menu a pressione prolungata\n\nFisso\n• Risolto crash di rotazione nella pagina dei dettagli del video\n• Risolto il problema con il pulsante \"Gioca con Kodi\" nel lettore che richiedeva sempre di installare Kore\n• Correzione e miglioramento dell'impostazione dei percorsi di importazione ed esportazione\n• [YouTube] Risolto commento come il conteggio\nE altro ancora\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/971.txt",
    "content": "Correzione rapida\n• Aumenta il buffer per la riproduzione dopo il rebuffer\n• Risolto crash su tablet e TV quando si fa clic sull'icona della coda di riproduzione nel lettore\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/972.txt",
    "content": "Nuovo\nRiconosci timestamp e hashtag nella descrizione\nAggiunta l'impostazione manuale della modalità tablet\nAggiunta la possibilità di nascondere gli elementi riprodotti in un feed\n\nMigliorato\nSupporta correttamente lo Storage Access Framework\nMigliore gestione degli errori dei canali non disponibili e terminati\nIl foglio di condivisione Android per gli utenti Android 10+ ora mostra il titolo del contenuto.\nAggiornate le istanze Invidious e supportano i collegamenti Piped.\n\nFisso\n[YouTube] Contenuti soggetti a limiti di età\nPrevenire la finestra trapelata Eccezione all'apertura della finestra di dialogo di scelta\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/973.txt",
    "content": "Correzione rapida\n• Risolto il problema con le miniature e i titoli tagliati nel layout della griglia, a causa di un calcolo errato di quanti video possono stare in una riga\n• Risolto il problema con la finestra di dialogo di download che scompariva senza fare nulla se aperta dal menu di condivisione\n• Aggiornare una libreria relativa all'apertura di attività esterne come il selettore di file di Storage Access Framework\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/974.txt",
    "content": "Correzione rapida\n• Risolvi i problemi di buffering causati dalla limitazione di YouTube\n• Risolto il problema con l'estrazione dei commenti di YouTube e gli arresti anomali con i commenti disabilitati\n• Correggi la ricerca di musica su YouTube\n• Correggi i live streaming di PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/975.txt",
    "content": "Nuovo\n• Mostra un'anteprima in miniatura durante la ricerca\n• Rileva commenti disabilitati\n• Consenti di contrassegnare un elemento del feed come guardato\n• Mostra cuori di commento\n\nMigliorato\n• Migliora il layout dei metadati e dei tag\n• Applicare il colore del servizio ai componenti dell'interfaccia utente\n\nFisso\n• Risolto il problema con la miniatura nel mini player\n• Risolto il problema del buffering infinito sugli elementi della coda duplicati\n• Alcuni giocatori correzioni come rotazione e chiusura più veloce\n• Risolto il problema con ReCAPTCHA che rimaneva caricato in background\n• Disattiva i clic durante l'aggiornamento del feed\n• Risolti alcuni arresti anomali del downloader\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/976.txt",
    "content": "• Aggiunta l'opzione per aprire direttamente il giocatore a schermo intero\n• Consenti di scegliere quali tipi di suggerimenti di ricerca mostrare\n• Tema scuro ora più scuro + aggiunta schermata iniziale scura\n• Selettore file migliorato per eliminare i file indesiderati\n• Risolto il problema con l'importazione degli abbonamenti YouTube\n• La riproduzione di uno streaming richiede di toccare nuovamente il pulsante di riproduzione\n• Risolto il problema con la chiusura della sessione audio\n• [Android TV] Risolti i salti lunghi della barra di ricerca quando si utilizza un DPad\n\nPer vedere ulteriori modifiche, visualizza il registro delle modifiche (e il post del blog) dalla scheda Collegamenti in basso.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/977.txt",
    "content": "• Aggiunto un pulsante \"play next\" al menu a pressione prolungata\n• Aggiunto il prefisso del percorso dei cortometraggi di YouTube al filtro dell'intento\n• Importazione impostazioni fisse\n• Scambia la posizione della barra di ricerca con i pulsanti del giocatore nella schermata della coda\n• Varie correzioni relative a MediasessionManager\n• Risolto il problema con la barra di ricerca non completata dopo la fine del video\n• Tunneling multimediale disabilitato su RealtekATV\n• Area cliccabile dei pulsanti del giocatore ridotta a icona espansa\n\nPer vedere ulteriori modifiche, visualizza il registro delle modifiche (e il post del blog) dalla scheda Collegamenti in basso.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/978.txt",
    "content": "Risolto il problema con l'esecuzione del controllo per una nuova versione di NewPipe. Questo controllo è stato eseguito troppo presto a volte e quindi ha portato a un arresto anomalo dell'app. Dovrebbe essere risolto ora.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/979.txt",
    "content": "- Risolto il problema con la ripresa della riproduzione\n- Miglioramenti per garantire che il servizio che determina se NewPipe deve verificare la presenza di una nuova versione controlli non sia avviato in background\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/980.txt",
    "content": "Nuovo\n• Aggiunta l'opzione \"Aggiungi alla playlist\" per condividere il menu\n• Aggiunto supporto per collegamenti brevi y2u.be e PeerTube\n\nMigliorato\n• Resi più compatti i controlli della velocità di riproduzione\n• Feed mette in evidenza nuovi elementi ora\n• L'opzione \"Mostra elementi osservati\" nel feed è ora salvata\n\nFisso\n• Risolto il problema con l'estrazione di Mi piace e Non mi piace di YouTube\n• Risolto il problema con la riproduzione automatica dopo il ritorno dallo sfondo\nE altro ancora\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/981.txt",
    "content": "Rimosso il supporto MediaParser per correggere la mancata ripresa della riproduzione dopo il buffering su Android 11+.\nTunneling multimediale disabilitato su Philips QM16XE per risolvere i problemi di riproduzione.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/982.txt",
    "content": "Risolto il problema con YouTube che non riproduceva alcun flusso.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/983.txt",
    "content": "Aggiungi nuova interfaccia utente e comportamento del doppio tocco per cercare\nRendi le impostazioni ricercabili\nEvidenzia i commenti bloccati in quanto tali\nAggiungi il supporto open-with-app per l'istanza PeerTube di FSFE\nAggiungi notifiche di errore\nRisolto il problema con la riproduzione del primo elemento della coda al cambio del giocatore\nAttendi più tempo durante il buffering durante i live streaming prima di fallire\nCorreggi l'ordine dei risultati della ricerca locale\nCorreggi i campi degli oggetti vuoti nella coda di gioco\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/984.txt",
    "content": "Ora nelle liste vengono caricati abbastanza elementi per riempire l'intero schermo, evitando caricamenti infiniti su tablet e TV\nSistemati crash a caso nello scorrere le liste\nL'arco dell'avanzamento rapido ora va anche sotto l'interfaccia di sistema\nAnnullati i cambiamenti alla gestione dei bordi dello schermo in modalità multi-finestra: il player era talvolta fuori posto\nIncrementato compileSdk da 30 a 31\nAggiornata la libreria di segnalazione degli errori\nRistrutturato del codice nel player\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/985.txt",
    "content": "Corretto problema di riproduzione di YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/986.txt",
    "content": "Nuovo\n• Notifiche per nuovi flussi\n• Passaggio senza interruzioni tra i lettori video e in background\n• Modificare l'intonazione per semitoni\n• Aggiungi la coda del giocatore principale a una playlist\n\nMigliorato\n• Ricorda la dimensione del passo di velocità/passo\n• Mitiga il lungo buffering iniziale nel video player\n• Migliora l'interfaccia utente del lettore per Android TV\n• Conferma prima di eliminare tutti i file scaricati\n\nFisso\n• Risolto il problema con il pulsante multimediale che non nascondeva i controlli del lettore\n• Correzione del ripristino della riproduzione al cambio del tipo di lettore\n• Risolto il problema con la rotazione della finestra di dialogo della playlist\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/987.txt",
    "content": "Novità\n• Supporto per protocolli diversi da progressive HTTP: caricamenti più rapidi; sistemati PeerTube, SoundCloud e livestream di YouTube appena finiti\n• Aggiunta di playlist remote a una locale\n• Immagini nel menu di condivisione Android 10+\n\nMiglioramenti\n• Schermata proprietà di riproduzione migliorata\n• Spostato \"importa/esporta iscrizioni\" al menu a tre puntini\n\nCorrezioni\n• Corretta la rimozione di video guardati da playlist\n• Sistemati colori e aggiunta a playlist nel menu condivisione\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/988.txt",
    "content": "[YouTube] Corretto l'errore \"Impossibile ottenere alcun flusso\" quando si tenta di riprodurre qualsiasi video\n[YouTube] Corretto il messaggio \"Il contenuto seguente non è disponibile su questa applicazione.\" mostrato al posto del video richiesto\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/989.txt",
    "content": "• [YouTube] Corretto il caricamento infinito quando si tenta di riprodurre qualsiasi video\n• [YouTube] Corretto il throttling di alcuni video\n• Aggiornata la libreria jsoup a 1.15.3, che include una correzione di sicurezza\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/990.txt",
    "content": "Da questa versione la versione minima è Android 5 Lollipop!\n\nNovità\n• Download dal menu a pressione prolungata\n• Nascondi i video futuri tra le iscrizioni\n• Condivisione di playlist locali\n\nMiglioramenti\n• Rifattorizzazione del codice del player in piccoli componenti\n• Miglioramento della modalità di scala delle miniature\n• Vettorializzazione dei segnaposto delle immagini\n\nCorrezioni\n• Corretti vari problemi con la notifica del player\n• Corretto il fullscreen che utilizza 1/4 dello schermo\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/991.txt",
    "content": "Nuovo\n• Aggiungi il pulsante \"Apri nel browser\" nel pannello degli errori\n• Aggiunta opzione per visualizzare i gruppi di canali come elenco\n• [YouTube] Fare clic a lungo sui segmenti di streaming per condividere l'URL del timestamp\n• Aggiungi il pulsante della coda di riproduzione al mini player\n\nMigliorato\n• Aggiunta della localizzazione islandese e aggiornamento di molte altre traduzioni\n• Molti miglioramenti interni\n\nFisso\n• Correggere più arresti anomali\n• [YouTube] Risolti i problemi di caricamento dei canali, feed non dedicati e soluzioni alternative di riproduzione in alcuni paesi\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/992.txt",
    "content": "Nuovo\n• Numero di iscritti nei dettagli del video\n• Scarica dalla coda\n• Impostare in modo permanente una miniatura della playlist\n• Premi a lungo hashtag e link\n• Modalità di visualizzazione scheda\n\nMigliorato\n• Pulsante di chiusura mini-player più grande\n• Downscaling delle miniature più agevole\n• Target Android 13 (API 33)\n• La ricerca non mette più in pausa il lettore\n\nCorretto\n• Corretto l'overlay su DeX/mouse\n• Consenti lettore in background senza flussi audio separati\n• Varie correzioni di YouTube e altro…\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/993.txt",
    "content": "Nuovo\n• Aggiunto avviso di aggiunta playlist doppia e un pulsante per rimuoverla\n• Ignora pulsanti hardware\n• Nascondi video visti parzialmente\n\nMigliorato\n• Usa più colonne nella griglia su schermi grandi\n• Indicatori di avanzamento consistenti con le impostazioni\n\nCorretto\n• Fix apertura URL, download e player esterni su Android 11+\n• Fix interazione con schermo intero che richiedeva due otcchi su MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/994.txt",
    "content": "Novità\n• Supporto di più tracce audio/lingue\n• Consenti gesti di volume e luminosità su qualsiasi lato dello schermo\n• Supporto per mostrare le schede principali in basso allo schermo\n\nMigliorato\n• [Bandcamp] Gestisci le tracce dietro paywall\n\nCorretto\n• [YouTube] Errori HTTP 403 per i video\n• Player nero quando si passa al player principale dalla scheda playlist\n• Perdita di memoria del servizio del player\n• [PeerTube] Gli avatar dell'uploader e del sottocanale erano scambiati\n\ne altro ancora\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/995.txt",
    "content": "Novità\n• Supporto a schede dei canali\n• Selezione qualità dell'immagine\n• Ottieni URL per tutte le immagini\n\nMigliorato\n• Accessibilità delle interfacce del player\n• Miglior scelta dell'audio per i download video-only\n• Condivisione playlist con più opzioni\n\nCorretto\n• [YouTube] Sistemati i mi piace\n• Talvolta il player non rispondeva o crashava\n• Selezione di lingue errate nel selettore\n• Il focus audio del player non rispettava il muto\n• Talvolta aggiungere elementi a playlist non funzionava\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/996.txt",
    "content": "Corretto un NullPointerException quando si apre un canale / conferenza in media.ccc.de.\nIl Grinch ha cercato di rompere il nostro regalo di Natale per te, ma l'abbiamo risolto.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/997.txt",
    "content": "Novità\n• Risposte ai commenti\n• Riordinamento playlist\n• Mostra descrizione e durata playlist\n• Consenti ripristino impostazioni\n\nMigliorie\n• [Android 13+] Ripristina azioni di notifica personalizzate\n• Richiedi consenso per ricerca aggiornamenti\n• Notifiche avvio/pausa durante il buffer\n• Riordinate alcune impostazioni\n\nCorrezioni\n• [YouTube] I commenti non si caricavano, altre correzioni\n• Vulnerabilità in importa impostazioni e passaggio a JSON\n• Correzioni sui download\n• Trim delle ricerche\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/998.txt",
    "content": "Corretto problema di riproduzione di YouTube causato da errori HTTP 403.\n\nGli errori HTTP 403 saltuari nel mezzo di un video di YouTube non sono ancora stati sistemati.\nQuesto problema sarà affrontato in un altra release hotfix non appena possibile.\n"
  },
  {
    "path": "fastlane/metadata/android/it/changelogs/999.txt",
    "content": "Questo aggiornamento hotfix risolve gli errori HTTP 403 nel mezzo dei video di YouTube.\n\nNovità\n• [SoundCloud] Aggiunto il supporto per gli URL on.soundcloud.com\n\nMigliorie\n• [Bandcamp] Mostra informazioni aggiuntive nel chiosco della radio\n\nCorrezioni\n• [YouTube] Corretti errori HTTP 403 occasionali all'inizio o nel mezzo dei video\n• [YouTube] Estrazione avatar e banner da più tipi di canali\n• [Bandcamp] Risolti vari bug e forzato l'uso di HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/it/full_description.txt",
    "content": "NewPipe non usa né le librerie di Google, né l'API di YouTube, ma analizza il sito web per estrarne le informazioni di cui ha bisogno. Quindi l'app può essere usata senza un account YouTube e su dispositivi senza Google Play Services. Inoltre, NewPipe è libera ed open source.\n"
  },
  {
    "path": "fastlane/metadata/android/it/short_description.txt",
    "content": "Un frontend YouTube leggero e libero per Android.\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/1000.txt",
    "content": "改善点\n• プレイリストの説明をクリック可能にして、内容の表示/非表示を切り替えられるようにしました。\n• [PeerTube] `subscribeto.me` インスタンスのリンクを自動的に処理します。\n• 履歴画面で単一のアイテムのみを再生するようにしました。\n\n修正点\n• RSSボタンの表示を修正しました。\n• シークバーのプレビューによるクラッシュを修正しました。\n• サムネイルなしのアイテムをプレイリストに追加する際の問題を修正しました。\n• ダウンロードダイアログが表示される前に終了する問題を修正しました。\n• 関連アイテムリストのキューイングポップアップを修正しました。\n• プレイリスト追加ダイアログの順序を修正しました。\n• プレイリストブックマークアイテムのレイアウトを調整しました。\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/1001.txt",
    "content": "改善策\n・Android 13以降ではプレーヤーの通知設定の変更を常に許可してください\n\n修正済\n・データベース/登録チャンネルのエクスポートで既存のファイルが切り捨てられず、エクスポートが破損する可能性がある問題を修正\n・タイムスタンプをクリックするとプレーヤーが最初から再開される問題を修正\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/1002.txt",
    "content": "YouTubeでストリームが再生されない問題を修正しました。\n\nこのリリースでは、YouTubeの動画の詳細が読み込まれないという最も深刻なエラーのみを修正しています。\n他にも問題があることを認識しており、近日中に別のリリースで解決する予定です。\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/63.txt",
    "content": "###改善点\n- 書き出し/読み込みの設定 #1333\n- オーバードローの削減 （パフォーマンスの向上） #1371\n- 小さなコードの改善 #1375\n- GDPR#1420に関する全てを追加\n\n###修正済み\n- ダウンローダー: .giga ファイルから未完了のダウンロードをロードする際のクラッシュを修正 #1407\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/64.txt",
    "content": "###改善点\n- モバイルデータを使用する場合にビデオ品質を制限する機能を追加しました。#1339\n- セッションの明るさを記憶する #1442\n- 弱いCPUでのダウンロード性能を向上 #1431\n- メディアセッション#1433の （動作する）サポートを追加しました。\n\n###修正\n- ダウンロードをする際のクラッシュを修正（修正はリリースビルドで利用可能な修正） #1441\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/952.txt",
    "content": "改善\n• 全てのサービスで自動再生が利用可能\n\n修正\n• Fixed related streams by supporting YouTube's new continuations\n• 年齢制限のあるYouTube動画を修正\n• [Android TV] Fixed lingering focus highlight overlay\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/953.txt",
    "content": "YouTubeの復号化機能の展開を修正。\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/954.txt",
    "content": "・新しいアプリケーションの利用体系: 詳細ページで動画を再生し、下にスワイプしてプレイヤーを最小化する\n・MediaStyle 通知: 通知のカスタマイズ可能なアクション、パフォーマンスの向上\n・デスクトップアプリのような NewPipe 使用中のリサイズ\n\n・サポートしていない URL のとき他のアプリで開くオプションを表示する\n・取得できなかった場合の検索サジェストのユーザー体験の向上\n・デフォルト動画解像度の引き上げ 720p60 (アプリ内プレイヤー) と 480p (ポップアッププレイヤー)\n\n・たくさんのバグ修正など\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/955.txt",
    "content": "[YouTube] いくつかのユーザー向けに検索を修正\n[YouTube] ランダムな復号化の例外を修正\n[SoundCloud] スラッシュで終わるURLが正しく解析されるようになりました\n"
  },
  {
    "path": "fastlane/metadata/android/ja/changelogs/960.txt",
    "content": "• 設定でデータベースエクスポート選択の説明を改善。\n• YouTube コメントの解析を修正。\n• media.ccc.de サービスの表示名を修正。\n• 翻訳の更新。\n"
  },
  {
    "path": "fastlane/metadata/android/ja/full_description.txt",
    "content": "NewPipe は Google のフレームワークライブラリや YouTube API を使用しておらず、必要な情報を得るために Web サイトを解析するのみです。そのためこのアプリは Google Services がインストールされてない端末でも使用することができます。また、NewPipe を使用するために YouTube アカウントを必要としません。そしてオープンソースソフトウェアです。\n"
  },
  {
    "path": "fastlane/metadata/android/ja/short_description.txt",
    "content": "Androidの無料で軽量なYouTubeアプリ。\n"
  },
  {
    "path": "fastlane/metadata/android/jv/changelogs/820.txt",
    "content": "Ndandani dekripsi fungsi jeneng regex sing ndadekake YouTube ora bisa digunakake.\n"
  },
  {
    "path": "fastlane/metadata/android/jv/changelogs/830.txt",
    "content": "Ngupdate SoundCloud client_id kanggo ndandani permasalahan SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/jv/changelogs/850.txt",
    "content": "Ing rilis iki situs Youtube wes di anyarke. Situs modhel lawas bakal dimandhegake ing Maret lan Sampeyan kudu nganyari NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/jv/changelogs/860.txt",
    "content": "Ditingkatake\n*Nyimpen lan mulihke lamun pitch lan tempo nyangkut utawa ora\n*Dhukungan tampilan cutout ing pamuter\n*Tampilan bunder lan pencacah pelanggan\n*Ngoptimakle Youtube supaya nggunakake data kang luwih sithik\n\nLuwih seka 15 bug kaitane karo Youtube sik wes dibenakke ing rilis iki.\n"
  },
  {
    "path": "fastlane/metadata/android/jv/full_description.txt",
    "content": "NewPipe ora migunakake pustaka kerangka kerja Google, utawa API Youtube. NewPipe namung migunakake informasi situs kanggo njupuk informasi kang dibutuhake. Mula iku, NewPipe isa digunakke ing piranti tanpa Layanan Google. Sampeyan uga ora mbutuhake akun Youtube kanggo migunakake NewPipe, lan aplikasi iki FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/jv/short_description.txt",
    "content": "Tampilan ngarep gratis Youtube ingkang enteng kanggo Android\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/1000.txt",
    "content": "გაუმჯობესებულია\n• დასაკრავი სიის აღწერა დაწკაპუნებით გახდა შესაძლებელი მეტი/ნაკლები კონტენტის საჩვენებლად\n• [PeerTube] `subscribeto.me` ეგზემპლარის ბმულების ავტომატურად დამუშავება\n• ისტორიის ეკრანზე მხოლოდ ერთი ერთეულის დაკვრა იწყება\nგამოსწორებულია\n• RSS ღილაკის ხილვადობის გამოსწორება\n• ძიების ზოლის გადახედვის შეცდომის გამოსწორება\n• გამოსწორდა დასაკრავი სიის მინიატურების გარეშე ელემენტის პრობლემა\n• გამოსწორდა ჩამოტვირთვის დიალოგური ფანჯრის გამოჩენამდე გამორთვის პრობლემა\n• დაკავშირებული ერთეულების სიის რიგში ჩასმის ამომხტარი ფანჯარა გამოსწორდა\n• დასაკრავ სიაში დამატების დიალოგში თანმიმდევრობა გამოსწორდა\n• დასაკრავი სიის სანიშნეების ელემენტის განლაგების კორექტირება\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/1001.txt",
    "content": "გაუმჯობესებულია\n• Android 13+-ზე მოთამაშის შეტყობინებების პარამეტრების შეცვლის ყოველთვის დაშვება\nგამოსწორებულია\n• გამოსწორდა მონაცემთა ბაზის/გამოწერების ექსპორტირებისას არსებული ფაილის შეკვეცა, რამაც შესაძლოა ექსპორტის დაზიანება გამოიწვიოს.\n• დროის ნიშნულზე  გამოსწორდა დაწკაპუნებისას მოთამაშის თავიდან განახლება\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/1002.txt",
    "content": "გამოსწორდა YouTube-ის არცერთი სტრიმინგის ჩატვირთვის პრობლემა.\n\nეს ვერსია მხოლოდ ყველაზე აქტუალურ შეცდომას აგვარებს, რომელიც YouTube ვიდეოს დეტალების ჩატვირთვას ხელს უშლიდა.\nჩვენ ვიცით, რომ არსებობს სხვა პრობლემებიც და მალე გამოვაქვეყნებთ ცალკე ვერსიას მათ გადასაჭრელად.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/1003.txt",
    "content": "ეს არის ცხელი შესწორების ვერსია, რომელიც ასწორებს YouTube-ის შეცდომებს:\n• [YouTube] გამოსწორდა ვიდეოს ინფორმაციის ჩატვირთვის შეუძლებლობა, გამოსწორდა HTTP 403 შეცდომები ვიდეოების დაკვრის დროს და აღდგა ასაკობრივი შეზღუდვის მქონე ზოგიერთი ვიდეოს დაკვრა\n• გამოსწორდა სუბტიტრების ზომის შეუცვლელობა\n• გამოსწორდა ინფორმაციის ორჯერ ჩამოტვირთვის პრობლემა ნაკადის გახსნისას\n• [Soundcloud] წაიშალა დაუკრავი DRM-ით დაცული ნაკადები\n• განახლდა თარგმანები\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/1004.txt",
    "content": "ეს ვერსია ასწორებს YouTube-ი  აჩვებებს მხოლოდ 360p სტრიმინგის პრობლემას.\n\nგაითვალისწინეთ, რომ ამ ვერსიაში გამოყენებული გადაწყვეტა, სავარაუდოდ, დროებითია და გრძელვადიან პერსპექტივაში SABR ვიდეო პროტოკოლის დანერგვაა საჭირო, თუმცა TeamNewPipe-ის წევრები ამჟამად დაკავებულები არიან, ამიტომ ნებისმიერი დახმარება დიდად დასაფასებელი იქნება! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/1005.txt",
    "content": "ახალი\n• დაემატა Android Auto-ს მხარდაჭერა\n• არხების ჯგუფების მთავარი ეკრანის ჩანართებად დაყენების დაშვება\n• [YouTube] გაზიარება, როგორც დროებითი დასაკრავი სია\n• [SoundCloud] მოწონებების არხის ჩანართი\n\nგაუმჯობესებულია\n• უკეთესი მინიშნებები ძიების ზოლში\n• ჩამოტვირთვის თარიღის ჩვენება ჩამოტვირთვებში\n• Android 13-ის თითოეული აპლიკაციის ენის გამოყენება\n\n.გამოსწორებულია\n• გამოსწორდა ტექსტის ფერების დარღვევა ბნელ რეჟიმში\n• [YouTube] გამოსწორდა დასაკრავი სიების 100-ზე მეტი ერთეულს არ აჩვენებს\n• [YouTube] გამოსწორდა დაკარგული რეკომენდებული ვიდეოები\n• გამოსწორდა ისტორიის სიის ხედში ავარიები\n• გამოსწორდა დროის ნიშნულები კომენტარების პასუხებში\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/1006.txt",
    "content": "# გაუმჯობესებული\n\nდროის ნიშნულებზე დაწკაპუნებისას მიმდინარე დამკვრელის შენარჩუნება\n\nშესაძლებლობის შემთხვევაში, შეეცადეთ აღადგინოთ ჩამოტვირთვის მომლოდინე მისიები\n\nდაემატა ჩამოტვირთვის წაშლის ვარიანტი ფაილის წაშლის გარეშე\n\nგადაფარვის ნებართვა: Android > R-ისთვის განმარტებითი დიალოგის ჩვენება\n\nმხარდაჭერა on.soundcloud ბმულის გახსნისთვის\n\nბევრი მცირე გაუმჯობესება და ოპტიმიზაცია\n\n# გამოსწორებულია\n\n გასწორდა მოკლე რაოდენობის ფორმატირება  Android-ის 7-ზე დაბალი ვერსიებისთვის\n\n გასწორდა მოჩვენებითი შეტყობინებებები\n\n გასწორდა SRT სუბტიტრების ფაილები\n\nგამოსწორებულია უამრავი ავარია\n\n# განვითარება\n\nშიდა კოდის მოდერნიზაცია\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/1007.txt",
    "content": "გაასწორა YouTube არ უკრავს არცერთ ნაკადს\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/1008.txt",
    "content": "∙ ბოლო დაკვრის პოზიციაზე სტრიმინგის განახლების პრობლემა გამოსწორდა\n\n∙ [YouTube] დაემატა მეტი არხის URL ფორმატების მხარდაჭერა\n\n∙ [YouTube] დაემატა მეტი ვიდეო მეტაინფო ფორმატების მხარდაჭერა\n\n∙ განახლდა თარგმანები\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/63.txt",
    "content": "### გაუმჯობესებები\n- იმპორტის/ექსპორტის პარამეტრები #1333\n- ზედმეტად დიდი მოცულობის შეცდომის შემცირება (შესრულების გაუმჯობესება) #1371\n- კოდის მცირე გაუმჯობესებები #1375\n- GDPR-ის შესახებ ყველაფრის დამატება #1420\n### გამოსწორებულია\n- ჩამომტვირთავი: გამოასწორეთ შეცდომის პრობლემა .giga ფაილებიდან დაუმთავრებელი ჩამოტვირთვების ჩატვირთვისას#1407\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/64.txt",
    "content": "### გაუმჯობესებები\n - დაემატა ვიდეოს ხარისხის შეზღუდვის შესაძლებლობა მობილური ინტერნეტის გამოყენებისას. #1339\n - დაიმახსოვრე სიკაშკაშე #1442 სესიისთვის\n - გააუმჯობესეთ ჩამოტვირთვის შესრულება სუსტი CPU-ებისთვის #1431\n - დაამატეთ (სამუშაო) მხარდაჭერა მედია სესიისთვის #1433\n\n ### გამოსწორება\n - დააფიქსირეთ ავარია ჩამოტვირთვების გახსნისას (გამოსწორება უკვე ხელმისაწვდომია გამოშვების ბილდებისთვის) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/65.txt",
    "content": "### გაუმჯობესებები\n- ბურგერის მენიუს ხატულას ანიმაციის გამორთვა #1486\n- ჩამოტვირთვების წაშლის გაუქმების ღილაკი #1472\n- ჩამოტვირთვის ღილაკი გაზიარების მენიუში #1498\n- ხანგრძლივი შეხების მენიუში #1454 დაემატა გაზიარების ღილაკი\n- მთავარი პლეერის მინიმიზაცია გასვლისას #1354\n- ბიბლიოთეკის ვერსიის განახლება და მონაცემთა ბაზის სარეზერვო ასლის შესწორება #1510\n- ExoPlayer 2.8.2 განახლება #1392\n- გადამუშავდა დაკვრის სიჩქარის კონტროლის დიალოგი, რათა მხარდაჭერილიყო სხვადასხვა ნაბიჯების ზომები სიჩქარის უფრო სწრაფი ცვლილებისთვის.\n- დაკვრის სიჩქარის კონტროლში დაემატა გადამრთველი სიჩუმის დროს წინ გადასართავად. ეს უნდა იყოს სასარგებლო აუდიოწიგნებისა და გარკვეული მუსიკალური ჟანრებისთვის და შეიძლება უზრუნველყოს ჭეშმარიტად შეუფერხებელი გამოცდილება (და შეიძლება დაარღვიოს სიმღერა, რომელსაც ბევრი სიჩუმე აქვს =\\\\).\n- გადაკეთდა მედია წყაროს გარჩევადობა, რათა მეტამონაცემების გადაცემა მედიასთან ერთად პლეერში შიდა რეჟიმში მოხდეს, ხელით გაკეთების ნაცვლად. ახლა ჩვენ გვაქვს მეტამონაცემების ერთი წყარო და ის პირდაპირ ხელმისაწვდომია დაკვრის დაწყებისას.\n - გამოსწორდა დისტანციური დასაკრავი სიის მეტამონაცემების განახლება, როდესაც ახალი მეტამონაცემები ხელმისაწვდომია დასაკრავი სიის ფრაგმენტის გახსნისას.\n- სხვადასხვა ინტერფეისის გამოსწორება: #1383, ფონური პლეერის შეტყობინებების კონტროლი ახლა ყოველთვის თეთრია, უფრო ადვილია ამომხტარი პლეერის გამორთვა გადახვევით.\n- გამოიყენეთ ახალი ექსტრაქტორი განახლებული არქიტექტურით მრავალსერვისისთვის.\n### გამოსწორებები\n- გამოსწორდა #1440 ვიდეო ინფორმაციის გაფუჭებული განლაგება #1491\n- გამოსწორდა ნახვის ისტორია#1497\n- #1495, მეტამონაცემების (მინიატურების, სათაურის და ვიდეოების რაოდენობის) განახლებით, როგორც კი მომხმარებელი წვდება დასაკრავ სიას.\n- #1475, ხედვის რეგისტრაციით მონაცემთა ბაზაში, როდესაც მომხმარებელი იწყებს ვიდეოს გარე პლეერზე დეტალების ფრაგმენტზე.\n- გამოსწორდა ეკრანის დროის ამოწურვა ამომხტარი რეჟიმის შემთხვევაში. #1463 (გამოსწორდა #640)\n- მთავარი ვიდეო პლეერის გამოსწორება #1509\n- [#1412] გამოსწორდა გამეორების რეჟიმი, რომელიც იწვევდა პლეერის NPE-ს, როდესაც ახალი განზრახვა მიიღება, როდესაც მოთამაშის აქტივობა ფონურ რეჟიმშია.\n - გამოსწორდა მოთამაშის ამომხტარ ფანჯარაში მინიმიზაციის შეცდომა, როდესაც ამომხტარ ფანჯარაში ნებართვა არ არის მინიჭებული.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/66.txt",
    "content": "v0.13.7-ის ცვლილების ჟურნალი\n\n ### გამოსწორდა\n - დააფიქსირეთ v0.13.6-ის დახარისხების ფილტრის პრობლემები\n\n # ცვლილების ჟურნალი v0.13.6\n\n ### გაუმჯობესებები\n\n - გამორთეთ ბურგერმენუს ხატის ანიმაცია #1486\n - ჩამოტვირთვების წაშლის გაუქმება #1472\n - ჩამოტვირთვის ვარიანტი გაზიარების მენიუში #1498\n - დამატებულია გაზიარების ვარიანტი გრძელი შეხების მენიუში #1454\n - მთავარი მოთამაშის მინიმიზაცია #1354 გასასვლელზე\n - ბიბლიოთეკის ვერსიის განახლება და მონაცემთა ბაზის სარეზერვო დაფიქსირება #1510\n - ExoPlayer 2.8.2 განახლება #1392\n   - გადამუშავდა დაკვრის სიჩქარის კონტროლის დიალოგი, რათა მხარი დაუჭიროს სხვადასხვა ნაბიჯების ზომას უფრო სწრაფი სიჩქარის ცვლილებისთვის.\n   - დამატებულია გადართვა სწრაფი წინსვლისთვის დუმილის დროს დაკვრის სიჩქარის კონტროლში.  ეს გამოსადეგი უნდა იყოს აუდიო წიგნებისთვის და გარკვეული მუსიკის ჟანრებისთვის და შეუძლია ნამდვილი უწყვეტი გამოცდილების მოტანა (და შეიძლება დაარღვიოს სიმღერა მრავალი დუმილით =\\\\).\n   - რეფაქტორირებული მედია წყაროს გარჩევადობა, რათა მეტამონაცემების გადაცემა მედიასთან ერთად შიგადაშიგ პლეერში, ვიდრე ხელით.  ახლა ჩვენ გვაქვს მეტამონაცემების ერთი წყარო და პირდაპირ ხელმისაწვდომია დაკვრის დაწყებისას.\n   - დაფიქსირდა დისტანციური დასაკრავი სიის მეტამონაცემები არ განახლდება, როდესაც ახალი მეტამონაცემები ხელმისაწვდომია დასაკრავი სიის ფრაგმენტის გახსნისას.\n   - სხვადასხვა ინტერფეისის შესწორებები: #1383, ფონური მოთამაშის შეტყობინებების კონტროლი ახლა ყოველთვის თეთრია, უფრო ადვილია ამომხტარი მოთამაშის გამორთვა ფლანგით\n - გამოიყენეთ ახალი ექსტრაქტორი რეფაქტორირებული არქიტექტურით მულტისერვისისთვის\n\n ### ასწორებს\n\n - დააფიქსირეთ #1440 გატეხილი ვიდეო ინფორმაციის განლაგება #1491\n - ნახეთ ისტორიის შესწორება #1497\n   - #1495, მეტამონაცემების (მინიატურების, სათაურის და ვიდეოების რაოდენობა) განახლებით, როგორც კი მომხმარებელი წვდება დასაკრავ სიას.\n   - #1475, მონაცემთა ბაზაში ხედის დარეგისტრირებით, როდესაც მომხმარებელი იწყებს ვიდეოს გარე პლეერზე დეტალურ ფრაგმენტზე.\n - დააფიქსირეთ ეკრანის დროის ამოწურვა ამომხტარი რეჟიმის შემთხვევაში.  #1463 (დასწორებულია #640)\n - მთავარი ვიდეო პლეერის დაფიქსირება #1509\n   - [#1412] დაფიქსირდა გამეორების რეჟიმი, რომელიც იწვევს მოთამაშის NPE-ს, როდესაც მიიღება ახალი განზრახვა, როდესაც მოთამაშის აქტივობა ფონზეა.\n   - დაფიქსირებული მინიმიზაცია მოთამაშის ამომხტარ ფანჯარაში არ ანადგურებს მოთამაშეს, როდესაც ამომხტარი ნებართვა არ არის მინიჭებული.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/70.txt",
    "content": "ყურადღება: ეს ვერსია ალბათ არის bugfest, ისევე როგორც წინა.  თუმცა 17 წლიდან სრული გათიშვის გამო გაფუჭებული ვერსია ჯობია არა ვერსიას.  მართალია?  ¯\\_(ツ)_/¯\n\n ### გაუმჯობესებები\n * გადმოწერილი ფაილების გახსნა შესაძლებელია ერთი დაწკაპუნებით #1879\n * ჩამოაგდეს მხარდაჭერა ანდროიდის 4.1 - 4.3 #1884\n * წაშალეთ ძველი მოთამაშე #1884\n * წაშალეთ ნაკადები მიმდინარე სათამაშო რიგიდან მარჯვნივ #1915-ზე გადაფურცლით\n * ამოიღეთ ავტომატური რიგის ნაკადი, როდესაც ახალი ნაკადი დაიდება ხელით #1878\n * ჩამოტვირთვების შემდგომი დამუშავება და დაკარგული ფუნქციების დანერგვა #1759 @kapodamy-ის მიერ\n   * შემდგომი დამუშავების ინფრასტრუქტურა\n   * \"ინფრასტრუქტურის\" სათანადო შეცდომის დამუშავება (ჩამომტვირთველისთვის)\n   * რიგი მრავალი ჩამოტვირთვის ნაცვლად\n   * გადაიტანეთ სერიული მომლოდინე ჩამოტვირთვები (`.giga` ფაილები) აპის მონაცემებში\n   * განახორციელეთ მაქსიმალური ჩამოტვირთვის ხელახალი ცდა\n   * სწორი მრავალძაფის ჩამოტვირთვის პაუზა\n   * მობილურ ქსელზე გადასვლისას ჩამოტვირთვების შეწყვეტა (არასდროს მუშაობს, იხილეთ მე-2 პუნქტი)\n   * შეინახეთ ძაფების რაოდენობა შემდეგი ჩამოტვირთვებისთვის\n   * ბევრი შეუსაბამობა დაფიქსირდა\n\n ### გამოსწორდა\n * შეასწორეთ ავარია ნაგულისხმევი გარჩევადობით დაყენებული საუკეთესო და შეზღუდული მობილური მონაცემთა გარჩევადობით #1835\n * ამომხტარი მოთამაშის ავარია დაფიქსირდა #1874\n * NPE, როდესაც ცდილობთ გახსნათ ფონური მოთამაშე #1901\n * შეასწორეთ ახალი ნაკადების ჩასმა, როცა ავტომატური რიგი ჩართულია #1878\n * დააფიქსირა გაშიფვრის დახურვის საკითხი\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/71.txt",
    "content": "### გაუმჯობესებები\n * დაამატეთ აპლიკაციის განახლების შეტყობინება GitHub build-ისთვის (#1608 @krtkush-ის მიერ)\n * ჩამოტვირთვის სხვადასხვა გაუმჯობესება (#1944 @kapodamy):\n   * დაამატეთ დაკარგული თეთრი ხატები და გამოიყენეთ მყარი გზა ხატის ფერების შესაცვლელად\n   * შეამოწმეთ, არის თუ არა იტერატორი ინიციალიზებული (ასწორებს #2031)\n   * დაუშვით ხელახალი ჩამოტვირთვები „დამუშავების შემდგომ წარუმატებელი“ შეცდომით ახალ muxer-ში\n   * ახალი MPEG-4 muxer, რომელიც აფიქსირებს არასინქრონულ ვიდეო და აუდიო ნაკადებს (#2039)\n\n ### გამოსწორდა\n * YouTube პირდაპირი სტრიმინგები წყვეტს დაკვრას მცირე ხნის შემდეგ (#1996 @yausername-ის მიერ)\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/730.txt",
    "content": "#გამოსწორდა\n - ცხელი გამოსწორების გაშიფვრის ფუნქციის შეცდომა ისევ.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/740.txt",
    "content": "<h4>გაუმჯობესებები</h4>\n <ul>\n <li>გახადეთ კომენტარებში ბმულები დაწკაპუნებით, გაზარდეთ ტექსტის ზომა</li>\n <li>მოძებნეთ კომენტარებში დროის ანაბეჭდის ბმულებზე დაწკაპუნებით</li>\n <li>სასურველი ჩანართის ჩვენება ახლახან არჩეული მდგომარეობის მიხედვით</li>\n <li>დაამატე დასაკრავი სია რიგში, როდესაც დიდხანს დააწკაპუნებთ &#39;ფონზე&#39; დასაკრავი სიის ფანჯარაში</li>\n <li>მოძებნეთ გაზიარებული ტექსტი, როდესაც ის არ არის URL</li>\n <li>დაამატეთ &quot;გაზიარება მიმდინარე დროს&quot; ღილაკი მთავარ ვიდეო დამკვრელზე</li>\n <li>დახურვის ღილაკის დამატება მთავარ დამკვრელზე, როდესაც ვიდეო რიგი დასრულდება</li>\n <li>დაამატეთ &quot;დაკვრა პირდაპირ ფონზე&quot; ვიდეო სიის ელემენტების მენიუს ხანგრძლივი დაჭერისთვის</li>\n <li>გააუმჯობესეთ ინგლისური თარგმანი Play/Enqueue ბრძანებებისთვის</li>\n <li>შესრულების მცირე გაუმჯობესება</li>\n <li>გამოუყენებელი ფაილების წაშლა</li>\n <li>განაახლეთ ExoPlayer 2.9.6-ზე</li>\n <li>დაამატეთ მხარდაჭერა Invidious ბმულებისთვის</li>\n </ul>\n <h4>გამოსწორებულია</h4>\n <ul>\n <li>გასწორდა გადახვევა/ კომენტარები და დაკავშირებული ნაკადები გამორთულია</li>\n <li>დაასწორა CheckForNewAppVersionTask შესრულებული მაშინ, როცა არ უნდა</li>\n <li>გასწორდა youtube გამოწერის იმპორტი: იგნორირება გაუკეთეთ არასწორი url-ით და შეინახეთ ცარიელი სათაურით</li>\n <li>შეასწორეთ არასწორი YouTube url: ხელმოწერის ტეგის სახელი ყოველთვის არ არის „ხელმოწერა“, რაც ხელს უშლის ნაკადების ჩატვირთვას</li>\n </ul>\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/750.txt",
    "content": "ახალი\n დაკვრის რეზიუმე #2288\n • განაახლეთ ნაკადები, სადაც ბოლო დროს გაჩერდით\n Downloader Enhancements #2149\n • გამოიყენეთ Storage Access Framework ჩამოტვირთვების შესანახად გარე SD-ბარათებზე\n • ახალი mp4 muxer\n • სურვილისამებრ შეცვალეთ ჩამოტვირთვის დირექტორია ჩამოტვირთვის დაწყებამდე\n • პატივი ეცით მრიცხველ ქსელებს\n\n\n გაუმჯობესებული\n • ამოღებულია გემას სიმები #2295\n • გაუმკლავდეს (ავტო)როტაციის ცვლილებებს აქტივობის სასიცოცხლო ციკლის #2444\n • დააწკაპუნეთ მენიუები თანმიმდევრული #2368\n\n დაფიქსირდა\n • დაფიქსირდა არჩეული სუბტიტრების ტრეკის სახელი, რომელიც არ იყო ნაჩვენები #2394\n • არ გატეხოთ, როდესაც აპის განახლება ვერ ხერხდება (GitHub ვერსია) #2423\n • დაფიქსირებული ჩამოტვირთვები დარჩა 99.9% #2440\n • განაახლეთ სათამაშო რიგის მეტამონაცემები #2453\n • [SoundCloud] გამოსწორდა ავარია დასაკრავი სიების ჩატვირთვისას TeamNewPipe/NewPipeExtractor#170\n • [YouTube] ფიქსირებული ხანგრძლივობის გარჩევა შეუძლებელია TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/760.txt",
    "content": "ცვლილებები 0.17.1-ში\n\n ახალი\n • ტაილანდური ლოკალიზაცია\n\n\n გაუმჯობესებული\n • დაამატე აქ დაკვრის დაწყება მოქმედების ხანგრძლივი დაჭერის მენიუში დასაკრავი სიებისთვის ისევ #2518\n • დაამატეთ გადამრთველი SAF / ძველი ფაილის ამომრჩევი #2521\n\n დაფიქსირდა\n • დააფიქსირეთ ქრება ღილაკები ჩამოტვირთვების ხედში აპების გადართვისას #2487\n • დაკვრის პოზიციის დაფიქსირება შენახულია, თუმცა ნახვის ისტორია გამორთულია\n • დააფიქსირეთ შემცირებული შესრულება, რომელიც გამოწვეულია დაკვრის პოზიციით სიის ხედებში #2517\n • [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186\n • [Extractor] [YouTube] შეასწორეთ შემთხვევითი ძიების შეცდომა, როდესაც დასაკრავი სიები შედეგებშია TeamNewPipe/NewPipeExtractor#185\n\n\n\n ცვლილებები 0.17.0-ში\n\n ახალი\n დაკვრის რეზიუმე #2288\n • განაახლეთ ნაკადები, სადაც ბოლო დროს გაჩერდით\n Downloader Enhancements #2149\n • გამოიყენეთ Storage Access Framework ჩამოტვირთვების შესანახად გარე SD-ბარათებზე\n • ახალი mp4 muxer\n • სურვილისამებრ შეცვალეთ ჩამოტვირთვის დირექტორია ჩამოტვირთვის დაწყებამდე\n • პატივი ეცით მრიცხველ ქსელებს\n\n\n გაუმჯობესებული\n • ამოღებულია გემას სიმები #2295\n • გაუმკლავდეს (ავტო)როტაციის ცვლილებებს აქტივობის სასიცოცხლო ციკლის #2444\n • დააწკაპუნეთ მენიუები თანმიმდევრული #2368\n\n დაფიქსირდა\n • დაფიქსირდა არჩეული სუბტიტრების ტრეკის სახელი, რომელიც არ იყო ნაჩვენები #2394\n • არ გატეხოთ, როდესაც აპის განახლება ვერ ხერხდება (GitHub ვერსია) #2423\n • დაფიქსირებული ჩამოტვირთვები დარჩა 99.9% #2440\n • განაახლეთ სათამაშო რიგის მეტამონაცემები #2453\n • [SoundCloud] გამოსწორდა ავარია დასაკრავი სიების ჩატვირთვისას TeamNewPipe/NewPipeExtractor#170\n • [YouTube] ფიქსირებული ხანგრძლივობის გარჩევა შეუძლებელია TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/770.txt",
    "content": "ცვლილებები 0.17.2-ში\n\n გაასწორდა\n • გაასწორდა, რომ ვიდეო არ იყო ხელმისაწვდომი\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/780.txt",
    "content": "ცვლილებები 0.17.3-ში\n\n გაუმჯობესებული\n • დამატებულია ვარიანტი #2550 დაკვრის მდგომარეობის გასასუფთავებლად\n • დამალული დირექტორიების ჩვენება ფაილის ამომრჩეველში #2591\n • მხარდაჭერილი URL-ები `invidio.us`-დან, რომლებიც გაიხსნება NewPipe #2488-ით\n • დაამატეთ მხარდაჭერა `music.youtube.com` URL-ებისთვის TeamNewPipe/NewPipeExtractor#194\n\n დაფიქსირდა\n • [YouTube] გაასწორა 'java.lang.IllegalArgumentException #192\n • [YouTube] დაფიქსირდა პირდაპირი სტრიმინგები არ მუშაობს TeamNewPipe/NewPipeExtractor#195\n • დაფიქსირდა მუშაობის პრობლემა Android Pie-ში #2592 ნაკადის ჩამოტვირთვისას\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/790.txt",
    "content": "გაუმჯობესებული\n • დაამატეთ მეტი სათაური უსინათლოთა ხელმისაწვდომობისᲗვის გასაუმჯობესებლად #2655\n • გახადეთ ჩამოტვირთვის საქაღალდის პარამეტრის ენა უფრო თანმიმდევრული და ნაკლებად ორაზროვანი #2637\n\n დაფიქსირდა\n • შეამოწმეთ არის თუ არა ბლოკში ბოლო ბაიტი ჩამოტვირთული #2646\n • დაფიქსირდა გადახვევა ვიდეო დეტალების ფრაგმენტში #2672\n • წაშალეთ ორმაგი ძიების წმინდა ყუთის ანიმაციები ერთ #2695-ზე\n • [SoundCloud] გაასწორეთ client_id ამონაწერი #2745\n\n განვითარება\n • დაამატეთ NewPipeExtractor-დან მემკვიდრეობით მიღებული გამოტოვებული დამოკიდებულებები NewPipe #2535-ში\n • მიგრაცია AndroidX #2685-ზე\n • განაახლეთ ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/800.txt",
    "content": "ახალი\n • PeerTube მხარდაჭერა P2P-ის გარეშე (#2201) [ბეტა]:\n   ◦ უყურეთ და ჩამოტვირთეთ ვიდეოები PeerTube ინსტანციებიდან\n   ◦ დაამატებულია ეგზემპლარები პარამეტრებში, რათა მიიღოთ PeerTube სრულ სამყაროში\n   ◦ შეიძლება იყოს პრობლემები SSL-ის ხელის ჩამორთმევასთან დაკავშირებით Android 4.4 და 7.1-ზე, როდესაც შედიხართ გარკვეულ ინსტანციებზე, რამაც გამოიწვია ქსელის შეცდომა.\n\n • Downloader (#2679):\n   ◦ გამოთვალეთ ჩამოტვირთვის დრო\n   ◦ ჩამოტვირთეთ opus (webm ფაილები) როგორც ogg\n   ◦ აღადგინეთ ვადაგასული ჩამოტვირთვის ბმულები, რომ განაახლოთ ჩამოტვირთვები ხანგრძლივი პაუზის შემდეგ\n\n გაუმჯობესებული\n • აცნობეთ KioskFragment-ს სასურველი კონტენტის ქვეყანაში ცვლილებების შესახებ და გააუმჯობესეთ ყველა ძირითადი ჩანართის შესრულება #2742\n • გამოიყენეთ ახალი ლოკალიზაციისა და Downloader-ის იმპლემენტაციები ამომყვანი #2713-დან\n • „ნაგულისხმევი კიოსკი“ სტრიქონის თარგმნად აქცია\n • შავი ნავიგაციის ზოლი შავი თემისთვის #2569\n\n დაფიქსირდა\n • გამოსწორდა ხარვეზი, რომელიც ვერ ახერხებდა ამომხტარი პლეერის გადაადგილებას, თუ ამომხტარი ფლეიერის #2772 გადაადგილებისას სხვა თითი იყო განთავსებული\n • დასაკრავი სიების დაშვება ამტვირთავი აკლია და შეასწორეთ ამ პრობლემასთან დაკავშირებული ავარიები #2724, TeamNewPipe/NewPipeExtractor#219\n • TLS1.1/1.2-ის ჩართვა Android 4.4 მოწყობილობებზე (API 19/KitKat) TLS ხელის ჩამორთმევის გამოსასწორებლად MediaCCC-ით და PeerTube-ის ზოგიერთი ინსტანციით #2792\n • [SoundCloud] დაფიქსირდა client_id მოპოვება TeamNewPipe/NewPipeExtractor#217\n • [SoundCloud] აუდიო ნაკადის ამოღების შესწორება\n\n განვითარება\n • განაახლეთ ExoPlayer 2.10.8 #2791, #2816-ზე\n • განაახლეთ Gradle 3.5.1-ზე და დაამატეთ Kotlin მხარდაჭერა #2714\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/810.txt",
    "content": "ახალი\n • ვიდეოს მინიატურების ჩვენება ჩაკეტილ ეკრანზე ფონზე დაკვრისას\n\n გაუმჯობესებული\n • დაამატებულია ლოკალური დასაკრავი სია რიგში ფონზე / ამომხტარ ღილაკზე ხანგრძლივი დაჭერისას\n • გააკეთეთ მთავარი გვერდის ჩანართები გადასახვევად და დამალეთ, როდესაც მხოლოდ ერთი ჩანართია\n • შეტყობინებების მინიატურების განახლებების რაოდენობის შეზღუდვა ფონურ პლეერში\n • დაამატეთ მოჩვენებითი მინიატურა ცარიელი ადგილობრივი დასაკრავი სიებისთვის\n • გამოიყენეთ *.opus ფაილის გაფართოება *.webm-ის ნაცვლად და აჩვენეთ \"opus\" ფორმატში ლეიბლის ნაცვლად \"WebM Opus\" ჩამოტვირთვის ჩამოსაშლელ სიაში\n • „ჩამოტვირთვებში“ ჩამოტვირთული ფაილების ან ჩამოტვირთვის ისტორიის წასაშლელად ღილაკის დამატება\n • [YouTube] დაამატეთ მხარდაჭერა /c/shortened_url არხის ბმულებს\n\n დაფიქსირდა\n • დაფიქსირდა მრავალი პრობლემა NewPipe-ში ვიდეოს გაზიარებისა და მისი ნაკადების პირდაპირ ჩამოტვირთვისას\n • დააფიქსირა მოთამაშის წვდომა მისი შექმნის ძაფიდან\n • დაფიქსირდა ძიების შედეგების პეიჯინგი\n • [YouTube] დაფიქსირდა NPE-ის გამომწვევი null-ის ჩართვა\n • [YouTube] დააფიქსირა კომენტარების ნახვა invidio.us url-ის გახსნისას\n • [SoundCloud] განახლებულია client_id\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/820.txt",
    "content": "დაფიქსირდა გაშიფვრის ფუნქციის სახელი regex, რის გამოც YouTube გამოუსადეგარი გახდა.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/830.txt",
    "content": "განახლებულია SoundCloud client_id SoundCloud-ის პრობლემების მოსაგვარებლად.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/840.txt",
    "content": "ახალი\n • დაემატა ენის ამომრჩევი აპის ენის შესაცვლელად\n • დამატებულია კოდის გაგზავნის ღილაკი მოთამაშის დასაკეც მენიუში\n • დამატებულია ხანგრძლივი დაჭერით კომენტარების კოპირების შესაძლებლობა\n\n გაუმჯობესებული\n • დააფიქსირეთ ReCaptcha აქტივობა და სწორად შეინახეთ მიღებული ქუქიები\n • ამოღებულია წერტილების მენიუ უჯრის სასარგებლოდ და ისტორიის დამალვის ღილაკი, როდესაც ნახვის ისტორია არ არის ჩართული პარამეტრებში\n • მოითხოვეთ სხვა აპებზე ჩვენების ნებართვა სწორად პარამეტრებში Android 6-ზე და შემდეგ ვერსიაზე\n • ადგილობრივი დასაკრავი სიის სახელის გადარქმევა BookmarkFragment-ზე ხანგრძლივი დაწკაპუნებით\n • PeerTube-ის სხვადასხვა გაუმჯობესება\n • გაუმჯობესდა რამდენიმე ინგლისური წყაროს სტრიქონი\n\n დაფიქსირდა\n • დაფიქსირდა დამკვრელის ხელახლა გაშვება, თუმცა ის შეჩერებულია, როდესაც ჩართულია ოფცია „მინიმიზაცია აპის შეცვლაზე“ და NewPipe მინიმიზირებულია\n • დააფიქსირეთ საწყისი სიკაშკაშის მნიშვნელობა ჟესტისთვის\n • დაფიქსირდა .srt სუბტიტრების ჩამოტვირთვები, რომლებიც არ შეიცავს ყველა ხაზს\n • დაფიქსირდა SD ბარათზე ჩამოტვირთვა ვერ მოხერხდა, რადგან ზოგიერთი Android 5 მოწყობილობა არ შეესაბამება CTF-ს\n • დაფიქსირდა ჩამოტვირთვა Android KitKat-ზე\n • დაფიქსირდა კორუმპირებული ვიდეო .mp4 ფაილის აუდიო ფაილად აღიარება\n • დაფიქსირდა ლოკალიზაციის მრავალი პრობლემა, მათ შორის არასწორი ჩინური ენის კოდები\n • [YouTube] აღწერილობაში დროის შტამპები ხელახლა შეიძლება დააწკაპუნოთ\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/850.txt",
    "content": "ამ გამოშვებაში განახლდა YouTube ვებსაიტის ვერსია. ვებსაიტის ძველი ვერსია შეწყდება მარტში და, შესაბამისად, თქვენ უნდა განაახლოთ NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/860.txt",
    "content": "გაუმჯობესებული\n • შეინახეთ და აღადგინეთ სიმაღლე და ტემპი გამორთულია თუ არა\n • პლეერში ეკრანის ამოჭრის მხარდაჭერა\n • მრგვალი ხედვა და აბონენტების რაოდენობა\n • ოპტიმიზებულია YouTube ნაკლები მონაცემების გამოსაყენებლად\n\n YouTube-თან დაკავშირებული 15-ზე მეტი შეცდომა დაფიქსირდა და გასწორდა ამ გამოშვებაში.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/870.txt",
    "content": "ეს არის Hotfix-ის გამოშვება, რომელიც ახლებს NewPipe-ს, რათა შესაძლებელი გახდეს SoundCloud-ის გამოყენება კვლავ დიდი პრობლემების გარეშე.\n SoundCloud-ის v2 API ახლა გამოიყენება ექსტრაქტორში და გაუმჯობესებულია კლიენტის არასწორი ID-ების გამოვლენა.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/900.txt",
    "content": "ახალი\n • გამოწერის ჯგუფები და დახარისხებული არხები\n • დადუმების ღილაკი მოთამაშეებში\n\n გაუმჯობესებული\n • დაუშვით music.youtube.com და media.ccc.de ბმულების გახსნა NewPipe-ში\n • ორი პარამეტრის გადატანა გარეგნობიდან კონტენტზე\n • 5, 15, 25 წამის ძიების ვარიანტების დამალვა, თუ არაზუსტი ძიება ჩართულია\n\n დაფიქსირდა\n • ზოგიერთი WebM ვიდეოს ძებნა შეუძლებელია\n • მონაცემთა ბაზის სარეზერვო ასლი Android P-ზე\n • ავარია ჩამოტვირთული ფაილის გაზიარებისას\n • ბევრი YouTube მოპოვების პრობლემა და სხვა ...\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/910.txt",
    "content": "დაფიქსირდა მონაცემთა ბაზის მიგრაცია, რამაც ხელი შეუშალა NewPipe-ის დაწყებას ზოგიერთ იშვიათ შემთხვევებში.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/920.txt",
    "content": "გაუმჯობესებული\n\n • დამატებულია ატვირთვის თარიღი და ნახვების რაოდენობა ნაკადის ბადის ერთეულებზე\n • უჯრის სათაურის განლაგების გაუმჯობესება\n\n გასწორდა\n\n • გასწორდა დადუმების ღილაკი, რომელიც იწვევს ავარიას API 19-ზე\n • გასწორდა გრძელი 1080p 60fps ვიდეოების ჩამოტვირთვა\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/930.txt",
    "content": "ახალი\n • ძიება YouTube Music-ზე\n • Android TV-ის ძირითადი მხარდაჭერა\n\n გაუმჯობესებული\n • დამატებულია ყველა ნანახი ვიდეოს წაშლის შესაძლებლობა ადგილობრივი დასაკრავი სიიდან\n • შეტყობინებების ჩვენება, როდესაც კონტენტი ჯერ არ არის მხარდაჭერილი ავარიის ნაცვლად\n • გაუმჯობესებული ამომხტარი დამკვრელის ზომის შეცვლა პინჩის ჟესტებით\n • სტრიმინგების რიგში ჩასმა ფონზე ხანგრძლივი დაჭერით და არხის ამომხტარი ღილაკებით\n • უჯრის სათაურის სათაურის ზომის გაუმჯობესებული დამუშავება\n\n დაფიქსირდა\n • ფიქსირებული ასაკობრივი შეზღუდვის კონტენტის პარამეტრი არ მუშაობს\n • დააფიქსირა გარკვეული სახის reCAPTCHA-ები\n • დაფიქსირდა ავარია სანიშნეების გახსნისას, როდესაც დასაკრავი სია არის `null`\n • ქსელთან დაკავშირებული გამონაკლისების დაფიქსირება\n • დაფიქსირდა ჯგუფური დახარისხების ღილაკის ხილვადობა გამოწერების ფრაგმენტში\n\n და მეტი\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/940.txt",
    "content": "ახალი\n • დაამატეთ მხარდაჭერა SoundCloud-ის კომენტარებისთვის\n • დაამატეთ YouTube შეზღუდული რეჟიმის პარამეტრი\n • PeerTube-ის მშობელი არხის დეტალების ჩვენება\n\n გაუმჯობესებული\n • კორე ღილაკის ჩვენება მხოლოდ მხარდაჭერილი სერვისებისთვის\n • დაბლოკეთ მოთამაშის ჟესტები, რომლებიც იწყება Navigation Bar-ზე ან Status Bar-ზე\n • ხელახლა ცდისა და გამოწერის ღილაკების ფონის ფერის შეცვლა სერვისის ფერის მიხედვით\n\n დაფიქსირდა\n • დააფიქსირეთ ჩამოტვირთვის დიალოგის გაყინვა\n • ბრაუზერის გახსნის ღილაკი ახლა ნამდვილად იხსნება ბრაუზერში\n • ვიდეოების გახსნისას ავარიის გამოსწორება და „ამ ნაკადის დაკვრა ვერ მოხერხდა“\n\n და მეტი\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/950.txt",
    "content": "ამ გამოშვებას მოაქვს სამი მცირე გამოსწორება:\n • გასწორდა წვდომა მეხსიერებაზე Android 10+-ზე\n • ფიქსირებული გახსნის კიოსკები\n • ხანგრძლივი ვიდეოების ფიქსირებული ხანგრძლივობის გარჩევა\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/951.txt",
    "content": "ახალი\n • დაამატეთ სააბონენტო ამომრჩევის ძიება არხის ჯგუფის დიალოგში\n • დაამატეთ ფილტრი არხის ჯგუფის დიალოგში მხოლოდ დაუჯგუფებელი გამოწერების საჩვენებლად\n • დასაკრავი სიის ჩანართის დამატება მთავარ გვერდზე\n • სწრაფი წინ/უკან გადახვევა ფონური/გამომხტარი მოთამაშის რიგში\n • ძიების შეთავაზების ჩვენება: იგულისხმეთ და აჩვენეთ შედეგი\n\n გაუმჯობესებული\n • ჩამოაგდეთ განაცხადის მეტამონაცემების ჩაწერა შეფუთულ ფაილებში\n • არ ამოიღოთ წარუმატებელი ნაკადები რიგიდან\n • განაახლეთ სტატუსის ზოლის ფერი, რათა შეესაბამებოდეს ხელსაწყოთა ზოლის ფერს\n\n დაფიქსირდა\n • დაფიქსირდა აუდიო/ვიდეო დესინქრონიზაცია, რომელიც გამოწვეული იყო მცურავი წერტილის კუმულაციური შეცდომებით\n • [PeerTube] წაშლილი კომენტარების მართვა\n\n და მეტი\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/952.txt",
    "content": "გაუმჯობესებული\n • ავტომატური დაკვრა ხელმისაწვდომია ყველა სერვისისთვის (მხოლოდ YouTube-ის ნაცვლად)\n\n გასწორდა\n • გაასწორა დაკავშირებული ნაკადები YouTube-ის ახალი გაგრძელების მხარდაჭერით\n • ფიქსირებული ასაკობრივი შეზღუდული YouTube ვიდეოები\n • [Android TV] ფიქსირებული ფოკუსის ხაზგასმის გადაფარვა\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/953.txt",
    "content": "გაასწორეთ YouTube-ის გაშიფვრის ფუნქციის ამოღება.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/954.txt",
    "content": "ახალი აპლიკაციის სამუშაო პროცესი: დაუკარით ვიდეოები დეტალების გვერდზე, გადაფურცლეთ ქვემოთ მოთამაშის შესამცირებლად\n • MediaStyle შეტყობინებები: კონფიგურირებადი მოქმედებები შეტყობინებებში, მუშაობის გაუმჯობესება\n • ძირითადი ზომის შეცვლა NewPipe-ის დესკტოპის აპად გამოყენებისას\n\n • აჩვენეთ დიალოგი ღია ვარიანტებით მხარდაჭერილი URL-ის სადღეგრძელოს შემთხვევაში\n • გააუმჯობესეთ ძიების შეთავაზებების გამოცდილება, როდესაც დისტანციური ვერსიების მიღება შეუძლებელია\n • ვიდეოს ნაგულისხმევი ხარისხის გაზრდა 720p60-მდე (აპს-შიდა პლეერი) და 480p-მდე (მომხტარი პლეერი)\n\n • ბევრი შეცდომების გამოსწორება და სხვა\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/955.txt",
    "content": "[YouTube] გასწორდა ძიება ზოგიერთი მომხმარებლისთვის\n [YouTube] გასწორდა შემთხვევითი გაშიფვრის გამონაკლისები\n [SoundCloud] URL-ები, რომლებიც მთავრდება ხაზებით, ახლა სწორად არის გაანალიზებული\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/956.txt",
    "content": "[YouTube] გამოსწორდა ავარია ნებისმიერი ვიდეოს ჩატვირთვისას\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/957.txt",
    "content": "• კონკრეტული რიგის მოქმედებების გაერთიანება ერთში\n • ორი თითის ჟესტი მოთამაშის დახურვისთვის\n • დაუშვით reCAPTCHA ქუქიების გასუფთავება\n • შეტყობინების გაუფერულების ვარიანტი\n • გააუმჯობესე, თუ როგორ იხსნება ვიდეოს დეტალები, რათა გამოსწორდეს უსასრულო ბუფერირება, ბუფერული ქცევა NewPipe-თან გაზიარებისას და სხვა შეუსაბამობები\n • დააჩქარეთ YouTube ვიდეოები და დააფიქსირეთ ასაკობრივი შეზღუდვები\n • შეასწორეთ ავარია სწრაფ წინ/უკან გადახვევაზე\n • ნუ გადააწყობთ სიებს ესკიზების გადატანით\n • ყოველთვის გახსოვდეთ ამომხტარი თვისებები\n • დაამატეთ სანტალი ენა\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/958.txt",
    "content": "ახალი და გაუმჯობესებული:\n • ხელახლა დამატებულია ესკიზის დამალვის ვარიანტი ჩაკეტილ ეკრანზე\n • გაიყვანეთ არხის განახლებისთვის\n • გაუმჯობესებული შესრულება ადგილობრივი სიების მიღებისას\n\n დაფიქსირდა:\n • დაფიქსირდა ავარია NewPipe-ის გაშვებისას, ოპერატიული მეხსიერებიდან ამოღების შემდეგ\n • დაფიქსირდა ავარია გაშვებისას, როცა ინტერნეტი არ არის\n • დაფიქსირდა სიკაშკაშის და მოცულობის ჟესტების პარამეტრები\n • [YouTube] დაფიქსირდა გრძელი დასაკრავი სიები\n\n სხვა:\n • კოდების გასუფთავება და რამდენიმე შიდა გაუმჯობესება\n • დამოკიდებულების განახლებები\n • თარგმანის განახლებები\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/959.txt",
    "content": "დაფიქსირდა ავარიების გაუთავებელი ციკლი შეცდომის რეპორტიორის გახსნის შემდეგ.\n განახლებულია PeerTube ინსტანციების სია, რომლებიც ავტომატურად გაიხსნება NewPipe-ის მიერ.\n განახლებული თარგმანები.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/960.txt",
    "content": "• გაუმჯობესებული აღწერა ექსპორტის მონაცემთა ბაზის პარამეტრებში.\n • დაფიქსირდა YouTube კომენტარების გარჩევა.\n • დაფიქსირდა media.ccc.de სერვისის საჩვენებელი სახელი.\n • განახლებული თარგმანები.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/961.txt",
    "content": "• [YouTube] Mix მხარდაჭერა\n • [YouTube] ინფორმაციის ჩვენება საზოგადოებრივი მაუწყებლებისა და Covid-19-ის შესახებ\n • [media.ccc.de] დამატებულია ბოლო ვიდეოები\n • დამატებულია სომალიური თარგმანი\n\n • ბევრი შიდა გაუმჯობესება\n\n • დაფიქსირდა ვიდეოების გაზიარება პლეერის შიგნიდან\n • დაფიქსირდა ცარიელი ReCaptcha ვებ-ხედვა\n • დაფიქსირდა ავარია, რომელიც მოხდა ნაკადის სიიდან ამოღებისას\n • [PeerTube] დაფიქსირდა დაკავშირებული ნაკადები\n • [YouTube] დაფიქსირდა YouTube Music ძიება\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/962.txt",
    "content": "media.ccc.de სერვისს დაემატა \"უახლესი\" ვიდეოები.\n დაემატა პირდაპირი სტრიმინგები media.ccc.de სერვისს და ასევე პირდაპირი სტრიმინგის მხარდაჭერას.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/963.txt",
    "content": "• [YouTube] გასწორდა არხის გაგრძელება\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/964.txt",
    "content": "• დამატებულია თავების მხარდაჭერა მოთამაშის კონტროლში\n • [PeerTube] დაემატა სეპიას ძებნა\n • ხელახლა დაემატა გაზიარების ღილაკი ვიდეოს დეტალების ხედში და ნაკადის აღწერა გადატანილია ჩანართის განლაგებაში\n • გამორთეთ სიკაშკაშის აღდგენა, თუ სიკაშკაშის ჟესტი გამორთულია\n • დამატებულია სიის ელემენტი კოდიზე ვიდეოს დასაკრავად\n • გამოსწორდა ავარია, როდესაც ნაგულისხმევი ბრაუზერი არ არის დაყენებული ზოგიერთ მოწყობილობაზე და გააუმჯობესეთ გაზიარების დიალოგები\n • გადართეთ დაკვრა/პაუზა ტექნიკის სივრცის ღილაკით სრულეკრანიან დამკვრელში\n • [media.ccc.de] სხვადასხვა შესწორებები და გაუმჯობესება\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/965.txt",
    "content": "‚გამოსწორდა ავარია, რომელიც მოხდა არხის ჯგუფების ხელახალი შეკვეთისას.\n დაფიქსირდა მეტი YouTube ვიდეოს მიღება არხებიდან და დასაკრავი სიებიდან.\n გამოსწორდა YouTube კომენტარების მიღება.\n დაემატა მხარდაჭერა /watch/, /v/ და /w/ ქვებილიკებისთვის YouTube URL-ებში.\n დაფიქსირდა SoundCloud კლიენტის ID და გეოშეზღუდული კონტენტის ამოღება.\n დაემატა ჩრდილოეთ ქურთული ლოკალიზაცია.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/966.txt",
    "content": "ახალი:\n • ახალი სერვისის დამატება: Bandcamp\n\n გაუმჯობესებული:\n • დაამატეთ ვარიანტი, რომ აპს მიჰყვეს მოწყობილობის თემას\n • ზოგიერთი ავარიის თავიდან აცილება შეცდომების გაუმჯობესებული პანელის ჩვენებით\n • აჩვენეთ მეტი ინფორმაცია იმის შესახებ, თუ რატომ არის კონტენტი მიუწვდომელი\n • აპარატურის სივრცის ღილაკი იწვევს დაკვრა/პაუზას\n • აჩვენეთ „ჩამოტვირთვა დაიწყო“ სადღეგრძელო\n\n დაფიქსირდა:\n • დააფიქსირეთ ძალიან მცირე მინიატურა ვიდეოს დეტალებში ფონზე დაკვრის დროს\n • შეასწორეთ ცარიელი სათაური მინიმიზირებულ მოთამაშეში\n • დააფიქსირეთ ბოლო ზომის შეცვლის რეჟიმი, რომელიც არ აღდგება სწორად\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/967.txt",
    "content": "გაასწორა YouTube, რომელიც ევროკავშირში არ მუშაობს გამართულად. ეს გამოწვეული იყო ახალი ქუქი-ჩანაწერით და კონფიდენციალურობის თანხმობის სისტემით, რომელიც მოითხოვს NewPipe-ს დააყენოს თანხმობის ქუქი-ფაილები.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/968.txt",
    "content": "დამატებულია არხის დეტალების ვარიანტი ხანგრძლივი დაჭერის მენიუში.\n დამატებულია ფუნქციონირება დასაკრავი სიის სახელის გადარქმევის მიზნით დასაკრავი სიის ინტერფეისიდან.\n ნება მიეცით მომხმარებელს შეაჩეროს ვიდეო ბუფერის დროს.\n გაპრიალებული თეთრი თემა.\n დაფიქსირდა შრიფტების გადახურვა უფრო დიდი ზომის შრიფტის გამოყენებისას.\n არ დაფიქსირდა ვიდეო Formuler და Zephier მოწყობილობებზე.\n დაფიქსირდა სხვადასხვა ავარია.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/969.txt",
    "content": "• დაუშვით ინსტალაცია გარე მეხსიერებაზე\n • [Bandcamp] დამატებულია მხარდაჭერა ნაკადზე პირველი სამი კომენტარის ჩვენებისთვის\n • აჩვენეთ „ჩამოტვირთვა დაიწყო“ სადღეგრძელო მხოლოდ ჩამოტვირთვის დაწყებისას\n • არ დააყენოთ reCaptcha ქუქი, როცა არ არის შენახული ქუქი\n • [Player] ქეშის მუშაობის გაუმჯობესება\n • [Player] ფიქსირებული პლეერი ავტომატურად არ უკრავს\n • ჩამოტვირთვების წაშლისას წინა Snackbar-ების გაუქმება\n • დაფიქსირდა ობიექტის წაშლის მცდელობა, რომელიც არ არის სიაში\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/970.txt",
    "content": "ახალი\n • აჩვენეთ შინაარსის მეტამონაცემები (თეგები, კატეგორიები, ლიცენზია, ...) აღწერილობის ქვემოთ\n • დამატებულია „არხის დეტალების ჩვენება“ ოფცია დისტანციურ (არალოკალურ) დასაკრავ სიებში\n • მენიუს ხანგრძლივი დაჭერით დაემატა „გახსნა ბრაუზერში“.\n\n დაფიქსირდა\n • დაფიქსირდა ბრუნვის ავარია ვიდეოს დეტალების გვერდზე\n • დაფიქსირდა ღილაკი „თამაში კოდით“ პლეერში ყოველთვის მოგთხოვთ კორეს დააინსტალიროთ\n • დაფიქსირდა და გაუმჯობესდა დაყენების იმპორტისა და ექსპორტის გზები\n • [YouTube] დააფიქსირა მოწონებების რაოდენობა\n Და უფრო მეტი\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/971.txt",
    "content": "Hotfix\n • ბუფერის გაზრდა რებუფერის შემდეგ დაკვრისთვის\n • გამოსწორდა ავარია ტაბლეტებსა და ტელევიზორებზე პლეერში სათამაშო რიგის ხატულაზე დაწკაპუნებისას\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/972.txt",
    "content": "ახალი\n აღწერილობაში დროის შტამპების და ჰეშთეგების ამოცნობა\n დამატებულია ტაბლეტის ხელით რეჟიმის პარამეტრი\n დამატებულია ნათამაშები ელემენტების არხში დამალვის შესაძლებლობა\n\n გაუმჯობესებული\n სათანადოდ მხარი დაუჭირეთ Storage Access Framework-ს\n მიუწვდომელი და დასრულებული არხების შეცდომის უკეთესი მართვა\n Android-ის გაზიარების ფურცელი Android 10+ მომხმარებლებისთვის ახლა აჩვენებს კონტენტის სათაურს.\n განახლებულია Invidious ინსტანციები და მხარს უჭერს Piped ბმულებს.\n\n დაფიქსირდა\n [YouTube] ასაკით შეზღუდული კონტენტი\n ფანჯრის გაჟონვის თავიდან აცილება, გამონაკლისი არჩევანის დიალოგის გახსნისას\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/973.txt",
    "content": "Hotfix\n • გაასწორეთ ესკიზები და სათაურები, რომლებიც ამოჭრილია ბადის განლაგებაში, არასწორი გაანგარიშების გამო, თუ რამდენი ვიდეო შეიძლება მოთავსდეს ერთ რიგში\n • დააფიქსირეთ ჩამოტვირთვის დიალოგი, რომელიც გაქრება არაფრის გაკეთების გარეშე, თუ გახსნილია გაზიარების მენიუდან\n • განაახლეთ ბიბლიოთეკა, რომელიც დაკავშირებულია გარე აქტივობების გახსნასთან, როგორიცაა Storage Access Framework ფაილის ამომრჩევი\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/974.txt",
    "content": "Hotfix\n • მოაგვარეთ ბუფერის პრობლემები, რომლებიც გამოწვეულია YouTube-ის შეფერხებით\n • შეასწორეთ YouTube კომენტარების ამოღება და ავარია გამორთული კომენტარებით\n • შეასწორეთ YouTube მუსიკის ძიება\n • შეასწორეთ PeerTube პირდაპირი ეთერი\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/975.txt",
    "content": "ახალი\n • ძიების დროს მინიატურების გადახედვის ჩვენება\n • გამორთული კომენტარების აღმოჩენა\n • არხის ერთეულის ნანახად მონიშვნის დაშვება\n • კომენტარების გულების ჩვენება\n\n გაუმჯობესებულია\n • მეტამონაცემების და ტეგების განლაგების გაუმჯობესება\n • სერვისის ფერის გამოყენება UI კომპონენტებზე\n\n დაფიქსირდა\n • მინი პლეერში მინიატურების დაფიქსირება\n • დააფიქსირეთ დაუსრულებელი ბუფერირება დუბლიკატი რიგის ერთეულებზე\n • ზოგიერთი მოთამაშის შესწორება, როგორიცაა როტაცია და უფრო სწრაფი დახურვა\n • დააფიქსირეთ ReCAPTCHA დარჩენილი ჩატვირთული ფონზე\n • დაწკაპუნების გამორთვა არხის განახლებისას\n • შეასწორეთ ჩამოტვირთვის ავარია\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/976.txt",
    "content": "• დამატებულია პლეერის პირდაპირ გახსნის ოპცია სრულ ეკრანზე\n • ნება დართეთ აირჩიოთ რომელი ტიპის საძიებო წინადადებები გამოჩნდეს\n • მუქი თემა ახლა უფრო მუქი + დამატებულია მუქი დახვეწილი ეკრანი\n • გაუმჯობესებული ფაილის ამომრჩევი არასასურველი ფაილების გასათეთრებლად\n • დაფიქსირდა YouTube გამოწერების იმპორტი\n • ნაკადის ხელახლა დაკვრა მოითხოვს ხელახლა დაჭერას გამეორების ღილაკზე\n • დაფიქსირდა დახურვის აუდიო სესია\n • [Android TV] დაფიქსირდა გრძელი საძიებო ზოლის ნახტომები DPad-ის გამოყენებისას\n\n შემდგომი ცვლილებების სანახავად, ნახეთ ცვლილებების ჟურნალი (და ბლოგის პოსტი) ქვემოთ მოცემული ბმულების ჩანართიდან.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/977.txt",
    "content": "• დამატებულია „შემდეგი დაკვრის“ ღილაკი ხანგრძლივი დაჭერის მენიუში\n • განზრახვის ფილტრს დაემატა YouTube shorts ბილიკის პრეფიქსი\n • ფიქსირებული პარამეტრების იმპორტი\n • შეცვალეთ საძიებო ზოლის პოზიცია მოთამაშის ღილაკებით რიგის ეკრანზე\n • MediasessionManager-თან დაკავშირებული სხვადასხვა შესწორებები\n • დაფიქსირებული ძიების ზოლი არ დასრულებულა ვიდეოს დასრულების შემდეგ\n • გამორთული მედია გვირაბი RealtekATV-ზე\n • გაფართოებული მინიმირებული მოთამაშის ღილაკების დაწკაპუნებადი არე\n\n შემდგომი ცვლილებების სანახავად, ნახეთ ცვლილებების ჟურნალი (და ბლოგის პოსტი) ქვემოთ მოცემული ბმულების ჩანართიდან.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/978.txt",
    "content": "დაფიქსირდა შემოწმების შესრულება NewPipe-ის ახალი ვერსიისთვის. ეს შემოწმება ხანდახან ძალიან ადრე სრულდებოდა და, შესაბამისად, იწვევს აპის ავარიას. ეს ახლა უნდა გამოსწორდეს.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/979.txt",
    "content": "გასწორდა დაკვრის განახლება\n - გაუმჯობესებები იმის უზრუნველსაყოფად, რომ სერვისი, რომელიც განსაზღვრავს თუ არა NewPipe-მა უნდა შეამოწმოს ახალი ვერსიის შემოწმება, არ დაიწყო ფონზე\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/980.txt",
    "content": "ახალი\n • მენიუს გასაზიარებლად დაემატა „დამატება დასაკრავ სიაში“ ოფცია\n • დამატებულია მხარდაჭერა y2u.be და PeerTube მოკლე ბმულებისთვის\n\n გაუმჯობესებული\n • დაკვრა-სიჩქარის კონტროლი უფრო კომპაქტური გახდა\n • არხი ახლა ხაზს უსვამს ახალ ელემენტებს\n • არხში \"ნანახი ელემენტების ჩვენება\" ოფცია ახლა შენახულია\n\n დაფიქსირდა\n • დაფიქსირდა YouTube-ის მოწონებისა და დაწუნებების მოპოვება\n • დაფიქსირდა ავტომატური გამეორება ფონიდან დაბრუნების შემდეგ\n Და უფრო მეტი\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/981.txt",
    "content": "წაიშალა MediaParser-ის მხარდაჭერა Android 11+-ზე ბუფერირების შემდეგ დაკვრის წარუმატებელი რეზიუმეს გამოსასწორებლად.\n გამორთულია მედია გვირაბი Philips QM16XE-ზე დაკვრის პრობლემების მოსაგვარებლად.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/982.txt",
    "content": "გაასწორა YouTube არ უკრავს არცერთ ნაკადს.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/983.txt",
    "content": "დაამატეთ ახალი ინტერფეისი და ქცევა ორმაგი შეხებით მოსაძებნად\n გახადეთ პარამეტრები საძიებელი\n მონიშნეთ ჩამაგრებული კომენტარები, როგორც ასეთი\n დაამატეთ ღია აპის მხარდაჭერა FSFE-ის PeerTube ინსტანციისთვის\n შეცდომის შეტყობინებების დამატება\n დააფიქსირეთ პირველი რიგის ელემენტის გამეორება მოთამაშის შეცვლაზე\n დაელოდეთ უფრო მეტხანს ბუფერირებისას პირდაპირი სტრიმინგების დროს, სანამ არ მოხდება\n ადგილობრივი ძიების შედეგების თანმიმდევრობის დაფიქსირება\n დააფიქსირეთ ცარიელი ელემენტის ველები სათამაშო რიგში\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/984.txt",
    "content": "ჩატვირთეთ საკმარისი საწყისი ელემენტი სიებში, რათა შეავსოთ მთელი ეკრანი და დააფიქსიროთ გადახვევა ტაბლეტებსა და ტელევიზორებზე\n შეასწორეთ შემთხვევითი ავარიები სიებში გადახვევისას\n სთხოვეთ მოთამაშეს სწრაფად მოძებნოს გადაფარვის რკალი სისტემის ინტერფეისის ქვეშ\n დააბრუნეთ ცვლილებები ამონაჭრებში მრავალ ფანჯარაში თამაშისას, რაც იწვევს მოთამაშის არასწორად რეგრესიას ზოგიერთ ტელეფონზე\n გაზიზარდა compileSdk 30-დან 31-მდე\n შეცდომის მოხსენების ბიბლიოთეკის განახლება\n გადააკეთეთ რამდენიმე კოდი პლეერში\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/985.txt",
    "content": "გაასწორა YouTube არ უკრავს არცერთ ნაკადს\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/986.txt",
    "content": "ახალი\n • შეტყობინებები ახალი ნაკადებისთვის\n • უწყვეტი გადასვლა ფონსა და ვიდეო პლეერებს შორის\n • სიმაღლის შეცვლა ნახევარტონებით\n • დასაკრავ სიას დაამატე მთავარი მოთამაშის რიგი\n\n გაუმჯობესებული\n • დაიმახსოვრე სიჩქარე/სიმაღლის ნაბიჯის ზომა\n • შეამცირეთ საწყისი ხანგრძლივი ბუფერირება ვიდეო პლეერში\n • გააუმჯობესეთ მოთამაშის ინტერფეისი Android TV-სთვის\n • დაადასტურეთ ყველა გადმოწერილი ფაილის წაშლამდე\n\n დაფიქსირდა\n • შეასწორეთ მედია ღილაკი, რომელიც არ მალავს მოთამაშის კონტროლს\n • დააფიქსირეთ დაკვრის გადატვირთვა მოთამაშის ტიპის შეცვლაზე\n • დააფიქსირეთ დასაკრავი სიის დიალოგის როტაცია\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/987.txt",
    "content": "ახალი\n • პროგრესული HTTP-ის გარდა მიწოდების მეთოდების მხარდაჭერა: დაკვრის უფრო სწრაფი ჩატვირთვის დრო, PeerTube-სა და SoundCloud-ის შესწორებები, ახლახან დასრულებული YouTube-ის პირდაპირი სტრიმინგების დაკვრა\n • დამატების ღილაკი დისტანციური დასაკრავი სიის ადგილობრივ სიაში დასამატებლად\n • სურათის გადახედვა Android 10+ გაზიარების ფურცელში\n\n გაუმჯობესებული\n • დაკვრის პარამეტრების გაუმჯობესება\n • ხელმოწერის იმპორტი/ექსპორტის ღილაკების გადატანა სამწერტილიან მენიუში\n\n დაფიქსირდა\n • სრულად ნანახი ვიდეოების დასაკრავი სიიდან ამოშლის შესწორება\n • შეასწორეთ გაზიარების მენიუს თემა და ჩანაწერი „დაამატე დასაკრავ სიაში“.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/988.txt",
    "content": "[YouTube] გაასწორდა შეცდომა „ვერ მივიღე ნაკადი“ რომელიმე ვიდეოს დაკვრის მცდელობისას\n [YouTube] შეასწორდა „შემდეგი კონტენტი მიუწვდომელია ამ აპში“. მოთხოვნილი ვიდეოს ნაცვლად ნაჩვენები შეტყობინება\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/989.txt",
    "content": "• [YouTube] შეასწორდა უსასრულო ჩატვირთვა ნებისმიერი ვიდეოს დაკვრის მცდელობისას\n • [YouTube] დააფიქსირეთ შეფერხება ზოგიერთ ვიდეოზე\n • განაახლეთ jsoup ბიბლიოთეკა 1.15.3-მდე, რომელიც მოიცავს უსაფრთხოების შესწორებას\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/990.txt",
    "content": "ეს გამოშვება ამცირებს Android 4.4 KitKat-ის მხარდაჭერას, ახლა მინიმალური ვერსიაა Android 5 Lollipop!\n\n ახალი\n • ჩამოტვირთეთ ხანგრძლივი დაჭერის მენიუდან\n • მომავალი ვიდეოების დამალვა არხში\n • გააზიარეთ ადგილობრივი დასაკრავი სიები\n\n გაუმჯობესებული\n • გადააკეთეთ მოთამაშის კოდი მცირე კომპონენტებად: ნაკლები ოპერატიული მეხსიერება, ნაკლები შეცდომები\n • ესკიზების მასშტაბის რეჟიმის გაუმჯობესება\n • Vector-ize image placeholders\n\n დაფიქსირდა\n • მოაგვარეთ სხვადასხვა პრობლემები მოთამაშის შეტყობინებასთან დაკავშირებით: მოძველებული/გამოტოვებული მედიის ინფორმაცია, დამახინჯებული მინიატურა\n • დააფიქსირეთ სრული ეკრანი ეკრანის 1/4-ის გამოყენებით\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/991.txt",
    "content": "ახალი\n • შეცდომის პანელში დაამატეთ ღილაკი „გახსნა ბრაუზერში“.\n • დაამატეთ ოფცია არხების ჯგუფების სიაში საჩვენებლად\n • [YouTube] დიდხანს დააწკაპუნეთ ნაკადის სეგმენტებზე დროის ანაბეჭდის URL-ის გასაზიარებლად\n • თამაშის რიგის ღილაკის დამატება მინი პლეერში\n\n გაუმჯობესებული\n • დაამატეთ ისლანდიური ლოკალიზაცია და განახლებულია მრავალი სხვა თარგმანი\n • ბევრი შიდა გაუმჯობესება\n\n დაფიქსირდა\n • მრავალი ავარიის გამოსწორება\n • [YouTube] ზოგიერთ ქვეყანაში არხების ჩატვირთვის, გამოუყენებელი არხის და დაკვრის პრობლემის გადაჭრის გადაჭრა\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/996.txt",
    "content": "media.ccc.de-ზე არხის/კონფერენციის გახსნისას გამოსწორდა NullPointerException.\nგრინჩმა სცადა თქვენთვის საშობაო საჩუქრის გატეხვა, მაგრამ ჩვენ გამოვასწორეთ.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/998.txt",
    "content": "გაასწორა YouTube არ უკრავს არცერთ ნაკადს\n"
  },
  {
    "path": "fastlane/metadata/android/ka/changelogs/999.txt",
    "content": "გაასწორა YouTube არ უკრავს არცერთ ნაკადს\n"
  },
  {
    "path": "fastlane/metadata/android/ka/full_description.txt",
    "content": "NewPipe არ იყენებს Google Framework ბიბლიოთეკას ან YouTube API-ს. ის მხოლოდ აანალიზებს ვებსაიტს, რათა მოიპოვოს მისთვის საჭირო ინფორმაცია. ამიტომ ამ აპლიკაციის გამოყენება შესაძლებელია მოწყობილობებზე Google სერვისების დაყენების გარეშე. გარდა ამისა, თქვენ არ გჭირდებათ YouTube ანგარიში NewPipe-ის გამოსაყენებლად და ეს არის FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/ka/short_description.txt",
    "content": "უფასო მსუბუქი YouTube წინა ნაწილი Android-ისთვის.\n"
  },
  {
    "path": "fastlane/metadata/android/kab/short_description.txt",
    "content": "Imeɣri aget midya ilelli, afessas i Android.\n"
  },
  {
    "path": "fastlane/metadata/android/kk/changelogs/63.txt",
    "content": "### Жақсартулар\n- Импорттау/экспорттау параметрлері #1333 \n- Артық шығындарды азайту (өнімділікті арттыру) #1371 \n- №1375 кодты сәл жақсарту \n- GDPR #1420 туралы бәрін қосыңыз\n\n### Түзетілді\n- Жүктеуші: файлдардан аяқталмаған жүктеулерді жүктеу кезінде ақаулық жойылды .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/kk/changelogs/64.txt",
    "content": "### Жақсартулар\n- Мобильді деректерді пайдалану кезінде бейне сапасын шектеу мүмкіндігі қосылды. #1339 \n- #1442 сессиясының жарықтығын есте сақтаңыз \n- Әлсіз #1431 процессорлары үшін жүктеу өнімділігі жақсарды \n- #1433 медиа сессиясына (жұмыс) қолдау қосылды\n\n### Түзету\n- Жүктеулерді ашқан кезде ақаулық жойылды (түзету енді шығарылым құрылымдары үшін қол жетімді) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/kk/changelogs/65.txt",
    "content": "### Жақсартулар\n- Burgermenu белгішесінің анимациясын өшіріңіз #1486 \n- #1472 жүктеулерді жоюды болдырмау \n- Бөлісу мәзіріндегі жүктеу опциясы #1498\n- #1454 ұзақ басу мәзіріне\" бөлісу \" опциясы қосылды \n- #1354 шыққан кезде негізгі ойыншыны айналдырыңыз \n- Кітапхана нұсқасын жаңарту және № 1510 дерекқордың сақтық көшірмесін түзету \n- Exoplayer 2.8.2 # 1392 Жаңартуы\n  - Жылдамдықты тезірек өзгерту үшін әр түрлі қадам өлшемдерін сақтау үшін ойнату жылдамдығын басқару диалогы қайта жасалды.\n  - Ойнату жылдамдығын басқаруда кідірту кезінде жылдам алға жылжу үшін қосқыш қосылды. Бұл аудиокітаптар мен белгілі бір музыкалық жанрлар үшін пайдалы болуы керек және шынымен тегіс ойнатуды қамтамасыз етуі мүмкін (және әнді көптеген қателіктермен бұзуы мүмкін =\\\\).  \n  - Мультимедиа көзінің ажыратымдылығы метадеректерді қолмен емес, ойнатқыштың ішіндегі медиамен бірге жіберуге мүмкіндік беру үшін өзгертілді. Енді бізде метадеректердің жалғыз көзі бар, ол ойнатуды бастаған кезде тікелей қол жетімді.\n  - Ойнату тізімінің үзіндісін ашқан кезде жаңа метадеректер қол жетімді болған кезде қашықтағы ойнату тізімінің метадеректері жаңартылмағаны түзетілді.\n  - Пайдаланушы интерфейсінің әртүрлі түзетулері: # 1383, ойнатқыштың фондық хабарландыру басқару элементтері қазір әрқашан ақ түсті, қалқымалы ойнатқышты өшіру оңай\n- Мультисервистік жұмыс үшін қайта өңделген архитектурасы бар жаңа экстракторды қолданыңыз\n\n### Түзетулер\n- Түзетілді # 1440 жұмыс істемейтін бейне ақпарат макеті #1491 \n- #1497 тарихты қарауды түзету\n  - #1495, пайдаланушы ойнату тізіміне кіргеннен кейін метадеректерді (нобай, Бейне атауы және Саны) жаңарту. \n  - #1475, пайдаланушы егжей-тегжейлі фрагментте сыртқы ойнатқышта бейнені іске қосқан кезде дерекқорда көріністі тіркеу арқылы.\n- Қалқымалы режимде іске қосылған кезде Күту уақыты түзетілді. #1463 (түзетілген #640)\n- Негізгі бейне ойнатқышты түзету #1509 \n  - [#1412] ойыншының белсенділігі фонда болған кезде жаңа ниет алған кезде ойыншының NPE шақыратын қайталау режимі түзетілді.\n  - Егер қалқымалы терезеге рұқсат берілмесе, ойнатқышты қалқымалы терезеге кішірейту ойнатқыштың жойылуына әкелмейтіні түзетілді.\n"
  },
  {
    "path": "fastlane/metadata/android/kk/full_description.txt",
    "content": "NewPipe ешбір Google фреймворк кітапханаларын немесе YouTube API интерфейсін пайдаланбайды. Ол қажетті ақпаратты алу үшін веб-сайтты қолданады. Сондықтан бұл қолданбаны Google қызметтері орнатылмаған құрылғыларда пайдалануға болады. Сондай-ақ, NewPipe пайдалану үшін YouTube-қа тіркелу міндетті емес, бұл FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/kk/short_description.txt",
    "content": "Android жүйесіне арналған тегін жеңіл YouTube-қосымшасы.\n"
  },
  {
    "path": "fastlane/metadata/android/kn-IN/changelogs/830.txt",
    "content": "SoundCloud ಸಮಸ್ಯೆಗಳನ್ನು ಸರಿಪಡಿಸಲು SoundCloud client_id ಅನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ.\n"
  },
  {
    "path": "fastlane/metadata/android/kn-IN/changelogs/850.txt",
    "content": "ಈ ಬಿಡುಗಡೆಯ ಯೂಟ್ಯೂಬ್ ವೆಬ್‌ಸೈಟ್ ಆವೃತ್ತಿಯನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ. ಹಳೆಯ ವೆಬ್‌ಸೈಟ್ ಆವೃತ್ತಿಯು ಮಾರ್ಚ್‌ನಲ್ಲಿ ಸ್ಥಗಿತಗೊಳ್ಳಲಿದೆ ಮತ್ತು ಆದ್ದರಿಂದ ನೀವು ನ್ಯೂಪೈಪ್ ಅನ್ನು ಅಪ್‌ಗ್ರೇಡ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.\n"
  },
  {
    "path": "fastlane/metadata/android/kn-IN/full_description.txt",
    "content": "ನ್ಯೂಪೈಪ್ ಯಾವುದೇ ಗೂಗಲ್ ಫ್ರೇಮ್‌ವರ್ಕ್ ಲೈಬ್ರರಿಗಳನ್ನು ಅಥವಾ ಯೂಟ್ಯೂಬ್‌ ಏಪಿಐ ಅನ್ನು ಬಳಸುವುದಿಲ್ಲ. ಇದು ಅಗತ್ಯವಿರುವ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲು ವೆಬ್‌ಸೈಟ್ ಅನ್ನು ಮಾತ್ರ ಪಾರ್ಸ್ ಮಾಡುತ್ತದೆ. ಆದ್ದರಿಂದ ಈ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಗೂಗಲ್ ಸೇವೆಗಳನ್ನು ಸ್ಥಾಪಿಸದೆಯೇ ಸಾಧನಗಳಲ್ಲಿ ಬಳಸಬಹುದು. ಅಲ್ಲದೆ, ನ್ಯೂಪೈಪ್ ಅನ್ನು ಬಳಸಲು ನಿಮಗೆ ಯೂಟ್ಯೂಬ್ ಖಾತೆಯ ಅಗತ್ಯವಿಲ್ಲ ಮತ್ತು ಅದು FLOSS ಆಗಿದೆ.\n"
  },
  {
    "path": "fastlane/metadata/android/kn-IN/short_description.txt",
    "content": "ಆಂಡ್ರಾಯ್ಡ್‌ಗಾಗಿ ತಯಾರಿಸಿರುವ ಯೂಟ್ಯೂಬ್ ಆಧಾರಿತ ಉಚಿತ ಕಿರುತಂತ್ರಾಂಶ.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/1000.txt",
    "content": "개선됨 (Improved)\n• 재생목록 설명을 클릭하여 더 보기 / 간단히 보기 전환 가능\n• [PeerTube] `subscribeto.me` 인스턴스 링크 자동 처리\n• 기록 화면에서 단일 항목만 재생 시작\n\n수정됨 (Fixed)\n• RSS 버튼 표시 문제 수정\n• 탐색바 미리보기 충돌 수정\n• 썸네일이 없는 항목 재생목록 추가 문제 수정\n• 다운로드 대화상자가 나타나기 전에 종료되는 문제 수정\n• 관련 항목 목록의 대기열 팝업 수정\n• 재생목록에 추가 대화상자의 순서 문제 수정\n• 재생목록 북마크 항목 레이아웃 조정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/1002.txt",
    "content": "YouTube에서 스트림을 재생하지 않는 문제 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/1003.txt",
    "content": "YouTube에서 스트림을 재생하지 않는 문제 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/1004.txt",
    "content": "YouTube에서 스트림을 재생하지 않는 문제 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/1006.txt",
    "content": "# 개선됨\n타임스탬프를 클릭할 때 현재 플레이어를 유지합니다.\n가능한 경우 보류 중인 다운로드 미션을 복구하세요.\n파일 삭제 없이 다운로드를 삭제하는 옵션을 추가하세요.\n오버레이 권한: Android > R에 대한 설명 대화 상자 표시\n사운드클라우드 링크 열기 지원\n많은 작은 개선과 최적화\n\n# 고정\n7 이하의 안드로이드 버전에 대한 짧은 숫자 형식을 수정하세요.\n고스트 알림 수정\nSRT 자막 파일 수정\n고정된 수많은 충돌 사고\n\n# 개발\n내부 코드 현대화\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/1007.txt",
    "content": "YouTube에서 스트림을 재생하지 않는 문제 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/63.txt",
    "content": "### 변경점\n- 불러오기/내보내기 세팅 #1333 \n- 오버드로우 현상 개선 (성능 개선) #1371 \n- 코드 일부분 개선 #1375 \n- GDPR에 관한 모든것 업데이트 #1420\n\n### 해결된것\n- 다운로더 : 다운로드가 완료되지 않은 .giga파일을 로딩할때 발생하는 에러 해결#1407\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/64.txt",
    "content": "### 변경점\n- 불러오기/내보내기 세팅 #1333 \n- 오버드로우 현상 개선 (성능 개선) #1371 \n- 코드 일부분 개선 #1375 \n- GDPR에 관한 모든것 업데이트 #1420\n\n### 고친것\n- 다운로더 : 다운로드가 완료되지 않은 .giga파일을 로딩할때 발생하는 문제 해결#1407\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/65.txt",
    "content": "### 개선사항\n\n- 버거 메뉴 아이콘 애니메이션 비활성화 #1486\n- 다운로드 삭제 취소 #1472\n- 공유 메뉴 #1498의 다운로드 옵션\n- 길게 탭하는 메뉴 #1454에 공유 옵션 추가\n- 1354번 출구에서 메인 플레이어 최소화\n- 라이브러리 버전 업데이트 및 데이터베이스 백업 수정 #1510\n- ExoPlayer 2.8.2 업데이트 #1392\n  - 더 빠른 속도 변경을 위해 다양한 단계 크기를 지원하도록 재생 속도 제어 대화 상자 재작업.\n  - 재생 속도 제어에서 무음 중에 빨리 감기하는 토글을 추가. 이는 오디오북과 특정 음악 장르에 도움이 될 것이며 진정한 원활한 경험을 제공할 수 있음 (그리고 무음이 많은 노래를 깨뜨릴 수 있음 =\\\\)..\n  - 수동으로 수행하는 대신 플레이어 내부에서 미디어와 함께 메타데이터를 전달할 수 있도록 미디어 소스 해상도 리팩터링. 이제 단일 메타데이터 소스가 있으며 재생이 시작되면 바로 사용할 수 있음.\n  - 재생 목록 조각이 열릴 때 새 메타데이터를 사용할 수 있을 때 원격 재생 목록 메타데이터가 업데이트되지 않는 문제 수정.\n  - 다양한 UI 수정: #1383, 백그라운드 플레이어 알림 컨트롤은 이제 항상 흰색이며, 플링을 통해 팝업 플레이어를 더 쉽게 종료할 수 있음.\n- 멀티서비스를 위해 리팩토링된 아키텍처를 갖춘 새로운 추출기 사용.\n\n### 수정됨\n\n- #1440 깨진 비디오 정보 레이아웃 수정 #1491\n- 기록 수정 #1497 보기\n  - #1495, 사용자가 재생 목록에 접속하는 즉시 메타데이터(썸네일, 제목 및 동영상 개수) 업데이트\n  - #1475, 사용자가 디테일 프래그먼트의 외부 플레이어에서 비디오를 시작할 때 데이터베이스에 뷰 등록- 팝업 모드의 경우 크린 시간 초과 문제 수정. \n- 팝업 모드의 경우 화면 시간 초과 수정. #1463 (#640 수정).\n- 기본 비디오 플레이어 수정 #1509\n  - [#1412] 플레이어 활동이 백그라운드에 있는 동안 새로운 인텐트가 수신되면 반복 모드에서 플레이어 NPE가 발생하는 문제 수정.\n  - 팝업 권한이 부여되지 않은 경우 플레이어를 팝업으로 최소화하면 플레이어가 삭제되지 않는 문제 수정.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/66.txt",
    "content": "# v0.13.7의 변경 내역\n### 수정됨\n- v0.13.6의 정렬 필터 문제 수정\n\n# v0.13.6의 변경 내역\n### 개선 사항\n- 버거 메뉴 아이콘 애니메이션 비활성화 #1486\n- 다운로드 삭제 취소 #1472\n- 공유 메뉴 #1498의 다운로드 옵션\n- 길게 탭하는 메뉴 #1454에 공유 옵션 추가\n- 1354번 출구에서 메인 플레이어 최소화\n- 라이브러리 버전 업데이트 및 데이터베이스 백업 수정 #1510\n- ExoPlayer 2.8.2 업데이트 #1392\n  - 더 빠른 속도 변경을 위해 다양한 단계 크기를 지원하도록 재생 속도 제어 대화 상자를 재작업했습니다.\n  - 재생 속도 제어에서 무음 중에 빨리 감기하는 토글을 추가했습니다. 이는 오디오북과 특정 음악 장르에 도움이 될 것이며 진정한 원활한 경험을 제공할 수 있습니다(그리고 무음이 많은 노래를 깨뜨릴 수 있습니다 =\\\\).\n  - 수동으로 수행하는 대신 플레이어 내부에서 미디어와 함께 메타데이터를 전달할 수 있도록 미디어 소스 해상도를 리팩터링했습니다. 이제 단일 메타데이터 소스가 있으며 재생이 시작되면 바로 사용할 수 있습니다.\n  - 재생 목록 조각이 열릴 때 새 메타데이터를 사용할 수 있을 때 원격 재생 목록 메타데이터가 업데이트되지 않는 문제를 수정했습니다.\n  - 다양한 UI 수정: #1383, 백그라운드 플레이어 알림 컨트롤은 이제 항상 흰색이며, 플링을 통해 팝업 플레이어를 더 쉽게 종료할 수 있습니다.\n- 멀티서비스를 위해 리팩토링된 아키텍처를 갖춘 새로운 추출기 사용\n\n### 수정\n- #1440 깨진 비디오 정보 레이아웃 수정 #1491\n- 기록 수정 #1497 보기\n  - #1495, 사용자가 재생 목록에 액세스하는 즉시 메타데이터(썸네일, 제목 및 동영상 개수)를 업데이트합니다.\n  - #1475, 사용자가 디테일 프래그먼트의 외부 플레이어에서 비디오를 시작할 때 데이터베이스에 뷰를 등록합니다.\n- 팝업 모드의 경우 크린 시간 초과 문제를 수정합니다. #1463 (고정 #640)\n- 기본 비디오 플레이어 수정 #1509\n  - [#1412] 플레이어 활동이 백그라운드에 있는 동안 새로운 인텐트가 수신되면 반복 모드에서 플레이어 NPE가 발생하는 문제를 수정했습니다.\n  - 팝업 권한이 부여되지 않은 경우 플레이어를 팝업으로 최소화하면 플레이어가 삭제되지 않는 문제가 해결되었습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/68.txt",
    "content": "# v0.14.1의 변경 사항\n\n### 수정됨\n- 비디오 URL #1659를 해독하지 못하던 문제 수정\n- 설명 링크가 잘 추출되지 않던 문제 수정 #1657\n\n# v0.14.0의 변경 사항\n\n### 새로운\n- 새로운 서랍 디자인 #1461\n- 새로운 맞춤형 첫 페이지 #1461\n\n### 개선 사항\n- 재작업된 제스처 컨트롤 #1604\n- 팝업 플레이어를 닫는 새로운 방법 #1597\n\n### 수정됨\n- 구독 횟수를 확인할 수 없을 때 발생하는 오류를 수정합니다. #1649를 닫습니다.\n  - 이 경우 \"구독자 수를 확인할 수 없음\"을 표시합니다.\n- YouTube 재생목록이 비어 있을 때 NPE 수정\n- SoundCloud의 키오스크에 대한 빠른 수정\n- 리팩터링 및 버그 수정 #1623\n  - 순환 검색 결과 #1562 수정\n  - 탐색 막대가 정적으로 배치되지 않은 문제 수정\n  - YT Premium 비디오가 올바르게 차단되지 않는 문제 수정\n  - 가끔 비디오가 로드되지 않는 문제 수정(DASH 구문 분석으로 인해)\n  - 동영상 설명의 링크 수정\n  - 누군가 외부 SD 카드에 다운로드하려고 하면 경고 표시\n  - 아무것도 표시되지 않음 예외 트리거 보고서 수정\n  - Android 8.1용 백그라운드 플레이어에는 썸네일이 표시되지 않습니다. [여기 참조](https://github.com/TeamNewPipe/NewPipe/issues/943)\n- 방송수신기 등록 문제 수정. #1641을 닫습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/69.txt",
    "content": "### 새로운\n- 길게 탭하여 구독정보 삭제 및 공유 #1516\n- 태블릿 UI 및 그리드 목록 레이아웃 #1617\n\n### 개선 사항\n- 마지막으로 사용된 화면 비율 #1748을 저장하고 다시 로드합니다.\n- 전체 비디오 이름 #1771을 사용하여 다운로드 활동에서 선형 레이아웃을 활성화합니다.\n- 구독 탭 #1516 내에서 직접 구독 삭제 및 공유\n- 재생 대기열이 이미 종료된 경우 대기열에 추가하면 비디오 재생이 시작됩니다. #1783\n- 볼륨 및 밝기 제스처에 대한 별도 설정 #1644\n- 현지화 #1792 지원 추가\n\n### 수정\n- 에 대한 시간 구문 분석을 수정합니다. 형식이므로 핀란드에서 NewPipe를 사용할 수 있습니다.\n- 구독 수 수정\n- API 28+ 장치에 대한 포그라운드 서비스 권한 추가 #1830\n\n### 알려진 버그\n- Android P에서는 재생 상태를 저장할 수 없습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/70.txt",
    "content": "주의: 이 버전은 아마도 지난 버전과 마찬가지로 버그페스트일 것입니다. 그러나 17. 이후 전체 종료로 인해 깨진 버전이 버전이 없는 것보다 낫습니다. 오른쪽? ̅\\_(ツ)_/̅\n\n### 개선 사항\n* 이제 다운로드한 파일을 한 번의 클릭으로 열 수 있습니다 #1879\n* 안드로이드 4.1 - 4.3 #1884에 대한 지원 중단\n* 이전 플레이어 #1884 제거\n* 스트림을 오른쪽으로 스와이프하여 현재 재생 대기열에서 스트림을 제거합니다. #1915\n* 새 스트림이 수동으로 대기열에 추가되면 자동 대기열에 추가된 스트림을 제거합니다. #1878\n* 다운로드를 위한 후처리 및 누락된 기능 구현 #1759 by @kapodamy\n  * 후처리 인프라\n  * 적절한 오류 처리 \"인프라\"(다운로더용)\n  * 여러 다운로드 대신 대기열\n  * 직렬화된 보류 중인 다운로드(`.giga` 파일)를 앱 데이터로 이동\n  * 최대 다운로드 재시도 구현\n  * 적절한 멀티스레드 다운로드 일시중지\n  * 모바일 네트워크로 전환할 때 다운로드 중지(작동하지 않음, 두 번째 항목 참조)\n  * 다음 다운로드를 위해 스레드 수를 저장하세요\n  * 많은 불일치가 수정되었습니다.\n\n### 수정됨\n* 기본 해상도가 최고 및 제한된 모바일 데이터 해상도 #1835로 설정된 경우 충돌 수정\n* 팝업 플레이어 충돌 수정 #1874\n* 백그라운드 플레이어를 열려고 할 때 NPE #1901\n* 자동 대기열이 활성화된 경우 새 스트림을 삽입하는 문제 수정 #1878\n* 암호 해독 폐쇄 문제 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/71.txt",
    "content": "### 개선 사항\n* GitHub 빌드에 대한 앱 업데이트 알림 추가(@krtkush의 #1608)\n* 다운로더의 다양한 개선 사항(@kapodamy의 #1944):\n  * 누락된 흰색 아이콘을 추가하고 하드코어 방식을 사용하여 아이콘 색상을 변경합니다.\n  * 반복자가 초기화되었는지 확인하세요(수정 #2031)\n  * 새 먹서에서 \"사후 처리 실패\" 오류가 있는 다운로드 재시도 허용\n  * 비동기 비디오 및 오디오 스트림을 수정하는 새로운 MPEG-4 먹서(#2039)\n\n### 수정됨\n* YouTube 실시간 스트리밍은 잠시 후에 재생이 중지됩니다(@yausername의 #1996).\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/730.txt",
    "content": "# 고정\n- 핫픽스 복호화 기능 오류가 다시 발생했습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/740.txt",
    "content": "<h4>개선 사항</h4>\n<ul>\n<li>댓글의 링크를 클릭 가능하게 만들고 텍스트 크기를 늘립니다.</li>\n<li>댓글의 타임스탬프 링크 클릭</li>\n<li>최근 선택한 상태를 기준으로 기본 탭 표시</li>\n<li>재생목록 창에서 '배경'을 길게 클릭하면 대기열에 재생목록 추가</li>\n<li>URL이 아닌 공유 텍스트 검색</li>\n<li>기본 비디오 플레이어에 \"현재 시간 공유\" 버튼 추가</li>\n<li>동영상 대기열이 완료되면 기본 플레이어에 닫기 버튼 추가</li>\n<li>동영상 목록 항목의 길게 누르기 메뉴에 \"백그라운드에서 직접 재생\" 추가</li>\n<li>Play/Enqueue 명령에 대한 영어 번역 개선</li>\n<li>작은 성능 개선</li>\n<li>사용하지 않는 파일 제거</li>\n<li>ExoPlayer를 2.9.6으로 업데이트</li>\n<li>Invidious 링크에 대한 지원 추가</li>\n</ul>\n<h4>수정됨</h4>\n<ul>\n<li>댓글 및 관련 스트림이 비활성화된 고정 스크롤</li>\n<li>CheckForNewAppVersionTask가 실행되어서는 안 될 때 실행되는 문제를 수정했습니다.</li>\n<li>YouTube 구독 가져오기 수정: URL이 잘못된 구독은 무시하고 제목이 비어 있는 구독은 유지</li>\n<li>잘못된 YouTube URL 수정: 서명 태그 이름이 스트림 로드를 방해하는 '서명'이 아닐 수도 있습니다.</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/750.txt",
    "content": "새로운\n재생 재개 #2288\n• 지난번에 중단한 스트림 재개\n다운로더 개선 사항 #2149\n• 저장소 액세스 프레임워크를 사용하여 외부 SD 카드에 다운로드 저장\n• 새로운 mp4 먹서\n• 선택적으로 다운로드를 시작하기 전에 다운로드 디렉터리를 변경합니다.\n• 종량제 네트워크를 존중합니다.\n\n\n향상\n• gema 문자열 #2295 제거됨\n• 활동 수명주기 동안 (자동)회전 변경 처리 #2444\n• 길게 누르기 메뉴를 일관성있게 만들기 #2368\n\n결정된\n• 선택한 자막 트랙 이름이 표시되지 않는 문제 수정 #2394\n• 앱 업데이트 확인 실패 시 충돌 방지(GitHub 버전) #2423\n• 다운로드가 99.9%에서 멈추는 현상 수정 #2440\n• 재생 대기열 메타데이터 업데이트 #2453\n• [SoundCloud] 재생 목록을 로드할 때 발생하는 충돌 수정 TeamNewPipe/NewPipeExtractor#170\n• [YouTube] 고정 기간은 TeamNewPipe/NewPipeExtractor#177로 파싱할 수 없습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/760.txt",
    "content": "0.17.1의 변경 사항\n\n새로운\n• 태국어 현지화\n\n\n향상\n• 재생목록을 다시 길게 누르는 메뉴에 여기서 재생 시작 작업 추가 #2518\n• SAF/레거시 파일 선택기 #2521용 스위치 추가\n\n결정된\n• 앱 전환 시 다운로드 보기에서 버튼이 사라지는 문제 수정 #2487\n• 시청 기록이 비활성화되어 있어도 고정 재생 위치가 저장됩니다.\n• 목록 보기의 재생 위치로 인해 성능이 저하되는 문제 수정 #2517\n• [추출기] ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 수정\n• [Extractor] [YouTube] 결과에 재생목록이 있을 때 일반 검색 오류 수정 TeamNewPipe/NewPipeExtractor#185\n\n\n\n0.17.0의 변경 사항\n\n새로운\n재생 재개 #2288\n• 지난번에 중단한 스트림 재개\n다운로더 개선 사항 #2149\n• 저장소 액세스 프레임워크를 사용하여 외부 SD 카드에 다운로드 저장\n• 새로운 mp4 먹서\n• 선택적으로 다운로드를 시작하기 전에 다운로드 디렉터리를 변경합니다.\n• 종량제 네트워크를 존중합니다.\n\n\n향상\n• gema 문자열 #2295 제거됨\n• 활동 수명주기 동안 (자동)회전 변경 처리 #2444\n• 길게 누르기 메뉴를 일관성있게 만들기 #2368\n\n결정된\n• 선택한 자막 트랙 이름이 표시되지 않는 문제 수정 #2394\n• 앱 업데이트 확인 실패 시 충돌 방지(GitHub 버전) #2423\n• 다운로드가 99.9%에서 멈추는 현상 수정 #2440\n• 재생 대기열 메타데이터 업데이트 #2453\n• [SoundCloud] 재생 목록을 로드할 때 발생하는 충돌 수정 TeamNewPipe/NewPipeExtractor#170\n• [YouTube] 고정 기간은 TeamNewPipe/NewPipeExtractor#177로 파싱할 수 없습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/770.txt",
    "content": "0.17.2의 변경 사항\n\n고치다\n• 사용할 수 있는 동영상이 없는 문제 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/780.txt",
    "content": "0.17.3의 변경 사항\n\n향상\n• 재생 상태를 지우는 옵션 추가 #2550\n• 파일 선택기에 숨겨진 디렉터리 표시 #2591\n• `invidio.us` 인스턴스의 URL이 NewPipe #2488로 열리도록 지원합니다.\n• 'music.youtube.com' URL에 대한 지원 추가 TeamNewPipe/NewPipeExtractor#194\n\n결정된\n• [YouTube] 'java.lang.IllegalArgumentException #192 수정\n• [YouTube] 실시간 스트림이 작동하지 않는 문제 수정 TeamNewPipe/NewPipeExtractor#195\n• 스트림을 다운로드할 때 Android Pie의 성능 문제 수정 #2592\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/790.txt",
    "content": "향상\n• 시각 장애인의 접근성을 높이기 위해 더 많은 제목을 추가합니다. #2655\n• 다운로드 폴더 설정 언어를 보다 일관되고 덜 모호하게 만듭니다. #2637\n\n결정된\n• 블록의 마지막 바이트가 다운로드되었는지 확인 #2646\n• 비디오 세부 정보 조각 #2672의 스크롤 문제를 해결했습니다.\n• 이중 검색 지우기 상자 애니메이션을 하나로 제거 #2695\n• [SoundCloud] client_id 추출 수정 #2745\n\n개발\n• NewPipeExtractor에서 상속된 누락된 종속성을 NewPipe #2535에 추가합니다.\n• AndroidX #2685로 마이그레이션\n• ExoPlayer 2.10.6 #2697, #2736으로 업데이트\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/800.txt",
    "content": "새로운\n• P2P 없이 PeerTube 지원(#2201)[베타]:\n  ◦ PeerTube 인스턴스에서 비디오 시청 및 다운로드\n  ◦ 전체 PeerTube 세계에 액세스하려면 설정에 인스턴스를 추가하세요.\n  ◦ 특정 인스턴스에 액세스할 때 Android 4.4 및 7.1에서 SSL 핸드셰이크에 문제가 있어 네트워크 오류가 발생할 수 있습니다.\n\n• 다운로더(#2679):\n  ◦ 다운로드 ETA 계산\n  ◦ opus(webm 파일)를 ogg로 다운로드\n  ◦ 오랜 일시 중지 후 다운로드를 재개하려면 만료된 다운로드 링크를 복구하세요.\n\n향상\n• KioskFragment가 선호하는 콘텐츠 국가의 변경 사항을 인식하고 모든 기본 탭의 성능을 향상시킵니다. #2742\n• 추출기 #2713에서 새로운 현지화 및 다운로더 구현을 사용합니다.\n• '기본 키오스크' 문자열을 번역 가능하게 만듭니다.\n• 검은색 테마용 검은색 탐색 모음 #2569\n\n결정된\n• 팝업플레이어 이동 중 다른 손가락을 놓으면 팝업플레이어가 이동되지 않는 버그 수정 #2772\n• 업로더가 없는 재생목록을 허용하고 이 문제 #2724, TeamNewPipe/NewPipeExtractor#219와 관련된 충돌을 해결합니다.\n• Android 4.4 기기(API 19/KitKat)에서 TLS1.1/1.2를 활성화하여 MediaCCC 및 일부 PeerTube 인스턴스와의 TLS 핸드셰이크 수정 #2792\n• [SoundCloud] client_id 추출 수정 TeamNewPipe/NewPipeExtractor#217\n• [SoundCloud] 오디오 스트림 추출 수정\n\n개발\n• ExoPlayer를 2.10.8 #2791, #2816으로 업데이트\n• Gradle을 3.5.1로 업데이트하고 Kotlin 지원 #2714를 추가합니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/810.txt",
    "content": "새로운\n• 백그라운드에서 재생할 때 잠금 화면에 동영상 미리보기 이미지 표시\n\n향상\n• 배경/팝업 버튼을 길게 누르면 대기열에 로컬 재생 목록 추가\n• 기본 페이지 탭을 스크롤 가능하게 만들고 탭이 하나만 있는 경우 숨깁니다.\n• 백그라운드 플레이어의 알림 썸네일 업데이트 양 제한\n• 빈 로컬 재생목록에 더미 썸네일 추가\n• *.webm 대신 *.opus 파일 확장자를 사용하고 다운로드 드롭다운에서 'WebM Opus' 대신 형식 라벨에 'opus'를 표시합니다.\n• '다운로드'에 다운로드한 파일이나 다운로드 기록을 삭제하는 버튼 추가\n• [YouTube] /c/shortened_url 채널 링크에 지원 추가\n\n결정된\n• NewPipe에 비디오를 공유하고 해당 스트림을 직접 다운로드할 때 여러 문제가 해결되었습니다.\n• 생성 스레드 외부에서 플레이어 액세스 수정\n• 검색결과 페이지 고정\n• [YouTube] Null 전환으로 인해 NPE가 발생하는 문제 수정\n• [YouTube] invidio.us URL을 열 때 댓글 보기 문제를 해결했습니다.\n• [SoundCloud] client_id 업데이트됨\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/820.txt",
    "content": "YouTube를 사용할 수 없게 만드는 복호화 함수 이름 정규식을 수정했습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/830.txt",
    "content": "SoundCloud 문제를 해결하기 위해 SoundCloud client_id를 업데이트했습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/840.txt",
    "content": "새로운 사항\n• 앱 언어를 변경하는 언어 선택기 추가\n• 플레이어 접을 수 있는 메뉴에 Kodi로 보내기 버튼 추가\n• 길게 눌러서 댓글을 복사하는 기능 추가\n\n개선된 사항\n• ReCaptcha 활동 수정 및 획득한 쿠키를 올바르게 저장\n• 설정에서 시청 기록이 활성화되지 않은 경우 점 메뉴 대신 서랍 및 기록 숨기기 버튼 추가\n• Android 6 이상에서 설정에서 다른 앱 위에 표시 권한 요청 올바르게 수행\n• BookmarkFragment에서 길게 클릭하여 로컬 재생 목록 이름 변경\n• 다양한 PeerTube 개선\n• 여러 영어 소스 문자열 개선\n\n수정된 사항\n• \"앱 전환 시 최소화\" 옵션이 활성화되고 NewPipe가 최소화되면 일시 중지되지만 플레이어가 다시 시작되는 문제 수정\n• 제스처의 초기 밝기 값 수정\n• 모든 줄 바꿈이 포함되지 않은 .srt 자막 다운로드 수정\n• 일부 Android 5 기기가 CTF 호환이 아니기 때문에 SD 카드로 다운로드가 실패하는 문제 수정\n• Android KitKat에서 다운로드 수정\n• 손상된 비디오 .mp4 파일이 오디오 파일로 인식되는 문제 수정\n• 여러 지역화 수정 문제, 잘못된 중국어 언어 코드 포함\n• [YouTube] 설명의 타임스탬프를 다시 클릭할 수 있음\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/850.txt",
    "content": "이 릴리스에서는 YouTube 웹사이트 버전이 업데이트되었습니다. 이전 웹사이트 버전은 3월에 중단되므로 NewPipe를 업그레이드해야 합니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/860.txt",
    "content": "개선된 기능\n• 피치와 템포가 언후크되었는지 여부를 저장하고 복원\n• 플레이어에서 디스플레이 컷아웃 지원\n• 라운드 뷰 및 구독자 수\n• YouTube를 최적화하여 데이터를 덜 사용\n\n이 릴리스에서는 YouTube 관련 버그 15개 이상이 수정되었습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/870.txt",
    "content": "이것은 NewPipe를 업데이트하여 SoundCloud를 다시 큰 번거로움 없이 사용할 수 있도록 하는 핫픽스 릴리스입니다.\nSoundCloud의 v2 API가 이제 추출기에서 사용되고 잘못된 클라이언트 ID 감지가 개선되었습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/900.txt",
    "content": "새로운 기능\n• 구독 그룹 및 정렬된 피드\n• 플레이어의 음소거 버튼\n\n개선된 기능\n• NewPipe에서 music.youtube.com 및 media.ccc.de 링크 열기 허용\n• 모양에서 콘텐츠로 두 가지 설정 재배치\n• 부정확한 탐색이 활성화된 경우 5, 15, 25초 탐색 옵션 숨기기\n\n수정된 기능\n• 일부 WebM 비디오 탐색 불가\n• Android P에서 데이터베이스 백업\n• 다운로드한 파일을 공유할 때 충돌\n• 수많은 YouTube 추출 문제 등...\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/910.txt",
    "content": "일부 드문 경우에 NewPipe가 시작되지 않는 고정 데이터베이스 마이그레이션이 수정되었습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/920.txt",
    "content": "개선된 사항\n\n• 스트림 그리드 항목에 업로드 날짜 및 조회수 추가\n• 서랍 헤더 레이아웃 개선\n\n수정된 사항\n\n• API 19에서 충돌을 일으키는 음소거 버튼 수정\n• 긴 1080p 60fps 비디오 다운로드 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/930.txt",
    "content": "새로운 사항\n• YouTube Music에서 검색\n• 기본 Android TV 지원\n\n개선된 사항\n• 로컬 재생 목록에서 시청한 모든 비디오를 제거하는 기능 추가\n• 아직 콘텐츠가 지원되지 않을 때 충돌 대신 메시지 표시\n• 핀치 제스처로 팝업 플레이어 크기 조정 개선\n• 채널의 배경 및 팝업 버튼에서 길게 누르면 스트림 대기열에 추가\n• 서랍 헤더 제목의 크기 처리 개선\n\n수정된 사항\n• 연령 제한 콘텐츠 설정이 작동하지 않는 문제 수정\n• 특정 종류의 reCAPTCHA 수정\n• 재생 목록이 `null`인 동안 북마크를 열 때 충돌 수정\n• 네트워크 관련 예외 감지 수정\n• 구독 조각에서 그룹 정렬 버튼 표시 수정\n\n및 기타\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/940.txt",
    "content": "새로운 사항\n• SoundCloud 댓글 지원 추가\n• YouTube 제한 모드 설정 추가\n• PeerTube 부모 채널 세부 정보 표시\n\n개선된 사항\n• 지원되는 서비스에만 Kore 버튼 표시\n• NavigationBar 또는 StatusBar에서 시작하는 플레이어 제스처 차단\n• 서비스 색상에 따라 재시도 및 구독 버튼 배경색 변경\n\n수정된 사항\n• 다운로드 대화 상자 정지 수정\n• 브라우저에서 열기 버튼이 이제 브라우저에서 실제로 열림\n• 비디오 열기 및 \"이 스트림을 재생할 수 없습니다\" 오류 수정\n\n및 기타\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/950.txt",
    "content": "이 릴리스는 세 가지 작은 수정 사항을 제공합니다.\n• Android 10+에서 스토리지 접속 수정\n• 키오스크 열기 수정\n• 긴 비디오의 지속 시간 구문 분석 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/951.txt",
    "content": "새로운 사항\n• 피드 그룹 대화 상자에 구독 선택기 검색 추가\n• 피드 그룹 대화 상자에 필터를 추가하여 그룹화되지 않은 구독만 표시\n• 메인 페이지에 재생 목록 탭 추가\n• 백그라운드/팝업 플레이어 대기열에서 빨리 감기/되감기\n• 검색 제안 표시: 다음을 의미하고 결과를 표시\n\n개선된 사항\n• 멀티플렉싱된 파일에 쓰기 애플리케이션 메타데이터 삭제\n• 실패한 스트림을 대기열에서 제거하지 않음\n• 툴바 색상과 일치하도록 상태 표시줄 색상 업데이트\n\n수정된 사항\n• 부동 소수점 누적 오류로 인한 오디오/비디오 비동기화 수정\n• [PeerTube] 삭제된 댓글 처리\n\n및 기타\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/952.txt",
    "content": "개선된 사항\n• 유튜브에서만 가능했던 자동재생 기능이 이제 모든 서비스에서 사용가능합니다\n\n고쳐진점\n• 유튜브의 새로운 컨티뉴어스를 지원하여 관련된 스트림과 연관된 문제를 고쳤습니다\n• 연령제한된 유튜브 비디오 기능을 고쳤습니다\n• [안드로이드 TV] 오래 지속되는 포커스 하이라이트 오버레이를 고쳤습니다\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/953.txt",
    "content": "유튜브의 복호화 추출 기능 수정.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/954.txt",
    "content": "• 새로운 애플리케이션 워크플로: 세부 정보 페이지에서 비디오 재생, 아래로 스와이프하여 플레이어 최소화\n• MediaStyle 알림: 알림에서 사용자 정의 가능한 작업, 성능 개선\n• 데스크톱 앱으로 NewPipe를 사용할 때 기본 크기 조정\n\n• 지원되지 않는 URL 토스트의 경우 열린 옵션이 있는 대화 상자 표시\n• 원격 토스트를 가져올 수 없는 경우 검색 제안 환경 개선\n• 기본 비디오 품질을 720p60(앱 내 플레이어) 및 480p(팝업 플레이어)로 높임\n\n• 수많은 버그 수정 및 기타\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/955.txt",
    "content": "[Youtube] 일부 사용자의 검색 수정\n[Youtube] 복호화의 예외 수정\n[SoundCloud] 이제 URL이 올바르게 분석됩니다\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/956.txt",
    "content": "[유튜브] 비디오 로딩시의 충돌 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/957.txt",
    "content": "• 특정 인큐 동작을 하나로 통합\n• 플레이어를 닫는 두 손가락 제스처\n• reCAPTCHA 쿠키 지우기 허용\n• 알림에 색상을 입히지 않는 옵션\n• 무한 버퍼링, NewPipe에 공유할 때의 버그 동작 및 기타 불일치를 수정하기 위해 비디오 세부 정보가 열리는 방식 개선\n• YouTube 비디오 속도 향상 및 연령 제한 비디오 수정\n• 빨리 감기/되감기 시 충돌 수정\n• 축소판 그림을 끌어서 목록을 재정렬하지 않음\n• 팝업 속성을 항상 기억\n• Santali 언어 추가\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/958.txt",
    "content": "새롭고 개선된 사항:\n• 잠금 화면에서 썸네일을 숨기는 옵션 다시 추가\n• 피드 새로 고침을 위해 당김\n• 로컬 목록을 가져올 때 성능 개선\n\n수정된 사항:\n• RAM에서 제거된 후 NewPipe를 시작할 때 발생하는 충돌 수정\n• 인터넷에 연결되어 있지 않을 때 시작 시 발생하는 충돌 수정\n• 밝기 및 볼륨 제스처 설정에 대한 수정\n• [YouTube] 긴 재생 목록 수정\n\n기타:\n• 코드 정리 및 여러 가지 내부 개선 사항\n• 종속성 업데이트\n• 번역 업데이트\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/959.txt",
    "content": "오류 보고자를 연 후 무한 루프가 발생하는 문제를 해결.\nNewPipe에서 자동으로 열 수 있는 PeerTube 인스턴스 목록을 업데이트.\n번역 업데이트.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/960.txt",
    "content": "• 설정의 데이터베이스 내보내기 설명이 향상되었습니다.\n• 유튜브 코멘트 파싱이 수정되었습니다.\n• media.ccc.de 서비스 표기명이 수정되었습니다.\n• 번역이 업데이트되었습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/961.txt",
    "content": "• [YouTube] 믹스 지원\n• [YouTube] 공공 방송사와 Covid-19에 대한 정보 표시\n• [media.ccc.de] 최신 비디오 추가\n• 소말리아어 번역 추가\n\n• 많은 내부 개선 사항\n\n• 플레이어 내에서 비디오 공유 수정\n• 빈 ReCaptcha 웹뷰 수정\n• 목록에서 스트림을 제거할 때 발생하는 충돌 수정\n• [PeerTube] 관련 스트림 수정\n• [YouTube] YouTube Music 검색 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/962.txt",
    "content": "media.ccc.de 서비스에 \"최근\" 비디오를 추가했습니다.\nmedia.ccc.de 서비스에 라이브 스트림을 추가했고 라이브 스트림 지원도 추가했습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/963.txt",
    "content": "• [YouTube] 채널 이어가기 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/964.txt",
    "content": "• 플레이어 컨트롤에 챕터 지원 추가\n• [PeerTube] 세피아 검색 추가\n• 비디오 세부 정보 보기에 공유 버튼 다시 추가 및 스트림 설명 탭 레이아웃으로 이동\n• 밝기 제스처가 비활성화된 경우 밝기 복원 비활성화\n• Kodi에서 비디오를 재생하는 목록 항목 추가\n• 일부 기기에서 기본 브라우저가 설정되지 않은 경우 충돌 수정 및 공유 대화 상자 개선\n• 전체 화면 플레이어에서 하드웨어 공간 버튼으로 재생/일시 중지 전환\n• [media.ccc.de] 다양한 수정 및 개선\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/965.txt",
    "content": "채널 그룹을 재정렬할 때 발생하는 충돌을 수정했습니다.\n채널 및 재생 목록에서 더 많은 YouTube 비디오를 가져오는 문제를 수정했습니다.\nYouTube 댓글을 가져오는 문제를 수정했습니다.\nYouTube URL에서 /watch/, /v/ 및 /w/ 하위 경로에 대한 지원을 추가했습니다.\nSoundCloud 클라이언트 ID 및 지역 제한 콘텐츠 추출 문제를 수정했습니다.\n북부 쿠르드어 현지화를 추가했습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/966.txt",
    "content": "새로운 사항:\n• 새로운 서비스 추가: Bandcamp\n\n개선된 사항:\n• 앱이 기기 테마를 따르도록 하는 옵션 추가\n• 개선된 오류 패널을 표시하여 일부 충돌 방지\n• 콘텐츠를 사용할 수 없는 이유에 대한 자세한 정보 표시\n• 하드웨어 공간 버튼이 재생/일시 중지 트리거\n• \"다운로드 시작됨\" 토스트 표시\n\n수정된 사항:\n• 백그라운드에서 재생하는 동안 비디오 세부 정보에서 매우 작은 썸네일 수정\n• 최소화된 플레이어에서 빈 제목 수정\n• 마지막 크기 조정 모드가 올바르게 복원되지 않는 문제 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/967.txt",
    "content": "EU에서 YouTube가 제대로 작동하지 않는 문제를 수정했습니다. 이는 NewPipe가 CONSENT 쿠키를 설정해야 하는 새로운 쿠키 및 개인정보 동의 시스템으로 인해 발생했습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/968.txt",
    "content": "길게 누르기 메뉴에 채널 세부 정보 옵션 추가.\n재생 목록 인터페이스에서 재생 목록 이름을 바꾸는 기능 추가.\n비디오가 버퍼링되는 동안 사용자가 일시 정지할 수 있도록 허용.\n흰색 테마를 다듬음.\n더 큰 글꼴 크기를 사용할 때 겹치는 글꼴 수정.\nFormuler 및 Zephier 기기에서 비디오가 나오지 않는 문제 수정.\n다양한 충돌 수정.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/969.txt",
    "content": "• 외부 저장소에 설치 허용\n• [Bandcamp] 스트림에서 처음 세 개의 댓글 표시 지원 추가\n• 다운로드가 시작될 때만 '다운로드가 시작되었습니다' 토스트 표시\n• 쿠키가 저장되지 않은 경우 reCaptcha 쿠키 설정 안 함\n• [플레이어] 캐시 성능 개선\n• [플레이어] 플레이어가 자동으로 재생되지 않는 문제 수정\n• 다운로드 삭제 시 이전 스낵바 해제\n• 목록에 없는 개체 삭제 시도 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/970.txt",
    "content": "새로운 사항\n• 설명 아래에 콘텐츠 메타데이터(태그, 카테고리, 라이선스 등) 표시\n• 원격(로컬이 아닌) 재생 목록에 \"채널 세부 정보 표시\" 옵션 추가\n• 길게 누르면 메뉴에 \"브라우저에서 열기\" 옵션 추가\n\n수정된 사항\n• 비디오 세부 정보 페이지에서 회전 충돌 수정\n• 플레이어에서 \"Kodi로 재생\" 버튼이 항상 Kore를 설치하라는 메시지를 표시하도록 수정\n• 가져오기 및 내보내기 경로 설정 수정 및 개선\n• [YouTube] 댓글 좋아요 수 수정\n그리고 훨씬 더 많은 기능\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/971.txt",
    "content": "핫픽스\n• 재버퍼링 후 재생을 위한 버퍼 증가\n• 플레이어에서 재생 대기열 아이콘을 클릭할 때 태블릿 및 TV에서 발생하는 충돌 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/972.txt",
    "content": "새로운 사항\n설명에서 타임스탬프와 해시태그 인식\n수동 태블릿 모드 설정 추가\n피드에서 재생된 항목을 숨기는 기능 추가\n\n개선된 사항\n저장소 액세스 프레임워크 제대로 지원\n사용할 수 없는 채널과 종료된 채널의 오류 처리 개선\nAndroid 10 이상 사용자를 위한 Android 공유 시트에 이제 콘텐츠 제목이 표시됩니다.\nInvidious 인스턴스 업데이트 및 파이프 링크 지원\n\n수정된 사항\n[YouTube] 연령 제한 콘텐츠\n선택 대화 상자를 열 때 창 예외가 누출되는 것을 방지\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/973.txt",
    "content": "핫픽스\n• 한 행에 들어갈 수 있는 비디오 수를 잘못 계산하여 그리드 레이아웃에서 썸네일과 제목이 잘리는 문제 수정\n• 공유 메뉴에서 열면 아무것도 하지 않고 다운로드 대화 상자가 사라지는 문제 수정\n• Storage Access Framework 파일 선택기와 같은 외부 활동을 여는 것과 관련된 라이브러리 업데이트\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/974.txt",
    "content": "핫픽스\n• YouTube 제한으로 인한 버퍼링 문제 해결\n• YouTube 댓글 추출 및 비활성화된 댓글로 인한 충돌 해결\n• YouTube 음악 검색 해결\n• PeerTube 라이브 스트림 해결\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/975.txt",
    "content": "새로운 사항\n• 검색하는 동안 썸네일 미리보기 표시\n• 비활성화된 댓글 감지\n• 피드 항목을 시청한 것으로 표시 허용\n• 댓글 하트 표시\n\n개선된 사항\n• 메타데이터 및 태그 레이아웃 개선\n• UI 구성 요소에 서비스 색상 적용\n\n수정된 사항\n• 미니 플레이어의 썸네일 수정\n• 중복 대기열 항목에서 끝없는 버퍼링 수정\n• 회전 및 더 빠른 닫기와 같은 일부 플레이어 수정\n• 백그라운드에서 로드된 상태로 유지되는 ReCAPTCHA 수정\n• 피드를 새로 고칠 때 클릭 비활성화\n• 일부 다운로더 충돌 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/976.txt",
    "content": "• 전체 화면에서 플레이어를 직접 여는 옵션 추가\n• 표시할 검색 제안 유형 선택 허용\n• 어두운 테마가 이제 더 어둡고 어두운 시작 화면 추가\n• 원치 않는 파일을 회색으로 표시하는 파일 선택기 개선\n• YouTube 구독 가져오기 수정\n• 스트림을 재생하려면 재생 버튼을 다시 탭해야 함\n• 오디오 세션 닫기 수정\n• [Android TV] DPad 사용 시 긴 탐색 막대 점프 수정\n\n추가 변경 사항을 보려면 아래 링크 탭에서 변경 로그(및 블로그 게시물)를 확인하세요.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/977.txt",
    "content": "• 길게 누르기 메뉴에 \"다음 재생\" 버튼 추가\n• 인텐트 필터에 YouTube shorts 경로 접두사 추가\n• 설정 가져오기 수정\n• 대기열 화면에서 플레이어 버튼과 탐색 막대 위치 바꾸기\n• MediasessionManager와 관련된 다양한 수정\n• 비디오 종료 후 탐색 막대가 완료되지 않는 문제 수정\n• RealtekATV에서 미디어 터널링 비활성화\n• 최소화된 플레이어 버튼 클릭 가능 영역 확장\n\n추가 변경 사항을 보려면 아래 링크 탭에서 변경 로그(및 블로그 게시물)를 확인하세요.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/978.txt",
    "content": "새로운 NewPipe 버전에 대한 체크 실행을 수정했습니다. 이 체크는 때때로 너무 일찍 실행되어 앱 충돌로 이어졌습니다. 이제 수정되어야 합니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/979.txt",
    "content": "- 재생 재개 수정\n- NewPipe가 새 버전을 확인해야 하는지 여부를 결정하는 서비스가 백그라운드에서 시작되지 않도록 개선\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/980.txt",
    "content": "새로운 사항\n• 공유 메뉴에 \"재생목록에 추가\" 옵션 추가\n• y2u.be 및 PeerTube 짧은 링크 지원 추가\n\n개선된 사항\n• 재생 속도 제어를 더 컴팩트하게 만들기\n• 피드에서 이제 새 항목을 강조 표시\n• 피드의 \"시청한 항목 표시\" 옵션이 이제 저장됨\n\n수정된 사항\n• YouTube 좋아요 및 싫어요 추출 수정\n• 백그라운드에서 돌아온 후 자동 재생 수정\n및 기타 여러 사항\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/981.txt",
    "content": "Android 11+에서 버퍼링 후 재생 재개 실패를 해결하기 위해 MediaParser 지원을 제거했습니다.\n재생 문제를 해결하기 위해 Philips QM16XE에서 미디어 터널링을 비활성화했습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/982.txt",
    "content": "YouTube에서 스트림이 재생되지 않는 문제를 해결했습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/983.txt",
    "content": "새로운 더블 탭 탐색 UI 및 동작 추가\n설정 검색 가능\n고정된 댓글을 강조 표시\nFSFE의 PeerTube 인스턴스에 앱으로 열기 지원 추가\n오류 알림 추가\n플레이어 변경 시 첫 번째 대기열 항목 재생 수정\n실시간 스트리밍 중 버퍼링 시 실패하기 전까지 더 오래 대기\n로컬 검색 결과 순서 수정\n재생 대기열에서 빈 항목 필드 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/984.txt",
    "content": "전체 화면을 채우고 태블릿과 TV에서 스크롤을 수정하기 위해 목록에 충분한 초기 항목을 로드\n목록을 스크롤하는 동안 발생하는 무작위 충돌을 수정\n플레이어 빠른 탐색 오버레이 아크를 시스템 UI 아래로 이동\n다중 창에서 재생할 때 컷아웃의 변경 사항을 되돌려 일부 휴대폰에서 플레이어가 잘못 배치된 회귀를 발생\ncompileSdk를 30에서 31로 늘림\n오류 보고 라이브러리를 업데이트\n플레이어의 일부 코드를 리팩토링\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/985.txt",
    "content": "YouTube에서 스트림을 재생하지 않는 문제 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/986.txt",
    "content": "새로운 사항\n• 새 스트림에 대한 알림\n• 백그라운드와 비디오 플레이어 간의 원활한 전환\n• 반음 단위로 피치 변경\n• 재생 목록에 메인 플레이어 대기열 추가\n\n개선된 사항\n• 속도/피치 단계 크기 기억\n• 비디오 플레이어에서 초기 긴 버퍼링 완화\n• Android TV용 플레이어 UI 개선\n• 다운로드한 모든 파일을 삭제하기 전에 확인\n\n수정된 사항\n• 미디어 버튼이 플레이어 컨트롤을 숨기지 않는 문제 수정\n• 플레이어 유형 변경 시 재생 재설정 문제 수정\n• 재생 목록 대화 상자 회전 문제 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/987.txt",
    "content": "새로운 사항\n• 점진적 HTTP 이외의 전송 방법 지원: 재생 로딩 시간 단축, PeerTube 및 SoundCloud 수정, 최근에 종료된 YouTube 라이브 스트림 재생\n• 원격 재생 목록을 로컬 재생 목록에 추가하는 추가 버튼\n• Android 10+ 공유 시트에서 이미지 미리 보기\n\n개선된 사항\n• 재생 매개변수 대화 상자 개선\n• 구독 가져오기/내보내기 버튼을 3개 점 메뉴로 이동\n\n수정된 사항\n• 재생 목록에서 완전히 시청한 비디오 제거 수정\n• 공유 메뉴 테마 및 \"재생 목록에 추가\" 항목 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/988.txt",
    "content": "[YouTube] 비디오를 재생하려고 할 때 \"스트림을 가져올 수 없습니다\" 오류 수정\n[YouTube] 요청한 비디오 대신 \"다음 콘텐츠는 이 앱에서 사용할 수 없습니다.\" 메시지가 표시되는 문제 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/989.txt",
    "content": "• [YouTube] 비디오를 재생하려고 할 때 무한 로딩 수정\n• [YouTube] 일부 비디오의 속도 조절 수정\n• 보안 수정이 포함된 jsoup 라이브러리를 1.15.3으로 업그레이드\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/990.txt",
    "content": "이 릴리스에서는 Android 4.4 KitKat에 대한 지원이 중단되었으며, 이제 최소 버전은 Android 5 Lollipop입니다!\n\n새로운 사항\n• 길게 누르기 메뉴에서 다운로드\n• 피드에서 향후 동영상 숨기기\n• 로컬 재생 목록 공유\n\n개선된 사항\n• 플레이어 코드를 작은 구성 요소로 리팩토링: RAM 사용량 감소, 버그 감소\n• 썸네일의 크기 조정 모드 개선\n• 이미지 자리 표시자 벡터화\n\n수정된 사항\n• 플레이어 알림과 관련된 다양한 문제 수정: 오래되거나 누락된 미디어 정보, 왜곡된 썸네일\n• 화면의 1/4을 사용하여 전체 화면 수\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/991.txt",
    "content": "새로운 사항\n• 오류 패널에 \"브라우저에서 열기\" 버튼 추가\n• 채널 그룹을 목록으로 표시하는 옵션 추가\n• [YouTube] 스트림 세그먼트를 길게 클릭하여 타임스탬프 URL 공유\n• 미니 플레이어에 재생 대기열 버튼 추가\n\n개선된 사항\n• 아이슬란드어 현지화 추가 및 기타 여러 번역 업데이트\n• 여러 내부 개선\n\n수정된 사항\n• 여러 충돌 수정\n• [YouTube] 일부 국가에서 채널 로딩, 비전용 피드 및 해결 방법 재생 문제 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/992.txt",
    "content": "새로운 기능\n• 영상 상세정보에서 구독자 수 표시\n• 대기열에서 다운로드\n• 영구적으로 재생목록 썸네일 설정\n• 해시태그와 링크 길게 누르기\n• 카드 보기 모드\n\n향상된 기능\n• 더 커진 미니 플레이어 닫기 버튼\n• 더 부드러운 썸네일 다운스케일링\n• 안드로이드 13 지원 (API 33)\n• 검색 시 플레이어를 중지하지 않음\n\n수정된 기능\n• Dex/마우스에서 오버레이 수정\n• 별도의 오디오 스트림 없이 백그라운드 플레이어 허용\n• 다양한 YouTube 수정들과 더 많은 것들…\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/993.txt",
    "content": "새로운 사항\n• 재생 목록 중복을 추가할 때 경고를 추가하고 이를 제거하는 버튼 추가\n• 하드웨어 버튼 무시 허용\n• 피드에서 부분적으로 시청한 비디오 숨기기 허용\n\n개선된 사항\n• 대형 화면에서 더 많은 그리드 열 사용\n• 설정과 일치하는 진행률 표시기 만들기\n\n수정된 사항\n• Android 11 이상에서 브라우저 URL, 다운로드 및 외부 플레이어 열기 수정\n• MIUI에서 두 번 탭해야 하는 전체 화면 상호 작용 수정\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/994.txt",
    "content": "새로운 사항\n• 여러 오디오 트랙/언어 지원\n• 화면의 어느 쪽에서든 볼륨 및 밝기 제스처 설정 허용\n• 화면 하단에 메인 탭 표시 지원\n\n개선된 사항\n• [Bandcamp] 유료 구독 벽 뒤의 트랙 처리\n\n수정된 사항\n• [YouTube] 스트림에 대한 403 HTTP 오류\n• 재생 목록 보기에서 메인 플레이어로 전환할 때 검은색 플레이어\n• 플레이어 서비스 메모리 누수\n• [PeerTube] 업로더와 하위 채널 아바타가 바뀌었습니다.\n\n및 기타\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/995.txt",
    "content": "새로운 사항\n• 채널 탭 지원\n• 이미지 품질 선택\n• 모든 이미지에 대한 URL 가져오기\n\n개선된 사항\n• 플레이어 인터페이스 접근성\n• 비디오 전용 다운로드를 위한 더 나은 오디오 선택\n• 공유된 플레이리스트 콘텐츠에 플레이리스트 및 비디오 이름을 포함하는 옵션\n\n수정된 사항\n• [YouTube] 좋아요 수 수정\n• 플레이어가 응답하지 않는 팝업 및 충돌 수정\n• 언어 선택기에서 잘못된 언어 선택\n• 플레이어 오디오 포커스가 음소거를 따르지 않음\n• 플레이리스트 항목 추가가 가끔 작동하지 않음\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/996.txt",
    "content": "media.ccc.de에서 채널/컨퍼런스를 열 때 NullPointerException이 발생하는 것을 수정했습니다.\n그린치가 당신에게 준 크리스마스 선물을 깰려고 했지만, 우리는 그것을 수정했습니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/997.txt",
    "content": "새로운 사항\n• 댓글 답글 추가\n• 재생 목록 재정렬 허용\n• 재생 목록 설명 및 기간 표시\n• 설정 재설정 허용\n\n개선된 사항\n• [Android 13+] 사용자 지정 알림 작업 복원\n• 업데이트 확인에 대한 동의 요청\n• 버퍼링하는 동안 알림 재생/일시 중지 허용\n• 일부 설정 재정렬\n\n수정된 사항\n• [YouTube] 댓글이 로드되지 않는 문제 수정 및 기타 수정 및 개선 사항\n• 설정 가져오기 및 JSON으로 전환의 취약성 수정\n• 다양한 다운로드 수정\n• 검색 텍스트 다듬기\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/998.txt",
    "content": "HTTP 403 오류로 인해 YouTube에서 스트림을 재생하지 못하는 문제를 수정했습니다.\n\nYouTube 비디오 중간에 가끔 발생하는 HTTP 403 오류는 아직 수정되지 않았습니다.\n이 문제는 가능한 한 빨리 다른 핫픽스 릴리스에서 해결될 예정입니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/changelogs/999.txt",
    "content": "이 핫픽스 릴리스는 YouTube 비디오 중간에 발생하는 HTTP 403 오류를 수정합니다.\n\n새로운 사항\n• [SoundCloud] on.soundcloud.com URL 지원 추가\n\n개선된 사항\n• [Bandcamp] 라디오 키오스크에 추가 정보 표시\n\n수정된 사항\n• [YouTube] 비디오 시작 또는 중간에 발생하는 HTTP 403 오류 수정\n• [YouTube] 더 많은 채널 헤더 유형에서 아바타와 배너 추출\n• [Bandcamp] 다양한 버그 수정 및 항상 HTTPS 사용\n"
  },
  {
    "path": "fastlane/metadata/android/ko/full_description.txt",
    "content": "NewPipe는 구글 프레임워크 러이브러리나 유튜브 API를 전혀 사용하지 않습니다. NewPipe는 필요한 정보를 얻기 위해서만 웹사이트 파싱을 합니다. 따라서 구글 서비스가 설치되지 않은 디바이스에서도 이 앱을 사용할 수 있습니다. 또한, NewPipe 사용을 위해 유튜브 계정이 필요없으며, 완벽한 오픈소스입니다.\n"
  },
  {
    "path": "fastlane/metadata/android/ko/short_description.txt",
    "content": "무료이면서 가볍게 동작하는 안드로이드용 유튜브 앱.\n"
  },
  {
    "path": "fastlane/metadata/android/ku/short_description.txt",
    "content": "به‌رنامه‌یه‌كی سوكه‌ڵه‌ و ساده‌ی یوتوب بۆ ئه‌ندرۆید.\n"
  },
  {
    "path": "fastlane/metadata/android/lmo/full_description.txt",
    "content": "NewPipe al drœva nissuna libreria framework del Google o l'API del YouTube. Al scandiss domà el sit web per ciapar su i informazione de qe n'ha bisogn. Per qella rexon qì qell'aplicazion qì la pœl vesser doperada ind aparecc senza i Servizi Google installad. G'è nanca bisogn d'haver-g un cunt YouTube per doperar NewPipe e a l'è FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/lmo/short_description.txt",
    "content": "Un frontend YouTube ligier per Android.\n"
  },
  {
    "path": "fastlane/metadata/android/lt/changelogs/63.txt",
    "content": "### Patobulinimai\n- Importavimo / eksportavimo nustatymai # 1333\n- Sumažintas \"ovrdraw\" (veikumo patobulinimas) # 1371\n- Nedideli kodo patobulinimai # 1375\n- Viską apie GDPR # 1420\n\n### Ištaisyta\n- Downloader: ištaisykitas nebaigtų atsisiuntimų iš .giga failų įkėlimas #1407\n"
  },
  {
    "path": "fastlane/metadata/android/lt/changelogs/64.txt",
    "content": "#### Patobulinimai\n- Pridėta galimybė apriboti vaizdo įrašo kokybę, jei naudojate mobiliuosius duomenis. #1339\n- Prisiminti sesijos ryškumą #1442\n- Pagerintas atsisiuntimo našumas silpnesniems procesoriams #1431\n- Pridėtas (veikiantis) medijos sesijos palaikymas #1433\n\n### Ištaisyti\n- Ištaisytas gedimas atidarant atsisiuntimus (ištaisymas dabar prieinamas išleistoms kompiliacijoms) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/lt/changelogs/820.txt",
    "content": "Ištaisyta iššifravimo funkcijos pavadinimo reguliarioji formulė, dėl kurios „YouTube“ tampa nenaudojama.\n"
  },
  {
    "path": "fastlane/metadata/android/lt/changelogs/830.txt",
    "content": "Atnaujinta „SoundCloud client_id“, kad būtų išspręstos „SoundCloud“ problemos.\n"
  },
  {
    "path": "fastlane/metadata/android/lt/full_description.txt",
    "content": "NewPipe nenaudoja jokių Google struktūrinių bibliotekų ar YouTube API. Ji tik analizuoja svetainę, kad gautų reikiamą informaciją. Todėl šią programėlę galima naudoti įrenginiuose, kuriuose nėra įdiegtos Google paslaugos. Be to, norint naudoti NewPipe, jums nereikia YouTube paskyros ir visa tai yra FLOSS (nemokama/libre/atvirojo kodo programinė įranga).\n"
  },
  {
    "path": "fastlane/metadata/android/lt/short_description.txt",
    "content": "Nemokama ir lengva YouTube sąsaja, skirta Android.\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/1001.txt",
    "content": "Uzlabojumi\n• Vienmēr atļauj nomainīt atskaņotāja paziņojumu iestatījumus uz Android 13+ ierīcēm\n\nSalabots\n• Datubāzes/abonementu izgūšana vairs neapcērp iepriekš eksistējošo datni, kas, iespējams, radīja bojātu datni\n• Novērsta atskaņotāja atsākšana no paša sākuma, kad noklikšķina uz laika zīmoga\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/63.txt",
    "content": "### Uzlabojumi\n- Ievietot/izgūt iestatījumus #1333\n- Samazināts pārzīmēšanas skaits (veiktspējas uzlabojums) #1371\n- Nelieli koda uzlabojumi #1375\n- Pievienota visa informācija par GDPR #1420\n\n### Salabots\n- Lejupielādētājs: Salabota lietotnes nobrukšana ielādējot nepabeigtās .giga datņu lejupielādes #1407\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/64.txt",
    "content": "### Uzlabojumi\n- Pievienota iespēja ierobežot video kvalitāti, ja tiek lietoti mobilie dati. #1339\n- Iegaumē spilgtuma iestatījumus visu sesijas laiku #1442\n- Uzlabots lejupielāžu ātrums uz vājākiem procesoriem #1431\n- pievienots (darbojošs) multimediju sesijas atbalsts #1433\n\n### Salabots\n- Salabota lietotnes nobrukšana, kad atvēra Lejupielādes (labojums pieejams izlaiduma laidienos) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/730.txt",
    "content": "# Salabots\n- Atkārtoti izlabota atšifrēšanas funkcijas kļūda.\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/770.txt",
    "content": "Izmaiņas 0.17.2 versijā\n\nSalabots\n• Novērsta problēma, ka video bija nepieejams\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/820.txt",
    "content": "Salabota regulārās izteiksmes funkcijas nosaukuma atšifrēšana, kuras dēļ YouTube bija nelietojams.\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/830.txt",
    "content": "Atjaunināts SoundCloud client_id, lai novērstu SoundCloud problēmas.\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/850.txt",
    "content": "Šis versijas izlaidums iekļauj atjaunināto YouTube vietnes versiju. Vecās vietnes versijas pieejamība tiks pārtraukta martā, un tāpēc jums ir nepieciešams atjaunināt NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/860.txt",
    "content": "Uzlabojumi\n• Saglabāt un atjaunot neatkarīgi no tā, vai augstums un temps ir atspējoti vai nav\n• Atbalsta displeja izgriezumu atskaņotājā\n• Apaļš (360 grādu) skats un abonentu skaits\n• Optimizēts YouTube, lai izmantotu mazāk datu\n\nŠajā versijā ir novērstas vairāk nekā 15 ar YouTube saistītas kļūdas.\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/870.txt",
    "content": "Šis ielāpu izlaidums ļauj jaunajai New Pipe versijai atkal izmantot SoundCloud bez liekām problēmām.\nEkstraktorā tagad tiek izmantots Soundcloud v2 API, kā arī ir uzlabota nederīgu klientu ID noteikšana.\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/910.txt",
    "content": "Salabota datubāzes migrācija, kas retos gadījumos neļāva NewPipe palaisties.\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/920.txt",
    "content": "Uzlabojumi\n\n• Pievienots augšupielādes datums un skatījumu skaits plūsmas elementiem režģa skatā\n• Uzlabojumi atvilktņu galvenes izkārtojumā\n\nSalabots\n\n• Salabota skaņas izslēgšanas poga, kas izraisīja avārijas uz Android ar API 19\n• Salabota ilgu 1080p 60 kadri sekundē videoklipu lejupielāde\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/950.txt",
    "content": "Šajā versijā veikti tikai trīs nelieli labojumi:\n• Salabota piekļuve krātuvei Android 10+ operētājsistēmās\n• Salabota kiosku atvēršana\n• Salabota ilguma noteikšana ilgiem video\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/956.txt",
    "content": "[YouTube] Novērsta lietotnes avarēšana pie jebkuras video ielādes\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/963.txt",
    "content": "• [YouTube] Salabots kanāla turpinājums\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/982.txt",
    "content": "Novērsta problēma, kuras dēļ YouTube nevarēja atskaņot nevienu straumi.\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/985.txt",
    "content": "Novērsta problēma, kuras dēļ YouTube nevarēja atskaņot nevienu straumi\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/989.txt",
    "content": "• [YouTube] Novērsta bezgalīgi ilgā video ielāde pie jebkuru video atskaņošanu\n• [YouTube] Novērsta dažu video lēnā ielāde (straumēšanas ierobežošanas problēma)\n• Atjaunināta jsoup bibliotēka uz 1.15.3 versiju, kas ietver drošības labojumus\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/996.txt",
    "content": "Salabota NullPointerException kļūda, kad atvēra media.ccc.de vietnes kanālu/konferenci.\nGrinčs mēģināja salauzt mūsu Ziemassvētku dāvanu jums, taču mēs to salabojām.\n"
  },
  {
    "path": "fastlane/metadata/android/lv/changelogs/998.txt",
    "content": "Salabota YouTube nespēja atskaņot jebkādu straumi HTTP 403 kļūdu dēļ.\n\nNejaušas HTTP 403 kļūdas YouTube video skatīšanās laikā vēl nav novērstas.\nKonkrētā problēma tiks atrisināta cik drīz vien iespējama nākamajā labojumfailu izlaidumā.\n"
  },
  {
    "path": "fastlane/metadata/android/lv/full_description.txt",
    "content": "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).\n"
  },
  {
    "path": "fastlane/metadata/android/lv/short_description.txt",
    "content": "Viegla, bezmaksas YouTube Android lietotne.\n"
  },
  {
    "path": "fastlane/metadata/android/mk/changelogs/1001.txt",
    "content": "Подобрено\n• Секогаш се дозволува менување на поставките за известување на плеерот на Android 13+\n\nПоправено\n• Извозот на базата на податоци/претплати нема да скрати веќе постоечки фајл, што може да доведе до оштетен извоз\n• Продолжувањето на плеерот од почеток кога ќе кликнете на временскиот печат (анг. timestamp)\n"
  },
  {
    "path": "fastlane/metadata/android/mk/changelogs/850.txt",
    "content": "Верзијата на веб-страницата на YouTube беше ажурирана. Старата верзија на веб-страницата ќе биде укината во март и оттаму ќе морате да го надградите NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/mk/changelogs/982.txt",
    "content": "Поправен е проблемот за време на кој YouTube не вчитуваше ниту еден стрим.\n"
  },
  {
    "path": "fastlane/metadata/android/mk/full_description.txt",
    "content": "NewPipe не користи никакви рамкови библиотеки на Google или програмскиот интерфејс (API) на YouTube. Тој ја анализира веб-страницата за да ги добие информациите кои му се потребни. Оттука, оваа апликација може да се користи на уреди без инсталирани услуги на Google (Gооgle Services). Исто така, не Ви е потребен акаунт на YouTube за да го користите NewPipe. Оваа апликација е бесплатна и нејзиниот код е јавно достапен.\n"
  },
  {
    "path": "fastlane/metadata/android/mk/short_description.txt",
    "content": "Бесплатен и лесен YouTube клиент за Android.\n"
  },
  {
    "path": "fastlane/metadata/android/ml/changelogs/63.txt",
    "content": "### മെച്ചപ്പെടുത്തിയവ\n- ക്രമികരണങ്ങൾ കൊണ്ട് വരാനോ / കൊണ്ട് പോകാനോ സാധിക്കും #1333\n"
  },
  {
    "path": "fastlane/metadata/android/ml/changelogs/64.txt",
    "content": "### മെച്ചപ്പെടുത്തലുകൾ\n- മൊബൈൽ ഡാറ്റാ ഉപയോഗിക്കുമ്പോൾ ഉള്ള വീഡിയോ ക്വാളിറ്റി നിജപ്പെടുത്താൻ ഉള്ള ക്രമീകരണം വരുത്തി #1339\n- ഒരു സെഷനിലെ ഓർത്തിരിക്കുന്നു #1442.\n- ശേഷി കുറഞ്ഞ പ്രൊസസ്സറുകൾക്കുള്ള ഡൌൺലോഡ് പെർഫോമൻസ് പുരോഗമനം വരുത്തി.\n-മീഡിയ സെഷന് സപ്പോർട്ട് ലഭ്യമാക്കി (പ്രവർത്തനം )\n\n### പരിഹരണങ്ങൾ\n- ഡൗൺലോഡ്സ് തുറക്കുമ്പോൾ ഉള്ള ക്റാഷ് പരിഹരിച്ചു. (പരിഹാരം പുതിയ ബിൽഡിൽ ലഭ്യമാണ് ) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/ml/changelogs/968.txt",
    "content": "ദീർഘനേരം അമർത്തുന്ന മെനുവിലേക്ക് ചാനൽ വിശദാംശങ്ങൾ ഓപ്ഷൻ ചേർത്തു.\nപ്ലേലിസ്റ്റ് ഇന്റർഫേസിൽ നിന്ന് പ്ലേലിസ്റ്റ് പേര് പുനർനാമകരണം ചെയ്യുന്നതിനുള്ള പ്രവർത്തനം ചേർത്തു.\nഒരു വീഡിയോ ബഫർ ചെയ്യുമ്പോൾ താൽക്കാലികമായി നിർത്താൻ ഉപയോക്താവിനെ അനുവദിക്കുന്നു.\nവെളുത്ത തീമീൽ മിനുക്കുപ്പണികൾ നടത്തി.\nഒരു വലിയ ഫോണ്ട് വലുപ്പമായി ഓവർലാപ്പിംഗ് ഫോണ്ടുകൾ ഉപയോഗിക്കുമ്പോഴുള്ള പ്രശ്നങ്ങൾ പരിഹരിച്ചു.\nഫോർമുലർ, സെഫിയർ ഉപകരണങ്ങളിൽ വീഡിയോകളൊന്നും വരാത്ത പിശക് പരിഹരിച്ചു.\nവിവിധ ക്രാഷുകൾ പരിഹരിച്ചു.\n"
  },
  {
    "path": "fastlane/metadata/android/ml/full_description.txt",
    "content": "ന്യൂപൈപ്പ് ഏതെങ്കിലും ഗൂഗിൾ ഫ്രെയിംവർക്ക് ലൈബ്രറികളോ യൂട്യൂബ് API- കളോ ഉപയോഗിക്കുന്നില്ല. വെബ്‌സൈറ്റിന് ആവശ്യമായ വിവരങ്ങൾ നേടുന്നതിന് മാത്രമേ ഇത് പാഴ്‌സുചെയ്യൂ. അതിനാൽ ഗൂഗിൾ സേവനങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യാത്ത ഉപകരണങ്ങളിൽ ഈ അപ്ലിക്കേഷൻ ഉപയോഗിക്കാൻ കഴിയും. കൂടാതെ, ന്യൂപൈപ്പ് ഉപയോഗിക്കുന്നതിന് നിങ്ങൾക്ക് ഒരു യൂട്യൂബ് അക്കൗണ്ട് ആവശ്യമില്ല, ഇത് FLOSS ആണ്.\n"
  },
  {
    "path": "fastlane/metadata/android/ml/short_description.txt",
    "content": "ആന്‍ഡ്രോയിഡിനായുള്ള ഒരു സൗജന്യ ലൈറ്റ് വെയ്റ്റ് യൂട്യൂബ് ഫ്രണ്ട്എന്‍ഡ്.\n"
  },
  {
    "path": "fastlane/metadata/android/ms/changelogs/1000.txt",
    "content": "Dipertingkat\n• Jadikan penerangan senarai main boleh diklik untuk menunjukkan kandungan yang lebih banyak/kurang\n• [PeerTube] Kendalikan pautan segera `subscribeto.me` secara automatik\n• Hanya mula mainkan item tunggal di skrin sejarah\n\nDibaiki\n• Baiki keterlihatan butang RSS\n• Baiki ranap pratonton bar carian\n• Baiki pembuatan senarai main item tanpa lakaran kecil\n• Baiki dialog keluar daripada muat turun sebelum ia muncul\n• Baiki timbul baris gilir senarai item yang berkaitan\n• Baiki susunan dalam menambah dialog senarai main\n• Laraskan susun atur item penanda buku senarai main\n"
  },
  {
    "path": "fastlane/metadata/android/ms/changelogs/63.txt",
    "content": "###Penambahbaikan\n- Pengaturan Import/Eksport #1333\n- Mengurangi Pengambaran berlebih (peningkatan prestasi) #1371\n- Penambahbaikan kecil kepada kod #1375\n- Penambahan semua tentang GDPR #1420\n\n###Diperbaiki\n- Pemuat turun: pembaikian kepada kegagalan ketika memuat muat turun yang belum selesai daripada fail-fail format .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/ms/changelogs/64.txt",
    "content": "### Penambahbaikan\n- Menambah kemampuan untuk membataskan kualiti video jika menggunakan data mudah alih. #1339\n- Ingat kecerahan untuk sesi yang sedang dipakai #1442\n- Peningkatan prestasi muat turun untuk CPU yang lemah #1431\n- Penambahan sokongan (hidup) untuk sesi media #1433\n\n###Diperbaiki\n- Pembaikian kepada lagaan ketika memulakan muat turun (Pembaikian sekarang tersedia untuk rilis binaan) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/ms/changelogs/790.txt",
    "content": "Dipertingkat\n• Tambah lebih banyak tajuk untuk meningkatkan keterlihatan bagi orang buta #2655\n• Jadikan bahasa tetapan folder muat turun lebih tekal dan jelas #2637\n\nDibaiki\n• Periksa jika bait terakhir di blok telah dimuat turun #2646\n• Baiki penatalan di cebisan butiran video #2672\n• Keluarkan animasi kotak kosongkan carian berganda kepada satu #2695\n• [SoundCloud] Baiki penyarian client_id #2745\n\nPembangunan\n• Tambah tanggungan yang hilang diwarisi daripada NewPipeExtractor kepada NewPipe #2535\n• Berhijrah ke AndroidX #2685\n• Kemas kini kepada ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/ms/changelogs/952.txt",
    "content": "Dipertingkat\n• Automain tersedia untuk semua perkhidmatan (bukan hanya untuk YouTube)\n\nDibaiki\n• Baiki strim berkaitan dengan menyokong sambungan baharu YouTube\n• Baiki video sekatan umur YouTube\n• [Android TV] Baiki tindanan serlahan fokus yang berlarutan\n"
  },
  {
    "path": "fastlane/metadata/android/ms/changelogs/953.txt",
    "content": "Baiki penyarian fungsi penyahsulitan YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/ms/changelogs/954.txt",
    "content": "• Aliran kerja aplikasi yang baharu: Mainkan video di laman butiran, leret ke bawah untuk mengecilkan pemain\n• Pemberitahuan MediaStyle: Tindakan boleh suai pada pemberitahuan, peningkatan prestasi\n• Ubah saiz asas apabila menggunakan NewPipe sebagai aplikasi atas meja\n\n• Tunjukkan dialog dengan pilihan terbuka sekiranya pemberitahuan URL tidak disokong\n• Tingkatkan pengalaman cadangan carian apabila yang jauh tidak dapat diambil\n• Tingkatkan mutu video lalai kepada 720p60 (pemain dalam aplikasi) dan 480p (pemain timbul)\n\n• Pelbagai pembaikan pepijat dan banyak lagi\n"
  },
  {
    "path": "fastlane/metadata/android/ms/full_description.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/ms/short_description.txt",
    "content": "Satu aplikasi seiras YouTube yang percuma dan ringan untuk Android.\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/954.txt",
    "content": "• Ny programarbeidsflyt: Spill fra «Detalj»-siden, dra nedover for å minimere\n• MediaStyle-merknader: Handlingsknapper kan tilpasses i merknader, bedre ytelse\n• Størrelsen kan endres for NewPipe brukt som skrivebordsprogram\n\n• Valgdialog for ustøttede nettadresse-oppsprett\n• Bedre søkeforslag når de ikke kan innhentes annesteds fra\n• Forvalgt videokvalitet nå 720p60 (innebygd) og 480p (i oppsprett)\n\n• +Mer\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/956.txt",
    "content": "[YouTube] Fikset krasj ved innlasting av vilkårlig video\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/958.txt",
    "content": "Nytt og forbedret:\n• Skjuling av miniatyrbilde på låseskjermen er tilbake\n• Trykk for å gjenoppfriske strøm\n• Forbedret ytelse ved innhenting av lokale lister\n\nFikset:\n• Krasj ved oppstart av NewPipe etter at det ble fjernet fra minne\n• Krasj ved oppstart når det ikke finnes noen internett-tilkobling\n• Repsektering av lys- og lyd- og håndvendingsinnstillinger\n• [YouTube] Lange spillelister\n\nAnnet:\n• Kodeopprydding og interne forbedringer\n• Avhengighetsoppdateringer\n• Oversettelser\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/959.txt",
    "content": "Fikset uendelig kræsjløkke ved åpning av feilrapportering.\nOppdatert liste over PeerTube-isntanser som kan åpnes automatisk av NewPipe.\nOppdaterte oversettelser.\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/960.txt",
    "content": "• Forbedret beskrivelse av innstilling for eksport av database i innstillingene.\n• Fikset tolking av YouTube-kommentarer.\n• Fikset visningsnavn for media.ccc.de service.\n• Oppdaterte oversettelser.\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/962.txt",
    "content": "\"Nylige\" videoer lagt til for media.ccc.de-tjenesten.\nLa til sanntidsstrømmer for media.ccc.de-tjenesten og også sanntidsstrømsstøtte.\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/964.txt",
    "content": "* Tillagt støtte for kapittel i avspillerkontroller\n* [PeerTube] Tillagt Sepia-søk\n* La til delingsknapp igjen i detaljvisning og flyttet strøm-beskrivelse inn i fanedesignet\n* Tillagt element for avspilling av video på Kodi\n* Fikset krasj når ingen forvalgt nettleser er satt på noen enheter og forbedring av delingsdialoger\n* Veksle spill/pause med maskinvaremellomromstast i fullskjermsspiller\n* [media.ccc.de] Forskjellige fikser og forbedringer\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/986.txt",
    "content": "Nytt\n• Merknader for nye strømmer\n• Sømløs overgang i bakgrunn og videospillere\n• Endre toneart med halvtoner\n• Legg til hovedspillerkøen på slutten av en spilleliste\n\nForbedret\n• Husk hastighet/toneart-stegstørrelse\n• Unngå lang mellomlagring i videospilleren\n• Forbedret spillergrensesnitt for Android TV\n• Bekreft sletting av alle nedlastede filer\n\nFikset\n• Mediaknapper som ikke skjuler avspillerkontroller\n• Avspillingstilbakestilling ved endring av spillertype\n• Rotering av spillelistedialog\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/changelogs/992.txt",
    "content": "Nytt\n• Antall abonnenter i videodetaljene\n• Last ned fra køen\n• Sett miniatyrbilde for spilleliste\n• Langtrykk på emneknagger og linker\n• Kortvisningsmodus\n\nForbedret\n• Større lukkenapp på minispilleren\n• Bedre nedskalering av miniatyrbilder \n• Målversjon er nå Android 13 (API 33)\n• Blafring pauser ikke lenger spilleren\n\nFikset\n• Fiks overlay for DeX/mus\n• Tillat bakgrunnsspiller med ingen separate lydstrømmer\n• Diverse YouTube-fikser, med mer …\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/full_description.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/nb-NO/short_description.txt",
    "content": "En fri og lett YouTube-skjermflate for Android.\n"
  },
  {
    "path": "fastlane/metadata/android/ne/short_description.txt",
    "content": "एन्ड्रोइडका लागि निशुल्क, हलुका युट्युब फ्रन्टइन्ड ।\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/1000.txt",
    "content": "Verbeterd:\n• Maak de beschrijving van de afspeellijst klikbaar om meer/minder content te tonen\n• [PeerTube] Verwerk `subscribeto.me`-instantiekoppelingen automatisch\n• Begin alleen met het afspelen van één item in het geschiedenisscherm\nOpgelost:\n\n• Herstel de zichtbaarheid van de RSS-knop\n• Herstel crashes van de zoekbalkvoorvertoning\n• Herstel het afspelen van een item zonder miniatuur\n• Herstel het afsluiten van het downloaddialoogvenster voordat het verschijnt\n• Herstel de pop-up van de lijst met gerelateerde items enqueue\n• Herstel de volgorde in het dialoogvenster Toevoegen aan afspeellijst\n• Pas de lay-out van het bladwijzeritem van de afspeellijst aan\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/1002.txt",
    "content": "YouTube speelt geen stream af opgelost.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/1003.txt",
    "content": "Dit is een hotfix-release die YouTube-fouten verhelpt:\n• [YouTube] Probleem opgelost waarbij geen video-informatie werd geladen, HTTP 403-fouten tijdens het afspelen van video's werden verholpen en de weergave van sommige video's met leeftijdsbeperking werd hersteld\n• Probleem opgelost waarbij de ondertitelgrootte niet werd aangepast\n• Probleem opgelost waarbij informatie twee keer werd gedownload bij het openen van een stream\n• [Soundcloud] Niet-afspeelbare DRM-beveiligde streams verwijderd\n• Vertalingen bijgewerkt\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/1004.txt",
    "content": "Deze release verhelpt het probleem dat YouTube alleen een 360p-stream aanbiedt.\n\nHoud er rekening mee dat de oplossing in deze versie waarschijnlijk tijdelijk is en dat op de lange termijn het SABR-videoprotocol geïmplementeerd moet worden. De leden van TeamNewPipe hebben het momenteel echter erg druk, dus alle hulp is van harte welkom! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/1007.txt",
    "content": "Deze hotfix verhelpt de foutmelding \"Inhoud niet beschikbaar\": YouTube-video's kunnen nu weer worden afgespeeld!\n\nHet lost ook een aantal bugs op die in versie 0.28.1 zijn geïntroduceerd:\n• Playlist-items konden alleen naar aangrenzende posities worden gesleept\n• Titel/opmerkingen flikkerden tussen de huidige en vorige video\n• De optie \"Start de hoofdspeler in volledig scherm\" werkte niet\n\nAndere verbeteringen:\n• [YouTube] Het is weer mogelijk om livestreams tot 4 uur terug te spoelen\n• Livestreamvideo's worden niet geladen wanneer ze op de achtergrond worden afgespeeld\n• Nieuwe gebruikersinterface voor \"Verwijder bekeken\"\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/63.txt",
    "content": "### Verbeteringen\n- Instellingen importeren/exporteren #1333\n- Overdraw verminderen (prestatieverbetering) #1371\n- Kleine code verbeteringen #1375\n- Alles toegevoegd over GDPR #1420\n\n### Opgelost\n- Downloader: Een crash verholpen bij het laden van onafgemaakte downloads van .giga bestanden #1407\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/64.txt",
    "content": "### Verbeteringen\n- Mogelijkheid toegevoegd om de videokwaliteit te beperken bij het gebruik van mobiele data. #1339\n- Helderheid voor de sessie onthouden #1442\n- Downloadprestaties voor zwakkere CPU's verbeterd #1431\n- (werkende) ondersteuning voor mediasessie toegevoegd #1433\n\n### Opgelost\n- Crash bij openen downloads verholpen (fix nu beschikbaar voor release builds) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/65.txt",
    "content": "### Verbeteringen\n\n- Burgermenu icoon animatie uitschakelen #1486 \n- Verwijderen van downloads ongedaan maken #1472 \n- Downloadoptie in deel menu #1498\n- Deeloptie toegevoegd aan menu met lange ingedrukt houden #1454 \n- Hoofdspeler minimaliseren bij afsluiten #1354 \n- Bibliotheek versie update en database back-up fix #1510 \n- ExoPlayer 2.8.2 Update #1392\n  - De afspeelsnelheidsdialoog herwerkt om verschillende stapgrootten te ondersteunen voor snellere snelheidsverandering.\n  - 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 = //).  \n  - 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.\n  - Metagegevens van afspeellijst op afstand niet bijgewerkt wanneer nieuwe metagegevens beschikbaar zijn wanneer afspeellijstfragment wordt geopend.\n  - Diverse UI fixes: #1383, achtergrondspeler meldingselementen nu altijd wit, makkelijker uitschakelen van popup speler door gooien\n- Gebruik nieuwe extractor met refactored architectuur voor multiservice\n\n### Fixes\n\n- Fix #1440 Gebroken video-info-indeling #1491 \n- Geschiedenis bekijken fix #1497\n  - #1495, door de metadata (thumbnail, titel en videotelling) werkt bij zodra de gebruiker de afspeellijst opent. \n  - #1475, door een weergave in de database te registreren wanneer de gebruiker een video start op externe speler op detailfragment.\n- Fix scherm timeout bij popup modus. #1463 (Fixed #640)\n- Hoofd video speler fix #1509 \n  - #1412] Fixed repeat mode veroorzaakt speler NPE wanneer nieuwe intentie wordt ontvangen terwijl speler activiteit op de achtergrond is.\n  - Fixed minimaliseren van speler naar popup vernietigt speler niet wanneer popup toestemming niet is verleend.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/66.txt",
    "content": "# changelog  versie v0.13.7\n\n ### opgelost\n - Problemen met sorteerfilters van v0.13.6 oplossen\n\n # Wijzigingslog van v0.13.6\n\n ### Verbeteringen\n\n - Schakel burgermenupictogramanimatie #1486 uit \n - Verwijdering van downloads #1472 ongedaan maken \n - Downloadoptie in deelmenu #1498\n - Deeloptie toegevoegd aan langtikmenu #1454 \n - Minimaliseer de hoofdspeler bij verlaten #1354 \n - Update van bibliotheekversie en fix #1510 voor databaseback-up \n - ExoPlayer 2.8.2 Update #1392\n   - Herwerkt het dialoogvenster voor de afspeelsnelheid om verschillende stapgroottes te ondersteunen voor een snellere snelheidsverandering.\n   - 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 =\\\\).  \n   - 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.\n   - Probleem opgelost dat metagegevens van externe afspeellijsten niet worden bijgewerkt wanneer nieuwe metagegevens beschikbaar zijn wanneer het afspeellijstfragment wordt geopend.\n   - 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\n - Gebruik een nieuwe extractor met gerefactoreerde architectuur voor multiservice\n\n ### Oplossingen\n\n - Repareer #1440 Kapotte video-info-indeling #1491 \n - Bekijk geschiedenisfix #1497\n   - #1495, door de metagegevens (miniatuur, titel en aantal video's) bij te werken zodra de gebruiker de afspeellijst opent. \n   - #1475, door een weergave in de database te registreren wanneer de gebruiker een video start op een externe speler op detailfragment.\n - Fix creen time-out in geval van pop-upmodus.  #1463 (vast #640)\n - Reparatie hoofdvideospeler #1509 \n   - [#1412] Probleem opgelost waarbij de herhaalmodus ervoor zorgt dat spelers NPE krijgen als er nieuwe intentie wordt ontvangen terwijl spelersactiviteit op de achtergrond plaatsvindt.\n   - 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.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/68.txt",
    "content": "# changelog versie v0.14.1\n\n ### opgelost\n - Probleem opgelost waarbij video-URL #1659 niet kon worden gedecodeerd \n - Vaste beschrijvingslink wordt niet goed geëxtraheerd #1657\n\n # wijzigingen van v0.14.0\n\n ### Nieuw\n - Nieuw ladeontwerp #1461\n - Nieuwe aanpasbare voorpagina #1461\n\n ### Verbeteringen\n - Herwerkte gebarenbediening #1604 \n - Nieuwe manier om de pop-upspeler #1597 te sluiten\n\n ### Vast\n - Fout opgelost wanneer het aantal abonnementen niet beschikbaar is.  Sluit #1649.\n   - Toon in die gevallen \"Aantal abonnees niet beschikbaar\".\n - Fix NPE wanneer een YouTube-afspeellijst leeg is\n - Snelle oplossing voor de kiosken in SoundCloud\n - Refactor en bugfix #1623 \n   - Fix Cyclisch zoekresultaat #1562\n   - Fix Zoekbalk niet statisch opgemaakt\n   - Fix YT Premium-video wordt niet correct geblokkeerd\n   - Fix Video's worden soms niet geladen (vanwege DASH-parsing)\n   - Corrigeer links in de videobeschrijving\n   - Toon waarschuwing wanneer iemand probeert te downloaden naar een externe SD-kaart\n   - niets repareren weergegeven uitzonderingstriggersrapport\n   - miniatuur wordt niet weergegeven in de achtergrondspeler voor Android 8.1 [zie hier](https://github.com/TeamNewPipe/NewPipe/issues/943)\n - Fix registratie van uitzendingsontvanger.  Sluit #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/770.txt",
    "content": "Veranderingen in 0.17.2\n\nOpgelost\n• Er was geen video beschikbaar\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/820.txt",
    "content": "Regex voor decrypt-functienaam hersteld, waardoor YouTube onbruikbaar werd.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/830.txt",
    "content": "SoundCloud client_id bijgewerkt om SoundCloud problemen op te lossen.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/850.txt",
    "content": "In deze release is de versie van de YouTube-website bijgewerkt. De oude websiteversie wordt in maart stopgezet en daarom moet u NewPipe upgraden.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/860.txt",
    "content": "Verbeterd\n- Bewaren en terugzetten of tempo en toonhoogte zijn ontgrendeld of niet\n- Ondersteuning display-uitsparing in speler \n- Afronden van aantal keer bekeken en aantal abonnees\n- Optimalisatie van YouTube om minder data te gebruiken\n\nMeer dan 15 YouTube gerelateerde bugs zijn opgelost in deze versie.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/870.txt",
    "content": "Dit is een hotfix-release die NewPipe bijwerkt om SoundCloud weer zonder veel gedoe te kunnen gebruiken.\nDe v2 API van SoundCloud wordt nu in de extractor gebruikt en de detectie van ongeldige client-ID's is verbeterd.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/900.txt",
    "content": "Nieuw\n• Abonnementsgroepen en gesorteerde feeds\n• Mute-knop in spelers\n\nVerbeterd\n• Sta het openen van music.youtube.com en media.ccc.de links toe in NewPipe\n• Verplaats twee instellingen van Uiterlijk naar Inhoud\n• Verberg zoekopties van 5, 15, 25 seconden als onnauwkeurig zoeken is ingeschakeld\n\nGemaakt\n• sommige WebM-video's kunnen niet worden gezocht \n• Databaseback-up op Android P\n• Crasht bij het delen van een gedownload bestand\n• Tonnen YouTube-extractieprobleem en meer ...\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/910.txt",
    "content": "Opgelost: Database migratie verholpen waardoor NewPipe in sommige zeldzame gevallen niet kon starten.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/920.txt",
    "content": "Verbeterd\n\n• Uploaddatum en weergave telling toegevoegd voor items in het stroomraster\n• Verbeteringen voor de lay-out van de koppen\n\nOpgelost\n\n• Vaste demp-knop veroorzaakt crashes op API 19\n• Probleem opgelost met het downloaden van lange 1080p 60fps-video's\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/930.txt",
    "content": "Nieuw\n • Zoek op YouTube Muziek\n • Basisondersteuning voor Android TV\n\n Verbeterd\n • De mogelijkheid toegevoegd om alle bekeken video's uit een lokale afspeellijst te verwijderen\n • Toon bericht wanneer inhoud nog niet wordt ondersteund in plaats van te crashen\n • Verbeterde grootte van de pop-upspeler met knijpbewegingen\n • Zet streams in de wachtrij door lang op de achtergrond- en pop-upknoppen in het kanaal te drukken\n • Verbeterde formaatverwerking van de titel van de ladekoptekst\n\n Opgelost\n • instelling voor inhoud met leeftijdsbeperking werkt niet opgelost \n • Bepaalde soorten reCAPTCHA's opgelost\n • Crash opgelost bij het openen van bladwijzers terwijl de afspeellijst 'null' is\n • Vaste detectie van netwerkgerelateerde uitzonderingen\n • Probleem opgelost met de zichtbaarheid van de groepssorteerknop in het abonnementsfragment\n\n en meer\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/950.txt",
    "content": "Deze release bevat drie kleine oplossingen:\n• Opslagtoegang op Android 10+\n• Kiosken openen\n• Analyseren van lange video's met een vaste duur\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/952.txt",
    "content": "Verbeterd\n• Auto-afspelen is beschikbaar voor alle services (in plaats van alleen voor YouTube)\n\nOpgelost\n• Gerelateerde streams opgelost door YouTube's nieuwe voortzettingen te steunen\n• Leeftijdsbeperkte YouTube videos opgelost\n• [Android TV] Aanhoudende focusmarkeringlaag opgelost\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/953.txt",
    "content": "Extractie van YouTube's decryptiefunctie opgelost.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/954.txt",
    "content": "- nieuwe applicatie-workflow: video's afspelen op detailpagina, omlaag vegen om speler te minimaliseren\n- MediaStyle meldingen: aanpasbare acties in meldingen, prestaties verbeterd \n- basisgrootte aanpassen bij NewPipe als desktop-app\n\n- dialoog met open opties tonen bij een niet-ondersteunde URL-toast\n- Verbeterde zoeksuggestie-ervaring als externe niet kunnen worden opgehaald\n- Verhoogde standaard videokwaliteit naar 720p60 (in-app speler) en 480p (pop-up speler)\n\n- veel bug fixes en meer\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/955.txt",
    "content": "[YouTube] Zoek-problemen voor sommige gebruikers verholpen\n[YouTube] Random decryptie-uitzonderingen verholpen\n[SoundCloud] URL's die eindigen met een schuine streep worden nu correct verwerkt\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/956.txt",
    "content": "[YouTube] Crash verholpen bij het laden van een video\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/957.txt",
    "content": "• Voeg specifieke wachtrij-acties samen\n• 2-vinger-swipe sluit speler\n• Sta wissen van reCAPTCHA cookie toe\n• Optie om meldingen niet te kleuren\n• Verbeter openen van video-details om oneindig bufferen, instabiel gedrag bij het delen met NewPipe en andere fouten op te lossen\n• Maak YouTube-video's sneller en herstel video's met leeftijdsbeperking\n• Los crash bij snel vooruit/terugspoelen op\n• Herschik lijsten niet bij het slepen van miniaturen\n• Onthoud popup-eigenschappen altijd\n• Santali-taal\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/958.txt",
    "content": "Verbeteringen:\n• Opnieuw toegevoegd, functie om miniatuur te verbergen op vergrendelscherm\n• Veeg naar beneden om feed te verversen\n• Verbeterd ophalen van lokale lijsten\n\nGemaakt:\n• Crash bij start van NewPipe nadat verwijdering uit RAM geheugen\n• Crash bij start van NewPipe zonder internetverbinding\n• Helderheid- en volume-instellingen worden beter gerespecteerd\n• [YouTube] Lange speellijst hersteld\n\nOverig:\n• Code opgeruimd\n• Afhankelijkheid updates\n• Update vertalingen\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/959.txt",
    "content": "Probleem opgelost met oneindige reeks van crashes na het openen van de foutrapportage.\nLijst met PeerTube instanties die automatisch kunnen worden geopend door NewPipe bijgewerkt.\nVertalingen bijgewerkt.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/960.txt",
    "content": "• Verbeterde beschrijving van de export database optie in de instellingen.\n• Probleem opgelost met parsen van YouTube-reacties.\n• Probleem opgelost met de weergavenaam van de media.ccc.de service.\n• Vertalingen bijgewerkt.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/961.txt",
    "content": "• [YouTube] Mix ondersteuning\n• [YouTube] Weergave info over publieke omroepen en Covid-19\n• [media.ccc.de] Recente videos toegevoegd\n• Somalische vertaling toegevoegd\n\n• Veel interne verbeteringen\n\n• Het delen van videos van binnen de speler opgelost\n• Lege ReCaptcha webview opgelost\n• Crash opgelost die voorkwam wanneer een stream was verwijderd van een lijst\n• [PeerTube] Gerelateerde streams opgelost\n• [YouTube] Opgelost: YouTube Muziek zoeken\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/962.txt",
    "content": "\"Recente\" video's toegevoegd aan de service media.ccc.de.\nLivestreams toegevoegd aan de service media.ccc.de en ook ondersteuning voor livestreams.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/963.txt",
    "content": "• [YouTube] Verbetering van vaste kanalen\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/964.txt",
    "content": "- Hoofdstukken in spelerbediening worden ondersteund\n- [PeerTube] Sepia zoeken toegevoegd\n- Delen is terug in video detailweergave. Stream beschrijving verplaatst naar de tab lay-out\n- Als helderheid-gebaar is uitgeschakeld, kan helderheid herstel ook uit\n- Lijst-item 'Afspelen op Kodi'\n- Opgelost : Crash als geen standaardbrowser is ingesteld op sommige toestellen. Dialogen voor delen verbeterd\n- 'Afspelen/Pauze' met spatie-knop in fullscreen speler\n- [media.ccc.de] Reparaties en verbeteringen\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/965.txt",
    "content": "Crash verholpen die optrad bij het opnieuw ordenen van kanaalgroepen.\nProbleem opgelost met het ophalen van meer YouTube-video's van kanalen en afspeellijsten.\nProbleem opgelost met het krijgen van YouTube-opmerkingen.\nOndersteuning toegevoegd voor / watch /, / v / en / w / subpaden in YouTube-URL's.\nVaste extractie van SoundCloud-client-ID en geografisch beperkte inhoud.\nNoord-Koerdische lokalisatie toegevoegd.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/966.txt",
    "content": "Nieuw:\n- Nieuwe dienst toegevoegd: Bandcamp\n\nVerbeterd:\n- Optie toegevoegd om de app het thema van het toestel te laten volgen\n- Voorkom sommige crashes door een verbeterd foutpaneel te tonen\n- Toon meer informatie over waarom inhoud niet beschikbaar is\n- Hardware spatie knop activeert afspelen/pauzeren\n- Toon \"Download gestart\" toast\n\nOpgelost:\n- Zeer kleine miniatuur in video details bij afspelen op de achtergrond\n- Lege titel in geminimaliseerde speler\n- Laatste resize modus is niet correct\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/967.txt",
    "content": "Probleem opgelost dat YouTube niet goed werkte in de EU. Dit werd veroorzaakt door een nieuw cookie- en privacy-toestemmingssysteem waarvoor NewPipe een TOESTEMMINGS- cookie moet plaatsen.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/968.txt",
    "content": "Optie voor kanaaldetails toegevoegd aan menu lang indrukken.\nFunctionaliteit toegevoegd om de naam van de afspeellijst te hernoemen vanuit de afspeellijstinterface.\nLaat de gebruiker pauzeren terwijl een video wordt gebufferd.\nHet witte thema geoptimaliseerd.\nOverlappende lettertypen opgelost bij gebruik van een grotere lettergrootte.\nOpgelost: geen video op Formuler- en Zephier-apparaten.\nVerschillende crashes opgelost.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/969.txt",
    "content": "• Installatie op externe opslag toestaan\n• [Bandcamp] Ondersteuning voor het tonen van de eerste drie commentaren op een stream\n• Toon alleen 'download is gestart' toast wanneer download is gestart\n• Stel reCaptcha-cookie niet in wanneer er geen cookie is opgeslagen\n• [Speler] Verbeter cache prestatie\n• [Speler] Fix: speler die niet automatisch speelt\n• Vorige Snackbalken verwijderen bij het verwijderen van downloads\n• Hersteld dat objecten die niet in de lijst staan, verwijderd moeten worden\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/970.txt",
    "content": "Nieuw\n• Toon inhoud metadata (tags, categorieën, licentie, ...) onder de beschrijving\n• \"Toon kanaal details\" optie in afspeellijsten op afstand (niet-lokaal)\n• \"Open in browser\" optie toegevoegd aan lange-druk menu\n\nFix\n• Rotatie crash op video detail pagina opgelost\n• \"Play with Kodi\" knop in speler vraagt altijd om Kore te installeren\n• Im- en export paden hersteld en verbeterd\n• [YouTube] Aantal reacties als opgelost\nEn nog veel meer\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/971.txt",
    "content": "Hotfix\n- Vergroot buffer voor afspelen na rebuffer\n- Crash op tablets en TV's verholpen bij het klikken op het play-queue icoon in de speler\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/972.txt",
    "content": "Nieuw\nHerken tijdstempels en hashtags in beschrijving\nHandmatige tablet-modus instelling\nMogelijkheid afgespeelde items in een feed te verbergen\n\nVerbeterd\nOndersteuning van Storage Access Framework\nFoutafhandeling van niet-beschikbare en beëindigde kanalen\nDe Android share sheet voor Android 10+ gebruikers toont nu de titel van de inhoud\nInvidious instanties. Ondersteuning voor Piped links\n\nBugfix\n[YouTube] Leeftijdsbeperkte inhoud\nVoorkom uitgelekt venster Uitzondering bij openen keuzedialoog\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/973.txt",
    "content": "Hotfix\n• Miniaturen en titels herstellen, die worden bijgesneden in rasterlay-out, vanwege een verkeerde berekening van hoeveel video's in één rij passen\n• Herstel downloaddialoog verdwijnt zonder iets te doen indien geopend vanuit het deelmenu\n• Een bibliotheek bijwerken die verband houdt met het openen van externe activiteiten, zoals de bestandskiezer voor Storage Access Framework\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/974.txt",
    "content": "Hotfix\n• Bufferproblemen veroorzaakt door YouTube-beperking oplossen\n• Extractie van YouTube-opmerkingen en crashes met uitgeschakelde reacties oplossen\n• YouTube-muziekzoekopdracht repareren\n• PeerTube-livestreams repareren\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/975.txt",
    "content": "Nieuw\n- Toon een thumbnail preview tijdens zoeken\n- Detecteer uitgeschakeld commentaar\n- Markeer een feed-item als bekeken\n- Reactie-harten tonen\n\nVerbeterd\n- Verbeter metadata en tags lay-out\n- Pas servicekleuren toe op UI-onderdelen\n\nOpgelost\n- Miniatuur in mini player\n- Eindeloze buffering bij dubbele wachtrij-items\n- Enkele spelerfouten als rotatie en sneller sluiten\n- ReCAPTCHA die op de achtergrond geladen blijft\n- Klikken uitschakelen tijdens verversen van feed\n- Enkele downloader crashes\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/976.txt",
    "content": "- Optie: speler direct in volledig scherm openen\n- Optie: keuze welke zoeksuggesties laten zien\n- Donker thema nu donkerder + donker splash-scherm\n- Verbeterde bestandskiezer: ongewenst wordt grijs\n- Import YouTube-abonnementen opgelost\n- Om een stream opnieuw te bekijken, nu opnieuw op de knop replay tikken\n- Geluidssessie sluiten vastgezet\n- [Android TV] Lange zoekbalksprongen verholpen bij gebruik DPad\n\nOm meer wijzigingen te zien, bekijk de changelog (en blog post) op de Links tab hieronder.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/977.txt",
    "content": "- Toegevoegd: \"volgende afspelen\" knop aan lang-drukken menu\n- Padvoorvoegsel voor YouTube-shorts toegevoegd aan intentiefilter\n- Hersteld: import instellingen\n- Verwissel zoekbalk positie met speler knoppen in wachtrij scherm\n- Diverse fixes MediasessionManager\n- Hersteld: zoekbalk niet voltooid na einde video\n- Media tunneling uitgeschakeld op RealtekATV\n- Vergroot aanklikbaar gebied spelersknoppen bij geminimaliseerde speler\n\nVoor meer wijzigingen: changelog (en blog post) links-tab hieronder\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/978.txt",
    "content": "Het uitvoeren van de controle op een nieuwe NewPipe versie is verbeterd. Deze controle werd soms te vroeg uitgevoerd en leidde daardoor tot een crash van de app. Dat zou nu verholpen moeten zijn.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/979.txt",
    "content": "- Hervatten van afspelen opgelost\n- Verbeteringen om ervoor te zorgen dat de service die bepaalt of NewPipe moet controleren op nieuwe versiecontroles niet op de achtergrond wordt gestart\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/980.txt",
    "content": "Nieuw\n• Optie \"Toevoegen aan afspeellijst\" toegevoegd aan menu delen\n• Ondersteuning toegevoegd voor y2u.be en PeerTube verkorte links\n\nVerbeterd\n• Afspeelsnelheid-Controls compacter gemaakt\n• Feed markeert nu nieuwe items\n• \"Toon bekeken items\" optie in de feed is nu opgeslagen\n\nOpgelost\n• YouTube vind-ik-leuks en niet-leuks extractie opgelost\n• Automatisch opnieuw afspelen na terugkeer uit de achtergrond is nu opgelost\nEn nog veel meer\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/981.txt",
    "content": "MediaParser-ondersteuning verwijderd om mislukte afspeelhervattingen na buffering op Android 11+ te verhelpen.\nMedia tunneling uitgeschakeld op Philips QM16XE om afspeelproblemen te verhelpen.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/982.txt",
    "content": "Opgelost: YouTube speelt geen stream af.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/983.txt",
    "content": "Toegevoegd: nieuwe 'dubbel-tik-naar-doorzoeken' UI en gedrag\nInstellingen doorzoekbaar maken\nGepinde commentaren als zodanig markeren\nOpen-met-app ondersteuning toevoegen voor FSFE's PeerTube instantie\nFoutmeldingen toevoegen\nHerstel herhaling van het eerste wachtrij-item bij verandering van speler\nLanger wachten bij buffering tijdens livestreams alvorens te falen\nVolgorde van lokale zoekresultaten verbeteren\nHerstel lege itemvelden in afspeelwachtrij\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/985.txt",
    "content": "YouTube speelt geen stream af opgelost\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/998.txt",
    "content": "Het probleem dat YouTube geen streams afspeelde vanwege HTTP 403-fouten is opgelost.\n\nIncidentele HTTP 403-fouten midden in een YouTube-video zijn nog niet verholpen.\nDit probleem zal zo snel mogelijk in een volgende hotfix-release worden aangepakt.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/changelogs/999.txt",
    "content": "Deze hotfix-release lost HTTP 403-fouten op in het midden van YouTube-video's.\n\nNieuw\n• [SoundCloud] Ondersteuning toegevoegd voor on.soundcloud.com-URL's\n\nVerbeterd\n• [Bandcamp] Extra info getoond in radio­kiosk\n\nOpgelost\n• [YouTube] Af en toe voorkomende HTTP 403-fouten opgelost aan het begin of in het midden van video's\n• [YouTube] Avatar en banner worden geëxtraheerd uit meer kanaal­header­typen\n• [Bandcamp] Verschillende bugs opgelost en HTTPS geforceerd\n"
  },
  {
    "path": "fastlane/metadata/android/nl/full_description.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/nl/short_description.txt",
    "content": "Een gratis en lichtgewicht YouTube-front-end voor Android.\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/63.txt",
    "content": "### Verbeteringen\n- Instellingen importeren/exporteren #1333\n- Overdraw verminderen (prestatieverbetering) #1371\n- Kleine code verbeteringen #1375\n- Alles toevoegen over GDPR #1420\n\n### Opgelost\n- Downloader: Crash bij laden van onafgemaakte downloads van .giga bestanden verhelpen #1407\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/730.txt",
    "content": "# Opgelost\n- Snelle fix decodeer functie gaf nogmaals foutmelding.\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/770.txt",
    "content": "Veranderingen in 0.17.2\n\nOpgelost\n• Geen video beschikbaar\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/820.txt",
    "content": "Probleem opgelost met de naam-regex in de decrypteerfunctie dat YouTube onbruikbaar maakte.\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/830.txt",
    "content": "SoundCloud client_id geüpdatete om problemen met SoundCloud op te lossen.\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/850.txt",
    "content": "In deze release werd de versie van de YouTube website geüpdatete. De oude versie van de website zal buiten gebruik gesteld worden in maart waardoor je verplicht bent om NewPipe te upgraden.\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/910.txt",
    "content": "Probleem met databank migratie opgelost dat ervoor zorgde dat NewPipe niet kon opstarten in sommige zeldzame gevallen.\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/950.txt",
    "content": "Deze release bevat drie kleine fixes:\n• Toegang tot opslag op Android 10+ opgelost\n• Openen van kiosk's opgelost\n• Duurtijd verwerking van lange video's opgelost\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/953.txt",
    "content": "Fix extractie van Youtube's decrypteerfunctie.\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/954.txt",
    "content": "• nieuwe applicatieflow: speel video af op detailpagina, swipe naar beneden om speler te minimaliseren\n• MediaStyle notificaties: personaliseerbare acties in meldingen, performantieverbeteringen\n• basis herschalen voor NewPipe als bureaublad-app\n\n• toon dialoog met opties om te openen na niet-ondersteunde URL melding\n• Verbeter zoeksuggestie-ervaring wanneer externe niet opgehaald kunnen worden\n• Verhoog standaard videokwaliteit speler naar 720p60 (in-app) en 480p (pop-up)\n\n• hoop bugs opgelost\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/955.txt",
    "content": "[YouTube] Fix zoekfunctionaliteit voor sommige gebruikers\n[YouTube] Fix willekeurige decoderingsfouten\n[SoundCloud] URLs eindigend op slash worden nu correct verwerkt\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/956.txt",
    "content": "[YouTube] Crash opgelost wanneer video's geladen worden\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/changelogs/957.txt",
    "content": "• Eén maken van specifieke in wachtrij plaatsen opties\n• Tweevinger-beweging om speler te sluiten\n• Toelaten om reCAPTCHA cookies te verwijderen\n• Optie om notificatie niet te kleuren\n• Verbeter weergeven van video details om oneindige buffering en problemen bij delen naar NewPipe op te lossen\n• Versnel YouTube video's en fix leeftijdsbeperkte video's\n• Los crash op bij door- en terugspoelen\n• Voorkom herordenen lijsten bij slepen thumbnails\n• Onthoud pop-up eigenschappen\n• Voeg taal Santali toe\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/full_description.txt",
    "content": "NewPipe maakt geen gebruik van Google framework bibliotheken of de YouTube API.\nHet interageert enkel met de website om de nodige informatie te vergaren. Daardoor kan deze app gebruikt worden op apparaten waarop Google Services niet geïnstalleerd is. Daarnaast heb je geen YouTube account nodig om NewPipe te gebruiken en is NewPipe vrije software en opensource.\n"
  },
  {
    "path": "fastlane/metadata/android/nl-BE/short_description.txt",
    "content": "Een vrije en lichte Youtube frontend voor Android.\n"
  },
  {
    "path": "fastlane/metadata/android/nqo/changelogs/63.txt",
    "content": "### ߟߢߊ߬ߟߌ ߟߎ߬\n- ߟߊ߬ߛߣߍ߬ߟߌ/ߟߊߝߏ߬ߦߟߌ߫ ߢߊߓߐߟߌ ߟߎ߬ #1333 \n- ߞߙߍ߬ߢߍ߬ߡߊ߬ߛߊߦߌ ߟߊߘߐ߯ߦߊ (ߘߏߢߊߟߌ ߓߘߊ߫ ߟߊߢߊ߬) #1371 \n- ߘߏߝߙߍߕߍ߫ ߘߋ߲ߣߍ߲ ߠߊߢߊ߭ #1375 \n- GDPR ߞߏ ߓߍ߯ ߝߊ߬ߙߊ #1420\n\n### ߘߐ߬ߓߍ߲߬ߠߌ߲\n- ߟߊ߬ߖߌ߰ߟߊ߲: ߕߌߢߍߟߌ ߘߏ߫ ߓߘߊ߫ ߘߐߓߍ߲߬ ߡߍ߲ ߦߋ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߓߊ߲ߓߊߟߌ ߟߎ߬ ߖߛߐ ߝߍ߬ ߞߊ߬ ߝߘߊ߫ .giga ߞߐߕߐ߮ ߟߎ߬ ߟߊ߫ #1407\n"
  },
  {
    "path": "fastlane/metadata/android/nqo/changelogs/64.txt",
    "content": "### ߟߢߊ߬ߟߌ ߟߎ߬\n- ߦߋߡߍ߲ߕߊ߫ ߓߘߍ߬ߦߊ߫ ߘߊ߲߬ߠߊߕߍ߱ ߛߋߞߏߦߊ ߜߋߟߋ߲ߜߋߟߋ߲߫ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߓߊ߯ߙߊ ߘߐ߫ #1339\n- ߞߊ߬ ߞߣߍߦߊ ߟߊߞߎ߲߬ߘߎ߬ ߛߌ߰ߘߐ ߢߍ߫ #1442\n- ߟߊߖߌ߰ߟߌ߫ ߢߣߊ߬ߦߊ ߟߢߊ߬ߟߌ ߟߎ߬ ߦߙߍߞߍߟߊ߲߫ ߖߊߝߏߣߍ߲ ߢߍ߫ #1431\n- ߞߟߋߞߟߋ߫ ߘߌ߯ߘߐ ߟߎ߬ ߞߐߞߘߐߓߌ߲ߓߌ߲ #1433\n\n### ߛߊߞߍߟߌ ߟߎ߬\n- ߜߊߛߊ߲ߠߌ߲ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߘߊߦߟߍ߫ ߕߎߡߊ (ߊ߬ ߡߊߟߐ߬ߘߐ߲߬ߕߊ ߦߋ߫ ߓߐߞߏ߫ ߞߐߟߕߊ ߟߎ߫ ߟߋ߬ ߘߐ߫) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/nqo/changelogs/65.txt",
    "content": "### ߟߢߊ߬ߟߌ ߟߎ߬\n\n- ߓߙߎߜ߭ߍߙߌ߫ ߢߣߊߠߟߊ ߞߐߖߌߦߊ߫ ߟߊߡߊ߭ ߓߘߊ߫ ߓߐ߫ ߊ߬ ߘߐ߫ #1486 \n- ߟߊ߬ߖߌ߰ߟߌ ߟߎ߫ ߖߐ߬ߛߌ ߘߐߛߊ߭ #1472 \n- ߟߊ߬ߖߌ߰ߟߌ߫ ߢߣߊߕߊߟߌ ߓߘߊ߫ ߓߊ߫ ߓߌ߬ߟߊ߬ ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߥߟߊ ߘߐ߫ #1498\n- ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߕߊ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ \"ߕߐߘߐ߲߫ ߖߊ߲\" ߢߣߊߥߟߊ ߟߊ߫ #1454 \n- ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߓߊߖߎ ߡߊߖߌ߰ ߓߐߟߌ߫ ߕߎߡߊ #1354 \n- ߟߍߙߘߊ߫ ߓߐߞߏߠߊ߲ ߟߏ߲ߘߐߦߊߟߌ ߣߌ߫ ߟߐ߲ߕߊߓߘߐ ߟߊߞߎ߲߬ߘߎ߫ ߛߊߞߍߟߌ #1510 \n- ߍߞߑߛߏߔߌߟߋߦߊ ߂.߈.߂ ߟߏ߲ߘߐߦߊߟߌ #1392\n  - ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊߡߊ߬ߙߊ߫ ߘߊߘߐߖߊߥߏ߫ ߞߏ߲ߘߏ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߟߋ߬ ߞߏ߫ ߛߴߊ߬ ߘߌ߫ ߛߋ߫ ߛߋ߲߬ߘߊ ߘߍ߲߬ߘߍ߲߬ ߓߐߣߍ߲ߢߐ߲߰ߡߊ߫ ߟߎ߫ ߕߊ߬ ߟߊ߫߸ ߞߊ߬ ߓߏߙߌ߬ߛߋ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߊߟߌߦߊ ߘߐ߫.\n  - ߢߍߕߊ߯ ߞߊߟߌ߲ ߢߣߊߕߊߟߌ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߊ߫ ߡߊ߬ߞߎ߲ ߥߊ߯ߕߌ. ߏ߬ ߢߊ߬ߕߣߐ ߘߍ߫ ߞߍ߫ ߊ߬ ߟߊ߫ ߡߍ߲ߕߊ߫ ߞߝߊ ߟߎ߬ ߘߐ߫ ߊ߬ ߣߌ߫ ߘߐ߲߬ߞߟߌ ߛߎ߯ߦߊ ߘߏ߫ ߟߎ߫߸ ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߊ߬ߙߌ ߘߌߦߊߘߏ߲߬ ߠߴߊ߬ ߢߊ ߖߍ߬ߘߍߖߍ߬ߘߍ ߡߊ߬ (ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߐ߲߬ߞߟߌ ߟߊߛߎ߬ߘߎ߲߬ߧߊ߬ߟߊ߫ ߡߊ߬ߞߎ߲߬ ߛߌߦߊߡߊ߲߫ ߦߋ߫ ߡߍ߲ ߘߐ߫ =\\\\)  \n  - ߞߟߋߞߟߋ ߟߎ߬ ߓߐߛߎ߲ ߓߍ߲߬ߡߊ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߞߏ߫ ߛߋ߫ ߟߐ߲ߕߓߊ ߟߎ߬ ߣߌ߲߫ ߞߟߋߞߟߋ ߟߎ߬ ߘߌ߫ ߕߊ߬ߡߌ߲߬ ߘߐߛߊߙߌߟߊ߲ ߞߣߐ߫ ߞߋߟߋ߲ߘߌ߫߸ ߖߋߣߌ߲߬ ߊ߬ ߦߋ߫ ߞߍ߫ ߓߟߏ߫ ߟߊ߫. ߡߎ߬ߕߎ߲߬߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߓߐߛߎ߲߫ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߬ ߦߴߊ߲ ߓߟߏ߫߸ ߊ߬ߟߎ߫ ߘߏ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌߞߘߐ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߊ߫ ߘߊߡߌ߬ߣߊ߬.\n  - ߥߎߟߊߟߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߟߐ߲ߕߓߊ ߟߎ߬ ߛߊߞߍ߸ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߟߏ߲ߘߏߦߊ߫ ߟߊ߫ ߣߌ߫ ߟߐ߲ߕߓߊ߫ ߞߎߘߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎ߲ߞߎߘߎ߲ ߘߊߦߟߍ߬ ߕߎߡߊ.\n  - ߕߣߐ߬ߓߐ߬ߟߊ ߢߊߓߍ߲߫ ߛߊߞߍߟߌ߫ ߛߌߦߊߡߊ߲߫ :  #1383߸ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ ߕߏߟߏ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ ߦߋ߫ ߜߍߡߊ߲ ߠߋ߬ ߘߌ߫ ߡߎ߬ߕߎ߲߬ ߞߘߊߎ߫߸ ߝߎ߲ߞߊ߲ߡߊ ߘߊߕߎ߲߯ ߣߐ߬ߡߊ߲߫ ߏ߬ ߟߋ ߘߐ߫ ߊ߬ ߘߊߦߟߍ߬ ߝߍ߬.\n  - ߟߊߝߎߟߋ߲ߟߊ߲߫ ߞߎߘߊ߫ ߘߏ߫ ߟߊߓߊ߯ߙߊ ߊ߬ߣߌ߫ ߛߏ߯ߙߏߢߊ߫ ߟߊߢߊ߬ߣߍ߲ ߗߋߢߊߥߙߍ ߢߍ߫.\n\n### ߛߊߞߍߟߌ ߟߎ߬\n\n- ߛߊߞߍߟߌ #1440 ߦߋߡߍ߲ߕߊ߫ ߟߌ߬ߤߟߊ߬ ߘߐߝߐ߬ߛߐ߲߬ߣߍ߲ ߠߎ߬ ߝߍ߲߬ߛߍ߲߬ߢߊ #1491 \n- ߦߋߞߏ ߟߎ߫ ߘߝߐ߬ߦߊ ߛߊߞߍߟߌ #1497\n  - #1495߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߟߏ߲ߘߐߦߊ (ߦߋߡߍߕߊ߫ ߞߐߖߌߦߊ߸ ߊ߬ ߞߎ߲߬ߕߐ߮ ߣߴߊ߬ ߖߊ߬ߕߋ) ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊߛߐ߬ߘߐ߲߬.\n  - #1475߸ ߦߋߟߌ ߘߏ߫ ߟߊߞߎ߲߬ߘߎ ߟߐ߲ߕߊߓߘߐ ߞߣߐ߫ ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߊߦߟߍ߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߘߏ߫ ߟߊ߫ ߕߐ߬ߝߍ߬ߦߊ߬ߟߌ߬ ߞߎߘߎ߲ ߘߏ߫ ߞߊ߲߬.\n- ߝߢߐߘߊ߫ ߕߎ߬ߡߊ߬ߘߛߍ ߛߊߞߍߟߌ ߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߐ߫. #1463 (ߛߊߞߍߣߍ߲ #640)\n- ߦߋߡߍߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߛߊߞߍߟߌ #1509 \n  - ߡߛߊ߬ߦߟߌ߫ ߗߏ߯ߦߊ߫ ߛߊߞߍߟߌ߸ ߡߍ߲ ߦߋ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߌ߬ߟߊ߬ ߟߊ߫ ߝߝߝ ߟߊ߫ ߖߡߊ߬ߙߌ߬ ߞߎߘߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߞߵߊ߬ ߕߘߍ߬ ߘߐߛߊߙߌߟߊ߲ ߥߊߟߌߘߊ ߦߋ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫.\n  - ߘߐߛߊߙߌߟߊ߲ ߝߎ߲ߞߊ߲ߡߊ ߡߊߖߌ߱ ߛߊߞߍߟߌ ߡߍ߲ ߕߍ߫ ߘߐߛߊߙߌߟߊ߲ ߥߦߊ߬ ߟߊ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߝߎ߲ߞߊ߲ߡߊ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߡߊ߫ ߘߌ߫.\n"
  },
  {
    "path": "fastlane/metadata/android/nqo/changelogs/66.txt",
    "content": "# ߓߐߞߏ߫ ߀.߁߃.߇ ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߫ ߝߐ߰ߓߍ\n\n### ߛߊߞߍߣߍ߲ ߠߎ߬\n- ߓߐߞߏ߫ ߀.߁߃.߆ ߘߕߐ߬ߡߐ߲߬ߠߌ߲߫ ߛߍ߲ߛߍ߲ߟߊ߲ ߝߙߋߞߋ ߘߏ߫ ߓߘߊ߫ ߛߊߞߍ߫\n\n# ߓߐߞߏ߫ ߀.߁߃.߆ ߡߝߊ߬ߟߋ߲߬ߠߌ߲߫ ߠߎ߬ ߛߙߍߘߍ\n\n### ߟߢߊ߬ߟߌ ߟߎ߬\n\n- ߓߙߎߜ߭ߍߙߌ߫ ߢߣߊߠߟߊ ߞߐߖߌߦߊ߫ ߟߊߡߊ߭ ߓߘߊ߫ ߓߐ߫ ߊ߬ ߘߐ߫ #1486 \n- ߟߊ߬ߖߌ߰ߟߌ ߟߎ߫ ߖߐ߬ߛߌ ߘߐߛߊ߭ #1472 \n- ߟߊ߬ߖߌ߰ߟߌ߫ ߢߣߊߕߊߟߌ ߓߘߊ߫ ߓߊ߫ ߓߌ߬ߟߊ߬ ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߥߟߊ ߘߐ߫ #1498\n- ߘߐ߬ߕߟߊ߬ߟߌ߫ ߢߣߊߕߊ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ \"ߕߐߘߐ߲߫ ߖߊ߲\" ߢߣߊߥߟߊ ߟߊ߫ #1454 \n- ߞߊ߬ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲߬ ߓߊߖߎ ߡߊߖߌ߰ ߓߐߟߌ߫ ߕߎߡߊ #1354 \n- ߟߍߙߘߊ߫ ߓߐߞߏߠߊ߲ ߟߏ߲ߘߐߦߊߟߌ ߣߌ߫ ߟߐ߲ߕߊߓߘߐ ߟߊߞߎ߲߬ߘߎ߫ ߛߊߞߍߟߌ #1510 \n- ߍߞߑߛߏߔߌߟߋߦߊ ߂.߈.߂ ߟߏ߲ߘߐߦߊߟߌ #1392\n  - ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊߡߊ߬ߙߊ߫ ߘߊߘߐߖߊߥߏ߫ ߞߏ߲ߘߏ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߟߋ߬ ߞߏ߫ ߛߴߊ߬ ߘߌ߫ ߛߋ߫ ߛߋ߲߬ߘߊ ߘߍ߲߬ߘߍ߲߬ ߓߐߣߍ߲ߢߐ߲߰ߡߊ߫ ߟߎ߫ ߕߊ߬ ߟߊ߫߸ ߞߊ߬ ߓߏߙߌ߬ߛߋ߲ ߡߊߝߊ߬ߟߋ߲߬ ߞߊߟߌߦߊ ߘߐ߫.\n  - ߢߍߕߊ߯ ߞߊߟߌ߲ ߢߣߊߕߊߟߌ ߘߏ߫ ߓߘߊ߫ ߝߙߊ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲߫ ߓߐ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߊ߫ ߡߊ߬ߞߎ߲ ߥߊ߯ߕߌ. ߏ߬ ߢߊ߬ߕߣߐ ߘߍ߫ ߞߍ߫ ߊ߬ ߟߊ߫ ߡߍ߲ߕߊ߫ ߞߝߊ ߟߎ߬ ߘߐ߫ ߊ߬ ߣߌ߫ ߘߐ߲߬ߞߟߌ ߛߎ߯ߦߊ ߘߏ߫ ߟߎ߫߸ ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߊ߬ߙߌ ߘߌߦߊߘߏ߲߬ ߠߴߊ߬ ߢߊ ߖߍ߬ߘߍߖߍ߬ߘߍ ߡߊ߬ (ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߘߐ߲߬ߞߟߌ ߟߊߛߎ߬ߘߎ߲߬ߧߊ߬ߟߊ߫ ߡߊ߬ߞߎ߲߬ ߛߌߦߊߡߊ߲߫ ߦߋ߫ ߡߍ߲ ߘߐ߫ =\\\\)  \n  - ߞߟߋߞߟߋ ߟߎ߬ ߓߐߛߎ߲ ߓߍ߲߬ߡߊ ߘߐߓߊ߯ߙߊ߫ ߘߊ߫ ߞߏ߫ ߛߋ߫ ߟߐ߲ߕߓߊ ߟߎ߬ ߣߌ߲߫ ߞߟߋߞߟߋ ߟߎ߬ ߘߌ߫ ߕߊ߬ߡߌ߲߬ ߘߐߛߊߙߌߟߊ߲ ߞߣߐ߫ ߞߋߟߋ߲ߘߌ߫߸ ߖߋߣߌ߲߬ ߊ߬ ߦߋ߫ ߞߍ߫ ߓߟߏ߫ ߟߊ߫. ߡߎ߬ߕߎ߲߬߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߓߐߛߎ߲߫ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߬ ߦߴߊ߲ ߓߟߏ߫߸ ߊ߬ߟߎ߫ ߘߏ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌߞߘߐ߫ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߌ߲ ߓߊ߫ ߘߊߡߌ߬ߣߊ߬.\n  - ߥߎߟߊߟߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߟߎ߬ ߟߐ߲ߕߓߊ ߟߎ߬ ߛߊߞߍ߸ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߟߏ߲ߘߏߦߊ߫ ߟߊ߫ ߣߌ߫ ߟߐ߲ߕߓߊ߫ ߞߎߘߊ ߟߎ߬ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߕߏߟߏ߲ߛߙߍߘߍ߫ ߞߎ߲ߞߎߘߎ߲ ߘߊߦߟߍ߬ ߕߎߡߊ.\n  - ߕߣߐ߬ߓߐ߬ߟߊ ߢߊߓߍ߲߫ ߛߊߞߍߟߌ߫ ߛߌߦߊߡߊ߲߫ :  #1383߸ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ ߕߏߟߏ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ ߦߋ߫ ߜߍߡߊ߲ ߠߋ߬ ߘߌ߫ ߡߎ߬ߕߎ߲߬ ߞߘߊߎ߫߸ ߝߎ߲ߞߊ߲ߡߊ ߘߊߕߎ߲߯ ߣߐ߬ߡߊ߲߫ ߏ߬ ߟߋ ߘߐ߫ ߊ߬ ߘߊߦߟߍ߬ ߝߍ߬.\n  - ߟߊߝߎߟߋ߲ߟߊ߲߫ ߞߎߘߊ߫ ߘߏ߫ ߟߊߓߊ߯ߙߊ ߊ߬ߣߌ߫ ߛߏ߯ߙߏߢߊ߫ ߟߊߢߊ߬ߣߍ߲ ߗߋߢߊߥߙߍ ߢߍ߫.\n\n### ߛߊߞߍߟߌ ߟߎ߬\n\n- ߛߊߞߍߟߌ #1440 ߦߋߡߍ߲ߕߊ߫ ߟߌ߬ߤߟߊ߬ ߘߐߝߐ߬ߛߐ߲߬ߣߍ߲ ߠߎ߬ ߝߍ߲߬ߛߍ߲߬ߢߊ #1491 \n- ߦߋߞߏ ߟߎ߫ ߘߝߐ߬ߦߊ ߛߊߞߍߟߌ #1497\n  - #1495߸ ߟߐ߲ߕߓߊ ߟߎ߬ ߟߏ߲ߘߐߦߊ (ߦߋߡߍߕߊ߫ ߞߐߖߌߦߊ߸ ߊ߬ ߞߎ߲߬ߕߐ߮ ߣߴߊ߬ ߖߊ߬ߕߋ) ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߕߏߟߏ߲ߛߙߍߘߍ ߟߊߛߐ߬ߘߐ߲߬.\n  - #1475߸ ߦߋߟߌ ߘߏ߫ ߟߊߞߎ߲߬ߘߎ ߟߐ߲ߕߊߓߘߐ ߞߣߐ߫ ߕߎ߬ߡߊ ߡߍ߲ ߣߌ߫ ߕߣߐ߬ߓߐ߬ߟߊ ߞߊ߬ ߦߋߡߍ߲ߕߊ ߘߏ߫ ߘߊߦߟߍ߬ ߞߐߞߊ߲߫ ߘߐߛߊߙߌߟߊ߲ ߘߏ߫ ߟߊ߫ ߕߐ߬ߝߍ߬ߦߊ߬ߟߌ߬ ߞߎߘߎ߲ ߘߏ߫ ߞߊ߲߬.\n- ߝߢߐߘߊ߫ ߕߎ߬ߡߊ߬ߘߛߍ ߛߊߞߍߟߌ ߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߐ߫. #1463 (ߛߊߞߍߣߍ߲ #640)\n- ߦߋߡߍߕߊ߫ ߘߐߛߊߙߌߟߊ߲ ߓߊߖߎ ߛߊߞߍߟߌ #1509 \n  - ߡߛߊ߬ߦߟߌ߫ ߗߏ߯ߦߊ߫ ߛߊߞߍߟߌ߸ ߡߍ߲ ߦߋ߫ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߌ߬ߟߊ߬ ߟߊ߫ ߝߝߝ ߟߊ߫ ߖߡߊ߬ߙߌ߬ ߞߎߘߊ߫ ߡߊߛߐ߬ߘߐ߲߬ ߘߊ߫ ߞߵߊ߬ ߕߘߍ߬ ߘߐߛߊߙߌߟߊ߲ ߥߊߟߌߘߊ ߦߋ߫ ߝߊ߲߬ߝߘߊ߬ߞߘߐ߬ߟߊ ߘߐ߫.\n  - ߘߐߛߊߙߌߟߊ߲ ߝߎ߲ߞߊ߲ߡߊ ߡߊߖߌ߱ ߛߊߞߍߟߌ ߡߍ߲ ߕߍ߫ ߘߐߛߊߙߌߟߊ߲ ߥߦߊ߬ ߟߊ߫ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߝߎ߲ߞߊ߲ߡߊ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߡߊ߫ ߘߌ߫.\n"
  },
  {
    "path": "fastlane/metadata/android/nqo/changelogs/68.txt",
    "content": "# ߓ߀.߁߄.߁ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬\n\n### ߛߊߞߍߟߌ ߟߎ߬\n- ߦߋߡߍ߲ߕߊ߫ ߛߘߌ߬ߜߋ߲߫ ߘߏߝߙߍߕߍߓߐ ߗߌߙߏ߲ #1659 \n- ߞߊ߲߬ߛߓߍ߫ ߛߘߌ߬ߜߋ߲ ߕߎ߲߬ ߕߍ߫ ߟߛߊ߬ ߟߴߊ߬ ߢߌ߲߬ߡߊ ߟߊ߫ #1657\n\n# ߓ߀.߁߄.߀ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬\n\n### ߞߎߘߊ ߟߎ߬\n- ߞߎ߲ߓߍ߲߫ ߞߙߍ߬ߢߍ #1461\n- ߟߊ߬ߛߣߍ߬ߟߌ߬ ߞߐߜߍ߫ ߟߊߖߘߍ߬ߕߦߊ߬ߕߊ #1461\n\n### ߟߡߊ߬ߟߌ ߟߎ߬\n- ߡߊ߬ߡߙߊ߬ߟߌ߫ ߖߍ߰ߙߍ߬ߡߊ ߟߎ߬ ߓߘߊ߫ ߘߐߓߊ߯ߙߊ߫ #1604\n- ߘߐߛߊߙߌߟߊ߲߫ ߝߎ߲ߞߊ߲ߡߊ߫ ߘߊߕߎ߲߯ ߢߊ߫ ߞߎߘߊ #1597\n\n### ߛߊߞߍߟߌ ߟߎ߬\n- ߝߎ߬ߕߎ߲߬ߕߌ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߖߊ߬ߕߋ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬. ߏ߬ ߘߌ߫ ߘߊߕߎ߲߯ #1649.\n  - ߏ߬ ߘߐ߫߸ ߊ߬ ߘߴߊ߬ ߦߌ߬ߘߊ߬ ߞߏ߫ \"ߡߊ߬ߝߘߎ߬ߓߊ߮ ߖߊ߬ߕߋ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬\".\n- ߛߊߞߍߟߌ ߓߘߊ߫ ߞߍ߫ NPE ߟߊ߫߸ ߣߌ߫ ߦߕߎߓߎ߫ ߕߏߟߏ߲ߛߙߍߘߍ ߘߏ߫ ߘߐߞߏߟߏ߲ ߦߋ߫\n- ߝߎ߲ߞߎ߲ߟߋ߲ ߠߎ߬ SoundCloud ߞߣߐ߫\n- ߜߊߛߊ߲ߠߌ߲߫ ߘߐߓߊ߯ߙߊ ߣߵߊ߬ ߛߊߞߍߟߌ #1623 \n- ߢߌߣߌ߲ߠߌ߲߫ ߞߎ߲߬ߕߊ߰ߡߊ ߟߎ߬ ߞߐߝߟߌ #1562\n- ߢߌߣߌ߲ߠߌ߲߫ ߜߋߟߊ߲ߞߊ ߡߍ߲ ߡߊ߫ ߓߌ߲߬ߟߊ߬ ߞߐߜߍ ߞߊ߬ ߞߵߊ߬ ߜߊߘߊ߲߫\n- ߦߕߎߕߓߎ߫ ߛߙߊ߬ߕߊ ߦߋߡߍ߲ߕߊ ߡߍ߲ ߠߎ߬ ߓߟߏߕߍ߰ ߞߏߢߊ߬\n- ߦߋߡߍ߲ߕߊ ߡߍ߲ ߠߎ߬ ߕߍ߫ ߖߛߐ߫ ߟߊ߫ ߡߎ߰ߡߍ߫ (DASH ߘߐߞߕߌ߫ ߞߏߛߐ߲߬)\n- ߛߘߌ߲߬ߜߋ߲ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߦߋߡߍ߲ߕߊ ߟߎ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫\n- ߊ߬ ߘߌ߫ ߖߊ߲߬ߘߐ߬ߓߌ߬ߟߊ߬ߟߌ ߦߌ߬ߘߊ߬ ߣߌ߫ ߡߐ߱ ߘߏ߫ ߞߵߊ߬ ߝߐ߫ ߞߴߊ߬ ߦߋ߫ ߟߊ߬ߖߌ߰ߟߌ ߞߍ߫ ߟߊ߫ ߞߐߞߊ߫ ߦߟߌߕߏߟߊ߲ ߞߊ߲߬\n- ߢߌ߬ߣߊ߬ߓߐ߬ߕߊ \"ߝߏ߬ߛߌ߬ ߡߊ߫ ߛߌߝߊ߫\" ߡߍ߲ ߘߌ߫ ߘߊ߬ߕߍ߰ߟߌ ߟߊߟߥߌ߬\n- ߞߏ߬ߋߞߏ߬ߋ ߕߍ߫ ߝߍ߲߬ߛߍ߲߬ ߠߊ߫ ߊ߲ߘߙߏߌߘ ߈.߁ ߘߐ߬ߛߊ߬ߙߌ߬ߟߊ߲ ߓߊߖߎ ߞߣߐ߫ [ߊ߬ ߝߟߍ߫ ߦߊ߲߬](https://github.com/TeamNewPipe/NewPipe/issues/943)\n- ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߠߌ߲߫ ߟߊߛߣߍߟߊ߲ ߠߊߞߎ߲߬ߘߎ. ߏ߬ ߦߋ߫ ߞߎ߲ߓߍ߲ ߘߊߕߎ߲߯ ߠߊ߫ #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/nqo/full_description.txt",
    "content": "NewPipe ߕߍ߫ ߜ߭ߎߜ߭ߐߟ ߟߊ߫ ߝߊߙߡߑߥߐߙߞ ߟߍߙߘߊ߫ ߛߌ߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߥߟߊ߫ ߦߕߎߓߎ߫ ߟߊ߫ API. ߊ߬ ߦߋ߫ ߗߍߦߙߐ ߘߐߛߍ߲߬ߛߍ߲߬ ߠߊ߫ ߟߵߊ߬ ߘߊߞߘߐ߫ ߞߊ߬ ߟߐ߲ߕߊ߫ ߡߊ߬ߞߏ߬ߡߊ ߟߎ߫ ߛߐ߬ߘߐ߲߬. ߏ߬ ߞߏߛߐ߲߬ ߟߥߊߟߌߟߊ߲ ߣߌ߲߬ ߘߌ߫ ߛߋ߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫ ߕߙߏߞߏ ߞߊ߲߬ ߤߊߟߌ߬ ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߜ߭ߎߜ߭ߐߟ ߗߋߢߊ ߟߎ߬ ߡߊߗߍߣߍ߲߫ ߕߍ߫. ߊ߬ ߣߴߌߞߐ߫߸ ߌ ߡߊ߬ߞߏ߬ ߕߍ߫ ߦߕߎߓߎ߫ ߖߊߕߋߘߊ߫ ߟߊ߫ ߞߊ߬ ߣߌߎߔߌߔ ߟߊߓߊ߯ߙߊ߫. ߊ߬ ߘߏ߲߬ ߝߛߙߌ ߟߋ߬ ߘߌ߫.\n"
  },
  {
    "path": "fastlane/metadata/android/nqo/short_description.txt",
    "content": "ߦߕߎߓߎ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߣߌ߫ ߝߍߡߊ߲ ߢߊߝߘߍ߫ ߊ߲ߘߙߏߌߘ ߢߍ߫.\n"
  },
  {
    "path": "fastlane/metadata/android/or/full_description.txt",
    "content": "NewPipe କୌଣସି ଗୁଗୁଲ୍ framework କରେ ନାହିଁ | ଏହା ଆବଶ୍ୟକ କରୁଥିବା ସୂଚନା ହାସଲ କରିବା ପାଇଁ ଏହା କେବଳ ୱେବସାଇଟ୍ କୁ ବିଶ୍ଳେଷଣ କରେ | ତେଣୁ ଗୁଗୁଲ୍ ସର୍ଭିସ୍ ଇନଷ୍ଟଲ୍ ହୋଇନଥିବା ଡିଭାଇସରେ ଏହି ଆପ୍ ବ୍ୟବହାର କରାଯାଇପାରିବ | ଆହୁରି ମଧ୍ୟ, NewPipe ବ୍ୟବହାର କରିବା ପାଇଁ ଆପଣଙ୍କୁ ଏକ ୟୁଟ୍ୟୁବ୍ ଆକାଉଣ୍ଟ୍ ଦରକାର ନାହିଁ, ଏବଂ ଏହା FLOSS |\n"
  },
  {
    "path": "fastlane/metadata/android/or/short_description.txt",
    "content": "ଏକ ମାଗଣା ହାଲୁକା Youtube ସେବା Android ପାଇଁ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/1000.txt",
    "content": "ਸੁਧਾਰਿਆ ਗਿਆ\n• ਵੱਧ/ਘੱਟ ਸਮੱਗਰੀ ਦਿਖਾਉਣ ਲਈ ਪਲੇਲਿਸਟ ਵਰਣਨ ਨੂੰ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਬਣਾਓ\n• [PeerTube] `subscribeto.me` ਇੰਸਟੈਂਸ ਲਿੰਕਾਂ ਨੂੰ ਆਟੋਮੈਟਿਕ ਹੀ ਹੈਂਡਲ ਕਰੋ\n• ਇਤਿਹਾਸ ਸਕਰੀਨ ਵਿੱਚ ਸਿਰਫ਼ ਸਿੰਗਲ ਆਈਟਮ ਨੂੰ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ\n\nਫਿਕਸਡ\n• RSS ਬਟਨ ਦੀ ਦਿੱਖ ਨੂੰ ਠੀਕ ਕਰੋ\n• ਸੀਕਬਾਰ ਪੂਰਵਦਰਸ਼ਨ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ\n• ਥੰਮਨੇਲ-ਰਹਿਤ ਆਈਟਮ ਦੀ ਪਲੇਲਿਸਟਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ\n• ਸੰਬੰਧਿਤ ਆਈਟਮਾਂ ਦੀ ਸੂਚੀ ਐਨਕਿਊ ਪੌਪ-ਅਪ ਨੂੰ ਠੀਕ ਕਰੋ\n• ਅਤੇ ਹੋਰ ਪਲੇਲਿਸਟ ਤੇ ਡਾਊਨਲੋਡ ਸਬੰਧਤ ਫਿਕਸ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/1001.txt",
    "content": "ਸੁਧਾਰਿਆ ਗਿਆ\n• ਐਂਡਰਾਇਡ 13+ 'ਤੇ ਪਲੇਅਰ ਸੂਚਨਾ ਤਰਜੀਹਾਂ ਨੂੰ ਹਮੇਸ਼ਾ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦਿਓ\n\nਠੀਕ ਕੀਤਾ ਗਿਆ\n• ਡੇਟਾਬੇਸ/ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਨਿਰਯਾਤ ਕਰਨ ਨਾਲ ਪਹਿਲਾਂ ਤੋਂ ਮੌਜੂਦ ਫਾਈਲ ਨੂੰ ਕੱਟਿਆ ਨਹੀਂ ਜਾਵੇਗਾ, ਜਿਸ ਨਾਲ ਸੰਭਾਵਤ ਤੌਰ 'ਤੇ ਖਰਾਬ ਨਿਰਯਾਤ ਹੋ ਸਕਦਾ ਹੈ\n• ਟਾਈਮਸਟੈਂਪ 'ਤੇ ਕਲਿੱਕ ਕਰਨ 'ਤੇ ਪਲੇਅਰ ਨੂੰ ਸ਼ੁਰੂ ਤੋਂ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਨੂੰ ਠੀਕ ਕਰੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/1002.txt",
    "content": "YouTube ਵੱਲੋਂ ਕੋਈ ਵੀ ਸਟ੍ਰੀਮ ਨਾ ਚਲਾਉਣ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ ਹੈ।\n\nਇਹ ਰੀਲੀਜ਼ ਸਿਰਫ਼ ਉਸ ਸਭ ਤੋਂ ਵੱਡੀ ਗਲਤੀ ਨੂੰ ਹੱਲ ਕਰਦੀ ਹੈ ਜੋ YouTube ਵੀਡੀਓ ਵੇਰਵਿਆਂ ਨੂੰ ਲੋਡ ਹੋਣ ਤੋਂ ਰੋਕਦੀ ਹੈ।\nਅਸੀਂ ਜਾਣਦੇ ਹਾਂ ਕਿ ਹੋਰ ਸਮੱਸਿਆਵਾਂ ਵੀ ਹਨ, ਅਤੇ ਅਸੀਂ ਜਲਦੀ ਹੀ ਉਨ੍ਹਾਂ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਇੱਕ ਵੱਖਰੀ ਰੀਲੀਜ਼ ਕਰਾਂਗੇ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/1003.txt",
    "content": "ਇਹ ਇੱਕ ਹੌਟਫਿਕਸ ਰੀਲੀਜ਼ ਹੈ ਜੋ YouTube ਗਲਤੀਆਂ ਨੂੰ ਠੀਕ ਕਰਦੀ ਹੈ:\n• [YouTube] ਵੀਡੀਓ ਚਲਾਉਣ ਦੌਰਾਨ ਕਿਸੇ ਵੀ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਨੂੰ ਲੋਡ ਨਾ ਹੋਣ ਨੂੰ ਠੀਕ ਕਰੋ, ਵੀਡੀਓ ਚਲਾਉਂਦੇ ਸਮੇਂ HTTP 403 ਗਲਤੀਆਂ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ ਕੁਝ ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓਜ਼ ਦੇ ਪਲੇਬੈਕ ਨੂੰ ਬਹਾਲ ਕਰੋ\n• ਕੈਪਸ਼ਨ ਆਕਾਰਾਂ ਨੂੰ ਨਾ ਬਦਲਣ ਨੂੰ ਠੀਕ ਕਰੋ\n• ਸਟ੍ਰੀਮ ਖੋਲ੍ਹਣ ਵੇਲੇ ਦੋ ਵਾਰ ਡਾਊਨਲੋਡਿੰਗ ਜਾਣਕਾਰੀ ਨੂੰ ਠੀਕ ਕਰੋ\n• [Soundcloud] ਨਾ ਚਲਾਏ ਜਾ ਸਕਣ ਵਾਲੇ DRM-ਸੁਰੱਖਿਅਤ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਹਟਾਓ\n• ਅੱਪਡੇਟ ਕੀਤੇ ਅਨੁਵਾਦ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/1004.txt",
    "content": "ਇਹ ਰੀਲੀਜ਼ ਸਿਰਫ਼ 360p ਸਟ੍ਰੀਮ ਪ੍ਰਦਾਨ ਕਰਨ ਵਾਲੇ YouTube ਨੂੰ ਠੀਕ ਕਰਦੀ ਹੈ।\n\nਧਿਆਨ ਦਿਓ ਕਿ ਇਸ ਸੰਸਕਰਣ ਵਿੱਚ ਵਰਤਿਆ ਗਿਆ ਹੱਲ ਸੰਭਾਵਤ ਤੌਰ 'ਤੇ ਅਸਥਾਈ ਹੈ, ਅਤੇ ਲੰਬੇ ਸਮੇਂ ਵਿੱਚ SABR ਵੀਡੀਓ ਪ੍ਰੋਟੋਕੋਲ ਨੂੰ ਲਾਗੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ, ਪਰ TeamNewPipe ਮੈਂਬਰ ਇਸ ਸਮੇਂ ਰੁੱਝੇ ਹੋਏ ਹਨ ਇਸ ਲਈ ਕਿਸੇ ਵੀ ਮਦਦ ਦੀ ਬਹੁਤ ਪ੍ਰਸ਼ੰਸਾ ਕੀਤੀ ਜਾਵੇਗੀ! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/1005.txt",
    "content": "ਨਵਾਂ\n• Android Auto ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਿਲ ਕਰਨ ਸਮੇਤ YouTube ਲਈ ਅਸਥਾਈ ਪਲੇਲਿਸਟ ਵਜੋਂ ਸ਼ੇਅਰ ਫੰਕਸ਼ਨ ਤੇ SoundCloud ਲਈ ਲਾਈਕਸ ਚੈਨਲ ਟੈਬ ਨਵੀਂ ਐਡ ਕੀਤੀ\n• ਫੀਡ ਗਰੁੱਪਾਂ ਨੂੰ ਮੁੱਖ ਸਕ੍ਰੀਨ ਟੈਬਾਂ ਵਜੋਂ ਸੈੱਟ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ\n\nਦਰੁਸਤ ਕੀਤੇ\n• ਡਾਰਕ ਥੀਮਾਂ 'ਤੇ ਟੈਕਸਟ ਰੰਗਾਂ ਨੂੰ ਠੀਕ ਕਰੋ\n• [YouTube] ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਜੋ 100 ਤੋਂ ਵੱਧ ਆਈਟਮਾਂ ਲੋਡ ਨਹੀਂ ਕਰਦੀਆਂ\n• [YouTube] ਸਿਫਾਰਸ਼ ਕੀਤੀਆਂ ਵੀਡੀਓਜ਼ ਦੀ ਅਣਉਪਲੱਬਧਤਾ ਨੂੰ ਠੀਕ ਕਰੋ\n• ਟਿੱਪਣੀਆਂ ਦੇ ਜਵਾਬ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪਾਂ ਨੂੰ ਠੀਕ ਕਰੋ\nਪੂਰੇ ਬਦਲਾਵਾਂ ਵਾਸਤੇ ਗਿਟਹੱਬ ਤੇ dev ਸ਼ਾਖਾ ਟੈਗ ਅਨੁਸਾਰ ਬਦਲਾਅ ਵੇਖੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/1006.txt",
    "content": "# ਸੁਧਾਰਿਆ ਗਿਆ\nਟਾਈਮਸਟੈਂਪਾਂ 'ਤੇ ਕਲਿੱਕ ਕਰਦੇ ਸਮੇਂ ਮੌਜੂਦਾ ਪਲੇਅਰ ਰੱਖੋ\nਜਦੋਂ ਸੰਭਵ ਹੋਵੇ ਤਾਂ ਬਕਾਇਆ ਡਾਊਨਲੋਡ ਮਿਸ਼ਨਾਂ ਨੂੰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ\nਫਾਈਲ ਨੂੰ ਮਿਟਾਏ ਬਿਨਾਂ ਡਾਊਨਲੋਡ ਨੂੰ ਮਿਟਾਉਣ ਦਾ ਵਿਕਲਪ ਸ਼ਾਮਿਲ ਕਰੋ\non.soundcloud ਲਿੰਕ ਖੋਲ੍ਹਣ ਦਾ ਸਮਰਥਨ ਕਰੋ\n7 ਤੋਂ ਘੱਟ ਐਂਡਰਾਇਡ ਸੰਸਕਰਣਾਂ ਲਈ ਛੋਟੀ ਗਿਣਤੀ ਫਾਰਮੈਟਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ\nਖਾਲੀ ਨੋਟੀਫਿਕੇਸ਼ਨਾਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ\nSRT ਉਪਸਿਰਲੇਖ ਫਾਈਲਾਂ ਲਈ ਠੀਕ ਕੀਤਾ ਗਿਆ\nਬਹੁਤ ਸਾਰੇ ਕਰੈਸ਼ ਠੀਕ ਕੀਤੇ ਗਏ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/1007.txt",
    "content": "ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/63.txt",
    "content": "### ਸੁਧਾਰ\n- ਆਯਾਤ/ਨਿਰਯਾਤ ਸੈਟਿੰਗਾਂ #1333\n- ਓਵਰ ਡਰਾਅ ਘਟਾਇਆ ਗਿਆ (ਕਾਰਗੁਜ਼ਾਰੀ ਵਿੱਚ ਸੁਧਾਰ) #1371\n- ਨਿੱਕੇ ਕੋਡ ਸੁਧਾਰ #1375\n- ਜੀ.ਡੀ. ਪੀ.ਆਰ. ਬਾਰੇ ਸਾਰਾ ਕੁਝ ਜੋੜਿਆ #1420\n\n### ਸਹੀ ਕੀਤਾ ਗਿਆ\n- ਡਾਊਨਲੋਡਰ: .giga ਨਾਮਕ ਫਾਈਲਾਂ ਤੋਂ ਅਧੂਰੇ ਡਾਊਨਲੋਡ ਲੋਡ ਕਰਨ ਤੇ ਬੰਦ ਹੋਣਾ ਸਹੀ ਕੀਤਾ ਗਿਆ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/64.txt",
    "content": "### ਸੁਧਾਰ\n- ਮੋਬਾਈਲ ਡਾਟਾ ਦੀ ਵਰਤੋਂ ਕਰਨ ਤੇ ਵੀਡੀਓ ਗੁਣਤਾ ਨੂੰ ਸੀਮਤ ਕਰਨ ਦੀ ਸਮਰੱਥਾ ਨੂੰ ਜੋੜਿਆ। #1339 \n- ਸੈਸ਼ਨ ਲਈ ਚਮਕ ਯਾਦ ਰੱਖੋ #1442 \n- ਕਮਜ਼ੋਰ ਸੀ ਪੀ ਯੂ #1431 ਲਈ ਡਾਊਨਲੋਡ ਪ੍ਰਦਰਸ਼ਨ ਵਿੱਚ ਸੁਧਾਰ ਕੀਤਾ \n- ਮੀਡੀਆ ਸੈਸ਼ਨ #1433 ਲਈ (ਕੰਮ ਕਰਨਾ) ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ\n\n### ਸਹੀ ਕੀਤਾ ਗਿਆ\n- ਸ਼ੁਰੂਆਤੀ ਡਾਊਨਲੋਡਾਂ 'ਤੇ ਕਰੈਸ਼ ਨੂੰ ਠੀਕ ਕੀਤਾ (ਰਿਲੀਜ਼ ਬਿਲਡਾਂ ਲਈ ਹੁਣ ਇਹ ਫਿਕਸ ਉਪਲਬਧ ਹੈ) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/65.txt",
    "content": "### ਸੁਧਾਰ\n\n- ਬਰਗਰ ਮੀਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ ਨੂੰ ਅਯੋਗ ਕਰੋ #1486\n- ਡਾਊਨਲੋਡਸ ਨੂੰ ਅਨਡੂ ਕਰੋ #1472\n- ਸ਼ੇਅਰ ਮੀਨੂ ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ #1498\n- ਲੰਬੇ ਟੈਪ ਮੀਨੂ ਵਿੱਚ ਸਾਂਝਾ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #1454\n- ਐਕਸੋਪਲੇਅਰ 2.8.2 ਅਪਡੇਟ #1392\n- ਕਈ UI ਫਿਕਸ: #1383\n\n### ਫਿਕਸ\n\n- ਵਿਊ ਹਿਸਟਰੀ ਫਿਕਸ #1497\n- #1495, ਜਿਵੇਂ ਹੀ ਉਪਭੋਗਤਾ ਪਲੇਲਿਸਟ ਤੱਕ ਪਹੁੰਚ ਕਰਦਾ ਹੈ, ਮੈਟਾਡੇਟਾ (ਥੰਬਨੇਲ, ਸਿਰਲੇਖ ਅਤੇ ਵੀਡੀਓ ਗਿਣਤੀ) ਨੂੰ ਅਪਡੇਟ ਕਰਕੇ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/66.txt",
    "content": "# v0.13.7 ਲਈ ਚੇਂਜਲੌਗ\n\n### ਫਿਕਸ\n- v0.13.6 ਤੋਂ ਸੌਰਟ ਫਿਲਟਰ ਨਾਲ ਸਮੱਸਿਆਵਾਂ ਹੱਲ ਕੀਤੀਆਂ ਗਈਆਂ।\n\n# v0.13.6 ਲਈ ਚੇਂਜਲੌਗ\n\n### ਸੁਧਾਰ\n\n- ਬਰਗਰ ਮੀਨੂ ਆਈਕਨ ਐਨੀਮੇਸ਼ਨ #1486 ਨੂੰ ਅਯੋਗ ਕਰੋ\n- ਡਾਊਨਲੋਡਸ ਨੂੰ ਮਿਟਾਓ ਨੂੰ ਅਣਡੂ ਕਰੋ #1472\n- ਸ਼ੇਅਰ ਮੀਨੂ ਵਿੱਚ ਡਾਊਨਲੋਡ ਵਿਕਲਪ #1498\n- ਲੰਬੇ ਟੈਪ ਮੀਨੂ ਵਿੱਚ ਸ਼ੇਅਰ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #1454\n- ਐਕਸੋਪਲੇਅਰ 2.8.2 ਅਪਡੇਟ #1392\nਕਈ UI ਫਿਕਸ: #1383\n\n### ਫਿਕਸ\n\n- ਫਿਕਸ ਕੀਤਾ ਗਿਆ #1440 ਟੁੱਟਿਆ ਹੋਇਆ ਵੀਡੀਓ ਜਾਣਕਾਰੀ ਲੇਆਉਟ #1491\n- ਇਤਿਹਾਸ ਦੇਖੋ ਫਿਕਸ #1497\n- ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਫਿਕਸ #1509.\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/68.txt",
    "content": "# v0.14.1 ਵਿੱਚ ਬਦਲਾਅ\n\n### ਠੀਕ ਕੀਤਾ ਗਿਆ\n- ਵੀਡੀਓ URL ਨੂੰ ਡੀਕ੍ਰਿਪਟ ਕਰਨ ਵਿੱਚ ਅਸਫਲਤਾ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ #1659\n- ਵਰਣਨ ਲਿੰਕ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਐਕਸਟਰੈਕਟ ਨਾ ਕਰਨ ਦੀ ਸਮੱਸਿਆ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ #1657\n\n# v0.14.0 ਵਿੱਚ ਬਦਲਾਅ\n\n### ਨਵਾਂ\n- ਨਵਾਂ ਦਰਾਜ਼ ਡਿਜ਼ਾਈਨ #1461\n- ਨਵਾਂ ਅਨੁਕੂਲਿਤ ਫਰੰਟ ਪੇਜ #1461\n\n### ਸੁਧਾਰ\n- ਪੌਪਅੱਪ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨ ਦਾ ਨਵਾਂ ਤਰੀਕਾ #1597\n\n### ਠੀਕ ਕੀਤਾ ਗਿਆ\n- YouTube ਪਲੇਲਿਸਟਾਂ ਖਾਲੀ ਹੋਣ 'ਤੇ NPE ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ\n- SoundCloud ਵਿੱਚ ਕਿਓਸਕ ਲਈ ਤੁਰੰਤ ਠੀਕ ਕੀਤਾ ਗਿਆ\n- ਰੀਫੈਕਟਰ ਅਤੇ ਬੱਗਫਿਕਸ #1623.\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/69.txt",
    "content": "### ਨਵਾਂ\n- ਗਾਹਕੀਆਂ 'ਤੇ ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਟੈਪ ਕਰਕੇ ਮਿਟਾਓ ਅਤੇ ਸਾਂਝਾ ਕਰੋ #1516\n- ਟੈਬਲੇਟ UI ਅਤੇ ਗਰਿੱਡ ਸੂਚੀ ਲੇਆਉਟ #1617\n\n### ਸੁਧਾਰ\n- ਵਾਲੀਅਮ ਅਤੇ ਚਮਕ ਸੰਕੇਤਾਂ ਲਈ ਵੱਖਰੀਆਂ ਸੈਟਿੰਗਾਂ #1644\n- ਸਥਾਨਕਕਰਨ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ #1792\n\n### ਸੁਧਾਰ\n- . ਫਾਰਮੈਟ ਲਈ ਸਮਾਂ ਪਾਰਸਿੰਗ ਠੀਕ ਕਰੋ ਤਾਂ ਜੋ ਫਿਨਲੈਂਡ ਵਿੱਚ ਨਿਊਪਾਈਪ ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾ ਸਕੇ\n- ਗਾਹਕੀ ਗਿਣਤੀ ਠੀਕ ਕਰੋ\n- API 28+ ਡਿਵਾਈਸਾਂ ਲਈ ਫੋਰਗਰਾਉਂਡ ਸੇਵਾ ਅਨੁਮਤੀ ਸ਼ਾਮਲ ਕਰੋ #1830\n\n### ਜਾਣੇ-ਪਛਾਣੇ ਬੱਗ\n- ਪਲੇਬੈਕ ਸਥਿਤੀ ਨੂੰ ਐਂਡਰਾਇਡ ਪੀ 'ਤੇ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/70.txt",
    "content": "ਸੁਧਾਰ\n* ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਹੁਣ ਇੱਕ ਕਲਿੱਕ ਨਾਲ ਖੋਲ੍ਹੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ #1879\n* ਐਂਡਰਾਇਡ 4.1 - 4.3 ਲਈ ਡ੍ਰੌਪ ਸਪੋਰਟ #1884\n* ਪੁਰਾਣੇ ਪਲੇਅਰ ਨੂੰ ਹਟਾਓ #1884\n* ਮੌਜੂਦਾ ਪਲੇ ਕਤਾਰ ਤੋਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸੱਜੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰਕੇ ਹਟਾਓ #1915\n* ਜਦੋਂ ਇੱਕ ਨਵੀਂ ਸਟ੍ਰੀਮ ਨੂੰ ਹੱਥੀਂ ਕਤਾਰਬੱਧ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਤਾਂ ਆਟੋ ਕਤਾਰਬੱਧ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਓ #1878\n* ਬਹੁਤ ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਅਸੰਗਤੀਆਂ ਠੀਕ ਕੀਤੀਆਂ ਗਈਆਂ\n\nਫਿਕਸਡ\n* ਬਹੁਤ ਸਾਰੀਆਂ ਅਸੰਗਤੀਆਂ ਠੀਕ ਕੀਤੀਆਂ ਗਈਆਂ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/71.txt",
    "content": "ਸੁਧਾਰ\n* GitHub ਬਿਲਡ ਲਈ ਐਪ ਅੱਪਡੇਟ ਸੂਚਨਾ ਸ਼ਾਮਲ ਕਰੋ (#1608 @krtkush ਦੁਆਰਾ)\n* ਡਾਊਨਲੋਡਰ ਵਿੱਚ ਕਈ ਸੁਧਾਰ (#1944 @kapodamy ਦੁਆਰਾ)\n* ਨਵੇਂ ਮਕਸਰ ਵਿੱਚ \"ਪੋਸਟ-ਪ੍ਰੋਸੈਸਿੰਗ ਅਸਫਲ\" ਗਲਤੀ ਨਾਲ ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ\n* ਨਵਾਂ MPEG-4 ਮਕਸਰ ਗੈਰ-ਸਮਕਾਲੀ ਵੀਡੀਓ ਅਤੇ ਆਡੀਓ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਠੀਕ ਕਰਦਾ ਹੈ (#2039)\n\nਫਿਕਸਡ\n* YouTube ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਥੋੜ੍ਹੇ ਸਮੇਂ ਬਾਅਦ ਚੱਲਣਾ ਬੰਦ ਕਰ ਦਿੰਦੀਆਂ ਹਨ (#1996 @yausername ਦੁਆਰਾ)\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/730.txt",
    "content": "# ਠੀਕ ਕੀਤਾ \n- ਹੌਟ ਫਿਕਸ ਦੁਬਾਰਾ ਗਲਤ ਹੋਇਆ ਡੀਕ੍ਰਿਪਟ ਫੰਕਸ਼ਨ ਠੀਕ ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/740.txt",
    "content": "<h4>ਸੁਧਾਰ</h4>\n<ul>\n<li>ਟਿੱਪਣੀਆਂ ਵਿੱਚ ਲਿੰਕਾਂ ਨੂੰ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਬਣਾਓ, ਟੈਕਸਟ ਦਾ ਆਕਾਰ ਵਧਾਓ</li>\n<li>ਟਿੱਪਣੀਆਂ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪ ਕੀਤੇ ਲਿੰਕਾਂ 'ਤੇ ਕਲਿੱਕ ਕੀਤੇ ਜਾਣ 'ਤੇ ਖੋਜ ਕਰੋ</li>\n<li>ਜਦੋਂ ਸਾਂਝਾ ਕੀਤਾ ਟੈਕਸਟ URL ਨਾ ਹੋਵੇ ਤਾਂ ਖੋਜ ਕਰੋ</li>\n<li>ਮੁੱਖ ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ \"ਹੁਣੇ ਸਾਂਝਾ ਕਰੋ\" ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ</li>\n<li>ExoPlayer ਨੂੰ 2.9.6 'ਤੇ ਅੱਪਡੇਟ ਕਰਨਾ</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/750.txt",
    "content": "ਨਵਾਂ\nਪਲੇਬੈਕ ਰੈਜ਼ਿਊਮੇ #2288\nਡਾਊਨਲੋਡਰ ਸੁਧਾਰ #2149\n• ਬਾਹਰੀ SD-ਕਾਰਡਾਂ 'ਤੇ ਡਾਊਨਲੋਡ ਸਟੋਰ ਕਰਨ ਲਈ ਸਟੋਰੇਜ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦੀ ਵਰਤੋਂ ਕਰੋ\n• ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਵਿਕਲਪਿਕ ਤੌਰ 'ਤੇ ਡਾਊਨਲੋਡ ਡਾਇਰੈਕਟਰੀ ਬਦਲੋ\n• ਮੀਟਰ ਕੀਤੇ ਨੈੱਟਵਰਕਾਂ ਦਾ ਸਤਿਕਾਰ ਕਰੋ\n\nਸਥਿਰ\n• [YouTube] ਸਥਿਰ ਮਿਆਦ ਨੂੰ ਪਾਰਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/760.txt",
    "content": "0.17.1 ਵਿੱਚ ਬਦਲਾਅ\n\nਸੁਧਾਰਿਆ ਗਿਆ\n• ਪਲੇਲਿਸਟਾਂ ਲਈ ਦੁਬਾਰਾ ਲੰਬੇ-ਦਬਾਓ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ ਇੱਥੇ ਚਲਾਉਣਾ ਸ਼ੁਰੂ ਕਰੋ ਐਕਸ਼ਨ ਸ਼ਾਮਲ ਕਰੋ\n• SAF / ਲੀਗੇਸੀ ਫਾਈਲ ਪਿਕਰ #2521 ਲਈ ਸਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ\nਫਿਕਸਡ\n• ਐਪਸ ਨੂੰ ਸਵਿੱਚ ਕਰਦੇ ਸਮੇਂ ਡਾਊਨਲੋਡ ਵਿਊ ਵਿੱਚ ਗਾਇਬ ਹੋਣ ਵਾਲੇ ਬਟਨਾਂ ਨੂੰ ਠੀਕ ਕਰੋ #2487\n• ਦੇਖਣ ਦੇ ਇਤਿਹਾਸ ਨੂੰ ਅਯੋਗ ਹੋਣ ਦੇ ਬਾਵਜੂਦ ਸਟੋਰ ਕੀਤੀ ਗਈ ਪਲੇਬੈਕ ਸਥਿਤੀ ਨੂੰ ਠੀਕ ਕਰੋ\n• ਸੂਚੀ ਵਿਊ ਵਿੱਚ ਪਲੇਬੈਕ ਸਥਿਤੀ ਕਾਰਨ ਘਟੀ ਹੋਈ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ\n• [ਐਕਸਟ੍ਰੈਕਟਰ] [YouTube] ਜਦੋਂ ਪਲੇਲਿਸਟਾਂ ਨਤੀਜਿਆਂ ਵਿੱਚ ਹੋਣ ਤਾਂ ਆਮ ਖੋਜ ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/770.txt",
    "content": "0.17.2 ਵਿੱਚ ਬਦਲਾਅ \n\nਠੀਕ ਕਰੋ \n• ਫਿਕਸ ਕੋਈ ਵੀ ਵੀਡੀਓ ਉਪਲਬਧ ਨਹੀਂ ਸੀ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/780.txt",
    "content": "0.17.3 ਵਿੱਚ ਬਦਲਾਅ\n\nਸੁਧਾਰਿਆ ਗਿਆ\n• ਪਲੇਬੈਕ ਸਥਿਤੀਆਂ ਨੂੰ ਸਾਫ਼ ਕਰਨ ਲਈ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ #2550\n• ਫਾਈਲ ਚੋਣਕਾਰ #2591 ਵਿੱਚ ਲੁਕੀਆਂ ਹੋਈਆਂ ਡਾਇਰੈਕਟਰੀਆਂ ਦਿਖਾਓ\n• NewPipe #2488 ਨਾਲ ਖੋਲ੍ਹੇ ਜਾਣ ਵਾਲੇ `invidio.us` ਉਦਾਹਰਣਾਂ ਤੋਂ URL ਦਾ ਸਮਰਥਨ ਕਰੋ\n• `music.youtube.com` URL ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ\n\nਸਥਿਰ\n• [YouTube] ਫਿਕਸਡ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਕੰਮ ਨਹੀਂ ਕਰ ਰਹੀਆਂ\n• ਸਟ੍ਰੀਮ ਡਾਊਨਲੋਡ ਕਰਦੇ ਸਮੇਂ ਐਂਡਰਾਇਡ ਪਾਈ ਵਿੱਚ ਪ੍ਰਦਰਸ਼ਨ ਸਮੱਸਿਆ ਹੱਲ ਕੀਤੀ ਗਈ #2592\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/790.txt",
    "content": "ਸੁਧਾਰਿਆ ਗਿਆ\n• ਹੋਰ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ\n\nਠੀਕ ਕੀਤਾ ਗਿਆ\n• ਜਾਂਚ ਕਰੋ ਕਿ ਕੀ ਬਲਾਕ ਵਿੱਚ ਆਖਰੀ ਬਾਈਟ ਡਾਊਨਲੋਡ ਕੀਤਾ ਗਿਆ ਹੈ #2646\n• ਵੀਡੀਓ ਵੇਰਵੇ ਵਾਲੇ ਟੁਕੜੇ #2672 ਵਿੱਚ ਸਕ੍ਰੌਲਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ\n• [SoundCloud] client_id ਐਕਸਟਰੈਕਸ਼ਨ #2745 ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ\n\nਵਿਕਾਸ\n• AndroidX 'ਤੇ ਮਾਈਗ੍ਰੇਟ ਕਰੋ\n• ExoPlayer 2.10.6 'ਤੇ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/800.txt",
    "content": "ਨਵਾਂ\n• P2P ਤੋਂ ਬਿਨਾਂ PeerTube ਸਹਾਇਤਾ (#2201) [ਬੀਟਾ]:\n\n◦ ਲੰਬੇ ਵਿਰਾਮ ਤੋਂ ਬਾਅਦ ਡਾਊਨਲੋਡ ਮੁੜ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਮਿਆਦ ਪੁੱਗ ਚੁੱਕੇ ਡਾਊਨਲੋਡ ਲਿੰਕਾਂ ਨੂੰ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰੋ\n\nਸੁਧਾਰਿਆ ਗਿਆ\n• ਪਸੰਦੀਦਾ ਸਮੱਗਰੀ ਦੇਸ਼ ਵਿੱਚ ਤਬਦੀਲੀਆਂ ਬਾਰੇ KioskFragment ਨੂੰ ਸੂਚਿਤ ਕਰੋ ਅਤੇ ਸਾਰੇ ਮੁੱਖ ਟੈਬਾਂ ਵਿੱਚ ਪ੍ਰਦਰਸ਼ਨ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ #2742\n\nਸਥਿਰ\n• Android 4.4 ਡਿਵਾਈਸਾਂ (API 19/KitKat) 'ਤੇ TLS1.1/1.2 ਨੂੰ ਸਮਰੱਥ ਬਣਾਓ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/810.txt",
    "content": "ਨਵਾਂ\n• ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਲਾਕ ਸਕ੍ਰੀਨ 'ਤੇ ਵੀਡੀਓ ਥੰਬਨੇਲ ਦਿਖਾਓ\n\nਸੁਧਾਰਿਆ ਗਿਆ\n• ਬੈਕਗ੍ਰਾਊਂਡ/ਪੌਪਅੱਪ ਬਟਨ ਨੂੰ ਦੇਰ ਤੱਕ ਦਬਾਉਣ 'ਤੇ ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਕਤਾਰ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ\n• [YouTube] /c/shortened_url ਚੈਨਲ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ\n\nਠੀਕ ਕੀਤਾ ਗਿਆ\n• NewPipe 'ਤੇ ਵੀਡੀਓ ਸਾਂਝੇ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦੀਆਂ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਿੱਧਾ ਡਾਊਨਲੋਡ ਕਰਨ ਵੇਲੇ ਕਈ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ\n• ਖੋਜ ਨਤੀਜਿਆਂ ਦੀ ਪੇਜਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ\n• [SoundCloud] client_id ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/820.txt",
    "content": "ਸਥਿਰ ਡੀਕ੍ਰਿਪਟ ਫੰਕਸ਼ਨ ਨਾਮ regex YouTube ਨੂੰ ਵਰਤੋਂਯੋਗ ਨਹੀਂ ਬਣਾਉਂਦਾ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/830.txt",
    "content": "SoundCloud ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ SoundCloud client_id ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/840.txt",
    "content": "ਨਵਾਂ\n• ਐਪ ਦੀ ਭਾਸ਼ਾ ਬਦਲਣ ਲਈ ਇੱਕ ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਜੋੜਿਆ ਗਿਆ\n• ਪਲੇਅਰ ਦੇ ਕੋਲੈਪਸੀਬਲ ਮੀਨੂ ਵਿੱਚ ਕੋਡੀ ਨੂੰ ਭੇਜੋ ਬਟਨ ਜੋੜਿਆ ਗਿਆ\n• ਟਿੱਪਣੀਆਂ ਦੀ ਕਾਪੀ ਕਰਨ ਲਈ ਇੱਕ ਲੰਮਾ-ਦਬਾਓ ਵਿਸ਼ੇਸ਼ਤਾ ਜੋੜਿਆ ਗਿਆ\n\nਸੁਧਾਰਿਆ ਗਿਆ\n• ਰੀਕੈਪਚਾ ਗਤੀਵਿਧੀ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ ਅਤੇ ਪ੍ਰਾਪਤ ਕੂਕੀਜ਼ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕੀਤਾ ਗਿਆ\n\nਠੀਕ ਕੀਤਾ ਗਿਆ\n• ਐਂਡਰਾਇਡ ਕਿਟਕੈਟ 'ਤੇ ਡਾਊਨਲੋਡਿੰਗ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/850.txt",
    "content": "ਇਸ ਰੀਲੀਜ਼ ਵਿੱਚ YouTube ਵੈੱਬਸਾਈਟ ਸੰਸਕਰਣ ਨੂੰ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ ਸੀ। ਪੁਰਾਣਾ ਵੈੱਬਸਾਈਟ ਸੰਸਕਰਣ ਮਾਰਚ ਵਿੱਚ ਬੰਦ ਹੋਣ ਜਾ ਰਿਹਾ ਹੈ ਅਤੇ ਇਸ ਲਈ ਤੁਹਾਨੂੰ ਨਿਊ ਪਾਈਪ ਨੂੰ ਅਪਗ੍ਰੇਡ ਕਰਨ ਦੀ ਲੋੜ ਹੈ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/860.txt",
    "content": "ਸੁਧਾਰ • ਸੇਵ ਕਰੋ ਅਤੇ ਰੀਸਟੋਰ ਕਰੋ ਕਿ ਕੀ ਪਿੱਚ ਅਤੇ ਟੈਂਪੋ ਅਣਹੁੱਕ ਹਨ ਜਾਂ ਨਹੀਂ • ਪਲੇਅਰ ਵਿੱਚ ਡਿਸਪਲੇ ਕੱਟਆਊਟ ਦਾ ਸਮਰਥਨ ਕਰੋ • ਗੋਲ ਦ੍ਰਿਸ਼ ਅਤੇ ਗਾਹਕਾਂ ਦੀ ਗਿਣਤੀ • ਘੱਟ ਡਾਟਾ ਵਰਤਣ ਲਈ YouTube ਨੂੰ ਅਨੁਕੂਲ ਬਣਾਇਆ ਗਿਆ ਇਸ ਰੀਲੀਜ਼ ਵਿੱਚ 15 ਤੋਂ ਵੱਧ YouTube-ਸਬੰਧਤ ਬੱਗ ਫਿਕਸ ਕੀਤੇ ਗਏ ਸਨ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/870.txt",
    "content": "ਇਹ ਇੱਕ ਹੌਟਫਿਕਸ ਰੀਲੀਜ਼ ਹੈ ਜੋ ਨਿਊਪਾਈਪ ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਰਿਹਾ ਹੈ ਤਾਂ ਜੋ ਦੁਬਾਰਾ ਵੱਡੀਆਂ ਮੁਸ਼ਕਲਾਂ ਤੋਂ ਬਿਨਾਂ ਸਾਉਂਡ ਕਲਾਉਡ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਜਾ ਸਕੇ। \nSoundCloud ਦਾ v2 API ਹੁਣ ਐਕਸਟਰੈਕਟਰ ਵਿੱਚ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ ਅਤੇ ਅਵੈਧ ਕਲਾਇੰਟ ਆਈਡੀ ਦੀ ਖੋਜ ਵਿੱਚ ਸੁਧਾਰ ਕੀਤਾ ਗਿਆ ਹੈ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/900.txt",
    "content": "ਨਵਾਂ • ਗਾਹਕੀ ਸਮੂਹ ਅਤੇ ਕ੍ਰਮਬੱਧ ਫੀਡ • ਖਿਡਾਰੀਆਂ ਵਿੱਚ ਮਿਊਟ ਬਟਨ ਸੁਧਾਰ • NewPipe ਵਿੱਚ music.youtube.com ਅਤੇ media.ccc.de ਲਿੰਕ ਖੋਲ੍ਹਣ ਦਿਓ • ਦਿੱਖ ਤੋਂ ਸਮੱਗਰੀ ਤੱਕ ਦੋ ਸੈਟਿੰਗਾਂ ਨੂੰ ਮੁੜ-ਸਥਾਪਿਤ ਕਰੋ • 5, 15, 25 ਸਕਿੰਟ ਦੇ ਸੀਕ ਵਿਕਲਪਾਂ ਨੂੰ ਲੁਕਾਓ ਜੇਕਰ ਅਢੁੱਕਵੀਂ ਖੋਜ ਸਮਰਥਿਤ ਹੈ ਸਥਿਰ • ਕੁਝ WebM ਵੀਡੀਓ ਖੋਜਣ ਯੋਗ ਨਹੀਂ ਹਨ • Android P 'ਤੇ ਡਾਟਾਬੇਸ ਬੈਕਅੱਪ • ਡਾਉਨਲੋਡ ਕੀਤੀ ਫਾਈਲ ਨੂੰ ਸਾਂਝਾ ਕਰਦੇ ਸਮੇਂ ਕਰੈਸ਼ • ਬਹੁਤ ਸਾਰੇ YouTube ਐਕਸਟਰੈਕਸ਼ਨ ਮੁੱਦੇ ਅਤੇ ਹੋਰ...\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/910.txt",
    "content": "ਸਥਿਰ ਡੇਟਾਬੇਸ ਮਾਈਗ੍ਰੇਸ਼ਨ ਜਿਸ ਨੇ ਕੁਝ ਦੁਰਲੱਭ ਮਾਮਲਿਆਂ ਵਿੱਚ ਨਿਊਪਾਈਪ ਨੂੰ ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਰੋਕਿਆ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/920.txt",
    "content": "ਸੁਧਾਰਿਆ ਗਿਆ\n\n• ਸਟ੍ਰੀਮ ਗਰਿੱਡ ਆਈਟਮਾਂ 'ਤੇ ਅਪਲੋਡ ਮਿਤੀ ਅਤੇ ਵਿਯੂ ਗਿਣਤੀ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ\n• ਦਰਾਜ਼ ਹੈਡਰ ਲੇਆਉਟ ਲਈ ਸੁਧਾਰ\n\nਠੀਕ ਕੀਤਾ ਗਿਆ\n\n• API 19 'ਤੇ ਕਰੈਸ਼ ਹੋਣ ਵਾਲੇ ਮਿਊਟ ਬਟਨ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ\n• ਲੰਬੇ 1080p 60fps ਵੀਡੀਓਜ਼ ਨੂੰ ਡਾਊਨਲੋਡ ਕਰਨਾ ਠੀਕ ਕੀਤਾ ਗਿਆ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/930.txt",
    "content": "ਨਵਾਂ\n• YouTube ਸੰਗੀਤ ਖੋਜੋ\n• ਮੁੱਢਲਾ Android TV ਸਮਰਥਨ\n\nਸੁਧਾਰਿਆ ਗਿਆ\n• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਤੋਂ ਸਾਰੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਹਟਾਉਣ ਦੀ ਯੋਗਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ\n• ਜਦੋਂ ਸਮੱਗਰੀ ਵਰਤਮਾਨ ਵਿੱਚ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ ਤਾਂ ਕ੍ਰੈਸ਼ ਹੋਣ ਦੀ ਬਜਾਏ ਇੱਕ ਸੁਨੇਹਾ ਦਿਖਾਓ\n\nਠੀਕ ਕੀਤਾ ਗਿਆ\n• ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਸਮੱਗਰੀ ਸੈਟਿੰਗਾਂ ਨਾਲ ਇੱਕ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ।\n\nਕੁਝ reCAPTCHA ਗਲਤੀਆਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ।\n\nਅਤੇ ਹੋਰ ਵੀ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/940.txt",
    "content": "ਨਵਾਂ\n• SoundCloud ਟਿੱਪਣੀਆਂ ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ\n• YouTube ਪ੍ਰਤਿਬੰਧਿਤ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕਰੋ\n• PeerTube ਪੇਰੈਂਟ ਚੈਨਲ ਵੇਰਵੇ ਦਿਖਾਓ\n\nਸੁਧਾਰਿਆ ਗਿਆ\n• ਸਿਰਫ਼ ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ ਲਈ Kore ਬਟਨ ਦਿਖਾਓ\n\nਠੀਕ ਕੀਤਾ ਗਿਆ\n• ਇੱਕ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕੀਤਾ ਗਿਆ ਜਿੱਥੇ ਡਾਊਨਲੋਡ ਡਾਇਲਾਗ ਫ੍ਰੀਜ਼ ਹੋ ਰਿਹਾ ਸੀ\n• ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ ਬਟਨ ਹੁਣ ਅਸਲ ਵਿੱਚ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੁੱਲ੍ਹਦਾ ਹੈ\n• ਵੀਡੀਓ ਖੋਲ੍ਹਣ ਵੇਲੇ ਕਰੈਸ਼ ਅਤੇ \"ਇਸ ਸਟ੍ਰੀਮ ਨੂੰ ਚਲਾਇਆ ਨਹੀਂ ਜਾ ਸਕਿਆ\"\n\nਅਤੇ ਹੋਰ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/950.txt",
    "content": "ਇਹ ਰੀਲੀਜ਼ ਤਿੰਨ ਛੋਟੇ ਫਿਕਸ ਲਿਆਉਂਦਾ ਹੈ: \n• Adroid 10+ 'ਤੇ ਸਥਿਰ ਸਟੋਰੇਜ ਪਹੁੰਚ \n• ਫਿਕਸਡ ਓਪਨਿੰਗ ਕਿਓਸਕ \n• ਲੰਬੇ ਵੀਡੀਓਜ਼ ਦੀ ਸਥਿਰ ਮਿਆਦ ਪਾਰਸਿੰਗ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/951.txt",
    "content": "ਨਵਾਂ\n• ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਚੋਣਕਾਰ ਲਈ ਖੋਜ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ\n• ਸਿਰਫ਼ ਅਣ-ਗਰੁੱਪ ਕੀਤੀਆਂ ਗਾਹਕੀਆਂ ਦਿਖਾਉਣ ਲਈ ਫੀਡ ਗਰੁੱਪ ਡਾਇਲਾਗ ਵਿੱਚ ਇੱਕ ਫਿਲਟਰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ\n• ਮੁੱਖ ਪੰਨੇ 'ਤੇ ਇੱਕ ਪਲੇਲਿਸਟ ਟੈਬ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ\n\nਸੁਧਾਰਿਆ ਗਿਆ\n• ਮਕਸਡ ਫਾਈਲਾਂ ਵਿੱਚ ਐਪਲੀਕੇਸ਼ਨ ਮੈਟਾਡੇਟਾ ਲਿਖਣਾ ਬੰਦ ਕੀਤਾ ਗਿਆ\n• ਕਤਾਰ ਤੋਂ ਅਸਫਲ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਨਾ ਹਟਾਓ\n\nਠੀਕ ਕੀਤਾ ਗਿਆ\n• ਫਲੋਟਿੰਗ ਪੁਆਇੰਟ ਸੰਚਤ ਗਲਤੀਆਂ ਕਾਰਨ ਆਡੀਓ/ਵੀਡੀਓ ਡੀਸਿੰਕ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ\n\nਅਤੇ ਹੋਰ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/952.txt",
    "content": "ਸੁਧਾਰ \n• ਆਟੋ-ਪਲੇ ਸਾਰੀਆਂ ਸੇਵਾਵਾਂ ਲਈ ਉਪਲਬਧ ਹੈ (ਸਿਰਫ਼ YouTube ਦੀ ਬਜਾਏ) \n\nਠੀਕ ਕੀਤਾ\n• YouTube ਦੀਆਂ ਨਵੀਆਂ ਨਿਰੰਤਰਤਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰਕੇ ਸੰਬੰਧਿਤ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਸਥਿਰ ਕੀਤਾ ਗਿਆ \n• ਨਿਸ਼ਚਿਤ ਉਮਰ ਪ੍ਰਤਿਬੰਧਿਤ YouTube ਵੀਡੀਓ \n• [Android TV] ਸਥਿਰ ਲੰਮੀ ਫੋਕਸ ਹਾਈਲਾਈਟ ਓਵਰਲੇ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/953.txt",
    "content": "YouTube ਦੇ ਡੀਕ੍ਰਿਪਸ਼ਨ ਫੰਕਸ਼ਨ ਦੇ ਐਕਸਟਰੈਕਸ਼ਨ ਨੂੰ ਠੀਕ ਕਰੋ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/954.txt",
    "content": "• ਨਵਾਂ ਐਪ ਵਰਕਫਲੋ: ਵੇਰਵੇ ਵਾਲੇ ਪੰਨੇ 'ਤੇ ਵੀਡੀਓ ਚਲਾਓ, ਪਲੇਅਰ ਨੂੰ ਛੋਟਾ ਕਰਨ ਲਈ ਹੇਠਾਂ ਵੱਲ ਸਵਾਈਪ ਕਰੋ\n• ਮੀਡੀਆਸਟਾਈਲ ਸੂਚਨਾਵਾਂ: ਸੂਚਨਾਵਾਂ ਵਿੱਚ ਅਨੁਕੂਲਿਤ ਕਾਰਵਾਈਆਂ, ਪ੍ਰਦਰਸ਼ਨ ਸੁਧਾਰ\n• ਡੈਸਕਟੌਪ ਐਪ ਦੇ ਤੌਰ 'ਤੇ NewPipe ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਮੂਲ ਆਕਾਰ ਬਦਲਣਾ\n\n• ਇੱਕ ਅਸਮਰਥਿਤ URL ਟੋਸਟ ਦੀ ਸਥਿਤੀ ਵਿੱਚ ਖੁੱਲ੍ਹੇ ਵਿਕਲਪਾਂ ਦੇ ਨਾਲ ਇੱਕ ਡਾਇਲਾਗ ਦਿਖਾਓ\n• ਰਿਮੋਟ ਸੁਝਾਅ ਉਪਲਬਧ ਨਾ ਹੋਣ 'ਤੇ ਸੁਧਾਰਾਂ ਦਾ ਅਨੁਭਵ ਕਰੋ\n• ਡਿਫੌਲਟ ਵੀਡੀਓ ਗੁਣਵੱਤਾ 720p60 (ਇਨ-ਐਪ ਪਲੇਅਰ) ਅਤੇ 480p (ਪੌਪ-ਅੱਪ ਪਲੇਅਰ) ਤੱਕ ਵਧਾ ਦਿੱਤੀ ਗਈ\n\n• ਬੱਗ ਫਿਕਸ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/955.txt",
    "content": "[YouTube] ਕੁਝ ਉਪਭੋਗਤਾਵਾਂ ਲਈ ਖੋਜ ਨੂੰ ਠੀਕ ਕਰੋ \n[YouTube] ਬੇਤਰਤੀਬੇ ਡੀਕ੍ਰਿਪਸ਼ਨ ਅਪਵਾਦਾਂ ਨੂੰ ਠੀਕ ਕਰੋ \n[SoundCloud] ਸਲੈਸ਼ ਨਾਲ ਖਤਮ ਹੋਣ ਵਾਲੇ URL ਹੁਣ ਸਹੀ ਤਰ੍ਹਾਂ ਪਾਰਸ ਕੀਤੇ ਗਏ ਹਨ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/956.txt",
    "content": "[YouTube] ਕਿਸੇ ਵੀ ਵੀਡੀਓ ਨੂੰ ਲੋਡ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/957.txt",
    "content": "• ਖਾਸ NQE ਕਿਰਿਆਵਾਂ ਨੂੰ ਇੱਕ ਵਿੱਚ ਏਕੀਕ੍ਰਿਤ ਕਰਨਾ।\n• ਦੋ-ਉਂਗਲਾਂ ਵਾਲੇ ਇਸ਼ਾਰੇ ਨਾਲ ਵੀਡੀਓ ਪਲੇਅਰ ਨੂੰ ਬੰਦ ਕਰਨਾ।\n• reCOPTCHA ਕੂਕੀਜ਼ ਨੂੰ ਹਟਾਉਣ ਦੀ ਆਗਿਆ ਦੇਣਾ।\n• ਸੂਚਨਾਵਾਂ ਨੂੰ ਰੰਗੀਨ ਨਾ ਕਰਨ ਦਾ ਵਿਕਲਪ।\n• NewPipe 'ਤੇ ਸਾਂਝਾ ਕਰਦੇ ਸਮੇਂ ਅਨੰਤ ਬਫਰਿੰਗ, ਗਲਤੀਆਂ ਅਤੇ ਹੋਰ ਅਸੰਗਤੀਆਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ।\n• YouTube ਵੀਡੀਓ ਨੂੰ ਤੇਜ਼ ਕੀਤਾ ਗਿਆ ਅਤੇ ਉਮਰ-ਪ੍ਰਤੀਬੰਧਿਤ ਵੀਡੀਓ ਨੂੰ ਬਿਹਤਰ ਬਣਾਇਆ ਗਿਆ।\n• ਫਾਸਟ ਫਾਰਵਰਡ/ਰਿਵਾਈਂਡ 'ਤੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/958.txt",
    "content": "ਨਵਾਂ ਅਤੇ ਸੁਧਾਰਿਆ ਗਿਆ: • ਲੌਕ ਸਕ੍ਰੀਨ 'ਤੇ ਥੰਬਨੇਲ ਨੂੰ ਲੁਕਾਉਣ ਲਈ ਮੁੜ-ਜੋੜਿਆ ਗਿਆ ਵਿਕਲਪ • ਫੀਡ ਨੂੰ ਤਾਜ਼ਾ ਕਰਨ ਲਈ ਖਿੱਚੋ • ਸਥਾਨਕ ਸੂਚੀਆਂ ਪ੍ਰਾਪਤ ਕਰਨ ਵੇਲੇ ਬਿਹਤਰ ਕਾਰਗੁਜ਼ਾਰੀ ਸਥਿਰ: • ਰੈਮ ਤੋਂ ਹਟਾਏ ਜਾਣ ਤੋਂ ਬਾਅਦ ਨਿਊਪਾਈਪ ਨੂੰ ਚਾਲੂ ਕਰਨ ਵੇਲੇ ਸਥਿਰ ਕਰੈਸ਼ • ਕੋਈ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਨਾ ਹੋਣ 'ਤੇ ਸਟਾਰਟਅਪ 'ਤੇ ਸਥਿਰ ਕਰੈਸ਼ • ਚਮਕ- ਅਤੇ ਵੌਲਯੂਮ-ਇਸ਼ਾਰਾ ਸੈਟਿੰਗਾਂ ਦਾ ਆਦਰ ਕਰਦੇ ਹੋਏ ਸਥਿਰ • [YouTube] ਸਥਿਰ ਲੰਬੀਆਂ ਪਲੇਲਿਸਟਾਂ ਹੋਰ: • ਕੋਡ ਕਲੀਨਅੱਪ ਅਤੇ ਕਈ ਅੰਦਰੂਨੀ ਸੁਧਾਰ • ਨਿਰਭਰਤਾ ਅੱਪਡੇਟ • ਅਨੁਵਾਦ ਅੱਪਡੇਟ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/959.txt",
    "content": "ਗਲਤੀ ਰਿਪੋਰਟਰ ਨੂੰ ਖੋਲ੍ਹਣ ਤੋਂ ਬਾਅਦ ਕਰੈਸ਼ਾਂ ਦਾ ਬੇਅੰਤ ਲੂਪ ਸਥਿਰ ਕੀਤਾ ਗਿਆ। \nPeerTube ਉਦਾਹਰਨਾਂ ਦੀ ਅੱਪਡੇਟ ਕੀਤੀ ਸੂਚੀ ਜੋ \nNewPipe ਦੁਆਰਾ ਆਪਣੇ ਆਪ ਖੋਲ੍ਹੀ ਜਾ ਸਕਦੀ ਹੈ। ਅੱਪਡੇਟ ਕੀਤੇ ਅਨੁਵਾਦ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/960.txt",
    "content": "• ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਨਿਰਯਾਤ ਡੇਟਾਬੇਸ ਵਿਕਲਪ ਦਾ ਸੁਧਾਰਿਆ ਗਿਆ ਵਰਣਨ। \n• ਸਥਿਰ YouTube ਟਿੱਪਣੀਆਂ ਪਾਰਸਿੰਗ। \n• media.ccc.de ਸੇਵਾ ਦਾ ਸਥਿਰ ਡਿਸਪਲੇ ਨਾਮ। \n• ਅੱਪਡੇਟ ਕੀਤੇ ਅਨੁਵਾਦ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/961.txt",
    "content": "• [YouTube] ਮਿਕਸ ਸਮਰਥਨ • [YouTube] ਜਨਤਕ ਪ੍ਰਸਾਰਕਾਂ ਅਤੇ ਕੋਵਿਡ-19 ਬਾਰੇ ਜਾਣਕਾਰੀ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰੋ • [media.ccc.de] ਜੋੜੇ ਗਏ ਹਾਲੀਆ ਵੀਡੀਓ • ਸੋਮਾਲੀ ਅਨੁਵਾਦ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਬਹੁਤ ਸਾਰੇ ਅੰਦਰੂਨੀ ਸੁਧਾਰ • ਪਲੇਅਰ ਦੇ ਅੰਦਰੋਂ ਸਥਿਰ ਸ਼ੇਅਰਿੰਗ ਵੀਡੀਓ • ਸਥਿਰ ਖਾਲੀ ReCaptcha ਵੈਬਵਿਊ • ਇੱਕ ਸੂਚੀ ਵਿੱਚੋਂ ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਹਟਾਉਣ ਵੇਲੇ ਆਈ ਕ੍ਰੈਸ਼ ਦਾ ਹੱਲ • [PeerTube] ਸਥਿਰ ਸੰਬੰਧਿਤ ਸਟ੍ਰੀਮਾਂ • [YouTube] ਸਥਿਰ YouTube ਸੰਗੀਤ ਖੋਜ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/962.txt",
    "content": "media.ccc.de ਸੇਵਾ ਵਿੱਚ \"ਹਾਲੀਆ\" ਵਿਡੀਓਜ਼ ਸ਼ਾਮਲ ਕੀਤੇ ਗਏ। \nmedia.ccc.de ਸੇਵਾ ਵਿੱਚ ਲਾਈਵ ਸਟ੍ਰੀਮਾਂ ਸ਼ਾਮਲ ਕੀਤੀਆਂ ਗਈਆਂ ਅਤੇ ਲਾਈਵ ਸਟ੍ਰੀਮ ਸਮਰਥਨ ਵੀ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/963.txt",
    "content": "• [YouTube] ਸਥਿਰ ਚੈਨਲ ਨਿਰੰਤਰਤਾ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/964.txt",
    "content": "• ਪਲੇਅਰ ਕੰਟਰੋਲਾਂ ਵਿੱਚ ਚੈਪਟਰਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ\n• [PeerTube] ਸੇਪੀਆ ਖੋਜ ਜੋੜਿਆ ਗਿਆ\n• ਵੀਡੀਓ ਵੇਰਵੇ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਸ਼ੇਅਰ ਬਟਨ ਨੂੰ ਦੁਬਾਰਾ ਜੋੜਿਆ ਗਿਆ ਅਤੇ ਸਟ੍ਰੀਮ ਵਰਣਨ ਨੂੰ ਟੈਬ ਲੇਆਉਟ ਵਿੱਚ ਤਬਦੀਲ ਕੀਤਾ ਗਿਆ\n• ਜੇਕਰ ਚਮਕ ਸੰਕੇਤ ਅਯੋਗ ਹੈ ਤਾਂ ਚਮਕ ਨੂੰ ਬਹਾਲ ਕਰਨਾ ਅਯੋਗ ਕਰੋ\n• ਕੋਡੀ 'ਤੇ ਵੀਡੀਓ ਚਲਾਉਣ ਲਈ ਸੂਚੀ ਆਈਟਮ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ\n• ਕੁਝ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਡਿਫੌਲਟ ਬ੍ਰਾਊਜ਼ਰ ਸੈੱਟ ਨਾ ਹੋਣ 'ਤੇ ਕਰੈਸ਼ ਨੂੰ ਠੀਕ ਕੀਤਾ ਗਿਆ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/965.txt",
    "content": "ਸਥਿਰ ਕਰੈਸ਼ ਜੋ ਚੈਨਲ ਸਮੂਹਾਂ ਨੂੰ ਮੁੜ ਕ੍ਰਮਬੱਧ ਕਰਨ ਵੇਲੇ ਵਾਪਰਿਆ ਸੀ। ਚੈਨਲਾਂ ਅਤੇ ਪਲੇਲਿਸਟਾਂ ਤੋਂ ਹੋਰ YouTube ਵੀਡੀਓ ਪ੍ਰਾਪਤ ਕਰਨਾ ਸਥਿਰ ਕੀਤਾ ਗਿਆ ਹੈ। YouTube ਟਿੱਪਣੀਆਂ ਪ੍ਰਾਪਤ ਕਰਨਾ ਸਥਿਰ ਹੈ। YouTube URL ਵਿੱਚ /watch/, /v/ ਅਤੇ /w/ ਸਬਪਾਥ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ। SoundCloud ਕਲਾਇੰਟ ਆਈਡੀ ਅਤੇ ਭੂ-ਪ੍ਰਤੀਬੰਧਿਤ ਸਮਗਰੀ ਦਾ ਸਥਿਰ ਐਕਸਟਰੈਕਸ਼ਨ। ਉੱਤਰੀ ਕੁਰਦਿਸ਼ ਸਥਾਨਕਕਰਨ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/966.txt",
    "content": "ਨਵਾਂ: • ਇੱਕ ਨਵੀਂ ਸੇਵਾ ਸ਼ਾਮਲ ਕਰੋ: Bandcamp ਸੁਧਾਰ: • ਐਪ ਨੂੰ ਡਿਵਾਈਸ ਥੀਮ ਦਾ ਅਨੁਸਰਣ ਕਰਨ ਲਈ ਇੱਕ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕਰੋ • ਇੱਕ ਸੁਧਾਰਿਆ ਹੋਇਆ ਗਲਤੀ ਪੈਨਲ ਦਿਖਾ ਕੇ ਕੁਝ ਕਰੈਸ਼ਾਂ ਨੂੰ ਰੋਕੋ • ਇਸ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ ਦਿਖਾਓ ਕਿ ਸਮੱਗਰੀ ਕਿਉਂ ਉਪਲਬਧ ਨਹੀਂ ਹੈ • ਹਾਰਡਵੇਅਰ ਸਪੇਸ ਬਟਨ ਪਲੇ/ਪੌਜ਼ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ • \"ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ\" ਟੋਸਟ ਦਿਖਾਓ ਸਥਿਰ: • ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਦੇ ਸਮੇਂ ਵੀਡੀਓ ਵੇਰਵਿਆਂ ਵਿੱਚ ਬਹੁਤ ਛੋਟੇ ਥੰਬਨੇਲ ਨੂੰ ਠੀਕ ਕਰੋ • ਨਿਊਨਤਮ ਪਲੇਅਰ ਵਿੱਚ ਖਾਲੀ ਸਿਰਲੇਖ ਨੂੰ ਠੀਕ ਕਰੋ • ਪਿਛਲੇ ਰੀਸਾਈਜ਼ ਮੋਡ ਨੂੰ ਠੀਕ ਤਰ੍ਹਾਂ ਰੀਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/967.txt",
    "content": "ਸਥਿਰ YouTube EU ਵਿੱਚ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ। ਇਹ ਇੱਕ ਨਵੀਂ ਕੂਕੀ ਅਤੇ ਗੋਪਨੀਯਤਾ ਸਹਿਮਤੀ ਪ੍ਰਣਾਲੀ ਦੇ ਕਾਰਨ ਹੋਇਆ ਸੀ ਜਿਸ ਲਈ ਇੱਕ CONSENT ਕੂਕੀ ਸੈੱਟ ਕਰਨ ਲਈ NewPipe ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/968.txt",
    "content": "ਲੰਬੇ ਸਮੇਂ ਲਈ ਦਬਾਓ ਮੀਨੂ ਵਿੱਚ ਚੈਨਲ ਵੇਰਵੇ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ। ਪਲੇਲਿਸਟ ਇੰਟਰਫੇਸ ਤੋਂ ਪਲੇਲਿਸਟ ਨਾਮ ਦਾ ਨਾਮ ਬਦਲਣ ਲਈ ਕਾਰਜਸ਼ੀਲਤਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ। ਵੀਡੀਓ ਬਫਰਿੰਗ ਹੋਣ 'ਤੇ ਵਰਤੋਂਕਾਰ ਨੂੰ ਰੁਕਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ। ਚਿੱਟੇ ਥੀਮ ਨੂੰ ਪਾਲਿਸ਼ ਕੀਤਾ। ਇੱਕ ਵੱਡੇ ਫੌਂਟ ਆਕਾਰ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਓਵਰਲੈਪਿੰਗ ਫੌਂਟਾਂ ਨੂੰ ਸਥਿਰ ਕੀਤਾ ਗਿਆ ਹੈ। ਫਾਰਮੂਲਰ ਅਤੇ ਜ਼ੇਫੀਅਰ ਡਿਵਾਈਸਾਂ 'ਤੇ ਕੋਈ ਵੀਡੀਓ ਫਿਕਸ ਨਹੀਂ ਕੀਤਾ ਗਿਆ। ਵੱਖ-ਵੱਖ ਕਰੈਸ਼ਾਂ ਨੂੰ ਸਥਿਰ ਕੀਤਾ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/969.txt",
    "content": "• ਬਾਹਰੀ ਸਟੋਰੇਜ 'ਤੇ ਇੰਸਟਾਲੇਸ਼ਨ ਦੀ ਆਗਿਆ ਦਿਓ • [ਬੈਂਡਕੈਂਪ] ਇੱਕ ਸਟ੍ਰੀਮ 'ਤੇ ਪਹਿਲੀਆਂ ਤਿੰਨ ਟਿੱਪਣੀਆਂ ਨੂੰ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰਨ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ • ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਹੋਣ 'ਤੇ ਸਿਰਫ਼ 'ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਹੋ ਗਿਆ ਹੈ' ਟੋਸਟ ਦਿਖਾਓ • ਜਦੋਂ ਕੋਈ ਕੂਕੀ ਸਟੋਰ ਨਾ ਹੋਵੇ ਤਾਂ ਰੀਕੈਪਚਾ ਕੂਕੀ ਸੈਟ ਨਾ ਕਰੋ • [ਖਿਡਾਰੀ] ਕੈਸ਼ ਪ੍ਰਦਰਸ਼ਨ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ • [ਖਿਡਾਰੀ] ਫਿਕਸਡ ਪਲੇਅਰ ਆਟੋਮੈਟਿਕ ਨਹੀਂ ਚੱਲ ਰਿਹਾ • ਡਾਊਨਲੋਡਾਂ ਨੂੰ ਮਿਟਾਉਣ ਵੇਲੇ ਪਿਛਲੀਆਂ ਸਨੈਕਬਾਰਾਂ ਨੂੰ ਖਾਰਜ ਕਰੋ • ਸੂਚੀ ਵਿੱਚ ਨਾ ਹੋਣ ਵਾਲੀ ਵਸਤੂ ਨੂੰ ਮਿਟਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਗਈ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/970.txt",
    "content": "ਨਵਾਂ • ਵਰਣਨ ਦੇ ਹੇਠਾਂ ਸਮੱਗਰੀ ਮੈਟਾਡੇਟਾ (ਟੈਗ, ਸ਼੍ਰੇਣੀਆਂ, ਲਾਇਸੰਸ, ...) ਦਿਖਾਓ • ਰਿਮੋਟ (ਗੈਰ-ਸਥਾਨਕ) ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ \"ਚੈਨਲ ਵੇਰਵੇ ਦਿਖਾਓ\" ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ \"ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ\" ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਸਥਿਰ • ਵੀਡੀਓ ਵੇਰਵੇ ਪੰਨੇ 'ਤੇ ਸਥਿਰ ਰੋਟੇਸ਼ਨ ਕਰੈਸ਼ • ਪਲੇਅਰ ਵਿੱਚ ਸਥਿਰ \"ਕੋਡੀ ਨਾਲ ਖੇਡੋ\" ਬਟਨ ਹਮੇਸ਼ਾ ਕੋਰ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਲਈ ਪ੍ਰੇਰਦਾ ਹੈ • ਸਥਿਰ ਅਤੇ ਸੁਧਾਰੀ ਸੈਟਿੰਗ ਆਯਾਤ ਅਤੇ ਨਿਰਯਾਤ ਮਾਰਗ • [YouTube] ਸਥਿਰ ਟਿੱਪਣੀ ਪਸੰਦ ਗਿਣਤੀ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/971.txt",
    "content": "ਹੌਟਫਿਕਸ \n• ਰੀਬਫਰ ਤੋਂ ਬਾਅਦ ਪਲੇਬੈਕ ਲਈ ਬਫਰ ਵਧਾਓ \n• ਪਲੇਅਰ ਵਿੱਚ ਪਲੇ-ਕਿਊ ਆਈਕਨ 'ਤੇ ਕਲਿੱਕ ਕਰਨ ਵੇਲੇ ਟੈਬਲੈੱਟਾਂ ਅਤੇ ਟੀਵੀ 'ਤੇ ਸਥਿਰ ਕਰੈਸ਼\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/972.txt",
    "content": "ਨਵਾਂ \nਵਰਣਨ ਵਿੱਚ ਟਾਈਮਸਟੈਂਪਾਂ ਅਤੇ ਹੈਸ਼ਟੈਗਾਂ ਨੂੰ ਪਛਾਣੋ \nਮੈਨੂਅਲ ਟੈਬਲੇਟ ਮੋਡ ਸੈਟਿੰਗ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ \nਇੱਕ ਫੀਡ ਵਿੱਚ ਖੇਡੀਆਂ ਗਈਆਂ ਆਈਟਮਾਂ ਨੂੰ ਲੁਕਾਉਣ ਦੀ ਸਮਰੱਥਾ ਸ਼ਾਮਲ ਕੀਤੀ ਗਈ \n\nਸੁਧਾਰ \nਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਦਾ ਸਹੀ ਢੰਗ ਨਾਲ ਸਮਰਥਨ ਕਰੋ \nਅਣਉਪਲਬਧ ਅਤੇ ਬੰਦ ਕੀਤੇ ਚੈਨਲਾਂ ਦੀ ਬਿਹਤਰ ਗਲਤੀ ਹੈਂਡਲਿੰਗ \nAndroid 10+ ਉਪਭੋਗਤਾਵਾਂ ਲਈ Android ਸ਼ੇਅਰ ਸ਼ੀਟ ਹੁਣ ਸਮੱਗਰੀ ਦਾ ਸਿਰਲੇਖ ਦਿਖਾਉਂਦੀ ਹੈ। \nਅੱਪਡੇਟ ਕੀਤਾ Invidious ਮੌਕੇ ਅਤੇ ਸਹਿਯੋਗ ਪਾਈਪ ਲਿੰਕ. \n\nਠੀਕ ਕੀਤਾ \n[YouTube] ਉਮਰ ਪ੍ਰਤਿਬੰਧਿਤ ਸਮੱਗਰੀ ਚੋਣ ਡਾਇਲਾਗ ਖੋਲ੍ਹਣ ਵੇਲੇ ਲੀਕ ਵਿੰਡੋ ਅਪਵਾਦ ਨੂੰ ਰੋਕੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/973.txt",
    "content": "ਹੌਟਫਿਕਸ \n• ਇੱਕ ਕਤਾਰ ਵਿੱਚ ਕਿੰਨੇ ਵਿਡੀਓ ਫਿੱਟ ਹੋ ਸਕਦੇ ਹਨ ਦੀ ਗਲਤ ਗਣਨਾ ਕਰਕੇ, ਗਰਿੱਡ ਲੇਆਉਟ ਵਿੱਚ ਕੱਟੇ ਜਾ ਰਹੇ ਥੰਬਨੇਲ ਅਤੇ ਸਿਰਲੇਖਾਂ ਨੂੰ ਠੀਕ ਕਰੋ \n• ਸ਼ੇਅਰ ਮੀਨੂ ਤੋਂ ਖੋਲ੍ਹੇ ਜਾਣ 'ਤੇ ਬਿਨਾਂ ਕੁਝ ਕੀਤੇ ਗਾਇਬ ਹੋ ਰਹੇ ਡਾਉਨਲੋਡ ਡਾਇਲੌਗ ਨੂੰ ਠੀਕ ਕਰੋ \n• ਬਾਹਰੀ ਗਤੀਵਿਧੀਆਂ ਜਿਵੇਂ ਕਿ ਸਟੋਰੇਜ਼ ਐਕਸੈਸ ਫਰੇਮਵਰਕ ਫਾਈਲ ਪਿਕਰ ਖੋਲ੍ਹਣ ਨਾਲ ਸਬੰਧਤ ਇੱਕ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/974.txt",
    "content": "ਹੌਟਫਿਕਸ \n• YouTube ਥ੍ਰੋਟਲਿੰਗ ਦੇ ਕਾਰਨ ਬਫਰਿੰਗ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਠੀਕ ਕਰੋ \n• ਬੰਦ ਕੀਤੀਆਂ ਟਿੱਪਣੀਆਂ ਨਾਲ ਕ੍ਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ YouTube ਟਿੱਪਣੀਆਂ ਕੱਢਣ \n• YouTube ਸੰਗੀਤ ਖੋਜ ਨੂੰ ਠੀਕ ਕਰੋ \n• PeerTube ਲਾਈਵਸਟ੍ਰੀਮਾਂ ਨੂੰ ਠੀਕ ਕਰੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/975.txt",
    "content": "ਨਵਾਂ \n• ਸੀਕ ਕਰਨ ਵੇਲੇ ਇੱਕ ਥੰਮਨੇਲ ਪੂਰਵਦਰਸ਼ਨ ਦਿਖਾਓ \n• ਅਯੋਗ ਟਿੱਪਣੀਆਂ ਦਾ ਪਤਾ ਲਗਾਓ \n• ਫੀਡ ਆਈਟਮ ਨੂੰ ਦੇਖੇ ਗਏ ਵਜੋਂ ਨਿਸ਼ਾਨਬੱਧ ਕਰਨ ਦਿਓ \n• ਟਿੱਪਣੀ ਦਿਲ ਦਿਖਾਓ \nਸੁਧਾਰ \n• ਮੈਟਾਡੇਟਾ ਅਤੇ ਟੈਗਸ ਲੇਆਉਟ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ \n• UI ਭਾਗਾਂ 'ਤੇ ਸੇਵਾ ਰੰਗ ਲਾਗੂ ਕਰੋ \nਠੀਕ ਕੀਤਾ \n• ਮਿੰਨੀ ਪਲੇਅਰ ਵਿੱਚ ਥੰਬਨੇਲ ਠੀਕ ਕਰੋ \n• ਡੁਪਲੀਕੇਟ ਕਤਾਰ ਆਈਟਮਾਂ 'ਤੇ ਬੇਅੰਤ ਬਫਰਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ \n• ਕੁਝ ਪਲੇਅਰ ਫਿਕਸ\n• ਕੁਝ ਡਾਊਨਲੋਡਰ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/976.txt",
    "content": "• ਪੂਰੀ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਨੂੰ ਸਿੱਧਾ ਖੋਲ੍ਹਣ ਲਈ ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ • ਇਹ ਚੁਣਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ ਕਿ ਕਿਸ ਕਿਸਮ ਦੇ ਖੋਜ ਸੁਝਾਅ ਦਿਖਾਉਣੇ ਹਨ • ਗੂੜ੍ਹਾ ਥੀਮ ਹੁਣ ਗੂੜ੍ਹਾ + ਗੂੜ੍ਹਾ ਸਪਲੈਸ਼ ਸਕ੍ਰੀਨ ਜੋੜਿਆ ਗਿਆ ਹੈ • ਅਣਚਾਹੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਸਲੇਟੀ ਕਰਨ ਲਈ ਬਿਹਤਰ ਫ਼ਾਈਲ ਚੋਣਕਾਰ • ਸਥਿਰ YouTube ਗਾਹਕੀ ਆਯਾਤ • ਇੱਕ ਸਟ੍ਰੀਮ ਨੂੰ ਮੁੜ ਚਲਾਉਣ ਲਈ ਮੁੜ-ਪਲੇਅ ਬਟਨ 'ਤੇ ਟੈਪ ਕਰਨ ਦੀ ਲੋੜ ਹੈ • ਸਥਿਰ ਸਮਾਪਤੀ ਆਡੀਓ ਸੈਸ਼ਨ • [Android TV] DPad ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ ਸਥਿਰ ਲੰਬੀ ਸੀਕਬਾਰ ਜੰਪ ਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/977.txt",
    "content": "• ਲੰਬੇ ਪ੍ਰੈਸ ਮੀਨੂ ਵਿੱਚ \"ਅਗਲਾ ਚਲਾਓ\" ਬਟਨ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ \n• ਇੰਟੈਂਟ ਫਿਲਟਰ ਵਿੱਚ YouTube ਸ਼ਾਰਟਸ ਪਾਥ ਪ੍ਰੀਫਿਕਸ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ \n• ਸਥਿਰ ਸੈਟਿੰਗਾਂ ਆਯਾਤ \n• ਕਤਾਰ ਸਕ੍ਰੀਨ ਵਿੱਚ ਪਲੇਅਰ ਬਟਨਾਂ ਨਾਲ ਸੀਕਬਾਰ ਸਥਿਤੀ ਨੂੰ ਸਵੈਪ ਕਰੋ \n• MediasessionManager ਨਾਲ ਸੰਬੰਧਿਤ ਕਈ ਫਿਕਸ \n• ਵੀਡੀਓ ਖਤਮ ਹੋਣ ਤੋਂ ਬਾਅਦ ਸਥਿਰ ਸੀਕਬਾਰ ਪੂਰਾ ਨਹੀਂ ਹੋਇਆ \n• RealtekATV 'ਤੇ ਅਯੋਗ ਮੀਡੀਆ ਟਨਲਿੰਗ \n• ਵਿਸਤ੍ਰਿਤ ਨਿਊਨਤਮ ਪਲੇਅਰ ਬਟਨ ਕਲਿੱਕ ਕਰਨ ਯੋਗ ਖੇਤਰ \n\nਹੋਰ ਤਬਦੀਲੀਆਂ ਦੇਖਣ ਲਈ, ਹੇਠਾਂ ਦਿੱਤੇ ਲਿੰਕ ਟੈਬ ਤੋਂ ਚੇਂਜਲੌਗ (ਅਤੇ ਬਲੌਗ ਪੋਸਟ) ਦੇਖੋ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/978.txt",
    "content": "ਇੱਕ ਨਵੇਂ ਨਿਊਪਾਈਪ ਸੰਸਕਰਣ ਲਈ ਜਾਂਚ ਨੂੰ ਲਾਗੂ ਕਰਨਾ ਸਥਿਰ ਹੈ। ਇਹ ਜਾਂਚ ਕਈ ਵਾਰ ਬਹੁਤ ਜਲਦੀ ਕੀਤੀ ਗਈ ਸੀ ਅਤੇ ਇਸਲਈ ਐਪ ਕਰੈਸ਼ ਹੋ ਜਾਂਦੀ ਹੈ। ਇਸ ਨੂੰ ਹੁਣ ਠੀਕ ਕੀਤਾ ਜਾਣਾ ਗਿਆ ਹੈ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/979.txt",
    "content": "- ਠੀਕ ਕੀਤਾ ਪਲੇਬੈਕ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰਨਾ \n- ਇਹ ਯਕੀਨੀ ਬਣਾਉਣ ਲਈ ਸੁਧਾਰ ਕੀਤੇ ਗਏ ਹਨ ਕਿ ਸੇਵਾ ਜੋ ਇਹ ਨਿਰਧਾਰਤ ਕਰਦੀ ਹੈ ਕਿ ਕੀ NewPipe ਨੂੰ ਨਵੇਂ ਸੰਸਕਰਣ ਦੀ ਜਾਂਚ ਲਈ ਜਾਂਚ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ, ਬੈਕਗ੍ਰਾਉਂਡ ਵਿੱਚ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋਈ ਹੈ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/980.txt",
    "content": "ਨਵਾਂ \n• ਸ਼ੇਅਰ ਮੀਨੂ ਲਈ \"ਪਲੇਲਿਸਟ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ\" ਵਿਕਲਪ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ \n• y2u.be ਅਤੇ PeerTube ਛੋਟੇ ਲਿੰਕਾਂ ਲਈ ਸਮਰਥਨ ਜੋੜਿਆ ਗਿਆ \n \nਸੁਧਾਰ \n• ਪਲੇਬੈਕ-ਸਪੀਡ-ਕੰਟਰੋਲਾਂ ਨੂੰ ਵਧੇਰੇ ਸੰਖੇਪ ਬਣਾਇਆ ਗਿਆ ਹੈ \n• ਫੀਡ ਹੁਣ ਨਵੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਉਜਾਗਰ ਕਰਦੀ ਹੈ \n• ਫੀਡ ਵਿੱਚ \"ਦੇਖੀਆਂ ਆਈਟਮਾਂ ਦਿਖਾਓ\" ਵਿਕਲਪ ਹੁਣ ਸੁਰੱਖਿਅਤ ਹੈ \n \nਠੀਕ ਕੀਤਾ \n• ਸਥਿਰ YouTube ਪਸੰਦਾਂ ਅਤੇ ਨਾਪਸੰਦਾਂ ਨੂੰ ਕੱਢਣਾ \n• ਬੈਕਗ੍ਰਾਊਂਡ ਤੋਂ ਵਾਪਸ ਆਉਣ ਤੋਂ ਬਾਅਦ ਸਥਿਰ ਆਟੋਮੈਟਿਕ ਰੀਪਲੇਅ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/981.txt",
    "content": "ਐਂਡਰਾਇਡ 11+ 'ਤੇ ਬਫਰਿੰਗ ਤੋਂ ਬਾਅਦ ਅਸਫਲ ਪਲੇਬੈਕ ਰੀਜ਼ਿਊਮ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਮੀਡੀਆ ਪਾਰਸਰ ਸਮਰਥਨ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ। \nਪਲੇਬੈਕ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਫਿਲਿਪਸ QM16XE 'ਤੇ ਮੀਡੀਆ ਟਨਲਿੰਗ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/982.txt",
    "content": "ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/983.txt",
    "content": "ਨਵਾਂ ਡਬਲ-ਟੈਪ-ਟੂ-ਸੀਕ UI ਅਤੇ ਵਿਵਹਾਰ ਸ਼ਾਮਲ ਕਰੋ \nਸੈਟਿੰਗਾਂ ਨੂੰ ਖੋਜਣਯੋਗ ਬਣਾਓ \nਪਿੰਨ ਕੀਤੀਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਇਸ ਤਰ੍ਹਾਂ ਹਾਈਲਾਈਟ ਕਰੋ \nFSFE ਦੇ PeerTube ਉਦਾਹਰਨ ਲਈ ਓਪਨ-ਵਿਦ-ਐਪ ਸਮਰਥਨ ਸ਼ਾਮਲ ਕਰੋ \nਗਲਤੀ ਸੂਚਨਾਵਾਂ ਸ਼ਾਮਲ ਕਰੋ \nਪਲੇਅਰ ਬਦਲਣ 'ਤੇ ਪਹਿਲੀ ਕਤਾਰ ਆਈਟਮ ਦੇ ਰੀਪਲੇਅ ਨੂੰ ਠੀਕ ਕਰੋ \nਫੇਲ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ ਲਾਈਵਸਟ੍ਰੀਮ ਦੇ ਦੌਰਾਨ ਬਫਰਿੰਗ ਕਰਦੇ ਸਮੇਂ ਜ਼ਿਆਦਾ ਉਡੀਕ ਕਰੋ \nਸਥਾਨਕ ਖੋਜ ਨਤੀਜਿਆਂ ਦਾ ਕ੍ਰਮ ਠੀਕ ਕਰੋ \nਪਲੇ ਕਤਾਰ ਵਿੱਚ ਖਾਲੀ ਆਈਟਮ ਖੇਤਰਾਂ ਨੂੰ ਠੀਕ ਕਰੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/984.txt",
    "content": "ਪੂਰੀ ਸਕ੍ਰੀਨ ਨੂੰ ਭਰਨ ਅਤੇ ਟੈਬਲੇਟਾਂ ਅਤੇ ਟੀਵੀ 'ਤੇ ਸਕ੍ਰੋਲਿੰਗ ਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਸੂਚੀਆਂ ਵਿੱਚ ਲੋੜੀਂਦੀਆਂ ਸ਼ੁਰੂਆਤੀ ਆਈਟਮਾਂ ਲੋਡ ਕਰੋ \nਸੂਚੀਆਂ ਰਾਹੀਂ ਸਕ੍ਰੋਲ ਕਰਦੇ ਸਮੇਂ ਬੇਤਰਤੀਬੇ ਕਰੈਸ਼ਾਂ ਨੂੰ ਠੀਕ ਕਰੋ \nਪਲੇਅਰ ਨੂੰ ਸਿਸਟਮ UI ਦੇ ਅਧੀਨ ਤੇਜ਼ੀ ਨਾਲ ਸੀਕ ਓਵਰਲੇ ਆਰਕ ਜਾਣ ਦਿਓ \nਮਲਟੀ ਵਿੰਡੋ ਵਿੱਚ ਖੇਡਦੇ ਸਮੇਂ ਕਟਆਊਟਾਂ ਵਿੱਚ ਬਦਲਾਵ ਵਾਪਸ ਲਿਆਓ, ਜਿਸ ਨਾਲ ਕੁਝ ਫ਼ੋਨਾਂ 'ਤੇ ਪਲੇਅਰ ਰੀਗਰੈਸ਼ਨ ਦਾ ਕਾਰਨ ਬਣਦੇ ਹਨ। \ncompileSdk ਨੂੰ 30 ਤੋਂ 31 ਤੱਕ ਵਧਾਓ \nਅਸ਼ੁੱਧੀ ਰਿਪੋਰਟਿੰਗ ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ \nਪਲੇਅਰ ਵਿੱਚ ਕੁਝ ਕੋਡ ਰੀਫੈਕਟਰ ਕਰੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/985.txt",
    "content": "ਸਥਿਰ YouTube ਕੋਈ ਸਟ੍ਰੀਮ ਨਹੀਂ ਚਲਾ ਰਿਹਾ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/986.txt",
    "content": "ਨਵਾਂ\n• ਨਵੀਆਂ ਸਟ੍ਰੀਮਾਂ ਲਈ ਸੂਚਨਾਵਾਂ \n• ਬੈਕਗ੍ਰਾਊਂਡ ਅਤੇ ਵੀਡੀਓ ਪਲੇਅਰਾਂ ਵਿਚਕਾਰ ਅਰਾਮ ਨਾਲ ਤਬਦੀਲੀ \n• ਸੈਮੀਟੋਨਸ ਦੁਆਰਾ ਪਿੱਚ ਬਦਲੋ \n• ਇੱਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਮੁੱਖ ਪਲੇਅਰ ਕਤਾਰ ਜੋੜੋ \n\nਸੁਧਾਰ\n• ਸਪੀਡ/ਪਿਚ ਸਟੈਪ ਦਾ ਆਕਾਰ ਯਾਦ ਰੱਖੋ \n• ਵੀਡੀਓ ਪਲੇਅਰ ਵਿੱਚ ਸ਼ੁਰੂਆਤੀ ਲੰਬੇ ਬਫਰਿੰਗ ਨੂੰ ਘੱਟ ਕਰੋ\n• Android TV ਲਈ ਪਲੇਅਰ UI ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ\n• ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਿਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁਸ਼ਟੀ ਕਰੋ\n\nਫਿਕਸਡ\n• ਮੀਡੀਆ ਬਟਨ ਨੂੰ ਫਿਕਸ ਕਰੋ ਜੋ ਪਲੇਅਰ ਨਿਯੰਤਰਣਾਂ ਨੂੰ ਨਹੀਂ ਲੁਕਾਉਂਦਾ ਹੈ \n• ਪਲੇਅਰ ਦੀ ਕਿਸਮ ਬਦਲਣ 'ਤੇ ਪਲੇਬੈਕ ਰੀਸੈਟ ਨੂੰ ਠੀਕ ਕਰੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/987.txt",
    "content": "ਨਵਾਂ \n• ਪ੍ਰਗਤੀਸ਼ੀਲ HTTP ਤੋਂ ਇਲਾਵਾ ਸਪੋਰਟ ਡਿਲੀਵਰੀ ਵਿਧੀਆਂ: ਤੇਜ਼ ਪਲੇਬੈਕ ਲੋਡ ਹੋਣ ਦਾ ਸਮਾਂ, PeerTube ਅਤੇ SoundCloud ਲਈ ਫਿਕਸ, ਹਾਲ ਹੀ ਵਿੱਚ ਖਤਮ ਹੋਈਆਂ YouTube ਲਾਈਵਸਟ੍ਰੀਮਾਂ ਦਾ ਪਲੇਬੈਕ \n• ਇੱਕ ਸਥਾਨਕ ਪਲੇਲਿਸਟ ਵਿੱਚ ਰਿਮੋਟ ਪਲੇਲਿਸਟ ਜੋੜਨ ਲਈ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ \n• Android 10+ ਸ਼ੇਅਰ ਸ਼ੀਟ ਵਿੱਚ ਚਿੱਤਰ ਦੀ ਪੂਰਵ-ਝਲਕ \n\n ਸੁਧਾਰ \n• ਪਲੇਬੈਕ ਪੈਰਾਮੀਟਰ ਡਾਇਲਾਗ ਵਿੱਚ ਸੁਧਾਰ ਕਰੋ \n• ਗਾਹਕੀ ਆਯਾਤ/ਨਿਰਯਾਤ ਬਟਨਾਂ ਨੂੰ ਤਿੰਨ-ਬਿੰਦੀਆਂ ਵਾਲੇ ਮੀਨੂ ਵਿੱਚ ਲੈ ਜਾਓ \nਠੀਕ ਕੀਤਾ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/988.txt",
    "content": "[YouTube] ਕਿਸੇ ਵੀ ਵੀਡੀਓ ਨੂੰ ਚਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ \"ਕੋਈ ਸਟ੍ਰੀਮ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕਰ ਸਕਿਆ\" ਗਲਤੀ ਨੂੰ ਠੀਕ ਕਰੋ \n[YouTube] ਫਿਕਸ \"ਹੇਠ ਦਿੱਤੀ ਸਮੱਗਰੀ ਇਸ ਐਪ 'ਤੇ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।\" ਬੇਨਤੀ ਕੀਤੀ ਵੀਡੀਓ ਦੀ ਬਜਾਏ ਸੁਨੇਹਾ ਵਿਖਾਇਆ ਗਿਆ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/989.txt",
    "content": "• [YouTube] ਕਿਸੇ ਵੀ ਵੀਡੀਓ ਨੂੰ ਚਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ ਅਨੰਤ ਲੋਡਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ \n• [YouTube] ਕੁਝ ਵੀਡੀਓਜ਼ 'ਤੇ ਥ੍ਰੋਟਲਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ \n• jsoup ਲਾਇਬ੍ਰੇਰੀ ਨੂੰ 1.15.3 ਵਿੱਚ ਅੱਪਗ੍ਰੇਡ ਕਰੋ, ਜਿਸ ਵਿੱਚ ਸੁਰੱਖਿਆ ਫਿਕਸ ਸ਼ਾਮਲ ਹੈ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/990.txt",
    "content": "ਇਹ ਰਿਲੀਜ਼ Android 4.4 ਕਿਟਕੈਟ ਲਈ ਸਮਰਥਨ ਛੱਡਦੀ ਹੈ, ਹੁਣ ਘੱਟੋ-ਘੱਟ ਸੰਸਕਰਣ Android 5 Lollipop ਹੈ! \nਨਵਾਂ \n• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਦਬਾਉਣ ਵਾਲੇ ਮੀਨੂ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ \n• ਫੀਡ ਵਿੱਚ ਭਵਿੱਖ ਦੇ ਵੀਡੀਓ ਲੁਕਾਓ \n• ਸਥਾਨਕ ਪਲੇਲਿਸਟਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰੋ \nਸੁਧਾਰ \n• ਪਲੇਅਰ ਕੋਡ ਨੂੰ ਛੋਟੇ ਹਿੱਸਿਆਂ ਵਿੱਚ ਰੀਫੈਕਟਰ ਕਰੋ: ਘੱਟ RAM ਵਰਤੇਗੀ, ਘੱਟ ਬੱਗ ਹੋਣਗੇ\n \nਠੀਕ ਕੀਤਾ \n• ਪੂਰੀ ਸਕ੍ਰੀਨ ਦੀ ਥਾਂ ਉਸਦੇ 1/4 ਹਿੱਸੇ ਦੀ ਵਰਤੋਂ ਨੂੰ ਠੀਕ ਕਰੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/991.txt",
    "content": "ਨਵਾਂ\n• \"ਬ੍ਰਾਊਜ਼ਰ 'ਚ ਖੋਲੋ\" ਬਟਨ ਤਰੁੱਟੀ ਪੈਨਲ ਵਿੱਚ ਜੋੜਿਆ\n• ਚੈਨਲ ਗਰੁੱਪਾਂ ਨੂੰ ਲਿਸਟ ਦੇ ਰੂਪ 'ਚ ਵੇਖਣ ਦਾ ਵਿਕਲਪ ਜੋੜਿਆ ਗਿਆ\n• [ਯੂਟਿਊਬ] ਸਟ੍ਰੀਮ ਸੈਗਮੈਟਾਂ ਨੂੰ ਲੰਮਾ ਦਬਾ ਕੇ ਟਾਈਮ ਸਟੈਂਪਡ Url ਖੋਲਣ ਦੀ ਸਹੂਲਤ ਜੋੜੀ ਗਈ\n• ਮਿੰਨੀ ਪਲੇਅਰ ਵਿੱਚ ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਖੋਲਣ ਵਾਲਾ ਬਟਨ ਜੋੜਿਆ ਗਿਆ\n\nਸੁਧਾਰ\n• ਨਵੀਂ ਆਈਸਲੈਂਡਿਕ, ਪੰਜਾਬੀ (ਪਾਕਿਸਤਾਨ) ਭਾਸ਼ਾ ਅਤੇ ਹੋਰ ਕਈ ਭਾਸ਼ਾਵਾਂ [ਸਮੇਤ ਪੰਜਾਬੀ (ਭਾਰਤ] ਦੇ ਅਨੁਵਾਦ ਸੁਧਾਰ ਕਰਕੇ ਜੋੜੇ ਗਏ\n• ਹੋਰ ਅੰਦਰੂਨੀ ਸੁਧਾਰ\n\nਸਹੀ ਕੀਤੇ\n• ਕਈ ਤਰਾਂ ਦੇ ਕਰੈਸ਼ ਦਰੁੱਸਤ ਕੀਤੇ ਗਏ\n• [ਯੂਟਿਊਬ] ਚੈਨਲ ਦੇ ਵੀਡੀਓ ਵਿਖਣੇ ਅਤੇ ਫੀਡ ਵਿੱਚ ਵਿਖਣੇ ਸਹੀ ਕੀਤੇ ਗਏ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/992.txt",
    "content": "ਨਵਾਂ \n• ਵੀਡੀਓ ਵੇਰਵਿਆਂ ਵਿੱਚ ਗਾਹਕਾਂ ਦੀ ਗਿਣਤੀ \n• ਕਤਾਰ ਤੋਂ ਡਾਊਨਲੋਡ ਕਰੋ \n• ਇੱਕ ਪਲੇਅਲਿਸਟ ਥੰਮਨੇਲ ਪੱਕੇ ਤੌਰ 'ਤੇ ਸੈੱਟ ਕਰੋ \n• ਲੰਬੇ ਸਮੇਂ ਤੱਕ ਪ੍ਰੈੱਸ ਕਰਨ ਵਾਲੇ ਹੈਸ਼ਟੈਗ ਅਤੇ ਲਿੰਕ \n• ਕਾਰਡ ਦ੍ਰਿਸ਼ ਮੋਡ \n\nਸੁਧਾਰ \n• ਵੱਡਾ ਮਿੰਨੀ-ਪਲੇਅਰ ਬੰਦ ਬਟਨ \n• ਮੁਲਾਇਮ ਥੰਮਨੇਲ ਡਾਊਨਸਕੇਲਿੰਗ \n• ਟਾਰਗੇਟ ਐਂਡਰਾਇਡ 13 (ਏਪੀਆਈ 33) \n• ਹੁਣ ਪਲੇਅਰ ਸੀਕ ਕਰਨ ਤੇ ਰੁਕਦਾ ਨਹੀਂ \n• DeX/ਮਾਊਸ 'ਤੇ ਓਵਰਲੇਅ ਨੂੰ ਫਿਕਸ ਕਰੋ \n• ਬਿਨਾਂ ਕਿਸੇ ਵੱਖਰੇ ਆਡੀਓ ਸਟ੍ਰੀਮ ਦੇ ਬੈਕਗ੍ਰਾਉਂਡ ਪਲੇਅਰ ਨੂੰ ਚਲਾਉਣ ਦਿਓ \n• ਵੱਖ-ਵੱਖ ਯੂਟਿਊਬ ਫਿਕਸ ਅਤੇ ਹੋਰ…\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/993.txt",
    "content": "ਨਵਾਂ\n• ਪਲੇਲਿਸਟ ਡੁਪਲੀਕੇਟ ਜੋੜਨ ਵੇਲੇ ਚੇਤਾਵਨੀ ਸ਼ਾਮਲ ਕਰੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਹਟਾਉਣ ਲਈ ਬਟਨ ਸ਼ਾਮਲ ਕਰੋ\n• ਹਾਰਡਵੇਅਰ ਬਟਨਾਂ ਨੂੰ ਅਣਡਿੱਠ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ\n• ਫੀਡ ਵਿੱਚ ਅੰਸ਼ਕ ਤੌਰ 'ਤੇ ਦੇਖੇ ਗਏ ਵੀਡੀਓ ਨੂੰ ਲੁਕਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ\n\nਸੁਧਾਰ\n• ਵੱਡੀਆਂ ਸਕ੍ਰੀਨਾਂ 'ਤੇ ਹੋਰ ਗਰਿੱਡ ਕਾਲਮਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ\n• ਪ੍ਰਗਤੀ ਸੂਚਕਾਂ ਨੂੰ ਸੈਟਿੰਗਾਂ ਦੇ ਨਾਲ ਇਕਸਾਰ ਬਣਾਓ\n\nਠੀਕ ਕੀਤੇ\n• Android 11 'ਤੇ ਖੋਲ੍ਹਣ ਵਾਲੇ ਬ੍ਰਾਊਜ਼ਰ URL, ਡਾਊਨਲੋਡ ਅਤੇ ਬਾਹਰੀ ਪਲੇਅਰ ਨੂੰ ਠੀਕ ਕਰੋ\n• MIUI 'ਤੇ ਦੋ ਟੈਪਾਂ ਦੀ ਲੋੜ ਵਾਲੀ ਪੂਰੀ ਸਕ੍ਰੀਨ ਨਾਲ ਇੰਟਰੈਕਟਿੰਗ ਨੂੰ ਠੀਕ ਕਰੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/994.txt",
    "content": "ਨਵਾਂ\n• ਇੱਕ ਤੋਂ ਵਧੇਰੇ ਆਡੀਓ ਟਰੈਕਾਂ/ਭਾਸ਼ਾਵਾਂ ਦਾ ਸਮਰਥਨ ਕਰੋ\n• ਸਕ੍ਰੀਨ ਦੇ ਕਿਸੇ ਵੀ ਪਾਸੇ ਆਵਾਜ਼ ਅਤੇ ਚਮਕ ਦੇ ਸੰਕੇਤਾਂ ਨੂੰ ਸੈੱਟ ਕਰਨ ਦਿਓ\n• ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਲੇ ਪਾਸੇ ਮੁੱਖ-ਟੈਬਾਂ ਨੂੰ ਪ੍ਰਦਰਸ਼ਿਤ ਕਰਨ ਲਈ ਸਮਰਥਨ\n\nਸੁਧਾਰ\n• [ਬੈਂਡਕੈਂਪ] ਪੇ-ਵਾਲ ਦੇ ਪਿੱਛੇ ਟਰੈਕਾਂ ਨੂੰ ਸੰਭਾਲੋ\n\nਠੀਕ ਕੀਤੇ\n• [ਯੂਟਿਊਬ] ਸਟ੍ਰੀਮਾਂ ਲਈ 403 HTTP ਤਰੁੱਟੀਆਂ\n• ਪਲੇਲਿਸਟ ਦ੍ਰਿਸ਼ ਤੋਂ ਮੁੱਖ ਪਲੇਅਰ 'ਤੇ ਸਵਿਚ ਕਰਨ ਵੇਲੇ ਖ਼ਾਲੀ-ਕਾਲ੍ਹਾ ਪਲੇਅਰ\n• ਪਲੇਅਰ ਸਰਵਿਸ ਮੈਮੋਰੀ ਲੀਕ\n• [ਪੀਅਰਟਿਊਬ] ਅੱਪਲੋਡਰ ਅਤੇ ਸਬ-ਚੈਨਲ ਅਵਤਾਰ ਚਿੰਨ੍ਹ ਆਪਸ ਵਿੱਚ ਬਦਲੇ ਗਏ\n\nਅਤੇ ਹੋਰ ਵੀ ਬਹੁਤ ਕੁਝ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/995.txt",
    "content": "ਨਵਾਂ\n• ਚੈਨਲ ਟੈਬਾਂ ਦਾ ਸਮਰਥਨ ਕਰੋ\n• ਚਿੱਤਰ ਗੁਣਵੱਤਾ ਚੁਣੋ\n• ਸਾਰੀਆਂ ਤਸਵੀਰਾਂ ਲਈ URL ਪ੍ਰਾਪਤ ਕਰੋ\n\nਸੁਧਾਰ\n• ਪਲੇਅਰ ਇੰਟਰਫੇਸ ਦੀ ਪਹੁੰਚਯੋਗਤਾ\n• ਪਲੇਲਿਸਟ ਸ਼ੇਅਰਿੰਗ ਸਮੱਗਰੀ ਵਿੱਚ ਪਲੇਲਿਸਟ ਨਾਮ ਅਤੇ ਵੀਡੀਓ ਨਾਮ ਜੋੜਨ ਲਈ ਵਿਕਲਪ\n• ਅੰਦਰੂਨੀ ਸੁਧਾਰ ਅਤੇ ਨਿਰਭਰਤਾ ਅੱਪਡੇਟ\n\nਠੀਕ ਕੀਤੇ\n• ਭਾਸ਼ਾ ਚੋਣਕਾਰ ਵਿੱਚ ਗਲਤ ਭਾਸ਼ਾਵਾਂ ਦੀ ਚੋਣ\n• ਪਲੇਅਰ ਆਡੀਓ ਫੋਕਸ ਮਿਊਟ ਦਾ ਆਦਰ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ\n• ਖਾਸ ਮਾਮਲਿਆਂ ਵਿੱਚ ਪਲੇਲਿਸਟਾਂ ਵਿੱਚ ਆਈਟਮਾਂ ਨੂੰ ਜੋੜਨਾ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਸੀ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/996.txt",
    "content": "media.ccc.de ਵਿੱਚ ਇੱਕ ਚੈਨਲ / ਕਾਨਫਰੰਸ ਖੋਲ੍ਹਣ ਵੇਲੇ ਇੱਕ NullPointerException ਫਿਕਸ ਕੀਤਾ ਗਿਆ।\nਗ੍ਰਿੰਚ ਨੇ ਤੁਹਾਡੇ ਲਈ ਸਾਡੇ ਕ੍ਰਿਸਮਸ ਤੋਹਫ਼ੇ ਨੂੰ ਤੋੜਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ, ਪਰ ਅਸੀਂ ਇਸਨੂੰ ਠੀਕ ਕਰ ਦਿੱਤਾ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/997.txt",
    "content": "ਨਵਾਂ\n• ਟਿੱਪਣੀਆਂ ਦੇ ਜਵਾਬ ਸ਼ਾਮਿਲ ਕਰੋ\n• ਪਲੇਲਿਸਟਸ ਨੂੰ ਮੁੜ ਕ੍ਰਮਬੱਧ ਕਰਨ ਦਿਓ\n• ਪਲੇਲਿਸਟ ਵਰਣਨ ਅਤੇ ਮਿਆਦ ਦਿਖਾਓ\n• ਸੈਟਿੰਗਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨ ਦਿਓ\n\nਸੁਧਾਰ\n• [ਐਂਡਰੌਇਡ 13+] ਕਸਟਮ ਨੋਟੀਫਿਕੇਸ਼ਨ ਕਿਰਿਆਵਾਂ ਨੂੰ ਮੁੜ ਲਾਗੂ ਕਰੋ\n• ਅੱਪਡੇਟ ਜਾਂਚ ਲਈ ਸਹਿਮਤੀ ਦੀ ਬੇਨਤੀ ਕਰੋ\n• ਬਫਰਿੰਗ ਦੌਰਾਨ ਨੋਟੀਫਿਕੇਸ਼ਨ ਤੋਂ ਚਲਾਉਣ/ਰੋਕਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ\n• ਕੁਝ ਸੈਟਿੰਗਾਂ ਨੂੰ ਮੁੜ ਕ੍ਰਮਬੱਧ ਕਰੋ\n\nਠੀਕ ਕੀਤਾ\n• [ਯੂਟਿਊਬ] ਲੋਡ ਨਾ ਹੋਣ ਵਾਲੀਆਂ ਟਿੱਪਣੀਆਂ ਨੂੰ ਠੀਕ ਕਰੋ, ਨਾਲ ਹੀ ਹੋਰ ਫਿਕਸ ਅਤੇ ਸੁਧਾਰ\n• ਕਈ ਡਾਊਨਲੋਡ ਫਿਕਸ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/998.txt",
    "content": "HTTP 403 ਤਰੁੱਟੀਆਂ ਕਾਰਨ ਯੂਟਿਊਬ ਕਿਸੇ ਵੀ ਸਟ੍ਰੀਮ ਨੂੰ ਨਹੀਂ ਚਲਾ ਰਿਹਾ ਠੀਕ ਕੀਤਾ ਗਿਆ।\n\nਯੂਟਿਊਬ ਵੀਡੀਓ ਦੇ ਮੱਧ ਵਿੱਚ ਕਦੇ-ਕਦਾਈਂ HTTP 403 ਤਰੁੱਟੀਆਂ ਅਜੇ ਹੱਲ ਨਹੀਂ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ।\nਇਸ ਮੁੱਦੇ ਨੂੰ ਜਿੰਨੀ ਜਲਦੀ ਹੋ ਸਕੇ ਇੱਕ ਹੋਰ ਹੌਟਫਿਕਸ ਰਿਲੀਜ਼ ਵਿੱਚ ਹੱਲ ਕੀਤਾ ਜਾਵੇਗਾ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/changelogs/999.txt",
    "content": "ਇਹ ਹੌਟਫਿਕਸ ਰੀਲੀਜ਼ YouTube ਵੀਡੀਓਜ਼ ਦੇ ਵਿਚਕਾਰ HTTP 403 ਗਲਤੀਆਂ ਨੂੰ ਠੀਕ ਕਰਦਾ ਹੈ।\n\nਨਵਾਂ\n• [SoundCloud] on.soundcloud.com URL ਲਈ ਸਮਰਥਨ ਸ਼ਾਮਿਲ ਕਰੋ\n\nਸੁਧਾਰਿਆ ਗਿਆ\n• [ਬੈਂਡਕੈਂਪ] ਰੇਡੀਓ ਕਿਓਸਕ ਵਿੱਚ ਵਾਧੂ ਜਾਣਕਾਰੀ ਵਿਖਾਓ\n\nਠੀਕ ਕੀਤਾ ਗਿਆ\n• [YouTube] ਕਦੇ-ਕਦਾਈਂ HTTP 403 ਤਰੁੱਟੀਆਂ ਨੂੰ ਵੀਡੀਓ ਦੇ ਸ਼ੁਰੂ ਵਿੱਚ ਜਾਂ ਮੱਧ ਵਿੱਚ ਠੀਕ ਕਰੋ\n• [YouTube] ਹੋਰ ਚੈਨਲ ਹੈਡਰ ਕਿਸਮਾਂ ਤੋਂ ਅਵਤਾਰ ਅਤੇ ਬੈਨਰ ਐਕਟਰੈਕਟ ਕਰੋ\n• [ਬੈਂਡਕੈਂਪ] ਵੱਖ-ਵੱਖ ਬੱਗਾਂ ਨੂੰ ਠੀਕ ਕਰੋ ਅਤੇ ਹਮੇਸ਼ਾ HTTPS ਦੀ ਵਰਤੋਂ ਕਰੋ\n"
  },
  {
    "path": "fastlane/metadata/android/pa/full_description.txt",
    "content": "ਨਿਊ-ਪਾਈਪ ਕਿਸੇ ਵੀ ਗੂਗਲ ਫ਼ਰੇਮਵਰਕ ਲਾਇਬ੍ਰੇਰੀ ਜਾਂ ਯੂਟਿਊਬ ਏ.ਪੀ.ਆਈ. ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰਦੀ। ਇਹ ਸਿਰਫ਼ ਜ਼ਰੂਰੀ ਜਾਣਕਾਰੀ ਲੈਣ ਵਾਸਤੇ ਉਹਨਾਂ ਨੂੰ ਪੜ੍ਹਦਾ ਅਤੇ ਅਮਲ ਕਰਦਾ ਹੈ। ਇਸ ਕਰਕੇ ਇਸ ਐਪ ਦੀ ਵਰਤੋਂ ਉਹਨਾਂ ਯੰਤਰਾਂ ਤੇ ਵੀ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ ਜਿਨ੍ਹਾਂ 'ਤੇ ਗੂਗਲ ਸੇਵਾਵਾਂ ਭਰੀਆਂ ਨਹੀਂ ਹਨ। ਨਿਊ-ਪਾਈਪ ਵਰਤਣ ਲਈ ਤੁਹਾਨੂੰ ਯੂਟਿਊਬ ਖਾਤੇ ਦੀ ਵੀ ਲੋੜ ਨਹੀਂ ਅਤੇ ਇਹ ਅਜ਼ਾਦ ਅਤੇ ਖੁੱਲ੍ਹਾ-ਸਰੋਤ ਹੈ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa/short_description.txt",
    "content": "ਯੂਟਿਊਬ ਵਾਸਤੇ ਇੱਕ ਅਜ਼ਾਦ ਅਤੇ ਹਲਕੀ-ਫੁਲਕੀ ਐਪ।\n"
  },
  {
    "path": "fastlane/metadata/android/pa-PK/short_description.txt",
    "content": "یوٹوب واسطے اِکّ آزاد اتے ہلکہ پھُلکی ایپ۔\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/1000.txt",
    "content": "Ulepszone\n• Możliwość naciskania opisu playlisty, aby wyśw. więcej/mniej treści\n• [PeerTube] Automat. obsługa linków instancji `subscribeto.me`\n• Rozpocz. odtwarzania tylko jednej pozycji na ekranie historii\n\nNaprawione\n• Widoczność przycisku RSS\n• Awarie podglądu paska przewijania\n• Dodaw. do playlisty elementu bez miniatury\n• Wychodzenie z okna pobierania przed jego wyśw.\n• Powiązane pozycje w oknie kolejki\n• Kolejność w oknie dodaw. do playlisty\n• Dostosowano układ ulubionych pozycji playlist\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/1005.txt",
    "content": "Nowe\n- Obsł. Android Auto\n- Opcja ustawiania grup kanałów jako kart ekranu głównego\n- [YouTube] Udostęp. jako tymczasowa playlista\n- [SoundCloud] Karta kanału polubień\n\nUlepszone\n- Lepsze podpow. paska wysz.\n- Wyśw. daty pobrania w Pobranych\n- Używanie języka aplikacji w Androidzie 13\n\nNaprawione\n- Uszkodzone kolory tekstu w trybie ciemnym\n- [YouTube] Playlisty ładujące maks. 100 pozycji\n- [YouTube] Brakujące polecane wideo\n- Awarie w widoku listy Historii\n- Znaczniki czasu w odp. na komentarze\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/1006.txt",
    "content": "Ulepszone\n- Utrzymyw. bieżącego odtwarzacza przy naciskaniu znaczników czasu\n- Próba odzysk. oczekuj. pobierań, jeśli to możliwe\n- Dodano opcję usuwania pobierania bez usuwania pliku\n- Uprawnienie na nakładkę: wyświetl. okna z objaśnieniami dla Androida powyżej R\n- Obsługa otw. linków on.soundcloud\n- Wiele drobnych ulepszeń i optymal.\n\nNaprawione\n- Formatow. krótkich liczb na Androidzie poniżej 7\n- Puste powiadomienia\n- Pliki napisów SRT\n- Mnóstwo awarii\n\nRozwój\n- Modernizacja wewnętrznego kodu\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/1009.txt",
    "content": "Ważne\n- Dodano informację i wezwanie do działania w ramach kampanii Keep Android Open: https://www.keepandroidopen.org/\n\nUlepszone\n- [Kanał] Losowa kolejność aktualizacji nieaktualnych subskrypcji\n- Nienakładanie się stron komentarzy\n- Nieprzekazywanie naciśnięć do przesłoniętych widoków przy naciskaniu strony szczegółów wideo\n\nNaprawione\n- Układ nagłówka odpowiedzi na komentarze bez awatara\n- Wiele poprawek UI związanych z odtwarzaczem\n- [SoundCloud] Strumienie z długimi ID\n\ni wiele innych!\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/63.txt",
    "content": "### Usprawnienia\n- Ustawienia importu/eksportu #1333\n- Redukcja przerysowań (poprawa wydajności) #1371\n- Małe poprawki kodu #1375\n- Dodanie wszystkiego o GDPR #1420\n\n### Poprawiono\n- Downloader: Naprawiono crashowanie przy ładowaniu niedokończonych pobrań z plików .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/64.txt",
    "content": "### Ulepszenia\n- Dodano możliwość ograniczenia jakości wideo przy korzystaniu z danych mobilnych. #1339\n- Zapamiętanie jasności dla sesji #1442\n- Zwiększenie wydajności pobierania dla słabszych procesorów #1431\n- Dodanie (działającego) wsparcia dla sesji media #1433\n\n### Poprawka\n- Naprawiono crashowanie przy otwieraniu pobranych plików (poprawka jest już dostępna dla wersji release) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/65.txt",
    "content": "### Improvements\n\n- Disable burgermenu icon animation #1486 \n- undo delete of downloads #1472 \n- Download option in share menu #1498\n- Added share option to long tap menu #1454 \n- Minimize main player on exit #1354 \n- Library version update and database backup fix #1510 \n- ExoPlayer 2.8.2 Update #1392\n  - Reworked the playback speed control dialog to support different step sizes for faster speed change.\n  - 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 =\\\\).  \n  - 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.\n  - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened.\n  - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging\n- Use new extractor with refactored architecture for multiservice\n\n### Fixes\n\n- Fix #1440 Broken Video Info Layout #1491 \n- View history fix #1497\n  - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. \n  - #1475, by registering a view in the database when the user starts a video on external player on detail fragment.\n- Fix creen timeout in case of popup mode. #1463 (Fixed #640)\n- Main video player fix #1509 \n  - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background.\n  - Fixed minimizing player to popup does not destroy player when popup permission is not granted.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/730.txt",
    "content": "# Naprawiono\n- Ponownie naprawiono błąd funkcji odszyfrowywania.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/770.txt",
    "content": "Zmiany w wersji 0.17.2\n\nNaprawa\n• Naprawiono brak wideo\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/820.txt",
    "content": "Naprawiono wyrażenie regularne nazwy funkcji odszyfrowywania, które uniemożliwiało korzystanie z YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/830.txt",
    "content": "Zaktualizowano identyfikator klienta SoundCloud, aby naprawić problemy z SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/850.txt",
    "content": "W tym wydaniu zaktualizowano wersję serwisu YouTube. Stara wersja strony internetowej zostanie wycofana w marcu, dlatego musisz zaktualizować NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/860.txt",
    "content": "Ulepszono\n• Zapisz i przywróć, czy wysokość i tempo są odłączone, czy nie\n• Obsługa wycięcia wyświetlacza w odtwarzaczu\n• Widok okrągły i liczba subskrybentów\n• YouTube został zoptymalizowany, aby zużywał mniej danych\n\nW tej wersji naprawiono ponad 15 błędów związanych z YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/870.txt",
    "content": "To jest poprawka aktualizująca NewPipe, aby ponownie umożliwić korzystanie z SoundCloud bez większych problemów.\nAPI SoundCloud v2 jest teraz używane w ekstraktorze, a wykrywanie nieprawidłowych identyfikatorów klientów zostało ulepszone.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/910.txt",
    "content": "Naprawiono migrację bazy danych, która w rzadkich przypadkach uniemożliwiała uruchomienie NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/920.txt",
    "content": "Ulepszenia\n\n• Dodano datę przesłania i liczbę wyświetleń elementów siatki strumienia\n• Ulepszenia w układzie nagłówka szuflady\n\nNaprawy\n\n• Naprawiono przycisk wyciszenia powodujący awarie w API 19\n• Naprawiono pobieranie długich filmów 1080p 60 fps\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/950.txt",
    "content": "Ta wersja zawiera trzy małe poprawki:\n• Naprawiono dostęp do pamięci w Adroid 10+\n• Naprawiono otwierane kioski\n• Naprawiono analizę czasu trwania długich filmów\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/952.txt",
    "content": "Ulepszone\n• Autoodtwarzanie jest dostępne we wszystkich usługach (zamiast tylko w YouTube)\n\nNaprawione\n• Naprawiono powiązane strumienie, wspierając nowe kontynuacje YouTube\n• Naprawiono filmy z YouTube z ograniczeniami wiekowymi\n• [Android TV] Naprawiono utrzymującą się nakładkę podświetlenia\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/953.txt",
    "content": "Naprawiono wyodrębnianie funkcji deszyfrowania YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/954.txt",
    "content": "• nowa obsługa aplikacji: odtwarzanie na stronie ze szczegółami, przesuń w dół aby zminimalizować. \n• powiadomienia Media Style: Personalizacja zachowań powiadomień, poprawki wydajności\n• zmiana rozmiaru kiedy używasz \n NewPipe w wersji na komputer\n• menu z opcjami w przypadku nie obsługiwanego adresu URL\n• poprawa sugerowanych wyników wyszukiwania w przypadku gdyby nie można ich sprawdzić. \n• podniesiona domyślna rozdzielczość: 720p60 (w aplikacji), 480p (w wersji okienkowej)\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/955.txt",
    "content": "[YouTube] Wyszukiwanie zostało naprawione dla niektórych użytkowników\n[YouTube] Naprawiono losowe wyjątki deszyfrowania\n[SoundCloud] Adresy URL kończące się ukośnikiem są teraz parsowane poprawnie\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/956.txt",
    "content": "[YouTube] Naprawiono błąd występujący podczas ładowania innego materiału wideo\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/957.txt",
    "content": "• Ujednolicono akcje kolejkowania w jedną\n• Nowy gest przy użyciu dwóch palców, służący do zamykania odtwarzacza\n• Zezwolono na usuwanie plików cookie reCAPTCHA\n• Możliwość nie kolorowania powiadomienia\n• Poprawiono sposób otwierania szczegółów wideo, aby naprawić nieskończone buforowanie, błędne zachowanie podczas udostępniania do NewPipe i inne niespójności\n• Naprawiono awarię podczas przewijania do przodu/do tyłu\ni wiele innych\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/958.txt",
    "content": "Nowości i ulepszenia:\n• Dodano ponownie opcję ukrycia miniaturki filmu z ekranu blokady\n• Naciśnij, aby odświeżyć kanał \"Co nowego\"\n• Ulepszono wydajność podczas pobierania list lokalnych\n\nNaprawiono:\n• Naprawiono awarię podczas uruchamiania NewPipe po usunięciu go z pamięci RAM\n• Naprawiono awarię podczas uruchamiania, gdy nie ma połączenia z Internetem\n\nPozostałe:\n• Porządki i kilka wewnętrznych ulepszeń w kodzie programu\n• Aktualizacje zależności i tłumaczeń\ni wiele innych\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/959.txt",
    "content": "Naprawiono niekończącą się pętlę awarii po otwarciu raportu o błędach.\nZaktualizowana lista instancji PeerTube, które mogą być otwierane automatycznie przez NewPipe.\nZaktualizowano tłumaczenia.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/960.txt",
    "content": "• Poprawiony opis opcji eksportu bazy danych w ustawieniach.\n• Naprawiono parsowanie komentarzy z YouTube.\n• Naprawiono wyświetlaną nazwę usługi media.ccc.de.\n• Zaktualizowane tłumaczenia.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/961.txt",
    "content": "• [YouTube] Wsparcie Mix\n• [YouTube] Wyświetla informacje o nadawcach publicznych i Covid-19\n• [media.ccc.de] Dodano najnowsze filmy\n• Dodano tłumaczenie somalijskie\n\n• Wiele ulepszeń wewnętrznych\n\n• Naprawiono udostępnianie filmów z poziomu odtwarzacza\n• Naprawiono pusty widok sieciowy ReCaptcha\n• Naprawiono awarię występującą podczas usuwania strumienia z listy\n• [PeerTube] Naprawiono powiązane strumienie\n• [YouTube] Naprawiono wyszukiwanie w YouTube Music\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/962.txt",
    "content": "Dodano \"ostatnie\" filmy wideo do serwisu media.ccc.de.\nDodano strumieniowe transmisje na żywo do serwisu media.ccc.de, a także obsługę transmisji na żywo.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/964.txt",
    "content": "• Dodano wsparcie rozdziałów w kontrolkach odtwarzacza\n• [PeerTube] Dodano wyszukiwarkę Sepia\n• Dodano ponownie przycisk udostępniania w sekcji szczegółów i przeniesiono informacje o strumieniu do układu karty\n• Wyłączono przywracanie jasności przy wyłączonych gestach regulacji jasności\n• Dodano element listy umożliwiający odtworzenie wideo w Kodi\n• Naprawiono błąd przy braku domyślnej przeglądarki na niektórych urządzeniach i usprawniono menu udostępniania\n• Przełączanie odtwarzanie/pauza poprzez wciśnięcie spacji na klawiaturze fizycznej w odtwarzaczu pełnoekranowym\n• [media.cc.de] Różne poprawki i usprawnienia\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/965.txt",
    "content": "Naprawiono błąd przy zmianie kolejności grup kanałów.\nNaprawiono pobieranie kolejnych wideo z kanałów i playlist.\nNaprawiono pobieranie komentarzy w YouTube. Dodano wsparcie dla ścieżek /watch/, /v/ oraz /w/ w URL-ach YouTube.\nNaprawiono pobieranie ID użytkownika SoundCloud i zawartości z ograniczeniami geograficznymi.\nDodano język północnokurdyjski.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/972.txt",
    "content": "Nowości\nRozpoznawanie znaczników czasu i hashtagów w opisie\nDodano ręczne ustawienie trybu tabletu\nDodano możliwość ukrywania odtworzonych elementów w kanale\n\nUlepszone\nPrawidłowe wsparcie Storage Access Framework\nLepsza obsługa błędów w kanałach\nPanel udostępniania w Androidzie 10+ teraz wyświetla tytuł zawartości.\nZaktualizowano instancje Invidious i wsparcie dla linków Piped\n\nNaprawione\n[YouTube] Treść z ograniczeniem wiekowym\nZapobieganie wyjątkowi wycieku okna podczas otwierania okna wyboru\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/973.txt",
    "content": "Poprawki\n- Naprawa przycinania miniaturek i tytułów w układzie siatki z powodu błędnego obliczenia liczby filmów mieszczących się w jednym rzędzie\n- Naprawiono znikanie okna dialogowego pobierania bez wykonywania żadnych działań, jeśli zostało otwarte z menu udostępniania\n- Aktualizacja biblioteki związanej z otwieraniem zewnętrznych działań, takich jak narzędzie do wybierania plików Storage Access Framework\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/974.txt",
    "content": "Poprawka\n- Naprawiono problemy z buforowaniem spowodowane przez dławienie YouTube\n- Naprawiono usuwanie komentarzy z YouTube i awarie z wyłączonymi komentarzami\n- Naprawiono wyszukiwanie muzyki w YouTube\n- Naprawiono transmisje na żywo w PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/975.txt",
    "content": "Nowe\n• Podgląd miniatury podczas przewijania\n• Wykrywanie wyłączonych komentarzy\n• Oznaczanie elementu kanału jako obejrzany\n• Serduszka w komentarzach\n\nUlepszono\n• Układ metadanych i tagów\n• Zastosowano kolor usługi do komponentów interfejsu\n\nNaprawiono\n• Miniatury w mini odtwarzaczu\n• Niekończące się buforowanie na zduplikowanych elementach kolejki\n• W odtwarzaczu: obracanie i szybsze zamykanie\n• Ładowanie ReCAPTCHA w tle\n• Wyłączono naciśnięcia podczas odświeżania kanału\n• Awarie downloadera\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/976.txt",
    "content": "• Dodano opcję bezpośr. otw. odtw. na pełnym ekranie\n• Umożl. wybór typów sugestii wyszukiw. do wyświetl.\n• Ciemniejszy ciemny motyw + dodano ciemny ekran powitalny\n• Ulepsz. selektor plików do wyszarzania niechcianych plików\n• Napraw. import. subskrypcji YouTube\n• Ponowne odtw. strumienia wymaga ponownego dotknięcia przycisku odtw.\n• Napraw. zamykanie sesji audio\n• [Android TV] Napraw. długie przeskoki paska wyszukiw. przy korzystaniu z DPada\n\nReszta zmian w dzienniku zmian w linkach poniżej.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/977.txt",
    "content": "• Dodano przycisk „odtwórz następny” do menu długiego naciśnięcia\n• Dodano prefiks ścieżki YouTube shorts do filtru intentów\n• Naprawiono import ustawień\n• Zamiana pozycji paska z przyciskami odtwarzacza na ekranie kolejki\n• Różne poprawki związane z MediasessionManager\n• Naprawiono pasek przewijania po zakończeniu wideo\n• Wyłączono tunelowanie multimediów w RealtekATV\n• Rozszerzono klikalny obszar przycisków na zminimalizowanym odtwarzaczu\n\nReszta zmian w dzienniku zmian w linkach poniżej.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/978.txt",
    "content": "Naprawiono sprawdzanie nowej wersji NewPipe. To sprawdzenie było czasami wykonywane zbyt wcześnie i dlatego prowadziło do awarii aplikacji. Powinno to być już naprawione.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/979.txt",
    "content": "- Naprawiono wznawianie odtwarzania\n- Ulepszenia zapewniające, że usługa, która określa, czy NewPipe powinien sprawdzać nowe wersje, nie jest uruchamiana w tle\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/980.txt",
    "content": "Nowe\n• Dodano opcję „Dodaj do playlisty” do menu kontekstowego\n• Dodano obsługę krótkich linków dla y2u.be and PeerTube\n\nPoprawione\n• Bardziej kompaktowe sterowanie prędkością odtwarzania\n• Kanał wyróżnia teraz nowe pozycje\n• Opcja „Pokaż obejrzane pozycje” w kanale jest teraz zapisywana\n\nNaprawione\n• Naprawiono wyciąganie polubień i łapek w dół z YouTube'a\n• Naprawiono automatyczne odtwarzanie po powracaniu z tła\nI wiele więcej\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/983.txt",
    "content": "Dodano nowe zachowanie typu „naciśnij dwukrotnie, aby przewinąć”\nMożliwość przeszukiwania ustawień\nOznaczanie przypiętych komentarzy\nDodano obsługę otwierania w aplikacji instancji PeerTube FSFE\nDodano powiadomienia o błędach\nNaprawiono powtarzanie pierwszej pozycji kolejki przy zmianie odtwarzacza\nWydłużono oczekiwanie podczas buforowania transmisji na żywo, zanim zakończy się ono niepowodzeniem\nNaprawiono kolejność lokalnych wyników wyszukiwania\nNaprawiono puste pozycje w kolejce odtwarzania\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/984.txt",
    "content": "Ładowanie wystarczającej liczby początkowych pozycji na listach, aby wypełnić cały ekran, oraz naprawiono przewijanie na tabletach i telewizorach\nNaprawiono losowe awarie podczas przewijania list\nPrzesunięto nakładkę szybkiego przewijania odtwarzacza pod interfejs systemu\nCofnięto zmiany przy odtwarzaniu w trybie wielu okien powodujące błędy na niektórych telefonach\nPodwyższono compileSdk z 30 do 31\nZaktualizowano bibliotekę raportowania błędów\nRefaktoryzacja kodu odtwarzacza\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/986.txt",
    "content": "Nowe\n• Powiadom. o nowych strumieniach\n• Płynne przejście między odtwarzacz. w tle i wideo\n• Zmiana wys. tonu o półtony\n• Dołącz. głównej kolejki odtwarzacza do playlisty\n\nUlepszone\n• Zapamięt. wielkości kroku prędk./wys. dźwięku\n• Zmniej. wstępne długie bufor. w odtwarzaczu\n• Ulepsz. odtwarzacza dla Android TV\n• Potwierdz. przed usun. wszystkich plików\n\nNaprawione\n• Przycisk multimediów nie ukrywał kontrolek odtwarzacza\n• Reset odtwarzania po zmianie typu odtwarzacz.\n• Obracanie okna playlisty\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/987.txt",
    "content": "Nowe\n• Obsługa metod dostarczania innych niż progresywny HTTP: szybszy czas ładowania odtw., poprawki PeerTube i SoundCloud, odtw. ostatnio zakończonych transmisji na żywo w YT\n• Przycisk dodawania zdalnej playlisty do lokalnej\n• Podgląd w oknie udost. Androida 10+\n\nUlepszone\n• Okno dialogowe parametrów odtw.\n• Przeniesiono import/eksport subskrypcji do menu z trzema kropkami\n\nNaprawione\n• Usuwanie w pełni obejrzanych wideo z playlisty\n• Motyw menu udostępniania i wpis „dodaj do playlisty”\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/990.txt",
    "content": "To wydanie znosi wsparcie dla Androida 4.4 KitKat, teraz min. wersja to Android 5 Lollipop!\n\nNowe\n• Pobier. z menu długiego naciśnięcia\n• Ukryw. przyszłych wideo w kanale\n• Udostęp. lokalnych playlist\n\nUlepszone\n• Refaktor. kodu odtwarzacza: mniejsze zużycie RAM-u, mniej błędów\n• Skalowanie miniatur\n• Wektoryzacja obrazków zastępczych\n\nNaprawione\n• Różne problemy z powiadomieniem odtwarzacza: nieaktualne/brakujące info o multimediach, zniekształcona miniatura\n• Pełny ekran zajmujący 1/4 ekranu\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/991.txt",
    "content": "Nowe\n• Przycisk „Otwórz w przeglądarce” w panelu błędów\n• Opcja wyświetlania grup kanałów jako listy\n• [YouTube] Długie naciśnięcie segmentu strumienia, aby udostępnić URL ze znacznikiem czasu\n• Przycisk kolejki odtwarzania dla miniodtwarzacza\n\nUlepszone\n• Dodano islandzkie tłumaczenie i zaktualizowano wiele innych\n• Wiele wewnętrznych ulepszeń\n\nNaprawione\n• Wiele awarii\n• [YouTube] Problemy z ładowaniem kanałów, niededykowanymi kanałami i obejściem odtwarzania w niektórych krajach\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/992.txt",
    "content": "Nowe\n• Liczba subskrybentów w szczegółach wideo\n• Pobieranie z kolejki\n• Ustawianie stałej miniatury playlisty\n• Długie naciśnięcie hashtagów i linków\n• Tryb widoku karty\n\nUlepszone\n• Większy przycisk zamykania miniodtwarzacza\n• Płynniejsze zmniejszanie miniatur\n• Docelowy system Android 13 (API 33)\n• Przewijanie nie wstrzymuje już odtwarzacza\n\nNaprawione\n• Nakładka dla DeX/myszy\n• Zezwalanie na odtwarzanie w tle bez oddzielnych strumieni audio\n• Różne poprawki YouTube i więcej…\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/993.txt",
    "content": "Nowe\n• Ostrzeż. podczas dodaw. duplikatów playlist i przycisk, aby je usunąć\n• Opcja ignorow. przycisków sprzęt.\n• Opcja ukryw. częściowo obejrzanych wideo w kanale\n\nUlepszone\n• Używ. więcej kol. siatki na dużych ekranach\n• Ujednol. wskaź. postępu z ustawieniami\n\nNaprawione\n• Otwier. URL-i przeglądarki, pobranych i zew. odtwarzaczy na Androidzie 11+\n• Interakcja z trybem pełnoekr. wymagającym dwóch naciśnięć na MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/994.txt",
    "content": "Nowe\n• Obsługa wielu ścieżek/języków dźwiękowych\n• Zezwolenie na ustawienie gestów głośności i jasności po dowolnej stronie ekranu\n• Obsługa wyświetlania kart głównych na dole ekranu\n\nUlepszone\n• [Bandcamp] Obsługa utworów schowanych za paywallem\n\nNaprawione\n• [YouTube] Błędy 403 HTTP dla strumieni\n• Czarny odtwarzacz podczas przełączania do głównego odtwarzacza z widoku playlisty\n• Wyciek pamięci usługi odtwarzacza\n• [PeerTube] Awatary przesyłającego i podkanału zostały zamienione\n\ni więcej\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/995.txt",
    "content": "Nowe\n• Obsługa kart kanałów\n• Wybór jakości obrazów\n• Uzyskiwanie adresów URL do wszystkich obrazów\n\nUlepszone\n• Dostępność UI odtwarzacza\n• Lepszy wybór dźwięku dla pobierania tylko wideo\n• Opcja uwzględ. nazw playlist i wideo do udostęp. zawartości playlisty\n\nNaprawione\n• [YouTube] Liczba polubień\n• Zawieszone wysk. okienka i awarie odtwarzacza\n• Błędne wybory w selektorze języków\n• Skupienie na dźwięku odtwarzacza nie uwzględ. wyciszenia\n• Czasami niedziałające dodawanie pozycji do playlisty\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/996.txt",
    "content": "Naprawiono NullPointerException podczas otwierania kanału / konferencji na media.ccc.de.\nGrinch próbował zepsuć nasz prezent świąteczny, który został przygotowany dla Ciebie, ale to naprawiliśmy.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/changelogs/997.txt",
    "content": "Nowe\n• Odpowiadanie na komentarze\n• Zmiana kolejności playlist\n• Pokazyw. opisu i czasu trwania playlist\n• Reset ustawień\n\nUlepszone\n• [Android 13+] Przywrócono niestand. akcje powiadomień\n• Prośba o zgodę na sprawdzanie aktualizacji\n• Odtw./wstrzym. powiadomień podczas bufor.\n• Zmiana kolejność niektórych ustawień\n\nNaprawione\n• [YouTube] Nieładujące się komentarze i inne poprawki i ulepszenia\n• Luka w imporcie ustawień i przełączaniu na JSON\n• Różne poprawki pobierania\n• Przycięto wyszuk. tekst\n"
  },
  {
    "path": "fastlane/metadata/android/pl/full_description.txt",
    "content": "NewPipe nie korzysta z żadnych bibliotek programistycznych Google ani API YouTube. Aplikacja przetwarza jedynie stronę internetową w celu uzyskania potrzebnych informacji. Z tego powodu może ona być używana na urządzeniach, na których nie zainstalowano usług Google. Ponadto do korzystania z NewPipe nie jest wymagane posiadanie konta w serwisie YouTube, a sama aplikacja jest w pełni wolnym i otwartym oprogramowaniem.\n"
  },
  {
    "path": "fastlane/metadata/android/pl/short_description.txt",
    "content": "Darmowa, lekka aplikacja YouTube dla systemu Android.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/1000.txt",
    "content": "Melhorado\n• Torne a descrição da lista de reprodução clicável para mostrar mais / menos conteudo\n• [PeerTube] Gerir links de instâncias `subscribeto.me` automaticamente\n• Começar a reprodução apenas de um item na tela de histórico\n\nCorrigido\n• Corrigir visibilidade do botão RSS\n• Corrigir falhas na pré-visualização da barra de busca\n• Corrigir erro ao adicionar item sem miniatura à playlist\n• Corrigir erro ao sair da caixa de diálogo de descarregar antes de ela aparecer\n• Corrigir itens relacionados ao pop-up de colocar na fila\n• Corrigir a ordem no diálogo de adicionar à lista de reprodução\n• Ajustar o layout do item de marcador de lista de reprodução\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/1001.txt",
    "content": "Melhorias\n• Sempre permitir mudanças de preferências de notificações do player no Android 13+\n\nCorrigidos\n• Corrigido exportar banco de dados/inscrições não deve truncado a um arquivo existente recentemente, possivelmente que se levou a exportação sendo corrompido.\n• Corrigido player por resumir do começo quando clicar numa estampa de tempo.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/1002.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/1003.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/1004.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/1005.txt",
    "content": "Novo\n• Adicionado apoio para Android Auto\n• Permite definir grupos de feeds como guias do ecrã principal\n• [YouTube] Partilhar como lista de reprodução temporária\n• [SoundCloud] Separador de gostos do canal\n\nMelhorado\n• Melhores sugestões na barra de pesquisa\n• Mostrar data da descarga em descargas\n• Usar idioma por app do Android 13\n\nCorrigido\n• Corrigir cores de texto incorretas no modo escuro\n• [YouTube] Corrigir listas de reprodução que não carregam mais de 100 elementos\n...\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/1007.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/63.txt",
    "content": "#### Melhorias\n- Configurações de importação/exportação #1333\n- Reduzir a sobrecarga de renderização (melhoria de desempenho) #1371\n- Pequenas melhorias de código #1375\n- Adicione tudo sobre o GDPR #1420\n\n#### Corrigido\n- Descarregador: Corrigir falha no carregamento de descarregas inacabadas dos ficheiros .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/64.txt",
    "content": "#### Melhorias\n- Adicionada a capacidade de limitar a qualidade do vídeo se usar dados móveis. #1339\n- Lembra-se do brilho para a sessão #1442\n- Melhora o desempenho de descarregar para CPUs mais fracas #1431\n- adicionar (trabalhando) suporte para a sessão de mídia #1433\n\n### Correções\n- Corrigir falha na abertura de descarregar (correção agora disponível para compilações de lançamentos) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/65.txt",
    "content": "### Melhorias\n\n- Desativar a animação do ícone do burgermenu #1486\n- Desfazer a eliminação de descarregamentos #1472\n- Opção de descarregamento no menu de partilha #1498\n- Opção de partilha adicionada ao menu de toque longo #1454\n- Minimize o jogador principal na saída #1354\n- Atualização da versão da biblioteca e correção de cópia de segurança da base de dados #1510\n- ExoPlayer 2.8.2 Atualização #1392\n- 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.\n- 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 =\\\\).\n- 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.\n- 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.\n- 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\n- Use novo extrator com arquitetura ré fatorada para multisserviço\n\n### Conserta\n\n- Correção #1440 Layout de informações de vídeo quebrado #1491\n-Ver correção de histórico #1497\n- #1495, atualizando os metadados (miniatura, título e contagem de vídeos) assim que o usuário acessar a lista de reprodução.\n- #1475, registando uma visualização na base de dados quando o utilizador inicia um vídeo no reprodutor externo no fragmento de detalhes.\n- Correção de tempo limite de criação em caso de modo pop-up. #1463 (Corrigido #640)\n- Correção do reprodutor de vídeo principal #1509\n- [#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.\n- 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.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/66.txt",
    "content": "# Changelog de v0.13.7\n\n### Fixo\n- Fixar questões de filtro de ordenação da v0.13.6\n\n# Mudança do v0.13.6\n\n### Melhorias\n\n- Desactivar animação de ícones de burgermenu #1486 \n- anular a eliminação dos downloads #1472 \n- Opção de download no menu de partilha #1498\n- Adicionada a opção de partilha no menu de toque longo #1454 \n- Minimizar o jogador principal na saída #1354 \n- Actualização da versão da biblioteca e correcção da cópia de segurança da base de dados #1510 \n- ExoPlayer 2.8.2 Actualização #1392\n  - 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.\n  - 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).  \n  - 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.\n  - 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.\n  - 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\n- Usar novo extractor com arquitectura refacturada para multiserviços\n\n### Correcções\n\n- Reparação #1440 Layout de Informação de Vídeo Partido #1491 \n- Ver histórico correcção #1497\n  - #1495, actualizando os metadados (miniatura, título e contagem de vídeo) assim que o utilizador aceda à lista de reprodução. \n  - #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.\n- Fixar tempo limite de creen em caso de modo popup. #1463 (Fixado #640)\n- Correcção principal do leitor de vídeo #1509 \n  - [#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.\n  - Fixa a minimização do jogador a popup não destrói o jogador quando não é concedida permissão de popup.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/68.txt",
    "content": "# mudanças da v0.14.1\n\n### fixo\n- Fixo falhou em desencriptar a url de vídeo #1659 \n- Ligação de descrição fixa não extraída bem #1657\n\n# mudanças de v0.14.0\n\n### Novo\n- Novo desenho de gaveta #1461\n- Nova página inicial personalizável #1461\n\n### Melhorias\n- Controlos por gestos retrabalhados #1604 \n- Nova forma de fechar o leitor de popup #1597\n\n### Fixa\n- Corrigir erro quando a contagem de assinaturas não está disponível. Fecha #1649.\n  - Mostrar \"Contagem de subscritores não disponível\" nesses casos\n- Consertar NPE quando uma lista de reprodução do YouTube está vazia\n- Correcção rápida para os quiosques em SoundCloud\n- Refactor e correcção de bugs #1623 \n  - Resultado de pesquisa cíclica reparada #1562\n  - Barra de procura fixa não estática\n  - Os vídeos do YT Premium não estão bloqueados correctamente\n  - Vídeos Fixos por vezes não carregados (devido à análise do DASH)\n  - Corrigir ligações na descrição vídeo\n  - Mostrar aviso quando alguém tenta descarregar para sdcard externo\n  - nada de excepção mostrado dispara o relatório\n  - thumbnail não mostrado no leitor de fundo para andróide 8.1 [ver aqui](https://github.com/TeamNewPipe/NewPipe/issues/943)\n- Correcção do registo do receptor de radiodifusão. Fecha #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/69.txt",
    "content": "#### Novo\n- Eliminação de longa duração e partilha de subscrições #1516 \n- Tabela UI e esquema de lista de grelha #1617 \n\n### Melhorias\n- armazenar e recarregar a última relação de aspeto utilizada #1748 \n- Ativar a disposição linear na atividade de Downloads com nomes de vídeo completos #1771 \n- Apagar e partilhar subscrições diretamente do separador de subscrições #1516 \n- Enqueuing agora ativa a reprodução de vídeo se a fila de reprodução já tiver terminado #1783 \n- Configurações separadas para os gestos de volume e luminosidade #1644\n- Adicionar apoio à Localização #1792\n\n### Correções\n- Fixar a análise do tempo para . formato, para que NewPipe possa ser usado na Finlândia\n- Contagem fixa de assinaturas\n- Adicionar permissão de serviço em primeiro plano para dispositivos API 28+ #1830\n\n### Bugs conhecidos\n- O estado de reprodução não pode ser guardado no Android P\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/70.txt",
    "content": "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? ¯\\_(ツ)_/¯\n\n### Melhoria\n* os arquivos baixados agora podem ser abertos com um clique #1879 \n* suporte drop para android 4.1-4.3 #1884 \n* remover jogador antigo #1884 \n* remova os fluxos da fila de reprodução atual passando-os para a direita #1915 \n* remova o fluxo enfileirado automático quando um novo fluxo é enfileirado manualmente # 1878 \n* Pós-processamento para downloads e implementar recursos ausentes #1759 por @ kapodamy\n  * Infra-estruturas de pós-processamento\n  * Tratamento adequado de erros \"infraestrutura\" (para downloader)\n  * Fila em vez de vários downloads\n  * Mover transferências pendentes serializadas (`.arquivos giga`) para dados do aplicativo\n  * Implementar nova tentativa máxima de download\n  * Pausa adequada para o download de vários segmentos\n  * Parar downloads quando swicthing à rede móvel (nunca funciona, ver ponto 2)\n  * Salve a contagem de threads para os próximos downloads\n  * Muitas incoerências corrigidas\n\n### Corrigido\n* Corrigir falha com resolução padrão definida como a melhor e limitada resolução de dados móveis #1835\n* falha do jogador pop-up corrigida #1874 \n* NPE ao tentar abrir o jogador de fundo #1901\n* Correção para inserir novos fluxos quando o enfileiramento automático está habilitado #1878\n* Corrigido o problema decypering shuttown\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/71.txt",
    "content": "### Melhoria\n* Adicionar notificação de atualização do aplicativo para compilação do GitHub (#1608 por @ krtkush)\n* Várias melhorias para o downloader(# 1944 por @kapodamy):\n  * * adicione ícones brancos ausentes e use o modo hardcore para alterar as cores dos ícones\n  * verifique se o iterador foi inicializado (correções #2031)\n  * * permitir novas tentativas de downloads com erro \"Falha no pós-processamento\" no novo mixer\n  * novo muxer MPEG - 4 que fixa fluxos de vídeo e áudio não síncronos (#2039)\n\n### Corrigido\n* * As transmissões ao vivo do YouTube param de ser reproduzidas após um curto período de tempo(# 1996 por @username)\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/730.txt",
    "content": "# Correções\n- Erro na função de desencriptação novamente corrigido quente.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/740.txt",
    "content": "<h4>Improvements</h4>\n<ul>\n<li>make links in comments clickable, increase text size</li>\n<li>seek on clicking timestamp links in comments</li>\n<li>show preferred tab based on recently selected state</li>\n<li>add playlist to queue when long clicking on &#39;Background&#39; in playlist window</li>\n<li>search for shared text when it is not an URL</li>\n<li>add &quot;share at current time&quot; button to the main video player</li>\n<li>add close button to main player when video queue is finished</li>\n<li>add &quot;Play directly in Background&quot; to longpress menu for video list items</li>\n<li>improve English translations for Play/Enqueue commands</li>\n<li>small performance improvements</li>\n<li>remove unused files</li>\n<li>update ExoPlayer to 2.9.6</li>\n<li>add support for Invidious links</li>\n</ul>\n<h4>Fixed</h4>\n<ul>\n<li>fixed scroll w/ comments and related streams disabled</li>\n<li>fixed CheckForNewAppVersionTask being executed when it shouldn&#39;t</li>\n<li>fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title</li>\n<li>fix invalid YouTube url: signature tag name is not always \"signature\" preventing streams from loading</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/750.txt",
    "content": "Novo\nResumo da reprodução #2288\n• Retomar fluxos onde parou da última vez\nMelhorias Do Downloader #2149 \n• Use o Storage Access Framework para armazenar downloads em cartões SD externos\n• Novo MP4 muxer\n• Opcionalmente, altere o diretório de download antes de iniciar um download\n• Respeitar as redes de medição \n\n\nMelhorado\n• Cordas gema removidas #2295\n• Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444\n• Tornar os menus de pressão longa consistentes #2368\n\nCorrigido\n• Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394\n• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 \n• Corrigido ownloads presos em 99,9% #2440\n• Atualizar meta dados da fila de reprodução #2453 \n• [SoundCloud] corrigida a falha ao carregar listas de reprodução Team New Pipe / New Pipe Extractor#170\n• [YouTube] A duração fixa não pode ser analisada Team New Pipe / New Pipe Extractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/760.txt",
    "content": "Alterações em 0.17.1\n\nNovo\n• Localização tailandesa\n\n\nMelhorado\n• Adicionar começar a jogar aqui ação em menus de longo imprensa para playlists novamente #2518\n• Adicionar interruptor para SAF / legacy file picker #2521\n\nCorrigido\n• Corrigir botões desaparecendo na visualização de downloads ao alternar aplicativos #2487\n• Corrigir a posição de reprodução é armazenada, embora o histórico de exibição esteja desativado\n• Corrigir desempenho reduzido causado pela posição de reprodução em visualizações de lista #2517\n• [Extractor] Corrigir ReCaptchaActivity # 2527, TeamNewPipe / NewPipeExtractor#186\n• [Extractor] [YouTube] Corrigir Erro de pesquisa casual quando as listas de reprodução estão nos resultados TeamNewPipe / NewPipeExtractor#185\n\n\n\nAlterações em 0.17.0\n\nNovo\nResumo da reprodução #2288\n• Retomar fluxos onde parou da última vez\nMelhorias Do Downloader #2149 \n• Use o Storage Access Framework para armazenar downloads em cartões SD externos\n• Novo MP4 muxer\n• Opcionalmente, altere o diretório de download antes de iniciar um download\n• Respeitar as redes de medição \n\n\nMelhorado\n• Cordas gema removidas #2295\n• Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444\n• Tornar os menus de pressão longa consistentes #2368\n\nCorrigido\n• Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394\n• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 \n• Downloads fixos presos em 99,9% #2440\n• Atualizar metadados da fila de reprodução #2453 \n• [SoundCloud] corrigida a falha ao carregar listas de reprodução TeamNewPipe / NewPipeExtractor#170\n• [YouTube] duração fixa não pode ser Paresd TeamNewPipe / NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/770.txt",
    "content": "Alterações em 0.17.2\n\nCorreções\n• Correção que nenhum vídeo estava disponível\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/780.txt",
    "content": "Alterações em 0.17.3\n\nMelhorado em\n- Adicionada opção para limpar estados de reprodução #2550\n- Mostrar diretórios ocultos no seletor de ficheiros #2591\n- URLs de apoio de instâncias `invidio.us` a serem abertas com NewPipe #2488 \n- Adicionar suporte para `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194\n\nFixa\n- [YouTube] Fixo 'java.lang.IllegalArgumentException #192\n- [YouTube] Fluxos fixos ao vivo não funcionam TeamNewPipe/NewPipeExtractor#195\n- Resolvido problema de desempenho em torta de android ao descarregar um fluxo #2592\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/790.txt",
    "content": "Melhorado\n- Adicionar mais títulos para melhorar a acessibilidade para os cegos #2655\n- Tornar a linguagem da pasta de download mais consistente e menos ambígua #2637\n\nFixa\n- Verificar se o último byte no bloco é descarregado #2646\n- Rolagem fixa em fragmento de detalhe de vídeo #2672\n- Remover a dupla pesquisa de animações de caixa transparente para uma #2695\n- Fixar extracção client_id #2745\n\nDesenvolvimento\n- Adicionar dependências em falta herdadas de NewPipeExtractor em NewPipe #2535\n- Migrar para AndroidX #2685\n- Actualização para ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/800.txt",
    "content": "Novo\n- Suporte PeerTube sem P2P (#2201) [Beta]:\n  ◦ Ver e descarregar vídeos de instâncias do PeerTube\n  ◦ Adicionar instâncias nas definições para aceder ao mundo completo do PeerTube\n  ◦ 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.\n\n- Downloader (#2679):\n  ◦ Calcular ETA de descarregamento\n  ◦ Descarregar opus (ficheiros webm) como ogg\n  ◦ Recuperar ligações expiradas para retomar os downloads após uma longa pausa\n\nMelhorado\n- Tornar o KioskFragment consciente das mudanças no país de conteúdo preferido e melhorar o desempenho de todos os separadores principais #2742\n- Utilizar novas implementações de Localização e Downloader do extractor #2713 \n- Tornar o fio \"Quiosque por defeito\" traduzível\n- Barra de navegação preta para o tema preto #2569\n\nFixa\n- 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 \n- Permitir listas de reprodução sem um carregador e corrigir falhas relacionadas com este problema #2724, TeamNewPipe/NewPipeExtractor#219\n- 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\n- [SoundCloud] Equipa fixa de extracção client_idNewPipe/NewPipeExtractor#217\n- Fixar a extracção do fluxo de áudio\n\nDesenvolvimento\n- Atualizar ExoPlayer para 2.10.8 #2791, #2816\n- Atualizar o Gradle para 3.5.1 e adicionar o suporte Kotlin #2714\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/810.txt",
    "content": "Novo\n- Mostrar a miniatura do vídeo no ecrã de bloqueio ao tocar em fundo\n\nMelhorado\n- Adicionar lista de reprodução local à fila de espera ao premir durante muito tempo no botão de fundo / popup\n- Faça com que os separadores da página principal possam ser deslocados e escondidos quando só existe um único separador\n- Quantidade limite de actualizações de miniaturas de notificação no leitor de fundo\n- Adicionar miniatura de miniatura para listas de reprodução locais vazias\n- 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\n- Adicionar botão para apagar ficheiros descarregados ou histórico de descarregamentos em \"Downloads\n- [YouTube] Adicionar suporte a /c/shortened_url channel links\n\nFixa\n- Corrigido múltiplos problemas ao partilhar um vídeo para NewPipe e descarregar diretamente os seus fluxos\n- Acesso fixo do jogador fora do seu fio de criação\n- Paginação fixa de resultados de pesquisa\n- Ligar nulo fixo causando NPE\n- [YouTube] Comentários de visualização fixos ao abrir uma url invidio.us\n- ClientCloud] Client_id actualizado\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/820.txt",
    "content": "Nome da função descodificar regex corrigido, que tornava o YouTube inutilizável.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/830.txt",
    "content": "Atualização do client_id SoundCloud para corrigir problemas do SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/840.txt",
    "content": "Novo\n- Adicionado o seletor de língua para alterar a língua da aplicação\n- Adicionado enviar para o botão Kodi ao menu desmontável do leitor\n- Capacidade adicional de copiar comentários sobre imprensa longa\n\nMelhorado\n- Fixar a actividade ReCaptcha e guardar corretamente os cookies obtidos\n- 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\n- Pedir permissão de visualização sobre outras aplicações em definições corretamente no Android 6 e posteriores\n- Renomear playlist local através de um clique longo em BookmarkFragment\n- Vários melhoramentos do PeerTube\n- Melhorou várias cadeias de caracteres em inglês\n\nFixa\n- Jogador fixo a recomeçar, embora seja pausado quando a opção \"minimizar no comutador da aplicação\" é ativada e o NewPipe é minimizado\n- Fixar o valor de brilho inicial para o gesto\n- Downloads de subtítulos .srt fixos contendo nem todas as quebras de linha\n- Corrigido o download para cartão SD falhando porque alguns dispositivos Android 5 não são compatíveis com CTF\n- Descarregamento fixo no Android KitKat\n- Ficheiro fixo de vídeo corrupto .mp4 sendo reconhecido como ficheiro de áudio\n- Resolvidos problemas de localização múltipla, incluindo códigos de língua chinesa errados\n- Os carimbos temporais em descrição podem ser clicados novamente\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/850.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/860.txt",
    "content": "Melhorado\n- Gravar e restaurar se o tom e o tempo estão desengatados ou não\n- Recorte de exibição de suporte no jogador\n- Vista redonda e contagem de subscritores\n- YouTube otimizado para usar menos dados\n\nMais de 15 bugs relacionados ao YouTube foram corrigidos nesta versão.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/870.txt",
    "content": "Esta é uma versão hotfix que atualiza o NewPipe a permitir a utilização do SoundCloud sem grandes incómodos novamente.\nA API v2 do SoundCloud é agora utilizada no extrator e a deteção de IDs de clientes inválidos foi melhorada.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/900.txt",
    "content": "Novo\n- Grupos de assinaturas e feeds ordenados\n- Botão de mudo nos reprodutores\n\nMelhorado\n- Permitir a abertura de ligações music.youtube.com e media.ccc.de em NewPipe\n- Mudar duas configurações do Appearance para o Content\n- Esconder 5, 15, 25 segundos de opções de busca se a busca inexata estiver ativada\n\nFixo\n- alguns vídeos do WebM não são procurados\n- backup do banco de dados no Android P\n- falhar ao compartilhar um ficheiro descarregado\n- muitos problemas de extração no YouTube e mais ...\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/910.txt",
    "content": "Migração da base de dados corrigida que impediu que NewPipe iniciasse em alguns casos raros.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/920.txt",
    "content": "Melhorado\n\n- Data de carregamento e contagem de visualização dos itens da grelha de fluxo adicionada\n- Melhorias para o layout do cabeçalho da gaveta\n\nCorreções\n\n- O botão de silenciamento causando falhas na API 19 corrigido\n- Descarregar de vídeos longos 1080p 60fps corrigido\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/930.txt",
    "content": "Novo\n- Pesquisa no YouTube Música\n- Suporte básico de TV Android\n\nMelhorado\n- Adicionada a capacidade de remover todos os vídeos vistos de uma lista de reprodução local\n- Mostrar mensagem quando o conteúdo ainda não é suportado, em vez de se chocar\n- Reprodutor popup melhorado redimensionado com gestos de beliscão\n- Enqueue streams em fundo e botões de popup no canal\n- Melhor manuseamento do tamanho do título do cabeçalho da gaveta\n\nFixa\n- Definição de conteúdo com restrição de idade fixa não funciona\n- Fixação de certos tipos de reCAPTCHAs\n- Corrigido o crash ao abrir marcadores enquanto a lista de reprodução é \"nula\".\n- Deteção fixa de exceções relacionadas com a rede\n- Visibilidade fixa do botão de ordenação do grupo no fragmento de subscrições\n\ne mais\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/940.txt",
    "content": "Novo\n• Suporte para comentários SoundCloud\n• Modo restrito - YouTub\n• Mostrar detalhes do canal interligado - PeerTube\n\nMelhorado\n• Mostar botão Kore apenas nos serviços suportados\n• Bloquear gestos que começam nas barras de navegção ou estado\n• Cor de fundo dos botões Tentar e Subscrever baseada na cor do serviço\n\nCorrigido\n• Bloqueio da evolução de transferência\n• Botão abrir browser\n• Erro ao abri videos \"não é possível reproduzir...\"\n\ne outros\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/950.txt",
    "content": "Este lançamento traz três pequenas correções:\n- Acesso de armazenamento no Android 10+ corrigido\n- Quiosques de abertura corrigido\n- Análise de duração vídeos longos corrigido\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/951.txt",
    "content": "Novo\n• Pesquisa de selecionador de assinaturas\n• Filtro ao diálogo do grupo de feed\n• Ficha de lista de reprodução à página principal\n• Avanço/retrocesso rápido na fila de fundo/pop-up de jogadores\n• Mostrar sugestão de pesquisa: quis dizer & a mostrar resultado para\n\nMelhorado\n• Não escrever metadados de apps em ficheiros muxed\n• Não remover fluxos falhados da fila\n• A cor da barra de estado corresponde à da de ferramentas\n\nFixo\n• Desync de áudio/vídeo\n• [PeerTube] Gerir comentários apagados\n\ne mais\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/952.txt",
    "content": "Melhorado\n• A reprodução automática está disponível para todos os serviços (em vez de apenas para o YouTube)\n\nCorrigido\n• Transmissões relacionadas, permintindo novas continuações do YouTube\n• Restrições etárias em videos do YouTube\n• [Android TV] Foco e sobreposição de destaque prolongado corrigidos\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/953.txt",
    "content": "Correção da extração da função de desencriptação do YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/954.txt",
    "content": "• novo fluxo de trabalho da app: reproduz vídeos na página de detalhes, deslizar p/ baixo p/ minimizar o reprodutor \n• notificações MediaStyle: c/ ações personalizáveis, melhorias de desempenho \n• redimensionamento básico ao usar NewPipe como app desktop\n\n• mostrar diálogo com opções de carregamento em caso de URL não suportado \n• sugestão de pesquisa melhorada\n• qualidade predefinida aumentada a 720p60 (reprodutor da app) e 480p (pop-up)\n\n• correção de bugs\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/955.txt",
    "content": "[YouTube] Pesquisa corrigida para alguns utilizadores\n[YouTube] Corrigidas exceções de desencriptação aleatórias\n[SounCloud] URLs que terminam com uma barra são agora analisados corretamente\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/956.txt",
    "content": "[YouTube] Corrigida falha ao carregar qualquer vídeo\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/957.txt",
    "content": "Unir ações específicas de enfileiramento\nGesto 2 dedos p/ fechar APP\nPermitir limpeza de cookies reCAPTCHA\nOpção não colorir notific.\nMelhorar forma como os detalhes do vídeo são abertos p/ corrigir buffering infinito, comportamento errático ao compartilhar com NewPipe, etc\nAcelerar vídeos do YouTube e corrijir restrições etárias\nCorrigir falha no avanço/recuo rápido\nNão reorganizar listas ao arrastar miniaturas\nLembrar sempre as propriedades pop-up\nAdicionar idioma Santali\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/958.txt",
    "content": "Novo e melhorado:\n- Opção reajustada para esconder a miniatura no ecrã de bloqueio\n- Puxar para atualizar o feed\n- Melhor desempenho na busca de listas locais\n\nCorrigido:\n- Falha ao iniciar o NewPipe após ter sido removido da RAM\n- Falha na inicialização quando não há conexão à Internet\n- Respeitando as configurações de luminosidade e de volume\n- Listas de reprodução longas\n\nOutros:\n- Limpeza de códigos e várias melhorias internas\n- Atualizações de dependências\n- Atualizações de tradução\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/959.txt",
    "content": "Corrigido o ciclo infinito de falhas após a abertura do repórter de erros.\nAtualizada a lista de instâncias PeerTube que podem ser abertas automaticamente pelo NewPipe.\nTraduções atualizadas.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/960.txt",
    "content": "• Melhorada a descrição da opção de exportação da base de dados nas definições.\n• Correções ao processamento de comentários no YouTube.\n• Corrigido o nome de exibição para o serviço media.ccc.de.\n• Traduções atualizadas.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/961.txt",
    "content": "- Apoio à mistura\n- [YouTube] Mostrar informação sobre emissoras públicas e Covid-19\n- [media.ccc.de] Adicionados vídeos recentes\n- Acrescentada tradução somaliana\n\n- Muitas melhorias internas\n\n- Vídeos fixos de partilha de dentro do leitor\n- Vista Web ReCaptcha em branco fixa\n- Reparação de um acidente que ocorreu ao remover um fluxo de uma lista\n- Fluxos relacionados fixos\n- [YouTube] Pesquisa fixa de música no YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/962.txt",
    "content": "Adicionados vídeos \"recentes\" ao serviço media.ccc.de.\nAdicionados streams ao vivo ao serviço media.ccc.de e também suporte a streams ao vivo.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/963.txt",
    "content": "• [YouTube] Corrigido continuação do canal\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/964.txt",
    "content": "- Apoio adicional para capítulos nos controlos de jogadores\n- Adicionada a pesquisa Sepia\n- Botão de partilha reajustado na visualização detalhada do vídeo e moveu a descrição do fluxo para o layout do separador\n- Desativar o restabelecimento do brilho se o gesto de brilho for desativado\n- Adicionado item da lista para reproduzir vídeo no kodi\n- Corrigida a falha quando não está definido um navegador padrão em alguns dispositivos e melhorados os diálogos de partilha\n- Alternar jogo/pausa com botão de espaço de hardware no leitor de ecrã inteiro\n- [media.ccc.de] Várias correções e melhorias\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/965.txt",
    "content": "Corrigido o crash que ocorria ao reordenar grupos de canais.\nCorrigida a obtenção de mais vídeos do YouTube a partir de canais e listas de reprodução.\nCorrigida a obtenção de comentários do YouTube.\nAdicionado suporte a /watch/, /v/ e /w/ subpaths nas URLs do YouTube.\nCorrigida a extração de id de cliente SoundCloud e conteúdo geo-restrito.\nAdicionada a localização Curda do Norte.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/966.txt",
    "content": "Novo:\n- Acrescentar um novo serviço: Bandcamp\n\nMelhorado:\n- Adicionar uma opção para que a aplicação siga o tema do dispositivo\n- Prevenir alguns acidentes mostrando um painel de erro melhorado\n- Mostrar mais informações sobre o porquê do conteúdo na indisponibilidade\n- O botão de espaço de hardware ativa o jogo/pausa\n- Mostrar \"Download iniciado\" brinde\n\nFixo:\n- Fixar miniaturas muito pequenas em detalhes de vídeo enquanto se reproduz em fundo\n- Corrigir título vazio em jogador minimizado\n- O último modo de reparação do tamanho não está a ser restaurado corretamente\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/967.txt",
    "content": "Corrigido o YouTube não funcionar corretamente na UE. Foi causado por um novo cookie e sistema de consentimento de privacidade que requer que a NewPipe configure um cookie CONSENT.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/968.txt",
    "content": "Adicionada a opção de detalhes do canal ao menu de pressão prolongada.\nAdicionada funcionalidade para renomear o nome da lista de reprodução da interface da lista de reprodução.\nPermitir que o utilizador faça uma pausa enquanto um vídeo está a ser gravado no buffer.\nPolido o tema branco.\nCorrigida a sobreposição de fontes quando se utiliza uma fonte de tamanho maior.\nCorrigido nenhum vídeo em dispositivos Formuler e Zephier.\nCorrigidas várias falhas.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/969.txt",
    "content": "* Permitir a instalação no armazenamento externo\n* [Bandcamp] Adicionado suporte para exibir os três primeiros comentários em um fluxo\n* Mostrar apenas o brinde 'o download começou' quando o download é iniciado\n• Não defina o cookie reCaptcha quando não existir nenhum cookie armazenado\n* [Jogador] melhorar o desempenho do cache\n* [Jogador] jogador fixo que não joga automaticamente\n* Dispensar Snackbars anteriores ao excluir downloads\n* Corrigido tentando excluir objeto não na lista\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/970.txt",
    "content": "Novo\n- Mostrar metadados de conteúdo (marcações, categorias, licença, ...) abaixo da descrição\n- Adicionado \"Mostrar detalhes do canal\" opção em listas de reprodução remotas (não locais)\n- Adicionado \"Abrir no browser\" opção para o menu de pressão longa\n\nFixo\n- Fixação da falha de rotação na página de detalhes do vídeo\n- Fixo botão \"Reproduzir com Kodi\" no reprodutor sempre pede instalar Kore\n- Caminhos de importação e exportação fixos e melhorados\n- [YouTube] Fixo comentário e contagem\n...\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/971.txt",
    "content": "Hotfix\n- Aumentar o buffer para reprodução após o rebuffer\n- Corrigida a falha em tablets e TVs ao clicar no ícone da fila de reprodução no reprodutor\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/972.txt",
    "content": "Novo\nReconhecer os timestamps e hashtags na descrição\nAcrescentada a definição do modo tablet manual\nCapacidade adicional de esconder itens jogados numa ração\n\nMelhorado\nApoiar adequadamente o Quadro de Acesso ao Armazenamento\nMelhor tratamento de erros de canais indisponíveis e terminados\nA folha de partilha do Android para utilizadores do Android 10+ mostra agora o título do conteúdo.\nAtualização de instâncias Invidious e suporte de links Piped.\n\nCorrigido\n[YouTube] Conteúdo restrito à idade\nPrevenir fugas na janela Exceção ao abrir o diálogo de escolha\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/973.txt",
    "content": "Correções\n• Corrigidas as miniaturas e títulos sendo cortados no layout de grelha, devido a um cálculo incorreto de quantos vídeos cabem numa linha\n• Corrigida a caixa de diálogo de descarregamento que desaparece sem fazer nada se for aberta a partir do menu de partilha\n• Atualizada a biblioteca relacionada à abertura de atividades externas, como o seletor de ficheiros do Storage Access Framework\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/974.txt",
    "content": "Correções\n• Corrigidos os problemas de buffer causados pela limitação do YouTube\n• Corrigida a extração de comentários do YouTube e falhas com comentários desativados\n• Corrigida a pesquisa de música no YouTube\n• Corrigidas as transmissões ao vivo do PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/975.txt",
    "content": "Novo\n• Mostrar uma visualização em miniatura enquanto busca\n• Detetar comentários desativados\n• Permitir a marcação de um item de feed como assistido\n• Mostrar corações nos comentários\n\nMelhorias\n• Layout de metadados e etiquetas\n\nFixo\n• Corrigir miniatura no miniplayer\n• Corrigir buffer sem fim em itens de fila duplicados\n• Corrigir ReCAPTCHA que permanece carregado em segundo plano\n• Desativados os cliques enquanto atualiza o feed\n• Corrigir algumas falhas do descarregador\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/976.txt",
    "content": "• +opção para abrir o reprodutor em ecrã cheio\n• Pode escolher as sugestões de pesquisa a mostrar\n• Tema escuro + escuro e novo ecrã inicial escuro\n• Seletor de ficheiros: ficheiros indesejados acinzentados\n• Importação de subscrições do YouTube corrigida\n• A repetição de uma transmissão requer um toque no botão de repetição\n• Fecho da sessão de áudio corrigido\n• [Android TV] Correção de longos saltos da barra de pesquisa ao usar um DPad\n\nVer também o registo de alterações e o blogue abaixo.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/977.txt",
    "content": "• Adicionado botão \"reproduzir seguinte\" ao menu de toque longo\n• Adicionado prefixo do caminho curto do YouTube ao filtro\n• Importação de configurações corrigida\n• Trocada a posição da barra de pesquisa com os botões do reprodutor no ecrã da fila\n• Várias correções de MediasessionManager\n• Barra de pesquisa corrigida após o final do vídeo\n• Tunelamento de mídia desativado no RealtekATV\n• Expandida a área clicável dos botões minimizados\n\nVer também o registo de alterações e o blogue abaixo.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/978.txt",
    "content": "Corrigida a verificação se existe uma nova versão do NewPipe. Esta verificação era muitas vezes executada demasiado cedo, o que levava a uma falha da aplicação. Agora isto deve estar corrigido.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/979.txt",
    "content": "- Problema ao retomar a reprodução corrigido\n- Melhorias para garantir que o serviço que determina se o NewPipe deve verificar se existe uma nova versão não seja iniciado em segundo plano\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/980.txt",
    "content": "Novo\n- Adicionado \"Adicionar à lista de reprodução\" opção para o menu compartilhar\n- Adicionado suporte para ligações curtos y2u.be e PeerTube\n\nMelhorado\n- Controles de Velocidade de Reprodução mais compactos\n- Feed destaca novos itens agora\n- A opção \"Mostrar itens observados\" no feed está agora gravada\n\nFixo\n- Fixo a extração de likes e dislikes da YouTube\n- Repetição automática fixa após retornar do fundo\n...\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/981.txt",
    "content": "Removido o suporte ao MediaParser para corrigir falha de reprodução após buffer no Android 11+.\nTunelamento de mídia desativado no Philips QM16XE para corrigir problemas de reprodução.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/982.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/983.txt",
    "content": "Acrescentar nova IU e comportamento de dupla tatuagem\nTornar as definições pesquisáveis\nDestaque para os comentários em destaque como tal\nAdicionar suporte open-with-app para a instância PeerTube da FSFE\nAdicionar notificações de erro\nRepor a repetição do item da primeira fila na mudança de jogador\nEsperar mais tempo ao buffering durante os livestreams antes de falhar\nOrdem fixa dos resultados da pesquisa local\nCorrigir campos de itens vazios na fila de jogo\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/984.txt",
    "content": "Carregamento de itens iniciais suficientes em listas para preencher o ecrã inteiro e corrigir a rolagem em tablets e TVs\nCorreção de falhas aleatórias ao percorrer listas\nProcura rápida no reprodutor do arco overlay passando pela UI do sistema\nReversão das mudanças para recortes ao jogar em várias janelas, causando a regressão do jogador deslocado em alguns telefones\nAumento do compileSdk de 30 para 31\nAtualização da biblioteca de relatórios de erros\nRefatoração de algum código no reprodutor\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/985.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/986.txt",
    "content": "Novo\n- Notificações para novas correntes\n- Transição sem falhas entre o fundo e os leitores de vídeo\n- Alterar o passo por semitons\n- Anexar a fila principal de jogadores a uma lista de reprodução\n\nMelhorado\n- Lembre-se da velocidade/tamanho do passo\n- Mitigar o longo amortecimento inicial no leitor de vídeo\n- Melhorar a interface do leitor para a TV Android\n- Confirmar antes de apagar todos os ficheiros descarregados\n\nFixa\n- Botão de fixação do media não esconde os controlos do leitor\n- Reposição da reprodução corrigida na mudança de tipo de leitor\n- Fixar a rotação do diálogo da lista de reprodução\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/987.txt",
    "content": "Novo\n- 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\n- Adicionar botão para adicionar uma lista de reprodução remota a uma lista local\n- Pré-visualização de imagem na folha de partilha Android 10+\n\nMelhorado\n- Melhorar o diálogo dos parâmetros de reprodução\n- Mover botões de importação/exportação de subscrição para o menu de três pontos\n\nFixa\n- Correção da remoção de vídeos totalmente vistos da lista de reprodução\n- Corrigir o tema do menu de partilha e a entrada \"adicionar à lista de reprodução\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/988.txt",
    "content": "[YouTube] Correção do erro \"Não foi possível obter nenhum stream\" ao tentar reproduzir qualquer vídeo\n[YouTube] Correção \"O seguinte conteúdo não está disponível nesta aplicação\" mensagem mostrada em vez do vídeo solicitado\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/989.txt",
    "content": "- [YouTube] Corrigido o carregamento infinito ao tentar reproduzir qualquer vídeo \n- [YouTube] Corrigido a limitação em alguns vídeos \n- Atualizado a biblioteca do jsoup para 1.15.3, que inclui uma correção de segurança\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/990.txt",
    "content": "Esta versão deixa de suportar o Android 4.4 KitKat, agora a versão mínima é o Android 5 Lollipop!\n\nNovo\n• Descarregar a partir do menu de toque longo\n• Ocultar vídeos futuros no feed\n• Partilhar listas de reprodução locais\n\nMelhorado\n• Refatorizado o código do reprodutor: menos RAM, menos erros\n• Melhorada a escala de miniaturas\n\nCorrigido\n• Vários problemas com a notificação do reprodutor: informações de média desatualizadas/ausentes, miniatura distorcida\n• Ecrã cheio usando 1/4 do ecrã\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/991.txt",
    "content": "Novo\n•Botão \"Abrir no navegador\" no painel de erros\n•Opção para mostrar grupos de canais como lista\n•[YouTube] Clique longo nos segmentos de transmissão para partilhar o URL com a data/hora\n•Botão de fila de reprodução no mini reprodutor\n\nMelhorado\n•Nova localização em islandês e outras traduções atualizadas\n•Muitas melhorias internas\n\nCorrigido\n•Várias falhas\n•[YouTube] Correção no carregamento de canais, feeds não dedicados e solução alternativa de problemas de reprodução em alguns países\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/992.txt",
    "content": "Novo\n- Contagem de subscritores em detalhes de vídeo\n- Descarregar da fila\n- Uma miniatura permanente de listas de reprodução\n- Hashtags e ligações de imprensa longa\n- Modo de visualização de cartões\n\nMelhorado\n- Botão de fecho de mini-reprodutor maior\n- Redução mais suave das miniaturas\n- Alvo Android 13 (API 33)\n- Procurar não pausa o reprodutor\n\nFixa\n- Corrigido sobreposições no DeX/rato\n- Permitir um leitor de fundo sem fluxo de áudio separados\n- Várias correções do YouTube…\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/993.txt",
    "content": "Novo\n- Adicionar aviso ao adicionar duplicados da lista de reprodução e adicionar botão para os remover\n- Permitir ignorar os botões de hardware\n- Permitir a ocultação de vídeos parcialmente vistos na alimentação\n\nMelhorado\n- Utilizar mais colunas de grelha em ecrãs grandes\n- Tornar os indicadores de progresso consistentes com as definições\n\nFixa\n- Corrigir URLs de abertura do navegador, downloads e leitores externos no Android 11+\n- Fixação interagindo com tela cheia requer duas torneiras no MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/994.txt",
    "content": "Novo\n- Suporte para várias faixas de áudio/idiomas\n- Permitir definir gestos de volume e brilho em qualquer lado do ecrã\n- Suporte para a apresentação dos separadores principais na parte inferior do ecrã\n\nMelhorado\n- Bandcamp] Lidar com faixas atrás do muro de pagamento\n\nCorrigido\n- YouTube] Erros HTTP 403 para streams\n- Leitor preto ao mudar para o leitor principal a partir da vista de lista de reprodução\n- Fuga de memória do serviço do leitor\n- PeerTube] Os avatares do carregador e do sub-canal foram trocados\n\ne mais\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/995.txt",
    "content": "Novo\n- Separadores de canais de suporte\n- Selecionar a qualidade da imagem\n- Obter URLs para todas as imagens\n\nMelhorado\n- Acessibilidade das interfaces do leitor\n- Melhor seleção de áudio para transferências apenas de vídeo\n- Opção para incluir nomes de listas de reprodução e de vídeos no conteúdo de listas de reprodução partilhadas\n\nCorrigido\n- YouTube] Correção da contagem de gostos\n- Correção de popups e falhas do leitor que não responde\n- Seleção de idiomas errados no seletor de idiomas\n- A focagem do áudio do leitor não estava a respeitar o silêncio\n- A adição de itens à lista de reprodução não funcionava ocasionalmente\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/996.txt",
    "content": "Foi corrigida uma NullPointerException ao abrir um canal/conferência em media.ccc.de.\nO Grinch tentou estragar a nossa prenda de Natal, mas nós resolvemos o problema.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/997.txt",
    "content": "Novo\n• Adicionar respostas de comentários\n• Permitir reordenar listas de reprodução\n...\n\nMelhorado\n• [Android 13+] Restaurar ações de notificação personalizadas\n• Solicitar consentimento para verificação de atualização\n• Permitir reprodução/pausa de notificação durante o buffer\n...\n\nFixado\n• [Tube] Corrigir comentários que não carregam, além de outras correções e melhorias\n• Resolver vulnerabilidade nas configurações importação e mudar para JSON\n• Várias correções de descargas\n...\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/998.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão por causa de erros HTTP 403\n\nErros HTTP 403 ocasionais a meio de um video de Youtube ainda não foram resolvidos.\nEsse problema será resolvido em outro hotfix o mais rápido possível.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/changelogs/999.txt",
    "content": "Este hotfix corrige erros HTTP 403 no meio de vídeos do YouTube.\n\nNovo\n• [SoundCloud] Suporte adicionado para URLs do tipo on.soundcloud.com\n\nMelhorado\n• [Bandcamp] Exibição de informações adicionais no quiosque de rádio\n\nCorrigido\n• [YouTube] Correção de erros ocasionais HTTP 403 no início ou no meio dos vídeos\n• [YouTube] Extração de avatar e banner de mais tipos de cabeçalhos de canal\n• [Bandcamp] Correção de vários bugs e uso constante de HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/pt/full_description.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/pt/short_description.txt",
    "content": "Um frontend gratuito e leve do YouTube para Android.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/1000.txt",
    "content": "Improved\n• Make playlist description clickable to show more / less content\n• [PeerTube] Handle `subscribeto.me` instance links automatically\n• Only start playing single item in history screen\n\nFixed\n• Fix RSS button visibility\n• Fix seekbar preview crashes\n• Fix playlisting a thumbnail-less item\n• Fix exiting the download dialog before it appears\n• Fix related items list enqueue popup\n• Fix order in add to playlist dialog\n• Adjust the playlist bookmark item layout\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/1001.txt",
    "content": "Melhorado\n• Sempre permitir alterar preferências de notificação do player no 13+\n\nCorrigido\n• Corrigido exportar banco de dados/inscrições não truncaria um arquivo já existente, podendo levar a uma exportação corrompida\n• Corrigido o player retomando do início ao clicar em um tempo específico\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/1002.txt",
    "content": "Corrigido o problema do YouTube não reproduzir nenhum vídeo.\n\nEsta versão corrige apenas o erro mais urgente que impede o carregamento de detalhes dos vídeos do YouTube.\nEstamos cientes de que existem outros problemas e, em breve, lançaremos uma versão separada para resolvê-los.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/1003.txt",
    "content": "Esta é uma versão de correção que corrige erros do YouTube:\n• [YouTube] Corrige o não carregamento de informações de vídeo, corrige erros HTTP 403 durante a reprodução de vídeos e restaura a reprodução de alguns vídeos com restrição de idade\n• Corrige o tamanho das legendas que não era alterado\n• Corrige o download de informações duas vezes ao abrir uma transmissão.\n• [Soundcloud] Remove transmissões protegidas por DRM que não podem ser reproduzidas\n• Traduções atualizadas\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/1004.txt",
    "content": "Esta versão corrige o problema do YouTube fornecer apenas uma transmissão de 360p.\n\nObserve que a solução empregada nesta versão é provavelmente temporária e, a longo prazo, o protocolo de vídeo SABR precisa ser implementado, mas os membros da TeamNewPipe estão ocupados no momento, portanto, qualquer ajuda será muito bem-vinda! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/1005.txt",
    "content": "New\n• Add support for Android Auto\n• Allow setting feed groups as main screen tabs\n• [YouTube] Share as temporary playlist\n• [SoundCloud] Likes channel tab\n\nImproved\n• Better search bar hints\n• Show download date in Downloads\n• Use Android 13 per-app language\n\nFixed\n• Fix broken text colors in dark mode\n• [YouTube] Fix playlists not loading more than 100 items\n• [YouTube] Fix missing recommended videos\n• Fix crashes in History list view\n• Fix timestamps in comment replies\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/1006.txt",
    "content": "# Melhorias\nMantém o player ao tocar nas minutagens do vídeo.\nRecupera downloads pendentes quando possível.\nLimpa a lista de downloads sem excluir o arquivo permanentemente.\nAviso de Permissão de Sobreposição (Android R+).\nSuporte a links do SoundCloud.\nPequenas melhorias e otimizações.\n\n# Correções\nFormato de contagem para Android < 7.\nNotificações confusas ou incoerentes.\nAjustes em legendas SRT.\nCorreção de fechamentos bruscos (crashes).\n\n# Desenvolvimento\nModernização do código interno.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/1007.txt",
    "content": "This hotfix release fixes the \"Content not available\" error: YouTube videos can now be played again!\n\nIt also fixes a few bugs introduced in 0.28.1:\n• Playlist items dragging to only neighbor positions\n• Title/comments flickering between current and previous video\n• \"Start main player in fullscreen\" option not working\n\nOther improvements:\n• [YouTube] Allow rewinding livestreams up to 4 hours again\n• Don't load livestream video when playing in background\n• New UI for \"Remove watched\"\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/1008.txt",
    "content": "∙ Corrigido o retomar de streams na última posição de reprodução\n∙ [YouTube] Adicionado suporte a mais formatos de URL de canal\n∙ [YouTube] Adicionado suporte a mais formatos de metadados de vídeo\n∙ Traduções atualizadas\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/63.txt",
    "content": "### Melhorias\n - Importar/exportar configurações #1333\n - Reduzir overdraw (melhoria de desempenho) #1371\n - Pequenas melhorias no código #1375\n - Adicione tudo sobre o GDPR #1420\n\n### Corrigido\n - Downloader: corrige falha no carregamento de downloads inacabados de arquivos .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/64.txt",
    "content": "### Melhorias\n- Adiciona o recurso de limitar a qualidade do vídeo ao usar dados móveis. #1339\n- Mantém o brilho da sessão #1442\n- Melhora o desempenho para baixar em CPU mais fracas #1431\n- Adiciona suporte (funcionando) à sessão de mídia #1433\n\n### Correção\n- Corrige falha ao iniciar Downloads (correção agora disponível em versões de lançamento) # 1441\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/65.txt",
    "content": "A tradução não deve exceder o comprimento.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/66.txt",
    "content": "# Changelog of v0.13.7\n\n### Fixed\n- Fix sort filter issues of v0.13.6\n\n# Changelog of v0.13.6\n\n### Improvements\n\n- Disable burgermenu icon animation #1486 \n- undo delete of downloads #1472 \n- Download option in share menu #1498\n- Added share option to long tap menu #1454 \n- Minimize main player on exit #1354 \n- Library version update and database backup fix #1510 \n- ExoPlayer 2.8.2 Update #1392\n  - Reworked the playback speed control dialog to support different step sizes for faster speed change.\n  - 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 =\\\\).  \n  - 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.\n  - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened.\n  - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging\n- Use new extractor with refactored architecture for multiservice\n\n### Fixes\n\n- Fix #1440 Broken Video Info Layout #1491 \n- View history fix #1497\n  - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. \n  - #1475, by registering a view in the database when the user starts a video on external player on detail fragment.\n- Fix creen timeout in case of popup mode. #1463 (Fixed #640)\n- Main video player fix #1509 \n  - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background.\n  - Fixed minimizing player to popup does not destroy player when popup permission is not granted.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/68.txt",
    "content": "# changes of v0.14.1\n\n### Fixed\n- Fixed failed to decrypt video url #1659 \n- Fixed description link not extract well #1657\n\n# changes of v0.14.0\n\n### New\n- New Drawer design #1461\n- New customizable front page #1461\n\n### Improvements\n- Reworked Gesture controls #1604 \n- New way to close the popup player #1597\n\n### Fixed\n- Fix error when subscription count is not available. Closes #1649.\n  - Show \"Subscriber count not available\" in those cases\n- Fix NPE when a YouTube playlist is empty\n- Quick fix for the kiosks in SoundCloud\n- Refactor and bugfix #1623 \n  - Fix Cyclic search result  #1562\n  - Fix Seek bar not statically lay outed\n  - Fix YT Premium video are not blocked correctly\n  - Fix Videos sometimes not loading (due to DASH parsing)\n  - Fix links in video description\n  - Show warning when someone tries to download to external sdcard\n  - fix nothing shown exception triggers report\n  -  thumbnail not shown in background player for android 8.1 [see here](https://github.com/TeamNewPipe/NewPipe/issues/943)\n- Fix registering of broadcast receiver. Closes #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/69.txt",
    "content": "### New\n- Long-tap delete and share in subscriptions #1516 \n- Tablet UI and grid list layout #1617 \n\n### Improvements\n- store and reload the last used aspect ratio #1748 \n- Enable linear layout in Downloads activity with full video names #1771 \n- Delete and share subscriptions directly from within the subscriptions tab #1516 \n- Enqueuing now triggers video playing if the play queue has already ended #1783 \n- Separate settings for volume and brightness gestures #1644\n- Add support for Localization #1792\n\n### Fixes\n- Fix time parsing for . format, so NewPipe can be used in Finland\n- Fix subscription count\n- Add foreground service permission for API 28+ devices #1830\n\n### Known Bugs\n- Playback state can not be saved on Android P\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/70.txt",
    "content": "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? ¯\\_(ツ)_/¯\n\n### Improvements\n* downloaded files can now be opened with one click #1879 \n* drop support for android 4.1 - 4.3 #1884 \n* remove old player #1884 \n* remove streams from current play queue by swiping them to the right #1915 \n* remove auto queued stream when a new stream is enqueued manually #1878 \n* Postprocessing for downloads and implement missing features #1759 by @kapodamy\n  * Post-processing infrastructure\n  * Proper error handling \"infrastructure\" (for downloader)\n  * Queue instead of multiple downloads\n  * Move serialized pending downloads (`.giga` files) to app data\n  * Implement max download retry\n  * Proper multi-thread download pausing\n  * Stop downloads when swicthing to mobile network (never works, see 2nd point)\n  * Save the thread count for next downloads\n  * A lot of incoherences fixed\n\n### Fixed\n* Fix crash with default resolution set to best and limited mobile data resolution #1835\n* pop-up player crash fixed #1874 \n* NPE when trying to open background player #1901\n* Fix for inserting new streams when auto queuing is enabled #1878\n* Fixed the decypering shuttown issue\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/71.txt",
    "content": "### Improvements\n* Add app update notification for GitHub build (#1608 by @krtkush)\n* Various improvements to the downloader (#1944 by @kapodamy):\n  * add missing white icons and use hardcored way for change the icon colors\n  * check if the iterator is initialized (fixes #2031)\n  * allow retry downloads with \"post-processing failed\" error in the new muxer\n  * new MPEG-4 muxer fixing non-synchronous video and audio streams (#2039)\n\n### Fixed\n* YouTube live streams stop playing after a short time (#1996 by @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/730.txt",
    "content": "# Corrigido\n- Erro na função de desencriptação novamente corrigido quente.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/740.txt",
    "content": "<h4>Improvements</h4>\n<ul>\n<li>make links in comments clickable, increase text size</li>\n<li>seek on clicking timestamp links in comments</li>\n<li>show preferred tab based on recently selected state</li>\n<li>add playlist to queue when long clicking on &#39;Background&#39; in playlist window</li>\n<li>search for shared text when it is not an URL</li>\n<li>add &quot;share at current time&quot; button to the main video player</li>\n<li>add close button to main player when video queue is finished</li>\n<li>add &quot;Play directly in Background&quot; to longpress menu for video list items</li>\n<li>improve English translations for Play/Enqueue commands</li>\n<li>small performance improvements</li>\n<li>remove unused files</li>\n<li>update ExoPlayer to 2.9.6</li>\n<li>add support for Invidious links</li>\n</ul>\n<h4>Fixed</h4>\n<ul>\n<li>fixed scroll w/ comments and related streams disabled</li>\n<li>fixed CheckForNewAppVersionTask being executed when it shouldn&#39;t</li>\n<li>fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title</li>\n<li>fix invalid YouTube url: signature tag name is not always \"signature\" preventing streams from loading</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/750.txt",
    "content": "New\nPlayback resume #2288\n• Resume streams where you stopped last time\nDownloader Enhancements #2149 \n• Use Storage Access Framework to store downloads on external SD-cards\n• New mp4 muxer\n• Optionally change the download directory before starting a download\n• Respect metered networks \n\n\nImproved\n• Removed gema strings #2295\n• Handle (auto)rotation changes during activity lifecycle #2444\n• Make long-press menus consistent #2368\n\nFixed\n• Fixed selected subtitle track name not being shown #2394\n• Do not crash when check for app update fails (GitHub version) #2423 \n• Fixed downloads stuck at 99.9% #2440\n• Update play queue metadata #2453 \n• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/760.txt",
    "content": "Changes in 0.17.1\n\nNew\n• Thai localization\n\n\nImproved\n• Add start playing here action in long-press menus for playlists again #2518\n• Add switch for SAF / legacy file picker #2521\n\nFixed\n• Fix disappearing buttons in downloads view when switching apps #2487\n• Fix playback position is stored although watch history is disabled\n• Fix reduced performance caused by playback position in list views #2517\n• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186\n• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185\n\n\n\nChanges in 0.17.0\n\nNew\nPlayback resume #2288\n• Resume streams where you stopped last time\nDownloader Enhancements #2149 \n• Use Storage Access Framework to store downloads on external SD-cards\n• New mp4 muxer\n• Optionally change the download directory before starting a download\n• Respect metered networks \n\n\nImproved\n• Removed gema strings #2295\n• Handle (auto)rotation changes during activity lifecycle #2444\n• Make long-press menus consistent #2368\n\nFixed\n• Fixed selected subtitle track name not being shown #2394\n• Do not crash when check for app update fails (GitHub version) #2423 \n• Fixed downloads stuck at 99.9% #2440\n• Update play queue metadata #2453 \n• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/770.txt",
    "content": "Mudanças no 0.47.2\n\nConsertado\n• Consertado, nenhum vídeo estava disponível\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/780.txt",
    "content": "Changes in 0.17.3\n\nImproved\n• Added option to clear playback states #2550\n• Show hidden directories in the file picker #2591\n• Support URLs from `invidio.us` instances to be opened with NewPipe  #2488 \n• Add support for `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194\n\nFixed\n• [YouTube] Fixed 'java.lang.IllegalArgumentException #192\n• [YouTube] Fixed live streams not working TeamNewPipe/NewPipeExtractor#195\n• Fixed performance problem in android pie when downloading a stream #2592\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/790.txt",
    "content": "Improved\n• Add more titles to improve accessibility for blind people #2655\n• Make language of download folder setting more consistent and less ambiguous #2637\n\nFixed\n• Check if last byte in the block is downloaded #2646\n• Fixed scrolling in video detail fragment #2672\n• Remove double search clear box animations to one #2695\n• [SoundCloud] Fix client_id extraction #2745\n\nDevelopment\n• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535\n• Migrate to AndroidX #2685\n• Update to ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/800.txt",
    "content": "New\n• PeerTube support without P2P (#2201) [Beta]:\n  ◦ Watch and download videos from PeerTube instances\n  ◦ Add instances in the settings to access the complete PeerTube world\n  ◦ There might be problems with SSL handshakes on Android 4.4 and 7.1 when accessing certain instances resulting in a network error.\n\n• Downloader (#2679):\n  ◦ Calculate download ETA\n  ◦ Download opus (webm files) as ogg\n  ◦ Recover expired download links to resume downloads after a long pause\n\nImproved\n• Make the KioskFragment aware of changes in the preferred content country and improve performance of all main tabs #2742\n• Use new Localization and Downloader implementations from extractor #2713 \n• Make \"Default kiosk\" string translatable\n• Black navigation bar for black theme #2569\n\nFixed\n• Fixed a bug that could not move the popup player if another finger was placed while moving the popup player #2772 \n• Allow playlists missing an uploader and fix crashes related to this problem #2724, TeamNewPipe/NewPipeExtractor#219\n• Enabling TLS1.1/1.2 on Android 4.4 devices (API 19/KitKat) to fix TLS handshake with MediaCCC and some PeerTube instances  #2792\n• [SoundCloud] Fixed client_id extraction TeamNewPipe/NewPipeExtractor#217\n• [SoundCloud] Fix audio stream extraction\n\nDevelopment\n• Update ExoPlayer to 2.10.8 #2791, #2816\n• Update Gradle to 3.5.1 and add Kotlin support #2714\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/810.txt",
    "content": "New\n• Show video thumbnail on the lock screen when playing in the background\n\nImproved\n• Add local playlist to queue when long pressing on background / popup button\n• Make main page tabs scrollable and hide when there is only a single tab\n• Limit amount of notification thumbnail updates in background player\n• Add dummy thumbnail for empty local playlists\n• Use *.opus file extension instead of *.webm and show \"opus\" in format label instead of \"WebM Opus\" in the download dropdown\n• Add button to delete downloaded files or download history in \"Downloads\"\n• [YouTube] Add support to /c/shortened_url channel links\n\nFixed\n• Fixed multiple issues when sharing a video to NewPipe and downloading its streams directly\n• Fixed player access out of its creation thread\n• Fixed search result paging\n• [YouTube] Fixed switching on null causing NPE\n• [YouTube] Fixed viewing comments when opening an invidio.us url\n• [SoundCloud] Updated client_id\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/820.txt",
    "content": "Nome da função descodificar regex corrigido, que tornava o YouTube inutilizável.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/830.txt",
    "content": "Atualização do client_id SoundCloud para corrigir problemas do SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/840.txt",
    "content": "New\n• Added language selector to change the app language\n• Added send to Kodi button to player collapsible menu\n• Added ability to copy comments on long press\n\nImproved\n• Fix ReCaptcha activity and correctly save obtained cookies\n• Removed dot-menu in favour of drawer and hide history button when watch history is not enabled in settings\n• Ask for display over other apps permission in settings correctly on Android 6 and later\n• Rename local playlist by long-clicking in BookmarkFragment\n• Various PeerTube improvements\n• Improved several English source strings\n\nFixed\n• Fixed player starting again although it is paused when option \"minimize on app switch\" enabled and NewPipe is minimized\n• Fix initial brightness value for gesture\n• Fixed .srt subtitle downloads containing not all line breaks\n• Fixed download to SD card failing because some Android 5 devices are not CTF compliant\n• Fixed downloading on Android KitKat\n• Fixed corrupt video .mp4 file being recognized as audio file\n• Fixed multiple localization problems, including wrong Chinese language codes\n• [YouTube] Timestamps in description are clickable again\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/850.txt",
    "content": "Nesta atualização, a versão do site do YouTube foi atualizada. A versão antiga do site será descontinuada em março e, portanto, você deverá atualizar o NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/860.txt",
    "content": "Melhorado\n- Gravar e restaurar se o tom e o tempo estão desengatados ou não\n- Recorte de exibição de suporte no jogador\n- Vista redonda e contagem de subscritores\n- YouTube otimizado para usar menos dados\n\nMais de 15 bugs relacionados ao YouTube foram corrigidos nesta versão.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/870.txt",
    "content": "Esta é uma versão hotfix que atualiza o NewPipe a permitir a utilização do SoundCloud sem grandes incómodos novamente.\nA API v2 do SoundCloud é agora utilizada no extrator e a deteção de IDs de clientes inválidos foi melhorada.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/900.txt",
    "content": "Novo\n- Grupos de assinaturas e feeds ordenados\n- Botão de mudo nos reprodutores\n\nMelhorado\n- Permitir a abertura de ligações music.youtube.com e media.ccc.de em NewPipe\n- Mudar duas configurações do Appearance para o Content\n- Esconder 5, 15, 25 segundos de opções de busca se a busca inexata estiver ativada\n\nFixo\n- alguns vídeos do WebM não são procurados\n- backup do banco de dados no Android P\n- falhar ao compartilhar um ficheiro descarregado\n- muitos problemas de extração no YouTube e mais ...\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/910.txt",
    "content": "Migração do banco de dados corrigida que impediu que NewPipe iniciasse em alguns casos raros.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/920.txt",
    "content": "Melhorado\n\n- Data de carregamento e contagem de visualização dos itens da grelha de fluxo adicionada\n- Melhorias para o layout do cabeçalho da gaveta\n\nCorreções\n\n- O botão de silenciamento causando falhas na API 19 corrigido\n- Descarregar de vídeos longos 1080p 60fps corrigido\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/930.txt",
    "content": "New\n• Search on YouTube Music\n• Basic Android TV support\n\nImproved\n• Added the ability to remove all watched videos from a local playlist\n• Show message when content isn't supported yet instead of crashing\n• Improved popup player resize with pinch gestures\n• Enqueue streams on long press on background and popup buttons in channel\n• Improved size handling of the drawer header title\n\nFixed\n• Fixed age restricted content setting not working\n• Fixed certain kinds of reCAPTCHAs\n• Fixed crash when opening bookmarks while playlist is `null`\n• Fixed detection of network related exceptions\n• Fixed visibility of group sort button in the subscriptions fragment\n\nand more\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/940.txt",
    "content": "Novo\n• Suporte para comentários SoundCloud\n• Modo restrito - YouTub\n• Mostrar detalhes do canal interligado - PeerTube\n\nMelhorado\n• Mostar botão Kore apenas nos serviços suportados\n• Bloquear gestos que começam nas barras de navegção ou estado\n• Cor de fundo dos botões Tentar e Subscrever baseada na cor do serviço\n\nCorrigido\n• Bloqueio da evolução de transferência\n• Botão abrir browser\n• Erro ao abri videos \"não é possível reproduzir...\"\n\ne outros\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/950.txt",
    "content": "Esta versão traz três pequenas correções:\n• Corrigido o acesso ao armazenamento no Android 10+\n• Corrigido abertura do Quiosques\n• Corrigido Análise de duração dos vídeos longos\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/951.txt",
    "content": "Novo\n• Pesquisa de selecionador de assinaturas\n• Filtro ao diálogo do grupo de feed\n• Ficha de lista de reprodução à página principal\n• Avanço/retrocesso rápido na fila de fundo/pop-up de jogadores\n• Mostrar sugestão de pesquisa: quis dizer & a mostrar resultado para\n\nMelhorado\n• Não escrever metadados de apps em ficheiros muxed\n• Não remover fluxos falhados da fila\n• A cor da barra de estado corresponde à da de ferramentas\n\nFixo\n• Desync de áudio/vídeo\n• [PeerTube] Gerir comentários apagados\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/952.txt",
    "content": "Melhorado\n• A reprodução automática está disponível para todos os serviços (em vez de apenas para o YouTube)\n\nCorrigido\n• Corrigido streams relacionados apoiando as novas continuações do YouTube\n• Corrigido vídeos com restrição de idade do YouTube\n• [Android TV] Corrigido o foco persistente de sobreposição de destaque\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/953.txt",
    "content": "Corrigir a extração da função de descriptografia do YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/954.txt",
    "content": "• Novidade: toque mídia na página de detalhes e deslize para baixo para minimizar o reprodutor.\n• Notificações de mídia: ações personalizáveis nas e melhorias de desempenho\n• Redimensionar ao usar o NewPipe como aplicativo de computador\n• Diálogo com opções extras se a URL não for suportada\n• Melhor experiência de sugestão de pesquisa quando ocorrer erro de interpretação do servidor\n• Maior qualidade do vídeo padrão para 720p60 no reprodutor interno e 480p no Pop-up\n• Correções de falhas etc\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/955.txt",
    "content": "[YouTube] Corrigida a busca para alguns usuários\n[YouTube] Corrigida falhas de decriptação aleatórias\n[SoundCloud] URLs que terminam com barra agora estão sendo abertas corretamente\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/956.txt",
    "content": "[YouTube] Corrigido o crash ao carregar qualquer vídeo\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/957.txt",
    "content": "Unir ações específicas de enfileiramento\nGesto 2 dedos p/ fechar APP\nPermitir limpeza de cookies reCAPTCHA\nOpção não colorir notific.\nMelhorar forma como os detalhes do vídeo são abertos p/ corrigir buffering infinito, comportamento errático ao compartilhar com NewPipe, etc\nAcelerar vídeos do YouTube e corrijir restrições etárias\nCorrigir falha no avanço/recuo rápido\nNão reorganizar listas ao arrastar miniaturas\nLembrar sempre as propriedades pop-up\nAdicionar idioma Santali\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/958.txt",
    "content": "Novo e melhorado:\n• Re-adicionada opção para ocultar miniatura na tela de bloqueio\n• Puxe para atualizar a feed\n• Melhor desempenho ao buscar listas locais\n\nCorrigido:\n• Crash ao iniciar o NewPipe depois de ser removido da RAM\n• Crash na inicialização quando não há conexão com a internet\n• Respeitando as configurações de brilho e gestos de volume\n• [YouTube] longas listas de reprodução\n\nOutros:\n• Limpeza de códigos e várias melhorias internas\n• Atualizações de dependência e tradução\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/959.txt",
    "content": "Corrigimos um loop interminável de crash depois de abrir o reportar erro.\nAtualizado lista de instâncias do PeerTube que podem ser abertas automaticamente pelo NewPipe.\nTraduções atualizadas.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/960.txt",
    "content": "• Melhorada a descrição da opção de banco de dados de exportação nas configurações.\n• Corrigido os comentários do YouTube.\n• Corrigido o nome de exibição do serviço media.ccc.de.\n• Traduções atualizadas.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/961.txt",
    "content": "• [YouTube] Suporte a mixagem\n• [YouTube] Exibição de informações sobre emissoras públicas e Covid-19\n• [media.ccc.de] Adicionado vídeos recentes\n• Adicionada tradução para Somali\n\n• Vários melhoramentos internos\n\n• Corrigido compartilhar vídeos a partir do player\n• Corrigido ReCaptcha no webview em branco\n• Corrigido travamento que ocorre ao remover um stream da lista\n• [PeerTube] Corrigidos streams relacionados\n• [YouTube] Corrigida a pesquisa do YouTube Music\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/962.txt",
    "content": "Adicionados vídeos \"recentes\" ao serviço media.ccc.de.\nAdicionadas transmissões ao vivo ao serviço media.ccc.de e também suporte a transmissões ao vivo.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/963.txt",
    "content": "• [YouTube] Corrigido continuação de canal\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/964.txt",
    "content": "• Added support for chapters in player controls\n• [PeerTube] Added Sepia search\n• Re-added share button in video detail view and moved stream description into the tab layout\n• Disable restoring brightness if brightness gesture is disabled\n• Added list item to play video on kodi\n• Fixed crash when no default browser is set on some devices and improve share dialogs\n• Toggle play/pause with hardware space button in fullscreen player\n• [media.ccc.de] Various fixes and improvements\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/965.txt",
    "content": "Corrigida a falha que ocorria ao reordenar grupos de canais.\nCorrigida a obtenção de mais vídeos do YouTube de canais e playlists.\nCorrigida a obtenção de comentários do YouTube.\nAdicionado suporte para subcaminhos /watch/, /v/ e /w/ em URLs do YouTube.\nCorrigida a extração do ID do cliente do SoundCloud e de conteúdo com restrição geográfica.\nAdicionada a localização para o Curdo do Norte.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/966.txt",
    "content": "New:\n• Add a new service: Bandcamp\n\nImproved:\n• Add an option to have the app follow the device theme\n• Prevent some crashes by showing an improved error panel\n• Show more information on why content in unavailable\n• Hardware space button triggers play/pause\n• Show \"Download started\" toast\n\nFixed:\n• Fix very small thumbnail in video details while playing in the background\n• Fix empty title in minimized player\n• Fix last resize mode not being restored correctly\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/967.txt",
    "content": "Corrigido o YouTube que não funcionava corretamente na UE. Foi causado por um novo cookie e sistema de consentimento de privacidade que requer que a NewPipe configure um cookie CONSENT.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/968.txt",
    "content": "# Melhorias\n* Detalhes do canal adicionados ao menu de toque longo.\n* Agora é possível renomear playlists diretamente pela interface.\n* Permite pausar o vídeo mesmo durante o carregamento (buffering).\n* Refinamentos e polimento no tema claro.\n# Correções\n* Correção de fontes sobrepostas ao usar tamanhos de letra maiores.\n* Correção da ausência de vídeo nos aparelhos Formuler e Zephier.\n* Correção de diversos erros de fechamento (crashes).\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/969.txt",
    "content": "# Melhorias\nInstalação em armazenamento externo (SD).\n[Bandcamp] Exibe os 3 primeiros comentários.\nAviso de download aparece apenas ao iniciar.\nSem cookies reCaptcha desnecessários.\n[Player] Melhor cache e fluidez.\nCorreções\n[Player] Início automático corrigido.\nFecha avisos antigos ao excluir downloads.\nErro ao excluir item inexistente corrigido.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/971.txt",
    "content": "Correção rápida\n• Aumentado o buffer para reprodução após rebuffer\n• Corrigido travamento em tablets e TVs ao clicar no ícone da fila de reprodução no player\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/973.txt",
    "content": "Correção rápida\n• Corrigidos miniaturas e títulos sendo cortados no layout em grade, devido a um cálculo errado de quantos vídeos cabem em uma linha\n• Corrigido diálogo de download desaparecendo sem fazer nada se aberto pelo menu de compartilhamento\n• Atualizada uma biblioteca relacionada à abertura de atividades externas, como o seletor de arquivos do Storage Access Framework\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/974.txt",
    "content": "Correção rápida\n• Corrigidos problemas de buffer causados pelo throttling do YouTube\n• Corrigida extração de comentários do YouTube e travamentos com comentários desativados\n• Corrigida a busca de músicas no YouTube\n• Corrigidas transmissões ao vivo no PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/976.txt",
    "content": "• Foi adicionada a opção de abrir o reprodutor em tela cheia sem clicar novamente.\n• Você pode escolher quais sugestões de pesquisa exibir.\n• Tema escuro e tela de abertura com preto AMOLED.\n• Arquivos incompatíveis aparecem como cinza.\n• Importação de inscrições do YouTube corrigida.\n• O botão de repetir o vídeo exige apenas um toque.\n• Sessão de áudio fecha corretamente.\n• [Android TV] Saltos na barra de pesquisa pelo controle remoto corrigidos.\nConfira as alterações na aba de links abaixo.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/978.txt",
    "content": "Corrigido execução de verificação para uma nova versão do NewPipe. Essa verificação era executada muito cedo algumas vezes e logo levava o aplicativo a crashar. Isso deve estar corrigido agora.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/982.txt",
    "content": "Corrigido YouTube não reproduzir qualquer transmissão.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/984.txt",
    "content": "Carregamento de itens iniciais suficientes em listas para preencher a tela inteira e corrigir a rolagem em tablets e TVs\nCorreção de falhas aleatórias ao percorrer listas\nProcura rápida no player do arco overlay passandndo pela UI do sistema\nReversão das mudanças para recortes ao jogar em várias janelas, causando a regressão do jogador deslocado em alguns telefones\nAumento do compileSdk de 30 para 31\nAtualização da biblioteca de relatórios de erros\nRefatoração de algum código no player\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/985.txt",
    "content": "Corrigido YouTube não reproduzir qualquer transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/989.txt",
    "content": "• [YouTube] Corrigido carregamento quando tentava reproduzir qualquer vídeo\n• [YouTube] Corrigido a aceleração em alguns vídeos\n• Atualização da biblioteca jsoup para 1.15.3, que inclue uma correção de segurança\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/994.txt",
    "content": "Novo\n• Suporte a múltiplas faixas de áudio e idiomas\n• Definição de gestos para volume e brilho em qualquer lado da tela\n• Suporte para exibir abas principais na parte inferior da tela\n\nMelhorias\n• [Bandcamp] Lida com faixas sob acesso pago\n\nCorrigido\n• [YouTube] erros HTTP 403 para transmissões\n• Tela preta ao alternar ao reprodutor a partir da visualização da lista de reprodução\n• Vazamento de memória no reprodutor\n• [PeerTube] Avatares do carregador e do subcanal foram trocados\n\ne mais\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/995.txt",
    "content": "New\n• Support channel tabs\n• Select image quality\n• Get URLs to all images\n\nImproved\n• Accessibility of player interfaces\n• Better audio selection for video-only downloads\n• Option to include playlist and video names to shared playlist content\n\nFixed\n• [YouTube] Fix getting like count\n• Fix player not responding popups and crashes\n• Selection of wrong languages in language picker\n• Player audio focus was not respecting mute\n• Playlist item addition occasionally not working\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/998.txt",
    "content": "Corrigido o YouTube por não reproduzir nenhum vídeo devido a erros HTTP 403.\n\nErros HTTP 403 ocasionais no meio de um vídeo do YouTube ainda não foram corrigidos.\nEsse problema será resolvido em outra versão de hotfix assim que possível.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/changelogs/999.txt",
    "content": "Esta versão de correção corrige erros HTTP 403 no meio dos vídeos do YouTube.\n\nNovo\n• [SoundCloud] Adicionado suporte para URLs on.soundcloud.com\n\nMelhorado\n• [Bandcamp] Exibição de informações adicionais no quiosque de rádio\n\nCorrigido\n• [YouTube] Correção de erros HTTP 403 ocasionais no início ou no meio dos vídeos\n• [YouTube] Extração de avatar e banner de mais tipos de cabeçalhos de canal\n• [Bandcamp] Correção de vários bugs e uso exclusivo de HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/full_description.txt",
    "content": "O NewPipe não usa nenhuma biblioteca de framework do Google ou a API do YouTube. Ele só analisa o site para obter as informações que precisa. Portanto, este aplicativo pode ser usado em dispositivos sem o Google Services instalado. Além disso, você não precisa de uma conta no YouTube para usar o NewPipe, e é FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-BR/short_description.txt",
    "content": "Um frontend gratuito e leve do YouTube para Android.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/1000.txt",
    "content": "Melhorado\n• Torne a descrição da lista de reprodução clicável para mostrar mais / menos conteudo\n• [PeerTube] Gerir links de instâncias `subscribeto.me` automaticamente\n• Começar a reprodução apenas de um item na tela de histórico\n\nCorrigido\n• Corrigir visibilidade do botão RSS\n• Corrigir falhas na pré-visualização da barra de busca\n• Corrigir erro ao adicionar item sem miniatura à playlist\n• Corrigir erro ao sair da caixa de diálogo de descarregar antes de ela aparecer\n• Corrigir itens relacionados ao pop-up de colocar na fila\n• Corrigir a ordem no diálogo de adicionar à lista de reprodução\n• Ajustar o layout do item de marcador de lista de reprodução\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/1001.txt",
    "content": "Melhorias\n• Sempre permitir mudanças de preferências de notificações do reprodutor no Android 13+\n\nCorrigido\n• Corrigido exportar base de dados/inscrições não deve truncar um ficheiro existente previamente, possivelmente levar a uma exportação corrompida..\n• Corrigido reprodutor a resumir do início quando clicar numa estampa de tempo\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/1002.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/1003.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/1004.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/1005.txt",
    "content": "Novo\n• Adicionado apoio para Android Auto\n• Permite definir grupos de feeds como guias do ecrã principal\n• [YouTube] Partilhar como lista de reprodução temporária\n• [SoundCloud] Separador de gostos do canal\n\nMelhorado\n• Melhores sugestões na barra de pesquisa\n• Mostrar data da descarga em descargas\n• Usar idioma por app do Android 13\n\nCorrigido\n• Corrigir cores de texto incorretas no modo escuro\n• [YouTube] Corrigir listas de reprodução que não carregam mais de 100 elementos\n...\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/1007.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/63.txt",
    "content": "#### Melhorias\n- Configurações de importação/exportação #1333\n- Reduzir o overdraw (melhoria de desempenho) #1371\n- Pequenas melhorias de código #1375\n- Adicione tudo sobre o GDPR #1420\n\n#### Fixo\n- Descarregador: corrigir falha no carregamento de descarregas inacabadas dos ficheiros .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/64.txt",
    "content": "#### Melhorias\n- Adicionada a capacidade de limitar a qualidade do vídeo se usar dados móveis. #1339\n- Lembra-se do brilho para a sessão #1442\n- Melhora o desempenho de descarregar para CPUs mais fracas #1431\n- adicionar (trabalhando) suporte para a sessão de mídia #1433\n\n### Correções\n- Corrigir falha na abertura de descarregar (correção agora disponível para compilações de lançamentos) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/65.txt",
    "content": "### Melhorias\n\n- Desativar a animação do ícone do burgermenu #1486\n- Desfazer a eliminação de descarregamentos #1472\n- Opção de descarregamento no menu de partilha #1498\n- Opção de partilha adicionada ao menu de toque longo #1454\n- Minimize o jogador principal na saída #1354\n- Atualização da versão da biblioteca e correção de cópia de segurança da base de dados #1510\n- ExoPlayer 2.8.2 Atualização #1392\n- 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.\n- 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 =\\\\).\n- 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.\n- 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.\n- 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\n- Use novo extrator com arquitetura ré fatorada para multisserviço\n\n### Correções\n\n- Correção #1440 Layout de informações de vídeo quebrado #1491\n-Ver correção de histórico #1497\n- #1495, atualizando os metadados (miniatura, título e contagem de vídeos) assim que o usuário acessar a lista de reprodução.\n- #1475, registando uma visualização na base de dados quando o utilizador inicia um vídeo no reprodutor externo no fragmento de detalhes.\n- Correção de tempo limite de criação em caso de modo pop-up. #1463 (Corrigido #640)\n- Correção do reprodutor de vídeo principal #1509\n- [#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.\n- 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.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/66.txt",
    "content": "# Changelog de v0.13.7\n\n### Fixo\n- Fixar questões de filtro de ordenação da v0.13.6\n\n# Mudança do v0.13.6\n\n### Melhorias\n\n- Desactivar animação de ícones de burgermenu #1486 \n- anular a eliminação dos downloads #1472 \n- Opção de download no menu de partilha #1498\n- Adicionada a opção de partilha no menu de toque longo #1454 \n- Minimizar o jogador principal na saída #1354 \n- Actualização da versão da biblioteca e correcção da cópia de segurança da base de dados #1510 \n- ExoPlayer 2.8.2 Actualização #1392\n  - 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.\n  - 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).  \n  - 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.\n  - 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.\n  - 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\n- Usar novo extractor com arquitectura refacturada para multiserviços\n\n### Correcções\n\n- Reparação #1440 Layout de Informação de Vídeo Partido #1491 \n- Ver histórico correcção #1497\n  - #1495, actualizando os metadados (miniatura, título e contagem de vídeo) assim que o utilizador aceda à lista de reprodução. \n  - #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.\n- Fixar tempo limite de creen em caso de modo popup. #1463 (Fixado #640)\n- Correcção principal do leitor de vídeo #1509 \n  - [#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.\n  - Fixa a minimização do jogador a popup não destrói o jogador quando não é concedida permissão de popup.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/68.txt",
    "content": "# mudanças da v0.14.1\n\n### fixo\n- Fixo falhou em desencriptar a url de vídeo #1659 \n- Ligação de descrição fixa não extraída bem #1657\n\n# mudanças de v0.14.0\n\n### Novo\n- Novo desenho de gaveta #1461\n- Nova página inicial personalizável #1461\n\n### Melhorias\n- Controlos por gestos retrabalhados #1604 \n- Nova forma de fechar o leitor de popup #1597\n\n### Fixa\n- Corrigir erro quando a contagem de assinaturas não está disponível. Fecha #1649.\n  - Mostrar \"Contagem de subscritores não disponível\" nesses casos\n- Consertar NPE quando uma lista de reprodução do YouTube está vazia\n- Correcção rápida para os quiosques em SoundCloud\n- Refactor e correcção de bugs #1623 \n  - Resultado de pesquisa cíclica reparada #1562\n  - Barra de procura fixa não estática\n  - Os vídeos do YT Premium não estão bloqueados correctamente\n  - Vídeos Fixos por vezes não carregados (devido à análise do DASH)\n  - Corrigir ligações na descrição vídeo\n  - Mostrar aviso quando alguém tenta descarregar para sdcard externo\n  - nada de excepção mostrado dispara o relatório\n  - thumbnail não mostrado no leitor de fundo para andróide 8.1 [ver aqui](https://github.com/TeamNewPipe/NewPipe/issues/943)\n- Correcção do registo do receptor de radiodifusão. Fecha #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/69.txt",
    "content": "#### Novo\n- Eliminação de longa duração e partilha de subscrições #1516 \n- Tabela UI e esquema de lista de grelha #1617 \n\n### Melhorias\n- armazenar e recarregar a última relação de aspeto utilizada #1748 \n- Ativar a disposição linear na atividade de Downloads com nomes de vídeo completos #1771 \n- Apagar e partilhar subscrições diretamente do separador de subscrições #1516 \n- Enqueuing agora ativa a reprodução de vídeo se a fila de reprodução já tiver terminado #1783 \n- Configurações separadas para os gestos de volume e luminosidade #1644\n- Adicionar apoio à Localização #1792\n\n### Correções\n- Fixar a análise do tempo para . formato, para que NewPipe possa ser usado na Finlândia\n- Contagem fixa de assinaturas\n- Adicionar permissão de serviço em primeiro plano para dispositivos API 28+ #1830\n\n### Bugs conhecidos\n- O estado de reprodução não pode ser guardado no Android P\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/70.txt",
    "content": "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? ¯\\_(ツ)_/¯\n\n### Melhoria\n* os arquivos baixados agora podem ser abertos com um clique #1879 \n* suporte drop para android 4.1-4.3 #1884 \n* remover jogador antigo #1884 \n* remova os fluxos da fila de reprodução atual passando-os para a direita #1915 \n* remova o fluxo enfileirado automático quando um novo fluxo é enfileirado manualmente # 1878 \n* Pós-processamento para downloads e implementar recursos ausentes #1759 por @ kapodamy\n  * Infra-estruturas de pós-processamento\n  * Tratamento adequado de erros \"infraestrutura\" (para downloader)\n  * Fila em vez de vários downloads\n  * Mover transferências pendentes serializadas (`.arquivos giga`) para dados do aplicativo\n  * Implementar nova tentativa máxima de download\n  * Pausa adequada para o download de vários segmentos\n  * Parar downloads quando swicthing à rede móvel (nunca funciona, ver ponto 2)\n  * Salve a contagem de threads para os próximos downloads\n  * Muitas incoerências corrigidas\n\n### Corrigido\n* Corrigir falha com resolução padrão definida como a melhor e limitada resolução de dados móveis #1835\n* falha do jogador pop-up corrigida #1874 \n* NPE ao tentar abrir o jogador de fundo #1901\n* Correção para inserir novos fluxos quando o enfileiramento automático está habilitado #1878\n* Corrigido o problema decypering shuttown\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/71.txt",
    "content": "### Melhoria\n* Adicionar notificação de atualização do aplicativo para compilação do GitHub (#1608 por @ krtkush)\n* Várias melhorias para o downloader(# 1944 por @kapodamy):\n  * * adicione ícones brancos ausentes e use o modo hardcore para alterar as cores dos ícones\n  * verifique se o iterador foi inicializado (correções #2031)\n  * * permitir novas tentativas de downloads com erro \"Falha no pós-processamento\" no novo mixer\n  * novo muxer MPEG - 4 que fixa fluxos de vídeo e áudio não síncronos (#2039)\n\n### Corrigido\n* * As transmissões ao vivo do YouTube param de ser reproduzidas após um curto período de tempo(# 1996 por @username)\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/730.txt",
    "content": "# Corrigido\n- Erro na função de desencriptação novamente corrigido quente.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/740.txt",
    "content": "< H4 > melhorias< / h4>\n< ul>\n< li>tornar os links nos comentários clicáveis, aumentar o tamanho do texto< / li>\n< li>procurar ao clicar em links de carimbo de data/hora nos comentários< / li>\n< li>mostrar a guia preferida com base no estado selecionado recentemente< / li>\n< li>adicionar lista de reprodução à fila ao clicar longamente em & # 39;fundo& # 39; na janela da lista de reprodução< / li>\n< li>procurar texto partilhado quando não é um URL< / li>\n< li>adicionar o botão&quot;Partilhar no momento atual & quot; ao leitor de vídeo principal< / li>\n< li>adicionar botão fechar ao leitor principal quando terminar a fila de vídeo< / li>\n< li>Adicionar & quot;Reproduzir diretamente em segundo plano & quot; ao menu longpress para itens da lista de vídeos< / li>\n< li>melhorar as traduções em Inglês para comandos Play / Enqueue< / li>\n< li>pequenas melhorias de desempenho< / li>\n< li>remover ficheiros não utilizados < / li>\n< li>Atualizar o ExoPlayer para 2.9.6< / li>\n< li>adicionar suporte para links ofensivos< / li>\n< / ul>\n<h4>fixo < /h4>\n< ul>\n< li>rolagem fixa com comentários e fluxos relacionados desativados < / li>\n< li>Corrigido CheckForNewAppVersionTask sendo executado quando deveria & # 39; t< / li>\n< li>importação de assinatura fixa do youtube: ignore aqueles com url inválido e mantenha aqueles com título vazio< / li>\n< li>corrigir URL inválido do YouTube: o nome da marca de assinatura nem sempre é \"Assinatura\", impedindo o carregamento de fluxos< / li>\n< / ul>\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/750.txt",
    "content": "Novo\nResumo da reprodução #2288\n* Retomar fluxos onde parou da última vez\nMelhorias Do Downloader #2149 \n* Use o Storage Access Framework para armazenar downloads em cartões SD externos\n* Novo MP4 muxer\n* Opcionalmente, altere o diretório de download antes de iniciar um download\n* Respeitar as redes de medição \n\n\nMelhorado\n* Cordas gema removidas #2295\n* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444\n* Tornar os menus de pressão longa consistentes #2368\n\nCorrigido\n* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394\n• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 \n* Downloads fixos presos em 99,9% #2440\n* Atualizar meta dados da fila de reprodução #2453 \n* [*[SoundCloud] corrigida a falha ao carregar listas de reprodução Team New Pipe / New Pipe Extractor#170\n* [*[YouTube] A duração fixa não pode ser analisada Team New Pipe / New Pipe Extractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/760.txt",
    "content": "Alterações em 0.17.1\n\nNovo\n* Localização tailandesa\n\n\nMelhorado\n* Adicionar começar a jogar aqui ação em menus de longo imprensa para playlists novamente #2518\n* Adicionar interruptor para SAF / legacy file picker #2521\n\nCorrigido\n* Corrigir botões desaparecendo na visualização de downloads ao alternar aplicativos #2487\n* Corrigir a posição de reprodução é armazenada, embora o histórico de exibição esteja desativado\n* Corrigir desempenho reduzido causado pela posição de reprodução em visualizações de lista #2517\n* [Extractor] Corrigir ReCaptchaActivity # 2527, TeamNewPipe / NewPipeExtractor#186\n* [Extractor] [YouTube] Corrigir Erro de pesquisa casual quando as listas de reprodução estão nos resultados TeamNewPipe / NewPipeExtractor#185\n\n\n\nAlterações em 0.17.0\n\nNovo\nResumo da reprodução #2288\n* Retomar fluxos onde parou da última vez\nMelhorias Do Downloader #2149 \n* Use o Storage Access Framework para armazenar downloads em cartões SD externos\n* Novo MP4 muxer\n* Opcionalmente, altere o diretório de download antes de iniciar um download\n* Respeitar as redes de medição \n\n\nMelhorado\n* Cordas gema removidas #2295\n* Lidar com mudanças de rotação (automática) durante o ciclo de vida da atividade #2444\n* Tornar os menus de pressão longa consistentes #2368\n\nCorrigido\n* Corrigido o nome da faixa de legenda selecionada não sendo mostrado #2394\n• Não trave quando a verificação da atualização do aplicativo falhar (versão do GitHub) #2423 \n* Downloads fixos presos em 99,9% #2440\n* Atualizar metadados da fila de reprodução #2453 \n* [SoundCloud] corrigida a falha ao carregar listas de reprodução TeamNewPipe / NewPipeExtractor#170\n* [YouTube] duração fixa não pode ser Paresd TeamNewPipe / NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/770.txt",
    "content": "Alterações em 0.17.2\n\nCorreções\n• Correção que nenhum vídeo estava disponível\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/780.txt",
    "content": "Alterações em 0.17.3\n\nMelhorado\n- Adicionada opção para limpar estados de reprodução #2550\n- Mostrar diretórios ocultos no seletor de ficheiros #2591\n- URLs de apoio de instâncias `invidio.us` a serem abertas com NewPipe #2488 \n- Adicionar suporte para `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194\n\nCorrigido\n- [YouTube] Fixo 'java.lang.IllegalArgumentException #192\n- [YouTube] Fluxos fixos ao vivo não funcionam TeamNewPipe/NewPipeExtractor#195\n- Resolvido problema de desempenho em torta de android ao descarregar um fluxo #2592\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/790.txt",
    "content": "Melhorado\n- Adicionar mais títulos para melhorar a acessibilidade para os cegos #2655\n- Tornar a linguagem da pasta de download mais consistente e menos ambígua #2637\n\nFixa\n- Verificar se o último byte no bloco é descarregado #2646\n- Rolagem fixa em fragmento de detalhe de vídeo #2672\n- Remover a dupla pesquisa de animações de caixa transparente para uma #2695\n- Fixar extracção client_id #2745\n\nDesenvolvimento\n- Adicionar dependências em falta herdadas de NewPipeExtractor em NewPipe #2535\n- Migrar para AndroidX #2685\n- Actualização para ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/800.txt",
    "content": "Novo\n- Suporte PeerTube sem P2P (#2201) [Beta]:\n  ◦ Ver e descarregar vídeos de instâncias do PeerTube\n  ◦ Adicionar instâncias nas definições para aceder ao mundo completo do PeerTube\n  ◦ 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.\n\n- Downloader (#2679):\n  ◦ Calcular ETA de descarregamento\n  ◦ Descarregar opus (ficheiros webm) como ogg\n  ◦ Recuperar ligações expiradas para retomar os downloads após uma longa pausa\n\nMelhorado\n- Tornar o KioskFragment consciente das mudanças no país de conteúdo preferido e melhorar o desempenho de todos os separadores principais #2742\n- Utilizar novas implementações de Localização e Downloader do extractor #2713 \n- Tornar o fio \"Quiosque por defeito\" traduzível\n- Barra de navegação preta para o tema preto #2569\n\nFixa\n- 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 \n- Permitir listas de reprodução sem um carregador e corrigir falhas relacionadas com este problema #2724, TeamNewPipe/NewPipeExtractor#219\n- 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\n- [SoundCloud] Equipa fixa de extracção client_idNewPipe/NewPipeExtractor#217\n- Fixar a extracção do fluxo de áudio\n\nDesenvolvimento\n- Atualizar ExoPlayer para 2.10.8 #2791, #2816\n- Atualizar o Gradle para 3.5.1 e adicionar o suporte Kotlin #2714\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/810.txt",
    "content": "Novo\n- Mostrar a miniatura do vídeo no ecrã de bloqueio ao tocar em fundo\n\nMelhorado\n- Adicionar lista de reprodução local à fila de espera ao premir durante muito tempo no botão de fundo / popup\n- Faça com que os separadores da página principal possam ser deslocados e escondidos quando só existe um único separador\n- Quantidade limite de actualizações de miniaturas de notificação no leitor de fundo\n- Adicionar miniatura de miniatura para listas de reprodução locais vazias\n- 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\n- Adicionar botão para apagar ficheiros descarregados ou histórico de descarregamentos em \"Downloads\n- [YouTube] Adicionar suporte a /c/shortened_url channel links\n\nFixa\n- Corrigido múltiplos problemas ao partilhar um vídeo para NewPipe e descarregar diretamente os seus fluxos\n- Acesso fixo do jogador fora do seu fio de criação\n- Paginação fixa de resultados de pesquisa\n- Ligar nulo fixo causando NPE\n- [YouTube] Comentários de visualização fixos ao abrir uma url invidio.us\n- ClientCloud] Client_id actualizado\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/820.txt",
    "content": "Nome da função descodificar regex corrigido, que tornava o YouTube inutilizável.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/830.txt",
    "content": "Atualização do client_id SoundCloud para corrigir problemas do SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/840.txt",
    "content": "Novo\n- Adicionado o seletor de língua para alterar a língua da aplicação\n- Adicionado enviar para o botão Kodi ao menu desmontável do leitor\n- Capacidade adicional de copiar comentários sobre imprensa longa\n\nMelhorado\n- Fixar a actividade ReCaptcha e guardar corretamente os cookies obtidos\n- 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\n- Pedir permissão de visualização sobre outras aplicações em definições corretamente no Android 6 e posteriores\n- Renomear playlist local através de um clique longo em BookmarkFragment\n- Vários melhoramentos do PeerTube\n- Melhorou várias cadeias de caracteres em inglês\n\nFixa\n- Jogador fixo a recomeçar, embora seja pausado quando a opção \"minimizar no comutador da aplicação\" é ativada e o NewPipe é minimizado\n- Fixar o valor de brilho inicial para o gesto\n- Downloads de subtítulos .srt fixos contendo nem todas as quebras de linha\n- Corrigido o download para cartão SD falhando porque alguns dispositivos Android 5 não são compatíveis com CTF\n- Descarregamento fixo no Android KitKat\n- Ficheiro fixo de vídeo corrupto .mp4 sendo reconhecido como ficheiro de áudio\n- Resolvidos problemas de localização múltipla, incluindo códigos de língua chinesa errados\n- Os carimbos temporais em descrição podem ser clicados novamente\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/850.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/860.txt",
    "content": "Melhorado\n- Gravar e restaurar se o tom e o tempo estão desengatados ou não\n- Recorte de exibição de suporte no jogador\n- Vista redonda e contagem de subscritores\n- YouTube otimizado para usar menos dados\n\nMais de 15 bugs relacionados ao YouTube foram corrigidos nesta versão.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/870.txt",
    "content": "Esta é uma versão hotfix que atualiza o NewPipe a permitir a utilização do SoundCloud sem grandes incómodos novamente.\nA API v2 do SoundCloud é agora utilizada no extrator e a deteção de IDs de clientes inválidos foi melhorada.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/900.txt",
    "content": "Novo\n- Grupos de assinaturas e feeds ordenados\n- Botão de mudo nos reprodutores\n\nMelhorado\n- Permitir a abertura de ligações music.youtube.com e media.ccc.de em NewPipe\n- Mudar duas configurações do Appearance para o Content\n- Esconder 5, 15, 25 segundos de opções de busca se a busca inexata estiver ativada\n\nFixo\n- alguns vídeos do WebM não são procurados\n- backup do banco de dados no Android P\n- falhar ao compartilhar um ficheiro descarregado\n- muitos problemas de extração no YouTube e mais ...\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/910.txt",
    "content": "Migração da base de dados corrigida que impediu que NewPipe iniciasse em alguns casos raros.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/920.txt",
    "content": "Melhorado\n\n- Data de carregamento e contagem de visualização dos itens da grelha de fluxo adicionada\n- Melhorias para o layout do cabeçalho da gaveta\n\nCorreções\n\n- O botão de silenciamento causando falhas na API 19 corrigido\n- Descarregar de vídeos longos 1080p 60fps corrigido\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/930.txt",
    "content": "Novo\n- Pesquisa no YouTube Música\n- Suporte básico de TV Android\n\nMelhorado\n- Adicionada a capacidade de remover todos os vídeos vistos de uma lista de reprodução local\n- Mostrar mensagem quando o conteúdo ainda não é suportado, em vez de se chocar\n- Reprodutor popup melhorado redimensionado com gestos de beliscão\n- Enqueue streams em fundo e botões de popup no canal\n- Melhor manuseamento do tamanho do título do cabeçalho da gaveta\n\nFixa\n- Definição de conteúdo com restrição de idade fixa não funciona\n- Fixação de certos tipos de reCAPTCHAs\n- Corrigido o crash ao abrir marcadores enquanto a lista de reprodução é \"nula\".\n- Deteção fixa de exceções relacionadas com a rede\n- Visibilidade fixa do botão de ordenação do grupo no fragmento de subscrições\n\ne mais\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/940.txt",
    "content": "Novo\n• Suporte para comentários SoundCloud\n• Modo restrito - YouTub\n• Mostrar detalhes do canal interligado - PeerTube\n\nMelhorado\n• Mostar botão Kore apenas nos serviços suportados\n• Bloquear gestos que começam nas barras de navegção ou estado\n• Cor de fundo dos botões Tentar e Subscrever baseada na cor do serviço\n\nCorrigido\n• Bloqueio da evolução de transferência\n• Botão abrir browser\n• Erro ao abri videos \"não é possível reproduzir...\"\n\ne outros\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/950.txt",
    "content": "Este lançamento traz três pequenas correções:\n- Acesso de armazenamento no Android 10+ corrigido\n- Quiosques de abertura corrigido\n- Análise de duração vídeos longos corrigido\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/951.txt",
    "content": "Novo\n• Pesquisa de selecionador de assinaturas\n• Filtro ao diálogo do grupo de feed\n• Ficha de lista de reprodução à página principal\n• Avanço/retrocesso rápido na fila de fundo/pop-up de jogadores\n• Mostrar sugestão de pesquisa: quis dizer & a mostrar resultado para\n\nMelhorado\n• Não escrever metadados de apps em ficheiros muxed\n• Não remover fluxos falhados da fila\n• A cor da barra de estado corresponde à da de ferramentas\n\nFixo\n• Desync de áudio/vídeo\n• [PeerTube] Gerir comentários apagados\n\n...\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/952.txt",
    "content": "Melhorado\n• A reprodução automática está disponível para todos os serviços (em vez de apenas para o YouTube)\n\nCorrigido\n• Transmissões relacionadas, permintindo novas continuações do YouTube\n• Restrições etárias em videos do YouTube\n• [Android TV] Foco e sobreposição de destaque prolongado corrigidos\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/953.txt",
    "content": "Correção da extração da função de desencriptação do YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/954.txt",
    "content": "• novo fluxo de trabalho da app: reproduz vídeos na página de detalhes, deslizar p/ baixo p/ minimizar o reprodutor \n• notificações MediaStyle: c/ ações personalizáveis, melhorias de desempenho \n• redimensionamento básico ao usar NewPipe como app desktop\n\n• mostrar diálogo com opções de carregamento em caso de URL não suportado \n• sugestão de pesquisa melhorada\n• qualidade predefinida aumentada a 720p60 (reprodutor da app) e 480p (pop-up)\n\n• correção de bugs\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/955.txt",
    "content": "[YouTube] Pesquisa corrigida para alguns utilizadores\n[YouTube] Corrigidas exceções de desencriptação aleatórias\n[SounCloud] URLs que terminam com uma barra são agora analisados corretamente\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/956.txt",
    "content": "[YouTube] Corrigida falha ao carregar qualquer vídeo\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/957.txt",
    "content": "Unir ações específicas de enfileiramento\nGesto 2 dedos p/ fechar APP\nPermitir limpeza de cookies reCAPTCHA\nOpção não colorir notific.\nMelhorar forma como os detalhes do vídeo são abertos p/ corrigir buffering infinito, comportamento errático ao compartilhar com NewPipe, etc\nAcelerar vídeos do YouTube e corrijir restrições etárias\nCorrigir falha no avanço/recuo rápido\nNão reorganizar listas ao arrastar miniaturas\nLembrar sempre as propriedades pop-up\nAdicionar idioma Santali\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/958.txt",
    "content": "Novo e melhorado:\n- Opção reajustada para esconder a miniatura no ecrã de bloqueio\n- Puxar para atualizar o feed\n- Melhor desempenho na busca de listas locais\n\nCorrigido:\n- Falha ao iniciar o NewPipe após ter sido removido da RAM\n- Falha na inicialização quando não há conexão à Internet\n- Respeitando as configurações de luminosidade e de volume\n- Listas de reprodução longas\n\nOutros:\n- Limpeza de códigos e várias melhorias internas\n- Atualizações de dependências\n- Atualizações de tradução\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/959.txt",
    "content": "Corrigido o ciclo infinito de falhas após a abertura do repórter de erros.\nAtualizada a lista de instâncias PeerTube que podem ser abertas automaticamente pelo NewPipe.\nTraduções atualizadas.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/960.txt",
    "content": "• Melhorada a descrição da opção de exportação da base de dados nas definições.\n• Correções ao processamento de comentários no YouTube.\n• Corrigido o nome de exibição para o serviço media.ccc.de.\n• Traduções atualizadas.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/961.txt",
    "content": "- Apoio à mistura\n- [YouTube] Mostrar informação sobre emissoras públicas e Covid-19\n- [media.ccc.de] Adicionados vídeos recentes\n- Acrescentada tradução somaliana\n\n- Muitas melhorias internas\n\n- Vídeos fixos de partilha de dentro do leitor\n- Vista Web ReCaptcha em branco fixa\n- Reparação de um acidente que ocorreu ao remover um fluxo de uma lista\n- Fluxos relacionados fixos\n- [YouTube] Pesquisa fixa de música no YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/962.txt",
    "content": "Adicionados vídeos \"recentes\" ao serviço media.ccc.de.\nAdicionados streams ao vivo ao serviço media.ccc.de e também suporte a streams ao vivo.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/963.txt",
    "content": "• [YouTube] Corrigido continuação do canal\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/964.txt",
    "content": "- Apoio adicional para capítulos nos controlos de jogadores\n- Adicionada a pesquisa Sepia\n- Botão de partilha reajustado na visualização detalhada do vídeo e moveu a descrição do fluxo para o layout do separador\n- Desativar o restabelecimento do brilho se o gesto de brilho for desativado\n- Adicionado item da lista para reproduzir vídeo no kodi\n- Corrigida a falha quando não está definido um navegador padrão em alguns dispositivos e melhorados os diálogos de partilha\n- Alternar jogo/pausa com botão de espaço de hardware no leitor de ecrã inteiro\n- [media.ccc.de] Várias correções e melhorias\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/965.txt",
    "content": "Corrigido o crash que ocorria ao reordenar grupos de canais.\nCorrigida a obtenção de mais vídeos do YouTube a partir de canais e listas de reprodução.\nCorrigida a obtenção de comentários do YouTube.\nAdicionado suporte a /watch/, /v/ e /w/ subpaths nas URLs do YouTube.\nCorrigida a extração de id de cliente SoundCloud e conteúdo geo-restrito.\nAdicionada a localização Curda do Norte.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/966.txt",
    "content": "Novo:\n- Acrescentar um novo serviço: Bandcamp\n\nMelhorado:\n- Adicionar uma opção para que a aplicação siga o tema do dispositivo\n- Prevenir alguns acidentes mostrando um painel de erro melhorado\n- Mostrar mais informações sobre o porquê do conteúdo na indisponibilidade\n- O botão de espaço de hardware ativa o jogo/pausa\n- Mostrar \"Download iniciado\" brinde\n\nFixo:\n- Fixar miniaturas muito pequenas em detalhes de vídeo enquanto se reproduz em fundo\n- Corrigir título vazio em jogador minimizado\n- O último modo de reparação do tamanho não está a ser restaurado corretamente\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/967.txt",
    "content": "Corrigido o YouTube não funcionar corretamente na UE. Foi causado por um novo cookie e sistema de consentimento de privacidade que requer que a NewPipe configure um cookie CONSENT.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/968.txt",
    "content": "Adicionada a opção de detalhes do canal ao menu de pressão prolongada.\nAdicionada funcionalidade para renomear o nome da lista de reprodução da interface da lista de reprodução.\nPermitir que o utilizador faça uma pausa enquanto um vídeo está a ser gravado no buffer.\nPolido o tema branco.\nCorrigida a sobreposição de fontes quando se utiliza uma fonte de tamanho maior.\nCorrigido nenhum vídeo em dispositivos Formuler e Zephier.\nCorrigidas várias falhas.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/969.txt",
    "content": "* Permitir a instalação no armazenamento externo\n* [Bandcamp] Adicionado suporte para exibir os três primeiros comentários em um fluxo\n* Mostrar apenas o brinde 'o download começou' quando o download é iniciado\n• Não defina o cookie reCaptcha quando não existir nenhum cookie armazenado\n* [Jogador] melhorar o desempenho do cache\n* [Jogador] jogador fixo que não joga automaticamente\n* Dispensar Snackbars anteriores ao excluir downloads\n* Corrigido tentando excluir objeto não na lista\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/970.txt",
    "content": "Novo\n- Mostrar metadados de conteúdo (marcações, categorias, licença, ...) abaixo da descrição\n- Adicionado \"Mostrar detalhes do canal\" opção em listas de reprodução remotas (não locais)\n- Adicionado \"Abrir no browser\" opção para o menu de pressão longa\n\nFixo\n- Fixação da falha de rotação na página de detalhes do vídeo\n- Fixo botão \"Reproduzir com Kodi\" no reprodutor sempre pede instalar Kore\n- Caminhos de importação e exportação fixos e melhorados\n- [YouTube] Fixo comentário e contagem\n...\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/971.txt",
    "content": "Hotfix\n- Aumentar o buffer para reprodução após o rebuffer\n- Corrigida a falha em tablets e TVs ao clicar no ícone da fila de reprodução no reprodutor\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/972.txt",
    "content": "Novo\nReconhecer os timestamps e hashtags na descrição\nAcrescentada a definição do modo tablet manual\nCapacidade adicional de esconder itens jogados numa ração\n\nMelhorado\nApoiar adequadamente o Quadro de Acesso ao Armazenamento\nMelhor tratamento de erros de canais indisponíveis e terminados\nA folha de partilha do Android para utilizadores do Android 10+ mostra agora o título do conteúdo.\nAtualização de instâncias Invidious e suporte de links Piped.\n\nCorrigido\n[YouTube] Conteúdo restrito à idade\nPrevenir fugas na janela Exceção ao abrir o diálogo de escolha\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/973.txt",
    "content": "Correções\n• Corrigidas as miniaturas e títulos sendo cortados no layout de grelha, devido a um cálculo incorreto de quantos vídeos cabem numa linha\n• Corrigida a caixa de diálogo de descarregamento que desaparece sem fazer nada se for aberta a partir do menu de partilha\n• Atualizada a biblioteca relacionada à abertura de atividades externas, como o seletor de ficheiros do Storage Access Framework\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/974.txt",
    "content": "Correções\n• Corrigidos os problemas de buffer causados pela limitação do YouTube\n• Corrigida a extração de comentários do YouTube e falhas com comentários desativados\n• Corrigida a pesquisa de música no YouTube\n• Corrigidas as transmissões ao vivo do PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/975.txt",
    "content": "Novo\n• Mostrar uma visualização em miniatura enquanto busca\n• Detetar comentários desativados\n• Permitir a marcação de um item de feed como assistido\n• Mostrar corações nos comentários\n\nMelhorias\n• Layout de metadados e etiquetas\n\nFixo\n• Corrigir miniatura no miniplayer\n• Corrigir buffer sem fim em itens de fila duplicados\n• Corrigir ReCAPTCHA que permanece carregado em segundo plano\n• Desativados os cliques enquanto atualiza o feed\n• Corrigir algumas falhas do descarregador\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/976.txt",
    "content": "• +opção para abrir o reprodutor em ecrã cheio\n• Pode escolher as sugestões de pesquisa a mostrar\n• Tema escuro + escuro e novo ecrã inicial escuro\n• Seletor de ficheiros: ficheiros indesejados acinzentados\n• Importação de subscrições do YouTube corrigida\n• A repetição de uma transmissão requer um toque no botão de repetição\n• Fecho da sessão de áudio corrigido\n• [Android TV] Correção de longos saltos da barra de pesquisa ao usar um DPad\n\nVer também o registo de alterações e o blogue abaixo.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/977.txt",
    "content": "• Adicionado botão \"reproduzir seguinte\" ao menu de toque longo\n• Adicionado prefixo do caminho curto do YouTube ao filtro\n• Importação de configurações corrigida\n• Trocada a posição da barra de pesquisa com os botões do reprodutor no ecrã da fila\n• Várias correções de MediasessionManager\n• Barra de pesquisa corrigida após o final do vídeo\n• Tunelamento de mídia desativado no RealtekATV\n• Expandida a área clicável dos botões minimizados\n\nVer também o registo de alterações e o blogue abaixo.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/978.txt",
    "content": "Corrigida a verificação se existe uma nova versão do NewPipe. Esta verificação era muitas vezes executada demasiado cedo, o que levava a uma falha da aplicação. Agora isto deve estar corrigido.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/979.txt",
    "content": "- Problema ao retomar a reprodução corrigido\n- Melhorias para garantir que o serviço que determina se o NewPipe deve verificar se existe uma nova versão não seja iniciado em segundo plano\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/980.txt",
    "content": "Novo\n- Adicionado \"Adicionar à lista de reprodução\" opção para o menu compartilhar\n- Adicionado suporte para ligações curtos y2u.be e PeerTube\n\nMelhorado\n- Controles de Velocidade de Reprodução mais compactos\n- Feed destaca novos itens agora\n- A opção \"Mostrar itens observados\" no feed está agora gravada\n\nFixo\n- Fixo a extração de likes e dislikes da YouTube\n- Repetição automática fixa após retornar do fundo\n...\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/981.txt",
    "content": "Removido o suporte ao MediaParser para corrigir falha de reprodução após buffer no Android 11+.\nTunelamento de mídia desativado no Philips QM16XE para corrigir problemas de reprodução.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/982.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/983.txt",
    "content": "Acrescentar nova IU e comportamento de dupla tatuagem\nTornar as definições pesquisáveis\nDestaque para os comentários em destaque como tal\nAdicionar suporte open-with-app para a instância PeerTube da FSFE\nAdicionar notificações de erro\nRepor a repetição do item da primeira fila na mudança de jogador\nEsperar mais tempo ao buffering durante os livestreams antes de falhar\nOrdem fixa dos resultados da pesquisa local\nCorrigir campos de itens vazios na fila de jogo\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/984.txt",
    "content": "Carregamento de itens iniciais suficientes em listas para preencher o ecrã inteiro e corrigir a rolagem em tablets e TVs\nCorreção de falhas aleatórias ao percorrer listas\nProcura rápida no reprodutor do arco overlay passando pela UI do sistema\nReversão das mudanças para recortes ao jogar em várias janelas, causando a regressão do jogador deslocado em alguns telefones\nAumento do compileSdk de 30 para 31\nAtualização da biblioteca de relatórios de erros\nRefatoração de algum código no reprodutor\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/985.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/986.txt",
    "content": "Novo\n- Notificações para novas correntes\n- Transição sem falhas entre o fundo e os leitores de vídeo\n- Alterar o passo por semitons\n- Anexar a fila principal de jogadores a uma lista de reprodução\n\nMelhorado\n- Lembre-se da velocidade/tamanho do passo\n- Mitigar o longo amortecimento inicial no leitor de vídeo\n- Melhorar a interface do leitor para a TV Android\n- Confirmar antes de apagar todos os ficheiros descarregados\n\nFixa\n- Botão de fixação do media não esconde os controlos do leitor\n- Reposição da reprodução corrigida na mudança de tipo de leitor\n- Fixar a rotação do diálogo da lista de reprodução\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/987.txt",
    "content": "Novo\n- 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\n- Adicionar botão para adicionar uma lista de reprodução remota a uma lista local\n- Pré-visualização de imagem na folha de partilha Android 10+\n\nMelhorado\n- Melhorar o diálogo dos parâmetros de reprodução\n- Mover botões de importação/exportação de subscrição para o menu de três pontos\n\nFixa\n- Correção da remoção de vídeos totalmente vistos da lista de reprodução\n- Corrigir o tema do menu de partilha e a entrada \"adicionar à lista de reprodução\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/988.txt",
    "content": "[YouTube] Correção do erro \"Não foi possível obter nenhum stream\" ao tentar reproduzir qualquer vídeo\n[YouTube] Correção \"O seguinte conteúdo não está disponível nesta aplicação\" mensagem mostrada em vez do vídeo solicitado\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/989.txt",
    "content": "- [YouTube] Corrigido o carregamento infinito ao tentar reproduzir qualquer vídeo \n- [YouTube] Corrigido a limitação em alguns vídeos \n- Atualizado a biblioteca do jsoup para 1.15.3, que inclui uma correção de segurança\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/990.txt",
    "content": "Esta versão deixa de suportar o Android 4.4 KitKat, agora a versão mínima é o Android 5 Lollipop!\n\nNovo\n• Descarregar a partir do menu de toque longo\n• Ocultar vídeos futuros no feed\n• Partilhar listas de reprodução locais\n\nMelhorado\n• Refatorizado o código do reprodutor: menos RAM, menos erros\n• Melhorada a escala de miniaturas\n\nCorrigido\n• Vários problemas com a notificação do reprodutor: informações de média desatualizadas/ausentes, miniatura distorcida\n• Ecrã cheio usando 1/4 do ecrã\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/991.txt",
    "content": "Novo\n•Botão \"Abrir no navegador\" no painel de erros\n•Opção para mostrar grupos de canais como lista\n•[YouTube] Clique longo nos segmentos de transmissão para partilhar o URL com a data/hora\n•Botão de fila de reprodução no mini reprodutor\n\nMelhorado\n•Nova localização em islandês e outras traduções atualizadas\n•Muitas melhorias internas\n\nCorrigido\n•Várias falhas\n•[YouTube] Correção no carregamento de canais, feeds não dedicados e solução alternativa de problemas de reprodução em alguns países\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/992.txt",
    "content": "Novo\n- Contagem de subscritores em detalhes de vídeo\n- Descarregar da fila\n- Uma miniatura permanente de listas de reprodução\n- Hashtags e ligações de imprensa longa\n- Modo de visualização de cartões\n\nMelhorado\n- Botão de fecho de mini-reprodutor maior\n- Redução mais suave das miniaturas\n- Alvo Android 13 (API 33)\n- Procurar não pausa o reprodutor\n\nFixa\n- Corrigido sobreposições no DeX/rato\n- Permitir um leitor de fundo sem fluxo de áudio separados\n- Várias correções do YouTube…\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/993.txt",
    "content": "Novo\n- Adicionar aviso ao adicionar duplicados da lista de reprodução e adicionar botão para os remover\n- Permitir ignorar os botões de hardware\n- Permitir a ocultação de vídeos parcialmente vistos na alimentação\n\nMelhorado\n- Utilizar mais colunas de grelha em ecrãs grandes\n- Tornar os indicadores de progresso consistentes com as definições\n\nFixa\n- Corrigir URLs de abertura do navegador, downloads e leitores externos no Android 11+\n- Fixação interagindo com tela cheia requer duas torneiras no MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/994.txt",
    "content": "Novo\n- Suporte para várias faixas de áudio/idiomas\n- Permitir definir gestos de volume e brilho em qualquer lado do ecrã\n- Suporte para a apresentação dos separadores principais na parte inferior do ecrã\n\nMelhorado\n- Bandcamp] Lidar com faixas atrás do muro de pagamento\n\nCorrigido\n- YouTube] Erros HTTP 403 para streams\n- Leitor preto ao mudar para o leitor principal a partir da vista de lista de reprodução\n- Fuga de memória do serviço do leitor\n- PeerTube] Os avatares do carregador e do sub-canal foram trocados\n\ne mais\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/995.txt",
    "content": "Novo\n- Separadores de canais de suporte\n- Selecionar a qualidade da imagem\n- Obter URLs para todas as imagens\n\nMelhorado\n- Acessibilidade das interfaces do leitor\n- Melhor seleção de áudio para transferências apenas de vídeo\n- Opção para incluir nomes de listas de reprodução e de vídeos no conteúdo de listas de reprodução partilhadas\n\nCorrigido\n- YouTube] Correção da contagem de gostos\n- Correção de popups e falhas do leitor que não responde\n- Seleção de idiomas errados no seletor de idiomas\n- A focagem do áudio do leitor não respeitava o silêncio\n- A adição de itens à lista de reprodução não funcionava ocasionalmente.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/996.txt",
    "content": "Um NullPointerException foi corrigido ao abrir um canal / conferência em media.ccc.de.\nO Grinch tentou estragar o nosso presente de Natal para si, mas corrigimo-lo.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/997.txt",
    "content": "Novo\n• Adicionar respostas de comentários\n• Permitir reordenar listas de reprodução\n...\n\nMelhorado\n• [Android 13+] Restaurar ações de notificação personalizadas\n• Solicitar consentimento para verificação de atualização\n• Permitir reprodução/pausa de notificação durante o buffer\n...\n\nFixado\n• [Tube] Corrigir comentários que não carregam, além de outras correções e melhorias\n• Resolver vulnerabilidade nas configurações importação e mudar para JSON\n• Várias correções de descargas\n...\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/998.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/changelogs/999.txt",
    "content": "Corrigido YouTube não reproduzir nenhuma transmissão\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/full_description.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/pt-PT/short_description.txt",
    "content": "Um reprodutor Youtube para Android.\n"
  },
  {
    "path": "fastlane/metadata/android/ro/changelogs/63.txt",
    "content": "### Îmbunătățiri\n- Setări de import/export #1333 \n- Reducerea supradimensionării (îmbunătățirea performanței) #1371 \n- Mici îmbunătățiri de cod #1375 \n- Adăugați totul despre GDPR #1420\n\n### Sistemat\n- Downloader: Sistemat crash-ul la încărcarea descărcărilor neterminate din fișiere .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/ro/changelogs/64.txt",
    "content": "### Îmbunătățiri\n- A fost adăugată posibilitatea de a limita calitatea video în cazul în care se utilizează date mobile. #1339\n- Memorizare luminozitate pentru sesiune #1442\n- Îmbunătățirea performanțelor de descărcare pentru procesoarele mai slabe #1431\n- Adăugare suport (în lucru) pentru sesiunea media #1433\n\n### Fix\n- Corectarea blocării la deschiderea descărcărilor (corecția este acum disponibilă pentru versiunile de lansare) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/ro/changelogs/770.txt",
    "content": "Modificări în 0.17.2\n\nCorectări\n- Corectată problema cu nici un video nu e disponibil\n"
  },
  {
    "path": "fastlane/metadata/android/ro/changelogs/953.txt",
    "content": "Repară extracția funcției de decriptare a YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/ro/full_description.txt",
    "content": "NewPipe nu utilizează nicio librărie framework Google sau API-ul YouTube. Acesta doar analizează site-ul web pentru a obține informațiile de care are nevoie. Ca atare, această aplicație poate fi utilizată pe dispozitive care nu au instalate serviciile Google. De asemenea, nu aveți nevoie de un cont YouTube pentru a utiliza NewPipe și este FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/ro/short_description.txt",
    "content": "O interfață YouTube lejeră și gratuită pentru Android.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/1000.txt",
    "content": "Улучшения\n• Сделать описание плейлиста кликабельным, чтобы показать больше/меньше контента.\n• [PeerTube] Автоматически обрабатывать ссылки экземпляра `subscribeto.me`.\n• Начинать воспроизведение только одного элемента на экране истории.\n\nИсправления\n• Исправить видимость кнопки RSS.\n• Исправить сбои при предварительном просмотре полосы прокрутки.\n• Исправить добавление в плейлист элемента без миниатюры.\n• Исправить выход из диалогового окна загрузки до его появления.\n• Исправить всплывающее окно с списком связанных элементов.\n• Исправлена последовательность в диалоговом окне добавления в плейлист.\n• Настроена компоновка элементов закладок плейлиста\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/1001.txt",
    "content": "Улучшенный\n• Всегда можно изменить настройки уведомлений игрока на Android 13+\n\nИсправлено\n• Исправление экспорта базы данных/подписок, который не обрезал уже существующий файл, что могло привести к повреждению экспорта\n• Исправлено возобновление работы плеера с самого начала при нажатии на временную метку\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/1002.txt",
    "content": "Исправлена ошибка, из-за которой YouTube не воспроизводил ни одного потока.\n\nВ этом выпуске исправлена только самая серьёзная ошибка, препятствующая загрузке информации о видео YouTube.\nМы знаем о существовании других проблем и вскоре выпустим отдельный выпуск для их решения.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/1003.txt",
    "content": "Это релиз исправления, исправляющий ошибки YouTube:\n• [YouTube] Исправлена проблема с загрузкой видеоинформации, исправлены ошибки HTTP 403 при воспроизведении видео и восстановлено воспроизведение некоторых видео с возрастными ограничениями\n• Исправлена проблема с отсутствием изменения размера субтитров\n• Исправлена проблема с двойной загрузкой информации при открытии трансляции\n• [Soundcloud] Удалены невоспроизводимые трансляции с защитой DRM\n• Обновлены переводы\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/1004.txt",
    "content": "В этом выпуске YouTube теперь поддерживает только трансляцию в формате 360p.\n\nОбратите внимание, что решение, используемое в этой версии, вероятно, временное, и в долгосрочной перспективе потребуется внедрение видеопротокола SABR. Участники TeamNewPipe сейчас заняты, поэтому любая помощь будет высоко оценена! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/1005.txt",
    "content": "Новое\n• Поддержка Android Auto\n• Использование групп лент как вкладок главного экрана\n• [YouTube] Возможность поделиться временным плейлистом\n• [SoundCloud] Вкладка канала \"Лайки\"\n\nУлучшено\n• Поисковые подсказки\n• Показ даты загрузки в Загрузках\n• Установка языка для каждого приложения\n\nИсправлено\n• Цвета текста в тёмном режиме\n• [YouTube] Плейлисты не загружали более чем 100 элементов\n• [YouTube] Отсутствующие рекомендованные видео\n• Вылеты в Истории\n• Временные метки в ответах на комментарии\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/1007.txt",
    "content": "Исправлено: YouTube не воспроизводил никакие потоки\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/63.txt",
    "content": "### Улучшения\n- Импорт/экспорт настроек #1333\n- Уменьшено количество перерисовки (повышена производительность) #1371\n- Небольшие улучшения кода #1375\n- Добавлено всё о GDPR #1420\n\n### Исправления\n- Загрузчик: Исправлен вылет при продолжении незавершённых загрузок с форматом .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/64.txt",
    "content": "### Улучшения\n- Добавлена возможность ограничения качества видео при использовании мобильного интернета #1339\n- Теперь яркость запоминается на время сессии #1442\n- Улучшена производительность загрузки для более слабых процессоров #1431\n- Добавлена (работающая) поддержка для медиа-сессии #1433\n\n### Исправления\n- Исправлен вылет при открытии Загрузок (доступно в релизных сборках) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/65.txt",
    "content": "### Улучшения\n\n- Отключить анимацию значка меню бургера #1486. \n- отменить удаление загрузок #1472 \n- Опция загрузки в меню «Поделиться» № 1498.\n- В меню длительного нажатия #1454 добавлена опция «Поделиться». \n- Свернуть основного игрока на выходе #1354. \n- Обновление версии библиотеки и исправление резервного копирования базы данных № 1510. \n- ExoPlayer 2.8.2, обновление № 1392.\n  — Переработано диалоговое окно управления скоростью воспроизведения, чтобы поддерживать различные размеры шага для более быстрого изменения скорости.\n  - Добавлен переключатель для быстрой перемотки вперед во время паузы в управлении скоростью воспроизведения. Это должно быть полезно для аудиокниг и определенных музыкальных жанров, а также может обеспечить по-настоящему плавное воспроизведение (и может испортить песню с большим количеством пауз =\\\\).  \n  — Изменено разрешение медиа-источника, чтобы можно было передавать метаданные вместе с медиа-файлами внутри плеера, а не делать это вручную. Теперь у нас есть единый источник метаданных, который доступен напрямую при запуске воспроизведения.\n  - Исправлены метаданные удаленного плейлиста, которые не обновлялись, когда новые метаданные доступны при открытии фрагмента плейлиста.\n  - Различные исправления пользовательского интерфейса: № 1383, элементы управления фоновыми уведомлениями проигрывателя теперь всегда белые, всплывающее окно проигрывателя легче выключить с помощью броска.\n- Используйте новый экстрактор с переработанной архитектурой для мультисервиса.\n\n### Исправления\n\n- Исправление № 1440: неправильный макет информации о видео № 1491. \n- Просмотр истории, исправление № 1497.\n  - #1495, обновляя метаданные (миниатюру, заголовок и количество видео), как только пользователь получает доступ к списку воспроизведения. \n  - #1475, путем регистрации просмотра в базе данных при запуске пользователем видео на внешнем проигрывателе по фрагменту детали.\n- Исправлен тайм-аут экрана в случае всплывающего режима. # 1463 (Исправлено # 640)\n- Исправление основного видеоплеера № 1509. \n  - [#1412] Исправлен режим повторения, вызывающий NPE игрока при получении нового намерения, когда активность игрока находится в фоновом режиме.\n  - Исправлено сворачивание игрока во всплывающее окно, которое не уничтожало игрока, если разрешение на всплывающее окно не предоставлено.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/66.txt",
    "content": "# Список изменений версии 0.13.7\n\n### Исправлено\n- Исправлены проблемы с фильтром сортировки версии 0.13.6\n\n# Список изменений версии 0.13.6\n\n### Улучшения\n\n- Отключение анимации значка burgermenu #1486\n- Отменение удаления загрузок #1472\n- Опция загрузки в меню общего доступа #1498\n- Добавлена опция \"Поделиться\" в меню с длинным нажатием #1454\n- Минимизировать главного игрока на выходе #1354\n- Обновление версии библиотеки и исправление резервного копирования базы данных #1510\n- Обновление ExoPlayer до 2.8.2 #1392\n- Переработан диалог управления скоростью воспроизведения для поддержки различных размеров шага для более быстрого изменения скорости.\n- Добавлен переключатель для быстрой перемотки вперед во время пауз в управлении скоростью воспроизведения. Это должно быть полезно для аудиокниг и определенных музыкальных жанров и может принести по-настоящему плавный опыт (и может прервать песню большим количеством пауз =\\\\).\n- Переработано разрешение источника мультимедиа, позволяющее передавать метаданные вместе с мультимедиа внутри проигрывателя, а не делать это вручную. Теперь у нас есть единый источник метаданных, и он доступен непосредственно при запуске воспроизведения.\n- Исправлено, что метаданные удаленного плейлиста не обновлялись, когда новые метаданные были доступны при открытии фрагмента плейлиста.\n- Различные исправления пользовательского интерфейса: # 1383, элементы управления уведомлениями фонового проигрывателя теперь всегда белые, проще отключить всплывающее окно проигрывателя с помощью щелчка\n- Используйте новый экстрактор с переработанной архитектурой для мультисервиса\n\n### Исправления\n\n- Исправлено #1440 неработающий макет видеоинформации #1491\n- Исправление истории просмотра #1497\n- # 1495, обновляя метаданные (миниатюру, заголовок и количество видео), как только пользователь получает доступ к списку воспроизведения.\n- #1475, путем регистрации просмотра в базе данных, когда пользователь запускает видео на внешнем проигрывателе на детальном фрагменте.\n- Исправлен тайм-аут creen в случае всплывающего режима. #1463 (исправлено #640)\n- Исправление основного видеоплеера #1509\n- [#1412] Исправлен режим повтора, вызывающий NPE плеера при получении нового намерения, когда активность игрока находится в фоновом режиме.\n- Исправлено сведение проигрывателя к всплывающему окну не приводит к уничтожению проигрывателя, если разрешение на всплывающее окно не предоставлено.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/68.txt",
    "content": "# Изменения в версии 0.14.1\n\n### Исправлено\n- Исправлена ошибка при расшифровке URL-адреса видео #1659\n- Исправлена плохо извлекающаяся ссылка на описание#1657\n\n# Изменения в версии 0.14.0\n\n### Из нового\n- Новый дизайн выпадающего списка #1461\n- Новая настраиваемая главная страница #1461\n\n### Улучшения\n- Переработанное управление жестами #1604\n- Новый способ закрытия всплывающего окна проигрывателя #1597\n\n### Исправления\n- Исправлена ошибка недоступности количества подписок. Закрыто #1649.\n- Показ \"Количество подписчиков недоступно\" в этих случаях\n- Исправлено NPE, при пустом плейлист YouTube\n- Быстрое исправление киосков в SoundCloud\n- Рефакторинг и исправление ошибок #1623\n- Исправлен результат циклического поиска #1562\n- Исправлена панель поиска, не размещенная статически\n- Исправлено, что видео YT Premium блокируется неправильно\n- Исправлено, что видео иногда не загружалось (из-за разбора ТИРЕ)\n- Исправлены ссылки в описании видео\n- Показывать предупреждение, когда кто-то пытается загрузить на внешнюю SD-карту\n- Исправлено ничего непоказывающее сообщение о триггерах исключений\n- Неотображаемая миниатура в фоновом проигрывателе на Android 8.1 [смотрите здесь](https://github.com/TeamNewPipe/NewPipe/issues/943 )\n- Исправлена регистрация широковещательного приемника. Закрыто #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/69.txt",
    "content": "### Из нового\n- Длительное нажатие на удаление и общий доступ в подписках #1516\n- Пользовательский интерфейс планшета и макет списка таблиц #1617\n\n### Улучшения\n- Сохранение и перезагрузка последнего использованного соотношения сторон #1748\n- Включена линейная компоновка в активности загрузки с полными названиями видео #1771\n- Удалять подписки и делиться ими непосредственно с вкладки подписки #1516\n- Постановка в очередь теперь запускает воспроизведение видео, если очередь воспроизведения уже закончилась #1783\n- Отдельные настройки для жестов громкости и яркости #1644\n- Добавлена поддержка локализации #1792\n\n### Исправления\n- Исправлено время разбора для . format, чтобы NewPipe можно было использовать в Финляндии\n- Исправлено количество подписок\n- Добавить разрешение на работу в активном режиме для устройств API 28+ #1830\n\n### Известные ошибки\n- Состояние воспроизведения не может быть сохранено на телефоне Android P\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/70.txt",
    "content": "ВНИМАНИЕ: Эта версия, вероятно, является багфестом, как и предыдущая. Однако из-за полного отключения с 17. сломанная версия лучше, чем без версии. Верно? ¯\\_(ツ)_/¯\n\n### Улучшения\n* Загруженные файлы теперь можно открыть одним щелчком мыши #1879\n* Поддержка drop для Android 4.1 - 4.3 #1884\n* Удалён старый плеер #1884\n* Удаление потоков из текущей очереди воспроизведения, проведя по ним пальцем вправо #1915\n* Удаление потока, автоматически поставленного в очередь, когда новый поток ставится в очередь вручную #1878\n* Постобработка для загрузки и реализации недостающих функций #1759 от @kapodamy\n* Инфраструктура постобработки\n* Правильная обработка ошибок \"инфраструктуры\" (для загрузчика)\n* Очередь вместо нескольких загрузок\n* Переместить сериализованные ожидающие загрузки (файлы `.giga`) в данные приложения\n* Реализовать максимальную повторную попытку загрузки\n* Правильная приостановка многопоточной загрузки\n* Остановка загрузки при подключении к мобильной сети (никогда не работает, см. 2-й пункт)\n* Сохраните количество потоков для следующих загрузок\n* Исправлено множество несогласованностей\n\n### Исправления\n* Исправлена ошибка с разрешением по умолчанию, установленным на лучшее и ограниченное разрешение мобильных данных #1835\n* исправлен сбой всплывающего проигрывателя #1874\n* NPE при попытке открыть фоновый проигрыватель #1901\n* Исправлена ошибка вставки новых потоков при включенной автоматической постановке в очередь #1878\n* Исправлена проблема с отключением decypering shuttown\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/71.txt",
    "content": "### Улучшения\n* Добавлено уведомление об обновлении приложения из сборки на GitHub (# 1608 от @krtkush)\n* Различные улучшения загрузчика (#1944 от @kapodamy):\n* Добавьте недостающие белые значки и используйте hardcore way для изменения цвета значков\n* Проверка инициализации итератора (исправления #2031)\n* Добавлена повторная загрузка для \"ошибки постобработки\" в новом микшере\n* Новый микшер MPEG-4, исправляющий асинхронные видео- и аудиопотоки (#2039)\n\n### Исправления\n* Прямые трансляции YouTube переставали воспроизводиться спустя короткое время (#1996 от @username)\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/730.txt",
    "content": "# Исправлено\n- Повторно исправлено ошибку функции расшифровки.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/740.txt",
    "content": "<h4>Улучшения</h4>\n<ul>\n<li>добавлены интерактивность для ссылок в комментариях, увеличен размер текста</li>\n<li>поиск нажатием по временные отметки в комментариях</li>\n<li>показывать предпочитаемую вкладку, на основании состояния недавно выбраных</li>\n<li>добавить плейлист в очередь при длинном нажатии на &#39;Фон&#39; в окне плейлиста</li>\n<li>поиск по тексту переданному приложению, если это не ссылка</li>\n<li>добавить &quot;поделиться на этом моменте&quot; кнопку в основной видео-проигрыватель</li>\n<li>добавить кнопку закрытия в основной видео-проигрыватель, когда очередь проигрывания закончилась</li>\n<li>добавить &quot;Воспроизвести на фоне&quot; в меню длинного нажатия для предметов из видео-листа</li>\n<li>улучшен английский перевод для команд Воспроизвести/Добавить в очередь</li>\n<li>мелкие улучшения работы приложения</li>\n<li>уюрать неиспользованные файлы</li>\n<li>обновлён ExoPlayer до 2.9.6</li>\n<li>добавить поддержку ссылок Invidious</li>\n</ul>\n<h4>Исправления</h4>\n<ul>\n<li>исправлено пролистывание с выключенными комментариями и похожими трансляциями</li>\n<li>исправлено запуск CheckForNewAppVersionTask когда это не нужно&#39;t</li>\n<li>исправлено импорт подписок с youtube: игнорирование подписок с неправильными ссылками и сохранение тех, у которых пустые названия</li>\n<li>исправить неправильные YouTube - ссылки: название метки подписи не всегда \"signature\", что не даёт загружаться трансляциям</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/750.txt",
    "content": "Из нового\nПродолжить проигрывание #2288\n• Продолжать трансляции с того момента, где вы остановились\nУлучшения загрузчика #2149\n• Использовать Storage Access Framework для хранения загрузок на SD-картах\n• Новый mp4 микшер\n• Выборочно меняйте путь загрузки перед тем, как начать скачивание\n• Учитывать сети с измеряемым трафиком\n\n\nУлучшения\n• Убраны gema строчки #2295\n• Работа с изменениями (авто)поворота во время цикла использования #2444\n• Сделать меню длинного нажатия постоянными #2368\n\nИсправления\n• Исправлено не показывающееся название выбранной дорожки субтитров #2394\n• Не вылетать при провальной проверке обновлений приложения (GitHub версия) #2423\n• Исправлено вечную загрузку при достижении 99.9% #2440\n• Обновление метаданных очереди проигрывания #2453\n• [SoundCloud] Исправлен вылет при загрузке плейлистов TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Исправлена ошибка парсинга времени проигрывания TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/760.txt",
    "content": "Изменения в 0.17.1\n\nИз нового\n• Тайская локализация\n\n\nУлучшения\n• Добавлено действие \"Начать воспроизведение здесь\" в меню с длительным нажатием для списков воспроизведения #2518\n• Добавлен переключатель для SAF / legacy средства выбора файлов #2521\n\nИсправления\n• Исправлено исчезновение кнопок в режиме загрузки при переключении приложений #2487\n• Фиксированная позиция воспроизведения сохраняется, хотя история просмотра отключена\n• Исправлено снижение производительности, вызванное позицией воспроизведения в списках просмотров #2517\n• [Extractor] Исправлено ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186\n• [Extractor] [YouTube] Исправлена случайная ошибка поиска, когда плейлисты отображаются в результатах TeamNewPipe/NewPipeExtractor#185\n\n\n\nИзменения в версии 0.17.0\n\nИз нового\nВозобновление воспроизведения #2288\n• Возобновите потоки с того места, где вы остановились в прошлый раз\nУлучшения загрузчика #2149\n• Используйте платформу доступа к хранилищу для хранения загрузок на внешних SD-картах\n• Новый мультиплексор mp4\n• При необходимости измените каталог загрузки перед началом загрузки\n• Уважайте дозированные сети\n\n\nУлучшения\n• Удалены gema строки #2295\n• Изменение поворота ручки (автоматически) в течение жизненного цикла действия #2444\n• Сделайте меню при длительном нажатии согласованным #2368\n\nИсправления\n• Исправлено, что название выбранного трека субтитров не отображалось #2394\n• Не происходит сбой при сбое проверки обновления приложения (версия GitHub) #2423\n• Исправлено застревание загрузок на уровне 99,9% #2440\n• Обновить метаданные очереди воспроизведения #2453\n• [SoundCloud] Исправлен сбой при загрузке плейлистов TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Фиксированная продолжительность не может быть разделена на TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/770.txt",
    "content": "Изменения в 0.17.2\n\nИсправления\n• Исправлено, что видео не было доступно\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/780.txt",
    "content": "Изменения в 0.17.3\n\nУлучшено\n• Добавлена возможность очистки состояний воспроизведения #2550\n• Показ скрытых каталогов в средстве выбора файлов #2591\n• Поддержка URL-адресов из экземпляров `invidio.us`, открываемых с помощью NewPipe #2488\n• Добавлена поддержка URL-адресов `music.youtube.com` TeamNewPipe/NewPipeExtractor #194\n\nИсправлено\n• [YouTube] Исправлена ошибка java.lang.IllegalArgumentException #192\n• [YouTube] Исправлены неработающие прямые трансляции TeamNewPipe/NewPipeExtractor#195\n• Исправлена проблема с производительностью в Android Pie при загрузке потока #2592\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/790.txt",
    "content": "Улучшения\n• Добавлено больше названий, чтобы улучшить доступность для слепых людей #2655\n• Язык папки загрузки сделан более согласованным и менее двусмысленным #2637\n\nИсправления\n• Проверка загрузки последнего байта в блоке #2646\n• Исправлена прокрутка в детальном фрагменте видео #2672\n• Удалите анимацию двойного поиска в поле очистки до одного #2695\n• [SoundCloud] Исправлено извлечение идентификатора клиента #2745\n\nРазработка\n• Добавлены недостающие зависимости, унаследованные от New Pipe Extractor, в New Pipe #2535\n• Переход на AndroidX #2685\n• Обновление ExoPlayer до 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/800.txt",
    "content": "Из нового\n• Поддержка PeerTube без P2P (#2201) [бета-версия]:\n◦ Смотрите и скачивайте видео с сайтов PeerTube.\n◦ Добавлены экземпляры в настройках, чтобы получить доступ ко всему миру PeerTube\n◦ Могут возникнуть проблемы с SSL-квитированием на Android 4.4 и 7.1 при доступе к определенным экземплярам, что приводит к сетевой ошибке.\n\n• Загрузчик (#2679):\n◦ Рассчитать время загрузки\n◦ Загрузить opus (файлы webm) в формате ogg\n◦ Восстанавливайте ссылки для скачивания с истекшим сроком действия, чтобы возобновить загрузку после длительной паузы\n\nУлучшения\n• Информируйте KioskFragment об изменениях в предпочитаемой стране контента и улучшайте производительность всех основных вкладок #2742\n• Используйте новые реализации локализации и загрузчика из extractor #2713\n• Сделайте строку \"Киоск по умолчанию\" переводимой\n• Черная панель навигации для черной темы #2569\n\nИсправления\n• Исправлена ошибка, из-за которой всплывающий проигрыватель не мог перемещаться, если при перемещении всплывающего проигрывателя был помещен другой палец #2772\n• Разрешить плейлистам отсутствие загрузчика и исправить сбои, связанные с этой проблемой #2724, TeamNewPipe/NewPipeExtractor#219\n• Включение TLS1.1/1.2 на устройствах Android 4.4 (API 19/KitKat) для исправления рукопожатия TLS с MediaCCC и некоторыми экземплярами PeerTube #2792\n• [SoundCloud] Исправлено извлечение идентификатора клиента TeamNewPipe/NewPipeExtractor#217\n• [SoundCloud] Исправлено извлечение аудиопотока\n\nРазработка\n• Обновление ExoPlayer до 2.10.8 #2791, #2816\n• Обновление Gradle до 3.5.1 и добавлена поддержка Kotlin #2714\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/810.txt",
    "content": "Из нового\n• Показывать миниатюру видео на экране блокировки при воспроизведении в фоновом режиме\n\nУлучшения\n• Добавление локального списка воспроизведения в очередь при длительном нажатии на фоновую / всплывающую кнопку\n• Сделайте вкладки главной страницы прокручиваемыми и скрывайте, когда есть только одна вкладка.\n• Ограничить количество обновлений миниатюр уведомлений в фоновом проигрывателе\n• Добавить фиктивный эскиз для пустых локальных списков воспроизведения\n• Используется расширение файла *.opus вместо *.webm и показывает \"opus\" в метке формата вместо \"WebMOpus\" в выпадающем списке загрузки\n• Добавить кнопку для удаления загруженных файлов или истории загрузок в разделе \"Загрузки\"\n• [YouTube] Добавить поддержку ссылок на каналы /c/shortened_url\n\nИсправления\n• Исправлены многочисленные проблемы при совместном использовании видео в New Pipe и прямой загрузке его потоков\n• Исправлен доступ игрока из потока его создания\n• Исправлена подкачка результатов поиска по страницам\n• [YouTube] Исправлено включение null, приводящее к NPE\n• [YouTube] Исправлен просмотр комментариев при открытии invidia.us url-адрес\n• [SoundCloud] Обновлен идентификатор клиента\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/820.txt",
    "content": "Исправлено расшифровку названия функции regex, из-за чего YouTube нельзя было использовать.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/830.txt",
    "content": "Обновлено SoundCloud client_id, чтобы исправить проблемы с SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/840.txt",
    "content": "Из нового\n• Добавлен выбор языка для изменения языка приложения\n• Добавлена кнопка \"Отправить Коди\" в складное меню плеера\n• Добавлена возможность копировать комментарии при длительном нажатии\n\nУлучшения\n• Исправьте активность reCAPTCHA и правильно сохраните полученные файлы cookie\n• Удалено точечное меню в пользу ящика и кнопки скрыть историю, когда просмотр истории не включен в настройках\n• Правильно запрашивайте разрешение на отображение поверх других приложений в настройках на Android 6 и более поздних версиях\n• Переименуйте локальный список воспроизведения, щелкнув длительным щелчком в BookmarkFragment\n• Различные улучшения PeerTube\n• Улучшены несколько исходных строк на английском языке\n\nИсправления\n• Исправлен повторный запуск проигрывателя, хотя он приостановлен, когда включена опция \"свернуть при переключении приложений\" и NewPipe свернут\n• Исправьте начальное значение яркости для жеста\n• Исправлена загрузка субтитров .srt, содержащих не все разрывы строк\n• Исправлена ошибка загрузки на SD-карту из-за того, что некоторые устройства Android 5 не совместимы с CTF\n• Исправлена загрузка на Android KitKat\n• Исправлено, что поврежденный файл video .mp4 распознавался как аудиофайл\n• Исправлены многочисленные проблемы с локализацией, включая неправильные коды китайского языка\n• [YouTube] Временные метки в описании снова доступны для кликабельности\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/850.txt",
    "content": "В этом релизе обновлена версия сайта YouTube. Старая версия сайта больше не будет поддерживаться начиная с Марта, поэтому вам нужно обновить NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/860.txt",
    "content": "Улучшено\n• Сохраняйте и восстанавливайте независимо от того, отключены ли высота тона и темп или нет\n• Поддержка выреза дисплея в плеере\n• Круговой обзор и количество подписчиков\n• Оптимизирован YouTube для использования меньшего количества данных\n\nВ этом выпуске было исправлено более 15 ошибок, связанных с YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/870.txt",
    "content": "Это выпуск исправления, обновляющий New Pipe, чтобы снова использовать SoundCloud без серьезных проблем.\nSoundcloud v2 API теперь используется в экстракторе, и было улучшено обнаружение недопустимых идентификаторов клиентов.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/900.txt",
    "content": "Из нового\n• Группы подписок и отсортированные каналы\n• Кнопка отключения звука в проигрывателях\n\nУлучшения\n• Разрешить открытие music.youtube.com и media.ccc.de соединения в новой трубе\n• Переместите две настройки с внешнего вида на содержимое\n• Скрыть параметры поиска на 5, 15, 25 секунд, если включен неточный поиск\n\nИсправления\n• некоторые видеоролики WebM недоступны для поиска\n• резервное копирование базы данных на телефоне Android\n• сбой при совместном использовании загруженного файла\n• тонны проблем с извлечением с YouTube и многое другое...\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/910.txt",
    "content": "Исправлено перенесение баз данных, что мешало загрузке NewPipe в редких случаях.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/920.txt",
    "content": "Улучшено\n\n• Добавлена дата загрузки и количество просмотров для элементов сетки потока\n• Улучшения в макете заголовка ящика\n\nИсправлено\n\n• Исправлена кнопка отключения звука, вызывающая сбои в API 19\n• Исправлена загрузка длинных видео с разрешением 1080p 60 кадров в секунду\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/930.txt",
    "content": "Из нового\n• Поиск музыки на YouTube\n• Базовая поддержка Android TV\n\nУлучшения\n• Добавлена возможность удалять все просмотренные видео из локального списка воспроизведения\n• Показывать сообщение, когда контент еще не поддерживается, вместо сбоя\n• Улучшено изменение размера всплывающего проигрывателя с помощью пинч-жестов\n• Постановка потоков в очередь при длительном нажатии на фоновые и всплывающие кнопки в канале\n• Улучшена обработка размера заголовка\n\nИсправления\n• Исправлена ошибка, из-за которой не работает настройка контента с ограничением по возрасту\n• Исправлены некоторые виды рекапчи\n• Исправлен сбой при открытии закладок, когда плейлист имеет значение `null`\n• Исправлено обнаружение исключений, связанных с сетью\n• Исправлена видимость кнопки сортировки по группам во фрагменте подписок\n\nи много чего ещё\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/940.txt",
    "content": "Из нового\n• Добавлена поддержка комментариев SoundCloud\n• Добавить настройку ограниченного режима YouTube\n• Показать сведения о родительском канале PeerTube\n\nУлучшения\n• Показывать кнопку Kore только для поддерживаемых сервисов\n• Блокируйте жесты игрока, которые начинаются с панели навигации или строки состояния\n• Измените цвет фона кнопок повтора и подписки на основе цвета сервиса\n\nИсправления\n• Исправлена блокировка диалогового окна загрузки\n• Кнопка Открыть в браузере теперь действительно открывается в браузере\n• Исправлена ошибка при открытии видео и \"Не удалось воспроизвести этот поток\"\n\nи много чего ещё\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/950.txt",
    "content": "В этой версии только три малых исправления:\n• Исправлен доступ к хранилищу на Android 10+\n• Исправлено открытие киоска\n• Исправлено определение длительности для долгих видео\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/951.txt",
    "content": "Из нового\n• Добавить поиск для средства выбора подписки в диалоговом окне группы каналов\n• Добавьте фильтр в диалоговое окно группы каналов, чтобы показывать только негруппированные подписки\n• Добавить вкладку плейлиста на главную страницу\n• Быстрая перемотка вперед / назад в фоновом режиме / очередь всплывающих окон проигрывателя\n• Отобразить предложение по поиску: вы имели в виду и показываете результат для\n\nУлучшения\n• Удалите метаданные приложения для записи в смешанные файлы\n• Не удаляйте сбойные потоки из очереди\n• Обновите цвет строки состояния, чтобы он соответствовал цвету панели инструментов\n\nИсправления\n• Исправлена рассинхронизация аудио / видео, вызванная накопительными ошибками с плавающей запятой\n• [PeerTube] Обрабатывает удаленные комментарии\n\nи много чего ещё\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/952.txt",
    "content": "Улучшения\n• Автовоспроизведение доступно для всех сервисов (а не только для YouTube)\n\nИсправления\n• Исправлено перемещение по трансляции на YouTube\n• Доступны видео YouTube с ограничением по возрасту\n• [Android TV] Исправлен долго не скрывающийся интерфейс\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/953.txt",
    "content": "Починка функции извлечения описания из YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/954.txt",
    "content": "• новый рабочий процесс приложения: воспроизведение видео на странице сведений, проведите пальцем вниз, чтобы свернуть проигрыватель\n• Уведомления в стиле медиастайла: настраиваемые действия в уведомлениях, повышение производительности\n• базовое изменение размера при использовании New Pipe в качестве настольного приложения\n\n• показывать диалоговое окно с открытыми параметрами в случае появления неподдерживаемого URL-адреса\n• Улучшите работу с поисковыми предложениями, когда удаленные предложения не могут быть извлечены\n• Увеличено качество видео по умолчанию до 720p60 (встроенный проигрыватель) и 480p (всплывающий проигрыватель)\n\n• тонны исправлений ошибок и многое другое\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/955.txt",
    "content": "[YouTube] Исправлена функция поиска для некоторых пользователей\n[YouTube] Исправлены случайные исключения дешифровки\n[SoundCloud] URL оканчивающиеся на \"/\" теперь обрабатываются правильно\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/956.txt",
    "content": "[YouTube] Исправлен вылет при загрузке любых видео\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/957.txt",
    "content": "• Объединить конкретные действия по постановке в очередь в одно\n• Жест двумя пальцами для закрытия проигрывателя\n• Разрешить очистку файлов cookie reCAPTCHA\n• Возможность не раскрашивать уведомление\n• Улучшите способ открытия деталей видео, чтобы исправить бесконечную буферизацию, ошибки при совместном использовании с новым каналом и другие несоответствия\n• Ускорьте просмотр видео на YouTube и исправьте возрастные ограничения\n• Исправлен сбой при быстрой перемотке вперед / назад\n• Не переставляйте списки, перетаскивая миниатюры\n• Всегда помните о свойствах всплывающего окна\n• Добавить язык Сантали\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/958.txt",
    "content": "Добавлено и улучшено:\n• Возвращено скрытие миниатюры на экране блокировки\n• Обновление подписок потягиванием вниз\n• Ускорена обработка локальных списков\n\nИсправлено:\n• Исправлен сбой при запуске NewPipe после его удаления из ОЗУ\n• Исправлен сбой при запуске, если нет подключения к Интернету\n• Исправлены настройки жестов яркости и громкости\n• [YouTube] Исправлены большие плейлисты\n\nПрочее:\n• Чистка кода и внутренние улучшения\n• Обновлены зависимые компоненты\n• Обновлены переводы\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/959.txt",
    "content": "Исправлен бесконечный цикл сбоев после открытия отчета об ошибках.\nОбновлен список экземпляров PeerTube, которые могут быть автоматически открыты новым каналом.\nОбновленные переводы.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/960.txt",
    "content": "• Улучшено описание опции экспорта базы данных в настройках.\n• Исправлен синтаксический анализ комментариев на YouTube.\n• Исправлено отображаемое имя media.ccc.de обслуживание.\n• Обновленные переводы.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/961.txt",
    "content": "• [YouTube] Поддержка микширования \n• [YouTube] Отображает информацию об общественных вещателях и Covid-19\n• [media.ccc.de ] Добавлены последние видео\n• Добавлен перевод на сомалийский\n\n• Множество внутренних улучшений\n\n• Исправлен обмен видео из плеера\n• Исправлено пустое веб-представление reCAPTCHA\n• Исправлен сбой, возникавший при удалении потока из списка\n• [PeerTube] Исправлены связанные потоки\n• [YouTube] Исправлен поиск музыки на YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/962.txt",
    "content": "В сервис media.ccc.de добавлены \"недавние\" видео.\nВ сервис media.ccc.de добавлены прямые трансляции, а также поддержка прямых трансляций.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/963.txt",
    "content": "• [YouTube] Исправлено продолжение канала\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/964.txt",
    "content": "• Добавлена поддержка глав в элементах управления плеером\n• [PeerTube] Добавлен поиск в сепии\n• Повторно добавлена кнопка \"Поделиться\" в подробном просмотре видео и перенесено описание потока в макет вкладки\n• Отключите восстановление яркости, если жест яркости отключен\n• Добавлен элемент списка для воспроизведения видео на kodi\n• Исправлен сбой, когда на некоторых устройствах не был установлен браузер по умолчанию, и улучшены диалоги общего доступа\n• Переключение воспроизведения / паузы с помощью аппаратной кнопки пробела в полноэкранном проигрывателе\n• [media.ccc.de] Различные исправления и улучшения\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/965.txt",
    "content": "Исправлен сбой, возникавший при переупорядочивании групп каналов.\nИсправлено получение большего количества видео с YouTube из каналов и плейлистов.\nИсправлено получение комментариев на YouTube.\nДобавлена поддержка подпутей /watch/, /v/ и /w/ в URL-адресах YouTube.\nИсправлено извлечение идентификатора клиента SoundCloud и контента с географическими ограничениями.\nДобавлена локализация на северном курдском языке.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/966.txt",
    "content": "Из нового:\n• Добавить новую услугу: Bandcamp\n\nУлучшения:\n• Добавьте опцию, чтобы приложение соответствовало теме устройства\n• Предотвратите некоторые сбои, показав улучшенную панель ошибок\n• Показать дополнительную информацию о том, почему контент в недоступном\n• Аппаратная кнопка пробела запускает воспроизведение/паузу\n• Показать тост \"Загрузка начата\"\n\nИсправления:\n• Исправлена очень маленькая миниатюра в деталях видео при воспроизведении в фоновом режиме\n• Исправлен пустой заголовок в свернутом проигрывателе\n• Исправлено, что последний режим изменения размера восстанавливался неправильно\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/967.txt",
    "content": "Исправлена ошибка, из-за которой YouTube не работал должным образом в ЕС. Это было вызвано новым файлом cookie и системой согласия на конфиденциальность, которая требует нового канала для установки файла cookie СОГЛАСИЯ.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/968.txt",
    "content": "Добавлена опция сведений о канале в меню при длительном нажатии.\nДобавлена функция переименования названия списка воспроизведения из интерфейса списка воспроизведения.\nРазрешить пользователю делать паузу во время буферизации видео.\nОтполировал белую тему.\nИсправлено наложение шрифтов при использовании большего размера шрифта.\nИсправлено отсутствие видео на устройствах Formuler и Zephier.\nИсправлены различные сбои.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/969.txt",
    "content": "• Разрешить установку на внешнее хранилище\n• [Bandcamp] Добавлена поддержка отображения первых трех комментариев в потоке\n• Показывать тост \"загрузка началась\" только при запуске загрузки\n• Не устанавливайте файл cookie reCAPTCHA, если файл cookie не сохранен\n• [Player] Повысить производительность кэша\n• [Player] Исправлено, что проигрыватель не воспроизводился автоматически\n• Отключите предыдущие панели закусок при удалении загрузок\n• Исправлена попытка удалить объект, которого нет в списке\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/970.txt",
    "content": "Из нового\n• Просмотр метаданных контента (теги, категории, лицензии и т.д.) под описанием.\n• Добавлена опция \"Показать информацию о канале\" в удаленных (не локальных) плейлистах.\n• В меню длительного нажатия добавлена опция \"Открыть в браузере\".\n\nИсправления\n• Исправлен сбой при вращении на странице сведений о видео.\n• Исправлена ошибка, из-за которой кнопка «Играть с Kodi» в плеере всегда предлагала установить Kore.\n• Исправлены и улучшены настройки путей импорта и экспорта\n• [YouTube] Исправлены комментарии и их количество.\nИ много чего ещё\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/971.txt",
    "content": "Исправление\n • Увеличен буфер для воспроизведения после повторной буферизации\n • Исправлен вылет на планшетах и телевизорах при нажатии на иконку play-queue в плеере\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/972.txt",
    "content": "Из нового\nРаспознавание временных меток и хэштегов в описании\nДобавлена ручная настройка режима планшета\nДобавлена возможность скрывать воспроизводимые элементы в ленте\n\nУлучшения\nИсправлена поддержка Storage Access Framework\nУлучшенная обработка ошибок недоступных и прерванных каналов\nНа листе обмена Android для пользователей Android 10+ теперь отображается заголовок контента\nОбновлены экземпляры Invidious и добавлена поддержка каналов\n\nИсправления\n[YouTube] Контент с ограничением по возрасту\nУтечка окна Исключение при открытии диалогового окна выбора\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/973.txt",
    "content": "Быстрое исправление\n• Исправлена ошибка, из-за которой миниатюры и заголовки обрезались в макете сетки из-за неправильного расчета количества видео, которое может поместиться в одну строку\n• Исправлена ошибка, из-за которой диалоговое окно загрузки исчезало без каких-либо действий, если оно было открыто из меню «Поделиться»\n• Обновлена библиотека, связанная с открытием внешних действий, таких как средство выбора файлов Storage Access Framework\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/974.txt",
    "content": "Быстрое исправление\n•Исправлены проблемы с буферизацией, вызванные тротлингом YouTube\n•Исправлено извлечение комментариев YouTube и сбои с отключенными комментариями\n• Исправлен поиск музыки на YouTube\n• Исправления прямых трансляций PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/975.txt",
    "content": "Из нового\n• Показ миниатюры во время поиска\n• Обнаружение отключённых комментариев\n• Разрешение отмечать элемент ленты как просматриваемый\n• Показывать сердечки комментариев\n\nУлучшения\n• Улучшено расположение метаданных и тегов\n• Применение служебного цвета к компонентам пользовательского интерфейса\n\nИсправления\n• Исправлена миниатюра в мини-плеере\n• Исправлена бесконечная буферизация повторяющихся элементов очереди\n• Некоторые исправления плеера, такие как вращение и более быстрое закрытие\n• Исправлена ошибка, из-за которой ReCAPTCHA оставалась загруженной в фоновом режиме\n• Отключины клики во время обновления элементов ленты\n• Исправлены некоторые сбои загрузчика\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/976.txt",
    "content": "• Добавлена возможность прямого открытия плеера в полноэкранном режиме\n• Разрешение выбирать, какие типы поисковых предложений показывать\n• Тёмная тема стала темнее + добавлен тёмный экран-заставка\n• Улучшено средство выбора файлов, позволяющее выделить ненужные файлы серым цветом\n• Исправлен импорт подписок YouTube\n• Для повторного воспроизведения потока требуется повторное нажатие на кнопку воспроизведения\n• Исправлено закрытие аудио сессии\n• [Android TV] Исправлены долгие скачки панели поиска при использовании DPad\n\nЧтобы увидеть дальнейшие изменения, просмотрите журнал изменений (и сообщение в блоге) на вкладке «Ссылки» ниже.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/977.txt",
    "content": "• В меню длительного нажатия добавлена кнопка \"перейти к следующему\"\n• В фильтр намерений добавлен префикс пути к YouTube shorts\n• Исправлен импорт настроек\n• Поменяны местами панель поиска с кнопками проигрывателя на экране очереди\n• Различные исправления, связанные с MediasessionManager\n• Исправлена ошибка, из-за которой панель поиска не закрывалась после окончания видео\n• Отключено медиа-туннелирование на RealtekATV\n• Расширена интерактивная область кнопок свёрнутого проигрывателя\n\nЧтобы увидеть дальнейшие изменения, просмотрите журнал изменений (и сообщение в блоге) на вкладке «Ссылки» ниже.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/978.txt",
    "content": "Исправлено выполнение проверки для новых версий NewPipe. Иногда эта проверка выполнялась слишком рано, что приводило к падению приложения. Теперь это должно быть исправлено.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/979.txt",
    "content": "- Исправлено возобновление воспроизведения\n- Улучшения для службы, определяющей, должен ли NewPipe проверять наличие новой версии, не запускалась в фоновом режиме\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/980.txt",
    "content": "Из нового\n• Добавлена опция «Добавить в плейлист» в меню «Поделиться»\n• Добавлена поддержка коротких ссылок y2u.be и PeerTube\n\nУлучшения\n• Элементы управления скоростью воспроизведения стали более компактными.\n• Лента теперь выделяет новые элементы\n• Опция «Показывать просмотренные элементы» в ленте теперь сохраняется\n\nИсправления\n• Исправлено извлечение лайков и дизлайков YouTube.\n• Исправлен автоматический повтор после выхода из фонового режима\nИ многое другое\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/981.txt",
    "content": "Удалена поддержка MediaParser для исправления возобновления воспроизведения после буферизации на Android 11+.\nОтключено медиа-туннелирование на Philips QM16XE для решения проблем с воспроизведением.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/982.txt",
    "content": "Исправлена ошибка, из-за которой YouTube не воспроизводил ни одну трансляцию.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/983.txt",
    "content": "Добавлен новый пользовательский интерфейс для поиска через двойное нажатие и поведения\nНастройки сделаны более доступными для поиска\nВыделенные закреплённые комментарии как таковые\nДобавлена поддержка открытия с помощью приложения для экземпляра FSFE PeerTube.\nДобавлены уведомления об ошибках\nИсправлено повторное воспроизведение первого элемента очереди при смене плеера.\nПодождите дольше при буферизации во время прямых трансляций, прежде чем произойдет сбой\nИсправлен порядок результатов локального поиска\nИсправлены пустые поля предметов в очереди воспроизведения\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/984.txt",
    "content": "Загружайте достаточно начальных элементов в списках, чтобы заполнить весь экран и исправить прокрутку на планшетах и телевизорах\nИсправлены случайные сбои при прокрутке списков\nОверлейная дуга быстрого поиска теперь идёт под системным пользовательским интерфейсом\nОтменены изменения в вырезах при воспроизведении в многооконном режиме, вызывая неуместную регрессию проигрывателя на некоторых телефонах.\nУвеличен compileSdk с 30 до 31\nОбновлена библиотека отчётов об ошибках\nРефакторинг кода в плеере\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/985.txt",
    "content": "Исправлено: YouTube не воспроизводил никакие потоки\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/986.txt",
    "content": "Из нового\n• Уведомления о новых трансляциях\n• Плавный переход между фоном и видеоплеерами\n• Изменение скорости по полушагам\n• Добавлена очередь основного проигрывателя в список воспроизведения\n\nУлучшения\n• Запоминание размера шага скорости\n• Уменьшина начальная долгая буферизация в видеоплеере\n• Улучшен пользовательский интерфейс плеера для Android TV\n• Подтверждение удаления всех загруженных файлов\n\nИсправления\n• Исправлена ошибка, из-за которой кнопка мультимедиа не скрывала элементы управления проигрывателем\n• Исправлен сброс воспроизведения при смене типа проигрывателя\n• Исправлен поворот диалогового окна плейлиста\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/987.txt",
    "content": "Из нового\n• Поддержка методов доставки, отличных от прогрессивного HTTP: ускорение времени загрузки воспроизведения, исправления PeerTube и SoundCloud, воспроизведение недавно закончившихся трансляций YouTube\n• Кнопка «Добавить», чтобы добавить удаленный плейлист к локальному\n• Предпросмотр изображения на странице общего доступа Android 10+\n\nУлучшения\n• Улучшения окна параметров воспроизведения\n• Перемещение кнопки импорта/экспорта подписки в трехточечное меню\n\nИсправления\n• Исправлено удаление полностью просмотренных видео из плейлиста\n• Исправлена тема меню «Поделиться» и пункт «Добавить в плейлист»\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/988.txt",
    "content": "[YouTube] Исправлена ошибка «Не удалось получить поток» при попытке воспроизвести любое видео.\n[YouTube] Исправление «Следующий контент недоступен в этом приложении». Сообщение отображается вместо запрошенного видео\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/989.txt",
    "content": "• [YouTube] Исправлена бесконечная загрузка при попытке воспроизвести любое видео\n• [YouTube] Исправлено замедление некоторых видео\n• Обновлена библиотека jsoup до версии 1.15.3, которая включает исправления безопасности\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/990.txt",
    "content": "В этом выпуске прекращена поддержка Android 4.4 KitKat, теперь минимальная версия — Android 5 Lollipop!\n\nИз нового\n• Добавлен пункт \"Загрузка\" в меню длительного нажатия\n• Возможность скрыть будущие видео в ленте\n• Возможность делиться локальными плейлистами\n\nУлучшения\n• Рефакторинг кода проигрывателя на небольшие компоненты: меньше оперативной памяти, меньше ошибок\n• Улучшен режим масштабирования миниатюр.\n• Заполнители векторных изображений\n\nИсправления\n• Исправлены различные проблемы с уведомлением проигрывателя: устаревшая/отсутствующая информация о медиа, искажённая миниатюра\n• Исправлен полноэкранный режим с использованием 1/4 экрана\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/991.txt",
    "content": "Из нового\n• Добавлена кнопка \"Открыть в браузере\" на панели ошибок\n• Добавлена возможность отображать группы каналов в виде списка\n• [YouTube] Нажмите и удерживайте сегменты потока, чтобы поделиться URL-адресом временной метки\n• Добавлена кнопка очереди воспроизведения в мини-плеер\n\nУлучшения\n• Добавлена исландская локализация и обновлены многие другие переводы\n• Множество внутренних улучшений\n\nИсправления\n• Исправление нескольких сбоев\n• [YouTube] Исправлены проблемы с загрузкой каналов, невыделенной лентой и временным решением проблем с воспроизведением в некоторых странах\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/992.txt",
    "content": "Из нового\n• Количество подписчиков в сведениях о видео.\n• Загрузить из очереди\n• Навсегда установить миниатюру плейлиста\n• Нажмите и удерживайте хэштеги и ссылки.\n• Режим просмотра \"карта\"\n\nУлучшения\n• Увеличенная кнопка закрытия мини-плеера\n• Более плавное уменьшение миниатюр\n• Целевой Android 13 (API 33)\n• Поиск больше не останавливает плеер\n\nИсправления\n• Исправлено наложение на DeX/мыши.\n• Разрешить фоновый проигрыватель без отдельных аудиопотоков\n• Различные исправления YouTube и многое другое…\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/993.txt",
    "content": "Из нового\n• Добавлено предупреждение при добавлении дубликатов плейлистов и добавлена кнопка для их удаления\n• Разрешение игнорировать аппаратные кнопки\n• Разрешение скрывать частично просмотренные видео в ленте\n\nУлучшения\n• Используйте больше столбцов сетки на больших экранах\n• Приведите индикаторы прогресса в соответствие с настройками\n\nИсправления\n• Исправлено открытие URL-адресов браузера, загрузок и внешних проигрывателей на Android 11+\n• Исправлено взаимодействие с полноэкранным режимом, требующее двух нажатий в MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/994.txt",
    "content": "Новый\n- Поддержка нескольких аудиодорожек/языков\n- Возможность установки жестов громкости и яркости на любой стороне экрана\n- Поддержка отображения основных вкладок в нижней части экрана\n\nУлучшено\n- [Bandcamp] Обработка треков за платной стеной\n\nИсправлено\n- [YouTube] 403 HTTP-ошибки для потоков\n- Черный плеер при переключении на основной плеер из просмотра плейлиста\n- Утечка памяти службы плеера\n- [PeerTube] Аватары загрузчика и подканалов менялись местами\n\nи многое другое\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/995.txt",
    "content": "Новое\n• Поддержка вкладок каналов\n• Выбор качества изображения\n• Получение URL всех изображений\n\nУлучшено\n• Доступность интерфейсов плееров\n• Выбор аудио для скачивания только видео\n• Возможность включения названий плейлистов и видео в общий плейлист\n\nИсправлено\n• Получение кол-ва лайков\n• Плеер не видит всплывающие окона и вылетает\n• Выбор неправильных языков в переключателе языков\n• Фокусировка звука проигрывателя не учитывала выключение звука\n• Добавление элемента плейлиста иногда не работает\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/996.txt",
    "content": "Исправлена ошибка NullPointerException при открытии канала/конференции в media.ccc.de.\nГринч пытался сломать наш рождественский подарок вам, но мы починили его.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/997.txt",
    "content": "Новый\n- Добавление ответов на комментарии\n- Разрешить переупорядочивание плейлистов\n- Показывать описание и продолжительность плейлиста\n- Возможность сброса настроек\n\nУлучшено\n- [Android 13+] Восстановление пользовательских действий с уведомлениями\n- Запрос согласия на проверку обновлений\n- Разрешить воспроизведение/паузу уведомлений при буферизации\n- Изменение порядка некоторых настроек\n\nИсправлено\n- [YouTube] Исправление не загружающихся комментариев, а также другие исправления и улучшения\n- Устранение уязвимости в импорте настроек и переход на JSON\n- Различные исправления загрузки\n- Обрезка текста для поиска\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/998.txt",
    "content": "Исправлена ошибка, из-за которой YouTube не воспроизводил потоки из-за ошибок HTTP 403.\n\nСлучайные ошибки HTTP 403 в середине видео на YouTube пока не исправлены.\nЭта проблема будет решена в следующем выпуске исправления как можно скорее.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/changelogs/999.txt",
    "content": "Этот выпуск исправления исправляет ошибки HTTP 403 в середине видео на YouTube.\n\nНовое\n• [SoundCloud] Добавлена поддержка URL-адресов on.soundcloud.com\n\nУлучшено\n• [Bandcamp] Отображение дополнительной информации в радиокиоске\n\nИсправлено\n• [YouTube] Исправлены случайные ошибки HTTP 403 в начале или середине видео\n• [YouTube] Извлечение аватара и баннера из большего количества типов заголовков каналов\n• [Bandcamp] Исправлены различные ошибки и всегда используется HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/ru/full_description.txt",
    "content": "NewPipe не использует библиотеки фреймворка Google или API YouTube, взаимодействуя только с сайтом сервиса для получения необходимых данных. NewPipe может работать на устройствах без установленных Сервисов Google и не требует учётной записи YouTube, это свободное программное обеспечение.\n"
  },
  {
    "path": "fastlane/metadata/android/ru/short_description.txt",
    "content": "Свободный и легковесный клиент YouTube для Android.\n"
  },
  {
    "path": "fastlane/metadata/android/sat/short_description.txt",
    "content": "ᱮᱱᱰᱨᱳᱭᱮᱰ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱯᱷᱨᱤ ᱦᱟᱞᱠᱟ ᱚᱡᱚᱱ ᱭᱩᱴᱭᱩᱵᱽ ᱯᱷᱨᱚᱱᱴᱮᱱᱰ ᱾\n"
  },
  {
    "path": "fastlane/metadata/android/sc/changelogs/955.txt",
    "content": "[YouTube] Chirca acontzada pto unos cantos impreadores\n[YouTube] Etzetziones casulaes de detzifradura acontzadas\n[SoundCloud] Sos URL chi acabant cun una barra como benint analizados comente si tocat\n"
  },
  {
    "path": "fastlane/metadata/android/sc/changelogs/956.txt",
    "content": "[YouTube] Curretzione de una serradura no isetada cando si càrrigat cale si siat vìdeu\n"
  },
  {
    "path": "fastlane/metadata/android/sc/changelogs/959.txt",
    "content": "Curretzione de unu tziclu infinidu de serradura improvisas a pustis de s'abertura de su sinnaladore de errores.\nAgiornamentu de sa lista de istàntzias de Peertube chi NewPipe podet abèrrere automaticamente.\nAgiornamentu de sas tradutziones.\n"
  },
  {
    "path": "fastlane/metadata/android/sc/changelogs/960.txt",
    "content": "• Megioramentu de sa descritzione de s'optzione de esportatzione de sa base de datos in sas impostatziones.\n• Anàlisi de sos cummentos de YouTube acontzada.\n• Nùmene ammustradu in su servìtziu media.ccc.de acontzadu.\n• Tradutziones agiornadas.\n"
  },
  {
    "path": "fastlane/metadata/android/sc/full_description.txt",
    "content": "NewPipe no impreat peruna libreria de Google o s'API de YouTube. Analizat petzi su situ pro otènnere sas informatziones chi li serbint. Pro custa resone custa aplicatzione la si podet impreare in dispositivos chene sos servìtzios de Google installados. In prus, non tenes bisòngiu de unu contu de YouTube pro impreare NewPipe, e est de badas e a còdighe abertu.\n"
  },
  {
    "path": "fastlane/metadata/android/sc/short_description.txt",
    "content": "Unu leghidore multimediale de YouTube pro Android.\n"
  },
  {
    "path": "fastlane/metadata/android/si/full_description.txt",
    "content": "NewPipe කිසිදු Google රාමු පුස්තකාලයක් හෝ YouTube API භාවිතා නොකරයි. එය අවශ්‍ය තොරතුරු ලබා ගැනීම සඳහා වෙබ් අඩවිය විග්‍රහ කරයි. එබැවින් මෙම යෙදුම Google සේවා ස්ථාපනය කර නොමැති උපාංග මත භාවිතා කළ හැක. එසේම, ඔබට NewPipe භාවිතා කිරීමට YouTube ගිණුමක් අවශ්‍ය නොවන අතර එය FLOSS වේ.\n"
  },
  {
    "path": "fastlane/metadata/android/si/short_description.txt",
    "content": "Android සඳහා නොමිලේ සැහැල්ලු YouTube ඉදිරි අන්තය.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/1000.txt",
    "content": "Vylepšené\n- Kliknutím na playlist sa zobrazí viac/menej obsahu\n- [PeerTube] Automatické spracovanie odkazov z `subscribeto.me`\n- Spustiť prehrávanie iba jednej položky v histórii\n\nOpravené\n- Viditeľnosť tlačidla RSS\n- Pády pri náhľadoch\n- Pridanie položky bez miniatúry do playlistu \n- Zatváranie okna sťahovania pred jeho zobrazením\n- Vyskakovacie okno zoznamu súvisiacich položiek\n- Poradie v okne pridania do playlistu\n- Rozloženie položiek záložiek playlistu\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/1001.txt",
    "content": "Vylepšené\n- Vždy umožnená zmena predvolieb oznámení prehrávača na Android 13+\n\nOpravené\n- Oprava exportu databázy/odberov, pri ktorom nedochádzalo k skráteniu už existujúceho súboru, čo mohlo viesť k poškodeniu exportu\n- Oprava pokračovania prehrávania od začiatku pri kliknutí na časovú značku\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/1002.txt",
    "content": "Opravené prehrávanie videí.\n\nToto vydanie rieši len najpálčivejšiu chybu, ktorá zabraňuje načítať detaily s videom.\nSme si vedomí aj ďalších chýb a čoskoro vydáme ďalšie vydanie, ktoré ich bude riešiť.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/1003.txt",
    "content": "Fixed YouTube not playing any stream\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/1004.txt",
    "content": "Fixed YouTube not playing any stream\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/1005.txt",
    "content": "New\n• Add support for Android Auto\n• Allow setting feed groups as main screen tabs\n• [YouTube] Share as temporary playlist\n• [SoundCloud] Likes channel tab\n\nImproved\n• Better search bar hints\n• Show download date in Downloads\n• Use Android 13 per-app language\n\nFixed\n• Fix broken text colors in dark mode\n• [YouTube] Fix playlists not loading more than 100 items\n• [YouTube] Fix missing recommended videos\n• Fix crashes in History list view\n• Fix timestamps in comment replies\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/1006.txt",
    "content": "# Improved\nKeep current player when clicking on timestamps\nTry to recover pending download missions when possible\nAdd option to delete a download without also deleting file\nOverlay Permission: display explanatory dialog for Android > R\nSupport on.soundcloud link opening\nA lot of small improvements and optimizations\n\n# Fixed\nFix short count formatting for Android versions below 7\nFix ghost notifications\nFixes for SRT subtitle files\nFixed tons of crashes\n\n# Development\nInternal code modernization\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/1007.txt",
    "content": "Fixed YouTube not playing any stream\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/1008.txt",
    "content": "Opravené obnovenie streamov na poslednej pozícii prehrávania.\n∙ [YouTube] Pridaná podpora pre viac formátov URL kanálov.\n∙ [YouTube] Pridaná podpora pre viac formátov metainformácií videí.\n∙ Aktualizované preklady\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/1009.txt",
    "content": "Dôležité\nPridané informácie a výzva k akcii v rámci kampane Keep Android Open: https://www.keepandroidopen.org/\n\nVylepšené\n[Feed] Prehodenie poradia, v ktorom sa aktualizujú neaktuálne odbery\nNehromadenie stránok s komentármi\nPri kliknutí na stránku s podrobnosťami o videu sa neprenášajú udalosti kliknutia do podkladových zobrazení\n\nOpravené\nRozloženie záhlavia odpovedí na komentáre bez avataru\nViacero opráv používateľského rozhrania súvisiacich s prehrávačom\n[SoundCloud] Oprava streamov s dlhými ID\n\na ďalšie opravy a vylepšenia!\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/63.txt",
    "content": "### Vylepšenia\n- Nastavenia importu/exportu #1333 \n- Zníženie overdrawu (zlepšenie výkonu) #1371 \n- Malé vylepšenia kódu #1375 \n- Všetko ohľadom GDPR #1420\n\n### Opravené\n- Sťahovač: Oprava pádu počas načítania nedokončených súborov s príponou .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/64.txt",
    "content": "### Vylepšenia\n- Pridaná možnosť obmedziť kvalitu videa pri používaní mobilných dát. #1339\n- Zapamätanie jasu pre reláciu #1442\n- Zlepšenie výkonu sťahovania pre slabšie procesory #1431\n- Pridanie (funkčnej) podpory pre reláciu médií #1433\n\n### Opravy\n- Oprava zlyhania pri otváraní sťahovania (oprava je teraz k dispozícii pre verzie vydania) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/65.txt",
    "content": "### Improvements\n\n- Disable burgermenu icon animation #1486 \n- undo delete of downloads #1472 \n- Download option in share menu #1498\n- Added share option to long tap menu #1454 \n- Minimize main player on exit #1354 \n- Library version update and database backup fix #1510 \n- ExoPlayer 2.8.2 Update #1392\n  - Reworked the playback speed control dialog to support different step sizes for faster speed change.\n  - 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 =\\\\).  \n  - 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.\n  - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened.\n  - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging\n- Use new extractor with refactored architecture for multiservice\n\n### Fixes\n\n- Fix #1440 Broken Video Info Layout #1491 \n- View history fix #1497\n  - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. \n  - #1475, by registering a view in the database when the user starts a video on external player on detail fragment.\n- Fix creen timeout in case of popup mode. #1463 (Fixed #640)\n- Main video player fix #1509 \n  - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background.\n  - Fixed minimizing player to popup does not destroy player when popup permission is not granted.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/66.txt",
    "content": "# Changelog of v0.13.7\n\n### Fixed\n- Fix sort filter issues of v0.13.6\n\n# Changelog of v0.13.6\n\n### Improvements\n\n- Disable burgermenu icon animation #1486 \n- undo delete of downloads #1472 \n- Download option in share menu #1498\n- Added share option to long tap menu #1454 \n- Minimize main player on exit #1354 \n- Library version update and database backup fix #1510 \n- ExoPlayer 2.8.2 Update #1392\n  - Reworked the playback speed control dialog to support different step sizes for faster speed change.\n  - 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 =\\\\).  \n  - 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.\n  - Fixed remote playlist metadata not updating when new metadata is available when playlist fragment is opened.\n  - Various UI fixes: #1383, background player notification controls now always white, easier to shutdown popup player through flinging\n- Use new extractor with refactored architecture for multiservice\n\n### Fixes\n\n- Fix #1440 Broken Video Info Layout #1491 \n- View history fix #1497\n  - #1495, by updating the metadata (thumbnail, title and video count) as soon as the user access the playlist. \n  - #1475, by registering a view in the database when the user starts a video on external player on detail fragment.\n- Fix creen timeout in case of popup mode. #1463 (Fixed #640)\n- Main video player fix #1509 \n  - [#1412] Fixed repeat mode causing player NPE when new intent is received while player activity is in background.\n  - Fixed minimizing player to popup does not destroy player when popup permission is not granted.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/68.txt",
    "content": "# changes of v0.14.1\n\n### Fixed\n- Fixed failed to decrypt video url #1659 \n- Fixed description link not extract well #1657\n\n# changes of v0.14.0\n\n### New\n- New Drawer design #1461\n- New customizable front page #1461\n\n### Improvements\n- Reworked Gesture controls #1604 \n- New way to close the popup player #1597\n\n### Fixed\n- Fix error when subscription count is not available. Closes #1649.\n  - Show \"Subscriber count not available\" in those cases\n- Fix NPE when a YouTube playlist is empty\n- Quick fix for the kiosks in SoundCloud\n- Refactor and bugfix #1623 \n  - Fix Cyclic search result  #1562\n  - Fix Seek bar not statically lay outed\n  - Fix YT Premium video are not blocked correctly\n  - Fix Videos sometimes not loading (due to DASH parsing)\n  - Fix links in video description\n  - Show warning when someone tries to download to external sdcard\n  - fix nothing shown exception triggers report\n  -  thumbnail not shown in background player for android 8.1 [see here](https://github.com/TeamNewPipe/NewPipe/issues/943)\n- Fix registering of broadcast receiver. Closes #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/69.txt",
    "content": "### New\n- Long-tap delete and share in subscriptions #1516 \n- Tablet UI and grid list layout #1617 \n\n### Improvements\n- store and reload the last used aspect ratio #1748 \n- Enable linear layout in Downloads activity with full video names #1771 \n- Delete and share subscriptions directly from within the subscriptions tab #1516 \n- Enqueuing now triggers video playing if the play queue has already ended #1783 \n- Separate settings for volume and brightness gestures #1644\n- Add support for Localization #1792\n\n### Fixes\n- Fix time parsing for . format, so NewPipe can be used in Finland\n- Fix subscription count\n- Add foreground service permission for API 28+ devices #1830\n\n### Known Bugs\n- Playback state can not be saved on Android P\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/70.txt",
    "content": "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? ¯\\_(ツ)_/¯\n\n### Improvements\n* downloaded files can now be opened with one click #1879 \n* drop support for android 4.1 - 4.3 #1884 \n* remove old player #1884 \n* remove streams from current play queue by swiping them to the right #1915 \n* remove auto queued stream when a new stream is enqueued manually #1878 \n* Postprocessing for downloads and implement missing features #1759 by @kapodamy\n  * Post-processing infrastructure\n  * Proper error handling \"infrastructure\" (for downloader)\n  * Queue instead of multiple downloads\n  * Move serialized pending downloads (`.giga` files) to app data\n  * Implement max download retry\n  * Proper multi-thread download pausing\n  * Stop downloads when swicthing to mobile network (never works, see 2nd point)\n  * Save the thread count for next downloads\n  * A lot of incoherences fixed\n\n### Fixed\n* Fix crash with default resolution set to best and limited mobile data resolution #1835\n* pop-up player crash fixed #1874 \n* NPE when trying to open background player #1901\n* Fix for inserting new streams when auto queuing is enabled #1878\n* Fixed the decypering shuttown issue\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/71.txt",
    "content": "### Improvements\n* Add app update notification for GitHub build (#1608 by @krtkush)\n* Various improvements to the downloader (#1944 by @kapodamy):\n  * add missing white icons and use hardcored way for change the icon colors\n  * check if the iterator is initialized (fixes #2031)\n  * allow retry downloads with \"post-processing failed\" error in the new muxer\n  * new MPEG-4 muxer fixing non-synchronous video and audio streams (#2039)\n\n### Fixed\n* YouTube live streams stop playing after a short time (#1996 by @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/730.txt",
    "content": "# Fixed\n- Hot fix decrypt function error again.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/740.txt",
    "content": "<h4>Improvements</h4>\n<ul>\n<li>make links in comments clickable, increase text size</li>\n<li>seek on clicking timestamp links in comments</li>\n<li>show preferred tab based on recently selected state</li>\n<li>add playlist to queue when long clicking on &#39;Background&#39; in playlist window</li>\n<li>search for shared text when it is not an URL</li>\n<li>add &quot;share at current time&quot; button to the main video player</li>\n<li>add close button to main player when video queue is finished</li>\n<li>add &quot;Play directly in Background&quot; to longpress menu for video list items</li>\n<li>improve English translations for Play/Enqueue commands</li>\n<li>small performance improvements</li>\n<li>remove unused files</li>\n<li>update ExoPlayer to 2.9.6</li>\n<li>add support for Invidious links</li>\n</ul>\n<h4>Fixed</h4>\n<ul>\n<li>fixed scroll w/ comments and related streams disabled</li>\n<li>fixed CheckForNewAppVersionTask being executed when it shouldn&#39;t</li>\n<li>fixed youtube subscription import: ignore ones with invalid url and keep ones with empty title</li>\n<li>fix invalid YouTube url: signature tag name is not always \"signature\" preventing streams from loading</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/750.txt",
    "content": "New\nPlayback resume #2288\n• Resume streams where you stopped last time\nDownloader Enhancements #2149 \n• Use Storage Access Framework to store downloads on external SD-cards\n• New mp4 muxer\n• Optionally change the download directory before starting a download\n• Respect metered networks \n\n\nImproved\n• Removed gema strings #2295\n• Handle (auto)rotation changes during activity lifecycle #2444\n• Make long-press menus consistent #2368\n\nFixed\n• Fixed selected subtitle track name not being shown #2394\n• Do not crash when check for app update fails (GitHub version) #2423 \n• Fixed downloads stuck at 99.9% #2440\n• Update play queue metadata #2453 \n• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/760.txt",
    "content": "Changes in 0.17.1\n\nNew\n• Thai localization\n\n\nImproved\n• Add start playing here action in long-press menus for playlists again #2518\n• Add switch for SAF / legacy file picker #2521\n\nFixed\n• Fix disappearing buttons in downloads view when switching apps #2487\n• Fix playback position is stored although watch history is disabled\n• Fix reduced performance caused by playback position in list views #2517\n• [Extractor] Fix ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186\n• [Extractor] [YouTube] Fix casual search error when playlists are in results TeamNewPipe/NewPipeExtractor#185\n\n\n\nChanges in 0.17.0\n\nNew\nPlayback resume #2288\n• Resume streams where you stopped last time\nDownloader Enhancements #2149 \n• Use Storage Access Framework to store downloads on external SD-cards\n• New mp4 muxer\n• Optionally change the download directory before starting a download\n• Respect metered networks \n\n\nImproved\n• Removed gema strings #2295\n• Handle (auto)rotation changes during activity lifecycle #2444\n• Make long-press menus consistent #2368\n\nFixed\n• Fixed selected subtitle track name not being shown #2394\n• Do not crash when check for app update fails (GitHub version) #2423 \n• Fixed downloads stuck at 99.9% #2440\n• Update play queue metadata #2453 \n• [SoundCloud] Fixed crash when loading playlists TeamNewPipe/NewPipeExtractor#170\n• [YouTube] Fixed duration can not be paresd TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/770.txt",
    "content": "Changes in 0.17.2\n\nFix\n• Fix no video was available\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/780.txt",
    "content": "Changes in 0.17.3\n\nImproved\n• Added option to clear playback states #2550\n• Show hidden directories in the file picker #2591\n• Support URLs from `invidio.us` instances to be opened with NewPipe  #2488 \n• Add support for `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194\n\nFixed\n• [YouTube] Fixed 'java.lang.IllegalArgumentException #192\n• [YouTube] Fixed live streams not working TeamNewPipe/NewPipeExtractor#195\n• Fixed performance problem in android pie when downloading a stream #2592\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/790.txt",
    "content": "Improved\n• Add more titles to improve accessibility for blind people #2655\n• Make language of download folder setting more consistent and less ambiguous #2637\n\nFixed\n• Check if last byte in the block is downloaded #2646\n• Fixed scrolling in video detail fragment #2672\n• Remove double search clear box animations to one #2695\n• [SoundCloud] Fix client_id extraction #2745\n\nDevelopment\n• Add missing dependencies inherited from NewPipeExtractor into NewPipe #2535\n• Migrate to AndroidX #2685\n• Update to ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/800.txt",
    "content": "New\n• PeerTube support without P2P (#2201) [Beta]:\n  ◦ Watch and download videos from PeerTube instances\n  ◦ Add instances in the settings to access the complete PeerTube world\n  ◦ There might be problems with SSL handshakes on Android 4.4 and 7.1 when accessing certain instances resulting in a network error.\n\n• Downloader (#2679):\n  ◦ Calculate download ETA\n  ◦ Download opus (webm files) as ogg\n  ◦ Recover expired download links to resume downloads after a long pause\n\nImproved\n• Make the KioskFragment aware of changes in the preferred content country and improve performance of all main tabs #2742\n• Use new Localization and Downloader implementations from extractor #2713 \n• Make \"Default kiosk\" string translatable\n• Black navigation bar for black theme #2569\n\nFixed\n• Fixed a bug that could not move the popup player if another finger was placed while moving the popup player #2772 \n• Allow playlists missing an uploader and fix crashes related to this problem #2724, TeamNewPipe/NewPipeExtractor#219\n• Enabling TLS1.1/1.2 on Android 4.4 devices (API 19/KitKat) to fix TLS handshake with MediaCCC and some PeerTube instances  #2792\n• [SoundCloud] Fixed client_id extraction TeamNewPipe/NewPipeExtractor#217\n• [SoundCloud] Fix audio stream extraction\n\nDevelopment\n• Update ExoPlayer to 2.10.8 #2791, #2816\n• Update Gradle to 3.5.1 and add Kotlin support #2714\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/810.txt",
    "content": "New\n• Show video thumbnail on the lock screen when playing in the background\n\nImproved\n• Add local playlist to queue when long pressing on background / popup button\n• Make main page tabs scrollable and hide when there is only a single tab\n• Limit amount of notification thumbnail updates in background player\n• Add dummy thumbnail for empty local playlists\n• Use *.opus file extension instead of *.webm and show \"opus\" in format label instead of \"WebM Opus\" in the download dropdown\n• Add button to delete downloaded files or download history in \"Downloads\"\n• [YouTube] Add support to /c/shortened_url channel links\n\nFixed\n• Fixed multiple issues when sharing a video to NewPipe and downloading its streams directly\n• Fixed player access out of its creation thread\n• Fixed search result paging\n• [YouTube] Fixed switching on null causing NPE\n• [YouTube] Fixed viewing comments when opening an invidio.us url\n• [SoundCloud] Updated client_id\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/820.txt",
    "content": "Fixed decrypt function name regex making YouTube unusable.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/830.txt",
    "content": "Updated SoundCloud client_id to fix SoundCloud issues.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/840.txt",
    "content": "New\n• Added language selector to change the app language\n• Added send to Kodi button to player collapsible menu\n• Added ability to copy comments on long press\n\nImproved\n• Fix ReCaptcha activity and correctly save obtained cookies\n• Removed dot-menu in favour of drawer and hide history button when watch history is not enabled in settings\n• Ask for display over other apps permission in settings correctly on Android 6 and later\n• Rename local playlist by long-clicking in BookmarkFragment\n• Various PeerTube improvements\n• Improved several English source strings\n\nFixed\n• Fixed player starting again although it is paused when option \"minimize on app switch\" enabled and NewPipe is minimized\n• Fix initial brightness value for gesture\n• Fixed .srt subtitle downloads containing not all line breaks\n• Fixed download to SD card failing because some Android 5 devices are not CTF compliant\n• Fixed downloading on Android KitKat\n• Fixed corrupt video .mp4 file being recognized as audio file\n• Fixed multiple localization problems, including wrong Chinese language codes\n• [YouTube] Timestamps in description are clickable again\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/850.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/860.txt",
    "content": "Improved\n• Save and restore whether pitch and tempo are unhooked or not\n• Support display cutout in player\n• Round view and subscriber count\n• Optimized YouTube to use less data\n\nMore than 15 YouTube-related bugs were fixed in this release.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/870.txt",
    "content": "This is a hotfix release updating NewPipe to allow using SoundCloud without major hassles again.\nSoundCloud's v2 API is used in the extractor now and the detection of invalid client IDs has been improved.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/900.txt",
    "content": "New\n• Subscription groups and sorted feeds\n• Mute button in players\n\nImproved\n• Allow opening music.youtube.com and media.ccc.de links in NewPipe\n• Relocate two settings from Appearance to Content\n• Hide 5, 15, 25 second seek options if inexact seek is enabled\n\nFixed\n• some WebM videos are not seekable\n• database backup on Android P\n• crash when sharing a downloaded file\n• tons of YouTube extraction issue and more ...\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/910.txt",
    "content": "Fixed database migration which prevented NewPipe from starting in some rare cases.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/920.txt",
    "content": "Improved\n\n• Added upload date and view count on stream grid items\n• Improvements for the drawer header layout\n\nFixed\n\n• Fixed mute button causing crashes on API 19\n• Fixed downloading of long 1080p 60fps videos\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/930.txt",
    "content": "New\n• Search on YouTube Music\n• Basic Android TV support\n\nImproved\n• Added the ability to remove all watched videos from a local playlist\n• Show message when content isn't supported yet instead of crashing\n• Improved popup player resize with pinch gestures\n• Enqueue streams on long press on background and popup buttons in channel\n• Improved size handling of the drawer header title\n\nFixed\n• Fixed age restricted content setting not working\n• Fixed certain kinds of reCAPTCHAs\n• Fixed crash when opening bookmarks while playlist is `null`\n• Fixed detection of network related exceptions\n• Fixed visibility of group sort button in the subscriptions fragment\n\nand more\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/940.txt",
    "content": "New\n• Add support for SoundCloud comments\n• Add YouTube restricted mode setting\n• Show PeerTube parent channel details\n\nImproved\n• Show Kore button only for supported services\n• Block player gestures that begin at the NavigationBar or StatusBar\n• Change retry & subscribe buttons background color based on service color\n\nFixed\n• Fix download dialog freeze\n• Open in browser button now really opens in browser\n• Fix crash on opening videos and \"Could not play this stream\"\n\nand more\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/950.txt",
    "content": "This release brings three small fixes:\n• Fixed storage access on Adroid 10+\n• Fixed opening kiosks\n• Fixed duration parsing of long videos\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/951.txt",
    "content": "New\n• Add search for subscription picker in the feed group dialog\n• Add filter to the feed group dialog to show only ungrouped subscriptions\n• Add playlist tab to main page\n• Fast forward/rewind in background/pop-up player queue\n• Display search suggestion: did you mean & showing result for\n\nImproved\n• Drop writing application metadata in muxed files\n• Do not remove failed streams from the queue\n• Update status bar color to match toolbar color\n\nFixed\n• Fixed audio/video desync caused by floating point cumulative errors\n• [PeerTube] Handle deleted comments\n\nand more\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/952.txt",
    "content": "Improved\n• Auto-play is available for all services (instead of only for YouTube)\n\nFixed\n• Fixed related streams by supporting YouTube's new continuations\n• Fixed age restricted YouTube videos\n• [Android TV] Fixed lingering focus highlight overlay\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/953.txt",
    "content": "Fix extraction of YouTube's decryption function.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/954.txt",
    "content": "• new application workflow: play videos on detail page, swipe down to minimize player\n• MediaStyle notifications: customizable actions in notifications, performance improvements\n• basic resizing when using NewPipe as desktop app\n\n• show dialog with open options in case of an unsupported URL toast\n• Improve search suggestion experience when remote ones can't be fetched\n• Increased default video quality to 720p60 (in-app player) and 480p (pop-up player)\n\n• tons of bug fixes and more\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/955.txt",
    "content": "[YouTube] Fix search for some users\n[YouTube] Fix random decryption exceptions\n[SoundCloud] URLs that end with a slash are now parsed correctly\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/956.txt",
    "content": "[YouTube] Fixed crash when loading any video\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/957.txt",
    "content": "• Unify specific enqueue actions into one\n• Two finger gesture to close player\n• Allow clearing reCAPTCHA cookies\n• Option to not colorize notification\n• Improve how video details are opened to fix infinite buffering, buggy behaviour when sharing to NewPipe and other inconsistencies\n• Speed up YouTube videos and fix age restricted ones\n• Fix crash on fast forward/rewind\n• Don't rearrange lists by dragging thumbnails\n• Always remember popup properties\n• Add Santali language\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/958.txt",
    "content": "New and improved:\n• Re-added option to hide thumbnail on lock screen\n• Pull to refresh feed\n• Improved performance when fetching local lists\n\nFixed:\n• Fixed crash when starting NewPipe after it was removed from RAM\n• Fixed crash on startup when there is no internet connection\n• Fixed respecting brightness- and volume-gesture settings\n• [YouTube] Fixed long playlists\n\nOther:\n• Code cleanup and several internal improvements\n• Dependency updates\n• Translation updates\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/959.txt",
    "content": "Fixed endless loop of crashes after opening the error reporter.\nUpdated list of PeerTube instances which can be opened automatically by NewPipe.\nUpdated translations.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/960.txt",
    "content": "• Improved description of export database option in settings.\n• Fixed YouTube comments parsing.\n• Fixed display name of media.ccc.de service.\n• Updated translations.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/961.txt",
    "content": "• [YouTube] Mix support\n• [YouTube] Display info about public broadcasters and Covid-19\n• [media.ccc.de] Added recent videos\n• Added Somali translation\n\n• Many internal improvements\n\n• Fixed sharing videos from within the player\n• Fixed blank ReCaptcha webview\n• Fixed crash which occurred when removing a stream from a list\n• [PeerTube] Fixed related streams\n• [YouTube] Fixed YouTube Music search\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/962.txt",
    "content": "Added \"recent\" videos to media.ccc.de service.\nAdded live streams to media.ccc.de service and also live stream support.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/963.txt",
    "content": "• [YouTube] Fixed channel continuation\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/964.txt",
    "content": "• Added support for chapters in player controls\n• [PeerTube] Added Sepia search\n• Re-added share button in video detail view and moved stream description into the tab layout\n• Disable restoring brightness if brightness gesture is disabled\n• Added list item to play video on kodi\n• Fixed crash when no default browser is set on some devices and improve share dialogs\n• Toggle play/pause with hardware space button in fullscreen player\n• [media.ccc.de] Various fixes and improvements\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/965.txt",
    "content": "Fixed crash which occurred when reordering channel groups.\nFixed getting more YouTube videos from channels and playlists.\nFixed getting YouTube comments.\nAdded support for /watch/, /v/ and /w/ subpaths in YouTube URLs.\nFixed extraction of SoundCloud client id and geo-restricted content.\nAdded Northern Kurdish localization.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/966.txt",
    "content": "New:\n• Add a new service: Bandcamp\n\nImproved:\n• Add an option to have the app follow the device theme\n• Prevent some crashes by showing an improved error panel\n• Show more information on why content in unavailable\n• Hardware space button triggers play/pause\n• Show \"Download started\" toast\n\nFixed:\n• Fix very small thumbnail in video details while playing in the background\n• Fix empty title in minimized player\n• Fix last resize mode not being restored correctly\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/967.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/968.txt",
    "content": "Added channel details option to long-press menu.\nAdded functionality to rename Playlist Name from playlist interface.\nAllow the user to pause while a video is buffering.\nPolished the white theme.\nFixed overlapping fonts when using a larger font size.\nFixed no video on Formuler and Zephier devices.\nFixed various crashes.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/969.txt",
    "content": "• Povoliť inštaláciu na externom úložisku\n • [Bandcamp] Pridaná podpora pre zobrazovanie prvých troch komentárov v streame\n • Zobraziť „sťahovanie začalo“ sa zobrazí až pri začatí sťahovania\n • Nenastavovať súbor cookie reCaptcha, ak nie je uložený žiadny súbor cookie\n • [Player] Zlepšenie výkonu medzipamäte\n • [Prehrávač] Opravené automatické prehrávanie\n • Zavrieť predchádzajúce Snackbary pri odstraňovaní sťahovaní\n • Opravený pokus o odstránenie objektu, ktorý nie je na zozname\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/970.txt",
    "content": "New\n• Show content metadata (tags, categories, license, ...) below the description\n• Added \"Show channel details\" option in remote (non-local) playlists\n• Added \"Open in browser\" option to long-press menu\n\nFixed\n• Fixed rotation crash on video detail page\n• Fixed \"Play with Kodi\" button in player always prompts to install Kore\n• Fixed and improved setting import and export paths\n• [YouTube] Fixed comment like count\nAnd much more\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/971.txt",
    "content": "Hotfix\n• Increase buffer for playback after rebuffer\n• Fixed crash on tablets and TVs when clicking on the play-queue icon in the player\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/972.txt",
    "content": "New\nRecognize timestamps and hashtags in description\nAdded manual tablet mode setting\nAdded ability to hide played items in a feed\n\nImproved\nSupport Storage Access Framework properly\nBetter error handling of unavailable and terminated channels\nThe Android share sheet for Android 10+ users now shows the content title.\nUpdated Invidious instances and support Piped links.\n\nFixed\n[YouTube] Age restricted content\nPrevent leaked window Exception when opening choice dialog\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/973.txt",
    "content": "Hotfix\n• Fix thumbnails and titles being trimmed in grid layout, due to a wrong calculation of how many videos can fit in one row\n• Fix download dialog disappearing without doing anything if opened from the share menu\n• Update a library related to opening external activities such as the Storage Access Framework file picker\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/974.txt",
    "content": "Hotfix\n• Fix buffering issues caused by YouTube throttling\n• Fix YouTube comments extraction and crashes with disabled comments\n• Fix YouTube music search\n• Fix PeerTube livestreams\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/975.txt",
    "content": "New\n• Show a thumbnail preview while seeking\n• Detect disabled comments\n• Allow marking a feed item as watched\n• Show comment hearts\n\nImproved\n• Improve metadata and tags layout\n• Apply service color to UI components\n\nFixed\n• Fix thumbnail in mini player\n• Fix endless buffering on duplicate queue items\n• Some player fixes like rotation and faster closing\n• Fix ReCAPTCHA remaining loaded in background\n• Disable clicks while refreshing feed\n• Fix some downloader crashes\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/976.txt",
    "content": "• Added option to directly open player in fullscreen\n• Allow choosing which types of search suggestions to show\n• Dark theme now darker + dark splash screen added\n• Improved file picker to gray out unwanted files\n• Fixed importing YouTube subscriptions\n• Replaying a stream requires on tap on the replay button again\n• Fixed closing audio session\n• [Android TV] Fixed long seekbar jumps when using a DPad\n\nTo see further changes, view the changelog (and blog post) from the Links tab below.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/977.txt",
    "content": "• Added a \"play next\" button to the long press menu\n• Added YouTube shorts path prefix to intent filter\n• Fixed Settings import\n•  Swap seekbar position with player buttons in Queue screen\n• Various fixes related to MediasessionManager\n• Fixed seekbar not completed after video end\n• Disabled media tunneling on RealtekATV\n• Expanded minimized player buttons clickable area\n\nTo see further changes, view the changelog (and blog post) from the Links tab below.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/978.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/979.txt",
    "content": "- Fixed resuming playback\n- Improvements to ensure that the service which determines if NewPipe should check for a new version checks is not started in background\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/980.txt",
    "content": "New\n• Added \"Add to playlist\" option to share menu\n• Added support for y2u.be and PeerTube short links\n\nImproved\n• Made Playback-Speed-Controls more compact\n• Feed highlights new items now\n• \"Show watched items\" option in the feed is now saved\n\nFixed\n• Fixed YouTube likes and dislikes extraction\n• Fixed automatic replay after returning from the background\nAnd much more\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/981.txt",
    "content": "Removed MediaParser support to fix failing playback resume after buffering on Android 11+.\nDisabled media tunneling on Philips QM16XE to fix playback problems.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/982.txt",
    "content": "Fixed YouTube not playing any stream.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/983.txt",
    "content": "Add new double-tap-to-seek UI and behaviour\nMake settings searchable\nHighlight pinned comments as such\nAdd open-with-app support for FSFE's PeerTube instance\nAdd error notifications\nFix replay of first queue item on player change\nWait longer when buffering during livestreams before failing\nFix order of local search results\nFix empty item fields in play queue\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/984.txt",
    "content": "Load enough initial items in lists to fill the whole screen and to fix scrolling on tablets and TVs\nFix random crashes while scrolling through lists\nHave the player fast seek overlay arc go under the system UI\nRevert changes to cutouts when playing in multi window, causing the misplaced player regression on some phones\nIncrease compileSdk from 30 to 31\nUpdate error reporting library\nRefactor some code in the player\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/985.txt",
    "content": "Fixed YouTube not playing any stream\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/986.txt",
    "content": "New\n• Notifications for new streams\n• Seamless transition between background and video players\n• Change pitch by semitones\n• Append the main player queue to a playlist\n\nImproved\n• Remember speed/pitch step size\n• Mitigate initial long buffering in the video player\n• Improve player UI for Android TV\n• Confirm before deleting all downloaded files\n\nFixed\n• Fix media button not hiding player controls\n• Fix playback reset on player type change\n• Fix rotating the playlist dialog\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/987.txt",
    "content": "Novinky\n• Poskytovanie iné než progresívne HTTP: zrýchlené načítanie prehrávania, opravy PeerTube a SoundCloud, prehrávanie nedávno ukončených livestreamov YouTube\n• Tlačidlo na pridanie vzdialeného zoznamu k lokálnemu\n• Náhľad obrázka v hárku zdieľania v Android 10+\n\nVylepšenia\n• Dialógové okno parametrov prehrávania\n• Presunuté tlačidlá import/export odberov do ○○○ menu\n\nOpravy\n• Odstraňovanie dokončených videí zo zoznamu videí\n• Téma v menu zdieľania a položky „pridať do zoznamu skladieb“\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/988.txt",
    "content": "[YouTube] Fix \"Could not get any stream\" error when trying to play any video\n[YouTube] Fix \"The Following content is not available on this app.\" message shown instead of the video requested\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/989.txt",
    "content": "- [YouTube] Oprava nekonečného načítavania pri pokuse o prehrávanie akéhokoľvek videa\n- [YouTube] Oprava obmedzovania výkonu pri niektorých videách\n- Aktualizácia knižnice jep na verziu 1.15.3, ktorá obsahuje opravu zabezpečenia\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/990.txt",
    "content": "V tejto verzii sa ruší podpora systému Android 4.4 KitKat, teraz je minimálna verzia Android 5 Lollipop!\n\nNovinky\n- Stiahnutie z ponuky dlhého stlačenia\n- Skrytie budúcich videí v kanáli\n- Zdieľanie miestnych zoznamov skladieb\n\nVylepšenia\n- Prepracovanie kódu prehrávača do malých komponentov: menej použitej pamäte RAM, menej chýb\n- Vylepšenie režimu zmenšovania miniatúr\n- Vektorizácia zástupných znakov obrázkov\n\nOpravy\n- 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\n- Oprava zobrazenia na celú obrazovku pomocou 1/4 obrazovky\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/991.txt",
    "content": "Novinky\n• Pridané tlačidlo „Otvoriť v prehliadači“ na paneli chýb\n• Pridaná možnosť na zobrazenia skupiny odberov ako jeden zoznam\n• [YouTube] Pre zdieľanie konkrétneho času videa ako URL podržte prst na segmente streamu\n• Pridané tlačidlo play queue do mini prehrávača\n\nVylepšenia\n• Bola pridaná islandská lokalizácia a boli doplené preklady ostatných jazykov\n• Veľa drobných vylepšení\n\nOpravy\n• Boli opravené viaceré problémy spôsobujúce zlyhanie aplikácie\n• [YouTube] Boli opravené problémy s načítavaním kanálov, nevyhradených informačných kanálov a prehrávaním v niektorých krajinách\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/992.txt",
    "content": "Nové\n- Počet odberateľov v detailoch videa\n- Stiahnutie z frontu\n- Trvalé nastavenie miniatúry zoznamu skladieb\n- Dlhé stlačenie hashtagov a odkazov\n- Režim zobrazenia kariet\n\nVylepšená stránka\n- Väčšie tlačidlo na zatvorenie miniprehrávača\n- Hladšie zmenšovanie miniatúr\n- Cieľový systém Android 13 (API 33)\n- Vyhľadávanie už nepozastavuje prehrávač\n\nOpravená stránka\n- Oprava prekrytia na DeX/myši\n- Povolenie prehrávača na pozadí bez samostatných zvukových tokov\n- Rôzne opravy YouTube a ďalšie…\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/993.txt",
    "content": "Nové\n- Pridanie upozornenia pri pridávaní duplikátov do zoznamu skladieb a pridanie tlačidla na ich odstránenie\n- Umožniť ignorovanie hardvérových tlačidiel\n- Umožniť skrývanie čiastočne sledovaných videí v kanáli\n\nVylepšená stránka\n- Použitie väčšieho počtu stĺpcov mriežky na veľkých obrazovkách\n- Zosúladiť ukazovatele priebehu s nastaveniami\n\nOpravená stránka\n- Oprava otvárania adries URL prehliadača, sťahovania a externých prehrávačov v systéme Android 11+\n- Oprava interakcie s celou obrazovkou vyžadujúcou dve ťuknutia na MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/994.txt",
    "content": "Nové\n• Podpora viacerých zvukových skladieb / jazykov\n• Umožňuje nastaviť objem a jasové gestá na každej strane obrazovky\n• Podpora pre zobrazenie hlavných bodov v dolnej časti obrazovky\n\nZlepšené\n• [Bandcamp] podpora skladieb dostupná pre predplatiteľov\n\nOpravené\n• [YouTube] 403 HTTP chýb pre streamy\n• Čierná obrazovka pri prepínaní do hlavného prehrávača zo zobraznia z playlistu\n• Pretečenie pamäte prehrávača\n• [PeerTube] Avatary uploadera a subkanála boli vymenené\n\na viac\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/995.txt",
    "content": "Nové\n- Podpora kariet kanálov\n- Výber kvality obrázka\n- Získate adresy URL všetkých obrázkov\n\nVylepšené\n- Prístupnosť rozhrania prehrávača\n- Lepší výber zvuku pri sťahovaní videa\n- Možnosť zahrnúť názvy playlistov a videí do zdieľaného obsahu playlistov\n\nOpravené\n- [YouTube] Oprava získavania počtu lajkov\n- Oprava vyskakovacích okien a pádov prehrávača\n- Výber nesprávnych jazykov vo výbere jazyka\n- Zameranie zvuku prehrávača nerešpektovalo stlmenie\n- Občas nefungovalo pridávanie položiek do playlistu\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/996.txt",
    "content": "Opravená výnimka NullPointerException pri otvorení kanála/konferencie v media.ccc.de.\nGrinch sa pokúsil prekaziť náš vianočný darček pre vás, ale opravili sme to.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/997.txt",
    "content": "Nové\n• Pridané odpovede na komentáre\n• Umožnená zmena poradia zoznamov skladieb\n• Zobrazenie popisu a trvania playlistu\n• Umožnené resetovanie nastavení\n\nVylepšené\n• [Android 13+] Obnovenie vlastných akcií upozornenia\n• Vyžiadanie súhlasu na kontrolu aktualizácie\n• Povolenie oznámenia prehrávania/pozastavenia počas načítania\n• Zmena poradia niektorých nastavení\n\nOpravené\n• [YouTube] Oprava nenačítania komentárov, ďalšie opravy a vylepšenia\n• Vyriešenie zraniteľnosti pri importe nastavení a prepnutie na JSON\n• Rôzne opravy sťahovania\n• Orezanie textu vyhľadávania\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/998.txt",
    "content": "Opravené neprehrávanie streamov v YouTube z dôvodu chýb HTTP 403.\n\nObčasné chyby HTTP 403 uprostred videa YouTube ešte nie sú opravené.\nTento problém bude čo najskôr vyriešený v ďalšom opravnom vydaní.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/changelogs/999.txt",
    "content": "Táto verzia opravuje chyby HTTP 403 uprostred videí YouTube.\n\nNové\n- [SoundCloud] Pridanie podpory pre adresy URL on.soundcloud.com\n\nVylepšené\n- [Bandcamp] Zobrazenie dodatočných informácií v rozhlasovom kiosku\n\nOpravené\n- [YouTube] Oprava občasných chýb HTTP 403 na začiatku alebo uprostred videí\n- YouTube] Extrahovanie avatara a banneru z viacerých typov hlavičiek kanálov\n- Bandcamp] Opravené rôzne chyby a vždy používaný protokol HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/sk/full_description.txt",
    "content": "NewPipe nepoužíva Google framework knižnice, ani YouTube API rozhranie. Iba spracováva YouTube stránku aby získal potrebné informácie. Túto aplikáciu je teda možné používať na zariadeniach bez nainštalovaných Google služieb. Taktiež nepotrebujete účet na YouTube. Aplikácia je FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/sk/short_description.txt",
    "content": "Slobodný a nenáročný YouTube prehrávač pre Android.\n"
  },
  {
    "path": "fastlane/metadata/android/sl/changelogs/991.txt",
    "content": "Novo\n- Dodajanje gumba \"Odpri v brskalniku\" v podoknu z napakami\n- Dodana možnost za prikaz skupin kanalov kot seznam\n- [YouTube] Dolgi pritisk na segmente video pretoka za deljenje časovnega žiga URL-ja\n- Dodajte gumb za predvajanje v vrsti v mini predvajalnik\n\nIzboljšave\n- Dodana islandska lokalizacija ter posodobitev številnih drugih prevodov\n- Številne notranje izboljšave\n\nPopravki\n- Odprava večih sesutij\n- [YouTube] Odprava težave z nalaganjem kanalov, nenamenskimi viri ter predvajanjem v nekaterih državah\n"
  },
  {
    "path": "fastlane/metadata/android/sl/short_description.txt",
    "content": "Brezplačen in enostaven YouTube \"frontend\" za Android.\n"
  },
  {
    "path": "fastlane/metadata/android/so/full_description.txt",
    "content": "NewPipe ma isticmaalo wax nidaamka ka shaqaysiinta Google ka ah, ama iskuxidhyada (API) YouTube. Kaliya waxay xogta kasoo rogtaa websiteka YouTube-ka si ay xogta ay u baahantahay u hesho. Sidaa darteed app-kan waxaa lagu isticmaali karaa aaladaha aysa ku jirin Adeegyada Google. Sidoo kale uma baahnid akoon YouTube si aad u isticmaasho NewPipe, waana bilaash waxna waad ka badali kartaa (FLOSS).\n"
  },
  {
    "path": "fastlane/metadata/android/so/short_description.txt",
    "content": "YouTube fudud oo bilaash ah oo loogu talagalay Android.\n"
  },
  {
    "path": "fastlane/metadata/android/sq/changelogs/1000.txt",
    "content": "Përmirësuar\n• Bëni përshkrimin e listës së luajtjes të klikueshme për të treguar më shumë / më pak përmbajtje \n• [PeerTube] Trajtoni lidhjet e shembujve`subscribeto.me` automatikisht \n• Filloni vetëm të luani një artikull të vetëm në ekranin e historisë \nRregulluar\n• U rregulla dukshmëria e butonit RS \n• U rregulluan përplasjet e shikimit të shiritit\n• U rregullua lista e luajtjes së një artikulli më pak tablotë\n• U rregullua dalja nga dialogu i shkarkimit para se të shfaqet \n• U rregulla shfaqja e radhës së listës së artikujve të lidhur \n•U rregullua rendi në shtimin e dialogut të listës së luajtjes \n• U rregullua paraqitja e artikullit të faqerojtësve të listës së luajtjes\n"
  },
  {
    "path": "fastlane/metadata/android/sq/full_description.txt",
    "content": "NewPipe nuk përdor ndonjë bibliotekë kornizash të Google, ose API të YouTube. Ajo vetëm analizon faqen e internetit në mënyrë që të fitojë informacionin që i nevojitet. Prandaj, ky aplikacion mund të përdoret në pajisje pa instaluar Shërbimet e google. Gjithashtu, nuk keni nevojë për një llogari në YouTube për të përdorur NewPipe, dhe është FLOSS\n"
  },
  {
    "path": "fastlane/metadata/android/sq/short_description.txt",
    "content": "Një frontend i lehtë i YouTube falas për Android.\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/63.txt",
    "content": "### Побољшања\n- Увоз/извоз подешавања # 1333\n- Смањите прекорачење (побољшање перформанси) # 1371\n- Мала побољшања кода # 1375\n- Додато све о ГДПР-у # 1420\n\n### Поправљено\n- Менаџер за преузимање: Исправљен пад при учитавању недовршених преузимања из .гига датотека # 1407\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/64.txt",
    "content": "### Побољшања\n- Додата могућност ограничавања квалитета видео записа ако се користе мобилни подаци. # 1339\n- Запамћено осветљеност за сесију # 1442\n- Побољшане перформансе преузимања за слабије процесоре # 1431\n- додата (још се ради) подршку за медијску сесију # 1433\n\n### Поправљено\n- Исправљен пад при отварању преузимања (исправка је сада доступан за избачене верзије) # 1441\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/956.txt",
    "content": "[Јутјуб] Поправљен пад приликом учитавања било ког видео записа\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/967.txt",
    "content": "Сређено што Јутјуб није исправно радио ЕУ. То је изазвано новим колачићем и системом за сагласност о приватности који је захтевао да ЊуПајп постави колачић „CONSENT“.\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/968.txt",
    "content": "Додата опција за детаље канала на дуг притисак.\nДодата могућност за промену назива листе пуштања из сучеља листе.\nМогућост за паузирање док траје баферовање видеа.\nИсполирана светла тема.\nСређено преклапање слова када се користе велики фонтови.\nСређена грешка „нема видеа“ на Формулер и Зефир уређајима.\nСређени разни падови.\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/969.txt",
    "content": "• Могућност инсталације на спољашње складиште\n• Додата могућност приказа само прва три коментара\n• Прикажи само 'преузимање покренуто' поруку када преузимање започне\n• Не поставља „reCaptcha“ колачић када нема сачуваних колачића\n• [Плејер] Побољшано кеширање\n• [Плејер] Сређено што плејер није аутоматски пуштао\n• Одбацивање претходне Снектраке при брисању преузимања\n• Сређен покушај брисања објекта који није на листи\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/970.txt",
    "content": "Ново\n• Приказ метаподатака садржаја (ознаке, категорије, лиценца, ...) испод описа\n• Додата опција „Приказ детаља о каналу“ у удаљеним (не-локалним) листама\n• Додата опција „Отвори у претраживачу“ у менију на дуг притисак\n\nСређено\n• Пад при ротацији на страни детаља видеа\n• Дугме „Пусти са Кодијем“ је увек питало за инсталацију даљинског за Коди\n• Сређено и побољшано одређивање путања за извоз и увоз\n• [Јутјуб] сређен број свиђања за коментаре\nи још доста тога\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/971.txt",
    "content": "Брза исправка\n• Повећан бафер за пуштање након поновног попуњавања\n• Сређен пад на таблетима и ТВ када се кликне на икону „пусти ред“ у плејеру\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/972.txt",
    "content": "Ново\nПрепознавање временских ознака и хеш тагова у описима\nДодата опција за ручни таблет режим\nДодата могућност за сакривање одгледаних ставки на каналу\n\nПобољшано\nПодршка за „Storage Access Framework“\nПонашање при грешкама за недоступне или укинуте канале\nНaслов садржаја се сада исправно приказује за Андроид 10+ кориснике\nОсвежене Индивидоус инстанце и Пајп везе\n\nСређено\n[Јутјуб] старосно ограничени садржај\nПојављивање грешке при отварању дијалога избора\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/994.txt",
    "content": "Ново\n• Подржава више аудио снимака/језика\n• Дозвољава подешавање јачине звука и покрета за осветљење на било којој страни екрана\n• Подршка за приказивање главних картица на дну екрана\n\nПобољшано\n• [Bandcamp] Управљање нумерама иза платног зида\n\nПоправљено\n• [YouTube] 403 HTTP грешке за токове\n• Црни плејер при преласку на главни плејер са приказа плејлисте\n• Цурење сервисне меморије плејера\n• [PeerTube] Аватари отпремаоца и подканала су замењени\n\nи још много тога\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/995.txt",
    "content": "Ново\n• Подршка за картице канала\n• Могућност бирања квалитета слике\n• Набавите URL адресе за све слике\n\nПобољшано\n• Прист. интерф. плејера\n• Бољи избор звука за преузимања само видео снимака\n• Опција за укљ. назива плејлисте и видео сним. у дељ. сад. плејл.\n\nПоправљено\n• [YouTube] Попр. доб. лајкова\n• Попр. проб. када плејер не реаг. на иск. проз. и отказује\n• Изб. погр. јез. у бир. јез.\n• Аудио фокус плејера није пошт. утиш. звук\n• Додавање пред. на плејлисте повр. не функционише\n"
  },
  {
    "path": "fastlane/metadata/android/sr/changelogs/996.txt",
    "content": "Поправљен NullPointerException приликом отварања канала/конференције у media.ccc.de.\nГринч је покушао да вам поквари наш божићни поклон, али смо то поправили.\n"
  },
  {
    "path": "fastlane/metadata/android/sr/full_description.txt",
    "content": "Њупипе не користи никакве књижнице радног окврира Гугла, нити АПИ Јутуба. Само рашчлањује мрежне странице како би добио потребне податке. Из тог разлога, овај програм се може користити на уређајима без уграђених услуга Гугла. Такође, није Вам потребан налог Јутуба ради коришћења Њупипе, a чак је и слободна мекотворина.\n"
  },
  {
    "path": "fastlane/metadata/android/sr/short_description.txt",
    "content": "Слободно и лако сучеље Јутуба за Андроид.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/1000.txt",
    "content": "Förbättrat\n• Gör spellistans beskrivning klickbar för att visa mer / mindre innehåll\n• [PeerTube] Hantera `subscribeto.me` instans länkar automatiskt\n• Börja bara spela enstaka objekt i historik skärmen\n\nFixat\n• Fixat RSS-knappsynlighet\n• Fixat kraschar från sökbar förhandsgranskning\n• Fixat tilläggning av miniatyr-lösa objekt i spellistor\n• Fixat lämnande av nedladdningsdialogen innan den visas\n• Fixat relaterade objekt listans köa popup\n• Fixat ordning i lägg till i spellista dialogruta\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/1001.txt",
    "content": "Förbättrat\n• Tillåt alltid ändring av spelarens meddelandepreferenser på Android 13+\n\nFixat\n• Fixat exporterande av databas/abonnemang som inte trunkerade en redan existerande fil, vilket möjligen lede till en korrupt export\n• Fixat att spelaren återupptog från början när en tidsstämpel klickades på\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/1002.txt",
    "content": "Åtgärdat att YouTube inte spelar någon stream.\n\nDen här versionen fixar enbart det mest brådskande felet som förhindrar att YouTube-videoinformation laddas.\nVi är medvetna om att det finns andra problem, och vi kommer snart att göra en separat version för att lösa dem.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/1003.txt",
    "content": "Detta är en snabbkorrigeringsversion som fixar YouTube-fel:\n• [YouTube] Fixat att ingen videoinformation laddades, fixat HTTP 403 när videor spelas och återställde uppspelningen av några åldersbegränsade videor\n• Fixade att undertexts storleken inte ändrades\n• Fixade att information laddades ner två gånger vid öppning av en ström\n• [Soundcloud] Tog bort ospelbara DRM-skyddade strömmar\n• Uppdaterade översättningar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/1004.txt",
    "content": "Denna version fixar att enbart 360p strömmar var tillgängliga för YouTube.\n\nObservera att den lösning som används i den här versionen är sannolikt tillfällig, och i det långa loppet måste SABR-videoprotokollet implementeras, men TeamNewPipe-medlemmarna är för närvarande upptagna så all hjälp uppskattas! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/1005.txt",
    "content": "Nytt\n• Stöd för Android Auto\n• Flödesgrupper kan ställas in som flikar på huvudskärmen\n• [YouTube] Dela som tillfällig spellista\n• [SoundCloud] Gilla-kanalflik\n\nFörbättrat\n• Bättre tips för sökfältet\n• Visa hämtningsdatum i Hämtningar\n• Använd Android 13 per- app språk\n\nFixat\n• Fixade textfärger i mörkt läge\n• [YouTube] Fixade att spellistor inte laddade mer än 100 objekt\n• [YouTube] Fixade saknade rekommenderade videor\n• Fixade krascher i historiklistvyn\n• Fixade tidsstämplar i kommentarsvar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/1006.txt",
    "content": "# Förbättrat\nBehåll aktuell spelare när du klickar på tidsstämplar\nFörsök att återställa väntande nedladdningsuppdrag när det är möjligt\nLägg till alternativ för att ta bort en nedladdning utan att också ta bort filen\nÖverläggsbehörighet: visa förklarande dialogruta för Android > R\nStöd för att öppna on.soundcloud-länkar\nÅtgärdade formatering av korta antal för Android-versioner under 7\nÅtgärdade Ghost Notifications\nÅtgärdade för SRT-undertextfiler\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/1007.txt",
    "content": "Åtgärdat att YouTube inte spelar någon stream\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/1008.txt",
    "content": "∙ Åtgärdade återupptagning av strömmar vid senaste uppspelningsposition\n∙ [YouTube] Lade till stöd för fler kanal-URL-format\n∙ [YouTube] Lade till stöd för fler videometainfo-format\n∙ Uppdaterade översättningar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/63.txt",
    "content": "### Förbättringar\n- Import/exportinställningar #1333\n- Minskade överdragningen (prestandaförbättring) #1371\n- Små kodförbättringar #1375\n- La till allt om GDPR #1420\n\n### Fixade\n- Nedladdare: Fixade krasch vid laddning av ofärdig nedladdning från .giga filer #1407\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/64.txt",
    "content": "### Förbättringar\n- La till möjligheten all begränsa videokvaliteten vid användning av mobildata. #1339\n- Kom ihåg ljusstyrka för sessionen #1442\n- Förbättra nedladdningsprestandan på svagare CPUs #1431\n- La till (fungerande) support för mediasessioner #1433\n\n### Fixade\n- Fixade krasch vid öppning av nedladdningar (fixen är nu tillgänglig för release builds) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/65.txt",
    "content": "### Förbättringar\n- Stängde av burgarmeny ikonens animation #1486\n- Ångra radering av nedladdningar #1472\n- Nedladdningsalternativ i delningsmenyn #1498\n- Lade till delningsalternativet i menyn för långa tryckningar #1454\n- Minimerar huvudsplearen vid avslut #1354 \n- Uppdatering av biblioteksversion samt åtgärd av databasbackup #1510 \n- Uppdatering av ExoPlayer 2.8.2  #1392\n  - Omarbetad kontroll för uppspelningshastighet för att stödja olika stegstorlekar för snabbare hastighetsändring.\n  - Lade till växelkontroll för att snabbspola vid tystnad i uppspelningens hastighetskontroll. Detta borde vara underlätta vid uppspelning av ljudböcker och vissa musikgenres och kan bidra till en sömlös upplevelse ( och kan pajja en låt med massa tystnad =\\\\).\n  - Omskrivning av källmedias upplösning för att tillåta samtidig rörelse av metadata internt i spelaren, hellre än att utföra detta manuellt. Nu finns endast en källa för metadata som är omedelbart tillgängig så snart uppspelning sker.\n  - Åtgärdat att fjärrspellistors metadata inte uppdateras när nytt metadata är tillgänligt vid öppning av spelliststdelar.\n  - Diverse åtgärder av användargränssnitt: #1383, aviseringar för bakgrundsspelaren är nu alltid vita, lättare att stänga popup-spelare via \"flinging\"\n- Nyttja ny extraherare med omskriven arkitektur för stöd av flera tjänster\n\n### Åtgärdade\n- Åtgärdade #1440 Trasig layout för videoinformation #1491\n- Visningshistorik fix #1497\n- #1495, genom att uppdatera metadata (miniatyrbild, titel och videoantal) så snart användaren får tillgång till spellistan. \n  - #1475, genom att skapa en vy i databasen när användaren startar en video i extern spelare för detaljfragment.\n- Åtgärdade tidsgräns för fönster som är i popup-läge. #1463 (Fixed #640)\n- Åtgärd av primär videospelare #1509 \n  - [#1412] Åtgärdade upprepningsläge vilket orsakade \"null-pointer-exception\" i spelaren när ny avsikt mottas för spelare som arbetar i bakgrunden.\n  - Åtgärdade att spelare utan popup-behörighet inte kraschar vid minimering till popupstorlek av fönstret.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/66.txt",
    "content": "# Ändringslogg för v0.13.7\n\n### Fixat\n- Löser problem med sorteringsfilter i v0.13.6\n\n# Ändringslogg för v0.13.6\n\n### Förbättringar\n\n- Inaktivera animation av ikonerna i burgarmenyn #1486 \n- Ångra radering av nedladdningar #1472 \n- Nedladdningsalternativ i delningsmenyn #1498\n- Minimera huvudspelaren vid avslut #1354 \n  - Omarbetat dialogrutan för kontroll av uppspelningshastighet för att stödja olika stegstorlekar för snabbare hastighetsändring.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/68.txt",
    "content": "# Ändringar i v0.14.1\n\n### Fixat\n- Rättad beskrivning länk som inte extraherade bra #1657\n\n# Ändringar i v0.14.0\n\n#### Nytt\n- Ny utformning av lådan #1461\n- Ny anpassningsbar förstasida #1461\n\n#### Förbättringar\n- Nytt sätt att stänga popup-spelaren #1597\n\n### Fixat\n- Löser fel när antalet prenumerationer inte är tillgängligt. Stänger #1649.\n  - Visa \"Prenumerantantalet är inte tillgängligt\" i dessa fall.\n  - Fixa sökfältet som inte är statiskt utformat.\n  - Fixa länkar i videobeskrivningen.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/69.txt",
    "content": "#### Nytt\n- Användargränssnitt för surfplattor och layout för rutnätslistor #1617 \n\n#### Förbättringar\n- Lagrar och laddar om det senast använda bildförhållandet #1748 \n- Ta bort och dela prenumerationer direkt från prenumerationsfliken #1516 \n- Separata inställningar för volym och ljusstyrka #1644\n- Lägg till stöd för lokalisering #1792\n\n#### Fixat\n- Fixa tidsparsning för . format, så att NewPipe kan användas i Finland.\n- Fixa antalet prenumerationer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/70.txt",
    "content": "OBSERVERA: Denna version är förmodligen en bugfest, precis som den förra. Men på grund av den fullständiga avstängningen sedan den 17. är en trasig version bättre än ingen version. Eller hur? ¯\\_(ツ)_/¯\n\n### Förbättringar\n* nedladdade filer kan nu öppnas med ett klick #1879 \n* ta bort strömmar från den aktuella uppspelningskön genom att svepa dem till höger #1915 \n* ta bort automatiskt köade strömmar när en ny ström köas manuellt #1878 \n\n#### Fixat\n* Popup-spelare krasch fixad #1874\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/71.txt",
    "content": "#### Förbättringar\n* Olika förbättringar av nedladdaren (#1944 av @kapodamy):\n  * Kontrollera om iteratorn är initialiserad (rättar #2031).\n  * Tillåter att nedladdningar med felet \"post-processing failed\" (efterbearbetning misslyckades) kan göras om i den nya muxern.\n  * Den nya MPEG-4-mixern fixar icke-synkrona video- och ljudströmmar (#2039).\n\n### Fixat\n* YouTube live streams slutar spelas upp efter en kort tid (#1996 av @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/730.txt",
    "content": "# Fixade\n- Snabbfixade avkrypteringsfunktionen igen.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/740.txt",
    "content": "<h4>Förbättringar</h4>\n<ul>\n<li>Gör länkar i kommentarer klickbara, öka textstorleken</li>\n<li>visa önskad flik baserat på nyligen valt tillstånd</li>\n<li>lägga till \"dela vid aktuell tidpunkt\" knappen till huvudvideospelaren</li>\n<li>lägg till \"Spela direkt i bakgrunden\" till longpress-menyn för videolistobjekt</li>\n</ul>\n<h4>Fixat</h4>\n<ul>\n<li>fixade import av youtube-prenumerationer: ignorerar dem med ogiltig url och behåller dem med tom titel</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/750.txt",
    "content": "Nytt\nUppspelning återupptas #2288\nFörbättringar av nedladdaren #2149 \n\n\nFörbättrad\n- Gör menyer med lång tryckning konsekventa #2368\n\nFixat\n- Kraschar inte när kontrollen av appuppdatering misslyckas (GitHub-version) #2423 \n- Fixade nedladdningar som fastnade på 99,9 % #2440\n- Uppdatera metadata för uppspelningsköer #2453 \n- [SoundCloud] Fastställd krasch vid laddning av spellistor TeamNewPipe/NewPipeExtractor#170\n- YouTube] Fast varaktighet kan inte pareras TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/760.txt",
    "content": "Ändringar i 0.17.1\n\nFixat\n- Fixa försvinnande knappar i nedladdningsvyn när man byter app #2487\n- Fixa att uppspelningspositionen sparas även om bevakningshistoriken är inaktiverad.\n\n\n\nÄndringar i 0.17.0\n\nNytt\nÅterupptagning av uppspelning #2288\nFörbättringar av nedladdaren #2149 \n\nFörbättrad\n- Gör menyer med långtryckning konsekventa #2368\n\nFixat\n- Kraschar inte när kontrollen av appuppdatering misslyckas (GitHub-version) #2423 \n- Fixade nedladdningar som fastnade på 99,9 % #2440\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/770.txt",
    "content": "Ändringar i 0.17.2\n\nFixar\n• Fixade inga videor tillgängliga\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/780.txt",
    "content": "Ändringar i 0.17.3\n\nFörbättrat\n- Lägg till möjligheten att rensa uppspelningstillstånd #2550\n- Visa dolda kataloger i filväljaren #2591\n- Stöd för URL:er från `invidio.us`-instanser som öppnas med NewPipe #2488 \n- Lägg till stöd för webbadresser för `music.youtube.com` TeamNewPipe/NewPipeExtractor#194\n\nFixade\n- [YouTube] Fastställande av att liveströmmar inte fungerade TeamNewPipe/NewPipeExtractor#195\n- Fastställt prestandaproblem i android pie när man laddar ner en stream #2592\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/790.txt",
    "content": "Förbättrad\n- Lägg till fler titlar för att förbättra tillgängligheten för blinda #2655\n- Språket i inställningen för nedladdningsmappen blir mer konsekvent och mindre tvetydigt #2637\n\nRättad\n- Kontrollera om sista byte i blocket laddas ner #2646\n- Fastställd rullning i videodetaljfragment #2672\n- Ta bort dubbla animationer av sökrutan till en enda #2695\n- [SoundCloud] Fixa utvinning av client_id #2745\n\nUtveckling\n- Lägg till saknade beroenden som ärvts från NewPipeExtractor i NewPipe #2535\n- Migrera till AndroidX #2685\n- Uppdatering till ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/800.txt",
    "content": "Nytt\n• Stöd för PeerTube utan P2P (#2201) [Beta]:\n  ◦ Titta på och ladda ner videor från PeerTube-instanser\n  ◦ Lägg till instanser i inställningarna för att få tillgång till hela PeerTube-världen\n  ◦ 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.\n\nOch mycket mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/810.txt",
    "content": "Nytt\n• Visa videominiatyr på låsskärmen när videon spelas upp i bakgrunden\n\nOch mycket mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/820.txt",
    "content": "Fixade avkrypteringsfunktionens namn regex som gjorde YouTube obrukbar.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/830.txt",
    "content": "Uppdaterade SoundCloud client_id för att fixa SoundCloud problem.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/840.txt",
    "content": "Nytt\n• Lagt till språkväljare för att ändra appens språk\n• Lägg till knappen Skicka till Kodi i spelarens hopfällbara meny\n• Lagt till möjlighet att kopiera kommentarer vid lång tryck\n\nOch mycket mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/850.txt",
    "content": "I denna utgåvan var YouTube versionen uppdaterad. Den gamla hemsideversionen kommer att bli nedstängd i mars och därför måste du uppdatera NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/860.txt",
    "content": "Förbättrat\n• Spara och återställ om tonhöjd och tempo är avkopplade eller inte\n• Stöd för skärmutskärning i spelare\n• Runda antalet visningar och prenumeranter\n• Optimerat YouTube för att använda mindre data\n\nMer än 15 YouTube-relaterade buggar har åtgärdats i denna version.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/870.txt",
    "content": "Detta är en hotfix-version som uppdaterar NewPipe så att du kan använda SoundCloud utan större problem igen.\nSoundCloud's v2 API används nu i extraktorn och upptäckten av ogiltiga klient-ID:n har förbättrats.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/900.txt",
    "content": "Nytt\n• Prenumerationsgrupper och sorterade flöden\n• Mute-knapp i spelare\n\nFörbättrat\n• Tillåt öppning music.youtube.com och media.ccc.de länkar i NewPipe\n• Flytta två inställningar från Utseende till Innehåll\n• Dölj sökalternativ på 5, 15, 25 sekunder om inexakt sökning är aktiverad\n\nFixat\n• vissa WebM-videor kan inte sökas\n• databas backup på Android P\n• krasch när du delar en nedladdad fil\n• massor av YouTube problem och mer ...\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/910.txt",
    "content": "Fixade databasmigrering som hindrade NewPipe från att starta i vissa sällsynta fall.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/920.txt",
    "content": "Förbättrat\n\n• Lagt till uppladdningsdatum och visningsantal på strömrutnätobjekt\n• Förbättringar för lådhuvudets layout\n\nFixat\n\n• Fixat mute-knapp som orsakar kraschar på API 19\n• Fixat nedladdning av långa 1080p 60fps videor\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/930.txt",
    "content": "Nytt\n• Sök på YouTube Music\n• Grundläggande Android TV-stöd\n\nFörbättrat\n• Lade till möjligheten att ta bort alla visade videor från en lokal spellista\n• Visa meddelande när innehåll inte stöds ännu istället för att krascha\n• Förbättrade ändring av popup-spelarens storlek med nyp gester\n• Köa strömmar på långa tryck på bakgrund och popup-knappar i kanalen\n• Förbättrad storlekshantering av lådans rubriktitel\n\nOch mycket mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/940.txt",
    "content": "Nytt\n• Lägg till stöd för SoundCloud-kommentarer\n• Lägg till inställning för begränsat läge på YouTube\n• Visa information om PeerTubes överordnade kanal\n\nFörbättrat\n• Visa Kore-knappen endast för tjänster som stöds\n• Blockera spelargester som börjar vid navigations baren eller status baren\n• Ändra återförsök och prenumerera knappar bakgrundsfärg baserat på servicefärg\n\nOch mycket mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/950.txt",
    "content": "Den här versionen innehåller tre små korrigeringar:\n• Fixade lagringsåtkomst på Android 10+\n• Fixade öppningskiosker\n• Fixade varaktighetstolkning av långa videor\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/951.txt",
    "content": "Nytt\n• Lägg till sökning efter prenumerationsväljare i dialogrutan för flödesgrupp\n• Lägg till filter i dialogrutan för flödesgrupp för att endast visa ogrupperade prenumerationer\n• Lägg till fliken spellista på huvudsidan\n• Snabbspolning framåt / bakåt i bakgrund / popup-spelarkö\n• Visa sökförslag: menade du & visar resultat för\n\nOch mycket mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/952.txt",
    "content": "Förbättrat\n• Automatisk spelning är tillgängligt för alla tjänster (istället för bara YouTube)\n\nFixat\n• Fixade relaterade strömmar genom att stödja YouTubes nya fortsättningar\n• Fixade åldersbegränsade YouTube-videor\n• [Android TV] Fixade kvardröjande fokus markerade överlägg\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/953.txt",
    "content": "Fixade extraktion av YouTubes dekrypteringsfunktion.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/954.txt",
    "content": "• nytt arbetsflöde för applikationen: spela upp videor på detalj-sidan, dra nedåt för att minimera spelaren\n• MediaStyle-aviseringar: anpassningsbara åtgärder i aviseringar, prestanda-förbättringar\n• grundläggande storleksändring när NewPipe används som en skrivbordsapp\n\n• visa ett dialogfönster med öppna alternativ i händelse av en URL-toast som inte stöds\n• Förbättra sökförslagsupplevelsen när avlägsna sökningar inte kan hämtas\n• Ökad standardvideokvalitet till 720p60 (spelare i appen) och 480p (popup-spelare)\n\n• tonvis med buggfixar och mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/955.txt",
    "content": "[YouTube] Fixade sökningen för vissa användare\n[YouTube] Fixade slumpmässiga dekrypteringsundantag\n[SoundCloud] URL:er som slutar med ett snedstreck analyseras nu korrekt\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/956.txt",
    "content": "[YouTube] Fixade krasch vid laddning av en video\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/957.txt",
    "content": "• Förenade specifika kö åtgärder\n• Två finger gest att stänga spelare\n• Tillåt rensning av reCAPTCHA-cookies\n• Inställning för att inte färglägga meddelande\n• Förbättra hur videoinformation öppnas för att fixa oändlig buffring, buggigt beteende när du delar till NewPipe och andra inkonsekvenser\n• Snabba upp YouTube-videor och fixa åldersbegränsning\n• Fixa krasch vid snabb fram/bak spolning\n• Ordna inte listor genom att dra miniatyrer\n• Kom alltid ihåg popup egenskaper\n• Lägga till Santali språk\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/958.txt",
    "content": "Nytt och förbättrat:\n• La till inställning för att dölja miniatyr på låsskärmen\n• Dra för att uppdatera flöde\n• Förbättrad prestanda vid hämtning av lokala listor\n\nFixat:\n• Fixade krasch när du startar NewPipe efter att den togs bort från RAM\n• Fixade krasch vid start när det inte finns någon internetanslutning\n• Fixade respekt för ljusstyrka- och volymgestinställningar\n• [YouTube] Fixade långa spellistor\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/959.txt",
    "content": "Fixade en oändlig kraschloop när felrapporteringsverktyget öppnats.\nUpdaterade listan av PeerTube-instanser som NewPipe kan öppna automatiskt.\nUpdaterade översättningarna.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/960.txt",
    "content": "• Förbättrad beskrivning av exportdatabasalternativet i inställningar.\n• Fixade analys av YouTube-kommentarer.\n• Fixade visningsnamn för media.ccc.de tjänsten.\n• Uppdaterade översättningar.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/961.txt",
    "content": "• [YouTube] Mix stöd\n• [YouTube] Visa information om offentliga programföretag och Covid-19\n• [media.ccc.de] La till nya videor\n• La till somalisk översättning\n\n• Många interna förbättringar\n\n• Fixade delning av videor ifrån spelaren\n• Fixade blank ReCaptcha webview\n• Fixade krasch som inträffade när du tar bort en ström från en lista\n• [PeerTube] Fixade relaterade strömmar\n• [YouTube] Fixade YouTube Musiksökning\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/962.txt",
    "content": "Lade till \"senaste\" videor till media.ccc.de tjänsten.\nLade till live sändningar till tjänsten media.ccc.de och stöd för live sändningar.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/963.txt",
    "content": "• [YouTube] Fixade kanal fortsättning\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/964.txt",
    "content": "• La till stöd för kapitel i spelarkontroller\n• [PeerTube] La till Sepia-sökning\n• La till dela knappen i videodetaljvy och flyttad strömbeskrivning till flik layouten\n• Inaktivera återställande av ljusstyrka om ljusstyrks gest är inaktiverad\n• Lägg till listobjekt för att spela video på kodi\n• Fixade krasch när ingen standardwebbläsare är inställd på vissa enheter och förbättrade dela dialog\n• Växla spela/pausa med hårdvaru mellanslags knapp i fullskärm\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/965.txt",
    "content": "Fixade krasch som inträffade vid förflyttning av kanalgrupper.\nFixade hämtning av fler YouTube videor från kanaler och spellistor.\nFixade hämtning av YouTube kommentarer.\nLa till stöd för /watch /, /v / och /w / subpaths i YouTube adresser.\nFixade extraktion av SoundCloud klient id och geobegränsat innehåll.\nLa till nordkurdisk lokalisering.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/966.txt",
    "content": "Nytt:\n• La till en ny tjänst: Bandcamp\n\nFörbättrat:\n• Lägg till en inställning för att appen ska följa enhetstemat\n• Förhindra vissa kraschar genom att visa en förbättrad felpanel\n• Visa mer information om varför innehåll är otillgängligt\n• Hårdvaru mellanslagsknapp ändrar spela/pausa\n• Visa \"Nedladdning startad\" toast\n\nFixat:\n• Fixade liten miniatyr i videodetaljer medan du spelar i bakgrunden\n• Fixade tom titel i minimerad spelare\n• Fixade senaste storleksläge som inte återställdes korrekt\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/967.txt",
    "content": "Löste problemet med att YouTube inte fungerade korrekt i EU. Detta berodde på ett nytt system för cookies och samtycke till sekretess som kräver att NewPipe ställde in en CONSENT cookie.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/968.txt",
    "content": "La till kanalinformationsalternativ i långtrycksmenyn.\nLa till funktionalitet för att byta namn från spellistans gränssnitt.\nLåt användaren pausa medan en video buffrar.\nPolerade det ljusa temat.\nFixade överlappande teckensnitt när du använder en större teckenstorlek.\nFixade ingen video på Formuler och Zephier enheter.\nFixade olika kraschar.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/969.txt",
    "content": "• Tillåt installation på extern lagringsenhet\n• [Bandcamp] Stöd för att visa de tre första kommentarerna i en stream har lagts till.\n• Visa endast \"nedladdning har börjat\" när nedladdningen har påbörjats.\n• Ställ inte in reCaptcha-cookie när det inte finns någon cookie lagrad.\n• [Player] Förbättra prestanda för cache\n• [Player] Åtgärdat ej automatisk uppspelning\n• Avskaffa tidigare Snackbars när nedladdningar raderas\n• Åtgärdat försök att radera objekt som inte finns i listan\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/970.txt",
    "content": "Nytt\n• Visa innehåll metadata (taggar, kategorier, licens, ...) under beskrivningen\n• Lägg till alternativet \"Visa kanalinformation\" i distans (icke-lokala) spellistor\n• Lägg till \"Öppna i webbläsare\" -alternativ för långtrycksmeny\n\nFixat\n• Fixade rotations krasch på video detalj sida\n• Fixade \"Spela med Kodi\" knappen i spelaren som alltid uppmanade till att installera Kore\n• Fixade och förbättrad inställning av import och exportvägar\n• [YouTube] Fixade kommentarers gilla antal\nOch mycket mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/971.txt",
    "content": "Hotfix\n• Öka bufferten för uppspelning efter återbuffring\n• Fixade krasch på surfplattor och TV-apparater när du klickade på spelköikonen i spelaren\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/972.txt",
    "content": "Nytt\nKänner igen tidsstämplar och hashtaggar i beskrivningar\nLa till manuell inställning för surfplatteläge\nLa till möjlighet att dölja spelade objekt flöde\n\nFörbättrat\nKorrekt stöd för Storage Access Framework\nBättre felhantering av otillgängliga och avslutade kanaler\nAndroid share sheet för Android 10+-användare visar nu innehållets titel\nUppdaterade Invidious-instanser och stöd för Piped-länkar\n\nFixat\n[YouTube] Innehåll med åldersgräns\nFörhindrar leaked window Exception när valdialog öppnas\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/973.txt",
    "content": "Hotfix\n• Åtgärda miniatyrer och titlar som klipptes av i rutnätslayouten på grund av en felaktig beräkning av hur många videor som får plats på en rad\n• Fixa att nedladdningsdialogrutan försvinner utan att göra något om den öppnas från delningsmenyn\n• Uppdatera ett bibliotek relaterat till att öppna externa aktiviteter som filväljaren Storage Access Framework\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/974.txt",
    "content": "Hotfix\n• Åtgärda buffringsproblem som orsakas av YouTube strypning\n• Åtgärda extraktion av YouTube kommentarer och kraschar med inaktiverade kommentarer\n• Fixade YouTube musiksökning\n• Fixade PeerTube live sändningar\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/975.txt",
    "content": "Nytt\n• Visa en miniatyr förhandsvisning medan du söker\n• Upptäck avstängda kommentarer\n• Tillåt markering av ett flödesobjekt som visat\n• Visa kommentar hjärtan\n\nFörbättrat\n• Förbättrade metadata och tagg layout\n• Applicera service färg till UI komponenter\n\nFixat\n• Fixade miniatyrbild i minispelare\n• Fixade oändlig buffring på dubbla köartiklar\n• Vissa spelare fixar som rotation och snabbare stängning\n• Fixade ReCAPTCHA som var kvar i bakgrunden\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/976.txt",
    "content": "• La till alternativ för att direkt öppna spelare i fullskärm\n• Tillåt användaren att välja vilka typer av sökförslag som ska visas\n• Mörkt tema är nu mörkare + mörk startskärm tillagd\n• Förbättrade fil väljare att gråa ut oönskade filer\n• Fixade import av YouTube prenumerationer\n• Att spela en ström kräver tryck på spela knappen igen\n• [Android TV] Fixa långa sökbar hopp vid användning av en DPad\n\nFör att se ytterligare ändringar, se ändringsloggen (och blogginlägg) från Länkfliken nedan.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/977.txt",
    "content": "• La till \"spela nästa\" i menyn för långtryckning\n• Tillägg av prefix för sökvägen till YouTube shorts i avsiktsfiltret\n• Fixade Inställningar import\n• Byte position för förloppsindikatorn med spelarknapparna på Köskärmen\n• Olika korrigeringar gällande MediasessionManager\n• Fixade att förloppsindikatorn inte var färdig efter videons slut\n• Inaktiverade mediatunnling på RealtekATV\n• Och mer...\n\nFör att se ytterligare ändringar, se ändringsloggen (och blogginlägget) under fliken Länkar nedan.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/978.txt",
    "content": "Fixade kontrollen av en ny NewPipe-version. Denna kontroll utfördes ibland för tidigt och ledde därför till att appen kraschade. Detta bör vara åtgärdat nu.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/979.txt",
    "content": "- Fixade återupptagning av uppspelning\n- Förbättringar för att se till så att tjänsten som avgör om NewPipe ska kontrollera om en ny version kontrolleras inte startas i bakgrunden\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/980.txt",
    "content": "Nytt\n• La till \"Lägg till i spellista\" alternativ i delningsmenyn\n• La till stöd för y2u.be och PeerTube kort länkar\n\nFörbättrat\n• Gjorde uppspelningshastighetskontrollerna mer kompakta\n• Flödet markerar nya objekt nu\n• \"Visa bevakade objekt\" alternativet i flödet sparas nu\n\nFixat\n• Fixade YouTube tumme upp och tumme ner extraktion\n• Fixade automatisk uppspelning efter återkomst från bakgrunden\nOch mycket mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/981.txt",
    "content": "Tog bort stödet för MediaParser för att åtgärda fel i återupptagningen av uppspelning efter buffring på Android 11+. \nInaktiverade media tunneling på Philips QM16XE för att åtgärda uppspelningsproblem.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/982.txt",
    "content": "Fixade att YouTube inte spelade någon stream.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/983.txt",
    "content": "La till nytt dubbel tryck för att söka UI och beteende\nGör inställningar sökbara\nMarkera fäst kommentarer som sådana\nLägg till öppna med app stöd för FSFE PeerTube instans\nLägg till felmeddelanden\nFixade repris av första kö objekt vid spelar förändring\nVänta längre vid buffring under livestreams innan misslyckande\nFixade ordning av lokala sökresultat\nFixade tomma objektfält i spelkö\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/984.txt",
    "content": "Ladda in tillräckligt många inledande objekt i listor för att fylla hela skärmen och för att åtgärda rullning på surfplattor och TV-apparater\nFixa slumpmässiga krascher vid rullning i listor\nLät spelarens snabbsöks funktion gå under systemets användargränssnitt\nTog bort ändringar av utskärningar när man spelar i flera fönster, vilket orsakade en felplacerad spelare på vissa telefoner\nÖka compileSdk från 30 till 31\nUppdatera biblioteket för felrapportering\nRefaktorisering av viss kod i spelaren\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/985.txt",
    "content": "Åtgärdat att YouTube inte spelar någon stream\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/986.txt",
    "content": "Nytt\n• Avisering för nya strömningar\n• Sömlös övergång mellan bakgrund och videospelare\n• Ändra pitch av semitoner\n• Lägg till huvudspelarens kö i en spellista\n\nFörbättrat\n• Kom ihåg hastighet/pitch steg storlek\n• Mildra initial lång buffring i videospelaren\n• Förbättra spelarens UI för Android TV\n• Bekräfta innan borttagning av alla nedladdade filer\n\nFixat\n• Fixade media knapp som inte gömde spelarkontroller\n• Fixade uppspelningsåterställning vid spelar förändring\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/987.txt",
    "content": "Nytt\n• Stöd andra leveransmetoder än progressiv HTTP: snabbare uppspelningstid, fixar för PeerTube och SoundCloud, uppspelning av nyligen avslutade YouTube strömmar\n• La till knapp för att lägga till en fjärrspellista till en lokal\n• Bildförhandsvisning i Android 10+ dela blad\n\nFörbättrat\n• Förbättrade uppspelningsparametrar dialog\n• Flytta abonnemang import/exportknappar till trepunktsmenyn\n\nFixat\n• Fixade ta bort tittade videor från spellista\n• Fixade dela meny tema och \"lägg till i spellista\"\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/988.txt",
    "content": "[YouTube] Fixade \"Kan inte få någon ström\" fel vid spelning av någon video\n[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\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/989.txt",
    "content": "• [YouTube] Fixade oändlig laddning vid försök att spela någon video\n• [YouTube] Fixade throttling på vissa videor\n• Uppgraderade jsoup-biblioteket till 1.15.3, vilket inkluderar en säkerhetsfix\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/990.txt",
    "content": "Denna version avslutar stödet för Android 4.4 KitKat, nu är den minsta versionen Android 5 Lollipop!\n\nNytt\n• Ladda ner från lång-tryck menyn\n• Dölj framtida videor i flödet\n• Dela lokala spellistor\n\nFörbättrat\n• Refaktorera spelarkoden i små komponenter: mindre RAM används, mindre buggar\n• Förbättra miniatyrernas skalläge\n• Vectorisera bildplatshållare\n\nFixat\n• Fixade problem med spelarens meddelande: föråldrad/saknad media info, förvrängd miniatyr\n• Fixade fullskärm som använde 1/4 av skärmen\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/991.txt",
    "content": "Nytt\n• Lägg till \"Öppna i webbläsare\" knappen i felpanel\n• Lägg till inställning för att visa kanalgrupper som lista\n• [YouTube] Långtryck på strömsegment för att dela tidsstämpel URL\n• Lägg till play kö knapp till minispelare\n\nFörbättrat\n• Lägg till isländsk lokalisering och uppdatera många andra översättningar\n• Många interna förbättringar\n\nFixat\n• Fixade flera kraschar\n• [YouTube] Fixade laddning av kanaler, icke-dedikerade flöden och uppspelningsproblem i vissa länder\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/992.txt",
    "content": "Nytt\n• Prenumerant antal i videodetaljer\n• Ladda ner från kön\n• Ställ in en permanent miniatyr fr spellista\n• Långtryckt hashtags och länkar\n• Kortvys läge\n\nFörbättrat\n• Större minispelar stäng knapp\n• Mjukare miniatyrs nedskalning\n• Sikta på Android 13 (API 33)\n• Sökning pausar inte längre spelaren\n\nFixat\n• Fixade overlay på DeX/Mouse\n• Tillåt bakgrundsspelare utan separata ljudströmmar\n• Olika YouTube-fixar och mer…\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/993.txt",
    "content": "Nytt\n• La till varning vid tilläggning av dubbletter i spellista och la till knapp för att ta bort dem\n• Tillåt ignorering av hårdvaruknappar\n• Tillåt att dölja delvis tittade videor från flödet\n\nFörbättrat\n• Använd fler rutnät kolumner på stora skärmar\n• Gör framstegsindikatorer konsekventa med inställningar\n\nFixat\n• Fixade öppning av webbläsar URLs, nedladdningar och externa spelare på Android 11+\n• Fixade interaktion med helskärm som kräver två tryck på MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/994.txt",
    "content": "Nytt\n• Stöd flera ljudspår/språk\n• Tillåt inställning av volym och ljusstyrks gester på valfri sida av skärmen\n• Stöd för att visa huvudflikar längst ner på skärmen\n\nFörbättrat\n• [Bandcamp] Hantera spår bakom betalvägg\n\nFixat\n• [YouTube] 403 HTTP-fel för strömmar\n• Svart spelare vid byte till huvudspelare från spellistans vy\n• Spela service minnesläckor\n• [PeerTube] Uppladdare och sub kanal avatarer var utbytta\n\noch mer\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/995.txt",
    "content": "Nytt\n• Stöd kanalflikar\n• Välj bildkvalitet\n• Få webbadresser till alla bilder\n\nFörbättrat\n• Tillgänglighet för spelargränssnitt\n• Bättre ljudval för endast video nedladdningar\n• Alternativ att inkludera spellista och videonamn till delat spellistinnehåll\n\nFixat\n• [YouTube] Fixade hämtning av gillaantal\n• Fixade spelare som inte svarar popup och kraschar\n• Val av fel språk i språkväljare\n• Spelarens ljudfokus respekterade inte mute\n• Spellist-objekt addition som ibland inte fungerade\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/996.txt",
    "content": "Fixade en NullPointerException när du öppnar en kanal / konferens i media.ccc.de.\nGrinchen försökte förstöra vår julklapp till er, men vi fixade den.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/997.txt",
    "content": "Nytt\n• La till kommentars svar\n• Tillåt omordnande av spellistor\n• Visa spellistors beskrivning och varaktighet\n• Tillåt återställning av inställningar\n\nFörbättrat\n• [Android 13+] Återställ anpassade aviserings åtgärder\n• Begär samtycke för uppdateringskontroll\n• Tillåt spela/pausa från avisering under buffring\n• Omordnade några inställningar\n\nFixat\n• [YouTube] Fixade kommentarer som inte laddas\n• Lös sårbarhet i inställnings import och byt till JSON\n• Olika hämtnings fixar\n• Trimma sök text\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/998.txt",
    "content": "Åtgärdat att YouTube inte spelar någon ström på grund av HTTP 403 fel.\n\nHTTP 403 fel som ibland uppstår mitt i en YouTube-video är inte åtgärdade ännu.\nDet problemet kommer att åtgärdas i en annan uppdatering så snart som möjligt.\n"
  },
  {
    "path": "fastlane/metadata/android/sv/changelogs/999.txt",
    "content": "Denna uppdatering löser HTTP 403 fel i mitten av YouTube-videor.\n\nNytt\n• [SoundCloud] Lägg till stöd för on.soundcloud.com URLs\n\nFörbättrat\n• [Bandcamp] Visa ytterligare information i radio kiosk\n\nFixat\n• [YouTube] Löst tillfälliga HTTP 403 fel i början eller i mitten av videor\n• [YouTube] Extrahera avatar och banner från fler kanalhuvudtyper\n• [Bandcamp] Fixat olika buggar och använd alltid HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/sv/full_description.txt",
    "content": "NewPipe använder inte något av Googles ramverksbibliotek, eller YouTubes API. Den parsar bara webbplatsen för att få tag på den information den behöver. Därför kan denna app användas på enheter som inte har Google Services installerat. Du behöver inte heller ha ett YouTube-konto för att använda NewPipe, och det är FLOSS (free/libre/open-source software).\n"
  },
  {
    "path": "fastlane/metadata/android/sv/short_description.txt",
    "content": "En gratis lättviktsklient för YouTube för Android.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/1000.txt",
    "content": "மேம்படுத்தப்பட்டது \n• அதிகமான / குறைவான உள்ளடக்கத்தைக் காட்ட, பிளேலிச்ட் விளக்கத்தை சொடுக்கு செய்யக்கூடியதாக மாற்றவும் \n• [PeerTube] தானாகவே `subscribeto.me` நிகழ்வு இணைப்புகளைக் கையாளவும் \n• வரலாற்றுத் திரையில் ஒற்றை உருப்படியை மட்டும் இயக்கத் தொடங்குங்கள் \n\nசரி செய்யப்பட்டது \n• RSS பொத்தான் தெரிவுநிலையை சரிசெய்யவும் \n• சீக்பார் முன்னோட்ட செயலிழப்புகளை சரிசெய்யவும் \n• சிறுபடம் இல்லாத உருப்படியை பிளேலிச்ட் செய்வதை சரிசெய்யவும் \n• பதிவிறக்க உரையாடல் தோன்றும் முன் அதிலிருந்து வெளியேறுவதைச் சரிசெய்யவும் \n• தொடர்புடைய உருப்படிகளின் பட்டியல் என்கியூ பாப்அப்பை சரிசெய்யவும் \n• பிளேலிச்ட் உரையாடலில் சேர்க்கும் வரிசையை சரிசெய்யவும் \n• பிளேலிச்ட் புத்தகக்குறி உருப்படி தளவமைப்பைச் சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/1001.txt",
    "content": "மேம்படுத்தப்பட்டது\n And ஆண்ட்ராய்டு 13+ இல் பிளேயர் அறிவிப்பு விருப்பங்களை மாற்ற எப்போதும் அனுமதிக்கவும்\n\n சரி\n Evatualation ஏற்றுமதி தரவுத்தளம்/சந்தாக்கள் ஏற்கனவே இருக்கும் கோப்பைக் குறைக்காது, இது சிதைந்த ஏற்றுமதிக்கு வழிவகுக்கும்\n Time ஒரு நேர முத்திரையைக் சொடுக்கு செய்யும் போது தொடக்கத்திலிருந்து மீண்டும் தொடங்குவதை சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/1002.txt",
    "content": "நிலையான YouTube எந்த ச்ட்ரீமையும் இயக்கவில்லை. \n\nஇந்த வெளியீடு யூடியூப் வீடியோ விவரங்களை ஏற்றுவதைத் தடுக்கும் மிக அழுத்தமான பிழையை மட்டுமே குறிக்கிறது. \nவேறு சிக்கல்கள் இருப்பதை நாங்கள் அறிவோம், அவற்றை தீர்க்க விரைவில் ஒரு தனி வெளியீட்டை உருவாக்குவோம்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/1003.txt",
    "content": "இது YouTube பிழைகளை சரிசெய்யும் ஆட்ஃபிக்ச் வெளியீடு: \n• [YouTube] எந்த வீடியோ தகவலையும் ஏற்றாததை சரிசெய்யவும், வீடியோக்களை இயக்கும்போது HTTP 403 பிழைகளை சரிசெய்யவும், சில வயதுக்கு தடைசெய்யப்பட்ட வீடியோக்களின் பின்னணியை மீட்டெடுக்கவும் \n• தலைப்பு அளவுகள் மாற்றப்படவில்லை \nStramp ஒரு ச்ட்ரீமை திறக்கும்போது தகவலைப் பதிவிறக்குவதை இரண்டு முறை சரிசெய்யவும் \n• [சவுண்ட்க்ளூட்] விளையாட முடியாத டிஆர்எம்-பாதுகாக்கப்பட்ட நீரோடைகளை அகற்று \n• புதுப்பிக்கப்பட்ட மொழிபெயர்ப்புகள்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/1004.txt",
    "content": "நிலையான யூடியூப் எந்த ச்ட்ரீமையும் இயக்கவில்லை\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/1005.txt",
    "content": "புதியது \n• ஆண்ட்ராய்டு Autoக்கான ஆதரவைச் சேர்க்கவும் \n• ஊட்ட குழுக்களை முதன்மையான திரை தாவல்களாக அமைக்க அனுமதிக்கவும் \n• [YouTube] தற்காலிக பிளேலிச்ட்டாகப் பகிரவும் \n• [SoundCloud] சேனல் தாவலை விரும்புகிறது \n\nமேம்படுத்தப்பட்டது \n• சிறந்த தேடல் பட்டி குறிப்புகள் \n• பதிவிறக்கங்களில் பதிவிறக்க தேதியைக் காட்டு \n• ஒவ்வொரு ஆப்ச் மொழிக்கும் ஆண்ட்ராய்டு 13ஐப் பயன்படுத்தவும் \n\nசரி செய்யப்பட்டது \n• உடைந்த உரை வண்ணங்களை இருண்ட பயன்முறையில் சரிசெய்யவும் \n• [YouTube] 100 உருப்படிகளுக்கு மேல் ஏற்றப்படாமல் இருக்கும் பிளேலிச்ட்களை சரிசெய்யவும் \n• [YouTube] விடுபட்ட பரிந்துரைக்கப்பட்ட வீடியோக்களை சரிசெய்யவும் \n• வரலாறு பட்டியல் காட்சியில் சிதைவுகளைச் சரிசெய்யவும் \n• கருத்து பதில்களில் நேர முத்திரைகளை சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/1006.txt",
    "content": "# மேம்படுத்தப்பட்டது \nநேர முத்திரைகளைக் சொடுக்கு செய்யும் போது தற்போதைய பிளேயரை வைத்திருங்கள் \nமுடிந்தால், நிலுவையிலுள்ள பதிவிறக்கப் பணிகளை மீட்டெடுக்க முயற்சிக்கவும் \nகோப்பை நீக்காமல் பதிவிறக்கத்தை நீக்க விருப்பத்தைச் சேர்க்கவும் \nமேலடுக்கு அனுமதி: Android > R க்கான விளக்க உரையாடலைக் காண்பி \nஉதவி on.soundcloud இணைப்பு திறப்பு \nநிறைய சிறிய மேம்பாடுகள் மற்றும் மேம்படுத்தல்கள் \n\n# சரி செய்யப்பட்டது \n7க்குக் கீழே உள்ள ஆண்ட்ராய்டு பதிப்புகளுக்கான குறுகிய எண்ணிக்கை வடிவமைப்பைச் சரிசெய்யவும் \nபேய் அறிவிப்புகளை சரிசெய்யவும் \nSRT வசனக் கோப்புகளுக்கான திருத்தங்கள் \nநிலையான டன் விபத்துக்கள் \n\n#வளர்ச்சி \nஉள் குறியீடு நவீனமயமாக்கல்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/1007.txt",
    "content": "நிலையான யூடியூப் எந்த ச்ட்ரீமையும் இயக்கவில்லை\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/1008.txt",
    "content": "∙ கடைசி பிளேபேக் நிலையில் நிலையான ரெச்யூமிங் ச்ட்ரீம்கள் \n∙ [YouTube] மேலும் சேனல் முகவரி வடிவங்களுக்கான உதவி சேர்க்கப்பட்டது \n∙ [YouTube] மேலும் வீடியோ metainfo வடிவங்களுக்கான உதவி சேர்க்கப்பட்டது \n∙ புதுப்பிக்கப்பட்ட மொழிபெயர்ப்புகள்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/1009.txt",
    "content": "முக்கியமானது \nKeep ஆண்ட்ராய்டு திற பிரச்சாரத்திற்கான செய்தி மற்றும் நடவடிக்கைக்கான அழைப்பு சேர்க்கப்பட்டது: https://www.keepandroidopen.org/ \n\nமேம்படுத்தப்பட்டது \n[Feed] ஆர்டர் காலாவதியான சந்தாக்கள் புதுப்பிக்கப்பட்டதை மாற்றவும் \nகருத்துப் பக்கங்களை அடுக்க வேண்டாம் \nவீடியோ விவரம் பக்கத்தில் சொடுக்கு செய்யும் போது, சொடுக்கு நிகழ்வுகளை அடிப்படை பார்வைகளுக்கு அனுப்ப வேண்டாம் \n\nசரி செய்யப்பட்டது \nஅவதார் படம் இல்லாமல் தலைப்பு தளவமைப்பை கருத்து பதிலளிக்கிறது \nபல பிளேயர் தொடர்பான இடைமுகம் திருத்தங்கள் \n[SoundCloud] நீண்ட ஐடிகளுடன் ச்ட்ரீம்களை சரிசெய்யவும் \n\nமேலும் திருத்தங்கள் மற்றும் மேம்பாடுகள்!\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/63.txt",
    "content": "### மேம்பாடுகள்\n- இறக்குமதி / ஏற்றுமதி அமைப்புகள் #1333 \n- ஓவர்டிராவைக் குறைக்கவும் (செயல்திறன் மேம்பாடு) #1371 \n- சிறிய குறியீடு மேம்பாடுகள் #1375 \n- GDPR #1420 பற்றி அனைத்தையும் சேர்க்கவும்\n\n### சரி செய்யப்பட்டது\n- டவுன்லோடர்: .giga கோப்புகளை #1407 இருந்து முடிக்கப்படாத பதிவிறக்கங்களை ஏற்றும் செயலிழப்பு சரி\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/64.txt",
    "content": "### மேம்பாடுகள்\n- மொபைல் தரவு பயன்படுத்தி என்றால் வீடியோ தரம் கட்டுப்படுத்த திறன் சேர்க்கப்பட்டது. #1339 \n- அமர்வு #1442 க்கான பிரகாசத்தை நினைவில் கொள்ளுங்கள் \n- பலவீனமான CPUகளுக்கான பதிவிறக்க செயல்திறனை மேம்படுத்தவும் #1431 \n- ஊடக அமர்வு #1433 ஆதரவு சேர்க்க (வேலை) ஆதரவு\n\n### சரி செய்யவும்\n- பதிவிறக்கங்களைத் திறப்பதில் செயலிழப்பை சரிசெய்யவும் (இப்போது வெளியீட்டு உருவாக்கங்களுக்கு கிடைக்கும் சரி) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/65.txt",
    "content": "### மேம்பாடுகள் \n\n- பர்கர்மெனு படவுரு அனிமேசனை முடக்கு #1486 \n- பதிவிறக்கங்களின் நீக்குதலை செயல்தவிர்க்கவும் #1472 \n- சேர் பட்டியல் #1498 இல் பதிவிறக்க விருப்பம் \n- நீண்ட தட்டு பட்டியல் #1454 இல் பகிர்வு விருப்பம் சேர்க்கப்பட்டது \n- வெளியேறும் #1354 இல் முதன்மையான வீரரைக் குறைக்கவும் \n- நூலக பதிப்பு புதுப்பித்தல் மற்றும் தரவுத்தள காப்புப்பிரதி திருத்தம் #1510 \n- ExoPlayer 2.8.2 மேம்படுத்தல் #1392 \n- வேகமான வேக மாற்றத்திற்காக வெவ்வேறு படி அளவுகளை ஆதரிக்க, பிளேபேக் வேகக் கட்டுப்பாட்டு உரையாடலை மீண்டும் உருவாக்கியது. \n- பிளேபேக் வேகக் கட்டுப்பாட்டில் நிசப்தத்தின் போது வேகமாக முன்னோக்கிச் செல்வதற்கான நிலைமாற்றம் சேர்க்கப்பட்டது. இது ஆடியோபுக்குகள் மற்றும் சில இசை வகைகளுக்கு உதவியாக இருக்க வேண்டும், மேலும் ஒரு உண்மையான தடையற்ற அனுபவத்தைக் கொண்டு வர முடியும் (மேலும் நிறைய அமைதியுடன் ஒரு பாடலை உடைக்க முடியும் =\\\\). \n- மீடியா மூலத் தெளிவுத்திறன் மறுவடிவமைக்கப்பட்ட மீடியாவை கைமுறையாகச் செய்வதை விட, பிளேயரில் உள்ள மீடியாவுடன் சேர்த்து அனுப்ப அனுமதிக்கிறது. இப்போது எங்களிடம் மெட்டாடேட்டாவின் ஒற்றை சான்று உள்ளது மற்றும் பிளேபேக் தொடங்கும் போது நேரடியாகக் கிடைக்கும். \n- பிளேலிச்ட் துண்டு திறக்கப்படும்போது புதிய மேனிலை தரவு கிடைக்கும்போது நிலையான ரிமோட் பிளேலிச்ட் மேனிலை தரவு புதுப்பிக்கப்படாது. \n- பல்வேறு இடைமுகம் திருத்தங்கள்: #1383, பின்னணி பிளேயர் அறிவிப்புக் கட்டுப்பாடுகள் இப்போது எப்போதும் வெண்மையாக இருக்கும், மேல்தோன்றல் பிளேயரை ஃபிலிங் செய்வதன் மூலம் மூடுவது எளிது \n- பல சேவைகளுக்கு மறுசீரமைக்கப்பட்ட கட்டமைப்புடன் புதிய பிரித்தெடுக்கும் கருவியைப் பயன்படுத்தவும் \n\n### திருத்தங்கள் \n\n- சரி #1440 உடைந்த வீடியோ செய்தி தளவமைப்பு #1491 \n- சரித்திர சரித்திரத்தைக் காண்க #1497 \n- #1495, பயனர் பிளேலிச்ட்டை அணுகியவுடன் மெட்டாடேட்டாவை (சிறுபடம், தலைப்பு மற்றும் வீடியோ எண்ணிக்கை) புதுப்பித்தல். \n- #1475, விவரத் துண்டில் வெளிப்புற பிளேயரில் பயனர் வீடியோவைத் தொடங்கும் போது தரவுத்தளத்தில் பார்வையைப் பதிவு செய்வதன் மூலம். \n- மேல்தோன்றல் பயன்முறையில் திரையின் காலக்கெடுவை சரிசெய்யவும். #1463 (நிலையான #640) \n- முதன்மை வீடியோ பிளேயர் திருத்தம் #1509 \n- [#1412] பிளேயர் செயல்பாடு பின்னணியில் இருக்கும்போது புதிய எண்ணம் பெறப்படும்போது பிளேயர் NPEயை ஏற்படுத்தும் நிலையான ரிப்பீட் பயன்முறை. \n- மேல்தோன்றல் இசைவு வழங்கப்படாதபோது பிளேயரை பாப்அப்பிற்குக் குறைப்பது நிலையானது பிளேயரை அழிக்காது.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/66.txt",
    "content": "v0.13.7 இன் # சேஞ்ச்லாக் \n\n### சரி செய்யப்பட்டது \n- v0.13.6 இன் வரிசை வடிகட்டி சிக்கல்களை சரிசெய்யவும் \n\n# சேஞ்ச்லாக் இன் v0.13.6 \n\n### மேம்பாடுகள் \n\n- பர்கர்மெனு படவுரு அனிமேசனை முடக்கு #1486 \n- பதிவிறக்கங்களின் நீக்குதலை செயல்தவிர்க்கவும் #1472 \n- சேர் பட்டியல் #1498 இல் பதிவிறக்க விருப்பம் \n- நீண்ட தட்டு பட்டியல் #1454 இல் பகிர்வு விருப்பம் சேர்க்கப்பட்டது \n- வெளியேறும் #1354 இல் முதன்மையான வீரரைக் குறைக்கவும் \n- நூலக பதிப்பு புதுப்பித்தல் மற்றும் தரவுத்தள காப்புப்பிரதி திருத்தம் #1510 \n- ExoPlayer 2.8.2 மேம்படுத்தல் #1392 \n- வேகமான வேக மாற்றத்திற்காக வெவ்வேறு படி அளவுகளை ஆதரிக்க, பிளேபேக் வேகக் கட்டுப்பாட்டு உரையாடலை மீண்டும் உருவாக்கியது. \n- பிளேபேக் வேகக் கட்டுப்பாட்டில் நிசப்தத்தின் போது வேகமாக முன்னோக்கிச் செல்வதற்கான நிலைமாற்றம் சேர்க்கப்பட்டது. இது ஆடியோபுக்குகள் மற்றும் சில இசை வகைகளுக்கு உதவியாக இருக்க வேண்டும், மேலும் ஒரு உண்மையான தடையற்ற அனுபவத்தைக் கொண்டு வர முடியும் (மேலும் நிறைய அமைதியுடன் ஒரு பாடலை உடைக்க முடியும் =\\\\). \n- மீடியா மூலத் தெளிவுத்திறன் மறுவடிவமைக்கப்பட்ட மீடியாவை கைமுறையாகச் செய்வதை விட, பிளேயரில் உள்ள மீடியாவுடன் சேர்த்து அனுப்ப அனுமதிக்கிறது. இப்போது எங்களிடம் மெட்டாடேட்டாவின் ஒற்றை சான்று உள்ளது மற்றும் பிளேபேக் தொடங்கும் போது நேரடியாகக் கிடைக்கும். \n- பிளேலிச்ட் துண்டு திறக்கப்படும்போது புதிய மேனிலை தரவு கிடைக்கும்போது நிலையான ரிமோட் பிளேலிச்ட் மேனிலை தரவு புதுப்பிக்கப்படாது. \n- பல்வேறு இடைமுகம் திருத்தங்கள்: #1383, பின்னணி பிளேயர் அறிவிப்புக் கட்டுப்பாடுகள் இப்போது எப்போதும் வெண்மையாக இருக்கும், மேல்தோன்றல் பிளேயரை ஃபிலிங் செய்வதன் மூலம் மூடுவது எளிது \n- பல சேவைகளுக்கு மறுசீரமைக்கப்பட்ட கட்டமைப்புடன் புதிய பிரித்தெடுக்கும் கருவியைப் பயன்படுத்தவும் \n\n### திருத்தங்கள் \n\n- சரி #1440 உடைந்த வீடியோ செய்தி தளவமைப்பு #1491 \n- சரித்திர சரித்திரத்தைக் காண்க #1497 \n- #1495, பயனர் பிளேலிச்ட்டை அணுகியவுடன் மெட்டாடேட்டாவை (சிறுபடம், தலைப்பு மற்றும் வீடியோ எண்ணிக்கை) புதுப்பித்தல். \n- #1475, விவரத் துண்டில் வெளிப்புற பிளேயரில் பயனர் வீடியோவைத் தொடங்கும் போது தரவுத்தளத்தில் பார்வையைப் பதிவு செய்வதன் மூலம். \n- மேல்தோன்றல் பயன்முறையில் திரையின் காலக்கெடுவை சரிசெய்யவும். #1463 (நிலையான #640) \n- முதன்மை வீடியோ பிளேயர் திருத்தம் #1509 \n- [#1412] பிளேயர் செயல்பாடு பின்னணியில் இருக்கும்போது புதிய எண்ணம் பெறப்படும்போது பிளேயர் NPEயை ஏற்படுத்தும் நிலையான ரிப்பீட் பயன்முறை. \n- மேல்தோன்றல் இசைவு வழங்கப்படாதபோது பிளேயரை பாப்அப்பிற்குக் குறைப்பது நிலையானது பிளேயரை அழிக்காது.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/68.txt",
    "content": "v0.14.1 இன் # மாற்றங்கள் \n\n### சரி செய்யப்பட்டது \n- வீடியோ முகவரி #1659 ஐ மறைகுறியாக்குவதில் தோல்வி சரி செய்யப்பட்டது \n- நிலையான விளக்கம் இணைப்பு நன்றாக பிரித்தெடுக்கப்படவில்லை #1657 \n\nv0.14.0 இன் # மாற்றங்கள் \n\n### புதியது \n- புதிய டிராயர் வடிவமைப்பு #1461 \n- புதிய தனிப்பயனாக்கக்கூடிய முதல் பக்கம் #1461 \n\n### மேம்பாடுகள் \n- மறுவேலை செய்யப்பட்ட சைகை கட்டுப்பாடுகள் #1604 \n- மேல்தோன்றல் பிளேயரை மூடுவதற்கான புதிய வழி #1597 \n\n### சரி செய்யப்பட்டது \n- சந்தா எண்ணிக்கை கிடைக்காதபோது பிழையை சரிசெய்யவும். மூடுகிறது #1649. \n- அந்த சந்தர்ப்பங்களில் \"சந்தாதாரர் எண்ணிக்கை கிடைக்கவில்லை\" என்பதைக் காட்டு \n- YouTube பிளேலிச்ட் காலியாக இருக்கும்போது NPEஐ சரிசெய்யவும் \n- SoundCloud இல் உள்ள கியோச்க்குகளை விரைவாக சரிசெய்தல் \n- ரீஃபாக்டர் மற்றும் பிழைத்திருத்தம் #1623 \n- சுழற்சி தேடல் முடிவை சரிசெய்யவும் #1562 \n- ஃபிக்ச் சீக் பட்டி நிலையானதாக இல்லை \n- ஃபிக்ச் YT காப்பீடு வீடியோ சரியாகத் தடுக்கப்படவில்லை \n- சில நேரங்களில் ஏற்றப்படாமல் இருக்கும் வீடியோக்களை சரிசெய்யவும் (DASH பாகுபடுத்தல் காரணமாக) \n- வீடியோ விளக்கத்தில் இணைப்புகளை சரிசெய்யவும் \n- வெளிப்புற sdcard க்கு யாராவது பதிவிறக்க முயற்சிக்கும்போது எச்சரிக்கையைக் காட்டு \n- எதுவும் காட்டப்படாத விதிவிலக்கு தூண்டுதல் அறிக்கையை சரிசெய்யவும் \n- ஆண்ட்ராய்டு 8.1க்கான பின்னணி பிளேயரில் சிறுபடம் காட்டப்படவில்லை [இங்கே பார்க்கவும்](https://github.com/TeamNewPipe/NewPipe/issues/943) \n- ஒளிபரப்பு பெறுநரின் பதிவை சரிசெய்தல். மூடுகிறது #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/69.txt",
    "content": "### புதியது \n- நீண்ட நேரம் நீக்கு மற்றும் சந்தாக்கள் #1516 இல் பகிரவும் \n- டேப்லெட் இடைமுகம் மற்றும் கட்டம் பட்டியல் தளவமைப்பு #1617 \n\n### மேம்பாடுகள் \n- கடைசியாகப் பயன்படுத்திய #1748 விகிதத்தை சேமித்து மீண்டும் ஏற்றவும் \n- முழு வீடியோ பெயர்கள் #1771 உடன் பதிவிறக்கங்கள் செயல்பாட்டில் நேரியல் தளவமைப்பை இயக்கவும் \n- சந்தாக்கள் தாவல் #1516 இலிருந்து நேரடியாக சந்தாக்களை நீக்கி பகிரவும் \n- ப்ளே வரிசை ஏற்கனவே #1783 முடிவடைந்திருந்தால், இப்போது வரிசைப்படுத்துவது வீடியோவை இயக்கத் தூண்டுகிறது \n- தொகுதி மற்றும் பிரகாச சைகைகளுக்கான தனி அமைப்புகள் #1644 \n- உள்ளூர்மயமாக்கல் #1792க்கான ஆதரவைச் சேர்க்கவும் \n\n### திருத்தங்கள் \n- க்கு நேரம் பாகுபடுத்துதல். வடிவம், எனவே நியூபைப்பை ஃபின்லாந்தில் பயன்படுத்தலாம் \n- சந்தா எண்ணிக்கையை சரிசெய்யவும் \n- பநிஇ 28+ சாதனங்களுக்கு முன்புற பணி அனுமதியைச் சேர்க்கவும் #1830 \n\n### தெரிந்த பிழைகள் \n- பிளேபேக் நிலையை Android P இல் சேமிக்க முடியாது\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/70.txt",
    "content": "கவனம்: கடந்த பதிப்பைப் போலவே இந்தப் பதிப்பும் ஒரு பக்ஃபெச்டாக இருக்கலாம். எனினும் 17 முதல் முழு பணிநிறுத்தம் காரணமாக. உடைந்த பதிப்பு சிறந்த பதிப்பு இல்லை. சரியா? ¯\\_(ツ)_/¯ \n\n### மேம்பாடுகள் \nபதிவிறக்கம் செய்யப்பட்ட கோப்புகளை இப்போது ஒரே கிளிக்கில் திறக்கலாம் #1879 \n* ஆண்ட்ராய்டு 4.1 - 4.3 #1884க்கான ஆதரவை கைவிடவும் \n* பழைய பிளேயரை அகற்றவும் #1884 \n* ச்ட்ரீம்களை வலது #1915 க்கு ச்வைப் செய்வதன் மூலம் தற்போதைய பிளே வரிசையிலிருந்து அகற்றவும் \n* ஒரு புதிய ச்ட்ரீம் கைமுறையாக #1878 வரிசைப்படுத்தப்படும் போது தானாக வரிசைப்படுத்தப்பட்ட ச்ட்ரீமை அகற்றவும் \n* பதிவிறக்கங்களுக்கான பின்செயலாக்குதல் மற்றும் @kapodamy ஆல் விடுபட்ட நற்பொருத்தங்கள் #1759 செயல்படுத்துதல் \n* செயலாக்கத்திற்குப் பின் உள்கட்டமைப்பு \n* சரியான பிழை கையாளுதல் \"உள்கட்டமைப்பு\" (பதிவிறக்குபவருக்கு) \n* பல பதிவிறக்கங்களுக்குப் பதிலாக வரிசை \n* வரிசைப்படுத்தப்பட்ட நிலுவையிலுள்ள பதிவிறக்கங்களை (`.giga` கோப்புகள்) பயன்பாட்டுத் தரவுக்கு நகர்த்தவும் \n* அதிகபட்ச பதிவிறக்க மறு முயற்சியை செயல்படுத்தவும் \n* முறையான பல நூல் பதிவிறக்கம் இடைநிறுத்தம் \n* மொபைல் நெட்வொர்க்கிற்கு மாறும்போது பதிவிறக்கங்களை நிறுத்துங்கள் (ஒருபோதும் வேலை செய்யாது, 2வது புள்ளியைப் பார்க்கவும்) \n* அடுத்த பதிவிறக்கங்களுக்கு நூல் எண்ணிக்கையைச் சேமிக்கவும் \n* பல முரண்பாடுகள் சரி செய்யப்பட்டன \n\n### சரி செய்யப்பட்டது \n* சிறந்த மற்றும் வரையறுக்கப்பட்ட மொபைல் டேட்டா தெளிவுத்திறன் #1835க்கு அமைக்கப்பட்ட இயல்புநிலை தெளிவுத்திறனுடன் செயலிழப்பை சரிசெய்யவும் \n* பாப்-அப் பிளேயர் செயலிழப்பு சரி செய்யப்பட்டது #1874 \n* NPE பின்னணி பிளேயர் #1901 ஐ திறக்க முயற்சிக்கும்போது \n* தானாக வரிசைப்படுத்துதல் #1878 இயக்கப்பட்டிருக்கும் போது புதிய ச்ட்ரீம்களைச் செருகுவதை சரிசெய்யவும் \n* டிசைப்பரிங் சட்டவுன் சிக்கல் சரி செய்யப்பட்டது\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/71.txt",
    "content": "### மேம்பாடுகள் \n* GitHub உருவாக்கத்திற்கான பயன்பாட்டு புதுப்பிப்பு அறிவிப்பைச் சேர்க்கவும் (#1608 by @krtkush) \n* டவுன்லோடருக்கு பல்வேறு மேம்பாடுகள் (#1944 by @kapodamy): \n* விடுபட்ட வெள்ளை ஐகான்களைச் சேர்த்து, படவுரு வண்ணங்களை மாற்ற ஆர்ட்கோர்டு வழியைப் பயன்படுத்தவும் \n* இடிரேட்டர் துவக்கப்பட்டதா என சரிபார்க்கவும் (சரிசெய்தல் #2031) \n* புதிய muxer இல் \"பிந்தைய செயலாக்கம் தோல்வியடைந்தது\" பிழையுடன் மீண்டும் பதிவிறக்கங்களை அனுமதிக்கவும் \n* புதிய MPEG-4 muxer ஒத்திசைவற்ற வீடியோ மற்றும் ஆடியோ ச்ட்ரீம்களை சரிசெய்கிறது (#2039) \n\n### சரி செய்யப்பட்டது \n* YouTube லைவ் ச்ட்ரீம்கள் சிறிது நேரத்திற்குப் பிறகு இயங்குவதை நிறுத்துகின்றன (#1996 by @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/730.txt",
    "content": "# சரி செய்யப்பட்டது\n- சூடான திருத்தம் மறைகுறியாக்க செயல்பாடு பிழை மீண்டும்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/740.txt",
    "content": "<h4>மேம்பாடுகள்</h4> \n<ul> \n<li>கருத்துகளில் இணைப்புகளைக் சொடுக்கு செய்யக்கூடியதாக ஆக்குங்கள், உரை அளவை அதிகரிக்கவும்</li> \n<li>கருத்துகளில் நேரமுத்திரை இணைப்புகளைக் சொடுக்கு செய்வதைத் தேடுங்கள்</li> \n<li>சமீபத்தில் தேர்ந்தெடுக்கப்பட்ட மாநிலத்தின் அடிப்படையில் விருப்பமான தாவலைக் காட்டு</li> \n&#39;பின்னணி&#39; பிளேலிச்ட் சாளரத்தில்</li> \n<li>பகிர்ந்த உரை முகவரி இல்லாவிடில் தேடவும்</li> \n<li>சேர் &quot;தற்போதைய நேரத்தில் பகிர்&quot; முக்கிய வீடியோ பிளேயருக்கான பொத்தான்</li> \n<li>வீடியோ வரிசை முடிந்ததும் மெயின் பிளேயருக்கு மூடு பட்டனைச் சேர்க்கவும்</li> \n<li>சேர் &quot;பின்னணியில் நேரடியாக விளையாடு&quot; வீடியோ பட்டியல் உருப்படிகளுக்கான மெனுவை நீண்ட அழுத்தவும்</li> \n<li>Play/Enqueue கட்டளைகளுக்கான ஆங்கில மொழிபெயர்ப்புகளை மேம்படுத்தவும்</li> \n<li>சிறிய செயல்திறன் மேம்பாடுகள்</li> \n<li>பயன்படுத்தாத கோப்புகளை அகற்று</li> \n<li>ExoPlayerஐ 2.9.6க்கு புதுப்பிக்கவும்</li> \n<li>Invidious இணைப்புகளுக்கான ஆதரவைச் சேர்க்கவும்</li> \n</ul> \n<h4>நிலையானது</h4> \n<ul> \n<li>நிலையான ச்க்ரோல் w/ கருத்துகள் மற்றும் தொடர்புடைய ச்ட்ரீம்கள் முடக்கப்பட்டன</li> \n<li>நிச்சயமான CheckForNewAppVersionTask செயல்படாத போது செயல்படுத்தப்படுகிறது</li> \n<li>நிலையான யூடியூப் சந்தா இறக்குமதி: தவறான முகவரி உள்ளவற்றைப் புறக்கணித்து, வெற்று தலைப்பில் உள்ளவற்றை வைத்திருங்கள்</li> \n<li>தவறான YouTube முகவரி ஐ சரிசெய்யவும்: கையொப்ப குறிச்சொல் பெயர் எப்போதும் ச்ட்ரீம்களை ஏற்றுவதைத் தடுக்கும் \"கையொப்பம்\" அல்ல</li> \n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/750.txt",
    "content": "புதியது \nபிளேபேக் ரெச்யூம் #2288 \n• கடைசியாக நீங்கள் நிறுத்திய ச்ட்ரீம்களை மீண்டும் தொடங்கவும் \nடவுன்லோடர் மேம்பாடுகள் #2149 \n• வெளிப்புற SD கார்டுகளில் பதிவிறக்கங்களைச் சேமிக்க சேமிப்பக அணுகல் கட்டமைப்பைப் பயன்படுத்தவும் \n• புதிய mp4 muxer \n• பதிவிறக்கத்தைத் தொடங்கும் முன் பதிவிறக்க கோப்பகத்தை விருப்பமாக மாற்றவும் \n• மீட்டர் நெட்வொர்க்குகளை மதிக்கவும் \n\n\nமேம்படுத்தப்பட்டது \n• நீக்கப்பட்ட செமா சரங்கள் #2295 \n• செயல்பாட்டு வாழ்க்கைச் சுழற்சியின் போது (தானியங்கு) சுழற்சி மாற்றங்களைக் கையாளவும் #2444 \n• நீண்ட அழுத்த மெனுக்களை சீரான #2368 ஆக்குங்கள் \n\nசரி செய்யப்பட்டது \n• நிலையான தேர்ந்தெடுக்கப்பட்ட வசன டிராக் பெயர் #2394 காட்டப்படவில்லை \n• ஆப்ச் புதுப்பிப்பு தோல்வியுற்றால் செயலிழக்க வேண்டாம் (GitHub பதிப்பு) #2423 \n• நிலையான பதிவிறக்கங்கள் 99.9% #2440 இல் சிக்கியுள்ளன \n• பிளே வரிசை மேனிலை தரவு #2453ஐப் புதுப்பிக்கவும் \n• [SoundCloud] பிளேலிச்ட்களை ஏற்றும்போது நிலையான செயலிழப்பு TeamNewPipe/NewPipeExtractor#170 \n• [YouTube] நிலையான கால அளவு TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/760.txt",
    "content": "0.17.1 இல் மாற்றங்கள் \n\nபுதியது \n• தாய் உள்ளூர்மயமாக்கல் \n\n\nமேம்படுத்தப்பட்டது \n• பிளேலிச்ட்களுக்கான நீண்ட அழுத்த மெனுக்களில் மீண்டும் விளையாடத் தொடங்கும் செயலைச் சேர்க்கவும் #2518 \n• SAF / மரபு கோப்பு தேர்வி #2521க்கான சுவிட்சைச் சேர்க்கவும் \n\nசரி செய்யப்பட்டது \n• பயன்பாடுகள் #2487 ஐ மாற்றும்போது பதிவிறக்கங்கள் பார்வையில் மறைந்து வரும் பொத்தான்களை சரிசெய்யவும் \n• பார்வை வரலாறு முடக்கப்பட்டிருந்தாலும், ஃபிக்ச் பிளேபேக் நிலை சேமிக்கப்படும் \n• பட்டியல் காட்சிகள் #2517 இல் பிளேபேக் நிலை காரணமாக குறைக்கப்பட்ட செயல்திறனை சரிசெய்யவும் \n• [எக்ச்ட்ராக்டர்] ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 \n• [எக்ச்ட்ராக்டர்] [YouTube] பிளேலிச்ட்கள் முடிவுகளில் இருக்கும்போது சாதாரண தேடல் பிழையை சரிசெய்யவும் TeamNewPipe/NewPipeExtractor#185 \n\n\n\n0.17.0 இல் மாற்றங்கள் \n\nபுதியது \nபிளேபேக் ரெச்யூம் #2288 \n• கடைசியாக நீங்கள் நிறுத்திய ச்ட்ரீம்களை மீண்டும் தொடங்கவும் \nடவுன்லோடர் மேம்பாடுகள் #2149 \n• வெளிப்புற SD கார்டுகளில் பதிவிறக்கங்களைச் சேமிக்க சேமிப்பக அணுகல் கட்டமைப்பைப் பயன்படுத்தவும் \n• புதிய mp4 muxer \n• பதிவிறக்கத்தைத் தொடங்கும் முன் பதிவிறக்க கோப்பகத்தை விருப்பமாக மாற்றவும் \n• மீட்டர் நெட்வொர்க்குகளை மதிக்கவும் \n\n\nமேம்படுத்தப்பட்டது \n• நீக்கப்பட்ட செமா சரங்கள் #2295 \n• செயல்பாட்டு வாழ்க்கைச் சுழற்சியின் போது (தானியங்கு) சுழற்சி மாற்றங்களைக் கையாளவும் #2444 \n• நீண்ட அழுத்த மெனுக்களை சீரான #2368 ஆக்குங்கள் \n\nசரி செய்யப்பட்டது \n• நிலையான தேர்ந்தெடுக்கப்பட்ட வசன டிராக் பெயர் #2394 காட்டப்படவில்லை \n• ஆப்ச் புதுப்பிப்பு தோல்வியுற்றால் செயலிழக்க வேண்டாம் (GitHub பதிப்பு) #2423 \n• நிலையான பதிவிறக்கங்கள் 99.9% #2440 இல் சிக்கியுள்ளன \n• பிளே வரிசை மேனிலை தரவு #2453ஐப் புதுப்பிக்கவும் \n• [SoundCloud] பிளேலிச்ட்களை ஏற்றும்போது நிலையான செயலிழப்பு TeamNewPipe/NewPipeExtractor#170 \n• [YouTube] நிலையான கால அளவு TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/770.txt",
    "content": "0.17.2 இல் மாற்றங்கள்\n\nசரி செய்யவும்\n• எந்த வீடியோவும் கிடைக்கவில்லை என்பதை சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/780.txt",
    "content": "0.17.3 இல் மாற்றங்கள் \n\nமேம்படுத்தப்பட்டது \n• பிளேபேக் நிலைகளை அழிக்க விருப்பம் சேர்க்கப்பட்டது #2550 \n• கோப்பு தேர்வி #2591 இல் மறைக்கப்பட்ட கோப்பகங்களைக் காட்டு \n• NewPipe #2488 உடன் திறக்கப்பட வேண்டிய `invidio.us` நிகழ்வுகளின் உதவி URLகள் \n• `music.youtube.com` URLகளுக்கான ஆதரவைச் சேர்க்கவும் TeamNewPipe/NewPipeExtractor#194 \n\nசரி செய்யப்பட்டது \n• [YouTube] நிலையான 'java.lang.IllegalArgumentException #192 \n• [YouTube] நிலையான நேரடி ச்ட்ரீம்கள் வேலை செய்யவில்லை TeamNewPipe/NewPipeExtractor#195 \n• ச்ட்ரீம் #2592 ஐப் பதிவிறக்கும் போது ஆண்ட்ராய்டு பையில் செயல்திறன் சிக்கல் சரி செய்யப்பட்டது\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/790.txt",
    "content": "மேம்படுத்தப்பட்டது \n• பார்வையற்றவர்களுக்கான அணுகலை மேம்படுத்த மேலும் தலைப்புகளைச் சேர்க்கவும் #2655 \n• பதிவிறக்க கோப்புறை அமைப்பை மிகவும் சீரானதாகவும் தெளிவற்றதாகவும் மாற்றவும் #2637 \n\nசரி செய்யப்பட்டது \n• பிளாக்கில் கடைசி பைட் #2646 பதிவிறக்கம் செய்யப்பட்டுள்ளதா எனச் சரிபார்க்கவும் \n• வீடியோ விவரத் துண்டு #2672 இல் ச்க்ரோலிங் சரி செய்யப்பட்டது \n• இரட்டை தேடல் தெளிவான பெட்டி அனிமேசன்களை #2695 க்கு அகற்றவும் \n• [SoundCloud] கிளையன்ட்_ஐடி பிரித்தெடுத்தலை சரிசெய்யவும் #2745 \n\nவளர்ச்சி \n• NewPipeExtractor இலிருந்து பெறப்பட்ட விடுபட்ட சார்புகளை NewPipe #2535 இல் சேர்க்கவும் \n• AndroidX #2685க்கு மாற்றவும் \n• ExoPlayer 2.10.6 #2697, #2736 க்கு புதுப்பிக்கவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/800.txt",
    "content": "புதியது \n• P2P இல்லாமல் PeerTube உதவி (#2201) [பீட்டா]: \n◦ PeerTube நிகழ்வுகளில் இருந்து வீடியோக்களைப் பார்க்கவும் பதிவிறக்கவும் \n◦ முழுமையான PeerTube உலகத்தை அணுக அமைப்புகளில் நிகழ்வுகளைச் சேர்க்கவும் \n◦ ஆண்ட்ராய்டு 4.4 மற்றும் 7.1 இல் SSL ஏண்ட்சேக்குகளில் சிக்கல்கள் இருக்கலாம், சில நிகழ்வுகளை அணுகும்போது பிணையப் பிழை ஏற்படலாம். \n\n• பதிவிறக்குபவர் (#2679): \n◦ பதிவிறக்க ETAஐக் கணக்கிடவும் \n◦ ஓபசை (வெப்எம் கோப்புகள்) ogg ஆகப் பதிவிறக்கவும் \n◦ நீண்ட இடைநிறுத்தத்திற்குப் பிறகு பதிவிறக்கங்களை மீண்டும் தொடங்க, காலாவதியான பதிவிறக்க இணைப்புகளை மீட்டெடுக்கவும் \n\nமேம்படுத்தப்பட்டது \n• விருப்பமான உள்ளடக்க நாட்டில் ஏற்படும் மாற்றங்கள் குறித்து கியோச்க் ஃபிராக்மென்ட்டுக்கு தெரியப்படுத்தவும் மற்றும் அனைத்து முக்கிய தாவல்களின் செயல்திறனை மேம்படுத்தவும் #2742 \n• எக்ச்ட்ராக்டர் #2713 இலிருந்து புதிய உள்ளூர்மயமாக்கல் மற்றும் டவுன்லோடர் செயலாக்கங்களைப் பயன்படுத்தவும் \n• \"இயல்புநிலை கியோச்க்\" சரத்தை மொழிபெயர்க்கலாம் \n• கருப்பு கருப்பொருள் #2569க்கான கருப்பு வழிசெலுத்தல் பட்டி \n\nசரி செய்யப்பட்டது \n• மேல்தோன்றல் பிளேயரை நகர்த்தும்போது மற்றொரு விரலை வைத்தால் மேல்தோன்றல் பிளேயரை நகர்த்த முடியாத பிழை சரி செய்யப்பட்டது #2772 \n• பதிவேற்றியவரைக் காணாத பிளேலிச்ட்களை அனுமதிக்கவும் மேலும் இந்தச் சிக்கல் தொடர்பான செயலிழப்புகளைச் சரிசெய்யவும் #2724, TeamNewPipe/NewPipeExtractor#219 \n• MediaCCC மற்றும் சில PeerTube நிகழ்வுகளுடன் TLS ஏண்ட்சேக்கை சரிசெய்ய Android 4.4 சாதனங்களில் (API 19/KitKat) TLS1.1/1.2 ஐ இயக்குகிறது #2792 \n• [SoundCloud] நிலையான கிளையன்ட்_ஐடி பிரித்தெடுத்தல் TeamNewPipe/NewPipeExtractor#217 \n• [SoundCloud] ஆடியோ ச்ட்ரீம் பிரித்தெடுத்தலை சரிசெய்யவும் \n\nவளர்ச்சி \n• ExoPlayer ஐ 2.10.8 #2791, #2816 க்கு புதுப்பிக்கவும் \n• Gradleஐ 3.5.1க்கு புதுப்பித்து, Kotlin ஆதரவைச் சேர்க்கவும் #2714\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/810.txt",
    "content": "புதியது \n• பின்னணியில் விளையாடும்போது பூட்டுத் திரையில் வீடியோ சிறுபடத்தைக் காட்டு \n\nமேம்படுத்தப்பட்டது \n• பின்னணி / மேல்தோன்றல் பட்டனை நீண்ட நேரம் அழுத்தும் போது உள்ளக பிளேலிச்ட்டை வரிசையில் சேர்க்கவும் \n• முதன்மையான பக்க தாவல்களை ச்க்ரோல் செய்யக்கூடியதாக மாற்றவும் மற்றும் ஒரே ஒரு தாவல் இருக்கும் போது மறைக்கவும் \n• பின்னணி பிளேயரில் அறிவிப்பு சிறுபட புதுப்பிப்புகளின் வரம்பு \n• காலியான உள்ளக பிளேலிச்ட்களுக்கு போலி சிறுபடத்தைச் சேர்க்கவும் \n• *.webm க்குப் பதிலாக *.opus கோப்பு நீட்டிப்பைப் பயன்படுத்தவும், பதிவிறக்க கீழ்தோன்றும் இடத்தில் \"WebM Opus\" என்பதற்குப் பதிலாக வடிவமைப்பு லேபிளில் \"opus\" என்பதைக் காட்டவும் \n• \"பதிவிறக்கங்களில்\" பதிவிறக்கப்பட்ட கோப்புகள் அல்லது பதிவிறக்க வரலாற்றை நீக்க பொத்தானைச் சேர்க்கவும் \n• [YouTube] /c/shortened_url சேனல் இணைப்புகளுக்கு ஆதரவைச் சேர்க்கவும் \n\nசரி செய்யப்பட்டது \n• நியூபைப்பில் வீடியோவைப் பகிரும்போதும் அதன் ச்ட்ரீம்களை நேரடியாகப் பதிவிறக்கும்போதும் பல சிக்கல்கள் சரி செய்யப்பட்டன \n• அதன் உருவாக்கத் தொடரிலிருந்து நிலையான பிளேயர் அணுகல் \n• நிலையான தேடல் முடிவு பக்கமாக்கல் \n• [YouTube] NPE க்கு காரணமான பூச்யத்தில் மாறுதல் நிலையானது \n• [YouTube] invidio.us urlஐத் திறக்கும்போது கருத்துகளைப் பார்ப்பது நிலையானது \n• [SoundCloud] updated client_id\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/820.txt",
    "content": "நிலையான மறைகுறியாக்க செயல்பாடு பெயர் regex YouTube ஐ பயன்படுத்த முடியாததாக ஆக்குகிறது.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/830.txt",
    "content": "SoundCloud சிக்கல்களை சரிசெய்ய SoundCloud client_id புதுப்பிக்கப்பட்டது.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/840.txt",
    "content": "புதியது \n• பயன்பாட்டு மொழியை மாற்ற, மொழி தேர்வி சேர்க்கப்பட்டது \n• பிளேயர் மடிக்கக்கூடிய பட்டியலில் 'கோடிக்கு அனுப்பு' பட்டன் சேர்க்கப்பட்டது \n• நீண்ட அழுத்தத்தில் கருத்துகளை நகலெடுக்கும் திறன் சேர்க்கப்பட்டது \n\nமேம்படுத்தப்பட்டது \n• ReCaptcha செயல்பாட்டைச் சரிசெய்து, பெறப்பட்ட குக்கீகளை சரியாகச் சேமிக்கவும் \n• டிராயருக்கு ஆதரவாக புள்ளி-மெனு அகற்றப்பட்டது மற்றும் அமைப்புகளில் பார்வை வரலாறு இயக்கப்படாதபோது வரலாற்றை மறைக்கும் பட்டன் \n• ஆண்ட்ராய்டு 6 மற்றும் அதற்குப் பிந்தைய பதிப்பில் உள்ள அமைப்புகளில், பிற ஆப்சைக் காட்ட இசைவு கேட்கவும் \n• புத்தகக்குறி ஃபிராக்மென்ட்டில் நீண்ட நேரம் சொடுக்கு செய்வதன் மூலம் உள்ளக பிளேலிச்ட்டின் பெயரை மாற்றவும் \n• பல்வேறு PeerTube மேம்பாடுகள் \n• பல ஆங்கில மூல சரங்கள் மேம்படுத்தப்பட்டது \n\nசரி செய்யப்பட்டது \n• ஃபிக்ச்டு பிளேயர் மீண்டும் தொடங்கும், இருப்பினும் \"மினிமைச் ஆன் ஆப் ஆப் ச்விட்ச்\" விருப்பம் இயக்கப்பட்டு, நியூபைப் சிறிதாக்கப்பட்டால் அது இடைநிறுத்தப்பட்டது. \n• சைகைக்கான ஆரம்ப பிரகாச மதிப்பை சரிசெய்யவும் \n• நிலையான .srt வசனப் பதிவிறக்கங்கள் அனைத்து வரி முறிவுகளையும் கொண்டிருக்கவில்லை \n• சில Android 5 சாதனங்கள் CTF இணங்காததால் SD கார்டில் நிலையான பதிவிறக்கம் தோல்வியடைந்தது \n• ஆண்ட்ராய்டு KitKat இல் பதிவிறக்குவது நிலையானது \n• நிலையான சிதைந்த வீடியோ .mp4 கோப்பு ஆடியோ கோப்பாக அங்கீகரிக்கப்படுகிறது \n• தவறான சீன மொழி குறியீடுகள் உட்பட பல உள்ளூர்மயமாக்கல் சிக்கல்கள் சரி செய்யப்பட்டன \n• [YouTube] விளக்கத்தில் உள்ள நேர முத்திரைகள் மீண்டும் சொடுக்கு செய்யலாம்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/850.txt",
    "content": "இந்த வெளியீட்டில் YouTube வலைத்தள பதிப்பு புதுப்பிக்கப்பட்டது. பழைய வலைத்தள பதிப்பு மார்ச் மாதத்தில் நிறுத்தப்பட உள்ளது, எனவே நீங்கள் NewPipe ஐ மேம்படுத்த வேண்டும்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/860.txt",
    "content": "மேம்படுத்தப்பட்டது\n Stick சுருதி மற்றும் டெம்போவை மறைக்கவில்லையா இல்லையா என்பதை சேமித்து மீட்டெடுங்கள்\n Player பிளேயரில் காட்சி காட்சி கட்அவுட்டை ஆதரிக்கவும்\n • சுற்று பார்வை மற்றும் சந்தாதாரர் எண்ணிக்கை\n தகவல்கள் குறைந்த தரவைப் பயன்படுத்த YouTube ஐ உகந்தது\n\n இந்த வெளியீட்டில் 15 யூடியூப் தொடர்பான பிழைகள் சரி செய்யப்பட்டன.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/870.txt",
    "content": "இது மீண்டும் பெரிய தொந்தரவுகள் இல்லாமல் SoundCloud ஐப் பயன்படுத்த அனுமதிக்க NewPipe ஐப் புதுப்பிக்கும் ஹாட்ஃபிக்ஸ் வெளியீடு ஆகும்.\nSoundCloud இன் v2 API இப்போது பிரித்தெடுத்தலில் பயன்படுத்தப்படுகிறது மற்றும் தவறான கிளையன்ட் ஐடிகளைக் கண்டறிதல் மேம்படுத்தப்பட்டுள்ளது.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/900.txt",
    "content": "புதியது \n• சந்தா குழுக்கள் மற்றும் வரிசைப்படுத்தப்பட்ட ஊட்டங்கள் \n• பிளேயர்களில் முடக்கு பொத்தான் \n\nமேம்படுத்தப்பட்டது \n• NewPipe இல் music.youtube.com மற்றும் media.ccc.de இணைப்புகளைத் திறக்க அனுமதிக்கவும் \n• தோற்றத்தில் இருந்து உள்ளடக்கத்திற்கு இரண்டு அமைப்புகளை மாற்றவும் \n• inexact search இயக்கப்பட்டிருந்தால், 5, 15, 25 second தேடல் விருப்பங்களை மறை \n\nசரி செய்யப்பட்டது \n• சில WebM வீடியோக்களை தேட முடியாது \n• ஆண்ட்ராய்டு P இல் தரவுத்தள காப்புப்பிரதி \n• பதிவிறக்கம் செய்யப்பட்ட கோப்பைப் பகிரும்போது செயலிழக்கும் \n• டன் YouTube பிரித்தெடுத்தல் சிக்கல் மற்றும் பல ...\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/910.txt",
    "content": "சில அரிதான சந்தர்ப்பங்களில் நியூபைப் தொடங்குவதைத் தடுத்த நிலையான தரவுத்தள இடம்பெயர்வு.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/920.txt",
    "content": "மேம்படுத்தப்பட்ட\n\n• பதிவேற்ற தேதி மற்றும் ஸ்ட்ரீம் கட்டம் உருப்படிகளில் பார்வை எண்ணிக்கை சேர்க்கப்பட்டது\n• டிராயர் தலைப்பு தளவமைப்பிற்கான மேம்பாடுகள்\n\nநிலையான\n\n• API 19 இல் செயலிழப்புகளை ஏற்படுத்தும் நிலையான முடக்கு பொத்தான்\n• நீண்ட 1080p 60fps வீடியோக்களை நிலையான பதிவிறக்கம்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/930.txt",
    "content": "புதியது \n• YouTube Music இல் தேடவும் \n• அடிப்படை ஆண்ட்ராய்டு TV உதவி \n\nமேம்படுத்தப்பட்டது \n• உள்ளக பிளேலிச்ட்டில் இருந்து பார்த்த அனைத்து வீடியோக்களையும் அகற்றும் திறன் சேர்க்கப்பட்டது \n• செயலிழப்பதற்குப் பதிலாக உள்ளடக்கம் இன்னும் ஆதரிக்கப்படாதபோது செய்தியைக் காட்டு \n• பிஞ்ச் சைகைகள் மூலம் மேம்படுத்தப்பட்ட மேல்தோன்றல் பிளேயர் அளவு \n• சேனலில் பின்னணி மற்றும் மேல்தோன்றல் பொத்தான்களில் நீண்ட நேரம் அழுத்தினால் ச்ட்ரீம்களை என்கியூவில் வைக்கவும் \n• டிராயர் எடர் தலைப்பின் மேம்படுத்தப்பட்ட அளவு கையாளுதல் \n\nசரி செய்யப்பட்டது \n• நிர்ணயிக்கப்பட்ட அகவை வரம்பிடப்பட்ட உள்ளடக்க அமைப்பு வேலை செய்யவில்லை \n• குறிப்பிட்ட வகையான reCAPTCHAகள் சரி செய்யப்பட்டன \n• பிளேலிச்ட் `பூச்யமாக' இருக்கும் போது புக்மார்க்குகளைத் திறக்கும்போது நிலையான செயலிழப்பு \n• பிணையம் தொடர்பான விதிவிலக்குகளை நிலையான கண்டறிதல் \n• சந்தாத் துண்டில் குழு வரிசை பட்டனின் நிலையான தெரிவுநிலை \n\nமேலும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/940.txt",
    "content": "புதியது \n• SoundCloud கருத்துகளுக்கான ஆதரவைச் சேர்க்கவும் \n• YouTube கட்டுப்படுத்தப்பட்ட பயன்முறை அமைப்பைச் சேர்க்கவும் \n• PeerTube பெற்றோர் சேனல் விவரங்களைக் காட்டு \n\nமேம்படுத்தப்பட்டது \n• ஆதரிக்கப்படும் சேவைகளுக்கு மட்டும் கோர் பட்டனைக் காட்டு \n• NavigationBar அல்லது StatusBar இல் தொடங்கும் பிளேயர் சைகைகளைத் தடுக்கவும் \n• பணி நிறத்தின் அடிப்படையில் மீண்டும் முயற்சிக்கவும் & குழுசேரவும் பொத்தான்களின் பின்னணி நிறத்தை மாற்றவும் \n\nசரி செய்யப்பட்டது \n• பதிவிறக்க உரையாடல் முடக்கத்தை சரிசெய்யவும் \n• உலாவியில் திற பொத்தான் இப்போது உண்மையில் உலாவியில் திறக்கும் \n• வீடியோக்களைத் திறப்பதில் ஏற்படும் செயலிழப்பு மற்றும் \"இந்த ச்ட்ரீமை இயக்க முடியவில்லை\" \n\nமேலும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/950.txt",
    "content": "இந்த வெளியீடு மூன்று சிறிய திருத்தங்களைக் கொண்டுவருகிறது:\n• Adroid 10+ இல் நிலையான சேமிப்பக அணுகல்\n• நிலையான திறப்பு கியோஸ்க்குகள்\n• நீண்ட வீடியோக்களை நிலையான கால பாகுபடுத்தல்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/951.txt",
    "content": "புதியது \n• ஊட்டக் குழு உரையாடலில் சந்தா தேர்விக்கான தேடலைச் சேர்க்கவும் \n• தொகுக்கப்படாத சந்தாக்களை மட்டும் காட்ட ஊட்டக் குழு உரையாடலில் வடிப்பானைச் சேர்க்கவும் \n• முதன்மைப் பக்கத்தில் பிளேலிச்ட் தாவலைச் சேர்க்கவும் \n• பின்னணி/பாப்-அப் பிளேயர் வரிசையில் வேகமாக முன்னோக்கி/ரீவைண்ட் \n• தேடல் பரிந்துரையைக் காட்டு: அதற்கான முடிவைக் காட்டுகிறீர்களா? \n\nமேம்படுத்தப்பட்டது \n• கலவையான கோப்புகளில் பயன்பாட்டு மெட்டாடேட்டாவை எழுதுவதை கைவிடவும் \n• தோல்வியுற்ற ச்ட்ரீம்களை வரிசையில் இருந்து அகற்ற வேண்டாம் \n• கருவிப்பட்டியின் நிறத்துடன் பொருந்த, நிலைப் பட்டியின் நிறத்தைப் புதுப்பிக்கவும் \n\nசரி செய்யப்பட்டது \n• ஃப்ளோட்டிங் பாயின்ட் க்யூமுலேட்டிவ் பிழைகளால் ஏற்படும் நிலையான ஆடியோ/வீடியோ ஒத்திசைவு \n• [PeerTube] நீக்கப்பட்ட கருத்துகளைக் கையாளவும் \n\nமேலும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/952.txt",
    "content": "மேம்படுத்தப்பட்டது\n சேவைகள் அனைத்து சேவைகளுக்கும் ஆட்டோ-பிளே கிடைக்கிறது (YouTube க்கு மட்டுமே பதிலாக)\n\n சரி\n You யூடியூப்பின் புதிய தொடர்ச்சிகளை ஆதரிப்பதன் மூலம் நிலையான தொடர்புடைய ச்ட்ரீம்கள்\n Year நிலையான அகவை யூடியூப் வீடியோக்களை தடைசெய்தது\n • [Android TV] நிலையான நீடித்த கவனம் சிறப்பம்சமாக மேலடுக்கு\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/953.txt",
    "content": "YouTube இன் மறைகுறியாக்க செயல்பாட்டை பிரித்தெடுத்தலை சரிசெய்யவும்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/954.txt",
    "content": "• புதிய பயன்பாட்டுப் பணிப்பாய்வு: விவரப் பக்கத்தில் வீடியோக்களை இயக்கவும், பிளேயரைக் குறைக்க கீழே ச்வைப் செய்யவும் \n• MediaStyle அறிவிப்புகள்: அறிவிப்புகளில் தனிப்பயனாக்கக்கூடிய செயல்கள், செயல்திறன் மேம்பாடுகள் \n• டெச்க்டாப் பயன்பாடாக NewPipe ஐப் பயன்படுத்தும் போது அடிப்படை மறுஅளவிடுதல் \n\n• ஆதரிக்கப்படாத URL டோச்ட்டின் போது திறந்த விருப்பங்களுடன் உரையாடலைக் காட்டு \n• தொலைவில் உள்ளவற்றைப் பெற முடியாதபோது, தேடல் பரிந்துரை அனுபவத்தை மேம்படுத்தவும் \n• இயல்புநிலை வீடியோ தகுதி 720p60 (இன்-ஆப் பிளேயர்) மற்றும் 480p (பாப்-அப் பிளேயர்) ஆக அதிகரிக்கப்பட்டது \n\n• பல பிழை திருத்தங்கள் மற்றும் பல\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/955.txt",
    "content": "[யூடியூப்] சில பயனர்களுக்கான தேடலை சரிசெய்யவும்\n[யூடியூப்] சீரற்ற மறைகுறியாக்க விதிவிலக்குகளை சரிசெய்யவும்\n[சவுண்ட்கிளவுட்] ஸ்லாஷுடன் முடிவடையும் URL கள் இப்போது சரியாக பாகுபடுத்தப்படுகின்றன\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/956.txt",
    "content": "[யூடியூப்] எந்த வீடியோ ஏற்றும் போது நிலையான செயலிழப்பு\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/957.txt",
    "content": "• குறிப்பிட்ட வரிசை செயல்களை ஒன்றாக இணைக்கவும் \n• பிளேயரை மூட இரண்டு விரல் சைகை \n• reCAPTCHA குக்கீகளை அழிக்க அனுமதிக்கவும் \n• அறிவிப்பை வண்ணமாக்காத விருப்பம் \n• நியூபைப்பில் பகிரும் போது எல்லையற்ற பஃபரிங், தரமற்ற நடத்தை மற்றும் பிற முரண்பாடுகளை சரிசெய்ய வீடியோ விவரங்கள் எவ்வாறு திறக்கப்படுகின்றன என்பதை மேம்படுத்தவும் \n• YouTube வீடியோக்களை விரைவுபடுத்துங்கள் மற்றும் அகவை வரம்புக்குட்பட்டவற்றை சரிசெய்யவும் \n• வேகமாக முன்னோக்கி/முன்னோக்கிச் செல்லும் போது செயலிழப்பை சரிசெய்யவும் \n• சிறுபடங்களை இழுத்து பட்டியல்களை மறுசீரமைக்க வேண்டாம் \n• மேல்தோன்றல் பண்புகளை எப்போதும் நினைவில் கொள்ளுங்கள் \n• சந்தாலி மொழியைச் சேர்க்கவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/958.txt",
    "content": "புதியது மற்றும் மேம்படுத்தப்பட்டது: \n• பூட்டுத் திரையில் சிறுபடத்தை மறைக்க விருப்பம் மீண்டும் சேர்க்கப்பட்டது \n• ஊட்டத்தைப் புதுப்பிக்க இழுக்கவும் \n• உள்ளக பட்டியல்களைப் பெறும்போது மேம்படுத்தப்பட்ட செயல்திறன் \n\nசரி செய்யப்பட்டது: \n• RAM இலிருந்து அகற்றப்பட்ட பிறகு NewPipe ஐத் தொடங்கும் போது நிலையான செயலிழப்பு \n• இணைய இணைப்பு இல்லாதபோது தொடக்கத்தில் நிலையான செயலிழப்பு \n• ஒளி மற்றும் வால்யூம் சைகை அமைப்புகளைப் பொறுத்து சரி செய்யப்பட்டது \n• [YouTube] நிலையான நீண்ட பிளேலிச்ட்கள் \n\nமற்றவை: \n• குறியீடு தூய்மை மற்றும் பல உள் மேம்பாடுகள் \n• சார்பு மேம்படுத்தல்கள் \n• மொழிபெயர்ப்பு புதுப்பிப்புகள்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/959.txt",
    "content": "பிழை நிருபரைத் திறந்த பிறகு விபத்துக்களின் நிலையான முடிவற்ற சுழற்சி.\n நியூபிப்பால் தானாகவே திறக்கக்கூடிய PEERTUBE நிகழ்வுகளின் புதுப்பிக்கப்பட்ட பட்டியல்.\n புதுப்பிக்கப்பட்ட மொழிபெயர்ப்புகள்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/960.txt",
    "content": "Settions அமைப்புகளில் ஏற்றுமதி தரவுத்தள விருப்பத்தின் மேம்பட்ட விளக்கம்.\n You நிலையான YouTube கருத்துக்கள் பாகுபடுத்துகின்றன.\n ஊடகம் மீடியா.சிசிசி டி சேவையின் நிலையான காட்சி பெயர்.\n • புதுப்பிக்கப்பட்ட மொழிபெயர்ப்புகள்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/961.txt",
    "content": "• [YouTube] ஆதரவை கலக்கவும்\n • [YouTube] பொது ஒளிபரப்பாளர்கள் மற்றும் COVID-19 பற்றிய தகவல்களைக் காண்பி\n • [Media.ccc.de] அண்மைக் கால வீடியோக்களைச் சேர்த்தது\n So சோமாலிய மொழிபெயர்ப்பு சேர்க்கப்பட்டது\n\n • பல உள் மேம்பாடுகள்\n\n Player பிளேயருக்குள் இருந்து நிலையான பகிர்வு வீடியோக்கள்\n • நிலையான வெற்று ரெக்காப்ட்சா வெப்வியூ\n A பட்டியலிலிருந்து ஒரு ச்ட்ரீமை அகற்றும்போது ஏற்பட்ட நிலையான செயலிழப்பு\n • [PEERTUBE] நிலையான தொடர்புடைய ச்ட்ரீம்கள்\n • [YouTube] நிலையான YouTube இசை தேடல்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/962.txt",
    "content": "Media.ccc.de சேவையில் \"அண்மைக் கால\" வீடியோக்களைச் சேர்த்தது.\n Media.ccc.de சேவையில் நேரடி ச்ட்ரீம்களைச் சேர்த்தது மற்றும் நேரடி ச்ட்ரீம் ஆதரவையும் சேர்த்தது.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/963.txt",
    "content": "• [YouTube] நிலையான சேனல் தொடர்ச்சி\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/964.txt",
    "content": "• பிளேயர் கட்டுப்பாடுகளில் அத்தியாயங்களுக்கான உதவி சேர்க்கப்பட்டது \n• [PeerTube] Sepia தேடல் சேர்க்கப்பட்டது \n• வீடியோ விவரக் காட்சியில் பகிர்வு பொத்தான் மீண்டும் சேர்க்கப்பட்டு, தாவல் தளவமைப்பிற்கு ச்ட்ரீம் விளக்கம் நகர்த்தப்பட்டது \n• ஒளி சைகை முடக்கப்பட்டிருந்தால், பிரகாசத்தை மீட்டெடுப்பதை முடக்கவும் \n• கோடியில் வீடியோவை இயக்க பட்டியல் உருப்படி சேர்க்கப்பட்டது \n• சில சாதனங்களில் இயல்புநிலை உலாவி அமைக்கப்படாதபோது நிலையான செயலிழப்பு மற்றும் பகிர்வு உரையாடல்களை மேம்படுத்தலாம் \n• முழுத்திரை பிளேயரில் ஆர்டுவேர் ச்பேச் பட்டன் மூலம் பிளே/இடைநிறுத்தத்தை நிலைமாற்று \n• [media.ccc.de] பல்வேறு திருத்தங்கள் மற்றும் மேம்பாடுகள்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/965.txt",
    "content": "சேனல் குழுக்களை மறுவரிசைப்படுத்தும்போது ஏற்பட்ட நிலையான செயலிழப்பு.\n சேனல்கள் மற்றும் பிளேலிச்ட்களிலிருந்து அதிக YouTube வீடியோக்களைப் பெறுவது சரி.\n யூடியூப் கருத்துகளைப் பெறுவது சரி.\n YouTube முகவரி களில் /watce /, /v /மற்றும் /w /துணைப் பாதைகளுக்கு உதவி சேர்க்கப்பட்டது.\n சவுண்ட்க்ளூட் வாங்கி ஐடி மற்றும் சியோ-தடைசெய்யப்பட்ட உள்ளடக்கத்தின் நிலையான பிரித்தெடுத்தல்.\n வடக்கு குர்திச் உள்ளூராக்கல் சேர்க்கப்பட்டது.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/966.txt",
    "content": "புதிய: \n• புதிய சேவையைச் சேர்க்கவும்: Bandcamp \n\nமேம்படுத்தப்பட்டது: \n• சாதனத்தின் கருப்பொருளை ஆப்சைப் பின்பற்றுவதற்கான விருப்பத்தைச் சேர்க்கவும் \n• மேம்படுத்தப்பட்ட பிழை பேனலைக் காண்பிப்பதன் மூலம் சில செயலிழப்புகளைத் தடுக்கவும் \n• உள்ளடக்கம் ஏன் கிடைக்கவில்லை என்பது பற்றிய கூடுதல் தகவலைக் காட்டு \n• ஆர்டுவேர் ச்பேச் பட்டன் பிளே/இடைநிறுத்தத்தை தூண்டுகிறது \n• \"பதிவிறக்கம் தொடங்கியது\" டோச்ட்டைக் காட்டு \n\nசரி செய்யப்பட்டது: \n• பின்னணியில் விளையாடும் போது வீடியோ விவரங்களில் மிகச் சிறிய சிறுபடத்தைச் சரிசெய்யவும் \n• குறைக்கப்பட்ட பிளேயரில் வெற்று தலைப்பை சரிசெய்யவும் \n• சரியாக மீட்டெடுக்கப்படாத கடைசி மறுஅளவிடுதல் பயன்முறையைச் சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/967.txt",
    "content": "­ஐரோப்பிய ஒன்றியத்தில் YouTube சரியாக வேலை செய்யவில்லை என்று சரி செய்யப்பட்டது. இது ஒரு புதிய குக்கீ மற்றும் தனியுரிமை ஒப்புதல் அமைப்பால் ஏற்பட்டது, இதற்கு நியூபைப் ஒப்புதல் குக்கீயை அமைக்க வேண்டும்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/968.txt",
    "content": "நீண்ட அழுத்த மெனுவுக்கு சேனல் விவரங்கள் விருப்பம் சேர்க்கப்பட்டது.\n பிளேலிச்ட் இடைமுகத்திலிருந்து பிளேலிச்ட் பெயரை மறுபெயரிட செயல்பாடு சேர்க்கப்பட்டது.\n ஒரு வீடியோ இடையகப்படுத்தும்போது பயனரை இடைநிறுத்த அனுமதிக்கவும்.\n வெள்ளை கருப்பொருளை மெருகூட்டியது.\n பெரிய எழுத்துரு அளவைப் பயன்படுத்தும் போது நிலையான ஒன்றுடன் ஒன்று எழுத்துருக்கள்.\n தேற்றம் மற்றும் செஃபியர் சாதனங்களில் எந்த வீடியோவும் இல்லை.\n பல்வேறு விபத்துக்கள் சரி செய்யப்பட்டன.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/969.txt",
    "content": "• வெளிப்புற சேமிப்பகத்தில் நிறுவலை அனுமதிக்கவும் \n• [Bandcamp] ச்ட்ரீமில் முதல் மூன்று கருத்துகளைக் காண்பிப்பதற்கான உதவி சேர்க்கப்பட்டது \n• பதிவிறக்கம் தொடங்கும் போது 'பதிவிறக்கம் தொடங்கியது' டோச்ட்டை மட்டும் காட்டவும் \n• குக்கீகள் சேமிக்கப்படாதபோது reCaptcha குக்கீயை அமைக்க வேண்டாம் \n• [பிளேயர்] கேச் செயல்திறனை மேம்படுத்தவும் \n• [பிளேயர்] நிலையான பிளேயர் தானாகவே விளையாடுவதில்லை \n• பதிவிறக்கங்களை நீக்கும் போது முந்தைய ச்நாக்பார்களை நிராகரிக்கவும் \n• பட்டியலில் இல்லாத பொருளை நீக்க முயற்சிப்பது சரி செய்யப்பட்டது\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/970.txt",
    "content": "புதியது \n• விளக்கத்திற்குக் கீழே உள்ளடக்க மெட்டாடேட்டாவை (குறிச்சொற்கள், வகைகள், உரிமம், ...) காட்டு \n• ரிமோட் (உள்ளூர் அல்லாத) பிளேலிச்ட்களில் \"சேனல் விவரங்களைக் காட்டு\" விருப்பம் சேர்க்கப்பட்டது \n• பட்டியலில் \"உலாவியில் திற\" விருப்பம் சேர்க்கப்பட்டது \n\nசரி செய்யப்பட்டது \n• வீடியோ விவரம் பக்கத்தில் நிலையான சுழற்சி செயலிழப்பு \n• பிளேயரில் நிலையான \"கோடியுடன் விளையாடு\" பொத்தான் எப்போதும் கோரை நிறுவும்படி கேட்கும் \n• நிலையான மற்றும் மேம்படுத்தப்பட்ட அமைப்பு இறக்குமதி மற்றும் ஏற்றுமதி பாதைகள் \n• [YouTube] எண்ணிக்கை போன்ற நிலையான கருத்து \nமேலும் பல\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/971.txt",
    "content": "ஆட்ஃபிக்ச்\n Re மறுதொடக்கத்திற்குப் பிறகு பிளேபேக்கிற்கான இடையகத்தை அதிகரிக்கவும்\n The பிளேயரில் பிளே-குயு ஐகானைக் சொடுக்கு செய்யும் போது டேப்லெட்டுகள் மற்றும் டிவிகளில் நிலையான விபத்து\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/972.txt",
    "content": "புதியது \nவிளக்கத்தில் நேர முத்திரைகள் மற்றும் ஏச்டேக்குகளை அங்கீகரிக்கவும் \nகைமுறை டேப்லெட் பயன்முறை அமைப்பு சேர்க்கப்பட்டது \nவிளையாடிய பொருட்களை ஊட்டத்தில் மறைக்கும் திறன் சேர்க்கப்பட்டது \n\nமேம்படுத்தப்பட்டது \nசேமிப்பக அணுகல் கட்டமைப்பை சரியாக ஆதரிக்கவும் \nகிடைக்காத மற்றும் நிறுத்தப்பட்ட சேனல்களின் சிறந்த பிழை கையாளுதல் \nAndroid 10+ பயனர்களுக்கான ஆண்ட்ராய்டு பகிர்வுத் தாள் இப்போது உள்ளடக்கத் தலைப்பைக் காட்டுகிறது. \nஇன்வைடியச் நிகழ்வுகள் மற்றும் உதவி பைப் இணைப்புகள் புதுப்பிக்கப்பட்டன. \n\nசரி செய்யப்பட்டது \n[YouTube] அகவை வரம்பிடப்பட்ட உள்ளடக்கம் \nதேர்வு உரையாடலைத் திறக்கும்போது கசிந்த சாளர விதிவிலக்கைத் தடுக்கவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/973.txt",
    "content": "ஆட்ஃபிக்ச்\n Rel ஒரு வரிசையில் எத்தனை வீடியோக்கள் பொருந்தக்கூடும் என்பதற்கான தவறான கணக்கீடு காரணமாக, கட்டம் மற்றும் தலைப்புகள் கட்டம் தளவமைப்பில் ஒழுங்கமைக்கப்படுவதை சரிசெய்யவும்\n பங்கு பங்கு மெனுவிலிருந்து திறக்கப்பட்டால் எதுவும் செய்யாமல் பதிவிறக்கம் உரையாடல் மறைந்துவிடும்\n Case சேமிப்பக அணுகல் கட்டமைப்பின் கோப்பு எடுப்பவர் போன்ற வெளிப்புற செயல்பாடுகளைத் திறப்பது தொடர்பான நூலகத்தைப் புதுப்பிக்கவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/974.txt",
    "content": "ஆட்ஃபிக்ச்\n You யூடியூப் தூண்டுதலால் ஏற்படும் இடையக சிக்கல்களை சரிசெய்யவும்\n You யூடியூப் கருத்துகள் பிரித்தெடுத்தல் மற்றும் முடக்கப்பட்ட கருத்துகளுடன் செயலிழப்புகளை சரிசெய்யவும்\n You யூடியூப் இசை தேடலை சரிசெய்யவும்\n The Peretube LiveStreams ஐ சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/975.txt",
    "content": "புதியது \n• தேடும் போது சிறுபட மாதிரிக்காட்சியைக் காட்டு \n• முடக்கப்பட்ட கருத்துகளைக் கண்டறியவும் \n• ஊட்டப் பொருளைப் பார்த்ததாகக் குறிக்க அனுமதிக்கவும் \n• கருத்து இதயங்களைக் காட்டு \n\nமேம்படுத்தப்பட்டது \n• மேனிலை தரவு மற்றும் குறிச்சொற்களின் தளவமைப்பை மேம்படுத்தவும் \n• இடைமுகம் கூறுகளுக்கு பணி வண்ணத்தைப் பயன்படுத்துங்கள் \n\nசரி செய்யப்பட்டது \n• மினி பிளேயரில் சிறுபடத்தை சரிசெய்யவும் \n• நகல் வரிசை உருப்படிகளில் முடிவற்ற இடையகத்தை சரிசெய்யவும் \n• சுழற்சி மற்றும் வேகமாக மூடுவது போன்ற சில பிளேயர் திருத்தங்கள் \n• பின்னணியில் மீதமுள்ள ReCAPTCHA ஐ சரிசெய்யவும் \n• ஊட்டத்தைப் புதுப்பிக்கும்போது கிளிக்குகளை முடக்கவும் \n• சில டவுன்லோடர் செயலிழப்புகளை சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/976.txt",
    "content": "• பிளேயரை முழுத்திரையில் நேரடியாகத் திறக்க விருப்பம் சேர்க்கப்பட்டது \n• எந்த வகையான தேடல் பரிந்துரைகளைக் காட்ட வேண்டும் என்பதைத் தேர்ந்தெடுக்க அனுமதிக்கவும் \n• டார்க் கருப்பொருள் இப்போது டார்க் + டார்க் ச்பிளாச் திரை சேர்க்கப்பட்டது \n• தேவையற்ற கோப்புகளை சாம்பல் நிறமாக்க மேம்படுத்தப்பட்ட கோப்பு தேர்வி \n• YouTube சந்தாக்களை இறக்குமதி செய்வது சரி செய்யப்பட்டது \n• ச்ட்ரீமை மீண்டும் இயக்க, ரீப்ளே பட்டனை மீண்டும் தட்ட வேண்டும் \n• நிலையான நிறைவு ஆடியோ அமர்வு \n• [Android TV] DPad ஐப் பயன்படுத்தும் போது நிலையான நீண்ட சீக்பார் சம்ப்கள் \n\nமேலும் மாற்றங்களைப் பார்க்க, கீழே உள்ள இணைப்புகள் தாவலில் இருந்து சேஞ்ச்லாக் (மற்றும் வலைப்பதிவு இடுகை) பார்க்கவும்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/977.txt",
    "content": "• நீண்ட அழுத்த பட்டியலில் \"அடுத்து விளையாடு\" பொத்தான் சேர்க்கப்பட்டது \n• யூடியூப் சார்ட்ச் பாதை முன்னொட்டு இன்டென்ட் ஃபில்டரில் சேர்க்கப்பட்டது \n• நிலையான அமைப்புகள் இறக்குமதி \n• வரிசை திரையில் பிளேயர் பட்டன்களுடன் சீக்பார் நிலையை மாற்றவும் \n• MediasessionManager தொடர்பான பல்வேறு திருத்தங்கள் \n• வீடியோ முடிந்த பிறகு நிலையான சீக்பார் முடிக்கப்படவில்லை \n• RealtekATV இல் முடக்கப்பட்ட மீடியா டன்னலிங் \n• விரிவாக்கப்பட்ட குறைக்கப்பட்ட பிளேயர் பொத்தான்கள் சொடுக்கு செய்யக்கூடிய பகுதி \n\nமேலும் மாற்றங்களைப் பார்க்க, கீழே உள்ள இணைப்புகள் தாவலில் இருந்து சேஞ்ச்லாக் (மற்றும் வலைப்பதிவு இடுகை) பார்க்கவும்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/978.txt",
    "content": "புதிய நியூபைப் பதிப்பிற்கான காசோலையை செயல்படுத்துதல். இந்த காசோலை சில நேரங்களில் மிக விரைவாக செயல்படுத்தப்பட்டது, எனவே பயன்பாட்டு விபத்துக்கு வழிவகுக்கும். அது இப்போது சரி செய்யப்பட வேண்டும்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/979.txt",
    "content": "- நிலையான மீண்டும் தொடங்கும் பின்னணி\n - புதிய பதிப்பு காசோலைகளை நியூபைப் சரிபார்க்க வேண்டுமா என்பதை தீர்மானிக்கும் பணி பின்னணியில் தொடங்கப்படவில்லை என்பதை உறுதி செய்வதற்கான மேம்பாடுகள்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/980.txt",
    "content": "புதியது \n• மெனுவைப் பகிர \"பிளேலிச்ட்டில் சேர்\" விருப்பம் சேர்க்கப்பட்டது \n• y2u.be மற்றும் PeerTube குறுகிய இணைப்புகளுக்கான உதவி சேர்க்கப்பட்டது \n\nமேம்படுத்தப்பட்டது \n• பிளேபேக்-வேக-கட்டுப்பாடுகள் மிகவும் கச்சிதமானவை \n• தீவனம் இப்போது புதிய உருப்படிகளை முன்னிலைப்படுத்துகிறது \n• ஊட்டத்தில் \"பார்த்த பொருட்களைக் காட்டு\" விருப்பம் இப்போது சேமிக்கப்பட்டது \n\nசரி செய்யப்பட்டது \n• நிலையான YouTube விருப்பு வெறுப்புகள் பிரித்தெடுத்தல் \n• பின்புலத்தில் இருந்து திரும்பிய பிறகு, தானியங்கி ரீப்ளே சரி செய்யப்பட்டது \nமேலும் பல\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/981.txt",
    "content": "ஆண்ட்ராய்டு 11+ இல் இடையகத்திற்குப் பிறகு தோல்வியுற்ற பின்னணி விண்ணப்பத்தை சரிசெய்ய மீடியா பார்சர் ஆதரவை அகற்றியது.\n பின்னணி சிக்கல்களை சரிசெய்ய பிலிப்ச் QM16XE இல் முடக்கப்பட்ட மீடியா சுரங்கப்பாதை.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/982.txt",
    "content": "நிலையான YouTube எந்த ச்ட்ரீமையும் இயக்கவில்லை.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/983.txt",
    "content": "புதிய இருமுறை தட்டுவதன் மூலம் தேடும் இடைமுகம் மற்றும் நடத்தையைச் சேர்க்கவும் \nதேடக்கூடிய அமைப்புகளை உருவாக்கவும் \nபின் செய்யப்பட்ட கருத்துகளை முன்னிலைப்படுத்தவும் \nFSFE இன் PeerTube நிகழ்விற்கு திறந்த பயன்பாட்டு ஆதரவைச் சேர்க்கவும் \nபிழை அறிவிப்புகளைச் சேர்க்கவும் \nபிளேயரை மாற்றும்போது முதல் வரிசை உருப்படியை மீண்டும் இயக்குவதை சரிசெய்யவும் \nலைவ்ச்ட்ரீம்களின் போது இடையீடு செய்யும் போது, தோல்வியடையும் முன் அதிக நேரம் காத்திருக்கவும் \nஉள்ளக தேடல் முடிவுகளின் வரிசையை சரிசெய்யவும் \nவிளையாட்டு வரிசையில் வெற்று உருப்படி புலங்களை சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/984.txt",
    "content": "முழுத் திரையையும் நிரப்பவும், டேப்லெட்டுகள் மற்றும் டிவிகளில் ச்க்ரோலிங் செய்வதை சரிசெய்யவும் போதுமான ஆரம்ப உருப்படிகளை பட்டியல்களில் ஏற்றவும் \nபட்டியல்கள் மூலம் ச்க்ரோலிங் செய்யும் போது சீரற்ற செயலிழப்புகளை சரிசெய்யவும் \nபிளேயர் ஃபாச்ட் சீக் ஓவர்லே ஆர்க் சிச்டம் யுஐயின் கீழ் செல்ல வேண்டும் \nமல்டி விண்டோவில் விளையாடும் போது கட்அவுட்களுக்கு மாற்றங்களை மாற்றவும், இதனால் சில ஃபோன்களில் பிளேயரின் தவறான பின்னடைவு ஏற்படுகிறது \ncompileSdk ஐ 30 இலிருந்து 31 ஆக அதிகரிக்கவும் \nபிழை அறிக்கையிடல் நூலகத்தைப் புதுப்பிக்கவும் \nபிளேயரில் சில குறியீட்டை மறுவடிவமைக்கவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/985.txt",
    "content": "நிலையான யூடியூப் எந்த ச்ட்ரீமையும் இயக்கவில்லை\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/986.txt",
    "content": "புதியது \n• புதிய ச்ட்ரீம்களுக்கான அறிவிப்புகள் \n• பின்னணி மற்றும் வீடியோ பிளேயர்களுக்கு இடையே தடையற்ற மாற்றம் \n• செமிடோன்கள் மூலம் சுருதியை மாற்றவும் \n• பிளேலிச்ட்டில் முதன்மையான பிளேயர் வரிசையைச் சேர்க்கவும் \n\nமேம்படுத்தப்பட்டது \n• வேகம்/சுருதி படி அளவை நினைவில் கொள்ளுங்கள் \n• வீடியோ பிளேயரில் ஆரம்ப நீண்ட இடையகத்தைத் தணிக்கவும் \n• ஆண்ட்ராய்டு TVக்கான பிளேயர் UIஐ மேம்படுத்தவும் \n• பதிவிறக்கம் செய்யப்பட்ட அனைத்து கோப்புகளையும் நீக்கும் முன் உறுதிப்படுத்தவும் \n\nசரி செய்யப்பட்டது \n• பிளேயர் கட்டுப்பாடுகளை மறைக்காத மீடியா பொத்தான்களை சரிசெய்யவும் \n• பிளேயரின் வகை மாற்றத்தில் பிளேபேக் மீட்டமைப்பை சரிசெய்யவும் \n• பிளேலிச்ட் உரையாடலைச் சுழற்றுவதைச் சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/987.txt",
    "content": "புதியது \n• முற்போக்கான HTTPயைத் தவிர வேறு டெலிவரி முறைகள்: வேகமான பிளேபேக் ஏற்றுதல் நேரம், PeerTube மற்றும் SoundCloudக்கான திருத்தங்கள், அண்மைக் காலத்தில் முடிவடைந்த YouTube லைவ்ச்ட்ரீம்களின் பிளேபேக் \n• உள்ளக ஒன்றில் ரிமோட் பிளேலிச்ட்டைச் சேர்க்க பொத்தானைச் சேர்க்கவும் \n• ஆண்ட்ராய்டு 10+ பகிர்வு தாளில் பட முன்னோட்டம் \n\nமேம்படுத்தப்பட்டது \n• பிளேபேக் அளவுருக்கள் உரையாடலை மேம்படுத்தவும் \n• சந்தா இறக்குமதி/ஏற்றுமதி பொத்தான்களை மூன்று-புள்ளி மெனுவிற்கு நகர்த்தவும் \n\nசரி செய்யப்பட்டது \n• பிளேலிச்ட்டில் இருந்து முழுமையாகப் பார்த்த வீடியோக்களை அகற்றுவதைச் சரிசெய்யவும் \n• பகிர்வு பட்டியல் கருப்பொருள் மற்றும் \"பிளேலிச்ட்டில் சேர்\" உள்ளீட்டைச் சரிசெய்தல்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/988.txt",
    "content": "[YouTube] எந்த வீடியோவையும் இயக்க முயற்சிக்கும்போது \"எந்த ச்ட்ரீமையும் பெற முடியவில்லை\" பிழையை சரிசெய்தல்\n [YouTube] சரிசெய்யவும் \"இந்த பயன்பாட்டில் பின்வரும் உள்ளடக்கம் கிடைக்கவில்லை.\" கோரப்பட்ட வீடியோவுக்கு பதிலாக செய்தி காட்டப்பட்டுள்ளது\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/989.txt",
    "content": "• [YouTube] எந்த வீடியோவையும் இயக்க முயற்சிக்கும்போது எல்லையற்ற ஏற்றுதலை சரிசெய்யவும்\n • [YouTube] சில வீடியோக்களில் தூண்டுதலை சரிசெய்யவும்\n J JSOUP நூலகத்தை 1.15.3 ஆக மேம்படுத்தவும், இதில் பாதுகாப்பு பிழைத்திருத்தம் அடங்கும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/990.txt",
    "content": "இந்த வெளியீடு ஆண்ட்ராய்டு 4.4 KitKat க்கான ஆதரவைக் குறைக்கிறது, இப்போது குறைந்தபட்ச பதிப்பு ஆண்ட்ராய்டு 5 Lollipop! \n\nபுதியது \n• நீண்ட அழுத்த மெனுவிலிருந்து பதிவிறக்கவும் \n• எதிர்கால வீடியோக்களை ஊட்டத்தில் மறைக்கவும் \n• உள்ளக பிளேலிச்ட்களைப் பகிரவும் \n\nமேம்படுத்தப்பட்டது \n• பிளேயர் குறியீட்டை சிறிய கூறுகளாக மாற்றவும்: குறைவான ரேம் பயன்படுத்தப்பட்டது, குறைவான பிழைகள் \n• சிறுபடங்களின் அளவு பயன்முறையை மேம்படுத்தவும் \n• வெக்டார்-ஐச் பட பிளேச்ஓல்டர்கள் \n\nசரி செய்யப்பட்டது \n• பிளேயர் அறிவிப்பில் உள்ள பல்வேறு சிக்கல்களைச் சரிசெய்யவும்: காலாவதியான/காணாமல் போன மீடியா செய்தி, சிதைந்த சிறுபடம் \n• 1/4 திரையைப் பயன்படுத்தி முழுத்திரையை சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/991.txt",
    "content": "புதியது \n• பிழை பேனலில் \"உலாவியில் திற\" பொத்தானைச் சேர்க்கவும் \n• சேனல் குழுக்களை பட்டியலாகக் காண்பிக்க விருப்பத்தைச் சேர்க்கவும் \n• [YouTube] நேர முத்திரை URLஐப் பகிர, ச்ட்ரீம் பிரிவுகளில் நீண்ட சொடுக்கு செய்யவும் \n• மினி பிளேயரில் பிளே வரிசை பொத்தானைச் சேர்க்கவும் \n\nமேம்படுத்தப்பட்டது \n• ஐச்லாண்டிக் உள்ளூர்மயமாக்கலைச் சேர்க்கவும் மற்றும் பல பிற மொழிபெயர்ப்புகளைப் புதுப்பிக்கவும் \n• பல உள் மேம்பாடுகள் \n\nசரி செய்யப்பட்டது \n• பல செயலிழப்புகளைச் சரிசெய்யவும் \n• [YouTube] சில நாடுகளில் ஏற்றப்படும் சேனல்கள், பிரத்யேகமற்ற ஊட்டம் மற்றும் தீர்விற்கான பின்னணி சிக்கல்களை சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/992.txt",
    "content": "புதியது \n• வீடியோ விவரங்களில் சந்தாதாரர் எண்ணிக்கை \n• வரிசையில் இருந்து பதிவிறக்கவும் \n• பிளேலிச்ட் சிறுபடத்தை நிரந்தரமாக அமைக்கவும் \n• ஏச்டேக்குகள் மற்றும் இணைப்புகளை நீண்ட நேரம் அழுத்தவும் \n• அட்டை பார்வை முறை \n\nமேம்படுத்தப்பட்டது \n• பெரிய மினி பிளேயர் மூடும் பொத்தான் \n• மென்மையான சிறுபடம் குறைத்தல் \n• இலக்கு ஆண்ட்ராய்டு 13 (API 33) \n• தேடுவது இனி வீரர் இடைநிறுத்தப்படாது \n\nசரி செய்யப்பட்டது \n• DeX/mouse மீது மேலடுக்கை சரிசெய்யவும் \n• தனி ஆடியோ ச்ட்ரீம்கள் இல்லாமல் பின்னணி பிளேயரை அனுமதிக்கவும் \n• பல்வேறு YouTube திருத்தங்கள் மற்றும் பல…\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/993.txt",
    "content": "புதியது \n• பிளேலிச்ட் நகல்களைச் சேர்க்கும்போது எச்சரிக்கையைச் சேர்க்கவும், அவற்றை அகற்ற பொத்தானைச் சேர்க்கவும் \n• வன்பொருள் பொத்தான்களைப் புறக்கணிப்பதை அனுமதிக்கவும் \n• ஊட்டத்தில் ஓரளவு பார்த்த வீடியோக்களை மறைக்க அனுமதிக்கவும் \n\nமேம்படுத்தப்பட்டது \n• பெரிய திரைகளில் அதிக கட்ட நெடுவரிசைகளைப் பயன்படுத்தவும் \n• முன்னேற்றக் குறிகாட்டிகளை அமைப்புகளுடன் ஒத்துப்போகச் செய்யவும் \n\nசரி செய்யப்பட்டது \n• ஆண்ட்ராய்டு 11+ இல் திறக்கும் உலாவி URLகள், பதிவிறக்கங்கள் மற்றும் வெளிப்புற பிளேயர்களைச் சரிசெய்யவும் \n• MIUI இல் இரண்டு தட்டுகள் தேவைப்படும் முழுத்திரையுடன் தொடர்புகொள்வதை சரிசெய்யவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/994.txt",
    "content": "புதியது \n• பல ஆடியோ டிராக்குகள்/மொழிகளை ஆதரிக்கவும் \n• திரையின் எந்தப் பக்கத்திலும் ஒலியளவு மற்றும் பிரகாச சைகைகளை அமைக்க அனுமதிக்கவும் \n• திரையின் அடிப்பகுதியில் முதன்மையான தாவல்களைக் காண்பிப்பதற்கான உதவி \n\nமேம்படுத்தப்பட்டது \n• [பேண்ட்கேம்ப்] பே சுவரின் பின்னால் டிராக்குகளைக் கையாளவும் \n\nசரி செய்யப்பட்டது \n• [YouTube] ச்ட்ரீம்களுக்கான 403 HTTP பிழைகள் \n• பிளேலிச்ட் பார்வையில் இருந்து மெயின் பிளேயருக்கு மாறும்போது பிளாக் பிளேயர் \n• பிளேயர் பணி நினைவகம் கசிவு \n• [PeerTube] பதிவேற்றி மற்றும் துணை சேனல் அவதாரங்கள் மாற்றப்பட்டன \n\nமேலும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/995.txt",
    "content": "புதியது \n• உதவி சேனல் தாவல்கள் \n• படத்தின் தரத்தைத் தேர்ந்தெடுக்கவும் \n• அனைத்து படங்களுக்கும் URLகளைப் பெறுங்கள் \n\nமேம்படுத்தப்பட்டது \n• பிளேயர் இடைமுகங்களின் அணுகல் \n• வீடியோ மட்டும் பதிவிறக்கம் செய்ய சிறந்த ஆடியோ தேர்வு \n• பகிரப்பட்ட பிளேலிச்ட் உள்ளடக்கத்தில் பிளேலிச்ட் மற்றும் வீடியோ பெயர்களைச் சேர்ப்பதற்கான விருப்பம் \n\nசரி செய்யப்பட்டது \n• [YouTube] லைக் எண்ணிக்கையை சரிசெய்தல் \n• பாப்அப்கள் மற்றும் செயலிழப்புகளுக்கு பதிலளிக்காத பிளேயரை சரிசெய்யவும் \n• மொழித் தேர்வில் தவறான மொழிகளின் தேர்வு \n• பிளேயர் ஆடியோ கவனம் முடக்கத்தை மதிக்கவில்லை \n• பிளேலிச்ட் உருப்படி சேர்த்தல் எப்போதாவது வேலை செய்யாது\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/996.txt",
    "content": "Media.ccc.de இல் ஒரு சேனல் / மாநாட்டைத் திறக்கும்போது ஒரு NullPointerException சரி செய்யப்பட்டது.\n எங்கள் கிறிச்துமச் பரிசை உங்களுக்கு உடைக்க க்ரிஞ்ச் முயன்றார், ஆனால் நாங்கள் அதை சரிசெய்தோம்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/997.txt",
    "content": "புதியது \n• கருத்து பதில்களைச் சேர்க்கவும் \n• பிளேலிச்ட்களை மறுவரிசைப்படுத்த அனுமதிக்கவும் \n• பிளேலிச்ட் விளக்கம் மற்றும் கால அளவைக் காட்டு \n• அமைப்புகளை மீட்டமைக்க அனுமதிக்கவும் \n\nமேம்படுத்தப்பட்டது \n• [Android 13+] தனிப்பயன் அறிவிப்பு செயல்களை மீட்டெடுக்கவும் \n• புதுப்பிப்பு சரிபார்ப்புக்கு ஒப்புதல் கோரவும் \n• இடையகத்தின் போது அறிவிப்பை இயக்க/இடைநிறுத்த அனுமதிக்கவும் \n• சில அமைப்புகளை மறுவரிசைப்படுத்தவும் \n\nசரி செய்யப்பட்டது \n• [YouTube] கருத்துகள் ஏற்றப்படாமல் இருப்பதை சரிசெய்தல், மேலும் பிற திருத்தங்கள் மற்றும் மேம்பாடுகள் \n• அமைப்புகள் இறக்குமதியில் உள்ள பாதிப்பைத் தீர்த்து, JSONக்கு மாறவும் \n• பல்வேறு பதிவிறக்க திருத்தங்கள் \n• தேடல் உரையை ஒழுங்கமைக்கவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/998.txt",
    "content": "HTTP 403 பிழைகள் காரணமாக யூடியூப் எந்த ச்ட்ரீமையும் இயக்கவில்லை.\n\n யூடியூப் வீடியோவின் நடுவில் அவ்வப்போது HTTP 403 பிழைகள் இன்னும் சரி செய்யப்படவில்லை.\n அந்த சிக்கல் விரைவில் மற்றொரு ஆட்ஃபிக்ச் வெளியீட்டில் தீர்க்கப்படும்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/changelogs/999.txt",
    "content": "இந்த ஆட்ஃபிக்ச் வெளியீடு YouTube வீடியோக்களின் நடுவில் HTTP 403 பிழைகளை சரிசெய்கிறது. \n\nபுதியது \n• [SoundCloud] on.soundcloud.com URLகளுக்கான ஆதரவைச் சேர்க்கவும் \n\nமேம்படுத்தப்பட்டது \n• [பேண்ட்கேம்ப்] ரேடியோ கியோச்கில் கூடுதல் தகவலைக் காட்டு \n\nசரி செய்யப்பட்டது \n• [YouTube] வீடியோக்களின் தொடக்கத்திலோ அல்லது நடுவிலோ அவ்வப்போது HTTP 403 பிழைகளைச் சரிசெய்யவும் \n• [YouTube] அதிக சேனல் தலைப்பு வகைகளிலிருந்து அவதார் மற்றும் பேனரைப் பிரித்தெடுக்கவும் \n• [Bandcamp] பல்வேறு பிழைகளை சரிசெய்து எப்போதும் HTTPS ஐப் பயன்படுத்தவும்\n"
  },
  {
    "path": "fastlane/metadata/android/ta/full_description.txt",
    "content": "நியூபைப் எந்த Google கட்டமைப்பின் நூலகங்களையும் அல்லது YouTube பநிஇ ஐயும் பயன்படுத்தாது. இது வலைத்தளத்தைத் தேவையான தகவல்களைப் பெறுவதற்காக மட்டுமே பாகுபடுத்துகிறது. எனவே இந்த பயன்பாட்டை கூகிள் சேவைகள் நிறுவாமல் சாதனங்களில் பயன்படுத்தலாம். மேலும், நியூபிப்பைப் பயன்படுத்த உங்களுக்கு யூடியூப் கணக்கு தேவையில்லை, அது ஃப்ளோச்.\n"
  },
  {
    "path": "fastlane/metadata/android/ta/short_description.txt",
    "content": "ஆன்டிராயிடுக்கான இலவச இலகுரக யூடியூப் முன்பக்கம்.\n"
  },
  {
    "path": "fastlane/metadata/android/te/changelogs/63.txt",
    "content": "### మెరుగుదలలు\n- దిగుమతి/ఎగుమతి సెట్టింగ్‌లు #1333\n- ఓవర్‌డ్రాను తగ్గించండి (పనితీరు మెరుగుదల) #1371\n- చిన్న కోడ్ మెరుగుదలలు #1375\n- GDPR #1420 గురించి అన్నింటినీ జోడించండి\n\n### పరిష్కరించబడినవి\n- డౌన్‌లోడర్: .giga ఫైల్స్ #1407 నుండి అసంపూర్తి డౌన్‌లోడ్‌లను లోడ్ చేయడంలో క్రాష్‌ని పరిష్కరించండి\n"
  },
  {
    "path": "fastlane/metadata/android/te/changelogs/64.txt",
    "content": "### మెరుగులు\n- మొబైల్ డేటాను ఉపయోగిస్తుంటే వీడియో నాణ్యతను పరిమితం చేసే సామర్థ్యం జోడించబడింది. #1339\n- సెషన్ #1442 కోసం ప్రకాశాన్ని గుర్తుంచుకోండి\n- బలహీనమైన CPUల కోసం డౌన్‌లోడ్ పనితీరును మెరుగుపరచండి #1431\n- మీడియా సెషన్ #1433 కోసం (పని) మద్దతును జోడించండి\n\n### పరిష్కరించండి\n- డౌన్‌లోడ్‌లను తెరవడంపై క్రాష్‌ని పరిష్కరించండి (విడుదల బిల్డ్‌ల కోసం ఇప్పుడు అందుబాటులో ఉంది) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/te/changelogs/65.txt",
    "content": "### మెరుగుదలలు\n\n- బర్గర్‌మెను ఐకాన్ యానిమేషన్ #1486ని నిలిపివేయండి\n- డౌన్‌లోడ్‌ల తొలగింపును రద్దు చేయండి #1472\n- షేర్ మెను #1498లో డౌన్‌లోడ్ ఎంపిక\n- లాంగ్ ట్యాప్ మెనూ #1454కి షేర్ ఆప్షన్ జోడించబడింది\n- నిష్క్రమణ #1354లో ప్రధాన ప్లేయర్‌ని తగ్గించండి\n- లైబ్రరీ వెర్షన్ అప్‌డేట్ మరియు డేటాబేస్ బ్యాకప్ ఫిక్స్ #1510\n- ExoPlayer 2.8.2 నవీకరణ #1392\n  - వేగవంతమైన స్పీడ్ మార్పు కోసం వివిధ దశల పరిమాణాలకు మద్దతు ఇవ్వడానికి ప్లేబ్యాక్ స్పీడ్ కంట్రోల్ డైలాగ్‌ని మళ్లీ రూపొందించారు.\n  - ప్లేబ్యాక్ స్పీడ్ కంట్రోల్‌లో నిశ్శబ్దం సమయంలో ఫాస్ట్-ఫార్వర్డ్ చేయడానికి టోగుల్ జోడించబడింది. ఇది ఆడియోబుక్‌లు మరియు నిర్దిష్ట సంగీత శైలులకు సహాయకరంగా ఉండాలి మరియు నిజమైన అతుకులు లేని అనుభవాన్ని అందించగలదు (మరియు అనేక నిశ్శబ్దాలతో పాటను విచ్ఛిన్నం చేయవచ్చు =\\\\).\n  - మాన్యువల్‌గా కాకుండా ప్లేయర్‌లో అంతర్గతంగా మీడియాతో పాటు మెటాడేటాను పాస్ చేయడానికి రీఫ్యాక్టర్డ్ మీడియా సోర్స్ రిజల్యూషన్. ఇప్పుడు మేము మెటాడేటా యొక్క ఒకే మూలాన్ని కలిగి ఉన్నాము మరియు ప్లేబ్యాక్ ప్రారంభమైనప్పుడు నేరుగా అందుబాటులో ఉంటుంది.\n  - ప్లేజాబితా భాగాన్ని తెరిచినప్పుడు కొత్త మెటాడేటా అందుబాటులో ఉన్నప్పుడు స్థిర రిమోట్ ప్లేజాబితా మెటాడేటా నవీకరించబడదు.\n  - వివిధ UI పరిష్కారాలు: #1383, బ్యాక్‌గ్రౌండ్ ప్లేయర్ నోటిఫికేషన్ నియంత్రణలు ఇప్పుడు ఎల్లప్పుడూ తెల్లగా ఉంటాయి, ఫ్లింగ్ ద్వారా పాప్‌అప్ ప్లేయర్‌ని షట్‌డౌన్ చేయడం సులభం\n- మల్టీసర్వీస్ కోసం రీఫ్యాక్టర్డ్ ఆర్కిటెక్చర్‌తో కొత్త ఎక్స్‌ట్రాక్టర్‌ని ఉపయోగించండి\n\n### పరిష్కారాలు\n\n- #1440 బ్రోకెన్ వీడియో ఇన్ఫో లేఅవుట్ #1491ని పరిష్కరించండి\n- చరిత్ర పరిష్కారాన్ని వీక్షించండి #1497\n  - #1495, యూజర్ ప్లేజాబితాను యాక్సెస్ చేసిన వెంటనే మెటాడేటా (థంబ్‌నెయిల్, టైటిల్ మరియు వీడియో కౌంట్) అప్‌డేట్ చేయడం ద్వారా.\n  - #1475, వినియోగదారు వివరాలు ఫ్రాగ్‌మెంట్‌పై బాహ్య ప్లేయర్‌లో వీడియోను ప్రారంభించినప్పుడు డేటాబేస్‌లో వీక్షణను నమోదు చేయడం ద్వారా.\n- పాప్అప్ మోడ్ విషయంలో స్క్రీన్ సమయం ముగియడాన్ని పరిష్కరించండి. #1463 (స్థిర #640)\n- ప్రధాన వీడియో ప్లేయర్ ఫిక్స్ #1509\n  - [#1412] ప్లేయర్ యాక్టివిటీ బ్యాక్‌గ్రౌండ్‌లో ఉన్నప్పుడు కొత్త ఉద్దేశం వచ్చినప్పుడు ప్లేయర్ NPEకి కారణమయ్యే ఫిక్స్డ్ రిపీట్ మోడ్.\n  - పాప్‌అప్‌కి ప్లేయర్‌ని కనిష్టీకరించడం అనేది పాప్‌అప్ అనుమతి ఇవ్వనప్పుడు ప్లేయర్‌ను నాశనం చేయదు.\n"
  },
  {
    "path": "fastlane/metadata/android/te/full_description.txt",
    "content": "NewPipe ఏ Google ఫ్రేమ్‌వర్క్ లైబ్రరీలను లేదా YouTube APIని ఉపయోగించదు. ఇది వెబ్‌సైట్‌కు అవసరమైన సమాచారాన్ని పొందడం కోసం మాత్రమే అన్వయిస్తుంది. అందువల్ల ఈ యాప్‌ను Google సేవలు ఇన్‌స్టాల్ చేయని పరికరాలలో ఉపయోగించవచ్చు. అలాగే, NewPipeని ఉపయోగించడానికి మీకు YouTube ఖాతా అవసరం లేదు మరియు ఇది FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/te/short_description.txt",
    "content": "ఆండ్రాయిడ్ కోసం ఉచిత తేలికపాటి యూట్యూబ్ ఫ్రంటెండ్.\n"
  },
  {
    "path": "fastlane/metadata/android/th/changelogs/1000.txt",
    "content": "ที่มีการปรับปรุง\n• สร้างรายการเพลงที่สามารถคลิกให้แสดงได้โดยมีเนื้อหาเพื่มขึ้น/ลดลง\n• [PeerTube] แฮนเดิล `subscribeto.me` ลิงค์ของอินสแตนส์จะขึ้นอัตโนมัติ\n• • • เริ่มต้นด้วยรายการเดียวในประวัติของหน้าจอ\n\nที่มีการปรับปรุง\n• ปุ่มการมองเห็นของ RSS\n• พรีวิวแท็บตัวอย่างที่มีการขัดข้อง\n• แก้ไขหน้าปกของเพลย์ลิสต์ที่ไม่ขึ้น\n• แก้ไขการตั้งค่าการดาวน์โหลดก่อนที่จะปรากฏ\n• แก้ไขรายการที่เกี่ยวข้องกับคิวป๊อปอัป\n• แก้ไขลำดับในเพลย์ลิสต์ลงในรายการที่จะเล่น\n• ปรับแต่งเค้าโครงรายการบุ๊กมาร์กของเพลย์ลิสต์\n"
  },
  {
    "path": "fastlane/metadata/android/th/full_description.txt",
    "content": "NewPipe จะไม่ใช้เฟรมเวิร์กของกูเกิลที่มีหรือ API ของยูทูบ โดยแค่นำโครงสร้างของเว็บไซต์เพื่อนำข้อมูลที่ต้องการ ยังไงก็ตามตัวแอปก็สามารถใช้งานได้โดยไม่ต้องติดตั้งบริการของกูเกิล คุณไม่ต้องมีบัญชียูทูปเพื่อใช้ NewPipe, และตัว FLOSS\n"
  },
  {
    "path": "fastlane/metadata/android/th/short_description.txt",
    "content": "ยูทูปแบบฟรีที่เบาสําหรับแอนดรอยด์\n"
  },
  {
    "path": "fastlane/metadata/android/ti/changelogs/850.txt",
    "content": "እዚ ሕታም እዚ እቲ ወብ ሳይት ዩቱብ ዘዳለዎ ሕታም እዋናዊ እዩ ነይሩ። እቲ ናይ ቀደም ወብ ሳይት ሕታም ኣብ መጋቢት ስለ ዚቋረጽ ነቲ ሓድሽ ፓይፕ ከተመሓይሾ ኣሎካ።\n"
  },
  {
    "path": "fastlane/metadata/android/ti/full_description.txt",
    "content": "ኒውፓይፕ ዝዀነ ናይ ጉግል ቤተ-ምስሊታት ወይ ናይ ዩቱብ ኤፒኢይ ኣይጥቀምን ኢዩ። ነቲ መርበብ- ስፍራ ዜድልዮ ሓበሬታ ንምርካብ ጥራይ እዩ ዚምርምሮ። ስለዚ እዚ ኣፕሊኬሽን እዚ ብዘይ ናይ ጉግል ኣገልግሎት ኣብ ኤለክትሮኒካዊ-መሳርሒታት ክትጥቀመሉ ትኽእል ኢኻ። ኒውፓይፕ ንምጥቃም ናይ ዩቱብ ሕሳብ ኣየድልየካን ኢዩ፣ ኒውፓይፕ FLOSS ኢዩ።\n"
  },
  {
    "path": "fastlane/metadata/android/ti/short_description.txt",
    "content": "ነጻ ናይ ዩቱብ ግንባር ንኣንድሮይድ።\n"
  },
  {
    "path": "fastlane/metadata/android/tl/short_description.txt",
    "content": "Isang libreng magaan na frontend ng YouTube para sa Android.\n"
  },
  {
    "path": "fastlane/metadata/android/tok/full_description.txt",
    "content": "ilo Papisin\n"
  },
  {
    "path": "fastlane/metadata/android/tok/short_description.txt",
    "content": "ilo pi lukin e sitelen tawa pi ilo Jutu (YouTube) lon ilo Antoto (Android).\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/1000.txt",
    "content": "Geliştirmeler\n• Liste açıklamaları daha fazla/az göstermek için artık tıklanabilir\n• [PeerTube] `subscribeto.me` sunucu bağlantıları otomatik olarak işlenir\n• Geçmiş ekranında sadece tek bir item oynatılır\n\nDüzeltmeler\n• RSS buton görünürlüğü düzeltildi\n• Bar önizleme çökmeleri düzeltildi\n• Küçük resmi olmayan itemleri listeye ekleme düzeltildi\n• İndirme iletişim kutusu görünmeden önce çıkma düzeltildi\n• Listeye ekle diyalogundaki sıra düzeltildi\n• Liste yer imi öğe düzenini ayarlandı\n...\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/1001.txt",
    "content": "İyileştirildi\n• Android 13+'ta her zaman oynatıcı bildirim tercihlerini değiştirmeye izin ver\n\nDüzeltildi\n• Veritabanı/abonelikleri dışa aktarmak çoktan var olan bir dosyayı kısaltmayıp, muhtemelen bozuk bir dışa aktarıma sebep olması düzeltildi\n• Zaman damgasına tıklandığında oynatıcının başlangıçtan devam etmesi düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/1002.txt",
    "content": "YouTube'un herhangi bir akışı oynatmaması düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/1003.txt",
    "content": "YouTube'un herhangi bir akışı oynatmaması düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/1004.txt",
    "content": "YouTube'un herhangi bir akışı oynatmaması düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/1005.txt",
    "content": "Yeni\n• Android Auto desteği eklendi\n• Akış gruplarının ana ekran sekmeleri olarak ayarlanmasına izin verme\n• [YouTube] Geçici oynatma listesi olarak paylaşma\n• [SoundCloud] Beğenilen kanal sekmesi\n\nGeliştirildi\n• Daha iyi arama çubuğu önerileri\n• İndirilenler'de indirme tarihini gösterimi\n• Android 13 uygulama başı dil kullanma\n\nDüzeltildi\n• Karanlık modda bozuk metin renkleri düzeltildi\n• [YouTube] 100'den fazla öğeyi yüklemeyen oynatma listeleri düzeltildi\n• [YouTube] Eksik önerilen videolar düzeltildi\n• Geçmiş listesi görünümündeki çökmeler düzeltildi\n• Yorum yanıtlarındaki zaman damgaları düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/1006.txt",
    "content": "# Geliştirmeler (Improved)\n\n* Zaman damgalarına tıklandığında mevcut oynatıcıyı koru.\n* Mümkün olduğunda bekleyen indirme görevlerini kurtarmayı dene.\n* Dosyayı silmeden sadece indirme kaydını silme seçeneği ekle.\n* Üstte Gösterim İzni: Android R ve üzeri için açıklayıcı iletişim kutusu göster.\n* \"on.soundcloud\" bağlantılarını açma desteği.\n* Çok sayıda küçük iyileştirme ve optimizasyon.\n\n# Düzeltmeler (Fixed)\n\n* Android 7 altı sürümler için kısa sayı formatını düzelt.\n* Hayalet bildirimleri düzelt.\n* SRT altyazı dosyaları için düzeltmeler.\n* Çok sayıda çökme sorunu giderildi.\n\n# Geliştirme (Development)\n\n* Dahili kod modernizasyonu.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/1007.txt",
    "content": "YouTube'un herhangi bir akışı oynatmaması düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/63.txt",
    "content": "### Geliştirmeler\n- İçe/Dışa aktarma ayarları #1333\n- Aşmalar azaltıldı(performans iyileştirmeleri) #1371\n- Küçük kod iyileştirmeleri #1375\n- GPDR hakkında her şey eklendi #1420\n\n### Düzeltildi\n- İndirici: .giga dosyalarından bitmemiş indirmeler yüklenirken çökmeler düzeltildi #1407\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/64.txt",
    "content": "### Geliştirmeler\n- Mobil veri kullanıldığında video kalitesini sınırlandırma seçeneği eklendi. #1339\n- Oturum boyunca parlaklığı hatırla #1442\n- düşük performanslı CPU'larda indirme performansı iyileştirildi #1431\n- Medya oturumu için destek eklendi (çalışıyor) #1433\n\n### Düzeltmeler\n- İndirilenler açılırken çökme düzeltildi(Yayın sürümleri için düzeltme mevcut) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/65.txt",
    "content": "### İyileştirmeler\n\n- Burgermenu simge animasyonunu devre dışı bırak #1486\n\n- İndirilenlerin silinmesini geri al #1472\n- Paylaşım menüsünde indirme seçeneği #1498\n- Uzun dokunma menüsüne paylaşım seçeneği eklendi #1454\n- Çıkışta ana oynatıcıyı simge durumuna küçült #1354\n- Kitaplık sürümü güncellemesi ve veritabanı yedekleme düzeltmesi #1510\n- ExoPlayer 2.8.2 Güncelleme #1392\n- Daha hızlı hız değişimi için farklı adım boyutlarını desteklemek için oynatma hızı kontrol iletişim kutusu yeniden düzenlendi.\n- Oynatma hızı kontrolünde sessizlikler sırasında hızlı ileri sarmak için bir geçiş eklendi. Bu, sesli kitaplar ve belirli müzik türleri için faydalı olmalı ve gerçek bir kusursuz deneyim sunabilir (ve bir şarkıyı çok sayıda sessizlikle bozabilir =\\\\).\n- El ile yapmak yerine oynatıcıda dahili olarak medyanın yanında meta verilerin iletilmesine izin vermek için yeniden düzenlenmiş medya kaynağı çözünürlüğü. Artık tek bir meta veri kaynağımız var ve oynatma başladığında doğrudan kullanılabilir.\n- Oynatma listesi parçası açıldığında yeni meta veriler mevcut olduğunda güncellenmeyen uzak oynatma listesi meta verileri düzeltildi.\n- Çeşitli UI düzeltmeleri: #1383, arka plan oynatıcı bildirim kontrolleri artık her zaman beyaz, fırlatma yoluyla açılır pencere oynatıcısını kapatması daha kolay\n- Çoklu hizmet için yeniden düzenlenmiş mimariye sahip yeni çıkarıcı kullanın\n\n### Düzeltmeler\n\n- Düzeltme #1440 Kırık Video Bilgi Düzeni #1491\n- Geçmiş düzeltmesini görüntüle #1497\n- #1495, kullanıcı oynatma listesine erişir erişmez meta verileri (küçük resim, başlık ve video sayısı) güncelleyerek.\n- #1475, kullanıcı detay parçası üzerinde harici oynatıcıda bir video başlattığında veritabanına bir görünüm kaydederek.\n- Açılır pencere modunda ekran zaman aşımını düzeltin. #1463 (Sabit #640)\n- Ana video oynatıcı düzeltmesi #1509\n- [#1412] Oyuncu etkinliği arka plandayken yeni amaç alındığında oyuncunun NPE'sine neden olan sabit tekrar modu.\n- Oyuncunun açılır pencereye küçültülmesinin, açılır pencere izni verilmediğinde oyuncuyu yok etmemesi düzeltildi.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/66.txt",
    "content": "# v0.13.7 değişiklik günlüğü\n### Düzeltildi\n- v0.13.6'nın sıralama filtresi sorunlarını düzeltin\n\n# v0.13.6'nın değişiklik günlüğü\n\n### İyileştirmeler\n\n- Burgermenu simge animasyonunu devre dışı bırak #1486\n- İndirilenlerin silinmesini geri al #1472\n- Paylaşım menüsünde indirme seçeneği # 1498\n- Uzun dokunma menüsüne paylaşım seçeneği eklendi #1454\n- Çıkışta ana oynatıcıyı simge durumuna küçült #1354\n- Kitaplık sürümü güncellemesi ve veritabanı yedekleme düzeltmesi #1510\n- ExoPlayer 2.8.2 Güncelleme #1392\n- Oynatma hızı kontrol iletişim kutusu, farklı adım boyutlarını desteklemek için yeniden çalışıldı daha hızlı hız değişimi.\n- Oynatma hızı kontrolünde sessizlikler sırasında hızlı ileri sarmak için bir geçiş eklendi. Bu, sesli kitaplar ve belirli müzik türleri için faydalı olmalı ve gerçek bir kusursuz deneyim sunabilir (ve bir şarkıyı çok sayıda sessizlikle bozabilir =\\\\).\n- El ile yapmak yerine oynatıcıda dahili olarak medyanın yanında meta verilerin iletilmesine izin vermek için yeniden düzenlenmiş medya kaynağı çözünürlüğü. Artık tek bir meta veri kaynağımız var ve oynatma başladığında doğrudan kullanılabilir.\n- Oynatma listesi parçası açıldığında yeni meta veriler mevcut olduğunda güncellenmeyen uzak oynatma listesi meta verileri düzeltildi.\n- Çeşitli UI düzeltmeleri: #1383, arka plan oynatıcı bildirim kontrolleri artık her zaman beyaz, fırlatma yoluyla açılır pencere oynatıcısını kapatması daha kolay\n- Çoklu hizmet için yeniden düzenlenmiş mimariye sahip yeni çıkarıcı kullanın\n\n### Düzeltmeler\n- Düzeltme #1440 Kırık Video Bilgi Düzeni #1491\n- Geçmiş düzeltmesini görüntüle #1497\n- #1495, kullanıcı oynatma listesine erişir erişmez meta verileri (küçük resim, başlık ve video sayısı) güncelleyerek.\n- #1475, kullanıcı detay parçası üzerinde harici oynatıcıda bir video başlattığında veritabanına bir görünüm kaydederek.\n- Açılır pencere modunda ekran zaman aşımını düzeltin. #1463 (Sabit #640)\n- Ana video oynatıcı düzeltmesi #1509\n- [#1412] Oyuncu etkinliği arka plandayken yeni amaç alındığında oyuncunun NPE'sine neden olan sabit tekrar modu.\n- Oyuncunun açılır pencereye küçültülmesinin, açılır pencere izni verilmediğinde oyuncuyu yok etmemesi düzeltildi.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/68.txt",
    "content": "# v0.14.1 değişiklikleri\n\n### Düzeltmeler\n- Video url'sinin şifresinin çözülememesi düzeltildi #1659 \n- Sabit açıklama bağlantısı iyi açılamıyor #1657\n\n# v0.14.0 değişiklikleri\n\n### Yenilikler\n- Yeni Çekmece tasarımı #1461\n- Yeni özelleştirilebilir ön sayfa #1461\n\n### İyileştirmeler\n- Yenilenmiş Hareket kontrolleri #1604 \n- Açılır oynatıcıyı kapatmanın yeni yolu #1597\n\n### Düzeltmeler\n- Abonelik sayısı mevcut olmadığında hatayı düzeldi. Kapatılır #1649.\n  - Bu durumlarda \"Abone sayısı mevcut değil\" ifadesini göster\n- Bir YouTube oynatma listesi boş olduğunda NPE düzeltme\n- SoundCloud'daki kiosklar için hızlı düzeltme\n- Yeniden düzenleme ve hata düzeltme #1623\n  - Döngüsel arama sonucunu düzeltildi#1562\n  - Arama çubuğu statik olarak düzenlenmemiş düzeltildi\n  -YT Premium videoları doğru şekilde engellenmiyor düzeltildi\n  - Videoların bazen yüklenmemesi düzeltildi (DASH ayrıştırma nedeniyle)\n  - Video açıklamasındaki bağlantıları düzeltildi\n  - Birisi harici sd karta indirmeye çalıştığında uyarı göster\n  - Gösterilen hiçbir istisna tetikleyici bildirmesi düzeltildi\n  -   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)\n- Yayın alıcısının kaydı düzeltildi. Kapatılır #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/69.txt",
    "content": "### Yenilikler\n- Aboneliklerde uzun dokunarak silme ve paylaşma işlemleri eklendi #1516\n- Tablet kullanıcı arayüzü ve kılavuz liste düzeni eklendi #1617\n\n### İyileştirmeler\n- En son kullanılan en-boy oranını kaydetme ve tekrar yükleme eklendi #1748\n- İndirmeler etkinliğinde tam video isimleriyle lineer düzen etkinleştirildi #1771\n- Abonelikleri doğrudan abonelikler sekmesi içinden silme ve paylaşma eklendi #1516\n- Kuyrukta oynatma zaten sona ermişse video oynatmayı tetikleyen sıra eklendi #1783\n- Ses ve parlaklık jestleri için ayrı ayarlar eklendi #1644\n- Yerelleştirme desteği eklendi #1792\n\n### Düzeltmeler\n- Finlandiya'da kullanılabilmesi için nokta biçemi için zaman ayrıştırma düzeltildi\n- Abonelik sayısı düzeltildi\n- API 28+ cihazlar için öncelikli hizmet izni eklendi #1830\n\n### Bilinen Hatalar\n- Oynatma durumu Android P üzerinde kaydedilemiyor\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/70.txt",
    "content": "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? ¯\\_(ツ)_/¯\n\n### İyileştirmeler\n* indirilen dosyalar artık tek bir tıklama ile açılabilir #1879\n* Android 4.1 - 4.3 için desteği bırakın #1884\n* eski oynatıcıyı kaldır #1884\n* akışları sağa kaydırarak mevcut oynatma kuyruğundan kaldırın #1915\n* Yeni bir akış manuel olarak sıralandığında otomatik sıralanan akışı kaldır #1878\n* İndirmeler için postprocessing ve eksik özellikleri uygulama #1759 by @kapodamy\n* İşlem sonrası altyapı\n* Uygun hata işleme \"altyapısı\" (indirici için)\n* Çoklu indirme yerine kuyruk\n* Serileştirilmiş bekleyen indirmeleri (`.giga` dosyaları) uygulama verilerine taşı\n* Maksimum indirme yeniden denemesini uygulayın\n* Uygun çok iş parçacıklı indirme duraklatması\n* Mobil ağa geçildiğinde indirmeleri durdur (asla çalışmaz, bkz. 2. nokta)\n* İplik sayısını sonraki indirmeler için saklayın\n* Bir çok tutarsızlık düzeltildi\n\n### Sabit\n* 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\n* pop-up oynatıcı çökmesi düzeltildi #1874\n* Arka plan oynatıcısını açmaya çalışırken NPE #1901\n* Otomatik kuyruklama etkinleştirildiğinde yeni akışların eklenmesi için düzeltme #1878\n* deşifre sorunu düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/71.txt",
    "content": "### İyileştirmeler\n* GitHub derlemesi için uygulama güncelleme bildirimi ekleyin (#1608 yazan @krtkush)\n* İndiricide çeşitli iyileştirmeler (@kapodamy tarafından #1944):\n* eksik beyaz simgeleri ekleyin ve simge renklerini değiştirmek için sert çizgili yol kullanın\n* yineleyicinin başlatılıp başlatılmadığını kontrol edin (#2031'i düzeltir)\n* Yeni muxer'da \" işlem-sonrası başarısız\" hatası ile yeniden indirme denemelerine izin verin\n* Senkronize olmayan video ve ses akışlarını düzelten yeni MPEG-4 muxer (#2039)\n\n### Sabit\n* YouTube canlı yayınları kısa bir süre sonra oynatılmayı durduruyor (#1996 by @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/730.txt",
    "content": "# Sabit\n- Şifre çözme işlevi hatasını tekrar düzeltin.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/740.txt",
    "content": "Sure, I can provide a Turkish translation for your list:\n\n**Geliştirmeler**\n- Yorumlardaki bağlantıları tıklanabilir yap, metin boyutunu artır\n- Zaman damgası bağlantılarına tıklanınca konumu ayarla\n- Son seçilen duruma göre tercih edilen sekme göster\n- Çalma listesi penceresinde 'Arka Plan' üzerine uzun tıklayarak sıraya ekle\n- URL olmayan paylaşılan metni ara\n- Ana video oynatıcısına 'şu anki zamanda paylaş' düğmesi ekle\n- Video sırası bittiğinde ana oynatıcıya kapat düğmesi ekle\n- Video listesi öğeleri için uzun tıklama menüsüne 'Arka Planda Doğrudan Oynat' ekle\n- Play/Enqueue komutları için İngilizce çevirileri iyileştir\n- Küçük performans iyileştirmeleri\n- Kullanılmayan dosyaları kaldır\n- ExoPlayer'ı 2.9.6 sürümüne güncelle\n- Invidious bağlantılarına destek ekle\n\n**Düzeltmeler**\n- Yorumlar ve ilgili akışlar devre dışı bırakıldığında kaydırma sorununu düzelt\n- CheckForNewAppVersionTask'in gereksiz yürütülmesini düzelt\n- Geçersiz URL'leri olan abonelikleri yok say ve başlığı boş olanları sakla\n- Geçersiz YouTube URL'lerini düzelt: İmza etiket adı her zaman \"signature\" olmadığından akışların yüklenmesini engelle\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/750.txt",
    "content": "Yeni\nOynatma devam ediyor #2288\n- Akışlara en son kaldığınız yerden devam edin\nİndirici Geliştirmeleri #2149\n- İndirmeleri harici SD kartlarda depolamak için Depolama Erişim Çerçevesini kullanın\n- Yeni mp4 muxer\n- İsteğe bağlı olarak indirme işlemine başlamadan önce indirme dizinini değiştirme\n- Ölçülü ağlara saygı gösterin\n\nGeliştirilmiş\n- Gema dizeleri kaldırıldı #2295\n- Etkinlik yaşam döngüsü sırasında (otomatik) rotasyon değişikliklerini işleme #2444\n- Uzun basma menülerini tutarlı hale getirin #2368\n\nSabit\n- Seçili altyazı parça adının gösterilmemesi düzeltildi #2394\n- Uygulama güncellemesi kontrolü başarısız olduğunda çökme (GitHub sürümü) #2423\n- İndirmelerin %99,9'da takılması düzeltildi #2440\n- Oynatma kuyruğu meta verilerini güncelleme #2453\n- [SoundCloud] Çalma listeleri yüklenirken oluşan çökme düzeltildi TeamNewPipe/NewPipeExtractor#170\n- [YouTube] Sabit süre ayrıştırılamıyor TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/760.txt",
    "content": "0.17.1'deki Değişiklikler\n\nYeni\n- Tayca yerelleştirme\n\nGeliştirilmiş\n- Çalma listeleri için uzun basma menülerine burada oynatmaya başla eylemini tekrar ekleyin #2518\n- SAF / eski dosya seçici için anahtar ekleyin #2521\n\nSabit\n- Uygulama değiştirirken indirilenler görünümünde kaybolan düğmeleri düzeltme #2487\n- İzleme geçmişi devre dışı olmasına rağmen sabit oynatma konumu kaydedilir\n- Liste görünümlerinde oynatma konumunun neden olduğu düşük performansı düzeltme #2517\n- [Extractor] ReCaptchaActivity #2527'yi düzeltin, TeamNewPipe/NewPipeExtractor#186\n- [Extractor] [YouTube] Çalma listeleri sonuçlarda olduğunda sıradan arama hatasını düzeltin TeamNewPipe/NewPipeExtractor#185\n\n0.17.0'daki Değişiklikler\n\nYeni\nOynatma devam ediyor #2288\n- Akışlara en son kaldığınız yerden devam edin\nİndirici Geliştirmeleri #2149 \n- İndirmeleri harici SD kartlarda depolamak için Depolama Erişim Çerçevesini kullanın\n- Yeni mp4 muxer\n- İsteğe bağlı olarak indirme işlemine başlamadan önce indirme dizinini değiştirme\n- Ölçülü ağlara saygı gösterin \n\n\nGeliştirilmiş\n- Gema dizeleri kaldırıldı #2295\n- Etkinlik yaşam döngüsü sırasında (otomatik) rotasyon değişikliklerini işleme #2444\n- Uzun basma menülerini tutarlı hale getirin #2368\n\nSabit\n- Seçili altyazı parça adının gösterilmemesi düzeltildi #2394\n- Uygulama güncellemesi kontrolü başarısız olduğunda çökme (GitHub sürümü) #2423 \n- İndirmelerin %99,9'da takılması düzeltildi #2440\n- Oynatma kuyruğu meta verilerini güncelleme #2453 \n- [SoundCloud] Çalma listeleri yüklenirken oluşan çökme düzeltildi TeamNewPipe/NewPipeExtractor#170\n- [YouTube] Sabit süre ayrıştırılamıyor TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/770.txt",
    "content": "0.17.2'deki Değişiklikler\nDüzeltme\n- Düzeltme video mevcut değildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/780.txt",
    "content": "0.17.3'teki Değişiklikler\n\nGeliştirilmiş\n- Oynatma durumlarını temizleme seçeneği eklendi #2550\n- Dosya seçicide gizli dizinleri gösterme #2591\n- NewPipe ile açılacak `invidio.us` örneklerinden URL'leri destekleyin #2488 \n- music.youtube.com` URL`leri için destek ekleyin TeamNewPipe/NewPipeExtractor#194\n\nSabit\n- [YouTube] 'java.lang.IllegalArgumentException #192 düzeltildi\n- [YouTube] Canlı yayınların çalışmaması düzeltildi TeamNewPipe/NewPipeExtractor#195\n- Android pie'da akış indirirken yaşanan performans sorunu düzeltildi #2592\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/790.txt",
    "content": "Geliştirilmiş\n- Görme engelli kişilerin erişilebilirliğini iyileştirmek için daha fazla başlık ekleyin #2655\n- İndirme klasörü ayarının dilini daha tutarlı ve daha az belirsiz hale getirin #2637\n\nSabit\n- Bloktaki son baytın indirilip indirilmediğini kontrol edin #2646\n- Video ayrıntı parçasındaki kaydırma düzeltildi #2672\n- Çift arama temizleme kutusu animasyonlarını teke indir #2695\n- [SoundCloud] Client_id çıkarma işlemini düzeltin #2745\n\nGeliştirme\n- NewPipeExtractor'dan miras alınan eksik bağımlılıkları NewPipe'a ekleyin #2535\n- AndroidX'e geçiş #2685\n- ExoPlayer 2.10.6 #2697, #2736 için güncelleme\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/820.txt",
    "content": "Şifre çözme işlevi adının düzenli ifadesinin YouTube'u kullanılamaz duruma getirmesi düzeltildi.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/830.txt",
    "content": "SoundCloud sorunlarını düzeltmek için SoundCloud client_id güncellendi.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/910.txt",
    "content": "Bazı nadir durumlarda NewPipe'ın başlamasını engelleyen veri tabanı taşıması düzeltildi.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/952.txt",
    "content": "İyileştirildi\n• Otomatik oynatma tüm hizmetler için kullanılabilir (yalnızca YouTube için değil)\n\nDüzeltildi\n• YouTube'un yeni devamlarını destekleyerek ilgili akışlar düzeltildi\n• Yaş kısıtlamalı YouTube videoları düzeltildi\n• [Android TV] Kalan odak vurgulama katmanı düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/953.txt",
    "content": "YouTube şifre çözme işlevini ayıklama hatası giderildi.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/954.txt",
    "content": "• yeni uygulama iş akışı: videoları ayrıntı sayfasında oynat, oynatıcıyı küçültmek için aşağı kaydır\n• MediaStyle bildirimleri: bildirimlerde özelleştirilebilir eylemler, performans iyileştirmeleri\n• NewPipe masaüstü uygulaması olarak kullanılırken temel yeniden boyutlandırma\n\n• desteklenmeyen URL durumunda açma seçeneklerini içeren iletişim kutusu göster\n• Uzak olan alınamadığında arama önerisi deneyimini iyileştir\n• Öntanımlı video kalitesi 720p60 (uygulama içi) ve 480p'ye (açılır) yükseltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/955.txt",
    "content": "[YouTube] Bazı kullanıcılar için arama düzeltildi\n[YouTube] Rastgele şifre çözme istisnalarını düzeltildi\n[SoundCloud] \"/\" karakteriyle biten URL'ler artık doğru şekilde ayrıştırılıyor\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/956.txt",
    "content": "[YouTube] Herhangi bir videoyu yüklerken oluşan çökme düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/959.txt",
    "content": "Hata bildiricisini açtıktan sonra oluşan sonsuz çökme döngüsü düzeltildi.\nNewPipe tarafından otomatik olarak açılabilen PeerTube örnekleri listesi güncellendi.\nÇeviriler güncellendi.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/960.txt",
    "content": "• Ayarlarda veri tabanı dışa aktarma seçeneğinin açıklaması iyileştirildi.\n• YouTube yorumlarının ayrıştırılması düzeltildi.\n• media.ccc.de hizmetinin görünen adı düzeltildi.\n• Çeviriler güncellendi.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/961.txt",
    "content": "• [YouTube] Mix desteği\n• [YouTube] Genel yayıncılar ve Covid-19 hakkındaki bilgileri görüntüle\n• [media.ccc.de] Son videolar eklendi\n• Somalice çeviri eklendi\n\n• Birçok dahili iyileştirme\n\n• Oynatıcı içinden video paylaşımı düzeltildi\n• Boş ReCaptcha webview düzeltildi\n• Listeden bir akışı kaldırırken meydana gelen çökme düzeltildi\n• [PeerTube] İlgili akışlar düzeltildi\n• [YouTube] YouTube Music araması düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/962.txt",
    "content": "media.ccc.de hizmetine \"son\" videolar eklendi.\nmedia.ccc.de hizmetine canlı akışlar ve ayrıca canlı akış desteği eklendi.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/963.txt",
    "content": "• [YouTube] Kanal devam ettirme düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/982.txt",
    "content": "YouTube'un herhangi bir akışı oynatmaması düzeltildi.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/985.txt",
    "content": "YouTube'un herhangi bir akışı oynatmaması düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/987.txt",
    "content": "Yeni\n• Aşamalı HTTP dışında destek sağlama yöntemleri: daha hızlı oynatma yükleme süresi, PeerTube ve SoundCloud için düzeltmeler, yakın zamanda sona eren YouTube canlı akışlarının oynatılması\n• Yerel bir oynatma listesine uzak oynatma listesi eklemek için ekle düğmesi\n• Android 10+ paylaşım sayfasında görüntü önizlemesi\n\nİyileştirildi\n• Oynatma ayarları iletişim kutusunu iyileştirin\n• Abonelik içe/dışa aktarma düğmelerini üç noktalı menüye taşıyın\n\nSabit\n• Tam olarak izlenen videoları oynatma listesinden kaldırmayı düzeltin\n• Menü temasını paylaş ve \"oynatma listesine ekle\" girişini düzeltin\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/995.txt",
    "content": "Yeni\n• Kanal sekmeleri desteği\n• Resim kalite seçme özelliği\n• Tüm resimlerin URL'lerini alma özelliği\n\nİyileştirmeler\n• Oynatıcı arayüzlerinin erişilebilirliği\n• Yalnızca video indirmeleri için daha iyi ses seçimi\n• Paylaşılan oynatma listesi içeriğine oynatma listesi ve video adlarını ekleme seçeneği\n\nDüzeltilenler\n• [YouTube] Beğeni sayısını alma sorunu düzeltildi\n• Oynatıcının yanıt vermemesi ve çökmesi sorunu düzeltildi\n• Dil seçicide yanlış dil seçimi sorunu düzeltildi\n• Oynatıcı ses odaklı modda, sessize alma özelliğini dikkate almıyordu\n• Oynatma listesi öğesi ekleme özelliği bazen çalışmıyordu\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/996.txt",
    "content": "media.ccc.de'de bir kanal / konferans açarken yaşanan NullPointerException sorunu düzeltildi.\nGrinch size Noel hediyemizi bozmaya çalıştı ama biz düzelttik.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/997.txt",
    "content": "# Yeni\n• Yorum yanıtları eklendi\n• Oynatma listelerini yeniden sıralama\n• Liste açıklaması ve süresi gösterimi\n• Ayarları sıfırlama özelliği\n\n# İyileştirmeler\n• [Android 13+] Özel bildirim eylemleri geri getirildi\n• Güncelleme kontrolü için onay isteme\n• Arabelleğe alma sırasında oynat/duraklat\n• Ayarlar yeniden düzenlendi\n\n# Düzeltmeler\n• [YouTube] Yorumların yüklenmeme sorunu giderildi\n• Ayar içe aktarma güvenlik açığı giderildi, JSON'a geçildi\n• İndirme sorunları giderildi\n• Arama metni düzeltmeleri\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/998.txt",
    "content": "YouTube'un herhangi bir akışı oynatmaması düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/changelogs/999.txt",
    "content": "YouTube'un herhangi bir akışı oynatmaması düzeltildi\n"
  },
  {
    "path": "fastlane/metadata/android/tr/full_description.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/tr/short_description.txt",
    "content": "Android için Bedava ve hafif bir YouTube istemcisi.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/1000.txt",
    "content": "Покращена\n• Зробіть опис списку відтворення доступним, щоб показати більше/менше вмісту\n• [PeerTube] Автоматично обробляти посилання екземплярів `subscribeto.me`\n• Почніть відтворювати лише один предмет на екрані історії\n\nВиправлено\n• Виправити видимість кнопки RSS\n• Виправлено збої попереднього перегляду панелі пошуку\n• Виправлено створення списку відтворення елемента без мініатюр\n• Виправлено вихід із діалогового вікна завантаження до його появи\n• Виправлено спливаюче вікно списку пов’язаних елементів у черзі\n• Виправте порядок у діалоговому вікні додавання до списку відтворення\n• Налаштуйте макет закладки списку відтворення\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/1001.txt",
    "content": "Покращена\n• Завжди дозволяти змінювати параметри сповіщень гравців на Android 13+ \n\nВиправлено\n• Виправлено, що експорт бази даних/підписок не скорочує вже існуючий файл, що, можливо, призведе до пошкодженого експорту \n• Виправлено відновлення гравця з початку після натискання позначки часу\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/1002.txt",
    "content": "Виправлено помилку, через яку YouTube не відтворював жодної трансляції.\n\nУ цьому випуску вирішено лише найактуальнішу помилку, яка перешкоджала завантаженню деталей відео YouTube.\nМи знаємо про інші проблеми, і незабаром випустимо окремий випуск для їх вирішення.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/1003.txt",
    "content": "Це виправлення, яке виправляє помилки YouTube:\n• [YouTube] Виправлено не завантаження інформації про відео, виправлено помилки HTTP 403 під час відтворення відео та відновлено відтворення деяких відео з віковими обмеженнями\n• Виправлено незмінні розміри субтитрів\n• Виправлено подвійне завантаження інформації під час відкриття потоку\n• [Soundcloud] Видалено невідтворювані потоки, захищені DRM\n• Оновлені переклади\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/1004.txt",
    "content": "У цьому випуску виправлено помилку, через яку YouTube відтворював лише 360p-потік.\n\nЗверніть увагу, що рішення, що використовується в цій версії, ймовірно, тимчасове, і в довгостроковій перспективі потрібно буде впровадити відеопротокол SABR, але учасники TeamNewPipe зараз зайняті, тому будь-яка допомога буде дуже вдячна! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/1005.txt",
    "content": "Нове\n• Додано підтримку Android Auto\n• Дозволено налаштування груп стрічок як вкладок головного екрана\n• [YouTube] Поділитися як тимчасовий список відтворення\n• [SoundCloud] Вкладка каналу «Вподобання»\n\nПокращено\n• Кращі підказки в рядку пошуку\n• Показувати дату завантаження в розділі «Завантаження»\n• Використовувати мову Android 13 для кожної програми\n\nВиправлено\n• Виправлено пошкоджені кольори тексту в темному режимі\n• [YouTube] Виправлено списки відтворення, які не завантажували більше 100 елементів\n• [YouTube] Виправлено відсутні рекомендовані відео\n• Виправлено збої в перегляді історії\n• Виправлено позначки часу у відповідях на коментарі\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/1006.txt",
    "content": "# Покращено\nЗберігати поточний програвач при натисканні на часові позначки\nНамагатися відновлювати місії, що очікують завантаження, коли це можливо\nДодано опцію видалення завантаження без одночасного видалення файлу\nДозвіл на накладання: відображення пояснювального діалогового вікна для Android > R\nПідтримка відкриття посилання на .soundcloud\n\n# Виправлено\nВиправлено форматування короткого лічильника для версій Android нижче 7\nВиправлено сповіщення-примари\nВиправлення для файлів субтитрів SRT\nВиправлено безліч збоїв\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/1007.txt",
    "content": "Виправлено проблему невідтворюваності трансляцій YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/63.txt",
    "content": "### Поліпшення\n- Імпорт/експорт налаштувань #1333\n- Зменшене перемалювання (оптимізація продуктивності) #1371\n- Невеликі поліпшення коду #1375 \n- Додано все про GDPR #1420\n\n### Виправлено\n- Завантажувач: виправлене вилітання під час продовження незавершених завантажень з форматом .giga #1407\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/64.txt",
    "content": "###Покращення\n- Додана можливість обмежити якість відео при використанні мобільного інтернету #1339\n- Тепер яскравість запам'ятовується на час сеансу #1442\n- Поліпшено продуктивність завантаження для слабших процесорів #1431\n- Додана (працює) підтримка для медіасесії #1433\n\n### Виправлено\n- Виправлене вилітання під час відкриття завантажень (доступне у випущених складаннях) #1433\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/65.txt",
    "content": "### Покращення \n\n— Вимкнути анімацію піктограми бургерменю #1486 \n- скасувати видалення завантажень №1472 \n- Опція завантаження в меню спільного використання #1498 \n— Додано опцію спільного доступу до меню довгого натискання #1454 \n- Згорнути головного гравця на виході №1354 \n— Оновлення версії бібліотеки та виправлення резервної копії бази даних №1510 \n— Оновлення ExoPlayer 2.8.2 №1392 \n  — Перероблено діалог керування швидкістю відтворення для підтримки різних розмірів кроку для швидшої зміни швидкості. \n  — Додано перемикач швидкої перемотки вперед під час тиші в контроль швидкості відтворення. Це має бути корисним для аудіокниг і певних музичних жанрів, і може принести справді бездоганний досвід (і може розірвати пісню з великою кількістю тиші =\\\\). \n  — Перероблено роздільну здатність джерела медіафайлів, щоб дозволити передачу метаданих разом із медіафайлами всередині програвача, а не вручну. Тепер у нас є єдине джерело метаданих, і воно доступне безпосередньо після початку відтворення. \n  — Виправлено помилку, коли метадані віддаленого списку відтворення не оновлювалися, коли нові метадані доступні під час відкриття фрагмента списку відтворення. \n  — Різні виправлення інтерфейсу користувача: #1383, елементи керування сповіщеннями програвача у фоновому режимі тепер завжди білі, легше вимикати спливаючий програвач за допомогою перекидання. \n— Використовуйте новий екстрактор із переробленою архітектурою для мультисервісу \n\n### Виправлення \n\n- Виправлено #1440 Порушений макет інформації про відео #1491 \n— Виправлення історії перегляду #1497 \n  - #1495, шляхом оновлення метаданих (ескіз, назва та кількість відео), щойно користувач отримує доступ до списку відтворення. \n  - #1475, шляхом реєстрації перегляду в базі даних, коли користувач запускає відео на зовнішньому плеєрі на фрагменті деталі. \n— Виправлено тайм-аут екрана у разі спливаючого режиму. #1463 (Виправлено #640) \n— Виправлення головного відеоплеєра №1509 \n  - [#1412] Виправлено режим повторення, який викликав NPE гравця, коли отримано новий намір, коли активність гравця триває у фоновому режимі. \n  — Виправлено, що згортання програвача до спливаючого вікна не знищує програвач, якщо дозвіл на спливаюче вікно не надано.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/66.txt",
    "content": "# Журнал змін версії 0.13.7 \n\n### Виправлено \n— Виправлено проблеми з фільтром сортування версії 0.13.6 \n\n# Журнал змін версії 0.13.6 \n\n### Покращення \n\n— Вимкнути анімацію піктограми бургерменю #1486 \n- скасувати видалення завантажень №1472 \n- Опція завантаження в меню спільного використання #1498 \n— Додано опцію спільного доступу до меню довгого натискання #1454 \n- Згорнути головного гравця на виході №1354 \n— Оновлення версії бібліотеки та виправлення резервної копії бази даних №1510 \n— Оновлення ExoPlayer 2.8.2 №1392 \n  — Перероблено діалог керування швидкістю відтворення для підтримки різних розмірів кроку для швидшої зміни швидкості. \n  — Додано перемикач швидкої перемотки вперед під час тиші в контроль швидкості відтворення. Це має бути корисним для аудіокниг і певних музичних жанрів, і може принести справді бездоганний досвід (і може розірвати пісню з великою кількістю тиші =\\\\). \n  — Перероблено роздільну здатність джерела медіафайлів, щоб дозволити передачу метаданих разом із медіафайлами всередині програвача, а не вручну. Тепер у нас є єдине джерело метаданих, і воно доступне безпосередньо після початку відтворення. \n  — Виправлено помилку, коли метадані віддаленого списку відтворення не оновлювалися, коли нові метадані доступні під час відкриття фрагмента списку відтворення. \n  — Різні виправлення інтерфейсу користувача: #1383, елементи керування сповіщеннями програвача у фоновому режимі тепер завжди білі, легше вимикати спливаючий програвач за допомогою перекидання. \n— Використовуйте новий екстрактор із переробленою архітектурою для мультисервісу \n\n### Виправлення \n\n- Виправлено #1440 Порушений макет інформації про відео #1491 \n— Виправлення історії перегляду #1497 \n  - #1495, шляхом оновлення метаданих (ескіз, назва та кількість відео), щойно користувач отримує доступ до списку відтворення. \n  - #1475, шляхом реєстрації перегляду в базі даних, коли користувач запускає відео на зовнішньому плеєрі на фрагменті деталі. \n— Виправлено тайм-аут екрана у разі спливаючого режиму. #1463 (Виправлено #640) \n— Виправлення головного відеоплеєра №1509 \n  - [#1412] Виправлено режим повторення, який викликав NPE гравця, коли отримано новий намір, коли активність гравця триває у фоновому режимі. \n  — Виправлено, що згортання програвача до спливаючого вікна не знищує програвач, якщо дозвіл на спливаюче вікно не надано.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/68.txt",
    "content": "# зміни версії 0.14.1 \n\n### Виправлено \n— Виправлено помилку дешифрування URL-адреси відео №1659 \n- Виправлено посилання опису, що не витягує колодязь #1657 \n\n# зміни версії 0.14.0 \n\n### Нове \n- Новий дизайн ящика #1461 \n— Нова титульна сторінка з можливістю налаштування #1461 \n\n### Покращення \n— Перероблені елементи управління жестами #1604 \n— Новий спосіб закриття спливаючого програвача #1597 \n\n### Виправлено \n- Виправлено помилку, коли кількість підписок недоступна. Закриває #1649. \n  - Показувати «Кількість передплатників недоступна» в таких випадках \n- Виправлено NPE, коли список відтворення YouTube порожній \n— Швидке виправлення кіосків у SoundCloud \n— Рефакторинг і виправлення помилок #1623 \n  — Виправлено результат циклічного пошуку №1562 \n  — Виправлено, що панель пошуку не була розміщена статично \n  - Виправлено неправильне блокування відео YT Premium \n  - Виправлено відео, які іноді не завантажуються (через розбір DASH) \n  - Виправте посилання в описі відео \n  - Показувати попередження, коли хтось намагається завантажити на зовнішню sdcard \n  - виправлено звіт про тригери винятків, що нічого не показували \n  - мініатюра не відображається у фоновому програвачі для android 8.1 [див. тут](https://github.com/TeamNewPipe/NewPipe/issues/943) \n— Виправлено реєстрацію приймача трансляції. Закриває #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/69.txt",
    "content": "### Нове \n- Видалити та поділитися в підписках #1516 \n- Інтерфейс планшета та макет списку сітки №1617 \n\n### Покращення \n- зберегти та перезавантажити останній використовуваний формат #1748 \n— Увімкніть лінійний макет у завантаженнях із повними назвами відео №1771 \n- Видаляйте та діліться підписками безпосередньо на вкладці підписок №1516 \n- Постановка в чергу тепер запускає відтворення відео, якщо черга відтворення вже закінчилася #1783 \n— Окремі налаштування для жестів гучності та яскравості #1644 \n— Додано підтримку локалізації #1792 \n\n### Виправлення \n— Виправлено розбір часу для . тому NewPipe можна використовувати у Фінляндії \n- Виправити кількість підписок \n— Додано дозвіл на передову службу для пристроїв API 28+ #1830 \n\n### Відомі помилки \n- Стан відтворення не можна зберегти на Android P\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/70.txt",
    "content": "УВАГА: ця версія, ймовірно, є багфестом, як і попередня. Однак через повне завершення роботи з 17. зламана версія краще, ніж без версії. правильно? ¯\\_(ツ)_/¯ \n\n### Покращення \n* завантажені файли тепер можна відкрити одним клацанням миші #1879 \n* припинення підтримки для android 4.1 - 4.3 #1884 \n* видалити старий програвач #1884 \n* видалити потоки з поточної черги відтворення, провівши їх праворуч #1915 \n* видалення автоматичного потоку в черзі, коли новий потік ставиться в чергу вручну #1878 \n* Постобробка для завантажень і впровадження відсутніх функцій #1759 від @kapodamy \n  * Інфраструктура постобробки \n  * Правильна «інфраструктура» обробки помилок (для завантажувача) \n  * Черга замість кількох завантажень \n  * Перемістіть серіалізовані незавершені завантаження (файли `.giga`) до даних програми \n  * Реалізуйте максимальну повторну спробу завантаження \n  * Належне призупинення багатопотокового завантаження \n  * Зупинити завантаження при переході на мобільну мережу (ніколи не працює, див. 2-й пункт) \n  * Збережіть кількість потоків для наступних завантажень \n  * Виправлено багато неузгодженостей \n\n### Виправлено \n* виправлено збій із роздільною здатністю за умовчанням, встановленою на найкращу та обмежену роздільну здатність мобільних даних #1835 \n* виправлено збій спливаючого програвача #1874 \n* NPE під час спроби відкрити фоновий програвач #1901 \n* Виправлення для вставки нових потоків, коли ввімкнено автоматичне чергування #1878 \n* Виправлено проблему дешифрування shuttown\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/71.txt",
    "content": "### Вдосконалено\n* Сповіщення про оновлення збірки застосунку GitHub (#1608 @krtkush)\n* Поліпшено завантажувач (#1944 @kapodamy):\n  * додано відсутні білі піктограми й застосовано хардк-спосіб зміни кольорів піктограм\n  * перевірка ініціалізації ітератора (#2031)\n  * дозволено повторне завантаження з помилкою «після обробки не вдалося» в новому muxer\n  * новий MPEG-4 muxer виправив неузгодженість відео й аудіо (#2039)\n\n### Виправлено\n* Переривання прямих трансляції YouTube (#1996 @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/730.txt",
    "content": "# Виправлення\n- Повторно виправлено помилку функції розшифрування.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/740.txt",
    "content": "<h4>Покращення</h4> \n<ul> \n<li>зробити посилання в коментарях доступними для натискання, збільшити розмір тексту</li> \n<li>шукати під час натискання посилань із мітками часу в коментарях</li> \n<li>показати бажану вкладку на основі нещодавно вибраного стану</li> \n<li>додавати список відтворення до черги, якщо довго натискати кнопку 'Фон' у вікні списку відтворення</li> \n<li>шукати спільний текст, якщо він не є URL-адресою</li> \n<li>додати \"поділитися в поточний час\" кнопку головного відеопрогравача</li> \n<li>додати кнопку закриття до основного програвача, коли відео чергу закінчиться</li> \n<li>додати \"Грати безпосередньо у фоновому режимі\" для тривалого натискання меню для елементів списку відео</li> \n<li>покращити англійський переклад команд Play/Enqueue</li> \n<li>невеликі покращення продуктивності</li> \n<li>видалити файли, які не використовуються</li> \n<li>оновити ExoPlayer до 2.9.6</li> \n<li>додати підтримку посилань Invidious</li> \n</ul> \n<h4>Виправлено</h4> \n<ul> \n<li>виправлено прокручування з вимкненими коментарями та пов’язаними потоками</li> \n<li>виправлено завдання CheckForNewAppVersionTask, яке виконувалося, коли воно не повинно виконуватися</li> \n<li>виправлений імпорт підписок YouTube: ігноруйте підписки з недійсною URL-адресою та зберігайте підписки з порожньою назвою</li> \n<li>виправити недійсну URL-адресу YouTube: назва тегу підпису не завжди є \"підписом\", що перешкоджає завантаженню потоків</li> \n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/750.txt",
    "content": "новий\nВідновлення відтворення #2288 \n• Відновити потоки там, де ви зупинилися минулого разу \nПокращення завантажувача #2149 \n• Використовуйте Storage Access Framework для зберігання завантажень на зовнішніх SD-картах \n• Новий мультиплексор mp4 \n• Додатково змініть каталог завантажень перед початком завантаження \n• Поважайте мережі з лічильником \n\n\nПокращена\n• Видалено рядки геми #2295 \n• Обробляти зміни (авто)обертання протягом життєвого циклу дії #2444 \n• Зробіть меню довготривалого натискання узгодженими #2368 \n\nВиправлено\n• Виправлено невідображення вибраної доріжки субтитрів #2394 \n• Не аварійно завершувати роботу, коли не вдається перевірити оновлення програми (версія GitHub) #2423 \n• Виправлено завантаження на 99,9% #2440 \n• Оновити метадані черги відтворення #2453 \n• [SoundCloud] Виправлено збій під час завантаження списків відтворення TeamNewPipe/NewPipeExtractor#170 \n• [YouTube] Фіксована тривалість не може бути використана TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/760.txt",
    "content": "Зміни в 0.17.1 \n\nновий\n• Тайська локалізація \n\n\nПокращена\n• Знову додайте дію «Почати відтворення тут» у меню для списків відтворення з тривалим натисканням #2518 \n• Додано перемикач для SAF / застарілого засобу вибору файлів #2521 \n\nВиправлено\n• Виправлено зникнення кнопок у перегляді завантажень під час перемикання програм #2487 \n• Виправлена позиція відтворення зберігається, хоча історію переглядів вимкнено \n• Виправлено зниження продуктивності, спричинене позицією відтворення у переглядах списку #2517 \n• [Extractor] Виправлено ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186 \n• [Extractor] [YouTube] Виправлена випадкова помилка пошуку, коли списки відтворення є в результатах TeamNewPipe/NewPipeExtractor#185 \n\n\n\nЗміни в 0.17.0 \n\nновий\nВідновлення відтворення #2288 \n• Відновити потоки там, де ви зупинилися минулого разу \nПокращення завантажувача #2149 \n• Використовуйте Storage Access Framework для зберігання завантажень на зовнішніх SD-картах \n• Новий мультиплексор mp4 \n• Додатково змініть каталог завантажень перед початком завантаження \n• Поважайте мережі з лічильником \n\n\nПокращена\n• Видалено рядки геми #2295 \n• Обробляти зміни (авто)обертання протягом життєвого циклу дії #2444 \n• Зробіть меню довготривалого натискання узгодженими #2368 \n\nВиправлено\n• Виправлено невідображення вибраної доріжки субтитрів #2394 \n• Не аварійно завершувати роботу, коли не вдається перевірити оновлення програми (версія GitHub) #2423 \n• Виправлено завантаження на 99,9% #2440 \n• Оновити метадані черги відтворення #2453 \n• [SoundCloud] Виправлено збій під час завантаження списків відтворення TeamNewPipe/NewPipeExtractor#170 \n• [YouTube] Фіксована тривалість не може бути використана TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/770.txt",
    "content": "Зміни у 0.17.2\n\nВиправлення\n• Виправлено недоступність відео\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/780.txt",
    "content": "Зміни в 0.17.3\n\nПоліпшення\n• Можливість очищення станів відтворення #2550\n• Можливість вибору схованих каталогів #2591\n• Підтримка відкриття URL екземплярів «invidio.us» #2488\n• Додано підтримку URL «music.youtube.com» TeamNewPipe/NewPipeExtractor#194\n\nВиправлено\n• [YouTube] 'java.lang.IllegalArgumentException #192\n• [YouTube] не працювали прямі трансляції TeamNewPipe/NewPipeExtractor #195\n• Проблему швидкодії android pie під час завантаження трансляцій #2592\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/790.txt",
    "content": "Вдосконалено\n• Нові заголовки доступності для людей з вадами зору #2655\n• Мова налаштування теки завантажень послідовніша та однозначніша #2637\n\nВиправлено\n• Перевірка завантаження останнього байта блоку #2646\n• Виправлено прокручування деталей відео #2672\n• Вилучено повтор анімацій вікна пошуку #2695\n• [SoundCloud] Виправлено витяг client_id #2745\n\nРозвиток\n• Додано відсутні залежності, успадковані з NewPipeExtractor #2535\n• Перехід на AndroidX #2685\n• Оновлено до ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/800.txt",
    "content": "новий\n• Підтримка PeerTube без P2P (#2201) [Бета]: \n  ◦ Переглядайте та завантажуйте відео з екземплярів PeerTube \n  ◦ Додайте екземпляри в налаштуваннях, щоб отримати доступ до всього світу PeerTube \n  ◦ Під час доступу до певних екземплярів можуть виникати проблеми з рукостисканням SSL на Android 4.4 і 7.1, що призводить до помилки мережі. \n\n• Завантажувач (#2679): \n  ◦ Розрахувати ETA завантаження \n  ◦ Завантажте opus (файли webm) як ogg \n  ◦ Відновіть прострочені посилання для завантаження, щоб відновити завантаження після тривалої паузи \n\nПокращена\n• Повідомляйте KioskFragment про зміни в бажаній країні вмісту та покращуйте продуктивність усіх основних вкладок #2742 \n• Використовуйте нові реалізації локалізації та завантажувача з екстрактора №2713 \n• Зробіть рядок \"Кіоск за замовчуванням\" доступним для перекладу \n• Чорна панель навігації для чорної теми №2569 \n\nВиправлено\n• Виправлено помилку, через яку не можна було перемістити спливаючий програвач, якщо під час переміщення спливаючого програвача було прикладено інший палець #2772 \n• Дозволити списки відтворення без програми завантаження та виправити збої, пов’язані з цією проблемою #2724, TeamNewPipe/NewPipeExtractor#219 \n• Увімкнення TLS1.1/1.2 на пристроях Android 4.4 (API 19/KitKat) для виправлення рукостискання TLS із MediaCCC і деякими екземплярами PeerTube #2792 \n• [SoundCloud] Виправлено витяг ідентифікатора клієнта TeamNewPipe/NewPipeExtractor#217 \n• [SoundCloud] Виправлено вилучення аудіопотоку \n\nрозвиток\n• Оновіть ExoPlayer до 2.10.8 #2791, #2816 \n• Оновіть Gradle до 3.5.1 і додайте підтримку Kotlin #2714\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/810.txt",
    "content": "новий\n• Відображати мініатюру відео на екрані блокування під час відтворення у фоновому режимі \n\nПокращена\n• Додати локальний список відтворення до черги при тривалому натисканні на фонову/спливаючу кнопку \n• Зробіть вкладки головної сторінки доступними для прокручування та приховання, коли є лише одна вкладка \n• Обмежити кількість оновлень мініатюр сповіщень у фоновому програвачі \n• Додайте фіктивну мініатюру для порожніх локальних списків відтворення \n• Використовуйте розширення файлу *.opus замість *.webm і відображайте «opus» у мітці формату замість «WebM Opus» у спадному списку завантажень \n• Додати кнопку для видалення завантажених файлів або історії завантажень у розділі «Завантаження» \n• [YouTube] Додайте підтримку посилань на канали /c/shortened_url \n\nВиправлено\n• Виправлено численні проблеми під час надсилання відео в NewPipe і безпосереднього завантаження його потоків \n• Виправлено доступ гравця поза потоком створення \n• Виправлено сторінку результатів пошуку \n• [YouTube] Виправлено перемикання на null, що спричиняло NPE \n• [YouTube] Виправлено перегляд коментарів під час відкриття URL-адреси invidio.us \n• [SoundCloud] Оновлено client_id\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/820.txt",
    "content": "Виправлено розшифрування назви функції regex, що робила YouTube непридатним для використання.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/830.txt",
    "content": "Оновлено SoundCloud client_id, щоб виправити проблеми SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/840.txt",
    "content": "новий\n• Додано селектор мови для зміни мови програми \n• Додано кнопку «Надіслати на Kodi» до меню гравця, що згортається \n• Додана можливість копіювати коментарі при тривалому натисканні \n\nПокращена\n• Виправити активність ReCaptcha та правильно зберегти отримані файли cookie \n• Видалено меню з крапками на користь панелі та кнопку приховування історії, коли історію переглядів не ввімкнено в налаштуваннях \n• Правильно запитувати дозвіл відображення поверх інших програм у налаштуваннях на Android 6 і новіших версіях \n• Перейменуйте локальний список відтворення, довго клацаючи у BookmarkFragment \n• Різні вдосконалення PeerTube \n• Покращено кілька вихідних рядків англійською мовою \n\nВиправлено\n• Виправлено помилку, коли програвач запускався знову, хоча він був призупинений, коли ввімкнуто параметр «згорнути під час перемикання додатків», а NewPipe згорнуто \n• Виправте початкове значення яскравості для жесту \n• Виправлено завантаження субтитрів .srt, які містять не всі розриви рядків \n• Виправлена помилка завантаження на SD-карту, оскільки деякі пристрої Android 5 не сумісні з CTF \n• Виправлено завантаження на Android KitKat \n• Виправлено пошкоджений відеофайл .mp4, розпізнаний як аудіофайл \n• Виправлено численні проблеми локалізації, зокрема неправильні коди китайської мови \n• [YouTube] Мітки часу в описі знову можна натискати\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/850.txt",
    "content": "У цьому випуску оновлено версію вебсайту YouTube. Підтримку старої версії вебсайту буде припинено в березні тому вам потрібно оновити NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/860.txt",
    "content": "Поліпшення\n• Зберігається й відновлюється масштаб і темп\n• Підтримка вирізання дисплея в програвачі\n• Круглий вигляд та кількість підписників\n• Оптимізовано YouTube для скорочення використання даних\n\nУ цьому випуску було виправлено понад 15 помилок, пов'язаних з YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/870.txt",
    "content": "Це випуск виправлення оновлення NewPipe, щоб дати можливість користуватися SoundCloud без значних утруднень.\nAPI v2 SoundCloud тепер застосовується екстрактором, вдосконалено виявлення недійсних ідентифікаторів клієнта.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/900.txt",
    "content": "Нове\n• Підписки на групи та канали\n• Кнопка вимкнення звуку в програвачах\n\nПоліпшення\n• Можна відкривати посилання music.youtube.com і media.ccc.de у NewPipe\n• Переміщено два налаштування з Вигляду до Вміст\n• Сховано пропустити 5, 15, 25 секунд, якщо увімкнено неточний пошук\n\nВиправлено\n• деякі відео WebM не прокручувались\n• резервне копіювання бази даних на Android P\n• аварійне завершення роботи під час надсилання завантаженого файлу\n• багато для видобування з YouTube та ще багато іншого ...\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/910.txt",
    "content": "Виправлено перенесення бази даних, яка перешкоджала запуску NewPipe в деяких рідкісних випадках.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/920.txt",
    "content": "Поліпшення\n\n• Додана дата завантаження та кількість елементів сітки потокової передачі\n• Поліпшено макет верхньої панелі\n\nВиправлено\n\n• Виправлено кнопку вимкнення звуку, що спричиняла збої на API 19\n• Виправлено завантаження довгих відео 1080p 60 кадрів на секунду\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/930.txt",
    "content": "Нове\n• Пошук на YouTube Music\n• Підтримка Android TV\n\nПоліпш.\n• Можна вилуч. всі переглянуті відео з локальної добірки\n• Сповіщення про непідтрим. вміст\n• Покращено жести зміни розміру програвача щипанням\n• Вилучення трансляцій з черги натиском на тло\n• Краща обробка розміру заголовка панелі\n\nВипр.\n• Роботу налаштув. вікового обмеж. вмісту\n• Деякі види reCAPTCHA\n• Збої під час відкр. закладок, якщо добірка `null`\n• Виявлення винятків, пов'язаних з мережею\n• Кнопку сорт. груп у підписках\n\nта інше\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/940.txt",
    "content": "Нове\n• Підтримка коментарів SoundCloud\n• Налаштування режиму обмеження YouTube\n• Показ деталей батьківського каналу PeerTube\n\nВдосконалено\n• Показ кнопки Kore лише підтримуваних служб\n• Блокування жестів програвача, що починаються з панелі навігації стану\n• Новий колір тла кнопок повторної спроби й підписки залежно від кольору служби\n\nВиправлено\n• Зависання вікна завантаження\n• «Відкрити в переглядачі» точно відкриває браузер\n• Збої відкриття відео та «Не вдалося відтворити цей потік»\n\nі більше\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/950.txt",
    "content": "У цьому випуску три незначних виправлення:\n• Виправлено доступ до сховища на Adroid 10+\n• Виправлено відкриття кіосків\n• Виправлено визначення тривалості довгих відео\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/951.txt",
    "content": "новий\n• Додати пошук для вибору підписки в діалоговому вікні групи каналів \n• Додайте фільтр до діалогового вікна групи каналів, щоб відображати лише не згруповані підписки \n• Додати вкладку списку відтворення на головну сторінку \n• Швидке перемотування вперед/назад у черзі програвача у фоновому режимі/спливаючих вікнах \n• Відобразити пропозицію пошуку: ви мали на увазі та показувати результати для \n\nПокращена\n• Відмовтеся від запису метаданих додатків у мультиплексованих файлах \n• Не видаляйте невдалі потоки з черги \n• Оновити колір панелі стану відповідно до кольору панелі інструментів \n\nВиправлено\n• Виправлено десинхронізацію аудіо/відео, спричинену сукупними помилками з плаваючою комою \n• [PeerTube] Обробка видалених коментарів \n\nі більше\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/952.txt",
    "content": "Поліпшення\n• Автоматичне відтворення доступне для всіх сервісів (а не лише для YouTube)\n\nВиправлення\n• Виправлені пов'язані потоки підтримкою нових впроваджень YouTube\n• Виправлено вік для відео YouTube з обмеженнями\n• [Android TV] Виправлено тривале фокусування\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/953.txt",
    "content": "Виправлено функцію розшифрування видобутого списку YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/954.txt",
    "content": "• Нове: відтворення відео на сторінці подробиць, проведіть пальцем вниз, щоб згорнути програвач\n• Повідомлення MediaStyle: налаштовувані дії у сповіщеннях, покращення швидкодії\n• базова зміна розміру у NewPipe для ПК\n\n• показ діалогового вікна з відкритими опціями у разі непідтримуваної URL\n• Покращено пропозиції пошуку, коли віддалені не вдається отримати\n• Підвищена типова якість відео до 720p60 (програвач у застосунку) та 480p (спливний програвач)\n\n• виправлення помилок тощо\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/955.txt",
    "content": "[YouTube] Виправлений пошук для деяких користувачів\n[YouTube] Виправлені випадкові помилки під час розшифрування\n[SoundCloud] URL-адреси, які закінчуються на «/», тепер зчитуються коректно\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/956.txt",
    "content": "[YouTube] Виправлено збої під час завантаження будь-якого відео\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/957.txt",
    "content": "• Об'єднано дії в черзі\n• Жест двома пальцями, щоб закрити програвач\n• Дозволено очищення cookie reCAPTCHA\n• Можливість не забарвлювати сповіщення\n• Поліпшено відкриття подробиць відео, щоб виправити нескінченну буферизацію та поведінку надсилання з NewPipe тощо\n• Прискорено відео YouTube і виправлено обмеження віку\n• Виправлено збої перемотування вперед/назад\n• Списки не перевпорядковуються перетягуванням ескізів\n• Завжди пам'ятати властивості спливного вікна\n• Додано мову Санталі\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/958.txt",
    "content": "Нове та вдосконалене:\n• Повторно додана опція ховання ескізу на екрані блокування\n• Потягніть, щоб оновити стрічку\n• Покращена швидкодія отримання локальних списків\n\nВиправлено:\n• Збої запуску NewPipe після його видалення з оперативної пам’яті\n• Збої запуску, коли немає з'єднання з інтернетом\n• Дотримання параметрів яскравості та жестів\n• [YouTube] Виправлені довгі добірки\n\nІнше:\n• Очищення коду та кілька внутрішніх удосконалень\n• Оновлення залежностей\n• Оновлення перекладів\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/959.txt",
    "content": "Виправлено нескінченний цикл збоїв після відкриття звіту про помилку.\nОновлений список екземплярів PeerTube, який може бути автоматично відкритий у NewPipe.\nОновлено переклади.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/960.txt",
    "content": "• Покращений опис опції експортування бази даних в налаштуваннях.\n• Виправлено отримання коментарів YouTube.\n• Виправлено коротке ім'я служби media.ccc.de.\n• Оновлено переклади.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/961.txt",
    "content": "• [YouTube] Підтримка міксів\n• [YouTube] Показ відомостей про суспільних мовників та Covid-19\n• [media.ccc.de] Додано останні відео\n• Додано переклад сомалійською\n\n• Багато внутрішніх поліпшень\n\n• Виправлено спільне використання відео в програвачі\n• Виправлено порожню ReCaptcha у вебперегляді\n• Виправлена помилка, яка ставалася під час видалення потоку зі списку\n• [PeerTube] Виправлено пов’язані потоки\n• [YouTube] Виправлено пошук у YouTube Music\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/962.txt",
    "content": "Додано «найновіші» відео до служби media.ccc.de.\nДодано прямі трансляції до media.ccc.de, а також підтримку прямої трансляції.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/963.txt",
    "content": "• [YouTube] Виправлено продовження каналу\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/964.txt",
    "content": "• Додано підтримку розділів елементами керування програвачем\n• [PeerTube] Додано пошук Sepia\n• Повторно додано кнопку поділитися до детального перегляду відео, переміщено опис потоку у макет вкладки\n• Вимкнено відновлення яскравості, якщо жест яскравості вимкнено\n• Новий пункт списку відтворення відео у kodi\n• Виправлено збої, коли на пристрої не встановлено типовий переглядач\n• Перемикання відтворення апаратною кнопкою пробіл у повноекранному програвачі\n• [media.ccc.de] Виправлення й покращення\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/965.txt",
    "content": "Виправлено аварійне завершення роботи під час перевпорядкування груп каналів.\nВиправлено отримання більшої кількості відео YouTube із каналів і списків відтворення.\nВиправлено отримання коментарів YouTube.\nДодано підтримку підшляхів /watch/, /v/ та /w/ в URL-адресах YouTube.\nВиправлено видобування ідентифікатора клієнта SoundCloud та геообмеженого вмісту.\nДодано локалізацію північнокурдською.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/966.txt",
    "content": "Нове:\n• Нова служба: Bandcamp\n\nПоліпшено:\n• Нова опція дотримування теми пристрою\n• Запобігання збоям показом покращеної панелі помилок\n• Більше інформації чому вміст недоступний\n• Апаратна кнопка пробілу для відтворення/паузи\n• Показ «Завантаження розпочато»\n\nВиправлено:\n• Дуже маленькі мініатюри в подробицях відео під час відтворення у фоновому режимі\n• Порожній заголовок у згорнутому програвачі\n• Виправлено помилку, через яку останній розмір не відновлюється належним чином\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/967.txt",
    "content": "Виправлено помилку роботи YouTube у ЄС. Це було викликано новим файлом cookie та системою згоди про приватність, яка вимагає від NewPipe встановлення файлу cookie CONSENT.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/968.txt",
    "content": "Додано опцію деталей каналу в меню тривалого натискання.\nДодано функціональність перейменування назви добірки з інтерфейсу добірок.\nДозволено призупиняти буферизацію відео.\nВилощено білу тему.\nВиправлено перекриття шрифтів за користування більшого розміру шрифту.\nВиправлено відсутність відео на пристроях Formuler і Zephier.\nВиправлені різні збої.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/969.txt",
    "content": "• Дозволено встановлення до зовнішнього сховища\n• [Bandcamp] Додано підтримку показу перших трьох коментарів трансляцій\n• Показ лише «завантаження розпочато» під час завантаження\n• Не встановлюється файл cookie reCaptcha, коли файл cookie не зберігається\n• [Програвач] Підвищення продуктивності кешу\n• [Програвач] Виправлено відсутність автовідтворення програвачем\n• Відкидання Snackbars під час видалення завантажень\n• Виправлено спробу видалення об'єкта, що не міститься у списку\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/970.txt",
    "content": "Нове\n• Показ метаданих вмісту (мітки, категорії, ліцензія, ...) під описом\n• Опція «Показати деталі каналу» віддалених добірок\n• Опція «Відкрити у переглядачі» у меню тривалого натискання\n\nВиправлено\n• Збої на сторінці відомостей про відео\n• Кнопка «Відтворити у Kodi» у програвачі завжди просила встановити Kore\n• Налаштування шляхів імпорту та експорту\n• [YouTube] Виправлено кількість вподобань коментарів\nІ багато іншого\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/971.txt",
    "content": "Виправлення\n• Збільшено буфер відтворення після повторної буферизації\n• Виправлено збій на планшетах і телевізорах під час натискання на піктограму черги відтворення у програвачі\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/972.txt",
    "content": "Нове\nРозпізнання міток часу й хештегів у описі\nРучне налаштування режиму планшета\nМожливість ховати відтворені елементи у стрічці\n\nВдосконалено\nПравильна підтримка фреймфорку доступу до сховища\nКраща обробка помилок недоступних та припинених каналів\nПанель спільного доступу на Android 10+ тепер показано у заголовок вмісту.\nОновлено екземпляри Invidious та підтримка канальних посилань.\n\nВиправлено\n[YouTube] Вміст із віковими обмеженнями\nВитоки вікна Винятків під час відкриття вікна вибору\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/973.txt",
    "content": "Виправлення\n• Виправлено обрізання мініатюр і назв у поданні сіткою через неправильне обчислення кількості відео в рядку\n• Виправлено зникнення діалогового вікна звантаження під час бездіяльності, якщо його було відкрито з меню спільного доступу\n• Оновлено бібліотеку, пов'язану з відкриттям зовнішніх дій, таких як оглядач файлів Storage Access Framework\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/974.txt",
    "content": "Виправлення\n• Усунено проблеми з буферизацією, спричинені тротлінгом YouTube\n• Виправлено вилучення коментарів YouTube і збої з вимкненими коментарями\n• Виправлення пошуку музики YouTube\n• Виправлення прямих трансляцій PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/975.txt",
    "content": "Нове\n• Попередній перегляд ескізів під час пошуку\n• Виявлення вимкнених коментарів\n• Дозволено позначити елемент каналу переглянутим\n• Сердечка коментарів\n\nПоліпшено\n• Макет метаданих та міток\n• Компоненти UI кольору служби\n\nВиправлено\n• Ескіз у мініпрогравачі\n• Нескінченну буферизацію повторюваних елементів черги\n• Обертання та швидше закриття програвача\n• ReCAPTCHA залишилася завантаженою у фоновому режимі\n• Вимкнено натискання під час оновлення каналу\n• Деякі збої завантажувача\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/976.txt",
    "content": "• Відкривайте програвач одразу у повноекранному режимі\n• Дозволено обирати типи пошукових\n• Ще темніша темна тема\n• Сірий колір небажаних файлів у оглядачі файлів\n• Виправлено імпортування підписок YouTube\n• Повторне відтворення потоку вимагає повторного натискання кнопки відтворення\n• Виправлено закриття аудіосеансу\n• [Android TV] Виправлено стрибки на панелі переходів під час користування DPad\n\nЩоб переглянути інші зміни, перегляньте журнал змін (і запис блогу) на вкладці посилання унизу.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/977.txt",
    "content": "• Додано кнопку «наступне» до меню тривалого натискання\n• Додано префікс шляху до YouTube shorts у фільтр\n• Імпорт фіксованих налаштувань\n• Зміна положення повзунка пошуку кнопками програвача на екрані черги\n• Виправлення, пов'язані з MediasessionManager\n• Повзунок пошуку доходить до кінця після завершення відео\n• Вимкнено тунелювання медіа на RealtekATV\n• Розширена зона згорнених кнопок програвача\n\nЩоб побачити подальші зміни, перегляньте журнал змін (і допис у блозі) на вкладці посилань внизу.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/978.txt",
    "content": "Виправлено виконання перевірки нової версії NewPipe. Ця перевірка виконувалась надто рано іноді та призводила до збою застосунку. Тепер це має бути виправлено.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/979.txt",
    "content": "- Виправлено відновлення відтворення\n- Поліпшення, що гарантує, що служба, яка визначає, чи повинен NewPipe перевіряти наявність нової версії у фоновому режимі\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/980.txt",
    "content": "Новий\n• Додано опцію «Додати в добірку» до меню спільного доступу\n• Додано підтримку коротких посилань y2u.be та PeerTube\n\nУдосконалено\n• Елементи керування швидкістю відтворення стали компактнішими\n• У стрічці відтепер виділяються нові елементи\n• Опція «Показати переглянуті елементи» у стрічці тепер збережена\n\nВиправлено\n• Виправлено підтягування вподобайок YouTube\n• Виправлено автовідтворення після повернення з фонового режиму\nІ багато іншого\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/981.txt",
    "content": "Вилучено підтримку MediaParser, щоб виправити помилку відновлення відтворення після буферизації на Android 11+.\nВимкнено медіатунелювання на Philips QM16XE, щоб розв'язати проблеми відтворення.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/982.txt",
    "content": "Виправлено проблему невідтворюваності трансляцій YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/983.txt",
    "content": "Переоформлено прокручування дотиком двічі\nДодано пошук у налаштуваннях\nПідсвічено закріплені коментарі\nВтілено відкриття застосунком адрес FSFE PeerTube\nДодано сповіщення про збої\nВиправлено повтор першого в черзі при зміні програвача\nПідтримано довше очікування буферів живих потоків\nУпорядковано результати локального пошуку\nВиправлено порожні поля в черзі відтворення\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/984.txt",
    "content": "Завантаження достатньої кількості початкових елементів у списках, щоб заповнити весь екран і виправлено гортання на планшетах і телевізорах\nУсунуто збої під час гортання списків\nВиправлено проблему перемотування у програвачі\nСкасовано зміни для пристроїв з вирізами під час програвання в багатовіконному режимі\ncompileSdk оновлено з 30 до 31 версії\nОновлено бібліотеку звітів про помилки\nРефакторинг коду програвача\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/985.txt",
    "content": "Виправлено проблему невідтворюваності трансляцій YouTube\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/986.txt",
    "content": "новий\n• Сповіщення про нові потоки \n• Плавний перехід між фоновим і відеоплеєрами \n• Зміна висоти на півтони \n• Додайте головну чергу програвача до списку відтворення \n\nПокращена\n• Запам'ятайте швидкість/розмір кроку \n• Зменшити початкову тривалу буферизацію у відеопрогравачі \n• Покращити інтерфейс користувача плеєра для Android TV \n• Підтвердити перед видаленням усіх завантажених файлів \n\nВиправлено\n• Виправлено, що медіа-кнопка не приховувала елементи керування програвачем \n• Виправлено скидання відтворення при зміні типу гравця \n• Виправлено обертання діалогового вікна списку відтворення\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/987.txt",
    "content": "Нове\n• Підтримка методів доставлення, інших ніж прогресивний HTTP: швидше завантаження відтв., виправл. для PeerTube і SoundCloud, відтв. недавно завершених трансляцій YouTube\n• Кнопка додав. віддаленої добірки до локальної\n• Попередній перегляд зображ. у меню «Поділитися» Android 10+\n\nПокращено\n• Меню параметрів відтв.\n• Переміщено кнопки імпорту/експорту підписки в меню трьох точок\n\nВиправлено\n• Видал. повністю переглянутого відео з добірки\n• Тему меню «Поділитися» та запис «додати в добірку»\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/988.txt",
    "content": "[YouTube] Виправлено помилку «Не вдалося отримати жодного потоку» під час спроби відтворити будь-яке відео\n[YouTube] Виправлено «Цей вміст недоступний у цьому застосунку.» замість запитаного відео\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/989.txt",
    "content": "• [YouTube] Виправлено нескінченне завантаження за спроби відтворити будь-яке відео\n• [YouTube] Виправлено тротлінг на деяких відео\n• Оновлено бібліотеку jsoup до версії 1.15.3, яка включає виправлення безпеки\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/990.txt",
    "content": "Припинено підтримку Android 4.4 KitKat, тепер найнижча версія — Android 5 Lollipop!\n\nНове\n• Завантаження з меню при затисненні\n• Ховання майбутніх відео в стрічці\n• Поширення локальних добірок\n\nПоліпшено\n• Код поділено на компоненти: менше використання пам'яті, менше вад\n• Удосконалено режим масштабування мініатюр\n• Замінено картинки-заглушки на векторні\n\nВиправлено\n• Сповіщення: застарілі/відсутні дані про медіафайл, викривлену мініатюру\n• Використання повноекранним режимом лише чверті екрана\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/991.txt",
    "content": "Нове\n- Додана кнопка «Відкрити у браузері» на панелі помилок\n- Додана можливість показувати групи каналів списком\n- [YouTube] Затисніть сегмент трансляції, щоб поділитися URL-адресою мітки часу\n- Додана кнопка черги відтворення в мініпрогравач\n\nПоліпшено\n- Додано ісландську мову й оновлено інші переклади\n- Багато внутрішніх поліпшень\n\nВиправлено\n- Виправлено численні збої\n- [YouTube] Усунено проблеми завантаження каналів, не виділеною стрічкою й обхідними шляхами відтворення в деяких країнах\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/992.txt",
    "content": "Нове\n• Кількість підписників у поробицях відео\n• Завантаження з черги\n• Постійна мініатюра добірки\n• Затискання хештегів і посилань\n• Картковий режим перегляду\n\nУдосконалено\n• Більша кнопка закриття мініпрогравача\n• Плавніше зменшення масштабу мініатюр\n• Цільова версія Android 13 (API 33)\n• Пошук більше не призупиняє програвач\n\nВиправлено\n• Виправлено накладання на DeX/миша\n• Дозволено фоновий програвач без окремих аудіопотоків\n• Різні виправлення YouTube тощо…\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/993.txt",
    "content": "Нове\n• Додано попередження про дублікати добірок і кнопку їх видалення\n• Дозвіл ігнорувати апаратні кнопки\n• Дозвіл ховати частково переглянуті відео\n\nПоліпшено\n• Більше стовпців сітки на великих екранах\n• Індикатори перегляду відповідні налаштуванням\n\nВиправлено\n• Відкриття URL-адрес браузера, завантажень і зовнішніх програвачів на Android 11+\n• Роботу повноекранного режиму, який вимагав двох дотиків у MIUI\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/994.txt",
    "content": "Нове\n• Підтримка кількох звукових доріжок/мов\n• Регулювання гучності та яскравості жестами з будь-якого боку екрана\n• Підтримка показу основних вкладок у нижній частині екрана\n\nПоліпшено\n• [Bandcamp] Обробка платних доріжок\n\nВиправлено\n• [YouTube] 403 HTTP помилки для трансляцій\n• Чорний програвач під час переходу до головного програвача з добірки\n• Витік службової пам'яті програвача\n• [PeerTube] Поміняно місцями аватарки завантажувача та підканалу\n\nта багато іншого\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/995.txt",
    "content": "Нове\n• Підтримка вкладок каналів\n• Вибір якості зображень\n• Отримання URL всіх зображень\n\nПоліпшено\n• Доступність інтерфейсу\n• Кращий вибір аудіо для завантаження відео\n• Опція додавати назву добірки й відео поширюваного вмісту добірки\n\nВиправлено\n• [YouTube] лічильник вподобайок\n• Нереагування спливних вікон і збої в роботі програвача\n• Вибір неправильних мов у перемикачі мов\n• Фокусування звуку програвача не враховувало вимкнення звуку\n• Додавання елементів добірок інколи не працювало\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/996.txt",
    "content": "Виправлено NullPointerException під час відкриття каналу / конференції у media.ccc.de.\nГрінч намагався зламати наш різдвяний подарунок, але ми його полагодили.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/997.txt",
    "content": "Нове\n• Додано коментарі відповідей\n• Дозвіл перевпор. плейлістів\n• Показ опису й тривалості плейлістів\n• Дозвіл скидати налаштування\n\nУдосконалено\n• [Android 13+] Відновлено власні дії сповіщень\n• Запит згоди на пошук оновлень\n• Дозвіл відтвор./паузи зі сповіщень під час буферизації\n• Перевпор. деякі налаштування\n\nВиправлено\n• [YouTube] Усунуто незавантаж. коментарів та інші виправлення\n• Усунуто вразливість імпорту налаштув. і переходу на JSON\n• Виправлення завантажень\n• Обрізання тексту пошуку\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/998.txt",
    "content": "Виправлено помилку, коли не відтворювалися трансляції YouTube через помилку HTTP 403.\n\nВипадкові помилки HTTP 403 посеред відео на YouTube ще не виправлені.\nЦя проблема буде усунена в наступному випуску виправлення якнайшвидше.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/changelogs/999.txt",
    "content": "Цей випуск виправляє помилки HTTP 403 в середині відео YouTube.\n\nНове\n• [SoundCloud] Додано підтримку URL-адрес on.soundcloud.com\n\nВдосконалено\n- [Bandcamp] Показ додаткових відомостей у радіокіоску\n\nВиправлено\n• [YouTube] Виправлено випадкові помилки HTTP 403 на початку або в середині відео\n• [YouTube] Витягнуто аватар і банер з більшої кількості типів заголовків каналів\n- [Bandcamp] Виправлено різні помилки та постійно використовується HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/uk/full_description.txt",
    "content": "NewPipe не використовує бібліотеки фреймворку Google або API YouTube, взаємодіючи тільки з сайтом служби для отримання потрібних відомостей. NewPipe може працювати на пристроях без установлених Служб Google і не вимагає облікового запису YouTube, є вільним програмним забезпеченням.\n"
  },
  {
    "path": "fastlane/metadata/android/uk/short_description.txt",
    "content": "Вільний та легкий YouTube-інтерфейс для Android.\n"
  },
  {
    "path": "fastlane/metadata/android/und/full_description.txt",
    "content": "撩批突朗u 安妮 急救 法拉worker 禮拜你 YouTube APi 亦只是 cần tờ website in autor 途經 information it nêds therefore this app can be used on devices without Google services installed. 阿手 你不捏 一個youtube阿卡, to you 餘 批\n"
  },
  {
    "path": "fastlane/metadata/android/und/short_description.txt",
    "content": "Cum ca Android* dar free light-wetit Youtube fotu'end\n"
  },
  {
    "path": "fastlane/metadata/android/ur/changelogs/63.txt",
    "content": "### بہتری\n- درآمد/برآمد کی ترتیبات #1333\n- اوور ڈرا کی کمی (کارکردگی میں بہتری) #1371\n- چھوٹے کوڈ میں بہتری #1375\n- GDPR کے بارے میں سب کچھ شامل کرنا۔ #1420\n\n### درستگی\n- ڈاؤنلوڈر: .giga فائلز سے نامکمل ڈاؤن لوڈ کو لوڈ کرنے پر کریش ہونے کی درستگی۔ #1407\n"
  },
  {
    "path": "fastlane/metadata/android/ur/changelogs/956.txt",
    "content": "(یوٹیوب) ویڈیو لوڈ کرتے ہوئے کریش کو ٹھیک کر دیا گیا ہے\n"
  },
  {
    "path": "fastlane/metadata/android/ur/full_description.txt",
    "content": "نیو پائپ کوئی گوگل فریم ورک لائبریری، یا YouTube API استعمال نہیں کرتا ہے۔ یہ صرف ویب سائٹ کو پارس کرتا ہے تاکہ اس کی ضرورت کی معلومات حاصل کی جا سکے۔ اس لیے اس ایپ کو گوگل سروسز انسٹال کیے بغیر ڈیوائسز پر استعمال کیا جا سکتا ہے۔ اس کے علاوہ، آپ کو نیو پائپ استعمال کرنے کے لیے یوٹیوب اکاؤنٹ کی ضرورت نہیں ہے، اور یہ FLOSS ہے۔\n"
  },
  {
    "path": "fastlane/metadata/android/ur/short_description.txt",
    "content": "اینڈرائیڈ کے لیے ایک لائٹ ویٹ یوٹیوب فرنٹ اینڈ\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/63.txt",
    "content": "### Improvements\n- Import/export settings #1333 \n- Reduce overdraw (performance improvement) #1371 \n- Small code improvements #1375 \n- Add everything about GDPR #1420\n\n### Fixed\n- Downloader: Fix crash on loading unfinished downloads from .giga files #1407\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/64.txt",
    "content": "### takomillashtirish\n- Mobil ma'lumotlardan foydalanishda video sifatini cheklash qobiliyati qo'shildi. # 1339\n- # 1442 sessiya uchun yorqinligini eslang\n- Zaif protsessorlar uchun yuklab olish ish faoliyatini yaxshilang # 1431\n- 1414-sonli media-sessiyani qo'llab-quvvatlash (ishlaydigan) qo'shish\n\n### Tuzatish\n- Yuklab olishlarni ochilishidagi nosozlikni tuzatish (tuzatishlar hozirda mavjud) # 1441\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/730.txt",
    "content": "# Ruxsat etilgan\n- Funktsiyaning xatosini yana tezkor hal qilish.\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/770.txt",
    "content": "0.17.2-dagi o'zgarishlar\n\nTuzatish\n• Hech qanday video mavjud emasligini aniqlang\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/820.txt",
    "content": "YouTube-ni yaroqsiz holga keltiradigan regex parolini hal qilish funktsiyasi nomi aniqlandi.\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/830.txt",
    "content": "SoundCloud muammolarini hal qilish uchun SoundCloud client_id yangilandi.\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/850.txt",
    "content": "Ushbu versiyada YouTube veb-saytining versiyasi yangilandi. Eski veb-sayt versiyasi mart oyida to'xtatiladi va shuning uchun siz NewPipe-ni yangilashingiz kerak.\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/860.txt",
    "content": "Yaxshilangan\n• Tovush balandligi va tempni saqlash va tiklash\n• pleerda displey kesilishini qo'llab-quvvatlash\n• Dumaloq ko'rinish\n• Kamroq ma'lumot sarflash uchun YouTube optimallashtirilgan\n\nUshbu nashrda YouTube bilan bog'liq 15 dan ortiq xatoliklar tuzatildi.\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/870.txt",
    "content": "Bu SoundCloud-dan yana katta qiyinchiliklarsiz foydalanishga ruxsat berish uchun NewPipe-ni yangilaydigan tuzatish.\nEndi ekstraktorda SoundCloud-ning v2 API-si ishlatiladi va yaroqsiz mijoz identifikatorlarini aniqlash yaxshilandi.\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/900.txt",
    "content": "Yangi\n• Obunalar va saralangan tasmalar\n• Pleerlarda ovozni o'chirish tugmasi\n\nYaxshilangan\n• NewPipe-da music.youtube.com va media.ccc.de havolalarini ochishga ruxsat\n• Tashqi ko'rinishdan tarkibga ikkita sozlamani o'zgartirish\n• 5, 15, 25 soniyali qidirish variantlarini yashirish, agar noaniq izlash yoqilgan bo'lsa\n\nRuxsat etilgan\n• Android P-da ma'lumotlar bazasini zaxiralash\n• yuklab olingan faylni ulashishda xato\n• YouTube-dan ekstraksiya qilishda muammo va boshqalar ...\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/910.txt",
    "content": "Ba'zi kamdan-kam hollarda NewPipe-ni ishga tushirishga to'sqinlik qilgan ma'lumotlar bazasining ko'chishi aniqlandi.\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/920.txt",
    "content": "Yaxshilangan\n\n• Yuklangan sana va translatsiya katakchalari bo'yicha ko'rishlar soni qo'shildi\n• tortmachaning sarlavhasi tartibini takomillashtirish\n\nRuxsat etilgan\n\n• Ruxsat etilgan tugma tugmasi API 19 da ishdan chiqishiga olib keladi\n• Uzoq 1080p 60fps uzunlikdagi videolarni yuklab olish to'g'rilandi\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/930.txt",
    "content": "Yangi\n• YouTube Music-da qidirish\n• Asosiy Android TV-ni qo'llab-quvvatlash\n\nYaxshilangan\n• Ko'rilgan videolarni pleylistdan olib tashlash\n• Yaxshilangan popup pleyer o'lchamini o'zgartirish\n• Orqa fonda streamni yoqish\n• Ishlov berish hajmi yaxshilandi\n\nRuxsat etilgan\n• Yosh cheklangan tarkib sozlamalari ishlamayapti\n• reCAPTCHA-larning ayrim turlari aniqlandi\n• Pleylist \"bo'sh\" bo'lsa, xatcho'plarni ochishda xato yuz berdi\n• Obunalar saralash tugmachasining aniq ko'rinishi\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/940.txt",
    "content": "Yangi\n• SoundCloud sharhini qo'llash\n• YouTube cheklangan rejim sozlamalarini qo'shish\n• PeerTube ota-ona kanalining tafsilotlarini ko'rsatish\n\nYaxshilangan\n• Kore tugmasini xizmatlar uchun ko'rsatish\n• Navigatsiya paneli yoki StatusBar pleyer imo-ishoralarini bloklash\n• Fon rangini o'zgartirish\n\nRuxsat etilgan\n• Yuklab olish dialogining muzlatilishini tuzatish\n• Brauzerda ochish tugmasi endi brauzerda ochiladi\n• Videolarni ochishda xatolikni tuzatish va \"Ushbu oqim ijro etilmadi\"\n\nva boshqalar\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/950.txt",
    "content": "Ushbu versiya uchta kichik tuzatishni keltirib chiqaradi:\n• Android 10+ operatsion tizimida saqlashga ruxsat berilgan\n• Ruxsat etilgan ochiladigan kiosklar\n• Uzoq videoning aniqlangan davomiyligini tahlil qilish\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/952.txt",
    "content": "Yaxshilangan\n• Avtomatik ijro barcha xizmatlar uchun mavjud (faqat YouTube o'rniga)\n\nRuxsat etilgan\n• YouTube-ning yangi davomini qo'llab-quvvatlash orqali tegishli oqimlar aniqlandi\n• Ruxsat etilgan yosh bo'yicha cheklangan YouTube videolari\n• [Android TV] fokusni ajratib turadigan doimiy reja\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/953.txt",
    "content": "YouTube-ning parolini hal qilish funktsiyasini tuzatish.\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/954.txt",
    "content": "• yangi dastur: batafsil sahifada videolarni ijro etish, pleyerni kamaytirish uchun pastga suring\n• MediaStyle bildirishnomalari: bildirishnomalarda moslashtiriladigan harakatlar, ish faoliyatini yaxshilash\n• NewPipe-ni ish stoli ilovasi sifatida ishlatishda asosiy o'lchamlarni o'zgartirish\n\n• Qidiruv takliflarini yaxshilash\n• Standart video sifatini 720p60 (ilova ichidagi pleer) va 480p (pop-up pleer) ga oshirish\n\n• bir necha xatolarni tuzatish va boshqalar\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/955.txt",
    "content": "[YouTube] Ba'zi foydalanuvchilar uchun qidiruvni aniqlang\n[YouTube] Tasodifiy parol hal qilishda istisnolarni tuzating\nSlash bilan tugaydigan [SoundCloud] URL manzillari endi to'g'ri tahlil qilindi\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/956.txt",
    "content": "[YouTube] Har qanday videoni yuklashda nosozlik aniqlandi\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/changelogs/957.txt",
    "content": "• Muayyan elementlarni bittaga birlashtirish\n• Ijroni yopish uchun ikkita barmoq harakati\n• reCAPTCHA cookie-fayllarini tozalash\n• Bildirishnomani rangsizlantirish imkoniyati\n• NewPipe-ga ulashishda cheksiz buferlash\n• YouTube videolarini tezlashtirish va yoshi cheklanganlarni tuzatish\n• Fix crashni tez oldinga / orqaga qaytarishda to'g'rilash\n• Kichik rasmlarni tortib ro'yxatlarni qayta tartibga solmaslik\n• Har doim popup funksiyalarini eslang\n• Santal tilini qo'shish\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/full_description.txt",
    "content": "NewPipe hech qanday Google ramka kutubxonalaridan yoki YouTube API-dan foydalanmaydi. U faqat kerakli ma'lumotlarni olish uchun veb-saytni tahlil qiladi. Shuning uchun ushbu dasturdan Google Services o'rnatilmagan qurilmalarda foydalanish mumkin. Bundan tashqari, NewPipe-dan foydalanish uchun sizga hech qanday YouTube hisob qaydnomasi kerak emas va bu FLOSS.\n"
  },
  {
    "path": "fastlane/metadata/android/uz-Latn/short_description.txt",
    "content": "Android uchun bepul yangi YouTube frontend.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/1000.txt",
    "content": "Cải thiện\n• Chạm mô tả danh sách phát để xem thêm / thu gọn\n• [PeerTube] Tự xử lý liên kết `subscribeto.me`\n• Chỉ phát một mục trong màn hình lịch sử\n\nĐã sửa\n• Hiển thị nút RSS\n• Crash xem trước thanh tua\n• Tạo danh sách phát với mục không có thumbnail\n• Thoát hộp thoại \"Tải xuống\" trước khi hiển thị\n• Popup thêm mục liên quan vào hàng chờ\n• Thứ tự trong hộp thoại \"Thêm vào danh sách phát\"\n• Bố cục mục đánh dấu danh sách phát\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/1001.txt",
    "content": "Đã cải thiện\n• Luôn cho phép thay đổi tùy chọn thông báo của trình phát video/nhạc trên Android 13+\n\nĐã sửa lỗi trước đó\n• Sửa lỗi khi xuất cơ sở dữ liệu / đăng ký sẽ không cắt / xoá một tệp đã tồn tại, có thể dẫn đến dữ liệu / đăng ký đã xuất bị hỏng\n• Sửa lỗi trình phát bắt đầu lại từ đầu khi nhấp vào dấu thời gian\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/1002.txt",
    "content": "Đã sửa lỗi YouTube không phát bất kỳ luồng nào.\n\nBản phát hành này chỉ giải quyết lỗi cấp bách nhất khiến video YouTube không tải thông tin chi tiết về video.\nChúng tôi biết có những vấn đề khác và chúng tôi sẽ sớm đưa ra một bản phát hành riêng để giải quyết những vấn đề đó.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/1003.txt",
    "content": "Đây là bản vá khẩn sửa lỗi YouTube:\n• [YouTube] Sửa lỗi không tải thông tin video, lỗi HTTP 403 khi phát và khôi phục phát một số video giới hạn độ tuổi\n• Cỡ chữ phụ đề không thay đổi\n• Tải thông tin hai lần khi mở stream\n• [SoundCloud] Loại bỏ stream DRM không thể phát\n• Cập nhật bản dịch\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/1004.txt",
    "content": "Bản phát hành này khắc phục lỗi YouTube chỉ cung cấp luồng 360p.\n\nLưu ý rằng giải pháp được sử dụng trong phiên bản này có thể chỉ là tạm thời, và về lâu dài, giao thức video SABR cần được triển khai, nhưng hiện tại các thành viên TeamNewPipe đang rất bận rộn nên chúng tôi rất mong nhận được sự giúp đỡ! https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/1005.txt",
    "content": "Mới\n• Hỗ trợ Android Auto\n• Cho phép đặt nhóm feed làm tab màn hình chính\n• [YouTube] Chia sẻ dạng danh sách phát tạm thời\n• [SoundCloud] Tab kênh đã thích\n\nCải thiện\n• Gợi ý thanh tìm kiếm rõ hơn\n• Hiển thị ngày tải trong Tải xuống\n• Dùng ngôn ngữ riêng cho ứng dụng (Android 13)\n\nĐã sửa\n• Màu chữ lỗi trong chế độ tối\n• [YouTube] Playlist không tải quá 100 mục\n• [YouTube] Thiếu video đề xuất\n• Crash trong danh sách Lịch sử\n• Timestamp trong phản hồi bình luận\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/1006.txt",
    "content": "Cải thiện\n• Giữ trình phát hiện tại khi nhấn timestamp\n• Thử khôi phục các tác vụ tải xuống đang chờ\n• Tùy chọn xóa bản tải mà không xóa tệp\n• Quyền Overlay: hiển thị hộp thoại giải thích (Android > R)\n• Hỗ trợ mở liên kết on.soundcloud\n• Nhiều cải thiện và tối ưu nhỏ\n\nĐã sửa\n• Định dạng số rút gọn cho Android < 7\n• Thông báo \"ma\"\n• Lỗi phụ đề SRT\n• Nhiều crash\n\nPhát triển\n• Hiện đại hóa mã nội bộ\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/1007.txt",
    "content": "Bản vá khẩn sửa lỗi \"Nội dung không khả dụng\": video YouTube đã phát lại bình thường.\n\nCũng sửa một số lỗi từ 0.28.1:\n• Kéo mục trong playlist chỉ sang được vị trí liền kề\n• Tiêu đề/bình luận nhấp nháy giữa video hiện tại và trước đó\n• Tùy chọn \"Mở trình phát chính toàn màn hình\" không hoạt động\n\nCải thiện khác:\n• [YouTube] Có thể tua lại livestream tối đa 4 giờ\n• Không tải video livestream khi phát nền\n• Giao diện mới cho \"Xóa đã xem\"\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/1008.txt",
    "content": "• Đã sửa lỗi phát lại livestreams tại điểm phát cuối\n• [Youtube] hỗ trợ thêm nhiều dạng URL kênh\n• [Youtube] hỗ trợ thêm nhiều format cho video metainfo\n• Đã cải thiện các bản dịch\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/1009.txt",
    "content": "Quan trọng\nĐã bổ sung thông tin kêu gọi hành động cho chiến dịch Keep Android Open: https://www.keepandroidopen.org/\n\nĐã cải thiện\n[Feed] Cập nhật các đăng ký cũ theo thứ tự ngẫu nhiên\nCác trang bình luận không còn chồng lên nhau\nKhông truyền sự kiện nhấn xuống view bên dưới trên trang chi tiết video\n\nĐã sửa\nLỗi không hiện ảnh avatar ở phần comment\nNhững lỗi liên quan đến UI của phần trình phát\n[SoundCloud] các luồng phát có ID dài\nVà nhiều sửa lỗi, cải thiện khác\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/63.txt",
    "content": "### Cải thiện\n- Nhập/xuất cài đặt (yêu cầu #1333)\n- Giảm thiểu overdraw (cải thiện hiệu năng tổng quan) (vấn đề #1371)\n- Cải thiện code một chút (vấn đề #1375)\n- Thêm thông tin về GDPR (yêu cầu #1420)\n\n### Sửa lỗi\n- Trình tải: Sửa lỗi crash khi nạp các file .giga chưa xong việc tải về\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/64.txt",
    "content": "### Cải thiện\n- Thêm tính năng giới hạn độ phân giải video nếu đang sử dụng dữ liệu di động (yêu cầu #1339)\n- Ghi nhớ độ sáng màn hình trong phiên (yêu cầu #1442)\n- Cải thiện tốc độ tải xuống cho các CPU có hiệu năng yếu (vấn đề #1431)\n- Hỗ trợ cho media session (yêu cầu #1433)\n\n### Sửa lỗi\n- Sửa lỗi crash khi mở các file đã tải về (bản sửa lỗi này giờ đã có trên các build mới hơn) (vấn đề #1441)\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/65.txt",
    "content": "### Cải thiện:\n\n- Tắt hoạt ảnh biểu tượng burgermenu #1486\n- Hoàn tác xóa các bản tải xuống # 1472\n- Tùy chọn tải xuống trong menu chia sẻ #1498\n- Đã thêm tùy chọn chia sẻ vào menu nhấn giữ #1454\n- Thu nhỏ trình phát chính ở lối ra #1354\n- 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\n- Cập nhật ExoPlayer 2.8.2 #1392\n   - 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.\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 =\\\\).\n   - Độ 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.\n   - Đã 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.\n   - 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\n- 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ụ\n\n### Sửa lỗi\n\n- Sửa lỗi #1440 Bố cục thông tin video bị hỏng #1491\n- Xem lịch sử sửa lỗi #1497\n   - #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.\n   - #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.\n- 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)\n- Sửa lỗi trình phát video chính #1509\n   - [#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.\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.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/66.txt",
    "content": "# Nhật ký thay đổi của v0.13.7\n\n### Đã sửa\n- Khắc phục sự cố bộ lọc sắp xếp của v0.13.6\n\n# Nhật ký thay đổi của v0.13.6\n\n### Cải tiến\n\n- Tắt hoạt ảnh biểu tượng burgermenu #1486\n- hoàn tác xóa tải xuống #1472\n- Tùy chọn tải xuống trong menu chia sẻ #1498\n- Đã thêm tùy chọn chia sẻ vào menu nhấn dài #1454\n- Thu nhỏ trình phát chính ở lối ra #1354\n- 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\n- ExoPlayer 2.8.2 Cập nhật #1392\n- 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.\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 =\\\\).\n- Độ 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.\n- Đã 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.\n- 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\n- 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ụ\n\n### Sửa lỗi\n\n- Sửa lỗi #1440 Bố cục thông tin video bị hỏng #1491\n- Xem lịch sử sửa lỗi #1497\n- #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.\n- #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.\n- Sửa lỗi màn hình hết thời gian chờ trong chế độ bật lên. #1463 (Đã sửa #640)\n- Sửa lỗi trình phát video chính #1509\n- [#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.\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.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/68.txt",
    "content": "# thay đổi của v0.14.1\n\n### Đã sửa\n- Đã sửa lỗi không giải mã được url video #1659\n- Sửa lỗi link mô tả không giải nén tốt #1657\n\n# thay đổi của v0.14.0\n\n### Mới\n- Thiết kế ngăn kéo mới #1461\n- Trang trước có thể tùy chỉnh mới #1461\n\n### Cải tiến\n- Điều khiển cử chỉ được làm lại #1604\n- Cách mới để đóng trình phát cửa sổ bật lên #1597\n\n### Đã sửa\n- Sửa lỗi khi không có số lượng đăng ký. Đóng #1649.\n- Hiển thị \"Không có số lượng người đăng ký\" trong những trường hợp đó\n- Khắc phục NPE khi danh sách phát YouTube trống\n- Sửa nhanh các ki-ốt trong SoundCloud\n- Tái cấu trúc và sửa lỗi #1623\n- Sửa kết quả tìm kiếm theo chu kỳ #1562\n- Sửa lỗi thanh Tìm kiếm không được bố trí tĩnh\n- Sửa lỗi video YT Premium không bị chặn đúng cách\n- Khắc phục Video đôi khi không tải (do phân tích cú pháp DASH)\n- Sửa các liên kết trong phần mô tả video\n- Hiển thị cảnh báo khi ai đó cố gắng tải xuống thẻ sdcard bên ngoài\n- sửa lỗi không hiển thị báo cáo kích hoạt ngoại lệ\n- 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)\n- Sửa lỗi đăng ký máy thu phát sóng. Đóng #1641.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/69.txt",
    "content": "### Mới\n- Nhấn và giữ để xóa và chia sẻ trong đăng ký #1516\n- Giao diện người dùng máy tính bảng và bố cục danh sách lưới #1617\n\n### Cải tiến\n- lưu trữ và tải lại tỷ lệ khung hình được sử dụng lần cuối # 1748\n- Bật bố cục tuyến tính trong hoạt động Tải xuống với tên video đầy đủ #1771\n- Xóa và chia sẻ đăng ký trực tiếp từ trong tab đăng ký #1516\n- 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\n- Riêng cài đặt cho cử chỉ âm lượng và độ sáng #1644\n- Thêm hỗ trợ Bản địa hóa #1792\n\n### Sửa lỗi\n- 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\n- Sửa số lượng đăng ký\n- Thêm quyền dịch vụ nền trước cho các thiết bị API 28+ #1830\n\n### Lỗi đã biết\n- Không thể lưu trạng thái phát lại trên Android P\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/70.txt",
    "content": "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? ¯\\_(ツ)_/¯\n\n### Cải tiến\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\n* bỏ hỗ trợ cho android 4.1 - 4.3 #1884\n* xóa trình phát cũ #1884\n* 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\n* 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\n* 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\n* Cơ sở hạ tầng hậu xử lý\n* Xử lý lỗi thích hợp \"cơ sở hạ tầng\" (dành cho người tải xuống)\n* Xếp hàng thay vì tải xuống nhiều lần\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\n* Triển khai thử tải xuống tối đa\n* Tạm dừng tải xuống đa luồng thích hợp\n* 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)\n* Lưu số lượng chủ đề cho lần tải tiếp theo\n* Đã sửa rất nhiều lỗi không mạch lạc\n\n### Đã sửa\n* 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\n* Đã sửa lỗi trình phát bật lên #1874\n* NPE khi cố mở trình phát nền #1901\n* Sửa lỗi chèn luồng mới khi bật xếp hàng tự động #1878\n* Đã khắc phục sự cố tắt máy giải mã\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/71.txt",
    "content": "### Cải thiện\n* Thêm thông báo cập nhật ứng dụng cho bản dựng GitHub (#1608 bởi @krtkush)\n* Nhiều cải tiến cho trình tải xuống (#1944 bởi @kapodamy):\n* 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\n* Kiểm tra xem trình lặp có được khởi tạo hay không (sửa lỗi #2031)\n* 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\n* Bộ ghép nối MPEG-4 mới sửa lỗi luồng video và âm thanh không đồng bộ (#2039)\n\n### Sửa lỗi\n* Luồng trực tiếp YouTube dừng phát sau một thời gian ngắn (#1996 bởi @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/730.txt",
    "content": "# Sửa lỗi\n- Hotfix tiếp lỗi không thể giải mã.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/740.txt",
    "content": "<h4>Cải tiến</h4>\n<ul>\n<li>click được liên kết trong phần bình luận, tăng cỡ chữ</li>\n<li>nhảy đến khi click vào mốc thời gian ở bình luận</li>\n<li>hiện tab ưa thích dựa trên trạng thái lựa chọn gần đây</li>\n<li>thêm danh sách phát vào hàng chờ khi chạm lâu &#39;Phát nền&#39; trong cửa sổ danh sách phát</li>\n<li>tìm kiếm từ ngữ chung khi nó không phảiURL</li>\n<li>thêm &quot;chia sẻ thời gian hiện tại &quot; nút trờ về video chính</li>\n<li>thêm nút đóng vào trình phát chính khi hàng đợi video kết thúc</li>\n<li>thêm &quot;Chơi trực tiếp dưới nền&quot; chạm lâu vào menu để xem danh sách video</li>\n<li>cải thiện bản dịch tiếng Anh cho lệnh Chơi/Thêm vào danh sách </li>\n<li>cải thiện hiệu năng một xíu</li>\n<li>xóa bỏ những tệp không dùng đến</li>\n<li>cập nhật ExoPlayer lên 2.9.6</li>\n<li>hỗ trợ liên kết Invidious </li>\n</ul>\n<h4>Vá lỗi</h4>\n<ul>\n<li>sửa w/ bình luận và vô hiệu hóa phát luồng liên quan</li>\n<li>sửa lỗi CheckForNewAppVersionTask bị thực thi khi không mong muốn&#39;t</li>\n<li>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 đề</li>\n<li>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</li>\n</ul>\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/770.txt",
    "content": "Thay đổi trong phiên bản 0.17.2\n\nSửa lỗi\n• Sửa lỗi không có video nào\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/780.txt",
    "content": "Các thay đổi trong 0.17.3\n\nCải tiến\n• Thêm tùy chọn để xóa trạng thái phát lại #2550\n• Hiển thị các thư mục ẩn trong bộ chọn tệp #2591\n• Hỗ trợ các URL từ các phiên bản `invidio.us` sẽ được mở bằng NewPipe #2488\n• Thêm hỗ trợ cho các URL `music.youtube.com` TeamNewPipe/NewPipeExtractor#194\n\nĐã sửa\n• [YouTube] Đã sửa 'java.lang.IllegalArgumentException #192\n• [YouTube] Đã sửa luồng không hoạt động TeamNewPipe/NewPipeExtractor#195\n• Đã sửa lỗi hiệu suất trong android Pie khi tải xuống luồng #2592\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/820.txt",
    "content": "Sửa regex trong hàm giải mã đang làm cho phần YouTube không dùng được.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/830.txt",
    "content": "Cập nhật phần client_id của SoundCloud để sửa lỗi liên quan tới SoundCloud.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/850.txt",
    "content": "Giao diện của trang web YouTube đã được cập nhật khi phiên bản này đã được release. Giao diện trang YouTube cũ sẽ không còn vào được từ tháng 3, vì vậy bạn phải cập nhật NewPipe.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/860.txt",
    "content": "Cải thiện\n• Lưu và khôi phục trạng thái bật/tắt âm vực và nhịp độ.\n• Hỗ trợ hiển thị phần cắt trên màn hình trong trình phát.\n• Làm tròn lượt xem và số lượng người đăng ký.\n• Tối ưu hóa YouTube để sử dụng ít dữ liệu hơn.\n\nHơn 15 lỗi liên quan đến YouTube đã được sửa trong bản phát hành này.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/870.txt",
    "content": "Đây là bản hotfix cập nhật NewPipe để sửa lỗi dịch vụ SoundCloud.\nAPI v2 của SoundCloud sẽ được dùng trong phần extractor; khả năng phát hiện client ID không hợp lệ đã được cải thiện.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/900.txt",
    "content": "Mới\n• Nhóm đăng ký và luồng được sắp xếp\n• Nút tắt tiếng trong trình phát\n\nCải thiện\n• Cho phép mở liên kết music.youtube.com và media.ccc.de trong NewPipe\n• Di dời hai cài đặt từ Xuất hiện sang Nội dung\n• Ẩ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\n\nSửa lỗi\n• Một số video WebM không thể tìm kiếm\n• Sao lưu cơ sở dữ liệu trên Android P\n• Sự cố khi chia sẻ tệp đã tải xuống\n• Rất nhiều vấn đề trích xuất YouTube và nhiều hơn nữa...\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/910.txt",
    "content": "Sửa lỗi nhập database dẫn tới chặn NewPipe chạy trong một số trường hợp hiếm gặp.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/920.txt",
    "content": "Cải thiện\n\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.\n• Cải thiện bố cục tiêu đề ngăn kéo.\n\nSửa lỗi\n\n• Sửa lỗi nút tắt tiếng gây treo trên API 19.\n• Sửa lỗi tải xuống video 1080p 60fps dài\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/950.txt",
    "content": "Bản cập nhật này có ba phần sửa lỗi nhỏ:\n• Sửa lỗi quyền truy cập bộ nhớ trên Android 10+\n• Sửa lỗi mở các trang kiosk\n• Sửa lỗi parse độ dài video cho các video dài\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/952.txt",
    "content": "Cải thiện\n• Tự động phát có sẵn cho tất cả các dịch vụ (thay vì chỉ cho YouTube)\n\nSửa lỗi\n• 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\n• Sửa lỗi video YouTube bị giới hạn độ tuổi\n• [Android TV] Sửa lỗi lớp phủ nổi bật của tiêu điểm vẫn còn\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/953.txt",
    "content": "Sửa phần trích xuất của hàm giải mã link YouTube.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/954.txt",
    "content": "• giao diện làm việc mới: phát video trên trang chi tiết; vuốt xuống để thu nhỏ trình phát\n• thông báo kiểu MediaStyle: hành động nhanh tùy biến được, cải thiện hiệu năng\n• khả năng resize cửa sổ cơ bản khi dùng NewPipe như là ứng dụng desktop.\n\n• hiện thông báo với tùy chọn khi gặp URL không được hỗ trợ\n• sửa lỗi gợi ý tìm kiếm khi bị mất kết nối\n• nâng chất lượng video mặc định lên 720p60 (trình phát chính) và 480p (trình phát pop-up)\n\n• một đống bản vá lỗi và hơn thế nữa\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/955.txt",
    "content": "[YouTube] Sửa lỗi tìm kiếm cho một số người dùng\n[YouTube] Sửa lỗi xảy ra ngẫu nhiên cho hàm giải mã\n[SoundCloud] URL kết thúc với dấu gạch chéo (/) giờ đã đọc được bình thường\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/956.txt",
    "content": "[YouTube] Sửa lỗi crash khi mở bất kì video nào\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/959.txt",
    "content": "Sửa lỗi crash vô tận sau khi mở trình báo lỗi.\nCập nhật danh sách instance PeerTube có thể tự động mở được bằng NewPipe.\nCập nhật các bản dịch.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/960.txt",
    "content": "• Sửa phần mô tả tính năng xuất database trong cài đặt.\n• Sửa lỗi parse phần comment trên YouTube.\n• Sửa lỗi tên hiển thị trên media.ccc.de.\n• Cập nhật các bản dịch.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/961.txt",
    "content": "• [YouTube] Hỗ trợ playlist Mix\n• [YouTube] Hiện thông tin về các nhà đài và COVID-19\n• [media.ccc.de] Thêm mục gần đây\n• Hỗ trợ ngôn ngữ Somali\n\n• Nhiều cải thiện phía sau nền\n\n• Sửa lỗi chia sẻ video trong chính trình phát\n• Sửa lỗi trang ReCaptcha trống\n• Sửa lỗi khi loại bỏ một stream khỏi danh sách\n• [PeerTube] Sửa lỗi các stream liên quan\n• [YouTube] Sửa lỗi tìm kiếm YouTube Music\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/962.txt",
    "content": "Thêm mục \"video gần đây\" cho media.ccc.de.\nHỗ trợ live stream nói chung và cho media.ccc.de.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/963.txt",
    "content": "• [YouTube] Sửa lỗi tiếp nối kênh (channel continuation)\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/964.txt",
    "content": "• Hỗ trợ chapter trong bảng điều khiển trình phát\n• [PeerTube] Thêm trình search Sepia\n• Thêm lại nút share trong giao diện chi tiết video; chuyển mô tả stream vào tab layout\n• Tắt khôi phục độ sáng màn hình nếu cử chỉ chỉnh độ sáng đã tắt\n• Thêm danh sách mục phát video cho Kodi\n• Sửa lỗi crash khi không có trình duyệt mặc định được chọn trên một số thiết bị; cải thiện menu chia sẻ\n• Nhấn phát/dừng trong trình phát toàn màn hình bằng phím cách vật lý\n• [media.ccc.de] Sửa lỗi và cải thiện chung\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/965.txt",
    "content": "Sửa lỗi sập ứng dụng khi sắp xếp lại các nhóm kênh.\nSửa lỗi lấy thêm video YouTube từ kênh và danh sách phát.\nSửa lỗi lấy bình luận YouTube.\nThêm hỗ trợ cho các đường dẫn phụ /watch/, /v/ và /w/ trong URL YouTube.\nSửa lỗi trích xuất ID khách hàng SoundCloud và nội dung bị giới hạn địa lý.\nThêm bản địa hóa tiếng Kurd Bắc.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/967.txt",
    "content": "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.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/968.txt",
    "content": "Thêm tùy chọn chi tiết kênh vào menu nhấn giữ lâu.\nThêm chức năng đổi tên Danh sách phát từ giao diện danh sách phát.\nCho phép người dùng tạm dừng trong khi video đang được đệm.\nHoàn thiện giao diện màu trắng.\nSửa lỗi font chữ chồng lên nhau khi sử dụng kích thước font chữ lớn hơn.\nSửa lỗi không có video trên thiết bị Formuler và Zephier.\nSửa lỗi treo ứng dụng.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/969.txt",
    "content": "• Cho phép cài đặt trên bộ nhớ ngoài\n• [Bandcamp] Thêm hỗ trợ hiển thị ba bình luận đầu tiên trên một luồng\n• Chỉ hiển thị thông báo \"tải xuống đã bắt đầu\" khi tải xuống được bắt đầu\n• Không đặt cookie reCaptcha khi không có cookie nào được lưu trữ\n• [Trình phát] Cải thiện hiệu suất bộ nhớ cache\n• [Trình phát] Sửa lỗi trình phát không tự động phát\n• Loại bỏ Snackbars trước khi xóa tải xuống\n• Sửa lỗi cố gắng xóa đối tượng không có trong danh sách\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/970.txt",
    "content": "Mới\n• 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ả\n• 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ộ)\n• Thêm tùy chọn \"Mở trong trình duyệt\" vào menu nhấn giữ\n\nSửa lỗi\n• Sửa lỗi xoay màn hình bị lỗi trên trang chi tiết video\n• Sửa lỗi nút \"Phát với Kodi\" trong trình phát luôn nhắc cài đặt Kore\n• Sửa lỗi và cải thiện đường dẫn nhập và xuất cài đặt\n• [YouTube] Sửa lỗi số lượng thích cho bình luận\nVà nhiều hơn nữa\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/971.txt",
    "content": "Khắc phục nhanh\n• Tăng bộ nhớ đệm cho phát lại sau khi tải lại bộ nhớ đệm\n• 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\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/973.txt",
    "content": "Khắc phục nhanh\n• 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.\n• 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ẻ.\n• 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.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/974.txt",
    "content": "Khắc phục nhanh\n• Sửa lỗi bộ nhớ đệm do YouTube giới hạn tốc độ\n• 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\n• Sửa lỗi tìm kiếm nhạc YouTube\n• Sửa lỗi phát trực tiếp PeerTube\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/978.txt",
    "content": "Đã 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.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/979.txt",
    "content": "- Sửa lỗi tiếp tục phát lại\n- 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\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/980.txt",
    "content": "Mới\n• Thêm tùy chọn \"Thêm vào danh sách phát\" vào menu chia sẻ\n• Thêm hỗ trợ cho y2u.be và PeerTube short links\n\nCải tiến\n• Làm cho các điều khiển tốc độ phát lại nhỏ gọn hơn\n• Nguồn cấp dữ liệu hiện nay làm nổi bật các mục mới\n• 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\n\nSửa lỗi\n• Sửa lỗi trích xuất thích và không thích của YouTube\n• Sửa lỗi phát lại tự động sau khi quay lại từ nền\nVà nhiều hơn nữa\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/981.txt",
    "content": "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+.\nVô hiệu hóa truyền thông qua đường hầm trên Philips QM16XE để sửa lỗi phát lại.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/982.txt",
    "content": "Sửa lỗi YouTube không phát bất kỳ luồng nào.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/983.txt",
    "content": "Thêm giao diện người dùng và hành vi vuốt đúp để tìm kiếm mới\nLàm cho cài đặt có thể tìm kiếm được\nLàm nổi bật các bình luận đã ghim\nThêm hỗ trợ mở với ứng dụng cho phiên bản PeerTube của FSFE\nThêm thông báo lỗi\nSửa lỗi phát lại mục đầu tiên trong hàng đợi khi thay đổi trình phát\nChờ lâu hơn khi bộ nhớ đệm trong các phát trực tiếp trước khi thất bại\nSửa thứ tự kết quả tìm kiếm cục bộ\nSửa lỗi trường mục trống trong hàng đợi phát\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/984.txt",
    "content": "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\nSửa lỗi sập ứng dụng ngẫu nhiên khi cuộn qua danh sách\nLà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\nHoà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\nTăng compileSdk từ 30 lên 31\nCập nhật thư viện báo cáo lỗi\nCấu trúc lại một số mã trong trình phát\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/985.txt",
    "content": "Đã sửa lỗi YouTube không phát bất kỳ luồng nào\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/987.txt",
    "content": "Mới\n• 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\n• Thêm nút để thêm danh sách phát từ xa vào danh sách phát cục bộ\n• Xem trước hình ảnh trong bảng chia sẻ Android 10+\n\nCải thiện\n• Cải thiện hộp thoại thông số phát lại\n• Di chuyển các nút nhập / xuất đăng ký sang menu ba chấm\n\nCố định\n• Khắc phục sự cố xóa video đã xem đầy đủ khỏi danh sách phát\n• Sửa chủ đề thực đơn chia sẻ và mục \"thêm vào danh sách phát\"\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/988.txt",
    "content": "[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\n[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\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/989.txt",
    "content": "• [YouTube] Sửa lỗi tải vô hạn khi cố gắng phát bất kỳ video nào\n• [YouTube] Sửa lỗi điều tiết trên một số video\n• 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\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/990.txt",
    "content": "Hiện tại hỗ trợ phiên bản tối thiểu là Android 5 Lollipop!\n\nMới\n• Tải xuống từ menu nhấn và giữ\n• Ẩn các video trong tương lai trong nguồn cấp dữ liệu\n• Chia sẻ danh sách phát địa phương\n\nCải thiện\n• Tái cấu trúc mã trình phát..\n• Cải thiện chế độ chia tỷ lệ của hình thu nhỏ\n• Trình giữ chỗ hình ảnh theo kiểu vector hóa\n\nKhắc phục\n• 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\n• Sửa toàn màn hình bằng 1/4 màn hình\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/991.txt",
    "content": "Mới\n• Thêm nút \"Mở trong trình duyệt\" trong bảng lỗi\n• Thêm tùy chọn hiển thị nhóm kênh dạng danh sách\n• [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\n• Thêm nút xếp hàng phát vào trình phát mini\n\nCải thiện\n• Thêm bản địa hóa tiếng Iceland và cập nhật nhiều bản dịch khác\n• Nhiều cải tiến nội bộ\n\nSửa chữa\n• Khắc phục nhiều sự cố\n• [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\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/992.txt",
    "content": "Mới\n• Số người đăng ký trong chi tiết video\n• Tải xuống từ hàng đợi\n• Đặt hình thu nhỏ danh sách phát vĩnh viễn\n• Nhấn và giữ liên kết và thẻ bắt đầu bằng #\n• Chế độ xem thẻ\n\nCải tiến\n• Nút đóng trình phát mini lớn hơn\n• Thu nhỏ hình thu nhỏ mượt mà hơn\n• Nhắm mục tiêu Android 13 (API 33)\n• Tìm kiếm không còn tạm dừng trình phát\n\nĐã sửa\n• Sửa lớp phủ trên DeX/chuột\n• Cho phép trình phát nền không có luồng âm thanh riêng biệt\n• Các bản sửa lỗi khác nhau của YouTube và hơn thế nữa…\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/993.txt",
    "content": "Mới\n• 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\n• Cho phép bỏ qua các nút phần cứng\n• Cho phép ẩn video đã xem một phần trong nguồn cấp dữ liệu\n\nCải tiến\n• Sử dụng nhiều cột lưới hơn trên màn hình lớn\n• Làm cho các chỉ báo tiến độ nhất quán với cài đặt\n\nĐã sửa\n• 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\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\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/994.txt",
    "content": "Mới\n• Hỗ trợ nhiều bản âm thanh/ngôn ngữ\n• 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\n• Hỗ trợ hiển thị các tab chính ở cuối màn hình\n\nCải thiện\n• [Bandcamp] Xử lý các dấu vết đằng sau bức tường phí\n\nĐã sửa\n• [YouTube] Lỗi HTTP 403 cho luồng\n• 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\n• Rò rỉ bộ nhớ dịch vụ trình phát\n• [PeerTube] Hình đại diện của người tải lên và kênh con đã bị hoán đổi\n\nvà hơn thế nữa\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/995.txt",
    "content": "Mới\n• Hỗ trợ tab kênh\n• Chọn chất lượng hình ảnh\n• Nhận URL cho tất cả hình ảnh\n\nCải thiện\n• Khả năng truy cập của giao diện trình phát\n• 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\n• Cải tiến nội bộ và cập nhật phụ thuộc\n\nĐã sửa\n• Lựa chọn ngôn ngữ sai trong bộ chọn ngôn ngữ\n• Tiêu điểm âm thanh của trình phát không bị tắt tiếng\n• 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ể\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/996.txt",
    "content": "Đã sửa lỗi NullPointerException khi mở kênh/hội nghị trong media.ccc.de.\nGrinch đã 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ó.\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/997.txt",
    "content": "Mới\n • Thêm câu trả lời nhận xét\n • Cho phép sắp xếp lại danh sách phát\n • Hiển thị mô tả và thời lượng danh sách phát\n • Cho phép đặt lại cài đặt\n\n Cải thiện\n • [Android 13+] Khôi phục các tác vụ thông báo tùy chỉnh\n • Yêu cầu sự đồng ý để kiểm tra cập nhật\n • Cho phép phát/tạm dừng thông báo trong khi lưu vào bộ đệm\n • Sắp xếp lại một số cài đặt\n\n Đã sửa\n • [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\n • Giải quyết lỗ hổng trong cài đặt nhập và chuyển sang JSON\n • Nhiều bản sửa lỗi tải xuống khác nhau\n • Cắt bớt văn bản tìm kiếm\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/998.txt",
    "content": "Đã sửa lỗi YouTube không phát bất kỳ luồng nào\n"
  },
  {
    "path": "fastlane/metadata/android/vi/changelogs/999.txt",
    "content": "Đã sửa lỗi YouTube không phát bất kỳ luồng nào\n"
  },
  {
    "path": "fastlane/metadata/android/vi/full_description.txt",
    "content": "NewPipe không sử dụng bất kì thư viện nào của Google, hay API của YouTube. Nó chỉ đọc và phân tích trang web để lấy thông tin cần thiết. Vì thế, ứng dụng này có thể dùng được trên các thiết bị không có cài đặt Dịch vụ của Google. Bạn cũng không cần tài khoản YouTube để sử dụng NewPipe, và ứng dụng này là mã nguồn mở (FLOSS).\n"
  },
  {
    "path": "fastlane/metadata/android/vi/short_description.txt",
    "content": "Một giao diện người dùng YouTube nhẹ miễn phí dành cho Android.\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/1000.txt",
    "content": "改进\n• 使播放列表简介可点击以显示更多或更少的内容\n• [PeerTube] 自动接管 `subscribeto.me` 链接\n• 在历史记录页面中仅开始播放单一项目\n\n修复\n• 修复 RSS 按钮的可见度\n• 修复进度预览可能引起的崩溃\n• 修复播放列表中缺少缩略图的项目\n• 修复在下载弹窗出现之前退出的问题\n• 修复相关项目列表排序弹出\n• 修复新增至播放列表的菜单项顺序\n• 调整播放列表书签项目的布局\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/1001.txt",
    "content": "改进\n- 始终允许在 Android 13以上系统上更改播放器通知首选项\n\n修复\n- 修复了导出数据库/订阅时不会截断已存在的文件，从而可能导致导出损坏的问题\n- 修复了点击时间戳时，播放器从头开始恢复的问题\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/1002.txt",
    "content": "修复YouTube不播放任何串流的问题\n\n此版本只解决了阻止最紧迫的阻止 YouTube 视频详情加载的错误。\n我们知道有其他问题，会在不久后发布另一个版本解决它们。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/1003.txt",
    "content": "修复 YouTube 错误的热修复版本：\n• [YouTube]修复不加载任何视频的问题，修复播放视频时的 HTTP 403 错误， 恢复某些年龄受限视频的播放\n• 修复字幕尺寸未被更改的问题\n• 修复打开串流时下载两次信息的问题\n• [Soundcloud] 删除不可播放的受 DRM 保护的串流\n• 更新翻译\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/1004.txt",
    "content": "此版本修复 YouTube 只提供 360p 串流的问题。\n\n注意此版本部署的解决方案可能是临时性的，长期来看需要使用 SABR 视频协议，但 Newpipe 团队成员目前没空，我们十分感谢任何帮助！https://github.com/TeamNewPipe/NewPipe/issues/12248\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/1005.txt",
    "content": "新增\n• 新增对 Android Auto 的支持\n• 允许将信息流分组设置为主屏幕标签页\n• [YouTube] 以临时播放列表的形式分享\n• [SoundCloud] 新增“喜欢”频道标签页\n\n改进\n• 优化搜索栏提示\n• 在“下载”中显示下载日期\n• 使用 Android 13 的应用内语言\n修复\n• 修复深色模式下文本颜色显示错误\n• [YouTube] 修复播放列表加载超过 100 个项目时无法加载的问题\n• [YouTube] 修复推荐视频缺失的问题\n• 修复历史记录列表视图中的崩溃问题\n• 修复评论回复中的时间戳显示错误\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/1006.txt",
    "content": "# 改进\n单击时间戳时保持当前播放器\n尽可能恢复未完成的下载任务\n新增选项，允许删除下载项而不删除文件\n叠加层权限：在 Android R 及以上版本中显示说明对话框\n支持打开 on.soundcloud 链接\n大量小改进和优化\n\n# 修复\n修复 Android 7 以下版本短计数格式问题\n修复幽灵通知\n修复 SRT 字幕文件问题\n修复大量崩溃问题\n\n# 开发\n内部代码现代化\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/1007.txt",
    "content": "这个热修复版本修复了“内容不可用”错误：又能播放 YouTube 视频了！\n\n还修复了几个 0.28.1 版本引入的故障：\n• 播放列表项只拖动到相邻位置\n• 标题、评论在当前和上一个视频之间闪烁\n• “全屏模式启动主播放器”选项不工作\n\n其他改进：\n• [YouTube] 再次允许将直播倒退最多 4 小时\n• 后台播放时不加载直播视频\n• “删除已观看”的新用户界面\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/1008.txt",
    "content": "∙ 修复了在上次播放位置继续播放音视频流的问题\n∙ [YouTube] 支持更多频道 URL 格式\n∙ [YouTube] 支持更多视频元信息格式\n∙ 更新翻译\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/1009.txt",
    "content": "新增\nKeep Android Open 运动的重要信息及采取行动的请求：https://www.keepandroidopen.org/\n\n改进\n[Feed] 打乱过期订阅更新顺序\n不堆叠评论页\n单击视频详情页时不把单击事件传递到底层视图。\n\n修复\n评论回复标题布局没有头像图\n多个播放器相关 UI 修复\n[SoundCloud] 修福长 ID 音频流\n\n以及更多修复和改进！\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/63.txt",
    "content": "### 改进\n- 导入/导出设置 #1333\n- 减少透支(提高性能) #1371\n- 小小的代码完善 #1375\n- -添加了关于GDPR的一切 #1420\n\n### 已修复\n- 下载器: 修复了从.giga文件加载未完成下载时的崩溃 #1407\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/64.txt",
    "content": "### 完善\n- 增加了使用移动数据情形下限制视频分辨率的功能。#1339 \n- 记忆会话亮度 #1442\n- 改进较弱中央处理器的下载性能 #1431\n- 添加(工作)媒体会话支持 #1433\n\n### 修复\n- 修复了打开下载时的崩溃(补丁现在可用于发布版本) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/65.txt",
    "content": "改进\n禁用汉堡菜单动画\n撤销删除了的下载\n分享菜单新增下载选项\n长点菜单添加了分享选项\n退出时最小化主播放器\n库版本更新和数据库备份修复\n更新ExoPlayer 2.8.2\n重新设计播放速度控制框，支持不同的步长大小，以加快速度变化\n在播放速度控制增加沉默期间快进，对于有声读物和音乐类型有助，带来真正的无缝体验\n重构了媒体源解析，允许在播放器内部与媒体一起传递元数据，而不是手动传递。现在元数据源单一，且在播放开始时直接可用。\n修正了远程播放列表元数据在打开播放列表片段时有新元数据时不更新\nUI修复#1383，后台播放器通知控件现在总是白色，更易甩动关闭画中画播放器\n使用新提取器和重构架构支持多服务。\n修复\n修复异常视频信息布局 #1491\n修复历史记录#1497\n#1495，访问播放列表时更新元数据（缩略图，标题和数量）\n#1475, 当用户在外部播放器上启动一个视频时，在数据库中注册一个视图\n修正画中画模式下的超时#1463\n修复主视频播放器 #1509\n[#1412] 修正了重复模式导致播放器在后台活动时收到新意图时出现NPE\n修正了当未获得悬浮窗权限，切换画中画窗口破坏播放器\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/66.txt",
    "content": "v0.13.7\n修复排序异常\nv0.13.6\n##改进\n禁用汉堡菜单图标动画\n刚删除的下载文件可恢复\n添加分享菜单中的下载选项\n添加分享选项至长按菜单\n退出时最小化主播放器\n库版本更新和数据库备份修复\n更新 ExoPlayer 至 2.8.2\n重新设计播放速度控制对话框,可支持不同的步长加快速度\n播放速度控制中增加沉默期间快进开关,给某些有声读物和音乐类型带来真正的无缝体验\n重构媒体源解析,允许在播放器内部将元数据与媒体一起传递,而非手动进行,因此成为单一元数据来源,在开始播放时直接可用\n修正在打开播放列表碎片且新的元数据可用时远程播放列表元数据未更新\n各种UI修复:后台播放器通知控件现在为白色,更容易通过滑动关闭悬浮窗播放器\n使用新的提取器,重构了多服务架构 \n##修复\n修复异常视频信息页布局\n修复历史记录视图异常(更新元数据(缩略图,标题和数量)时恰访问播放列表;当从详情页从外部播放器上播放视频时,在数据库中注册一个视图)\n修复悬浮窗下视频超时\n修复主视频播放器(修正当播放器活动处于后台时收到新意图后重复模式导致NPE;修正当未获得悬浮窗权限,切换悬浮窗时播放器异常)\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/68.txt",
    "content": "# v0.14.1\n修复\n- 解析视频网址失败的问题 #1659\n- 描述链接不能提取#1657\n# v0.14.0\n新增\n- 新抽屉菜单#1461\n- 可定制的首页#1461\n改进\n- 手势控制#1604\n- 关闭画中画播放器方法 #1597\n修复\n- 修复偶尔订阅数不可用#1649\n- 修复YouTube播放列表为空时的NPE\n- 修复SoundCloud中的页面问题\n- 重构和修正错误 #1623\n  - 修正循环搜索结果#1562\n  - 修正进度条错误\n  - 修复YT Premium视频不能正确屏蔽\n  - 修复视频有时无法加载\n  - 修复视频描述中的链接\n  -下载到外部SD卡时显示警告\n  - 修复什么都不显示而触发报告\n  - Android 8.1后台播放器不显示缩略图\n- 修正广播接收器的注册#1641\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/69.txt",
    "content": "#新增\n订阅中长按删除和分享#1516\n平板布局支持#1617\n#改进\n- 存储并重新加载上次使用的长宽比 #1748\n- 在下载活动中使用完整的视频名称并启用线性布局#1771。\n- 直接从订阅标签中删除和共享订阅#1516。\n- 如果播放队列已经结束，加入队列现在会触发视频播放 #1783\n- 音量和亮度手势 #1644\n- 增加对本地化的支持#1792\n#修复\n- 修正格式的时间解析(使其在芬兰使用)\n- 修正订阅数\n- 为API 28+设备增加前台服务权限 #1830\n# 已知错误\n- 在Android P上无法保存播放状态。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/70.txt",
    "content": "注意 该版本存在未知bug\n\n#改进\n* 下载文件一键打开 #1879\n* 支持Android 4.1 - 4.3 #1884。\n* 移除旧播放器#1884\n* 从当前播放队列中移除视频，向右滑动它们 #1915\n* 当一个新的视频被手动排序，自动更正#1878\n* 下载改进#1759\n  * 后处理基础设施\n  * 适当的错误处理 \"基础设施\"\n  * 以队列代替多次下载\n  * 将序列化的待下载(`.giga`文件)移到应用程序数据中\n  * 最大下载重试次数支持\n  * 多线程下载暂停\n  * 当连接到移动网络时停止下载\n  * 保存线程数以便下次下载\n  * 修正了许多不一致的地方\n\n#修复\n* 修复默认分辨率设置为最佳和使用移动数据分辨率时的崩溃#1835。\n* 幸福画中画播放器崩溃#1874\n* 试图打开背景播放器时出现NPE #1901。\n* 修正在启用自动排队时插入新流的问题 #1878\n* 修正了decypering shuttown问题。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/71.txt",
    "content": "###改进\n*Github版本添加了应用更新通知 (#1608 由@krtkush )\n* 下载器的多处改进 (#1944 由 @kapodamy):\n *添加缺失的白色图标，并使用硬核方式改变图标的颜色\n *检查迭代器是否初始化 (修复 #2031)\n *允许重试新复用器中\"后处理失败\"错误的下载项\n *新的MPEF-4复用器修复不同步的视频和音频流 (#2039)\n\n###修复\n* YouTube直播短时间后就会停止播放 (#1996 由@yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/730.txt",
    "content": "#修复\n- 再次热修复解密功能错误。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/740.txt",
    "content": "改进\n•使评论中的链接可以点击，增加字号\n•在点击评论中的时间戳链接时寻址视频\n•根据最近选择的状态显示首选标签\n•在播放列表窗口中长按\"背景播放\"时，将播放列表添加到队列中。\n•搜索非URL的共享文本\n•在主视频播放器中增加\"分享当前时间\"按钮。\n•当播放列表结束时，在主播放器中添加关闭按钮。\n•在视频列表项目的长按菜单中增加\"直接在后台播放\"。\n•改进播放/加入队列的英文翻译\n•小幅提高性能\n•删除未使用的文件\n•更新ExoPlayer至2.9.6\n•增加对Invidious链接的支持\n修复\n•修复 滚动，禁用评论和相关视频异常\n•修正 CheckForNewAppVersionTask在不该执行的时候被执行的问题#39。\n•修正 youtube订阅导入：忽略无效url的，保留空标题的。\n•修复 无效的YouTube网址：签名标签名并非总是\"签名\"了的，导致流媒体无法加载\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/750.txt",
    "content": "新增\n恢复播放#2288\n• 恢复上次关闭视频\n增强下载器#2149\n• 使用存储访问框架在外部 SD 卡上存储下载\n• 新的 mp4 复用器\n• 在开始下载之前，可选择更改下载目录\n• 提示用流量时下载\n\n改进\n• 已移除gema字符串#2295\n• 在Activity生命周期内自动旋转#2444\n• 常量化长按菜单#2368\n\n修复\n• 修复未显示的选定字幕#2394\n• 检查（GitHub ）应用更新失败时，修复崩溃#2423\n• 修复下载进度停留在 99.9% #2440\n• 更新播放队列元数据#2453\n• [SoundCloud] 修复了加载播放列表时崩溃 Extractor#170\n• [YouTube] 修复持续时间无法缩短 Extractor #177\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/760.txt",
    "content": "v0.17.1\n新增泰语翻译\n改进\n- 在播放列表的长按菜单中增加“于此处播放 ”\n- 为SAF/遗留文件拾取器添加开关\n修复\n- 修正切换应用时下载视图中按钮消失\n\n- 历史记录被禁用时但回放位置被存储\n- 修正列表视图中播放位置导致的性能降低 \n- [Extractor]修复ReCaptcha。\n- [Extractor] [YouTube]播放列表出现在结果中时，随机搜索\n\nv0.17.0\n新增\n恢复播放#2288\n- 从上次恢复播放\n改进下载器\n- 使用存储访问框架在外部SD卡上存储下载。\n- 新的mp4混合器\n- 开始下载前，支持更改下载目录。\n- 流量播放警告\n改进\n- 删除了Gema字符串\n- 在活动生命周期中处理（自动）旋转变化\n- 使长按菜单保持一致\n修复\n- 字幕名称不显示\n- 检查应用程序更新失败崩溃\n- 下载卡在99.9%\n- 更新播放队列元数据\n- [SoundCloud] 修正了加载播放列表时的崩溃\n- [YouTube] 无法解析时长\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/770.txt",
    "content": "0.17.2 更改\n\n修复\n•修复没有视频可用\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/780.txt",
    "content": "改进\n• 添加了清除播放状态的选项#2550\n• 在文件选取器中显示隐藏文件#2591\n• 支持使用 NewPipe 应用程序打开的\"invidio.us\"#2488\n• 添加对\"music.youtube.com URL 的支持Extractor#194 \n\n修复\n[Youtube] 修复了 'java.lang.IllegalArgumentException'#192\n[ YouTube] 修复了直播Extractor#195\n• 修复  Android P中下载性能#2592\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/790.txt",
    "content": "改进\n- 改善视觉障碍人士无障碍环境，增加更多标题#2655\n- 一致化下载文件夹设置的言辞，减少歧义 #2637\n\n修复\n- 检查 块中的最后一个字节是否被下载 #2646\n- 修正 视频详情碎片(fragment)的滚动异常 #2672\n- 将搜索清除框动画删减为一个#2695。\n- [SoundCloud]修复 client_ID 解析#2745。\n\n开发\n- NewPipeExtractor的缺失依赖添加到NewPipe #2535中。\n- 迁移到AndroidX #2685\n- 更新至 ExoPlayer 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/800.txt",
    "content": "新增\n•允许不支持P2P的PeerTube(＃2201)：\n观看和下载PeerTube视频\n在设置中添加实例服务器以访问所有PeerTube(在访问某些服务器时,Android4.4/7.1上的SSL握手可能有问题)\n•下载器(#2679)：\n计算下载ETA\n以ogg下载opus(webm文件)\n长时间暂停后,恢复过期链接\n改进\n使用本地化Kiosk,改善所有主页标签的性能#2742\n使用extractor#2713中的新本地化和下载器实现\n翻译“默认kiosk”字符串\n为暗黑主题适配导航栏#2569\n修复\n修复悬浮窗播放器按下另一根手指后无法移动#2772\n允许播放列表缺少上传者,并修复相关崩溃#2724,Extractor#219 \n在Android4.4上启用TLS1.1/1.2,与MediaCCC和某些PeerTube服务器连接时,修复TLS握手#2792\n[SoundCloud]修复了client_id提取Extractor#217与音频流提取\n开发\n更新ExoPlayer为2.10.8 #2791,#2816\n更新Gradle到3.5.1,添加Kotlin支持#2714\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/810.txt",
    "content": "新增\n• 后台播放时，在锁屏界面上显示视频缩略图\n\n改进\n• 长按背景播放/悬浮窗播放按钮时，将本地播放列表加入到队列中\n• 允许主页选项卡(tab)滚动，并在只存在单个选项卡时隐藏选项卡(tab)条\n• 限制后台播放时缩略图通知更新的频率\n• 为空白本地播放列表添加虚拟缩略图\n•不再使用*.webm扩展名而使用 *.opus 文件扩展名，并将其从下拉列表移动到格式标签\n• 添加\"下载\"中清除下载历史记录的按钮\n• [YouTube] 添加对 /c/shortened_url链接的支持\n\n修复\n• 修复 将视频共享到 NewPipe 并直接下载视频时中的多个问题\n• 修复 播放器无法访问其创建线程\n• 修复 搜索结果分页\n•[Youtube] 修复了在 null 上切换导致 Npe\n•[ YouTube] 在打开一个网址invidio.us时打开用户评论\n• [soundcloud] 更新client_id\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/820.txt",
    "content": "修正了导致YouTube不可用的解密函数名正则表达式。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/830.txt",
    "content": "更新了SoundCloud client_id以修复SoundCloud问题。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/840.txt",
    "content": "新增功能\n\n• 新增 允许更改Newpipe应用语言\n• 新增 “发送到kodi”按钮(于播放器可\n折叠菜单)\n• 新增 长按复制评论\n\n改进\n• 修复 reCaptcha Activity并正确存储得到的 Cookie\n• 隐藏 当在设置中未启用观看历史记录时，隐藏三点菜单中的历史记录按钮\n• 改进 在 Android 6 以上设备，请求“显示其他应用上层”的权限时正确启动对应设置页面\n• 改进 允许在收藏栏中长按重命名播放列表\n• 改进 各种 PeerTube 改进\n• 改进 英语源字符串\n\n修复\n• 修复 已暂停的视频莫名继续，即使开启\"App切换时最小化\"选项且 NewPipe 已最小化\n• 修复 手势控制的初始亮度\n• 修复 下载的.srt格式字幕不包含所有换行符\n• 修复 下载至(外置)SD卡失败(某些 Android 5 设备不符合 CTF 标准)\n• 修复 Android 4.4设备上，下载出错\n• 修复 损坏的.mp4文件被识别为音频文件\n• 改进 各语言翻译错误，包括中文语言代码错误\n• 修复 YouTube视频简介中的时间戳可再次点击\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/850.txt",
    "content": "新 YouTube 网站版本已更新。旧网站版本将在 3 月停止支持，因此您需要升级 NewPipe。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/860.txt",
    "content": "改进\n• 保存和恢复音调和是否脱钩\n• 支持播放器中的显示cutout\n• 圆形视图和订阅者数量显示\n• 优化 YouTube 以使用更少的数据\n\n此版本中修复了超过 15 个与 YouTube 相关错误。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/870.txt",
    "content": "这是一个热补丁更新， 允许使用 SoundCloud并没有任何问题。\n解析器已使用SoundCloud 的 v2 API ，并改进了无效客户端 ID 的检测机制。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/900.txt",
    "content": "新特性\n• 订阅分组和排序\n• 添加 播放器静音按钮\n\n改进\n• 允许在 NewPipe 中打开 music.youtube.com 和 media.ccc.de 链接\n• 将两个设置项目从「外观」页移动到「内容」页\n• 如果启用不精确寻址，则隐藏 5、15、25 秒寻址选项\n\n修复\n• 无法获取某些 WebM 视频\n• Android P 上的数据库备份问题\n• 分享下载文件时崩溃\n• 大量 YouTube 解析问题以及更多…\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/910.txt",
    "content": "修复了一个数据库迁移问题，在罕见情况下，该问题会阻碍 NewPipe 的启动。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/920.txt",
    "content": "改进:\n\n• 添加在网格布局中视频上传日期与播放量的显示\n• 改进应用抽屉头部布局\n\n修复\n\n• 修复 在API19(Android 4.4.2)静音键导致崩溃\n• 修复 下载超长1080p 60fps视频下载\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/930.txt",
    "content": "新特性\n• 在YouTube Music搜索\n• 基本 Android TV 支持\n\n改进\n• 添加 在本地播放列表中清除所有已观看的视频选项\n• 显示 内容无法播放的信息而不是直接崩溃\n• 改进 缩放手势调整画中画播放器尺寸\n• 长按频道背景和弹出按钮音视频流排队\n• 改进 抽屉页眉标题的大小处理\n\n修复\n• 修复 年龄限制内容设置失效\n• 修复 某些reCAPTCHA验证码失效\n• 修复 若播放列表为null时打开「书签」崩溃\n• 修复 网络相关异常的检测\n• 修复 订阅片段中的组排序按钮的可见性\n\n以及更多\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/940.txt",
    "content": "新特性\n• 添加对SoundCloud评论的显示支持\n• 添加 YouTube 限制模式设置项目\n• 显示 PeerTube parent channel 详情\n\n改进\n• 只对受支持服务显示Kore 按钮\n• 拦截从导航栏或状态栏开始的播放器手势\n• 基于服务的颜色更改重试和订阅按钮的背景颜色\n\n修复\n• 修复 下载对话框卡死\n• 修复「在浏览器中打开」(Open in browser )键失效\n• 修复 打开视频时崩溃 以及 \"无法播放该视频\"问题\n\n以及更多\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/950.txt",
    "content": "改版修复以下错误:\n• 修正 Android 10+ 的储存访问问题\n• 修复 打开kiosk出错\n• 修复 对长视频的进度暂停出错\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/951.txt",
    "content": "新特性\n• 添加 在提要组对话框中搜索订阅选择器\n• 添加 筛选到提要组对话框，只显示未分组的订阅\n• 添加 播放列表标签于主页\n• 添加 快进/回退功能于后台/画中画播放队列\n• 添加 显示搜索建议: 「你是不是在找」(did you mean) 和 「显示...的结果」 (showing result for)\n\n改进\n•不再在混流传输文件中写入应用元数据\n•不再从播放队列中移除失效的视频流(failed streams)\n•更新状态栏颜色以匹配工具栏颜色\n\n修复\n• 修复 浮点数错误导致的音像不同步\n• [PeerTube] 处理已删除的评论\n\n还有更多\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/952.txt",
    "content": "改进\n• 所有视频源的自动播放现在皆可用(不是仅有YouTube)\n\n修复\n• 支持新版YouTube网页以修复「相关视频」出错的问题\n• 修复YouTube年龄限制内容视频\n• [Android TV] 修复线性焦点的高亮布局[highlight overlay]\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/953.txt",
    "content": "修复YouTube解密功能提取\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/954.txt",
    "content": "• 新应用工作流: 在详情页播放视频，下滑最小化播放器\n• MediaStyle通知: 可定制的通知操作，性能改进\n• NewPipe作为桌面应用程序使用时基本的大小调整\n\n• 在不受支持的URL 消息框概览情形下，显示带\"打开\"选项的对话框\n• 若设备无法获取远程搜索建议时，改善本地搜索建议体验\n• 提升默认视频分辨率:720p60 (内建播放器) 和480p (画中画播放器)\n\n• 大量bug修复\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/955.txt",
    "content": "[YouTube] 修复了一些用户遇到的搜索问题\n[YouTube] 修复随机出现的解密错误\n[SoundCloud] 以斜杠结尾的url现在可以正确解析了\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/956.txt",
    "content": "[YouTube]修复加载任意视频时崩溃\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/957.txt",
    "content": "• 将特定列表操作统一为一个\n• 手势(合指)关闭播放器\n• 允许清除 Cookie\n• 允许不着色通知\n• 改进视频详细信息的打开方式，以修复共享 NewPipe 时的无限缓冲、错误行为和其他不一致\n• 加快 YouTube 视频解析并修复年龄受限的视频\n• 修复快进/倒带的崩溃\n• 不再允许拖动缩略图来重新排列列表\n• 总是记住悬浮窗属性\n• 添加桑塔利语翻译\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/958.txt",
    "content": "改进与新增：\n• 重新添加 在锁屏界面上隐藏缩略图的选项\n• 新增 下拉刷新\n• 提高 获取本地列表时性能\n\n修复：\n• 修复 杀死 NewPipe 后再启动 NewPipe 时的崩溃\n• 修复 无网络连接时启动崩溃，\n• 修复 亮度和音量手势设置问题\n• 修复 [YouTube] 过长播放列表崩溃\n\n其他：\n• 清理重构代码\n• 更新依赖\n• 更新翻译\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/959.txt",
    "content": "修复 打开错误反馈后无限崩溃。\n更新 能被 NewPipe 自动打开的Peertube服务器列表。\n更新 各语言翻译。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/960.txt",
    "content": "• 改进 设置中导出数据库的说明\n• 修复 YouTube 评论解析\n• 修复 media.ccc.de的名称显示。\n• 更新 各语言翻译。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/961.txt",
    "content": "- [YouTube] Mix支持\n- [YouTube]显示关于公共广播和Covid-19的信息\n- [media.cc.de] 添加了「最近的视频」。\n- 新增 索马里语翻译\n\n- 大量内部改进\n\n- 修正 在播放器内分享视频时出错\n- 修正 ReCaptcha网页视图一片空白\n- 修正 在列表中删除视频时崩溃\n- [PeerTube]修复 相关视频播放\n- [YouTube] 修正 YouTube音乐搜索\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/962.txt",
    "content": "添加 media.ccc.de服务的“最近上传”视频支持\n添加 media.ccc.de服务的直播支持\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/963.txt",
    "content": "• [YouTube] 修复频道连续\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/964.txt",
    "content": "•增加 播放器控件中的章节(chapter)支持\n•[PeerTube]添加 Sepia搜索\n•恢复 视频详情中的共享按钮，并将视频描述移至选项卡布局中\n•若禁用了亮度手势，则禁用亮度恢复功能\n•添加 在kodi上播放视频的列表选项\n•修复 在某些设备上未设置默认浏览器并改善共享对话框时崩溃的问题\n•在全屏播放器中支持使用“硬件(如部分键盘/耳机)”按钮播放/暂停\n•[media.ccc.de]各种修复和改进\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/965.txt",
    "content": "修复了对频道组重新排序时发生的崩溃。\n修复了从频道和播放列表中获取更多YouTube视频的问题。\n修复了获取YouTube评论的问题。\n在YouTube网址中添加了对/ watch /、/ v /和/ w /子路径的支持。\n修复了提取SoundCloud客户端ID和受地理位置限制的内容的问题。\n添加了北库尔德语的本地化。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/966.txt",
    "content": "新增\n- 添加Bandcamp支持\n\n改进\n- 支持应用程序主题跟随设备系统主题\n- 改进的错误面板信息来防止崩溃。\n- 显示更多内容不可用的原因信息\n- 支持通过硬件空格进行播放/暂停\n- 显示 \"下载开始 \" Toast\n\n修复\n- 修正在后台播放时视频详情的缩略图非常小\n- 修正最小化播放器中的空白标题\n- 修复调整大小后不能正确恢复\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/967.txt",
    "content": "修正了YouTube在欧盟国家无法正常使用的问题;\n由于新的cookie和隐私系统, 需要NewPipe同意并保存一个cookie\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/968.txt",
    "content": "添加 长按菜单中增加频道详细信息选项\n添加 播放列表界面中重命名播放列表名称\n改进 允许用户在视频缓冲时暂停\n改进 \"抛光\"白色主题\n修复 使用较大字体时字体相互重叠\n修复 Formuler和Zephier设备上没有视频的问题\n修复 各种崩溃\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/969.txt",
    "content": "- 新增 允许安装至外部存储\n- 变更 仅在下载开始时显示 \"下载已开始 \"的 Toast 提示\n- 变更 当未存储 Cookie 时不存储 reCaptcha Cookie\n- 变更 删除下载文件后撤销先前的 Snackbar 提示\n- 修复 删除不在列表中的条目引起的异常\n- [播放器] 改进 缓存性能\n- [播放器] 修复 播放器未能如期自动续播\n- [Bandcamp] 新增 支持显示某音频前三个评论\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/970.txt",
    "content": "新增\n• 在音视频简介下方显示元数据 (标签、类别、发行许可证...)\n• 在远程(非本地)播放列表中添加\"显示频道详情\"选项\n• 在长按菜单中添加\"在浏览器中打开\"选项\n修复\n• 修复 视频详情页面旋转屏幕时崩溃\n• 修复 在播放器内\"使用Kodi播放\"按钮总是提示安装Kore\n• 修复和改进了设置导出导入路径\n• [YouTube]修复 评论点赞计数\n• 以及修复其他细小问题\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/971.txt",
    "content": "热修复\n• 重新缓冲后增加播放缓冲\n• 修复 平板电脑和电视上点击播放器中的播放队列图标时崩溃\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/972.txt",
    "content": "新增\n在简介文本中识别时间戳和井号标签\n增加手动开启平板模式的设置选项\n允许在订阅源中隐藏已播放项目\n\n改进\n正确支持存储访问框架 (SAF)\n改进不可用和已删号的频道的错误处理\n对于Android 10+用户的分享页面现在支持显示内容标题\n更新 Invidious 实例 (instances) 并支持 Piped 链接\n\n修复\n[YouTube]年龄限制内容\n打开选择对话框时防止窗口内存泄露异常\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/973.txt",
    "content": "热更新\n• 修复 缩略图和标题在网格布局中被\"修剪\"(由于单行容纳视频个数的计算错误)\n• 修复 从分享菜单打开下载对话框凭空消失\n• 更新 与打开外部活动（例如存储访问框架文件选择器）相关的库\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/974.txt",
    "content": "热修复\n- 修复 由YouTube节流引起的视频缓冲问题\n- 修复 YouTube评论提取和禁用评论而导致崩溃\n- 修复 YouTube 音乐搜索\n- 修复 PeerTube 直播\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/975.txt",
    "content": "新增\n• 在拖动进度条时显示缩略图预览\n• 检测评论被禁用\n• 允许标记订阅项为已观看\n• 显示评论点赞数\n改进\n• 改进元数据和标签布局\n• 将网站颜色应用于UI组件\n修复\n• 在迷你播放器中修复缩略图错误\n• 重复的队列项目上的无限缓冲\n• 播放器修复, 如旋转和快速关闭\n• ReCAPTCHA 在后台的重新加载\n• 在刷新时禁止单击\n• 下载器崩溃\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/976.txt",
    "content": "- 增加了直接打开全屏播放器的选项\n- 允许选择显示哪些类型的搜索建议\n- 加深深色主题，增加了深色启动屏幕\n- 改进了文件选择器，使无关文件变成灰色\n- 修复YouTube订阅导入\n- 重放一个视媒体需要再次点击重放按钮\n- 修复关闭音频会话\n- [Android TV] 修正了使用DPad时长寻址栏的跳动。\n\n进一步了解全部变化，请从下列链接查看更新日志（与博客文章）。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/977.txt",
    "content": "- 在长按菜单中增加\"播放下一个\"按钮\n- 增加了 YouTube 短网址前缀的 Intent 过滤器\n- 修复设置导入\n- 在播放队列中调换播放器按钮和进度条位置\n- 修复与 MediaSessionManager 相关的各种问题\n- 修复视频结束后进度条未走完\n- 在 RealtekATV 上禁用媒体隧道功能\n- 增大了迷你播放器按钮的可点击区域\n\n查看更多变化，请从下面的链接查看更新日志（和博客文章）\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/978.txt",
    "content": "修复 NewPipe 检查新版本的问题。该检查有时执行得过早，因此导致应用崩溃。此问题现在应该已经修复。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/979.txt",
    "content": "- 修复 恢复播放\n- 改进 确保Newpipe是否应检查新版本的检查的服务不在后台启动\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/980.txt",
    "content": "新增\n- 增加 在共享菜单中新增 \"添加到播放列表 \"选项\n- 增加 对y2u.be和PeerTube短链接的支持\n\n改进\n- 播放速度控制更加紧凑\n- Feed突出显示新项目\n- 保存feed中的 \"显示观看过的项目 \"选项\n\n修复\n- 修复 YouTube 顶与踩 计数 的解析\n- 修复 从后台返回后的自动重放\n以及更多\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/981.txt",
    "content": "移除了对MediaParser的支持，以解决在Android 11+上缓冲后恢复播放失败的问题。\n在Philips QM16XE上禁用了媒体隧道，以解决播放问题。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/982.txt",
    "content": "修复YouTube无法播放任何视频\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/983.txt",
    "content": "新增 新的双击视频寻址UI和行为\n新增 支持设置项目被搜索\n新增 突出显示置顶评论\n新增 为FSFE的PeerTube实例添加开放应用支持\n新增 错误报告通知\n修复 播放器变化后，重新播放播放队列中第一个项目\n改进 缓冲直播时，在失败前等待更长的时间\n修复 本地搜索结果的顺序异常\n修复 播放队列中的空白项目\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/984.txt",
    "content": "在列表中加载足够多的初始项目以填满整个屏幕，以修复平板电脑和电视上的滚动问题\n修复滚动列表时随机崩溃问\n让播放器的快速寻址线位于系统UI之下\n恢复在多窗口播放时对切口的改变，在某些手机上造成播放器错位\n将compileSdk从30提升到31\n更新错误报告库\n重构部分播放器代码\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/985.txt",
    "content": "修复YouTube无法播放任何视频\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/986.txt",
    "content": "新增\n• 新串流的通知\n• 后台播放和(前台)d播放器之间的无缝过渡\n• 通过半音改变音高\n• 将主播放器队列追加至一播放列表\n\n改进\n• 记住速度/音调步长\n• 减少视频播放器中初始时间缓冲\n• 改进 Android TV 的播放器界面\n• 在删除所有下载的文件之前进去确认\n\n修复\n• 使用物理媒体按钮(如耳机按键等)不会隐藏播放器控件\n• 播放器类型更改时重置播放\n• 旋转播放列表对话框的异常\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/987.txt",
    "content": "新增\n• 支持渐进式HTTP以外的传输方法——实现播放更快加载，并修复PeerTube和SoundCloud，播放最近结束的YouTube直播\n• 添加按钮，可将远程播放列表添加到本地播放列表\n• 对于安卓10 +以上用户，支持共享表格中的图像预览\n\n改进\n• 改进播放参数对话框\n• 将订阅导入/导出按钮移至三点菜单\n\n修复\n• 修复 从播放列表中删除已完全观看的视频的问题\n• 修复 共享菜单主题， 以及“添加到播放列表”条目\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/988.txt",
    "content": "[YouTube] 修复 试图播放任何视频时，显示\"无法获得任何流 \"\n[YouTube] 修复 显示\"以下内容在此应用中不可用 \"，而不是所需要的视频\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/989.txt",
    "content": "- [YouTube] 修复 尝试播放任何视频时无限加载\n- [YouTube] 修复 某些视频的节流问题\n- 将jsoup库升级到1.15.3，其中包括一个安全修复\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/990.txt",
    "content": "此版本移除了对 Android 4.4 KitKat 的支持，现在支持的最低版本是 Android 5 Lollipop！\n\n新增\n• 在长按菜单中进行下载\n• 隐藏 Feed 中的未来视频\n• 分享本地播放列表\n\n改进\n• 重构播放器代码成多个小组件：使用的内存更少了，BUG 更少了\n• 改进了缩略图的缩放方式\n• 矢量化了占位图片\n\n修复\n• 修复播放器通知相关的几个问题：媒体信息过期或缺失，缩略图扭曲变形\n• 修复全屏模式仅使用了 1/4 屏幕\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/991.txt",
    "content": "新增\n• 在错误面板中添加“在浏览器中打开”按钮\n• 新增以列表形式显示频道组的选项\n• [YouTube] 长按视频片段即可分享时间戳 URL\n• 在迷你播放器中添加播放队列按钮\n\n改进\n• 新增冰岛语本地化并更新了其他多种语言的翻译\n• 多项内部改进\n\n修复\n• 修复多个崩溃问题\n• [YouTube] 修复部分国家/地区频道加载、非专用源播放以及播放问题\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/992.txt",
    "content": "新增\n• 视频详情页显示订阅者数量\n• 从播放队列下载\n• 永久设置播放列表缩略图\n• 长按话题标签和链接\n• 卡片视图模式\n\n改进\n• 更大的迷你播放器关闭按钮\n• 更流畅的缩略图缩放\n• 目标平台：Android 13 (API 33)\n• 快进/快退操作不再导致播放器暂停\n\n修复\n• 修复 DeX/鼠标上的叠加层问题\n• 允许后台播放，无需单独的音频流\n• 其他 YouTube 相关问题修复及更多…\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/993.txt",
    "content": "新增\n• 添加重复播放列表时发出警告，并添加删除按钮\n• 允许忽略硬件按钮\n• 允许在信息流中隐藏已观看但未完成的视频\n\n改进\n• 在大屏幕上使用更多网格列\n• 使进度指示器与设置保持一致\n\n修复\n• 修复在 Android 11 及更高版本上打开浏览器 URL、下载和外部播放器的问题\n• 修复在 MIUI 系统上全屏交互需要点击两次的问题\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/994.txt",
    "content": "新增\n• 支持多音轨/多语言\n• 允许在屏幕任意一侧使用手势调节音量和亮度\n• 支持在屏幕底部显示主标签页\n\n改进\n• [Bandcamp] 处理付费墙后的曲目\n\n修复\n• [YouTube] 修复流媒体播放的 403 HTTP 错误\n• 修复从播放列表视图切换到主播放器时播放器黑屏的问题\n• 修复播放器服务内存泄漏问题\n• [PeerTube] 上传者和子频道头像互换的问题\n\n以及更多\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/995.txt",
    "content": "新增\n• 支持频道标签页\n• 可选择图像质量\n• 获取所有图像的 URL\n\n改进\n• 播放器界面更易于访问\n• 改进仅下载视频时的音频选择\n• 可选择在共享播放列表内容中包含播放列表和视频名称\n\n修复\n• [YouTube] 修复获取点赞数的问题\n• 修复播放器无响应的弹出窗口和崩溃问题\n• 修复语言选择器中选择错误语言的问题\n• 修复播放器音频焦点未响应静音设置的问题\n• 修复播放列表项目添加功能偶尔失效的问题\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/996.txt",
    "content": "修复了在 media.ccc.de 中打开频道/会议时出现的 NullPointerException 异常。\n圣诞怪杰试图破坏我们送给大家的圣诞礼物，但我们已经解决了这个问题。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/997.txt",
    "content": "新增\n• 添加评论回复\n• 允许重新排序播放列表\n• 显示播放列表描述和时长\n• 允许重置设置\n\n改进\n• [Android 13+] 恢复自定义通知操作\n• 请求更新检查的同意\n• 允许在缓冲期间播放/暂停通知\n• 重新排序部分设置\n\n修复\n• [YouTube] 修复评论无法加载的问题，以及其他修复和改进\n• 修复设置导入中的漏洞并切换到 JSON 格式\n• 修复各种下载问题\n• 精简搜索文本\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/998.txt",
    "content": "修复 YouTube 因 HTTP 403 错误不播放任何串流的问题\n\n还没修复 YouTube 视频中间偶尔的 403 错误.\n该问题会尽快在另一个热修复版本中得以解决。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/changelogs/999.txt",
    "content": "此热修复版本修复 YouTube 视频播放中的 HTTP 403 错误。\n\n新功能\n• [SoundCloud] 支持 on.soundcloud.com URLs\n\n改进\n• [Bandcamp] 在电台 kiosk 中显示附加信息\n\n修复\n• [YouTube] 视频开头或当中偶然的 403 错误\n• [YouTube] 从更多频道标头类型提取头像和横幅\n• [Bandcamp] 多个故障和始终使用 HTTPS\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/full_description.txt",
    "content": "NewPipe 不使用任何 Google 框架库组件，也不使用 YouTube API。NewPipe 仅仅通过解析 YouTube 网页版来获取所需信息。因此，可在没有安装 Google 服务的设备上使用 NewPipe。此外，使用 NewPipe 并不需要 YouTube 账号，NewPipe 是自由开源软件（FLOSS）。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hans/short_description.txt",
    "content": "一个轻量级的自由 Android YouTube 前端。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/1000.txt",
    "content": "改善\n• 讓播放清單描述可點擊以顯示更多或更少的內容\n• [PeerTube] 自動處理 `subscribeto.me` 站台連結\n• 在歷史畫面中只開始播放單一項目\n\n修正\n• 修正 RSS 按鈕的能鍵度\n• 修正進度列預覽當機的問題\n• 修正播放清單中沒有縮圖的項目\n• 修正在下載對話框出現前退出的問題\n• 修正相關項目清單排序彈出\n• 修正新增至播放清單對話框的順序\n• 調整播放清單書籤項目的佈局\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/1001.txt",
    "content": "改進\n• 一直允許在Android 13以上的裝置更改通知欄播放器\n\n修正\n• 修復匯出資料庫/訂閱不會截斷已存在的文件，可能導致匯出損壞的問題\n• 修正點擊時間戳記時播放器從頭開始撥放的問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/1002.txt",
    "content": "修正 YouTube 無法播放任何串流\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/1003.txt",
    "content": "修正 YouTube 無法播放任何串流\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/1004.txt",
    "content": "修正 YouTube 無法播放任何串流\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/1007.txt",
    "content": "修正 YouTube 無法播放任何串流\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/63.txt",
    "content": "### 改善\n- 匯入/匯出設定 #1333 \n- 減少覆繪 (效能改善) #1371 \n- 代碼稍作改善 #1375 \n- 新增種種 GDPR 相關事宜 #1420\n\n### 修正\n- 下載器：修正從 .giga 檔案載入未完成的下載時崩 #1407\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/64.txt",
    "content": "### 改善\n- 新增使用流動數據時限制視訊品質的功能。 #1339 \n- 記住工作階段中的亮度 #1442 \n- 改善較低規格 CPU 的下載效能 #1431 \n- 新增媒體工作階段的 (作用) 支援 #1433\n\n### 修正\n- 修正開啟下載時崩潰 (修正現可用於發行組建) #1441\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/65.txt",
    "content": "###改進\n\n- 停用 burgermenu 圖示動畫 #1486 \n- 撤銷刪除下載 #1472 \n- 分享選單中的下載選項 #1498\n- 在長點選單中加入分享選項 #1454 \n- 退出時最小化主播放器 #1354 \n- 程式庫版本更新和資料庫備份修正 #1510 \n- ExoPlayer 2.8.2 更新 #1392\n  - 重新設計播放速度控制對話框，支援不同步驟大小以加快速度變化。\n  - 在播放速度控制中新增靜音時快轉的切換。這應該對有聲讀物和某些音樂類型很有幫助，並能帶來真正的無縫體驗 (而且可以打破有大量靜音的歌曲 =\\)。 \n  - 重構媒體來源解析，允許在播放器內部傳輸媒體旁的 metadata，而非手動傳輸。現在我們有單一的 metadata 來源，並可在播放開始時直接使用。\n  - 開啟播放清單片段時，當有新的 metadata 時，遠端播放清單 metadata 不會更新。\n  - 各種使用者介面修正： #1383、背景播放器通知控制現在總是白色、透過甩動更容易關閉彈出播放器\n- 針對多服務使用重構架構的新萃取器\n\n###修正\n\n- 修正 #1440 破碎的視訊資訊佈局 #1491 \n- 檢視歷史修正 #1497\n  - #1495，通過在用戶訪問播放列表時更新元資料（縮圖、標題和視頻數量）。\n  - 1475, 當使用者在詳細片段的外部播放器上啟動影片時，在資料庫中註冊檢視。\n- 修正彈出模式下的超時問題。#1463 (已修復 #640)\n- 主視訊播放器修正 #1509 \n  - [#1412] 修正當播放器活動在背景時，收到新的意圖時，重複模式會導致播放器 NPE。\n  - 修正當未授予彈出權限時，將播放器最小化為彈出視窗不會銷毀播放器。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/71.txt",
    "content": "### 改善\n* 為 GitHub 組建新增應用程式更新通知 (#1608 鳴謝 @krtkush)\n* 下載器有多項改善 (#1944 鳴謝 @kapodamy):\n  * 新增缺少的白色圖示並以硬性方式更改圖示顏色\n  * 檢查迭代器是否已初始化 (修正 #2031)\n  * 允許在新混合器重試「後期處理失敗」的下載\n  * 新的 MPEG-4 混合器修正非同步的視訊和音訊串流 (#2039)\n\n### 修正\n* YouTube 直播串流沒多久就停止播放 (#1996 鳴謝 @yausername)\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/730.txt",
    "content": "# 修正\n- 再次修補解密函式錯誤。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/750.txt",
    "content": "新增\n恢復播放 #2288\n• 在上次停止的地方恢復串流\n下載器提升 #2149 \n• 使用儲存裝置存取框架以儲存下載到外置 SD 卡\n• 新增 mp4 混合器\n• 可選擇在開啟下載前更改下載目錄\n• 顧及考慮計量網路 \n\n\n改善\n• 移除 gema 字串 #2295\n• 在活動週期中處理 (自動)旋轉變更 #2444\n• 長按功能表一致化 #2368\n\n修正\n• 修正選取的字幕軌名稱未有顯示 #2394\n• 檢查應用程式更新失敗時不要崩潰 (GitHub 版本) #2423 \n• 修正下載停滯於 99.9% #2440\n• 更新播放佇列中繼資料 #2453 \n• [SoundCloud] 修正載入播放清單時崩潰 TeamNewPipe/NewPipeExtractor#170\n• [YouTube] 修正持續時間無法剖析 TeamNewPipe/NewPipeExtractor#177\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/760.txt",
    "content": "0.17.1 中的變更\n\n新增\n• 泰文本地化\n\n改善\n• 再次在長按選單中新增「從此開始播放」的動作 #2518\n• 新增 SAF／舊式檔案挑選器的開關 #2521\n\n修復\n• 修復在切換應用程式時在下載檢視中消失的按鈕 #2487\n• 修復雖然觀看歷史已停用，但播放位置仍被儲存的問題\n• 修復在清單檢視中因播放位置而造成的效能降低問題 #2517\n• [擷取器] 修復 ReCaptchaActivity #2527, TeamNewPipe/NewPipeExtractor#186\n• [擷取器] [YouTube] 修復播放清單在結果中所造成的搜尋錯誤 TeamNewPipe/NewPipeExtractor#185\n\n0.17.0 中的變更\n\n新增\n繼續播放 #2288\n• 在您上次停止的地方開始播放\n下載器強化 #2149 \n• 使用儲存存取框架來將下載儲存到外部的 SD 卡上\n• 新的 mp4 混合器\n• 在開始下載前選擇性變更下載目錄\n• 尊重計量網路\n\n改善\n• 移除 gema 字串 #2295\n• 處理活動生命週期中的（自動）旋轉變更 #2444\n• 讓長按選單更一致\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/770.txt",
    "content": "0.17.2 中的變更\n\n修復\n• 修復無影片可用的問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/780.txt",
    "content": "0.17.3 中的變更\n\n改善\n• 新增選項以清除播放狀態 #2550\n• 在檔案挑選器中顯示隱藏的目錄 #2591\n• 支援使用 NewPipe 開啟 `invidio.us` 站臺相關的 URL  #2488 \n• 新增對 `music.youtube.com` URL 的支援 TeamNewPipe/NewPipeExtractor#194\n\n修復\n• [YouTube] 修復 'java.lang.IllegalArgumentException #192\n• [YouTube] 修復即時串流無法運作的問題 TeamNewPipe/NewPipeExtractor#195\n• 修復 Android Pie 中下載串流時的效能問題 #2592\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/790.txt",
    "content": "改善\n• 新增更多標題以改善盲人的可存取程度 #2655\n• 讓下載資料夾的語言設定更一致且明確 #2637\n\n修復\n• 檢查區塊中的最後一個位元是否被下載了 #2646\n• 修復了影片詳細資訊片段中的捲動 #2672\n• 將雙重搜尋框清除動畫刪除為一個 #2695\n• [SoundCloud] 修復 client_id 擷取 #2745\n\n開發\n• 將從 NewPipeExtractor 繼承遺失的依賴關係新增到 NewPipe 中 #2535\n• 遷移至 AndroidX #2685\n• 將 ExoPlayer 更新到 2.10.6 #2697, #2736\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/800.txt",
    "content": "新增\n• 無 P2P 的 PeerTube 支援 [測試版]：\n  ◦ 從 PeerTube 站臺觀看與下載影片\n  ◦ 在設定中新增站臺以存取完整的 PeerTube 世界\n  ◦ 在存取特定站臺時，Android 4.4 與 7.1 上的 SSL 握手可能會造成問題，從而導致網路錯誤。\n\n• 下載器 (#2679)：\n  ◦ 計算下載的預估時間\n  ◦ 將 opus（webm 檔案）下載為 ogg\n  ◦ 復原過期的下載連結以在長時間的暫停後恢復下載\n\n改善\n• 讓 Kiosk 片段發現偏好內容國家的變動並改善所有主要分頁的效能 #2742\n• 從擷取器使用新的本地化與下載器實作 #2713 \n• 讓「預設的 kiosk」字串可翻譯\n• 在深色主題下顯示深色導航列 #2569\n\n修復\n• 修復了在移動彈出播放器時如果有另一隻手指放在上面就會無法移動的臭蟲 #2772\n• 允許播放清單遺失上傳程式並修復與此相關的當機問題 #2724, TeamNewPipe/NewPipeExtractor#219\n• 在 Android 4.4 裝置上啟用 TLS 1.1/1.2\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/810.txt",
    "content": "新增\n• 在背景播放時於鎖定畫面上顯示影片縮圖\n\n改善\n• 長按背景／彈出視窗按鈕時將本機播放清單新增到佇列中\n• 讓主頁面分頁可捲動，並在僅有一個分頁時隱藏\n• 在背景播放器時限制通知縮圖更新的數量\n• 為空的本機播放清單新增虛擬縮圖\n• 在下載的下拉式選單中使用 *.opus 副檔名而非 *.webm 並在格式標籤中顯示 \"opus\" 而非 \"WebM Opus\"\n• 在「下載」中新增刪除已下載檔案或下載歷史的按鈕\n• [YouTube] 新增對 /c/shortened_url 頻道連結的支援\n\n修復\n• 修復多個分享影片到 NewPipe 與直接下載串流的問題\n• 修復播放器無法存取其建立的執行緒的問題\n• 修復搜尋結果分頁\n• [YouTube] 修復導致 NPE 的 null 開關\n• [YouTube] 修復開啟 invidio.us URL 檢視留言的問題\n• [SoundCloud] 更新 client_id\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/820.txt",
    "content": "修復解密函式名稱正規表達式讓 YouTube 無法使用的問題。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/830.txt",
    "content": "更新 SoundCloud client_id 以修復 SoundCloud 問題。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/840.txt",
    "content": "新增\n• 新增語言選取器以變更應用程式語言\n• 新增「傳送到 Kodi」按鈕到播放器的可折疊選簞中\n• 新增長按複製留言的功能\n\n改善\n• 修復 ReCaptcha 活動並正確儲存取得的 cookies\n• 設定中未啟動觀看歷史時，移除點選單並使用抽屜\n• 要求在 Android 6 與更新版本正確顯示設定中其他應用程式的權限\n• 透過長按書籤片段來重新命名本機播放清單\n• 許多 PeerTube 改善\n• 改善許多英文原始字串\n\n修復\n• 修復在「應用程式最小化開關」啟用且 NewPipe 已最小化且暫停時，播放器重新啟動的問題\n• 修復手勢的初始亮度值\n• 修復 .srt 字幕下載並未包含所有換行的問題\n• 修復因為某些 Android 5 裝置不相容 CTF 而造成下載到 SD 卡失敗的問題\n• 修復 Android KitKat 上的下載問題\n• 修復損毀的視訊 .mp4 檔案被識別為音訊檔的問題\n• 修復多個本地化的問題，其中包含了錯誤的中文語言代碼\n• [YouTube] 描述中的時間戳已可點擊\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/850.txt",
    "content": "在此版本中，YouTube 網站的版本已更新。舊的網頁版在三月份會被移除，因此您將需要更新 NewPipe。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/860.txt",
    "content": "改善\n• 儲存並復原是否將音高與速度脫鉤\n• 支援播放器中的顯示缺口\n• 大約的檢視與訂閱者數量\n• 最佳化 YouTube 以使用較少流量\n\n超過 15 個 YouTube 相關的臭蟲在此版本被修復。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/870.txt",
    "content": "這是一個 NewPipe 的快速修復版本，允許在沒有其他問題的情況下使用 SoundCloud。\nSoundCloud 的 v2 API 現在被用於擷取器與偵測無效的客戶端 ID，也被改善了。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/900.txt",
    "content": "新增\n• 訂閱群組與排序 feed\n• 播放器內的靜音按鈕\n\n改善\n• 允許在 NewPipe 中開啟 music.youtube.com 與 media.ccc.de 連結\n• 把兩個設定從外觀移動到內容\n• 如果啟用不精確的搜索，則隱藏 5, 15, 25 的搜索選項\n\n修復\n• 某些 WebM 影片無法搜索\n• Android P 上的資料庫備份\n• 分享已下載的檔案時當機\n• 許多的 YouTube 擷取問題與更多……\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/910.txt",
    "content": "修復在極少數情況下會阻止 NewPipe 啟動的資料庫遷移。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/920.txt",
    "content": "改善\n\n• 在串流網格項目中新增上傳日期與檢視次數\n• 改善抽屜標題佈局\n\n修復\n\n• 修復在 API 19 上靜音按鈕造成當機的問題\n• 修復較長 1080p 60fps 影片的下載\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/930.txt",
    "content": "新增\n• 在 YouTube Music 上搜尋\n• 基本的 Android TV 支援\n\n改善\n• 新增從本機播放清單中移除所有已觀看影片的功能\n• 當不支援內容時顯示訊息而非當機\n• 改善透過縮放手勢調整彈出式播放器大小\n• 長按頻道背景與彈出視窗按鈕將串流加入到佇列中\n• 改善抽屜標題的大小處理\n\n修復\n• 修復年齡限制內容設定無法運作的問題\n• 修復部份種類的 reCAPTCHA\n• 修復在播放清單為空的時候，開啟書籤會當機的問題\n• 修復網路相關例外的偵測\n• 修復訂閱片段中群組排序按鈕的可見性\n\n以及更多\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/940.txt",
    "content": "新增\n• 新增對 SoundCloud 留言的支援\n• 新增 YouTube 限制模式設定\n• 顯示 PeerTube 上層頻道詳細資訊\n\n改善\n• 僅在支援的裝置上顯示 Kore 按鈕\n• 封鎖從導航列或狀態列開始的播放器手勢\n• 以服務色彩為基礎變更重試與訂閱按鈕背景色彩\n\n修復\n• 修復下載對話框凍結\n• 「在瀏覽器開啟」按鈕現在真的會在瀏覽器開啟\n• 修復開啟影片時的當機與「無法播放此串流」\n\n以及更多\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/950.txt",
    "content": "此版本帶來了三個小修復：\n• 修復在 Android 10 以上的儲存存取權限\n• 修復開啟 kiosk\n• 修復長影片的解析時間\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/951.txt",
    "content": "新增\n• 在 feed 群組對話框中新增搜尋訂閱的挑選器\n• 新增過濾器到 feed 群組對話框中以僅顯示未有群組的訂閱\n• 新增播放清單到主頁面中\n• 在背景／彈出式播放器佇列中更快的快轉／倒帶\n• 顯示搜尋建議：「您的意思是」與顯示結果\n\n改善\n• 在多工檔案中放棄編寫應用程式詮釋資料\n• 不要從佇列中移除失敗的串流\n• 更新狀態列色彩以符合工具列色彩\n\n修復\n• 修復因浮點數計算錯誤所造成的音訊／視訊不同步\n• [PeerTube] 處理已刪除的留言\n\n以及更多\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/952.txt",
    "content": "改善\n• 所有服務均可使用自動播放（不限 YouTube）\n\n修復\n• 透過支援 YouTube 新的繼續方式修復相關串流\n• 修復年齡限制的 YouTube 影片\n• [Android TV] 修復緩慢的焦點覆蓋層\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/953.txt",
    "content": "修復 YouTube 解密功能擷取。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/954.txt",
    "content": "• 新應用工作流(workflow):在視頻詳情頁播放視頻，下滑最小化播放器\n• MediaStyle通知: customizable actions in notifications, performance improvements\n• basic resizing when using NewPipe as desktop app\n\n• show dialog with open options in case of an unsupported URL toast\n• 改善搜索體驗(若遠程資源無法取得) [Improve search suggestion experience when remote ones can't be fetched]\n• 提升默認視頻分辨率:720p60 (內建播放器) 480p (畫中畫播放器)\n\n• 大量bug修復\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/955.txt",
    "content": "[YouTube] 修正搜尋（部分使用者出現的問題）\n[YouTube] 修正隨機的解密例外狀況\n[SoundCloud] 以斜槓結尾的 URL 現已正確剖析\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/956.txt",
    "content": "[YouTube] 修正載入任何影片時的崩潰\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/957.txt",
    "content": "• 統一若干特定的佇列動作\n• 兩指手勢以關閉播放器\n• 允許清除 reCAPTCHA cookies\n• 可選擇通知不自動渲染顏色\n• 改善影片詳情的開啟方式以修正無盡緩衝處理、分享到 NewPipe 時的行為瑕疵，以及其他不一致之處\n• 提升 YouTube 影片速度並修正年齡限制影片\n• 修正快轉/快退時的崩潰\n• 拖放縮圖時不要重新排列清單\n• 永遠記住懸浮屬性\n• 新增桑塔利語\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/958.txt",
    "content": "新增及改善：\n• 重新加入在鎖定螢幕上隱藏縮圖的選項\n• 下拉以重新整理 feed\n• 改善擷取本機清單時的效能\n\n修正：\n• 修正 NewPipe 自 RAM 卸載後開啟時的崩潰\n• 修正無網際網路連線的情況下啟動時的崩潰\n• 修正以尊重亮度與音量手勢設定\n• [YouTube] 修正長的播放清單\n\n其他：\n• 代碼清理以及若干內部改進\n• 依賴套件更新\n• 翻譯更新\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/959.txt",
    "content": "修正開啟錯誤報告工具時不斷崩潰。\n更新可由 NewPipe 自動開啟的 PeerTube 站臺清單。\n更新翻譯。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/960.txt",
    "content": "• 改善設定中匯出資料庫選項的描述。\n• 修正 YouTube 留言的剖析。\n• 修正 media.ccc.de 服務的顯示名稱。\n• 更新翻譯。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/961.txt",
    "content": "• [YouTube] Mix 支援\n• [YouTube] 顯示關於公共廣播公司與 Covid-19 的資訊\n• [media.ccc.de] 新增最近影片\n• 新增索馬利亞語翻譯\n\n• 許多內部改進\n\n• 修復從播放器內部分享影片的問題\n• 修復空白的 ReCaptcha webview\n• 修復了從列表中移除串流時所發生的當機問題\n• [PeerTube] 修復相關串流\n• [YouTube] 修復 YouTube Music 搜尋\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/962.txt",
    "content": "對 media.ccc.de 服務新增了「最近」影片。\n將直播串流新增到 media.ccc.de 服務中，同時新增直播串流支援。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/964.txt",
    "content": "• 在播放器控制中新增對章節的支援\n• [PeerTube] 新增 Sepia 搜尋\n• 在影片詳細資訊檢視中重新加入了分享按鈕，並將串流描述移動到分頁佈局中\n• 如果停用亮度手勢，則停用亮度復原\n• 新增在 kodi 上播放影片的列表項目\n• 修復了某些裝置上未設定預設瀏覽器會當機的臭蟲，並改善了分享對話框\n• 在全螢幕播放器中使用硬體 space 按鈕切換播放／暫停\n• [media.ccc.de] 許多修復與改善\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/981.txt",
    "content": "移除了對MediaParser的支持，以解決在Android 11+上緩衝後恢復播放失敗的問題。\n在Philips QM16XE上禁用了媒體隧道，以解決播放問題。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/982.txt",
    "content": "修復 YouTube 不會播放任何影片。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/984.txt",
    "content": "在清單中載入足夠初始項目以填滿整個螢幕並藉以修正平板電腦和電視上的捲動\n修正捲動清單時無常當機\n播放器快速搜索的覆蓋弧形置於系統介面之下\n還原多重視窗播放時的瀏海變更，免致部分手機出現播放器錯置迴歸\ncompileSdk 由 30 增至 31\n更新錯誤報告程式庫\n重構播放器中的部分程式碼\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/985.txt",
    "content": "修正 YouTube 無法播放任何串流\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/986.txt",
    "content": "新增\n• 新串流通知\n• 背景與影片播放器之間無縫轉換\n• 按半音調整音高\n• 將主播放器佇列追加至播放清單中\n\n改進\n• 記住速度/音高步距\n• 避免影片播放器初始緩衝太久\n• 改善 Android TV 的播放器介面\n• 刪除全部已下載檔案前先確認\n\n修正\n• 修正媒體鍵未有隱藏播放器控制項\n• 修正播放器類型變更時重新播放\n• 修正播放清單對話方塊的縱橫旋轉\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/987.txt",
    "content": "新增\n• 支援漸進式 HTTP 以外的傳遞方法：更快的播放載入時間、修正 PeerTube 和 SoundCloud、重播最近結束的 YouTube 直播串流\n• 新增按鈕以便將遠端播放清單加入至本機播放清單中\n• Android 10+ 分享頁設有影像預覽\n\n改進\n• 改善播放參數對話方塊\n• 將訂閱匯入/匯出按鈕移至更多功能表中\n\n修正\n• 修正從播放清單中移除完整觀看過的影片\n• 修正分享功能表的佈景主題和「新增至播放清單」項目\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/988.txt",
    "content": "[YouTube] 修正嘗試播放任何影片時「無法取得任何串流」的錯誤\n[YouTube] 修正請求影片時顯示「以下內容不在此應用程式中可用」的訊息\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/989.txt",
    "content": "• [YouTube] 修正嘗試播放任何影片時無盡載入\n• [YouTube] 修正部分影片限速\n• 升級 jsoup 程式庫至 1.15.3，當中包含一項安全修正\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/990.txt",
    "content": "是次發布終止支援 Android 4.4 KitKat，最低版本現為 Android 5 Lollipop！\n\n新增\n• 長按功能表中的下載選項\n• 摘要隱藏未到時候的影片\n• 分享本機播放清單\n\n改進\n• 重構播放器程式碼為若干小元件：佔用較少 RAM，出現較少錯誤\n• 改進縮圖的縮放模式\n• 向量化預留位置影像\n\n修正\n• 修正播放器通知的若干問題：媒體資訊過時/欠奉、縮圖失真\n• 修正全螢幕僅佔用 1/4 畫面\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/991.txt",
    "content": "新增\n• 錯誤面板中「以瀏覽器開啟」按鈕\n• 頻道群組以清單顯示選項\n• [YouTube] 長按串流片段以分享時間戳記 URL\n• 迷你播放器的「新增至播放佇列」按鈕\n\n改進\n• 新增冰島文語系並更新許多其他翻譯\n• 許多內部改進\n\n修正\n• 修正多項閃退\n• [YouTube] 修正頻道載入、非專屬摘要並應對部分國家播放問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/992.txt",
    "content": "新增\n• 影片詳細資訊的訂閱者人數\n• 佇列功能表的下載按鈕\n• 永久設定播放清單的縮圖\n• 主題標籤和連結的長按動作\n• 卡片檢視模式\n\n改進\n• 迷你播放器的關閉按鈕略為放大\n• 縮圖縮小時較順滑\n• 目標版本現為 Android 13 (API 33)\n• 快轉時不再暫停播放器\n\n修正\n• 修正 DeX/滑鼠的覆蓋\n• 背景播放器允許無獨立音訊串流\n• 若干 YouTube 修正及其他…\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/993.txt",
    "content": "新增\n• 重複加入至播放清單時警告，同時另設移除重複項目的按鈕\n• 允許忽略硬體按鈕\n• 允許在摘要中隱藏已部分觀看的影片\n\n改進\n• 在大螢幕上以格線顯示更多欄\n• 進度標示器與設定一致\n\n修正\n• 修正 Android 11+ 上開啟瀏覽器 URL、下載與外部播放器\n• 修正 MIUI 上全螢幕操作需要輕觸兩下\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/996.txt",
    "content": "修正在 media.ccc.de 開啟頻道/會議時的 NullPointerException。\n鬼靈精試圖破壞我們送給您的聖誕禮物，但我們修好了。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/997.txt",
    "content": "新增\n• 顯示留言回覆\n• 允許重新排序播放清單\n• 顯示播放清單描述與總時長\n• 允許重設所有設定\n\n改進\n• [Android 13+] 還原自訂通知動作\n• 更新檢查徵求同意\n• 緩衝時允許自通知中播放/暫停\n• 重新排序部分設定\n\n修正\n• [YouTube] 修正留言未能載入，以及其他修正與改進\n• 解決設定匯入的漏洞並改用 JSON\n• 若干下載修正\n• 修剪搜尋文字\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/998.txt",
    "content": "修正 YouTube 無法播放任何串流\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/changelogs/999.txt",
    "content": "修正 YouTube 無法播放任何串流\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/full_description.txt",
    "content": "NewPipe 不使用任何 Google 框架函式庫或是 YouTube API，僅透過剖析網頁來取得需要的資訊。因此這個應用程式可以在沒有安裝 Google 服務的裝置上運作。同時，您也不需要 YouTube 帳號，就能使用 NewPipe，它是自由與開放原始碼軟體。\n"
  },
  {
    "path": "fastlane/metadata/android/zh-Hant/short_description.txt",
    "content": "自由的輕量級 Android YouTube 前端。\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/1000.txt",
    "content": "改善咗\n• 令播放清單描述可以點擊，以便顯示更多/更少內容\n• [PeerTube] 自動處理「訂閱我」實例連結\n• 只可以喺記錄畫面開始播放單一項目\n\n固定咗\n• 修正 RSS 掣嘅可見度\n• 修正尋找列預覽當機嘅問題\n• 修正播放清單冇縮圖嘅項目\n• 修正喺下載對話框出現之前退出嘅問題\n• 修正相關項目清單入隊彈出式視窗\n• 修正加入播放清單對話方塊嘅順序\n• 調整播放清單書籤項目版面配置\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/1001.txt",
    "content": "改善咗\n• 允許 Android 13+ 上更改嘅用戶設定通知偏好\n\n修復咗\n• 修復咗匯出資料庫/訂閱唔會截斷已經存在嘅檔案，可能會導致匯出嘅檔案損壞\n• 修復咗點擊時間戳記嗰陣玩家會由頭恢復嘅問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/1002.txt",
    "content": "修正咗 YouTube 乜嘢實況串流都播唔到嘅問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/1003.txt",
    "content": "修正咗 YouTube 乜嘢實況串流都播唔到嘅問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/1004.txt",
    "content": "修正咗 YouTube 乜嘢實況串流都播唔到嘅問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/1005.txt",
    "content": "新功能\n• 加入咗對 Android Auto 應用程式嘅支援\n• 允許將資訊提供群組設定為主螢幕標籤\n• 【 YouTube 】可分享為臨時播放清單\n• 【 SoundCloud 】可設定為最喜愛頻道標籤\n\n改善\n• 更好嘅搜尋列提示\n• 「下載」介面會顯示下載日期\n• 使用 Android 13為所有應用程式嘅語言\n\n修復\n• 修復咗深色模式下破碎嘅文字顏色\n• 修復咗【 YouTube 】播放清單無法載入超過100 個項目嘅問題\n• 修復咗【 YouTube 】推薦影片消失嘅問題\n• 修復咗睇緊播放記錄期間會死機嘅問題\n• 修復咗留言同回覆入面嘅時間戳記\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/1007.txt",
    "content": "修正咗 YouTube 乜嘢實況串流都播唔到嘅問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/63.txt",
    "content": "### 改善咗\n- 匯入 / 匯出設定 # 1333\n- 改善咗性能 # 1371\n- 小代碼改進 # 1375\n- 加入有關 GDPR #1420嘅所有嘢\n\n＃＃＃ 固定咗\n- 下載器：修正咗喺 .giga 檔案 #1407載入未完成嘅下載時出現嘅崩潰問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/64.txt",
    "content": "### 改善\n- 加入咗喺使用流動數據時限制影片質素嘅功能。#1339\n- 會記錄並使用你設定嘅亮度。#1442\n- 改善在較弱CPU上嘅設備嘅下載效能。#1431\n- 加入咗（可用）媒體支援。#1433\n\n### 修復\n- 修復咗打開下載時發生死機嘅問題（修復版本已推出）。#1441\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/65.txt",
    "content": "### 改善\n\n- 停用漢堡選單圖示動畫 #1486\n- 還原已刪除嘅下載項目 #1472\n- 喺分享選單中加入下載選項 #1498\n- 喺長按選單中加入分享選項 #1454\n- 離開時最小化主播放器 #1354\n- 更新資料庫版本並修復備份問題 #1510\n- ExoPlayer 2.8.2 更新 #1392\n- 重新設計播放速度控制對話框，支援更細緻嘅速度調整步幅。\n- 加入靜音時快轉嘅切換選項，有助於聽有聲書或某啲音樂類型，提供更流暢嘅體驗（但可能會令某啲有大量靜音段落嘅歌曲播放出現問題 =\\\\）。\n- 重構媒體來源解析方式，令播放器可以內部傳遞媒體同時附帶嘅中繼資料，而唔需要手動處理。播放一開始就可以直接使用統一來源嘅中繼資料。\n- 修復遠端播放清單中繼資料喺開啟播放清單片段時未能更新嘅問題。\n- 各種 UI 修復：#1383，例如背景播放器通知控制改為固定白色、彈出播放器更容易關閉。\n- 使用新架構重構嘅多服務擷取器\n\n### 修復項目\n\n- 修復咗 #1440 影片資訊版面錯誤配置 #1491\n- 修復咗無法觀看播放記錄問題 #1497\n- #1495：當使用者打開播放清單時即時更新中繼資料（縮圖、標題、影片數量）。\n- #1475：當使用者喺詳細頁面用外部播放器播放影片時，會喺資料庫中登記一次觀看記錄。\n- 修復咗彈出模式下螢幕逾時問題 #1463（已修復 #640）\n- 主播放器修復 #1509\n- [#1412] 修復咗重複播放模式喺接收新指示時，播放器處於背景導致 NPE 嘅問題。\n- 修復咗未授權彈出權限時將播放器最小化到彈出視窗不會關掉播放器嘅問題。\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/66.txt",
    "content": "# v0.13.7 更新日誌\n\n### 修復\n- 修復咗 v0.13.6 中排序篩選器嘅問題\n\n# v0.13.6 更新日誌\n\n### 改善\n\n- 停用漢堡選單圖示動畫 #1486\n- 還原已刪除嘅下載項目 #1472\n- 喺分享選單中加入下載選項 #1498\n- 喺長按選單中加入分享選項 #1454\n- 離開時最小化主播放器 #1354\n- 更新資料庫版本並修復備份問題 #1510\n- ExoPlayer 2.8.2 更新 #1392\n- 重新設計播放速度控制對話框，支援更細緻嘅速度調整步幅。\n- 加入靜音時快轉嘅切換選項，有助於聽有聲書或某啲音樂類型，提供更流暢嘅體驗（但可能會令某啲有大量靜音段落嘅歌曲播放出現問題 =\\\\）。\n- 重構媒體來源解析方式，令播放器可以內部傳遞媒體同時附帶嘅中繼資料，而唔需要手動處理。播放一開始就可以直接使用統一來源嘅中繼資料。\n- 修復遠端播放清單中繼資料喺開啟播放清單片段時未能更新嘅問題。\n- 各種 UI 修復：#1383，例如背景播放器通知控制改為固定白色、彈出播放器更容易關閉。\n- 使用新架構重構嘅多服務擷取器\n\n### 修復項目\n\n- 修復咗 #1440 影片資訊版面錯誤配置 #1491\n- 修復咗無法觀看播放記錄問題 #1497\n- #1495：當使用者打開播放清單時即時更新中繼資料（縮圖、標題、影片數量）。\n- #1475：當使用者喺詳細頁面用外部播放器播放影片時，會喺資料庫中登記一次觀看記錄。\n- 修復咗彈出模式下螢幕逾時問題 #1463（已修復 #640）\n- 主播放器修復 #1509\n- [#1412] 修復咗重複播放模式喺接收新指示時，播放器處於背景導致 NPE 嘅問題。\n- 修復咗未授權彈出權限時將播放器最小化到彈出視窗不會關掉播放器嘅問題。\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/68.txt",
    "content": "# v0.14.1 更新內容\n\n### 修復項目\n- 修復咗無法解密影片網址嘅問題 #1659  \n- 修復咗影片描述連結擷取唔準確嘅問題 #1657  \n\n# v0.14.0 更新內容\n\n### 新功能\n- 全新抽屜式選單設計 #1461  \n- 可自訂嘅主頁介面 #1461  \n\n### 改善項目\n- 重新設計手勢控制功能 #1604  \n- 加入新方式關閉彈出播放器 #1597  \n\n### 修復項目\n- 修復訂閱人數無法取得時出錯嘅問題。已關閉 #1649  \n  - 當無法取得訂閱人數時，會顯示「無法取得訂閱人數」  \n- 修復 YouTube 播放清單為空時出現 NPE 錯誤  \n- 快速修復 SoundCloud 互動資訊站問題  \n- 重構並修復錯誤 #1623  \n  - 修復循環搜尋結果問題 #1562  \n  - 修復進度條未正確排版問題  \n  - 修復 YouTube Premium 影片未正確封鎖問題  \n  - 修復影片有時無法載入（因 DASH 解析問題）  \n  - 修復影片描述中連結無法點擊問題  \n  - 當使用者嘗試下載至外置 SD 卡時顯示警告  \n  - 修復「無內容顯示」錯誤觸發回報問題  \n  - 修復 Android 8.1 背景播放器未顯示縮圖問題 [詳情請參閱](https://github.com/TeamNewPipe/NewPipe/issues/943)  \n- 修復廣播接收器註冊問題。已關閉 #1641\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/981.txt",
    "content": "移除咗對MediaParser（媒體解析器）嘅支持，解決咗喺Android 11+上面緩衝後，恢復播放時失敗嘅問題。\n喺Philips QM16XE上禁用了media tunneling(隧道模式），去解決恢復播放卡機嘅問題。\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/983.txt",
    "content": "新加咗撳兩下就跳轉介面嘅功能\n可以喺設定入面打字搵嘢\n突出咗置頂嘅留言\n支援咗用 app 去開由FSFE （歐洲自由軟件基金會）託管嘅 PeerTube站 \n新加咗錯誤通知\n修正咗播放器轉換嗰陣重播排隊嘅首項\n等耐啲實況串流緩衝再定輸數\n修正咗本機搜尋結果嘅順位\n修正咗播放順位入面空寥寥項目嘅欄位\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/984.txt",
    "content": "喺清單度載入足量初始項目去填滿全螢幕，並修正喺平板電腦同電視機上面嘅捲動問題\n修正咗捲動播放清單嗰陣突然出現嘅閃退問題\n播放器快轉嘅覆蓋弧形擺喺系統介面後面\n撤回多視窗播放時嘅 M 字額變動，以免部份手機出現播放器錯位嘅倒放\n將 compileSdk （指定 Gradle 應該使用嘅Android API 級別去編譯你嘅應用)由 30 升至 31\n更新咗回報問題報告嘅程式庫\n重構部份喺播放器嘅程式碼\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/985.txt",
    "content": "修正咗 YouTube 乜嘢實況串流都播唔到嘅問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/986.txt",
    "content": "新嘢\n• 新嘅實況串流會顯示通知出嚟\n• 無隙切換背景同影片播放器\n• 按半度調整音高\n• 將主版面播放器隊列追加後變成播放清單\n\n進步\n• 記住咗倍速/音高嘅調整步調\n• 改善咗影片播放器開波嗰陣嘅漫長緩衝期\n• 改善咗 Android TV 嘅播放器版面\n• 確認多次係咪真係要刪除晒所有下載咗嘅檔案\n\n修正\n• 修正咗媒體掣入面冇隱藏到啲播放器控掣選項\n• 修正咗播放器換轉類別嗰陣嘅重頭再播過\n• 修正咗播放器清單對話方塊嘅旋轉方向\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/987.txt",
    "content": "新嘢\n• 支援漸進式 HTTP 以外嘅傳遞方法：縮短播放載入時間、修正 PeerTube 同 SoundCloud、回帶完咗冇耐嘅 YouTube 直播串流\n• 整多個掣將遠端播放清單加入去本機播放清單度\n• Android 10+ 分享頁有圖預覽\n\n進步\n• 播放參數框有進步\n• 訂閱匯入/匯出掣搬咗去更多選單入面\n\n執漏\n• 修正喺播放清單度剷走由頭到尾睇過晒嘅影片\n• 修正分享選單色系同埋「加入去播放清單」項目\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/988.txt",
    "content": "[YouTube] 修正播咩片都「攞唔到任何串流」嘅問題\n[YouTube] 修正出現「呢部內容喺呢個 app 欠奉」嘅訊息，睇唔到請求嘅影片\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/989.txt",
    "content": "• [YouTube] 執返好播咩片都係噉轉 lo 唔到\n• [YouTube] 執返好有啲片窒下窒下\n• 將 jsoup 程式庫升級做 1.15.3，包括修正一個保安問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/990.txt",
    "content": "今次版本要扔低 Android 4.4 KitKat 啦，而家起最起碼要 Android 5 Lollipop 至裝到呢個 app！\n\n新嘢\n• 撳實有得揀下載\n• 摘要飛起未夠鐘上畫嘅片\n• 分享本機嘅播放清單\n\n進步\n• 翻新播放器程式碼劏做幾部細件：用少啲 RAM、冇咁多 bug\n• 錶起啲縮圖嘅時候擺得靚仔啲\n• 啲楔位公仔轉做向量圖\n\n執漏\n• 修正播放器通知嘅問題：多媒體資訊過時/留空、縮圖鬆郁矇\n• 修正全螢幕用得 1/4 個螢幕\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/991.txt",
    "content": "新嘢\n• 加埋「喺瀏覽器開啟」個掣落問題版面\n• 頻道成軍有得揀一行行列陣\n• [YouTube] 撳實串流片段去分享時間點 URL\n• 袖珍播放器加埋排隊播個掣\n\n進步\n• 新加冰島文翻譯，更新唔少其他文\n• 內部祁宴氛：圍內吶喊返嚟喇\n\n執漏\n• 整返好若干彈 app 問題\n• [YouTube] 修正頻道載入同埋非特設摘要，應對部份國家播放問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/992.txt",
    "content": "新嘢\n• 影片詳情騷埋訂閱人數\n• 排隊播整埋個下載掣\n• 自選播放清單封面縮圖\n• 撳實主題標籤同連結有得複製\n• 有得以一張張白紙舉起一條條片\n\n進步\n• 袖珍播放器個閂埋掣大粒啲\n• 縮圖縮細時幼細啲\n• 編譯目標版本訂為 Android 13 (API 33)\n• 條片快轉時唔再暫停播放器\n\n執漏\n• 修正三星 DeX/滑鼠覆蓋\n• 無獨立聲音串流都有得幕後播\n• 若干 YouTube 修正、等等…\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/993.txt",
    "content": "新嘢\n• 重複加入去播放清單時警告，同時整多個掣剷走重複咗嗰啲\n• 硬件掣有得當佢冇到\n• 摘要有得收埋未睇晒嘅片\n\n進步\n• 大螢幕一格格騷多幾欄\n• 轉圈公仔跟返設定噉樣\n\n執漏\n• 修正 Android 11+ 開啟瀏覽器 URL、下載同外面播放器\n• 修正 MIUI 全螢幕時要撳兩下至搞得掂\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/994.txt",
    "content": "新嘢\n• 支援多重音軌/語言\n• 螢幕嘅音量同光暗手勢設定有得分左右\n• 主畫面嘅分頁揀選有得搬落最低\n\n進步\n• [Bandcamp] 處理收費閘之下嘅曲目\n\n修正\n• [YouTube] 串流出現 403 HTTP 錯誤\n• 播放清單版面轉去主版面播放器時播放器冇嘢睇\n• 播放器服務記憶體洩漏\n• [PeerTube] 上載者同子頻道頭像調轉咗\n\n其餘不贅\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/995.txt",
    "content": "新嘢\n• 支援頻道分頁\n• 啲圖有得揀畫質\n• 啲圖全部都有得攞返條拎\n\n進步\n• 播放器介面暢易達\n• 揀返條靚啲嘅聲黐返落去齋晝面嘅影片下載\n• 分享播放清單時有得加埋播放清單個名同入面啲片名\n\n修正\n• [YouTube] 執返掂個 like 數\n• 執返好播放器話冇回應個框框同埋閃退\n• 揀選版面語言揀錯文\n• 播放器聲音焦點無視噤聲\n• 加入項目去播放清單有時唔得\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/996.txt",
    "content": "修正開啟 media.ccc.de 嘅頻道/會議時發生 NullPointerException 失卻指標錯誤。\n柳煙輕愜夜，俊緒留江影。謝謝您陪我哋跑完悲歡離合嘅一年。\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/997.txt",
    "content": "新嘢\n• 留言睇埋回覆\n• 播放清單有得執排位\n• 騷埋播放清單描述同總片長\n• 設定有得推倒重來\n\n進步\n• [Android 13+] 自訂通知動作回歸\n• 徵得同意至睇過有冇更新\n• 緩衝緊通知都照撳得播放/暫停\n• 一啲設定執過位\n\n修正\n• [YouTube] 執返掂啲留言 lo 唔到，同埋其他執漏同進步\n• 解決設定匯入漏洞兼轉會用 JSON\n• 若干下載執漏\n• 搵嘢飛起頭尾啲空格\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/998.txt",
    "content": "修正咗 YouTube 乜嘢實況串流都播唔到嘅問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/changelogs/999.txt",
    "content": "修正咗 YouTube 乜嘢實況串流都播唔到嘅問題\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/full_description.txt",
    "content": "NewPipe 冇用到任何 Google 框架程式庫同YouTube API。而NewPipe透過解析網站，就可以攞到所需嘅資訊。因此，就算冇裝到使用Google 架構嘅機，都用得呢個 app。此外，您亦毋需有 YouTube 帳戶就用到NewPipe，而且呢個係自由同有開放原始碼嘅軟件 (FLOSS)。\n"
  },
  {
    "path": "fastlane/metadata/android/zh_Hant_HK/short_description.txt",
    "content": "適用於Android嘅免費，自由、輕量級同具有前瞻性嘅YouTube。\n"
  },
  {
    "path": "gradle/libs.versions.toml",
    "content": "#\n# SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n# SPDX-License-Identifier: GPL-3.0-or-later\n#\n\n[versions]\nacra = \"5.13.1\"\nagp = \"8.13.2\"\nappcompat = \"1.7.1\"\nassertj = \"3.27.7\"\nautoservice-google = \"1.1.1\"\nautoservice-zacsweers = \"1.2.0\"\nbridge = \"v2.0.2\"\ncardview = \"1.0.0\"\ncheckstyle = \"13.3.0\"\ncoil = \"3.4.0\"\nconstraintlayout = \"2.2.1\"\ncore = \"1.17.0\" # Newer versions require minSdk >= 23\ndesugar = \"2.1.5\"\ndocumentfile = \"1.1.0\"\nexoplayer = \"2.19.1\"\nfragment = \"1.8.9\"\ngroupie = \"2.10.1\"\njsoup = \"1.22.1\"\njunit = \"4.13.2\"\njunit-ext = \"1.3.0\"\nkotlin = \"2.3.20\"\nkotlinx-coroutines-rx3 = \"1.10.2\"\nkotlinx-serialization-json = \"1.10.0\"\nksp = \"2.3.6\"\nktlint = \"1.8.0\"\nleakcanary = \"2.14\"\nlifecycle = \"2.9.4\" # Newer versions require minSdk >= 23\nlocalbroadcastmanager = \"1.1.0\"\nmarkwon = \"4.6.2\"\nmaterial = \"1.11.0\" # TODO: update to newer version after bug is fixed. See https://github.com/TeamNewPipe/NewPipe/pull/13018\nmedia = \"1.7.1\"\nmockitoCore = \"5.23.0\"\nokhttp = \"5.3.2\"\nphoenix = \"3.0.0\"\npreference = \"1.2.1\"\nprettytime = \"5.0.8.Final\"\nrecyclerview = \"1.4.0\"\nroom = \"2.7.2\" # Newer versions require minSdk >= 23\nrunner = \"1.7.0\"\nrxandroid = \"3.0.2\"\nrxbinding = \"4.0.0\"\nrxjava = \"3.1.12\"\nsonarqube = \"7.2.3.7755\"\nstatesaver = \"1.4.1\" # TODO: Drop because it is deprecated and incompatible with KSP2\nstetho = \"1.6.0\"\nswiperefreshlayout = \"1.2.0\"\n# You can use a local version by uncommenting a few lines in settings.gradle\n# Or you can use a commit you pushed to GitHub by just replacing TeamNewPipe with your GitHub\n# name and the commit hash with the commit hash of the (pushed) commit you want to test\n# This works thanks to JitPack: https://jitpack.io/\nteamnewpipe-filepicker = \"5.0.0\"\nteamnewpipe-nanojson = \"e9d656ddb49a412a5a0a5d5ef20ca7ef09549996\"\n# WORKAROUND: if you get errors with the NewPipeExtractor dependency, replace `v0.XX.Y` with\n# the corresponding commit hash, since JitPack sometimes deletes artifacts.\n# If there’s already a git hash, just add more of it to the end (or remove a letter)\n# to cause jitpack to regenerate the artifact.\nteamnewpipe-newpipe-extractor = \"v0.26.0\"\nviewpager2 = \"1.1.0\"\nwebkit = \"1.14.0\" # Newer versions require minSdk >= 23\nwork = \"2.10.5\"  # Newer versions require minSdk >= 23\n\n[libraries]\nacra-core = { module = \"ch.acra:acra-core\", version.ref = \"acra\" }\nandroid-desugar = { module = \"com.android.tools:desugar_jdk_libs_nio\", version.ref = \"desugar\" }\nandroidx-appcompat = { module = \"androidx.appcompat:appcompat\", version.ref = \"appcompat\" }\nandroidx-cardview = { module = \"androidx.cardview:cardview\", version.ref = \"cardview\" }\nandroidx-constraintlayout = { module = \"androidx.constraintlayout:constraintlayout\", version.ref = \"constraintlayout\" }\nandroidx-core = { module = \"androidx.core:core-ktx\", version.ref = \"core\" }\nandroidx-documentfile = { module = \"androidx.documentfile:documentfile\", version.ref = \"documentfile\" }\nandroidx-fragment = { module = \"androidx.fragment:fragment-ktx\", version.ref = \"fragment\" }\nandroidx-junit = { module = \"androidx.test.ext:junit\", version.ref = \"junit-ext\" }\nandroidx-lifecycle-livedata = { module = \"androidx.lifecycle:lifecycle-livedata-ktx\", version.ref = \"lifecycle\" }\nandroidx-lifecycle-viewmodel = { module = \"androidx.lifecycle:lifecycle-viewmodel-ktx\", version.ref = \"lifecycle\" }\nandroidx-localbroadcastmanager = { module = \"androidx.localbroadcastmanager:localbroadcastmanager\", version.ref = \"localbroadcastmanager\" }\nandroidx-media = { module = \"androidx.media:media\", version.ref = \"media\" }\nandroidx-preference = { module = \"androidx.preference:preference\", version.ref = \"preference\" }\nandroidx-recyclerview = { module = \"androidx.recyclerview:recyclerview\", version.ref = \"recyclerview\" }\nandroidx-room-compiler = { module = \"androidx.room:room-compiler\", version.ref = \"room\" }\nandroidx-room-runtime = { module = \"androidx.room:room-runtime\", version.ref = \"room\" }\nandroidx-room-rxjava3 = { module = \"androidx.room:room-rxjava3\", version.ref = \"room\" }\nandroidx-room-testing = { module = \"androidx.room:room-testing\", version.ref = \"room\" }\nandroidx-runner = { module = \"androidx.test:runner\", version.ref = \"runner\" }\nandroidx-swiperefreshlayout = { module = \"androidx.swiperefreshlayout:swiperefreshlayout\", version.ref = \"swiperefreshlayout\" }\nandroidx-viewpager2 = { module = \"androidx.viewpager2:viewpager2\", version.ref = \"viewpager2\" }\nandroidx-webkit = { module = \"androidx.webkit:webkit\", version.ref = \"webkit\" }\nandroidx-work-runtime = { module = \"androidx.work:work-runtime\", version.ref = \"work\" }\nandroidx-work-rxjava3 = { module = \"androidx.work:work-rxjava3\", version.ref = \"work\" }\nassertj-core = { module = \"org.assertj:assertj-core\", version.ref = \"assertj\" }\ncoil-compose = { module = \"io.coil-kt.coil3:coil-compose\", version.ref = \"coil\" }\ncoil-network-okhttp = { module = \"io.coil-kt.coil3:coil-network-okhttp\", version.ref = \"coil\" }\nevernote-statesaver-compiler = { module = \"com.evernote:android-state-processor\", version.ref = \"statesaver\" }\nevernote-statesaver-core = { module = \"com.evernote:android-state\", version.ref = \"statesaver\" }\nfacebook-stetho-core = { module = \"com.facebook.stetho:stetho\", version.ref = \"stetho\" }\nfacebook-stetho-okhttp3 = { module = \"com.facebook.stetho:stetho-okhttp3\", version.ref = \"stetho\" }\ngoogle-android-material = { module = \"com.google.android.material:material\", version.ref = \"material\" }\ngoogle-autoservice-annotations = { module = \"com.google.auto.service:auto-service-annotations\", version.ref = \"autoservice-google\" }\ngoogle-exoplayer-core = { module = \"com.google.android.exoplayer:exoplayer-core\", version.ref = \"exoplayer\" }\ngoogle-exoplayer-dash = { module = \"com.google.android.exoplayer:exoplayer-dash\", version.ref = \"exoplayer\" }\ngoogle-exoplayer-database = { module = \"com.google.android.exoplayer:exoplayer-database\", version.ref = \"exoplayer\" }\ngoogle-exoplayer-datasource = { module = \"com.google.android.exoplayer:exoplayer-datasource\", version.ref = \"exoplayer\" }\ngoogle-exoplayer-hls = { module = \"com.google.android.exoplayer:exoplayer-hls\", version.ref = \"exoplayer\" }\ngoogle-exoplayer-mediasession = { module = \"com.google.android.exoplayer:extension-mediasession\", version.ref = \"exoplayer\" }\ngoogle-exoplayer-smoothstreaming = { module = \"com.google.android.exoplayer:exoplayer-smoothstreaming\", version.ref = \"exoplayer\" }\ngoogle-exoplayer-ui = { module = \"com.google.android.exoplayer:exoplayer-ui\", version.ref = \"exoplayer\" }\njakewharton-phoenix = { module = \"com.jakewharton:process-phoenix\", version.ref = \"phoenix\" }\njakewharton-rxbinding = { module = \"com.jakewharton.rxbinding4:rxbinding\", version.ref = \"rxbinding\" }\njsoup = { module = \"org.jsoup:jsoup\", version.ref = \"jsoup\" }\njunit = { module = \"junit:junit\", version.ref = \"junit\" }\nkotlinx-coroutines-rx3 = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-rx3\", version.ref = \"kotlinx-coroutines-rx3\" }\nkotlinx-serialization-json = { module = \"org.jetbrains.kotlinx:kotlinx-serialization-json\", version.ref = \"kotlinx-serialization-json\" }\nlisawray-groupie-core = { module = \"com.github.lisawray.groupie:groupie\", version.ref = \"groupie\" }\nlisawray-groupie-viewbinding = { module = \"com.github.lisawray.groupie:groupie-viewbinding\", version.ref = \"groupie\" }\nlivefront-bridge = { module = \"com.github.livefront:bridge\", version.ref = \"bridge\" }\nmockito-core = { module = \"org.mockito:mockito-core\", version.ref = \"mockitoCore\" }\nnewpipe-extractor = { module = \"com.github.TeamNewPipe:NewPipeExtractor\", version.ref = \"teamnewpipe-newpipe-extractor\" }\nnewpipe-filepicker = { module = \"com.github.TeamNewPipe:NoNonsense-FilePicker\", version.ref = \"teamnewpipe-filepicker\" }\nnewpipe-nanojson = { module = \"com.github.TeamNewPipe:nanojson\", version.ref = \"teamnewpipe-nanojson\" }\nnoties-markwon-core = { module = \"io.noties.markwon:core\", version.ref = \"markwon\" }\nnoties-markwon-linkify = { module = \"io.noties.markwon:linkify\", version.ref = \"markwon\" }\nocpsoft-prettytime = { module = \"org.ocpsoft.prettytime:prettytime\", version.ref = \"prettytime\" }\npinterest-ktlint = { module = \"com.pinterest.ktlint:ktlint-cli\", version.ref = \"ktlint\" }\npuppycrawl-checkstyle = { module = \"com.puppycrawl.tools:checkstyle\", version.ref = \"checkstyle\" }\nreactivex-rxandroid = { module = \"io.reactivex.rxjava3:rxandroid\", version.ref = \"rxandroid\" }\nreactivex-rxjava = { module = \"io.reactivex.rxjava3:rxjava\", version.ref = \"rxjava\" }\nsquareup-leakcanary-core = { module = \"com.squareup.leakcanary:leakcanary-android-core\", version.ref = \"leakcanary\" }\nsquareup-leakcanary-plumber = { module = \"com.squareup.leakcanary:plumber-android\", version.ref = \"leakcanary\" }\nsquareup-leakcanary-watcher = { module = \"com.squareup.leakcanary:leakcanary-object-watcher-android\", version.ref = \"leakcanary\" }\nsquareup-okhttp = { module = \"com.squareup.okhttp3:okhttp\", version.ref = \"okhttp\" }\nzacsweers-autoservice-compiler = { module = \"dev.zacsweers.autoservice:auto-service-ksp\", version.ref = \"autoservice-zacsweers\" }\n\n[plugins]\nandroid-application = { id = \"com.android.application\", version.ref = \"agp\" }\ngoogle-ksp = { id = \"com.google.devtools.ksp\", version.ref = \"ksp\" }\njetbrains-kotlin-android = { id = \"org.jetbrains.kotlin.android\", version.ref = \"kotlin\" }\njetbrains-kotlin-kapt = { id = \"org.jetbrains.kotlin.kapt\", version.ref = \"kotlin\" } # Needed for statesaver\njetbrains-kotlin-parcelize = { id = \"org.jetbrains.kotlin.plugin.parcelize\", version.ref = \"kotlin\" }\njetbrains-kotlinx-serialization = { id = \"org.jetbrains.kotlin.plugin.serialization\", version.ref = \"kotlin\" }\nsonarqube = { id = \"org.sonarqube\", version.ref = \"sonarqube\" }\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionSha256Sum=60ea723356d81263e8002fec0fcf9e2b0eee0c0850c7a3d7ab0a63f2ccc601f3\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-9.4.0-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "android.useAndroidX=true\norg.gradle.jvmargs=-Xmx2048M --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED\nsystemProp.file.encoding=utf-8\n\n# https://docs.gradle.org/current/userguide/configuration_cache.html\norg.gradle.configuration-cache=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# SPDX-License-Identifier: Apache-2.0\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/b631911858264c0b6e4d6603d677ff5218766cee/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd -P \"${APP_HOME:-./}\" > /dev/null && printf '%s\\n' \"$PWD\" ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -jar \"$APP_HOME/gradle/wrapper/gradle-wrapper.jar\" \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n@rem SPDX-License-Identifier: Apache-2.0\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -jar \"%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\" %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif %ERRORLEVEL% equ 0 goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nset EXIT_CODE=%ERRORLEVEL%\r\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\r\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\r\nexit /b %EXIT_CODE%\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "settings.gradle.kts",
    "content": "/*\n * SPDX-FileCopyrightText: 2025 NewPipe e.V. <https://newpipe-ev.de>\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\n\npluginManagement {\n    repositories {\n        gradlePluginPortal()\n        google()\n        mavenCentral()\n    }\n}\ndependencyResolutionManagement {\n    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)\n    repositories {\n        google()\n        mavenCentral()\n        maven(url = \"https://jitpack.io\")\n        maven(url = \"https://repo.clojars.org\")\n    }\n}\ninclude (\":app\")\n\n// Use a local copy of NewPipe Extractor by uncommenting the lines below.\n// We assume, that NewPipe and NewPipe Extractor have the same parent directory.\n// If this is not the case, please change the path in includeBuild().\n\n//includeBuild(\"../NewPipeExtractor\") {\n//    dependencySubstitution {\n//        substitute(module(\"com.github.TeamNewPipe:NewPipeExtractor\"))\n//            .using(project(\":extractor\"))\n//    }\n//}\n"
  }
]